From: Richard Leitner <richard.leitner@linux.dev>
To: Dave Stevenson <dave.stevenson@raspberrypi.com>
Cc: Sakari Ailus <sakari.ailus@linux.intel.com>,
Mauro Carvalho Chehab <mchehab@kernel.org>,
Martina Krasteva <martinax.krasteva@intel.com>,
"Paul J. Murphy" <paul.j.murphy@intel.com>,
Daniele Alessandrelli <daniele.alessandrelli@gmail.com>,
Hans Verkuil <hverkuil+cisco@kernel.org>,
Mauro Carvalho Chehab <mchehab+huawei@kernel.org>,
Gyula Kelemen <gyula.kelemen@advasolutions.com>,
linux-media@vger.kernel.org, linux-kernel@vger.kernel.org
Subject: Re: [PATCH 05/10] media: i2c: ov9282: add refresh of missing ranges on a mode change
Date: Mon, 28 Sep 2026 16:39:20 +0200 [thread overview]
Message-ID: <arp7GM4KZZZF6zN2@bombadil> (raw)
In-Reply-To: <CAPY8ntB6hoUMCr7v6E5soWzh+CDuSsdy_bJPStxk=b8mfEzN5w@mail.gmail.com>
On Mon, Sep 28, 2026 at 02:15:05PM +0100, Dave Stevenson wrote:
> Hi Richard
>
> On Mon, 14 Sept 2026 at 20:21, Richard Leitner
> <richard.leitner@linux.dev> wrote:
> >
> > ov9282_update_controls() updates the pixel rate, hblank and vblank, but
> > currently misses the exposure range and flash_duration. Both are dependent
> > on the line time and therefore the pixel format.
>
> The exposure control is dependent on vblank / frame height, not the line time.
Sure. You're right. Thanks for the catch!
>
> > Refresh both, and commit cur_mode and code in ov9282_set_pad_format()
> > before the call so the refresh and any nested s_ctrl see the incoming
> > format.
> >
> > Signed-off-by: Richard Leitner <richard.leitner@linux.dev>
> > ---
> > drivers/media/i2c/ov9282.c | 39 ++++++++++++++++++++++++++++++++++-----
> > 1 file changed, 34 insertions(+), 5 deletions(-)
> >
> > diff --git a/drivers/media/i2c/ov9282.c b/drivers/media/i2c/ov9282.c
> > index 4c88de1965171..e64d8343c18e9 100644
> > --- a/drivers/media/i2c/ov9282.c
> > +++ b/drivers/media/i2c/ov9282.c
> > @@ -557,6 +557,8 @@ static int ov9282_update_controls(struct ov9282 *ov9282,
> > {
> > u32 hblank_min;
> > s64 pixel_rate;
> > + u32 exposure_us;
> > + u32 lpfr;
> > int ret;
> >
> > ret = __v4l2_ctrl_s_ctrl(ov9282->link_freq_ctrl, mode->link_freq_idx);
> > @@ -577,8 +579,22 @@ static int ov9282_update_controls(struct ov9282 *ov9282,
> > if (ret)
> > return ret;
> >
> > - return __v4l2_ctrl_modify_range(ov9282->vblank_ctrl, mode->vblank_min,
> > - mode->vblank_max, 1, mode->vblank);
> > + ret = __v4l2_ctrl_modify_range(ov9282->vblank_ctrl, mode->vblank_min,
> > + mode->vblank_max, 1, mode->vblank);
> > + if (ret)
> > + return ret;
> > +
> > + lpfr = ov9282->vblank_ctrl->val + mode->height;
> > + ret = __v4l2_ctrl_modify_range(ov9282->exp_ctrl, OV9282_EXPOSURE_MIN,
> > + lpfr - OV9282_EXPOSURE_OFFSET,
> > + OV9282_EXPOSURE_STEP,
> > + OV9282_EXPOSURE_DEFAULT);
>
> I would have expected that this should be handled by the first clause
> in ov9282_set_ctrl where if vblank is changed it updates exp_ctrl.
> That's how many drivers handle it.
>
> Looking closer they tend to set an explicit vblank on mode change
> though, and it is that which triggers the set_ctrl.
> There has been previous debate as to whether changing mode should
> reset blanking to give a defined frame rate. Memory says that Sakari
> was in favour of doing that, but I can't find the thread.
> Sashiko also flagged on a previous patchset of mine that if the
> previous mode happened to have had vblank adjusted to be the same as
> the new default value that the new mode selects, then the control
> handler framework won't call set_ctrl(VBLANK), and so the exposure
> range (depending on mode height and VBLANK) won't get updated.
Thanks for the explanation!
If resetting vblank and hblank on a mode change is the "preferred" or
"usual" implementation, then I'm of course fine with that. Either in
this series or in a future one ;-)
>
> All a little messy, so I can be persuaded that there are enough holes
> in the current driver that the easiest solution is just to update the
> control ranges here if you say that set_ctrl(VBLANK) doesn't get
> called in this case.
Regarding the vblank set_ctrl on mode change: I will do another testing
round and either add a comment on the behaviour or remove that
modify_range call.
thanks!
regards;rl
>
> Dave
>
> > + if (ret)
> > + return ret;
> > +
> > + exposure_us = ov9282_exposure_to_us(ov9282, ov9282->exp_ctrl->val);
> > + return __v4l2_ctrl_modify_range(ov9282->flash_duration, 0, exposure_us,
> > + 1, OV9282_STROBE_FRAME_SPAN_DEFAULT);
> > }
> >
> > /**
> > @@ -855,10 +871,23 @@ static int ov9282_set_pad_format(struct v4l2_subdev *sd,
> > framefmt = v4l2_subdev_state_get_format(sd_state, fmt->pad);
> > *framefmt = fmt->format;
> > } else {
> > + const struct ov9282_mode *old_mode = ov9282->cur_mode;
> > + u32 old_code = ov9282->code;
> > +
> > + /*
> > + * Commit before refreshing the ranges. ov9282_update_controls()
> > + * and the nested ov9282_set_ctrl() calls it triggers derive the
> > + * frame length and the line time from cur_mode and code, so
> > + * they have to describe the incoming format, not the outgoing
> > + * one.
> > + */
> > + ov9282->cur_mode = mode;
> > + ov9282->code = code;
> > +
> > ret = ov9282_update_controls(ov9282, mode, fmt);
> > - if (!ret) {
> > - ov9282->cur_mode = mode;
> > - ov9282->code = code;
> > + if (ret) {
> > + ov9282->cur_mode = old_mode;
> > + ov9282->code = old_code;
> > }
> > }
> >
> >
> > --
> > 2.53.0
> >
> >
next prev parent reply other threads:[~2026-09-28 14:39 UTC|newest]
Thread overview: 43+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-09-14 19:20 [PATCH 00/10] media: i2c: ov9282: fix control range handling Richard Leitner
2026-09-14 19:20 ` [PATCH 01/10] media: i2c: ov9282: handle error from exposure range update Richard Leitner
2026-09-15 14:19 ` Dave Stevenson
2026-09-14 19:20 ` [PATCH 02/10] media: i2c: ov9282: fix line time and exposure time calculation Richard Leitner
2026-09-17 10:51 ` Bryan O'Donoghue
2026-09-17 13:38 ` Richard Leitner
2026-09-23 14:16 ` Dave Stevenson
2026-09-28 8:56 ` Richard Leitner
2026-09-28 11:02 ` Dave Stevenson
2026-09-28 11:24 ` Richard Leitner
2026-09-14 19:21 ` [PATCH 03/10] media: i2c: ov9282: fix flash duration to/from microseconds conversion Richard Leitner
2026-09-17 10:53 ` Bryan O'Donoghue
2026-09-28 8:01 ` Richard Leitner
2026-09-28 11:07 ` Dave Stevenson
2026-09-28 11:31 ` Richard Leitner
2026-09-14 19:21 ` [PATCH 04/10] media: i2c: ov9282: update flash_duration range even when powered down Richard Leitner
2026-09-17 10:38 ` Dave Stevenson
2026-09-28 7:54 ` Richard Leitner
2026-09-14 19:21 ` [PATCH 05/10] media: i2c: ov9282: add refresh of missing ranges on a mode change Richard Leitner
2026-09-28 13:15 ` Dave Stevenson
2026-09-28 14:39 ` Richard Leitner [this message]
2026-09-14 19:21 ` [PATCH 06/10] media: i2c: ov9282: refresh flash_duration range on an HBLANK write Richard Leitner
2026-09-23 15:09 ` Dave Stevenson
2026-09-28 8:15 ` Richard Leitner
2026-09-14 19:21 ` [PATCH 07/10] media: i2c: ov9282: drop redundant vblank field Richard Leitner
2026-09-15 14:42 ` Dave Stevenson
2026-09-14 19:21 ` [PATCH 08/10] media: i2c: ov9282: harmonize dev_err_probe usage Richard Leitner
2026-09-15 14:55 ` Dave Stevenson
2026-09-15 19:51 ` Richard Leitner
2026-09-14 19:21 ` [PATCH 09/10] media: i2c: ov9282: fix flash duration control range Richard Leitner
2026-09-28 13:47 ` Dave Stevenson
2026-09-28 14:23 ` Richard Leitner
2026-09-28 14:40 ` Dave Stevenson
2026-09-28 21:08 ` Richard Leitner
2026-09-29 14:06 ` Dave Stevenson
2026-10-05 14:46 ` Richard Leitner
2026-10-05 16:05 ` Dave Stevenson
2026-10-06 8:57 ` Richard Leitner
2026-10-07 7:42 ` Sakari Ailus
2026-10-07 15:24 ` Richard Leitner
2026-09-14 19:21 ` [PATCH 10/10] media: i2c: ov9282: clamp flash_duration default to its maximum Richard Leitner
2026-09-15 15:09 ` Dave Stevenson
2026-09-15 19:43 ` Richard Leitner
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=arp7GM4KZZZF6zN2@bombadil \
--to=richard.leitner@linux.dev \
--cc=daniele.alessandrelli@gmail.com \
--cc=dave.stevenson@raspberrypi.com \
--cc=gyula.kelemen@advasolutions.com \
--cc=hverkuil+cisco@kernel.org \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-media@vger.kernel.org \
--cc=martinax.krasteva@intel.com \
--cc=mchehab+huawei@kernel.org \
--cc=mchehab@kernel.org \
--cc=paul.j.murphy@intel.com \
--cc=sakari.ailus@linux.intel.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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.