iio: imu: st_lsm6dsx: Add sensor hub device LIS3MDL
authorJimmy Assarsson <jimmyassarsson@gmail.com>
Sat, 28 Mar 2020 18:45:19 +0000 (19:45 +0100)
committerJonathan Cameron <Jonathan.Cameron@huawei.com>
Sun, 19 Apr 2020 15:56:26 +0000 (16:56 +0100)
Add LIS3MDL register map to sensor hub device table.
Tested with LSM6DSM.

Signed-off-by: Jimmy Assarsson <jimmyassarsson@gmail.com>
Signed-off-by: Jonathan Cameron <Jonathan.Cameron@huawei.com>
drivers/iio/imu/st_lsm6dsx/st_lsm6dsx_shub.c

index a9d3f0a..280925d 100644 (file)
@@ -28,6 +28,7 @@
 #include <linux/iio/sysfs.h>
 #include <linux/bitfield.h>
 
+#include <linux/iio/common/st_sensors.h>
 #include "st_lsm6dsx.h"
 
 #define ST_LSM6DSX_SLV_ADDR(n, base)           ((base) + (n) * 3)
@@ -88,6 +89,69 @@ static const struct st_lsm6dsx_ext_dev_settings st_lsm6dsx_ext_dev_table[] = {
                        .len = 6,
                },
        },
+       /* LIS3MDL */
+       {
+               .i2c_addr = { 0x1e },
+               .wai = {
+                       .addr = ST_SENSORS_DEFAULT_WAI_ADDRESS,
+                       .val = 0x3d,
+               },
+               .id = ST_LSM6DSX_ID_MAGN,
+               .odr_table = {
+                       .reg = {
+                               .addr = 0x20,
+                               .mask = GENMASK(4, 2),
+                       },
+                       .odr_avl[0] = {  1000, 0x0 },
+                       .odr_avl[1] = {  2000, 0x1 },
+                       .odr_avl[2] = {  3000, 0x2 },
+                       .odr_avl[3] = {  5000, 0x3 },
+                       .odr_avl[4] = { 10000, 0x4 },
+                       .odr_avl[5] = { 20000, 0x5 },
+                       .odr_avl[6] = { 40000, 0x6 },
+                       .odr_avl[7] = { 80000, 0x7 },
+                       .odr_len = 8,
+               },
+               .fs_table = {
+                       .reg = {
+                               .addr = 0x21,
+                               .mask = GENMASK(6, 5),
+                       },
+                       .fs_avl[0] = {
+                               .gain = 146,
+                               .val = 0x00,
+                       }, /* 4000 uG/LSB */
+                       .fs_avl[1] = {
+                               .gain = 292,
+                               .val = 0x01,
+                       }, /* 8000 uG/LSB */
+                       .fs_avl[2] = {
+                               .gain = 438,
+                               .val = 0x02,
+                       }, /* 12000 uG/LSB */
+                       .fs_avl[3] = {
+                               .gain = 584,
+                               .val = 0x03,
+                       }, /* 16000 uG/LSB */
+                       .fs_len = 4,
+               },
+               .pwr_table = {
+                       .reg = {
+                               .addr = 0x22,
+                               .mask = GENMASK(1, 0),
+                       },
+                       .off_val = 0x2,
+                       .on_val = 0x0,
+               },
+               .bdu = {
+                       .addr = 0x24,
+                       .mask = BIT(6),
+               },
+               .out = {
+                       .addr = 0x28,
+                       .len = 6,
+               },
+       },
 };
 
 static void st_lsm6dsx_shub_wait_complete(struct st_lsm6dsx_hw *hw)