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! ~~
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.