#include <linux/module.h>
 #include <linux/pm.h>
 #include <linux/regmap.h>
+#include <linux/regulator/consumer.h>
 #include <linux/slab.h>
 
 #include <linux/iio/buffer.h>
        struct i2c_client *client;
        struct iio_trigger *trig;
        struct regmap *regmap;
+       struct regulator_bulk_data supplies[2];
        /*
         * Last reading of the proximity status for each channel.
         * We only send an event to user space when this changes.
        return 0;
 }
 
+static void sx9310_regulator_disable(void *_data)
+{
+       struct sx9310_data *data = _data;
+
+       regulator_bulk_disable(ARRAY_SIZE(data->supplies), data->supplies);
+}
+
 static int sx9310_probe(struct i2c_client *client)
 {
        int ret;
 
        data = iio_priv(indio_dev);
        data->client = client;
+       data->supplies[0].supply = "vdd";
+       data->supplies[1].supply = "svdd";
        mutex_init(&data->mutex);
        init_completion(&data->completion);
 
        if (IS_ERR(data->regmap))
                return PTR_ERR(data->regmap);
 
+       ret = devm_regulator_bulk_get(dev, ARRAY_SIZE(data->supplies),
+                                     data->supplies);
+       if (ret)
+               return ret;
+
+       ret = regulator_bulk_enable(ARRAY_SIZE(data->supplies), data->supplies);
+       if (ret)
+               return ret;
+       /* Must wait for Tpor time after initial power up */
+       usleep_range(1000, 1100);
+
+       ret = devm_add_action_or_reset(dev, sx9310_regulator_disable, data);
+       if (ret)
+               return ret;
+
        ret = regmap_read(data->regmap, SX9310_REG_WHOAMI, &data->whoami);
        if (ret) {
                dev_err(dev, "error in reading WHOAMI register: %d", ret);