]> git.ipfire.org Git - thirdparty/kernel/stable.git/commitdiff
iio: adc: ti-adc161s626: use DMA-safe memory for spi_read()
authorDavid Lechner <dlechner@baylibre.com>
Sat, 14 Mar 2026 23:13:32 +0000 (18:13 -0500)
committerJonathan Cameron <Jonathan.Cameron@huawei.com>
Sat, 21 Mar 2026 20:45:18 +0000 (20:45 +0000)
Add a DMA-safe buffer and use it for spi_read() instead of a stack
memory. All SPI buffers must be DMA-safe.

Since we only need up to 3 bytes, we just use a u8[] instead of __be16
and __be32 and change the conversion functions appropriately.

Fixes: 4d671b71beef ("iio: adc: ti-adc161s626: add support for TI 1-channel differential ADCs")
Signed-off-by: David Lechner <dlechner@baylibre.com>
Reviewed-by: Andy Shevchenko <andriy.shevchenko@intel.com>
Cc: <Stable@vger.kernel.org>
Signed-off-by: Jonathan Cameron <Jonathan.Cameron@huawei.com>
drivers/iio/adc/ti-adc161s626.c

index 42968d96572b4c94880646c9ca0830676730567e..be1cc2e77862b82a0802d4814856307d0a14e711 100644 (file)
@@ -15,6 +15,7 @@
 #include <linux/init.h>
 #include <linux/err.h>
 #include <linux/spi/spi.h>
+#include <linux/unaligned.h>
 #include <linux/iio/iio.h>
 #include <linux/iio/trigger.h>
 #include <linux/iio/buffer.h>
@@ -70,6 +71,7 @@ struct ti_adc_data {
 
        u8 read_size;
        u8 shift;
+       u8 buf[3] __aligned(IIO_DMA_MINALIGN);
 };
 
 static int ti_adc_read_measurement(struct ti_adc_data *data,
@@ -78,26 +80,20 @@ static int ti_adc_read_measurement(struct ti_adc_data *data,
        int ret;
 
        switch (data->read_size) {
-       case 2: {
-               __be16 buf;
-
-               ret = spi_read(data->spi, (void *) &buf, 2);
+       case 2:
+               ret = spi_read(data->spi, data->buf, 2);
                if (ret)
                        return ret;
 
-               *val = be16_to_cpu(buf);
+               *val = get_unaligned_be16(data->buf);
                break;
-       }
-       case 3: {
-               __be32 buf;
-
-               ret = spi_read(data->spi, (void *) &buf, 3);
+       case 3:
+               ret = spi_read(data->spi, data->buf, 3);
                if (ret)
                        return ret;
 
-               *val = be32_to_cpu(buf) >> 8;
+               *val = get_unaligned_be24(data->buf);
                break;
-       }
        default:
                return -EINVAL;
        }