iio: adc: at91-sama5d2_adc: lock around at91_adc_read_info_raw()
authorClaudiu Beznea <claudiu.beznea@microchip.com>
Wed, 3 Aug 2022 10:28:51 +0000 (13:28 +0300)
committerJonathan Cameron <Jonathan.Cameron@huawei.com>
Mon, 15 Aug 2022 21:29:58 +0000 (22:29 +0100)
Remove iio_device_{claim, release}_direct_mode() and lock/unlock to
&st->lock from at91_adc_read_info_raw(). Instead add a wrapper around
at91_adc_read_info_raw() and do there the lock/unlock. This will allow
using the at91_adc_read_info_raw() in patch that add support for
temperature sensor.

Signed-off-by: Claudiu Beznea <claudiu.beznea@microchip.com>
Link: https://lore.kernel.org/r/20220803102855.2191070-16-claudiu.beznea@microchip.com
Signed-off-by: Jonathan Cameron <Jonathan.Cameron@huawei.com>
drivers/iio/adc/at91-sama5d2_adc.c

index fd02da9b26b2fa6583425508149e8b2d72f5e7e7..1a72e304fc3a408a0aaba6456b472fd5be559ff8 100644 (file)
@@ -1582,6 +1582,7 @@ static irqreturn_t at91_adc_interrupt(int irq, void *private)
        return IRQ_HANDLED;
 }
 
+/* This needs to be called with direct mode claimed and st->lock locked. */
 static int at91_adc_read_info_raw(struct iio_dev *indio_dev,
                                  struct iio_chan_spec const *chan, int *val)
 {
@@ -1594,45 +1595,26 @@ static int at91_adc_read_info_raw(struct iio_dev *indio_dev,
         * if external trigger is enabled
         */
        if (chan->type == IIO_POSITIONRELATIVE) {
-               ret = iio_device_claim_direct_mode(indio_dev);
-               if (ret)
-                       return ret;
-               mutex_lock(&st->lock);
-
                ret = at91_adc_read_position(st, chan->channel,
                                             &tmp_val);
                *val = tmp_val;
                if (ret > 0)
                        ret = at91_adc_adjust_val_osr(st, val);
-               mutex_unlock(&st->lock);
-               iio_device_release_direct_mode(indio_dev);
 
                return ret;
        }
        if (chan->type == IIO_PRESSURE) {
-               ret = iio_device_claim_direct_mode(indio_dev);
-               if (ret)
-                       return ret;
-               mutex_lock(&st->lock);
-
                ret = at91_adc_read_pressure(st, chan->channel,
                                             &tmp_val);
                *val = tmp_val;
                if (ret > 0)
                        ret = at91_adc_adjust_val_osr(st, val);
-               mutex_unlock(&st->lock);
-               iio_device_release_direct_mode(indio_dev);
 
                return ret;
        }
 
        /* in this case we have a voltage channel */
 
-       ret = iio_device_claim_direct_mode(indio_dev);
-       if (ret)
-               return ret;
-       mutex_lock(&st->lock);
-
        st->chan = chan;
 
        at91_adc_cor(st, chan);
@@ -1661,9 +1643,25 @@ static int at91_adc_read_info_raw(struct iio_dev *indio_dev,
        /* Needed to ACK the DRDY interruption */
        at91_adc_readl(st, LCDR);
 
+       return ret;
+}
+
+static int at91_adc_read_info_locked(struct iio_dev *indio_dev,
+                                    struct iio_chan_spec const *chan, int *val)
+{
+       struct at91_adc_state *st = iio_priv(indio_dev);
+       int ret;
+
+       ret = iio_device_claim_direct_mode(indio_dev);
+       if (ret)
+               return ret;
+
+       mutex_lock(&st->lock);
+       ret = at91_adc_read_info_raw(indio_dev, chan, val);
        mutex_unlock(&st->lock);
 
        iio_device_release_direct_mode(indio_dev);
+
        return ret;
 }
 
@@ -1675,7 +1673,8 @@ static int at91_adc_read_raw(struct iio_dev *indio_dev,
 
        switch (mask) {
        case IIO_CHAN_INFO_RAW:
-               return at91_adc_read_info_raw(indio_dev, chan, val);
+               return at91_adc_read_info_locked(indio_dev, chan, val);
+
        case IIO_CHAN_INFO_SCALE:
                *val = st->vref_uv / 1000;
                if (chan->differential)