summaryrefslogtreecommitdiff
path: root/drivers/input/mouse
diff options
context:
space:
mode:
authorVojtech Pavlik <vojtech@ucw.cz>2004-01-20 22:21:08 +0100
committerVojtech Pavlik <vojtech@ucw.cz>2004-01-20 22:21:08 +0100
commit7d10ae4d4e615958ad34b4bcd381984cfaf05ee2 (patch)
treeb23bd571a103409e17641ba8b07450b211b9cbac /drivers/input/mouse
parent3940ed85276e69985e25ad687cc7dcb952e5d8a5 (diff)
parentdb288fe4634b11cec105a48b874ef787afe2dde0 (diff)
input: Manual merge.
Diffstat (limited to 'drivers/input/mouse')
-rw-r--r--drivers/input/mouse/logips2pp.c2
-rw-r--r--drivers/input/mouse/psmouse-base.c14
2 files changed, 12 insertions, 4 deletions
diff --git a/drivers/input/mouse/logips2pp.c b/drivers/input/mouse/logips2pp.c
index 7fd9c2afdef9..e9dac656cee1 100644
--- a/drivers/input/mouse/logips2pp.c
+++ b/drivers/input/mouse/logips2pp.c
@@ -150,7 +150,7 @@ static int ps2pp_detect_model(struct psmouse *psmouse, unsigned char *param)
static int logitech_wheel[] = { 52, 53, 75, 76, 80, 81, 83, 88, 112, -1 };
static int logitech_ps2pp[] = { 12, 13, 40, 41, 42, 43, 50, 51, 52, 53, 73, 75,
76, 80, 81, 83, 88, 96, 97, 112, -1 };
- static int logitech_mx[] = { 112, -1 };
+ static int logitech_mx[] = { 61, 112, -1 };
psmouse->vendor = "Logitech";
psmouse->model = ((param[0] >> 4) & 0x07) | ((param[0] << 3) & 0x78);
diff --git a/drivers/input/mouse/psmouse-base.c b/drivers/input/mouse/psmouse-base.c
index fb7dde20cdcc..4b243cd5f64c 100644
--- a/drivers/input/mouse/psmouse-base.c
+++ b/drivers/input/mouse/psmouse-base.c
@@ -231,6 +231,11 @@ int psmouse_command(struct psmouse *psmouse, unsigned char *param, int command)
if (command == PSMOUSE_CMD_RESET_BAT)
timeout = 4000000; /* 4 sec */
+ /* initialize cmdbuf with preset values from param */
+ if (receive)
+ for (i = 0; i < receive; i++)
+ psmouse->cmdbuf[(receive - 1) - i] = param[i];
+
if (command & 0xff)
if (psmouse_sendbyte(psmouse, command & 0xff))
return (psmouse->cmdcnt = 0) - 1;
@@ -241,8 +246,9 @@ int psmouse_command(struct psmouse *psmouse, unsigned char *param, int command)
while (psmouse->cmdcnt && timeout--) {
- if (psmouse->cmdcnt == 1 && command == PSMOUSE_CMD_RESET_BAT)
- timeout = 100000;
+ if (psmouse->cmdcnt == 1 && command == PSMOUSE_CMD_RESET_BAT &&
+ timeout > 100000) /* do not run in a endless loop */
+ timeout = 100000; /* 1 sec */
if (psmouse->cmdcnt == 1 && command == PSMOUSE_CMD_GETID &&
psmouse->cmdbuf[1] != 0xab && psmouse->cmdbuf[1] != 0xac) {
@@ -410,7 +416,7 @@ static int psmouse_probe(struct psmouse *psmouse)
* in case of an IntelliMouse in 4-byte mode or 0x04 for IM Explorer.
*/
- param[0] = param[1] = 0xa5;
+ param[0] = 0xa5;
if (psmouse_command(psmouse, param, PSMOUSE_CMD_GETID))
return -1;
@@ -574,12 +580,14 @@ static void psmouse_connect(struct serio *serio, struct serio_dev *dev)
serio->private = psmouse;
if (serio_open(serio, dev)) {
kfree(psmouse);
+ serio->private = NULL;
return;
}
if (psmouse_probe(psmouse) <= 0) {
serio_close(serio);
kfree(psmouse);
+ serio->private = NULL;
return;
}