9
0
Fork 0

usb: implement a usb_host_detect to scan individual USB hosts

Currently we can only (re)scan all USB hosts. Add a function to
scan individual hosts. This is useful for implementing the detect
callback in the next patch.

Signed-off-by: Sascha Hauer <s.hauer@pengutronix.de>
This commit is contained in:
Sascha Hauer 2013-06-20 00:00:17 +02:00
parent 31879ed96f
commit 8f5889eb0a
2 changed files with 28 additions and 13 deletions

View File

@ -488,20 +488,18 @@ static struct usb_device *usb_alloc_new_device(void)
return usbdev;
}
static int scanned;
void usb_rescan(int force)
int usb_host_detect(struct usb_host *host, int force)
{
struct usb_device *dev, *tmp;
struct usb_host *host;
int ret;
if (scanned && !force)
return;
scanned = 1;
if (host->scanned && !force)
return -EBUSY;
list_for_each_entry_safe(dev, tmp, &usb_device_list, list) {
if (dev->host != host)
continue;
list_del(&dev->list);
unregister_device(&dev->dev);
if (dev->hub)
@ -511,17 +509,31 @@ void usb_rescan(int force)
free(dev);
}
ret = host->init(host);
if (ret)
return ret;
dev = usb_alloc_new_device();
dev->host = host;
usb_new_device(dev);
host->scanned = 1;
return 0;
}
void usb_rescan(int force)
{
struct usb_host *host;
int ret;
printf("USB: scanning bus for devices...\n");
dev_index = 0;
list_for_each_entry(host, &host_list, list) {
ret = host->init(host);
ret = usb_host_detect(host, force);
if (ret)
continue;
dev = usb_alloc_new_device();
dev->host = host;
usb_new_device(dev);
}
printf("%d USB Device(s) found\n", dev_index);

View File

@ -211,10 +211,13 @@ struct usb_host {
struct list_head list;
int busnum;
int scanned;
};
int usb_register_host(struct usb_host *);
int usb_host_detect(struct usb_host *host, int force);
/* Defines */
#define USB_UHCI_VEND_ID 0x8086
#define USB_UHCI_DEV_ID 0x7112