summaryrefslogtreecommitdiff
path: root/zephyr/shim/src/temp_sensors.c
diff options
context:
space:
mode:
Diffstat (limited to 'zephyr/shim/src/temp_sensors.c')
-rw-r--r--zephyr/shim/src/temp_sensors.c264
1 files changed, 162 insertions, 102 deletions
diff --git a/zephyr/shim/src/temp_sensors.c b/zephyr/shim/src/temp_sensors.c
index 4d8ff28945..371d7d7fc9 100644
--- a/zephyr/shim/src/temp_sensors.c
+++ b/zephyr/shim/src/temp_sensors.c
@@ -1,9 +1,11 @@
-/* Copyright 2021 The Chromium OS Authors. All rights reserved.
+/* Copyright 2021 The ChromiumOS Authors
* Use of this source code is governed by a BSD-style license that can be
* found in the LICENSE file.
*/
#include "adc.h"
+#include "charger/chg_rt9490.h"
+#include "driver/charger/rt9490.h"
#include "temp_sensor.h"
#include "temp_sensor/pct2075.h"
#include "temp_sensor/sb_tsi.h"
@@ -11,24 +13,38 @@
#include "temp_sensor/thermistor.h"
#include "temp_sensor/tmp112.h"
-#if DT_NODE_EXISTS(DT_PATH(named_temp_sensors))
+#if DT_HAS_COMPAT_STATUS_OKAY(TEMP_SENSORS_COMPAT)
+
+BUILD_ASSERT(DT_NUM_INST_STATUS_OKAY(TEMP_SENSORS_COMPAT) == 1,
+ "Only one temperature sensors node is allowed");
#define GET_POWER_GOOD_PROP(node_id) DT_PROP(node_id, power_good_pin)
-#define GET_POWER_GOOD_DEV(node_id) \
- DEVICE_DT_GET(DT_GPIO_CTLR(GET_POWER_GOOD_PROP(node_id), \
- gpios))
+#define GET_POWER_GOOD_DEV(node_id) \
+ DEVICE_DT_GET(DT_GPIO_CTLR(GET_POWER_GOOD_PROP(node_id), gpios))
+
+#define GET_POWER_GOOD_PIN(node_id) \
+ DT_GPIO_PIN(GET_POWER_GOOD_PROP(node_id), gpios)
+
+#define POWER_GOOD_ENTRY(node_id) \
+ .power_good_dev = GET_POWER_GOOD_DEV(node_id), \
+ .power_good_pin = GET_POWER_GOOD_PIN(node_id),
-#define GET_POWER_GOOD_PIN(node_id) DT_GPIO_PIN(GET_POWER_GOOD_PROP(node_id), \
- gpios)
+#define POWER_GOOD_ENTRY_NULL(node_id) \
+ .power_good_dev = NULL, .power_good_pin = 0,
+
+#define POWER_GOOD(node_id) \
+ [TEMP_SENSOR_ID(node_id)] = { COND_CODE_1( \
+ DT_NODE_HAS_PROP(node_id, power_good_pin), \
+ (POWER_GOOD_ENTRY(node_id)), \
+ (POWER_GOOD_ENTRY_NULL(node_id))) }
#if ANY_INST_HAS_POWER_GOOD_PIN
-#define FILL_POWER_GOOD(node_id) \
-COND_CODE_1(DT_NODE_HAS_PROP(node_id, power_good_pin), \
- (.power_good_dev = GET_POWER_GOOD_DEV(node_id), \
- .power_good_pin = GET_POWER_GOOD_PIN(node_id), ), \
- (.power_good_dev = NULL, \
- .power_good_pin = 0, ))
+#define FILL_POWER_GOOD(node_id) \
+ COND_CODE_1(DT_NODE_HAS_PROP(node_id, power_good_pin), \
+ (.power_good_dev = GET_POWER_GOOD_DEV(node_id), \
+ .power_good_pin = GET_POWER_GOOD_PIN(node_id), ), \
+ (.power_good_dev = NULL, .power_good_pin = 0, ))
#else
#define FILL_POWER_GOOD(node_id)
#endif /* ANY_INST_HAS_POWER_GOOD_PIN */
@@ -43,137 +59,181 @@ static int thermistor_get_temp(const struct temp_sensor_t *sensor,
#define GET_THERMISTOR_DATUM(node_sample_id) \
[DT_PROP(node_sample_id, \
sample_index)] = { .mv = DT_PROP(node_sample_id, milivolt), \
- .temp = DT_PROP(node_sample_id, temp) },
+ .temp = DT_PROP(node_sample_id, temp) }
-#define DEFINE_THERMISTOR_DATA(node_id) \
- static const struct thermistor_data_pair DT_CAT( \
- node_id, _thermistor_data)[] = { \
- DT_FOREACH_CHILD(node_id, GET_THERMISTOR_DATUM) \
+#define DEFINE_THERMISTOR_DATA(node_id) \
+ static const struct thermistor_data_pair DT_CAT( \
+ node_id, _thermistor_data)[] = { \
+ DT_FOREACH_CHILD_SEP(node_id, GET_THERMISTOR_DATUM, (, )) \
};
#define GET_THERMISTOR_INFO(node_id) \
- (&(struct thermistor_info){ \
+ (&(const struct thermistor_info){ \
.scaling_factor = DT_PROP(node_id, scaling_factor), \
.num_pairs = DT_PROP(node_id, num_pairs), \
.data = DT_CAT(node_id, _thermistor_data), \
})
-#define GET_ZEPHYR_TEMP_SENSOR_THERMISTOR(node_id) \
- (&(struct zephyr_temp_sensor){ \
- .read = &thermistor_get_temp, \
- .thermistor = \
- GET_THERMISTOR_INFO(DT_PHANDLE(node_id, thermistor)), \
- FILL_POWER_GOOD(node_id) \
- })
-
-#define TEMP_THERMISTOR(node_id) \
- [ZSHIM_TEMP_SENSOR_ID(node_id)] = { \
- .name = DT_LABEL(node_id), \
- .idx = ZSHIM_ADC_ID(DT_PHANDLE(node_id, adc)), \
- .type = TEMP_SENSOR_TYPE_BOARD, \
- .zephyr_info = GET_ZEPHYR_TEMP_SENSOR_THERMISTOR(node_id), \
- },
+#define GET_ZEPHYR_TEMP_SENSOR_THERMISTOR(named_id, sensor_id) \
+ (&(const struct zephyr_temp_sensor){ \
+ .read = &thermistor_get_temp, \
+ .thermistor = GET_THERMISTOR_INFO( \
+ DT_PHANDLE(sensor_id, thermistor)), \
+ FILL_POWER_GOOD(named_id) })
+
+#define TEMP_THERMISTOR(named_id, sensor_id) \
+ [TEMP_SENSOR_ID(named_id)] = { \
+ .name = DT_NODE_FULL_NAME(sensor_id), \
+ .idx = ZSHIM_ADC_ID(DT_PHANDLE(sensor_id, adc)), \
+ .type = TEMP_SENSOR_TYPE_BOARD, \
+ .zephyr_info = GET_ZEPHYR_TEMP_SENSOR_THERMISTOR(named_id, \
+ sensor_id), \
+ }
DT_FOREACH_STATUS_OKAY(cros_ec_thermistor, DEFINE_THERMISTOR_DATA)
-#if DT_HAS_COMPAT_STATUS_OKAY(cros_ec_temp_sensor_pct2075)
-static int pct2075_get_temp(const struct temp_sensor_t *sensor, int *temp_ptr)
+#if DT_HAS_COMPAT_STATUS_OKAY(PCT2075_COMPAT)
+/* The function maybe unused because a temperature sensor can be added to dts
+ * without a reference in the cros_ec_temp_sensors node.
+ */
+__maybe_unused static int pct2075_get_temp(const struct temp_sensor_t *sensor,
+ int *temp_ptr)
{
return pct2075_get_val_k(sensor->idx, temp_ptr);
}
-#endif /* cros_ec_temp_sensor_pct2075 */
+#endif /* PCT2075_COMPAT */
-#define DEFINE_PCT2075_DATA(node_id) \
- [ZSHIM_PCT2075_SENSOR_ID(node_id)] = { \
- .i2c_port = I2C_PORT(DT_PHANDLE(node_id, port)), \
- .i2c_addr_flags = DT_STRING_TOKEN(node_id, i2c_addr_flags), \
+#define DEFINE_PCT2075_DATA(node_id) \
+ [PCT2075_SENSOR_ID(node_id)] = { \
+ .i2c_port = I2C_PORT_BY_DEV(node_id), \
+ .i2c_addr_flags = \
+ (DT_REG_ADDR(node_id) | I2C_FLAG_BIG_ENDIAN), \
},
-#define GET_ZEPHYR_TEMP_SENSOR_PCT2075(node_id) \
- (&(struct zephyr_temp_sensor){ \
- .read = &pct2075_get_temp, \
- .thermistor = NULL, \
- FILL_POWER_GOOD(node_id) \
- })
-
-#define TEMP_PCT2075(node_id) \
- [ZSHIM_TEMP_SENSOR_ID(node_id)] = { \
- .name = DT_LABEL(node_id), \
- .idx = ZSHIM_PCT2075_SENSOR_ID(node_id), \
- .type = TEMP_SENSOR_TYPE_BOARD, \
- .zephyr_info = GET_ZEPHYR_TEMP_SENSOR_PCT2075(node_id), \
- },
+#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 TEMP_PCT2075(named_id, sensor_id) \
+ [TEMP_SENSOR_ID(named_id)] = { \
+ .name = DT_NODE_FULL_NAME(sensor_id), \
+ .idx = PCT2075_SENSOR_ID(sensor_id), \
+ .type = TEMP_SENSOR_TYPE_BOARD, \
+ .zephyr_info = GET_ZEPHYR_TEMP_SENSOR_PCT2075(named_id), \
+ }
const struct pct2075_sensor_t pct2075_sensors[PCT2075_COUNT] = {
- DT_FOREACH_STATUS_OKAY(cros_ec_temp_sensor_pct2075, DEFINE_PCT2075_DATA)
+ DT_FOREACH_STATUS_OKAY(PCT2075_COMPAT, DEFINE_PCT2075_DATA)
};
-#if DT_HAS_COMPAT_STATUS_OKAY(cros_ec_temp_sensor_sb_tsi)
-static int sb_tsi_get_temp(const struct temp_sensor_t *sensor, int *temp_ptr)
+#if DT_HAS_COMPAT_STATUS_OKAY(SB_TSI_COMPAT)
+/* The function maybe unused because a temperature sensor can be added to dts
+ * without a reference in the cros_ec_temp_sensors node.
+ */
+__maybe_unused static int sb_tsi_get_temp(const struct temp_sensor_t *sensor,
+ int *temp_ptr)
{
return sb_tsi_get_val(sensor->idx, temp_ptr);
}
/* There can be only one SB TSI sensor with current driver */
-#if DT_NUM_INST_STATUS_OKAY(cros_ec_temp_sensor_sb_tsi) > 1
+#if DT_NUM_INST_STATUS_OKAY(SB_TSI_COMPAT) > 1
#error "Unsupported number of SB TSI sensors"
#endif
-#endif /* cros_ec_temp_sensor_sb_tsi */
+#endif /* SB_TSI_COMPAT */
-#define GET_ZEPHYR_TEMP_SENSOR_SB_TSI(node_id) \
- (&(struct zephyr_temp_sensor){ \
- .read = &sb_tsi_get_temp, \
- .thermistor = NULL, \
- FILL_POWER_GOOD(node_id) \
- })
+#define GET_ZEPHYR_TEMP_SENSOR_SB_TSI(named_id) \
+ (&(const struct zephyr_temp_sensor){ .read = &sb_tsi_get_temp, \
+ .thermistor = NULL, \
+ FILL_POWER_GOOD(named_id) })
-#define TEMP_SB_TSI(node_id) \
- [ZSHIM_TEMP_SENSOR_ID(node_id)] = { \
- .name = DT_LABEL(node_id), \
- .idx = 0, \
- .type = TEMP_SENSOR_TYPE_CPU, \
- .zephyr_info = GET_ZEPHYR_TEMP_SENSOR_SB_TSI(node_id), \
- },
+#define TEMP_SB_TSI(named_id, sensor_id) \
+ [TEMP_SENSOR_ID(named_id)] = { \
+ .name = DT_NODE_FULL_NAME(sensor_id), \
+ .idx = 0, \
+ .type = TEMP_SENSOR_TYPE_CPU, \
+ .zephyr_info = GET_ZEPHYR_TEMP_SENSOR_SB_TSI(named_id), \
+ }
-#if DT_HAS_COMPAT_STATUS_OKAY(cros_ec_temp_sensor_tmp112)
-static int tmp112_get_temp(const struct temp_sensor_t *sensor, int *temp_ptr)
+#if DT_HAS_COMPAT_STATUS_OKAY(TMP112_COMPAT)
+/* The function maybe unused because a temperature sensor can be added to dts
+ * without a reference in the cros_ec_temp_sensors node.
+ */
+__maybe_unused static int tmp112_get_temp(const struct temp_sensor_t *sensor,
+ int *temp_ptr)
{
return tmp112_get_val_k(sensor->idx, temp_ptr);
}
-#endif /* cros_ec_temp_sensor_tmp112 */
+#endif /* TMP112_COMPAT */
-#define DEFINE_TMP112_DATA(node_id) \
- [ZSHIM_TMP112_SENSOR_ID(node_id)] = { \
- .i2c_port = I2C_PORT(DT_PHANDLE(node_id, port)), \
- .i2c_addr_flags = DT_STRING_TOKEN(node_id, i2c_addr_flags), \
+#define DEFINE_TMP112_DATA(node_id) \
+ [TMP112_SENSOR_ID(node_id)] = { \
+ .i2c_port = I2C_PORT_BY_DEV(node_id), \
+ .i2c_addr_flags = DT_REG_ADDR(node_id), \
},
-#define GET_ZEPHYR_TEMP_SENSOR_TMP112(node_id) \
- (&(struct zephyr_temp_sensor){ \
- .read = &tmp112_get_temp, \
- .thermistor = NULL, \
- FILL_POWER_GOOD(node_id) \
- })
-
-#define TEMP_TMP112(node_id) \
- [ZSHIM_TEMP_SENSOR_ID(node_id)] = { \
- .name = DT_LABEL(node_id), \
- .idx = ZSHIM_TMP112_SENSOR_ID(node_id), \
- .type = TEMP_SENSOR_TYPE_BOARD, \
- .zephyr_info = GET_ZEPHYR_TEMP_SENSOR_TMP112(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 TEMP_TMP112(named_id, sensor_id) \
+ [TEMP_SENSOR_ID(named_id)] = { \
+ .name = DT_NODE_FULL_NAME(sensor_id), \
+ .idx = TMP112_SENSOR_ID(sensor_id), \
+ .type = TEMP_SENSOR_TYPE_BOARD, \
+ .zephyr_info = GET_ZEPHYR_TEMP_SENSOR_TMP112(named_id), \
+ }
const struct tmp112_sensor_t tmp112_sensors[TMP112_COUNT] = {
- DT_FOREACH_STATUS_OKAY(cros_ec_temp_sensor_tmp112, DEFINE_TMP112_DATA)
+ DT_FOREACH_STATUS_OKAY(TMP112_COMPAT, DEFINE_TMP112_DATA)
};
-const struct temp_sensor_t temp_sensors[] = {
- DT_FOREACH_STATUS_OKAY(cros_ec_temp_sensor_thermistor, TEMP_THERMISTOR)
- DT_FOREACH_STATUS_OKAY(cros_ec_temp_sensor_pct2075, TEMP_PCT2075)
- DT_FOREACH_STATUS_OKAY(cros_ec_temp_sensor_sb_tsi, TEMP_SB_TSI)
- DT_FOREACH_STATUS_OKAY(cros_ec_temp_sensor_tmp112, TEMP_TMP112)
-};
+/* There can be only one thermistor on RT9490 with current driver */
+#define ADD_ONE(node_id) 1 +
+#if DT_FOREACH_STATUS_OKAY_VARGS(RT9490_CHG_COMPAT, TEMP_RT9490_FN, \
+ ADD_ONE) 0 > 1
+#error "Unsupported number of thermistor on RT9490"
+#endif
+#undef ADD_ONE
+
+#define GET_ZEPHYR_TEMP_SENSOR_RT9490(named_id, sensor_id) \
+ (&(const struct zephyr_temp_sensor){ \
+ .read = &rt9490_get_thermistor_val, \
+ .thermistor = GET_THERMISTOR_INFO( \
+ DT_PHANDLE(sensor_id, thermistor)), \
+ FILL_POWER_GOOD(named_id) })
+
+#define TEMP_RT9490(named_id, sensor_id) \
+ COND_CODE_1(DT_NODE_HAS_PROP(sensor_id, thermistor), ( \
+ [TEMP_SENSOR_ID(named_id)] = { \
+ .name = DT_NODE_FULL_NAME(sensor_id), \
+ .idx = 0, \
+ .type = TEMP_SENSOR_TYPE_BOARD, \
+ .zephyr_info = GET_ZEPHYR_TEMP_SENSOR_RT9490(named_id, \
+ sensor_id), \
+ } ), ())
+
+#define DT_DRV_COMPAT TEMP_SENSORS_COMPAT
+
+#define CHECK_COMPAT(compat, named_id, sensor_id, config_fn) \
+ COND_CODE_1(DT_NODE_HAS_COMPAT(sensor_id, compat), \
+ (config_fn(named_id, sensor_id)), ())
+
+#define TEMP_SENSOR_FIND(named_id, sensor_id) \
+ CHECK_COMPAT(THERMISTOR_COMPAT, named_id, sensor_id, TEMP_THERMISTOR) \
+ CHECK_COMPAT(PCT2075_COMPAT, named_id, sensor_id, TEMP_PCT2075) \
+ CHECK_COMPAT(SB_TSI_COMPAT, named_id, sensor_id, TEMP_SB_TSI) \
+ CHECK_COMPAT(TMP112_COMPAT, named_id, sensor_id, TEMP_TMP112) \
+ CHECK_COMPAT(RT9490_CHG_COMPAT, named_id, sensor_id, TEMP_RT9490)
+
+#define TEMP_SENSOR_ENTRY(named_id) \
+ TEMP_SENSOR_FIND(named_id, DT_PHANDLE(named_id, sensor))
+
+const struct temp_sensor_t temp_sensors[] = { DT_FOREACH_CHILD_SEP(
+ TEMP_SENSORS_NODEID, TEMP_SENSOR_ENTRY, (, )) };
int temp_sensor_read(enum temp_sensor_id id, int *temp_ptr)
{
@@ -194,4 +254,4 @@ int temp_sensor_read(enum temp_sensor_id id, int *temp_ptr)
return sensor->zephyr_info->read(sensor, temp_ptr);
}
-#endif /* named_temp_sensors */
+#endif /* DT_HAS_COMPAT_STATUS_OKAY(TEMP_SENSORS_COMPAT) */