[PATCH] media: i2c: vd55g1: Fix wrong output FPS value
From: Benjamin Mugnier
Date: Wed Jul 01 2026 - 10:11:14 EST
Running the sensor on 10 bits mode resulted in FPS being 25% faster than
it should be. This issue did not appear in 8 bits mode. This is mostly
noticeable with libcamera as it can set a target FPS value directly.
This is caused by the V4L2_CID_PIXEL_RATE control being dynamically
changed according to the media bus code, while it should be the same
regardless of the code.
Since we already compute the pixel_clock, use it directly for
V4L2_CID_PIXEL_RATE instead.
Suggested-by: Dave Stevenson <dave.stevenson@xxxxxxxxxxxxxxx>
Signed-off-by: Benjamin Mugnier <benjamin.mugnier@xxxxxxxxxxx>
---
drivers/media/i2c/vd55g1.c | 15 +--------------
1 file changed, 1 insertion(+), 14 deletions(-)
diff --git a/drivers/media/i2c/vd55g1.c b/drivers/media/i2c/vd55g1.c
index 78d18c028154..bb11394ed3e5 100644
--- a/drivers/media/i2c/vd55g1.c
+++ b/drivers/media/i2c/vd55g1.c
@@ -649,12 +649,6 @@ static u32 vd55g1_get_fmt_code(struct vd55g1 *sensor, u32 code)
return vd55g1_mbus_formats_bayer[i][j];
}
-static s32 vd55g1_get_pixel_rate(struct vd55g1 *sensor,
- struct v4l2_mbus_framefmt *format)
-{
- return sensor->mipi_rate / vd55g1_get_fmt_bpp(format->code);
-}
-
static unsigned int vd55g1_get_hblank_min(struct vd55g1 *sensor,
struct v4l2_mbus_framefmt *format,
struct v4l2_rect *crop)
@@ -1285,12 +1279,6 @@ static int vd55g1_new_format_change_controls(struct vd55g1 *sensor,
if (ret)
return ret;
- /* Update pixel rate to reflect new bpp */
- ret = __v4l2_ctrl_s_ctrl_int64(sensor->pixel_rate_ctrl,
- vd55g1_get_pixel_rate(sensor, format));
- if (ret)
- return ret;
-
/* Update hblank according to new width */
hblank = vd55g1_get_hblank_min(sensor, format, crop);
ret = __v4l2_ctrl_modify_range(sensor->hblank_ctrl, hblank, hblank, 1,
@@ -1549,7 +1537,6 @@ static int vd55g1_init_ctrls(struct vd55g1 *sensor)
v4l2_subdev_state_get_crop(state, 0);
struct v4l2_mbus_framefmt *format =
v4l2_subdev_state_get_format(state, 0);
- s32 pixel_rate = vd55g1_get_pixel_rate(sensor, format);
int ret;
v4l2_ctrl_handler_init(hdl, 16);
@@ -1591,7 +1578,7 @@ static int vd55g1_init_ctrls(struct vd55g1 *sensor)
sensor->pixel_rate_ctrl = v4l2_ctrl_new_std(hdl, ops,
V4L2_CID_PIXEL_RATE, 1,
INT_MAX, 1,
- pixel_rate);
+ sensor->pixel_clock);
if (sensor->pixel_rate_ctrl)
sensor->pixel_rate_ctrl->flags |= V4L2_CTRL_FLAG_READ_ONLY;
sensor->ae_lock_ctrl = v4l2_ctrl_new_std(hdl, ops, V4L2_CID_3A_LOCK,
---
base-commit: 254f49634ee16a731174d2ae34bc50bd5f45e731
change-id: 20260701-fix_vd55g1_fps-d3d4b00d7630
Best regards,
--
Benjamin Mugnier <benjamin.mugnier@xxxxxxxxxxx>