Re: [PATCH] usb: xhci-mvebu: use regulator_set_enable_if_allowed()
Marek Vasut <[email protected]>
| Newsgroups | gmane.comp.boot-loaders.u-boot.general,gmane.comp.boot-loaders.u-boot |
|---|---|
| Message-ID | <[email protected]> |
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", ®ulator); >>> 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 }