[U-Boot] [PATCH] power: regulator: Return success on attempt to disable an always-on regulator

Simon Glass sjg at chromium.org
Sat Dec 29 13:28:49 UTC 2018


Hi Lokesh,

On Thu, 27 Dec 2018 at 22:33, Lokesh Vutla <lokeshvutla at ti.com> wrote:
>
> Hi Simon,
>
> On 28/12/18 3:57 AM, Simon Glass wrote:
> > Hi Lokesh,
> >
> > On Mon, 24 Dec 2018 at 04:08, Lokesh Vutla <lokeshvutla at ti.com> wrote:
> >>
> >> commit 4f86a724e82c0 ("power: regulator: denied disable on always-on
> >> regulator") throws an error when requested to disable an always-on
> >> regulator. It is right that an always-on regulator should not be
> >> attempted to be disabled. But at the same time regulator framework
> >> should not return an error when such request is received. Instead
> >> it should just return success without attempting to disable the
> >> specified regulator. This is because the requesting driver will
> >> not have the idea if the regulator is always-on or not. The
> >> requesting driver will always try to enable/disable regulator as
> >> per the required flow. So it is upto regulator framework to not
> >> break such scenarios.
> >
> > Can the caller not check the error code? It is -EACCES in this case.
>
> We considered this an one of the option but I ended up fixing regulator
> framework due to the following reasons:
> - If regulator framework returns -EACCES on this scenario then:
>         - -EACCES should be checked in all the existing usage of the api[1] or else
> someone else might encounter the same problem.

Yes. Some already check for -ENOSYS, e.g. omap_hsmmc.c

>         - Any future usage of the api should take of handling this error.

Yes, and it should be commented too.

>         - From a client driver perspective it is not really an error. It is doing the
> right thing and receiving an error might be confusing.

The error means that the request was not handled. There is no way to
find out that requesting this was actually wrong.

>
> Hope this is clear. Also just to add one more point, I adapted this error
> handling from Linux kernel[2].

The only question for me whether anything would need to detect that
the request to disable a regulator is not supported.

Your linux link appears to lead me to regulator_ena_gpio_ctrl(),
related to regulator GPIOs. Is that right? It's hard for me to
understand what the code there is doing.

Once we make this change we will not be able to go back without breaking things.

I am not really convinced that this patch is the best approach. I do
understand your point though. It just worries me that we are hiding
something and it will be hard to unhide it later.

What do you think about adding something like
regulator_disable_if_allowed() which silently ignored -ENOSYS and
-EACCES?

Thanks for the detailed response.

Regards,
Simon

>
> [1] ➜  u-boot git:(master) git grep -in "regulator_set_enable(.*, false)"
> cmd/regulator.c:410:    ret = regulator_set_enable(dev, false);
> drivers/mmc/mmc.c:2552:     int ret = regulator_set_enable(mmc->vmmc_supply, false);
> drivers/mmc/omap_hsmmc.c:473:   ret = regulator_set_enable(priv->pbias_supply,
> false);
> drivers/mmc/omap_hsmmc.c:478:   ret = regulator_set_enable(mmc->vqmmc_supply,
> false);
> drivers/net/fec_mxc.c:1414:     regulator_set_enable(priv->phy_supply, false);
> drivers/phy/meson-gxl-usb2.c:174:       int ret =
> regulator_set_enable(priv->phy_supply, false);
> drivers/phy/phy-rcar-gen3.c:101:    return
> regulator_set_enable(priv->vbus_supply, false);
> drivers/phy/phy-stm32-usbphyc.c:251:        ret =
> regulator_set_enable(usbphyc_phy->vdda1v1, false);
> drivers/phy/phy-stm32-usbphyc.c:257:        ret =
> regulator_set_enable(usbphyc_phy->vdda1v8, false);
> drivers/phy/phy-stm32-usbphyc.c:263:        ret =
> regulator_set_enable(usbphyc_phy->vdd, false);
> drivers/usb/host/dwc2.c:199:        ret =
> regulator_set_enable(priv->vbus_supply, false);
> drivers/usb/host/ehci-generic.c:60:     return
> regulator_set_enable(priv->vbus_supply, false);
> drivers/usb/host/xhci-rockchip.c:161:       ret =
> regulator_set_enable(plat->vbus_supply, false);
> drivers/video/pwm_backlight.c:160:          ret =
> regulator_set_enable(priv->reg, false);
> test/dm/adc.c:74:   ut_assertok(regulator_set_enable(supply, false));
>
> [2]  [1]
> https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/tree/drivers/regulator/core.c#n2333
>
> Thanks and regards,
> Lokesh
>


More information about the U-Boot mailing list