2004-03-11 07:39:15

by Dmitry Torokhov

[permalink] [raw]
Subject: [PATCH 0/3] 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

--
Dmitry


2004-03-11 07:40:27

by Dmitry Torokhov

[permalink] [raw]
Subject: [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(-)


===================================================================



diff -Nru a/drivers/input/mouse/psmouse-base.c b/drivers/input/mouse/psmouse-base.c
--- a/drivers/input/mouse/psmouse-base.c Thu Mar 11 02:08:01 2004
+++ b/drivers/input/mouse/psmouse-base.c Thu Mar 11 02:08:01 2004
@@ -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)) {
diff -Nru a/drivers/input/mouse/synaptics.c b/drivers/input/mouse/synaptics.c
--- a/drivers/input/mouse/synaptics.c Thu Mar 11 02:08:01 2004
+++ b/drivers/input/mouse/synaptics.c Thu Mar 11 02:08:01 2004
@@ -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);
}

diff -Nru a/drivers/input/mouse/synaptics.h b/drivers/input/mouse/synaptics.h
--- a/drivers/input/mouse/synaptics.h Thu Mar 11 02:08:01 2004
+++ b/drivers/input/mouse/synaptics.h Thu Mar 11 02:08:01 2004
@@ -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

2004-03-11 07:40:28

by Dmitry Torokhov

[permalink] [raw]
Subject: [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(-)


===================================================================



diff -Nru a/drivers/input/mouse/psmouse-base.c b/drivers/input/mouse/psmouse-base.c
--- a/drivers/input/mouse/psmouse-base.c Thu Mar 11 02:07:38 2004
+++ b/drivers/input/mouse/psmouse-base.c Thu Mar 11 02:07:38 2004
@@ -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);
}

/*
diff -Nru a/drivers/input/mouse/psmouse.h b/drivers/input/mouse/psmouse.h
--- a/drivers/input/mouse/psmouse.h Thu Mar 11 02:07:38 2004
+++ b/drivers/input/mouse/psmouse.h Thu Mar 11 02:07:38 2004
@@ -65,6 +65,7 @@
#define PSMOUSE_SYNAPTICS 7

int 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;
diff -Nru a/drivers/input/mouse/synaptics.c b/drivers/input/mouse/synaptics.c
--- a/drivers/input/mouse/synaptics.c Thu Mar 11 02:07:38 2004
+++ b/drivers/input/mouse/synaptics.c Thu Mar 11 02:07:38 2004
@@ -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))

2004-03-11 07:43:21

by Dmitry Torokhov

[permalink] [raw]
Subject: [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(-)


===================================================================



diff -Nru a/drivers/input/mouse/psmouse-base.c b/drivers/input/mouse/psmouse-base.c
--- a/drivers/input/mouse/psmouse-base.c Thu Mar 11 02:07:09 2004
+++ b/drivers/input/mouse/psmouse-base.c Thu Mar 11 02:07:09 2004
@@ -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))
diff -Nru a/drivers/input/mouse/psmouse.h b/drivers/input/mouse/psmouse.h
--- a/drivers/input/mouse/psmouse.h Thu Mar 11 02:07:09 2004
+++ b/drivers/input/mouse/psmouse.h Thu Mar 11 02:07:09 2004
@@ -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