Re: [PATCH 1/2] dt-bindings: iio: adc: Add TI ADS1220
From: David Lechner
Date: Fri Jun 12 2026 - 12:11:03 EST
On 6/10/26 10:13 AM, Nguyen Minh Tien wrote:
> The ADS1220 is a 24-bit, 2-kSPS, 4-channel delta-sigma ADC from Texas
> Instruments with an SPI (mode 1) interface, a programmable gain amplifier,
> an internal 2.048V reference and a dedicated DRDY data-ready output.
>
> Add a device tree binding describing the SPI device and its per-input
> channel child nodes (single-ended AINx or the multiplexer's differential
> pairs), the optional external/AVDD reference selection and the DRDY
> interrupt.
FYI, I have a similar chip I am working on (at least in terms of wiring)
that I plan to submit probably next week. I think the DT bindings will
be quite similar, so you might want to wait and see how the review goes
for that (TI ADS122C14).
It could be similar enough that you could add this chip to what I am
doing rather than having separate files.
>
> Signed-off-by: Nguyen Minh Tien <zizuzacker@xxxxxxxxx>
> ---
> .../bindings/iio/adc/ti,ads1220.yaml | 146 ++++++++++++++++++
> 1 file changed, 146 insertions(+)
> create mode 100644 Documentation/devicetree/bindings/iio/adc/ti,ads1220.yaml
>
> diff --git a/Documentation/devicetree/bindings/iio/adc/ti,ads1220.yaml b/Documentation/devicetree/bindings/iio/adc/ti,ads1220.yaml
> new file mode 100644
> index 000000000..1fedffc2a
> --- /dev/null
> +++ b/Documentation/devicetree/bindings/iio/adc/ti,ads1220.yaml
> @@ -0,0 +1,146 @@
> +# SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause)
> +%YAML 1.2
> +---
> +$id: http://devicetree.org/schemas/iio/adc/ti,ads1220.yaml#
> +$schema: http://devicetree.org/meta-schemas/core.yaml#
> +
> +title: Texas Instruments ADS1220 ADC
> +
> +maintainers:
> + - Nguyen Minh Tien <zizuzacker@xxxxxxxxx>
> +
> +description:
> + The TI ADS1220 is a precision 24-bit, 2-kSPS, delta-sigma ADC with an SPI
> + (mode 1) interface. It provides two differential or four single-ended inputs
> + through a multiplexer, a programmable gain amplifier (gain 1 to 128), an
> + internal 2.048V reference and oscillator, two programmable excitation current
> + sources and a 50/60Hz rejection filter. A dedicated DRDY output signals when a
> + new conversion result is available.
> +
> +properties:
> + compatible:
> + const: ti,ads1220
> +
> + reg:
> + maxItems: 1
> +
> + spi-cpha: true
> +
> + interrupts:
> + description: DRDY pin, signals that a new conversion result is ready.
> + maxItems: 1
There are actually 2 DRDY pins, so we need some way to describe which one
is wired up.
So...
interrupt-names:
items:
- enum: [drdy, dout-drdy]
And we have found that when dout-drdy is used, some interrupt controllers
can't handle it correctly and we also need a dout-drdy-gpios to read the pin.
> +
> + avdd-supply:
> + description: Analog power supply (AVDD/AVSS).
> +
> + dvdd-supply:
> + description: Digital power supply (DVDD/DGND).
> +
> + vref-supply:
> + description:
> + External reference voltage (REFP0/REFN0). If omitted, the internal
> + 2.048V reference is used unless ti,vref-avdd is set.
If the pins are REFx0, then let's call it ref0-supply.
There is also a ref1-supply (alternate REFP1/REFN1 function of AIN1/AIN3) so that
needs to be included as well.
Also, in the case when the sensor is an RDT, we only care about the resistor
across these inputs rather than the voltage. So in the one I am working on,
I added extra properties for that.
> +
> + ti,vref-avdd:
> + type: boolean
> + description:
> + Use the analog supply (AVDD/AVSS) as the conversion reference instead of
> + the internal 2.048V reference. Suited to ratiometric single-supply
> + measurements (for example a potentiometer wired across AVDD), giving a
> + full 0..AVDD input range without an external reference. Ignored when
> + vref-supply is present.
> +
On the chip I am working on, we want to select the reference source per-channel
rather than globally, so might want to do the same here.
There is also an optional external clock, so we need clocks property.
> + "#address-cells":
> + const: 1
> +
> + "#size-cells":
> + const: 0
> +
> + "#io-channel-cells":
> + const: 1
> +
> +required:
> + - compatible
> + - reg
> + - "#address-cells"
> + - "#size-cells"
> + - avdd-supply
> + - dvdd-supply
> +
> +patternProperties:
> + "^channel@[0-6]$":
> + $ref: adc.yaml
> + type: object
> + description: Represents one ADC input configuration (channel).
> +
> + properties:
> + reg:
> + minimum: 0
> + maximum: 6
I would add a comment explaining that the limit here is arbitrary. Also wouldn't
hurt to make it a bit bigger. Technically, someone could have every possible
combination of all inputs (16 differential + 4 single-ended).
> +
> + diff-channels:
> + description:
> + Differential input pair routable by the ADS1220 multiplexer.
> + oneOf:
> + - items: [const: 0, const: 1]
> + - items: [const: 0, const: 2]
> + - items: [const: 0, const: 3]
> + - items: [const: 1, const: 2]
> + - items: [const: 1, const: 3]
> + - items: [const: 2, const: 3]
> + - items: [const: 1, const: 0]
> + - items: [const: 3, const: 2]
Sometimes, the same channel may be used as both positive and negative
for a diagnostic, so I would just allow any combination instead of
listing specific combinations.
> +
> + single-channel:
> + description:
> + Single-ended input channel AINx measured against AVSS.
> + minimum: 0
> + maximum: 3
On the chip I am working on, I also added properties here for required
current outputs for the RDT case.
And as mentioned above, a property here to select the reference voltage
that this specific channel uses It could be Internal, REFx0, REFx1 or AVDD,
so a boolean flag is not enough.
> +
> + oneOf:
> + - required: [diff-channels]
> + - required: [single-channel]
> +
> + required:
> + - reg
> +
> + unevaluatedProperties: false
> +
> +allOf:
> + - $ref: /schemas/spi/spi-peripheral-props.yaml#
> +
> +unevaluatedProperties: false
> +
> +examples:
> + - |
> + #include <dt-bindings/interrupt-controller/irq.h>
> +
> + spi {
> + #address-cells = <1>;
> + #size-cells = <0>;
> +
> + adc@0 {
> + compatible = "ti,ads1220";
> + reg = <0>;
> + spi-max-frequency = <2500000>;
> + spi-cpha;
> + interrupt-parent = <&pio>;
> + interrupts = <4 4 IRQ_TYPE_EDGE_FALLING>;
> + avdd-supply = <®_vcc3v3>;
> + dvdd-supply = <®_vcc3v3>;
> + #address-cells = <1>;
> + #size-cells = <0>;
> + #io-channel-cells = <1>;
> +
> + channel@0 {
> + reg = <0>;
> + single-channel = <0>;
> + };
> +
> + channel@1 {
> + reg = <1>;
> + diff-channels = <0 1>;
> + };
> + };
> + };
> +...