On 8/21/26 10:50 AM, Bruno Banelli wrote:
On Fri, Aug 21, 2026 at 4:25 AM Marek Vasut <[email protected]> wrote:

On 8/20/26 5:10 PM, Bruno Banelli wrote:
Since commit 4fcba5d556b4 ("regulator: implement basic reference
counter") regulator_set_enable() returns -EALREADY when a fixed or
GPIO regulator has already been enabled. On boards whose VBUS
regulator carries regulator-always-on or regulator-boot-on -
armada-8040-mcbin.dts is one - regulator_autoset() enables it during
the regulator's own probe, so the subsequent enable in xhci_usb_probe()
fails and the controller is never registered:

    starting USB...
    Failed to turn ON the VBUS regulator
    Bus usb3@500000: probe failed, error -114
    No USB controllers found

Use regulator_set_enable_if_allowed(), which tolerates -EALREADY, in
the same way as commit 0830333c4743 ("usb: ehci-generic: Use
regulator_set_enable_if_allowed") and the other drivers converted
after the reference counter was introduced.

Tested on a SolidRun MACCHIATObin (Armada 8040), where USB mass
storage now enumerates.

Fixes: 4fcba5d556b4 ("regulator: implement basic reference counter")
Signed-off-by: Bruno Banelli <[email protected]>
---
   drivers/usb/host/xhci-mvebu.c | 2 +-
   1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/drivers/usb/host/xhci-mvebu.c b/drivers/usb/host/xhci-mvebu.c
index c294a56b3c..53b3e82b66 100644
--- a/drivers/usb/host/xhci-mvebu.c
+++ b/drivers/usb/host/xhci-mvebu.c
@@ -51,7 +51,7 @@ static int xhci_usb_probe(struct udevice *dev)

       ret = device_get_supply_regulator(dev, "vbus-supply", &regulator);
       if (!ret) {
-             ret = regulator_set_enable(regulator, true);
+             ret = regulator_set_enable_if_allowed(regulator, true);
               if (ret) {
                       printf("Failed to turn ON the VBUS regulator\n");
Do you need to handle -ENOSYS return value here ?

No - regulator_set_enable_if_allowed() already absorbs it, which is the
reason for using it rather than open-coding the check in the driver:

   int regulator_set_enable_if_allowed(struct udevice *dev, bool enable)
   {
           int ret;

           ret = regulator_set_enable(dev, enable);
           if (ret == -ENOSYS || ret == -EACCES)
                   return 0;
See include/power/regulator.h if DM_REGULATOR is not enabled condition:

593 static inline int regulator_set_enable_if_allowed(struct udevice *dev, bool enable)
594 {
595         return -ENOSYS;
596 }

Reply via email to