* [PATCH v3 0/4] Add support for AD7405/ADUM770x
@ 2025-05-16 10:58 Pop Ioan Daniel
2025-05-16 10:58 ` [PATCH v3 1/4] iio: backend: update iio_backend_oversampling_ratio_set Pop Ioan Daniel
` (3 more replies)
0 siblings, 4 replies; 14+ messages in thread
From: Pop Ioan Daniel @ 2025-05-16 10:58 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, AngeloGioacchino Del Regno,
Ramona Alexandra Nechita, 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 (4):
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 | 276 ++++++++++++++++++
drivers/iio/adc/adi-axi-adc.c | 20 +-
drivers/iio/industrialio-backend.c | 3 +-
include/linux/iio/backend.h | 3 +-
8 files changed, 373 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] 14+ messages in thread
* [PATCH v3 1/4] iio: backend: update iio_backend_oversampling_ratio_set
2025-05-16 10:58 [PATCH v3 0/4] Add support for AD7405/ADUM770x Pop Ioan Daniel
@ 2025-05-16 10:58 ` Pop Ioan Daniel
2025-05-16 15:06 ` David Lechner
2025-05-16 10:58 ` [PATCH v3 2/4] iio: adc: adi-axi-adc: add axi_adc_oversampling_ratio_set Pop Ioan Daniel
` (2 subsequent siblings)
3 siblings, 1 reply; 14+ messages in thread
From: Pop Ioan Daniel @ 2025-05-16 10:58 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, João Paulo Gonçalves, Herve Codina,
Ioan Daniel, linux-iio, devicetree, linux-kernel
In the function iio_backend_oversampling_ratio_set the chan parameter
was added. The function can be used in contexts where the channel
must be specified. All affected files have been modified.
Signed-off-by: Pop Ioan Daniel <pop.ioan-daniel@analog.com>
---
changes in v3:
- fix ad4851_set_oversampling_ratio function channel error
drivers/iio/adc/ad4851.c | 6 +++---
drivers/iio/adc/adi-axi-adc.c | 3 ++-
drivers/iio/industrialio-backend.c | 3 ++-
include/linux/iio/backend.h | 3 ++-
4 files changed, 9 insertions(+), 6 deletions(-)
diff --git a/drivers/iio/adc/ad4851.c b/drivers/iio/adc/ad4851.c
index 98ebc853db79..fccfca256670 100644
--- a/drivers/iio/adc/ad4851.c
+++ b/drivers/iio/adc/ad4851.c
@@ -294,7 +294,7 @@ 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 chan,
unsigned int osr)
{
struct ad4851_state *st = iio_priv(indio_dev);
@@ -321,7 +321,7 @@ static int ad4851_set_oversampling_ratio(struct iio_dev *indio_dev,
return ret;
}
- ret = iio_backend_oversampling_ratio_set(st->back, osr);
+ ret = iio_backend_oversampling_ratio_set(st->back, chan, osr);
if (ret)
return ret;
@@ -831,7 +831,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, chan->channel, val);
default:
return -EINVAL;
}
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] 14+ messages in thread
* [PATCH v3 2/4] iio: adc: adi-axi-adc: add axi_adc_oversampling_ratio_set
2025-05-16 10:58 [PATCH v3 0/4] Add support for AD7405/ADUM770x Pop Ioan Daniel
2025-05-16 10:58 ` [PATCH v3 1/4] iio: backend: update iio_backend_oversampling_ratio_set Pop Ioan Daniel
@ 2025-05-16 10:58 ` Pop Ioan Daniel
2025-05-16 15:06 ` David Lechner
2025-05-16 10:58 ` [PATCH v3 3/4] dt-bindings: iio: adc: add ad7405 Pop Ioan Daniel
2025-05-16 10:58 ` [PATCH v3 4/4] iio: adc: ad7405: add ad7405 driver Pop Ioan Daniel
3 siblings, 1 reply; 14+ messages in thread
From: Pop Ioan Daniel @ 2025-05-16 10:58 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, Matteo Martelli, Ramona Alexandra Nechita,
João Paulo Gonçalves, Ioan Daniel, linux-iio,
devicetree, linux-kernel
Add support for setting decimation rate.
Signed-off-by: Pop Ioan Daniel <pop.ioan-daniel@analog.com>
---
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] 14+ messages in thread
* [PATCH v3 3/4] dt-bindings: iio: adc: add ad7405
2025-05-16 10:58 [PATCH v3 0/4] Add support for AD7405/ADUM770x Pop Ioan Daniel
2025-05-16 10:58 ` [PATCH v3 1/4] iio: backend: update iio_backend_oversampling_ratio_set Pop Ioan Daniel
2025-05-16 10:58 ` [PATCH v3 2/4] iio: adc: adi-axi-adc: add axi_adc_oversampling_ratio_set Pop Ioan Daniel
@ 2025-05-16 10:58 ` Pop Ioan Daniel
2025-05-16 14:18 ` Conor Dooley
` (2 more replies)
2025-05-16 10:58 ` [PATCH v3 4/4] iio: adc: ad7405: add ad7405 driver Pop Ioan Daniel
3 siblings, 3 replies; 14+ messages in thread
From: Pop Ioan Daniel @ 2025-05-16 10:58 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, Trevor Gamblin, Matteo Martelli, Ioan Daniel,
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 v2:
- fix properties: clocks issue
.../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..939de3bd6f26
--- /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 = <&iio_backend>;
+ };
+...
--
2.34.1
^ permalink raw reply related [flat|nested] 14+ messages in thread
* [PATCH v3 4/4] iio: adc: ad7405: add ad7405 driver
2025-05-16 10:58 [PATCH v3 0/4] Add support for AD7405/ADUM770x Pop Ioan Daniel
` (2 preceding siblings ...)
2025-05-16 10:58 ` [PATCH v3 3/4] dt-bindings: iio: adc: add ad7405 Pop Ioan Daniel
@ 2025-05-16 10:58 ` Pop Ioan Daniel
2025-05-16 15:08 ` David Lechner
2025-05-18 16:33 ` Jonathan Cameron
3 siblings, 2 replies; 14+ messages in thread
From: Pop Ioan Daniel @ 2025-05-16 10:58 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, Esteban Blanc, 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 v3:
- edit ad7405_chip_info struct instances
- remove lock
- add implementation for IIO_CHAN_INFO_SCALE
- use IIO_CHAN_INFO_OVERSAMPLING_RATIO for controlling the decimation rate
- use IIO_CHAN_INFO_SAMP_FREQ for read-only
- remove dem_clk_get_enabled() function
- remove chip_info variable from probe function
- fix indentation
- remove max_rate
- rename ad7405_set_sampling_rate in ad7405_det_dec_rate
add adum7702 and adum7703 chip_info
drivers/iio/adc/Kconfig | 10 ++
drivers/iio/adc/Makefile | 1 +
drivers/iio/adc/ad7405.c | 276 +++++++++++++++++++++++++++++++++++++++
3 files changed, 287 insertions(+)
create mode 100644 drivers/iio/adc/ad7405.c
diff --git a/drivers/iio/adc/Kconfig b/drivers/iio/adc/Kconfig
index ad06cf556785..6ed1042636d9 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"
+ select 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..1a96a283ab01
--- /dev/null
+++ b/drivers/iio/adc/ad7405.c
@@ -0,0 +1,276 @@
+// 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/iio/backend.h>
+#include <linux/iio/iio.h>
+
+static const unsigned int ad7405_scale_table[][2] = {
+ {640, 0},
+};
+
+static const unsigned int adum7702_scale_table[][2] = {
+ {128, 0},
+};
+
+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 (*scale_table)[2];
+};
+
+struct ad7405_state {
+ struct iio_backend *back;
+ const struct ad7405_chip_info *info;
+ unsigned int sample_frequency_tbl[ARRAY_SIZE(ad7405_dec_rates)];
+ unsigned int sample_frequency;
+ unsigned int ref_frequency;
+ unsigned int dec_rate;
+};
+
+static void ad7405_fill_samp_freq_table(struct ad7405_state *st)
+{
+ unsigned int i;
+
+ for (i = 0; i < ARRAY_SIZE(ad7405_dec_rates); i++)
+ st->sample_frequency_tbl[i] =
+ DIV_ROUND_CLOSEST_ULL(st->ref_frequency, ad7405_dec_rates[i]);
+}
+
+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;
+
+ ret = iio_backend_oversampling_ratio_set(st->back, 0, dec_rate);
+ if (ret)
+ return ret;
+
+ st->dec_rate = dec_rate;
+
+ return 0;
+}
+
+static int ad7405_get_scale(struct ad7405_state *st, int *val, int *val2)
+{
+ unsigned int tmp;
+
+ tmp = (st->info->scale_table[0][0] * 1000000ULL) >>
+ st->info->channel.scan_type.realbits;
+ *val = tmp / 1000000;
+ *val2 = tmp % 1000000;
+
+ return IIO_VAL_INT_PLUS_NANO;
+}
+
+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:
+ return ad7405_get_scale(st, val, val2);
+ 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;
+ 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:
+ return ad7405_set_dec_rate(indio_dev, chan, val);
+ case IIO_CHAN_INFO_SAMP_FREQ:
+ if (val < 1)
+ 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), \
+ .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",
+ .scale_table = ad7405_scale_table,
+ .channel = AD7405_IIO_CHANNEL,
+};
+
+static const struct ad7405_chip_info adum7701_chip_info = {
+ .name = "ADUM7701",
+ .scale_table = ad7405_scale_table,
+ .channel = AD7405_IIO_CHANNEL,
+};
+
+static const struct ad7405_chip_info adum7702_chip_info = {
+ .name = "ADUM7702",
+ .scale_table = adum7702_scale_table,
+ .channel = AD7405_IIO_CHANNEL,
+};
+
+static const struct ad7405_chip_info adum7703_chip_info = {
+ .name = "ADUM7703",
+ .scale_table = ad7405_scale_table,
+ .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;
+
+ ad7405_fill_samp_freq_table(st);
+
+ indio_dev->dev.parent = dev;
+ 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);
+}
+
+/* Match table for of_platform binding */
+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] 14+ messages in thread
* Re: [PATCH v3 3/4] dt-bindings: iio: adc: add ad7405
2025-05-16 10:58 ` [PATCH v3 3/4] dt-bindings: iio: adc: add ad7405 Pop Ioan Daniel
@ 2025-05-16 14:18 ` Conor Dooley
2025-05-16 15:45 ` David Lechner
2025-05-16 19:30 ` Krzysztof Kozlowski
2025-05-18 16:44 ` Jonathan Cameron
2 siblings, 1 reply; 14+ messages in thread
From: Conor Dooley @ 2025-05-16 14:18 UTC (permalink / raw)
To: Pop Ioan Daniel
Cc: 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, Trevor Gamblin, Matteo Martelli, linux-iio,
devicetree, linux-kernel
[-- Attachment #1: Type: text/plain, Size: 2551 bytes --]
On Fri, May 16, 2025 at 01:58:03PM +0300, Pop Ioan Daniel wrote:
> Add devicetree bindings for ad7405/adum770x family.
>
> Signed-off-by: Pop Ioan Daniel <pop.ioan-daniel@analog.com>
> ---
> changes in v2:
> - fix properties: clocks issue
> .../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..939de3bd6f26
> --- /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>;
No reg here, how do you actually access this device?
Is it entirely via the backend?
> + vdd1-supply = <&vdd1>;
> + vdd2-supply = <&vdd2>;
> + io-backends = <&iio_backend>;
> + };
> +...
> --
> 2.34.1
>
[-- Attachment #2: signature.asc --]
[-- Type: application/pgp-signature, Size: 228 bytes --]
^ permalink raw reply [flat|nested] 14+ messages in thread
* Re: [PATCH v3 1/4] iio: backend: update iio_backend_oversampling_ratio_set
2025-05-16 10:58 ` [PATCH v3 1/4] iio: backend: update iio_backend_oversampling_ratio_set Pop Ioan Daniel
@ 2025-05-16 15:06 ` David Lechner
2025-05-18 16:13 ` Jonathan Cameron
0 siblings, 1 reply; 14+ messages in thread
From: David Lechner @ 2025-05-16 15:06 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, Marcelo Schmitt,
Alisa-Dariana Roman, João Paulo Gonçalves, Herve Codina,
linux-iio, devicetree, linux-kernel
On 5/16/25 5:58 AM, Pop Ioan Daniel wrote:
> In the function iio_backend_oversampling_ratio_set the chan parameter
> was added. The function can be used in contexts where the channel
> must be specified. All affected files have been modified.
>
> Signed-off-by: Pop Ioan Daniel <pop.ioan-daniel@analog.com>
> ---
> changes in v3:
> - fix ad4851_set_oversampling_ratio function channel error
> drivers/iio/adc/ad4851.c | 6 +++---
> drivers/iio/adc/adi-axi-adc.c | 3 ++-
> drivers/iio/industrialio-backend.c | 3 ++-
> include/linux/iio/backend.h | 3 ++-
> 4 files changed, 9 insertions(+), 6 deletions(-)
>
> diff --git a/drivers/iio/adc/ad4851.c b/drivers/iio/adc/ad4851.c
> index 98ebc853db79..fccfca256670 100644
> --- a/drivers/iio/adc/ad4851.c
> +++ b/drivers/iio/adc/ad4851.c
> @@ -294,7 +294,7 @@ 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 chan,
I think passing the channel here is misleading since this is setting the
oversampling ratio for all channels, not just the one specified.
I would suggest to make a separate patch that removes the unused
const struct iio_chan_spec *chan parameter first.
> unsigned int osr)
> {
> struct ad4851_state *st = iio_priv(indio_dev);
> @@ -321,7 +321,7 @@ static int ad4851_set_oversampling_ratio(struct iio_dev *indio_dev,
> return ret;
> }
>
> - ret = iio_backend_oversampling_ratio_set(st->back, osr);
> + ret = iio_backend_oversampling_ratio_set(st->back, chan, osr);
Then in this patch, just pass 0 here instead of chan with a comment that
the channel is ignored by the backend being used here.
> if (ret)
> return ret;
>
^ permalink raw reply [flat|nested] 14+ messages in thread
* Re: [PATCH v3 2/4] iio: adc: adi-axi-adc: add axi_adc_oversampling_ratio_set
2025-05-16 10:58 ` [PATCH v3 2/4] iio: adc: adi-axi-adc: add axi_adc_oversampling_ratio_set Pop Ioan Daniel
@ 2025-05-16 15:06 ` David Lechner
0 siblings, 0 replies; 14+ messages in thread
From: David Lechner @ 2025-05-16 15:06 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, Matteo Martelli, Ramona Alexandra Nechita,
João Paulo Gonçalves, linux-iio, devicetree,
linux-kernel
On 5/16/25 5:58 AM, Pop Ioan Daniel wrote:
> Add support for setting decimation rate.
>
> Signed-off-by: Pop Ioan Daniel <pop.ioan-daniel@analog.com>
> ---
Reviewed-by: David Lechner <dlechner@baylibre.com>
^ permalink raw reply [flat|nested] 14+ messages in thread
* Re: [PATCH v3 4/4] iio: adc: ad7405: add ad7405 driver
2025-05-16 10:58 ` [PATCH v3 4/4] iio: adc: ad7405: add ad7405 driver Pop Ioan Daniel
@ 2025-05-16 15:08 ` David Lechner
2025-05-18 16:33 ` Jonathan Cameron
1 sibling, 0 replies; 14+ messages in thread
From: David Lechner @ 2025-05-16 15:08 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, Marcelo Schmitt,
Alisa-Dariana Roman, Esteban Blanc, linux-iio, devicetree,
linux-kernel
On 5/16/25 5:58 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 v3:
> - edit ad7405_chip_info struct instances
> - remove lock
> - add implementation for IIO_CHAN_INFO_SCALE
> - use IIO_CHAN_INFO_OVERSAMPLING_RATIO for controlling the decimation rate
> - use IIO_CHAN_INFO_SAMP_FREQ for read-only
> - remove dem_clk_get_enabled() function
> - remove chip_info variable from probe function
> - fix indentation
> - remove max_rate
> - rename ad7405_set_sampling_rate in ad7405_det_dec_rate
> add adum7702 and adum7703 chip_info
> drivers/iio/adc/Kconfig | 10 ++
> drivers/iio/adc/Makefile | 1 +
> drivers/iio/adc/ad7405.c | 276 +++++++++++++++++++++++++++++++++++++++
> 3 files changed, 287 insertions(+)
> create mode 100644 drivers/iio/adc/ad7405.c
>
> diff --git a/drivers/iio/adc/Kconfig b/drivers/iio/adc/Kconfig
> index ad06cf556785..6ed1042636d9 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"
> + select IIO_BACKEND
It might make more sense to make this "depends" instead of "select".
Otherwise, this will show up for everyone, even if they can't actually
use it because they don't have a 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..1a96a283ab01
> --- /dev/null
> +++ b/drivers/iio/adc/ad7405.c
> @@ -0,0 +1,276 @@
> +// 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/iio/backend.h>
> +#include <linux/iio/iio.h>
> +
> +static const unsigned int ad7405_scale_table[][2] = {
> + {640, 0},
> +};
> +
> +static const unsigned int adum7702_scale_table[][2] = {
> + {128, 0},
> +};
Are there future plans for these scale tables? I don't see the point
since we only use the first number.
Also, it would make more sense to use the datasheet numbers of 320 and 64.
Otherwise, we need an explanation of where these values come from.
> +
> +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 (*scale_table)[2];
> +};
> +
> +struct ad7405_state {
> + struct iio_backend *back;
> + const struct ad7405_chip_info *info;
> + unsigned int sample_frequency_tbl[ARRAY_SIZE(ad7405_dec_rates)];
This is written but never read, so can be removed.
> + unsigned int sample_frequency;
This is unused and can be removed.
> + unsigned int ref_frequency;
> + unsigned int dec_rate;
> +};
> +
> +static void ad7405_fill_samp_freq_table(struct ad7405_state *st)
> +{
> + unsigned int i;
> +
> + for (i = 0; i < ARRAY_SIZE(ad7405_dec_rates); i++)
> + st->sample_frequency_tbl[i] =
> + DIV_ROUND_CLOSEST_ULL(st->ref_frequency, ad7405_dec_rates[i]);
> +}
> +
> +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;
> +
> + ret = iio_backend_oversampling_ratio_set(st->back, 0, dec_rate);
Should pass e.g. chan->scan_index here instead of 0. Otherwise chan param
is unused.
> + if (ret)
> + return ret;
> +
> + st->dec_rate = dec_rate;
> +
> + return 0;
> +}
> +
> +static int ad7405_get_scale(struct ad7405_state *st, int *val, int *val2)
> +{
> + unsigned int tmp;
> +
> + tmp = (st->info->scale_table[0][0] * 1000000ULL) >>
> + st->info->channel.scan_type.realbits;
> + *val = tmp / 1000000;
> + *val2 = tmp % 1000000;
> +
> + return IIO_VAL_INT_PLUS_NANO;
As in the comment above about the scale_tables, the more typical way to do this
would be to store the full scale voltage in st->info->full_scale_mv (320 or 64),
then here:
*val = st->info->full_scale_mv;
*val2 = st->info->channel.scan_type.realbits - 1;
return IIO_VAL_FRACTIONAL_LOG2;
> +}
> +
> +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:
> + return ad7405_get_scale(st, val, val2);
> + 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;
> + 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:
> + return ad7405_set_dec_rate(indio_dev, chan, val);
> + case IIO_CHAN_INFO_SAMP_FREQ:
> + if (val < 1)
> + return -EINVAL;
> + return ad7405_set_dec_rate(indio_dev, chan, val);
I would be tempted to just leave the sampling_freqnecy read-only.
But if we want it to be writeable, we have to divide val by ref_freqnecy
to convert sampling freqnecy to decimation rate before calling
ad7405_set_dec_rate().
> + 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;
If we have a writeable sampling_frequency, the we should also have
case IIO_CHAN_INFO_SAMP_FREQ here. (But as above, I think not writeable
is fine, so this is OK as-is.)
> + 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), \
> + .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', \
Since the raw value is unsigned but we can measure negative
differences, it means we need to implement IIO_CHAN_INFO_OFFSET
with a value of 2 << 15 so that usespace knows what value
is 0 volts.
> + .realbits = 16, \
> + .storagebits = 16, \
> + }, \
> +}
> +
> +static const struct ad7405_chip_info ad7405_chip_info = {
> + .name = "AD7405",
> + .scale_table = ad7405_scale_table,
> + .channel = AD7405_IIO_CHANNEL,
> +};
> +
> +static const struct ad7405_chip_info adum7701_chip_info = {
> + .name = "ADUM7701",
> + .scale_table = ad7405_scale_table,
> + .channel = AD7405_IIO_CHANNEL,
> +};
> +
> +static const struct ad7405_chip_info adum7702_chip_info = {
> + .name = "ADUM7702",
> + .scale_table = adum7702_scale_table,
> + .channel = AD7405_IIO_CHANNEL,
> +};
> +
> +static const struct ad7405_chip_info adum7703_chip_info = {
> + .name = "ADUM7703",
> + .scale_table = ad7405_scale_table,
> + .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);
> +
nit: no blank line here
> + 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;
> +
> + ad7405_fill_samp_freq_table(st);
> +
> + indio_dev->dev.parent = dev;
> + 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);
> +}
> +
> +/* Match table for of_platform binding */
> +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, },
> + { },
no trailing comma please (iio subsystem style)
> +};
> +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] 14+ messages in thread
* Re: [PATCH v3 3/4] dt-bindings: iio: adc: add ad7405
2025-05-16 14:18 ` Conor Dooley
@ 2025-05-16 15:45 ` David Lechner
0 siblings, 0 replies; 14+ messages in thread
From: David Lechner @ 2025-05-16 15:45 UTC (permalink / raw)
To: Conor Dooley, Pop Ioan Daniel
Cc: 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, Trevor Gamblin,
Matteo Martelli, linux-iio, devicetree, linux-kernel
On 5/16/25 9:18 AM, Conor Dooley wrote:
> On Fri, May 16, 2025 at 01:58:03PM +0300, Pop Ioan Daniel wrote:
>> Add devicetree bindings for ad7405/adum770x family.
>>
>> Signed-off-by: Pop Ioan Daniel <pop.ioan-daniel@analog.com>
>> ---
>> changes in v2:
>> - fix properties: clocks issue
>> .../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..939de3bd6f26
>> --- /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>;
>
> No reg here, how do you actually access this device?
> Is it entirely via the backend?
Yeah, it is just a high speed serial bus (not SPI) that reads data
and there are no programmable registers.
It would probably make sense to have this as a child node of the
backend rather than a random platform device. We had a similar
discussion about a similar case a while back [1].
However, the conclusion in that case was different because that
device had both configuration registers and non-SPI compatible
data stream on the same lines. So we concluded that even though
this was the same line on the DAC, it was two different buses.
We ended up with the AXI ADC node as a parent SPI controller node
that also used the io-backends binding to represent the separate
data bus.
In this case though, we only have one bus, so instead of using the
io-backend binding, we could just have the AXI ADC node be the
parent of the ADC node as was suggested in [2].
[1]: https://lore.kernel.org/linux-iio/f9a2b74f371fb4b02486ad7426c57b75739438f3.camel@gmail.com/
[2]: https://lore.kernel.org/linux-iio/e8af0f3f-a09c-42d7-b8ca-dd633539af73@kernel.org/
>
>> + vdd1-supply = <&vdd1>;
>> + vdd2-supply = <&vdd2>;
>> + io-backends = <&iio_backend>;
>> + };
>> +...
>> --
>> 2.34.1
>>
^ permalink raw reply [flat|nested] 14+ messages in thread
* Re: [PATCH v3 3/4] dt-bindings: iio: adc: add ad7405
2025-05-16 10:58 ` [PATCH v3 3/4] dt-bindings: iio: adc: add ad7405 Pop Ioan Daniel
2025-05-16 14:18 ` Conor Dooley
@ 2025-05-16 19:30 ` Krzysztof Kozlowski
2025-05-18 16:44 ` Jonathan Cameron
2 siblings, 0 replies; 14+ messages in thread
From: Krzysztof Kozlowski @ 2025-05-16 19:30 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, Trevor Gamblin, Matteo Martelli, linux-iio,
devicetree, linux-kernel
On 16/05/2025 12:58, Pop Ioan Daniel wrote:
> Add devicetree bindings for ad7405/adum770x family.
>
> Signed-off-by: Pop Ioan Daniel <pop.ioan-daniel@analog.com>
> ---
> changes in v2:
> - fix properties: clocks issue
> .../bindings/iio/adc/adi,ad7405.yaml | 60 +++++++++++++++++++
> 1 file changed, 60 insertions(+)
> create mode 100644 Documentation/devicetree/bindings/iio/adc/adi,ad7405.yaml
>
Reviewed-by: Krzysztof Kozlowski <krzysztof.kozlowski@linaro.org>
Best regards,
Krzysztof
^ permalink raw reply [flat|nested] 14+ messages in thread
* Re: [PATCH v3 1/4] iio: backend: update iio_backend_oversampling_ratio_set
2025-05-16 15:06 ` David Lechner
@ 2025-05-18 16:13 ` Jonathan Cameron
0 siblings, 0 replies; 14+ messages in thread
From: Jonathan Cameron @ 2025-05-18 16:13 UTC (permalink / raw)
To: David Lechner
Cc: Pop Ioan Daniel, Lars-Peter Clausen, Michael Hennerich,
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,
João Paulo Gonçalves, Herve Codina, linux-iio,
devicetree, linux-kernel
On Fri, 16 May 2025 10:06:18 -0500
David Lechner <dlechner@baylibre.com> wrote:
> On 5/16/25 5:58 AM, Pop Ioan Daniel wrote:
> > In the function iio_backend_oversampling_ratio_set the chan parameter
> > was added. The function can be used in contexts where the channel
is added
(tense is wrong given this patch is doing it). However it should be
in imperative.
"Add chan parameter to iio_backed_oversampling_ration_set() to allow
for contexts where the channel must be specified. Modify all
existing users."
> > must be specified. All affected files have been modified.
> >
> > Signed-off-by: Pop Ioan Daniel <pop.ioan-daniel@analog.com>
> > ---
> > changes in v3:
> > - fix ad4851_set_oversampling_ratio function channel error
> > drivers/iio/adc/ad4851.c | 6 +++---
> > drivers/iio/adc/adi-axi-adc.c | 3 ++-
> > drivers/iio/industrialio-backend.c | 3 ++-
> > include/linux/iio/backend.h | 3 ++-
> > 4 files changed, 9 insertions(+), 6 deletions(-)
> >
> > diff --git a/drivers/iio/adc/ad4851.c b/drivers/iio/adc/ad4851.c
> > index 98ebc853db79..fccfca256670 100644
> > --- a/drivers/iio/adc/ad4851.c
> > +++ b/drivers/iio/adc/ad4851.c
> > @@ -294,7 +294,7 @@ 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 chan,
>
> I think passing the channel here is misleading since this is setting the
> oversampling ratio for all channels, not just the one specified.
>
> I would suggest to make a separate patch that removes the unused
> const struct iio_chan_spec *chan parameter first.
>
> > unsigned int osr)
> > {
> > struct ad4851_state *st = iio_priv(indio_dev);
> > @@ -321,7 +321,7 @@ static int ad4851_set_oversampling_ratio(struct iio_dev *indio_dev,
> > return ret;
> > }
> >
> > - ret = iio_backend_oversampling_ratio_set(st->back, osr);
> > + ret = iio_backend_oversampling_ratio_set(st->back, chan, osr);
>
>
> Then in this patch, just pass 0 here instead of chan with a comment that
> the channel is ignored by the backend being used here.
Is it implausible that such a backend could be written for this device? If
so then I agree.
J
>
> > if (ret)
> > return ret;
> >
>
^ permalink raw reply [flat|nested] 14+ messages in thread
* Re: [PATCH v3 4/4] iio: adc: ad7405: add ad7405 driver
2025-05-16 10:58 ` [PATCH v3 4/4] iio: adc: ad7405: add ad7405 driver Pop Ioan Daniel
2025-05-16 15:08 ` David Lechner
@ 2025-05-18 16:33 ` Jonathan Cameron
1 sibling, 0 replies; 14+ messages in thread
From: Jonathan Cameron @ 2025-05-18 16:33 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, Tobias Sperling,
Marcelo Schmitt, Alisa-Dariana Roman, Esteban Blanc, linux-iio,
devicetree, linux-kernel
On Fri, 16 May 2025 13:58:04 +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>
More or less just one question to add to David's review.
It's around whether the clock is a separate thing or part of the backend
(which here kind of incorporates the bus controller).
We wouldn't bother specifying a clock line explicitly for SPI or PCIe so
why do we need one for this?
> ---
> changes in v3:
> - edit ad7405_chip_info struct instances
> - remove lock
> - add implementation for IIO_CHAN_INFO_SCALE
> - use IIO_CHAN_INFO_OVERSAMPLING_RATIO for controlling the decimation rate
> - use IIO_CHAN_INFO_SAMP_FREQ for read-only
> - remove dem_clk_get_enabled() function
> - remove chip_info variable from probe function
> - fix indentation
> - remove max_rate
> - rename ad7405_set_sampling_rate in ad7405_det_dec_rate
> add adum7702 and adum7703 chip_info
> drivers/iio/adc/Kconfig | 10 ++
> drivers/iio/adc/Makefile | 1 +
> drivers/iio/adc/ad7405.c | 276 +++++++++++++++++++++++++++++++++++++++
> 3 files changed, 287 insertions(+)
> create mode 100644 drivers/iio/adc/ad7405.c
> diff --git a/drivers/iio/adc/ad7405.c b/drivers/iio/adc/ad7405.c
> new file mode 100644
> index 000000000000..1a96a283ab01
> --- /dev/null
> +++ b/drivers/iio/adc/ad7405.c
> @@ -0,0 +1,276 @@
> +// 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/iio/backend.h>
> +#include <linux/iio/iio.h>
> +
> +static const unsigned int ad7405_scale_table[][2] = {
> + {640, 0},
> +};
> +
> +static const unsigned int adum7702_scale_table[][2] = {
> + {128, 0},
{ 128, 0 },
Assuming you keep these (see David's feedback)
> +};
> +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);
Perhaps an odd question but for a clocked lvds bus like this
is the clock actually something we should represent as part of
the bus (so iio_backend interfaces) or separately like this?
> + if (!st->ref_frequency)
> + return -EINVAL;
> +
> + ad7405_fill_samp_freq_table(st);
> +
> + indio_dev->dev.parent = dev;
> + 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);
> +}
^ permalink raw reply [flat|nested] 14+ messages in thread
* Re: [PATCH v3 3/4] dt-bindings: iio: adc: add ad7405
2025-05-16 10:58 ` [PATCH v3 3/4] dt-bindings: iio: adc: add ad7405 Pop Ioan Daniel
2025-05-16 14:18 ` Conor Dooley
2025-05-16 19:30 ` Krzysztof Kozlowski
@ 2025-05-18 16:44 ` Jonathan Cameron
2 siblings, 0 replies; 14+ messages in thread
From: Jonathan Cameron @ 2025-05-18 16: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, Tobias Sperling,
Alisa-Dariana Roman, Marcelo Schmitt, Trevor Gamblin,
Matteo Martelli, linux-iio, devicetree, linux-kernel
On Fri, 16 May 2025 13:58:03 +0300
Pop Ioan Daniel <pop.ioan-daniel@analog.com> wrote:
> Add devicetree bindings for ad7405/adum770x family.
>
> Signed-off-by: Pop Ioan Daniel <pop.ioan-daniel@analog.com>
> ---
> changes in v2:
> - fix properties: clocks issue
> .../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..939de3bd6f26
> --- /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
The closest part we have to this (LVDS bus etc) that I could find was
the ad7625. That does use an explicit clock but there is more going
on as it also has a pwm connected to gate that clock so maybe isn't
an idea example to follow.
As you will see in the driver review I just sent I'm wondering if an
explicit clock is a separate thing or considered part of the lvds bus.
It's definitely wired to the ADC as a clock but it's also (I think) either
wired up to the IP we map to the backend (from software point of view)
or generated by that.
I don't think this device is using an LVDS encoding to allow the clock
to be established from the data lines alone? 8b/10b or similar (if it were then the
clock to the ADC only description would be correct choice).
Perhaps this device is one that needs docs in the kernel to talk us
through how the signalling is working.
Jonathan
> +
> + 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 = <&iio_backend>;
> + };
> +...
^ permalink raw reply [flat|nested] 14+ messages in thread
end of thread, other threads:[~2025-05-18 16:45 UTC | newest]
Thread overview: 14+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2025-05-16 10:58 [PATCH v3 0/4] Add support for AD7405/ADUM770x Pop Ioan Daniel
2025-05-16 10:58 ` [PATCH v3 1/4] iio: backend: update iio_backend_oversampling_ratio_set Pop Ioan Daniel
2025-05-16 15:06 ` David Lechner
2025-05-18 16:13 ` Jonathan Cameron
2025-05-16 10:58 ` [PATCH v3 2/4] iio: adc: adi-axi-adc: add axi_adc_oversampling_ratio_set Pop Ioan Daniel
2025-05-16 15:06 ` David Lechner
2025-05-16 10:58 ` [PATCH v3 3/4] dt-bindings: iio: adc: add ad7405 Pop Ioan Daniel
2025-05-16 14:18 ` Conor Dooley
2025-05-16 15:45 ` David Lechner
2025-05-16 19:30 ` Krzysztof Kozlowski
2025-05-18 16:44 ` Jonathan Cameron
2025-05-16 10:58 ` [PATCH v3 4/4] iio: adc: ad7405: add ad7405 driver Pop Ioan Daniel
2025-05-16 15:08 ` David Lechner
2025-05-18 16:33 ` Jonathan Cameron
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).