diff mbox series

[18/37] iio: imu: st_lsm6dsx: Factor out parts of st_lsm6dsx_shub_write_raw() to allow direct returns

Message ID 20250331121317.1694135-19-jic23@kernel.org (mailing list archive)
State New
Headers show
Series IIO: Sparse friendly claim of direct mode (the rest) | expand

Commit Message

Jonathan Cameron March 31, 2025, 12:12 p.m. UTC
From: Jonathan Cameron <Jonathan.Cameron@huawei.com>

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 <Jonathan.Cameron@huawei.com>
Cc: Lorenzo Bianconi <lorenzo@kernel.org>
---
 drivers/iio/imu/st_lsm6dsx/st_lsm6dsx_shub.c | 65 +++++++++++---------
 1 file changed, 35 insertions(+), 30 deletions(-)

Comments

David Lechner March 31, 2025, 2:31 p.m. UTC | #1
On 3/31/25 7:12 AM, Jonathan Cameron wrote:
> From: Jonathan Cameron <Jonathan.Cameron@huawei.com>
> 
> 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 <Jonathan.Cameron@huawei.com>
> Cc: Lorenzo Bianconi <lorenzo@kernel.org>
> ---
>  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;
>  
I would be tempted to rename `err` to `ret` so we don't have to introduce
a new `odr` variable.
Lorenzo Bianconi April 1, 2025, 6:27 a.m. UTC | #2
> From: Jonathan Cameron <Jonathan.Cameron@huawei.com>
> 
> 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 <Jonathan.Cameron@huawei.com>
> Cc: Lorenzo Bianconi <lorenzo@kernel.org>

Acked-by: Lorenzo Bianconi <lorenzo@kernel.org>

> ---
>  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
>
Lorenzo Bianconi April 1, 2025, 6:28 a.m. UTC | #3
> On 3/31/25 7:12 AM, Jonathan Cameron wrote:
> > From: Jonathan Cameron <Jonathan.Cameron@huawei.com>
> > 
> > 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 <Jonathan.Cameron@huawei.com>
> > Cc: Lorenzo Bianconi <lorenzo@kernel.org>
> > ---
> >  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;
> >  
> I would be tempted to rename `err` to `ret` so we don't have to introduce
> a new `odr` variable.

I guess keeping odr variable makes the code more readable.

Regards,
Lorenzo
diff mbox series

Patch

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