Input patches
cover Input patches
Hi,
I have some more input patches I'd like you to take look at:
psmouse_cleanup_fix:
When disconnecting PS/2 mouse we marekd it as PSMOUSE_IGNORE too early, before protocol's disconnect handler had a chance to run. When mouse is in PSMOUSE_IGNORE state it ignores everything, including ACKs, which causes cleanup routine to fail.
synaptics-passthrough-fix:
If touchpad does not support extended protocols (imps, exps) then after probing foor said protocols trackpoint on the pass-though port may stop working and full reset is needed to revive it (just reset-disable is not enough).
synaptics-restore-taps:
If Synaptics' absolute mode is disabled (by proto= option) make sure that touchpad is in relative mode and gestures (taps) are enabled. We need specifically reset the mode byte as even full reset does not affect it (except for absolute bit).
The patches depend on other input patches submitted earlier. All patches are available at:
bk pull bk://dtor.bkbits.net/input http://www.geocities.com/dt_or/input/2_6_4
Signature · 1 line
Dmitry
PATCH 1/3 Input patches: psmouse cleanup fix
===================================================================
[email protected], 2004-03-11 01:26:03-05:00, [email protected]
Input: when disconnecting PS/2 mouse give protocol's disconnect
handler chance to run before starting ignoring mouse data. Otherwise interrupt handler will discard all ACKs and the very first command in cleanup sequence will fail (Synaptics was failing to return to relative mode on module unload).
psmouse-base.c | 8 +++++--- psmouse.h | 4 ++-- 2 files changed, 7 insertions(+), 5 deletions(-)
===================================================================
drivers/input/mouse/psmouse-base.c +5 -3
@@ -552,7 +552,7 @@ {struct psmouse *psmouse = serio->private; - psmouse->state =PSMOUSE_IGNORE ; + psmouse->state =PSMOUSE_CMD_MODE ;if (psmouse->ptport) {if (psmouse->ptport->deactivate)
@@ -565,6 +565,8 @@if (psmouse->disconnect) psmouse->disconnect (psmouse); + psmouse->state =PSMOUSE_IGNORE ; +input_unregister_device (&psmouse->dev);serio_close (serio);kfree (psmouse);
@@ -592,7 +594,7 @@ psmouse->dev.keybit[LONG (BTN_MOUSE )] =BIT (BTN_LEFT ) |BIT (BTN_MIDDLE ) |BIT (BTN_RIGHT ); psmouse->dev.relbit[0 ] =BIT (REL_X ) |BIT (REL_Y ); - psmouse->state =PSMOUSE_NEW_DEVICE ; + psmouse->state =PSMOUSE_CMD_MODE ; psmouse->serio = serio; psmouse->dev.private = psmouse;
@@ -650,7 +652,7 @@return -1 ; } - psmouse->state =PSMOUSE_NEW_DEVICE ; + psmouse->state =PSMOUSE_CMD_MODE ; psmouse->type = psmouse->acking = psmouse->cmdcnt = psmouse->pktcnt =0 ;if (psmouse->reconnect) {if (psmouse->reconnect (psmouse))
drivers/input/mouse/psmouse.h +2 -2
@@ -5,7 +5,7 @@#define PSMOUSE_CMD_SETRES 0x10e8#define PSMOUSE_CMD_GETINFO 0x03e9#define PSMOUSE_CMD_SETSTREAM 0x00ea -#define PSMOUSE_CMD_POLL 0x03eb +#define PSMOUSE_CMD_POLL 0x03eb#define PSMOUSE_CMD_GETID 0x02f2#define PSMOUSE_CMD_SETRATE 0x10f3#define PSMOUSE_CMD_ENABLE 0x00f4
@@ -18,7 +18,7 @@#define PSMOUSE_RET_NAK 0xfe/* psmouse states */ -#define PSMOUSE_NEW_DEVICE 0 +#define PSMOUSE_CMD_MODE 0#define PSMOUSE_ACTIVATED 1#define PSMOUSE_IGNORE 2
PATCH 2/3 Input patches: synaptics passthrough fix
===================================================================
[email protected], 2004-03-11 01:43:39-05:00, [email protected]
Input: do a full reset of Synaptics touchpad if extended protocol
probes failed, otherwise trackpoint on the pass-through port may stop working (reset-disable isn't enough to revive it)
psmouse-base.c | 23 +++++++++++++++++++++-- psmouse.h | 1 + synaptics.c | 13 +------------ 3 files changed, 23 insertions(+), 14 deletions(-)
===================================================================
drivers/input/mouse/psmouse-base.c +21 -2
@@ -287,6 +287,24 @@return 0 ; } + +/* +* psmouse_reset() resets the mouse into power-on state. +*/ +int psmouse_reset (struct psmouse *psmouse) +{ +unsigned char param[2 ]; + +if (psmouse_command (psmouse, param,PSMOUSE_CMD_RESET_BAT )) +return -1 ; + +if (param[0 ] !=PSMOUSE_RET_BAT && param[1 ] !=PSMOUSE_RET_ID ) +return -1 ; + +return 0 ; +} + +/* * Genius NetMouse magic init. */
@@ -416,6 +434,7 @@* pass through port it could get disabled while probing for protocol * extensions. */ +psmouse_reset (psmouse);psmouse_command (psmouse,NULL ,PSMOUSE_CMD_RESET_DIS ); }
@@ -540,8 +559,8 @@static void psmouse_cleanup (struct serio *serio) {struct psmouse *psmouse = serio->private; -unsigned char param[2 ]; -psmouse_command (psmouse, param,PSMOUSE_CMD_RESET_BAT ); + +psmouse_reset (psmouse); }/*
drivers/input/mouse/psmouse.h +1 -0
@@ -65,6 +65,7 @@#define PSMOUSE_SYNAPTICS 7int psmouse_command (struct psmouse *psmouse,unsigned char *param,int command); +int psmouse_reset (struct psmouse *psmouse);extern int psmouse_smartscroll;extern unsigned int psmouse_rate;
drivers/input/mouse/synaptics.c +1 -12
@@ -92,17 +92,6 @@return 0 ; } -static int synaptics_reset (struct psmouse *psmouse) -{ -unsigned char r[2 ]; - -if (psmouse_command (psmouse, r,PSMOUSE_CMD_RESET_BAT )) -return -1 ; -if (r[0 ] ==PSMOUSE_RET_BAT && r[1 ] ==PSMOUSE_RET_ID ) -return 0 ; -return -1 ; -} -/* * Read the model-id bytes from the touchpad * see also SYN_MODEL_* macros
@@ -197,7 +186,7 @@ {int retries =0 ; -while ((retries++ <3 ) &&synaptics_reset (psmouse)) +while ((retries++ <3 ) &&psmouse_reset (psmouse))printk (KERN_ERR "synaptics reset failed\n" );if (synaptics_identify (psmouse))
PATCH 3/3 Input patches: synaptics restore taps
===================================================================
[email protected], 2004-03-11 01:57:12-05:00, [email protected]
Input: if Synaptics' absolute mode is disabled make sure that
touchpad is reset back to relative mode and gestures (taps) are enabled
psmouse-base.c | 4 ++++ synaptics.c | 8 +++++++- synaptics.h | 1 + 3 files changed, 12 insertions(+), 1 deletion(-)
===================================================================
drivers/input/mouse/psmouse-base.c +4 -0
@@ -389,6 +389,10 @@*/ psmouse_max_proto =PSMOUSE_IMEX ; } +/* +* Make sure that touchpad is in relative mode, gestures (taps) are enabled +*/ +synaptics_reset (psmouse); }if (psmouse_max_proto >PSMOUSE_IMEX &&genius_detect (psmouse)) {
drivers/input/mouse/synaptics.c +7 -1
@@ -357,9 +357,15 @@clear_bit (REL_Y , dev->relbit); } -static void synaptics_disconnect (struct psmouse *psmouse) +void synaptics_reset (struct psmouse *psmouse) { +/* reset touchpad back to relative mode, gestures enabled */ synaptics_mode_cmd (psmouse,0 ); +} + +static void synaptics_disconnect (struct psmouse *psmouse) +{ +synaptics_reset (psmouse);kfree (psmouse->private); }
drivers/input/mouse/synaptics.h +1 -0
@@ -12,6 +12,7 @@extern void synaptics_process_byte (struct psmouse *psmouse,struct pt_regs *regs);extern int synaptics_detect (struct psmouse *psmouse);extern int synaptics_init (struct psmouse *psmouse); +extern void synaptics_reset (struct psmouse *psmouse);/* synaptics queries */ #define SYN_QUE_IDENTIFY 0x00