diff mbox

HID: multitouch: Release all touch slots on reset_resume

Message ID 20160311221949.GA14029@dtor-ws (mailing list archive)
State New, archived
Headers show

Commit Message

Dmitry Torokhov March 11, 2016, 10:19 p.m. UTC
From: Benson Leung <bleung@chromium.org>

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>
---
 drivers/hid/hid-multitouch.c | 22 ++++++++++++++++++++++
 1 file changed, 22 insertions(+)

Comments

Benjamin Tissoires March 14, 2016, 8:05 a.m. UTC | #1
On Mar 11 2016 or thereabouts, Dmitry Torokhov wrote:
> From: Benson Leung <bleung@chromium.org>
> 
> 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>
> ---

Seems good to me:

Reviewed-by: Benjamin Tissoires <benjamin.tissoires@redhat.com>

Cheers,
Benjamin

>  drivers/hid/hid-multitouch.c | 22 ++++++++++++++++++++++
>  1 file changed, 22 insertions(+)
> 
> diff --git a/drivers/hid/hid-multitouch.c b/drivers/hid/hid-multitouch.c
> index 6adb788..e24e33c 100644
> --- a/drivers/hid/hid-multitouch.c
> +++ b/drivers/hid/hid-multitouch.c
> @@ -1148,8 +1148,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;
> -- 
> 2.7.0.rc3.207.g0ac5344
> 
> 
> -- 
> Dmitry
--
To unsubscribe from this list: send the line "unsubscribe linux-input" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Jiri Kosina March 14, 2016, 9:10 a.m. UTC | #2
On Fri, 11 Mar 2016, Dmitry Torokhov wrote:

> From: Benson Leung <bleung@chromium.org>
> 
> 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>

Applied to for-4.6/multitouch.
diff mbox

Patch

diff --git a/drivers/hid/hid-multitouch.c b/drivers/hid/hid-multitouch.c
index 6adb788..e24e33c 100644
--- a/drivers/hid/hid-multitouch.c
+++ b/drivers/hid/hid-multitouch.c
@@ -1148,8 +1148,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;