1 /* 2 * Elantech Touchpad driver (v6) 3 * 4 * Copyright (C) 2007-2009 Arjan Opmeer <arjan@opmeer.net> 5 * 6 * This program is free software; you can redistribute it and/or modify it 7 * under the terms of the GNU General Public License version 2 as published 8 * by the Free Software Foundation. 9 * 10 * Trademarks are the property of their respective owners. 11 */ 12 13 #define pr_fmt(fmt) KBUILD_BASENAME ": " fmt 14 15 #include <linux/delay.h> 16 #include <linux/slab.h> 17 #include <linux/module.h> 18 #include <linux/input.h> 19 #include <linux/serio.h> 20 #include <linux/libps2.h> 21 #include "psmouse.h" 22 #include "elantech.h" 23 24 #define elantech_debug(fmt, ...) \ 25 do { \ 26 if (etd->debug) \ 27 printk(KERN_DEBUG pr_fmt(fmt), ##__VA_ARGS__); \ 28 } while (0) 29 30 static bool force_elantech; 31 module_param_named(force_elantech, force_elantech, bool, 0644); 32 MODULE_PARM_DESC(force_elantech, "Force the Elantech PS/2 protocol extension to be used, 1 = enabled, 0 = disabled (default)."); 33 34 /* 35 * Send a Synaptics style sliced query command 36 */ 37 static int synaptics_send_cmd(struct psmouse *psmouse, unsigned char c, 38 unsigned char *param) 39 { 40 if (psmouse_sliced_command(psmouse, c) || 41 ps2_command(&psmouse->ps2dev, param, PSMOUSE_CMD_GETINFO)) { 42 pr_err("synaptics_send_cmd query 0x%02x failed.\n", c); 43 return -1; 44 } 45 46 return 0; 47 } 48 49 /* 50 * A retrying version of ps2_command 51 */ 52 static int elantech_ps2_command(struct psmouse *psmouse, 53 unsigned char *param, int command) 54 { 55 struct ps2dev *ps2dev = &psmouse->ps2dev; 56 struct elantech_data *etd = psmouse->private; 57 int rc; 58 int tries = ETP_PS2_COMMAND_TRIES; 59 60 do { 61 rc = ps2_command(ps2dev, param, command); 62 if (rc == 0) 63 break; 64 tries--; 65 elantech_debug("retrying ps2 command 0x%02x (%d).\n", 66 command, tries); 67 msleep(ETP_PS2_COMMAND_DELAY); 68 } while (tries > 0); 69 70 if (rc) 71 pr_err("ps2 command 0x%02x failed.\n", command); 72 73 return rc; 74 } 75 76 /* 77 * Send an Elantech style special command to read a value from a register 78 */ 79 static int elantech_read_reg(struct psmouse *psmouse, unsigned char reg, 80 unsigned char *val) 81 { 82 struct elantech_data *etd = psmouse->private; 83 unsigned char param[3]; 84 int rc = 0; 85 86 if (reg < 0x10 || reg > 0x26) 87 return -1; 88 89 if (reg > 0x11 && reg < 0x20) 90 return -1; 91 92 switch (etd->hw_version) { 93 case 1: 94 if (psmouse_sliced_command(psmouse, ETP_REGISTER_READ) || 95 psmouse_sliced_command(psmouse, reg) || 96 ps2_command(&psmouse->ps2dev, param, PSMOUSE_CMD_GETINFO)) { 97 rc = -1; 98 } 99 break; 100 101 case 2: 102 if (elantech_ps2_command(psmouse, NULL, ETP_PS2_CUSTOM_COMMAND) || 103 elantech_ps2_command(psmouse, NULL, ETP_REGISTER_READ) || 104 elantech_ps2_command(psmouse, NULL, ETP_PS2_CUSTOM_COMMAND) || 105 elantech_ps2_command(psmouse, NULL, reg) || 106 elantech_ps2_command(psmouse, param, PSMOUSE_CMD_GETINFO)) { 107 rc = -1; 108 } 109 break; 110 } 111 112 if (rc) 113 pr_err("failed to read register 0x%02x.\n", reg); 114 else 115 *val = param[0]; 116 117 return rc; 118 } 119 120 /* 121 * Send an Elantech style special command to write a register with a value 122 */ 123 static int elantech_write_reg(struct psmouse *psmouse, unsigned char reg, 124 unsigned char val) 125 { 126 struct elantech_data *etd = psmouse->private; 127 int rc = 0; 128 129 if (reg < 0x10 || reg > 0x26) 130 return -1; 131 132 if (reg > 0x11 && reg < 0x20) 133 return -1; 134 135 switch (etd->hw_version) { 136 case 1: 137 if (psmouse_sliced_command(psmouse, ETP_REGISTER_WRITE) || 138 psmouse_sliced_command(psmouse, reg) || 139 psmouse_sliced_command(psmouse, val) || 140 ps2_command(&psmouse->ps2dev, NULL, PSMOUSE_CMD_SETSCALE11)) { 141 rc = -1; 142 } 143 break; 144 145 case 2: 146 if (elantech_ps2_command(psmouse, NULL, ETP_PS2_CUSTOM_COMMAND) || 147 elantech_ps2_command(psmouse, NULL, ETP_REGISTER_WRITE) || 148 elantech_ps2_command(psmouse, NULL, ETP_PS2_CUSTOM_COMMAND) || 149 elantech_ps2_command(psmouse, NULL, reg) || 150 elantech_ps2_command(psmouse, NULL, ETP_PS2_CUSTOM_COMMAND) || 151 elantech_ps2_command(psmouse, NULL, val) || 152 elantech_ps2_command(psmouse, NULL, PSMOUSE_CMD_SETSCALE11)) { 153 rc = -1; 154 } 155 break; 156 } 157 158 if (rc) 159 pr_err("failed to write register 0x%02x with value 0x%02x.\n", 160 reg, val); 161 162 return rc; 163 } 164 165 /* 166 * Dump a complete mouse movement packet to the syslog 167 */ 168 static void elantech_packet_dump(unsigned char *packet, int size) 169 { 170 int i; 171 172 printk(KERN_DEBUG pr_fmt("PS/2 packet [")); 173 for (i = 0; i < size; i++) 174 printk("%s0x%02x ", (i) ? ", " : " ", packet[i]); 175 printk("]\n"); 176 } 177 178 /* 179 * Interpret complete data packets and report absolute mode input events for 180 * hardware version 1. (4 byte packets) 181 */ 182 static void elantech_report_absolute_v1(struct psmouse *psmouse) 183 { 184 struct input_dev *dev = psmouse->dev; 185 struct elantech_data *etd = psmouse->private; 186 unsigned char *packet = psmouse->packet; 187 int fingers; 188 static int old_fingers; 189 190 if (etd->fw_version < 0x020000) { 191 /* 192 * byte 0: D U p1 p2 1 p3 R L 193 * byte 1: f 0 th tw x9 x8 y9 y8 194 */ 195 fingers = ((packet[1] & 0x80) >> 7) + 196 ((packet[1] & 0x30) >> 4); 197 } else { 198 /* 199 * byte 0: n1 n0 p2 p1 1 p3 R L 200 * byte 1: 0 0 0 0 x9 x8 y9 y8 201 */ 202 fingers = (packet[0] & 0xc0) >> 6; 203 } 204 205 if (etd->jumpy_cursor) { 206 /* Discard packets that are likely to have bogus coordinates */ 207 if (fingers > old_fingers) { 208 elantech_debug("discarding packet\n"); 209 goto discard_packet_v1; 210 } 211 } 212 213 input_report_key(dev, BTN_TOUCH, fingers != 0); 214 215 /* 216 * byte 2: x7 x6 x5 x4 x3 x2 x1 x0 217 * byte 3: y7 y6 y5 y4 y3 y2 y1 y0 218 */ 219 if (fingers) { 220 input_report_abs(dev, ABS_X, 221 ((packet[1] & 0x0c) << 6) | packet[2]); 222 input_report_abs(dev, ABS_Y, 223 ETP_YMAX_V1 - (((packet[1] & 0x03) << 8) | packet[3])); 224 } 225 226 input_report_key(dev, BTN_TOOL_FINGER, fingers == 1); 227 input_report_key(dev, BTN_TOOL_DOUBLETAP, fingers == 2); 228 input_report_key(dev, BTN_TOOL_TRIPLETAP, fingers == 3); 229 input_report_key(dev, BTN_LEFT, packet[0] & 0x01); 230 input_report_key(dev, BTN_RIGHT, packet[0] & 0x02); 231 232 if (etd->fw_version < 0x020000 && 233 (etd->capabilities & ETP_CAP_HAS_ROCKER)) { 234 /* rocker up */ 235 input_report_key(dev, BTN_FORWARD, packet[0] & 0x40); 236 /* rocker down */ 237 input_report_key(dev, BTN_BACK, packet[0] & 0x80); 238 } 239 240 input_sync(dev); 241 242 discard_packet_v1: 243 old_fingers = fingers; 244 } 245 246 /* 247 * Interpret complete data packets and report absolute mode input events for 248 * hardware version 2. (6 byte packets) 249 */ 250 static void elantech_report_absolute_v2(struct psmouse *psmouse) 251 { 252 struct input_dev *dev = psmouse->dev; 253 unsigned char *packet = psmouse->packet; 254 int fingers, x1, y1, x2, y2; 255 256 /* byte 0: n1 n0 . . . . R L */ 257 fingers = (packet[0] & 0xc0) >> 6; 258 input_report_key(dev, BTN_TOUCH, fingers != 0); 259 260 switch (fingers) { 261 case 1: 262 /* 263 * byte 1: . . . . . x10 x9 x8 264 * byte 2: x7 x6 x5 x4 x4 x2 x1 x0 265 */ 266 input_report_abs(dev, ABS_X, 267 ((packet[1] & 0x07) << 8) | packet[2]); 268 /* 269 * byte 4: . . . . . . y9 y8 270 * byte 5: y7 y6 y5 y4 y3 y2 y1 y0 271 */ 272 input_report_abs(dev, ABS_Y, 273 ETP_YMAX_V2 - (((packet[4] & 0x03) << 8) | packet[5])); 274 break; 275 276 case 2: 277 /* 278 * The coordinate of each finger is reported separately 279 * with a lower resolution for two finger touches: 280 * byte 0: . . ay8 ax8 . . . . 281 * byte 1: ax7 ax6 ax5 ax4 ax3 ax2 ax1 ax0 282 */ 283 x1 = ((packet[0] & 0x10) << 4) | packet[1]; 284 /* byte 2: ay7 ay6 ay5 ay4 ay3 ay2 ay1 ay0 */ 285 y1 = ETP_2FT_YMAX - (((packet[0] & 0x20) << 3) | packet[2]); 286 /* 287 * byte 3: . . by8 bx8 . . . . 288 * byte 4: bx7 bx6 bx5 bx4 bx3 bx2 bx1 bx0 289 */ 290 x2 = ((packet[3] & 0x10) << 4) | packet[4]; 291 /* byte 5: by7 by8 by5 by4 by3 by2 by1 by0 */ 292 y2 = ETP_2FT_YMAX - (((packet[3] & 0x20) << 3) | packet[5]); 293 /* 294 * For compatibility with the X Synaptics driver scale up 295 * one coordinate and report as ordinary mouse movent 296 */ 297 input_report_abs(dev, ABS_X, x1 << 2); 298 input_report_abs(dev, ABS_Y, y1 << 2); 299 /* 300 * For compatibility with the proprietary X Elantech driver 301 * report both coordinates as hat coordinates 302 */ 303 input_report_abs(dev, ABS_HAT0X, x1); 304 input_report_abs(dev, ABS_HAT0Y, y1); 305 input_report_abs(dev, ABS_HAT1X, x2); 306 input_report_abs(dev, ABS_HAT1Y, y2); 307 break; 308 } 309 310 input_report_key(dev, BTN_TOOL_FINGER, fingers == 1); 311 input_report_key(dev, BTN_TOOL_DOUBLETAP, fingers == 2); 312 input_report_key(dev, BTN_TOOL_TRIPLETAP, fingers == 3); 313 input_report_key(dev, BTN_LEFT, packet[0] & 0x01); 314 input_report_key(dev, BTN_RIGHT, packet[0] & 0x02); 315 316 input_sync(dev); 317 } 318 319 static int elantech_check_parity_v1(struct psmouse *psmouse) 320 { 321 struct elantech_data *etd = psmouse->private; 322 unsigned char *packet = psmouse->packet; 323 unsigned char p1, p2, p3; 324 325 /* Parity bits are placed differently */ 326 if (etd->fw_version < 0x020000) { 327 /* byte 0: D U p1 p2 1 p3 R L */ 328 p1 = (packet[0] & 0x20) >> 5; 329 p2 = (packet[0] & 0x10) >> 4; 330 } else { 331 /* byte 0: n1 n0 p2 p1 1 p3 R L */ 332 p1 = (packet[0] & 0x10) >> 4; 333 p2 = (packet[0] & 0x20) >> 5; 334 } 335 336 p3 = (packet[0] & 0x04) >> 2; 337 338 return etd->parity[packet[1]] == p1 && 339 etd->parity[packet[2]] == p2 && 340 etd->parity[packet[3]] == p3; 341 } 342 343 /* 344 * Process byte stream from mouse and handle complete packets 345 */ 346 static psmouse_ret_t elantech_process_byte(struct psmouse *psmouse) 347 { 348 struct elantech_data *etd = psmouse->private; 349 350 if (psmouse->pktcnt < psmouse->pktsize) 351 return PSMOUSE_GOOD_DATA; 352 353 if (etd->debug > 1) 354 elantech_packet_dump(psmouse->packet, psmouse->pktsize); 355 356 switch (etd->hw_version) { 357 case 1: 358 if (etd->paritycheck && !elantech_check_parity_v1(psmouse)) 359 return PSMOUSE_BAD_DATA; 360 361 elantech_report_absolute_v1(psmouse); 362 break; 363 364 case 2: 365 /* We don't know how to check parity in protocol v2 */ 366 elantech_report_absolute_v2(psmouse); 367 break; 368 } 369 370 return PSMOUSE_FULL_PACKET; 371 } 372 373 /* 374 * Put the touchpad into absolute mode 375 */ 376 static int elantech_set_absolute_mode(struct psmouse *psmouse) 377 { 378 struct elantech_data *etd = psmouse->private; 379 unsigned char val; 380 int tries = ETP_READ_BACK_TRIES; 381 int rc = 0; 382 383 switch (etd->hw_version) { 384 case 1: 385 etd->reg_10 = 0x16; 386 etd->reg_11 = 0x8f; 387 if (elantech_write_reg(psmouse, 0x10, etd->reg_10) || 388 elantech_write_reg(psmouse, 0x11, etd->reg_11)) { 389 rc = -1; 390 } 391 break; 392 393 case 2: 394 /* Windows driver values */ 395 etd->reg_10 = 0x54; 396 etd->reg_11 = 0x88; /* 0x8a */ 397 etd->reg_21 = 0x60; /* 0x00 */ 398 if (elantech_write_reg(psmouse, 0x10, etd->reg_10) || 399 elantech_write_reg(psmouse, 0x11, etd->reg_11) || 400 elantech_write_reg(psmouse, 0x21, etd->reg_21)) { 401 rc = -1; 402 break; 403 } 404 } 405 406 if (rc == 0) { 407 /* 408 * Read back reg 0x10. For hardware version 1 we must make 409 * sure the absolute mode bit is set. For hardware version 2 410 * the touchpad is probably initalising and not ready until 411 * we read back the value we just wrote. 412 */ 413 do { 414 rc = elantech_read_reg(psmouse, 0x10, &val); 415 if (rc == 0) 416 break; 417 tries--; 418 elantech_debug("retrying read (%d).\n", tries); 419 msleep(ETP_READ_BACK_DELAY); 420 } while (tries > 0); 421 422 if (rc) { 423 pr_err("failed to read back register 0x10.\n"); 424 } else if (etd->hw_version == 1 && 425 !(val & ETP_R10_ABSOLUTE_MODE)) { 426 pr_err("touchpad refuses to switch to absolute mode.\n"); 427 rc = -1; 428 } 429 } 430 431 if (rc) 432 pr_err("failed to initialise registers.\n"); 433 434 return rc; 435 } 436 437 /* 438 * Set the appropriate event bits for the input subsystem 439 */ 440 static void elantech_set_input_params(struct psmouse *psmouse) 441 { 442 struct input_dev *dev = psmouse->dev; 443 struct elantech_data *etd = psmouse->private; 444 445 __set_bit(EV_KEY, dev->evbit); 446 __set_bit(EV_ABS, dev->evbit); 447 __clear_bit(EV_REL, dev->evbit); 448 449 __set_bit(BTN_LEFT, dev->keybit); 450 __set_bit(BTN_RIGHT, dev->keybit); 451 452 __set_bit(BTN_TOUCH, dev->keybit); 453 __set_bit(BTN_TOOL_FINGER, dev->keybit); 454 __set_bit(BTN_TOOL_DOUBLETAP, dev->keybit); 455 __set_bit(BTN_TOOL_TRIPLETAP, dev->keybit); 456 457 switch (etd->hw_version) { 458 case 1: 459 /* Rocker button */ 460 if (etd->fw_version < 0x020000 && 461 (etd->capabilities & ETP_CAP_HAS_ROCKER)) { 462 __set_bit(BTN_FORWARD, dev->keybit); 463 __set_bit(BTN_BACK, dev->keybit); 464 } 465 input_set_abs_params(dev, ABS_X, ETP_XMIN_V1, ETP_XMAX_V1, 0, 0); 466 input_set_abs_params(dev, ABS_Y, ETP_YMIN_V1, ETP_YMAX_V1, 0, 0); 467 break; 468 469 case 2: 470 input_set_abs_params(dev, ABS_X, ETP_XMIN_V2, ETP_XMAX_V2, 0, 0); 471 input_set_abs_params(dev, ABS_Y, ETP_YMIN_V2, ETP_YMAX_V2, 0, 0); 472 input_set_abs_params(dev, ABS_HAT0X, ETP_2FT_XMIN, ETP_2FT_XMAX, 0, 0); 473 input_set_abs_params(dev, ABS_HAT0Y, ETP_2FT_YMIN, ETP_2FT_YMAX, 0, 0); 474 input_set_abs_params(dev, ABS_HAT1X, ETP_2FT_XMIN, ETP_2FT_XMAX, 0, 0); 475 input_set_abs_params(dev, ABS_HAT1Y, ETP_2FT_YMIN, ETP_2FT_YMAX, 0, 0); 476 break; 477 } 478 } 479 480 struct elantech_attr_data { 481 size_t field_offset; 482 unsigned char reg; 483 }; 484 485 /* 486 * Display a register value by reading a sysfs entry 487 */ 488 static ssize_t elantech_show_int_attr(struct psmouse *psmouse, void *data, 489 char *buf) 490 { 491 struct elantech_data *etd = psmouse->private; 492 struct elantech_attr_data *attr = data; 493 unsigned char *reg = (unsigned char *) etd + attr->field_offset; 494 int rc = 0; 495 496 if (attr->reg) 497 rc = elantech_read_reg(psmouse, attr->reg, reg); 498 499 return sprintf(buf, "0x%02x\n", (attr->reg && rc) ? -1 : *reg); 500 } 501 502 /* 503 * Write a register value by writing a sysfs entry 504 */ 505 static ssize_t elantech_set_int_attr(struct psmouse *psmouse, 506 void *data, const char *buf, size_t count) 507 { 508 struct elantech_data *etd = psmouse->private; 509 struct elantech_attr_data *attr = data; 510 unsigned char *reg = (unsigned char *) etd + attr->field_offset; 511 unsigned long value; 512 int err; 513 514 err = strict_strtoul(buf, 16, &value); 515 if (err) 516 return err; 517 518 if (value > 0xff) 519 return -EINVAL; 520 521 /* Do we need to preserve some bits for version 2 hardware too? */ 522 if (etd->hw_version == 1) { 523 if (attr->reg == 0x10) 524 /* Force absolute mode always on */ 525 value |= ETP_R10_ABSOLUTE_MODE; 526 else if (attr->reg == 0x11) 527 /* Force 4 byte mode always on */ 528 value |= ETP_R11_4_BYTE_MODE; 529 } 530 531 if (!attr->reg || elantech_write_reg(psmouse, attr->reg, value) == 0) 532 *reg = value; 533 534 return count; 535 } 536 537 #define ELANTECH_INT_ATTR(_name, _register) \ 538 static struct elantech_attr_data elantech_attr_##_name = { \ 539 .field_offset = offsetof(struct elantech_data, _name), \ 540 .reg = _register, \ 541 }; \ 542 PSMOUSE_DEFINE_ATTR(_name, S_IWUSR | S_IRUGO, \ 543 &elantech_attr_##_name, \ 544 elantech_show_int_attr, \ 545 elantech_set_int_attr) 546 547 ELANTECH_INT_ATTR(reg_10, 0x10); 548 ELANTECH_INT_ATTR(reg_11, 0x11); 549 ELANTECH_INT_ATTR(reg_20, 0x20); 550 ELANTECH_INT_ATTR(reg_21, 0x21); 551 ELANTECH_INT_ATTR(reg_22, 0x22); 552 ELANTECH_INT_ATTR(reg_23, 0x23); 553 ELANTECH_INT_ATTR(reg_24, 0x24); 554 ELANTECH_INT_ATTR(reg_25, 0x25); 555 ELANTECH_INT_ATTR(reg_26, 0x26); 556 ELANTECH_INT_ATTR(debug, 0); 557 ELANTECH_INT_ATTR(paritycheck, 0); 558 559 static struct attribute *elantech_attrs[] = { 560 &psmouse_attr_reg_10.dattr.attr, 561 &psmouse_attr_reg_11.dattr.attr, 562 &psmouse_attr_reg_20.dattr.attr, 563 &psmouse_attr_reg_21.dattr.attr, 564 &psmouse_attr_reg_22.dattr.attr, 565 &psmouse_attr_reg_23.dattr.attr, 566 &psmouse_attr_reg_24.dattr.attr, 567 &psmouse_attr_reg_25.dattr.attr, 568 &psmouse_attr_reg_26.dattr.attr, 569 &psmouse_attr_debug.dattr.attr, 570 &psmouse_attr_paritycheck.dattr.attr, 571 NULL 572 }; 573 574 static struct attribute_group elantech_attr_group = { 575 .attrs = elantech_attrs, 576 }; 577 578 static bool elantech_is_signature_valid(const unsigned char *param) 579 { 580 static const unsigned char rates[] = { 200, 100, 80, 60, 40, 20, 10 }; 581 int i; 582 583 if (param[0] == 0) 584 return false; 585 586 if (param[1] == 0) 587 return true; 588 589 for (i = 0; i < ARRAY_SIZE(rates); i++) 590 if (param[2] == rates[i]) 591 return false; 592 593 return true; 594 } 595 596 /* 597 * Use magic knock to detect Elantech touchpad 598 */ 599 int elantech_detect(struct psmouse *psmouse, bool set_properties) 600 { 601 struct ps2dev *ps2dev = &psmouse->ps2dev; 602 unsigned char param[3]; 603 604 ps2_command(&psmouse->ps2dev, NULL, PSMOUSE_CMD_RESET_DIS); 605 606 if (ps2_command(ps2dev, NULL, PSMOUSE_CMD_DISABLE) || 607 ps2_command(ps2dev, NULL, PSMOUSE_CMD_SETSCALE11) || 608 ps2_command(ps2dev, NULL, PSMOUSE_CMD_SETSCALE11) || 609 ps2_command(ps2dev, NULL, PSMOUSE_CMD_SETSCALE11) || 610 ps2_command(ps2dev, param, PSMOUSE_CMD_GETINFO)) { 611 pr_debug("sending Elantech magic knock failed.\n"); 612 return -1; 613 } 614 615 /* 616 * Report this in case there are Elantech models that use a different 617 * set of magic numbers 618 */ 619 if (param[0] != 0x3c || param[1] != 0x03 || param[2] != 0xc8) { 620 pr_debug("unexpected magic knock result 0x%02x, 0x%02x, 0x%02x.\n", 621 param[0], param[1], param[2]); 622 return -1; 623 } 624 625 /* 626 * Query touchpad's firmware version and see if it reports known 627 * value to avoid mis-detection. Logitech mice are known to respond 628 * to Elantech magic knock and there might be more. 629 */ 630 if (synaptics_send_cmd(psmouse, ETP_FW_VERSION_QUERY, param)) { 631 pr_debug("failed to query firmware version.\n"); 632 return -1; 633 } 634 635 pr_debug("Elantech version query result 0x%02x, 0x%02x, 0x%02x.\n", 636 param[0], param[1], param[2]); 637 638 if (!elantech_is_signature_valid(param)) { 639 if (!force_elantech) { 640 pr_debug("Probably not a real Elantech touchpad. Aborting.\n"); 641 return -1; 642 } 643 644 pr_debug("Probably not a real Elantech touchpad. Enabling anyway due to force_elantech.\n"); 645 } 646 647 if (set_properties) { 648 psmouse->vendor = "Elantech"; 649 psmouse->name = "Touchpad"; 650 } 651 652 return 0; 653 } 654 655 /* 656 * Clean up sysfs entries when disconnecting 657 */ 658 static void elantech_disconnect(struct psmouse *psmouse) 659 { 660 sysfs_remove_group(&psmouse->ps2dev.serio->dev.kobj, 661 &elantech_attr_group); 662 kfree(psmouse->private); 663 psmouse->private = NULL; 664 } 665 666 /* 667 * Put the touchpad back into absolute mode when reconnecting 668 */ 669 static int elantech_reconnect(struct psmouse *psmouse) 670 { 671 if (elantech_detect(psmouse, 0)) 672 return -1; 673 674 if (elantech_set_absolute_mode(psmouse)) { 675 pr_err("failed to put touchpad back into absolute mode.\n"); 676 return -1; 677 } 678 679 return 0; 680 } 681 682 /* 683 * Initialize the touchpad and create sysfs entries 684 */ 685 int elantech_init(struct psmouse *psmouse) 686 { 687 struct elantech_data *etd; 688 int i, error; 689 unsigned char param[3]; 690 691 psmouse->private = etd = kzalloc(sizeof(struct elantech_data), GFP_KERNEL); 692 if (!etd) 693 return -1; 694 695 etd->parity[0] = 1; 696 for (i = 1; i < 256; i++) 697 etd->parity[i] = etd->parity[i & (i - 1)] ^ 1; 698 699 /* 700 * Do the version query again so we can store the result 701 */ 702 if (synaptics_send_cmd(psmouse, ETP_FW_VERSION_QUERY, param)) { 703 pr_err("failed to query firmware version.\n"); 704 goto init_fail; 705 } 706 707 etd->fw_version = (param[0] << 16) | (param[1] << 8) | param[2]; 708 709 /* 710 * Assume every version greater than this is new EeePC style 711 * hardware with 6 byte packets 712 */ 713 if (etd->fw_version >= 0x020030) { 714 etd->hw_version = 2; 715 /* For now show extra debug information */ 716 etd->debug = 1; 717 /* Don't know how to do parity checking for version 2 */ 718 etd->paritycheck = 0; 719 } else { 720 etd->hw_version = 1; 721 etd->paritycheck = 1; 722 } 723 724 pr_info("assuming hardware version %d, firmware version %d.%d.%d\n", 725 etd->hw_version, param[0], param[1], param[2]); 726 727 if (synaptics_send_cmd(psmouse, ETP_CAPABILITIES_QUERY, param)) { 728 pr_err("failed to query capabilities.\n"); 729 goto init_fail; 730 } 731 pr_info("Synaptics capabilities query result 0x%02x, 0x%02x, 0x%02x.\n", 732 param[0], param[1], param[2]); 733 etd->capabilities = param[0]; 734 735 /* 736 * This firmware seems to suffer from misreporting coordinates when 737 * a touch action starts causing the mouse cursor or scrolled page 738 * to jump. Enable a workaround. 739 */ 740 if (etd->fw_version == 0x020022) { 741 pr_info("firmware version 2.0.34 detected, enabling jumpy cursor workaround\n"); 742 etd->jumpy_cursor = 1; 743 } 744 745 if (elantech_set_absolute_mode(psmouse)) { 746 pr_err("failed to put touchpad into absolute mode.\n"); 747 goto init_fail; 748 } 749 750 elantech_set_input_params(psmouse); 751 752 error = sysfs_create_group(&psmouse->ps2dev.serio->dev.kobj, 753 &elantech_attr_group); 754 if (error) { 755 pr_err("failed to create sysfs attributes, error: %d.\n", error); 756 goto init_fail; 757 } 758 759 psmouse->protocol_handler = elantech_process_byte; 760 psmouse->disconnect = elantech_disconnect; 761 psmouse->reconnect = elantech_reconnect; 762 psmouse->pktsize = etd->hw_version == 2 ? 6 : 4; 763 764 return 0; 765 766 init_fail: 767 kfree(etd); 768 return -1; 769 } 770