1 // SPDX-License-Identifier: GPL-2.0
2 /*
3 * Copyright (c) 2024 Samsung Electronics Co., Ltd.
4 * Author: Michal Wilczynski <m.wilczynski@samsung.com>
5 */
6
7 #include <linux/of.h>
8 #include <linux/platform_device.h>
9 #include <linux/reset-controller.h>
10 #include <linux/regmap.h>
11
12 #include <dt-bindings/reset/thead,th1520-reset.h>
13
14 /* register offset in RSTGEN_R */
15 #define TH1520_BROM_RST_CFG 0x0
16 #define TH1520_C910_RST_CFG 0x4
17 #define TH1520_CHIP_DBG_RST_CFG 0xc
18 #define TH1520_AXI4_CPUSYS2_RST_CFG 0x10
19 #define TH1520_X2H_CPUSYS_RST_CFG 0x18
20 #define TH1520_AHB2_CPUSYS_RST_CFG 0x1c
21 #define TH1520_APB3_CPUSYS_RST_CFG 0x20
22 #define TH1520_MBOX0_RST_CFG 0x24
23 #define TH1520_MBOX1_RST_CFG 0x28
24 #define TH1520_MBOX2_RST_CFG 0x2c
25 #define TH1520_MBOX3_RST_CFG 0x30
26 #define TH1520_WDT0_RST_CFG 0x34
27 #define TH1520_WDT1_RST_CFG 0x38
28 #define TH1520_TIMER0_RST_CFG 0x3c
29 #define TH1520_TIMER1_RST_CFG 0x40
30 #define TH1520_PERISYS_AHB_RST_CFG 0x44
31 #define TH1520_PERISYS_APB1_RST_CFG 0x48
32 #define TH1520_PERISYS_APB2_RST_CFG 0x4c
33 #define TH1520_GMAC0_RST_CFG 0x68
34 #define TH1520_UART0_RST_CFG 0x70
35 #define TH1520_UART1_RST_CFG 0x74
36 #define TH1520_UART2_RST_CFG 0x78
37 #define TH1520_UART3_RST_CFG 0x7c
38 #define TH1520_UART4_RST_CFG 0x80
39 #define TH1520_UART5_RST_CFG 0x84
40 #define TH1520_QSPI0_RST_CFG 0x8c
41 #define TH1520_QSPI1_RST_CFG 0x90
42 #define TH1520_SPI_RST_CFG 0x94
43 #define TH1520_I2C0_RST_CFG 0x98
44 #define TH1520_I2C1_RST_CFG 0x9c
45 #define TH1520_I2C2_RST_CFG 0xa0
46 #define TH1520_I2C3_RST_CFG 0xa4
47 #define TH1520_I2C4_RST_CFG 0xa8
48 #define TH1520_I2C5_RST_CFG 0xac
49 #define TH1520_GPIO0_RST_CFG 0xb0
50 #define TH1520_GPIO1_RST_CFG 0xb4
51 #define TH1520_GPIO2_RST_CFG 0xb8
52 #define TH1520_PWM_RST_CFG 0xc0
53 #define TH1520_PADCTRL0_APSYS_RST_CFG 0xc4
54 #define TH1520_CPU2PERI_X2H_RST_CFG 0xcc
55 #define TH1520_CPU2AON_X2H_RST_CFG 0xe4
56 #define TH1520_AON2CPU_A2X_RST_CFG 0xfc
57 #define TH1520_NPUSYS_AXI_RST_CFG 0x128
58 #define TH1520_CPU2VP_X2P_RST_CFG 0x12c
59 #define TH1520_CPU2VI_X2H_RST_CFG 0x138
60 #define TH1520_BMU_C910_RST_CFG 0x148
61 #define TH1520_DMAC_CPUSYS_RST_CFG 0x14c
62 #define TH1520_SPINLOCK_RST_CFG 0x178
63 #define TH1520_CFG2TEE_X2H_RST_CFG 0x188
64 #define TH1520_DSMART_RST_CFG 0x18c
65 #define TH1520_GPIO3_RST_CFG 0x1a8
66 #define TH1520_I2S_RST_CFG 0x1ac
67 #define TH1520_IMG_NNA_RST_CFG 0x1b0
68 #define TH1520_PERI_APB3_RST_CFG 0x1dc
69 #define TH1520_VP_SUBSYS_RST_CFG 0x1ec
70 #define TH1520_PERISYS_APB4_RST_CFG 0x1f8
71 #define TH1520_GMAC1_RST_CFG 0x204
72 #define TH1520_GMAC_AXI_RST_CFG 0x208
73 #define TH1520_PADCTRL1_APSYS_RST_CFG 0x20c
74 #define TH1520_VOSYS_AXI_RST_CFG 0x210
75 #define TH1520_VOSYS_X2X_RST_CFG 0x214
76 #define TH1520_MISC2VP_X2X_RST_CFG 0x218
77 #define TH1520_SUBSYS_RST_CFG 0x220
78
79 /* register offset in DSP_REGMAP */
80 #define TH1520_DSPSYS_RST_CFG 0x0
81
82 /* register offset in MISCSYS_REGMAP */
83 #define TH1520_EMMC_RST_CFG 0x0
84 #define TH1520_MISCSYS_AXI_RST_CFG 0x8
85 #define TH1520_SDIO0_RST_CFG 0xc
86 #define TH1520_SDIO1_RST_CFG 0x10
87 #define TH1520_USB3_DRD_RST_CFG 0x14
88
89 /* register offset in VISYS_REGMAP */
90 #define TH1520_VISYS_RST_CFG 0x0
91 #define TH1520_VISYS_2_RST_CFG 0x4
92
93 /* register offset in VOSYS_REGMAP */
94 #define TH1520_GPU_RST_CFG 0x0
95 #define TH1520_GPU_RST_CFG_MASK GENMASK(1, 0)
96 #define TH1520_DPU_RST_CFG 0x4
97 #define TH1520_DSI0_RST_CFG 0x8
98 #define TH1520_DSI1_RST_CFG 0xc
99 #define TH1520_HDMI_RST_CFG 0x14
100 #define TH1520_AXI4_VO_DW_AXI_RST_CFG 0x18
101 #define TH1520_X2H_X4_VOSYS_DW_RST_CFG 0x20
102
103 /* register values */
104 #define TH1520_GPU_SW_GPU_RST BIT(0)
105 #define TH1520_GPU_SW_CLKGEN_RST BIT(1)
106 #define TH1520_DPU_SW_DPU_HRST BIT(0)
107 #define TH1520_DPU_SW_DPU_ARST BIT(1)
108 #define TH1520_DPU_SW_DPU_CRST BIT(2)
109 #define TH1520_DSI_SW_DSI_PRST BIT(0)
110 #define TH1520_HDMI_SW_MAIN_RST BIT(0)
111 #define TH1520_HDMI_SW_PRST BIT(1)
112
113 /* register offset in VPSYS_REGMAP */
114 #define TH1520_AXIBUS_RST_CFG 0x0
115 #define TH1520_FCE_RST_CFG 0x4
116 #define TH1520_G2D_RST_CFG 0x8
117 #define TH1520_VDEC_RST_CFG 0xc
118 #define TH1520_VENC_RST_CFG 0x10
119
120 struct th1520_reset_map {
121 u32 bit;
122 u32 reg;
123 };
124
125 struct th1520_reset_priv {
126 struct reset_controller_dev rcdev;
127 struct regmap *map;
128 const struct th1520_reset_map *resets;
129 };
130
131 struct th1520_reset_data {
132 const struct th1520_reset_map *resets;
133 size_t num;
134 };
135
136 static const struct th1520_reset_map th1520_resets[] = {
137 [TH1520_RESET_ID_GPU] = {
138 .bit = TH1520_GPU_SW_GPU_RST,
139 .reg = TH1520_GPU_RST_CFG,
140 },
141 [TH1520_RESET_ID_GPU_CLKGEN] = {
142 .bit = TH1520_GPU_SW_CLKGEN_RST,
143 .reg = TH1520_GPU_RST_CFG,
144 },
145 [TH1520_RESET_ID_DPU_AHB] = {
146 .bit = TH1520_DPU_SW_DPU_HRST,
147 .reg = TH1520_DPU_RST_CFG,
148 },
149 [TH1520_RESET_ID_DPU_AXI] = {
150 .bit = TH1520_DPU_SW_DPU_ARST,
151 .reg = TH1520_DPU_RST_CFG,
152 },
153 [TH1520_RESET_ID_DPU_CORE] = {
154 .bit = TH1520_DPU_SW_DPU_CRST,
155 .reg = TH1520_DPU_RST_CFG,
156 },
157 [TH1520_RESET_ID_DSI0_APB] = {
158 .bit = TH1520_DSI_SW_DSI_PRST,
159 .reg = TH1520_DSI0_RST_CFG,
160 },
161 [TH1520_RESET_ID_DSI1_APB] = {
162 .bit = TH1520_DSI_SW_DSI_PRST,
163 .reg = TH1520_DSI1_RST_CFG,
164 },
165 [TH1520_RESET_ID_HDMI] = {
166 .bit = TH1520_HDMI_SW_MAIN_RST,
167 .reg = TH1520_HDMI_RST_CFG,
168 },
169 [TH1520_RESET_ID_HDMI_APB] = {
170 .bit = TH1520_HDMI_SW_PRST,
171 .reg = TH1520_HDMI_RST_CFG,
172 },
173 [TH1520_RESET_ID_VOAXI] = {
174 .bit = BIT(0),
175 .reg = TH1520_AXI4_VO_DW_AXI_RST_CFG,
176 },
177 [TH1520_RESET_ID_VOAXI_APB] = {
178 .bit = BIT(1),
179 .reg = TH1520_AXI4_VO_DW_AXI_RST_CFG,
180 },
181 [TH1520_RESET_ID_X2H_DPU_AXI] = {
182 .bit = BIT(0),
183 .reg = TH1520_X2H_X4_VOSYS_DW_RST_CFG,
184 },
185 [TH1520_RESET_ID_X2H_DPU_AHB] = {
186 .bit = BIT(1),
187 .reg = TH1520_X2H_X4_VOSYS_DW_RST_CFG,
188 },
189 [TH1520_RESET_ID_X2H_DPU1_AXI] = {
190 .bit = BIT(2),
191 .reg = TH1520_X2H_X4_VOSYS_DW_RST_CFG,
192 },
193 [TH1520_RESET_ID_X2H_DPU1_AHB] = {
194 .bit = BIT(3),
195 .reg = TH1520_X2H_X4_VOSYS_DW_RST_CFG,
196 },
197 };
198
199 static const struct th1520_reset_map th1520_ap_resets[] = {
200 [TH1520_RESET_ID_BROM] = {
201 .bit = BIT(0),
202 .reg = TH1520_BROM_RST_CFG,
203 },
204 [TH1520_RESET_ID_C910_TOP] = {
205 .bit = BIT(0),
206 .reg = TH1520_C910_RST_CFG,
207 },
208 [TH1520_RESET_ID_NPU] = {
209 .bit = BIT(0),
210 .reg = TH1520_IMG_NNA_RST_CFG,
211 },
212 [TH1520_RESET_ID_WDT0] = {
213 .bit = BIT(0),
214 .reg = TH1520_WDT0_RST_CFG,
215 },
216 [TH1520_RESET_ID_WDT1] = {
217 .bit = BIT(0),
218 .reg = TH1520_WDT1_RST_CFG,
219 },
220 [TH1520_RESET_ID_C910_C0] = {
221 .bit = BIT(1),
222 .reg = TH1520_C910_RST_CFG,
223 },
224 [TH1520_RESET_ID_C910_C1] = {
225 .bit = BIT(2),
226 .reg = TH1520_C910_RST_CFG,
227 },
228 [TH1520_RESET_ID_C910_C2] = {
229 .bit = BIT(3),
230 .reg = TH1520_C910_RST_CFG,
231 },
232 [TH1520_RESET_ID_C910_C3] = {
233 .bit = BIT(4),
234 .reg = TH1520_C910_RST_CFG,
235 },
236 [TH1520_RESET_ID_CHIP_DBG_CORE] = {
237 .bit = BIT(0),
238 .reg = TH1520_CHIP_DBG_RST_CFG,
239 },
240 [TH1520_RESET_ID_CHIP_DBG_AXI] = {
241 .bit = BIT(1),
242 .reg = TH1520_CHIP_DBG_RST_CFG,
243 },
244 [TH1520_RESET_ID_AXI4_CPUSYS2_AXI] = {
245 .bit = BIT(0),
246 .reg = TH1520_AXI4_CPUSYS2_RST_CFG,
247 },
248 [TH1520_RESET_ID_AXI4_CPUSYS2_APB] = {
249 .bit = BIT(1),
250 .reg = TH1520_AXI4_CPUSYS2_RST_CFG,
251 },
252 [TH1520_RESET_ID_X2H_CPUSYS] = {
253 .bit = BIT(0),
254 .reg = TH1520_X2H_CPUSYS_RST_CFG,
255 },
256 [TH1520_RESET_ID_AHB2_CPUSYS] = {
257 .bit = BIT(0),
258 .reg = TH1520_AHB2_CPUSYS_RST_CFG,
259 },
260 [TH1520_RESET_ID_APB3_CPUSYS] = {
261 .bit = BIT(0),
262 .reg = TH1520_APB3_CPUSYS_RST_CFG,
263 },
264 [TH1520_RESET_ID_MBOX0_APB] = {
265 .bit = BIT(0),
266 .reg = TH1520_MBOX0_RST_CFG,
267 },
268 [TH1520_RESET_ID_MBOX1_APB] = {
269 .bit = BIT(0),
270 .reg = TH1520_MBOX1_RST_CFG,
271 },
272 [TH1520_RESET_ID_MBOX2_APB] = {
273 .bit = BIT(0),
274 .reg = TH1520_MBOX2_RST_CFG,
275 },
276 [TH1520_RESET_ID_MBOX3_APB] = {
277 .bit = BIT(0),
278 .reg = TH1520_MBOX3_RST_CFG,
279 },
280 [TH1520_RESET_ID_TIMER0_APB] = {
281 .bit = BIT(0),
282 .reg = TH1520_TIMER0_RST_CFG,
283 },
284 [TH1520_RESET_ID_TIMER0_CORE] = {
285 .bit = BIT(1),
286 .reg = TH1520_TIMER0_RST_CFG,
287 },
288 [TH1520_RESET_ID_TIMER1_APB] = {
289 .bit = BIT(0),
290 .reg = TH1520_TIMER1_RST_CFG,
291 },
292 [TH1520_RESET_ID_TIMER1_CORE] = {
293 .bit = BIT(1),
294 .reg = TH1520_TIMER1_RST_CFG,
295 },
296 [TH1520_RESET_ID_PERISYS_AHB] = {
297 .bit = BIT(0),
298 .reg = TH1520_PERISYS_AHB_RST_CFG,
299 },
300 [TH1520_RESET_ID_PERISYS_APB1] = {
301 .bit = BIT(0),
302 .reg = TH1520_PERISYS_APB1_RST_CFG,
303 },
304 [TH1520_RESET_ID_PERISYS_APB2] = {
305 .bit = BIT(0),
306 .reg = TH1520_PERISYS_APB2_RST_CFG,
307 },
308 [TH1520_RESET_ID_GMAC0_APB] = {
309 .bit = BIT(0),
310 .reg = TH1520_GMAC0_RST_CFG,
311 },
312 [TH1520_RESET_ID_GMAC0_AHB] = {
313 .bit = BIT(1),
314 .reg = TH1520_GMAC0_RST_CFG,
315 },
316 [TH1520_RESET_ID_GMAC0_CLKGEN] = {
317 .bit = BIT(2),
318 .reg = TH1520_GMAC0_RST_CFG,
319 },
320 [TH1520_RESET_ID_GMAC0_AXI] = {
321 .bit = BIT(3),
322 .reg = TH1520_GMAC0_RST_CFG,
323 },
324 [TH1520_RESET_ID_UART0_APB] = {
325 .bit = BIT(0),
326 .reg = TH1520_UART0_RST_CFG,
327 },
328 [TH1520_RESET_ID_UART0_IF] = {
329 .bit = BIT(1),
330 .reg = TH1520_UART0_RST_CFG,
331 },
332 [TH1520_RESET_ID_UART1_APB] = {
333 .bit = BIT(0),
334 .reg = TH1520_UART1_RST_CFG,
335 },
336 [TH1520_RESET_ID_UART1_IF] = {
337 .bit = BIT(1),
338 .reg = TH1520_UART1_RST_CFG,
339 },
340 [TH1520_RESET_ID_UART2_APB] = {
341 .bit = BIT(0),
342 .reg = TH1520_UART2_RST_CFG,
343 },
344 [TH1520_RESET_ID_UART2_IF] = {
345 .bit = BIT(1),
346 .reg = TH1520_UART2_RST_CFG,
347 },
348 [TH1520_RESET_ID_UART3_APB] = {
349 .bit = BIT(0),
350 .reg = TH1520_UART3_RST_CFG,
351 },
352 [TH1520_RESET_ID_UART3_IF] = {
353 .bit = BIT(1),
354 .reg = TH1520_UART3_RST_CFG,
355 },
356 [TH1520_RESET_ID_UART4_APB] = {
357 .bit = BIT(0),
358 .reg = TH1520_UART4_RST_CFG,
359 },
360 [TH1520_RESET_ID_UART4_IF] = {
361 .bit = BIT(1),
362 .reg = TH1520_UART4_RST_CFG,
363 },
364 [TH1520_RESET_ID_UART5_APB] = {
365 .bit = BIT(0),
366 .reg = TH1520_UART5_RST_CFG,
367 },
368 [TH1520_RESET_ID_UART5_IF] = {
369 .bit = BIT(1),
370 .reg = TH1520_UART5_RST_CFG,
371 },
372 [TH1520_RESET_ID_QSPI0_IF] = {
373 .bit = BIT(0),
374 .reg = TH1520_QSPI0_RST_CFG,
375 },
376 [TH1520_RESET_ID_QSPI0_APB] = {
377 .bit = BIT(1),
378 .reg = TH1520_QSPI0_RST_CFG,
379 },
380 [TH1520_RESET_ID_QSPI1_IF] = {
381 .bit = BIT(0),
382 .reg = TH1520_QSPI1_RST_CFG,
383 },
384 [TH1520_RESET_ID_QSPI1_APB] = {
385 .bit = BIT(1),
386 .reg = TH1520_QSPI1_RST_CFG,
387 },
388 [TH1520_RESET_ID_SPI_IF] = {
389 .bit = BIT(0),
390 .reg = TH1520_SPI_RST_CFG,
391 },
392 [TH1520_RESET_ID_SPI_APB] = {
393 .bit = BIT(1),
394 .reg = TH1520_SPI_RST_CFG,
395 },
396 [TH1520_RESET_ID_I2C0_APB] = {
397 .bit = BIT(0),
398 .reg = TH1520_I2C0_RST_CFG,
399 },
400 [TH1520_RESET_ID_I2C0_CORE] = {
401 .bit = BIT(1),
402 .reg = TH1520_I2C0_RST_CFG,
403 },
404 [TH1520_RESET_ID_I2C1_APB] = {
405 .bit = BIT(0),
406 .reg = TH1520_I2C1_RST_CFG,
407 },
408 [TH1520_RESET_ID_I2C1_CORE] = {
409 .bit = BIT(1),
410 .reg = TH1520_I2C1_RST_CFG,
411 },
412 [TH1520_RESET_ID_I2C2_APB] = {
413 .bit = BIT(0),
414 .reg = TH1520_I2C2_RST_CFG,
415 },
416 [TH1520_RESET_ID_I2C2_CORE] = {
417 .bit = BIT(1),
418 .reg = TH1520_I2C2_RST_CFG,
419 },
420 [TH1520_RESET_ID_I2C3_APB] = {
421 .bit = BIT(0),
422 .reg = TH1520_I2C3_RST_CFG,
423 },
424 [TH1520_RESET_ID_I2C3_CORE] = {
425 .bit = BIT(1),
426 .reg = TH1520_I2C3_RST_CFG,
427 },
428 [TH1520_RESET_ID_I2C4_APB] = {
429 .bit = BIT(0),
430 .reg = TH1520_I2C4_RST_CFG,
431 },
432 [TH1520_RESET_ID_I2C4_CORE] = {
433 .bit = BIT(1),
434 .reg = TH1520_I2C4_RST_CFG,
435 },
436 [TH1520_RESET_ID_I2C5_APB] = {
437 .bit = BIT(0),
438 .reg = TH1520_I2C5_RST_CFG,
439 },
440 [TH1520_RESET_ID_I2C5_CORE] = {
441 .bit = BIT(1),
442 .reg = TH1520_I2C5_RST_CFG,
443 },
444 [TH1520_RESET_ID_GPIO0_DB] = {
445 .bit = BIT(0),
446 .reg = TH1520_GPIO0_RST_CFG,
447 },
448 [TH1520_RESET_ID_GPIO0_APB] = {
449 .bit = BIT(1),
450 .reg = TH1520_GPIO0_RST_CFG,
451 },
452 [TH1520_RESET_ID_GPIO1_DB] = {
453 .bit = BIT(0),
454 .reg = TH1520_GPIO1_RST_CFG,
455 },
456 [TH1520_RESET_ID_GPIO1_APB] = {
457 .bit = BIT(1),
458 .reg = TH1520_GPIO1_RST_CFG,
459 },
460 [TH1520_RESET_ID_GPIO2_DB] = {
461 .bit = BIT(0),
462 .reg = TH1520_GPIO2_RST_CFG,
463 },
464 [TH1520_RESET_ID_GPIO2_APB] = {
465 .bit = BIT(1),
466 .reg = TH1520_GPIO2_RST_CFG,
467 },
468 [TH1520_RESET_ID_PWM_COUNTER] = {
469 .bit = BIT(0),
470 .reg = TH1520_PWM_RST_CFG,
471 },
472 [TH1520_RESET_ID_PWM_APB] = {
473 .bit = BIT(1),
474 .reg = TH1520_PWM_RST_CFG,
475 },
476 [TH1520_RESET_ID_PADCTRL0_APB] = {
477 .bit = BIT(0),
478 .reg = TH1520_PADCTRL0_APSYS_RST_CFG,
479 },
480 [TH1520_RESET_ID_CPU2PERI_X2H] = {
481 .bit = BIT(1),
482 .reg = TH1520_CPU2PERI_X2H_RST_CFG,
483 },
484 [TH1520_RESET_ID_CPU2AON_X2H] = {
485 .bit = BIT(0),
486 .reg = TH1520_CPU2AON_X2H_RST_CFG,
487 },
488 [TH1520_RESET_ID_AON2CPU_A2X] = {
489 .bit = BIT(0),
490 .reg = TH1520_AON2CPU_A2X_RST_CFG,
491 },
492 [TH1520_RESET_ID_NPUSYS_AXI] = {
493 .bit = BIT(0),
494 .reg = TH1520_NPUSYS_AXI_RST_CFG,
495 },
496 [TH1520_RESET_ID_NPUSYS_AXI_APB] = {
497 .bit = BIT(1),
498 .reg = TH1520_NPUSYS_AXI_RST_CFG,
499 },
500 [TH1520_RESET_ID_CPU2VP_X2P] = {
501 .bit = BIT(0),
502 .reg = TH1520_CPU2VP_X2P_RST_CFG,
503 },
504 [TH1520_RESET_ID_CPU2VI_X2H] = {
505 .bit = BIT(0),
506 .reg = TH1520_CPU2VI_X2H_RST_CFG,
507 },
508 [TH1520_RESET_ID_BMU_AXI] = {
509 .bit = BIT(0),
510 .reg = TH1520_BMU_C910_RST_CFG,
511 },
512 [TH1520_RESET_ID_BMU_APB] = {
513 .bit = BIT(1),
514 .reg = TH1520_BMU_C910_RST_CFG,
515 },
516 [TH1520_RESET_ID_DMAC_CPUSYS_AXI] = {
517 .bit = BIT(0),
518 .reg = TH1520_DMAC_CPUSYS_RST_CFG,
519 },
520 [TH1520_RESET_ID_DMAC_CPUSYS_AHB] = {
521 .bit = BIT(1),
522 .reg = TH1520_DMAC_CPUSYS_RST_CFG,
523 },
524 [TH1520_RESET_ID_SPINLOCK] = {
525 .bit = BIT(0),
526 .reg = TH1520_SPINLOCK_RST_CFG,
527 },
528 [TH1520_RESET_ID_CFG2TEE] = {
529 .bit = BIT(0),
530 .reg = TH1520_CFG2TEE_X2H_RST_CFG,
531 },
532 [TH1520_RESET_ID_DSMART] = {
533 .bit = BIT(0),
534 .reg = TH1520_DSMART_RST_CFG,
535 },
536 [TH1520_RESET_ID_GPIO3_DB] = {
537 .bit = BIT(0),
538 .reg = TH1520_GPIO3_RST_CFG,
539 },
540 [TH1520_RESET_ID_GPIO3_APB] = {
541 .bit = BIT(1),
542 .reg = TH1520_GPIO3_RST_CFG,
543 },
544 [TH1520_RESET_ID_PERI_I2S] = {
545 .bit = BIT(0),
546 .reg = TH1520_I2S_RST_CFG,
547 },
548 [TH1520_RESET_ID_PERI_APB3] = {
549 .bit = BIT(0),
550 .reg = TH1520_PERI_APB3_RST_CFG,
551 },
552 [TH1520_RESET_ID_PERI2PERI1_APB] = {
553 .bit = BIT(1),
554 .reg = TH1520_PERI_APB3_RST_CFG,
555 },
556 [TH1520_RESET_ID_VPSYS_APB] = {
557 .bit = BIT(0),
558 .reg = TH1520_VP_SUBSYS_RST_CFG,
559 },
560 [TH1520_RESET_ID_PERISYS_APB4] = {
561 .bit = BIT(0),
562 .reg = TH1520_PERISYS_APB4_RST_CFG,
563 },
564 [TH1520_RESET_ID_GMAC1_APB] = {
565 .bit = BIT(0),
566 .reg = TH1520_GMAC1_RST_CFG,
567 },
568 [TH1520_RESET_ID_GMAC1_AHB] = {
569 .bit = BIT(1),
570 .reg = TH1520_GMAC1_RST_CFG,
571 },
572 [TH1520_RESET_ID_GMAC1_CLKGEN] = {
573 .bit = BIT(2),
574 .reg = TH1520_GMAC1_RST_CFG,
575 },
576 [TH1520_RESET_ID_GMAC1_AXI] = {
577 .bit = BIT(3),
578 .reg = TH1520_GMAC1_RST_CFG,
579 },
580 [TH1520_RESET_ID_GMAC_AXI] = {
581 .bit = BIT(0),
582 .reg = TH1520_GMAC_AXI_RST_CFG,
583 },
584 [TH1520_RESET_ID_GMAC_AXI_APB] = {
585 .bit = BIT(1),
586 .reg = TH1520_GMAC_AXI_RST_CFG,
587 },
588 [TH1520_RESET_ID_PADCTRL1_APB] = {
589 .bit = BIT(0),
590 .reg = TH1520_PADCTRL1_APSYS_RST_CFG,
591 },
592 [TH1520_RESET_ID_VOSYS_AXI] = {
593 .bit = BIT(0),
594 .reg = TH1520_VOSYS_AXI_RST_CFG,
595 },
596 [TH1520_RESET_ID_VOSYS_AXI_APB] = {
597 .bit = BIT(1),
598 .reg = TH1520_VOSYS_AXI_RST_CFG,
599 },
600 [TH1520_RESET_ID_VOSYS_AXI_X2X] = {
601 .bit = BIT(0),
602 .reg = TH1520_VOSYS_X2X_RST_CFG,
603 },
604 [TH1520_RESET_ID_MISC2VP_X2X] = {
605 .bit = BIT(0),
606 .reg = TH1520_MISC2VP_X2X_RST_CFG,
607 },
608 [TH1520_RESET_ID_DSPSYS] = {
609 .bit = BIT(0),
610 .reg = TH1520_SUBSYS_RST_CFG,
611 },
612 [TH1520_RESET_ID_VISYS] = {
613 .bit = BIT(1),
614 .reg = TH1520_SUBSYS_RST_CFG,
615 },
616 [TH1520_RESET_ID_VOSYS] = {
617 .bit = BIT(2),
618 .reg = TH1520_SUBSYS_RST_CFG,
619 },
620 [TH1520_RESET_ID_VPSYS] = {
621 .bit = BIT(3),
622 .reg = TH1520_SUBSYS_RST_CFG,
623 },
624 };
625
626 static const struct th1520_reset_map th1520_dsp_resets[] = {
627 [TH1520_RESET_ID_X2X_DSP1] = {
628 .bit = BIT(0),
629 .reg = TH1520_DSPSYS_RST_CFG,
630 },
631 [TH1520_RESET_ID_X2X_DSP0] = {
632 .bit = BIT(1),
633 .reg = TH1520_DSPSYS_RST_CFG,
634 },
635 [TH1520_RESET_ID_X2X_SLAVE_DSP1] = {
636 .bit = BIT(2),
637 .reg = TH1520_DSPSYS_RST_CFG,
638 },
639 [TH1520_RESET_ID_X2X_SLAVE_DSP0] = {
640 .bit = BIT(3),
641 .reg = TH1520_DSPSYS_RST_CFG,
642 },
643 [TH1520_RESET_ID_DSP0_CORE] = {
644 .bit = BIT(8),
645 .reg = TH1520_DSPSYS_RST_CFG,
646 },
647 [TH1520_RESET_ID_DSP0_DEBUG] = {
648 .bit = BIT(9),
649 .reg = TH1520_DSPSYS_RST_CFG,
650 },
651 [TH1520_RESET_ID_DSP0_APB] = {
652 .bit = BIT(10),
653 .reg = TH1520_DSPSYS_RST_CFG,
654 },
655 [TH1520_RESET_ID_DSP1_CORE] = {
656 .bit = BIT(12),
657 .reg = TH1520_DSPSYS_RST_CFG,
658 },
659 [TH1520_RESET_ID_DSP1_DEBUG] = {
660 .bit = BIT(13),
661 .reg = TH1520_DSPSYS_RST_CFG,
662 },
663 [TH1520_RESET_ID_DSP1_APB] = {
664 .bit = BIT(14),
665 .reg = TH1520_DSPSYS_RST_CFG,
666 },
667 [TH1520_RESET_ID_DSPSYS_APB] = {
668 .bit = BIT(16),
669 .reg = TH1520_DSPSYS_RST_CFG,
670 },
671 [TH1520_RESET_ID_AXI4_DSPSYS_SLV] = {
672 .bit = BIT(20),
673 .reg = TH1520_DSPSYS_RST_CFG,
674 },
675 [TH1520_RESET_ID_AXI4_DSPSYS] = {
676 .bit = BIT(24),
677 .reg = TH1520_DSPSYS_RST_CFG,
678 },
679 [TH1520_RESET_ID_AXI4_DSP_RS] = {
680 .bit = BIT(26),
681 .reg = TH1520_DSPSYS_RST_CFG,
682 },
683 };
684
685 static const struct th1520_reset_map th1520_misc_resets[] = {
686 [TH1520_RESET_ID_EMMC_SDIO_CLKGEN] = {
687 .bit = BIT(0),
688 .reg = TH1520_EMMC_RST_CFG,
689 },
690 [TH1520_RESET_ID_EMMC] = {
691 .bit = BIT(1),
692 .reg = TH1520_EMMC_RST_CFG,
693 },
694 [TH1520_RESET_ID_MISCSYS_AXI] = {
695 .bit = BIT(0),
696 .reg = TH1520_MISCSYS_AXI_RST_CFG,
697 },
698 [TH1520_RESET_ID_MISCSYS_AXI_APB] = {
699 .bit = BIT(1),
700 .reg = TH1520_MISCSYS_AXI_RST_CFG,
701 },
702 [TH1520_RESET_ID_SDIO0] = {
703 .bit = BIT(0),
704 .reg = TH1520_SDIO0_RST_CFG,
705 },
706 [TH1520_RESET_ID_SDIO1] = {
707 .bit = BIT(1),
708 .reg = TH1520_SDIO1_RST_CFG,
709 },
710 [TH1520_RESET_ID_USB3_APB] = {
711 .bit = BIT(0),
712 .reg = TH1520_USB3_DRD_RST_CFG,
713 },
714 [TH1520_RESET_ID_USB3_PHY] = {
715 .bit = BIT(1),
716 .reg = TH1520_USB3_DRD_RST_CFG,
717 },
718 [TH1520_RESET_ID_USB3_VCC] = {
719 .bit = BIT(2),
720 .reg = TH1520_USB3_DRD_RST_CFG,
721 },
722 };
723
724 static const struct th1520_reset_map th1520_vi_resets[] = {
725 [TH1520_RESET_ID_ISP0] = {
726 .bit = BIT(0),
727 .reg = TH1520_VISYS_RST_CFG,
728 },
729 [TH1520_RESET_ID_ISP1] = {
730 .bit = BIT(4),
731 .reg = TH1520_VISYS_RST_CFG,
732 },
733 [TH1520_RESET_ID_CSI0_APB] = {
734 .bit = BIT(16),
735 .reg = TH1520_VISYS_RST_CFG,
736 },
737 [TH1520_RESET_ID_CSI1_APB] = {
738 .bit = BIT(17),
739 .reg = TH1520_VISYS_RST_CFG,
740 },
741 [TH1520_RESET_ID_CSI2_APB] = {
742 .bit = BIT(18),
743 .reg = TH1520_VISYS_RST_CFG,
744 },
745 [TH1520_RESET_ID_MIPI_FIFO] = {
746 .bit = BIT(20),
747 .reg = TH1520_VISYS_RST_CFG,
748 },
749 [TH1520_RESET_ID_ISP_VENC_APB] = {
750 .bit = BIT(24),
751 .reg = TH1520_VISYS_RST_CFG,
752 },
753 [TH1520_RESET_ID_VIPRE_APB] = {
754 .bit = BIT(28),
755 .reg = TH1520_VISYS_RST_CFG,
756 },
757 [TH1520_RESET_ID_VIPRE_AXI] = {
758 .bit = BIT(29),
759 .reg = TH1520_VISYS_RST_CFG,
760 },
761 [TH1520_RESET_ID_DW200_APB] = {
762 .bit = BIT(31),
763 .reg = TH1520_VISYS_RST_CFG,
764 },
765 [TH1520_RESET_ID_VISYS3_AXI] = {
766 .bit = BIT(8),
767 .reg = TH1520_VISYS_2_RST_CFG,
768 },
769 [TH1520_RESET_ID_VISYS2_AXI] = {
770 .bit = BIT(9),
771 .reg = TH1520_VISYS_2_RST_CFG,
772 },
773 [TH1520_RESET_ID_VISYS1_AXI] = {
774 .bit = BIT(10),
775 .reg = TH1520_VISYS_2_RST_CFG,
776 },
777 [TH1520_RESET_ID_VISYS_AXI] = {
778 .bit = BIT(12),
779 .reg = TH1520_VISYS_2_RST_CFG,
780 },
781 [TH1520_RESET_ID_VISYS_APB] = {
782 .bit = BIT(16),
783 .reg = TH1520_VISYS_2_RST_CFG,
784 },
785 [TH1520_RESET_ID_ISP_VENC_AXI] = {
786 .bit = BIT(20),
787 .reg = TH1520_VISYS_2_RST_CFG,
788 },
789 };
790
791 static const struct th1520_reset_map th1520_vp_resets[] = {
792 [TH1520_RESET_ID_VPSYS_AXI_APB] = {
793 .bit = BIT(0),
794 .reg = TH1520_AXIBUS_RST_CFG,
795 },
796 [TH1520_RESET_ID_VPSYS_AXI] = {
797 .bit = BIT(1),
798 .reg = TH1520_AXIBUS_RST_CFG,
799 },
800 [TH1520_RESET_ID_FCE_APB] = {
801 .bit = BIT(0),
802 .reg = TH1520_FCE_RST_CFG,
803 },
804 [TH1520_RESET_ID_FCE_CORE] = {
805 .bit = BIT(1),
806 .reg = TH1520_FCE_RST_CFG,
807 },
808 [TH1520_RESET_ID_FCE_X2X_MASTER] = {
809 .bit = BIT(4),
810 .reg = TH1520_FCE_RST_CFG,
811 },
812 [TH1520_RESET_ID_FCE_X2X_SLAVE] = {
813 .bit = BIT(5),
814 .reg = TH1520_FCE_RST_CFG,
815 },
816 [TH1520_RESET_ID_G2D_APB] = {
817 .bit = BIT(0),
818 .reg = TH1520_G2D_RST_CFG,
819 },
820 [TH1520_RESET_ID_G2D_ACLK] = {
821 .bit = BIT(1),
822 .reg = TH1520_G2D_RST_CFG,
823 },
824 [TH1520_RESET_ID_G2D_CORE] = {
825 .bit = BIT(2),
826 .reg = TH1520_G2D_RST_CFG,
827 },
828 [TH1520_RESET_ID_VDEC_APB] = {
829 .bit = BIT(0),
830 .reg = TH1520_VDEC_RST_CFG,
831 },
832 [TH1520_RESET_ID_VDEC_ACLK] = {
833 .bit = BIT(1),
834 .reg = TH1520_VDEC_RST_CFG,
835 },
836 [TH1520_RESET_ID_VDEC_CORE] = {
837 .bit = BIT(2),
838 .reg = TH1520_VDEC_RST_CFG,
839 },
840 [TH1520_RESET_ID_VENC_APB] = {
841 .bit = BIT(0),
842 .reg = TH1520_VENC_RST_CFG,
843 },
844 [TH1520_RESET_ID_VENC_CORE] = {
845 .bit = BIT(1),
846 .reg = TH1520_VENC_RST_CFG,
847 },
848 };
849
850 static inline struct th1520_reset_priv *
to_th1520_reset(struct reset_controller_dev * rcdev)851 to_th1520_reset(struct reset_controller_dev *rcdev)
852 {
853 return container_of(rcdev, struct th1520_reset_priv, rcdev);
854 }
855
th1520_reset_assert(struct reset_controller_dev * rcdev,unsigned long id)856 static int th1520_reset_assert(struct reset_controller_dev *rcdev,
857 unsigned long id)
858 {
859 struct th1520_reset_priv *priv = to_th1520_reset(rcdev);
860 const struct th1520_reset_map *reset;
861
862 reset = &priv->resets[id];
863
864 return regmap_update_bits(priv->map, reset->reg, reset->bit, 0);
865 }
866
th1520_reset_deassert(struct reset_controller_dev * rcdev,unsigned long id)867 static int th1520_reset_deassert(struct reset_controller_dev *rcdev,
868 unsigned long id)
869 {
870 struct th1520_reset_priv *priv = to_th1520_reset(rcdev);
871 const struct th1520_reset_map *reset;
872
873 reset = &priv->resets[id];
874
875 return regmap_update_bits(priv->map, reset->reg, reset->bit,
876 reset->bit);
877 }
878
879 static const struct reset_control_ops th1520_reset_ops = {
880 .assert = th1520_reset_assert,
881 .deassert = th1520_reset_deassert,
882 };
883
884 static const struct regmap_config th1520_reset_regmap_config = {
885 .reg_bits = 32,
886 .val_bits = 32,
887 .reg_stride = 4,
888 };
889
th1520_reset_probe(struct platform_device * pdev)890 static int th1520_reset_probe(struct platform_device *pdev)
891 {
892 const struct th1520_reset_data *data;
893 struct device *dev = &pdev->dev;
894 struct th1520_reset_priv *priv;
895 void __iomem *base;
896 int ret;
897
898 data = device_get_match_data(dev);
899
900 priv = devm_kzalloc(dev, sizeof(*priv), GFP_KERNEL);
901 if (!priv)
902 return -ENOMEM;
903
904 base = devm_platform_ioremap_resource(pdev, 0);
905 if (IS_ERR(base))
906 return PTR_ERR(base);
907
908 priv->map = devm_regmap_init_mmio(dev, base,
909 &th1520_reset_regmap_config);
910 if (IS_ERR(priv->map))
911 return PTR_ERR(priv->map);
912
913 if (of_device_is_compatible(dev->of_node, "thead,th1520-reset")) {
914 /* Initialize GPU resets to asserted state */
915 ret = regmap_update_bits(priv->map, TH1520_GPU_RST_CFG,
916 TH1520_GPU_RST_CFG_MASK, 0);
917 if (ret)
918 return ret;
919 }
920
921 priv->rcdev.owner = THIS_MODULE;
922 priv->rcdev.nr_resets = data->num;
923 priv->rcdev.ops = &th1520_reset_ops;
924 priv->rcdev.of_node = dev->of_node;
925
926 priv->resets = data->resets;
927
928 return devm_reset_controller_register(dev, &priv->rcdev);
929 }
930
931 static const struct th1520_reset_data th1520_reset_data = {
932 .resets = th1520_resets,
933 .num = ARRAY_SIZE(th1520_resets),
934 };
935
936 static const struct th1520_reset_data th1520_ap_reset_data = {
937 .resets = th1520_ap_resets,
938 .num = ARRAY_SIZE(th1520_ap_resets),
939 };
940
941 static const struct th1520_reset_data th1520_dsp_reset_data = {
942 .resets = th1520_dsp_resets,
943 .num = ARRAY_SIZE(th1520_dsp_resets),
944 };
945
946 static const struct th1520_reset_data th1520_misc_reset_data = {
947 .resets = th1520_misc_resets,
948 .num = ARRAY_SIZE(th1520_misc_resets),
949 };
950
951 static const struct th1520_reset_data th1520_vi_reset_data = {
952 .resets = th1520_vi_resets,
953 .num = ARRAY_SIZE(th1520_vi_resets),
954 };
955
956 static const struct th1520_reset_data th1520_vp_reset_data = {
957 .resets = th1520_vp_resets,
958 .num = ARRAY_SIZE(th1520_vp_resets),
959 };
960
961 static const struct of_device_id th1520_reset_match[] = {
962 { .compatible = "thead,th1520-reset", .data = &th1520_reset_data },
963 { .compatible = "thead,th1520-reset-ap", .data = &th1520_ap_reset_data },
964 { .compatible = "thead,th1520-reset-dsp", .data = &th1520_dsp_reset_data },
965 { .compatible = "thead,th1520-reset-misc", .data = &th1520_misc_reset_data },
966 { .compatible = "thead,th1520-reset-vi", .data = &th1520_vi_reset_data },
967 { .compatible = "thead,th1520-reset-vp", .data = &th1520_vp_reset_data },
968 { /* sentinel */ }
969 };
970 MODULE_DEVICE_TABLE(of, th1520_reset_match);
971
972 static struct platform_driver th1520_reset_driver = {
973 .driver = {
974 .name = "th1520-reset",
975 .of_match_table = th1520_reset_match,
976 },
977 .probe = th1520_reset_probe,
978 };
979 module_platform_driver(th1520_reset_driver);
980
981 MODULE_AUTHOR("Michal Wilczynski <m.wilczynski@samsung.com>");
982 MODULE_DESCRIPTION("T-HEAD TH1520 SoC reset controller");
983 MODULE_LICENSE("GPL");
984