diff options
Diffstat (limited to 'drivers/input/mouse/synaptics.c')
| -rw-r--r-- | drivers/input/mouse/synaptics.c | 42 | 
1 files changed, 19 insertions, 23 deletions
| diff --git a/drivers/input/mouse/synaptics.c b/drivers/input/mouse/synaptics.c index 3b06c8a360b6..630af73e98c4 100644 --- a/drivers/input/mouse/synaptics.c +++ b/drivers/input/mouse/synaptics.c @@ -67,6 +67,9 @@  #define X_MAX_POSITIVE 8176  #define Y_MAX_POSITIVE 8176 +/* maximum ABS_MT_POSITION displacement (in mm) */ +#define DMAX 10 +  /*****************************************************************************   *	Stuff we need even when we do not want native Synaptics support   ****************************************************************************/ @@ -203,6 +206,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   ****************************************************************************/ @@ -687,8 +697,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) @@ -718,7 +726,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. @@ -917,7 +925,7 @@ static void synaptics_report_mt_data(struct psmouse *psmouse,  		pos[i].y = synaptics_invert_y(hw[i]->y);  	} -	input_mt_assign_slots(dev, slot, pos, nsemi, 0); +	input_mt_assign_slots(dev, slot, pos, nsemi, DMAX * priv->x_res);  	for (i = 0; i < nsemi; i++) {  		input_mt_slot(dev, slot[i]); @@ -1186,7 +1194,7 @@ static void set_input_params(struct psmouse *psmouse,  					ABS_MT_POSITION_Y);  		/* Image sensors can report per-contact pressure */  		input_set_abs_params(dev, ABS_MT_PRESSURE, 0, 255, 0, 0); -		input_mt_init_slots(dev, 2, INPUT_MT_POINTER | INPUT_MT_TRACK); +		input_mt_init_slots(dev, 3, INPUT_MT_POINTER | INPUT_MT_TRACK);  		/* Image sensors can signal 4 and 5 finger clicks */  		__set_bit(BTN_TOOL_QUADTAP, dev->keybit); @@ -1418,29 +1426,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) @@ -1475,6 +1465,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; |