|
|
|
@ -628,6 +628,49 @@ int usb_scan_device(struct udevice *parent, int port, |
|
|
|
|
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) |
|
|
|
|
{ |
|
|
|
|
struct usb_dev_platdata *plat = dev_get_parent_platdata(dev); |
|
|
|
|