On 06/06/2016 06:24 AM, Sriram Dash wrote: >> -----Original Message----- >> From: Marek Vasut [mailto:ma...@denx.de] >> Sent: Thursday, June 02, 2016 6:31 PM >> To: Sriram Dash <sriram.d...@nxp.com>; u-boot@lists.denx.de >> Cc: york sun <york....@nxp.com>; albert.u.b...@aribaud.net; Rajesh Bhagat >> <rajesh.bha...@nxp.com> >> Subject: Re: [PATCH v2 5/5] usb: xhci: fsl: Add workaround for USB erratum A- >> 008751 >> >> On 06/02/2016 08:54 AM, Sriram Dash wrote: >>> 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.d...@nxp.com> >>> Signed-off-by: Rajesh Bhagat <rajesh.bha...@nxp.com> >>> --- >>> Changes in v2: >>> - Reworked for changes done in errata checking code. >> >> [...] >> >>> diff --git a/drivers/usb/common/fsl-dt-fixup.c >>> b/drivers/usb/common/fsl-dt-fixup.c >>> index 7c039cb..fd85439 100644 >>> --- a/drivers/usb/common/fsl-dt-fixup.c >>> +++ b/drivers/usb/common/fsl-dt-fixup.c >>> @@ -125,6 +125,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; >> >> Will there be an ever-growing list of unused variables here ? >> > > Same as in Patch 2/5 code cleanup for device tree fixup for fsl usb > controllers usb_erratum_aNNNNNN_off variable are keeping track of the device > tree fixup for errata NNNNNN. The code checks errata applicability for each > controller and tries to fix the device tree accordingly. During this time, > the variable usb_erratum_aNNNNNN_off is updated to the offset of device tree, > if the device tree is fixed. Now, for the second controller, when it tries to > fix the device tree, it checks from the same offset obtained. As the API for > fdt_setprop is such that the fixup will occur as soon as the API finds first > match, if this variable usb_erratum_aNNNNNN_off is not maintained, the errata > will be fixed always for the first usb controller it comes across the device > tree. So, we need this variable.
What will happen if you have two different controllers in the system and each of them has different set of erratas ? Will this code fail at handling them by applying wrong sets of erratas ? btw Can you please fix your mailer to break lines at 80 chars ? >>> int usb_mode_off = -1; >>> int usb_phy_off = -1; >>> char str[5]; >>> @@ -190,6 +191,8 @@ void fdt_fixup_dr_usb(void *blob, bd_t *bd) >>> "a007792", has_erratum_a007792); >>> fdt_fixup_erratum(&usb_erratum_a005697_off, blob, >>> "a005697", has_erratum_a005697); >>> + fdt_fixup_erratum(&usb_erratum_a008751_off, blob, >>> + "a008751", has_erratum_a008751); >>> >>> } >>> } >>> diff --git a/drivers/usb/common/fsl-errata.c >>> b/drivers/usb/common/fsl-errata.c index 95918fc..ebe60a8 100644 >>> --- a/drivers/usb/common/fsl-errata.c >>> +++ b/drivers/usb/common/fsl-errata.c >>> @@ -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 >>> diff --git a/drivers/usb/host/xhci-fsl.c b/drivers/usb/host/xhci-fsl.c >>> index 05f09d7..d55ed87 100644 >>> --- a/drivers/usb/host/xhci-fsl.c >>> +++ b/drivers/usb/host/xhci-fsl.c >>> @@ -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,31 @@ __weak int __board_usb_init(int index, enum usb_init_type >> init) >>> return 0; >>> } >>> >>> +static inline bool erratum_a008751(void) >> >> Drop the inline, let compiler decide. Also, make this an int instead of bool >> and >> return 0 on success, 1 on error. >> > > Ok. Will drop inline and make static int from static bool. > Return 0 on success instead of true. > Return 1 on error instead of false. > >>> +{ >>> +#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 true; >>> +#endif >>> + return false; >>> +} >>> + >>> +#define APPLY_ERRATUM(id) \ >>> +do { >>> \ >>> + bool ret; \ >>> + if (has_erratum_##id()) { \ >>> + ret = erratum_##id(); \ >>> + if (ret <= 0) \ >>> + puts("Failed to apply erratum " #id "\n"); \ >>> + } \ >>> +} while (0) >> >> Turn this into a function. >> > > On a second thought, I guess I will drop the MACRO and directly call the > has_erratum_a008751() etc from fsl_apply_xhci_errata, instead of going for a > function. > What do you say? Fine >>> +static void fsl_apply_xhci_errata(void) { >>> + APPLY_ERRATUM(a008751); >>> +} >>> + >>> static int fsl_xhci_core_init(struct fsl_xhci *fsl_xhci) { >>> int ret = 0; >>> @@ -69,6 +96,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"); diff --git >>> a/include/fsl_usb.h >>> b/include/fsl_usb.h index d183349..fc72fb9 100644 >>> --- a/include/fsl_usb.h >>> +++ b/include/fsl_usb.h >>> @@ -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_ */ >>> >> >> >> -- >> Best regards, >> Marek Vasut -- Best regards, Marek Vasut _______________________________________________ U-Boot mailing list U-Boot@lists.denx.de http://lists.denx.de/mailman/listinfo/u-boot