staging: iio: ad7606: oversampling_ratio clean-up
Subsystems (4)
v3 cover staging: iio: ad7606: oversampling_ratio clean-up
Implement the oversampling_ratio attribute using standard global define as well as fix bug about incorrect setting of oversampling pins
Changes in v3:
* Add follow-up patch fixing bug about incorrect setting of oversampling pins
* Add Fixes tag
Changes in v2:
* Add Lars' Acked-by tag
* Update dev_err() to use proper arguments
Eva Rachel Retuya (2):
staging: iio: ad7606: implement IIO_CHAN_INFO_OVERSAMPLING_RATIO
staging: iio: ad7606: fix improper setting of oversampling pins
drivers/staging/iio/adc/ad7606_core.c | 67 ++++++++++++++++------------------- 1 file changed, 31 insertions(+), 36 deletions(-)
Signature · 1 line
2.7.4
PATCH v3 1/2 staging: iio: ad7606: implement IIO_CHAN_INFO_OVERSAMPLING_RATIO
This driver predates the availability of IIO_CHAN_INFO_OVERSAMPLING_RATIO 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_OVERSAMPLING_RATIO to implement the oversampling_ratio attribute instead of using IIO_DEVICE_ATTR() macro.
Move code from the functions associated with IIO_DEVICE_ATTR() into the read_raw hook as well as add the write_raw hook with both masks set to IIO_CHAN_INFO_OVERSAMPLING_RATIO.
--- drivers/staging/iio/adc/ad7606_core.c | 67 ++++++++++++++++------------------- 1 file changed, 31 insertions(+), 36 deletions(-)
drivers/staging/iio/adc/ad7606_core.c +31 -36
@@ -103,6 +103,9 @@ static int ad7606_read_raw(struct iio_dev *indio_dev, *val = st->range *2 ; *val2 = st->chip_info->channels[0 ].scan_type.realbits;return IIO_VAL_FRACTIONAL_LOG2 ; +case IIO_CHAN_INFO_OVERSAMPLING_RATIO : + *val = st->oversampling; +return IIO_VAL_INT ; }return -EINVAL ; }
@@ -145,16 +148,6 @@ static IIO_DEVICE_ATTR(in_voltage_range, S_IRUGO | S_IWUSR, ad7606_show_range, ad7606_store_range, 0); static IIO_CONST_ATTR(in_voltage_range_available, "5000 10000"); -static ssize_t ad7606_show_oversampling_ratio (struct device *dev, -struct device_attribute *attr, -char *buf) -{ -struct iio_dev *indio_dev =dev_to_iio_dev (dev); -struct ad7606_state *st =iio_priv (indio_dev); - -return sprintf (buf,"%u\n" , st->oversampling); -} -static int ad7606_oversampling_get_index (unsigned int val) {unsigned char supported[] = {0 ,2 ,4 ,8 ,16 ,32 ,64 };
@@ -167,44 +160,43 @@ static int ad7606_oversampling_get_index(unsigned int val)return -EINVAL ; } -static ssize_t ad7606_store_oversampling_ratio (struct device *dev, -struct device_attribute *attr, -const char *buf,size_t count) +static int ad7606_write_raw (struct iio_dev *indio_dev, +struct iio_chan_spec const *chan, +int val, +int val2, +long mask) { -struct iio_dev *indio_dev =dev_to_iio_dev (dev);struct ad7606_state *st =iio_priv (indio_dev); -unsigned long lval;int ret; - ret =kstrtoul (buf,10 , &lval); -if (ret) -return ret; +switch (mask) { +case IIO_CHAN_INFO_OVERSAMPLING_RATIO : +if (val2) +return -EINVAL ; + ret =ad7606_oversampling_get_index (val); +if (ret <0 ) { +dev_err (st->dev,"oversampling %d is not supported\n" , + val); +return ret; + } - ret =ad7606_oversampling_get_index (lval); -if (ret <0 ) { -dev_err (dev,"oversampling %lu is not supported\n" , lval); -return ret; +mutex_lock (&indio_dev->mlock); +gpio_set_value (st->pdata->gpio_os0, (ret >>0 ) &1 ); +gpio_set_value (st->pdata->gpio_os1, (ret >>1 ) &1 ); +gpio_set_value (st->pdata->gpio_os1, (ret >>2 ) &1 ); + st->oversampling = val; +mutex_unlock (&indio_dev->mlock); +return 0 ; +default : +return -EINVAL ; } - -mutex_lock (&indio_dev->mlock); -gpio_set_value (st->pdata->gpio_os0, (ret >>0 ) &1 ); -gpio_set_value (st->pdata->gpio_os1, (ret >>1 ) &1 ); -gpio_set_value (st->pdata->gpio_os1, (ret >>2 ) &1 ); - st->oversampling = lval; -mutex_unlock (&indio_dev->mlock); - -return count; } -static IIO_DEVICE_ATTR(oversampling_ratio, S_IRUGO | S_IWUSR, - ad7606_show_oversampling_ratio, - ad7606_store_oversampling_ratio, 0); static IIO_CONST_ATTR(oversampling_ratio_available, "0 2 4 8 16 32 64");static struct attribute *ad7606_attributes_os_and_range[] = { &iio_dev_attr_in_voltage_range.dev_attr.attr, &iio_const_attr_in_voltage_range_available.dev_attr.attr, - &iio_dev_attr_oversampling_ratio.dev_attr.attr, &iio_const_attr_oversampling_ratio_available.dev_attr.attr,NULL , };
@@ -214,7 +206,6 @@ static const struct attribute_group ad7606_attribute_group_os_and_range = { };static struct attribute *ad7606_attributes_os[] = { - &iio_dev_attr_oversampling_ratio.dev_attr.attr, &iio_const_attr_oversampling_ratio_available.dev_attr.attr,NULL , };
@@ -241,6 +232,8 @@ static const struct attribute_group ad7606_attribute_group_range = { .address = num, \ .info_mask_separate = BIT(IIO_CHAN_INFO_RAW), \ .info_mask_shared_by_type = BIT(IIO_CHAN_INFO_SCALE),\ + .info_mask_shared_by_all = \ + BIT(IIO_CHAN_INFO_OVERSAMPLING_RATIO), \ .scan_index = num, \ .scan_type = { \ .sign = 's', \
@@ -429,12 +422,14 @@ static const struct iio_info ad7606_info_no_os_or_range = {static const struct iio_info ad7606_info_os_and_range = { .driver_module =THIS_MODULE , .read_raw = &ad7606_read_raw, + .write_raw = &ad7606_write_raw, .attrs = &ad7606_attribute_group_os_and_range, };static const struct iio_info ad7606_info_os = { .driver_module =THIS_MODULE , .read_raw = &ad7606_read_raw, + .write_raw = &ad7606_write_raw, .attrs = &ad7606_attribute_group_os, };
Signature · 1 line
2.7.4
PATCH v3 2/2 staging: iio: ad7606: fix improper setting of oversampling pins
In reply to Eva Rachel RetuyaThe oversampling ratio is controlled using the oversampling pins, OS [2:0] with OS2 being the MSB control bit, and OS0 the LSB control bit.
The gpio connected to the OS2 pin is not being set correctly, only OS0 and OS1 pins are being set. Fix the typo to allow proper control of the oversampling pins.
--- drivers/staging/iio/adc/ad7606_core.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/staging/iio/adc/ad7606_core.c +1 -1
@@ -183,7 +183,7 @@ static int ad7606_write_raw(struct iio_dev *indio_dev,mutex_lock (&indio_dev->mlock);gpio_set_value (st->pdata->gpio_os0, (ret >>0 ) &1 );gpio_set_value (st->pdata->gpio_os1, (ret >>1 ) &1 ); -gpio_set_value (st->pdata->gpio_os1, (ret >>2 ) &1 ); +gpio_set_value (st->pdata->gpio_os2, (ret >>2 ) &1 ); st->oversampling = val;mutex_unlock (&indio_dev->mlock);return 0 ;
Signature · 1 line
2.7.4
Re: [PATCH v3 2/2] staging: iio: ad7606: fix improper setting of oversampling pins
Quoted 10 lines · Eva Rachel Retuya
The oversampling ratio is controlled using the oversampling pins, OS [2:0] with OS2 being the MSB control bit, and OS0 the LSB control bit.
The gpio connected to the OS2 pin is not being set correctly, only OS0 and OS1 pins are being set. Fix the typo to allow proper control of the oversampling pins.
Signed-off-by Eva Rachel Retuya <[email protected]>Fixes b9618c0 ("staging: IIO: ADC: New driver for AD7606/AD7606-6/AD7606-4")
Looks good, thanks.
Ideally you'd have but the patches in the opposite order, fix first, then rework. As it is right now with the fix after the rework the fix no longer applies cleanly to older versions.
Quoted 18 lines
--- drivers/staging/iio/adc/ad7606_core.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)drivers/staging/iio/adc/ad7606_core.c +1
-1@@ -183,7 +183,7 @@ static int ad7606_write_raw(struct iio_dev *indio_dev,mutex_lock (&indio_dev->mlock);gpio_set_value (st->pdata->gpio_os0, (ret >>0 ) &1 );gpio_set_value (st->pdata->gpio_os1, (ret >>1 ) &1 ); -gpio_set_value (st->pdata->gpio_os1, (ret >>2 ) &1 ); +gpio_set_value (st->pdata->gpio_os2, (ret >>2 ) &1 ); st->oversampling = val;mutex_unlock (&indio_dev->mlock);return 0 ;
Greg KH
maintainerRe: [Outreachy kernel] Re: [PATCH v3 2/2] staging: iio: ad7606: fix improper setting of oversampling pins
Quoted 12 lines · Lars-Peter Clausen
Quoted 10 lines · Eva Rachel Retuya
The oversampling ratio is controlled using the oversampling pins, OS [2:0] with OS2 being the MSB control bit, and OS0 the LSB control bit.
The gpio connected to the OS2 pin is not being set correctly, only OS0 and OS1 pins are being set. Fix the typo to allow proper control of the oversampling pins.
Signed-off-by Eva Rachel Retuya <[email protected]>Fixes b9618c0 ("staging: IIO: ADC: New driver for AD7606/AD7606-6/AD7606-4")
Quoted 7 lines
Looks good, thanks.
Ideally you'd have but the patches in the opposite order, fix first, then rework. As it is right now with the fix after the rework the fix no longer applies cleanly to older versions.
Yes, please do that, so it can be applied to older kernels properly.
thanks,
greg k-h
Re: [Outreachy kernel] Re: [PATCH v3 2/2] staging: iio: ad7606: fix improper setting of oversampling pins
Quoted 21 lines · Greg KH
Quoted 12 lines · Lars-Peter Clausen
Quoted 10 lines · Eva Rachel Retuya
The oversampling ratio is controlled using the oversampling pins, OS [2:0] with OS2 being the MSB control bit, and OS0 the LSB control bit.
The gpio connected to the OS2 pin is not being set correctly, only OS0 and OS1 pins are being set. Fix the typo to allow proper control of the oversampling pins.
Signed-off-by Eva Rachel Retuya <[email protected]>Fixes b9618c0 ("staging: IIO: ADC: New driver for AD7606/AD7606-6/AD7606-4")Quoted 7 lines
Looks good, thanks.
Ideally you'd have but the patches in the opposite order, fix first, then rework. As it is right now with the fix after the rework the fix no longer applies cleanly to older versions.
Quoted 5 lines
Yes, please do that, so it can be applied to older kernels properly.
thanks,
greg k-h
Lars and Greg:
Thanks for the feedback. I got the v4 accepted using the proper order, fix first then rework as suggested.
Eva