usb: xhci: fsl: Add workaround for USB erratum A008751
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>
This commit is contained in:
parent
32fbd46f38
commit
ef53b8c4ce
|
@ -139,6 +139,7 @@
|
|||
/* 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 */
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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;
|
||||
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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");
|
||||
|
|
|
@ -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_ */
|
||||
|
|
Loading…
Reference in New Issue