return result;
 }
 
-static int inv_mpu_core_enable_regulator(struct inv_mpu6050_state *st)
+static int inv_mpu_core_enable_regulator_vddio(struct inv_mpu6050_state *st)
 {
        int result;
 
        result = regulator_enable(st->vddio_supply);
        if (result) {
                dev_err(regmap_get_device(st->map),
-                       "Failed to enable regulator: %d\n", result);
+                       "Failed to enable vddio regulator: %d\n", result);
        } else {
                /* Give the device a little bit of time to start up. */
                usleep_range(35000, 70000);
        return result;
 }
 
-static int inv_mpu_core_disable_regulator(struct inv_mpu6050_state *st)
+static int inv_mpu_core_disable_regulator_vddio(struct inv_mpu6050_state *st)
 {
        int result;
 
        result = regulator_disable(st->vddio_supply);
        if (result)
                dev_err(regmap_get_device(st->map),
-                       "Failed to disable regulator: %d\n", result);
+                       "Failed to disable vddio regulator: %d\n", result);
 
        return result;
 }
 
 static void inv_mpu_core_disable_regulator_action(void *_data)
 {
-       inv_mpu_core_disable_regulator(_data);
+       struct inv_mpu6050_state *st = _data;
+       int result;
+
+       result = regulator_disable(st->vdd_supply);
+       if (result)
+               dev_err(regmap_get_device(st->map),
+                       "Failed to disable vdd regulator: %d\n", result);
+
+       inv_mpu_core_disable_regulator_vddio(st);
 }
 
 int inv_mpu_core_probe(struct regmap *regmap, int irq, const char *name,
                return -EINVAL;
        }
 
+       st->vdd_supply = devm_regulator_get(dev, "vdd");
+       if (IS_ERR(st->vdd_supply)) {
+               if (PTR_ERR(st->vdd_supply) != -EPROBE_DEFER)
+                       dev_err(dev, "Failed to get vdd regulator %d\n",
+                               (int)PTR_ERR(st->vdd_supply));
+
+               return PTR_ERR(st->vdd_supply);
+       }
+
        st->vddio_supply = devm_regulator_get(dev, "vddio");
        if (IS_ERR(st->vddio_supply)) {
                if (PTR_ERR(st->vddio_supply) != -EPROBE_DEFER)
                return PTR_ERR(st->vddio_supply);
        }
 
-       result = inv_mpu_core_enable_regulator(st);
-       if (result)
+       result = regulator_enable(st->vdd_supply);
+       if (result) {
+               dev_err(dev, "Failed to enable vdd regulator: %d\n", result);
                return result;
+       }
+
+       result = inv_mpu_core_enable_regulator_vddio(st);
+       if (result) {
+               regulator_disable(st->vdd_supply);
+               return result;
+       }
 
        result = devm_add_action_or_reset(dev, inv_mpu_core_disable_regulator_action,
                                 st);
        int result;
 
        mutex_lock(&st->lock);
-       result = inv_mpu_core_enable_regulator(st);
+       result = inv_mpu_core_enable_regulator_vddio(st);
        if (result)
                goto out_unlock;
 
 
        mutex_lock(&st->lock);
        result = inv_mpu6050_set_power_itg(st, false);
-       inv_mpu_core_disable_regulator(st);
+       inv_mpu_core_disable_regulator_vddio(st);
        mutex_unlock(&st->lock);
 
        return result;
 
  *  @chip_period:      chip internal period estimation (~1kHz).
  *  @it_timestamp:     timestamp from previous interrupt.
  *  @data_timestamp:   timestamp for next data sample.
- *  @vddio_supply      voltage regulator for the chip.
+ *  @vdd_supply:       VDD voltage regulator for the chip.
+ *  @vddio_supply      I/O voltage regulator for the chip.
  *  @magn_disabled:     magnetometer disabled for backward compatibility reason.
  *  @magn_raw_to_gauss:        coefficient to convert mag raw value to Gauss.
  *  @magn_orient:       magnetometer sensor chip orientation if available.
        s64 chip_period;
        s64 it_timestamp;
        s64 data_timestamp;
+       struct regulator *vdd_supply;
        struct regulator *vddio_supply;
        bool magn_disabled;
        s32 magn_raw_to_gauss[3];