Re: [PATCH v9 09/11] Input: wacom_i2c - Allow flipping the values from the DT
From: Rob Herring <robh@kernel.org>
Date: 2021-08-23 18:15:16
Also in:
linux-devicetree, lkml
On Thu, Aug 19, 2021 at 01:49:33AM +1000, Alistair Francis wrote:
quoted hunk ↗ jump to hunk
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 <redacted> --- .../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
These all need descriptions.
+ + flip-tilt-y: + type: boolean + + flip-pos-x: + type: boolean + + flip-pos-y: + type: boolean + + flip-distance: + type: boolean + + flip-pressure: + type: boolean
I don't understand how you flip pressure?
quoted hunk ↗ jump to hunk
+ required: - compatible - regdiff --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
Use 'if (!IS_ENABLED(CONFIG_OF))' in the function and drop all the ifdefs.
quoted hunk ↗ jump to hunk
+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