1
2
3
4
5
6
7
8
9
10
11
12
13#include <linux/delay.h>
14#include <linux/dmi.h>
15#include <linux/slab.h>
16#include <linux/module.h>
17#include <linux/input.h>
18#include <linux/input/mt.h>
19#include <linux/serio.h>
20#include <linux/libps2.h>
21#include <asm/unaligned.h>
22#include "psmouse.h"
23#include "elantech.h"
24
25#define elantech_debug(fmt, ...) \
26 do { \
27 if (etd->debug) \
28 psmouse_printk(KERN_DEBUG, psmouse, \
29 fmt, ##__VA_ARGS__); \
30 } while (0)
31
32
33
34
35static int synaptics_send_cmd(struct psmouse *psmouse, unsigned char c,
36 unsigned char *param)
37{
38 if (psmouse_sliced_command(psmouse, c) ||
39 ps2_command(&psmouse->ps2dev, param, PSMOUSE_CMD_GETINFO)) {
40 psmouse_err(psmouse, "%s query 0x%02x failed.\n", __func__, c);
41 return -1;
42 }
43
44 return 0;
45}
46
47
48
49
50static int elantech_send_cmd(struct psmouse *psmouse, unsigned char c,
51 unsigned char *param)
52{
53 struct ps2dev *ps2dev = &psmouse->ps2dev;
54
55 if (ps2_command(ps2dev, NULL, ETP_PS2_CUSTOM_COMMAND) ||
56 ps2_command(ps2dev, NULL, c) ||
57 ps2_command(ps2dev, param, PSMOUSE_CMD_GETINFO)) {
58 psmouse_err(psmouse, "%s query 0x%02x failed.\n", __func__, c);
59 return -1;
60 }
61
62 return 0;
63}
64
65
66
67
68static int elantech_ps2_command(struct psmouse *psmouse,
69 unsigned char *param, int command)
70{
71 struct ps2dev *ps2dev = &psmouse->ps2dev;
72 struct elantech_data *etd = psmouse->private;
73 int rc;
74 int tries = ETP_PS2_COMMAND_TRIES;
75
76 do {
77 rc = ps2_command(ps2dev, param, command);
78 if (rc == 0)
79 break;
80 tries--;
81 elantech_debug("retrying ps2 command 0x%02x (%d).\n",
82 command, tries);
83 msleep(ETP_PS2_COMMAND_DELAY);
84 } while (tries > 0);
85
86 if (rc)
87 psmouse_err(psmouse, "ps2 command 0x%02x failed.\n", command);
88
89 return rc;
90}
91
92
93
94
95static int elantech_read_reg(struct psmouse *psmouse, unsigned char reg,
96 unsigned char *val)
97{
98 struct elantech_data *etd = psmouse->private;
99 unsigned char param[3];
100 int rc = 0;
101
102 if (reg < 0x07 || reg > 0x26)
103 return -1;
104
105 if (reg > 0x11 && reg < 0x20)
106 return -1;
107
108 switch (etd->hw_version) {
109 case 1:
110 if (psmouse_sliced_command(psmouse, ETP_REGISTER_READ) ||
111 psmouse_sliced_command(psmouse, reg) ||
112 ps2_command(&psmouse->ps2dev, param, PSMOUSE_CMD_GETINFO)) {
113 rc = -1;
114 }
115 break;
116
117 case 2:
118 if (elantech_ps2_command(psmouse, NULL, ETP_PS2_CUSTOM_COMMAND) ||
119 elantech_ps2_command(psmouse, NULL, ETP_REGISTER_READ) ||
120 elantech_ps2_command(psmouse, NULL, ETP_PS2_CUSTOM_COMMAND) ||
121 elantech_ps2_command(psmouse, NULL, reg) ||
122 elantech_ps2_command(psmouse, param, PSMOUSE_CMD_GETINFO)) {
123 rc = -1;
124 }
125 break;
126
127 case 3 ... 4:
128 if (elantech_ps2_command(psmouse, NULL, ETP_PS2_CUSTOM_COMMAND) ||
129 elantech_ps2_command(psmouse, NULL, ETP_REGISTER_READWRITE) ||
130 elantech_ps2_command(psmouse, NULL, ETP_PS2_CUSTOM_COMMAND) ||
131 elantech_ps2_command(psmouse, NULL, reg) ||
132 elantech_ps2_command(psmouse, param, PSMOUSE_CMD_GETINFO)) {
133 rc = -1;
134 }
135 break;
136 }
137
138 if (rc)
139 psmouse_err(psmouse, "failed to read register 0x%02x.\n", reg);
140 else if (etd->hw_version != 4)
141 *val = param[0];
142 else
143 *val = param[1];
144
145 return rc;
146}
147
148
149
150
151static int elantech_write_reg(struct psmouse *psmouse, unsigned char reg,
152 unsigned char val)
153{
154 struct elantech_data *etd = psmouse->private;
155 int rc = 0;
156
157 if (reg < 0x07 || reg > 0x26)
158 return -1;
159
160 if (reg > 0x11 && reg < 0x20)
161 return -1;
162
163 switch (etd->hw_version) {
164 case 1:
165 if (psmouse_sliced_command(psmouse, ETP_REGISTER_WRITE) ||
166 psmouse_sliced_command(psmouse, reg) ||
167 psmouse_sliced_command(psmouse, val) ||
168 ps2_command(&psmouse->ps2dev, NULL, PSMOUSE_CMD_SETSCALE11)) {
169 rc = -1;
170 }
171 break;
172
173 case 2:
174 if (elantech_ps2_command(psmouse, NULL, ETP_PS2_CUSTOM_COMMAND) ||
175 elantech_ps2_command(psmouse, NULL, ETP_REGISTER_WRITE) ||
176 elantech_ps2_command(psmouse, NULL, ETP_PS2_CUSTOM_COMMAND) ||
177 elantech_ps2_command(psmouse, NULL, reg) ||
178 elantech_ps2_command(psmouse, NULL, ETP_PS2_CUSTOM_COMMAND) ||
179 elantech_ps2_command(psmouse, NULL, val) ||
180 elantech_ps2_command(psmouse, NULL, PSMOUSE_CMD_SETSCALE11)) {
181 rc = -1;
182 }
183 break;
184
185 case 3:
186 if (elantech_ps2_command(psmouse, NULL, ETP_PS2_CUSTOM_COMMAND) ||
187 elantech_ps2_command(psmouse, NULL, ETP_REGISTER_READWRITE) ||
188 elantech_ps2_command(psmouse, NULL, ETP_PS2_CUSTOM_COMMAND) ||
189 elantech_ps2_command(psmouse, NULL, reg) ||
190 elantech_ps2_command(psmouse, NULL, ETP_PS2_CUSTOM_COMMAND) ||
191 elantech_ps2_command(psmouse, NULL, val) ||
192 elantech_ps2_command(psmouse, NULL, PSMOUSE_CMD_SETSCALE11)) {
193 rc = -1;
194 }
195 break;
196
197 case 4:
198 if (elantech_ps2_command(psmouse, NULL, ETP_PS2_CUSTOM_COMMAND) ||
199 elantech_ps2_command(psmouse, NULL, ETP_REGISTER_READWRITE) ||
200 elantech_ps2_command(psmouse, NULL, ETP_PS2_CUSTOM_COMMAND) ||
201 elantech_ps2_command(psmouse, NULL, reg) ||
202 elantech_ps2_command(psmouse, NULL, ETP_PS2_CUSTOM_COMMAND) ||
203 elantech_ps2_command(psmouse, NULL, ETP_REGISTER_READWRITE) ||
204 elantech_ps2_command(psmouse, NULL, ETP_PS2_CUSTOM_COMMAND) ||
205 elantech_ps2_command(psmouse, NULL, val) ||
206 elantech_ps2_command(psmouse, NULL, PSMOUSE_CMD_SETSCALE11)) {
207 rc = -1;
208 }
209 break;
210 }
211
212 if (rc)
213 psmouse_err(psmouse,
214 "failed to write register 0x%02x with value 0x%02x.\n",
215 reg, val);
216
217 return rc;
218}
219
220
221
222
223static void elantech_packet_dump(struct psmouse *psmouse)
224{
225 psmouse_printk(KERN_DEBUG, psmouse, "PS/2 packet [%*ph]\n",
226 psmouse->pktsize, psmouse->packet);
227}
228
229
230
231
232
233static void elantech_report_absolute_v1(struct psmouse *psmouse)
234{
235 struct input_dev *dev = psmouse->dev;
236 struct elantech_data *etd = psmouse->private;
237 unsigned char *packet = psmouse->packet;
238 int fingers;
239
240 if (etd->fw_version < 0x020000) {
241
242
243
244
245 fingers = ((packet[1] & 0x80) >> 7) +
246 ((packet[1] & 0x30) >> 4);
247 } else {
248
249
250
251
252 fingers = (packet[0] & 0xc0) >> 6;
253 }
254
255 if (etd->jumpy_cursor) {
256 if (fingers != 1) {
257 etd->single_finger_reports = 0;
258 } else if (etd->single_finger_reports < 2) {
259
260 etd->single_finger_reports++;
261 elantech_debug("discarding packet\n");
262 return;
263 }
264 }
265
266 input_report_key(dev, BTN_TOUCH, fingers != 0);
267
268
269
270
271
272 if (fingers) {
273 input_report_abs(dev, ABS_X,
274 ((packet[1] & 0x0c) << 6) | packet[2]);
275 input_report_abs(dev, ABS_Y,
276 etd->y_max - (((packet[1] & 0x03) << 8) | packet[3]));
277 }
278
279 input_report_key(dev, BTN_TOOL_FINGER, fingers == 1);
280 input_report_key(dev, BTN_TOOL_DOUBLETAP, fingers == 2);
281 input_report_key(dev, BTN_TOOL_TRIPLETAP, fingers == 3);
282 input_report_key(dev, BTN_LEFT, packet[0] & 0x01);
283 input_report_key(dev, BTN_RIGHT, packet[0] & 0x02);
284
285 if (etd->fw_version < 0x020000 &&
286 (etd->capabilities[0] & ETP_CAP_HAS_ROCKER)) {
287
288 input_report_key(dev, BTN_FORWARD, packet[0] & 0x40);
289
290 input_report_key(dev, BTN_BACK, packet[0] & 0x80);
291 }
292
293 input_sync(dev);
294}
295
296static void elantech_set_slot(struct input_dev *dev, int slot, bool active,
297 unsigned int x, unsigned int y)
298{
299 input_mt_slot(dev, slot);
300 input_mt_report_slot_state(dev, MT_TOOL_FINGER, active);
301 if (active) {
302 input_report_abs(dev, ABS_MT_POSITION_X, x);
303 input_report_abs(dev, ABS_MT_POSITION_Y, y);
304 }
305}
306
307
308static void elantech_report_semi_mt_data(struct input_dev *dev,
309 unsigned int num_fingers,
310 unsigned int x1, unsigned int y1,
311 unsigned int x2, unsigned int y2)
312{
313 elantech_set_slot(dev, 0, num_fingers != 0, x1, y1);
314 elantech_set_slot(dev, 1, num_fingers >= 2, x2, y2);
315}
316
317
318
319
320
321static void elantech_report_absolute_v2(struct psmouse *psmouse)
322{
323 struct elantech_data *etd = psmouse->private;
324 struct input_dev *dev = psmouse->dev;
325 unsigned char *packet = psmouse->packet;
326 unsigned int fingers, x1 = 0, y1 = 0, x2 = 0, y2 = 0;
327 unsigned int width = 0, pres = 0;
328
329
330 fingers = (packet[0] & 0xc0) >> 6;
331
332 switch (fingers) {
333 case 3:
334
335
336
337
338 if (packet[3] & 0x80)
339 fingers = 4;
340
341 case 1:
342
343
344
345
346 x1 = ((packet[1] & 0x0f) << 8) | packet[2];
347
348
349
350
351 y1 = etd->y_max - (((packet[4] & 0x0f) << 8) | packet[5]);
352
353 pres = (packet[1] & 0xf0) | ((packet[4] & 0xf0) >> 4);
354 width = ((packet[0] & 0x30) >> 2) | ((packet[3] & 0x30) >> 4);
355 break;
356
357 case 2:
358
359
360
361
362
363
364 x1 = (((packet[0] & 0x10) << 4) | packet[1]) << 2;
365
366 y1 = etd->y_max -
367 ((((packet[0] & 0x20) << 3) | packet[2]) << 2);
368
369
370
371
372 x2 = (((packet[3] & 0x10) << 4) | packet[4]) << 2;
373
374 y2 = etd->y_max -
375 ((((packet[3] & 0x20) << 3) | packet[5]) << 2);
376
377
378 pres = 127;
379 width = 7;
380 break;
381 }
382
383 input_report_key(dev, BTN_TOUCH, fingers != 0);
384 if (fingers != 0) {
385 input_report_abs(dev, ABS_X, x1);
386 input_report_abs(dev, ABS_Y, y1);
387 }
388 elantech_report_semi_mt_data(dev, fingers, x1, y1, x2, y2);
389 input_report_key(dev, BTN_TOOL_FINGER, fingers == 1);
390 input_report_key(dev, BTN_TOOL_DOUBLETAP, fingers == 2);
391 input_report_key(dev, BTN_TOOL_TRIPLETAP, fingers == 3);
392 input_report_key(dev, BTN_TOOL_QUADTAP, fingers == 4);
393 input_report_key(dev, BTN_LEFT, packet[0] & 0x01);
394 input_report_key(dev, BTN_RIGHT, packet[0] & 0x02);
395 if (etd->reports_pressure) {
396 input_report_abs(dev, ABS_PRESSURE, pres);
397 input_report_abs(dev, ABS_TOOL_WIDTH, width);
398 }
399
400 input_sync(dev);
401}
402
403static void elantech_report_trackpoint(struct psmouse *psmouse,
404 int packet_type)
405{
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421 struct elantech_data *etd = psmouse->private;
422 struct input_dev *tp_dev = etd->tp_dev;
423 unsigned char *packet = psmouse->packet;
424 int x, y;
425 u32 t;
426
427 t = get_unaligned_le32(&packet[0]);
428
429 switch (t & ~7U) {
430 case 0x06000030U:
431 case 0x16008020U:
432 case 0x26800010U:
433 case 0x36808000U:
434 x = packet[4] - (int)((packet[1]^0x80) << 1);
435 y = (int)((packet[2]^0x80) << 1) - packet[5];
436
437 input_report_key(tp_dev, BTN_LEFT, packet[0] & 0x01);
438 input_report_key(tp_dev, BTN_RIGHT, packet[0] & 0x02);
439 input_report_key(tp_dev, BTN_MIDDLE, packet[0] & 0x04);
440
441 input_report_rel(tp_dev, REL_X, x);
442 input_report_rel(tp_dev, REL_Y, y);
443
444 input_sync(tp_dev);
445
446 break;
447
448 default:
449
450 if (etd->debug == 1)
451 elantech_packet_dump(psmouse);
452
453 break;
454 }
455}
456
457
458
459
460
461static void elantech_report_absolute_v3(struct psmouse *psmouse,
462 int packet_type)
463{
464 struct input_dev *dev = psmouse->dev;
465 struct elantech_data *etd = psmouse->private;
466 unsigned char *packet = psmouse->packet;
467 unsigned int fingers = 0, x1 = 0, y1 = 0, x2 = 0, y2 = 0;
468 unsigned int width = 0, pres = 0;
469
470
471 fingers = (packet[0] & 0xc0) >> 6;
472
473 switch (fingers) {
474 case 3:
475 case 1:
476
477
478
479
480 x1 = ((packet[1] & 0x0f) << 8) | packet[2];
481
482
483
484
485 y1 = etd->y_max - (((packet[4] & 0x0f) << 8) | packet[5]);
486 break;
487
488 case 2:
489 if (packet_type == PACKET_V3_HEAD) {
490
491
492
493
494 etd->mt[0].x = ((packet[1] & 0x0f) << 8) | packet[2];
495
496
497
498
499 etd->mt[0].y = etd->y_max -
500 (((packet[4] & 0x0f) << 8) | packet[5]);
501
502
503
504 return;
505 }
506
507
508 x1 = etd->mt[0].x;
509 y1 = etd->mt[0].y;
510 x2 = ((packet[1] & 0x0f) << 8) | packet[2];
511 y2 = etd->y_max - (((packet[4] & 0x0f) << 8) | packet[5]);
512 break;
513 }
514
515 pres = (packet[1] & 0xf0) | ((packet[4] & 0xf0) >> 4);
516 width = ((packet[0] & 0x30) >> 2) | ((packet[3] & 0x30) >> 4);
517
518 input_report_key(dev, BTN_TOUCH, fingers != 0);
519 if (fingers != 0) {
520 input_report_abs(dev, ABS_X, x1);
521 input_report_abs(dev, ABS_Y, y1);
522 }
523 elantech_report_semi_mt_data(dev, fingers, x1, y1, x2, y2);
524 input_report_key(dev, BTN_TOOL_FINGER, fingers == 1);
525 input_report_key(dev, BTN_TOOL_DOUBLETAP, fingers == 2);
526 input_report_key(dev, BTN_TOOL_TRIPLETAP, fingers == 3);
527
528
529 if (etd->fw_version & 0x001000) {
530 input_report_key(dev, BTN_LEFT, packet[0] & 0x03);
531 } else {
532 input_report_key(dev, BTN_LEFT, packet[0] & 0x01);
533 input_report_key(dev, BTN_RIGHT, packet[0] & 0x02);
534 }
535
536 input_report_abs(dev, ABS_PRESSURE, pres);
537 input_report_abs(dev, ABS_TOOL_WIDTH, width);
538
539 input_sync(dev);
540}
541
542static void elantech_input_sync_v4(struct psmouse *psmouse)
543{
544 struct input_dev *dev = psmouse->dev;
545 struct elantech_data *etd = psmouse->private;
546 unsigned char *packet = psmouse->packet;
547
548
549 if (etd->fw_version & 0x001000) {
550 input_report_key(dev, BTN_LEFT, packet[0] & 0x03);
551 } else {
552 input_report_key(dev, BTN_LEFT, packet[0] & 0x01);
553 input_report_key(dev, BTN_RIGHT, packet[0] & 0x02);
554 input_report_key(dev, BTN_MIDDLE, packet[0] & 0x04);
555 }
556
557 input_mt_report_pointer_emulation(dev, true);
558 input_sync(dev);
559}
560
561static void process_packet_status_v4(struct psmouse *psmouse)
562{
563 struct input_dev *dev = psmouse->dev;
564 unsigned char *packet = psmouse->packet;
565 unsigned fingers;
566 int i;
567
568
569 fingers = packet[1] & 0x1f;
570 for (i = 0; i < ETP_MAX_FINGERS; i++) {
571 if ((fingers & (1 << i)) == 0) {
572 input_mt_slot(dev, i);
573 input_mt_report_slot_state(dev, MT_TOOL_FINGER, false);
574 }
575 }
576
577 elantech_input_sync_v4(psmouse);
578}
579
580static void process_packet_head_v4(struct psmouse *psmouse)
581{
582 struct input_dev *dev = psmouse->dev;
583 struct elantech_data *etd = psmouse->private;
584 unsigned char *packet = psmouse->packet;
585 int id = ((packet[3] & 0xe0) >> 5) - 1;
586 int pres, traces;
587
588 if (id < 0)
589 return;
590
591 etd->mt[id].x = ((packet[1] & 0x0f) << 8) | packet[2];
592 etd->mt[id].y = etd->y_max - (((packet[4] & 0x0f) << 8) | packet[5]);
593 pres = (packet[1] & 0xf0) | ((packet[4] & 0xf0) >> 4);
594 traces = (packet[0] & 0xf0) >> 4;
595
596 input_mt_slot(dev, id);
597 input_mt_report_slot_state(dev, MT_TOOL_FINGER, true);
598
599 input_report_abs(dev, ABS_MT_POSITION_X, etd->mt[id].x);
600 input_report_abs(dev, ABS_MT_POSITION_Y, etd->mt[id].y);
601 input_report_abs(dev, ABS_MT_PRESSURE, pres);
602 input_report_abs(dev, ABS_MT_TOUCH_MAJOR, traces * etd->width);
603
604 input_report_abs(dev, ABS_TOOL_WIDTH, traces);
605
606 elantech_input_sync_v4(psmouse);
607}
608
609static void process_packet_motion_v4(struct psmouse *psmouse)
610{
611 struct input_dev *dev = psmouse->dev;
612 struct elantech_data *etd = psmouse->private;
613 unsigned char *packet = psmouse->packet;
614 int weight, delta_x1 = 0, delta_y1 = 0, delta_x2 = 0, delta_y2 = 0;
615 int id, sid;
616
617 id = ((packet[0] & 0xe0) >> 5) - 1;
618 if (id < 0)
619 return;
620
621 sid = ((packet[3] & 0xe0) >> 5) - 1;
622 weight = (packet[0] & 0x10) ? ETP_WEIGHT_VALUE : 1;
623
624
625
626
627
628 delta_x1 = (signed char)packet[1];
629 delta_y1 = (signed char)packet[2];
630 delta_x2 = (signed char)packet[4];
631 delta_y2 = (signed char)packet[5];
632
633 etd->mt[id].x += delta_x1 * weight;
634 etd->mt[id].y -= delta_y1 * weight;
635 input_mt_slot(dev, id);
636 input_report_abs(dev, ABS_MT_POSITION_X, etd->mt[id].x);
637 input_report_abs(dev, ABS_MT_POSITION_Y, etd->mt[id].y);
638
639 if (sid >= 0) {
640 etd->mt[sid].x += delta_x2 * weight;
641 etd->mt[sid].y -= delta_y2 * weight;
642 input_mt_slot(dev, sid);
643 input_report_abs(dev, ABS_MT_POSITION_X, etd->mt[sid].x);
644 input_report_abs(dev, ABS_MT_POSITION_Y, etd->mt[sid].y);
645 }
646
647 elantech_input_sync_v4(psmouse);
648}
649
650static void elantech_report_absolute_v4(struct psmouse *psmouse,
651 int packet_type)
652{
653 switch (packet_type) {
654 case PACKET_V4_STATUS:
655 process_packet_status_v4(psmouse);
656 break;
657
658 case PACKET_V4_HEAD:
659 process_packet_head_v4(psmouse);
660 break;
661
662 case PACKET_V4_MOTION:
663 process_packet_motion_v4(psmouse);
664 break;
665
666 case PACKET_UNKNOWN:
667 default:
668
669 break;
670 }
671}
672
673static int elantech_packet_check_v1(struct psmouse *psmouse)
674{
675 struct elantech_data *etd = psmouse->private;
676 unsigned char *packet = psmouse->packet;
677 unsigned char p1, p2, p3;
678
679
680 if (etd->fw_version < 0x020000) {
681
682 p1 = (packet[0] & 0x20) >> 5;
683 p2 = (packet[0] & 0x10) >> 4;
684 } else {
685
686 p1 = (packet[0] & 0x10) >> 4;
687 p2 = (packet[0] & 0x20) >> 5;
688 }
689
690 p3 = (packet[0] & 0x04) >> 2;
691
692 return etd->parity[packet[1]] == p1 &&
693 etd->parity[packet[2]] == p2 &&
694 etd->parity[packet[3]] == p3;
695}
696
697static int elantech_debounce_check_v2(struct psmouse *psmouse)
698{
699
700
701
702
703 const u8 debounce_packet[] = { 0x84, 0xff, 0xff, 0x02, 0xff, 0xff };
704 unsigned char *packet = psmouse->packet;
705
706 return !memcmp(packet, debounce_packet, sizeof(debounce_packet));
707}
708
709static int elantech_packet_check_v2(struct psmouse *psmouse)
710{
711 struct elantech_data *etd = psmouse->private;
712 unsigned char *packet = psmouse->packet;
713
714
715
716
717
718
719
720
721
722
723 if (etd->reports_pressure)
724 return (packet[0] & 0x0c) == 0x04 &&
725 (packet[3] & 0x0f) == 0x02;
726
727 if ((packet[0] & 0xc0) == 0x80)
728 return (packet[0] & 0x0c) == 0x0c &&
729 (packet[3] & 0x0e) == 0x08;
730
731 return (packet[0] & 0x3c) == 0x3c &&
732 (packet[1] & 0xf0) == 0x00 &&
733 (packet[3] & 0x3e) == 0x38 &&
734 (packet[4] & 0xf0) == 0x00;
735}
736
737
738
739
740
741static int elantech_packet_check_v3(struct psmouse *psmouse)
742{
743 struct elantech_data *etd = psmouse->private;
744 const u8 debounce_packet[] = { 0xc4, 0xff, 0xff, 0x02, 0xff, 0xff };
745 unsigned char *packet = psmouse->packet;
746
747
748
749
750
751 if (!memcmp(packet, debounce_packet, sizeof(debounce_packet)))
752 return PACKET_DEBOUNCE;
753
754
755
756
757
758 if (etd->crc_enabled) {
759 if ((packet[3] & 0x09) == 0x08)
760 return PACKET_V3_HEAD;
761
762 if ((packet[3] & 0x09) == 0x09)
763 return PACKET_V3_TAIL;
764 } else {
765 if ((packet[0] & 0x0c) == 0x04 && (packet[3] & 0xcf) == 0x02)
766 return PACKET_V3_HEAD;
767
768 if ((packet[0] & 0x0c) == 0x0c && (packet[3] & 0xce) == 0x0c)
769 return PACKET_V3_TAIL;
770 if ((packet[3] & 0x0f) == 0x06)
771 return PACKET_TRACKPOINT;
772 }
773
774 return PACKET_UNKNOWN;
775}
776
777static int elantech_packet_check_v4(struct psmouse *psmouse)
778{
779 struct elantech_data *etd = psmouse->private;
780 unsigned char *packet = psmouse->packet;
781 unsigned char packet_type = packet[3] & 0x03;
782 unsigned int ic_version;
783 bool sanity_check;
784
785 if (etd->tp_dev && (packet[3] & 0x0f) == 0x06)
786 return PACKET_TRACKPOINT;
787
788
789 ic_version = (etd->fw_version & 0x0f0000) >> 16;
790
791
792
793
794
795
796
797
798 if (etd->crc_enabled)
799 sanity_check = ((packet[3] & 0x08) == 0x00);
800 else if (ic_version == 7 && etd->samples[1] == 0x2A)
801 sanity_check = ((packet[3] & 0x1c) == 0x10);
802 else
803 sanity_check = ((packet[0] & 0x0c) == 0x04 &&
804 (packet[3] & 0x1c) == 0x10);
805
806 if (!sanity_check)
807 return PACKET_UNKNOWN;
808
809 switch (packet_type) {
810 case 0:
811 return PACKET_V4_STATUS;
812
813 case 1:
814 return PACKET_V4_HEAD;
815
816 case 2:
817 return PACKET_V4_MOTION;
818 }
819
820 return PACKET_UNKNOWN;
821}
822
823
824
825
826static psmouse_ret_t elantech_process_byte(struct psmouse *psmouse)
827{
828 struct elantech_data *etd = psmouse->private;
829 int packet_type;
830
831 if (psmouse->pktcnt < psmouse->pktsize)
832 return PSMOUSE_GOOD_DATA;
833
834 if (etd->debug > 1)
835 elantech_packet_dump(psmouse);
836
837 switch (etd->hw_version) {
838 case 1:
839 if (etd->paritycheck && !elantech_packet_check_v1(psmouse))
840 return PSMOUSE_BAD_DATA;
841
842 elantech_report_absolute_v1(psmouse);
843 break;
844
845 case 2:
846
847 if (elantech_debounce_check_v2(psmouse))
848 return PSMOUSE_FULL_PACKET;
849
850 if (etd->paritycheck && !elantech_packet_check_v2(psmouse))
851 return PSMOUSE_BAD_DATA;
852
853 elantech_report_absolute_v2(psmouse);
854 break;
855
856 case 3:
857 packet_type = elantech_packet_check_v3(psmouse);
858 switch (packet_type) {
859 case PACKET_UNKNOWN:
860 return PSMOUSE_BAD_DATA;
861
862 case PACKET_DEBOUNCE:
863
864 break;
865
866 case PACKET_TRACKPOINT:
867 elantech_report_trackpoint(psmouse, packet_type);
868 break;
869
870 default:
871 elantech_report_absolute_v3(psmouse, packet_type);
872 break;
873 }
874
875 break;
876
877 case 4:
878 packet_type = elantech_packet_check_v4(psmouse);
879 switch (packet_type) {
880 case PACKET_UNKNOWN:
881 return PSMOUSE_BAD_DATA;
882
883 case PACKET_TRACKPOINT:
884 elantech_report_trackpoint(psmouse, packet_type);
885 break;
886
887 default:
888 elantech_report_absolute_v4(psmouse, packet_type);
889 break;
890 }
891
892 break;
893 }
894
895 return PSMOUSE_FULL_PACKET;
896}
897
898
899
900
901
902
903static void elantech_set_rate_restore_reg_07(struct psmouse *psmouse,
904 unsigned int rate)
905{
906 struct elantech_data *etd = psmouse->private;
907
908 etd->original_set_rate(psmouse, rate);
909 if (elantech_write_reg(psmouse, 0x07, etd->reg_07))
910 psmouse_err(psmouse, "restoring reg_07 failed\n");
911}
912
913
914
915
916static int elantech_set_absolute_mode(struct psmouse *psmouse)
917{
918 struct elantech_data *etd = psmouse->private;
919 unsigned char val;
920 int tries = ETP_READ_BACK_TRIES;
921 int rc = 0;
922
923 switch (etd->hw_version) {
924 case 1:
925 etd->reg_10 = 0x16;
926 etd->reg_11 = 0x8f;
927 if (elantech_write_reg(psmouse, 0x10, etd->reg_10) ||
928 elantech_write_reg(psmouse, 0x11, etd->reg_11)) {
929 rc = -1;
930 }
931 break;
932
933 case 2:
934
935 etd->reg_10 = 0x54;
936 etd->reg_11 = 0x88;
937 etd->reg_21 = 0x60;
938 if (elantech_write_reg(psmouse, 0x10, etd->reg_10) ||
939 elantech_write_reg(psmouse, 0x11, etd->reg_11) ||
940 elantech_write_reg(psmouse, 0x21, etd->reg_21)) {
941 rc = -1;
942 }
943 break;
944
945 case 3:
946 if (etd->set_hw_resolution)
947 etd->reg_10 = 0x0b;
948 else
949 etd->reg_10 = 0x01;
950
951 if (elantech_write_reg(psmouse, 0x10, etd->reg_10))
952 rc = -1;
953
954 break;
955
956 case 4:
957 etd->reg_07 = 0x01;
958 if (elantech_write_reg(psmouse, 0x07, etd->reg_07))
959 rc = -1;
960
961 goto skip_readback_reg_10;
962 }
963
964 if (rc == 0) {
965
966
967
968
969
970
971 do {
972 rc = elantech_read_reg(psmouse, 0x10, &val);
973 if (rc == 0)
974 break;
975 tries--;
976 elantech_debug("retrying read (%d).\n", tries);
977 msleep(ETP_READ_BACK_DELAY);
978 } while (tries > 0);
979
980 if (rc) {
981 psmouse_err(psmouse,
982 "failed to read back register 0x10.\n");
983 } else if (etd->hw_version == 1 &&
984 !(val & ETP_R10_ABSOLUTE_MODE)) {
985 psmouse_err(psmouse,
986 "touchpad refuses to switch to absolute mode.\n");
987 rc = -1;
988 }
989 }
990
991 skip_readback_reg_10:
992 if (rc)
993 psmouse_err(psmouse, "failed to initialise registers.\n");
994
995 return rc;
996}
997
998static int elantech_set_range(struct psmouse *psmouse,
999 unsigned int *x_min, unsigned int *y_min,
1000 unsigned int *x_max, unsigned int *y_max,
1001 unsigned int *width)
1002{
1003 struct elantech_data *etd = psmouse->private;
1004 unsigned char param[3];
1005 unsigned char traces;
1006
1007 switch (etd->hw_version) {
1008 case 1:
1009 *x_min = ETP_XMIN_V1;
1010 *y_min = ETP_YMIN_V1;
1011 *x_max = ETP_XMAX_V1;
1012 *y_max = ETP_YMAX_V1;
1013 break;
1014
1015 case 2:
1016 if (etd->fw_version == 0x020800 ||
1017 etd->fw_version == 0x020b00 ||
1018 etd->fw_version == 0x020030) {
1019 *x_min = ETP_XMIN_V2;
1020 *y_min = ETP_YMIN_V2;
1021 *x_max = ETP_XMAX_V2;
1022 *y_max = ETP_YMAX_V2;
1023 } else {
1024 int i;
1025 int fixed_dpi;
1026
1027 i = (etd->fw_version > 0x020800 &&
1028 etd->fw_version < 0x020900) ? 1 : 2;
1029
1030 if (etd->send_cmd(psmouse, ETP_FW_ID_QUERY, param))
1031 return -1;
1032
1033 fixed_dpi = param[1] & 0x10;
1034
1035 if (((etd->fw_version >> 16) == 0x14) && fixed_dpi) {
1036 if (etd->send_cmd(psmouse, ETP_SAMPLE_QUERY, param))
1037 return -1;
1038
1039 *x_max = (etd->capabilities[1] - i) * param[1] / 2;
1040 *y_max = (etd->capabilities[2] - i) * param[2] / 2;
1041 } else if (etd->fw_version == 0x040216) {
1042 *x_max = 819;
1043 *y_max = 405;
1044 } else if (etd->fw_version == 0x040219 || etd->fw_version == 0x040215) {
1045 *x_max = 900;
1046 *y_max = 500;
1047 } else {
1048 *x_max = (etd->capabilities[1] - i) * 64;
1049 *y_max = (etd->capabilities[2] - i) * 64;
1050 }
1051 }
1052 break;
1053
1054 case 3:
1055 if (etd->send_cmd(psmouse, ETP_FW_ID_QUERY, param))
1056 return -1;
1057
1058 *x_max = (0x0f & param[0]) << 8 | param[1];
1059 *y_max = (0xf0 & param[0]) << 4 | param[2];
1060 break;
1061
1062 case 4:
1063 if (etd->send_cmd(psmouse, ETP_FW_ID_QUERY, param))
1064 return -1;
1065
1066 *x_max = (0x0f & param[0]) << 8 | param[1];
1067 *y_max = (0xf0 & param[0]) << 4 | param[2];
1068 traces = etd->capabilities[1];
1069 if ((traces < 2) || (traces > *x_max))
1070 return -1;
1071
1072 *width = *x_max / (traces - 1);
1073 break;
1074 }
1075
1076 return 0;
1077}
1078
1079
1080
1081
1082
1083static unsigned int elantech_convert_res(unsigned int val)
1084{
1085 return (val * 10 + 790) * 10 / 254;
1086}
1087
1088static int elantech_get_resolution_v4(struct psmouse *psmouse,
1089 unsigned int *x_res,
1090 unsigned int *y_res)
1091{
1092 unsigned char param[3];
1093
1094 if (elantech_send_cmd(psmouse, ETP_RESOLUTION_QUERY, param))
1095 return -1;
1096
1097 *x_res = elantech_convert_res(param[1] & 0x0f);
1098 *y_res = elantech_convert_res((param[1] & 0xf0) >> 4);
1099
1100 return 0;
1101}
1102
1103
1104
1105
1106
1107
1108
1109
1110
1111
1112
1113
1114
1115
1116
1117
1118
1119
1120
1121
1122
1123
1124
1125
1126
1127
1128
1129
1130
1131
1132
1133
1134
1135
1136
1137
1138
1139static void elantech_set_buttonpad_prop(struct psmouse *psmouse)
1140{
1141 struct input_dev *dev = psmouse->dev;
1142 struct elantech_data *etd = psmouse->private;
1143
1144 if (etd->fw_version & 0x001000) {
1145 __set_bit(INPUT_PROP_BUTTONPAD, dev->propbit);
1146 __clear_bit(BTN_RIGHT, dev->keybit);
1147 }
1148}
1149
1150
1151
1152
1153static const struct dmi_system_id elantech_dmi_has_middle_button[] = {
1154#if defined(CONFIG_DMI) && defined(CONFIG_X86)
1155 {
1156
1157 .matches = {
1158 DMI_MATCH(DMI_SYS_VENDOR, "FUJITSU"),
1159 DMI_MATCH(DMI_PRODUCT_NAME, "CELSIUS H730"),
1160 },
1161 },
1162 {
1163
1164 .matches = {
1165 DMI_MATCH(DMI_SYS_VENDOR, "FUJITSU"),
1166 DMI_MATCH(DMI_PRODUCT_NAME, "CELSIUS H760"),
1167 },
1168 },
1169#endif
1170 { }
1171};
1172
1173
1174
1175
1176static int elantech_set_input_params(struct psmouse *psmouse)
1177{
1178 struct input_dev *dev = psmouse->dev;
1179 struct elantech_data *etd = psmouse->private;
1180 unsigned int x_min = 0, y_min = 0, x_max = 0, y_max = 0, width = 0;
1181 unsigned int x_res = 31, y_res = 31;
1182
1183 if (elantech_set_range(psmouse, &x_min, &y_min, &x_max, &y_max, &width))
1184 return -1;
1185
1186 __set_bit(INPUT_PROP_POINTER, dev->propbit);
1187 __set_bit(EV_KEY, dev->evbit);
1188 __set_bit(EV_ABS, dev->evbit);
1189 __clear_bit(EV_REL, dev->evbit);
1190
1191 __set_bit(BTN_LEFT, dev->keybit);
1192 if (dmi_check_system(elantech_dmi_has_middle_button))
1193 __set_bit(BTN_MIDDLE, dev->keybit);
1194 __set_bit(BTN_RIGHT, dev->keybit);
1195
1196 __set_bit(BTN_TOUCH, dev->keybit);
1197 __set_bit(BTN_TOOL_FINGER, dev->keybit);
1198 __set_bit(BTN_TOOL_DOUBLETAP, dev->keybit);
1199 __set_bit(BTN_TOOL_TRIPLETAP, dev->keybit);
1200
1201 switch (etd->hw_version) {
1202 case 1:
1203
1204 if (etd->fw_version < 0x020000 &&
1205 (etd->capabilities[0] & ETP_CAP_HAS_ROCKER)) {
1206 __set_bit(BTN_FORWARD, dev->keybit);
1207 __set_bit(BTN_BACK, dev->keybit);
1208 }
1209 input_set_abs_params(dev, ABS_X, x_min, x_max, 0, 0);
1210 input_set_abs_params(dev, ABS_Y, y_min, y_max, 0, 0);
1211 break;
1212
1213 case 2:
1214 __set_bit(BTN_TOOL_QUADTAP, dev->keybit);
1215 __set_bit(INPUT_PROP_SEMI_MT, dev->propbit);
1216
1217 case 3:
1218 if (etd->hw_version == 3)
1219 elantech_set_buttonpad_prop(psmouse);
1220 input_set_abs_params(dev, ABS_X, x_min, x_max, 0, 0);
1221 input_set_abs_params(dev, ABS_Y, y_min, y_max, 0, 0);
1222 if (etd->reports_pressure) {
1223 input_set_abs_params(dev, ABS_PRESSURE, ETP_PMIN_V2,
1224 ETP_PMAX_V2, 0, 0);
1225 input_set_abs_params(dev, ABS_TOOL_WIDTH, ETP_WMIN_V2,
1226 ETP_WMAX_V2, 0, 0);
1227 }
1228 input_mt_init_slots(dev, 2, INPUT_MT_SEMI_MT);
1229 input_set_abs_params(dev, ABS_MT_POSITION_X, x_min, x_max, 0, 0);
1230 input_set_abs_params(dev, ABS_MT_POSITION_Y, y_min, y_max, 0, 0);
1231 break;
1232
1233 case 4:
1234 if (elantech_get_resolution_v4(psmouse, &x_res, &y_res)) {
1235
1236
1237
1238
1239 psmouse_warn(psmouse, "couldn't query resolution data.\n");
1240 }
1241 elantech_set_buttonpad_prop(psmouse);
1242 __set_bit(BTN_TOOL_QUADTAP, dev->keybit);
1243
1244 input_set_abs_params(dev, ABS_X, x_min, x_max, 0, 0);
1245 input_set_abs_params(dev, ABS_Y, y_min, y_max, 0, 0);
1246
1247
1248
1249
1250 input_set_abs_params(dev, ABS_PRESSURE, ETP_PMIN_V2,
1251 ETP_PMAX_V2, 0, 0);
1252 input_set_abs_params(dev, ABS_TOOL_WIDTH, ETP_WMIN_V2,
1253 ETP_WMAX_V2, 0, 0);
1254
1255 input_mt_init_slots(dev, ETP_MAX_FINGERS, 0);
1256 input_set_abs_params(dev, ABS_MT_POSITION_X, x_min, x_max, 0, 0);
1257 input_set_abs_params(dev, ABS_MT_POSITION_Y, y_min, y_max, 0, 0);
1258 input_set_abs_params(dev, ABS_MT_PRESSURE, ETP_PMIN_V2,
1259 ETP_PMAX_V2, 0, 0);
1260
1261
1262
1263
1264 input_set_abs_params(dev, ABS_MT_TOUCH_MAJOR, 0,
1265 ETP_WMAX_V2 * width, 0, 0);
1266 break;
1267 }
1268
1269 input_abs_set_res(dev, ABS_X, x_res);
1270 input_abs_set_res(dev, ABS_Y, y_res);
1271 if (etd->hw_version > 1) {
1272 input_abs_set_res(dev, ABS_MT_POSITION_X, x_res);
1273 input_abs_set_res(dev, ABS_MT_POSITION_Y, y_res);
1274 }
1275
1276 etd->y_max = y_max;
1277 etd->width = width;
1278
1279 return 0;
1280}
1281
1282struct elantech_attr_data {
1283 size_t field_offset;
1284 unsigned char reg;
1285};
1286
1287
1288
1289
1290static ssize_t elantech_show_int_attr(struct psmouse *psmouse, void *data,
1291 char *buf)
1292{
1293 struct elantech_data *etd = psmouse->private;
1294 struct elantech_attr_data *attr = data;
1295 unsigned char *reg = (unsigned char *) etd + attr->field_offset;
1296 int rc = 0;
1297
1298 if (attr->reg)
1299 rc = elantech_read_reg(psmouse, attr->reg, reg);
1300
1301 return sprintf(buf, "0x%02x\n", (attr->reg && rc) ? -1 : *reg);
1302}
1303
1304
1305
1306
1307static ssize_t elantech_set_int_attr(struct psmouse *psmouse,
1308 void *data, const char *buf, size_t count)
1309{
1310 struct elantech_data *etd = psmouse->private;
1311 struct elantech_attr_data *attr = data;
1312 unsigned char *reg = (unsigned char *) etd + attr->field_offset;
1313 unsigned char value;
1314 int err;
1315
1316 err = kstrtou8(buf, 16, &value);
1317 if (err)
1318 return err;
1319
1320
1321 if (etd->hw_version == 1) {
1322 if (attr->reg == 0x10)
1323
1324 value |= ETP_R10_ABSOLUTE_MODE;
1325 else if (attr->reg == 0x11)
1326
1327 value |= ETP_R11_4_BYTE_MODE;
1328 }
1329
1330 if (!attr->reg || elantech_write_reg(psmouse, attr->reg, value) == 0)
1331 *reg = value;
1332
1333 return count;
1334}
1335
1336#define ELANTECH_INT_ATTR(_name, _register) \
1337 static struct elantech_attr_data elantech_attr_##_name = { \
1338 .field_offset = offsetof(struct elantech_data, _name), \
1339 .reg = _register, \
1340 }; \
1341 PSMOUSE_DEFINE_ATTR(_name, S_IWUSR | S_IRUGO, \
1342 &elantech_attr_##_name, \
1343 elantech_show_int_attr, \
1344 elantech_set_int_attr)
1345
1346ELANTECH_INT_ATTR(reg_07, 0x07);
1347ELANTECH_INT_ATTR(reg_10, 0x10);
1348ELANTECH_INT_ATTR(reg_11, 0x11);
1349ELANTECH_INT_ATTR(reg_20, 0x20);
1350ELANTECH_INT_ATTR(reg_21, 0x21);
1351ELANTECH_INT_ATTR(reg_22, 0x22);
1352ELANTECH_INT_ATTR(reg_23, 0x23);
1353ELANTECH_INT_ATTR(reg_24, 0x24);
1354ELANTECH_INT_ATTR(reg_25, 0x25);
1355ELANTECH_INT_ATTR(reg_26, 0x26);
1356ELANTECH_INT_ATTR(debug, 0);
1357ELANTECH_INT_ATTR(paritycheck, 0);
1358ELANTECH_INT_ATTR(crc_enabled, 0);
1359
1360static struct attribute *elantech_attrs[] = {
1361 &psmouse_attr_reg_07.dattr.attr,
1362 &psmouse_attr_reg_10.dattr.attr,
1363 &psmouse_attr_reg_11.dattr.attr,
1364 &psmouse_attr_reg_20.dattr.attr,
1365 &psmouse_attr_reg_21.dattr.attr,
1366 &psmouse_attr_reg_22.dattr.attr,
1367 &psmouse_attr_reg_23.dattr.attr,
1368 &psmouse_attr_reg_24.dattr.attr,
1369 &psmouse_attr_reg_25.dattr.attr,
1370 &psmouse_attr_reg_26.dattr.attr,
1371 &psmouse_attr_debug.dattr.attr,
1372 &psmouse_attr_paritycheck.dattr.attr,
1373 &psmouse_attr_crc_enabled.dattr.attr,
1374 NULL
1375};
1376
1377static struct attribute_group elantech_attr_group = {
1378 .attrs = elantech_attrs,
1379};
1380
1381static bool elantech_is_signature_valid(const unsigned char *param)
1382{
1383 static const unsigned char rates[] = { 200, 100, 80, 60, 40, 20, 10 };
1384 int i;
1385
1386 if (param[0] == 0)
1387 return false;
1388
1389 if (param[1] == 0)
1390 return true;
1391
1392
1393
1394
1395
1396 if ((param[0] & 0x0f) >= 0x06 && (param[1] & 0xaf) == 0x0f &&
1397 param[2] < 40)
1398 return true;
1399
1400 for (i = 0; i < ARRAY_SIZE(rates); i++)
1401 if (param[2] == rates[i])
1402 return false;
1403
1404 return true;
1405}
1406
1407
1408
1409
1410int elantech_detect(struct psmouse *psmouse, bool set_properties)
1411{
1412 struct ps2dev *ps2dev = &psmouse->ps2dev;
1413 unsigned char param[3];
1414
1415 ps2_command(&psmouse->ps2dev, NULL, PSMOUSE_CMD_RESET_DIS);
1416
1417 if (ps2_command(ps2dev, NULL, PSMOUSE_CMD_DISABLE) ||
1418 ps2_command(ps2dev, NULL, PSMOUSE_CMD_SETSCALE11) ||
1419 ps2_command(ps2dev, NULL, PSMOUSE_CMD_SETSCALE11) ||
1420 ps2_command(ps2dev, NULL, PSMOUSE_CMD_SETSCALE11) ||
1421 ps2_command(ps2dev, param, PSMOUSE_CMD_GETINFO)) {
1422 psmouse_dbg(psmouse, "sending Elantech magic knock failed.\n");
1423 return -1;
1424 }
1425
1426
1427
1428
1429
1430 if (param[0] != 0x3c || param[1] != 0x03 ||
1431 (param[2] != 0xc8 && param[2] != 0x00)) {
1432 psmouse_dbg(psmouse,
1433 "unexpected magic knock result 0x%02x, 0x%02x, 0x%02x.\n",
1434 param[0], param[1], param[2]);
1435 return -1;
1436 }
1437
1438
1439
1440
1441
1442
1443 if (synaptics_send_cmd(psmouse, ETP_FW_VERSION_QUERY, param)) {
1444 psmouse_dbg(psmouse, "failed to query firmware version.\n");
1445 return -1;
1446 }
1447
1448 psmouse_dbg(psmouse,
1449 "Elantech version query result 0x%02x, 0x%02x, 0x%02x.\n",
1450 param[0], param[1], param[2]);
1451
1452 if (!elantech_is_signature_valid(param)) {
1453 psmouse_dbg(psmouse,
1454 "Probably not a real Elantech touchpad. Aborting.\n");
1455 return -1;
1456 }
1457
1458 if (set_properties) {
1459 psmouse->vendor = "Elantech";
1460 psmouse->name = "Touchpad";
1461 }
1462
1463 return 0;
1464}
1465
1466
1467
1468
1469static void elantech_disconnect(struct psmouse *psmouse)
1470{
1471 struct elantech_data *etd = psmouse->private;
1472
1473 if (etd->tp_dev)
1474 input_unregister_device(etd->tp_dev);
1475 sysfs_remove_group(&psmouse->ps2dev.serio->dev.kobj,
1476 &elantech_attr_group);
1477 kfree(psmouse->private);
1478 psmouse->private = NULL;
1479}
1480
1481
1482
1483
1484static int elantech_reconnect(struct psmouse *psmouse)
1485{
1486 psmouse_reset(psmouse);
1487
1488 if (elantech_detect(psmouse, 0))
1489 return -1;
1490
1491 if (elantech_set_absolute_mode(psmouse)) {
1492 psmouse_err(psmouse,
1493 "failed to put touchpad back into absolute mode.\n");
1494 return -1;
1495 }
1496
1497 return 0;
1498}
1499
1500
1501
1502
1503static const struct dmi_system_id elantech_dmi_force_crc_enabled[] = {
1504#if defined(CONFIG_DMI) && defined(CONFIG_X86)
1505 {
1506
1507 .matches = {
1508 DMI_MATCH(DMI_SYS_VENDOR, "FUJITSU"),
1509 DMI_MATCH(DMI_PRODUCT_NAME, "CELSIUS H730"),
1510 },
1511 },
1512 {
1513
1514 .matches = {
1515 DMI_MATCH(DMI_SYS_VENDOR, "FUJITSU"),
1516 DMI_MATCH(DMI_PRODUCT_NAME, "CELSIUS H760"),
1517 },
1518 },
1519 {
1520
1521 .matches = {
1522 DMI_MATCH(DMI_SYS_VENDOR, "FUJITSU"),
1523 DMI_MATCH(DMI_PRODUCT_NAME, "LIFEBOOK E544"),
1524 },
1525 },
1526 {
1527
1528 .matches = {
1529 DMI_MATCH(DMI_SYS_VENDOR, "FUJITSU"),
1530 DMI_MATCH(DMI_PRODUCT_NAME, "LIFEBOOK E554"),
1531 },
1532 },
1533 {
1534
1535 .matches = {
1536 DMI_MATCH(DMI_SYS_VENDOR, "FUJITSU"),
1537 DMI_MATCH(DMI_PRODUCT_NAME, "LIFEBOOK E556"),
1538 },
1539 },
1540 {
1541
1542 .matches = {
1543 DMI_MATCH(DMI_SYS_VENDOR, "FUJITSU"),
1544 DMI_MATCH(DMI_PRODUCT_NAME, "LIFEBOOK U745"),
1545 },
1546 },
1547#endif
1548 { }
1549};
1550
1551
1552
1553
1554
1555static const struct dmi_system_id no_hw_res_dmi_table[] = {
1556#if defined(CONFIG_DMI) && defined(CONFIG_X86)
1557 {
1558
1559 .matches = {
1560 DMI_MATCH(DMI_SYS_VENDOR, "GIGABYTE"),
1561 DMI_MATCH(DMI_PRODUCT_NAME, "U2442"),
1562 },
1563 },
1564#endif
1565 { }
1566};
1567
1568
1569
1570
1571static int elantech_set_properties(struct elantech_data *etd)
1572{
1573
1574 int ver = (etd->fw_version & 0x0f0000) >> 16;
1575
1576
1577 if (etd->fw_version < 0x020030 || etd->fw_version == 0x020600)
1578 etd->hw_version = 1;
1579 else {
1580 switch (ver) {
1581 case 2:
1582 case 4:
1583 etd->hw_version = 2;
1584 break;
1585 case 5:
1586 etd->hw_version = 3;
1587 break;
1588 case 6 ... 14:
1589 etd->hw_version = 4;
1590 break;
1591 default:
1592 return -1;
1593 }
1594 }
1595
1596
1597 etd->send_cmd = etd->hw_version >= 3 ? elantech_send_cmd :
1598 synaptics_send_cmd;
1599
1600
1601 etd->paritycheck = 1;
1602
1603
1604
1605
1606
1607
1608 etd->jumpy_cursor =
1609 (etd->fw_version == 0x020022 || etd->fw_version == 0x020600);
1610
1611 if (etd->hw_version > 1) {
1612
1613 etd->debug = 1;
1614
1615 if (etd->fw_version >= 0x020800)
1616 etd->reports_pressure = true;
1617 }
1618
1619
1620
1621
1622
1623 etd->crc_enabled = (etd->fw_version & 0x4000) == 0x4000 ||
1624 dmi_check_system(elantech_dmi_force_crc_enabled);
1625
1626
1627 etd->set_hw_resolution = !dmi_check_system(no_hw_res_dmi_table);
1628
1629 return 0;
1630}
1631
1632
1633
1634
1635int elantech_init(struct psmouse *psmouse)
1636{
1637 struct elantech_data *etd;
1638 int i;
1639 int error = -EINVAL;
1640 unsigned char param[3];
1641 struct input_dev *tp_dev;
1642
1643 psmouse->private = etd = kzalloc(sizeof(struct elantech_data), GFP_KERNEL);
1644 if (!etd)
1645 return -ENOMEM;
1646
1647 psmouse_reset(psmouse);
1648
1649 etd->parity[0] = 1;
1650 for (i = 1; i < 256; i++)
1651 etd->parity[i] = etd->parity[i & (i - 1)] ^ 1;
1652
1653
1654
1655
1656 if (synaptics_send_cmd(psmouse, ETP_FW_VERSION_QUERY, param)) {
1657 psmouse_err(psmouse, "failed to query firmware version.\n");
1658 goto init_fail;
1659 }
1660 etd->fw_version = (param[0] << 16) | (param[1] << 8) | param[2];
1661
1662 if (elantech_set_properties(etd)) {
1663 psmouse_err(psmouse, "unknown hardware version, aborting...\n");
1664 goto init_fail;
1665 }
1666 psmouse_info(psmouse,
1667 "assuming hardware version %d (with firmware version 0x%02x%02x%02x)\n",
1668 etd->hw_version, param[0], param[1], param[2]);
1669
1670 if (etd->send_cmd(psmouse, ETP_CAPABILITIES_QUERY,
1671 etd->capabilities)) {
1672 psmouse_err(psmouse, "failed to query capabilities.\n");
1673 goto init_fail;
1674 }
1675 psmouse_info(psmouse,
1676 "Synaptics capabilities query result 0x%02x, 0x%02x, 0x%02x.\n",
1677 etd->capabilities[0], etd->capabilities[1],
1678 etd->capabilities[2]);
1679
1680 if (etd->hw_version != 1) {
1681 if (etd->send_cmd(psmouse, ETP_SAMPLE_QUERY, etd->samples)) {
1682 psmouse_err(psmouse, "failed to query sample data\n");
1683 goto init_fail;
1684 }
1685 psmouse_info(psmouse,
1686 "Elan sample query result %02x, %02x, %02x\n",
1687 etd->samples[0], etd->samples[1], etd->samples[2]);
1688 }
1689
1690 if (elantech_set_absolute_mode(psmouse)) {
1691 psmouse_err(psmouse,
1692 "failed to put touchpad into absolute mode.\n");
1693 goto init_fail;
1694 }
1695
1696 if (etd->fw_version == 0x381f17) {
1697 etd->original_set_rate = psmouse->set_rate;
1698 psmouse->set_rate = elantech_set_rate_restore_reg_07;
1699 }
1700
1701 if (elantech_set_input_params(psmouse)) {
1702 psmouse_err(psmouse, "failed to query touchpad range.\n");
1703 goto init_fail;
1704 }
1705
1706 error = sysfs_create_group(&psmouse->ps2dev.serio->dev.kobj,
1707 &elantech_attr_group);
1708 if (error) {
1709 psmouse_err(psmouse,
1710 "failed to create sysfs attributes, error: %d.\n",
1711 error);
1712 goto init_fail;
1713 }
1714
1715
1716 if ((etd->capabilities[0] & 0x80) == 0x80) {
1717 tp_dev = input_allocate_device();
1718
1719 if (!tp_dev) {
1720 error = -ENOMEM;
1721 goto init_fail_tp_alloc;
1722 }
1723
1724 etd->tp_dev = tp_dev;
1725 snprintf(etd->tp_phys, sizeof(etd->tp_phys), "%s/input1",
1726 psmouse->ps2dev.serio->phys);
1727 tp_dev->phys = etd->tp_phys;
1728 tp_dev->name = "ETPS/2 Elantech TrackPoint";
1729 tp_dev->id.bustype = BUS_I8042;
1730 tp_dev->id.vendor = 0x0002;
1731 tp_dev->id.product = PSMOUSE_ELANTECH;
1732 tp_dev->id.version = 0x0000;
1733 tp_dev->dev.parent = &psmouse->ps2dev.serio->dev;
1734 tp_dev->evbit[0] = BIT_MASK(EV_KEY) | BIT_MASK(EV_REL);
1735 tp_dev->relbit[BIT_WORD(REL_X)] =
1736 BIT_MASK(REL_X) | BIT_MASK(REL_Y);
1737 tp_dev->keybit[BIT_WORD(BTN_LEFT)] =
1738 BIT_MASK(BTN_LEFT) | BIT_MASK(BTN_MIDDLE) |
1739 BIT_MASK(BTN_RIGHT);
1740
1741 __set_bit(INPUT_PROP_POINTER, tp_dev->propbit);
1742 __set_bit(INPUT_PROP_POINTING_STICK, tp_dev->propbit);
1743
1744 error = input_register_device(etd->tp_dev);
1745 if (error < 0)
1746 goto init_fail_tp_reg;
1747 }
1748
1749 psmouse->protocol_handler = elantech_process_byte;
1750 psmouse->disconnect = elantech_disconnect;
1751 psmouse->reconnect = elantech_reconnect;
1752 psmouse->pktsize = etd->hw_version > 1 ? 6 : 4;
1753
1754 return 0;
1755 init_fail_tp_reg:
1756 input_free_device(tp_dev);
1757 init_fail_tp_alloc:
1758 sysfs_remove_group(&psmouse->ps2dev.serio->dev.kobj,
1759 &elantech_attr_group);
1760 init_fail:
1761 psmouse_reset(psmouse);
1762 kfree(etd);
1763 return error;
1764}
1765