aboutsummaryrefslogtreecommitdiff
path: root/drivers
diff options
context:
space:
mode:
authorStephen Warren2015-08-20 17:38:05 -0600
committerMarek Vasut2015-09-07 13:41:05 +0200
commit49b4c5c700077e387fef61a7225f92d190ee0c45 (patch)
tree18454cc77d1f88d4755286c8d7397f27e07a0e8d /drivers
parent542e02ad41d2083c4a089d25962477c6f66cde9f (diff)
usb: ehci: remember init mode
When an EHCI device is registered in device mode, the HW isn't actually initialized at all, and hence isn't left in a running state. Consequently, when the device is deregistered, ehci_shutdown() will fail, since the HW bits it expects to see set in response to its shutdown requests will not be sent, and the message "EHCI failed to shut down host controller." will be printed. Fix ehci-hcd.c to remember whether the device was registered in host or device mode, and only call ehci_shutdown() for host mode registrations. Signed-off-by: Stephen Warren <swarren@nvidia.com>
Diffstat (limited to 'drivers')
-rw-r--r--drivers/usb/host/ehci-hcd.c7
-rw-r--r--drivers/usb/host/ehci.h1
2 files changed, 7 insertions, 1 deletions
diff --git a/drivers/usb/host/ehci-hcd.c b/drivers/usb/host/ehci-hcd.c
index 3a0d32ee2ba..88b670b7f8a 100644
--- a/drivers/usb/host/ehci-hcd.c
+++ b/drivers/usb/host/ehci-hcd.c
@@ -1645,8 +1645,10 @@ int ehci_register(struct udevice *dev, struct ehci_hccr *hccr,
ctrl->hcor = hcor;
ctrl->priv = ctrl;
- if (init == USB_INIT_DEVICE)
+ ctrl->init = init;
+ if (ctrl->init == USB_INIT_DEVICE)
goto done;
+
ret = ehci_reset(ctrl);
if (ret)
goto err;
@@ -1666,6 +1668,9 @@ int ehci_deregister(struct udevice *dev)
{
struct ehci_ctrl *ctrl = dev_get_priv(dev);
+ if (ctrl->init == USB_INIT_DEVICE)
+ return 0;
+
ehci_shutdown(ctrl);
return 0;
diff --git a/drivers/usb/host/ehci.h b/drivers/usb/host/ehci.h
index 3379c293c4d..b41c04a8b30 100644
--- a/drivers/usb/host/ehci.h
+++ b/drivers/usb/host/ehci.h
@@ -242,6 +242,7 @@ struct ehci_ops {
};
struct ehci_ctrl {
+ enum usb_init_type init;
struct ehci_hccr *hccr; /* R/O registers, not need for volatile */
struct ehci_hcor *hcor;
int rootdev;