]> www.infradead.org Git - users/jedix/linux-maple.git/commitdiff
iio: adc: ad7173: add support for ad4113
authorDumitru Ceclan <dumitru.ceclan@analog.com>
Mon, 12 Aug 2024 08:13:16 +0000 (11:13 +0300)
committerJonathan Cameron <Jonathan.Cameron@huawei.com>
Mon, 30 Sep 2024 08:21:02 +0000 (09:21 +0100)
This commit adds support for the AD4113 ADC.
The AD4113 is a low power, low noise, 16-bit, Σ-Δ analog-to-digital
converter (ADC) that integrates an analog front end (AFE) for four
fully differential or eight single-ended inputs.

Reviewed-by: Nuno Sa <nuno.sa@analog.com>
Signed-off-by: Dumitru Ceclan <dumitru.ceclan@analog.com>
Link: https://patch.msgid.link/20240812-ad4113-v3-3-046e785dd253@analog.com
Signed-off-by: Jonathan Cameron <Jonathan.Cameron@huawei.com>
drivers/iio/adc/ad7173.c

index b4e9ffef288887773c6694db949aac4582372c86..a0fca16c3be07534547a5b914d525d05f7425340 100644 (file)
@@ -3,7 +3,7 @@
  * AD717x and AD411x family SPI ADC driver
  *
  * Supported devices:
- *  AD4111/AD4112/AD4114/AD4115/AD4116
+ *  AD4111/AD4112/AD4113/AD4114/AD4115/AD4116
  *  AD7172-2/AD7172-4/AD7173-8/AD7175-2
  *  AD7175-8/AD7176-2/AD7177-2
  *
@@ -84,6 +84,7 @@
 #define AD4111_ID                      AD7173_ID
 #define AD4112_ID                      AD7173_ID
 #define AD4114_ID                      AD7173_ID
+#define AD4113_ID                      0x31d0
 #define AD4116_ID                      0x34d0
 #define AD4115_ID                      0x38d0
 #define AD7175_8_ID                    0x3cd0
@@ -170,6 +171,7 @@ struct ad7173_device_info {
        bool has_temp;
        /* ((AVDD1 − AVSS)/5) */
        bool has_pow_supply_monitoring;
+       bool data_reg_only_16bit;
        bool has_input_buf;
        bool has_int_ref;
        bool has_ref2;
@@ -294,6 +296,24 @@ static const struct ad7173_device_info ad4112_device_info = {
        .num_sinc5_data_rates = ARRAY_SIZE(ad7173_sinc5_data_rates),
 };
 
+static const struct ad7173_device_info ad4113_device_info = {
+       .name = "ad4113",
+       .id = AD4113_ID,
+       .num_voltage_in_div = 8,
+       .num_channels = 16,
+       .num_configs = 8,
+       .num_voltage_in = 8,
+       .num_gpios = 2,
+       .data_reg_only_16bit = true,
+       .higher_gpio_bits = true,
+       .has_vincom_input = true,
+       .has_input_buf = true,
+       .has_int_ref = true,
+       .clock = 2 * HZ_PER_MHZ,
+       .sinc5_data_rates = ad7173_sinc5_data_rates,
+       .num_sinc5_data_rates = ARRAY_SIZE(ad7173_sinc5_data_rates),
+};
+
 static const struct ad7173_device_info ad4114_device_info = {
        .name = "ad4114",
        .id = AD4114_ID,
@@ -985,6 +1005,13 @@ static const struct iio_info ad7173_info = {
        .update_scan_mode = ad7173_update_scan_mode,
 };
 
+static const struct iio_scan_type ad4113_scan_type = {
+       .sign = 'u',
+       .realbits = 16,
+       .storagebits = 16,
+       .endianness = IIO_BE,
+};
+
 static const struct iio_chan_spec ad7173_channel_template = {
        .type = IIO_VOLTAGE,
        .indexed = 1,
@@ -1226,6 +1253,8 @@ static int ad7173_fw_parse_channel_config(struct iio_dev *indio_dev)
                chan_st_priv->cfg.input_buf = st->info->has_input_buf;
                chan_st_priv->cfg.ref_sel = AD7173_SETUP_REF_SEL_INT_REF;
                st->adc_mode |= AD7173_ADC_MODE_REF_EN;
+               if (st->info->data_reg_only_16bit)
+                       chan_arr[chan_index].scan_type = ad4113_scan_type;
 
                chan_index++;
        }
@@ -1306,6 +1335,9 @@ static int ad7173_fw_parse_channel_config(struct iio_dev *indio_dev)
                        chan_st_priv->ain = AD7173_CH_ADDRESS(ain[0], ain[1]);
                }
 
+               if (st->info->data_reg_only_16bit)
+                       chan_arr[chan_index].scan_type = ad4113_scan_type;
+
                chan_index++;
        }
        return 0;
@@ -1434,6 +1466,7 @@ static int ad7173_probe(struct spi_device *spi)
 static const struct of_device_id ad7173_of_match[] = {
        { .compatible = "adi,ad4111",   .data = &ad4111_device_info },
        { .compatible = "adi,ad4112",   .data = &ad4112_device_info },
+       { .compatible = "adi,ad4113",   .data = &ad4113_device_info },
        { .compatible = "adi,ad4114",   .data = &ad4114_device_info },
        { .compatible = "adi,ad4115",   .data = &ad4115_device_info },
        { .compatible = "adi,ad4116",   .data = &ad4116_device_info },
@@ -1451,6 +1484,7 @@ MODULE_DEVICE_TABLE(of, ad7173_of_match);
 static const struct spi_device_id ad7173_id_table[] = {
        { "ad4111",   (kernel_ulong_t)&ad4111_device_info },
        { "ad4112",   (kernel_ulong_t)&ad4112_device_info },
+       { "ad4113",   (kernel_ulong_t)&ad4113_device_info },
        { "ad4114",   (kernel_ulong_t)&ad4114_device_info },
        { "ad4115",   (kernel_ulong_t)&ad4115_device_info },
        { "ad4116",   (kernel_ulong_t)&ad4116_device_info },