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