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