iio:ad7476: Add ad7940 support
authorLars-Peter Clausen <lars@metafoo.de>
Mon, 10 Sep 2012 08:34:00 +0000 (09:34 +0100)
committerJonathan Cameron <jic23@kernel.org>
Sat, 15 Sep 2012 09:02:15 +0000 (10:02 +0100)
The AD7940 is a single channel 14 bit ADC similar to the ADCs already supported
by the ad7476 driver, but it does have a different shift factor.

Signed-off-by: Lars-Peter Clausen <lars@metafoo.de>
Signed-off-by: Jonathan Cameron <jic23@kernel.org>
drivers/iio/adc/Kconfig
drivers/iio/adc/ad7476.c

index c71a0009cc79a348e3a2758bc0f848f30520d034..e2e696395ac8cd1cafcf2624e7b83468c7886f72 100644 (file)
@@ -37,8 +37,8 @@ config AD7476
        select IIO_TRIGGERED_BUFFER
        help
          Say yes here to build support for Analog Devices AD7475, AD7476, AD7477,
-         AD7478, AD7466, AD7467, AD7468, AD7495, AD7910, AD7920 SPI analog to
-         digital converters (ADC).
+         AD7478, AD7466, AD7467, AD7468, AD7495, AD7910, AD7920, AD7920 SPI analog
+         to digital converters (ADC).
 
          If unsure, say N (but it's safe to say "Y").
 
index 093a4ed900d872d05712d69aeb7481216041ee2d..be22757d54e49a266401b36b81efbb7e82b57371 100644 (file)
@@ -48,7 +48,8 @@ enum ad7476_supported_device_ids {
        ID_AD7466,
        ID_AD7467,
        ID_AD7468,
-       ID_AD7495
+       ID_AD7495,
+       ID_AD7940,
 };
 
 static irqreturn_t ad7476_trigger_handler(int irq, void  *p)
@@ -126,7 +127,7 @@ static int ad7476_read_raw(struct iio_dev *indio_dev,
        return -EINVAL;
 }
 
-#define AD7476_CHAN(bits)                                      \
+#define _AD7476_CHAN(bits, _shift)                             \
        {                                                       \
        .type = IIO_VOLTAGE,                                    \
        .indexed = 1,                                           \
@@ -134,12 +135,16 @@ static int ad7476_read_raw(struct iio_dev *indio_dev,
        IIO_CHAN_INFO_SCALE_SHARED_BIT,                         \
        .scan_type = {                                          \
                .sign = 'u',                                    \
-               .realbits = bits,                               \
+               .realbits = (bits),                             \
                .storagebits = 16,                              \
-               .shift = 13 - bits,                             \
+               .shift = (_shift),                              \
+               .endianness = IIO_BE,                           \
        },                                                      \
 }
 
+#define AD7476_CHAN(bits) _AD7476_CHAN((bits), 13 - (bits))
+#define AD7940_CHAN(bits) _AD7476_CHAN((bits), 15 - (bits))
+
 static const struct ad7476_chip_info ad7476_chip_info_tbl[] = {
        [ID_AD7466] = {
                .channel[0] = AD7476_CHAN(12),
@@ -158,6 +163,10 @@ static const struct ad7476_chip_info ad7476_chip_info_tbl[] = {
                .channel[1] = IIO_CHAN_SOFT_TIMESTAMP(1),
                .int_vref_uv = 2500000,
        },
+       [ID_AD7940] = {
+               .channel[0] = AD7940_CHAN(14),
+               .channel[1] = IIO_CHAN_SOFT_TIMESTAMP(1),
+       },
 };
 
 static const struct iio_info ad7476_info = {
@@ -260,6 +269,7 @@ static const struct spi_device_id ad7476_id[] = {
        {"ad7495", ID_AD7495},
        {"ad7910", ID_AD7467},
        {"ad7920", ID_AD7466},
+       {"ad7940", ID_AD7940},
        {}
 };
 MODULE_DEVICE_TABLE(spi, ad7476_id);