usb: xhci: fsl: Add workaround for USB erratum A008751
authorSriram Dash <sriram.dash@nxp.com>
Mon, 13 Jun 2016 04:28:36 +0000 (09:58 +0530)
committerMarek Vasut <marex@denx.de>
Mon, 13 Jun 2016 13:16:46 +0000 (15:16 +0200)
This patch is doing the following:
1. Implementing the errata for LS2080.
2. Adding fixup for fdt for LS2080.

Signed-off-by: Sriram Dash <sriram.dash@nxp.com>
Signed-off-by: Rajesh Bhagat <rajesh.bhagat@nxp.com>
arch/arm/include/asm/arch-fsl-layerscape/immap_lsch3.h
board/freescale/ls2080aqds/ls2080aqds.c
board/freescale/ls2080ardb/ls2080ardb.c
drivers/usb/common/fsl-dt-fixup.c
drivers/usb/common/fsl-errata.c
drivers/usb/host/xhci-fsl.c
include/fsl_usb.h

index e48bbaf7f425072235476bd29131e3369483cba5..9b60bd310a6ae8e4cf7205ca43a46fd64b4c5b99 100644 (file)
 /* Supplemental Configuration */
 #define SCFG_BASE              0x01fc0000
 #define SCFG_USB3PRM1CR                        0x000
+#define SCFG_USB3PRM1CR_INIT           0x27672b2a
 
 #define TP_ITYP_AV             0x00000001      /* Initiator available */
 #define TP_ITYP_TYPE(x)        (((x) & 0x6) >> 1)      /* Initiator Type */
index 897793d85b7db6dac3348e2e87245e6323010629..479f68945b0e0bf4b7767ee63c1fecea8cf7f508 100644 (file)
@@ -298,6 +298,8 @@ int ft_board_setup(void *blob, bd_t *bd)
 
        fdt_fixup_memory_banks(blob, base, size, 2);
 
+       fdt_fixup_dr_usb(blob, bd);
+
 #ifdef CONFIG_FSL_MC_ENET
        fdt_fixup_board_enet(blob);
        err = fsl_mc_ldpaa_exit(bd);
index 52e5e3f516d341da0bc7b70e1093aa3d2f2044b0..a65cd4ab8053d9ac2f5ff35be6516015ca772f8c 100644 (file)
@@ -281,6 +281,8 @@ int ft_board_setup(void *blob, bd_t *bd)
 
        fdt_fixup_memory_banks(blob, base, size, 2);
 
+       fdt_fixup_dr_usb(blob, bd);
+
 #ifdef CONFIG_FSL_MC_ENET
        fdt_fixup_board_enet(blob);
        err = fsl_mc_ldpaa_exit(bd);
index 930ca1d35e8eed5cbfa039d59365130d2c2e2e7c..9c48852ea08bf8a5d51e0c2aac740ff42dadb802 100644 (file)
@@ -139,6 +139,7 @@ void fdt_fixup_dr_usb(void *blob, bd_t *bd)
        int usb_erratum_a007075_off = -1;
        int usb_erratum_a007792_off = -1;
        int usb_erratum_a005697_off = -1;
+       int usb_erratum_a008751_off = -1;
        int usb_mode_off = -1;
        int usb_phy_off = -1;
        char str[5];
@@ -217,5 +218,11 @@ void fdt_fixup_dr_usb(void *blob, bd_t *bd)
                                        has_erratum_a005697);
                if (ret == -ENOSPC)
                        return;
+               ret = fdt_fixup_erratum(&usb_erratum_a008751_off, blob,
+                                       SNPS_DWC3, "a008751",
+                                       has_erratum_a008751);
+               if (ret == -ENOSPC)
+                       return;
+
        }
 }
index 95918fc89023f2888df409a6c8ed258da9ac8404..ebe60a82f16818e2ab81138bca3e08a7466d85b1 100644 (file)
@@ -175,4 +175,19 @@ bool has_erratum_a004477(void)
        return false;
 }
 
+bool has_erratum_a008751(void)
+{
+       u32 svr = get_svr();
+       u32 soc = SVR_SOC_VER(svr);
+
+       switch (soc) {
+#ifdef CONFIG_ARM64
+       case SVR_LS2080:
+       case SVR_LS2085:
+               return IS_SVR_REV(svr, 1, 0);
+#endif
+       }
+       return false;
+}
+
 #endif
index 05f09d7600b803a183709121eeed33d1d21bb840..c12a1894857802e6b8c98c485e7b3db1909cf5e2 100644 (file)
@@ -15,6 +15,8 @@
 #include <linux/usb/xhci-fsl.h>
 #include <linux/usb/dwc3.h>
 #include "xhci.h"
+#include <fsl_errata.h>
+#include <fsl_usb.h>
 
 /* Declare global data pointer */
 DECLARE_GLOBAL_DATA_PTR;
@@ -27,6 +29,26 @@ __weak int __board_usb_init(int index, enum usb_init_type init)
        return 0;
 }
 
+static int erratum_a008751(void)
+{
+#if defined(CONFIG_TARGET_LS2080AQDS) || defined(CONFIG_TARGET_LS2080ARDB)
+       u32 __iomem *scfg = (u32 __iomem *)SCFG_BASE;
+       writel(SCFG_USB3PRM1CR_INIT, scfg + SCFG_USB3PRM1CR / 4);
+       return 0;
+#endif
+       return 1;
+}
+
+static void fsl_apply_xhci_errata(void)
+{
+       int ret;
+       if (has_erratum_a008751()) {
+               ret = erratum_a008751();
+               if (ret != 0)
+                       puts("Failed to apply erratum a008751\n");
+       }
+}
+
 static int fsl_xhci_core_init(struct fsl_xhci *fsl_xhci)
 {
        int ret = 0;
@@ -69,6 +91,8 @@ int xhci_hcd_init(int index, struct xhci_hccr **hccr, struct xhci_hcor **hcor)
                return ret;
        }
 
+       fsl_apply_xhci_errata();
+
        ret = fsl_xhci_core_init(ctx);
        if (ret < 0) {
                puts("Failed to initialize xhci\n");
index d18334965ffb82c0a722022caad458eb7f586f2f..fc72fb9384579fc19b6001320c735c6f4f002087 100644 (file)
@@ -94,5 +94,6 @@ bool has_erratum_a007798(void);
 bool has_erratum_a007792(void);
 bool has_erratum_a005697(void);
 bool has_erratum_a004477(void);
+bool has_erratum_a008751(void);
 #endif
 #endif /*_ASM_FSL_USB_H_ */