Commit a69ce592 authored by Jonathan Denose's avatar Jonathan Denose Committed by Dmitry Torokhov

Input: elantech - fix touchpad state on resume for Lenovo N24

The Lenovo N24 on resume becomes stuck in a state where it
sends incorrect packets, causing elantech_packet_check_v4 to fail.
The only way for the device to resume sending the correct packets is for
it to be disabled and then re-enabled.

This change adds a dmi check to trigger this behavior on resume.
Signed-off-by: default avatarJonathan Denose <jdenose@google.com>
Link: https://lore.kernel.org/r/20240503155020.v2.1.Ifa0e25ebf968d8f307f58d678036944141ab17e6@changeidSigned-off-by: default avatarDmitry Torokhov <dmitry.torokhov@gmail.com>
parent 2ec0028a
...@@ -1476,16 +1476,47 @@ static void elantech_disconnect(struct psmouse *psmouse) ...@@ -1476,16 +1476,47 @@ static void elantech_disconnect(struct psmouse *psmouse)
psmouse->private = NULL; psmouse->private = NULL;
} }
/*
* Some hw_version 4 models fail to properly activate absolute mode on
* resume without going through disable/enable cycle.
*/
static const struct dmi_system_id elantech_needs_reenable[] = {
#if defined(CONFIG_DMI) && defined(CONFIG_X86)
{
/* Lenovo N24 */
.matches = {
DMI_MATCH(DMI_SYS_VENDOR, "LENOVO"),
DMI_MATCH(DMI_PRODUCT_NAME, "81AF"),
},
},
#endif
{ }
};
/* /*
* Put the touchpad back into absolute mode when reconnecting * Put the touchpad back into absolute mode when reconnecting
*/ */
static int elantech_reconnect(struct psmouse *psmouse) static int elantech_reconnect(struct psmouse *psmouse)
{ {
int err;
psmouse_reset(psmouse); psmouse_reset(psmouse);
if (elantech_detect(psmouse, 0)) if (elantech_detect(psmouse, 0))
return -1; return -1;
if (dmi_check_system(elantech_needs_reenable)) {
err = ps2_command(&psmouse->ps2dev, NULL, PSMOUSE_CMD_DISABLE);
if (err)
psmouse_warn(psmouse, "failed to deactivate mouse on %s: %d\n",
psmouse->ps2dev.serio->phys, err);
err = ps2_command(&psmouse->ps2dev, NULL, PSMOUSE_CMD_ENABLE);
if (err)
psmouse_warn(psmouse, "failed to reactivate mouse on %s: %d\n",
psmouse->ps2dev.serio->phys, err);
}
if (elantech_set_absolute_mode(psmouse)) { if (elantech_set_absolute_mode(psmouse)) {
psmouse_err(psmouse, psmouse_err(psmouse,
"failed to put touchpad back into absolute mode.\n"); "failed to put touchpad back into absolute mode.\n");
......
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