Merge branches 'topic/fix/asoc', 'topic/fix/hda', 'topic/fix/misc' and 'topic/pci...
[linux-2.6] / drivers / input / mouse / psmouse-base.c
1 /*
2  * PS/2 mouse driver
3  *
4  * Copyright (c) 1999-2002 Vojtech Pavlik
5  * Copyright (c) 2003-2004 Dmitry Torokhov
6  */
7
8 /*
9  * This program is free software; you can redistribute it and/or modify it
10  * under the terms of the GNU General Public License version 2 as published by
11  * the Free Software Foundation.
12  */
13
14 #include <linux/delay.h>
15 #include <linux/module.h>
16 #include <linux/slab.h>
17 #include <linux/interrupt.h>
18 #include <linux/input.h>
19 #include <linux/serio.h>
20 #include <linux/init.h>
21 #include <linux/libps2.h>
22 #include <linux/mutex.h>
23
24 #include "psmouse.h"
25 #include "synaptics.h"
26 #include "logips2pp.h"
27 #include "alps.h"
28 #include "hgpk.h"
29 #include "lifebook.h"
30 #include "trackpoint.h"
31 #include "touchkit_ps2.h"
32
33 #define DRIVER_DESC     "PS/2 mouse driver"
34
35 MODULE_AUTHOR("Vojtech Pavlik <vojtech@suse.cz>");
36 MODULE_DESCRIPTION(DRIVER_DESC);
37 MODULE_LICENSE("GPL");
38
39 static unsigned int psmouse_max_proto = PSMOUSE_AUTO;
40 static int psmouse_set_maxproto(const char *val, struct kernel_param *kp);
41 static int psmouse_get_maxproto(char *buffer, struct kernel_param *kp);
42 #define param_check_proto_abbrev(name, p)       __param_check(name, p, unsigned int)
43 #define param_set_proto_abbrev                  psmouse_set_maxproto
44 #define param_get_proto_abbrev                  psmouse_get_maxproto
45 module_param_named(proto, psmouse_max_proto, proto_abbrev, 0644);
46 MODULE_PARM_DESC(proto, "Highest protocol extension to probe (bare, imps, exps, any). Useful for KVM switches.");
47
48 static unsigned int psmouse_resolution = 200;
49 module_param_named(resolution, psmouse_resolution, uint, 0644);
50 MODULE_PARM_DESC(resolution, "Resolution, in dpi.");
51
52 static unsigned int psmouse_rate = 100;
53 module_param_named(rate, psmouse_rate, uint, 0644);
54 MODULE_PARM_DESC(rate, "Report rate, in reports per second.");
55
56 static unsigned int psmouse_smartscroll = 1;
57 module_param_named(smartscroll, psmouse_smartscroll, bool, 0644);
58 MODULE_PARM_DESC(smartscroll, "Logitech Smartscroll autorepeat, 1 = enabled (default), 0 = disabled.");
59
60 static unsigned int psmouse_resetafter = 5;
61 module_param_named(resetafter, psmouse_resetafter, uint, 0644);
62 MODULE_PARM_DESC(resetafter, "Reset device after so many bad packets (0 = never).");
63
64 static unsigned int psmouse_resync_time;
65 module_param_named(resync_time, psmouse_resync_time, uint, 0644);
66 MODULE_PARM_DESC(resync_time, "How long can mouse stay idle before forcing resync (in seconds, 0 = never).");
67
68 PSMOUSE_DEFINE_ATTR(protocol, S_IWUSR | S_IRUGO,
69                         NULL,
70                         psmouse_attr_show_protocol, psmouse_attr_set_protocol);
71 PSMOUSE_DEFINE_ATTR(rate, S_IWUSR | S_IRUGO,
72                         (void *) offsetof(struct psmouse, rate),
73                         psmouse_show_int_attr, psmouse_attr_set_rate);
74 PSMOUSE_DEFINE_ATTR(resolution, S_IWUSR | S_IRUGO,
75                         (void *) offsetof(struct psmouse, resolution),
76                         psmouse_show_int_attr, psmouse_attr_set_resolution);
77 PSMOUSE_DEFINE_ATTR(resetafter, S_IWUSR | S_IRUGO,
78                         (void *) offsetof(struct psmouse, resetafter),
79                         psmouse_show_int_attr, psmouse_set_int_attr);
80 PSMOUSE_DEFINE_ATTR(resync_time, S_IWUSR | S_IRUGO,
81                         (void *) offsetof(struct psmouse, resync_time),
82                         psmouse_show_int_attr, psmouse_set_int_attr);
83
84 static struct attribute *psmouse_attributes[] = {
85         &psmouse_attr_protocol.dattr.attr,
86         &psmouse_attr_rate.dattr.attr,
87         &psmouse_attr_resolution.dattr.attr,
88         &psmouse_attr_resetafter.dattr.attr,
89         &psmouse_attr_resync_time.dattr.attr,
90         NULL
91 };
92
93 static struct attribute_group psmouse_attribute_group = {
94         .attrs  = psmouse_attributes,
95 };
96
97 /*
98  * psmouse_mutex protects all operations changing state of mouse
99  * (connecting, disconnecting, changing rate or resolution via
100  * sysfs). We could use a per-device semaphore but since there
101  * rarely more than one PS/2 mouse connected and since semaphore
102  * is taken in "slow" paths it is not worth it.
103  */
104 static DEFINE_MUTEX(psmouse_mutex);
105
106 static struct workqueue_struct *kpsmoused_wq;
107
108 struct psmouse_protocol {
109         enum psmouse_type type;
110         const char *name;
111         const char *alias;
112         int maxproto;
113         int (*detect)(struct psmouse *, int);
114         int (*init)(struct psmouse *);
115 };
116
117 /*
118  * psmouse_process_byte() analyzes the PS/2 data stream and reports
119  * relevant events to the input module once full packet has arrived.
120  */
121
122 static psmouse_ret_t psmouse_process_byte(struct psmouse *psmouse)
123 {
124         struct input_dev *dev = psmouse->dev;
125         unsigned char *packet = psmouse->packet;
126
127         if (psmouse->pktcnt < psmouse->pktsize)
128                 return PSMOUSE_GOOD_DATA;
129
130 /*
131  * Full packet accumulated, process it
132  */
133
134 /*
135  * Scroll wheel on IntelliMice, scroll buttons on NetMice
136  */
137
138         if (psmouse->type == PSMOUSE_IMPS || psmouse->type == PSMOUSE_GENPS)
139                 input_report_rel(dev, REL_WHEEL, -(signed char) packet[3]);
140
141 /*
142  * Scroll wheel and buttons on IntelliMouse Explorer
143  */
144
145         if (psmouse->type == PSMOUSE_IMEX) {
146                 switch (packet[3] & 0xC0) {
147                         case 0x80: /* vertical scroll on IntelliMouse Explorer 4.0 */
148                                 input_report_rel(dev, REL_WHEEL, (int) (packet[3] & 32) - (int) (packet[3] & 31));
149                                 break;
150                         case 0x40: /* horizontal scroll on IntelliMouse Explorer 4.0 */
151                                 input_report_rel(dev, REL_HWHEEL, (int) (packet[3] & 32) - (int) (packet[3] & 31));
152                                 break;
153                         case 0x00:
154                         case 0xC0:
155                                 input_report_rel(dev, REL_WHEEL, (int) (packet[3] & 8) - (int) (packet[3] & 7));
156                                 input_report_key(dev, BTN_SIDE, (packet[3] >> 4) & 1);
157                                 input_report_key(dev, BTN_EXTRA, (packet[3] >> 5) & 1);
158                                 break;
159                 }
160         }
161
162 /*
163  * Extra buttons on Genius NewNet 3D
164  */
165
166         if (psmouse->type == PSMOUSE_GENPS) {
167                 input_report_key(dev, BTN_SIDE, (packet[0] >> 6) & 1);
168                 input_report_key(dev, BTN_EXTRA, (packet[0] >> 7) & 1);
169         }
170
171 /*
172  * Extra button on ThinkingMouse
173  */
174         if (psmouse->type == PSMOUSE_THINKPS) {
175                 input_report_key(dev, BTN_EXTRA, (packet[0] >> 3) & 1);
176                 /* Without this bit of weirdness moving up gives wildly high Y changes. */
177                 packet[1] |= (packet[0] & 0x40) << 1;
178         }
179
180 /*
181  * Cortron PS2 Trackball reports SIDE button on the 4th bit of the first
182  * byte.
183  */
184         if (psmouse->type == PSMOUSE_CORTRON) {
185                 input_report_key(dev, BTN_SIDE, (packet[0] >> 3) & 1);
186                 packet[0] |= 0x08;
187         }
188
189 /*
190  * Generic PS/2 Mouse
191  */
192
193         input_report_key(dev, BTN_LEFT,    packet[0]       & 1);
194         input_report_key(dev, BTN_MIDDLE, (packet[0] >> 2) & 1);
195         input_report_key(dev, BTN_RIGHT,  (packet[0] >> 1) & 1);
196
197         input_report_rel(dev, REL_X, packet[1] ? (int) packet[1] - (int) ((packet[0] << 4) & 0x100) : 0);
198         input_report_rel(dev, REL_Y, packet[2] ? (int) ((packet[0] << 3) & 0x100) - (int) packet[2] : 0);
199
200         input_sync(dev);
201
202         return PSMOUSE_FULL_PACKET;
203 }
204
205 void psmouse_queue_work(struct psmouse *psmouse, struct delayed_work *work,
206                 unsigned long delay)
207 {
208         queue_delayed_work(kpsmoused_wq, work, delay);
209 }
210
211 /*
212  * __psmouse_set_state() sets new psmouse state and resets all flags.
213  */
214
215 static inline void __psmouse_set_state(struct psmouse *psmouse, enum psmouse_state new_state)
216 {
217         psmouse->state = new_state;
218         psmouse->pktcnt = psmouse->out_of_sync = 0;
219         psmouse->ps2dev.flags = 0;
220         psmouse->last = jiffies;
221 }
222
223
224 /*
225  * psmouse_set_state() sets new psmouse state and resets all flags and
226  * counters while holding serio lock so fighting with interrupt handler
227  * is not a concern.
228  */
229
230 void psmouse_set_state(struct psmouse *psmouse, enum psmouse_state new_state)
231 {
232         serio_pause_rx(psmouse->ps2dev.serio);
233         __psmouse_set_state(psmouse, new_state);
234         serio_continue_rx(psmouse->ps2dev.serio);
235 }
236
237 /*
238  * psmouse_handle_byte() processes one byte of the input data stream
239  * by calling corresponding protocol handler.
240  */
241
242 static int psmouse_handle_byte(struct psmouse *psmouse)
243 {
244         psmouse_ret_t rc = psmouse->protocol_handler(psmouse);
245
246         switch (rc) {
247                 case PSMOUSE_BAD_DATA:
248                         if (psmouse->state == PSMOUSE_ACTIVATED) {
249                                 printk(KERN_WARNING "psmouse.c: %s at %s lost sync at byte %d\n",
250                                         psmouse->name, psmouse->phys, psmouse->pktcnt);
251                                 if (++psmouse->out_of_sync == psmouse->resetafter) {
252                                         __psmouse_set_state(psmouse, PSMOUSE_IGNORE);
253                                         printk(KERN_NOTICE "psmouse.c: issuing reconnect request\n");
254                                         serio_reconnect(psmouse->ps2dev.serio);
255                                         return -1;
256                                 }
257                         }
258                         psmouse->pktcnt = 0;
259                         break;
260
261                 case PSMOUSE_FULL_PACKET:
262                         psmouse->pktcnt = 0;
263                         if (psmouse->out_of_sync) {
264                                 psmouse->out_of_sync = 0;
265                                 printk(KERN_NOTICE "psmouse.c: %s at %s - driver resynched.\n",
266                                         psmouse->name, psmouse->phys);
267                         }
268                         break;
269
270                 case PSMOUSE_GOOD_DATA:
271                         break;
272         }
273         return 0;
274 }
275
276 /*
277  * psmouse_interrupt() handles incoming characters, either passing them
278  * for normal processing or gathering them as command response.
279  */
280
281 static irqreturn_t psmouse_interrupt(struct serio *serio,
282                 unsigned char data, unsigned int flags)
283 {
284         struct psmouse *psmouse = serio_get_drvdata(serio);
285
286         if (psmouse->state == PSMOUSE_IGNORE)
287                 goto out;
288
289         if (flags & (SERIO_PARITY|SERIO_TIMEOUT)) {
290                 if (psmouse->state == PSMOUSE_ACTIVATED)
291                         printk(KERN_WARNING "psmouse.c: bad data from KBC -%s%s\n",
292                                 flags & SERIO_TIMEOUT ? " timeout" : "",
293                                 flags & SERIO_PARITY ? " bad parity" : "");
294                 ps2_cmd_aborted(&psmouse->ps2dev);
295                 goto out;
296         }
297
298         if (unlikely(psmouse->ps2dev.flags & PS2_FLAG_ACK))
299                 if  (ps2_handle_ack(&psmouse->ps2dev, data))
300                         goto out;
301
302         if (unlikely(psmouse->ps2dev.flags & PS2_FLAG_CMD))
303                 if  (ps2_handle_response(&psmouse->ps2dev, data))
304                         goto out;
305
306         if (psmouse->state <= PSMOUSE_RESYNCING)
307                 goto out;
308
309         if (psmouse->state == PSMOUSE_ACTIVATED &&
310             psmouse->pktcnt && time_after(jiffies, psmouse->last + HZ/2)) {
311                 printk(KERN_INFO "psmouse.c: %s at %s lost synchronization, throwing %d bytes away.\n",
312                        psmouse->name, psmouse->phys, psmouse->pktcnt);
313                 psmouse->badbyte = psmouse->packet[0];
314                 __psmouse_set_state(psmouse, PSMOUSE_RESYNCING);
315                 psmouse_queue_work(psmouse, &psmouse->resync_work, 0);
316                 goto out;
317         }
318
319         psmouse->packet[psmouse->pktcnt++] = data;
320 /*
321  * Check if this is a new device announcement (0xAA 0x00)
322  */
323         if (unlikely(psmouse->packet[0] == PSMOUSE_RET_BAT && psmouse->pktcnt <= 2)) {
324                 if (psmouse->pktcnt == 1) {
325                         psmouse->last = jiffies;
326                         goto out;
327                 }
328
329                 if (psmouse->packet[1] == PSMOUSE_RET_ID) {
330                         __psmouse_set_state(psmouse, PSMOUSE_IGNORE);
331                         serio_reconnect(serio);
332                         goto out;
333                 }
334 /*
335  * Not a new device, try processing first byte normally
336  */
337                 psmouse->pktcnt = 1;
338                 if (psmouse_handle_byte(psmouse))
339                         goto out;
340
341                 psmouse->packet[psmouse->pktcnt++] = data;
342         }
343
344 /*
345  * See if we need to force resync because mouse was idle for too long
346  */
347         if (psmouse->state == PSMOUSE_ACTIVATED &&
348             psmouse->pktcnt == 1 && psmouse->resync_time &&
349             time_after(jiffies, psmouse->last + psmouse->resync_time * HZ)) {
350                 psmouse->badbyte = psmouse->packet[0];
351                 __psmouse_set_state(psmouse, PSMOUSE_RESYNCING);
352                 psmouse_queue_work(psmouse, &psmouse->resync_work, 0);
353                 goto out;
354         }
355
356         psmouse->last = jiffies;
357         psmouse_handle_byte(psmouse);
358
359  out:
360         return IRQ_HANDLED;
361 }
362
363
364 /*
365  * psmouse_sliced_command() sends an extended PS/2 command to the mouse
366  * using sliced syntax, understood by advanced devices, such as Logitech
367  * or Synaptics touchpads. The command is encoded as:
368  * 0xE6 0xE8 rr 0xE8 ss 0xE8 tt 0xE8 uu where (rr*64)+(ss*16)+(tt*4)+uu
369  * is the command.
370  */
371 int psmouse_sliced_command(struct psmouse *psmouse, unsigned char command)
372 {
373         int i;
374
375         if (ps2_command(&psmouse->ps2dev, NULL, PSMOUSE_CMD_SETSCALE11))
376                 return -1;
377
378         for (i = 6; i >= 0; i -= 2) {
379                 unsigned char d = (command >> i) & 3;
380                 if (ps2_command(&psmouse->ps2dev, &d, PSMOUSE_CMD_SETRES))
381                         return -1;
382         }
383
384         return 0;
385 }
386
387
388 /*
389  * psmouse_reset() resets the mouse into power-on state.
390  */
391 int psmouse_reset(struct psmouse *psmouse)
392 {
393         unsigned char param[2];
394
395         if (ps2_command(&psmouse->ps2dev, param, PSMOUSE_CMD_RESET_BAT))
396                 return -1;
397
398         if (param[0] != PSMOUSE_RET_BAT && param[1] != PSMOUSE_RET_ID)
399                 return -1;
400
401         return 0;
402 }
403
404
405 /*
406  * Genius NetMouse magic init.
407  */
408 static int genius_detect(struct psmouse *psmouse, int set_properties)
409 {
410         struct ps2dev *ps2dev = &psmouse->ps2dev;
411         unsigned char param[4];
412
413         param[0] = 3;
414         ps2_command(ps2dev, param, PSMOUSE_CMD_SETRES);
415         ps2_command(ps2dev,  NULL, PSMOUSE_CMD_SETSCALE11);
416         ps2_command(ps2dev,  NULL, PSMOUSE_CMD_SETSCALE11);
417         ps2_command(ps2dev,  NULL, PSMOUSE_CMD_SETSCALE11);
418         ps2_command(ps2dev, param, PSMOUSE_CMD_GETINFO);
419
420         if (param[0] != 0x00 || param[1] != 0x33 || param[2] != 0x55)
421                 return -1;
422
423         if (set_properties) {
424                 set_bit(BTN_EXTRA, psmouse->dev->keybit);
425                 set_bit(BTN_SIDE, psmouse->dev->keybit);
426                 set_bit(REL_WHEEL, psmouse->dev->relbit);
427
428                 psmouse->vendor = "Genius";
429                 psmouse->name = "Mouse";
430                 psmouse->pktsize = 4;
431         }
432
433         return 0;
434 }
435
436 /*
437  * IntelliMouse magic init.
438  */
439 static int intellimouse_detect(struct psmouse *psmouse, int set_properties)
440 {
441         struct ps2dev *ps2dev = &psmouse->ps2dev;
442         unsigned char param[2];
443
444         param[0] = 200;
445         ps2_command(ps2dev, param, PSMOUSE_CMD_SETRATE);
446         param[0] = 100;
447         ps2_command(ps2dev, param, PSMOUSE_CMD_SETRATE);
448         param[0] =  80;
449         ps2_command(ps2dev, param, PSMOUSE_CMD_SETRATE);
450         ps2_command(ps2dev, param, PSMOUSE_CMD_GETID);
451
452         if (param[0] != 3)
453                 return -1;
454
455         if (set_properties) {
456                 set_bit(BTN_MIDDLE, psmouse->dev->keybit);
457                 set_bit(REL_WHEEL, psmouse->dev->relbit);
458
459                 if (!psmouse->vendor) psmouse->vendor = "Generic";
460                 if (!psmouse->name) psmouse->name = "Wheel Mouse";
461                 psmouse->pktsize = 4;
462         }
463
464         return 0;
465 }
466
467 /*
468  * Try IntelliMouse/Explorer magic init.
469  */
470 static int im_explorer_detect(struct psmouse *psmouse, int set_properties)
471 {
472         struct ps2dev *ps2dev = &psmouse->ps2dev;
473         unsigned char param[2];
474
475         intellimouse_detect(psmouse, 0);
476
477         param[0] = 200;
478         ps2_command(ps2dev, param, PSMOUSE_CMD_SETRATE);
479         param[0] = 200;
480         ps2_command(ps2dev, param, PSMOUSE_CMD_SETRATE);
481         param[0] =  80;
482         ps2_command(ps2dev, param, PSMOUSE_CMD_SETRATE);
483         ps2_command(ps2dev, param, PSMOUSE_CMD_GETID);
484
485         if (param[0] != 4)
486                 return -1;
487
488 /* Magic to enable horizontal scrolling on IntelliMouse 4.0 */
489         param[0] = 200;
490         ps2_command(ps2dev, param, PSMOUSE_CMD_SETRATE);
491         param[0] =  80;
492         ps2_command(ps2dev, param, PSMOUSE_CMD_SETRATE);
493         param[0] =  40;
494         ps2_command(ps2dev, param, PSMOUSE_CMD_SETRATE);
495
496         if (set_properties) {
497                 set_bit(BTN_MIDDLE, psmouse->dev->keybit);
498                 set_bit(REL_WHEEL, psmouse->dev->relbit);
499                 set_bit(REL_HWHEEL, psmouse->dev->relbit);
500                 set_bit(BTN_SIDE, psmouse->dev->keybit);
501                 set_bit(BTN_EXTRA, psmouse->dev->keybit);
502
503                 if (!psmouse->vendor) psmouse->vendor = "Generic";
504                 if (!psmouse->name) psmouse->name = "Explorer Mouse";
505                 psmouse->pktsize = 4;
506         }
507
508         return 0;
509 }
510
511 /*
512  * Kensington ThinkingMouse / ExpertMouse magic init.
513  */
514 static int thinking_detect(struct psmouse *psmouse, int set_properties)
515 {
516         struct ps2dev *ps2dev = &psmouse->ps2dev;
517         unsigned char param[2];
518         static const unsigned char seq[] = { 20, 60, 40, 20, 20, 60, 40, 20, 20 };
519         int i;
520
521         param[0] = 10;
522         ps2_command(ps2dev, param, PSMOUSE_CMD_SETRATE);
523         param[0] = 0;
524         ps2_command(ps2dev, param, PSMOUSE_CMD_SETRES);
525         for (i = 0; i < ARRAY_SIZE(seq); i++) {
526                 param[0] = seq[i];
527                 ps2_command(ps2dev, param, PSMOUSE_CMD_SETRATE);
528         }
529         ps2_command(ps2dev, param, PSMOUSE_CMD_GETID);
530
531         if (param[0] != 2)
532                 return -1;
533
534         if (set_properties) {
535                 set_bit(BTN_EXTRA, psmouse->dev->keybit);
536
537                 psmouse->vendor = "Kensington";
538                 psmouse->name = "ThinkingMouse";
539         }
540
541         return 0;
542 }
543
544 /*
545  * Bare PS/2 protocol "detection". Always succeeds.
546  */
547 static int ps2bare_detect(struct psmouse *psmouse, int set_properties)
548 {
549         if (set_properties) {
550                 if (!psmouse->vendor) psmouse->vendor = "Generic";
551                 if (!psmouse->name) psmouse->name = "Mouse";
552         }
553
554         return 0;
555 }
556
557 /*
558  * Cortron PS/2 protocol detection. There's no special way to detect it, so it
559  * must be forced by sysfs protocol writing.
560  */
561 static int cortron_detect(struct psmouse *psmouse, int set_properties)
562 {
563         if (set_properties) {
564                 psmouse->vendor = "Cortron";
565                 psmouse->name = "PS/2 Trackball";
566                 set_bit(BTN_SIDE, psmouse->dev->keybit);
567         }
568
569         return 0;
570 }
571
572 /*
573  * psmouse_extensions() probes for any extensions to the basic PS/2 protocol
574  * the mouse may have.
575  */
576
577 static int psmouse_extensions(struct psmouse *psmouse,
578                               unsigned int max_proto, int set_properties)
579 {
580         int synaptics_hardware = 0;
581
582 /*
583  * We always check for lifebook because it does not disturb mouse
584  * (it only checks DMI information).
585  */
586         if (lifebook_detect(psmouse, set_properties) == 0) {
587                 if (max_proto > PSMOUSE_IMEX) {
588                         if (!set_properties || lifebook_init(psmouse) == 0)
589                                 return PSMOUSE_LIFEBOOK;
590                 }
591         }
592
593 /*
594  * Try Kensington ThinkingMouse (we try first, because synaptics probe
595  * upsets the thinkingmouse).
596  */
597
598         if (max_proto > PSMOUSE_IMEX && thinking_detect(psmouse, set_properties) == 0)
599                 return PSMOUSE_THINKPS;
600
601 /*
602  * Try Synaptics TouchPad. Note that probing is done even if Synaptics protocol
603  * support is disabled in config - we need to know if it is synaptics so we
604  * can reset it properly after probing for intellimouse.
605  */
606         if (max_proto > PSMOUSE_PS2 && synaptics_detect(psmouse, set_properties) == 0) {
607                 synaptics_hardware = 1;
608
609                 if (max_proto > PSMOUSE_IMEX) {
610                         if (!set_properties || synaptics_init(psmouse) == 0)
611                                 return PSMOUSE_SYNAPTICS;
612 /*
613  * Some Synaptics touchpads can emulate extended protocols (like IMPS/2).
614  * Unfortunately Logitech/Genius probes confuse some firmware versions so
615  * we'll have to skip them.
616  */
617                         max_proto = PSMOUSE_IMEX;
618                 }
619 /*
620  * Make sure that touchpad is in relative mode, gestures (taps) are enabled
621  */
622                 synaptics_reset(psmouse);
623         }
624
625 /*
626  * Try ALPS TouchPad
627  */
628         if (max_proto > PSMOUSE_IMEX) {
629                 ps2_command(&psmouse->ps2dev, NULL, PSMOUSE_CMD_RESET_DIS);
630                 if (alps_detect(psmouse, set_properties) == 0) {
631                         if (!set_properties || alps_init(psmouse) == 0)
632                                 return PSMOUSE_ALPS;
633 /*
634  * Init failed, try basic relative protocols
635  */
636                         max_proto = PSMOUSE_IMEX;
637                 }
638         }
639
640 /*
641  * Try OLPC HGPK touchpad.
642  */
643         if (max_proto > PSMOUSE_IMEX &&
644                         hgpk_detect(psmouse, set_properties) == 0) {
645                 if (!set_properties || hgpk_init(psmouse) == 0)
646                         return PSMOUSE_HGPK;
647 /*
648  * Init failed, try basic relative protocols
649  */
650                 max_proto = PSMOUSE_IMEX;
651         }
652
653         if (max_proto > PSMOUSE_IMEX) {
654                 if (genius_detect(psmouse, set_properties) == 0)
655                         return PSMOUSE_GENPS;
656
657                 if (ps2pp_init(psmouse, set_properties) == 0)
658                         return PSMOUSE_PS2PP;
659
660                 if (trackpoint_detect(psmouse, set_properties) == 0)
661                         return PSMOUSE_TRACKPOINT;
662
663                 if (touchkit_ps2_detect(psmouse, set_properties) == 0)
664                         return PSMOUSE_TOUCHKIT_PS2;
665         }
666
667 /*
668  * Reset to defaults in case the device got confused by extended
669  * protocol probes. Note that we follow up with full reset because
670  * some mice put themselves to sleep when they see PSMOUSE_RESET_DIS.
671  */
672         ps2_command(&psmouse->ps2dev, NULL, PSMOUSE_CMD_RESET_DIS);
673         psmouse_reset(psmouse);
674
675         if (max_proto >= PSMOUSE_IMEX && im_explorer_detect(psmouse, set_properties) == 0)
676                 return PSMOUSE_IMEX;
677
678         if (max_proto >= PSMOUSE_IMPS && intellimouse_detect(psmouse, set_properties) == 0)
679                 return PSMOUSE_IMPS;
680
681 /*
682  * Okay, all failed, we have a standard mouse here. The number of the buttons
683  * is still a question, though. We assume 3.
684  */
685         ps2bare_detect(psmouse, set_properties);
686
687         if (synaptics_hardware) {
688 /*
689  * We detected Synaptics hardware but it did not respond to IMPS/2 probes.
690  * We need to reset the touchpad because if there is a track point on the
691  * pass through port it could get disabled while probing for protocol
692  * extensions.
693  */
694                 psmouse_reset(psmouse);
695         }
696
697         return PSMOUSE_PS2;
698 }
699
700 static const struct psmouse_protocol psmouse_protocols[] = {
701         {
702                 .type           = PSMOUSE_PS2,
703                 .name           = "PS/2",
704                 .alias          = "bare",
705                 .maxproto       = 1,
706                 .detect         = ps2bare_detect,
707         },
708 #ifdef CONFIG_MOUSE_PS2_LOGIPS2PP
709         {
710                 .type           = PSMOUSE_PS2PP,
711                 .name           = "PS2++",
712                 .alias          = "logitech",
713                 .detect         = ps2pp_init,
714         },
715 #endif
716         {
717                 .type           = PSMOUSE_THINKPS,
718                 .name           = "ThinkPS/2",
719                 .alias          = "thinkps",
720                 .detect         = thinking_detect,
721         },
722         {
723                 .type           = PSMOUSE_GENPS,
724                 .name           = "GenPS/2",
725                 .alias          = "genius",
726                 .detect         = genius_detect,
727         },
728         {
729                 .type           = PSMOUSE_IMPS,
730                 .name           = "ImPS/2",
731                 .alias          = "imps",
732                 .maxproto       = 1,
733                 .detect         = intellimouse_detect,
734         },
735         {
736                 .type           = PSMOUSE_IMEX,
737                 .name           = "ImExPS/2",
738                 .alias          = "exps",
739                 .maxproto       = 1,
740                 .detect         = im_explorer_detect,
741         },
742 #ifdef CONFIG_MOUSE_PS2_SYNAPTICS
743         {
744                 .type           = PSMOUSE_SYNAPTICS,
745                 .name           = "SynPS/2",
746                 .alias          = "synaptics",
747                 .detect         = synaptics_detect,
748                 .init           = synaptics_init,
749         },
750 #endif
751 #ifdef CONFIG_MOUSE_PS2_ALPS
752         {
753                 .type           = PSMOUSE_ALPS,
754                 .name           = "AlpsPS/2",
755                 .alias          = "alps",
756                 .detect         = alps_detect,
757                 .init           = alps_init,
758         },
759 #endif
760 #ifdef CONFIG_MOUSE_PS2_LIFEBOOK
761         {
762                 .type           = PSMOUSE_LIFEBOOK,
763                 .name           = "LBPS/2",
764                 .alias          = "lifebook",
765                 .init           = lifebook_init,
766         },
767 #endif
768 #ifdef CONFIG_MOUSE_PS2_TRACKPOINT
769         {
770                 .type           = PSMOUSE_TRACKPOINT,
771                 .name           = "TPPS/2",
772                 .alias          = "trackpoint",
773                 .detect         = trackpoint_detect,
774         },
775 #endif
776 #ifdef CONFIG_MOUSE_PS2_TOUCHKIT
777         {
778                 .type           = PSMOUSE_TOUCHKIT_PS2,
779                 .name           = "touchkitPS/2",
780                 .alias          = "touchkit",
781                 .detect         = touchkit_ps2_detect,
782         },
783 #endif
784 #ifdef CONFIG_MOUSE_PS2_OLPC
785         {
786                 .type           = PSMOUSE_HGPK,
787                 .name           = "OLPC HGPK",
788                 .alias          = "hgpk",
789                 .detect         = hgpk_detect,
790         },
791 #endif
792         {
793                 .type           = PSMOUSE_CORTRON,
794                 .name           = "CortronPS/2",
795                 .alias          = "cortps",
796                 .detect         = cortron_detect,
797         },
798         {
799                 .type           = PSMOUSE_AUTO,
800                 .name           = "auto",
801                 .alias          = "any",
802                 .maxproto       = 1,
803         },
804 };
805
806 static const struct psmouse_protocol *psmouse_protocol_by_type(enum psmouse_type type)
807 {
808         int i;
809
810         for (i = 0; i < ARRAY_SIZE(psmouse_protocols); i++)
811                 if (psmouse_protocols[i].type == type)
812                         return &psmouse_protocols[i];
813
814         WARN_ON(1);
815         return &psmouse_protocols[0];
816 }
817
818 static const struct psmouse_protocol *psmouse_protocol_by_name(const char *name, size_t len)
819 {
820         const struct psmouse_protocol *p;
821         int i;
822
823         for (i = 0; i < ARRAY_SIZE(psmouse_protocols); i++) {
824                 p = &psmouse_protocols[i];
825
826                 if ((strlen(p->name) == len && !strncmp(p->name, name, len)) ||
827                     (strlen(p->alias) == len && !strncmp(p->alias, name, len)))
828                         return &psmouse_protocols[i];
829         }
830
831         return NULL;
832 }
833
834
835 /*
836  * psmouse_probe() probes for a PS/2 mouse.
837  */
838
839 static int psmouse_probe(struct psmouse *psmouse)
840 {
841         struct ps2dev *ps2dev = &psmouse->ps2dev;
842         unsigned char param[2];
843
844 /*
845  * First, we check if it's a mouse. It should send 0x00 or 0x03
846  * in case of an IntelliMouse in 4-byte mode or 0x04 for IM Explorer.
847  * Sunrex K8561 IR Keyboard/Mouse reports 0xff on second and subsequent
848  * ID queries, probably due to a firmware bug.
849  */
850
851         param[0] = 0xa5;
852         if (ps2_command(ps2dev, param, PSMOUSE_CMD_GETID))
853                 return -1;
854
855         if (param[0] != 0x00 && param[0] != 0x03 &&
856             param[0] != 0x04 && param[0] != 0xff)
857                 return -1;
858
859 /*
860  * Then we reset and disable the mouse so that it doesn't generate events.
861  */
862
863         if (ps2_command(ps2dev, NULL, PSMOUSE_CMD_RESET_DIS))
864                 printk(KERN_WARNING "psmouse.c: Failed to reset mouse on %s\n", ps2dev->serio->phys);
865
866         return 0;
867 }
868
869 /*
870  * Here we set the mouse resolution.
871  */
872
873 void psmouse_set_resolution(struct psmouse *psmouse, unsigned int resolution)
874 {
875         static const unsigned char params[] = { 0, 1, 2, 2, 3 };
876         unsigned char p;
877
878         if (resolution == 0 || resolution > 200)
879                 resolution = 200;
880
881         p = params[resolution / 50];
882         ps2_command(&psmouse->ps2dev, &p, PSMOUSE_CMD_SETRES);
883         psmouse->resolution = 25 << p;
884 }
885
886 /*
887  * Here we set the mouse report rate.
888  */
889
890 static void psmouse_set_rate(struct psmouse *psmouse, unsigned int rate)
891 {
892         static const unsigned char rates[] = { 200, 100, 80, 60, 40, 20, 10, 0 };
893         unsigned char r;
894         int i = 0;
895
896         while (rates[i] > rate) i++;
897         r = rates[i];
898         ps2_command(&psmouse->ps2dev, &r, PSMOUSE_CMD_SETRATE);
899         psmouse->rate = r;
900 }
901
902 /*
903  * psmouse_initialize() initializes the mouse to a sane state.
904  */
905
906 static void psmouse_initialize(struct psmouse *psmouse)
907 {
908 /*
909  * We set the mouse report rate, resolution and scaling.
910  */
911
912         if (psmouse_max_proto != PSMOUSE_PS2) {
913                 psmouse->set_rate(psmouse, psmouse->rate);
914                 psmouse->set_resolution(psmouse, psmouse->resolution);
915                 ps2_command(&psmouse->ps2dev, NULL, PSMOUSE_CMD_SETSCALE11);
916         }
917 }
918
919 /*
920  * psmouse_activate() enables the mouse so that we get motion reports from it.
921  */
922
923 static void psmouse_activate(struct psmouse *psmouse)
924 {
925         if (ps2_command(&psmouse->ps2dev, NULL, PSMOUSE_CMD_ENABLE))
926                 printk(KERN_WARNING "psmouse.c: Failed to enable mouse on %s\n",
927                         psmouse->ps2dev.serio->phys);
928
929         psmouse_set_state(psmouse, PSMOUSE_ACTIVATED);
930 }
931
932
933 /*
934  * psmouse_deactivate() puts the mouse into poll mode so that we don't get motion
935  * reports from it unless we explicitly request it.
936  */
937
938 static void psmouse_deactivate(struct psmouse *psmouse)
939 {
940         if (ps2_command(&psmouse->ps2dev, NULL, PSMOUSE_CMD_DISABLE))
941                 printk(KERN_WARNING "psmouse.c: Failed to deactivate mouse on %s\n",
942                         psmouse->ps2dev.serio->phys);
943
944         psmouse_set_state(psmouse, PSMOUSE_CMD_MODE);
945 }
946
947 /*
948  * psmouse_poll() - default poll hanlder. Everyone except for ALPS uses it.
949  */
950
951 static int psmouse_poll(struct psmouse *psmouse)
952 {
953         return ps2_command(&psmouse->ps2dev, psmouse->packet,
954                            PSMOUSE_CMD_POLL | (psmouse->pktsize << 8));
955 }
956
957
958 /*
959  * psmouse_resync() attempts to re-validate current protocol.
960  */
961
962 static void psmouse_resync(struct work_struct *work)
963 {
964         struct psmouse *parent = NULL, *psmouse =
965                 container_of(work, struct psmouse, resync_work.work);
966         struct serio *serio = psmouse->ps2dev.serio;
967         psmouse_ret_t rc = PSMOUSE_GOOD_DATA;
968         int failed = 0, enabled = 0;
969         int i;
970
971         mutex_lock(&psmouse_mutex);
972
973         if (psmouse->state != PSMOUSE_RESYNCING)
974                 goto out;
975
976         if (serio->parent && serio->id.type == SERIO_PS_PSTHRU) {
977                 parent = serio_get_drvdata(serio->parent);
978                 psmouse_deactivate(parent);
979         }
980
981 /*
982  * Some mice don't ACK commands sent while they are in the middle of
983  * transmitting motion packet. To avoid delay we use ps2_sendbyte()
984  * instead of ps2_command() which would wait for 200ms for an ACK
985  * that may never come.
986  * As an additional quirk ALPS touchpads may not only forget to ACK
987  * disable command but will stop reporting taps, so if we see that
988  * mouse at least once ACKs disable we will do full reconnect if ACK
989  * is missing.
990  */
991         psmouse->num_resyncs++;
992
993         if (ps2_sendbyte(&psmouse->ps2dev, PSMOUSE_CMD_DISABLE, 20)) {
994                 if (psmouse->num_resyncs < 3 || psmouse->acks_disable_command)
995                         failed = 1;
996         } else
997                 psmouse->acks_disable_command = 1;
998
999 /*
1000  * Poll the mouse. If it was reset the packet will be shorter than
1001  * psmouse->pktsize and ps2_command will fail. We do not expect and
1002  * do not handle scenario when mouse "upgrades" its protocol while
1003  * disconnected since it would require additional delay. If we ever
1004  * see a mouse that does it we'll adjust the code.
1005  */
1006         if (!failed) {
1007                 if (psmouse->poll(psmouse))
1008                         failed = 1;
1009                 else {
1010                         psmouse_set_state(psmouse, PSMOUSE_CMD_MODE);
1011                         for (i = 0; i < psmouse->pktsize; i++) {
1012                                 psmouse->pktcnt++;
1013                                 rc = psmouse->protocol_handler(psmouse);
1014                                 if (rc != PSMOUSE_GOOD_DATA)
1015                                         break;
1016                         }
1017                         if (rc != PSMOUSE_FULL_PACKET)
1018                                 failed = 1;
1019                         psmouse_set_state(psmouse, PSMOUSE_RESYNCING);
1020                 }
1021         }
1022 /*
1023  * Now try to enable mouse. We try to do that even if poll failed and also
1024  * repeat our attempts 5 times, otherwise we may be left out with disabled
1025  * mouse.
1026  */
1027         for (i = 0; i < 5; i++) {
1028                 if (!ps2_command(&psmouse->ps2dev, NULL, PSMOUSE_CMD_ENABLE)) {
1029                         enabled = 1;
1030                         break;
1031                 }
1032                 msleep(200);
1033         }
1034
1035         if (!enabled) {
1036                 printk(KERN_WARNING "psmouse.c: failed to re-enable mouse on %s\n",
1037                         psmouse->ps2dev.serio->phys);
1038                 failed = 1;
1039         }
1040
1041         if (failed) {
1042                 psmouse_set_state(psmouse, PSMOUSE_IGNORE);
1043                 printk(KERN_INFO "psmouse.c: resync failed, issuing reconnect request\n");
1044                 serio_reconnect(serio);
1045         } else
1046                 psmouse_set_state(psmouse, PSMOUSE_ACTIVATED);
1047
1048         if (parent)
1049                 psmouse_activate(parent);
1050  out:
1051         mutex_unlock(&psmouse_mutex);
1052 }
1053
1054 /*
1055  * psmouse_cleanup() resets the mouse into power-on state.
1056  */
1057
1058 static void psmouse_cleanup(struct serio *serio)
1059 {
1060         struct psmouse *psmouse = serio_get_drvdata(serio);
1061         struct psmouse *parent = NULL;
1062
1063         mutex_lock(&psmouse_mutex);
1064
1065         if (serio->parent && serio->id.type == SERIO_PS_PSTHRU) {
1066                 parent = serio_get_drvdata(serio->parent);
1067                 psmouse_deactivate(parent);
1068         }
1069
1070         psmouse_deactivate(psmouse);
1071
1072         if (psmouse->cleanup)
1073                 psmouse->cleanup(psmouse);
1074
1075         psmouse_reset(psmouse);
1076
1077 /*
1078  * Some boxes, such as HP nx7400, get terribly confused if mouse
1079  * is not fully enabled before suspending/shutting down.
1080  */
1081         ps2_command(&psmouse->ps2dev, NULL, PSMOUSE_CMD_ENABLE);
1082
1083         if (parent) {
1084                 if (parent->pt_deactivate)
1085                         parent->pt_deactivate(parent);
1086
1087                 psmouse_activate(parent);
1088         }
1089
1090         mutex_unlock(&psmouse_mutex);
1091 }
1092
1093 /*
1094  * psmouse_disconnect() closes and frees.
1095  */
1096
1097 static void psmouse_disconnect(struct serio *serio)
1098 {
1099         struct psmouse *psmouse, *parent = NULL;
1100
1101         psmouse = serio_get_drvdata(serio);
1102
1103         sysfs_remove_group(&serio->dev.kobj, &psmouse_attribute_group);
1104
1105         mutex_lock(&psmouse_mutex);
1106
1107         psmouse_set_state(psmouse, PSMOUSE_CMD_MODE);
1108
1109         /* make sure we don't have a resync in progress */
1110         mutex_unlock(&psmouse_mutex);
1111         flush_workqueue(kpsmoused_wq);
1112         mutex_lock(&psmouse_mutex);
1113
1114         if (serio->parent && serio->id.type == SERIO_PS_PSTHRU) {
1115                 parent = serio_get_drvdata(serio->parent);
1116                 psmouse_deactivate(parent);
1117         }
1118
1119         if (psmouse->disconnect)
1120                 psmouse->disconnect(psmouse);
1121
1122         if (parent && parent->pt_deactivate)
1123                 parent->pt_deactivate(parent);
1124
1125         psmouse_set_state(psmouse, PSMOUSE_IGNORE);
1126
1127         serio_close(serio);
1128         serio_set_drvdata(serio, NULL);
1129         input_unregister_device(psmouse->dev);
1130         kfree(psmouse);
1131
1132         if (parent)
1133                 psmouse_activate(parent);
1134
1135         mutex_unlock(&psmouse_mutex);
1136 }
1137
1138 static int psmouse_switch_protocol(struct psmouse *psmouse, const struct psmouse_protocol *proto)
1139 {
1140         struct input_dev *input_dev = psmouse->dev;
1141
1142         input_dev->dev.parent = &psmouse->ps2dev.serio->dev;
1143
1144         input_dev->evbit[0] = BIT_MASK(EV_KEY) | BIT_MASK(EV_REL);
1145         input_dev->keybit[BIT_WORD(BTN_MOUSE)] = BIT_MASK(BTN_LEFT) |
1146                 BIT_MASK(BTN_MIDDLE) | BIT_MASK(BTN_RIGHT);
1147         input_dev->relbit[0] = BIT_MASK(REL_X) | BIT_MASK(REL_Y);
1148
1149         psmouse->set_rate = psmouse_set_rate;
1150         psmouse->set_resolution = psmouse_set_resolution;
1151         psmouse->poll = psmouse_poll;
1152         psmouse->protocol_handler = psmouse_process_byte;
1153         psmouse->pktsize = 3;
1154
1155         if (proto && (proto->detect || proto->init)) {
1156                 if (proto->detect && proto->detect(psmouse, 1) < 0)
1157                         return -1;
1158
1159                 if (proto->init && proto->init(psmouse) < 0)
1160                         return -1;
1161
1162                 psmouse->type = proto->type;
1163         }
1164         else
1165                 psmouse->type = psmouse_extensions(psmouse, psmouse_max_proto, 1);
1166
1167         /*
1168          * If mouse's packet size is 3 there is no point in polling the
1169          * device in hopes to detect protocol reset - we won't get less
1170          * than 3 bytes response anyhow.
1171          */
1172         if (psmouse->pktsize == 3)
1173                 psmouse->resync_time = 0;
1174
1175         /*
1176          * Some smart KVMs fake response to POLL command returning just
1177          * 3 bytes and messing up our resync logic, so if initial poll
1178          * fails we won't try polling the device anymore. Hopefully
1179          * such KVM will maintain initially selected protocol.
1180          */
1181         if (psmouse->resync_time && psmouse->poll(psmouse))
1182                 psmouse->resync_time = 0;
1183
1184         snprintf(psmouse->devname, sizeof(psmouse->devname), "%s %s %s",
1185                  psmouse_protocol_by_type(psmouse->type)->name, psmouse->vendor, psmouse->name);
1186
1187         input_dev->name = psmouse->devname;
1188         input_dev->phys = psmouse->phys;
1189         input_dev->id.bustype = BUS_I8042;
1190         input_dev->id.vendor = 0x0002;
1191         input_dev->id.product = psmouse->type;
1192         input_dev->id.version = psmouse->model;
1193
1194         return 0;
1195 }
1196
1197 /*
1198  * psmouse_connect() is a callback from the serio module when
1199  * an unhandled serio port is found.
1200  */
1201 static int psmouse_connect(struct serio *serio, struct serio_driver *drv)
1202 {
1203         struct psmouse *psmouse, *parent = NULL;
1204         struct input_dev *input_dev;
1205         int retval = 0, error = -ENOMEM;
1206
1207         mutex_lock(&psmouse_mutex);
1208
1209         /*
1210          * If this is a pass-through port deactivate parent so the device
1211          * connected to this port can be successfully identified
1212          */
1213         if (serio->parent && serio->id.type == SERIO_PS_PSTHRU) {
1214                 parent = serio_get_drvdata(serio->parent);
1215                 psmouse_deactivate(parent);
1216         }
1217
1218         psmouse = kzalloc(sizeof(struct psmouse), GFP_KERNEL);
1219         input_dev = input_allocate_device();
1220         if (!psmouse || !input_dev)
1221                 goto err_free;
1222
1223         ps2_init(&psmouse->ps2dev, serio);
1224         INIT_DELAYED_WORK(&psmouse->resync_work, psmouse_resync);
1225         psmouse->dev = input_dev;
1226         snprintf(psmouse->phys, sizeof(psmouse->phys), "%s/input0", serio->phys);
1227
1228         psmouse_set_state(psmouse, PSMOUSE_INITIALIZING);
1229
1230         serio_set_drvdata(serio, psmouse);
1231
1232         error = serio_open(serio, drv);
1233         if (error)
1234                 goto err_clear_drvdata;
1235
1236         if (psmouse_probe(psmouse) < 0) {
1237                 error = -ENODEV;
1238                 goto err_close_serio;
1239         }
1240
1241         psmouse->rate = psmouse_rate;
1242         psmouse->resolution = psmouse_resolution;
1243         psmouse->resetafter = psmouse_resetafter;
1244         psmouse->resync_time = parent ? 0 : psmouse_resync_time;
1245         psmouse->smartscroll = psmouse_smartscroll;
1246
1247         psmouse_switch_protocol(psmouse, NULL);
1248
1249         psmouse_set_state(psmouse, PSMOUSE_CMD_MODE);
1250         psmouse_initialize(psmouse);
1251
1252         error = input_register_device(psmouse->dev);
1253         if (error)
1254                 goto err_protocol_disconnect;
1255
1256         if (parent && parent->pt_activate)
1257                 parent->pt_activate(parent);
1258
1259         error = sysfs_create_group(&serio->dev.kobj, &psmouse_attribute_group);
1260         if (error)
1261                 goto err_pt_deactivate;
1262
1263         psmouse_activate(psmouse);
1264
1265  out:
1266         /* If this is a pass-through port the parent needs to be re-activated */
1267         if (parent)
1268                 psmouse_activate(parent);
1269
1270         mutex_unlock(&psmouse_mutex);
1271         return retval;
1272
1273  err_pt_deactivate:
1274         if (parent && parent->pt_deactivate)
1275                 parent->pt_deactivate(parent);
1276         input_unregister_device(psmouse->dev);
1277         input_dev = NULL; /* so we don't try to free it below */
1278  err_protocol_disconnect:
1279         if (psmouse->disconnect)
1280                 psmouse->disconnect(psmouse);
1281         psmouse_set_state(psmouse, PSMOUSE_IGNORE);
1282  err_close_serio:
1283         serio_close(serio);
1284  err_clear_drvdata:
1285         serio_set_drvdata(serio, NULL);
1286  err_free:
1287         input_free_device(input_dev);
1288         kfree(psmouse);
1289
1290         retval = error;
1291         goto out;
1292 }
1293
1294
1295 static int psmouse_reconnect(struct serio *serio)
1296 {
1297         struct psmouse *psmouse = serio_get_drvdata(serio);
1298         struct psmouse *parent = NULL;
1299         struct serio_driver *drv = serio->drv;
1300         int rc = -1;
1301
1302         if (!drv || !psmouse) {
1303                 printk(KERN_DEBUG "psmouse: reconnect request, but serio is disconnected, ignoring...\n");
1304                 return -1;
1305         }
1306
1307         mutex_lock(&psmouse_mutex);
1308
1309         if (serio->parent && serio->id.type == SERIO_PS_PSTHRU) {
1310                 parent = serio_get_drvdata(serio->parent);
1311                 psmouse_deactivate(parent);
1312         }
1313
1314         psmouse_set_state(psmouse, PSMOUSE_INITIALIZING);
1315
1316         if (psmouse->reconnect) {
1317                 if (psmouse->reconnect(psmouse))
1318                         goto out;
1319         } else if (psmouse_probe(psmouse) < 0 ||
1320                    psmouse->type != psmouse_extensions(psmouse, psmouse_max_proto, 0))
1321                 goto out;
1322
1323         /* ok, the device type (and capabilities) match the old one,
1324          * we can continue using it, complete intialization
1325          */
1326         psmouse_set_state(psmouse, PSMOUSE_CMD_MODE);
1327
1328         psmouse_initialize(psmouse);
1329
1330         if (parent && parent->pt_activate)
1331                 parent->pt_activate(parent);
1332
1333         psmouse_activate(psmouse);
1334         rc = 0;
1335
1336 out:
1337         /* If this is a pass-through port the parent waits to be activated */
1338         if (parent)
1339                 psmouse_activate(parent);
1340
1341         mutex_unlock(&psmouse_mutex);
1342         return rc;
1343 }
1344
1345 static struct serio_device_id psmouse_serio_ids[] = {
1346         {
1347                 .type   = SERIO_8042,
1348                 .proto  = SERIO_ANY,
1349                 .id     = SERIO_ANY,
1350                 .extra  = SERIO_ANY,
1351         },
1352         {
1353                 .type   = SERIO_PS_PSTHRU,
1354                 .proto  = SERIO_ANY,
1355                 .id     = SERIO_ANY,
1356                 .extra  = SERIO_ANY,
1357         },
1358         { 0 }
1359 };
1360
1361 MODULE_DEVICE_TABLE(serio, psmouse_serio_ids);
1362
1363 static struct serio_driver psmouse_drv = {
1364         .driver         = {
1365                 .name   = "psmouse",
1366         },
1367         .description    = DRIVER_DESC,
1368         .id_table       = psmouse_serio_ids,
1369         .interrupt      = psmouse_interrupt,
1370         .connect        = psmouse_connect,
1371         .reconnect      = psmouse_reconnect,
1372         .disconnect     = psmouse_disconnect,
1373         .cleanup        = psmouse_cleanup,
1374 };
1375
1376 ssize_t psmouse_attr_show_helper(struct device *dev, struct device_attribute *devattr,
1377                                  char *buf)
1378 {
1379         struct serio *serio = to_serio_port(dev);
1380         struct psmouse_attribute *attr = to_psmouse_attr(devattr);
1381         struct psmouse *psmouse;
1382         int retval;
1383
1384         retval = serio_pin_driver(serio);
1385         if (retval)
1386                 return retval;
1387
1388         if (serio->drv != &psmouse_drv) {
1389                 retval = -ENODEV;
1390                 goto out;
1391         }
1392
1393         psmouse = serio_get_drvdata(serio);
1394
1395         retval = attr->show(psmouse, attr->data, buf);
1396
1397 out:
1398         serio_unpin_driver(serio);
1399         return retval;
1400 }
1401
1402 ssize_t psmouse_attr_set_helper(struct device *dev, struct device_attribute *devattr,
1403                                 const char *buf, size_t count)
1404 {
1405         struct serio *serio = to_serio_port(dev);
1406         struct psmouse_attribute *attr = to_psmouse_attr(devattr);
1407         struct psmouse *psmouse, *parent = NULL;
1408         int retval;
1409
1410         retval = serio_pin_driver(serio);
1411         if (retval)
1412                 return retval;
1413
1414         if (serio->drv != &psmouse_drv) {
1415                 retval = -ENODEV;
1416                 goto out_unpin;
1417         }
1418
1419         retval = mutex_lock_interruptible(&psmouse_mutex);
1420         if (retval)
1421                 goto out_unpin;
1422
1423         psmouse = serio_get_drvdata(serio);
1424
1425         if (attr->protect) {
1426                 if (psmouse->state == PSMOUSE_IGNORE) {
1427                         retval = -ENODEV;
1428                         goto out_unlock;
1429                 }
1430
1431                 if (serio->parent && serio->id.type == SERIO_PS_PSTHRU) {
1432                         parent = serio_get_drvdata(serio->parent);
1433                         psmouse_deactivate(parent);
1434                 }
1435
1436                 psmouse_deactivate(psmouse);
1437         }
1438
1439         retval = attr->set(psmouse, attr->data, buf, count);
1440
1441         if (attr->protect) {
1442                 if (retval != -ENODEV)
1443                         psmouse_activate(psmouse);
1444
1445                 if (parent)
1446                         psmouse_activate(parent);
1447         }
1448
1449  out_unlock:
1450         mutex_unlock(&psmouse_mutex);
1451  out_unpin:
1452         serio_unpin_driver(serio);
1453         return retval;
1454 }
1455
1456 static ssize_t psmouse_show_int_attr(struct psmouse *psmouse, void *offset, char *buf)
1457 {
1458         unsigned int *field = (unsigned int *)((char *)psmouse + (size_t)offset);
1459
1460         return sprintf(buf, "%u\n", *field);
1461 }
1462
1463 static ssize_t psmouse_set_int_attr(struct psmouse *psmouse, void *offset, const char *buf, size_t count)
1464 {
1465         unsigned int *field = (unsigned int *)((char *)psmouse + (size_t)offset);
1466         unsigned long value;
1467
1468         if (strict_strtoul(buf, 10, &value))
1469                 return -EINVAL;
1470
1471         if ((unsigned int)value != value)
1472                 return -EINVAL;
1473
1474         *field = value;
1475
1476         return count;
1477 }
1478
1479 static ssize_t psmouse_attr_show_protocol(struct psmouse *psmouse, void *data, char *buf)
1480 {
1481         return sprintf(buf, "%s\n", psmouse_protocol_by_type(psmouse->type)->name);
1482 }
1483
1484 static ssize_t psmouse_attr_set_protocol(struct psmouse *psmouse, void *data, const char *buf, size_t count)
1485 {
1486         struct serio *serio = psmouse->ps2dev.serio;
1487         struct psmouse *parent = NULL;
1488         struct input_dev *old_dev, *new_dev;
1489         const struct psmouse_protocol *proto, *old_proto;
1490         int error;
1491         int retry = 0;
1492
1493         proto = psmouse_protocol_by_name(buf, count);
1494         if (!proto)
1495                 return -EINVAL;
1496
1497         if (psmouse->type == proto->type)
1498                 return count;
1499
1500         new_dev = input_allocate_device();
1501         if (!new_dev)
1502                 return -ENOMEM;
1503
1504         while (serio->child) {
1505                 if (++retry > 3) {
1506                         printk(KERN_WARNING "psmouse: failed to destroy child port, protocol change aborted.\n");
1507                         input_free_device(new_dev);
1508                         return -EIO;
1509                 }
1510
1511                 mutex_unlock(&psmouse_mutex);
1512                 serio_unpin_driver(serio);
1513                 serio_unregister_child_port(serio);
1514                 serio_pin_driver_uninterruptible(serio);
1515                 mutex_lock(&psmouse_mutex);
1516
1517                 if (serio->drv != &psmouse_drv) {
1518                         input_free_device(new_dev);
1519                         return -ENODEV;
1520                 }
1521
1522                 if (psmouse->type == proto->type) {
1523                         input_free_device(new_dev);
1524                         return count; /* switched by other thread */
1525                 }
1526         }
1527
1528         if (serio->parent && serio->id.type == SERIO_PS_PSTHRU) {
1529                 parent = serio_get_drvdata(serio->parent);
1530                 if (parent->pt_deactivate)
1531                         parent->pt_deactivate(parent);
1532         }
1533
1534         old_dev = psmouse->dev;
1535         old_proto = psmouse_protocol_by_type(psmouse->type);
1536
1537         if (psmouse->disconnect)
1538                 psmouse->disconnect(psmouse);
1539
1540         psmouse_set_state(psmouse, PSMOUSE_IGNORE);
1541
1542         psmouse->dev = new_dev;
1543         psmouse_set_state(psmouse, PSMOUSE_INITIALIZING);
1544
1545         if (psmouse_switch_protocol(psmouse, proto) < 0) {
1546                 psmouse_reset(psmouse);
1547                 /* default to PSMOUSE_PS2 */
1548                 psmouse_switch_protocol(psmouse, &psmouse_protocols[0]);
1549         }
1550
1551         psmouse_initialize(psmouse);
1552         psmouse_set_state(psmouse, PSMOUSE_CMD_MODE);
1553
1554         error = input_register_device(psmouse->dev);
1555         if (error) {
1556                 if (psmouse->disconnect)
1557                         psmouse->disconnect(psmouse);
1558
1559                 psmouse_set_state(psmouse, PSMOUSE_IGNORE);
1560                 input_free_device(new_dev);
1561                 psmouse->dev = old_dev;
1562                 psmouse_set_state(psmouse, PSMOUSE_INITIALIZING);
1563                 psmouse_switch_protocol(psmouse, old_proto);
1564                 psmouse_initialize(psmouse);
1565                 psmouse_set_state(psmouse, PSMOUSE_CMD_MODE);
1566
1567                 return error;
1568         }
1569
1570         input_unregister_device(old_dev);
1571
1572         if (parent && parent->pt_activate)
1573                 parent->pt_activate(parent);
1574
1575         return count;
1576 }
1577
1578 static ssize_t psmouse_attr_set_rate(struct psmouse *psmouse, void *data, const char *buf, size_t count)
1579 {
1580         unsigned long value;
1581
1582         if (strict_strtoul(buf, 10, &value))
1583                 return -EINVAL;
1584
1585         psmouse->set_rate(psmouse, value);
1586         return count;
1587 }
1588
1589 static ssize_t psmouse_attr_set_resolution(struct psmouse *psmouse, void *data, const char *buf, size_t count)
1590 {
1591         unsigned long value;
1592
1593         if (strict_strtoul(buf, 10, &value))
1594                 return -EINVAL;
1595
1596         psmouse->set_resolution(psmouse, value);
1597         return count;
1598 }
1599
1600
1601 static int psmouse_set_maxproto(const char *val, struct kernel_param *kp)
1602 {
1603         const struct psmouse_protocol *proto;
1604
1605         if (!val)
1606                 return -EINVAL;
1607
1608         proto = psmouse_protocol_by_name(val, strlen(val));
1609
1610         if (!proto || !proto->maxproto)
1611                 return -EINVAL;
1612
1613         *((unsigned int *)kp->arg) = proto->type;
1614
1615         return 0;
1616 }
1617
1618 static int psmouse_get_maxproto(char *buffer, struct kernel_param *kp)
1619 {
1620         int type = *((unsigned int *)kp->arg);
1621
1622         return sprintf(buffer, "%s\n", psmouse_protocol_by_type(type)->name);
1623 }
1624
1625 static int __init psmouse_init(void)
1626 {
1627         int err;
1628
1629         kpsmoused_wq = create_singlethread_workqueue("kpsmoused");
1630         if (!kpsmoused_wq) {
1631                 printk(KERN_ERR "psmouse: failed to create kpsmoused workqueue\n");
1632                 return -ENOMEM;
1633         }
1634
1635         err = serio_register_driver(&psmouse_drv);
1636         if (err)
1637                 destroy_workqueue(kpsmoused_wq);
1638
1639         return err;
1640 }
1641
1642 static void __exit psmouse_exit(void)
1643 {
1644         serio_unregister_driver(&psmouse_drv);
1645         destroy_workqueue(kpsmoused_wq);
1646 }
1647
1648 module_init(psmouse_init);
1649 module_exit(psmouse_exit);