@@ -167,63 +167,12 @@ static const unsigned char ad7152_filter_rate_table[][2] = {
167
167
{200 , 5 + 1 }, {50 , 20 + 1 }, {20 , 50 + 1 }, {17 , 60 + 1 },
168
168
};
169
169
170
- static ssize_t ad7152_show_filter_rate_setup (struct device * dev ,
171
- struct device_attribute * attr ,
172
- char * buf )
173
- {
174
- struct iio_dev * indio_dev = dev_to_iio_dev (dev );
175
- struct ad7152_chip_info * chip = iio_priv (indio_dev );
176
-
177
- return sprintf (buf , "%d\n" ,
178
- ad7152_filter_rate_table [chip -> filter_rate_setup ][0 ]);
179
- }
180
-
181
- static ssize_t ad7152_store_filter_rate_setup (struct device * dev ,
182
- struct device_attribute * attr ,
183
- const char * buf ,
184
- size_t len )
185
- {
186
- struct iio_dev * indio_dev = dev_to_iio_dev (dev );
187
- struct ad7152_chip_info * chip = iio_priv (indio_dev );
188
- u8 data ;
189
- int ret , i ;
190
-
191
- ret = kstrtou8 (buf , 10 , & data );
192
- if (ret < 0 )
193
- return ret ;
194
-
195
- for (i = 0 ; i < ARRAY_SIZE (ad7152_filter_rate_table ); i ++ )
196
- if (data >= ad7152_filter_rate_table [i ][0 ])
197
- break ;
198
-
199
- if (i >= ARRAY_SIZE (ad7152_filter_rate_table ))
200
- i = ARRAY_SIZE (ad7152_filter_rate_table ) - 1 ;
201
-
202
- mutex_lock (& indio_dev -> mlock );
203
- ret = i2c_smbus_write_byte_data (chip -> client ,
204
- AD7152_REG_CFG2 , AD7152_CFG2_OSR (i ));
205
- if (ret < 0 ) {
206
- mutex_unlock (& indio_dev -> mlock );
207
- return ret ;
208
- }
209
-
210
- chip -> filter_rate_setup = i ;
211
- mutex_unlock (& indio_dev -> mlock );
212
-
213
- return len ;
214
- }
215
-
216
- static IIO_DEV_ATTR_SAMP_FREQ (S_IRUGO | S_IWUSR ,
217
- ad7152_show_filter_rate_setup ,
218
- ad7152_store_filter_rate_setup ) ;
219
-
220
170
static IIO_CONST_ATTR_SAMP_FREQ_AVAIL ("200 50 20 17" );
221
171
222
172
static IIO_CONST_ATTR (in_capacitance_scale_available ,
223
173
"0.000061050 0.000030525 0.000015263 0.000007631" );
224
174
225
175
static struct attribute * ad7152_attributes [] = {
226
- & iio_dev_attr_sampling_frequency .dev_attr .attr ,
227
176
& iio_dev_attr_in_capacitance0_calibbias_calibration .dev_attr .attr ,
228
177
& iio_dev_attr_in_capacitance1_calibbias_calibration .dev_attr .attr ,
229
178
& iio_dev_attr_in_capacitance0_calibscale_calibration .dev_attr .attr ,
@@ -249,6 +198,51 @@ static const int ad7152_scale_table[] = {
249
198
30525 , 7631 , 15263 , 61050
250
199
};
251
200
201
+ /**
202
+ * read_raw handler for IIO_CHAN_INFO_SAMP_FREQ
203
+ *
204
+ * lock must be held
205
+ **/
206
+ static int ad7152_read_raw_samp_freq (struct device * dev , int * val )
207
+ {
208
+ struct ad7152_chip_info * chip = iio_priv (dev_to_iio_dev (dev ));
209
+
210
+ * val = ad7152_filter_rate_table [chip -> filter_rate_setup ][0 ];
211
+
212
+ return 0 ;
213
+ }
214
+
215
+ /**
216
+ * write_raw handler for IIO_CHAN_INFO_SAMP_FREQ
217
+ *
218
+ * lock must be held
219
+ **/
220
+ static int ad7152_write_raw_samp_freq (struct device * dev , int val )
221
+ {
222
+ struct iio_dev * indio_dev = dev_to_iio_dev (dev );
223
+ struct ad7152_chip_info * chip = iio_priv (indio_dev );
224
+ int ret , i ;
225
+
226
+ for (i = 0 ; i < ARRAY_SIZE (ad7152_filter_rate_table ); i ++ )
227
+ if (val >= ad7152_filter_rate_table [i ][0 ])
228
+ break ;
229
+
230
+ if (i >= ARRAY_SIZE (ad7152_filter_rate_table ))
231
+ i = ARRAY_SIZE (ad7152_filter_rate_table ) - 1 ;
232
+
233
+ mutex_lock (& indio_dev -> mlock );
234
+ ret = i2c_smbus_write_byte_data (chip -> client ,
235
+ AD7152_REG_CFG2 , AD7152_CFG2_OSR (i ));
236
+ if (ret < 0 ) {
237
+ mutex_unlock (& indio_dev -> mlock );
238
+ return ret ;
239
+ }
240
+
241
+ chip -> filter_rate_setup = i ;
242
+ mutex_unlock (& indio_dev -> mlock );
243
+
244
+ return ret ;
245
+ }
252
246
static int ad7152_write_raw (struct iio_dev * indio_dev ,
253
247
struct iio_chan_spec const * chan ,
254
248
int val ,
@@ -309,6 +303,17 @@ static int ad7152_write_raw(struct iio_dev *indio_dev,
309
303
if (ret < 0 )
310
304
goto out ;
311
305
306
+ ret = 0 ;
307
+ break ;
308
+ case IIO_CHAN_INFO_SAMP_FREQ :
309
+ if (val2 ) {
310
+ ret = - EINVAL ;
311
+ goto out ;
312
+ }
313
+ ret = ad7152_write_raw_samp_freq (& indio_dev -> dev , val );
314
+ if (ret < 0 )
315
+ goto out ;
316
+
312
317
ret = 0 ;
313
318
break ;
314
319
default :
@@ -406,6 +411,13 @@ static int ad7152_read_raw(struct iio_dev *indio_dev,
406
411
407
412
ret = IIO_VAL_INT_PLUS_NANO ;
408
413
break ;
414
+ case IIO_CHAN_INFO_SAMP_FREQ :
415
+ ret = ad7152_read_raw_samp_freq (& indio_dev -> dev , val );
416
+ if (ret < 0 )
417
+ goto out ;
418
+
419
+ ret = IIO_VAL_INT ;
420
+ break ;
409
421
default :
410
422
ret = - EINVAL ;
411
423
}
@@ -443,6 +455,7 @@ static const struct iio_chan_spec ad7152_channels[] = {
443
455
BIT (IIO_CHAN_INFO_CALIBSCALE ) |
444
456
BIT (IIO_CHAN_INFO_CALIBBIAS ) |
445
457
BIT (IIO_CHAN_INFO_SCALE ),
458
+ .info_mask_shared_by_all = BIT (IIO_CHAN_INFO_SAMP_FREQ ),
446
459
}, {
447
460
.type = IIO_CAPACITANCE ,
448
461
.differential = 1 ,
@@ -453,6 +466,7 @@ static const struct iio_chan_spec ad7152_channels[] = {
453
466
BIT (IIO_CHAN_INFO_CALIBSCALE ) |
454
467
BIT (IIO_CHAN_INFO_CALIBBIAS ) |
455
468
BIT (IIO_CHAN_INFO_SCALE ),
469
+ .info_mask_shared_by_all = BIT (IIO_CHAN_INFO_SAMP_FREQ ),
456
470
}, {
457
471
.type = IIO_CAPACITANCE ,
458
472
.indexed = 1 ,
@@ -461,6 +475,7 @@ static const struct iio_chan_spec ad7152_channels[] = {
461
475
BIT (IIO_CHAN_INFO_CALIBSCALE ) |
462
476
BIT (IIO_CHAN_INFO_CALIBBIAS ) |
463
477
BIT (IIO_CHAN_INFO_SCALE ),
478
+ .info_mask_shared_by_all = BIT (IIO_CHAN_INFO_SAMP_FREQ ),
464
479
}, {
465
480
.type = IIO_CAPACITANCE ,
466
481
.differential = 1 ,
@@ -471,6 +486,7 @@ static const struct iio_chan_spec ad7152_channels[] = {
471
486
BIT (IIO_CHAN_INFO_CALIBSCALE ) |
472
487
BIT (IIO_CHAN_INFO_CALIBBIAS ) |
473
488
BIT (IIO_CHAN_INFO_SCALE ),
489
+ .info_mask_shared_by_all = BIT (IIO_CHAN_INFO_SAMP_FREQ ),
474
490
}
475
491
};
476
492
0 commit comments