[PATCH v2 1/2] iio: accel: kionix-kx022a: use scan struct for one-shot and trigger reads

From: Gabriel Rondon

Date: Tue Aug 18 2026 - 17:54:26 EST


The driver kept two separate staging areas that hold the same thing:
buffer[8], a DMA-aligned area used by the one-shot read in
kx022a_get_axis() and by the triggered handler, and the scan struct,
used by the FIFO flush path. Both are three __le16 channels plus room
for the timestamp.

Drop buffer and route the one-shot read and the triggered handler
through scan.channels, so the driver has a single staging area. Move the
IIO_DMA_MINALIGN alignment onto scan, since it now backs the regmap bulk
reads that buffer used to.

No functional change. get_axis() only runs via read_raw() under
iio_device_claim_direct(), so it cannot run while the triggered buffer is
active, and the triggered handler only runs while it is; the two never
touch scan concurrently, exactly as they previously shared buffer.

Signed-off-by: Gabriel Rondon <grondon@xxxxxxxxx>
---
drivers/iio/accel/kionix-kx022a.c | 15 +++++++--------
1 file changed, 7 insertions(+), 8 deletions(-)

diff --git a/drivers/iio/accel/kionix-kx022a.c b/drivers/iio/accel/kionix-kx022a.c
index 02dd1db7a646..cf2cb751b4e8 100644
--- a/drivers/iio/accel/kionix-kx022a.c
+++ b/drivers/iio/accel/kionix-kx022a.c
@@ -301,11 +301,10 @@ struct kx022a_data {
__le16 *fifo_buffer;

/* 3 x 16bit accel data + timestamp */
- __le16 buffer[8] __aligned(IIO_DMA_MINALIGN);
struct {
__le16 channels[3];
aligned_s64 ts;
- } scan;
+ } scan __aligned(IIO_DMA_MINALIGN);
};

static const struct iio_mount_matrix *
@@ -613,12 +612,12 @@ static int kx022a_get_axis(struct kx022a_data *data,
{
int ret;

- ret = regmap_bulk_read(data->regmap, chan->address, &data->buffer[0],
- sizeof(__le16));
+ ret = regmap_bulk_read(data->regmap, chan->address,
+ &data->scan.channels[0], sizeof(__le16));
if (ret)
return ret;

- *val = (s16)le16_to_cpu(data->buffer[0]);
+ *val = (s16)le16_to_cpu(data->scan.channels[0]);

return IIO_VAL_INT;
}
@@ -1029,12 +1028,12 @@ static irqreturn_t kx022a_trigger_handler(int irq, void *p)
struct kx022a_data *data = iio_priv(idev);
int ret;

- ret = regmap_bulk_read(data->regmap, data->chip_info->xout_l, data->buffer,
- KX022A_FIFO_SAMPLES_SIZE_BYTES);
+ ret = regmap_bulk_read(data->regmap, data->chip_info->xout_l,
+ data->scan.channels, KX022A_FIFO_SAMPLES_SIZE_BYTES);
if (ret < 0)
goto err_read;

- iio_push_to_buffers_with_timestamp(idev, data->buffer, data->timestamp);
+ iio_push_to_buffers_with_timestamp(idev, &data->scan, data->timestamp);
err_read:
iio_trigger_notify_done(idev->trig);

--
2.50.1 (Apple Git-155)