Skip to contentSkip to conversation

Input: synaptics - switch ForcePad detection to PNP IDs

PATCH In review Dmitry Torokhov 3 participants 3 messages Dec 29, 2014 – Jan 5, 2015

Subsystems (2)
lore
Share & tools
lore

Dmitry Torokhov

author maintainer
#0 lore raw

PATCH 1/1 Input: synaptics - switch ForcePad detection to PNP IDs

According to Synaptics devices with ForcePads use SYN300D and SYN3014 as PNP IDs, so let's switch from DMI-bases detection scheme to PNP-based one, which should be more reliable.

---
 drivers/input/mouse/synaptics.c | 35 ++++++++++++++---------------------
 drivers/input/mouse/synaptics.h |  1 +
 2 files changed, 15 insertions(+), 21 deletions(-)
drivers/input/mouse/synaptics.c +14 -21
index d2ab13a..f04017e 100644
@@ -190,6 +190,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
  ****************************************************************************/
@@ -601,8 +608,6 @@ static void synaptics_parse_agm(const unsigned char buf[],
 	}
 }
 
-static bool is_forcepad;
-
 static int synaptics_parse_hw_state(const unsigned char buf[],
 				    struct synaptics_data *priv,
 				    struct synaptics_hw_state *hw)
@@ -632,7 +637,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.
@@ -1307,29 +1312,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)
@@ -1364,6 +1351,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;
drivers/input/mouse/synaptics.h +1 -0
index aedc329..fb3838c 100644
@@ -168,6 +168,7 @@ struct synaptics_data {
 	unsigned long				press_start;
 	bool					press;
 	bool					report_press;
+	bool					is_forcepad;
 };
 
 void synaptics_module_init(void);
Signature · 5 lines
2.2.0.rc0.207.ga3a616c


-- 
Dmitry
Acked-by on v1 1/1
#1 lore raw

Hi,

Looks good to me:

Regards,

Hans

Quoted 103 lines · Dmitry Torokhov

According to Synaptics devices with ForcePads use SYN300D and SYN3014 as PNP IDs, so let's switch from DMI-bases detection scheme to PNP-based one, which should be more reliable.

---
  drivers/input/mouse/synaptics.c | 35 ++++++++++++++---------------------
  drivers/input/mouse/synaptics.h |  1 +
  2 files changed, 15 insertions(+), 21 deletions(-)
drivers/input/mouse/synaptics.c +14 -21
index d2ab13a..f04017e 100644
@@ -190,6 +190,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
   ****************************************************************************/
@@ -601,8 +608,6 @@ static void synaptics_parse_agm(const unsigned char buf[],
  	}
  }
 
-static bool is_forcepad;
-
  static int synaptics_parse_hw_state(const unsigned char buf[],
  				    struct synaptics_data *priv,
  				    struct synaptics_hw_state *hw)
@@ -632,7 +637,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.
@@ -1307,29 +1312,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)
@@ -1364,6 +1351,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;
drivers/input/mouse/synaptics.h +1 -0
index aedc329..fb3838c 100644
@@ -168,6 +168,7 @@ struct synaptics_data {
  	unsigned long				press_start;
  	bool					press;
  	bool					report_press;
+	bool					is_forcepad;
  };
 
  void synaptics_module_init(void);
Reviewed-by on v1 1/1
#2 lore raw
In reply to Dmitry Torokhov
Quoted 7 lines · Dmitry Torokhov

According to Synaptics devices with ForcePads use SYN300D and SYN3014 as PNP IDs, so let's switch from DMI-bases detection scheme to PNP-based one, which should be more reliable.

---

Looks good to me too:

Cheers,
Benjamin