diff options
author | Roger Quadros <rogerq@ti.com> | 2014-07-10 02:25:03 -0400 |
---|---|---|
committer | Greg Kroah-Hartman <gregkh@linuxfoundation.org> | 2014-07-11 21:23:50 -0400 |
commit | eb82a3d846fab00c4b9ad6bbe5ade4fa5febc0af (patch) | |
tree | d200444e54061fad1c7209dd6a2716815afa55cb | |
parent | e73b49f1c4e75c44d62585cc3e5b9c7894b61c32 (diff) |
phy: omap-usb2: Balance pm_runtime_enable() on probe failure and remove
If probe fails then we need to call pm_runtime_disable() to balance
out the previous pm_runtime_enable() call. Else it will cause
unbalanced pm_runtime_enable() call in the succeding probe call.
This anomaly was observed when the call to devm_phy_create() failed
with -EPROBE_DEFER.
Balance out the pm_runtime_enable() call in .remove() as well.
Signed-off-by: Roger Quadros <rogerq@ti.com>
Signed-off-by: Kishon Vijay Abraham I <kishon@ti.com>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
-rw-r--r-- | drivers/phy/phy-omap-usb2.c | 7 |
1 files changed, 5 insertions, 2 deletions
diff --git a/drivers/phy/phy-omap-usb2.c b/drivers/phy/phy-omap-usb2.c index 2063d542b4e4..34b396146c8a 100644 --- a/drivers/phy/phy-omap-usb2.c +++ b/drivers/phy/phy-omap-usb2.c | |||
@@ -262,7 +262,6 @@ static int omap_usb2_probe(struct platform_device *pdev) | |||
262 | otg->phy = &phy->phy; | 262 | otg->phy = &phy->phy; |
263 | 263 | ||
264 | platform_set_drvdata(pdev, phy); | 264 | platform_set_drvdata(pdev, phy); |
265 | pm_runtime_enable(phy->dev); | ||
266 | 265 | ||
267 | generic_phy = devm_phy_create(phy->dev, &ops, NULL); | 266 | generic_phy = devm_phy_create(phy->dev, &ops, NULL); |
268 | if (IS_ERR(generic_phy)) | 267 | if (IS_ERR(generic_phy)) |
@@ -270,10 +269,13 @@ static int omap_usb2_probe(struct platform_device *pdev) | |||
270 | 269 | ||
271 | phy_set_drvdata(generic_phy, phy); | 270 | phy_set_drvdata(generic_phy, phy); |
272 | 271 | ||
272 | pm_runtime_enable(phy->dev); | ||
273 | phy_provider = devm_of_phy_provider_register(phy->dev, | 273 | phy_provider = devm_of_phy_provider_register(phy->dev, |
274 | of_phy_simple_xlate); | 274 | of_phy_simple_xlate); |
275 | if (IS_ERR(phy_provider)) | 275 | if (IS_ERR(phy_provider)) { |
276 | pm_runtime_disable(phy->dev); | ||
276 | return PTR_ERR(phy_provider); | 277 | return PTR_ERR(phy_provider); |
278 | } | ||
277 | 279 | ||
278 | phy->wkupclk = devm_clk_get(phy->dev, "wkupclk"); | 280 | phy->wkupclk = devm_clk_get(phy->dev, "wkupclk"); |
279 | if (IS_ERR(phy->wkupclk)) { | 281 | if (IS_ERR(phy->wkupclk)) { |
@@ -317,6 +319,7 @@ static int omap_usb2_remove(struct platform_device *pdev) | |||
317 | if (!IS_ERR(phy->optclk)) | 319 | if (!IS_ERR(phy->optclk)) |
318 | clk_unprepare(phy->optclk); | 320 | clk_unprepare(phy->optclk); |
319 | usb_remove_phy(&phy->phy); | 321 | usb_remove_phy(&phy->phy); |
322 | pm_runtime_disable(phy->dev); | ||
320 | 323 | ||
321 | return 0; | 324 | return 0; |
322 | } | 325 | } |