Commit 56c381f93d57b88a3e667a2f55137947315c17e2

Authored by Linus Torvalds

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
... ... @@ -85,6 +85,7 @@
85 85 }
86 86  
87 87 platform_set_drvdata(pdev, pwr);
  88 + device_init_wakeup(&pdev->dev, true);
88 89  
89 90 return 0;
90 91 }
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",