提交 b56b92a9 编写于 作者: J JJ Ding 提交者: Dmitry Torokhov

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: NJJ Ding <jj_ding@emc.com.tw>
Reviewed-by: NDaniel Kurtz <djkurtz@chromium.org>
Signed-off-by: NDmitry Torokhov <dtor@mail.ru>
上级 8672bd93
...@@ -42,6 +42,24 @@ static int synaptics_send_cmd(struct psmouse *psmouse, unsigned char c, ...@@ -42,6 +42,24 @@ static int synaptics_send_cmd(struct psmouse *psmouse, unsigned char c,
return 0; 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 * A retrying version of ps2_command
*/ */
...@@ -863,13 +881,13 @@ static int elantech_set_range(struct psmouse *psmouse, ...@@ -863,13 +881,13 @@ static int elantech_set_range(struct psmouse *psmouse,
i = (etd->fw_version > 0x020800 && i = (etd->fw_version > 0x020800 &&
etd->fw_version < 0x020900) ? 1 : 2; 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; return -1;
fixed_dpi = param[1] & 0x10; fixed_dpi = param[1] & 0x10;
if (((etd->fw_version >> 16) == 0x14) && fixed_dpi) { 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; return -1;
*x_max = (etd->capabilities[1] - i) * param[1] / 2; *x_max = (etd->capabilities[1] - i) * param[1] / 2;
...@@ -888,7 +906,7 @@ static int elantech_set_range(struct psmouse *psmouse, ...@@ -888,7 +906,7 @@ static int elantech_set_range(struct psmouse *psmouse,
break; break;
case 3: case 3:
if (synaptics_send_cmd(psmouse, ETP_FW_ID_QUERY, param)) if (etd->send_cmd(psmouse, ETP_FW_ID_QUERY, param))
return -1; return -1;
*x_max = (0x0f & param[0]) << 8 | param[1]; *x_max = (0x0f & param[0]) << 8 | param[1];
...@@ -896,7 +914,7 @@ static int elantech_set_range(struct psmouse *psmouse, ...@@ -896,7 +914,7 @@ static int elantech_set_range(struct psmouse *psmouse,
break; break;
case 4: case 4:
if (synaptics_send_cmd(psmouse, ETP_FW_ID_QUERY, param)) if (etd->send_cmd(psmouse, ETP_FW_ID_QUERY, param))
return -1; return -1;
*x_max = (0x0f & param[0]) << 8 | param[1]; *x_max = (0x0f & param[0]) << 8 | param[1];
...@@ -1220,9 +1238,11 @@ static int elantech_set_properties(struct elantech_data *etd) ...@@ -1220,9 +1238,11 @@ static int elantech_set_properties(struct elantech_data *etd)
else else
return -1; return -1;
/* /* decide which send_cmd we're gonna use early */
* Turn on packet checking by default. etd->send_cmd = etd->hw_version >= 3 ? elantech_send_cmd :
*/ synaptics_send_cmd;
/* Turn on packet checking by default */
etd->paritycheck = 1; etd->paritycheck = 1;
/* /*
...@@ -1278,7 +1298,7 @@ int elantech_init(struct psmouse *psmouse) ...@@ -1278,7 +1298,7 @@ int elantech_init(struct psmouse *psmouse)
"assuming hardware version %d (with firmware version 0x%02x%02x%02x)\n", "assuming hardware version %d (with firmware version 0x%02x%02x%02x)\n",
etd->hw_version, param[0], param[1], param[2]); 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)) { etd->capabilities)) {
psmouse_err(psmouse, "failed to query capabilities.\n"); psmouse_err(psmouse, "failed to query capabilities.\n");
goto init_fail; goto init_fail;
......
...@@ -135,6 +135,7 @@ struct elantech_data { ...@@ -135,6 +135,7 @@ struct elantech_data {
unsigned int width; unsigned int width;
struct finger_pos mt[ETP_MAX_FINGERS]; struct finger_pos mt[ETP_MAX_FINGERS];
unsigned char parity[256]; unsigned char parity[256];
int (*send_cmd)(struct psmouse *psmouse, unsigned char c, unsigned char *param);
}; };
#ifdef CONFIG_MOUSE_PS2_ELANTECH #ifdef CONFIG_MOUSE_PS2_ELANTECH
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册