]> git.ipfire.org Git - thirdparty/linux.git/commitdiff
iio: light: vcnl4035: fix scan buffer on big-endian
authorDavid Lechner <dlechner@baylibre.com>
Sat, 14 Mar 2026 22:18:10 +0000 (17:18 -0500)
committerJonathan Cameron <Jonathan.Cameron@huawei.com>
Sat, 21 Mar 2026 20:59:50 +0000 (20:59 +0000)
Rework vcnl4035_trigger_consumer_handler() so that we are not passing
what should be a u16 value as an int * to regmap_read(). This won't
work on bit endian systems.

Instead, add a new unsigned int variable to pass to regmap_read(). Then
copy that value into the buffer struct.

The buffer array is replaced with a struct since there is only one value
being read. This allows us to use the correct u16 data type and has a
side-effect of simplifying the alignment specification.

Also fix the endianness of the scan format from little-endian to CPU
endianness. Since we are using regmap to read the value, it will be
CPU-endian.

Fixes: 55707294c4eb ("iio: light: Add support for vishay vcnl4035")
Signed-off-by: David Lechner <dlechner@baylibre.com>
Cc: <Stable@vger.kernel.org>
Signed-off-by: Jonathan Cameron <Jonathan.Cameron@huawei.com>
drivers/iio/light/vcnl4035.c

index 963747927425f7c525eabc512f71ce2885cbc561..16aeb17067bc0c75d1441edefa79c8b0ec6e8f66 100644 (file)
@@ -103,17 +103,23 @@ static irqreturn_t vcnl4035_trigger_consumer_handler(int irq, void *p)
        struct iio_dev *indio_dev = pf->indio_dev;
        struct vcnl4035_data *data = iio_priv(indio_dev);
        /* Ensure naturally aligned timestamp */
-       u8 buffer[ALIGN(sizeof(u16), sizeof(s64)) + sizeof(s64)]  __aligned(8) = { };
+       struct {
+               u16 als_data;
+               aligned_s64 timestamp;
+       } buffer = { };
+       unsigned int val;
        int ret;
 
-       ret = regmap_read(data->regmap, VCNL4035_ALS_DATA, (int *)buffer);
+       ret = regmap_read(data->regmap, VCNL4035_ALS_DATA, &val);
        if (ret < 0) {
                dev_err(&data->client->dev,
                        "Trigger consumer can't read from sensor.\n");
                goto fail_read;
        }
-       iio_push_to_buffers_with_timestamp(indio_dev, buffer,
-                                       iio_get_time_ns(indio_dev));
+
+       buffer.als_data = val;
+       iio_push_to_buffers_with_timestamp(indio_dev, &buffer,
+                                          iio_get_time_ns(indio_dev));
 
 fail_read:
        iio_trigger_notify_done(indio_dev->trig);
@@ -381,7 +387,7 @@ static const struct iio_chan_spec vcnl4035_channels[] = {
                        .sign = 'u',
                        .realbits = 16,
                        .storagebits = 16,
-                       .endianness = IIO_LE,
+                       .endianness = IIO_CPU,
                },
        },
        {
@@ -395,7 +401,7 @@ static const struct iio_chan_spec vcnl4035_channels[] = {
                        .sign = 'u',
                        .realbits = 16,
                        .storagebits = 16,
-                       .endianness = IIO_LE,
+                       .endianness = IIO_CPU,
                },
        },
 };