mirror of
https://github.com/Fishwaldo/u-boot.git
synced 2025-03-28 18:11:33 +00:00
usb: Do not power-cycle usb devices on init
Do as the Linux kernel does and power on any ports which are not yet one, this is enough. Signed-off-by: Hans de Goede <hdegoede@redhat.com>
This commit is contained in:
parent
f7b9baf755
commit
0834bb2fb0
1 changed files with 0 additions and 39 deletions
|
@ -86,49 +86,10 @@ static void usb_hub_power_on(struct usb_hub_device *hub)
|
||||||
int i;
|
int i;
|
||||||
struct usb_device *dev;
|
struct usb_device *dev;
|
||||||
unsigned pgood_delay = hub->desc.bPwrOn2PwrGood * 2;
|
unsigned pgood_delay = hub->desc.bPwrOn2PwrGood * 2;
|
||||||
ALLOC_CACHE_ALIGN_BUFFER(struct usb_port_status, portsts, 1);
|
|
||||||
unsigned short portstatus;
|
|
||||||
int ret;
|
|
||||||
|
|
||||||
dev = hub->pusb_dev;
|
dev = hub->pusb_dev;
|
||||||
|
|
||||||
/*
|
|
||||||
* Enable power to the ports:
|
|
||||||
* Here we Power-cycle the ports: aka,
|
|
||||||
* turning them off and turning on again.
|
|
||||||
*/
|
|
||||||
debug("enabling power on all ports\n");
|
debug("enabling power on all ports\n");
|
||||||
for (i = 0; i < dev->maxchild; i++) {
|
|
||||||
usb_clear_port_feature(dev, i + 1, USB_PORT_FEAT_POWER);
|
|
||||||
debug("port %d returns %lX\n", i + 1, dev->status);
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Wait at least 2*bPwrOn2PwrGood for PP to change */
|
|
||||||
mdelay(pgood_delay);
|
|
||||||
|
|
||||||
for (i = 0; i < dev->maxchild; i++) {
|
|
||||||
ret = usb_get_port_status(dev, i + 1, portsts);
|
|
||||||
if (ret < 0) {
|
|
||||||
debug("port %d: get_port_status failed\n", i + 1);
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Check to confirm the state of Port Power:
|
|
||||||
* xHCI says "After modifying PP, s/w shall read
|
|
||||||
* PP and confirm that it has reached the desired state
|
|
||||||
* before modifying it again, undefined behavior may occur
|
|
||||||
* if this procedure is not followed".
|
|
||||||
* EHCI doesn't say anything like this, but no harm in keeping
|
|
||||||
* this.
|
|
||||||
*/
|
|
||||||
portstatus = le16_to_cpu(portsts->wPortStatus);
|
|
||||||
if (portstatus & (USB_PORT_STAT_POWER << 1)) {
|
|
||||||
debug("port %d: Port power change failed\n", i + 1);
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
for (i = 0; i < dev->maxchild; i++) {
|
for (i = 0; i < dev->maxchild; i++) {
|
||||||
usb_set_port_feature(dev, i + 1, USB_PORT_FEAT_POWER);
|
usb_set_port_feature(dev, i + 1, USB_PORT_FEAT_POWER);
|
||||||
debug("port %d returns %lX\n", i + 1, dev->status);
|
debug("port %d returns %lX\n", i + 1, dev->status);
|
||||||
|
|
Loading…
Add table
Reference in a new issue