#define NVT_TS_PARAMS_CHIP_ID          0x0e
 #define NVT_TS_PARAMS_SIZE             0x0f
 
-#define NVT_TS_SUPPORTED_WAKE_TYPE     0x05
-#define NVT_TS_SUPPORTED_CHIP_ID       0x05
-
 #define NVT_TS_MAX_TOUCHES             10
 #define NVT_TS_MAX_SIZE                        4096
 
        IRQF_TRIGGER_HIGH
 };
 
+struct nvt_ts_i2c_chip_data {
+       u8 wake_type;
+       u8 chip_id;
+};
+
 struct nvt_ts_data {
        struct i2c_client *client;
        struct input_dev *input;
        struct gpio_desc *reset_gpio;
+       struct regulator_bulk_data regulators[2];
        struct touchscreen_properties prop;
        int max_touches;
        u8 buf[NVT_TS_TOUCH_SIZE * NVT_TS_MAX_TOUCHES];
 static int nvt_ts_start(struct input_dev *dev)
 {
        struct nvt_ts_data *data = input_get_drvdata(dev);
+       int error;
+
+       error = regulator_bulk_enable(ARRAY_SIZE(data->regulators), data->regulators);
+       if (error) {
+               dev_err(&data->client->dev, "failed to enable regulators\n");
+               return error;
+       }
 
        enable_irq(data->client->irq);
        gpiod_set_value_cansleep(data->reset_gpio, 0);
 
        disable_irq(data->client->irq);
        gpiod_set_value_cansleep(data->reset_gpio, 1);
+       regulator_bulk_disable(ARRAY_SIZE(data->regulators), data->regulators);
 }
 
 static int nvt_ts_suspend(struct device *dev)
        struct device *dev = &client->dev;
        int error, width, height, irq_type;
        struct nvt_ts_data *data;
+       const struct nvt_ts_i2c_chip_data *chip;
        struct input_dev *input;
 
        if (!client->irq) {
        if (!data)
                return -ENOMEM;
 
+       chip = device_get_match_data(&client->dev);
+       if (!chip)
+               return -EINVAL;
+
        data->client = client;
        i2c_set_clientdata(client, data);
 
+       /*
+        * VCC is the analog voltage supply
+        * IOVCC is the digital voltage supply
+        */
+       data->regulators[0].supply = "vcc";
+       data->regulators[1].supply = "iovcc";
+       error = devm_regulator_bulk_get(dev, ARRAY_SIZE(data->regulators), data->regulators);
+       if (error) {
+               dev_err(dev, "cannot get regulators: %d\n", error);
+               return error;
+       }
+
+       error = regulator_bulk_enable(ARRAY_SIZE(data->regulators), data->regulators);
+       if (error) {
+               dev_err(dev, "failed to enable regulators: %d\n", error);
+               return error;
+       }
+
        data->reset_gpio = devm_gpiod_get(dev, "reset", GPIOD_OUT_LOW);
        error = PTR_ERR_OR_ZERO(data->reset_gpio);
        if (error) {
+               regulator_bulk_disable(ARRAY_SIZE(data->regulators), data->regulators);
                dev_err(dev, "failed to request reset GPIO: %d\n", error);
                return error;
        }
        error = nvt_ts_read_data(data->client, NVT_TS_PARAMETERS_START,
                                 data->buf, NVT_TS_PARAMS_SIZE);
        gpiod_set_value_cansleep(data->reset_gpio, 1); /* Put back in reset */
+       regulator_bulk_disable(ARRAY_SIZE(data->regulators), data->regulators);
        if (error)
                return error;
 
        if (width > NVT_TS_MAX_SIZE || height >= NVT_TS_MAX_SIZE ||
            data->max_touches > NVT_TS_MAX_TOUCHES ||
            irq_type >= ARRAY_SIZE(nvt_ts_irq_type) ||
-           data->buf[NVT_TS_PARAMS_WAKE_TYPE] != NVT_TS_SUPPORTED_WAKE_TYPE ||
-           data->buf[NVT_TS_PARAMS_CHIP_ID] != NVT_TS_SUPPORTED_CHIP_ID) {
+           data->buf[NVT_TS_PARAMS_WAKE_TYPE] != chip->wake_type ||
+           data->buf[NVT_TS_PARAMS_CHIP_ID] != chip->chip_id) {
                dev_err(dev, "Unsupported touchscreen parameters: %*ph\n",
                        NVT_TS_PARAMS_SIZE, data->buf);
                return -EIO;
        return 0;
 }
 
+static const struct nvt_ts_i2c_chip_data nvt_nt11205_ts_data = {
+       .wake_type = 0x05,
+       .chip_id = 0x05,
+};
+
+static const struct nvt_ts_i2c_chip_data nvt_nt36672a_ts_data = {
+       .wake_type = 0x01,
+       .chip_id = 0x08,
+};
+
+static const struct of_device_id nvt_ts_of_match[] = {
+       { .compatible = "novatek,nt11205-ts", .data = &nvt_nt11205_ts_data },
+       { .compatible = "novatek,nt36672a-ts", .data = &nvt_nt36672a_ts_data },
+       { }
+};
+MODULE_DEVICE_TABLE(of, nvt_ts_of_match);
+
 static const struct i2c_device_id nvt_ts_i2c_id[] = {
-       { "nt11205-ts" },
+       { "nt11205-ts", (unsigned long) &nvt_nt11205_ts_data },
+       { "nt36672a-ts", (unsigned long) &nvt_nt36672a_ts_data },
        { }
 };
 MODULE_DEVICE_TABLE(i2c, nvt_ts_i2c_id);
        .driver = {
                .name   = "novatek-nvt-ts",
                .pm     = pm_sleep_ptr(&nvt_ts_pm_ops),
+               .of_match_table = nvt_ts_of_match,
        },
        .probe = nvt_ts_probe,
        .id_table = nvt_ts_i2c_id,