From: Sakari Ailus <sakari.ailus@linux.intel.com>
To: Loic Poulain <loic.poulain@oss.qualcomm.com>
Cc: andersson@kernel.org, konradybcio@kernel.org,
dave.stevenson@raspberrypi.com, robh@kernel.org,
krzk+dt@kernel.org, conor+dt@kernel.org, mchehab@kernel.org,
linux-arm-msm@vger.kernel.org, devicetree@vger.kernel.org,
linux-media@vger.kernel.org, laurent.pinchart@ideasonboard.com
Subject: Re: [PATCH v3 1/4] media: i2c: ov9282: Fix reset-gpio logical state
Date: Mon, 17 Nov 2025 19:30:40 +0200 [thread overview]
Message-ID: <aRtbwK0Afo50Lh0B@kekkonen.localdomain> (raw)
In-Reply-To: <20251114133822.434171-2-loic.poulain@oss.qualcomm.com>
Hi Loic,
On Fri, Nov 14, 2025 at 02:38:19PM +0100, Loic Poulain wrote:
> Ensure reset state is low in the power-on state and high in the
> power-off state (assert reset). Note that the polarity is abstracted
> by the GPIO subsystem, so the logic level reflects the intended reset
> behavior.
That's an interesting approach to fix DTS gone systematically wrong.
I was thinking of the drivers that have this issue, too, but I would have
introduced a new GPIO under a different name (many sensors use "enable",
too). Any thoughts?
Cc Laurent.
>
> To maintain backward compatibility with DTS files that use an incorrect
> flag, we implement a mechanism similar to:
> commit 738455858a2d ("ASoC: codecs: wsa881x: Use proper shutdown GPIO polarity")
>
> Signed-off-by: Loic Poulain <loic.poulain@oss.qualcomm.com>
> ---
> drivers/media/i2c/ov9282.c | 26 ++++++++++++++++++++++----
> 1 file changed, 22 insertions(+), 4 deletions(-)
>
> diff --git a/drivers/media/i2c/ov9282.c b/drivers/media/i2c/ov9282.c
> index a9f6176e9729..e79b326cdd94 100644
> --- a/drivers/media/i2c/ov9282.c
> +++ b/drivers/media/i2c/ov9282.c
> @@ -160,6 +160,7 @@ struct ov9282_mode {
> * @sd: V4L2 sub-device
> * @pad: Media pad. Only one pad supported
> * @reset_gpio: Sensor reset gpio
> + * @reset_gpio_val: Logical value to reset the sensor
> * @inclk: Sensor input clock
> * @supplies: Regulator supplies for the sensor
> * @ctrl_handler: V4L2 control handler
> @@ -180,6 +181,7 @@ struct ov9282 {
> struct v4l2_subdev sd;
> struct media_pad pad;
> struct gpio_desc *reset_gpio;
> + unsigned int reset_gpio_val;
> struct clk *inclk;
> struct regulator_bulk_data supplies[OV9282_NUM_SUPPLIES];
> struct v4l2_ctrl_handler ctrl_handler;
> @@ -1127,13 +1129,29 @@ static int ov9282_parse_hw_config(struct ov9282 *ov9282)
>
> /* Request optional reset pin */
> ov9282->reset_gpio = devm_gpiod_get_optional(ov9282->dev, "reset",
> - GPIOD_OUT_LOW);
> + GPIOD_OUT_HIGH);
> if (IS_ERR(ov9282->reset_gpio)) {
> dev_err(ov9282->dev, "failed to get reset gpio %ld",
> PTR_ERR(ov9282->reset_gpio));
> return PTR_ERR(ov9282->reset_gpio);
> }
>
> + /*
> + * Backwards compatibility work-around.
> + *
> + * The reset GPIO is active-low, but the driver has always used the
> + * gpiod API with inverted logic. As a result, the DTS had to
> + * incorrectly mark the GPIO as active-high to compensate for this
> + * behavior. Changing the flag in the driver now would break backward
> + * compatibility with existing DTS configurations. To address this,
> + * we add a simple value inversion so the driver works with both old
> + * and new DTS.
> + */
> + ov9282->reset_gpio_val = gpiod_is_active_low(ov9282->reset_gpio);
> + if (!ov9282->reset_gpio_val)
> + dev_warn(ov9282->dev, "Using ACTIVE_HIGH for reset GPIO. Your DTB might be outdated\n");
> + gpiod_set_value_cansleep(ov9282->reset_gpio, ov9282->reset_gpio_val);
> +
> /* Get sensor input clock */
> ov9282->inclk = devm_v4l2_sensor_clk_get(ov9282->dev, NULL);
> if (IS_ERR(ov9282->inclk))
> @@ -1237,7 +1255,7 @@ static int ov9282_power_on(struct device *dev)
>
> usleep_range(400, 600);
>
> - gpiod_set_value_cansleep(ov9282->reset_gpio, 1);
> + gpiod_set_value_cansleep(ov9282->reset_gpio, !ov9282->reset_gpio_val);
>
> ret = clk_prepare_enable(ov9282->inclk);
> if (ret) {
> @@ -1260,7 +1278,7 @@ static int ov9282_power_on(struct device *dev)
> error_clk:
> clk_disable_unprepare(ov9282->inclk);
> error_reset:
> - gpiod_set_value_cansleep(ov9282->reset_gpio, 0);
> + gpiod_set_value_cansleep(ov9282->reset_gpio, ov9282->reset_gpio_val);
>
> regulator_bulk_disable(OV9282_NUM_SUPPLIES, ov9282->supplies);
>
> @@ -1278,7 +1296,7 @@ static int ov9282_power_off(struct device *dev)
> struct v4l2_subdev *sd = dev_get_drvdata(dev);
> struct ov9282 *ov9282 = to_ov9282(sd);
>
> - gpiod_set_value_cansleep(ov9282->reset_gpio, 0);
> + gpiod_set_value_cansleep(ov9282->reset_gpio, ov9282->reset_gpio_val);
>
> clk_disable_unprepare(ov9282->inclk);
>
--
Kind regards,
Sakari Ailus
next prev parent reply other threads:[~2025-11-17 17:30 UTC|newest]
Thread overview: 20+ messages / expand[flat|nested] mbox.gz Atom feed top
2025-11-14 13:38 [PATCH v3 0/4] Add QRB2210 RB1 vision mezzanine/kit support Loic Poulain
2025-11-14 13:38 ` [PATCH v3 1/4] media: i2c: ov9282: Fix reset-gpio logical state Loic Poulain
2025-11-17 17:30 ` Sakari Ailus [this message]
2025-12-03 10:00 ` Loic Poulain
2025-12-30 13:49 ` Krzysztof Kozlowski
2025-12-30 13:56 ` Krzysztof Kozlowski
2025-12-15 9:35 ` Loic Poulain
2025-12-15 9:40 ` Sakari Ailus
2025-12-15 10:19 ` Loic Poulain
2025-12-30 13:33 ` Laurent Pinchart
2025-12-30 13:54 ` Krzysztof Kozlowski
2025-12-30 15:03 ` Loic Poulain
2025-12-30 15:40 ` Laurent Pinchart
2025-12-30 15:41 ` Krzysztof Kozlowski
2026-01-06 19:53 ` Loic Poulain
2025-11-14 13:38 ` [PATCH v3 2/4] arm64: dts: qcom: qcm2290: Add pin configuration for mclks Loic Poulain
2025-11-17 13:07 ` Konrad Dybcio
2025-11-14 13:38 ` [PATCH v3 3/4] arm64: dts: qcom: qrb2210-rb1: Add PM8008 node Loic Poulain
2025-11-14 13:38 ` [PATCH v3 4/4] arm64: dts: qcom: qrb2210-rb1: Add overlay for vision mezzanine Loic Poulain
2025-11-18 4:25 ` Dmitry Baryshkov
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=aRtbwK0Afo50Lh0B@kekkonen.localdomain \
--to=sakari.ailus@linux.intel.com \
--cc=andersson@kernel.org \
--cc=conor+dt@kernel.org \
--cc=dave.stevenson@raspberrypi.com \
--cc=devicetree@vger.kernel.org \
--cc=konradybcio@kernel.org \
--cc=krzk+dt@kernel.org \
--cc=laurent.pinchart@ideasonboard.com \
--cc=linux-arm-msm@vger.kernel.org \
--cc=linux-media@vger.kernel.org \
--cc=loic.poulain@oss.qualcomm.com \
--cc=mchehab@kernel.org \
--cc=robh@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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox