dwc2_writel(hsotg, gpwrdn, GPWRDN);
        udelay(10);
 
+       /* Reset ULPI latch */
+       gpwrdn = dwc2_readl(hsotg, GPWRDN);
+       gpwrdn &= ~GPWRDN_ULPI_LATCH_EN_DURING_HIB_ENTRY;
+       dwc2_writel(hsotg, gpwrdn, GPWRDN);
+
        /* Disable PMU interrupt */
        gpwrdn = dwc2_readl(hsotg, GPWRDN);
        gpwrdn &= ~GPWRDN_PMUINTSEL;
 
        gpwrdn_tmp &= ~GPWRDN_PMUINTSEL;
        dwc2_writel(hsotg, gpwrdn_tmp, GPWRDN);
 
+       /* Reset ULPI latch */
+       gpwrdn = dwc2_readl(hsotg, GPWRDN);
+       gpwrdn &= ~GPWRDN_ULPI_LATCH_EN_DURING_HIB_ENTRY;
+       dwc2_writel(hsotg, gpwrdn, GPWRDN);
+
        /* De-assert Wakeup Logic */
        gpwrdn_tmp = dwc2_readl(hsotg, GPWRDN);
        gpwrdn_tmp &= ~GPWRDN_PMUACTV;
 
 int dwc2_gadget_enter_hibernation(struct dwc2_hsotg *hsotg)
 {
        u32 gpwrdn;
+       u32 gusbcfg;
+       u32 pcgcctl;
        int ret = 0;
 
        /* Change to L2(suspend) state */
        }
 
        gpwrdn = GPWRDN_PWRDNRSTN;
+       udelay(10);
+       gusbcfg = dwc2_readl(hsotg, GUSBCFG);
+       if (gusbcfg & GUSBCFG_ULPI_UTMI_SEL) {
+               /* ULPI interface */
+               gpwrdn |= GPWRDN_ULPI_LATCH_EN_DURING_HIB_ENTRY;
+       }
+       dwc2_writel(hsotg, gpwrdn, GPWRDN);
+       udelay(10);
+
+       /* Suspend the Phy Clock */
+       pcgcctl = dwc2_readl(hsotg, PCGCTL);
+       pcgcctl |= PCGCTL_STOPPCLK;
+       dwc2_writel(hsotg, pcgcctl, PCGCTL);
+       udelay(10);
+
+       gpwrdn = dwc2_readl(hsotg, GPWRDN);
        gpwrdn |= GPWRDN_PMUACTV;
        dwc2_writel(hsotg, gpwrdn, GPWRDN);
        udelay(10);
        if (reset)
                dwc2_clear_bit(hsotg, DCFG, DCFG_DEVADDR_MASK);
 
+       /* Reset ULPI latch */
+       gpwrdn = dwc2_readl(hsotg, GPWRDN);
+       gpwrdn &= ~GPWRDN_ULPI_LATCH_EN_DURING_HIB_ENTRY;
+       dwc2_writel(hsotg, gpwrdn, GPWRDN);
+
        /* De-assert Wakeup Logic */
        gpwrdn = dwc2_readl(hsotg, GPWRDN);
        gpwrdn &= ~GPWRDN_PMUACTV;
 
        gusbcfg = dwc2_readl(hsotg, GUSBCFG);
        if (gusbcfg & GUSBCFG_ULPI_UTMI_SEL) {
                /* ULPI interface */
+               udelay(10);
+               gpwrdn = dwc2_readl(hsotg, GPWRDN);
+               gpwrdn |= GPWRDN_ULPI_LATCH_EN_DURING_HIB_ENTRY;
+               dwc2_writel(hsotg, gpwrdn, GPWRDN);
+               udelay(10);
                /* Suspend the Phy Clock */
                pcgcctl = dwc2_readl(hsotg, PCGCTL);
                pcgcctl |= PCGCTL_STOPPCLK;
        dwc2_writel(hsotg, gr->gusbcfg, GUSBCFG);
        dwc2_writel(hsotg, hr->hcfg, HCFG);
 
+       /* Reset ULPI latch */
+       gpwrdn = dwc2_readl(hsotg, GPWRDN);
+       gpwrdn &= ~GPWRDN_ULPI_LATCH_EN_DURING_HIB_ENTRY;
+       dwc2_writel(hsotg, gpwrdn, GPWRDN);
+
        /* De-assert Wakeup Logic */
        gpwrdn = dwc2_readl(hsotg, GPWRDN);
        gpwrdn &= ~GPWRDN_PMUACTV;