Commit 56c381f93d57b88a3e667a2f55137947315c17e2
Exists in
ti-lsk-linux-4.1.y
and in
10 other branches
Merge branch 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/dtor/input
Pull input subsystem updates from Dmitry Torokhov: "Mostly small fixups to PS/2 tochpad drivers (ALPS, Elantech, Synaptics) to better deal with specific hardware" * 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/dtor/input: Input: elantech - update the documentation Input: elantech - provide a sysfs knob for crc_enabled Input: elantech - report the middle button of the touchpad Input: alps - ignore bad data on Dell Latitudes E6440 and E7440 Input: alps - allow up to 2 invalid packets without resetting device Input: alps - ignore potential bare packets when device is out of sync Input: elantech - fix crc_enabled for Fujitsu H730 Input: elantech - use elantech_report_trackpoint for hardware v4 too Input: twl4030-pwrbutton - ensure a wakeup event is recorded. Input: synaptics - add min/max quirk for Lenovo T440s
Showing 5 changed files Side-by-side Diff
Documentation/input/elantech.txt
... | ... | @@ -38,22 +38,38 @@ |
38 | 38 | 7.2.1 Status packet |
39 | 39 | 7.2.2 Head packet |
40 | 40 | 7.2.3 Motion packet |
41 | + 8. Trackpoint (for Hardware version 3 and 4) | |
42 | + 8.1 Registers | |
43 | + 8.2 Native relative mode 6 byte packet format | |
44 | + 8.2.1 Status Packet | |
41 | 45 | |
42 | 46 | |
43 | 47 | |
44 | 48 | 1. Introduction |
45 | 49 | ~~~~~~~~~~~~ |
46 | 50 | |
47 | -Currently the Linux Elantech touchpad driver is aware of two different | |
48 | -hardware versions unimaginatively called version 1 and version 2. Version 1 | |
49 | -is found in "older" laptops and uses 4 bytes per packet. Version 2 seems to | |
50 | -be introduced with the EeePC and uses 6 bytes per packet, and provides | |
51 | -additional features such as position of two fingers, and width of the touch. | |
51 | +Currently the Linux Elantech touchpad driver is aware of four different | |
52 | +hardware versions unimaginatively called version 1,version 2, version 3 | |
53 | +and version 4. Version 1 is found in "older" laptops and uses 4 bytes per | |
54 | +packet. Version 2 seems to be introduced with the EeePC and uses 6 bytes | |
55 | +per packet, and provides additional features such as position of two fingers, | |
56 | +and width of the touch. Hardware version 3 uses 6 bytes per packet (and | |
57 | +for 2 fingers the concatenation of two 6 bytes packets) and allows tracking | |
58 | +of up to 3 fingers. Hardware version 4 uses 6 bytes per packet, and can | |
59 | +combine a status packet with multiple head or motion packets. Hardware version | |
60 | +4 allows tracking up to 5 fingers. | |
52 | 61 | |
62 | +Some Hardware version 3 and version 4 also have a trackpoint which uses a | |
63 | +separate packet format. It is also 6 bytes per packet. | |
64 | + | |
53 | 65 | The driver tries to support both hardware versions and should be compatible |
54 | 66 | with the Xorg Synaptics touchpad driver and its graphical configuration |
55 | 67 | utilities. |
56 | 68 | |
69 | +Note that a mouse button is also associated with either the touchpad or the | |
70 | +trackpoint when a trackpoint is available. Disabling the Touchpad in xorg | |
71 | +(TouchPadOff=0) will also disable the buttons associated with the touchpad. | |
72 | + | |
57 | 73 | Additionally the operation of the touchpad can be altered by adjusting the |
58 | 74 | contents of some of its internal registers. These registers are represented |
59 | 75 | by the driver as sysfs entries under /sys/bus/serio/drivers/psmouse/serio? |
... | ... | @@ -78,7 +94,7 @@ |
78 | 94 | 2. Extra knobs |
79 | 95 | ~~~~~~~~~~~ |
80 | 96 | |
81 | -Currently the Linux Elantech touchpad driver provides two extra knobs under | |
97 | +Currently the Linux Elantech touchpad driver provides three extra knobs under | |
82 | 98 | /sys/bus/serio/drivers/psmouse/serio? for the user. |
83 | 99 | |
84 | 100 | * debug |
... | ... | @@ -112,6 +128,20 @@ |
112 | 128 | data consistency checking can be done. For now checking is disabled by |
113 | 129 | default. Currently even turning it on will do nothing. |
114 | 130 | |
131 | +* crc_enabled | |
132 | + | |
133 | + Sets crc_enabled to 0/1. The name "crc_enabled" is the official name of | |
134 | + this integrity check, even though it is not an actual cyclic redundancy | |
135 | + check. | |
136 | + | |
137 | + Depending on the state of crc_enabled, certain basic data integrity | |
138 | + verification is done by the driver on hardware version 3 and 4. The | |
139 | + driver will reject any packet that appears corrupted. Using this knob, | |
140 | + The state of crc_enabled can be altered with this knob. | |
141 | + | |
142 | + Reading the crc_enabled value will show the active value. Echoing | |
143 | + "0" or "1" to this file will set the state to "0" or "1". | |
144 | + | |
115 | 145 | ///////////////////////////////////////////////////////////////////////////// |
116 | 146 | |
117 | 147 | 3. Differentiating hardware versions |
... | ... | @@ -746,4 +776,43 @@ |
746 | 776 | |
747 | 777 | byte 0 ~ 2 for one finger |
748 | 778 | byte 3 ~ 5 for another |
779 | + | |
780 | + | |
781 | +8. Trackpoint (for Hardware version 3 and 4) | |
782 | + ========================================= | |
783 | +8.1 Registers | |
784 | + ~~~~~~~~~ | |
785 | +No special registers have been identified. | |
786 | + | |
787 | +8.2 Native relative mode 6 byte packet format | |
788 | + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ | |
789 | +8.2.1 Status Packet | |
790 | + ~~~~~~~~~~~~~ | |
791 | + | |
792 | +byte 0: | |
793 | + bit 7 6 5 4 3 2 1 0 | |
794 | + 0 0 sx sy 0 M R L | |
795 | +byte 1: | |
796 | + bit 7 6 5 4 3 2 1 0 | |
797 | + ~sx 0 0 0 0 0 0 0 | |
798 | +byte 2: | |
799 | + bit 7 6 5 4 3 2 1 0 | |
800 | + ~sy 0 0 0 0 0 0 0 | |
801 | +byte 3: | |
802 | + bit 7 6 5 4 3 2 1 0 | |
803 | + 0 0 ~sy ~sx 0 1 1 0 | |
804 | +byte 4: | |
805 | + bit 7 6 5 4 3 2 1 0 | |
806 | + x7 x6 x5 x4 x3 x2 x1 x0 | |
807 | +byte 5: | |
808 | + bit 7 6 5 4 3 2 1 0 | |
809 | + y7 y6 y5 y4 y3 y2 y1 y0 | |
810 | + | |
811 | + | |
812 | + x and y are written in two's complement spread | |
813 | + over 9 bits with sx/sy the relative top bit and | |
814 | + x7..x0 and y7..y0 the lower bits. | |
815 | + ~sx is the inverse of sx, ~sy is the inverse of sy. | |
816 | + The sign of y is opposite to what the input driver | |
817 | + expects for a relative movement |
drivers/input/misc/twl4030-pwrbutton.c
drivers/input/mouse/alps.c
... | ... | @@ -1156,7 +1156,13 @@ |
1156 | 1156 | { |
1157 | 1157 | struct alps_data *priv = psmouse->private; |
1158 | 1158 | |
1159 | - if ((psmouse->packet[0] & 0xc8) == 0x08) { /* PS/2 packet */ | |
1159 | + /* | |
1160 | + * Check if we are dealing with a bare PS/2 packet, presumably from | |
1161 | + * a device connected to the external PS/2 port. Because bare PS/2 | |
1162 | + * protocol does not have enough constant bits to self-synchronize | |
1163 | + * properly we only do this if the device is fully synchronized. | |
1164 | + */ | |
1165 | + if (!psmouse->out_of_sync_cnt && (psmouse->packet[0] & 0xc8) == 0x08) { | |
1160 | 1166 | if (psmouse->pktcnt == 3) { |
1161 | 1167 | alps_report_bare_ps2_packet(psmouse, psmouse->packet, |
1162 | 1168 | true); |
1163 | 1169 | |
... | ... | @@ -1180,12 +1186,27 @@ |
1180 | 1186 | } |
1181 | 1187 | |
1182 | 1188 | /* Bytes 2 - pktsize should have 0 in the highest bit */ |
1183 | - if ((priv->proto_version < ALPS_PROTO_V5) && | |
1189 | + if (priv->proto_version < ALPS_PROTO_V5 && | |
1184 | 1190 | psmouse->pktcnt >= 2 && psmouse->pktcnt <= psmouse->pktsize && |
1185 | 1191 | (psmouse->packet[psmouse->pktcnt - 1] & 0x80)) { |
1186 | 1192 | psmouse_dbg(psmouse, "refusing packet[%i] = %x\n", |
1187 | 1193 | psmouse->pktcnt - 1, |
1188 | 1194 | psmouse->packet[psmouse->pktcnt - 1]); |
1195 | + | |
1196 | + if (priv->proto_version == ALPS_PROTO_V3 && | |
1197 | + psmouse->pktcnt == psmouse->pktsize) { | |
1198 | + /* | |
1199 | + * Some Dell boxes, such as Latitude E6440 or E7440 | |
1200 | + * with closed lid, quite often smash last byte of | |
1201 | + * otherwise valid packet with 0xff. Given that the | |
1202 | + * next packet is very likely to be valid let's | |
1203 | + * report PSMOUSE_FULL_PACKET but not process data, | |
1204 | + * rather than reporting PSMOUSE_BAD_DATA and | |
1205 | + * filling the logs. | |
1206 | + */ | |
1207 | + return PSMOUSE_FULL_PACKET; | |
1208 | + } | |
1209 | + | |
1189 | 1210 | return PSMOUSE_BAD_DATA; |
1190 | 1211 | } |
1191 | 1212 | |
... | ... | @@ -2388,6 +2409,9 @@ |
2388 | 2409 | |
2389 | 2410 | /* We are having trouble resyncing ALPS touchpads so disable it for now */ |
2390 | 2411 | psmouse->resync_time = 0; |
2412 | + | |
2413 | + /* Allow 2 invalid packets without resetting device */ | |
2414 | + psmouse->resetafter = psmouse->pktsize * 2; | |
2391 | 2415 | |
2392 | 2416 | return 0; |
2393 | 2417 |
drivers/input/mouse/elantech.c
... | ... | @@ -563,6 +563,7 @@ |
563 | 563 | } else { |
564 | 564 | input_report_key(dev, BTN_LEFT, packet[0] & 0x01); |
565 | 565 | input_report_key(dev, BTN_RIGHT, packet[0] & 0x02); |
566 | + input_report_key(dev, BTN_MIDDLE, packet[0] & 0x04); | |
566 | 567 | } |
567 | 568 | |
568 | 569 | input_mt_report_pointer_emulation(dev, true); |
... | ... | @@ -792,6 +793,9 @@ |
792 | 793 | unsigned char packet_type = packet[3] & 0x03; |
793 | 794 | bool sanity_check; |
794 | 795 | |
796 | + if ((packet[3] & 0x0f) == 0x06) | |
797 | + return PACKET_TRACKPOINT; | |
798 | + | |
795 | 799 | /* |
796 | 800 | * Sanity check based on the constant bits of a packet. |
797 | 801 | * The constant bits change depending on the value of |
798 | 802 | |
... | ... | @@ -877,10 +881,19 @@ |
877 | 881 | |
878 | 882 | case 4: |
879 | 883 | packet_type = elantech_packet_check_v4(psmouse); |
880 | - if (packet_type == PACKET_UNKNOWN) | |
884 | + switch (packet_type) { | |
885 | + case PACKET_UNKNOWN: | |
881 | 886 | return PSMOUSE_BAD_DATA; |
882 | 887 | |
883 | - elantech_report_absolute_v4(psmouse, packet_type); | |
888 | + case PACKET_TRACKPOINT: | |
889 | + elantech_report_trackpoint(psmouse, packet_type); | |
890 | + break; | |
891 | + | |
892 | + default: | |
893 | + elantech_report_absolute_v4(psmouse, packet_type); | |
894 | + break; | |
895 | + } | |
896 | + | |
884 | 897 | break; |
885 | 898 | } |
886 | 899 | |
... | ... | @@ -1120,6 +1133,22 @@ |
1120 | 1133 | } |
1121 | 1134 | |
1122 | 1135 | /* |
1136 | + * Some hw_version 4 models do have a middle button | |
1137 | + */ | |
1138 | +static const struct dmi_system_id elantech_dmi_has_middle_button[] = { | |
1139 | +#if defined(CONFIG_DMI) && defined(CONFIG_X86) | |
1140 | + { | |
1141 | + /* Fujitsu H730 has a middle button */ | |
1142 | + .matches = { | |
1143 | + DMI_MATCH(DMI_SYS_VENDOR, "FUJITSU"), | |
1144 | + DMI_MATCH(DMI_PRODUCT_NAME, "CELSIUS H730"), | |
1145 | + }, | |
1146 | + }, | |
1147 | +#endif | |
1148 | + { } | |
1149 | +}; | |
1150 | + | |
1151 | +/* | |
1123 | 1152 | * Set the appropriate event bits for the input subsystem |
1124 | 1153 | */ |
1125 | 1154 | static int elantech_set_input_params(struct psmouse *psmouse) |
... | ... | @@ -1138,6 +1167,8 @@ |
1138 | 1167 | __clear_bit(EV_REL, dev->evbit); |
1139 | 1168 | |
1140 | 1169 | __set_bit(BTN_LEFT, dev->keybit); |
1170 | + if (dmi_check_system(elantech_dmi_has_middle_button)) | |
1171 | + __set_bit(BTN_MIDDLE, dev->keybit); | |
1141 | 1172 | __set_bit(BTN_RIGHT, dev->keybit); |
1142 | 1173 | |
1143 | 1174 | __set_bit(BTN_TOUCH, dev->keybit); |
... | ... | @@ -1299,6 +1330,7 @@ |
1299 | 1330 | ELANTECH_INT_ATTR(reg_26, 0x26); |
1300 | 1331 | ELANTECH_INT_ATTR(debug, 0); |
1301 | 1332 | ELANTECH_INT_ATTR(paritycheck, 0); |
1333 | +ELANTECH_INT_ATTR(crc_enabled, 0); | |
1302 | 1334 | |
1303 | 1335 | static struct attribute *elantech_attrs[] = { |
1304 | 1336 | &psmouse_attr_reg_07.dattr.attr, |
... | ... | @@ -1313,6 +1345,7 @@ |
1313 | 1345 | &psmouse_attr_reg_26.dattr.attr, |
1314 | 1346 | &psmouse_attr_debug.dattr.attr, |
1315 | 1347 | &psmouse_attr_paritycheck.dattr.attr, |
1348 | + &psmouse_attr_crc_enabled.dattr.attr, | |
1316 | 1349 | NULL |
1317 | 1350 | }; |
1318 | 1351 | |
... | ... | @@ -1439,6 +1472,22 @@ |
1439 | 1472 | } |
1440 | 1473 | |
1441 | 1474 | /* |
1475 | + * Some hw_version 4 models do not work with crc_disabled | |
1476 | + */ | |
1477 | +static const struct dmi_system_id elantech_dmi_force_crc_enabled[] = { | |
1478 | +#if defined(CONFIG_DMI) && defined(CONFIG_X86) | |
1479 | + { | |
1480 | + /* Fujitsu H730 does not work with crc_enabled == 0 */ | |
1481 | + .matches = { | |
1482 | + DMI_MATCH(DMI_SYS_VENDOR, "FUJITSU"), | |
1483 | + DMI_MATCH(DMI_PRODUCT_NAME, "CELSIUS H730"), | |
1484 | + }, | |
1485 | + }, | |
1486 | +#endif | |
1487 | + { } | |
1488 | +}; | |
1489 | + | |
1490 | +/* | |
1442 | 1491 | * Some hw_version 3 models go into error state when we try to set |
1443 | 1492 | * bit 3 and/or bit 1 of r10. |
1444 | 1493 | */ |
... | ... | @@ -1513,7 +1562,8 @@ |
1513 | 1562 | * The signatures of v3 and v4 packets change depending on the |
1514 | 1563 | * value of this hardware flag. |
1515 | 1564 | */ |
1516 | - etd->crc_enabled = ((etd->fw_version & 0x4000) == 0x4000); | |
1565 | + etd->crc_enabled = (etd->fw_version & 0x4000) == 0x4000 || | |
1566 | + dmi_check_system(elantech_dmi_force_crc_enabled); | |
1517 | 1567 | |
1518 | 1568 | /* Enable real hardware resolution on hw_version 3 ? */ |
1519 | 1569 | etd->set_hw_resolution = !dmi_check_system(no_hw_res_dmi_table); |
drivers/input/mouse/synaptics.c
... | ... | @@ -135,8 +135,8 @@ |
135 | 135 | 1232, 5710, 1156, 4696 |
136 | 136 | }, |
137 | 137 | { |
138 | - (const char * const []){"LEN0034", "LEN0036", "LEN2002", | |
139 | - "LEN2004", NULL}, | |
138 | + (const char * const []){"LEN0034", "LEN0036", "LEN0039", | |
139 | + "LEN2002", "LEN2004", NULL}, | |
140 | 140 | 1024, 5112, 2024, 4832 |
141 | 141 | }, |
142 | 142 | { |
... | ... | @@ -163,6 +163,7 @@ |
163 | 163 | "LEN0036", /* T440 */ |
164 | 164 | "LEN0037", |
165 | 165 | "LEN0038", |
166 | + "LEN0039", /* T440s */ | |
166 | 167 | "LEN0041", |
167 | 168 | "LEN0042", /* Yoga */ |
168 | 169 | "LEN0045", |