]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
iio: adc: ad9467: add support for ad9211
authorTomas Melin <tomas.melin@vaisala.com>
Tue, 9 Dec 2025 15:38:12 +0000 (15:38 +0000)
committerJonathan Cameron <Jonathan.Cameron@huawei.com>
Sun, 21 Dec 2025 11:41:13 +0000 (11:41 +0000)
The AD9211 is a 10-bit monolithic sampling analog-to-digital converter
optimized for high performance, low power, and ease of use. The product
operates at up to a 300 MSPS conversion rate and is optimized for
outstanding dynamic performance in wideband carrier and broadband systems.

The scale table implemented here is not an exact match with the
datasheet as the table presented there is missing some information.
The reference presents these values as being linear,
but that does not add up. There is information missing in the table.
Implemented scale table matches values at the middle and at the ends,
smoothing the curve towards middle and end.
Impact on end result from deviation in scale factor affects only software
using it for scaling. All the possible hw-settings are also available with
this implementation.

Datasheet: https://www.analog.com/media/en/technical-documentation/data-sheets/AD9211.pdf
Reviewed-by: Andy Shevchenko <andriy.shevchenko@intel.com>
Signed-off-by: Tomas Melin <tomas.melin@vaisala.com>
Signed-off-by: Jonathan Cameron <Jonathan.Cameron@huawei.com>
drivers/iio/adc/ad9467.c

index 02610ffb06c8323af6c1a8c3a6fe483fba3f590a..59c3fa3bcc9b0b8b36b78c3b54fd7977cae23496 100644 (file)
@@ -21,6 +21,7 @@
 #include <linux/seq_file.h>
 #include <linux/slab.h>
 #include <linux/spi/spi.h>
+#include <linux/units.h>
 
 #include <linux/iio/backend.h>
 #include <linux/iio/iio.h>
 /* AN877_ADC_REG_OUTPUT_DELAY */
 #define AN877_ADC_DCO_DELAY_ENABLE             0x80
 
+/*
+ * Analog Devices AD9211 10-Bit, 200/250/300 MSPS ADC
+ */
+
+#define CHIPID_AD9211                  0x06
+#define AD9211_DEF_OUTPUT_MODE         0x00
+#define AD9211_REG_VREF_MASK           GENMASK(4, 0)
+
 /*
  * Analog Devices AD9265 16-Bit, 125/105/80 MSPS ADC
  */
@@ -237,6 +246,17 @@ static const int ad9434_offset_range[] = {
        -128, 1, 127,
 };
 
+static const unsigned int ad9211_scale_table[][2] = {
+       {980, 0x10}, {1000, 0x11}, {1020, 0x12}, {1040, 0x13},
+       {1060, 0x14}, {1080, 0x15}, {1100, 0x16}, {1120, 0x17},
+       {1140, 0x18}, {1160, 0x19}, {1180, 0x1A}, {1190, 0x1B},
+       {1200, 0x1C}, {1210, 0x1D}, {1220, 0x1E}, {1230, 0x1F},
+       {1250, 0x0}, {1270, 0x1}, {1290, 0x2}, {1310, 0x3},
+       {1330, 0x4}, {1350, 0x5}, {1370, 0x6}, {1390, 0x7},
+       {1410, 0x8}, {1430, 0x9}, {1450, 0xA}, {1460, 0xB},
+       {1470, 0xC}, {1480, 0xD}, {1490, 0xE}, {1500, 0xF},
+};
+
 static const unsigned int ad9265_scale_table[][2] = {
        {1250, 0x00}, {1500, 0x40}, {1750, 0x80}, {2000, 0xC0},
 };
@@ -300,6 +320,10 @@ static void __ad9467_get_scale(struct ad9467_state *st, int index,
        },                                                              \
 }
 
+static const struct iio_chan_spec ad9211_channels[] = {
+       AD9467_CHAN(0, BIT(IIO_CHAN_INFO_SCALE), 0, 10, 's'),
+};
+
 static const struct iio_chan_spec ad9434_channels[] = {
        {
                .type = IIO_VOLTAGE,
@@ -390,6 +414,23 @@ static const struct ad9467_chip_info ad9434_chip_tbl = {
        .offset_range = ad9434_offset_range,
 };
 
+static const struct ad9467_chip_info ad9211_chip_tbl = {
+       .name = "ad9211",
+       .id = CHIPID_AD9211,
+       .max_rate = 300 * HZ_PER_MHZ,
+       .scale_table = ad9211_scale_table,
+       .num_scales = ARRAY_SIZE(ad9211_scale_table),
+       .channels = ad9211_channels,
+       .num_channels = ARRAY_SIZE(ad9211_channels),
+       .test_points = AD9647_MAX_TEST_POINTS,
+       .test_mask = GENMASK(AN877_ADC_TESTMODE_ONE_ZERO_TOGGLE,
+                            AN877_ADC_TESTMODE_OFF),
+       .test_mask_len = AN877_ADC_TESTMODE_ONE_ZERO_TOGGLE + 1,
+       .default_output_mode = AD9211_DEF_OUTPUT_MODE,
+       .vref_mask = AD9211_REG_VREF_MASK,
+       .has_dco = true,
+};
+
 static const struct ad9467_chip_info ad9265_chip_tbl = {
        .name = "ad9265",
        .id = CHIPID_AD9265,
@@ -1320,6 +1361,7 @@ static int ad9467_probe(struct spi_device *spi)
 }
 
 static const struct of_device_id ad9467_of_match[] = {
+       { .compatible = "adi,ad9211", .data = &ad9211_chip_tbl, },
        { .compatible = "adi,ad9265", .data = &ad9265_chip_tbl, },
        { .compatible = "adi,ad9434", .data = &ad9434_chip_tbl, },
        { .compatible = "adi,ad9467", .data = &ad9467_chip_tbl, },
@@ -1331,6 +1373,7 @@ static const struct of_device_id ad9467_of_match[] = {
 MODULE_DEVICE_TABLE(of, ad9467_of_match);
 
 static const struct spi_device_id ad9467_ids[] = {
+       { "ad9211", (kernel_ulong_t)&ad9211_chip_tbl },
        { "ad9265", (kernel_ulong_t)&ad9265_chip_tbl },
        { "ad9434", (kernel_ulong_t)&ad9434_chip_tbl },
        { "ad9467", (kernel_ulong_t)&ad9467_chip_tbl },