Re: [PATCH v2 1/2] iio: accel: kionix-kx022a: use scan struct for one-shot and trigger reads
Matti Vaittinen <[email protected]>
| Newsgroups | org.kernel.vger.linux-iio,org.kernel.vger.linux-kernel |
|---|---|
| Message-ID | <[email protected]> |
On 19/08/2026 00:51, Gabriel Rondon wrote: > 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 <[email protected]> Suggested-by? Other than that - looks good to me. Reviewed-by: Matti Vaittinen <[email protected]> > --- > 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); > -- Matti Vaittinen Linux kernel developer at ROHM Semiconductors Oulu Finland ~~ When things go utterly wrong vim users can always type :help! ~~