dm: usb: Implement usb_detect_change() for driver model

Support this function with driver model also (CONFIG_DM_USB).

Signed-off-by: Simon Glass <sjg@chromium.org>
This commit is contained in:
Simon Glass 2015-05-13 07:02:23 -06:00
parent 534f9d3fef
commit 0c5dd9ae2f

View file

@ -628,6 +628,49 @@ int usb_scan_device(struct udevice *parent, int port,
return 0; return 0;
} }
/*
* Detect if a USB device has been plugged or unplugged.
*/
int usb_detect_change(void)
{
struct udevice *hub;
struct uclass *uc;
int change = 0;
int ret;
ret = uclass_get(UCLASS_USB_HUB, &uc);
if (ret)
return ret;
uclass_foreach_dev(hub, uc) {
struct usb_device *udev;
struct udevice *dev;
if (!device_active(hub))
continue;
for (device_find_first_child(hub, &dev);
dev;
device_find_next_child(&dev)) {
struct usb_port_status status;
if (!device_active(dev))
continue;
udev = dev_get_parentdata(dev);
if (usb_get_port_status(udev, udev->portnr, &status)
< 0)
/* USB request failed */
continue;
if (le16_to_cpu(status.wPortChange) &
USB_PORT_STAT_C_CONNECTION)
change++;
}
}
return change;
}
int usb_child_post_bind(struct udevice *dev) int usb_child_post_bind(struct udevice *dev)
{ {
struct usb_dev_platdata *plat = dev_get_parent_platdata(dev); struct usb_dev_platdata *plat = dev_get_parent_platdata(dev);