writel(GINTSTS_ERLYSUSP | GINTSTS_SESSREQINT |
                GINTSTS_GOUTNAKEFF | GINTSTS_GINNAKEFF |
                GINTSTS_CONIDSTSCHNG | GINTSTS_USBRST |
-               GINTSTS_ENUMDONE | GINTSTS_OTGINT |
-               GINTSTS_USBSUSP | GINTSTS_WKUPINT,
+               GINTSTS_RESETDET | GINTSTS_ENUMDONE |
+               GINTSTS_OTGINT | GINTSTS_USBSUSP |
+               GINTSTS_WKUPINT,
                hsotg->regs + GINTMSK);
 
        if (using_dma(hsotg))
                }
        }
 
-       if (gintsts & GINTSTS_USBRST) {
+       if (gintsts & GINTSTS_RESETDET) {
+               dev_dbg(hsotg->dev, "%s: USBRstDet\n", __func__);
+
+               writel(GINTSTS_RESETDET, hsotg->regs + GINTSTS);
+
+               /* This event must be used only if controller is suspended */
+               if (hsotg->lx_state == DWC2_L2) {
+                       dwc2_exit_hibernation(hsotg, true);
+                       hsotg->lx_state = DWC2_L0;
+               }
+       }
+
+       if (gintsts & (GINTSTS_USBRST | GINTSTS_RESETDET)) {
 
                u32 usb_status = readl(hsotg->regs + GOTGCTL);