[07/13] iio: imu: st_lsm6dsx: rely on st_lsm6dsx_update_bits_locked configuring events
diff mbox series

Message ID 903ebb1b14412abdee3029417ae146515e49c685.1570367532.git.lorenzo@kernel.org
State New
Headers show
Series
  • various st_lsm6dsx fixes and missing bits
Related show

Commit Message

Lorenzo Bianconi Oct. 6, 2019, 1:22 p.m. UTC
Rely on st_lsm6dsx_update_bits_locked in st_lsm6dsx_write_event and
st_lsm6dsx_event_setup routines since they can run concurrently with
sensor hub configuration

Fixes: b5969abfa8b8 ("iio: imu: st_lsm6dsx: add motion events")
Signed-off-by: Lorenzo Bianconi <lorenzo@kernel.org>
---
 drivers/iio/imu/st_lsm6dsx/st_lsm6dsx_core.c | 25 +++++++++++---------
 1 file changed, 14 insertions(+), 11 deletions(-)

Comments

Jonathan Cameron Oct. 12, 2019, 12:22 p.m. UTC | #1
On Sun,  6 Oct 2019 15:22:01 +0200
Lorenzo Bianconi <lorenzo@kernel.org> wrote:

> Rely on st_lsm6dsx_update_bits_locked in st_lsm6dsx_write_event and
> st_lsm6dsx_event_setup routines since they can run concurrently with
> sensor hub configuration
> 
> Fixes: b5969abfa8b8 ("iio: imu: st_lsm6dsx: add motion events")
> Signed-off-by: Lorenzo Bianconi <lorenzo@kernel.org>
Applied to the togreg branch of iio.git and pushed out as testing for
the autobuilders to play with it.

Thanks,

Jonathan

> ---
>  drivers/iio/imu/st_lsm6dsx/st_lsm6dsx_core.c | 25 +++++++++++---------
>  1 file changed, 14 insertions(+), 11 deletions(-)
> 
> diff --git a/drivers/iio/imu/st_lsm6dsx/st_lsm6dsx_core.c b/drivers/iio/imu/st_lsm6dsx/st_lsm6dsx_core.c
> index 7e9e1ef81742..023646762b4a 100644
> --- a/drivers/iio/imu/st_lsm6dsx/st_lsm6dsx_core.c
> +++ b/drivers/iio/imu/st_lsm6dsx/st_lsm6dsx_core.c
> @@ -1483,6 +1483,7 @@ static int st_lsm6dsx_write_raw(struct iio_dev *iio_dev,
>  static int st_lsm6dsx_event_setup(struct st_lsm6dsx_hw *hw, int state)
>  {
>  	const struct st_lsm6dsx_reg *reg;
> +	unsigned int data;
>  	int err;
>  
>  	if (!hw->settings->irq_config.irq1_func.addr)
> @@ -1490,17 +1491,17 @@ static int st_lsm6dsx_event_setup(struct st_lsm6dsx_hw *hw, int state)
>  
>  	reg = &hw->settings->event_settings.enable_reg;
>  	if (reg->addr) {
> -		err = regmap_update_bits(hw->regmap, reg->addr, reg->mask,
> -					 ST_LSM6DSX_SHIFT_VAL(state, reg->mask));
> +		data = ST_LSM6DSX_SHIFT_VAL(state, reg->mask);
> +		err = st_lsm6dsx_update_bits_locked(hw, reg->addr,
> +						    reg->mask, data);
>  		if (err < 0)
>  			return err;
>  	}
>  
>  	/* Enable wakeup interrupt */
> -	return regmap_update_bits(hw->regmap, hw->irq_routing->addr,
> -				  hw->irq_routing->mask,
> -				  ST_LSM6DSX_SHIFT_VAL(state,
> -					hw->irq_routing->mask));
> +	data = ST_LSM6DSX_SHIFT_VAL(state, hw->irq_routing->mask);
> +	return st_lsm6dsx_update_bits_locked(hw, hw->irq_routing->addr,
> +					     hw->irq_routing->mask, data);
>  }
>  
>  static int st_lsm6dsx_read_event(struct iio_dev *iio_dev,
> @@ -1531,6 +1532,8 @@ static int st_lsm6dsx_write_event(struct iio_dev *iio_dev,
>  {
>  	struct st_lsm6dsx_sensor *sensor = iio_priv(iio_dev);
>  	struct st_lsm6dsx_hw *hw = sensor->hw;
> +	const struct st_lsm6dsx_reg *reg;
> +	unsigned int data;
>  	int err;
>  
>  	if (type != IIO_EV_TYPE_THRESH)
> @@ -1539,11 +1542,11 @@ static int st_lsm6dsx_write_event(struct iio_dev *iio_dev,
>  	if (val < 0 || val > 31)
>  		return -EINVAL;
>  
> -	err = regmap_update_bits(hw->regmap,
> -				 hw->settings->event_settings.wakeup_reg.addr,
> -				 hw->settings->event_settings.wakeup_reg.mask,
> -				 val);
> -	if (err)
> +	reg = &hw->settings->event_settings.wakeup_reg;
> +	data = ST_LSM6DSX_SHIFT_VAL(val, reg->mask);
> +	err = st_lsm6dsx_update_bits_locked(hw, reg->addr,
> +					    reg->mask, data);
> +	if (err < 0)
>  		return -EINVAL;
>  
>  	hw->event_threshold = val;

Patch
diff mbox series

diff --git a/drivers/iio/imu/st_lsm6dsx/st_lsm6dsx_core.c b/drivers/iio/imu/st_lsm6dsx/st_lsm6dsx_core.c
index 7e9e1ef81742..023646762b4a 100644
--- a/drivers/iio/imu/st_lsm6dsx/st_lsm6dsx_core.c
+++ b/drivers/iio/imu/st_lsm6dsx/st_lsm6dsx_core.c
@@ -1483,6 +1483,7 @@  static int st_lsm6dsx_write_raw(struct iio_dev *iio_dev,
 static int st_lsm6dsx_event_setup(struct st_lsm6dsx_hw *hw, int state)
 {
 	const struct st_lsm6dsx_reg *reg;
+	unsigned int data;
 	int err;
 
 	if (!hw->settings->irq_config.irq1_func.addr)
@@ -1490,17 +1491,17 @@  static int st_lsm6dsx_event_setup(struct st_lsm6dsx_hw *hw, int state)
 
 	reg = &hw->settings->event_settings.enable_reg;
 	if (reg->addr) {
-		err = regmap_update_bits(hw->regmap, reg->addr, reg->mask,
-					 ST_LSM6DSX_SHIFT_VAL(state, reg->mask));
+		data = ST_LSM6DSX_SHIFT_VAL(state, reg->mask);
+		err = st_lsm6dsx_update_bits_locked(hw, reg->addr,
+						    reg->mask, data);
 		if (err < 0)
 			return err;
 	}
 
 	/* Enable wakeup interrupt */
-	return regmap_update_bits(hw->regmap, hw->irq_routing->addr,
-				  hw->irq_routing->mask,
-				  ST_LSM6DSX_SHIFT_VAL(state,
-					hw->irq_routing->mask));
+	data = ST_LSM6DSX_SHIFT_VAL(state, hw->irq_routing->mask);
+	return st_lsm6dsx_update_bits_locked(hw, hw->irq_routing->addr,
+					     hw->irq_routing->mask, data);
 }
 
 static int st_lsm6dsx_read_event(struct iio_dev *iio_dev,
@@ -1531,6 +1532,8 @@  static int st_lsm6dsx_write_event(struct iio_dev *iio_dev,
 {
 	struct st_lsm6dsx_sensor *sensor = iio_priv(iio_dev);
 	struct st_lsm6dsx_hw *hw = sensor->hw;
+	const struct st_lsm6dsx_reg *reg;
+	unsigned int data;
 	int err;
 
 	if (type != IIO_EV_TYPE_THRESH)
@@ -1539,11 +1542,11 @@  static int st_lsm6dsx_write_event(struct iio_dev *iio_dev,
 	if (val < 0 || val > 31)
 		return -EINVAL;
 
-	err = regmap_update_bits(hw->regmap,
-				 hw->settings->event_settings.wakeup_reg.addr,
-				 hw->settings->event_settings.wakeup_reg.mask,
-				 val);
-	if (err)
+	reg = &hw->settings->event_settings.wakeup_reg;
+	data = ST_LSM6DSX_SHIFT_VAL(val, reg->mask);
+	err = st_lsm6dsx_update_bits_locked(hw, reg->addr,
+					    reg->mask, data);
+	if (err < 0)
 		return -EINVAL;
 
 	hw->event_threshold = val;