xref: /linux/drivers/reset/reset-th1520.c (revision 208eed95fc710827b100266c9450ae84d46727bd)
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