]> git.sur5r.net Git - u-boot/blobdiff - drivers/usb/common/fsl-dt-fixup.c
mtd: nand: mxs_nand: add use_minimum_ecc to struct
[u-boot] / drivers / usb / common / fsl-dt-fixup.c
index eb13f12c23380e9a89e6d7e1107cd362195b311f..6debfff513c7b07f1c2d220f8a5757723dc0468f 100644 (file)
@@ -1,17 +1,17 @@
+// SPDX-License-Identifier: GPL-2.0+
 /*
  * (C) Copyright 2009, 2011 Freescale Semiconductor, Inc.
  *
  * (C) Copyright 2008, Excito Elektronik i Sk=E5ne AB
  *
  * Author: Tor Krill tor@excito.com
- *
- * SPDX-License-Identifier:    GPL-2.0+
  */
 
 #include <common.h>
 #include <usb.h>
 #include <asm/io.h>
 #include <hwconfig.h>
+#include <fsl_errata.h>
 #include <fsl_usb.h>
 #include <fdt_support.h>
 
 #define CONFIG_USB_MAX_CONTROLLER_COUNT 1
 #endif
 
-static const char *fdt_usb_get_node_type(void *blob, int start_offset,
-                                        int *node_offset)
+/* 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,
+       NULL
+};
+
+static int fdt_usb_get_node_type(void *blob, int start_offset,
+                                int *node_offset, const char **node_type)
 {
-       const char *compat_dr = "fsl-usb2-dr";
-       const char *compat_mph = "fsl-usb2-mph";
-       const char *node_type = NULL;
-
-       *node_offset = fdt_node_offset_by_compatible(blob, start_offset,
-                                                    compat_mph);
-       if (*node_offset < 0) {
-               *node_offset = fdt_node_offset_by_compatible(blob,
-                                                            start_offset,
-                                                            compat_dr);
-               if (*node_offset < 0) {
-                       printf("ERROR: could not find compatible node: %s\n",
-                              fdt_strerror(*node_offset));
-               } else {
-                       node_type = compat_dr;
+       int i;
+       int ret = -ENOENT;
+
+       for (i = 0; compat_usb_fsl[i]; i++) {
+               *node_offset = fdt_node_offset_by_compatible
+                                       (blob, start_offset,
+                                        compat_usb_fsl[i]);
+               if (*node_offset >= 0) {
+                       *node_type = compat_usb_fsl[i];
+                       ret = 0;
+                       break;
                }
-       } else {
-               node_type = compat_mph;
        }
 
-       return node_type;
+       return ret;
 }
 
 static int fdt_fixup_usb_mode_phy_type(void *blob, const char *mode,
@@ -54,9 +61,10 @@ static int fdt_fixup_usb_mode_phy_type(void *blob, const char *mode,
        int node_offset;
        int err;
 
-       node_type = fdt_usb_get_node_type(blob, start_offset, &node_offset);
-       if (!node_type)
-               return -1;
+       err = fdt_usb_get_node_type(blob, start_offset,
+                                   &node_offset, &node_type);
+       if (err < 0)
+               return err;
 
        if (mode) {
                err = fdt_setprop(blob, node_offset, prop_mode, mode,
@@ -77,15 +85,25 @@ static int fdt_fixup_usb_mode_phy_type(void *blob, const char *mode,
        return node_offset;
 }
 
-static int fdt_fixup_usb_erratum(void *blob, const char *prop_erratum,
-                                int start_offset)
+static int fsl_fdt_fixup_usb_erratum(void *blob, const char *prop_erratum,
+                                    const char *controller_type,
+                                    int start_offset)
 {
        int node_offset, err;
        const char *node_type = NULL;
+       const char *node_name = NULL;
 
-       node_type = fdt_usb_get_node_type(blob, start_offset, &node_offset);
-       if (!node_type)
-               return -1;
+       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) {
@@ -96,7 +114,24 @@ static int fdt_fixup_usb_erratum(void *blob, const char *prop_erratum,
        return node_offset;
 }
 
-void fdt_fixup_dr_usb(void *blob, bd_t *bd)
+static int fsl_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 = fsl_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 fsl_fdt_fixup_dr_usb(void *blob, bd_t *bd)
 {
        static const char * const modes[] = { "host", "peripheral", "otg" };
        static const char * const phys[] = { "ulpi", "utmi", "utmi_dual" };
@@ -104,10 +139,12 @@ 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];
        int i, j;
+       int ret;
 
        for (i = 1; i <= CONFIG_USB_MAX_CONTROLLER_COUNT; i++) {
                const char *dr_mode_type = NULL;
@@ -161,39 +198,31 @@ 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;
-               }
+               ret = fsl_fdt_fixup_erratum(&usb_erratum_a006261_off, blob,
+                                           CHIPIDEA_USB2, "a006261",
+                                           has_erratum_a006261);
+               if (ret == -ENOSPC)
+                       return;
+               ret = fsl_fdt_fixup_erratum(&usb_erratum_a007075_off, blob,
+                                           CHIPIDEA_USB2, "a007075",
+                                           has_erratum_a007075);
+               if (ret == -ENOSPC)
+                       return;
+               ret = fsl_fdt_fixup_erratum(&usb_erratum_a007792_off, blob,
+                                           CHIPIDEA_USB2, "a007792",
+                                           has_erratum_a007792);
+               if (ret == -ENOSPC)
+                       return;
+               ret = fsl_fdt_fixup_erratum(&usb_erratum_a005697_off, blob,
+                                           CHIPIDEA_USB2, "a005697",
+                                           has_erratum_a005697);
+               if (ret == -ENOSPC)
+                       return;
+               ret = fsl_fdt_fixup_erratum(&usb_erratum_a008751_off, blob,
+                                           SNPS_DWC3, "a008751",
+                                           has_erratum_a008751);
+               if (ret == -ENOSPC)
+                       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;
-               }
        }
 }