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

Commit b56b92a9 authored by JJ Ding's avatar JJ Ding Committed by Dmitry Torokhov
Browse files

Input: elantech - add support for elantech fast command



Starting with v3 hardware, the firmware supports this shorter
elantech_send_cmd. Teach the driver to use it.

Signed-off-by: default avatarJJ Ding <jj_ding@emc.com.tw>
Reviewed-by: default avatarDaniel Kurtz <djkurtz@chromium.org>
Signed-off-by: default avatarDmitry Torokhov <dtor@mail.ru>
parent 8672bd93
Loading
Loading
Loading
Loading
+28 −8
Original line number Diff line number Diff line
@@ -42,6 +42,24 @@ static int synaptics_send_cmd(struct psmouse *psmouse, unsigned char c,
	return 0;
}

/*
 * V3 and later support this fast command
 */
static int elantech_send_cmd(struct psmouse *psmouse, unsigned char c,
				unsigned char *param)
{
	struct ps2dev *ps2dev = &psmouse->ps2dev;

	if (ps2_command(ps2dev, NULL, ETP_PS2_CUSTOM_COMMAND) ||
	    ps2_command(ps2dev, NULL, c) ||
	    ps2_command(ps2dev, param, PSMOUSE_CMD_GETINFO)) {
		psmouse_err(psmouse, "%s query 0x%02x failed.\n", __func__, c);
		return -1;
	}

	return 0;
}

/*
 * A retrying version of ps2_command
 */
@@ -863,13 +881,13 @@ static int elantech_set_range(struct psmouse *psmouse,
			i = (etd->fw_version > 0x020800 &&
			     etd->fw_version < 0x020900) ? 1 : 2;

			if (synaptics_send_cmd(psmouse, ETP_FW_ID_QUERY, param))
			if (etd->send_cmd(psmouse, ETP_FW_ID_QUERY, param))
				return -1;

			fixed_dpi = param[1] & 0x10;

			if (((etd->fw_version >> 16) == 0x14) && fixed_dpi) {
				if (synaptics_send_cmd(psmouse, ETP_SAMPLE_QUERY, param))
				if (etd->send_cmd(psmouse, ETP_SAMPLE_QUERY, param))
					return -1;

				*x_max = (etd->capabilities[1] - i) * param[1] / 2;
@@ -888,7 +906,7 @@ static int elantech_set_range(struct psmouse *psmouse,
		break;

	case 3:
		if (synaptics_send_cmd(psmouse, ETP_FW_ID_QUERY, param))
		if (etd->send_cmd(psmouse, ETP_FW_ID_QUERY, param))
			return -1;

		*x_max = (0x0f & param[0]) << 8 | param[1];
@@ -896,7 +914,7 @@ static int elantech_set_range(struct psmouse *psmouse,
		break;

	case 4:
		if (synaptics_send_cmd(psmouse, ETP_FW_ID_QUERY, param))
		if (etd->send_cmd(psmouse, ETP_FW_ID_QUERY, param))
			return -1;

		*x_max = (0x0f & param[0]) << 8 | param[1];
@@ -1220,9 +1238,11 @@ static int elantech_set_properties(struct elantech_data *etd)
	else
		return -1;

	/*
	 * Turn on packet checking by default.
	 */
	/* decide which send_cmd we're gonna use early */
	etd->send_cmd = etd->hw_version >= 3 ? elantech_send_cmd :
					       synaptics_send_cmd;

	/* Turn on packet checking by default */
	etd->paritycheck = 1;

	/*
@@ -1278,7 +1298,7 @@ int elantech_init(struct psmouse *psmouse)
		     "assuming hardware version %d (with firmware version 0x%02x%02x%02x)\n",
		     etd->hw_version, param[0], param[1], param[2]);

	if (synaptics_send_cmd(psmouse, ETP_CAPABILITIES_QUERY,
	if (etd->send_cmd(psmouse, ETP_CAPABILITIES_QUERY,
	    etd->capabilities)) {
		psmouse_err(psmouse, "failed to query capabilities.\n");
		goto init_fail;
+1 −0
Original line number Diff line number Diff line
@@ -135,6 +135,7 @@ struct elantech_data {
	unsigned int width;
	struct finger_pos mt[ETP_MAX_FINGERS];
	unsigned char parity[256];
	int (*send_cmd)(struct psmouse *psmouse, unsigned char c, unsigned char *param);
};

#ifdef CONFIG_MOUSE_PS2_ELANTECH