[U-Boot] [PATCH 3/5] dm: usb: Do not scan companion busses if no devices where handed over

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


Hi Hans,

On 5 May 2015 at 07:28, Hans de Goede <hdegoede at redhat.com> wrote:
> USB scanning is slow, and there is no need to scan the companion busses
> if no usb devices where handed over to the companinon controllers by any
> of the main controllers.
>
> This saves e.g. 2 seconds when booting a A10 OLinuxIno Lime with no USB-1
> devices plugged into the root usb ports.
>
> The use of a global variable for the companion handover counting is somewhat
> unfortunate, but we do not have the necessary info to link companions and
> main controllers together in devicetree, and since this is just an
> optimization adding a custom devicetree extenstion for this seems undesirable.
>
> Signed-off-by: Hans de Goede <hdegoede at redhat.com>
> ---
>  common/usb.c                  |  2 ++
>  drivers/usb/host/usb-uclass.c | 12 +++++++-----
>  include/usb.h                 |  3 +++
>  3 files changed, 12 insertions(+), 5 deletions(-)
>
> diff --git a/common/usb.c b/common/usb.c
> index 1b26bfa..4a09583 100644
> --- a/common/usb.c
> +++ b/common/usb.c
> @@ -44,6 +44,8 @@
>
>  static int asynch_allowed;
>  char usb_started; /* flag for the started/stopped USB status */
> +/* Tracks how much devices were handed over to companion controllers */
> +int usb_companion_device_count;
>
>  #ifndef CONFIG_DM_USB
>  static struct usb_device usb_dev[USB_MAX_DEVICE];
> diff --git a/drivers/usb/host/usb-uclass.c b/drivers/usb/host/usb-uclass.c
> index d745c1c..877d307 100644
> --- a/drivers/usb/host/usb-uclass.c
> +++ b/drivers/usb/host/usb-uclass.c
> @@ -219,12 +219,14 @@ int usb_init(void)
>         /*
>          * Now that the primary controllers have been scanned and have handed
>          * over any devices they do not understand to their companions, scan
> -        * the companions.
> +        * the companions if necessary.
>          */
> -       uclass_foreach_dev(bus, uc) {
> -               priv = dev_get_uclass_priv(bus);
> -               if (priv->companion)
> -                       usb_scan_bus(bus, true);
> +       if (usb_companion_device_count) {
> +               uclass_foreach_dev(bus, uc) {
> +                       priv = dev_get_uclass_priv(bus);
> +                       if (priv->companion)
> +                               usb_scan_bus(bus, true);
> +               }
>         }
>
>         debug("scan end\n");
> diff --git a/include/usb.h b/include/usb.h
> index b81e796..d4c9f44 100644
> --- a/include/usb.h
> +++ b/include/usb.h
> @@ -171,6 +171,9 @@ enum usb_init_type {
>   * this is how the lowlevel part communicate with the outer world
>   */
>
> +/* Tracks how much devices were handed over to companion controllers */
> +extern int usb_companion_device_count;

Not keen on a global.

Could this be a per-bus value, and go in the controller's private
data? If not, uclass private data?

> +
>  #if defined(CONFIG_USB_UHCI) || defined(CONFIG_USB_OHCI) || \
>         defined(CONFIG_USB_EHCI) || defined(CONFIG_USB_OHCI_NEW) || \
>         defined(CONFIG_USB_SL811HS) || defined(CONFIG_USB_ISP116X_HCD) || \
> --
> 2.3.6
>

Regards,
Simon


More information about the U-Boot mailing list