Performs code cleanup for device tree fixup for fsl usb controllers by
making functions to handle these similar errata checking code.

Signed-off-by: Rajesh Bhagat <rajesh.bha...@nxp.com>
Signed-off-by: Sriram Dash <sriram.d...@nxp.com>
---

Changes in v3:
  - Inverted the condition for has_erratum for better readability
  - If fdt_fixup_usb_erratum fails, return ENOSPC and exit the fixup
  - Added logic for handling the condition with different controllers
        with different erratas
                - first check if the errata is applicable for the SoC
                - then check if it is applicable for the controller
                - if both are successful, then fix dt.

Changes in v2:
  - Added patch description
  - Removed the MACRO and use fdt_fixup_erratum function instead

 drivers/usb/common/fsl-dt-fixup.c | 88 ++++++++++++++++++++++-----------------
 include/fsl_usb.h                 |  6 +++
 2 files changed, 56 insertions(+), 38 deletions(-)

diff --git a/drivers/usb/common/fsl-dt-fixup.c 
b/drivers/usb/common/fsl-dt-fixup.c
index 6f31932..9cbd9d2 100644
--- a/drivers/usb/common/fsl-dt-fixup.c
+++ b/drivers/usb/common/fsl-dt-fixup.c
@@ -20,9 +20,9 @@
 #endif
 
 static const char * const compat_usb_fsl[] = {
-       "fsl-usb2-mph",
-       "fsl-usb2-dr",
-       "snps,dwc3",
+       FSL_USB2_MPH,
+       FSL_USB2_DR,
+       SNPS_DWC3,
        NULL
 };
 
@@ -80,16 +80,24 @@ static int fdt_fixup_usb_mode_phy_type(void *blob, const 
char *mode,
 }
 
 static int fdt_fixup_usb_erratum(void *blob, const char *prop_erratum,
-                                int start_offset)
+                                const char *controller_type, int start_offset)
 {
        int node_offset, err;
        const char *node_type = NULL;
+       const char *node_name = NULL;
 
        err = fdt_usb_get_node_type(blob, start_offset,
                                    &node_offset, &node_type);
        if (err < 0)
                return err;
 
+       if (!strcmp(node_type, FSL_USB2_MPH) || !strcmp(node_type, FSL_USB2_DR))
+               node_name = USB2_CI;
+       else
+               node_name = node_type;
+       if (strcmp(node_name, controller_type))
+               return err;
+
        err = fdt_setprop(blob, node_offset, prop_erratum, NULL, 0);
        if (err < 0) {
                printf("ERROR: could not set %s for %s: %s.\n",
@@ -99,6 +107,23 @@ static int fdt_fixup_usb_erratum(void *blob, const char 
*prop_erratum,
        return node_offset;
 }
 
+static int fdt_fixup_erratum(int *usb_erratum_off, void *blob,
+                            const char *controller_type, char *str,
+                            bool (*has_erratum)(void))
+{
+       char buf[32] = {0};
+
+       snprintf(buf, sizeof(buf), "fsl,usb-erratum-%s", str);
+       if (!(has_erratum()))
+               return -EINVAL;
+       *usb_erratum_off = fdt_fixup_usb_erratum(blob, buf, controller_type,
+                                                *usb_erratum_off);
+       if (*usb_erratum_off < 0)
+               return -ENOSPC;
+       debug("Adding USB erratum %s\n", str);
+       return 0;
+}
+
 void fdt_fixup_dr_usb(void *blob, bd_t *bd)
 {
        static const char * const modes[] = { "host", "peripheral", "otg" };
@@ -111,6 +136,7 @@ void fdt_fixup_dr_usb(void *blob, bd_t *bd)
        int usb_phy_off = -1;
        char str[5];
        int i, j;
+       int ret;
 
        for (i = 1; i <= CONFIG_USB_MAX_CONTROLLER_COUNT; i++) {
                const char *dr_mode_type = NULL;
@@ -164,39 +190,25 @@ void fdt_fixup_dr_usb(void *blob, bd_t *bd)
                if (usb_phy_off < 0)
                        return;
 
-               if (has_erratum_a006261()) {
-                       usb_erratum_a006261_off =  fdt_fixup_usb_erratum
-                                                  (blob,
-                                                   "fsl,usb-erratum-a006261",
-                                                   usb_erratum_a006261_off);
-                       if (usb_erratum_a006261_off < 0)
-                               return;
-               }
-
-               if (has_erratum_a007075()) {
-                       usb_erratum_a007075_off =  fdt_fixup_usb_erratum
-                                                  (blob,
-                                                   "fsl,usb-erratum-a007075",
-                                                   usb_erratum_a007075_off);
-                       if (usb_erratum_a007075_off < 0)
-                               return;
-               }
-
-               if (has_erratum_a007792()) {
-                       usb_erratum_a007792_off =  fdt_fixup_usb_erratum
-                                                  (blob,
-                                                   "fsl,usb-erratum-a007792",
-                                                   usb_erratum_a007792_off);
-                       if (usb_erratum_a007792_off < 0)
-                               return;
-               }
-               if (has_erratum_a005697()) {
-                       usb_erratum_a005697_off =  fdt_fixup_usb_erratum
-                                                  (blob,
-                                                   "fsl,usb-erratum-a005697",
-                                                   usb_erratum_a005697_off);
-                       if (usb_erratum_a005697_off < 0)
-                               return;
-               }
+               ret = fdt_fixup_erratum(&usb_erratum_a006261_off, blob,
+                                       USB2_CI, "a006261",
+                                       has_erratum_a006261);
+               if (ret == -ENOSPC)
+                       return;
+               ret = fdt_fixup_erratum(&usb_erratum_a007075_off, blob,
+                                       USB2_CI, "a007075",
+                                       has_erratum_a007075);
+               if (ret == -ENOSPC)
+                       return;
+               ret = fdt_fixup_erratum(&usb_erratum_a007792_off, blob,
+                                       USB2_CI, "a007792",
+                                       has_erratum_a007792);
+               if (ret == -ENOSPC)
+                       return;
+               ret = fdt_fixup_erratum(&usb_erratum_a005697_off, blob,
+                                       USB2_CI, "a005697",
+                                       has_erratum_a005697);
+               if (ret == -ENOSPC)
+                       return;
        }
 }
diff --git a/include/fsl_usb.h b/include/fsl_usb.h
index 187e384..882a5f5 100644
--- a/include/fsl_usb.h
+++ b/include/fsl_usb.h
@@ -85,6 +85,12 @@ struct ccsr_usb_phy {
 #define CONFIG_SYS_FSL_USB_SQUELCH_PROG_MASK 0x07
 #endif
 
+/* USB Controllers */
+#define FSL_USB2_MPH   "fsl-usb2-mph"
+#define FSL_USB2_DR    "fsl-usb2-dr"
+#define USB2_CI                "usb2-ci"
+#define SNPS_DWC3      "snps,dwc3"
+
 /* USB Erratum Checking code */
 #ifdef CONFIG_PPC
 static inline bool has_dual_phy(void)
-- 
2.1.0

_______________________________________________
U-Boot mailing list
U-Boot@lists.denx.de
http://lists.denx.de/mailman/listinfo/u-boot

Reply via email to