diff --git a/include/libcamera/controls.h b/include/libcamera/controls.h
index 7c2bb287..c6db4ebb 100644
--- a/include/libcamera/controls.h
+++ b/include/libcamera/controls.h
@@ -57,6 +57,11 @@ struct control_type<uint8_t> {
 	static constexpr ControlType value = ControlTypeByte;
 };
 
+template<>
+struct control_type<uint32_t> {
+	static constexpr ControlType value = ControlTypeInteger32;
+};
+
 template<>
 struct control_type<int32_t> {
 	static constexpr ControlType value = ControlTypeInteger32;
diff --git a/src/libcamera/v4l2_device.cpp b/src/libcamera/v4l2_device.cpp
index 4a2048cf..db20f31c 100644
--- a/src/libcamera/v4l2_device.cpp
+++ b/src/libcamera/v4l2_device.cpp
@@ -212,6 +212,10 @@ ControlList V4L2Device::getControls(const std::vector<uint32_t> &ids)
 				type = ControlTypeByte;
 				break;
 
+			case V4L2_CTRL_TYPE_U32:
+				type = ControlTypeInteger32;
+				break;
+
 			default:
 				LOG(V4L2, Error)
 					<< "Unsupported payload control type "
@@ -491,6 +495,7 @@ ControlType V4L2Device::v4l2CtrlType(uint32_t ctrlType)
 		return ControlTypeBool;
 
 	case V4L2_CTRL_TYPE_INTEGER:
+	case V4L2_CTRL_TYPE_U32:
 		return ControlTypeInteger32;
 
 	case V4L2_CTRL_TYPE_INTEGER64:
@@ -543,6 +548,11 @@ std::optional<ControlInfo> V4L2Device::v4l2ControlInfo(const v4l2_query_ext_ctrl
 				   static_cast<bool>(ctrl.maximum),
 				   static_cast<bool>(ctrl.default_value));
 
+	case V4L2_CTRL_TYPE_U32:
+		return ControlInfo(static_cast<uint32_t>(ctrl.minimum),
+				   static_cast<uint32_t>(ctrl.maximum),
+				   static_cast<uint32_t>(ctrl.default_value));
+
 	case V4L2_CTRL_TYPE_INTEGER64:
 		return ControlInfo(static_cast<int64_t>(ctrl.minimum),
 				   static_cast<int64_t>(ctrl.maximum),
@@ -624,6 +634,7 @@ void V4L2Device::listControls()
 		case V4L2_CTRL_TYPE_BITMASK:
 		case V4L2_CTRL_TYPE_INTEGER_MENU:
 		case V4L2_CTRL_TYPE_U8:
+		case V4L2_CTRL_TYPE_U32:
 			break;
 		/* \todo Support other control types. */
 		default:
