>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