Message ID | 20210818154935.1154-10-alistair@alistair23.me |
---|---|
State | New |
Headers | show |
Series | Add Wacom I2C support to rM2 | expand |
On Thu, Aug 19, 2021 at 01:49:33AM +1000, Alistair Francis wrote: > 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@alistair23.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 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? > + > 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 Use 'if (!IS_ENABLED(CONFIG_OF))' in the function and drop all the ifdefs. > +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 > >
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; }
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@alistair23.me> --- .../input/touchscreen/wacom,generic.yaml | 18 ++++++++++ drivers/input/touchscreen/wacom_i2c.c | 33 +++++++++++++++++++ 2 files changed, 51 insertions(+)