diff options
author | Matteo Delfino <kendatsuba@gmail.com> | 2013-07-07 00:52:26 -0400 |
---|---|---|
committer | Dmitry Torokhov <dmitry.torokhov@gmail.com> | 2013-07-07 00:57:27 -0400 |
commit | 9eebed7de660c0b5ab129a9de4f89d20b60de68c (patch) | |
tree | 74f280c98accf0f733116d5b794ea833d08c985a /drivers/input | |
parent | a608026eacaee59cf0f1fa5caad60320f5b4a373 (diff) |
Input: elantech - fix for newer hardware versions (v7)
* Fix version recognition in elantech_set_properties
The new hardware reports itself as v7 but the packets'
structure is unaltered.
* Fix packet type recognition in elantech_packet_check_v4
The bitmask used for v6 is too wide, only the last three bits of
the third byte in a packet (packet[3] & 0x03) are actually used to
distinguish between packet types.
Starting from v7, additional information (to be interpreted) is
stored in the remaining bits (packets[3] & 0x1c).
In addition, the value stored in (packet[0] & 0x0c) is no longer
a constant but contains additional information yet to be deciphered.
This change should be backwards compatible with v6 hardware.
Additional-author: Giovanni Frigione <gio.frigione@gmail.com>
Signed-off-by: Matteo Delfino <kendatsuba@gmail.com>
Signed-off-by: Dmitry Torokhov <dmitry.torokhov@gmail.com>
Diffstat (limited to 'drivers/input')
-rw-r--r-- | drivers/input/mouse/elantech.c | 17 |
1 files changed, 9 insertions, 8 deletions
diff --git a/drivers/input/mouse/elantech.c b/drivers/input/mouse/elantech.c index 1e8e42fb03a4..57b2637e153a 100644 --- a/drivers/input/mouse/elantech.c +++ b/drivers/input/mouse/elantech.c | |||
@@ -694,18 +694,18 @@ static int elantech_packet_check_v3(struct psmouse *psmouse) | |||
694 | static int elantech_packet_check_v4(struct psmouse *psmouse) | 694 | static int elantech_packet_check_v4(struct psmouse *psmouse) |
695 | { | 695 | { |
696 | unsigned char *packet = psmouse->packet; | 696 | unsigned char *packet = psmouse->packet; |
697 | unsigned char packet_type = packet[3] & 0x03; | ||
697 | 698 | ||
698 | if ((packet[0] & 0x0c) == 0x04 && | 699 | switch (packet_type) { |
699 | (packet[3] & 0x1f) == 0x11) | 700 | case 0: |
701 | return PACKET_V4_STATUS; | ||
702 | |||
703 | case 1: | ||
700 | return PACKET_V4_HEAD; | 704 | return PACKET_V4_HEAD; |
701 | 705 | ||
702 | if ((packet[0] & 0x0c) == 0x04 && | 706 | case 2: |
703 | (packet[3] & 0x1f) == 0x12) | ||
704 | return PACKET_V4_MOTION; | 707 | return PACKET_V4_MOTION; |
705 | 708 | } | |
706 | if ((packet[0] & 0x0c) == 0x04 && | ||
707 | (packet[3] & 0x1f) == 0x10) | ||
708 | return PACKET_V4_STATUS; | ||
709 | 709 | ||
710 | return PACKET_UNKNOWN; | 710 | return PACKET_UNKNOWN; |
711 | } | 711 | } |
@@ -1282,6 +1282,7 @@ static int elantech_set_properties(struct elantech_data *etd) | |||
1282 | etd->hw_version = 3; | 1282 | etd->hw_version = 3; |
1283 | break; | 1283 | break; |
1284 | case 6: | 1284 | case 6: |
1285 | case 7: | ||
1285 | etd->hw_version = 4; | 1286 | etd->hw_version = 4; |
1286 | break; | 1287 | break; |
1287 | default: | 1288 | default: |