diff --git a/drivers/usb/dwc3/dwc3-msm.c b/drivers/usb/dwc3/dwc3-msm.c index c20fb5b04240..3583317a3d3f 100644 --- a/drivers/usb/dwc3/dwc3-msm.c +++ b/drivers/usb/dwc3/dwc3-msm.c @@ -1924,6 +1924,15 @@ static int dwc3_msm_suspend(struct dwc3_msm *mdwc) enable_irq_wake(mdwc->ss_phy_irq); enable_irq(mdwc->ss_phy_irq); } + /* + * Enable power event irq during bus suspend in host mode for + * mapping MPM pin for DP so that wakeup can happen in system + * suspend. + */ + if (mdwc->in_host_mode) { + enable_irq(mdwc->pwr_event_irq); + enable_irq_wake(mdwc->pwr_event_irq); + } mdwc->lpm_flags |= MDWC3_ASYNC_IRQ_WAKE_CAPABILITY; } @@ -2010,9 +2019,6 @@ static int dwc3_msm_resume(struct dwc3_msm *mdwc) atomic_set(&dwc->in_lpm, 0); - /* enable power evt irq for IN P3 detection */ - enable_irq(mdwc->pwr_event_irq); - /* Disable HSPHY auto suspend */ dwc3_msm_write_reg(mdwc->base, DWC3_GUSB2PHYCFG(0), dwc3_msm_read_reg(mdwc->base, DWC3_GUSB2PHYCFG(0)) & @@ -2027,11 +2033,18 @@ static int dwc3_msm_resume(struct dwc3_msm *mdwc) disable_irq_wake(mdwc->ss_phy_irq); disable_irq_nosync(mdwc->ss_phy_irq); } + if (mdwc->in_host_mode) { + disable_irq_wake(mdwc->pwr_event_irq); + disable_irq(mdwc->pwr_event_irq); + } mdwc->lpm_flags &= ~MDWC3_ASYNC_IRQ_WAKE_CAPABILITY; } dev_info(mdwc->dev, "DWC3 exited from low power mode\n"); + /* enable power evt irq for IN P3 detection */ + enable_irq(mdwc->pwr_event_irq); + /* Enable core irq */ if (dwc->irq) enable_irq(dwc->irq);