devicetree.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* [PATCH 1/2] iio: adc ad9467: add support for AD9434 high-speed ADC
@ 2020-09-21 10:28 Alexandru Ardelean
  2020-09-21 10:28 ` [PATCH 2/2] dt-bindings: iio: ad9467: add entry for for AD9434 ADC Alexandru Ardelean
  2020-09-22 11:02 ` [PATCH 1/2] iio: adc ad9467: add support for AD9434 high-speed ADC Alexandru Ardelean
  0 siblings, 2 replies; 3+ messages in thread
From: Alexandru Ardelean @ 2020-09-21 10:28 UTC (permalink / raw)
  To: linux-iio, devicetree, linux-kernel
  Cc: robh+dt, Michael Hennerich, Alexandru Ardelean

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.

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


^ permalink raw reply related	[flat|nested] 3+ messages in thread

* [PATCH 2/2] dt-bindings: iio: ad9467: add entry for for AD9434 ADC
  2020-09-21 10:28 [PATCH 1/2] iio: adc ad9467: add support for AD9434 high-speed ADC Alexandru Ardelean
@ 2020-09-21 10:28 ` Alexandru Ardelean
  2020-09-22 11:02 ` [PATCH 1/2] iio: adc ad9467: add support for AD9434 high-speed ADC Alexandru Ardelean
  1 sibling, 0 replies; 3+ messages in thread
From: Alexandru Ardelean @ 2020-09-21 10:28 UTC (permalink / raw)
  To: linux-iio, devicetree, linux-kernel; +Cc: robh+dt, Alexandru Ardelean

Add entry for the AD9434 high-speed ADC which is supported by the 'ad9467'
driver.

Signed-off-by: Alexandru Ardelean <alexandru.ardelean@analog.com>
---
 Documentation/devicetree/bindings/iio/adc/adi,ad9467.yaml | 1 +
 1 file changed, 1 insertion(+)

diff --git a/Documentation/devicetree/bindings/iio/adc/adi,ad9467.yaml b/Documentation/devicetree/bindings/iio/adc/adi,ad9467.yaml
index c4f57fa6aad1..0e8da8ee6975 100644
--- a/Documentation/devicetree/bindings/iio/adc/adi,ad9467.yaml
+++ b/Documentation/devicetree/bindings/iio/adc/adi,ad9467.yaml
@@ -19,6 +19,7 @@ description: |
 properties:
   compatible:
     enum:
+      - adi,ad9434
       - adi,ad9467
 
   reg:
-- 
2.25.1


^ permalink raw reply related	[flat|nested] 3+ messages in thread

* Re: [PATCH 1/2] iio: adc ad9467: add support for AD9434 high-speed ADC
  2020-09-21 10:28 [PATCH 1/2] iio: adc ad9467: add support for AD9434 high-speed ADC Alexandru Ardelean
  2020-09-21 10:28 ` [PATCH 2/2] dt-bindings: iio: ad9467: add entry for for AD9434 ADC Alexandru Ardelean
@ 2020-09-22 11:02 ` Alexandru Ardelean
  1 sibling, 0 replies; 3+ messages in thread
From: Alexandru Ardelean @ 2020-09-22 11:02 UTC (permalink / raw)
  To: Alexandru Ardelean
  Cc: linux-iio, devicetree, LKML, Rob Herring, Michael Hennerich

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
>

^ permalink raw reply	[flat|nested] 3+ messages in thread

end of thread, other threads:[~2020-09-22 11:02 UTC | newest]

Thread overview: 3+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2020-09-21 10:28 [PATCH 1/2] iio: adc ad9467: add support for AD9434 high-speed ADC Alexandru Ardelean
2020-09-21 10:28 ` [PATCH 2/2] dt-bindings: iio: ad9467: add entry for for AD9434 ADC Alexandru Ardelean
2020-09-22 11:02 ` [PATCH 1/2] iio: adc ad9467: add support for AD9434 high-speed ADC Alexandru Ardelean

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).