|
@@ -2671,6 +2671,13 @@ static int musb_suspend(struct device *dev)
|
|
|
{
|
|
|
struct musb *musb = dev_to_musb(dev);
|
|
|
unsigned long flags;
|
|
|
+ int ret;
|
|
|
+
|
|
|
+ ret = pm_runtime_get_sync(dev);
|
|
|
+ if (ret < 0) {
|
|
|
+ pm_runtime_put_noidle(dev);
|
|
|
+ return ret;
|
|
|
+ }
|
|
|
|
|
|
musb_platform_disable(musb);
|
|
|
musb_disable_interrupts(musb);
|
|
@@ -2721,14 +2728,6 @@ static int musb_resume(struct device *dev)
|
|
|
if ((devctl & mask) != (musb->context.devctl & mask))
|
|
|
musb->port1_status = 0;
|
|
|
|
|
|
- /*
|
|
|
- * The USB HUB code expects the device to be in RPM_ACTIVE once it came
|
|
|
- * out of suspend
|
|
|
- */
|
|
|
- pm_runtime_disable(dev);
|
|
|
- pm_runtime_set_active(dev);
|
|
|
- pm_runtime_enable(dev);
|
|
|
-
|
|
|
musb_start(musb);
|
|
|
|
|
|
spin_lock_irqsave(&musb->lock, flags);
|
|
@@ -2738,6 +2737,9 @@ static int musb_resume(struct device *dev)
|
|
|
error);
|
|
|
spin_unlock_irqrestore(&musb->lock, flags);
|
|
|
|
|
|
+ pm_runtime_mark_last_busy(dev);
|
|
|
+ pm_runtime_put_autosuspend(dev);
|
|
|
+
|
|
|
return 0;
|
|
|
}
|
|
|
|