]> www.infradead.org Git - users/hch/misc.git/commitdiff
iio: amplifiers: ada4250: use DMA-safe memory for regmap_bulk_read()
authorDavid Lechner <dlechner@baylibre.com>
Fri, 18 Apr 2025 18:16:13 +0000 (13:16 -0500)
committerJonathan Cameron <Jonathan.Cameron@huawei.com>
Mon, 9 Jun 2025 06:45:35 +0000 (07:45 +0100)
Use DMA-safe memory instead of stack-allocated memory for the call to
regmap_bulk_read() in the ada4250_init() function as this could be used
directly by a SPI controller.

Also remove unnecessary use of get_unaligned_le16() and explicitly
include linux/types.h e.g. for __le16 while we are fixing this up.

Note this is DMA issue does not appear to be an actual bug due to
internals of the regmap SPI implementation.  However, for IIO we are
following guidance that we should not make that assumption.

Signed-off-by: David Lechner <dlechner@baylibre.com>
Link: https://patch.msgid.link/20250418-iio-amplifiers-ada4250-simplify-data-buffer-in-init-v1-1-7e7bd6dad423@baylibre.com
Signed-off-by: Jonathan Cameron <Jonathan.Cameron@huawei.com>
drivers/iio/amplifiers/ada4250.c

index 74f8429d652b17b4d1f38366e23ce6a2b3e9b218..f81438460aa51ce30f8f605c60ee5be5c8c251d3 100644 (file)
@@ -13,8 +13,7 @@
 #include <linux/regmap.h>
 #include <linux/regulator/consumer.h>
 #include <linux/spi/spi.h>
-
-#include <linux/unaligned.h>
+#include <linux/types.h>
 
 /* ADA4250 Register Map */
 #define ADA4250_REG_GAIN_MUX        0x00
@@ -63,6 +62,7 @@ struct ada4250_state {
        u8                      gain;
        int                     offset_uv;
        bool                    refbuf_en;
+       __le16                  reg_val_16 __aligned(IIO_DMA_MINALIGN);
 };
 
 /* ADA4250 Current Bias Source Settings: Disabled, Bandgap Reference, AVDD */
@@ -301,7 +301,6 @@ static int ada4250_init(struct ada4250_state *st)
 {
        int ret;
        u16 chip_id;
-       u8 data[2] __aligned(8) = {};
        struct spi_device *spi = st->spi;
 
        st->refbuf_en = device_property_read_bool(&spi->dev, "adi,refbuf-enable");
@@ -326,11 +325,12 @@ static int ada4250_init(struct ada4250_state *st)
        if (ret)
                return ret;
 
-       ret = regmap_bulk_read(st->regmap, ADA4250_REG_CHIP_ID, data, 2);
+       ret = regmap_bulk_read(st->regmap, ADA4250_REG_CHIP_ID, &st->reg_val_16,
+                              sizeof(st->reg_val_16));
        if (ret)
                return ret;
 
-       chip_id = get_unaligned_le16(data);
+       chip_id = le16_to_cpu(st->reg_val_16);
 
        if (chip_id != ADA4250_CHIP_ID) {
                dev_err(&spi->dev, "Invalid chip ID.\n");