]> 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 54f868420d55af335df8341a74c9b9a42942fb9e..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>
@@ -123,6 +124,7 @@ static int usb_phy_enable(int index, struct usb_ehci *ehci)
        void __iomem *phy_reg;
        void __iomem *phy_ctrl;
        void __iomem *usb_cmd;
+       int ret;
 
        if (index >= ARRAY_SIZE(phy_bases))
                return 0;
@@ -133,12 +135,15 @@ static int usb_phy_enable(int index, struct usb_ehci *ehci)
 
        /* Stop then Reset */
        clrbits_le32(usb_cmd, UCMD_RUN_STOP);
-       while (readl(usb_cmd) & UCMD_RUN_STOP)
-               ;
+       ret = wait_for_bit(__func__, usb_cmd, UCMD_RUN_STOP, false, 10000,
+                          false);
+       if (ret)
+               return ret;
 
        setbits_le32(usb_cmd, UCMD_RESET);
-       while (readl(usb_cmd) & UCMD_RESET)
-               ;
+       ret = wait_for_bit(__func__, usb_cmd, UCMD_RESET, false, 10000, false);
+       if (ret)
+               return ret;
 
        /* Reset USBPHY module */
        setbits_le32(phy_ctrl, USBPHY_CTRL_SFTRST);
@@ -249,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.
@@ -305,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;
@@ -312,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);