[kernel] Linux v3.8-3040-ga0b1c42

Josh Boyer jwboyer at fedoraproject.org
Thu Feb 21 16:08:38 UTC 2013


commit 0b030fad7e5b5c451b6bd34ff9b7d37f6687a700
Author: Josh Boyer <jwboyer at redhat.com>
Date:   Thu Feb 21 10:08:01 2013 -0500

    Linux v3.8-3040-ga0b1c42

 Input-add-support-for-Cypress-PS2-Trackpads.patch  | 1063 ---------
 ...-increase-struct-ps2dev-cmdbuf-to-8-bytes.patch |   30 -
 alps-v2.patch                                      | 2246 --------------------
 arm-imx-fixdrm.patch                               |   37 -
 config-arm-generic                                 |    3 +
 config-arm-kirkwood                                |    1 +
 config-arm-omap                                    |    2 +
 config-arm-tegra                                   |    1 +
 config-armv7                                       |   27 +
 config-generic                                     |   29 +-
 config-x86-generic                                 |    5 +-
 iwlegacy-add-flush-callback.patch                  |  103 -
 kernel.spec                                        |   25 +-
 ...ove-latency-and-throughput-while-software.patch |  142 --
 quiet-apm.patch                                    |   13 -
 sources                                            |    2 +-
 16 files changed, 66 insertions(+), 3663 deletions(-)
---
diff --git a/alps-v2.patch b/alps-v2.patch
index d394c4a..bdb5706 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 at 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 at gmail.com>
-Tested-by: Dave Turvene <dturvene at dahetral.com>
-Signed-off-by: Dmitry Torokhov <dmitry.torokhov at 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 at 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 at gmail.com>
-Tested-by: Dave Turvene <dturvene at dahetral.com>
-Signed-off-by: Dmitry Torokhov <dmitry.torokhov at 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 at 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 at gmail.com>
-Tested-by: Dave Turvene <dturvene at dahetral.com>
-Signed-off-by: Dmitry Torokhov <dmitry.torokhov at 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 at 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 at gmail.com>
-Tested-by: Dave Turvene <dturvene at dahetral.com>
-Signed-off-by: Dmitry Torokhov <dmitry.torokhov at 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 at 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 at gmail.com>
-Tested-by: Dave Turvene <dturvene at dahetral.com>
-Signed-off-by: Dmitry Torokhov <dmitry.torokhov at 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 at 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 at gmail.com>
-Tested-by: Dave Turvene <dturvene at dahetral.com>
-Signed-off-by: Dmitry Torokhov <dmitry.torokhov at 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 at 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 at gmail.com>
-Tested-by: Dave Turvene <dturvene at dahetral.com>
-Signed-off-by: Dmitry Torokhov <dmitry.torokhov at 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 at 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 at gmail.com>
-Tested-by: Dave Turvene <dturvene at dahetral.com>
-Signed-off-by: Dmitry Torokhov <dmitry.torokhov at 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 at 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 at gmail.com>
-Tested-by: Dave Turvene <dturvene at dahetral.com>
-Signed-off-by: Dmitry Torokhov <dmitry.torokhov at 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 at 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 at gmail.com>
-Tested-by: Dave Turvene <dturvene at dahetral.com>
-Signed-off-by: Dmitry Torokhov <dmitry.torokhov at 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 at 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 at gmail.com>
-Tested-by: Dave Turvene <dturvene at dahetral.com>
-Signed-off-by: Dmitry Torokhov <dmitry.torokhov at 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 at 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 at gmail.com>
-Tested-by: Dave Turvene <dturvene at dahetral.com>
-Signed-off-by: Dmitry Torokhov <dmitry.torokhov at 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 at 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 at gmail.com>
-Tested-by: Dave Turvene <dturvene at dahetral.com>
-Signed-off-by: Dmitry Torokhov <dmitry.torokhov at 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 at gmail.com>
 Date: Sat, 16 Feb 2013 22:40:03 -0800
diff --git a/config-arm-generic b/config-arm-generic
index f130622..d3e3613 100644
--- a/config-arm-generic
+++ b/config-arm-generic
@@ -111,6 +111,7 @@ CONFIG_ARCH_WANT_OPTIONAL_GPIOLIB=y
 CONFIG_GPIO_GENERIC_PLATFORM=m
 CONFIG_PINCTRL_SINGLE=m
 CONFIG_POWER_RESET_GPIO=y
+CONFIG_POWER_RESET_RESTART=y
 
 CONFIG_USB_ULPI=y
 
@@ -314,6 +315,7 @@ CONFIG_REGULATOR_ANATOP=m
 CONFIG_REGULATOR_FAN53555=m
 CONFIG_REGULATOR_ISL6271A=m
 CONFIG_REGULATOR_LP3972=m
+CONFIG_REGULATOR_LP8755=m
 CONFIG_REGULATOR_MAX1586=m
 CONFIG_REGULATOR_MAX8649=m
 CONFIG_REGULATOR_MAX8660=m
@@ -401,3 +403,4 @@ CONFIG_EXTCON_GPIO=m
 # CONFIG_CS89x0 is not set
 # CONFIG_DVB_USB_PCTV452E is not set
 # CONFIG_PINCTRL_EXYNOS is not set
+CONFIG_VIRTUALIZATION=y
diff --git a/config-arm-kirkwood b/config-arm-kirkwood
index f4fea29..e6a80f5 100644
--- a/config-arm-kirkwood
+++ b/config-arm-kirkwood
@@ -72,3 +72,4 @@ CONFIG_PINCTRL_KIRKWOOD=y
 
 
 CONFIG_FB_XGI=m
+CONFIG_POWER_RESET_QNAP=y
diff --git a/config-arm-omap b/config-arm-omap
index a539833..3038458 100644
--- a/config-arm-omap
+++ b/config-arm-omap
@@ -354,3 +354,5 @@ CONFIG_CRYPTO_DEV_OMAP_AES=m
 
 # CONFIG_OMAP2_DSS_DEBUG is not set
 # CONFIG_OMAP2_DSS_DEBUGFS is not set
+# CONFIG_ARM_PSCI is not set
+# CONFIG_WILINK_PLATFORM_DATA is not set
diff --git a/config-arm-tegra b/config-arm-tegra
index 869b172..ed9f636 100644
--- a/config-arm-tegra
+++ b/config-arm-tegra
@@ -107,3 +107,4 @@ CONFIG_OF_PCI=y
 CONFIG_OF_PCI_IRQ=y
 
 # CONFIG_DRM_TEGRA_DEBUG is not set
+# CONFIG_ARM_PSCI is not set
diff --git a/config-armv7 b/config-armv7
index c3af272..c8b782b 100644
--- a/config-armv7
+++ b/config-armv7
@@ -425,6 +425,25 @@ CONFIG_PERF_EVENTS=y
 # CONFIG_MFD_MAX8907 is not set
 # CONFIG_REGULATOR_FAN53555 is not set
 # CONFIG_REGULATOR_ANATOP is not set
+# CONFIG_REGULATOR_DUMMY is not set
+# CONFIG_REGULATOR_VIRTUAL_CONSUMER is not set
+# CONFIG_REGULATOR_USERSPACE_CONSUMER is not set
+# CONFIG_REGULATOR_GPIO is not set
+# CONFIG_REGULATOR_AD5398 is not set
+# CONFIG_REGULATOR_ISL6271A is not set
+# CONFIG_REGULATOR_MAX1586 is not set
+# CONFIG_REGULATOR_MAX8649 is not set
+# CONFIG_REGULATOR_MAX8660 is not set
+# CONFIG_REGULATOR_MAX8952 is not set
+# CONFIG_REGULATOR_MAX8973 is not set
+# CONFIG_REGULATOR_LP3971 is not set
+# CONFIG_REGULATOR_LP3972 is not set
+# CONFIG_REGULATOR_LP8755 is not set
+# CONFIG_REGULATOR_TPS51632 is not set
+# CONFIG_REGULATOR_TPS62360 is not set
+# CONFIG_REGULATOR_TPS65023 is not set
+# CONFIG_REGULATOR_TPS6507X is not set
+# CONFIG_REGULATOR_VEXPRESS is not set
 # CONFIG_IR_RX51 is not set
 # CONFIG_VIDEO_DM6446_CCDC is not set
 # CONFIG_PANEL_TAAL is not set
@@ -436,3 +455,11 @@ CONFIG_PERF_EVENTS=y
 # CONFIG_TOUCHSCREEN_EETI is not set
 # CONFIG_TOUCHSCREEN_EGALAX is not set
 # CONFIG_TOUCHSCREEN_AUO_PIXCIR is not set
+CONFIG_VIRTUALIZATION=y
+# CONFIG_CHARGER_MANAGER is not set
+# CONFIG_POWER_RESET_QNAP is not set
+# CONFIG_POWER_RESET_RESTART is not set
+# CONFIG_ARM_PSCI is not set
+# CONFIG_ARM_HIGHBANK_CPUFREQ is not set
+# CONFIG_RFKILL_REGULATOR is not set
+
diff --git a/config-generic b/config-generic
index f68e533..fa3e082 100644
--- a/config-generic
+++ b/config-generic
@@ -437,6 +437,7 @@ CONFIG_SCSI_OSD_DPRINT_SENSE=1
 # CONFIG_SCSI_OSD_DEBUG is not set
 
 CONFIG_SCSI_BNX2_ISCSI=m
+CONFIG_SCSI_BNX2X_FCOE=m
 CONFIG_BE2ISCSI=m
 CONFIG_SCSI_PMCRAID=m
 
@@ -761,6 +762,7 @@ CONFIG_NET_9P_RDMA=m
 # CONFIG_DECNET is not set
 CONFIG_BRIDGE=m
 CONFIG_BRIDGE_IGMP_SNOOPING=y
+CONFIG_BRIDGE_VLAN_FILTERING=y
 
 # PHY timestamping adds overhead
 CONFIG_NETWORK_PHY_TIMESTAMPING=y
@@ -803,10 +805,12 @@ CONFIG_NETFILTER_XT_TARGET_TEE=m
 CONFIG_NETFILTER_XT_TARGET_TPROXY=m
 
 CONFIG_NETFILTER_XT_MATCH_ADDRTYPE=m
+CONFIG_NETFILTER_XT_MATCH_BPF=m
 CONFIG_NETFILTER_XT_MATCH_CLUSTER=m
 CONFIG_NETFILTER_XT_MATCH_COMMENT=m
 CONFIG_NETFILTER_XT_MATCH_CPU=m
 CONFIG_NETFILTER_XT_MATCH_CONNBYTES=m
+CONFIG_NETFILTER_XT_MATCH_CONNLABEL=m
 CONFIG_NETFILTER_XT_MATCH_CONNMARK=m
 CONFIG_NETFILTER_XT_MATCH_CONNLIMIT=m
 CONFIG_NETFILTER_XT_MATCH_CONNTRACK=y
@@ -996,6 +1000,7 @@ CONFIG_SCTP_COOKIE_HMAC_SHA1=y
 CONFIG_ATM=m
 CONFIG_VLAN_8021Q=m
 CONFIG_VLAN_8021Q_GVRP=y
+CONFIG_VLAN_8021Q_MVRP=y
 CONFIG_LLC=m
 # CONFIG_LLC2 is not set
 CONFIG_IPX=m
@@ -1093,6 +1098,7 @@ CONFIG_BATMAN_ADV_BLA=y
 CONFIG_BATMAN_ADV_DAT=y
 # CONFIG_BATMAN_ADV_DEBUG is not set
 CONFIG_OPENVSWITCH=m
+CONFIG_VSOCKETS=m
 CONFIG_NETPRIO_CGROUP=m
 
 
@@ -1260,6 +1266,7 @@ CONFIG_E100=m
 CONFIG_E1000=m
 CONFIG_E1000E=m
 CONFIG_IGB=m
+CONFIG_IGB_HWMON=y
 CONFIG_IGB_DCA=y
 CONFIG_IGB_PTP=y
 CONFIG_IGBVF=m
@@ -1412,6 +1419,8 @@ CONFIG_NET_PCI=y
 CONFIG_B44=m
 CONFIG_B44_PCI=y
 CONFIG_BNX2=m
+CONFIG_BNX2X=m
+CONFIG_BNX2X_SRIOV=y
 CONFIG_CNIC=m
 CONFIG_FEALNX=m
 CONFIG_NET_POCKET=y
@@ -1579,6 +1588,8 @@ CONFIG_LIBERTAS_SDIO=m
 # CONFIG_LIBERTAS_THINFIRM is not set
 CONFIG_LIBERTAS_MESH=y
 CONFIG_IWLWIFI=m
+CONFIG_IWLDVM=m
+CONFIG_IWLMVM=m
 CONFIG_IWLWIFI_DEBUG=y
 CONFIG_IWLWIFI_DEBUGFS=y
 CONFIG_IWLWIFI_DEVICE_SVTOOL=y
@@ -1620,7 +1631,6 @@ CONFIG_RT2800PCI_RT53XX=y
 CONFIG_RT73USB=m
 CONFIG_RTL8180=m
 CONFIG_RTL8187=m
-# CONFIG_RTLWIFI_DEBUG is not set
 # CONFIG_USB_ZD1201 is not set
 CONFIG_USB_NET_RNDIS_WLAN=m
 CONFIG_USB_NET_KALMIA=m
@@ -1641,6 +1651,8 @@ CONFIG_WL1251=m
 CONFIG_WL1251_SPI=m
 CONFIG_WL1251_SDIO=m
 
+CONFIG_RTLWIFI=m
+# CONFIG_RTLWIFI_DEBUG is not set
 CONFIG_RTL8192CE=m
 CONFIG_RTL8192SE=m
 CONFIG_RTL8192CU=m
@@ -1701,9 +1713,11 @@ CONFIG_NFC_LLCP=y
 #
 # Near Field Communication (NFC) devices
 #
-CONFIG_PN544_NFC=m
-CONFIG_PN544_HCI_NFC=m
+CONFIG_NFC_PN544=m
+CONFIG_NFC_PN544_I2C=m
 CONFIG_NFC_PN533=m
+CONFIG_NFC_MICROREAD=m
+CONFIG_NFC_MICROREAD_I2C=m
 
 #
 # IrDA (infrared) support
@@ -1998,6 +2012,7 @@ CONFIG_MOUSE_APPLETOUCH=m
 CONFIG_MOUSE_BCM5974=m
 CONFIG_MOUSE_SYNAPTICS_I2C=m
 CONFIG_MOUSE_SYNAPTICS_USB=m
+CONFIG_MOUSE_CYAPA=m
 CONFIG_INPUT_JOYSTICK=y
 CONFIG_JOYSTICK_ANALOG=m
 CONFIG_JOYSTICK_A3D=m
@@ -2285,6 +2300,7 @@ CONFIG_SENSORS_LM93=m
 CONFIG_SENSORS_LTC4245=m
 CONFIG_SENSORS_MAX1619=m
 CONFIG_SENSORS_MAX6650=m
+CONFIG_SENSORS_MAX6697=m
 CONFIG_SENSORS_MCP3021=m
 CONFIG_SENSORS_NTC_THERMISTOR=m
 CONFIG_SENSORS_PC87360=m
@@ -2325,6 +2341,7 @@ CONFIG_SENSORS_WM831X=m
 CONFIG_SENSORS_LM73=m
 CONFIG_SENSORS_AMC6821=m
 CONFIG_SENSORS_INA2XX=m
+CONFIG_SENSORS_INA209=m
 CONFIG_SENSORS_ADT7411=m
 CONFIG_SENSORS_ASC7621=m
 CONFIG_SENSORS_EMC1403=m
@@ -4305,6 +4322,7 @@ CONFIG_APM_POWER=m
 # CONFIG_BATTERY_BQ27x00 is not set
 # CONFIG_BATTERY_MAX17040 is not set
 # CONFIG_BATTERY_MAX17042 is not set
+# CONFIG_BATTERY_GOLDFISH is not set
 
 # CONFIG_CHARGER_ISP1704 is not set
 # CONFIG_CHARGER_MAX8903 is not set
@@ -4350,9 +4368,6 @@ CONFIG_LIRC_TTUSBIR=m
 
 # CONFIG_DEVKMEM is not set
 
-CONFIG_BNX2X=m
-CONFIG_SCSI_BNX2X_FCOE=m
-
 CONFIG_NOZOMI=m
 # CONFIG_TPS65010 is not set
 
@@ -4641,6 +4656,8 @@ CONFIG_BCMA_DRIVER_GPIO=y
 # CONFIG_INTEL_MID_PTI is not set
 CONFIG_IOMMU_SUPPORT=y
 
+# CONFIG_MAILBOX is not set
+
 # CONFIG_HSI is not set
 
 # CONFIG_PM_DEVFREQ is not set
diff --git a/config-x86-generic b/config-x86-generic
index b249198..4791cdc 100644
--- a/config-x86-generic
+++ b/config-x86-generic
@@ -67,7 +67,7 @@ CONFIG_ACPI_AC=y
 # CONFIG_ACPI_ASUS is not set
 CONFIG_ACPI_BATTERY=y
 CONFIG_ACPI_BUTTON=y
-CONFIG_ACPI_CONTAINER=m
+CONFIG_ACPI_CONTAINER=y
 CONFIG_ACPI_DOCK=y
 CONFIG_ACPI_FAN=y
 CONFIG_ACPI_NUMA=y
@@ -94,6 +94,7 @@ CONFIG_ACPI_IPMI=m
 CONFIG_ACPI_CUSTOM_METHOD=m
 CONFIG_ACPI_BGRT=y
 
+CONFIG_X86_INTEL_PSTATE=y
 CONFIG_X86_ACPI_CPUFREQ=y
 CONFIG_X86_PCC_CPUFREQ=y
 CONFIG_X86_ACPI_CPUFREQ_CPB=y
@@ -427,6 +428,8 @@ CONFIG_INTEL_MEI=m
 # Maybe enable in debug kernels?
 # CONFIG_DEBUG_NMI_SELFTEST is not set
 
+# CONFIG_X86_INTEL_LPSS is not set
+
 CONFIG_MPILIB=y
 CONFIG_PKCS7_MESSAGE_PARSER=y
 CONFIG_PE_FILE_PARSER=y
diff --git a/kernel.spec b/kernel.spec
index a9cb5da..34bf95e 100644
--- a/kernel.spec
+++ b/kernel.spec
@@ -95,7 +95,7 @@ Summary: The Linux kernel
 # The rc snapshot level
 %define rcrev 0
 # The git snapshot level
-%define gitrev 1
+%define gitrev 2
 # Set rpm version accordingly
 %define rpmversion 3.%{upstream_sublevel}.0
 %endif
@@ -660,7 +660,6 @@ Patch460: serial-460800.patch
 Patch470: die-floppy-die.patch
 
 Patch510: silence-noise.patch
-Patch520: quiet-apm.patch
 Patch530: silence-fbcon-logo.patch
 
 Patch800: crash-driver.patch
@@ -713,7 +712,6 @@ Patch21000: arm-export-read_current_timer.patch
 Patch21001: arm-allnoconfig-error-__LINUX_ARM_ARCH__-undeclared.patch
 
 # IMX
-Patch21003: arm-imx-fixdrm.patch
 
 # ARM tegra
 Patch21004: arm-tegra-nvec-kconfig.patch
@@ -727,17 +725,9 @@ Patch21235: scsi-sd_revalidate_disk-prevent-NULL-ptr-deref.patch
 #rhbz 859485
 Patch21226: vt-Drop-K_OFF-for-VC_MUTE.patch
 
-#rhbz 799564
-Patch21240: Input-increase-struct-ps2dev-cmdbuf-to-8-bytes.patch
-Patch21241: Input-add-support-for-Cypress-PS2-Trackpads.patch
-
 # https://fedoraproject.org/wiki/Features/Checkpoint_Restore
 Patch21242: criu-no-expert.patch
 
-#rhbz 830151
-Patch21243: mac80211-improve-latency-and-throughput-while-software.patch
-Patch21244: iwlegacy-add-flush-callback.patch
-
 #rhbz 892811
 Patch21247: ath9k_rx_dma_stop_check.patch
 
@@ -1320,7 +1310,6 @@ ApplyPatch arm-export-read_current_timer.patch
 ApplyPatch arm-allnoconfig-error-__LINUX_ARM_ARCH__-undeclared.patch
 # ApplyPatch arm-tegra-nvec-kconfig.patch
 ApplyPatch arm-tegra-usb-no-reset-linux33.patch
-ApplyPatch arm-imx-fixdrm.patch
 
 #
 # bugfixes to drivers and filesystems
@@ -1403,7 +1392,6 @@ ApplyPatch drm-i915-dp-stfu.patch
 
 # silence the ACPI blacklist code
 ApplyPatch silence-acpi-blacklist.patch
-ApplyPatch quiet-apm.patch
 
 # V4L/DVB updates/fixes/experimental drivers
 #  apply if non-empty
@@ -1437,17 +1425,9 @@ ApplyPatch selinux-apply-different-permission-to-ptrace-child.patch
 #rhbz 859485
 ApplyPatch vt-Drop-K_OFF-for-VC_MUTE.patch
 
-#rhbz 799564
-ApplyPatch Input-increase-struct-ps2dev-cmdbuf-to-8-bytes.patch
-ApplyPatch Input-add-support-for-Cypress-PS2-Trackpads.patch
-
 # https://fedoraproject.org/wiki/Features/Checkpoint_Restore
 ApplyPatch criu-no-expert.patch
 
-#rhbz 830151
-ApplyPatch mac80211-improve-latency-and-throughput-while-software.patch
-ApplyPatch iwlegacy-add-flush-callback.patch
-
 #rhbz 892811
 ApplyPatch ath9k_rx_dma_stop_check.patch
 
@@ -2318,6 +2298,9 @@ fi
 #                 ||----w |
 #                 ||     ||
 %changelog
+* Thu Feb 21 2013 Josh Boyer <jwboyer at redhat.com> - 3.9.0-0.rc0.git2.1
+- Linux v3.8-3040-ga0b1c42
+
 * Thu Feb 21 2013 Josh Boyer <jwboyer at redhat.com> - 3.9.0-0.rc0.git1.1
 - Linux v3.8-523-gece8e0b
 - Reenable debugging options.
diff --git a/sources b/sources
index 0aef63a..eb62ac8 100644
--- a/sources
+++ b/sources
@@ -1,2 +1,2 @@
 1c738edfc54e7c65faeb90c436104e2f  linux-3.8.tar.xz
-e8c574e49c19369289860cfc5be46d39  patch-3.8-git1.xz
+5d95877e03c43facdd040079c226ed03  patch-3.8-git2.xz


More information about the scm-commits mailing list