[PATCH] USB: dwc2: allow usb start even if usbphy is not found
Jonas Karlman
jonas at kwiboo.se
Mon Mar 16 22:41:08 CET 2026
Hi Marius,
On 3/16/2026 4:12 PM, Marius Dinu wrote:
> 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.
I did a new runtime test on a Tinker Board R2.0 using master with
tinker-rk3288_defconfig and I am not able to reproduce any issue. Maybe
your config changes introduce a condition that causes an issue? Please
share your savedefconfig.
>
> => 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.
I have re-run some tests with different Kconfig options related to
GADGET and DWC2 and are not able to reproduce your issue.
As mentioned above, please share your config changes compared to tinker
defconfig, maybe you have some Kconfig option enabled that make DWC2
work differently?
U-Boot SPL 2026.04-rc4-00007-g010855c5005e (Mar 16 2026 - 21:33:53 +0000)
Trying to boot from RAM
## Checking hash(es) for config conf-1 ... OK
## Checking hash(es) for Image firmware-1 ... crc32+ OK
## Checking hash(es) for Image fdt-1 ... crc32+ OK
spl_perform_arch_fixups: could not map BootROM boot device to ofpath
U-Boot 2026.04-rc4-00007-g010855c5005e (Mar 16 2026 - 21:33:53 +0000)
SoC: Rockchip rk3288
Reset cause: POR
Model: Rockchip RK3288 Asus Tinker Board
DRAM: 2 GiB
PMIC: RK808
Core: 221 devices, 27 uclasses, devicetree: separate
MMC: mmc at ff0c0000: 1, mmc at ff0d0000: 2
Loading Environment from MMC... Card did not respond to voltage select! : -110
*** Warning - No block device, using default environment
In: serial,usbkbd
Out: serial,vidconsole
Err: serial,vidconsole
Net: eth0: ethernet at ff290000
Hit any key to stop autoboot: 0
=> 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
=> usb tree
USB device tree:
1 Hub (480 Mb/s, 0mA)
| U-Boot Root Hub
|
+-2 Hub (480 Mb/s, 100mA)
USB2.0 Hub
1 Hub (480 Mb/s, 0mA)
U-Boot Root Hub
=> 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
pinconfig 130 [ ] pinconfig usb
pinconfig 131 [ ] pinconfig |-- host-vbus-drv
pinconfig 132 [ ] pinconfig `-- pwr-3g
=>
Regards,
Jonas
>
> Marius
>
> PS: There is a duplicate of this email sent from the wrong address. Sorry.
>
>>
>> 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