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