diff options
Diffstat (limited to 'drivers/phy/phy-twl4030-usb.c')
| -rw-r--r-- | drivers/phy/phy-twl4030-usb.c | 14 |
1 files changed, 9 insertions, 5 deletions
diff --git a/drivers/phy/phy-twl4030-usb.c b/drivers/phy/phy-twl4030-usb.c index 4a3fc6e59f8e..840f3eae428b 100644 --- a/drivers/phy/phy-twl4030-usb.c +++ b/drivers/phy/phy-twl4030-usb.c | |||
| @@ -715,6 +715,7 @@ static int twl4030_usb_probe(struct platform_device *pdev) | |||
| 715 | pm_runtime_use_autosuspend(&pdev->dev); | 715 | pm_runtime_use_autosuspend(&pdev->dev); |
| 716 | pm_runtime_set_autosuspend_delay(&pdev->dev, 2000); | 716 | pm_runtime_set_autosuspend_delay(&pdev->dev, 2000); |
| 717 | pm_runtime_enable(&pdev->dev); | 717 | pm_runtime_enable(&pdev->dev); |
| 718 | pm_runtime_get_sync(&pdev->dev); | ||
| 718 | 719 | ||
| 719 | /* Our job is to use irqs and status from the power module | 720 | /* Our job is to use irqs and status from the power module |
| 720 | * to keep the transceiver disabled when nothing's connected. | 721 | * to keep the transceiver disabled when nothing's connected. |
| @@ -750,6 +751,7 @@ static int twl4030_usb_remove(struct platform_device *pdev) | |||
| 750 | struct twl4030_usb *twl = platform_get_drvdata(pdev); | 751 | struct twl4030_usb *twl = platform_get_drvdata(pdev); |
| 751 | int val; | 752 | int val; |
| 752 | 753 | ||
| 754 | usb_remove_phy(&twl->phy); | ||
| 753 | pm_runtime_get_sync(twl->dev); | 755 | pm_runtime_get_sync(twl->dev); |
| 754 | cancel_delayed_work(&twl->id_workaround_work); | 756 | cancel_delayed_work(&twl->id_workaround_work); |
| 755 | device_remove_file(twl->dev, &dev_attr_vbus); | 757 | device_remove_file(twl->dev, &dev_attr_vbus); |
| @@ -757,6 +759,13 @@ static int twl4030_usb_remove(struct platform_device *pdev) | |||
| 757 | /* set transceiver mode to power on defaults */ | 759 | /* set transceiver mode to power on defaults */ |
| 758 | twl4030_usb_set_mode(twl, -1); | 760 | twl4030_usb_set_mode(twl, -1); |
| 759 | 761 | ||
| 762 | /* idle ulpi before powering off */ | ||
| 763 | if (cable_present(twl->linkstat)) | ||
| 764 | pm_runtime_put_noidle(twl->dev); | ||
| 765 | pm_runtime_mark_last_busy(twl->dev); | ||
| 766 | pm_runtime_put_sync_suspend(twl->dev); | ||
| 767 | pm_runtime_disable(twl->dev); | ||
| 768 | |||
| 760 | /* autogate 60MHz ULPI clock, | 769 | /* autogate 60MHz ULPI clock, |
| 761 | * clear dpll clock request for i2c access, | 770 | * clear dpll clock request for i2c access, |
| 762 | * disable 32KHz | 771 | * disable 32KHz |
| @@ -771,11 +780,6 @@ static int twl4030_usb_remove(struct platform_device *pdev) | |||
| 771 | /* disable complete OTG block */ | 780 | /* disable complete OTG block */ |
| 772 | twl4030_usb_clear_bits(twl, POWER_CTRL, POWER_CTRL_OTG_ENAB); | 781 | twl4030_usb_clear_bits(twl, POWER_CTRL, POWER_CTRL_OTG_ENAB); |
| 773 | 782 | ||
| 774 | if (cable_present(twl->linkstat)) | ||
| 775 | pm_runtime_put_noidle(twl->dev); | ||
| 776 | pm_runtime_mark_last_busy(twl->dev); | ||
| 777 | pm_runtime_put(twl->dev); | ||
| 778 | |||
| 779 | return 0; | 783 | return 0; |
| 780 | } | 784 | } |
| 781 | 785 | ||
