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

Commit 9ab7b25e authored by Arjan Opmeer's avatar Arjan Opmeer Committed by Dmitry Torokhov
Browse files

Input: elantech - touchpad driver miss-recognising logitech mice



Some Logitech mice react to the magic knock like Elantech touchpad would.
This leads to those mice being misdetected as Elantech touchpads.  Add a
version query to elantech_detect() to distinguish the two.

[dtor@mail.ru:
 - lower severity of some messages - when we are not sure yet if
   device is Elantech or not not responding to knock is not an error.
]

Signed-off-by: default avatarArjan Opmeer <arjan@opmeer.net>
Signed-off-by: default avatarDmitry Torokhov <dtor@mail.ru>
parent 4d368456
Loading
Loading
Loading
Loading
+24 −8
Original line number Original line Diff line number Diff line
@@ -542,7 +542,7 @@ int elantech_detect(struct psmouse *psmouse, int set_properties)
	    ps2_command(ps2dev,  NULL, PSMOUSE_CMD_SETSCALE11) ||
	    ps2_command(ps2dev,  NULL, PSMOUSE_CMD_SETSCALE11) ||
	    ps2_command(ps2dev,  NULL, PSMOUSE_CMD_SETSCALE11) ||
	    ps2_command(ps2dev,  NULL, PSMOUSE_CMD_SETSCALE11) ||
	    ps2_command(ps2dev, param, PSMOUSE_CMD_GETINFO)) {
	    ps2_command(ps2dev, param, PSMOUSE_CMD_GETINFO)) {
		pr_err("elantech.c: sending Elantech magic knock failed.\n");
		pr_debug("elantech.c: sending Elantech magic knock failed.\n");
		return -1;
		return -1;
	}
	}


@@ -551,11 +551,30 @@ int elantech_detect(struct psmouse *psmouse, int set_properties)
	 * set of magic numbers
	 * set of magic numbers
	 */
	 */
	if (param[0] != 0x3c || param[1] != 0x03 || param[2] != 0xc8) {
	if (param[0] != 0x3c || param[1] != 0x03 || param[2] != 0xc8) {
		pr_info("elantech.c: unexpected magic knock result 0x%02x, 0x%02x, 0x%02x.\n",
		pr_debug("elantech.c: "
			 "unexpected magic knock result 0x%02x, 0x%02x, 0x%02x.\n",
			 param[0], param[1], param[2]);
			 param[0], param[1], param[2]);
		return -1;
		return -1;
	}
	}


	/*
	 * Query touchpad's firmware version and see if it reports known
	 * value to avoid mis-detection. Logitech mice are known to respond
	 * to Elantech magic knock and there might be more.
	 */
	if (synaptics_send_cmd(psmouse, ETP_FW_VERSION_QUERY, param)) {
		pr_debug("elantech.c: failed to query firmware version.\n");
		return -1;
	}

	pr_debug("elantech.c: Elantech version query result 0x%02x, 0x%02x, 0x%02x.\n",
		 param[0], param[1], param[2]);

	if (param[0] == 0 || param[1] != 0) {
		pr_debug("elantech.c: Probably not a real Elantech touchpad. Aborting.\n");
		return -1;
	}

	if (set_properties) {
	if (set_properties) {
		psmouse->vendor = "Elantech";
		psmouse->vendor = "Elantech";
		psmouse->name = "Touchpad";
		psmouse->name = "Touchpad";
@@ -600,8 +619,7 @@ int elantech_init(struct psmouse *psmouse)
	int i, error;
	int i, error;
	unsigned char param[3];
	unsigned char param[3];


	etd = kzalloc(sizeof(struct elantech_data), GFP_KERNEL);
	psmouse->private = etd = kzalloc(sizeof(struct elantech_data), GFP_KERNEL);
	psmouse->private = etd;
	if (!etd)
	if (!etd)
		return -1;
		return -1;


@@ -610,14 +628,12 @@ int elantech_init(struct psmouse *psmouse)
		etd->parity[i] = etd->parity[i & (i - 1)] ^ 1;
		etd->parity[i] = etd->parity[i & (i - 1)] ^ 1;


	/*
	/*
	 * Find out what version hardware this is
	 * Do the version query again so we can store the result
	 */
	 */
	if (synaptics_send_cmd(psmouse, ETP_FW_VERSION_QUERY, param)) {
	if (synaptics_send_cmd(psmouse, ETP_FW_VERSION_QUERY, param)) {
		pr_err("elantech.c: failed to query firmware version.\n");
		pr_err("elantech.c: failed to query firmware version.\n");
		goto init_fail;
		goto init_fail;
	}
	}
	pr_info("elantech.c: Elantech version query result 0x%02x, 0x%02x, 0x%02x.\n",
		param[0], param[1], param[2]);
	etd->fw_version_maj = param[0];
	etd->fw_version_maj = param[0];
	etd->fw_version_min = param[2];
	etd->fw_version_min = param[2];