diff mbox series

[07/29] iio: adc: stm32-dfsdm: Factor out core of reading INFO_RAW

Message ID 20250217141630.897334-8-jic23@kernel.org (mailing list archive)
State New
Headers show
Series IIO: ADCs: Sparse friendly claim of direct mode | expand

Commit Message

Jonathan Cameron Feb. 17, 2025, 2:16 p.m. UTC
From: Jonathan Cameron <Jonathan.Cameron@huawei.com>

This allows the claim on direct mode to be release in one place
rather than a lot of error paths, simplifying code.

Signed-off-by: Jonathan Cameron <Jonathan.Cameron@huawei.com>
Cc: Olivier Moysan <olivier.moysan@foss.st.com>
---
 drivers/iio/adc/stm32-dfsdm-adc.c | 59 +++++++++++++++++++------------
 1 file changed, 36 insertions(+), 23 deletions(-)

Comments

Olivier MOYSAN Feb. 18, 2025, 3:32 p.m. UTC | #1
Hi Jonathan,

Reviewed-by: Olivier Moysan <olivier.moysan@foss.st.com>
Thanks

On 2/17/25 15:16, Jonathan Cameron wrote:
> From: Jonathan Cameron <Jonathan.Cameron@huawei.com>
> 
> This allows the claim on direct mode to be release in one place
> rather than a lot of error paths, simplifying code.
> 
> Signed-off-by: Jonathan Cameron <Jonathan.Cameron@huawei.com>
> Cc: Olivier Moysan <olivier.moysan@foss.st.com>
> ---
>   drivers/iio/adc/stm32-dfsdm-adc.c | 59 +++++++++++++++++++------------
>   1 file changed, 36 insertions(+), 23 deletions(-)
> 
> diff --git a/drivers/iio/adc/stm32-dfsdm-adc.c b/drivers/iio/adc/stm32-dfsdm-adc.c
> index fe11b0d8eab3..1cf2594d6872 100644
> --- a/drivers/iio/adc/stm32-dfsdm-adc.c
> +++ b/drivers/iio/adc/stm32-dfsdm-adc.c
> @@ -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:
diff mbox series

Patch

diff --git a/drivers/iio/adc/stm32-dfsdm-adc.c b/drivers/iio/adc/stm32-dfsdm-adc.c
index fe11b0d8eab3..1cf2594d6872 100644
--- a/drivers/iio/adc/stm32-dfsdm-adc.c
+++ b/drivers/iio/adc/stm32-dfsdm-adc.c
@@ -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: