]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
iio: adc: ad7768-1: remove unnecessary locking
authorJonathan Santos <Jonathan.Santos@analog.com>
Thu, 6 Mar 2025 21:01:51 +0000 (18:01 -0300)
committerJonathan Cameron <Jonathan.Cameron@huawei.com>
Tue, 11 Mar 2025 19:09:16 +0000 (19:09 +0000)
The current locking is only preventing a triggered buffer Transfer and a
debugfs register access from happening at the same time. If a register
access happens during a buffered read, the action is doomed to fail anyway,
since we need to write a magic value to exit continuous read mode.

Remove locking from the trigger handler and use
iio_device_claim_direct() instead in the register access function.

Reviewed-by: David Lechner <dlechner@baylibre.com>
Signed-off-by: Jonathan Santos <Jonathan.Santos@analog.com>
Link: https://patch.msgid.link/d0450b7c5d8467e54913ef905f6147baa2b866b3.1741268122.git.Jonathan.Santos@analog.com
Signed-off-by: Jonathan Cameron <Jonathan.Cameron@huawei.com>
drivers/iio/adc/ad7768-1.c

index a75247cdcaa7bf0deeeb33f27bb4fbb79c204af5..5a863005aca6d1082b91a52655eaaa83c6871151 100644 (file)
@@ -154,7 +154,6 @@ static const struct iio_chan_spec ad7768_channels[] = {
 struct ad7768_state {
        struct spi_device *spi;
        struct regulator *vref;
-       struct mutex lock;
        struct clk *mclk;
        unsigned int mclk_freq;
        unsigned int samp_freq;
@@ -256,18 +255,20 @@ static int ad7768_reg_access(struct iio_dev *indio_dev,
        struct ad7768_state *st = iio_priv(indio_dev);
        int ret;
 
-       mutex_lock(&st->lock);
+       if (!iio_device_claim_direct(indio_dev))
+               return -EBUSY;
+
        if (readval) {
                ret = ad7768_spi_reg_read(st, reg, 1);
                if (ret < 0)
-                       goto err_unlock;
+                       goto err_release;
                *readval = ret;
                ret = 0;
        } else {
                ret = ad7768_spi_reg_write(st, reg, writeval);
        }
-err_unlock:
-       mutex_unlock(&st->lock);
+err_release:
+       iio_device_release_direct(indio_dev);
 
        return ret;
 }
@@ -469,18 +470,15 @@ static irqreturn_t ad7768_trigger_handler(int irq, void *p)
        struct ad7768_state *st = iio_priv(indio_dev);
        int ret;
 
-       mutex_lock(&st->lock);
-
        ret = spi_read(st->spi, &st->data.scan.chan, 3);
        if (ret < 0)
-               goto err_unlock;
+               goto out;
 
        iio_push_to_buffers_with_timestamp(indio_dev, &st->data.scan,
                                           iio_get_time_ns(indio_dev));
 
-err_unlock:
+out:
        iio_trigger_notify_done(indio_dev->trig);
-       mutex_unlock(&st->lock);
 
        return IRQ_HANDLED;
 }
@@ -609,8 +607,6 @@ static int ad7768_probe(struct spi_device *spi)
 
        st->mclk_freq = clk_get_rate(st->mclk);
 
-       mutex_init(&st->lock);
-
        indio_dev->channels = ad7768_channels;
        indio_dev->num_channels = ARRAY_SIZE(ad7768_channels);
        indio_dev->name = spi_get_device_id(spi)->name;