From: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
To: Jacopo Mondi <jacopo@jmondi.org>
Cc: Steve Longerbeam <slongerbeam@gmail.com>,
sakari.ailus@iki.fi, 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, Mauro Carvalho Chehab <mchehab@kernel.org>,
linux-media@vger.kernel.org
Subject: Re: [PATCH 01/21] media: ov5640: Add pixel rate to modes
Date: Tue, 1 Feb 2022 16:52:12 +0200 [thread overview]
Message-ID: <YflJHNylTQGm4eRz@pendragon.ideasonboard.com> (raw)
In-Reply-To: <20220131143245.128089-2-jacopo@jmondi.org>
Hi Jacopo,
Thank you for the patch.
On Mon, Jan 31, 2022 at 03:32:25PM +0100, Jacopo Mondi wrote:
> Add to each mode supported by the sensor the ideal pixel rate, as
> defined by Table 2.1 in the chip manual.
>
> The ideal pixel rate will be used to compute the MIPI CSI-2 clock tree.
>
> Create the V4L2_CID_LINK_FREQ control and define the enumeration
> of possible MIPI CSI-2 link frequencies from the list of supported
> pixel clocks.
>
> Signed-off-by: Jacopo Mondi <jacopo@jmondi.org>
> ---
> drivers/media/i2c/ov5640.c | 66 ++++++++++++++++++++++++++++++++++++--
> 1 file changed, 63 insertions(+), 3 deletions(-)
>
> diff --git a/drivers/media/i2c/ov5640.c b/drivers/media/i2c/ov5640.c
> index db5a19babe67..d915c9652302 100644
> --- a/drivers/media/i2c/ov5640.c
> +++ b/drivers/media/i2c/ov5640.c
> @@ -118,6 +118,44 @@ enum ov5640_frame_rate {
> OV5640_NUM_FRAMERATES,
> };
>
> +enum ov5640_pixel_rate_id {
> + OV5640_PIXEL_RATE_168M,
> + OV5640_PIXEL_RATE_148M,
> + OV5640_PIXEL_RATE_124M,
> + OV5640_PIXEL_RATE_96M,
> + OV5640_PIXEL_RATE_48M,
> + OV5640_NUM_PIXEL_RATES,
> +};
> +
> +/*
> + * The chip manual suggests 24/48/96/192 MHz pixel clocks.
> + *
> + * 192MHz exceeds the sysclk limits; use 168MHz as maximum pixel rate for
> + * full resolution mode @15 FPS.
> + */
> +static const u32 ov5640_pixel_rates[] = {
> + [OV5640_PIXEL_RATE_168M] = 168000000,
> + [OV5640_PIXEL_RATE_148M] = 148000000,
> + [OV5640_PIXEL_RATE_124M] = 124000000,
> + [OV5640_PIXEL_RATE_96M] = 96000000,
> + [OV5640_PIXEL_RATE_48M] = 48000000,
> +};
> +
> +/*
> + * MIPI CSI-2 link frequencies.
> + *
> + * Derived from the above defined pixel rate for bpp = (8, 16, 24) and
> + * data_lanes = (1, 2)
> + *
> + * link_freq = (pixel_rate * bpp) / (2 * data_lanes)
> + */
> +static const s64 ov5640_csi2_link_freqs[] = {
> + 992000000, 888000000, 768000000, 744000000, 672000000, 672000000,
> + 592000000, 592000000, 576000000, 576000000, 496000000, 496000000,
> + 384000000, 384000000, 384000000, 336000000, 296000000, 288000000,
> + 248000000, 192000000, 192000000, 192000000, 96000000,
> +};
> +
> enum ov5640_format_mux {
> OV5640_FMT_MUX_YUV422 = 0,
> OV5640_FMT_MUX_RGB,
> @@ -189,6 +227,7 @@ struct reg_value {
> struct ov5640_mode_info {
> enum ov5640_mode_id id;
> enum ov5640_downsize_mode dn_mode;
> + enum ov5640_pixel_rate_id pixel_rate;
> u32 hact;
> u32 htot;
> u32 vact;
> @@ -201,6 +240,7 @@ struct ov5640_mode_info {
> struct ov5640_ctrls {
> struct v4l2_ctrl_handler handler;
> struct v4l2_ctrl *pixel_rate;
> + struct v4l2_ctrl *link_freq;
> struct {
> struct v4l2_ctrl *auto_exp;
> struct v4l2_ctrl *exposure;
> @@ -565,7 +605,9 @@ static const struct reg_value ov5640_setting_QSXGA_2592_1944[] = {
>
> /* power-on sensor init reg table */
> static const struct ov5640_mode_info ov5640_mode_init_data = {
> - 0, SUBSAMPLING, 640, 1896, 480, 984,
> + 0, SUBSAMPLING,
> + OV5640_PIXEL_RATE_96M,
> + 640, 1896, 480, 984,
> ov5640_init_setting_30fps_VGA,
> ARRAY_SIZE(ov5640_init_setting_30fps_VGA),
> OV5640_30_FPS,
> @@ -574,51 +616,61 @@ static const struct ov5640_mode_info ov5640_mode_init_data = {
> static const struct ov5640_mode_info
> ov5640_mode_data[OV5640_NUM_MODES] = {
> {OV5640_MODE_QQVGA_160_120, SUBSAMPLING,
> + OV5640_PIXEL_RATE_48M,
I would have moved this after 02/21 :-) No need to change that though,
the rebase conflict isn't worth it.
> 160, 1896, 120, 984,
> ov5640_setting_QQVGA_160_120,
> ARRAY_SIZE(ov5640_setting_QQVGA_160_120),
> OV5640_30_FPS},
> {OV5640_MODE_QCIF_176_144, SUBSAMPLING,
> + OV5640_PIXEL_RATE_48M,
> 176, 1896, 144, 984,
> ov5640_setting_QCIF_176_144,
> ARRAY_SIZE(ov5640_setting_QCIF_176_144),
> OV5640_30_FPS},
> {OV5640_MODE_QVGA_320_240, SUBSAMPLING,
> + OV5640_PIXEL_RATE_48M,
> 320, 1896, 240, 984,
> ov5640_setting_QVGA_320_240,
> ARRAY_SIZE(ov5640_setting_QVGA_320_240),
> OV5640_30_FPS},
> {OV5640_MODE_VGA_640_480, SUBSAMPLING,
> + OV5640_PIXEL_RATE_48M,
> 640, 1896, 480, 1080,
> ov5640_setting_VGA_640_480,
> ARRAY_SIZE(ov5640_setting_VGA_640_480),
> OV5640_60_FPS},
> {OV5640_MODE_NTSC_720_480, SUBSAMPLING,
> + OV5640_PIXEL_RATE_96M,
> 720, 1896, 480, 984,
> ov5640_setting_NTSC_720_480,
> ARRAY_SIZE(ov5640_setting_NTSC_720_480),
> OV5640_30_FPS},
> {OV5640_MODE_PAL_720_576, SUBSAMPLING,
> + OV5640_PIXEL_RATE_96M,
> 720, 1896, 576, 984,
> ov5640_setting_PAL_720_576,
> ARRAY_SIZE(ov5640_setting_PAL_720_576),
> OV5640_30_FPS},
> {OV5640_MODE_XGA_1024_768, SUBSAMPLING,
> + OV5640_PIXEL_RATE_96M,
> 1024, 1896, 768, 1080,
> ov5640_setting_XGA_1024_768,
> ARRAY_SIZE(ov5640_setting_XGA_1024_768),
> OV5640_30_FPS},
> {OV5640_MODE_720P_1280_720, SUBSAMPLING,
> + OV5640_PIXEL_RATE_124M,
> 1280, 1892, 720, 740,
> ov5640_setting_720P_1280_720,
> ARRAY_SIZE(ov5640_setting_720P_1280_720),
> OV5640_30_FPS},
> {OV5640_MODE_1080P_1920_1080, SCALING,
> + OV5640_PIXEL_RATE_148M,
> 1920, 2500, 1080, 1120,
> ov5640_setting_1080P_1920_1080,
> ARRAY_SIZE(ov5640_setting_1080P_1920_1080),
> OV5640_30_FPS},
> {OV5640_MODE_QSXGA_2592_1944, SCALING,
> + OV5640_PIXEL_RATE_168M,
> 2592, 2844, 1944, 1968,
> ov5640_setting_QSXGA_2592_1944,
> ARRAY_SIZE(ov5640_setting_QSXGA_2592_1944),
> @@ -2743,6 +2795,7 @@ static const struct v4l2_ctrl_ops ov5640_ctrl_ops = {
>
> static int ov5640_init_controls(struct ov5640_dev *sensor)
> {
> + const struct ov5640_mode_info *mode = sensor->current_mode;
> const struct v4l2_ctrl_ops *ops = &ov5640_ctrl_ops;
> struct ov5640_ctrls *ctrls = &sensor->ctrls;
> struct v4l2_ctrl_handler *hdl = &ctrls->handler;
> @@ -2755,8 +2808,14 @@ static int ov5640_init_controls(struct ov5640_dev *sensor)
>
> /* Clock related controls */
> ctrls->pixel_rate = v4l2_ctrl_new_std(hdl, ops, V4L2_CID_PIXEL_RATE,
> - 0, INT_MAX, 1,
> - ov5640_calc_pixel_rate(sensor));
> + ov5640_pixel_rates[OV5640_NUM_PIXEL_RATES - 1],
> + ov5640_pixel_rates[0], 1,
> + ov5640_pixel_rates[mode->pixel_rate]);
> +
> + ctrls->link_freq = v4l2_ctrl_new_int_menu(hdl, ops,
> + V4L2_CID_LINK_FREQ,
> + ARRAY_SIZE(ov5640_csi2_link_freqs) - 1,
> + 4, ov5640_csi2_link_freqs);
I'd add the control in patch 05/21, as it's not very usable until then.
>
> /* Auto/manual white balance */
> ctrls->auto_wb = v4l2_ctrl_new_std(hdl, ops,
> @@ -2806,6 +2865,7 @@ static int ov5640_init_controls(struct ov5640_dev *sensor)
> }
>
> ctrls->pixel_rate->flags |= V4L2_CTRL_FLAG_READ_ONLY;
> + ctrls->link_freq->flags |= V4L2_CTRL_FLAG_READ_ONLY;
While a read-only control isn't optimal, I think the series goes in the
right direction, so I'm OK with it.
Reviewed-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
> ctrls->gain->flags |= V4L2_CTRL_FLAG_VOLATILE;
> ctrls->exposure->flags |= V4L2_CTRL_FLAG_VOLATILE;
>
--
Regards,
Laurent Pinchart
next prev parent reply other threads:[~2022-02-01 14:52 UTC|newest]
Thread overview: 60+ messages / expand[flat|nested] mbox.gz Atom feed top
2022-01-31 14:32 [PATCH 00/17] media: ov5640: Rework the clock tree programming for MIPI Jacopo Mondi
2022-01-31 14:32 ` [PATCH 01/21] media: ov5640: Add pixel rate to modes Jacopo Mondi
2022-02-01 14:52 ` Laurent Pinchart [this message]
2022-01-31 14:32 ` [PATCH 02/21] media: ov5604: Re-arrange modes definition Jacopo Mondi
2022-02-01 14:20 ` Laurent Pinchart
2022-01-31 14:32 ` [PATCH 03/21] media: ov5640: Add is_mipi() function Jacopo Mondi
2022-02-01 14:25 ` Laurent Pinchart
2022-01-31 14:32 ` [PATCH 04/21] media: ov5640: Associate bpp with formats Jacopo Mondi
2022-02-01 14:27 ` Laurent Pinchart
2022-01-31 14:32 ` [PATCH 05/21] media: ov5640: Update pixel_rate and link_freq Jacopo Mondi
2022-02-01 16:52 ` Laurent Pinchart
2022-01-31 14:32 ` [PATCH 06/21] media: ov5640: Rework CSI-2 clock tree Jacopo Mondi
2022-02-01 17:27 ` Laurent Pinchart
2022-02-07 14:07 ` Jacopo Mondi
2022-01-31 14:32 ` [PATCH 07/21] media: ov5640: Rework timings programming Jacopo Mondi
2022-02-01 19:03 ` Laurent Pinchart
2022-02-07 14:37 ` Jacopo Mondi
2022-02-07 16:39 ` Laurent Pinchart
2022-01-31 14:32 ` [PATCH 08/21] media: ov5640: Re-sort per-mode register tables Jacopo Mondi
2022-02-01 19:05 ` Laurent Pinchart
2022-02-07 14:42 ` Jacopo Mondi
2022-01-31 14:32 ` [PATCH 09/21] media: ov5640: Remove ov5640_mode_init_data Jacopo Mondi
2022-02-01 19:07 ` Laurent Pinchart
2022-02-07 14:45 ` Jacopo Mondi
2022-01-31 14:32 ` [PATCH 10/21] media: ov5640: Add HBLANK control Jacopo Mondi
2022-02-02 21:20 ` Laurent Pinchart
2022-01-31 14:32 ` [PATCH 11/21] media: ov5640: Add VBLANK control Jacopo Mondi
2022-02-02 21:35 ` Laurent Pinchart
2022-02-07 15:09 ` Jacopo Mondi
2022-02-07 17:22 ` Laurent Pinchart
2022-02-03 7:58 ` Xavier Roumegue (OSS)
2022-02-07 15:12 ` Jacopo Mondi
2022-01-31 14:44 ` [PATCH 12/21] media: ov5640: Fix durations to comply with FPS Jacopo Mondi
2022-01-31 14:44 ` [PATCH 13/21] media: ov5640: Initialize try format Jacopo Mondi
2022-02-02 21:51 ` Laurent Pinchart
2022-01-31 14:44 ` [PATCH 14/21] media: ov5640: Implement get_selection Jacopo Mondi
2022-02-02 22:29 ` Laurent Pinchart
2022-02-07 15:47 ` Jacopo Mondi
2022-02-07 17:53 ` Laurent Pinchart
2022-02-08 14:18 ` Jacopo Mondi
2022-02-08 14:41 ` Laurent Pinchart
2022-01-31 14:44 ` [PATCH 15/21] media: ov5640: Limit format to FPS in DVP mode only Jacopo Mondi
2022-02-02 22:38 ` Laurent Pinchart
2022-02-07 15:49 ` Jacopo Mondi
2022-01-31 14:44 ` [PATCH 16/21] media: ov5640: Disable s_frame_interval in MIPI mode Jacopo Mondi
2022-02-02 22:40 ` Laurent Pinchart
2022-02-02 21:48 ` [PATCH 12/21] media: ov5640: Fix durations to comply with FPS Laurent Pinchart
2022-02-07 15:58 ` Jacopo Mondi
2022-01-31 14:45 ` [PATCH 17/21] media: ov5640: Register device properties Jacopo Mondi
2022-01-31 14:45 ` [PATCH 18/21] media: ov5640: Add RGB565_1X16 format Jacopo Mondi
2022-02-02 22:48 ` Laurent Pinchart
2022-01-31 14:45 ` [PATCH 19/21] media: ov5640: Add RGB888/BGR888 formats Jacopo Mondi
2022-02-02 22:49 ` Laurent Pinchart
2022-02-02 22:44 ` [PATCH 17/21] media: ov5640: Register device properties Laurent Pinchart
2022-01-31 14:45 ` [PATCH 20/21] media: ov5640: Restrict sizes to mbus code Jacopo Mondi
2022-01-31 14:45 ` [PATCH 21/21] media: ov5640: Adjust format to bpp in s_fmt Jacopo Mondi
2022-02-02 23:03 ` Laurent Pinchart
2022-02-07 16:07 ` Jacopo Mondi
2022-02-07 16:46 ` Laurent Pinchart
2022-02-02 22:57 ` [PATCH 20/21] media: ov5640: Restrict sizes to mbus code Laurent Pinchart
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=YflJHNylTQGm4eRz@pendragon.ideasonboard.com \
--to=laurent.pinchart@ideasonboard.com \
--cc=Eugen.Hristev@microchip.com \
--cc=aford173@gmail.com \
--cc=festevam@gmail.com \
--cc=hugues.fruchet@st.com \
--cc=hverkuil-cisco@xs4all.nl \
--cc=jacopo@jmondi.org \
--cc=jbrunet@baylibre.com \
--cc=linux-media@vger.kernel.org \
--cc=mchehab@kernel.org \
--cc=mirela.rabulea@nxp.com \
--cc=prabhakar.mahadev-lad.rj@bp.renesas.com \
--cc=sakari.ailus@iki.fi \
--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).