Skip to content

Commit 2296c06

Browse files
eraretuyajic23
authored andcommitted
staging: iio: cdc: ad7746: implement IIO_CHAN_INFO_SAMP_FREQ
This driver predates the availability of IIO_CHAN_INFO_SAMP_FREQ attribute wherein usage has some advantages like it can be accessed by in-kernel consumers as well as reduces the code size. Therefore, use IIO_CHAN_INFO_SAMP_FREQ to implement the sampling_frequency attribute instead of using IIO_DEVICE_ATTR() macro. Move code from the functions associated with IIO_DEVICE_ATTR() into respective read and write hooks with the mask set to IIO_CHAN_INFO_SAMP_FREQ. Signed-off-by: Eva Rachel Retuya <[email protected]> Signed-off-by: Jonathan Cameron <[email protected]>
1 parent 6572389 commit 2296c06

File tree

1 file changed

+50
-70
lines changed

1 file changed

+50
-70
lines changed

drivers/staging/iio/cdc/ad7746.c

Lines changed: 50 additions & 70 deletions
Original file line numberDiff line numberDiff line change
@@ -122,7 +122,8 @@ static const struct iio_chan_spec ad7746_channels[] = {
122122
.indexed = 1,
123123
.channel = 0,
124124
.info_mask_separate = BIT(IIO_CHAN_INFO_RAW),
125-
.info_mask_shared_by_type = BIT(IIO_CHAN_INFO_SCALE),
125+
.info_mask_shared_by_type = BIT(IIO_CHAN_INFO_SCALE) |
126+
BIT(IIO_CHAN_INFO_SAMP_FREQ),
126127
.address = AD7746_REG_VT_DATA_HIGH << 8 |
127128
AD7746_VTSETUP_VTMD_EXT_VIN,
128129
},
@@ -132,7 +133,8 @@ static const struct iio_chan_spec ad7746_channels[] = {
132133
.channel = 1,
133134
.extend_name = "supply",
134135
.info_mask_separate = BIT(IIO_CHAN_INFO_RAW),
135-
.info_mask_shared_by_type = BIT(IIO_CHAN_INFO_SCALE),
136+
.info_mask_shared_by_type = BIT(IIO_CHAN_INFO_SCALE) |
137+
BIT(IIO_CHAN_INFO_SAMP_FREQ),
136138
.address = AD7746_REG_VT_DATA_HIGH << 8 |
137139
AD7746_VTSETUP_VTMD_VDD_MON,
138140
},
@@ -159,7 +161,7 @@ static const struct iio_chan_spec ad7746_channels[] = {
159161
.info_mask_separate = BIT(IIO_CHAN_INFO_RAW) |
160162
BIT(IIO_CHAN_INFO_CALIBSCALE) | BIT(IIO_CHAN_INFO_OFFSET),
161163
.info_mask_shared_by_type = BIT(IIO_CHAN_INFO_CALIBBIAS) |
162-
BIT(IIO_CHAN_INFO_SCALE),
164+
BIT(IIO_CHAN_INFO_SCALE) | BIT(IIO_CHAN_INFO_SAMP_FREQ),
163165
.address = AD7746_REG_CAP_DATA_HIGH << 8,
164166
},
165167
[CIN1_DIFF] = {
@@ -171,7 +173,7 @@ static const struct iio_chan_spec ad7746_channels[] = {
171173
.info_mask_separate = BIT(IIO_CHAN_INFO_RAW) |
172174
BIT(IIO_CHAN_INFO_CALIBSCALE) | BIT(IIO_CHAN_INFO_OFFSET),
173175
.info_mask_shared_by_type = BIT(IIO_CHAN_INFO_CALIBBIAS) |
174-
BIT(IIO_CHAN_INFO_SCALE),
176+
BIT(IIO_CHAN_INFO_SCALE) | BIT(IIO_CHAN_INFO_SAMP_FREQ),
175177
.address = AD7746_REG_CAP_DATA_HIGH << 8 |
176178
AD7746_CAPSETUP_CAPDIFF
177179
},
@@ -182,7 +184,7 @@ static const struct iio_chan_spec ad7746_channels[] = {
182184
.info_mask_separate = BIT(IIO_CHAN_INFO_RAW) |
183185
BIT(IIO_CHAN_INFO_CALIBSCALE) | BIT(IIO_CHAN_INFO_OFFSET),
184186
.info_mask_shared_by_type = BIT(IIO_CHAN_INFO_CALIBBIAS) |
185-
BIT(IIO_CHAN_INFO_SCALE),
187+
BIT(IIO_CHAN_INFO_SCALE) | BIT(IIO_CHAN_INFO_SAMP_FREQ),
186188
.address = AD7746_REG_CAP_DATA_HIGH << 8 |
187189
AD7746_CAPSETUP_CIN2,
188190
},
@@ -195,7 +197,7 @@ static const struct iio_chan_spec ad7746_channels[] = {
195197
.info_mask_separate = BIT(IIO_CHAN_INFO_RAW) |
196198
BIT(IIO_CHAN_INFO_CALIBSCALE) | BIT(IIO_CHAN_INFO_OFFSET),
197199
.info_mask_shared_by_type = BIT(IIO_CHAN_INFO_CALIBBIAS) |
198-
BIT(IIO_CHAN_INFO_SCALE),
200+
BIT(IIO_CHAN_INFO_SCALE) | BIT(IIO_CHAN_INFO_SAMP_FREQ),
199201
.address = AD7746_REG_CAP_DATA_HIGH << 8 |
200202
AD7746_CAPSETUP_CAPDIFF | AD7746_CAPSETUP_CIN2,
201203
}
@@ -355,101 +357,47 @@ static IIO_DEVICE_ATTR(in_capacitance1_calibscale_calibration,
355357
static IIO_DEVICE_ATTR(in_voltage0_calibscale_calibration,
356358
S_IWUSR, NULL, ad7746_start_gain_calib, VIN);
357359

358-
static ssize_t ad7746_show_cap_filter_rate_setup(struct device *dev,
359-
struct device_attribute *attr,
360-
char *buf)
360+
static int ad7746_store_cap_filter_rate_setup(struct ad7746_chip_info *chip,
361+
int val)
361362
{
362-
struct iio_dev *indio_dev = dev_to_iio_dev(dev);
363-
struct ad7746_chip_info *chip = iio_priv(indio_dev);
364-
365-
return sprintf(buf, "%d\n", ad7746_cap_filter_rate_table[
366-
(chip->config >> 3) & 0x7][0]);
367-
}
368-
369-
static ssize_t ad7746_store_cap_filter_rate_setup(struct device *dev,
370-
struct device_attribute *attr,
371-
const char *buf,
372-
size_t len)
373-
{
374-
struct iio_dev *indio_dev = dev_to_iio_dev(dev);
375-
struct ad7746_chip_info *chip = iio_priv(indio_dev);
376-
u8 data;
377-
int ret, i;
378-
379-
ret = kstrtou8(buf, 10, &data);
380-
if (ret < 0)
381-
return ret;
363+
int i;
382364

383365
for (i = 0; i < ARRAY_SIZE(ad7746_cap_filter_rate_table); i++)
384-
if (data >= ad7746_cap_filter_rate_table[i][0])
366+
if (val >= ad7746_cap_filter_rate_table[i][0])
385367
break;
386368

387369
if (i >= ARRAY_SIZE(ad7746_cap_filter_rate_table))
388370
i = ARRAY_SIZE(ad7746_cap_filter_rate_table) - 1;
389371

390-
mutex_lock(&indio_dev->mlock);
391372
chip->config &= ~AD7746_CONF_CAPFS(0x7);
392373
chip->config |= AD7746_CONF_CAPFS(i);
393-
mutex_unlock(&indio_dev->mlock);
394374

395-
return len;
375+
return 0;
396376
}
397377

398-
static ssize_t ad7746_show_vt_filter_rate_setup(struct device *dev,
399-
struct device_attribute *attr,
400-
char *buf)
378+
static int ad7746_store_vt_filter_rate_setup(struct ad7746_chip_info *chip,
379+
int val)
401380
{
402-
struct iio_dev *indio_dev = dev_to_iio_dev(dev);
403-
struct ad7746_chip_info *chip = iio_priv(indio_dev);
404-
405-
return sprintf(buf, "%d\n", ad7746_vt_filter_rate_table[
406-
(chip->config >> 6) & 0x3][0]);
407-
}
408-
409-
static ssize_t ad7746_store_vt_filter_rate_setup(struct device *dev,
410-
struct device_attribute *attr,
411-
const char *buf,
412-
size_t len)
413-
{
414-
struct iio_dev *indio_dev = dev_to_iio_dev(dev);
415-
struct ad7746_chip_info *chip = iio_priv(indio_dev);
416-
u8 data;
417-
int ret, i;
418-
419-
ret = kstrtou8(buf, 10, &data);
420-
if (ret < 0)
421-
return ret;
381+
int i;
422382

423383
for (i = 0; i < ARRAY_SIZE(ad7746_vt_filter_rate_table); i++)
424-
if (data >= ad7746_vt_filter_rate_table[i][0])
384+
if (val >= ad7746_vt_filter_rate_table[i][0])
425385
break;
426386

427387
if (i >= ARRAY_SIZE(ad7746_vt_filter_rate_table))
428388
i = ARRAY_SIZE(ad7746_vt_filter_rate_table) - 1;
429389

430-
mutex_lock(&indio_dev->mlock);
431390
chip->config &= ~AD7746_CONF_VTFS(0x3);
432391
chip->config |= AD7746_CONF_VTFS(i);
433-
mutex_unlock(&indio_dev->mlock);
434392

435-
return len;
393+
return 0;
436394
}
437395

438-
static IIO_DEVICE_ATTR(in_capacitance_sampling_frequency,
439-
S_IRUGO | S_IWUSR, ad7746_show_cap_filter_rate_setup,
440-
ad7746_store_cap_filter_rate_setup, 0);
441-
442-
static IIO_DEVICE_ATTR(in_voltage_sampling_frequency,
443-
S_IRUGO | S_IWUSR, ad7746_show_vt_filter_rate_setup,
444-
ad7746_store_vt_filter_rate_setup, 0);
445-
446396
static IIO_CONST_ATTR(in_voltage_sampling_frequency_available, "50 31 16 8");
447397
static IIO_CONST_ATTR(in_capacitance_sampling_frequency_available,
448398
"91 84 50 26 16 13 11 9");
449399

450400
static struct attribute *ad7746_attributes[] = {
451-
&iio_dev_attr_in_capacitance_sampling_frequency.dev_attr.attr,
452-
&iio_dev_attr_in_voltage_sampling_frequency.dev_attr.attr,
453401
&iio_dev_attr_in_capacitance0_calibbias_calibration.dev_attr.attr,
454402
&iio_dev_attr_in_capacitance0_calibscale_calibration.dev_attr.attr,
455403
&iio_dev_attr_in_capacitance1_calibscale_calibration.dev_attr.attr,
@@ -547,6 +495,23 @@ static int ad7746_write_raw(struct iio_dev *indio_dev,
547495

548496
ret = 0;
549497
break;
498+
case IIO_CHAN_INFO_SAMP_FREQ:
499+
if (val2) {
500+
ret = -EINVAL;
501+
goto out;
502+
}
503+
504+
switch (chan->type) {
505+
case IIO_CAPACITANCE:
506+
ret = ad7746_store_cap_filter_rate_setup(chip, val);
507+
break;
508+
case IIO_VOLTAGE:
509+
ret = ad7746_store_vt_filter_rate_setup(chip, val);
510+
break;
511+
default:
512+
ret = -EINVAL;
513+
}
514+
break;
550515
default:
551516
ret = -EINVAL;
552517
}
@@ -666,6 +631,21 @@ static int ad7746_read_raw(struct iio_dev *indio_dev,
666631
break;
667632
}
668633

634+
break;
635+
case IIO_CHAN_INFO_SAMP_FREQ:
636+
switch (chan->type) {
637+
case IIO_CAPACITANCE:
638+
*val = ad7746_cap_filter_rate_table[
639+
(chip->config >> 3) & 0x7][0];
640+
ret = IIO_VAL_INT;
641+
break;
642+
case IIO_VOLTAGE:
643+
*val = ad7746_vt_filter_rate_table[
644+
(chip->config >> 6) & 0x3][0];
645+
break;
646+
default:
647+
ret = -EINVAL;
648+
}
669649
break;
670650
default:
671651
ret = -EINVAL;

0 commit comments

Comments
 (0)