summaryrefslogtreecommitdiffstats
path: root/alps-v2.patch
diff options
context:
space:
mode:
authorJosh Boyer <jwboyer@redhat.com>2013-02-21 10:08:01 -0500
committerJosh Boyer <jwboyer@redhat.com>2013-02-21 10:08:50 -0500
commit0b030fad7e5b5c451b6bd34ff9b7d37f6687a700 (patch)
treea225e183169fa2da1d0e89de49f3f65dd6520ab8 /alps-v2.patch
parent3704ea2fb1d4e7403882e727b2223c999e78d73a (diff)
downloadkernel-0b030fad7e5b5c451b6bd34ff9b7d37f6687a700.tar.gz
kernel-0b030fad7e5b5c451b6bd34ff9b7d37f6687a700.tar.xz
kernel-0b030fad7e5b5c451b6bd34ff9b7d37f6687a700.zip
Linux v3.8-3040-ga0b1c42
Diffstat (limited to 'alps-v2.patch')
-rw-r--r--alps-v2.patch2246
1 files changed, 0 insertions, 2246 deletions
diff --git a/alps-v2.patch b/alps-v2.patch
index d394c4a92..bdb57067e 100644
--- a/alps-v2.patch
+++ b/alps-v2.patch
@@ -1,2249 +1,3 @@
-From f822982515378982dc8d8e6058579288d0ee3cff Mon Sep 17 00:00:00 2001
-From: Kevin Cernekee <cernekee@gmail.com>
-Date: Wed, 13 Feb 2013 20:55:19 -0800
-Subject: [PATCH 01/15] Input: ALPS - document the alps.h data structures
-
-Add kernel-doc markup.
-
-Signed-off-by: Kevin Cernekee <cernekee@gmail.com>
-Tested-by: Dave Turvene <dturvene@dahetral.com>
-Signed-off-by: Dmitry Torokhov <dmitry.torokhov@gmail.com>
----
- drivers/input/mouse/alps.h | 74 ++++++++++++++++++++++++++++++++++++++--------
- 1 file changed, 61 insertions(+), 13 deletions(-)
-
-diff --git a/drivers/input/mouse/alps.h b/drivers/input/mouse/alps.h
-index ae1ac35..67be4e5 100644
---- a/drivers/input/mouse/alps.h
-+++ b/drivers/input/mouse/alps.h
-@@ -17,30 +17,78 @@
- #define ALPS_PROTO_V3 2
- #define ALPS_PROTO_V4 3
-
-+/**
-+ * struct alps_model_info - touchpad ID table
-+ * @signature: E7 response string to match.
-+ * @command_mode_resp: For V3/V4 touchpads, the final byte of the EC response
-+ * (aka command mode response) identifies the firmware minor version. This
-+ * can be used to distinguish different hardware models which are not
-+ * uniquely identifiable through their E7 responses.
-+ * @proto_version: Indicates V1/V2/V3/...
-+ * @byte0: Helps figure out whether a position report packet matches the
-+ * known format for this model. The first byte of the report, ANDed with
-+ * mask0, should match byte0.
-+ * @mask0: The mask used to check the first byte of the report.
-+ * @flags: Additional device capabilities (passthrough port, trackstick, etc.).
-+ *
-+ * Many (but not all) ALPS touchpads can be identified by looking at the
-+ * values returned in the "E7 report" and/or the "EC report." This table
-+ * lists a number of such touchpads.
-+ */
- struct alps_model_info {
-- unsigned char signature[3];
-- unsigned char command_mode_resp; /* v3/v4 only */
-+ unsigned char signature[3];
-+ unsigned char command_mode_resp;
- unsigned char proto_version;
-- unsigned char byte0, mask0;
-- unsigned char flags;
-+ unsigned char byte0, mask0;
-+ unsigned char flags;
- };
-
-+/**
-+ * struct alps_nibble_commands - encodings for register accesses
-+ * @command: PS/2 command used for the nibble
-+ * @data: Data supplied as an argument to the PS/2 command, if applicable
-+ *
-+ * The ALPS protocol uses magic sequences to transmit binary data to the
-+ * touchpad, as it is generally not OK to send arbitrary bytes out the
-+ * PS/2 port. Each of the sequences in this table sends one nibble of the
-+ * register address or (write) data. Different versions of the ALPS protocol
-+ * use slightly different encodings.
-+ */
- struct alps_nibble_commands {
- int command;
- unsigned char data;
- };
-
-+/**
-+ * struct alps_data - private data structure for the ALPS driver
-+ * @dev2: "Relative" device used to report trackstick or mouse activity.
-+ * @phys: Physical path for the relative device.
-+ * @i: Information on the detected touchpad model.
-+ * @nibble_commands: Command mapping used for touchpad register accesses.
-+ * @addr_command: Command used to tell the touchpad that a register address
-+ * follows.
-+ * @prev_fin: Finger bit from previous packet.
-+ * @multi_packet: Multi-packet data in progress.
-+ * @multi_data: Saved multi-packet data.
-+ * @x1: First X coordinate from last MT report.
-+ * @x2: Second X coordinate from last MT report.
-+ * @y1: First Y coordinate from last MT report.
-+ * @y2: Second Y coordinate from last MT report.
-+ * @fingers: Number of fingers from last MT report.
-+ * @quirks: Bitmap of ALPS_QUIRK_*.
-+ * @timer: Timer for flushing out the final report packet in the stream.
-+ */
- struct alps_data {
-- struct input_dev *dev2; /* Relative device */
-- char phys[32]; /* Phys */
-- const struct alps_model_info *i;/* Info */
-+ struct input_dev *dev2;
-+ char phys[32];
-+ const struct alps_model_info *i;
- const struct alps_nibble_commands *nibble_commands;
-- int addr_command; /* Command to set register address */
-- int prev_fin; /* Finger bit from previous packet */
-- int multi_packet; /* Multi-packet data in progress */
-- unsigned char multi_data[6]; /* Saved multi-packet data */
-- int x1, x2, y1, y2; /* Coordinates from last MT report */
-- int fingers; /* Number of fingers from MT report */
-+ int addr_command;
-+ int prev_fin;
-+ int multi_packet;
-+ unsigned char multi_data[6];
-+ int x1, x2, y1, y2;
-+ int fingers;
- u8 quirks;
- struct timer_list timer;
- };
---
-1.8.1.2
-
-
-From 196069863604cb55061a02ad5f046c5e4054ba54 Mon Sep 17 00:00:00 2001
-From: Kevin Cernekee <cernekee@gmail.com>
-Date: Wed, 13 Feb 2013 20:56:33 -0800
-Subject: [PATCH 02/15] Input: ALPS - copy "model" info into alps_data struct
-
-Not every type of ALPS touchpad is well-suited to table-based detection.
-Start moving the various alps_model_data attributes into the alps_data
-struct so that we don't need a unique table entry for every possible
-permutation of protocol version, flags, byte0/mask0, etc.
-
-Signed-off-by: Kevin Cernekee <cernekee@gmail.com>
-Tested-by: Dave Turvene <dturvene@dahetral.com>
-Signed-off-by: Dmitry Torokhov <dmitry.torokhov@gmail.com>
----
- drivers/input/mouse/alps.c | 63 +++++++++++++++++++++++-----------------------
- drivers/input/mouse/alps.h | 14 +++++++++--
- 2 files changed, 43 insertions(+), 34 deletions(-)
-
-diff --git a/drivers/input/mouse/alps.c b/drivers/input/mouse/alps.c
-index e229fa3..33ee6e0 100644
---- a/drivers/input/mouse/alps.c
-+++ b/drivers/input/mouse/alps.c
-@@ -122,10 +122,10 @@ static const struct alps_model_info alps_model_data[] = {
-
- /* Packet formats are described in Documentation/input/alps.txt */
-
--static bool alps_is_valid_first_byte(const struct alps_model_info *model,
-+static bool alps_is_valid_first_byte(struct alps_data *priv,
- unsigned char data)
- {
-- return (data & model->mask0) == model->byte0;
-+ return (data & priv->mask0) == priv->byte0;
- }
-
- static void alps_report_buttons(struct psmouse *psmouse,
-@@ -158,14 +158,13 @@ static void alps_report_buttons(struct psmouse *psmouse,
- static void alps_process_packet_v1_v2(struct psmouse *psmouse)
- {
- struct alps_data *priv = psmouse->private;
-- const struct alps_model_info *model = priv->i;
- unsigned char *packet = psmouse->packet;
- struct input_dev *dev = psmouse->dev;
- struct input_dev *dev2 = priv->dev2;
- int x, y, z, ges, fin, left, right, middle;
- int back = 0, forward = 0;
-
-- if (model->proto_version == ALPS_PROTO_V1) {
-+ if (priv->proto_version == ALPS_PROTO_V1) {
- left = packet[2] & 0x10;
- right = packet[2] & 0x08;
- middle = 0;
-@@ -181,12 +180,12 @@ static void alps_process_packet_v1_v2(struct psmouse *psmouse)
- z = packet[5];
- }
-
-- if (model->flags & ALPS_FW_BK_1) {
-+ if (priv->flags & ALPS_FW_BK_1) {
- back = packet[0] & 0x10;
- forward = packet[2] & 4;
- }
-
-- if (model->flags & ALPS_FW_BK_2) {
-+ if (priv->flags & ALPS_FW_BK_2) {
- back = packet[3] & 4;
- forward = packet[2] & 4;
- if ((middle = forward && back))
-@@ -196,7 +195,7 @@ static void alps_process_packet_v1_v2(struct psmouse *psmouse)
- ges = packet[2] & 1;
- fin = packet[2] & 2;
-
-- if ((model->flags & ALPS_DUALPOINT) && z == 127) {
-+ if ((priv->flags & ALPS_DUALPOINT) && z == 127) {
- input_report_rel(dev2, REL_X, (x > 383 ? (x - 768) : x));
- input_report_rel(dev2, REL_Y, -(y > 255 ? (y - 512) : y));
-
-@@ -239,15 +238,15 @@ static void alps_process_packet_v1_v2(struct psmouse *psmouse)
- input_report_abs(dev, ABS_PRESSURE, z);
- input_report_key(dev, BTN_TOOL_FINGER, z > 0);
-
-- if (model->flags & ALPS_WHEEL)
-+ if (priv->flags & ALPS_WHEEL)
- input_report_rel(dev, REL_WHEEL, ((packet[2] << 1) & 0x08) - ((packet[0] >> 4) & 0x07));
-
-- if (model->flags & (ALPS_FW_BK_1 | ALPS_FW_BK_2)) {
-+ if (priv->flags & (ALPS_FW_BK_1 | ALPS_FW_BK_2)) {
- input_report_key(dev, BTN_FORWARD, forward);
- input_report_key(dev, BTN_BACK, back);
- }
-
-- if (model->flags & ALPS_FOUR_BUTTONS) {
-+ if (priv->flags & ALPS_FOUR_BUTTONS) {
- input_report_key(dev, BTN_0, packet[2] & 4);
- input_report_key(dev, BTN_1, packet[0] & 0x10);
- input_report_key(dev, BTN_2, packet[3] & 4);
-@@ -699,9 +698,8 @@ static void alps_process_packet_v4(struct psmouse *psmouse)
- static void alps_process_packet(struct psmouse *psmouse)
- {
- struct alps_data *priv = psmouse->private;
-- const struct alps_model_info *model = priv->i;
-
-- switch (model->proto_version) {
-+ switch (priv->proto_version) {
- case ALPS_PROTO_V1:
- case ALPS_PROTO_V2:
- alps_process_packet_v1_v2(psmouse);
-@@ -765,7 +763,7 @@ static psmouse_ret_t alps_handle_interleaved_ps2(struct psmouse *psmouse)
- if (((psmouse->packet[3] |
- psmouse->packet[4] |
- psmouse->packet[5]) & 0x80) ||
-- (!alps_is_valid_first_byte(priv->i, psmouse->packet[6]))) {
-+ (!alps_is_valid_first_byte(priv, psmouse->packet[6]))) {
- psmouse_dbg(psmouse,
- "refusing packet %4ph (suspected interleaved ps/2)\n",
- psmouse->packet + 3);
-@@ -844,7 +842,6 @@ static void alps_flush_packet(unsigned long data)
- static psmouse_ret_t alps_process_byte(struct psmouse *psmouse)
- {
- struct alps_data *priv = psmouse->private;
-- const struct alps_model_info *model = priv->i;
-
- if ((psmouse->packet[0] & 0xc8) == 0x08) { /* PS/2 packet */
- if (psmouse->pktcnt == 3) {
-@@ -857,15 +854,15 @@ static psmouse_ret_t alps_process_byte(struct psmouse *psmouse)
-
- /* Check for PS/2 packet stuffed in the middle of ALPS packet. */
-
-- if ((model->flags & ALPS_PS2_INTERLEAVED) &&
-+ if ((priv->flags & ALPS_PS2_INTERLEAVED) &&
- psmouse->pktcnt >= 4 && (psmouse->packet[3] & 0x0f) == 0x0f) {
- return alps_handle_interleaved_ps2(psmouse);
- }
-
-- if (!alps_is_valid_first_byte(model, psmouse->packet[0])) {
-+ if (!alps_is_valid_first_byte(priv, psmouse->packet[0])) {
- psmouse_dbg(psmouse,
- "refusing packet[0] = %x (mask0 = %x, byte0 = %x)\n",
-- psmouse->packet[0], model->mask0, model->byte0);
-+ psmouse->packet[0], priv->mask0, priv->byte0);
- return PSMOUSE_BAD_DATA;
- }
-
-@@ -1190,16 +1187,16 @@ static int alps_poll(struct psmouse *psmouse)
- unsigned char buf[sizeof(psmouse->packet)];
- bool poll_failed;
-
-- if (priv->i->flags & ALPS_PASS)
-+ if (priv->flags & ALPS_PASS)
- alps_passthrough_mode_v2(psmouse, true);
-
- poll_failed = ps2_command(&psmouse->ps2dev, buf,
- PSMOUSE_CMD_POLL | (psmouse->pktsize << 8)) < 0;
-
-- if (priv->i->flags & ALPS_PASS)
-+ if (priv->flags & ALPS_PASS)
- alps_passthrough_mode_v2(psmouse, false);
-
-- if (poll_failed || (buf[0] & priv->i->mask0) != priv->i->byte0)
-+ if (poll_failed || (buf[0] & priv->mask0) != priv->byte0)
- return -1;
-
- if ((psmouse->badbyte & 0xc8) == 0x08) {
-@@ -1217,9 +1214,8 @@ static int alps_poll(struct psmouse *psmouse)
- static int alps_hw_init_v1_v2(struct psmouse *psmouse)
- {
- struct alps_data *priv = psmouse->private;
-- const struct alps_model_info *model = priv->i;
-
-- if ((model->flags & ALPS_PASS) &&
-+ if ((priv->flags & ALPS_PASS) &&
- alps_passthrough_mode_v2(psmouse, true)) {
- return -1;
- }
-@@ -1234,7 +1230,7 @@ static int alps_hw_init_v1_v2(struct psmouse *psmouse)
- return -1;
- }
-
-- if ((model->flags & ALPS_PASS) &&
-+ if ((priv->flags & ALPS_PASS) &&
- alps_passthrough_mode_v2(psmouse, false)) {
- return -1;
- }
-@@ -1520,10 +1516,9 @@ error:
- static int alps_hw_init(struct psmouse *psmouse)
- {
- struct alps_data *priv = psmouse->private;
-- const struct alps_model_info *model = priv->i;
- int ret = -1;
-
-- switch (model->proto_version) {
-+ switch (priv->proto_version) {
- case ALPS_PROTO_V1:
- case ALPS_PROTO_V2:
- ret = alps_hw_init_v1_v2(psmouse);
-@@ -1585,7 +1580,10 @@ int alps_init(struct psmouse *psmouse)
- if (!model)
- goto init_fail;
-
-- priv->i = model;
-+ priv->proto_version = model->proto_version;
-+ priv->byte0 = model->byte0;
-+ priv->mask0 = model->mask0;
-+ priv->flags = model->flags;
-
- if (alps_hw_init(psmouse))
- goto init_fail;
-@@ -1609,7 +1607,7 @@ int alps_init(struct psmouse *psmouse)
-
- dev1->evbit[BIT_WORD(EV_ABS)] |= BIT_MASK(EV_ABS);
-
-- switch (model->proto_version) {
-+ switch (priv->proto_version) {
- case ALPS_PROTO_V1:
- case ALPS_PROTO_V2:
- input_set_abs_params(dev1, ABS_X, 0, 1023, 0, 0);
-@@ -1633,17 +1631,17 @@ int alps_init(struct psmouse *psmouse)
-
- input_set_abs_params(dev1, ABS_PRESSURE, 0, 127, 0, 0);
-
-- if (model->flags & ALPS_WHEEL) {
-+ if (priv->flags & ALPS_WHEEL) {
- dev1->evbit[BIT_WORD(EV_REL)] |= BIT_MASK(EV_REL);
- dev1->relbit[BIT_WORD(REL_WHEEL)] |= BIT_MASK(REL_WHEEL);
- }
-
-- if (model->flags & (ALPS_FW_BK_1 | ALPS_FW_BK_2)) {
-+ if (priv->flags & (ALPS_FW_BK_1 | ALPS_FW_BK_2)) {
- dev1->keybit[BIT_WORD(BTN_FORWARD)] |= BIT_MASK(BTN_FORWARD);
- dev1->keybit[BIT_WORD(BTN_BACK)] |= BIT_MASK(BTN_BACK);
- }
-
-- if (model->flags & ALPS_FOUR_BUTTONS) {
-+ if (priv->flags & ALPS_FOUR_BUTTONS) {
- dev1->keybit[BIT_WORD(BTN_0)] |= BIT_MASK(BTN_0);
- dev1->keybit[BIT_WORD(BTN_1)] |= BIT_MASK(BTN_1);
- dev1->keybit[BIT_WORD(BTN_2)] |= BIT_MASK(BTN_2);
-@@ -1654,7 +1652,8 @@ int alps_init(struct psmouse *psmouse)
-
- snprintf(priv->phys, sizeof(priv->phys), "%s/input1", psmouse->ps2dev.serio->phys);
- dev2->phys = priv->phys;
-- dev2->name = (model->flags & ALPS_DUALPOINT) ? "DualPoint Stick" : "PS/2 Mouse";
-+ dev2->name = (priv->flags & ALPS_DUALPOINT) ?
-+ "DualPoint Stick" : "PS/2 Mouse";
- dev2->id.bustype = BUS_I8042;
- dev2->id.vendor = 0x0002;
- dev2->id.product = PSMOUSE_ALPS;
-@@ -1673,7 +1672,7 @@ int alps_init(struct psmouse *psmouse)
- psmouse->poll = alps_poll;
- psmouse->disconnect = alps_disconnect;
- psmouse->reconnect = alps_reconnect;
-- psmouse->pktsize = model->proto_version == ALPS_PROTO_V4 ? 8 : 6;
-+ psmouse->pktsize = priv->proto_version == ALPS_PROTO_V4 ? 8 : 6;
-
- /* We are having trouble resyncing ALPS touchpads so disable it for now */
- psmouse->resync_time = 0;
-diff --git a/drivers/input/mouse/alps.h b/drivers/input/mouse/alps.h
-index 67be4e5..efd0eea 100644
---- a/drivers/input/mouse/alps.h
-+++ b/drivers/input/mouse/alps.h
-@@ -63,10 +63,15 @@ struct alps_nibble_commands {
- * struct alps_data - private data structure for the ALPS driver
- * @dev2: "Relative" device used to report trackstick or mouse activity.
- * @phys: Physical path for the relative device.
-- * @i: Information on the detected touchpad model.
- * @nibble_commands: Command mapping used for touchpad register accesses.
- * @addr_command: Command used to tell the touchpad that a register address
- * follows.
-+ * @proto_version: Indicates V1/V2/V3/...
-+ * @byte0: Helps figure out whether a position report packet matches the
-+ * known format for this model. The first byte of the report, ANDed with
-+ * mask0, should match byte0.
-+ * @mask0: The mask used to check the first byte of the report.
-+ * @flags: Additional device capabilities (passthrough port, trackstick, etc.).
- * @prev_fin: Finger bit from previous packet.
- * @multi_packet: Multi-packet data in progress.
- * @multi_data: Saved multi-packet data.
-@@ -81,9 +86,14 @@ struct alps_nibble_commands {
- struct alps_data {
- struct input_dev *dev2;
- char phys[32];
-- const struct alps_model_info *i;
-+
-+ /* these are autodetected when the device is identified */
- const struct alps_nibble_commands *nibble_commands;
- int addr_command;
-+ unsigned char proto_version;
-+ unsigned char byte0, mask0;
-+ unsigned char flags;
-+
- int prev_fin;
- int multi_packet;
- unsigned char multi_data[6];
---
-1.8.1.2
-
-
-From b856c913996a38ced60bdf41aeae4da00882bf1f Mon Sep 17 00:00:00 2001
-From: Kevin Cernekee <cernekee@gmail.com>
-Date: Wed, 13 Feb 2013 20:57:04 -0800
-Subject: [PATCH 03/15] Input: ALPS - move alps_get_model() down below hw_init
- code
-
-This will minimize the number of forward declarations needed when
-alps_get_model() starts assigning function pointers.
-
-Signed-off-by: Kevin Cernekee <cernekee@gmail.com>
-Tested-by: Dave Turvene <dturvene@dahetral.com>
-Signed-off-by: Dmitry Torokhov <dmitry.torokhov@gmail.com>
----
- drivers/input/mouse/alps.c | 186 ++++++++++++++++++++++-----------------------
- 1 file changed, 93 insertions(+), 93 deletions(-)
-
-diff --git a/drivers/input/mouse/alps.c b/drivers/input/mouse/alps.c
-index 33ee6e0..c473549 100644
---- a/drivers/input/mouse/alps.c
-+++ b/drivers/input/mouse/alps.c
-@@ -998,99 +998,6 @@ static inline int alps_exit_command_mode(struct psmouse *psmouse)
- return 0;
- }
-
--static const struct alps_model_info *alps_get_model(struct psmouse *psmouse, int *version)
--{
-- struct ps2dev *ps2dev = &psmouse->ps2dev;
-- static const unsigned char rates[] = { 0, 10, 20, 40, 60, 80, 100, 200 };
-- unsigned char param[4];
-- const struct alps_model_info *model = NULL;
-- int i;
--
-- /*
-- * First try "E6 report".
-- * ALPS should return 0,0,10 or 0,0,100 if no buttons are pressed.
-- * The bits 0-2 of the first byte will be 1s if some buttons are
-- * pressed.
-- */
-- param[0] = 0;
-- if (ps2_command(ps2dev, param, PSMOUSE_CMD_SETRES) ||
-- ps2_command(ps2dev, NULL, PSMOUSE_CMD_SETSCALE11) ||
-- ps2_command(ps2dev, NULL, PSMOUSE_CMD_SETSCALE11) ||
-- ps2_command(ps2dev, NULL, PSMOUSE_CMD_SETSCALE11))
-- return NULL;
--
-- param[0] = param[1] = param[2] = 0xff;
-- if (ps2_command(ps2dev, param, PSMOUSE_CMD_GETINFO))
-- return NULL;
--
-- psmouse_dbg(psmouse, "E6 report: %2.2x %2.2x %2.2x",
-- param[0], param[1], param[2]);
--
-- if ((param[0] & 0xf8) != 0 || param[1] != 0 ||
-- (param[2] != 10 && param[2] != 100))
-- return NULL;
--
-- /*
-- * Now try "E7 report". Allowed responses are in
-- * alps_model_data[].signature
-- */
-- param[0] = 0;
-- if (ps2_command(ps2dev, param, PSMOUSE_CMD_SETRES) ||
-- ps2_command(ps2dev, NULL, PSMOUSE_CMD_SETSCALE21) ||
-- ps2_command(ps2dev, NULL, PSMOUSE_CMD_SETSCALE21) ||
-- ps2_command(ps2dev, NULL, PSMOUSE_CMD_SETSCALE21))
-- return NULL;
--
-- param[0] = param[1] = param[2] = 0xff;
-- if (ps2_command(ps2dev, param, PSMOUSE_CMD_GETINFO))
-- return NULL;
--
-- psmouse_dbg(psmouse, "E7 report: %2.2x %2.2x %2.2x",
-- param[0], param[1], param[2]);
--
-- if (version) {
-- for (i = 0; i < ARRAY_SIZE(rates) && param[2] != rates[i]; i++)
-- /* empty */;
-- *version = (param[0] << 8) | (param[1] << 4) | i;
-- }
--
-- for (i = 0; i < ARRAY_SIZE(alps_model_data); i++) {
-- if (!memcmp(param, alps_model_data[i].signature,
-- sizeof(alps_model_data[i].signature))) {
-- model = alps_model_data + i;
-- break;
-- }
-- }
--
-- if (model && model->proto_version > ALPS_PROTO_V2) {
-- /*
-- * Need to check command mode response to identify
-- * model
-- */
-- model = NULL;
-- if (alps_enter_command_mode(psmouse, param)) {
-- psmouse_warn(psmouse,
-- "touchpad failed to enter command mode\n");
-- } else {
-- for (i = 0; i < ARRAY_SIZE(alps_model_data); i++) {
-- if (alps_model_data[i].proto_version > ALPS_PROTO_V2 &&
-- alps_model_data[i].command_mode_resp == param[0]) {
-- model = alps_model_data + i;
-- break;
-- }
-- }
-- alps_exit_command_mode(psmouse);
--
-- if (!model)
-- psmouse_dbg(psmouse,
-- "Unknown command mode response %2.2x\n",
-- param[0]);
-- }
-- }
--
-- return model;
--}
--
- /*
- * For DualPoint devices select the device that should respond to
- * subsequent commands. It looks like glidepad is behind stickpointer,
-@@ -1534,6 +1441,99 @@ static int alps_hw_init(struct psmouse *psmouse)
- return ret;
- }
-
-+static const struct alps_model_info *alps_get_model(struct psmouse *psmouse, int *version)
-+{
-+ struct ps2dev *ps2dev = &psmouse->ps2dev;
-+ static const unsigned char rates[] = { 0, 10, 20, 40, 60, 80, 100, 200 };
-+ unsigned char param[4];
-+ const struct alps_model_info *model = NULL;
-+ int i;
-+
-+ /*
-+ * First try "E6 report".
-+ * ALPS should return 0,0,10 or 0,0,100 if no buttons are pressed.
-+ * The bits 0-2 of the first byte will be 1s if some buttons are
-+ * pressed.
-+ */
-+ param[0] = 0;
-+ if (ps2_command(ps2dev, param, PSMOUSE_CMD_SETRES) ||
-+ ps2_command(ps2dev, NULL, PSMOUSE_CMD_SETSCALE11) ||
-+ ps2_command(ps2dev, NULL, PSMOUSE_CMD_SETSCALE11) ||
-+ ps2_command(ps2dev, NULL, PSMOUSE_CMD_SETSCALE11))
-+ return NULL;
-+
-+ param[0] = param[1] = param[2] = 0xff;
-+ if (ps2_command(ps2dev, param, PSMOUSE_CMD_GETINFO))
-+ return NULL;
-+
-+ psmouse_dbg(psmouse, "E6 report: %2.2x %2.2x %2.2x",
-+ param[0], param[1], param[2]);
-+
-+ if ((param[0] & 0xf8) != 0 || param[1] != 0 ||
-+ (param[2] != 10 && param[2] != 100))
-+ return NULL;
-+
-+ /*
-+ * Now try "E7 report". Allowed responses are in
-+ * alps_model_data[].signature
-+ */
-+ param[0] = 0;
-+ if (ps2_command(ps2dev, param, PSMOUSE_CMD_SETRES) ||
-+ ps2_command(ps2dev, NULL, PSMOUSE_CMD_SETSCALE21) ||
-+ ps2_command(ps2dev, NULL, PSMOUSE_CMD_SETSCALE21) ||
-+ ps2_command(ps2dev, NULL, PSMOUSE_CMD_SETSCALE21))
-+ return NULL;
-+
-+ param[0] = param[1] = param[2] = 0xff;
-+ if (ps2_command(ps2dev, param, PSMOUSE_CMD_GETINFO))
-+ return NULL;
-+
-+ psmouse_dbg(psmouse, "E7 report: %2.2x %2.2x %2.2x",
-+ param[0], param[1], param[2]);
-+
-+ if (version) {
-+ for (i = 0; i < ARRAY_SIZE(rates) && param[2] != rates[i]; i++)
-+ /* empty */;
-+ *version = (param[0] << 8) | (param[1] << 4) | i;
-+ }
-+
-+ for (i = 0; i < ARRAY_SIZE(alps_model_data); i++) {
-+ if (!memcmp(param, alps_model_data[i].signature,
-+ sizeof(alps_model_data[i].signature))) {
-+ model = alps_model_data + i;
-+ break;
-+ }
-+ }
-+
-+ if (model && model->proto_version > ALPS_PROTO_V2) {
-+ /*
-+ * Need to check command mode response to identify
-+ * model
-+ */
-+ model = NULL;
-+ if (alps_enter_command_mode(psmouse, param)) {
-+ psmouse_warn(psmouse,
-+ "touchpad failed to enter command mode\n");
-+ } else {
-+ for (i = 0; i < ARRAY_SIZE(alps_model_data); i++) {
-+ if (alps_model_data[i].proto_version > ALPS_PROTO_V2 &&
-+ alps_model_data[i].command_mode_resp == param[0]) {
-+ model = alps_model_data + i;
-+ break;
-+ }
-+ }
-+ alps_exit_command_mode(psmouse);
-+
-+ if (!model)
-+ psmouse_dbg(psmouse,
-+ "Unknown command mode response %2.2x\n",
-+ param[0]);
-+ }
-+ }
-+
-+ return model;
-+}
-+
- static int alps_reconnect(struct psmouse *psmouse)
- {
- const struct alps_model_info *model;
---
-1.8.1.2
-
-
-From b719d56d5743e2c338568f4edb6eab17ea9c9eec Mon Sep 17 00:00:00 2001
-From: Kevin Cernekee <cernekee@gmail.com>
-Date: Wed, 13 Feb 2013 22:19:01 -0800
-Subject: [PATCH 04/15] Input: ALPS - introduce helper function for repeated
- commands
-
-Several ALPS driver init sequences repeat a command three times, then
-issue PSMOUSE_CMD_GETINFO to read the result. Move this into a helper
-function to simplify the code.
-
-Signed-off-by: Kevin Cernekee <cernekee@gmail.com>
-Tested-by: Dave Turvene <dturvene@dahetral.com>
-Signed-off-by: Dmitry Torokhov <dmitry.torokhov@gmail.com>
----
- drivers/input/mouse/alps.c | 71 ++++++++++++++++++++--------------------------
- 1 file changed, 30 insertions(+), 41 deletions(-)
-
-diff --git a/drivers/input/mouse/alps.c b/drivers/input/mouse/alps.c
-index c473549..1ca854b 100644
---- a/drivers/input/mouse/alps.c
-+++ b/drivers/input/mouse/alps.c
-@@ -964,24 +964,42 @@ static int alps_command_mode_write_reg(struct psmouse *psmouse, int addr,
- return __alps_command_mode_write_reg(psmouse, value);
- }
-
-+static int alps_rpt_cmd(struct psmouse *psmouse, int init_command,
-+ int repeated_command, unsigned char *param)
-+{
-+ struct ps2dev *ps2dev = &psmouse->ps2dev;
-+
-+ param[0] = 0;
-+ if (init_command && ps2_command(ps2dev, param, init_command))
-+ return -EIO;
-+
-+ if (ps2_command(ps2dev, NULL, repeated_command) ||
-+ ps2_command(ps2dev, NULL, repeated_command) ||
-+ ps2_command(ps2dev, NULL, repeated_command))
-+ return -EIO;
-+
-+ param[0] = param[1] = param[2] = 0xff;
-+ if (ps2_command(ps2dev, param, PSMOUSE_CMD_GETINFO))
-+ return -EIO;
-+
-+ psmouse_dbg(psmouse, "%2.2X report: %2.2x %2.2x %2.2x\n",
-+ repeated_command, param[0], param[1], param[2]);
-+ return 0;
-+}
-+
- static int alps_enter_command_mode(struct psmouse *psmouse,
- unsigned char *resp)
- {
- unsigned char param[4];
-- struct ps2dev *ps2dev = &psmouse->ps2dev;
-
-- if (ps2_command(ps2dev, NULL, PSMOUSE_CMD_RESET_WRAP) ||
-- ps2_command(ps2dev, NULL, PSMOUSE_CMD_RESET_WRAP) ||
-- ps2_command(ps2dev, NULL, PSMOUSE_CMD_RESET_WRAP) ||
-- ps2_command(ps2dev, param, PSMOUSE_CMD_GETINFO)) {
-+ if (alps_rpt_cmd(psmouse, 0, PSMOUSE_CMD_RESET_WRAP, param)) {
- psmouse_err(psmouse, "failed to enter command mode\n");
- return -1;
- }
-
- if (param[0] != 0x88 && param[1] != 0x07) {
- psmouse_dbg(psmouse,
-- "unknown response while entering command mode: %2.2x %2.2x %2.2x\n",
-- param[0], param[1], param[2]);
-+ "unknown response while entering command mode\n");
- return -1;
- }
-
-@@ -1041,18 +1059,10 @@ static int alps_absolute_mode_v1_v2(struct psmouse *psmouse)
-
- static int alps_get_status(struct psmouse *psmouse, char *param)
- {
-- struct ps2dev *ps2dev = &psmouse->ps2dev;
--
- /* Get status: 0xF5 0xF5 0xF5 0xE9 */
-- if (ps2_command(ps2dev, NULL, PSMOUSE_CMD_DISABLE) ||
-- ps2_command(ps2dev, NULL, PSMOUSE_CMD_DISABLE) ||
-- ps2_command(ps2dev, NULL, PSMOUSE_CMD_DISABLE) ||
-- ps2_command(ps2dev, param, PSMOUSE_CMD_GETINFO))
-+ if (alps_rpt_cmd(psmouse, 0, PSMOUSE_CMD_DISABLE, param))
- return -1;
-
-- psmouse_dbg(psmouse, "Status: %2.2x %2.2x %2.2x",
-- param[0], param[1], param[2]);
--
- return 0;
- }
-
-@@ -1443,7 +1453,6 @@ static int alps_hw_init(struct psmouse *psmouse)
-
- static const struct alps_model_info *alps_get_model(struct psmouse *psmouse, int *version)
- {
-- struct ps2dev *ps2dev = &psmouse->ps2dev;
- static const unsigned char rates[] = { 0, 10, 20, 40, 60, 80, 100, 200 };
- unsigned char param[4];
- const struct alps_model_info *model = NULL;
-@@ -1455,20 +1464,10 @@ static const struct alps_model_info *alps_get_model(struct psmouse *psmouse, int
- * The bits 0-2 of the first byte will be 1s if some buttons are
- * pressed.
- */
-- param[0] = 0;
-- if (ps2_command(ps2dev, param, PSMOUSE_CMD_SETRES) ||
-- ps2_command(ps2dev, NULL, PSMOUSE_CMD_SETSCALE11) ||
-- ps2_command(ps2dev, NULL, PSMOUSE_CMD_SETSCALE11) ||
-- ps2_command(ps2dev, NULL, PSMOUSE_CMD_SETSCALE11))
-- return NULL;
--
-- param[0] = param[1] = param[2] = 0xff;
-- if (ps2_command(ps2dev, param, PSMOUSE_CMD_GETINFO))
-+ if (alps_rpt_cmd(psmouse, PSMOUSE_CMD_SETRES, PSMOUSE_CMD_SETSCALE11,
-+ param))
- return NULL;
-
-- psmouse_dbg(psmouse, "E6 report: %2.2x %2.2x %2.2x",
-- param[0], param[1], param[2]);
--
- if ((param[0] & 0xf8) != 0 || param[1] != 0 ||
- (param[2] != 10 && param[2] != 100))
- return NULL;
-@@ -1477,20 +1476,10 @@ static const struct alps_model_info *alps_get_model(struct psmouse *psmouse, int
- * Now try "E7 report". Allowed responses are in
- * alps_model_data[].signature
- */
-- param[0] = 0;
-- if (ps2_command(ps2dev, param, PSMOUSE_CMD_SETRES) ||
-- ps2_command(ps2dev, NULL, PSMOUSE_CMD_SETSCALE21) ||
-- ps2_command(ps2dev, NULL, PSMOUSE_CMD_SETSCALE21) ||
-- ps2_command(ps2dev, NULL, PSMOUSE_CMD_SETSCALE21))
-- return NULL;
--
-- param[0] = param[1] = param[2] = 0xff;
-- if (ps2_command(ps2dev, param, PSMOUSE_CMD_GETINFO))
-+ if (alps_rpt_cmd(psmouse, PSMOUSE_CMD_SETRES, PSMOUSE_CMD_SETSCALE21,
-+ param))
- return NULL;
-
-- psmouse_dbg(psmouse, "E7 report: %2.2x %2.2x %2.2x",
-- param[0], param[1], param[2]);
--
- if (version) {
- for (i = 0; i < ARRAY_SIZE(rates) && param[2] != rates[i]; i++)
- /* empty */;
---
-1.8.1.2
-
-
-From c7fd5d0e90f577072ece70651aeecb37f62f5fdb Mon Sep 17 00:00:00 2001
-From: Kevin Cernekee <cernekee@gmail.com>
-Date: Wed, 13 Feb 2013 22:19:59 -0800
-Subject: [PATCH 05/15] Input: ALPS - rework detection sequence
-
-If the E6 report test passes, get the E7 and EC reports right away and
-then try to match an entry in the table.
-
-Pass in the alps_data struct, so that the detection code will be able to
-set operating parameters based on information found during detection.
-
-Change the version (psmouse->model) to report the protocol version only,
-in preparation for supporting models that do not show up in the ID table.
-
-Signed-off-by: Kevin Cernekee <cernekee@gmail.com>
-Tested-by: Dave Turvene <dturvene@dahetral.com>
-Signed-off-by: Dmitry Torokhov <dmitry.torokhov@gmail.com>
----
- drivers/input/mouse/alps.c | 124 +++++++++++++++++++--------------------------
- drivers/input/mouse/alps.h | 8 +--
- 2 files changed, 56 insertions(+), 76 deletions(-)
-
-diff --git a/drivers/input/mouse/alps.c b/drivers/input/mouse/alps.c
-index 1ca854b..e6a27a5 100644
---- a/drivers/input/mouse/alps.c
-+++ b/drivers/input/mouse/alps.c
-@@ -1451,86 +1451,76 @@ static int alps_hw_init(struct psmouse *psmouse)
- return ret;
- }
-
--static const struct alps_model_info *alps_get_model(struct psmouse *psmouse, int *version)
-+static int alps_match_table(struct psmouse *psmouse, struct alps_data *priv,
-+ unsigned char *e7, unsigned char *ec)
- {
-- static const unsigned char rates[] = { 0, 10, 20, 40, 60, 80, 100, 200 };
-- unsigned char param[4];
-- const struct alps_model_info *model = NULL;
-+ const struct alps_model_info *model;
- int i;
-
-+ for (i = 0; i < ARRAY_SIZE(alps_model_data); i++) {
-+ model = &alps_model_data[i];
-+
-+ if (!memcmp(e7, model->signature, sizeof(model->signature)) &&
-+ (!model->command_mode_resp ||
-+ model->command_mode_resp == ec[2])) {
-+
-+ priv->proto_version = model->proto_version;
-+ priv->flags = model->flags;
-+ priv->byte0 = model->byte0;
-+ priv->mask0 = model->mask0;
-+
-+ return 0;
-+ }
-+ }
-+
-+ return -EINVAL;
-+}
-+
-+static int alps_identify(struct psmouse *psmouse, struct alps_data *priv)
-+{
-+ unsigned char e6[4], e7[4], ec[4];
-+
- /*
- * First try "E6 report".
- * ALPS should return 0,0,10 or 0,0,100 if no buttons are pressed.
- * The bits 0-2 of the first byte will be 1s if some buttons are
- * pressed.
- */
-- if (alps_rpt_cmd(psmouse, PSMOUSE_CMD_SETRES, PSMOUSE_CMD_SETSCALE11,
-- param))
-- return NULL;
-+ if (alps_rpt_cmd(psmouse, PSMOUSE_CMD_SETRES,
-+ PSMOUSE_CMD_SETSCALE11, e6))
-+ return -EIO;
-
-- if ((param[0] & 0xf8) != 0 || param[1] != 0 ||
-- (param[2] != 10 && param[2] != 100))
-- return NULL;
-+ if ((e6[0] & 0xf8) != 0 || e6[1] != 0 || (e6[2] != 10 && e6[2] != 100))
-+ return -EINVAL;
-
- /*
-- * Now try "E7 report". Allowed responses are in
-- * alps_model_data[].signature
-+ * Now get the "E7" and "EC" reports. These will uniquely identify
-+ * most ALPS touchpads.
- */
-- if (alps_rpt_cmd(psmouse, PSMOUSE_CMD_SETRES, PSMOUSE_CMD_SETSCALE21,
-- param))
-- return NULL;
--
-- if (version) {
-- for (i = 0; i < ARRAY_SIZE(rates) && param[2] != rates[i]; i++)
-- /* empty */;
-- *version = (param[0] << 8) | (param[1] << 4) | i;
-- }
--
-- for (i = 0; i < ARRAY_SIZE(alps_model_data); i++) {
-- if (!memcmp(param, alps_model_data[i].signature,
-- sizeof(alps_model_data[i].signature))) {
-- model = alps_model_data + i;
-- break;
-- }
-- }
-+ if (alps_rpt_cmd(psmouse, PSMOUSE_CMD_SETRES,
-+ PSMOUSE_CMD_SETSCALE21, e7) ||
-+ alps_rpt_cmd(psmouse, PSMOUSE_CMD_SETRES,
-+ PSMOUSE_CMD_RESET_WRAP, ec) ||
-+ alps_exit_command_mode(psmouse))
-+ return -EIO;
-
-- if (model && model->proto_version > ALPS_PROTO_V2) {
-- /*
-- * Need to check command mode response to identify
-- * model
-- */
-- model = NULL;
-- if (alps_enter_command_mode(psmouse, param)) {
-- psmouse_warn(psmouse,
-- "touchpad failed to enter command mode\n");
-- } else {
-- for (i = 0; i < ARRAY_SIZE(alps_model_data); i++) {
-- if (alps_model_data[i].proto_version > ALPS_PROTO_V2 &&
-- alps_model_data[i].command_mode_resp == param[0]) {
-- model = alps_model_data + i;
-- break;
-- }
-- }
-- alps_exit_command_mode(psmouse);
-+ if (alps_match_table(psmouse, priv, e7, ec) == 0)
-+ return 0;
-
-- if (!model)
-- psmouse_dbg(psmouse,
-- "Unknown command mode response %2.2x\n",
-- param[0]);
-- }
-- }
-+ psmouse_info(psmouse,
-+ "Unknown ALPS touchpad: E7=%2.2x %2.2x %2.2x, EC=%2.2x %2.2x %2.2x\n",
-+ e7[0], e7[1], e7[2], ec[0], ec[1], ec[2]);
-
-- return model;
-+ return -EINVAL;
- }
-
- static int alps_reconnect(struct psmouse *psmouse)
- {
-- const struct alps_model_info *model;
-+ struct alps_data *priv = psmouse->private;
-
- psmouse_reset(psmouse);
-
-- model = alps_get_model(psmouse, NULL);
-- if (!model)
-+ if (alps_identify(psmouse, priv) < 0)
- return -1;
-
- return alps_hw_init(psmouse);
-@@ -1549,9 +1539,7 @@ static void alps_disconnect(struct psmouse *psmouse)
- int alps_init(struct psmouse *psmouse)
- {
- struct alps_data *priv;
-- const struct alps_model_info *model;
- struct input_dev *dev1 = psmouse->dev, *dev2;
-- int version;
-
- priv = kzalloc(sizeof(struct alps_data), GFP_KERNEL);
- dev2 = input_allocate_device();
-@@ -1565,15 +1553,9 @@ int alps_init(struct psmouse *psmouse)
-
- psmouse_reset(psmouse);
-
-- model = alps_get_model(psmouse, &version);
-- if (!model)
-+ if (alps_identify(psmouse, priv) < 0)
- goto init_fail;
-
-- priv->proto_version = model->proto_version;
-- priv->byte0 = model->byte0;
-- priv->mask0 = model->mask0;
-- priv->flags = model->flags;
--
- if (alps_hw_init(psmouse))
- goto init_fail;
-
-@@ -1678,18 +1660,16 @@ init_fail:
-
- int alps_detect(struct psmouse *psmouse, bool set_properties)
- {
-- int version;
-- const struct alps_model_info *model;
-+ struct alps_data dummy;
-
-- model = alps_get_model(psmouse, &version);
-- if (!model)
-+ if (alps_identify(psmouse, &dummy) < 0)
- return -1;
-
- if (set_properties) {
- psmouse->vendor = "ALPS";
-- psmouse->name = model->flags & ALPS_DUALPOINT ?
-+ psmouse->name = dummy.flags & ALPS_DUALPOINT ?
- "DualPoint TouchPad" : "GlidePoint";
-- psmouse->model = version;
-+ psmouse->model = dummy.proto_version << 8;
- }
- return 0;
- }
-diff --git a/drivers/input/mouse/alps.h b/drivers/input/mouse/alps.h
-index efd0eea..a81b318 100644
---- a/drivers/input/mouse/alps.h
-+++ b/drivers/input/mouse/alps.h
-@@ -12,10 +12,10 @@
- #ifndef _ALPS_H
- #define _ALPS_H
-
--#define ALPS_PROTO_V1 0
--#define ALPS_PROTO_V2 1
--#define ALPS_PROTO_V3 2
--#define ALPS_PROTO_V4 3
-+#define ALPS_PROTO_V1 1
-+#define ALPS_PROTO_V2 2
-+#define ALPS_PROTO_V3 3
-+#define ALPS_PROTO_V4 4
-
- /**
- * struct alps_model_info - touchpad ID table
---
-1.8.1.2
-
-
-From c7fb8a63ba1257e2ee829425ef7197c7cbe893a1 Mon Sep 17 00:00:00 2001
-From: Kevin Cernekee <cernekee@gmail.com>
-Date: Wed, 13 Feb 2013 22:22:08 -0800
-Subject: [PATCH 06/15] Input: ALPS - use function pointers for different
- protocol handlers
-
-In anticipation of adding more ALPS protocols and more per-device quirks,
-use function pointers instead of switch statements to call functions that
-differ from one device to the next.
-
-Signed-off-by: Kevin Cernekee <cernekee@gmail.com>
-Tested-by: Dave Turvene <dturvene@dahetral.com>
-Signed-off-by: Dmitry Torokhov <dmitry.torokhov@gmail.com>
----
- drivers/input/mouse/alps.c | 101 +++++++++++++++++++++------------------------
- drivers/input/mouse/alps.h | 7 ++++
- 2 files changed, 54 insertions(+), 54 deletions(-)
-
-diff --git a/drivers/input/mouse/alps.c b/drivers/input/mouse/alps.c
-index e6a27a5..fe45687 100644
---- a/drivers/input/mouse/alps.c
-+++ b/drivers/input/mouse/alps.c
-@@ -114,6 +114,11 @@ static const struct alps_model_info alps_model_data[] = {
- { { 0x73, 0x02, 0x64 }, 0x8a, ALPS_PROTO_V4, 0x8f, 0x8f, 0 },
- };
-
-+static void alps_set_abs_params_st(struct alps_data *priv,
-+ struct input_dev *dev1);
-+static void alps_set_abs_params_mt(struct alps_data *priv,
-+ struct input_dev *dev1);
-+
- /*
- * XXX - this entry is suspicious. First byte has zero lower nibble,
- * which is what a normal mouse would report. Also, the value 0x0e
-@@ -695,24 +700,6 @@ static void alps_process_packet_v4(struct psmouse *psmouse)
- input_sync(dev);
- }
-
--static void alps_process_packet(struct psmouse *psmouse)
--{
-- struct alps_data *priv = psmouse->private;
--
-- switch (priv->proto_version) {
-- case ALPS_PROTO_V1:
-- case ALPS_PROTO_V2:
-- alps_process_packet_v1_v2(psmouse);
-- break;
-- case ALPS_PROTO_V3:
-- alps_process_packet_v3(psmouse);
-- break;
-- case ALPS_PROTO_V4:
-- alps_process_packet_v4(psmouse);
-- break;
-- }
--}
--
- static void alps_report_bare_ps2_packet(struct psmouse *psmouse,
- unsigned char packet[],
- bool report_buttons)
-@@ -770,7 +757,7 @@ static psmouse_ret_t alps_handle_interleaved_ps2(struct psmouse *psmouse)
- return PSMOUSE_BAD_DATA;
- }
-
-- alps_process_packet(psmouse);
-+ priv->process_packet(psmouse);
-
- /* Continue with the next packet */
- psmouse->packet[0] = psmouse->packet[6];
-@@ -814,6 +801,7 @@ static psmouse_ret_t alps_handle_interleaved_ps2(struct psmouse *psmouse)
- static void alps_flush_packet(unsigned long data)
- {
- struct psmouse *psmouse = (struct psmouse *)data;
-+ struct alps_data *priv = psmouse->private;
-
- serio_pause_rx(psmouse->ps2dev.serio);
-
-@@ -831,7 +819,7 @@ static void alps_flush_packet(unsigned long data)
- "refusing packet %3ph (suspected interleaved ps/2)\n",
- psmouse->packet + 3);
- } else {
-- alps_process_packet(psmouse);
-+ priv->process_packet(psmouse);
- }
- psmouse->pktcnt = 0;
- }
-@@ -876,7 +864,7 @@ static psmouse_ret_t alps_process_byte(struct psmouse *psmouse)
- }
-
- if (psmouse->pktcnt == psmouse->pktsize) {
-- alps_process_packet(psmouse);
-+ priv->process_packet(psmouse);
- return PSMOUSE_FULL_PACKET;
- }
-
-@@ -1430,25 +1418,26 @@ error:
- return -1;
- }
-
--static int alps_hw_init(struct psmouse *psmouse)
-+static void alps_set_defaults(struct alps_data *priv)
- {
-- struct alps_data *priv = psmouse->private;
-- int ret = -1;
--
- switch (priv->proto_version) {
- case ALPS_PROTO_V1:
- case ALPS_PROTO_V2:
-- ret = alps_hw_init_v1_v2(psmouse);
-+ priv->hw_init = alps_hw_init_v1_v2;
-+ priv->process_packet = alps_process_packet_v1_v2;
-+ priv->set_abs_params = alps_set_abs_params_st;
- break;
- case ALPS_PROTO_V3:
-- ret = alps_hw_init_v3(psmouse);
-+ priv->hw_init = alps_hw_init_v3;
-+ priv->process_packet = alps_process_packet_v3;
-+ priv->set_abs_params = alps_set_abs_params_mt;
- break;
- case ALPS_PROTO_V4:
-- ret = alps_hw_init_v4(psmouse);
-+ priv->hw_init = alps_hw_init_v4;
-+ priv->process_packet = alps_process_packet_v4;
-+ priv->set_abs_params = alps_set_abs_params_mt;
- break;
- }
--
-- return ret;
- }
-
- static int alps_match_table(struct psmouse *psmouse, struct alps_data *priv,
-@@ -1465,6 +1454,8 @@ static int alps_match_table(struct psmouse *psmouse, struct alps_data *priv,
- model->command_mode_resp == ec[2])) {
-
- priv->proto_version = model->proto_version;
-+ alps_set_defaults(priv);
-+
- priv->flags = model->flags;
- priv->byte0 = model->byte0;
- priv->mask0 = model->mask0;
-@@ -1523,7 +1514,7 @@ static int alps_reconnect(struct psmouse *psmouse)
- if (alps_identify(psmouse, priv) < 0)
- return -1;
-
-- return alps_hw_init(psmouse);
-+ return priv->hw_init(psmouse);
- }
-
- static void alps_disconnect(struct psmouse *psmouse)
-@@ -1536,6 +1527,29 @@ static void alps_disconnect(struct psmouse *psmouse)
- kfree(priv);
- }
-
-+static void alps_set_abs_params_st(struct alps_data *priv,
-+ struct input_dev *dev1)
-+{
-+ input_set_abs_params(dev1, ABS_X, 0, 1023, 0, 0);
-+ input_set_abs_params(dev1, ABS_Y, 0, 767, 0, 0);
-+}
-+
-+static void alps_set_abs_params_mt(struct alps_data *priv,
-+ struct input_dev *dev1)
-+{
-+ set_bit(INPUT_PROP_SEMI_MT, dev1->propbit);
-+ input_mt_init_slots(dev1, 2, 0);
-+ input_set_abs_params(dev1, ABS_MT_POSITION_X, 0, ALPS_V3_X_MAX, 0, 0);
-+ input_set_abs_params(dev1, ABS_MT_POSITION_Y, 0, ALPS_V3_Y_MAX, 0, 0);
-+
-+ set_bit(BTN_TOOL_DOUBLETAP, dev1->keybit);
-+ set_bit(BTN_TOOL_TRIPLETAP, dev1->keybit);
-+ set_bit(BTN_TOOL_QUADTAP, dev1->keybit);
-+
-+ input_set_abs_params(dev1, ABS_X, 0, ALPS_V3_X_MAX, 0, 0);
-+ input_set_abs_params(dev1, ABS_Y, 0, ALPS_V3_Y_MAX, 0, 0);
-+}
-+
- int alps_init(struct psmouse *psmouse)
- {
- struct alps_data *priv;
-@@ -1556,7 +1570,7 @@ int alps_init(struct psmouse *psmouse)
- if (alps_identify(psmouse, priv) < 0)
- goto init_fail;
-
-- if (alps_hw_init(psmouse))
-+ if (priv->hw_init(psmouse))
- goto init_fail;
-
- /*
-@@ -1578,28 +1592,7 @@ int alps_init(struct psmouse *psmouse)
-
- dev1->evbit[BIT_WORD(EV_ABS)] |= BIT_MASK(EV_ABS);
-
-- switch (priv->proto_version) {
-- case ALPS_PROTO_V1:
-- case ALPS_PROTO_V2:
-- input_set_abs_params(dev1, ABS_X, 0, 1023, 0, 0);
-- input_set_abs_params(dev1, ABS_Y, 0, 767, 0, 0);
-- break;
-- case ALPS_PROTO_V3:
-- case ALPS_PROTO_V4:
-- set_bit(INPUT_PROP_SEMI_MT, dev1->propbit);
-- input_mt_init_slots(dev1, 2, 0);
-- input_set_abs_params(dev1, ABS_MT_POSITION_X, 0, ALPS_V3_X_MAX, 0, 0);
-- input_set_abs_params(dev1, ABS_MT_POSITION_Y, 0, ALPS_V3_Y_MAX, 0, 0);
--
-- set_bit(BTN_TOOL_DOUBLETAP, dev1->keybit);
-- set_bit(BTN_TOOL_TRIPLETAP, dev1->keybit);
-- set_bit(BTN_TOOL_QUADTAP, dev1->keybit);
--
-- input_set_abs_params(dev1, ABS_X, 0, ALPS_V3_X_MAX, 0, 0);
-- input_set_abs_params(dev1, ABS_Y, 0, ALPS_V3_Y_MAX, 0, 0);
-- break;
-- }
--
-+ priv->set_abs_params(priv, dev1);
- input_set_abs_params(dev1, ABS_PRESSURE, 0, 127, 0, 0);
-
- if (priv->flags & ALPS_WHEEL) {
-diff --git a/drivers/input/mouse/alps.h b/drivers/input/mouse/alps.h
-index a81b318..0934f8b 100644
---- a/drivers/input/mouse/alps.h
-+++ b/drivers/input/mouse/alps.h
-@@ -72,6 +72,9 @@ struct alps_nibble_commands {
- * mask0, should match byte0.
- * @mask0: The mask used to check the first byte of the report.
- * @flags: Additional device capabilities (passthrough port, trackstick, etc.).
-+ * @hw_init: Protocol-specific hardware init function.
-+ * @process_packet: Protocol-specific function to process a report packet.
-+ * @set_abs_params: Protocol-specific function to configure the input_dev.
- * @prev_fin: Finger bit from previous packet.
- * @multi_packet: Multi-packet data in progress.
- * @multi_data: Saved multi-packet data.
-@@ -94,6 +97,10 @@ struct alps_data {
- unsigned char byte0, mask0;
- unsigned char flags;
-
-+ int (*hw_init)(struct psmouse *psmouse);
-+ void (*process_packet)(struct psmouse *psmouse);
-+ void (*set_abs_params)(struct alps_data *priv, struct input_dev *dev1);
-+
- int prev_fin;
- int multi_packet;
- unsigned char multi_data[6];
---
-1.8.1.2
-
-
-From e2600c708bef8e1c8126ca9b8d4ce1f83c002688 Mon Sep 17 00:00:00 2001
-From: Kevin Cernekee <cernekee@gmail.com>
-Date: Wed, 13 Feb 2013 22:23:04 -0800
-Subject: [PATCH 07/15] Input: ALPS - move {addr,nibble}_command settings into
- alps_set_defaults()
-
-This allows alps_identify() to override these settings based on the
-device characteristics, if it is ever necessary.
-
-Signed-off-by: Kevin Cernekee <cernekee@gmail.com>
-Tested-by: Dave Turvene <dturvene@dahetral.com>
-Signed-off-by: Dmitry Torokhov <dmitry.torokhov@gmail.com>
----
- drivers/input/mouse/alps.c | 12 ++++--------
- 1 file changed, 4 insertions(+), 8 deletions(-)
-
-diff --git a/drivers/input/mouse/alps.c b/drivers/input/mouse/alps.c
-index fe45687..2221a00 100644
---- a/drivers/input/mouse/alps.c
-+++ b/drivers/input/mouse/alps.c
-@@ -1190,14 +1190,10 @@ static int alps_absolute_mode_v3(struct psmouse *psmouse)
-
- static int alps_hw_init_v3(struct psmouse *psmouse)
- {
-- struct alps_data *priv = psmouse->private;
- struct ps2dev *ps2dev = &psmouse->ps2dev;
- int reg_val;
- unsigned char param[4];
-
-- priv->nibble_commands = alps_v3_nibble_commands;
-- priv->addr_command = PSMOUSE_CMD_RESET_WRAP;
--
- if (alps_enter_command_mode(psmouse, NULL))
- goto error;
-
-@@ -1343,13 +1339,9 @@ static int alps_absolute_mode_v4(struct psmouse *psmouse)
-
- static int alps_hw_init_v4(struct psmouse *psmouse)
- {
-- struct alps_data *priv = psmouse->private;
- struct ps2dev *ps2dev = &psmouse->ps2dev;
- unsigned char param[4];
-
-- priv->nibble_commands = alps_v4_nibble_commands;
-- priv->addr_command = PSMOUSE_CMD_DISABLE;
--
- if (alps_enter_command_mode(psmouse, NULL))
- goto error;
-
-@@ -1431,11 +1423,15 @@ static void alps_set_defaults(struct alps_data *priv)
- priv->hw_init = alps_hw_init_v3;
- priv->process_packet = alps_process_packet_v3;
- priv->set_abs_params = alps_set_abs_params_mt;
-+ priv->nibble_commands = alps_v3_nibble_commands;
-+ priv->addr_command = PSMOUSE_CMD_RESET_WRAP;
- break;
- case ALPS_PROTO_V4:
- priv->hw_init = alps_hw_init_v4;
- priv->process_packet = alps_process_packet_v4;
- priv->set_abs_params = alps_set_abs_params_mt;
-+ priv->nibble_commands = alps_v4_nibble_commands;
-+ priv->addr_command = PSMOUSE_CMD_DISABLE;
- break;
- }
- }
---
-1.8.1.2
-
-
-From df0bf385112a7b38c5c3d307bb9399f9f3b3bba2 Mon Sep 17 00:00:00 2001
-From: Kevin Cernekee <cernekee@gmail.com>
-Date: Wed, 13 Feb 2013 22:23:34 -0800
-Subject: [PATCH 08/15] Input: ALPS - rework detection of Pinnacle AGx
- touchpads
-
-The official ALPS driver uses the EC report, not the E7 report, to detect
-these devices. Also, they check for a range of values; the original
-table-based code only checked for two specific ones.
-
-Signed-off-by: Kevin Cernekee <cernekee@gmail.com>
-Tested-by: Dave Turvene <dturvene@dahetral.com>
-Signed-off-by: Dmitry Torokhov <dmitry.torokhov@gmail.com>
----
- drivers/input/mouse/alps.c | 15 ++++++++++++---
- 1 file changed, 12 insertions(+), 3 deletions(-)
-
-diff --git a/drivers/input/mouse/alps.c b/drivers/input/mouse/alps.c
-index 2221a00..eafeae2 100644
---- a/drivers/input/mouse/alps.c
-+++ b/drivers/input/mouse/alps.c
-@@ -109,8 +109,6 @@ static const struct alps_model_info alps_model_data[] = {
- { { 0x73, 0x02, 0x50 }, 0x00, ALPS_PROTO_V2, 0xcf, 0xcf, ALPS_FOUR_BUTTONS }, /* Dell Vostro 1400 */
- { { 0x52, 0x01, 0x14 }, 0x00, ALPS_PROTO_V2, 0xff, 0xff,
- ALPS_PASS | ALPS_DUALPOINT | ALPS_PS2_INTERLEAVED }, /* Toshiba Tecra A11-11L */
-- { { 0x73, 0x02, 0x64 }, 0x9b, ALPS_PROTO_V3, 0x8f, 0x8f, ALPS_DUALPOINT },
-- { { 0x73, 0x02, 0x64 }, 0x9d, ALPS_PROTO_V3, 0x8f, 0x8f, ALPS_DUALPOINT },
- { { 0x73, 0x02, 0x64 }, 0x8a, ALPS_PROTO_V4, 0x8f, 0x8f, 0 },
- };
-
-@@ -1412,6 +1410,10 @@ error:
-
- static void alps_set_defaults(struct alps_data *priv)
- {
-+ priv->byte0 = 0x8f;
-+ priv->mask0 = 0x8f;
-+ priv->flags = ALPS_DUALPOINT;
-+
- switch (priv->proto_version) {
- case ALPS_PROTO_V1:
- case ALPS_PROTO_V2:
-@@ -1491,8 +1493,15 @@ static int alps_identify(struct psmouse *psmouse, struct alps_data *priv)
- alps_exit_command_mode(psmouse))
- return -EIO;
-
-- if (alps_match_table(psmouse, priv, e7, ec) == 0)
-+ if (alps_match_table(psmouse, priv, e7, ec) == 0) {
-+ return 0;
-+ } else if (ec[0] == 0x88 && ec[1] == 0x07 &&
-+ ec[2] >= 0x90 && ec[2] <= 0x9d) {
-+ priv->proto_version = ALPS_PROTO_V3;
-+ alps_set_defaults(priv);
-+
- return 0;
-+ }
-
- psmouse_info(psmouse,
- "Unknown ALPS touchpad: E7=%2.2x %2.2x %2.2x, EC=%2.2x %2.2x %2.2x\n",
---
-1.8.1.2
-
-
-From 8e6493f800dc08a28abd59dfe63790aaade0c700 Mon Sep 17 00:00:00 2001
-From: Kevin Cernekee <cernekee@gmail.com>
-Date: Wed, 13 Feb 2013 22:24:22 -0800
-Subject: [PATCH 09/15] Input: ALPS - fix command mode check
-
-Pinnacle class devices should return "88 07 xx" or "88 08 xx" when
-entering command mode. If either the first byte or the second byte is
-invalid, return an error.
-
-Signed-off-by: Kevin Cernekee <cernekee@gmail.com>
-Tested-by: Dave Turvene <dturvene@dahetral.com>
-Signed-off-by: Dmitry Torokhov <dmitry.torokhov@gmail.com>
----
- drivers/input/mouse/alps.c | 2 +-
- 1 file changed, 1 insertion(+), 1 deletion(-)
-
-diff --git a/drivers/input/mouse/alps.c b/drivers/input/mouse/alps.c
-index eafeae2..bfc1938 100644
---- a/drivers/input/mouse/alps.c
-+++ b/drivers/input/mouse/alps.c
-@@ -983,7 +983,7 @@ static int alps_enter_command_mode(struct psmouse *psmouse,
- return -1;
- }
-
-- if (param[0] != 0x88 && param[1] != 0x07) {
-+ if (param[0] != 0x88 || (param[1] != 0x07 && param[1] != 0x08)) {
- psmouse_dbg(psmouse,
- "unknown response while entering command mode\n");
- return -1;
---
-1.8.1.2
-
-
-From 0302b4c4a1b4201bf82a45c46084f3ccd0ee696f Mon Sep 17 00:00:00 2001
-From: Kevin Cernekee <cernekee@gmail.com>
-Date: Wed, 13 Feb 2013 22:24:55 -0800
-Subject: [PATCH 10/15] Input: ALPS - move pixel and bitmap info into alps_data
- struct
-
-Newer touchpads use different constants, so make them runtime-
-configurable.
-
-Signed-off-by: Kevin Cernekee <cernekee@gmail.com>
-Tested-by: Dave Turvene <dturvene@dahetral.com>
-Signed-off-by: Dmitry Torokhov <dmitry.torokhov@gmail.com>
----
- drivers/input/mouse/alps.c | 47 ++++++++++++++++++++++++----------------------
- drivers/input/mouse/alps.h | 8 ++++++++
- 2 files changed, 33 insertions(+), 22 deletions(-)
-
-diff --git a/drivers/input/mouse/alps.c b/drivers/input/mouse/alps.c
-index bfc1938..2cd8be7 100644
---- a/drivers/input/mouse/alps.c
-+++ b/drivers/input/mouse/alps.c
-@@ -27,12 +27,6 @@
- /*
- * Definitions for ALPS version 3 and 4 command mode protocol
- */
--#define ALPS_V3_X_MAX 2000
--#define ALPS_V3_Y_MAX 1400
--
--#define ALPS_BITMAP_X_BITS 15
--#define ALPS_BITMAP_Y_BITS 11
--
- #define ALPS_CMD_NIBBLE_10 0x01f2
-
- static const struct alps_nibble_commands alps_v3_nibble_commands[] = {
-@@ -269,7 +263,8 @@ static void alps_process_packet_v1_v2(struct psmouse *psmouse)
- * These points are returned in x1, y1, x2, and y2 when the return value
- * is greater than 0.
- */
--static int alps_process_bitmap(unsigned int x_map, unsigned int y_map,
-+static int alps_process_bitmap(struct alps_data *priv,
-+ unsigned int x_map, unsigned int y_map,
- int *x1, int *y1, int *x2, int *y2)
- {
- struct alps_bitmap_point {
-@@ -311,7 +306,7 @@ static int alps_process_bitmap(unsigned int x_map, unsigned int y_map,
- * y bitmap is reversed for what we need (lower positions are in
- * higher bits), so we process from the top end.
- */
-- y_map = y_map << (sizeof(y_map) * BITS_PER_BYTE - ALPS_BITMAP_Y_BITS);
-+ y_map = y_map << (sizeof(y_map) * BITS_PER_BYTE - priv->y_bits);
- prev_bit = 0;
- point = &y_low;
- for (i = 0; y_map != 0; i++, y_map <<= 1) {
-@@ -357,16 +352,18 @@ static int alps_process_bitmap(unsigned int x_map, unsigned int y_map,
- }
- }
-
-- *x1 = (ALPS_V3_X_MAX * (2 * x_low.start_bit + x_low.num_bits - 1)) /
-- (2 * (ALPS_BITMAP_X_BITS - 1));
-- *y1 = (ALPS_V3_Y_MAX * (2 * y_low.start_bit + y_low.num_bits - 1)) /
-- (2 * (ALPS_BITMAP_Y_BITS - 1));
-+ *x1 = (priv->x_max * (2 * x_low.start_bit + x_low.num_bits - 1)) /
-+ (2 * (priv->x_bits - 1));
-+ *y1 = (priv->y_max * (2 * y_low.start_bit + y_low.num_bits - 1)) /
-+ (2 * (priv->y_bits - 1));
-
- if (fingers > 1) {
-- *x2 = (ALPS_V3_X_MAX * (2 * x_high.start_bit + x_high.num_bits - 1)) /
-- (2 * (ALPS_BITMAP_X_BITS - 1));
-- *y2 = (ALPS_V3_Y_MAX * (2 * y_high.start_bit + y_high.num_bits - 1)) /
-- (2 * (ALPS_BITMAP_Y_BITS - 1));
-+ *x2 = (priv->x_max *
-+ (2 * x_high.start_bit + x_high.num_bits - 1)) /
-+ (2 * (priv->x_bits - 1));
-+ *y2 = (priv->y_max *
-+ (2 * y_high.start_bit + y_high.num_bits - 1)) /
-+ (2 * (priv->y_bits - 1));
- }
-
- return fingers;
-@@ -484,7 +481,8 @@ static void alps_process_touchpad_packet_v3(struct psmouse *psmouse)
- ((packet[2] & 0x7f) << 1) |
- (packet[4] & 0x01);
-
-- bmap_fingers = alps_process_bitmap(x_bitmap, y_bitmap,
-+ bmap_fingers = alps_process_bitmap(priv,
-+ x_bitmap, y_bitmap,
- &x1, &y1, &x2, &y2);
-
- /*
-@@ -641,7 +639,7 @@ static void alps_process_packet_v4(struct psmouse *psmouse)
- ((priv->multi_data[3] & 0x1f) << 5) |
- (priv->multi_data[1] & 0x1f);
-
-- fingers = alps_process_bitmap(x_bitmap, y_bitmap,
-+ fingers = alps_process_bitmap(priv, x_bitmap, y_bitmap,
- &x1, &y1, &x2, &y2);
-
- /* Store MT data.*/
-@@ -1414,6 +1412,11 @@ static void alps_set_defaults(struct alps_data *priv)
- priv->mask0 = 0x8f;
- priv->flags = ALPS_DUALPOINT;
-
-+ priv->x_max = 2000;
-+ priv->y_max = 1400;
-+ priv->x_bits = 15;
-+ priv->y_bits = 11;
-+
- switch (priv->proto_version) {
- case ALPS_PROTO_V1:
- case ALPS_PROTO_V2:
-@@ -1544,15 +1547,15 @@ static void alps_set_abs_params_mt(struct alps_data *priv,
- {
- set_bit(INPUT_PROP_SEMI_MT, dev1->propbit);
- input_mt_init_slots(dev1, 2, 0);
-- input_set_abs_params(dev1, ABS_MT_POSITION_X, 0, ALPS_V3_X_MAX, 0, 0);
-- input_set_abs_params(dev1, ABS_MT_POSITION_Y, 0, ALPS_V3_Y_MAX, 0, 0);
-+ input_set_abs_params(dev1, ABS_MT_POSITION_X, 0, priv->x_max, 0, 0);
-+ input_set_abs_params(dev1, ABS_MT_POSITION_Y, 0, priv->y_max, 0, 0);
-
- set_bit(BTN_TOOL_DOUBLETAP, dev1->keybit);
- set_bit(BTN_TOOL_TRIPLETAP, dev1->keybit);
- set_bit(BTN_TOOL_QUADTAP, dev1->keybit);
-
-- input_set_abs_params(dev1, ABS_X, 0, ALPS_V3_X_MAX, 0, 0);
-- input_set_abs_params(dev1, ABS_Y, 0, ALPS_V3_Y_MAX, 0, 0);
-+ input_set_abs_params(dev1, ABS_X, 0, priv->x_max, 0, 0);
-+ input_set_abs_params(dev1, ABS_Y, 0, priv->y_max, 0, 0);
- }
-
- int alps_init(struct psmouse *psmouse)
-diff --git a/drivers/input/mouse/alps.h b/drivers/input/mouse/alps.h
-index 0934f8b..5e638be 100644
---- a/drivers/input/mouse/alps.h
-+++ b/drivers/input/mouse/alps.h
-@@ -72,6 +72,10 @@ struct alps_nibble_commands {
- * mask0, should match byte0.
- * @mask0: The mask used to check the first byte of the report.
- * @flags: Additional device capabilities (passthrough port, trackstick, etc.).
-+ * @x_max: Largest possible X position value.
-+ * @y_max: Largest possible Y position value.
-+ * @x_bits: Number of X bits in the MT bitmap.
-+ * @y_bits: Number of Y bits in the MT bitmap.
- * @hw_init: Protocol-specific hardware init function.
- * @process_packet: Protocol-specific function to process a report packet.
- * @set_abs_params: Protocol-specific function to configure the input_dev.
-@@ -96,6 +100,10 @@ struct alps_data {
- unsigned char proto_version;
- unsigned char byte0, mask0;
- unsigned char flags;
-+ int x_max;
-+ int y_max;
-+ int x_bits;
-+ int y_bits;
-
- int (*hw_init)(struct psmouse *psmouse);
- void (*process_packet)(struct psmouse *psmouse);
---
-1.8.1.2
-
-
-From 3c9d054fef84ccc967445b330ab6012c6b6bd85b Mon Sep 17 00:00:00 2001
-From: Kevin Cernekee <cernekee@gmail.com>
-Date: Wed, 13 Feb 2013 22:26:11 -0800
-Subject: [PATCH 11/15] Input: ALPS - make the V3 packet field decoder
- "pluggable"
-
-A number of different ALPS touchpad protocols can reuse
-alps_process_touchpad_packet_v3() with small tweaks to the bitfield
-decoding. Create a new priv->decode_fields() callback that handles the
-per-model differences.
-
-Signed-off-by: Kevin Cernekee <cernekee@gmail.com>
-Tested-by: Dave Turvene <dturvene@dahetral.com>
-Signed-off-by: Dmitry Torokhov <dmitry.torokhov@gmail.com>
----
- drivers/input/mouse/alps.c | 101 +++++++++++++++++++++++++--------------------
- drivers/input/mouse/alps.h | 38 +++++++++++++++++
- 2 files changed, 95 insertions(+), 44 deletions(-)
-
-diff --git a/drivers/input/mouse/alps.c b/drivers/input/mouse/alps.c
-index 2cd8be7..270b7de 100644
---- a/drivers/input/mouse/alps.c
-+++ b/drivers/input/mouse/alps.c
-@@ -447,17 +447,49 @@ static void alps_process_trackstick_packet_v3(struct psmouse *psmouse)
- return;
- }
-
-+static void alps_decode_buttons_v3(struct alps_fields *f, unsigned char *p)
-+{
-+ f->left = !!(p[3] & 0x01);
-+ f->right = !!(p[3] & 0x02);
-+ f->middle = !!(p[3] & 0x04);
-+
-+ f->ts_left = !!(p[3] & 0x10);
-+ f->ts_right = !!(p[3] & 0x20);
-+ f->ts_middle = !!(p[3] & 0x40);
-+}
-+
-+static void alps_decode_pinnacle(struct alps_fields *f, unsigned char *p)
-+{
-+ f->first_mp = !!(p[4] & 0x40);
-+ f->is_mp = !!(p[0] & 0x40);
-+
-+ f->fingers = (p[5] & 0x3) + 1;
-+ f->x_map = ((p[4] & 0x7e) << 8) |
-+ ((p[1] & 0x7f) << 2) |
-+ ((p[0] & 0x30) >> 4);
-+ f->y_map = ((p[3] & 0x70) << 4) |
-+ ((p[2] & 0x7f) << 1) |
-+ (p[4] & 0x01);
-+
-+ f->x = ((p[1] & 0x7f) << 4) | ((p[4] & 0x30) >> 2) |
-+ ((p[0] & 0x30) >> 4);
-+ f->y = ((p[2] & 0x7f) << 4) | (p[4] & 0x0f);
-+ f->z = p[5] & 0x7f;
-+
-+ alps_decode_buttons_v3(f, p);
-+}
-+
- static void alps_process_touchpad_packet_v3(struct psmouse *psmouse)
- {
- struct alps_data *priv = psmouse->private;
- unsigned char *packet = psmouse->packet;
- struct input_dev *dev = psmouse->dev;
- struct input_dev *dev2 = priv->dev2;
-- int x, y, z;
-- int left, right, middle;
- int x1 = 0, y1 = 0, x2 = 0, y2 = 0;
- int fingers = 0, bmap_fingers;
-- unsigned int x_bitmap, y_bitmap;
-+ struct alps_fields f;
-+
-+ priv->decode_fields(&f, packet);
-
- /*
- * There's no single feature of touchpad position and bitmap packets
-@@ -472,17 +504,10 @@ static void alps_process_touchpad_packet_v3(struct psmouse *psmouse)
- * packet. Check for this, and when it happens process the
- * position packet as usual.
- */
-- if (packet[0] & 0x40) {
-- fingers = (packet[5] & 0x3) + 1;
-- x_bitmap = ((packet[4] & 0x7e) << 8) |
-- ((packet[1] & 0x7f) << 2) |
-- ((packet[0] & 0x30) >> 4);
-- y_bitmap = ((packet[3] & 0x70) << 4) |
-- ((packet[2] & 0x7f) << 1) |
-- (packet[4] & 0x01);
--
-+ if (f.is_mp) {
-+ fingers = f.fingers;
- bmap_fingers = alps_process_bitmap(priv,
-- x_bitmap, y_bitmap,
-+ f.x_map, f.y_map,
- &x1, &y1, &x2, &y2);
-
- /*
-@@ -493,7 +518,7 @@ static void alps_process_touchpad_packet_v3(struct psmouse *psmouse)
- fingers = bmap_fingers;
-
- /* Now process position packet */
-- packet = priv->multi_data;
-+ priv->decode_fields(&f, priv->multi_data);
- } else {
- priv->multi_packet = 0;
- }
-@@ -507,10 +532,10 @@ static void alps_process_touchpad_packet_v3(struct psmouse *psmouse)
- * out misidentified bitmap packets, we reject anything with this
- * bit set.
- */
-- if (packet[0] & 0x40)
-+ if (f.is_mp)
- return;
-
-- if (!priv->multi_packet && (packet[4] & 0x40)) {
-+ if (!priv->multi_packet && f.first_mp) {
- priv->multi_packet = 1;
- memcpy(priv->multi_data, packet, sizeof(priv->multi_data));
- return;
-@@ -518,22 +543,13 @@ static void alps_process_touchpad_packet_v3(struct psmouse *psmouse)
-
- priv->multi_packet = 0;
-
-- left = packet[3] & 0x01;
-- right = packet[3] & 0x02;
-- middle = packet[3] & 0x04;
--
-- x = ((packet[1] & 0x7f) << 4) | ((packet[4] & 0x30) >> 2) |
-- ((packet[0] & 0x30) >> 4);
-- y = ((packet[2] & 0x7f) << 4) | (packet[4] & 0x0f);
-- z = packet[5] & 0x7f;
--
- /*
- * Sometimes the hardware sends a single packet with z = 0
- * in the middle of a stream. Real releases generate packets
- * with x, y, and z all zero, so these seem to be flukes.
- * Ignore them.
- */
-- if (x && y && !z)
-+ if (f.x && f.y && !f.z)
- return;
-
- /*
-@@ -541,12 +557,12 @@ static void alps_process_touchpad_packet_v3(struct psmouse *psmouse)
- * to rely on ST data.
- */
- if (!fingers) {
-- x1 = x;
-- y1 = y;
-- fingers = z > 0 ? 1 : 0;
-+ x1 = f.x;
-+ y1 = f.y;
-+ fingers = f.z > 0 ? 1 : 0;
- }
-
-- if (z >= 64)
-+ if (f.z >= 64)
- input_report_key(dev, BTN_TOUCH, 1);
- else
- input_report_key(dev, BTN_TOUCH, 0);
-@@ -555,26 +571,22 @@ static void alps_process_touchpad_packet_v3(struct psmouse *psmouse)
-
- input_mt_report_finger_count(dev, fingers);
-
-- input_report_key(dev, BTN_LEFT, left);
-- input_report_key(dev, BTN_RIGHT, right);
-- input_report_key(dev, BTN_MIDDLE, middle);
-+ input_report_key(dev, BTN_LEFT, f.left);
-+ input_report_key(dev, BTN_RIGHT, f.right);
-+ input_report_key(dev, BTN_MIDDLE, f.middle);
-
-- if (z > 0) {
-- input_report_abs(dev, ABS_X, x);
-- input_report_abs(dev, ABS_Y, y);
-+ if (f.z > 0) {
-+ input_report_abs(dev, ABS_X, f.x);
-+ input_report_abs(dev, ABS_Y, f.y);
- }
-- input_report_abs(dev, ABS_PRESSURE, z);
-+ input_report_abs(dev, ABS_PRESSURE, f.z);
-
- input_sync(dev);
-
- if (!(priv->quirks & ALPS_QUIRK_TRACKSTICK_BUTTONS)) {
-- left = packet[3] & 0x10;
-- right = packet[3] & 0x20;
-- middle = packet[3] & 0x40;
--
-- input_report_key(dev2, BTN_LEFT, left);
-- input_report_key(dev2, BTN_RIGHT, right);
-- input_report_key(dev2, BTN_MIDDLE, middle);
-+ input_report_key(dev2, BTN_LEFT, f.ts_left);
-+ input_report_key(dev2, BTN_RIGHT, f.ts_right);
-+ input_report_key(dev2, BTN_MIDDLE, f.ts_middle);
- input_sync(dev2);
- }
- }
-@@ -1428,6 +1440,7 @@ static void alps_set_defaults(struct alps_data *priv)
- priv->hw_init = alps_hw_init_v3;
- priv->process_packet = alps_process_packet_v3;
- priv->set_abs_params = alps_set_abs_params_mt;
-+ priv->decode_fields = alps_decode_pinnacle;
- priv->nibble_commands = alps_v3_nibble_commands;
- priv->addr_command = PSMOUSE_CMD_RESET_WRAP;
- break;
-diff --git a/drivers/input/mouse/alps.h b/drivers/input/mouse/alps.h
-index 5e638be..9704805 100644
---- a/drivers/input/mouse/alps.h
-+++ b/drivers/input/mouse/alps.h
-@@ -60,6 +60,42 @@ struct alps_nibble_commands {
- };
-
- /**
-+ * struct alps_fields - decoded version of the report packet
-+ * @x_map: Bitmap of active X positions for MT.
-+ * @y_map: Bitmap of active Y positions for MT.
-+ * @fingers: Number of fingers for MT.
-+ * @x: X position for ST.
-+ * @y: Y position for ST.
-+ * @z: Z position for ST.
-+ * @first_mp: Packet is the first of a multi-packet report.
-+ * @is_mp: Packet is part of a multi-packet report.
-+ * @left: Left touchpad button is active.
-+ * @right: Right touchpad button is active.
-+ * @middle: Middle touchpad button is active.
-+ * @ts_left: Left trackstick button is active.
-+ * @ts_right: Right trackstick button is active.
-+ * @ts_middle: Middle trackstick button is active.
-+ */
-+struct alps_fields {
-+ unsigned int x_map;
-+ unsigned int y_map;
-+ unsigned int fingers;
-+ unsigned int x;
-+ unsigned int y;
-+ unsigned int z;
-+ unsigned int first_mp:1;
-+ unsigned int is_mp:1;
-+
-+ unsigned int left:1;
-+ unsigned int right:1;
-+ unsigned int middle:1;
-+
-+ unsigned int ts_left:1;
-+ unsigned int ts_right:1;
-+ unsigned int ts_middle:1;
-+};
-+
-+/**
- * struct alps_data - private data structure for the ALPS driver
- * @dev2: "Relative" device used to report trackstick or mouse activity.
- * @phys: Physical path for the relative device.
-@@ -78,6 +114,7 @@ struct alps_nibble_commands {
- * @y_bits: Number of Y bits in the MT bitmap.
- * @hw_init: Protocol-specific hardware init function.
- * @process_packet: Protocol-specific function to process a report packet.
-+ * @decode_fields: Protocol-specific function to read packet bitfields.
- * @set_abs_params: Protocol-specific function to configure the input_dev.
- * @prev_fin: Finger bit from previous packet.
- * @multi_packet: Multi-packet data in progress.
-@@ -107,6 +144,7 @@ struct alps_data {
-
- int (*hw_init)(struct psmouse *psmouse);
- void (*process_packet)(struct psmouse *psmouse);
-+ void (*decode_fields)(struct alps_fields *f, unsigned char *p);
- void (*set_abs_params)(struct alps_data *priv, struct input_dev *dev1);
-
- int prev_fin;
---
-1.8.1.2
-
-
-From 9e7c99b6c125653f53ef0999a176c3a79de21be8 Mon Sep 17 00:00:00 2001
-From: Kevin Cernekee <cernekee@gmail.com>
-Date: Wed, 13 Feb 2013 22:27:08 -0800
-Subject: [PATCH 12/15] Input: ALPS - add support for "Rushmore" touchpads
-
-Rushmore touchpads are found on Dell E6230/E6430/E6530. They use the V3
-protocol with slightly tweaked init sequences and report formats.
-
-The E7 report is 73 03 0a, and the EC report is 88 08 1d
-
-Credits: Emmanuel Thome reported the MT bitmap changes.
-
-Signed-off-by: Kevin Cernekee <cernekee@gmail.com>
-Tested-by: Dave Turvene <dturvene@dahetral.com>
-Signed-off-by: Dmitry Torokhov <dmitry.torokhov@gmail.com>
----
- drivers/input/mouse/alps.c | 52 ++++++++++++++++++++++++++++++++++++++++++++++
- 1 file changed, 52 insertions(+)
-
-diff --git a/drivers/input/mouse/alps.c b/drivers/input/mouse/alps.c
-index 270b7de..bf2fa51 100644
---- a/drivers/input/mouse/alps.c
-+++ b/drivers/input/mouse/alps.c
-@@ -479,6 +479,14 @@ static void alps_decode_pinnacle(struct alps_fields *f, unsigned char *p)
- alps_decode_buttons_v3(f, p);
- }
-
-+static void alps_decode_rushmore(struct alps_fields *f, unsigned char *p)
-+{
-+ alps_decode_pinnacle(f, p);
-+
-+ f->x_map |= (p[5] & 0x10) << 11;
-+ f->y_map |= (p[5] & 0x20) << 6;
-+}
-+
- static void alps_process_touchpad_packet_v3(struct psmouse *psmouse)
- {
- struct alps_data *priv = psmouse->private;
-@@ -1329,6 +1337,40 @@ error:
- return -1;
- }
-
-+static int alps_hw_init_rushmore_v3(struct psmouse *psmouse)
-+{
-+ struct ps2dev *ps2dev = &psmouse->ps2dev;
-+ int reg_val, ret = -1;
-+
-+ if (alps_enter_command_mode(psmouse, NULL) ||
-+ alps_command_mode_read_reg(psmouse, 0xc2d9) == -1 ||
-+ alps_command_mode_write_reg(psmouse, 0xc2cb, 0x00))
-+ goto error;
-+
-+ reg_val = alps_command_mode_read_reg(psmouse, 0xc2c6);
-+ if (reg_val == -1)
-+ goto error;
-+ if (__alps_command_mode_write_reg(psmouse, reg_val & 0xfd))
-+ goto error;
-+
-+ if (alps_command_mode_write_reg(psmouse, 0xc2c9, 0x64))
-+ goto error;
-+
-+ /* enter absolute mode */
-+ reg_val = alps_command_mode_read_reg(psmouse, 0xc2c4);
-+ if (reg_val == -1)
-+ goto error;
-+ if (__alps_command_mode_write_reg(psmouse, reg_val | 0x02))
-+ goto error;
-+
-+ alps_exit_command_mode(psmouse);
-+ return ps2_command(ps2dev, NULL, PSMOUSE_CMD_ENABLE);
-+
-+error:
-+ alps_exit_command_mode(psmouse);
-+ return ret;
-+}
-+
- /* Must be in command mode when calling this function */
- static int alps_absolute_mode_v4(struct psmouse *psmouse)
- {
-@@ -1511,6 +1553,16 @@ static int alps_identify(struct psmouse *psmouse, struct alps_data *priv)
-
- if (alps_match_table(psmouse, priv, e7, ec) == 0) {
- return 0;
-+ } else if (ec[0] == 0x88 && ec[1] == 0x08) {
-+ priv->proto_version = ALPS_PROTO_V3;
-+ alps_set_defaults(priv);
-+
-+ priv->hw_init = alps_hw_init_rushmore_v3;
-+ priv->decode_fields = alps_decode_rushmore;
-+ priv->x_bits = 16;
-+ priv->y_bits = 12;
-+
-+ return 0;
- } else if (ec[0] == 0x88 && ec[1] == 0x07 &&
- ec[2] >= 0x90 && ec[2] <= 0x9d) {
- priv->proto_version = ALPS_PROTO_V3;
---
-1.8.1.2
-
-
-From e5ca58dc506fb7f64760b483ecd407593b764f3b Mon Sep 17 00:00:00 2001
-From: Kevin Cernekee <cernekee@gmail.com>
-Date: Wed, 13 Feb 2013 22:28:07 -0800
-Subject: [PATCH 13/15] Input: ALPS - enable trackstick on Rushmore touchpads
-
-Separate out the common trackstick probe/setup sequences, then call them
-from each of the v3 init functions.
-
-Credits: Emmanual Thome furnished the information on the trackstick init
-and how it affected the report format.
-
-Signed-off-by: Kevin Cernekee <cernekee@gmail.com>
-Tested-by: Dave Turvene <dturvene@dahetral.com>
-Signed-off-by: Dmitry Torokhov <dmitry.torokhov@gmail.com>
----
- drivers/input/mouse/alps.c | 185 ++++++++++++++++++++++++++++-----------------
- 1 file changed, 115 insertions(+), 70 deletions(-)
-
-diff --git a/drivers/input/mouse/alps.c b/drivers/input/mouse/alps.c
-index bf2fa51..7b99fc7 100644
---- a/drivers/input/mouse/alps.c
-+++ b/drivers/input/mouse/alps.c
-@@ -29,6 +29,9 @@
- */
- #define ALPS_CMD_NIBBLE_10 0x01f2
-
-+#define ALPS_REG_BASE_RUSHMORE 0xc2c0
-+#define ALPS_REG_BASE_PINNACLE 0x0000
-+
- static const struct alps_nibble_commands alps_v3_nibble_commands[] = {
- { PSMOUSE_CMD_SETPOLL, 0x00 }, /* 0 */
- { PSMOUSE_CMD_RESET_DIS, 0x00 }, /* 1 */
-@@ -1166,26 +1169,31 @@ static int alps_hw_init_v1_v2(struct psmouse *psmouse)
- }
-
- /*
-- * Enable or disable passthrough mode to the trackstick. Must be in
-- * command mode when calling this function.
-+ * Enable or disable passthrough mode to the trackstick.
- */
--static int alps_passthrough_mode_v3(struct psmouse *psmouse, bool enable)
-+static int alps_passthrough_mode_v3(struct psmouse *psmouse,
-+ int reg_base, bool enable)
- {
-- int reg_val;
-+ int reg_val, ret = -1;
-
-- reg_val = alps_command_mode_read_reg(psmouse, 0x0008);
-- if (reg_val == -1)
-+ if (alps_enter_command_mode(psmouse, NULL))
- return -1;
-
-+ reg_val = alps_command_mode_read_reg(psmouse, reg_base + 0x0008);
-+ if (reg_val == -1)
-+ goto error;
-+
- if (enable)
- reg_val |= 0x01;
- else
- reg_val &= ~0x01;
-
-- if (__alps_command_mode_write_reg(psmouse, reg_val))
-- return -1;
-+ ret = __alps_command_mode_write_reg(psmouse, reg_val);
-
-- return 0;
-+error:
-+ if (alps_exit_command_mode(psmouse))
-+ ret = -1;
-+ return ret;
- }
-
- /* Must be in command mode when calling this function */
-@@ -1204,69 +1212,102 @@ static int alps_absolute_mode_v3(struct psmouse *psmouse)
- return 0;
- }
-
--static int alps_hw_init_v3(struct psmouse *psmouse)
-+static int alps_probe_trackstick_v3(struct psmouse *psmouse, int reg_base)
- {
-- struct ps2dev *ps2dev = &psmouse->ps2dev;
-- int reg_val;
-- unsigned char param[4];
-+ int ret = -EIO, reg_val;
-
- if (alps_enter_command_mode(psmouse, NULL))
- goto error;
-
-- /* Check for trackstick */
-- reg_val = alps_command_mode_read_reg(psmouse, 0x0008);
-+ reg_val = alps_command_mode_read_reg(psmouse, reg_base + 0x08);
- if (reg_val == -1)
- goto error;
-- if (reg_val & 0x80) {
-- if (alps_passthrough_mode_v3(psmouse, true))
-- goto error;
-- if (alps_exit_command_mode(psmouse))
-- goto error;
-+
-+ /* bit 7: trackstick is present */
-+ ret = reg_val & 0x80 ? 0 : -ENODEV;
-+
-+error:
-+ alps_exit_command_mode(psmouse);
-+ return ret;
-+}
-+
-+static int alps_setup_trackstick_v3(struct psmouse *psmouse, int reg_base)
-+{
-+ struct ps2dev *ps2dev = &psmouse->ps2dev;
-+ int ret = 0;
-+ unsigned char param[4];
-+
-+ if (alps_passthrough_mode_v3(psmouse, reg_base, true))
-+ return -EIO;
-+
-+ /*
-+ * E7 report for the trackstick
-+ *
-+ * There have been reports of failures to seem to trace back
-+ * to the above trackstick check failing. When these occur
-+ * this E7 report fails, so when that happens we continue
-+ * with the assumption that there isn't a trackstick after
-+ * all.
-+ */
-+ if (alps_rpt_cmd(psmouse, 0, PSMOUSE_CMD_SETSCALE21, param)) {
-+ psmouse_warn(psmouse, "trackstick E7 report failed\n");
-+ ret = -ENODEV;
-+ } else {
-+ psmouse_dbg(psmouse,
-+ "trackstick E7 report: %2.2x %2.2x %2.2x\n",
-+ param[0], param[1], param[2]);
-
- /*
-- * E7 report for the trackstick
-- *
-- * There have been reports of failures to seem to trace back
-- * to the above trackstick check failing. When these occur
-- * this E7 report fails, so when that happens we continue
-- * with the assumption that there isn't a trackstick after
-- * all.
-+ * Not sure what this does, but it is absolutely
-+ * essential. Without it, the touchpad does not
-+ * work at all and the trackstick just emits normal
-+ * PS/2 packets.
- */
-- param[0] = 0x64;
-- if (ps2_command(ps2dev, NULL, PSMOUSE_CMD_SETSCALE21) ||
-- ps2_command(ps2dev, NULL, PSMOUSE_CMD_SETSCALE21) ||
-- ps2_command(ps2dev, NULL, PSMOUSE_CMD_SETSCALE21) ||
-- ps2_command(ps2dev, param, PSMOUSE_CMD_GETINFO)) {
-- psmouse_warn(psmouse, "trackstick E7 report failed\n");
-- } else {
-- psmouse_dbg(psmouse,
-- "trackstick E7 report: %2.2x %2.2x %2.2x\n",
-- param[0], param[1], param[2]);
--
-- /*
-- * Not sure what this does, but it is absolutely
-- * essential. Without it, the touchpad does not
-- * work at all and the trackstick just emits normal
-- * PS/2 packets.
-- */
-- if (ps2_command(ps2dev, NULL, PSMOUSE_CMD_SETSCALE11) ||
-- ps2_command(ps2dev, NULL, PSMOUSE_CMD_SETSCALE11) ||
-- ps2_command(ps2dev, NULL, PSMOUSE_CMD_SETSCALE11) ||
-- alps_command_mode_send_nibble(psmouse, 0x9) ||
-- alps_command_mode_send_nibble(psmouse, 0x4)) {
-- psmouse_err(psmouse,
-- "Error sending magic E6 sequence\n");
-- goto error_passthrough;
-- }
-+ if (ps2_command(ps2dev, NULL, PSMOUSE_CMD_SETSCALE11) ||
-+ ps2_command(ps2dev, NULL, PSMOUSE_CMD_SETSCALE11) ||
-+ ps2_command(ps2dev, NULL, PSMOUSE_CMD_SETSCALE11) ||
-+ alps_command_mode_send_nibble(psmouse, 0x9) ||
-+ alps_command_mode_send_nibble(psmouse, 0x4)) {
-+ psmouse_err(psmouse,
-+ "Error sending magic E6 sequence\n");
-+ ret = -EIO;
-+ goto error;
- }
-
-- if (alps_enter_command_mode(psmouse, NULL))
-- goto error_passthrough;
-- if (alps_passthrough_mode_v3(psmouse, false))
-- goto error;
-+ /*
-+ * This ensures the trackstick packets are in the format
-+ * supported by this driver. If bit 1 isn't set the packet
-+ * format is different.
-+ */
-+ if (alps_enter_command_mode(psmouse, NULL) ||
-+ alps_command_mode_write_reg(psmouse,
-+ reg_base + 0x08, 0x82) ||
-+ alps_exit_command_mode(psmouse))
-+ ret = -EIO;
- }
-
-- if (alps_absolute_mode_v3(psmouse)) {
-+error:
-+ if (alps_passthrough_mode_v3(psmouse, reg_base, false))
-+ ret = -EIO;
-+
-+ return ret;
-+}
-+
-+static int alps_hw_init_v3(struct psmouse *psmouse)
-+{
-+ struct ps2dev *ps2dev = &psmouse->ps2dev;
-+ int reg_val;
-+ unsigned char param[4];
-+
-+ reg_val = alps_probe_trackstick_v3(psmouse, ALPS_REG_BASE_PINNACLE);
-+ if (reg_val == -EIO)
-+ goto error;
-+ if (reg_val == 0 &&
-+ alps_setup_trackstick_v3(psmouse, ALPS_REG_BASE_PINNACLE) == -EIO)
-+ goto error;
-+
-+ if (alps_enter_command_mode(psmouse, NULL) ||
-+ alps_absolute_mode_v3(psmouse)) {
- psmouse_err(psmouse, "Failed to enter absolute mode\n");
- goto error;
- }
-@@ -1303,14 +1344,6 @@ static int alps_hw_init_v3(struct psmouse *psmouse)
- if (alps_command_mode_write_reg(psmouse, 0x0162, 0x04))
- goto error;
-
-- /*
-- * This ensures the trackstick packets are in the format
-- * supported by this driver. If bit 1 isn't set the packet
-- * format is different.
-- */
-- if (alps_command_mode_write_reg(psmouse, 0x0008, 0x82))
-- goto error;
--
- alps_exit_command_mode(psmouse);
-
- /* Set rate and enable data reporting */
-@@ -1323,10 +1356,6 @@ static int alps_hw_init_v3(struct psmouse *psmouse)
-
- return 0;
-
--error_passthrough:
-- /* Something failed while in passthrough mode, so try to get out */
-- if (!alps_enter_command_mode(psmouse, NULL))
-- alps_passthrough_mode_v3(psmouse, false);
- error:
- /*
- * Leaving the touchpad in command mode will essentially render
-@@ -1339,9 +1368,19 @@ error:
-
- static int alps_hw_init_rushmore_v3(struct psmouse *psmouse)
- {
-+ struct alps_data *priv = psmouse->private;
- struct ps2dev *ps2dev = &psmouse->ps2dev;
- int reg_val, ret = -1;
-
-+ if (priv->flags & ALPS_DUALPOINT) {
-+ reg_val = alps_setup_trackstick_v3(psmouse,
-+ ALPS_REG_BASE_RUSHMORE);
-+ if (reg_val == -EIO)
-+ goto error;
-+ if (reg_val == -ENODEV)
-+ priv->flags &= ~ALPS_DUALPOINT;
-+ }
-+
- if (alps_enter_command_mode(psmouse, NULL) ||
- alps_command_mode_read_reg(psmouse, 0xc2d9) == -1 ||
- alps_command_mode_write_reg(psmouse, 0xc2cb, 0x00))
-@@ -1562,6 +1601,12 @@ static int alps_identify(struct psmouse *psmouse, struct alps_data *priv)
- priv->x_bits = 16;
- priv->y_bits = 12;
-
-+ /* hack to make addr_command, nibble_command available */
-+ psmouse->private = priv;
-+
-+ if (alps_probe_trackstick_v3(psmouse, ALPS_REG_BASE_RUSHMORE))
-+ priv->flags &= ~ALPS_DUALPOINT;
-+
- return 0;
- } else if (ec[0] == 0x88 && ec[1] == 0x07 &&
- ec[2] >= 0x90 && ec[2] <= 0x9d) {
---
-1.8.1.2
-
-
From db7192fa07fa5c70c9849d8f658a7ff696cff99d Mon Sep 17 00:00:00 2001
From: Kevin Cernekee <cernekee@gmail.com>
Date: Sat, 16 Feb 2013 22:40:03 -0800