iio: imu: st_lsm6dsx: Factor out parts of st_lsm6dsx_shub_write_raw() to allow direct...
authorJonathan Cameron <Jonathan.Cameron@huawei.com>
Mon, 31 Mar 2025 12:12:58 +0000 (13:12 +0100)
committerJonathan Cameron <Jonathan.Cameron@huawei.com>
Tue, 22 Apr 2025 18:09:59 +0000 (19:09 +0100)
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.

Acked-by: Lorenzo Bianconi <lorenzo@kernel.org>
Reviewed-by: David Lechner <dlechner@baylibre.com>
Reviewed-by: Marcelo Schmitt <marcelo.schmitt1@gmail.com>
Link: https://patch.msgid.link/20250331121317.1694135-19-jic23@kernel.org
Signed-off-by: Jonathan Cameron <Jonathan.Cameron@huawei.com>
drivers/iio/imu/st_lsm6dsx/st_lsm6dsx_shub.c

index c1b444520d2a1b2c9a0792784bc61045da33bd8e..17a74f5adfc04dead51b719d63a1c5c7f65e4918 100644 (file)
@@ -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