@@ -20,6 +20,7 @@
#include <dm.h>
#include <asm/mach-types.h>
#include <power/regulator.h>
+#include <linux/iopoll.h>
#include <linux/usb/otg.h>
#include "ehci.h"
@@ -267,6 +268,21 @@ int usb_phy_mode(int port)
}
#endif
+static void ehci_mx6_powerup_fixup(struct ehci_ctrl *ctrl, uint32_t *status_reg,
+ uint32_t *reg)
+{
+ u32 result;
+ int ret;
+
+ mdelay(50);
+
+ ret = read_poll_timeout(ehci_readl, status_reg, result, !(result & EHCI_PS_PR), 5, 2000);
+ if (ret)
+ printf("%s timeout\n", __func__);
+
+ *reg = ehci_readl(status_reg);
+}
+
static void usb_oc_config(int index)
{
#if defined(CONFIG_MX6)
@@ -366,6 +382,10 @@ int ehci_mx6_common_init(struct usb_ehci *ehci, int index)
}
#if !CONFIG_IS_ENABLED(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)
{
@@ -394,6 +414,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) {
@@ -467,7 +489,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)