diff options
-rw-r--r-- | drivers/input/mouse/elantech.c | 21 |
1 files changed, 16 insertions, 5 deletions
diff --git a/drivers/input/mouse/elantech.c b/drivers/input/mouse/elantech.c index d3b591673792..4bc78892ba91 100644 --- a/drivers/input/mouse/elantech.c +++ b/drivers/input/mouse/elantech.c | |||
@@ -375,9 +375,14 @@ static int elantech_set_absolute_mode(struct psmouse *psmouse) | |||
375 | rc = -1; | 375 | rc = -1; |
376 | break; | 376 | break; |
377 | } | 377 | } |
378 | } | ||
379 | |||
380 | if (rc == 0) { | ||
378 | /* | 381 | /* |
379 | * Read back reg 0x10. The touchpad is probably initalising | 382 | * Read back reg 0x10. For hardware version 1 we must make |
380 | * and not ready until we read back the value we just wrote. | 383 | * sure the absolute mode bit is set. For hardware version 2 |
384 | * the touchpad is probably initalising and not ready until | ||
385 | * we read back the value we just wrote. | ||
381 | */ | 386 | */ |
382 | do { | 387 | do { |
383 | rc = elantech_read_reg(psmouse, 0x10, &val); | 388 | rc = elantech_read_reg(psmouse, 0x10, &val); |
@@ -385,12 +390,18 @@ static int elantech_set_absolute_mode(struct psmouse *psmouse) | |||
385 | break; | 390 | break; |
386 | tries--; | 391 | tries--; |
387 | elantech_debug("elantech.c: retrying read (%d).\n", | 392 | elantech_debug("elantech.c: retrying read (%d).\n", |
388 | tries); | 393 | tries); |
389 | msleep(ETP_READ_BACK_DELAY); | 394 | msleep(ETP_READ_BACK_DELAY); |
390 | } while (tries > 0); | 395 | } while (tries > 0); |
391 | if (rc) | 396 | |
397 | if (rc) { | ||
392 | pr_err("elantech.c: failed to read back register 0x10.\n"); | 398 | pr_err("elantech.c: failed to read back register 0x10.\n"); |
393 | break; | 399 | } else if (etd->hw_version == 1 && |
400 | !(val & ETP_R10_ABSOLUTE_MODE)) { | ||
401 | pr_err("elantech.c: touchpad refuses " | ||
402 | "to switch to absolute mode.\n"); | ||
403 | rc = -1; | ||
404 | } | ||
394 | } | 405 | } |
395 | 406 | ||
396 | if (rc) | 407 | if (rc) |