ret = regmap_write(data->regmap, BMI160_REG_CMD, BMI160_CMD_SOFTRESET);
        if (ret)
-               return ret;
+               goto disable_regulator;
 
        usleep_range(BMI160_SOFTRESET_USLEEP, BMI160_SOFTRESET_USLEEP + 1);
 
        if (use_spi) {
                ret = regmap_read(data->regmap, BMI160_REG_DUMMY, &val);
                if (ret)
-                       return ret;
+                       goto disable_regulator;
        }
 
        ret = regmap_read(data->regmap, BMI160_REG_CHIP_ID, &val);
        if (ret) {
                dev_err(dev, "Error reading chip id\n");
-               return ret;
+               goto disable_regulator;
        }
        if (val != BMI160_CHIP_ID_VAL) {
                dev_err(dev, "Wrong chip id, got %x expected %x\n",
                        val, BMI160_CHIP_ID_VAL);
-               return -ENODEV;
+               ret = -ENODEV;
+               goto disable_regulator;
        }
 
        ret = bmi160_set_mode(data, BMI160_ACCEL, true);
        if (ret)
-               return ret;
+               goto disable_regulator;
 
        ret = bmi160_set_mode(data, BMI160_GYRO, true);
        if (ret)
-               return ret;
+               goto disable_accel;
 
        return 0;
+
+disable_accel:
+       bmi160_set_mode(data, BMI160_ACCEL, false);
+
+disable_regulator:
+       regulator_bulk_disable(ARRAY_SIZE(data->supplies), data->supplies);
+       return ret;
 }
 
 static int bmi160_data_rdy_trigger_set_state(struct iio_trigger *trig,