Skip to content

Commit 3c7b985

Browse files
Minas Harutyunyangregkh
authored andcommitted
usb: dwc2: host: Fix hibernation flow
Added to backup/restore registers HFLBADDR, HCCHARi, HCSPLTi, HCTSIZi, HCDMAi and HCDMABi. Fixes: 58e52ff ("usb: dwc2: Move register save and restore functions") Fixes: d17ee77 ("usb: dwc2: add controller hibernation support") CC: stable@vger.kernel.org Signed-off-by: Minas Harutyunyan <Minas.Harutyunyan@synopsys.com> Link: https://lore.kernel.org/r/c2d10ee6098b9b009a8e94191e046004747d3bdd.1708945444.git.Minas.Harutyunyan@synopsys.com Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
1 parent 80ba43e commit 3c7b985

2 files changed

Lines changed: 28 additions & 2 deletions

File tree

drivers/usb/dwc2/core.h

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -729,17 +729,29 @@ struct dwc2_dregs_backup {
729729
* struct dwc2_hregs_backup - Holds host registers state before
730730
* entering partial power down
731731
* @hcfg: Backup of HCFG register
732+
* @hflbaddr: Backup of HFLBADDR register
732733
* @haintmsk: Backup of HAINTMSK register
734+
* @hcchar: Backup of HCCHAR register
735+
* @hcsplt: Backup of HCSPLT register
733736
* @hcintmsk: Backup of HCINTMSK register
737+
* @hctsiz: Backup of HCTSIZ register
738+
* @hdma: Backup of HCDMA register
739+
* @hcdmab: Backup of HCDMAB register
734740
* @hprt0: Backup of HPTR0 register
735741
* @hfir: Backup of HFIR register
736742
* @hptxfsiz: Backup of HPTXFSIZ register
737743
* @valid: True if registers values backuped.
738744
*/
739745
struct dwc2_hregs_backup {
740746
u32 hcfg;
747+
u32 hflbaddr;
741748
u32 haintmsk;
749+
u32 hcchar[MAX_EPS_CHANNELS];
750+
u32 hcsplt[MAX_EPS_CHANNELS];
742751
u32 hcintmsk[MAX_EPS_CHANNELS];
752+
u32 hctsiz[MAX_EPS_CHANNELS];
753+
u32 hcidma[MAX_EPS_CHANNELS];
754+
u32 hcidmab[MAX_EPS_CHANNELS];
743755
u32 hprt0;
744756
u32 hfir;
745757
u32 hptxfsiz;

drivers/usb/dwc2/hcd.c

Lines changed: 16 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5406,9 +5406,16 @@ int dwc2_backup_host_registers(struct dwc2_hsotg *hsotg)
54065406
/* Backup Host regs */
54075407
hr = &hsotg->hr_backup;
54085408
hr->hcfg = dwc2_readl(hsotg, HCFG);
5409+
hr->hflbaddr = dwc2_readl(hsotg, HFLBADDR);
54095410
hr->haintmsk = dwc2_readl(hsotg, HAINTMSK);
5410-
for (i = 0; i < hsotg->params.host_channels; ++i)
5411+
for (i = 0; i < hsotg->params.host_channels; ++i) {
5412+
hr->hcchar[i] = dwc2_readl(hsotg, HCCHAR(i));
5413+
hr->hcsplt[i] = dwc2_readl(hsotg, HCSPLT(i));
54115414
hr->hcintmsk[i] = dwc2_readl(hsotg, HCINTMSK(i));
5415+
hr->hctsiz[i] = dwc2_readl(hsotg, HCTSIZ(i));
5416+
hr->hcidma[i] = dwc2_readl(hsotg, HCDMA(i));
5417+
hr->hcidmab[i] = dwc2_readl(hsotg, HCDMAB(i));
5418+
}
54125419

54135420
hr->hprt0 = dwc2_read_hprt0(hsotg);
54145421
hr->hfir = dwc2_readl(hsotg, HFIR);
@@ -5442,10 +5449,17 @@ int dwc2_restore_host_registers(struct dwc2_hsotg *hsotg)
54425449
hr->valid = false;
54435450

54445451
dwc2_writel(hsotg, hr->hcfg, HCFG);
5452+
dwc2_writel(hsotg, hr->hflbaddr, HFLBADDR);
54455453
dwc2_writel(hsotg, hr->haintmsk, HAINTMSK);
54465454

5447-
for (i = 0; i < hsotg->params.host_channels; ++i)
5455+
for (i = 0; i < hsotg->params.host_channels; ++i) {
5456+
dwc2_writel(hsotg, hr->hcchar[i], HCCHAR(i));
5457+
dwc2_writel(hsotg, hr->hcsplt[i], HCSPLT(i));
54485458
dwc2_writel(hsotg, hr->hcintmsk[i], HCINTMSK(i));
5459+
dwc2_writel(hsotg, hr->hctsiz[i], HCTSIZ(i));
5460+
dwc2_writel(hsotg, hr->hcidma[i], HCDMA(i));
5461+
dwc2_writel(hsotg, hr->hcidmab[i], HCDMAB(i));
5462+
}
54495463

54505464
dwc2_writel(hsotg, hr->hprt0, HPRT0);
54515465
dwc2_writel(hsotg, hr->hfir, HFIR);

0 commit comments

Comments
 (0)