]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
iio: adc: stm32-dfsdm: Factor out core of reading INFO_RAW
authorJonathan Cameron <Jonathan.Cameron@huawei.com>
Mon, 17 Feb 2025 14:16:07 +0000 (14:16 +0000)
committerJonathan Cameron <Jonathan.Cameron@huawei.com>
Tue, 4 Mar 2025 13:17:48 +0000 (13:17 +0000)
This allows the claim on direct mode to be release in one place
rather than a lot of error paths, simplifying code.

Reviewed-by: Olivier Moysan <olivier.moysan@foss.st.com>
Link: https://patch.msgid.link/20250217141630.897334-8-jic23@kernel.org
Signed-off-by: Jonathan Cameron <Jonathan.Cameron@huawei.com>
drivers/iio/adc/stm32-dfsdm-adc.c

index fe11b0d8eab37615a9ad03ac204ef78c057e5ad5..1cf2594d6872341934303e1be1d7c93e013af161 100644 (file)
@@ -1306,6 +1306,38 @@ static int stm32_dfsdm_write_raw(struct iio_dev *indio_dev,
        return -EINVAL;
 }
 
+static int __stm32_dfsdm_read_info_raw(struct iio_dev *indio_dev,
+                                      struct iio_chan_spec const *chan,
+                                      int *val)
+{
+       struct stm32_dfsdm_adc *adc = iio_priv(indio_dev);
+       int ret = 0;
+
+       if (adc->hwc)
+               ret = iio_hw_consumer_enable(adc->hwc);
+       if (adc->backend)
+               ret = iio_backend_enable(adc->backend[chan->scan_index]);
+       if (ret < 0) {
+               dev_err(&indio_dev->dev,
+                       "%s: IIO enable failed (channel %d)\n",
+                       __func__, chan->channel);
+               return ret;
+       }
+       ret = stm32_dfsdm_single_conv(indio_dev, chan, val);
+       if (adc->hwc)
+               iio_hw_consumer_disable(adc->hwc);
+       if (adc->backend)
+               iio_backend_disable(adc->backend[chan->scan_index]);
+       if (ret < 0) {
+               dev_err(&indio_dev->dev,
+                       "%s: Conversion failed (channel %d)\n",
+                       __func__, chan->channel);
+               return ret;
+       }
+
+       return 0;
+}
+
 static int stm32_dfsdm_read_raw(struct iio_dev *indio_dev,
                                struct iio_chan_spec const *chan, int *val,
                                int *val2, long mask)
@@ -1326,30 +1358,11 @@ static int stm32_dfsdm_read_raw(struct iio_dev *indio_dev,
                ret = iio_device_claim_direct_mode(indio_dev);
                if (ret)
                        return ret;
-               if (adc->hwc)
-                       ret = iio_hw_consumer_enable(adc->hwc);
-               if (adc->backend)
-                       ret = iio_backend_enable(adc->backend[idx]);
-               if (ret < 0) {
-                       dev_err(&indio_dev->dev,
-                               "%s: IIO enable failed (channel %d)\n",
-                               __func__, chan->channel);
-                       iio_device_release_direct_mode(indio_dev);
-                       return ret;
-               }
-               ret = stm32_dfsdm_single_conv(indio_dev, chan, val);
-               if (adc->hwc)
-                       iio_hw_consumer_disable(adc->hwc);
-               if (adc->backend)
-                       iio_backend_disable(adc->backend[idx]);
-               if (ret < 0) {
-                       dev_err(&indio_dev->dev,
-                               "%s: Conversion failed (channel %d)\n",
-                               __func__, chan->channel);
-                       iio_device_release_direct_mode(indio_dev);
-                       return ret;
-               }
+
+               ret = __stm32_dfsdm_read_info_raw(indio_dev, chan, val);
                iio_device_release_direct_mode(indio_dev);
+               if (ret)
+                       return ret;
                return IIO_VAL_INT;
 
        case IIO_CHAN_INFO_OVERSAMPLING_RATIO: