iio: dac: ltc2632: add support for LTC2636 family
authorUwe Kleine-König <u.kleine-koenig@pengutronix.de>
Thu, 30 Jan 2020 13:15:49 +0000 (14:15 +0100)
committerJonathan Cameron <Jonathan.Cameron@huawei.com>
Fri, 14 Feb 2020 15:06:24 +0000 (15:06 +0000)
The only difference between LTC2632 and LTC2636 is that the former has
two DAC channels while the latter has eight.

Signed-off-by: Uwe Kleine-König <u.kleine-koenig@pengutronix.de>
Signed-off-by: Jonathan Cameron <Jonathan.Cameron@huawei.com>
drivers/iio/dac/Kconfig
drivers/iio/dac/ltc2632.c

index 979070196da94e0f159e76f2f03f03d917effde7..3adbd2de38a1a4b480c45bd400cd561addfae131 100644 (file)
@@ -132,11 +132,12 @@ config LTC1660
          module will be called ltc1660.
 
 config LTC2632
-       tristate "Linear Technology LTC2632-12/10/8 DAC spi driver"
+       tristate "Linear Technology LTC2632-12/10/8 and LTC2636-12/10/8 DAC spi driver"
        depends on SPI
        help
          Say yes here to build support for Linear Technology
-         LTC2632-12, LTC2632-10, LTC2632-8 converters (DAC).
+         LTC2632-12, LTC2632-10, LTC2632-8, LTC2636-12, LTC2636-10 and
+         LTC2636-8 converters (DAC).
 
          To compile this driver as a module, choose M here: the
          module will be called ltc2632.
index 7ab92e178496fb24bffc3f25d31a56251227ae52..1e7ffa0f60712cb4b6fcbf4fa80fd8d6de54962a 100644 (file)
@@ -12,8 +12,6 @@
 #include <linux/iio/iio.h>
 #include <linux/regulator/consumer.h>
 
-#define LTC2632_DAC_CHANNELS                    2
-
 #define LTC2632_ADDR_DAC0                       0x0
 #define LTC2632_ADDR_DAC1                       0x1
 
@@ -33,6 +31,7 @@
  */
 struct ltc2632_chip_info {
        const struct iio_chan_spec *channels;
+       const size_t num_channels;
        const int vref_mv;
 };
 
@@ -57,6 +56,12 @@ enum ltc2632_supported_device_ids {
        ID_LTC2632H12,
        ID_LTC2632H10,
        ID_LTC2632H8,
+       ID_LTC2636L12,
+       ID_LTC2636L10,
+       ID_LTC2636L8,
+       ID_LTC2636H12,
+       ID_LTC2636H10,
+       ID_LTC2636H8,
 };
 
 static int ltc2632_spi_write(struct spi_device *spi,
@@ -190,6 +195,12 @@ static const struct iio_chan_spec_ext_info ltc2632_ext_info[] = {
        const struct iio_chan_spec _name ## _channels[] = { \
                LTC2632_CHANNEL(0, _bits), \
                LTC2632_CHANNEL(1, _bits), \
+               LTC2632_CHANNEL(2, _bits), \
+               LTC2632_CHANNEL(3, _bits), \
+               LTC2632_CHANNEL(4, _bits), \
+               LTC2632_CHANNEL(5, _bits), \
+               LTC2632_CHANNEL(6, _bits), \
+               LTC2632_CHANNEL(7, _bits), \
        }
 
 static DECLARE_LTC2632_CHANNELS(ltc2632x12, 12);
@@ -199,26 +210,62 @@ static DECLARE_LTC2632_CHANNELS(ltc2632x8, 8);
 static const struct ltc2632_chip_info ltc2632_chip_info_tbl[] = {
        [ID_LTC2632L12] = {
                .channels       = ltc2632x12_channels,
+               .num_channels   = 2,
                .vref_mv        = 2500,
        },
        [ID_LTC2632L10] = {
                .channels       = ltc2632x10_channels,
+               .num_channels   = 2,
                .vref_mv        = 2500,
        },
        [ID_LTC2632L8] =  {
                .channels       = ltc2632x8_channels,
+               .num_channels   = 2,
                .vref_mv        = 2500,
        },
        [ID_LTC2632H12] = {
                .channels       = ltc2632x12_channels,
+               .num_channels   = 2,
                .vref_mv        = 4096,
        },
        [ID_LTC2632H10] = {
                .channels       = ltc2632x10_channels,
+               .num_channels   = 2,
                .vref_mv        = 4096,
        },
        [ID_LTC2632H8] =  {
                .channels       = ltc2632x8_channels,
+               .num_channels   = 2,
+               .vref_mv        = 4096,
+       },
+       [ID_LTC2636L12] = {
+               .channels       = ltc2632x12_channels,
+               .num_channels   = 8,
+               .vref_mv        = 2500,
+       },
+       [ID_LTC2636L10] = {
+               .channels       = ltc2632x10_channels,
+               .num_channels   = 8,
+               .vref_mv        = 2500,
+       },
+       [ID_LTC2636L8] =  {
+               .channels       = ltc2632x8_channels,
+               .num_channels   = 8,
+               .vref_mv        = 2500,
+       },
+       [ID_LTC2636H12] = {
+               .channels       = ltc2632x12_channels,
+               .num_channels   = 8,
+               .vref_mv        = 4096,
+       },
+       [ID_LTC2636H10] = {
+               .channels       = ltc2632x10_channels,
+               .num_channels   = 8,
+               .vref_mv        = 4096,
+       },
+       [ID_LTC2636H8] =  {
+               .channels       = ltc2632x8_channels,
+               .num_channels   = 8,
                .vref_mv        = 4096,
        },
 };
@@ -287,7 +334,7 @@ static int ltc2632_probe(struct spi_device *spi)
        indio_dev->info = &ltc2632_info;
        indio_dev->modes = INDIO_DIRECT_MODE;
        indio_dev->channels = chip_info->channels;
-       indio_dev->num_channels = LTC2632_DAC_CHANNELS;
+       indio_dev->num_channels = chip_info->num_channels;
 
        return iio_device_register(indio_dev);
 }
@@ -312,6 +359,12 @@ static const struct spi_device_id ltc2632_id[] = {
        { "ltc2632-h12", (kernel_ulong_t)&ltc2632_chip_info_tbl[ID_LTC2632H12] },
        { "ltc2632-h10", (kernel_ulong_t)&ltc2632_chip_info_tbl[ID_LTC2632H10] },
        { "ltc2632-h8", (kernel_ulong_t)&ltc2632_chip_info_tbl[ID_LTC2632H8] },
+       { "ltc2636-l12", (kernel_ulong_t)&ltc2632_chip_info_tbl[ID_LTC2636L12] },
+       { "ltc2636-l10", (kernel_ulong_t)&ltc2632_chip_info_tbl[ID_LTC2636L10] },
+       { "ltc2636-l8", (kernel_ulong_t)&ltc2632_chip_info_tbl[ID_LTC2636L8] },
+       { "ltc2636-h12", (kernel_ulong_t)&ltc2632_chip_info_tbl[ID_LTC2636H12] },
+       { "ltc2636-h10", (kernel_ulong_t)&ltc2632_chip_info_tbl[ID_LTC2636H10] },
+       { "ltc2636-h8", (kernel_ulong_t)&ltc2632_chip_info_tbl[ID_LTC2636H8] },
        {}
 };
 MODULE_DEVICE_TABLE(spi, ltc2632_id);
@@ -335,6 +388,24 @@ static const struct of_device_id ltc2632_of_match[] = {
        }, {
                .compatible = "lltc,ltc2632-h8",
                .data = &ltc2632_chip_info_tbl[ID_LTC2632H8]
+       }, {
+               .compatible = "lltc,ltc2636-l12",
+               .data = &ltc2632_chip_info_tbl[ID_LTC2636L12]
+       }, {
+               .compatible = "lltc,ltc2636-l10",
+               .data = &ltc2632_chip_info_tbl[ID_LTC2636L10]
+       }, {
+               .compatible = "lltc,ltc2636-l8",
+               .data = &ltc2632_chip_info_tbl[ID_LTC2636L8]
+       }, {
+               .compatible = "lltc,ltc2636-h12",
+               .data = &ltc2632_chip_info_tbl[ID_LTC2636H12]
+       }, {
+               .compatible = "lltc,ltc2636-h10",
+               .data = &ltc2632_chip_info_tbl[ID_LTC2636H10]
+       }, {
+               .compatible = "lltc,ltc2636-h8",
+               .data = &ltc2632_chip_info_tbl[ID_LTC2636H8]
        },
        {}
 };