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>,
Lee Jones <lee@kernel.org>, Pavel Machek <pavel@kernel.org>,
Laurent Pinchart <laurent.pinchart@ideasonboard.com>
Cc: Hans Verkuil <hverkuil@xs4all.nl>,
linux-media@vger.kernel.org, linux-kernel@vger.kernel.org,
linux-leds@vger.kernel.org,
Richard Leitner <richard.leitner@linux.dev>
Subject: [PATCH v5 09/10] media: i2c: ov9282: implement try_ctrl for strobe_duration
Date: Tue, 17 Jun 2025 09:31:43 +0200 [thread overview]
Message-ID: <20250617-ov9282-flash-strobe-v5-9-9762da74d065@linux.dev> (raw)
In-Reply-To: <20250617-ov9282-flash-strobe-v5-0-9762da74d065@linux.dev>
As the granularity of the hardware supported values is lower than the
control value, implement a try_ctrl() function for
V4L2_CID_FLASH_DURATION. This function calculates the nearest possible
µs strobe duration for the given value and returns it back to the
caller.
Signed-off-by: Richard Leitner <richard.leitner@linux.dev>
---
drivers/media/i2c/ov9282.c | 54 ++++++++++++++++++++++++++++++++++++++++++++--
1 file changed, 52 insertions(+), 2 deletions(-)
diff --git a/drivers/media/i2c/ov9282.c b/drivers/media/i2c/ov9282.c
index 2d77b9108bcd2499a40418919e260e7d53a9a64e..1f4bca29cd793e99c473aff9c8b7e200e3d598bc 100644
--- a/drivers/media/i2c/ov9282.c
+++ b/drivers/media/i2c/ov9282.c
@@ -128,6 +128,8 @@
#define OV9282_REG_MIN 0x00
#define OV9282_REG_MAX 0xfffff
+#define OV9282_STROBE_SPAN_FACTOR 192
+
static const char * const ov9282_supply_names[] = {
"avdd", /* Analog power */
"dovdd", /* Digital I/O power */
@@ -691,7 +693,7 @@ static int ov9282_set_ctrl_flash_led_mode(struct ov9282 *ov9282, int mode)
current_val);
}
-static int ov9282_set_ctrl_flash_duration(struct ov9282 *ov9282, u32 value)
+static u32 ov9282_us_to_flash_duration(struct ov9282 *ov9282, u32 value)
{
/*
* Calculate "strobe_frame_span" increments from a given value (µs).
@@ -702,7 +704,27 @@ static int ov9282_set_ctrl_flash_duration(struct ov9282 *ov9282, u32 value)
* The formula below is interpolated from different modes/framerates
* and should work quite well for most settings.
*/
- u32 val = value * 192 / (ov9282->cur_mode->width + ov9282->hblank_ctrl->val);
+ u32 frame_width = ov9282->cur_mode->width + ov9282->hblank_ctrl->val;
+
+ return value * OV9282_STROBE_SPAN_FACTOR / frame_width;
+}
+
+static u32 ov9282_flash_duration_to_us(struct ov9282 *ov9282, u32 value)
+{
+ /*
+ * As the calculation in ov9282_us_to_flash_duration uses an integer
+ * divison calculate in ns here to get more precision. Then check if
+ * we need to compensate that divison by incrementing the µs result.
+ */
+ u32 frame_width = ov9282->cur_mode->width + ov9282->hblank_ctrl->val;
+ u64 ns = value * 1000 * frame_width / OV9282_STROBE_SPAN_FACTOR;
+
+ return DIV_ROUND_UP(ns, 1000);
+}
+
+static int ov9282_set_ctrl_flash_duration(struct ov9282 *ov9282, u32 value)
+{
+ u32 val = ov9282_us_to_flash_duration(ov9282, value);
ov9282_write_reg(ov9282, OV9282_REG_FLASH_DURATION, 1, (val >> 24) & 0xff);
ov9282_write_reg(ov9282, OV9282_REG_FLASH_DURATION + 1, 1, (val >> 16) & 0xff);
@@ -792,9 +814,37 @@ static int ov9282_set_ctrl(struct v4l2_ctrl *ctrl)
return ret;
}
+static int ov9282_try_ctrl(struct v4l2_ctrl *ctrl)
+{
+ struct ov9282 *ov9282 =
+ container_of(ctrl->handler, struct ov9282, ctrl_handler);
+
+ if (ctrl->id == V4L2_CID_FLASH_DURATION) {
+ u32 fd = ov9282_us_to_flash_duration(ov9282, ctrl->val);
+ u32 us = ctrl->val;
+
+ /* get nearest strobe_duration value */
+ u32 us0 = ov9282_flash_duration_to_us(ov9282, fd);
+ u32 us1 = ov9282_flash_duration_to_us(ov9282, (fd + 1));
+
+ if (abs(us1 - us) < abs(us - us0))
+ ctrl->val = us1;
+ else
+ ctrl->val = us0;
+
+ if (us != ctrl->val) {
+ dev_dbg(ov9282->dev, "using next valid strobe_duration %u instead of %u\n",
+ ctrl->val, us);
+ }
+ }
+
+ return 0;
+}
+
/* V4l2 subdevice control ops*/
static const struct v4l2_ctrl_ops ov9282_ctrl_ops = {
.s_ctrl = ov9282_set_ctrl,
+ .try_ctrl = ov9282_try_ctrl,
};
/**
--
2.47.2
next prev parent reply other threads:[~2025-06-17 7:31 UTC|newest]
Thread overview: 22+ messages / expand[flat|nested] mbox.gz Atom feed top
2025-06-17 7:31 [PATCH v5 00/10] Add strobe/flash duration v4l2 ctrl & use it for ov9282 Richard Leitner
2025-06-17 7:31 ` [PATCH v5 01/10] media: v4l: ctrls: add a control for flash/strobe duration Richard Leitner
2025-06-17 7:31 ` [PATCH v5 02/10] media: v4l2-flash: add support " Richard Leitner
2025-06-17 7:31 ` [PATCH v5 03/10] media: v4l2-flash: fix flash_timeout comment Richard Leitner
2025-06-19 9:37 ` (subset) " Lee Jones
2025-06-19 9:38 ` Lee Jones
2025-07-01 6:36 ` Richard Leitner
2025-06-17 7:31 ` [PATCH v5 04/10] Documentation: uAPI: media: add V4L2_CID_FLASH_DURATION Richard Leitner
2025-06-17 7:31 ` [PATCH v5 05/10] media: i2c: ov9282: add output enable register definitions Richard Leitner
2025-06-17 7:31 ` [PATCH v5 06/10] media: i2c: ov9282: add led_mode v4l2 control Richard Leitner
2025-07-09 21:12 ` Sakari Ailus
2025-07-10 6:50 ` Richard Leitner
2025-07-10 8:14 ` Sakari Ailus
2025-07-11 7:41 ` Richard Leitner
2025-07-30 20:39 ` Sakari Ailus
2025-08-04 13:33 ` Richard Leitner
2025-06-17 7:31 ` [PATCH v5 07/10] media: i2c: ov9282: add strobe_duration " Richard Leitner
2025-06-17 7:31 ` [PATCH v5 08/10] media: i2c: ov9282: add strobe_source " Richard Leitner
2025-06-17 7:31 ` Richard Leitner [this message]
2025-06-18 13:04 ` [PATCH v5 09/10] media: i2c: ov9282: implement try_ctrl for strobe_duration kernel test robot
2025-06-17 7:31 ` [PATCH v5 10/10] media: i2c: ov9282: dynamic flash_duration maximum Richard Leitner
2025-07-09 5:24 ` [PATCH v5 00/10] Add strobe/flash duration v4l2 ctrl & use it for ov9282 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=20250617-ov9282-flash-strobe-v5-9-9762da74d065@linux.dev \
--to=richard.leitner@linux.dev \
--cc=dave.stevenson@raspberrypi.com \
--cc=hverkuil@xs4all.nl \
--cc=laurent.pinchart@ideasonboard.com \
--cc=lee@kernel.org \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-leds@vger.kernel.org \
--cc=linux-media@vger.kernel.org \
--cc=mchehab@kernel.org \
--cc=pavel@kernel.org \
--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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox