]> git.kernelconcepts.de Git - karo-tx-linux.git/blobdiff - drivers/staging/iio/adc/ad7298_core.c
Merge remote-tracking branch 'staging/staging-next'
[karo-tx-linux.git] / drivers / staging / iio / adc / ad7298_core.c
index a799bd1922dccdcb7900a30895dce5f9c2cd5b54..8dd6aa9cf9287e2b6dc5f7d8537c43665c35eae2 100644 (file)
 
 #include "../iio.h"
 #include "../sysfs.h"
-#include "../buffer_generic.h"
+#include "../buffer.h"
 
 #include "ad7298.h"
 
 static struct iio_chan_spec ad7298_channels[] = {
        IIO_CHAN(IIO_TEMP, 0, 1, 0, NULL, 0, 0,
-                (1 << IIO_CHAN_INFO_SCALE_SEPARATE),
+                IIO_CHAN_INFO_SCALE_SEPARATE_BIT,
                 9, AD7298_CH_TEMP, IIO_ST('s', 32, 32, 0), 0),
        IIO_CHAN(IIO_VOLTAGE, 0, 1, 0, NULL, 0, 0,
-                (1 << IIO_CHAN_INFO_SCALE_SHARED),
+                IIO_CHAN_INFO_SCALE_SHARED_BIT,
                 0, 0, IIO_ST('u', 12, 16, 0), 0),
        IIO_CHAN(IIO_VOLTAGE, 0, 1, 0, NULL, 1, 0,
-                (1 << IIO_CHAN_INFO_SCALE_SHARED),
+                IIO_CHAN_INFO_SCALE_SHARED_BIT,
                 1, 1, IIO_ST('u', 12, 16, 0), 0),
        IIO_CHAN(IIO_VOLTAGE, 0, 1, 0, NULL, 2, 0,
-                (1 << IIO_CHAN_INFO_SCALE_SHARED),
+                IIO_CHAN_INFO_SCALE_SHARED_BIT,
                 2, 2, IIO_ST('u', 12, 16, 0), 0),
        IIO_CHAN(IIO_VOLTAGE, 0, 1, 0, NULL, 3, 0,
-                (1 << IIO_CHAN_INFO_SCALE_SHARED),
+                IIO_CHAN_INFO_SCALE_SHARED_BIT,
                 3, 3, IIO_ST('u', 12, 16, 0), 0),
        IIO_CHAN(IIO_VOLTAGE, 0, 1, 0, NULL, 4, 0,
-                (1 << IIO_CHAN_INFO_SCALE_SHARED),
+                IIO_CHAN_INFO_SCALE_SHARED_BIT,
                 4, 4, IIO_ST('u', 12, 16, 0), 0),
        IIO_CHAN(IIO_VOLTAGE, 0, 1, 0, NULL, 5, 0,
-                (1 << IIO_CHAN_INFO_SCALE_SHARED),
+                IIO_CHAN_INFO_SCALE_SHARED_BIT,
                 5, 5, IIO_ST('u', 12, 16, 0), 0),
        IIO_CHAN(IIO_VOLTAGE, 0, 1, 0, NULL, 6, 0,
-                (1 << IIO_CHAN_INFO_SCALE_SHARED),
+                IIO_CHAN_INFO_SCALE_SHARED_BIT,
                 6, 6, IIO_ST('u', 12, 16, 0), 0),
        IIO_CHAN(IIO_VOLTAGE, 0, 1, 0, NULL, 7, 0,
-                (1 << IIO_CHAN_INFO_SCALE_SHARED),
+                IIO_CHAN_INFO_SCALE_SHARED_BIT,
                 7, 7, IIO_ST('u', 12, 16, 0), 0),
        IIO_CHAN_SOFT_TIMESTAMP(8),
 };
@@ -69,27 +69,28 @@ static int ad7298_scan_direct(struct ad7298_state *st, unsigned ch)
 static int ad7298_scan_temp(struct ad7298_state *st, int *val)
 {
        int tmp, ret;
+       __be16 buf;
 
-       tmp = cpu_to_be16(AD7298_WRITE | AD7298_TSENSE |
+       buf = cpu_to_be16(AD7298_WRITE | AD7298_TSENSE |
                          AD7298_TAVG | st->ext_ref);
 
-       ret = spi_write(st->spi, (u8 *)&tmp, 2);
+       ret = spi_write(st->spi, (u8 *)&buf, 2);
        if (ret)
                return ret;
 
-       tmp = 0;
+       buf = cpu_to_be16(0);
 
-       ret = spi_write(st->spi, (u8 *)&tmp, 2);
+       ret = spi_write(st->spi, (u8 *)&buf, 2);
        if (ret)
                return ret;
 
        usleep_range(101, 1000); /* sleep > 100us */
 
-       ret = spi_read(st->spi, (u8 *)&tmp, 2);
+       ret = spi_read(st->spi, (u8 *)&buf, 2);
        if (ret)
                return ret;
 
-       tmp = be16_to_cpu(tmp) & RES_MASK(AD7298_BITS);
+       tmp = be16_to_cpu(buf) & RES_MASK(AD7298_BITS);
 
        /*
         * One LSB of the ADC corresponds to 0.25 deg C.
@@ -122,12 +123,8 @@ static int ad7298_read_raw(struct iio_dev *indio_dev,
        switch (m) {
        case 0:
                mutex_lock(&indio_dev->mlock);
-               if (iio_buffer_enabled(indio_dev)) {
-                       if (chan->address == AD7298_CH_TEMP)
-                               ret = -ENODEV;
-                       else
-                               ret = ad7298_scan_from_ring(indio_dev,
-                                                           chan->address);
+               if (indio_dev->currentmode == INDIO_BUFFER_TRIGGERED) {
+                       ret = -EBUSY;
                } else {
                        if (chan->address == AD7298_CH_TEMP)
                                ret = ad7298_scan_temp(st, val);
@@ -143,15 +140,20 @@ static int ad7298_read_raw(struct iio_dev *indio_dev,
                        *val = ret & RES_MASK(AD7298_BITS);
 
                return IIO_VAL_INT;
-       case (1 << IIO_CHAN_INFO_SCALE_SHARED):
-               scale_uv = (st->int_vref_mv * 1000) >> AD7298_BITS;
-               *val =  scale_uv / 1000;
-               *val2 = (scale_uv % 1000) * 1000;
-               return IIO_VAL_INT_PLUS_MICRO;
-       case (1 << IIO_CHAN_INFO_SCALE_SEPARATE):
-               *val =  1;
-               *val2 = 0;
-               return IIO_VAL_INT_PLUS_MICRO;
+       case IIO_CHAN_INFO_SCALE:
+               switch (chan->type) {
+               case IIO_VOLTAGE:
+                       scale_uv = (st->int_vref_mv * 1000) >> AD7298_BITS;
+                       *val =  scale_uv / 1000;
+                       *val2 = (scale_uv % 1000) * 1000;
+                       return IIO_VAL_INT_PLUS_MICRO;
+               case IIO_TEMP:
+                       *val =  1;
+                       *val2 = 0;
+                       return IIO_VAL_INT_PLUS_MICRO;
+               default:
+                       return -EINVAL;
+               }
        }
        return -EINVAL;
 }
@@ -265,11 +267,11 @@ 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",
-               .bus    = &spi_bus_type,
                .owner  = THIS_MODULE,
        },
        .probe          = ad7298_probe,
@@ -281,4 +283,3 @@ module_spi_driver(ad7298_driver);
 MODULE_AUTHOR("Michael Hennerich <hennerich@blackfin.uclinux.org>");
 MODULE_DESCRIPTION("Analog Devices AD7298 ADC");
 MODULE_LICENSE("GPL v2");
-MODULE_ALIAS("spi:ad7298");