dm: usb: Support driver model with USB keyboards
authorSimon Glass <sjg@chromium.org>
Wed, 25 Mar 2015 18:22:34 +0000 (12:22 -0600)
committerSimon Glass <sjg@chromium.org>
Sat, 18 Apr 2015 17:11:25 +0000 (11:11 -0600)
Allow USB keyboards to work with driver model. The main difference is that
we can have multiple buses (each with its own device numbering) and each
bus must be scanned.

Signed-off-by: Simon Glass <sjg@chromium.org>
Reviewed-by: Marek Vasut <marex@denx.de>
common/usb_kbd.c

index e02529fca4b1657ff109bf984d358d7cd085562a..24a1a5614118d2140ca5b225180a3ab2eadb18f9 100644 (file)
@@ -8,6 +8,7 @@
  * SPDX-License-Identifier:    GPL-2.0+
  */
 #include <common.h>
+#include <dm.h>
 #include <errno.h>
 #include <malloc.h>
 #include <stdio_dev.h>
@@ -520,7 +521,37 @@ int drv_usb_kbd_init(void)
 {
        int error, i;
 
-       debug("%s: Probing for keyboard\n", __func__);/* Scan all USB Devices */
+       debug("%s: Probing for keyboard\n", __func__);
+#ifdef CONFIG_DM_USB
+       /*
+        * TODO: We should add USB_DEVICE() declarations to each USB ethernet
+        * driver and then most of this file can be removed.
+        */
+       struct udevice *bus;
+       struct uclass *uc;
+       int ret;
+
+       ret = uclass_get(UCLASS_USB, &uc);
+       if (ret)
+               return ret;
+       uclass_foreach_dev(bus, uc) {
+               for (i = 0; i < USB_MAX_DEVICE; i++) {
+                       struct usb_device *dev;
+
+                       dev = usb_get_dev_index(bus, i); /* get device */
+                       debug("i=%d, %p\n", i, dev);
+                       if (!dev)
+                               break; /* no more devices available */
+
+                       error = probe_usb_keyboard(dev);
+                       if (!error)
+                               return 1;
+                       if (error && error != -ENOENT)
+                               return error;
+               } /* for */
+       }
+#else
+       /* Scan all USB Devices */
        for (i = 0; i < USB_MAX_DEVICE; i++) {
                struct usb_device *dev;
 
@@ -538,6 +569,7 @@ int drv_usb_kbd_init(void)
                if (error && error != -ENOENT)
                        return error;
        }
+#endif
 
        /* No USB Keyboard found */
        return -1;