staging:iio:adc:ad7298: Use new triggered buffer setup helper function
authorLars-Peter Clausen <lars@metafoo.de>
Mon, 18 Jun 2012 16:33:51 +0000 (18:33 +0200)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Tue, 19 Jun 2012 00:26:09 +0000 (17:26 -0700)
Use the new triggered buffer setup helper function to allocate and register
buffer and pollfunc.

The previous code was not passing the temperature channel to iio_buffer_register
since the temperature channel can not be used in buffered mode. With the new
helper functions it is not possible to do this, instead the scan index for the
temperature channel is set to -1 which will cause iio_buffer_register to ignore
the channel. (Also While we are at it also assign the symbolic constant instead
of the raw value to the channel address for the temperature channel).

Also as part of the conversion drop scan_timestamp being enabled by default,
since it is a left over of an earlier cleanup.

Signed-off-by: Lars-Peter Clausen <lars@metafoo.de>
Acked-by: Jonathan Cameron <jic23@kernel.org>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
drivers/staging/iio/adc/Kconfig
drivers/staging/iio/adc/ad7298.h
drivers/staging/iio/adc/ad7298_core.c
drivers/staging/iio/adc/ad7298_ring.c

index 7cdf421e76eeeb7f9049510ce28cb1d0c11c57b7..bb6fffd0d3732b4b67863fb9f4b7229726f2f54a 100644 (file)
@@ -13,7 +13,7 @@ config AD7291
 config AD7298
        tristate "Analog Devices AD7298 ADC driver"
        depends on SPI
-       select IIO_KFIFO_BUF if IIO_BUFFER
+       select IIO_TRIGGERED_BUFFER if IIO_BUFFER
        help
          Say yes here to build support for Analog Devices AD7298
          8 Channel ADC with temperature sensor.
index 5051a7e4d4fd8f6f0a92e93d96de267589e58855..18f27872300207b66cff69e32ba4021772209954 100644 (file)
@@ -55,6 +55,8 @@ struct ad7298_state {
 #ifdef CONFIG_IIO_BUFFER
 int ad7298_register_ring_funcs_and_init(struct iio_dev *indio_dev);
 void ad7298_ring_cleanup(struct iio_dev *indio_dev);
+int ad7298_update_scan_mode(struct iio_dev *indio_dev,
+       const unsigned long *active_scan_mask);
 #else /* CONFIG_IIO_BUFFER */
 
 static inline int
@@ -66,5 +68,8 @@ ad7298_register_ring_funcs_and_init(struct iio_dev *indio_dev)
 static inline void ad7298_ring_cleanup(struct iio_dev *indio_dev)
 {
 }
+
+#define ad7298_update_scan_mode NULL
+
 #endif /* CONFIG_IIO_BUFFER */
 #endif /* IIO_ADC_AD7298_H_ */
index c90f2b3e661ff7c33660987227c8f381468e5ef8..6141f4a70cfa53686d3c99c25fe0dd0f1af62577 100644 (file)
@@ -45,8 +45,8 @@ static struct iio_chan_spec ad7298_channels[] = {
                .channel = 0,
                .info_mask = IIO_CHAN_INFO_RAW_SEPARATE_BIT |
                IIO_CHAN_INFO_SCALE_SEPARATE_BIT,
-               .address = 9,
-               .scan_index = AD7298_CH_TEMP,
+               .address = AD7298_CH_TEMP,
+               .scan_index = -1,
                .scan_type = {
                        .sign = 's',
                        .realbits = 32,
@@ -171,6 +171,7 @@ static int ad7298_read_raw(struct iio_dev *indio_dev,
 
 static const struct iio_info ad7298_info = {
        .read_raw = &ad7298_read_raw,
+       .update_scan_mode = ad7298_update_scan_mode,
        .driver_module = THIS_MODULE,
 };
 
@@ -231,19 +232,12 @@ static int __devinit ad7298_probe(struct spi_device *spi)
        if (ret)
                goto error_disable_reg;
 
-       ret = iio_buffer_register(indio_dev,
-                                 &ad7298_channels[1], /* skip temp0 */
-                                 ARRAY_SIZE(ad7298_channels) - 1);
-       if (ret)
-               goto error_cleanup_ring;
        ret = iio_device_register(indio_dev);
        if (ret)
-               goto error_unregister_ring;
+               goto error_cleanup_ring;
 
        return 0;
 
-error_unregister_ring:
-       iio_buffer_unregister(indio_dev);
 error_cleanup_ring:
        ad7298_ring_cleanup(indio_dev);
 error_disable_reg:
@@ -263,7 +257,6 @@ static int __devexit ad7298_remove(struct spi_device *spi)
        struct ad7298_state *st = iio_priv(indio_dev);
 
        iio_device_unregister(indio_dev);
-       iio_buffer_unregister(indio_dev);
        ad7298_ring_cleanup(indio_dev);
        if (!IS_ERR(st->reg)) {
                regulator_disable(st->reg);
index 908a3e5609dfd5cf91787a0038f908f3927e04e4..cd3e9cb47a643e948bccb2ea86650acd04306a4f 100644 (file)
 
 #include <linux/iio/iio.h>
 #include <linux/iio/buffer.h>
-#include <linux/iio/kfifo_buf.h>
 #include <linux/iio/trigger_consumer.h>
+#include <linux/iio/triggered_buffer.h>
 
 #include "ad7298.h"
 
 /**
- * ad7298_ring_preenable() setup the parameters of the ring before enabling
- *
- * The complex nature of the setting of the number of bytes per datum is due
- * to this driver currently ensuring that the timestamp is stored at an 8
- * byte boundary.
+ * ad7298_update_scan_mode() setup the spi transfer buffer for the new scan mask
  **/
-static int ad7298_ring_preenable(struct iio_dev *indio_dev)
+int ad7298_update_scan_mode(struct iio_dev *indio_dev,
+       const unsigned long *active_scan_mask)
 {
        struct ad7298_state *st = iio_priv(indio_dev);
        int i, m;
        unsigned short command;
-       int scan_count, ret;
-
-       ret = iio_sw_buffer_preenable(indio_dev);
-       if (ret < 0)
-               return ret;
+       int scan_count;
 
        /* Now compute overall size */
-       scan_count = bitmap_weight(indio_dev->active_scan_mask,
-                                  indio_dev->masklength);
+       scan_count = bitmap_weight(active_scan_mask, indio_dev->masklength);
 
        command = AD7298_WRITE | st->ext_ref;
 
        for (i = 0, m = AD7298_CH(0); i < AD7298_MAX_CHAN; i++, m >>= 1)
-               if (test_bit(i, indio_dev->active_scan_mask))
+               if (test_bit(i, active_scan_mask))
                        command |= m;
 
        st->tx_buf[0] = cpu_to_be16(command);
@@ -108,49 +100,13 @@ static irqreturn_t ad7298_trigger_handler(int irq, void *p)
        return IRQ_HANDLED;
 }
 
-static const struct iio_buffer_setup_ops ad7298_ring_setup_ops = {
-       .preenable = &ad7298_ring_preenable,
-       .postenable = &iio_triggered_buffer_postenable,
-       .predisable = &iio_triggered_buffer_predisable,
-};
-
 int ad7298_register_ring_funcs_and_init(struct iio_dev *indio_dev)
 {
-       int ret;
-
-       indio_dev->buffer = iio_kfifo_allocate(indio_dev);
-       if (!indio_dev->buffer) {
-               ret = -ENOMEM;
-               goto error_ret;
-       }
-       indio_dev->pollfunc = iio_alloc_pollfunc(NULL,
-                                                &ad7298_trigger_handler,
-                                                IRQF_ONESHOT,
-                                                indio_dev,
-                                                "ad7298_consumer%d",
-                                                indio_dev->id);
-
-       if (indio_dev->pollfunc == NULL) {
-               ret = -ENOMEM;
-               goto error_deallocate_kfifo;
-       }
-
-       /* Ring buffer functions - here trigger setup related */
-       indio_dev->setup_ops = &ad7298_ring_setup_ops;
-       indio_dev->buffer->scan_timestamp = true;
-
-       /* Flag that polled ring buffering is possible */
-       indio_dev->modes |= INDIO_BUFFER_TRIGGERED;
-       return 0;
-
-error_deallocate_kfifo:
-       iio_kfifo_free(indio_dev->buffer);
-error_ret:
-       return ret;
+       return iio_triggered_buffer_setup(indio_dev, NULL,
+                       &ad7298_trigger_handler, NULL);
 }
 
 void ad7298_ring_cleanup(struct iio_dev *indio_dev)
 {
-       iio_dealloc_pollfunc(indio_dev->pollfunc);
-       iio_kfifo_free(indio_dev->buffer);
+       iio_triggered_buffer_cleanup(indio_dev);
 }