diff --git a/include/libcamera/controls.h b/include/libcamera/controls.h
index 38d0a3e8360a..cf94205577a5 100644
--- a/include/libcamera/controls.h
+++ b/include/libcamera/controls.h
@@ -393,14 +393,14 @@ public:
 		val->set<T>(value);
 	}
 
-	template<typename T, typename V>
-	void set(const Control<T> &ctrl, const std::initializer_list<V> &value)
+	template<typename T, typename V, size_t Size>
+	void set(const Control<Span<T, Size>> &ctrl, const std::initializer_list<V> &value)
 	{
 		ControlValue *val = find(ctrl.id());
 		if (!val)
 			return;
 
-		val->set<T>(Span<const typename std::remove_cv_t<V>>{ value.begin(), value.size() });
+		val->set(Span<const typename std::remove_cv_t<V>, Size>{ value.begin(), value.size() });
 	}
 
 	const ControlValue &get(unsigned int id) const;
diff --git a/src/libcamera/controls.cpp b/src/libcamera/controls.cpp
index bc3db4f69388..6dbf9b348709 100644
--- a/src/libcamera/controls.cpp
+++ b/src/libcamera/controls.cpp
@@ -970,7 +970,7 @@ bool ControlList::contains(unsigned int id) const
  */
 
 /**
- * \fn ControlList::set(const Control<T> &ctrl, const std::initializer_list<V> &value)
+ * \fn ControlList::set(const Control<Span<T, Size>> &ctrl, const std::initializer_list<V> &value)
  * \copydoc ControlList::set(const Control<T> &ctrl, const V &value)
  */
 
