diff options
author | Patrice Chotard <patrice.chotard@st.com> | 2017-07-18 11:57:11 +0200 |
---|---|---|
committer | Marek Vasut <marex@denx.de> | 2017-07-28 23:34:10 +0200 |
commit | 0d0ba1a73d6c34b7668f860e90ab57eacd9dd5b4 (patch) | |
tree | 362ecafcf4e9302e61a9321a0d4bb8b172e72261 /drivers | |
parent | a1cee8e808042e2597d162b1687fdb470634271e (diff) | |
download | u-boot-0d0ba1a73d6c34b7668f860e90ab57eacd9dd5b4.tar.gz |
usb: host: ehci-generic: add generic PHY support
Extend ehci-generic driver with generic PHY framework
Signed-off-by: Patrice Chotard <patrice.chotard@st.com>
Reviewed-by: Simon Glass <sjg@chromium.org>
Diffstat (limited to 'drivers')
-rw-r--r-- | drivers/usb/host/ehci-generic.c | 31 |
1 files changed, 30 insertions, 1 deletions
diff --git a/drivers/usb/host/ehci-generic.c b/drivers/usb/host/ehci-generic.c index e058445dca..3f751f1ecd 100644 --- a/drivers/usb/host/ehci-generic.c +++ b/drivers/usb/host/ehci-generic.c @@ -7,6 +7,7 @@ #include <common.h> #include <clk.h> #include <dm/ofnode.h> +#include <generic-phy.h> #include <reset.h> #include <asm/io.h> #include <dm.h> @@ -21,6 +22,7 @@ struct generic_ehci { struct ehci_ctrl ctrl; struct clk *clocks; struct reset_ctl *resets; + struct phy phy; int clock_count; int reset_count; }; @@ -91,16 +93,37 @@ static int ehci_usb_probe(struct udevice *dev) } } + err = generic_phy_get_by_index(dev, 0, &priv->phy); + if (err) { + if (err != -ENOENT) { + error("failed to get usb phy\n"); + goto reset_err; + } + } + + err = generic_phy_init(&priv->phy); + if (err) { + error("failed to init usb phy\n"); + goto reset_err; + } + hccr = map_physmem(devfdt_get_addr(dev), 0x100, MAP_NOCACHE); hcor = (struct ehci_hcor *)((uintptr_t)hccr + HC_LENGTH(ehci_readl(&hccr->cr_capbase))); err = ehci_register(dev, hccr, hcor, NULL, 0, USB_INIT_HOST); if (err) - goto reset_err; + goto phy_err; return 0; +phy_err: + if (generic_phy_valid(&priv->phy)) { + ret = generic_phy_exit(&priv->phy); + if (ret) + error("failed to release phy\n"); + } + reset_err: ret = reset_release_all(priv->resets, priv->reset_count); if (ret) @@ -122,6 +145,12 @@ static int ehci_usb_remove(struct udevice *dev) if (ret) return ret; + if (generic_phy_valid(&priv->phy)) { + ret = generic_phy_exit(&priv->phy); + if (ret) + return ret; + } + ret = reset_release_all(priv->resets, priv->reset_count); if (ret) return ret; |