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

Marek Vasut marex at denx.de
Mon May 21 20:55:35 UTC 2018


On 05/21/2018 08:13 PM, Ramon Fried wrote:
> 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.

CCing Lukasz to look at this.

> 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


-- 
Best regards,
Marek Vasut


More information about the U-Boot mailing list