iio: adc: vf610_adc: add helper function to read samples
authorNuno Sá <nuno.sa@analog.com>
Tue, 4 Oct 2022 13:49:02 +0000 (15:49 +0200)
committerJonathan Cameron <Jonathan.Cameron@huawei.com>
Wed, 23 Nov 2022 19:43:58 +0000 (19:43 +0000)
This is a precursor change to make it simpler to remove the 'mlock'
usage. Having the code in it's own helper function, also makes it easier
to read the error paths.

Signed-off-by: Nuno Sá <nuno.sa@analog.com>
Reviewed-by: Haibo Chen <haibo.chen@nxp.com>
Link: https://lore.kernel.org/r/20221004134909.1692021-10-nuno.sa@analog.com
Signed-off-by: Jonathan Cameron <Jonathan.Cameron@huawei.com>
drivers/iio/adc/vf610_adc.c

index c6b16cf6e36755725ab414fd50cbdc6dcda14b9f..a6f9182d7766a53eb14348e363fe2af933adef13 100644 (file)
@@ -622,6 +622,58 @@ static const struct attribute_group vf610_attribute_group = {
        .attrs = vf610_attributes,
 };
 
+static int vf610_read_sample(struct iio_dev *indio_dev,
+                            struct iio_chan_spec const *chan, int *val)
+{
+       struct vf610_adc *info = iio_priv(indio_dev);
+       unsigned int hc_cfg;
+       int ret;
+
+       mutex_lock(&indio_dev->mlock);
+       if (iio_buffer_enabled(indio_dev)) {
+               ret = -EBUSY;
+               goto out_unlock;
+       }
+
+       reinit_completion(&info->completion);
+       hc_cfg = VF610_ADC_ADCHC(chan->channel);
+       hc_cfg |= VF610_ADC_AIEN;
+       writel(hc_cfg, info->regs + VF610_REG_ADC_HC0);
+       ret = wait_for_completion_interruptible_timeout(&info->completion,
+                                                       VF610_ADC_TIMEOUT);
+       if (ret == 0) {
+               ret = -ETIMEDOUT;
+               goto out_unlock;
+       }
+
+       if (ret < 0)
+               goto out_unlock;
+
+       switch (chan->type) {
+       case IIO_VOLTAGE:
+               *val = info->value;
+               break;
+       case IIO_TEMP:
+               /*
+                * Calculate in degree Celsius times 1000
+                * Using the typical sensor slope of 1.84 mV/°C
+                * and VREFH_ADC at 3.3V, V at 25°C of 699 mV
+                */
+               *val = 25000 - ((int)info->value - VF610_VTEMP25_3V3) *
+                               1000000 / VF610_TEMP_SLOPE_COEFF;
+
+               break;
+       default:
+               ret = -EINVAL;
+               break;
+       }
+
+out_unlock:
+       mutex_unlock(&indio_dev->mlock);
+
+       return ret;
+}
+
 static int vf610_read_raw(struct iio_dev *indio_dev,
                        struct iio_chan_spec const *chan,
                        int *val,
@@ -629,53 +681,15 @@ static int vf610_read_raw(struct iio_dev *indio_dev,
                        long mask)
 {
        struct vf610_adc *info = iio_priv(indio_dev);
-       unsigned int hc_cfg;
        long ret;
 
        switch (mask) {
        case IIO_CHAN_INFO_RAW:
        case IIO_CHAN_INFO_PROCESSED:
-               mutex_lock(&indio_dev->mlock);
-               if (iio_buffer_enabled(indio_dev)) {
-                       mutex_unlock(&indio_dev->mlock);
-                       return -EBUSY;
-               }
-
-               reinit_completion(&info->completion);
-               hc_cfg = VF610_ADC_ADCHC(chan->channel);
-               hc_cfg |= VF610_ADC_AIEN;
-               writel(hc_cfg, info->regs + VF610_REG_ADC_HC0);
-               ret = wait_for_completion_interruptible_timeout
-                               (&info->completion, VF610_ADC_TIMEOUT);
-               if (ret == 0) {
-                       mutex_unlock(&indio_dev->mlock);
-                       return -ETIMEDOUT;
-               }
-               if (ret < 0) {
-                       mutex_unlock(&indio_dev->mlock);
+               ret = vf610_read_sample(indio_dev, chan, val);
+               if (ret < 0)
                        return ret;
-               }
-
-               switch (chan->type) {
-               case IIO_VOLTAGE:
-                       *val = info->value;
-                       break;
-               case IIO_TEMP:
-                       /*
-                        * Calculate in degree Celsius times 1000
-                        * Using the typical sensor slope of 1.84 mV/°C
-                        * and VREFH_ADC at 3.3V, V at 25°C of 699 mV
-                        */
-                       *val = 25000 - ((int)info->value - VF610_VTEMP25_3V3) *
-                                       1000000 / VF610_TEMP_SLOPE_COEFF;
-
-                       break;
-               default:
-                       mutex_unlock(&indio_dev->mlock);
-                       return -EINVAL;
-               }
 
-               mutex_unlock(&indio_dev->mlock);
                return IIO_VAL_INT;
 
        case IIO_CHAN_INFO_SCALE: