diff options
author | Dawid Niedzwiecki <dawidn@google.com> | 2022-11-03 15:21:23 +0100 |
---|---|---|
committer | Chromeos LUCI <chromeos-scoped@luci-project-accounts.iam.gserviceaccount.com> | 2022-11-14 16:22:42 +0000 |
commit | 51e14ac413c280ccbbd840bfb9669142c7622ed7 (patch) | |
tree | 0733105a25d7a21dde4ece10c64d5bdb61775500 | |
parent | 5cf490d59c3d0a2ab0ac82b963888de4035a68ef (diff) | |
download | chrome-ec-51e14ac413c280ccbbd840bfb9669142c7622ed7.tar.gz |
zephyr: move periodic temp read hook to shim layer
Some of the temperature sensor drivers declare periodic one second hook
to update cached temperature measurement. Declare common hook and call
the update function for every sensor.
The change allows better manageing of the update calls, e.g. checking
power-good pin.
BUG=b:244474857
BRANCH=main
TEST=skyrim doesn't spam "Recover Bus failed" in G3
Signed-off-by: Dawid Niedzwiecki <dn@semihalf.com>
Change-Id: Ibdfe63e20c726efb738deaa23444f7d6dd87b5e2
Reviewed-on: https://chromium-review.googlesource.com/c/chromiumos/platform/ec/+/3909669
Reviewed-by: Diana Z <dzigterman@chromium.org>
Code-Coverage: Zoss <zoss-cl-coverage@prod.google.com>
Commit-Queue: Keith Short <keithshort@chromium.org>
Reviewed-by: Keith Short <keithshort@chromium.org>
Tested-by: Dawid Niedzwiecki <dawidn@google.com>
-rw-r--r-- | driver/temp_sensor/pct2075.c | 13 | ||||
-rw-r--r-- | driver/temp_sensor/tmp112.c | 13 | ||||
-rw-r--r-- | include/driver/temp_sensor/pct2075.h | 4 | ||||
-rw-r--r-- | include/driver/temp_sensor/tmp112.h | 4 | ||||
-rw-r--r-- | zephyr/shim/include/temp_sensor/temp_sensor.h | 1 | ||||
-rw-r--r-- | zephyr/shim/src/temp_sensors.c | 67 |
6 files changed, 84 insertions, 18 deletions
diff --git a/driver/temp_sensor/pct2075.c b/driver/temp_sensor/pct2075.c index 9c7b7190e9..de951ca6b1 100644 --- a/driver/temp_sensor/pct2075.c +++ b/driver/temp_sensor/pct2075.c @@ -76,6 +76,7 @@ int pct2075_get_val_mk(int idx, int *temp_mk_ptr) return EC_SUCCESS; } +#ifndef CONFIG_ZEPHYR static void pct2075_poll(void) { int s; @@ -87,6 +88,18 @@ static void pct2075_poll(void) } } DECLARE_HOOK(HOOK_SECOND, pct2075_poll, HOOK_PRIO_TEMP_SENSOR); +#else +void pct2075_update_temperature(int idx) +{ + int temp_reg = 0; + + if (idx >= PCT2075_COUNT) + return; + + if (get_reg_temp(idx, &temp_reg) == EC_SUCCESS) + temp_mk_local[idx] = pct2075_reg_to_mk(temp_reg); +} +#endif /* CONFIG_ZEPHYR */ void pct2075_init(void) { diff --git a/driver/temp_sensor/tmp112.c b/driver/temp_sensor/tmp112.c index f7f28159aa..1af8679421 100644 --- a/driver/temp_sensor/tmp112.c +++ b/driver/temp_sensor/tmp112.c @@ -92,6 +92,7 @@ int tmp112_get_val_mk(int idx, int *temp_mk_ptr) return EC_SUCCESS; } +#ifndef CONFIG_ZEPHYR static void tmp112_poll(void) { int s; @@ -103,6 +104,18 @@ static void tmp112_poll(void) } } DECLARE_HOOK(HOOK_SECOND, tmp112_poll, HOOK_PRIO_TEMP_SENSOR); +#else +static void tmp112_update_temperature(int idx) +{ + int temp_reg = 0; + + if (idx >= TMP112_COUNT) + return; + + if (get_reg_temp(idx, &temp_reg) == EC_SUCCESS) + temp_mk_local[idx] = tmp112_reg_to_mk(temp_reg); +} +#endif /* CONFIG_ZEPHYR */ void tmp112_init(void) { diff --git a/include/driver/temp_sensor/pct2075.h b/include/driver/temp_sensor/pct2075.h index 77fae67712..2d374bb2ba 100644 --- a/include/driver/temp_sensor/pct2075.h +++ b/include/driver/temp_sensor/pct2075.h @@ -68,4 +68,8 @@ int pct2075_get_val_mk(int idx, int *temp_mk_ptr); */ void pct2075_init(void); +#ifdef CONFIG_ZEPHYR +void pct2075_update_temperature(int idx); +#endif /* CONFIG_ZEPHYR */ + #endif /* __CROS_EC_PCT2075_H */ diff --git a/include/driver/temp_sensor/tmp112.h b/include/driver/temp_sensor/tmp112.h index 56d55d9133..3c9a0a004b 100644 --- a/include/driver/temp_sensor/tmp112.h +++ b/include/driver/temp_sensor/tmp112.h @@ -63,4 +63,8 @@ int tmp112_get_val_mk(int idx, int *temp_mk_ptr); */ void tmp112_init(void); +#ifdef CONFIG_ZEPHYR +void tmp112_update_temperature(int idx); +#endif /* CONFIG_ZEPHYR */ + #endif /* __CROS_EC_TMP112_H */ diff --git a/zephyr/shim/include/temp_sensor/temp_sensor.h b/zephyr/shim/include/temp_sensor/temp_sensor.h index 9be18987eb..a6cdfb5524 100644 --- a/zephyr/shim/include/temp_sensor/temp_sensor.h +++ b/zephyr/shim/include/temp_sensor/temp_sensor.h @@ -143,6 +143,7 @@ enum tmp112_sensor { struct zephyr_temp_sensor { /* Read sensor value in K into temp_ptr; return non-zero if error. */ int (*read)(const struct temp_sensor_t *sensor, int *temp_ptr); + void (*update_temperature)(int idx); const struct thermistor_info *thermistor; #if ANY_INST_HAS_POWER_GOOD_PIN const struct device *power_good_dev; diff --git a/zephyr/shim/src/temp_sensors.c b/zephyr/shim/src/temp_sensors.c index c8f2047c94..ae3a367252 100644 --- a/zephyr/shim/src/temp_sensors.c +++ b/zephyr/shim/src/temp_sensors.c @@ -6,6 +6,7 @@ #include "adc.h" #include "charger/chg_rt9490.h" #include "driver/charger/rt9490.h" +#include "hooks.h" #include "temp_sensor.h" #include "temp_sensor/pct2075.h" #include "temp_sensor/sb_tsi.h" @@ -79,6 +80,7 @@ static int thermistor_get_temp(const struct temp_sensor_t *sensor, .read = &thermistor_get_temp, \ .thermistor = GET_THERMISTOR_INFO( \ DT_PHANDLE(sensor_id, thermistor)), \ + .update_temperature = NULL, \ FILL_POWER_GOOD(named_id) }) #define TEMP_THERMISTOR(named_id, sensor_id) \ @@ -110,10 +112,12 @@ __maybe_unused static int pct2075_get_temp(const struct temp_sensor_t *sensor, (DT_REG_ADDR(node_id) | I2C_FLAG_BIG_ENDIAN), \ }, -#define GET_ZEPHYR_TEMP_SENSOR_PCT2075(named_id) \ - (&(const struct zephyr_temp_sensor){ .read = &pct2075_get_temp, \ - .thermistor = NULL, \ - FILL_POWER_GOOD(named_id) }) +#define GET_ZEPHYR_TEMP_SENSOR_PCT2075(named_id) \ + (&(const struct zephyr_temp_sensor){ \ + .read = &pct2075_get_temp, \ + .thermistor = NULL, \ + .update_temperature = pct2075_update_temperature, \ + FILL_POWER_GOOD(named_id) }) #define TEMP_PCT2075(named_id, sensor_id) \ [TEMP_SENSOR_ID(named_id)] = { \ @@ -144,9 +148,10 @@ __maybe_unused static int sb_tsi_get_temp(const struct temp_sensor_t *sensor, #endif /* SB_TSI_COMPAT */ -#define GET_ZEPHYR_TEMP_SENSOR_SB_TSI(named_id) \ - (&(const struct zephyr_temp_sensor){ .read = &sb_tsi_get_temp, \ - .thermistor = NULL, \ +#define GET_ZEPHYR_TEMP_SENSOR_SB_TSI(named_id) \ + (&(const struct zephyr_temp_sensor){ .read = &sb_tsi_get_temp, \ + .thermistor = NULL, \ + .update_temperature = NULL, \ FILL_POWER_GOOD(named_id) }) #define TEMP_SB_TSI(named_id, sensor_id) \ @@ -174,10 +179,12 @@ __maybe_unused static int tmp112_get_temp(const struct temp_sensor_t *sensor, .i2c_addr_flags = DT_REG_ADDR(node_id), \ }, -#define GET_ZEPHYR_TEMP_SENSOR_TMP112(named_id) \ - (&(const struct zephyr_temp_sensor){ .read = &tmp112_get_temp, \ - .thermistor = NULL, \ - FILL_POWER_GOOD(named_id) }) +#define GET_ZEPHYR_TEMP_SENSOR_TMP112(named_id) \ + (&(const struct zephyr_temp_sensor){ \ + .read = &tmp112_get_temp, \ + .thermistor = NULL, \ + .update_temperature = tmp112_update_temperature, \ + FILL_POWER_GOOD(named_id) }) #define TEMP_TMP112(named_id, sensor_id) \ [TEMP_SENSOR_ID(named_id)] = { \ @@ -204,6 +211,7 @@ const struct tmp112_sensor_t tmp112_sensors[TMP112_COUNT] = { .read = &rt9490_get_thermistor_val, \ .thermistor = GET_THERMISTOR_INFO( \ DT_PHANDLE(sensor_id, thermistor)), \ + .update_temperature = NULL, \ FILL_POWER_GOOD(named_id) }) #define TEMP_RT9490(named_id, sensor_id) \ @@ -237,6 +245,18 @@ const struct temp_sensor_t temp_sensors[] = { DT_FOREACH_CHILD_SEP( BUILD_ASSERT(ARRAY_SIZE(temp_sensors) == TEMP_SENSOR_COUNT); +static bool temp_sensor_check_power(const struct temp_sensor_t *sensor) +{ +#if ANY_INST_HAS_POWER_GOOD_PIN + if (sensor->zephyr_info->power_good_dev) { + if (!gpio_pin_get(sensor->zephyr_info->power_good_dev, + sensor->zephyr_info->power_good_pin)) + return false; + } +#endif + return true; +} + int temp_sensor_read(enum temp_sensor_id id, int *temp_ptr) { const struct temp_sensor_t *sensor; @@ -245,15 +265,26 @@ int temp_sensor_read(enum temp_sensor_id id, int *temp_ptr) return EC_ERROR_INVAL; sensor = temp_sensors + id; -#if ANY_INST_HAS_POWER_GOOD_PIN - if (sensor->zephyr_info->power_good_dev) { - if (!gpio_pin_get(sensor->zephyr_info->power_good_dev, - sensor->zephyr_info->power_good_pin)) - return EC_ERROR_NOT_POWERED; - } -#endif + if (!temp_sensor_check_power(sensor)) + return EC_ERROR_NOT_POWERED; return sensor->zephyr_info->read(sensor, temp_ptr); } +void temp_sensors_update(void) +{ + for (int i = 0; i < TEMP_SENSOR_COUNT; i++) { + const struct temp_sensor_t *sensor = temp_sensors + i; + + if (!sensor->zephyr_info->update_temperature) + continue; + + if (!temp_sensor_check_power(sensor)) + continue; + + sensor->zephyr_info->update_temperature(sensor->idx); + } +} +DECLARE_HOOK(HOOK_SECOND, temp_sensors_update, HOOK_PRIO_TEMP_SENSOR); + #endif /* DT_HAS_COMPAT_STATUS_OKAY(TEMP_SENSORS_COMPAT) */ |