* [PATCH v4] staging: iio: cdc: ad7152: Implement IIO_CHAN_INFO_SAMP_FREQ attribute
@ 2016-10-09 18:26 sayli karnik
[not found] ` <585EF4C9-62BF-45FF-916B-EE0B9412585A@jic23.retrosnub.co.uk>
0 siblings, 1 reply; 4+ messages in thread
From: sayli karnik @ 2016-10-09 18:26 UTC (permalink / raw)
To: outreachy-kernel
Cc: Jonathan Cameron, Hartmut Knaack, Lars-Peter Clausen,
Peter Meerwald-Stadler, Greg Kroah-Hartman, 21cnbao, linux-iio
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 <karniksayli1995@gmail.com>
---
Changes in v4:
Replaced mlock with a local lock since mlock is intended to protect 'only'
switches between modes. Given this driver doesn't support more than one mode
(sysfs polled reads only)
Changes in v3:
Drop the unlock in ad7152_write_raw_samp_freq() and use the one at the exit point
instead
Return ret immediately instead of using a goto statement in ad7152_write_raw_samp_freq()
Changes in v2:
Give a more detailed explanation
Remove null check for val in ad7152_write_raw_samp_freq()
Merged two stucture variable initialisations into one statement in ad7152_read_raw_samp_freq()
Set ret to IIO_VAL_INT in ad7152_read_raw() when mask equals IIO_CHAN_INFO_SAMP_FREQ and ret>=0
drivers/staging/iio/cdc/ad7152.c | 117 ++++++++++++++++++++++-----------------
1 file changed, 66 insertions(+), 51 deletions(-)
diff --git a/drivers/staging/iio/cdc/ad7152.c b/drivers/staging/iio/cdc/ad7152.c
index 485d0a5..0ce3849 100644
--- a/drivers/staging/iio/cdc/ad7152.c
+++ b/drivers/staging/iio/cdc/ad7152.c
@@ -89,6 +89,7 @@ struct ad7152_chip_info {
*/
u8 filter_rate_setup;
u8 setup[2];
+ struct mutex state_lock; /* protect hardware state */
};
static inline ssize_t ad7152_start_calib(struct device *dev,
@@ -165,63 +166,12 @@ static const unsigned char ad7152_filter_rate_table[][2] = {
{200, 5 + 1}, {50, 20 + 1}, {20, 50 + 1}, {17, 60 + 1},
};
-static ssize_t ad7152_show_filter_rate_setup(struct device *dev,
- struct device_attribute *attr,
- char *buf)
-{
- struct iio_dev *indio_dev = dev_to_iio_dev(dev);
- struct ad7152_chip_info *chip = iio_priv(indio_dev);
-
- return sprintf(buf, "%d\n",
- ad7152_filter_rate_table[chip->filter_rate_setup][0]);
-}
-
-static ssize_t ad7152_store_filter_rate_setup(struct device *dev,
- struct device_attribute *attr,
- const char *buf,
- size_t len)
-{
- struct iio_dev *indio_dev = dev_to_iio_dev(dev);
- struct ad7152_chip_info *chip = iio_priv(indio_dev);
- u8 data;
- int ret, i;
-
- ret = kstrtou8(buf, 10, &data);
- if (ret < 0)
- return ret;
-
- for (i = 0; i < ARRAY_SIZE(ad7152_filter_rate_table); i++)
- if (data >= ad7152_filter_rate_table[i][0])
- break;
-
- if (i >= ARRAY_SIZE(ad7152_filter_rate_table))
- i = ARRAY_SIZE(ad7152_filter_rate_table) - 1;
-
- mutex_lock(&indio_dev->mlock);
- ret = i2c_smbus_write_byte_data(chip->client,
- AD7152_REG_CFG2, AD7152_CFG2_OSR(i));
- if (ret < 0) {
- mutex_unlock(&indio_dev->mlock);
- return ret;
- }
-
- chip->filter_rate_setup = i;
- mutex_unlock(&indio_dev->mlock);
-
- return len;
-}
-
-static IIO_DEV_ATTR_SAMP_FREQ(S_IRUGO | S_IWUSR,
- ad7152_show_filter_rate_setup,
- ad7152_store_filter_rate_setup);
-
static IIO_CONST_ATTR_SAMP_FREQ_AVAIL("200 50 20 17");
static IIO_CONST_ATTR(in_capacitance_scale_available,
"0.000061050 0.000030525 0.000015263 0.000007631");
static struct attribute *ad7152_attributes[] = {
- &iio_dev_attr_sampling_frequency.dev_attr.attr,
&iio_dev_attr_in_capacitance0_calibbias_calibration.dev_attr.attr,
&iio_dev_attr_in_capacitance1_calibbias_calibration.dev_attr.attr,
&iio_dev_attr_in_capacitance0_calibscale_calibration.dev_attr.attr,
@@ -247,6 +197,50 @@ static const int ad7152_scale_table[] = {
30525, 7631, 15263, 61050
};
+/**
+ * read_raw handler for IIO_CHAN_INFO_SAMP_FREQ
+ *
+ * lock must be held
+ **/
+static int ad7152_read_raw_samp_freq(struct device *dev, int *val)
+{
+ struct ad7152_chip_info *chip = iio_priv(dev_to_iio_dev(dev));
+
+ *val = ad7152_filter_rate_table[chip->filter_rate_setup][0];
+
+ return 0;
+}
+
+/**
+ * write_raw handler for IIO_CHAN_INFO_SAMP_FREQ
+ *
+ * lock must be held
+ **/
+static int ad7152_write_raw_samp_freq(struct device *dev, int val)
+{
+ struct iio_dev *indio_dev = dev_to_iio_dev(dev);
+ struct ad7152_chip_info *chip = iio_priv(indio_dev);
+ u8 data;
+ int ret, i;
+
+ for (i = 0; i < ARRAY_SIZE(ad7152_filter_rate_table); i++)
+ if (data >= ad7152_filter_rate_table[i][0])
+ break;
+
+ if (i >= ARRAY_SIZE(ad7152_filter_rate_table))
+ i = ARRAY_SIZE(ad7152_filter_rate_table) - 1;
+
+ mutex_lock(&chip->state_lock);
+ ret = i2c_smbus_write_byte_data(chip->client,
+ AD7152_REG_CFG2, AD7152_CFG2_OSR(i));
+ if (ret < 0)
+ return ret;
+
+ chip->filter_rate_setup = i;
+ mutex_unlock(&chip->state_lock);
+
+ return ret;
+}
static int ad7152_write_raw(struct iio_dev *indio_dev,
struct iio_chan_spec const *chan,
int val,
@@ -309,6 +303,16 @@ static int ad7152_write_raw(struct iio_dev *indio_dev,
ret = 0;
break;
+ case IIO_CHAN_INFO_SAMP_FREQ:
+ if (val2)
+ return -EINVAL;
+
+ ret = ad7152_write_raw_samp_freq(&indio_dev->dev, val);
+ if (ret < 0)
+ goto out;
+
+ ret = 0;
+ break;
default:
ret = -EINVAL;
}
@@ -403,6 +407,13 @@ static int ad7152_read_raw(struct iio_dev *indio_dev,
ret = IIO_VAL_INT_PLUS_NANO;
break;
+ case IIO_CHAN_INFO_SAMP_FREQ:
+ ret = ad7152_read_raw_samp_freq(&indio_dev->dev, val);
+ if (ret < 0)
+ goto out;
+
+ ret = IIO_VAL_INT;
+ break;
default:
ret = -EINVAL;
}
@@ -440,6 +451,7 @@ static const struct iio_chan_spec ad7152_channels[] = {
BIT(IIO_CHAN_INFO_CALIBSCALE) |
BIT(IIO_CHAN_INFO_CALIBBIAS) |
BIT(IIO_CHAN_INFO_SCALE),
+ .info_mask_shared_by_all = BIT(IIO_CHAN_INFO_SAMP_FREQ),
}, {
.type = IIO_CAPACITANCE,
.differential = 1,
@@ -450,6 +462,7 @@ static const struct iio_chan_spec ad7152_channels[] = {
BIT(IIO_CHAN_INFO_CALIBSCALE) |
BIT(IIO_CHAN_INFO_CALIBBIAS) |
BIT(IIO_CHAN_INFO_SCALE),
+ .info_mask_shared_by_all = BIT(IIO_CHAN_INFO_SAMP_FREQ),
}, {
.type = IIO_CAPACITANCE,
.indexed = 1,
@@ -458,6 +471,7 @@ static const struct iio_chan_spec ad7152_channels[] = {
BIT(IIO_CHAN_INFO_CALIBSCALE) |
BIT(IIO_CHAN_INFO_CALIBBIAS) |
BIT(IIO_CHAN_INFO_SCALE),
+ .info_mask_shared_by_all = BIT(IIO_CHAN_INFO_SAMP_FREQ),
}, {
.type = IIO_CAPACITANCE,
.differential = 1,
@@ -468,6 +482,7 @@ static const struct iio_chan_spec ad7152_channels[] = {
BIT(IIO_CHAN_INFO_CALIBSCALE) |
BIT(IIO_CHAN_INFO_CALIBBIAS) |
BIT(IIO_CHAN_INFO_SCALE),
+ .info_mask_shared_by_all = BIT(IIO_CHAN_INFO_SAMP_FREQ),
}
};
/*
--
2.7.4
^ permalink raw reply related [flat|nested] 4+ messages in thread
* Re: [PATCH v4] staging: iio: cdc: ad7152: Implement IIO_CHAN_INFO_SAMP_FREQ attribute
[not found] ` <585EF4C9-62BF-45FF-916B-EE0B9412585A@jic23.retrosnub.co.uk>
@ 2016-10-10 10:33 ` Eva Rachel Retuya
2016-10-10 10:56 ` sayli karnik
0 siblings, 1 reply; 4+ messages in thread
From: Eva Rachel Retuya @ 2016-10-10 10:33 UTC (permalink / raw)
To: Jonathan Cameron
Cc: sayli karnik, outreachy-kernel, Jonathan Cameron, Hartmut Knaack,
Lars-Peter Clausen, Peter Meerwald-Stadler, Greg Kroah-Hartman,
21cnbao, linux-iio
On Sun, Oct 09, 2016 at 07:36:45PM +0100, Jonathan Cameron wrote:
>
>
> On 9 October 2016 19:26:52 BST, sayli karnik <karniksayli1995@gmail.com> wrote:
> >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 <karniksayli1995@gmail.com>
>
> Sorry Sayli,
>
> I was not clear enough. The block to local lock change would make a good extra patch.
>
> It is a separate change so should be a separate patch. I have already applied v3 of the patch
> without the mlock change.
>
> https://git.kernel.org/cgit/linux/kernel/git/jic23/iio.git/log/?h=testing
>
Good Day Sayli and Jonathan,
While I was working on the v2 of another cdc driver I happen to check
the link above for the approach taken on using function handlers. I have
noticed that in the write_raw handler (ad7152_write_raw_samp_freq), val
was never used.
for (i = 0; i < ARRAY_SIZE(ad7152_filter_rate_table); i++)
if (data >= ad7152_filter_rate_table[i][0])
break;
In place of 'data' is where I am expecting 'val' to be used. Any
comments regarding this? I apologize if I turn out to be wrong though.
Best,
Eva
> Such an mlock replacing patch needs to replace all uses of mlock in the driver. Also make sure
> you initialise the mutex appropriately.
>
> Jonathan
>
>
> >---
> >Changes in v4:
> >Replaced mlock with a local lock since mlock is intended to protect
> >'only'
> >switches between modes. Given this driver doesn't support more than one
> >mode
> >(sysfs polled reads only)
> >
> >Changes in v3:
> >Drop the unlock in ad7152_write_raw_samp_freq() and use the one at the
> >exit point
> >instead
> >Return ret immediately instead of using a goto statement in
> >ad7152_write_raw_samp_freq()
> >
> >Changes in v2:
> >Give a more detailed explanation
> >Remove null check for val in ad7152_write_raw_samp_freq()
> >Merged two stucture variable initialisations into one statement in
> >ad7152_read_raw_samp_freq()
> >Set ret to IIO_VAL_INT in ad7152_read_raw() when mask equals
> >IIO_CHAN_INFO_SAMP_FREQ and ret>=0
> >drivers/staging/iio/cdc/ad7152.c | 117
> >++++++++++++++++++++++-----------------
> > 1 file changed, 66 insertions(+), 51 deletions(-)
> >
> >diff --git a/drivers/staging/iio/cdc/ad7152.c
> >b/drivers/staging/iio/cdc/ad7152.c
> >index 485d0a5..0ce3849 100644
> >--- a/drivers/staging/iio/cdc/ad7152.c
> >+++ b/drivers/staging/iio/cdc/ad7152.c
> >@@ -89,6 +89,7 @@ struct ad7152_chip_info {
> > */
> > u8 filter_rate_setup;
> > u8 setup[2];
> >+ struct mutex state_lock; /* protect hardware state */
> > };
> >
> > static inline ssize_t ad7152_start_calib(struct device *dev,
> >@@ -165,63 +166,12 @@ static const unsigned char
> >ad7152_filter_rate_table[][2] = {
> > {200, 5 + 1}, {50, 20 + 1}, {20, 50 + 1}, {17, 60 + 1},
> > };
> >
> >-static ssize_t ad7152_show_filter_rate_setup(struct device *dev,
> >- struct device_attribute *attr,
> >- char *buf)
> >-{
> >- struct iio_dev *indio_dev = dev_to_iio_dev(dev);
> >- struct ad7152_chip_info *chip = iio_priv(indio_dev);
> >-
> >- return sprintf(buf, "%d\n",
> >- ad7152_filter_rate_table[chip->filter_rate_setup][0]);
> >-}
> >-
> >-static ssize_t ad7152_store_filter_rate_setup(struct device *dev,
> >- struct device_attribute *attr,
> >- const char *buf,
> >- size_t len)
> >-{
> >- struct iio_dev *indio_dev = dev_to_iio_dev(dev);
> >- struct ad7152_chip_info *chip = iio_priv(indio_dev);
> >- u8 data;
> >- int ret, i;
> >-
> >- ret = kstrtou8(buf, 10, &data);
> >- if (ret < 0)
> >- return ret;
> >-
> >- for (i = 0; i < ARRAY_SIZE(ad7152_filter_rate_table); i++)
> >- if (data >= ad7152_filter_rate_table[i][0])
> >- break;
> >-
> >- if (i >= ARRAY_SIZE(ad7152_filter_rate_table))
> >- i = ARRAY_SIZE(ad7152_filter_rate_table) - 1;
> >-
> >- mutex_lock(&indio_dev->mlock);
> >- ret = i2c_smbus_write_byte_data(chip->client,
> >- AD7152_REG_CFG2, AD7152_CFG2_OSR(i));
> >- if (ret < 0) {
> >- mutex_unlock(&indio_dev->mlock);
> >- return ret;
> >- }
> >-
> >- chip->filter_rate_setup = i;
> >- mutex_unlock(&indio_dev->mlock);
> >-
> >- return len;
> >-}
> >-
> >-static IIO_DEV_ATTR_SAMP_FREQ(S_IRUGO | S_IWUSR,
> >- ad7152_show_filter_rate_setup,
> >- ad7152_store_filter_rate_setup);
> >-
> > static IIO_CONST_ATTR_SAMP_FREQ_AVAIL("200 50 20 17");
> >
> > static IIO_CONST_ATTR(in_capacitance_scale_available,
> > "0.000061050 0.000030525 0.000015263 0.000007631");
> >
> > static struct attribute *ad7152_attributes[] = {
> >- &iio_dev_attr_sampling_frequency.dev_attr.attr,
> > &iio_dev_attr_in_capacitance0_calibbias_calibration.dev_attr.attr,
> > &iio_dev_attr_in_capacitance1_calibbias_calibration.dev_attr.attr,
> > &iio_dev_attr_in_capacitance0_calibscale_calibration.dev_attr.attr,
> >@@ -247,6 +197,50 @@ static const int ad7152_scale_table[] = {
> > 30525, 7631, 15263, 61050
> > };
> >
> >+/**
> >+ * read_raw handler for IIO_CHAN_INFO_SAMP_FREQ
> >+ *
> >+ * lock must be held
> >+ **/
> >+static int ad7152_read_raw_samp_freq(struct device *dev, int *val)
> >+{
> >+ struct ad7152_chip_info *chip = iio_priv(dev_to_iio_dev(dev));
> >+
> >+ *val = ad7152_filter_rate_table[chip->filter_rate_setup][0];
> >+
> >+ return 0;
> >+}
> >+
> >+/**
> >+ * write_raw handler for IIO_CHAN_INFO_SAMP_FREQ
> >+ *
> >+ * lock must be held
> >+ **/
> >+static int ad7152_write_raw_samp_freq(struct device *dev, int val)
> >+{
> >+ struct iio_dev *indio_dev = dev_to_iio_dev(dev);
> >+ struct ad7152_chip_info *chip = iio_priv(indio_dev);
> >+ u8 data;
> >+ int ret, i;
> >+
> >+ for (i = 0; i < ARRAY_SIZE(ad7152_filter_rate_table); i++)
> >+ if (data >= ad7152_filter_rate_table[i][0])
> >+ break;
> >+
> >+ if (i >= ARRAY_SIZE(ad7152_filter_rate_table))
> >+ i = ARRAY_SIZE(ad7152_filter_rate_table) - 1;
> >+
> >+ mutex_lock(&chip->state_lock);
> >+ ret = i2c_smbus_write_byte_data(chip->client,
> >+ AD7152_REG_CFG2, AD7152_CFG2_OSR(i));
> >+ if (ret < 0)
> >+ return ret;
> >+
> >+ chip->filter_rate_setup = i;
> >+ mutex_unlock(&chip->state_lock);
> >+
> >+ return ret;
> >+}
> > static int ad7152_write_raw(struct iio_dev *indio_dev,
> > struct iio_chan_spec const *chan,
> > int val,
> >@@ -309,6 +303,16 @@ static int ad7152_write_raw(struct iio_dev
> >*indio_dev,
> >
> > ret = 0;
> > break;
> >+ case IIO_CHAN_INFO_SAMP_FREQ:
> >+ if (val2)
> >+ return -EINVAL;
> >+
> >+ ret = ad7152_write_raw_samp_freq(&indio_dev->dev, val);
> >+ if (ret < 0)
> >+ goto out;
> >+
> >+ ret = 0;
> >+ break;
> > default:
> > ret = -EINVAL;
> > }
> >@@ -403,6 +407,13 @@ static int ad7152_read_raw(struct iio_dev
> >*indio_dev,
> >
> > ret = IIO_VAL_INT_PLUS_NANO;
> > break;
> >+ case IIO_CHAN_INFO_SAMP_FREQ:
> >+ ret = ad7152_read_raw_samp_freq(&indio_dev->dev, val);
> >+ if (ret < 0)
> >+ goto out;
> >+
> >+ ret = IIO_VAL_INT;
> >+ break;
> > default:
> > ret = -EINVAL;
> > }
> >@@ -440,6 +451,7 @@ static const struct iio_chan_spec ad7152_channels[]
> >= {
> > BIT(IIO_CHAN_INFO_CALIBSCALE) |
> > BIT(IIO_CHAN_INFO_CALIBBIAS) |
> > BIT(IIO_CHAN_INFO_SCALE),
> >+ .info_mask_shared_by_all = BIT(IIO_CHAN_INFO_SAMP_FREQ),
> > }, {
> > .type = IIO_CAPACITANCE,
> > .differential = 1,
> >@@ -450,6 +462,7 @@ static const struct iio_chan_spec ad7152_channels[]
> >= {
> > BIT(IIO_CHAN_INFO_CALIBSCALE) |
> > BIT(IIO_CHAN_INFO_CALIBBIAS) |
> > BIT(IIO_CHAN_INFO_SCALE),
> >+ .info_mask_shared_by_all = BIT(IIO_CHAN_INFO_SAMP_FREQ),
> > }, {
> > .type = IIO_CAPACITANCE,
> > .indexed = 1,
> >@@ -458,6 +471,7 @@ static const struct iio_chan_spec ad7152_channels[]
> >= {
> > BIT(IIO_CHAN_INFO_CALIBSCALE) |
> > BIT(IIO_CHAN_INFO_CALIBBIAS) |
> > BIT(IIO_CHAN_INFO_SCALE),
> >+ .info_mask_shared_by_all = BIT(IIO_CHAN_INFO_SAMP_FREQ),
> > }, {
> > .type = IIO_CAPACITANCE,
> > .differential = 1,
> >@@ -468,6 +482,7 @@ static const struct iio_chan_spec ad7152_channels[]
> >= {
> > BIT(IIO_CHAN_INFO_CALIBSCALE) |
> > BIT(IIO_CHAN_INFO_CALIBBIAS) |
> > BIT(IIO_CHAN_INFO_SCALE),
> >+ .info_mask_shared_by_all = BIT(IIO_CHAN_INFO_SAMP_FREQ),
> > }
> > };
> > /*
>
> --
> Sent from my Android device with K-9 Mail. Please excuse my brevity.
> --
> 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
^ permalink raw reply [flat|nested] 4+ messages in thread
* Re: [PATCH v4] staging: iio: cdc: ad7152: Implement IIO_CHAN_INFO_SAMP_FREQ attribute
2016-10-10 10:33 ` Eva Rachel Retuya
@ 2016-10-10 10:56 ` sayli karnik
2016-10-10 11:22 ` jic23
0 siblings, 1 reply; 4+ messages in thread
From: sayli karnik @ 2016-10-10 10:56 UTC (permalink / raw)
To: Jonathan Cameron, sayli karnik, outreachy-kernel,
Jonathan Cameron, Hartmut Knaack, Lars-Peter Clausen,
Peter Meerwald-Stadler, Greg Kroah-Hartman, Barry Song, linux-iio
On Mon, Oct 10, 2016 at 4:03 PM, Eva Rachel Retuya <eraretuya@gmail.com> wrote:
> On Sun, Oct 09, 2016 at 07:36:45PM +0100, Jonathan Cameron wrote:
>>
>>
>> On 9 October 2016 19:26:52 BST, sayli karnik <karniksayli1995@gmail.com> wrote:
>> >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 <karniksayli1995@gmail.com>
>>
>> Sorry Sayli,
>>
>> I was not clear enough. The block to local lock change would make a good extra patch.
>>
>> It is a separate change so should be a separate patch. I have already applied v3 of the patch
>> without the mlock change.
>>
>> https://git.kernel.org/cgit/linux/kernel/git/jic23/iio.git/log/?h=testing
>>
>
> Good Day Sayli and Jonathan,
>
> While I was working on the v2 of another cdc driver I happen to check
> the link above for the approach taken on using function handlers. I have
> noticed that in the write_raw handler (ad7152_write_raw_samp_freq), val
> was never used.
>
> for (i = 0; i < ARRAY_SIZE(ad7152_filter_rate_table); i++)
> if (data >= ad7152_filter_rate_table[i][0])
> break;
>
> In place of 'data' is where I am expecting 'val' to be used. Any
> comments regarding this? I apologize if I turn out to be wrong though.
>
Hey!
Thanks Eva! I think I skipped this little bug. It should be val
according to me too. Jonathan?
thanks,
sayli
> Best,
> Eva
>
>> Such an mlock replacing patch needs to replace all uses of mlock in the driver. Also make sure
>> you initialise the mutex appropriately.
>>
>> Jonathan
>>
>>
>> >---
>> >Changes in v4:
>> >Replaced mlock with a local lock since mlock is intended to protect
>> >'only'
>> >switches between modes. Given this driver doesn't support more than one
>> >mode
>> >(sysfs polled reads only)
>> >
>> >Changes in v3:
>> >Drop the unlock in ad7152_write_raw_samp_freq() and use the one at the
>> >exit point
>> >instead
>> >Return ret immediately instead of using a goto statement in
>> >ad7152_write_raw_samp_freq()
>> >
>> >Changes in v2:
>> >Give a more detailed explanation
>> >Remove null check for val in ad7152_write_raw_samp_freq()
>> >Merged two stucture variable initialisations into one statement in
>> >ad7152_read_raw_samp_freq()
>> >Set ret to IIO_VAL_INT in ad7152_read_raw() when mask equals
>> >IIO_CHAN_INFO_SAMP_FREQ and ret>=0
>> >drivers/staging/iio/cdc/ad7152.c | 117
>> >++++++++++++++++++++++-----------------
>> > 1 file changed, 66 insertions(+), 51 deletions(-)
>> >
>> >diff --git a/drivers/staging/iio/cdc/ad7152.c
>> >b/drivers/staging/iio/cdc/ad7152.c
>> >index 485d0a5..0ce3849 100644
>> >--- a/drivers/staging/iio/cdc/ad7152.c
>> >+++ b/drivers/staging/iio/cdc/ad7152.c
>> >@@ -89,6 +89,7 @@ struct ad7152_chip_info {
>> > */
>> > u8 filter_rate_setup;
>> > u8 setup[2];
>> >+ struct mutex state_lock; /* protect hardware state */
>> > };
>> >
>> > static inline ssize_t ad7152_start_calib(struct device *dev,
>> >@@ -165,63 +166,12 @@ static const unsigned char
>> >ad7152_filter_rate_table[][2] = {
>> > {200, 5 + 1}, {50, 20 + 1}, {20, 50 + 1}, {17, 60 + 1},
>> > };
>> >
>> >-static ssize_t ad7152_show_filter_rate_setup(struct device *dev,
>> >- struct device_attribute *attr,
>> >- char *buf)
>> >-{
>> >- struct iio_dev *indio_dev = dev_to_iio_dev(dev);
>> >- struct ad7152_chip_info *chip = iio_priv(indio_dev);
>> >-
>> >- return sprintf(buf, "%d\n",
>> >- ad7152_filter_rate_table[chip->filter_rate_setup][0]);
>> >-}
>> >-
>> >-static ssize_t ad7152_store_filter_rate_setup(struct device *dev,
>> >- struct device_attribute *attr,
>> >- const char *buf,
>> >- size_t len)
>> >-{
>> >- struct iio_dev *indio_dev = dev_to_iio_dev(dev);
>> >- struct ad7152_chip_info *chip = iio_priv(indio_dev);
>> >- u8 data;
>> >- int ret, i;
>> >-
>> >- ret = kstrtou8(buf, 10, &data);
>> >- if (ret < 0)
>> >- return ret;
>> >-
>> >- for (i = 0; i < ARRAY_SIZE(ad7152_filter_rate_table); i++)
>> >- if (data >= ad7152_filter_rate_table[i][0])
>> >- break;
>> >-
>> >- if (i >= ARRAY_SIZE(ad7152_filter_rate_table))
>> >- i = ARRAY_SIZE(ad7152_filter_rate_table) - 1;
>> >-
>> >- mutex_lock(&indio_dev->mlock);
>> >- ret = i2c_smbus_write_byte_data(chip->client,
>> >- AD7152_REG_CFG2, AD7152_CFG2_OSR(i));
>> >- if (ret < 0) {
>> >- mutex_unlock(&indio_dev->mlock);
>> >- return ret;
>> >- }
>> >-
>> >- chip->filter_rate_setup = i;
>> >- mutex_unlock(&indio_dev->mlock);
>> >-
>> >- return len;
>> >-}
>> >-
>> >-static IIO_DEV_ATTR_SAMP_FREQ(S_IRUGO | S_IWUSR,
>> >- ad7152_show_filter_rate_setup,
>> >- ad7152_store_filter_rate_setup);
>> >-
>> > static IIO_CONST_ATTR_SAMP_FREQ_AVAIL("200 50 20 17");
>> >
>> > static IIO_CONST_ATTR(in_capacitance_scale_available,
>> > "0.000061050 0.000030525 0.000015263 0.000007631");
>> >
>> > static struct attribute *ad7152_attributes[] = {
>> >- &iio_dev_attr_sampling_frequency.dev_attr.attr,
>> > &iio_dev_attr_in_capacitance0_calibbias_calibration.dev_attr.attr,
>> > &iio_dev_attr_in_capacitance1_calibbias_calibration.dev_attr.attr,
>> > &iio_dev_attr_in_capacitance0_calibscale_calibration.dev_attr.attr,
>> >@@ -247,6 +197,50 @@ static const int ad7152_scale_table[] = {
>> > 30525, 7631, 15263, 61050
>> > };
>> >
>> >+/**
>> >+ * read_raw handler for IIO_CHAN_INFO_SAMP_FREQ
>> >+ *
>> >+ * lock must be held
>> >+ **/
>> >+static int ad7152_read_raw_samp_freq(struct device *dev, int *val)
>> >+{
>> >+ struct ad7152_chip_info *chip = iio_priv(dev_to_iio_dev(dev));
>> >+
>> >+ *val = ad7152_filter_rate_table[chip->filter_rate_setup][0];
>> >+
>> >+ return 0;
>> >+}
>> >+
>> >+/**
>> >+ * write_raw handler for IIO_CHAN_INFO_SAMP_FREQ
>> >+ *
>> >+ * lock must be held
>> >+ **/
>> >+static int ad7152_write_raw_samp_freq(struct device *dev, int val)
>> >+{
>> >+ struct iio_dev *indio_dev = dev_to_iio_dev(dev);
>> >+ struct ad7152_chip_info *chip = iio_priv(indio_dev);
>> >+ u8 data;
>> >+ int ret, i;
>> >+
>> >+ for (i = 0; i < ARRAY_SIZE(ad7152_filter_rate_table); i++)
>> >+ if (data >= ad7152_filter_rate_table[i][0])
>> >+ break;
>> >+
>> >+ if (i >= ARRAY_SIZE(ad7152_filter_rate_table))
>> >+ i = ARRAY_SIZE(ad7152_filter_rate_table) - 1;
>> >+
>> >+ mutex_lock(&chip->state_lock);
>> >+ ret = i2c_smbus_write_byte_data(chip->client,
>> >+ AD7152_REG_CFG2, AD7152_CFG2_OSR(i));
>> >+ if (ret < 0)
>> >+ return ret;
>> >+
>> >+ chip->filter_rate_setup = i;
>> >+ mutex_unlock(&chip->state_lock);
>> >+
>> >+ return ret;
>> >+}
>> > static int ad7152_write_raw(struct iio_dev *indio_dev,
>> > struct iio_chan_spec const *chan,
>> > int val,
>> >@@ -309,6 +303,16 @@ static int ad7152_write_raw(struct iio_dev
>> >*indio_dev,
>> >
>> > ret = 0;
>> > break;
>> >+ case IIO_CHAN_INFO_SAMP_FREQ:
>> >+ if (val2)
>> >+ return -EINVAL;
>> >+
>> >+ ret = ad7152_write_raw_samp_freq(&indio_dev->dev, val);
>> >+ if (ret < 0)
>> >+ goto out;
>> >+
>> >+ ret = 0;
>> >+ break;
>> > default:
>> > ret = -EINVAL;
>> > }
>> >@@ -403,6 +407,13 @@ static int ad7152_read_raw(struct iio_dev
>> >*indio_dev,
>> >
>> > ret = IIO_VAL_INT_PLUS_NANO;
>> > break;
>> >+ case IIO_CHAN_INFO_SAMP_FREQ:
>> >+ ret = ad7152_read_raw_samp_freq(&indio_dev->dev, val);
>> >+ if (ret < 0)
>> >+ goto out;
>> >+
>> >+ ret = IIO_VAL_INT;
>> >+ break;
>> > default:
>> > ret = -EINVAL;
>> > }
>> >@@ -440,6 +451,7 @@ static const struct iio_chan_spec ad7152_channels[]
>> >= {
>> > BIT(IIO_CHAN_INFO_CALIBSCALE) |
>> > BIT(IIO_CHAN_INFO_CALIBBIAS) |
>> > BIT(IIO_CHAN_INFO_SCALE),
>> >+ .info_mask_shared_by_all = BIT(IIO_CHAN_INFO_SAMP_FREQ),
>> > }, {
>> > .type = IIO_CAPACITANCE,
>> > .differential = 1,
>> >@@ -450,6 +462,7 @@ static const struct iio_chan_spec ad7152_channels[]
>> >= {
>> > BIT(IIO_CHAN_INFO_CALIBSCALE) |
>> > BIT(IIO_CHAN_INFO_CALIBBIAS) |
>> > BIT(IIO_CHAN_INFO_SCALE),
>> >+ .info_mask_shared_by_all = BIT(IIO_CHAN_INFO_SAMP_FREQ),
>> > }, {
>> > .type = IIO_CAPACITANCE,
>> > .indexed = 1,
>> >@@ -458,6 +471,7 @@ static const struct iio_chan_spec ad7152_channels[]
>> >= {
>> > BIT(IIO_CHAN_INFO_CALIBSCALE) |
>> > BIT(IIO_CHAN_INFO_CALIBBIAS) |
>> > BIT(IIO_CHAN_INFO_SCALE),
>> >+ .info_mask_shared_by_all = BIT(IIO_CHAN_INFO_SAMP_FREQ),
>> > }, {
>> > .type = IIO_CAPACITANCE,
>> > .differential = 1,
>> >@@ -468,6 +482,7 @@ static const struct iio_chan_spec ad7152_channels[]
>> >= {
>> > BIT(IIO_CHAN_INFO_CALIBSCALE) |
>> > BIT(IIO_CHAN_INFO_CALIBBIAS) |
>> > BIT(IIO_CHAN_INFO_SCALE),
>> >+ .info_mask_shared_by_all = BIT(IIO_CHAN_INFO_SAMP_FREQ),
>> > }
>> > };
>> > /*
>>
>> --
>> Sent from my Android device with K-9 Mail. Please excuse my brevity.
>> --
>> 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
^ permalink raw reply [flat|nested] 4+ messages in thread
* Re: [PATCH v4] staging: iio: cdc: ad7152: Implement IIO_CHAN_INFO_SAMP_FREQ attribute
2016-10-10 10:56 ` sayli karnik
@ 2016-10-10 11:22 ` jic23
0 siblings, 0 replies; 4+ messages in thread
From: jic23 @ 2016-10-10 11:22 UTC (permalink / raw)
To: sayli karnik
Cc: outreachy-kernel, Jonathan Cameron, Hartmut Knaack,
Lars-Peter Clausen, Peter Meerwald-Stadler, Greg Kroah-Hartman,
Barry Song, linux-iio
On 10.10.2016 11:56, sayli karnik wrote:
> On Mon, Oct 10, 2016 at 4:03 PM, Eva Rachel Retuya
> <eraretuya@gmail.com> wrote:
>> On Sun, Oct 09, 2016 at 07:36:45PM +0100, Jonathan Cameron wrote:
>>>
>>>
>>> On 9 October 2016 19:26:52 BST, sayli karnik
>>> <karniksayli1995@gmail.com> wrote:
>>> >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 <karniksayli1995@gmail.com>
>>>
>>> Sorry Sayli,
>>>
>>> I was not clear enough. The block to local lock change would make a
>>> good extra patch.
>>>
>>> It is a separate change so should be a separate patch. I have already
>>> applied v3 of the patch
>>> without the mlock change.
>>>
>>> https://git.kernel.org/cgit/linux/kernel/git/jic23/iio.git/log/?h=testing
>>>
>>
>> Good Day Sayli and Jonathan,
>>
>> While I was working on the v2 of another cdc driver I happen to check
>> the link above for the approach taken on using function handlers. I
>> have
>> noticed that in the write_raw handler (ad7152_write_raw_samp_freq),
>> val
>> was never used.
>>
>> for (i = 0; i < ARRAY_SIZE(ad7152_filter_rate_table); i++)
>> if (data >= ad7152_filter_rate_table[i][0])
>> break;
>>
>> In place of 'data' is where I am expecting 'val' to be used. Any
>> comments regarding this? I apologize if I turn out to be wrong though.
>>
> Hey!
> Thanks Eva! I think I skipped this little bug. It should be val
> according to me too. Jonathan?
>
> thanks,
> sayli
Agreed, not sure why the build farms at 0-day didn't pick up on that as
data won't
have been initialized when it is used.
Anyhow, I haven't pushed this out on a non rebasing tree (it's still
only
public in the testing branch). Please send an updated version and I'll
switch it.
Thanks,
Jonathan
>
>> Best,
>> Eva
>>
>>> Such an mlock replacing patch needs to replace all uses of mlock in
>>> the driver. Also make sure
>>> you initialise the mutex appropriately.
>>>
>>> Jonathan
>>>
>>>
>>> >---
>>> >Changes in v4:
>>> >Replaced mlock with a local lock since mlock is intended to protect
>>> >'only'
>>> >switches between modes. Given this driver doesn't support more than one
>>> >mode
>>> >(sysfs polled reads only)
>>> >
>>> >Changes in v3:
>>> >Drop the unlock in ad7152_write_raw_samp_freq() and use the one at the
>>> >exit point
>>> >instead
>>> >Return ret immediately instead of using a goto statement in
>>> >ad7152_write_raw_samp_freq()
>>> >
>>> >Changes in v2:
>>> >Give a more detailed explanation
>>> >Remove null check for val in ad7152_write_raw_samp_freq()
>>> >Merged two stucture variable initialisations into one statement in
>>> >ad7152_read_raw_samp_freq()
>>> >Set ret to IIO_VAL_INT in ad7152_read_raw() when mask equals
>>> >IIO_CHAN_INFO_SAMP_FREQ and ret>=0
>>> >drivers/staging/iio/cdc/ad7152.c | 117
>>> >++++++++++++++++++++++-----------------
>>> > 1 file changed, 66 insertions(+), 51 deletions(-)
>>> >
>>> >diff --git a/drivers/staging/iio/cdc/ad7152.c
>>> >b/drivers/staging/iio/cdc/ad7152.c
>>> >index 485d0a5..0ce3849 100644
>>> >--- a/drivers/staging/iio/cdc/ad7152.c
>>> >+++ b/drivers/staging/iio/cdc/ad7152.c
>>> >@@ -89,6 +89,7 @@ struct ad7152_chip_info {
>>> > */
>>> > u8 filter_rate_setup;
>>> > u8 setup[2];
>>> >+ struct mutex state_lock; /* protect hardware state */
>>> > };
>>> >
>>> > static inline ssize_t ad7152_start_calib(struct device *dev,
>>> >@@ -165,63 +166,12 @@ static const unsigned char
>>> >ad7152_filter_rate_table[][2] = {
>>> > {200, 5 + 1}, {50, 20 + 1}, {20, 50 + 1}, {17, 60 + 1},
>>> > };
>>> >
>>> >-static ssize_t ad7152_show_filter_rate_setup(struct device *dev,
>>> >- struct device_attribute *attr,
>>> >- char *buf)
>>> >-{
>>> >- struct iio_dev *indio_dev = dev_to_iio_dev(dev);
>>> >- struct ad7152_chip_info *chip = iio_priv(indio_dev);
>>> >-
>>> >- return sprintf(buf, "%d\n",
>>> >- ad7152_filter_rate_table[chip->filter_rate_setup][0]);
>>> >-}
>>> >-
>>> >-static ssize_t ad7152_store_filter_rate_setup(struct device *dev,
>>> >- struct device_attribute *attr,
>>> >- const char *buf,
>>> >- size_t len)
>>> >-{
>>> >- struct iio_dev *indio_dev = dev_to_iio_dev(dev);
>>> >- struct ad7152_chip_info *chip = iio_priv(indio_dev);
>>> >- u8 data;
>>> >- int ret, i;
>>> >-
>>> >- ret = kstrtou8(buf, 10, &data);
>>> >- if (ret < 0)
>>> >- return ret;
>>> >-
>>> >- for (i = 0; i < ARRAY_SIZE(ad7152_filter_rate_table); i++)
>>> >- if (data >= ad7152_filter_rate_table[i][0])
>>> >- break;
>>> >-
>>> >- if (i >= ARRAY_SIZE(ad7152_filter_rate_table))
>>> >- i = ARRAY_SIZE(ad7152_filter_rate_table) - 1;
>>> >-
>>> >- mutex_lock(&indio_dev->mlock);
>>> >- ret = i2c_smbus_write_byte_data(chip->client,
>>> >- AD7152_REG_CFG2, AD7152_CFG2_OSR(i));
>>> >- if (ret < 0) {
>>> >- mutex_unlock(&indio_dev->mlock);
>>> >- return ret;
>>> >- }
>>> >-
>>> >- chip->filter_rate_setup = i;
>>> >- mutex_unlock(&indio_dev->mlock);
>>> >-
>>> >- return len;
>>> >-}
>>> >-
>>> >-static IIO_DEV_ATTR_SAMP_FREQ(S_IRUGO | S_IWUSR,
>>> >- ad7152_show_filter_rate_setup,
>>> >- ad7152_store_filter_rate_setup);
>>> >-
>>> > static IIO_CONST_ATTR_SAMP_FREQ_AVAIL("200 50 20 17");
>>> >
>>> > static IIO_CONST_ATTR(in_capacitance_scale_available,
>>> > "0.000061050 0.000030525 0.000015263 0.000007631");
>>> >
>>> > static struct attribute *ad7152_attributes[] = {
>>> >- &iio_dev_attr_sampling_frequency.dev_attr.attr,
>>> > &iio_dev_attr_in_capacitance0_calibbias_calibration.dev_attr.attr,
>>> > &iio_dev_attr_in_capacitance1_calibbias_calibration.dev_attr.attr,
>>> > &iio_dev_attr_in_capacitance0_calibscale_calibration.dev_attr.attr,
>>> >@@ -247,6 +197,50 @@ static const int ad7152_scale_table[] = {
>>> > 30525, 7631, 15263, 61050
>>> > };
>>> >
>>> >+/**
>>> >+ * read_raw handler for IIO_CHAN_INFO_SAMP_FREQ
>>> >+ *
>>> >+ * lock must be held
>>> >+ **/
>>> >+static int ad7152_read_raw_samp_freq(struct device *dev, int *val)
>>> >+{
>>> >+ struct ad7152_chip_info *chip = iio_priv(dev_to_iio_dev(dev));
>>> >+
>>> >+ *val = ad7152_filter_rate_table[chip->filter_rate_setup][0];
>>> >+
>>> >+ return 0;
>>> >+}
>>> >+
>>> >+/**
>>> >+ * write_raw handler for IIO_CHAN_INFO_SAMP_FREQ
>>> >+ *
>>> >+ * lock must be held
>>> >+ **/
>>> >+static int ad7152_write_raw_samp_freq(struct device *dev, int val)
>>> >+{
>>> >+ struct iio_dev *indio_dev = dev_to_iio_dev(dev);
>>> >+ struct ad7152_chip_info *chip = iio_priv(indio_dev);
>>> >+ u8 data;
>>> >+ int ret, i;
>>> >+
>>> >+ for (i = 0; i < ARRAY_SIZE(ad7152_filter_rate_table); i++)
>>> >+ if (data >= ad7152_filter_rate_table[i][0])
>>> >+ break;
>>> >+
>>> >+ if (i >= ARRAY_SIZE(ad7152_filter_rate_table))
>>> >+ i = ARRAY_SIZE(ad7152_filter_rate_table) - 1;
>>> >+
>>> >+ mutex_lock(&chip->state_lock);
>>> >+ ret = i2c_smbus_write_byte_data(chip->client,
>>> >+ AD7152_REG_CFG2, AD7152_CFG2_OSR(i));
>>> >+ if (ret < 0)
>>> >+ return ret;
>>> >+
>>> >+ chip->filter_rate_setup = i;
>>> >+ mutex_unlock(&chip->state_lock);
>>> >+
>>> >+ return ret;
>>> >+}
>>> > static int ad7152_write_raw(struct iio_dev *indio_dev,
>>> > struct iio_chan_spec const *chan,
>>> > int val,
>>> >@@ -309,6 +303,16 @@ static int ad7152_write_raw(struct iio_dev
>>> >*indio_dev,
>>> >
>>> > ret = 0;
>>> > break;
>>> >+ case IIO_CHAN_INFO_SAMP_FREQ:
>>> >+ if (val2)
>>> >+ return -EINVAL;
>>> >+
>>> >+ ret = ad7152_write_raw_samp_freq(&indio_dev->dev, val);
>>> >+ if (ret < 0)
>>> >+ goto out;
>>> >+
>>> >+ ret = 0;
>>> >+ break;
>>> > default:
>>> > ret = -EINVAL;
>>> > }
>>> >@@ -403,6 +407,13 @@ static int ad7152_read_raw(struct iio_dev
>>> >*indio_dev,
>>> >
>>> > ret = IIO_VAL_INT_PLUS_NANO;
>>> > break;
>>> >+ case IIO_CHAN_INFO_SAMP_FREQ:
>>> >+ ret = ad7152_read_raw_samp_freq(&indio_dev->dev, val);
>>> >+ if (ret < 0)
>>> >+ goto out;
>>> >+
>>> >+ ret = IIO_VAL_INT;
>>> >+ break;
>>> > default:
>>> > ret = -EINVAL;
>>> > }
>>> >@@ -440,6 +451,7 @@ static const struct iio_chan_spec ad7152_channels[]
>>> >= {
>>> > BIT(IIO_CHAN_INFO_CALIBSCALE) |
>>> > BIT(IIO_CHAN_INFO_CALIBBIAS) |
>>> > BIT(IIO_CHAN_INFO_SCALE),
>>> >+ .info_mask_shared_by_all = BIT(IIO_CHAN_INFO_SAMP_FREQ),
>>> > }, {
>>> > .type = IIO_CAPACITANCE,
>>> > .differential = 1,
>>> >@@ -450,6 +462,7 @@ static const struct iio_chan_spec ad7152_channels[]
>>> >= {
>>> > BIT(IIO_CHAN_INFO_CALIBSCALE) |
>>> > BIT(IIO_CHAN_INFO_CALIBBIAS) |
>>> > BIT(IIO_CHAN_INFO_SCALE),
>>> >+ .info_mask_shared_by_all = BIT(IIO_CHAN_INFO_SAMP_FREQ),
>>> > }, {
>>> > .type = IIO_CAPACITANCE,
>>> > .indexed = 1,
>>> >@@ -458,6 +471,7 @@ static const struct iio_chan_spec ad7152_channels[]
>>> >= {
>>> > BIT(IIO_CHAN_INFO_CALIBSCALE) |
>>> > BIT(IIO_CHAN_INFO_CALIBBIAS) |
>>> > BIT(IIO_CHAN_INFO_SCALE),
>>> >+ .info_mask_shared_by_all = BIT(IIO_CHAN_INFO_SAMP_FREQ),
>>> > }, {
>>> > .type = IIO_CAPACITANCE,
>>> > .differential = 1,
>>> >@@ -468,6 +482,7 @@ static const struct iio_chan_spec ad7152_channels[]
>>> >= {
>>> > BIT(IIO_CHAN_INFO_CALIBSCALE) |
>>> > BIT(IIO_CHAN_INFO_CALIBBIAS) |
>>> > BIT(IIO_CHAN_INFO_SCALE),
>>> >+ .info_mask_shared_by_all = BIT(IIO_CHAN_INFO_SAMP_FREQ),
>>> > }
>>> > };
>>> > /*
>>>
>>> --
>>> Sent from my Android device with K-9 Mail. Please excuse my brevity.
>>> --
>>> 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
^ permalink raw reply [flat|nested] 4+ messages in thread
end of thread, other threads:[~2016-10-10 11:22 UTC | newest]
Thread overview: 4+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2016-10-09 18:26 [PATCH v4] staging: iio: cdc: ad7152: Implement IIO_CHAN_INFO_SAMP_FREQ attribute sayli karnik
[not found] ` <585EF4C9-62BF-45FF-916B-EE0B9412585A@jic23.retrosnub.co.uk>
2016-10-10 10:33 ` Eva Rachel Retuya
2016-10-10 10:56 ` sayli karnik
2016-10-10 11:22 ` jic23
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.