RE: [PATCH v3 1/2] media: i2c: ov8856 : remove ACPI node bypass mechanism

"Yeh, Serin" <[email protected]> Thu, 6 Aug 2026 06:55:50 +0000
Newsgroups org.kernel.vger.linux-media,org.kernel.vger.stable
Message-ID <DS0PR11MB79717CC63F1E828930C24E1EF6D22@DS0PR11MB7971.namprd11.prod.outlook.com>
Hi Sakari,

Thanks for the review.

> -----Original Message-----
> From: Sakari Ailus <[email protected]>
> Sent: Wednesday, July 29, 2026 2:01 AM
> To: Yeh, Serin <[email protected]>
> Cc: [email protected]; Su, Jimmy <[email protected]>; Sapre, Sarang <[email protected]>; [email protected]; [email protected]; [email protected]
> Subject: Re: [PATCH v3 1/2] media: i2c: ov8856 : remove ACPI node bypass mechanism
>
> Hi Serin,
>
> On Thu, Jul 23, 2026 at 03:40:36PM +0800, Serin Yeh wrote:
> > The driver currently skips power-on and power-off sequences when
> > running with ACPI devices by checking is_acpi_node(). This results in
> > all power configuration steps (GPIO, and regulators) being bypassed.
> >
> > Remove the is_acpi_node() checks to ensure that the full power
> > sequence is always executed regardless of the firmware interface.
> >
> > With these changes, the driver behaves consistently across DT and ACPI
> > platforms and ensures correct hardware initialization.
> >
> > Fixes: d2fa1134a48b ("media: i2c: ov8856: Use V4L2 legacy sensor clock
> > helper")
> > Cc: [email protected]
> > Signed-off-by: Serin Yeh <[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);
>
> Can you fix this (multiple devm_regulator_bulk_get() should never have been
> done) first in a separate patch, as Bryan suggested?
After discussing this with you, I believe the devm_regulator_bulk_get() logic is clear. The devm_regulator_bulk_get() is currently guarded by the is_acpi_node() conditional branch rather than being placed inside a loop.
I'll address Bryan's suggestion and modify the commit log in v4.

Thanks.

Regards,
Serin Yeh