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