*/
 static int dwc3_phy_setup(struct dwc3 *dwc)
 {
+       unsigned int hw_mode;
        u32 reg;
 
+       hw_mode = DWC3_GHWPARAMS0_MODE(dwc->hwparams.hwparams0);
+
        reg = dwc3_readl(dwc->regs, DWC3_GUSB3PIPECTL(0));
 
        /*
        if (dwc->revision > DWC3_REVISION_194A)
                reg |= DWC3_GUSB3PIPECTL_SUSPHY;
 
+       /*
+        * For DRD controllers, GUSB3PIPECTL.SUSPENDENABLE must be cleared after
+        * power-on reset, and it can be set after core initialization, which is
+        * after device soft-reset during initialization.
+        */
+       if (hw_mode == DWC3_GHWPARAMS0_MODE_DRD)
+               reg &= ~DWC3_GUSB3PIPECTL_SUSPHY;
+
        if (dwc->u2ss_inp3_quirk)
                reg |= DWC3_GUSB3PIPECTL_U2SSINP3OK;
 
        if (dwc->revision > DWC3_REVISION_194A)
                reg |= DWC3_GUSB2PHYCFG_SUSPHY;
 
+       /*
+        * For DRD controllers, GUSB2PHYCFG.SUSPHY must be cleared after
+        * power-on reset, and it can be set after core initialization, which is
+        * after device soft-reset during initialization.
+        */
+       if (hw_mode == DWC3_GHWPARAMS0_MODE_DRD)
+               reg &= ~DWC3_GUSB2PHYCFG_SUSPHY;
+
        if (dwc->dis_u2_susphy_quirk)
                reg &= ~DWC3_GUSB2PHYCFG_SUSPHY;
 
  */
 static int dwc3_core_init(struct dwc3 *dwc)
 {
+       unsigned int            hw_mode;
        u32                     reg;
        int                     ret;
 
+       hw_mode = DWC3_GHWPARAMS0_MODE(dwc->hwparams.hwparams0);
+
        /*
         * Write Linux Version Code to our GUID register so it's easy to figure
         * out which kernel version a bug was found.
        if (ret)
                goto err0a;
 
+       if (hw_mode == DWC3_GHWPARAMS0_MODE_DRD &&
+           dwc->revision > DWC3_REVISION_194A) {
+               if (!dwc->dis_u3_susphy_quirk) {
+                       reg = dwc3_readl(dwc->regs, DWC3_GUSB3PIPECTL(0));
+                       reg |= DWC3_GUSB3PIPECTL_SUSPHY;
+                       dwc3_writel(dwc->regs, DWC3_GUSB3PIPECTL(0), reg);
+               }
+
+               if (!dwc->dis_u2_susphy_quirk) {
+                       reg = dwc3_readl(dwc->regs, DWC3_GUSB2PHYCFG(0));
+                       reg |= DWC3_GUSB2PHYCFG_SUSPHY;
+                       dwc3_writel(dwc->regs, DWC3_GUSB2PHYCFG(0), reg);
+               }
+       }
+
        dwc3_core_setup_global_control(dwc);
        dwc3_core_num_eps(dwc);