@@ -13,6 +13,7 @@
#include <linux/irq.h>
#include <linux/input/touchscreen.h>
#include <linux/interrupt.h>
+#include <linux/regulator/consumer.h>
#include <linux/reset.h>
#include <linux/of.h>
#include <asm/unaligned.h>
@@ -92,6 +93,7 @@ struct wacom_i2c {
struct input_dev *input;
struct touchscreen_properties props;
struct wacom_features features;
+ struct regulator *vdd;
u8 data[WACOM_QUERY_SIZE];
bool prox;
int tool;
@@ -278,6 +280,16 @@ static int wacom_i2c_probe(struct i2c_client *client,
if (!wac_i2c)
return -ENOMEM;
+ wac_i2c->vdd = regulator_get(&client->dev, "vdd");
+ if (IS_ERR(wac_i2c->vdd))
+ return PTR_ERR(wac_i2c->vdd);
+
+ error = regulator_enable(wac_i2c->vdd);
+ if (error) {
+ regulator_put(wac_i2c->vdd);
+ return error;
+ }
+
features = &wac_i2c->features;
error = wacom_query_device(client, features);
if (error)
@@ -286,8 +298,11 @@ static int wacom_i2c_probe(struct i2c_client *client,
wac_i2c->client = client;
input = devm_input_allocate_device(dev);
- if (!input)
+ if (!input) {
+ regulator_disable(wac_i2c->vdd);
+ regulator_put(wac_i2c->vdd);
return -ENOMEM;
+ }
wac_i2c->input = input;
@@ -322,6 +337,8 @@ static int wacom_i2c_probe(struct i2c_client *client,
IRQF_ONESHOT, "wacom_i2c", wac_i2c);
if (error) {
dev_err(dev, "Failed to request IRQ: %d\n", error);
+ regulator_disable(wac_i2c->vdd);
+ regulator_put(wac_i2c->vdd);
return error;
}
@@ -331,6 +348,8 @@ static int wacom_i2c_probe(struct i2c_client *client,
error = input_register_device(wac_i2c->input);
if (error) {
dev_err(dev, "Failed to register input device: %d\n", error);
+ regulator_disable(wac_i2c->vdd);
+ regulator_put(wac_i2c->vdd);
return error;
}
Add support for a VDD regulator. This allows the kernel to probe the Wacom-I2C device on the rM2. Signed-off-by: Alistair Francis <alistair@alistair23.me> --- drivers/input/touchscreen/wacom_i2c.c | 21 ++++++++++++++++++++- 1 file changed, 20 insertions(+), 1 deletion(-)