staging: iio: ad7606: oversampling_ratio clean-up
Subsystems (4)
v4 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 v4:
* Reverse the order of patches: fix first followed by rework
* Add Lars' Acked-by tag for the bug fix
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: fix improper setting of oversampling pins
staging: iio: ad7606: implement IIO_CHAN_INFO_OVERSAMPLING_RATIO
drivers/staging/iio/adc/ad7606_core.c | 67 ++++++++++++++++------------------- 1 file changed, 31 insertions(+), 36 deletions(-)
Signature · 1 line
2.7.4
PATCH v4 1/2 staging: iio: ad7606: fix improper setting of oversampling pins
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.
--- drivers/staging/iio/adc/ad7606_core.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/staging/iio/adc/ad7606_core.c +1 -1
@@ -189,7 +189,7 @@ static ssize_t ad7606_store_oversampling_ratio(struct device *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 = lval;mutex_unlock (&indio_dev->mlock);
Signature · 1 line
2.7.4
Jonathan Cameron
maintainerRe: [PATCH v4 1/2] staging: iio: ad7606: fix improper setting of oversampling pins
Quoted 11 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")
I've applied this to the togreg branch of iio.git, but not currently marked it for stable. Primarily because it has been broken for a very long time. If anyone wants this in stable, then feel free to shout out and we can send the request to stable once it has merged.
Applied to the togreg branch and pushed out as testing for the autobuilders to play with it.
Thanks,
Jonathan
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@@ -189,7 +189,7 @@ static ssize_t ad7606_store_oversampling_ratio(struct device *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 = lval;mutex_unlock (&indio_dev->mlock);
PATCH v4 2/2 staging: iio: ad7606: implement IIO_CHAN_INFO_OVERSAMPLING_RATIO
In reply to Eva Rachel RetuyaThis 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_os2, (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_os2, (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
Jonathan Cameron
maintainerRe: [PATCH v4 2/2] staging: iio: ad7606: implement IIO_CHAN_INFO_OVERSAMPLING_RATIO
Quoted 7 lines · Eva Rachel Retuya
This driver predates the availability of
IIO_CHAN_INFO_OVERSAMPLING_RATIOattribute 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_RATIOto implement theoversampling_ratioattribute instead of usingIIO_DEVICE_ATTR()macro.
Quoted 6 lines
Move code from the functions associated with
IIO_DEVICE_ATTR()into theread_rawhook as well as add thewrite_rawhook with both masks set toIIO_CHAN_INFO_OVERSAMPLING_RATIO.Signed-off-by Eva Rachel Retuya <[email protected]>
Applied to the togreg branch of iio.git and pushed out as testing for the autobuilders to play with it.
Thanks,
Jonathan
Quoted 137 lines
--- 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_os2, (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_os2, (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, };