linux-kernel.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* [PATCH v7 0/5] Add support for AD7405/ADUM770x
@ 2025-06-05 15:09 Pop Ioan Daniel
  2025-06-05 15:09 ` [PATCH v7 1/5] iio: adc: ad4851: ad4851_set_oversampling_ratio parameters update Pop Ioan Daniel
                   ` (4 more replies)
  0 siblings, 5 replies; 11+ messages in thread
From: Pop Ioan Daniel @ 2025-06-05 15:09 UTC (permalink / raw)
  To: Lars-Peter Clausen, Michael Hennerich, Jonathan Cameron,
	David Lechner, Nuno Sá, Andy Shevchenko, Rob Herring,
	Krzysztof Kozlowski, Conor Dooley, Sergiu Cuciurean,
	Dragos Bogdan, Antoniu Miclaus, Olivier Moysan, Javier Carrasco,
	Matti Vaittinen, Angelo Dureghello, Tobias Sperling,
	Marcelo Schmitt, Trevor Gamblin, Ramona Alexandra Nechita,
	Pop Ioan Daniel, João Paulo Gonçalves, Herve Codina,
	linux-iio, devicetree, linux-kernel

The AD7405 is a high performance, second-order, Σ-Δ modulator
that converts an analog input signal into a high speed, single-bit
LVDS data stream, with on-chip digital isolation based on Analog
Devices, Inc., iCoupler technology. The AD7405 operates from a
4.5 V to 5.5 V (VDD1) power supply and accepts a differential input
signal of ±250 mV (±320 mV full-scale). The differential input is ideally
suited to shunt voltage monitoring in high voltage applications
where galvanic isolation is required.

MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

Pop Ioan Daniel (5):
  iio: adc: ad4851: ad4851_set_oversampling_ratio parameters update
  iio: backend: update iio_backend_oversampling_ratio_set
  iio: adc: adi-axi-adc: add axi_adc_oversampling_ratio_set
  dt-bindings: iio: adc: add ad7405
  iio: adc: ad7405: add ad7405 driver

 .../bindings/iio/adc/adi,ad7405.yaml          |  60 ++++
 drivers/iio/adc/Kconfig                       |  10 +
 drivers/iio/adc/Makefile                      |   1 +
 drivers/iio/adc/ad4851.c                      |   6 +-
 drivers/iio/adc/ad7405.c                      | 259 ++++++++++++++++++
 drivers/iio/adc/adi-axi-adc.c                 |  20 +-
 drivers/iio/industrialio-backend.c            |   3 +-
 include/linux/iio/backend.h                   |   3 +-
 8 files changed, 356 insertions(+), 6 deletions(-)
 create mode 100644 Documentation/devicetree/bindings/iio/adc/adi,ad7405.yaml
 create mode 100644 drivers/iio/adc/ad7405.c

-- 
2.34.1


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

* [PATCH v7 1/5] iio: adc: ad4851: ad4851_set_oversampling_ratio parameters update
  2025-06-05 15:09 [PATCH v7 0/5] Add support for AD7405/ADUM770x Pop Ioan Daniel
@ 2025-06-05 15:09 ` Pop Ioan Daniel
  2025-06-05 15:09 ` [PATCH v7 2/5] iio: backend: update iio_backend_oversampling_ratio_set Pop Ioan Daniel
                   ` (3 subsequent siblings)
  4 siblings, 0 replies; 11+ messages in thread
From: Pop Ioan Daniel @ 2025-06-05 15:09 UTC (permalink / raw)
  To: Lars-Peter Clausen, Michael Hennerich, Jonathan Cameron,
	David Lechner, Nuno Sá, Andy Shevchenko, Rob Herring,
	Krzysztof Kozlowski, Conor Dooley, Sergiu Cuciurean,
	Dragos Bogdan, Antoniu Miclaus, Olivier Moysan, Javier Carrasco,
	Matti Vaittinen, Angelo Dureghello, Tobias Sperling,
	Marcelo Schmitt, Trevor Gamblin, Pop Ioan Daniel, Matteo Martelli,
	AngeloGioacchino Del Regno, Thomas Bonnefille,
	Ramona Alexandra Nechita, linux-iio, devicetree, linux-kernel

Remove chan parameter from ad4851_set_oversampling_ratio parameters
list because the parameter is not used.

Reviewed-by: David Lechner <dlechner@baylibre.com>
Signed-off-by: Pop Ioan Daniel <pop.ioan-daniel@analog.com>
---
no changes in v7.
 drivers/iio/adc/ad4851.c | 3 +--
 1 file changed, 1 insertion(+), 2 deletions(-)

diff --git a/drivers/iio/adc/ad4851.c b/drivers/iio/adc/ad4851.c
index 98ebc853db79..12f90aa3a156 100644
--- a/drivers/iio/adc/ad4851.c
+++ b/drivers/iio/adc/ad4851.c
@@ -294,7 +294,6 @@ static int ad4851_scale_fill(struct iio_dev *indio_dev)
 }
 
 static int ad4851_set_oversampling_ratio(struct iio_dev *indio_dev,
-					 const struct iio_chan_spec *chan,
 					 unsigned int osr)
 {
 	struct ad4851_state *st = iio_priv(indio_dev);
@@ -831,7 +830,7 @@ static int ad4851_write_raw(struct iio_dev *indio_dev,
 	case IIO_CHAN_INFO_CALIBBIAS:
 		return ad4851_set_calibbias(st, chan->channel, val);
 	case IIO_CHAN_INFO_OVERSAMPLING_RATIO:
-		return ad4851_set_oversampling_ratio(indio_dev, chan, val);
+		return ad4851_set_oversampling_ratio(indio_dev, val);
 	default:
 		return -EINVAL;
 	}
-- 
2.34.1


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

* [PATCH v7 2/5] iio: backend: update iio_backend_oversampling_ratio_set
  2025-06-05 15:09 [PATCH v7 0/5] Add support for AD7405/ADUM770x Pop Ioan Daniel
  2025-06-05 15:09 ` [PATCH v7 1/5] iio: adc: ad4851: ad4851_set_oversampling_ratio parameters update Pop Ioan Daniel
@ 2025-06-05 15:09 ` Pop Ioan Daniel
  2025-06-05 15:09 ` [PATCH v7 3/5] iio: adc: adi-axi-adc: add axi_adc_oversampling_ratio_set Pop Ioan Daniel
                   ` (2 subsequent siblings)
  4 siblings, 0 replies; 11+ messages in thread
From: Pop Ioan Daniel @ 2025-06-05 15:09 UTC (permalink / raw)
  To: Lars-Peter Clausen, Michael Hennerich, Jonathan Cameron,
	David Lechner, Nuno Sá, Andy Shevchenko, Rob Herring,
	Krzysztof Kozlowski, Conor Dooley, Sergiu Cuciurean,
	Dragos Bogdan, Antoniu Miclaus, Olivier Moysan, Javier Carrasco,
	Matti Vaittinen, Angelo Dureghello, Marcelo Schmitt,
	Tobias Sperling, Trevor Gamblin, Matteo Martelli,
	Thomas Bonnefille, João Paulo Gonçalves,
	Alisa-Dariana Roman, Ramona Alexandra Nechita, Ioan Daniel,
	linux-iio, devicetree, linux-kernel

Add chan parameter to iio_backend_oversampling_ratio_set() to allow
for contexts where the channel must be specified. Modify all
existing users.

Reviewed-by: David Lechner <dlechner@baylibre.com>
Reviewed-by: Nuno Sá <nuno.sa@analog.com>
Signed-off-by: Pop Ioan Daniel <pop.ioan-daniel@analog.com>
---
no changes in v7.
 drivers/iio/adc/ad4851.c           | 3 ++-
 drivers/iio/adc/adi-axi-adc.c      | 3 ++-
 drivers/iio/industrialio-backend.c | 3 ++-
 include/linux/iio/backend.h        | 3 ++-
 4 files changed, 8 insertions(+), 4 deletions(-)

diff --git a/drivers/iio/adc/ad4851.c b/drivers/iio/adc/ad4851.c
index 12f90aa3a156..f395fa9f654a 100644
--- a/drivers/iio/adc/ad4851.c
+++ b/drivers/iio/adc/ad4851.c
@@ -320,7 +320,8 @@ static int ad4851_set_oversampling_ratio(struct iio_dev *indio_dev,
 			return ret;
 	}
 
-	ret = iio_backend_oversampling_ratio_set(st->back, osr);
+	/* Channel is ignored by the backend being used here */
+	ret = iio_backend_oversampling_ratio_set(st->back, 0, osr);
 	if (ret)
 		return ret;
 
diff --git a/drivers/iio/adc/adi-axi-adc.c b/drivers/iio/adc/adi-axi-adc.c
index 4116c44197b8..9e8c30230791 100644
--- a/drivers/iio/adc/adi-axi-adc.c
+++ b/drivers/iio/adc/adi-axi-adc.c
@@ -381,7 +381,8 @@ static int axi_adc_ad485x_data_size_set(struct iio_backend *back,
 }
 
 static int axi_adc_ad485x_oversampling_ratio_set(struct iio_backend *back,
-					  unsigned int ratio)
+						 unsigned int chan,
+						 unsigned int ratio)
 {
 	struct adi_axi_adc_state *st = iio_backend_get_priv(back);
 
diff --git a/drivers/iio/industrialio-backend.c b/drivers/iio/industrialio-backend.c
index c1eb9ef9db08..a4e3e54fecb1 100644
--- a/drivers/iio/industrialio-backend.c
+++ b/drivers/iio/industrialio-backend.c
@@ -720,9 +720,10 @@ EXPORT_SYMBOL_NS_GPL(iio_backend_data_size_set, "IIO_BACKEND");
  * 0 on success, negative error number on failure.
  */
 int iio_backend_oversampling_ratio_set(struct iio_backend *back,
+				       unsigned int chan,
 				       unsigned int ratio)
 {
-	return iio_backend_op_call(back, oversampling_ratio_set, ratio);
+	return iio_backend_op_call(back, oversampling_ratio_set, chan, ratio);
 }
 EXPORT_SYMBOL_NS_GPL(iio_backend_oversampling_ratio_set, "IIO_BACKEND");
 
diff --git a/include/linux/iio/backend.h b/include/linux/iio/backend.h
index e59d909cb659..dbf4e4a5f4b1 100644
--- a/include/linux/iio/backend.h
+++ b/include/linux/iio/backend.h
@@ -144,7 +144,7 @@ struct iio_backend_ops {
 				  enum iio_backend_interface_type *type);
 	int (*data_size_set)(struct iio_backend *back, unsigned int size);
 	int (*oversampling_ratio_set)(struct iio_backend *back,
-				      unsigned int ratio);
+				      unsigned int chan, unsigned int ratio);
 	int (*read_raw)(struct iio_backend *back,
 			struct iio_chan_spec const *chan, int *val, int *val2,
 			long mask);
@@ -209,6 +209,7 @@ int iio_backend_interface_type_get(struct iio_backend *back,
 				   enum iio_backend_interface_type *type);
 int iio_backend_data_size_set(struct iio_backend *back, unsigned int size);
 int iio_backend_oversampling_ratio_set(struct iio_backend *back,
+				       unsigned int chan,
 				       unsigned int ratio);
 int iio_backend_read_raw(struct iio_backend *back,
 			 struct iio_chan_spec const *chan, int *val, int *val2,
-- 
2.34.1


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

* [PATCH v7 3/5] iio: adc: adi-axi-adc: add axi_adc_oversampling_ratio_set
  2025-06-05 15:09 [PATCH v7 0/5] Add support for AD7405/ADUM770x Pop Ioan Daniel
  2025-06-05 15:09 ` [PATCH v7 1/5] iio: adc: ad4851: ad4851_set_oversampling_ratio parameters update Pop Ioan Daniel
  2025-06-05 15:09 ` [PATCH v7 2/5] iio: backend: update iio_backend_oversampling_ratio_set Pop Ioan Daniel
@ 2025-06-05 15:09 ` Pop Ioan Daniel
  2025-06-05 15:09 ` [PATCH v7 4/5] dt-bindings: iio: adc: add ad7405 Pop Ioan Daniel
  2025-06-05 15:09 ` [PATCH v7 5/5] iio: adc: ad7405: add ad7405 driver Pop Ioan Daniel
  4 siblings, 0 replies; 11+ messages in thread
From: Pop Ioan Daniel @ 2025-06-05 15:09 UTC (permalink / raw)
  To: Lars-Peter Clausen, Michael Hennerich, Jonathan Cameron,
	David Lechner, Nuno Sá, Andy Shevchenko, Rob Herring,
	Krzysztof Kozlowski, Conor Dooley, Sergiu Cuciurean,
	Dragos Bogdan, Antoniu Miclaus, Olivier Moysan, Javier Carrasco,
	Matti Vaittinen, Guillaume Stols, Tobias Sperling,
	Marcelo Schmitt, Trevor Gamblin, Esteban Blanc,
	João Paulo Gonçalves, Ioan Daniel, linux-iio,
	devicetree, linux-kernel

Add support for setting decimation rate.

Reviewed-by: David Lechner <dlechner@baylibre.com>
Reviewed-by: Nuno Sá <nuno.sa@analog.com>
Signed-off-by: Pop Ioan Daniel <pop.ioan-daniel@analog.com>
---
no changes in v7.
 drivers/iio/adc/adi-axi-adc.c | 17 +++++++++++++++++
 1 file changed, 17 insertions(+)

diff --git a/drivers/iio/adc/adi-axi-adc.c b/drivers/iio/adc/adi-axi-adc.c
index 9e8c30230791..0b8673668745 100644
--- a/drivers/iio/adc/adi-axi-adc.c
+++ b/drivers/iio/adc/adi-axi-adc.c
@@ -80,6 +80,9 @@
 #define ADI_AXI_ADC_REG_CHAN_CTRL_3(c)		(0x0418 + (c) * 0x40)
 #define   ADI_AXI_ADC_CHAN_PN_SEL_MASK		GENMASK(19, 16)
 
+#define ADI_AXI_ADC_REG_CHAN_USR_CTRL_2(c)	(0x0424 + (c) * 0x40)
+#define   ADI_AXI_ADC_CHAN_USR_CTRL_2_DEC_RATE_N_MASK		GENMASK(15, 0)
+
 /* IO Delays */
 #define ADI_AXI_ADC_REG_DELAY(l)		(0x0800 + (l) * 0x4)
 #define   AXI_ADC_DELAY_CTRL_MASK		GENMASK(4, 0)
@@ -242,6 +245,19 @@ static int axi_adc_test_pattern_set(struct iio_backend *back,
 	}
 }
 
+static int axi_adc_oversampling_ratio_set(struct iio_backend *back,
+					  unsigned int chan,
+					  unsigned int rate)
+{
+	struct adi_axi_adc_state *st = iio_backend_get_priv(back);
+
+	return regmap_update_bits(st->regmap,
+				  ADI_AXI_ADC_REG_CHAN_USR_CTRL_2(chan),
+				  ADI_AXI_ADC_CHAN_USR_CTRL_2_DEC_RATE_N_MASK,
+				  FIELD_PREP(ADI_AXI_ADC_CHAN_USR_CTRL_2_DEC_RATE_N_MASK,
+					     rate));
+}
+
 static int axi_adc_read_chan_status(struct adi_axi_adc_state *st, unsigned int chan,
 				    unsigned int *status)
 {
@@ -550,6 +566,7 @@ static const struct iio_backend_ops adi_axi_adc_ops = {
 	.test_pattern_set = axi_adc_test_pattern_set,
 	.chan_status = axi_adc_chan_status,
 	.interface_type_get = axi_adc_interface_type_get,
+	.oversampling_ratio_set = axi_adc_oversampling_ratio_set,
 	.debugfs_reg_access = iio_backend_debugfs_ptr(axi_adc_reg_access),
 	.debugfs_print_chan_status = iio_backend_debugfs_ptr(axi_adc_debugfs_print_chan_status),
 };
-- 
2.34.1


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

* [PATCH v7 4/5] dt-bindings: iio: adc: add ad7405
  2025-06-05 15:09 [PATCH v7 0/5] Add support for AD7405/ADUM770x Pop Ioan Daniel
                   ` (2 preceding siblings ...)
  2025-06-05 15:09 ` [PATCH v7 3/5] iio: adc: adi-axi-adc: add axi_adc_oversampling_ratio_set Pop Ioan Daniel
@ 2025-06-05 15:09 ` Pop Ioan Daniel
  2025-06-05 15:09 ` [PATCH v7 5/5] iio: adc: ad7405: add ad7405 driver Pop Ioan Daniel
  4 siblings, 0 replies; 11+ messages in thread
From: Pop Ioan Daniel @ 2025-06-05 15:09 UTC (permalink / raw)
  To: Lars-Peter Clausen, Michael Hennerich, Jonathan Cameron,
	David Lechner, Nuno Sá, Andy Shevchenko, Rob Herring,
	Krzysztof Kozlowski, Conor Dooley, Sergiu Cuciurean,
	Dragos Bogdan, Antoniu Miclaus, Olivier Moysan, Javier Carrasco,
	Matti Vaittinen, Tobias Sperling, Marcelo Schmitt, Trevor Gamblin,
	Ramona Alexandra Nechita, Herve Codina, Ioan Daniel, linux-iio,
	devicetree, linux-kernel
  Cc: Krzysztof Kozlowski

Add devicetree bindings for ad7405/adum770x family.

Reviewed-by: Krzysztof Kozlowski <krzysztof.kozlowski@linaro.org>
Signed-off-by: Pop Ioan Daniel <pop.ioan-daniel@analog.com>
---
changes in v7:
 - add Reviewed-by: tag
 .../bindings/iio/adc/adi,ad7405.yaml          | 60 +++++++++++++++++++
 1 file changed, 60 insertions(+)
 create mode 100644 Documentation/devicetree/bindings/iio/adc/adi,ad7405.yaml

diff --git a/Documentation/devicetree/bindings/iio/adc/adi,ad7405.yaml b/Documentation/devicetree/bindings/iio/adc/adi,ad7405.yaml
new file mode 100644
index 000000000000..57f097025705
--- /dev/null
+++ b/Documentation/devicetree/bindings/iio/adc/adi,ad7405.yaml
@@ -0,0 +1,60 @@
+# SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause)
+# Copyright 2025 Analog Devices Inc.
+%YAML 1.2
+---
+$id: http://devicetree.org/schemas/iio/adc/adi,ad7405.yaml#
+$schema: http://devicetree.org/meta-schemas/core.yaml#
+
+title: Analog Devices AD7405 family
+
+maintainers:
+  - Dragos Bogdan <dragos.bogdan@analog.com>
+  - Pop Ioan Daniel <pop.ioan-daniel@analog.com>
+
+description: |
+  Analog Devices AD7405 is a high performance isolated ADC, 1-channel,
+  16-bit with a second-order Σ-Δ modulator that converts an analog input signal
+  into a high speed, single-bit data stream.
+
+  https://www.analog.com/media/en/technical-documentation/data-sheets/ad7405.pdf
+  https://www.analog.com/media/en/technical-documentation/data-sheets/adum7701.pdf
+  https://www.analog.com/media/en/technical-documentation/data-sheets/adum7702.pdf
+  https://www.analog.com/media/en/technical-documentation/data-sheets/ADuM7703.pdf
+
+properties:
+  compatible:
+    enum:
+      - adi,ad7405
+      - adi,adum7701
+      - adi,adum7702
+      - adi,adum7703
+
+  clocks:
+    maxItems: 1
+
+  vdd1-supply: true
+
+  vdd2-supply: true
+
+  io-backends:
+    maxItems: 1
+
+required:
+  - compatible
+  - clocks
+  - vdd1-supply
+  - vdd2-supply
+  - io-backends
+
+additionalProperties: false
+
+examples:
+  - |
+    adc {
+        compatible = "adi,ad7405";
+        clocks = <&axi_clk_gen 0>;
+        vdd1-supply = <&vdd1>;
+        vdd2-supply = <&vdd2>;
+        io-backends = <&axi_adc>;
+    };
+...
-- 
2.34.1


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

* [PATCH v7 5/5] iio: adc: ad7405: add ad7405 driver
  2025-06-05 15:09 [PATCH v7 0/5] Add support for AD7405/ADUM770x Pop Ioan Daniel
                   ` (3 preceding siblings ...)
  2025-06-05 15:09 ` [PATCH v7 4/5] dt-bindings: iio: adc: add ad7405 Pop Ioan Daniel
@ 2025-06-05 15:09 ` Pop Ioan Daniel
  2025-06-07 15:44   ` Jonathan Cameron
  2025-06-09  8:05   ` Nuno Sá
  4 siblings, 2 replies; 11+ messages in thread
From: Pop Ioan Daniel @ 2025-06-05 15:09 UTC (permalink / raw)
  To: Lars-Peter Clausen, Michael Hennerich, Jonathan Cameron,
	David Lechner, Nuno Sá, Andy Shevchenko, Rob Herring,
	Krzysztof Kozlowski, Conor Dooley, Sergiu Cuciurean,
	Dragos Bogdan, Antoniu Miclaus, Olivier Moysan, Javier Carrasco,
	Matti Vaittinen, Angelo Dureghello, Guillaume Stols,
	Tobias Sperling, Marcelo Schmitt, Trevor Gamblin,
	Alisa-Dariana Roman, Ramona Alexandra Nechita, Herve Codina,
	AngeloGioacchino Del Regno, Thomas Bonnefille,
	João Paulo Gonçalves, Ioan Daniel, linux-iio,
	devicetree, linux-kernel

Add support for the AD7405/ADUM770x, a high performance isolated ADC,
1-channel, 16-bit with a second-order Σ-Δ modulator that converts an
analog input signal into a high speed, single-bit data stream.

Signed-off-by: Pop Ioan Daniel <pop.ioan-daniel@analog.com>
---
changes in v7:
 - replace kernel.h with math64.h that define DIV_ROUND_CLOSEST_ULL()
 - restructure ad7405_set_dec_rate function
 - fix indentation
 drivers/iio/adc/Kconfig  |  10 ++
 drivers/iio/adc/Makefile |   1 +
 drivers/iio/adc/ad7405.c | 259 +++++++++++++++++++++++++++++++++++++++
 3 files changed, 270 insertions(+)
 create mode 100644 drivers/iio/adc/ad7405.c

diff --git a/drivers/iio/adc/Kconfig b/drivers/iio/adc/Kconfig
index ad06cf556785..43af2070e27f 100644
--- a/drivers/iio/adc/Kconfig
+++ b/drivers/iio/adc/Kconfig
@@ -251,6 +251,16 @@ config AD7380
 	  To compile this driver as a module, choose M here: the module will be
 	  called ad7380.
 
+config AD7405
+	tristate "Analog Device AD7405 ADC Driver"
+	depends on IIO_BACKEND
+	help
+	  Say yes here to build support for Analog Devices AD7405, ADUM7701,
+	  ADUM7702, ADUM7703 analog to digital converters (ADC).
+
+	  To compile this driver as a module, choose M here: the module will be
+	  called ad7405.
+
 config AD7476
 	tristate "Analog Devices AD7476 1-channel ADCs driver and other similar devices from AD and TI"
 	depends on SPI
diff --git a/drivers/iio/adc/Makefile b/drivers/iio/adc/Makefile
index 07d4b832c42e..8115f30b7862 100644
--- a/drivers/iio/adc/Makefile
+++ b/drivers/iio/adc/Makefile
@@ -26,6 +26,7 @@ obj-$(CONFIG_AD7291) += ad7291.o
 obj-$(CONFIG_AD7292) += ad7292.o
 obj-$(CONFIG_AD7298) += ad7298.o
 obj-$(CONFIG_AD7380) += ad7380.o
+obj-$(CONFIG_AD7405) += ad7405.o
 obj-$(CONFIG_AD7476) += ad7476.o
 obj-$(CONFIG_AD7606_IFACE_PARALLEL) += ad7606_par.o
 obj-$(CONFIG_AD7606_IFACE_SPI) += ad7606_spi.o
diff --git a/drivers/iio/adc/ad7405.c b/drivers/iio/adc/ad7405.c
new file mode 100644
index 000000000000..c07b90fbd429
--- /dev/null
+++ b/drivers/iio/adc/ad7405.c
@@ -0,0 +1,259 @@
+// SPDX-License-Identifier: GPL-2.0-only
+/*
+ * Analog Devices AD7405 driver
+ *
+ * Copyright 2025 Analog Devices Inc.
+ */
+
+#include <linux/clk.h>
+#include <linux/device.h>
+#include <linux/err.h>
+#include <linux/math64.h>
+#include <linux/module.h>
+#include <linux/mod_devicetable.h>
+#include <linux/platform_device.h>
+#include <linux/property.h>
+#include <linux/regulator/consumer.h>
+#include <linux/util_macros.h>
+
+#include <linux/iio/backend.h>
+#include <linux/iio/iio.h>
+
+static const unsigned int ad7405_dec_rates_range[] = {
+	32, 1, 4096,
+};
+
+struct ad7405_chip_info {
+	const char *name;
+	struct iio_chan_spec channel;
+	const unsigned int full_scale_mv;
+};
+
+struct ad7405_state {
+	struct iio_backend *back;
+	const struct ad7405_chip_info *info;
+	unsigned int ref_frequency;
+	unsigned int dec_rate;
+};
+
+static int ad7405_set_dec_rate(struct iio_dev *indio_dev,
+			       const struct iio_chan_spec *chan,
+			       unsigned int dec_rate)
+{
+	struct ad7405_state *st = iio_priv(indio_dev);
+	int ret;
+
+	if (dec_rate > 4096 || dec_rate < 32)
+		return -EINVAL;
+
+	if (!iio_device_claim_direct(indio_dev))
+		return -EBUSY;
+
+	ret = iio_backend_oversampling_ratio_set(st->back, chan->scan_index, dec_rate);
+	iio_device_release_direct(indio_dev);
+
+	if (ret < 0)
+		return ret;
+
+	st->dec_rate = dec_rate;
+
+	return 0;
+}
+
+static int ad7405_read_raw(struct iio_dev *indio_dev,
+			   const struct iio_chan_spec *chan, int *val,
+			   int *val2, long info)
+{
+	struct ad7405_state *st = iio_priv(indio_dev);
+
+	switch (info) {
+	case IIO_CHAN_INFO_SCALE:
+		*val = st->info->full_scale_mv;
+		*val2 = st->info->channel.scan_type.realbits - 1;
+		return IIO_VAL_FRACTIONAL_LOG2;
+	case IIO_CHAN_INFO_OVERSAMPLING_RATIO:
+		*val = st->dec_rate;
+		return IIO_VAL_INT;
+	case IIO_CHAN_INFO_SAMP_FREQ:
+		*val = DIV_ROUND_CLOSEST_ULL(st->ref_frequency, st->dec_rate);
+		return IIO_VAL_INT;
+	case IIO_CHAN_INFO_OFFSET:
+		*val = -(1 << (st->info->channel.scan_type.realbits - 1));
+		return IIO_VAL_INT;
+	default:
+		return -EINVAL;
+	}
+}
+
+static int ad7405_write_raw(struct iio_dev *indio_dev,
+			    struct iio_chan_spec const *chan, int val,
+			    int val2, long info)
+{
+	switch (info) {
+	case IIO_CHAN_INFO_OVERSAMPLING_RATIO:
+		if (val < 0)
+			return -EINVAL;
+		return ad7405_set_dec_rate(indio_dev, chan, val);
+	default:
+		return -EINVAL;
+	}
+}
+
+static int ad7405_read_avail(struct iio_dev *indio_dev,
+			     struct iio_chan_spec const *chan,
+			     const int **vals, int *type, int *length,
+			     long info)
+{
+	switch (info) {
+	case IIO_CHAN_INFO_OVERSAMPLING_RATIO:
+		*vals = ad7405_dec_rates_range;
+		*type = IIO_VAL_INT;
+		return IIO_AVAIL_RANGE;
+	default:
+		return -EINVAL;
+	}
+}
+
+static const struct iio_info ad7405_iio_info = {
+	.read_raw = &ad7405_read_raw,
+	.write_raw = &ad7405_write_raw,
+	.read_avail = &ad7405_read_avail,
+};
+
+#define AD7405_IIO_CHANNEL {					\
+	.type = IIO_VOLTAGE,					\
+	.info_mask_shared_by_type = BIT(IIO_CHAN_INFO_SCALE) |	\
+			BIT(IIO_CHAN_INFO_OFFSET),		\
+	.info_mask_shared_by_all = IIO_CHAN_INFO_SAMP_FREQ |	\
+			BIT(IIO_CHAN_INFO_OVERSAMPLING_RATIO),	\
+	.info_mask_shared_by_all_available =			\
+			BIT(IIO_CHAN_INFO_OVERSAMPLING_RATIO),	\
+	.indexed = 1,						\
+	.channel = 0,						\
+	.channel2 = 1,						\
+	.differential = 1,					\
+	.scan_index = 0,					\
+	.scan_type = {						\
+		.sign = 'u',					\
+		.realbits = 16,					\
+		.storagebits = 16,				\
+	},							\
+}
+
+static const struct ad7405_chip_info ad7405_chip_info = {
+	.name = "ad7405",
+	.full_scale_mv = 320,
+	.channel = AD7405_IIO_CHANNEL,
+};
+
+static const struct ad7405_chip_info adum7701_chip_info = {
+	.name = "adum7701",
+	.full_scale_mv = 320,
+	.channel = AD7405_IIO_CHANNEL,
+};
+
+static const struct ad7405_chip_info adum7702_chip_info = {
+	.name = "adum7702",
+	.full_scale_mv = 64,
+	.channel = AD7405_IIO_CHANNEL,
+};
+
+static const struct ad7405_chip_info adum7703_chip_info = {
+	.name = "adum7703",
+	.full_scale_mv = 320,
+	.channel = AD7405_IIO_CHANNEL,
+};
+
+static const char * const ad7405_power_supplies[] = {
+	"vdd1",	"vdd2",
+};
+
+static int ad7405_probe(struct platform_device *pdev)
+{
+	struct device *dev = &pdev->dev;
+	struct iio_dev *indio_dev;
+	struct ad7405_state *st;
+	struct clk *clk;
+	int ret;
+
+	indio_dev = devm_iio_device_alloc(dev, sizeof(*st));
+	if (!indio_dev)
+		return -ENOMEM;
+
+	st = iio_priv(indio_dev);
+
+	st->info = device_get_match_data(dev);
+	if (!st->info)
+		return dev_err_probe(dev, -EINVAL, "no chip info\n");
+
+	ret = devm_regulator_bulk_get_enable(dev, ARRAY_SIZE(ad7405_power_supplies),
+					     ad7405_power_supplies);
+	if (ret)
+		return dev_err_probe(dev, ret, "failed to get and enable supplies");
+
+	clk = devm_clk_get_enabled(dev, NULL);
+	if (IS_ERR(clk))
+		return PTR_ERR(clk);
+
+	st->ref_frequency = clk_get_rate(clk);
+	if (!st->ref_frequency)
+		return -EINVAL;
+
+	indio_dev->name = st->info->name;
+	indio_dev->channels = &st->info->channel;
+	indio_dev->num_channels = 1;
+	indio_dev->info = &ad7405_iio_info;
+
+	st->back = devm_iio_backend_get(dev, NULL);
+	if (IS_ERR(st->back))
+		return dev_err_probe(dev, PTR_ERR(st->back),
+				     "failed to get IIO backend");
+
+	ret = iio_backend_chan_enable(st->back, 0);
+	if (ret)
+		return ret;
+
+	ret = devm_iio_backend_request_buffer(dev, st->back, indio_dev);
+	if (ret)
+		return ret;
+
+	ret = devm_iio_backend_enable(dev, st->back);
+	if (ret)
+		return ret;
+
+	/*
+	 * Set 256 decimation rate. The default value in the AXI_ADC register
+	 * is 0, so we set the register with a decimation rate value that is
+	 * functional for all parts.
+	 */
+	ret = ad7405_set_dec_rate(indio_dev, &indio_dev->channels[0], 256);
+	if (ret)
+		return ret;
+
+	return devm_iio_device_register(dev, indio_dev);
+}
+
+static const struct of_device_id ad7405_of_match[] = {
+	{ .compatible = "adi,ad7405", .data = &ad7405_chip_info, },
+	{ .compatible = "adi,adum7701", .data = &adum7701_chip_info, },
+	{ .compatible = "adi,adum7702", .data = &adum7702_chip_info, },
+	{ .compatible = "adi,adum7703", .data = &adum7703_chip_info, },
+	{ }
+};
+MODULE_DEVICE_TABLE(of, ad7405_of_match);
+
+static struct platform_driver ad7405_driver = {
+	.driver = {
+		.name = "ad7405",
+		.owner = THIS_MODULE,
+		.of_match_table = ad7405_of_match,
+	},
+	.probe = ad7405_probe,
+};
+module_platform_driver(ad7405_driver);
+
+MODULE_AUTHOR("Dragos Bogdan <dragos.bogdan@analog.com>");
+MODULE_AUTHOR("Pop Ioan Daniel <pop.ioan-daniel@analog.com>");
+MODULE_DESCRIPTION("Analog Devices AD7405 driver");
+MODULE_LICENSE("GPL");
+MODULE_IMPORT_NS("IIO_BACKEND");
-- 
2.34.1


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

* Re: [PATCH v7 5/5] iio: adc: ad7405: add ad7405 driver
  2025-06-05 15:09 ` [PATCH v7 5/5] iio: adc: ad7405: add ad7405 driver Pop Ioan Daniel
@ 2025-06-07 15:44   ` Jonathan Cameron
  2025-06-10 12:09     ` Ioan-daniel, Pop
  2025-06-09  8:05   ` Nuno Sá
  1 sibling, 1 reply; 11+ messages in thread
From: Jonathan Cameron @ 2025-06-07 15:44 UTC (permalink / raw)
  To: Pop Ioan Daniel
  Cc: Lars-Peter Clausen, Michael Hennerich, David Lechner,
	Nuno Sá, Andy Shevchenko, Rob Herring, Krzysztof Kozlowski,
	Conor Dooley, Sergiu Cuciurean, Dragos Bogdan, Antoniu Miclaus,
	Olivier Moysan, Javier Carrasco, Matti Vaittinen,
	Angelo Dureghello, Guillaume Stols, Tobias Sperling,
	Marcelo Schmitt, Trevor Gamblin, Alisa-Dariana Roman,
	Ramona Alexandra Nechita, Herve Codina,
	AngeloGioacchino Del Regno, Thomas Bonnefille,
	João Paulo Gonçalves, linux-iio, devicetree,
	linux-kernel

On Thu, 5 Jun 2025 18:09:43 +0300
Pop Ioan Daniel <pop.ioan-daniel@analog.com> wrote:

> Add support for the AD7405/ADUM770x, a high performance isolated ADC,
> 1-channel, 16-bit with a second-order Σ-Δ modulator that converts an
> analog input signal into a high speed, single-bit data stream.
> 
> Signed-off-by: Pop Ioan Daniel <pop.ioan-daniel@analog.com>

Hi Pop,

Only one comment from me. I can tidy that up whilst applying but
given there were 3 versions and quite a bit of feedback in the last week
I'd like to give others time to take another look before picking this up.

If everyone is happy with it, I'll apply with tweak as below unless
you let me know you will be using different channel types in a follow
up series that you are going to post very soon?

Jonathan

> diff --git a/drivers/iio/adc/ad7405.c b/drivers/iio/adc/ad7405.c
> new file mode 100644
> index 000000000000..c07b90fbd429
> --- /dev/null
> +++ b/drivers/iio/adc/ad7405.c
> @@ -0,0 +1,259 @@

> +#define AD7405_IIO_CHANNEL {					\
> +	.type = IIO_VOLTAGE,					\
> +	.info_mask_shared_by_type = BIT(IIO_CHAN_INFO_SCALE) |	\
> +			BIT(IIO_CHAN_INFO_OFFSET),		\
> +	.info_mask_shared_by_all = IIO_CHAN_INFO_SAMP_FREQ |	\
> +			BIT(IIO_CHAN_INFO_OVERSAMPLING_RATIO),	\
> +	.info_mask_shared_by_all_available =			\
> +			BIT(IIO_CHAN_INFO_OVERSAMPLING_RATIO),	\
> +	.indexed = 1,						\
> +	.channel = 0,						\
> +	.channel2 = 1,						\
> +	.differential = 1,					\
> +	.scan_index = 0,					\
> +	.scan_type = {						\
> +		.sign = 'u',					\
> +		.realbits = 16,					\
> +		.storagebits = 16,				\
> +	},							\
> +}
> +
> +static const struct ad7405_chip_info ad7405_chip_info = {
> +	.name = "ad7405",
> +	.full_scale_mv = 320,
> +	.channel = AD7405_IIO_CHANNEL,

Why do we need this .channel element if all instances use the
same one?  If you are are shortly going to add support for more devices
where this will change then this is ok.  If not, just have one
static const channel and use that without looking it up via these
chip_info structures.


> +};
> +
> +static const struct ad7405_chip_info adum7701_chip_info = {
> +	.name = "adum7701",
> +	.full_scale_mv = 320,
> +	.channel = AD7405_IIO_CHANNEL,
> +};
> +
> +static const struct ad7405_chip_info adum7702_chip_info = {
> +	.name = "adum7702",
> +	.full_scale_mv = 64,
> +	.channel = AD7405_IIO_CHANNEL,
> +};
> +
> +static const struct ad7405_chip_info adum7703_chip_info = {
> +	.name = "adum7703",
> +	.full_scale_mv = 320,
> +	.channel = AD7405_IIO_CHANNEL,
> +};


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

* Re: [PATCH v7 5/5] iio: adc: ad7405: add ad7405 driver
  2025-06-05 15:09 ` [PATCH v7 5/5] iio: adc: ad7405: add ad7405 driver Pop Ioan Daniel
  2025-06-07 15:44   ` Jonathan Cameron
@ 2025-06-09  8:05   ` Nuno Sá
  1 sibling, 0 replies; 11+ messages in thread
From: Nuno Sá @ 2025-06-09  8:05 UTC (permalink / raw)
  To: Pop Ioan Daniel, Lars-Peter Clausen, Michael Hennerich,
	Jonathan Cameron, David Lechner, Nuno Sá, Andy Shevchenko,
	Rob Herring, Krzysztof Kozlowski, Conor Dooley, Sergiu Cuciurean,
	Dragos Bogdan, Antoniu Miclaus, Olivier Moysan, Javier Carrasco,
	Matti Vaittinen, Angelo Dureghello, Guillaume Stols,
	Tobias Sperling, Marcelo Schmitt, Trevor Gamblin,
	Alisa-Dariana Roman, Ramona Alexandra Nechita, Herve Codina,
	AngeloGioacchino Del Regno, Thomas Bonnefille,
	João Paulo Gonçalves, linux-iio, devicetree,
	linux-kernel

On Thu, 2025-06-05 at 18:09 +0300, Pop Ioan Daniel wrote:
> Add support for the AD7405/ADUM770x, a high performance isolated ADC,
> 1-channel, 16-bit with a second-order Σ-Δ modulator that converts an
> analog input signal into a high speed, single-bit data stream.
> 
> Signed-off-by: Pop Ioan Daniel <pop.ioan-daniel@analog.com>
> ---

Looks good. Just one thing that I guess Jonathan can tweak. With it,

Reviewed-by: Nuno Sá <nuno.sa@analog.com>

> changes in v7:
>  - replace kernel.h with math64.h that define DIV_ROUND_CLOSEST_ULL()
>  - restructure ad7405_set_dec_rate function
>  - fix indentation
>  drivers/iio/adc/Kconfig  |  10 ++
>  drivers/iio/adc/Makefile |   1 +
>  drivers/iio/adc/ad7405.c | 259 +++++++++++++++++++++++++++++++++++++++
>  3 files changed, 270 insertions(+)
>  create mode 100644 drivers/iio/adc/ad7405.c
> 
> diff --git a/drivers/iio/adc/Kconfig b/drivers/iio/adc/Kconfig
> index ad06cf556785..43af2070e27f 100644
> --- a/drivers/iio/adc/Kconfig
> +++ b/drivers/iio/adc/Kconfig
> @@ -251,6 +251,16 @@ config AD7380
>  	  To compile this driver as a module, choose M here: the module will
> be
>  	  called ad7380.
>  
> +config AD7405
> +	tristate "Analog Device AD7405 ADC Driver"
> +	depends on IIO_BACKEND
> +	help
> +	  Say yes here to build support for Analog Devices AD7405, ADUM7701,
> +	  ADUM7702, ADUM7703 analog to digital converters (ADC).
> +
> +	  To compile this driver as a module, choose M here: the module will
> be
> +	  called ad7405.
> +
>  config AD7476
>  	tristate "Analog Devices AD7476 1-channel ADCs driver and other
> similar devices from AD and TI"
>  	depends on SPI
> diff --git a/drivers/iio/adc/Makefile b/drivers/iio/adc/Makefile
> index 07d4b832c42e..8115f30b7862 100644
> --- a/drivers/iio/adc/Makefile
> +++ b/drivers/iio/adc/Makefile
> @@ -26,6 +26,7 @@ obj-$(CONFIG_AD7291) += ad7291.o
>  obj-$(CONFIG_AD7292) += ad7292.o
>  obj-$(CONFIG_AD7298) += ad7298.o
>  obj-$(CONFIG_AD7380) += ad7380.o
> +obj-$(CONFIG_AD7405) += ad7405.o
>  obj-$(CONFIG_AD7476) += ad7476.o
>  obj-$(CONFIG_AD7606_IFACE_PARALLEL) += ad7606_par.o
>  obj-$(CONFIG_AD7606_IFACE_SPI) += ad7606_spi.o
> diff --git a/drivers/iio/adc/ad7405.c b/drivers/iio/adc/ad7405.c
> new file mode 100644
> index 000000000000..c07b90fbd429
> --- /dev/null
> +++ b/drivers/iio/adc/ad7405.c
> @@ -0,0 +1,259 @@
> +// SPDX-License-Identifier: GPL-2.0-only
> +/*
> + * Analog Devices AD7405 driver
> + *
> + * Copyright 2025 Analog Devices Inc.
> + */
> +
> +#include <linux/clk.h>
> +#include <linux/device.h>
> +#include <linux/err.h>
> +#include <linux/math64.h>
> +#include <linux/module.h>
> +#include <linux/mod_devicetable.h>
> +#include <linux/platform_device.h>
> +#include <linux/property.h>
> +#include <linux/regulator/consumer.h>
> +#include <linux/util_macros.h>
> +
> +#include <linux/iio/backend.h>
> +#include <linux/iio/iio.h>
> +
> +static const unsigned int ad7405_dec_rates_range[] = {
> +	32, 1, 4096,
> +};
> +
> +struct ad7405_chip_info {
> +	const char *name;
> +	struct iio_chan_spec channel;
> +	const unsigned int full_scale_mv;
> +};
> +
> +struct ad7405_state {
> +	struct iio_backend *back;
> +	const struct ad7405_chip_info *info;
> +	unsigned int ref_frequency;
> +	unsigned int dec_rate;
> +};
> +
> +static int ad7405_set_dec_rate(struct iio_dev *indio_dev,
> +			       const struct iio_chan_spec *chan,
> +			       unsigned int dec_rate)
> +{
> +	struct ad7405_state *st = iio_priv(indio_dev);
> +	int ret;
> +
> +	if (dec_rate > 4096 || dec_rate < 32)
> +		return -EINVAL;
> +
> +	if (!iio_device_claim_direct(indio_dev))
> +		return -EBUSY;
> +
> +	ret = iio_backend_oversampling_ratio_set(st->back, chan->scan_index,
> dec_rate);
> +	iio_device_release_direct(indio_dev);
> +
> +	if (ret < 0)
> +		return ret;
> +
> +	st->dec_rate = dec_rate;
> +
> +	return 0;
> +}
> +
> +static int ad7405_read_raw(struct iio_dev *indio_dev,
> +			   const struct iio_chan_spec *chan, int *val,
> +			   int *val2, long info)
> +{
> +	struct ad7405_state *st = iio_priv(indio_dev);
> +
> +	switch (info) {
> +	case IIO_CHAN_INFO_SCALE:
> +		*val = st->info->full_scale_mv;
> +		*val2 = st->info->channel.scan_type.realbits - 1;
> +		return IIO_VAL_FRACTIONAL_LOG2;
> +	case IIO_CHAN_INFO_OVERSAMPLING_RATIO:
> +		*val = st->dec_rate;
> +		return IIO_VAL_INT;
> +	case IIO_CHAN_INFO_SAMP_FREQ:
> +		*val = DIV_ROUND_CLOSEST_ULL(st->ref_frequency, st-
> >dec_rate);
> +		return IIO_VAL_INT;
> +	case IIO_CHAN_INFO_OFFSET:
> +		*val = -(1 << (st->info->channel.scan_type.realbits - 1));
> +		return IIO_VAL_INT;
> +	default:
> +		return -EINVAL;
> +	}
> +}
> +
> +static int ad7405_write_raw(struct iio_dev *indio_dev,
> +			    struct iio_chan_spec const *chan, int val,
> +			    int val2, long info)
> +{
> +	switch (info) {
> +	case IIO_CHAN_INFO_OVERSAMPLING_RATIO:
> +		if (val < 0)
> +			return -EINVAL;
> +		return ad7405_set_dec_rate(indio_dev, chan, val);
> +	default:
> +		return -EINVAL;
> +	}
> +}
> +
> +static int ad7405_read_avail(struct iio_dev *indio_dev,
> +			     struct iio_chan_spec const *chan,
> +			     const int **vals, int *type, int *length,
> +			     long info)
> +{
> +	switch (info) {
> +	case IIO_CHAN_INFO_OVERSAMPLING_RATIO:
> +		*vals = ad7405_dec_rates_range;
> +		*type = IIO_VAL_INT;
> +		return IIO_AVAIL_RANGE;
> +	default:
> +		return -EINVAL;
> +	}
> +}
> +
> +static const struct iio_info ad7405_iio_info = {
> +	.read_raw = &ad7405_read_raw,
> +	.write_raw = &ad7405_write_raw,
> +	.read_avail = &ad7405_read_avail,
> +};
> +
> +#define AD7405_IIO_CHANNEL {					\
> +	.type = IIO_VOLTAGE,					\
> +	.info_mask_shared_by_type = BIT(IIO_CHAN_INFO_SCALE) |	\
> +			BIT(IIO_CHAN_INFO_OFFSET),		\
> +	.info_mask_shared_by_all = IIO_CHAN_INFO_SAMP_FREQ |	\
> +			BIT(IIO_CHAN_INFO_OVERSAMPLING_RATIO),	\
> +	.info_mask_shared_by_all_available =			\
> +			BIT(IIO_CHAN_INFO_OVERSAMPLING_RATIO),	\
> +	.indexed = 1,						\
> +	.channel = 0,						\
> +	.channel2 = 1,						\
> +	.differential = 1,					\
> +	.scan_index = 0,					\
> +	.scan_type = {						\
> +		.sign = 'u',					\
> +		.realbits = 16,					\
> +		.storagebits = 16,				\
> +	},							\
> +}
> +
> +static const struct ad7405_chip_info ad7405_chip_info = {
> +	.name = "ad7405",
> +	.full_scale_mv = 320,
> +	.channel = AD7405_IIO_CHANNEL,
> +};
> +
> +static const struct ad7405_chip_info adum7701_chip_info = {
> +	.name = "adum7701",
> +	.full_scale_mv = 320,
> +	.channel = AD7405_IIO_CHANNEL,
> +};
> +
> +static const struct ad7405_chip_info adum7702_chip_info = {
> +	.name = "adum7702",
> +	.full_scale_mv = 64,
> +	.channel = AD7405_IIO_CHANNEL,
> +};
> +
> +static const struct ad7405_chip_info adum7703_chip_info = {
> +	.name = "adum7703",
> +	.full_scale_mv = 320,
> +	.channel = AD7405_IIO_CHANNEL,
> +};
> +
> +static const char * const ad7405_power_supplies[] = {
> +	"vdd1",	"vdd2",
> +};
> +
> +static int ad7405_probe(struct platform_device *pdev)
> +{
> +	struct device *dev = &pdev->dev;
> +	struct iio_dev *indio_dev;
> +	struct ad7405_state *st;
> +	struct clk *clk;
> +	int ret;
> +
> +	indio_dev = devm_iio_device_alloc(dev, sizeof(*st));
> +	if (!indio_dev)
> +		return -ENOMEM;
> +
> +	st = iio_priv(indio_dev);
> +
> +	st->info = device_get_match_data(dev);
> +	if (!st->info)
> +		return dev_err_probe(dev, -EINVAL, "no chip info\n");
> +
> +	ret = devm_regulator_bulk_get_enable(dev,
> ARRAY_SIZE(ad7405_power_supplies),
> +					     ad7405_power_supplies);
> +	if (ret)
> +		return dev_err_probe(dev, ret, "failed to get and enable
> supplies");
> +
> +	clk = devm_clk_get_enabled(dev, NULL);
> +	if (IS_ERR(clk))
> +		return PTR_ERR(clk);
> +
> +	st->ref_frequency = clk_get_rate(clk);
> +	if (!st->ref_frequency)
> +		return -EINVAL;
> +
> +	indio_dev->name = st->info->name;
> +	indio_dev->channels = &st->info->channel;
> +	indio_dev->num_channels = 1;
> +	indio_dev->info = &ad7405_iio_info;
> +
> +	st->back = devm_iio_backend_get(dev, NULL);
> +	if (IS_ERR(st->back))
> +		return dev_err_probe(dev, PTR_ERR(st->back),
> +				     "failed to get IIO backend");
> +
> +	ret = iio_backend_chan_enable(st->back, 0);
> +	if (ret)
> +		return ret;
> +
> +	ret = devm_iio_backend_request_buffer(dev, st->back, indio_dev);
> +	if (ret)
> +		return ret;
> +
> +	ret = devm_iio_backend_enable(dev, st->back);
> +	if (ret)
> +		return ret;
> +
> +	/*
> +	 * Set 256 decimation rate. The default value in the AXI_ADC register
> +	 * is 0, so we set the register with a decimation rate value that is
> +	 * functional for all parts.
> +	 */
> +	ret = ad7405_set_dec_rate(indio_dev, &indio_dev->channels[0], 256);
> +	if (ret)
> +		return ret;
> +
> +	return devm_iio_device_register(dev, indio_dev);
> +}
> +
> +static const struct of_device_id ad7405_of_match[] = {
> +	{ .compatible = "adi,ad7405", .data = &ad7405_chip_info, },
> +	{ .compatible = "adi,adum7701", .data = &adum7701_chip_info, },
> +	{ .compatible = "adi,adum7702", .data = &adum7702_chip_info, },
> +	{ .compatible = "adi,adum7703", .data = &adum7703_chip_info, },
> +	{ }
> +};
> +MODULE_DEVICE_TABLE(of, ad7405_of_match);
> +
> +static struct platform_driver ad7405_driver = {
> +	.driver = {
> +		.name = "ad7405",
> +		.owner = THIS_MODULE,

Drop the above.

> +		.of_match_table = ad7405_of_match,
> +	},
> +	.probe = ad7405_probe,
> +};
> +module_platform_driver(ad7405_driver);
> +
> +MODULE_AUTHOR("Dragos Bogdan <dragos.bogdan@analog.com>");
> +MODULE_AUTHOR("Pop Ioan Daniel <pop.ioan-daniel@analog.com>");
> +MODULE_DESCRIPTION("Analog Devices AD7405 driver");
> +MODULE_LICENSE("GPL");
> +MODULE_IMPORT_NS("IIO_BACKEND");

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

* RE: [PATCH v7 5/5] iio: adc: ad7405: add ad7405 driver
  2025-06-07 15:44   ` Jonathan Cameron
@ 2025-06-10 12:09     ` Ioan-daniel, Pop
  2025-06-11 15:25       ` Jonathan Cameron
  0 siblings, 1 reply; 11+ messages in thread
From: Ioan-daniel, Pop @ 2025-06-10 12:09 UTC (permalink / raw)
  To: Jonathan Cameron
  Cc: Lars-Peter Clausen, Hennerich, Michael, David Lechner, Sa, Nuno,
	Andy Shevchenko, Rob Herring, Krzysztof Kozlowski, Conor Dooley,
	Cuciurean, Sergiu, Bogdan, Dragos, Miclaus, Antoniu,
	Olivier Moysan, Javier Carrasco, Matti Vaittinen, adureghello,
	Guillaume Stols, Tobias Sperling, Schmitt, Marcelo,
	Trevor Gamblin, Alisa-Dariana Roman, Nechita, Ramona,
	Herve Codina, AngeloGioacchino Del Regno, Thomas Bonnefille,
	João Paulo Gonçalves, linux-iio@vger.kernel.org,
	devicetree@vger.kernel.org, linux-kernel@vger.kernel.org

> 
> Why do we need this .channel element if all instances use the same one?  If you
> are are shortly going to add support for more devices where this will change
> then this is ok.  If not, just have one static const channel and use that without
> looking it up via these chip_info structures.
>

Hi! I'm not aware of any other parts that use different channel types. It's true that all parts use the same .channel.
Should I submit a new patch version with the requested change?

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

* Re: [PATCH v7 5/5] iio: adc: ad7405: add ad7405 driver
  2025-06-10 12:09     ` Ioan-daniel, Pop
@ 2025-06-11 15:25       ` Jonathan Cameron
  2025-06-12  7:38         ` Ioan-daniel, Pop
  0 siblings, 1 reply; 11+ messages in thread
From: Jonathan Cameron @ 2025-06-11 15:25 UTC (permalink / raw)
  To: Ioan-daniel, Pop
  Cc: Lars-Peter Clausen, Hennerich, Michael, David Lechner, Sa, Nuno,
	Andy Shevchenko, Rob Herring, Krzysztof Kozlowski, Conor Dooley,
	Cuciurean, Sergiu, Bogdan, Dragos, Miclaus, Antoniu,
	Olivier Moysan, Javier Carrasco, Matti Vaittinen, adureghello,
	Guillaume Stols, Tobias Sperling, Schmitt, Marcelo,
	Trevor Gamblin, Alisa-Dariana Roman, Nechita, Ramona,
	Herve Codina, AngeloGioacchino Del Regno, Thomas Bonnefille,
	João Paulo Gonçalves, linux-iio@vger.kernel.org,
	devicetree@vger.kernel.org, linux-kernel@vger.kernel.org

On Tue, 10 Jun 2025 12:09:22 +0000
"Ioan-daniel, Pop" <Pop.Ioan-daniel@analog.com> wrote:

> > 
> > Why do we need this .channel element if all instances use the same one?  If you
> > are are shortly going to add support for more devices where this will change
> > then this is ok.  If not, just have one static const channel and use that without
> > looking it up via these chip_info structures.
> >  
> 
> Hi! I'm not aware of any other parts that use different channel types. It's true that all parts use the same .channel.
> Should I submit a new patch version with the requested change?

No need - it's an easy tweak (hopefully).  I fixed up the owner thing Nuno noticed
and applied this diff whilst picking this up.


diff --git a/drivers/iio/adc/ad7405.c b/drivers/iio/adc/ad7405.c
index 487d661f9050..9adf85a732ce 100644
--- a/drivers/iio/adc/ad7405.c
+++ b/drivers/iio/adc/ad7405.c
@@ -25,7 +25,6 @@ static const unsigned int ad7405_dec_rates_range[] = {
 
 struct ad7405_chip_info {
        const char *name;
-       struct iio_chan_spec channel;
        const unsigned int full_scale_mv;
 };
 
@@ -69,7 +68,7 @@ static int ad7405_read_raw(struct iio_dev *indio_dev,
        switch (info) {
        case IIO_CHAN_INFO_SCALE:
                *val = st->info->full_scale_mv;
-               *val2 = st->info->channel.scan_type.realbits - 1;
+               *val2 = indio_dev->channels[0].scan_type.realbits - 1;
                return IIO_VAL_FRACTIONAL_LOG2;
        case IIO_CHAN_INFO_OVERSAMPLING_RATIO:
                *val = st->dec_rate;
@@ -78,7 +77,7 @@ static int ad7405_read_raw(struct iio_dev *indio_dev,
                *val = DIV_ROUND_CLOSEST_ULL(st->ref_frequency, st->dec_rate);
                return IIO_VAL_INT;
        case IIO_CHAN_INFO_OFFSET:
-               *val = -(1 << (st->info->channel.scan_type.realbits - 1));
+               *val = -(1 << (indio_dev->channels[0].scan_type.realbits - 1));
                return IIO_VAL_INT;
        default:
                return -EINVAL;
@@ -120,48 +119,44 @@ static const struct iio_info ad7405_iio_info = {
        .read_avail = &ad7405_read_avail,
 };
 
-#define AD7405_IIO_CHANNEL {                                   \
-       .type = IIO_VOLTAGE,                                    \
-       .info_mask_shared_by_type = BIT(IIO_CHAN_INFO_SCALE) |  \
-                       BIT(IIO_CHAN_INFO_OFFSET),              \
-       .info_mask_shared_by_all = IIO_CHAN_INFO_SAMP_FREQ |    \
-                       BIT(IIO_CHAN_INFO_OVERSAMPLING_RATIO),  \
-       .info_mask_shared_by_all_available =                    \
-                       BIT(IIO_CHAN_INFO_OVERSAMPLING_RATIO),  \
-       .indexed = 1,                                           \
-       .channel = 0,                                           \
-       .channel2 = 1,                                          \
-       .differential = 1,                                      \
-       .scan_index = 0,                                        \
-       .scan_type = {                                          \
-               .sign = 'u',                                    \
-               .realbits = 16,                                 \
-               .storagebits = 16,                              \
-       },                                                      \
-}
+static const struct iio_chan_spec ad7405_channel = {
+       .type = IIO_VOLTAGE,
+       .info_mask_shared_by_type = BIT(IIO_CHAN_INFO_SCALE) |
+                       BIT(IIO_CHAN_INFO_OFFSET),
+       .info_mask_shared_by_all = IIO_CHAN_INFO_SAMP_FREQ |
+                       BIT(IIO_CHAN_INFO_OVERSAMPLING_RATIO),
+       .info_mask_shared_by_all_available =
+                       BIT(IIO_CHAN_INFO_OVERSAMPLING_RATIO),
+       .indexed = 1,
+       .channel = 0,
+       .channel2 = 1,
+       .differential = 1,
+       .scan_index = 0,
+       .scan_type = {
+               .sign = 'u',
+               .realbits = 16,
+               .storagebits = 16,
+       },
+};
 
 static const struct ad7405_chip_info ad7405_chip_info = {
        .name = "ad7405",
        .full_scale_mv = 320,
-       .channel = AD7405_IIO_CHANNEL,
 };
 
 static const struct ad7405_chip_info adum7701_chip_info = {
        .name = "adum7701",
        .full_scale_mv = 320,
-       .channel = AD7405_IIO_CHANNEL,
 };
 
 static const struct ad7405_chip_info adum7702_chip_info = {
        .name = "adum7702",
        .full_scale_mv = 64,
-       .channel = AD7405_IIO_CHANNEL,
 };
 
 static const struct ad7405_chip_info adum7703_chip_info = {
        .name = "adum7703",
        .full_scale_mv = 320,
-       .channel = AD7405_IIO_CHANNEL,
 };
 
 static const char * const ad7405_power_supplies[] = {
@@ -200,7 +195,7 @@ static int ad7405_probe(struct platform_device *pdev)
                return -EINVAL;
 
        indio_dev->name = st->info->name;
-       indio_dev->channels = &st->info->channel;
+       indio_dev->channels = &ad7405_channel;
        indio_dev->num_channels = 1;
        indio_dev->info = &ad7405_iio_info;
 
Let me know if I messed it up.  Pushed out as testing for now.

Thanks,

Jonathan

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

* RE: [PATCH v7 5/5] iio: adc: ad7405: add ad7405 driver
  2025-06-11 15:25       ` Jonathan Cameron
@ 2025-06-12  7:38         ` Ioan-daniel, Pop
  0 siblings, 0 replies; 11+ messages in thread
From: Ioan-daniel, Pop @ 2025-06-12  7:38 UTC (permalink / raw)
  To: Jonathan Cameron
  Cc: Lars-Peter Clausen, Hennerich, Michael, David Lechner, Sa, Nuno,
	Andy Shevchenko, Rob Herring, Krzysztof Kozlowski, Conor Dooley,
	Cuciurean, Sergiu, Bogdan, Dragos, Miclaus, Antoniu,
	Olivier Moysan, Javier Carrasco, Matti Vaittinen, adureghello,
	Guillaume Stols, Tobias Sperling, Schmitt, Marcelo,
	Trevor Gamblin, Alisa-Dariana Roman, Nechita, Ramona,
	Herve Codina, AngeloGioacchino Del Regno, Thomas Bonnefille,
	João Paulo Gonçalves, linux-iio@vger.kernel.org,
	devicetree@vger.kernel.org, linux-kernel@vger.kernel.org

> 
> Let me know if I messed it up.  Pushed out as testing for now.
> 
> Thanks,
> 
> Jonathan

Hi Jonathan,

I tested the project with the latest changes, and everything is working well.
Thanks again for all the help and patience!

Best regards,
Ioan-Daniel Pop

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

end of thread, other threads:[~2025-06-12  7:38 UTC | newest]

Thread overview: 11+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2025-06-05 15:09 [PATCH v7 0/5] Add support for AD7405/ADUM770x Pop Ioan Daniel
2025-06-05 15:09 ` [PATCH v7 1/5] iio: adc: ad4851: ad4851_set_oversampling_ratio parameters update Pop Ioan Daniel
2025-06-05 15:09 ` [PATCH v7 2/5] iio: backend: update iio_backend_oversampling_ratio_set Pop Ioan Daniel
2025-06-05 15:09 ` [PATCH v7 3/5] iio: adc: adi-axi-adc: add axi_adc_oversampling_ratio_set Pop Ioan Daniel
2025-06-05 15:09 ` [PATCH v7 4/5] dt-bindings: iio: adc: add ad7405 Pop Ioan Daniel
2025-06-05 15:09 ` [PATCH v7 5/5] iio: adc: ad7405: add ad7405 driver Pop Ioan Daniel
2025-06-07 15:44   ` Jonathan Cameron
2025-06-10 12:09     ` Ioan-daniel, Pop
2025-06-11 15:25       ` Jonathan Cameron
2025-06-12  7:38         ` Ioan-daniel, Pop
2025-06-09  8:05   ` Nuno Sá

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).