Skip to content

Commit 6bcca19

Browse files
jwrdegoededtor
authored andcommitted
Input: alps - fix touchpad buttons getting stuck when used with trackpoint
When the left touchpad button gets pressed, and then the trackpoint is moved, and then the button is released, the following happens: 1) touchpad packet is received, touchpad evdev node reports BTN_LEFT 1 2) pointing stick packet is received, the hw will report a BTN_LEFT 1 in this packet because when the trackstick is active it communicates the combined touchpad + pointing stick buttons in the trackstick packet, since alps_report_bare_ps2_packet passes NULL (*) for the dev2 parameter to alps_report_buttons the combining is not detected and the pointing stick evdev node will also report BTN_LEFT 1 3) on release of the button a pointing stick packet with BTN_LEFT 0 is received and the pointing stick evdev node will report BTN_LEFT 0 Note how because of the passing as NULL for dev2 the touchpad evdev node will never send BTN_LEFT 0 in this scenario leading to a stuck mouse button. This is a regression in 4.0 introduced by commit 04aae28 ("Input: ALPS - do not mix trackstick and external PS/2 mouse data") This commit fixes this by passing in the touchpad evdev as dev2 parameter when calling alps_report_buttons for the pointingstick on alps v2 devices, so that alps_report_buttons correctly detect that we're already reporting the button as pressed via the touchpad evdev node, and will also send the release event there. Cc: stable@vger.kernel.org # 4.0 Reported-by: Hans de Bruin <jmdebruin@xmsnet.nl> Signed-off-by: Hans de Goede <hdegoede@redhat.com> Acked-by: Pali Rohár <pali.rohar@gmail.com> Signed-off-by: Dmitry Torokhov <dmitry.torokhov@gmail.com>
1 parent bd88414 commit 6bcca19

File tree

1 file changed

+3
-2
lines changed

1 file changed

+3
-2
lines changed

drivers/input/mouse/alps.c

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1159,13 +1159,14 @@ static void alps_report_bare_ps2_packet(struct psmouse *psmouse,
11591159
bool report_buttons)
11601160
{
11611161
struct alps_data *priv = psmouse->private;
1162-
struct input_dev *dev;
1162+
struct input_dev *dev, *dev2 = NULL;
11631163

11641164
/* Figure out which device to use to report the bare packet */
11651165
if (priv->proto_version == ALPS_PROTO_V2 &&
11661166
(priv->flags & ALPS_DUALPOINT)) {
11671167
/* On V2 devices the DualPoint Stick reports bare packets */
11681168
dev = priv->dev2;
1169+
dev2 = psmouse->dev;
11691170
} else if (unlikely(IS_ERR_OR_NULL(priv->dev3))) {
11701171
/* Register dev3 mouse if we received PS/2 packet first time */
11711172
if (!IS_ERR(priv->dev3))
@@ -1177,7 +1178,7 @@ static void alps_report_bare_ps2_packet(struct psmouse *psmouse,
11771178
}
11781179

11791180
if (report_buttons)
1180-
alps_report_buttons(dev, NULL,
1181+
alps_report_buttons(dev, dev2,
11811182
packet[0] & 1, packet[0] & 2, packet[0] & 4);
11821183

11831184
input_report_rel(dev, REL_X,

0 commit comments

Comments
 (0)