aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/usb/otg
diff options
context:
space:
mode:
authorRoger Quadros <rogerq@ti.com>2013-03-12 07:24:26 -0400
committerFelipe Balbi <balbi@ti.com>2013-03-18 05:15:18 -0400
commitb54b5f56531d9fcbb30908373ba842af4de6a26b (patch)
treec498f3088cf73b86eba44c3bed3e1f5776ed0363 /drivers/usb/otg
parent0eba387973f521e57f00584e5e840e5328a61dda (diff)
USB: phy: nop: Defer probe if device needs VCC/RESET
Add 2 flags, needs_vcc and needs_reset to platform data. If the flag is set and the regulator couldn't be found then we bail out with -EPROBE_DEFER. For device tree boot we depend on presensce of vcc-supply/ reset-supply properties to decide if we should bail out with -EPROBE_DEFER or just continue in case the regulator can't be found. This is required for proper functionality in cases where the regulator is needed but is probed later than the PHY device. Signed-off-by: Roger Quadros <rogerq@ti.com> Signed-off-by: Felipe Balbi <balbi@ti.com>
Diffstat (limited to 'drivers/usb/otg')
-rw-r--r--drivers/usb/otg/nop-usb-xceiv.c11
1 files changed, 11 insertions, 0 deletions
diff --git a/drivers/usb/otg/nop-usb-xceiv.c b/drivers/usb/otg/nop-usb-xceiv.c
index b26b1c29194e..2b10cc969bbb 100644
--- a/drivers/usb/otg/nop-usb-xceiv.c
+++ b/drivers/usb/otg/nop-usb-xceiv.c
@@ -147,6 +147,8 @@ static int nop_usb_xceiv_probe(struct platform_device *pdev)
147 enum usb_phy_type type = USB_PHY_TYPE_USB2; 147 enum usb_phy_type type = USB_PHY_TYPE_USB2;
148 int err; 148 int err;
149 u32 clk_rate = 0; 149 u32 clk_rate = 0;
150 bool needs_vcc = false;
151 bool needs_reset = false;
150 152
151 nop = devm_kzalloc(&pdev->dev, sizeof(*nop), GFP_KERNEL); 153 nop = devm_kzalloc(&pdev->dev, sizeof(*nop), GFP_KERNEL);
152 if (!nop) 154 if (!nop)
@@ -163,9 +165,14 @@ static int nop_usb_xceiv_probe(struct platform_device *pdev)
163 if (of_property_read_u32(node, "clock-frequency", &clk_rate)) 165 if (of_property_read_u32(node, "clock-frequency", &clk_rate))
164 clk_rate = 0; 166 clk_rate = 0;
165 167
168 needs_vcc = of_property_read_bool(node, "vcc-supply");
169 needs_reset = of_property_read_bool(node, "reset-supply");
170
166 } else if (pdata) { 171 } else if (pdata) {
167 type = pdata->type; 172 type = pdata->type;
168 clk_rate = pdata->clk_rate; 173 clk_rate = pdata->clk_rate;
174 needs_vcc = pdata->needs_vcc;
175 needs_reset = pdata->needs_reset;
169 } 176 }
170 177
171 nop->clk = devm_clk_get(&pdev->dev, "main_clk"); 178 nop->clk = devm_clk_get(&pdev->dev, "main_clk");
@@ -194,12 +201,16 @@ static int nop_usb_xceiv_probe(struct platform_device *pdev)
194 if (IS_ERR(nop->vcc)) { 201 if (IS_ERR(nop->vcc)) {
195 dev_dbg(&pdev->dev, "Error getting vcc regulator: %ld\n", 202 dev_dbg(&pdev->dev, "Error getting vcc regulator: %ld\n",
196 PTR_ERR(nop->vcc)); 203 PTR_ERR(nop->vcc));
204 if (needs_vcc)
205 return -EPROBE_DEFER;
197 } 206 }
198 207
199 nop->reset = devm_regulator_get(&pdev->dev, "reset"); 208 nop->reset = devm_regulator_get(&pdev->dev, "reset");
200 if (IS_ERR(nop->reset)) { 209 if (IS_ERR(nop->reset)) {
201 dev_dbg(&pdev->dev, "Error getting reset regulator: %ld\n", 210 dev_dbg(&pdev->dev, "Error getting reset regulator: %ld\n",
202 PTR_ERR(nop->reset)); 211 PTR_ERR(nop->reset));
212 if (needs_reset)
213 return -EPROBE_DEFER;
203 } 214 }
204 215
205 nop->dev = &pdev->dev; 216 nop->dev = &pdev->dev;