| From aa972409951e0675e07918620427517cad5090e0 Mon Sep 17 00:00:00 2001 |
| From: Dmitry Torokhov <dmitry.torokhov@gmail.com> |
| Date: Tue, 2 Sep 2014 09:49:18 -0700 |
| Subject: Input: synaptics - gate forcepad support by DMI check |
| |
| From: Dmitry Torokhov <dmitry.torokhov@gmail.com> |
| |
| commit aa972409951e0675e07918620427517cad5090e0 upstream. |
| |
| Unfortunately, ForcePad capability is not actually exported over PS/2, so |
| we have to resort to DMI checks. |
| |
| Reported-by: Nicole Faerber <nicole.faerber@kernelconcepts.de> |
| Signed-off-by: Dmitry Torokhov <dmitry.torokhov@gmail.com> |
| Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> |
| |
| --- |
| drivers/input/mouse/synaptics.c | 22 +++++++++++++++++++++- |
| drivers/input/mouse/synaptics.h | 8 ++------ |
| 2 files changed, 23 insertions(+), 7 deletions(-) |
| |
| --- a/drivers/input/mouse/synaptics.c |
| +++ b/drivers/input/mouse/synaptics.c |
| @@ -618,6 +618,8 @@ static void synaptics_parse_agm(const un |
| priv->agm_pending = true; |
| } |
| |
| +static bool is_forcepad; |
| + |
| static int synaptics_parse_hw_state(const unsigned char buf[], |
| struct synaptics_data *priv, |
| struct synaptics_hw_state *hw) |
| @@ -647,7 +649,7 @@ static int synaptics_parse_hw_state(cons |
| hw->left = (buf[0] & 0x01) ? 1 : 0; |
| hw->right = (buf[0] & 0x02) ? 1 : 0; |
| |
| - if (SYN_CAP_FORCEPAD(priv->ext_cap_0c)) { |
| + if (is_forcepad) { |
| /* |
| * ForcePads, like Clickpads, use middle button |
| * bits to report primary button clicks. |
| @@ -1678,11 +1680,29 @@ static const struct dmi_system_id __init |
| { } |
| }; |
| |
| +static const struct dmi_system_id forcepad_dmi_table[] __initconst = { |
| +#if defined(CONFIG_DMI) && defined(CONFIG_X86) |
| + { |
| + .matches = { |
| + DMI_MATCH(DMI_SYS_VENDOR, "Hewlett-Packard"), |
| + DMI_MATCH(DMI_PRODUCT_NAME, "HP EliteBook Folio 1040 G1"), |
| + }, |
| + }, |
| +#endif |
| + { } |
| +}; |
| + |
| void __init synaptics_module_init(void) |
| { |
| impaired_toshiba_kbc = dmi_check_system(toshiba_dmi_table); |
| broken_olpc_ec = dmi_check_system(olpc_dmi_table); |
| cr48_profile_sensor = dmi_check_system(cr48_dmi_table); |
| + |
| + /* |
| + * Unfortunately ForcePad capability is not exported over PS/2, |
| + * so we have to resort to checking DMI. |
| + */ |
| + is_forcepad = dmi_check_system(forcepad_dmi_table); |
| } |
| |
| static int __synaptics_init(struct psmouse *psmouse, bool absolute_mode) |
| --- a/drivers/input/mouse/synaptics.h |
| +++ b/drivers/input/mouse/synaptics.h |
| @@ -77,12 +77,9 @@ |
| * for noise. |
| * 2 0x08 image sensor image sensor tracks 5 fingers, but only |
| * reports 2. |
| + * 2 0x01 uniform clickpad whole clickpad moves instead of being |
| + * hinged at the top. |
| * 2 0x20 report min query 0x0f gives min coord reported |
| - * 2 0x80 forcepad forcepad is a variant of clickpad that |
| - * does not have physical buttons but rather |
| - * uses pressure above certain threshold to |
| - * report primary clicks. Forcepads also have |
| - * clickpad bit set. |
| */ |
| #define SYN_CAP_CLICKPAD(ex0c) ((ex0c) & 0x100000) /* 1-button ClickPad */ |
| #define SYN_CAP_CLICKPAD2BTN(ex0c) ((ex0c) & 0x000100) /* 2-button ClickPad */ |
| @@ -91,7 +88,6 @@ |
| #define SYN_CAP_ADV_GESTURE(ex0c) ((ex0c) & 0x080000) |
| #define SYN_CAP_REDUCED_FILTERING(ex0c) ((ex0c) & 0x000400) |
| #define SYN_CAP_IMAGE_SENSOR(ex0c) ((ex0c) & 0x000800) |
| -#define SYN_CAP_FORCEPAD(ex0c) ((ex0c) & 0x008000) |
| |
| /* synaptics modes query bits */ |
| #define SYN_MODE_ABSOLUTE(m) ((m) & (1 << 7)) |