iio: adc: rockchip_saradc: do not use internal iio_dev lock
authorNuno Sá <nuno.sa@analog.com>
Tue, 4 Oct 2022 13:49:00 +0000 (15:49 +0200)
committerJonathan Cameron <Jonathan.Cameron@huawei.com>
Wed, 23 Nov 2022 19:43:58 +0000 (19:43 +0000)
The iio_device lock is only meant for internal use. Hence define a
device local lock to protect against concurrent accesses.

While at it, properly include "mutex.h" for mutex related APIs.

Signed-off-by: Nuno Sá <nuno.sa@analog.com>
Acked-by: Heiko Stuebner <heiko@sntech.de>
Link: https://lore.kernel.org/r/20221004134909.1692021-8-nuno.sa@analog.com
Signed-off-by: Jonathan Cameron <Jonathan.Cameron@huawei.com>
drivers/iio/adc/rockchip_saradc.c

index b87ea7148b5869692a01158325022cb3dfebb360..79448c5ffc2ae2d4306026dd879e978a4f709214 100644 (file)
@@ -5,6 +5,7 @@
  */
 
 #include <linux/module.h>
+#include <linux/mutex.h>
 #include <linux/platform_device.h>
 #include <linux/interrupt.h>
 #include <linux/io.h>
@@ -49,6 +50,8 @@ struct rockchip_saradc {
        struct clk              *clk;
        struct completion       completion;
        struct regulator        *vref;
+       /* lock to protect against multiple access to the device */
+       struct mutex            lock;
        int                     uv_vref;
        struct reset_control    *reset;
        const struct rockchip_saradc_data *data;
@@ -94,17 +97,17 @@ static int rockchip_saradc_read_raw(struct iio_dev *indio_dev,
 
        switch (mask) {
        case IIO_CHAN_INFO_RAW:
-               mutex_lock(&indio_dev->mlock);
+               mutex_lock(&info->lock);
 
                ret = rockchip_saradc_conversion(info, chan);
                if (ret) {
                        rockchip_saradc_power_down(info);
-                       mutex_unlock(&indio_dev->mlock);
+                       mutex_unlock(&info->lock);
                        return ret;
                }
 
                *val = info->last_val;
-               mutex_unlock(&indio_dev->mlock);
+               mutex_unlock(&info->lock);
                return IIO_VAL_INT;
        case IIO_CHAN_INFO_SCALE:
                *val = info->uv_vref / 1000;
@@ -270,7 +273,7 @@ static irqreturn_t rockchip_saradc_trigger_handler(int irq, void *p)
        int ret;
        int i, j = 0;
 
-       mutex_lock(&i_dev->mlock);
+       mutex_lock(&info->lock);
 
        for_each_set_bit(i, i_dev->active_scan_mask, i_dev->masklength) {
                const struct iio_chan_spec *chan = &i_dev->channels[i];
@@ -287,7 +290,7 @@ static irqreturn_t rockchip_saradc_trigger_handler(int irq, void *p)
 
        iio_push_to_buffers_with_timestamp(i_dev, &data, iio_get_time_ns(i_dev));
 out:
-       mutex_unlock(&i_dev->mlock);
+       mutex_unlock(&info->lock);
 
        iio_trigger_notify_done(i_dev->trig);
 
@@ -478,6 +481,8 @@ static int rockchip_saradc_probe(struct platform_device *pdev)
        if (ret)
                return ret;
 
+       mutex_init(&info->lock);
+
        return devm_iio_device_register(&pdev->dev, indio_dev);
 }