[Patch 1/3] media: ov5640: add PIXEL_RATE control
From: Benoit Parrot <hidden>
Date: 2019-09-25 15:21:01
Also in:
linux-media, lkml
Subsystem:
media input infrastructure (v4l/dvb), omnivision ov5640 sensor driver, the rest, v4l2 camera sensor drivers · Maintainers:
Mauro Carvalho Chehab, Steve Longerbeam, Linus Torvalds, Sakari Ailus
Add v4l2 controls to report the pixel rates of each mode. This is needed by some CSI2 receiver in order to perform proper DPHY configuration. Signed-off-by: Benoit Parrot <redacted> --- drivers/media/i2c/ov5640.c | 25 +++++++++++++++++++++++++ 1 file changed, 25 insertions(+)
diff --git a/drivers/media/i2c/ov5640.c b/drivers/media/i2c/ov5640.c
index 500d9bbff10b..c2a44f30d56e 100644
--- a/drivers/media/i2c/ov5640.c
+++ b/drivers/media/i2c/ov5640.c@@ -193,6 +193,9 @@ struct ov5640_mode_info { struct ov5640_ctrls { struct v4l2_ctrl_handler handler; + struct { + struct v4l2_ctrl *pixel_rate; + }; struct { struct v4l2_ctrl *auto_exp; struct v4l2_ctrl *exposure;
@@ -241,6 +244,7 @@ struct ov5640_dev { const struct ov5640_mode_info *last_mode; enum ov5640_frame_rate current_fr; struct v4l2_fract frame_interval; + u64 pixel_rate; struct ov5640_ctrls ctrls;
@@ -2202,6 +2206,7 @@ static int ov5640_set_fmt(struct v4l2_subdev *sd, const struct ov5640_mode_info *new_mode; struct v4l2_mbus_framefmt *mbus_fmt = &format->format; struct v4l2_mbus_framefmt *fmt; + u64 rate; int ret; if (format->pad != 0)
@@ -2233,6 +2238,12 @@ static int ov5640_set_fmt(struct v4l2_subdev *sd, if (mbus_fmt->code != sensor->fmt.code) sensor->pending_fmt_change = true; + rate = sensor->current_mode->vtot * sensor->current_mode->htot; + rate *= ov5640_framerates[sensor->current_fr]; + sensor->pixel_rate = rate; + + __v4l2_ctrl_s_ctrl_int64(sensor->ctrls.pixel_rate, + sensor->pixel_rate); out: mutex_unlock(&sensor->lock); return ret;
@@ -2657,6 +2668,13 @@ static int ov5640_init_controls(struct ov5640_dev *sensor) /* we can use our own mutex for the ctrl lock */ hdl->lock = &sensor->lock; + /* Clock related controls */ + ctrls->pixel_rate = + v4l2_ctrl_new_std(hdl, ops, + V4L2_CID_PIXEL_RATE, 0, INT_MAX, 1, + 55969920); + ctrls->pixel_rate->flags |= V4L2_CTRL_FLAG_READ_ONLY; + /* Auto/manual white balance */ ctrls->auto_wb = v4l2_ctrl_new_std(hdl, ops, V4L2_CID_AUTO_WHITE_BALANCE,
@@ -2782,6 +2800,7 @@ static int ov5640_s_frame_interval(struct v4l2_subdev *sd, struct ov5640_dev *sensor = to_ov5640_dev(sd); const struct ov5640_mode_info *mode; int frame_rate, ret = 0; + u64 rate; if (fi->pad != 0) return -EINVAL;
@@ -2816,6 +2835,12 @@ static int ov5640_s_frame_interval(struct v4l2_subdev *sd, sensor->frame_interval = fi->interval; sensor->current_mode = mode; sensor->pending_mode_change = true; + + rate = sensor->current_mode->vtot * sensor->current_mode->htot; + rate *= ov5640_framerates[sensor->current_fr]; + sensor->pixel_rate = rate; + __v4l2_ctrl_s_ctrl_int64(sensor->ctrls.pixel_rate, + sensor->pixel_rate); } out: mutex_unlock(&sensor->lock);
--
2.17.1