[PATCH 3/5] usb: dwc3-generic: Relax unsupported dr_mode check
Jonas Karlman
jonas at kwiboo.se
Thu Jul 13 12:25:16 CEST 2023
On 2023-07-13 12:08, Marek Vasut wrote:
> On 7/13/23 11:56, Jonas Karlman wrote:
>> Hi Marek,
>>
>> Sorry for late reply.
>> On 2023-06-05 12:14, Marek Vasut wrote:
>>> On 5/30/23 12:26, Jonas Karlman wrote:
>>>> When dr_mode is peripheral or otg and U-Boot has not been built with
>>>> DM_USB_GADGET support, booting such device may end up with:
>>>>
>>>> dwc3_glue_bind_common: subnode name: usb at fcc00000
>>>> Error binding driver 'dwc3-generic-wrapper': -6
>>>> Some drivers failed to bind
>>>> initcall sequence 00000000effbca08 failed at call 0000000000a217c8 (err=-6)
>>>> ### ERROR ### Please RESET the board ###
>>>>
>>>> Instead fail gracfully with ENODEV to allow board continue booting.
>>>>
>>>> dwc3_glue_bind_common: subnode name: usb at fcc00000
>>>> dwc3_glue_bind_common: unsupported dr_mode
>>>>
>>>> Signed-off-by: Jonas Karlman <jonas at kwiboo.se>
>>>> ---
>>>> drivers/usb/dwc3/dwc3-generic.c | 4 ++--
>>>> 1 file changed, 2 insertions(+), 2 deletions(-)
>>>>
>>>> diff --git a/drivers/usb/dwc3/dwc3-generic.c b/drivers/usb/dwc3/dwc3-generic.c
>>>> index c28ad47bddd8..f7859a530280 100644
>>>> --- a/drivers/usb/dwc3/dwc3-generic.c
>>>> +++ b/drivers/usb/dwc3/dwc3-generic.c
>>>> @@ -422,13 +422,13 @@ static int dwc3_glue_bind_common(struct udevice *parent, ofnode node)
>>>> dr_mode = usb_get_dr_mode(node);
>>>>
>>>> switch (dr_mode) {
>>>> +#if CONFIG_IS_ENABLED(DM_USB_GADGET)
>>>> case USB_DR_MODE_PERIPHERAL:
>>>> case USB_DR_MODE_OTG:
>>>> -#if CONFIG_IS_ENABLED(DM_USB_GADGET)
>>>
>>> Why not just do
>>>
>>> #else
>>> return -ENODEV
>>> #endif
>>>
>>> here ?
>>
>> The code was changed to closer match how host mode is already handled,
>> and the default switch case already return -ENODEV.
>
> Let's try the above and see if that makes the code more readable.
>
> Also, you might want to try
>
> if (!CONFIG_IS_ENABLED(DM_USB_GADGET))
> return -ENODEV;
>
> To improve build coverage.
In my opinion this (after this patch as-is) is more readable and has the
benefit of the debug message when DM_USB_GADGET is disabled.
switch (dr_mode) {
#if CONFIG_IS_ENABLED(DM_USB_GADGET)
case USB_DR_MODE_PERIPHERAL:
case USB_DR_MODE_OTG:
debug("%s: dr_mode: OTG or Peripheral\n", __func__);
driver = "dwc3-generic-peripheral";
break;
#endif
#if defined(CONFIG_SPL_USB_HOST) || !defined(CONFIG_SPL_BUILD)
case USB_DR_MODE_HOST:
debug("%s: dr_mode: HOST\n", __func__);
driver = "dwc3-generic-host";
break;
#endif
default:
debug("%s: unsupported dr_mode\n", __func__);
return -ENODEV;
};
Compared to the following:
switch (dr_mode) {
case USB_DR_MODE_PERIPHERAL:
case USB_DR_MODE_OTG:
if (!CONFIG_IS_ENABLED(DM_USB_GADGET))
return -ENODEV;
debug("%s: dr_mode: OTG or Peripheral\n", __func__);
driver = "dwc3-generic-peripheral";
break;
#if defined(CONFIG_SPL_USB_HOST) || !defined(CONFIG_SPL_BUILD)
case USB_DR_MODE_HOST:
debug("%s: dr_mode: HOST\n", __func__);
driver = "dwc3-generic-host";
break;
#endif
default:
debug("%s: unsupported dr_mode\n", __func__);
return -ENODEV;
};
Any suggestion on how this could otherwise be refactored?
The original intent with the patch is to fix a non-booting
config to a booting config with minimal code changes :-)
Regards,
Jonas
More information about the U-Boot
mailing list