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 |
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 --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: