Add parameter remote_wakeup to dwc2_restore_device_registers()
to be able to restore device registers according to programming
guide for dwc-otg. It says that in case of rem_wakeup DCTL must not
be restored here.

Remove setting of DCTL_PWRONPRGDONE from this function, because it
will be done in function responsible for exiting from hibernation.

Signed-off-by: Vardan Mikayelyan <mvar...@synopsys.com>
Signed-off-by: John Youn <johny...@synopsys.com>
---
 drivers/usb/dwc2/core.c   |  2 +-
 drivers/usb/dwc2/core.h   |  5 +++--
 drivers/usb/dwc2/gadget.c | 16 +++++++---------
 3 files changed, 11 insertions(+), 12 deletions(-)

diff --git a/drivers/usb/dwc2/core.c b/drivers/usb/dwc2/core.c
index 7addf69..185d24c 100644
--- a/drivers/usb/dwc2/core.c
+++ b/drivers/usb/dwc2/core.c
@@ -162,7 +162,7 @@ int dwc2_exit_partial_power_down(struct dwc2_hsotg *hsotg, 
bool restore)
                                return ret;
                        }
                } else {
-                       ret = dwc2_restore_device_registers(hsotg);
+                       ret = dwc2_restore_device_registers(hsotg, 0);
                        if (ret) {
                                dev_err(hsotg->dev, "%s: failed to restore 
device registers\n",
                                        __func__);
diff --git a/drivers/usb/dwc2/core.h b/drivers/usb/dwc2/core.h
index 4cb95b3..60ad2e6 100644
--- a/drivers/usb/dwc2/core.h
+++ b/drivers/usb/dwc2/core.h
@@ -1183,7 +1183,7 @@ void dwc2_hsotg_core_init_disconnected(struct dwc2_hsotg 
*dwc2,
 int dwc2_hsotg_set_test_mode(struct dwc2_hsotg *hsotg, int testmode);
 #define dwc2_is_device_connected(hsotg) (hsotg->connected)
 int dwc2_backup_device_registers(struct dwc2_hsotg *hsotg);
-int dwc2_restore_device_registers(struct dwc2_hsotg *hsotg);
+int dwc2_restore_device_registers(struct dwc2_hsotg *hsotg, int remote_wakeup);
 int dwc2_hsotg_tx_fifo_count(struct dwc2_hsotg *hsotg);
 int dwc2_hsotg_tx_fifo_total_depth(struct dwc2_hsotg *hsotg);
 int dwc2_hsotg_tx_fifo_average_depth(struct dwc2_hsotg *hsotg);
@@ -1206,7 +1206,8 @@ static inline int dwc2_hsotg_set_test_mode(struct 
dwc2_hsotg *hsotg,
 #define dwc2_is_device_connected(hsotg) (0)
 static inline int dwc2_backup_device_registers(struct dwc2_hsotg *hsotg)
 { return 0; }
-static inline int dwc2_restore_device_registers(struct dwc2_hsotg *hsotg)
+static inline int dwc2_restore_device_registers(struct dwc2_hsotg *hsotg,
+                                               int remote_wakeup)
 { return 0; }
 static inline int dwc2_hsotg_tx_fifo_count(struct dwc2_hsotg *hsotg)
 { return 0; }
diff --git a/drivers/usb/dwc2/gadget.c b/drivers/usb/dwc2/gadget.c
index 3e969a5..3b082ed 100644
--- a/drivers/usb/dwc2/gadget.c
+++ b/drivers/usb/dwc2/gadget.c
@@ -4822,11 +4822,13 @@ int dwc2_backup_device_registers(struct dwc2_hsotg 
*hsotg)
  * if controller power were disabled.
  *
  * @hsotg: Programming view of the DWC_otg controller
+ * @remote_wakeup: Indicates whether resume is initiated by Device or Host.
+ *
+ * Return: 0 if successful, negative error code otherwise
  */
-int dwc2_restore_device_registers(struct dwc2_hsotg *hsotg)
+int dwc2_restore_device_registers(struct dwc2_hsotg *hsotg, int remote_wakeup)
 {
        struct dwc2_dregs_backup *dr;
-       u32 dctl;
        int i;
 
        dev_dbg(hsotg->dev, "%s\n", __func__);
@@ -4840,8 +4842,9 @@ int dwc2_restore_device_registers(struct dwc2_hsotg 
*hsotg)
        }
        dr->valid = false;
 
-       dwc2_writel(dr->dcfg, hsotg->regs + DCFG);
-       dwc2_writel(dr->dctl, hsotg->regs + DCTL);
+       if (!remote_wakeup)
+               dwc2_writel(dr->dctl, hsotg->regs + DCTL);
+
        dwc2_writel(dr->daintmsk, hsotg->regs + DAINTMSK);
        dwc2_writel(dr->diepmsk, hsotg->regs + DIEPMSK);
        dwc2_writel(dr->doepmsk, hsotg->regs + DOEPMSK);
@@ -4859,10 +4862,5 @@ int dwc2_restore_device_registers(struct dwc2_hsotg 
*hsotg)
                dwc2_writel(dr->doepdma[i], hsotg->regs + DOEPDMA(i));
        }
 
-       /* Set the Power-On Programming done bit */
-       dctl = dwc2_readl(hsotg->regs + DCTL);
-       dctl |= DCTL_PWRONPRGDONE;
-       dwc2_writel(dctl, hsotg->regs + DCTL);
-
        return 0;
 }
-- 
1.9.1

--
To unsubscribe from this list: send the line "unsubscribe linux-usb" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to