Commit 8000fbfa authored by Dmitry Torokhov's avatar Dmitry Torokhov Committed by Zefan Li

Input: synaptics - gate forcepad support by DMI check

commit aa972409 upstream.

Unfortunately, ForcePad capability is not actually exported over PS/2, so
we have to resort to DMI checks.
Reported-by: default avatarNicole Faerber <nicole.faerber@kernelconcepts.de>
Signed-off-by: default avatarDmitry Torokhov <dmitry.torokhov@gmail.com>
[lizf: Backported to 3.4: adjust context]
Signed-off-by: default avatarZefan Li <lizefan@huawei.com>
parent 7baa56f6
...@@ -506,6 +506,8 @@ static void synaptics_parse_agm(const unsigned char buf[], ...@@ -506,6 +506,8 @@ static void synaptics_parse_agm(const unsigned char buf[],
priv->agm_pending = true; priv->agm_pending = true;
} }
static bool is_forcepad;
static int synaptics_parse_hw_state(const unsigned char buf[], static int synaptics_parse_hw_state(const unsigned char buf[],
struct synaptics_data *priv, struct synaptics_data *priv,
struct synaptics_hw_state *hw) struct synaptics_hw_state *hw)
...@@ -535,7 +537,7 @@ static int synaptics_parse_hw_state(const unsigned char buf[], ...@@ -535,7 +537,7 @@ static int synaptics_parse_hw_state(const unsigned char buf[],
hw->left = (buf[0] & 0x01) ? 1 : 0; hw->left = (buf[0] & 0x01) ? 1 : 0;
hw->right = (buf[0] & 0x02) ? 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 * ForcePads, like Clickpads, use middle button
* bits to report primary button clicks. * bits to report primary button clicks.
...@@ -1512,6 +1514,18 @@ static const struct dmi_system_id min_max_dmi_table[] __initconst = { ...@@ -1512,6 +1514,18 @@ static const struct dmi_system_id min_max_dmi_table[] __initconst = {
{ } { }
}; };
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) void __init synaptics_module_init(void)
{ {
const struct dmi_system_id *min_max_dmi; const struct dmi_system_id *min_max_dmi;
...@@ -1522,6 +1536,12 @@ void __init synaptics_module_init(void) ...@@ -1522,6 +1536,12 @@ void __init synaptics_module_init(void)
min_max_dmi = dmi_first_match(min_max_dmi_table); min_max_dmi = dmi_first_match(min_max_dmi_table);
if (min_max_dmi) if (min_max_dmi)
quirk_min_max = min_max_dmi->driver_data; quirk_min_max = min_max_dmi->driver_data;
/*
* 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) static int __synaptics_init(struct psmouse *psmouse, bool absolute_mode)
......
...@@ -76,12 +76,9 @@ ...@@ -76,12 +76,9 @@
* for noise. * for noise.
* 2 0x08 image sensor image sensor tracks 5 fingers, but only * 2 0x08 image sensor image sensor tracks 5 fingers, but only
* reports 2. * 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 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_CLICKPAD(ex0c) ((ex0c) & 0x100000) /* 1-button ClickPad */
#define SYN_CAP_CLICKPAD2BTN(ex0c) ((ex0c) & 0x000100) /* 2-button ClickPad */ #define SYN_CAP_CLICKPAD2BTN(ex0c) ((ex0c) & 0x000100) /* 2-button ClickPad */
...@@ -90,7 +87,6 @@ ...@@ -90,7 +87,6 @@
#define SYN_CAP_ADV_GESTURE(ex0c) ((ex0c) & 0x080000) #define SYN_CAP_ADV_GESTURE(ex0c) ((ex0c) & 0x080000)
#define SYN_CAP_REDUCED_FILTERING(ex0c) ((ex0c) & 0x000400) #define SYN_CAP_REDUCED_FILTERING(ex0c) ((ex0c) & 0x000400)
#define SYN_CAP_IMAGE_SENSOR(ex0c) ((ex0c) & 0x000800) #define SYN_CAP_IMAGE_SENSOR(ex0c) ((ex0c) & 0x000800)
#define SYN_CAP_FORCEPAD(ex0c) ((ex0c) & 0x008000)
/* synaptics modes query bits */ /* synaptics modes query bits */
#define SYN_MODE_ABSOLUTE(m) ((m) & (1 << 7)) #define SYN_MODE_ABSOLUTE(m) ((m) & (1 << 7))
......
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