]> git.ipfire.org Git - thirdparty/kernel/stable.git/commitdiff
iio: adc: ti-ads7950: use iio_push_to_buffers_with_ts_unaligned()
authorDavid Lechner <dlechner@baylibre.com>
Sat, 14 Mar 2026 21:12:24 +0000 (16:12 -0500)
committerJonathan Cameron <Jonathan.Cameron@huawei.com>
Sat, 21 Mar 2026 21:03:36 +0000 (21:03 +0000)
Use iio_push_to_buffers_with_ts_unaligned() to avoid unaligned access
when writing the timestamp in the rx_buf.

The previous implementation would have been fine on architectures that
support 4-byte alignment of 64-bit integers but could cause issues on
architectures that require 8-byte alignment.

Fixes: 902c4b2446d4 ("iio: adc: New driver for TI ADS7950 chips")
Signed-off-by: David Lechner <dlechner@baylibre.com>
Cc: <Stable@vger.kernel.org>
Signed-off-by: Jonathan Cameron <Jonathan.Cameron@huawei.com>
drivers/iio/adc/ti-ads7950.c

index fa3b446495ecd655148481277cab494817c9ee70..4e9359b259fc6389a0c2c60ed12d5e556fc94037 100644 (file)
@@ -47,8 +47,6 @@
 #define TI_ADS7950_MAX_CHAN    16
 #define TI_ADS7950_NUM_GPIOS   4
 
-#define TI_ADS7950_TIMESTAMP_SIZE (sizeof(int64_t) / sizeof(__be16))
-
 /* val = value, dec = left shift, bits = number of bits of the mask */
 #define TI_ADS7950_EXTRACT(val, dec, bits) \
        (((val) >> (dec)) & ((1 << (bits)) - 1))
@@ -105,8 +103,7 @@ struct ti_ads7950_state {
         * DMA (thus cache coherency maintenance) may require the
         * transfer buffers to live in their own cache lines.
         */
-       u16 rx_buf[TI_ADS7950_MAX_CHAN + 2 + TI_ADS7950_TIMESTAMP_SIZE]
-               __aligned(IIO_DMA_MINALIGN);
+       u16 rx_buf[TI_ADS7950_MAX_CHAN + 2] __aligned(IIO_DMA_MINALIGN);
        u16 tx_buf[TI_ADS7950_MAX_CHAN + 2];
        u16 single_tx;
        u16 single_rx;
@@ -307,8 +304,10 @@ static irqreturn_t ti_ads7950_trigger_handler(int irq, void *p)
        if (ret < 0)
                goto out;
 
-       iio_push_to_buffers_with_timestamp(indio_dev, &st->rx_buf[2],
-                                          iio_get_time_ns(indio_dev));
+       iio_push_to_buffers_with_ts_unaligned(indio_dev, &st->rx_buf[2],
+                                             sizeof(*st->rx_buf) *
+                                             TI_ADS7950_MAX_CHAN,
+                                             iio_get_time_ns(indio_dev));
 
 out:
        mutex_unlock(&st->slock);