]> git.kernelconcepts.de Git - karo-tx-uboot.git/commitdiff
fsl/usb: Workaround for USB erratum-A007075
authorNikhil Badola <nikhil.badola@freescale.com>
Wed, 26 Feb 2014 12:13:15 +0000 (17:43 +0530)
committerYork Sun <yorksun@freescale.com>
Wed, 23 Apr 2014 00:58:48 +0000 (17:58 -0700)
Put a delay of 5 millisecond after reset so that ULPI phy
gets enough time to come out of reset. Erratum A007075 applies
to following SOCs and their variants, if any
        P1010 rev 1.0
        B4860 rev 1.0, 2.0
        P4080 rev 2.0, 3.0

Signed-off-by: Nikhil Badola <nikhil.badola@freescale.com>
Reviewed-by: York Sun <yorksun@freescale.com>
arch/powerpc/cpu/mpc85xx/cmd_errata.c
arch/powerpc/include/asm/config_mpc85xx.h
arch/powerpc/include/asm/fsl_errata.h
drivers/usb/host/ehci-fsl.c

index 8b79c05b1f2dc945a7fc662a5e9a4bab45938847..ee063fd8e94865d9b3e91c29fc2af40947679e07 100644 (file)
@@ -268,6 +268,10 @@ static int do_errata(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
 #ifdef CONFIG_SYS_FSL_ERRATUM_A005125
        puts("Work-around for Erratum A005125 enabled\n");
 #endif
+#ifdef CONFIG_SYS_FSL_ERRATUM_A007075
+       if (has_erratum_a007075())
+               puts("Work-around for Erratum A007075 enabled\n");
+#endif
 #ifdef CONFIG_SYS_FSL_ERRATUM_I2C_A004447
        if ((SVR_SOC_VER(svr) == SVR_8548 && IS_SVR_REV(svr, 3, 1)) ||
            (SVR_REV(svr) <= CONFIG_SYS_FSL_A004447_SVR_REV))
index fe68e0e28086a2c5ad3a4ca26052dba05552921c..502e7ccf25df5171e7349dc66612255695bae0fa 100644 (file)
 #define CONFIG_SYS_FSL_ERRATUM_IFC_A003399
 #define CONFIG_SYS_FSL_ERRATUM_A005125
 #define CONFIG_SYS_FSL_ERRATUM_I2C_A004447
+#define CONFIG_SYS_FSL_ERRATUM_A007075
 #define CONFIG_SYS_FSL_ERRATUM_A006261
 #define CONFIG_SYS_FSL_A004447_SVR_REV 0x10
 #define CONFIG_ESDHC_HC_BLK_ADDR
 #define CONFIG_SYS_P4080_ERRATUM_PCIE_A003
 #define CONFIG_SYS_FSL_ERRATUM_A005812
 #define CONFIG_SYS_FSL_ERRATUM_I2C_A004447
+#define CONFIG_SYS_FSL_ERRATUM_A007075
 #define CONFIG_SYS_FSL_A004447_SVR_REV 0x20
 
 #elif defined(CONFIG_PPC_P5020) /* also supports P5010 */
 #define CONFIG_SYS_FSL_ERRATUM_A005871
 #define CONFIG_SYS_FSL_ERRATUM_A006379
 #define CONFIG_SYS_FSL_ERRATUM_A006593
+#define CONFIG_SYS_FSL_ERRATUM_A007075
 #define CONFIG_SYS_FSL_ERRATUM_A006475
 #define CONFIG_SYS_FSL_ERRATUM_A006384
 #define CONFIG_SYS_CCSRBAR_DEFAULT     0xfe000000
index c9982cc8ec49486cf14c3ed786cac48f46d4c17f..4eba85cc3475b9fabca873981e9b1a81eafd95f3 100644 (file)
@@ -60,4 +60,20 @@ static inline bool has_erratum_a006261(void)
 }
 #endif
 
+static inline bool has_erratum_a007075(void)
+{
+       u32 svr = get_svr();
+       u32 soc = SVR_SOC_VER(svr);
+
+       switch (soc) {
+       case SVR_B4860:
+       case SVR_B4420:
+               return IS_SVR_REV(svr, 1, 0) || IS_SVR_REV(svr, 2, 0);
+       case SVR_P1010:
+               return IS_SVR_REV(svr, 1, 0);
+       case SVR_P4080:
+               return IS_SVR_REV(svr, 2, 0) || IS_SVR_REV(svr, 3, 0);
+       }
+       return false;
+}
 #endif
index 3fd9e13af8ae1877bfe448e1b2feff61e2792e4d..1d012db92e6ff2cb2618321c550e70f6aa9f7177 100644 (file)
@@ -14,6 +14,7 @@
 #include <asm/io.h>
 #include <usb/ehci-fsl.h>
 #include <hwconfig.h>
+#include <asm/fsl_errata.h>
 
 #include "ehci.h"
 
@@ -47,6 +48,15 @@ int ehci_hcd_init(int index, enum usb_init_type init,
 
        usb_phy[0] = '\0';
 #endif
+       if (has_erratum_a007075()) {
+               /*
+                * A 5ms delay is needed after applying soft-reset to the
+                * controller to let external ULPI phy come out of reset.
+                * This delay needs to be added before re-initializing
+                * the controller after soft-resetting completes
+                */
+               mdelay(5);
+       }
        memset(current_usb_controller, '\0', 5);
        snprintf(current_usb_controller, 4, "usb%d", index+1);