summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJai Luthra <jai.luthra@ideasonboard.com>2025-02-21 13:52:14 +0300
committerHans Verkuil <hverkuil@xs4all.nl>2025-03-04 15:35:32 +0300
commit07444c60ff31b594a09621d0753761f09d73bf07 (patch)
tree5a452e24da308b5c72587e7cfb81ea6061ea2c1c
parent5345c743ba36a737cf9118101e8224bf1654a61d (diff)
downloadlinux-07444c60ff31b594a09621d0753761f09d73bf07.tar.xz
media: i2c: imx219: Use subdev state to calculate binning and pixelrate
The pixel rate and binning calculations need the format and resolution of the sensor, so pass the v4l2 subdev state directly instead of always operating on the active state. Suggested-by: Jacopo Mondi <jacopo.mondi@ideasonboard.com> Link: https://lore.kernel.org/linux-media/sejl7xskif6rlpdsg3jhczjwe5gi6rs53ehbyka6omv2zeg7qq@4iis7i2lla5p/ Reviewed-by: Jacopo Mondi <jacopo.mondi@ideasonboard.com> Signed-off-by: Jai Luthra <jai.luthra@ideasonboard.com> Signed-off-by: Sakari Ailus <sakari.ailus@linux.intel.com> Signed-off-by: Hans Verkuil <hverkuil@xs4all.nl>
-rw-r--r--drivers/media/i2c/imx219.c15
1 files changed, 7 insertions, 8 deletions
diff --git a/drivers/media/i2c/imx219.c b/drivers/media/i2c/imx219.c
index a8c9d296daa6..4542ab28a6e9 100644
--- a/drivers/media/i2c/imx219.c
+++ b/drivers/media/i2c/imx219.c
@@ -399,10 +399,9 @@ static u32 imx219_get_format_bpp(const struct v4l2_mbus_framefmt *format)
}
}
-static void imx219_get_binning(struct imx219 *imx219, u8 *bin_h, u8 *bin_v)
+static void imx219_get_binning(struct v4l2_subdev_state *state, u8 *bin_h,
+ u8 *bin_v)
{
- struct v4l2_subdev_state *state =
- v4l2_subdev_get_locked_active_state(&imx219->sd);
const struct v4l2_mbus_framefmt *format =
v4l2_subdev_state_get_format(state, 0);
const struct v4l2_rect *crop = v4l2_subdev_state_get_crop(state, 0);
@@ -429,11 +428,11 @@ static void imx219_get_binning(struct imx219 *imx219, u8 *bin_h, u8 *bin_v)
*bin_v = IMX219_BINNING_X2;
}
-static inline u32 imx219_get_rate_factor(struct imx219 *imx219)
+static inline u32 imx219_get_rate_factor(struct v4l2_subdev_state *state)
{
u8 bin_h, bin_v;
- imx219_get_binning(imx219, &bin_h, &bin_v);
+ imx219_get_binning(state, &bin_h, &bin_v);
return (bin_h & bin_v) == IMX219_BINNING_X2_ANALOG ? 2 : 1;
}
@@ -454,7 +453,7 @@ static int imx219_set_ctrl(struct v4l2_ctrl *ctrl)
state = v4l2_subdev_get_locked_active_state(&imx219->sd);
format = v4l2_subdev_state_get_format(state, 0);
- rate_factor = imx219_get_rate_factor(imx219);
+ rate_factor = imx219_get_rate_factor(state);
if (ctrl->id == V4L2_CID_VBLANK) {
int exposure_max, exposure_def;
@@ -688,7 +687,7 @@ static int imx219_set_framefmt(struct imx219 *imx219,
cci_write(imx219->regmap, IMX219_REG_Y_ADD_END_A,
crop->top - IMX219_PIXEL_ARRAY_TOP + crop->height - 1, &ret);
- imx219_get_binning(imx219, &bin_h, &bin_v);
+ imx219_get_binning(state, &bin_h, &bin_v);
cci_write(imx219->regmap, IMX219_REG_BINNING_MODE_H, bin_h, &ret);
cci_write(imx219->regmap, IMX219_REG_BINNING_MODE_V, bin_v, &ret);
@@ -929,7 +928,7 @@ static int imx219_set_pad_format(struct v4l2_subdev *sd,
/* Scale the pixel rate based on the mode specific factor */
pixel_rate = imx219_get_pixel_rate(imx219) *
- imx219_get_rate_factor(imx219);
+ imx219_get_rate_factor(state);
__v4l2_ctrl_modify_range(imx219->pixel_rate, pixel_rate,
pixel_rate, 1, pixel_rate);
}