From: Jonathan Cameron <jic23@kernel.org>
To: Alexandru Ardelean <alexandru.ardelean@analog.com>
Cc: <linux-iio@vger.kernel.org>, <linux-kernel@vger.kernel.org>,
<lars@metafoo.de>
Subject: Re: [RFC PATCH 1/4] iio: Move scan mask management to the core
Date: Sun, 26 Apr 2020 11:22:50 +0100 [thread overview]
Message-ID: <20200426112250.36bb8c6b@archlinux> (raw)
In-Reply-To: <20200426104538.657a2d9a@archlinux>
On Sun, 26 Apr 2020 10:45:38 +0100
Jonathan Cameron <jic23@kernel.org> wrote:
> On Fri, 24 Apr 2020 08:18:15 +0300
> Alexandru Ardelean <alexandru.ardelean@analog.com> wrote:
>
> > From: Lars-Peter Clausen <lars@metafoo.de>
> >
> > Let the core handle the buffer scan mask management including allocation
> > and channel selection. Having this handled in a central place rather than
> > open-coding it all over the place will make it easier to change the
> > implementation.
> >
> > Signed-off-by: Lars-Peter Clausen <lars@metafoo.de>
> > Signed-off-by: Alexandru Ardelean <alexandru.ardelean@analog.com>
>
> Hi Alex,
>
> For some reason I only have patch 1 of this series of 4.
Ah. My email went crazy. Rest of series now turned up from somewhere :)
Thanks,
J
>
> This one looks reasonable to me as abstracts away how it is implemented
> which is good. A few comments and a question inline.
>
> Jonathan
>
>
> > ---
> > drivers/iio/buffer/industrialio-buffer-cb.c | 17 ++++------
> > drivers/iio/industrialio-buffer.c | 36 +++++++++++++++------
> > drivers/iio/inkern.c | 15 +++++++++
> > include/linux/iio/consumer.h | 10 ++++++
> > 4 files changed, 58 insertions(+), 20 deletions(-)
> >
> > diff --git a/drivers/iio/buffer/industrialio-buffer-cb.c b/drivers/iio/buffer/industrialio-buffer-cb.c
> > index 47c96f7f4976..b50f1f48cac6 100644
> > --- a/drivers/iio/buffer/industrialio-buffer-cb.c
> > +++ b/drivers/iio/buffer/industrialio-buffer-cb.c
> > @@ -33,8 +33,7 @@ static int iio_buffer_cb_store_to(struct iio_buffer *buffer, const void *data)
> > static void iio_buffer_cb_release(struct iio_buffer *buffer)
> > {
> > struct iio_cb_buffer *cb_buff = buffer_to_cb_buffer(buffer);
> > -
> > - bitmap_free(cb_buff->buffer.scan_mask);
> > + iio_buffer_free_scanmask(buffer);
> > kfree(cb_buff);
> > }
> >
> > @@ -72,27 +71,25 @@ struct iio_cb_buffer *iio_channel_get_all_cb(struct device *dev,
> > }
> >
> > cb_buff->indio_dev = cb_buff->channels[0].indio_dev;
> > - cb_buff->buffer.scan_mask = bitmap_zalloc(cb_buff->indio_dev->masklength,
> > - GFP_KERNEL);
> > - if (cb_buff->buffer.scan_mask == NULL) {
> > - ret = -ENOMEM;
> > +
> > + ret = iio_buffer_alloc_scanmask(&cb_buff->buffer, cb_buff->indio_dev);
> > + if (ret)
> > goto error_release_channels;
> > - }
> > +
> > chan = &cb_buff->channels[0];
> > while (chan->indio_dev) {
> > if (chan->indio_dev != cb_buff->indio_dev) {
> > ret = -EINVAL;
> > goto error_free_scan_mask;
> > }
> > - set_bit(chan->channel->scan_index,
> > - cb_buff->buffer.scan_mask);
> > + iio_buffer_channel_enable(&cb_buff->buffer, chan);
> > chan++;
> > }
> >
> > return cb_buff;
> >
> > error_free_scan_mask:
> > - bitmap_free(cb_buff->buffer.scan_mask);
> > + iio_buffer_free_scanmask(&cb_buff->buffer);
> > error_release_channels:
> > iio_channel_release_all(cb_buff->channels);
> > error_free_cb_buff:
> > diff --git a/drivers/iio/industrialio-buffer.c b/drivers/iio/industrialio-buffer.c
> > index 221157136af6..c06691281287 100644
> > --- a/drivers/iio/industrialio-buffer.c
> > +++ b/drivers/iio/industrialio-buffer.c
> > @@ -206,6 +206,26 @@ void iio_buffer_init(struct iio_buffer *buffer)
> > }
> > EXPORT_SYMBOL(iio_buffer_init);
> >
> > +int iio_buffer_alloc_scanmask(struct iio_buffer *buffer,
> > + struct iio_dev *indio_dev)
> I'm not sure passing the indio_dev in here makes sense as it
> obscures that all we are getting from it is the masklength.
> May be better to pass that explicitly.
>
> > +{
> > + if (!indio_dev->masklength)
> > + return 0;
>
> This is a bit of an oddity of the old code. Any idea why we
> allow things to continue with a masklength of 0? Seems to me
> that it is thoroughly broken if that occurs!
>
> > +
> > + buffer->scan_mask = bitmap_zalloc(indio_dev->masklength, GFP_KERNEL);
> > + if (buffer->scan_mask == NULL)
> > + return -ENOMEM;
> > +
> > + return 0;
> > +}
> > +EXPORT_SYMBOL_GPL(iio_buffer_alloc_scanmask);
> > +
> > +void iio_buffer_free_scanmask(struct iio_buffer *buffer)
> > +{
> > + bitmap_free(buffer->scan_mask);
> > +}
> > +EXPORT_SYMBOL_GPL(iio_buffer_free_scanmask);
> > +
> > /**
> > * iio_buffer_set_attrs - Set buffer specific attributes
> > * @buffer: The buffer for which we are setting attributes
> > @@ -1301,14 +1321,10 @@ int iio_buffer_alloc_sysfs_and_mask(struct iio_dev *indio_dev)
> > indio_dev->scan_index_timestamp =
> > channels[i].scan_index;
> > }
> > - if (indio_dev->masklength && buffer->scan_mask == NULL) {
> > - buffer->scan_mask = bitmap_zalloc(indio_dev->masklength,
> > - GFP_KERNEL);
> > - if (buffer->scan_mask == NULL) {
> > - ret = -ENOMEM;
> > - goto error_cleanup_dynamic;
> > - }
> > - }
> > +
> > + ret = iio_buffer_alloc_scanmask(buffer, indio_dev);
> > + if (ret)
> > + goto error_cleanup_dynamic;
> > }
> >
> > buffer->scan_el_group.name = iio_scan_elements_group_name;
> > @@ -1329,7 +1345,7 @@ int iio_buffer_alloc_sysfs_and_mask(struct iio_dev *indio_dev)
> > return 0;
> >
> > error_free_scan_mask:
> > - bitmap_free(buffer->scan_mask);
> > + iio_buffer_free_scanmask(buffer);
> > error_cleanup_dynamic:
> > iio_free_chan_devattr_list(&buffer->scan_el_dev_attr_list);
> > kfree(indio_dev->buffer->buffer_group.attrs);
> > @@ -1342,7 +1358,7 @@ void iio_buffer_free_sysfs_and_mask(struct iio_dev *indio_dev)
> > if (!indio_dev->buffer)
> > return;
> >
> > - bitmap_free(indio_dev->buffer->scan_mask);
> > + iio_buffer_free_scanmask(indio_dev->buffer);
> > kfree(indio_dev->buffer->buffer_group.attrs);
> > kfree(indio_dev->buffer->scan_el_group.attrs);
> > iio_free_chan_devattr_list(&indio_dev->buffer->scan_el_dev_attr_list);
> > diff --git a/drivers/iio/inkern.c b/drivers/iio/inkern.c
> > index ede99e0d5371..f35cb9985edc 100644
> > --- a/drivers/iio/inkern.c
> > +++ b/drivers/iio/inkern.c
> > @@ -11,6 +11,7 @@
> >
> > #include <linux/iio/iio.h>
> > #include "iio_core.h"
> > +#include <linux/iio/buffer_impl.h>
> > #include <linux/iio/machine.h>
> > #include <linux/iio/driver.h>
> > #include <linux/iio/consumer.h>
> > @@ -857,6 +858,20 @@ int iio_write_channel_raw(struct iio_channel *chan, int val)
> > }
> > EXPORT_SYMBOL_GPL(iio_write_channel_raw);
> >
> > +void iio_buffer_channel_enable(struct iio_buffer *buffer,
> > + const struct iio_channel *chan)
> > +{
> > + set_bit(chan->channel->scan_index, buffer->scan_mask);
> > +}
> > +EXPORT_SYMBOL_GPL(iio_buffer_channel_enable);
> > +
> > +void iio_buffer_channel_disable(struct iio_buffer *buffer,
> > + const struct iio_channel *chan)
> > +{
> > + clear_bit(chan->channel->scan_index, buffer->scan_mask);
> > +}
> > +EXPORT_SYMBOL_GPL(iio_buffer_channel_disable);
> > +
> > unsigned int iio_get_channel_ext_info_count(struct iio_channel *chan)
> > {
> > const struct iio_chan_spec_ext_info *ext_info;
> > diff --git a/include/linux/iio/consumer.h b/include/linux/iio/consumer.h
> > index c4118dcb8e05..dbc87c26250a 100644
> > --- a/include/linux/iio/consumer.h
> > +++ b/include/linux/iio/consumer.h
> > @@ -12,6 +12,7 @@
> >
> > struct iio_dev;
> > struct iio_chan_spec;
> > +struct iio_buffer;
> > struct device;
> >
> > /**
> > @@ -342,6 +343,15 @@ int iio_read_channel_scale(struct iio_channel *chan, int *val,
> > int iio_convert_raw_to_processed(struct iio_channel *chan, int raw,
> > int *processed, unsigned int scale);
> >
> > +void iio_buffer_channel_enable(struct iio_buffer *buffer,
> > + const struct iio_channel *chan);
> > +void iio_buffer_channel_disable(struct iio_buffer *buffer,
> > + const struct iio_channel *chan);
> > +
> > +int iio_buffer_alloc_scanmask(struct iio_buffer *buffer,
> > + struct iio_dev *indio_dev);
> > +void iio_buffer_free_scanmask(struct iio_buffer *buffer);
> > +
> > /**
> > * iio_get_channel_ext_info_count() - get number of ext_info attributes
> > * connected to the channel.
>
next prev parent reply other threads:[~2020-04-26 10:22 UTC|newest]
Thread overview: 18+ messages / expand[flat|nested] mbox.gz Atom feed top
2020-04-24 5:18 [RFC PATCH 0/4] iio: scan_mask rework to track enabled channels on per-channel basis Alexandru Ardelean
2020-04-24 5:18 ` [RFC PATCH 1/4] iio: Move scan mask management to the core Alexandru Ardelean
2020-04-26 9:45 ` Jonathan Cameron
2020-04-26 10:22 ` Jonathan Cameron [this message]
2020-04-27 6:25 ` Ardelean, Alexandru
2020-05-02 18:12 ` Jonathan Cameron
2020-04-24 5:18 ` [RFC PATCH 2/4] iio: hw_consumer: use new scanmask functions Alexandru Ardelean
2020-04-24 5:18 ` [RFC PATCH 3/4] iio: Allow channels to share storage elements Alexandru Ardelean
2020-04-26 10:28 ` Jonathan Cameron
2020-04-24 5:18 ` [RFC PATCH 4/4] iio: Track enabled channels on a per channel basis Alexandru Ardelean
2020-04-24 7:51 ` Sa, Nuno
2020-04-26 10:50 ` Jonathan Cameron
2020-04-27 12:09 ` Sa, Nuno
2020-05-02 17:19 ` Jonathan Cameron
2020-05-04 8:24 ` Sa, Nuno
2020-05-04 9:28 ` Jonathan Cameron
2020-04-26 10:40 ` Jonathan Cameron
2020-04-24 7:51 ` [RFC PATCH 0/4] iio: scan_mask rework to track enabled channels on per-channel basis Sa, Nuno
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20200426112250.36bb8c6b@archlinux \
--to=jic23@kernel.org \
--cc=alexandru.ardelean@analog.com \
--cc=lars@metafoo.de \
--cc=linux-iio@vger.kernel.org \
--cc=linux-kernel@vger.kernel.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
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.