xref: /rk3399_ARM-atf/plat/renesas/common/bl2_cpg_init.c (revision db10bad9ffb2b04c325f7eec021c7cfc75797ca4)
1499c2713SBiju Das /*
2499c2713SBiju Das  * Copyright (c) 2015-2020, Renesas Electronics Corporation. All rights reserved.
3499c2713SBiju Das  *
4499c2713SBiju Das  * SPDX-License-Identifier: BSD-3-Clause
5499c2713SBiju Das  */
6499c2713SBiju Das 
7499c2713SBiju Das #include <common/debug.h>
8499c2713SBiju Das #include <lib/mmio.h>
9499c2713SBiju Das 
10499c2713SBiju Das #include "cpg_registers.h"
11499c2713SBiju Das #include "rcar_def.h"
12499c2713SBiju Das #include "rcar_private.h"
13499c2713SBiju Das 
14499c2713SBiju Das static void bl2_secure_cpg_init(void);
15499c2713SBiju Das 
16499c2713SBiju Das #if (RCAR_LSI == RCAR_AUTO) || (RCAR_LSI == RCAR_H3) || (RCAR_LSI == RCAR_H3N)
17499c2713SBiju Das static void bl2_realtime_cpg_init_h3(void);
18499c2713SBiju Das static void bl2_system_cpg_init_h3(void);
19499c2713SBiju Das #endif
20499c2713SBiju Das 
21*db10bad9SBiju Das #if (RCAR_LSI == RCAR_AUTO) || (RCAR_LSI == RCAR_M3) || (RCAR_LSI == RZ_G2M)
22499c2713SBiju Das static void bl2_realtime_cpg_init_m3(void);
23499c2713SBiju Das static void bl2_system_cpg_init_m3(void);
24499c2713SBiju Das #endif
25499c2713SBiju Das 
26499c2713SBiju Das #if (RCAR_LSI == RCAR_AUTO) || (RCAR_LSI == RCAR_M3N)
27499c2713SBiju Das static void bl2_realtime_cpg_init_m3n(void);
28499c2713SBiju Das static void bl2_system_cpg_init_m3n(void);
29499c2713SBiju Das #endif
30499c2713SBiju Das 
31499c2713SBiju Das #if (RCAR_LSI == RCAR_AUTO) || (RCAR_LSI == RCAR_V3M)
32499c2713SBiju Das static void bl2_realtime_cpg_init_v3m(void);
33499c2713SBiju Das static void bl2_system_cpg_init_v3m(void);
34499c2713SBiju Das #endif
35499c2713SBiju Das 
36499c2713SBiju Das #if (RCAR_LSI == RCAR_AUTO) || (RCAR_LSI == RCAR_E3)
37499c2713SBiju Das static void bl2_realtime_cpg_init_e3(void);
38499c2713SBiju Das static void bl2_system_cpg_init_e3(void);
39499c2713SBiju Das #endif
40499c2713SBiju Das 
41499c2713SBiju Das #if (RCAR_LSI == RCAR_AUTO) || (RCAR_LSI == RCAR_D3)
42499c2713SBiju Das static void bl2_realtime_cpg_init_d3(void);
43499c2713SBiju Das static void bl2_system_cpg_init_d3(void);
44499c2713SBiju Das #endif
45499c2713SBiju Das 
46499c2713SBiju Das typedef struct {
47499c2713SBiju Das 	uintptr_t adr;
48499c2713SBiju Das 	uint32_t val;
49499c2713SBiju Das } reg_setting_t;
50499c2713SBiju Das 
51499c2713SBiju Das static void bl2_secure_cpg_init(void)
52499c2713SBiju Das {
53499c2713SBiju Das 	uint32_t stop_cr2, reset_cr2;
54499c2713SBiju Das 	uint32_t stop_cr4, reset_cr4;
55499c2713SBiju Das 	uint32_t stop_cr5, reset_cr5;
56499c2713SBiju Das 
57499c2713SBiju Das #if (RCAR_LSI == RCAR_D3)
58499c2713SBiju Das 	reset_cr2 = 0x00000000U;
59499c2713SBiju Das 	stop_cr2 = 0xFFFFFFFFU;
60499c2713SBiju Das #elif (RCAR_LSI == RCAR_E3)
61499c2713SBiju Das 	reset_cr2 = 0x10000000U;
62499c2713SBiju Das 	stop_cr2 = 0xEFFFFFFFU;
63499c2713SBiju Das #else
64499c2713SBiju Das 	reset_cr2 = 0x14000000U;
65499c2713SBiju Das 	stop_cr2 = 0xEBFFFFFFU;
66499c2713SBiju Das #endif
67499c2713SBiju Das 
68499c2713SBiju Das #if (RCAR_LSI == RCAR_D3)
69499c2713SBiju Das 	reset_cr4 = 0x00000000U;
70499c2713SBiju Das 	stop_cr4 = 0xFFFFFFFFU;
71499c2713SBiju Das 	reset_cr5 = 0x00000000U;
72499c2713SBiju Das 	stop_cr5 = 0xFFFFFFFFU;
73499c2713SBiju Das #else
74499c2713SBiju Das 	reset_cr4 = 0x80000003U;
75499c2713SBiju Das 	stop_cr4 = 0x7FFFFFFFU;
76499c2713SBiju Das 	reset_cr5 = 0x40000000U;
77499c2713SBiju Das 	stop_cr5 = 0xBFFFFFFFU;
78499c2713SBiju Das #endif
79499c2713SBiju Das 
80499c2713SBiju Das 	/* Secure Module Stop Control Registers */
81499c2713SBiju Das 	cpg_write(SCMSTPCR0, 0xFFFFFFFFU);
82499c2713SBiju Das 	cpg_write(SCMSTPCR1, 0xFFFFFFFFU);
83499c2713SBiju Das 	cpg_write(SCMSTPCR2, stop_cr2);
84499c2713SBiju Das 	cpg_write(SCMSTPCR3, 0xFFFFFFFFU);
85499c2713SBiju Das 	cpg_write(SCMSTPCR4, stop_cr4);
86499c2713SBiju Das 	cpg_write(SCMSTPCR5, stop_cr5);
87499c2713SBiju Das 	cpg_write(SCMSTPCR6, 0xFFFFFFFFU);
88499c2713SBiju Das 	cpg_write(SCMSTPCR7, 0xFFFFFFFFU);
89499c2713SBiju Das 	cpg_write(SCMSTPCR8, 0xFFFFFFFFU);
90499c2713SBiju Das 	cpg_write(SCMSTPCR9, 0xFFFDFFFFU);
91499c2713SBiju Das 	cpg_write(SCMSTPCR10, 0xFFFFFFFFU);
92499c2713SBiju Das 	cpg_write(SCMSTPCR11, 0xFFFFFFFFU);
93499c2713SBiju Das 
94499c2713SBiju Das 	/* Secure Software Reset Access Enable Control Registers */
95499c2713SBiju Das 	cpg_write(SCSRSTECR0, 0x00000000U);
96499c2713SBiju Das 	cpg_write(SCSRSTECR1, 0x00000000U);
97499c2713SBiju Das 	cpg_write(SCSRSTECR2, reset_cr2);
98499c2713SBiju Das 	cpg_write(SCSRSTECR3, 0x00000000U);
99499c2713SBiju Das 	cpg_write(SCSRSTECR4, reset_cr4);
100499c2713SBiju Das 	cpg_write(SCSRSTECR5, reset_cr5);
101499c2713SBiju Das 	cpg_write(SCSRSTECR6, 0x00000000U);
102499c2713SBiju Das 	cpg_write(SCSRSTECR7, 0x00000000U);
103499c2713SBiju Das 	cpg_write(SCSRSTECR8, 0x00000000U);
104499c2713SBiju Das 	cpg_write(SCSRSTECR9, 0x00020000U);
105499c2713SBiju Das 	cpg_write(SCSRSTECR10, 0x00000000U);
106499c2713SBiju Das 	cpg_write(SCSRSTECR11, 0x00000000U);
107499c2713SBiju Das }
108499c2713SBiju Das 
109499c2713SBiju Das #if (RCAR_LSI == RCAR_AUTO) || (RCAR_LSI == RCAR_H3) || (RCAR_LSI == RCAR_H3N)
110499c2713SBiju Das static void bl2_realtime_cpg_init_h3(void)
111499c2713SBiju Das {
112499c2713SBiju Das 	uint32_t cut = mmio_read_32(RCAR_PRR) & PRR_CUT_MASK;
113499c2713SBiju Das 	uint32_t cr0, cr8;
114499c2713SBiju Das 
115499c2713SBiju Das 	cr0 = (cut == PRR_PRODUCT_10 || cut == PRR_PRODUCT_11) ?
116499c2713SBiju Das 	    0x00200000U : 0x00210000U;
117499c2713SBiju Das 	cr8 = (cut == PRR_PRODUCT_10 || cut == PRR_PRODUCT_11) ?
118499c2713SBiju Das 	    0x01F1FFF4U : 0x01F1FFF7U;
119499c2713SBiju Das 
120499c2713SBiju Das 	cpg_write(RMSTPCR0, cr0);
121499c2713SBiju Das 	cpg_write(RMSTPCR1, 0xFFFFFFFFU);
122499c2713SBiju Das 	cpg_write(RMSTPCR2, 0x040E0FDCU);
123499c2713SBiju Das 	cpg_write(RMSTPCR3, 0xFFFFFFDFU);
124499c2713SBiju Das 	cpg_write(RMSTPCR4, 0x80000004U);
125499c2713SBiju Das 	cpg_write(RMSTPCR5, 0xC3FFFFFFU);
126499c2713SBiju Das 	cpg_write(RMSTPCR6, 0xFFFFFFFFU);
127499c2713SBiju Das 	cpg_write(RMSTPCR7, 0xFFFFFFFFU);
128499c2713SBiju Das 	cpg_write(RMSTPCR8, cr8);
129499c2713SBiju Das 	cpg_write(RMSTPCR9, 0xFFFFFFFEU);
130499c2713SBiju Das 	cpg_write(RMSTPCR10, 0xFFFEFFE0U);
131499c2713SBiju Das 	cpg_write(RMSTPCR11, 0x000000B7U);
132499c2713SBiju Das }
133499c2713SBiju Das 
134499c2713SBiju Das static void bl2_system_cpg_init_h3(void)
135499c2713SBiju Das {
136499c2713SBiju Das 	/** System Module Stop Control Registers */
137499c2713SBiju Das 	cpg_write(SMSTPCR0, 0x00210000U);
138499c2713SBiju Das 	cpg_write(SMSTPCR1, 0xFFFFFFFFU);
139499c2713SBiju Das 	cpg_write(SMSTPCR2, 0x040E2FDCU);
140499c2713SBiju Das 	cpg_write(SMSTPCR3, 0xFFFFFBDFU);
141499c2713SBiju Das 	cpg_write(SMSTPCR4, 0x80000004U);
142499c2713SBiju Das 	cpg_write(SMSTPCR5, 0xC3FFFFFFU);
143499c2713SBiju Das 	cpg_write(SMSTPCR6, 0xFFFFFFFFU);
144499c2713SBiju Das 	cpg_write(SMSTPCR7, 0xFFFFFFFFU);
145499c2713SBiju Das 	cpg_write(SMSTPCR8, 0x01F1FFF5U);
146499c2713SBiju Das 	cpg_write(SMSTPCR9, 0xFFFFFFFFU);
147499c2713SBiju Das 	cpg_write(SMSTPCR10, 0xFFFEFFE0U);
148499c2713SBiju Das 	cpg_write(SMSTPCR11, 0x000000B7U);
149499c2713SBiju Das }
150499c2713SBiju Das #endif
151499c2713SBiju Das 
152*db10bad9SBiju Das #if (RCAR_LSI == RCAR_AUTO) || (RCAR_LSI == RCAR_M3) || (RCAR_LSI == RZ_G2M)
153499c2713SBiju Das static void bl2_realtime_cpg_init_m3(void)
154499c2713SBiju Das {
155499c2713SBiju Das 	/* Realtime Module Stop Control Registers */
156499c2713SBiju Das 	cpg_write(RMSTPCR0, 0x00200000U);
157499c2713SBiju Das 	cpg_write(RMSTPCR1, 0xFFFFFFFFU);
158499c2713SBiju Das 	cpg_write(RMSTPCR2, 0x040E0FDCU);
159499c2713SBiju Das 	cpg_write(RMSTPCR3, 0xFFFFFFDFU);
160499c2713SBiju Das 	cpg_write(RMSTPCR4, 0x80000004U);
161499c2713SBiju Das 	cpg_write(RMSTPCR5, 0xC3FFFFFFU);
162499c2713SBiju Das 	cpg_write(RMSTPCR6, 0xFFFFFFFFU);
163499c2713SBiju Das 	cpg_write(RMSTPCR7, 0xFFFFFFFFU);
164499c2713SBiju Das 	cpg_write(RMSTPCR8, 0x01F1FFF7U);
165499c2713SBiju Das 	cpg_write(RMSTPCR9, 0xFFFFFFFEU);
166499c2713SBiju Das 	cpg_write(RMSTPCR10, 0xFFFEFFE0U);
167499c2713SBiju Das 	cpg_write(RMSTPCR11, 0x000000B7U);
168499c2713SBiju Das }
169499c2713SBiju Das 
170499c2713SBiju Das static void bl2_system_cpg_init_m3(void)
171499c2713SBiju Das {
172499c2713SBiju Das 	/* System Module Stop Control Registers */
173499c2713SBiju Das 	cpg_write(SMSTPCR0, 0x00200000U);
174499c2713SBiju Das 	cpg_write(SMSTPCR1, 0xFFFFFFFFU);
175499c2713SBiju Das 	cpg_write(SMSTPCR2, 0x040E2FDCU);
176499c2713SBiju Das 	cpg_write(SMSTPCR3, 0xFFFFFBDFU);
177499c2713SBiju Das 	cpg_write(SMSTPCR4, 0x80000004U);
178499c2713SBiju Das 	cpg_write(SMSTPCR5, 0xC3FFFFFFU);
179499c2713SBiju Das 	cpg_write(SMSTPCR6, 0xFFFFFFFFU);
180499c2713SBiju Das 	cpg_write(SMSTPCR7, 0xFFFFFFFFU);
181499c2713SBiju Das 	cpg_write(SMSTPCR8, 0x01F1FFF7U);
182499c2713SBiju Das 	cpg_write(SMSTPCR9, 0xFFFFFFFFU);
183499c2713SBiju Das 	cpg_write(SMSTPCR10, 0xFFFEFFE0U);
184499c2713SBiju Das 	cpg_write(SMSTPCR11, 0x000000B7U);
185499c2713SBiju Das }
186499c2713SBiju Das #endif
187499c2713SBiju Das 
188499c2713SBiju Das #if (RCAR_LSI == RCAR_AUTO) || (RCAR_LSI == RCAR_M3N)
189499c2713SBiju Das static void bl2_realtime_cpg_init_m3n(void)
190499c2713SBiju Das {
191499c2713SBiju Das 	/* Realtime Module Stop Control Registers */
192499c2713SBiju Das 	cpg_write(RMSTPCR0, 0x00210000U);
193499c2713SBiju Das 	cpg_write(RMSTPCR1, 0xFFFFFFFFU);
194499c2713SBiju Das 	cpg_write(RMSTPCR2, 0x040E0FDCU);
195499c2713SBiju Das 	cpg_write(RMSTPCR3, 0xFFFFFFDFU);
196499c2713SBiju Das 	cpg_write(RMSTPCR4, 0x80000004U);
197499c2713SBiju Das 	cpg_write(RMSTPCR5, 0xC3FFFFFFU);
198499c2713SBiju Das 	cpg_write(RMSTPCR6, 0xFFFFFFFFU);
199499c2713SBiju Das 	cpg_write(RMSTPCR7, 0xFFFFFFFFU);
200499c2713SBiju Das 	cpg_write(RMSTPCR8, 0x00F1FFF7U);
201499c2713SBiju Das 	cpg_write(RMSTPCR9, 0xFFFFFFFFU);
202499c2713SBiju Das 	cpg_write(RMSTPCR10, 0xFFFFFFE0U);
203499c2713SBiju Das 	cpg_write(RMSTPCR11, 0x000000B7U);
204499c2713SBiju Das }
205499c2713SBiju Das 
206499c2713SBiju Das static void bl2_system_cpg_init_m3n(void)
207499c2713SBiju Das {
208499c2713SBiju Das 	/* System Module Stop Control Registers */
209499c2713SBiju Das 	cpg_write(SMSTPCR0, 0x00210000U);
210499c2713SBiju Das 	cpg_write(SMSTPCR1, 0xFFFFFFFFU);
211499c2713SBiju Das 	cpg_write(SMSTPCR2, 0x040E2FDCU);
212499c2713SBiju Das 	cpg_write(SMSTPCR3, 0xFFFFFBDFU);
213499c2713SBiju Das 	cpg_write(SMSTPCR4, 0x80000004U);
214499c2713SBiju Das 	cpg_write(SMSTPCR5, 0xC3FFFFFFU);
215499c2713SBiju Das 	cpg_write(SMSTPCR6, 0xFFFFFFFFU);
216499c2713SBiju Das 	cpg_write(SMSTPCR7, 0xFFFFFFFFU);
217499c2713SBiju Das 	cpg_write(SMSTPCR8, 0x00F1FFF7U);
218499c2713SBiju Das 	cpg_write(SMSTPCR9, 0xFFFFFFFFU);
219499c2713SBiju Das 	cpg_write(SMSTPCR10, 0xFFFFFFE0U);
220499c2713SBiju Das 	cpg_write(SMSTPCR11, 0x000000B7U);
221499c2713SBiju Das }
222499c2713SBiju Das #endif
223499c2713SBiju Das 
224499c2713SBiju Das #if (RCAR_LSI == RCAR_AUTO) || (RCAR_LSI == RCAR_V3M)
225499c2713SBiju Das static void bl2_realtime_cpg_init_v3m(void)
226499c2713SBiju Das {
227499c2713SBiju Das 	/* Realtime Module Stop Control Registers */
228499c2713SBiju Das 	cpg_write(RMSTPCR0, 0x00230000U);
229499c2713SBiju Das 	cpg_write(RMSTPCR1, 0xFFFFFFFFU);
230499c2713SBiju Das 	cpg_write(RMSTPCR2, 0x14062FD8U);
231499c2713SBiju Das 	cpg_write(RMSTPCR3, 0xFFFFFFDFU);
232499c2713SBiju Das 	cpg_write(RMSTPCR4, 0x80000184U);
233499c2713SBiju Das 	cpg_write(RMSTPCR5, 0x83FFFFFFU);
234499c2713SBiju Das 	cpg_write(RMSTPCR6, 0xFFFFFFFFU);
235499c2713SBiju Das 	cpg_write(RMSTPCR7, 0xFFFFFFFFU);
236499c2713SBiju Das 	cpg_write(RMSTPCR8, 0x7FF3FFF4U);
237499c2713SBiju Das 	cpg_write(RMSTPCR9, 0xFFFFFFFEU);
238499c2713SBiju Das }
239499c2713SBiju Das 
240499c2713SBiju Das static void bl2_system_cpg_init_v3m(void)
241499c2713SBiju Das {
242499c2713SBiju Das 	/* System Module Stop Control Registers */
243499c2713SBiju Das 	cpg_write(SMSTPCR0, 0x00210000U);
244499c2713SBiju Das 	cpg_write(SMSTPCR1, 0xFFFFFFFFU);
245499c2713SBiju Das 	cpg_write(SMSTPCR2, 0x340E2FDCU);
246499c2713SBiju Das 	cpg_write(SMSTPCR3, 0xFFFFFBDFU);
247499c2713SBiju Das 	cpg_write(SMSTPCR4, 0x80000004U);
248499c2713SBiju Das 	cpg_write(SMSTPCR5, 0xC3FFFFFFU);
249499c2713SBiju Das 	cpg_write(SMSTPCR6, 0xFFFFFFFFU);
250499c2713SBiju Das 	cpg_write(SMSTPCR7, 0xFFFFFFFFU);
251499c2713SBiju Das 	cpg_write(SMSTPCR8, 0x01F1FFF5U);
252499c2713SBiju Das 	cpg_write(SMSTPCR9, 0xFFFFFFFEU);
253499c2713SBiju Das }
254499c2713SBiju Das #endif
255499c2713SBiju Das 
256499c2713SBiju Das #if (RCAR_LSI == RCAR_AUTO) || (RCAR_LSI == RCAR_E3)
257499c2713SBiju Das static void bl2_realtime_cpg_init_e3(void)
258499c2713SBiju Das {
259499c2713SBiju Das 	/* Realtime Module Stop Control Registers */
260499c2713SBiju Das 	cpg_write(RMSTPCR0, 0x00210000U);
261499c2713SBiju Das 	cpg_write(RMSTPCR1, 0xFFFFFFFFU);
262499c2713SBiju Das 	cpg_write(RMSTPCR2, 0x000E0FDCU);
263499c2713SBiju Das 	cpg_write(RMSTPCR3, 0xFFFFFFDFU);
264499c2713SBiju Das 	cpg_write(RMSTPCR4, 0x80000004U);
265499c2713SBiju Das 	cpg_write(RMSTPCR5, 0xC3FFFFFFU);
266499c2713SBiju Das 	cpg_write(RMSTPCR6, 0xFFFFFFFFU);
267499c2713SBiju Das 	cpg_write(RMSTPCR7, 0xFFFFFFFFU);
268499c2713SBiju Das 	cpg_write(RMSTPCR8, 0x00F1FFF7U);
269499c2713SBiju Das 	cpg_write(RMSTPCR9, 0xFFFFFFDFU);
270499c2713SBiju Das 	cpg_write(RMSTPCR10, 0xFFFFFFE8U);
271499c2713SBiju Das 	cpg_write(RMSTPCR11, 0x000000B7U);
272499c2713SBiju Das }
273499c2713SBiju Das 
274499c2713SBiju Das static void bl2_system_cpg_init_e3(void)
275499c2713SBiju Das {
276499c2713SBiju Das 	/* System Module Stop Control Registers */
277499c2713SBiju Das 	cpg_write(SMSTPCR0, 0x00210000U);
278499c2713SBiju Das 	cpg_write(SMSTPCR1, 0xFFFFFFFFU);
279499c2713SBiju Das 	cpg_write(SMSTPCR2, 0x000E2FDCU);
280499c2713SBiju Das 	cpg_write(SMSTPCR3, 0xFFFFFBDFU);
281499c2713SBiju Das 	cpg_write(SMSTPCR4, 0x80000004U);
282499c2713SBiju Das 	cpg_write(SMSTPCR5, 0xC3FFFFFFU);
283499c2713SBiju Das 	cpg_write(SMSTPCR6, 0xFFFFFFFFU);
284499c2713SBiju Das 	cpg_write(SMSTPCR7, 0xFFFFFFFFU);
285499c2713SBiju Das 	cpg_write(SMSTPCR8, 0x00F1FFF7U);
286499c2713SBiju Das 	cpg_write(SMSTPCR9, 0xFFFFFFDFU);
287499c2713SBiju Das 	cpg_write(SMSTPCR10, 0xFFFFFFE8U);
288499c2713SBiju Das 	cpg_write(SMSTPCR11, 0x000000B7U);
289499c2713SBiju Das }
290499c2713SBiju Das #endif
291499c2713SBiju Das 
292499c2713SBiju Das #if (RCAR_LSI == RCAR_AUTO) || (RCAR_LSI == RCAR_D3)
293499c2713SBiju Das static void bl2_realtime_cpg_init_d3(void)
294499c2713SBiju Das {
295499c2713SBiju Das 	/* Realtime Module Stop Control Registers */
296499c2713SBiju Das 	cpg_write(RMSTPCR0, 0x00010000U);
297499c2713SBiju Das 	cpg_write(RMSTPCR1, 0xFFFFFFFFU);
298499c2713SBiju Das 	cpg_write(RMSTPCR2, 0x00060FDCU);
299499c2713SBiju Das 	cpg_write(RMSTPCR3, 0xFFFFFFDFU);
300499c2713SBiju Das 	cpg_write(RMSTPCR4, 0x80000184U);
301499c2713SBiju Das 	cpg_write(RMSTPCR5, 0x83FFFFFFU);
302499c2713SBiju Das 	cpg_write(RMSTPCR6, 0xFFFFFFFFU);
303499c2713SBiju Das 	cpg_write(RMSTPCR7, 0xFFFFFFFFU);
304499c2713SBiju Das 	cpg_write(RMSTPCR8, 0x00F1FFF7U);
305499c2713SBiju Das 	cpg_write(RMSTPCR9, 0xF3F5E016U);
306499c2713SBiju Das 	cpg_write(RMSTPCR10, 0xFFFEFFE0U);
307499c2713SBiju Das 	cpg_write(RMSTPCR11, 0x000000B7U);
308499c2713SBiju Das }
309499c2713SBiju Das 
310499c2713SBiju Das static void bl2_system_cpg_init_d3(void)
311499c2713SBiju Das {
312499c2713SBiju Das 	/* System Module Stop Control Registers */
313499c2713SBiju Das 	cpg_write(SMSTPCR0, 0x00010000U);
314499c2713SBiju Das 	cpg_write(SMSTPCR1, 0xFFFFFFFFU);
315499c2713SBiju Das 	cpg_write(SMSTPCR2, 0x00060FDCU);
316499c2713SBiju Das 	cpg_write(SMSTPCR3, 0xFFFFFBDFU);
317499c2713SBiju Das 	cpg_write(SMSTPCR4, 0x00000084U);
318499c2713SBiju Das 	cpg_write(SMSTPCR5, 0x83FFFFFFU);
319499c2713SBiju Das 	cpg_write(SMSTPCR6, 0xFFFFFFFFU);
320499c2713SBiju Das 	cpg_write(SMSTPCR7, 0xFFFFFFFFU);
321499c2713SBiju Das 	cpg_write(SMSTPCR8, 0x00F1FFF7U);
322499c2713SBiju Das 	cpg_write(SMSTPCR9, 0xF3F5E016U);
323499c2713SBiju Das 	cpg_write(SMSTPCR10, 0xFFFEFFE0U);
324499c2713SBiju Das 	cpg_write(SMSTPCR11, 0x000000B7U);
325499c2713SBiju Das }
326499c2713SBiju Das #endif
327499c2713SBiju Das 
328499c2713SBiju Das void bl2_cpg_init(void)
329499c2713SBiju Das {
330499c2713SBiju Das 	uint32_t boot_cpu = mmio_read_32(RCAR_MODEMR) & MODEMR_BOOT_CPU_MASK;
331499c2713SBiju Das #if RCAR_LSI == RCAR_AUTO
332499c2713SBiju Das 	uint32_t product = mmio_read_32(RCAR_PRR) & PRR_PRODUCT_MASK;
333499c2713SBiju Das #endif
334499c2713SBiju Das 	bl2_secure_cpg_init();
335499c2713SBiju Das 
336499c2713SBiju Das 	if (boot_cpu == MODEMR_BOOT_CPU_CA57 ||
337499c2713SBiju Das 	    boot_cpu == MODEMR_BOOT_CPU_CA53) {
338499c2713SBiju Das #if RCAR_LSI == RCAR_AUTO
339499c2713SBiju Das 
340499c2713SBiju Das 		switch (product) {
341499c2713SBiju Das 		case PRR_PRODUCT_H3:
342499c2713SBiju Das 			bl2_realtime_cpg_init_h3();
343499c2713SBiju Das 			break;
344499c2713SBiju Das 		case PRR_PRODUCT_M3:
345499c2713SBiju Das 			bl2_realtime_cpg_init_m3();
346499c2713SBiju Das 			break;
347499c2713SBiju Das 		case PRR_PRODUCT_M3N:
348499c2713SBiju Das 			bl2_realtime_cpg_init_m3n();
349499c2713SBiju Das 			break;
350499c2713SBiju Das 		case PRR_PRODUCT_V3M:
351499c2713SBiju Das 			bl2_realtime_cpg_init_v3m();
352499c2713SBiju Das 			break;
353499c2713SBiju Das 		case PRR_PRODUCT_E3:
354499c2713SBiju Das 			bl2_realtime_cpg_init_e3();
355499c2713SBiju Das 			break;
356499c2713SBiju Das 		case PRR_PRODUCT_D3:
357499c2713SBiju Das 			bl2_realtime_cpg_init_d3();
358499c2713SBiju Das 			break;
359499c2713SBiju Das 		default:
360499c2713SBiju Das 			panic();
361499c2713SBiju Das 			break;
362499c2713SBiju Das 		}
363499c2713SBiju Das #elif (RCAR_LSI == RCAR_H3) || (RCAR_LSI == RCAR_H3N)
364499c2713SBiju Das 		bl2_realtime_cpg_init_h3();
365*db10bad9SBiju Das #elif (RCAR_LSI == RCAR_M3) || (RCAR_LSI == RZ_G2M)
366499c2713SBiju Das 		bl2_realtime_cpg_init_m3();
367499c2713SBiju Das #elif RCAR_LSI == RCAR_M3N
368499c2713SBiju Das 		bl2_realtime_cpg_init_m3n();
369499c2713SBiju Das #elif RCAR_LSI == RCAR_V3M
370499c2713SBiju Das 		bl2_realtime_cpg_init_v3m();
371499c2713SBiju Das #elif RCAR_LSI == RCAR_E3
372499c2713SBiju Das 		bl2_realtime_cpg_init_e3();
373499c2713SBiju Das #elif RCAR_LSI == RCAR_D3
374499c2713SBiju Das 		bl2_realtime_cpg_init_d3();
375499c2713SBiju Das #else
376499c2713SBiju Das #error "Don't have CPG initialize routine(unknown)."
377499c2713SBiju Das #endif
378499c2713SBiju Das 	}
379499c2713SBiju Das }
380499c2713SBiju Das 
381499c2713SBiju Das void bl2_system_cpg_init(void)
382499c2713SBiju Das {
383499c2713SBiju Das #if RCAR_LSI == RCAR_AUTO
384499c2713SBiju Das 	uint32_t product = mmio_read_32(RCAR_PRR) & PRR_PRODUCT_MASK;
385499c2713SBiju Das 
386499c2713SBiju Das 	switch (product) {
387499c2713SBiju Das 	case PRR_PRODUCT_H3:
388499c2713SBiju Das 		bl2_system_cpg_init_h3();
389499c2713SBiju Das 		break;
390499c2713SBiju Das 	case PRR_PRODUCT_M3:
391499c2713SBiju Das 		bl2_system_cpg_init_m3();
392499c2713SBiju Das 		break;
393499c2713SBiju Das 	case PRR_PRODUCT_M3N:
394499c2713SBiju Das 		bl2_system_cpg_init_m3n();
395499c2713SBiju Das 		break;
396499c2713SBiju Das 	case PRR_PRODUCT_V3M:
397499c2713SBiju Das 		bl2_system_cpg_init_v3m();
398499c2713SBiju Das 		break;
399499c2713SBiju Das 	case PRR_PRODUCT_E3:
400499c2713SBiju Das 		bl2_system_cpg_init_e3();
401499c2713SBiju Das 		break;
402499c2713SBiju Das 	case PRR_PRODUCT_D3:
403499c2713SBiju Das 		bl2_system_cpg_init_d3();
404499c2713SBiju Das 		break;
405499c2713SBiju Das 	default:
406499c2713SBiju Das 		panic();
407499c2713SBiju Das 		break;
408499c2713SBiju Das 	}
409499c2713SBiju Das #elif (RCAR_LSI == RCAR_H3) || (RCAR_LSI == RCAR_H3N)
410499c2713SBiju Das 	bl2_system_cpg_init_h3();
411*db10bad9SBiju Das #elif (RCAR_LSI == RCAR_M3) || (RCAR_LSI == RZ_G2M)
412499c2713SBiju Das 	bl2_system_cpg_init_m3();
413499c2713SBiju Das #elif RCAR_LSI == RCAR_M3N
414499c2713SBiju Das 	bl2_system_cpg_init_m3n();
415499c2713SBiju Das #elif RCAR_LSI == RCAR_V3M
416499c2713SBiju Das 	bl2_system_cpg_init_v3m();
417499c2713SBiju Das #elif RCAR_LSI == RCAR_E3
418499c2713SBiju Das 	bl2_system_cpg_init_e3();
419499c2713SBiju Das #elif RCAR_LSI == RCAR_D3
420499c2713SBiju Das 	bl2_system_cpg_init_d3();
421499c2713SBiju Das #else
422499c2713SBiju Das #error "Don't have CPG initialize routine(unknown)."
423499c2713SBiju Das #endif
424499c2713SBiju Das }
425