diff options
| -rw-r--r-- | Documentation/input/elantech.txt | 5 | ||||
| -rw-r--r-- | drivers/input/mouse/elantech.c | 26 | ||||
| -rw-r--r-- | drivers/input/mouse/elantech.h | 1 |
3 files changed, 30 insertions, 2 deletions
diff --git a/Documentation/input/elantech.txt b/Documentation/input/elantech.txt index 5602eb71ad5d..e1ae127ed099 100644 --- a/Documentation/input/elantech.txt +++ b/Documentation/input/elantech.txt | |||
| @@ -504,9 +504,12 @@ byte 5: | |||
| 504 | * reg_10 | 504 | * reg_10 |
| 505 | 505 | ||
| 506 | bit 7 6 5 4 3 2 1 0 | 506 | bit 7 6 5 4 3 2 1 0 |
| 507 | 0 0 0 0 0 0 0 A | 507 | 0 0 0 0 R F T A |
| 508 | 508 | ||
| 509 | A: 1 = enable absolute tracking | 509 | A: 1 = enable absolute tracking |
| 510 | T: 1 = enable two finger mode auto correct | ||
| 511 | F: 1 = disable ABS Position Filter | ||
| 512 | R: 1 = enable real hardware resolution | ||
| 510 | 513 | ||
| 511 | 6.2 Native absolute mode 6 byte packet format | 514 | 6.2 Native absolute mode 6 byte packet format |
| 512 | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ | 515 | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ |
diff --git a/drivers/input/mouse/elantech.c b/drivers/input/mouse/elantech.c index 088d3541c7d3..b96e978a37b7 100644 --- a/drivers/input/mouse/elantech.c +++ b/drivers/input/mouse/elantech.c | |||
| @@ -11,6 +11,7 @@ | |||
| 11 | */ | 11 | */ |
| 12 | 12 | ||
| 13 | #include <linux/delay.h> | 13 | #include <linux/delay.h> |
| 14 | #include <linux/dmi.h> | ||
| 14 | #include <linux/slab.h> | 15 | #include <linux/slab.h> |
| 15 | #include <linux/module.h> | 16 | #include <linux/module.h> |
| 16 | #include <linux/input.h> | 17 | #include <linux/input.h> |
| @@ -831,7 +832,11 @@ static int elantech_set_absolute_mode(struct psmouse *psmouse) | |||
| 831 | break; | 832 | break; |
| 832 | 833 | ||
| 833 | case 3: | 834 | case 3: |
| 834 | etd->reg_10 = 0x0b; | 835 | if (etd->set_hw_resolution) |
| 836 | etd->reg_10 = 0x0b; | ||
| 837 | else | ||
| 838 | etd->reg_10 = 0x03; | ||
| 839 | |||
| 835 | if (elantech_write_reg(psmouse, 0x10, etd->reg_10)) | 840 | if (elantech_write_reg(psmouse, 0x10, etd->reg_10)) |
| 836 | rc = -1; | 841 | rc = -1; |
| 837 | 842 | ||
| @@ -1331,6 +1336,22 @@ static int elantech_reconnect(struct psmouse *psmouse) | |||
| 1331 | } | 1336 | } |
| 1332 | 1337 | ||
| 1333 | /* | 1338 | /* |
| 1339 | * Some hw_version 3 models go into error state when we try to set bit 3 of r10 | ||
| 1340 | */ | ||
| 1341 | static const struct dmi_system_id no_hw_res_dmi_table[] = { | ||
| 1342 | #if defined(CONFIG_DMI) && defined(CONFIG_X86) | ||
| 1343 | { | ||
| 1344 | /* Gigabyte U2442 */ | ||
| 1345 | .matches = { | ||
| 1346 | DMI_MATCH(DMI_SYS_VENDOR, "GIGABYTE"), | ||
| 1347 | DMI_MATCH(DMI_PRODUCT_NAME, "U2442"), | ||
| 1348 | }, | ||
| 1349 | }, | ||
| 1350 | #endif | ||
| 1351 | { } | ||
| 1352 | }; | ||
| 1353 | |||
| 1354 | /* | ||
| 1334 | * determine hardware version and set some properties according to it. | 1355 | * determine hardware version and set some properties according to it. |
| 1335 | */ | 1356 | */ |
| 1336 | static int elantech_set_properties(struct elantech_data *etd) | 1357 | static int elantech_set_properties(struct elantech_data *etd) |
| @@ -1390,6 +1411,9 @@ static int elantech_set_properties(struct elantech_data *etd) | |||
| 1390 | */ | 1411 | */ |
| 1391 | etd->crc_enabled = ((etd->fw_version & 0x4000) == 0x4000); | 1412 | etd->crc_enabled = ((etd->fw_version & 0x4000) == 0x4000); |
| 1392 | 1413 | ||
| 1414 | /* Enable real hardware resolution on hw_version 3 ? */ | ||
| 1415 | etd->set_hw_resolution = !dmi_check_system(no_hw_res_dmi_table); | ||
| 1416 | |||
| 1393 | return 0; | 1417 | return 0; |
| 1394 | } | 1418 | } |
| 1395 | 1419 | ||
diff --git a/drivers/input/mouse/elantech.h b/drivers/input/mouse/elantech.h index 036a04abaef7..9e0e2a1f340d 100644 --- a/drivers/input/mouse/elantech.h +++ b/drivers/input/mouse/elantech.h | |||
| @@ -130,6 +130,7 @@ struct elantech_data { | |||
| 130 | bool jumpy_cursor; | 130 | bool jumpy_cursor; |
| 131 | bool reports_pressure; | 131 | bool reports_pressure; |
| 132 | bool crc_enabled; | 132 | bool crc_enabled; |
| 133 | bool set_hw_resolution; | ||
| 133 | unsigned char hw_version; | 134 | unsigned char hw_version; |
| 134 | unsigned int fw_version; | 135 | unsigned int fw_version; |
| 135 | unsigned int single_finger_reports; | 136 | unsigned int single_finger_reports; |
