#include <linux/of.h>
 #include <linux/property.h>
 #include <linux/slab.h>
+#include <linux/regulator/consumer.h>
 #include <linux/gpio/consumer.h>
 #include <asm/unaligned.h>
 #include <media/v4l2-device.h>
        u8 multitouch;
        struct t7_config t7_cfg;
        struct mxt_dbg dbg;
+       struct regulator_bulk_data regulators[2];
        struct gpio_desc *reset_gpio;
        bool use_retrigen_workaround;
 
        if (error)
                return error;
 
+       /*
+        * VDDA is the analog voltage supply 2.57..3.47 V
+        * VDD  is the digital voltage supply 1.71..3.47 V
+        */
+       data->regulators[0].supply = "vdda";
+       data->regulators[1].supply = "vdd";
+       error = devm_regulator_bulk_get(&client->dev, ARRAY_SIZE(data->regulators),
+                                       data->regulators);
+       if (error) {
+               if (error != -EPROBE_DEFER)
+                       dev_err(&client->dev, "Failed to get regulators %d\n",
+                               error);
+               return error;
+       }
+
        /* Request the RESET line as asserted so we go into reset */
        data->reset_gpio = devm_gpiod_get_optional(&client->dev,
                                                   "reset", GPIOD_OUT_HIGH);
 
        disable_irq(client->irq);
 
+       error = regulator_bulk_enable(ARRAY_SIZE(data->regulators),
+                                     data->regulators);
+       if (error) {
+               dev_err(&client->dev, "failed to enable regulators: %d\n",
+                       error);
+               return error;
+       }
+       /*
+        * The device takes 40ms to come up after power-on according
+        * to the mXT224 datasheet, page 13.
+        */
+       msleep(MXT_BACKUP_TIME);
+
        if (data->reset_gpio) {
                /* Wait a while and then de-assert the RESET GPIO line */
                msleep(MXT_RESET_GPIO_TIME);
 
        error = mxt_initialize(data);
        if (error)
-               return error;
+               goto err_disable_regulators;
 
        error = sysfs_create_group(&client->dev.kobj, &mxt_attr_group);
        if (error) {
 err_free_object:
        mxt_free_input_device(data);
        mxt_free_object_table(data);
+err_disable_regulators:
+       regulator_bulk_disable(ARRAY_SIZE(data->regulators),
+                              data->regulators);
        return error;
 }
 
        sysfs_remove_group(&client->dev.kobj, &mxt_attr_group);
        mxt_free_input_device(data);
        mxt_free_object_table(data);
+       regulator_bulk_disable(ARRAY_SIZE(data->regulators),
+                              data->regulators);
 
        return 0;
 }