Message ID | 20240821214052.6800-8-wahrenst@gmx.net (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
Series | ARM: bcm2835: Implement initial S2Idle for Raspberry Pi | expand |
Hi Stefan,
kernel test robot noticed the following build warnings:
[auto build test WARNING on linus/master]
[also build test WARNING on arm/for-next arm/fixes v6.11-rc4 next-20240822]
[If your patch is applied to the wrong git tree, kindly drop us a note.
And when submitting patch, we suggest to use '--base' as documented in
https://git-scm.com/docs/git-format-patch#_base_tree_information]
url: https://github.com/intel-lab-lkp/linux/commits/Stefan-Wahren/mailbox-bcm2835-Fix-timeout-during-suspend-mode/20240822-063725
base: linus/master
patch link: https://lore.kernel.org/r/20240821214052.6800-8-wahrenst%40gmx.net
patch subject: [PATCH V3 7/9] usb: dwc2: Refactor backup/restore of registers
config: x86_64-randconfig-161-20240822 (https://download.01.org/0day-ci/archive/20240822/202408221629.jv9AgCrF-lkp@intel.com/config)
compiler: clang version 18.1.5 (https://github.com/llvm/llvm-project 617a15a9eac96088ae5e9134248d8236e34b91b1)
reproduce (this is a W=1 build): (https://download.01.org/0day-ci/archive/20240822/202408221629.jv9AgCrF-lkp@intel.com/reproduce)
If you fix the issue in a separate patch/commit (i.e. not just a new version of
the same patch/commit), kindly add following tags
| Reported-by: kernel test robot <lkp@intel.com>
| Closes: https://lore.kernel.org/oe-kbuild-all/202408221629.jv9AgCrF-lkp@intel.com/
All warnings (new ones prefixed by >>):
>> drivers/usb/dwc2/gadget.c:5605:28: warning: variable 'dr' set but not used [-Wunused-but-set-variable]
5605 | struct dwc2_dregs_backup *dr;
| ^
1 warning generated.
vim +/dr +5605 drivers/usb/dwc2/gadget.c
be2b960e57154a Artur Petrosyan 2021-04-08 5588
be2b960e57154a Artur Petrosyan 2021-04-08 5589 /*
be2b960e57154a Artur Petrosyan 2021-04-08 5590 * dwc2_gadget_exit_partial_power_down() - Exit controller from device partial
be2b960e57154a Artur Petrosyan 2021-04-08 5591 * power down.
be2b960e57154a Artur Petrosyan 2021-04-08 5592 *
be2b960e57154a Artur Petrosyan 2021-04-08 5593 * @hsotg: Programming view of the DWC_otg controller
be2b960e57154a Artur Petrosyan 2021-04-08 5594 * @restore: indicates whether need to restore the registers or not.
be2b960e57154a Artur Petrosyan 2021-04-08 5595 *
be2b960e57154a Artur Petrosyan 2021-04-08 5596 * Return: non-zero if failed to exit device partial power down.
be2b960e57154a Artur Petrosyan 2021-04-08 5597 *
be2b960e57154a Artur Petrosyan 2021-04-08 5598 * This function is for exiting from device mode partial power down.
be2b960e57154a Artur Petrosyan 2021-04-08 5599 */
be2b960e57154a Artur Petrosyan 2021-04-08 5600 int dwc2_gadget_exit_partial_power_down(struct dwc2_hsotg *hsotg,
be2b960e57154a Artur Petrosyan 2021-04-08 5601 bool restore)
be2b960e57154a Artur Petrosyan 2021-04-08 5602 {
be2b960e57154a Artur Petrosyan 2021-04-08 5603 u32 pcgcctl;
be2b960e57154a Artur Petrosyan 2021-04-08 5604 u32 dctl;
be2b960e57154a Artur Petrosyan 2021-04-08 @5605 struct dwc2_dregs_backup *dr;
be2b960e57154a Artur Petrosyan 2021-04-08 5606 int ret = 0;
be2b960e57154a Artur Petrosyan 2021-04-08 5607
be2b960e57154a Artur Petrosyan 2021-04-08 5608 dr = &hsotg->dr_backup;
be2b960e57154a Artur Petrosyan 2021-04-08 5609
be2b960e57154a Artur Petrosyan 2021-04-08 5610 dev_dbg(hsotg->dev, "Exiting device partial Power Down started.\n");
be2b960e57154a Artur Petrosyan 2021-04-08 5611
be2b960e57154a Artur Petrosyan 2021-04-08 5612 pcgcctl = dwc2_readl(hsotg, PCGCTL);
be2b960e57154a Artur Petrosyan 2021-04-08 5613 pcgcctl &= ~PCGCTL_STOPPCLK;
be2b960e57154a Artur Petrosyan 2021-04-08 5614 dwc2_writel(hsotg, pcgcctl, PCGCTL);
be2b960e57154a Artur Petrosyan 2021-04-08 5615
be2b960e57154a Artur Petrosyan 2021-04-08 5616 pcgcctl = dwc2_readl(hsotg, PCGCTL);
be2b960e57154a Artur Petrosyan 2021-04-08 5617 pcgcctl &= ~PCGCTL_PWRCLMP;
be2b960e57154a Artur Petrosyan 2021-04-08 5618 dwc2_writel(hsotg, pcgcctl, PCGCTL);
be2b960e57154a Artur Petrosyan 2021-04-08 5619
be2b960e57154a Artur Petrosyan 2021-04-08 5620 pcgcctl = dwc2_readl(hsotg, PCGCTL);
be2b960e57154a Artur Petrosyan 2021-04-08 5621 pcgcctl &= ~PCGCTL_RSTPDWNMODULE;
be2b960e57154a Artur Petrosyan 2021-04-08 5622 dwc2_writel(hsotg, pcgcctl, PCGCTL);
be2b960e57154a Artur Petrosyan 2021-04-08 5623
be2b960e57154a Artur Petrosyan 2021-04-08 5624 udelay(100);
be2b960e57154a Artur Petrosyan 2021-04-08 5625 if (restore) {
78c09c66698a77 Stefan Wahren 2024-08-21 5626 ret = dwc2_gadget_restore_critical_registers(hsotg);
78c09c66698a77 Stefan Wahren 2024-08-21 5627 if (ret)
be2b960e57154a Artur Petrosyan 2021-04-08 5628 return ret;
be2b960e57154a Artur Petrosyan 2021-04-08 5629 }
be2b960e57154a Artur Petrosyan 2021-04-08 5630
be2b960e57154a Artur Petrosyan 2021-04-08 5631 /* Set the Power-On Programming done bit */
be2b960e57154a Artur Petrosyan 2021-04-08 5632 dctl = dwc2_readl(hsotg, DCTL);
be2b960e57154a Artur Petrosyan 2021-04-08 5633 dctl |= DCTL_PWRONPRGDONE;
be2b960e57154a Artur Petrosyan 2021-04-08 5634 dwc2_writel(hsotg, dctl, DCTL);
be2b960e57154a Artur Petrosyan 2021-04-08 5635
be2b960e57154a Artur Petrosyan 2021-04-08 5636 /* Set in_ppd flag to 0 as here core exits from suspend. */
be2b960e57154a Artur Petrosyan 2021-04-08 5637 hsotg->in_ppd = 0;
be2b960e57154a Artur Petrosyan 2021-04-08 5638 hsotg->lx_state = DWC2_L0;
be2b960e57154a Artur Petrosyan 2021-04-08 5639
be2b960e57154a Artur Petrosyan 2021-04-08 5640 dev_dbg(hsotg->dev, "Exiting device partial Power Down completed.\n");
be2b960e57154a Artur Petrosyan 2021-04-08 5641 return ret;
be2b960e57154a Artur Petrosyan 2021-04-08 5642 }
012466fc8ccc01 Artur Petrosyan 2021-04-13 5643
Am 21.08.24 um 23:40 schrieb Stefan Wahren: > The DWC2 runtime PM code reuses similar patterns to backup and > restore the registers. So consolidate them in USB mode specific > variants. This also has the advantage it is usable for further > PM improvements. > > Signed-off-by: Stefan Wahren <wahrenst@gmx.net> > --- > drivers/usb/dwc2/core.h | 12 +++++ > drivers/usb/dwc2/gadget.c | 101 +++++++++++++++++++------------------- > drivers/usb/dwc2/hcd.c | 99 +++++++++++++++++++------------------ > 3 files changed, 114 insertions(+), 98 deletions(-) > > diff --git a/drivers/usb/dwc2/core.h b/drivers/usb/dwc2/core.h > index 2bd74f3033ed..81e8632f29ed 100644 > --- a/drivers/usb/dwc2/core.h > +++ b/drivers/usb/dwc2/core.h > @@ -1435,6 +1435,8 @@ int dwc2_hsotg_tx_fifo_total_depth(struct dwc2_hsotg *hsotg); > int dwc2_hsotg_tx_fifo_average_depth(struct dwc2_hsotg *hsotg); > void dwc2_gadget_init_lpm(struct dwc2_hsotg *hsotg); > void dwc2_gadget_program_ref_clk(struct dwc2_hsotg *hsotg); > +int dwc2_gadget_backup_critical_registers(struct dwc2_hsotg *hsotg); > +int dwc2_gadget_restore_critical_registers(struct dwc2_hsotg *hsotg); > static inline void dwc2_clear_fifo_map(struct dwc2_hsotg *hsotg) > { hsotg->fifo_map = 0; } > #else > @@ -1482,6 +1484,10 @@ static inline int dwc2_hsotg_tx_fifo_average_depth(struct dwc2_hsotg *hsotg) > { return 0; } > static inline void dwc2_gadget_init_lpm(struct dwc2_hsotg *hsotg) {} > static inline void dwc2_gadget_program_ref_clk(struct dwc2_hsotg *hsotg) {} > +static inline int dwc2_gadget_backup_critical_registers(struct dwc2_hsotg *hsotg) > +{ return 0; } > +static inline int dwc2_gadget_restore_critical_registers(struct dwc2_hsotg *hsotg) > +{ return 0; } > static inline void dwc2_clear_fifo_map(struct dwc2_hsotg *hsotg) {} > #endif > > @@ -1505,6 +1511,8 @@ int dwc2_host_exit_partial_power_down(struct dwc2_hsotg *hsotg, > void dwc2_host_enter_clock_gating(struct dwc2_hsotg *hsotg); > void dwc2_host_exit_clock_gating(struct dwc2_hsotg *hsotg, int rem_wakeup); > bool dwc2_host_can_poweroff_phy(struct dwc2_hsotg *dwc2); > +int dwc2_host_backup_critical_registers(struct dwc2_hsotg *hsotg); > +int dwc2_host_restore_critical_registers(struct dwc2_hsotg *hsotg); > static inline void dwc2_host_schedule_phy_reset(struct dwc2_hsotg *hsotg) > { schedule_work(&hsotg->phy_reset_work); } > #else > @@ -1544,6 +1552,10 @@ static inline void dwc2_host_exit_clock_gating(struct dwc2_hsotg *hsotg, > int rem_wakeup) {} > static inline bool dwc2_host_can_poweroff_phy(struct dwc2_hsotg *dwc2) > { return false; } > +static inline int dwc2_host_backup_critical_registers(struct dwc2_hsotg *hsotg) > +{ return 0; } > +static inline int dwc2_host_restore_critical_registers(struct dwc2_hsotg *hsotg) > +{ return 0; } > static inline void dwc2_host_schedule_phy_reset(struct dwc2_hsotg *hsotg) {} > > #endif > diff --git a/drivers/usb/dwc2/gadget.c b/drivers/usb/dwc2/gadget.c > index e7bf9cc635be..0bff748bcf74 100644 > --- a/drivers/usb/dwc2/gadget.c > +++ b/drivers/usb/dwc2/gadget.c > @@ -5309,6 +5309,49 @@ void dwc2_gadget_program_ref_clk(struct dwc2_hsotg *hsotg) > dev_dbg(hsotg->dev, "GREFCLK=0x%08x\n", dwc2_readl(hsotg, GREFCLK)); > } > > +int dwc2_gadget_backup_critical_registers(struct dwc2_hsotg *hsotg) > +{ > + int ret; > + > + /* Backup all registers */ > + ret = dwc2_backup_global_registers(hsotg); > + if (ret) { > + dev_err(hsotg->dev, "%s: failed to backup global registers\n", > + __func__); > + return ret; > + } > + > + ret = dwc2_backup_device_registers(hsotg); > + if (ret) { > + dev_err(hsotg->dev, "%s: failed to backup device registers\n", > + __func__); > + return ret; > + } > + > + return 0; > +} > + > +int dwc2_gadget_restore_critical_registers(struct dwc2_hsotg *hsotg) > +{ > + int ret; > + > + ret = dwc2_restore_global_registers(hsotg); > + if (ret) { > + dev_err(hsotg->dev, "%s: failed to restore registers\n", > + __func__); > + return ret; > + } > + > + ret = dwc2_restore_device_registers(hsotg, 0); > + if (ret) { > + dev_err(hsotg->dev, "%s: failed to restore device registers\n", > + __func__); > + return ret; > + } > + > + return 0; > +} > + > /** > * dwc2_gadget_enter_hibernation() - Put controller in Hibernation. > * > @@ -5326,18 +5369,9 @@ int dwc2_gadget_enter_hibernation(struct dwc2_hsotg *hsotg) > /* Change to L2(suspend) state */ > hsotg->lx_state = DWC2_L2; > dev_dbg(hsotg->dev, "Start of hibernation completed\n"); > - ret = dwc2_backup_global_registers(hsotg); > - if (ret) { > - dev_err(hsotg->dev, "%s: failed to backup global registers\n", > - __func__); > - return ret; > - } > - ret = dwc2_backup_device_registers(hsotg); > - if (ret) { > - dev_err(hsotg->dev, "%s: failed to backup device registers\n", > - __func__); > + ret = dwc2_gadget_backup_critical_registers(hsotg); > + if (ret) > return ret; > - } > > gpwrdn = GPWRDN_PWRDNRSTN; > udelay(10); > @@ -5483,20 +5517,9 @@ int dwc2_gadget_exit_hibernation(struct dwc2_hsotg *hsotg, > dwc2_writel(hsotg, 0xffffffff, GINTSTS); > > /* Restore global registers */ > - ret = dwc2_restore_global_registers(hsotg); > - if (ret) { > - dev_err(hsotg->dev, "%s: failed to restore registers\n", > - __func__); > - return ret; > - } > - > - /* Restore device registers */ > - ret = dwc2_restore_device_registers(hsotg, rem_wakeup); > - if (ret) { > - dev_err(hsotg->dev, "%s: failed to restore device registers\n", > - __func__); > + ret = dwc2_gadget_restore_critical_registers(hsotg); > + if (ret) > return ret; > - } > > if (rem_wakeup) { > mdelay(10); > @@ -5530,19 +5553,9 @@ int dwc2_gadget_enter_partial_power_down(struct dwc2_hsotg *hsotg) > dev_dbg(hsotg->dev, "Entering device partial power down started.\n"); > > /* Backup all registers */ > - ret = dwc2_backup_global_registers(hsotg); > - if (ret) { > - dev_err(hsotg->dev, "%s: failed to backup global registers\n", > - __func__); > - return ret; > - } > - > - ret = dwc2_backup_device_registers(hsotg); > - if (ret) { > - dev_err(hsotg->dev, "%s: failed to backup device registers\n", > - __func__); > + ret = dwc2_gadget_backup_critical_registers(hsotg); > + if (ret) > return ret; > - } > > /* > * Clear any pending interrupts since dwc2 will not be able to > @@ -5610,21 +5623,9 @@ int dwc2_gadget_exit_partial_power_down(struct dwc2_hsotg *hsotg, > > udelay(100); > if (restore) { > - ret = dwc2_restore_global_registers(hsotg); > - if (ret) { > - dev_err(hsotg->dev, "%s: failed to restore registers\n", > - __func__); > - return ret; > - } > - /* Restore DCFG */ > - dwc2_writel(hsotg, dr->dcfg, DCFG); Oh dear, i accidentally dropped that. I will fix this. Thanks goes to kernel test robot
diff --git a/drivers/usb/dwc2/core.h b/drivers/usb/dwc2/core.h index 2bd74f3033ed..81e8632f29ed 100644 --- a/drivers/usb/dwc2/core.h +++ b/drivers/usb/dwc2/core.h @@ -1435,6 +1435,8 @@ int dwc2_hsotg_tx_fifo_total_depth(struct dwc2_hsotg *hsotg); int dwc2_hsotg_tx_fifo_average_depth(struct dwc2_hsotg *hsotg); void dwc2_gadget_init_lpm(struct dwc2_hsotg *hsotg); void dwc2_gadget_program_ref_clk(struct dwc2_hsotg *hsotg); +int dwc2_gadget_backup_critical_registers(struct dwc2_hsotg *hsotg); +int dwc2_gadget_restore_critical_registers(struct dwc2_hsotg *hsotg); static inline void dwc2_clear_fifo_map(struct dwc2_hsotg *hsotg) { hsotg->fifo_map = 0; } #else @@ -1482,6 +1484,10 @@ static inline int dwc2_hsotg_tx_fifo_average_depth(struct dwc2_hsotg *hsotg) { return 0; } static inline void dwc2_gadget_init_lpm(struct dwc2_hsotg *hsotg) {} static inline void dwc2_gadget_program_ref_clk(struct dwc2_hsotg *hsotg) {} +static inline int dwc2_gadget_backup_critical_registers(struct dwc2_hsotg *hsotg) +{ return 0; } +static inline int dwc2_gadget_restore_critical_registers(struct dwc2_hsotg *hsotg) +{ return 0; } static inline void dwc2_clear_fifo_map(struct dwc2_hsotg *hsotg) {} #endif @@ -1505,6 +1511,8 @@ int dwc2_host_exit_partial_power_down(struct dwc2_hsotg *hsotg, void dwc2_host_enter_clock_gating(struct dwc2_hsotg *hsotg); void dwc2_host_exit_clock_gating(struct dwc2_hsotg *hsotg, int rem_wakeup); bool dwc2_host_can_poweroff_phy(struct dwc2_hsotg *dwc2); +int dwc2_host_backup_critical_registers(struct dwc2_hsotg *hsotg); +int dwc2_host_restore_critical_registers(struct dwc2_hsotg *hsotg); static inline void dwc2_host_schedule_phy_reset(struct dwc2_hsotg *hsotg) { schedule_work(&hsotg->phy_reset_work); } #else @@ -1544,6 +1552,10 @@ static inline void dwc2_host_exit_clock_gating(struct dwc2_hsotg *hsotg, int rem_wakeup) {} static inline bool dwc2_host_can_poweroff_phy(struct dwc2_hsotg *dwc2) { return false; } +static inline int dwc2_host_backup_critical_registers(struct dwc2_hsotg *hsotg) +{ return 0; } +static inline int dwc2_host_restore_critical_registers(struct dwc2_hsotg *hsotg) +{ return 0; } static inline void dwc2_host_schedule_phy_reset(struct dwc2_hsotg *hsotg) {} #endif diff --git a/drivers/usb/dwc2/gadget.c b/drivers/usb/dwc2/gadget.c index e7bf9cc635be..0bff748bcf74 100644 --- a/drivers/usb/dwc2/gadget.c +++ b/drivers/usb/dwc2/gadget.c @@ -5309,6 +5309,49 @@ void dwc2_gadget_program_ref_clk(struct dwc2_hsotg *hsotg) dev_dbg(hsotg->dev, "GREFCLK=0x%08x\n", dwc2_readl(hsotg, GREFCLK)); } +int dwc2_gadget_backup_critical_registers(struct dwc2_hsotg *hsotg) +{ + int ret; + + /* Backup all registers */ + ret = dwc2_backup_global_registers(hsotg); + if (ret) { + dev_err(hsotg->dev, "%s: failed to backup global registers\n", + __func__); + return ret; + } + + ret = dwc2_backup_device_registers(hsotg); + if (ret) { + dev_err(hsotg->dev, "%s: failed to backup device registers\n", + __func__); + return ret; + } + + return 0; +} + +int dwc2_gadget_restore_critical_registers(struct dwc2_hsotg *hsotg) +{ + int ret; + + ret = dwc2_restore_global_registers(hsotg); + if (ret) { + dev_err(hsotg->dev, "%s: failed to restore registers\n", + __func__); + return ret; + } + + ret = dwc2_restore_device_registers(hsotg, 0); + if (ret) { + dev_err(hsotg->dev, "%s: failed to restore device registers\n", + __func__); + return ret; + } + + return 0; +} + /** * dwc2_gadget_enter_hibernation() - Put controller in Hibernation. * @@ -5326,18 +5369,9 @@ int dwc2_gadget_enter_hibernation(struct dwc2_hsotg *hsotg) /* Change to L2(suspend) state */ hsotg->lx_state = DWC2_L2; dev_dbg(hsotg->dev, "Start of hibernation completed\n"); - ret = dwc2_backup_global_registers(hsotg); - if (ret) { - dev_err(hsotg->dev, "%s: failed to backup global registers\n", - __func__); - return ret; - } - ret = dwc2_backup_device_registers(hsotg); - if (ret) { - dev_err(hsotg->dev, "%s: failed to backup device registers\n", - __func__); + ret = dwc2_gadget_backup_critical_registers(hsotg); + if (ret) return ret; - } gpwrdn = GPWRDN_PWRDNRSTN; udelay(10); @@ -5483,20 +5517,9 @@ int dwc2_gadget_exit_hibernation(struct dwc2_hsotg *hsotg, dwc2_writel(hsotg, 0xffffffff, GINTSTS); /* Restore global registers */ - ret = dwc2_restore_global_registers(hsotg); - if (ret) { - dev_err(hsotg->dev, "%s: failed to restore registers\n", - __func__); - return ret; - } - - /* Restore device registers */ - ret = dwc2_restore_device_registers(hsotg, rem_wakeup); - if (ret) { - dev_err(hsotg->dev, "%s: failed to restore device registers\n", - __func__); + ret = dwc2_gadget_restore_critical_registers(hsotg); + if (ret) return ret; - } if (rem_wakeup) { mdelay(10); @@ -5530,19 +5553,9 @@ int dwc2_gadget_enter_partial_power_down(struct dwc2_hsotg *hsotg) dev_dbg(hsotg->dev, "Entering device partial power down started.\n"); /* Backup all registers */ - ret = dwc2_backup_global_registers(hsotg); - if (ret) { - dev_err(hsotg->dev, "%s: failed to backup global registers\n", - __func__); - return ret; - } - - ret = dwc2_backup_device_registers(hsotg); - if (ret) { - dev_err(hsotg->dev, "%s: failed to backup device registers\n", - __func__); + ret = dwc2_gadget_backup_critical_registers(hsotg); + if (ret) return ret; - } /* * Clear any pending interrupts since dwc2 will not be able to @@ -5610,21 +5623,9 @@ int dwc2_gadget_exit_partial_power_down(struct dwc2_hsotg *hsotg, udelay(100); if (restore) { - ret = dwc2_restore_global_registers(hsotg); - if (ret) { - dev_err(hsotg->dev, "%s: failed to restore registers\n", - __func__); - return ret; - } - /* Restore DCFG */ - dwc2_writel(hsotg, dr->dcfg, DCFG); - - ret = dwc2_restore_device_registers(hsotg, 0); - if (ret) { - dev_err(hsotg->dev, "%s: failed to restore device registers\n", - __func__); + ret = dwc2_gadget_restore_critical_registers(hsotg); + if (ret) return ret; - } } /* Set the Power-On Programming done bit */ diff --git a/drivers/usb/dwc2/hcd.c b/drivers/usb/dwc2/hcd.c index cb54390e7de4..32fa606e5d59 100644 --- a/drivers/usb/dwc2/hcd.c +++ b/drivers/usb/dwc2/hcd.c @@ -5477,6 +5477,49 @@ int dwc2_restore_host_registers(struct dwc2_hsotg *hsotg) return 0; } +int dwc2_host_backup_critical_registers(struct dwc2_hsotg *hsotg) +{ + int ret; + + /* Backup all registers */ + ret = dwc2_backup_global_registers(hsotg); + if (ret) { + dev_err(hsotg->dev, "%s: failed to backup global registers\n", + __func__); + return ret; + } + + ret = dwc2_backup_host_registers(hsotg); + if (ret) { + dev_err(hsotg->dev, "%s: failed to backup host registers\n", + __func__); + return ret; + } + + return 0; +} + +int dwc2_host_restore_critical_registers(struct dwc2_hsotg *hsotg) +{ + int ret; + + ret = dwc2_restore_global_registers(hsotg); + if (ret) { + dev_err(hsotg->dev, "%s: failed to restore registers\n", + __func__); + return ret; + } + + ret = dwc2_restore_host_registers(hsotg); + if (ret) { + dev_err(hsotg->dev, "%s: failed to restore host registers\n", + __func__); + return ret; + } + + return 0; +} + /** * dwc2_host_enter_hibernation() - Put controller in Hibernation. * @@ -5492,18 +5535,9 @@ int dwc2_host_enter_hibernation(struct dwc2_hsotg *hsotg) u32 gpwrdn; dev_dbg(hsotg->dev, "Preparing host for hibernation\n"); - ret = dwc2_backup_global_registers(hsotg); - if (ret) { - dev_err(hsotg->dev, "%s: failed to backup global registers\n", - __func__); - return ret; - } - ret = dwc2_backup_host_registers(hsotg); - if (ret) { - dev_err(hsotg->dev, "%s: failed to backup host registers\n", - __func__); + ret = dwc2_host_backup_critical_registers(hsotg); + if (ret) return ret; - } /* Enter USB Suspend Mode */ hprt0 = dwc2_readl(hsotg, HPRT0); @@ -5697,20 +5731,9 @@ int dwc2_host_exit_hibernation(struct dwc2_hsotg *hsotg, int rem_wakeup, dwc2_writel(hsotg, 0xffffffff, GINTSTS); /* Restore global registers */ - ret = dwc2_restore_global_registers(hsotg); - if (ret) { - dev_err(hsotg->dev, "%s: failed to restore registers\n", - __func__); + ret = dwc2_host_restore_critical_registers(hsotg); + if (ret) return ret; - } - - /* Restore host registers */ - ret = dwc2_restore_host_registers(hsotg); - if (ret) { - dev_err(hsotg->dev, "%s: failed to restore host registers\n", - __func__); - return ret; - } if (rem_wakeup) { dwc2_hcd_rem_wakeup(hsotg); @@ -5777,19 +5800,9 @@ int dwc2_host_enter_partial_power_down(struct dwc2_hsotg *hsotg) dev_warn(hsotg->dev, "Suspend wasn't generated\n"); /* Backup all registers */ - ret = dwc2_backup_global_registers(hsotg); - if (ret) { - dev_err(hsotg->dev, "%s: failed to backup global registers\n", - __func__); - return ret; - } - - ret = dwc2_backup_host_registers(hsotg); - if (ret) { - dev_err(hsotg->dev, "%s: failed to backup host registers\n", - __func__); + ret = dwc2_host_backup_critical_registers(hsotg); + if (ret) return ret; - } /* * Clear any pending interrupts since dwc2 will not be able to @@ -5858,19 +5871,9 @@ int dwc2_host_exit_partial_power_down(struct dwc2_hsotg *hsotg, udelay(100); if (restore) { - ret = dwc2_restore_global_registers(hsotg); - if (ret) { - dev_err(hsotg->dev, "%s: failed to restore registers\n", - __func__); - return ret; - } - - ret = dwc2_restore_host_registers(hsotg); - if (ret) { - dev_err(hsotg->dev, "%s: failed to restore host registers\n", - __func__); + ret = dwc2_host_restore_critical_registers(hsotg); + if (ret) return ret; - } } /* Drive resume signaling and exit suspend mode on the port. */
The DWC2 runtime PM code reuses similar patterns to backup and restore the registers. So consolidate them in USB mode specific variants. This also has the advantage it is usable for further PM improvements. Signed-off-by: Stefan Wahren <wahrenst@gmx.net> --- drivers/usb/dwc2/core.h | 12 +++++ drivers/usb/dwc2/gadget.c | 101 +++++++++++++++++++------------------- drivers/usb/dwc2/hcd.c | 99 +++++++++++++++++++------------------ 3 files changed, 114 insertions(+), 98 deletions(-) -- 2.34.1