blob: 8c4eec24c4e0b868c7c7535506ec8e40f6fa535b [file] [log] [blame]
Jorge Ramirez-Ortiz268162f2018-09-23 09:39:11 +02001/*
2 * Copyright (c) 2015-2018, Renesas Electronics Corporation. All rights
3 * reserved.
4 *
5 * SPDX-License-Identifier: BSD-3-Clause
6 */
7
8#include <stdint.h>
Antonio Nino Diaze0f90632018-12-14 00:18:21 +00009
10#include <lib/utils_def.h>
11
Jorge Ramirez-Ortiz268162f2018-09-23 09:39:11 +020012#include <iic_dvfs.h>
Antonio Nino Diaze0f90632018-12-14 00:18:21 +000013
Jorge Ramirez-Ortiz268162f2018-09-23 09:39:11 +020014#include "board.h"
Jorge Ramirez-Ortiz268162f2018-09-23 09:39:11 +020015
16#ifndef BOARD_DEFAULT
Marek Vasut4ae342c2019-01-05 13:56:03 +010017#if (RCAR_LSI == RCAR_D3)
18#define BOARD_DEFAULT (BOARD_DRAAK << BOARD_CODE_SHIFT)
19#elif (RCAR_LSI == RCAR_E3)
Jorge Ramirez-Ortiz268162f2018-09-23 09:39:11 +020020#define BOARD_DEFAULT (BOARD_EBISU << BOARD_CODE_SHIFT)
21#else
22#define BOARD_DEFAULT (BOARD_SALVATOR_X << BOARD_CODE_SHIFT)
23#endif
24#endif
25
26#define BOARD_CODE_MASK (0xF8)
27#define BOARD_REV_MASK (0x07)
28#define BOARD_CODE_SHIFT (0x03)
29#define BOARD_ID_UNKNOWN (0xFF)
30
31#define SXS_ID { 0x10U, 0xFFU, 0xFFU, 0xFFU, 0xFFU, 0xFFU, 0xFFU, 0xFFU }
32#define SX_ID { 0x10U, 0x11U, 0xFFU, 0xFFU, 0xFFU, 0xFFU, 0xFFU, 0xFFU }
33#define SKP_ID { 0x10U, 0x10U, 0xFFU, 0xFFU, 0xFFU, 0xFFU, 0xFFU, 0xFFU }
34#define SK_ID { 0x10U, 0xFFU, 0xFFU, 0xFFU, 0xFFU, 0xFFU, 0xFFU, 0xFFU }
35#define EB4_ID { 0x10U, 0xFFU, 0xFFU, 0xFFU, 0xFFU, 0xFFU, 0xFFU, 0xFFU }
36#define EB_ID { 0x10U, 0xFFU, 0xFFU, 0xFFU, 0xFFU, 0xFFU, 0xFFU, 0xFFU }
Marek Vasut4ae342c2019-01-05 13:56:03 +010037#define DR_ID { 0x10U, 0xFFU, 0xFFU, 0xFFU, 0xFFU, 0xFFU, 0xFFU, 0xFFU }
Jorge Ramirez-Ortiz268162f2018-09-23 09:39:11 +020038#define KK_ID { 0x10U, 0xFFU, 0xFFU, 0xFFU, 0xFFU, 0xFFU, 0xFFU, 0xFFU }
39
40const char *g_board_tbl[] = {
41 [BOARD_STARTER_KIT_PRE] = "Starter Kit Premier",
42 [BOARD_STARTER_KIT] = "Starter Kit",
43 [BOARD_SALVATOR_XS] = "Salvator-XS",
44 [BOARD_SALVATOR_X] = "Salvator-X",
45 [BOARD_EBISU_4D] = "Ebisu-4D",
46 [BOARD_KRIEK] = "Kriek",
47 [BOARD_EBISU] = "Ebisu",
Marek Vasut4ae342c2019-01-05 13:56:03 +010048 [BOARD_DRAAK] = "Draak",
Jorge Ramirez-Ortiz268162f2018-09-23 09:39:11 +020049 [BOARD_UNKNOWN] = "unknown"
50};
51
52int32_t rcar_get_board_type(uint32_t *type, uint32_t *rev)
53{
54 int32_t ret = 0;
55 const uint8_t board_tbl[][8] = {
56 [BOARD_STARTER_KIT_PRE] = SKP_ID,
57 [BOARD_SALVATOR_XS] = SXS_ID,
58 [BOARD_STARTER_KIT] = SK_ID,
59 [BOARD_SALVATOR_X] = SX_ID,
60 [BOARD_EBISU_4D] = EB4_ID,
61 [BOARD_EBISU] = EB_ID,
Marek Vasut4ae342c2019-01-05 13:56:03 +010062 [BOARD_DRAAK] = DR_ID,
Jorge Ramirez-Ortiz268162f2018-09-23 09:39:11 +020063 [BOARD_KRIEK] = KK_ID,
64 };
65 static uint8_t board_id = BOARD_ID_UNKNOWN;
66
67 if (board_id != BOARD_ID_UNKNOWN)
68 goto get_type;
69
70#if PMIC_ROHM_BD9571
71 /* Board ID detection from EEPROM */
72 ret = rcar_iic_dvfs_receive(EEPROM, BOARD_ID, &board_id);
73 if (ret) {
74 board_id = BOARD_ID_UNKNOWN;
75 goto get_type;
76 }
77
78 if (board_id == BOARD_ID_UNKNOWN)
79 board_id = BOARD_DEFAULT;
80#else
81 board_id = BOARD_DEFAULT;
82#endif
83
84get_type:
85 *type = ((uint32_t) board_id & BOARD_CODE_MASK) >> BOARD_CODE_SHIFT;
86
87 if (*type >= ARRAY_SIZE(board_tbl)) {
88 /* no revision information, set Rev0.0. */
89 *rev = 0;
90 return ret;
91 }
92
93 *rev = board_tbl[*type][(uint8_t) (board_id & BOARD_REV_MASK)];
94
95 return ret;
96}