usb: xhci: fsl: code cleanup for device tree fixup for fsl usb controllers
authorSriram Dash <sriram.dash@nxp.com>
Mon, 13 Jun 2016 04:28:33 +0000 (09:58 +0530)
committerMarek Vasut <marex@denx.de>
Mon, 13 Jun 2016 13:16:38 +0000 (15:16 +0200)
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.bhagat@nxp.com>
Signed-off-by: Sriram Dash <sriram.dash@nxp.com>
drivers/usb/common/fsl-dt-fixup.c

index 6f31932c37c10139e7cb189107163b48a4103227..1523f98cbccbd944b8fbcd202523f3baf692473d 100644 (file)
 #define CONFIG_USB_MAX_CONTROLLER_COUNT 1
 #endif
 
+/* USB Controllers */
+#define FSL_USB2_MPH   "fsl-usb2-mph"
+#define FSL_USB2_DR    "fsl-usb2-dr"
+#define CHIPIDEA_USB2  "chipidea,usb2"
+#define SNPS_DWC3      "snps,dwc3"
+
 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 +86,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 = CHIPIDEA_USB2;
+       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 +113,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 +142,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 +196,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,
+                                       CHIPIDEA_USB2, "a006261",
+                                       has_erratum_a006261);
+               if (ret == -ENOSPC)
+                       return;
+               ret = fdt_fixup_erratum(&usb_erratum_a007075_off, blob,
+                                       CHIPIDEA_USB2, "a007075",
+                                       has_erratum_a007075);
+               if (ret == -ENOSPC)
+                       return;
+               ret = fdt_fixup_erratum(&usb_erratum_a007792_off, blob,
+                                       CHIPIDEA_USB2, "a007792",
+                                       has_erratum_a007792);
+               if (ret == -ENOSPC)
+                       return;
+               ret = fdt_fixup_erratum(&usb_erratum_a005697_off, blob,
+                                       CHIPIDEA_USB2, "a005697",
+                                       has_erratum_a005697);
+               if (ret == -ENOSPC)
+                       return;
        }
 }