Commit a8c51f9b authored by Hans de Goede's avatar Hans de Goede Committed by Greg Kroah-Hartman

Input: alps - only the Dell Latitude D420/430/620/630 have separate stick button bits

commit 19556219 upstream.

commit 92bac83d ("Input: alps - non interleaved V2 dualpoint has
separate stick button bits") assumes that all alps v2 non-interleaved
dual point setups have the separate stick button bits.

Later we limited this to Dell laptops only because of reports that this
broke things on non Dell laptops. Now it turns out that this breaks things
on the Dell Latitude D600 too. So it seems that only the Dell Latitude
D420/430/620/630, which all share the same touchpad / stick combo,
have these separate bits.

This patch limits the checking of the separate bits to only these models
fixing regressions with other models.
Reported-and-tested-by: default avatarLarry Finger <Larry.Finger@lwfinger.net>
Tested-by: default avatarHans de Goede <hdegoede@redhat.com>
Signed-off-by: default avatarHans de Goede <hdegoede@redhat.com>
Acked-By: default avatarPali Rohár <pali.rohar@gmail.com>
Signed-off-by: default avatarDmitry Torokhov <dmitry.torokhov@gmail.com>
Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
parent 3f9789e4
...@@ -100,7 +100,7 @@ static const struct alps_nibble_commands alps_v6_nibble_commands[] = { ...@@ -100,7 +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_STICK_BITS 0x100 /* separate stick button bits */
#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[] = {
...@@ -159,6 +159,43 @@ static const struct alps_protocol_info alps_v8_protocol_data = { ...@@ -159,6 +159,43 @@ static const struct alps_protocol_info alps_v8_protocol_data = {
ALPS_PROTO_V8, 0x18, 0x18, 0 ALPS_PROTO_V8, 0x18, 0x18, 0
}; };
/*
* Some v2 models report the stick buttons in separate bits
*/
static const struct dmi_system_id alps_dmi_has_separate_stick_buttons[] = {
#if defined(CONFIG_DMI) && defined(CONFIG_X86)
{
/* Extrapolated from other entries */
.matches = {
DMI_MATCH(DMI_SYS_VENDOR, "Dell Inc."),
DMI_MATCH(DMI_PRODUCT_NAME, "Latitude D420"),
},
},
{
/* Reported-by: Hans de Bruin <jmdebruin@xmsnet.nl> */
.matches = {
DMI_MATCH(DMI_SYS_VENDOR, "Dell Inc."),
DMI_MATCH(DMI_PRODUCT_NAME, "Latitude D430"),
},
},
{
/* Reported-by: Hans de Goede <hdegoede@redhat.com> */
.matches = {
DMI_MATCH(DMI_SYS_VENDOR, "Dell Inc."),
DMI_MATCH(DMI_PRODUCT_NAME, "Latitude D620"),
},
},
{
/* Extrapolated from other entries */
.matches = {
DMI_MATCH(DMI_SYS_VENDOR, "Dell Inc."),
DMI_MATCH(DMI_PRODUCT_NAME, "Latitude D630"),
},
},
#endif
{ }
};
static void alps_set_abs_params_st(struct alps_data *priv, static void alps_set_abs_params_st(struct alps_data *priv,
struct input_dev *dev1); struct input_dev *dev1);
static void alps_set_abs_params_semi_mt(struct alps_data *priv, static void alps_set_abs_params_semi_mt(struct alps_data *priv,
...@@ -253,9 +290,8 @@ static void alps_process_packet_v1_v2(struct psmouse *psmouse) ...@@ -253,9 +290,8 @@ static void alps_process_packet_v1_v2(struct psmouse *psmouse)
return; return;
} }
/* Dell non interleaved V2 dualpoint has separate stick button bits */ /* Some models have separate stick button bits */
if (priv->proto_version == ALPS_PROTO_V2 && if (priv->flags & ALPS_STICK_BITS) {
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;
...@@ -2552,8 +2588,6 @@ static int alps_set_protocol(struct psmouse *psmouse, ...@@ -2552,8 +2588,6 @@ 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;
...@@ -2568,6 +2602,8 @@ static int alps_set_protocol(struct psmouse *psmouse, ...@@ -2568,6 +2602,8 @@ static int alps_set_protocol(struct psmouse *psmouse,
priv->set_abs_params = alps_set_abs_params_st; priv->set_abs_params = alps_set_abs_params_st;
priv->x_max = 1023; priv->x_max = 1023;
priv->y_max = 767; priv->y_max = 767;
if (dmi_check_system(alps_dmi_has_separate_stick_buttons))
priv->flags |= ALPS_STICK_BITS;
break; break;
case ALPS_PROTO_V3: case ALPS_PROTO_V3:
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment