iio: adc: stm32-dfsdm: Factor out core of reading INFO_RAW
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>
This commit is contained in:
@@ -1306,6 +1306,38 @@ static int stm32_dfsdm_write_raw(struct iio_dev *indio_dev,
|
|||||||
return -EINVAL;
|
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,
|
static int stm32_dfsdm_read_raw(struct iio_dev *indio_dev,
|
||||||
struct iio_chan_spec const *chan, int *val,
|
struct iio_chan_spec const *chan, int *val,
|
||||||
int *val2, long mask)
|
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);
|
ret = iio_device_claim_direct_mode(indio_dev);
|
||||||
if (ret)
|
if (ret)
|
||||||
return ret;
|
return ret;
|
||||||
if (adc->hwc)
|
|
||||||
ret = iio_hw_consumer_enable(adc->hwc);
|
ret = __stm32_dfsdm_read_info_raw(indio_dev, chan, val);
|
||||||
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;
|
|
||||||
}
|
|
||||||
iio_device_release_direct_mode(indio_dev);
|
iio_device_release_direct_mode(indio_dev);
|
||||||
|
if (ret)
|
||||||
|
return ret;
|
||||||
return IIO_VAL_INT;
|
return IIO_VAL_INT;
|
||||||
|
|
||||||
case IIO_CHAN_INFO_OVERSAMPLING_RATIO:
|
case IIO_CHAN_INFO_OVERSAMPLING_RATIO:
|
||||||
|
|||||||
Reference in New Issue
Block a user