Re: [PATCH v8 3/6] iio: adc: ad4691: add triggered buffer support

Jonathan Cameron
2026-04-25T17:50:42Z

On Thu, 16 Apr 2026 12:18:48 +0300
Radu Sabau via B4 Relay <devnull+radu.sabau.analog.com@kernel.org> wrote:

> From: Radu Sabau <radu.sabau@analog.com>
>
> Add buffered capture support using the IIO triggered buffer framework.
>
> CNV Burst Mode: the GP pin identified by interrupt-names in the device
> tree is configured as DATA_READY output. The IRQ handler stops
> conversions and fires the IIO trigger; the trigger handler executes a
> pre-built SPI message that reads all active channels from the AVG_IN
> accumulator registers and then resets accumulator state and restarts
> conversions for the next cycle.
>
> Manual Mode: CNV is tied to SPI CS so each transfer simultaneously
> reads the previous result and starts the next conversion (pipelined
> N+1 scheme). At preenable time a pre-built, optimised SPI message of
> N+1 transfers is constructed (N channel reads plus one NOOP to drain
> the pipeline). The trigger handler executes the message in a single
> spi_sync() call and collects the results. An external trigger (e.g.
> iio-trig-hrtimer) is required to drive the trigger at the desired
> sample rate.
>
> Both modes share the same trigger handler and push a complete scan —
> one u16 slot per channel at its scan_index position, followed by a
> timestamp — to the IIO buffer via iio_push_to_buffers_with_ts().
>
> The CNV Burst Mode sampling frequency (PWM period) is exposed as a
> buffer-level attribute via IIO_DEVICE_ATTR.
>
> Signed-off-by: Radu Sabau <radu.sabau@analog.com>
Hi Radu,

A couple of comments inline, but only for things to change
if you end up doing a v9 for other reasons.

thanks,

Jonathan

> ---
> drivers/iio/adc/Kconfig | 2 +
> drivers/iio/adc/ad4691.c | 537 +++++++++++++++++++++++++++++++++++++++++++++--
> 2 files changed, 524 insertions(+), 15 deletions(-)
>
> diff --git a/drivers/iio/adc/Kconfig b/drivers/iio/adc/Kconfig
> index 3685a03aa8dc..d498f16c0816 100644
> --- a/drivers/iio/adc/Kconfig
> +++ b/drivers/iio/adc/Kconfig

> @@ -84,19 +104,23 @@ enum ad4691_ref_ctrl {
> AD4691_VREF_5P0 = 4,
> };
>
> -struct ad4691_chip_info {
> +struct ad4691_channel_info {
> const struct iio_chan_spec *channels;

We could mark this __counted_by_ptr() but that's new so no drivers
are doing so yet. At somepoint I'll have a look at whether it's
worth pushing it into existing drivers and if it is do this
one at that time. If you are respinning for other reasons though
then nice to have.

> - const char *name;
> unsigned int num_channels;
> +};
> +
> +struct ad4691_chip_info {
> + const char *name;
> unsigned int max_rate;
> + const struct ad4691_channel_info *sw_info;
> };
I'm not going to ask you to respin just for this, but it would have
been neater to push this factoring out of channels + num_channels
into the previous patch.