Re: [PATCH v6 5/8] iio: imu: Add driver for the ADI ADIS16607

From: Jonathan Cameron

Date: Fri Nov 13 2026 - 19:53:16 EST


On Fri, 13 Nov 2026 14:33:35 +0200
Radu Sabau via B4 Relay <devnull+radu.sabau.analog.com@xxxxxxxxxx> wrote:

> From: Radu Sabau <radu.sabau@xxxxxxxxxx>
>
> The ADIS16607 is a Precision MEMS IMU from Analog Devices with
> triaxial gyroscope and accelerometer, delta angle/velocity, and
> temperature channels, communicating over a custom SPI Half-Duplex
> protocol. ADIS16607-2 has a ±450°/s gyroscope range, ADIS16607-3
> ±2000°/s; both share a ±40g accelerometer range and an 8 kHz internal
> clock.
>
> This is the base driver: probe, raw channel reads, sampling-frequency
> control, startup/self-test via adislib, and debugfs identity entries.
> No buffered capture, external clock sync, or calibration bias yet -
> those follow in later patches.
>
> Self-test leaves the device's SELF_TEST register cleared on every exit
> path, not just on success, so a read failure or a failed delta check
> doesn't leave the sensor stuck in its self-test/force state until the
> next reset.
>
> Signed-off-by: Radu Sabau <radu.sabau@xxxxxxxxxx>


The chan_spec in here includes buffer related stuff (scan index and
the channel type bit) + the timestamp channel in general. That should
all have been introduced in the next patch. Thus feedback on that
patch isn't contained and I've dropped this one for now.


> diff --git a/drivers/iio/imu/adis16607.c b/drivers/iio/imu/adis16607.c
> new file mode 100644
> index 000000000000..f5dc37c54191
> --- /dev/null
> +++ b/drivers/iio/imu/adis16607.c

> +/*
> + * .address indexes adis16607_chan_regs[], .scan_index is the buffer position;
> + * both come from the same enum today but are separate fields on purpose.
> + */
> +#define ADIS16607_MOD_CHAN(_type, _mod, _idx) \
> + { \
> + .type = (_type), \
> + .modified = 1, \
> + .channel2 = (_mod), \
> + .info_mask_separate = BIT(IIO_CHAN_INFO_RAW), \
> + .info_mask_shared_by_type = BIT(IIO_CHAN_INFO_SCALE), \
> + .info_mask_shared_by_all = BIT(IIO_CHAN_INFO_SAMP_FREQ), \
> + .address = (_idx), \
> + .scan_index = (_idx), \
> + .scan_type = { \
> + .sign = 's', \
> + .realbits = 24, \
> + .storagebits = 32, \
> + .endianness = IIO_BE, \
> + }, \
> + }
> +
> +#define ADIS16607_ACCEL_CHANNEL(_mod) \
> + ADIS16607_MOD_CHAN(IIO_ACCEL, IIO_MOD_ ## _mod, \
> + ADIS16607_SCAN_ACCEL_ ## _mod)
> +
> +#define ADIS16607_GYRO_CHANNEL(_mod) \
> + ADIS16607_MOD_CHAN(IIO_ANGL_VEL, IIO_MOD_ ## _mod, \
> + ADIS16607_SCAN_GYRO_ ## _mod)
> +
> +#define ADIS16607_MOD_CHAN_DELTA(_type, _mod, _idx) \
> + { \
> + .type = (_type), \
> + .modified = 1, \
> + .channel2 = (_mod), \
> + .info_mask_separate = BIT(IIO_CHAN_INFO_RAW), \
> + .info_mask_shared_by_type = BIT(IIO_CHAN_INFO_SCALE), \
> + .info_mask_shared_by_all = BIT(IIO_CHAN_INFO_SAMP_FREQ), \
> + .address = (_idx), \
> + .scan_index = (_idx), \
> + .scan_type = { \
> + .sign = 's', \
> + .realbits = 24, \
> + .storagebits = 32, \
> + .endianness = IIO_BE, \
> + }, \
> + }
> +
> +#define ADIS16607_DELTANG_CHAN(_mod) \
> + ADIS16607_MOD_CHAN_DELTA(IIO_DELTA_ANGL, IIO_MOD_ ## _mod, \
> + ADIS16607_SCAN_DELTANG_ ## _mod)
> +
> +#define ADIS16607_DELTVEL_CHAN(_mod) \
> + ADIS16607_MOD_CHAN_DELTA(IIO_DELTA_VELOCITY, IIO_MOD_ ## _mod, \
> + ADIS16607_SCAN_DELTVEL_ ## _mod)
> +
> +static const struct iio_chan_spec adis16607_channels[] = {
> + ADIS16607_ACCEL_CHANNEL(X),
> + ADIS16607_ACCEL_CHANNEL(Y),
> + ADIS16607_ACCEL_CHANNEL(Z),
> + ADIS16607_GYRO_CHANNEL(X),
> + ADIS16607_GYRO_CHANNEL(Y),
> + ADIS16607_GYRO_CHANNEL(Z),
> + ADIS16607_DELTVEL_CHAN(X),
> + ADIS16607_DELTVEL_CHAN(Y),
> + ADIS16607_DELTVEL_CHAN(Z),
> + ADIS16607_DELTANG_CHAN(X),
> + ADIS16607_DELTANG_CHAN(Y),
> + ADIS16607_DELTANG_CHAN(Z),
> + {
> + .type = IIO_TEMP,
> + .indexed = 1,
> + .channel = 0,
> + .info_mask_separate = BIT(IIO_CHAN_INFO_RAW) |
> + BIT(IIO_CHAN_INFO_SCALE) |
> + BIT(IIO_CHAN_INFO_OFFSET),
> + .info_mask_shared_by_all = BIT(IIO_CHAN_INFO_SAMP_FREQ),
> + .address = ADIS16607_SCAN_TEMP,
> + .scan_index = ADIS16607_SCAN_TEMP,
> + .scan_type = {
> + .sign = 's',
> + .realbits = 16,
> + .storagebits = 16,
> + .endianness = IIO_BE,
> + },
> + },
> + IIO_CHAN_SOFT_TIMESTAMP(ADIS16607_SCAN_MAX),

Should not be here and the channels above should not 'yet' hvae
scan_type or scan_index. Those belong in the patch adding buffered support.


> +};