iio: dac: ad5686: Add support for AD5674R/AD5679R
authorMircea Caprioru <mircea.caprioru@analog.com>
Wed, 9 Jan 2019 09:14:16 +0000 (11:14 +0200)
committerJonathan Cameron <Jonathan.Cameron@huawei.com>
Sat, 12 Jan 2019 18:58:21 +0000 (18:58 +0000)
The AD5674R/AD5679R are low power, 16-channel, 12-/16-bit buffered voltage
output digital-to-analog converters (DACs). They include a 2.5 V internal
reference (enabled by default).

These devices are very similar to AD5684R/AD5686R, except that they have 16
channels.

Signed-off-by: Mircea Caprioru <mircea.caprioru@analog.com>
Signed-off-by: Jonathan Cameron <Jonathan.Cameron@huawei.com>
drivers/iio/dac/Kconfig
drivers/iio/dac/ad5686-spi.c
drivers/iio/dac/ad5686.c
drivers/iio/dac/ad5686.h

index 851b61eaf3da1347a55996877501565058666d9e..f28daf67db6a1ea158fd951c36079e3e0ffa0afd 100644 (file)
@@ -148,9 +148,9 @@ config AD5686_SPI
        depends on SPI
        select AD5686
        help
-         Say yes here to build support for Analog Devices AD5672R, AD5676,
-         AD5676R, AD5684, AD5684R, AD5684R, AD5685R, AD5686, AD5686R.
-         Voltage Output Digital to Analog Converter.
+         Say yes here to build support for Analog Devices AD5672R, AD5674R,
+         AD5676, AD5676R, AD5679R, AD5684, AD5684R, AD5684R, AD5685R, AD5686,
+         AD5686R Voltage Output Digital to Analog Converter.
 
          To compile this driver as a module, choose M here: the
          module will be called ad5686.
index 665fa6bd9ced7476f0f58e5cc6d5ac584f8e1c1c..4d857c8da2d29e92c55bbee368901b37835ec8f2 100644 (file)
@@ -1,7 +1,8 @@
 // SPDX-License-Identifier: GPL-2.0+
 /*
- * AD5672R, AD5676, AD5676R, AD5681R, AD5682R, AD5683, AD5683R,
- * AD5684, AD5684R, AD5685R, AD5686, AD5686R
+ * AD5672R, AD5674R, AD5676, AD5676R, AD5679R,
+ * AD5681R, AD5682R, AD5683, AD5683R, AD5684,
+ * AD5684R, AD5685R, AD5686, AD5686R
  * Digital to analog converters driver
  *
  * Copyright 2018 Analog Devices Inc.
@@ -102,8 +103,10 @@ static int ad5686_spi_remove(struct spi_device *spi)
 static const struct spi_device_id ad5686_spi_id[] = {
        {"ad5310r", ID_AD5310R},
        {"ad5672r", ID_AD5672R},
+       {"ad5674r", ID_AD5674R},
        {"ad5676", ID_AD5676},
        {"ad5676r", ID_AD5676R},
+       {"ad5679r", ID_AD5679R},
        {"ad5681r", ID_AD5681R},
        {"ad5682r", ID_AD5682R},
        {"ad5683", ID_AD5683},
index a332b93ca2c4886986bf99fec0b06cfe78ecf0c5..6dd2759b9092c5607a9e9d25df3b2daafa4e311e 100644 (file)
@@ -71,7 +71,7 @@ static ssize_t ad5686_write_dac_powerdown(struct iio_dev *indio_dev,
        int ret;
        struct ad5686_state *st = iio_priv(indio_dev);
        unsigned int val, ref_bit_msk;
-       u8 shift;
+       u8 shift, address = 0;
 
        ret = strtobool(buf, &readin);
        if (ret)
@@ -94,6 +94,9 @@ static ssize_t ad5686_write_dac_powerdown(struct iio_dev *indio_dev,
        case AD5686_REGMAP:
                shift = 0;
                ref_bit_msk = 0;
+               /* AD5674R/AD5679R have 16 channels and 2 powerdown registers */
+               if (chan->channel > 0x7)
+                       address = 0x8;
                break;
        case AD5693_REGMAP:
                shift = 13;
@@ -107,7 +110,8 @@ static ssize_t ad5686_write_dac_powerdown(struct iio_dev *indio_dev,
        if (!st->use_internal_vref)
                val |= ref_bit_msk;
 
-       ret = st->write(st, AD5686_CMD_POWERDOWN_DAC, 0, val);
+       ret = st->write(st, AD5686_CMD_POWERDOWN_DAC,
+                       address, val >> (address * 2));
 
        return ret ? ret : len;
 }
@@ -226,10 +230,32 @@ static struct iio_chan_spec name[] = {                            \
                AD5868_CHANNEL(7, 7, bits, _shift),             \
 }
 
+#define DECLARE_AD5679_CHANNELS(name, bits, _shift)            \
+static struct iio_chan_spec name[] = {                         \
+               AD5868_CHANNEL(0, 0, bits, _shift),             \
+               AD5868_CHANNEL(1, 1, bits, _shift),             \
+               AD5868_CHANNEL(2, 2, bits, _shift),             \
+               AD5868_CHANNEL(3, 3, bits, _shift),             \
+               AD5868_CHANNEL(4, 4, bits, _shift),             \
+               AD5868_CHANNEL(5, 5, bits, _shift),             \
+               AD5868_CHANNEL(6, 6, bits, _shift),             \
+               AD5868_CHANNEL(7, 7, bits, _shift),             \
+               AD5868_CHANNEL(8, 8, bits, _shift),             \
+               AD5868_CHANNEL(9, 9, bits, _shift),             \
+               AD5868_CHANNEL(10, 10, bits, _shift),           \
+               AD5868_CHANNEL(11, 11, bits, _shift),           \
+               AD5868_CHANNEL(12, 12, bits, _shift),           \
+               AD5868_CHANNEL(13, 13, bits, _shift),           \
+               AD5868_CHANNEL(14, 14, bits, _shift),           \
+               AD5868_CHANNEL(15, 15, bits, _shift),           \
+}
+
 DECLARE_AD5693_CHANNELS(ad5310r_channels, 10, 2);
 DECLARE_AD5693_CHANNELS(ad5311r_channels, 10, 6);
 DECLARE_AD5676_CHANNELS(ad5672_channels, 12, 4);
+DECLARE_AD5679_CHANNELS(ad5674r_channels, 12, 4);
 DECLARE_AD5676_CHANNELS(ad5676_channels, 16, 0);
+DECLARE_AD5679_CHANNELS(ad5679r_channels, 16, 0);
 DECLARE_AD5686_CHANNELS(ad5684_channels, 12, 4);
 DECLARE_AD5686_CHANNELS(ad5685r_channels, 14, 2);
 DECLARE_AD5686_CHANNELS(ad5686_channels, 16, 0);
@@ -262,6 +288,12 @@ static const struct ad5686_chip_info ad5686_chip_info_tbl[] = {
                .num_channels = 8,
                .regmap_type = AD5686_REGMAP,
        },
+       [ID_AD5674R] = {
+               .channels = ad5674r_channels,
+               .int_vref_mv = 2500,
+               .num_channels = 16,
+               .regmap_type = AD5686_REGMAP,
+       },
        [ID_AD5675R] = {
                .channels = ad5676_channels,
                .int_vref_mv = 2500,
@@ -279,6 +311,12 @@ static const struct ad5686_chip_info ad5686_chip_info_tbl[] = {
                .num_channels = 8,
                .regmap_type = AD5686_REGMAP,
        },
+       [ID_AD5679R] = {
+               .channels = ad5679r_channels,
+               .int_vref_mv = 2500,
+               .num_channels = 16,
+               .regmap_type = AD5686_REGMAP,
+       },
        [ID_AD5681R] = {
                .channels = ad5691r_channels,
                .int_vref_mv = 2500,
index 19f6917d47383fce2756946ddc011dec0cb133d5..4c3e171ce0ccb09ee30646862d20f8afab9fcd19 100644 (file)
@@ -54,9 +54,11 @@ enum ad5686_supported_device_ids {
        ID_AD5311R,
        ID_AD5671R,
        ID_AD5672R,
+       ID_AD5674R,
        ID_AD5675R,
        ID_AD5676,
        ID_AD5676R,
+       ID_AD5679R,
        ID_AD5681R,
        ID_AD5682R,
        ID_AD5683,