>From: Marek Vasut [mailto:ma...@denx.de] >On 06/20/2016 06:15 AM, Sriram Dash wrote: >> Currently, U-boot doesn't allow to compile more than one type of USB >> protocol simultaneously. Hence, EHCI and XHCI controllers cannot >> co-exist and CONFIG_USB_MAX_CONTROLLER_COUNT macro represents count >of >> only one type of controller. > >This does not make sense, with DM we can support all sorts of controllers. >
Ok. Will change the commit message description in v2. >> For the Socs which have more than one type of controller e.g. EHCI and >> XHCI, and the device tree has to support both of them, the macro >> CONFIG_USB_MAX_CONTROLLER_COUNT will not work for fixing dt from u boot. >> >> So, instead of taking the hard coded number of controller from U boot, >> count the total number of controller present in dt and then fix the dt >> accordingly. >> >> 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 | 27 ++++++++++++++++++++++++++- >> 1 file changed, 26 insertions(+), 1 deletion(-) >> >> diff --git a/drivers/usb/common/fsl-dt-fixup.c >> b/drivers/usb/common/fsl-dt-fixup.c >> index 9c48852..1edf146 100644 >> --- a/drivers/usb/common/fsl-dt-fixup.c >> +++ b/drivers/usb/common/fsl-dt-fixup.c >> @@ -131,10 +131,29 @@ static int fdt_fixup_erratum(int *usb_erratum_off, void >*blob, >> return 0; >> } >> >> +static int fdt_max_controller_count(void *blob) { >> + int count = 0; >> + int node_offset = -1; >> + int i; >> + >> + for (i = 0; compat_usb_fsl[i]; i++) { >> + do { >> + node_offset = fdt_node_offset_by_compatible >> + (blob, node_offset, >> + compat_usb_fsl[i]); >> + if (node_offset >= 0) >> + count++; >> + } while (node_offset != -FDT_ERR_NOTFOUND); >> + } >> + return count; >> +} >> + >> 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" }; >> + unsigned int usb_max_controller_count; >> int usb_erratum_a006261_off = -1; >> int usb_erratum_a007075_off = -1; >> int usb_erratum_a007792_off = -1; >> @@ -146,7 +165,13 @@ void fdt_fixup_dr_usb(void *blob, bd_t *bd) >> int i, j; >> int ret; >> >> - for (i = 1; i <= CONFIG_USB_MAX_CONTROLLER_COUNT; i++) { >> + usb_max_controller_count = fdt_max_controller_count(blob); > >Since you walk the tree below anyway, why do you even need to count the >elements? Just walk the tree until you can find no more nodes. > Ok. Will traverse the dt and find the node. Then fix the node and afterwards, Traverse the device tree till no nodes are left for fixing. >> + if (!usb_max_controller_count) { >> + printf("ERROR: FDT fixup erratum fail.\n"); >> + return; >> + } >> + >> + for (i = 1; i <= usb_max_controller_count; i++) { >> const char *dr_mode_type = NULL; >> const char *dr_phy_type = NULL; >> int mode_idx = -1, phy_idx = -1; >> > > >-- >Best regards, >Marek Vasut _______________________________________________ U-Boot mailing list U-Boot@lists.denx.de http://lists.denx.de/mailman/listinfo/u-boot