Skip to content

Commit 6572389

Browse files
Sayli-Karnikjic23
authored andcommitted
staging: iio: cdc: ad7152: Implement IIO_CHAN_INFO_SAMP_FREQ attribute
Attributes that were once privately defined become standard with time and hence a special global define is used. Hence update driver ad7152 to use IIO_CHAN_INFO_SAMP_FREQ which is a global define instead of IIO_DEV_ATTR_SAMP_FREQ. Move functionality from IIO_DEV_ATTR_SAMP_FREQ attribute into IIO_CHAN_INFO_SAMP_FREQ to implement the sampling_frequency attribute. Modify ad7152_read_raw() and ad7152_write_raw() to allow reading and writing the element as well. Also add a lock in the driver's private data. Signed-off-by: sayli karnik <[email protected]> Signed-off-by: Jonathan Cameron <[email protected]>
1 parent e748e28 commit 6572389

File tree

1 file changed

+67
-51
lines changed

1 file changed

+67
-51
lines changed

drivers/staging/iio/cdc/ad7152.c

Lines changed: 67 additions & 51 deletions
Original file line numberDiff line numberDiff line change
@@ -167,63 +167,12 @@ static const unsigned char ad7152_filter_rate_table[][2] = {
167167
{200, 5 + 1}, {50, 20 + 1}, {20, 50 + 1}, {17, 60 + 1},
168168
};
169169

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-
220170
static IIO_CONST_ATTR_SAMP_FREQ_AVAIL("200 50 20 17");
221171

222172
static IIO_CONST_ATTR(in_capacitance_scale_available,
223173
"0.000061050 0.000030525 0.000015263 0.000007631");
224174

225175
static struct attribute *ad7152_attributes[] = {
226-
&iio_dev_attr_sampling_frequency.dev_attr.attr,
227176
&iio_dev_attr_in_capacitance0_calibbias_calibration.dev_attr.attr,
228177
&iio_dev_attr_in_capacitance1_calibbias_calibration.dev_attr.attr,
229178
&iio_dev_attr_in_capacitance0_calibscale_calibration.dev_attr.attr,
@@ -249,6 +198,51 @@ static const int ad7152_scale_table[] = {
249198
30525, 7631, 15263, 61050
250199
};
251200

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+
}
252246
static int ad7152_write_raw(struct iio_dev *indio_dev,
253247
struct iio_chan_spec const *chan,
254248
int val,
@@ -309,6 +303,17 @@ static int ad7152_write_raw(struct iio_dev *indio_dev,
309303
if (ret < 0)
310304
goto out;
311305

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+
312317
ret = 0;
313318
break;
314319
default:
@@ -406,6 +411,13 @@ static int ad7152_read_raw(struct iio_dev *indio_dev,
406411

407412
ret = IIO_VAL_INT_PLUS_NANO;
408413
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;
409421
default:
410422
ret = -EINVAL;
411423
}
@@ -443,6 +455,7 @@ static const struct iio_chan_spec ad7152_channels[] = {
443455
BIT(IIO_CHAN_INFO_CALIBSCALE) |
444456
BIT(IIO_CHAN_INFO_CALIBBIAS) |
445457
BIT(IIO_CHAN_INFO_SCALE),
458+
.info_mask_shared_by_all = BIT(IIO_CHAN_INFO_SAMP_FREQ),
446459
}, {
447460
.type = IIO_CAPACITANCE,
448461
.differential = 1,
@@ -453,6 +466,7 @@ static const struct iio_chan_spec ad7152_channels[] = {
453466
BIT(IIO_CHAN_INFO_CALIBSCALE) |
454467
BIT(IIO_CHAN_INFO_CALIBBIAS) |
455468
BIT(IIO_CHAN_INFO_SCALE),
469+
.info_mask_shared_by_all = BIT(IIO_CHAN_INFO_SAMP_FREQ),
456470
}, {
457471
.type = IIO_CAPACITANCE,
458472
.indexed = 1,
@@ -461,6 +475,7 @@ static const struct iio_chan_spec ad7152_channels[] = {
461475
BIT(IIO_CHAN_INFO_CALIBSCALE) |
462476
BIT(IIO_CHAN_INFO_CALIBBIAS) |
463477
BIT(IIO_CHAN_INFO_SCALE),
478+
.info_mask_shared_by_all = BIT(IIO_CHAN_INFO_SAMP_FREQ),
464479
}, {
465480
.type = IIO_CAPACITANCE,
466481
.differential = 1,
@@ -471,6 +486,7 @@ static const struct iio_chan_spec ad7152_channels[] = {
471486
BIT(IIO_CHAN_INFO_CALIBSCALE) |
472487
BIT(IIO_CHAN_INFO_CALIBBIAS) |
473488
BIT(IIO_CHAN_INFO_SCALE),
489+
.info_mask_shared_by_all = BIT(IIO_CHAN_INFO_SAMP_FREQ),
474490
}
475491
};
476492

0 commit comments

Comments
 (0)