#include <linux/iio/trigger_consumer.h>
 #include <linux/iio/triggered_buffer.h>
 #include <linux/regmap.h>
+#include <linux/regulator/consumer.h>
 
 #include "bmc150_magn.h"
 
         */
        struct mutex mutex;
        struct regmap *regmap;
+       struct regulator_bulk_data regulators[2];
        struct iio_mount_matrix orientation;
        /* 4 x 32 bits for x, y z, 4 bytes align, 64 bits timestamp */
        s32 buffer[6];
        int ret, chip_id;
        struct bmc150_magn_preset preset;
 
+       ret = regulator_bulk_enable(ARRAY_SIZE(data->regulators),
+                                   data->regulators);
+       if (ret < 0) {
+               dev_err(data->dev, "Failed to enable regulators: %d\n", ret);
+               return ret;
+       }
+       /*
+        * 3ms power-on time according to datasheet, let's better
+        * be safe than sorry and set this delay to 5ms.
+        */
+       msleep(5);
+
        ret = bmc150_magn_set_power_mode(data, BMC150_MAGN_POWER_MODE_SUSPEND,
                                         false);
        if (ret < 0) {
                dev_err(data->dev,
                        "Failed to bring up device from suspend mode\n");
-               return ret;
+               goto err_regulator_disable;
        }
 
        ret = regmap_read(data->regmap, BMC150_MAGN_REG_CHIP_ID, &chip_id);
 
 err_poweroff:
        bmc150_magn_set_power_mode(data, BMC150_MAGN_POWER_MODE_SUSPEND, true);
+err_regulator_disable:
+       regulator_bulk_disable(ARRAY_SIZE(data->regulators), data->regulators);
        return ret;
 }
 
        data->irq = irq;
        data->dev = dev;
 
+       data->regulators[0].supply = "vdd";
+       data->regulators[1].supply = "vddio";
+       ret = devm_regulator_bulk_get(dev, ARRAY_SIZE(data->regulators),
+                                     data->regulators);
+       if (ret)
+               return dev_err_probe(dev, ret, "failed to get regulators\n");
+
        ret = iio_read_mount_matrix(dev, "mount-matrix",
                                &data->orientation);
        if (ret)
        bmc150_magn_set_power_mode(data, BMC150_MAGN_POWER_MODE_SUSPEND, true);
        mutex_unlock(&data->mutex);
 
+       regulator_bulk_disable(ARRAY_SIZE(data->regulators), data->regulators);
        return 0;
 }
 EXPORT_SYMBOL(bmc150_magn_remove);