diff mbox

iio: ad7793: implement IIO_CHAN_INFO_SAMP_FREQ

Message ID 43f7cfe7bf868fb00e81a76246b9bc3a@heine.so (mailing list archive)
State New, archived
Headers show

Commit Message

Michael Nosthoff March 7, 2018, 4:17 p.m. UTC
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.

Signed-off-by: Michael Nosthoff <committed@heine.so>
---
  drivers/iio/adc/ad7793.c | 74 
+++++++++++++++---------------------------------
  1 file changed, 23 insertions(+), 51 deletions(-)

  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;
	}
--
2.7.4

--
To unsubscribe from this list: send the line "unsubscribe linux-iio" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Comments

Lars-Peter Clausen March 7, 2018, 4:43 p.m. UTC | #1
On 03/07/2018 05:17 PM, Michael Nosthoff wrote:
> 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.
> 
> Signed-off-by: Michael Nosthoff <committed@heine.so>

Hi,

Thanks for fixing this. Patch looks good. We should add the fixes tag to the
commit messages, so it gets picked up for the right stable branches.

Fixes: a13e831fcaa7 ("staging: iio: ad7192: implement IIO_CHAN_INFO_SAMP_FREQ")

Other than that just one minor comment inline.

[...]
> +    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;

I don't think the ret = 0 is needed here, it should already be 0. But of
course it does not hurt either.

> +        break;
>     default:
>         ret = -EINVAL;
>     }
> -- 
> 2.7.4
> 
> -- 
> To unsubscribe from this list: send the line "unsubscribe linux-iio" in
> the body of a message to majordomo@vger.kernel.org
> More majordomo info at  http://vger.kernel.org/majordomo-info.html

--
To unsubscribe from this list: send the line "unsubscribe linux-iio" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Michael Nosthoff March 7, 2018, 6:02 p.m. UTC | #2
On 2018-03-07 17:43, Lars-Peter Clausen wrote:
> On 03/07/2018 05:17 PM, Michael Nosthoff wrote:
>> 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.
>> 
>> Signed-off-by: Michael Nosthoff <committed@heine.so>
> 
> Hi,
> 
> Thanks for fixing this. Patch looks good. We should add the fixes tag 
> to the
> commit messages, so it gets picked up for the right stable branches.
> 
> Fixes: a13e831fcaa7 ("staging: iio: ad7192: implement 
> IIO_CHAN_INFO_SAMP_FREQ")
> 
> Other than that just one minor comment inline.

Agree on the fixes tag. Further comment inline.

> 
> [...]
>> +    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;
> 
> I don't think the ret = 0 is needed here, it should already be 0. But 
> of
> course it does not hurt either.

My fault. I tested against 4.14 which doesn't have the
"use iio helper function to guarantee direct mode" commit which 
initializes
ret. Which produces a compiler warning.
So if I remove it a backport would require that commit to be pulled 
first.

> 
>> +        break;
>>     default:
>>         ret = -EINVAL;
>>     }
>> --
>> 2.7.4
>> 
>> --
>> To unsubscribe from this list: send the line "unsubscribe linux-iio" 
>> in
>> the body of a message to majordomo@vger.kernel.org
>> More majordomo info at  http://vger.kernel.org/majordomo-info.html
--
To unsubscribe from this list: send the line "unsubscribe linux-iio" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Michael Nosthoff March 8, 2018, 9:33 a.m. UTC | #3
On 2018-03-07 19:02, Michael Nosthoff wrote:
> On 2018-03-07 17:43, Lars-Peter Clausen wrote:
>> On 03/07/2018 05:17 PM, Michael Nosthoff wrote:
>> [...]
>>> +    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;
>> 
>> I don't think the ret = 0 is needed here, it should already be 0. But 
>> of
>> course it does not hurt either.
> 
> My fault. I tested against 4.14 which doesn't have the
> "use iio helper function to guarantee direct mode" commit which 
> initializes
> ret. Which produces a compiler warning.
> So if I remove it a backport would require that commit to be pulled 
> first.

I just noticed I mixed something up, the mentioned patch is already 
applied in 4.14.
I'll remove the line and resubmit the patch.


--
To unsubscribe from this list: send the line "unsubscribe linux-iio" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
diff mbox

Patch

diff --git a/drivers/iio/adc/ad7793.c b/drivers/iio/adc/ad7793.c
index 47c3d7f..4079f40 100644
--- a/drivers/iio/adc/ad7793.c
+++ b/drivers/iio/adc/ad7793.c
@@ -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);
-