Thread (12 messages) flat view 12 messages, 2 authors, 2021-12-08

Re: [PATCH 4/4] Input: goodix - Add pen support

From: Hans de Goede <hidden>
Date: 2021-12-08 17:02:39

Hi Dmitry,

On 12/8/21 09:51, Dmitry Torokhov wrote:
On Wed, Dec 8, 2021 at 12:37 AM Hans de Goede [off-list ref] wrote:
quoted
Hi Dmitry,

Thank you for the review.

On 12/7/21 18:50, Dmitry Torokhov wrote:
quoted
On Mon, Dec 06, 2021 at 05:47:47PM +0100, Hans de Goede wrote:
quoted
Some Goodix touchscreens have support for a (Goodix) active pen, add
support for this. The info on how to detect when a pen is down and to
detect when the stylus buttons are pressed was lifted from the out
of tree Goodix driver with pen support written by Adya:
https://gitlab.com/AdyaAdya/goodix-touchscreen-linux-driver/

Since there is no way to tell if pen support is present, the registering
of the pen input_dev is delayed till the first pen event is detected.

This has been tested on a Trekstor Surftab duo W1, a Chuwi Hi13 and
a Cyberbook T116 tablet.

Link: https://gitlab.com/AdyaAdya/goodix-touchscreen-linux-driver/
BugLink: https://bugzilla.kernel.org/show_bug.cgi?id=202161
BugLink: https://bugzilla.kernel.org/show_bug.cgi?id=204513
Signed-off-by: Hans de Goede <redacted>
---
 drivers/input/touchscreen/goodix.c | 122 ++++++++++++++++++++++++++++-
 drivers/input/touchscreen/goodix.h |   1 +
 2 files changed, 121 insertions(+), 2 deletions(-)
diff --git a/drivers/input/touchscreen/goodix.c b/drivers/input/touchscreen/goodix.c
index 2d38a941e7e4..691e4505cf4a 100644
--- a/drivers/input/touchscreen/goodix.c
+++ b/drivers/input/touchscreen/goodix.c
@@ -298,6 +298,107 @@ static int goodix_ts_read_input_report(struct goodix_ts_data *ts, u8 *data)
     return -ENOMSG;
 }

+static struct input_dev *goodix_create_pen_input(struct goodix_ts_data *ts)
+{
+    struct device *dev = &ts->client->dev;
+    struct input_dev *input;
+
+    input = devm_input_allocate_device(dev);
+    if (!input)
+            return NULL;
+
+    input_alloc_absinfo(input);
+    if (!input->absinfo) {
+            input_free_device(input);
+            return NULL;
+    }
Please drop this as input_abs_set_max() will do allocation and
input_register_device() will reject device with ABS_* events without
absinfo allocated.
quoted
+
+    input->absinfo[ABS_X] = ts->input_dev->absinfo[ABS_MT_POSITION_X];
      input_abs_set_max(input, ABS_X,
              input_abs_get_max(input, ABS_MT_POSITION_X);

or even maybe

      input_set_abs_params(input, ABS_X,
              0, input_abs_get_max(input, ABS_MT_POSITION_X), 0, 0);
The reason why I'm just copying the entire absinfo struct
(and thus need the NULL check above) is because this driver uses
touchscreen_parse_properties(), so the min and fuzz values
might (theoretically) also be set through device-properties and
I wanted to cover that.

Since you don't like the above approach, I will go with the following
for the next version:

        input_set_abs_params(input, ABS_X,
                             input_abs_get_min(ts->input_dev, ABS_MT_POSITION_X),
                             input_abs_get_max(ts->input_dev, ABS_MT_POSITION_X),
                             input_abs_get_fuzz(ts->input_dev, ABS_MT_POSITION_X),
                             input_abs_get_flat(ts->input_dev, ABS_MT_POSITION_X));

(and the same for the Y axis).
Ah, sorry, I misread the code. It is fine as is then, or we could even
consider adding input_copy_abs(input, axis, src) that would allocate
absinfo if needed, set capability, and do the copy.
Oh, I think that adding an input_copy_abs() helper for this is actually
a good idea. I'll do that for the next version (in a separate patch of course).

Regards,

Hans
Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help