coreboot-libre-fam15h-rdimm/3rdparty/chromeec/baseboard/intelrvp/baseboard.c

189 lines
4.5 KiB
C

/* Copyright 2019 The Chromium OS Authors. All rights reserved.
* Use of this source code is governed by a BSD-style license that can be
* found in the LICENSE file.
*/
/* Intel-RVP family-specific configuration */
#include "adc_chip.h"
#include "charge_state.h"
#include "espi.h"
#include "fan.h"
#include "hooks.h"
#include "ioexpander_pca9555.h"
#include "peci.h"
#include "power.h"
#include "temp_sensor.h"
#include "thermistor.h"
/* Wake-up pins for hibernate */
const enum gpio_signal hibernate_wake_pins[] = {
GPIO_AC_PRESENT,
GPIO_LID_OPEN,
GPIO_POWER_BUTTON_L,
};
const int hibernate_wake_pins_used = ARRAY_SIZE(hibernate_wake_pins);
/* ADC channels */
const struct adc_t adc_channels[] = {
[ADC_TEMP_SNS_AMBIENT] = {
.name = "ADC_TEMP_SNS_AMBIENT",
.factor_mul = ADC_MAX_MVOLT,
.factor_div = ADC_READ_MAX + 1,
.shift = 0,
.channel = ADC_TEMP_SNS_AMBIENT_CHANNEL,
},
[ADC_TEMP_SNS_DDR] = {
.name = "ADC_TEMP_SNS_DDR",
.factor_mul = ADC_MAX_MVOLT,
.factor_div = ADC_READ_MAX + 1,
.shift = 0,
.channel = ADC_TEMP_SNS_DDR_CHANNEL,
},
[ADC_TEMP_SNS_SKIN] = {
.name = "ADC_TEMP_SNS_SKIN",
.factor_mul = ADC_MAX_MVOLT,
.factor_div = ADC_READ_MAX + 1,
.shift = 0,
.channel = ADC_TEMP_SNS_SKIN_CHANNEL,
},
[ADC_TEMP_SNS_VR] = {
.name = "ADC_TEMP_SNS_VR",
.factor_mul = ADC_MAX_MVOLT,
.factor_div = ADC_READ_MAX + 1,
.shift = 0,
.channel = ADC_TEMP_SNS_VR_CHANNEL,
},
};
BUILD_ASSERT(ARRAY_SIZE(adc_channels) == ADC_CH_COUNT);
#ifdef CONFIG_TEMP_SENSOR
/* Temperature sensors */
const struct temp_sensor_t temp_sensors[] = {
[TEMP_SNS_AMBIENT] = {
.name = "Ambient",
.type = TEMP_SENSOR_TYPE_BOARD,
.read = get_temp_3v0_22k6_47k_4050b,
.idx = ADC_TEMP_SNS_AMBIENT,
.action_delay_sec = 5,
},
[TEMP_SNS_BATTERY] = {
.name = "Battery",
.type = TEMP_SENSOR_TYPE_BATTERY,
.read = charge_get_battery_temp,
.idx = 0,
.action_delay_sec = 1,
},
[TEMP_SNS_DDR] = {
.name = "DDR",
.type = TEMP_SENSOR_TYPE_BOARD,
.read = get_temp_3v0_22k6_47k_4050b,
.idx = ADC_TEMP_SNS_DDR,
.action_delay_sec = 1,
},
#ifdef CONFIG_PECI
[TEMP_SNS_PECI] = {
.name = "PECI",
.type = TEMP_SENSOR_TYPE_CPU,
.read = peci_temp_sensor_get_val,
.idx = 0,
.action_delay_sec = 1,
},
#endif /* CONFIG_PECI */
[TEMP_SNS_SKIN] = {
.name = "Skin",
.type = TEMP_SENSOR_TYPE_BOARD,
.read = get_temp_3v0_22k6_47k_4050b,
.idx = ADC_TEMP_SNS_SKIN,
.action_delay_sec = 1,
},
[TEMP_SNS_VR] = {
.name = "VR",
.type = TEMP_SENSOR_TYPE_BOARD,
.read = get_temp_3v0_22k6_47k_4050b,
.idx = ADC_TEMP_SNS_VR,
.action_delay_sec = 1,
},
};
BUILD_ASSERT(ARRAY_SIZE(temp_sensors) == TEMP_SENSOR_COUNT);
#endif /* CONFIG_TEMP_SENSOR */
#ifdef CONFIG_FANS
/* Physical fan config */
const struct fan_conf fan_conf_0 = {
.flags = FAN_USE_RPM_MODE,
.ch = 0,
.pgood_gpio = GPIO_ALL_SYS_PWRGD,
.enable_gpio = GPIO_FAN_POWER_EN,
};
/* Physical fan rpm config */
const struct fan_rpm fan_rpm_0 = {
.rpm_min = BOARD_FAN_MIN_RPM,
.rpm_start = BOARD_FAN_MIN_RPM,
.rpm_max = BOARD_FAN_MAX_RPM,
};
/* FAN channels */
struct fan_t fans[] = {
[FAN_CH_0] = {
.conf = &fan_conf_0,
.rpm = &fan_rpm_0,
},
};
BUILD_ASSERT(ARRAY_SIZE(fans) == FAN_CH_COUNT);
const static struct ec_thermal_config thermal_a = {
.temp_host = {
[EC_TEMP_THRESH_WARN] = 0,
[EC_TEMP_THRESH_HIGH] = C_TO_K(75),
[EC_TEMP_THRESH_HALT] = C_TO_K(80),
},
.temp_host_release = {
[EC_TEMP_THRESH_WARN] = 0,
[EC_TEMP_THRESH_HIGH] = C_TO_K(65),
[EC_TEMP_THRESH_HALT] = 0,
},
.temp_fan_off = C_TO_K(15),
.temp_fan_max = C_TO_K(50),
};
struct ec_thermal_config thermal_params[] = {
[TEMP_SNS_AMBIENT] = thermal_a,
[TEMP_SNS_BATTERY] = thermal_a,
[TEMP_SNS_DDR] = thermal_a,
#ifdef CONFIG_PECI
[TEMP_SNS_PECI] = thermal_a,
#endif
[TEMP_SNS_SKIN] = thermal_a,
[TEMP_SNS_VR] = thermal_a,
};
BUILD_ASSERT(ARRAY_SIZE(thermal_params) == TEMP_SENSOR_COUNT);
#endif /* CONFIG_FANS */
static void board_init(void)
{
/* Enable SOC SPI */
gpio_set_level(GPIO_EC_SPI_OE_N, 1);
}
DECLARE_HOOK(HOOK_INIT, board_init, HOOK_PRIO_LAST);
static void board_interrupts_init(void)
{
/* DC Jack interrupt */
gpio_enable_interrupt(GPIO_DC_JACK_PRESENT);
}
DECLARE_HOOK(HOOK_INIT, board_interrupts_init, HOOK_PRIO_FIRST);
int ioexpander_read_intelrvp_version(int *port0, int *port1)
{
if (pca9555_read(I2C_PORT_PCA9555_BOARD_ID_GPIO,
I2C_ADDR_PCA9555_BOARD_ID_GPIO,
PCA9555_CMD_INPUT_PORT_0, port0))
return -1;
return pca9555_read(I2C_PORT_PCA9555_BOARD_ID_GPIO,
I2C_ADDR_PCA9555_BOARD_ID_GPIO,
PCA9555_CMD_INPUT_PORT_1, port1);
}