From: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
To: linux-kernel@vger.kernel.org
Cc: Greg Kroah-Hartman <gregkh@linuxfoundation.org>,
stable@vger.kernel.org, Anthony Martin <ality@pbrane.org>,
Dmitry Torokhov <dmitry.torokhov@gmail.com>
Subject: [PATCH 4.12 04/27] Input: synaptics - fix device info appearing different on reconnect
Date: Tue, 5 Sep 2017 09:11:20 +0200 [thread overview]
Message-ID: <20170905070923.436089172@linuxfoundation.org> (raw)
In-Reply-To: <20170905070923.265950493@linuxfoundation.org>
4.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Anthony Martin <ality@pbrane.org>
commit 3f9db52dc87b003a1732f3e03f7f5fc8701ef4ad upstream.
User-modified input settings no longer survive a suspend/resume cycle.
Starting with 4.12, the touchpad is reinitialized on every reconnect
because the hardware appears to be different. This can be reproduced
by running the following as root:
echo -n reconnect >/sys/devices/platform/i8042/serio1/drvctl
A line like the following will show up in dmesg:
[30378.295794] psmouse serio1: synaptics: hardware appears to be
different: id(149271-149271), model(114865-114865),
caps(d047b3-d047b1), ext(b40000-b40000).
Note the single bit difference in caps: bit 1 (SYN_CAP_MULTIFINGER).
This happens because we modify our stored copy of the device info
capabilities when we enable advanced gesture mode but this change is
not reflected in the actual hardware capabilities.
It worked in the past because synaptics_query_hardware used to modify
the stored synaptics_device_info struct instead of filling in a new
one, as it does now.
Fix it by no longer faking the SYN_CAP_MULTIFINGER bit when setting
advanced gesture mode. This necessitated a small refactoring.
Fixes: 6c53694fb222 ("Input: synaptics - split device info into a separate structure")
Signed-off-by: Anthony Martin <ality@pbrane.org>
Signed-off-by: Dmitry Torokhov <dmitry.torokhov@gmail.com>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
---
drivers/input/mouse/synaptics.c | 35 ++++++++++++++++++++---------------
1 file changed, 20 insertions(+), 15 deletions(-)
--- a/drivers/input/mouse/synaptics.c
+++ b/drivers/input/mouse/synaptics.c
@@ -535,16 +535,17 @@ static void synaptics_apply_quirks(struc
}
}
+static bool synaptics_has_agm(struct synaptics_data *priv)
+{
+ return (SYN_CAP_ADV_GESTURE(priv->info.ext_cap_0c) ||
+ SYN_CAP_IMAGE_SENSOR(priv->info.ext_cap_0c));
+}
+
static int synaptics_set_advanced_gesture_mode(struct psmouse *psmouse)
{
static u8 param = 0xc8;
- struct synaptics_data *priv = psmouse->private;
int error;
- if (!(SYN_CAP_ADV_GESTURE(priv->info.ext_cap_0c) ||
- SYN_CAP_IMAGE_SENSOR(priv->info.ext_cap_0c)))
- return 0;
-
error = psmouse_sliced_command(psmouse, SYN_QUE_MODEL);
if (error)
return error;
@@ -553,9 +554,6 @@ static int synaptics_set_advanced_gestur
if (error)
return error;
- /* Advanced gesture mode also sends multi finger data */
- priv->info.capabilities |= BIT(1);
-
return 0;
}
@@ -578,7 +576,7 @@ static int synaptics_set_mode(struct psm
if (error)
return error;
- if (priv->absolute_mode) {
+ if (priv->absolute_mode && synaptics_has_agm(priv)) {
error = synaptics_set_advanced_gesture_mode(psmouse);
if (error) {
psmouse_err(psmouse,
@@ -766,9 +764,7 @@ static int synaptics_parse_hw_state(cons
((buf[0] & 0x04) >> 1) |
((buf[3] & 0x04) >> 2));
- if ((SYN_CAP_ADV_GESTURE(priv->info.ext_cap_0c) ||
- SYN_CAP_IMAGE_SENSOR(priv->info.ext_cap_0c)) &&
- hw->w == 2) {
+ if (synaptics_has_agm(priv) && hw->w == 2) {
synaptics_parse_agm(buf, priv, hw);
return 1;
}
@@ -1033,6 +1029,15 @@ static void synaptics_image_sensor_proce
synaptics_report_mt_data(psmouse, sgm, num_fingers);
}
+static bool synaptics_has_multifinger(struct synaptics_data *priv)
+{
+ if (SYN_CAP_MULTIFINGER(priv->info.capabilities))
+ return true;
+
+ /* Advanced gesture mode also sends multi finger data */
+ return synaptics_has_agm(priv);
+}
+
/*
* called for each full received packet from the touchpad
*/
@@ -1079,7 +1084,7 @@ static void synaptics_process_packet(str
if (SYN_CAP_EXTENDED(info->capabilities)) {
switch (hw.w) {
case 0 ... 1:
- if (SYN_CAP_MULTIFINGER(info->capabilities))
+ if (synaptics_has_multifinger(priv))
num_fingers = hw.w + 2;
break;
case 2:
@@ -1123,7 +1128,7 @@ static void synaptics_process_packet(str
input_report_abs(dev, ABS_TOOL_WIDTH, finger_width);
input_report_key(dev, BTN_TOOL_FINGER, num_fingers == 1);
- if (SYN_CAP_MULTIFINGER(info->capabilities)) {
+ if (synaptics_has_multifinger(priv)) {
input_report_key(dev, BTN_TOOL_DOUBLETAP, num_fingers == 2);
input_report_key(dev, BTN_TOOL_TRIPLETAP, num_fingers == 3);
}
@@ -1283,7 +1288,7 @@ static void set_input_params(struct psmo
__set_bit(BTN_TOUCH, dev->keybit);
__set_bit(BTN_TOOL_FINGER, dev->keybit);
- if (SYN_CAP_MULTIFINGER(info->capabilities)) {
+ if (synaptics_has_multifinger(priv)) {
__set_bit(BTN_TOOL_DOUBLETAP, dev->keybit);
__set_bit(BTN_TOOL_TRIPLETAP, dev->keybit);
}
next prev parent reply other threads:[~2017-09-05 7:12 UTC|newest]
Thread overview: 29+ messages / expand[flat|nested] mbox.gz Atom feed top
2017-09-05 7:11 [PATCH 4.12 00/27] 4.12.11-stable review Greg Kroah-Hartman
2017-09-05 7:11 ` [PATCH 4.12 01/27] arm64: mm: abort uaccess retries upon fatal signal Greg Kroah-Hartman
2017-09-05 7:11 ` [PATCH 4.12 03/27] irqchip: mips-gic: SYNC after enabling GIC region Greg Kroah-Hartman
2017-09-05 7:11 ` Greg Kroah-Hartman [this message]
2017-09-05 7:11 ` [PATCH 4.12 05/27] Input: xpad - fix PowerA init quirk for some gamepad models Greg Kroah-Hartman
2017-09-05 7:11 ` [PATCH 4.12 06/27] crypto: chacha20 - fix handling of chunked input Greg Kroah-Hartman
2017-09-05 7:11 ` [PATCH 4.12 07/27] i2c: ismt: Dont duplicate the receive length for block reads Greg Kroah-Hartman
2017-09-05 7:11 ` [PATCH 4.12 08/27] i2c: ismt: Return EMSGSIZE for block reads with bogus length Greg Kroah-Hartman
2017-09-05 7:11 ` [PATCH 4.12 09/27] crypto: algif_skcipher - only call put_page on referenced and used pages Greg Kroah-Hartman
2017-09-05 7:11 ` [PATCH 4.12 10/27] mm, uprobes: fix multiple free of ->uprobes_state.xol_area Greg Kroah-Hartman
2017-09-05 7:11 ` [PATCH 4.12 11/27] mm, madvise: ensure poisoned pages are removed from per-cpu lists Greg Kroah-Hartman
2017-09-05 7:11 ` [PATCH 4.12 12/27] ceph: fix readpage from fscache Greg Kroah-Hartman
2017-09-05 7:11 ` [PATCH 4.12 13/27] cpumask: fix spurious cpumask_of_node() on non-NUMA multi-node configs Greg Kroah-Hartman
2017-09-05 7:11 ` [PATCH 4.12 14/27] cpuset: Fix incorrect memory_pressure control file mapping Greg Kroah-Hartman
2017-09-05 7:11 ` [PATCH 4.12 15/27] alpha: uapi: Add support for __SANE_USERSPACE_TYPES__ Greg Kroah-Hartman
2017-09-05 7:11 ` [PATCH 4.12 16/27] CIFS: Fix maximum SMB2 header size Greg Kroah-Hartman
2017-09-05 7:11 ` [PATCH 4.12 17/27] CIFS: remove endian related sparse warning Greg Kroah-Hartman
2017-09-05 7:11 ` [PATCH 4.12 18/27] dm mpath: do not lock up a CPU with requeuing activity Greg Kroah-Hartman
2017-09-05 7:11 ` [PATCH 4.12 19/27] drm/vmwgfx: Fix F26 Wayland screen update issue Greg Kroah-Hartman
2017-09-05 7:11 ` [PATCH 4.12 20/27] wl1251: add a missing spin_lock_init() Greg Kroah-Hartman
2017-09-05 7:11 ` [PATCH 4.12 21/27] mmc: sdhci-xenon: add set_power callback Greg Kroah-Hartman
2017-09-05 7:11 ` [PATCH 4.12 22/27] lib/mpi: kunmap after finishing accessing buffer Greg Kroah-Hartman
2017-09-05 7:11 ` [PATCH 4.12 23/27] xfrm: policy: check policy direction value Greg Kroah-Hartman
2017-09-05 7:11 ` [PATCH 4.12 25/27] nvme: fix the definition of the doorbell buffer config support bit Greg Kroah-Hartman
2017-09-05 7:11 ` [PATCH 4.12 26/27] drm/nouveau/i2c/gf119-: add support for address-only transactions Greg Kroah-Hartman
2017-09-05 16:48 ` [PATCH 4.12 00/27] 4.12.11-stable review Guenter Roeck
2017-09-05 17:40 ` Greg Kroah-Hartman
2017-09-05 17:15 ` Shuah Khan
2017-09-05 17:40 ` Greg Kroah-Hartman
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20170905070923.436089172@linuxfoundation.org \
--to=gregkh@linuxfoundation.org \
--cc=ality@pbrane.org \
--cc=dmitry.torokhov@gmail.com \
--cc=linux-kernel@vger.kernel.org \
--cc=stable@vger.kernel.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).