[PATCH 1/3] phy: omap-usb2: Manage PHY 3.3V supply regulator

Roger Quadros
2014-06-30T11:00:36Z

On some SoCs e.g. J6 the 3.3V supply to the USB2 PHY can be
powered down when the PHY is not in use. Add regulator
management code to control this power line.

Signed-off-by: Roger Quadros <rogerq-l0cyMroinI0@public.gmane.org>
---
drivers/phy/phy-omap-usb2.c | 25 +++++++++++++++++++++++++
include/linux/phy/omap_usb.h | 1 +
2 files changed, 26 insertions(+)

diff --git a/drivers/phy/phy-omap-usb2.c b/drivers/phy/phy-omap-usb2.c
index 7007c11..2afc79c 100644
--- a/drivers/phy/phy-omap-usb2.c
+++ b/drivers/phy/phy-omap-usb2.c
@@ -30,6 +30,7 @@
#include <linux/phy/omap_control_phy.h>
#include <linux/phy/phy.h>
#include <linux/of_platform.h>
+#include <linux/regulator/consumer.h>

#define USB2PHY_DISCON_BYP_LATCH (1 << 31)
#define USB2PHY_ANA_CONFIG1 0x4c
@@ -107,6 +108,14 @@ static int omap_usb_power_off(struct phy *x)

omap_control_phy_power(phy->control_dev, 0);

+ if (phy->pwr) {
+ int ret;
+
+ ret = regulator_disable(phy->pwr);
+ if (ret)
+ return ret;
+ }
+
return 0;
}

@@ -114,6 +123,14 @@ static int omap_usb_power_on(struct phy *x)
{
struct omap_usb *phy = phy_get_drvdata(x);

+ if (phy->pwr) {
+ int ret;
+
+ ret = regulator_enable(phy->pwr);
+ if (ret)
+ return ret;
+ }
+
omap_control_phy_power(phy->control_dev, 1);

return 0;
@@ -253,6 +270,14 @@ static int omap_usb2_probe(struct platform_device *pdev)
phy->control_dev = &control_pdev->dev;
omap_control_phy_power(phy->control_dev, 0);

+ /* phy-supply */
+ phy->pwr = devm_regulator_get_optional(phy->dev, "phy");
+ if (IS_ERR(phy->pwr)) {
+ if (PTR_ERR(phy->pwr) == -EPROBE_DEFER)
+ return -EPROBE_DEFER;
+ phy->pwr = NULL;
+ }
+
otg->set_host = omap_usb_set_host;
otg->set_peripheral = omap_usb_set_peripheral;
if (phy_data->flags & OMAP_USB2_HAS_SET_VBUS)
diff --git a/include/linux/phy/omap_usb.h b/include/linux/phy/omap_usb.h
index dc2c541..e2c46df 100644
--- a/include/linux/phy/omap_usb.h
+++ b/include/linux/phy/omap_usb.h
@@ -40,6 +40,7 @@ struct omap_usb {
struct clk *wkupclk;
struct clk *optclk;
u8 flags;
+ struct regulator *pwr;
};

struct usb_phy_data {
--
1.8.3.2