summaryrefslogtreecommitdiffstats
path: root/drivers/usb/host/ehci-uniphier.c
diff options
context:
space:
mode:
authorTom Rini <trini@ti.com>2014-11-27 13:10:04 -0500
committerTom Rini <trini@ti.com>2014-11-27 13:10:04 -0500
commite17e998d7fee2e7d381b7bff21aca3714387d5d7 (patch)
tree082fb0e66aa0463886d18294f0e29504626019a6 /drivers/usb/host/ehci-uniphier.c
parent38cd8c4253013ccdd4052ee021f6066fe9a52551 (diff)
parent25e274e20208e047ea93afde04040e8c87430904 (diff)
downloadtalos-obmc-uboot-e17e998d7fee2e7d381b7bff21aca3714387d5d7.tar.gz
talos-obmc-uboot-e17e998d7fee2e7d381b7bff21aca3714387d5d7.zip
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.c38
1 files changed, 37 insertions, 1 deletions
diff --git a/drivers/usb/host/ehci-uniphier.c b/drivers/usb/host/ehci-uniphier.c
index 77f6c9d9d1..32a4375279 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;
OpenPOWER on IntegriCloud