Re: [PATCH v4 3/4] iio: light: veml6031x00: add support for triggered buffers
From: Jonathan Cameron
Date: Mon Jun 01 2026 - 06:45:30 EST
On Sun, 31 May 2026 21:58:23 +0200
Javier Carrasco <javier.carrasco.cruz@xxxxxxxxx> wrote:
> Add triggered buffer functionality for the two channels the device
> provides (ALS and IR).
>
> Signed-off-by: Javier Carrasco <javier.carrasco.cruz@xxxxxxxxx>
One trivial thing from me. I think all the feedback remaining on this one
from Sashiko is false positives.
> diff --git a/drivers/iio/light/veml6031x00.c b/drivers/iio/light/veml6031x00.c
> index 6f9a7bad44d4..facb1b8e4241 100644
> --- a/drivers/iio/light/veml6031x00.c
> +++ b/drivers/iio/light/veml6031x00.c
>
> +static int veml6031x00_buffer_preenable(struct iio_dev *iio)
> +{
> + struct veml6031x00_data *data = iio_priv(iio);
> + int ret, it_usec;
> +
> + ret = pm_runtime_resume_and_get(data->dev);
> + if (ret)
> + return ret;
> +
> + ret = veml6031x00_get_it(data, &it_usec);
> + if (ret < 0) {
> + pm_runtime_put_autosuspend(data->dev);
> + return ret;
> + }
> +
> + /*
> + * Wait one integration period + 10% margin so the first triggered
> + * read does not race with the sensor completing its first conversion
> + * after power-on.
> + */
> + fsleep(it_usec + (it_usec / 10));
> +
> + return 0;
> +}
> +
> +static irqreturn_t veml6031x00_trig_handler(int irq, void *p)
> +{
> + struct iio_poll_func *pf = p;
> + struct iio_dev *iio = pf->indio_dev;
> + struct veml6031x00_data *data = iio_priv(iio);
> + int ch, ret, i = 0;
> + struct {
> + __le16 chans[2];
> + aligned_s64 timestamp;
> + } scan = { };
In case anyone wonders about the sashiko feedback, this is fine. The kernel
is carefully built with options (plus self tests) to ensure that padding is initialized
by doing this. Sashiko is correct that the C spec (until recently?) doesn't require
that to be the case.
> +
> + if (test_bit(VEML6031X00_SCAN_ALS, iio->active_scan_mask) &&
> + test_bit(VEML6031X00_SCAN_IR, iio->active_scan_mask)) {
> + ret = regmap_bulk_read(data->regmap,
> + VEML6031X00_REG_ALS_L,
> + &scan.chans, sizeof(scan.chans));
> + if (ret)
> + goto done;
> + } else {
> + iio_for_each_active_channel(iio, ch) {
> + ret = regmap_bulk_read(data->regmap,
> + iio->channels[ch].address,
> + &scan.chans[i++],
> + sizeof(*scan.chans));
> + if (ret)
> + goto done;
> + }
> + }
> +
> + iio_push_to_buffers_with_ts(iio, &scan, sizeof(scan), pf->timestamp);
> +
> +done:
> + iio_trigger_notify_done(iio->trig);
> +
> + return IRQ_HANDLED;
> +}
> +
> static int veml6031x00_validate_part_id(struct veml6031x00_data *data)
> {
> int part_id, ret;
> @@ -576,6 +683,13 @@ static int veml6031x00_probe(struct i2c_client *i2c)
> if (ret)
> return ret;
>
> + ret = devm_iio_triggered_buffer_setup(dev, iio, NULL,
> + veml6031x00_trig_handler,
> + &veml6031x00_buffer_setup_ops);
Why is this in the region in which the device is forced to be powered up?
> + if (ret)
> + return dev_err_probe(dev, ret,
> + "Failed to register triggered buffer\n");
> +
> pm_runtime_put_autosuspend(dev);
I would have thought here was fine.
>
> ret = devm_iio_device_register(dev, iio);
>