iio: Move buffer registration to the core
authorLars-Peter Clausen <lars@metafoo.de>
Wed, 26 Nov 2014 17:55:12 +0000 (18:55 +0100)
committerJonathan Cameron <jic23@kernel.org>
Fri, 12 Dec 2014 12:28:31 +0000 (12:28 +0000)
Originally device and buffer registration were kept as separate operations
in IIO to allow to register two distinct sets of channels for buffered and
non-buffered operations. This has since already been further restricted and
the channel set registered for the buffer needs to be a subset of the
channel set registered for the device. Additionally the possibility to not
have a raw (or processed) attribute for a channel which was registered for
the device was added a while ago. This means it is possible to not register
any device level attributes for a channel even if it is registered for the
device. Also if a channel's scan_index is set to -1 and the channel is
registered for the buffer it is ignored.

So in summary it means it is possible to register the same channel array for
both the device and the buffer yet still end up with distinctive sets of
channels for both of them. This makes the argument for having to have to
manually register the channels for both the device and the buffer invalid.
Considering that the vast majority of all drivers want to register the same
set of channels for both the buffer and the device it makes sense to move
the buffer registration into the core to avoid some boiler-plate code in the
device driver setup path.

Signed-off-by: Lars-Peter Clausen <lars@metafoo.de>
Signed-off-by: Jonathan Cameron <jic23@kernel.org>
13 files changed:
drivers/iio/adc/ti_am335x_adc.c
drivers/iio/iio_core.h
drivers/iio/industrialio-buffer.c
drivers/iio/industrialio-core.c
drivers/iio/industrialio-triggered-buffer.c
drivers/staging/iio/accel/lis3l02dq_core.c
drivers/staging/iio/accel/sca3000_core.c
drivers/staging/iio/iio_simple_dummy_buffer.c
drivers/staging/iio/impedance-analyzer/ad5933.c
drivers/staging/iio/meter/ade7758.h
drivers/staging/iio/meter/ade7758_core.c
drivers/staging/iio/meter/ade7758_ring.c
include/linux/iio/buffer.h

index b730864731e8b8b11aa8bbfe0bfb913bcfa2bc0b..d550ac7d23659a30371efbd1761e01f9b6324225 100644 (file)
@@ -264,16 +264,8 @@ static int tiadc_iio_buffered_hardware_setup(struct iio_dev *indio_dev,
        indio_dev->setup_ops = setup_ops;
        indio_dev->modes |= INDIO_BUFFER_HARDWARE;
 
-       ret = iio_buffer_register(indio_dev,
-                                 indio_dev->channels,
-                                 indio_dev->num_channels);
-       if (ret)
-               goto error_free_irq;
-
        return 0;
 
-error_free_irq:
-       free_irq(irq, indio_dev);
 error_kfifo_free:
        iio_kfifo_free(indio_dev->buffer);
        return ret;
@@ -285,7 +277,6 @@ static void tiadc_iio_buffered_hardware_remove(struct iio_dev *indio_dev)
 
        free_irq(adc_dev->mfd_tscadc->irq, indio_dev);
        iio_kfifo_free(indio_dev->buffer);
-       iio_buffer_unregister(indio_dev);
 }
 
 
index 5f0ea77fe7176ee21374e1d124d70b8f663929b3..359883525ab72b463ca041207a88a60724fadfa6 100644 (file)
@@ -48,6 +48,8 @@ unsigned int iio_buffer_poll(struct file *filp,
 ssize_t iio_buffer_read_first_n_outer(struct file *filp, char __user *buf,
                                      size_t n, loff_t *f_ps);
 
+int iio_buffer_alloc_sysfs_and_mask(struct iio_dev *indio_dev);
+void iio_buffer_free_sysfs_and_mask(struct iio_dev *indio_dev);
 
 #define iio_buffer_poll_addr (&iio_buffer_poll)
 #define iio_buffer_read_first_n_outer_addr (&iio_buffer_read_first_n_outer)
@@ -60,6 +62,13 @@ void iio_buffer_wakeup_poll(struct iio_dev *indio_dev);
 #define iio_buffer_poll_addr NULL
 #define iio_buffer_read_first_n_outer_addr NULL
 
+static inline int iio_buffer_alloc_sysfs_and_mask(struct iio_dev *indio_dev)
+{
+       return 0;
+}
+
+static inline void iio_buffer_free_sysfs_and_mask(struct iio_dev *indio_dev) {}
+
 static inline void iio_disable_all_buffers(struct iio_dev *indio_dev) {}
 static inline void iio_buffer_wakeup_poll(struct iio_dev *indio_dev) {}
 
index f667e4e7ea6d79d447673ba64230ac702e9cdb22..8bb3e64eaf2cc0b5a38902439176f9fc33ccc758 100644 (file)
@@ -385,14 +385,16 @@ static int iio_buffer_add_channel_sysfs(struct iio_dev *indio_dev,
 
 static const char * const iio_scan_elements_group_name = "scan_elements";
 
-int iio_buffer_register(struct iio_dev *indio_dev,
-                       const struct iio_chan_spec *channels,
-                       int num_channels)
+int iio_buffer_alloc_sysfs_and_mask(struct iio_dev *indio_dev)
 {
        struct iio_dev_attr *p;
        struct attribute **attr;
        struct iio_buffer *buffer = indio_dev->buffer;
        int ret, i, attrn, attrcount, attrcount_orig = 0;
+       const struct iio_chan_spec *channels;
+
+       if (!buffer)
+               return 0;
 
        if (buffer->attrs)
                indio_dev->groups[indio_dev->groupcounter++] = buffer->attrs;
@@ -404,9 +406,10 @@ int iio_buffer_register(struct iio_dev *indio_dev,
        }
        attrcount = attrcount_orig;
        INIT_LIST_HEAD(&buffer->scan_el_dev_attr_list);
+       channels = indio_dev->channels;
        if (channels) {
                /* new magic */
-               for (i = 0; i < num_channels; i++) {
+               for (i = 0; i < indio_dev->num_channels; i++) {
                        if (channels[i].scan_index < 0)
                                continue;
 
@@ -463,15 +466,16 @@ error_cleanup_dynamic:
 
        return ret;
 }
-EXPORT_SYMBOL(iio_buffer_register);
 
-void iio_buffer_unregister(struct iio_dev *indio_dev)
+void iio_buffer_free_sysfs_and_mask(struct iio_dev *indio_dev)
 {
+       if (!indio_dev->buffer)
+               return;
+
        kfree(indio_dev->buffer->scan_mask);
        kfree(indio_dev->buffer->scan_el_group.attrs);
        iio_free_chan_devattr_list(&indio_dev->buffer->scan_el_dev_attr_list);
 }
-EXPORT_SYMBOL(iio_buffer_unregister);
 
 ssize_t iio_buffer_read_length(struct device *dev,
                               struct device_attribute *attr,
index 45bb3a43afacdf157667219b9ccc5766da52efe3..ee442ee482abd0618a560dad7397fd2097b06610 100644 (file)
@@ -1158,11 +1158,19 @@ int iio_device_register(struct iio_dev *indio_dev)
                        "Failed to register debugfs interfaces\n");
                return ret;
        }
+
+       ret = iio_buffer_alloc_sysfs_and_mask(indio_dev);
+       if (ret) {
+               dev_err(indio_dev->dev.parent,
+                       "Failed to create buffer sysfs interfaces\n");
+               goto error_unreg_debugfs;
+       }
+
        ret = iio_device_register_sysfs(indio_dev);
        if (ret) {
                dev_err(indio_dev->dev.parent,
                        "Failed to register sysfs interfaces\n");
-               goto error_unreg_debugfs;
+               goto error_buffer_free_sysfs;
        }
        ret = iio_device_register_eventset(indio_dev);
        if (ret) {
@@ -1195,6 +1203,8 @@ error_unreg_eventset:
        iio_device_unregister_eventset(indio_dev);
 error_free_sysfs:
        iio_device_unregister_sysfs(indio_dev);
+error_buffer_free_sysfs:
+       iio_buffer_free_sysfs_and_mask(indio_dev);
 error_unreg_debugfs:
        iio_device_unregister_debugfs(indio_dev);
        return ret;
@@ -1223,6 +1233,8 @@ void iio_device_unregister(struct iio_dev *indio_dev)
        iio_buffer_wakeup_poll(indio_dev);
 
        mutex_unlock(&indio_dev->info_exist_lock);
+
+       iio_buffer_free_sysfs_and_mask(indio_dev);
 }
 EXPORT_SYMBOL(iio_device_unregister);
 
index d6f54930b34af49185f6fa76dd41372a5214bc35..61a5d0404edf95a975d8bd4e4804c0b0c256e83e 100644 (file)
@@ -32,7 +32,7 @@ static const struct iio_buffer_setup_ops iio_triggered_buffer_setup_ops = {
  *
  * This function combines some common tasks which will normally be performed
  * when setting up a triggered buffer. It will allocate the buffer and the
- * pollfunc, as well as register the buffer with the IIO core.
+ * pollfunc.
  *
  * Before calling this function the indio_dev structure should already be
  * completely initialized, but not yet registered. In practice this means that
@@ -78,16 +78,8 @@ int iio_triggered_buffer_setup(struct iio_dev *indio_dev,
        /* Flag that polled ring buffering is possible */
        indio_dev->modes |= INDIO_BUFFER_TRIGGERED;
 
-       ret = iio_buffer_register(indio_dev,
-                                 indio_dev->channels,
-                                 indio_dev->num_channels);
-       if (ret)
-               goto error_dealloc_pollfunc;
-
        return 0;
 
-error_dealloc_pollfunc:
-       iio_dealloc_pollfunc(indio_dev->pollfunc);
 error_kfifo_free:
        iio_kfifo_free(indio_dev->buffer);
 error_ret:
@@ -101,7 +93,6 @@ EXPORT_SYMBOL(iio_triggered_buffer_setup);
  */
 void iio_triggered_buffer_cleanup(struct iio_dev *indio_dev)
 {
-       iio_buffer_unregister(indio_dev);
        iio_dealloc_pollfunc(indio_dev->pollfunc);
        iio_kfifo_free(indio_dev->buffer);
 }
index f5e145caffa9bcdc6cb388b07b5c590c8186ac93..b78c9c5d55886d08f015021bc8f954475dcce1c3 100644 (file)
@@ -716,14 +716,6 @@ static int lis3l02dq_probe(struct spi_device *spi)
        if (ret)
                return ret;
 
-       ret = iio_buffer_register(indio_dev,
-                                 lis3l02dq_channels,
-                                 ARRAY_SIZE(lis3l02dq_channels));
-       if (ret) {
-               dev_err(&spi->dev, "failed to initialize the buffer\n");
-               goto error_unreg_buffer_funcs;
-       }
-
        if (spi->irq) {
                ret = request_threaded_irq(st->us->irq,
                                           &lis3l02dq_th,
@@ -732,7 +724,7 @@ static int lis3l02dq_probe(struct spi_device *spi)
                                           "lis3l02dq",
                                           indio_dev);
                if (ret)
-                       goto error_uninitialize_buffer;
+                       goto error_unreg_buffer_funcs;
 
                ret = lis3l02dq_probe_trigger(indio_dev);
                if (ret)
@@ -756,8 +748,6 @@ error_remove_trigger:
 error_free_interrupt:
        if (spi->irq)
                free_irq(st->us->irq, indio_dev);
-error_uninitialize_buffer:
-       iio_buffer_unregister(indio_dev);
 error_unreg_buffer_funcs:
        lis3l02dq_unconfigure_buffer(indio_dev);
        return ret;
@@ -804,7 +794,6 @@ static int lis3l02dq_remove(struct spi_device *spi)
                free_irq(st->us->irq, indio_dev);
 
        lis3l02dq_remove_trigger(indio_dev);
-       iio_buffer_unregister(indio_dev);
        lis3l02dq_unconfigure_buffer(indio_dev);
 
        return 0;
index aef8c916e07bf2b10d85057b275c78b7cb7c67e5..9cd04c7147c8f1f30ed8a797b875357d4aa7807f 100644 (file)
@@ -1156,11 +1156,6 @@ static int sca3000_probe(struct spi_device *spi)
        if (ret < 0)
                return ret;
 
-       ret = iio_buffer_register(indio_dev, indio_dev->channels,
-                                 indio_dev->num_channels);
-       if (ret < 0)
-               goto error_unregister_dev;
-
        if (spi->irq) {
                ret = request_threaded_irq(spi->irq,
                                           NULL,
@@ -1169,7 +1164,7 @@ static int sca3000_probe(struct spi_device *spi)
                                           "sca3000",
                                           indio_dev);
                if (ret)
-                       goto error_unregister_ring;
+                       goto error_unregister_dev;
        }
        sca3000_register_ring_funcs(indio_dev);
        ret = sca3000_clean_setup(st);
@@ -1180,8 +1175,6 @@ static int sca3000_probe(struct spi_device *spi)
 error_free_irq:
        if (spi->irq)
                free_irq(spi->irq, indio_dev);
-error_unregister_ring:
-       iio_buffer_unregister(indio_dev);
 error_unregister_dev:
        iio_device_unregister(indio_dev);
        return ret;
@@ -1215,7 +1208,6 @@ static int sca3000_remove(struct spi_device *spi)
        if (spi->irq)
                free_irq(spi->irq, indio_dev);
        iio_device_unregister(indio_dev);
-       iio_buffer_unregister(indio_dev);
        sca3000_unconfigure_ring(indio_dev);
 
        return 0;
index 35d60d5045dcbcc9cd24f7512f47a545c20332b4..a2d72c1021197663f4fd009b9b91b2371aa2ca42 100644 (file)
@@ -172,15 +172,8 @@ int iio_simple_dummy_configure_buffer(struct iio_dev *indio_dev)
         */
        indio_dev->modes |= INDIO_BUFFER_TRIGGERED;
 
-       ret = iio_buffer_register(indio_dev, indio_dev->channels,
-                                 indio_dev->num_channels);
-       if (ret)
-               goto error_dealloc_pollfunc;
-
        return 0;
 
-error_dealloc_pollfunc:
-       iio_dealloc_pollfunc(indio_dev->pollfunc);
 error_free_buffer:
        iio_kfifo_free(indio_dev->buffer);
 error_ret:
@@ -194,7 +187,6 @@ error_ret:
  */
 void iio_simple_dummy_unconfigure_buffer(struct iio_dev *indio_dev)
 {
-       iio_buffer_unregister(indio_dev);
        iio_dealloc_pollfunc(indio_dev->pollfunc);
        iio_kfifo_free(indio_dev->buffer);
 }
index aa6a368506cd41e4fe0220a2e1cf10b36b075bc7..c50b1380b9aa3cc7d304d206f7689d7dff167c84 100644 (file)
@@ -752,23 +752,16 @@ static int ad5933_probe(struct i2c_client *client,
        if (ret)
                goto error_disable_reg;
 
-       ret = iio_buffer_register(indio_dev, ad5933_channels,
-               ARRAY_SIZE(ad5933_channels));
-       if (ret)
-               goto error_unreg_ring;
-
        ret = ad5933_setup(st);
        if (ret)
-               goto error_uninitialize_ring;
+               goto error_unreg_ring;
 
        ret = iio_device_register(indio_dev);
        if (ret)
-               goto error_uninitialize_ring;
+               goto error_unreg_ring;
 
        return 0;
 
-error_uninitialize_ring:
-       iio_buffer_unregister(indio_dev);
 error_unreg_ring:
        iio_kfifo_free(indio_dev->buffer);
 error_disable_reg:
@@ -784,7 +777,6 @@ static int ad5933_remove(struct i2c_client *client)
        struct ad5933_state *st = iio_priv(indio_dev);
 
        iio_device_unregister(indio_dev);
-       iio_buffer_unregister(indio_dev);
        iio_kfifo_free(indio_dev->buffer);
        if (!IS_ERR(st->reg))
                regulator_disable(st->reg);
index 07318203a836e86155760c7ec16c595094b37489..762d7dc0e6e2f0b6848866d1e62a6d1308ee1ca4 100644 (file)
@@ -146,7 +146,6 @@ ssize_t ade7758_read_data_from_ring(struct device *dev,
 int ade7758_configure_ring(struct iio_dev *indio_dev);
 void ade7758_unconfigure_ring(struct iio_dev *indio_dev);
 
-void ade7758_uninitialize_ring(struct iio_dev *indio_dev);
 int ade7758_set_irq(struct device *dev, bool enable);
 
 int ade7758_spi_write_reg_8(struct device *dev,
index abc60067cd720272b345ca53d57e07a182b7ce87..6e8b01104a68f168429d2ce07f762ed56e244e95 100644 (file)
@@ -885,23 +885,15 @@ static int ade7758_probe(struct spi_device *spi)
        if (ret)
                goto error_free_tx;
 
-       ret = iio_buffer_register(indio_dev,
-                                 &ade7758_channels[0],
-                                 ARRAY_SIZE(ade7758_channels));
-       if (ret) {
-               dev_err(&spi->dev, "failed to initialize the ring\n");
-               goto error_unreg_ring_funcs;
-       }
-
        /* Get the device into a sane initial state */
        ret = ade7758_initial_setup(indio_dev);
        if (ret)
-               goto error_uninitialize_ring;
+               goto error_unreg_ring_funcs;
 
        if (spi->irq) {
                ret = ade7758_probe_trigger(indio_dev);
                if (ret)
-                       goto error_uninitialize_ring;
+                       goto error_unreg_ring_funcs;
        }
 
        ret = iio_device_register(indio_dev);
@@ -913,8 +905,6 @@ static int ade7758_probe(struct spi_device *spi)
 error_remove_trigger:
        if (spi->irq)
                ade7758_remove_trigger(indio_dev);
-error_uninitialize_ring:
-       ade7758_uninitialize_ring(indio_dev);
 error_unreg_ring_funcs:
        ade7758_unconfigure_ring(indio_dev);
 error_free_tx:
@@ -932,7 +922,6 @@ static int ade7758_remove(struct spi_device *spi)
        iio_device_unregister(indio_dev);
        ade7758_stop_device(&indio_dev->dev);
        ade7758_remove_trigger(indio_dev);
-       ade7758_uninitialize_ring(indio_dev);
        ade7758_unconfigure_ring(indio_dev);
        kfree(st->tx);
        kfree(st->rx);
index c0accf8cce93f1fdbd3ad3a3d4213220ddb87b17..27c3ed6ca468d5f968d6a849587c9e14549d370e 100644 (file)
@@ -181,8 +181,3 @@ error_iio_kfifo_free:
        iio_kfifo_free(indio_dev->buffer);
        return ret;
 }
-
-void ade7758_uninitialize_ring(struct iio_dev *indio_dev)
-{
-       iio_buffer_unregister(indio_dev);
-}
index 8c8ce611949ccff5febe766b2326014207e69278..b0e006c3db43a53b16533ba02fbc433df305f318 100644 (file)
@@ -150,22 +150,6 @@ static inline int iio_push_to_buffers_with_timestamp(struct iio_dev *indio_dev,
 
 int iio_update_demux(struct iio_dev *indio_dev);
 
-/**
- * iio_buffer_register() - register the buffer with IIO core
- * @indio_dev:         device with the buffer to be registered
- * @channels:          the channel descriptions used to construct buffer
- * @num_channels:      the number of channels
- **/
-int iio_buffer_register(struct iio_dev *indio_dev,
-                       const struct iio_chan_spec *channels,
-                       int num_channels);
-
-/**
- * iio_buffer_unregister() - unregister the buffer from IIO core
- * @indio_dev:         the device with the buffer to be unregistered
- **/
-void iio_buffer_unregister(struct iio_dev *indio_dev);
-
 /**
  * iio_buffer_read_length() - attr func to get number of datums in the buffer
  **/
@@ -223,16 +207,6 @@ static inline void iio_device_attach_buffer(struct iio_dev *indio_dev,
 
 #else /* CONFIG_IIO_BUFFER */
 
-static inline int iio_buffer_register(struct iio_dev *indio_dev,
-                                          const struct iio_chan_spec *channels,
-                                          int num_channels)
-{
-       return 0;
-}
-
-static inline void iio_buffer_unregister(struct iio_dev *indio_dev)
-{}
-
 static inline void iio_buffer_get(struct iio_buffer *buffer) {}
 static inline void iio_buffer_put(struct iio_buffer *buffer) {}