On Fri Feb 28 18:17:31 2025 +0900, Paul Elder wrote:
> When the vblank v4l2 control is set, it does not get written to the
> hardware unless exposure is also changed. Change the behavior such that
> the vblank is written immediately when the control is set, as setting
> the vblank without changing the exposure is a valid use case (such as
> for changing the frame rate).
> 
> Signed-off-by: Paul Elder <paul.el...@ideasonboard.com>
> Reviewed-by: Kieran Bingham <kieran.bing...@ideasonboard.com>
> Signed-off-by: Sakari Ailus <sakari.ai...@linux.intel.com>
> Signed-off-by: Hans Verkuil <hverk...@xs4all.nl>

Patch committed.

Thanks,
Hans Verkuil

 drivers/media/i2c/imx335.c | 21 +++++++++++++++------
 1 file changed, 15 insertions(+), 6 deletions(-)

---

diff --git a/drivers/media/i2c/imx335.c b/drivers/media/i2c/imx335.c
index fcfd1d851bd4..0beb80b8c458 100644
--- a/drivers/media/i2c/imx335.c
+++ b/drivers/media/i2c/imx335.c
@@ -559,12 +559,14 @@ static int imx335_set_ctrl(struct v4l2_ctrl *ctrl)
                        imx335->vblank,
                        imx335->vblank + imx335->cur_mode->height);
 
-               return __v4l2_ctrl_modify_range(imx335->exp_ctrl,
-                                               IMX335_EXPOSURE_MIN,
-                                               imx335->vblank +
-                                               imx335->cur_mode->height -
-                                               IMX335_EXPOSURE_OFFSET,
-                                               1, IMX335_EXPOSURE_DEFAULT);
+               ret = __v4l2_ctrl_modify_range(imx335->exp_ctrl,
+                                              IMX335_EXPOSURE_MIN,
+                                              imx335->vblank +
+                                              imx335->cur_mode->height -
+                                              IMX335_EXPOSURE_OFFSET,
+                                              1, IMX335_EXPOSURE_DEFAULT);
+               if (ret)
+                       return ret;
        }
 
        /*
@@ -575,6 +577,13 @@ static int imx335_set_ctrl(struct v4l2_ctrl *ctrl)
                return 0;
 
        switch (ctrl->id) {
+       case V4L2_CID_VBLANK:
+               exposure = imx335->exp_ctrl->val;
+               analog_gain = imx335->again_ctrl->val;
+
+               ret = imx335_update_exp_gain(imx335, exposure, analog_gain);
+
+               break;
        case V4L2_CID_EXPOSURE:
                exposure = ctrl->val;
                analog_gain = imx335->again_ctrl->val;

Reply via email to