
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 avorontsov@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); }