armv8: Add workaround for USB erratum A-009798
[oweals/u-boot.git] / arch / arm / cpu / armv8 / fsl-layerscape / soc.c
index b9e3a2075acca2261198bd423139c10cdd56bfea..d9d6e4fd962365420d4a3bb89ef9e2e629e47077 100644 (file)
@@ -65,6 +65,7 @@ static void erratum_a009008(void)
 {
 #ifdef CONFIG_SYS_FSL_ERRATUM_A009008
        u32 __iomem *scfg = (u32 __iomem *)SCFG_BASE;
+
 #if defined(CONFIG_ARCH_LS1043A) || defined(CONFIG_ARCH_LS1046A)
        set_usb_txvreftune(scfg, SCFG_USB3PRM1CR_USB1);
        set_usb_txvreftune(scfg, SCFG_USB3PRM1CR_USB2);
@@ -75,6 +76,27 @@ static void erratum_a009008(void)
 #endif /* CONFIG_SYS_FSL_ERRATUM_A009008 */
 }
 
+static inline void set_usb_sqrxtune(u32 __iomem *scfg, u32 offset)
+{
+       scfg_clrbits32(scfg + offset / 4,
+                       SCFG_USB_SQRXTUNE_MASK << 23);
+}
+
+static void erratum_a009798(void)
+{
+#ifdef CONFIG_SYS_FSL_ERRATUM_A009798
+       u32 __iomem *scfg = (u32 __iomem *)SCFG_BASE;
+
+#if defined(CONFIG_ARCH_LS1043A) || defined(CONFIG_ARCH_LS1046A)
+       set_usb_sqrxtune(scfg, SCFG_USB3PRM1CR_USB1);
+       set_usb_sqrxtune(scfg, SCFG_USB3PRM1CR_USB2);
+       set_usb_sqrxtune(scfg, SCFG_USB3PRM1CR_USB3);
+#elif defined(CONFIG_ARCH_LS2080A)
+       set_usb_sqrxtune(scfg, SCFG_USB3PRM1CR);
+#endif
+#endif /* CONFIG_SYS_FSL_ERRATUM_A009798 */
+}
+
 #if defined(CONFIG_FSL_LSCH3)
 /*
  * This erratum requires setting a value to eddrtqcr1 to
@@ -222,6 +244,7 @@ void fsl_lsch3_early_init_f(void)
        erratum_a008514();
        erratum_a008336();
        erratum_a009008();
+       erratum_a009798();
 #ifdef CONFIG_CHAIN_OF_TRUST
        /* In case of Secure Boot, the IBR configures the SMMU
        * to allow only Secure transactions.
@@ -501,6 +524,7 @@ void fsl_lsch2_early_init_f(void)
        erratum_a009660();
        erratum_a010539();
        erratum_a009008();
+       erratum_a009798();
 }
 #endif