Switching to the _scoped() version can make the error handling more natural instead of delayed until direct mode was released. Signed-off-by: Fernando Yang <hagisf@xxxxxx> --- drivers/iio/adc/ad7266.c | 27 +++++++++++++-------------- 1 file changed, 13 insertions(+), 14 deletions(-) diff --git a/drivers/iio/adc/ad7266.c b/drivers/iio/adc/ad7266.c index 13ea8a107..356c2fe07 100644 --- a/drivers/iio/adc/ad7266.c +++ b/drivers/iio/adc/ad7266.c @@ -151,20 +151,19 @@ static int ad7266_read_raw(struct iio_dev *indio_dev, switch (m) { case IIO_CHAN_INFO_RAW: - ret = iio_device_claim_direct_mode(indio_dev); - if (ret) - return ret; - ret = ad7266_read_single(st, val, chan->address); - iio_device_release_direct_mode(indio_dev); - - if (ret < 0) - return ret; - *val = (*val >> 2) & 0xfff; - if (chan->scan_type.sign == 's') - *val = sign_extend32(*val, - chan->scan_type.realbits - 1); - - return IIO_VAL_INT; + iio_device_claim_direct_scoped(return -EBUSY, indio_dev) { + ret = ad7266_read_single(st, val, chan->address); + + if (ret < 0) + return ret; + *val = (*val >> 2) & 0xfff; + if (chan->scan_type.sign == 's') + *val = sign_extend32(*val, + chan->scan_type.realbits - 1); + + return IIO_VAL_INT; + } + unreachable(); case IIO_CHAN_INFO_SCALE: scale_mv = st->vref_mv; if (st->mode == AD7266_MODE_DIFF) -- 2.34.1