diff options
author | Vincent Palatin <vpalatin@chromium.org> | 2015-05-04 17:30:54 (GMT) |
---|---|---|
committer | Simon Glass <sjg@chromium.org> | 2015-05-15 00:49:33 (GMT) |
commit | 08f3bb0bcd84b57cc627ab0acda8aebacf27544e (patch) | |
tree | bf28622599d080f8c11754a53a6f8387a5529177 /common | |
parent | 6a72e804a2b27e95cc7394876cc6a57f29e70817 (diff) | |
download | u-boot-08f3bb0bcd84b57cc627ab0acda8aebacf27544e.tar.xz |
usb: add device connection/disconnection detection
Provide a function to detect USB device insertion/removal in order to
avoid having to do USB enumeration in a tight loop when trying to detect
peripheral hotplugging.
Signed-off-by: Vincent Palatin <vpalatin@chromium.org>
Reviewed-by: Stefan Reinauer <reinauer@chromium.org>
Tested-by: Stefan Reinauer <reinauer@chromium.org>
Signed-off-by: Simon Glass <sjg@chromium.org>
Diffstat (limited to 'common')
-rw-r--r-- | common/usb.c | 26 | ||||
-rw-r--r-- | common/usb_hub.c | 2 |
2 files changed, 27 insertions, 1 deletions
diff --git a/common/usb.c b/common/usb.c index 20c614c..6283f39 100644 --- a/common/usb.c +++ b/common/usb.c @@ -148,6 +148,32 @@ int usb_stop(void) return 0; } +/****************************************************************************** + * Detect if a USB device has been plugged or unplugged. + */ +int usb_detect_change(void) +{ + int i, j; + int change = 0; + + for (j = 0; j < USB_MAX_DEVICE; j++) { + for (i = 0; i < usb_dev[j].maxchild; i++) { + struct usb_port_status status; + + if (usb_get_port_status(&usb_dev[j], i + 1, + &status) < 0) + /* USB request failed */ + continue; + + if (le16_to_cpu(status.wPortChange) & + USB_PORT_STAT_C_CONNECTION) + change++; + } + } + + return change; +} + /* * disables the asynch behaviour of the control message. This is used for data * transfers that uses the exclusiv access to the control and bulk messages. diff --git a/common/usb_hub.c b/common/usb_hub.c index af39c76..be01f4f 100644 --- a/common/usb_hub.c +++ b/common/usb_hub.c @@ -79,7 +79,7 @@ static int usb_get_hub_status(struct usb_device *dev, void *data) data, sizeof(struct usb_hub_status), USB_CNTL_TIMEOUT); } -static int usb_get_port_status(struct usb_device *dev, int port, void *data) +int usb_get_port_status(struct usb_device *dev, int port, void *data) { return usb_control_msg(dev, usb_rcvctrlpipe(dev, 0), USB_REQ_GET_STATUS, USB_DIR_IN | USB_RT_PORT, 0, port, |