summaryrefslogtreecommitdiffstats
path: root/Input-synaptics-re-route-tracksticks-buttons-on-the-.patch
diff options
context:
space:
mode:
Diffstat (limited to 'Input-synaptics-re-route-tracksticks-buttons-on-the-.patch')
-rw-r--r--Input-synaptics-re-route-tracksticks-buttons-on-the-.patch151
1 files changed, 0 insertions, 151 deletions
diff --git a/Input-synaptics-re-route-tracksticks-buttons-on-the-.patch b/Input-synaptics-re-route-tracksticks-buttons-on-the-.patch
deleted file mode 100644
index dca2732cb..000000000
--- a/Input-synaptics-re-route-tracksticks-buttons-on-the-.patch
+++ /dev/null
@@ -1,151 +0,0 @@
-From: Benjamin Tissoires <benjamin.tissoires@redhat.com>
-Date: Sun, 8 Mar 2015 22:35:41 -0700
-Subject: [PATCH] Input: synaptics - re-route tracksticks buttons on the Lenovo
- 2015 series
-
-The 2015 series of the Lenovo thinkpads added back the hardware buttons on
-top of the touchpad for the trackstick.
-
-Unfortunately, they are wired to the touchpad, and not the trackstick.
-Thus, they are seen as extra buttons from the kernel point of view.
-
-This leads to a problem in user space because extra buttons on synaptics
-devices used to be used as scroll up/down buttons. So in the end, the
-experience for the user is scroll events for buttons left and right when
-using the trackstick. Yay!
-
-Fortunately, the firmware advertises such behavior in the extended
-capability $10, and so we can re-route the buttons through the pass-through
-interface.
-
-Hallelujah-expressed-by: Peter Hutterer <peter.hutterer@who-t.net>
-Signed-off-by: Benjamin Tissoires <benjamin.tissoires@redhat.com>
-Acked-by: Hans de Goede <hdegoede@redhat.com>
-Signed-off-by: Dmitry Torokhov <dmitry.torokhov@gmail.com>
----
- drivers/input/mouse/synaptics.c | 47 +++++++++++++++++++++++++++++++----------
- drivers/input/mouse/synaptics.h | 5 +++++
- 2 files changed, 41 insertions(+), 11 deletions(-)
-
-diff --git a/drivers/input/mouse/synaptics.c b/drivers/input/mouse/synaptics.c
-index eec73e8f1f06..3b9717a46140 100644
---- a/drivers/input/mouse/synaptics.c
-+++ b/drivers/input/mouse/synaptics.c
-@@ -582,18 +582,22 @@ static int synaptics_is_pt_packet(unsigned char *buf)
- return (buf[0] & 0xFC) == 0x84 && (buf[3] & 0xCC) == 0xC4;
- }
-
--static void synaptics_pass_pt_packet(struct serio *ptport, unsigned char *packet)
-+static void synaptics_pass_pt_packet(struct psmouse *psmouse,
-+ struct serio *ptport,
-+ unsigned char *packet)
- {
-+ struct synaptics_data *priv = psmouse->private;
- struct psmouse *child = serio_get_drvdata(ptport);
-
- if (child && child->state == PSMOUSE_ACTIVATED) {
-- serio_interrupt(ptport, packet[1], 0);
-+ serio_interrupt(ptport, packet[1] | priv->pt_buttons, 0);
- serio_interrupt(ptport, packet[4], 0);
- serio_interrupt(ptport, packet[5], 0);
- if (child->pktsize == 4)
- serio_interrupt(ptport, packet[2], 0);
-- } else
-+ } else {
- serio_interrupt(ptport, packet[1], 0);
-+ }
- }
-
- static void synaptics_pt_activate(struct psmouse *psmouse)
-@@ -839,6 +843,7 @@ static void synaptics_report_ext_buttons(struct psmouse *psmouse,
- struct input_dev *dev = psmouse->dev;
- struct synaptics_data *priv = psmouse->private;
- int ext_bits = (SYN_CAP_MULTI_BUTTON_NO(priv->ext_cap) + 1) >> 1;
-+ char buf[6] = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00};
- int i;
-
- if (!SYN_CAP_MULTI_BUTTON_NO(priv->ext_cap))
-@@ -849,12 +854,30 @@ static void synaptics_report_ext_buttons(struct psmouse *psmouse,
- !((psmouse->packet[0] ^ psmouse->packet[3]) & 0x02))
- return;
-
-- for (i = 0; i < ext_bits; i++) {
-- input_report_key(dev, BTN_0 + 2 * i,
-- hw->ext_buttons & (1 << i));
-- input_report_key(dev, BTN_1 + 2 * i,
-- hw->ext_buttons & (1 << (i + ext_bits)));
-+ if (!SYN_CAP_EXT_BUTTONS_STICK(priv->ext_cap_10)) {
-+ for (i = 0; i < ext_bits; i++) {
-+ input_report_key(dev, BTN_0 + 2 * i,
-+ hw->ext_buttons & (1 << i));
-+ input_report_key(dev, BTN_1 + 2 * i,
-+ hw->ext_buttons & (1 << (i + ext_bits)));
-+ }
-+ return;
- }
-+
-+ /*
-+ * This generation of touchpads has the trackstick buttons
-+ * physically wired to the touchpad. Re-route them through
-+ * the pass-through interface.
-+ */
-+ if (!priv->pt_port)
-+ return;
-+
-+ /* The trackstick expects at most 3 buttons */
-+ priv->pt_buttons = SYN_CAP_EXT_BUTTON_STICK_L(hw->ext_buttons) |
-+ SYN_CAP_EXT_BUTTON_STICK_R(hw->ext_buttons) << 1 |
-+ SYN_CAP_EXT_BUTTON_STICK_M(hw->ext_buttons) << 2;
-+
-+ synaptics_pass_pt_packet(psmouse, priv->pt_port, buf);
- }
-
- static void synaptics_report_buttons(struct psmouse *psmouse,
-@@ -1095,7 +1118,8 @@ static psmouse_ret_t synaptics_process_byte(struct psmouse *psmouse)
- if (SYN_CAP_PASS_THROUGH(priv->capabilities) &&
- synaptics_is_pt_packet(psmouse->packet)) {
- if (priv->pt_port)
-- synaptics_pass_pt_packet(priv->pt_port, psmouse->packet);
-+ synaptics_pass_pt_packet(psmouse, priv->pt_port,
-+ psmouse->packet);
- } else
- synaptics_process_packet(psmouse);
-
-@@ -1197,8 +1221,9 @@ static void set_input_params(struct psmouse *psmouse,
- __set_bit(BTN_BACK, dev->keybit);
- }
-
-- for (i = 0; i < SYN_CAP_MULTI_BUTTON_NO(priv->ext_cap); i++)
-- __set_bit(BTN_0 + i, dev->keybit);
-+ if (!SYN_CAP_EXT_BUTTONS_STICK(priv->ext_cap_10))
-+ for (i = 0; i < SYN_CAP_MULTI_BUTTON_NO(priv->ext_cap); i++)
-+ __set_bit(BTN_0 + i, dev->keybit);
-
- __clear_bit(EV_REL, dev->evbit);
- __clear_bit(REL_X, dev->relbit);
-diff --git a/drivers/input/mouse/synaptics.h b/drivers/input/mouse/synaptics.h
-index 85180140509e..ee4bd0d12b26 100644
---- a/drivers/input/mouse/synaptics.h
-+++ b/drivers/input/mouse/synaptics.h
-@@ -111,6 +111,10 @@
- #define SYN_CAP_EXT_BUTTONS_STICK(ex10) ((ex10) & 0x010000)
- #define SYN_CAP_SECUREPAD(ex10) ((ex10) & 0x020000)
-
-+#define SYN_CAP_EXT_BUTTON_STICK_L(eb) (!!((eb) & 0x01))
-+#define SYN_CAP_EXT_BUTTON_STICK_M(eb) (!!((eb) & 0x02))
-+#define SYN_CAP_EXT_BUTTON_STICK_R(eb) (!!((eb) & 0x04))
-+
- /* synaptics modes query bits */
- #define SYN_MODE_ABSOLUTE(m) ((m) & (1 << 7))
- #define SYN_MODE_RATE(m) ((m) & (1 << 6))
-@@ -179,6 +183,7 @@ struct synaptics_data {
- bool disable_gesture; /* disable gestures */
-
- struct serio *pt_port; /* Pass-through serio port */
-+ unsigned char pt_buttons; /* Pass-through buttons */
-
- /*
- * Last received Advanced Gesture Mode (AGM) packet. An AGM packet
---
-2.1.0
-