|
@@ -463,7 +463,8 @@ static int twl4030_phy_power_on(struct phy *phy)
|
|
|
twl4030_usb_set_mode(twl, twl->usb_mode);
|
|
|
if (twl->usb_mode == T2_USB_MODE_ULPI)
|
|
|
twl4030_i2c_access(twl, 0);
|
|
|
- schedule_delayed_work(&twl->id_workaround_work, 0);
|
|
|
+ twl->linkstat = MUSB_UNKNOWN;
|
|
|
+ schedule_delayed_work(&twl->id_workaround_work, HZ);
|
|
|
|
|
|
return 0;
|
|
|
}
|
|
@@ -537,6 +538,7 @@ static irqreturn_t twl4030_usb_irq(int irq, void *_twl)
|
|
|
struct twl4030_usb *twl = _twl;
|
|
|
enum musb_vbus_id_status status;
|
|
|
bool status_changed = false;
|
|
|
+ int err;
|
|
|
|
|
|
status = twl4030_usb_linkstat(twl);
|
|
|
|
|
@@ -567,7 +569,9 @@ static irqreturn_t twl4030_usb_irq(int irq, void *_twl)
|
|
|
pm_runtime_mark_last_busy(twl->dev);
|
|
|
pm_runtime_put_autosuspend(twl->dev);
|
|
|
}
|
|
|
- musb_mailbox(status);
|
|
|
+ err = musb_mailbox(status);
|
|
|
+ if (err)
|
|
|
+ twl->linkstat = MUSB_UNKNOWN;
|
|
|
}
|
|
|
|
|
|
/* don't schedule during sleep - irq works right then */
|
|
@@ -595,7 +599,8 @@ static int twl4030_phy_init(struct phy *phy)
|
|
|
struct twl4030_usb *twl = phy_get_drvdata(phy);
|
|
|
|
|
|
pm_runtime_get_sync(twl->dev);
|
|
|
- schedule_delayed_work(&twl->id_workaround_work, 0);
|
|
|
+ twl->linkstat = MUSB_UNKNOWN;
|
|
|
+ schedule_delayed_work(&twl->id_workaround_work, HZ);
|
|
|
pm_runtime_mark_last_busy(twl->dev);
|
|
|
pm_runtime_put_autosuspend(twl->dev);
|
|
|
|
|
@@ -763,7 +768,8 @@ static int twl4030_usb_remove(struct platform_device *pdev)
|
|
|
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_dont_use_autosuspend(&pdev->dev);
|
|
|
+ pm_runtime_put_sync(twl->dev);
|
|
|
pm_runtime_disable(twl->dev);
|
|
|
|
|
|
/* autogate 60MHz ULPI clock,
|