diff options
Diffstat (limited to 'drivers/input/mouse/elantech.c')
-rw-r--r-- | drivers/input/mouse/elantech.c | 26 |
1 files changed, 25 insertions, 1 deletions
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 | ||