diff options
author | Linus Torvalds <torvalds@linux-foundation.org> | 2015-08-09 03:38:42 -0400 |
---|---|---|
committer | Linus Torvalds <torvalds@linux-foundation.org> | 2015-08-09 03:38:42 -0400 |
commit | a230e95cc66a5a27e53459187ffcedb65b2782c3 (patch) | |
tree | 55b63047d36fd42f4920762318aae6da404e02b3 | |
parent | 3fbdc379567aef1c43b4be110179b541d68afdf6 (diff) | |
parent | 6b30c73e9f37183ad60c7f7050acf8e8edf91e9c (diff) |
Merge branch 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/dtor/input
Pull input subsystem fixes from Dmitry Torokhov:
"Just small ALPS and Elan touchpads, and other driver fixups"
* 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/dtor/input:
Input: elantech - add special check for fw_version 0x470f01 touchpad
Input: twl4030-vibra - fix ERROR: Bad of_node_put() warning
Input: alps - only Dell laptops have separate button bits for v2 dualpoint sticks
Input: axp20x-pek - add module alias
Input: turbografx - fix potential out of bound access
-rw-r--r-- | Documentation/input/alps.txt | 6 | ||||
-rw-r--r-- | drivers/input/joystick/turbografx.c | 2 | ||||
-rw-r--r-- | drivers/input/misc/axp20x-pek.c | 1 | ||||
-rw-r--r-- | drivers/input/misc/twl4030-vibra.c | 3 | ||||
-rw-r--r-- | drivers/input/mouse/alps.c | 8 | ||||
-rw-r--r-- | drivers/input/mouse/elantech.c | 22 | ||||
-rw-r--r-- | drivers/input/mouse/elantech.h | 1 |
7 files changed, 35 insertions, 8 deletions
diff --git a/Documentation/input/alps.txt b/Documentation/input/alps.txt index c86f2f1ae4f6..1fec1135791d 100644 --- a/Documentation/input/alps.txt +++ b/Documentation/input/alps.txt | |||
@@ -119,8 +119,10 @@ ALPS Absolute Mode - Protocol Version 2 | |||
119 | byte 5: 0 z6 z5 z4 z3 z2 z1 z0 | 119 | byte 5: 0 z6 z5 z4 z3 z2 z1 z0 |
120 | 120 | ||
121 | Protocol Version 2 DualPoint devices send standard PS/2 mouse packets for | 121 | Protocol Version 2 DualPoint devices send standard PS/2 mouse packets for |
122 | the DualPoint Stick. For non interleaved dualpoint devices the pointingstick | 122 | the DualPoint Stick. The M, R and L bits signal the combined status of both |
123 | buttons get reported separately in the PSM, PSR and PSL bits. | 123 | the pointingstick and touchpad buttons, except for Dell dualpoint devices |
124 | where the pointingstick buttons get reported separately in the PSM, PSR | ||
125 | and PSL bits. | ||
124 | 126 | ||
125 | Dualpoint device -- interleaved packet format | 127 | Dualpoint device -- interleaved packet format |
126 | --------------------------------------------- | 128 | --------------------------------------------- |
diff --git a/drivers/input/joystick/turbografx.c b/drivers/input/joystick/turbografx.c index 27b6a3ce18ca..891797ad76bc 100644 --- a/drivers/input/joystick/turbografx.c +++ b/drivers/input/joystick/turbografx.c | |||
@@ -196,7 +196,7 @@ static struct tgfx __init *tgfx_probe(int parport, int *n_buttons, int n_devs) | |||
196 | if (n_buttons[i] < 1) | 196 | if (n_buttons[i] < 1) |
197 | continue; | 197 | continue; |
198 | 198 | ||
199 | if (n_buttons[i] > 6) { | 199 | if (n_buttons[i] > ARRAY_SIZE(tgfx_buttons)) { |
200 | printk(KERN_ERR "turbografx.c: Invalid number of buttons %d\n", n_buttons[i]); | 200 | printk(KERN_ERR "turbografx.c: Invalid number of buttons %d\n", n_buttons[i]); |
201 | err = -EINVAL; | 201 | err = -EINVAL; |
202 | goto err_unreg_devs; | 202 | goto err_unreg_devs; |
diff --git a/drivers/input/misc/axp20x-pek.c b/drivers/input/misc/axp20x-pek.c index 10e140af5aac..1ac898db303a 100644 --- a/drivers/input/misc/axp20x-pek.c +++ b/drivers/input/misc/axp20x-pek.c | |||
@@ -292,3 +292,4 @@ module_platform_driver(axp20x_pek_driver); | |||
292 | MODULE_DESCRIPTION("axp20x Power Button"); | 292 | MODULE_DESCRIPTION("axp20x Power Button"); |
293 | MODULE_AUTHOR("Carlo Caione <carlo@caione.org>"); | 293 | MODULE_AUTHOR("Carlo Caione <carlo@caione.org>"); |
294 | MODULE_LICENSE("GPL"); | 294 | MODULE_LICENSE("GPL"); |
295 | MODULE_ALIAS("platform:axp20x-pek"); | ||
diff --git a/drivers/input/misc/twl4030-vibra.c b/drivers/input/misc/twl4030-vibra.c index fc17b9592f54..10c4e3d462f1 100644 --- a/drivers/input/misc/twl4030-vibra.c +++ b/drivers/input/misc/twl4030-vibra.c | |||
@@ -183,7 +183,8 @@ static bool twl4030_vibra_check_coexist(struct twl4030_vibra_data *pdata, | |||
183 | if (pdata && pdata->coexist) | 183 | if (pdata && pdata->coexist) |
184 | return true; | 184 | return true; |
185 | 185 | ||
186 | if (of_find_node_by_name(node, "codec")) { | 186 | node = of_find_node_by_name(node, "codec"); |
187 | if (node) { | ||
187 | of_node_put(node); | 188 | of_node_put(node); |
188 | return true; | 189 | return true; |
189 | } | 190 | } |
diff --git a/drivers/input/mouse/alps.c b/drivers/input/mouse/alps.c index 113d6f1516a5..4d246861d692 100644 --- a/drivers/input/mouse/alps.c +++ b/drivers/input/mouse/alps.c | |||
@@ -20,6 +20,7 @@ | |||
20 | #include <linux/input/mt.h> | 20 | #include <linux/input/mt.h> |
21 | #include <linux/serio.h> | 21 | #include <linux/serio.h> |
22 | #include <linux/libps2.h> | 22 | #include <linux/libps2.h> |
23 | #include <linux/dmi.h> | ||
23 | 24 | ||
24 | #include "psmouse.h" | 25 | #include "psmouse.h" |
25 | #include "alps.h" | 26 | #include "alps.h" |
@@ -99,6 +100,7 @@ static const struct alps_nibble_commands alps_v6_nibble_commands[] = { | |||
99 | #define ALPS_FOUR_BUTTONS 0x40 /* 4 direction button present */ | 100 | #define ALPS_FOUR_BUTTONS 0x40 /* 4 direction button present */ |
100 | #define ALPS_PS2_INTERLEAVED 0x80 /* 3-byte PS/2 packet interleaved with | 101 | #define ALPS_PS2_INTERLEAVED 0x80 /* 3-byte PS/2 packet interleaved with |
101 | 6-byte ALPS packet */ | 102 | 6-byte ALPS packet */ |
103 | #define ALPS_DELL 0x100 /* device is a Dell laptop */ | ||
102 | #define ALPS_BUTTONPAD 0x200 /* device is a clickpad */ | 104 | #define ALPS_BUTTONPAD 0x200 /* device is a clickpad */ |
103 | 105 | ||
104 | static const struct alps_model_info alps_model_data[] = { | 106 | static const struct alps_model_info alps_model_data[] = { |
@@ -251,9 +253,9 @@ static void alps_process_packet_v1_v2(struct psmouse *psmouse) | |||
251 | return; | 253 | return; |
252 | } | 254 | } |
253 | 255 | ||
254 | /* Non interleaved V2 dualpoint has separate stick button bits */ | 256 | /* Dell non interleaved V2 dualpoint has separate stick button bits */ |
255 | if (priv->proto_version == ALPS_PROTO_V2 && | 257 | if (priv->proto_version == ALPS_PROTO_V2 && |
256 | priv->flags == (ALPS_PASS | ALPS_DUALPOINT)) { | 258 | priv->flags == (ALPS_DELL | ALPS_PASS | ALPS_DUALPOINT)) { |
257 | left |= packet[0] & 1; | 259 | left |= packet[0] & 1; |
258 | right |= packet[0] & 2; | 260 | right |= packet[0] & 2; |
259 | middle |= packet[0] & 4; | 261 | middle |= packet[0] & 4; |
@@ -2550,6 +2552,8 @@ static int alps_set_protocol(struct psmouse *psmouse, | |||
2550 | priv->byte0 = protocol->byte0; | 2552 | priv->byte0 = protocol->byte0; |
2551 | priv->mask0 = protocol->mask0; | 2553 | priv->mask0 = protocol->mask0; |
2552 | priv->flags = protocol->flags; | 2554 | priv->flags = protocol->flags; |
2555 | if (dmi_name_in_vendors("Dell")) | ||
2556 | priv->flags |= ALPS_DELL; | ||
2553 | 2557 | ||
2554 | priv->x_max = 2000; | 2558 | priv->x_max = 2000; |
2555 | priv->y_max = 1400; | 2559 | priv->y_max = 1400; |
diff --git a/drivers/input/mouse/elantech.c b/drivers/input/mouse/elantech.c index 22b9ca901f4e..2955f1d0ca6c 100644 --- a/drivers/input/mouse/elantech.c +++ b/drivers/input/mouse/elantech.c | |||
@@ -783,19 +783,26 @@ static int elantech_packet_check_v4(struct psmouse *psmouse) | |||
783 | struct elantech_data *etd = psmouse->private; | 783 | struct elantech_data *etd = psmouse->private; |
784 | unsigned char *packet = psmouse->packet; | 784 | unsigned char *packet = psmouse->packet; |
785 | unsigned char packet_type = packet[3] & 0x03; | 785 | unsigned char packet_type = packet[3] & 0x03; |
786 | unsigned int ic_version; | ||
786 | bool sanity_check; | 787 | bool sanity_check; |
787 | 788 | ||
788 | if (etd->tp_dev && (packet[3] & 0x0f) == 0x06) | 789 | if (etd->tp_dev && (packet[3] & 0x0f) == 0x06) |
789 | return PACKET_TRACKPOINT; | 790 | return PACKET_TRACKPOINT; |
790 | 791 | ||
792 | /* This represents the version of IC body. */ | ||
793 | ic_version = (etd->fw_version & 0x0f0000) >> 16; | ||
794 | |||
791 | /* | 795 | /* |
792 | * Sanity check based on the constant bits of a packet. | 796 | * Sanity check based on the constant bits of a packet. |
793 | * The constant bits change depending on the value of | 797 | * The constant bits change depending on the value of |
794 | * the hardware flag 'crc_enabled' but are the same for | 798 | * the hardware flag 'crc_enabled' and the version of |
795 | * every packet, regardless of the type. | 799 | * the IC body, but are the same for every packet, |
800 | * regardless of the type. | ||
796 | */ | 801 | */ |
797 | if (etd->crc_enabled) | 802 | if (etd->crc_enabled) |
798 | sanity_check = ((packet[3] & 0x08) == 0x00); | 803 | sanity_check = ((packet[3] & 0x08) == 0x00); |
804 | else if (ic_version == 7 && etd->samples[1] == 0x2A) | ||
805 | sanity_check = ((packet[3] & 0x1c) == 0x10); | ||
799 | else | 806 | else |
800 | sanity_check = ((packet[0] & 0x0c) == 0x04 && | 807 | sanity_check = ((packet[0] & 0x0c) == 0x04 && |
801 | (packet[3] & 0x1c) == 0x10); | 808 | (packet[3] & 0x1c) == 0x10); |
@@ -1116,6 +1123,7 @@ static int elantech_get_resolution_v4(struct psmouse *psmouse, | |||
1116 | * Avatar AVIU-145A2 0x361f00 ? clickpad | 1123 | * Avatar AVIU-145A2 0x361f00 ? clickpad |
1117 | * Fujitsu LIFEBOOK E544 0x470f00 d0, 12, 09 2 hw buttons | 1124 | * Fujitsu LIFEBOOK E544 0x470f00 d0, 12, 09 2 hw buttons |
1118 | * Fujitsu LIFEBOOK E554 0x570f01 40, 14, 0c 2 hw buttons | 1125 | * Fujitsu LIFEBOOK E554 0x570f01 40, 14, 0c 2 hw buttons |
1126 | * Fujitsu T725 0x470f01 05, 12, 09 2 hw buttons | ||
1119 | * Fujitsu H730 0x570f00 c0, 14, 0c 3 hw buttons (**) | 1127 | * Fujitsu H730 0x570f00 c0, 14, 0c 3 hw buttons (**) |
1120 | * Gigabyte U2442 0x450f01 58, 17, 0c 2 hw buttons | 1128 | * Gigabyte U2442 0x450f01 58, 17, 0c 2 hw buttons |
1121 | * Lenovo L430 0x350f02 b9, 15, 0c 2 hw buttons (*) | 1129 | * Lenovo L430 0x350f02 b9, 15, 0c 2 hw buttons (*) |
@@ -1651,6 +1659,16 @@ int elantech_init(struct psmouse *psmouse) | |||
1651 | etd->capabilities[0], etd->capabilities[1], | 1659 | etd->capabilities[0], etd->capabilities[1], |
1652 | etd->capabilities[2]); | 1660 | etd->capabilities[2]); |
1653 | 1661 | ||
1662 | if (etd->hw_version != 1) { | ||
1663 | if (etd->send_cmd(psmouse, ETP_SAMPLE_QUERY, etd->samples)) { | ||
1664 | psmouse_err(psmouse, "failed to query sample data\n"); | ||
1665 | goto init_fail; | ||
1666 | } | ||
1667 | psmouse_info(psmouse, | ||
1668 | "Elan sample query result %02x, %02x, %02x\n", | ||
1669 | etd->samples[0], etd->samples[1], etd->samples[2]); | ||
1670 | } | ||
1671 | |||
1654 | if (elantech_set_absolute_mode(psmouse)) { | 1672 | if (elantech_set_absolute_mode(psmouse)) { |
1655 | psmouse_err(psmouse, | 1673 | psmouse_err(psmouse, |
1656 | "failed to put touchpad into absolute mode.\n"); | 1674 | "failed to put touchpad into absolute mode.\n"); |
diff --git a/drivers/input/mouse/elantech.h b/drivers/input/mouse/elantech.h index f965d1569cc3..e1cbf409d9c8 100644 --- a/drivers/input/mouse/elantech.h +++ b/drivers/input/mouse/elantech.h | |||
@@ -129,6 +129,7 @@ struct elantech_data { | |||
129 | unsigned char reg_26; | 129 | unsigned char reg_26; |
130 | unsigned char debug; | 130 | unsigned char debug; |
131 | unsigned char capabilities[3]; | 131 | unsigned char capabilities[3]; |
132 | unsigned char samples[3]; | ||
132 | bool paritycheck; | 133 | bool paritycheck; |
133 | bool jumpy_cursor; | 134 | bool jumpy_cursor; |
134 | bool reports_pressure; | 135 | bool reports_pressure; |