xref: /linux/drivers/input/mouse/synaptics.c (revision de5109898a8a0cb001abcb6916bef4efa32bf39b)
1 /*
2  * Synaptics TouchPad PS/2 mouse driver
3  *
4  *   2003 Dmitry Torokhov <dtor@mail.ru>
5  *     Added support for pass-through port. Special thanks to Peter Berg Larsen
6  *     for explaining various Synaptics quirks.
7  *
8  *   2003 Peter Osterlund <petero2@telia.com>
9  *     Ported to 2.5 input device infrastructure.
10  *
11  *   Copyright (C) 2001 Stefan Gmeiner <riddlebox@freesurf.ch>
12  *     start merging tpconfig and gpm code to a xfree-input module
13  *     adding some changes and extensions (ex. 3rd and 4th button)
14  *
15  *   Copyright (c) 1997 C. Scott Ananian <cananian@alumni.priceton.edu>
16  *   Copyright (c) 1998-2000 Bruce Kalk <kall@compass.com>
17  *     code for the special synaptics commands (from the tpconfig-source)
18  *
19  * This program is free software; you can redistribute it and/or modify it
20  * under the terms of the GNU General Public License version 2 as published by
21  * the Free Software Foundation.
22  *
23  * Trademarks are the property of their respective owners.
24  */
25 
26 #include <linux/module.h>
27 #include <linux/delay.h>
28 #include <linux/dmi.h>
29 #include <linux/input/mt.h>
30 #include <linux/serio.h>
31 #include <linux/libps2.h>
32 #include <linux/slab.h>
33 #include "psmouse.h"
34 #include "synaptics.h"
35 
36 /*
37  * The x/y limits are taken from the Synaptics TouchPad interfacing Guide,
38  * section 2.3.2, which says that they should be valid regardless of the
39  * actual size of the sensor.
40  * Note that newer firmware allows querying device for maximum useable
41  * coordinates.
42  */
43 #define XMIN 0
44 #define XMAX 6143
45 #define YMIN 0
46 #define YMAX 6143
47 #define XMIN_NOMINAL 1472
48 #define XMAX_NOMINAL 5472
49 #define YMIN_NOMINAL 1408
50 #define YMAX_NOMINAL 4448
51 
52 /* Size in bits of absolute position values reported by the hardware */
53 #define ABS_POS_BITS 13
54 
55 /*
56  * These values should represent the absolute maximum value that will
57  * be reported for a positive position value. Some Synaptics firmware
58  * uses this value to indicate a finger near the edge of the touchpad
59  * whose precise position cannot be determined.
60  *
61  * At least one touchpad is known to report positions in excess of this
62  * value which are actually negative values truncated to the 13-bit
63  * reporting range. These values have never been observed to be lower
64  * than 8184 (i.e. -8), so we treat all values greater than 8176 as
65  * negative and any other value as positive.
66  */
67 #define X_MAX_POSITIVE 8176
68 #define Y_MAX_POSITIVE 8176
69 
70 /*****************************************************************************
71  *	Stuff we need even when we do not want native Synaptics support
72  ****************************************************************************/
73 
74 /*
75  * Set the synaptics touchpad mode byte by special commands
76  */
77 static int synaptics_mode_cmd(struct psmouse *psmouse, unsigned char mode)
78 {
79 	unsigned char param[1];
80 
81 	if (psmouse_sliced_command(psmouse, mode))
82 		return -1;
83 	param[0] = SYN_PS_SET_MODE2;
84 	if (ps2_command(&psmouse->ps2dev, param, PSMOUSE_CMD_SETRATE))
85 		return -1;
86 	return 0;
87 }
88 
89 int synaptics_detect(struct psmouse *psmouse, bool set_properties)
90 {
91 	struct ps2dev *ps2dev = &psmouse->ps2dev;
92 	unsigned char param[4];
93 
94 	param[0] = 0;
95 
96 	ps2_command(ps2dev, param, PSMOUSE_CMD_SETRES);
97 	ps2_command(ps2dev, param, PSMOUSE_CMD_SETRES);
98 	ps2_command(ps2dev, param, PSMOUSE_CMD_SETRES);
99 	ps2_command(ps2dev, param, PSMOUSE_CMD_SETRES);
100 	ps2_command(ps2dev, param, PSMOUSE_CMD_GETINFO);
101 
102 	if (param[1] != 0x47)
103 		return -ENODEV;
104 
105 	if (set_properties) {
106 		psmouse->vendor = "Synaptics";
107 		psmouse->name = "TouchPad";
108 	}
109 
110 	return 0;
111 }
112 
113 void synaptics_reset(struct psmouse *psmouse)
114 {
115 	/* reset touchpad back to relative mode, gestures enabled */
116 	synaptics_mode_cmd(psmouse, 0);
117 }
118 
119 #ifdef CONFIG_MOUSE_PS2_SYNAPTICS
120 /* This list has been kindly provided by Synaptics. */
121 static const char * const topbuttonpad_pnp_ids[] = {
122 	"LEN0017",
123 	"LEN0018",
124 	"LEN0019",
125 	"LEN0023",
126 	"LEN002A",
127 	"LEN002B",
128 	"LEN002C",
129 	"LEN002D",
130 	"LEN002E",
131 	"LEN0033", /* Helix */
132 	"LEN0034", /* T431s, T540, X1 Carbon 2nd */
133 	"LEN0035", /* X240 */
134 	"LEN0036", /* T440 */
135 	"LEN0037",
136 	"LEN0038",
137 	"LEN0041",
138 	"LEN0042", /* Yoga */
139 	"LEN0045",
140 	"LEN0046",
141 	"LEN0047",
142 	"LEN0048",
143 	"LEN0049",
144 	"LEN2000",
145 	"LEN2001",
146 	"LEN2002",
147 	"LEN2003",
148 	"LEN2004", /* L440 */
149 	"LEN2005",
150 	"LEN2006",
151 	"LEN2007",
152 	"LEN2008",
153 	"LEN2009",
154 	"LEN200A",
155 	"LEN200B",
156 	NULL
157 };
158 
159 /*****************************************************************************
160  *	Synaptics communications functions
161  ****************************************************************************/
162 
163 /*
164  * Synaptics touchpads report the y coordinate from bottom to top, which is
165  * opposite from what userspace expects.
166  * This function is used to invert y before reporting.
167  */
168 static int synaptics_invert_y(int y)
169 {
170 	return YMAX_NOMINAL + YMIN_NOMINAL - y;
171 }
172 
173 /*
174  * Send a command to the synpatics touchpad by special commands
175  */
176 static int synaptics_send_cmd(struct psmouse *psmouse, unsigned char c, unsigned char *param)
177 {
178 	if (psmouse_sliced_command(psmouse, c))
179 		return -1;
180 	if (ps2_command(&psmouse->ps2dev, param, PSMOUSE_CMD_GETINFO))
181 		return -1;
182 	return 0;
183 }
184 
185 /*
186  * Read the model-id bytes from the touchpad
187  * see also SYN_MODEL_* macros
188  */
189 static int synaptics_model_id(struct psmouse *psmouse)
190 {
191 	struct synaptics_data *priv = psmouse->private;
192 	unsigned char mi[3];
193 
194 	if (synaptics_send_cmd(psmouse, SYN_QUE_MODEL, mi))
195 		return -1;
196 	priv->model_id = (mi[0]<<16) | (mi[1]<<8) | mi[2];
197 	return 0;
198 }
199 
200 /*
201  * Read the board id from the touchpad
202  * The board id is encoded in the "QUERY MODES" response
203  */
204 static int synaptics_board_id(struct psmouse *psmouse)
205 {
206 	struct synaptics_data *priv = psmouse->private;
207 	unsigned char bid[3];
208 
209 	if (synaptics_send_cmd(psmouse, SYN_QUE_MODES, bid))
210 		return -1;
211 	priv->board_id = ((bid[0] & 0xfc) << 6) | bid[1];
212 	return 0;
213 }
214 
215 /*
216  * Read the firmware id from the touchpad
217  */
218 static int synaptics_firmware_id(struct psmouse *psmouse)
219 {
220 	struct synaptics_data *priv = psmouse->private;
221 	unsigned char fwid[3];
222 
223 	if (synaptics_send_cmd(psmouse, SYN_QUE_FIRMWARE_ID, fwid))
224 		return -1;
225 	priv->firmware_id = (fwid[0] << 16) | (fwid[1] << 8) | fwid[2];
226 	return 0;
227 }
228 
229 /*
230  * Read the capability-bits from the touchpad
231  * see also the SYN_CAP_* macros
232  */
233 static int synaptics_capability(struct psmouse *psmouse)
234 {
235 	struct synaptics_data *priv = psmouse->private;
236 	unsigned char cap[3];
237 
238 	if (synaptics_send_cmd(psmouse, SYN_QUE_CAPABILITIES, cap))
239 		return -1;
240 	priv->capabilities = (cap[0] << 16) | (cap[1] << 8) | cap[2];
241 	priv->ext_cap = priv->ext_cap_0c = 0;
242 
243 	/*
244 	 * Older firmwares had submodel ID fixed to 0x47
245 	 */
246 	if (SYN_ID_FULL(priv->identity) < 0x705 &&
247 	    SYN_CAP_SUBMODEL_ID(priv->capabilities) != 0x47) {
248 		return -1;
249 	}
250 
251 	/*
252 	 * Unless capExtended is set the rest of the flags should be ignored
253 	 */
254 	if (!SYN_CAP_EXTENDED(priv->capabilities))
255 		priv->capabilities = 0;
256 
257 	if (SYN_EXT_CAP_REQUESTS(priv->capabilities) >= 1) {
258 		if (synaptics_send_cmd(psmouse, SYN_QUE_EXT_CAPAB, cap)) {
259 			psmouse_warn(psmouse,
260 				     "device claims to have extended capabilities, but I'm not able to read them.\n");
261 		} else {
262 			priv->ext_cap = (cap[0] << 16) | (cap[1] << 8) | cap[2];
263 
264 			/*
265 			 * if nExtBtn is greater than 8 it should be considered
266 			 * invalid and treated as 0
267 			 */
268 			if (SYN_CAP_MULTI_BUTTON_NO(priv->ext_cap) > 8)
269 				priv->ext_cap &= 0xff0fff;
270 		}
271 	}
272 
273 	if (SYN_EXT_CAP_REQUESTS(priv->capabilities) >= 4) {
274 		if (synaptics_send_cmd(psmouse, SYN_QUE_EXT_CAPAB_0C, cap)) {
275 			psmouse_warn(psmouse,
276 				     "device claims to have extended capability 0x0c, but I'm not able to read it.\n");
277 		} else {
278 			priv->ext_cap_0c = (cap[0] << 16) | (cap[1] << 8) | cap[2];
279 		}
280 	}
281 
282 	return 0;
283 }
284 
285 /*
286  * Identify Touchpad
287  * See also the SYN_ID_* macros
288  */
289 static int synaptics_identify(struct psmouse *psmouse)
290 {
291 	struct synaptics_data *priv = psmouse->private;
292 	unsigned char id[3];
293 
294 	if (synaptics_send_cmd(psmouse, SYN_QUE_IDENTIFY, id))
295 		return -1;
296 	priv->identity = (id[0]<<16) | (id[1]<<8) | id[2];
297 	if (SYN_ID_IS_SYNAPTICS(priv->identity))
298 		return 0;
299 	return -1;
300 }
301 
302 /*
303  * Read touchpad resolution and maximum reported coordinates
304  * Resolution is left zero if touchpad does not support the query
305  */
306 
307 static const int *quirk_min_max;
308 
309 static int synaptics_resolution(struct psmouse *psmouse)
310 {
311 	struct synaptics_data *priv = psmouse->private;
312 	unsigned char resp[3];
313 
314 	if (quirk_min_max) {
315 		priv->x_min = quirk_min_max[0];
316 		priv->x_max = quirk_min_max[1];
317 		priv->y_min = quirk_min_max[2];
318 		priv->y_max = quirk_min_max[3];
319 		return 0;
320 	}
321 
322 	if (SYN_ID_MAJOR(priv->identity) < 4)
323 		return 0;
324 
325 	if (synaptics_send_cmd(psmouse, SYN_QUE_RESOLUTION, resp) == 0) {
326 		if (resp[0] != 0 && (resp[1] & 0x80) && resp[2] != 0) {
327 			priv->x_res = resp[0]; /* x resolution in units/mm */
328 			priv->y_res = resp[2]; /* y resolution in units/mm */
329 		}
330 	}
331 
332 	if (SYN_EXT_CAP_REQUESTS(priv->capabilities) >= 5 &&
333 	    SYN_CAP_MAX_DIMENSIONS(priv->ext_cap_0c)) {
334 		if (synaptics_send_cmd(psmouse, SYN_QUE_EXT_MAX_COORDS, resp)) {
335 			psmouse_warn(psmouse,
336 				     "device claims to have max coordinates query, but I'm not able to read it.\n");
337 		} else {
338 			priv->x_max = (resp[0] << 5) | ((resp[1] & 0x0f) << 1);
339 			priv->y_max = (resp[2] << 5) | ((resp[1] & 0xf0) >> 3);
340 		}
341 	}
342 
343 	if (SYN_EXT_CAP_REQUESTS(priv->capabilities) >= 7 &&
344 	    SYN_CAP_MIN_DIMENSIONS(priv->ext_cap_0c)) {
345 		if (synaptics_send_cmd(psmouse, SYN_QUE_EXT_MIN_COORDS, resp)) {
346 			psmouse_warn(psmouse,
347 				     "device claims to have min coordinates query, but I'm not able to read it.\n");
348 		} else {
349 			priv->x_min = (resp[0] << 5) | ((resp[1] & 0x0f) << 1);
350 			priv->y_min = (resp[2] << 5) | ((resp[1] & 0xf0) >> 3);
351 		}
352 	}
353 
354 	return 0;
355 }
356 
357 static int synaptics_query_hardware(struct psmouse *psmouse)
358 {
359 	if (synaptics_identify(psmouse))
360 		return -1;
361 	if (synaptics_model_id(psmouse))
362 		return -1;
363 	if (synaptics_firmware_id(psmouse))
364 		return -1;
365 	if (synaptics_board_id(psmouse))
366 		return -1;
367 	if (synaptics_capability(psmouse))
368 		return -1;
369 	if (synaptics_resolution(psmouse))
370 		return -1;
371 
372 	return 0;
373 }
374 
375 static int synaptics_set_advanced_gesture_mode(struct psmouse *psmouse)
376 {
377 	static unsigned char param = 0xc8;
378 	struct synaptics_data *priv = psmouse->private;
379 
380 	if (!(SYN_CAP_ADV_GESTURE(priv->ext_cap_0c) ||
381 	      SYN_CAP_IMAGE_SENSOR(priv->ext_cap_0c)))
382 		return 0;
383 
384 	if (psmouse_sliced_command(psmouse, SYN_QUE_MODEL))
385 		return -1;
386 
387 	if (ps2_command(&psmouse->ps2dev, &param, PSMOUSE_CMD_SETRATE))
388 		return -1;
389 
390 	/* Advanced gesture mode also sends multi finger data */
391 	priv->capabilities |= BIT(1);
392 
393 	return 0;
394 }
395 
396 static int synaptics_set_mode(struct psmouse *psmouse)
397 {
398 	struct synaptics_data *priv = psmouse->private;
399 
400 	priv->mode = 0;
401 	if (priv->absolute_mode)
402 		priv->mode |= SYN_BIT_ABSOLUTE_MODE;
403 	if (priv->disable_gesture)
404 		priv->mode |= SYN_BIT_DISABLE_GESTURE;
405 	if (psmouse->rate >= 80)
406 		priv->mode |= SYN_BIT_HIGH_RATE;
407 	if (SYN_CAP_EXTENDED(priv->capabilities))
408 		priv->mode |= SYN_BIT_W_MODE;
409 
410 	if (synaptics_mode_cmd(psmouse, priv->mode))
411 		return -1;
412 
413 	if (priv->absolute_mode &&
414 	    synaptics_set_advanced_gesture_mode(psmouse)) {
415 		psmouse_err(psmouse, "Advanced gesture mode init failed.\n");
416 		return -1;
417 	}
418 
419 	return 0;
420 }
421 
422 static void synaptics_set_rate(struct psmouse *psmouse, unsigned int rate)
423 {
424 	struct synaptics_data *priv = psmouse->private;
425 
426 	if (rate >= 80) {
427 		priv->mode |= SYN_BIT_HIGH_RATE;
428 		psmouse->rate = 80;
429 	} else {
430 		priv->mode &= ~SYN_BIT_HIGH_RATE;
431 		psmouse->rate = 40;
432 	}
433 
434 	synaptics_mode_cmd(psmouse, priv->mode);
435 }
436 
437 /*****************************************************************************
438  *	Synaptics pass-through PS/2 port support
439  ****************************************************************************/
440 static int synaptics_pt_write(struct serio *serio, unsigned char c)
441 {
442 	struct psmouse *parent = serio_get_drvdata(serio->parent);
443 	char rate_param = SYN_PS_CLIENT_CMD; /* indicates that we want pass-through port */
444 
445 	if (psmouse_sliced_command(parent, c))
446 		return -1;
447 	if (ps2_command(&parent->ps2dev, &rate_param, PSMOUSE_CMD_SETRATE))
448 		return -1;
449 	return 0;
450 }
451 
452 static int synaptics_pt_start(struct serio *serio)
453 {
454 	struct psmouse *parent = serio_get_drvdata(serio->parent);
455 	struct synaptics_data *priv = parent->private;
456 
457 	serio_pause_rx(parent->ps2dev.serio);
458 	priv->pt_port = serio;
459 	serio_continue_rx(parent->ps2dev.serio);
460 
461 	return 0;
462 }
463 
464 static void synaptics_pt_stop(struct serio *serio)
465 {
466 	struct psmouse *parent = serio_get_drvdata(serio->parent);
467 	struct synaptics_data *priv = parent->private;
468 
469 	serio_pause_rx(parent->ps2dev.serio);
470 	priv->pt_port = NULL;
471 	serio_continue_rx(parent->ps2dev.serio);
472 }
473 
474 static int synaptics_is_pt_packet(unsigned char *buf)
475 {
476 	return (buf[0] & 0xFC) == 0x84 && (buf[3] & 0xCC) == 0xC4;
477 }
478 
479 static void synaptics_pass_pt_packet(struct serio *ptport, unsigned char *packet)
480 {
481 	struct psmouse *child = serio_get_drvdata(ptport);
482 
483 	if (child && child->state == PSMOUSE_ACTIVATED) {
484 		serio_interrupt(ptport, packet[1], 0);
485 		serio_interrupt(ptport, packet[4], 0);
486 		serio_interrupt(ptport, packet[5], 0);
487 		if (child->pktsize == 4)
488 			serio_interrupt(ptport, packet[2], 0);
489 	} else
490 		serio_interrupt(ptport, packet[1], 0);
491 }
492 
493 static void synaptics_pt_activate(struct psmouse *psmouse)
494 {
495 	struct synaptics_data *priv = psmouse->private;
496 	struct psmouse *child = serio_get_drvdata(priv->pt_port);
497 
498 	/* adjust the touchpad to child's choice of protocol */
499 	if (child) {
500 		if (child->pktsize == 4)
501 			priv->mode |= SYN_BIT_FOUR_BYTE_CLIENT;
502 		else
503 			priv->mode &= ~SYN_BIT_FOUR_BYTE_CLIENT;
504 
505 		if (synaptics_mode_cmd(psmouse, priv->mode))
506 			psmouse_warn(psmouse,
507 				     "failed to switch guest protocol\n");
508 	}
509 }
510 
511 static void synaptics_pt_create(struct psmouse *psmouse)
512 {
513 	struct serio *serio;
514 
515 	serio = kzalloc(sizeof(struct serio), GFP_KERNEL);
516 	if (!serio) {
517 		psmouse_err(psmouse,
518 			    "not enough memory for pass-through port\n");
519 		return;
520 	}
521 
522 	serio->id.type = SERIO_PS_PSTHRU;
523 	strlcpy(serio->name, "Synaptics pass-through", sizeof(serio->name));
524 	strlcpy(serio->phys, "synaptics-pt/serio0", sizeof(serio->name));
525 	serio->write = synaptics_pt_write;
526 	serio->start = synaptics_pt_start;
527 	serio->stop = synaptics_pt_stop;
528 	serio->parent = psmouse->ps2dev.serio;
529 
530 	psmouse->pt_activate = synaptics_pt_activate;
531 
532 	psmouse_info(psmouse, "serio: %s port at %s\n",
533 		     serio->name, psmouse->phys);
534 	serio_register_port(serio);
535 }
536 
537 /*****************************************************************************
538  *	Functions to interpret the absolute mode packets
539  ****************************************************************************/
540 
541 static void synaptics_mt_state_set(struct synaptics_mt_state *state, int count,
542 				   int sgm, int agm)
543 {
544 	state->count = count;
545 	state->sgm = sgm;
546 	state->agm = agm;
547 }
548 
549 static void synaptics_parse_agm(const unsigned char buf[],
550 				struct synaptics_data *priv,
551 				struct synaptics_hw_state *hw)
552 {
553 	struct synaptics_hw_state *agm = &priv->agm;
554 	int agm_packet_type;
555 
556 	agm_packet_type = (buf[5] & 0x30) >> 4;
557 	switch (agm_packet_type) {
558 	case 1:
559 		/* Gesture packet: (x, y, z) half resolution */
560 		agm->w = hw->w;
561 		agm->x = (((buf[4] & 0x0f) << 8) | buf[1]) << 1;
562 		agm->y = (((buf[4] & 0xf0) << 4) | buf[2]) << 1;
563 		agm->z = ((buf[3] & 0x30) | (buf[5] & 0x0f)) << 1;
564 		break;
565 
566 	case 2:
567 		/* AGM-CONTACT packet: (count, sgm, agm) */
568 		synaptics_mt_state_set(&agm->mt_state, buf[1], buf[2], buf[4]);
569 		break;
570 
571 	default:
572 		break;
573 	}
574 
575 	/* Record that at least one AGM has been received since last SGM */
576 	priv->agm_pending = true;
577 }
578 
579 static int synaptics_parse_hw_state(const unsigned char buf[],
580 				    struct synaptics_data *priv,
581 				    struct synaptics_hw_state *hw)
582 {
583 	memset(hw, 0, sizeof(struct synaptics_hw_state));
584 
585 	if (SYN_MODEL_NEWABS(priv->model_id)) {
586 		hw->w = (((buf[0] & 0x30) >> 2) |
587 			 ((buf[0] & 0x04) >> 1) |
588 			 ((buf[3] & 0x04) >> 2));
589 
590 		hw->left  = (buf[0] & 0x01) ? 1 : 0;
591 		hw->right = (buf[0] & 0x02) ? 1 : 0;
592 
593 		if (SYN_CAP_CLICKPAD(priv->ext_cap_0c)) {
594 			/*
595 			 * Clickpad's button is transmitted as middle button,
596 			 * however, since it is primary button, we will report
597 			 * it as BTN_LEFT.
598 			 */
599 			hw->left = ((buf[0] ^ buf[3]) & 0x01) ? 1 : 0;
600 
601 		} else if (SYN_CAP_MIDDLE_BUTTON(priv->capabilities)) {
602 			hw->middle = ((buf[0] ^ buf[3]) & 0x01) ? 1 : 0;
603 			if (hw->w == 2)
604 				hw->scroll = (signed char)(buf[1]);
605 		}
606 
607 		if (SYN_CAP_FOUR_BUTTON(priv->capabilities)) {
608 			hw->up   = ((buf[0] ^ buf[3]) & 0x01) ? 1 : 0;
609 			hw->down = ((buf[0] ^ buf[3]) & 0x02) ? 1 : 0;
610 		}
611 
612 		if ((SYN_CAP_ADV_GESTURE(priv->ext_cap_0c) ||
613 			SYN_CAP_IMAGE_SENSOR(priv->ext_cap_0c)) &&
614 		    hw->w == 2) {
615 			synaptics_parse_agm(buf, priv, hw);
616 			return 1;
617 		}
618 
619 		hw->x = (((buf[3] & 0x10) << 8) |
620 			 ((buf[1] & 0x0f) << 8) |
621 			 buf[4]);
622 		hw->y = (((buf[3] & 0x20) << 7) |
623 			 ((buf[1] & 0xf0) << 4) |
624 			 buf[5]);
625 		hw->z = buf[2];
626 
627 		if (SYN_CAP_MULTI_BUTTON_NO(priv->ext_cap) &&
628 		    ((buf[0] ^ buf[3]) & 0x02)) {
629 			switch (SYN_CAP_MULTI_BUTTON_NO(priv->ext_cap) & ~0x01) {
630 			default:
631 				/*
632 				 * if nExtBtn is greater than 8 it should be
633 				 * considered invalid and treated as 0
634 				 */
635 				break;
636 			case 8:
637 				hw->ext_buttons |= ((buf[5] & 0x08)) ? 0x80 : 0;
638 				hw->ext_buttons |= ((buf[4] & 0x08)) ? 0x40 : 0;
639 			case 6:
640 				hw->ext_buttons |= ((buf[5] & 0x04)) ? 0x20 : 0;
641 				hw->ext_buttons |= ((buf[4] & 0x04)) ? 0x10 : 0;
642 			case 4:
643 				hw->ext_buttons |= ((buf[5] & 0x02)) ? 0x08 : 0;
644 				hw->ext_buttons |= ((buf[4] & 0x02)) ? 0x04 : 0;
645 			case 2:
646 				hw->ext_buttons |= ((buf[5] & 0x01)) ? 0x02 : 0;
647 				hw->ext_buttons |= ((buf[4] & 0x01)) ? 0x01 : 0;
648 			}
649 		}
650 	} else {
651 		hw->x = (((buf[1] & 0x1f) << 8) | buf[2]);
652 		hw->y = (((buf[4] & 0x1f) << 8) | buf[5]);
653 
654 		hw->z = (((buf[0] & 0x30) << 2) | (buf[3] & 0x3F));
655 		hw->w = (((buf[1] & 0x80) >> 4) | ((buf[0] & 0x04) >> 1));
656 
657 		hw->left  = (buf[0] & 0x01) ? 1 : 0;
658 		hw->right = (buf[0] & 0x02) ? 1 : 0;
659 	}
660 
661 	/*
662 	 * Convert wrap-around values to negative. (X|Y)_MAX_POSITIVE
663 	 * is used by some firmware to indicate a finger at the edge of
664 	 * the touchpad whose precise position cannot be determined, so
665 	 * convert these values to the maximum axis value.
666 	 */
667 	if (hw->x > X_MAX_POSITIVE)
668 		hw->x -= 1 << ABS_POS_BITS;
669 	else if (hw->x == X_MAX_POSITIVE)
670 		hw->x = XMAX;
671 
672 	if (hw->y > Y_MAX_POSITIVE)
673 		hw->y -= 1 << ABS_POS_BITS;
674 	else if (hw->y == Y_MAX_POSITIVE)
675 		hw->y = YMAX;
676 
677 	return 0;
678 }
679 
680 static void synaptics_report_semi_mt_slot(struct input_dev *dev, int slot,
681 					  bool active, int x, int y)
682 {
683 	input_mt_slot(dev, slot);
684 	input_mt_report_slot_state(dev, MT_TOOL_FINGER, active);
685 	if (active) {
686 		input_report_abs(dev, ABS_MT_POSITION_X, x);
687 		input_report_abs(dev, ABS_MT_POSITION_Y, synaptics_invert_y(y));
688 	}
689 }
690 
691 static void synaptics_report_semi_mt_data(struct input_dev *dev,
692 					  const struct synaptics_hw_state *a,
693 					  const struct synaptics_hw_state *b,
694 					  int num_fingers)
695 {
696 	if (num_fingers >= 2) {
697 		synaptics_report_semi_mt_slot(dev, 0, true, min(a->x, b->x),
698 					      min(a->y, b->y));
699 		synaptics_report_semi_mt_slot(dev, 1, true, max(a->x, b->x),
700 					      max(a->y, b->y));
701 	} else if (num_fingers == 1) {
702 		synaptics_report_semi_mt_slot(dev, 0, true, a->x, a->y);
703 		synaptics_report_semi_mt_slot(dev, 1, false, 0, 0);
704 	} else {
705 		synaptics_report_semi_mt_slot(dev, 0, false, 0, 0);
706 		synaptics_report_semi_mt_slot(dev, 1, false, 0, 0);
707 	}
708 }
709 
710 static void synaptics_report_buttons(struct psmouse *psmouse,
711 				     const struct synaptics_hw_state *hw)
712 {
713 	struct input_dev *dev = psmouse->dev;
714 	struct synaptics_data *priv = psmouse->private;
715 	int i;
716 
717 	input_report_key(dev, BTN_LEFT, hw->left);
718 	input_report_key(dev, BTN_RIGHT, hw->right);
719 
720 	if (SYN_CAP_MIDDLE_BUTTON(priv->capabilities))
721 		input_report_key(dev, BTN_MIDDLE, hw->middle);
722 
723 	if (SYN_CAP_FOUR_BUTTON(priv->capabilities)) {
724 		input_report_key(dev, BTN_FORWARD, hw->up);
725 		input_report_key(dev, BTN_BACK, hw->down);
726 	}
727 
728 	for (i = 0; i < SYN_CAP_MULTI_BUTTON_NO(priv->ext_cap); i++)
729 		input_report_key(dev, BTN_0 + i, hw->ext_buttons & (1 << i));
730 }
731 
732 static void synaptics_report_slot(struct input_dev *dev, int slot,
733 				  const struct synaptics_hw_state *hw)
734 {
735 	input_mt_slot(dev, slot);
736 	input_mt_report_slot_state(dev, MT_TOOL_FINGER, (hw != NULL));
737 	if (!hw)
738 		return;
739 
740 	input_report_abs(dev, ABS_MT_POSITION_X, hw->x);
741 	input_report_abs(dev, ABS_MT_POSITION_Y, synaptics_invert_y(hw->y));
742 	input_report_abs(dev, ABS_MT_PRESSURE, hw->z);
743 }
744 
745 static void synaptics_report_mt_data(struct psmouse *psmouse,
746 				     struct synaptics_mt_state *mt_state,
747 				     const struct synaptics_hw_state *sgm)
748 {
749 	struct input_dev *dev = psmouse->dev;
750 	struct synaptics_data *priv = psmouse->private;
751 	struct synaptics_hw_state *agm = &priv->agm;
752 	struct synaptics_mt_state *old = &priv->mt_state;
753 
754 	switch (mt_state->count) {
755 	case 0:
756 		synaptics_report_slot(dev, 0, NULL);
757 		synaptics_report_slot(dev, 1, NULL);
758 		break;
759 	case 1:
760 		if (mt_state->sgm == -1) {
761 			synaptics_report_slot(dev, 0, NULL);
762 			synaptics_report_slot(dev, 1, NULL);
763 		} else if (mt_state->sgm == 0) {
764 			synaptics_report_slot(dev, 0, sgm);
765 			synaptics_report_slot(dev, 1, NULL);
766 		} else {
767 			synaptics_report_slot(dev, 0, NULL);
768 			synaptics_report_slot(dev, 1, sgm);
769 		}
770 		break;
771 	default:
772 		/*
773 		 * If the finger slot contained in SGM is valid, and either
774 		 * hasn't changed, or is new, or the old SGM has now moved to
775 		 * AGM, then report SGM in MTB slot 0.
776 		 * Otherwise, empty MTB slot 0.
777 		 */
778 		if (mt_state->sgm != -1 &&
779 		    (mt_state->sgm == old->sgm ||
780 		     old->sgm == -1 || mt_state->agm == old->sgm))
781 			synaptics_report_slot(dev, 0, sgm);
782 		else
783 			synaptics_report_slot(dev, 0, NULL);
784 
785 		/*
786 		 * If the finger slot contained in AGM is valid, and either
787 		 * hasn't changed, or is new, then report AGM in MTB slot 1.
788 		 * Otherwise, empty MTB slot 1.
789 		 *
790 		 * However, in the case where the AGM is new, make sure that
791 		 * that it is either the same as the old SGM, or there was no
792 		 * SGM.
793 		 *
794 		 * Otherwise, if the SGM was just 1, and the new AGM is 2, then
795 		 * the new AGM will keep the old SGM's tracking ID, which can
796 		 * cause apparent drumroll.  This happens if in the following
797 		 * valid finger sequence:
798 		 *
799 		 *  Action                 SGM  AGM (MTB slot:Contact)
800 		 *  1. Touch contact 0    (0:0)
801 		 *  2. Touch contact 1    (0:0, 1:1)
802 		 *  3. Lift  contact 0    (1:1)
803 		 *  4. Touch contacts 2,3 (0:2, 1:3)
804 		 *
805 		 * In step 4, contact 3, in AGM must not be given the same
806 		 * tracking ID as contact 1 had in step 3.  To avoid this,
807 		 * the first agm with contact 3 is dropped and slot 1 is
808 		 * invalidated (tracking ID = -1).
809 		 */
810 		if (mt_state->agm != -1 &&
811 		    (mt_state->agm == old->agm ||
812 		     (old->agm == -1 &&
813 		      (old->sgm == -1 || mt_state->agm == old->sgm))))
814 			synaptics_report_slot(dev, 1, agm);
815 		else
816 			synaptics_report_slot(dev, 1, NULL);
817 		break;
818 	}
819 
820 	/* Don't use active slot count to generate BTN_TOOL events. */
821 	input_mt_report_pointer_emulation(dev, false);
822 
823 	/* Send the number of fingers reported by touchpad itself. */
824 	input_mt_report_finger_count(dev, mt_state->count);
825 
826 	synaptics_report_buttons(psmouse, sgm);
827 
828 	input_sync(dev);
829 }
830 
831 /* Handle case where mt_state->count = 0 */
832 static void synaptics_image_sensor_0f(struct synaptics_data *priv,
833 				      struct synaptics_mt_state *mt_state)
834 {
835 	synaptics_mt_state_set(mt_state, 0, -1, -1);
836 	priv->mt_state_lost = false;
837 }
838 
839 /* Handle case where mt_state->count = 1 */
840 static void synaptics_image_sensor_1f(struct synaptics_data *priv,
841 				      struct synaptics_mt_state *mt_state)
842 {
843 	struct synaptics_hw_state *agm = &priv->agm;
844 	struct synaptics_mt_state *old = &priv->mt_state;
845 
846 	/*
847 	 * If the last AGM was (0,0,0), and there is only one finger left,
848 	 * then we absolutely know that SGM contains slot 0, and all other
849 	 * fingers have been removed.
850 	 */
851 	if (priv->agm_pending && agm->z == 0) {
852 		synaptics_mt_state_set(mt_state, 1, 0, -1);
853 		priv->mt_state_lost = false;
854 		return;
855 	}
856 
857 	switch (old->count) {
858 	case 0:
859 		synaptics_mt_state_set(mt_state, 1, 0, -1);
860 		break;
861 	case 1:
862 		/*
863 		 * If mt_state_lost, then the previous transition was 3->1,
864 		 * and SGM now contains either slot 0 or 1, but we don't know
865 		 * which.  So, we just assume that the SGM now contains slot 1.
866 		 *
867 		 * If pending AGM and either:
868 		 *   (a) the previous SGM slot contains slot 0, or
869 		 *   (b) there was no SGM slot
870 		 * then, the SGM now contains slot 1
871 		 *
872 		 * Case (a) happens with very rapid "drum roll" gestures, where
873 		 * slot 0 finger is lifted and a new slot 1 finger touches
874 		 * within one reporting interval.
875 		 *
876 		 * Case (b) happens if initially two or more fingers tap
877 		 * briefly, and all but one lift before the end of the first
878 		 * reporting interval.
879 		 *
880 		 * (In both these cases, slot 0 will becomes empty, so SGM
881 		 * contains slot 1 with the new finger)
882 		 *
883 		 * Else, if there was no previous SGM, it now contains slot 0.
884 		 *
885 		 * Otherwise, SGM still contains the same slot.
886 		 */
887 		if (priv->mt_state_lost ||
888 		    (priv->agm_pending && old->sgm <= 0))
889 			synaptics_mt_state_set(mt_state, 1, 1, -1);
890 		else if (old->sgm == -1)
891 			synaptics_mt_state_set(mt_state, 1, 0, -1);
892 		break;
893 	case 2:
894 		/*
895 		 * If mt_state_lost, we don't know which finger SGM contains.
896 		 *
897 		 * So, report 1 finger, but with both slots empty.
898 		 * We will use slot 1 on subsequent 1->1
899 		 */
900 		if (priv->mt_state_lost) {
901 			synaptics_mt_state_set(mt_state, 1, -1, -1);
902 			break;
903 		}
904 		/*
905 		 * Since the last AGM was NOT (0,0,0), it was the finger in
906 		 * slot 0 that has been removed.
907 		 * So, SGM now contains previous AGM's slot, and AGM is now
908 		 * empty.
909 		 */
910 		synaptics_mt_state_set(mt_state, 1, old->agm, -1);
911 		break;
912 	case 3:
913 		/*
914 		 * Since last AGM was not (0,0,0), we don't know which finger
915 		 * is left.
916 		 *
917 		 * So, report 1 finger, but with both slots empty.
918 		 * We will use slot 1 on subsequent 1->1
919 		 */
920 		synaptics_mt_state_set(mt_state, 1, -1, -1);
921 		priv->mt_state_lost = true;
922 		break;
923 	case 4:
924 	case 5:
925 		/* mt_state was updated by AGM-CONTACT packet */
926 		break;
927 	}
928 }
929 
930 /* Handle case where mt_state->count = 2 */
931 static void synaptics_image_sensor_2f(struct synaptics_data *priv,
932 				      struct synaptics_mt_state *mt_state)
933 {
934 	struct synaptics_mt_state *old = &priv->mt_state;
935 
936 	switch (old->count) {
937 	case 0:
938 		synaptics_mt_state_set(mt_state, 2, 0, 1);
939 		break;
940 	case 1:
941 		/*
942 		 * If previous SGM contained slot 1 or higher, SGM now contains
943 		 * slot 0 (the newly touching finger) and AGM contains SGM's
944 		 * previous slot.
945 		 *
946 		 * Otherwise, SGM still contains slot 0 and AGM now contains
947 		 * slot 1.
948 		 */
949 		if (old->sgm >= 1)
950 			synaptics_mt_state_set(mt_state, 2, 0, old->sgm);
951 		else
952 			synaptics_mt_state_set(mt_state, 2, 0, 1);
953 		break;
954 	case 2:
955 		/*
956 		 * If mt_state_lost, SGM now contains either finger 1 or 2, but
957 		 * we don't know which.
958 		 * So, we just assume that the SGM contains slot 0 and AGM 1.
959 		 */
960 		if (priv->mt_state_lost)
961 			synaptics_mt_state_set(mt_state, 2, 0, 1);
962 		/*
963 		 * Otherwise, use the same mt_state, since it either hasn't
964 		 * changed, or was updated by a recently received AGM-CONTACT
965 		 * packet.
966 		 */
967 		break;
968 	case 3:
969 		/*
970 		 * 3->2 transitions have two unsolvable problems:
971 		 *  1) no indication is given which finger was removed
972 		 *  2) no way to tell if agm packet was for finger 3
973 		 *     before 3->2, or finger 2 after 3->2.
974 		 *
975 		 * So, report 2 fingers, but empty all slots.
976 		 * We will guess slots [0,1] on subsequent 2->2.
977 		 */
978 		synaptics_mt_state_set(mt_state, 2, -1, -1);
979 		priv->mt_state_lost = true;
980 		break;
981 	case 4:
982 	case 5:
983 		/* mt_state was updated by AGM-CONTACT packet */
984 		break;
985 	}
986 }
987 
988 /* Handle case where mt_state->count = 3 */
989 static void synaptics_image_sensor_3f(struct synaptics_data *priv,
990 				      struct synaptics_mt_state *mt_state)
991 {
992 	struct synaptics_mt_state *old = &priv->mt_state;
993 
994 	switch (old->count) {
995 	case 0:
996 		synaptics_mt_state_set(mt_state, 3, 0, 2);
997 		break;
998 	case 1:
999 		/*
1000 		 * If previous SGM contained slot 2 or higher, SGM now contains
1001 		 * slot 0 (one of the newly touching fingers) and AGM contains
1002 		 * SGM's previous slot.
1003 		 *
1004 		 * Otherwise, SGM now contains slot 0 and AGM contains slot 2.
1005 		 */
1006 		if (old->sgm >= 2)
1007 			synaptics_mt_state_set(mt_state, 3, 0, old->sgm);
1008 		else
1009 			synaptics_mt_state_set(mt_state, 3, 0, 2);
1010 		break;
1011 	case 2:
1012 		/*
1013 		 * If the AGM previously contained slot 3 or higher, then the
1014 		 * newly touching finger is in the lowest available slot.
1015 		 *
1016 		 * If SGM was previously 1 or higher, then the new SGM is
1017 		 * now slot 0 (with a new finger), otherwise, the new finger
1018 		 * is now in a hidden slot between 0 and AGM's slot.
1019 		 *
1020 		 * In all such cases, the SGM now contains slot 0, and the AGM
1021 		 * continues to contain the same slot as before.
1022 		 */
1023 		if (old->agm >= 3) {
1024 			synaptics_mt_state_set(mt_state, 3, 0, old->agm);
1025 			break;
1026 		}
1027 
1028 		/*
1029 		 * After some 3->1 and all 3->2 transitions, we lose track
1030 		 * of which slot is reported by SGM and AGM.
1031 		 *
1032 		 * For 2->3 in this state, report 3 fingers, but empty all
1033 		 * slots, and we will guess (0,2) on a subsequent 0->3.
1034 		 *
1035 		 * To userspace, the resulting transition will look like:
1036 		 *    2:[0,1] -> 3:[-1,-1] -> 3:[0,2]
1037 		 */
1038 		if (priv->mt_state_lost) {
1039 			synaptics_mt_state_set(mt_state, 3, -1, -1);
1040 			break;
1041 		}
1042 
1043 		/*
1044 		 * If the (SGM,AGM) really previously contained slots (0, 1),
1045 		 * then we cannot know what slot was just reported by the AGM,
1046 		 * because the 2->3 transition can occur either before or after
1047 		 * the AGM packet. Thus, this most recent AGM could contain
1048 		 * either the same old slot 1 or the new slot 2.
1049 		 * Subsequent AGMs will be reporting slot 2.
1050 		 *
1051 		 * To userspace, the resulting transition will look like:
1052 		 *    2:[0,1] -> 3:[0,-1] -> 3:[0,2]
1053 		 */
1054 		synaptics_mt_state_set(mt_state, 3, 0, -1);
1055 		break;
1056 	case 3:
1057 		/*
1058 		 * If, for whatever reason, the previous agm was invalid,
1059 		 * Assume SGM now contains slot 0, AGM now contains slot 2.
1060 		 */
1061 		if (old->agm <= 2)
1062 			synaptics_mt_state_set(mt_state, 3, 0, 2);
1063 		/*
1064 		 * mt_state either hasn't changed, or was updated by a recently
1065 		 * received AGM-CONTACT packet.
1066 		 */
1067 		break;
1068 
1069 	case 4:
1070 	case 5:
1071 		/* mt_state was updated by AGM-CONTACT packet */
1072 		break;
1073 	}
1074 }
1075 
1076 /* Handle case where mt_state->count = 4, or = 5 */
1077 static void synaptics_image_sensor_45f(struct synaptics_data *priv,
1078 				       struct synaptics_mt_state *mt_state)
1079 {
1080 	/* mt_state was updated correctly by AGM-CONTACT packet */
1081 	priv->mt_state_lost = false;
1082 }
1083 
1084 static void synaptics_image_sensor_process(struct psmouse *psmouse,
1085 					   struct synaptics_hw_state *sgm)
1086 {
1087 	struct synaptics_data *priv = psmouse->private;
1088 	struct synaptics_hw_state *agm = &priv->agm;
1089 	struct synaptics_mt_state mt_state;
1090 
1091 	/* Initialize using current mt_state (as updated by last agm) */
1092 	mt_state = agm->mt_state;
1093 
1094 	/*
1095 	 * Update mt_state using the new finger count and current mt_state.
1096 	 */
1097 	if (sgm->z == 0)
1098 		synaptics_image_sensor_0f(priv, &mt_state);
1099 	else if (sgm->w >= 4)
1100 		synaptics_image_sensor_1f(priv, &mt_state);
1101 	else if (sgm->w == 0)
1102 		synaptics_image_sensor_2f(priv, &mt_state);
1103 	else if (sgm->w == 1 && mt_state.count <= 3)
1104 		synaptics_image_sensor_3f(priv, &mt_state);
1105 	else
1106 		synaptics_image_sensor_45f(priv, &mt_state);
1107 
1108 	/* Send resulting input events to user space */
1109 	synaptics_report_mt_data(psmouse, &mt_state, sgm);
1110 
1111 	/* Store updated mt_state */
1112 	priv->mt_state = agm->mt_state = mt_state;
1113 	priv->agm_pending = false;
1114 }
1115 
1116 /*
1117  *  called for each full received packet from the touchpad
1118  */
1119 static void synaptics_process_packet(struct psmouse *psmouse)
1120 {
1121 	struct input_dev *dev = psmouse->dev;
1122 	struct synaptics_data *priv = psmouse->private;
1123 	struct synaptics_hw_state hw;
1124 	int num_fingers;
1125 	int finger_width;
1126 
1127 	if (synaptics_parse_hw_state(psmouse->packet, priv, &hw))
1128 		return;
1129 
1130 	if (SYN_CAP_IMAGE_SENSOR(priv->ext_cap_0c)) {
1131 		synaptics_image_sensor_process(psmouse, &hw);
1132 		return;
1133 	}
1134 
1135 	if (hw.scroll) {
1136 		priv->scroll += hw.scroll;
1137 
1138 		while (priv->scroll >= 4) {
1139 			input_report_key(dev, BTN_BACK, !hw.down);
1140 			input_sync(dev);
1141 			input_report_key(dev, BTN_BACK, hw.down);
1142 			input_sync(dev);
1143 			priv->scroll -= 4;
1144 		}
1145 		while (priv->scroll <= -4) {
1146 			input_report_key(dev, BTN_FORWARD, !hw.up);
1147 			input_sync(dev);
1148 			input_report_key(dev, BTN_FORWARD, hw.up);
1149 			input_sync(dev);
1150 			priv->scroll += 4;
1151 		}
1152 		return;
1153 	}
1154 
1155 	if (hw.z > 0 && hw.x > 1) {
1156 		num_fingers = 1;
1157 		finger_width = 5;
1158 		if (SYN_CAP_EXTENDED(priv->capabilities)) {
1159 			switch (hw.w) {
1160 			case 0 ... 1:
1161 				if (SYN_CAP_MULTIFINGER(priv->capabilities))
1162 					num_fingers = hw.w + 2;
1163 				break;
1164 			case 2:
1165 				if (SYN_MODEL_PEN(priv->model_id))
1166 					;   /* Nothing, treat a pen as a single finger */
1167 				break;
1168 			case 4 ... 15:
1169 				if (SYN_CAP_PALMDETECT(priv->capabilities))
1170 					finger_width = hw.w;
1171 				break;
1172 			}
1173 		}
1174 	} else {
1175 		num_fingers = 0;
1176 		finger_width = 0;
1177 	}
1178 
1179 	if (SYN_CAP_ADV_GESTURE(priv->ext_cap_0c))
1180 		synaptics_report_semi_mt_data(dev, &hw, &priv->agm,
1181 					      num_fingers);
1182 
1183 	/* Post events
1184 	 * BTN_TOUCH has to be first as mousedev relies on it when doing
1185 	 * absolute -> relative conversion
1186 	 */
1187 	if (hw.z > 30) input_report_key(dev, BTN_TOUCH, 1);
1188 	if (hw.z < 25) input_report_key(dev, BTN_TOUCH, 0);
1189 
1190 	if (num_fingers > 0) {
1191 		input_report_abs(dev, ABS_X, hw.x);
1192 		input_report_abs(dev, ABS_Y, synaptics_invert_y(hw.y));
1193 	}
1194 	input_report_abs(dev, ABS_PRESSURE, hw.z);
1195 
1196 	if (SYN_CAP_PALMDETECT(priv->capabilities))
1197 		input_report_abs(dev, ABS_TOOL_WIDTH, finger_width);
1198 
1199 	input_report_key(dev, BTN_TOOL_FINGER, num_fingers == 1);
1200 	if (SYN_CAP_MULTIFINGER(priv->capabilities)) {
1201 		input_report_key(dev, BTN_TOOL_DOUBLETAP, num_fingers == 2);
1202 		input_report_key(dev, BTN_TOOL_TRIPLETAP, num_fingers == 3);
1203 	}
1204 
1205 	synaptics_report_buttons(psmouse, &hw);
1206 
1207 	input_sync(dev);
1208 }
1209 
1210 static int synaptics_validate_byte(struct psmouse *psmouse,
1211 				   int idx, unsigned char pkt_type)
1212 {
1213 	static const unsigned char newabs_mask[]	= { 0xC8, 0x00, 0x00, 0xC8, 0x00 };
1214 	static const unsigned char newabs_rel_mask[]	= { 0xC0, 0x00, 0x00, 0xC0, 0x00 };
1215 	static const unsigned char newabs_rslt[]	= { 0x80, 0x00, 0x00, 0xC0, 0x00 };
1216 	static const unsigned char oldabs_mask[]	= { 0xC0, 0x60, 0x00, 0xC0, 0x60 };
1217 	static const unsigned char oldabs_rslt[]	= { 0xC0, 0x00, 0x00, 0x80, 0x00 };
1218 	const char *packet = psmouse->packet;
1219 
1220 	if (idx < 0 || idx > 4)
1221 		return 0;
1222 
1223 	switch (pkt_type) {
1224 
1225 	case SYN_NEWABS:
1226 	case SYN_NEWABS_RELAXED:
1227 		return (packet[idx] & newabs_rel_mask[idx]) == newabs_rslt[idx];
1228 
1229 	case SYN_NEWABS_STRICT:
1230 		return (packet[idx] & newabs_mask[idx]) == newabs_rslt[idx];
1231 
1232 	case SYN_OLDABS:
1233 		return (packet[idx] & oldabs_mask[idx]) == oldabs_rslt[idx];
1234 
1235 	default:
1236 		psmouse_err(psmouse, "unknown packet type %d\n", pkt_type);
1237 		return 0;
1238 	}
1239 }
1240 
1241 static unsigned char synaptics_detect_pkt_type(struct psmouse *psmouse)
1242 {
1243 	int i;
1244 
1245 	for (i = 0; i < 5; i++)
1246 		if (!synaptics_validate_byte(psmouse, i, SYN_NEWABS_STRICT)) {
1247 			psmouse_info(psmouse, "using relaxed packet validation\n");
1248 			return SYN_NEWABS_RELAXED;
1249 		}
1250 
1251 	return SYN_NEWABS_STRICT;
1252 }
1253 
1254 static psmouse_ret_t synaptics_process_byte(struct psmouse *psmouse)
1255 {
1256 	struct synaptics_data *priv = psmouse->private;
1257 
1258 	if (psmouse->pktcnt >= 6) { /* Full packet received */
1259 		if (unlikely(priv->pkt_type == SYN_NEWABS))
1260 			priv->pkt_type = synaptics_detect_pkt_type(psmouse);
1261 
1262 		if (SYN_CAP_PASS_THROUGH(priv->capabilities) &&
1263 		    synaptics_is_pt_packet(psmouse->packet)) {
1264 			if (priv->pt_port)
1265 				synaptics_pass_pt_packet(priv->pt_port, psmouse->packet);
1266 		} else
1267 			synaptics_process_packet(psmouse);
1268 
1269 		return PSMOUSE_FULL_PACKET;
1270 	}
1271 
1272 	return synaptics_validate_byte(psmouse, psmouse->pktcnt - 1, priv->pkt_type) ?
1273 		PSMOUSE_GOOD_DATA : PSMOUSE_BAD_DATA;
1274 }
1275 
1276 /*****************************************************************************
1277  *	Driver initialization/cleanup functions
1278  ****************************************************************************/
1279 static void set_abs_position_params(struct input_dev *dev,
1280 				    struct synaptics_data *priv, int x_code,
1281 				    int y_code)
1282 {
1283 	int x_min = priv->x_min ?: XMIN_NOMINAL;
1284 	int x_max = priv->x_max ?: XMAX_NOMINAL;
1285 	int y_min = priv->y_min ?: YMIN_NOMINAL;
1286 	int y_max = priv->y_max ?: YMAX_NOMINAL;
1287 	int fuzz = SYN_CAP_REDUCED_FILTERING(priv->ext_cap_0c) ?
1288 			SYN_REDUCED_FILTER_FUZZ : 0;
1289 
1290 	input_set_abs_params(dev, x_code, x_min, x_max, fuzz, 0);
1291 	input_set_abs_params(dev, y_code, y_min, y_max, fuzz, 0);
1292 	input_abs_set_res(dev, x_code, priv->x_res);
1293 	input_abs_set_res(dev, y_code, priv->y_res);
1294 }
1295 
1296 static void set_input_params(struct psmouse *psmouse,
1297 			     struct synaptics_data *priv)
1298 {
1299 	struct input_dev *dev = psmouse->dev;
1300 	int i;
1301 
1302 	/* Things that apply to both modes */
1303 	__set_bit(INPUT_PROP_POINTER, dev->propbit);
1304 	__set_bit(EV_KEY, dev->evbit);
1305 	__set_bit(BTN_LEFT, dev->keybit);
1306 	__set_bit(BTN_RIGHT, dev->keybit);
1307 
1308 	if (SYN_CAP_MIDDLE_BUTTON(priv->capabilities))
1309 		__set_bit(BTN_MIDDLE, dev->keybit);
1310 
1311 	if (!priv->absolute_mode) {
1312 		/* Relative mode */
1313 		__set_bit(EV_REL, dev->evbit);
1314 		__set_bit(REL_X, dev->relbit);
1315 		__set_bit(REL_Y, dev->relbit);
1316 		return;
1317 	}
1318 
1319 	/* Absolute mode */
1320 	__set_bit(EV_ABS, dev->evbit);
1321 	set_abs_position_params(dev, priv, ABS_X, ABS_Y);
1322 	input_set_abs_params(dev, ABS_PRESSURE, 0, 255, 0, 0);
1323 
1324 	if (SYN_CAP_IMAGE_SENSOR(priv->ext_cap_0c)) {
1325 		set_abs_position_params(dev, priv, ABS_MT_POSITION_X,
1326 					ABS_MT_POSITION_Y);
1327 		/* Image sensors can report per-contact pressure */
1328 		input_set_abs_params(dev, ABS_MT_PRESSURE, 0, 255, 0, 0);
1329 		input_mt_init_slots(dev, 2, INPUT_MT_POINTER);
1330 
1331 		/* Image sensors can signal 4 and 5 finger clicks */
1332 		__set_bit(BTN_TOOL_QUADTAP, dev->keybit);
1333 		__set_bit(BTN_TOOL_QUINTTAP, dev->keybit);
1334 	} else if (SYN_CAP_ADV_GESTURE(priv->ext_cap_0c)) {
1335 		/* Non-image sensors with AGM use semi-mt */
1336 		__set_bit(INPUT_PROP_SEMI_MT, dev->propbit);
1337 		input_mt_init_slots(dev, 2, 0);
1338 		set_abs_position_params(dev, priv, ABS_MT_POSITION_X,
1339 					ABS_MT_POSITION_Y);
1340 	}
1341 
1342 	if (SYN_CAP_PALMDETECT(priv->capabilities))
1343 		input_set_abs_params(dev, ABS_TOOL_WIDTH, 0, 15, 0, 0);
1344 
1345 	__set_bit(BTN_TOUCH, dev->keybit);
1346 	__set_bit(BTN_TOOL_FINGER, dev->keybit);
1347 
1348 	if (SYN_CAP_MULTIFINGER(priv->capabilities)) {
1349 		__set_bit(BTN_TOOL_DOUBLETAP, dev->keybit);
1350 		__set_bit(BTN_TOOL_TRIPLETAP, dev->keybit);
1351 	}
1352 
1353 	if (SYN_CAP_FOUR_BUTTON(priv->capabilities) ||
1354 	    SYN_CAP_MIDDLE_BUTTON(priv->capabilities)) {
1355 		__set_bit(BTN_FORWARD, dev->keybit);
1356 		__set_bit(BTN_BACK, dev->keybit);
1357 	}
1358 
1359 	for (i = 0; i < SYN_CAP_MULTI_BUTTON_NO(priv->ext_cap); i++)
1360 		__set_bit(BTN_0 + i, dev->keybit);
1361 
1362 	__clear_bit(EV_REL, dev->evbit);
1363 	__clear_bit(REL_X, dev->relbit);
1364 	__clear_bit(REL_Y, dev->relbit);
1365 
1366 	if (SYN_CAP_CLICKPAD(priv->ext_cap_0c)) {
1367 		__set_bit(INPUT_PROP_BUTTONPAD, dev->propbit);
1368 		/* See if this buttonpad has a top button area */
1369 		if (!strncmp(psmouse->ps2dev.serio->firmware_id, "PNP:", 4)) {
1370 			for (i = 0; topbuttonpad_pnp_ids[i]; i++) {
1371 				if (strstr(psmouse->ps2dev.serio->firmware_id,
1372 					   topbuttonpad_pnp_ids[i])) {
1373 					__set_bit(INPUT_PROP_TOPBUTTONPAD,
1374 						  dev->propbit);
1375 					break;
1376 				}
1377 			}
1378 		}
1379 		/* Clickpads report only left button */
1380 		__clear_bit(BTN_RIGHT, dev->keybit);
1381 		__clear_bit(BTN_MIDDLE, dev->keybit);
1382 	}
1383 }
1384 
1385 static ssize_t synaptics_show_disable_gesture(struct psmouse *psmouse,
1386 					      void *data, char *buf)
1387 {
1388 	struct synaptics_data *priv = psmouse->private;
1389 
1390 	return sprintf(buf, "%c\n", priv->disable_gesture ? '1' : '0');
1391 }
1392 
1393 static ssize_t synaptics_set_disable_gesture(struct psmouse *psmouse,
1394 					     void *data, const char *buf,
1395 					     size_t len)
1396 {
1397 	struct synaptics_data *priv = psmouse->private;
1398 	unsigned int value;
1399 	int err;
1400 
1401 	err = kstrtouint(buf, 10, &value);
1402 	if (err)
1403 		return err;
1404 
1405 	if (value > 1)
1406 		return -EINVAL;
1407 
1408 	if (value == priv->disable_gesture)
1409 		return len;
1410 
1411 	priv->disable_gesture = value;
1412 	if (value)
1413 		priv->mode |= SYN_BIT_DISABLE_GESTURE;
1414 	else
1415 		priv->mode &= ~SYN_BIT_DISABLE_GESTURE;
1416 
1417 	if (synaptics_mode_cmd(psmouse, priv->mode))
1418 		return -EIO;
1419 
1420 	return len;
1421 }
1422 
1423 PSMOUSE_DEFINE_ATTR(disable_gesture, S_IWUSR | S_IRUGO, NULL,
1424 		    synaptics_show_disable_gesture,
1425 		    synaptics_set_disable_gesture);
1426 
1427 static void synaptics_disconnect(struct psmouse *psmouse)
1428 {
1429 	struct synaptics_data *priv = psmouse->private;
1430 
1431 	if (!priv->absolute_mode && SYN_ID_DISGEST_SUPPORTED(priv->identity))
1432 		device_remove_file(&psmouse->ps2dev.serio->dev,
1433 				   &psmouse_attr_disable_gesture.dattr);
1434 
1435 	synaptics_reset(psmouse);
1436 	kfree(priv);
1437 	psmouse->private = NULL;
1438 }
1439 
1440 static int synaptics_reconnect(struct psmouse *psmouse)
1441 {
1442 	struct synaptics_data *priv = psmouse->private;
1443 	struct synaptics_data old_priv = *priv;
1444 	unsigned char param[2];
1445 	int retry = 0;
1446 	int error;
1447 
1448 	do {
1449 		psmouse_reset(psmouse);
1450 		if (retry) {
1451 			/*
1452 			 * On some boxes, right after resuming, the touchpad
1453 			 * needs some time to finish initializing (I assume
1454 			 * it needs time to calibrate) and start responding
1455 			 * to Synaptics-specific queries, so let's wait a
1456 			 * bit.
1457 			 */
1458 			ssleep(1);
1459 		}
1460 		ps2_command(&psmouse->ps2dev, param, PSMOUSE_CMD_GETID);
1461 		error = synaptics_detect(psmouse, 0);
1462 	} while (error && ++retry < 3);
1463 
1464 	if (error)
1465 		return -1;
1466 
1467 	if (retry > 1)
1468 		psmouse_dbg(psmouse, "reconnected after %d tries\n", retry);
1469 
1470 	if (synaptics_query_hardware(psmouse)) {
1471 		psmouse_err(psmouse, "Unable to query device.\n");
1472 		return -1;
1473 	}
1474 
1475 	if (synaptics_set_mode(psmouse)) {
1476 		psmouse_err(psmouse, "Unable to initialize device.\n");
1477 		return -1;
1478 	}
1479 
1480 	if (old_priv.identity != priv->identity ||
1481 	    old_priv.model_id != priv->model_id ||
1482 	    old_priv.capabilities != priv->capabilities ||
1483 	    old_priv.ext_cap != priv->ext_cap) {
1484 		psmouse_err(psmouse,
1485 			    "hardware appears to be different: id(%ld-%ld), model(%ld-%ld), caps(%lx-%lx), ext(%lx-%lx).\n",
1486 			    old_priv.identity, priv->identity,
1487 			    old_priv.model_id, priv->model_id,
1488 			    old_priv.capabilities, priv->capabilities,
1489 			    old_priv.ext_cap, priv->ext_cap);
1490 		return -1;
1491 	}
1492 
1493 	return 0;
1494 }
1495 
1496 static bool impaired_toshiba_kbc;
1497 
1498 static const struct dmi_system_id toshiba_dmi_table[] __initconst = {
1499 #if defined(CONFIG_DMI) && defined(CONFIG_X86)
1500 	{
1501 		/* Toshiba Satellite */
1502 		.matches = {
1503 			DMI_MATCH(DMI_SYS_VENDOR, "TOSHIBA"),
1504 			DMI_MATCH(DMI_PRODUCT_NAME, "Satellite"),
1505 		},
1506 	},
1507 	{
1508 		/* Toshiba Dynabook */
1509 		.matches = {
1510 			DMI_MATCH(DMI_SYS_VENDOR, "TOSHIBA"),
1511 			DMI_MATCH(DMI_PRODUCT_NAME, "dynabook"),
1512 		},
1513 	},
1514 	{
1515 		/* Toshiba Portege M300 */
1516 		.matches = {
1517 			DMI_MATCH(DMI_SYS_VENDOR, "TOSHIBA"),
1518 			DMI_MATCH(DMI_PRODUCT_NAME, "PORTEGE M300"),
1519 		},
1520 
1521 	},
1522 	{
1523 		/* Toshiba Portege M300 */
1524 		.matches = {
1525 			DMI_MATCH(DMI_SYS_VENDOR, "TOSHIBA"),
1526 			DMI_MATCH(DMI_PRODUCT_NAME, "Portable PC"),
1527 			DMI_MATCH(DMI_PRODUCT_VERSION, "Version 1.0"),
1528 		},
1529 
1530 	},
1531 #endif
1532 	{ }
1533 };
1534 
1535 static bool broken_olpc_ec;
1536 
1537 static const struct dmi_system_id olpc_dmi_table[] __initconst = {
1538 #if defined(CONFIG_DMI) && defined(CONFIG_OLPC)
1539 	{
1540 		/* OLPC XO-1 or XO-1.5 */
1541 		.matches = {
1542 			DMI_MATCH(DMI_SYS_VENDOR, "OLPC"),
1543 			DMI_MATCH(DMI_PRODUCT_NAME, "XO"),
1544 		},
1545 	},
1546 #endif
1547 	{ }
1548 };
1549 
1550 static const struct dmi_system_id min_max_dmi_table[] __initconst = {
1551 #if defined(CONFIG_DMI)
1552 	{
1553 		/* Lenovo ThinkPad Helix */
1554 		.matches = {
1555 			DMI_MATCH(DMI_SYS_VENDOR, "LENOVO"),
1556 			DMI_MATCH(DMI_PRODUCT_VERSION, "ThinkPad Helix"),
1557 		},
1558 		.driver_data = (int []){1024, 5052, 2258, 4832},
1559 	},
1560 	{
1561 		/* Lenovo ThinkPad X240 */
1562 		.matches = {
1563 			DMI_MATCH(DMI_SYS_VENDOR, "LENOVO"),
1564 			DMI_MATCH(DMI_PRODUCT_VERSION, "ThinkPad X240"),
1565 		},
1566 		.driver_data = (int []){1232, 5710, 1156, 4696},
1567 	},
1568 	{
1569 		/* Lenovo ThinkPad T431s */
1570 		.matches = {
1571 			DMI_MATCH(DMI_SYS_VENDOR, "LENOVO"),
1572 			DMI_MATCH(DMI_PRODUCT_VERSION, "ThinkPad T431"),
1573 		},
1574 		.driver_data = (int []){1024, 5112, 2024, 4832},
1575 	},
1576 	{
1577 		/* Lenovo ThinkPad T440s */
1578 		.matches = {
1579 			DMI_MATCH(DMI_SYS_VENDOR, "LENOVO"),
1580 			DMI_MATCH(DMI_PRODUCT_VERSION, "ThinkPad T440"),
1581 		},
1582 		.driver_data = (int []){1024, 5112, 2024, 4832},
1583 	},
1584 	{
1585 		/* Lenovo ThinkPad L440 */
1586 		.matches = {
1587 			DMI_MATCH(DMI_SYS_VENDOR, "LENOVO"),
1588 			DMI_MATCH(DMI_PRODUCT_VERSION, "ThinkPad L440"),
1589 		},
1590 		.driver_data = (int []){1024, 5112, 2024, 4832},
1591 	},
1592 	{
1593 		/* Lenovo ThinkPad T540p */
1594 		.matches = {
1595 			DMI_MATCH(DMI_SYS_VENDOR, "LENOVO"),
1596 			DMI_MATCH(DMI_PRODUCT_VERSION, "ThinkPad T540"),
1597 		},
1598 		.driver_data = (int []){1024, 5056, 2058, 4832},
1599 	},
1600 	{
1601 		/* Lenovo ThinkPad L540 */
1602 		.matches = {
1603 			DMI_MATCH(DMI_SYS_VENDOR, "LENOVO"),
1604 			DMI_MATCH(DMI_PRODUCT_VERSION, "ThinkPad L540"),
1605 		},
1606 		.driver_data = (int []){1024, 5112, 2024, 4832},
1607 	},
1608 	{
1609 		/* Lenovo Yoga S1 */
1610 		.matches = {
1611 			DMI_MATCH(DMI_SYS_VENDOR, "LENOVO"),
1612 			DMI_EXACT_MATCH(DMI_PRODUCT_VERSION,
1613 					"ThinkPad S1 Yoga"),
1614 		},
1615 		.driver_data = (int []){1232, 5710, 1156, 4696},
1616 	},
1617 	{
1618 		/* Lenovo ThinkPad X1 Carbon Haswell (3rd generation) */
1619 		.matches = {
1620 			DMI_MATCH(DMI_SYS_VENDOR, "LENOVO"),
1621 			DMI_MATCH(DMI_PRODUCT_VERSION,
1622 					"ThinkPad X1 Carbon 2nd"),
1623 		},
1624 		.driver_data = (int []){1024, 5112, 2024, 4832},
1625 	},
1626 #endif
1627 	{ }
1628 };
1629 
1630 void __init synaptics_module_init(void)
1631 {
1632 	const struct dmi_system_id *min_max_dmi;
1633 
1634 	impaired_toshiba_kbc = dmi_check_system(toshiba_dmi_table);
1635 	broken_olpc_ec = dmi_check_system(olpc_dmi_table);
1636 
1637 	min_max_dmi = dmi_first_match(min_max_dmi_table);
1638 	if (min_max_dmi)
1639 		quirk_min_max = min_max_dmi->driver_data;
1640 }
1641 
1642 static int __synaptics_init(struct psmouse *psmouse, bool absolute_mode)
1643 {
1644 	struct synaptics_data *priv;
1645 	int err = -1;
1646 
1647 	/*
1648 	 * The OLPC XO has issues with Synaptics' absolute mode; the constant
1649 	 * packet spew overloads the EC such that key presses on the keyboard
1650 	 * are missed.  Given that, don't even attempt to use Absolute mode.
1651 	 * Relative mode seems to work just fine.
1652 	 */
1653 	if (absolute_mode && broken_olpc_ec) {
1654 		psmouse_info(psmouse,
1655 			     "OLPC XO detected, not enabling Synaptics protocol.\n");
1656 		return -ENODEV;
1657 	}
1658 
1659 	psmouse->private = priv = kzalloc(sizeof(struct synaptics_data), GFP_KERNEL);
1660 	if (!priv)
1661 		return -ENOMEM;
1662 
1663 	psmouse_reset(psmouse);
1664 
1665 	if (synaptics_query_hardware(psmouse)) {
1666 		psmouse_err(psmouse, "Unable to query device.\n");
1667 		goto init_fail;
1668 	}
1669 
1670 	priv->absolute_mode = absolute_mode;
1671 	if (SYN_ID_DISGEST_SUPPORTED(priv->identity))
1672 		priv->disable_gesture = true;
1673 
1674 	if (synaptics_set_mode(psmouse)) {
1675 		psmouse_err(psmouse, "Unable to initialize device.\n");
1676 		goto init_fail;
1677 	}
1678 
1679 	priv->pkt_type = SYN_MODEL_NEWABS(priv->model_id) ? SYN_NEWABS : SYN_OLDABS;
1680 
1681 	psmouse_info(psmouse,
1682 		     "Touchpad model: %ld, fw: %ld.%ld, id: %#lx, caps: %#lx/%#lx/%#lx, board id: %lu, fw id: %lu\n",
1683 		     SYN_ID_MODEL(priv->identity),
1684 		     SYN_ID_MAJOR(priv->identity), SYN_ID_MINOR(priv->identity),
1685 		     priv->model_id,
1686 		     priv->capabilities, priv->ext_cap, priv->ext_cap_0c,
1687 		     priv->board_id, priv->firmware_id);
1688 
1689 	set_input_params(psmouse, priv);
1690 
1691 	/*
1692 	 * Encode touchpad model so that it can be used to set
1693 	 * input device->id.version and be visible to userspace.
1694 	 * Because version is __u16 we have to drop something.
1695 	 * Hardware info bits seem to be good candidates as they
1696 	 * are documented to be for Synaptics corp. internal use.
1697 	 */
1698 	psmouse->model = ((priv->model_id & 0x00ff0000) >> 8) |
1699 			  (priv->model_id & 0x000000ff);
1700 
1701 	if (absolute_mode) {
1702 		psmouse->protocol_handler = synaptics_process_byte;
1703 		psmouse->pktsize = 6;
1704 	} else {
1705 		/* Relative mode follows standard PS/2 mouse protocol */
1706 		psmouse->protocol_handler = psmouse_process_byte;
1707 		psmouse->pktsize = 3;
1708 	}
1709 
1710 	psmouse->set_rate = synaptics_set_rate;
1711 	psmouse->disconnect = synaptics_disconnect;
1712 	psmouse->reconnect = synaptics_reconnect;
1713 	psmouse->cleanup = synaptics_reset;
1714 	/* Synaptics can usually stay in sync without extra help */
1715 	psmouse->resync_time = 0;
1716 
1717 	if (SYN_CAP_PASS_THROUGH(priv->capabilities))
1718 		synaptics_pt_create(psmouse);
1719 
1720 	/*
1721 	 * Toshiba's KBC seems to have trouble handling data from
1722 	 * Synaptics at full rate.  Switch to a lower rate (roughly
1723 	 * the same rate as a standard PS/2 mouse).
1724 	 */
1725 	if (psmouse->rate >= 80 && impaired_toshiba_kbc) {
1726 		psmouse_info(psmouse,
1727 			     "Toshiba %s detected, limiting rate to 40pps.\n",
1728 			     dmi_get_system_info(DMI_PRODUCT_NAME));
1729 		psmouse->rate = 40;
1730 	}
1731 
1732 	if (!priv->absolute_mode && SYN_ID_DISGEST_SUPPORTED(priv->identity)) {
1733 		err = device_create_file(&psmouse->ps2dev.serio->dev,
1734 					 &psmouse_attr_disable_gesture.dattr);
1735 		if (err) {
1736 			psmouse_err(psmouse,
1737 				    "Failed to create disable_gesture attribute (%d)",
1738 				    err);
1739 			goto init_fail;
1740 		}
1741 	}
1742 
1743 	return 0;
1744 
1745  init_fail:
1746 	kfree(priv);
1747 	return err;
1748 }
1749 
1750 int synaptics_init(struct psmouse *psmouse)
1751 {
1752 	return __synaptics_init(psmouse, true);
1753 }
1754 
1755 int synaptics_init_relative(struct psmouse *psmouse)
1756 {
1757 	return __synaptics_init(psmouse, false);
1758 }
1759 
1760 bool synaptics_supported(void)
1761 {
1762 	return true;
1763 }
1764 
1765 #else /* CONFIG_MOUSE_PS2_SYNAPTICS */
1766 
1767 void __init synaptics_module_init(void)
1768 {
1769 }
1770 
1771 int synaptics_init(struct psmouse *psmouse)
1772 {
1773 	return -ENOSYS;
1774 }
1775 
1776 bool synaptics_supported(void)
1777 {
1778 	return false;
1779 }
1780 
1781 #endif /* CONFIG_MOUSE_PS2_SYNAPTICS */
1782