Line data Source code
1 : // SPDX-License-Identifier: GPL-2.0-only
2 : /*
3 : * PS/2 mouse driver
4 : *
5 : * Copyright (c) 1999-2002 Vojtech Pavlik
6 : * Copyright (c) 2003-2004 Dmitry Torokhov
7 : */
8 :
9 :
10 : #define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
11 : #define psmouse_fmt(fmt) fmt
12 :
13 : #include <linux/bitops.h>
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 : #include <linux/types.h>
24 :
25 : #include "psmouse.h"
26 : #include "synaptics.h"
27 : #include "logips2pp.h"
28 : #include "alps.h"
29 : #include "hgpk.h"
30 : #include "lifebook.h"
31 : #include "trackpoint.h"
32 : #include "touchkit_ps2.h"
33 : #include "elantech.h"
34 : #include "sentelic.h"
35 : #include "cypress_ps2.h"
36 : #include "focaltech.h"
37 : #include "vmmouse.h"
38 : #include "byd.h"
39 :
40 : #define DRIVER_DESC "PS/2 mouse driver"
41 :
42 : MODULE_AUTHOR("Vojtech Pavlik <vojtech@suse.cz>");
43 : MODULE_DESCRIPTION(DRIVER_DESC);
44 : MODULE_LICENSE("GPL");
45 :
46 : static unsigned int psmouse_max_proto = PSMOUSE_AUTO;
47 : static int psmouse_set_maxproto(const char *val, const struct kernel_param *);
48 : static int psmouse_get_maxproto(char *buffer, const struct kernel_param *kp);
49 : static const struct kernel_param_ops param_ops_proto_abbrev = {
50 : .set = psmouse_set_maxproto,
51 : .get = psmouse_get_maxproto,
52 : };
53 : #define param_check_proto_abbrev(name, p) __param_check(name, p, unsigned int)
54 : module_param_named(proto, psmouse_max_proto, proto_abbrev, 0644);
55 : MODULE_PARM_DESC(proto, "Highest protocol extension to probe (bare, imps, exps, any). Useful for KVM switches.");
56 :
57 : static unsigned int psmouse_resolution = 200;
58 : module_param_named(resolution, psmouse_resolution, uint, 0644);
59 : MODULE_PARM_DESC(resolution, "Resolution, in dpi.");
60 :
61 : static unsigned int psmouse_rate = 100;
62 : module_param_named(rate, psmouse_rate, uint, 0644);
63 : MODULE_PARM_DESC(rate, "Report rate, in reports per second.");
64 :
65 : static bool psmouse_smartscroll = true;
66 : module_param_named(smartscroll, psmouse_smartscroll, bool, 0644);
67 : MODULE_PARM_DESC(smartscroll, "Logitech Smartscroll autorepeat, 1 = enabled (default), 0 = disabled.");
68 :
69 : static bool psmouse_a4tech_2wheels;
70 : module_param_named(a4tech_workaround, psmouse_a4tech_2wheels, bool, 0644);
71 : MODULE_PARM_DESC(a4tech_workaround, "A4Tech second scroll wheel workaround, 1 = enabled, 0 = disabled (default).");
72 :
73 : static unsigned int psmouse_resetafter = 5;
74 : module_param_named(resetafter, psmouse_resetafter, uint, 0644);
75 : MODULE_PARM_DESC(resetafter, "Reset device after so many bad packets (0 = never).");
76 :
77 : static unsigned int psmouse_resync_time;
78 : module_param_named(resync_time, psmouse_resync_time, uint, 0644);
79 : MODULE_PARM_DESC(resync_time, "How long can mouse stay idle before forcing resync (in seconds, 0 = never).");
80 :
81 : PSMOUSE_DEFINE_ATTR(protocol, S_IWUSR | S_IRUGO,
82 : NULL,
83 : psmouse_attr_show_protocol, psmouse_attr_set_protocol);
84 : PSMOUSE_DEFINE_ATTR(rate, S_IWUSR | S_IRUGO,
85 : (void *) offsetof(struct psmouse, rate),
86 : psmouse_show_int_attr, psmouse_attr_set_rate);
87 : PSMOUSE_DEFINE_ATTR(resolution, S_IWUSR | S_IRUGO,
88 : (void *) offsetof(struct psmouse, resolution),
89 : psmouse_show_int_attr, psmouse_attr_set_resolution);
90 : PSMOUSE_DEFINE_ATTR(resetafter, S_IWUSR | S_IRUGO,
91 : (void *) offsetof(struct psmouse, resetafter),
92 : psmouse_show_int_attr, psmouse_set_int_attr);
93 : PSMOUSE_DEFINE_ATTR(resync_time, S_IWUSR | S_IRUGO,
94 : (void *) offsetof(struct psmouse, resync_time),
95 : psmouse_show_int_attr, psmouse_set_int_attr);
96 :
97 : static struct attribute *psmouse_dev_attrs[] = {
98 : &psmouse_attr_protocol.dattr.attr,
99 : &psmouse_attr_rate.dattr.attr,
100 : &psmouse_attr_resolution.dattr.attr,
101 : &psmouse_attr_resetafter.dattr.attr,
102 : &psmouse_attr_resync_time.dattr.attr,
103 : NULL
104 : };
105 :
106 : ATTRIBUTE_GROUPS(psmouse_dev);
107 :
108 : /*
109 : * psmouse_mutex protects all operations changing state of mouse
110 : * (connecting, disconnecting, changing rate or resolution via
111 : * sysfs). We could use a per-device semaphore but since there
112 : * rarely more than one PS/2 mouse connected and since semaphore
113 : * is taken in "slow" paths it is not worth it.
114 : */
115 : static DEFINE_MUTEX(psmouse_mutex);
116 :
117 : static struct workqueue_struct *kpsmoused_wq;
118 :
119 0 : void psmouse_report_standard_buttons(struct input_dev *dev, u8 buttons)
120 : {
121 0 : input_report_key(dev, BTN_LEFT, buttons & BIT(0));
122 0 : input_report_key(dev, BTN_MIDDLE, buttons & BIT(2));
123 0 : input_report_key(dev, BTN_RIGHT, buttons & BIT(1));
124 0 : }
125 :
126 0 : void psmouse_report_standard_motion(struct input_dev *dev, u8 *packet)
127 : {
128 : int x, y;
129 :
130 0 : x = packet[1] ? packet[1] - ((packet[0] << 4) & 0x100) : 0;
131 0 : y = packet[2] ? packet[2] - ((packet[0] << 3) & 0x100) : 0;
132 :
133 0 : input_report_rel(dev, REL_X, x);
134 0 : input_report_rel(dev, REL_Y, -y);
135 0 : }
136 :
137 0 : void psmouse_report_standard_packet(struct input_dev *dev, u8 *packet)
138 : {
139 0 : psmouse_report_standard_buttons(dev, packet[0]);
140 0 : psmouse_report_standard_motion(dev, packet);
141 0 : }
142 :
143 : /*
144 : * psmouse_process_byte() analyzes the PS/2 data stream and reports
145 : * relevant events to the input module once full packet has arrived.
146 : */
147 0 : psmouse_ret_t psmouse_process_byte(struct psmouse *psmouse)
148 : {
149 0 : struct input_dev *dev = psmouse->dev;
150 0 : u8 *packet = psmouse->packet;
151 : int wheel;
152 :
153 0 : if (psmouse->pktcnt < psmouse->pktsize)
154 : return PSMOUSE_GOOD_DATA;
155 :
156 : /* Full packet accumulated, process it */
157 :
158 0 : switch (psmouse->protocol->type) {
159 : case PSMOUSE_IMPS:
160 : /* IntelliMouse has scroll wheel */
161 0 : input_report_rel(dev, REL_WHEEL, -(s8) packet[3]);
162 : break;
163 :
164 : case PSMOUSE_IMEX:
165 : /* Scroll wheel and buttons on IntelliMouse Explorer */
166 0 : switch (packet[3] & 0xC0) {
167 : case 0x80: /* vertical scroll on IntelliMouse Explorer 4.0 */
168 0 : input_report_rel(dev, REL_WHEEL,
169 0 : -sign_extend32(packet[3], 5));
170 : break;
171 : case 0x40: /* horizontal scroll on IntelliMouse Explorer 4.0 */
172 0 : input_report_rel(dev, REL_HWHEEL,
173 0 : -sign_extend32(packet[3], 5));
174 : break;
175 : case 0x00:
176 : case 0xC0:
177 0 : wheel = sign_extend32(packet[3], 3);
178 :
179 : /*
180 : * Some A4Tech mice have two scroll wheels, with first
181 : * one reporting +/-1 in the lower nibble, and second
182 : * one reporting +/-2.
183 : */
184 0 : if (psmouse_a4tech_2wheels && abs(wheel) > 1)
185 0 : input_report_rel(dev, REL_HWHEEL, wheel / 2);
186 : else
187 0 : input_report_rel(dev, REL_WHEEL, -wheel);
188 :
189 0 : input_report_key(dev, BTN_SIDE, packet[3] & BIT(4));
190 0 : input_report_key(dev, BTN_EXTRA, packet[3] & BIT(5));
191 : break;
192 : }
193 : break;
194 :
195 : case PSMOUSE_GENPS:
196 : /* Report scroll buttons on NetMice */
197 0 : input_report_rel(dev, REL_WHEEL, -(s8) packet[3]);
198 :
199 : /* Extra buttons on Genius NewNet 3D */
200 0 : input_report_key(dev, BTN_SIDE, packet[0] & BIT(6));
201 0 : input_report_key(dev, BTN_EXTRA, packet[0] & BIT(7));
202 : break;
203 :
204 : case PSMOUSE_THINKPS:
205 : /* Extra button on ThinkingMouse */
206 0 : input_report_key(dev, BTN_EXTRA, packet[0] & BIT(3));
207 :
208 : /*
209 : * Without this bit of weirdness moving up gives wildly
210 : * high Y changes.
211 : */
212 0 : packet[1] |= (packet[0] & 0x40) << 1;
213 0 : break;
214 :
215 : case PSMOUSE_CORTRON:
216 : /*
217 : * Cortron PS2 Trackball reports SIDE button in the
218 : * 4th bit of the first byte.
219 : */
220 0 : input_report_key(dev, BTN_SIDE, packet[0] & BIT(3));
221 0 : packet[0] |= BIT(3);
222 0 : break;
223 :
224 : default:
225 : break;
226 : }
227 :
228 : /* Generic PS/2 Mouse */
229 0 : packet[0] |= psmouse->extra_buttons;
230 0 : psmouse_report_standard_packet(dev, packet);
231 :
232 0 : input_sync(dev);
233 :
234 0 : return PSMOUSE_FULL_PACKET;
235 : }
236 :
237 0 : void psmouse_queue_work(struct psmouse *psmouse, struct delayed_work *work,
238 : unsigned long delay)
239 : {
240 0 : queue_delayed_work(kpsmoused_wq, work, delay);
241 0 : }
242 :
243 : /*
244 : * __psmouse_set_state() sets new psmouse state and resets all flags.
245 : */
246 : static inline void __psmouse_set_state(struct psmouse *psmouse, enum psmouse_state new_state)
247 : {
248 0 : psmouse->state = new_state;
249 0 : psmouse->pktcnt = psmouse->out_of_sync_cnt = 0;
250 0 : psmouse->ps2dev.flags = 0;
251 0 : psmouse->last = jiffies;
252 : }
253 :
254 : /*
255 : * psmouse_set_state() sets new psmouse state and resets all flags and
256 : * counters while holding serio lock so fighting with interrupt handler
257 : * is not a concern.
258 : */
259 0 : void psmouse_set_state(struct psmouse *psmouse, enum psmouse_state new_state)
260 : {
261 0 : serio_pause_rx(psmouse->ps2dev.serio);
262 0 : __psmouse_set_state(psmouse, new_state);
263 0 : serio_continue_rx(psmouse->ps2dev.serio);
264 0 : }
265 :
266 : /*
267 : * psmouse_handle_byte() processes one byte of the input data stream
268 : * by calling corresponding protocol handler.
269 : */
270 0 : static int psmouse_handle_byte(struct psmouse *psmouse)
271 : {
272 0 : psmouse_ret_t rc = psmouse->protocol_handler(psmouse);
273 :
274 0 : switch (rc) {
275 : case PSMOUSE_BAD_DATA:
276 0 : if (psmouse->state == PSMOUSE_ACTIVATED) {
277 0 : psmouse_warn(psmouse,
278 : "%s at %s lost sync at byte %d\n",
279 : psmouse->name, psmouse->phys,
280 : psmouse->pktcnt);
281 0 : if (++psmouse->out_of_sync_cnt == psmouse->resetafter) {
282 0 : __psmouse_set_state(psmouse, PSMOUSE_IGNORE);
283 0 : psmouse_notice(psmouse,
284 : "issuing reconnect request\n");
285 0 : serio_reconnect(psmouse->ps2dev.serio);
286 0 : return -EIO;
287 : }
288 : }
289 0 : psmouse->pktcnt = 0;
290 0 : break;
291 :
292 : case PSMOUSE_FULL_PACKET:
293 0 : psmouse->pktcnt = 0;
294 0 : if (psmouse->out_of_sync_cnt) {
295 0 : psmouse->out_of_sync_cnt = 0;
296 0 : psmouse_notice(psmouse,
297 : "%s at %s - driver resynced.\n",
298 : psmouse->name, psmouse->phys);
299 : }
300 : break;
301 :
302 : case PSMOUSE_GOOD_DATA:
303 : break;
304 : }
305 : return 0;
306 : }
307 :
308 0 : static void psmouse_handle_oob_data(struct psmouse *psmouse, u8 data)
309 : {
310 0 : switch (psmouse->oob_data_type) {
311 : case PSMOUSE_OOB_NONE:
312 0 : psmouse->oob_data_type = data;
313 0 : break;
314 :
315 : case PSMOUSE_OOB_EXTRA_BTNS:
316 0 : psmouse_report_standard_buttons(psmouse->dev, data);
317 0 : input_sync(psmouse->dev);
318 :
319 0 : psmouse->extra_buttons = data;
320 0 : psmouse->oob_data_type = PSMOUSE_OOB_NONE;
321 0 : break;
322 :
323 : default:
324 0 : psmouse_warn(psmouse,
325 : "unknown OOB_DATA type: 0x%02x\n",
326 : psmouse->oob_data_type);
327 0 : psmouse->oob_data_type = PSMOUSE_OOB_NONE;
328 0 : break;
329 : }
330 0 : }
331 :
332 : /*
333 : * psmouse_interrupt() handles incoming characters, either passing them
334 : * for normal processing or gathering them as command response.
335 : */
336 0 : static irqreturn_t psmouse_interrupt(struct serio *serio,
337 : u8 data, unsigned int flags)
338 : {
339 0 : struct psmouse *psmouse = serio_get_drvdata(serio);
340 :
341 0 : if (psmouse->state == PSMOUSE_IGNORE)
342 : goto out;
343 :
344 0 : if (unlikely((flags & SERIO_TIMEOUT) ||
345 : ((flags & SERIO_PARITY) &&
346 : !psmouse->protocol->ignore_parity))) {
347 :
348 0 : if (psmouse->state == PSMOUSE_ACTIVATED)
349 0 : psmouse_warn(psmouse,
350 : "bad data from KBC -%s%s\n",
351 : flags & SERIO_TIMEOUT ? " timeout" : "",
352 : flags & SERIO_PARITY ? " bad parity" : "");
353 0 : ps2_cmd_aborted(&psmouse->ps2dev);
354 0 : goto out;
355 : }
356 :
357 0 : if (flags & SERIO_OOB_DATA) {
358 0 : psmouse_handle_oob_data(psmouse, data);
359 0 : goto out;
360 : }
361 :
362 0 : if (unlikely(psmouse->ps2dev.flags & PS2_FLAG_ACK))
363 0 : if (ps2_handle_ack(&psmouse->ps2dev, data))
364 : goto out;
365 :
366 0 : if (unlikely(psmouse->ps2dev.flags & PS2_FLAG_CMD))
367 0 : if (ps2_handle_response(&psmouse->ps2dev, data))
368 : goto out;
369 :
370 0 : pm_wakeup_event(&serio->dev, 0);
371 :
372 0 : if (psmouse->state <= PSMOUSE_RESYNCING)
373 : goto out;
374 :
375 0 : if (psmouse->state == PSMOUSE_ACTIVATED &&
376 0 : psmouse->pktcnt && time_after(jiffies, psmouse->last + HZ/2)) {
377 0 : psmouse_info(psmouse, "%s at %s lost synchronization, throwing %d bytes away.\n",
378 : psmouse->name, psmouse->phys, psmouse->pktcnt);
379 0 : psmouse->badbyte = psmouse->packet[0];
380 0 : __psmouse_set_state(psmouse, PSMOUSE_RESYNCING);
381 0 : psmouse_queue_work(psmouse, &psmouse->resync_work, 0);
382 : goto out;
383 : }
384 :
385 0 : psmouse->packet[psmouse->pktcnt++] = data;
386 :
387 : /* Check if this is a new device announcement (0xAA 0x00) */
388 0 : if (unlikely(psmouse->packet[0] == PSMOUSE_RET_BAT && psmouse->pktcnt <= 2)) {
389 0 : if (psmouse->pktcnt == 1) {
390 0 : psmouse->last = jiffies;
391 0 : goto out;
392 : }
393 :
394 0 : if (psmouse->packet[1] == PSMOUSE_RET_ID ||
395 0 : (psmouse->protocol->type == PSMOUSE_HGPK &&
396 : psmouse->packet[1] == PSMOUSE_RET_BAT)) {
397 0 : __psmouse_set_state(psmouse, PSMOUSE_IGNORE);
398 0 : serio_reconnect(serio);
399 0 : goto out;
400 : }
401 :
402 : /* Not a new device, try processing first byte normally */
403 0 : psmouse->pktcnt = 1;
404 0 : if (psmouse_handle_byte(psmouse))
405 : goto out;
406 :
407 0 : psmouse->packet[psmouse->pktcnt++] = data;
408 : }
409 :
410 : /*
411 : * See if we need to force resync because mouse was idle for
412 : * too long.
413 : */
414 0 : if (psmouse->state == PSMOUSE_ACTIVATED &&
415 0 : psmouse->pktcnt == 1 && psmouse->resync_time &&
416 0 : time_after(jiffies, psmouse->last + psmouse->resync_time * HZ)) {
417 0 : psmouse->badbyte = psmouse->packet[0];
418 0 : __psmouse_set_state(psmouse, PSMOUSE_RESYNCING);
419 0 : psmouse_queue_work(psmouse, &psmouse->resync_work, 0);
420 : goto out;
421 : }
422 :
423 0 : psmouse->last = jiffies;
424 0 : psmouse_handle_byte(psmouse);
425 :
426 : out:
427 0 : return IRQ_HANDLED;
428 : }
429 :
430 : /*
431 : * psmouse_reset() resets the mouse into power-on state.
432 : */
433 0 : int psmouse_reset(struct psmouse *psmouse)
434 : {
435 : u8 param[2];
436 : int error;
437 :
438 0 : error = ps2_command(&psmouse->ps2dev, param, PSMOUSE_CMD_RESET_BAT);
439 0 : if (error)
440 : return error;
441 :
442 0 : if (param[0] != PSMOUSE_RET_BAT && param[1] != PSMOUSE_RET_ID)
443 : return -EIO;
444 :
445 0 : return 0;
446 : }
447 :
448 : /*
449 : * Here we set the mouse resolution.
450 : */
451 0 : void psmouse_set_resolution(struct psmouse *psmouse, unsigned int resolution)
452 : {
453 : static const u8 params[] = { 0, 1, 2, 2, 3 };
454 : u8 p;
455 :
456 0 : if (resolution == 0 || resolution > 200)
457 0 : resolution = 200;
458 :
459 0 : p = params[resolution / 50];
460 0 : ps2_command(&psmouse->ps2dev, &p, PSMOUSE_CMD_SETRES);
461 0 : psmouse->resolution = 25 << p;
462 0 : }
463 :
464 : /*
465 : * Here we set the mouse report rate.
466 : */
467 0 : static void psmouse_set_rate(struct psmouse *psmouse, unsigned int rate)
468 : {
469 : static const u8 rates[] = { 200, 100, 80, 60, 40, 20, 10, 0 };
470 : u8 r;
471 0 : int i = 0;
472 :
473 0 : while (rates[i] > rate)
474 0 : i++;
475 0 : r = rates[i];
476 0 : ps2_command(&psmouse->ps2dev, &r, PSMOUSE_CMD_SETRATE);
477 0 : psmouse->rate = r;
478 0 : }
479 :
480 : /*
481 : * Here we set the mouse scaling.
482 : */
483 0 : static void psmouse_set_scale(struct psmouse *psmouse, enum psmouse_scale scale)
484 : {
485 0 : ps2_command(&psmouse->ps2dev, NULL,
486 : scale == PSMOUSE_SCALE21 ? PSMOUSE_CMD_SETSCALE21 :
487 : PSMOUSE_CMD_SETSCALE11);
488 0 : }
489 :
490 : /*
491 : * psmouse_poll() - default poll handler. Everyone except for ALPS uses it.
492 : */
493 0 : static int psmouse_poll(struct psmouse *psmouse)
494 : {
495 0 : return ps2_command(&psmouse->ps2dev, psmouse->packet,
496 0 : PSMOUSE_CMD_POLL | (psmouse->pktsize << 8));
497 : }
498 :
499 0 : static bool psmouse_check_pnp_id(const char *id, const char * const ids[])
500 : {
501 : int i;
502 :
503 0 : for (i = 0; ids[i]; i++)
504 0 : if (!strcasecmp(id, ids[i]))
505 : return true;
506 :
507 : return false;
508 : }
509 :
510 : /*
511 : * psmouse_matches_pnp_id - check if psmouse matches one of the passed in ids.
512 : */
513 0 : bool psmouse_matches_pnp_id(struct psmouse *psmouse, const char * const ids[])
514 : {
515 0 : struct serio *serio = psmouse->ps2dev.serio;
516 : char *p, *fw_id_copy, *save_ptr;
517 0 : bool found = false;
518 :
519 0 : if (strncmp(serio->firmware_id, "PNP: ", 5))
520 : return false;
521 :
522 0 : fw_id_copy = kstrndup(&serio->firmware_id[5],
523 : sizeof(serio->firmware_id) - 5,
524 : GFP_KERNEL);
525 0 : if (!fw_id_copy)
526 : return false;
527 :
528 : save_ptr = fw_id_copy;
529 0 : while ((p = strsep(&fw_id_copy, " ")) != NULL) {
530 0 : if (psmouse_check_pnp_id(p, ids)) {
531 : found = true;
532 : break;
533 : }
534 : }
535 :
536 0 : kfree(save_ptr);
537 0 : return found;
538 : }
539 :
540 : /*
541 : * Genius NetMouse magic init.
542 : */
543 0 : static int genius_detect(struct psmouse *psmouse, bool set_properties)
544 : {
545 0 : struct ps2dev *ps2dev = &psmouse->ps2dev;
546 : u8 param[4];
547 :
548 0 : param[0] = 3;
549 0 : ps2_command(ps2dev, param, PSMOUSE_CMD_SETRES);
550 0 : ps2_command(ps2dev, NULL, PSMOUSE_CMD_SETSCALE11);
551 0 : ps2_command(ps2dev, NULL, PSMOUSE_CMD_SETSCALE11);
552 0 : ps2_command(ps2dev, NULL, PSMOUSE_CMD_SETSCALE11);
553 0 : ps2_command(ps2dev, param, PSMOUSE_CMD_GETINFO);
554 :
555 0 : if (param[0] != 0x00 || param[1] != 0x33 || param[2] != 0x55)
556 : return -ENODEV;
557 :
558 0 : if (set_properties) {
559 0 : __set_bit(BTN_MIDDLE, psmouse->dev->keybit);
560 0 : __set_bit(BTN_EXTRA, psmouse->dev->keybit);
561 0 : __set_bit(BTN_SIDE, psmouse->dev->keybit);
562 0 : __set_bit(REL_WHEEL, psmouse->dev->relbit);
563 :
564 0 : psmouse->vendor = "Genius";
565 0 : psmouse->name = "Mouse";
566 0 : psmouse->pktsize = 4;
567 : }
568 :
569 : return 0;
570 : }
571 :
572 : /*
573 : * IntelliMouse magic init.
574 : */
575 0 : static int intellimouse_detect(struct psmouse *psmouse, bool set_properties)
576 : {
577 0 : struct ps2dev *ps2dev = &psmouse->ps2dev;
578 : u8 param[2];
579 :
580 0 : param[0] = 200;
581 0 : ps2_command(ps2dev, param, PSMOUSE_CMD_SETRATE);
582 0 : param[0] = 100;
583 0 : ps2_command(ps2dev, param, PSMOUSE_CMD_SETRATE);
584 0 : param[0] = 80;
585 0 : ps2_command(ps2dev, param, PSMOUSE_CMD_SETRATE);
586 0 : ps2_command(ps2dev, param, PSMOUSE_CMD_GETID);
587 :
588 0 : if (param[0] != 3)
589 : return -ENODEV;
590 :
591 0 : if (set_properties) {
592 0 : __set_bit(BTN_MIDDLE, psmouse->dev->keybit);
593 0 : __set_bit(REL_WHEEL, psmouse->dev->relbit);
594 :
595 0 : if (!psmouse->vendor)
596 0 : psmouse->vendor = "Generic";
597 0 : if (!psmouse->name)
598 0 : psmouse->name = "Wheel Mouse";
599 0 : psmouse->pktsize = 4;
600 : }
601 :
602 : return 0;
603 : }
604 :
605 : /*
606 : * Try IntelliMouse/Explorer magic init.
607 : */
608 0 : static int im_explorer_detect(struct psmouse *psmouse, bool set_properties)
609 : {
610 0 : struct ps2dev *ps2dev = &psmouse->ps2dev;
611 : u8 param[2];
612 :
613 0 : intellimouse_detect(psmouse, 0);
614 :
615 0 : param[0] = 200;
616 0 : ps2_command(ps2dev, param, PSMOUSE_CMD_SETRATE);
617 0 : param[0] = 200;
618 0 : ps2_command(ps2dev, param, PSMOUSE_CMD_SETRATE);
619 0 : param[0] = 80;
620 0 : ps2_command(ps2dev, param, PSMOUSE_CMD_SETRATE);
621 0 : ps2_command(ps2dev, param, PSMOUSE_CMD_GETID);
622 :
623 0 : if (param[0] != 4)
624 : return -ENODEV;
625 :
626 : /* Magic to enable horizontal scrolling on IntelliMouse 4.0 */
627 0 : param[0] = 200;
628 0 : ps2_command(ps2dev, param, PSMOUSE_CMD_SETRATE);
629 0 : param[0] = 80;
630 0 : ps2_command(ps2dev, param, PSMOUSE_CMD_SETRATE);
631 0 : param[0] = 40;
632 0 : ps2_command(ps2dev, param, PSMOUSE_CMD_SETRATE);
633 :
634 0 : if (set_properties) {
635 0 : __set_bit(BTN_MIDDLE, psmouse->dev->keybit);
636 0 : __set_bit(REL_WHEEL, psmouse->dev->relbit);
637 0 : __set_bit(REL_HWHEEL, psmouse->dev->relbit);
638 0 : __set_bit(BTN_SIDE, psmouse->dev->keybit);
639 0 : __set_bit(BTN_EXTRA, psmouse->dev->keybit);
640 :
641 0 : if (!psmouse->vendor)
642 0 : psmouse->vendor = "Generic";
643 0 : if (!psmouse->name)
644 0 : psmouse->name = "Explorer Mouse";
645 0 : psmouse->pktsize = 4;
646 : }
647 :
648 : return 0;
649 : }
650 :
651 : /*
652 : * Kensington ThinkingMouse / ExpertMouse magic init.
653 : */
654 0 : static int thinking_detect(struct psmouse *psmouse, bool set_properties)
655 : {
656 0 : struct ps2dev *ps2dev = &psmouse->ps2dev;
657 : u8 param[2];
658 : static const u8 seq[] = { 20, 60, 40, 20, 20, 60, 40, 20, 20 };
659 : int i;
660 :
661 0 : param[0] = 10;
662 0 : ps2_command(ps2dev, param, PSMOUSE_CMD_SETRATE);
663 0 : param[0] = 0;
664 0 : ps2_command(ps2dev, param, PSMOUSE_CMD_SETRES);
665 0 : for (i = 0; i < ARRAY_SIZE(seq); i++) {
666 0 : param[0] = seq[i];
667 0 : ps2_command(ps2dev, param, PSMOUSE_CMD_SETRATE);
668 : }
669 0 : ps2_command(ps2dev, param, PSMOUSE_CMD_GETID);
670 :
671 0 : if (param[0] != 2)
672 : return -ENODEV;
673 :
674 0 : if (set_properties) {
675 0 : __set_bit(BTN_MIDDLE, psmouse->dev->keybit);
676 0 : __set_bit(BTN_EXTRA, psmouse->dev->keybit);
677 :
678 0 : psmouse->vendor = "Kensington";
679 0 : psmouse->name = "ThinkingMouse";
680 : }
681 :
682 : return 0;
683 : }
684 :
685 : /*
686 : * Bare PS/2 protocol "detection". Always succeeds.
687 : */
688 0 : static int ps2bare_detect(struct psmouse *psmouse, bool set_properties)
689 : {
690 0 : if (set_properties) {
691 0 : if (!psmouse->vendor)
692 0 : psmouse->vendor = "Generic";
693 0 : if (!psmouse->name)
694 0 : psmouse->name = "Mouse";
695 :
696 : /*
697 : * We have no way of figuring true number of buttons so let's
698 : * assume that the device has 3.
699 : */
700 0 : input_set_capability(psmouse->dev, EV_KEY, BTN_MIDDLE);
701 : }
702 :
703 0 : return 0;
704 : }
705 :
706 : /*
707 : * Cortron PS/2 protocol detection. There's no special way to detect it, so it
708 : * must be forced by sysfs protocol writing.
709 : */
710 0 : static int cortron_detect(struct psmouse *psmouse, bool set_properties)
711 : {
712 0 : if (set_properties) {
713 0 : psmouse->vendor = "Cortron";
714 0 : psmouse->name = "PS/2 Trackball";
715 :
716 0 : __set_bit(BTN_MIDDLE, psmouse->dev->keybit);
717 0 : __set_bit(BTN_SIDE, psmouse->dev->keybit);
718 : }
719 :
720 0 : return 0;
721 : }
722 :
723 : static const struct psmouse_protocol psmouse_protocols[] = {
724 : {
725 : .type = PSMOUSE_PS2,
726 : .name = "PS/2",
727 : .alias = "bare",
728 : .maxproto = true,
729 : .ignore_parity = true,
730 : .detect = ps2bare_detect,
731 : .try_passthru = true,
732 : },
733 : #ifdef CONFIG_MOUSE_PS2_LOGIPS2PP
734 : {
735 : .type = PSMOUSE_PS2PP,
736 : .name = "PS2++",
737 : .alias = "logitech",
738 : .detect = ps2pp_detect,
739 : },
740 : #endif
741 : {
742 : .type = PSMOUSE_THINKPS,
743 : .name = "ThinkPS/2",
744 : .alias = "thinkps",
745 : .detect = thinking_detect,
746 : },
747 : #ifdef CONFIG_MOUSE_PS2_CYPRESS
748 : {
749 : .type = PSMOUSE_CYPRESS,
750 : .name = "CyPS/2",
751 : .alias = "cypress",
752 : .detect = cypress_detect,
753 : .init = cypress_init,
754 : },
755 : #endif
756 : {
757 : .type = PSMOUSE_GENPS,
758 : .name = "GenPS/2",
759 : .alias = "genius",
760 : .detect = genius_detect,
761 : },
762 : {
763 : .type = PSMOUSE_IMPS,
764 : .name = "ImPS/2",
765 : .alias = "imps",
766 : .maxproto = true,
767 : .ignore_parity = true,
768 : .detect = intellimouse_detect,
769 : .try_passthru = true,
770 : },
771 : {
772 : .type = PSMOUSE_IMEX,
773 : .name = "ImExPS/2",
774 : .alias = "exps",
775 : .maxproto = true,
776 : .ignore_parity = true,
777 : .detect = im_explorer_detect,
778 : .try_passthru = true,
779 : },
780 : #ifdef CONFIG_MOUSE_PS2_SYNAPTICS
781 : {
782 : .type = PSMOUSE_SYNAPTICS,
783 : .name = "SynPS/2",
784 : .alias = "synaptics",
785 : .detect = synaptics_detect,
786 : .init = synaptics_init_absolute,
787 : },
788 : {
789 : .type = PSMOUSE_SYNAPTICS_RELATIVE,
790 : .name = "SynRelPS/2",
791 : .alias = "synaptics-relative",
792 : .detect = synaptics_detect,
793 : .init = synaptics_init_relative,
794 : },
795 : #endif
796 : #ifdef CONFIG_MOUSE_PS2_SYNAPTICS_SMBUS
797 : {
798 : .type = PSMOUSE_SYNAPTICS_SMBUS,
799 : .name = "SynSMBus",
800 : .alias = "synaptics-smbus",
801 : .detect = synaptics_detect,
802 : .init = synaptics_init_smbus,
803 : .smbus_companion = true,
804 : },
805 : #endif
806 : #ifdef CONFIG_MOUSE_PS2_ALPS
807 : {
808 : .type = PSMOUSE_ALPS,
809 : .name = "AlpsPS/2",
810 : .alias = "alps",
811 : .detect = alps_detect,
812 : .init = alps_init,
813 : },
814 : #endif
815 : #ifdef CONFIG_MOUSE_PS2_LIFEBOOK
816 : {
817 : .type = PSMOUSE_LIFEBOOK,
818 : .name = "LBPS/2",
819 : .alias = "lifebook",
820 : .detect = lifebook_detect,
821 : .init = lifebook_init,
822 : },
823 : #endif
824 : #ifdef CONFIG_MOUSE_PS2_TRACKPOINT
825 : {
826 : .type = PSMOUSE_TRACKPOINT,
827 : .name = "TPPS/2",
828 : .alias = "trackpoint",
829 : .detect = trackpoint_detect,
830 : .try_passthru = true,
831 : },
832 : #endif
833 : #ifdef CONFIG_MOUSE_PS2_TOUCHKIT
834 : {
835 : .type = PSMOUSE_TOUCHKIT_PS2,
836 : .name = "touchkitPS/2",
837 : .alias = "touchkit",
838 : .detect = touchkit_ps2_detect,
839 : },
840 : #endif
841 : #ifdef CONFIG_MOUSE_PS2_OLPC
842 : {
843 : .type = PSMOUSE_HGPK,
844 : .name = "OLPC HGPK",
845 : .alias = "hgpk",
846 : .detect = hgpk_detect,
847 : },
848 : #endif
849 : #ifdef CONFIG_MOUSE_PS2_ELANTECH
850 : {
851 : .type = PSMOUSE_ELANTECH,
852 : .name = "ETPS/2",
853 : .alias = "elantech",
854 : .detect = elantech_detect,
855 : .init = elantech_init_ps2,
856 : },
857 : #endif
858 : #ifdef CONFIG_MOUSE_PS2_ELANTECH_SMBUS
859 : {
860 : .type = PSMOUSE_ELANTECH_SMBUS,
861 : .name = "ETSMBus",
862 : .alias = "elantech-smbus",
863 : .detect = elantech_detect,
864 : .init = elantech_init_smbus,
865 : .smbus_companion = true,
866 : },
867 : #endif
868 : #ifdef CONFIG_MOUSE_PS2_SENTELIC
869 : {
870 : .type = PSMOUSE_FSP,
871 : .name = "FSPPS/2",
872 : .alias = "fsp",
873 : .detect = fsp_detect,
874 : .init = fsp_init,
875 : },
876 : #endif
877 : {
878 : .type = PSMOUSE_CORTRON,
879 : .name = "CortronPS/2",
880 : .alias = "cortps",
881 : .detect = cortron_detect,
882 : },
883 : #ifdef CONFIG_MOUSE_PS2_FOCALTECH
884 : {
885 : .type = PSMOUSE_FOCALTECH,
886 : .name = "FocalTechPS/2",
887 : .alias = "focaltech",
888 : .detect = focaltech_detect,
889 : .init = focaltech_init,
890 : },
891 : #endif
892 : #ifdef CONFIG_MOUSE_PS2_VMMOUSE
893 : {
894 : .type = PSMOUSE_VMMOUSE,
895 : .name = VMMOUSE_PSNAME,
896 : .alias = "vmmouse",
897 : .detect = vmmouse_detect,
898 : .init = vmmouse_init,
899 : },
900 : #endif
901 : #ifdef CONFIG_MOUSE_PS2_BYD
902 : {
903 : .type = PSMOUSE_BYD,
904 : .name = "BYDPS/2",
905 : .alias = "byd",
906 : .detect = byd_detect,
907 : .init = byd_init,
908 : },
909 : #endif
910 : {
911 : .type = PSMOUSE_AUTO,
912 : .name = "auto",
913 : .alias = "any",
914 : .maxproto = true,
915 : },
916 : };
917 :
918 : static const struct psmouse_protocol *__psmouse_protocol_by_type(enum psmouse_type type)
919 : {
920 : int i;
921 :
922 0 : for (i = 0; i < ARRAY_SIZE(psmouse_protocols); i++)
923 0 : if (psmouse_protocols[i].type == type)
924 0 : return &psmouse_protocols[i];
925 :
926 : return NULL;
927 : }
928 :
929 0 : static const struct psmouse_protocol *psmouse_protocol_by_type(enum psmouse_type type)
930 : {
931 : const struct psmouse_protocol *proto;
932 :
933 0 : proto = __psmouse_protocol_by_type(type);
934 0 : if (proto)
935 : return proto;
936 :
937 0 : WARN_ON(1);
938 0 : return &psmouse_protocols[0];
939 : }
940 :
941 0 : static const struct psmouse_protocol *psmouse_protocol_by_name(const char *name, size_t len)
942 : {
943 : const struct psmouse_protocol *p;
944 : int i;
945 :
946 0 : for (i = 0; i < ARRAY_SIZE(psmouse_protocols); i++) {
947 0 : p = &psmouse_protocols[i];
948 :
949 0 : if ((strlen(p->name) == len && !strncmp(p->name, name, len)) ||
950 0 : (strlen(p->alias) == len && !strncmp(p->alias, name, len)))
951 0 : return &psmouse_protocols[i];
952 : }
953 :
954 : return NULL;
955 : }
956 :
957 : /*
958 : * Apply default settings to the psmouse structure. Most of them will
959 : * be overridden by individual protocol initialization routines.
960 : */
961 0 : static void psmouse_apply_defaults(struct psmouse *psmouse)
962 : {
963 0 : struct input_dev *input_dev = psmouse->dev;
964 :
965 0 : bitmap_zero(input_dev->evbit, EV_CNT);
966 0 : bitmap_zero(input_dev->keybit, KEY_CNT);
967 0 : bitmap_zero(input_dev->relbit, REL_CNT);
968 0 : bitmap_zero(input_dev->absbit, ABS_CNT);
969 0 : bitmap_zero(input_dev->mscbit, MSC_CNT);
970 :
971 0 : input_set_capability(input_dev, EV_KEY, BTN_LEFT);
972 0 : input_set_capability(input_dev, EV_KEY, BTN_RIGHT);
973 :
974 0 : input_set_capability(input_dev, EV_REL, REL_X);
975 0 : input_set_capability(input_dev, EV_REL, REL_Y);
976 :
977 0 : __set_bit(INPUT_PROP_POINTER, input_dev->propbit);
978 :
979 0 : psmouse->protocol = &psmouse_protocols[0];
980 :
981 0 : psmouse->set_rate = psmouse_set_rate;
982 0 : psmouse->set_resolution = psmouse_set_resolution;
983 0 : psmouse->set_scale = psmouse_set_scale;
984 0 : psmouse->poll = psmouse_poll;
985 0 : psmouse->protocol_handler = psmouse_process_byte;
986 0 : psmouse->pktsize = 3;
987 0 : psmouse->reconnect = NULL;
988 0 : psmouse->fast_reconnect = NULL;
989 0 : psmouse->disconnect = NULL;
990 0 : psmouse->cleanup = NULL;
991 0 : psmouse->pt_activate = NULL;
992 0 : psmouse->pt_deactivate = NULL;
993 0 : }
994 :
995 0 : static bool psmouse_do_detect(int (*detect)(struct psmouse *, bool),
996 : struct psmouse *psmouse, bool allow_passthrough,
997 : bool set_properties)
998 : {
999 0 : if (psmouse->ps2dev.serio->id.type == SERIO_PS_PSTHRU &&
1000 : !allow_passthrough) {
1001 : return false;
1002 : }
1003 :
1004 0 : if (set_properties)
1005 0 : psmouse_apply_defaults(psmouse);
1006 :
1007 0 : return detect(psmouse, set_properties) == 0;
1008 : }
1009 :
1010 0 : static bool psmouse_try_protocol(struct psmouse *psmouse,
1011 : enum psmouse_type type,
1012 : unsigned int *max_proto,
1013 : bool set_properties, bool init_allowed)
1014 : {
1015 : const struct psmouse_protocol *proto;
1016 :
1017 0 : proto = __psmouse_protocol_by_type(type);
1018 0 : if (!proto)
1019 : return false;
1020 :
1021 0 : if (!psmouse_do_detect(proto->detect, psmouse, proto->try_passthru,
1022 : set_properties))
1023 : return false;
1024 :
1025 0 : if (set_properties && proto->init && init_allowed) {
1026 0 : if (proto->init(psmouse) != 0) {
1027 : /*
1028 : * We detected device, but init failed. Adjust
1029 : * max_proto so we only try standard protocols.
1030 : */
1031 0 : if (*max_proto > PSMOUSE_IMEX)
1032 0 : *max_proto = PSMOUSE_IMEX;
1033 :
1034 : return false;
1035 : }
1036 : }
1037 :
1038 : return true;
1039 : }
1040 :
1041 : /*
1042 : * psmouse_extensions() probes for any extensions to the basic PS/2 protocol
1043 : * the mouse may have.
1044 : */
1045 0 : static int psmouse_extensions(struct psmouse *psmouse,
1046 : unsigned int max_proto, bool set_properties)
1047 : {
1048 0 : bool synaptics_hardware = false;
1049 : int ret;
1050 :
1051 : /*
1052 : * Always check for focaltech, this is safe as it uses pnp-id
1053 : * matching.
1054 : */
1055 0 : if (psmouse_do_detect(focaltech_detect,
1056 : psmouse, false, set_properties)) {
1057 0 : if (max_proto > PSMOUSE_IMEX &&
1058 0 : IS_ENABLED(CONFIG_MOUSE_PS2_FOCALTECH) &&
1059 0 : (!set_properties || focaltech_init(psmouse) == 0)) {
1060 : return PSMOUSE_FOCALTECH;
1061 : }
1062 : /*
1063 : * Restrict psmouse_max_proto so that psmouse_initialize()
1064 : * does not try to reset rate and resolution, because even
1065 : * that upsets the device.
1066 : * This also causes us to basically fall through to basic
1067 : * protocol detection, where we fully reset the mouse,
1068 : * and set it up as bare PS/2 protocol device.
1069 : */
1070 0 : psmouse_max_proto = max_proto = PSMOUSE_PS2;
1071 : }
1072 :
1073 : /*
1074 : * We always check for LifeBook because it does not disturb mouse
1075 : * (it only checks DMI information).
1076 : */
1077 0 : if (psmouse_try_protocol(psmouse, PSMOUSE_LIFEBOOK, &max_proto,
1078 : set_properties, max_proto > PSMOUSE_IMEX))
1079 : return PSMOUSE_LIFEBOOK;
1080 :
1081 0 : if (psmouse_try_protocol(psmouse, PSMOUSE_VMMOUSE, &max_proto,
1082 : set_properties, max_proto > PSMOUSE_IMEX))
1083 : return PSMOUSE_VMMOUSE;
1084 :
1085 : /*
1086 : * Try Kensington ThinkingMouse (we try first, because Synaptics
1087 : * probe upsets the ThinkingMouse).
1088 : */
1089 0 : if (max_proto > PSMOUSE_IMEX &&
1090 0 : psmouse_try_protocol(psmouse, PSMOUSE_THINKPS, &max_proto,
1091 : set_properties, true)) {
1092 : return PSMOUSE_THINKPS;
1093 : }
1094 :
1095 : /*
1096 : * Try Synaptics TouchPad. Note that probing is done even if
1097 : * Synaptics protocol support is disabled in config - we need to
1098 : * know if it is Synaptics so we can reset it properly after
1099 : * probing for IntelliMouse.
1100 : */
1101 0 : if (max_proto > PSMOUSE_PS2 &&
1102 0 : psmouse_do_detect(synaptics_detect,
1103 : psmouse, false, set_properties)) {
1104 0 : synaptics_hardware = true;
1105 :
1106 0 : if (max_proto > PSMOUSE_IMEX) {
1107 : /*
1108 : * Try activating protocol, but check if support is
1109 : * enabled first, since we try detecting Synaptics
1110 : * even when protocol is disabled.
1111 : */
1112 : if (IS_ENABLED(CONFIG_MOUSE_PS2_SYNAPTICS) ||
1113 : IS_ENABLED(CONFIG_MOUSE_PS2_SYNAPTICS_SMBUS)) {
1114 0 : if (!set_properties)
1115 : return PSMOUSE_SYNAPTICS;
1116 :
1117 0 : ret = synaptics_init(psmouse);
1118 0 : if (ret >= 0)
1119 : return ret;
1120 : }
1121 :
1122 : /*
1123 : * Some Synaptics touchpads can emulate extended
1124 : * protocols (like IMPS/2). Unfortunately
1125 : * Logitech/Genius probes confuse some firmware
1126 : * versions so we'll have to skip them.
1127 : */
1128 0 : max_proto = PSMOUSE_IMEX;
1129 : }
1130 :
1131 : /*
1132 : * Make sure that touchpad is in relative mode, gestures
1133 : * (taps) are enabled.
1134 : */
1135 0 : synaptics_reset(psmouse);
1136 : }
1137 :
1138 : /*
1139 : * Try Cypress Trackpad. We must try it before Finger Sensing Pad
1140 : * because Finger Sensing Pad probe upsets some modules of Cypress
1141 : * Trackpads.
1142 : */
1143 0 : if (max_proto > PSMOUSE_IMEX &&
1144 0 : psmouse_try_protocol(psmouse, PSMOUSE_CYPRESS, &max_proto,
1145 : set_properties, true)) {
1146 : return PSMOUSE_CYPRESS;
1147 : }
1148 :
1149 : /* Try ALPS TouchPad */
1150 0 : if (max_proto > PSMOUSE_IMEX) {
1151 0 : ps2_command(&psmouse->ps2dev, NULL, PSMOUSE_CMD_RESET_DIS);
1152 0 : if (psmouse_try_protocol(psmouse, PSMOUSE_ALPS,
1153 : &max_proto, set_properties, true))
1154 : return PSMOUSE_ALPS;
1155 : }
1156 :
1157 : /* Try OLPC HGPK touchpad */
1158 0 : if (max_proto > PSMOUSE_IMEX &&
1159 0 : psmouse_try_protocol(psmouse, PSMOUSE_HGPK, &max_proto,
1160 : set_properties, true)) {
1161 : return PSMOUSE_HGPK;
1162 : }
1163 :
1164 : /* Try Elantech touchpad */
1165 0 : if (max_proto > PSMOUSE_IMEX &&
1166 0 : psmouse_try_protocol(psmouse, PSMOUSE_ELANTECH,
1167 : &max_proto, set_properties, false)) {
1168 0 : if (!set_properties)
1169 : return PSMOUSE_ELANTECH;
1170 :
1171 : ret = elantech_init(psmouse);
1172 : if (ret >= 0)
1173 : return ret;
1174 : }
1175 :
1176 0 : if (max_proto > PSMOUSE_IMEX) {
1177 0 : if (psmouse_try_protocol(psmouse, PSMOUSE_GENPS,
1178 : &max_proto, set_properties, true))
1179 : return PSMOUSE_GENPS;
1180 :
1181 0 : if (psmouse_try_protocol(psmouse, PSMOUSE_PS2PP,
1182 : &max_proto, set_properties, true))
1183 : return PSMOUSE_PS2PP;
1184 :
1185 0 : if (psmouse_try_protocol(psmouse, PSMOUSE_TRACKPOINT,
1186 : &max_proto, set_properties, true))
1187 : return PSMOUSE_TRACKPOINT;
1188 :
1189 0 : if (psmouse_try_protocol(psmouse, PSMOUSE_TOUCHKIT_PS2,
1190 : &max_proto, set_properties, true))
1191 : return PSMOUSE_TOUCHKIT_PS2;
1192 : }
1193 :
1194 : /*
1195 : * Try Finger Sensing Pad. We do it here because its probe upsets
1196 : * Trackpoint devices (causing TP_READ_ID command to time out).
1197 : */
1198 0 : if (max_proto > PSMOUSE_IMEX &&
1199 0 : psmouse_try_protocol(psmouse, PSMOUSE_FSP,
1200 : &max_proto, set_properties, true)) {
1201 : return PSMOUSE_FSP;
1202 : }
1203 :
1204 : /*
1205 : * Reset to defaults in case the device got confused by extended
1206 : * protocol probes. Note that we follow up with full reset because
1207 : * some mice put themselves to sleep when they see PSMOUSE_RESET_DIS.
1208 : */
1209 0 : ps2_command(&psmouse->ps2dev, NULL, PSMOUSE_CMD_RESET_DIS);
1210 0 : psmouse_reset(psmouse);
1211 :
1212 0 : if (max_proto >= PSMOUSE_IMEX &&
1213 0 : psmouse_try_protocol(psmouse, PSMOUSE_IMEX,
1214 : &max_proto, set_properties, true)) {
1215 : return PSMOUSE_IMEX;
1216 : }
1217 :
1218 0 : if (max_proto >= PSMOUSE_IMPS &&
1219 0 : psmouse_try_protocol(psmouse, PSMOUSE_IMPS,
1220 : &max_proto, set_properties, true)) {
1221 : return PSMOUSE_IMPS;
1222 : }
1223 :
1224 : /*
1225 : * Okay, all failed, we have a standard mouse here. The number of
1226 : * the buttons is still a question, though. We assume 3.
1227 : */
1228 0 : psmouse_try_protocol(psmouse, PSMOUSE_PS2,
1229 : &max_proto, set_properties, true);
1230 :
1231 0 : if (synaptics_hardware) {
1232 : /*
1233 : * We detected Synaptics hardware but it did not respond to
1234 : * IMPS/2 probes. We need to reset the touchpad because if
1235 : * there is a track point on the pass through port it could
1236 : * get disabled while probing for protocol extensions.
1237 : */
1238 0 : psmouse_reset(psmouse);
1239 : }
1240 :
1241 : return PSMOUSE_PS2;
1242 : }
1243 :
1244 : /*
1245 : * psmouse_probe() probes for a PS/2 mouse.
1246 : */
1247 0 : static int psmouse_probe(struct psmouse *psmouse)
1248 : {
1249 0 : struct ps2dev *ps2dev = &psmouse->ps2dev;
1250 : u8 param[2];
1251 : int error;
1252 :
1253 : /*
1254 : * First, we check if it's a mouse. It should send 0x00 or 0x03 in
1255 : * case of an IntelliMouse in 4-byte mode or 0x04 for IM Explorer.
1256 : * Sunrex K8561 IR Keyboard/Mouse reports 0xff on second and
1257 : * subsequent ID queries, probably due to a firmware bug.
1258 : */
1259 0 : param[0] = 0xa5;
1260 0 : error = ps2_command(ps2dev, param, PSMOUSE_CMD_GETID);
1261 0 : if (error)
1262 : return error;
1263 :
1264 0 : if (param[0] != 0x00 && param[0] != 0x03 &&
1265 0 : param[0] != 0x04 && param[0] != 0xff)
1266 : return -ENODEV;
1267 :
1268 : /*
1269 : * Then we reset and disable the mouse so that it doesn't generate
1270 : * events.
1271 : */
1272 0 : error = ps2_command(ps2dev, NULL, PSMOUSE_CMD_RESET_DIS);
1273 0 : if (error)
1274 0 : psmouse_warn(psmouse, "Failed to reset mouse on %s: %d\n",
1275 : ps2dev->serio->phys, error);
1276 :
1277 : return 0;
1278 : }
1279 :
1280 : /*
1281 : * psmouse_initialize() initializes the mouse to a sane state.
1282 : */
1283 0 : static void psmouse_initialize(struct psmouse *psmouse)
1284 : {
1285 : /*
1286 : * We set the mouse report rate, resolution and scaling.
1287 : */
1288 0 : if (psmouse_max_proto != PSMOUSE_PS2) {
1289 0 : psmouse->set_rate(psmouse, psmouse->rate);
1290 0 : psmouse->set_resolution(psmouse, psmouse->resolution);
1291 0 : psmouse->set_scale(psmouse, PSMOUSE_SCALE11);
1292 : }
1293 0 : }
1294 :
1295 : /*
1296 : * psmouse_activate() enables the mouse so that we get motion reports from it.
1297 : */
1298 0 : int psmouse_activate(struct psmouse *psmouse)
1299 : {
1300 0 : if (ps2_command(&psmouse->ps2dev, NULL, PSMOUSE_CMD_ENABLE)) {
1301 0 : psmouse_warn(psmouse, "Failed to enable mouse on %s\n",
1302 : psmouse->ps2dev.serio->phys);
1303 0 : return -1;
1304 : }
1305 :
1306 0 : psmouse_set_state(psmouse, PSMOUSE_ACTIVATED);
1307 0 : return 0;
1308 : }
1309 :
1310 : /*
1311 : * psmouse_deactivate() puts the mouse into poll mode so that we don't get
1312 : * motion reports from it unless we explicitly request it.
1313 : */
1314 0 : int psmouse_deactivate(struct psmouse *psmouse)
1315 : {
1316 : int error;
1317 :
1318 0 : error = ps2_command(&psmouse->ps2dev, NULL, PSMOUSE_CMD_DISABLE);
1319 0 : if (error) {
1320 0 : psmouse_warn(psmouse, "Failed to deactivate mouse on %s: %d\n",
1321 : psmouse->ps2dev.serio->phys, error);
1322 0 : return error;
1323 : }
1324 :
1325 0 : psmouse_set_state(psmouse, PSMOUSE_CMD_MODE);
1326 0 : return 0;
1327 : }
1328 :
1329 : /*
1330 : * psmouse_resync() attempts to re-validate current protocol.
1331 : */
1332 0 : static void psmouse_resync(struct work_struct *work)
1333 : {
1334 0 : struct psmouse *parent = NULL, *psmouse =
1335 0 : container_of(work, struct psmouse, resync_work.work);
1336 0 : struct serio *serio = psmouse->ps2dev.serio;
1337 0 : psmouse_ret_t rc = PSMOUSE_GOOD_DATA;
1338 0 : bool failed = false, enabled = false;
1339 : int i;
1340 :
1341 0 : mutex_lock(&psmouse_mutex);
1342 :
1343 0 : if (psmouse->state != PSMOUSE_RESYNCING)
1344 : goto out;
1345 :
1346 0 : if (serio->parent && serio->id.type == SERIO_PS_PSTHRU) {
1347 0 : parent = serio_get_drvdata(serio->parent);
1348 0 : psmouse_deactivate(parent);
1349 : }
1350 :
1351 : /*
1352 : * Some mice don't ACK commands sent while they are in the middle of
1353 : * transmitting motion packet. To avoid delay we use ps2_sendbyte()
1354 : * instead of ps2_command() which would wait for 200ms for an ACK
1355 : * that may never come.
1356 : * As an additional quirk ALPS touchpads may not only forget to ACK
1357 : * disable command but will stop reporting taps, so if we see that
1358 : * mouse at least once ACKs disable we will do full reconnect if ACK
1359 : * is missing.
1360 : */
1361 0 : psmouse->num_resyncs++;
1362 :
1363 0 : if (ps2_sendbyte(&psmouse->ps2dev, PSMOUSE_CMD_DISABLE, 20)) {
1364 0 : if (psmouse->num_resyncs < 3 || psmouse->acks_disable_command)
1365 0 : failed = true;
1366 : } else
1367 0 : psmouse->acks_disable_command = true;
1368 :
1369 : /*
1370 : * Poll the mouse. If it was reset the packet will be shorter than
1371 : * psmouse->pktsize and ps2_command will fail. We do not expect and
1372 : * do not handle scenario when mouse "upgrades" its protocol while
1373 : * disconnected since it would require additional delay. If we ever
1374 : * see a mouse that does it we'll adjust the code.
1375 : */
1376 0 : if (!failed) {
1377 0 : if (psmouse->poll(psmouse))
1378 : failed = true;
1379 : else {
1380 0 : psmouse_set_state(psmouse, PSMOUSE_CMD_MODE);
1381 0 : for (i = 0; i < psmouse->pktsize; i++) {
1382 0 : psmouse->pktcnt++;
1383 0 : rc = psmouse->protocol_handler(psmouse);
1384 0 : if (rc != PSMOUSE_GOOD_DATA)
1385 : break;
1386 : }
1387 0 : if (rc != PSMOUSE_FULL_PACKET)
1388 0 : failed = true;
1389 : psmouse_set_state(psmouse, PSMOUSE_RESYNCING);
1390 : }
1391 : }
1392 :
1393 : /*
1394 : * Now try to enable mouse. We try to do that even if poll failed
1395 : * and also repeat our attempts 5 times, otherwise we may be left
1396 : * out with disabled mouse.
1397 : */
1398 0 : for (i = 0; i < 5; i++) {
1399 0 : if (!ps2_command(&psmouse->ps2dev, NULL, PSMOUSE_CMD_ENABLE)) {
1400 : enabled = true;
1401 : break;
1402 : }
1403 0 : msleep(200);
1404 : }
1405 :
1406 0 : if (!enabled) {
1407 0 : psmouse_warn(psmouse, "failed to re-enable mouse on %s\n",
1408 : psmouse->ps2dev.serio->phys);
1409 0 : failed = true;
1410 : }
1411 :
1412 0 : if (failed) {
1413 0 : psmouse_set_state(psmouse, PSMOUSE_IGNORE);
1414 0 : psmouse_info(psmouse,
1415 : "resync failed, issuing reconnect request\n");
1416 0 : serio_reconnect(serio);
1417 : } else
1418 : psmouse_set_state(psmouse, PSMOUSE_ACTIVATED);
1419 :
1420 0 : if (parent)
1421 0 : psmouse_activate(parent);
1422 : out:
1423 0 : mutex_unlock(&psmouse_mutex);
1424 0 : }
1425 :
1426 : /*
1427 : * psmouse_cleanup() resets the mouse into power-on state.
1428 : */
1429 0 : static void psmouse_cleanup(struct serio *serio)
1430 : {
1431 0 : struct psmouse *psmouse = serio_get_drvdata(serio);
1432 0 : struct psmouse *parent = NULL;
1433 :
1434 0 : mutex_lock(&psmouse_mutex);
1435 :
1436 0 : if (serio->parent && serio->id.type == SERIO_PS_PSTHRU) {
1437 0 : parent = serio_get_drvdata(serio->parent);
1438 0 : psmouse_deactivate(parent);
1439 : }
1440 :
1441 0 : psmouse_set_state(psmouse, PSMOUSE_INITIALIZING);
1442 :
1443 : /*
1444 : * Disable stream mode so cleanup routine can proceed undisturbed.
1445 : */
1446 0 : if (ps2_command(&psmouse->ps2dev, NULL, PSMOUSE_CMD_DISABLE))
1447 0 : psmouse_warn(psmouse, "Failed to disable mouse on %s\n",
1448 : psmouse->ps2dev.serio->phys);
1449 :
1450 0 : if (psmouse->cleanup)
1451 0 : psmouse->cleanup(psmouse);
1452 :
1453 : /*
1454 : * Reset the mouse to defaults (bare PS/2 protocol).
1455 : */
1456 0 : ps2_command(&psmouse->ps2dev, NULL, PSMOUSE_CMD_RESET_DIS);
1457 :
1458 : /*
1459 : * Some boxes, such as HP nx7400, get terribly confused if mouse
1460 : * is not fully enabled before suspending/shutting down.
1461 : */
1462 0 : ps2_command(&psmouse->ps2dev, NULL, PSMOUSE_CMD_ENABLE);
1463 :
1464 0 : if (parent) {
1465 0 : if (parent->pt_deactivate)
1466 0 : parent->pt_deactivate(parent);
1467 :
1468 0 : psmouse_activate(parent);
1469 : }
1470 :
1471 0 : mutex_unlock(&psmouse_mutex);
1472 0 : }
1473 :
1474 : /*
1475 : * psmouse_disconnect() closes and frees.
1476 : */
1477 0 : static void psmouse_disconnect(struct serio *serio)
1478 : {
1479 0 : struct psmouse *psmouse = serio_get_drvdata(serio);
1480 0 : struct psmouse *parent = NULL;
1481 :
1482 0 : mutex_lock(&psmouse_mutex);
1483 :
1484 0 : psmouse_set_state(psmouse, PSMOUSE_CMD_MODE);
1485 :
1486 : /* make sure we don't have a resync in progress */
1487 0 : mutex_unlock(&psmouse_mutex);
1488 0 : flush_workqueue(kpsmoused_wq);
1489 0 : mutex_lock(&psmouse_mutex);
1490 :
1491 0 : if (serio->parent && serio->id.type == SERIO_PS_PSTHRU) {
1492 0 : parent = serio_get_drvdata(serio->parent);
1493 0 : psmouse_deactivate(parent);
1494 : }
1495 :
1496 0 : if (psmouse->disconnect)
1497 0 : psmouse->disconnect(psmouse);
1498 :
1499 0 : if (parent && parent->pt_deactivate)
1500 0 : parent->pt_deactivate(parent);
1501 :
1502 0 : psmouse_set_state(psmouse, PSMOUSE_IGNORE);
1503 :
1504 0 : serio_close(serio);
1505 0 : serio_set_drvdata(serio, NULL);
1506 :
1507 0 : if (psmouse->dev)
1508 0 : input_unregister_device(psmouse->dev);
1509 :
1510 0 : kfree(psmouse);
1511 :
1512 0 : if (parent)
1513 0 : psmouse_activate(parent);
1514 :
1515 0 : mutex_unlock(&psmouse_mutex);
1516 0 : }
1517 :
1518 0 : static int psmouse_switch_protocol(struct psmouse *psmouse,
1519 : const struct psmouse_protocol *proto)
1520 : {
1521 : const struct psmouse_protocol *selected_proto;
1522 0 : struct input_dev *input_dev = psmouse->dev;
1523 : enum psmouse_type type;
1524 :
1525 0 : input_dev->dev.parent = &psmouse->ps2dev.serio->dev;
1526 :
1527 0 : if (proto && (proto->detect || proto->init)) {
1528 0 : psmouse_apply_defaults(psmouse);
1529 :
1530 0 : if (proto->detect && proto->detect(psmouse, true) < 0)
1531 : return -1;
1532 :
1533 0 : if (proto->init && proto->init(psmouse) < 0)
1534 : return -1;
1535 :
1536 : selected_proto = proto;
1537 : } else {
1538 0 : type = psmouse_extensions(psmouse, psmouse_max_proto, true);
1539 0 : selected_proto = psmouse_protocol_by_type(type);
1540 : }
1541 :
1542 0 : psmouse->protocol = selected_proto;
1543 :
1544 : /*
1545 : * If mouse's packet size is 3 there is no point in polling the
1546 : * device in hopes to detect protocol reset - we won't get less
1547 : * than 3 bytes response anyhow.
1548 : */
1549 0 : if (psmouse->pktsize == 3)
1550 0 : psmouse->resync_time = 0;
1551 :
1552 : /*
1553 : * Some smart KVMs fake response to POLL command returning just
1554 : * 3 bytes and messing up our resync logic, so if initial poll
1555 : * fails we won't try polling the device anymore. Hopefully
1556 : * such KVM will maintain initially selected protocol.
1557 : */
1558 0 : if (psmouse->resync_time && psmouse->poll(psmouse))
1559 0 : psmouse->resync_time = 0;
1560 :
1561 0 : snprintf(psmouse->devname, sizeof(psmouse->devname), "%s %s %s",
1562 : selected_proto->name, psmouse->vendor, psmouse->name);
1563 :
1564 0 : input_dev->name = psmouse->devname;
1565 0 : input_dev->phys = psmouse->phys;
1566 0 : input_dev->id.bustype = BUS_I8042;
1567 0 : input_dev->id.vendor = 0x0002;
1568 0 : input_dev->id.product = psmouse->protocol->type;
1569 0 : input_dev->id.version = psmouse->model;
1570 :
1571 0 : return 0;
1572 : }
1573 :
1574 : /*
1575 : * psmouse_connect() is a callback from the serio module when
1576 : * an unhandled serio port is found.
1577 : */
1578 0 : static int psmouse_connect(struct serio *serio, struct serio_driver *drv)
1579 : {
1580 0 : struct psmouse *psmouse, *parent = NULL;
1581 : struct input_dev *input_dev;
1582 0 : int retval = 0, error = -ENOMEM;
1583 :
1584 0 : mutex_lock(&psmouse_mutex);
1585 :
1586 : /*
1587 : * If this is a pass-through port deactivate parent so the device
1588 : * connected to this port can be successfully identified
1589 : */
1590 0 : if (serio->parent && serio->id.type == SERIO_PS_PSTHRU) {
1591 0 : parent = serio_get_drvdata(serio->parent);
1592 0 : psmouse_deactivate(parent);
1593 : }
1594 :
1595 0 : psmouse = kzalloc(sizeof(struct psmouse), GFP_KERNEL);
1596 0 : input_dev = input_allocate_device();
1597 0 : if (!psmouse || !input_dev)
1598 : goto err_free;
1599 :
1600 0 : ps2_init(&psmouse->ps2dev, serio);
1601 0 : INIT_DELAYED_WORK(&psmouse->resync_work, psmouse_resync);
1602 0 : psmouse->dev = input_dev;
1603 0 : snprintf(psmouse->phys, sizeof(psmouse->phys), "%s/input0", serio->phys);
1604 :
1605 0 : psmouse_set_state(psmouse, PSMOUSE_INITIALIZING);
1606 :
1607 0 : serio_set_drvdata(serio, psmouse);
1608 :
1609 0 : error = serio_open(serio, drv);
1610 0 : if (error)
1611 : goto err_clear_drvdata;
1612 :
1613 : /* give PT device some time to settle down before probing */
1614 0 : if (serio->id.type == SERIO_PS_PSTHRU)
1615 : usleep_range(10000, 15000);
1616 :
1617 0 : if (psmouse_probe(psmouse) < 0) {
1618 : error = -ENODEV;
1619 : goto err_close_serio;
1620 : }
1621 :
1622 0 : psmouse->rate = psmouse_rate;
1623 0 : psmouse->resolution = psmouse_resolution;
1624 0 : psmouse->resetafter = psmouse_resetafter;
1625 0 : psmouse->resync_time = parent ? 0 : psmouse_resync_time;
1626 0 : psmouse->smartscroll = psmouse_smartscroll;
1627 :
1628 0 : psmouse_switch_protocol(psmouse, NULL);
1629 :
1630 0 : if (!psmouse->protocol->smbus_companion) {
1631 0 : psmouse_set_state(psmouse, PSMOUSE_CMD_MODE);
1632 0 : psmouse_initialize(psmouse);
1633 :
1634 0 : error = input_register_device(input_dev);
1635 0 : if (error)
1636 : goto err_protocol_disconnect;
1637 : } else {
1638 : /* Smbus companion will be reporting events, not us. */
1639 0 : input_free_device(input_dev);
1640 0 : psmouse->dev = input_dev = NULL;
1641 : }
1642 :
1643 0 : if (parent && parent->pt_activate)
1644 0 : parent->pt_activate(parent);
1645 :
1646 : /*
1647 : * PS/2 devices having SMBus companions should stay disabled
1648 : * on PS/2 side, in order to have SMBus part operable.
1649 : */
1650 0 : if (!psmouse->protocol->smbus_companion)
1651 0 : psmouse_activate(psmouse);
1652 :
1653 : out:
1654 : /* If this is a pass-through port the parent needs to be re-activated */
1655 0 : if (parent)
1656 0 : psmouse_activate(parent);
1657 :
1658 0 : mutex_unlock(&psmouse_mutex);
1659 0 : return retval;
1660 :
1661 : err_protocol_disconnect:
1662 0 : if (psmouse->disconnect)
1663 0 : psmouse->disconnect(psmouse);
1664 : psmouse_set_state(psmouse, PSMOUSE_IGNORE);
1665 : err_close_serio:
1666 0 : serio_close(serio);
1667 : err_clear_drvdata:
1668 : serio_set_drvdata(serio, NULL);
1669 : err_free:
1670 0 : input_free_device(input_dev);
1671 0 : kfree(psmouse);
1672 :
1673 0 : retval = error;
1674 0 : goto out;
1675 : }
1676 :
1677 0 : static int __psmouse_reconnect(struct serio *serio, bool fast_reconnect)
1678 : {
1679 0 : struct psmouse *psmouse = serio_get_drvdata(serio);
1680 0 : struct psmouse *parent = NULL;
1681 : int (*reconnect_handler)(struct psmouse *);
1682 : enum psmouse_type type;
1683 0 : int rc = -1;
1684 :
1685 0 : mutex_lock(&psmouse_mutex);
1686 :
1687 0 : if (fast_reconnect) {
1688 0 : reconnect_handler = psmouse->fast_reconnect;
1689 0 : if (!reconnect_handler) {
1690 : rc = -ENOENT;
1691 : goto out_unlock;
1692 : }
1693 : } else {
1694 0 : reconnect_handler = psmouse->reconnect;
1695 : }
1696 :
1697 0 : if (serio->parent && serio->id.type == SERIO_PS_PSTHRU) {
1698 0 : parent = serio_get_drvdata(serio->parent);
1699 0 : psmouse_deactivate(parent);
1700 : }
1701 :
1702 0 : psmouse_set_state(psmouse, PSMOUSE_INITIALIZING);
1703 :
1704 0 : if (reconnect_handler) {
1705 0 : if (reconnect_handler(psmouse))
1706 : goto out;
1707 : } else {
1708 0 : psmouse_reset(psmouse);
1709 :
1710 0 : if (psmouse_probe(psmouse) < 0)
1711 : goto out;
1712 :
1713 0 : type = psmouse_extensions(psmouse, psmouse_max_proto, false);
1714 0 : if (psmouse->protocol->type != type)
1715 : goto out;
1716 : }
1717 :
1718 : /*
1719 : * OK, the device type (and capabilities) match the old one,
1720 : * we can continue using it, complete initialization
1721 : */
1722 0 : if (!psmouse->protocol->smbus_companion) {
1723 0 : psmouse_set_state(psmouse, PSMOUSE_CMD_MODE);
1724 0 : psmouse_initialize(psmouse);
1725 : }
1726 :
1727 0 : if (parent && parent->pt_activate)
1728 0 : parent->pt_activate(parent);
1729 :
1730 : /*
1731 : * PS/2 devices having SMBus companions should stay disabled
1732 : * on PS/2 side, in order to have SMBus part operable.
1733 : */
1734 0 : if (!psmouse->protocol->smbus_companion)
1735 0 : psmouse_activate(psmouse);
1736 :
1737 : rc = 0;
1738 :
1739 : out:
1740 : /* If this is a pass-through port the parent waits to be activated */
1741 0 : if (parent)
1742 0 : psmouse_activate(parent);
1743 :
1744 : out_unlock:
1745 0 : mutex_unlock(&psmouse_mutex);
1746 0 : return rc;
1747 : }
1748 :
1749 0 : static int psmouse_reconnect(struct serio *serio)
1750 : {
1751 0 : return __psmouse_reconnect(serio, false);
1752 : }
1753 :
1754 0 : static int psmouse_fast_reconnect(struct serio *serio)
1755 : {
1756 0 : return __psmouse_reconnect(serio, true);
1757 : }
1758 :
1759 : static struct serio_device_id psmouse_serio_ids[] = {
1760 : {
1761 : .type = SERIO_8042,
1762 : .proto = SERIO_ANY,
1763 : .id = SERIO_ANY,
1764 : .extra = SERIO_ANY,
1765 : },
1766 : {
1767 : .type = SERIO_PS_PSTHRU,
1768 : .proto = SERIO_ANY,
1769 : .id = SERIO_ANY,
1770 : .extra = SERIO_ANY,
1771 : },
1772 : { 0 }
1773 : };
1774 :
1775 : MODULE_DEVICE_TABLE(serio, psmouse_serio_ids);
1776 :
1777 : static struct serio_driver psmouse_drv = {
1778 : .driver = {
1779 : .name = "psmouse",
1780 : .dev_groups = psmouse_dev_groups,
1781 : },
1782 : .description = DRIVER_DESC,
1783 : .id_table = psmouse_serio_ids,
1784 : .interrupt = psmouse_interrupt,
1785 : .connect = psmouse_connect,
1786 : .reconnect = psmouse_reconnect,
1787 : .fast_reconnect = psmouse_fast_reconnect,
1788 : .disconnect = psmouse_disconnect,
1789 : .cleanup = psmouse_cleanup,
1790 : };
1791 :
1792 0 : ssize_t psmouse_attr_show_helper(struct device *dev, struct device_attribute *devattr,
1793 : char *buf)
1794 : {
1795 0 : struct serio *serio = to_serio_port(dev);
1796 0 : struct psmouse_attribute *attr = to_psmouse_attr(devattr);
1797 0 : struct psmouse *psmouse = serio_get_drvdata(serio);
1798 :
1799 0 : if (psmouse->protocol->smbus_companion &&
1800 : devattr != &psmouse_attr_protocol.dattr)
1801 : return -ENOENT;
1802 :
1803 0 : return attr->show(psmouse, attr->data, buf);
1804 : }
1805 :
1806 0 : ssize_t psmouse_attr_set_helper(struct device *dev, struct device_attribute *devattr,
1807 : const char *buf, size_t count)
1808 : {
1809 0 : struct serio *serio = to_serio_port(dev);
1810 0 : struct psmouse_attribute *attr = to_psmouse_attr(devattr);
1811 0 : struct psmouse *psmouse, *parent = NULL;
1812 : int retval;
1813 :
1814 0 : retval = mutex_lock_interruptible(&psmouse_mutex);
1815 0 : if (retval)
1816 : goto out;
1817 :
1818 0 : psmouse = serio_get_drvdata(serio);
1819 :
1820 0 : if (psmouse->protocol->smbus_companion &&
1821 : devattr != &psmouse_attr_protocol.dattr) {
1822 : retval = -ENOENT;
1823 : goto out_unlock;
1824 : }
1825 :
1826 0 : if (attr->protect) {
1827 0 : if (psmouse->state == PSMOUSE_IGNORE) {
1828 : retval = -ENODEV;
1829 : goto out_unlock;
1830 : }
1831 :
1832 0 : if (serio->parent && serio->id.type == SERIO_PS_PSTHRU) {
1833 0 : parent = serio_get_drvdata(serio->parent);
1834 0 : psmouse_deactivate(parent);
1835 : }
1836 :
1837 0 : if (!psmouse->protocol->smbus_companion)
1838 0 : psmouse_deactivate(psmouse);
1839 : }
1840 :
1841 0 : retval = attr->set(psmouse, attr->data, buf, count);
1842 :
1843 0 : if (attr->protect) {
1844 0 : if (retval != -ENODEV && !psmouse->protocol->smbus_companion)
1845 0 : psmouse_activate(psmouse);
1846 :
1847 0 : if (parent)
1848 0 : psmouse_activate(parent);
1849 : }
1850 :
1851 : out_unlock:
1852 0 : mutex_unlock(&psmouse_mutex);
1853 : out:
1854 0 : return retval;
1855 : }
1856 :
1857 0 : static ssize_t psmouse_show_int_attr(struct psmouse *psmouse, void *offset, char *buf)
1858 : {
1859 0 : unsigned int *field = (unsigned int *)((char *)psmouse + (size_t)offset);
1860 :
1861 0 : return sprintf(buf, "%u\n", *field);
1862 : }
1863 :
1864 0 : static ssize_t psmouse_set_int_attr(struct psmouse *psmouse, void *offset, const char *buf, size_t count)
1865 : {
1866 0 : unsigned int *field = (unsigned int *)((char *)psmouse + (size_t)offset);
1867 : unsigned int value;
1868 : int err;
1869 :
1870 0 : err = kstrtouint(buf, 10, &value);
1871 0 : if (err)
1872 0 : return err;
1873 :
1874 0 : *field = value;
1875 :
1876 0 : return count;
1877 : }
1878 :
1879 0 : static ssize_t psmouse_attr_show_protocol(struct psmouse *psmouse, void *data, char *buf)
1880 : {
1881 0 : return sprintf(buf, "%s\n", psmouse->protocol->name);
1882 : }
1883 :
1884 0 : static ssize_t psmouse_attr_set_protocol(struct psmouse *psmouse, void *data, const char *buf, size_t count)
1885 : {
1886 0 : struct serio *serio = psmouse->ps2dev.serio;
1887 0 : struct psmouse *parent = NULL;
1888 : struct input_dev *old_dev, *new_dev;
1889 : const struct psmouse_protocol *proto, *old_proto;
1890 : int error;
1891 0 : int retry = 0;
1892 :
1893 0 : proto = psmouse_protocol_by_name(buf, count);
1894 0 : if (!proto)
1895 : return -EINVAL;
1896 :
1897 0 : if (psmouse->protocol == proto)
1898 0 : return count;
1899 :
1900 0 : new_dev = input_allocate_device();
1901 0 : if (!new_dev)
1902 : return -ENOMEM;
1903 :
1904 0 : while (!list_empty(&serio->children)) {
1905 0 : if (++retry > 3) {
1906 0 : psmouse_warn(psmouse,
1907 : "failed to destroy children ports, protocol change aborted.\n");
1908 0 : input_free_device(new_dev);
1909 0 : return -EIO;
1910 : }
1911 :
1912 0 : mutex_unlock(&psmouse_mutex);
1913 0 : serio_unregister_child_port(serio);
1914 0 : mutex_lock(&psmouse_mutex);
1915 :
1916 0 : if (serio->drv != &psmouse_drv) {
1917 0 : input_free_device(new_dev);
1918 0 : return -ENODEV;
1919 : }
1920 :
1921 0 : if (psmouse->protocol == proto) {
1922 0 : input_free_device(new_dev);
1923 0 : return count; /* switched by other thread */
1924 : }
1925 : }
1926 :
1927 0 : if (serio->parent && serio->id.type == SERIO_PS_PSTHRU) {
1928 0 : parent = serio_get_drvdata(serio->parent);
1929 0 : if (parent->pt_deactivate)
1930 0 : parent->pt_deactivate(parent);
1931 : }
1932 :
1933 0 : old_dev = psmouse->dev;
1934 0 : old_proto = psmouse->protocol;
1935 :
1936 0 : if (psmouse->disconnect)
1937 0 : psmouse->disconnect(psmouse);
1938 :
1939 0 : psmouse_set_state(psmouse, PSMOUSE_IGNORE);
1940 :
1941 0 : psmouse->dev = new_dev;
1942 0 : psmouse_set_state(psmouse, PSMOUSE_INITIALIZING);
1943 :
1944 0 : if (psmouse_switch_protocol(psmouse, proto) < 0) {
1945 0 : psmouse_reset(psmouse);
1946 : /* default to PSMOUSE_PS2 */
1947 0 : psmouse_switch_protocol(psmouse, &psmouse_protocols[0]);
1948 : }
1949 :
1950 0 : psmouse_initialize(psmouse);
1951 0 : psmouse_set_state(psmouse, PSMOUSE_CMD_MODE);
1952 :
1953 0 : if (psmouse->protocol->smbus_companion) {
1954 0 : input_free_device(psmouse->dev);
1955 0 : psmouse->dev = NULL;
1956 : } else {
1957 0 : error = input_register_device(psmouse->dev);
1958 0 : if (error) {
1959 0 : if (psmouse->disconnect)
1960 0 : psmouse->disconnect(psmouse);
1961 :
1962 0 : psmouse_set_state(psmouse, PSMOUSE_IGNORE);
1963 0 : input_free_device(new_dev);
1964 0 : psmouse->dev = old_dev;
1965 0 : psmouse_set_state(psmouse, PSMOUSE_INITIALIZING);
1966 0 : psmouse_switch_protocol(psmouse, old_proto);
1967 0 : psmouse_initialize(psmouse);
1968 0 : psmouse_set_state(psmouse, PSMOUSE_CMD_MODE);
1969 :
1970 0 : return error;
1971 : }
1972 : }
1973 :
1974 0 : if (old_dev)
1975 0 : input_unregister_device(old_dev);
1976 :
1977 0 : if (parent && parent->pt_activate)
1978 0 : parent->pt_activate(parent);
1979 :
1980 0 : return count;
1981 : }
1982 :
1983 0 : static ssize_t psmouse_attr_set_rate(struct psmouse *psmouse, void *data, const char *buf, size_t count)
1984 : {
1985 : unsigned int value;
1986 : int err;
1987 :
1988 0 : err = kstrtouint(buf, 10, &value);
1989 0 : if (err)
1990 0 : return err;
1991 :
1992 0 : psmouse->set_rate(psmouse, value);
1993 0 : return count;
1994 : }
1995 :
1996 0 : static ssize_t psmouse_attr_set_resolution(struct psmouse *psmouse, void *data, const char *buf, size_t count)
1997 : {
1998 : unsigned int value;
1999 : int err;
2000 :
2001 0 : err = kstrtouint(buf, 10, &value);
2002 0 : if (err)
2003 0 : return err;
2004 :
2005 0 : psmouse->set_resolution(psmouse, value);
2006 0 : return count;
2007 : }
2008 :
2009 :
2010 0 : static int psmouse_set_maxproto(const char *val, const struct kernel_param *kp)
2011 : {
2012 : const struct psmouse_protocol *proto;
2013 :
2014 0 : if (!val)
2015 : return -EINVAL;
2016 :
2017 0 : proto = psmouse_protocol_by_name(val, strlen(val));
2018 :
2019 0 : if (!proto || !proto->maxproto)
2020 : return -EINVAL;
2021 :
2022 0 : *((unsigned int *)kp->arg) = proto->type;
2023 :
2024 0 : return 0;
2025 : }
2026 :
2027 0 : static int psmouse_get_maxproto(char *buffer, const struct kernel_param *kp)
2028 : {
2029 0 : int type = *((unsigned int *)kp->arg);
2030 :
2031 0 : return sprintf(buffer, "%s\n", psmouse_protocol_by_type(type)->name);
2032 : }
2033 :
2034 1 : static int __init psmouse_init(void)
2035 : {
2036 : int err;
2037 :
2038 : lifebook_module_init();
2039 1 : synaptics_module_init();
2040 : hgpk_module_init();
2041 :
2042 1 : err = psmouse_smbus_module_init();
2043 1 : if (err)
2044 : return err;
2045 :
2046 1 : kpsmoused_wq = alloc_ordered_workqueue("kpsmoused", 0);
2047 1 : if (!kpsmoused_wq) {
2048 0 : pr_err("failed to create kpsmoused workqueue\n");
2049 0 : err = -ENOMEM;
2050 0 : goto err_smbus_exit;
2051 : }
2052 :
2053 1 : err = serio_register_driver(&psmouse_drv);
2054 1 : if (err)
2055 : goto err_destroy_wq;
2056 :
2057 : return 0;
2058 :
2059 : err_destroy_wq:
2060 0 : destroy_workqueue(kpsmoused_wq);
2061 : err_smbus_exit:
2062 0 : psmouse_smbus_module_exit();
2063 0 : return err;
2064 : }
2065 :
2066 0 : static void __exit psmouse_exit(void)
2067 : {
2068 0 : serio_unregister_driver(&psmouse_drv);
2069 0 : destroy_workqueue(kpsmoused_wq);
2070 0 : psmouse_smbus_module_exit();
2071 0 : }
2072 :
2073 : module_init(psmouse_init);
2074 : module_exit(psmouse_exit);
|