aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/input
diff options
context:
space:
mode:
authorHans de Goede <hdegoede@redhat.com>2014-12-18 12:53:34 -0500
committerDmitry Torokhov <dmitry.torokhov@gmail.com>2014-12-18 13:01:17 -0500
commit7091c443dda8c6c6d8e70e33452252f9ad3e7814 (patch)
tree0c7b1f2608e6d9cdad8d9e0864bedf686d113551 /drivers/input
parent8b23811535d2e1dd6abbe4ce6ea1edfd50ce72de (diff)
Input: alps - v7: sometimes a single touch is reported in mt[1]
The v7 proto differentiates between a primary touch (with high precision) and a secondary touch (with lower precision). Normally when 2 fingers are down and one is lifted the still present touch becomes the primary touch, but some traces have shown that this does not happen always. This commit deals with this by making alps_get_mt_count() not stop at the first empty mt slot, and if a touch is present in mt[1] and not mt[0] moving the data to mt[0] (for input_mt_assign_slots). BugLink: https://bugs.freedesktop.org/show_bug.cgi?id=86338 Cc: stable@vger.kernel.org # 3.17 Signed-off-by: Hans de Goede <hdegoede@redhat.com> Tested-by: Benjamin Tissoires <benjamin.tissoires@redhat.com> Signed-off-by: Dmitry Torokhov <dmitry.torokhov@gmail.com>
Diffstat (limited to 'drivers/input')
-rw-r--r--drivers/input/mouse/alps.c18
1 files changed, 14 insertions, 4 deletions
diff --git a/drivers/input/mouse/alps.c b/drivers/input/mouse/alps.c
index 49e62201bb6b..bfa62a63942f 100644
--- a/drivers/input/mouse/alps.c
+++ b/drivers/input/mouse/alps.c
@@ -919,12 +919,14 @@ static void alps_get_finger_coordinate_v7(struct input_mt_pos *mt,
919 919
920static int alps_get_mt_count(struct input_mt_pos *mt) 920static int alps_get_mt_count(struct input_mt_pos *mt)
921{ 921{
922 int i; 922 int i, fingers = 0;
923 923
924 for (i = 0; i < MAX_TOUCHES && mt[i].x != 0 && mt[i].y != 0; i++) 924 for (i = 0; i < MAX_TOUCHES; i++) {
925 /* empty */; 925 if (mt[i].x != 0 || mt[i].y != 0)
926 fingers++;
927 }
926 928
927 return i; 929 return fingers;
928} 930}
929 931
930static int alps_decode_packet_v7(struct alps_fields *f, 932static int alps_decode_packet_v7(struct alps_fields *f,
@@ -970,6 +972,14 @@ static int alps_decode_packet_v7(struct alps_fields *f,
970 else /* pkt_id == V7_PACKET_ID_MULTI */ 972 else /* pkt_id == V7_PACKET_ID_MULTI */
971 f->fingers = 3 + (p[5] & 0x03); 973 f->fingers = 3 + (p[5] & 0x03);
972 974
975 /* Sometimes a single touch is reported in mt[1] rather then mt[0] */
976 if (f->fingers == 1 && f->mt[0].x == 0 && f->mt[0].y == 0) {
977 f->mt[0].x = f->mt[1].x;
978 f->mt[0].y = f->mt[1].y;
979 f->mt[1].x = 0;
980 f->mt[1].y = 0;
981 }
982
973 return 0; 983 return 0;
974} 984}
975 985