#include <linux/slab.h>
 #include <linux/mfd/core.h>
 #include <linux/delay.h>
+#include <linux/regulator/consumer.h>
 #include "stmpe.h"
 
 static int __stmpe_enable(struct stmpe *stmpe, unsigned int blocks)
        stmpe->variant = stmpe_variant_info[partnum];
        stmpe->regs = stmpe->variant->regs;
        stmpe->num_gpios = stmpe->variant->num_gpios;
+       stmpe->vcc = devm_regulator_get_optional(ci->dev, "vcc");
+       if (!IS_ERR(stmpe->vcc)) {
+               ret = regulator_enable(stmpe->vcc);
+               if (ret)
+                       dev_warn(ci->dev, "failed to enable VCC supply\n");
+       }
+       stmpe->vio = devm_regulator_get_optional(ci->dev, "vio");
+       if (!IS_ERR(stmpe->vio)) {
+               ret = regulator_enable(stmpe->vio);
+               if (ret)
+                       dev_warn(ci->dev, "failed to enable VIO supply\n");
+       }
        dev_set_drvdata(stmpe->dev, stmpe);
 
        if (ci->init)
 
 int stmpe_remove(struct stmpe *stmpe)
 {
+       if (!IS_ERR(stmpe->vio))
+               regulator_disable(stmpe->vio);
+       if (!IS_ERR(stmpe->vcc))
+               regulator_disable(stmpe->vcc);
+
        mfd_remove_devices(stmpe->dev);
 
        return 0;
 
 #include <linux/mutex.h>
 
 struct device;
+struct regulator;
 
 enum stmpe_block {
        STMPE_BLOCK_GPIO        = 1 << 0,
 
 /**
  * struct stmpe - STMPE MFD structure
+ * @vcc: optional VCC regulator
+ * @vio: optional VIO regulator
  * @lock: lock protecting I/O operations
  * @irq_lock: IRQ bus lock
  * @dev: device, mostly for dev_dbg()
  * @pdata: platform data
  */
 struct stmpe {
+       struct regulator *vcc;
+       struct regulator *vio;
        struct mutex lock;
        struct mutex irq_lock;
        struct device *dev;