iio: ad7793: implement IIO_CHAN_INFO_SAMP_FREQ
Subsystems (2)
PATCH v3 1/1 iio: ad7793: implement IIO_CHAN_INFO_SAMP_FREQ
This commit is a follow-up to changes made to ad_sigma_delta.h in staging: iio: ad7192: implement IIO_CHAN_INFO_SAMP_FREQ which broke ad7793 as it was not altered to match those changes.
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_DEV_ATTR_SAMP_FREQ() macro.
Move code from the functions associated with IIO_DEV_ATTR_SAMP_FREQ() into respective read and write hooks with the mask set to IIO_CHAN_INFO_SAMP_FREQ.
---
Changes in v3:
- Resend using git send-email
drivers/iio/adc/ad7793.c | 74 +++++++++++++++--------------------------------- 1 file changed, 23 insertions(+), 51 deletions(-)
drivers/iio/adc/ad7793.c +23 -51
@@ -348,55 +348,6 @@ static const u16 ad7793_sample_freq_avail[16] = {0, 470, 242, 123, 62, 50, 39,static const u16 ad7797_sample_freq_avail[16 ] = {0 ,0 ,0 ,123 ,62 ,50 ,0 ,33 ,0 ,17 ,16 ,12 ,10 ,8 ,6 ,4 }; -static ssize_t ad7793_read_frequency (struct device *dev, -struct device_attribute *attr, -char *buf) -{ -struct iio_dev *indio_dev =dev_to_iio_dev (dev); -struct ad7793_state *st =iio_priv (indio_dev); - -return sprintf (buf,"%d\n" , - st->chip_info->sample_freq_avail[AD7793_MODE_RATE (st->mode)]); -} - -static ssize_t ad7793_write_frequency (struct device *dev, -struct device_attribute *attr, -const char *buf, -size_t len) -{ -struct iio_dev *indio_dev =dev_to_iio_dev (dev); -struct ad7793_state *st =iio_priv (indio_dev); -long lval; -int i, ret; - - ret =kstrtol (buf,10 , &lval); -if (ret) -return ret; - -if (lval ==0 ) -return -EINVAL ; - -for (i =0 ; i <16 ; i++) -if (lval == st->chip_info->sample_freq_avail[i]) -break ; -if (i ==16 ) -return -EINVAL ; - - ret =iio_device_claim_direct_mode (indio_dev); -if (ret) -return ret; - st->mode &= ~AD7793_MODE_RATE (-1 ); - st->mode |=AD7793_MODE_RATE (i); -ad_sd_write_reg (&st->sd,AD7793_REG_MODE ,sizeof (st->mode), st->mode); -iio_device_release_direct_mode (indio_dev); - -return len; -} - -static IIO_DEV_ATTR_SAMP_FREQ(S_IWUSR | S_IRUGO, - ad7793_read_frequency, - ad7793_write_frequency); - static IIO_CONST_ATTR_SAMP_FREQ_AVAIL( "470 242 123 62 50 39 33 19 17 16 12 10 8 6 4");
@@ -424,7 +375,6 @@ static IIO_DEVICE_ATTR_NAMED(in_m_in_scale_available, ad7793_show_scale_available, NULL, 0);static struct attribute *ad7793_attributes[] = { - &iio_dev_attr_sampling_frequency.dev_attr.attr, &iio_const_attr_sampling_frequency_available.dev_attr.attr, &iio_dev_attr_in_m_in_scale_available.dev_attr.attr,NULL
@@ -435,7 +385,6 @@ static const struct attribute_group ad7793_attribute_group = { };static struct attribute *ad7797_attributes[] = { - &iio_dev_attr_sampling_frequency.dev_attr.attr, &iio_const_attr_sampling_frequency_available_ad7797.dev_attr.attr,NULL };
@@ -505,6 +454,9 @@ static int ad7793_read_raw(struct iio_dev *indio_dev, *val -= offset; }return IIO_VAL_INT ; +case IIO_CHAN_INFO_SAMP_FREQ : + *val = st->chip_info->sample_freq_avail[AD7793_MODE_RATE (st->mode)]; +return IIO_VAL_INT ; }return -EINVAL ; }
@@ -542,6 +494,26 @@ static int ad7793_write_raw(struct iio_dev *indio_dev,break ; }break ; +case IIO_CHAN_INFO_SAMP_FREQ : +if (!val) { + ret = -EINVAL ; +break ; + } + +for (i =0 ; i <16 ; i++) +if (val == st->chip_info->sample_freq_avail[i]) +break ; + +if (i ==16 ) { + ret = -EINVAL ; +break ; + } + + st->mode &= ~AD7793_MODE_RATE (-1 ); + st->mode |=AD7793_MODE_RATE (i); +ad_sd_write_reg (&st->sd,AD7793_REG_MODE ,sizeof (st->mode), st->mode); + ret =0 ; +break ;default : ret = -EINVAL ; }
Signature · 1 line
2.7.4
Quoted 12 lines · Michael Nosthoff
This commit is a follow-up to changes made to
ad_sigma_delta.hin staging: iio: ad7192: implementIIO_CHAN_INFO_SAMP_FREQwhich broke ad7793 as it was not altered to match those changes.This driver predates the availability of
IIO_CHAN_INFO_SAMP_FREQattribute 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_FREQto implement thesampling_frequencyattribute instead of usingIIO_DEV_ATTR_SAMP_FREQ()macro.
Quoted 5 lines
Move code from the functions associated with
IIO_DEV_ATTR_SAMP_FREQ()into respective read and write hooks with the mask set toIIO_CHAN_INFO_SAMP_FREQ.Signed-off-by Michael Nosthoff <[email protected]>
Looks like the fixes tag was dropped in v3. And the 'ret = 0' is back.
Please also make sure to send the patches to Jonathan Cameron <[email protected]>. He is the maintainer of the IIO subsystem and needs to pick up the patch.
Quoted 122 lines
---
Changes in v3:- Resend using git send-email
drivers/iio/adc/ad7793.c | 74 +++++++++++++++--------------------------------- 1 file changed, 23 insertions(+), 51 deletions(-)drivers/iio/adc/ad7793.c +23
-51@@ -348,55 +348,6 @@ static const u16 ad7793_sample_freq_avail[16] = {0, 470, 242, 123, 62, 50, 39,static const u16 ad7797_sample_freq_avail[16 ] = {0 ,0 ,0 ,123 ,62 ,50 ,0 ,33 ,0 ,17 ,16 ,12 ,10 ,8 ,6 ,4 }; -static ssize_t ad7793_read_frequency (struct device *dev, -struct device_attribute *attr, -char *buf) -{ -struct iio_dev *indio_dev =dev_to_iio_dev (dev); -struct ad7793_state *st =iio_priv (indio_dev); - -return sprintf (buf,"%d\n" , - st->chip_info->sample_freq_avail[AD7793_MODE_RATE (st->mode)]); -} - -static ssize_t ad7793_write_frequency (struct device *dev, -struct device_attribute *attr, -const char *buf, -size_t len) -{ -struct iio_dev *indio_dev =dev_to_iio_dev (dev); -struct ad7793_state *st =iio_priv (indio_dev); -long lval; -int i, ret; - - ret =kstrtol (buf,10 , &lval); -if (ret) -return ret; - -if (lval ==0 ) -return -EINVAL ; - -for (i =0 ; i <16 ; i++) -if (lval == st->chip_info->sample_freq_avail[i]) -break ; -if (i ==16 ) -return -EINVAL ; - - ret =iio_device_claim_direct_mode (indio_dev); -if (ret) -return ret; - st->mode &= ~AD7793_MODE_RATE (-1 ); - st->mode |=AD7793_MODE_RATE (i); -ad_sd_write_reg (&st->sd,AD7793_REG_MODE ,sizeof (st->mode), st->mode); -iio_device_release_direct_mode (indio_dev); - -return len; -} - -static IIO_DEV_ATTR_SAMP_FREQ(S_IWUSR | S_IRUGO, - ad7793_read_frequency, - ad7793_write_frequency); - static IIO_CONST_ATTR_SAMP_FREQ_AVAIL( "470 242 123 62 50 39 33 19 17 16 12 10 8 6 4");@@ -424,7 +375,6 @@ static IIO_DEVICE_ATTR_NAMED(in_m_in_scale_available, ad7793_show_scale_available, NULL, 0);static struct attribute *ad7793_attributes[] = { - &iio_dev_attr_sampling_frequency.dev_attr.attr, &iio_const_attr_sampling_frequency_available.dev_attr.attr, &iio_dev_attr_in_m_in_scale_available.dev_attr.attr,NULL @@ -435,7 +385,6 @@ static const struct attribute_group ad7793_attribute_group = { };static struct attribute *ad7797_attributes[] = { - &iio_dev_attr_sampling_frequency.dev_attr.attr, &iio_const_attr_sampling_frequency_available_ad7797.dev_attr.attr,NULL };@@ -505,6 +454,9 @@ static int ad7793_read_raw(struct iio_dev *indio_dev, *val -= offset; }return IIO_VAL_INT ; +case IIO_CHAN_INFO_SAMP_FREQ : + *val = st->chip_info->sample_freq_avail[AD7793_MODE_RATE (st->mode)]; +return IIO_VAL_INT ; }return -EINVAL ; }@@ -542,6 +494,26 @@ static int ad7793_write_raw(struct iio_dev *indio_dev,break ; }break ; +case IIO_CHAN_INFO_SAMP_FREQ : +if (!val) { + ret = -EINVAL ; +break ; + } + +for (i =0 ; i <16 ; i++) +if (val == st->chip_info->sample_freq_avail[i]) +break ; + +if (i ==16 ) { + ret = -EINVAL ; +break ; + } + + st->mode &= ~AD7793_MODE_RATE (-1 ); + st->mode |=AD7793_MODE_RATE (i); +ad_sd_write_reg (&st->sd,AD7793_REG_MODE ,sizeof (st->mode), st->mode); + ret =0 ; +break ;default : ret = -EINVAL ; }