From: Lucas Stach <dev@lynxeye.de>
To: u-boot@lists.denx.de
Subject: [U-Boot] [PATCH 4/4] usb: add support for multiple usb controllers
Date: Thu, 30 Aug 2012 18:03:24 +0200 [thread overview]
Message-ID: <1346342604-13355-5-git-send-email-dev@lynxeye.de> (raw)
In-Reply-To: <1346342604-13355-1-git-send-email-dev@lynxeye.de>
Allows to initialize more than one USB controller at once.
Signed-off-by: Lucas Stach <dev@lynxeye.de>
---
common/cmd_usb.c | 16 +++++--
common/usb.c | 104 +++++++++++++++++++++++---------------------
common/usb_storage.c | 2 +-
drivers/usb/eth/usb_ether.c | 2 +-
4 Dateien ge?ndert, 68 Zeilen hinzugef?gt(+), 56 Zeilen entfernt(-)
diff --git a/common/cmd_usb.c b/common/cmd_usb.c
index a8e3ae5..6cefc0c 100644
--- a/common/cmd_usb.c
+++ b/common/cmd_usb.c
@@ -517,8 +517,7 @@ int do_usb(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
bootstage_mark_name(BOOTSTAGE_ID_USB_START, "usb_start");
usb_stop();
printf("(Re)start USB...\n");
- i = usb_init();
- if (i >= 0) {
+ if (usb_init() >= 0) {
#ifdef CONFIG_USB_STORAGE
/* try to recognize storage devices immediately */
usb_stor_curr_dev = usb_stor_scan(1);
@@ -527,6 +526,9 @@ int do_usb(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
/* try to recognize ethernet devices immediately */
usb_ether_curr_dev = usb_host_eth_scan(1);
#endif
+#ifdef CONFIG_USB_KEYBOARD
+ drv_usb_kbd_init();
+#endif
}
return 0;
}
@@ -553,8 +555,14 @@ int do_usb(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
return 1;
}
if (strncmp(argv[1], "tree", 4) == 0) {
- printf("\nDevice Tree:\n");
- usb_show_tree(usb_get_dev_index(0));
+ puts("USB device tree:\n");
+ for (i = 0; i < USB_MAX_DEVICE; i++) {
+ dev = usb_get_dev_index(i);
+ if (dev == NULL)
+ break;
+ if (dev->parent == NULL)
+ usb_show_tree(dev);
+ }
return 0;
}
if (strncmp(argv[1], "inf", 3) == 0) {
diff --git a/common/usb.c b/common/usb.c
index e58b6f4..78a410d 100644
--- a/common/usb.c
+++ b/common/usb.c
@@ -72,45 +72,72 @@
static struct usb_device usb_dev[USB_MAX_DEVICE];
static int dev_index;
-static int running;
static int asynch_allowed;
char usb_started; /* flag for the started/stopped USB status */
-void *ctrl; /* goes away in a following commit, but don't break bisect */
-/**********************************************************************
- * some forward declerations...
- */
-static void usb_scan_devices(void);
+#ifndef CONFIG_USB_MAX_CONTROLLER_COUNT
+#define CONFIG_USB_MAX_CONTROLLER_COUNT 1
+#endif
/***************************************************************************
* Init USB Device
*/
-
int usb_init(void)
{
- int result;
+ void *ctrl;
+ struct usb_device *dev;
+ int i, start_index = 0;
- running = 0;
dev_index = 0;
asynch_allowed = 1;
usb_hub_reset();
+
+ /* first make all devices unknown */
+ for (i = 0; i < USB_MAX_DEVICE; i++) {
+ memset(&usb_dev[i], 0, sizeof(struct usb_device));
+ usb_dev[i].devnum = -1;
+ }
+
/* init low_level USB */
- printf("USB: ");
- result = usb_lowlevel_init(0, &ctrl);
- /* if lowlevel init is OK, scan the bus for devices
- * i.e. search HUBs and configure them */
- if (result == 0) {
- printf("scanning bus for devices... ");
- running = 1;
- usb_scan_devices();
+ for (i = 0; i < CONFIG_USB_MAX_CONTROLLER_COUNT; i++) {
+ /* init low_level USB */
+ printf("USB%d: ", i);
+ if (usb_lowlevel_init(i, &ctrl)) {
+ puts("lowlevel init failed\n");
+ continue;
+ }
+ /*
+ * lowlevel init is OK, now scan the bus for devices
+ * i.e. search HUBs and configure them
+ */
+ start_index = dev_index;
+ printf("scanning bus %d for devices... ", i);
+ dev = usb_alloc_new_device(ctrl);
+ /*
+ * device 0 is always present
+ * (root hub, so let it analyze)
+ */
+ if (dev)
+ usb_new_device(dev);
+
+ if (start_index == dev_index)
+ puts("No USB Device found\n");
+ else
+ printf("%d USB Device(s) found\n",
+ dev_index - start_index);
+
usb_started = 1;
- return 0;
- } else {
- printf("Error, couldn't init Lowlevel part\n");
- usb_started = 0;
+ }
+
+ USB_PRINTF("scan end\n");
+ /* if we were not able to find@least one working bus, bail out */
+ if (!usb_started) {
+ puts("USB error: all controllers failed lowlevel init\n");
return -1;
}
+
+ return 0;
}
/******************************************************************************
@@ -118,15 +145,18 @@ int usb_init(void)
*/
int usb_stop(void)
{
- int res = 0;
+ int i;
if (usb_started) {
asynch_allowed = 1;
usb_started = 0;
usb_hub_reset();
- res = usb_lowlevel_stop(0);
+
+ for (i = 0; i < CONFIG_USB_MAX_CONTROLLER_COUNT; i++)
+ usb_lowlevel_stop(i);
}
- return res;
+
+ return 0;
}
/*
@@ -751,7 +781,6 @@ struct usb_device *usb_get_dev_index(int index)
return &usb_dev[index];
}
-
/* returns a pointer of a new device structure or NULL, if
* no device struct is available
*/
@@ -947,29 +976,4 @@ int usb_new_device(struct usb_device *dev)
return 0;
}
-/* build device Tree */
-static void usb_scan_devices(void)
-{
- int i;
- struct usb_device *dev;
-
- /* first make all devices unknown */
- for (i = 0; i < USB_MAX_DEVICE; i++) {
- memset(&usb_dev[i], 0, sizeof(struct usb_device));
- usb_dev[i].devnum = -1;
- }
- dev_index = 0;
- /* device 0 is always present (root hub, so let it analyze) */
- dev = usb_alloc_new_device(ctrl);
- if (usb_new_device(dev))
- printf("No USB Device found\n");
- else
- printf("%d USB Device(s) found\n", dev_index);
- /* insert "driver" if possible */
-#ifdef CONFIG_USB_KEYBOARD
- drv_usb_kbd_init();
-#endif
- USB_PRINTF("scan end\n");
-}
-
/* EOF */
diff --git a/common/usb_storage.c b/common/usb_storage.c
index 4aeed82..950451e 100644
--- a/common/usb_storage.c
+++ b/common/usb_storage.c
@@ -244,7 +244,7 @@ int usb_stor_scan(int mode)
struct usb_device *dev;
if (mode == 1)
- printf(" scanning bus for storage devices... ");
+ printf(" scanning usb for storage devices... ");
usb_disable_asynch(1); /* asynch transfer not allowed */
diff --git a/drivers/usb/eth/usb_ether.c b/drivers/usb/eth/usb_ether.c
index 6cad6c8..f361e8b 100644
--- a/drivers/usb/eth/usb_ether.c
+++ b/drivers/usb/eth/usb_ether.c
@@ -123,7 +123,7 @@ int usb_host_eth_scan(int mode)
if (mode == 1)
- printf(" scanning bus for ethernet devices... ");
+ printf(" scanning usb for ethernet devices... ");
old_async = usb_disable_asynch(1); /* asynch transfer not allowed */
--
1.7.11.4
next prev parent reply other threads:[~2012-08-30 16:03 UTC|newest]
Thread overview: 17+ messages / expand[flat|nested] mbox.gz Atom feed top
2012-08-30 16:03 [U-Boot] [PATCH 0/4] USB multi controller Lucas Stach
2012-08-30 16:03 ` [U-Boot] [PATCH 1/4] usb: lowlevel interface change to support multiple controllers Lucas Stach
2012-08-30 21:03 ` Marek Vasut
2012-08-30 16:03 ` [U-Boot] [PATCH 2/4] usb: ehci: rework to take advantage of new lowlevel interface Lucas Stach
2012-08-30 21:09 ` Marek Vasut
2012-08-30 21:51 ` Lucas Stach
2012-08-30 21:55 ` Marek Vasut
2012-08-30 16:03 ` [U-Boot] [PATCH 3/4] tegra20: port to new ehci interface Lucas Stach
2012-08-30 16:03 ` Lucas Stach [this message]
2012-08-30 21:12 ` [U-Boot] [PATCH 4/4] usb: add support for multiple usb controllers Marek Vasut
2012-09-04 23:05 ` [U-Boot] [PATCH 0/4] USB multi controller Stephen Warren
2012-09-05 0:30 ` Marek Vasut
2012-09-05 6:21 ` Lucas Stach
2012-09-05 6:30 ` Marek Vasut
2012-09-05 19:11 ` Stephen Warren
2012-09-05 19:27 ` Marek Vasut
2012-09-05 22:13 ` Lucas Stach
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=1346342604-13355-5-git-send-email-dev@lynxeye.de \
--to=dev@lynxeye.de \
--cc=u-boot@lists.denx.de \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.