[<prev] [next>] [<thread-prev] [day] [month] [year] [list]
Message-ID: <20210122155805.83012-5-alexandru.ardelean@analog.com>
Date: Fri, 22 Jan 2021 17:57:57 +0200
From: Alexandru Ardelean <alexandru.ardelean@...log.com>
To: <linux-kernel@...r.kernel.org>, <linux-iio@...r.kernel.org>
CC: <lars@...afoo.de>, <Michael.Hennerich@...log.com>,
<jic23@...nel.org>, <nuno.sa@...log.com>,
<dragos.bogdan@...log.com>,
Alexandru Ardelean <alexandru.ardelean@...log.com>
Subject: [PATCH v2 04/12] iio: buffer: add index to the first IIO buffer dir and symlink it back
This change makes it so that the first buffer directory is named 'buffer0'
and moves the 'scan_elements' under it.
For backwards compatibility these folders are symlinked back to the
original folders.
Signed-off-by: Alexandru Ardelean <alexandru.ardelean@...log.com>
---
drivers/iio/industrialio-buffer.c | 66 +++++++++++++++++++++----------
1 file changed, 46 insertions(+), 20 deletions(-)
diff --git a/drivers/iio/industrialio-buffer.c b/drivers/iio/industrialio-buffer.c
index 0f470d902790..628d78125126 100644
--- a/drivers/iio/industrialio-buffer.c
+++ b/drivers/iio/industrialio-buffer.c
@@ -1369,7 +1369,8 @@ static void iio_sysfs_del_attrs(struct kobject *kobj, struct attribute **ptr)
* IIO device.
*/
static int __iio_buffer_alloc_sysfs_and_mask(struct iio_buffer *buffer,
- struct iio_dev *indio_dev)
+ struct iio_dev *indio_dev,
+ unsigned int idx)
{
struct iio_dev_attr *p;
struct attribute **attr;
@@ -1401,7 +1402,7 @@ static int __iio_buffer_alloc_sysfs_and_mask(struct iio_buffer *buffer,
buffer->buffer_attrs = attr;
ret = kobject_init_and_add(&buffer->buffer_dir, &iio_buffer_dir_ktype,
- &indio_dev->dev.kobj, "buffer");
+ &indio_dev->dev.kobj, "buffer%u", idx);
if (ret)
goto error_buffer_free_attrs;
@@ -1446,7 +1447,7 @@ static int __iio_buffer_alloc_sysfs_and_mask(struct iio_buffer *buffer,
}
ret = kobject_init_and_add(&buffer->scan_el_dir, &iio_scan_el_dir_ktype,
- &indio_dev->dev.kobj, "scan_elements");
+ &buffer->buffer_dir, "scan_elements");
if (ret)
goto error_free_scan_attrs;
@@ -1477,6 +1478,22 @@ static int __iio_buffer_alloc_sysfs_and_mask(struct iio_buffer *buffer,
return ret;
}
+/**
+ * __iio_buffer_free_sysfs_and_mask() - Free sysfs objects for a single IIO buffer
+ * @buffer: the iio buffer for which to destroy the objects
+ */
+static void __iio_buffer_free_sysfs_and_mask(struct iio_buffer *buffer)
+{
+ iio_sysfs_del_attrs(&buffer->scan_el_dir, buffer->scan_el_attrs);
+ kobject_put(&buffer->scan_el_dir);
+ kfree(buffer->scan_el_attrs);
+ bitmap_free(buffer->scan_mask);
+ iio_sysfs_del_attrs(&buffer->buffer_dir, buffer->buffer_attrs);
+ iio_free_chan_devattr_list(&buffer->scan_el_dev_attr_list);
+ kobject_put(&buffer->buffer_dir);
+ kfree(buffer->buffer_attrs);
+}
+
/**
* iio_buffer_alloc_sysfs_and_mask() - Allocate sysfs attributes to attached buffers
* @indio_dev: the iio device for which to create the buffer sysfs attributes
@@ -1492,7 +1509,7 @@ int iio_buffer_alloc_sysfs_and_mask(struct iio_dev *indio_dev)
{
struct iio_buffer *buffer = indio_dev->buffer;
const struct iio_chan_spec *channels;
- int i;
+ int i, ret;
channels = indio_dev->channels;
if (channels) {
@@ -1506,23 +1523,29 @@ int iio_buffer_alloc_sysfs_and_mask(struct iio_dev *indio_dev)
if (!buffer)
return 0;
- return __iio_buffer_alloc_sysfs_and_mask(buffer, indio_dev);
-}
+ ret = __iio_buffer_alloc_sysfs_and_mask(buffer, indio_dev, 0);
+ if (ret)
+ return ret;
-/**
- * __iio_buffer_free_sysfs_and_mask() - Free sysfs objects for a single IIO buffer
- * @buffer: the iio buffer for which to destroy the objects
- */
-static void __iio_buffer_free_sysfs_and_mask(struct iio_buffer *buffer)
-{
- iio_sysfs_del_attrs(&buffer->scan_el_dir, buffer->scan_el_attrs);
- kobject_put(&buffer->scan_el_dir);
- kfree(buffer->scan_el_attrs);
- bitmap_free(buffer->scan_mask);
- iio_sysfs_del_attrs(&buffer->buffer_dir, buffer->buffer_attrs);
- iio_free_chan_devattr_list(&buffer->scan_el_dev_attr_list);
- kobject_put(&buffer->buffer_dir);
- kfree(buffer->buffer_attrs);
+ ret = sysfs_create_link(&indio_dev->dev.kobj,
+ &indio_dev->buffer->buffer_dir,
+ "buffer");
+ if (ret)
+ goto error_free_sysfs_and_mask;
+
+ ret = sysfs_create_link(&indio_dev->dev.kobj,
+ &indio_dev->buffer->scan_el_dir,
+ "scan_elements");
+ if (ret)
+ goto error_remove_buffer_dir_link;
+
+ return 0;
+
+error_remove_buffer_dir_link:
+ sysfs_remove_link(&indio_dev->dev.kobj, "buffer");
+error_free_sysfs_and_mask:
+ __iio_buffer_free_sysfs_and_mask(buffer);
+ return ret;
}
/**
@@ -1538,6 +1561,9 @@ void iio_buffer_free_sysfs_and_mask(struct iio_dev *indio_dev)
if (!buffer)
return;
+ sysfs_remove_link(&indio_dev->dev.kobj, "scan_elements");
+ sysfs_remove_link(&indio_dev->dev.kobj, "buffer");
+
__iio_buffer_free_sysfs_and_mask(buffer);
}
--
2.17.1
Powered by blists - more mailing lists