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