Re: [PATCH v4 1/2] media: i2c: ov8856 : remove ACPI node bypass mechanism

Kieran Bingham <[email protected]> Thu, 06 Aug 2026 09:46:10 +0100
Newsgroups org.kernel.vger.linux-media,org.kernel.vger.stable
Message-ID <178600597076.2317790.15882507123821898906@ping.linuxembedded.co.uk>
Quoting Serin Yeh (2026-08-06 07:18:04)
> On Intel platforms the sensor is enumerated via ACPI, and an INT3472
> "discrete" companion device (the power-logic-control driver under
> drivers/platform/x86/intel/int3472) registers the sensor's
> reset/powerdown GPIOs and the regulator supply. These resources are
> therefore discoverable and usable through the standard gpiod/regulator
> lookups at probe time.
> 
> However, the driver guarded both the GPIO/regulator acquisition in
> ov8856_get_hwcfg() and the whole power-on/off sequence with
> is_acpi_node() and skipped them on ACPI. As a result the sensor was
> never powered or reset by the driver, and probe failed when reading the
> chip ID in ov8856_identify_module().
> 
> Remove the is_acpi_node() checks so the GPIO/regulator resources are
> acquired and the full power sequence runs regardless of the firmware
> interface. The driver now behaves consistently across DT and ACPI
> platforms and initialises the hardware correctly.

The calls to get GPIO resources is 'optional' but regulators aren't I
don't think. Is this still ok ?

I think it is - and we can't run a device without the regulators - but I
don't know how it works in ACPI land.


Sakari, could this cause any regression ? I think it's ok - I just have
a niggle of worry here in case there's something I'm not seeing.


> Tested on Intel platforms with kernel 6.17 and 7.0.
> 
> Fixes: d2fa1134a48b ("media: i2c: ov8856: Use V4L2 legacy sensor clock helper")

Is this accurate though? I don't think that commit caused or added the
ACPI checks. Was this just the first line that matched a git blame ?

I suspect the blame might lie further back.

devm_gpiod_get_optional was still guarded by
 "if (!is_acpi_node(fwnode))"

before d2fa1134a48b, it was just a bit higher before
devm_v4l2_sensor_clk_get().


--
Kieran


> Cc: [email protected]
> Signed-off-by: Serin Yeh <[email protected]>
> Reviewed-by: Bryan O'Donoghue <[email protected]>
> ---
>  drivers/media/i2c/ov8856.c | 29 ++++++++++-------------------
>  1 file changed, 10 insertions(+), 19 deletions(-)
> 
> diff --git a/drivers/media/i2c/ov8856.c b/drivers/media/i2c/ov8856.c
> index 8bedb47cd7cf..9d2b0469a576 100644
> --- a/drivers/media/i2c/ov8856.c
> +++ b/drivers/media/i2c/ov8856.c
> @@ -2082,9 +2082,6 @@ static int ov8856_power_on(struct device *dev)
>         struct ov8856 *ov8856 = to_ov8856(sd);
>         int ret;
>  
> -       if (is_acpi_node(dev_fwnode(dev)))
> -               return 0;
> -
>         ret = clk_prepare_enable(ov8856->xvclk);
>         if (ret < 0) {
>                 dev_err(dev, "failed to enable xvclk\n");
> @@ -2120,9 +2117,6 @@ static int ov8856_power_off(struct device *dev)
>         struct v4l2_subdev *sd = dev_get_drvdata(dev);
>         struct ov8856 *ov8856 = to_ov8856(sd);
>  
> -       if (is_acpi_node(dev_fwnode(dev)))
> -               return 0;
> -
>         gpiod_set_value_cansleep(ov8856->reset_gpio, 1);
>         regulator_bulk_disable(ARRAY_SIZE(ov8856_supply_names),
>                                ov8856->supplies);
> @@ -2293,21 +2287,18 @@ static int ov8856_get_hwcfg(struct ov8856 *ov8856)
>                 dev_warn(dev, "external clock rate %u is unsupported",
>                          xvclk_rate);
>  
> -       if (!is_acpi_node(fwnode)) {
> -               ov8856->reset_gpio = devm_gpiod_get_optional(dev, "reset",
> -                                                            GPIOD_OUT_LOW);
> -               if (IS_ERR(ov8856->reset_gpio))
> -                       return PTR_ERR(ov8856->reset_gpio);
> +       ov8856->reset_gpio = devm_gpiod_get_optional(dev, "reset",
> +                                                    GPIOD_OUT_LOW);
> +       if (IS_ERR(ov8856->reset_gpio))
> +               return PTR_ERR(ov8856->reset_gpio);
>  
> -               for (i = 0; i < ARRAY_SIZE(ov8856_supply_names); i++)
> -                       ov8856->supplies[i].supply = ov8856_supply_names[i];
> +       for (i = 0; i < ARRAY_SIZE(ov8856_supply_names); i++)
> +               ov8856->supplies[i].supply = ov8856_supply_names[i];
>  
> -               ret = devm_regulator_bulk_get(dev,
> -                                             ARRAY_SIZE(ov8856_supply_names),
> -                                             ov8856->supplies);
> -               if (ret)
> -                       return ret;
> -       }
> +       ret = devm_regulator_bulk_get(dev, ARRAY_SIZE(ov8856_supply_names),
> +                                     ov8856->supplies);
> +       if (ret)
> +               return ret;
>  
>         ep = fwnode_graph_get_next_endpoint(fwnode, NULL);
>         if (!ep)
> -- 
> 2.25.1
>