diff --git a/src/libcamera/control_ids.cpp.in b/src/libcamera/control_ids.cpp.in
index 056645cfbdfb..ca0b5b22f899 100644
--- a/src/libcamera/control_ids.cpp.in
+++ b/src/libcamera/control_ids.cpp.in
@@ -6,8 +6,10 @@
  *
  * This file is auto-generated. Do not edit.
  */
+#include <vector>
 
 #include <libcamera/control_ids.h>
+#include <libcamera/controls.h>
 
 /**
  * \file control_ids.h
diff --git a/utils/gen-controls.py b/utils/gen-controls.py
index 93cb3885c3da..87036fe7dec1 100755
--- a/utils/gen-controls.py
+++ b/utils/gen-controls.py
@@ -100,6 +100,8 @@ ${description}
 def generate_h(controls):
     enum_template_start = string.Template('''enum ${name}Values {''')
     enum_value_template = string.Template('''\t${name} = ${value},''')
+    enum_list_start = string.Template('''static const std::vector<ControlValue> ${name}List = {''')
+    enum_list_values = string.Template('''\tstatic_cast<int32_t>(${name}),''')
     template = string.Template('''extern const Control<${type}> ${name};''')
 
     ctrls = []
@@ -140,6 +142,14 @@ def generate_h(controls):
                 target_ctrls.append(enum_value_template.substitute(value_info))
             target_ctrls.append("};")
 
+            target_ctrls.append(enum_list_start.substitute(info))
+            for entry in enum:
+                value_info = {
+                    'name': entry['name'],
+                }
+                target_ctrls.append(enum_list_values.substitute(value_info))
+            target_ctrls.append("};")
+
         target_ctrls.append(template.substitute(info))
         id_value += 1
 
