Hi, noticed just one possible issue here, see below. On 13.01.2025 15:00, David Lechner wrote: > Add support for SPI offload to the ad4695 driver. SPI offload allows > sampling data at the max sample rate (500kSPS or 1MSPS). > > This is developed and tested against the ADI example FPGA design for > this family of ADCs [1]. > > [1]: http://analogdevicesinc.github.io/hdl/projects/ad469x_fmc/index.html > > Reviewed-by: Jonathan Cameron <Jonathan.Cameron@xxxxxxxxxx> > Reviewed-by: Nuno Sa <nuno.sa@xxxxxxxxxx> > Signed-off-by: David Lechner <dlechner@xxxxxxxxxxxx> > --- > > v7 changes: none > > v6 changes: > * Fixed use of c++ style comments > * Moved static const struct definition out of probe function > * Changes bits_per_word to always be 19 for future oversampling > compatibility (Trevor is working on implementing oversampling support > on top of this patch, so we have high confidence this is the correct > thing to do) > * Fixed wrong xfer->len > > v5 changes: > * Register SCLK speed handling has been split out into a separate series. > * Add sampling_frequency_available attribute. > * Limit max allowed sampling frequency based on chip info. > * Expand explanations of offload enable/disable ordering requirements. > * Finish TODO to use macros for phandle arg values. > * Don't use dev_info() when falling back to non-offload operation. > * Update to accommodate changes in other patches in this series. > > v4 changes: new patch in v4 > --- > drivers/iio/adc/Kconfig | 1 + > drivers/iio/adc/ad4695.c | 445 +++++++++++++++++++++++++++++++++++++++++++++-- > 2 files changed, 429 insertions(+), 17 deletions(-) > > diff --git a/drivers/iio/adc/Kconfig b/drivers/iio/adc/Kconfig > index 995b9cacbaa964d26424346120c139858f93cdcd..ec60b64c46e187e2be18ab1f8ca9e6f4f03299f9 100644 > --- a/drivers/iio/adc/Kconfig > +++ b/drivers/iio/adc/Kconfig > @@ -52,6 +52,7 @@ config AD4695 > tristate "Analog Device AD4695 ADC Driver" > depends on SPI > select IIO_BUFFER > + select IIO_BUFFER_DMAENGINE > select IIO_TRIGGERED_BUFFER > select REGMAP > help > diff --git a/drivers/iio/adc/ad4695.c b/drivers/iio/adc/ad4695.c > index 13cf01d35301be40369571e7dd2aeac1a8148d15..c8cd73d19e869f11999608f61df5724d329b4427 100644 > --- a/drivers/iio/adc/ad4695.c > +++ b/drivers/iio/adc/ad4695.c > @@ -19,14 +19,19 @@ > #include <linux/device.h> > #include <linux/err.h> > #include <linux/gpio/consumer.h> > +#include <linux/iio/buffer-dmaengine.h> > #include <linux/iio/buffer.h> > #include <linux/iio/iio.h> > #include <linux/iio/triggered_buffer.h> > #include <linux/iio/trigger_consumer.h> > #include <linux/minmax.h> > +#include <linux/mutex.h> > #include <linux/property.h> > +#include <linux/pwm.h> > #include <linux/regmap.h> > #include <linux/regulator/consumer.h> > +#include <linux/spi/offload/consumer.h> > +#include <linux/spi/offload/provider.h> > #include <linux/spi/spi.h> > #include <linux/units.h> ... > +static int ad4695_offload_trigger_request(struct spi_offload_trigger *trigger, > + enum spi_offload_trigger_type type, > + u64 *args, u32 nargs) > +{ > + struct ad4695_state *st = spi_offload_trigger_get_priv(trigger); > + > + /* Should already be validated by match, but just in case. */ > + if (nargs != 2) > + return -EINVAL; > + > + /* DT tells us if BUSY event uses GP0 or GP3. */ > + if (args[1] == AD4695_TRIGGER_PIN_GP3) > + return regmap_set_bits(st->regmap, AD4695_REG_GP_MODE, > + AD4695_REG_GP_MODE_BUSY_GP_SEL); > + > + return regmap_clear_bits(st->regmap, AD4695_REG_GPIO_CTRL, > + AD4695_REG_GP_MODE_BUSY_GP_SEL); This should probably be: return regmap_clear_bits(st->regmap, AD4695_REG_GPIO_MODE, AD4695_REG_GP_MODE_BUSY_GP_SEL); > +} > + Regards, angelo