summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDawid Niedzwiecki <dawidn@google.com>2022-11-03 15:21:23 +0100
committerChromeos LUCI <chromeos-scoped@luci-project-accounts.iam.gserviceaccount.com>2022-11-14 16:22:42 +0000
commit51e14ac413c280ccbbd840bfb9669142c7622ed7 (patch)
tree0733105a25d7a21dde4ece10c64d5bdb61775500
parent5cf490d59c3d0a2ab0ac82b963888de4035a68ef (diff)
downloadchrome-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.c13
-rw-r--r--driver/temp_sensor/tmp112.c13
-rw-r--r--include/driver/temp_sensor/pct2075.h4
-rw-r--r--include/driver/temp_sensor/tmp112.h4
-rw-r--r--zephyr/shim/include/temp_sensor/temp_sensor.h1
-rw-r--r--zephyr/shim/src/temp_sensors.c67
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) */