From f5f85bb96c4c19b0da3bc8f5b695e150100bdcd0 Mon Sep 17 00:00:00 2001 From: Pratham Pratap Date: Tue, 14 Dec 2021 16:10:13 +0530 Subject: [PATCH] usb: dwc: Release wakeup source if vbus_active is cleared Commit 980a25b5c2b7 ("usb: dwc3: Dont release wakeup source during usb restart") introduced a check in dwc3_msm_suspend for in_restart before releasing the wakeup source to ensure that driver doesn't release the wakeup source if suspend is kicked while restart session was executing. Now consider a case where, due to some reason, erratic event is seen on the controller and restart session is kicked. While restart work was running, physical cable disconnect happened which will call suspend routine eventually but due to in_restart flag being set driver will not release the wakeup source and will end up consuming power even though cable got disconnected. Fix this by adding one more level of judgement of vbus_active to ensure that wakeup source is released when cable gets disconnected during restart usb work. Change-Id: Ie54618640d08c4f2e3f0dc1d38260e0aa2d309c2 Signed-off-by: Pratham Pratap --- drivers/usb/dwc3/dwc3-msm.c | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/drivers/usb/dwc3/dwc3-msm.c b/drivers/usb/dwc3/dwc3-msm.c index 959700da4498..48e27d4c6f29 100644 --- a/drivers/usb/dwc3/dwc3-msm.c +++ b/drivers/usb/dwc3/dwc3-msm.c @@ -2324,6 +2324,10 @@ static void dwc3_restart_usb_work(struct work_struct *w) dwc->err_evt_seen = false; flush_delayed_work(&mdwc->sm_work); + + /* see comments in dwc3_msm_suspend */ + if (!mdwc->vbus_active) + pm_relax(mdwc->dev); } /* @@ -3375,6 +3379,12 @@ static int dwc3_msm_suspend(struct dwc3_msm *mdwc, bool force_power_collapse, dwc3_msm_update_bus_bw(mdwc, BUS_VOTE_NONE); + /* + * If in_restart is marked as true from restart work do not release the wakeup + * active source as it can lead the device to enter system suspend (if usb is + * the last holding the wakeup active source). If actual cable disconnect happens + * while in_restart is true wakeup active source will be released from restart work. + */ if (!mdwc->in_restart) { /* * release wakeup source with timeout to defer system suspend to