From: Jonathan Cameron <Jonathan.Cameron@xxxxxxxxxx> Similar to existing use of guard() in this driver, CLASS(iio_claim_direct, claimed_dev)(indio_Dev); if (IS_ERR(claimed_dev)) return PTR_ERR(claimed_dev); will ensure that scope based cleanup occurs. Signed-off-by: Jonathan Cameron <Jonathan.Cameron@xxxxxxxxxx> --- drivers/iio/imu/bmi323/bmi323_core.c | 61 ++++++++++++---------------- 1 file changed, 27 insertions(+), 34 deletions(-) diff --git a/drivers/iio/imu/bmi323/bmi323_core.c b/drivers/iio/imu/bmi323/bmi323_core.c index 0bd5dedd9a63..c9784ad01d44 100644 --- a/drivers/iio/imu/bmi323/bmi323_core.c +++ b/drivers/iio/imu/bmi323/bmi323_core.c @@ -1671,34 +1671,30 @@ static int bmi323_write_raw(struct iio_dev *indio_dev, int ret; switch (mask) { - case IIO_CHAN_INFO_SAMP_FREQ: - ret = iio_device_claim_direct_mode(indio_dev); - if (ret) - return ret; + case IIO_CHAN_INFO_SAMP_FREQ: { + CLASS(iio_claim_direct, claimed_dev)(indio_dev); + if (IS_ERR(claimed_dev)) + return PTR_ERR(claimed_dev); - ret = bmi323_set_odr(data, bmi323_iio_to_sensor(chan->type), - val, val2); - iio_device_release_direct_mode(indio_dev); - return ret; - case IIO_CHAN_INFO_SCALE: - ret = iio_device_claim_direct_mode(indio_dev); - if (ret) - return ret; - - ret = bmi323_set_scale(data, bmi323_iio_to_sensor(chan->type), - val, val2); - iio_device_release_direct_mode(indio_dev); - return ret; - case IIO_CHAN_INFO_OVERSAMPLING_RATIO: - ret = iio_device_claim_direct_mode(indio_dev); - if (ret) - return ret; + return bmi323_set_odr(data, bmi323_iio_to_sensor(chan->type), + val, val2); + } + case IIO_CHAN_INFO_SCALE: { + CLASS(iio_claim_direct, claimed_dev)(indio_dev); + if (IS_ERR(claimed_dev)) + return PTR_ERR(claimed_dev); - ret = bmi323_set_average(data, bmi323_iio_to_sensor(chan->type), - val); + return bmi323_set_scale(data, bmi323_iio_to_sensor(chan->type), + val, val2); + } + case IIO_CHAN_INFO_OVERSAMPLING_RATIO: { + CLASS(iio_claim_direct, claimed_dev)(indio_dev); + if (IS_ERR(claimed_dev)) + return PTR_ERR(claimed_dev); - iio_device_release_direct_mode(indio_dev); - return ret; + return bmi323_set_average(data, bmi323_iio_to_sensor(chan->type), + val); + } case IIO_CHAN_INFO_ENABLE: return bmi323_enable_steps(data, val); case IIO_CHAN_INFO_PROCESSED: @@ -1724,7 +1720,6 @@ static int bmi323_read_raw(struct iio_dev *indio_dev, int *val2, long mask) { struct bmi323_data *data = iio_priv(indio_dev); - int ret; switch (mask) { case IIO_CHAN_INFO_PROCESSED: @@ -1732,15 +1727,13 @@ static int bmi323_read_raw(struct iio_dev *indio_dev, case IIO_CHAN_INFO_RAW: switch (chan->type) { case IIO_ACCEL: - case IIO_ANGL_VEL: - ret = iio_device_claim_direct_mode(indio_dev); - if (ret) - return ret; + case IIO_ANGL_VEL: { + CLASS(iio_claim_direct, claimed_dev)(indio_dev); + if (IS_ERR(claimed_dev)) + return PTR_ERR(claimed_dev); - ret = bmi323_read_axis(data, chan, val); - - iio_device_release_direct_mode(indio_dev); - return ret; + return bmi323_read_axis(data, chan, val); + } case IIO_TEMP: return bmi323_get_temp_data(data, val); default: -- 2.42.0