When implementing commit 7f81c8db5489 ("HID: multitouch: simplify the settings of the various features"), I wrongly removed a test that made sure we never try to set the second InputMode feature to something else than 0.
This broke badly some recent Elan panels that now forget to send the click button in some area of the touchpad.
Fixes 7f81c8db5489
Link: https://bugzilla.kernel.org/show_bug.cgi?id=200899
Cc: stable@vger.kernel.org # v4.18+ Signed-off-by: Benjamin Tissoires benjamin.tissoires@redhat.com --- drivers/hid/hid-multitouch.c | 16 ++++++++++++++-- 1 file changed, 14 insertions(+), 2 deletions(-)
diff --git a/drivers/hid/hid-multitouch.c b/drivers/hid/hid-multitouch.c index 40fbb7c52723..88da991ef256 100644 --- a/drivers/hid/hid-multitouch.c +++ b/drivers/hid/hid-multitouch.c @@ -1375,7 +1375,8 @@ static bool mt_need_to_apply_feature(struct hid_device *hdev, struct hid_usage *usage, enum latency_mode latency, bool surface_switch, - bool button_switch) + bool button_switch, + bool *inputmode_found) { struct mt_device *td = hid_get_drvdata(hdev); struct mt_class *cls = &td->mtclass; @@ -1387,6 +1388,14 @@ static bool mt_need_to_apply_feature(struct hid_device *hdev,
switch (usage->hid) { case HID_DG_INPUTMODE: + /* + * Some elan panels wrongly declare 2 input mode features, + * and silently ignore when we set the value in the second + * field. Skip the second feature and hope for the best. + */ + if (*inputmode_found) + return false; + if (cls->quirks & MT_QUIRK_FORCE_GET_FEATURE) { report_len = hid_report_len(report); buf = hid_alloc_report_buf(report, GFP_KERNEL); @@ -1402,6 +1411,7 @@ static bool mt_need_to_apply_feature(struct hid_device *hdev, }
field->value[index] = td->inputmode_value; + *inputmode_found = true; return true;
case HID_DG_CONTACTMAX: @@ -1439,6 +1449,7 @@ static void mt_set_modes(struct hid_device *hdev, enum latency_mode latency, struct hid_usage *usage; int i, j; bool update_report; + bool inputmode_found = false;
rep_enum = &hdev->report_enum[HID_FEATURE_REPORT]; list_for_each_entry(rep, &rep_enum->report_list, list) { @@ -1457,7 +1468,8 @@ static void mt_set_modes(struct hid_device *hdev, enum latency_mode latency, usage, latency, surface_switch, - button_switch)) + button_switch, + &inputmode_found)) update_report = true; } }
On Tue, 4 Sep 2018, Benjamin Tissoires wrote:
When implementing commit 7f81c8db5489 ("HID: multitouch: simplify the settings of the various features"), I wrongly removed a test that made sure we never try to set the second InputMode feature to something else than 0.
This broke badly some recent Elan panels that now forget to send the click button in some area of the touchpad.
Fixes 7f81c8db5489
Please make sure that the 'Fixes:' tag is always in proper format. There are tools depending on that :)
I'll fix that up manually.
Thanks!
On Tue, Sep 4, 2018 at 9:31 PM Jiri Kosina jikos@kernel.org wrote:
On Tue, 4 Sep 2018, Benjamin Tissoires wrote:
When implementing commit 7f81c8db5489 ("HID: multitouch: simplify the settings of the various features"), I wrongly removed a test that made sure we never try to set the second InputMode feature to something else than 0.
This broke badly some recent Elan panels that now forget to send the click button in some area of the touchpad.
Fixes 7f81c8db5489
Please make sure that the 'Fixes:' tag is always in proper format. There are tools depending on that :)
Oops, thanks for fixing it. Lazy me :)
Cheers, Benjamin
I'll fix that up manually.
Thanks!
-- Jiri Kosina SUSE Labs
linux-stable-mirror@lists.linaro.org