This is based on the out of tree rM2 driver.

Signed-off-by: Alistair Francis <alist...@alistair23.me>
---
 drivers/input/touchscreen/wacom_i2c.c | 25 +++++++++++++++++++++++--
 1 file changed, 23 insertions(+), 2 deletions(-)

diff --git a/drivers/input/touchscreen/wacom_i2c.c 
b/drivers/input/touchscreen/wacom_i2c.c
index ee1829dd35f4..3b4bc514dc3f 100644
--- a/drivers/input/touchscreen/wacom_i2c.c
+++ b/drivers/input/touchscreen/wacom_i2c.c
@@ -22,12 +22,16 @@
 #define WACOM_CMD_QUERY3       0x02
 #define WACOM_CMD_THROW0       0x05
 #define WACOM_CMD_THROW1       0x00
-#define WACOM_QUERY_SIZE       19
+#define WACOM_QUERY_SIZE       22
 
 struct wacom_features {
        int x_max;
        int y_max;
        int pressure_max;
+       int distance_max;
+       int distance_physical_max;
+       int tilt_x_max;
+       int tilt_y_max;
        char fw_version;
 };
 
@@ -79,6 +83,10 @@ static int wacom_query_device(struct i2c_client *client,
        features->y_max = get_unaligned_le16(&data[5]);
        features->pressure_max = get_unaligned_le16(&data[11]);
        features->fw_version = get_unaligned_le16(&data[13]);
+       features->distance_max = data[15];
+       features->distance_physical_max = data[16];
+       features->tilt_x_max = get_unaligned_le16(&data[17]);
+       features->tilt_y_max = get_unaligned_le16(&data[19]);
 
        dev_dbg(&client->dev,
                "x_max:%d, y_max:%d, pressure:%d, fw:%d\n",
@@ -95,6 +103,7 @@ static irqreturn_t wacom_i2c_irq(int irq, void *dev_id)
        u8 *data = wac_i2c->data;
        unsigned int x, y, pressure;
        unsigned char tsw, f1, f2, ers;
+       short tilt_x, tilt_y, distance;
        int error;
 
        error = i2c_master_recv(wac_i2c->client,
@@ -109,6 +118,11 @@ static irqreturn_t wacom_i2c_irq(int irq, void *dev_id)
        x = le16_to_cpup((__le16 *)&data[4]);
        y = le16_to_cpup((__le16 *)&data[6]);
        pressure = le16_to_cpup((__le16 *)&data[8]);
+       distance = data[10];
+
+       /* Signed */
+       tilt_x = le16_to_cpup((__le16 *)&data[11]);
+       tilt_y = le16_to_cpup((__le16 *)&data[13]);
 
        if (!wac_i2c->prox)
                wac_i2c->tool = (data[3] & 0x0c) ?
@@ -123,6 +137,9 @@ static irqreturn_t wacom_i2c_irq(int irq, void *dev_id)
        input_report_abs(input, ABS_X, x);
        input_report_abs(input, ABS_Y, y);
        input_report_abs(input, ABS_PRESSURE, pressure);
+       input_report_abs(input, ABS_DISTANCE, distance);
+       input_report_abs(input, ABS_TILT_X, tilt_x);
+       input_report_abs(input, ABS_TILT_Y, tilt_y);
        input_sync(input);
 
 out:
@@ -197,7 +214,11 @@ static int wacom_i2c_probe(struct i2c_client *client,
        input_set_abs_params(input, ABS_Y, 0, features.y_max, 0, 0);
        input_set_abs_params(input, ABS_PRESSURE,
                             0, features.pressure_max, 0, 0);
-
+       input_set_abs_params(input, ABS_DISTANCE, 0, features.distance_max, 0, 
0);
+       input_set_abs_params(input, ABS_TILT_X, -features.tilt_x_max,
+                            features.tilt_x_max, 0, 0);
+       input_set_abs_params(input, ABS_TILT_Y, -features.tilt_y_max,
+                            features.tilt_y_max, 0, 0);
        input_set_drvdata(input, wac_i2c);
 
        error = request_threaded_irq(client->irq, NULL, wacom_i2c_irq,
-- 
2.31.0

Reply via email to