From d2fbdfbc67ff878f000d9d51a134a097c0b8d537 Mon Sep 17 00:00:00 2001 From: Vic Yang Date: Tue, 13 Mar 2012 12:13:10 +0800 Subject: Temp sensor report 0xfd on sensor unpowered. Make temp sensor report 0xfd when sensor is unpowered. Also refactor power specification of temp sensors from thermal.c to temp_sensor.c. Signed-off-by: Vic Yang BUG=chrome-os-partner:8279 TEST=none Change-Id: Ib13813bdbac2f048fbc3b98fae5bbf104ebf37d7 --- board/bds/board_temp_sensor.c | 6 +++--- board/link/board_temp_sensor.c | 20 ++++++++++---------- board/link/board_thermal.c | 18 +++++++++--------- common/temp_sensor.c | 42 ++++++++++++++++++++++++++++++++++-------- common/thermal.c | 7 +------ include/temp_sensor.h | 9 +++++++++ include/thermal.h | 2 -- util/ectool.c | 3 +++ 8 files changed, 69 insertions(+), 38 deletions(-) diff --git a/board/bds/board_temp_sensor.c b/board/bds/board_temp_sensor.c index 5bc9a154f5..0a10178e8e 100644 --- a/board/bds/board_temp_sensor.c +++ b/board/bds/board_temp_sensor.c @@ -20,9 +20,9 @@ * temp_sensor_id. */ const struct temp_sensor_t temp_sensors[TEMP_SENSOR_COUNT] = { - {"ECInternal", chip_temp_sensor_get_val, 0}, - {"CaseDie", tmp006_get_val, 0}, - {"Object", tmp006_get_val, 0}, + {"ECInternal", TEMP_SENSOR_POWER_NONE, chip_temp_sensor_get_val, 0}, + {"CaseDie", TEMP_SENSOR_POWER_VS, tmp006_get_val, 0}, + {"Object", TEMP_SENSOR_POWER_VS, tmp006_get_val, 0}, }; const struct tmp006_t tmp006_sensors[TMP006_COUNT] = { diff --git a/board/link/board_temp_sensor.c b/board/link/board_temp_sensor.c index f8d3f93c2c..29a61bfcaa 100644 --- a/board/link/board_temp_sensor.c +++ b/board/link/board_temp_sensor.c @@ -27,16 +27,16 @@ * temp_sensor_id. */ const struct temp_sensor_t temp_sensors[TEMP_SENSOR_COUNT] = { - {"I2C_CPU-Die", tmp006_get_val, 0}, - {"I2C_CPU-Object", tmp006_get_val, 1}, - {"I2C_PCH-Die", tmp006_get_val, 2}, - {"I2C_PCH-Object", tmp006_get_val, 3}, - {"I2C_DDR-Die", tmp006_get_val, 4}, - {"I2C_DDR-Object", tmp006_get_val, 5}, - {"I2C_Charger-Die", tmp006_get_val, 6}, - {"I2C_Charger-Object", tmp006_get_val, 7}, - {"ECInternal", chip_temp_sensor_get_val, 0}, - {"PECI", peci_temp_sensor_get_val, 0}, + {"I2C_CPU-Die", TEMP_SENSOR_POWER_VS, tmp006_get_val, 0}, + {"I2C_CPU-Object", TEMP_SENSOR_POWER_VS, tmp006_get_val, 1}, + {"I2C_PCH-Die", TEMP_SENSOR_POWER_VS, tmp006_get_val, 2}, + {"I2C_PCH-Object", TEMP_SENSOR_POWER_VS, tmp006_get_val, 3}, + {"I2C_DDR-Die", TEMP_SENSOR_POWER_VS, tmp006_get_val, 4}, + {"I2C_DDR-Object", TEMP_SENSOR_POWER_VS, tmp006_get_val, 5}, + {"I2C_Charger-Die", TEMP_SENSOR_POWER_VS, tmp006_get_val, 6}, + {"I2C_Charger-Object", TEMP_SENSOR_POWER_VS, tmp006_get_val, 7}, + {"ECInternal", TEMP_SENSOR_POWER_NONE, chip_temp_sensor_get_val, 0}, + {"PECI", TEMP_SENSOR_POWER_CPU, peci_temp_sensor_get_val, 0}, }; const struct tmp006_t tmp006_sensors[TMP006_COUNT] = { diff --git a/board/link/board_thermal.c b/board/link/board_thermal.c index 4b96f1f5f5..f8a024c84a 100644 --- a/board/link/board_thermal.c +++ b/board/link/board_thermal.c @@ -10,28 +10,28 @@ struct thermal_config_t thermal_config[TEMP_SENSOR_COUNT] = { /* I2C_CPU-Die */ - {THERMAL_CONFIG_NEED_VS, {THERMAL_THRESHOLD_DISABLE_ALL}}, + {THERMAL_CONFIG_NO_FLAG, {THERMAL_THRESHOLD_DISABLE_ALL}}, /* I2C_CPU-Object */ - {THERMAL_CONFIG_NEED_VS, {313, 323, 343, 353, 358}}, + {THERMAL_CONFIG_NO_FLAG, {313, 323, 343, 353, 358}}, /* I2C_PCH-Die */ - {THERMAL_CONFIG_NEED_VS, {THERMAL_THRESHOLD_DISABLE_ALL}}, + {THERMAL_CONFIG_NO_FLAG, {THERMAL_THRESHOLD_DISABLE_ALL}}, /* I2C_PCH-Object */ - {THERMAL_CONFIG_NEED_VS, {THERMAL_THRESHOLD_DISABLE, + {THERMAL_CONFIG_NO_FLAG, {THERMAL_THRESHOLD_DISABLE, THERMAL_THRESHOLD_DISABLE, 343, THERMAL_THRESHOLD_DISABLE, 358}}, /* I2C_DDR-Die */ - {THERMAL_CONFIG_NEED_VS, {THERMAL_THRESHOLD_DISABLE_ALL}}, + {THERMAL_CONFIG_NO_FLAG, {THERMAL_THRESHOLD_DISABLE_ALL}}, /* I2C_DDR-Object */ - {THERMAL_CONFIG_NEED_VS, {THERMAL_THRESHOLD_DISABLE, + {THERMAL_CONFIG_NO_FLAG, {THERMAL_THRESHOLD_DISABLE, THERMAL_THRESHOLD_DISABLE, 343, THERMAL_THRESHOLD_DISABLE, 358}}, /* I2C_Charger-Die */ - {THERMAL_CONFIG_NEED_VS, {THERMAL_THRESHOLD_DISABLE_ALL}}, + {THERMAL_CONFIG_NO_FLAG, {THERMAL_THRESHOLD_DISABLE_ALL}}, /* I2C_Charger-Object */ - {THERMAL_CONFIG_NEED_VS, {THERMAL_THRESHOLD_DISABLE, + {THERMAL_CONFIG_NO_FLAG, {THERMAL_THRESHOLD_DISABLE, THERMAL_THRESHOLD_DISABLE, 343, THERMAL_THRESHOLD_DISABLE, 358}}, /* ECInternal */ {THERMAL_CONFIG_NO_FLAG, {THERMAL_THRESHOLD_DISABLE, THERMAL_THRESHOLD_DISABLE, 343, THERMAL_THRESHOLD_DISABLE, 373}}, /* PECI */ - {THERMAL_CONFIG_WARNING_ON_FAIL | THERMAL_CONFIG_NEED_CPU, + {THERMAL_CONFIG_WARNING_ON_FAIL, {328, 338, 343, 348, 353}}, }; diff --git a/common/temp_sensor.c b/common/temp_sensor.c index 01bbd4bbe3..7b0e6dfa10 100644 --- a/common/temp_sensor.c +++ b/common/temp_sensor.c @@ -5,18 +5,21 @@ /* Temperature sensor module for Chrome EC */ -#include "i2c.h" -#include "temp_sensor.h" -#include "uart.h" -#include "util.h" -#include "console.h" #include "board.h" -#include "peci.h" -#include "tmp006.h" -#include "task.h" #include "chip_temp_sensor.h" +#include "chipset.h" +#include "console.h" +#include "gpio.h" +#include "i2c.h" #include "lpc.h" #include "lpc_commands.h" +#include "peci.h" +#include "task.h" +#include "temp_sensor.h" +#include "thermal.h" +#include "tmp006.h" +#include "uart.h" +#include "util.h" /* Defined in board_temp_sensor.c. Must be in the same order as * in enum temp_sensor_id. @@ -33,6 +36,23 @@ int temp_sensor_read(enum temp_sensor_id id) return sensor->read(sensor->idx); } + +int temp_sensor_powered(enum temp_sensor_id id) +{ + int flag = temp_sensors[id].power_flags; + + if (flag & TEMP_SENSOR_POWER_VS && + gpio_get_level(GPIO_PGOOD_1_8VS) == 0) + return 0; + + if (flag & TEMP_SENSOR_POWER_CPU && + !chipset_in_state(CHIPSET_STATE_ON)) + return 0; + + return 1; +} + + void poll_all_sensors(void) { #ifdef CONFIG_TMP006 @@ -55,9 +75,15 @@ static void update_lpc_mapped_memory(void) memset(mapped, 0xff, 16); for (i = 0; i < TEMP_SENSOR_COUNT && i < 16; ++i) { + if (!temp_sensor_powered(i)) { + mapped[i] = 0xfd; + continue; + } t = temp_sensor_read(i); if (t != -1) mapped[i] = t - EC_LPC_TEMP_SENSOR_OFFSET; + else + mapped[i] = 0xfe; } } diff --git a/common/thermal.c b/common/thermal.c index 6e525fda6e..bd32f73535 100644 --- a/common/thermal.c +++ b/common/thermal.c @@ -140,12 +140,7 @@ static void thermal_process(void) for (i = 0; i < TEMP_SENSOR_COUNT; ++i) { int flag = thermal_config[i].config_flags; - if (flag & THERMAL_CONFIG_NEED_VS && - gpio_get_level(GPIO_PGOOD_1_8VS) == 0) - continue; - - if (flag & THERMAL_CONFIG_NEED_CPU && - !chipset_in_state(CHIPSET_STATE_ON)) + if (!temp_sensor_powered(i)) continue; cur_temp = temp_sensor_read(i); diff --git a/include/temp_sensor.h b/include/temp_sensor.h index b20c77fe88..f6051824ee 100644 --- a/include/temp_sensor.h +++ b/include/temp_sensor.h @@ -11,11 +11,17 @@ #include "common.h" #include "board.h" +#define TEMP_SENSOR_POWER_NONE 0x0 +#define TEMP_SENSOR_POWER_VS 0x1 +#define TEMP_SENSOR_POWER_CPU 0x2 + /* "enum temp_sensor_id" must be defined for each board in board.h. */ enum temp_sensor_id; struct temp_sensor_t { const char* name; + /* Flags indicating power needed by temp sensor. */ + int8_t power_flags; /* Read sensor value and return temperature in K. */ int (*read)(int idx); /* Index among the same kind of sensors. */ @@ -29,4 +35,7 @@ int temp_sensor_init(void); * or -1 if error. */ int temp_sensor_read(enum temp_sensor_id id); +/* Return non-zero if sensor is powered. */ +int temp_sensor_powered(enum temp_sensor_id id); + #endif /* __CROS_EC_TEMP_SENSOR_H */ diff --git a/include/thermal.h b/include/thermal.h index 0998b70fcc..a2c26d9d4d 100644 --- a/include/thermal.h +++ b/include/thermal.h @@ -12,8 +12,6 @@ #define THERMAL_CONFIG_NO_FLAG 0x0 #define THERMAL_CONFIG_WARNING_ON_FAIL 0x1 -#define THERMAL_CONFIG_NEED_VS 0x2 -#define THERMAL_CONFIG_NEED_CPU 0x4 /* Set a threshold temperature to this value to disable the threshold limit. */ #define THERMAL_THRESHOLD_DISABLE 0 diff --git a/util/ectool.c b/util/ectool.c index d2c509958c..091bf01fec 100644 --- a/util/ectool.c +++ b/util/ectool.c @@ -598,6 +598,9 @@ int cmd_temperature(int argc, char *argv[]) } else if (rv == 0xfe) { printf("Error\n"); return -1; + } else if (rv == 0xfd) { + printf("Sensor disabled/unpowered\n"); + return -1; } else { printf("%d\n", rv + EC_LPC_TEMP_SENSOR_OFFSET); return 0; -- cgit v1.2.1