diff --git a/drivers/usb/dwc3/core.c b/drivers/usb/dwc3/core.c index 96294d6458d5..19254eb77beb 100644 --- a/drivers/usb/dwc3/core.c +++ b/drivers/usb/dwc3/core.c @@ -1247,6 +1247,9 @@ static int dwc3_suspend(struct device *dev) struct dwc3 *dwc = dev_get_drvdata(dev); int ret; + if (pm_runtime_suspended(dwc->dev)) + return 0; + ret = dwc3_suspend_common(dwc); if (ret) return ret; @@ -1261,6 +1264,9 @@ static int dwc3_resume(struct device *dev) struct dwc3 *dwc = dev_get_drvdata(dev); int ret; + if (pm_runtime_suspended(dwc->dev)) + return 0; + pinctrl_pm_select_default_state(dev); ret = dwc3_resume_common(dwc); diff --git a/drivers/usb/dwc3/gadget.c b/drivers/usb/dwc3/gadget.c index 906f10793eda..9bddcd27005e 100644 --- a/drivers/usb/dwc3/gadget.c +++ b/drivers/usb/dwc3/gadget.c @@ -2873,7 +2873,10 @@ static irqreturn_t dwc3_check_event_buf(struct dwc3_event_buffer *evt) u32 count; u32 reg; - if (pm_runtime_suspended(dwc->dev)) { + reg = dwc3_readl(dwc->regs, DWC3_GCTL); + + if (pm_runtime_suspended(dwc->dev) && + DWC3_GCTL_PRTCAP(reg) != DWC3_GCTL_PRTCAP_HOST) { pm_runtime_get(dwc->dev); disable_irq_nosync(dwc->irq_gadget); dwc->pending_events = true;