[<prev] [next>] [<thread-prev] [thread-next>] [day] [month] [year] [list]
Message-ID: <Zy43D7wAZLrBDtiX@kekkonen.localdomain>
Date: Fri, 8 Nov 2024 16:06:39 +0000
From: Sakari Ailus <sakari.ailus@...ux.intel.com>
To: Andy Shevchenko <andriy.shevchenko@...ux.intel.com>
Cc: linux-media@...r.kernel.org, linux-kernel@...r.kernel.org,
Mauro Carvalho Chehab <mchehab@...nel.org>,
Hans de Goede <hdegoede@...hat.com>
Subject: Re: [PATCH v1 1/1] media: ov7251: Remap "reset" to "enable" for
OV7251
Hi Andy,
Thanks for the patch.
On Fri, Nov 08, 2024 at 04:50:24PM +0200, Andy Shevchenko wrote:
> The driver of OmniVision OV7251 expects "enable" pin instead of "reset".
> Remap "reset" to "enable" and update polarity.
>
> In particular, the Linux kernel can't load the camera sensor
> driver on Microsoft Surface Book without this change:
>
> ov7251 i2c-INT347E:00: supply vdddo not found, using dummy regulator
> ov7251 i2c-INT347E:00: supply vddd not found, using dummy regulator
> ov7251 i2c-INT347E:00: supply vdda not found, using dummy regulator
> ov7251 i2c-INT347E:00: cannot get enable gpio
> ov7251 i2c-INT347E:00: probe with driver ov7251 failed with error -2
>
> Suggested-by: Hans de Goede <hdegoede@...hat.com>
> Signed-off-by: Andy Shevchenko <andriy.shevchenko@...ux.intel.com>
Should this be cc'd to stable? I guess it's not exactly a fix in the driver
but a BIOS bug, but it can be worked around in the driver. :-)
> ---
> drivers/media/i2c/ov7251.c | 14 ++++++++++++++
> 1 file changed, 14 insertions(+)
>
> diff --git a/drivers/media/i2c/ov7251.c b/drivers/media/i2c/ov7251.c
> index 30f61e04ecaf..7b35add1e0ed 100644
> --- a/drivers/media/i2c/ov7251.c
> +++ b/drivers/media/i2c/ov7251.c
> @@ -1696,7 +1696,21 @@ static int ov7251_probe(struct i2c_client *client)
> return PTR_ERR(ov7251->analog_regulator);
> }
>
> + /*
> + * The device-tree bindings call this pin "enable", but the
> + * datasheet describes the pin as "reset (active low with internal
> + * pull down resistor)". The ACPI tables describing this sensor
It's the functionality that matters albeit I guess this is somewhat a
matter of taste: a similar pin was named "reset" for MIPI CCS.
> + * on, e.g., the Microsoft Surface Book use the ACPI equivalent of
> + * "reset" as pin name, which ACPI glue code then maps to "reset".
> + * Check for a "reset" pin if there is no "enable" pin.
> + */
> ov7251->enable_gpio = devm_gpiod_get(dev, "enable", GPIOD_OUT_HIGH);
> + if (IS_ERR(ov7251->enable_gpio) &&
> + PTR_ERR(ov7251->enable_gpio) != -EPROBE_DEFER) {
> + ov7251->enable_gpio = devm_gpiod_get(dev, "reset", GPIOD_OUT_LOW);
This looks like it'd benefit from a line wrap. I can do that if there's no
need for v2 otherwise.
> + if (!IS_ERR(ov7251->enable_gpio))
> + gpiod_toggle_active_low(ov7251->enable_gpio);
> + }
> if (IS_ERR(ov7251->enable_gpio)) {
> dev_err(dev, "cannot get enable gpio\n");
> return PTR_ERR(ov7251->enable_gpio);
--
Kind regards,
Sakari Ailus
Powered by blists - more mailing lists