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;
 
 #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>
        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);
 
        s32 magn_raw_to_gauss[3];
        struct iio_mount_matrix magn_orient;
        unsigned int suspended_sensors;
+       bool level_shifter;
        u8 *data;
 };