>From: Sriram Dash [mailto:sriram.d...@nxp.com]
>

Hello Marek,

Any comments? 

>For FSL USB node fixup, the dt is walked multiple times for fixing erratum and 
>phy
>type. This patch walks the tree and fixes the node till no more USB nodes are 
>left.
>
>Signed-off-by: Sriram Dash <sriram.d...@nxp.com>
>Signed-off-by: Rajesh Bhagat <rajesh.bha...@nxp.com>
>---
> drivers/usb/common/fsl-dt-fixup.c | 108 +++++++++++++++++---------------------
> 1 file changed, 47 insertions(+), 61 deletions(-)
>
>diff --git a/drivers/usb/common/fsl-dt-fixup.c 
>b/drivers/usb/common/fsl-dt-fixup.c
>index 9c48852..df785a6 100644
>--- a/drivers/usb/common/fsl-dt-fixup.c
>+++ b/drivers/usb/common/fsl-dt-fixup.c
>@@ -54,25 +54,19 @@ static int fdt_usb_get_node_type(void *blob, int
>start_offset,  }
>
> static int fdt_fixup_usb_mode_phy_type(void *blob, const char *mode,
>-                                     const char *phy_type, int start_offset)
>+                                     const char *phy_type, int node_offset,
>+                                     const char **node_type)
> {
>       const char *prop_mode = "dr_mode";
>       const char *prop_type = "phy_type";
>-      const char *node_type = NULL;
>-      int node_offset;
>-      int err;
>-
>-      err = fdt_usb_get_node_type(blob, start_offset,
>-                                  &node_offset, &node_type);
>-      if (err < 0)
>-              return err;
>+      int err = 0;
>
>       if (mode) {
>               err = fdt_setprop(blob, node_offset, prop_mode, mode,
>                                 strlen(mode) + 1);
>               if (err < 0)
>                       printf("WARNING: could not set %s for %s: %s.\n",
>-                             prop_mode, node_type, fdt_strerror(err));
>+                             prop_mode, *node_type, fdt_strerror(err));
>       }
>
>       if (phy_type) {
>@@ -80,52 +74,48 @@ static int fdt_fixup_usb_mode_phy_type(void *blob, const
>char *mode,
>                                 strlen(phy_type) + 1);
>               if (err < 0)
>                       printf("WARNING: could not set %s for %s: %s.\n",
>-                             prop_type, node_type, fdt_strerror(err));
>+                             prop_type, *node_type, fdt_strerror(err));
>       }
>
>-      return node_offset;
>+      return err;
> }
>
> static int fdt_fixup_usb_erratum(void *blob, const char *prop_erratum,
>-                               const char *controller_type, int start_offset)
>+                               const char *controller_type, int node_offset,
>+                               const char **node_type)
> {
>-      int node_offset, err;
>-      const char *node_type = NULL;
>+      int err = -1;
>       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))
>+      if (!strcmp(*node_type, FSL_USB2_MPH) ||
>+          !strcmp(*node_type, FSL_USB2_DR))
>               node_name = CHIPIDEA_USB2;
>       else
>-              node_name = node_type;
>+              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",
>-                     prop_erratum, node_type, fdt_strerror(err));
>+                     prop_erratum, *node_type, fdt_strerror(err));
>       }
>
>-      return node_offset;
>+      return err;
> }
>
>-static int fdt_fixup_erratum(int *usb_erratum_off, void *blob,
>+static int fdt_fixup_erratum(int node_offset, void *blob,
>                            const char *controller_type, char *str,
>-                           bool (*has_erratum)(void))
>+                           bool (*has_erratum)(void), const char **node_type)
> {
>       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)
>+      node_offset = fdt_fixup_usb_erratum(blob, buf, controller_type,
>+                                          node_offset, node_type);
>+      if (node_offset < 0)
>               return -ENOSPC;
>       debug("Adding USB erratum %s\n", str);
>       return 0;
>@@ -135,23 +125,23 @@ void 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" };
>-      int usb_erratum_a006261_off = -1;
>-      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;
>+      const char *node_type = NULL;
>+      int node_offset = -1;
>       char str[5];
>-      int i, j;
>-      int ret;
>+      int i = 1, j;
>+      int ret, err;
>
>-      for (i = 1; i <= CONFIG_USB_MAX_CONTROLLER_COUNT; i++) {
>+      do {
>               const char *dr_mode_type = NULL;
>               const char *dr_phy_type = NULL;
>               int mode_idx = -1, phy_idx = -1;
>
>-              snprintf(str, 5, "%s%d", "usb", i);
>+              err = fdt_usb_get_node_type(blob, node_offset,
>+                                          &node_offset, &node_type);
>+              if (err < 0)
>+                      return;
>+
>+              snprintf(str, 5, "%s%d", "usb", i++);
>               if (hwconfig(str)) {
>                       for (j = 0; j < ARRAY_SIZE(modes); j++) {
>                               if (hwconfig_subarg_cmp(str, "dr_mode", @@ -
>184,45 +174,41 @@ void fdt_fixup_dr_usb(void *blob, bd_t *bd)
>               if (has_dual_phy())
>                       dr_phy_type = phys[2];
>
>-              usb_mode_off = fdt_fixup_usb_mode_phy_type(blob,
>-                                                         dr_mode_type, NULL,
>-                                                         usb_mode_off);
>-
>-              if (usb_mode_off < 0)
>+              err = fdt_fixup_usb_mode_phy_type(blob, dr_mode_type, NULL,
>+                                                node_offset, &node_type);
>+              if (err < 0)
>                       return;
>
>-              usb_phy_off = fdt_fixup_usb_mode_phy_type(blob,
>-                                                        NULL, dr_phy_type,
>-                                                        usb_phy_off);
>-
>-              if (usb_phy_off < 0)
>+              err = fdt_fixup_usb_mode_phy_type(blob, NULL, dr_phy_type,
>+                                                node_offset, &node_type);
>+              if (err < 0)
>                       return;
>
>-              ret = fdt_fixup_erratum(&usb_erratum_a006261_off, blob,
>+              ret = fdt_fixup_erratum(node_offset, blob,
>                                       CHIPIDEA_USB2, "a006261",
>-                                      has_erratum_a006261);
>+                                      has_erratum_a006261, &node_type);
>               if (ret == -ENOSPC)
>                       return;
>-              ret = fdt_fixup_erratum(&usb_erratum_a007075_off, blob,
>+              ret = fdt_fixup_erratum(node_offset, blob,
>                                       CHIPIDEA_USB2, "a007075",
>-                                      has_erratum_a007075);
>+                                      has_erratum_a007075, &node_type);
>               if (ret == -ENOSPC)
>                       return;
>-              ret = fdt_fixup_erratum(&usb_erratum_a007792_off, blob,
>+              ret = fdt_fixup_erratum(node_offset, blob,
>                                       CHIPIDEA_USB2, "a007792",
>-                                      has_erratum_a007792);
>+                                      has_erratum_a007792, &node_type);
>               if (ret == -ENOSPC)
>                       return;
>-              ret = fdt_fixup_erratum(&usb_erratum_a005697_off, blob,
>+              ret = fdt_fixup_erratum(node_offset, blob,
>                                       CHIPIDEA_USB2, "a005697",
>-                                      has_erratum_a005697);
>+                                      has_erratum_a005697, &node_type);
>               if (ret == -ENOSPC)
>                       return;
>-              ret = fdt_fixup_erratum(&usb_erratum_a008751_off, blob,
>+              ret = fdt_fixup_erratum(node_offset, blob,
>                                       SNPS_DWC3, "a008751",
>-                                      has_erratum_a008751);
>+                                      has_erratum_a008751, &node_type);
>               if (ret == -ENOSPC)
>                       return;
>
>-      }
>+      } while (node_offset > 0);
> }
>--
>2.1.0

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

Reply via email to