All of lore.kernel.org
 help / color / mirror / Atom feed
From: Alexandru Ardelean <alexandru.ardelean@analog.com>
To: <linux-iio@vger.kernel.org>, <linux-kernel@vger.kernel.org>
Cc: <jic23@kernel.org>, <lars@metafoo.de>,
	Alexandru Ardelean <alexandru.ardelean@analog.com>
Subject: [RFC PATCH 14/14] iio: buffer: convert single buffer to list of buffers
Date: Fri, 8 May 2020 16:53:48 +0300	[thread overview]
Message-ID: <20200508135348.15229-15-alexandru.ardelean@analog.com> (raw)
In-Reply-To: <20200508135348.15229-1-alexandru.ardelean@analog.com>

WIP

Time to add support for multiple buffers.
At this point it should be just managing a list.

Signed-off-by: Alexandru Ardelean <alexandru.ardelean@analog.com>
---
 drivers/iio/industrialio-buffer.c | 74 ++++++++++++++++++++++---------
 drivers/iio/industrialio-core.c   |  1 +
 include/linux/iio/buffer_impl.h   |  3 ++
 include/linux/iio/iio.h           |  2 +
 4 files changed, 58 insertions(+), 22 deletions(-)

diff --git a/drivers/iio/industrialio-buffer.c b/drivers/iio/industrialio-buffer.c
index aa2f46c0949f..c335484a6651 100644
--- a/drivers/iio/industrialio-buffer.c
+++ b/drivers/iio/industrialio-buffer.c
@@ -244,12 +244,13 @@ static int iio_buffer_chrdev_release(struct inode *inode, struct file *filp)
  */
 void iio_buffer_wakeup_poll(struct iio_dev *indio_dev)
 {
-	struct iio_buffer *buffer = indio_dev->buffer;
+	struct iio_buffer *b;
 
-	if (!buffer)
+	if (list_empty(&indio_dev->attached_buffers))
 		return;
 
-	wake_up(&buffer->pollq);
+	list_for_each_entry(b, &indio_dev->attached_buffers, attached_entry)
+		wake_up(&b->pollq);
 }
 
 void iio_buffer_init(struct iio_buffer *buffer)
@@ -1547,10 +1548,27 @@ static int iio_device_link_legacy_folders(struct iio_dev *indio_dev,
 	return ret;
 }
 
+static void __iio_device_buffers_cleanup(struct iio_dev *indio_dev, int idx)
+{
+	struct iio_buffer *b;
+
+	if (list_empty(&indio_dev->attached_buffers))
+		return;
+
+	list_for_each_entry(b, &indio_dev->attached_buffers, attached_entry) {
+		if (idx == 0)
+			break;
+
+		iio_device_buffer_cleanup(b);
+		if (idx > 0)
+			idx--;
+	}
+}
+
 int iio_device_buffers_init(struct iio_dev *indio_dev)
 {
-	struct iio_buffer *buffer = indio_dev->buffer;
 	const struct iio_chan_spec *channels;
+	struct iio_buffer *b;
 	int i, ret;
 
 	channels = indio_dev->channels;
@@ -1562,32 +1580,38 @@ int iio_device_buffers_init(struct iio_dev *indio_dev)
 		indio_dev->masklength = ml;
 	}
 
-	if (!buffer)
+	if (list_empty(&indio_dev->attached_buffers))
 		return 0;
 
-	ret = iio_device_buffer_init(indio_dev, buffer, 0);
-	if (ret)
-		return ret;
+	i = 0;
+	list_for_each_entry(b, &indio_dev->attached_buffers, attached_entry) {
+		ret = iio_device_buffer_init(indio_dev, b, i);
+		if (ret)
+			goto error_buffers_cleanup;
 
-	ret = iio_device_link_legacy_folders(indio_dev, buffer);
-	if (ret)
-		goto error_buffers_cleanup;
+		if (i == 0) {
+			ret = iio_device_link_legacy_folders(indio_dev, b);
+			if (ret) {
+				iio_device_buffer_cleanup(b);
+				goto error_buffers_cleanup;
+			}
+		}
+		i++;
+	}
 
 	return 0;
 
 error_buffers_cleanup:
-	iio_device_buffer_cleanup(buffer);
-	return 0;
+	__iio_device_buffers_cleanup(indio_dev, i);
+	return ret;
 }
 
 void iio_device_buffers_cleanup(struct iio_dev *indio_dev)
 {
-	struct iio_buffer *buffer = indio_dev->buffer;
-
 	sysfs_remove_link(&indio_dev->dev.kobj, "buffer");
 	sysfs_remove_link(&indio_dev->dev.kobj, "scan_elements");
 
-	iio_device_buffer_cleanup(buffer);
+	__iio_device_buffers_cleanup(indio_dev, -1);
 }
 
 static const struct file_operations iio_buffer_fileops = {
@@ -1615,12 +1639,13 @@ void iio_device_buffer_attach_chrdev(struct iio_dev *indio_dev)
 
 void iio_device_buffers_put(struct iio_dev *indio_dev)
 {
-	struct iio_buffer *buffer = indio_dev->buffer;
+	struct iio_buffer *b;
 
-	if (!buffer)
+	if (list_empty(&indio_dev->attached_buffers))
 		return;
 
-	iio_buffer_put(buffer);
+	list_for_each_entry(b, &indio_dev->attached_buffers, attached_entry)
+		iio_buffer_put(b);
 }
 
 /**
@@ -1733,7 +1758,7 @@ void iio_buffer_put(struct iio_buffer *buffer)
 EXPORT_SYMBOL_GPL(iio_buffer_put);
 
 /**
- * iio_device_attach_buffer - Attach a buffer to a IIO device
+ * iio_device_attach_buffer_dir - Attach a buffer to a IIO device direction
  * @indio_dev: The device the buffer should be attached to
  * @buffer: The buffer to attach to the device
  *
@@ -1744,8 +1769,13 @@ EXPORT_SYMBOL_GPL(iio_buffer_put);
 void iio_device_attach_buffer(struct iio_dev *indio_dev,
 			      struct iio_buffer *buffer)
 {
-	indio_dev->buffer = iio_buffer_get(buffer);
+	buffer = iio_buffer_get(buffer);
+	buffer->indio_dev = indio_dev;
+
+	/* keep this for legacy */
+	if (!indio_dev->buffer)
+		indio_dev->buffer = buffer;
 
-	indio_dev->buffer->indio_dev = indio_dev;
+	list_add_tail(&buffer->attached_entry, &indio_dev->attached_buffers);
 }
 EXPORT_SYMBOL_GPL(iio_device_attach_buffer);
diff --git a/drivers/iio/industrialio-core.c b/drivers/iio/industrialio-core.c
index b27fabf13e9c..067e5de76b6c 100644
--- a/drivers/iio/industrialio-core.c
+++ b/drivers/iio/industrialio-core.c
@@ -1534,6 +1534,7 @@ struct iio_dev *iio_device_alloc(int sizeof_priv)
 	}
 	dev_set_name(&dev->dev, "iio:device%d", dev->id);
 	INIT_LIST_HEAD(&dev->buffer_list);
+	INIT_LIST_HEAD(&dev->attached_buffers);
 	INIT_LIST_HEAD(&dev->ioctl_handlers);
 
 	return dev;
diff --git a/include/linux/iio/buffer_impl.h b/include/linux/iio/buffer_impl.h
index e8203b6d51a1..9ee3a7c0a657 100644
--- a/include/linux/iio/buffer_impl.h
+++ b/include/linux/iio/buffer_impl.h
@@ -130,6 +130,9 @@ struct iio_buffer {
 	/* @demux_bounce: Buffer for doing gather from incoming scan. */
 	void *demux_bounce;
 
+	/* @attached_buffers: Entry in the devices list of attached buffers. */
+	struct list_head attached_entry;
+
 	/* @buffer_list: Entry in the devices list of current buffers. */
 	struct list_head buffer_list;
 
diff --git a/include/linux/iio/iio.h b/include/linux/iio/iio.h
index 671f5818fa67..32ba1a303454 100644
--- a/include/linux/iio/iio.h
+++ b/include/linux/iio/iio.h
@@ -492,6 +492,7 @@ struct iio_buffer_setup_ops {
  * @event_interface:	[INTERN] event chrdevs associated with interrupt lines
  * @buffer:		[DRIVER] any buffer present
  * @buffer_list:	[INTERN] list of all buffers currently attached
+ * @attached_buffers:	[INTERN] list of all attached buffers
  * @scan_bytes:		[INTERN] num bytes captured to be fed to buffer demux
  * @mlock:		[INTERN] lock used to prevent simultaneous device state
  *			changes
@@ -536,6 +537,7 @@ struct iio_dev {
 
 	struct iio_buffer		*buffer;
 	struct list_head		buffer_list;
+	struct list_head		attached_buffers;
 	int				scan_bytes;
 	struct mutex			mlock;
 
-- 
2.17.1


  parent reply	other threads:[~2020-05-08 13:54 UTC|newest]

Thread overview: 39+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2020-05-08 13:53 [RFC PATCH 00/14] iio: buffer: add support for multiple buffers Alexandru Ardelean
2020-05-08 13:53 ` [RFC PATCH 01/14] iio: Move scan mask management to the core Alexandru Ardelean
2020-05-08 13:53 ` [RFC PATCH 02/14] iio: hw_consumer: use new scanmask functions Alexandru Ardelean
2020-05-08 13:53 ` [RFC PATCH 03/14] iio: buffer: add back-ref from iio_buffer to iio_dev Alexandru Ardelean
2020-05-08 13:53 ` [RFC PATCH 04/14] iio: core,buffer: wrap iio_buffer_put() call into iio_buffers_put() Alexandru Ardelean
2020-05-08 13:53 ` [RFC PATCH 05/14] iio: core: register chardev only if needed Alexandru Ardelean
2020-05-24 16:40   ` Jonathan Cameron
2020-05-08 13:53 ` [RFC PATCH 06/14] iio: buffer,event: duplicate chardev creation for buffers & events Alexandru Ardelean
2020-05-08 13:53 ` [RFC PATCH 07/14] iio: core: add simple centralized mechanism for ioctl() handlers Alexandru Ardelean
2020-05-24 16:45   ` Jonathan Cameron
2020-05-25  7:24     ` Ardelean, Alexandru
2020-05-08 13:53 ` [RFC PATCH 08/14] iio: core: use new common ioctl() mechanism Alexandru Ardelean
2020-05-24 16:47   ` Jonathan Cameron
2020-05-25  7:27     ` Ardelean, Alexandru
2020-05-31 15:20       ` Jonathan Cameron
2020-05-08 13:53 ` [RFC PATCH 09/14] iio: buffer: split buffer sysfs creation to take buffer as primary arg Alexandru Ardelean
2020-05-24 16:49   ` Jonathan Cameron
2020-05-25  7:28     ` Ardelean, Alexandru
2020-05-31 15:21       ` Jonathan Cameron
2020-05-08 13:53 ` [RFC PATCH 10/14] iio: buffer: remove attrcount_orig var from sysfs creation Alexandru Ardelean
2020-05-08 13:53 ` [RFC PATCH 11/14] iio: buffer: add underlying device object and convert buffers to devices Alexandru Ardelean
2020-05-08 13:53 ` [RFC PATCH 12/14] iio: buffer: symlink the scan_elements dir back into IIO device's dir Alexandru Ardelean
2020-05-08 13:53 ` [RFC PATCH 13/14] iio: unpack all iio buffer attributes correctly Alexandru Ardelean
2020-05-24 17:28   ` Jonathan Cameron
2020-05-08 13:53 ` Alexandru Ardelean [this message]
2020-05-09  8:52 ` [RFC PATCH 00/14] iio: buffer: add support for multiple buffers Lars-Peter Clausen
2020-05-10 10:09   ` Jonathan Cameron
2020-05-11 10:33     ` Ardelean, Alexandru
2020-05-11 10:37       ` Lars-Peter Clausen
2020-05-11 13:03         ` Ardelean, Alexandru
2020-05-11 13:24           ` Ardelean, Alexandru
2020-05-11 13:58             ` Lars-Peter Clausen
2020-05-11 14:56               ` Ardelean, Alexandru
2020-05-11 19:56                 ` Lars-Peter Clausen
2020-05-12  6:26                   ` Ardelean, Alexandru
2020-05-16 13:08                     ` Ardelean, Alexandru
2020-05-16 16:24                       ` Jonathan Cameron
2020-05-17  6:26                         ` Ardelean, Alexandru
2020-05-17 13:40                           ` Jonathan Cameron

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=20200508135348.15229-15-alexandru.ardelean@analog.com \
    --to=alexandru.ardelean@analog.com \
    --cc=jic23@kernel.org \
    --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.