xref: /arm-trusted-firmware/drivers/renesas/rcar/pfc/pfc_init.c (revision 91f16700b400a8c0651d24a598fc48ee2997a0d7)
1*91f16700Schasinglulu /*
2*91f16700Schasinglulu  * Copyright (c) 2015-2019, Renesas Electronics Corporation. All rights reserved.
3*91f16700Schasinglulu  *
4*91f16700Schasinglulu  * SPDX-License-Identifier: BSD-3-Clause
5*91f16700Schasinglulu  */
6*91f16700Schasinglulu 
7*91f16700Schasinglulu #include <stdint.h>
8*91f16700Schasinglulu 
9*91f16700Schasinglulu #include <common/debug.h>
10*91f16700Schasinglulu #include <lib/mmio.h>
11*91f16700Schasinglulu 
12*91f16700Schasinglulu #include "rcar_def.h"
13*91f16700Schasinglulu #if RCAR_LSI == RCAR_AUTO
14*91f16700Schasinglulu #include "H3/pfc_init_h3_v1.h"
15*91f16700Schasinglulu #include "H3/pfc_init_h3_v2.h"
16*91f16700Schasinglulu #include "M3/pfc_init_m3.h"
17*91f16700Schasinglulu #include "M3N/pfc_init_m3n.h"
18*91f16700Schasinglulu #include "V3M/pfc_init_v3m.h"
19*91f16700Schasinglulu #endif
20*91f16700Schasinglulu #if (RCAR_LSI == RCAR_H3) || (RCAR_LSI == RCAR_H3N)	/* H3 */
21*91f16700Schasinglulu #include "H3/pfc_init_h3_v1.h"
22*91f16700Schasinglulu #include "H3/pfc_init_h3_v2.h"
23*91f16700Schasinglulu #endif
24*91f16700Schasinglulu #if RCAR_LSI == RCAR_M3		/* M3 */
25*91f16700Schasinglulu #include "M3/pfc_init_m3.h"
26*91f16700Schasinglulu #endif
27*91f16700Schasinglulu #if RCAR_LSI == RCAR_M3N	/* M3N */
28*91f16700Schasinglulu #include "M3N/pfc_init_m3n.h"
29*91f16700Schasinglulu #endif
30*91f16700Schasinglulu #if RCAR_LSI == RCAR_V3M	/* V3M */
31*91f16700Schasinglulu #include "V3M/pfc_init_v3m.h"
32*91f16700Schasinglulu #endif
33*91f16700Schasinglulu #if RCAR_LSI == RCAR_E3		/* E3 */
34*91f16700Schasinglulu #include "E3/pfc_init_e3.h"
35*91f16700Schasinglulu #endif
36*91f16700Schasinglulu #if RCAR_LSI == RCAR_D3		/* D3 */
37*91f16700Schasinglulu #include "D3/pfc_init_d3.h"
38*91f16700Schasinglulu #endif
39*91f16700Schasinglulu 
40*91f16700Schasinglulu #define PRR_PRODUCT_ERR(reg)				\
41*91f16700Schasinglulu 	do {						\
42*91f16700Schasinglulu 		ERROR("LSI Product ID(PRR=0x%x) PFC initialize not supported.\n", \
43*91f16700Schasinglulu 			reg);				\
44*91f16700Schasinglulu 		panic();				\
45*91f16700Schasinglulu 	} while (0)
46*91f16700Schasinglulu 
47*91f16700Schasinglulu #define PRR_CUT_ERR(reg)				\
48*91f16700Schasinglulu 	do {						\
49*91f16700Schasinglulu 		ERROR("LSI Cut ID(PRR=0x%x) PFC initialize not supported.\n", \
50*91f16700Schasinglulu 			reg);				\
51*91f16700Schasinglulu 		panic();\
52*91f16700Schasinglulu 	} while (0)
53*91f16700Schasinglulu 
54*91f16700Schasinglulu void rcar_pfc_init(void)
55*91f16700Schasinglulu {
56*91f16700Schasinglulu 	uint32_t reg;
57*91f16700Schasinglulu 
58*91f16700Schasinglulu 	reg = mmio_read_32(RCAR_PRR);
59*91f16700Schasinglulu #if RCAR_LSI == RCAR_AUTO
60*91f16700Schasinglulu 	switch (reg & PRR_PRODUCT_MASK) {
61*91f16700Schasinglulu 	case PRR_PRODUCT_H3:
62*91f16700Schasinglulu 		switch (reg & PRR_CUT_MASK) {
63*91f16700Schasinglulu 		case PRR_PRODUCT_10:	/* H3 Ver.1.0 */
64*91f16700Schasinglulu 			pfc_init_h3_v1();
65*91f16700Schasinglulu 			break;
66*91f16700Schasinglulu 		case PRR_PRODUCT_11:	/* H3 Ver.1.1 */
67*91f16700Schasinglulu 			pfc_init_h3_v1();
68*91f16700Schasinglulu 			break;
69*91f16700Schasinglulu 		default:	/* H3 Ver.2.0 or later */
70*91f16700Schasinglulu 			pfc_init_h3_v2();
71*91f16700Schasinglulu 			break;
72*91f16700Schasinglulu 		}
73*91f16700Schasinglulu 		break;
74*91f16700Schasinglulu 	case PRR_PRODUCT_M3:
75*91f16700Schasinglulu 		pfc_init_m3();
76*91f16700Schasinglulu 		break;
77*91f16700Schasinglulu 	case PRR_PRODUCT_M3N:
78*91f16700Schasinglulu 		pfc_init_m3n();
79*91f16700Schasinglulu 		break;
80*91f16700Schasinglulu 	case PRR_PRODUCT_V3M:
81*91f16700Schasinglulu 		pfc_init_v3m();
82*91f16700Schasinglulu 		break;
83*91f16700Schasinglulu 	default:
84*91f16700Schasinglulu 		PRR_PRODUCT_ERR(reg);
85*91f16700Schasinglulu 		break;
86*91f16700Schasinglulu 	}
87*91f16700Schasinglulu 
88*91f16700Schasinglulu #elif RCAR_LSI_CUT_COMPAT
89*91f16700Schasinglulu 	switch (reg & PRR_PRODUCT_MASK) {
90*91f16700Schasinglulu 	case PRR_PRODUCT_H3:
91*91f16700Schasinglulu #if (RCAR_LSI != RCAR_H3) && (RCAR_LSI != RCAR_H3N)
92*91f16700Schasinglulu 		PRR_PRODUCT_ERR(reg);
93*91f16700Schasinglulu #else
94*91f16700Schasinglulu 		switch (reg & PRR_CUT_MASK) {
95*91f16700Schasinglulu 		case PRR_PRODUCT_10:	/* H3 Ver.1.0 */
96*91f16700Schasinglulu 			pfc_init_h3_v1();
97*91f16700Schasinglulu 			break;
98*91f16700Schasinglulu 		case PRR_PRODUCT_11:	/* H3 Ver.1.1 */
99*91f16700Schasinglulu 			pfc_init_h3_v1();
100*91f16700Schasinglulu 			break;
101*91f16700Schasinglulu 		default:	/* H3 Ver.2.0 or later */
102*91f16700Schasinglulu 			pfc_init_h3_v2();
103*91f16700Schasinglulu 			break;
104*91f16700Schasinglulu 		}
105*91f16700Schasinglulu #endif
106*91f16700Schasinglulu 		break;
107*91f16700Schasinglulu 	case PRR_PRODUCT_M3:
108*91f16700Schasinglulu #if RCAR_LSI != RCAR_M3
109*91f16700Schasinglulu 		PRR_PRODUCT_ERR(reg);
110*91f16700Schasinglulu #else
111*91f16700Schasinglulu 		pfc_init_m3();
112*91f16700Schasinglulu #endif
113*91f16700Schasinglulu 		break;
114*91f16700Schasinglulu 	case PRR_PRODUCT_M3N:
115*91f16700Schasinglulu #if RCAR_LSI != RCAR_M3N
116*91f16700Schasinglulu 		PRR_PRODUCT_ERR(reg);
117*91f16700Schasinglulu #else
118*91f16700Schasinglulu 		pfc_init_m3n();
119*91f16700Schasinglulu #endif
120*91f16700Schasinglulu 		break;
121*91f16700Schasinglulu 	case PRR_PRODUCT_V3M:
122*91f16700Schasinglulu #if RCAR_LSI != RCAR_V3M
123*91f16700Schasinglulu 		PRR_PRODUCT_ERR(reg);
124*91f16700Schasinglulu #else
125*91f16700Schasinglulu 		pfc_init_v3m();
126*91f16700Schasinglulu #endif
127*91f16700Schasinglulu 		break;
128*91f16700Schasinglulu 	case PRR_PRODUCT_E3:
129*91f16700Schasinglulu #if RCAR_LSI != RCAR_E3
130*91f16700Schasinglulu 		PRR_PRODUCT_ERR(reg);
131*91f16700Schasinglulu #else
132*91f16700Schasinglulu 		pfc_init_e3();
133*91f16700Schasinglulu #endif
134*91f16700Schasinglulu 		break;
135*91f16700Schasinglulu 	case PRR_PRODUCT_D3:
136*91f16700Schasinglulu #if RCAR_LSI != RCAR_D3
137*91f16700Schasinglulu 		PRR_PRODUCT_ERR(reg);
138*91f16700Schasinglulu #else
139*91f16700Schasinglulu 		pfc_init_d3();
140*91f16700Schasinglulu #endif
141*91f16700Schasinglulu 		break;
142*91f16700Schasinglulu 	default:
143*91f16700Schasinglulu 		PRR_PRODUCT_ERR(reg);
144*91f16700Schasinglulu 		break;
145*91f16700Schasinglulu 	}
146*91f16700Schasinglulu 
147*91f16700Schasinglulu #else
148*91f16700Schasinglulu #if (RCAR_LSI == RCAR_H3) || (RCAR_LSI == RCAR_H3N)	/* H3 */
149*91f16700Schasinglulu #if RCAR_LSI_CUT == RCAR_CUT_10
150*91f16700Schasinglulu 	/* H3 Ver.1.0 */
151*91f16700Schasinglulu 	if ((PRR_PRODUCT_H3 | PRR_PRODUCT_10)
152*91f16700Schasinglulu 	    != (reg & (PRR_PRODUCT_MASK | PRR_CUT_MASK))) {
153*91f16700Schasinglulu 		PRR_PRODUCT_ERR(reg);
154*91f16700Schasinglulu 	}
155*91f16700Schasinglulu 	pfc_init_h3_v1();
156*91f16700Schasinglulu #elif RCAR_LSI_CUT == RCAR_CUT_11
157*91f16700Schasinglulu 	/* H3 Ver.1.1 */
158*91f16700Schasinglulu 	if ((PRR_PRODUCT_H3 | PRR_PRODUCT_11)
159*91f16700Schasinglulu 	    != (reg & (PRR_PRODUCT_MASK | PRR_CUT_MASK))) {
160*91f16700Schasinglulu 		PRR_PRODUCT_ERR(reg);
161*91f16700Schasinglulu 	}
162*91f16700Schasinglulu 	pfc_init_h3_v1();
163*91f16700Schasinglulu #else
164*91f16700Schasinglulu 	/* H3 Ver.2.0 or later */
165*91f16700Schasinglulu 	if (PRR_PRODUCT_H3 != (reg & PRR_PRODUCT_MASK)) {
166*91f16700Schasinglulu 		PRR_PRODUCT_ERR(reg);
167*91f16700Schasinglulu 	}
168*91f16700Schasinglulu 	pfc_init_h3_v2();
169*91f16700Schasinglulu #endif
170*91f16700Schasinglulu #elif RCAR_LSI == RCAR_M3	/* M3 */
171*91f16700Schasinglulu 	if ((PRR_PRODUCT_M3) != (reg & PRR_PRODUCT_MASK)) {
172*91f16700Schasinglulu 		PRR_PRODUCT_ERR(reg);
173*91f16700Schasinglulu 	}
174*91f16700Schasinglulu 	pfc_init_m3();
175*91f16700Schasinglulu #elif RCAR_LSI == RCAR_M3N	/* M3N */
176*91f16700Schasinglulu 	if ((PRR_PRODUCT_M3N) != (reg & PRR_PRODUCT_MASK)) {
177*91f16700Schasinglulu 		PRR_PRODUCT_ERR(reg);
178*91f16700Schasinglulu 	}
179*91f16700Schasinglulu 	pfc_init_m3n();
180*91f16700Schasinglulu #elif RCAR_LSI == RCAR_V3M	/* V3M */
181*91f16700Schasinglulu 	if ((PRR_PRODUCT_V3M) != (reg & PRR_PRODUCT_MASK)) {
182*91f16700Schasinglulu 		PRR_PRODUCT_ERR(reg);
183*91f16700Schasinglulu 	}
184*91f16700Schasinglulu 	pfc_init_v3m();
185*91f16700Schasinglulu #elif RCAR_LSI == RCAR_E3	/* E3 */
186*91f16700Schasinglulu 	if ((PRR_PRODUCT_E3) != (reg & PRR_PRODUCT_MASK)) {
187*91f16700Schasinglulu 		PRR_PRODUCT_ERR(reg);
188*91f16700Schasinglulu 	}
189*91f16700Schasinglulu 	pfc_init_e3();
190*91f16700Schasinglulu #elif RCAR_LSI == RCAR_D3	/* D3 */
191*91f16700Schasinglulu 	if ((PRR_PRODUCT_D3) != (reg & PRR_PRODUCT_MASK)) {
192*91f16700Schasinglulu 		PRR_PRODUCT_ERR(reg);
193*91f16700Schasinglulu 	}
194*91f16700Schasinglulu 	pfc_init_d3();
195*91f16700Schasinglulu #else
196*91f16700Schasinglulu #error "Don't have PFC initialize routine(unknown)."
197*91f16700Schasinglulu #endif
198*91f16700Schasinglulu #endif
199*91f16700Schasinglulu }
200