iio: imu: mpu6050: add level shifter flag
authorAndreas Kemnade <andreas@kemnade.info>
Wed, 27 Sep 2023 17:32:44 +0000 (19:32 +0200)
committerJonathan Cameron <Jonathan.Cameron@huawei.com>
Thu, 5 Oct 2023 13:44:06 +0000 (14:44 +0100)
Some boards fail in magnetometer probe if level shifter flag is not set,
definition was found in the vendor Linux kernel v3.0.

Signed-off-by: Andreas Kemnade <andreas@kemnade.info>
Reviewed-by: Andy Shevchenko <andy.shevchenko@gmail.com>
Acked-by: Jean-Baptiste Maneyrol <jean-baptiste.maneyrol@tdk.com>
Link: https://lore.kernel.org/r/20230927173245.2151083-3-andreas@kemnade.info
Signed-off-by: Jonathan Cameron <Jonathan.Cameron@huawei.com>
drivers/iio/imu/inv_mpu6050/inv_mpu_aux.c
drivers/iio/imu/inv_mpu6050/inv_mpu_core.c
drivers/iio/imu/inv_mpu6050/inv_mpu_iio.h

index 7327e5723f961e5c96f080210cde6171c4a89b4a..8a7f2911905afc4f37cea764a358da57ef8a3939 100644 (file)
@@ -71,6 +71,19 @@ int inv_mpu_aux_init(const struct inv_mpu6050_state *st)
        unsigned int val;
        int ret;
 
+       /*
+        * Code based on the vendor Linux kernel v3.0,
+        * the exact meaning is unknown.
+        */
+       if (st->chip_type == INV_MPU9150) {
+               unsigned int mask = BIT(7);
+
+               val = st->level_shifter ? mask : 0;
+               ret = regmap_update_bits(st->map, 0x1, mask, val);
+               if (ret)
+                       return ret;
+       }
+
        /* configure i2c master */
        val = INV_MPU6050_BITS_I2C_MST_CLK_400KHZ |
                        INV_MPU6050_BIT_WAIT_FOR_ES;
index 29f906c884bd8b25b36b8aa9dd9eb03bcc9a35a8..3fbeef1a70186bf0c7b969f4c52219d7344bf112 100644 (file)
@@ -17,6 +17,7 @@
 #include <linux/regulator/consumer.h>
 #include <linux/pm.h>
 #include <linux/pm_runtime.h>
+#include <linux/property.h>
 
 #include <linux/iio/common/inv_sensors_timestamp.h>
 #include <linux/iio/iio.h>
@@ -1495,6 +1496,8 @@ int inv_mpu_core_probe(struct regmap *regmap, int irq, const char *name,
        st->irq = irq;
        st->map = regmap;
 
+       st->level_shifter = device_property_read_bool(dev,
+                                                     "invensense,level-shifter");
        pdata = dev_get_platdata(dev);
        if (!pdata) {
                result = iio_read_mount_matrix(dev, &st->orientation);
index 95f548235de7be1da4ceb60b223074ea21532606..5950e2419ebb505c8ec84609ee5bcd80ee6ab5b6 100644 (file)
@@ -203,6 +203,7 @@ struct inv_mpu6050_state {
        s32 magn_raw_to_gauss[3];
        struct iio_mount_matrix magn_orient;
        unsigned int suspended_sensors;
+       bool level_shifter;
        u8 *data;
 };