Commit b2546df6 authored by Arjan Opmeer's avatar Arjan Opmeer Committed by Dmitry Torokhov

Input: elantech - make sure touchpad is really in absolute mode

There exist laptops with Elantech touchpads where switching to absolute mode
does not happen, although writing the configuration register succeeds
without error. Reading back the register afterwards reveils that the
absolute mode bit is not set as if masked out by the touchpad firmware.

Always read back register 0x10, make sure that for hardware version 1 the
absolute mode bit is actually set and fail otherwise. This prevents the case
where the touchpad is claimed by the Elantech driver but is nonetheless not
working.
Signed-off-by: default avatarArjan Opmeer <arjan@opmeer.net>
Signed-off-by: default avatarDmitry Torokhov <dtor@mail.ru>
parent 3f8c0df4
...@@ -375,9 +375,14 @@ static int elantech_set_absolute_mode(struct psmouse *psmouse) ...@@ -375,9 +375,14 @@ static int elantech_set_absolute_mode(struct psmouse *psmouse)
rc = -1; rc = -1;
break; break;
} }
}
if (rc == 0) {
/* /*
* Read back reg 0x10. The touchpad is probably initalising * Read back reg 0x10. For hardware version 1 we must make
* and not ready until we read back the value we just wrote. * sure the absolute mode bit is set. For hardware version 2
* the touchpad is probably initalising and not ready until
* we read back the value we just wrote.
*/ */
do { do {
rc = elantech_read_reg(psmouse, 0x10, &val); rc = elantech_read_reg(psmouse, 0x10, &val);
...@@ -385,12 +390,18 @@ static int elantech_set_absolute_mode(struct psmouse *psmouse) ...@@ -385,12 +390,18 @@ static int elantech_set_absolute_mode(struct psmouse *psmouse)
break; break;
tries--; tries--;
elantech_debug("elantech.c: retrying read (%d).\n", elantech_debug("elantech.c: retrying read (%d).\n",
tries); tries);
msleep(ETP_READ_BACK_DELAY); msleep(ETP_READ_BACK_DELAY);
} while (tries > 0); } while (tries > 0);
if (rc)
if (rc) {
pr_err("elantech.c: failed to read back register 0x10.\n"); pr_err("elantech.c: failed to read back register 0x10.\n");
break; } else if (etd->hw_version == 1 &&
!(val & ETP_R10_ABSOLUTE_MODE)) {
pr_err("elantech.c: touchpad refuses "
"to switch to absolute mode.\n");
rc = -1;
}
} }
if (rc) if (rc)
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment