mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git
synced 2024-08-21 08:19:28 +00:00
phy: qcom-usb-hs: Fix extcon double register after power cycle
Commitf0b5c2c963
("phy: qcom-usb-hs: Replace the extcon API") switched from extcon_register_notifier() to the resource-managed API, i.e. devm_extcon_register_notifier(). This is problematic in this case, because the extcon notifier is dynamically registered/unregistered whenever the PHY is powered on/off. The resource-managed API does not unregister the notifier until the driver is removed, so as soon as the PHY is power cycled, attempting to register the notifier again results in: double register detected WARNING: CPU: 1 PID: 182 at kernel/notifier.c:26 notifier_chain_register+0x74/0xa0 Call trace: ... extcon_register_notifier+0x74/0xb8 devm_extcon_register_notifier+0x54/0xb8 qcom_usb_hs_phy_power_on+0x1fc/0x208 ... ... and USB stops working after plugging the cable out and in another time. The easiest way to fix this is to make a partial revert of commitf0b5c2c963
("phy: qcom-usb-hs: Replace the extcon API") and avoid using the resource-managed API in this case. Fixes:f0b5c2c963
("phy: qcom-usb-hs: Replace the extcon API") Signed-off-by: Stephan Gerhold <stephan@gerhold.net> Signed-off-by: Kishon Vijay Abraham I <kishon@ti.com>
This commit is contained in:
parent
c9baab38fe
commit
64f86b9978
1 changed files with 5 additions and 2 deletions
|
@ -158,8 +158,8 @@ static int qcom_usb_hs_phy_power_on(struct phy *phy)
|
||||||
/* setup initial state */
|
/* setup initial state */
|
||||||
qcom_usb_hs_phy_vbus_notifier(&uphy->vbus_notify, state,
|
qcom_usb_hs_phy_vbus_notifier(&uphy->vbus_notify, state,
|
||||||
uphy->vbus_edev);
|
uphy->vbus_edev);
|
||||||
ret = devm_extcon_register_notifier(&ulpi->dev, uphy->vbus_edev,
|
ret = extcon_register_notifier(uphy->vbus_edev, EXTCON_USB,
|
||||||
EXTCON_USB, &uphy->vbus_notify);
|
&uphy->vbus_notify);
|
||||||
if (ret)
|
if (ret)
|
||||||
goto err_ulpi;
|
goto err_ulpi;
|
||||||
}
|
}
|
||||||
|
@ -180,6 +180,9 @@ static int qcom_usb_hs_phy_power_off(struct phy *phy)
|
||||||
{
|
{
|
||||||
struct qcom_usb_hs_phy *uphy = phy_get_drvdata(phy);
|
struct qcom_usb_hs_phy *uphy = phy_get_drvdata(phy);
|
||||||
|
|
||||||
|
if (uphy->vbus_edev)
|
||||||
|
extcon_unregister_notifier(uphy->vbus_edev, EXTCON_USB,
|
||||||
|
&uphy->vbus_notify);
|
||||||
regulator_disable(uphy->v3p3);
|
regulator_disable(uphy->v3p3);
|
||||||
regulator_disable(uphy->v1p8);
|
regulator_disable(uphy->v1p8);
|
||||||
clk_disable_unprepare(uphy->sleep_clk);
|
clk_disable_unprepare(uphy->sleep_clk);
|
||||||
|
|
Loading…
Reference in a new issue