at v3.15-rc3 1781 lines 49 kB view raw
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 */ 77static 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 89int 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 113void 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. */ 121static 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 */ 168static 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 */ 176static 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 */ 189static 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 */ 204static 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 */ 218static 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 */ 233static 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 */ 289static 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 307static const int *quirk_min_max; 308 309static 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 357static 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 375static 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 396static 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 422static 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 ****************************************************************************/ 440static 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 452static 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 464static 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 474static int synaptics_is_pt_packet(unsigned char *buf) 475{ 476 return (buf[0] & 0xFC) == 0x84 && (buf[3] & 0xCC) == 0xC4; 477} 478 479static 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 493static 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 511static 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 541static 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 549static 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 579static 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 680static 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 691static 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 710static 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 732static 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 745static 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 */ 832static 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 */ 840static 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 */ 931static 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 */ 989static 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 */ 1077static 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 1084static 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 */ 1119static 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 1210static 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 1241static 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 1254static 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 ****************************************************************************/ 1279static 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 1296static 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 1385static 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 1393static 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 1423PSMOUSE_DEFINE_ATTR(disable_gesture, S_IWUSR | S_IRUGO, NULL, 1424 synaptics_show_disable_gesture, 1425 synaptics_set_disable_gesture); 1426 1427static 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 1440static 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 1496static bool impaired_toshiba_kbc; 1497 1498static 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 1535static bool broken_olpc_ec; 1536 1537static 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 1550static 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 1630void __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 1642static 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 1750int synaptics_init(struct psmouse *psmouse) 1751{ 1752 return __synaptics_init(psmouse, true); 1753} 1754 1755int synaptics_init_relative(struct psmouse *psmouse) 1756{ 1757 return __synaptics_init(psmouse, false); 1758} 1759 1760bool synaptics_supported(void) 1761{ 1762 return true; 1763} 1764 1765#else /* CONFIG_MOUSE_PS2_SYNAPTICS */ 1766 1767void __init synaptics_module_init(void) 1768{ 1769} 1770 1771int synaptics_init(struct psmouse *psmouse) 1772{ 1773 return -ENOSYS; 1774} 1775 1776bool synaptics_supported(void) 1777{ 1778 return false; 1779} 1780 1781#endif /* CONFIG_MOUSE_PS2_SYNAPTICS */