On 2023-07-16 02:59, Marek Vasut wrote:
> On 7/16/23 01:10, 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@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@fcc00000
>>    dwc3_glue_bind_common: unsupported dr_mode
>>
>> Also use CONFIG_IS_ENABLED(USB_HOST) and change switch to if statements
>> to improve readability of the code.
>>
>> Signed-off-by: Jonas Karlman <[email protected]>
>> ---
>> v2:
>> - Change to use CONFIG_IS_ENABLED for USB_HOST
>> - Refactor switch to if statements (Marek Vasut)
>>
>>   drivers/usb/dwc3/dwc3-generic.c | 25 +++++++------------------
>>   1 file changed, 7 insertions(+), 18 deletions(-)
>>
>> diff --git a/drivers/usb/dwc3/dwc3-generic.c 
>> b/drivers/usb/dwc3/dwc3-generic.c
>> index 4d5d500aefab..6507219d6fc0 100644
>> --- a/drivers/usb/dwc3/dwc3-generic.c
>> +++ b/drivers/usb/dwc3/dwc3-generic.c
>> @@ -226,8 +226,7 @@ U_BOOT_DRIVER(dwc3_generic_peripheral) = {
>>   };
>>   #endif
>>   
>> -#if defined(CONFIG_SPL_USB_HOST) || \
>> -    !defined(CONFIG_SPL_BUILD) && defined(CONFIG_USB_HOST)
>> +#if CONFIG_IS_ENABLED(USB_HOST)
>>   static int dwc3_generic_host_probe(struct udevice *dev)
>>   {
>>      struct xhci_hcor *hcor;
>> @@ -409,7 +408,7 @@ struct dwc3_glue_ops ti_ops = {
>>   static int dwc3_glue_bind_common(struct udevice *parent, ofnode node)
>>   {
>>      const char *name = ofnode_get_name(node);
>> -    const char *driver = NULL;
>> +    const char *driver;
>>      enum usb_dr_mode dr_mode;
>>      struct udevice *dev;
>>      int ret;
>> @@ -421,27 +420,17 @@ static int dwc3_glue_bind_common(struct udevice 
>> *parent, ofnode node)
>>      if (!dr_mode)
>>              dr_mode = usb_get_dr_mode(node);
>>   
>> -    switch (dr_mode) {
>> -    case USB_DR_MODE_PERIPHERAL:
>> -    case USB_DR_MODE_OTG:
>> -#if CONFIG_IS_ENABLED(DM_USB_GADGET)
>> +    if (CONFIG_IS_ENABLED(DM_USB_GADGET) &&
>> +        (dr_mode == USB_DR_MODE_PERIPHERAL || dr_mode == USB_DR_MODE_OTG)) {
>>              debug("%s: dr_mode: OTG or Peripheral\n", __func__);
>>              driver = "dwc3-generic-peripheral";
>> -#endif
>> -            break;
>> -#if defined(CONFIG_SPL_USB_HOST) || !defined(CONFIG_SPL_BUILD)
>> -    case USB_DR_MODE_HOST:
>> +    } else if (CONFIG_IS_ENABLED(USB_HOST) && dr_mode == USB_DR_MODE_HOST) {
>>              debug("%s: dr_mode: HOST\n", __func__);
>>              driver = "dwc3-generic-host";
>> -            break;
>> -#endif
>> -    default:
>> +    } else {
>>              debug("%s: unsupported dr_mode\n", __func__);
> 
> If you are already fixing this, please also print the actual dr_mode 
> that is unsupported, i.e. the aforementioned debug() output is useless 
> right now, just add dr_mode %s there.

Sure, I can add a dr_mode %d to the debug message in a v3, dr_mode is
enum not a string.

Regards,
Jonas

Reply via email to