summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--drivers/usb/host/ehci-mx6.c28
1 files changed, 27 insertions, 1 deletions
diff --git a/drivers/usb/host/ehci-mx6.c b/drivers/usb/host/ehci-mx6.c
index 969e44a..ffe702b 100644
--- a/drivers/usb/host/ehci-mx6.c
+++ b/drivers/usb/host/ehci-mx6.c
@@ -266,6 +266,25 @@ int usb_phy_mode(int port)
}
#endif
+static void ehci_mx6_powerup_fixup(struct ehci_ctrl *ctrl, uint32_t *status_reg,
+ uint32_t *reg)
+{
+ uint32_t result;
+ int usec = 2000;
+
+ mdelay(50);
+
+ do {
+ result = ehci_readl(status_reg);
+ udelay(5);
+ if (!(result & EHCI_PS_PR))
+ break;
+ usec--;
+ } while (usec > 0);
+
+ *reg = ehci_readl(status_reg);
+}
+
static void usb_oc_config(int index)
{
#if defined(CONFIG_MX6)
@@ -365,6 +384,10 @@ int ehci_mx6_common_init(struct usb_ehci *ehci, int index)
}
#ifndef CONFIG_DM_USB
+static const struct ehci_ops mx6_ehci_ops = {
+ .powerup_fixup = ehci_mx6_powerup_fixup,
+};
+
int ehci_hcd_init(int index, enum usb_init_type init,
struct ehci_hccr **hccr, struct ehci_hcor **hcor)
{
@@ -392,6 +415,8 @@ int ehci_hcd_init(int index, enum usb_init_type init,
if (ret)
return ret;
+ ehci_set_controller_priv(index, NULL, &mx6_ehci_ops);
+
type = board_usb_phy_mode(index);
if (hccr && hcor) {
@@ -463,7 +488,8 @@ static int mx6_init_after_reset(struct ehci_ctrl *dev)
}
static const struct ehci_ops mx6_ehci_ops = {
- .init_after_reset = mx6_init_after_reset
+ .powerup_fixup = ehci_mx6_powerup_fixup,
+ .init_after_reset = mx6_init_after_reset
};
static int ehci_usb_phy_mode(struct udevice *dev)