[U-Boot] [PATCH] dm: usb: setup ehci gadget before usb is probed

Ramon Fried ramon.fried at gmail.com
Mon May 21 18:13:20 UTC 2018


On Mon, May 21, 2018 at 6:08 PM, Marek Vasut <marex at denx.de> wrote:
> On 05/21/2018 05:00 PM, Ramon Fried wrote:
>> usb_setup_ehci_gadget() looks for a loaded USB class driver,
>> then it unloads it and loads it again as a device instead of host.
>> This change loads the USB class driver as device if it wasn't loaded
>> in the first place.
>
> To achieve what ? What is the purpose of this patch ? Are you fixing a
> bug or improving the code or what ?
This is an improvement of the code.

If I want for instance to run fastboot. running fastboot will fail if
"start usb" wasn't
run before.

In this scenario, "start usb" will start the USB as host, scan &
enumerate the bus only
to be taken down and brought up again as a device when usb_setup_ehci_gadget()
is called.

Hope it's much clearer now.
Thanks,
Ramon.

>
>> Signed-off-by: Ramon Fried <ramon.fried at gmail.com>
>> ---
>>  drivers/usb/host/usb-uclass.c | 15 ++++++++++-----
>>  1 file changed, 10 insertions(+), 5 deletions(-)
>>
>> diff --git a/drivers/usb/host/usb-uclass.c b/drivers/usb/host/usb-uclass.c
>> index 611ea97a72..7ab7e8990c 100644
>> --- a/drivers/usb/host/usb-uclass.c
>> +++ b/drivers/usb/host/usb-uclass.c
>> @@ -380,17 +380,22 @@ struct usb_device *usb_get_dev_index(struct udevice *bus, int index)
>>
>>  int usb_setup_ehci_gadget(struct ehci_ctrl **ctlrp)
>>  {
>> +     TRACE();
>>       struct usb_platdata *plat;
>>       struct udevice *dev;
>>       int ret;
>>
>>       /* Find the old device and remove it */
>>       ret = uclass_find_device_by_seq(UCLASS_USB, 0, true, &dev);
>> -     if (ret)
>> -             return ret;
>> -     ret = device_remove(dev, DM_REMOVE_NORMAL);
>> -     if (ret)
>> -             return ret;
>> +     if (ret) {
>> +             ret = uclass_find_device(UCLASS_USB, 0, &dev);
>> +             if (ret)
>> +                     return ret;
>> +     } else {
>> +             ret = device_remove(dev, DM_REMOVE_NORMAL);
>> +             if (ret)
>> +                     return ret;
>> +     }
>>
>>       plat = dev_get_platdata(dev);
>>       plat->init_type = USB_INIT_DEVICE;
>>
>
>
> --
> Best regards,
> Marek Vasut


More information about the U-Boot mailing list