Skip to content

Commit ebfe93b

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 ebfe93b

File tree

2 files changed

+44
-11
lines changed

2 files changed

+44
-11
lines changed

drivers/sensor/adi/adltc2990/adltc2990.c

Lines changed: 43 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,40 @@
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+
26+
k_sem_take(&data->sem, K_FOREVER);
27+
28+
if (i2c_reg_write_byte_dt(&cfg->bus, reg, value)) {
29+
LOG_ERR("Failed to write register 0x%02x", reg);
30+
return -EIO;
31+
}
32+
33+
k_sem_give(&data->sem);
34+
35+
return 0;
36+
}
37+
38+
static int adltc2990_reg_read_byte_dt(const struct device *dev, uint8_t reg, uint8_t *value)
39+
{
40+
const struct adltc2990_config *cfg = dev->config;
41+
struct adltc2990_data *data = dev->data;
42+
43+
k_sem_take(&data->sem, K_FOREVER);
44+
45+
if (i2c_reg_read_byte_dt(&cfg->bus, reg, value)) {
46+
LOG_ERR("Failed to read register 0x%02x", reg);
47+
return -EIO;
48+
}
49+
50+
k_sem_give(&data->sem);
51+
52+
return 0;
53+
}
54+
2155
static enum adltc2990_monitoring_type adltc2990_get_v1_v2_measurement_modes(uint8_t mode_4_3,
2256
uint8_t mode_2_0)
2357
{
@@ -99,7 +133,7 @@ int adltc2990_is_busy(const struct device *dev, bool *is_busy)
99133
const struct adltc2990_config *cfg = dev->config;
100134
uint8_t status_reg = 0;
101135

102-
if (i2c_reg_read_byte_dt(&cfg->bus, ADLTC2990_REG_STATUS, &status_reg)) {
136+
if (adltc2990_reg_read_byte_dt(dev, ADLTC2990_REG_STATUS, &status_reg)) {
103137
return -EIO;
104138
}
105139

@@ -136,7 +170,6 @@ static void adltc2990_get_v3_v4_val(const struct device *dev, struct sensor_valu
136170
int adltc2990_trigger_measurement(const struct device *dev,
137171
enum adltc2990_acquisition_format format)
138172
{
139-
const struct adltc2990_config *cfg = dev->config;
140173
struct adltc2990_data *data = dev->data;
141174

142175
if (data->acq_format == format) {
@@ -146,20 +179,18 @@ int adltc2990_trigger_measurement(const struct device *dev,
146179
data->acq_format = format;
147180
uint8_t ctrl_reg_setting;
148181

149-
if (i2c_reg_read_byte_dt(&cfg->bus, ADLTC2990_REG_CONTROL, &ctrl_reg_setting)) {
150-
LOG_ERR("reading control register failed.");
182+
if (adltc2990_reg_read_byte_dt(dev, ADLTC2990_REG_CONTROL, &ctrl_reg_setting)) {
151183
return -EIO;
152184
}
153185

154186
WRITE_BIT(ctrl_reg_setting, ADLTC2990_ACQUISITION_BIT_POS, format);
155187

156-
if (i2c_reg_write_byte_dt(&cfg->bus, ADLTC2990_REG_CONTROL, ctrl_reg_setting)) {
157-
LOG_ERR("configuring for single bus failed.");
188+
if (adltc2990_reg_write_byte_dt(dev, ADLTC2990_REG_CONTROL, ctrl_reg_setting)) {
158189
return -EIO;
159190
}
160191

161192
trigger_conversion:
162-
return i2c_reg_write_byte_dt(&cfg->bus, ADLTC2990_REG_TRIGGER, 0x1);
193+
return adltc2990_reg_write_byte_dt(dev, ADLTC2990_REG_TRIGGER, 0x1);
163194
}
164195

165196
static int adltc2990_fetch_property_value(const struct device *dev,
@@ -207,11 +238,11 @@ static int adltc2990_fetch_property_value(const struct device *dev,
207238
return -EINVAL;
208239
}
209240

210-
if (i2c_reg_read_byte_dt(&cfg->bus, msb_address, &msb_value)) {
241+
if (adltc2990_reg_read_byte_dt(dev, msb_address, &msb_value)) {
211242
return -EIO;
212243
}
213244

214-
if (i2c_reg_read_byte_dt(&cfg->bus, lsb_address, &lsb_value)) {
245+
if (adltc2990_reg_read_byte_dt(dev, lsb_address, &lsb_value)) {
215246
return -EIO;
216247
}
217248

@@ -595,6 +626,8 @@ static int adltc2990_init(const struct device *dev)
595626
struct adltc2990_data *data = dev->data;
596627
int err;
597628

629+
k_sem_init(&data->sem, 1, 1);
630+
598631
if (!i2c_is_ready_dt(&cfg->bus)) {
599632
LOG_ERR("I2C bus %s not ready", cfg->bus.bus->name);
600633
return -ENODEV;
@@ -604,8 +637,7 @@ static int adltc2990_init(const struct device *dev)
604637
cfg->measurement_mode[1] << 3 | cfg->measurement_mode[0];
605638

606639
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.");
640+
if (adltc2990_reg_write_byte_dt(dev, ADLTC2990_REG_CONTROL, ctrl_reg_setting)) {
609641
return -EIO;
610642
}
611643

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)