On Mon Apr 20 20:31:49 2026 +0300, Sakari Ailus wrote:
> The rate_factor multiplier is used to multiply a few values in the
> sensor's timing configuration and the exposure time is one of them. This
> also needs to be taken into account in exposure time margin: multiply it
> by rate_factor so that sensor's exposure time margin is respected.
> 
> Fixes: f513997119f4 ("media: i2c: imx219: Scale the pixel rate for analog 
> binning")
> Cc: [email protected]
> Signed-off-by: Sakari Ailus <[email protected]>
> Reviewed-by: Dave Stevenson <[email protected]>
> Reviewed-by: Laurent Pinchart <[email protected]>

Patch committed.

Thanks,
Sakari Ailus

 drivers/media/i2c/imx219.c | 7 +++++--
 1 file changed, 5 insertions(+), 2 deletions(-)

---

diff --git a/drivers/media/i2c/imx219.c b/drivers/media/i2c/imx219.c
index 9571f3622d2d..5184523de8be 100644
--- a/drivers/media/i2c/imx219.c
+++ b/drivers/media/i2c/imx219.c
@@ -466,7 +466,8 @@ static int imx219_set_ctrl(struct v4l2_ctrl *ctrl)
                int exposure_max, exposure_def;
 
                /* Update max exposure while meeting expected vblanking */
-               exposure_max = format->height + ctrl->val - 
IMX219_EXPOSURE_OFFSET;
+               exposure_max = format->height + ctrl->val -
+                       IMX219_EXPOSURE_OFFSET * rate_factor;
                exposure_def = (exposure_max < IMX219_EXPOSURE_DEFAULT) ?
                                exposure_max : IMX219_EXPOSURE_DEFAULT;
                ret = __v4l2_ctrl_modify_range(imx219->exposure,
@@ -893,6 +894,7 @@ static int imx219_set_pad_format(struct v4l2_subdev *sd,
        crop->top = (IMX219_NATIVE_HEIGHT - crop->height) / 2;
 
        if (fmt->which == V4L2_SUBDEV_FORMAT_ACTIVE) {
+               int rate_factor = imx219_get_rate_factor(state);
                int exposure_max;
                int exposure_def;
                int llp_min;
@@ -911,7 +913,8 @@ static int imx219_set_pad_format(struct v4l2_subdev *sd,
                        return ret;
 
                /* Update max exposure while meeting expected vblanking */
-               exposure_max = mode->fll_def - IMX219_EXPOSURE_OFFSET;
+               exposure_max = mode->fll_def -
+                       IMX219_EXPOSURE_OFFSET * rate_factor;
                exposure_def = (exposure_max < IMX219_EXPOSURE_DEFAULT) ?
                                exposure_max : IMX219_EXPOSURE_DEFAULT;
                ret = __v4l2_ctrl_modify_range(imx219->exposure,
_______________________________________________
linuxtv-commits mailing list -- [email protected]
To unsubscribe send an email to [email protected]

Reply via email to