]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
iio: adc: ad799x: use a static buffer for scan data
authorArchit Anant <architanant5@gmail.com>
Sun, 12 Apr 2026 09:37:37 +0000 (15:07 +0530)
committerJonathan Cameron <jic23@kernel.org>
Mon, 27 Apr 2026 08:58:21 +0000 (09:58 +0100)
Currently, rx_buf is dynamically allocated using kmalloc() every time
ad799x_update_scan_mode() is called. This can lead to memory leaks if
the scan mask is updated multiple times.

Drop the dynamic allocation and replace it with a static buffer at the
end of the state structure using IIO_DECLARE_BUFFER_WITH_TS().
This eliminates the allocation overhead, prevents leaks, and removes
the need for manual kfree() on driver removal.

Suggested-by: David Lechner <dlechner@baylibre.com>
Reviewed-by: David Lechner <dlechner@baylibre.com>
Signed-off-by: Archit Anant <architanant5@gmail.com>
Reviewed-by: Andy Shevchenko <andriy.shevchenko@intel.com>
Signed-off-by: Jonathan Cameron <jic23@kernel.org>
drivers/iio/adc/ad799x.c

index bf0575585a59bba7d3b436ab1681514d8369cf90..d8389b6e19b5567d60b7d39be9acaf0cb2f47184 100644 (file)
@@ -39,6 +39,7 @@
 #include <linux/iio/triggered_buffer.h>
 
 #define AD799X_CHANNEL_SHIFT                   4
+#define AD799X_MAX_CHANNELS                    8
 
 /*
  * AD7991, AD7995 and AD7999 defines
@@ -133,8 +134,8 @@ struct ad799x_state {
        unsigned int                    id;
        u16                             config;
 
-       u8                              *rx_buf;
        unsigned int                    transfer_size;
+       IIO_DECLARE_BUFFER_WITH_TS(__be16, rx_buf, AD799X_MAX_CHANNELS);
 };
 
 static int ad799x_write_config(struct ad799x_state *st, u16 val)
@@ -217,7 +218,8 @@ static irqreturn_t ad799x_trigger_handler(int irq, void *p)
        }
 
        b_sent = i2c_smbus_read_i2c_block_data(st->client,
-                       cmd, st->transfer_size, st->rx_buf);
+                                               cmd, st->transfer_size,
+                                               (u8 *)st->rx_buf);
        if (b_sent < 0)
                goto out;
 
@@ -234,11 +236,6 @@ static int ad799x_update_scan_mode(struct iio_dev *indio_dev,
 {
        struct ad799x_state *st = iio_priv(indio_dev);
 
-       kfree(st->rx_buf);
-       st->rx_buf = kmalloc(indio_dev->scan_bytes, GFP_KERNEL);
-       if (!st->rx_buf)
-               return -ENOMEM;
-
        st->transfer_size = bitmap_weight(scan_mask,
                                          iio_get_masklength(indio_dev)) * 2;
 
@@ -896,7 +893,6 @@ static void ad799x_remove(struct i2c_client *client)
        if (st->vref)
                regulator_disable(st->vref);
        regulator_disable(st->reg);
-       kfree(st->rx_buf);
 }
 
 static int ad799x_suspend(struct device *dev)