[v2,13/14] libcamera: camera_sensor: Test for read-only HBLANK with READ_ONLY flag
diff mbox series

Message ID 20240315001613.2033-14-laurent.pinchart@ideasonboard.com
State Accepted
Commit 58bcddbdeb7e7b40ba8e7eecc2fad385d85f23ce
Headers show
Series
  • libcamera: Prepare for new camera sensor class
Related show

Commit Message

Laurent Pinchart March 15, 2024, 12:16 a.m. UTC
The CameraSensor class tests if the sensor HBLANK control is read-only
by comparing the minimum and maximum values, and documents this as being
a workaround for the lack of a read-only control flag in V4L2. This is
incorrect, as the V4L2 API provides such a flag. Use it to replace the
workaround.

Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
Reviewed-by: Jacopo Mondi <jacopo.mondi@ideasonboard.com>
Reviewed-by: Kieran Bingham <kieran.bingham@ideasonboard.com>
---
 src/libcamera/sensor/camera_sensor.cpp | 27 +++++++-------------------
 1 file changed, 7 insertions(+), 20 deletions(-)

Patch
diff mbox series

diff --git a/src/libcamera/sensor/camera_sensor.cpp b/src/libcamera/sensor/camera_sensor.cpp
index 86ad9a85371c..402025566544 100644
--- a/src/libcamera/sensor/camera_sensor.cpp
+++ b/src/libcamera/sensor/camera_sensor.cpp
@@ -188,28 +188,15 @@  int CameraSensor::init()
 	 * Set HBLANK to the minimum to start with a well-defined line length,
 	 * allowing IPA modules that do not modify HBLANK to use the sensor
 	 * minimum line length in their calculations.
-	 *
-	 * At present, there is no way of knowing if a control is read-only.
-	 * As a workaround, assume that if the minimum and maximum values of
-	 * the V4L2_CID_HBLANK control are the same, it implies the control
-	 * is read-only.
-	 *
-	 * \todo The control API ought to have a flag to specify if a control
-	 * is read-only which could be used below.
 	 */
-	if (ctrls.infoMap()->find(V4L2_CID_HBLANK) != ctrls.infoMap()->end()) {
-		const ControlInfo hblank = ctrls.infoMap()->at(V4L2_CID_HBLANK);
-		const int32_t hblankMin = hblank.min().get<int32_t>();
-		const int32_t hblankMax = hblank.max().get<int32_t>();
+	const struct v4l2_query_ext_ctrl *hblankInfo = subdev_->controlInfo(V4L2_CID_HBLANK);
+	if (hblankInfo && !(hblankInfo->flags & V4L2_CTRL_FLAG_READ_ONLY)) {
+		ControlList ctrl(subdev_->controls());
 
-		if (hblankMin != hblankMax) {
-			ControlList ctrl(subdev_->controls());
-
-			ctrl.set(V4L2_CID_HBLANK, hblankMin);
-			ret = subdev_->setControls(&ctrl);
-			if (ret)
-				return ret;
-		}
+		ctrl.set(V4L2_CID_HBLANK, static_cast<int32_t>(hblankInfo->minimum));
+		ret = subdev_->setControls(&ctrl);
+		if (ret)
+			return ret;
 	}
 
 	return applyTestPatternMode(controls::draft::TestPatternModeEnum::TestPatternModeOff);