We should add status = "disabled" property when USB controller can't be used (for example when USB pins muxed away to another device).
Also convert whole fdt_fixup_dr_usb() to use more compact routines from fdt_support.h. Signed-off-by: Anton Vorontsov <avoront...@ru.mvista.com> --- cpu/mpc83xx/cpu.c | 4 +++ drivers/usb/otg/fsl_dr_usb.c | 60 ++++++++++++++++++++++++----------------- 2 files changed, 39 insertions(+), 25 deletions(-) diff --git a/cpu/mpc83xx/cpu.c b/cpu/mpc83xx/cpu.c index 876f5c7..034958c 100644 --- a/cpu/mpc83xx/cpu.c +++ b/cpu/mpc83xx/cpu.c @@ -404,6 +404,10 @@ int cpu_mmc_init(bd_t *bis) #endif } +#ifdef CONFIG_HWCONFIG +const char *cpu_hwconfig = "dr_usb"; +#endif + #ifdef CONFIG_BOOTCOUNT_LIMIT #if !defined(CONFIG_MPC8360) diff --git a/drivers/usb/otg/fsl_dr_usb.c b/drivers/usb/otg/fsl_dr_usb.c index af9797f..97584f8 100644 --- a/drivers/usb/otg/fsl_dr_usb.c +++ b/drivers/usb/otg/fsl_dr_usb.c @@ -10,43 +10,53 @@ */ #include <common.h> -#include <libfdt.h> +#include <malloc.h> +#include <hwconfig.h> +#include <fdt_support.h> void fdt_fixup_dr_usb(void *blob, bd_t *bd) { - char *mode; - char *type; const char *compat = "fsl-usb2-dr"; - const char *prop_mode = "dr_mode"; - const char *prop_type = "phy_type"; - int node_offset; - int err; - - mode = getenv("usb_dr_mode"); - type = getenv("usb_phy_type"); - if (!mode && !type) + const char *mode; + const char *type; + size_t modelen = 0; + size_t typelen = 0; + char *buf; + size_t bufsz; + + if (!hwconfig("dr_usb")) { + const char *reason = "disabled"; + + do_fixup_by_compat(blob, compat, "status", reason, + strlen(reason) + 1, 1); + return; + } + + mode = hwconfig_arg("dr_usb_mode", &modelen); + type = hwconfig_arg("dr_usb_phy_type", &typelen); + bufsz = max(modelen, typelen); + if (!bufsz) return; - node_offset = fdt_node_offset_by_compatible(blob, 0, compat); - if (node_offset < 0) { - printf("WARNING: could not find compatible node %s: %s.\n", - compat, fdt_strerror(node_offset)); + buf = malloc(bufsz + 1); + if (!buf) { + printf("%s: unable to allocate memory\n", __func__); return; } 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, compat, fdt_strerror(err)); + strcpy(buf, mode); + buf[modelen] = '\0'; + do_fixup_by_compat(blob, compat, "dr_mode", buf, + modelen + 1, 1); } if (type) { - err = fdt_setprop(blob, node_offset, prop_type, type, - strlen(type) + 1); - if (err < 0) - printf("WARNING: could not set %s for %s: %s.\n", - prop_type, compat, fdt_strerror(err)); + strcpy(buf, type); + buf[typelen] = '\0'; + do_fixup_by_compat(blob, compat, "phy_type", buf, + typelen + 1, 1); } + + free(buf); } -- 1.6.2.2 _______________________________________________ U-Boot mailing list U-Boot@lists.denx.de http://lists.denx.de/mailman/listinfo/u-boot