* [PATCH v5 0/5] Add support for AD7405/ADUM770x
@ 2025-06-02 13:43 Pop Ioan Daniel
2025-06-02 13:43 ` [PATCH v5 1/5] iio: adc: ad4851: ad4851_set_oversampling_ratio parameters update Pop Ioan Daniel
` (4 more replies)
0 siblings, 5 replies; 12+ messages in thread
From: Pop Ioan Daniel @ 2025-06-02 13:43 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, Alisa-Dariana Roman,
Marcelo Schmitt, João Paulo Gonçalves,
Thomas Bonnefille, Ioan Daniel, 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 | 7 +-
drivers/iio/adc/ad7405.c | 256 ++++++++++++++++++
drivers/iio/adc/adi-axi-adc.c | 20 +-
drivers/iio/industrialio-backend.c | 3 +-
include/linux/iio/backend.h | 3 +-
8 files changed, 353 insertions(+), 7 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] 12+ messages in thread
* [PATCH v5 1/5] iio: adc: ad4851: ad4851_set_oversampling_ratio parameters update
2025-06-02 13:43 [PATCH v5 0/5] Add support for AD7405/ADUM770x Pop Ioan Daniel
@ 2025-06-02 13:43 ` Pop Ioan Daniel
2025-06-02 13:43 ` [PATCH v5 2/5] iio: backend: update iio_backend_oversampling_ratio_set Pop Ioan Daniel
` (3 subsequent siblings)
4 siblings, 0 replies; 12+ messages in thread
From: Pop Ioan Daniel @ 2025-06-02 13:43 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, Alisa-Dariana Roman,
Marcelo Schmitt, Pop Ioan Daniel, Trevor Gamblin, Herve Codina,
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>
---
changes in v5:
- update commit message.
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] 12+ messages in thread
* [PATCH v5 2/5] iio: backend: update iio_backend_oversampling_ratio_set
2025-06-02 13:43 [PATCH v5 0/5] Add support for AD7405/ADUM770x Pop Ioan Daniel
2025-06-02 13:43 ` [PATCH v5 1/5] iio: adc: ad4851: ad4851_set_oversampling_ratio parameters update Pop Ioan Daniel
@ 2025-06-02 13:43 ` Pop Ioan Daniel
2025-06-02 14:58 ` Andy Shevchenko
2025-06-02 13:43 ` [PATCH v5 3/5] iio: adc: adi-axi-adc: add axi_adc_oversampling_ratio_set Pop Ioan Daniel
` (2 subsequent siblings)
4 siblings, 1 reply; 12+ messages in thread
From: Pop Ioan Daniel @ 2025-06-02 13:43 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, Alisa-Dariana Roman,
Marcelo Schmitt, Herve Codina, 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>
---
changes in v5:
- update commit message.
drivers/iio/adc/ad4851.c | 4 ++--
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(+), 5 deletions(-)
diff --git a/drivers/iio/adc/ad4851.c b/drivers/iio/adc/ad4851.c
index 12f90aa3a156..1f975858c496 100644
--- a/drivers/iio/adc/ad4851.c
+++ b/drivers/iio/adc/ad4851.c
@@ -319,8 +319,8 @@ static int ad4851_set_oversampling_ratio(struct iio_dev *indio_dev,
if (ret)
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] 12+ messages in thread
* [PATCH v5 3/5] iio: adc: adi-axi-adc: add axi_adc_oversampling_ratio_set
2025-06-02 13:43 [PATCH v5 0/5] Add support for AD7405/ADUM770x Pop Ioan Daniel
2025-06-02 13:43 ` [PATCH v5 1/5] iio: adc: ad4851: ad4851_set_oversampling_ratio parameters update Pop Ioan Daniel
2025-06-02 13:43 ` [PATCH v5 2/5] iio: backend: update iio_backend_oversampling_ratio_set Pop Ioan Daniel
@ 2025-06-02 13:43 ` Pop Ioan Daniel
2025-06-02 13:43 ` [PATCH v5 4/5] dt-bindings: iio: adc: add ad7405 Pop Ioan Daniel
2025-06-02 13:43 ` [PATCH v5 5/5] iio: adc: ad7405: add ad7405 driver Pop Ioan Daniel
4 siblings, 0 replies; 12+ messages in thread
From: Pop Ioan Daniel @ 2025-06-02 13:43 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,
Alisa-Dariana Roman, Pop 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>
---
changes in v5:
- move change from axi_adc_ad485x_oversampling_ratio_set function in the
previous patch.
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] 12+ messages in thread
* [PATCH v5 4/5] dt-bindings: iio: adc: add ad7405
2025-06-02 13:43 [PATCH v5 0/5] Add support for AD7405/ADUM770x Pop Ioan Daniel
` (2 preceding siblings ...)
2025-06-02 13:43 ` [PATCH v5 3/5] iio: adc: adi-axi-adc: add axi_adc_oversampling_ratio_set Pop Ioan Daniel
@ 2025-06-02 13:43 ` Pop Ioan Daniel
2025-06-02 14:05 ` Krzysztof Kozlowski
2025-06-02 13:43 ` [PATCH v5 5/5] iio: adc: ad7405: add ad7405 driver Pop Ioan Daniel
4 siblings, 1 reply; 12+ messages in thread
From: Pop Ioan Daniel @ 2025-06-02 13:43 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, Alisa-Dariana Roman,
Marcelo Schmitt, AngeloGioacchino Del Regno, Pop Ioan Daniel,
Trevor Gamblin, linux-iio, devicetree, linux-kernel
Add devicetree bindings for ad7405/adum770x family.
Signed-off-by: Pop Ioan Daniel <pop.ioan-daniel@analog.com>
---
changes in v5:
- create an example based on adi,ad7625.yaml that is very similar to this part
- do not add Reviewed-by tag due to the change that I've made.
.../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] 12+ messages in thread
* [PATCH v5 5/5] iio: adc: ad7405: add ad7405 driver
2025-06-02 13:43 [PATCH v5 0/5] Add support for AD7405/ADUM770x Pop Ioan Daniel
` (3 preceding siblings ...)
2025-06-02 13:43 ` [PATCH v5 4/5] dt-bindings: iio: adc: add ad7405 Pop Ioan Daniel
@ 2025-06-02 13:43 ` Pop Ioan Daniel
2025-06-02 15:01 ` Andy Shevchenko
2025-06-02 16:59 ` David Lechner
4 siblings, 2 replies; 12+ messages in thread
From: Pop Ioan Daniel @ 2025-06-02 13:43 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, Alisa-Dariana Roman,
Marcelo Schmitt, Thomas Bonnefille, AngeloGioacchino Del Regno,
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 v5:
- add range checking for dec_rate
- remove ad7405_get_scale function
- check for negative values in ad7405_write_raw function
- remove unuseful comment
- remove indio_dev -> dev.parent = dev
- fix IIO_CHAN_INFO_OFFSET
- add struct mutex lock
drivers/iio/adc/Kconfig | 10 ++
drivers/iio/adc/Makefile | 1 +
drivers/iio/adc/ad7405.c | 256 +++++++++++++++++++++++++++++++++++++++
3 files changed, 267 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..6199a6661ff5
--- /dev/null
+++ b/drivers/iio/adc/ad7405.c
@@ -0,0 +1,256 @@
+// SPDX-License-Identifier: GPL-2.0-only
+/*
+ * Analog Devices AD7405 driver
+ *
+ * Copyright 2025 Analog Devices Inc.
+ */
+
+#include <linux/clk.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/mutex.h>
+
+#include <linux/iio/backend.h>
+#include <linux/iio/iio.h>
+
+static const unsigned int ad7405_dec_rates[] = {
+ 4096, 2048, 1024, 512, 256, 128, 64, 32,
+};
+
+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;
+ /*
+ *Synchronize access to members the of driver state, and ensure
+ *atomicity of consecutive regmap operations.
+ */
+ struct mutex lock;
+ 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;
+
+ guard(mutex)(&st->lock);
+
+ if (dec_rate > 4096 || dec_rate < 32)
+ return -EINVAL;
+
+ ret = iio_backend_oversampling_ratio_set(st->back, chan->scan_index, dec_rate);
+ if (ret)
+ 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;
+ guard(mutex)(&st->lock);
+ 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;
+ *length = ARRAY_SIZE(ad7405_dec_rates);
+ *type = IIO_VAL_INT;
+ return IIO_AVAIL_LIST;
+ 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;
+
+ 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] 12+ messages in thread
* Re: [PATCH v5 4/5] dt-bindings: iio: adc: add ad7405
2025-06-02 13:43 ` [PATCH v5 4/5] dt-bindings: iio: adc: add ad7405 Pop Ioan Daniel
@ 2025-06-02 14:05 ` Krzysztof Kozlowski
2025-06-04 13:05 ` Ioan-daniel, Pop
0 siblings, 1 reply; 12+ messages in thread
From: Krzysztof Kozlowski @ 2025-06-02 14: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, Tobias Sperling, Alisa-Dariana Roman,
Marcelo Schmitt, AngeloGioacchino Del Regno, Trevor Gamblin,
linux-iio, devicetree, linux-kernel
On 02/06/2025 15:43, Pop Ioan Daniel wrote:
> Add devicetree bindings for ad7405/adum770x family.
>
> Signed-off-by: Pop Ioan Daniel <pop.ioan-daniel@analog.com>
> ---
> changes in v5:
> - create an example based on adi,ad7625.yaml that is very similar to this part
> - do not add Reviewed-by tag due to the change that I've made.
Which change? I see ZERO differences against version which was reviewed.
Best regards,
Krzysztof
^ permalink raw reply [flat|nested] 12+ messages in thread
* Re: [PATCH v5 2/5] iio: backend: update iio_backend_oversampling_ratio_set
2025-06-02 13:43 ` [PATCH v5 2/5] iio: backend: update iio_backend_oversampling_ratio_set Pop Ioan Daniel
@ 2025-06-02 14:58 ` Andy Shevchenko
0 siblings, 0 replies; 12+ messages in thread
From: Andy Shevchenko @ 2025-06-02 14:58 UTC (permalink / raw)
To: Pop Ioan Daniel
Cc: Lars-Peter Clausen, Michael Hennerich, Jonathan Cameron,
David Lechner, Nuno Sá, Rob Herring, Krzysztof Kozlowski,
Conor Dooley, Sergiu Cuciurean, Dragos Bogdan, Antoniu Miclaus,
Olivier Moysan, Javier Carrasco, Matti Vaittinen, Tobias Sperling,
Alisa-Dariana Roman, Marcelo Schmitt, Herve Codina, linux-iio,
devicetree, linux-kernel
On Mon, Jun 02, 2025 at 04:43:40PM +0300, Pop Ioan Daniel wrote:
> Add chan parameter to iio_backend_oversampling_ratio_set() to allow
> for contexts where the channel must be specified. Modify all
> existing users.
...
> static int ad4851_set_oversampling_ratio(struct iio_dev *indio_dev,
> if (ret)
> return ret;
> }
> -
Why do you remove this blank line? To me these two blocks do not look toughly
coupled.
> - 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;
--
With Best Regards,
Andy Shevchenko
^ permalink raw reply [flat|nested] 12+ messages in thread
* Re: [PATCH v5 5/5] iio: adc: ad7405: add ad7405 driver
2025-06-02 13:43 ` [PATCH v5 5/5] iio: adc: ad7405: add ad7405 driver Pop Ioan Daniel
@ 2025-06-02 15:01 ` Andy Shevchenko
2025-06-02 16:59 ` David Lechner
1 sibling, 0 replies; 12+ messages in thread
From: Andy Shevchenko @ 2025-06-02 15:01 UTC (permalink / raw)
To: Pop Ioan Daniel
Cc: Lars-Peter Clausen, Michael Hennerich, Jonathan Cameron,
David Lechner, Nuno Sá, Rob Herring, Krzysztof Kozlowski,
Conor Dooley, Sergiu Cuciurean, Dragos Bogdan, Antoniu Miclaus,
Olivier Moysan, Javier Carrasco, Matti Vaittinen, Tobias Sperling,
Alisa-Dariana Roman, Marcelo Schmitt, Thomas Bonnefille,
AngeloGioacchino Del Regno, linux-iio, devicetree, linux-kernel
On Mon, Jun 02, 2025 at 04:43:43PM +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.
...
> +#include <linux/clk.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/mutex.h>
You need to follow IFYU (Include What You Use) principle, at a glance there are
a few missing. Also make them ordered. I guess I have commented on this already
and my comment was ignored for no reason.
--
With Best Regards,
Andy Shevchenko
^ permalink raw reply [flat|nested] 12+ messages in thread
* Re: [PATCH v5 5/5] iio: adc: ad7405: add ad7405 driver
2025-06-02 13:43 ` [PATCH v5 5/5] iio: adc: ad7405: add ad7405 driver Pop Ioan Daniel
2025-06-02 15:01 ` Andy Shevchenko
@ 2025-06-02 16:59 ` David Lechner
1 sibling, 0 replies; 12+ messages in thread
From: David Lechner @ 2025-06-02 16:59 UTC (permalink / raw)
To: Pop Ioan Daniel, Lars-Peter Clausen, Michael Hennerich,
Jonathan Cameron, Nuno Sá, Andy Shevchenko, Rob Herring,
Krzysztof Kozlowski, Conor Dooley, Sergiu Cuciurean,
Dragos Bogdan, Antoniu Miclaus, Olivier Moysan, Javier Carrasco,
Matti Vaittinen, Tobias Sperling, Alisa-Dariana Roman,
Marcelo Schmitt, Thomas Bonnefille, AngeloGioacchino Del Regno,
linux-iio, devicetree, linux-kernel
On 6/2/25 8:43 AM, 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>
> ---
> changes in v5:
> - add range checking for dec_rate
> - remove ad7405_get_scale function
> - check for negative values in ad7405_write_raw function
> - remove unuseful comment
> - remove indio_dev -> dev.parent = dev
> - fix IIO_CHAN_INFO_OFFSET
> - add struct mutex lock
> drivers/iio/adc/Kconfig | 10 ++
> drivers/iio/adc/Makefile | 1 +
> drivers/iio/adc/ad7405.c | 256 +++++++++++++++++++++++++++++++++++++++
> 3 files changed, 267 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..6199a6661ff5
> --- /dev/null
> +++ b/drivers/iio/adc/ad7405.c
> @@ -0,0 +1,256 @@
> +// SPDX-License-Identifier: GPL-2.0-only
> +/*
> + * Analog Devices AD7405 driver
> + *
> + * Copyright 2025 Analog Devices Inc.
> + */
> +
> +#include <linux/clk.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/mutex.h>
> +
> +#include <linux/iio/backend.h>
> +#include <linux/iio/iio.h>
> +
> +static const unsigned int ad7405_dec_rates[] = {
> + 4096, 2048, 1024, 512, 256, 128, 64, 32,
> +};
It looks lilke this should be a range, not a list. The driver
currently allows any value to be passed to the backend, not
just these values.
Or if these are the only values that make sense for this
ADC chip even if the backend allows other values, then
we should do more checking in this driver to ensure only
these values can be passed to the backend.
> +
> +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;
> + /*
> + *Synchronize access to members the of driver state, and ensure
> + *atomicity of consecutive regmap operations.
There is no regmap.
> + */
> + struct mutex lock;
This is never initalized.
> + 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;
> +
> + guard(mutex)(&st->lock);
Why not iio_device_claim_direct() instead? Seems like it could be
probalamatic if this was changed in the middle of a buffered read.
> +
> + if (dec_rate > 4096 || dec_rate < 32)
> + return -EINVAL;
> +
> + ret = iio_backend_oversampling_ratio_set(st->back, chan->scan_index, dec_rate);
> + if (ret)
> + 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;
> + guard(mutex)(&st->lock);
Taking the mutex here does nothing. Maybe it was meant to go before
*val = st->dec_rate;
But I'm not sure that is really necessary.
> + 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;
> + *length = ARRAY_SIZE(ad7405_dec_rates);
> + *type = IIO_VAL_INT;
> + return IIO_AVAIL_LIST;
> + 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",
In all the other ADI drivers, the name is lower case, so we should
to the same here to be consistent.
> + .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;
> +
Would not hurt to have a comment explaining why 256 is chosen for the
default value.
> + 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");
^ permalink raw reply [flat|nested] 12+ messages in thread
* RE: [PATCH v5 4/5] dt-bindings: iio: adc: add ad7405
2025-06-02 14:05 ` Krzysztof Kozlowski
@ 2025-06-04 13:05 ` Ioan-daniel, Pop
2025-06-04 14:03 ` Krzysztof Kozlowski
0 siblings, 1 reply; 12+ messages in thread
From: Ioan-daniel, Pop @ 2025-06-04 13:05 UTC (permalink / raw)
To: Krzysztof Kozlowski, Lars-Peter Clausen, Hennerich, Michael,
Jonathan Cameron, David Lechner, Sa, Nuno, Andy Shevchenko,
Rob Herring, Krzysztof Kozlowski, Conor Dooley, Cuciurean, Sergiu,
Bogdan, Dragos, Miclaus, Antoniu, Olivier Moysan, Javier Carrasco,
Matti Vaittinen, Tobias Sperling, Alisa-Dariana Roman,
Schmitt, Marcelo, AngeloGioacchino Del Regno, Trevor Gamblin,
linux-iio@vger.kernel.org, devicetree@vger.kernel.org,
linux-kernel@vger.kernel.org
>
> On 02/06/2025 15:43, Pop Ioan Daniel wrote:
> > Add devicetree bindings for ad7405/adum770x family.
> >
> > Signed-off-by: Pop Ioan Daniel <pop.ioan-daniel@analog.com>
> > ---
> > changes in v5:
> > - create an example based on adi,ad7625.yaml that is very similar to this
> part
> > - do not add Reviewed-by tag due to the change that I've made.
>
> Which change? I see ZERO differences against version which was reviewed.
Hi! The difference is in the io-backends assignment:
examples:
+ - |
+ adc {
+ compatible = "adi,ad7405";
+ clocks = <&axi_clk_gen 0>;
+ vdd1-supply = <&vdd1>;
+ vdd2-supply = <&vdd2>;
+ io-backends = <&axi_adc>;
+ };
+...
^ permalink raw reply [flat|nested] 12+ messages in thread
* Re: [PATCH v5 4/5] dt-bindings: iio: adc: add ad7405
2025-06-04 13:05 ` Ioan-daniel, Pop
@ 2025-06-04 14:03 ` Krzysztof Kozlowski
0 siblings, 0 replies; 12+ messages in thread
From: Krzysztof Kozlowski @ 2025-06-04 14:03 UTC (permalink / raw)
To: Ioan-daniel, Pop, Lars-Peter Clausen, Hennerich, Michael,
Jonathan Cameron, David Lechner, Sa, Nuno, Andy Shevchenko,
Rob Herring, Krzysztof Kozlowski, Conor Dooley, Cuciurean, Sergiu,
Bogdan, Dragos, Miclaus, Antoniu, Olivier Moysan, Javier Carrasco,
Matti Vaittinen, Tobias Sperling, Alisa-Dariana Roman,
Schmitt, Marcelo, AngeloGioacchino Del Regno, Trevor Gamblin,
linux-iio@vger.kernel.org, devicetree@vger.kernel.org,
linux-kernel@vger.kernel.org
On 04/06/2025 15:05, Ioan-daniel, Pop wrote:
>>
>> On 02/06/2025 15:43, Pop Ioan Daniel wrote:
>>> Add devicetree bindings for ad7405/adum770x family.
>>>
>>> Signed-off-by: Pop Ioan Daniel <pop.ioan-daniel@analog.com>
>>> ---
>>> changes in v5:
>>> - create an example based on adi,ad7625.yaml that is very similar to this
>> part
>>> - do not add Reviewed-by tag due to the change that I've made.
>>
>> Which change? I see ZERO differences against version which was reviewed.
>
> Hi! The difference is in the io-backends assignment:
Change in the binding. You just pasted example. What change did you make
to invalidate review?
> examples:
> + - |
> + adc {
> + compatible = "adi,ad7405";
> + clocks = <&axi_clk_gen 0>;
> + vdd1-supply = <&vdd1>;
> + vdd2-supply = <&vdd2>;
> + io-backends = <&axi_adc>;
> + };
> +...
Best regards,
Krzysztof
^ permalink raw reply [flat|nested] 12+ messages in thread
end of thread, other threads:[~2025-06-04 14:03 UTC | newest]
Thread overview: 12+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2025-06-02 13:43 [PATCH v5 0/5] Add support for AD7405/ADUM770x Pop Ioan Daniel
2025-06-02 13:43 ` [PATCH v5 1/5] iio: adc: ad4851: ad4851_set_oversampling_ratio parameters update Pop Ioan Daniel
2025-06-02 13:43 ` [PATCH v5 2/5] iio: backend: update iio_backend_oversampling_ratio_set Pop Ioan Daniel
2025-06-02 14:58 ` Andy Shevchenko
2025-06-02 13:43 ` [PATCH v5 3/5] iio: adc: adi-axi-adc: add axi_adc_oversampling_ratio_set Pop Ioan Daniel
2025-06-02 13:43 ` [PATCH v5 4/5] dt-bindings: iio: adc: add ad7405 Pop Ioan Daniel
2025-06-02 14:05 ` Krzysztof Kozlowski
2025-06-04 13:05 ` Ioan-daniel, Pop
2025-06-04 14:03 ` Krzysztof Kozlowski
2025-06-02 13:43 ` [PATCH v5 5/5] iio: adc: ad7405: add ad7405 driver Pop Ioan Daniel
2025-06-02 15:01 ` Andy Shevchenko
2025-06-02 16:59 ` David Lechner
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).