xref: /rk3399_ARM-atf/drivers/renesas/rcar/pfc/pfc_init.c (revision 7cc287dea60238747ac944bbc0b53371d4048b82)
12a690b6dSMarek Vasut /*
27c103d60SMarek Vasut  * Copyright (c) 2015-2019, Renesas Electronics Corporation. All rights reserved.
32a690b6dSMarek Vasut  *
42a690b6dSMarek Vasut  * SPDX-License-Identifier: BSD-3-Clause
52a690b6dSMarek Vasut  */
62a690b6dSMarek Vasut 
72a690b6dSMarek Vasut #include <stdint.h>
82a690b6dSMarek Vasut 
92a690b6dSMarek Vasut #include <common/debug.h>
102a690b6dSMarek Vasut #include <lib/mmio.h>
112a690b6dSMarek Vasut 
122a690b6dSMarek Vasut #include "rcar_def.h"
132a690b6dSMarek Vasut #if RCAR_LSI == RCAR_AUTO
142a690b6dSMarek Vasut #include "H3/pfc_init_h3_v1.h"
152a690b6dSMarek Vasut #include "H3/pfc_init_h3_v2.h"
162a690b6dSMarek Vasut #include "M3/pfc_init_m3.h"
172a690b6dSMarek Vasut #include "M3N/pfc_init_m3n.h"
182a690b6dSMarek Vasut #include "V3M/pfc_init_v3m.h"
192a690b6dSMarek Vasut #endif
202a690b6dSMarek Vasut #if (RCAR_LSI == RCAR_H3) || (RCAR_LSI == RCAR_H3N)	/* H3 */
212a690b6dSMarek Vasut #include "H3/pfc_init_h3_v1.h"
222a690b6dSMarek Vasut #include "H3/pfc_init_h3_v2.h"
232a690b6dSMarek Vasut #endif
242a690b6dSMarek Vasut #if RCAR_LSI == RCAR_M3		/* M3 */
252a690b6dSMarek Vasut #include "M3/pfc_init_m3.h"
262a690b6dSMarek Vasut #endif
272a690b6dSMarek Vasut #if RCAR_LSI == RCAR_M3N	/* M3N */
282a690b6dSMarek Vasut #include "M3N/pfc_init_m3n.h"
292a690b6dSMarek Vasut #endif
302a690b6dSMarek Vasut #if RCAR_LSI == RCAR_V3M	/* V3M */
312a690b6dSMarek Vasut #include "V3M/pfc_init_v3m.h"
322a690b6dSMarek Vasut #endif
332a690b6dSMarek Vasut #if RCAR_LSI == RCAR_E3		/* E3 */
342a690b6dSMarek Vasut #include "E3/pfc_init_e3.h"
352a690b6dSMarek Vasut #endif
362a690b6dSMarek Vasut #if RCAR_LSI == RCAR_D3		/* D3 */
372a690b6dSMarek Vasut #include "D3/pfc_init_d3.h"
382a690b6dSMarek Vasut #endif
392a690b6dSMarek Vasut 
402a690b6dSMarek Vasut #define PRR_PRODUCT_ERR(reg)				\
412a690b6dSMarek Vasut 	do {						\
422a690b6dSMarek Vasut 		ERROR("LSI Product ID(PRR=0x%x) PFC initialize not supported.\n", \
432a690b6dSMarek Vasut 			reg);				\
442a690b6dSMarek Vasut 		panic();				\
452a690b6dSMarek Vasut 	} while (0)
462a690b6dSMarek Vasut 
472a690b6dSMarek Vasut #define PRR_CUT_ERR(reg)				\
482a690b6dSMarek Vasut 	do {						\
492a690b6dSMarek Vasut 		ERROR("LSI Cut ID(PRR=0x%x) PFC initialize not supported.\n", \
502a690b6dSMarek Vasut 			reg);				\
512a690b6dSMarek Vasut 		panic();\
522a690b6dSMarek Vasut 	} while (0)
532a690b6dSMarek Vasut 
rcar_pfc_init(void)542a690b6dSMarek Vasut void rcar_pfc_init(void)
552a690b6dSMarek Vasut {
562a690b6dSMarek Vasut 	uint32_t reg;
572a690b6dSMarek Vasut 
582a690b6dSMarek Vasut 	reg = mmio_read_32(RCAR_PRR);
592a690b6dSMarek Vasut #if RCAR_LSI == RCAR_AUTO
60*df51d8feSMarek Vasut 	switch (reg & PRR_PRODUCT_MASK) {
61*df51d8feSMarek Vasut 	case PRR_PRODUCT_H3:
622a690b6dSMarek Vasut 		switch (reg & PRR_CUT_MASK) {
632a690b6dSMarek Vasut 		case PRR_PRODUCT_10:	/* H3 Ver.1.0 */
642a690b6dSMarek Vasut 			pfc_init_h3_v1();
652a690b6dSMarek Vasut 			break;
662a690b6dSMarek Vasut 		case PRR_PRODUCT_11:	/* H3 Ver.1.1 */
672a690b6dSMarek Vasut 			pfc_init_h3_v1();
682a690b6dSMarek Vasut 			break;
692a690b6dSMarek Vasut 		default:	/* H3 Ver.2.0 or later */
702a690b6dSMarek Vasut 			pfc_init_h3_v2();
712a690b6dSMarek Vasut 			break;
722a690b6dSMarek Vasut 		}
732a690b6dSMarek Vasut 		break;
74*df51d8feSMarek Vasut 	case PRR_PRODUCT_M3:
752a690b6dSMarek Vasut 		pfc_init_m3();
762a690b6dSMarek Vasut 		break;
77*df51d8feSMarek Vasut 	case PRR_PRODUCT_M3N:
782a690b6dSMarek Vasut 		pfc_init_m3n();
792a690b6dSMarek Vasut 		break;
80*df51d8feSMarek Vasut 	case PRR_PRODUCT_V3M:
812a690b6dSMarek Vasut 		pfc_init_v3m();
822a690b6dSMarek Vasut 		break;
832a690b6dSMarek Vasut 	default:
842a690b6dSMarek Vasut 		PRR_PRODUCT_ERR(reg);
852a690b6dSMarek Vasut 		break;
862a690b6dSMarek Vasut 	}
872a690b6dSMarek Vasut 
882a690b6dSMarek Vasut #elif RCAR_LSI_CUT_COMPAT
892a690b6dSMarek Vasut 	switch (reg & PRR_PRODUCT_MASK) {
902a690b6dSMarek Vasut 	case PRR_PRODUCT_H3:
912a690b6dSMarek Vasut #if (RCAR_LSI != RCAR_H3) && (RCAR_LSI != RCAR_H3N)
922a690b6dSMarek Vasut 		PRR_PRODUCT_ERR(reg);
932a690b6dSMarek Vasut #else
942a690b6dSMarek Vasut 		switch (reg & PRR_CUT_MASK) {
952a690b6dSMarek Vasut 		case PRR_PRODUCT_10:	/* H3 Ver.1.0 */
962a690b6dSMarek Vasut 			pfc_init_h3_v1();
972a690b6dSMarek Vasut 			break;
982a690b6dSMarek Vasut 		case PRR_PRODUCT_11:	/* H3 Ver.1.1 */
992a690b6dSMarek Vasut 			pfc_init_h3_v1();
1002a690b6dSMarek Vasut 			break;
1012a690b6dSMarek Vasut 		default:	/* H3 Ver.2.0 or later */
1022a690b6dSMarek Vasut 			pfc_init_h3_v2();
1032a690b6dSMarek Vasut 			break;
1042a690b6dSMarek Vasut 		}
1052a690b6dSMarek Vasut #endif
1062a690b6dSMarek Vasut 		break;
1072a690b6dSMarek Vasut 	case PRR_PRODUCT_M3:
1082a690b6dSMarek Vasut #if RCAR_LSI != RCAR_M3
1092a690b6dSMarek Vasut 		PRR_PRODUCT_ERR(reg);
1102a690b6dSMarek Vasut #else
1112a690b6dSMarek Vasut 		pfc_init_m3();
1122a690b6dSMarek Vasut #endif
1132a690b6dSMarek Vasut 		break;
1142a690b6dSMarek Vasut 	case PRR_PRODUCT_M3N:
1152a690b6dSMarek Vasut #if RCAR_LSI != RCAR_M3N
1162a690b6dSMarek Vasut 		PRR_PRODUCT_ERR(reg);
1172a690b6dSMarek Vasut #else
1182a690b6dSMarek Vasut 		pfc_init_m3n();
1192a690b6dSMarek Vasut #endif
1202a690b6dSMarek Vasut 		break;
1212a690b6dSMarek Vasut 	case PRR_PRODUCT_V3M:
1222a690b6dSMarek Vasut #if RCAR_LSI != RCAR_V3M
1232a690b6dSMarek Vasut 		PRR_PRODUCT_ERR(reg);
1242a690b6dSMarek Vasut #else
1252a690b6dSMarek Vasut 		pfc_init_v3m();
1262a690b6dSMarek Vasut #endif
1272a690b6dSMarek Vasut 		break;
1282a690b6dSMarek Vasut 	case PRR_PRODUCT_E3:
1292a690b6dSMarek Vasut #if RCAR_LSI != RCAR_E3
1302a690b6dSMarek Vasut 		PRR_PRODUCT_ERR(reg);
1312a690b6dSMarek Vasut #else
1322a690b6dSMarek Vasut 		pfc_init_e3();
1332a690b6dSMarek Vasut #endif
1342a690b6dSMarek Vasut 		break;
1352a690b6dSMarek Vasut 	case PRR_PRODUCT_D3:
1362a690b6dSMarek Vasut #if RCAR_LSI != RCAR_D3
1372a690b6dSMarek Vasut 		PRR_PRODUCT_ERR(reg);
1382a690b6dSMarek Vasut #else
1392a690b6dSMarek Vasut 		pfc_init_d3();
1402a690b6dSMarek Vasut #endif
1412a690b6dSMarek Vasut 		break;
1422a690b6dSMarek Vasut 	default:
1432a690b6dSMarek Vasut 		PRR_PRODUCT_ERR(reg);
1442a690b6dSMarek Vasut 		break;
1452a690b6dSMarek Vasut 	}
1462a690b6dSMarek Vasut 
1472a690b6dSMarek Vasut #else
1482a690b6dSMarek Vasut #if (RCAR_LSI == RCAR_H3) || (RCAR_LSI == RCAR_H3N)	/* H3 */
1492a690b6dSMarek Vasut #if RCAR_LSI_CUT == RCAR_CUT_10
1502a690b6dSMarek Vasut 	/* H3 Ver.1.0 */
1512a690b6dSMarek Vasut 	if ((PRR_PRODUCT_H3 | PRR_PRODUCT_10)
1522a690b6dSMarek Vasut 	    != (reg & (PRR_PRODUCT_MASK | PRR_CUT_MASK))) {
1532a690b6dSMarek Vasut 		PRR_PRODUCT_ERR(reg);
1542a690b6dSMarek Vasut 	}
1552a690b6dSMarek Vasut 	pfc_init_h3_v1();
1562a690b6dSMarek Vasut #elif RCAR_LSI_CUT == RCAR_CUT_11
1572a690b6dSMarek Vasut 	/* H3 Ver.1.1 */
1582a690b6dSMarek Vasut 	if ((PRR_PRODUCT_H3 | PRR_PRODUCT_11)
1592a690b6dSMarek Vasut 	    != (reg & (PRR_PRODUCT_MASK | PRR_CUT_MASK))) {
1602a690b6dSMarek Vasut 		PRR_PRODUCT_ERR(reg);
1612a690b6dSMarek Vasut 	}
1622a690b6dSMarek Vasut 	pfc_init_h3_v1();
1632a690b6dSMarek Vasut #else
1642a690b6dSMarek Vasut 	/* H3 Ver.2.0 or later */
1652a690b6dSMarek Vasut 	if (PRR_PRODUCT_H3 != (reg & PRR_PRODUCT_MASK)) {
1662a690b6dSMarek Vasut 		PRR_PRODUCT_ERR(reg);
1672a690b6dSMarek Vasut 	}
1682a690b6dSMarek Vasut 	pfc_init_h3_v2();
1692a690b6dSMarek Vasut #endif
1702a690b6dSMarek Vasut #elif RCAR_LSI == RCAR_M3	/* M3 */
1712a690b6dSMarek Vasut 	if ((PRR_PRODUCT_M3) != (reg & PRR_PRODUCT_MASK)) {
1722a690b6dSMarek Vasut 		PRR_PRODUCT_ERR(reg);
1732a690b6dSMarek Vasut 	}
1742a690b6dSMarek Vasut 	pfc_init_m3();
1752a690b6dSMarek Vasut #elif RCAR_LSI == RCAR_M3N	/* M3N */
1762a690b6dSMarek Vasut 	if ((PRR_PRODUCT_M3N) != (reg & PRR_PRODUCT_MASK)) {
1772a690b6dSMarek Vasut 		PRR_PRODUCT_ERR(reg);
1782a690b6dSMarek Vasut 	}
1792a690b6dSMarek Vasut 	pfc_init_m3n();
1802a690b6dSMarek Vasut #elif RCAR_LSI == RCAR_V3M	/* V3M */
1812a690b6dSMarek Vasut 	if ((PRR_PRODUCT_V3M) != (reg & PRR_PRODUCT_MASK)) {
1822a690b6dSMarek Vasut 		PRR_PRODUCT_ERR(reg);
1832a690b6dSMarek Vasut 	}
1842a690b6dSMarek Vasut 	pfc_init_v3m();
1852a690b6dSMarek Vasut #elif RCAR_LSI == RCAR_E3	/* E3 */
1862a690b6dSMarek Vasut 	if ((PRR_PRODUCT_E3) != (reg & PRR_PRODUCT_MASK)) {
1872a690b6dSMarek Vasut 		PRR_PRODUCT_ERR(reg);
1882a690b6dSMarek Vasut 	}
1892a690b6dSMarek Vasut 	pfc_init_e3();
1902a690b6dSMarek Vasut #elif RCAR_LSI == RCAR_D3	/* D3 */
1912a690b6dSMarek Vasut 	if ((PRR_PRODUCT_D3) != (reg & PRR_PRODUCT_MASK)) {
1922a690b6dSMarek Vasut 		PRR_PRODUCT_ERR(reg);
1932a690b6dSMarek Vasut 	}
1942a690b6dSMarek Vasut 	pfc_init_d3();
1952a690b6dSMarek Vasut #else
1962a690b6dSMarek Vasut #error "Don't have PFC initialize routine(unknown)."
1972a690b6dSMarek Vasut #endif
1982a690b6dSMarek Vasut #endif
1992a690b6dSMarek Vasut }
200