[<prev] [next>] [<thread-prev] [thread-next>] [day] [month] [year] [list]
Message-Id: <20210829091925.190-12-alistair@alistair23.me>
Date: Sun, 29 Aug 2021 19:19:23 +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 v10 10/12] Input: wacom_i2c - Allow flipping the values from the DT
Allow the device tree properties to flip the tilx, position or distance
values.
This is required for the stylus to work correctly on the reMarkable 2.
Signed-off-by: Alistair Francis <alistair@...stair23.me>
---
.../input/touchscreen/wacom,generic.yaml | 20 +++++++++++
drivers/input/touchscreen/wacom_i2c.c | 34 +++++++++++++++++++
2 files changed, 54 insertions(+)
diff --git a/Documentation/devicetree/bindings/input/touchscreen/wacom,generic.yaml b/Documentation/devicetree/bindings/input/touchscreen/wacom,generic.yaml
index a8a7f362b0ce..d451c9a235b6 100644
--- a/Documentation/devicetree/bindings/input/touchscreen/wacom,generic.yaml
+++ b/Documentation/devicetree/bindings/input/touchscreen/wacom,generic.yaml
@@ -25,6 +25,26 @@ properties:
vdd-supply:
description: Power Supply
+ flip-tilt-x:
+ type: boolean
+ description: Flip the tilt X values read from device
+
+ flip-tilt-y:
+ type: boolean
+ description: Flip the tilt Y values read from device
+
+ flip-pos-x:
+ type: boolean
+ description: Flip the X position values read from device
+
+ flip-pos-y:
+ type: boolean
+ description: Flip the Y position values read from device
+
+ flip-distance:
+ type: boolean
+ description: Flip the distance values read from device
+
required:
- compatible
- reg
diff --git a/drivers/input/touchscreen/wacom_i2c.c b/drivers/input/touchscreen/wacom_i2c.c
index f78a43212901..dd8fa351c6e4 100644
--- a/drivers/input/touchscreen/wacom_i2c.c
+++ b/drivers/input/touchscreen/wacom_i2c.c
@@ -105,6 +105,12 @@ struct wacom_i2c {
u8 data[WACOM_QUERY_SIZE];
bool prox;
int tool;
+
+ bool flip_tilt_x;
+ bool flip_tilt_y;
+ bool flip_pos_x;
+ bool flip_pos_y;
+ bool flip_distance;
};
static int wacom_query_device(struct i2c_client *client,
@@ -198,6 +204,25 @@ static int wacom_query_device(struct i2c_client *client,
return 0;
}
+static void wacom_of_read(struct wacom_i2c *wac_i2c)
+{
+ if (!IS_ENABLED(CONFIG_OF)) {
+ struct i2c_client *client = wac_i2c->client;
+
+ wac_i2c->flip_tilt_x = of_property_read_bool(client->dev.of_node, "flip-tilt-x");
+ wac_i2c->flip_tilt_y = of_property_read_bool(client->dev.of_node, "flip-tilt-y");
+ wac_i2c->flip_pos_x = of_property_read_bool(client->dev.of_node, "flip-pos-x");
+ wac_i2c->flip_pos_y = of_property_read_bool(client->dev.of_node, "flip-pos-y");
+ wac_i2c->flip_distance = of_property_read_bool(client->dev.of_node, "flip-distance");
+ } else {
+ wac_i2c->flip_tilt_x = false;
+ wac_i2c->flip_tilt_y = false;
+ wac_i2c->flip_pos_x = false;
+ wac_i2c->flip_pos_y = false;
+ wac_i2c->flip_distance = false;
+ }
+}
+
static irqreturn_t wacom_i2c_irq(int irq, void *dev_id)
{
struct wacom_i2c *wac_i2c = dev_id;
@@ -234,6 +259,13 @@ static irqreturn_t wacom_i2c_irq(int irq, void *dev_id)
wac_i2c->prox = data[3] & 0x20;
+ // Flip the values based on properties from the device tree
+ distance = wac_i2c->flip_distance ? -distance : distance;
+ x = wac_i2c->flip_pos_x ? (features->x_max - x) : x;
+ y = wac_i2c->flip_pos_y ? (features->y_max - y) : y;
+ tilt_x = wac_i2c->flip_tilt_x ? -tilt_x : tilt_x;
+ tilt_y = wac_i2c->flip_tilt_y ? -tilt_y : tilt_y;
+
touchscreen_report_pos(input, &wac_i2c->props, features->x_max,
features->y_max, true);
input_report_key(input, BTN_TOUCH, tsw || ers);
@@ -361,6 +393,8 @@ static int wacom_i2c_probe(struct i2c_client *client,
return error;
}
+ wacom_of_read(wac_i2c);
+
return 0;
}
--
2.31.1
Powered by blists - more mailing lists