Re: [PATCH v4 5/5] iio: adc: ad4080: add support for AD4880 dual-channel ADC
From: Andy Shevchenko
Date: Tue Feb 24 2026 - 05:26:05 EST
On Mon, Feb 23, 2026 at 06:21:04PM +0200, Antoniu Miclaus 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.
...
> +static int ad4880_update_scan_mode(struct iio_dev *indio_dev,
> + const unsigned long *scan_mask)
> +{
> + struct ad4080_state *st = iio_priv(indio_dev);
> + unsigned int ch;
Not used outside of the loop, hence
> + int ret;
> +
> + for (ch = 0; ch < st->info->num_channels; ch++) {
for (unsigned int ch = 0; ch < st->info->num_channels; ch++) {
should suffice.
> + /*
> + * Each backend has a single channel (channel 0 from the
> + * backend's perspective), so always use channel index 0.
> + */
> + if (test_bit(ch, scan_mask))
> + ret = iio_backend_chan_enable(st->back[ch], 0);
> + else
> + ret = iio_backend_chan_disable(st->back[ch], 0);
> + if (ret)
> + return ret;
> + }
> +
> + return 0;
> +}
...
> +static int ad4080_setup(struct iio_dev *indio_dev)
> +{
> + struct ad4080_state *st = iio_priv(indio_dev);
> + unsigned int ch;
> + int ret;
> +
> + for (ch = 0; ch < st->info->num_channels; ch++) {
Same.
> + ret = ad4080_setup_channel(st, ch);
> + if (ret)
> + return ret;
> + }
> +
> + return 0;
> }
...
> + /* Setup ancillary SPI devices for additional channels */
> + if (st->info->num_channels > 1) {
Isn't this an exact check the for-loop performs the first?
> + for (int i = 1; i < st->info->num_channels; i++) {
Why is 'i' signed? And why not name it 'ch'?
> + st->spi[i] = devm_spi_new_ancillary_device(spi,
> + spi_get_chipselect(spi, i));
> + if (IS_ERR(st->spi[i]))
> + return dev_err_probe(dev, PTR_ERR(st->spi[i]),
> + "failed to register ancillary device\n");
> +
> + st->regmap[i] = devm_regmap_init_spi(st->spi[i],
> + &ad4080_regmap_config);
> + if (IS_ERR(st->regmap[i]))
> + return PTR_ERR(st->regmap[i]);
> + }
> + }
...
> + /* Get backends for all channels */
> + for (ch = 0; ch < st->info->num_channels; ch++) {
for (unsigned int ch = 0; ch < st->info->num_channels; ch++) {
?
> + st->back[ch] = devm_iio_backend_get_by_index(dev, ch);
> + if (IS_ERR(st->back[ch]))
> + return PTR_ERR(st->back[ch]);
>
> + ret = devm_iio_backend_enable(dev, st->back[ch]);
> + if (ret)
> + return ret;
> + }
--
With Best Regards,
Andy Shevchenko