usb: add support for multiple usb controllers

Allows to initialize more than one USB controller at once.

v2: print message when controller stop fails

Signed-off-by: Lucas Stach <dev@lynxeye.de>
Reviewed-by: Marek Vasut <marex@denx.de>
master
Lucas Stach 12 years ago committed by Tom Rini
parent 676ae068d9
commit 93c2582fea
  1. 16
      common/cmd_usb.c
  2. 106
      common/usb.c
  3. 2
      common/usb_storage.c
  4. 2
      drivers/usb/eth/usb_ether.c

@ -381,8 +381,7 @@ int do_usb(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
bootstage_mark_name(BOOTSTAGE_ID_USB_START, "usb_start"); bootstage_mark_name(BOOTSTAGE_ID_USB_START, "usb_start");
usb_stop(); usb_stop();
printf("(Re)start USB...\n"); printf("(Re)start USB...\n");
i = usb_init(); if (usb_init() >= 0) {
if (i >= 0) {
#ifdef CONFIG_USB_STORAGE #ifdef CONFIG_USB_STORAGE
/* try to recognize storage devices immediately */ /* try to recognize storage devices immediately */
usb_stor_curr_dev = usb_stor_scan(1); usb_stor_curr_dev = usb_stor_scan(1);
@ -391,6 +390,9 @@ int do_usb(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
/* try to recognize ethernet devices immediately */ /* try to recognize ethernet devices immediately */
usb_ether_curr_dev = usb_host_eth_scan(1); usb_ether_curr_dev = usb_host_eth_scan(1);
#endif #endif
#ifdef CONFIG_USB_KEYBOARD
drv_usb_kbd_init();
#endif
} }
return 0; return 0;
} }
@ -417,8 +419,14 @@ int do_usb(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
return 1; return 1;
} }
if (strncmp(argv[1], "tree", 4) == 0) { if (strncmp(argv[1], "tree", 4) == 0) {
printf("\nDevice Tree:\n"); puts("USB device tree:\n");
usb_show_tree(usb_get_dev_index(0)); 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; return 0;
} }
if (strncmp(argv[1], "inf", 3) == 0) { if (strncmp(argv[1], "inf", 3) == 0) {

@ -72,45 +72,72 @@
static struct usb_device usb_dev[USB_MAX_DEVICE]; static struct usb_device usb_dev[USB_MAX_DEVICE];
static int dev_index; static int dev_index;
static int running;
static int asynch_allowed; static int asynch_allowed;
char usb_started; /* flag for the started/stopped USB status */ char usb_started; /* flag for the started/stopped USB status */
void *ctrl; /* goes away in a following commit, but don't break bisect */
/********************************************************************** #ifndef CONFIG_USB_MAX_CONTROLLER_COUNT
* some forward declerations... #define CONFIG_USB_MAX_CONTROLLER_COUNT 1
*/ #endif
static void usb_scan_devices(void);
/*************************************************************************** /***************************************************************************
* Init USB Device * Init USB Device
*/ */
int usb_init(void) int usb_init(void)
{ {
int result; void *ctrl;
struct usb_device *dev;
int i, start_index = 0;
running = 0;
dev_index = 0; dev_index = 0;
asynch_allowed = 1; asynch_allowed = 1;
usb_hub_reset(); 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 */ /* init low_level USB */
printf("USB: "); for (i = 0; i < CONFIG_USB_MAX_CONTROLLER_COUNT; i++) {
result = usb_lowlevel_init(0, &ctrl); /* init low_level USB */
/* if lowlevel init is OK, scan the bus for devices printf("USB%d: ", i);
* i.e. search HUBs and configure them */ if (usb_lowlevel_init(i, &ctrl)) {
if (result == 0) { puts("lowlevel init failed\n");
printf("scanning bus for devices... "); continue;
running = 1; }
usb_scan_devices(); /*
* 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; usb_started = 1;
return 0; }
} else {
printf("Error, couldn't init Lowlevel part\n"); USB_PRINTF("scan end\n");
usb_started = 0; /* if we were not able to find at least one working bus, bail out */
if (!usb_started) {
puts("USB error: all controllers failed lowlevel init\n");
return -1; return -1;
} }
return 0;
} }
/****************************************************************************** /******************************************************************************
@ -118,15 +145,20 @@ int usb_init(void)
*/ */
int usb_stop(void) int usb_stop(void)
{ {
int res = 0; int i;
if (usb_started) { if (usb_started) {
asynch_allowed = 1; asynch_allowed = 1;
usb_started = 0; usb_started = 0;
usb_hub_reset(); usb_hub_reset();
res = usb_lowlevel_stop(0);
for (i = 0; i < CONFIG_USB_MAX_CONTROLLER_COUNT; i++) {
if (usb_lowlevel_stop(i))
printf("failed to stop USB controller %d\n", i);
}
} }
return res;
return 0;
} }
/* /*
@ -751,7 +783,6 @@ struct usb_device *usb_get_dev_index(int index)
return &usb_dev[index]; return &usb_dev[index];
} }
/* returns a pointer of a new device structure or NULL, if /* returns a pointer of a new device structure or NULL, if
* no device struct is available * no device struct is available
*/ */
@ -947,29 +978,4 @@ int usb_new_device(struct usb_device *dev)
return 0; 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 */ /* EOF */

@ -244,7 +244,7 @@ int usb_stor_scan(int mode)
struct usb_device *dev; struct usb_device *dev;
if (mode == 1) if (mode == 1)
printf(" scanning bus for storage devices... "); printf(" scanning usb for storage devices... ");
usb_disable_asynch(1); /* asynch transfer not allowed */ usb_disable_asynch(1); /* asynch transfer not allowed */

@ -123,7 +123,7 @@ int usb_host_eth_scan(int mode)
if (mode == 1) 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 */ old_async = usb_disable_asynch(1); /* asynch transfer not allowed */

Loading…
Cancel
Save