Input: synaptics - gate forcepad support by DMI check
authorDmitry Torokhov <dmitry.torokhov@gmail.com>
Tue, 2 Sep 2014 16:49:18 +0000 (09:49 -0700)
committerBen Hutchings <ben@decadent.org.uk>
Sun, 14 Dec 2014 16:23:48 +0000 (16:23 +0000)
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>
[bwh: Backported to 3.2: adjust context]
Signed-off-by: Ben Hutchings <ben@decadent.org.uk>
drivers/input/mouse/synaptics.c
drivers/input/mouse/synaptics.h

index a50e121..bb41f94 100644 (file)
@@ -495,6 +495,8 @@ static void synaptics_parse_agm(const unsigned char buf[],
        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)
@@ -524,7 +526,7 @@ static int synaptics_parse_hw_state(const unsigned char buf[],
                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.
@@ -1507,6 +1509,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)
 {
        const struct dmi_system_id *min_max_dmi;
@@ -1517,6 +1531,12 @@ void __init synaptics_module_init(void)
        min_max_dmi = dmi_first_match(min_max_dmi_table);
        if (min_max_dmi)
                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);
 }
 
 int synaptics_init(struct psmouse *psmouse)
index 908d167..6cf156d 100644 (file)
  *                                     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 */
@@ -90,7 +87,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))