[U-Boot] [PATCH 2/5] dm: usb: Add support for companion controllers

Simon Glass sjg at chromium.org
Tue May 5 23:46:28 CEST 2015


Hi Hans,

On 5 May 2015 at 07:28, Hans de Goede <hdegoede at redhat.com> wrote:
> USB companion controllers must be scanned after the main controller has
> been scanned, so that any devices which the main controller which to hand
> over to the companion have actually been handed over before we scan the
> companion.
>
> As there are no guarantees that this will magically happen in the right
> order, split the scanning of the busses in 2 phases, first main controllers,

buses

> and then companion controllers.
>
> Signed-off-by: Hans de Goede <hdegoede at redhat.com>
> ---
>  drivers/usb/host/usb-uclass.c | 30 +++++++++++++++++++++++++-----
>  include/usb.h                 |  2 ++
>  2 files changed, 27 insertions(+), 5 deletions(-)
>
> diff --git a/drivers/usb/host/usb-uclass.c b/drivers/usb/host/usb-uclass.c
> index ad778b4..d745c1c 100644
> --- a/drivers/usb/host/usb-uclass.c
> +++ b/drivers/usb/host/usb-uclass.c
> @@ -157,6 +157,9 @@ static void usb_scan_bus(struct udevice *bus, bool recurse)
>
>         assert(recurse);        /* TODO: Support non-recusive */
>
> +       if (!device_active(bus))
> +               return;
> +
>         printf("scanning bus %d for devices... ", bus->seq);
>         debug("\n");
>         ret = usb_scan_device(bus, 0, USB_SPEED_FULL, &dev);
> @@ -171,6 +174,7 @@ static void usb_scan_bus(struct udevice *bus, bool recurse)
>  int usb_init(void)
>  {
>         int controllers_initialized = 0;
> +       struct usb_bus_priv *priv;
>         struct udevice *bus;
>         struct uclass *uc;
>         int count = 0;
> @@ -198,15 +202,31 @@ int usb_init(void)
>                         printf("probe failed, error %d\n", ret);
>                         continue;
>                 }
> -               /*
> -                * lowlevel init is OK, now scan the bus for devices
> -                * i.e. search HUBs and configure them
> -                */
>                 controllers_initialized++;
> -               usb_scan_bus(bus, true);
>                 usb_started = true;
>         }
>
> +       /*
> +        * lowlevel init done, now scan the bus for devices i.e. search HUBs
> +        * and configure them, first scan primary controllers.
> +        */
> +       uclass_foreach_dev(bus, uc) {
> +               priv = dev_get_uclass_priv(bus);

Need to check device_active() first in case the probe failed.

Also are the companions associated with a separate device, or the same
one? I'm a bit confused...

> +               if (!priv->companion)
> +                       usb_scan_bus(bus, true);
> +       }
> +
> +       /*
> +        * Now that the primary controllers have been scanned and have handed
> +        * over any devices they do not understand to their companions, scan
> +        * the companions.
> +        */
> +       uclass_foreach_dev(bus, uc) {
> +               priv = dev_get_uclass_priv(bus);
> +               if (priv->companion)
> +                       usb_scan_bus(bus, true);
> +       }
> +
>         debug("scan end\n");
>         /* if we were not able to find at least one working bus, bail out */
>         if (!count)
> diff --git a/include/usb.h b/include/usb.h
> index 7b55844..b81e796 100644
> --- a/include/usb.h
> +++ b/include/usb.h
> @@ -608,10 +608,12 @@ struct usb_dev_platdata {
>   * @desc_before_addr:  true if we can read a device descriptor before it
>   *             has been assigned an address. For XHCI this is not possible
>   *             so this will be false.
> + * @companion:  True if this is a companion controler to another USB controller

controller

>   */
>  struct usb_bus_priv {
>         int next_addr;
>         bool desc_before_addr;
> +       bool companion;
>  };
>
>  /**
> --
> 2.3.6
>

Regards,
Simon


More information about the U-Boot mailing list