mirror of
https://github.com/u-boot/u-boot.git
synced 2025-05-02 17:47:54 +00:00
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
7 changed files with 52 additions and 0 deletions
|
@ -139,6 +139,7 @@
|
||||||
/* Supplemental Configuration */
|
/* Supplemental Configuration */
|
||||||
#define SCFG_BASE 0x01fc0000
|
#define SCFG_BASE 0x01fc0000
|
||||||
#define SCFG_USB3PRM1CR 0x000
|
#define SCFG_USB3PRM1CR 0x000
|
||||||
|
#define SCFG_USB3PRM1CR_INIT 0x27672b2a
|
||||||
|
|
||||||
#define TP_ITYP_AV 0x00000001 /* Initiator available */
|
#define TP_ITYP_AV 0x00000001 /* Initiator available */
|
||||||
#define TP_ITYP_TYPE(x) (((x) & 0x6) >> 1) /* Initiator Type */
|
#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_memory_banks(blob, base, size, 2);
|
||||||
|
|
||||||
|
fdt_fixup_dr_usb(blob, bd);
|
||||||
|
|
||||||
#ifdef CONFIG_FSL_MC_ENET
|
#ifdef CONFIG_FSL_MC_ENET
|
||||||
fdt_fixup_board_enet(blob);
|
fdt_fixup_board_enet(blob);
|
||||||
err = fsl_mc_ldpaa_exit(bd);
|
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_memory_banks(blob, base, size, 2);
|
||||||
|
|
||||||
|
fdt_fixup_dr_usb(blob, bd);
|
||||||
|
|
||||||
#ifdef CONFIG_FSL_MC_ENET
|
#ifdef CONFIG_FSL_MC_ENET
|
||||||
fdt_fixup_board_enet(blob);
|
fdt_fixup_board_enet(blob);
|
||||||
err = fsl_mc_ldpaa_exit(bd);
|
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_a007075_off = -1;
|
||||||
int usb_erratum_a007792_off = -1;
|
int usb_erratum_a007792_off = -1;
|
||||||
int usb_erratum_a005697_off = -1;
|
int usb_erratum_a005697_off = -1;
|
||||||
|
int usb_erratum_a008751_off = -1;
|
||||||
int usb_mode_off = -1;
|
int usb_mode_off = -1;
|
||||||
int usb_phy_off = -1;
|
int usb_phy_off = -1;
|
||||||
char str[5];
|
char str[5];
|
||||||
|
@ -217,5 +218,11 @@ void fdt_fixup_dr_usb(void *blob, bd_t *bd)
|
||||||
has_erratum_a005697);
|
has_erratum_a005697);
|
||||||
if (ret == -ENOSPC)
|
if (ret == -ENOSPC)
|
||||||
return;
|
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;
|
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
|
#endif
|
||||||
|
|
|
@ -15,6 +15,8 @@
|
||||||
#include <linux/usb/xhci-fsl.h>
|
#include <linux/usb/xhci-fsl.h>
|
||||||
#include <linux/usb/dwc3.h>
|
#include <linux/usb/dwc3.h>
|
||||||
#include "xhci.h"
|
#include "xhci.h"
|
||||||
|
#include <fsl_errata.h>
|
||||||
|
#include <fsl_usb.h>
|
||||||
|
|
||||||
/* Declare global data pointer */
|
/* Declare global data pointer */
|
||||||
DECLARE_GLOBAL_DATA_PTR;
|
DECLARE_GLOBAL_DATA_PTR;
|
||||||
|
@ -27,6 +29,26 @@ __weak int __board_usb_init(int index, enum usb_init_type init)
|
||||||
return 0;
|
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)
|
static int fsl_xhci_core_init(struct fsl_xhci *fsl_xhci)
|
||||||
{
|
{
|
||||||
int ret = 0;
|
int ret = 0;
|
||||||
|
@ -69,6 +91,8 @@ int xhci_hcd_init(int index, struct xhci_hccr **hccr, struct xhci_hcor **hcor)
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fsl_apply_xhci_errata();
|
||||||
|
|
||||||
ret = fsl_xhci_core_init(ctx);
|
ret = fsl_xhci_core_init(ctx);
|
||||||
if (ret < 0) {
|
if (ret < 0) {
|
||||||
puts("Failed to initialize xhci\n");
|
puts("Failed to initialize xhci\n");
|
||||||
|
|
|
@ -94,5 +94,6 @@ bool has_erratum_a007798(void);
|
||||||
bool has_erratum_a007792(void);
|
bool has_erratum_a007792(void);
|
||||||
bool has_erratum_a005697(void);
|
bool has_erratum_a005697(void);
|
||||||
bool has_erratum_a004477(void);
|
bool has_erratum_a004477(void);
|
||||||
|
bool has_erratum_a008751(void);
|
||||||
#endif
|
#endif
|
||||||
#endif /*_ASM_FSL_USB_H_ */
|
#endif /*_ASM_FSL_USB_H_ */
|
||||||
|
|
Loading…
Add table
Reference in a new issue