Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 9b6a1cb8 authored by Jonathan Denose's avatar Jonathan Denose Committed by Greg Kroah-Hartman
Browse files

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



[ Upstream commit a69ce592cbe0417664bc5a075205aa75c2ec1273 ]

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@changeid


Signed-off-by: default avatarDmitry Torokhov <dmitry.torokhov@gmail.com>
Signed-off-by: default avatarSasha Levin <sashal@kernel.org>
parent b02ba9a0
Loading
Loading
Loading
Loading
+31 −0
Original line number Diff line number Diff line
@@ -1527,16 +1527,47 @@ static void elantech_disconnect(struct psmouse *psmouse)
	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
 */
static int elantech_reconnect(struct psmouse *psmouse)
{
	int err;

	psmouse_reset(psmouse);

	if (elantech_detect(psmouse, 0))
		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)) {
		psmouse_err(psmouse,
			    "failed to put touchpad back into absolute mode.\n");