Pull PHY fixes from Greg KH: "Here are a couple of PHY driver fixes for 4.5-rc4. A few small phy issues. All have been in linux-next with no reported issues" * tag 'usb-4.5-rc4' of git://git.kernel.org/pub/scm/linux/kernel/git/gregkh/usb: phy: twl4030-usb: Fix unbalanced pm_runtime_enable on module reload phy: twl4030-usb: Relase usb phy on unload phy: core: fix wrong err handle for phy_power_on phy: Restrict phy-hi6220-usb to HiSilicon arm64
Unified · Split
| @@ -224,6 +224,7 @@ config PHY_MT65XX_USB3 · 223 unmodified lines | ||
| 224 | 224 | |
| 225 | 225 | config PHY_HI6220_USB |
| 226 | 226 | tristate "hi6220 USB PHY support" |
| 227 | + depends on (ARCH_HISI && ARM64) || COMPILE_TEST | |
| 227 | 228 | select GENERIC_PHY |
| 228 | 229 | select MFD_SYSCON |
| 229 | 230 | help |
| @@ -275,20 +275,21 @@ EXPORT_SYMBOL_GPL(phy_exit); · 274 unmodified lines | ||
| 275 | 275 | |
| 276 | 276 | int phy_power_on(struct phy *phy) |
| 277 | 277 | { |
| 278 | − int ret; | |
| 278 | + int ret = 0; | |
| 279 | 279 | |
| 280 | 280 | if (!phy) |
| 281 | − return 0; | |
| 281 | + goto out; | |
| 282 | 282 | |
| 283 | 283 | if (phy->pwr) { |
| 284 | 284 | ret = regulator_enable(phy->pwr); |
| 285 | 285 | if (ret) |
| 286 | − return ret; | |
| 286 | + goto out; | |
| 287 | 287 | } |
| 288 | 288 | |
| 289 | 289 | ret = phy_pm_runtime_get_sync(phy); |
| 290 | 290 | if (ret < 0 && ret != -ENOTSUPP) |
| 291 | − return ret; | |
| 291 | + goto err_pm_sync; | |
| 292 | + | |
| 292 | 293 | ret = 0; /* Override possible ret == -ENOTSUPP */ |
| 293 | 294 | |
| 294 | 295 | mutex_lock(&phy->mutex); |
| @@ -296,19 +297,20 @@ int phy_power_on(struct phy *phy) · 1 unmodified line | ||
| 296 | 297 | ret = phy->ops->power_on(phy); |
| 297 | 298 | if (ret < 0) { |
| 298 | 299 | dev_err(&phy->dev, "phy poweron failed --> %d\n", ret); |
| 299 | − goto out; | |
| 300 | + goto err_pwr_on; | |
| 300 | 301 | } |
| 301 | 302 | } |
| 302 | 303 | ++phy->power_count; |
| 303 | 304 | mutex_unlock(&phy->mutex); |
| 304 | 305 | return 0; |
| 305 | 306 | |
| 306 | −out: | |
| 307 | +err_pwr_on: | |
| 307 | 308 | mutex_unlock(&phy->mutex); |
| 308 | 309 | phy_pm_runtime_put_sync(phy); |
| 310 | +err_pm_sync: | |
| 309 | 311 | if (phy->pwr) |
| 310 | 312 | regulator_disable(phy->pwr); |
| 311 | − | |
| 313 | +out: | |
| 312 | 314 | return ret; |
| 313 | 315 | } |
| 314 | 316 | EXPORT_SYMBOL_GPL(phy_power_on); |
| @@ -715,6 +715,7 @@ static int twl4030_usb_probe(struct platform_device *pdev) · 714 unmodified lines | ||
| 715 | 715 | pm_runtime_use_autosuspend(&pdev->dev); |
| 716 | 716 | pm_runtime_set_autosuspend_delay(&pdev->dev, 2000); |
| 717 | 717 | pm_runtime_enable(&pdev->dev); |
| 718 | + pm_runtime_get_sync(&pdev->dev); | |
| 718 | 719 | |
| 719 | 720 | /* Our job is to use irqs and status from the power module |
| 720 | 721 | * to keep the transceiver disabled when nothing's connected. |
| @@ -750,6 +751,7 @@ static int twl4030_usb_remove(struct platform_device *pdev) · 29 unmodified lines | ||
| 750 | 751 | struct twl4030_usb *twl = platform_get_drvdata(pdev); |
| 751 | 752 | int val; |
| 752 | 753 | |
| 754 | + usb_remove_phy(&twl->phy); | |
| 753 | 755 | pm_runtime_get_sync(twl->dev); |
| 754 | 756 | cancel_delayed_work(&twl->id_workaround_work); |
| 755 | 757 | device_remove_file(twl->dev, &dev_attr_vbus); |
| @@ -757,6 +759,13 @@ static int twl4030_usb_remove(struct platform_device *pdev) · 1 unmodified line | ||
| 757 | 759 | /* set transceiver mode to power on defaults */ |
| 758 | 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 | 769 | /* autogate 60MHz ULPI clock, |
| 761 | 770 | * clear dpll clock request for i2c access, |
| 762 | 771 | * disable 32KHz |
| @@ -771,11 +780,6 @@ static int twl4030_usb_remove(struct platform_device *pdev) · 8 unmodified lines | ||
| 771 | 780 | /* disable complete OTG block */ |
| 772 | 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 | 783 | return 0; |
| 780 | 784 | } |
| 781 | 785 | |