Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 9298b4aa authored by Bin Liu's avatar Bin Liu Committed by Felipe Balbi
Browse files

usb: musb: fix device hotplug behind hub



The commit 889ad3b "usb: musb: try a race-free wakeup" breaks device
hotplug enumeraitonn when the device is connected behind a hub while usb
autosuspend is enabled.

Adding finish_resume_work into runtime resume callback fixes the issue.

Also resume root hub is required to resume the bus from runtime suspend,
so move musb_host_resume_root_hub() back to its original location, where
handles RESUME interrupt.

Signed-off-by: default avatarBin Liu <b-liu@ti.com>
Tested-by: default avatarTony Lindgren <tony@atomide.com>
Signed-off-by: default avatarFelipe Balbi <balbi@ti.com>
parent 251a17f5
Loading
Loading
Loading
Loading
+7 −0
Original line number Diff line number Diff line
@@ -567,6 +567,7 @@ static irqreturn_t musb_stage0_irq(struct musb *musb, u8 int_usb,

				musb->xceiv->otg->state = OTG_STATE_A_HOST;
				musb->is_active = 1;
				musb_host_resume_root_hub(musb);
				break;
			case OTG_STATE_B_WAIT_ACON:
				musb->xceiv->otg->state = OTG_STATE_B_PERIPHERAL;
@@ -2500,6 +2501,12 @@ static int musb_runtime_resume(struct device *dev)
		musb_restore_context(musb);
	first = 0;

	if (musb->need_finish_resume) {
		musb->need_finish_resume = 0;
		schedule_delayed_work(&musb->finish_resume_work,
				msecs_to_jiffies(20));
	}

	return 0;
}

+0 −1
Original line number Diff line number Diff line
@@ -72,7 +72,6 @@ void musb_host_finish_resume(struct work_struct *work)
	musb->xceiv->otg->state = OTG_STATE_A_HOST;

	spin_unlock_irqrestore(&musb->lock, flags);
	musb_host_resume_root_hub(musb);
}

void musb_port_suspend(struct musb *musb, bool do_suspend)