xref: /rk3399_ARM-atf/plat/renesas/common/bl2_cpg_init.c (revision 499c2713f05c602e6f22467c18be30cf9697c42d)
1*499c2713SBiju Das /*
2*499c2713SBiju Das  * Copyright (c) 2015-2020, Renesas Electronics Corporation. All rights reserved.
3*499c2713SBiju Das  *
4*499c2713SBiju Das  * SPDX-License-Identifier: BSD-3-Clause
5*499c2713SBiju Das  */
6*499c2713SBiju Das 
7*499c2713SBiju Das #include <common/debug.h>
8*499c2713SBiju Das #include <lib/mmio.h>
9*499c2713SBiju Das 
10*499c2713SBiju Das #include "cpg_registers.h"
11*499c2713SBiju Das #include "rcar_def.h"
12*499c2713SBiju Das #include "rcar_private.h"
13*499c2713SBiju Das 
14*499c2713SBiju Das static void bl2_secure_cpg_init(void);
15*499c2713SBiju Das 
16*499c2713SBiju Das #if (RCAR_LSI == RCAR_AUTO) || (RCAR_LSI == RCAR_H3) || (RCAR_LSI == RCAR_H3N)
17*499c2713SBiju Das static void bl2_realtime_cpg_init_h3(void);
18*499c2713SBiju Das static void bl2_system_cpg_init_h3(void);
19*499c2713SBiju Das #endif
20*499c2713SBiju Das 
21*499c2713SBiju Das #if (RCAR_LSI == RCAR_AUTO) || (RCAR_LSI == RCAR_M3)
22*499c2713SBiju Das static void bl2_realtime_cpg_init_m3(void);
23*499c2713SBiju Das static void bl2_system_cpg_init_m3(void);
24*499c2713SBiju Das #endif
25*499c2713SBiju Das 
26*499c2713SBiju Das #if (RCAR_LSI == RCAR_AUTO) || (RCAR_LSI == RCAR_M3N)
27*499c2713SBiju Das static void bl2_realtime_cpg_init_m3n(void);
28*499c2713SBiju Das static void bl2_system_cpg_init_m3n(void);
29*499c2713SBiju Das #endif
30*499c2713SBiju Das 
31*499c2713SBiju Das #if (RCAR_LSI == RCAR_AUTO) || (RCAR_LSI == RCAR_V3M)
32*499c2713SBiju Das static void bl2_realtime_cpg_init_v3m(void);
33*499c2713SBiju Das static void bl2_system_cpg_init_v3m(void);
34*499c2713SBiju Das #endif
35*499c2713SBiju Das 
36*499c2713SBiju Das #if (RCAR_LSI == RCAR_AUTO) || (RCAR_LSI == RCAR_E3)
37*499c2713SBiju Das static void bl2_realtime_cpg_init_e3(void);
38*499c2713SBiju Das static void bl2_system_cpg_init_e3(void);
39*499c2713SBiju Das #endif
40*499c2713SBiju Das 
41*499c2713SBiju Das #if (RCAR_LSI == RCAR_AUTO) || (RCAR_LSI == RCAR_D3)
42*499c2713SBiju Das static void bl2_realtime_cpg_init_d3(void);
43*499c2713SBiju Das static void bl2_system_cpg_init_d3(void);
44*499c2713SBiju Das #endif
45*499c2713SBiju Das 
46*499c2713SBiju Das typedef struct {
47*499c2713SBiju Das 	uintptr_t adr;
48*499c2713SBiju Das 	uint32_t val;
49*499c2713SBiju Das } reg_setting_t;
50*499c2713SBiju Das 
51*499c2713SBiju Das static void bl2_secure_cpg_init(void)
52*499c2713SBiju Das {
53*499c2713SBiju Das 	uint32_t stop_cr2, reset_cr2;
54*499c2713SBiju Das 	uint32_t stop_cr4, reset_cr4;
55*499c2713SBiju Das 	uint32_t stop_cr5, reset_cr5;
56*499c2713SBiju Das 
57*499c2713SBiju Das #if (RCAR_LSI == RCAR_D3)
58*499c2713SBiju Das 	reset_cr2 = 0x00000000U;
59*499c2713SBiju Das 	stop_cr2 = 0xFFFFFFFFU;
60*499c2713SBiju Das #elif (RCAR_LSI == RCAR_E3)
61*499c2713SBiju Das 	reset_cr2 = 0x10000000U;
62*499c2713SBiju Das 	stop_cr2 = 0xEFFFFFFFU;
63*499c2713SBiju Das #else
64*499c2713SBiju Das 	reset_cr2 = 0x14000000U;
65*499c2713SBiju Das 	stop_cr2 = 0xEBFFFFFFU;
66*499c2713SBiju Das #endif
67*499c2713SBiju Das 
68*499c2713SBiju Das #if (RCAR_LSI == RCAR_D3)
69*499c2713SBiju Das 	reset_cr4 = 0x00000000U;
70*499c2713SBiju Das 	stop_cr4 = 0xFFFFFFFFU;
71*499c2713SBiju Das 	reset_cr5 = 0x00000000U;
72*499c2713SBiju Das 	stop_cr5 = 0xFFFFFFFFU;
73*499c2713SBiju Das #else
74*499c2713SBiju Das 	reset_cr4 = 0x80000003U;
75*499c2713SBiju Das 	stop_cr4 = 0x7FFFFFFFU;
76*499c2713SBiju Das 	reset_cr5 = 0x40000000U;
77*499c2713SBiju Das 	stop_cr5 = 0xBFFFFFFFU;
78*499c2713SBiju Das #endif
79*499c2713SBiju Das 
80*499c2713SBiju Das 	/* Secure Module Stop Control Registers */
81*499c2713SBiju Das 	cpg_write(SCMSTPCR0, 0xFFFFFFFFU);
82*499c2713SBiju Das 	cpg_write(SCMSTPCR1, 0xFFFFFFFFU);
83*499c2713SBiju Das 	cpg_write(SCMSTPCR2, stop_cr2);
84*499c2713SBiju Das 	cpg_write(SCMSTPCR3, 0xFFFFFFFFU);
85*499c2713SBiju Das 	cpg_write(SCMSTPCR4, stop_cr4);
86*499c2713SBiju Das 	cpg_write(SCMSTPCR5, stop_cr5);
87*499c2713SBiju Das 	cpg_write(SCMSTPCR6, 0xFFFFFFFFU);
88*499c2713SBiju Das 	cpg_write(SCMSTPCR7, 0xFFFFFFFFU);
89*499c2713SBiju Das 	cpg_write(SCMSTPCR8, 0xFFFFFFFFU);
90*499c2713SBiju Das 	cpg_write(SCMSTPCR9, 0xFFFDFFFFU);
91*499c2713SBiju Das 	cpg_write(SCMSTPCR10, 0xFFFFFFFFU);
92*499c2713SBiju Das 	cpg_write(SCMSTPCR11, 0xFFFFFFFFU);
93*499c2713SBiju Das 
94*499c2713SBiju Das 	/* Secure Software Reset Access Enable Control Registers */
95*499c2713SBiju Das 	cpg_write(SCSRSTECR0, 0x00000000U);
96*499c2713SBiju Das 	cpg_write(SCSRSTECR1, 0x00000000U);
97*499c2713SBiju Das 	cpg_write(SCSRSTECR2, reset_cr2);
98*499c2713SBiju Das 	cpg_write(SCSRSTECR3, 0x00000000U);
99*499c2713SBiju Das 	cpg_write(SCSRSTECR4, reset_cr4);
100*499c2713SBiju Das 	cpg_write(SCSRSTECR5, reset_cr5);
101*499c2713SBiju Das 	cpg_write(SCSRSTECR6, 0x00000000U);
102*499c2713SBiju Das 	cpg_write(SCSRSTECR7, 0x00000000U);
103*499c2713SBiju Das 	cpg_write(SCSRSTECR8, 0x00000000U);
104*499c2713SBiju Das 	cpg_write(SCSRSTECR9, 0x00020000U);
105*499c2713SBiju Das 	cpg_write(SCSRSTECR10, 0x00000000U);
106*499c2713SBiju Das 	cpg_write(SCSRSTECR11, 0x00000000U);
107*499c2713SBiju Das }
108*499c2713SBiju Das 
109*499c2713SBiju Das #if (RCAR_LSI == RCAR_AUTO) || (RCAR_LSI == RCAR_H3) || (RCAR_LSI == RCAR_H3N)
110*499c2713SBiju Das static void bl2_realtime_cpg_init_h3(void)
111*499c2713SBiju Das {
112*499c2713SBiju Das 	uint32_t cut = mmio_read_32(RCAR_PRR) & PRR_CUT_MASK;
113*499c2713SBiju Das 	uint32_t cr0, cr8;
114*499c2713SBiju Das 
115*499c2713SBiju Das 	cr0 = (cut == PRR_PRODUCT_10 || cut == PRR_PRODUCT_11) ?
116*499c2713SBiju Das 	    0x00200000U : 0x00210000U;
117*499c2713SBiju Das 	cr8 = (cut == PRR_PRODUCT_10 || cut == PRR_PRODUCT_11) ?
118*499c2713SBiju Das 	    0x01F1FFF4U : 0x01F1FFF7U;
119*499c2713SBiju Das 
120*499c2713SBiju Das 	cpg_write(RMSTPCR0, cr0);
121*499c2713SBiju Das 	cpg_write(RMSTPCR1, 0xFFFFFFFFU);
122*499c2713SBiju Das 	cpg_write(RMSTPCR2, 0x040E0FDCU);
123*499c2713SBiju Das 	cpg_write(RMSTPCR3, 0xFFFFFFDFU);
124*499c2713SBiju Das 	cpg_write(RMSTPCR4, 0x80000004U);
125*499c2713SBiju Das 	cpg_write(RMSTPCR5, 0xC3FFFFFFU);
126*499c2713SBiju Das 	cpg_write(RMSTPCR6, 0xFFFFFFFFU);
127*499c2713SBiju Das 	cpg_write(RMSTPCR7, 0xFFFFFFFFU);
128*499c2713SBiju Das 	cpg_write(RMSTPCR8, cr8);
129*499c2713SBiju Das 	cpg_write(RMSTPCR9, 0xFFFFFFFEU);
130*499c2713SBiju Das 	cpg_write(RMSTPCR10, 0xFFFEFFE0U);
131*499c2713SBiju Das 	cpg_write(RMSTPCR11, 0x000000B7U);
132*499c2713SBiju Das }
133*499c2713SBiju Das 
134*499c2713SBiju Das static void bl2_system_cpg_init_h3(void)
135*499c2713SBiju Das {
136*499c2713SBiju Das 	/** System Module Stop Control Registers */
137*499c2713SBiju Das 	cpg_write(SMSTPCR0, 0x00210000U);
138*499c2713SBiju Das 	cpg_write(SMSTPCR1, 0xFFFFFFFFU);
139*499c2713SBiju Das 	cpg_write(SMSTPCR2, 0x040E2FDCU);
140*499c2713SBiju Das 	cpg_write(SMSTPCR3, 0xFFFFFBDFU);
141*499c2713SBiju Das 	cpg_write(SMSTPCR4, 0x80000004U);
142*499c2713SBiju Das 	cpg_write(SMSTPCR5, 0xC3FFFFFFU);
143*499c2713SBiju Das 	cpg_write(SMSTPCR6, 0xFFFFFFFFU);
144*499c2713SBiju Das 	cpg_write(SMSTPCR7, 0xFFFFFFFFU);
145*499c2713SBiju Das 	cpg_write(SMSTPCR8, 0x01F1FFF5U);
146*499c2713SBiju Das 	cpg_write(SMSTPCR9, 0xFFFFFFFFU);
147*499c2713SBiju Das 	cpg_write(SMSTPCR10, 0xFFFEFFE0U);
148*499c2713SBiju Das 	cpg_write(SMSTPCR11, 0x000000B7U);
149*499c2713SBiju Das }
150*499c2713SBiju Das #endif
151*499c2713SBiju Das 
152*499c2713SBiju Das #if (RCAR_LSI == RCAR_AUTO) || (RCAR_LSI == RCAR_M3)
153*499c2713SBiju Das static void bl2_realtime_cpg_init_m3(void)
154*499c2713SBiju Das {
155*499c2713SBiju Das 	/* Realtime Module Stop Control Registers */
156*499c2713SBiju Das 	cpg_write(RMSTPCR0, 0x00200000U);
157*499c2713SBiju Das 	cpg_write(RMSTPCR1, 0xFFFFFFFFU);
158*499c2713SBiju Das 	cpg_write(RMSTPCR2, 0x040E0FDCU);
159*499c2713SBiju Das 	cpg_write(RMSTPCR3, 0xFFFFFFDFU);
160*499c2713SBiju Das 	cpg_write(RMSTPCR4, 0x80000004U);
161*499c2713SBiju Das 	cpg_write(RMSTPCR5, 0xC3FFFFFFU);
162*499c2713SBiju Das 	cpg_write(RMSTPCR6, 0xFFFFFFFFU);
163*499c2713SBiju Das 	cpg_write(RMSTPCR7, 0xFFFFFFFFU);
164*499c2713SBiju Das 	cpg_write(RMSTPCR8, 0x01F1FFF7U);
165*499c2713SBiju Das 	cpg_write(RMSTPCR9, 0xFFFFFFFEU);
166*499c2713SBiju Das 	cpg_write(RMSTPCR10, 0xFFFEFFE0U);
167*499c2713SBiju Das 	cpg_write(RMSTPCR11, 0x000000B7U);
168*499c2713SBiju Das }
169*499c2713SBiju Das 
170*499c2713SBiju Das static void bl2_system_cpg_init_m3(void)
171*499c2713SBiju Das {
172*499c2713SBiju Das 	/* System Module Stop Control Registers */
173*499c2713SBiju Das 	cpg_write(SMSTPCR0, 0x00200000U);
174*499c2713SBiju Das 	cpg_write(SMSTPCR1, 0xFFFFFFFFU);
175*499c2713SBiju Das 	cpg_write(SMSTPCR2, 0x040E2FDCU);
176*499c2713SBiju Das 	cpg_write(SMSTPCR3, 0xFFFFFBDFU);
177*499c2713SBiju Das 	cpg_write(SMSTPCR4, 0x80000004U);
178*499c2713SBiju Das 	cpg_write(SMSTPCR5, 0xC3FFFFFFU);
179*499c2713SBiju Das 	cpg_write(SMSTPCR6, 0xFFFFFFFFU);
180*499c2713SBiju Das 	cpg_write(SMSTPCR7, 0xFFFFFFFFU);
181*499c2713SBiju Das 	cpg_write(SMSTPCR8, 0x01F1FFF7U);
182*499c2713SBiju Das 	cpg_write(SMSTPCR9, 0xFFFFFFFFU);
183*499c2713SBiju Das 	cpg_write(SMSTPCR10, 0xFFFEFFE0U);
184*499c2713SBiju Das 	cpg_write(SMSTPCR11, 0x000000B7U);
185*499c2713SBiju Das }
186*499c2713SBiju Das #endif
187*499c2713SBiju Das 
188*499c2713SBiju Das #if (RCAR_LSI == RCAR_AUTO) || (RCAR_LSI == RCAR_M3N)
189*499c2713SBiju Das static void bl2_realtime_cpg_init_m3n(void)
190*499c2713SBiju Das {
191*499c2713SBiju Das 	/* Realtime Module Stop Control Registers */
192*499c2713SBiju Das 	cpg_write(RMSTPCR0, 0x00210000U);
193*499c2713SBiju Das 	cpg_write(RMSTPCR1, 0xFFFFFFFFU);
194*499c2713SBiju Das 	cpg_write(RMSTPCR2, 0x040E0FDCU);
195*499c2713SBiju Das 	cpg_write(RMSTPCR3, 0xFFFFFFDFU);
196*499c2713SBiju Das 	cpg_write(RMSTPCR4, 0x80000004U);
197*499c2713SBiju Das 	cpg_write(RMSTPCR5, 0xC3FFFFFFU);
198*499c2713SBiju Das 	cpg_write(RMSTPCR6, 0xFFFFFFFFU);
199*499c2713SBiju Das 	cpg_write(RMSTPCR7, 0xFFFFFFFFU);
200*499c2713SBiju Das 	cpg_write(RMSTPCR8, 0x00F1FFF7U);
201*499c2713SBiju Das 	cpg_write(RMSTPCR9, 0xFFFFFFFFU);
202*499c2713SBiju Das 	cpg_write(RMSTPCR10, 0xFFFFFFE0U);
203*499c2713SBiju Das 	cpg_write(RMSTPCR11, 0x000000B7U);
204*499c2713SBiju Das }
205*499c2713SBiju Das 
206*499c2713SBiju Das static void bl2_system_cpg_init_m3n(void)
207*499c2713SBiju Das {
208*499c2713SBiju Das 	/* System Module Stop Control Registers */
209*499c2713SBiju Das 	cpg_write(SMSTPCR0, 0x00210000U);
210*499c2713SBiju Das 	cpg_write(SMSTPCR1, 0xFFFFFFFFU);
211*499c2713SBiju Das 	cpg_write(SMSTPCR2, 0x040E2FDCU);
212*499c2713SBiju Das 	cpg_write(SMSTPCR3, 0xFFFFFBDFU);
213*499c2713SBiju Das 	cpg_write(SMSTPCR4, 0x80000004U);
214*499c2713SBiju Das 	cpg_write(SMSTPCR5, 0xC3FFFFFFU);
215*499c2713SBiju Das 	cpg_write(SMSTPCR6, 0xFFFFFFFFU);
216*499c2713SBiju Das 	cpg_write(SMSTPCR7, 0xFFFFFFFFU);
217*499c2713SBiju Das 	cpg_write(SMSTPCR8, 0x00F1FFF7U);
218*499c2713SBiju Das 	cpg_write(SMSTPCR9, 0xFFFFFFFFU);
219*499c2713SBiju Das 	cpg_write(SMSTPCR10, 0xFFFFFFE0U);
220*499c2713SBiju Das 	cpg_write(SMSTPCR11, 0x000000B7U);
221*499c2713SBiju Das }
222*499c2713SBiju Das #endif
223*499c2713SBiju Das 
224*499c2713SBiju Das #if (RCAR_LSI == RCAR_AUTO) || (RCAR_LSI == RCAR_V3M)
225*499c2713SBiju Das static void bl2_realtime_cpg_init_v3m(void)
226*499c2713SBiju Das {
227*499c2713SBiju Das 	/* Realtime Module Stop Control Registers */
228*499c2713SBiju Das 	cpg_write(RMSTPCR0, 0x00230000U);
229*499c2713SBiju Das 	cpg_write(RMSTPCR1, 0xFFFFFFFFU);
230*499c2713SBiju Das 	cpg_write(RMSTPCR2, 0x14062FD8U);
231*499c2713SBiju Das 	cpg_write(RMSTPCR3, 0xFFFFFFDFU);
232*499c2713SBiju Das 	cpg_write(RMSTPCR4, 0x80000184U);
233*499c2713SBiju Das 	cpg_write(RMSTPCR5, 0x83FFFFFFU);
234*499c2713SBiju Das 	cpg_write(RMSTPCR6, 0xFFFFFFFFU);
235*499c2713SBiju Das 	cpg_write(RMSTPCR7, 0xFFFFFFFFU);
236*499c2713SBiju Das 	cpg_write(RMSTPCR8, 0x7FF3FFF4U);
237*499c2713SBiju Das 	cpg_write(RMSTPCR9, 0xFFFFFFFEU);
238*499c2713SBiju Das }
239*499c2713SBiju Das 
240*499c2713SBiju Das static void bl2_system_cpg_init_v3m(void)
241*499c2713SBiju Das {
242*499c2713SBiju Das 	/* System Module Stop Control Registers */
243*499c2713SBiju Das 	cpg_write(SMSTPCR0, 0x00210000U);
244*499c2713SBiju Das 	cpg_write(SMSTPCR1, 0xFFFFFFFFU);
245*499c2713SBiju Das 	cpg_write(SMSTPCR2, 0x340E2FDCU);
246*499c2713SBiju Das 	cpg_write(SMSTPCR3, 0xFFFFFBDFU);
247*499c2713SBiju Das 	cpg_write(SMSTPCR4, 0x80000004U);
248*499c2713SBiju Das 	cpg_write(SMSTPCR5, 0xC3FFFFFFU);
249*499c2713SBiju Das 	cpg_write(SMSTPCR6, 0xFFFFFFFFU);
250*499c2713SBiju Das 	cpg_write(SMSTPCR7, 0xFFFFFFFFU);
251*499c2713SBiju Das 	cpg_write(SMSTPCR8, 0x01F1FFF5U);
252*499c2713SBiju Das 	cpg_write(SMSTPCR9, 0xFFFFFFFEU);
253*499c2713SBiju Das }
254*499c2713SBiju Das #endif
255*499c2713SBiju Das 
256*499c2713SBiju Das #if (RCAR_LSI == RCAR_AUTO) || (RCAR_LSI == RCAR_E3)
257*499c2713SBiju Das static void bl2_realtime_cpg_init_e3(void)
258*499c2713SBiju Das {
259*499c2713SBiju Das 	/* Realtime Module Stop Control Registers */
260*499c2713SBiju Das 	cpg_write(RMSTPCR0, 0x00210000U);
261*499c2713SBiju Das 	cpg_write(RMSTPCR1, 0xFFFFFFFFU);
262*499c2713SBiju Das 	cpg_write(RMSTPCR2, 0x000E0FDCU);
263*499c2713SBiju Das 	cpg_write(RMSTPCR3, 0xFFFFFFDFU);
264*499c2713SBiju Das 	cpg_write(RMSTPCR4, 0x80000004U);
265*499c2713SBiju Das 	cpg_write(RMSTPCR5, 0xC3FFFFFFU);
266*499c2713SBiju Das 	cpg_write(RMSTPCR6, 0xFFFFFFFFU);
267*499c2713SBiju Das 	cpg_write(RMSTPCR7, 0xFFFFFFFFU);
268*499c2713SBiju Das 	cpg_write(RMSTPCR8, 0x00F1FFF7U);
269*499c2713SBiju Das 	cpg_write(RMSTPCR9, 0xFFFFFFDFU);
270*499c2713SBiju Das 	cpg_write(RMSTPCR10, 0xFFFFFFE8U);
271*499c2713SBiju Das 	cpg_write(RMSTPCR11, 0x000000B7U);
272*499c2713SBiju Das }
273*499c2713SBiju Das 
274*499c2713SBiju Das static void bl2_system_cpg_init_e3(void)
275*499c2713SBiju Das {
276*499c2713SBiju Das 	/* System Module Stop Control Registers */
277*499c2713SBiju Das 	cpg_write(SMSTPCR0, 0x00210000U);
278*499c2713SBiju Das 	cpg_write(SMSTPCR1, 0xFFFFFFFFU);
279*499c2713SBiju Das 	cpg_write(SMSTPCR2, 0x000E2FDCU);
280*499c2713SBiju Das 	cpg_write(SMSTPCR3, 0xFFFFFBDFU);
281*499c2713SBiju Das 	cpg_write(SMSTPCR4, 0x80000004U);
282*499c2713SBiju Das 	cpg_write(SMSTPCR5, 0xC3FFFFFFU);
283*499c2713SBiju Das 	cpg_write(SMSTPCR6, 0xFFFFFFFFU);
284*499c2713SBiju Das 	cpg_write(SMSTPCR7, 0xFFFFFFFFU);
285*499c2713SBiju Das 	cpg_write(SMSTPCR8, 0x00F1FFF7U);
286*499c2713SBiju Das 	cpg_write(SMSTPCR9, 0xFFFFFFDFU);
287*499c2713SBiju Das 	cpg_write(SMSTPCR10, 0xFFFFFFE8U);
288*499c2713SBiju Das 	cpg_write(SMSTPCR11, 0x000000B7U);
289*499c2713SBiju Das }
290*499c2713SBiju Das #endif
291*499c2713SBiju Das 
292*499c2713SBiju Das #if (RCAR_LSI == RCAR_AUTO) || (RCAR_LSI == RCAR_D3)
293*499c2713SBiju Das static void bl2_realtime_cpg_init_d3(void)
294*499c2713SBiju Das {
295*499c2713SBiju Das 	/* Realtime Module Stop Control Registers */
296*499c2713SBiju Das 	cpg_write(RMSTPCR0, 0x00010000U);
297*499c2713SBiju Das 	cpg_write(RMSTPCR1, 0xFFFFFFFFU);
298*499c2713SBiju Das 	cpg_write(RMSTPCR2, 0x00060FDCU);
299*499c2713SBiju Das 	cpg_write(RMSTPCR3, 0xFFFFFFDFU);
300*499c2713SBiju Das 	cpg_write(RMSTPCR4, 0x80000184U);
301*499c2713SBiju Das 	cpg_write(RMSTPCR5, 0x83FFFFFFU);
302*499c2713SBiju Das 	cpg_write(RMSTPCR6, 0xFFFFFFFFU);
303*499c2713SBiju Das 	cpg_write(RMSTPCR7, 0xFFFFFFFFU);
304*499c2713SBiju Das 	cpg_write(RMSTPCR8, 0x00F1FFF7U);
305*499c2713SBiju Das 	cpg_write(RMSTPCR9, 0xF3F5E016U);
306*499c2713SBiju Das 	cpg_write(RMSTPCR10, 0xFFFEFFE0U);
307*499c2713SBiju Das 	cpg_write(RMSTPCR11, 0x000000B7U);
308*499c2713SBiju Das }
309*499c2713SBiju Das 
310*499c2713SBiju Das static void bl2_system_cpg_init_d3(void)
311*499c2713SBiju Das {
312*499c2713SBiju Das 	/* System Module Stop Control Registers */
313*499c2713SBiju Das 	cpg_write(SMSTPCR0, 0x00010000U);
314*499c2713SBiju Das 	cpg_write(SMSTPCR1, 0xFFFFFFFFU);
315*499c2713SBiju Das 	cpg_write(SMSTPCR2, 0x00060FDCU);
316*499c2713SBiju Das 	cpg_write(SMSTPCR3, 0xFFFFFBDFU);
317*499c2713SBiju Das 	cpg_write(SMSTPCR4, 0x00000084U);
318*499c2713SBiju Das 	cpg_write(SMSTPCR5, 0x83FFFFFFU);
319*499c2713SBiju Das 	cpg_write(SMSTPCR6, 0xFFFFFFFFU);
320*499c2713SBiju Das 	cpg_write(SMSTPCR7, 0xFFFFFFFFU);
321*499c2713SBiju Das 	cpg_write(SMSTPCR8, 0x00F1FFF7U);
322*499c2713SBiju Das 	cpg_write(SMSTPCR9, 0xF3F5E016U);
323*499c2713SBiju Das 	cpg_write(SMSTPCR10, 0xFFFEFFE0U);
324*499c2713SBiju Das 	cpg_write(SMSTPCR11, 0x000000B7U);
325*499c2713SBiju Das }
326*499c2713SBiju Das #endif
327*499c2713SBiju Das 
328*499c2713SBiju Das void bl2_cpg_init(void)
329*499c2713SBiju Das {
330*499c2713SBiju Das 	uint32_t boot_cpu = mmio_read_32(RCAR_MODEMR) & MODEMR_BOOT_CPU_MASK;
331*499c2713SBiju Das #if RCAR_LSI == RCAR_AUTO
332*499c2713SBiju Das 	uint32_t product = mmio_read_32(RCAR_PRR) & PRR_PRODUCT_MASK;
333*499c2713SBiju Das #endif
334*499c2713SBiju Das 	bl2_secure_cpg_init();
335*499c2713SBiju Das 
336*499c2713SBiju Das 	if (boot_cpu == MODEMR_BOOT_CPU_CA57 ||
337*499c2713SBiju Das 	    boot_cpu == MODEMR_BOOT_CPU_CA53) {
338*499c2713SBiju Das #if RCAR_LSI == RCAR_AUTO
339*499c2713SBiju Das 
340*499c2713SBiju Das 		switch (product) {
341*499c2713SBiju Das 		case PRR_PRODUCT_H3:
342*499c2713SBiju Das 			bl2_realtime_cpg_init_h3();
343*499c2713SBiju Das 			break;
344*499c2713SBiju Das 		case PRR_PRODUCT_M3:
345*499c2713SBiju Das 			bl2_realtime_cpg_init_m3();
346*499c2713SBiju Das 			break;
347*499c2713SBiju Das 		case PRR_PRODUCT_M3N:
348*499c2713SBiju Das 			bl2_realtime_cpg_init_m3n();
349*499c2713SBiju Das 			break;
350*499c2713SBiju Das 		case PRR_PRODUCT_V3M:
351*499c2713SBiju Das 			bl2_realtime_cpg_init_v3m();
352*499c2713SBiju Das 			break;
353*499c2713SBiju Das 		case PRR_PRODUCT_E3:
354*499c2713SBiju Das 			bl2_realtime_cpg_init_e3();
355*499c2713SBiju Das 			break;
356*499c2713SBiju Das 		case PRR_PRODUCT_D3:
357*499c2713SBiju Das 			bl2_realtime_cpg_init_d3();
358*499c2713SBiju Das 			break;
359*499c2713SBiju Das 		default:
360*499c2713SBiju Das 			panic();
361*499c2713SBiju Das 			break;
362*499c2713SBiju Das 		}
363*499c2713SBiju Das #elif (RCAR_LSI == RCAR_H3) || (RCAR_LSI == RCAR_H3N)
364*499c2713SBiju Das 		bl2_realtime_cpg_init_h3();
365*499c2713SBiju Das #elif RCAR_LSI == RCAR_M3
366*499c2713SBiju Das 		bl2_realtime_cpg_init_m3();
367*499c2713SBiju Das #elif RCAR_LSI == RCAR_M3N
368*499c2713SBiju Das 		bl2_realtime_cpg_init_m3n();
369*499c2713SBiju Das #elif RCAR_LSI == RCAR_V3M
370*499c2713SBiju Das 		bl2_realtime_cpg_init_v3m();
371*499c2713SBiju Das #elif RCAR_LSI == RCAR_E3
372*499c2713SBiju Das 		bl2_realtime_cpg_init_e3();
373*499c2713SBiju Das #elif RCAR_LSI == RCAR_D3
374*499c2713SBiju Das 		bl2_realtime_cpg_init_d3();
375*499c2713SBiju Das #else
376*499c2713SBiju Das #error "Don't have CPG initialize routine(unknown)."
377*499c2713SBiju Das #endif
378*499c2713SBiju Das 	}
379*499c2713SBiju Das }
380*499c2713SBiju Das 
381*499c2713SBiju Das void bl2_system_cpg_init(void)
382*499c2713SBiju Das {
383*499c2713SBiju Das #if RCAR_LSI == RCAR_AUTO
384*499c2713SBiju Das 	uint32_t product = mmio_read_32(RCAR_PRR) & PRR_PRODUCT_MASK;
385*499c2713SBiju Das 
386*499c2713SBiju Das 	switch (product) {
387*499c2713SBiju Das 	case PRR_PRODUCT_H3:
388*499c2713SBiju Das 		bl2_system_cpg_init_h3();
389*499c2713SBiju Das 		break;
390*499c2713SBiju Das 	case PRR_PRODUCT_M3:
391*499c2713SBiju Das 		bl2_system_cpg_init_m3();
392*499c2713SBiju Das 		break;
393*499c2713SBiju Das 	case PRR_PRODUCT_M3N:
394*499c2713SBiju Das 		bl2_system_cpg_init_m3n();
395*499c2713SBiju Das 		break;
396*499c2713SBiju Das 	case PRR_PRODUCT_V3M:
397*499c2713SBiju Das 		bl2_system_cpg_init_v3m();
398*499c2713SBiju Das 		break;
399*499c2713SBiju Das 	case PRR_PRODUCT_E3:
400*499c2713SBiju Das 		bl2_system_cpg_init_e3();
401*499c2713SBiju Das 		break;
402*499c2713SBiju Das 	case PRR_PRODUCT_D3:
403*499c2713SBiju Das 		bl2_system_cpg_init_d3();
404*499c2713SBiju Das 		break;
405*499c2713SBiju Das 	default:
406*499c2713SBiju Das 		panic();
407*499c2713SBiju Das 		break;
408*499c2713SBiju Das 	}
409*499c2713SBiju Das #elif (RCAR_LSI == RCAR_H3) || (RCAR_LSI == RCAR_H3N)
410*499c2713SBiju Das 	bl2_system_cpg_init_h3();
411*499c2713SBiju Das #elif RCAR_LSI == RCAR_M3
412*499c2713SBiju Das 	bl2_system_cpg_init_m3();
413*499c2713SBiju Das #elif RCAR_LSI == RCAR_M3N
414*499c2713SBiju Das 	bl2_system_cpg_init_m3n();
415*499c2713SBiju Das #elif RCAR_LSI == RCAR_V3M
416*499c2713SBiju Das 	bl2_system_cpg_init_v3m();
417*499c2713SBiju Das #elif RCAR_LSI == RCAR_E3
418*499c2713SBiju Das 	bl2_system_cpg_init_e3();
419*499c2713SBiju Das #elif RCAR_LSI == RCAR_D3
420*499c2713SBiju Das 	bl2_system_cpg_init_d3();
421*499c2713SBiju Das #else
422*499c2713SBiju Das #error "Don't have CPG initialize routine(unknown)."
423*499c2713SBiju Das #endif
424*499c2713SBiju Das }
425