This source file includes following definitions.
- synaptics_mode_cmd
- synaptics_detect
- synaptics_reset
- synaptics_send_cmd
- synaptics_query_int
- synaptics_identify
- synaptics_model_id
- synaptics_firmware_id
- synaptics_query_modes
- synaptics_capability
- synaptics_resolution
- synaptics_query_hardware
- synaptics_invert_y
- synaptics_apply_quirks
- synaptics_has_agm
- synaptics_set_advanced_gesture_mode
- synaptics_set_mode
- synaptics_set_rate
- synaptics_pt_write
- synaptics_pt_start
- synaptics_pt_stop
- synaptics_is_pt_packet
- synaptics_pass_pt_packet
- synaptics_pt_activate
- synaptics_pt_create
- synaptics_parse_agm
- synaptics_parse_ext_buttons
- synaptics_parse_hw_state
- synaptics_report_semi_mt_slot
- synaptics_report_semi_mt_data
- synaptics_report_ext_buttons
- synaptics_report_buttons
- synaptics_report_mt_data
- synaptics_image_sensor_process
- synaptics_has_multifinger
- synaptics_process_packet
- synaptics_validate_byte
- synaptics_detect_pkt_type
- synaptics_process_byte
- set_abs_position_params
- set_input_params
- synaptics_show_disable_gesture
- synaptics_set_disable_gesture
- synaptics_disconnect
- synaptics_reconnect
- synaptics_module_init
- synaptics_init_ps2
- __synaptics_init
- synaptics_init_absolute
- synaptics_init_relative
- synaptics_setup_ps2
- synaptics_module_init
- synaptics_setup_ps2
- IS_ENABLED
- synaptics_setup_intertouch
- synaptics_init_smbus
- synaptics_setup_intertouch
- synaptics_init_smbus
- synaptics_init
- synaptics_init
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23 #include <linux/module.h>
24 #include <linux/delay.h>
25 #include <linux/dmi.h>
26 #include <linux/input/mt.h>
27 #include <linux/serio.h>
28 #include <linux/libps2.h>
29 #include <linux/rmi.h>
30 #include <linux/i2c.h>
31 #include <linux/slab.h>
32 #include "psmouse.h"
33 #include "synaptics.h"
34
35
36
37
38
39
40
41
42 #define XMIN 0
43 #define XMAX 6143
44 #define YMIN 0
45 #define YMAX 6143
46 #define XMIN_NOMINAL 1472
47 #define XMAX_NOMINAL 5472
48 #define YMIN_NOMINAL 1408
49 #define YMAX_NOMINAL 4448
50
51
52 #define ABS_POS_BITS 13
53
54
55
56
57
58
59
60
61
62
63
64
65
66 #define X_MAX_POSITIVE 8176
67 #define Y_MAX_POSITIVE 8176
68
69
70 #define DMAX 10
71
72
73
74
75
76
77
78
79 static int synaptics_mode_cmd(struct psmouse *psmouse, u8 mode)
80 {
81 u8 param[1];
82 int error;
83
84 error = ps2_sliced_command(&psmouse->ps2dev, mode);
85 if (error)
86 return error;
87
88 param[0] = SYN_PS_SET_MODE2;
89 error = ps2_command(&psmouse->ps2dev, param, PSMOUSE_CMD_SETRATE);
90 if (error)
91 return error;
92
93 return 0;
94 }
95
96 int synaptics_detect(struct psmouse *psmouse, bool set_properties)
97 {
98 struct ps2dev *ps2dev = &psmouse->ps2dev;
99 u8 param[4] = { 0 };
100
101 ps2_command(ps2dev, param, PSMOUSE_CMD_SETRES);
102 ps2_command(ps2dev, param, PSMOUSE_CMD_SETRES);
103 ps2_command(ps2dev, param, PSMOUSE_CMD_SETRES);
104 ps2_command(ps2dev, param, PSMOUSE_CMD_SETRES);
105 ps2_command(ps2dev, param, PSMOUSE_CMD_GETINFO);
106
107 if (param[1] != 0x47)
108 return -ENODEV;
109
110 if (set_properties) {
111 psmouse->vendor = "Synaptics";
112 psmouse->name = "TouchPad";
113 }
114
115 return 0;
116 }
117
118 void synaptics_reset(struct psmouse *psmouse)
119 {
120
121 synaptics_mode_cmd(psmouse, 0);
122 }
123
124 #if defined(CONFIG_MOUSE_PS2_SYNAPTICS) || \
125 defined(CONFIG_MOUSE_PS2_SYNAPTICS_SMBUS)
126
127
128 static const char * const topbuttonpad_pnp_ids[] = {
129 "LEN0017",
130 "LEN0018",
131 "LEN0019",
132 "LEN0023",
133 "LEN002A",
134 "LEN002B",
135 "LEN002C",
136 "LEN002D",
137 "LEN002E",
138 "LEN0033",
139 "LEN0034",
140 "LEN0035",
141 "LEN0036",
142 "LEN0037",
143 "LEN0038",
144 "LEN0039",
145 "LEN0041",
146 "LEN0042",
147 "LEN0045",
148 "LEN0047",
149 "LEN2000",
150 "LEN2001",
151 "LEN2002",
152 "LEN2003",
153 "LEN2004",
154 "LEN2005",
155 "LEN2006",
156 "LEN2007",
157 "LEN2008",
158 "LEN2009",
159 "LEN200A",
160 "LEN200B",
161 NULL
162 };
163
164 static const char * const smbus_pnp_ids[] = {
165
166 "LEN0048",
167 "LEN0046",
168 "LEN0049",
169 "LEN004a",
170 "LEN005b",
171 "LEN005e",
172 "LEN006c",
173 "LEN007a",
174 "LEN0071",
175 "LEN0072",
176 "LEN0073",
177 "LEN0091",
178 "LEN0092",
179 "LEN0093",
180 "LEN0096",
181 "LEN0097",
182 "LEN009b",
183 "LEN200f",
184 "LEN2044",
185 "LEN2054",
186 "LEN2055",
187 "SYN3052",
188 "SYN3221",
189 "SYN323d",
190 "SYN3257",
191 NULL
192 };
193
194 static const char * const forcepad_pnp_ids[] = {
195 "SYN300D",
196 "SYN3014",
197 NULL
198 };
199
200
201
202
203 static int synaptics_send_cmd(struct psmouse *psmouse, u8 cmd, u8 *param)
204 {
205 int error;
206
207 error = ps2_sliced_command(&psmouse->ps2dev, cmd);
208 if (error)
209 return error;
210
211 error = ps2_command(&psmouse->ps2dev, param, PSMOUSE_CMD_GETINFO);
212 if (error)
213 return error;
214
215 return 0;
216 }
217
218 static int synaptics_query_int(struct psmouse *psmouse, u8 query_cmd, u32 *val)
219 {
220 int error;
221 union {
222 __be32 be_val;
223 char buf[4];
224 } resp = { 0 };
225
226 error = synaptics_send_cmd(psmouse, query_cmd, resp.buf + 1);
227 if (error)
228 return error;
229
230 *val = be32_to_cpu(resp.be_val);
231 return 0;
232 }
233
234
235
236
237
238 static int synaptics_identify(struct psmouse *psmouse,
239 struct synaptics_device_info *info)
240 {
241 int error;
242
243 error = synaptics_query_int(psmouse, SYN_QUE_IDENTIFY, &info->identity);
244 if (error)
245 return error;
246
247 return SYN_ID_IS_SYNAPTICS(info->identity) ? 0 : -ENXIO;
248 }
249
250
251
252
253
254 static int synaptics_model_id(struct psmouse *psmouse,
255 struct synaptics_device_info *info)
256 {
257 return synaptics_query_int(psmouse, SYN_QUE_MODEL, &info->model_id);
258 }
259
260
261
262
263 static int synaptics_firmware_id(struct psmouse *psmouse,
264 struct synaptics_device_info *info)
265 {
266 return synaptics_query_int(psmouse, SYN_QUE_FIRMWARE_ID,
267 &info->firmware_id);
268 }
269
270
271
272
273
274 static int synaptics_query_modes(struct psmouse *psmouse,
275 struct synaptics_device_info *info)
276 {
277 u8 bid[3];
278 int error;
279
280
281 if (SYN_ID_FULL(info->identity) < 0x705)
282 return 0;
283
284 error = synaptics_send_cmd(psmouse, SYN_QUE_MODES, bid);
285 if (error)
286 return error;
287
288 info->board_id = ((bid[0] & 0xfc) << 6) | bid[1];
289
290 if (SYN_MEXT_CAP_BIT(bid[0]))
291 return synaptics_query_int(psmouse, SYN_QUE_MEXT_CAPAB_10,
292 &info->ext_cap_10);
293
294 return 0;
295 }
296
297
298
299
300
301 static int synaptics_capability(struct psmouse *psmouse,
302 struct synaptics_device_info *info)
303 {
304 int error;
305
306 error = synaptics_query_int(psmouse, SYN_QUE_CAPABILITIES,
307 &info->capabilities);
308 if (error)
309 return error;
310
311 info->ext_cap = info->ext_cap_0c = 0;
312
313
314
315
316 if (SYN_ID_FULL(info->identity) < 0x705 &&
317 SYN_CAP_SUBMODEL_ID(info->capabilities) != 0x47) {
318 return -ENXIO;
319 }
320
321
322
323
324 if (!SYN_CAP_EXTENDED(info->capabilities))
325 info->capabilities = 0;
326
327 if (SYN_EXT_CAP_REQUESTS(info->capabilities) >= 1) {
328 error = synaptics_query_int(psmouse, SYN_QUE_EXT_CAPAB,
329 &info->ext_cap);
330 if (error) {
331 psmouse_warn(psmouse,
332 "device claims to have extended capabilities, but I'm not able to read them.\n");
333 } else {
334
335
336
337
338 if (SYN_CAP_MULTI_BUTTON_NO(info->ext_cap) > 8)
339 info->ext_cap &= ~SYN_CAP_MB_MASK;
340 }
341 }
342
343 if (SYN_EXT_CAP_REQUESTS(info->capabilities) >= 4) {
344 error = synaptics_query_int(psmouse, SYN_QUE_EXT_CAPAB_0C,
345 &info->ext_cap_0c);
346 if (error)
347 psmouse_warn(psmouse,
348 "device claims to have extended capability 0x0c, but I'm not able to read it.\n");
349 }
350
351 return 0;
352 }
353
354
355
356
357
358 static int synaptics_resolution(struct psmouse *psmouse,
359 struct synaptics_device_info *info)
360 {
361 u8 resp[3];
362 int error;
363
364 if (SYN_ID_MAJOR(info->identity) < 4)
365 return 0;
366
367 error = synaptics_send_cmd(psmouse, SYN_QUE_RESOLUTION, resp);
368 if (!error) {
369 if (resp[0] != 0 && (resp[1] & 0x80) && resp[2] != 0) {
370 info->x_res = resp[0];
371 info->y_res = resp[2];
372 }
373 }
374
375 if (SYN_EXT_CAP_REQUESTS(info->capabilities) >= 5 &&
376 SYN_CAP_MAX_DIMENSIONS(info->ext_cap_0c)) {
377 error = synaptics_send_cmd(psmouse,
378 SYN_QUE_EXT_MAX_COORDS, resp);
379 if (error) {
380 psmouse_warn(psmouse,
381 "device claims to have max coordinates query, but I'm not able to read it.\n");
382 } else {
383 info->x_max = (resp[0] << 5) | ((resp[1] & 0x0f) << 1);
384 info->y_max = (resp[2] << 5) | ((resp[1] & 0xf0) >> 3);
385 psmouse_info(psmouse,
386 "queried max coordinates: x [..%d], y [..%d]\n",
387 info->x_max, info->y_max);
388 }
389 }
390
391 if (SYN_CAP_MIN_DIMENSIONS(info->ext_cap_0c) &&
392 (SYN_EXT_CAP_REQUESTS(info->capabilities) >= 7 ||
393
394
395
396
397
398 SYN_ID_FULL(info->identity) == 0x801)) {
399 error = synaptics_send_cmd(psmouse,
400 SYN_QUE_EXT_MIN_COORDS, resp);
401 if (error) {
402 psmouse_warn(psmouse,
403 "device claims to have min coordinates query, but I'm not able to read it.\n");
404 } else {
405 info->x_min = (resp[0] << 5) | ((resp[1] & 0x0f) << 1);
406 info->y_min = (resp[2] << 5) | ((resp[1] & 0xf0) >> 3);
407 psmouse_info(psmouse,
408 "queried min coordinates: x [%d..], y [%d..]\n",
409 info->x_min, info->y_min);
410 }
411 }
412
413 return 0;
414 }
415
416 static int synaptics_query_hardware(struct psmouse *psmouse,
417 struct synaptics_device_info *info)
418 {
419 int error;
420
421 memset(info, 0, sizeof(*info));
422
423 error = synaptics_identify(psmouse, info);
424 if (error)
425 return error;
426
427 error = synaptics_model_id(psmouse, info);
428 if (error)
429 return error;
430
431 error = synaptics_firmware_id(psmouse, info);
432 if (error)
433 return error;
434
435 error = synaptics_query_modes(psmouse, info);
436 if (error)
437 return error;
438
439 error = synaptics_capability(psmouse, info);
440 if (error)
441 return error;
442
443 error = synaptics_resolution(psmouse, info);
444 if (error)
445 return error;
446
447 return 0;
448 }
449
450 #endif
451
452 #ifdef CONFIG_MOUSE_PS2_SYNAPTICS
453
454 static bool cr48_profile_sensor;
455
456 #define ANY_BOARD_ID 0
457 struct min_max_quirk {
458 const char * const *pnp_ids;
459 struct {
460 u32 min, max;
461 } board_id;
462 u32 x_min, x_max, y_min, y_max;
463 };
464
465 static const struct min_max_quirk min_max_pnpid_table[] = {
466 {
467 (const char * const []){"LEN0033", NULL},
468 {ANY_BOARD_ID, ANY_BOARD_ID},
469 1024, 5052, 2258, 4832
470 },
471 {
472 (const char * const []){"LEN0042", NULL},
473 {ANY_BOARD_ID, ANY_BOARD_ID},
474 1232, 5710, 1156, 4696
475 },
476 {
477 (const char * const []){"LEN0034", "LEN0036", "LEN0037",
478 "LEN0039", "LEN2002", "LEN2004",
479 NULL},
480 {ANY_BOARD_ID, 2961},
481 1024, 5112, 2024, 4832
482 },
483 {
484 (const char * const []){"LEN2000", NULL},
485 {ANY_BOARD_ID, ANY_BOARD_ID},
486 1024, 5113, 2021, 4832
487 },
488 {
489 (const char * const []){"LEN2001", NULL},
490 {ANY_BOARD_ID, ANY_BOARD_ID},
491 1024, 5022, 2508, 4832
492 },
493 {
494 (const char * const []){"LEN2006", NULL},
495 {2691, 2691},
496 1024, 5045, 2457, 4832
497 },
498 {
499 (const char * const []){"LEN2006", NULL},
500 {ANY_BOARD_ID, ANY_BOARD_ID},
501 1264, 5675, 1171, 4688
502 },
503 { }
504 };
505
506
507
508
509
510
511
512
513
514
515 static int synaptics_invert_y(int y)
516 {
517 return YMAX_NOMINAL + YMIN_NOMINAL - y;
518 }
519
520
521
522
523 static void synaptics_apply_quirks(struct psmouse *psmouse,
524 struct synaptics_device_info *info)
525 {
526 int i;
527
528 for (i = 0; min_max_pnpid_table[i].pnp_ids; i++) {
529 if (!psmouse_matches_pnp_id(psmouse,
530 min_max_pnpid_table[i].pnp_ids))
531 continue;
532
533 if (min_max_pnpid_table[i].board_id.min != ANY_BOARD_ID &&
534 info->board_id < min_max_pnpid_table[i].board_id.min)
535 continue;
536
537 if (min_max_pnpid_table[i].board_id.max != ANY_BOARD_ID &&
538 info->board_id > min_max_pnpid_table[i].board_id.max)
539 continue;
540
541 info->x_min = min_max_pnpid_table[i].x_min;
542 info->x_max = min_max_pnpid_table[i].x_max;
543 info->y_min = min_max_pnpid_table[i].y_min;
544 info->y_max = min_max_pnpid_table[i].y_max;
545 psmouse_info(psmouse,
546 "quirked min/max coordinates: x [%d..%d], y [%d..%d]\n",
547 info->x_min, info->x_max,
548 info->y_min, info->y_max);
549 break;
550 }
551 }
552
553 static bool synaptics_has_agm(struct synaptics_data *priv)
554 {
555 return (SYN_CAP_ADV_GESTURE(priv->info.ext_cap_0c) ||
556 SYN_CAP_IMAGE_SENSOR(priv->info.ext_cap_0c));
557 }
558
559 static int synaptics_set_advanced_gesture_mode(struct psmouse *psmouse)
560 {
561 static u8 param = 0xc8;
562 int error;
563
564 error = ps2_sliced_command(&psmouse->ps2dev, SYN_QUE_MODEL);
565 if (error)
566 return error;
567
568 error = ps2_command(&psmouse->ps2dev, ¶m, PSMOUSE_CMD_SETRATE);
569 if (error)
570 return error;
571
572 return 0;
573 }
574
575 static int synaptics_set_mode(struct psmouse *psmouse)
576 {
577 struct synaptics_data *priv = psmouse->private;
578 int error;
579
580 priv->mode = 0;
581 if (priv->absolute_mode)
582 priv->mode |= SYN_BIT_ABSOLUTE_MODE;
583 if (priv->disable_gesture)
584 priv->mode |= SYN_BIT_DISABLE_GESTURE;
585 if (psmouse->rate >= 80)
586 priv->mode |= SYN_BIT_HIGH_RATE;
587 if (SYN_CAP_EXTENDED(priv->info.capabilities))
588 priv->mode |= SYN_BIT_W_MODE;
589
590 error = synaptics_mode_cmd(psmouse, priv->mode);
591 if (error)
592 return error;
593
594 if (priv->absolute_mode && synaptics_has_agm(priv)) {
595 error = synaptics_set_advanced_gesture_mode(psmouse);
596 if (error) {
597 psmouse_err(psmouse,
598 "Advanced gesture mode init failed: %d\n",
599 error);
600 return error;
601 }
602 }
603
604 return 0;
605 }
606
607 static void synaptics_set_rate(struct psmouse *psmouse, unsigned int rate)
608 {
609 struct synaptics_data *priv = psmouse->private;
610
611 if (rate >= 80) {
612 priv->mode |= SYN_BIT_HIGH_RATE;
613 psmouse->rate = 80;
614 } else {
615 priv->mode &= ~SYN_BIT_HIGH_RATE;
616 psmouse->rate = 40;
617 }
618
619 synaptics_mode_cmd(psmouse, priv->mode);
620 }
621
622
623
624
625 static int synaptics_pt_write(struct serio *serio, u8 c)
626 {
627 struct psmouse *parent = serio_get_drvdata(serio->parent);
628 u8 rate_param = SYN_PS_CLIENT_CMD;
629 int error;
630
631 error = ps2_sliced_command(&parent->ps2dev, c);
632 if (error)
633 return error;
634
635 error = ps2_command(&parent->ps2dev, &rate_param, PSMOUSE_CMD_SETRATE);
636 if (error)
637 return error;
638
639 return 0;
640 }
641
642 static int synaptics_pt_start(struct serio *serio)
643 {
644 struct psmouse *parent = serio_get_drvdata(serio->parent);
645 struct synaptics_data *priv = parent->private;
646
647 serio_pause_rx(parent->ps2dev.serio);
648 priv->pt_port = serio;
649 serio_continue_rx(parent->ps2dev.serio);
650
651 return 0;
652 }
653
654 static void synaptics_pt_stop(struct serio *serio)
655 {
656 struct psmouse *parent = serio_get_drvdata(serio->parent);
657 struct synaptics_data *priv = parent->private;
658
659 serio_pause_rx(parent->ps2dev.serio);
660 priv->pt_port = NULL;
661 serio_continue_rx(parent->ps2dev.serio);
662 }
663
664 static int synaptics_is_pt_packet(u8 *buf)
665 {
666 return (buf[0] & 0xFC) == 0x84 && (buf[3] & 0xCC) == 0xC4;
667 }
668
669 static void synaptics_pass_pt_packet(struct serio *ptport, u8 *packet)
670 {
671 struct psmouse *child = serio_get_drvdata(ptport);
672
673 if (child && child->state == PSMOUSE_ACTIVATED) {
674 serio_interrupt(ptport, packet[1], 0);
675 serio_interrupt(ptport, packet[4], 0);
676 serio_interrupt(ptport, packet[5], 0);
677 if (child->pktsize == 4)
678 serio_interrupt(ptport, packet[2], 0);
679 } else {
680 serio_interrupt(ptport, packet[1], 0);
681 }
682 }
683
684 static void synaptics_pt_activate(struct psmouse *psmouse)
685 {
686 struct synaptics_data *priv = psmouse->private;
687 struct psmouse *child = serio_get_drvdata(priv->pt_port);
688
689
690 if (child) {
691 if (child->pktsize == 4)
692 priv->mode |= SYN_BIT_FOUR_BYTE_CLIENT;
693 else
694 priv->mode &= ~SYN_BIT_FOUR_BYTE_CLIENT;
695
696 if (synaptics_mode_cmd(psmouse, priv->mode))
697 psmouse_warn(psmouse,
698 "failed to switch guest protocol\n");
699 }
700 }
701
702 static void synaptics_pt_create(struct psmouse *psmouse)
703 {
704 struct serio *serio;
705
706 serio = kzalloc(sizeof(struct serio), GFP_KERNEL);
707 if (!serio) {
708 psmouse_err(psmouse,
709 "not enough memory for pass-through port\n");
710 return;
711 }
712
713 serio->id.type = SERIO_PS_PSTHRU;
714 strlcpy(serio->name, "Synaptics pass-through", sizeof(serio->name));
715 strlcpy(serio->phys, "synaptics-pt/serio0", sizeof(serio->phys));
716 serio->write = synaptics_pt_write;
717 serio->start = synaptics_pt_start;
718 serio->stop = synaptics_pt_stop;
719 serio->parent = psmouse->ps2dev.serio;
720
721 psmouse->pt_activate = synaptics_pt_activate;
722
723 psmouse_info(psmouse, "serio: %s port at %s\n",
724 serio->name, psmouse->phys);
725 serio_register_port(serio);
726 }
727
728
729
730
731
732 static void synaptics_parse_agm(const u8 buf[],
733 struct synaptics_data *priv,
734 struct synaptics_hw_state *hw)
735 {
736 struct synaptics_hw_state *agm = &priv->agm;
737 int agm_packet_type;
738
739 agm_packet_type = (buf[5] & 0x30) >> 4;
740 switch (agm_packet_type) {
741 case 1:
742
743 agm->w = hw->w;
744 agm->x = (((buf[4] & 0x0f) << 8) | buf[1]) << 1;
745 agm->y = (((buf[4] & 0xf0) << 4) | buf[2]) << 1;
746 agm->z = ((buf[3] & 0x30) | (buf[5] & 0x0f)) << 1;
747 break;
748
749 case 2:
750
751 priv->agm_count = buf[1];
752 break;
753
754 default:
755 break;
756 }
757 }
758
759 static void synaptics_parse_ext_buttons(const u8 buf[],
760 struct synaptics_data *priv,
761 struct synaptics_hw_state *hw)
762 {
763 unsigned int ext_bits =
764 (SYN_CAP_MULTI_BUTTON_NO(priv->info.ext_cap) + 1) >> 1;
765 unsigned int ext_mask = GENMASK(ext_bits - 1, 0);
766
767 hw->ext_buttons = buf[4] & ext_mask;
768 hw->ext_buttons |= (buf[5] & ext_mask) << ext_bits;
769 }
770
771 static int synaptics_parse_hw_state(const u8 buf[],
772 struct synaptics_data *priv,
773 struct synaptics_hw_state *hw)
774 {
775 memset(hw, 0, sizeof(struct synaptics_hw_state));
776
777 if (SYN_MODEL_NEWABS(priv->info.model_id)) {
778 hw->w = (((buf[0] & 0x30) >> 2) |
779 ((buf[0] & 0x04) >> 1) |
780 ((buf[3] & 0x04) >> 2));
781
782 if (synaptics_has_agm(priv) && hw->w == 2) {
783 synaptics_parse_agm(buf, priv, hw);
784 return 1;
785 }
786
787 hw->x = (((buf[3] & 0x10) << 8) |
788 ((buf[1] & 0x0f) << 8) |
789 buf[4]);
790 hw->y = (((buf[3] & 0x20) << 7) |
791 ((buf[1] & 0xf0) << 4) |
792 buf[5]);
793 hw->z = buf[2];
794
795 hw->left = (buf[0] & 0x01) ? 1 : 0;
796 hw->right = (buf[0] & 0x02) ? 1 : 0;
797
798 if (priv->is_forcepad) {
799
800
801
802
803
804
805
806
807
808 if (hw->z == 0) {
809
810 priv->press = priv->report_press = false;
811 } else if (hw->w >= 4 && ((buf[0] ^ buf[3]) & 0x01)) {
812
813
814
815
816
817
818
819
820 if (!priv->press) {
821 priv->press_start = jiffies;
822 priv->press = true;
823 } else if (time_after(jiffies,
824 priv->press_start +
825 msecs_to_jiffies(50))) {
826 priv->report_press = true;
827 }
828 } else {
829 priv->press = false;
830 }
831
832 hw->left = priv->report_press;
833
834 } else if (SYN_CAP_CLICKPAD(priv->info.ext_cap_0c)) {
835
836
837
838
839
840 hw->left = ((buf[0] ^ buf[3]) & 0x01) ? 1 : 0;
841
842 } else if (SYN_CAP_MIDDLE_BUTTON(priv->info.capabilities)) {
843 hw->middle = ((buf[0] ^ buf[3]) & 0x01) ? 1 : 0;
844 if (hw->w == 2)
845 hw->scroll = (s8)buf[1];
846 }
847
848 if (SYN_CAP_FOUR_BUTTON(priv->info.capabilities)) {
849 hw->up = ((buf[0] ^ buf[3]) & 0x01) ? 1 : 0;
850 hw->down = ((buf[0] ^ buf[3]) & 0x02) ? 1 : 0;
851 }
852
853 if (SYN_CAP_MULTI_BUTTON_NO(priv->info.ext_cap) > 0 &&
854 ((buf[0] ^ buf[3]) & 0x02)) {
855 synaptics_parse_ext_buttons(buf, priv, hw);
856 }
857 } else {
858 hw->x = (((buf[1] & 0x1f) << 8) | buf[2]);
859 hw->y = (((buf[4] & 0x1f) << 8) | buf[5]);
860
861 hw->z = (((buf[0] & 0x30) << 2) | (buf[3] & 0x3F));
862 hw->w = (((buf[1] & 0x80) >> 4) | ((buf[0] & 0x04) >> 1));
863
864 hw->left = (buf[0] & 0x01) ? 1 : 0;
865 hw->right = (buf[0] & 0x02) ? 1 : 0;
866 }
867
868
869
870
871
872
873
874 if (hw->x > X_MAX_POSITIVE)
875 hw->x -= 1 << ABS_POS_BITS;
876 else if (hw->x == X_MAX_POSITIVE)
877 hw->x = XMAX;
878
879 if (hw->y > Y_MAX_POSITIVE)
880 hw->y -= 1 << ABS_POS_BITS;
881 else if (hw->y == Y_MAX_POSITIVE)
882 hw->y = YMAX;
883
884 return 0;
885 }
886
887 static void synaptics_report_semi_mt_slot(struct input_dev *dev, int slot,
888 bool active, int x, int y)
889 {
890 input_mt_slot(dev, slot);
891 input_mt_report_slot_state(dev, MT_TOOL_FINGER, active);
892 if (active) {
893 input_report_abs(dev, ABS_MT_POSITION_X, x);
894 input_report_abs(dev, ABS_MT_POSITION_Y, synaptics_invert_y(y));
895 }
896 }
897
898 static void synaptics_report_semi_mt_data(struct input_dev *dev,
899 const struct synaptics_hw_state *a,
900 const struct synaptics_hw_state *b,
901 int num_fingers)
902 {
903 if (num_fingers >= 2) {
904 synaptics_report_semi_mt_slot(dev, 0, true, min(a->x, b->x),
905 min(a->y, b->y));
906 synaptics_report_semi_mt_slot(dev, 1, true, max(a->x, b->x),
907 max(a->y, b->y));
908 } else if (num_fingers == 1) {
909 synaptics_report_semi_mt_slot(dev, 0, true, a->x, a->y);
910 synaptics_report_semi_mt_slot(dev, 1, false, 0, 0);
911 } else {
912 synaptics_report_semi_mt_slot(dev, 0, false, 0, 0);
913 synaptics_report_semi_mt_slot(dev, 1, false, 0, 0);
914 }
915 }
916
917 static void synaptics_report_ext_buttons(struct psmouse *psmouse,
918 const struct synaptics_hw_state *hw)
919 {
920 struct input_dev *dev = psmouse->dev;
921 struct synaptics_data *priv = psmouse->private;
922 int ext_bits = (SYN_CAP_MULTI_BUTTON_NO(priv->info.ext_cap) + 1) >> 1;
923 int i;
924
925 if (!SYN_CAP_MULTI_BUTTON_NO(priv->info.ext_cap))
926 return;
927
928
929 if ((SYN_ID_FULL(priv->info.identity) == 0x801 ||
930 SYN_ID_FULL(priv->info.identity) == 0x802) &&
931 !((psmouse->packet[0] ^ psmouse->packet[3]) & 0x02))
932 return;
933
934 if (!SYN_CAP_EXT_BUTTONS_STICK(priv->info.ext_cap_10)) {
935 for (i = 0; i < ext_bits; i++) {
936 input_report_key(dev, BTN_0 + 2 * i,
937 hw->ext_buttons & BIT(i));
938 input_report_key(dev, BTN_1 + 2 * i,
939 hw->ext_buttons & BIT(i + ext_bits));
940 }
941 return;
942 }
943
944
945
946
947
948
949 if (priv->pt_port) {
950 u8 pt_buttons;
951
952
953 pt_buttons = SYN_EXT_BUTTON_STICK_L(hw->ext_buttons) |
954 SYN_EXT_BUTTON_STICK_R(hw->ext_buttons) << 1 |
955 SYN_EXT_BUTTON_STICK_M(hw->ext_buttons) << 2;
956
957 serio_interrupt(priv->pt_port,
958 PSMOUSE_OOB_EXTRA_BTNS, SERIO_OOB_DATA);
959 serio_interrupt(priv->pt_port, pt_buttons, SERIO_OOB_DATA);
960 }
961 }
962
963 static void synaptics_report_buttons(struct psmouse *psmouse,
964 const struct synaptics_hw_state *hw)
965 {
966 struct input_dev *dev = psmouse->dev;
967 struct synaptics_data *priv = psmouse->private;
968
969 input_report_key(dev, BTN_LEFT, hw->left);
970 input_report_key(dev, BTN_RIGHT, hw->right);
971
972 if (SYN_CAP_MIDDLE_BUTTON(priv->info.capabilities))
973 input_report_key(dev, BTN_MIDDLE, hw->middle);
974
975 if (SYN_CAP_FOUR_BUTTON(priv->info.capabilities)) {
976 input_report_key(dev, BTN_FORWARD, hw->up);
977 input_report_key(dev, BTN_BACK, hw->down);
978 }
979
980 synaptics_report_ext_buttons(psmouse, hw);
981 }
982
983 static void synaptics_report_mt_data(struct psmouse *psmouse,
984 const struct synaptics_hw_state *sgm,
985 int num_fingers)
986 {
987 struct input_dev *dev = psmouse->dev;
988 struct synaptics_data *priv = psmouse->private;
989 const struct synaptics_hw_state *hw[2] = { sgm, &priv->agm };
990 struct input_mt_pos pos[2];
991 int slot[2], nsemi, i;
992
993 nsemi = clamp_val(num_fingers, 0, 2);
994
995 for (i = 0; i < nsemi; i++) {
996 pos[i].x = hw[i]->x;
997 pos[i].y = synaptics_invert_y(hw[i]->y);
998 }
999
1000 input_mt_assign_slots(dev, slot, pos, nsemi, DMAX * priv->info.x_res);
1001
1002 for (i = 0; i < nsemi; i++) {
1003 input_mt_slot(dev, slot[i]);
1004 input_mt_report_slot_state(dev, MT_TOOL_FINGER, true);
1005 input_report_abs(dev, ABS_MT_POSITION_X, pos[i].x);
1006 input_report_abs(dev, ABS_MT_POSITION_Y, pos[i].y);
1007 input_report_abs(dev, ABS_MT_PRESSURE, hw[i]->z);
1008 }
1009
1010 input_mt_drop_unused(dev);
1011
1012
1013 input_mt_report_pointer_emulation(dev, false);
1014
1015
1016 input_mt_report_finger_count(dev, num_fingers);
1017
1018 synaptics_report_buttons(psmouse, sgm);
1019
1020 input_sync(dev);
1021 }
1022
1023 static void synaptics_image_sensor_process(struct psmouse *psmouse,
1024 struct synaptics_hw_state *sgm)
1025 {
1026 struct synaptics_data *priv = psmouse->private;
1027 int num_fingers;
1028
1029
1030
1031
1032 if (sgm->z == 0)
1033 num_fingers = 0;
1034 else if (sgm->w >= 4)
1035 num_fingers = 1;
1036 else if (sgm->w == 0)
1037 num_fingers = 2;
1038 else if (sgm->w == 1)
1039 num_fingers = priv->agm_count ? priv->agm_count : 3;
1040 else
1041 num_fingers = 4;
1042
1043
1044 synaptics_report_mt_data(psmouse, sgm, num_fingers);
1045 }
1046
1047 static bool synaptics_has_multifinger(struct synaptics_data *priv)
1048 {
1049 if (SYN_CAP_MULTIFINGER(priv->info.capabilities))
1050 return true;
1051
1052
1053 return synaptics_has_agm(priv);
1054 }
1055
1056
1057
1058
1059 static void synaptics_process_packet(struct psmouse *psmouse)
1060 {
1061 struct input_dev *dev = psmouse->dev;
1062 struct synaptics_data *priv = psmouse->private;
1063 struct synaptics_device_info *info = &priv->info;
1064 struct synaptics_hw_state hw;
1065 int num_fingers;
1066 int finger_width;
1067
1068 if (synaptics_parse_hw_state(psmouse->packet, priv, &hw))
1069 return;
1070
1071 if (SYN_CAP_IMAGE_SENSOR(info->ext_cap_0c)) {
1072 synaptics_image_sensor_process(psmouse, &hw);
1073 return;
1074 }
1075
1076 if (hw.scroll) {
1077 priv->scroll += hw.scroll;
1078
1079 while (priv->scroll >= 4) {
1080 input_report_key(dev, BTN_BACK, !hw.down);
1081 input_sync(dev);
1082 input_report_key(dev, BTN_BACK, hw.down);
1083 input_sync(dev);
1084 priv->scroll -= 4;
1085 }
1086 while (priv->scroll <= -4) {
1087 input_report_key(dev, BTN_FORWARD, !hw.up);
1088 input_sync(dev);
1089 input_report_key(dev, BTN_FORWARD, hw.up);
1090 input_sync(dev);
1091 priv->scroll += 4;
1092 }
1093 return;
1094 }
1095
1096 if (hw.z > 0 && hw.x > 1) {
1097 num_fingers = 1;
1098 finger_width = 5;
1099 if (SYN_CAP_EXTENDED(info->capabilities)) {
1100 switch (hw.w) {
1101 case 0 ... 1:
1102 if (synaptics_has_multifinger(priv))
1103 num_fingers = hw.w + 2;
1104 break;
1105 case 2:
1106 if (SYN_MODEL_PEN(info->model_id))
1107 ;
1108 break;
1109 case 4 ... 15:
1110 if (SYN_CAP_PALMDETECT(info->capabilities))
1111 finger_width = hw.w;
1112 break;
1113 }
1114 }
1115 } else {
1116 num_fingers = 0;
1117 finger_width = 0;
1118 }
1119
1120 if (cr48_profile_sensor) {
1121 synaptics_report_mt_data(psmouse, &hw, num_fingers);
1122 return;
1123 }
1124
1125 if (SYN_CAP_ADV_GESTURE(info->ext_cap_0c))
1126 synaptics_report_semi_mt_data(dev, &hw, &priv->agm,
1127 num_fingers);
1128
1129
1130
1131
1132
1133 if (hw.z > 30) input_report_key(dev, BTN_TOUCH, 1);
1134 if (hw.z < 25) input_report_key(dev, BTN_TOUCH, 0);
1135
1136 if (num_fingers > 0) {
1137 input_report_abs(dev, ABS_X, hw.x);
1138 input_report_abs(dev, ABS_Y, synaptics_invert_y(hw.y));
1139 }
1140 input_report_abs(dev, ABS_PRESSURE, hw.z);
1141
1142 if (SYN_CAP_PALMDETECT(info->capabilities))
1143 input_report_abs(dev, ABS_TOOL_WIDTH, finger_width);
1144
1145 input_report_key(dev, BTN_TOOL_FINGER, num_fingers == 1);
1146 if (synaptics_has_multifinger(priv)) {
1147 input_report_key(dev, BTN_TOOL_DOUBLETAP, num_fingers == 2);
1148 input_report_key(dev, BTN_TOOL_TRIPLETAP, num_fingers == 3);
1149 }
1150
1151 synaptics_report_buttons(psmouse, &hw);
1152
1153 input_sync(dev);
1154 }
1155
1156 static bool synaptics_validate_byte(struct psmouse *psmouse,
1157 int idx, enum synaptics_pkt_type pkt_type)
1158 {
1159 static const u8 newabs_mask[] = { 0xC8, 0x00, 0x00, 0xC8, 0x00 };
1160 static const u8 newabs_rel_mask[] = { 0xC0, 0x00, 0x00, 0xC0, 0x00 };
1161 static const u8 newabs_rslt[] = { 0x80, 0x00, 0x00, 0xC0, 0x00 };
1162 static const u8 oldabs_mask[] = { 0xC0, 0x60, 0x00, 0xC0, 0x60 };
1163 static const u8 oldabs_rslt[] = { 0xC0, 0x00, 0x00, 0x80, 0x00 };
1164 const u8 *packet = psmouse->packet;
1165
1166 if (idx < 0 || idx > 4)
1167 return false;
1168
1169 switch (pkt_type) {
1170
1171 case SYN_NEWABS:
1172 case SYN_NEWABS_RELAXED:
1173 return (packet[idx] & newabs_rel_mask[idx]) == newabs_rslt[idx];
1174
1175 case SYN_NEWABS_STRICT:
1176 return (packet[idx] & newabs_mask[idx]) == newabs_rslt[idx];
1177
1178 case SYN_OLDABS:
1179 return (packet[idx] & oldabs_mask[idx]) == oldabs_rslt[idx];
1180
1181 default:
1182 psmouse_err(psmouse, "unknown packet type %d\n", pkt_type);
1183 return false;
1184 }
1185 }
1186
1187 static enum synaptics_pkt_type
1188 synaptics_detect_pkt_type(struct psmouse *psmouse)
1189 {
1190 int i;
1191
1192 for (i = 0; i < 5; i++) {
1193 if (!synaptics_validate_byte(psmouse, i, SYN_NEWABS_STRICT)) {
1194 psmouse_info(psmouse, "using relaxed packet validation\n");
1195 return SYN_NEWABS_RELAXED;
1196 }
1197 }
1198
1199 return SYN_NEWABS_STRICT;
1200 }
1201
1202 static psmouse_ret_t synaptics_process_byte(struct psmouse *psmouse)
1203 {
1204 struct synaptics_data *priv = psmouse->private;
1205
1206 if (psmouse->pktcnt >= 6) {
1207 if (unlikely(priv->pkt_type == SYN_NEWABS))
1208 priv->pkt_type = synaptics_detect_pkt_type(psmouse);
1209
1210 if (SYN_CAP_PASS_THROUGH(priv->info.capabilities) &&
1211 synaptics_is_pt_packet(psmouse->packet)) {
1212 if (priv->pt_port)
1213 synaptics_pass_pt_packet(priv->pt_port,
1214 psmouse->packet);
1215 } else
1216 synaptics_process_packet(psmouse);
1217
1218 return PSMOUSE_FULL_PACKET;
1219 }
1220
1221 return synaptics_validate_byte(psmouse, psmouse->pktcnt - 1, priv->pkt_type) ?
1222 PSMOUSE_GOOD_DATA : PSMOUSE_BAD_DATA;
1223 }
1224
1225
1226
1227
1228 static void set_abs_position_params(struct input_dev *dev,
1229 struct synaptics_device_info *info,
1230 int x_code, int y_code)
1231 {
1232 int x_min = info->x_min ?: XMIN_NOMINAL;
1233 int x_max = info->x_max ?: XMAX_NOMINAL;
1234 int y_min = info->y_min ?: YMIN_NOMINAL;
1235 int y_max = info->y_max ?: YMAX_NOMINAL;
1236 int fuzz = SYN_CAP_REDUCED_FILTERING(info->ext_cap_0c) ?
1237 SYN_REDUCED_FILTER_FUZZ : 0;
1238
1239 input_set_abs_params(dev, x_code, x_min, x_max, fuzz, 0);
1240 input_set_abs_params(dev, y_code, y_min, y_max, fuzz, 0);
1241 input_abs_set_res(dev, x_code, info->x_res);
1242 input_abs_set_res(dev, y_code, info->y_res);
1243 }
1244
1245 static int set_input_params(struct psmouse *psmouse,
1246 struct synaptics_data *priv)
1247 {
1248 struct input_dev *dev = psmouse->dev;
1249 struct synaptics_device_info *info = &priv->info;
1250 int i;
1251 int error;
1252
1253
1254 __clear_bit(EV_REL, dev->evbit);
1255 bitmap_zero(dev->relbit, REL_CNT);
1256 bitmap_zero(dev->keybit, KEY_CNT);
1257
1258
1259 __set_bit(INPUT_PROP_POINTER, dev->propbit);
1260
1261 input_set_capability(dev, EV_KEY, BTN_LEFT);
1262
1263
1264 if (!SYN_CAP_CLICKPAD(info->ext_cap_0c)) {
1265 input_set_capability(dev, EV_KEY, BTN_RIGHT);
1266 if (SYN_CAP_MIDDLE_BUTTON(info->capabilities))
1267 input_set_capability(dev, EV_KEY, BTN_MIDDLE);
1268 }
1269
1270 if (!priv->absolute_mode) {
1271
1272 input_set_capability(dev, EV_REL, REL_X);
1273 input_set_capability(dev, EV_REL, REL_Y);
1274 return 0;
1275 }
1276
1277
1278 set_abs_position_params(dev, &priv->info, ABS_X, ABS_Y);
1279 input_set_abs_params(dev, ABS_PRESSURE, 0, 255, 0, 0);
1280
1281 if (cr48_profile_sensor)
1282 input_set_abs_params(dev, ABS_MT_PRESSURE, 0, 255, 0, 0);
1283
1284 if (SYN_CAP_IMAGE_SENSOR(info->ext_cap_0c)) {
1285 set_abs_position_params(dev, info,
1286 ABS_MT_POSITION_X, ABS_MT_POSITION_Y);
1287
1288 input_set_abs_params(dev, ABS_MT_PRESSURE, 0, 255, 0, 0);
1289
1290 error = input_mt_init_slots(dev, 2,
1291 INPUT_MT_POINTER | INPUT_MT_TRACK);
1292 if (error)
1293 return error;
1294
1295
1296 input_set_capability(dev, EV_KEY, BTN_TOOL_QUADTAP);
1297 input_set_capability(dev, EV_KEY, BTN_TOOL_QUINTTAP);
1298 } else if (SYN_CAP_ADV_GESTURE(info->ext_cap_0c)) {
1299 set_abs_position_params(dev, info,
1300 ABS_MT_POSITION_X, ABS_MT_POSITION_Y);
1301
1302
1303
1304
1305 error = input_mt_init_slots(dev, 2,
1306 INPUT_MT_POINTER |
1307 (cr48_profile_sensor ?
1308 INPUT_MT_TRACK :
1309 INPUT_MT_SEMI_MT));
1310 if (error)
1311 return error;
1312
1313
1314
1315
1316
1317
1318
1319
1320 if (!cr48_profile_sensor)
1321 set_abs_position_params(dev, &priv->info, ABS_X, ABS_Y);
1322 }
1323
1324 if (SYN_CAP_PALMDETECT(info->capabilities))
1325 input_set_abs_params(dev, ABS_TOOL_WIDTH, 0, 15, 0, 0);
1326
1327 input_set_capability(dev, EV_KEY, BTN_TOUCH);
1328 input_set_capability(dev, EV_KEY, BTN_TOOL_FINGER);
1329
1330 if (synaptics_has_multifinger(priv)) {
1331 input_set_capability(dev, EV_KEY, BTN_TOOL_DOUBLETAP);
1332 input_set_capability(dev, EV_KEY, BTN_TOOL_TRIPLETAP);
1333 }
1334
1335 if (SYN_CAP_FOUR_BUTTON(info->capabilities) ||
1336 SYN_CAP_MIDDLE_BUTTON(info->capabilities)) {
1337 input_set_capability(dev, EV_KEY, BTN_FORWARD);
1338 input_set_capability(dev, EV_KEY, BTN_BACK);
1339 }
1340
1341 if (!SYN_CAP_EXT_BUTTONS_STICK(info->ext_cap_10))
1342 for (i = 0; i < SYN_CAP_MULTI_BUTTON_NO(info->ext_cap); i++)
1343 input_set_capability(dev, EV_KEY, BTN_0 + i);
1344
1345 if (SYN_CAP_CLICKPAD(info->ext_cap_0c)) {
1346 __set_bit(INPUT_PROP_BUTTONPAD, dev->propbit);
1347 if (psmouse_matches_pnp_id(psmouse, topbuttonpad_pnp_ids) &&
1348 !SYN_CAP_EXT_BUTTONS_STICK(info->ext_cap_10))
1349 __set_bit(INPUT_PROP_TOPBUTTONPAD, dev->propbit);
1350 }
1351
1352 return 0;
1353 }
1354
1355 static ssize_t synaptics_show_disable_gesture(struct psmouse *psmouse,
1356 void *data, char *buf)
1357 {
1358 struct synaptics_data *priv = psmouse->private;
1359
1360 return sprintf(buf, "%c\n", priv->disable_gesture ? '1' : '0');
1361 }
1362
1363 static ssize_t synaptics_set_disable_gesture(struct psmouse *psmouse,
1364 void *data, const char *buf,
1365 size_t len)
1366 {
1367 struct synaptics_data *priv = psmouse->private;
1368 unsigned int value;
1369 int err;
1370
1371 err = kstrtouint(buf, 10, &value);
1372 if (err)
1373 return err;
1374
1375 if (value > 1)
1376 return -EINVAL;
1377
1378 if (value == priv->disable_gesture)
1379 return len;
1380
1381 priv->disable_gesture = value;
1382 if (value)
1383 priv->mode |= SYN_BIT_DISABLE_GESTURE;
1384 else
1385 priv->mode &= ~SYN_BIT_DISABLE_GESTURE;
1386
1387 if (synaptics_mode_cmd(psmouse, priv->mode))
1388 return -EIO;
1389
1390 return len;
1391 }
1392
1393 PSMOUSE_DEFINE_ATTR(disable_gesture, S_IWUSR | S_IRUGO, NULL,
1394 synaptics_show_disable_gesture,
1395 synaptics_set_disable_gesture);
1396
1397 static void synaptics_disconnect(struct psmouse *psmouse)
1398 {
1399 struct synaptics_data *priv = psmouse->private;
1400
1401
1402
1403
1404
1405 psmouse_smbus_cleanup(psmouse);
1406
1407 if (!priv->absolute_mode &&
1408 SYN_ID_DISGEST_SUPPORTED(priv->info.identity))
1409 device_remove_file(&psmouse->ps2dev.serio->dev,
1410 &psmouse_attr_disable_gesture.dattr);
1411
1412 synaptics_reset(psmouse);
1413 kfree(priv);
1414 psmouse->private = NULL;
1415 }
1416
1417 static int synaptics_reconnect(struct psmouse *psmouse)
1418 {
1419 struct synaptics_data *priv = psmouse->private;
1420 struct synaptics_device_info info;
1421 u8 param[2];
1422 int retry = 0;
1423 int error;
1424
1425 do {
1426 psmouse_reset(psmouse);
1427 if (retry) {
1428
1429
1430
1431
1432
1433
1434
1435 ssleep(1);
1436 }
1437 ps2_command(&psmouse->ps2dev, param, PSMOUSE_CMD_GETID);
1438 error = synaptics_detect(psmouse, 0);
1439 } while (error && ++retry < 3);
1440
1441 if (error)
1442 return error;
1443
1444 if (retry > 1)
1445 psmouse_dbg(psmouse, "reconnected after %d tries\n", retry);
1446
1447 error = synaptics_query_hardware(psmouse, &info);
1448 if (error) {
1449 psmouse_err(psmouse, "Unable to query device.\n");
1450 return error;
1451 }
1452
1453 error = synaptics_set_mode(psmouse);
1454 if (error) {
1455 psmouse_err(psmouse, "Unable to initialize device.\n");
1456 return error;
1457 }
1458
1459 if (info.identity != priv->info.identity ||
1460 info.model_id != priv->info.model_id ||
1461 info.capabilities != priv->info.capabilities ||
1462 info.ext_cap != priv->info.ext_cap) {
1463 psmouse_err(psmouse,
1464 "hardware appears to be different: id(%u-%u), model(%u-%u), caps(%x-%x), ext(%x-%x).\n",
1465 priv->info.identity, info.identity,
1466 priv->info.model_id, info.model_id,
1467 priv->info.capabilities, info.capabilities,
1468 priv->info.ext_cap, info.ext_cap);
1469 return -ENXIO;
1470 }
1471
1472 return 0;
1473 }
1474
1475 static bool impaired_toshiba_kbc;
1476
1477 static const struct dmi_system_id toshiba_dmi_table[] __initconst = {
1478 #if defined(CONFIG_DMI) && defined(CONFIG_X86)
1479 {
1480
1481 .matches = {
1482 DMI_MATCH(DMI_SYS_VENDOR, "TOSHIBA"),
1483 DMI_MATCH(DMI_PRODUCT_NAME, "Satellite"),
1484 },
1485 },
1486 {
1487
1488 .matches = {
1489 DMI_MATCH(DMI_SYS_VENDOR, "TOSHIBA"),
1490 DMI_MATCH(DMI_PRODUCT_NAME, "dynabook"),
1491 },
1492 },
1493 {
1494
1495 .matches = {
1496 DMI_MATCH(DMI_SYS_VENDOR, "TOSHIBA"),
1497 DMI_MATCH(DMI_PRODUCT_NAME, "PORTEGE M300"),
1498 },
1499
1500 },
1501 {
1502
1503 .matches = {
1504 DMI_MATCH(DMI_SYS_VENDOR, "TOSHIBA"),
1505 DMI_MATCH(DMI_PRODUCT_NAME, "Portable PC"),
1506 DMI_MATCH(DMI_PRODUCT_VERSION, "Version 1.0"),
1507 },
1508
1509 },
1510 #endif
1511 { }
1512 };
1513
1514 static bool broken_olpc_ec;
1515
1516 static const struct dmi_system_id olpc_dmi_table[] __initconst = {
1517 #if defined(CONFIG_DMI) && defined(CONFIG_OLPC)
1518 {
1519
1520 .matches = {
1521 DMI_MATCH(DMI_SYS_VENDOR, "OLPC"),
1522 DMI_MATCH(DMI_PRODUCT_NAME, "XO"),
1523 },
1524 },
1525 #endif
1526 { }
1527 };
1528
1529 static const struct dmi_system_id __initconst cr48_dmi_table[] = {
1530 #if defined(CONFIG_DMI) && defined(CONFIG_X86)
1531 {
1532
1533 .matches = {
1534 DMI_MATCH(DMI_SYS_VENDOR, "IEC"),
1535 DMI_MATCH(DMI_PRODUCT_NAME, "Mario"),
1536 },
1537 },
1538 #endif
1539 { }
1540 };
1541
1542 void __init synaptics_module_init(void)
1543 {
1544 impaired_toshiba_kbc = dmi_check_system(toshiba_dmi_table);
1545 broken_olpc_ec = dmi_check_system(olpc_dmi_table);
1546 cr48_profile_sensor = dmi_check_system(cr48_dmi_table);
1547 }
1548
1549 static int synaptics_init_ps2(struct psmouse *psmouse,
1550 struct synaptics_device_info *info,
1551 bool absolute_mode)
1552 {
1553 struct synaptics_data *priv;
1554 int err;
1555
1556 synaptics_apply_quirks(psmouse, info);
1557
1558 psmouse->private = priv = kzalloc(sizeof(struct synaptics_data), GFP_KERNEL);
1559 if (!priv)
1560 return -ENOMEM;
1561
1562 priv->info = *info;
1563 priv->absolute_mode = absolute_mode;
1564 if (SYN_ID_DISGEST_SUPPORTED(info->identity))
1565 priv->disable_gesture = true;
1566
1567
1568
1569
1570
1571 priv->is_forcepad = psmouse_matches_pnp_id(psmouse, forcepad_pnp_ids);
1572
1573 err = synaptics_set_mode(psmouse);
1574 if (err) {
1575 psmouse_err(psmouse, "Unable to initialize device.\n");
1576 goto init_fail;
1577 }
1578
1579 priv->pkt_type = SYN_MODEL_NEWABS(info->model_id) ?
1580 SYN_NEWABS : SYN_OLDABS;
1581
1582 psmouse_info(psmouse,
1583 "Touchpad model: %lu, fw: %lu.%lu, id: %#x, caps: %#x/%#x/%#x/%#x, board id: %u, fw id: %u\n",
1584 SYN_ID_MODEL(info->identity),
1585 SYN_ID_MAJOR(info->identity), SYN_ID_MINOR(info->identity),
1586 info->model_id,
1587 info->capabilities, info->ext_cap, info->ext_cap_0c,
1588 info->ext_cap_10, info->board_id, info->firmware_id);
1589
1590 err = set_input_params(psmouse, priv);
1591 if (err) {
1592 psmouse_err(psmouse,
1593 "failed to set up capabilities: %d\n", err);
1594 goto init_fail;
1595 }
1596
1597
1598
1599
1600
1601
1602
1603
1604 psmouse->model = ((info->model_id & 0x00ff0000) >> 8) |
1605 (info->model_id & 0x000000ff);
1606
1607 if (absolute_mode) {
1608 psmouse->protocol_handler = synaptics_process_byte;
1609 psmouse->pktsize = 6;
1610 } else {
1611
1612 psmouse->protocol_handler = psmouse_process_byte;
1613 psmouse->pktsize = 3;
1614 }
1615
1616 psmouse->set_rate = synaptics_set_rate;
1617 psmouse->disconnect = synaptics_disconnect;
1618 psmouse->reconnect = synaptics_reconnect;
1619 psmouse->cleanup = synaptics_reset;
1620
1621 psmouse->resync_time = 0;
1622
1623 if (SYN_CAP_PASS_THROUGH(info->capabilities))
1624 synaptics_pt_create(psmouse);
1625
1626
1627
1628
1629
1630
1631 if (psmouse->rate >= 80 && impaired_toshiba_kbc) {
1632 psmouse_info(psmouse,
1633 "Toshiba %s detected, limiting rate to 40pps.\n",
1634 dmi_get_system_info(DMI_PRODUCT_NAME));
1635 psmouse->rate = 40;
1636 }
1637
1638 if (!priv->absolute_mode && SYN_ID_DISGEST_SUPPORTED(info->identity)) {
1639 err = device_create_file(&psmouse->ps2dev.serio->dev,
1640 &psmouse_attr_disable_gesture.dattr);
1641 if (err) {
1642 psmouse_err(psmouse,
1643 "Failed to create disable_gesture attribute (%d)",
1644 err);
1645 goto init_fail;
1646 }
1647 }
1648
1649 return 0;
1650
1651 init_fail:
1652 kfree(priv);
1653 return err;
1654 }
1655
1656 static int __synaptics_init(struct psmouse *psmouse, bool absolute_mode)
1657 {
1658 struct synaptics_device_info info;
1659 int error;
1660
1661 psmouse_reset(psmouse);
1662
1663 error = synaptics_query_hardware(psmouse, &info);
1664 if (error) {
1665 psmouse_err(psmouse, "Unable to query device: %d\n", error);
1666 return error;
1667 }
1668
1669 return synaptics_init_ps2(psmouse, &info, absolute_mode);
1670 }
1671
1672 int synaptics_init_absolute(struct psmouse *psmouse)
1673 {
1674 return __synaptics_init(psmouse, true);
1675 }
1676
1677 int synaptics_init_relative(struct psmouse *psmouse)
1678 {
1679 return __synaptics_init(psmouse, false);
1680 }
1681
1682 static int synaptics_setup_ps2(struct psmouse *psmouse,
1683 struct synaptics_device_info *info)
1684 {
1685 bool absolute_mode = true;
1686 int error;
1687
1688
1689
1690
1691
1692
1693
1694 if (broken_olpc_ec) {
1695 psmouse_info(psmouse,
1696 "OLPC XO detected, forcing relative protocol.\n");
1697 absolute_mode = false;
1698 }
1699
1700 error = synaptics_init_ps2(psmouse, info, absolute_mode);
1701 if (error)
1702 return error;
1703
1704 return absolute_mode ? PSMOUSE_SYNAPTICS : PSMOUSE_SYNAPTICS_RELATIVE;
1705 }
1706
1707 #else
1708
1709 void __init synaptics_module_init(void)
1710 {
1711 }
1712
1713 static int __maybe_unused
1714 synaptics_setup_ps2(struct psmouse *psmouse,
1715 struct synaptics_device_info *info)
1716 {
1717 return -ENOSYS;
1718 }
1719
1720 #endif
1721
1722 #ifdef CONFIG_MOUSE_PS2_SYNAPTICS_SMBUS
1723
1724
1725
1726
1727
1728
1729 enum {
1730 SYNAPTICS_INTERTOUCH_NOT_SET = -1,
1731 SYNAPTICS_INTERTOUCH_OFF,
1732 SYNAPTICS_INTERTOUCH_ON,
1733 };
1734
1735 static int synaptics_intertouch = IS_ENABLED(CONFIG_RMI4_SMB) ?
1736 SYNAPTICS_INTERTOUCH_NOT_SET : SYNAPTICS_INTERTOUCH_OFF;
1737 module_param_named(synaptics_intertouch, synaptics_intertouch, int, 0644);
1738 MODULE_PARM_DESC(synaptics_intertouch, "Use a secondary bus for the Synaptics device.");
1739
1740 static int synaptics_create_intertouch(struct psmouse *psmouse,
1741 struct synaptics_device_info *info,
1742 bool leave_breadcrumbs)
1743 {
1744 bool topbuttonpad =
1745 psmouse_matches_pnp_id(psmouse, topbuttonpad_pnp_ids) &&
1746 !SYN_CAP_EXT_BUTTONS_STICK(info->ext_cap_10);
1747 const struct rmi_device_platform_data pdata = {
1748 .sensor_pdata = {
1749 .sensor_type = rmi_sensor_touchpad,
1750 .axis_align.flip_y = true,
1751 .kernel_tracking = false,
1752 .topbuttonpad = topbuttonpad,
1753 },
1754 .f30_data = {
1755 .buttonpad = SYN_CAP_CLICKPAD(info->ext_cap_0c),
1756 .trackstick_buttons =
1757 !!SYN_CAP_EXT_BUTTONS_STICK(info->ext_cap_10),
1758 },
1759 };
1760 const struct i2c_board_info intertouch_board = {
1761 I2C_BOARD_INFO("rmi4_smbus", 0x2c),
1762 .flags = I2C_CLIENT_HOST_NOTIFY,
1763 };
1764
1765 return psmouse_smbus_init(psmouse, &intertouch_board,
1766 &pdata, sizeof(pdata), true,
1767 leave_breadcrumbs);
1768 }
1769
1770
1771
1772
1773
1774 static int synaptics_setup_intertouch(struct psmouse *psmouse,
1775 struct synaptics_device_info *info,
1776 bool leave_breadcrumbs)
1777 {
1778 int error;
1779
1780 if (synaptics_intertouch == SYNAPTICS_INTERTOUCH_OFF)
1781 return -ENXIO;
1782
1783 if (synaptics_intertouch == SYNAPTICS_INTERTOUCH_NOT_SET) {
1784 if (!psmouse_matches_pnp_id(psmouse, topbuttonpad_pnp_ids) &&
1785 !psmouse_matches_pnp_id(psmouse, smbus_pnp_ids)) {
1786
1787 if (!psmouse_matches_pnp_id(psmouse, forcepad_pnp_ids))
1788 psmouse_info(psmouse,
1789 "Your touchpad (%s) says it can support a different bus. "
1790 "If i2c-hid and hid-rmi are not used, you might want to try setting psmouse.synaptics_intertouch to 1 and report this to linux-input@vger.kernel.org.\n",
1791 psmouse->ps2dev.serio->firmware_id);
1792
1793 return -ENXIO;
1794 }
1795 }
1796
1797 psmouse_info(psmouse, "Trying to set up SMBus access\n");
1798
1799 error = synaptics_create_intertouch(psmouse, info, leave_breadcrumbs);
1800 if (error) {
1801 if (error == -EAGAIN)
1802 psmouse_info(psmouse, "SMbus companion is not ready yet\n");
1803 else
1804 psmouse_err(psmouse, "unable to create intertouch device\n");
1805
1806 return error;
1807 }
1808
1809 return 0;
1810 }
1811
1812 int synaptics_init_smbus(struct psmouse *psmouse)
1813 {
1814 struct synaptics_device_info info;
1815 int error;
1816
1817 psmouse_reset(psmouse);
1818
1819 error = synaptics_query_hardware(psmouse, &info);
1820 if (error) {
1821 psmouse_err(psmouse, "Unable to query device: %d\n", error);
1822 return error;
1823 }
1824
1825 if (!SYN_CAP_INTERTOUCH(info.ext_cap_0c))
1826 return -ENXIO;
1827
1828 return synaptics_create_intertouch(psmouse, &info, false);
1829 }
1830
1831 #else
1832
1833 static int __maybe_unused
1834 synaptics_setup_intertouch(struct psmouse *psmouse,
1835 struct synaptics_device_info *info,
1836 bool leave_breadcrumbs)
1837 {
1838 return -ENOSYS;
1839 }
1840
1841 int synaptics_init_smbus(struct psmouse *psmouse)
1842 {
1843 return -ENOSYS;
1844 }
1845
1846 #endif
1847
1848 #if defined(CONFIG_MOUSE_PS2_SYNAPTICS) || \
1849 defined(CONFIG_MOUSE_PS2_SYNAPTICS_SMBUS)
1850
1851 int synaptics_init(struct psmouse *psmouse)
1852 {
1853 struct synaptics_device_info info;
1854 int error;
1855 int retval;
1856
1857 psmouse_reset(psmouse);
1858
1859 error = synaptics_query_hardware(psmouse, &info);
1860 if (error) {
1861 psmouse_err(psmouse, "Unable to query device: %d\n", error);
1862 return error;
1863 }
1864
1865 if (SYN_CAP_INTERTOUCH(info.ext_cap_0c)) {
1866 if ((!IS_ENABLED(CONFIG_RMI4_SMB) ||
1867 !IS_ENABLED(CONFIG_MOUSE_PS2_SYNAPTICS_SMBUS)) &&
1868
1869 !psmouse_matches_pnp_id(psmouse, forcepad_pnp_ids)) {
1870 psmouse_warn(psmouse,
1871 "The touchpad can support a better bus than the too old PS/2 protocol. "
1872 "Make sure MOUSE_PS2_SYNAPTICS_SMBUS and RMI4_SMB are enabled to get a better touchpad experience.\n");
1873 }
1874
1875 error = synaptics_setup_intertouch(psmouse, &info, true);
1876 if (!error)
1877 return PSMOUSE_SYNAPTICS_SMBUS;
1878 }
1879
1880 retval = synaptics_setup_ps2(psmouse, &info);
1881 if (retval < 0) {
1882
1883
1884
1885
1886 psmouse_smbus_cleanup(psmouse);
1887 }
1888
1889 return retval;
1890 }
1891
1892 #else
1893
1894 int synaptics_init(struct psmouse *psmouse)
1895 {
1896 return -ENOSYS;
1897 }
1898
1899 #endif