From: Dmitry Torokhov add psmouse_sliced_command (passes extended commands encoded with 0xE8 to the mouse) and use it in Synaptics and Logitech drivers --- 25-akpm/drivers/input/mouse/logips2pp.c | 12 +----------- 25-akpm/drivers/input/mouse/psmouse-base.c | 24 ++++++++++++++++++++++++ 25-akpm/drivers/input/mouse/psmouse.h | 1 + 25-akpm/drivers/input/mouse/synaptics.c | 28 +++------------------------- 4 files changed, 29 insertions(+), 36 deletions(-) diff -puN drivers/input/mouse/logips2pp.c~new-set-of-input-patches-psmouse-sliced-commands drivers/input/mouse/logips2pp.c --- 25/drivers/input/mouse/logips2pp.c~new-set-of-input-patches-psmouse-sliced-commands 2004-04-21 00:22:44.547263072 -0700 +++ 25-akpm/drivers/input/mouse/logips2pp.c 2004-04-21 00:22:44.556261704 -0700 @@ -63,7 +63,6 @@ void ps2pp_process_packet(struct psmouse packet[0] &= 0x0f; packet[1] = 0; packet[2] = 0; - } } @@ -76,18 +75,9 @@ void ps2pp_process_packet(struct psmouse static int ps2pp_cmd(struct psmouse *psmouse, unsigned char *param, unsigned char command) { - unsigned char d; - int i; - - if (psmouse_command(psmouse, NULL, PSMOUSE_CMD_SETSCALE11)) + if (psmouse_sliced_command(psmouse, command)) return -1; - for (i = 6; i >= 0; i -= 2) { - d = (command >> i) & 3; - if(psmouse_command(psmouse, &d, PSMOUSE_CMD_SETRES)) - return -1; - } - if (psmouse_command(psmouse, param, PSMOUSE_CMD_POLL)) return -1; diff -puN drivers/input/mouse/psmouse-base.c~new-set-of-input-patches-psmouse-sliced-commands drivers/input/mouse/psmouse-base.c --- 25/drivers/input/mouse/psmouse-base.c~new-set-of-input-patches-psmouse-sliced-commands 2004-04-21 00:22:44.549262768 -0700 +++ 25-akpm/drivers/input/mouse/psmouse-base.c 2004-04-21 00:22:44.556261704 -0700 @@ -312,6 +312,30 @@ int psmouse_command(struct psmouse *psmo /* + * psmouse_sliced_command() sends an extended PS/2 command to the mouse + * using sliced syntax, understood by advanced devices, such as Logitech + * or Synaptics touchpads. The command is encoded as: + * 0xE6 0xE8 rr 0xE8 ss 0xE8 tt 0xE8 uu where (rr*64)+(ss*16)+(tt*4)+uu + * is the command. + */ +int psmouse_sliced_command(struct psmouse *psmouse, unsigned char command) +{ + int i; + + if (psmouse_command(psmouse, NULL, PSMOUSE_CMD_SETSCALE11)) + return -1; + + for (i = 6; i >= 0; i -= 2) { + unsigned char d = (command >> i) & 3; + if (psmouse_command(psmouse, &d, PSMOUSE_CMD_SETRES)) + return -1; + } + + return 0; +} + + +/* * psmouse_reset() resets the mouse into power-on state. */ int psmouse_reset(struct psmouse *psmouse) diff -puN drivers/input/mouse/psmouse.h~new-set-of-input-patches-psmouse-sliced-commands drivers/input/mouse/psmouse.h --- 25/drivers/input/mouse/psmouse.h~new-set-of-input-patches-psmouse-sliced-commands 2004-04-21 00:22:44.550262616 -0700 +++ 25-akpm/drivers/input/mouse/psmouse.h 2004-04-21 00:22:44.557261552 -0700 @@ -74,6 +74,7 @@ struct psmouse { #define PSMOUSE_SYNAPTICS 7 int psmouse_command(struct psmouse *psmouse, unsigned char *param, int command); +int psmouse_sliced_command(struct psmouse *psmouse, unsigned char command); int psmouse_reset(struct psmouse *psmouse); extern int psmouse_smartscroll; diff -puN drivers/input/mouse/synaptics.c~new-set-of-input-patches-psmouse-sliced-commands drivers/input/mouse/synaptics.c --- 25/drivers/input/mouse/synaptics.c~new-set-of-input-patches-psmouse-sliced-commands 2004-04-21 00:22:44.552262312 -0700 +++ 25-akpm/drivers/input/mouse/synaptics.c 2004-04-21 00:22:44.558261400 -0700 @@ -44,33 +44,11 @@ ****************************************************************************/ /* - * Use the Synaptics extended ps/2 syntax to write a special command byte. - * special command: 0xE8 rr 0xE8 ss 0xE8 tt 0xE8 uu where (rr*64)+(ss*16)+(tt*4)+uu - * is the command. A 0xF3 or 0xE9 must follow (see synaptics_send_cmd - * and synaptics_mode_cmd) - */ -static int synaptics_special_cmd(struct psmouse *psmouse, unsigned char command) -{ - int i; - - if (psmouse_command(psmouse, NULL, PSMOUSE_CMD_SETSCALE11)) - return -1; - - for (i = 6; i >= 0; i -= 2) { - unsigned char d = (command >> i) & 3; - if (psmouse_command(psmouse, &d, PSMOUSE_CMD_SETRES)) - return -1; - } - - return 0; -} - -/* * Send a command to the synpatics touchpad by special commands */ static int synaptics_send_cmd(struct psmouse *psmouse, unsigned char c, unsigned char *param) { - if (synaptics_special_cmd(psmouse, c)) + if (psmouse_sliced_command(psmouse, c)) return -1; if (psmouse_command(psmouse, param, PSMOUSE_CMD_GETINFO)) return -1; @@ -84,7 +62,7 @@ static int synaptics_mode_cmd(struct psm { unsigned char param[1]; - if (synaptics_special_cmd(psmouse, mode)) + if (psmouse_sliced_command(psmouse, mode)) return -1; param[0] = SYN_PS_SET_MODE2; if (psmouse_command(psmouse, param, PSMOUSE_CMD_SETRATE)) @@ -248,7 +226,7 @@ static int synaptics_pt_write(struct ser struct psmouse *parent = port->driver; char rate_param = SYN_PS_CLIENT_CMD; /* indicates that we want pass-through port */ - if (synaptics_special_cmd(parent, c)) + if (psmouse_sliced_command(parent, c)) return -1; if (psmouse_command(parent, &rate_param, PSMOUSE_CMD_SETRATE)) return -1; _