diff --git a/include/libcamera/controls.h b/include/libcamera/controls.h
index 3634dc431618..4df6615a3c7b 100644
--- a/include/libcamera/controls.h
+++ b/include/libcamera/controls.h
@@ -348,9 +348,11 @@ class ControlList
 {
 private:
 	using ControlListMap = std::unordered_map<unsigned int, ControlValue>;
+	using ControlsMap = std::unordered_map<const ControlId *, ControlValue>;
 
 public:
 	ControlList();
+	ControlList(std::initializer_list<ControlsMap::value_type> controls);
 	ControlList(const ControlIdMap &idmap, ControlValidator *validator = nullptr);
 	ControlList(const ControlInfoMap &infoMap, ControlValidator *validator = nullptr);
 
diff --git a/src/libcamera/controls.cpp b/src/libcamera/controls.cpp
index c58ed3946f3b..7650057dde7d 100644
--- a/src/libcamera/controls.cpp
+++ b/src/libcamera/controls.cpp
@@ -797,6 +797,17 @@ ControlList::ControlList()
 {
 }
 
+/**
+ * \brief Construct a ControlList with a list of values
+ * \param[in] controls The controls and associated values to initialize the list with
+ */
+ControlList::ControlList(std::initializer_list<ControlsMap::value_type> controls)
+	: ControlList()
+{
+	for (const auto &ctrl : controls)
+		set(ctrl.first->id(), ctrl.second);
+}
+
 /**
  * \brief Construct a ControlList with an optional control validator
  * \param[in] idmap The ControlId map for the control list target object
