diff options
author | Patrice Chotard | 2017-07-18 11:57:14 +0200 |
---|---|---|
committer | Marek Vasut | 2017-07-28 23:34:14 +0200 |
commit | 28df1cfddd9e722d0016d0930b0e523a82737695 (patch) | |
tree | 128f84edfb509f409289c2cd2ee4d545ad72df95 /drivers/usb/host | |
parent | 8a51b4b3dac35a18acca2538efe2c2979aa56417 (diff) |
usb: host: ohci-generic: add generic PHY support
Extend ohci-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/usb/host')
-rw-r--r-- | drivers/usb/host/ohci-generic.c | 31 |
1 files changed, 30 insertions, 1 deletions
diff --git a/drivers/usb/host/ohci-generic.c b/drivers/usb/host/ohci-generic.c index 95d54c1f098..9249039055a 100644 --- a/drivers/usb/host/ohci-generic.c +++ b/drivers/usb/host/ohci-generic.c @@ -8,6 +8,7 @@ #include <clk.h> #include <dm.h> #include <dm/ofnode.h> +#include <generic-phy.h> #include <reset.h> #include "ohci.h" @@ -19,6 +20,7 @@ struct generic_ohci { ohci_t ohci; struct clk *clocks; /* clock list */ struct reset_ctl *resets; /* reset list */ + struct phy phy; int clock_count; /* number of clock in clock list */ int reset_count; /* number of reset in reset list */ }; @@ -83,12 +85,33 @@ static int ohci_usb_probe(struct udevice *dev) goto clk_err; } + 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; + } + err = ohci_register(dev, regs); 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) @@ -110,6 +133,12 @@ static int ohci_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; |