62
62
* @current_range: current range which the device is configured for
63
63
* @data: spi transfer buffers
64
64
* @fault_mask: software masking of events
65
+ * @lock lock to protect the data buffer during SPI ops
65
66
*/
66
67
struct ad5421_state {
67
68
struct spi_device * spi ;
68
69
unsigned int ctrl ;
69
70
enum ad5421_current_range current_range ;
70
71
unsigned int fault_mask ;
72
+ struct mutex lock ;
71
73
72
74
/*
73
75
* DMA (thus cache coherency maintenance) requires the
@@ -142,11 +144,12 @@ static int ad5421_write_unlocked(struct iio_dev *indio_dev,
142
144
static int ad5421_write (struct iio_dev * indio_dev , unsigned int reg ,
143
145
unsigned int val )
144
146
{
147
+ struct ad5421_state * st = iio_priv (indio_dev );
145
148
int ret ;
146
149
147
- mutex_lock (& indio_dev -> mlock );
150
+ mutex_lock (& st -> lock );
148
151
ret = ad5421_write_unlocked (indio_dev , reg , val );
149
- mutex_unlock (& indio_dev -> mlock );
152
+ mutex_unlock (& st -> lock );
150
153
151
154
return ret ;
152
155
}
@@ -166,15 +169,15 @@ static int ad5421_read(struct iio_dev *indio_dev, unsigned int reg)
166
169
},
167
170
};
168
171
169
- mutex_lock (& indio_dev -> mlock );
172
+ mutex_lock (& st -> lock );
170
173
171
174
st -> data [0 ].d32 = cpu_to_be32 ((1 << 23 ) | (reg << 16 ));
172
175
173
176
ret = spi_sync_transfer (st -> spi , t , ARRAY_SIZE (t ));
174
177
if (ret >= 0 )
175
178
ret = be32_to_cpu (st -> data [1 ].d32 ) & 0xffff ;
176
179
177
- mutex_unlock (& indio_dev -> mlock );
180
+ mutex_unlock (& st -> lock );
178
181
179
182
return ret ;
180
183
}
@@ -185,14 +188,14 @@ static int ad5421_update_ctrl(struct iio_dev *indio_dev, unsigned int set,
185
188
struct ad5421_state * st = iio_priv (indio_dev );
186
189
unsigned int ret ;
187
190
188
- mutex_lock (& indio_dev -> mlock );
191
+ mutex_lock (& st -> lock );
189
192
190
193
st -> ctrl &= ~clr ;
191
194
st -> ctrl |= set ;
192
195
193
196
ret = ad5421_write_unlocked (indio_dev , AD5421_REG_CTRL , st -> ctrl );
194
197
195
- mutex_unlock (& indio_dev -> mlock );
198
+ mutex_unlock (& st -> lock );
196
199
197
200
return ret ;
198
201
}
@@ -400,12 +403,12 @@ static int ad5421_write_event_config(struct iio_dev *indio_dev,
400
403
return - EINVAL ;
401
404
}
402
405
403
- mutex_lock (& indio_dev -> mlock );
406
+ mutex_lock (& st -> lock );
404
407
if (state )
405
408
st -> fault_mask |= mask ;
406
409
else
407
410
st -> fault_mask &= ~mask ;
408
- mutex_unlock (& indio_dev -> mlock );
411
+ mutex_unlock (& st -> lock );
409
412
410
413
return 0 ;
411
414
}
@@ -491,6 +494,8 @@ static int ad5421_probe(struct spi_device *spi)
491
494
indio_dev -> channels = ad5421_channels ;
492
495
indio_dev -> num_channels = ARRAY_SIZE (ad5421_channels );
493
496
497
+ mutex_init (& st -> lock );
498
+
494
499
st -> ctrl = AD5421_CTRL_WATCHDOG_DISABLE |
495
500
AD5421_CTRL_AUTO_FAULT_READBACK ;
496
501
0 commit comments