| /* | 
 |  * Copyright 2023 Daniel DeGrasse <daniel@degrasse.com> | 
 |  * | 
 |  * SPDX-License-Identifier: Apache-2.0 | 
 |  */ | 
 |  | 
 | #ifndef _DRIVERS_SENSOR_TCN75A_H_ | 
 | #define _DRIVERS_SENSOR_TCN75A_H_ | 
 |  | 
 | #include <zephyr/drivers/gpio.h> | 
 | #include <zephyr/drivers/i2c.h> | 
 | #include <zephyr/drivers/sensor.h> | 
 | #include <zephyr/sys/byteorder.h> | 
 |  | 
 | #define TCN75A_TEMP_REG	  0x0 | 
 | #define TCN75A_CONFIG_REG 0x1 | 
 | #define TCN75A_THYST_REG  0x2 | 
 | #define TCN75A_TSET_REG	  0x3 | 
 |  | 
 | /* TCN75A TEMP register constants */ | 
 | #define TCN75A_TEMP_MSB_POS  8 | 
 | #define TCN75A_TEMP_MSB_MASK 0xFF00 | 
 | #define TCN75A_TEMP_LSB_MASK 0xFF | 
 | #define TCN75A_TEMP_LSB_POS  0 | 
 |  | 
 | /* TCN75A CONFIG register constants */ | 
 | #define TCN75A_CONFIG_ONEDOWN	BIT(7) | 
 | #define TCN75A_CONFIG_RES(x)    (((x) & 0x3) << 5) | 
 | #define TCN75A_CONFIG_INT_EN	0x2 | 
 | #define TCN75A_CONFIG_SHUTDOWN	0x1 | 
 |  | 
 | struct tcn75a_config { | 
 | 	struct i2c_dt_spec i2c_spec; | 
 | 	bool oneshot_mode; | 
 | 	uint8_t resolution; | 
 | #ifdef CONFIG_TCN75A_TRIGGER | 
 | 	struct gpio_dt_spec alert_gpios; | 
 | #endif | 
 | }; | 
 |  | 
 | struct tcn75a_data { | 
 | 	uint16_t temp_sample; | 
 | #ifdef CONFIG_TCN75A_TRIGGER | 
 | 	const struct device *dev; | 
 | 	struct gpio_callback gpio_cb; | 
 | 	sensor_trigger_handler_t sensor_cb; | 
 | 	const struct sensor_trigger *sensor_trig; | 
 | #endif | 
 | #ifdef CONFIG_TCN75A_TRIGGER_GLOBAL_THREAD | 
 | 	struct k_work work; | 
 | #endif | 
 | #ifdef CONFIG_TCN75A_TRIGGER_OWN_THREAD | 
 | 	K_KERNEL_STACK_MEMBER(thread_stack, CONFIG_TCN75A_THREAD_STACK_SIZE); | 
 | 	struct k_thread thread; | 
 | 	struct k_sem trig_sem; | 
 | #endif | 
 | }; | 
 |  | 
 | /* Helpers to convert from TCN75A temperature fixed point format | 
 |  * to sensor val2 format. When the LSB of the TCN75A temperature sample | 
 |  * is treated as an integer, the format to convert to sensor val2 is | 
 |  * FIXED_POINT_VAL * 3906.25 | 
 |  */ | 
 | #define TCN75A_FIXED_PT_TO_SENSOR(x) (((x)*3906) + ((x) >> 2)) | 
 | /* This conversion is imprecise, but because the 4 least significant bits | 
 |  * of the temperature register aren't used, it doesn't matter. | 
 |  */ | 
 | #define TCN75A_SENSOR_TO_FIXED_PT(x) ((x) / 3906) | 
 |  | 
 | #ifdef CONFIG_TCN75A_TRIGGER | 
 |  | 
 | int tcn75a_trigger_init(const struct device *dev); | 
 | int tcn75a_attr_get(const struct device *dev, enum sensor_channel chan, enum sensor_attribute attr, | 
 | 		    struct sensor_value *val); | 
 |  | 
 | int tcn75a_attr_set(const struct device *dev, enum sensor_channel chan, enum sensor_attribute attr, | 
 | 		    const struct sensor_value *val); | 
 | int tcn75a_trigger_set(const struct device *dev, const struct sensor_trigger *trig, | 
 | 		       sensor_trigger_handler_t handler); | 
 | #endif | 
 | int tcn75a_sample_fetch(const struct device *dev, enum sensor_channel chan); | 
 |  | 
 | #endif /* _DRIVERS_SENSOR_TCN75A_H_ */ |