提交 a230e95c 编写于 作者: L Linus Torvalds

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
...@@ -119,8 +119,10 @@ ALPS Absolute Mode - Protocol Version 2 ...@@ -119,8 +119,10 @@ ALPS Absolute Mode - Protocol Version 2
byte 5: 0 z6 z5 z4 z3 z2 z1 z0 byte 5: 0 z6 z5 z4 z3 z2 z1 z0
Protocol Version 2 DualPoint devices send standard PS/2 mouse packets for Protocol Version 2 DualPoint devices send standard PS/2 mouse packets for
the DualPoint Stick. For non interleaved dualpoint devices the pointingstick the DualPoint Stick. The M, R and L bits signal the combined status of both
buttons get reported separately in the PSM, PSR and PSL bits. the pointingstick and touchpad buttons, except for Dell dualpoint devices
where the pointingstick buttons get reported separately in the PSM, PSR
and PSL bits.
Dualpoint device -- interleaved packet format Dualpoint device -- interleaved packet format
--------------------------------------------- ---------------------------------------------
......
...@@ -196,7 +196,7 @@ static struct tgfx __init *tgfx_probe(int parport, int *n_buttons, int n_devs) ...@@ -196,7 +196,7 @@ static struct tgfx __init *tgfx_probe(int parport, int *n_buttons, int n_devs)
if (n_buttons[i] < 1) if (n_buttons[i] < 1)
continue; continue;
if (n_buttons[i] > 6) { if (n_buttons[i] > ARRAY_SIZE(tgfx_buttons)) {
printk(KERN_ERR "turbografx.c: Invalid number of buttons %d\n", n_buttons[i]); printk(KERN_ERR "turbografx.c: Invalid number of buttons %d\n", n_buttons[i]);
err = -EINVAL; err = -EINVAL;
goto err_unreg_devs; goto err_unreg_devs;
......
...@@ -292,3 +292,4 @@ module_platform_driver(axp20x_pek_driver); ...@@ -292,3 +292,4 @@ module_platform_driver(axp20x_pek_driver);
MODULE_DESCRIPTION("axp20x Power Button"); MODULE_DESCRIPTION("axp20x Power Button");
MODULE_AUTHOR("Carlo Caione <carlo@caione.org>"); MODULE_AUTHOR("Carlo Caione <carlo@caione.org>");
MODULE_LICENSE("GPL"); MODULE_LICENSE("GPL");
MODULE_ALIAS("platform:axp20x-pek");
...@@ -183,7 +183,8 @@ static bool twl4030_vibra_check_coexist(struct twl4030_vibra_data *pdata, ...@@ -183,7 +183,8 @@ static bool twl4030_vibra_check_coexist(struct twl4030_vibra_data *pdata,
if (pdata && pdata->coexist) if (pdata && pdata->coexist)
return true; return true;
if (of_find_node_by_name(node, "codec")) { node = of_find_node_by_name(node, "codec");
if (node) {
of_node_put(node); of_node_put(node);
return true; return true;
} }
......
...@@ -20,6 +20,7 @@ ...@@ -20,6 +20,7 @@
#include <linux/input/mt.h> #include <linux/input/mt.h>
#include <linux/serio.h> #include <linux/serio.h>
#include <linux/libps2.h> #include <linux/libps2.h>
#include <linux/dmi.h>
#include "psmouse.h" #include "psmouse.h"
#include "alps.h" #include "alps.h"
...@@ -99,6 +100,7 @@ static const struct alps_nibble_commands alps_v6_nibble_commands[] = { ...@@ -99,6 +100,7 @@ static const struct alps_nibble_commands alps_v6_nibble_commands[] = {
#define ALPS_FOUR_BUTTONS 0x40 /* 4 direction button present */ #define ALPS_FOUR_BUTTONS 0x40 /* 4 direction button present */
#define ALPS_PS2_INTERLEAVED 0x80 /* 3-byte PS/2 packet interleaved with #define ALPS_PS2_INTERLEAVED 0x80 /* 3-byte PS/2 packet interleaved with
6-byte ALPS packet */ 6-byte ALPS packet */
#define ALPS_DELL 0x100 /* device is a Dell laptop */
#define ALPS_BUTTONPAD 0x200 /* device is a clickpad */ #define ALPS_BUTTONPAD 0x200 /* device is a clickpad */
static const struct alps_model_info alps_model_data[] = { static const struct alps_model_info alps_model_data[] = {
...@@ -251,9 +253,9 @@ static void alps_process_packet_v1_v2(struct psmouse *psmouse) ...@@ -251,9 +253,9 @@ static void alps_process_packet_v1_v2(struct psmouse *psmouse)
return; return;
} }
/* Non interleaved V2 dualpoint has separate stick button bits */ /* Dell non interleaved V2 dualpoint has separate stick button bits */
if (priv->proto_version == ALPS_PROTO_V2 && if (priv->proto_version == ALPS_PROTO_V2 &&
priv->flags == (ALPS_PASS | ALPS_DUALPOINT)) { priv->flags == (ALPS_DELL | ALPS_PASS | ALPS_DUALPOINT)) {
left |= packet[0] & 1; left |= packet[0] & 1;
right |= packet[0] & 2; right |= packet[0] & 2;
middle |= packet[0] & 4; middle |= packet[0] & 4;
...@@ -2550,6 +2552,8 @@ static int alps_set_protocol(struct psmouse *psmouse, ...@@ -2550,6 +2552,8 @@ static int alps_set_protocol(struct psmouse *psmouse,
priv->byte0 = protocol->byte0; priv->byte0 = protocol->byte0;
priv->mask0 = protocol->mask0; priv->mask0 = protocol->mask0;
priv->flags = protocol->flags; priv->flags = protocol->flags;
if (dmi_name_in_vendors("Dell"))
priv->flags |= ALPS_DELL;
priv->x_max = 2000; priv->x_max = 2000;
priv->y_max = 1400; priv->y_max = 1400;
......
...@@ -783,19 +783,26 @@ static int elantech_packet_check_v4(struct psmouse *psmouse) ...@@ -783,19 +783,26 @@ static int elantech_packet_check_v4(struct psmouse *psmouse)
struct elantech_data *etd = psmouse->private; struct elantech_data *etd = psmouse->private;
unsigned char *packet = psmouse->packet; unsigned char *packet = psmouse->packet;
unsigned char packet_type = packet[3] & 0x03; unsigned char packet_type = packet[3] & 0x03;
unsigned int ic_version;
bool sanity_check; bool sanity_check;
if (etd->tp_dev && (packet[3] & 0x0f) == 0x06) if (etd->tp_dev && (packet[3] & 0x0f) == 0x06)
return PACKET_TRACKPOINT; return PACKET_TRACKPOINT;
/* This represents the version of IC body. */
ic_version = (etd->fw_version & 0x0f0000) >> 16;
/* /*
* Sanity check based on the constant bits of a packet. * Sanity check based on the constant bits of a packet.
* The constant bits change depending on the value of * The constant bits change depending on the value of
* the hardware flag 'crc_enabled' but are the same for * the hardware flag 'crc_enabled' and the version of
* every packet, regardless of the type. * the IC body, but are the same for every packet,
* regardless of the type.
*/ */
if (etd->crc_enabled) if (etd->crc_enabled)
sanity_check = ((packet[3] & 0x08) == 0x00); sanity_check = ((packet[3] & 0x08) == 0x00);
else if (ic_version == 7 && etd->samples[1] == 0x2A)
sanity_check = ((packet[3] & 0x1c) == 0x10);
else else
sanity_check = ((packet[0] & 0x0c) == 0x04 && sanity_check = ((packet[0] & 0x0c) == 0x04 &&
(packet[3] & 0x1c) == 0x10); (packet[3] & 0x1c) == 0x10);
...@@ -1116,6 +1123,7 @@ static int elantech_get_resolution_v4(struct psmouse *psmouse, ...@@ -1116,6 +1123,7 @@ static int elantech_get_resolution_v4(struct psmouse *psmouse,
* Avatar AVIU-145A2 0x361f00 ? clickpad * Avatar AVIU-145A2 0x361f00 ? clickpad
* Fujitsu LIFEBOOK E544 0x470f00 d0, 12, 09 2 hw buttons * Fujitsu LIFEBOOK E544 0x470f00 d0, 12, 09 2 hw buttons
* Fujitsu LIFEBOOK E554 0x570f01 40, 14, 0c 2 hw buttons * Fujitsu LIFEBOOK E554 0x570f01 40, 14, 0c 2 hw buttons
* Fujitsu T725 0x470f01 05, 12, 09 2 hw buttons
* Fujitsu H730 0x570f00 c0, 14, 0c 3 hw buttons (**) * Fujitsu H730 0x570f00 c0, 14, 0c 3 hw buttons (**)
* Gigabyte U2442 0x450f01 58, 17, 0c 2 hw buttons * Gigabyte U2442 0x450f01 58, 17, 0c 2 hw buttons
* Lenovo L430 0x350f02 b9, 15, 0c 2 hw buttons (*) * Lenovo L430 0x350f02 b9, 15, 0c 2 hw buttons (*)
...@@ -1651,6 +1659,16 @@ int elantech_init(struct psmouse *psmouse) ...@@ -1651,6 +1659,16 @@ int elantech_init(struct psmouse *psmouse)
etd->capabilities[0], etd->capabilities[1], etd->capabilities[0], etd->capabilities[1],
etd->capabilities[2]); etd->capabilities[2]);
if (etd->hw_version != 1) {
if (etd->send_cmd(psmouse, ETP_SAMPLE_QUERY, etd->samples)) {
psmouse_err(psmouse, "failed to query sample data\n");
goto init_fail;
}
psmouse_info(psmouse,
"Elan sample query result %02x, %02x, %02x\n",
etd->samples[0], etd->samples[1], etd->samples[2]);
}
if (elantech_set_absolute_mode(psmouse)) { if (elantech_set_absolute_mode(psmouse)) {
psmouse_err(psmouse, psmouse_err(psmouse,
"failed to put touchpad into absolute mode.\n"); "failed to put touchpad into absolute mode.\n");
......
...@@ -129,6 +129,7 @@ struct elantech_data { ...@@ -129,6 +129,7 @@ struct elantech_data {
unsigned char reg_26; unsigned char reg_26;
unsigned char debug; unsigned char debug;
unsigned char capabilities[3]; unsigned char capabilities[3];
unsigned char samples[3];
bool paritycheck; bool paritycheck;
bool jumpy_cursor; bool jumpy_cursor;
bool reports_pressure; bool reports_pressure;
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册