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