189 lines
4.5 KiB
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);
|
|
}
|