> From: Jonathan Cameron > > By factoring out all the code that occurs with direct mode claimed > to a helper function, that helper function can directly return simplifying > code flow. > > Signed-off-by: Jonathan Cameron > Cc: Lorenzo Bianconi Acked-by: Lorenzo Bianconi > --- > drivers/iio/imu/st_lsm6dsx/st_lsm6dsx_shub.c | 65 +++++++++++--------- > 1 file changed, 35 insertions(+), 30 deletions(-) > > diff --git a/drivers/iio/imu/st_lsm6dsx/st_lsm6dsx_shub.c b/drivers/iio/imu/st_lsm6dsx/st_lsm6dsx_shub.c > index c1b444520d2a..17a74f5adfc0 100644 > --- a/drivers/iio/imu/st_lsm6dsx/st_lsm6dsx_shub.c > +++ b/drivers/iio/imu/st_lsm6dsx/st_lsm6dsx_shub.c > @@ -614,53 +614,58 @@ st_lsm6dsx_shub_set_full_scale(struct st_lsm6dsx_sensor *sensor, > } > > static int > -st_lsm6dsx_shub_write_raw(struct iio_dev *iio_dev, > - struct iio_chan_spec const *chan, > - int val, int val2, long mask) > +__st_lsm6dsx_shub_write_raw(struct iio_dev *iio_dev, > + struct iio_chan_spec const *chan, > + int val, int val2, long mask) > { > struct st_lsm6dsx_sensor *sensor = iio_priv(iio_dev); > int err; > > - err = iio_device_claim_direct_mode(iio_dev); > - if (err) > - return err; > - > switch (mask) { > case IIO_CHAN_INFO_SAMP_FREQ: { > + struct st_lsm6dsx_hw *hw = sensor->hw; > + struct st_lsm6dsx_sensor *ref_sensor; > + u8 odr_val; > u16 data; > + int odr; > > val = val * 1000 + val2 / 1000; > err = st_lsm6dsx_shub_get_odr_val(sensor, val, &data); > - if (!err) { > - struct st_lsm6dsx_hw *hw = sensor->hw; > - struct st_lsm6dsx_sensor *ref_sensor; > - u8 odr_val; > - int odr; > - > - ref_sensor = iio_priv(hw->iio_devs[ST_LSM6DSX_ID_ACC]); > - odr = st_lsm6dsx_check_odr(ref_sensor, val, &odr_val); > - if (odr < 0) { > - err = odr; > - goto release; > - } > - > - sensor->ext_info.slv_odr = val; > - sensor->odr = odr; > - } > - break; > + if (err) > + return err; > + > + ref_sensor = iio_priv(hw->iio_devs[ST_LSM6DSX_ID_ACC]); > + odr = st_lsm6dsx_check_odr(ref_sensor, val, &odr_val); > + if (odr < 0) > + return odr; > + > + sensor->ext_info.slv_odr = val; > + sensor->odr = odr; > + return 0; > } > case IIO_CHAN_INFO_SCALE: > - err = st_lsm6dsx_shub_set_full_scale(sensor, val2); > - break; > + return st_lsm6dsx_shub_set_full_scale(sensor, val2); > default: > - err = -EINVAL; > - break; > + return -EINVAL; > } > +} > + > +static int > +st_lsm6dsx_shub_write_raw(struct iio_dev *iio_dev, > + struct iio_chan_spec const *chan, > + int val, int val2, long mask) > +{ > + int ret; > + > + ret = iio_device_claim_direct_mode(iio_dev); > + if (ret) > + return ret; > + > + ret = __st_lsm6dsx_shub_write_raw(iio_dev, chan, val, val2, mask); > > -release: > iio_device_release_direct_mode(iio_dev); > > - return err; > + return ret; > } > > static ssize_t > -- > 2.48.1 >