| From 6bcca19f5dcedc3a006ca0bcc3699a437cadee74 Mon Sep 17 00:00:00 2001 |
| From: Hans de Goede <hdegoede@redhat.com> |
| Date: Wed, 8 Apr 2015 09:26:42 -0700 |
| Subject: Input: alps - fix touchpad buttons getting stuck when used with trackpoint |
| MIME-Version: 1.0 |
| Content-Type: text/plain; charset=UTF-8 |
| Content-Transfer-Encoding: 8bit |
| |
| From: Hans de Goede <hdegoede@redhat.com> |
| |
| commit 6bcca19f5dcedc3a006ca0bcc3699a437cadee74 upstream. |
| |
| 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 04aae283ba6a8 |
| ("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. |
| |
| 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> |
| Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> |
| |
| --- |
| drivers/input/mouse/alps.c | 5 +++-- |
| 1 file changed, 3 insertions(+), 2 deletions(-) |
| |
| --- a/drivers/input/mouse/alps.c |
| +++ b/drivers/input/mouse/alps.c |
| @@ -1159,13 +1159,14 @@ static void alps_report_bare_ps2_packet( |
| bool report_buttons) |
| { |
| struct alps_data *priv = psmouse->private; |
| - struct input_dev *dev; |
| + struct input_dev *dev, *dev2 = NULL; |
| |
| /* Figure out which device to use to report the bare packet */ |
| if (priv->proto_version == ALPS_PROTO_V2 && |
| (priv->flags & ALPS_DUALPOINT)) { |
| /* On V2 devices the DualPoint Stick reports bare packets */ |
| dev = priv->dev2; |
| + dev2 = psmouse->dev; |
| } else if (unlikely(IS_ERR_OR_NULL(priv->dev3))) { |
| /* Register dev3 mouse if we received PS/2 packet first time */ |
| if (!IS_ERR(priv->dev3)) |
| @@ -1177,7 +1178,7 @@ static void alps_report_bare_ps2_packet( |
| } |
| |
| if (report_buttons) |
| - alps_report_buttons(dev, NULL, |
| + alps_report_buttons(dev, dev2, |
| packet[0] & 1, packet[0] & 2, packet[0] & 4); |
| |
| input_report_rel(dev, REL_X, |