Re: [PATCH v2 4/4] iio: adc: ad4080: add support for AD4880 dual-channel ADC
From: Jonathan Cameron <jic23@kernel.org>
Date: 2026-02-07 15:04:50
Also in:
linux-iio, linux-spi, lkml
On Fri, 6 Feb 2026 18:07:16 +0200 Antoniu Miclaus [off-list ref] wrote:
Add support for the AD4880, a dual-channel 20-bit 40MSPS SAR ADC with integrated fully differential amplifiers (FDA). The AD4880 has two independent ADC channels, each with its own SPI configuration interface. The driver uses spi_new_ancillary_device() to create an additional SPI device for the second channel, allowing both channels to share the same SPI bus with different chip selects. Signed-off-by: Antoniu Miclaus <antoniu.miclaus@analog.com>
Hi Antoniu Just one minor comment from me. Thanks, Jonathan
quoted hunk ↗ jump to hunk
--- Changes in v2: - Use second reg entry instead of custom adi,aux-spi-cs property for secondary channel chip select - Use devm_iio_backend_get_by_index() instead of named backends for multi-channel backend lookup - Separate iio_info structures for single-channel (ad4080) and multi-channel (ad4880) devices - Keep filter_type as shared attribute for single-channel devices, use per-channel only for AD4880 - Add separate AD4880_CHANNEL_DEFINE macro with per-channel attributes drivers/iio/adc/ad4080.c | 256 +++++++++++++++++++++++++++++++-------- 1 file changed, 205 insertions(+), 51 deletions(-)diff --git a/drivers/iio/adc/ad4080.c b/drivers/iio/adc/ad4080.c index 7cf3b6ed7940..2b26f8a4d548 100644 --- a/drivers/iio/adc/ad4080.c +++ b/drivers/iio/adc/ad4080.c
quoted hunk ↗ jump to hunk
@@ -617,13 +736,37 @@ static int ad4080_probe(struct spi_device *spi) return dev_err_probe(dev, ret, "failed to get and enable supplies\n"); - st->regmap = devm_regmap_init_spi(spi, &ad4080_regmap_config); - if (IS_ERR(st->regmap)) - return PTR_ERR(st->regmap); + /* Setup primary SPI device (channel 0) */ + st->spi[0] = spi; + st->regmap[0] = devm_regmap_init_spi(spi, &ad4080_regmap_config); + if (IS_ERR(st->regmap[0])) + return PTR_ERR(st->regmap[0]); - st->info = spi_get_device_match_data(spi); - if (!st->info) - return -ENODEV; + /* Setup ancillary SPI device for additional channel (AD4880) */ + if (st->info->num_channels > 1) {
I wonder if this would be clearer as a loop? When there is a 2 channel device
around, a 4 channels one often shows up later.
for (int i = 1; i < st->info->num_channels; i++) {
+ u32 reg[2]; + + ret = device_property_read_u32_array(dev, "reg", reg, + ARRAY_SIZE(reg)); + if (ret) + return dev_err_probe(dev, ret, + "missing second reg entry for multi-channel device\n"); + + st->spi[1] = spi_new_ancillary_device(spi, reg[1]); + if (IS_ERR(st->spi[1])) + return dev_err_probe(dev, PTR_ERR(st->spi[1]), + "failed to register ancillary device\n"); + + ret = devm_add_action_or_reset(dev, ad4080_unregister_ancillary, + st->spi[1]); + if (ret) + return ret; + + st->regmap[1] = devm_regmap_init_spi(st->spi[1], + &ad4080_regmap_config); + if (IS_ERR(st->regmap[1])) + return PTR_ERR(st->regmap[1]); + }