Modify: (1) crc_enabled only support for v3 and v4 touchpad, so initialize crc_enabled as false first and check this hardware flag when hw_version as 3 or 4. Signed-off-by: Duson Lin <dusonlin@xxxxxxxxxx> --- drivers/input/mouse/elantech.c | 30 ++++++++++++++---------------- drivers/input/mouse/elantech.h | 2 +- 2 files changed, 15 insertions(+), 17 deletions(-) diff --git a/drivers/input/mouse/elantech.c b/drivers/input/mouse/elantech.c index 8551dca..b3627cf 100644 --- a/drivers/input/mouse/elantech.c +++ b/drivers/input/mouse/elantech.c @@ -1,5 +1,5 @@ /* - * Elantech Touchpad driver (v6) + * Elantech Touchpad driver (v7) * * Copyright (C) 2007-2009 Arjan Opmeer <arjan@xxxxxxxxxx> * @@ -486,6 +486,7 @@ static void elantech_input_sync_v4(struct psmouse *psmouse) unsigned char *packet = psmouse->packet; input_report_key(dev, BTN_LEFT, packet[0] & 0x01); + input_report_key(dev, BTN_RIGHT, packet[0] & 0x02); input_mt_report_pointer_emulation(dev, true); input_sync(dev); } @@ -1047,9 +1048,7 @@ static int elantech_set_input_params(struct psmouse *psmouse) */ psmouse_warn(psmouse, "couldn't query resolution data.\n"); } - /* v4 is clickpad, with only one button. */ __set_bit(INPUT_PROP_BUTTONPAD, dev->propbit); - __clear_bit(BTN_RIGHT, dev->keybit); __set_bit(BTN_TOOL_QUADTAP, dev->keybit); /* For X to recognize me as touchpad. */ input_set_abs_params(dev, ABS_X, x_min, x_max, 0, 0); @@ -1186,19 +1185,12 @@ static struct attribute_group elantech_attr_group = { static bool elantech_is_signature_valid(const unsigned char *param) { - static const unsigned char rates[] = { 200, 100, 80, 60, 40, 20, 10 }; - int i; - if (param[0] == 0) return false; if (param[1] == 0) return true; - for (i = 0; i < ARRAY_SIZE(rates); i++) - if (param[2] == rates[i]) - return false; - return true; } @@ -1298,6 +1290,14 @@ static int elantech_set_properties(struct elantech_data *etd) { /* This represents the version of IC body. */ int ver = (etd->fw_version & 0x0f0000) >> 16; + /* + * The signatures of v3 and v4 packets change depending on the + * value of this hardware flag. But the v1 and v2 have not crc + * check mechanism and the same hardware flag are also defined + * as other function. So crc_enabled must be initialized as false + * first and checking by different hw_version. + */ + etd->crc_enabled = false; /* Early version of Elan touchpads doesn't obey the rule. */ if (etd->fw_version < 0x020030 || etd->fw_version == 0x020600) @@ -1309,10 +1309,14 @@ static int elantech_set_properties(struct elantech_data *etd) etd->hw_version = 2; break; case 5: + etd->crc_enabled = ((etd->fw_version & 0x4000) == 0x4000); etd->hw_version = 3; break; case 6: case 7: + case 8: + case 10: + etd->crc_enabled = ((etd->fw_version & 0x4000) == 0x4000); etd->hw_version = 4; break; default: @@ -1343,12 +1347,6 @@ static int elantech_set_properties(struct elantech_data *etd) etd->reports_pressure = true; } - /* - * The signatures of v3 and v4 packets change depending on the - * value of this hardware flag. - */ - etd->crc_enabled = ((etd->fw_version & 0x4000) == 0x4000); - return 0; } diff --git a/drivers/input/mouse/elantech.h b/drivers/input/mouse/elantech.h index 036a04a..c963ac8 100644 --- a/drivers/input/mouse/elantech.h +++ b/drivers/input/mouse/elantech.h @@ -1,5 +1,5 @@ /* - * Elantech Touchpad driver (v6) + * Elantech Touchpad driver (v7) * * Copyright (C) 2007-2009 Arjan Opmeer <arjan@xxxxxxxxxx> * -- 1.7.10.4 -- To unsubscribe from this list: send the line "unsubscribe linux-input" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html