[PATCH] USB: dwc2: allow usb start even if usbphy is not found
Marius Dinu
marius at psihoexpert.ro
Mon Mar 16 15:27:06 CET 2026
On Mon, 2026-03-16 11.04.13 ++0100, Jonas Karlman wrote:
> Hi Marius,
>
> On 3/16/2026 10:26 AM, Marius Dinu wrote:
> > RK3288 uses rockchip_usb2_phy, but that driver doesn't register iself
> > as a usbphy driver and "usb start" fails with this error:
> >
> > drivers/usb/host/dwc2.c:1254- dwc2_setup_phy() dwc2_usb usb at ff580000:
> > Failed to get USB PHY: -19.
> >
> > Until a proper fix is made for rockchip_usb2_phy, this patch allows
> > usb start to continue even if usbphy is not found.
> >
> > Tested on Asus TinkerBoard.
>
> I am not seeing this issue on my TinkerBoard, what U-Boot version are
> you testing and have you made any config changes compared to
> tinker-rk3288_defconfig?
I'm using the github master branch pulled today + lots and lots of changes
in config. I didn't make a diff, but I expect it to be very very far from
tinker-rk3288_defconfig.
>
> => usb start
> starting USB...
> USB DWC2
> USB DWC2
> Bus usb at ff540000: 2 USB Device(s) found
> Bus usb at ff580000: 1 USB Device(s) found
> scanning usb for storage devices... 0 Storage Device(s) found
>
> => dm tree -e usb
> Class Seq Probed Driver Name
> -----------------------------------------------------------
> usb 0 [ + ] dwc2_usb usb at ff540000
> usb_hub 0 [ + ] usb_hub `-- usb_hub
> usb_hub 1 [ + ] usb_hub `-- usb_hub
> usb 1 [ + ] dwc2_usb usb at ff580000
> usb_hub 2 [ + ] usb_hub `-- usb_hub
>
> Have something changed recently that broke this?
Yes! but not exactly recently...
It broke since commit e17a4bf198510693967644c331ab621fc41ea8b5.
Here's a log on my system without my proposed fix. This is a log that I
saved while I was investigating the failed USB, about a year ago, I think.
But I checked and it still fails with today's git master, I just don't have
the time to enable all the debug options again. It's still ret -19 error.
=> usb start
starting USB...
drivers/core/ofnode.c:540- ofnode_read_prop() ofnode_read_prop: assigned-clock-rates: <not found>
drivers/core/of_access.c:556- of_read_u32_index() of_read_u32_index: #clock-cells: 0x1 (1)
drivers/core/of_access.c:556- of_read_u32_index() of_read_u32_index: #clock-cells: 0x1 (1)
drivers/core/uclass.c:546-uclass_get_device_by_ofnode() Looking for clock-controller at ff760000
drivers/core/uclass.c:397-uclass_find_device_by_ofnode() Looking for clock-controller at ff760000
drivers/core/uclass.c:406-uclass_find_device_by_ofnode() - checking oscillator
drivers/core/uclass.c:406-uclass_find_device_by_ofnode() - checking clock-controller at ff760000
drivers/core/uclass.c:416-uclass_find_device_by_ofnode() - result for clock-controller at ff760000: clock-controller at ff760000 (ret=0)
drivers/core/uclass.c:549-uclass_get_device_by_ofnode() - result for clock-controller at ff760000: clock-controller at ff760000 (ret=0)
drivers/core/ofnode.c:417-ofnode_read_u32_index() ofnode_read_u32_index: vbus-supply: of_read_u32_index: vbus-supply: (not found)
drivers/core/of_access.c:556- of_read_u32_index() of_read_u32_index: #phy-cells: 0x0 (0)
drivers/core/uclass.c:546-uclass_get_device_by_ofnode() Looking for usb-phy at 334
drivers/core/uclass.c:397-uclass_find_device_by_ofnode() Looking for usb-phy at 334
drivers/core/uclass.c:416-uclass_find_device_by_ofnode() - result for usb-phy at 334: (none) (ret=-19)
drivers/core/uclass.c:549-uclass_get_device_by_ofnode() - result for usb-phy at 334: (none) (ret=-19)
drivers/core/uclass.c:546-uclass_get_device_by_ofnode() Looking for usbphy
drivers/core/uclass.c:397-uclass_find_device_by_ofnode() Looking for usbphy
drivers/core/uclass.c:416-uclass_find_device_by_ofnode() - result for usbphy: (none) (ret=-19)
drivers/core/uclass.c:549-uclass_get_device_by_ofnode() - result for usbphy: (none) (ret=-19)
Bus usb at ff500000: Port not available.
and it repeats for usb at ff540000 and usb at ff580000.
There is no usbphy or usb-phy detected/bound in log when u-boot walks the
devicetree nodes, but the device tree has "usbphy" node
compatible="rockchip,rk3288-usb-phy" with 3 sub-nodes: usb-phy at 320,
usb-phy at 334, usb-phy at 348.
Driver with that compatible string: rockchip_usb2_phy.c.
CONFIG_ROCKCHIP_USB2_PHY is enabled, but "dm compat" lists only these:
rockchip_usb2phy rockchip,rk3308-usb2phy
rockchip,rk3328-usb2phy
rockchip,rk3399-usb2phy
rockchip,rk3528-usb2phy
rockchip,rk3568-usb2phy
rockchip,rk3576-usb2phy
rockchip,rk3588-usb2phy
Those compat strings come from phy-rockchip-inno-usb2.c. (I also had that
enabled while debugging.) There are no compat strings from
rockchip_usb2_phy.c.
It's because phy-rockchip-inno-usb2.c has this:
U_BOOT_DRIVER(rockchip_usb2phy){
.name = rockchip_usb2phy"
while rockchip_usb2_phy.c does not. So the usb driver finds no compatible
phy driver loaded and fails. Before the commit, it would load anyway.
I didn't use any AI in this investigation!
Here is a log with my patch:
=> usb start
starting USB...
drivers/core/ofnode.c:525- ofnode_read_bool() ofnode_read_bool: disable-over-current: false
drivers/core/ofnode.c:525- ofnode_read_bool() ofnode_read_bool: hnp-srp-disable: false
drivers/core/ofnode.c:540- ofnode_read_prop() ofnode_read_prop: assigned-clock-rates: <not found>
drivers/core/of_access.c:556- of_read_u32_index() of_read_u32_index: #clock-cells: 0x1 (1)
drivers/core/of_access.c:556- of_read_u32_index() of_read_u32_index: #clock-cells: 0x1 (1)
drivers/core/uclass.c:546-uclass_get_device_by_ofnode() Looking for clock-controller at ff760000
drivers/core/uclass.c:397-uclass_find_device_by_ofnode() Looking for clock-controller at ff760000
drivers/core/uclass.c:406-uclass_find_device_by_ofnode() - checking oscillator
drivers/core/uclass.c:406-uclass_find_device_by_ofnode() - checking clock-controller at ff760000
drivers/core/uclass.c:416-uclass_find_device_by_ofnode() - result for clock-controller at ff760000: clock-controller at ff760000 (ret=0)
drivers/core/uclass.c:549-uclass_get_device_by_ofnode() - result for clock-controller at ff760000: clock-controller at ff760000 (ret=0)
drivers/core/of_access.c:556- of_read_u32_index() of_read_u32_index: #phy-cells: 0x0 (0)
drivers/core/uclass.c:546-uclass_get_device_by_ofnode() Looking for usb-phy at 348
drivers/core/uclass.c:397-uclass_find_device_by_ofnode() Looking for usb-phy at 348
drivers/core/uclass.c:416-uclass_find_device_by_ofnode() - result for usb-phy at 348: (none) (ret=-19)
drivers/core/uclass.c:549-uclass_get_device_by_ofnode() - result for usb-phy at 348: (none) (ret=-19)
drivers/core/uclass.c:546-uclass_get_device_by_ofnode() Looking for usbphy
drivers/core/uclass.c:397-uclass_find_device_by_ofnode() Looking for usbphy
drivers/core/uclass.c:416-uclass_find_device_by_ofnode() - result for usbphy: (none) (ret=-19)
drivers/core/uclass.c:549-uclass_get_device_by_ofnode() - result for usbphy: (none) (ret=-19)
drivers/usb/host/dwc2.c:1254- dwc2_setup_phy() dwc2_usb usb at ff540000: Failed to get USB PHY: -19.
drivers/usb/host/dwc2.c:1332- dwc2_usb_probe() dwc2_usb usb at ff540000: Failed to setup PHY: -19. Continuing anyway...
drivers/usb/host/dwc2.c:1061- dwc2_reset() dwc2_usb usb at ff540000: Can't get reset: -2
drivers/usb/host/dwc2.c:1095- dwc2_init_common() dwc2_usb usb at ff540000: Core Release: 3.10a
drivers/core/ofnode.c:540- ofnode_read_prop() ofnode_read_prop: dr_mode: host
drivers/usb/common/dwc2_core.c:67- dwc2_flush_tx_fifo() Flush Tx FIFO 16
drivers/usb/common/dwc2_core.c:102- dwc2_flush_rx_fifo() Flush Rx FIFO
drivers/core/ofnode.c:417-ofnode_read_u32_index() ofnode_read_u32_index: vbus-supply: of_read_u32_index: vbus-supply: (not found)
USB DWC2
drivers/core/ofnode.c:417-ofnode_read_u32_index() ofnode_read_u32_index: companion: of_read_u32_index: companion: (not found)
drivers/core/ofnode.c:525- ofnode_read_bool() ofnode_read_bool: disable-over-current: false
drivers/core/ofnode.c:525- ofnode_read_bool() ofnode_read_bool: hnp-srp-disable: false
drivers/core/ofnode.c:540- ofnode_read_prop() ofnode_read_prop: assigned-clock-rates: <not found>
drivers/core/of_access.c:556- of_read_u32_index() of_read_u32_index: #clock-cells: 0x1 (1)
drivers/core/of_access.c:556- of_read_u32_index() of_read_u32_index: #clock-cells: 0x1 (1)
drivers/core/uclass.c:546-uclass_get_device_by_ofnode() Looking for clock-controller at ff760000
drivers/core/uclass.c:397-uclass_find_device_by_ofnode() Looking for clock-controller at ff760000
drivers/core/uclass.c:406-uclass_find_device_by_ofnode() - checking oscillator
drivers/core/uclass.c:406-uclass_find_device_by_ofnode() - checking clock-controller at ff760000
drivers/core/uclass.c:416-uclass_find_device_by_ofnode() - result for clock-controller at ff760000: clock-controller at ff760000 (ret=0)
drivers/core/uclass.c:549-uclass_get_device_by_ofnode() - result for clock-controller at ff760000: clock-controller at ff760000 (ret=0)
drivers/core/of_access.c:556- of_read_u32_index() of_read_u32_index: #phy-cells: 0x0 (0)
drivers/core/uclass.c:546-uclass_get_device_by_ofnode() Looking for usb-phy at 320
drivers/core/uclass.c:397-uclass_find_device_by_ofnode() Looking for usb-phy at 320
drivers/core/uclass.c:416-uclass_find_device_by_ofnode() - result for usb-phy at 320: (none) (ret=-19)
drivers/core/uclass.c:549-uclass_get_device_by_ofnode() - result for usb-phy at 320: (none) (ret=-19)
drivers/core/uclass.c:546-uclass_get_device_by_ofnode() Looking for usbphy
drivers/core/uclass.c:397-uclass_find_device_by_ofnode() Looking for usbphy
drivers/core/uclass.c:416-uclass_find_device_by_ofnode() - result for usbphy: (none) (ret=-19)
drivers/core/uclass.c:549-uclass_get_device_by_ofnode() - result for usbphy: (none) (ret=-19)
drivers/usb/host/dwc2.c:1254- dwc2_setup_phy() dwc2_usb usb at ff580000: Failed to get USB PHY: -19.
drivers/usb/host/dwc2.c:1332- dwc2_usb_probe() dwc2_usb usb at ff580000: Failed to setup PHY: -19. Continuing anyway...
drivers/usb/host/dwc2.c:1061- dwc2_reset() dwc2_usb usb at ff580000: Can't get reset: -2
drivers/usb/host/dwc2.c:1095- dwc2_init_common() dwc2_usb usb at ff580000: Core Release: 3.10a
drivers/core/ofnode.c:540- ofnode_read_prop() ofnode_read_prop: dr_mode: otg
drivers/usb/common/dwc2_core.c:67- dwc2_flush_tx_fifo() Flush Tx FIFO 16
drivers/usb/common/dwc2_core.c:102- dwc2_flush_rx_fifo() Flush Rx FIFO
drivers/usb/host/dwc2.c:230-dwc_otg_core_host_init() dwc2_usb usb at ff580000: dwc_otg_core_host_init: Timeout!
drivers/usb/host/dwc2.c:230-dwc_otg_core_host_init() dwc2_usb usb at ff580000: dwc_otg_core_host_init: Timeout!
drivers/usb/host/dwc2.c:230-dwc_otg_core_host_init() dwc2_usb usb at ff580000: dwc_otg_core_host_init: Timeout!
drivers/usb/host/dwc2.c:230-dwc_otg_core_host_init() dwc2_usb usb at ff580000: dwc_otg_core_host_init: Timeout!
drivers/usb/host/dwc2.c:230-dwc_otg_core_host_init() dwc2_usb usb at ff580000: dwc_otg_core_host_init: Timeout!
drivers/usb/host/dwc2.c:230-dwc_otg_core_host_init() dwc2_usb usb at ff580000: dwc_otg_core_host_init: Timeout!
drivers/usb/host/dwc2.c:230-dwc_otg_core_host_init() dwc2_usb usb at ff580000: dwc_otg_core_host_init: Timeout!
drivers/usb/host/dwc2.c:230-dwc_otg_core_host_init() dwc2_usb usb at ff580000: dwc_otg_core_host_init: Timeout!
CONFIG_USB_GADGET is not enabled in my config.
drivers/core/ofnode.c:417-ofnode_read_u32_index() ofnode_read_u32_index: vbus-supply: of_read_u32_index: vbus-supply: (not found)
USB DWC2
drivers/core/ofnode.c:417-ofnode_read_u32_index() ofnode_read_u32_index: companion: of_read_u32_index: companion: (not found)
drivers/core/ofnode.c:417-ofnode_read_u32_index() ofnode_read_u32_index: usb,device-class: of_read_u32_index: usb,device-class: (not found)
drivers/core/ofnode.c:417-ofnode_read_u32_index() ofnode_read_u32_index: usb,interface-class: of_read_u32_index: usb,interface-class: (not found)
drivers/core/device.c:185- device_bind_common() Bound device usb_hub to usb at ff540000
drivers/core/ofnode.c:540- ofnode_read_prop() ofnode_read_prop: assigned-clock-rates: <not found>
drivers/core/device.c:185- device_bind_common() Bound device usb_hub to usb_hub
drivers/core/device.c:185- device_bind_common() Bound device usb_mass_storage to usb_hub
drivers/core/device.c:185- device_bind_common() Bound device usb_mass_storage.lun0 to usb_mass_storage
long delay here
drivers/core/device.c:185- device_bind_common() Bound device usb_mass_storage.lun0.bootdev to usb_mass_storage
even longer delay here
drivers/core/ofnode.c:417-ofnode_read_u32_index() ofnode_read_u32_index: usb,device-class: of_read_u32_index: usb,device-class: (not found)
drivers/core/ofnode.c:417-ofnode_read_u32_index() ofnode_read_u32_index: usb,interface-class: of_read_u32_index: usb,interface-class: (not found)
drivers/core/device.c:185- device_bind_common() Bound device usb_hub to usb at ff580000
drivers/core/ofnode.c:540- ofnode_read_prop() ofnode_read_prop: assigned-clock-rates: <not found>
Bus usb at ff540000: 3 USB Device(s) found
Bus usb at ff580000: 1 USB Device(s) found
scanning usb for storage devices... 1 Storage Device(s) found
Takes 30s to complete, but it works!
IIRC, that how much it took before the commit that broke it.
Marius
>
> Anyway if something needs fixing it is probably rockchip_usb2_phy.
>
> Regards,
> Jonas
>
> >
> > Signed-off-by: Marius Dinu <m95d+git at psihoexpert.ro>
> > ---
> > drivers/usb/host/dwc2.c | 5 ++---
> > 1 file changed, 2 insertions(+), 3 deletions(-)
> >
> > diff --git a/drivers/usb/host/dwc2.c b/drivers/usb/host/dwc2.c
> > index 16f21fa9083..74d71f23d88 100644
> > --- a/drivers/usb/host/dwc2.c
> > +++ b/drivers/usb/host/dwc2.c
> > @@ -1329,7 +1329,7 @@ static int dwc2_usb_probe(struct udevice *dev)
> >
> > ret = dwc2_setup_phy(dev);
> > if (ret)
> > - return ret;
> > + dev_dbg(dev, "Failed to setup PHY: %d. Continuing anyway...\n", ret);
> >
> > return dwc2_init_common(dev, priv);
> > }
> > @@ -1345,8 +1345,7 @@ static int dwc2_usb_remove(struct udevice *dev)
> >
> > ret = dwc2_shutdown_phy(dev);
> > if (ret) {
> > - dev_dbg(dev, "Failed to shutdown USB PHY: %d.\n", ret);
> > - return ret;
> > + dev_dbg(dev, "Failed to shutdown USB PHY: %d. Continuing anyway...\n", ret);
> > }
> >
> > dwc2_uninit_common(priv->regs);
>
More information about the U-Boot
mailing list