Input: psmouse - switch to using dev_*() for messages
This will ensure our reporting is consistent with the rest of the system and we do not refer to obsolete source file names. Reviewed-by: Wanlong Gao <gaowanlong@cn.fujitsu.com> Reviewed-by: JJ Ding <dgdunix@gmail.com> Reviewed-by: Daniel Kurtz <djkurtz@chromium.org> Signed-off-by: Dmitry Torokhov <dtor@mail.ru>
This commit is contained in:
parent
ae927560a7
commit
b5d2170436
10 changed files with 243 additions and 198 deletions
|
@ -23,13 +23,6 @@
|
||||||
#include "psmouse.h"
|
#include "psmouse.h"
|
||||||
#include "alps.h"
|
#include "alps.h"
|
||||||
|
|
||||||
#undef DEBUG
|
|
||||||
#ifdef DEBUG
|
|
||||||
#define dbg(format, arg...) printk(KERN_INFO "alps.c: " format "\n", ## arg)
|
|
||||||
#else
|
|
||||||
#define dbg(format, arg...) do {} while (0)
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#define ALPS_OLDPROTO 0x01 /* old style input */
|
#define ALPS_OLDPROTO 0x01 /* old style input */
|
||||||
#define ALPS_DUALPOINT 0x02 /* touchpad has trackstick */
|
#define ALPS_DUALPOINT 0x02 /* touchpad has trackstick */
|
||||||
#define ALPS_PASS 0x04 /* device has a pass-through port */
|
#define ALPS_PASS 0x04 /* device has a pass-through port */
|
||||||
|
@ -297,10 +290,10 @@ static psmouse_ret_t alps_handle_interleaved_ps2(struct psmouse *psmouse)
|
||||||
psmouse->packet[4] |
|
psmouse->packet[4] |
|
||||||
psmouse->packet[5]) & 0x80) ||
|
psmouse->packet[5]) & 0x80) ||
|
||||||
(!alps_is_valid_first_byte(priv->i, psmouse->packet[6]))) {
|
(!alps_is_valid_first_byte(priv->i, psmouse->packet[6]))) {
|
||||||
dbg("refusing packet %x %x %x %x "
|
psmouse_dbg(psmouse,
|
||||||
"(suspected interleaved ps/2)\n",
|
"refusing packet %x %x %x %x (suspected interleaved ps/2)\n",
|
||||||
psmouse->packet[3], psmouse->packet[4],
|
psmouse->packet[3], psmouse->packet[4],
|
||||||
psmouse->packet[5], psmouse->packet[6]);
|
psmouse->packet[5], psmouse->packet[6]);
|
||||||
return PSMOUSE_BAD_DATA;
|
return PSMOUSE_BAD_DATA;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -319,13 +312,13 @@ static psmouse_ret_t alps_handle_interleaved_ps2(struct psmouse *psmouse)
|
||||||
* There is also possibility that we got 6-byte ALPS
|
* There is also possibility that we got 6-byte ALPS
|
||||||
* packet followed by 3-byte packet from trackpoint. We
|
* packet followed by 3-byte packet from trackpoint. We
|
||||||
* can not distinguish between these 2 scenarios but
|
* can not distinguish between these 2 scenarios but
|
||||||
* becase the latter is unlikely to happen in course of
|
* because the latter is unlikely to happen in course of
|
||||||
* normal operation (user would need to press all
|
* normal operation (user would need to press all
|
||||||
* buttons on the pad and start moving trackpoint
|
* buttons on the pad and start moving trackpoint
|
||||||
* without touching the pad surface) we assume former.
|
* without touching the pad surface) we assume former.
|
||||||
* Even if we are wrong the wost thing that would happen
|
* Even if we are wrong the wost thing that would happen
|
||||||
* the cursor would jump but we should not get protocol
|
* the cursor would jump but we should not get protocol
|
||||||
* desynchronization.
|
* de-synchronization.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
alps_report_bare_ps2_packet(psmouse, &psmouse->packet[3],
|
alps_report_bare_ps2_packet(psmouse, &psmouse->packet[3],
|
||||||
|
@ -361,10 +354,10 @@ static void alps_flush_packet(unsigned long data)
|
||||||
if ((psmouse->packet[3] |
|
if ((psmouse->packet[3] |
|
||||||
psmouse->packet[4] |
|
psmouse->packet[4] |
|
||||||
psmouse->packet[5]) & 0x80) {
|
psmouse->packet[5]) & 0x80) {
|
||||||
dbg("refusing packet %x %x %x "
|
psmouse_dbg(psmouse,
|
||||||
"(suspected interleaved ps/2)\n",
|
"refusing packet %x %x %x (suspected interleaved ps/2)\n",
|
||||||
psmouse->packet[3], psmouse->packet[4],
|
psmouse->packet[3], psmouse->packet[4],
|
||||||
psmouse->packet[5]);
|
psmouse->packet[5]);
|
||||||
} else {
|
} else {
|
||||||
alps_process_packet(psmouse);
|
alps_process_packet(psmouse);
|
||||||
}
|
}
|
||||||
|
@ -396,16 +389,18 @@ static psmouse_ret_t alps_process_byte(struct psmouse *psmouse)
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!alps_is_valid_first_byte(model, psmouse->packet[0])) {
|
if (!alps_is_valid_first_byte(model, psmouse->packet[0])) {
|
||||||
dbg("refusing packet[0] = %x (mask0 = %x, byte0 = %x)\n",
|
psmouse_dbg(psmouse,
|
||||||
psmouse->packet[0], model->mask0, model->byte0);
|
"refusing packet[0] = %x (mask0 = %x, byte0 = %x)\n",
|
||||||
|
psmouse->packet[0], model->mask0, model->byte0);
|
||||||
return PSMOUSE_BAD_DATA;
|
return PSMOUSE_BAD_DATA;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Bytes 2 - 6 should have 0 in the highest bit */
|
/* Bytes 2 - 6 should have 0 in the highest bit */
|
||||||
if (psmouse->pktcnt >= 2 && psmouse->pktcnt <= 6 &&
|
if (psmouse->pktcnt >= 2 && psmouse->pktcnt <= 6 &&
|
||||||
(psmouse->packet[psmouse->pktcnt - 1] & 0x80)) {
|
(psmouse->packet[psmouse->pktcnt - 1] & 0x80)) {
|
||||||
dbg("refusing packet[%i] = %x\n",
|
psmouse_dbg(psmouse, "refusing packet[%i] = %x\n",
|
||||||
psmouse->pktcnt - 1, psmouse->packet[psmouse->pktcnt - 1]);
|
psmouse->pktcnt - 1,
|
||||||
|
psmouse->packet[psmouse->pktcnt - 1]);
|
||||||
return PSMOUSE_BAD_DATA;
|
return PSMOUSE_BAD_DATA;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -439,7 +434,8 @@ static const struct alps_model_info *alps_get_model(struct psmouse *psmouse, int
|
||||||
if (ps2_command(ps2dev, param, PSMOUSE_CMD_GETINFO))
|
if (ps2_command(ps2dev, param, PSMOUSE_CMD_GETINFO))
|
||||||
return NULL;
|
return NULL;
|
||||||
|
|
||||||
dbg("E6 report: %2.2x %2.2x %2.2x", param[0], param[1], param[2]);
|
psmouse_dbg(psmouse, "E6 report: %2.2x %2.2x %2.2x",
|
||||||
|
param[0], param[1], param[2]);
|
||||||
|
|
||||||
if (param[0] != 0 || param[1] != 0 || (param[2] != 10 && param[2] != 100))
|
if (param[0] != 0 || param[1] != 0 || (param[2] != 10 && param[2] != 100))
|
||||||
return NULL;
|
return NULL;
|
||||||
|
@ -459,7 +455,8 @@ static const struct alps_model_info *alps_get_model(struct psmouse *psmouse, int
|
||||||
if (ps2_command(ps2dev, param, PSMOUSE_CMD_GETINFO))
|
if (ps2_command(ps2dev, param, PSMOUSE_CMD_GETINFO))
|
||||||
return NULL;
|
return NULL;
|
||||||
|
|
||||||
dbg("E7 report: %2.2x %2.2x %2.2x", param[0], param[1], param[2]);
|
psmouse_dbg(psmouse, "E7 report: %2.2x %2.2x %2.2x",
|
||||||
|
param[0], param[1], param[2]);
|
||||||
|
|
||||||
if (version) {
|
if (version) {
|
||||||
for (i = 0; i < ARRAY_SIZE(rates) && param[2] != rates[i]; i++)
|
for (i = 0; i < ARRAY_SIZE(rates) && param[2] != rates[i]; i++)
|
||||||
|
@ -527,7 +524,8 @@ static int alps_get_status(struct psmouse *psmouse, char *param)
|
||||||
ps2_command(ps2dev, param, PSMOUSE_CMD_GETINFO))
|
ps2_command(ps2dev, param, PSMOUSE_CMD_GETINFO))
|
||||||
return -1;
|
return -1;
|
||||||
|
|
||||||
dbg("Status: %2.2x %2.2x %2.2x", param[0], param[1], param[2]);
|
psmouse_dbg(psmouse, "Status: %2.2x %2.2x %2.2x",
|
||||||
|
param[0], param[1], param[2]);
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
@ -605,12 +603,12 @@ static int alps_hw_init(struct psmouse *psmouse)
|
||||||
}
|
}
|
||||||
|
|
||||||
if (alps_tap_mode(psmouse, true)) {
|
if (alps_tap_mode(psmouse, true)) {
|
||||||
printk(KERN_WARNING "alps.c: Failed to enable hardware tapping\n");
|
psmouse_warn(psmouse, "Failed to enable hardware tapping\n");
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (alps_absolute_mode(psmouse)) {
|
if (alps_absolute_mode(psmouse)) {
|
||||||
printk(KERN_ERR "alps.c: Failed to enable absolute mode\n");
|
psmouse_err(psmouse, "Failed to enable absolute mode\n");
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -621,7 +619,7 @@ static int alps_hw_init(struct psmouse *psmouse)
|
||||||
|
|
||||||
/* ALPS needs stream mode, otherwise it won't report any data */
|
/* ALPS needs stream mode, otherwise it won't report any data */
|
||||||
if (ps2_command(&psmouse->ps2dev, NULL, PSMOUSE_CMD_SETSTREAM)) {
|
if (ps2_command(&psmouse->ps2dev, NULL, PSMOUSE_CMD_SETSTREAM)) {
|
||||||
printk(KERN_ERR "alps.c: Failed to enable stream mode\n");
|
psmouse_err(psmouse, "Failed to enable stream mode\n");
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -10,8 +10,6 @@
|
||||||
* Trademarks are the property of their respective owners.
|
* Trademarks are the property of their respective owners.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#define pr_fmt(fmt) KBUILD_BASENAME ": " fmt
|
|
||||||
|
|
||||||
#include <linux/delay.h>
|
#include <linux/delay.h>
|
||||||
#include <linux/slab.h>
|
#include <linux/slab.h>
|
||||||
#include <linux/module.h>
|
#include <linux/module.h>
|
||||||
|
@ -25,7 +23,8 @@
|
||||||
#define elantech_debug(fmt, ...) \
|
#define elantech_debug(fmt, ...) \
|
||||||
do { \
|
do { \
|
||||||
if (etd->debug) \
|
if (etd->debug) \
|
||||||
printk(KERN_DEBUG pr_fmt(fmt), ##__VA_ARGS__); \
|
psmouse_printk(KERN_DEBUG, psmouse, \
|
||||||
|
fmt, ##__VA_ARGS__); \
|
||||||
} while (0)
|
} while (0)
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
@ -36,7 +35,7 @@ static int synaptics_send_cmd(struct psmouse *psmouse, unsigned char c,
|
||||||
{
|
{
|
||||||
if (psmouse_sliced_command(psmouse, c) ||
|
if (psmouse_sliced_command(psmouse, c) ||
|
||||||
ps2_command(&psmouse->ps2dev, param, PSMOUSE_CMD_GETINFO)) {
|
ps2_command(&psmouse->ps2dev, param, PSMOUSE_CMD_GETINFO)) {
|
||||||
pr_err("synaptics_send_cmd query 0x%02x failed.\n", c);
|
psmouse_err(psmouse, "%s query 0x%02x failed.\n", __func__, c);
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -65,7 +64,7 @@ static int elantech_ps2_command(struct psmouse *psmouse,
|
||||||
} while (tries > 0);
|
} while (tries > 0);
|
||||||
|
|
||||||
if (rc)
|
if (rc)
|
||||||
pr_err("ps2 command 0x%02x failed.\n", command);
|
psmouse_err(psmouse, "ps2 command 0x%02x failed.\n", command);
|
||||||
|
|
||||||
return rc;
|
return rc;
|
||||||
}
|
}
|
||||||
|
@ -117,7 +116,7 @@ static int elantech_read_reg(struct psmouse *psmouse, unsigned char reg,
|
||||||
}
|
}
|
||||||
|
|
||||||
if (rc)
|
if (rc)
|
||||||
pr_err("failed to read register 0x%02x.\n", reg);
|
psmouse_err(psmouse, "failed to read register 0x%02x.\n", reg);
|
||||||
else if (etd->hw_version != 4)
|
else if (etd->hw_version != 4)
|
||||||
*val = param[0];
|
*val = param[0];
|
||||||
else
|
else
|
||||||
|
@ -191,8 +190,9 @@ static int elantech_write_reg(struct psmouse *psmouse, unsigned char reg,
|
||||||
}
|
}
|
||||||
|
|
||||||
if (rc)
|
if (rc)
|
||||||
pr_err("failed to write register 0x%02x with value 0x%02x.\n",
|
psmouse_err(psmouse,
|
||||||
reg, val);
|
"failed to write register 0x%02x with value 0x%02x.\n",
|
||||||
|
reg, val);
|
||||||
|
|
||||||
return rc;
|
return rc;
|
||||||
}
|
}
|
||||||
|
@ -200,13 +200,13 @@ static int elantech_write_reg(struct psmouse *psmouse, unsigned char reg,
|
||||||
/*
|
/*
|
||||||
* Dump a complete mouse movement packet to the syslog
|
* Dump a complete mouse movement packet to the syslog
|
||||||
*/
|
*/
|
||||||
static void elantech_packet_dump(unsigned char *packet, int size)
|
static void elantech_packet_dump(struct psmouse *psmouse)
|
||||||
{
|
{
|
||||||
int i;
|
int i;
|
||||||
|
|
||||||
printk(KERN_DEBUG pr_fmt("PS/2 packet ["));
|
psmouse_printk(KERN_DEBUG, psmouse, "PS/2 packet [");
|
||||||
for (i = 0; i < size; i++)
|
for (i = 0; i < psmouse->pktsize; i++)
|
||||||
printk("%s0x%02x ", (i) ? ", " : " ", packet[i]);
|
printk("%s0x%02x ", i ? ", " : " ", psmouse->packet[i]);
|
||||||
printk("]\n");
|
printk("]\n");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -705,7 +705,7 @@ static psmouse_ret_t elantech_process_byte(struct psmouse *psmouse)
|
||||||
return PSMOUSE_GOOD_DATA;
|
return PSMOUSE_GOOD_DATA;
|
||||||
|
|
||||||
if (etd->debug > 1)
|
if (etd->debug > 1)
|
||||||
elantech_packet_dump(psmouse->packet, psmouse->pktsize);
|
elantech_packet_dump(psmouse);
|
||||||
|
|
||||||
switch (etd->hw_version) {
|
switch (etd->hw_version) {
|
||||||
case 1:
|
case 1:
|
||||||
|
@ -801,7 +801,7 @@ static int elantech_set_absolute_mode(struct psmouse *psmouse)
|
||||||
/*
|
/*
|
||||||
* Read back reg 0x10. For hardware version 1 we must make
|
* Read back reg 0x10. For hardware version 1 we must make
|
||||||
* sure the absolute mode bit is set. For hardware version 2
|
* sure the absolute mode bit is set. For hardware version 2
|
||||||
* the touchpad is probably initalising and not ready until
|
* the touchpad is probably initializing and not ready until
|
||||||
* we read back the value we just wrote.
|
* we read back the value we just wrote.
|
||||||
*/
|
*/
|
||||||
do {
|
do {
|
||||||
|
@ -814,17 +814,19 @@ static int elantech_set_absolute_mode(struct psmouse *psmouse)
|
||||||
} while (tries > 0);
|
} while (tries > 0);
|
||||||
|
|
||||||
if (rc) {
|
if (rc) {
|
||||||
pr_err("failed to read back register 0x10.\n");
|
psmouse_err(psmouse,
|
||||||
|
"failed to read back register 0x10.\n");
|
||||||
} else if (etd->hw_version == 1 &&
|
} else if (etd->hw_version == 1 &&
|
||||||
!(val & ETP_R10_ABSOLUTE_MODE)) {
|
!(val & ETP_R10_ABSOLUTE_MODE)) {
|
||||||
pr_err("touchpad refuses to switch to absolute mode.\n");
|
psmouse_err(psmouse,
|
||||||
|
"touchpad refuses to switch to absolute mode.\n");
|
||||||
rc = -1;
|
rc = -1;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
skip_readback_reg_10:
|
skip_readback_reg_10:
|
||||||
if (rc)
|
if (rc)
|
||||||
pr_err("failed to initialise registers.\n");
|
psmouse_err(psmouse, "failed to initialise registers.\n");
|
||||||
|
|
||||||
return rc;
|
return rc;
|
||||||
}
|
}
|
||||||
|
@ -1131,7 +1133,7 @@ int elantech_detect(struct psmouse *psmouse, bool set_properties)
|
||||||
ps2_command(ps2dev, NULL, PSMOUSE_CMD_SETSCALE11) ||
|
ps2_command(ps2dev, NULL, PSMOUSE_CMD_SETSCALE11) ||
|
||||||
ps2_command(ps2dev, NULL, PSMOUSE_CMD_SETSCALE11) ||
|
ps2_command(ps2dev, NULL, PSMOUSE_CMD_SETSCALE11) ||
|
||||||
ps2_command(ps2dev, param, PSMOUSE_CMD_GETINFO)) {
|
ps2_command(ps2dev, param, PSMOUSE_CMD_GETINFO)) {
|
||||||
pr_debug("sending Elantech magic knock failed.\n");
|
psmouse_dbg(psmouse, "sending Elantech magic knock failed.\n");
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1141,8 +1143,9 @@ int elantech_detect(struct psmouse *psmouse, bool set_properties)
|
||||||
*/
|
*/
|
||||||
if (param[0] != 0x3c || param[1] != 0x03 ||
|
if (param[0] != 0x3c || param[1] != 0x03 ||
|
||||||
(param[2] != 0xc8 && param[2] != 0x00)) {
|
(param[2] != 0xc8 && param[2] != 0x00)) {
|
||||||
pr_debug("unexpected magic knock result 0x%02x, 0x%02x, 0x%02x.\n",
|
psmouse_dbg(psmouse,
|
||||||
param[0], param[1], param[2]);
|
"unexpected magic knock result 0x%02x, 0x%02x, 0x%02x.\n",
|
||||||
|
param[0], param[1], param[2]);
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1152,15 +1155,17 @@ int elantech_detect(struct psmouse *psmouse, bool set_properties)
|
||||||
* to Elantech magic knock and there might be more.
|
* to Elantech magic knock and there might be more.
|
||||||
*/
|
*/
|
||||||
if (synaptics_send_cmd(psmouse, ETP_FW_VERSION_QUERY, param)) {
|
if (synaptics_send_cmd(psmouse, ETP_FW_VERSION_QUERY, param)) {
|
||||||
pr_debug("failed to query firmware version.\n");
|
psmouse_dbg(psmouse, "failed to query firmware version.\n");
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
pr_debug("Elantech version query result 0x%02x, 0x%02x, 0x%02x.\n",
|
psmouse_dbg(psmouse,
|
||||||
param[0], param[1], param[2]);
|
"Elantech version query result 0x%02x, 0x%02x, 0x%02x.\n",
|
||||||
|
param[0], param[1], param[2]);
|
||||||
|
|
||||||
if (!elantech_is_signature_valid(param)) {
|
if (!elantech_is_signature_valid(param)) {
|
||||||
pr_debug("Probably not a real Elantech touchpad. Aborting.\n");
|
psmouse_dbg(psmouse,
|
||||||
|
"Probably not a real Elantech touchpad. Aborting.\n");
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1192,7 +1197,8 @@ static int elantech_reconnect(struct psmouse *psmouse)
|
||||||
return -1;
|
return -1;
|
||||||
|
|
||||||
if (elantech_set_absolute_mode(psmouse)) {
|
if (elantech_set_absolute_mode(psmouse)) {
|
||||||
pr_err("failed to put touchpad back into absolute mode.\n");
|
psmouse_err(psmouse,
|
||||||
|
"failed to put touchpad back into absolute mode.\n");
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1262,42 +1268,46 @@ int elantech_init(struct psmouse *psmouse)
|
||||||
* Do the version query again so we can store the result
|
* Do the version query again so we can store the result
|
||||||
*/
|
*/
|
||||||
if (synaptics_send_cmd(psmouse, ETP_FW_VERSION_QUERY, param)) {
|
if (synaptics_send_cmd(psmouse, ETP_FW_VERSION_QUERY, param)) {
|
||||||
pr_err("failed to query firmware version.\n");
|
psmouse_err(psmouse, "failed to query firmware version.\n");
|
||||||
goto init_fail;
|
goto init_fail;
|
||||||
}
|
}
|
||||||
etd->fw_version = (param[0] << 16) | (param[1] << 8) | param[2];
|
etd->fw_version = (param[0] << 16) | (param[1] << 8) | param[2];
|
||||||
|
|
||||||
if (elantech_set_properties(etd)) {
|
if (elantech_set_properties(etd)) {
|
||||||
pr_err("unknown hardware version, aborting...\n");
|
psmouse_err(psmouse, "unknown hardware version, aborting...\n");
|
||||||
goto init_fail;
|
goto init_fail;
|
||||||
}
|
}
|
||||||
pr_info("assuming hardware version %d "
|
psmouse_info(psmouse,
|
||||||
"(with firmware version 0x%02x%02x%02x)\n",
|
"assuming hardware version %d (with firmware version 0x%02x%02x%02x)\n",
|
||||||
etd->hw_version, param[0], param[1], param[2]);
|
etd->hw_version, param[0], param[1], param[2]);
|
||||||
|
|
||||||
if (synaptics_send_cmd(psmouse, ETP_CAPABILITIES_QUERY,
|
if (synaptics_send_cmd(psmouse, ETP_CAPABILITIES_QUERY,
|
||||||
etd->capabilities)) {
|
etd->capabilities)) {
|
||||||
pr_err("failed to query capabilities.\n");
|
psmouse_err(psmouse, "failed to query capabilities.\n");
|
||||||
goto init_fail;
|
goto init_fail;
|
||||||
}
|
}
|
||||||
pr_info("Synaptics capabilities query result 0x%02x, 0x%02x, 0x%02x.\n",
|
psmouse_info(psmouse,
|
||||||
etd->capabilities[0], etd->capabilities[1],
|
"Synaptics capabilities query result 0x%02x, 0x%02x, 0x%02x.\n",
|
||||||
etd->capabilities[2]);
|
etd->capabilities[0], etd->capabilities[1],
|
||||||
|
etd->capabilities[2]);
|
||||||
|
|
||||||
if (elantech_set_absolute_mode(psmouse)) {
|
if (elantech_set_absolute_mode(psmouse)) {
|
||||||
pr_err("failed to put touchpad into absolute mode.\n");
|
psmouse_err(psmouse,
|
||||||
|
"failed to put touchpad into absolute mode.\n");
|
||||||
goto init_fail;
|
goto init_fail;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (elantech_set_input_params(psmouse)) {
|
if (elantech_set_input_params(psmouse)) {
|
||||||
pr_err("failed to query touchpad range.\n");
|
psmouse_err(psmouse, "failed to query touchpad range.\n");
|
||||||
goto init_fail;
|
goto init_fail;
|
||||||
}
|
}
|
||||||
|
|
||||||
error = sysfs_create_group(&psmouse->ps2dev.serio->dev.kobj,
|
error = sysfs_create_group(&psmouse->ps2dev.serio->dev.kobj,
|
||||||
&elantech_attr_group);
|
&elantech_attr_group);
|
||||||
if (error) {
|
if (error) {
|
||||||
pr_err("failed to create sysfs attributes, error: %d.\n", error);
|
psmouse_err(psmouse,
|
||||||
|
"failed to create sysfs attributes, error: %d.\n",
|
||||||
|
error);
|
||||||
goto init_fail;
|
goto init_fail;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -136,10 +136,10 @@ static int hgpk_discard_decay_hack(struct psmouse *psmouse, int x, int y)
|
||||||
/* discard if too big, or half that but > 4 times the prev delta */
|
/* discard if too big, or half that but > 4 times the prev delta */
|
||||||
if (avx > recalib_delta ||
|
if (avx > recalib_delta ||
|
||||||
(avx > recalib_delta / 2 && ((avx / 4) > priv->xlast))) {
|
(avx > recalib_delta / 2 && ((avx / 4) > priv->xlast))) {
|
||||||
hgpk_err(psmouse, "detected %dpx jump in x\n", x);
|
psmouse_warn(psmouse, "detected %dpx jump in x\n", x);
|
||||||
priv->xbigj = avx;
|
priv->xbigj = avx;
|
||||||
} else if (approx_half(avx, priv->xbigj)) {
|
} else if (approx_half(avx, priv->xbigj)) {
|
||||||
hgpk_err(psmouse, "detected secondary %dpx jump in x\n", x);
|
psmouse_warn(psmouse, "detected secondary %dpx jump in x\n", x);
|
||||||
priv->xbigj = avx;
|
priv->xbigj = avx;
|
||||||
priv->xsaw_secondary++;
|
priv->xsaw_secondary++;
|
||||||
} else {
|
} else {
|
||||||
|
@ -151,10 +151,10 @@ static int hgpk_discard_decay_hack(struct psmouse *psmouse, int x, int y)
|
||||||
|
|
||||||
if (avy > recalib_delta ||
|
if (avy > recalib_delta ||
|
||||||
(avy > recalib_delta / 2 && ((avy / 4) > priv->ylast))) {
|
(avy > recalib_delta / 2 && ((avy / 4) > priv->ylast))) {
|
||||||
hgpk_err(psmouse, "detected %dpx jump in y\n", y);
|
psmouse_warn(psmouse, "detected %dpx jump in y\n", y);
|
||||||
priv->ybigj = avy;
|
priv->ybigj = avy;
|
||||||
} else if (approx_half(avy, priv->ybigj)) {
|
} else if (approx_half(avy, priv->ybigj)) {
|
||||||
hgpk_err(psmouse, "detected secondary %dpx jump in y\n", y);
|
psmouse_warn(psmouse, "detected secondary %dpx jump in y\n", y);
|
||||||
priv->ybigj = avy;
|
priv->ybigj = avy;
|
||||||
priv->ysaw_secondary++;
|
priv->ysaw_secondary++;
|
||||||
} else {
|
} else {
|
||||||
|
@ -168,7 +168,7 @@ static int hgpk_discard_decay_hack(struct psmouse *psmouse, int x, int y)
|
||||||
priv->ylast = avy;
|
priv->ylast = avy;
|
||||||
|
|
||||||
if (do_recal && jumpy_delay) {
|
if (do_recal && jumpy_delay) {
|
||||||
hgpk_err(psmouse, "scheduling recalibration\n");
|
psmouse_warn(psmouse, "scheduling recalibration\n");
|
||||||
psmouse_queue_work(psmouse, &priv->recalib_wq,
|
psmouse_queue_work(psmouse, &priv->recalib_wq,
|
||||||
msecs_to_jiffies(jumpy_delay));
|
msecs_to_jiffies(jumpy_delay));
|
||||||
}
|
}
|
||||||
|
@ -260,8 +260,8 @@ static void hgpk_spewing_hack(struct psmouse *psmouse,
|
||||||
* movement, it is probably a case of the user moving the
|
* movement, it is probably a case of the user moving the
|
||||||
* cursor very slowly across the screen. */
|
* cursor very slowly across the screen. */
|
||||||
if (abs(priv->x_tally) < 3 && abs(priv->y_tally) < 3) {
|
if (abs(priv->x_tally) < 3 && abs(priv->y_tally) < 3) {
|
||||||
hgpk_err(psmouse, "packet spew detected (%d,%d)\n",
|
psmouse_warn(psmouse, "packet spew detected (%d,%d)\n",
|
||||||
priv->x_tally, priv->y_tally);
|
priv->x_tally, priv->y_tally);
|
||||||
priv->spew_flag = RECALIBRATING;
|
priv->spew_flag = RECALIBRATING;
|
||||||
psmouse_queue_work(psmouse, &priv->recalib_wq,
|
psmouse_queue_work(psmouse, &priv->recalib_wq,
|
||||||
msecs_to_jiffies(spew_delay));
|
msecs_to_jiffies(spew_delay));
|
||||||
|
@ -333,12 +333,12 @@ static bool hgpk_is_byte_valid(struct psmouse *psmouse, unsigned char *packet)
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!valid)
|
if (!valid)
|
||||||
hgpk_dbg(psmouse,
|
psmouse_dbg(psmouse,
|
||||||
"bad data, mode %d (%d) %02x %02x %02x %02x %02x %02x\n",
|
"bad data, mode %d (%d) %02x %02x %02x %02x %02x %02x\n",
|
||||||
priv->mode, pktcnt,
|
priv->mode, pktcnt,
|
||||||
psmouse->packet[0], psmouse->packet[1],
|
psmouse->packet[0], psmouse->packet[1],
|
||||||
psmouse->packet[2], psmouse->packet[3],
|
psmouse->packet[2], psmouse->packet[3],
|
||||||
psmouse->packet[4], psmouse->packet[5]);
|
psmouse->packet[4], psmouse->packet[5]);
|
||||||
|
|
||||||
return valid;
|
return valid;
|
||||||
}
|
}
|
||||||
|
@ -361,19 +361,20 @@ static void hgpk_process_advanced_packet(struct psmouse *psmouse)
|
||||||
|
|
||||||
input_report_abs(idev, ABS_PRESSURE, z);
|
input_report_abs(idev, ABS_PRESSURE, z);
|
||||||
if (tpdebug)
|
if (tpdebug)
|
||||||
hgpk_dbg(psmouse, "pd=%d fd=%d z=%d",
|
psmouse_dbg(psmouse, "pd=%d fd=%d z=%d",
|
||||||
pt_down, finger_down, z);
|
pt_down, finger_down, z);
|
||||||
} else {
|
} else {
|
||||||
/*
|
/*
|
||||||
* PenTablet mode does not report pressure, so we don't
|
* PenTablet mode does not report pressure, so we don't
|
||||||
* report it here
|
* report it here
|
||||||
*/
|
*/
|
||||||
if (tpdebug)
|
if (tpdebug)
|
||||||
hgpk_dbg(psmouse, "pd=%d ", down);
|
psmouse_dbg(psmouse, "pd=%d ", down);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (tpdebug)
|
if (tpdebug)
|
||||||
hgpk_dbg(psmouse, "l=%d r=%d x=%d y=%d\n", left, right, x, y);
|
psmouse_dbg(psmouse, "l=%d r=%d x=%d y=%d\n",
|
||||||
|
left, right, x, y);
|
||||||
|
|
||||||
input_report_key(idev, BTN_TOUCH, down);
|
input_report_key(idev, BTN_TOUCH, down);
|
||||||
input_report_key(idev, BTN_LEFT, left);
|
input_report_key(idev, BTN_LEFT, left);
|
||||||
|
@ -395,7 +396,7 @@ static void hgpk_process_advanced_packet(struct psmouse *psmouse)
|
||||||
if (x == priv->abs_x && y == priv->abs_y) {
|
if (x == priv->abs_x && y == priv->abs_y) {
|
||||||
if (++priv->dupe_count > SPEW_WATCH_COUNT) {
|
if (++priv->dupe_count > SPEW_WATCH_COUNT) {
|
||||||
if (tpdebug)
|
if (tpdebug)
|
||||||
hgpk_dbg(psmouse, "hard spew detected\n");
|
psmouse_dbg(psmouse, "hard spew detected\n");
|
||||||
priv->spew_flag = RECALIBRATING;
|
priv->spew_flag = RECALIBRATING;
|
||||||
psmouse_queue_work(psmouse, &priv->recalib_wq,
|
psmouse_queue_work(psmouse, &priv->recalib_wq,
|
||||||
msecs_to_jiffies(spew_delay));
|
msecs_to_jiffies(spew_delay));
|
||||||
|
@ -412,7 +413,7 @@ static void hgpk_process_advanced_packet(struct psmouse *psmouse)
|
||||||
int y_diff = priv->abs_y - y;
|
int y_diff = priv->abs_y - y;
|
||||||
if (hgpk_discard_decay_hack(psmouse, x_diff, y_diff)) {
|
if (hgpk_discard_decay_hack(psmouse, x_diff, y_diff)) {
|
||||||
if (tpdebug)
|
if (tpdebug)
|
||||||
hgpk_dbg(psmouse, "discarding\n");
|
psmouse_dbg(psmouse, "discarding\n");
|
||||||
goto done;
|
goto done;
|
||||||
}
|
}
|
||||||
hgpk_spewing_hack(psmouse, left, right, x_diff, y_diff);
|
hgpk_spewing_hack(psmouse, left, right, x_diff, y_diff);
|
||||||
|
@ -437,20 +438,21 @@ static void hgpk_process_simple_packet(struct psmouse *psmouse)
|
||||||
int y = ((packet[0] << 3) & 0x100) - packet[2];
|
int y = ((packet[0] << 3) & 0x100) - packet[2];
|
||||||
|
|
||||||
if (packet[0] & 0xc0)
|
if (packet[0] & 0xc0)
|
||||||
hgpk_dbg(psmouse,
|
psmouse_dbg(psmouse,
|
||||||
"overflow -- 0x%02x 0x%02x 0x%02x\n",
|
"overflow -- 0x%02x 0x%02x 0x%02x\n",
|
||||||
packet[0], packet[1], packet[2]);
|
packet[0], packet[1], packet[2]);
|
||||||
|
|
||||||
if (hgpk_discard_decay_hack(psmouse, x, y)) {
|
if (hgpk_discard_decay_hack(psmouse, x, y)) {
|
||||||
if (tpdebug)
|
if (tpdebug)
|
||||||
hgpk_dbg(psmouse, "discarding\n");
|
psmouse_dbg(psmouse, "discarding\n");
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
hgpk_spewing_hack(psmouse, left, right, x, y);
|
hgpk_spewing_hack(psmouse, left, right, x, y);
|
||||||
|
|
||||||
if (tpdebug)
|
if (tpdebug)
|
||||||
hgpk_dbg(psmouse, "l=%d r=%d x=%d y=%d\n", left, right, x, y);
|
psmouse_dbg(psmouse, "l=%d r=%d x=%d y=%d\n",
|
||||||
|
left, right, x, y);
|
||||||
|
|
||||||
input_report_key(dev, BTN_LEFT, left);
|
input_report_key(dev, BTN_LEFT, left);
|
||||||
input_report_key(dev, BTN_RIGHT, right);
|
input_report_key(dev, BTN_RIGHT, right);
|
||||||
|
@ -482,9 +484,8 @@ static psmouse_ret_t hgpk_process_byte(struct psmouse *psmouse)
|
||||||
* ugh, got a packet inside our recalibration
|
* ugh, got a packet inside our recalibration
|
||||||
* window, schedule another recalibration.
|
* window, schedule another recalibration.
|
||||||
*/
|
*/
|
||||||
hgpk_dbg(psmouse,
|
psmouse_dbg(psmouse,
|
||||||
"packet inside calibration window, "
|
"packet inside calibration window, queueing another recalibration\n");
|
||||||
"queueing another recalibration\n");
|
|
||||||
psmouse_queue_work(psmouse, &priv->recalib_wq,
|
psmouse_queue_work(psmouse, &priv->recalib_wq,
|
||||||
msecs_to_jiffies(post_interrupt_delay));
|
msecs_to_jiffies(post_interrupt_delay));
|
||||||
}
|
}
|
||||||
|
@ -628,7 +629,7 @@ static int hgpk_reset_device(struct psmouse *psmouse, bool recalibrate)
|
||||||
|
|
||||||
err = hgpk_select_mode(psmouse);
|
err = hgpk_select_mode(psmouse);
|
||||||
if (err) {
|
if (err) {
|
||||||
hgpk_err(psmouse, "failed to select mode\n");
|
psmouse_err(psmouse, "failed to select mode\n");
|
||||||
return err;
|
return err;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -648,11 +649,11 @@ static int hgpk_force_recalibrate(struct psmouse *psmouse)
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
if (!autorecal) {
|
if (!autorecal) {
|
||||||
hgpk_dbg(psmouse, "recalibrations disabled, ignoring\n");
|
psmouse_dbg(psmouse, "recalibration disabled, ignoring\n");
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
hgpk_dbg(psmouse, "recalibrating touchpad..\n");
|
psmouse_dbg(psmouse, "recalibrating touchpad..\n");
|
||||||
|
|
||||||
/* we don't want to race with the irq handler, nor with resyncs */
|
/* we don't want to race with the irq handler, nor with resyncs */
|
||||||
psmouse_set_state(psmouse, PSMOUSE_INITIALIZING);
|
psmouse_set_state(psmouse, PSMOUSE_INITIALIZING);
|
||||||
|
@ -675,7 +676,7 @@ static int hgpk_force_recalibrate(struct psmouse *psmouse)
|
||||||
psmouse_set_state(psmouse, PSMOUSE_ACTIVATED);
|
psmouse_set_state(psmouse, PSMOUSE_ACTIVATED);
|
||||||
|
|
||||||
if (tpdebug)
|
if (tpdebug)
|
||||||
hgpk_dbg(psmouse, "touchpad reactivated\n");
|
psmouse_dbg(psmouse, "touchpad reactivated\n");
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* If we get packets right away after recalibrating, it's likely
|
* If we get packets right away after recalibrating, it's likely
|
||||||
|
@ -727,16 +728,16 @@ static int hgpk_toggle_powersave(struct psmouse *psmouse, int enable)
|
||||||
|
|
||||||
err = hgpk_reset_device(psmouse, false);
|
err = hgpk_reset_device(psmouse, false);
|
||||||
if (err) {
|
if (err) {
|
||||||
hgpk_err(psmouse, "Failed to reset device!\n");
|
psmouse_err(psmouse, "Failed to reset device!\n");
|
||||||
return err;
|
return err;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* should be all set, enable the touchpad */
|
/* should be all set, enable the touchpad */
|
||||||
ps2_command(&psmouse->ps2dev, NULL, PSMOUSE_CMD_ENABLE);
|
ps2_command(&psmouse->ps2dev, NULL, PSMOUSE_CMD_ENABLE);
|
||||||
psmouse_set_state(psmouse, PSMOUSE_ACTIVATED);
|
psmouse_set_state(psmouse, PSMOUSE_ACTIVATED);
|
||||||
hgpk_dbg(psmouse, "Touchpad powered up.\n");
|
psmouse_dbg(psmouse, "Touchpad powered up.\n");
|
||||||
} else {
|
} else {
|
||||||
hgpk_dbg(psmouse, "Powering off touchpad.\n");
|
psmouse_dbg(psmouse, "Powering off touchpad.\n");
|
||||||
|
|
||||||
if (ps2_command(ps2dev, NULL, 0xec) ||
|
if (ps2_command(ps2dev, NULL, 0xec) ||
|
||||||
ps2_command(ps2dev, NULL, 0xec) ||
|
ps2_command(ps2dev, NULL, 0xec) ||
|
||||||
|
@ -923,7 +924,7 @@ static void hgpk_recalib_work(struct work_struct *work)
|
||||||
struct psmouse *psmouse = priv->psmouse;
|
struct psmouse *psmouse = priv->psmouse;
|
||||||
|
|
||||||
if (hgpk_force_recalibrate(psmouse))
|
if (hgpk_force_recalibrate(psmouse))
|
||||||
hgpk_err(psmouse, "recalibration failed!\n");
|
psmouse_err(psmouse, "recalibration failed!\n");
|
||||||
}
|
}
|
||||||
|
|
||||||
static int hgpk_register(struct psmouse *psmouse)
|
static int hgpk_register(struct psmouse *psmouse)
|
||||||
|
@ -947,14 +948,15 @@ static int hgpk_register(struct psmouse *psmouse)
|
||||||
err = device_create_file(&psmouse->ps2dev.serio->dev,
|
err = device_create_file(&psmouse->ps2dev.serio->dev,
|
||||||
&psmouse_attr_powered.dattr);
|
&psmouse_attr_powered.dattr);
|
||||||
if (err) {
|
if (err) {
|
||||||
hgpk_err(psmouse, "Failed creating 'powered' sysfs node\n");
|
psmouse_err(psmouse, "Failed creating 'powered' sysfs node\n");
|
||||||
return err;
|
return err;
|
||||||
}
|
}
|
||||||
|
|
||||||
err = device_create_file(&psmouse->ps2dev.serio->dev,
|
err = device_create_file(&psmouse->ps2dev.serio->dev,
|
||||||
&psmouse_attr_hgpk_mode.dattr);
|
&psmouse_attr_hgpk_mode.dattr);
|
||||||
if (err) {
|
if (err) {
|
||||||
hgpk_err(psmouse, "Failed creating 'hgpk_mode' sysfs node\n");
|
psmouse_err(psmouse,
|
||||||
|
"Failed creating 'hgpk_mode' sysfs node\n");
|
||||||
goto err_remove_powered;
|
goto err_remove_powered;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -963,8 +965,8 @@ static int hgpk_register(struct psmouse *psmouse)
|
||||||
err = device_create_file(&psmouse->ps2dev.serio->dev,
|
err = device_create_file(&psmouse->ps2dev.serio->dev,
|
||||||
&psmouse_attr_recalibrate.dattr);
|
&psmouse_attr_recalibrate.dattr);
|
||||||
if (err) {
|
if (err) {
|
||||||
hgpk_err(psmouse,
|
psmouse_err(psmouse,
|
||||||
"Failed creating 'recalibrate' sysfs node\n");
|
"Failed creating 'recalibrate' sysfs node\n");
|
||||||
goto err_remove_mode;
|
goto err_remove_mode;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1027,13 +1029,13 @@ static enum hgpk_model_t hgpk_get_model(struct psmouse *psmouse)
|
||||||
return -EIO;
|
return -EIO;
|
||||||
}
|
}
|
||||||
|
|
||||||
hgpk_dbg(psmouse, "ID: %02x %02x %02x\n", param[0], param[1], param[2]);
|
psmouse_dbg(psmouse, "ID: %02x %02x %02x\n", param[0], param[1], param[2]);
|
||||||
|
|
||||||
/* HGPK signature: 0x67, 0x00, 0x<model> */
|
/* HGPK signature: 0x67, 0x00, 0x<model> */
|
||||||
if (param[0] != 0x67 || param[1] != 0x00)
|
if (param[0] != 0x67 || param[1] != 0x00)
|
||||||
return -ENODEV;
|
return -ENODEV;
|
||||||
|
|
||||||
hgpk_info(psmouse, "OLPC touchpad revision 0x%x\n", param[2]);
|
psmouse_info(psmouse, "OLPC touchpad revision 0x%x\n", param[2]);
|
||||||
|
|
||||||
return param[2];
|
return param[2];
|
||||||
}
|
}
|
||||||
|
|
|
@ -46,17 +46,6 @@ struct hgpk_data {
|
||||||
int xsaw_secondary, ysaw_secondary; /* jumpiness detection */
|
int xsaw_secondary, ysaw_secondary; /* jumpiness detection */
|
||||||
};
|
};
|
||||||
|
|
||||||
#define hgpk_dbg(psmouse, format, arg...) \
|
|
||||||
dev_dbg(&(psmouse)->ps2dev.serio->dev, format, ## arg)
|
|
||||||
#define hgpk_err(psmouse, format, arg...) \
|
|
||||||
dev_err(&(psmouse)->ps2dev.serio->dev, format, ## arg)
|
|
||||||
#define hgpk_info(psmouse, format, arg...) \
|
|
||||||
dev_info(&(psmouse)->ps2dev.serio->dev, format, ## arg)
|
|
||||||
#define hgpk_warn(psmouse, format, arg...) \
|
|
||||||
dev_warn(&(psmouse)->ps2dev.serio->dev, format, ## arg)
|
|
||||||
#define hgpk_notice(psmouse, format, arg...) \
|
|
||||||
dev_notice(&(psmouse)->ps2dev.serio->dev, format, ## arg)
|
|
||||||
|
|
||||||
#ifdef CONFIG_MOUSE_PS2_OLPC
|
#ifdef CONFIG_MOUSE_PS2_OLPC
|
||||||
void hgpk_module_init(void);
|
void hgpk_module_init(void);
|
||||||
int hgpk_detect(struct psmouse *psmouse, bool set_properties);
|
int hgpk_detect(struct psmouse *psmouse, bool set_properties);
|
||||||
|
|
|
@ -169,8 +169,8 @@ static psmouse_ret_t lifebook_process_byte(struct psmouse *psmouse)
|
||||||
|
|
||||||
if (relative_packet) {
|
if (relative_packet) {
|
||||||
if (!dev2)
|
if (!dev2)
|
||||||
printk(KERN_WARNING "lifebook.c: got relative packet "
|
psmouse_warn(psmouse,
|
||||||
"but no relative device set up\n");
|
"got relative packet but no relative device set up\n");
|
||||||
} else {
|
} else {
|
||||||
if (lifebook_use_6byte_proto) {
|
if (lifebook_use_6byte_proto) {
|
||||||
input_report_abs(dev1, ABS_X,
|
input_report_abs(dev1, ABS_X,
|
||||||
|
@ -212,7 +212,7 @@ static int lifebook_absolute_mode(struct psmouse *psmouse)
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Enable absolute output -- ps2_command fails always but if
|
* Enable absolute output -- ps2_command fails always but if
|
||||||
* you leave this call out the touchsreen will never send
|
* you leave this call out the touchscreen will never send
|
||||||
* absolute coordinates
|
* absolute coordinates
|
||||||
*/
|
*/
|
||||||
param = lifebook_use_6byte_proto ? 0x08 : 0x07;
|
param = lifebook_use_6byte_proto ? 0x08 : 0x07;
|
||||||
|
|
|
@ -82,11 +82,11 @@ static psmouse_ret_t ps2pp_process_byte(struct psmouse *psmouse)
|
||||||
packet[0] = packet[2] | 0x08;
|
packet[0] = packet[2] | 0x08;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
#ifdef DEBUG
|
|
||||||
default:
|
default:
|
||||||
printk(KERN_WARNING "psmouse.c: Received PS2++ packet #%x, but don't know how to handle.\n",
|
psmouse_dbg(psmouse,
|
||||||
(packet[1] >> 4) | (packet[0] & 0x30));
|
"Received PS2++ packet #%x, but don't know how to handle.\n",
|
||||||
#endif
|
(packet[1] >> 4) | (packet[0] & 0x30));
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
/* Standard PS/2 motion data */
|
/* Standard PS/2 motion data */
|
||||||
|
@ -382,7 +382,7 @@ int ps2pp_init(struct psmouse *psmouse, bool set_properties)
|
||||||
}
|
}
|
||||||
|
|
||||||
} else {
|
} else {
|
||||||
printk(KERN_WARNING "logips2pp: Detected unknown logitech mouse model %d\n", model);
|
psmouse_warn(psmouse, "Detected unknown Logitech mouse model %d\n", model);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (set_properties) {
|
if (set_properties) {
|
||||||
|
@ -400,9 +400,9 @@ int ps2pp_init(struct psmouse *psmouse, bool set_properties)
|
||||||
error = device_create_file(&psmouse->ps2dev.serio->dev,
|
error = device_create_file(&psmouse->ps2dev.serio->dev,
|
||||||
&psmouse_attr_smartscroll.dattr);
|
&psmouse_attr_smartscroll.dattr);
|
||||||
if (error) {
|
if (error) {
|
||||||
printk(KERN_ERR
|
psmouse_err(psmouse,
|
||||||
"logips2pp.c: failed to create smartscroll "
|
"failed to create smartscroll sysfs attribute, error: %d\n",
|
||||||
"sysfs attribute, error: %d\n", error);
|
error);
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -11,6 +11,9 @@
|
||||||
* the Free Software Foundation.
|
* the Free Software Foundation.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
#define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
|
||||||
|
#define psmouse_fmt(fmt) fmt
|
||||||
|
|
||||||
#include <linux/delay.h>
|
#include <linux/delay.h>
|
||||||
#include <linux/module.h>
|
#include <linux/module.h>
|
||||||
#include <linux/slab.h>
|
#include <linux/slab.h>
|
||||||
|
@ -251,11 +254,14 @@ static int psmouse_handle_byte(struct psmouse *psmouse)
|
||||||
switch (rc) {
|
switch (rc) {
|
||||||
case PSMOUSE_BAD_DATA:
|
case PSMOUSE_BAD_DATA:
|
||||||
if (psmouse->state == PSMOUSE_ACTIVATED) {
|
if (psmouse->state == PSMOUSE_ACTIVATED) {
|
||||||
printk(KERN_WARNING "psmouse.c: %s at %s lost sync at byte %d\n",
|
psmouse_warn(psmouse,
|
||||||
psmouse->name, psmouse->phys, psmouse->pktcnt);
|
"%s at %s lost sync at byte %d\n",
|
||||||
|
psmouse->name, psmouse->phys,
|
||||||
|
psmouse->pktcnt);
|
||||||
if (++psmouse->out_of_sync_cnt == psmouse->resetafter) {
|
if (++psmouse->out_of_sync_cnt == psmouse->resetafter) {
|
||||||
__psmouse_set_state(psmouse, PSMOUSE_IGNORE);
|
__psmouse_set_state(psmouse, PSMOUSE_IGNORE);
|
||||||
printk(KERN_NOTICE "psmouse.c: issuing reconnect request\n");
|
psmouse_notice(psmouse,
|
||||||
|
"issuing reconnect request\n");
|
||||||
serio_reconnect(psmouse->ps2dev.serio);
|
serio_reconnect(psmouse->ps2dev.serio);
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
@ -267,8 +273,9 @@ static int psmouse_handle_byte(struct psmouse *psmouse)
|
||||||
psmouse->pktcnt = 0;
|
psmouse->pktcnt = 0;
|
||||||
if (psmouse->out_of_sync_cnt) {
|
if (psmouse->out_of_sync_cnt) {
|
||||||
psmouse->out_of_sync_cnt = 0;
|
psmouse->out_of_sync_cnt = 0;
|
||||||
printk(KERN_NOTICE "psmouse.c: %s at %s - driver resynched.\n",
|
psmouse_notice(psmouse,
|
||||||
psmouse->name, psmouse->phys);
|
"%s at %s - driver resynced.\n",
|
||||||
|
psmouse->name, psmouse->phys);
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
@ -295,9 +302,10 @@ static irqreturn_t psmouse_interrupt(struct serio *serio,
|
||||||
((flags & SERIO_PARITY) && !psmouse->ignore_parity))) {
|
((flags & SERIO_PARITY) && !psmouse->ignore_parity))) {
|
||||||
|
|
||||||
if (psmouse->state == PSMOUSE_ACTIVATED)
|
if (psmouse->state == PSMOUSE_ACTIVATED)
|
||||||
printk(KERN_WARNING "psmouse.c: bad data from KBC -%s%s\n",
|
psmouse_warn(psmouse,
|
||||||
flags & SERIO_TIMEOUT ? " timeout" : "",
|
"bad data from KBC -%s%s\n",
|
||||||
flags & SERIO_PARITY ? " bad parity" : "");
|
flags & SERIO_TIMEOUT ? " timeout" : "",
|
||||||
|
flags & SERIO_PARITY ? " bad parity" : "");
|
||||||
ps2_cmd_aborted(&psmouse->ps2dev);
|
ps2_cmd_aborted(&psmouse->ps2dev);
|
||||||
goto out;
|
goto out;
|
||||||
}
|
}
|
||||||
|
@ -315,8 +323,8 @@ static irqreturn_t psmouse_interrupt(struct serio *serio,
|
||||||
|
|
||||||
if (psmouse->state == PSMOUSE_ACTIVATED &&
|
if (psmouse->state == PSMOUSE_ACTIVATED &&
|
||||||
psmouse->pktcnt && time_after(jiffies, psmouse->last + HZ/2)) {
|
psmouse->pktcnt && time_after(jiffies, psmouse->last + HZ/2)) {
|
||||||
printk(KERN_INFO "psmouse.c: %s at %s lost synchronization, throwing %d bytes away.\n",
|
psmouse_info(psmouse, "%s at %s lost synchronization, throwing %d bytes away.\n",
|
||||||
psmouse->name, psmouse->phys, psmouse->pktcnt);
|
psmouse->name, psmouse->phys, psmouse->pktcnt);
|
||||||
psmouse->badbyte = psmouse->packet[0];
|
psmouse->badbyte = psmouse->packet[0];
|
||||||
__psmouse_set_state(psmouse, PSMOUSE_RESYNCING);
|
__psmouse_set_state(psmouse, PSMOUSE_RESYNCING);
|
||||||
psmouse_queue_work(psmouse, &psmouse->resync_work, 0);
|
psmouse_queue_work(psmouse, &psmouse->resync_work, 0);
|
||||||
|
@ -943,7 +951,8 @@ static int psmouse_probe(struct psmouse *psmouse)
|
||||||
*/
|
*/
|
||||||
|
|
||||||
if (ps2_command(ps2dev, NULL, PSMOUSE_CMD_RESET_DIS))
|
if (ps2_command(ps2dev, NULL, PSMOUSE_CMD_RESET_DIS))
|
||||||
printk(KERN_WARNING "psmouse.c: Failed to reset mouse on %s\n", ps2dev->serio->phys);
|
psmouse_warn(psmouse, "Failed to reset mouse on %s\n",
|
||||||
|
ps2dev->serio->phys);
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
@ -1005,8 +1014,8 @@ static void psmouse_initialize(struct psmouse *psmouse)
|
||||||
static void psmouse_activate(struct psmouse *psmouse)
|
static void psmouse_activate(struct psmouse *psmouse)
|
||||||
{
|
{
|
||||||
if (ps2_command(&psmouse->ps2dev, NULL, PSMOUSE_CMD_ENABLE))
|
if (ps2_command(&psmouse->ps2dev, NULL, PSMOUSE_CMD_ENABLE))
|
||||||
printk(KERN_WARNING "psmouse.c: Failed to enable mouse on %s\n",
|
psmouse_warn(psmouse, "Failed to enable mouse on %s\n",
|
||||||
psmouse->ps2dev.serio->phys);
|
psmouse->ps2dev.serio->phys);
|
||||||
|
|
||||||
psmouse_set_state(psmouse, PSMOUSE_ACTIVATED);
|
psmouse_set_state(psmouse, PSMOUSE_ACTIVATED);
|
||||||
}
|
}
|
||||||
|
@ -1020,14 +1029,14 @@ static void psmouse_activate(struct psmouse *psmouse)
|
||||||
static void psmouse_deactivate(struct psmouse *psmouse)
|
static void psmouse_deactivate(struct psmouse *psmouse)
|
||||||
{
|
{
|
||||||
if (ps2_command(&psmouse->ps2dev, NULL, PSMOUSE_CMD_DISABLE))
|
if (ps2_command(&psmouse->ps2dev, NULL, PSMOUSE_CMD_DISABLE))
|
||||||
printk(KERN_WARNING "psmouse.c: Failed to deactivate mouse on %s\n",
|
psmouse_warn(psmouse, "Failed to deactivate mouse on %s\n",
|
||||||
psmouse->ps2dev.serio->phys);
|
psmouse->ps2dev.serio->phys);
|
||||||
|
|
||||||
psmouse_set_state(psmouse, PSMOUSE_CMD_MODE);
|
psmouse_set_state(psmouse, PSMOUSE_CMD_MODE);
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* psmouse_poll() - default poll hanlder. Everyone except for ALPS uses it.
|
* psmouse_poll() - default poll handler. Everyone except for ALPS uses it.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
static int psmouse_poll(struct psmouse *psmouse)
|
static int psmouse_poll(struct psmouse *psmouse)
|
||||||
|
@ -1115,14 +1124,15 @@ static void psmouse_resync(struct work_struct *work)
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!enabled) {
|
if (!enabled) {
|
||||||
printk(KERN_WARNING "psmouse.c: failed to re-enable mouse on %s\n",
|
psmouse_warn(psmouse, "failed to re-enable mouse on %s\n",
|
||||||
psmouse->ps2dev.serio->phys);
|
psmouse->ps2dev.serio->phys);
|
||||||
failed = true;
|
failed = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (failed) {
|
if (failed) {
|
||||||
psmouse_set_state(psmouse, PSMOUSE_IGNORE);
|
psmouse_set_state(psmouse, PSMOUSE_IGNORE);
|
||||||
printk(KERN_INFO "psmouse.c: resync failed, issuing reconnect request\n");
|
psmouse_info(psmouse,
|
||||||
|
"resync failed, issuing reconnect request\n");
|
||||||
serio_reconnect(serio);
|
serio_reconnect(serio);
|
||||||
} else
|
} else
|
||||||
psmouse_set_state(psmouse, PSMOUSE_ACTIVATED);
|
psmouse_set_state(psmouse, PSMOUSE_ACTIVATED);
|
||||||
|
@ -1155,8 +1165,8 @@ static void psmouse_cleanup(struct serio *serio)
|
||||||
* Disable stream mode so cleanup routine can proceed undisturbed.
|
* Disable stream mode so cleanup routine can proceed undisturbed.
|
||||||
*/
|
*/
|
||||||
if (ps2_command(&psmouse->ps2dev, NULL, PSMOUSE_CMD_DISABLE))
|
if (ps2_command(&psmouse->ps2dev, NULL, PSMOUSE_CMD_DISABLE))
|
||||||
printk(KERN_WARNING "psmouse.c: Failed to disable mouse on %s\n",
|
psmouse_warn(psmouse, "Failed to disable mouse on %s\n",
|
||||||
psmouse->ps2dev.serio->phys);
|
psmouse->ps2dev.serio->phys);
|
||||||
|
|
||||||
if (psmouse->cleanup)
|
if (psmouse->cleanup)
|
||||||
psmouse->cleanup(psmouse);
|
psmouse->cleanup(psmouse);
|
||||||
|
@ -1400,7 +1410,8 @@ static int psmouse_reconnect(struct serio *serio)
|
||||||
int rc = -1;
|
int rc = -1;
|
||||||
|
|
||||||
if (!drv || !psmouse) {
|
if (!drv || !psmouse) {
|
||||||
printk(KERN_DEBUG "psmouse: reconnect request, but serio is disconnected, ignoring...\n");
|
psmouse_dbg(psmouse,
|
||||||
|
"reconnect request, but serio is disconnected, ignoring...\n");
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1427,8 +1438,9 @@ static int psmouse_reconnect(struct serio *serio)
|
||||||
goto out;
|
goto out;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* ok, the device type (and capabilities) match the old one,
|
/*
|
||||||
* we can continue using it, complete intialization
|
* OK, the device type (and capabilities) match the old one,
|
||||||
|
* we can continue using it, complete initialization
|
||||||
*/
|
*/
|
||||||
psmouse_set_state(psmouse, PSMOUSE_CMD_MODE);
|
psmouse_set_state(psmouse, PSMOUSE_CMD_MODE);
|
||||||
|
|
||||||
|
@ -1586,9 +1598,8 @@ static ssize_t psmouse_attr_set_protocol(struct psmouse *psmouse, void *data, co
|
||||||
|
|
||||||
while (!list_empty(&serio->children)) {
|
while (!list_empty(&serio->children)) {
|
||||||
if (++retry > 3) {
|
if (++retry > 3) {
|
||||||
printk(KERN_WARNING
|
psmouse_warn(psmouse,
|
||||||
"psmouse: failed to destroy children ports, "
|
"failed to destroy children ports, protocol change aborted.\n");
|
||||||
"protocol change aborted.\n");
|
|
||||||
input_free_device(new_dev);
|
input_free_device(new_dev);
|
||||||
return -EIO;
|
return -EIO;
|
||||||
}
|
}
|
||||||
|
@ -1715,7 +1726,7 @@ static int __init psmouse_init(void)
|
||||||
|
|
||||||
kpsmoused_wq = create_singlethread_workqueue("kpsmoused");
|
kpsmoused_wq = create_singlethread_workqueue("kpsmoused");
|
||||||
if (!kpsmoused_wq) {
|
if (!kpsmoused_wq) {
|
||||||
printk(KERN_ERR "psmouse: failed to create kpsmoused workqueue\n");
|
pr_err("failed to create kpsmoused workqueue\n");
|
||||||
return -ENOMEM;
|
return -ENOMEM;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -150,4 +150,29 @@ static struct psmouse_attribute psmouse_attr_##_name = { \
|
||||||
static ssize_t _set(struct psmouse *, void *, const char *, size_t); \
|
static ssize_t _set(struct psmouse *, void *, const char *, size_t); \
|
||||||
__PSMOUSE_DEFINE_ATTR_VAR(_name, _mode, _data, NULL, _set, true)
|
__PSMOUSE_DEFINE_ATTR_VAR(_name, _mode, _data, NULL, _set, true)
|
||||||
|
|
||||||
|
#ifndef psmouse_fmt
|
||||||
|
#define psmouse_fmt(fmt) KBUILD_BASENAME ": " fmt
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#define psmouse_dbg(psmouse, format, ...) \
|
||||||
|
dev_dbg(&(psmouse)->ps2dev.serio->dev, \
|
||||||
|
psmouse_fmt(format), ##__VA_ARGS__)
|
||||||
|
#define psmouse_info(psmouse, format, ...) \
|
||||||
|
dev_info(&(psmouse)->ps2dev.serio->dev, \
|
||||||
|
psmouse_fmt(format), ##__VA_ARGS__)
|
||||||
|
#define psmouse_warn(psmouse, format, ...) \
|
||||||
|
dev_warn(&(psmouse)->ps2dev.serio->dev, \
|
||||||
|
psmouse_fmt(format), ##__VA_ARGS__)
|
||||||
|
#define psmouse_err(psmouse, format, ...) \
|
||||||
|
dev_err(&(psmouse)->ps2dev.serio->dev, \
|
||||||
|
psmouse_fmt(format), ##__VA_ARGS__)
|
||||||
|
#define psmouse_notice(psmouse, format, ...) \
|
||||||
|
dev_notice(&(psmouse)->ps2dev.serio->dev, \
|
||||||
|
psmouse_fmt(format), ##__VA_ARGS__)
|
||||||
|
#define psmouse_printk(level, psmouse, format, ...) \
|
||||||
|
dev_printk(level, \
|
||||||
|
&(psmouse)->ps2dev.serio->dev, \
|
||||||
|
psmouse_fmt(format), ##__VA_ARGS__)
|
||||||
|
|
||||||
|
|
||||||
#endif /* _PSMOUSE_H */
|
#endif /* _PSMOUSE_H */
|
||||||
|
|
|
@ -607,11 +607,12 @@ static void fsp_packet_debug(unsigned char packet[])
|
||||||
|
|
||||||
ps2_packet_cnt++;
|
ps2_packet_cnt++;
|
||||||
jiffies_msec = jiffies_to_msecs(jiffies);
|
jiffies_msec = jiffies_to_msecs(jiffies);
|
||||||
printk(KERN_DEBUG "%08dms PS/2 packets: %02x, %02x, %02x, %02x\n",
|
psmouse_dbg(psmouse,
|
||||||
jiffies_msec, packet[0], packet[1], packet[2], packet[3]);
|
"%08dms PS/2 packets: %02x, %02x, %02x, %02x\n",
|
||||||
|
jiffies_msec, packet[0], packet[1], packet[2], packet[3]);
|
||||||
|
|
||||||
if (jiffies_msec - ps2_last_second > 1000) {
|
if (jiffies_msec - ps2_last_second > 1000) {
|
||||||
printk(KERN_DEBUG "PS/2 packets/sec = %d\n", ps2_packet_cnt);
|
psmouse_dbg(psmouse, "PS/2 packets/sec = %d\n", ps2_packet_cnt);
|
||||||
ps2_packet_cnt = 0;
|
ps2_packet_cnt = 0;
|
||||||
ps2_last_second = jiffies_msec;
|
ps2_last_second = jiffies_msec;
|
||||||
}
|
}
|
||||||
|
@ -820,9 +821,9 @@ int fsp_init(struct psmouse *psmouse)
|
||||||
return -ENODEV;
|
return -ENODEV;
|
||||||
}
|
}
|
||||||
|
|
||||||
printk(KERN_INFO
|
psmouse_info(psmouse,
|
||||||
"Finger Sensing Pad, hw: %d.%d.%d, sw: %s, buttons: %d\n",
|
"Finger Sensing Pad, hw: %d.%d.%d, sw: %s, buttons: %d\n",
|
||||||
ver >> 4, ver & 0x0F, rev, fsp_drv_ver, buttons & 7);
|
ver >> 4, ver & 0x0F, rev, fsp_drv_ver, buttons & 7);
|
||||||
|
|
||||||
psmouse->private = priv = kzalloc(sizeof(struct fsp_data), GFP_KERNEL);
|
psmouse->private = priv = kzalloc(sizeof(struct fsp_data), GFP_KERNEL);
|
||||||
if (!priv)
|
if (!priv)
|
||||||
|
|
|
@ -167,8 +167,8 @@ static int synaptics_capability(struct psmouse *psmouse)
|
||||||
|
|
||||||
if (SYN_EXT_CAP_REQUESTS(priv->capabilities) >= 1) {
|
if (SYN_EXT_CAP_REQUESTS(priv->capabilities) >= 1) {
|
||||||
if (synaptics_send_cmd(psmouse, SYN_QUE_EXT_CAPAB, cap)) {
|
if (synaptics_send_cmd(psmouse, SYN_QUE_EXT_CAPAB, cap)) {
|
||||||
printk(KERN_ERR "Synaptics claims to have extended capabilities,"
|
psmouse_warn(psmouse,
|
||||||
" but I'm not able to read them.\n");
|
"device claims to have extended capabilities, but I'm not able to read them.\n");
|
||||||
} else {
|
} else {
|
||||||
priv->ext_cap = (cap[0] << 16) | (cap[1] << 8) | cap[2];
|
priv->ext_cap = (cap[0] << 16) | (cap[1] << 8) | cap[2];
|
||||||
|
|
||||||
|
@ -183,8 +183,8 @@ static int synaptics_capability(struct psmouse *psmouse)
|
||||||
|
|
||||||
if (SYN_EXT_CAP_REQUESTS(priv->capabilities) >= 4) {
|
if (SYN_EXT_CAP_REQUESTS(priv->capabilities) >= 4) {
|
||||||
if (synaptics_send_cmd(psmouse, SYN_QUE_EXT_CAPAB_0C, cap)) {
|
if (synaptics_send_cmd(psmouse, SYN_QUE_EXT_CAPAB_0C, cap)) {
|
||||||
printk(KERN_ERR "Synaptics claims to have extended capability 0x0c,"
|
psmouse_warn(psmouse,
|
||||||
" but I'm not able to read it.\n");
|
"device claims to have extended capability 0x0c, but I'm not able to read it.\n");
|
||||||
} else {
|
} else {
|
||||||
priv->ext_cap_0c = (cap[0] << 16) | (cap[1] << 8) | cap[2];
|
priv->ext_cap_0c = (cap[0] << 16) | (cap[1] << 8) | cap[2];
|
||||||
}
|
}
|
||||||
|
@ -232,8 +232,8 @@ static int synaptics_resolution(struct psmouse *psmouse)
|
||||||
if (SYN_EXT_CAP_REQUESTS(priv->capabilities) >= 5 &&
|
if (SYN_EXT_CAP_REQUESTS(priv->capabilities) >= 5 &&
|
||||||
SYN_CAP_MAX_DIMENSIONS(priv->ext_cap_0c)) {
|
SYN_CAP_MAX_DIMENSIONS(priv->ext_cap_0c)) {
|
||||||
if (synaptics_send_cmd(psmouse, SYN_QUE_EXT_MAX_COORDS, resp)) {
|
if (synaptics_send_cmd(psmouse, SYN_QUE_EXT_MAX_COORDS, resp)) {
|
||||||
printk(KERN_ERR "Synaptics claims to have max coordinates"
|
psmouse_warn(psmouse,
|
||||||
" query, but I'm not able to read it.\n");
|
"device claims to have max coordinates query, but I'm not able to read it.\n");
|
||||||
} else {
|
} else {
|
||||||
priv->x_max = (resp[0] << 5) | ((resp[1] & 0x0f) << 1);
|
priv->x_max = (resp[0] << 5) | ((resp[1] & 0x0f) << 1);
|
||||||
priv->y_max = (resp[2] << 5) | ((resp[1] & 0xf0) >> 3);
|
priv->y_max = (resp[2] << 5) | ((resp[1] & 0xf0) >> 3);
|
||||||
|
@ -243,8 +243,8 @@ static int synaptics_resolution(struct psmouse *psmouse)
|
||||||
if (SYN_EXT_CAP_REQUESTS(priv->capabilities) >= 7 &&
|
if (SYN_EXT_CAP_REQUESTS(priv->capabilities) >= 7 &&
|
||||||
SYN_CAP_MIN_DIMENSIONS(priv->ext_cap_0c)) {
|
SYN_CAP_MIN_DIMENSIONS(priv->ext_cap_0c)) {
|
||||||
if (synaptics_send_cmd(psmouse, SYN_QUE_EXT_MIN_COORDS, resp)) {
|
if (synaptics_send_cmd(psmouse, SYN_QUE_EXT_MIN_COORDS, resp)) {
|
||||||
printk(KERN_ERR "Synaptics claims to have min coordinates"
|
psmouse_warn(psmouse,
|
||||||
" query, but I'm not able to read it.\n");
|
"device claims to have min coordinates query, but I'm not able to read it.\n");
|
||||||
} else {
|
} else {
|
||||||
priv->x_min = (resp[0] << 5) | ((resp[1] & 0x0f) << 1);
|
priv->x_min = (resp[0] << 5) | ((resp[1] & 0x0f) << 1);
|
||||||
priv->y_min = (resp[2] << 5) | ((resp[1] & 0xf0) >> 3);
|
priv->y_min = (resp[2] << 5) | ((resp[1] & 0xf0) >> 3);
|
||||||
|
@ -388,7 +388,8 @@ static void synaptics_pt_activate(struct psmouse *psmouse)
|
||||||
priv->mode &= ~SYN_BIT_FOUR_BYTE_CLIENT;
|
priv->mode &= ~SYN_BIT_FOUR_BYTE_CLIENT;
|
||||||
|
|
||||||
if (synaptics_mode_cmd(psmouse, priv->mode))
|
if (synaptics_mode_cmd(psmouse, priv->mode))
|
||||||
printk(KERN_INFO "synaptics: failed to switch guest protocol\n");
|
psmouse_warn(psmouse,
|
||||||
|
"failed to switch guest protocol\n");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -398,7 +399,8 @@ static void synaptics_pt_create(struct psmouse *psmouse)
|
||||||
|
|
||||||
serio = kzalloc(sizeof(struct serio), GFP_KERNEL);
|
serio = kzalloc(sizeof(struct serio), GFP_KERNEL);
|
||||||
if (!serio) {
|
if (!serio) {
|
||||||
printk(KERN_ERR "synaptics: not enough memory to allocate pass-through port\n");
|
psmouse_err(psmouse,
|
||||||
|
"not enough memory for pass-through port\n");
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -412,7 +414,8 @@ static void synaptics_pt_create(struct psmouse *psmouse)
|
||||||
|
|
||||||
psmouse->pt_activate = synaptics_pt_activate;
|
psmouse->pt_activate = synaptics_pt_activate;
|
||||||
|
|
||||||
printk(KERN_INFO "serio: %s port at %s\n", serio->name, psmouse->phys);
|
psmouse_info(psmouse, "serio: %s port at %s\n",
|
||||||
|
serio->name, psmouse->phys);
|
||||||
serio_register_port(serio);
|
serio_register_port(serio);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1049,13 +1052,15 @@ static void synaptics_process_packet(struct psmouse *psmouse)
|
||||||
input_sync(dev);
|
input_sync(dev);
|
||||||
}
|
}
|
||||||
|
|
||||||
static int synaptics_validate_byte(unsigned char packet[], int idx, unsigned char pkt_type)
|
static int synaptics_validate_byte(struct psmouse *psmouse,
|
||||||
|
int idx, unsigned char pkt_type)
|
||||||
{
|
{
|
||||||
static const unsigned char newabs_mask[] = { 0xC8, 0x00, 0x00, 0xC8, 0x00 };
|
static const unsigned char newabs_mask[] = { 0xC8, 0x00, 0x00, 0xC8, 0x00 };
|
||||||
static const unsigned char newabs_rel_mask[] = { 0xC0, 0x00, 0x00, 0xC0, 0x00 };
|
static const unsigned char newabs_rel_mask[] = { 0xC0, 0x00, 0x00, 0xC0, 0x00 };
|
||||||
static const unsigned char newabs_rslt[] = { 0x80, 0x00, 0x00, 0xC0, 0x00 };
|
static const unsigned char newabs_rslt[] = { 0x80, 0x00, 0x00, 0xC0, 0x00 };
|
||||||
static const unsigned char oldabs_mask[] = { 0xC0, 0x60, 0x00, 0xC0, 0x60 };
|
static const unsigned char oldabs_mask[] = { 0xC0, 0x60, 0x00, 0xC0, 0x60 };
|
||||||
static const unsigned char oldabs_rslt[] = { 0xC0, 0x00, 0x00, 0x80, 0x00 };
|
static const unsigned char oldabs_rslt[] = { 0xC0, 0x00, 0x00, 0x80, 0x00 };
|
||||||
|
const char *packet = psmouse->packet;
|
||||||
|
|
||||||
if (idx < 0 || idx > 4)
|
if (idx < 0 || idx > 4)
|
||||||
return 0;
|
return 0;
|
||||||
|
@ -1073,7 +1078,7 @@ static int synaptics_validate_byte(unsigned char packet[], int idx, unsigned cha
|
||||||
return (packet[idx] & oldabs_mask[idx]) == oldabs_rslt[idx];
|
return (packet[idx] & oldabs_mask[idx]) == oldabs_rslt[idx];
|
||||||
|
|
||||||
default:
|
default:
|
||||||
printk(KERN_ERR "synaptics: unknown packet type %d\n", pkt_type);
|
psmouse_err(psmouse, "unknown packet type %d\n", pkt_type);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1083,8 +1088,8 @@ static unsigned char synaptics_detect_pkt_type(struct psmouse *psmouse)
|
||||||
int i;
|
int i;
|
||||||
|
|
||||||
for (i = 0; i < 5; i++)
|
for (i = 0; i < 5; i++)
|
||||||
if (!synaptics_validate_byte(psmouse->packet, i, SYN_NEWABS_STRICT)) {
|
if (!synaptics_validate_byte(psmouse, i, SYN_NEWABS_STRICT)) {
|
||||||
printk(KERN_INFO "synaptics: using relaxed packet validation\n");
|
psmouse_info(psmouse, "using relaxed packet validation\n");
|
||||||
return SYN_NEWABS_RELAXED;
|
return SYN_NEWABS_RELAXED;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1109,7 +1114,7 @@ static psmouse_ret_t synaptics_process_byte(struct psmouse *psmouse)
|
||||||
return PSMOUSE_FULL_PACKET;
|
return PSMOUSE_FULL_PACKET;
|
||||||
}
|
}
|
||||||
|
|
||||||
return synaptics_validate_byte(psmouse->packet, psmouse->pktcnt - 1, priv->pkt_type) ?
|
return synaptics_validate_byte(psmouse, psmouse->pktcnt - 1, priv->pkt_type) ?
|
||||||
PSMOUSE_GOOD_DATA : PSMOUSE_BAD_DATA;
|
PSMOUSE_GOOD_DATA : PSMOUSE_BAD_DATA;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1222,21 +1227,21 @@ static int synaptics_reconnect(struct psmouse *psmouse)
|
||||||
return -1;
|
return -1;
|
||||||
|
|
||||||
if (retry > 1)
|
if (retry > 1)
|
||||||
printk(KERN_DEBUG "Synaptics reconnected after %d tries\n",
|
psmouse_dbg(psmouse, "reconnected after %d tries\n", retry);
|
||||||
retry);
|
|
||||||
|
|
||||||
if (synaptics_query_hardware(psmouse)) {
|
if (synaptics_query_hardware(psmouse)) {
|
||||||
printk(KERN_ERR "Unable to query Synaptics hardware.\n");
|
psmouse_err(psmouse, "Unable to query device.\n");
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (synaptics_set_absolute_mode(psmouse)) {
|
if (synaptics_set_absolute_mode(psmouse)) {
|
||||||
printk(KERN_ERR "Unable to initialize Synaptics hardware.\n");
|
psmouse_err(psmouse, "Unable to initialize device.\n");
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (synaptics_set_advanced_gesture_mode(psmouse)) {
|
if (synaptics_set_advanced_gesture_mode(psmouse)) {
|
||||||
printk(KERN_ERR "Advanced gesture mode reconnect failed.\n");
|
psmouse_err(psmouse,
|
||||||
|
"Advanced gesture mode reconnect failed.\n");
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1244,12 +1249,12 @@ static int synaptics_reconnect(struct psmouse *psmouse)
|
||||||
old_priv.model_id != priv->model_id ||
|
old_priv.model_id != priv->model_id ||
|
||||||
old_priv.capabilities != priv->capabilities ||
|
old_priv.capabilities != priv->capabilities ||
|
||||||
old_priv.ext_cap != priv->ext_cap) {
|
old_priv.ext_cap != priv->ext_cap) {
|
||||||
printk(KERN_ERR "Synaptics hardware appears to be different: "
|
psmouse_err(psmouse,
|
||||||
"id(%ld-%ld), model(%ld-%ld), caps(%lx-%lx), ext(%lx-%lx).\n",
|
"hardware appears to be different: id(%ld-%ld), model(%ld-%ld), caps(%lx-%lx), ext(%lx-%lx).\n",
|
||||||
old_priv.identity, priv->identity,
|
old_priv.identity, priv->identity,
|
||||||
old_priv.model_id, priv->model_id,
|
old_priv.model_id, priv->model_id,
|
||||||
old_priv.capabilities, priv->capabilities,
|
old_priv.capabilities, priv->capabilities,
|
||||||
old_priv.ext_cap, priv->ext_cap);
|
old_priv.ext_cap, priv->ext_cap);
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1330,7 +1335,8 @@ int synaptics_init(struct psmouse *psmouse)
|
||||||
* just fine.
|
* just fine.
|
||||||
*/
|
*/
|
||||||
if (broken_olpc_ec) {
|
if (broken_olpc_ec) {
|
||||||
printk(KERN_INFO "synaptics: OLPC XO detected, not enabling Synaptics protocol.\n");
|
psmouse_info(psmouse,
|
||||||
|
"OLPC XO detected, not enabling Synaptics protocol.\n");
|
||||||
return -ENODEV;
|
return -ENODEV;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1341,26 +1347,28 @@ int synaptics_init(struct psmouse *psmouse)
|
||||||
psmouse_reset(psmouse);
|
psmouse_reset(psmouse);
|
||||||
|
|
||||||
if (synaptics_query_hardware(psmouse)) {
|
if (synaptics_query_hardware(psmouse)) {
|
||||||
printk(KERN_ERR "Unable to query Synaptics hardware.\n");
|
psmouse_err(psmouse, "Unable to query device.\n");
|
||||||
goto init_fail;
|
goto init_fail;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (synaptics_set_absolute_mode(psmouse)) {
|
if (synaptics_set_absolute_mode(psmouse)) {
|
||||||
printk(KERN_ERR "Unable to initialize Synaptics hardware.\n");
|
psmouse_err(psmouse, "Unable to initialize device.\n");
|
||||||
goto init_fail;
|
goto init_fail;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (synaptics_set_advanced_gesture_mode(psmouse)) {
|
if (synaptics_set_advanced_gesture_mode(psmouse)) {
|
||||||
printk(KERN_ERR "Advanced gesture mode init failed.\n");
|
psmouse_err(psmouse, "Advanced gesture mode init failed.\n");
|
||||||
goto init_fail;
|
goto init_fail;
|
||||||
}
|
}
|
||||||
|
|
||||||
priv->pkt_type = SYN_MODEL_NEWABS(priv->model_id) ? SYN_NEWABS : SYN_OLDABS;
|
priv->pkt_type = SYN_MODEL_NEWABS(priv->model_id) ? SYN_NEWABS : SYN_OLDABS;
|
||||||
|
|
||||||
printk(KERN_INFO "Synaptics Touchpad, model: %ld, fw: %ld.%ld, id: %#lx, caps: %#lx/%#lx/%#lx\n",
|
psmouse_info(psmouse,
|
||||||
SYN_ID_MODEL(priv->identity),
|
"Touchpad model: %ld, fw: %ld.%ld, id: %#lx, caps: %#lx/%#lx/%#lx\n",
|
||||||
SYN_ID_MAJOR(priv->identity), SYN_ID_MINOR(priv->identity),
|
SYN_ID_MODEL(priv->identity),
|
||||||
priv->model_id, priv->capabilities, priv->ext_cap, priv->ext_cap_0c);
|
SYN_ID_MAJOR(priv->identity), SYN_ID_MINOR(priv->identity),
|
||||||
|
priv->model_id,
|
||||||
|
priv->capabilities, priv->ext_cap, priv->ext_cap_0c);
|
||||||
|
|
||||||
set_input_params(psmouse->dev, priv);
|
set_input_params(psmouse->dev, priv);
|
||||||
|
|
||||||
|
@ -1392,8 +1400,9 @@ int synaptics_init(struct psmouse *psmouse)
|
||||||
* the same rate as a standard PS/2 mouse).
|
* the same rate as a standard PS/2 mouse).
|
||||||
*/
|
*/
|
||||||
if (psmouse->rate >= 80 && impaired_toshiba_kbc) {
|
if (psmouse->rate >= 80 && impaired_toshiba_kbc) {
|
||||||
printk(KERN_INFO "synaptics: Toshiba %s detected, limiting rate to 40pps.\n",
|
psmouse_info(psmouse,
|
||||||
dmi_get_system_info(DMI_PRODUCT_NAME));
|
"Toshiba %s detected, limiting rate to 40pps.\n",
|
||||||
|
dmi_get_system_info(DMI_PRODUCT_NAME));
|
||||||
psmouse->rate = 40;
|
psmouse->rate = 40;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Add table
Reference in a new issue