Skip to content

Commit 5da766d

Browse files
committed
drivers: adltc2990: use wrapper with semaphore for bus communication
Use a semaphore for bus communication in order to ensure thread safety Signed-off-by: Jilay Pandya <jilay.pandya@outlook.com>
1 parent 95d6058 commit 5da766d

File tree

2 files changed

+48
-12
lines changed

2 files changed

+48
-12
lines changed

drivers/sensor/adi/adltc2990/adltc2990.c

Lines changed: 47 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,44 @@
1818
#include <zephyr/logging/log.h>
1919
LOG_MODULE_REGISTER(adltc2990, CONFIG_SENSOR_LOG_LEVEL);
2020

21+
static int adltc2990_reg_write_byte_dt(const struct device *dev, uint8_t reg, uint8_t value)
22+
{
23+
const struct adltc2990_config *cfg = dev->config;
24+
struct adltc2990_data *data = dev->data;
25+
int err;
26+
27+
k_sem_take(&data->sem, K_FOREVER);
28+
29+
err = i2c_reg_write_byte_dt(&cfg->bus, reg, value);
30+
31+
k_sem_give(&data->sem);
32+
33+
if (err != 0) {
34+
LOG_ERR("Failed to write register 0x%02x", reg);
35+
}
36+
37+
return err;
38+
}
39+
40+
static int adltc2990_reg_read_byte_dt(const struct device *dev, uint8_t reg, uint8_t *value)
41+
{
42+
const struct adltc2990_config *cfg = dev->config;
43+
struct adltc2990_data *data = dev->data;
44+
int err;
45+
46+
k_sem_take(&data->sem, K_FOREVER);
47+
48+
err = i2c_reg_read_byte_dt(&cfg->bus, reg, value);
49+
50+
k_sem_give(&data->sem);
51+
52+
if (err != 0) {
53+
LOG_ERR("Failed to read register 0x%02x", reg);
54+
}
55+
56+
return err;
57+
}
58+
2159
static enum adltc2990_monitoring_type adltc2990_get_v1_v2_measurement_modes(uint8_t mode_4_3,
2260
uint8_t mode_2_0)
2361
{
@@ -96,10 +134,9 @@ static enum adltc2990_monitoring_type adltc2990_get_v3_v4_measurement_modes(uint
96134

97135
int adltc2990_is_busy(const struct device *dev, bool *is_busy)
98136
{
99-
const struct adltc2990_config *cfg = dev->config;
100137
uint8_t status_reg = 0;
101138

102-
if (i2c_reg_read_byte_dt(&cfg->bus, ADLTC2990_REG_STATUS, &status_reg)) {
139+
if (adltc2990_reg_read_byte_dt(dev, ADLTC2990_REG_STATUS, &status_reg)) {
103140
return -EIO;
104141
}
105142

@@ -136,7 +173,6 @@ static void adltc2990_get_v3_v4_val(const struct device *dev, struct sensor_valu
136173
int adltc2990_trigger_measurement(const struct device *dev,
137174
enum adltc2990_acquisition_format format)
138175
{
139-
const struct adltc2990_config *cfg = dev->config;
140176
struct adltc2990_data *data = dev->data;
141177

142178
if (data->acq_format == format) {
@@ -146,20 +182,18 @@ int adltc2990_trigger_measurement(const struct device *dev,
146182
data->acq_format = format;
147183
uint8_t ctrl_reg_setting;
148184

149-
if (i2c_reg_read_byte_dt(&cfg->bus, ADLTC2990_REG_CONTROL, &ctrl_reg_setting)) {
150-
LOG_ERR("reading control register failed.");
185+
if (adltc2990_reg_read_byte_dt(dev, ADLTC2990_REG_CONTROL, &ctrl_reg_setting)) {
151186
return -EIO;
152187
}
153188

154189
WRITE_BIT(ctrl_reg_setting, ADLTC2990_ACQUISITION_BIT_POS, format);
155190

156-
if (i2c_reg_write_byte_dt(&cfg->bus, ADLTC2990_REG_CONTROL, ctrl_reg_setting)) {
157-
LOG_ERR("configuring for single bus failed.");
191+
if (adltc2990_reg_write_byte_dt(dev, ADLTC2990_REG_CONTROL, ctrl_reg_setting)) {
158192
return -EIO;
159193
}
160194

161195
trigger_conversion:
162-
return i2c_reg_write_byte_dt(&cfg->bus, ADLTC2990_REG_TRIGGER, 0x1);
196+
return adltc2990_reg_write_byte_dt(dev, ADLTC2990_REG_TRIGGER, 0x1);
163197
}
164198

165199
static int adltc2990_fetch_property_value(const struct device *dev,
@@ -207,11 +241,11 @@ static int adltc2990_fetch_property_value(const struct device *dev,
207241
return -EINVAL;
208242
}
209243

210-
if (i2c_reg_read_byte_dt(&cfg->bus, msb_address, &msb_value)) {
244+
if (adltc2990_reg_read_byte_dt(dev, msb_address, &msb_value)) {
211245
return -EIO;
212246
}
213247

214-
if (i2c_reg_read_byte_dt(&cfg->bus, lsb_address, &lsb_value)) {
248+
if (adltc2990_reg_read_byte_dt(dev, lsb_address, &lsb_value)) {
215249
return -EIO;
216250
}
217251

@@ -595,6 +629,8 @@ static int adltc2990_init(const struct device *dev)
595629
struct adltc2990_data *data = dev->data;
596630
int err;
597631

632+
k_sem_init(&data->sem, 1, 1);
633+
598634
if (!i2c_is_ready_dt(&cfg->bus)) {
599635
LOG_ERR("I2C bus %s not ready", cfg->bus.bus->name);
600636
return -ENODEV;
@@ -604,8 +640,7 @@ static int adltc2990_init(const struct device *dev)
604640
cfg->measurement_mode[1] << 3 | cfg->measurement_mode[0];
605641

606642
LOG_DBG("Setting Control Register to: 0x%x", ctrl_reg_setting);
607-
if (i2c_reg_write_byte_dt(&cfg->bus, ADLTC2990_REG_CONTROL, ctrl_reg_setting)) {
608-
LOG_ERR("configuring for single bus failed.");
643+
if (adltc2990_reg_write_byte_dt(dev, ADLTC2990_REG_CONTROL, ctrl_reg_setting)) {
609644
return -EIO;
610645
}
611646

drivers/sensor/adi/adltc2990/adltc2990_internal.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -51,6 +51,7 @@ struct adltc2990_data {
5151
int32_t supply_voltage;
5252
int32_t pins_v1_v2_values[2];
5353
int32_t pins_v3_v4_values[2];
54+
struct k_sem sem;
5455
};
5556

5657
struct adltc2990_config {

0 commit comments

Comments
 (0)