Skip to content

Commit 0e7b17e

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 0e7b17e

File tree

2 files changed

+44
-12
lines changed

2 files changed

+44
-12
lines changed

drivers/sensor/adi/adltc2990/adltc2990.c

Lines changed: 43 additions & 12 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
{
@@ -96,10 +130,9 @@ static enum adltc2990_monitoring_type adltc2990_get_v3_v4_measurement_modes(uint
96130

97131
int adltc2990_is_busy(const struct device *dev, bool *is_busy)
98132
{
99-
const struct adltc2990_config *cfg = dev->config;
100133
uint8_t status_reg = 0;
101134

102-
if (i2c_reg_read_byte_dt(&cfg->bus, ADLTC2990_REG_STATUS, &status_reg)) {
135+
if (adltc2990_reg_read_byte_dt(dev, ADLTC2990_REG_STATUS, &status_reg)) {
103136
return -EIO;
104137
}
105138

@@ -136,7 +169,6 @@ static void adltc2990_get_v3_v4_val(const struct device *dev, struct sensor_valu
136169
int adltc2990_trigger_measurement(const struct device *dev,
137170
enum adltc2990_acquisition_format format)
138171
{
139-
const struct adltc2990_config *cfg = dev->config;
140172
struct adltc2990_data *data = dev->data;
141173

142174
if (data->acq_format == format) {
@@ -146,20 +178,18 @@ int adltc2990_trigger_measurement(const struct device *dev,
146178
data->acq_format = format;
147179
uint8_t ctrl_reg_setting;
148180

149-
if (i2c_reg_read_byte_dt(&cfg->bus, ADLTC2990_REG_CONTROL, &ctrl_reg_setting)) {
150-
LOG_ERR("reading control register failed.");
181+
if (adltc2990_reg_read_byte_dt(dev, ADLTC2990_REG_CONTROL, &ctrl_reg_setting)) {
151182
return -EIO;
152183
}
153184

154185
WRITE_BIT(ctrl_reg_setting, ADLTC2990_ACQUISITION_BIT_POS, format);
155186

156-
if (i2c_reg_write_byte_dt(&cfg->bus, ADLTC2990_REG_CONTROL, ctrl_reg_setting)) {
157-
LOG_ERR("configuring for single bus failed.");
187+
if (adltc2990_reg_write_byte_dt(dev, ADLTC2990_REG_CONTROL, ctrl_reg_setting)) {
158188
return -EIO;
159189
}
160190

161191
trigger_conversion:
162-
return i2c_reg_write_byte_dt(&cfg->bus, ADLTC2990_REG_TRIGGER, 0x1);
192+
return adltc2990_reg_write_byte_dt(dev, ADLTC2990_REG_TRIGGER, 0x1);
163193
}
164194

165195
static int adltc2990_fetch_property_value(const struct device *dev,
@@ -207,11 +237,11 @@ static int adltc2990_fetch_property_value(const struct device *dev,
207237
return -EINVAL;
208238
}
209239

210-
if (i2c_reg_read_byte_dt(&cfg->bus, msb_address, &msb_value)) {
240+
if (adltc2990_reg_read_byte_dt(dev, msb_address, &msb_value)) {
211241
return -EIO;
212242
}
213243

214-
if (i2c_reg_read_byte_dt(&cfg->bus, lsb_address, &lsb_value)) {
244+
if (adltc2990_reg_read_byte_dt(dev, lsb_address, &lsb_value)) {
215245
return -EIO;
216246
}
217247

@@ -595,6 +625,8 @@ static int adltc2990_init(const struct device *dev)
595625
struct adltc2990_data *data = dev->data;
596626
int err;
597627

628+
k_sem_init(&data->sem, 1, 1);
629+
598630
if (!i2c_is_ready_dt(&cfg->bus)) {
599631
LOG_ERR("I2C bus %s not ready", cfg->bus.bus->name);
600632
return -ENODEV;
@@ -604,8 +636,7 @@ static int adltc2990_init(const struct device *dev)
604636
cfg->measurement_mode[1] << 3 | cfg->measurement_mode[0];
605637

606638
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.");
639+
if (adltc2990_reg_write_byte_dt(dev, ADLTC2990_REG_CONTROL, ctrl_reg_setting)) {
609640
return -EIO;
610641
}
611642

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)