From: Peter Osterlund <petero2@telia.com>

Here is a patch that is needed to make some old synaptics touchpads work.

When setting the mode byte, don't set bits that the touchpad doesn't
understand.  Those bits are reserved and setting them can lead to weird
problems, like the left button not working, as reported by Miles Lane.



 25-akpm/drivers/input/mouse/synaptics.c |   12 ++++++++----
 1 files changed, 8 insertions(+), 4 deletions(-)

diff -puN drivers/input/mouse/synaptics.c~synaptics-mode-set drivers/input/mouse/synaptics.c
--- 25/drivers/input/mouse/synaptics.c~synaptics-mode-set	Thu Jul 31 11:35:07 2003
+++ 25-akpm/drivers/input/mouse/synaptics.c	Thu Jul 31 11:35:07 2003
@@ -182,6 +182,7 @@ static int query_hardware(struct psmouse
 {
 	struct synaptics_data *priv = psmouse->private;
 	int retries = 0;
+	int mode;
 
 	while ((retries++ < 3) && synaptics_reset(psmouse))
 		printk(KERN_ERR "synaptics reset failed\n");
@@ -192,10 +193,13 @@ static int query_hardware(struct psmouse
 		return -1;
 	if (synaptics_capability(psmouse, &priv->capabilities, &priv->ext_cap))
 		return -1;
-	if (synaptics_set_mode(psmouse, (SYN_BIT_ABSOLUTE_MODE |
-					 SYN_BIT_HIGH_RATE |
-					 SYN_BIT_DISABLE_GESTURE |
-					 SYN_BIT_W_MODE)))
+
+	mode = SYN_BIT_ABSOLUTE_MODE | SYN_BIT_HIGH_RATE;
+	if (SYN_ID_MAJOR(priv->identity) >= 4)
+		mode |= SYN_BIT_DISABLE_GESTURE;
+	if (SYN_CAP_EXTENDED(priv->capabilities))
+		mode |= SYN_BIT_W_MODE;
+	if (synaptics_set_mode(psmouse, mode))
 		return -1;
 
 	return 0;

_