aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/input
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/input')
-rw-r--r--drivers/input/evdev.c2
-rw-r--r--drivers/input/joystick/xpad.c16
-rw-r--r--drivers/input/misc/twl4030-pwrbutton.c1
-rw-r--r--drivers/input/mouse/alps.c28
-rw-r--r--drivers/input/mouse/elantech.c64
-rw-r--r--drivers/input/mouse/synaptics.c9
6 files changed, 101 insertions, 19 deletions
diff --git a/drivers/input/evdev.c b/drivers/input/evdev.c
index bc203485716d..8afa28e4570e 100644
--- a/drivers/input/evdev.c
+++ b/drivers/input/evdev.c
@@ -421,7 +421,7 @@ static int evdev_open(struct inode *inode, struct file *file)
421 421
422 err_free_client: 422 err_free_client:
423 evdev_detach_client(evdev, client); 423 evdev_detach_client(evdev, client);
424 kfree(client); 424 kvfree(client);
425 return error; 425 return error;
426} 426}
427 427
diff --git a/drivers/input/joystick/xpad.c b/drivers/input/joystick/xpad.c
index 2ed7905a068f..fc55f0d15b70 100644
--- a/drivers/input/joystick/xpad.c
+++ b/drivers/input/joystick/xpad.c
@@ -1179,9 +1179,19 @@ static int xpad_probe(struct usb_interface *intf, const struct usb_device_id *id
1179 } 1179 }
1180 1180
1181 ep_irq_in = &intf->cur_altsetting->endpoint[1].desc; 1181 ep_irq_in = &intf->cur_altsetting->endpoint[1].desc;
1182 usb_fill_bulk_urb(xpad->bulk_out, udev, 1182 if (usb_endpoint_is_bulk_out(ep_irq_in)) {
1183 usb_sndbulkpipe(udev, ep_irq_in->bEndpointAddress), 1183 usb_fill_bulk_urb(xpad->bulk_out, udev,
1184 xpad->bdata, XPAD_PKT_LEN, xpad_bulk_out, xpad); 1184 usb_sndbulkpipe(udev,
1185 ep_irq_in->bEndpointAddress),
1186 xpad->bdata, XPAD_PKT_LEN,
1187 xpad_bulk_out, xpad);
1188 } else {
1189 usb_fill_int_urb(xpad->bulk_out, udev,
1190 usb_sndintpipe(udev,
1191 ep_irq_in->bEndpointAddress),
1192 xpad->bdata, XPAD_PKT_LEN,
1193 xpad_bulk_out, xpad, 0);
1194 }
1185 1195
1186 /* 1196 /*
1187 * Submit the int URB immediately rather than waiting for open 1197 * Submit the int URB immediately rather than waiting for open
diff --git a/drivers/input/misc/twl4030-pwrbutton.c b/drivers/input/misc/twl4030-pwrbutton.c
index fb3b63b2f85c..8400a1a34d87 100644
--- a/drivers/input/misc/twl4030-pwrbutton.c
+++ b/drivers/input/misc/twl4030-pwrbutton.c
@@ -85,6 +85,7 @@ static int twl4030_pwrbutton_probe(struct platform_device *pdev)
85 } 85 }
86 86
87 platform_set_drvdata(pdev, pwr); 87 platform_set_drvdata(pdev, pwr);
88 device_init_wakeup(&pdev->dev, true);
88 89
89 return 0; 90 return 0;
90} 91}
diff --git a/drivers/input/mouse/alps.c b/drivers/input/mouse/alps.c
index 2b0ae8cc8e51..d125a019383f 100644
--- a/drivers/input/mouse/alps.c
+++ b/drivers/input/mouse/alps.c
@@ -1156,7 +1156,13 @@ static psmouse_ret_t alps_process_byte(struct psmouse *psmouse)
1156{ 1156{
1157 struct alps_data *priv = psmouse->private; 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 if (psmouse->pktcnt == 3) { 1166 if (psmouse->pktcnt == 3) {
1161 alps_report_bare_ps2_packet(psmouse, psmouse->packet, 1167 alps_report_bare_ps2_packet(psmouse, psmouse->packet,
1162 true); 1168 true);
@@ -1180,12 +1186,27 @@ static psmouse_ret_t alps_process_byte(struct psmouse *psmouse)
1180 } 1186 }
1181 1187
1182 /* Bytes 2 - pktsize should have 0 in the highest bit */ 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 psmouse->pktcnt >= 2 && psmouse->pktcnt <= psmouse->pktsize && 1190 psmouse->pktcnt >= 2 && psmouse->pktcnt <= psmouse->pktsize &&
1185 (psmouse->packet[psmouse->pktcnt - 1] & 0x80)) { 1191 (psmouse->packet[psmouse->pktcnt - 1] & 0x80)) {
1186 psmouse_dbg(psmouse, "refusing packet[%i] = %x\n", 1192 psmouse_dbg(psmouse, "refusing packet[%i] = %x\n",
1187 psmouse->pktcnt - 1, 1193 psmouse->pktcnt - 1,
1188 psmouse->packet[psmouse->pktcnt - 1]); 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 return PSMOUSE_BAD_DATA; 1210 return PSMOUSE_BAD_DATA;
1190 } 1211 }
1191 1212
@@ -2389,6 +2410,9 @@ int alps_init(struct psmouse *psmouse)
2389 /* We are having trouble resyncing ALPS touchpads so disable it for now */ 2410 /* We are having trouble resyncing ALPS touchpads so disable it for now */
2390 psmouse->resync_time = 0; 2411 psmouse->resync_time = 0;
2391 2412
2413 /* Allow 2 invalid packets without resetting device */
2414 psmouse->resetafter = psmouse->pktsize * 2;
2415
2392 return 0; 2416 return 0;
2393 2417
2394init_fail: 2418init_fail:
diff --git a/drivers/input/mouse/elantech.c b/drivers/input/mouse/elantech.c
index 06fc6e76ffbe..f2b978026407 100644
--- a/drivers/input/mouse/elantech.c
+++ b/drivers/input/mouse/elantech.c
@@ -428,14 +428,6 @@ static void elantech_report_trackpoint(struct psmouse *psmouse,
428 int x, y; 428 int x, y;
429 u32 t; 429 u32 t;
430 430
431 if (dev_WARN_ONCE(&psmouse->ps2dev.serio->dev,
432 !tp_dev,
433 psmouse_fmt("Unexpected trackpoint message\n"))) {
434 if (etd->debug == 1)
435 elantech_packet_dump(psmouse);
436 return;
437 }
438
439 t = get_unaligned_le32(&packet[0]); 431 t = get_unaligned_le32(&packet[0]);
440 432
441 switch (t & ~7U) { 433 switch (t & ~7U) {
@@ -563,6 +555,7 @@ static void elantech_input_sync_v4(struct psmouse *psmouse)
563 } else { 555 } else {
564 input_report_key(dev, BTN_LEFT, packet[0] & 0x01); 556 input_report_key(dev, BTN_LEFT, packet[0] & 0x01);
565 input_report_key(dev, BTN_RIGHT, packet[0] & 0x02); 557 input_report_key(dev, BTN_RIGHT, packet[0] & 0x02);
558 input_report_key(dev, BTN_MIDDLE, packet[0] & 0x04);
566 } 559 }
567 560
568 input_mt_report_pointer_emulation(dev, true); 561 input_mt_report_pointer_emulation(dev, true);
@@ -792,6 +785,9 @@ static int elantech_packet_check_v4(struct psmouse *psmouse)
792 unsigned char packet_type = packet[3] & 0x03; 785 unsigned char packet_type = packet[3] & 0x03;
793 bool sanity_check; 786 bool sanity_check;
794 787
788 if (etd->tp_dev && (packet[3] & 0x0f) == 0x06)
789 return PACKET_TRACKPOINT;
790
795 /* 791 /*
796 * Sanity check based on the constant bits of a packet. 792 * Sanity check based on the constant bits of a packet.
797 * The constant bits change depending on the value of 793 * The constant bits change depending on the value of
@@ -877,10 +873,19 @@ static psmouse_ret_t elantech_process_byte(struct psmouse *psmouse)
877 873
878 case 4: 874 case 4:
879 packet_type = elantech_packet_check_v4(psmouse); 875 packet_type = elantech_packet_check_v4(psmouse);
880 if (packet_type == PACKET_UNKNOWN) 876 switch (packet_type) {
877 case PACKET_UNKNOWN:
881 return PSMOUSE_BAD_DATA; 878 return PSMOUSE_BAD_DATA;
882 879
883 elantech_report_absolute_v4(psmouse, packet_type); 880 case PACKET_TRACKPOINT:
881 elantech_report_trackpoint(psmouse, packet_type);
882 break;
883
884 default:
885 elantech_report_absolute_v4(psmouse, packet_type);
886 break;
887 }
888
884 break; 889 break;
885 } 890 }
886 891
@@ -1120,6 +1125,22 @@ static void elantech_set_buttonpad_prop(struct psmouse *psmouse)
1120} 1125}
1121 1126
1122/* 1127/*
1128 * Some hw_version 4 models do have a middle button
1129 */
1130static const struct dmi_system_id elantech_dmi_has_middle_button[] = {
1131#if defined(CONFIG_DMI) && defined(CONFIG_X86)
1132 {
1133 /* Fujitsu H730 has a middle button */
1134 .matches = {
1135 DMI_MATCH(DMI_SYS_VENDOR, "FUJITSU"),
1136 DMI_MATCH(DMI_PRODUCT_NAME, "CELSIUS H730"),
1137 },
1138 },
1139#endif
1140 { }
1141};
1142
1143/*
1123 * Set the appropriate event bits for the input subsystem 1144 * Set the appropriate event bits for the input subsystem
1124 */ 1145 */
1125static int elantech_set_input_params(struct psmouse *psmouse) 1146static int elantech_set_input_params(struct psmouse *psmouse)
@@ -1138,6 +1159,8 @@ static int elantech_set_input_params(struct psmouse *psmouse)
1138 __clear_bit(EV_REL, dev->evbit); 1159 __clear_bit(EV_REL, dev->evbit);
1139 1160
1140 __set_bit(BTN_LEFT, dev->keybit); 1161 __set_bit(BTN_LEFT, dev->keybit);
1162 if (dmi_check_system(elantech_dmi_has_middle_button))
1163 __set_bit(BTN_MIDDLE, dev->keybit);
1141 __set_bit(BTN_RIGHT, dev->keybit); 1164 __set_bit(BTN_RIGHT, dev->keybit);
1142 1165
1143 __set_bit(BTN_TOUCH, dev->keybit); 1166 __set_bit(BTN_TOUCH, dev->keybit);
@@ -1299,6 +1322,7 @@ ELANTECH_INT_ATTR(reg_25, 0x25);
1299ELANTECH_INT_ATTR(reg_26, 0x26); 1322ELANTECH_INT_ATTR(reg_26, 0x26);
1300ELANTECH_INT_ATTR(debug, 0); 1323ELANTECH_INT_ATTR(debug, 0);
1301ELANTECH_INT_ATTR(paritycheck, 0); 1324ELANTECH_INT_ATTR(paritycheck, 0);
1325ELANTECH_INT_ATTR(crc_enabled, 0);
1302 1326
1303static struct attribute *elantech_attrs[] = { 1327static struct attribute *elantech_attrs[] = {
1304 &psmouse_attr_reg_07.dattr.attr, 1328 &psmouse_attr_reg_07.dattr.attr,
@@ -1313,6 +1337,7 @@ static struct attribute *elantech_attrs[] = {
1313 &psmouse_attr_reg_26.dattr.attr, 1337 &psmouse_attr_reg_26.dattr.attr,
1314 &psmouse_attr_debug.dattr.attr, 1338 &psmouse_attr_debug.dattr.attr,
1315 &psmouse_attr_paritycheck.dattr.attr, 1339 &psmouse_attr_paritycheck.dattr.attr,
1340 &psmouse_attr_crc_enabled.dattr.attr,
1316 NULL 1341 NULL
1317}; 1342};
1318 1343
@@ -1439,6 +1464,22 @@ static int elantech_reconnect(struct psmouse *psmouse)
1439} 1464}
1440 1465
1441/* 1466/*
1467 * Some hw_version 4 models do not work with crc_disabled
1468 */
1469static const struct dmi_system_id elantech_dmi_force_crc_enabled[] = {
1470#if defined(CONFIG_DMI) && defined(CONFIG_X86)
1471 {
1472 /* Fujitsu H730 does not work with crc_enabled == 0 */
1473 .matches = {
1474 DMI_MATCH(DMI_SYS_VENDOR, "FUJITSU"),
1475 DMI_MATCH(DMI_PRODUCT_NAME, "CELSIUS H730"),
1476 },
1477 },
1478#endif
1479 { }
1480};
1481
1482/*
1442 * Some hw_version 3 models go into error state when we try to set 1483 * Some hw_version 3 models go into error state when we try to set
1443 * bit 3 and/or bit 1 of r10. 1484 * bit 3 and/or bit 1 of r10.
1444 */ 1485 */
@@ -1513,7 +1554,8 @@ static int elantech_set_properties(struct elantech_data *etd)
1513 * The signatures of v3 and v4 packets change depending on the 1554 * The signatures of v3 and v4 packets change depending on the
1514 * value of this hardware flag. 1555 * value of this hardware flag.
1515 */ 1556 */
1516 etd->crc_enabled = ((etd->fw_version & 0x4000) == 0x4000); 1557 etd->crc_enabled = (etd->fw_version & 0x4000) == 0x4000 ||
1558 dmi_check_system(elantech_dmi_force_crc_enabled);
1517 1559
1518 /* Enable real hardware resolution on hw_version 3 ? */ 1560 /* Enable real hardware resolution on hw_version 3 ? */
1519 etd->set_hw_resolution = !dmi_check_system(no_hw_res_dmi_table); 1561 etd->set_hw_resolution = !dmi_check_system(no_hw_res_dmi_table);
diff --git a/drivers/input/mouse/synaptics.c b/drivers/input/mouse/synaptics.c
index 9031a0a28ea4..f9472920d986 100644
--- a/drivers/input/mouse/synaptics.c
+++ b/drivers/input/mouse/synaptics.c
@@ -135,14 +135,18 @@ static const struct min_max_quirk min_max_pnpid_table[] = {
135 1232, 5710, 1156, 4696 135 1232, 5710, 1156, 4696
136 }, 136 },
137 { 137 {
138 (const char * const []){"LEN0034", "LEN0036", "LEN2002", 138 (const char * const []){"LEN0034", "LEN0036", "LEN0039",
139 "LEN2004", NULL}, 139 "LEN2002", "LEN2004", NULL},
140 1024, 5112, 2024, 4832 140 1024, 5112, 2024, 4832
141 }, 141 },
142 { 142 {
143 (const char * const []){"LEN2001", NULL}, 143 (const char * const []){"LEN2001", NULL},
144 1024, 5022, 2508, 4832 144 1024, 5022, 2508, 4832
145 }, 145 },
146 {
147 (const char * const []){"LEN2006", NULL},
148 1264, 5675, 1171, 4688
149 },
146 { } 150 { }
147}; 151};
148 152
@@ -163,6 +167,7 @@ static const char * const topbuttonpad_pnp_ids[] = {
163 "LEN0036", /* T440 */ 167 "LEN0036", /* T440 */
164 "LEN0037", 168 "LEN0037",
165 "LEN0038", 169 "LEN0038",
170 "LEN0039", /* T440s */
166 "LEN0041", 171 "LEN0041",
167 "LEN0042", /* Yoga */ 172 "LEN0042", /* Yoga */
168 "LEN0045", 173 "LEN0045",