diff --git a/include/libcamera/controls.h b/include/libcamera/controls.h
index 6f0ebf4f3ca5..4538be06af93 100644
--- a/include/libcamera/controls.h
+++ b/include/libcamera/controls.h
@@ -12,6 +12,8 @@
 #include <string>
 #include <unordered_map>
 
+#include <libcamera/span.h>
+
 namespace libcamera {
 
 class ControlValidator;
@@ -65,6 +67,7 @@ public:
 
 	ControlType type() const { return type_; }
 	bool isNone() const { return type_ == ControlTypeNone; }
+	Span<const uint8_t> data() const;
 
 	std::string toString() const;
 
diff --git a/src/libcamera/control_serializer.cpp b/src/libcamera/control_serializer.cpp
index 803ac16c2456..2b66ab978f81 100644
--- a/src/libcamera/control_serializer.cpp
+++ b/src/libcamera/control_serializer.cpp
@@ -27,17 +27,6 @@ namespace libcamera {
 
 LOG_DEFINE_CATEGORY(Serializer)
 
-namespace {
-
-static constexpr size_t ControlValueSize[] = {
-	[ControlTypeNone]	= 1,
-	[ControlTypeBool]	= sizeof(bool),
-	[ControlTypeInteger32]	= sizeof(int32_t),
-	[ControlTypeInteger64]	= sizeof(int64_t),
-};
-
-} /* namespace */
-
 /**
  * \class ControlSerializer
  * \brief Serializer and deserializer for control-related classes
@@ -106,7 +95,7 @@ void ControlSerializer::reset()
 
 size_t ControlSerializer::binarySize(const ControlValue &value)
 {
-	return ControlValueSize[value.type()];
+	return value.data().size_bytes();
 }
 
 size_t ControlSerializer::binarySize(const ControlRange &range)
diff --git a/src/libcamera/controls.cpp b/src/libcamera/controls.cpp
index 76230a052de1..b2331ab7540d 100644
--- a/src/libcamera/controls.cpp
+++ b/src/libcamera/controls.cpp
@@ -47,6 +47,17 @@ namespace libcamera {
 
 LOG_DEFINE_CATEGORY(Controls)
 
+namespace {
+
+static constexpr size_t ControlValueSize[] = {
+	[ControlTypeNone]		= 1,
+	[ControlTypeBool]		= sizeof(bool),
+	[ControlTypeInteger32]		= sizeof(int32_t),
+	[ControlTypeInteger64]		= sizeof(int64_t),
+};
+
+} /* namespace */
+
 /**
  * \enum ControlType
  * \brief Define the data type of a Control
@@ -91,6 +102,18 @@ ControlValue::ControlValue()
  * \return True if the value type is ControlTypeNone, false otherwise
  */
 
+/**
+ * \brief Retrieve the raw of a control value
+ * \return The raw data of the control value as a span of uint8_t
+ */
+Span<const uint8_t> ControlValue::data() const
+{
+	return {
+		reinterpret_cast<const uint8_t *>(&bool_),
+		ControlValueSize[type_]
+	};
+}
+
 /**
  * \brief Assemble and return a string describing the value
  * \return A string describing the ControlValue
