[05/13] iio: imu: st_lsm6dsx: move bdu/boot and reset register info in hw_settings
diff mbox series

Message ID 05ed5aab740bcf07ee5b32e4d3248d29b6ad31f7.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:21 p.m. UTC
Move bdu, boot and reset register definitions in hw_settings register
map since not all supported sensors (e.g lsm9ds1) rely on the same
definitions

Fixes: 52f4b1f19679 ("iio: imu: st_lsm6dsx: add support for accel/gyro unit of lsm9ds1")
Signed-off-by: Lorenzo Bianconi <lorenzo@kernel.org>
---
 drivers/iio/imu/st_lsm6dsx/st_lsm6dsx.h      |   8 +-
 drivers/iio/imu/st_lsm6dsx/st_lsm6dsx_core.c | 113 +++++++++++++++----
 2 files changed, 99 insertions(+), 22 deletions(-)

Comments

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

> Move bdu, boot and reset register definitions in hw_settings register
> map since not all supported sensors (e.g lsm9ds1) rely on the same
> definitions
> 
> Fixes: 52f4b1f19679 ("iio: imu: st_lsm6dsx: add support for accel/gyro unit of lsm9ds1")
> Signed-off-by: Lorenzo Bianconi <lorenzo@kernel.org>
Applied.

Note that I'm applying this series to the togreg branch of iio.git simply
to avoid the complexity of trying to unwind what should go to stable
at this point and what should not.  Not sure what else we can do
with this driver as it is in a fairly large state of flux.

You may need to do backports by hand to cover 5.4.

Thanks,

Jonathan


> ---
>  drivers/iio/imu/st_lsm6dsx/st_lsm6dsx.h      |   8 +-
>  drivers/iio/imu/st_lsm6dsx/st_lsm6dsx_core.c | 113 +++++++++++++++----
>  2 files changed, 99 insertions(+), 22 deletions(-)
> 
> diff --git a/drivers/iio/imu/st_lsm6dsx/st_lsm6dsx.h b/drivers/iio/imu/st_lsm6dsx/st_lsm6dsx.h
> index 8e002a51595e..5692ea695f04 100644
> --- a/drivers/iio/imu/st_lsm6dsx/st_lsm6dsx.h
> +++ b/drivers/iio/imu/st_lsm6dsx/st_lsm6dsx.h
> @@ -236,7 +236,9 @@ struct st_lsm6dsx_ext_dev_settings {
>  /**
>   * struct st_lsm6dsx_settings - ST IMU sensor settings
>   * @wai: Sensor WhoAmI default value.
> - * @reset_addr: register address for reset/reboot
> + * @reset: register address for reset.
> + * @boot: register address for boot.
> + * @bdu: register address for Block Data Update.
>   * @max_fifo_size: Sensor max fifo length in FIFO words.
>   * @id: List of hw id/device name supported by the driver configuration.
>   * @channels: IIO channels supported by the device.
> @@ -251,7 +253,9 @@ struct st_lsm6dsx_ext_dev_settings {
>   */
>  struct st_lsm6dsx_settings {
>  	u8 wai;
> -	u8 reset_addr;
> +	struct st_lsm6dsx_reg reset;
> +	struct st_lsm6dsx_reg boot;
> +	struct st_lsm6dsx_reg bdu;
>  	u16 max_fifo_size;
>  	struct {
>  		enum st_lsm6dsx_hw_id hw_id;
> diff --git a/drivers/iio/imu/st_lsm6dsx/st_lsm6dsx_core.c b/drivers/iio/imu/st_lsm6dsx/st_lsm6dsx_core.c
> index a598cc8e9343..5df382b9d8f9 100644
> --- a/drivers/iio/imu/st_lsm6dsx/st_lsm6dsx_core.c
> +++ b/drivers/iio/imu/st_lsm6dsx/st_lsm6dsx_core.c
> @@ -62,10 +62,6 @@
>  #include "st_lsm6dsx.h"
>  
>  #define ST_LSM6DSX_REG_WHOAMI_ADDR		0x0f
> -#define ST_LSM6DSX_REG_RESET_MASK		BIT(0)
> -#define ST_LSM6DSX_REG_BOOT_MASK		BIT(7)
> -#define ST_LSM6DSX_REG_BDU_ADDR			0x12
> -#define ST_LSM6DSX_REG_BDU_MASK			BIT(6)
>  
>  static const struct iio_chan_spec st_lsm6dsx_acc_channels[] = {
>  	ST_LSM6DSX_CHANNEL_ACC(IIO_ACCEL, 0x28, IIO_MOD_X, 0),
> @@ -91,7 +87,18 @@ static const struct iio_chan_spec st_lsm6ds0_gyro_channels[] = {
>  static const struct st_lsm6dsx_settings st_lsm6dsx_sensor_settings[] = {
>  	{
>  		.wai = 0x68,
> -		.reset_addr = 0x22,
> +		.reset = {
> +			.addr = 0x22,
> +			.mask = BIT(0),
> +		},
> +		.boot = {
> +			.addr = 0x22,
> +			.mask = BIT(7),
> +		},
> +		.bdu = {
> +			.addr = 0x22,
> +			.mask = BIT(6),
> +		},
>  		.max_fifo_size = 32,
>  		.id = {
>  			{
> @@ -177,7 +184,18 @@ static const struct st_lsm6dsx_settings st_lsm6dsx_sensor_settings[] = {
>  	},
>  	{
>  		.wai = 0x69,
> -		.reset_addr = 0x12,
> +		.reset = {
> +			.addr = 0x12,
> +			.mask = BIT(0),
> +		},
> +		.boot = {
> +			.addr = 0x12,
> +			.mask = BIT(7),
> +		},
> +		.bdu = {
> +			.addr = 0x12,
> +			.mask = BIT(6),
> +		},
>  		.max_fifo_size = 1365,
>  		.id = {
>  			{
> @@ -328,7 +346,18 @@ static const struct st_lsm6dsx_settings st_lsm6dsx_sensor_settings[] = {
>  	},
>  	{
>  		.wai = 0x69,
> -		.reset_addr = 0x12,
> +		.reset = {
> +			.addr = 0x12,
> +			.mask = BIT(0),
> +		},
> +		.boot = {
> +			.addr = 0x12,
> +			.mask = BIT(7),
> +		},
> +		.bdu = {
> +			.addr = 0x12,
> +			.mask = BIT(6),
> +		},
>  		.max_fifo_size = 682,
>  		.id = {
>  			{
> @@ -479,7 +508,18 @@ static const struct st_lsm6dsx_settings st_lsm6dsx_sensor_settings[] = {
>  	},
>  	{
>  		.wai = 0x6a,
> -		.reset_addr = 0x12,
> +		.reset = {
> +			.addr = 0x12,
> +			.mask = BIT(0),
> +		},
> +		.boot = {
> +			.addr = 0x12,
> +			.mask = BIT(7),
> +		},
> +		.bdu = {
> +			.addr = 0x12,
> +			.mask = BIT(6),
> +		},
>  		.max_fifo_size = 682,
>  		.id = {
>  			{
> @@ -643,7 +683,18 @@ static const struct st_lsm6dsx_settings st_lsm6dsx_sensor_settings[] = {
>  	},
>  	{
>  		.wai = 0x6c,
> -		.reset_addr = 0x12,
> +		.reset = {
> +			.addr = 0x12,
> +			.mask = BIT(0),
> +		},
> +		.boot = {
> +			.addr = 0x12,
> +			.mask = BIT(7),
> +		},
> +		.bdu = {
> +			.addr = 0x12,
> +			.mask = BIT(6),
> +		},
>  		.max_fifo_size = 512,
>  		.id = {
>  			{
> @@ -800,7 +851,18 @@ static const struct st_lsm6dsx_settings st_lsm6dsx_sensor_settings[] = {
>  	},
>  	{
>  		.wai = 0x6b,
> -		.reset_addr = 0x12,
> +		.reset = {
> +			.addr = 0x12,
> +			.mask = BIT(0),
> +		},
> +		.boot = {
> +			.addr = 0x12,
> +			.mask = BIT(7),
> +		},
> +		.bdu = {
> +			.addr = 0x12,
> +			.mask = BIT(6),
> +		},
>  		.max_fifo_size = 512,
>  		.id = {
>  			{
> @@ -951,7 +1013,18 @@ static const struct st_lsm6dsx_settings st_lsm6dsx_sensor_settings[] = {
>  	},
>  	{
>  		.wai = 0x6b,
> -		.reset_addr = 0x12,
> +		.reset = {
> +			.addr = 0x12,
> +			.mask = BIT(0),
> +		},
> +		.boot = {
> +			.addr = 0x12,
> +			.mask = BIT(7),
> +		},
> +		.bdu = {
> +			.addr = 0x12,
> +			.mask = BIT(6),
> +		},
>  		.max_fifo_size = 512,
>  		.id = {
>  			{
> @@ -1778,27 +1851,27 @@ static int st_lsm6dsx_init_device(struct st_lsm6dsx_hw *hw)
>  	int err;
>  
>  	/* device sw reset */
> -	err = regmap_update_bits(hw->regmap, hw->settings->reset_addr,
> -				 ST_LSM6DSX_REG_RESET_MASK,
> -				 FIELD_PREP(ST_LSM6DSX_REG_RESET_MASK, 1));
> +	reg = &hw->settings->reset;
> +	err = regmap_update_bits(hw->regmap, reg->addr, reg->mask,
> +				 ST_LSM6DSX_SHIFT_VAL(1, reg->mask));
>  	if (err < 0)
>  		return err;
>  
>  	msleep(50);
>  
>  	/* reload trimming parameter */
> -	err = regmap_update_bits(hw->regmap, hw->settings->reset_addr,
> -				 ST_LSM6DSX_REG_BOOT_MASK,
> -				 FIELD_PREP(ST_LSM6DSX_REG_BOOT_MASK, 1));
> +	reg = &hw->settings->boot;
> +	err = regmap_update_bits(hw->regmap, reg->addr, reg->mask,
> +				 ST_LSM6DSX_SHIFT_VAL(1, reg->mask));
>  	if (err < 0)
>  		return err;
>  
>  	msleep(50);
>  
>  	/* enable Block Data Update */
> -	err = regmap_update_bits(hw->regmap, ST_LSM6DSX_REG_BDU_ADDR,
> -				 ST_LSM6DSX_REG_BDU_MASK,
> -				 FIELD_PREP(ST_LSM6DSX_REG_BDU_MASK, 1));
> +	reg = &hw->settings->bdu;
> +	err = regmap_update_bits(hw->regmap, reg->addr, reg->mask,
> +				 ST_LSM6DSX_SHIFT_VAL(1, reg->mask));
>  	if (err < 0)
>  		return err;
>

Patch
diff mbox series

diff --git a/drivers/iio/imu/st_lsm6dsx/st_lsm6dsx.h b/drivers/iio/imu/st_lsm6dsx/st_lsm6dsx.h
index 8e002a51595e..5692ea695f04 100644
--- a/drivers/iio/imu/st_lsm6dsx/st_lsm6dsx.h
+++ b/drivers/iio/imu/st_lsm6dsx/st_lsm6dsx.h
@@ -236,7 +236,9 @@  struct st_lsm6dsx_ext_dev_settings {
 /**
  * struct st_lsm6dsx_settings - ST IMU sensor settings
  * @wai: Sensor WhoAmI default value.
- * @reset_addr: register address for reset/reboot
+ * @reset: register address for reset.
+ * @boot: register address for boot.
+ * @bdu: register address for Block Data Update.
  * @max_fifo_size: Sensor max fifo length in FIFO words.
  * @id: List of hw id/device name supported by the driver configuration.
  * @channels: IIO channels supported by the device.
@@ -251,7 +253,9 @@  struct st_lsm6dsx_ext_dev_settings {
  */
 struct st_lsm6dsx_settings {
 	u8 wai;
-	u8 reset_addr;
+	struct st_lsm6dsx_reg reset;
+	struct st_lsm6dsx_reg boot;
+	struct st_lsm6dsx_reg bdu;
 	u16 max_fifo_size;
 	struct {
 		enum st_lsm6dsx_hw_id hw_id;
diff --git a/drivers/iio/imu/st_lsm6dsx/st_lsm6dsx_core.c b/drivers/iio/imu/st_lsm6dsx/st_lsm6dsx_core.c
index a598cc8e9343..5df382b9d8f9 100644
--- a/drivers/iio/imu/st_lsm6dsx/st_lsm6dsx_core.c
+++ b/drivers/iio/imu/st_lsm6dsx/st_lsm6dsx_core.c
@@ -62,10 +62,6 @@ 
 #include "st_lsm6dsx.h"
 
 #define ST_LSM6DSX_REG_WHOAMI_ADDR		0x0f
-#define ST_LSM6DSX_REG_RESET_MASK		BIT(0)
-#define ST_LSM6DSX_REG_BOOT_MASK		BIT(7)
-#define ST_LSM6DSX_REG_BDU_ADDR			0x12
-#define ST_LSM6DSX_REG_BDU_MASK			BIT(6)
 
 static const struct iio_chan_spec st_lsm6dsx_acc_channels[] = {
 	ST_LSM6DSX_CHANNEL_ACC(IIO_ACCEL, 0x28, IIO_MOD_X, 0),
@@ -91,7 +87,18 @@  static const struct iio_chan_spec st_lsm6ds0_gyro_channels[] = {
 static const struct st_lsm6dsx_settings st_lsm6dsx_sensor_settings[] = {
 	{
 		.wai = 0x68,
-		.reset_addr = 0x22,
+		.reset = {
+			.addr = 0x22,
+			.mask = BIT(0),
+		},
+		.boot = {
+			.addr = 0x22,
+			.mask = BIT(7),
+		},
+		.bdu = {
+			.addr = 0x22,
+			.mask = BIT(6),
+		},
 		.max_fifo_size = 32,
 		.id = {
 			{
@@ -177,7 +184,18 @@  static const struct st_lsm6dsx_settings st_lsm6dsx_sensor_settings[] = {
 	},
 	{
 		.wai = 0x69,
-		.reset_addr = 0x12,
+		.reset = {
+			.addr = 0x12,
+			.mask = BIT(0),
+		},
+		.boot = {
+			.addr = 0x12,
+			.mask = BIT(7),
+		},
+		.bdu = {
+			.addr = 0x12,
+			.mask = BIT(6),
+		},
 		.max_fifo_size = 1365,
 		.id = {
 			{
@@ -328,7 +346,18 @@  static const struct st_lsm6dsx_settings st_lsm6dsx_sensor_settings[] = {
 	},
 	{
 		.wai = 0x69,
-		.reset_addr = 0x12,
+		.reset = {
+			.addr = 0x12,
+			.mask = BIT(0),
+		},
+		.boot = {
+			.addr = 0x12,
+			.mask = BIT(7),
+		},
+		.bdu = {
+			.addr = 0x12,
+			.mask = BIT(6),
+		},
 		.max_fifo_size = 682,
 		.id = {
 			{
@@ -479,7 +508,18 @@  static const struct st_lsm6dsx_settings st_lsm6dsx_sensor_settings[] = {
 	},
 	{
 		.wai = 0x6a,
-		.reset_addr = 0x12,
+		.reset = {
+			.addr = 0x12,
+			.mask = BIT(0),
+		},
+		.boot = {
+			.addr = 0x12,
+			.mask = BIT(7),
+		},
+		.bdu = {
+			.addr = 0x12,
+			.mask = BIT(6),
+		},
 		.max_fifo_size = 682,
 		.id = {
 			{
@@ -643,7 +683,18 @@  static const struct st_lsm6dsx_settings st_lsm6dsx_sensor_settings[] = {
 	},
 	{
 		.wai = 0x6c,
-		.reset_addr = 0x12,
+		.reset = {
+			.addr = 0x12,
+			.mask = BIT(0),
+		},
+		.boot = {
+			.addr = 0x12,
+			.mask = BIT(7),
+		},
+		.bdu = {
+			.addr = 0x12,
+			.mask = BIT(6),
+		},
 		.max_fifo_size = 512,
 		.id = {
 			{
@@ -800,7 +851,18 @@  static const struct st_lsm6dsx_settings st_lsm6dsx_sensor_settings[] = {
 	},
 	{
 		.wai = 0x6b,
-		.reset_addr = 0x12,
+		.reset = {
+			.addr = 0x12,
+			.mask = BIT(0),
+		},
+		.boot = {
+			.addr = 0x12,
+			.mask = BIT(7),
+		},
+		.bdu = {
+			.addr = 0x12,
+			.mask = BIT(6),
+		},
 		.max_fifo_size = 512,
 		.id = {
 			{
@@ -951,7 +1013,18 @@  static const struct st_lsm6dsx_settings st_lsm6dsx_sensor_settings[] = {
 	},
 	{
 		.wai = 0x6b,
-		.reset_addr = 0x12,
+		.reset = {
+			.addr = 0x12,
+			.mask = BIT(0),
+		},
+		.boot = {
+			.addr = 0x12,
+			.mask = BIT(7),
+		},
+		.bdu = {
+			.addr = 0x12,
+			.mask = BIT(6),
+		},
 		.max_fifo_size = 512,
 		.id = {
 			{
@@ -1778,27 +1851,27 @@  static int st_lsm6dsx_init_device(struct st_lsm6dsx_hw *hw)
 	int err;
 
 	/* device sw reset */
-	err = regmap_update_bits(hw->regmap, hw->settings->reset_addr,
-				 ST_LSM6DSX_REG_RESET_MASK,
-				 FIELD_PREP(ST_LSM6DSX_REG_RESET_MASK, 1));
+	reg = &hw->settings->reset;
+	err = regmap_update_bits(hw->regmap, reg->addr, reg->mask,
+				 ST_LSM6DSX_SHIFT_VAL(1, reg->mask));
 	if (err < 0)
 		return err;
 
 	msleep(50);
 
 	/* reload trimming parameter */
-	err = regmap_update_bits(hw->regmap, hw->settings->reset_addr,
-				 ST_LSM6DSX_REG_BOOT_MASK,
-				 FIELD_PREP(ST_LSM6DSX_REG_BOOT_MASK, 1));
+	reg = &hw->settings->boot;
+	err = regmap_update_bits(hw->regmap, reg->addr, reg->mask,
+				 ST_LSM6DSX_SHIFT_VAL(1, reg->mask));
 	if (err < 0)
 		return err;
 
 	msleep(50);
 
 	/* enable Block Data Update */
-	err = regmap_update_bits(hw->regmap, ST_LSM6DSX_REG_BDU_ADDR,
-				 ST_LSM6DSX_REG_BDU_MASK,
-				 FIELD_PREP(ST_LSM6DSX_REG_BDU_MASK, 1));
+	reg = &hw->settings->bdu;
+	err = regmap_update_bits(hw->regmap, reg->addr, reg->mask,
+				 ST_LSM6DSX_SHIFT_VAL(1, reg->mask));
 	if (err < 0)
 		return err;