From b43cdf9b3fe246a8920d2b62ee41fc1722315ef0 Mon Sep 17 00:00:00 2001 From: Marek Vasut Date: Wed, 8 Aug 2018 14:29:55 +0200 Subject: [PATCH] usb: ehci: Make the PHY handling generic Pull out the EHCI PHY functions into the ehci-hcd.c to let other EHCI drivers use them. Signed-off-by: Marek Vasut --- drivers/usb/host/ehci-generic.c | 56 ++-------------------------------- drivers/usb/host/ehci-hcd.c | 66 +++++++++++++++++++++++++++++++++++++++++ drivers/usb/host/ehci.h | 5 ++++ 3 files changed, 74 insertions(+), 53 deletions(-) diff --git a/drivers/usb/host/ehci-generic.c b/drivers/usb/host/ehci-generic.c index 5a56f66..cc2f338 100644 --- a/drivers/usb/host/ehci-generic.c +++ b/drivers/usb/host/ehci-generic.c @@ -26,56 +26,6 @@ struct generic_ehci { int reset_count; }; -static int ehci_setup_phy(struct udevice *dev, int index) -{ - struct generic_ehci *priv = dev_get_priv(dev); - int ret; - - ret = generic_phy_get_by_index(dev, index, &priv->phy); - if (ret) { - if (ret != -ENOENT) { - dev_err(dev, "failed to get usb phy\n"); - return ret; - } - } else { - ret = generic_phy_init(&priv->phy); - if (ret) { - dev_err(dev, "failed to init usb phy\n"); - return ret; - } - - ret = generic_phy_power_on(&priv->phy); - if (ret) { - dev_err(dev, "failed to power on usb phy\n"); - return generic_phy_exit(&priv->phy); - } - } - - return 0; -} - -static int ehci_shutdown_phy(struct udevice *dev) -{ - struct generic_ehci *priv = dev_get_priv(dev); - int ret = 0; - - if (generic_phy_valid(&priv->phy)) { - ret = generic_phy_power_off(&priv->phy); - if (ret) { - dev_err(dev, "failed to power off usb phy\n"); - return ret; - } - - ret = generic_phy_exit(&priv->phy); - if (ret) { - dev_err(dev, "failed to power off usb phy\n"); - return ret; - } - } - - return 0; -} - static int ehci_usb_probe(struct udevice *dev) { struct generic_ehci *priv = dev_get_priv(dev); @@ -145,7 +95,7 @@ static int ehci_usb_probe(struct udevice *dev) } } - err = ehci_setup_phy(dev, 0); + err = ehci_setup_phy(dev, &priv->phy, 0); if (err) goto reset_err; @@ -160,7 +110,7 @@ static int ehci_usb_probe(struct udevice *dev) return 0; phy_err: - ret = ehci_shutdown_phy(dev); + ret = ehci_shutdown_phy(dev, &priv->phy); if (ret) dev_err(dev, "failed to shutdown usb phy\n"); @@ -185,7 +135,7 @@ static int ehci_usb_remove(struct udevice *dev) if (ret) return ret; - ret = ehci_shutdown_phy(dev); + ret = ehci_shutdown_phy(dev, &priv->phy); if (ret) return ret; diff --git a/drivers/usb/host/ehci-hcd.c b/drivers/usb/host/ehci-hcd.c index 663f748..199b3a8 100644 --- a/drivers/usb/host/ehci-hcd.c +++ b/drivers/usb/host/ehci-hcd.c @@ -1675,3 +1675,69 @@ struct dm_usb_ops ehci_usb_ops = { }; #endif + +#ifdef CONFIG_PHY +int ehci_setup_phy(struct udevice *dev, struct phy *phy, int index) +{ + int ret; + + if (!phy) + return 0; + + ret = generic_phy_get_by_index(dev, index, phy); + if (ret) { + if (ret != -ENOENT) { + dev_err(dev, "failed to get usb phy\n"); + return ret; + } + } else { + ret = generic_phy_init(phy); + if (ret) { + dev_err(dev, "failed to init usb phy\n"); + return ret; + } + + ret = generic_phy_power_on(phy); + if (ret) { + dev_err(dev, "failed to power on usb phy\n"); + return generic_phy_exit(phy); + } + } + + return 0; +} + +int ehci_shutdown_phy(struct udevice *dev, struct phy *phy) +{ + int ret = 0; + + if (!phy) + return 0; + + if (generic_phy_valid(phy)) { + ret = generic_phy_power_off(phy); + if (ret) { + dev_err(dev, "failed to power off usb phy\n"); + return ret; + } + + ret = generic_phy_exit(phy); + if (ret) { + dev_err(dev, "failed to power off usb phy\n"); + return ret; + } + } + + return 0; +} +#else +int ehci_setup_phy(struct udevice *dev, struct phy *phy, int index) +{ + return 0; +} + +int ehci_shutdown_phy(struct udevice *dev, struct phy *phy) +{ + return 0; +} +#endif diff --git a/drivers/usb/host/ehci.h b/drivers/usb/host/ehci.h index 07de472..7945016 100644 --- a/drivers/usb/host/ehci.h +++ b/drivers/usb/host/ehci.h @@ -9,6 +9,7 @@ #define USB_EHCI_H #include +#include /* Section 2.2.3 - N_PORTS */ #define MAX_HC_PORTS 15 @@ -288,4 +289,8 @@ int ehci_register(struct udevice *dev, struct ehci_hccr *hccr, int ehci_deregister(struct udevice *dev); extern struct dm_usb_ops ehci_usb_ops; +/* EHCI PHY functions */ +int ehci_setup_phy(struct udevice *dev, struct phy *phy, int index); +int ehci_shutdown_phy(struct udevice *dev, struct phy *phy); + #endif /* USB_EHCI_H */ -- 2.7.4