Re: [PATCH 1/2] iio: adc ad9467: add support for AD9434 high-speed ADC

From: Alexandru Ardelean
Date: Tue Sep 22 2020 - 07:02:50 EST


On Mon, Sep 21, 2020 at 1:29 PM Alexandru Ardelean
<alexandru.ardelean@xxxxxxxxxx> wrote:
>
> From: Michael Hennerich <michael.hennerich@xxxxxxxxxx>
>
> The AD9434 is a 12-bit monolithic sampling analog-to-digital converter
> (ADC) optimized for high performance, low power, and ease of use. The part
> operates at up to a 500 MSPS conversion rate and is optimized for
> outstanding dynamic performance in wideband carrier and broadband systems.
>
> All necessary functions, including a sample-and-hold and voltage reference,
> are included on the chip to provide a complete signal conversion solution.
> The VREF pin can be used to monitor the internal reference or provide an
> external voltage reference (external reference mode must be enabled through
> the SPI port).
>
> The ADC requires a 1.8 V analog voltage supply and a differential clock
> for full performance operation. The digital outputs are LVDS (ANSI-644)
> compatible and support twos complement, offset binary format, or Gray code.
> A data clock output is available for proper output data timing.
>
> Link: https://www.analog.com/media/en/technical-documentation/data-sheets/AD9434.pdf
>
> The driver supports the same register set as the AD9467, so the support for
> this chip is added to the 'ad9467' driver.

I'll probably do a V2 here.
I'd like to change a few things.

>
> Signed-off-by: Michael Hennerich <michael.hennerich@xxxxxxxxxx>
> Signed-off-by: Alexandru Ardelean <alexandru.ardelean@xxxxxxxxxx>
> ---
> drivers/iio/adc/ad9467.c | 37 +++++++++++++++++++++++++++++++++++--
> 1 file changed, 35 insertions(+), 2 deletions(-)
>
> diff --git a/drivers/iio/adc/ad9467.c b/drivers/iio/adc/ad9467.c
> index f068256cfca9..aee3007ea3f2 100644
> --- a/drivers/iio/adc/ad9467.c
> +++ b/drivers/iio/adc/ad9467.c
> @@ -76,6 +76,14 @@
> /* AN877_ADC_REG_OUTPUT_DELAY */
> #define AN877_ADC_DCO_DELAY_ENABLE 0x80
>
> +/*
> + * Analog Devices AD9434 12-Bit, 370/500 MSPS ADC
> + */
> +
> +#define CHIPID_AD9434 0x6A
> +#define AD9434_DEF_OUTPUT_MODE 0x00
> +#define AD9434_REG_VREF_MASK 0xC0
> +
> /*
> * Analog Devices AD9467 16-Bit, 200/250 MSPS ADC
> */
> @@ -85,6 +93,7 @@
> #define AD9467_REG_VREF_MASK 0x0F
>
> enum {
> + ID_AD9434,
> ID_AD9467,
> };
>
> @@ -154,6 +163,13 @@ static const unsigned int ad9467_scale_table[][2] = {
> {2300, 8}, {2400, 9}, {2500, 10},
> };
>
> +static const unsigned int ad9434_scale_table[][2] = {
> + {1600, 0x1C}, {1580, 0x1D}, {1550, 0x1E}, {1520, 0x1F}, {1500, 0x00},
> + {1470, 0x01}, {1440, 0x02}, {1420, 0x03}, {1390, 0x04}, {1360, 0x05},
> + {1340, 0x06}, {1310, 0x07}, {1280, 0x08}, {1260, 0x09}, {1230, 0x0A},
> + {1200, 0x0B}, {1180, 0x0C},
> +};
> +
> static void __ad9467_get_scale(struct adi_axi_adc_conv *conv, int index,
> unsigned int *val, unsigned int *val2)
> {
> @@ -182,11 +198,23 @@ static void __ad9467_get_scale(struct adi_axi_adc_conv *conv, int index,
> }, \
> }
>
> +static const struct iio_chan_spec ad9434_channels[] = {
> + AD9467_CHAN(0, 0, 12, 'S'),
> +};
> +
> static const struct iio_chan_spec ad9467_channels[] = {
> AD9467_CHAN(0, 0, 16, 'S'),
> };
>
> static const struct adi_axi_adc_chip_info ad9467_chip_tbl[] = {
> + [ID_AD9434] = {
> + .id = CHIPID_AD9434,
> + .max_rate = 500000000UL,
> + .scale_table = ad9434_scale_table,
> + .num_scales = ARRAY_SIZE(ad9434_scale_table),
> + .channels = ad9434_channels,
> + .num_channels = ARRAY_SIZE(ad9434_channels),
> + },
> [ID_AD9467] = {
> .id = CHIPID_AD9467,
> .max_rate = 250000000UL,
> @@ -318,10 +346,14 @@ static int ad9467_preenable_setup(struct adi_axi_adc_conv *conv)
>
> static int ad9467_setup(struct ad9467_state *st, unsigned int chip_id)
> {
> + st->output_mode = AN877_ADC_OUTPUT_MODE_TWOS_COMPLEMENT;
> +
> switch (chip_id) {
> + case CHIPID_AD9434:
> + st->output_mode |= AD9434_DEF_OUTPUT_MODE;
> + return 0;
> case CHIPID_AD9467:
> - st->output_mode = AD9467_DEF_OUTPUT_MODE |
> - AN877_ADC_OUTPUT_MODE_TWOS_COMPLEMENT;
> + st->output_mode |= AD9467_DEF_OUTPUT_MODE;
> return 0;
> default:
> return -ENODEV;
> @@ -404,6 +436,7 @@ static int ad9467_probe(struct spi_device *spi)
> }
>
> static const struct of_device_id ad9467_of_match[] = {
> + { .compatible = "adi,ad9434", .data = &ad9467_chip_tbl[ID_AD9434], },
> { .compatible = "adi,ad9467", .data = &ad9467_chip_tbl[ID_AD9467], },
> {}
> };
> --
> 2.25.1
>