aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/usb/dwc2/core.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/usb/dwc2/core.c')
-rw-r--r--drivers/usb/dwc2/core.c55
1 files changed, 15 insertions, 40 deletions
diff --git a/drivers/usb/dwc2/core.c b/drivers/usb/dwc2/core.c
index e5b546f1152e..c3cc1a78d1e2 100644
--- a/drivers/usb/dwc2/core.c
+++ b/drivers/usb/dwc2/core.c
@@ -72,17 +72,7 @@ static int dwc2_backup_host_registers(struct dwc2_hsotg *hsotg)
72 dev_dbg(hsotg->dev, "%s\n", __func__); 72 dev_dbg(hsotg->dev, "%s\n", __func__);
73 73
74 /* Backup Host regs */ 74 /* Backup Host regs */
75 hr = hsotg->hr_backup; 75 hr = &hsotg->hr_backup;
76 if (!hr) {
77 hr = devm_kzalloc(hsotg->dev, sizeof(*hr), GFP_KERNEL);
78 if (!hr) {
79 dev_err(hsotg->dev, "%s: can't allocate host regs\n",
80 __func__);
81 return -ENOMEM;
82 }
83
84 hsotg->hr_backup = hr;
85 }
86 hr->hcfg = readl(hsotg->regs + HCFG); 76 hr->hcfg = readl(hsotg->regs + HCFG);
87 hr->haintmsk = readl(hsotg->regs + HAINTMSK); 77 hr->haintmsk = readl(hsotg->regs + HAINTMSK);
88 for (i = 0; i < hsotg->core_params->host_channels; ++i) 78 for (i = 0; i < hsotg->core_params->host_channels; ++i)
@@ -90,6 +80,7 @@ static int dwc2_backup_host_registers(struct dwc2_hsotg *hsotg)
90 80
91 hr->hprt0 = readl(hsotg->regs + HPRT0); 81 hr->hprt0 = readl(hsotg->regs + HPRT0);
92 hr->hfir = readl(hsotg->regs + HFIR); 82 hr->hfir = readl(hsotg->regs + HFIR);
83 hr->valid = true;
93 84
94 return 0; 85 return 0;
95} 86}
@@ -109,12 +100,13 @@ static int dwc2_restore_host_registers(struct dwc2_hsotg *hsotg)
109 dev_dbg(hsotg->dev, "%s\n", __func__); 100 dev_dbg(hsotg->dev, "%s\n", __func__);
110 101
111 /* Restore host regs */ 102 /* Restore host regs */
112 hr = hsotg->hr_backup; 103 hr = &hsotg->hr_backup;
113 if (!hr) { 104 if (!hr->valid) {
114 dev_err(hsotg->dev, "%s: no host registers to restore\n", 105 dev_err(hsotg->dev, "%s: no host registers to restore\n",
115 __func__); 106 __func__);
116 return -EINVAL; 107 return -EINVAL;
117 } 108 }
109 hr->valid = false;
118 110
119 writel(hr->hcfg, hsotg->regs + HCFG); 111 writel(hr->hcfg, hsotg->regs + HCFG);
120 writel(hr->haintmsk, hsotg->regs + HAINTMSK); 112 writel(hr->haintmsk, hsotg->regs + HAINTMSK);
@@ -152,17 +144,7 @@ static int dwc2_backup_device_registers(struct dwc2_hsotg *hsotg)
152 dev_dbg(hsotg->dev, "%s\n", __func__); 144 dev_dbg(hsotg->dev, "%s\n", __func__);
153 145
154 /* Backup dev regs */ 146 /* Backup dev regs */
155 dr = hsotg->dr_backup; 147 dr = &hsotg->dr_backup;
156 if (!dr) {
157 dr = devm_kzalloc(hsotg->dev, sizeof(*dr), GFP_KERNEL);
158 if (!dr) {
159 dev_err(hsotg->dev, "%s: can't allocate device regs\n",
160 __func__);
161 return -ENOMEM;
162 }
163
164 hsotg->dr_backup = dr;
165 }
166 148
167 dr->dcfg = readl(hsotg->regs + DCFG); 149 dr->dcfg = readl(hsotg->regs + DCFG);
168 dr->dctl = readl(hsotg->regs + DCTL); 150 dr->dctl = readl(hsotg->regs + DCTL);
@@ -195,7 +177,7 @@ static int dwc2_backup_device_registers(struct dwc2_hsotg *hsotg)
195 dr->doeptsiz[i] = readl(hsotg->regs + DOEPTSIZ(i)); 177 dr->doeptsiz[i] = readl(hsotg->regs + DOEPTSIZ(i));
196 dr->doepdma[i] = readl(hsotg->regs + DOEPDMA(i)); 178 dr->doepdma[i] = readl(hsotg->regs + DOEPDMA(i));
197 } 179 }
198 180 dr->valid = true;
199 return 0; 181 return 0;
200} 182}
201 183
@@ -215,12 +197,13 @@ static int dwc2_restore_device_registers(struct dwc2_hsotg *hsotg)
215 dev_dbg(hsotg->dev, "%s\n", __func__); 197 dev_dbg(hsotg->dev, "%s\n", __func__);
216 198
217 /* Restore dev regs */ 199 /* Restore dev regs */
218 dr = hsotg->dr_backup; 200 dr = &hsotg->dr_backup;
219 if (!dr) { 201 if (!dr->valid) {
220 dev_err(hsotg->dev, "%s: no device registers to restore\n", 202 dev_err(hsotg->dev, "%s: no device registers to restore\n",
221 __func__); 203 __func__);
222 return -EINVAL; 204 return -EINVAL;
223 } 205 }
206 dr->valid = false;
224 207
225 writel(dr->dcfg, hsotg->regs + DCFG); 208 writel(dr->dcfg, hsotg->regs + DCFG);
226 writel(dr->dctl, hsotg->regs + DCTL); 209 writel(dr->dctl, hsotg->regs + DCTL);
@@ -268,17 +251,7 @@ static int dwc2_backup_global_registers(struct dwc2_hsotg *hsotg)
268 int i; 251 int i;
269 252
270 /* Backup global regs */ 253 /* Backup global regs */
271 gr = hsotg->gr_backup; 254 gr = &hsotg->gr_backup;
272 if (!gr) {
273 gr = devm_kzalloc(hsotg->dev, sizeof(*gr), GFP_KERNEL);
274 if (!gr) {
275 dev_err(hsotg->dev, "%s: can't allocate global regs\n",
276 __func__);
277 return -ENOMEM;
278 }
279
280 hsotg->gr_backup = gr;
281 }
282 255
283 gr->gotgctl = readl(hsotg->regs + GOTGCTL); 256 gr->gotgctl = readl(hsotg->regs + GOTGCTL);
284 gr->gintmsk = readl(hsotg->regs + GINTMSK); 257 gr->gintmsk = readl(hsotg->regs + GINTMSK);
@@ -291,6 +264,7 @@ static int dwc2_backup_global_registers(struct dwc2_hsotg *hsotg)
291 for (i = 0; i < MAX_EPS_CHANNELS; i++) 264 for (i = 0; i < MAX_EPS_CHANNELS; i++)
292 gr->dtxfsiz[i] = readl(hsotg->regs + DPTXFSIZN(i)); 265 gr->dtxfsiz[i] = readl(hsotg->regs + DPTXFSIZN(i));
293 266
267 gr->valid = true;
294 return 0; 268 return 0;
295} 269}
296 270
@@ -309,12 +283,13 @@ static int dwc2_restore_global_registers(struct dwc2_hsotg *hsotg)
309 dev_dbg(hsotg->dev, "%s\n", __func__); 283 dev_dbg(hsotg->dev, "%s\n", __func__);
310 284
311 /* Restore global regs */ 285 /* Restore global regs */
312 gr = hsotg->gr_backup; 286 gr = &hsotg->gr_backup;
313 if (!gr) { 287 if (!gr->valid) {
314 dev_err(hsotg->dev, "%s: no global registers to restore\n", 288 dev_err(hsotg->dev, "%s: no global registers to restore\n",
315 __func__); 289 __func__);
316 return -EINVAL; 290 return -EINVAL;
317 } 291 }
292 gr->valid = false;
318 293
319 writel(0xffffffff, hsotg->regs + GINTSTS); 294 writel(0xffffffff, hsotg->regs + GINTSTS);
320 writel(gr->gotgctl, hsotg->regs + GOTGCTL); 295 writel(gr->gotgctl, hsotg->regs + GOTGCTL);