diff --git a/include/libcamera/controls.h b/include/libcamera/controls.h
index 80944efc133a..5a5cfc3e52ca 100644
--- a/include/libcamera/controls.h
+++ b/include/libcamera/controls.h
@@ -394,7 +394,7 @@ public:
 	}
 
 	const ControlValue &get(unsigned int id) const;
-	void set(unsigned int id, const ControlValue &value);
+	ControlValue &set(unsigned int id, const ControlValue &value);
 
 	const ControlInfoMap *infoMap() const { return infoMap_; }
 
diff --git a/src/libcamera/controls.cpp b/src/libcamera/controls.cpp
index 08df7f29e938..12822e87a4d7 100644
--- a/src/libcamera/controls.cpp
+++ b/src/libcamera/controls.cpp
@@ -930,14 +930,17 @@ const ControlValue &ControlList::get(unsigned int id) const
  *
  * The behaviour is undefined if the control \a id is not supported by the
  * object that the list refers to.
+ *
+ * \return A reference to the ControlValue stored in the control list
  */
-void ControlList::set(unsigned int id, const ControlValue &value)
+ControlValue &ControlList::set(unsigned int id, const ControlValue &value)
 {
 	ControlValue *val = find(id);
 	if (!val)
-		return;
+		return *val;
 
 	*val = value;
+	return *val;
 }
 
 /**
