Merge tag 'v4.0-rc5' into next
[firefly-linux-kernel-4.4.55.git] / drivers / input / mouse / synaptics.c
index dda605836546847afbdbdd4c77c976134a914a2e..d73a94270211041293c140b9144300621dcba9af 100644 (file)
@@ -198,6 +198,13 @@ static const char * const topbuttonpad_pnp_ids[] = {
        NULL
 };
 
+/* This list has been kindly provided by Synaptics. */
+static const char * const forcepad_pnp_ids[] = {
+       "SYN300D",
+       "SYN3014",
+       NULL
+};
+
 /*****************************************************************************
  *     Synaptics communications functions
  ****************************************************************************/
@@ -682,8 +689,6 @@ static void synaptics_parse_ext_buttons(const unsigned char buf[],
        hw->ext_buttons |= (buf[5] & ext_mask) << ext_bits;
 }
 
-static bool is_forcepad;
-
 static int synaptics_parse_hw_state(const unsigned char buf[],
                                    struct synaptics_data *priv,
                                    struct synaptics_hw_state *hw)
@@ -713,7 +718,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 (is_forcepad) {
+               if (priv->is_forcepad) {
                        /*
                         * ForcePads, like Clickpads, use middle button
                         * bits to report primary button clicks.
@@ -1413,29 +1418,11 @@ 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)
 {
        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)
@@ -1470,6 +1457,12 @@ static int __synaptics_init(struct psmouse *psmouse, bool absolute_mode)
        if (SYN_ID_DISGEST_SUPPORTED(priv->identity))
                priv->disable_gesture = true;
 
+       /*
+        * Unfortunately ForcePad capability is not exported over PS/2,
+        * so we have to resort to checking PNP IDs.
+        */
+       priv->is_forcepad = psmouse_matches_pnp_id(psmouse, forcepad_pnp_ids);
+
        if (synaptics_set_mode(psmouse)) {
                psmouse_err(psmouse, "Unable to initialize device.\n");
                goto init_fail;