summaryrefslogtreecommitdiffstats
path: root/common
diff options
context:
space:
mode:
authorVincent Palatin <vpalatin@chromium.org>2015-05-04 11:30:54 -0600
committerSimon Glass <sjg@chromium.org>2015-05-14 18:49:33 -0600
commit08f3bb0bcd84b57cc627ab0acda8aebacf27544e (patch)
treebf28622599d080f8c11754a53a6f8387a5529177 /common
parent6a72e804a2b27e95cc7394876cc6a57f29e70817 (diff)
downloadtalos-obmc-uboot-08f3bb0bcd84b57cc627ab0acda8aebacf27544e.tar.gz
talos-obmc-uboot-08f3bb0bcd84b57cc627ab0acda8aebacf27544e.zip
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.c26
-rw-r--r--common/usb_hub.c2
2 files changed, 27 insertions, 1 deletions
diff --git a/common/usb.c b/common/usb.c
index 20c614cbcb..6283f3992c 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 af39c76f7f..be01f4f257 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,
OpenPOWER on IntegriCloud