Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux
1
fork

Configure Feed

Select the types of activity you want to include in your feed.

Merge tag 'usb-4.5-rc4' of git://git.kernel.org/pub/scm/linux/kernel/git/gregkh/usb

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

+19 -12
+1
drivers/phy/Kconfig
··· 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
+9 -7
drivers/phy/phy-core.c
··· 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); ··· 297 296 ret = phy->ops->power_on(phy); 298 297 if (ret < 0) { 299 298 dev_err(&phy->dev, "phy poweron failed --> %d\n", ret); 300 - goto out; 299 + goto err_pwr_on; 301 300 } 302 301 } 303 302 ++phy->power_count; 304 303 mutex_unlock(&phy->mutex); 305 304 return 0; 306 305 307 - out: 306 + err_pwr_on: 308 307 mutex_unlock(&phy->mutex); 309 308 phy_pm_runtime_put_sync(phy); 309 + err_pm_sync: 310 310 if (phy->pwr) 311 311 regulator_disable(phy->pwr); 312 - 312 + out: 313 313 return ret; 314 314 } 315 315 EXPORT_SYMBOL_GPL(phy_power_on);
+9 -5
drivers/phy/phy-twl4030-usb.c
··· 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. ··· 751 750 struct twl4030_usb *twl = platform_get_drvdata(pdev); 752 751 int val; 753 752 753 + usb_remove_phy(&twl->phy); 754 754 pm_runtime_get_sync(twl->dev); 755 755 cancel_delayed_work(&twl->id_workaround_work); 756 756 device_remove_file(twl->dev, &dev_attr_vbus); 757 757 758 758 /* set transceiver mode to power on defaults */ 759 759 twl4030_usb_set_mode(twl, -1); 760 + 761 + /* idle ulpi before powering off */ 762 + if (cable_present(twl->linkstat)) 763 + pm_runtime_put_noidle(twl->dev); 764 + pm_runtime_mark_last_busy(twl->dev); 765 + pm_runtime_put_sync_suspend(twl->dev); 766 + pm_runtime_disable(twl->dev); 760 767 761 768 /* autogate 60MHz ULPI clock, 762 769 * clear dpll clock request for i2c access, ··· 779 770 780 771 /* disable complete OTG block */ 781 772 twl4030_usb_clear_bits(twl, POWER_CTRL, POWER_CTRL_OTG_ENAB); 782 - 783 - if (cable_present(twl->linkstat)) 784 - pm_runtime_put_noidle(twl->dev); 785 - pm_runtime_mark_last_busy(twl->dev); 786 - pm_runtime_put(twl->dev); 787 773 788 774 return 0; 789 775 }