summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--Input-add-support-for-Cypress-PS2-Trackpads.patch1063
-rw-r--r--Input-increase-struct-ps2dev-cmdbuf-to-8-bytes.patch30
-rw-r--r--alps-v2.patch2246
-rw-r--r--arm-imx-fixdrm.patch37
-rw-r--r--config-arm-generic3
-rw-r--r--config-arm-kirkwood1
-rw-r--r--config-arm-omap2
-rw-r--r--config-arm-tegra1
-rw-r--r--config-armv727
-rw-r--r--config-generic29
-rw-r--r--config-x86-generic5
-rw-r--r--iwlegacy-add-flush-callback.patch103
-rw-r--r--kernel.spec25
-rw-r--r--mac80211-improve-latency-and-throughput-while-software.patch142
-rw-r--r--quiet-apm.patch13
-rw-r--r--sources2
16 files changed, 66 insertions, 3663 deletions
diff --git a/Input-add-support-for-Cypress-PS2-Trackpads.patch b/Input-add-support-for-Cypress-PS2-Trackpads.patch
deleted file mode 100644
index 8c5e569f9..000000000
--- a/Input-add-support-for-Cypress-PS2-Trackpads.patch
+++ /dev/null
@@ -1,1063 +0,0 @@
-From 0799a924bc93ba46a23e8e7e6b1431ab585fd2ea Mon Sep 17 00:00:00 2001
-From: Dudley Du <dudl@cypress.com>
-Date: Sat, 5 Jan 2013 00:14:22 -0800
-Subject: [PATCH] Input: add support for Cypress PS/2 Trackpads
-
-This driver, submitted on behalf of Cypress Semiconductor Corporation and
-additional contributors, provides support for the Cypress PS/2 Trackpad.
-
-Original code contributed by Dudley Du (Cypress Semiconductor Corporation),
-modified by Kamal Mostafa and Kyle Fazzari.
-
-BugLink: http://launchpad.net/bugs/978807
-
-Signed-off-by: Dudley Du <dudl@cypress.com>
-Signed-off-by: Kamal Mostafa <kamal@canonical.com>
-Signed-off-by: Kyle Fazzari <git@status.e4ward.com>
-Signed-off-by: Mario Limonciello <mario_limonciello@dell.com>
-Signed-off-by: Tim Gardner <tim.gardner@canonical.com>
-Acked-by: Herton Krzesinski <herton.krzesinski@canonical.com>
-Reviewed-by: Henrik Rydberg <rydberg@euromail.se>
-Reviewed-by: Dudley Du <dudl@cypress.com>
-Signed-off-by: Dmitry Torokhov <dmitry.torokhov@gmail.com>
----
- drivers/input/mouse/Kconfig | 10 +
- drivers/input/mouse/Makefile | 1 +
- drivers/input/mouse/cypress_ps2.c | 725 ++++++++++++++++++++++++++++++++++++
- drivers/input/mouse/cypress_ps2.h | 191 ++++++++++
- drivers/input/mouse/psmouse-base.c | 32 ++
- drivers/input/mouse/psmouse.h | 1 +
- 6 files changed, 960 insertions(+), 0 deletions(-)
- create mode 100644 drivers/input/mouse/cypress_ps2.c
- create mode 100644 drivers/input/mouse/cypress_ps2.h
-
-diff --git a/drivers/input/mouse/Kconfig b/drivers/input/mouse/Kconfig
-index cd6268c..88954dd 100644
---- a/drivers/input/mouse/Kconfig
-+++ b/drivers/input/mouse/Kconfig
-@@ -68,6 +68,16 @@ config MOUSE_PS2_SYNAPTICS
-
- If unsure, say Y.
-
-+config MOUSE_PS2_CYPRESS
-+ bool "Cypress PS/2 mouse protocol extension" if EXPERT
-+ default y
-+ depends on MOUSE_PS2
-+ help
-+ Say Y here if you have a Cypress PS/2 Trackpad connected to
-+ your system.
-+
-+ If unsure, say Y.
-+
- config MOUSE_PS2_LIFEBOOK
- bool "Fujitsu Lifebook PS/2 mouse protocol extension" if EXPERT
- default y
-diff --git a/drivers/input/mouse/Makefile b/drivers/input/mouse/Makefile
-index 46ba755..323e352 100644
---- a/drivers/input/mouse/Makefile
-+++ b/drivers/input/mouse/Makefile
-@@ -32,3 +32,4 @@ psmouse-$(CONFIG_MOUSE_PS2_LIFEBOOK) += lifebook.o
- psmouse-$(CONFIG_MOUSE_PS2_SENTELIC) += sentelic.o
- psmouse-$(CONFIG_MOUSE_PS2_TRACKPOINT) += trackpoint.o
- psmouse-$(CONFIG_MOUSE_PS2_TOUCHKIT) += touchkit_ps2.o
-+psmouse-$(CONFIG_MOUSE_PS2_CYPRESS) += cypress_ps2.o
-diff --git a/drivers/input/mouse/cypress_ps2.c b/drivers/input/mouse/cypress_ps2.c
-new file mode 100644
-index 0000000..1673dc6
---- /dev/null
-+++ b/drivers/input/mouse/cypress_ps2.c
-@@ -0,0 +1,725 @@
-+/*
-+ * Cypress Trackpad PS/2 mouse driver
-+ *
-+ * Copyright (c) 2012 Cypress Semiconductor Corporation.
-+ *
-+ * Author:
-+ * Dudley Du <dudl@cypress.com>
-+ *
-+ * Additional contributors include:
-+ * Kamal Mostafa <kamal@canonical.com>
-+ * Kyle Fazzari <git@status.e4ward.com>
-+ *
-+ * This program is free software; you can redistribute it and/or modify it
-+ * under the terms of the GNU General Public License version 2 as published by
-+ * the Free Software Foundation.
-+ */
-+
-+#include <linux/init.h>
-+#include <linux/module.h>
-+#include <linux/kernel.h>
-+#include <linux/slab.h>
-+#include <linux/serio.h>
-+#include <linux/libps2.h>
-+#include <linux/input.h>
-+#include <linux/input/mt.h>
-+#include <linux/sched.h>
-+#include <linux/wait.h>
-+
-+#include "cypress_ps2.h"
-+
-+#undef CYTP_DEBUG_VERBOSE /* define this and DEBUG for more verbose dump */
-+
-+static void cypress_set_packet_size(struct psmouse *psmouse, unsigned int n)
-+{
-+ struct cytp_data *cytp = psmouse->private;
-+ cytp->pkt_size = n;
-+}
-+
-+static const unsigned char cytp_rate[] = {10, 20, 40, 60, 100, 200};
-+static const unsigned char cytp_resolution[] = {0x00, 0x01, 0x02, 0x03};
-+
-+static int cypress_ps2_sendbyte(struct psmouse *psmouse, int value)
-+{
-+ struct ps2dev *ps2dev = &psmouse->ps2dev;
-+
-+ if (ps2_sendbyte(ps2dev, value & 0xff, CYTP_CMD_TIMEOUT) < 0) {
-+ psmouse_dbg(psmouse,
-+ "sending command 0x%02x failed, resp 0x%02x\n",
-+ value & 0xff, ps2dev->nak);
-+ if (ps2dev->nak == CYTP_PS2_RETRY)
-+ return CYTP_PS2_RETRY;
-+ else
-+ return CYTP_PS2_ERROR;
-+ }
-+
-+#ifdef CYTP_DEBUG_VERBOSE
-+ psmouse_dbg(psmouse, "sending command 0x%02x succeeded, resp 0xfa\n",
-+ value & 0xff);
-+#endif
-+
-+ return 0;
-+}
-+
-+static int cypress_ps2_ext_cmd(struct psmouse *psmouse, unsigned short cmd,
-+ unsigned char data)
-+{
-+ struct ps2dev *ps2dev = &psmouse->ps2dev;
-+ int tries = CYTP_PS2_CMD_TRIES;
-+ int rc;
-+
-+ ps2_begin_command(ps2dev);
-+
-+ do {
-+ /*
-+ * Send extension command byte (0xE8 or 0xF3).
-+ * If sending the command fails, send recovery command
-+ * to make the device return to the ready state.
-+ */
-+ rc = cypress_ps2_sendbyte(psmouse, cmd & 0xff);
-+ if (rc == CYTP_PS2_RETRY) {
-+ rc = cypress_ps2_sendbyte(psmouse, 0x00);
-+ if (rc == CYTP_PS2_RETRY)
-+ rc = cypress_ps2_sendbyte(psmouse, 0x0a);
-+ }
-+ if (rc == CYTP_PS2_ERROR)
-+ continue;
-+
-+ rc = cypress_ps2_sendbyte(psmouse, data);
-+ if (rc == CYTP_PS2_RETRY)
-+ rc = cypress_ps2_sendbyte(psmouse, data);
-+ if (rc == CYTP_PS2_ERROR)
-+ continue;
-+ else
-+ break;
-+ } while (--tries > 0);
-+
-+ ps2_end_command(ps2dev);
-+
-+ return rc;
-+}
-+
-+static int cypress_ps2_read_cmd_status(struct psmouse *psmouse,
-+ unsigned char cmd,
-+ unsigned char *param)
-+{
-+ int rc;
-+ struct ps2dev *ps2dev = &psmouse->ps2dev;
-+ enum psmouse_state old_state;
-+ int pktsize;
-+
-+ ps2_begin_command(&psmouse->ps2dev);
-+
-+ old_state = psmouse->state;
-+ psmouse->state = PSMOUSE_CMD_MODE;
-+ psmouse->pktcnt = 0;
-+
-+ pktsize = (cmd == CYTP_CMD_READ_TP_METRICS) ? 8 : 3;
-+ memset(param, 0, pktsize);
-+
-+ rc = cypress_ps2_sendbyte(psmouse, 0xe9);
-+ if (rc < 0)
-+ goto out;
-+
-+ wait_event_timeout(ps2dev->wait,
-+ (psmouse->pktcnt >= pktsize),
-+ msecs_to_jiffies(CYTP_CMD_TIMEOUT));
-+
-+ memcpy(param, psmouse->packet, pktsize);
-+
-+ psmouse_dbg(psmouse, "Command 0x%02x response data (0x): %*ph\n",
-+ cmd, pktsize, param);
-+
-+out:
-+ psmouse->state = old_state;
-+ psmouse->pktcnt = 0;
-+
-+ ps2_end_command(&psmouse->ps2dev);
-+
-+ return rc;
-+}
-+
-+static bool cypress_verify_cmd_state(struct psmouse *psmouse,
-+ unsigned char cmd, unsigned char *param)
-+{
-+ bool rate_match = false;
-+ bool resolution_match = false;
-+ int i;
-+
-+ /* callers will do further checking. */
-+ if (cmd == CYTP_CMD_READ_CYPRESS_ID ||
-+ cmd == CYTP_CMD_STANDARD_MODE ||
-+ cmd == CYTP_CMD_READ_TP_METRICS)
-+ return true;
-+
-+ if ((~param[0] & DFLT_RESP_BITS_VALID) == DFLT_RESP_BITS_VALID &&
-+ (param[0] & DFLT_RESP_BIT_MODE) == DFLT_RESP_STREAM_MODE) {
-+ for (i = 0; i < sizeof(cytp_resolution); i++)
-+ if (cytp_resolution[i] == param[1])
-+ resolution_match = true;
-+
-+ for (i = 0; i < sizeof(cytp_rate); i++)
-+ if (cytp_rate[i] == param[2])
-+ rate_match = true;
-+
-+ if (resolution_match && rate_match)
-+ return true;
-+ }
-+
-+ psmouse_dbg(psmouse, "verify cmd state failed.\n");
-+ return false;
-+}
-+
-+static int cypress_send_ext_cmd(struct psmouse *psmouse, unsigned char cmd,
-+ unsigned char *param)
-+{
-+ int tries = CYTP_PS2_CMD_TRIES;
-+ int rc;
-+
-+ psmouse_dbg(psmouse, "send extension cmd 0x%02x, [%d %d %d %d]\n",
-+ cmd, DECODE_CMD_AA(cmd), DECODE_CMD_BB(cmd),
-+ DECODE_CMD_CC(cmd), DECODE_CMD_DD(cmd));
-+
-+ do {
-+ cypress_ps2_ext_cmd(psmouse,
-+ PSMOUSE_CMD_SETRES, DECODE_CMD_DD(cmd));
-+ cypress_ps2_ext_cmd(psmouse,
-+ PSMOUSE_CMD_SETRES, DECODE_CMD_CC(cmd));
-+ cypress_ps2_ext_cmd(psmouse,
-+ PSMOUSE_CMD_SETRES, DECODE_CMD_BB(cmd));
-+ cypress_ps2_ext_cmd(psmouse,
-+ PSMOUSE_CMD_SETRES, DECODE_CMD_AA(cmd));
-+
-+ rc = cypress_ps2_read_cmd_status(psmouse, cmd, param);
-+ if (rc)
-+ continue;
-+
-+ if (cypress_verify_cmd_state(psmouse, cmd, param))
-+ return 0;
-+
-+ } while (--tries > 0);
-+
-+ return -EIO;
-+}
-+
-+int cypress_detect(struct psmouse *psmouse, bool set_properties)
-+{
-+ unsigned char param[3];
-+
-+ if (cypress_send_ext_cmd(psmouse, CYTP_CMD_READ_CYPRESS_ID, param))
-+ return -ENODEV;
-+
-+ /* Check for Cypress Trackpad signature bytes: 0x33 0xCC */
-+ if (param[0] != 0x33 || param[1] != 0xCC)
-+ return -ENODEV;
-+
-+ if (set_properties) {
-+ psmouse->vendor = "Cypress";
-+ psmouse->name = "Trackpad";
-+ }
-+
-+ return 0;
-+}
-+
-+static int cypress_read_fw_version(struct psmouse *psmouse)
-+{
-+ struct cytp_data *cytp = psmouse->private;
-+ unsigned char param[3];
-+
-+ if (cypress_send_ext_cmd(psmouse, CYTP_CMD_READ_CYPRESS_ID, param))
-+ return -ENODEV;
-+
-+ /* Check for Cypress Trackpad signature bytes: 0x33 0xCC */
-+ if (param[0] != 0x33 || param[1] != 0xCC)
-+ return -ENODEV;
-+
-+ cytp->fw_version = param[2] & FW_VERSION_MASX;
-+ cytp->tp_metrics_supported = (param[2] & TP_METRICS_MASK) ? 1 : 0;
-+
-+ psmouse_dbg(psmouse, "cytp->fw_version = %d\n", cytp->fw_version);
-+ psmouse_dbg(psmouse, "cytp->tp_metrics_supported = %d\n",
-+ cytp->tp_metrics_supported);
-+
-+ return 0;
-+}
-+
-+static int cypress_read_tp_metrics(struct psmouse *psmouse)
-+{
-+ struct cytp_data *cytp = psmouse->private;
-+ unsigned char param[8];
-+
-+ /* set default values for tp metrics. */
-+ cytp->tp_width = CYTP_DEFAULT_WIDTH;
-+ cytp->tp_high = CYTP_DEFAULT_HIGH;
-+ cytp->tp_max_abs_x = CYTP_ABS_MAX_X;
-+ cytp->tp_max_abs_y = CYTP_ABS_MAX_Y;
-+ cytp->tp_min_pressure = CYTP_MIN_PRESSURE;
-+ cytp->tp_max_pressure = CYTP_MAX_PRESSURE;
-+ cytp->tp_res_x = cytp->tp_max_abs_x / cytp->tp_width;
-+ cytp->tp_res_y = cytp->tp_max_abs_y / cytp->tp_high;
-+
-+ memset(param, 0, sizeof(param));
-+ if (cypress_send_ext_cmd(psmouse, CYTP_CMD_READ_TP_METRICS, param) == 0) {
-+ /* Update trackpad parameters. */
-+ cytp->tp_max_abs_x = (param[1] << 8) | param[0];
-+ cytp->tp_max_abs_y = (param[3] << 8) | param[2];
-+ cytp->tp_min_pressure = param[4];
-+ cytp->tp_max_pressure = param[5];
-+ }
-+
-+ if (!cytp->tp_max_pressure ||
-+ cytp->tp_max_pressure < cytp->tp_min_pressure ||
-+ !cytp->tp_width || !cytp->tp_high ||
-+ !cytp->tp_max_abs_x ||
-+ cytp->tp_max_abs_x < cytp->tp_width ||
-+ !cytp->tp_max_abs_y ||
-+ cytp->tp_max_abs_y < cytp->tp_high)
-+ return -EINVAL;
-+
-+ cytp->tp_res_x = cytp->tp_max_abs_x / cytp->tp_width;
-+ cytp->tp_res_y = cytp->tp_max_abs_y / cytp->tp_high;
-+
-+#ifdef CYTP_DEBUG_VERBOSE
-+ psmouse_dbg(psmouse, "Dump trackpad hardware configuration as below:\n");
-+ psmouse_dbg(psmouse, "cytp->tp_width = %d\n", cytp->tp_width);
-+ psmouse_dbg(psmouse, "cytp->tp_high = %d\n", cytp->tp_high);
-+ psmouse_dbg(psmouse, "cytp->tp_max_abs_x = %d\n", cytp->tp_max_abs_x);
-+ psmouse_dbg(psmouse, "cytp->tp_max_abs_y = %d\n", cytp->tp_max_abs_y);
-+ psmouse_dbg(psmouse, "cytp->tp_min_pressure = %d\n", cytp->tp_min_pressure);
-+ psmouse_dbg(psmouse, "cytp->tp_max_pressure = %d\n", cytp->tp_max_pressure);
-+ psmouse_dbg(psmouse, "cytp->tp_res_x = %d\n", cytp->tp_res_x);
-+ psmouse_dbg(psmouse, "cytp->tp_res_y = %d\n", cytp->tp_res_y);
-+
-+ psmouse_dbg(psmouse, "tp_type_APA = %d\n",
-+ (param[6] & TP_METRICS_BIT_APA) ? 1 : 0);
-+ psmouse_dbg(psmouse, "tp_type_MTG = %d\n",
-+ (param[6] & TP_METRICS_BIT_MTG) ? 1 : 0);
-+ psmouse_dbg(psmouse, "tp_palm = %d\n",
-+ (param[6] & TP_METRICS_BIT_PALM) ? 1 : 0);
-+ psmouse_dbg(psmouse, "tp_stubborn = %d\n",
-+ (param[6] & TP_METRICS_BIT_STUBBORN) ? 1 : 0);
-+ psmouse_dbg(psmouse, "tp_1f_jitter = %d\n",
-+ (param[6] & TP_METRICS_BIT_1F_JITTER) >> 2);
-+ psmouse_dbg(psmouse, "tp_2f_jitter = %d\n",
-+ (param[6] & TP_METRICS_BIT_2F_JITTER) >> 4);
-+ psmouse_dbg(psmouse, "tp_1f_spike = %d\n",
-+ param[7] & TP_METRICS_BIT_1F_SPIKE);
-+ psmouse_dbg(psmouse, "tp_2f_spike = %d\n",
-+ (param[7] & TP_METRICS_BIT_2F_SPIKE) >> 2);
-+ psmouse_dbg(psmouse, "tp_abs_packet_format_set = %d\n",
-+ (param[7] & TP_METRICS_BIT_ABS_PKT_FORMAT_SET) >> 4);
-+#endif
-+
-+ return 0;
-+}
-+
-+static int cypress_query_hardware(struct psmouse *psmouse)
-+{
-+ struct cytp_data *cytp = psmouse->private;
-+ int ret;
-+
-+ ret = cypress_read_fw_version(psmouse);
-+ if (ret)
-+ return ret;
-+
-+ if (cytp->tp_metrics_supported) {
-+ ret = cypress_read_tp_metrics(psmouse);
-+ if (ret)
-+ return ret;
-+ }
-+
-+ return 0;
-+}
-+
-+static int cypress_set_absolute_mode(struct psmouse *psmouse)
-+{
-+ struct cytp_data *cytp = psmouse->private;
-+ unsigned char param[3];
-+
-+ if (cypress_send_ext_cmd(psmouse, CYTP_CMD_ABS_WITH_PRESSURE_MODE, param) < 0)
-+ return -1;
-+
-+ cytp->mode = (cytp->mode & ~CYTP_BIT_ABS_REL_MASK)
-+ | CYTP_BIT_ABS_PRESSURE;
-+ cypress_set_packet_size(psmouse, 5);
-+
-+ return 0;
-+}
-+
-+/*
-+ * Reset trackpad device.
-+ * This is also the default mode when trackpad powered on.
-+ */
-+static void cypress_reset(struct psmouse *psmouse)
-+{
-+ struct cytp_data *cytp = psmouse->private;
-+
-+ cytp->mode = 0;
-+
-+ psmouse_reset(psmouse);
-+}
-+
-+static int cypress_set_input_params(struct input_dev *input,
-+ struct cytp_data *cytp)
-+{
-+ int ret;
-+
-+ if (!cytp->tp_res_x || !cytp->tp_res_y)
-+ return -EINVAL;
-+
-+ __set_bit(EV_ABS, input->evbit);
-+ input_set_abs_params(input, ABS_X, 0, cytp->tp_max_abs_x, 0, 0);
-+ input_set_abs_params(input, ABS_Y, 0, cytp->tp_max_abs_y, 0, 0);
-+ input_set_abs_params(input, ABS_PRESSURE,
-+ cytp->tp_min_pressure, cytp->tp_max_pressure, 0, 0);
-+ input_set_abs_params(input, ABS_TOOL_WIDTH, 0, 255, 0, 0);
-+
-+ /* finger position */
-+ input_set_abs_params(input, ABS_MT_POSITION_X, 0, cytp->tp_max_abs_x, 0, 0);
-+ input_set_abs_params(input, ABS_MT_POSITION_Y, 0, cytp->tp_max_abs_y, 0, 0);
-+ input_set_abs_params(input, ABS_MT_PRESSURE, 0, 255, 0, 0);
-+
-+ ret = input_mt_init_slots(input, CYTP_MAX_MT_SLOTS,
-+ INPUT_MT_DROP_UNUSED|INPUT_MT_TRACK);
-+ if (ret < 0)
-+ return ret;
-+
-+ __set_bit(INPUT_PROP_SEMI_MT, input->propbit);
-+
-+ input_abs_set_res(input, ABS_X, cytp->tp_res_x);
-+ input_abs_set_res(input, ABS_Y, cytp->tp_res_y);
-+
-+ input_abs_set_res(input, ABS_MT_POSITION_X, cytp->tp_res_x);
-+ input_abs_set_res(input, ABS_MT_POSITION_Y, cytp->tp_res_y);
-+
-+ __set_bit(BTN_TOUCH, input->keybit);
-+ __set_bit(BTN_TOOL_FINGER, input->keybit);
-+ __set_bit(BTN_TOOL_DOUBLETAP, input->keybit);
-+ __set_bit(BTN_TOOL_TRIPLETAP, input->keybit);
-+ __set_bit(BTN_TOOL_QUADTAP, input->keybit);
-+ __set_bit(BTN_TOOL_QUINTTAP, input->keybit);
-+
-+ __clear_bit(EV_REL, input->evbit);
-+ __clear_bit(REL_X, input->relbit);
-+ __clear_bit(REL_Y, input->relbit);
-+
-+ __set_bit(INPUT_PROP_BUTTONPAD, input->propbit);
-+ __set_bit(EV_KEY, input->evbit);
-+ __set_bit(BTN_LEFT, input->keybit);
-+ __set_bit(BTN_RIGHT, input->keybit);
-+ __set_bit(BTN_MIDDLE, input->keybit);
-+
-+ input_set_drvdata(input, cytp);
-+
-+ return 0;
-+}
-+
-+static int cypress_get_finger_count(unsigned char header_byte)
-+{
-+ unsigned char bits6_7;
-+ int finger_count;
-+
-+ bits6_7 = header_byte >> 6;
-+ finger_count = bits6_7 & 0x03;
-+
-+ if (finger_count == 1)
-+ return 1;
-+
-+ if (header_byte & ABS_HSCROLL_BIT) {
-+ /* HSCROLL gets added on to 0 finger count. */
-+ switch (finger_count) {
-+ case 0: return 4;
-+ case 2: return 5;
-+ default:
-+ /* Invalid contact (e.g. palm). Ignore it. */
-+ return -1;
-+ }
-+ }
-+
-+ return finger_count;
-+}
-+
-+
-+static int cypress_parse_packet(struct psmouse *psmouse,
-+ struct cytp_data *cytp, struct cytp_report_data *report_data)
-+{
-+ unsigned char *packet = psmouse->packet;
-+ unsigned char header_byte = packet[0];
-+ int contact_cnt;
-+
-+ memset(report_data, 0, sizeof(struct cytp_report_data));
-+
-+ contact_cnt = cypress_get_finger_count(header_byte);
-+
-+ if (contact_cnt < 0) /* e.g. palm detect */
-+ return -EINVAL;
-+
-+ report_data->contact_cnt = contact_cnt;
-+
-+ report_data->tap = (header_byte & ABS_MULTIFINGER_TAP) ? 1 : 0;
-+
-+ if (report_data->contact_cnt == 1) {
-+ report_data->contacts[0].x =
-+ ((packet[1] & 0x70) << 4) | packet[2];
-+ report_data->contacts[0].y =
-+ ((packet[1] & 0x07) << 8) | packet[3];
-+ if (cytp->mode & CYTP_BIT_ABS_PRESSURE)
-+ report_data->contacts[0].z = packet[4];
-+
-+ } else if (report_data->contact_cnt >= 2) {
-+ report_data->contacts[0].x =
-+ ((packet[1] & 0x70) << 4) | packet[2];
-+ report_data->contacts[0].y =
-+ ((packet[1] & 0x07) << 8) | packet[3];
-+ if (cytp->mode & CYTP_BIT_ABS_PRESSURE)
-+ report_data->contacts[0].z = packet[4];
-+
-+ report_data->contacts[1].x =
-+ ((packet[5] & 0xf0) << 4) | packet[6];
-+ report_data->contacts[1].y =
-+ ((packet[5] & 0x0f) << 8) | packet[7];
-+ if (cytp->mode & CYTP_BIT_ABS_PRESSURE)
-+ report_data->contacts[1].z = report_data->contacts[0].z;
-+ }
-+
-+ report_data->left = (header_byte & BTN_LEFT_BIT) ? 1 : 0;
-+ report_data->right = (header_byte & BTN_RIGHT_BIT) ? 1 : 0;
-+
-+ /*
-+ * This is only true if one of the mouse buttons were tapped. Make
-+ * sure it doesn't turn into a click. The regular tap-to-click
-+ * functionality will handle that on its own. If we don't do this,
-+ * disabling tap-to-click won't affect the mouse button zones.
-+ */
-+ if (report_data->tap)
-+ report_data->left = 0;
-+
-+#ifdef CYTP_DEBUG_VERBOSE
-+ {
-+ int i;
-+ int n = report_data->contact_cnt;
-+ psmouse_dbg(psmouse, "Dump parsed report data as below:\n");
-+ psmouse_dbg(psmouse, "contact_cnt = %d\n",
-+ report_data->contact_cnt);
-+ if (n > CYTP_MAX_MT_SLOTS)
-+ n = CYTP_MAX_MT_SLOTS;
-+ for (i = 0; i < n; i++)
-+ psmouse_dbg(psmouse, "contacts[%d] = {%d, %d, %d}\n", i,
-+ report_data->contacts[i].x,
-+ report_data->contacts[i].y,
-+ report_data->contacts[i].z);
-+ psmouse_dbg(psmouse, "left = %d\n", report_data->left);
-+ psmouse_dbg(psmouse, "right = %d\n", report_data->right);
-+ psmouse_dbg(psmouse, "middle = %d\n", report_data->middle);
-+ }
-+#endif
-+
-+ return 0;
-+}
-+
-+static void cypress_process_packet(struct psmouse *psmouse, bool zero_pkt)
-+{
-+ int i;
-+ struct input_dev *input = psmouse->dev;
-+ struct cytp_data *cytp = psmouse->private;
-+ struct cytp_report_data report_data;
-+ struct cytp_contact *contact;
-+ struct input_mt_pos pos[CYTP_MAX_MT_SLOTS];
-+ int slots[CYTP_MAX_MT_SLOTS];
-+ int n;
-+
-+ if (cypress_parse_packet(psmouse, cytp, &report_data))
-+ return;
-+
-+ n = report_data.contact_cnt;
-+
-+ if (n > CYTP_MAX_MT_SLOTS)
-+ n = CYTP_MAX_MT_SLOTS;
-+
-+ for (i = 0; i < n; i++) {
-+ contact = &report_data.contacts[i];
-+ pos[i].x = contact->x;
-+ pos[i].y = contact->y;
-+ }
-+
-+ input_mt_assign_slots(input, slots, pos, n);
-+
-+ for (i = 0; i < n; i++) {
-+ contact = &report_data.contacts[i];
-+ input_mt_slot(input, slots[i]);
-+ input_mt_report_slot_state(input, MT_TOOL_FINGER, true);
-+ input_report_abs(input, ABS_MT_POSITION_X, contact->x);
-+ input_report_abs(input, ABS_MT_POSITION_Y, contact->y);
-+ input_report_abs(input, ABS_MT_PRESSURE, contact->z);
-+ }
-+
-+ input_mt_sync_frame(input);
-+
-+ input_mt_report_finger_count(input, report_data.contact_cnt);
-+
-+ input_report_key(input, BTN_LEFT, report_data.left);
-+ input_report_key(input, BTN_RIGHT, report_data.right);
-+ input_report_key(input, BTN_MIDDLE, report_data.middle);
-+
-+ input_sync(input);
-+}
-+
-+static psmouse_ret_t cypress_validate_byte(struct psmouse *psmouse)
-+{
-+ int contact_cnt;
-+ int index = psmouse->pktcnt - 1;
-+ unsigned char *packet = psmouse->packet;
-+ struct cytp_data *cytp = psmouse->private;
-+
-+ if (index < 0 || index > cytp->pkt_size)
-+ return PSMOUSE_BAD_DATA;
-+
-+ if (index == 0 && (packet[0] & 0xfc) == 0) {
-+ /* call packet process for reporting finger leave. */
-+ cypress_process_packet(psmouse, 1);
-+ return PSMOUSE_FULL_PACKET;
-+ }
-+
-+ /*
-+ * Perform validation (and adjust packet size) based only on the
-+ * first byte; allow all further bytes through.
-+ */
-+ if (index != 0)
-+ return PSMOUSE_GOOD_DATA;
-+
-+ /*
-+ * If absolute/relative mode bit has not been set yet, just pass
-+ * the byte through.
-+ */
-+ if ((cytp->mode & CYTP_BIT_ABS_REL_MASK) == 0)
-+ return PSMOUSE_GOOD_DATA;
-+
-+ if ((packet[0] & 0x08) == 0x08)
-+ return PSMOUSE_BAD_DATA;
-+
-+ contact_cnt = cypress_get_finger_count(packet[0]);
-+
-+ if (contact_cnt < 0)
-+ return PSMOUSE_BAD_DATA;
-+
-+ if (cytp->mode & CYTP_BIT_ABS_NO_PRESSURE)
-+ cypress_set_packet_size(psmouse, contact_cnt == 2 ? 7 : 4);
-+ else
-+ cypress_set_packet_size(psmouse, contact_cnt == 2 ? 8 : 5);
-+
-+ return PSMOUSE_GOOD_DATA;
-+}
-+
-+static psmouse_ret_t cypress_protocol_handler(struct psmouse *psmouse)
-+{
-+ struct cytp_data *cytp = psmouse->private;
-+
-+ if (psmouse->pktcnt >= cytp->pkt_size) {
-+ cypress_process_packet(psmouse, 0);
-+ return PSMOUSE_FULL_PACKET;
-+ }
-+
-+ return cypress_validate_byte(psmouse);
-+}
-+
-+static void cypress_set_rate(struct psmouse *psmouse, unsigned int rate)
-+{
-+ struct cytp_data *cytp = psmouse->private;
-+
-+ if (rate >= 80) {
-+ psmouse->rate = 80;
-+ cytp->mode |= CYTP_BIT_HIGH_RATE;
-+ } else {
-+ psmouse->rate = 40;
-+ cytp->mode &= ~CYTP_BIT_HIGH_RATE;
-+ }
-+
-+ ps2_command(&psmouse->ps2dev, (unsigned char *)&psmouse->rate,
-+ PSMOUSE_CMD_SETRATE);
-+}
-+
-+static void cypress_disconnect(struct psmouse *psmouse)
-+{
-+ cypress_reset(psmouse);
-+ kfree(psmouse->private);
-+ psmouse->private = NULL;
-+}
-+
-+static int cypress_reconnect(struct psmouse *psmouse)
-+{
-+ int tries = CYTP_PS2_CMD_TRIES;
-+ int rc;
-+
-+ do {
-+ cypress_reset(psmouse);
-+ rc = cypress_detect(psmouse, false);
-+ } while (rc && (--tries > 0));
-+
-+ if (rc) {
-+ psmouse_err(psmouse, "Reconnect: unable to detect trackpad.\n");
-+ return -1;
-+ }
-+
-+ if (cypress_set_absolute_mode(psmouse)) {
-+ psmouse_err(psmouse, "Reconnect: Unable to initialize Cypress absolute mode.\n");
-+ return -1;
-+ }
-+
-+ return 0;
-+}
-+
-+int cypress_init(struct psmouse *psmouse)
-+{
-+ struct cytp_data *cytp;
-+
-+ cytp = (struct cytp_data *)kzalloc(sizeof(struct cytp_data), GFP_KERNEL);
-+ psmouse->private = (void *)cytp;
-+ if (cytp == NULL)
-+ return -ENOMEM;
-+
-+ cypress_reset(psmouse);
-+
-+ psmouse->pktsize = 8;
-+
-+ if (cypress_query_hardware(psmouse)) {
-+ psmouse_err(psmouse, "Unable to query Trackpad hardware.\n");
-+ goto err_exit;
-+ }
-+
-+ if (cypress_set_absolute_mode(psmouse)) {
-+ psmouse_err(psmouse, "init: Unable to initialize Cypress absolute mode.\n");
-+ goto err_exit;
-+ }
-+
-+ if (cypress_set_input_params(psmouse->dev, cytp) < 0) {
-+ psmouse_err(psmouse, "init: Unable to set input params.\n");
-+ goto err_exit;
-+ }
-+
-+ psmouse->model = 1;
-+ psmouse->protocol_handler = cypress_protocol_handler;
-+ psmouse->set_rate = cypress_set_rate;
-+ psmouse->disconnect = cypress_disconnect;
-+ psmouse->reconnect = cypress_reconnect;
-+ psmouse->cleanup = cypress_reset;
-+ psmouse->resync_time = 0;
-+
-+ return 0;
-+
-+err_exit:
-+ /*
-+ * Reset Cypress Trackpad as a standard mouse. Then
-+ * let psmouse driver commmunicating with it as default PS2 mouse.
-+ */
-+ cypress_reset(psmouse);
-+
-+ psmouse->private = NULL;
-+ kfree(cytp);
-+
-+ return -1;
-+}
-+
-+bool cypress_supported(void)
-+{
-+ return true;
-+}
-diff --git a/drivers/input/mouse/cypress_ps2.h b/drivers/input/mouse/cypress_ps2.h
-new file mode 100644
-index 0000000..4720f21
---- /dev/null
-+++ b/drivers/input/mouse/cypress_ps2.h
-@@ -0,0 +1,191 @@
-+#ifndef _CYPRESS_PS2_H
-+#define _CYPRESS_PS2_H
-+
-+#include "psmouse.h"
-+
-+#define CMD_BITS_MASK 0x03
-+#define COMPOSIT(x, s) (((x) & CMD_BITS_MASK) << (s))
-+
-+#define ENCODE_CMD(aa, bb, cc, dd) \
-+ (COMPOSIT((aa), 6) | COMPOSIT((bb), 4) | COMPOSIT((cc), 2) | COMPOSIT((dd), 0))
-+#define CYTP_CMD_ABS_NO_PRESSURE_MODE ENCODE_CMD(0, 1, 0, 0)
-+#define CYTP_CMD_ABS_WITH_PRESSURE_MODE ENCODE_CMD(0, 1, 0, 1)
-+#define CYTP_CMD_SMBUS_MODE ENCODE_CMD(0, 1, 1, 0)
-+#define CYTP_CMD_STANDARD_MODE ENCODE_CMD(0, 2, 0, 0) /* not implemented yet. */
-+#define CYTP_CMD_CYPRESS_REL_MODE ENCODE_CMD(1, 1, 1, 1) /* not implemented yet. */
-+#define CYTP_CMD_READ_CYPRESS_ID ENCODE_CMD(0, 0, 0, 0)
-+#define CYTP_CMD_READ_TP_METRICS ENCODE_CMD(0, 0, 0, 1)
-+#define CYTP_CMD_SET_HSCROLL_WIDTH(w) ENCODE_CMD(1, 1, 0, (w))
-+#define CYTP_CMD_SET_HSCROLL_MASK ENCODE_CMD(1, 1, 0, 0)
-+#define CYTP_CMD_SET_VSCROLL_WIDTH(w) ENCODE_CMD(1, 2, 0, (w))
-+#define CYTP_CMD_SET_VSCROLL_MASK ENCODE_CMD(1, 2, 0, 0)
-+#define CYTP_CMD_SET_PALM_GEOMETRY(e) ENCODE_CMD(1, 2, 1, (e))
-+#define CYTP_CMD_PALM_GEMMETRY_MASK ENCODE_CMD(1, 2, 1, 0)
-+#define CYTP_CMD_SET_PALM_SENSITIVITY(s) ENCODE_CMD(1, 2, 2, (s))
-+#define CYTP_CMD_PALM_SENSITIVITY_MASK ENCODE_CMD(1, 2, 2, 0)
-+#define CYTP_CMD_SET_MOUSE_SENSITIVITY(s) ENCODE_CMD(1, 3, ((s) >> 2), (s))
-+#define CYTP_CMD_MOUSE_SENSITIVITY_MASK ENCODE_CMD(1, 3, 0, 0)
-+#define CYTP_CMD_REQUEST_BASELINE_STATUS ENCODE_CMD(2, 0, 0, 1)
-+#define CYTP_CMD_REQUEST_RECALIBRATION ENCODE_CMD(2, 0, 0, 3)
-+
-+#define DECODE_CMD_AA(x) (((x) >> 6) & CMD_BITS_MASK)
-+#define DECODE_CMD_BB(x) (((x) >> 4) & CMD_BITS_MASK)
-+#define DECODE_CMD_CC(x) (((x) >> 2) & CMD_BITS_MASK)
-+#define DECODE_CMD_DD(x) ((x) & CMD_BITS_MASK)
-+
-+/* Cypress trackpad working mode. */
-+#define CYTP_BIT_ABS_PRESSURE (1 << 3)
-+#define CYTP_BIT_ABS_NO_PRESSURE (1 << 2)
-+#define CYTP_BIT_CYPRESS_REL (1 << 1)
-+#define CYTP_BIT_STANDARD_REL (1 << 0)
-+#define CYTP_BIT_REL_MASK (CYTP_BIT_CYPRESS_REL | CYTP_BIT_STANDARD_REL)
-+#define CYTP_BIT_ABS_MASK (CYTP_BIT_ABS_PRESSURE | CYTP_BIT_ABS_NO_PRESSURE)
-+#define CYTP_BIT_ABS_REL_MASK (CYTP_BIT_ABS_MASK | CYTP_BIT_REL_MASK)
-+
-+#define CYTP_BIT_HIGH_RATE (1 << 4)
-+/*
-+ * report mode bit is set, firmware working in Remote Mode.
-+ * report mode bit is cleared, firmware working in Stream Mode.
-+ */
-+#define CYTP_BIT_REPORT_MODE (1 << 5)
-+
-+/* scrolling width values for set HSCROLL and VSCROLL width command. */
-+#define SCROLL_WIDTH_NARROW 1
-+#define SCROLL_WIDTH_NORMAL 2
-+#define SCROLL_WIDTH_WIDE 3
-+
-+#define PALM_GEOMETRY_ENABLE 1
-+#define PALM_GEOMETRY_DISABLE 0
-+
-+#define TP_METRICS_MASK 0x80
-+#define FW_VERSION_MASX 0x7f
-+#define FW_VER_HIGH_MASK 0x70
-+#define FW_VER_LOW_MASK 0x0f
-+
-+/* Times to retry a ps2_command and millisecond delay between tries. */
-+#define CYTP_PS2_CMD_TRIES 3
-+#define CYTP_PS2_CMD_DELAY 500
-+
-+/* time out for PS/2 command only in milliseconds. */
-+#define CYTP_CMD_TIMEOUT 200
-+#define CYTP_DATA_TIMEOUT 30
-+
-+#define CYTP_EXT_CMD 0xe8
-+#define CYTP_PS2_RETRY 0xfe
-+#define CYTP_PS2_ERROR 0xfc
-+
-+#define CYTP_RESP_RETRY 0x01
-+#define CYTP_RESP_ERROR 0xfe
-+
-+
-+#define CYTP_105001_WIDTH 97 /* Dell XPS 13 */
-+#define CYTP_105001_HIGH 59
-+#define CYTP_DEFAULT_WIDTH (CYTP_105001_WIDTH)
-+#define CYTP_DEFAULT_HIGH (CYTP_105001_HIGH)
-+
-+#define CYTP_ABS_MAX_X 1600
-+#define CYTP_ABS_MAX_Y 900
-+#define CYTP_MAX_PRESSURE 255
-+#define CYTP_MIN_PRESSURE 0
-+
-+/* header byte bits of relative package. */
-+#define BTN_LEFT_BIT 0x01
-+#define BTN_RIGHT_BIT 0x02
-+#define BTN_MIDDLE_BIT 0x04
-+#define REL_X_SIGN_BIT 0x10
-+#define REL_Y_SIGN_BIT 0x20
-+
-+/* header byte bits of absolute package. */
-+#define ABS_VSCROLL_BIT 0x10
-+#define ABS_HSCROLL_BIT 0x20
-+#define ABS_MULTIFINGER_TAP 0x04
-+#define ABS_EDGE_MOTION_MASK 0x80
-+
-+#define DFLT_RESP_BITS_VALID 0x88 /* SMBus bit should not be set. */
-+#define DFLT_RESP_SMBUS_BIT 0x80
-+#define DFLT_SMBUS_MODE 0x80
-+#define DFLT_PS2_MODE 0x00
-+#define DFLT_RESP_BIT_MODE 0x40
-+#define DFLT_RESP_REMOTE_MODE 0x40
-+#define DFLT_RESP_STREAM_MODE 0x00
-+#define DFLT_RESP_BIT_REPORTING 0x20
-+#define DFLT_RESP_BIT_SCALING 0x10
-+
-+#define TP_METRICS_BIT_PALM 0x80
-+#define TP_METRICS_BIT_STUBBORN 0x40
-+#define TP_METRICS_BIT_2F_JITTER 0x30
-+#define TP_METRICS_BIT_1F_JITTER 0x0c
-+#define TP_METRICS_BIT_APA 0x02
-+#define TP_METRICS_BIT_MTG 0x01
-+#define TP_METRICS_BIT_ABS_PKT_FORMAT_SET 0xf0
-+#define TP_METRICS_BIT_2F_SPIKE 0x0c
-+#define TP_METRICS_BIT_1F_SPIKE 0x03
-+
-+/* bits of first byte response of E9h-Status Request command. */
-+#define RESP_BTN_RIGHT_BIT 0x01
-+#define RESP_BTN_MIDDLE_BIT 0x02
-+#define RESP_BTN_LEFT_BIT 0x04
-+#define RESP_SCALING_BIT 0x10
-+#define RESP_ENABLE_BIT 0x20
-+#define RESP_REMOTE_BIT 0x40
-+#define RESP_SMBUS_BIT 0x80
-+
-+#define CYTP_MAX_MT_SLOTS 2
-+
-+struct cytp_contact {
-+ int x;
-+ int y;
-+ int z; /* also named as touch pressure. */
-+};
-+
-+/* The structure of Cypress Trackpad event data. */
-+struct cytp_report_data {
-+ int contact_cnt;
-+ struct cytp_contact contacts[CYTP_MAX_MT_SLOTS];
-+ unsigned int left:1;
-+ unsigned int right:1;
-+ unsigned int middle:1;
-+ unsigned int tap:1; /* multi-finger tap detected. */
-+};
-+
-+/* The structure of Cypress Trackpad device private data. */
-+struct cytp_data {
-+ int fw_version;
-+
-+ int pkt_size;
-+ int mode;
-+
-+ int tp_min_pressure;
-+ int tp_max_pressure;
-+ int tp_width; /* X direction physical size in mm. */
-+ int tp_high; /* Y direction physical size in mm. */
-+ int tp_max_abs_x; /* Max X absolute units that can be reported. */
-+ int tp_max_abs_y; /* Max Y absolute units that can be reported. */
-+
-+ int tp_res_x; /* X resolution in units/mm. */
-+ int tp_res_y; /* Y resolution in units/mm. */
-+
-+ int tp_metrics_supported;
-+};
-+
-+
-+#ifdef CONFIG_MOUSE_PS2_CYPRESS
-+int cypress_detect(struct psmouse *psmouse, bool set_properties);
-+int cypress_init(struct psmouse *psmouse);
-+bool cypress_supported(void);
-+#else
-+inline int cypress_detect(struct psmouse *psmouse, bool set_properties)
-+{
-+ return -ENOSYS;
-+}
-+inline int cypress_init(struct psmouse *psmouse)
-+{
-+ return -ENOSYS;
-+}
-+inline bool cypress_supported(void)
-+{
-+ return 0;
-+}
-+#endif /* CONFIG_MOUSE_PS2_CYPRESS */
-+
-+#endif /* _CYPRESS_PS2_H */
-diff --git a/drivers/input/mouse/psmouse-base.c b/drivers/input/mouse/psmouse-base.c
-index 22fe254..cff065f 100644
---- a/drivers/input/mouse/psmouse-base.c
-+++ b/drivers/input/mouse/psmouse-base.c
-@@ -34,6 +34,7 @@
- #include "touchkit_ps2.h"
- #include "elantech.h"
- #include "sentelic.h"
-+#include "cypress_ps2.h"
-
- #define DRIVER_DESC "PS/2 mouse driver"
-
-@@ -759,6 +760,28 @@ static int psmouse_extensions(struct psmouse *psmouse,
- }
-
- /*
-+ * Try Cypress Trackpad.
-+ * Must try it before Finger Sensing Pad because Finger Sensing Pad probe
-+ * upsets some modules of Cypress Trackpads.
-+ */
-+ if (max_proto > PSMOUSE_IMEX &&
-+ cypress_detect(psmouse, set_properties) == 0) {
-+ if (cypress_supported()) {
-+ if (cypress_init(psmouse) == 0)
-+ return PSMOUSE_CYPRESS;
-+
-+ /*
-+ * Finger Sensing Pad probe upsets some modules of
-+ * Cypress Trackpad, must avoid Finger Sensing Pad
-+ * probe if Cypress Trackpad device detected.
-+ */
-+ return PSMOUSE_PS2;
-+ }
-+
-+ max_proto = PSMOUSE_IMEX;
-+ }
-+
-+/*
- * Try ALPS TouchPad
- */
- if (max_proto > PSMOUSE_IMEX) {
-@@ -896,6 +919,15 @@ static const struct psmouse_protocol psmouse_protocols[] = {
- .alias = "thinkps",
- .detect = thinking_detect,
- },
-+#ifdef CONFIG_MOUSE_PS2_CYPRESS
-+ {
-+ .type = PSMOUSE_CYPRESS,
-+ .name = "CyPS/2",
-+ .alias = "cypress",
-+ .detect = cypress_detect,
-+ .init = cypress_init,
-+ },
-+#endif
- {
- .type = PSMOUSE_GENPS,
- .name = "GenPS/2",
-diff --git a/drivers/input/mouse/psmouse.h b/drivers/input/mouse/psmouse.h
-index fe1df23..2f0b39d 100644
---- a/drivers/input/mouse/psmouse.h
-+++ b/drivers/input/mouse/psmouse.h
-@@ -95,6 +95,7 @@ enum psmouse_type {
- PSMOUSE_ELANTECH,
- PSMOUSE_FSP,
- PSMOUSE_SYNAPTICS_RELATIVE,
-+ PSMOUSE_CYPRESS,
- PSMOUSE_AUTO /* This one should always be last */
- };
-
---
-1.7.7.6
-
diff --git a/Input-increase-struct-ps2dev-cmdbuf-to-8-bytes.patch b/Input-increase-struct-ps2dev-cmdbuf-to-8-bytes.patch
deleted file mode 100644
index c3548aa07..000000000
--- a/Input-increase-struct-ps2dev-cmdbuf-to-8-bytes.patch
+++ /dev/null
@@ -1,30 +0,0 @@
-From 80524f083e2c3e70057f5bb476db92baa14cb22b Mon Sep 17 00:00:00 2001
-From: Kamal Mostafa <kamal@canonical.com>
-Date: Tue, 20 Nov 2012 23:04:35 -0800
-Subject: [PATCH] Input: increase struct ps2dev cmdbuf[] to 8 bytes
-
-Cypress PS/2 Trackpad (drivers/input/mouse/cypress_ps2.c) needs
-this larger cmdbuf[] to handle 8-byte packet responses.
-
-Signed-off-by: Kamal Mostafa <kamal@canonical.com>
-Signed-off-by: Dmitry Torokhov <dmitry.torokhov@gmail.com>
----
- include/linux/libps2.h | 2 +-
- 1 files changed, 1 insertions(+), 1 deletions(-)
-
-diff --git a/include/linux/libps2.h b/include/linux/libps2.h
-index 79603a6..4ad06e8 100644
---- a/include/linux/libps2.h
-+++ b/include/linux/libps2.h
-@@ -36,7 +36,7 @@ struct ps2dev {
- wait_queue_head_t wait;
-
- unsigned long flags;
-- unsigned char cmdbuf[6];
-+ unsigned char cmdbuf[8];
- unsigned char cmdcnt;
- unsigned char nak;
- };
---
-1.7.7.6
-
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
diff --git a/arm-imx-fixdrm.patch b/arm-imx-fixdrm.patch
deleted file mode 100644
index 069cbb005..000000000
--- a/arm-imx-fixdrm.patch
+++ /dev/null
@@ -1,37 +0,0 @@
-This fixes the following error when building for arm-imx:
-> ERROR: "__clk_get_name" [drivers/staging/imx-drm/ipu-v3/imx-ipu-v3.ko] undefined!
-> make[1]: *** [__modpost] Error 1
-> make: *** [modules] Error 2
-
-There are valid usecases to get the name of a clock, be it for debugging
-purposes or to register a children of a clock like done in this IPU driver.
-Therefore exporting __clk_get_name() and make it available for others makes
-sense.
-
-Reported-by: Peter Robinson <pbrobinson at gmail.com>
-CC: Sascha Hauer <s.hauer at pengutronix.de>
-CC: Mike Turquette <mturquette at linaro.org>
-Signed-off-by: Niels de Vos <ndevos at redhat.com>
----
- drivers/clk/clk.c | 3 ++-
- 1 file changed, 2 insertions(+), 1 deletion(-)
-
-diff --git a/drivers/clk/clk.c b/drivers/clk/clk.c
-index 251e45d..fbe0f3a 100644
---- a/drivers/clk/clk.c
-+++ b/drivers/clk/clk.c
-@@ -259,10 +259,11 @@ late_initcall(clk_disable_unused);
-
- /*** helper functions ***/
-
--inline const char *__clk_get_name(struct clk *clk)
-+const char *__clk_get_name(struct clk *clk)
- {
- return !clk ? NULL : clk->name;
- }
-+EXPORT_SYMBOL_GPL(__clk_get_name);
-
- inline struct clk_hw *__clk_get_hw(struct clk *clk)
- {
---
-1.7.11.7
diff --git a/config-arm-generic b/config-arm-generic
index f1306225b..d3e361376 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 f4fea2955..e6a80f5c5 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 a53983357..3038458bf 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 869b1728a..ed9f63687 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 c3af272a1..c8b782bdd 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 f68e533c1..fa3e082d2 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 b249198c2..4791cdc5a 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/iwlegacy-add-flush-callback.patch b/iwlegacy-add-flush-callback.patch
deleted file mode 100644
index b8b656795..000000000
--- a/iwlegacy-add-flush-callback.patch
+++ /dev/null
@@ -1,103 +0,0 @@
-From 70277f47b58b174a6b0b891dcd06ae5125afb73b Mon Sep 17 00:00:00 2001
-From: Stanislaw Gruszka <sgruszka@redhat.com>
-Date: Thu, 20 Dec 2012 14:31:51 +0100
-Subject: [PATCH] iwlegacy: add flush callback
-
-Dump implementation of flush, which just wait until all TX queues
-become empty.
-
-Signed-off-by: Stanislaw Gruszka <sgruszka@redhat.com>
-Signed-off-by: John W. Linville <linville@tuxdriver.com>
----
- drivers/net/wireless/iwlegacy/3945-mac.c | 1 +
- drivers/net/wireless/iwlegacy/4965-mac.c | 1 +
- drivers/net/wireless/iwlegacy/common.c | 36 ++++++++++++++++++++++++++++++
- drivers/net/wireless/iwlegacy/common.h | 1 +
- 4 files changed, 39 insertions(+), 0 deletions(-)
-
-diff --git a/drivers/net/wireless/iwlegacy/3945-mac.c b/drivers/net/wireless/iwlegacy/3945-mac.c
-index d604b40..962400a 100644
---- a/drivers/net/wireless/iwlegacy/3945-mac.c
-+++ b/drivers/net/wireless/iwlegacy/3945-mac.c
-@@ -3474,6 +3474,7 @@ struct ieee80211_ops il3945_mac_ops = {
- .sta_add = il3945_mac_sta_add,
- .sta_remove = il_mac_sta_remove,
- .tx_last_beacon = il_mac_tx_last_beacon,
-+ .flush = il_mac_flush,
- };
-
- static int
-diff --git a/drivers/net/wireless/iwlegacy/4965-mac.c b/drivers/net/wireless/iwlegacy/4965-mac.c
-index 6a86ed4..c40020c 100644
---- a/drivers/net/wireless/iwlegacy/4965-mac.c
-+++ b/drivers/net/wireless/iwlegacy/4965-mac.c
-@@ -6308,6 +6308,7 @@ const struct ieee80211_ops il4965_mac_ops = {
- .sta_remove = il_mac_sta_remove,
- .channel_switch = il4965_mac_channel_switch,
- .tx_last_beacon = il_mac_tx_last_beacon,
-+ .flush = il_mac_flush,
- };
-
- static int
-diff --git a/drivers/net/wireless/iwlegacy/common.c b/drivers/net/wireless/iwlegacy/common.c
-index 7e16d10..56b8021 100644
---- a/drivers/net/wireless/iwlegacy/common.c
-+++ b/drivers/net/wireless/iwlegacy/common.c
-@@ -4707,6 +4707,42 @@ out:
- }
- EXPORT_SYMBOL(il_mac_change_interface);
-
-+void
-+il_mac_flush(struct ieee80211_hw *hw, bool drop)
-+{
-+ struct il_priv *il = hw->priv;
-+ unsigned long timeout = jiffies + msecs_to_jiffies(500);
-+ int i;
-+
-+ mutex_lock(&il->mutex);
-+ D_MAC80211("enter\n");
-+
-+ if (il->txq == NULL)
-+ goto out;
-+
-+ for (i = 0; i < il->hw_params.max_txq_num; i++) {
-+ struct il_queue *q;
-+
-+ if (i == il->cmd_queue)
-+ continue;
-+
-+ q = &il->txq[i].q;
-+ if (q->read_ptr == q->write_ptr)
-+ continue;
-+
-+ if (time_after(jiffies, timeout)) {
-+ IL_ERR("Failed to flush queue %d\n", q->id);
-+ break;
-+ }
-+
-+ msleep(20);
-+ }
-+out:
-+ D_MAC80211("leave\n");
-+ mutex_unlock(&il->mutex);
-+}
-+EXPORT_SYMBOL(il_mac_flush);
-+
- /*
- * On every watchdog tick we check (latest) time stamp. If it does not
- * change during timeout period and queue is not empty we reset firmware.
-diff --git a/drivers/net/wireless/iwlegacy/common.h b/drivers/net/wireless/iwlegacy/common.h
-index a9a569f..37fe553 100644
---- a/drivers/net/wireless/iwlegacy/common.h
-+++ b/drivers/net/wireless/iwlegacy/common.h
-@@ -1723,6 +1723,7 @@ void il_mac_remove_interface(struct ieee80211_hw *hw,
- struct ieee80211_vif *vif);
- int il_mac_change_interface(struct ieee80211_hw *hw, struct ieee80211_vif *vif,
- enum nl80211_iftype newtype, bool newp2p);
-+void il_mac_flush(struct ieee80211_hw *hw, bool drop);
- int il_alloc_txq_mem(struct il_priv *il);
- void il_free_txq_mem(struct il_priv *il);
-
---
-1.7.7.6
-
diff --git a/kernel.spec b/kernel.spec
index a9cb5da4d..34bf95e73 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@redhat.com> - 3.9.0-0.rc0.git2.1
+- Linux v3.8-3040-ga0b1c42
+
* Thu Feb 21 2013 Josh Boyer <jwboyer@redhat.com> - 3.9.0-0.rc0.git1.1
- Linux v3.8-523-gece8e0b
- Reenable debugging options.
diff --git a/mac80211-improve-latency-and-throughput-while-software.patch b/mac80211-improve-latency-and-throughput-while-software.patch
deleted file mode 100644
index 16f839418..000000000
--- a/mac80211-improve-latency-and-throughput-while-software.patch
+++ /dev/null
@@ -1,142 +0,0 @@
-From c790794fcb461842e6ae1d764b7f68e9a789d149 Mon Sep 17 00:00:00 2001
-From: Stanislaw Gruszka <sgruszka@redhat.com>
-Date: Wed, 23 Jan 2013 12:32:45 +0100
-Subject: [PATCH] mac80211: improve latency and throughput while software
- scanning
-
-Patch vastly improve latency while scanning. Slight throughput
-improvements were observed as well. Is intended for improve performance
-of voice and video applications, when scan is periodically requested by
-user space (i.e. default NetworkManager behaviour).
-
-Patch remove latency requirement based on PM_QOS_NETWORK_LATENCY,
-this value is 2000 seconds by default (i.e. approximately 0.5 hour !?!).
-
-Also remove listen interval requirement, which based on beaconing and
-depending on BSS parameters. It can make we stay off-channel for a
-second or more.
-
-Instead try to offer the best latency that we could, i.e. be off-channel
-no longer than PASSIVE channel scan time: 125 ms. That mean we will
-scan two ACTIVE channels and go back to on-channel, and one PASSIVE
-channel, and go back to on-channel.
-
-Patch also decrease PASSIVE channel scan time to about 110 ms.
-
-As drawback patch increase overall scan time. On my tests, when scanning
-both 2GHz and 5GHz bands, scanning time increase from 5 seconds up to 10
-seconds. Since that increase happen only when we are associated, I think
-it can be acceptable. If eventually better scan time is needed for
-situations when we lose signal and quickly need to decide to which AP
-roam, additional scan flag or parameter can be introduced.
-
-I tested patch by doing:
-
-while true; do iw dev wlan0 scan; sleep 3; done > /dev/null
-
-and
-
-ping -i0.2 -c 1000 HOST
-
-on remote and local machine, results are as below:
-
-* Ping from local periodically scanning machine to AP:
-Unpatched: rtt min/avg/max/mdev = 0.928/24.946/182.135/36.873 ms
-Patched: rtt min/avg/max/mdev = 0.928/19.678/150.845/33.130 ms
-
-* Ping from remote machine to periodically scanning machine:
-Unpatched: rtt min/avg/max/mdev = 1.637/120.683/709.139/164.337 ms
-Patched: rtt min/avg/max/mdev = 1.807/26.893/201.435/40.284 ms
-
-Throughput measured by scp show following results.
-
-* Upload to periodically scanning machine:
-Unpatched: 3.9MB/s 03:15
-Patched: 4.3MB/s 02:58
-
-* Download from periodically scanning machine:
-Unpatched: 5.5MB/s 02:17
-Patched: 6.2MB/s 02:02
-
-Signed-off-by: Stanislaw Gruszka <sgruszka@redhat.com>
-Signed-off-by: Johannes Berg <johannes.berg@intel.com>
----
- net/mac80211/scan.c | 32 +++++---------------------------
- 1 file changed, 5 insertions(+), 27 deletions(-)
-
-diff --git a/net/mac80211/scan.c b/net/mac80211/scan.c
-index bf82e69..e6b2ebc 100644
---- a/net/mac80211/scan.c
-+++ b/net/mac80211/scan.c
-@@ -27,7 +27,7 @@
-
- #define IEEE80211_PROBE_DELAY (HZ / 33)
- #define IEEE80211_CHANNEL_TIME (HZ / 33)
--#define IEEE80211_PASSIVE_CHANNEL_TIME (HZ / 8)
-+#define IEEE80211_PASSIVE_CHANNEL_TIME (HZ / 9)
-
- static void ieee80211_rx_bss_free(struct cfg80211_bss *cbss)
- {
-@@ -547,8 +547,6 @@ static void ieee80211_scan_state_decision(struct ieee80211_local *local,
- bool associated = false;
- bool tx_empty = true;
- bool bad_latency;
-- bool listen_int_exceeded;
-- unsigned long min_beacon_int = 0;
- struct ieee80211_sub_if_data *sdata;
- struct ieee80211_channel *next_chan;
- enum mac80211_scan_state next_scan_state;
-@@ -567,11 +565,6 @@ static void ieee80211_scan_state_decision(struct ieee80211_local *local,
- if (sdata->u.mgd.associated) {
- associated = true;
-
-- if (sdata->vif.bss_conf.beacon_int <
-- min_beacon_int || min_beacon_int == 0)
-- min_beacon_int =
-- sdata->vif.bss_conf.beacon_int;
--
- if (!qdisc_all_tx_empty(sdata->dev)) {
- tx_empty = false;
- break;
-@@ -588,34 +581,19 @@ static void ieee80211_scan_state_decision(struct ieee80211_local *local,
- * see if we can scan another channel without interfering
- * with the current traffic situation.
- *
-- * Since we don't know if the AP has pending frames for us
-- * we can only check for our tx queues and use the current
-- * pm_qos requirements for rx. Hence, if no tx traffic occurs
-- * at all we will scan as many channels in a row as the pm_qos
-- * latency allows us to. Additionally we also check for the
-- * currently negotiated listen interval to prevent losing
-- * frames unnecessarily.
-- *
-- * Otherwise switch back to the operating channel.
-+ * Keep good latency, do not stay off-channel more than 125 ms.
- */
-
- bad_latency = time_after(jiffies +
-- ieee80211_scan_get_channel_time(next_chan),
-- local->leave_oper_channel_time +
-- usecs_to_jiffies(pm_qos_request(PM_QOS_NETWORK_LATENCY)));
--
-- listen_int_exceeded = time_after(jiffies +
-- ieee80211_scan_get_channel_time(next_chan),
-- local->leave_oper_channel_time +
-- usecs_to_jiffies(min_beacon_int * 1024) *
-- local->hw.conf.listen_interval);
-+ ieee80211_scan_get_channel_time(next_chan),
-+ local->leave_oper_channel_time + HZ / 8);
-
- if (associated && !tx_empty) {
- if (local->scan_req->flags & NL80211_SCAN_FLAG_LOW_PRIORITY)
- next_scan_state = SCAN_ABORT;
- else
- next_scan_state = SCAN_SUSPEND;
-- } else if (associated && (bad_latency || listen_int_exceeded)) {
-+ } else if (associated && bad_latency) {
- next_scan_state = SCAN_SUSPEND;
- } else {
- next_scan_state = SCAN_SET_CHANNEL;
---
-1.8.1
-
diff --git a/quiet-apm.patch b/quiet-apm.patch
deleted file mode 100644
index a302b4ecd..000000000
--- a/quiet-apm.patch
+++ /dev/null
@@ -1,13 +0,0 @@
-diff --git a/arch/x86/kernel/apm_32.c b/arch/x86/kernel/apm_32.c
-index 8d7012b..eb9d320 100644
---- a/arch/x86/kernel/apm_32.c
-+++ b/arch/x86/kernel/apm_32.c
-@@ -905,7 +905,7 @@ static void apm_cpu_idle(void)
- unsigned int jiffies_since_last_check = jiffies - last_jiffies;
- unsigned int bucket;
-
-- WARN_ONCE(1, "deprecated apm_cpu_idle will be deleted in 2012");
-+ printk_once(KERN_INFO "deprecated apm_cpu_idle will be deleted in 2012");
- recalc:
- task_cputime(current, NULL, &stime);
- if (jiffies_since_last_check > IDLE_CALC_LIMIT) {
diff --git a/sources b/sources
index 0aef63aa3..eb62ac860 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