]> git.sur5r.net Git - u-boot/blobdiff - drivers/usb/host/ehci-mx6.c
usb: ehci-mx6: allow board_ehci_hcd_init to fail
[u-boot] / drivers / usb / host / ehci-mx6.c
index 2666351391431e091a761fb92f7879777bde2625..bb48d0dea0a5849cbeb99412980bb74ef605ceb7 100644 (file)
@@ -8,8 +8,9 @@
 #include <common.h>
 #include <usb.h>
 #include <errno.h>
+#include <wait_bit.h>
 #include <linux/compiler.h>
-#include <usb/ehci-fsl.h>
+#include <usb/ehci-ci.h>
 #include <asm/io.h>
 #include <asm/arch/imx-regs.h>
 #include <asm/arch/clock.h>
@@ -117,32 +118,6 @@ static void usb_power_config(int index)
                     pll_480_ctrl_set);
 }
 
-static int wait_for_bit(u32 *reg, const u32 mask, bool set)
-{
-       u32 val;
-       const unsigned int timeout = 10000;
-       unsigned long start = get_timer(0);
-
-       while(1) {
-               val = readl(reg);
-               if (!set)
-                       val = ~val;
-
-               if ((val & mask) == mask)
-                       return 0;
-
-               if (get_timer(start) > timeout)
-                       break;
-
-               udelay(1);
-       }
-
-       debug("%s: Timeout (reg=%p mask=%08x wait_set=%i)\n",
-                       __func__, reg, mask, set);
-
-       return -ETIMEDOUT;
-}
-
 /* Return 0 : host node, <>0 : device mode */
 static int usb_phy_enable(int index, struct usb_ehci *ehci)
 {
@@ -160,12 +135,13 @@ static int usb_phy_enable(int index, struct usb_ehci *ehci)
 
        /* Stop then Reset */
        clrbits_le32(usb_cmd, UCMD_RUN_STOP);
-       ret = wait_for_bit(usb_cmd, UCMD_RUN_STOP, 0);
+       ret = wait_for_bit(__func__, usb_cmd, UCMD_RUN_STOP, false, 10000,
+                          false);
        if (ret)
                return ret;
 
        setbits_le32(usb_cmd, UCMD_RESET);
-       ret = wait_for_bit(usb_cmd, UCMD_RESET, 0);
+       ret = wait_for_bit(__func__, usb_cmd, UCMD_RESET, false, 10000, false);
        if (ret)
                return ret;
 
@@ -278,7 +254,7 @@ static void usb_oc_config(int index)
 }
 
 /**
- * board_ehci_hcd_init - override usb phy mode
+ * board_usb_phy_mode - override usb phy mode
  * @port:      usb host/otg port
  *
  * Target board specific, override usb_phy_mode.
@@ -334,6 +310,7 @@ int ehci_hcd_init(int index, enum usb_init_type init,
 #endif
        struct usb_ehci *ehci = (struct usb_ehci *)(USB_BASE_ADDR +
                (controller_spacing * index));
+       int ret;
 
        if (index > 3)
                return -EINVAL;
@@ -341,7 +318,9 @@ int ehci_hcd_init(int index, enum usb_init_type init,
        mdelay(1);
 
        /* Do board specific initialization */
-       board_ehci_hcd_init(index);
+       ret = board_ehci_hcd_init(index);
+       if (ret)
+               return ret;
 
        usb_power_config(index);
        usb_oc_config(index);