iio: imu: st_lsm6dsx: reload trimming parameter at bootstrap
authorLorenzo Bianconi <lorenzo.bianconi@redhat.com>
Sun, 11 Nov 2018 14:15:29 +0000 (15:15 +0100)
committerJonathan Cameron <Jonathan.Cameron@huawei.com>
Fri, 16 Nov 2018 18:32:32 +0000 (18:32 +0000)
Perform a complete device reset at bootstrap reloading trimming parameter
after sw reset is completed. Device sw reset/boot is explained here:
https://www.st.com/resource/en/application_note/dm00517282.pdf,
section 5.7

Signed-off-by: Lorenzo Bianconi <lorenzo.bianconi@redhat.com>
Signed-off-by: Jonathan Cameron <Jonathan.Cameron@huawei.com>
drivers/iio/imu/st_lsm6dsx/st_lsm6dsx_core.c

index c8b993b..961ce9d 100644 (file)
@@ -56,6 +56,7 @@
 #define ST_LSM6DSX_REG_WHOAMI_ADDR             0x0f
 #define ST_LSM6DSX_REG_RESET_ADDR              0x12
 #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)
 #define ST_LSM6DSX_REG_INT2_ON_INT1_ADDR       0x13
@@ -778,12 +779,23 @@ static int st_lsm6dsx_init_device(struct st_lsm6dsx_hw *hw)
        u8 drdy_int_reg;
        int err;
 
-       err = regmap_write(hw->regmap, ST_LSM6DSX_REG_RESET_ADDR,
-                          ST_LSM6DSX_REG_RESET_MASK);
+       /* device sw reset */
+       err = regmap_update_bits(hw->regmap, ST_LSM6DSX_REG_RESET_ADDR,
+                                ST_LSM6DSX_REG_RESET_MASK,
+                                FIELD_PREP(ST_LSM6DSX_REG_RESET_MASK, 1));
        if (err < 0)
                return err;
 
-       msleep(200);
+       msleep(50);
+
+       /* reload trimming parameter */
+       err = regmap_update_bits(hw->regmap, ST_LSM6DSX_REG_RESET_ADDR,
+                                ST_LSM6DSX_REG_BOOT_MASK,
+                                FIELD_PREP(ST_LSM6DSX_REG_BOOT_MASK, 1));
+       if (err < 0)
+               return err;
+
+       msleep(50);
 
        /* enable Block Data Update */
        err = regmap_update_bits(hw->regmap, ST_LSM6DSX_REG_BDU_ADDR,