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