staging:iio:ad7298: Squash everything into one file
authorLars-Peter Clausen <lars@metafoo.de>
Thu, 15 Nov 2012 13:15:00 +0000 (13:15 +0000)
committerJonathan Cameron <jic23@kernel.org>
Mon, 19 Nov 2012 22:22:14 +0000 (22:22 +0000)
The recent cleanups have decimated the drivers code size by quite a bit. It is
only a few hundred lines in total now. Putting everything into one file also
allows to reduce the code size a bit more by removing a few lines of boilerplate
code. The only functional change made by this patch is that we now always
include buffer support, instead of making it optional. This is more consistent
with what we do for other drivers.

Signed-off-by: Lars-Peter Clausen <lars@metafoo.de>
Signed-off-by: Jonathan Cameron <jic23@kernel.org>
drivers/staging/iio/adc/Kconfig
drivers/staging/iio/adc/Makefile
drivers/staging/iio/adc/ad7298.c [new file with mode: 0644]
drivers/staging/iio/adc/ad7298.h
drivers/staging/iio/adc/ad7298_core.c [deleted file]
drivers/staging/iio/adc/ad7298_ring.c [deleted file]

index 0177f1e023000f86e72dc96f9294626c06f4d1b6..5086a46b8e9a67e6f3e2e5fdc16e1cb259d493de 100644 (file)
@@ -13,7 +13,8 @@ config AD7291
 config AD7298
        tristate "Analog Devices AD7298 ADC driver"
        depends on SPI
-       select IIO_TRIGGERED_BUFFER if IIO_BUFFER
+       select IIO_BUFFER
+       select IIO_TRIGGERED_BUFFER
        help
          Say yes here to build support for Analog Devices AD7298
          8 Channel ADC with temperature sensor.
index 12b4bd32437fd2ee644793375916f94465efb532..4beaa588256b3a61dc4befecbd7971f4182797ac 100644 (file)
@@ -12,8 +12,6 @@ ad799x-y := ad799x_core.o
 ad799x-$(CONFIG_AD799X_RING_BUFFER) += ad799x_ring.o
 obj-$(CONFIG_AD799X) += ad799x.o
 
-ad7298-y := ad7298_core.o
-ad7298-$(CONFIG_IIO_BUFFER) += ad7298_ring.o
 obj-$(CONFIG_AD7298) += ad7298.o
 
 obj-$(CONFIG_AD7291) += ad7291.o
diff --git a/drivers/staging/iio/adc/ad7298.c b/drivers/staging/iio/adc/ad7298.c
new file mode 100644 (file)
index 0000000..2742a9d
--- /dev/null
@@ -0,0 +1,408 @@
+/*
+ * AD7298 SPI ADC driver
+ *
+ * Copyright 2011 Analog Devices Inc.
+ *
+ * Licensed under the GPL-2.
+ */
+
+#include <linux/device.h>
+#include <linux/kernel.h>
+#include <linux/slab.h>
+#include <linux/sysfs.h>
+#include <linux/spi/spi.h>
+#include <linux/regulator/consumer.h>
+#include <linux/err.h>
+#include <linux/delay.h>
+#include <linux/module.h>
+#include <linux/interrupt.h>
+
+#include <linux/iio/iio.h>
+#include <linux/iio/sysfs.h>
+#include <linux/iio/buffer.h>
+#include <linux/iio/trigger_consumer.h>
+#include <linux/iio/triggered_buffer.h>
+
+#include "ad7298.h"
+
+#define AD7298_WRITE   (1 << 15) /* write to the control register */
+#define AD7298_REPEAT  (1 << 14) /* repeated conversion enable */
+#define AD7298_CH(x)   (1 << (13 - (x))) /* channel select */
+#define AD7298_TSENSE  (1 << 5) /* temperature conversion enable */
+#define AD7298_EXTREF  (1 << 2) /* external reference enable */
+#define AD7298_TAVG    (1 << 1) /* temperature sensor averaging enable */
+#define AD7298_PDD     (1 << 0) /* partial power down enable */
+
+#define AD7298_MAX_CHAN                8
+#define AD7298_BITS            12
+#define AD7298_STORAGE_BITS    16
+#define AD7298_INTREF_mV       2500
+
+#define AD7298_CH_TEMP         9
+
+#define RES_MASK(bits) ((1 << (bits)) - 1)
+
+struct ad7298_state {
+       struct spi_device               *spi;
+       struct regulator                *reg;
+       unsigned                        ext_ref;
+       struct spi_transfer             ring_xfer[10];
+       struct spi_transfer             scan_single_xfer[3];
+       struct spi_message              ring_msg;
+       struct spi_message              scan_single_msg;
+       /*
+        * DMA (thus cache coherency maintenance) requires the
+        * transfer buffers to live in their own cache lines.
+        */
+       unsigned short                  rx_buf[12] ____cacheline_aligned;
+       unsigned short                  tx_buf[2];
+};
+
+#define AD7298_V_CHAN(index)                                           \
+       {                                                               \
+               .type = IIO_VOLTAGE,                                    \
+               .indexed = 1,                                           \
+               .channel = index,                                       \
+               .info_mask = IIO_CHAN_INFO_RAW_SEPARATE_BIT |           \
+               IIO_CHAN_INFO_SCALE_SHARED_BIT,                         \
+               .address = index,                                       \
+               .scan_index = index,                                    \
+               .scan_type = {                                          \
+                       .sign = 'u',                                    \
+                       .realbits = 12,                                 \
+                       .storagebits = 16,                              \
+                       .endianness = IIO_BE,                           \
+               },                                                      \
+       }
+
+static const struct iio_chan_spec ad7298_channels[] = {
+       {
+               .type = IIO_TEMP,
+               .indexed = 1,
+               .channel = 0,
+               .info_mask = IIO_CHAN_INFO_RAW_SEPARATE_BIT |
+                       IIO_CHAN_INFO_SCALE_SEPARATE_BIT |
+                       IIO_CHAN_INFO_OFFSET_SEPARATE_BIT,
+               .address = AD7298_CH_TEMP,
+               .scan_index = -1,
+               .scan_type = {
+                       .sign = 's',
+                       .realbits = 32,
+                       .storagebits = 32,
+               },
+       },
+       AD7298_V_CHAN(0),
+       AD7298_V_CHAN(1),
+       AD7298_V_CHAN(2),
+       AD7298_V_CHAN(3),
+       AD7298_V_CHAN(4),
+       AD7298_V_CHAN(5),
+       AD7298_V_CHAN(6),
+       AD7298_V_CHAN(7),
+       IIO_CHAN_SOFT_TIMESTAMP(8),
+};
+
+/**
+ * ad7298_update_scan_mode() setup the spi transfer buffer for the new scan mask
+ **/
+static 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;
+
+       /* Now compute overall size */
+       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, active_scan_mask))
+                       command |= m;
+
+       st->tx_buf[0] = cpu_to_be16(command);
+
+       /* build spi ring message */
+       st->ring_xfer[0].tx_buf = &st->tx_buf[0];
+       st->ring_xfer[0].len = 2;
+       st->ring_xfer[0].cs_change = 1;
+       st->ring_xfer[1].tx_buf = &st->tx_buf[1];
+       st->ring_xfer[1].len = 2;
+       st->ring_xfer[1].cs_change = 1;
+
+       spi_message_init(&st->ring_msg);
+       spi_message_add_tail(&st->ring_xfer[0], &st->ring_msg);
+       spi_message_add_tail(&st->ring_xfer[1], &st->ring_msg);
+
+       for (i = 0; i < scan_count; i++) {
+               st->ring_xfer[i + 2].rx_buf = &st->rx_buf[i];
+               st->ring_xfer[i + 2].len = 2;
+               st->ring_xfer[i + 2].cs_change = 1;
+               spi_message_add_tail(&st->ring_xfer[i + 2], &st->ring_msg);
+       }
+       /* make sure last transfer cs_change is not set */
+       st->ring_xfer[i + 1].cs_change = 0;
+
+       return 0;
+}
+
+/**
+ * ad7298_trigger_handler() bh of trigger launched polling to ring buffer
+ *
+ * Currently there is no option in this driver to disable the saving of
+ * timestamps within the ring.
+ **/
+static irqreturn_t ad7298_trigger_handler(int irq, void *p)
+{
+       struct iio_poll_func *pf = p;
+       struct iio_dev *indio_dev = pf->indio_dev;
+       struct ad7298_state *st = iio_priv(indio_dev);
+       s64 time_ns = 0;
+       int b_sent;
+
+       b_sent = spi_sync(st->spi, &st->ring_msg);
+       if (b_sent)
+               goto done;
+
+       if (indio_dev->scan_timestamp) {
+               time_ns = iio_get_time_ns();
+               memcpy((u8 *)st->rx_buf + indio_dev->scan_bytes - sizeof(s64),
+                       &time_ns, sizeof(time_ns));
+       }
+
+       iio_push_to_buffers(indio_dev, (u8 *)st->rx_buf);
+
+done:
+       iio_trigger_notify_done(indio_dev->trig);
+
+       return IRQ_HANDLED;
+}
+
+static int ad7298_scan_direct(struct ad7298_state *st, unsigned ch)
+{
+       int ret;
+       st->tx_buf[0] = cpu_to_be16(AD7298_WRITE | st->ext_ref |
+                                  (AD7298_CH(0) >> ch));
+
+       ret = spi_sync(st->spi, &st->scan_single_msg);
+       if (ret)
+               return ret;
+
+       return be16_to_cpu(st->rx_buf[0]);
+}
+
+static int ad7298_scan_temp(struct ad7298_state *st, int *val)
+{
+       int ret;
+       __be16 buf;
+
+       buf = cpu_to_be16(AD7298_WRITE | AD7298_TSENSE |
+                         AD7298_TAVG | st->ext_ref);
+
+       ret = spi_write(st->spi, (u8 *)&buf, 2);
+       if (ret)
+               return ret;
+
+       buf = cpu_to_be16(0);
+
+       ret = spi_write(st->spi, (u8 *)&buf, 2);
+       if (ret)
+               return ret;
+
+       usleep_range(101, 1000); /* sleep > 100us */
+
+       ret = spi_read(st->spi, (u8 *)&buf, 2);
+       if (ret)
+               return ret;
+
+       *val = sign_extend32(be16_to_cpu(buf), 11);
+
+       return 0;
+}
+
+static int ad7298_get_ref_voltage(struct ad7298_state *st)
+{
+       int vref;
+
+       if (st->ext_ref) {
+               vref = regulator_get_voltage(st->reg);
+               if (vref < 0)
+                       return vref;
+
+               return vref / 1000;
+       } else {
+               return AD7298_INTREF_mV;
+       }
+}
+
+static int ad7298_read_raw(struct iio_dev *indio_dev,
+                          struct iio_chan_spec const *chan,
+                          int *val,
+                          int *val2,
+                          long m)
+{
+       int ret;
+       struct ad7298_state *st = iio_priv(indio_dev);
+
+       switch (m) {
+       case IIO_CHAN_INFO_RAW:
+               mutex_lock(&indio_dev->mlock);
+               if (indio_dev->currentmode == INDIO_BUFFER_TRIGGERED) {
+                       ret = -EBUSY;
+               } else {
+                       if (chan->address == AD7298_CH_TEMP)
+                               ret = ad7298_scan_temp(st, val);
+                       else
+                               ret = ad7298_scan_direct(st, chan->address);
+               }
+               mutex_unlock(&indio_dev->mlock);
+
+               if (ret < 0)
+                       return ret;
+
+               if (chan->address != AD7298_CH_TEMP)
+                       *val = ret & RES_MASK(AD7298_BITS);
+
+               return IIO_VAL_INT;
+       case IIO_CHAN_INFO_SCALE:
+               switch (chan->type) {
+               case IIO_VOLTAGE:
+                       *val = ad7298_get_ref_voltage(st);
+                       *val2 = chan->scan_type.realbits;
+                       return IIO_VAL_FRACTIONAL_LOG2;
+               case IIO_TEMP:
+                       *val = ad7298_get_ref_voltage(st);
+                       *val2 = 10;
+                       return IIO_VAL_FRACTIONAL;
+               default:
+                       return -EINVAL;
+               }
+       case IIO_CHAN_INFO_OFFSET:
+               *val = 1093 - 2732500 / ad7298_get_ref_voltage(st);
+               return IIO_VAL_INT;
+       }
+       return -EINVAL;
+}
+
+static const struct iio_info ad7298_info = {
+       .read_raw = &ad7298_read_raw,
+       .update_scan_mode = ad7298_update_scan_mode,
+       .driver_module = THIS_MODULE,
+};
+
+static int __devinit ad7298_probe(struct spi_device *spi)
+{
+       struct ad7298_platform_data *pdata = spi->dev.platform_data;
+       struct ad7298_state *st;
+       struct iio_dev *indio_dev = iio_device_alloc(sizeof(*st));
+       int ret;
+
+       if (indio_dev == NULL)
+               return -ENOMEM;
+
+       st = iio_priv(indio_dev);
+
+       if (pdata && pdata->ext_ref)
+               st->ext_ref = AD7298_EXTREF;
+
+       if (st->ext_ref) {
+               st->reg = regulator_get(&spi->dev, "vref");
+               if (IS_ERR(st->reg)) {
+                       ret = PTR_ERR(st->reg);
+                       goto error_free;
+               }
+               ret = regulator_enable(st->reg);
+               if (ret)
+                       goto error_put_reg;
+       }
+
+       spi_set_drvdata(spi, indio_dev);
+
+       st->spi = spi;
+
+       indio_dev->name = spi_get_device_id(spi)->name;
+       indio_dev->dev.parent = &spi->dev;
+       indio_dev->modes = INDIO_DIRECT_MODE;
+       indio_dev->channels = ad7298_channels;
+       indio_dev->num_channels = ARRAY_SIZE(ad7298_channels);
+       indio_dev->info = &ad7298_info;
+
+       /* Setup default message */
+
+       st->scan_single_xfer[0].tx_buf = &st->tx_buf[0];
+       st->scan_single_xfer[0].len = 2;
+       st->scan_single_xfer[0].cs_change = 1;
+       st->scan_single_xfer[1].tx_buf = &st->tx_buf[1];
+       st->scan_single_xfer[1].len = 2;
+       st->scan_single_xfer[1].cs_change = 1;
+       st->scan_single_xfer[2].rx_buf = &st->rx_buf[0];
+       st->scan_single_xfer[2].len = 2;
+
+       spi_message_init(&st->scan_single_msg);
+       spi_message_add_tail(&st->scan_single_xfer[0], &st->scan_single_msg);
+       spi_message_add_tail(&st->scan_single_xfer[1], &st->scan_single_msg);
+       spi_message_add_tail(&st->scan_single_xfer[2], &st->scan_single_msg);
+
+       ret = iio_triggered_buffer_setup(indio_dev, NULL,
+                       &ad7298_trigger_handler, NULL);
+       if (ret)
+               goto error_disable_reg;
+
+       ret = iio_device_register(indio_dev);
+       if (ret)
+               goto error_cleanup_ring;
+
+       return 0;
+
+error_cleanup_ring:
+       iio_triggered_buffer_cleanup(indio_dev);
+error_disable_reg:
+       if (st->ext_ref)
+               regulator_disable(st->reg);
+error_put_reg:
+       if (st->ext_ref)
+               regulator_put(st->reg);
+error_free:
+       iio_device_free(indio_dev);
+
+       return ret;
+}
+
+static int __devexit ad7298_remove(struct spi_device *spi)
+{
+       struct iio_dev *indio_dev = spi_get_drvdata(spi);
+       struct ad7298_state *st = iio_priv(indio_dev);
+
+       iio_device_unregister(indio_dev);
+       iio_triggered_buffer_cleanup(indio_dev);
+       if (st->ext_ref) {
+               regulator_disable(st->reg);
+               regulator_put(st->reg);
+       }
+       iio_device_free(indio_dev);
+
+       return 0;
+}
+
+static const struct spi_device_id ad7298_id[] = {
+       {"ad7298", 0},
+       {}
+};
+MODULE_DEVICE_TABLE(spi, ad7298_id);
+
+static struct spi_driver ad7298_driver = {
+       .driver = {
+               .name   = "ad7298",
+               .owner  = THIS_MODULE,
+       },
+       .probe          = ad7298_probe,
+       .remove         = __devexit_p(ad7298_remove),
+       .id_table       = ad7298_id,
+};
+module_spi_driver(ad7298_driver);
+
+MODULE_AUTHOR("Michael Hennerich <hennerich@blackfin.uclinux.org>");
+MODULE_DESCRIPTION("Analog Devices AD7298 ADC");
+MODULE_LICENSE("GPL v2");
index 6523e011361a4915a3f3abf962253ecb3923ac3d..c8ac969ec0164ffe283b7824fa2142555c1be8c8 100644 (file)
@@ -9,23 +9,6 @@
 #ifndef IIO_ADC_AD7298_H_
 #define IIO_ADC_AD7298_H_
 
-#define AD7298_WRITE   (1 << 15) /* write to the control register */
-#define AD7298_REPEAT  (1 << 14) /* repeated conversion enable */
-#define AD7298_CH(x)   (1 << (13 - (x))) /* channel select */
-#define AD7298_TSENSE  (1 << 5) /* temperature conversion enable */
-#define AD7298_EXTREF  (1 << 2) /* external reference enable */
-#define AD7298_TAVG    (1 << 1) /* temperature sensor averaging enable */
-#define AD7298_PDD     (1 << 0) /* partial power down enable */
-
-#define AD7298_MAX_CHAN                8
-#define AD7298_BITS            12
-#define AD7298_STORAGE_BITS    16
-#define AD7298_INTREF_mV       2500
-
-#define AD7298_CH_TEMP         9
-
-#define RES_MASK(bits) ((1 << (bits)) - 1)
-
 /**
  * struct ad7298_platform_data - Platform data for the ad7298 ADC driver
  * @ext_ref: Whether to use an external reference voltage.
@@ -34,40 +17,4 @@ struct ad7298_platform_data {
        bool ext_ref;
 };
 
-struct ad7298_state {
-       struct spi_device               *spi;
-       struct regulator                *reg;
-       unsigned                        ext_ref;
-       struct spi_transfer             ring_xfer[10];
-       struct spi_transfer             scan_single_xfer[3];
-       struct spi_message              ring_msg;
-       struct spi_message              scan_single_msg;
-       /*
-        * DMA (thus cache coherency maintenance) requires the
-        * transfer buffers to live in their own cache lines.
-        */
-       unsigned short                  rx_buf[12] ____cacheline_aligned;
-       unsigned short                  tx_buf[2];
-};
-
-#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
-ad7298_register_ring_funcs_and_init(struct iio_dev *indio_dev)
-{
-       return 0;
-}
-
-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_ */
diff --git a/drivers/staging/iio/adc/ad7298_core.c b/drivers/staging/iio/adc/ad7298_core.c
deleted file mode 100644 (file)
index b74b76f..0000000
+++ /dev/null
@@ -1,293 +0,0 @@
-/*
- * AD7298 SPI ADC driver
- *
- * Copyright 2011 Analog Devices Inc.
- *
- * Licensed under the GPL-2.
- */
-
-#include <linux/device.h>
-#include <linux/kernel.h>
-#include <linux/slab.h>
-#include <linux/sysfs.h>
-#include <linux/spi/spi.h>
-#include <linux/regulator/consumer.h>
-#include <linux/err.h>
-#include <linux/delay.h>
-#include <linux/module.h>
-
-#include <linux/iio/iio.h>
-#include <linux/iio/sysfs.h>
-#include <linux/iio/buffer.h>
-
-#include "ad7298.h"
-
-#define AD7298_V_CHAN(index)                                           \
-       {                                                               \
-               .type = IIO_VOLTAGE,                                    \
-               .indexed = 1,                                           \
-               .channel = index,                                       \
-               .info_mask = IIO_CHAN_INFO_RAW_SEPARATE_BIT |           \
-               IIO_CHAN_INFO_SCALE_SHARED_BIT,                         \
-               .address = index,                                       \
-               .scan_index = index,                                    \
-               .scan_type = {                                          \
-                       .sign = 'u',                                    \
-                       .realbits = 12,                                 \
-                       .storagebits = 16,                              \
-                       .endianness = IIO_BE,                           \
-               },                                                      \
-       }
-
-static const struct iio_chan_spec ad7298_channels[] = {
-       {
-               .type = IIO_TEMP,
-               .indexed = 1,
-               .channel = 0,
-               .info_mask = IIO_CHAN_INFO_RAW_SEPARATE_BIT |
-                       IIO_CHAN_INFO_SCALE_SEPARATE_BIT |
-                       IIO_CHAN_INFO_OFFSET_SEPARATE_BIT,
-               .address = AD7298_CH_TEMP,
-               .scan_index = -1,
-               .scan_type = {
-                       .sign = 's',
-                       .realbits = 32,
-                       .storagebits = 32,
-               },
-       },
-       AD7298_V_CHAN(0),
-       AD7298_V_CHAN(1),
-       AD7298_V_CHAN(2),
-       AD7298_V_CHAN(3),
-       AD7298_V_CHAN(4),
-       AD7298_V_CHAN(5),
-       AD7298_V_CHAN(6),
-       AD7298_V_CHAN(7),
-       IIO_CHAN_SOFT_TIMESTAMP(8),
-};
-
-static int ad7298_scan_direct(struct ad7298_state *st, unsigned ch)
-{
-       int ret;
-       st->tx_buf[0] = cpu_to_be16(AD7298_WRITE | st->ext_ref |
-                                  (AD7298_CH(0) >> ch));
-
-       ret = spi_sync(st->spi, &st->scan_single_msg);
-       if (ret)
-               return ret;
-
-       return be16_to_cpu(st->rx_buf[0]);
-}
-
-static int ad7298_scan_temp(struct ad7298_state *st, int *val)
-{
-       int ret;
-       __be16 buf;
-
-       buf = cpu_to_be16(AD7298_WRITE | AD7298_TSENSE |
-                         AD7298_TAVG | st->ext_ref);
-
-       ret = spi_write(st->spi, (u8 *)&buf, 2);
-       if (ret)
-               return ret;
-
-       buf = cpu_to_be16(0);
-
-       ret = spi_write(st->spi, (u8 *)&buf, 2);
-       if (ret)
-               return ret;
-
-       usleep_range(101, 1000); /* sleep > 100us */
-
-       ret = spi_read(st->spi, (u8 *)&buf, 2);
-       if (ret)
-               return ret;
-
-       *val = sign_extend32(be16_to_cpu(buf), 11);
-
-       return 0;
-}
-
-static int ad7298_get_ref_voltage(struct ad7298_state *st)
-{
-       int vref;
-
-       if (st->ext_ref) {
-               vref = regulator_get_voltage(st->reg);
-               if (vref < 0)
-                       return vref;
-
-               return vref / 1000;
-       } else {
-               return AD7298_INTREF_mV;
-       }
-}
-
-static int ad7298_read_raw(struct iio_dev *indio_dev,
-                          struct iio_chan_spec const *chan,
-                          int *val,
-                          int *val2,
-                          long m)
-{
-       int ret;
-       struct ad7298_state *st = iio_priv(indio_dev);
-
-       switch (m) {
-       case IIO_CHAN_INFO_RAW:
-               mutex_lock(&indio_dev->mlock);
-               if (indio_dev->currentmode == INDIO_BUFFER_TRIGGERED) {
-                       ret = -EBUSY;
-               } else {
-                       if (chan->address == AD7298_CH_TEMP)
-                               ret = ad7298_scan_temp(st, val);
-                       else
-                               ret = ad7298_scan_direct(st, chan->address);
-               }
-               mutex_unlock(&indio_dev->mlock);
-
-               if (ret < 0)
-                       return ret;
-
-               if (chan->address != AD7298_CH_TEMP)
-                       *val = ret & RES_MASK(AD7298_BITS);
-
-               return IIO_VAL_INT;
-       case IIO_CHAN_INFO_SCALE:
-               switch (chan->type) {
-               case IIO_VOLTAGE:
-                       *val = ad7298_get_ref_voltage(st);
-                       *val2 = chan->scan_type.realbits;
-                       return IIO_VAL_FRACTIONAL_LOG2;
-               case IIO_TEMP:
-                       *val = ad7298_get_ref_voltage(st);
-                       *val2 = 10;
-                       return IIO_VAL_FRACTIONAL;
-               default:
-                       return -EINVAL;
-               }
-       case IIO_CHAN_INFO_OFFSET:
-               *val = 1093 - 2732500 / ad7298_get_ref_voltage(st);
-               return IIO_VAL_INT;
-       }
-       return -EINVAL;
-}
-
-static const struct iio_info ad7298_info = {
-       .read_raw = &ad7298_read_raw,
-       .update_scan_mode = ad7298_update_scan_mode,
-       .driver_module = THIS_MODULE,
-};
-
-static int __devinit ad7298_probe(struct spi_device *spi)
-{
-       struct ad7298_platform_data *pdata = spi->dev.platform_data;
-       struct ad7298_state *st;
-       struct iio_dev *indio_dev = iio_device_alloc(sizeof(*st));
-       int ret;
-
-       if (indio_dev == NULL)
-               return -ENOMEM;
-
-       st = iio_priv(indio_dev);
-
-       if (pdata && pdata->ext_ref)
-               st->ext_ref = AD7298_EXTREF;
-
-       if (st->ext_ref) {
-               st->reg = regulator_get(&spi->dev, "vref");
-               if (IS_ERR(st->reg)) {
-                       ret = PTR_ERR(st->reg);
-                       goto error_free;
-               }
-               ret = regulator_enable(st->reg);
-               if (ret)
-                       goto error_put_reg;
-       }
-
-       spi_set_drvdata(spi, indio_dev);
-
-       st->spi = spi;
-
-       indio_dev->name = spi_get_device_id(spi)->name;
-       indio_dev->dev.parent = &spi->dev;
-       indio_dev->modes = INDIO_DIRECT_MODE;
-       indio_dev->channels = ad7298_channels;
-       indio_dev->num_channels = ARRAY_SIZE(ad7298_channels);
-       indio_dev->info = &ad7298_info;
-
-       /* Setup default message */
-
-       st->scan_single_xfer[0].tx_buf = &st->tx_buf[0];
-       st->scan_single_xfer[0].len = 2;
-       st->scan_single_xfer[0].cs_change = 1;
-       st->scan_single_xfer[1].tx_buf = &st->tx_buf[1];
-       st->scan_single_xfer[1].len = 2;
-       st->scan_single_xfer[1].cs_change = 1;
-       st->scan_single_xfer[2].rx_buf = &st->rx_buf[0];
-       st->scan_single_xfer[2].len = 2;
-
-       spi_message_init(&st->scan_single_msg);
-       spi_message_add_tail(&st->scan_single_xfer[0], &st->scan_single_msg);
-       spi_message_add_tail(&st->scan_single_xfer[1], &st->scan_single_msg);
-       spi_message_add_tail(&st->scan_single_xfer[2], &st->scan_single_msg);
-
-       ret = ad7298_register_ring_funcs_and_init(indio_dev);
-       if (ret)
-               goto error_disable_reg;
-
-       ret = iio_device_register(indio_dev);
-       if (ret)
-               goto error_cleanup_ring;
-
-       return 0;
-
-error_cleanup_ring:
-       ad7298_ring_cleanup(indio_dev);
-error_disable_reg:
-       if (st->ext_ref)
-               regulator_disable(st->reg);
-error_put_reg:
-       if (st->ext_ref)
-               regulator_put(st->reg);
-error_free:
-       iio_device_free(indio_dev);
-
-       return ret;
-}
-
-static int __devexit ad7298_remove(struct spi_device *spi)
-{
-       struct iio_dev *indio_dev = spi_get_drvdata(spi);
-       struct ad7298_state *st = iio_priv(indio_dev);
-
-       iio_device_unregister(indio_dev);
-       ad7298_ring_cleanup(indio_dev);
-       if (st->ext_ref) {
-               regulator_disable(st->reg);
-               regulator_put(st->reg);
-       }
-       iio_device_free(indio_dev);
-
-       return 0;
-}
-
-static const struct spi_device_id ad7298_id[] = {
-       {"ad7298", 0},
-       {}
-};
-MODULE_DEVICE_TABLE(spi, ad7298_id);
-
-static struct spi_driver ad7298_driver = {
-       .driver = {
-               .name   = "ad7298",
-               .owner  = THIS_MODULE,
-       },
-       .probe          = ad7298_probe,
-       .remove         = __devexit_p(ad7298_remove),
-       .id_table       = ad7298_id,
-};
-module_spi_driver(ad7298_driver);
-
-MODULE_AUTHOR("Michael Hennerich <hennerich@blackfin.uclinux.org>");
-MODULE_DESCRIPTION("Analog Devices AD7298 ADC");
-MODULE_LICENSE("GPL v2");
diff --git a/drivers/staging/iio/adc/ad7298_ring.c b/drivers/staging/iio/adc/ad7298_ring.c
deleted file mode 100644 (file)
index e387712..0000000
+++ /dev/null
@@ -1,108 +0,0 @@
-/*
- * AD7298 SPI ADC driver
- *
- * Copyright 2011-2012 Analog Devices Inc.
- *
- * Licensed under the GPL-2.
- */
-
-#include <linux/interrupt.h>
-#include <linux/kernel.h>
-#include <linux/slab.h>
-#include <linux/spi/spi.h>
-
-#include <linux/iio/iio.h>
-#include <linux/iio/buffer.h>
-#include <linux/iio/trigger_consumer.h>
-#include <linux/iio/triggered_buffer.h>
-
-#include "ad7298.h"
-
-/**
- * ad7298_update_scan_mode() setup the spi transfer buffer for the new scan mask
- **/
-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;
-
-       /* Now compute overall size */
-       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, active_scan_mask))
-                       command |= m;
-
-       st->tx_buf[0] = cpu_to_be16(command);
-
-       /* build spi ring message */
-       st->ring_xfer[0].tx_buf = &st->tx_buf[0];
-       st->ring_xfer[0].len = 2;
-       st->ring_xfer[0].cs_change = 1;
-       st->ring_xfer[1].tx_buf = &st->tx_buf[1];
-       st->ring_xfer[1].len = 2;
-       st->ring_xfer[1].cs_change = 1;
-
-       spi_message_init(&st->ring_msg);
-       spi_message_add_tail(&st->ring_xfer[0], &st->ring_msg);
-       spi_message_add_tail(&st->ring_xfer[1], &st->ring_msg);
-
-       for (i = 0; i < scan_count; i++) {
-               st->ring_xfer[i + 2].rx_buf = &st->rx_buf[i];
-               st->ring_xfer[i + 2].len = 2;
-               st->ring_xfer[i + 2].cs_change = 1;
-               spi_message_add_tail(&st->ring_xfer[i + 2], &st->ring_msg);
-       }
-       /* make sure last transfer cs_change is not set */
-       st->ring_xfer[i + 1].cs_change = 0;
-
-       return 0;
-}
-
-/**
- * ad7298_trigger_handler() bh of trigger launched polling to ring buffer
- *
- * Currently there is no option in this driver to disable the saving of
- * timestamps within the ring.
- **/
-static irqreturn_t ad7298_trigger_handler(int irq, void *p)
-{
-       struct iio_poll_func *pf = p;
-       struct iio_dev *indio_dev = pf->indio_dev;
-       struct ad7298_state *st = iio_priv(indio_dev);
-       s64 time_ns = 0;
-       int b_sent;
-
-       b_sent = spi_sync(st->spi, &st->ring_msg);
-       if (b_sent)
-               goto done;
-
-       if (indio_dev->scan_timestamp) {
-               time_ns = iio_get_time_ns();
-               memcpy((u8 *)st->rx_buf + indio_dev->scan_bytes - sizeof(s64),
-                       &time_ns, sizeof(time_ns));
-       }
-
-       iio_push_to_buffers(indio_dev, (u8 *)st->rx_buf);
-
-done:
-       iio_trigger_notify_done(indio_dev->trig);
-
-       return IRQ_HANDLED;
-}
-
-int ad7298_register_ring_funcs_and_init(struct iio_dev *indio_dev)
-{
-       return iio_triggered_buffer_setup(indio_dev, NULL,
-                       &ad7298_trigger_handler, NULL);
-}
-
-void ad7298_ring_cleanup(struct iio_dev *indio_dev)
-{
-       iio_triggered_buffer_cleanup(indio_dev);
-}