From: Sakari Ailus <sakari.ailus@linux.intel.com>
To: linux-media@vger.kernel.org
Cc: Jacopo Mondi <jacopo@jmondi.org>,
Steve Longerbeam <slongerbeam@gmail.com>,
laurent.pinchart@ideasonboard.com, hverkuil-cisco@xs4all.nl,
mirela.rabulea@nxp.com, xavier.roumegue@oss.nxp.com,
tomi.valkeinen@ideasonboard.com, hugues.fruchet@st.com,
prabhakar.mahadev-lad.rj@bp.renesas.com, aford173@gmail.com,
festevam@gmail.com, Eugen.Hristev@microchip.com,
jbrunet@baylibre.com, paul.elder@ideasonboard.com,
eddy.khan@vergesense.com,
Mauro Carvalho Chehab <mchehab@kernel.org>
Subject: [PATCH v7 17/28] media: ov5640: Adjust vblank with s_frame_interval
Date: Fri, 13 May 2022 17:15:37 +0300 [thread overview]
Message-ID: <20220513141548.6344-18-sakari.ailus@linux.intel.com> (raw)
In-Reply-To: <20220513141548.6344-1-sakari.ailus@linux.intel.com>
From: Hugues Fruchet <hugues.fruchet@st.com>
Adjust the vertical blanking when s_frame_interval is used.
s_frame_interval allows to set a fixed frame rate, which gets stored as
the sensor's current one. When a new mode is applied, the current frame
rate is reset to the mode's default one. In order to correctly report
the currently configured vertical blanking for s_frame_interval users,
verify that the desired frame rate has not been changed. If that's the
case, compute the correct blanking value and reflect it through the
corresponding v4l2 control.
Signed-off-by: Hugues Fruchet <hugues.fruchet@st.com>
Signed-off-by: Jacopo Mondi <jacopo@jmondi.org>
Signed-off-by: Sakari Ailus <sakari.ailus@linux.intel.com>
---
drivers/media/i2c/ov5640.c | 58 +++++++++++++++++++++++++++-----------
1 file changed, 42 insertions(+), 16 deletions(-)
diff --git a/drivers/media/i2c/ov5640.c b/drivers/media/i2c/ov5640.c
index 4534821f4af0f..63d43bddb8386 100644
--- a/drivers/media/i2c/ov5640.c
+++ b/drivers/media/i2c/ov5640.c
@@ -307,6 +307,7 @@ struct ov5640_mode_info {
/* Used by s_frame_interval only. */
u32 max_fps;
+ u32 def_fps;
};
struct ov5640_ctrls {
@@ -602,7 +603,8 @@ static const struct ov5640_mode_info ov5640_mode_data[OV5640_NUM_MODES] = {
},
.reg_data = ov5640_setting_low_res,
.reg_data_size = ARRAY_SIZE(ov5640_setting_low_res),
- .max_fps = OV5640_30_FPS
+ .max_fps = OV5640_30_FPS,
+ .def_fps = OV5640_30_FPS
}, {
/* 176x144 */
.id = OV5640_MODE_QCIF_176_144,
@@ -646,7 +648,8 @@ static const struct ov5640_mode_info ov5640_mode_data[OV5640_NUM_MODES] = {
},
.reg_data = ov5640_setting_low_res,
.reg_data_size = ARRAY_SIZE(ov5640_setting_low_res),
- .max_fps = OV5640_30_FPS
+ .max_fps = OV5640_30_FPS,
+ .def_fps = OV5640_30_FPS
}, {
/* 320x240 */
.id = OV5640_MODE_QVGA_320_240,
@@ -690,7 +693,8 @@ static const struct ov5640_mode_info ov5640_mode_data[OV5640_NUM_MODES] = {
},
.reg_data = ov5640_setting_low_res,
.reg_data_size = ARRAY_SIZE(ov5640_setting_low_res),
- .max_fps = OV5640_30_FPS
+ .max_fps = OV5640_30_FPS,
+ .def_fps = OV5640_30_FPS
}, {
/* 640x480 */
.id = OV5640_MODE_VGA_640_480,
@@ -734,7 +738,8 @@ static const struct ov5640_mode_info ov5640_mode_data[OV5640_NUM_MODES] = {
},
.reg_data = ov5640_setting_low_res,
.reg_data_size = ARRAY_SIZE(ov5640_setting_low_res),
- .max_fps = OV5640_60_FPS
+ .max_fps = OV5640_60_FPS,
+ .def_fps = OV5640_30_FPS
}, {
/* 720x480 */
.id = OV5640_MODE_NTSC_720_480,
@@ -777,7 +782,8 @@ static const struct ov5640_mode_info ov5640_mode_data[OV5640_NUM_MODES] = {
},
.reg_data = ov5640_setting_low_res,
.reg_data_size = ARRAY_SIZE(ov5640_setting_low_res),
- .max_fps = OV5640_30_FPS
+ .max_fps = OV5640_30_FPS,
+ .def_fps = OV5640_30_FPS
}, {
/* 720x576 */
.id = OV5640_MODE_PAL_720_576,
@@ -820,7 +826,8 @@ static const struct ov5640_mode_info ov5640_mode_data[OV5640_NUM_MODES] = {
},
.reg_data = ov5640_setting_low_res,
.reg_data_size = ARRAY_SIZE(ov5640_setting_low_res),
- .max_fps = OV5640_30_FPS
+ .max_fps = OV5640_30_FPS,
+ .def_fps = OV5640_30_FPS
}, {
/* 1024x768 */
.id = OV5640_MODE_XGA_1024_768,
@@ -862,7 +869,8 @@ static const struct ov5640_mode_info ov5640_mode_data[OV5640_NUM_MODES] = {
},
.reg_data = ov5640_setting_low_res,
.reg_data_size = ARRAY_SIZE(ov5640_setting_low_res),
- .max_fps = OV5640_30_FPS
+ .max_fps = OV5640_30_FPS,
+ .def_fps = OV5640_30_FPS
}, {
/* 1280x720 */
.id = OV5640_MODE_720P_1280_720,
@@ -904,7 +912,8 @@ static const struct ov5640_mode_info ov5640_mode_data[OV5640_NUM_MODES] = {
},
.reg_data = ov5640_setting_720P_1280_720,
.reg_data_size = ARRAY_SIZE(ov5640_setting_720P_1280_720),
- .max_fps = OV5640_30_FPS
+ .max_fps = OV5640_30_FPS,
+ .def_fps = OV5640_30_FPS
}, {
/* 1920x1080 */
.id = OV5640_MODE_1080P_1920_1080,
@@ -948,7 +957,8 @@ static const struct ov5640_mode_info ov5640_mode_data[OV5640_NUM_MODES] = {
},
.reg_data = ov5640_setting_1080P_1920_1080,
.reg_data_size = ARRAY_SIZE(ov5640_setting_1080P_1920_1080),
- .max_fps = OV5640_30_FPS
+ .max_fps = OV5640_30_FPS,
+ .def_fps = OV5640_30_FPS
}, {
/* 2592x1944 */
.id = OV5640_MODE_QSXGA_2592_1944,
@@ -991,7 +1001,8 @@ static const struct ov5640_mode_info ov5640_mode_data[OV5640_NUM_MODES] = {
},
.reg_data = ov5640_setting_QSXGA_2592_1944,
.reg_data_size = ARRAY_SIZE(ov5640_setting_QSXGA_2592_1944),
- .max_fps = OV5640_15_FPS
+ .max_fps = OV5640_15_FPS,
+ .def_fps = OV5640_15_FPS
},
};
@@ -2712,6 +2723,7 @@ static int ov5640_update_pixel_rate(struct ov5640_dev *sensor)
u32 pixel_rate;
s64 link_freq;
u32 num_lanes;
+ u32 vblank;
u32 bpp;
/*
@@ -2770,15 +2782,29 @@ static int ov5640_update_pixel_rate(struct ov5640_dev *sensor)
__v4l2_ctrl_modify_range(sensor->ctrls.hblank,
hblank, hblank, 1, hblank);
+ vblank = timings->vblank_def;
+
+ if (sensor->current_fr != mode->def_fps) {
+ /*
+ * Compute the vertical blanking according to the framerate
+ * configured with s_frame_interval.
+ */
+ int fie_num = sensor->frame_interval.numerator;
+ int fie_denom = sensor->frame_interval.denominator;
+
+ vblank = ((fie_num * pixel_rate / fie_denom) / timings->htot) -
+ mode->height;
+ }
+
__v4l2_ctrl_modify_range(sensor->ctrls.vblank, OV5640_MIN_VBLANK,
- OV5640_MAX_VTS - mode->height, 1,
- timings->vblank_def);
- __v4l2_ctrl_s_ctrl(sensor->ctrls.vblank, timings->vblank_def);
+ OV5640_MAX_VTS - mode->height, 1, vblank);
+ __v4l2_ctrl_s_ctrl(sensor->ctrls.vblank, vblank);
- exposure_max = timings->crop.height + timings->vblank_def - 4;
+ exposure_max = timings->crop.height + vblank - 4;
exposure_val = clamp_t(s32, sensor->ctrls.exposure->val,
sensor->ctrls.exposure->minimum,
exposure_max);
+
__v4l2_ctrl_modify_range(sensor->ctrls.exposure,
sensor->ctrls.exposure->minimum,
exposure_max, 1, exposure_val);
@@ -2816,6 +2842,7 @@ static int ov5640_set_fmt(struct v4l2_subdev *sd,
}
if (new_mode != sensor->current_mode) {
+ sensor->current_fr = new_mode->def_fps;
sensor->current_mode = new_mode;
sensor->pending_mode_change = true;
}
@@ -3468,8 +3495,7 @@ static int ov5640_s_frame_interval(struct v4l2_subdev *sd,
sensor->current_mode = mode;
sensor->pending_mode_change = true;
- __v4l2_ctrl_s_ctrl_int64(sensor->ctrls.pixel_rate,
- ov5640_calc_pixel_rate(sensor));
+ ov5640_update_pixel_rate(sensor);
}
out:
mutex_unlock(&sensor->lock);
--
2.30.2
next prev parent reply other threads:[~2022-05-13 14:16 UTC|newest]
Thread overview: 31+ messages / expand[flat|nested] mbox.gz Atom feed top
2022-05-13 14:15 [PATCH v7 00/28] media: ov5640: Rework the clock tree programming for MIPI Sakari Ailus
2022-05-13 14:15 ` [PATCH v7 01/28] media: ov5640: Add pixel rate to modes Sakari Ailus
2022-05-13 14:15 ` [PATCH v7 02/28] media: ov5640: Re-arrange modes definition Sakari Ailus
2022-05-13 14:15 ` [PATCH v7 03/28] media: ov5640: Add ov5640_is_csi2() function Sakari Ailus
2022-05-13 14:15 ` [PATCH v7 04/28] media: ov5640: Associate bpp with formats Sakari Ailus
2022-05-13 14:15 ` [PATCH v7 05/28] media: ov5640: Add LINK_FREQ control Sakari Ailus
2022-05-13 14:15 ` [PATCH v7 06/28] media: ov5640: Update pixel_rate and link_freq Sakari Ailus
2022-05-13 14:15 ` [PATCH v7 07/28] media: ov5640: Rework CSI-2 clock tree Sakari Ailus
2022-05-13 14:15 ` [PATCH v7 08/28] media: ov5640: Rework timings programming Sakari Ailus
2022-05-13 14:15 ` [PATCH v7 09/28] media: ov5640: Fix 720x480 in RGB888 mode Sakari Ailus
2022-05-13 14:15 ` [PATCH v7 10/28] media: ov5640: Split DVP and CSI-2 timings Sakari Ailus
2022-05-13 14:15 ` [PATCH v7 11/28] media: ov5640: Provide timings accessor Sakari Ailus
2022-05-13 14:15 ` [PATCH v7 12/28] media: ov5640: Re-sort per-mode register tables Sakari Ailus
2022-05-13 14:15 ` [PATCH v7 13/28] media: ov5640: Remove duplicated mode settings Sakari Ailus
2022-05-13 14:15 ` [PATCH v7 14/28] media: ov5640: Remove ov5640_mode_init_data Sakari Ailus
2022-05-13 14:15 ` [PATCH v7 15/28] media: ov5640: Add HBLANK control Sakari Ailus
2022-05-13 14:15 ` [PATCH v7 16/28] media: ov5640: Add VBLANK control Sakari Ailus
2022-05-13 14:15 ` Sakari Ailus [this message]
2022-05-13 14:15 ` [PATCH v7 18/28] media: ov5640: Remove frame rate check from find_mode() Sakari Ailus
2022-05-13 14:15 ` [PATCH v7 19/28] media: ov5640: Change CSI-2 timings to comply with FPS Sakari Ailus
2022-05-13 14:15 ` [PATCH v7 20/28] media: ov5640: Implement init_cfg Sakari Ailus
2022-05-13 14:15 ` [PATCH v7 21/28] media: ov5640: Implement get_selection Sakari Ailus
2022-05-13 14:15 ` [PATCH v7 22/28] media: ov5640: Register device properties Sakari Ailus
2022-05-13 14:15 ` [PATCH v7 23/28] media: ov5640: Add RGB565_1X16 format Sakari Ailus
2022-05-13 14:15 ` [PATCH v7 24/28] media: ov5640: Add BGR888 format Sakari Ailus
2022-05-13 14:15 ` [PATCH v7 25/28] media: ov5640: Restrict sizes to mbus code Sakari Ailus
2022-05-13 14:15 ` [PATCH v7 26/28] media: ov5640: Adjust format to bpp in s_fmt Sakari Ailus
2022-05-13 14:15 ` [PATCH v7 27/28] media: ov5640: Split DVP and CSI-2 formats Sakari Ailus
2022-05-13 14:15 ` [PATCH v7 28/28] media: ov5640: Move format mux config in format Sakari Ailus
2022-05-13 14:24 ` [PATCH v7 00/28] media: ov5640: Rework the clock tree programming for MIPI Jacopo Mondi
-- strict thread matches above, loose matches on Subject: below --
2022-05-13 14:13 Jacopo Mondi
2022-05-13 14:14 ` [PATCH v7 17/28] media: ov5640: Adjust vblank with s_frame_interval Jacopo Mondi
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20220513141548.6344-18-sakari.ailus@linux.intel.com \
--to=sakari.ailus@linux.intel.com \
--cc=Eugen.Hristev@microchip.com \
--cc=aford173@gmail.com \
--cc=eddy.khan@vergesense.com \
--cc=festevam@gmail.com \
--cc=hugues.fruchet@st.com \
--cc=hverkuil-cisco@xs4all.nl \
--cc=jacopo@jmondi.org \
--cc=jbrunet@baylibre.com \
--cc=laurent.pinchart@ideasonboard.com \
--cc=linux-media@vger.kernel.org \
--cc=mchehab@kernel.org \
--cc=mirela.rabulea@nxp.com \
--cc=paul.elder@ideasonboard.com \
--cc=prabhakar.mahadev-lad.rj@bp.renesas.com \
--cc=slongerbeam@gmail.com \
--cc=tomi.valkeinen@ideasonboard.com \
--cc=xavier.roumegue@oss.nxp.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).