Message ID | 20200921102850.192224-1-alexandru.ardelean@analog.com (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
Series | [1/2] iio: adc ad9467: add support for AD9434 high-speed ADC | expand |
On Mon, Sep 21, 2020 at 1:29 PM Alexandru Ardelean <alexandru.ardelean@analog.com> wrote: > > From: Michael Hennerich <michael.hennerich@analog.com> > > 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@analog.com> > Signed-off-by: Alexandru Ardelean <alexandru.ardelean@analog.com> > --- > 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 >
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], }, {} };