diff options
author | Tom Rini <trini@ti.com> | 2014-11-27 13:10:04 -0500 |
---|---|---|
committer | Tom Rini <trini@ti.com> | 2014-11-27 13:10:04 -0500 |
commit | e17e998d7fee2e7d381b7bff21aca3714387d5d7 (patch) | |
tree | 082fb0e66aa0463886d18294f0e29504626019a6 /drivers/usb/host/ehci-uniphier.c | |
parent | 38cd8c4253013ccdd4052ee021f6066fe9a52551 (diff) | |
parent | 25e274e20208e047ea93afde04040e8c87430904 (diff) | |
download | u-boot-imx-e17e998d7fee2e7d381b7bff21aca3714387d5d7.zip u-boot-imx-e17e998d7fee2e7d381b7bff21aca3714387d5d7.tar.gz u-boot-imx-e17e998d7fee2e7d381b7bff21aca3714387d5d7.tar.bz2 |
Merge branch 'master' of git://git.denx.de/u-boot-uniphier
Diffstat (limited to 'drivers/usb/host/ehci-uniphier.c')
-rw-r--r-- | drivers/usb/host/ehci-uniphier.c | 38 |
1 files changed, 37 insertions, 1 deletions
diff --git a/drivers/usb/host/ehci-uniphier.c b/drivers/usb/host/ehci-uniphier.c index 77f6c9d..32a4375 100644 --- a/drivers/usb/host/ehci-uniphier.c +++ b/drivers/usb/host/ehci-uniphier.c @@ -6,10 +6,43 @@ */ #include <common.h> +#include <linux/err.h> #include <usb.h> #include <asm/arch/ehci-uniphier.h> #include "ehci.h" +#ifdef CONFIG_OF_CONTROL +#include <fdtdec.h> +DECLARE_GLOBAL_DATA_PTR; + +#define FDT gd->fdt_blob +#define COMPAT "panasonic,uniphier-ehci" + +static int get_uniphier_ehci_base(int index, struct ehci_hccr **base) +{ + int offset; + + for (offset = fdt_node_offset_by_compatible(FDT, 0, COMPAT); + offset >= 0; + offset = fdt_node_offset_by_compatible(FDT, offset, COMPAT)) { + if (index == 0) { + *base = (struct ehci_hccr *) + fdtdec_get_addr(FDT, offset, "reg"); + return 0; + } + index--; + } + + return -ENODEV; /* not found */ +} +#else +static int get_uniphier_ehci_base(int index, struct ehci_hccr **base) +{ + *base = (struct ehci_hccr *)uniphier_ehci_platdata[index].base; + return 0; +} +#endif + /* * Create the appropriate control structures to manage * a new EHCI host controller. @@ -17,12 +50,15 @@ int ehci_hcd_init(int index, enum usb_init_type init, struct ehci_hccr **hccr, struct ehci_hcor **hcor) { + int ret; struct ehci_hccr *cr; struct ehci_hcor *or; uniphier_ehci_reset(index, 0); - cr = (struct ehci_hccr *)(uniphier_ehci_platdata[index].base); + ret = get_uniphier_ehci_base(index, &cr); + if (ret < 0) + return ret; or = (void *)cr + HC_LENGTH(ehci_readl(&cr->cr_capbase)); *hccr = cr; |