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