iio: imu: st_lsm6dsx: check if master_enable is located in primary page
authorLorenzo Bianconi <lorenzo@kernel.org>
Sat, 14 Dec 2019 16:52:55 +0000 (17:52 +0100)
committerJonathan Cameron <Jonathan.Cameron@huawei.com>
Sun, 29 Dec 2019 15:20:06 +0000 (15:20 +0000)
Check if the master enable register is located in the primary or in the
secondary memory page. This is a preliminary patch to support i2c master
controller on lsm6dsm devices

Signed-off-by: Lorenzo Bianconi <lorenzo@kernel.org>
Signed-off-by: Jonathan Cameron <Jonathan.Cameron@huawei.com>
drivers/iio/imu/st_lsm6dsx/st_lsm6dsx.h
drivers/iio/imu/st_lsm6dsx/st_lsm6dsx_core.c
drivers/iio/imu/st_lsm6dsx/st_lsm6dsx_shub.c

index 140e4c6..bd1c77d 100644 (file)
@@ -184,7 +184,11 @@ struct st_lsm6dsx_hw_ts_settings {
  */
 struct st_lsm6dsx_shub_settings {
        struct st_lsm6dsx_reg page_mux;
-       struct st_lsm6dsx_reg master_en;
+       struct {
+               bool sec_page;
+               u8 addr;
+               u8 mask;
+       } master_en;
        struct st_lsm6dsx_reg pullup_en;
        struct st_lsm6dsx_reg aux_sens;
        struct st_lsm6dsx_reg wr_once;
index 91dc979..b8cfea9 100644 (file)
@@ -868,6 +868,7 @@ static const struct st_lsm6dsx_settings st_lsm6dsx_sensor_settings[] = {
                                .mask = BIT(6),
                        },
                        .master_en = {
+                               .sec_page = true,
                                .addr = 0x14,
                                .mask = BIT(2),
                        },
@@ -1243,6 +1244,7 @@ static const struct st_lsm6dsx_settings st_lsm6dsx_sensor_settings[] = {
                                .mask = BIT(6),
                        },
                        .master_en = {
+                               .sec_page = true,
                                .addr = 0x14,
                                .mask = BIT(2),
                        },
index 5684e66..767482e 100644 (file)
@@ -185,15 +185,18 @@ static int st_lsm6dsx_shub_master_enable(struct st_lsm6dsx_sensor *sensor,
        mutex_lock(&hw->page_lock);
 
        hub_settings = &hw->settings->shub_settings;
-       err = st_lsm6dsx_set_page(hw, true);
-       if (err < 0)
-               goto out;
+       if (hub_settings->master_en.sec_page) {
+               err = st_lsm6dsx_set_page(hw, true);
+               if (err < 0)
+                       goto out;
+       }
 
        data = ST_LSM6DSX_SHIFT_VAL(enable, hub_settings->master_en.mask);
        err = regmap_update_bits(hw->regmap, hub_settings->master_en.addr,
                                 hub_settings->master_en.mask, data);
 
-       st_lsm6dsx_set_page(hw, false);
+       if (hub_settings->master_en.sec_page)
+               st_lsm6dsx_set_page(hw, false);
 out:
        mutex_unlock(&hw->page_lock);