]> git.ipfire.org Git - thirdparty/kernel/stable-queue.git/blob - releases/5.15.154/usb-dwc2-host-fix-hibernation-flow.patch
6.6-stable patches
[thirdparty/kernel/stable-queue.git] / releases / 5.15.154 / usb-dwc2-host-fix-hibernation-flow.patch
1 From 3c7b9856a82227db01a20171d2e24c7ce305d59b Mon Sep 17 00:00:00 2001
2 From: Minas Harutyunyan <Minas.Harutyunyan@synopsys.com>
3 Date: Wed, 13 Mar 2024 09:21:11 +0000
4 Subject: usb: dwc2: host: Fix hibernation flow
5
6 From: Minas Harutyunyan <Minas.Harutyunyan@synopsys.com>
7
8 commit 3c7b9856a82227db01a20171d2e24c7ce305d59b upstream.
9
10 Added to backup/restore registers HFLBADDR, HCCHARi, HCSPLTi,
11 HCTSIZi, HCDMAi and HCDMABi.
12
13 Fixes: 58e52ff6a6c3 ("usb: dwc2: Move register save and restore functions")
14 Fixes: d17ee77b3044 ("usb: dwc2: add controller hibernation support")
15 CC: stable@vger.kernel.org
16 Signed-off-by: Minas Harutyunyan <Minas.Harutyunyan@synopsys.com>
17 Link: https://lore.kernel.org/r/c2d10ee6098b9b009a8e94191e046004747d3bdd.1708945444.git.Minas.Harutyunyan@synopsys.com
18 Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
19 ---
20 drivers/usb/dwc2/core.h | 12 ++++++++++++
21 drivers/usb/dwc2/hcd.c | 18 ++++++++++++++++--
22 2 files changed, 28 insertions(+), 2 deletions(-)
23
24 --- a/drivers/usb/dwc2/core.h
25 +++ b/drivers/usb/dwc2/core.h
26 @@ -755,8 +755,14 @@ struct dwc2_dregs_backup {
27 * struct dwc2_hregs_backup - Holds host registers state before
28 * entering partial power down
29 * @hcfg: Backup of HCFG register
30 + * @hflbaddr: Backup of HFLBADDR register
31 * @haintmsk: Backup of HAINTMSK register
32 + * @hcchar: Backup of HCCHAR register
33 + * @hcsplt: Backup of HCSPLT register
34 * @hcintmsk: Backup of HCINTMSK register
35 + * @hctsiz: Backup of HCTSIZ register
36 + * @hdma: Backup of HCDMA register
37 + * @hcdmab: Backup of HCDMAB register
38 * @hprt0: Backup of HPTR0 register
39 * @hfir: Backup of HFIR register
40 * @hptxfsiz: Backup of HPTXFSIZ register
41 @@ -764,8 +770,14 @@ struct dwc2_dregs_backup {
42 */
43 struct dwc2_hregs_backup {
44 u32 hcfg;
45 + u32 hflbaddr;
46 u32 haintmsk;
47 + u32 hcchar[MAX_EPS_CHANNELS];
48 + u32 hcsplt[MAX_EPS_CHANNELS];
49 u32 hcintmsk[MAX_EPS_CHANNELS];
50 + u32 hctsiz[MAX_EPS_CHANNELS];
51 + u32 hcidma[MAX_EPS_CHANNELS];
52 + u32 hcidmab[MAX_EPS_CHANNELS];
53 u32 hprt0;
54 u32 hfir;
55 u32 hptxfsiz;
56 --- a/drivers/usb/dwc2/hcd.c
57 +++ b/drivers/usb/dwc2/hcd.c
58 @@ -5437,9 +5437,16 @@ int dwc2_backup_host_registers(struct dw
59 /* Backup Host regs */
60 hr = &hsotg->hr_backup;
61 hr->hcfg = dwc2_readl(hsotg, HCFG);
62 + hr->hflbaddr = dwc2_readl(hsotg, HFLBADDR);
63 hr->haintmsk = dwc2_readl(hsotg, HAINTMSK);
64 - for (i = 0; i < hsotg->params.host_channels; ++i)
65 + for (i = 0; i < hsotg->params.host_channels; ++i) {
66 + hr->hcchar[i] = dwc2_readl(hsotg, HCCHAR(i));
67 + hr->hcsplt[i] = dwc2_readl(hsotg, HCSPLT(i));
68 hr->hcintmsk[i] = dwc2_readl(hsotg, HCINTMSK(i));
69 + hr->hctsiz[i] = dwc2_readl(hsotg, HCTSIZ(i));
70 + hr->hcidma[i] = dwc2_readl(hsotg, HCDMA(i));
71 + hr->hcidmab[i] = dwc2_readl(hsotg, HCDMAB(i));
72 + }
73
74 hr->hprt0 = dwc2_read_hprt0(hsotg);
75 hr->hfir = dwc2_readl(hsotg, HFIR);
76 @@ -5473,10 +5480,17 @@ int dwc2_restore_host_registers(struct d
77 hr->valid = false;
78
79 dwc2_writel(hsotg, hr->hcfg, HCFG);
80 + dwc2_writel(hsotg, hr->hflbaddr, HFLBADDR);
81 dwc2_writel(hsotg, hr->haintmsk, HAINTMSK);
82
83 - for (i = 0; i < hsotg->params.host_channels; ++i)
84 + for (i = 0; i < hsotg->params.host_channels; ++i) {
85 + dwc2_writel(hsotg, hr->hcchar[i], HCCHAR(i));
86 + dwc2_writel(hsotg, hr->hcsplt[i], HCSPLT(i));
87 dwc2_writel(hsotg, hr->hcintmsk[i], HCINTMSK(i));
88 + dwc2_writel(hsotg, hr->hctsiz[i], HCTSIZ(i));
89 + dwc2_writel(hsotg, hr->hcidma[i], HCDMA(i));
90 + dwc2_writel(hsotg, hr->hcidmab[i], HCDMAB(i));
91 + }
92
93 dwc2_writel(hsotg, hr->hprt0, HPRT0);
94 dwc2_writel(hsotg, hr->hfir, HFIR);