|
@@ -715,6 +715,7 @@ static int twl4030_usb_probe(struct platform_device *pdev)
|
|
|
pm_runtime_use_autosuspend(&pdev->dev);
|
|
|
pm_runtime_set_autosuspend_delay(&pdev->dev, 2000);
|
|
|
pm_runtime_enable(&pdev->dev);
|
|
|
+ pm_runtime_get_sync(&pdev->dev);
|
|
|
|
|
|
/* Our job is to use irqs and status from the power module
|
|
|
* to keep the transceiver disabled when nothing's connected.
|
|
@@ -758,6 +759,13 @@ static int twl4030_usb_remove(struct platform_device *pdev)
|
|
|
/* set transceiver mode to power on defaults */
|
|
|
twl4030_usb_set_mode(twl, -1);
|
|
|
|
|
|
+ /* idle ulpi before powering off */
|
|
|
+ if (cable_present(twl->linkstat))
|
|
|
+ pm_runtime_put_noidle(twl->dev);
|
|
|
+ pm_runtime_mark_last_busy(twl->dev);
|
|
|
+ pm_runtime_put_sync_suspend(twl->dev);
|
|
|
+ pm_runtime_disable(twl->dev);
|
|
|
+
|
|
|
/* autogate 60MHz ULPI clock,
|
|
|
* clear dpll clock request for i2c access,
|
|
|
* disable 32KHz
|
|
@@ -772,11 +780,6 @@ static int twl4030_usb_remove(struct platform_device *pdev)
|
|
|
/* disable complete OTG block */
|
|
|
twl4030_usb_clear_bits(twl, POWER_CTRL, POWER_CTRL_OTG_ENAB);
|
|
|
|
|
|
- if (cable_present(twl->linkstat))
|
|
|
- pm_runtime_put_noidle(twl->dev);
|
|
|
- pm_runtime_mark_last_busy(twl->dev);
|
|
|
- pm_runtime_put(twl->dev);
|
|
|
-
|
|
|
return 0;
|
|
|
}
|
|
|
|