1*91f16700Schasinglulu /* 2*91f16700Schasinglulu * Copyright (c) 2015-2021, Renesas Electronics Corporation. All rights 3*91f16700Schasinglulu * reserved. 4*91f16700Schasinglulu * 5*91f16700Schasinglulu * SPDX-License-Identifier: BSD-3-Clause 6*91f16700Schasinglulu */ 7*91f16700Schasinglulu 8*91f16700Schasinglulu #include <stdint.h> 9*91f16700Schasinglulu 10*91f16700Schasinglulu #include <lib/utils_def.h> 11*91f16700Schasinglulu 12*91f16700Schasinglulu #include <iic_dvfs.h> 13*91f16700Schasinglulu 14*91f16700Schasinglulu #include "board.h" 15*91f16700Schasinglulu 16*91f16700Schasinglulu #ifndef BOARD_DEFAULT 17*91f16700Schasinglulu #if (RCAR_LSI == RCAR_D3) 18*91f16700Schasinglulu #define BOARD_DEFAULT (BOARD_DRAAK << BOARD_CODE_SHIFT) 19*91f16700Schasinglulu #elif (RCAR_LSI == RCAR_E3) 20*91f16700Schasinglulu #define BOARD_DEFAULT (BOARD_EBISU << BOARD_CODE_SHIFT) 21*91f16700Schasinglulu #elif (RCAR_LSI == RCAR_V3M) 22*91f16700Schasinglulu #define BOARD_DEFAULT (BOARD_EAGLE << BOARD_CODE_SHIFT) 23*91f16700Schasinglulu #else 24*91f16700Schasinglulu #define BOARD_DEFAULT (BOARD_SALVATOR_X << BOARD_CODE_SHIFT) 25*91f16700Schasinglulu #endif 26*91f16700Schasinglulu #endif 27*91f16700Schasinglulu 28*91f16700Schasinglulu #define BOARD_CODE_MASK (0xF8) 29*91f16700Schasinglulu #define BOARD_REV_MASK (0x07) 30*91f16700Schasinglulu #define BOARD_CODE_SHIFT (0x03) 31*91f16700Schasinglulu #define BOARD_ID_UNKNOWN (0xFF) 32*91f16700Schasinglulu 33*91f16700Schasinglulu #define SXS_ID { 0x10U, 0x11U, 0xFFU, 0xFFU, 0xFFU, 0xFFU, 0xFFU, 0xFFU } 34*91f16700Schasinglulu #define SX_ID { 0x10U, 0x11U, 0xFFU, 0xFFU, 0xFFU, 0xFFU, 0xFFU, 0xFFU } 35*91f16700Schasinglulu #define SKP_ID { 0x10U, 0x10U, 0x20U, 0x21U, 0xFFU, 0xFFU, 0xFFU, 0xFFU } 36*91f16700Schasinglulu #define SK_ID { 0x10U, 0x30U, 0xFFU, 0xFFU, 0xFFU, 0xFFU, 0xFFU, 0xFFU } 37*91f16700Schasinglulu #define EB4_ID { 0x10U, 0xFFU, 0xFFU, 0xFFU, 0xFFU, 0xFFU, 0xFFU, 0xFFU } 38*91f16700Schasinglulu #define EB_ID { 0x10U, 0xFFU, 0xFFU, 0xFFU, 0xFFU, 0xFFU, 0xFFU, 0xFFU } 39*91f16700Schasinglulu #define DR_ID { 0x10U, 0xFFU, 0xFFU, 0xFFU, 0xFFU, 0xFFU, 0xFFU, 0xFFU } 40*91f16700Schasinglulu #define EA_ID { 0x10U, 0xFFU, 0xFFU, 0xFFU, 0xFFU, 0xFFU, 0xFFU, 0xFFU } 41*91f16700Schasinglulu #define KK_ID { 0x10U, 0xFFU, 0xFFU, 0xFFU, 0xFFU, 0xFFU, 0xFFU, 0xFFU } 42*91f16700Schasinglulu 43*91f16700Schasinglulu const char *g_board_tbl[] = { 44*91f16700Schasinglulu [BOARD_STARTER_KIT_PRE] = "Starter Kit Premier", 45*91f16700Schasinglulu [BOARD_STARTER_KIT] = "Starter Kit", 46*91f16700Schasinglulu [BOARD_SALVATOR_XS] = "Salvator-XS", 47*91f16700Schasinglulu [BOARD_SALVATOR_X] = "Salvator-X", 48*91f16700Schasinglulu [BOARD_EBISU_4D] = "Ebisu-4D", 49*91f16700Schasinglulu [BOARD_KRIEK] = "Kriek", 50*91f16700Schasinglulu [BOARD_EBISU] = "Ebisu", 51*91f16700Schasinglulu [BOARD_DRAAK] = "Draak", 52*91f16700Schasinglulu [BOARD_EAGLE] = "Eagle", 53*91f16700Schasinglulu [BOARD_UNKNOWN] = "unknown" 54*91f16700Schasinglulu }; 55*91f16700Schasinglulu 56*91f16700Schasinglulu int32_t rcar_get_board_type(uint32_t *type, uint32_t *rev) 57*91f16700Schasinglulu { 58*91f16700Schasinglulu int32_t ret = 0; 59*91f16700Schasinglulu const uint8_t board_tbl[][8] = { 60*91f16700Schasinglulu [BOARD_STARTER_KIT_PRE] = SKP_ID, 61*91f16700Schasinglulu [BOARD_SALVATOR_XS] = SXS_ID, 62*91f16700Schasinglulu [BOARD_STARTER_KIT] = SK_ID, 63*91f16700Schasinglulu [BOARD_SALVATOR_X] = SX_ID, 64*91f16700Schasinglulu [BOARD_EBISU_4D] = EB4_ID, 65*91f16700Schasinglulu [BOARD_EBISU] = EB_ID, 66*91f16700Schasinglulu [BOARD_DRAAK] = DR_ID, 67*91f16700Schasinglulu [BOARD_EAGLE] = EA_ID, 68*91f16700Schasinglulu [BOARD_KRIEK] = KK_ID, 69*91f16700Schasinglulu }; 70*91f16700Schasinglulu static uint8_t board_id = BOARD_ID_UNKNOWN; 71*91f16700Schasinglulu 72*91f16700Schasinglulu if (board_id != BOARD_ID_UNKNOWN) 73*91f16700Schasinglulu goto get_type; 74*91f16700Schasinglulu 75*91f16700Schasinglulu #if PMIC_ROHM_BD9571 76*91f16700Schasinglulu /* Board ID detection from EEPROM */ 77*91f16700Schasinglulu ret = rcar_iic_dvfs_receive(EEPROM, BOARD_ID, &board_id); 78*91f16700Schasinglulu if (ret) { 79*91f16700Schasinglulu board_id = BOARD_ID_UNKNOWN; 80*91f16700Schasinglulu goto get_type; 81*91f16700Schasinglulu } 82*91f16700Schasinglulu 83*91f16700Schasinglulu if (board_id == BOARD_ID_UNKNOWN) 84*91f16700Schasinglulu board_id = BOARD_DEFAULT; 85*91f16700Schasinglulu #else 86*91f16700Schasinglulu board_id = BOARD_DEFAULT; 87*91f16700Schasinglulu #endif 88*91f16700Schasinglulu 89*91f16700Schasinglulu get_type: 90*91f16700Schasinglulu *type = ((uint32_t) board_id & BOARD_CODE_MASK) >> BOARD_CODE_SHIFT; 91*91f16700Schasinglulu 92*91f16700Schasinglulu if (*type >= ARRAY_SIZE(board_tbl)) { 93*91f16700Schasinglulu /* no revision information, set Rev0.0. */ 94*91f16700Schasinglulu *rev = 0; 95*91f16700Schasinglulu return ret; 96*91f16700Schasinglulu } 97*91f16700Schasinglulu 98*91f16700Schasinglulu *rev = board_tbl[*type][(uint8_t) (board_id & BOARD_REV_MASK)]; 99*91f16700Schasinglulu 100*91f16700Schasinglulu return ret; 101*91f16700Schasinglulu } 102