summaryrefslogtreecommitdiff
path: root/drivers/usb/dwc3/core.c
diff options
context:
space:
mode:
authorLi Jun <jun.li@nxp.com>2020-03-20 14:21:54 +0800
committerLi Jun <jun.li@nxp.com>2020-03-31 17:03:44 +0800
commitefe0c93c82f53cff051851802104d7ea795d51c4 (patch)
tree4b0254ad5fbc4282f726710a275e59924217f11c /drivers/usb/dwc3/core.c
parent6c3083578f4355251c6b84647385781d0212d1a4 (diff)
MLK-23412-1 usb: dwc3: core: add a core init flag for device mode resume
In case system resume by device mode event(e.g, VBUS), runtime resume will happen before system resume, to avoid doing device mode resume again when system resume, add a core init flag. Reviewed-by: Peter Chen <peter.chen@nxp.com> Signed-off-by: Li Jun <jun.li@nxp.com>
Diffstat (limited to 'drivers/usb/dwc3/core.c')
-rw-r--r--drivers/usb/dwc3/core.c13
1 files changed, 13 insertions, 0 deletions
diff --git a/drivers/usb/dwc3/core.c b/drivers/usb/dwc3/core.c
index 03fbd285d0cf..b28d37f355d6 100644
--- a/drivers/usb/dwc3/core.c
+++ b/drivers/usb/dwc3/core.c
@@ -700,6 +700,8 @@ static void dwc3_core_exit(struct dwc3 *dwc)
phy_power_off(dwc->usb3_generic_phy);
clk_bulk_disable_unprepare(dwc->num_clks, dwc->clks);
reset_control_assert(dwc->reset);
+
+ dwc->core_inited = false;
}
static bool dwc3_core_is_valid(struct dwc3 *dwc)
@@ -1139,6 +1141,8 @@ static int dwc3_core_init(struct dwc3 *dwc)
}
}
+ dwc->core_inited = true;
+
return 0;
err4:
@@ -1768,6 +1772,15 @@ static int dwc3_resume_common(struct dwc3 *dwc, pm_message_t msg)
switch (dwc->current_dr_role) {
case DWC3_GCTL_PRTCAP_DEVICE:
+ /*
+ * system resume may come after runtime resume
+ * e.g. rpm suspend -> pm suspend -> wakeup
+ * -> rpm resume -> system resume, so if already
+ * runtime resumed, system resume should skip it.
+ */
+ if (dwc->core_inited)
+ break;
+
ret = dwc3_core_init_for_resume(dwc);
if (ret)
return ret;