]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
Input: MT - add INPUT_MT_TOTAL_FORCE flags
authorAngela Czubak <aczubak@google.com>
Mon, 18 Aug 2025 23:08:50 +0000 (23:08 +0000)
committerBenjamin Tissoires <bentiss@kernel.org>
Mon, 15 Sep 2025 12:32:55 +0000 (14:32 +0200)
Add a flag to generate ABS_PRESSURE as sum of ABS_MT_PRESSURE across
all slots.
This flag should be set if one knows a device reports true force and would
like to report total force to the userspace.

Signed-off-by: Angela Czubak <aczubak@google.com>
Co-developed-by: Jonathan Denose <jdenose@google.com>
Signed-off-by: Jonathan Denose <jdenose@google.com>
Acked-by: Dmitry Torokhov <dmitry.torokhov@gmail.com>
Signed-off-by: Benjamin Tissoires <bentiss@kernel.org>
drivers/input/input-mt.c
include/linux/input/mt.h

index 337006dd9dcf72ef2eeb8580e4dd83babf8100be..09f518897d4a71a4a7625367dc2c652ee6035d98 100644 (file)
@@ -198,6 +198,7 @@ void input_mt_report_pointer_emulation(struct input_dev *dev, bool use_count)
        struct input_mt *mt = dev->mt;
        struct input_mt_slot *oldest;
        int oldid, count, i;
+       int p, reported_p = 0;
 
        if (!mt)
                return;
@@ -216,6 +217,13 @@ void input_mt_report_pointer_emulation(struct input_dev *dev, bool use_count)
                        oldest = ps;
                        oldid = id;
                }
+               if (test_bit(ABS_MT_PRESSURE, dev->absbit)) {
+                       p = input_mt_get_value(ps, ABS_MT_PRESSURE);
+                       if (mt->flags & INPUT_MT_TOTAL_FORCE)
+                               reported_p += p;
+                       else if (oldid == id)
+                               reported_p = p;
+               }
                count++;
        }
 
@@ -245,10 +253,8 @@ void input_mt_report_pointer_emulation(struct input_dev *dev, bool use_count)
                input_event(dev, EV_ABS, ABS_X, x);
                input_event(dev, EV_ABS, ABS_Y, y);
 
-               if (test_bit(ABS_MT_PRESSURE, dev->absbit)) {
-                       int p = input_mt_get_value(oldest, ABS_MT_PRESSURE);
-                       input_event(dev, EV_ABS, ABS_PRESSURE, p);
-               }
+               if (test_bit(ABS_MT_PRESSURE, dev->absbit))
+                       input_event(dev, EV_ABS, ABS_PRESSURE, reported_p);
        } else {
                if (test_bit(ABS_MT_PRESSURE, dev->absbit))
                        input_event(dev, EV_ABS, ABS_PRESSURE, 0);
index 2cf89a538b18bbc7c99c8705c2d22bdc95065238..d30286298a00a356bc9db954ae362f034cdd359b 100644 (file)
@@ -17,6 +17,7 @@
 #define INPUT_MT_DROP_UNUSED   0x0004  /* drop contacts not seen in frame */
 #define INPUT_MT_TRACK         0x0008  /* use in-kernel tracking */
 #define INPUT_MT_SEMI_MT       0x0010  /* semi-mt device, finger count handled manually */
+#define INPUT_MT_TOTAL_FORCE   0x0020  /* calculate total force from slots pressure */
 
 /**
  * struct input_mt_slot - represents the state of an input MT slot