Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 073e570d authored by Hans de Goede's avatar Hans de Goede Committed by Dmitry Torokhov
Browse files

Input: alps - only Dell laptops have separate button bits for v2 dualpoint sticks



It turns out that only Dell laptops have the separate button bits for
v2 dualpoint sticks and that commit 92bac83d ("Input: alps - non
interleaved V2 dualpoint has separate stick button bits") causes
regressions on Toshiba laptops.

This commit adds a check for Dell laptops to the code for handling these
extra button bits, fixing this regression.

This patch has been tested on a Dell Latitude D620 to make sure that it
does not reintroduce the original problem.

Reported-and-tested-by: default avatarDouglas Christman <douglaschristman@gmail.com>
Cc: stable@vger.kernel.org
Signed-off-by: default avatarHans de Goede <hdegoede@redhat.com>
Signed-off-by: default avatarDmitry Torokhov <dmitry.torokhov@gmail.com>
parent b6e26546
Loading
Loading
Loading
Loading
+4 −2
Original line number Original line Diff line number Diff line
@@ -119,8 +119,10 @@ ALPS Absolute Mode - Protocol Version 2
 byte 5:  0   z6   z5   z4   z3   z2   z1   z0
 byte 5:  0   z6   z5   z4   z3   z2   z1   z0


Protocol Version 2 DualPoint devices send standard PS/2 mouse packets for
Protocol Version 2 DualPoint devices send standard PS/2 mouse packets for
the DualPoint Stick. For non interleaved dualpoint devices the pointingstick
the DualPoint Stick. The M, R and L bits signal the combined status of both
buttons get reported separately in the PSM, PSR and PSL bits.
the pointingstick and touchpad buttons, except for Dell dualpoint devices
where the pointingstick buttons get reported separately in the PSM, PSR
and PSL bits.


Dualpoint device -- interleaved packet format
Dualpoint device -- interleaved packet format
---------------------------------------------
---------------------------------------------
+6 −2
Original line number Original line Diff line number Diff line
@@ -20,6 +20,7 @@
#include <linux/input/mt.h>
#include <linux/input/mt.h>
#include <linux/serio.h>
#include <linux/serio.h>
#include <linux/libps2.h>
#include <linux/libps2.h>
#include <linux/dmi.h>


#include "psmouse.h"
#include "psmouse.h"
#include "alps.h"
#include "alps.h"
@@ -99,6 +100,7 @@ static const struct alps_nibble_commands alps_v6_nibble_commands[] = {
#define ALPS_FOUR_BUTTONS	0x40	/* 4 direction button present */
#define ALPS_FOUR_BUTTONS	0x40	/* 4 direction button present */
#define ALPS_PS2_INTERLEAVED	0x80	/* 3-byte PS/2 packet interleaved with
#define ALPS_PS2_INTERLEAVED	0x80	/* 3-byte PS/2 packet interleaved with
					   6-byte ALPS packet */
					   6-byte ALPS packet */
#define ALPS_DELL		0x100	/* device is a Dell laptop */
#define ALPS_BUTTONPAD		0x200	/* device is a clickpad */
#define ALPS_BUTTONPAD		0x200	/* device is a clickpad */


static const struct alps_model_info alps_model_data[] = {
static const struct alps_model_info alps_model_data[] = {
@@ -251,9 +253,9 @@ static void alps_process_packet_v1_v2(struct psmouse *psmouse)
		return;
		return;
	}
	}


	/* Non interleaved V2 dualpoint has separate stick button bits */
	/* Dell non interleaved V2 dualpoint has separate stick button bits */
	if (priv->proto_version == ALPS_PROTO_V2 &&
	if (priv->proto_version == ALPS_PROTO_V2 &&
	    priv->flags == (ALPS_PASS | ALPS_DUALPOINT)) {
	    priv->flags == (ALPS_DELL | ALPS_PASS | ALPS_DUALPOINT)) {
		left |= packet[0] & 1;
		left |= packet[0] & 1;
		right |= packet[0] & 2;
		right |= packet[0] & 2;
		middle |= packet[0] & 4;
		middle |= packet[0] & 4;
@@ -2550,6 +2552,8 @@ static int alps_set_protocol(struct psmouse *psmouse,
	priv->byte0 = protocol->byte0;
	priv->byte0 = protocol->byte0;
	priv->mask0 = protocol->mask0;
	priv->mask0 = protocol->mask0;
	priv->flags = protocol->flags;
	priv->flags = protocol->flags;
	if (dmi_name_in_vendors("Dell"))
		priv->flags |= ALPS_DELL;


	priv->x_max = 2000;
	priv->x_max = 2000;
	priv->y_max = 1400;
	priv->y_max = 1400;