Input: synaptics - gate forcepad support by DMI check
Unfortunately, ForcePad capability is not actually exported over PS/2, so we have to resort to DMI checks. Cc: stable@vger.kernel.org Reported-by: Nicole Faerber <nicole.faerber@kernelconcepts.de> Signed-off-by: Dmitry Torokhov <dmitry.torokhov@gmail.com>
This commit is contained in:
parent
9d93551188
commit
aa97240995
|
@ -607,6 +607,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)
|
||||||
|
@ -636,7 +638,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.
|
||||||
|
@ -1667,11 +1669,29 @@ static const struct dmi_system_id __initconst cr48_dmi_table[] = {
|
||||||
{ }
|
{ }
|
||||||
};
|
};
|
||||||
|
|
||||||
|
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)
|
||||||
{
|
{
|
||||||
impaired_toshiba_kbc = dmi_check_system(toshiba_dmi_table);
|
impaired_toshiba_kbc = dmi_check_system(toshiba_dmi_table);
|
||||||
broken_olpc_ec = dmi_check_system(olpc_dmi_table);
|
broken_olpc_ec = dmi_check_system(olpc_dmi_table);
|
||||||
cr48_profile_sensor = dmi_check_system(cr48_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)
|
static int __synaptics_init(struct psmouse *psmouse, bool absolute_mode)
|
||||||
|
|
|
@ -77,12 +77,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 */
|
||||||
|
@ -91,7 +88,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))
|
||||||
|
|
Loading…
Reference in a new issue