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