All of lore.kernel.org
 help / color / mirror / Atom feed
From: Richard Leitner <richard.leitner@linux.dev>
To: Sakari Ailus <sakari.ailus@linux.intel.com>,
	 Dave Stevenson <dave.stevenson@raspberrypi.com>,
	 Mauro Carvalho Chehab <mchehab@kernel.org>,
	 Daniele Alessandrelli <daniele.alessandrelli@gmail.com>,
	 "Paul J. Murphy" <paul.j.murphy@intel.com>,
	 Martina Krasteva <martinax.krasteva@intel.com>,
	 Richard Leitner <richard.leitner@linux.dev>,
	 Hans Verkuil <hverkuil+cisco@kernel.org>,
	Bryan O'Donoghue <bod@kernel.org>,
	 Jacopo Mondi <jacopo@jmondi.org>
Cc: Mauro Carvalho Chehab <mchehab+huawei@kernel.org>,
	 Gyula Kelemen <gyula.kelemen@advasolutions.com>,
	 linux-media@vger.kernel.org, linux-kernel@vger.kernel.org,
	 stable@vger.kernel.org
Subject: [PATCH v3 5/8] media: i2c: ov9282: add refresh of additional ranges on a mode change
Date: Tue, 10 Nov 2026 14:10:14 +0100	[thread overview]
Message-ID: <20261110-ov9282-fixes-v3-5-cb6df80cbc22@linux.dev> (raw)
In-Reply-To: <20261110-ov9282-fixes-v3-0-cb6df80cbc22@linux.dev>

ov9282_update_controls() updates the pixel rate, hblank and vblank, but
currently misses the exposure range and flash_duration.

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.

Fixes: 14ea315bbeb75 ("media: i2c: Add ov9282 camera sensor driver")
Cc: stable@vger.kernel.org
Reviewed-by: Dave Stevenson <dave.stevenson@raspberrypi.com>
Signed-off-by: Richard Leitner <richard.leitner@linux.dev>
---
 drivers/media/i2c/ov9282.c | 36 +++++++++++++++++++++++++++++++-----
 1 file changed, 31 insertions(+), 5 deletions(-)

diff --git a/drivers/media/i2c/ov9282.c b/drivers/media/i2c/ov9282.c
index 44ac2043f5651..86a62ccd68654 100644
--- a/drivers/media/i2c/ov9282.c
+++ b/drivers/media/i2c/ov9282.c
@@ -548,6 +548,7 @@ static int ov9282_update_controls(struct ov9282 *ov9282,
 {
 	u32 hblank_min;
 	s64 pixel_rate;
+	u32 lpfr;
 	int ret;
 
 	ret = __v4l2_ctrl_s_ctrl(ov9282->link_freq_ctrl, mode->link_freq_idx);
@@ -568,8 +569,20 @@ 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);
+	if (ret)
+		return ret;
+
+	return ov9282_update_ctrl_flash_duration(ov9282);
 }
 
 /**
@@ -833,10 +846,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


  parent reply	other threads:[~2026-11-10 13:10 UTC|newest]

Thread overview: 12+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2026-11-10 13:10 [PATCH v3 0/8] media: i2c: ov9282: fix strobe timing and control handling Richard Leitner
2026-11-10 13:10 ` [PATCH v3 1/8] media: i2c: ov9282: handle error from exposure range update Richard Leitner
2026-11-10 13:10 ` [PATCH v3 2/8] media: i2c: ov9282: fix pixel rate and line time calculation Richard Leitner
2026-11-10 13:10 ` [PATCH v3 3/8] media: i2c: ov9282: fix flash duration to/from microseconds conversion Richard Leitner
2026-11-11  2:10   ` kernel test robot
2026-11-11 10:29   ` kernel test robot
2026-11-10 13:10 ` [PATCH v3 4/8] media: i2c: ov9282: fix flash duration range calculation Richard Leitner
2026-11-10 13:10 ` Richard Leitner [this message]
2026-11-10 13:10 ` [PATCH v3 6/8] media: i2c: ov9282: recalculate strobe span on HBLANK change Richard Leitner
2026-11-11  4:46   ` kernel test robot
2026-11-10 13:10 ` [PATCH v3 7/8] media: i2c: ov9282: drop redundant vblank field Richard Leitner
2026-11-10 13:10 ` [PATCH v3 8/8] media: i2c: ov9282: harmonize dev_err_probe usage 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=20261110-ov9282-fixes-v3-5-cb6df80cbc22@linux.dev \
    --to=richard.leitner@linux.dev \
    --cc=bod@kernel.org \
    --cc=daniele.alessandrelli@gmail.com \
    --cc=dave.stevenson@raspberrypi.com \
    --cc=gyula.kelemen@advasolutions.com \
    --cc=hverkuil+cisco@kernel.org \
    --cc=jacopo@jmondi.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 \
    --cc=stable@vger.kernel.org \
    /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.