[<prev] [next>] [<thread-prev] [thread-next>] [day] [month] [year] [list]
Message-Id: <20210818154935.1154-8-alistair@alistair23.me>
Date: Thu, 19 Aug 2021 01:49:31 +1000
From: Alistair Francis <alistair@...stair23.me>
To: dmitry.torokhov@...il.com, linux-input@...r.kernel.org,
linux-imx@....com, kernel@...gutronix.de, pinglinux@...il.com,
tatsunosuke.tobita@...om.com, junkpainting@...il.com,
ping.cheng@...om.com
Cc: linux-kernel@...r.kernel.org, alistair23@...il.com,
robh+dt@...nel.org, devicetree@...r.kernel.org,
Alistair Francis <alistair@...stair23.me>
Subject: [PATCH v9 07/11] Input: wacom_i2c - Add support for vdd regulator
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@...stair23.me>
---
drivers/input/touchscreen/wacom_i2c.c | 21 ++++++++++++++++++++-
1 file changed, 20 insertions(+), 1 deletion(-)
diff --git a/drivers/input/touchscreen/wacom_i2c.c b/drivers/input/touchscreen/wacom_i2c.c
index 33a3ba110171..fd486b8ef2cc 100644
--- a/drivers/input/touchscreen/wacom_i2c.c
+++ b/drivers/input/touchscreen/wacom_i2c.c
@@ -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>
@@ -59,6 +60,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;
@@ -220,6 +222,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)
@@ -228,8 +240,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;
@@ -264,6 +279,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;
}
@@ -273,6 +290,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;
}
--
2.31.1
Powered by blists - more mailing lists