@@ -46,20 +46,26 @@ struct i2c_nrf5_data {
46
46
u32_t err :1 ;
47
47
u32_t stopped :1 ;
48
48
struct device * gpio ;
49
+ struct k_sem lock ;
49
50
};
50
51
51
52
52
53
static int i2c_nrf5_configure (struct device * dev , u32_t dev_config_raw )
53
54
{
54
55
const struct i2c_nrf5_config * config = dev -> config -> config_info ;
56
+ struct i2c_nrf5_data * data = dev -> driver_data ;
55
57
volatile NRF_TWI_Type * twi = config -> base ;
58
+ int ret = 0 ;
59
+
56
60
57
61
SYS_LOG_DBG ("" );
58
62
59
63
if (I2C_ADDR_10_BITS & dev_config_raw ) {
60
64
return - EINVAL ;
61
65
}
62
66
67
+ k_sem_take (& data -> lock , K_FOREVER );
68
+
63
69
switch (I2C_SPEED_GET (dev_config_raw )) {
64
70
case I2C_SPEED_STANDARD :
65
71
twi -> FREQUENCY = TWI_FREQUENCY_FREQUENCY_K100 ;
@@ -69,10 +75,12 @@ static int i2c_nrf5_configure(struct device *dev, u32_t dev_config_raw)
69
75
break ;
70
76
default :
71
77
SYS_LOG_ERR ("unsupported speed" );
72
- return - EINVAL ;
78
+ ret = - EINVAL ;
73
79
}
74
80
75
- return 0 ;
81
+ k_sem_give (& data -> lock );
82
+
83
+ return ret ;
76
84
}
77
85
78
86
static int i2c_nrf5_read (struct device * dev , struct i2c_msg * msg )
@@ -199,7 +207,11 @@ static int i2c_nrf5_transfer(struct device *dev, struct i2c_msg *msgs,
199
207
u8_t num_msgs , u16_t addr )
200
208
{
201
209
const struct i2c_nrf5_config * config = dev -> config -> config_info ;
210
+ struct i2c_nrf5_data * data = dev -> driver_data ;
202
211
volatile NRF_TWI_Type * twi = config -> base ;
212
+ int ret = 0 ;
213
+
214
+ k_sem_take (& data -> lock , K_FOREVER );
203
215
204
216
SYS_LOG_DBG ("transaction-start addr=0x%x" , addr );
205
217
@@ -212,8 +224,6 @@ static int i2c_nrf5_transfer(struct device *dev, struct i2c_msg *msgs,
212
224
twi -> ENABLE = TWI_ENABLE_ENABLE_Enabled ;
213
225
twi -> ADDRESS = addr ;
214
226
for (int i = 0 ; i < num_msgs ; i ++ ) {
215
- int r ;
216
-
217
227
SYS_LOG_DBG ("msg len=%d %s%s%s" , msgs [i ].len ,
218
228
(msgs [i ].flags & I2C_MSG_READ ) ? "R" :"W" ,
219
229
(msgs [i ].flags & I2C_MSG_STOP ) ? "S" :"-" ,
@@ -225,19 +235,20 @@ static int i2c_nrf5_transfer(struct device *dev, struct i2c_msg *msgs,
225
235
| NRF5_TWI_INT_RXDREADY
226
236
| NRF5_TWI_INT_ERROR
227
237
| NRF5_TWI_INT_STOPPED );
228
- r = i2c_nrf5_read (dev , msgs + i );
238
+ ret = i2c_nrf5_read (dev , msgs + i );
229
239
} else {
230
- r = i2c_nrf5_write (dev , msgs + i );
240
+ ret = i2c_nrf5_write (dev , msgs + i );
231
241
}
232
242
233
- if (r != 0 ) {
234
- twi -> ENABLE = TWI_ENABLE_ENABLE_Disabled ;
235
- return r ;
243
+ if (ret != 0 ) {
244
+ break ;
236
245
}
237
246
}
238
247
twi -> ENABLE = TWI_ENABLE_ENABLE_Disabled ;
239
248
240
- return 0 ;
249
+ k_sem_give (& data -> lock );
250
+
251
+ return ret ;
241
252
}
242
253
243
254
static void i2c_nrf5_isr (void * arg )
@@ -313,11 +324,10 @@ static int i2c_nrf5_init(struct device *dev)
313
324
| NRF5_TWI_INT_STOPPED );
314
325
315
326
status = i2c_nrf5_configure (dev , config -> default_cfg );
316
- if (status ) {
317
- return status ;
318
- }
319
327
320
- return 0 ;
328
+ k_sem_give (& data -> lock );
329
+
330
+ return status ;
321
331
}
322
332
323
333
static const struct i2c_driver_api i2c_nrf5_driver_api = {
@@ -339,7 +349,9 @@ static const struct i2c_nrf5_config i2c_nrf5_config_0 = {
339
349
.scl_pin = CONFIG_I2C_NRF5_0_GPIO_SCL_PIN ,
340
350
};
341
351
342
- static struct i2c_nrf5_data i2c_nrf5_data_0 ;
352
+ static struct i2c_nrf5_data i2c_nrf5_data_0 = {
353
+ .lock = _K_SEM_INITIALIZER (i2c_nrf5_data_0 .lock , 1 , 1 ),
354
+ };
343
355
344
356
DEVICE_AND_API_INIT (i2c_nrf5_0 , CONFIG_I2C_0_NAME , i2c_nrf5_init ,
345
357
& i2c_nrf5_data_0 , & i2c_nrf5_config_0 ,
@@ -366,7 +378,9 @@ static const struct i2c_nrf5_config i2c_nrf5_config_1 = {
366
378
.scl_pin = CONFIG_I2C_NRF5_1_GPIO_SCL_PIN ,
367
379
};
368
380
369
- static struct i2c_nrf5_data i2c_nrf5_data_1 ;
381
+ static struct i2c_nrf5_data i2c_nrf5_data_1 = {
382
+ .lock = _K_SEM_INITIALIZER (i2c_nrf5_data_1 .lock , 1 , 1 ),
383
+ };
370
384
371
385
DEVICE_AND_API_INIT (i2c_nrf5_1 , CONFIG_I2C_1_NAME , i2c_nrf5_init ,
372
386
& i2c_nrf5_data_1 , & i2c_nrf5_config_1 ,
0 commit comments