UPSTREAM: usb: dwc2: Move register save and restore functions
authorJohn Youn <johnyoun@synopsys.com>
Wed, 24 Feb 2016 03:54:57 +0000 (19:54 -0800)
committerHuang, Tao <huangtao@rock-chips.com>
Tue, 3 Jan 2017 10:48:27 +0000 (18:48 +0800)
Move the register save and restore functions into the host and gadget
specific files.

Change-Id: If9a11b19ee459d0cd1cd560f0302c83518b3f6af
Tested-by: Douglas Anderson <dianders@chromium.org>
Reviewed-by: Douglas Anderson <dianders@chromium.org>
Signed-off-by: John Youn <johnyoun@synopsys.com>
Signed-off-by: Felipe Balbi <balbi@kernel.org>
Signed-off-by: Huang, Tao <huangtao@rock-chips.com>
(cherry picked from commit 58e52ff6a6c3ce964c71b2dd9f06be426f993524)

drivers/usb/dwc2/core.c
drivers/usb/dwc2/core.h
drivers/usb/dwc2/gadget.c
drivers/usb/dwc2/hcd.c

index 28d3abd780fdff5757ee1bc14bee19a338e6850a..d5091b91ba494f6e808faf7bab06d44dee39bf22 100644 (file)
 #include "core.h"
 #include "hcd.h"
 
-#if IS_ENABLED(CONFIG_USB_DWC2_HOST) || IS_ENABLED(CONFIG_USB_DWC2_DUAL_ROLE)
-/**
- * dwc2_backup_host_registers() - Backup controller host registers.
- * When suspending usb bus, registers needs to be backuped
- * if controller power is disabled once suspended.
- *
- * @hsotg: Programming view of the DWC_otg controller
- */
-static int dwc2_backup_host_registers(struct dwc2_hsotg *hsotg)
-{
-       struct dwc2_hregs_backup *hr;
-       int i;
-
-       dev_dbg(hsotg->dev, "%s\n", __func__);
-
-       /* Backup Host regs */
-       hr = &hsotg->hr_backup;
-       hr->hcfg = dwc2_readl(hsotg->regs + HCFG);
-       hr->haintmsk = dwc2_readl(hsotg->regs + HAINTMSK);
-       for (i = 0; i < hsotg->core_params->host_channels; ++i)
-               hr->hcintmsk[i] = dwc2_readl(hsotg->regs + HCINTMSK(i));
-
-       hr->hprt0 = dwc2_read_hprt0(hsotg);
-       hr->hfir = dwc2_readl(hsotg->regs + HFIR);
-       hr->valid = true;
-
-       return 0;
-}
-
-/**
- * dwc2_restore_host_registers() - Restore controller host registers.
- * When resuming usb bus, device registers needs to be restored
- * if controller power were disabled.
- *
- * @hsotg: Programming view of the DWC_otg controller
- */
-static int dwc2_restore_host_registers(struct dwc2_hsotg *hsotg)
-{
-       struct dwc2_hregs_backup *hr;
-       int i;
-
-       dev_dbg(hsotg->dev, "%s\n", __func__);
-
-       /* Restore host regs */
-       hr = &hsotg->hr_backup;
-       if (!hr->valid) {
-               dev_err(hsotg->dev, "%s: no host registers to restore\n",
-                               __func__);
-               return -EINVAL;
-       }
-       hr->valid = false;
-
-       dwc2_writel(hr->hcfg, hsotg->regs + HCFG);
-       dwc2_writel(hr->haintmsk, hsotg->regs + HAINTMSK);
-
-       for (i = 0; i < hsotg->core_params->host_channels; ++i)
-               dwc2_writel(hr->hcintmsk[i], hsotg->regs + HCINTMSK(i));
-
-       dwc2_writel(hr->hprt0, hsotg->regs + HPRT0);
-       dwc2_writel(hr->hfir, hsotg->regs + HFIR);
-       hsotg->frame_number = 0;
-
-       return 0;
-}
-#else
-static inline int dwc2_backup_host_registers(struct dwc2_hsotg *hsotg)
-{ return 0; }
-
-static inline int dwc2_restore_host_registers(struct dwc2_hsotg *hsotg)
-{ return 0; }
-#endif
-
-#if IS_ENABLED(CONFIG_USB_DWC2_PERIPHERAL) || \
-       IS_ENABLED(CONFIG_USB_DWC2_DUAL_ROLE)
-/**
- * dwc2_backup_device_registers() - Backup controller device registers.
- * When suspending usb bus, registers needs to be backuped
- * if controller power is disabled once suspended.
- *
- * @hsotg: Programming view of the DWC_otg controller
- */
-static int dwc2_backup_device_registers(struct dwc2_hsotg *hsotg)
-{
-       struct dwc2_dregs_backup *dr;
-       int i;
-
-       dev_dbg(hsotg->dev, "%s\n", __func__);
-
-       /* Backup dev regs */
-       dr = &hsotg->dr_backup;
-
-       dr->dcfg = dwc2_readl(hsotg->regs + DCFG);
-       dr->dctl = dwc2_readl(hsotg->regs + DCTL);
-       dr->daintmsk = dwc2_readl(hsotg->regs + DAINTMSK);
-       dr->diepmsk = dwc2_readl(hsotg->regs + DIEPMSK);
-       dr->doepmsk = dwc2_readl(hsotg->regs + DOEPMSK);
-
-       for (i = 0; i < hsotg->num_of_eps; i++) {
-               /* Backup IN EPs */
-               dr->diepctl[i] = dwc2_readl(hsotg->regs + DIEPCTL(i));
-
-               /* Ensure DATA PID is correctly configured */
-               if (dr->diepctl[i] & DXEPCTL_DPID)
-                       dr->diepctl[i] |= DXEPCTL_SETD1PID;
-               else
-                       dr->diepctl[i] |= DXEPCTL_SETD0PID;
-
-               dr->dieptsiz[i] = dwc2_readl(hsotg->regs + DIEPTSIZ(i));
-               dr->diepdma[i] = dwc2_readl(hsotg->regs + DIEPDMA(i));
-
-               /* Backup OUT EPs */
-               dr->doepctl[i] = dwc2_readl(hsotg->regs + DOEPCTL(i));
-
-               /* Ensure DATA PID is correctly configured */
-               if (dr->doepctl[i] & DXEPCTL_DPID)
-                       dr->doepctl[i] |= DXEPCTL_SETD1PID;
-               else
-                       dr->doepctl[i] |= DXEPCTL_SETD0PID;
-
-               dr->doeptsiz[i] = dwc2_readl(hsotg->regs + DOEPTSIZ(i));
-               dr->doepdma[i] = dwc2_readl(hsotg->regs + DOEPDMA(i));
-       }
-       dr->valid = true;
-       return 0;
-}
-
-/**
- * dwc2_restore_device_registers() - Restore controller device registers.
- * When resuming usb bus, device registers needs to be restored
- * if controller power were disabled.
- *
- * @hsotg: Programming view of the DWC_otg controller
- */
-static int dwc2_restore_device_registers(struct dwc2_hsotg *hsotg)
-{
-       struct dwc2_dregs_backup *dr;
-       u32 dctl;
-       int i;
-
-       dev_dbg(hsotg->dev, "%s\n", __func__);
-
-       /* Restore dev regs */
-       dr = &hsotg->dr_backup;
-       if (!dr->valid) {
-               dev_err(hsotg->dev, "%s: no device registers to restore\n",
-                               __func__);
-               return -EINVAL;
-       }
-       dr->valid = false;
-
-       dwc2_writel(dr->dcfg, hsotg->regs + DCFG);
-       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);
-
-       for (i = 0; i < hsotg->num_of_eps; i++) {
-               /* Restore IN EPs */
-               dwc2_writel(dr->diepctl[i], hsotg->regs + DIEPCTL(i));
-               dwc2_writel(dr->dieptsiz[i], hsotg->regs + DIEPTSIZ(i));
-               dwc2_writel(dr->diepdma[i], hsotg->regs + DIEPDMA(i));
-
-               /* Restore OUT EPs */
-               dwc2_writel(dr->doepctl[i], hsotg->regs + DOEPCTL(i));
-               dwc2_writel(dr->doeptsiz[i], hsotg->regs + DOEPTSIZ(i));
-               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;
-}
-#else
-static inline int dwc2_backup_device_registers(struct dwc2_hsotg *hsotg)
-{ return 0; }
-
-static inline int dwc2_restore_device_registers(struct dwc2_hsotg *hsotg)
-{ return 0; }
-#endif
-
 /**
  * dwc2_backup_global_registers() - Backup global controller registers.
  * When suspending usb bus, registers needs to be backuped
index ceba0c5986fd30927e5fa1286d586fee2f77b468..a1d74d18359d66057f8cc0bfd441dc014a7a1f4b 100644 (file)
@@ -1323,6 +1323,8 @@ extern void dwc2_hsotg_core_connect(struct dwc2_hsotg *hsotg);
 extern void dwc2_hsotg_disconnect(struct dwc2_hsotg *dwc2);
 extern 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);
 #else
 static inline int dwc2_hsotg_remove(struct dwc2_hsotg *dwc2)
 { return 0; }
@@ -1340,6 +1342,10 @@ static inline int dwc2_hsotg_set_test_mode(struct dwc2_hsotg *hsotg,
                                                        int testmode)
 { return 0; }
 #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)
+{ return 0; }
 #endif
 
 #if IS_ENABLED(CONFIG_USB_DWC2_HOST) || IS_ENABLED(CONFIG_USB_DWC2_DUAL_ROLE)
@@ -1348,6 +1354,8 @@ extern int dwc2_hcd_get_future_frame_number(struct dwc2_hsotg *hsotg, int us);
 extern void dwc2_hcd_connect(struct dwc2_hsotg *hsotg);
 extern void dwc2_hcd_disconnect(struct dwc2_hsotg *hsotg, bool force);
 extern void dwc2_hcd_start(struct dwc2_hsotg *hsotg);
+int dwc2_backup_host_registers(struct dwc2_hsotg *hsotg);
+int dwc2_restore_host_registers(struct dwc2_hsotg *hsotg);
 #else
 static inline int dwc2_hcd_get_frame_number(struct dwc2_hsotg *hsotg)
 { return 0; }
@@ -1360,6 +1368,11 @@ static inline void dwc2_hcd_start(struct dwc2_hsotg *hsotg) {}
 static inline void dwc2_hcd_remove(struct dwc2_hsotg *hsotg) {}
 static inline int dwc2_hcd_init(struct dwc2_hsotg *hsotg, int irq)
 { return 0; }
+static inline int dwc2_backup_host_registers(struct dwc2_hsotg *hsotg)
+{ return 0; }
+static inline int dwc2_restore_host_registers(struct dwc2_hsotg *hsotg)
+{ return 0; }
+
 #endif
 
 #endif /* __DWC2_CORE_H__ */
index 422ab7da4eb51b99e238900f413d069d62a468c2..e9940dd004e46c11472f776d79aebddc6497a906 100644 (file)
@@ -3668,3 +3668,105 @@ int dwc2_hsotg_resume(struct dwc2_hsotg *hsotg)
 
        return 0;
 }
+
+/**
+ * dwc2_backup_device_registers() - Backup controller device registers.
+ * When suspending usb bus, registers needs to be backuped
+ * if controller power is disabled once suspended.
+ *
+ * @hsotg: Programming view of the DWC_otg controller
+ */
+int dwc2_backup_device_registers(struct dwc2_hsotg *hsotg)
+{
+       struct dwc2_dregs_backup *dr;
+       int i;
+
+       dev_dbg(hsotg->dev, "%s\n", __func__);
+
+       /* Backup dev regs */
+       dr = &hsotg->dr_backup;
+
+       dr->dcfg = dwc2_readl(hsotg->regs + DCFG);
+       dr->dctl = dwc2_readl(hsotg->regs + DCTL);
+       dr->daintmsk = dwc2_readl(hsotg->regs + DAINTMSK);
+       dr->diepmsk = dwc2_readl(hsotg->regs + DIEPMSK);
+       dr->doepmsk = dwc2_readl(hsotg->regs + DOEPMSK);
+
+       for (i = 0; i < hsotg->num_of_eps; i++) {
+               /* Backup IN EPs */
+               dr->diepctl[i] = dwc2_readl(hsotg->regs + DIEPCTL(i));
+
+               /* Ensure DATA PID is correctly configured */
+               if (dr->diepctl[i] & DXEPCTL_DPID)
+                       dr->diepctl[i] |= DXEPCTL_SETD1PID;
+               else
+                       dr->diepctl[i] |= DXEPCTL_SETD0PID;
+
+               dr->dieptsiz[i] = dwc2_readl(hsotg->regs + DIEPTSIZ(i));
+               dr->diepdma[i] = dwc2_readl(hsotg->regs + DIEPDMA(i));
+
+               /* Backup OUT EPs */
+               dr->doepctl[i] = dwc2_readl(hsotg->regs + DOEPCTL(i));
+
+               /* Ensure DATA PID is correctly configured */
+               if (dr->doepctl[i] & DXEPCTL_DPID)
+                       dr->doepctl[i] |= DXEPCTL_SETD1PID;
+               else
+                       dr->doepctl[i] |= DXEPCTL_SETD0PID;
+
+               dr->doeptsiz[i] = dwc2_readl(hsotg->regs + DOEPTSIZ(i));
+               dr->doepdma[i] = dwc2_readl(hsotg->regs + DOEPDMA(i));
+       }
+       dr->valid = true;
+       return 0;
+}
+
+/**
+ * dwc2_restore_device_registers() - Restore controller device registers.
+ * When resuming usb bus, device registers needs to be restored
+ * if controller power were disabled.
+ *
+ * @hsotg: Programming view of the DWC_otg controller
+ */
+int dwc2_restore_device_registers(struct dwc2_hsotg *hsotg)
+{
+       struct dwc2_dregs_backup *dr;
+       u32 dctl;
+       int i;
+
+       dev_dbg(hsotg->dev, "%s\n", __func__);
+
+       /* Restore dev regs */
+       dr = &hsotg->dr_backup;
+       if (!dr->valid) {
+               dev_err(hsotg->dev, "%s: no device registers to restore\n",
+                       __func__);
+               return -EINVAL;
+       }
+       dr->valid = false;
+
+       dwc2_writel(dr->dcfg, hsotg->regs + DCFG);
+       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);
+
+       for (i = 0; i < hsotg->num_of_eps; i++) {
+               /* Restore IN EPs */
+               dwc2_writel(dr->diepctl[i], hsotg->regs + DIEPCTL(i));
+               dwc2_writel(dr->dieptsiz[i], hsotg->regs + DIEPTSIZ(i));
+               dwc2_writel(dr->diepdma[i], hsotg->regs + DIEPDMA(i));
+
+               /* Restore OUT EPs */
+               dwc2_writel(dr->doepctl[i], hsotg->regs + DOEPCTL(i));
+               dwc2_writel(dr->doeptsiz[i], hsotg->regs + DOEPTSIZ(i));
+               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;
+}
index 2b5a706e7c32c9a2009fb47818b4c9a5c7164381..b403f6ad27b9fc2d2df90a1c0f55235d213e7240 100644 (file)
@@ -3433,3 +3433,67 @@ void dwc2_hcd_remove(struct dwc2_hsotg *hsotg)
        kfree(hsotg->frame_num_array);
 #endif
 }
+
+/**
+ * dwc2_backup_host_registers() - Backup controller host registers.
+ * When suspending usb bus, registers needs to be backuped
+ * if controller power is disabled once suspended.
+ *
+ * @hsotg: Programming view of the DWC_otg controller
+ */
+int dwc2_backup_host_registers(struct dwc2_hsotg *hsotg)
+{
+       struct dwc2_hregs_backup *hr;
+       int i;
+
+       dev_dbg(hsotg->dev, "%s\n", __func__);
+
+       /* Backup Host regs */
+       hr = &hsotg->hr_backup;
+       hr->hcfg = dwc2_readl(hsotg->regs + HCFG);
+       hr->haintmsk = dwc2_readl(hsotg->regs + HAINTMSK);
+       for (i = 0; i < hsotg->core_params->host_channels; ++i)
+               hr->hcintmsk[i] = dwc2_readl(hsotg->regs + HCINTMSK(i));
+
+       hr->hprt0 = dwc2_read_hprt0(hsotg);
+       hr->hfir = dwc2_readl(hsotg->regs + HFIR);
+       hr->valid = true;
+
+       return 0;
+}
+
+/**
+ * dwc2_restore_host_registers() - Restore controller host registers.
+ * When resuming usb bus, device registers needs to be restored
+ * if controller power were disabled.
+ *
+ * @hsotg: Programming view of the DWC_otg controller
+ */
+int dwc2_restore_host_registers(struct dwc2_hsotg *hsotg)
+{
+       struct dwc2_hregs_backup *hr;
+       int i;
+
+       dev_dbg(hsotg->dev, "%s\n", __func__);
+
+       /* Restore host regs */
+       hr = &hsotg->hr_backup;
+       if (!hr->valid) {
+               dev_err(hsotg->dev, "%s: no host registers to restore\n",
+                       __func__);
+               return -EINVAL;
+       }
+       hr->valid = false;
+
+       dwc2_writel(hr->hcfg, hsotg->regs + HCFG);
+       dwc2_writel(hr->haintmsk, hsotg->regs + HAINTMSK);
+
+       for (i = 0; i < hsotg->core_params->host_channels; ++i)
+               dwc2_writel(hr->hcintmsk[i], hsotg->regs + HCINTMSK(i));
+
+       dwc2_writel(hr->hprt0, hsotg->regs + HPRT0);
+       dwc2_writel(hr->hfir, hsotg->regs + HFIR);
+       hsotg->frame_number = 0;
+
+       return 0;
+}