[<prev] [next>] [<thread-prev] [thread-next>] [day] [month] [year] [list]
Message-Id: <20210818154935.1154-10-alistair@alistair23.me>
Date: Thu, 19 Aug 2021 01:49:33 +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 09/11] 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 | 18 ++++++++++
drivers/input/touchscreen/wacom_i2c.c | 33 +++++++++++++++++++
2 files changed, 51 insertions(+)
diff --git a/Documentation/devicetree/bindings/input/touchscreen/wacom,generic.yaml b/Documentation/devicetree/bindings/input/touchscreen/wacom,generic.yaml
index a8a7f362b0ce..0da63fd92ea1 100644
--- a/Documentation/devicetree/bindings/input/touchscreen/wacom,generic.yaml
+++ b/Documentation/devicetree/bindings/input/touchscreen/wacom,generic.yaml
@@ -25,6 +25,24 @@ properties:
vdd-supply:
description: Power Supply
+ flip-tilt-x:
+ type: boolean
+
+ flip-tilt-y:
+ type: boolean
+
+ flip-pos-x:
+ type: boolean
+
+ flip-pos-y:
+ type: boolean
+
+ flip-distance:
+ type: boolean
+
+ flip-pressure:
+ type: boolean
+
required:
- compatible
- reg
diff --git a/drivers/input/touchscreen/wacom_i2c.c b/drivers/input/touchscreen/wacom_i2c.c
index c6579a1a8d04..82b62a768451 100644
--- a/drivers/input/touchscreen/wacom_i2c.c
+++ b/drivers/input/touchscreen/wacom_i2c.c
@@ -72,6 +72,13 @@ 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;
+ bool flip_pressure;
};
static int wacom_query_device(struct i2c_client *client,
@@ -140,6 +147,20 @@ static int wacom_query_device(struct i2c_client *client,
return 0;
}
+#ifdef CONFIG_OF
+static void wacom_of_read(struct wacom_i2c *wac_i2c)
+{
+ 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");
+ wac_i2c->flip_pressure = of_property_read_bool(client->dev.of_node, "flip-pressure");
+}
+#endif
+
static irqreturn_t wacom_i2c_irq(int irq, void *dev_id)
{
struct wacom_i2c *wac_i2c = dev_id;
@@ -176,6 +197,14 @@ 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
+ pressure = wac_i2c->flip_pressure ? (features->pressure_max - pressure) : pressure;
+ 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);
@@ -303,6 +332,10 @@ static int wacom_i2c_probe(struct i2c_client *client,
return error;
}
+#ifdef CONFIG_OF
+ wacom_of_read(wac_i2c);
+#endif
+
return 0;
}
--
2.31.1
Powered by blists - more mailing lists