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