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 Vasutvoid 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