diff options
| -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; |
