Skip to content

Commit 72ca57c

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 72ca57c

File tree

2 files changed

+46
-12
lines changed

2 files changed

+46
-12
lines changed

drivers/sensor/adi/adltc2990/adltc2990.c

Lines changed: 45 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,42 @@
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+
if (err != 0) {
31+
LOG_ERR("Failed to write register 0x%02x", reg);
32+
}
33+
34+
k_sem_give(&data->sem);
35+
36+
return err;
37+
}
38+
39+
static int adltc2990_reg_read_byte_dt(const struct device *dev, uint8_t reg, uint8_t *value)
40+
{
41+
const struct adltc2990_config *cfg = dev->config;
42+
struct adltc2990_data *data = dev->data;
43+
int err;
44+
45+
k_sem_take(&data->sem, K_FOREVER);
46+
47+
err = i2c_reg_read_byte_dt(&cfg->bus, reg, value);
48+
if (err != 0) {
49+
LOG_ERR("Failed to read register 0x%02x", reg);
50+
}
51+
52+
k_sem_give(&data->sem);
53+
54+
return err;
55+
}
56+
2157
static enum adltc2990_monitoring_type adltc2990_get_v1_v2_measurement_modes(uint8_t mode_4_3,
2258
uint8_t mode_2_0)
2359
{
@@ -96,10 +132,9 @@ static enum adltc2990_monitoring_type adltc2990_get_v3_v4_measurement_modes(uint
96132

97133
int adltc2990_is_busy(const struct device *dev, bool *is_busy)
98134
{
99-
const struct adltc2990_config *cfg = dev->config;
100135
uint8_t status_reg = 0;
101136

102-
if (i2c_reg_read_byte_dt(&cfg->bus, ADLTC2990_REG_STATUS, &status_reg)) {
137+
if (adltc2990_reg_read_byte_dt(dev, ADLTC2990_REG_STATUS, &status_reg)) {
103138
return -EIO;
104139
}
105140

@@ -136,7 +171,6 @@ static void adltc2990_get_v3_v4_val(const struct device *dev, struct sensor_valu
136171
int adltc2990_trigger_measurement(const struct device *dev,
137172
enum adltc2990_acquisition_format format)
138173
{
139-
const struct adltc2990_config *cfg = dev->config;
140174
struct adltc2990_data *data = dev->data;
141175

142176
if (data->acq_format == format) {
@@ -146,20 +180,18 @@ int adltc2990_trigger_measurement(const struct device *dev,
146180
data->acq_format = format;
147181
uint8_t ctrl_reg_setting;
148182

149-
if (i2c_reg_read_byte_dt(&cfg->bus, ADLTC2990_REG_CONTROL, &ctrl_reg_setting)) {
150-
LOG_ERR("reading control register failed.");
183+
if (adltc2990_reg_read_byte_dt(dev, ADLTC2990_REG_CONTROL, &ctrl_reg_setting)) {
151184
return -EIO;
152185
}
153186

154187
WRITE_BIT(ctrl_reg_setting, ADLTC2990_ACQUISITION_BIT_POS, format);
155188

156-
if (i2c_reg_write_byte_dt(&cfg->bus, ADLTC2990_REG_CONTROL, ctrl_reg_setting)) {
157-
LOG_ERR("configuring for single bus failed.");
189+
if (adltc2990_reg_write_byte_dt(dev, ADLTC2990_REG_CONTROL, ctrl_reg_setting)) {
158190
return -EIO;
159191
}
160192

161193
trigger_conversion:
162-
return i2c_reg_write_byte_dt(&cfg->bus, ADLTC2990_REG_TRIGGER, 0x1);
194+
return adltc2990_reg_write_byte_dt(dev, ADLTC2990_REG_TRIGGER, 0x1);
163195
}
164196

165197
static int adltc2990_fetch_property_value(const struct device *dev,
@@ -207,11 +239,11 @@ static int adltc2990_fetch_property_value(const struct device *dev,
207239
return -EINVAL;
208240
}
209241

210-
if (i2c_reg_read_byte_dt(&cfg->bus, msb_address, &msb_value)) {
242+
if (adltc2990_reg_read_byte_dt(dev, msb_address, &msb_value)) {
211243
return -EIO;
212244
}
213245

214-
if (i2c_reg_read_byte_dt(&cfg->bus, lsb_address, &lsb_value)) {
246+
if (adltc2990_reg_read_byte_dt(dev, lsb_address, &lsb_value)) {
215247
return -EIO;
216248
}
217249

@@ -595,6 +627,8 @@ static int adltc2990_init(const struct device *dev)
595627
struct adltc2990_data *data = dev->data;
596628
int err;
597629

630+
k_sem_init(&data->sem, 1, 1);
631+
598632
if (!i2c_is_ready_dt(&cfg->bus)) {
599633
LOG_ERR("I2C bus %s not ready", cfg->bus.bus->name);
600634
return -ENODEV;
@@ -604,8 +638,7 @@ static int adltc2990_init(const struct device *dev)
604638
cfg->measurement_mode[1] << 3 | cfg->measurement_mode[0];
605639

606640
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.");
641+
if (adltc2990_reg_write_byte_dt(dev, ADLTC2990_REG_CONTROL, ctrl_reg_setting)) {
609642
return -EIO;
610643
}
611644

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)