* [PATCH v3 1/2] iio: accel: kionix-kx022a: use scan struct for one-shot and trigger reads
2026-08-19 10:37 [PATCH v3 0/2] iio: accel: kionix-kx022a: unify staging buffer and convert to iio_push_to_buffers_with_ts() Gabriel Rondon
@ 2026-08-19 10:37 ` Gabriel Rondon
2026-08-19 10:37 ` [PATCH v3 2/2] iio: accel: kionix-kx022a: use iio_push_to_buffers_with_ts() Gabriel Rondon
1 sibling, 0 replies; 3+ messages in thread
From: Gabriel Rondon @ 2026-08-19 10:37 UTC (permalink / raw)
To: Matti Vaittinen, Jonathan Cameron
Cc: David Lechner, Nuno Sá, Andy Shevchenko, linux-iio,
linux-kernel
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.
Suggested-by: Jonathan Cameron <jic23@kernel.org>
Signed-off-by: Gabriel Rondon <grondon@gmail.com>
Reviewed-by: Matti Vaittinen <mazziesaccount@gmail.com>
Reviewed-by: Andy Shevchenko <andriy.shevchenko@intel.com>
---
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..93104fdc74b5 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 *
@@ -611,14 +610,14 @@ static int kx022a_get_axis(struct kx022a_data *data,
struct iio_chan_spec const *chan,
int *val)
{
+ __le16 *buf = &data->scan.channels[0];
int ret;
- ret = regmap_bulk_read(data->regmap, chan->address, &data->buffer[0],
- sizeof(__le16));
+ ret = regmap_bulk_read(data->regmap, chan->address, buf, sizeof(*buf));
if (ret)
return ret;
- *val = (s16)le16_to_cpu(data->buffer[0]);
+ *val = (s16)le16_to_cpup(buf);
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)
^ permalink raw reply related [flat|nested] 3+ messages in thread* [PATCH v3 2/2] iio: accel: kionix-kx022a: use iio_push_to_buffers_with_ts()
2026-08-19 10:37 [PATCH v3 0/2] iio: accel: kionix-kx022a: unify staging buffer and convert to iio_push_to_buffers_with_ts() Gabriel Rondon
2026-08-19 10:37 ` [PATCH v3 1/2] iio: accel: kionix-kx022a: use scan struct for one-shot and trigger reads Gabriel Rondon
@ 2026-08-19 10:37 ` Gabriel Rondon
1 sibling, 0 replies; 3+ messages in thread
From: Gabriel Rondon @ 2026-08-19 10:37 UTC (permalink / raw)
To: Matti Vaittinen, Jonathan Cameron
Cc: David Lechner, Nuno Sá, Andy Shevchenko, linux-iio,
linux-kernel
Replace the deprecated iio_push_to_buffers_with_timestamp() with
iio_push_to_buffers_with_ts(), which takes and checks the buffer size.
Both sites push data->scan, so pass its size.
Signed-off-by: Gabriel Rondon <grondon@gmail.com>
Reviewed-by: Matti Vaittinen <mazziesaccount@gmail.com>
Reviewed-by: Andy Shevchenko <andriy.shevchenko@intel.com>
---
drivers/iio/accel/kionix-kx022a.c | 6 ++++--
1 file changed, 4 insertions(+), 2 deletions(-)
diff --git a/drivers/iio/accel/kionix-kx022a.c b/drivers/iio/accel/kionix-kx022a.c
index 93104fdc74b5..06ae7e540ee6 100644
--- a/drivers/iio/accel/kionix-kx022a.c
+++ b/drivers/iio/accel/kionix-kx022a.c
@@ -863,7 +863,8 @@ static int __kx022a_fifo_flush(struct iio_dev *idev, unsigned int samples,
for_each_set_bit(bit, idev->active_scan_mask, AXIS_MAX)
chs[bit] = sam[bit];
- iio_push_to_buffers_with_timestamp(idev, &data->scan, tstamp);
+ iio_push_to_buffers_with_ts(idev, &data->scan,
+ sizeof(data->scan), tstamp);
tstamp += sample_period;
}
@@ -1033,7 +1034,8 @@ static irqreturn_t kx022a_trigger_handler(int irq, void *p)
if (ret < 0)
goto err_read;
- iio_push_to_buffers_with_timestamp(idev, &data->scan, data->timestamp);
+ iio_push_to_buffers_with_ts(idev, &data->scan, sizeof(data->scan),
+ data->timestamp);
err_read:
iio_trigger_notify_done(idev->trig);
--
2.50.1 (Apple Git-155)
^ permalink raw reply related [flat|nested] 3+ messages in thread