treewide: remove redundant IS_ERR() before error code check
[linux/fpc-iii.git] / drivers / memory / tegra / tegra186.c
blob441213a3593058c7f20573da686a803e3ced16e3
1 // SPDX-License-Identifier: GPL-2.0-only
2 /*
3 * Copyright (C) 2017 NVIDIA CORPORATION. All rights reserved.
4 */
6 #include <linux/io.h>
7 #include <linux/module.h>
8 #include <linux/mod_devicetable.h>
9 #include <linux/platform_device.h>
11 #include <dt-bindings/memory/tegra186-mc.h>
13 struct tegra_mc {
14 struct device *dev;
15 void __iomem *regs;
18 struct tegra_mc_client {
19 const char *name;
20 unsigned int sid;
21 struct {
22 unsigned int override;
23 unsigned int security;
24 } regs;
27 static const struct tegra_mc_client tegra186_mc_clients[] = {
29 .name = "ptcr",
30 .sid = TEGRA186_SID_PASSTHROUGH,
31 .regs = {
32 .override = 0x000,
33 .security = 0x004,
35 }, {
36 .name = "afir",
37 .sid = TEGRA186_SID_AFI,
38 .regs = {
39 .override = 0x070,
40 .security = 0x074,
42 }, {
43 .name = "hdar",
44 .sid = TEGRA186_SID_HDA,
45 .regs = {
46 .override = 0x0a8,
47 .security = 0x0ac,
49 }, {
50 .name = "host1xdmar",
51 .sid = TEGRA186_SID_HOST1X,
52 .regs = {
53 .override = 0x0b0,
54 .security = 0x0b4,
56 }, {
57 .name = "nvencsrd",
58 .sid = TEGRA186_SID_NVENC,
59 .regs = {
60 .override = 0x0e0,
61 .security = 0x0e4,
63 }, {
64 .name = "satar",
65 .sid = TEGRA186_SID_SATA,
66 .regs = {
67 .override = 0x0f8,
68 .security = 0x0fc,
70 }, {
71 .name = "mpcorer",
72 .sid = TEGRA186_SID_PASSTHROUGH,
73 .regs = {
74 .override = 0x138,
75 .security = 0x13c,
77 }, {
78 .name = "nvencswr",
79 .sid = TEGRA186_SID_NVENC,
80 .regs = {
81 .override = 0x158,
82 .security = 0x15c,
84 }, {
85 .name = "afiw",
86 .sid = TEGRA186_SID_AFI,
87 .regs = {
88 .override = 0x188,
89 .security = 0x18c,
91 }, {
92 .name = "hdaw",
93 .sid = TEGRA186_SID_HDA,
94 .regs = {
95 .override = 0x1a8,
96 .security = 0x1ac,
98 }, {
99 .name = "mpcorew",
100 .sid = TEGRA186_SID_PASSTHROUGH,
101 .regs = {
102 .override = 0x1c8,
103 .security = 0x1cc,
105 }, {
106 .name = "sataw",
107 .sid = TEGRA186_SID_SATA,
108 .regs = {
109 .override = 0x1e8,
110 .security = 0x1ec,
112 }, {
113 .name = "ispra",
114 .sid = TEGRA186_SID_ISP,
115 .regs = {
116 .override = 0x220,
117 .security = 0x224,
119 }, {
120 .name = "ispwa",
121 .sid = TEGRA186_SID_ISP,
122 .regs = {
123 .override = 0x230,
124 .security = 0x234,
126 }, {
127 .name = "ispwb",
128 .sid = TEGRA186_SID_ISP,
129 .regs = {
130 .override = 0x238,
131 .security = 0x23c,
133 }, {
134 .name = "xusb_hostr",
135 .sid = TEGRA186_SID_XUSB_HOST,
136 .regs = {
137 .override = 0x250,
138 .security = 0x254,
140 }, {
141 .name = "xusb_hostw",
142 .sid = TEGRA186_SID_XUSB_HOST,
143 .regs = {
144 .override = 0x258,
145 .security = 0x25c,
147 }, {
148 .name = "xusb_devr",
149 .sid = TEGRA186_SID_XUSB_DEV,
150 .regs = {
151 .override = 0x260,
152 .security = 0x264,
154 }, {
155 .name = "xusb_devw",
156 .sid = TEGRA186_SID_XUSB_DEV,
157 .regs = {
158 .override = 0x268,
159 .security = 0x26c,
161 }, {
162 .name = "tsecsrd",
163 .sid = TEGRA186_SID_TSEC,
164 .regs = {
165 .override = 0x2a0,
166 .security = 0x2a4,
168 }, {
169 .name = "tsecswr",
170 .sid = TEGRA186_SID_TSEC,
171 .regs = {
172 .override = 0x2a8,
173 .security = 0x2ac,
175 }, {
176 .name = "gpusrd",
177 .sid = TEGRA186_SID_GPU,
178 .regs = {
179 .override = 0x2c0,
180 .security = 0x2c4,
182 }, {
183 .name = "gpuswr",
184 .sid = TEGRA186_SID_GPU,
185 .regs = {
186 .override = 0x2c8,
187 .security = 0x2cc,
189 }, {
190 .name = "sdmmcra",
191 .sid = TEGRA186_SID_SDMMC1,
192 .regs = {
193 .override = 0x300,
194 .security = 0x304,
196 }, {
197 .name = "sdmmcraa",
198 .sid = TEGRA186_SID_SDMMC2,
199 .regs = {
200 .override = 0x308,
201 .security = 0x30c,
203 }, {
204 .name = "sdmmcr",
205 .sid = TEGRA186_SID_SDMMC3,
206 .regs = {
207 .override = 0x310,
208 .security = 0x314,
210 }, {
211 .name = "sdmmcrab",
212 .sid = TEGRA186_SID_SDMMC4,
213 .regs = {
214 .override = 0x318,
215 .security = 0x31c,
217 }, {
218 .name = "sdmmcwa",
219 .sid = TEGRA186_SID_SDMMC1,
220 .regs = {
221 .override = 0x320,
222 .security = 0x324,
224 }, {
225 .name = "sdmmcwaa",
226 .sid = TEGRA186_SID_SDMMC2,
227 .regs = {
228 .override = 0x328,
229 .security = 0x32c,
231 }, {
232 .name = "sdmmcw",
233 .sid = TEGRA186_SID_SDMMC3,
234 .regs = {
235 .override = 0x330,
236 .security = 0x334,
238 }, {
239 .name = "sdmmcwab",
240 .sid = TEGRA186_SID_SDMMC4,
241 .regs = {
242 .override = 0x338,
243 .security = 0x33c,
245 }, {
246 .name = "vicsrd",
247 .sid = TEGRA186_SID_VIC,
248 .regs = {
249 .override = 0x360,
250 .security = 0x364,
252 }, {
253 .name = "vicswr",
254 .sid = TEGRA186_SID_VIC,
255 .regs = {
256 .override = 0x368,
257 .security = 0x36c,
259 }, {
260 .name = "viw",
261 .sid = TEGRA186_SID_VI,
262 .regs = {
263 .override = 0x390,
264 .security = 0x394,
266 }, {
267 .name = "nvdecsrd",
268 .sid = TEGRA186_SID_NVDEC,
269 .regs = {
270 .override = 0x3c0,
271 .security = 0x3c4,
273 }, {
274 .name = "nvdecswr",
275 .sid = TEGRA186_SID_NVDEC,
276 .regs = {
277 .override = 0x3c8,
278 .security = 0x3cc,
280 }, {
281 .name = "aper",
282 .sid = TEGRA186_SID_APE,
283 .regs = {
284 .override = 0x3d0,
285 .security = 0x3d4,
287 }, {
288 .name = "apew",
289 .sid = TEGRA186_SID_APE,
290 .regs = {
291 .override = 0x3d8,
292 .security = 0x3dc,
294 }, {
295 .name = "nvjpgsrd",
296 .sid = TEGRA186_SID_NVJPG,
297 .regs = {
298 .override = 0x3f0,
299 .security = 0x3f4,
301 }, {
302 .name = "nvjpgswr",
303 .sid = TEGRA186_SID_NVJPG,
304 .regs = {
305 .override = 0x3f8,
306 .security = 0x3fc,
308 }, {
309 .name = "sesrd",
310 .sid = TEGRA186_SID_SE,
311 .regs = {
312 .override = 0x400,
313 .security = 0x404,
315 }, {
316 .name = "seswr",
317 .sid = TEGRA186_SID_SE,
318 .regs = {
319 .override = 0x408,
320 .security = 0x40c,
322 }, {
323 .name = "etrr",
324 .sid = TEGRA186_SID_ETR,
325 .regs = {
326 .override = 0x420,
327 .security = 0x424,
329 }, {
330 .name = "etrw",
331 .sid = TEGRA186_SID_ETR,
332 .regs = {
333 .override = 0x428,
334 .security = 0x42c,
336 }, {
337 .name = "tsecsrdb",
338 .sid = TEGRA186_SID_TSECB,
339 .regs = {
340 .override = 0x430,
341 .security = 0x434,
343 }, {
344 .name = "tsecswrb",
345 .sid = TEGRA186_SID_TSECB,
346 .regs = {
347 .override = 0x438,
348 .security = 0x43c,
350 }, {
351 .name = "gpusrd2",
352 .sid = TEGRA186_SID_GPU,
353 .regs = {
354 .override = 0x440,
355 .security = 0x444,
357 }, {
358 .name = "gpuswr2",
359 .sid = TEGRA186_SID_GPU,
360 .regs = {
361 .override = 0x448,
362 .security = 0x44c,
364 }, {
365 .name = "axisr",
366 .sid = TEGRA186_SID_GPCDMA_0,
367 .regs = {
368 .override = 0x460,
369 .security = 0x464,
371 }, {
372 .name = "axisw",
373 .sid = TEGRA186_SID_GPCDMA_0,
374 .regs = {
375 .override = 0x468,
376 .security = 0x46c,
378 }, {
379 .name = "eqosr",
380 .sid = TEGRA186_SID_EQOS,
381 .regs = {
382 .override = 0x470,
383 .security = 0x474,
385 }, {
386 .name = "eqosw",
387 .sid = TEGRA186_SID_EQOS,
388 .regs = {
389 .override = 0x478,
390 .security = 0x47c,
392 }, {
393 .name = "ufshcr",
394 .sid = TEGRA186_SID_UFSHC,
395 .regs = {
396 .override = 0x480,
397 .security = 0x484,
399 }, {
400 .name = "ufshcw",
401 .sid = TEGRA186_SID_UFSHC,
402 .regs = {
403 .override = 0x488,
404 .security = 0x48c,
406 }, {
407 .name = "nvdisplayr",
408 .sid = TEGRA186_SID_NVDISPLAY,
409 .regs = {
410 .override = 0x490,
411 .security = 0x494,
413 }, {
414 .name = "bpmpr",
415 .sid = TEGRA186_SID_BPMP,
416 .regs = {
417 .override = 0x498,
418 .security = 0x49c,
420 }, {
421 .name = "bpmpw",
422 .sid = TEGRA186_SID_BPMP,
423 .regs = {
424 .override = 0x4a0,
425 .security = 0x4a4,
427 }, {
428 .name = "bpmpdmar",
429 .sid = TEGRA186_SID_BPMP,
430 .regs = {
431 .override = 0x4a8,
432 .security = 0x4ac,
434 }, {
435 .name = "bpmpdmaw",
436 .sid = TEGRA186_SID_BPMP,
437 .regs = {
438 .override = 0x4b0,
439 .security = 0x4b4,
441 }, {
442 .name = "aonr",
443 .sid = TEGRA186_SID_AON,
444 .regs = {
445 .override = 0x4b8,
446 .security = 0x4bc,
448 }, {
449 .name = "aonw",
450 .sid = TEGRA186_SID_AON,
451 .regs = {
452 .override = 0x4c0,
453 .security = 0x4c4,
455 }, {
456 .name = "aondmar",
457 .sid = TEGRA186_SID_AON,
458 .regs = {
459 .override = 0x4c8,
460 .security = 0x4cc,
462 }, {
463 .name = "aondmaw",
464 .sid = TEGRA186_SID_AON,
465 .regs = {
466 .override = 0x4d0,
467 .security = 0x4d4,
469 }, {
470 .name = "scer",
471 .sid = TEGRA186_SID_SCE,
472 .regs = {
473 .override = 0x4d8,
474 .security = 0x4dc,
476 }, {
477 .name = "scew",
478 .sid = TEGRA186_SID_SCE,
479 .regs = {
480 .override = 0x4e0,
481 .security = 0x4e4,
483 }, {
484 .name = "scedmar",
485 .sid = TEGRA186_SID_SCE,
486 .regs = {
487 .override = 0x4e8,
488 .security = 0x4ec,
490 }, {
491 .name = "scedmaw",
492 .sid = TEGRA186_SID_SCE,
493 .regs = {
494 .override = 0x4f0,
495 .security = 0x4f4,
497 }, {
498 .name = "apedmar",
499 .sid = TEGRA186_SID_APE,
500 .regs = {
501 .override = 0x4f8,
502 .security = 0x4fc,
504 }, {
505 .name = "apedmaw",
506 .sid = TEGRA186_SID_APE,
507 .regs = {
508 .override = 0x500,
509 .security = 0x504,
511 }, {
512 .name = "nvdisplayr1",
513 .sid = TEGRA186_SID_NVDISPLAY,
514 .regs = {
515 .override = 0x508,
516 .security = 0x50c,
518 }, {
519 .name = "vicsrd1",
520 .sid = TEGRA186_SID_VIC,
521 .regs = {
522 .override = 0x510,
523 .security = 0x514,
525 }, {
526 .name = "nvdecsrd1",
527 .sid = TEGRA186_SID_NVDEC,
528 .regs = {
529 .override = 0x518,
530 .security = 0x51c,
535 static int tegra186_mc_probe(struct platform_device *pdev)
537 struct resource *res;
538 struct tegra_mc *mc;
539 unsigned int i;
540 int err = 0;
542 mc = devm_kzalloc(&pdev->dev, sizeof(*mc), GFP_KERNEL);
543 if (!mc)
544 return -ENOMEM;
546 res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
547 mc->regs = devm_ioremap_resource(&pdev->dev, res);
548 if (IS_ERR(mc->regs))
549 return PTR_ERR(mc->regs);
551 mc->dev = &pdev->dev;
553 for (i = 0; i < ARRAY_SIZE(tegra186_mc_clients); i++) {
554 const struct tegra_mc_client *client = &tegra186_mc_clients[i];
555 u32 override, security;
557 override = readl(mc->regs + client->regs.override);
558 security = readl(mc->regs + client->regs.security);
560 dev_dbg(&pdev->dev, "client %s: override: %x security: %x\n",
561 client->name, override, security);
563 dev_dbg(&pdev->dev, "setting SID %u for %s\n", client->sid,
564 client->name);
565 writel(client->sid, mc->regs + client->regs.override);
567 override = readl(mc->regs + client->regs.override);
568 security = readl(mc->regs + client->regs.security);
570 dev_dbg(&pdev->dev, "client %s: override: %x security: %x\n",
571 client->name, override, security);
574 platform_set_drvdata(pdev, mc);
576 return err;
579 static const struct of_device_id tegra186_mc_of_match[] = {
580 { .compatible = "nvidia,tegra186-mc", },
581 { /* sentinel */ }
583 MODULE_DEVICE_TABLE(of, tegra186_mc_of_match);
585 static struct platform_driver tegra186_mc_driver = {
586 .driver = {
587 .name = "tegra186-mc",
588 .of_match_table = tegra186_mc_of_match,
589 .suppress_bind_attrs = true,
591 .prevent_deferred_probe = true,
592 .probe = tegra186_mc_probe,
594 module_platform_driver(tegra186_mc_driver);
596 MODULE_AUTHOR("Thierry Reding <treding@nvidia.com>");
597 MODULE_DESCRIPTION("NVIDIA Tegra186 Memory Controller driver");
598 MODULE_LICENSE("GPL v2");