74 lines
2.0 KiB
Diff
74 lines
2.0 KiB
Diff
From ad63ebfc3565bbdec87ee4e30e4d40d164c1d3b8 Mon Sep 17 00:00:00 2001
|
|
From: Roger Quadros <rogerq@ti.com>
|
|
Date: Tue, 12 Mar 2013 13:24:23 +0200
|
|
Subject: [PATCH 3/6] usb: phy: nop: Handle RESET for the PHY
|
|
|
|
We expect the RESET line to be modeled as a regulator with supply
|
|
name "reset". The regulator should be modeled such that enabling
|
|
the regulator brings the PHY device out of RESET and disabling the
|
|
regulator holds the device in RESET.
|
|
|
|
They PHY will be held in RESET in .shutdown() and brought out of
|
|
RESET in .init().
|
|
|
|
Signed-off-by: Roger Quadros <rogerq@ti.com>
|
|
Signed-off-by: Felipe Balbi <balbi@ti.com>
|
|
---
|
|
drivers/usb/otg/nop-usb-xceiv.c | 19 +++++++++++++++++++
|
|
1 file changed, 19 insertions(+)
|
|
|
|
diff --git a/drivers/usb/otg/nop-usb-xceiv.c b/drivers/usb/otg/nop-usb-xceiv.c
|
|
index fbdcfef..6efc9b7 100644
|
|
--- a/drivers/usb/otg/nop-usb-xceiv.c
|
|
+++ b/drivers/usb/otg/nop-usb-xceiv.c
|
|
@@ -40,6 +40,7 @@ struct nop_usb_xceiv {
|
|
struct device *dev;
|
|
struct clk *clk;
|
|
struct regulator *vcc;
|
|
+ struct regulator *reset;
|
|
};
|
|
|
|
static struct platform_device *pd;
|
|
@@ -80,6 +81,12 @@ static int nop_init(struct usb_phy *phy)
|
|
if (!IS_ERR(nop->clk))
|
|
clk_enable(nop->clk);
|
|
|
|
+ if (!IS_ERR(nop->reset)) {
|
|
+ /* De-assert RESET */
|
|
+ if (regulator_enable(nop->reset))
|
|
+ dev_err(phy->dev, "Failed to de-assert reset\n");
|
|
+ }
|
|
+
|
|
return 0;
|
|
}
|
|
|
|
@@ -87,6 +94,12 @@ static void nop_shutdown(struct usb_phy *phy)
|
|
{
|
|
struct nop_usb_xceiv *nop = dev_get_drvdata(phy->dev);
|
|
|
|
+ if (!IS_ERR(nop->reset)) {
|
|
+ /* Assert RESET */
|
|
+ if (regulator_disable(nop->reset))
|
|
+ dev_err(phy->dev, "Failed to assert reset\n");
|
|
+ }
|
|
+
|
|
if (!IS_ERR(nop->clk))
|
|
clk_disable(nop->clk);
|
|
|
|
@@ -172,6 +185,12 @@ static int nop_usb_xceiv_probe(struct platform_device *pdev)
|
|
PTR_ERR(nop->vcc));
|
|
}
|
|
|
|
+ nop->reset = devm_regulator_get(&pdev->dev, "reset");
|
|
+ if (IS_ERR(nop->reset)) {
|
|
+ dev_dbg(&pdev->dev, "Error getting reset regulator: %ld\n",
|
|
+ PTR_ERR(nop->reset));
|
|
+ }
|
|
+
|
|
nop->dev = &pdev->dev;
|
|
nop->phy.dev = nop->dev;
|
|
nop->phy.label = "nop-xceiv";
|
|
--
|
|
1.7.9.5
|
|
|