xref: /arm-trusted-firmware/drivers/renesas/rzg/pfc/pfc_init.c (revision 91f16700b400a8c0651d24a598fc48ee2997a0d7)
1*91f16700Schasinglulu /*
2*91f16700Schasinglulu  * Copyright (c) 2020-2021, Renesas Electronics Corporation. All rights reserved.
3*91f16700Schasinglulu  *
4*91f16700Schasinglulu  * SPDX-License-Identifier: BSD-3-Clause
5*91f16700Schasinglulu  */
6*91f16700Schasinglulu #include <stdint.h>
7*91f16700Schasinglulu 
8*91f16700Schasinglulu #include <common/debug.h>
9*91f16700Schasinglulu #include <lib/mmio.h>
10*91f16700Schasinglulu 
11*91f16700Schasinglulu #if RCAR_LSI == RCAR_AUTO
12*91f16700Schasinglulu #include "G2E/pfc_init_g2e.h"
13*91f16700Schasinglulu #include "G2H/pfc_init_g2h.h"
14*91f16700Schasinglulu #include "G2M/pfc_init_g2m.h"
15*91f16700Schasinglulu #include "G2N/pfc_init_g2n.h"
16*91f16700Schasinglulu #endif /* RCAR_LSI == RCAR_AUTO */
17*91f16700Schasinglulu #if (RCAR_LSI == RZ_G2E)
18*91f16700Schasinglulu #include "G2E/pfc_init_g2e.h"
19*91f16700Schasinglulu #endif /* RCAR_LSI == RZ_G2N */
20*91f16700Schasinglulu #if (RCAR_LSI == RZ_G2H)
21*91f16700Schasinglulu #include "G2H/pfc_init_g2h.h"
22*91f16700Schasinglulu #endif /* RCAR_LSI == RZ_G2H */
23*91f16700Schasinglulu #if (RCAR_LSI == RZ_G2M)
24*91f16700Schasinglulu #include "G2M/pfc_init_g2m.h"
25*91f16700Schasinglulu #endif /* RCAR_LSI == RZ_G2M */
26*91f16700Schasinglulu #if (RCAR_LSI == RZ_G2N)
27*91f16700Schasinglulu #include "G2N/pfc_init_g2n.h"
28*91f16700Schasinglulu #endif /* RCAR_LSI == RZ_G2N */
29*91f16700Schasinglulu #include "rcar_def.h"
30*91f16700Schasinglulu 
31*91f16700Schasinglulu #define PRR_PRODUCT_ERR(reg)				\
32*91f16700Schasinglulu 	do {						\
33*91f16700Schasinglulu 		ERROR("LSI Product ID(PRR=0x%x) PFC init not supported.\n", \
34*91f16700Schasinglulu 			reg);				\
35*91f16700Schasinglulu 		panic();				\
36*91f16700Schasinglulu 	} while (0)
37*91f16700Schasinglulu 
38*91f16700Schasinglulu #define PRR_CUT_ERR(reg)				\
39*91f16700Schasinglulu 	do {						\
40*91f16700Schasinglulu 		ERROR("LSI Cut ID(PRR=0x%x) PFC init not supported.\n", \
41*91f16700Schasinglulu 			reg);				\
42*91f16700Schasinglulu 		panic();\
43*91f16700Schasinglulu 	} while (0)
44*91f16700Schasinglulu 
45*91f16700Schasinglulu void rzg_pfc_init(void)
46*91f16700Schasinglulu {
47*91f16700Schasinglulu 	uint32_t reg;
48*91f16700Schasinglulu 
49*91f16700Schasinglulu 	reg = mmio_read_32(RCAR_PRR);
50*91f16700Schasinglulu #if RCAR_LSI == RCAR_AUTO
51*91f16700Schasinglulu 	switch (reg & PRR_PRODUCT_MASK) {
52*91f16700Schasinglulu 	case PRR_PRODUCT_M3:
53*91f16700Schasinglulu 		pfc_init_g2m();
54*91f16700Schasinglulu 		break;
55*91f16700Schasinglulu 	case PRR_PRODUCT_H3:
56*91f16700Schasinglulu 		pfc_init_g2h();
57*91f16700Schasinglulu 		break;
58*91f16700Schasinglulu 	case PRR_PRODUCT_M3N:
59*91f16700Schasinglulu 		pfc_init_g2n();
60*91f16700Schasinglulu 		break;
61*91f16700Schasinglulu 	case PRR_PRODUCT_E3:
62*91f16700Schasinglulu 		pfc_init_g2e();
63*91f16700Schasinglulu 		break;
64*91f16700Schasinglulu 	default:
65*91f16700Schasinglulu 		PRR_PRODUCT_ERR(reg);
66*91f16700Schasinglulu 		break;
67*91f16700Schasinglulu 	}
68*91f16700Schasinglulu 
69*91f16700Schasinglulu #elif RCAR_LSI_CUT_COMPAT /* RCAR_LSI == RCAR_AUTO */
70*91f16700Schasinglulu 	switch (reg & PRR_PRODUCT_MASK) {
71*91f16700Schasinglulu 	case PRR_PRODUCT_M3:
72*91f16700Schasinglulu #if RCAR_LSI != RZ_G2M
73*91f16700Schasinglulu 		PRR_PRODUCT_ERR(reg);
74*91f16700Schasinglulu #else /* RCAR_LSI != RZ_G2M */
75*91f16700Schasinglulu 		pfc_init_g2m();
76*91f16700Schasinglulu #endif /* RCAR_LSI != RZ_G2M */
77*91f16700Schasinglulu 		break;
78*91f16700Schasinglulu 	case PRR_PRODUCT_H3:
79*91f16700Schasinglulu #if (RCAR_LSI != RZ_G2H)
80*91f16700Schasinglulu 		PRR_PRODUCT_ERR(reg);
81*91f16700Schasinglulu #else /* RCAR_LSI != RZ_G2H */
82*91f16700Schasinglulu 		pfc_init_g2h();
83*91f16700Schasinglulu #endif /* RCAR_LSI != RZ_G2H */
84*91f16700Schasinglulu 		break;
85*91f16700Schasinglulu 	case PRR_PRODUCT_M3N:
86*91f16700Schasinglulu #if RCAR_LSI != RZ_G2N
87*91f16700Schasinglulu 		PRR_PRODUCT_ERR(reg);
88*91f16700Schasinglulu #else
89*91f16700Schasinglulu 		pfc_init_g2n();
90*91f16700Schasinglulu #endif /* RCAR_LSI != RZ_G2N */
91*91f16700Schasinglulu 		break;
92*91f16700Schasinglulu 	case PRR_PRODUCT_E3:
93*91f16700Schasinglulu #if RCAR_LSI != RZ_G2E
94*91f16700Schasinglulu 		PRR_PRODUCT_ERR(reg);
95*91f16700Schasinglulu #else
96*91f16700Schasinglulu 		pfc_init_g2e();
97*91f16700Schasinglulu #endif
98*91f16700Schasinglulu 		break;
99*91f16700Schasinglulu 	default:
100*91f16700Schasinglulu 		PRR_PRODUCT_ERR(reg);
101*91f16700Schasinglulu 		break;
102*91f16700Schasinglulu 	}
103*91f16700Schasinglulu 
104*91f16700Schasinglulu #else /* RCAR_LSI == RCAR_AUTO */
105*91f16700Schasinglulu #if (RCAR_LSI == RZ_G2M)
106*91f16700Schasinglulu 	if ((reg & PRR_PRODUCT_MASK) != PRR_PRODUCT_M3) {
107*91f16700Schasinglulu 		PRR_PRODUCT_ERR(reg);
108*91f16700Schasinglulu 	}
109*91f16700Schasinglulu 	pfc_init_m3();
110*91f16700Schasinglulu #elif (RCAR_LSI == RZ_G2H)
111*91f16700Schasinglulu 	if ((reg & PRR_PRODUCT_MASK) != PRR_PRODUCT_H3) {
112*91f16700Schasinglulu 		PRR_PRODUCT_ERR(reg);
113*91f16700Schasinglulu 	}
114*91f16700Schasinglulu 	pfc_init_g2h();
115*91f16700Schasinglulu #elif (RCAR_LSI == RZ_G2N)	/* G2N */
116*91f16700Schasinglulu 	if ((reg & PRR_PRODUCT_MASK) != PRR_PRODUCT_M3N) {
117*91f16700Schasinglulu 		PRR_PRODUCT_ERR(reg);
118*91f16700Schasinglulu 	}
119*91f16700Schasinglulu 	pfc_init_g2n();
120*91f16700Schasinglulu #elif (RCAR_LSI == RZ_G2E)
121*91f16700Schasinglulu 	if ((reg & PRR_PRODUCT_MASK) != PRR_PRODUCT_E3) {
122*91f16700Schasinglulu 		PRR_PRODUCT_ERR(reg);
123*91f16700Schasinglulu 	}
124*91f16700Schasinglulu 	pfc_init_g2e();
125*91f16700Schasinglulu #else /* RCAR_LSI == RZ_G2M */
126*91f16700Schasinglulu #error "Don't have PFC initialize routine(unknown)."
127*91f16700Schasinglulu #endif /* RCAR_LSI == RZ_G2M */
128*91f16700Schasinglulu #endif /* RCAR_LSI == RCAR_AUTO */
129*91f16700Schasinglulu }
130