HID: multitouch: Release all touch slots on reset_resume
authorBenson Leung <bleung@chromium.org>
Fri, 11 Mar 2016 22:19:49 +0000 (14:19 -0800)
committerJiri Kosina <jkosina@suse.cz>
Mon, 14 Mar 2016 09:00:00 +0000 (10:00 +0100)
When resetting a device (especially after power loss) it is unlikely
that the firmware will keep the contact tracking data for the previous
touches and will be able to reconcile it with the new contacts, so
let's release all slots on reset resume as start anew.

Signed-off-by: Benson Leung <bleung@chromium.org>
Signed-off-by: Dmitry Torokhov <dtor@chromium.org>
Reviewed-by: Benjamin Tissoires <benjamin.tissoires@redhat.com>
Signed-off-by: Jiri Kosina <jkosina@suse.cz>
drivers/hid/hid-multitouch.c

index a20fc604ffd897ac98e093c0254fbb46878ad926..60e85f3861ee136c5a558a02a422a2fcaa70058b 100644 (file)
@@ -1150,8 +1150,30 @@ static int mt_probe(struct hid_device *hdev, const struct hid_device_id *id)
 }
 
 #ifdef CONFIG_PM
+static void mt_release_contacts(struct hid_device *hid)
+{
+       struct hid_input *hidinput;
+
+       list_for_each_entry(hidinput, &hid->inputs, list) {
+               struct input_dev *input_dev = hidinput->input;
+               struct input_mt *mt = input_dev->mt;
+               int i;
+
+               if (mt) {
+                       for (i = 0; i < mt->num_slots; i++) {
+                               input_mt_slot(input_dev, i);
+                               input_mt_report_slot_state(input_dev,
+                                                          MT_TOOL_FINGER,
+                                                          false);
+                       }
+                       input_sync(input_dev);
+               }
+       }
+}
+
 static int mt_reset_resume(struct hid_device *hdev)
 {
+       mt_release_contacts(hdev);
        mt_set_maxcontacts(hdev);
        mt_set_input_mode(hdev);
        return 0;