mb/google/asurada: Get RAM code from ADC 3

On Chromebooks the RAM code is implemented by the resistor straps
that we can read and decode from ADC. For Asurada the RAM code can be
read from ADC channel 3.

Signed-off-by: CK Hu <ck.hu@mediatek.com>
Signed-off-by: Yidi Lin <yidi.lin@mediatek.com>
Change-Id: Iaadabea1b6aa91c48b137f7c6784ab7ee0adc473
Reviewed-on: https://review.coreboot.org/c/coreboot/+/46391
Tested-by: build bot (Jenkins) <no-reply@coreboot.org>
Reviewed-by: Hung-Te Lin <hungte@chromium.org>
Reviewed-by: Angel Pons <th3fanbus@gmail.com>
This commit is contained in:
Yidi Lin 2020-11-20 14:03:20 +08:00 committed by Hung-Te Lin
parent 1e37c9ca46
commit aad4651e3e
1 changed files with 56 additions and 1 deletions

View File

@ -1,9 +1,59 @@
/* SPDX-License-Identifier: GPL-2.0-only */
#include <assert.h>
#include <boardid.h>
#include <console/console.h>
#include <soc/auxadc.h>
/* board_id is provided by ec/google/chromeec/ec_boardid.c */
#define ADC_LEVELS 15
enum {
RAM_ID_CHANNEL = 3,
};
static const unsigned int ram_voltages[ADC_LEVELS] = {
/* ID : Voltage (unit: uV) */
[0] = 74300,
[1] = 211700,
[2] = 318800,
[3] = 428600,
[4] = 541700,
[5] = 665800,
[6] = 781400,
[7] = 900000,
[8] = 1023100,
[9] = 1137000,
[10] = 1240000,
[11] = 1342600,
[12] = 1457500,
[13] = 1575600,
[14] = 1683600,
};
static const unsigned int *adc_voltages[] = {
[RAM_ID_CHANNEL] = ram_voltages,
};
static uint32_t get_adc_index(unsigned int channel)
{
unsigned int value = auxadc_get_voltage_uv(channel);
assert(channel < ARRAY_SIZE(adc_voltages));
const unsigned int *voltages = adc_voltages[channel];
assert(voltages);
/* Find the closest voltage */
uint32_t id;
for (id = 0; id < ADC_LEVELS - 1; id++)
if (value < (voltages[id] + voltages[id + 1]) / 2)
break;
printk(BIOS_DEBUG, "ADC[%u]: Raw value=%u ID=%u\n", channel, value, id);
return id;
}
uint32_t sku_id(void)
{
return 0;
@ -11,5 +61,10 @@ uint32_t sku_id(void)
uint32_t ram_code(void)
{
return 0;
static uint32_t cached_ram_code = BOARD_ID_INIT;
if (cached_ram_code == BOARD_ID_INIT)
cached_ram_code = get_adc_index(RAM_ID_CHANNEL);
return cached_ram_code;
}