diff options
author | Josh Boyer <jwboyer@fedoraproject.org> | 2015-03-11 09:17:47 -0400 |
---|---|---|
committer | Josh Boyer <jwboyer@fedoraproject.org> | 2015-03-11 09:18:03 -0400 |
commit | 80e48d0c7e8aced5df19d369961137f58ba97811 (patch) | |
tree | d9d7ddc5037d2b2b4189551f3846a868531fec33 /Input-synaptics-retrieve-the-extended-capabilities-i.patch | |
parent | 73947052943a62125227728baddc88ef6934ae9d (diff) | |
download | kernel-80e48d0c7e8aced5df19d369961137f58ba97811.tar.gz kernel-80e48d0c7e8aced5df19d369961137f58ba97811.tar.xz kernel-80e48d0c7e8aced5df19d369961137f58ba97811.zip |
Patch series to fix Lenovo *40 and Carbon X1 touchpads (rhbz 1200777 1200778)
Diffstat (limited to 'Input-synaptics-retrieve-the-extended-capabilities-i.patch')
-rw-r--r-- | Input-synaptics-retrieve-the-extended-capabilities-i.patch | 125 |
1 files changed, 125 insertions, 0 deletions
diff --git a/Input-synaptics-retrieve-the-extended-capabilities-i.patch b/Input-synaptics-retrieve-the-extended-capabilities-i.patch new file mode 100644 index 000000000..9be855143 --- /dev/null +++ b/Input-synaptics-retrieve-the-extended-capabilities-i.patch @@ -0,0 +1,125 @@ +From: Benjamin Tissoires <benjamin.tissoires@redhat.com> +Date: Sun, 8 Mar 2015 22:34:03 -0700 +Subject: [PATCH] Input: synaptics - retrieve the extended capabilities in + query $10 + +Newer Synaptics touchpads need to get information from the query $10. +Retrieve it if available. + +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 | 23 ++++++++++++++++++++--- + drivers/input/mouse/synaptics.h | 23 +++++++++++++++++++++++ + 2 files changed, 43 insertions(+), 3 deletions(-) + +diff --git a/drivers/input/mouse/synaptics.c b/drivers/input/mouse/synaptics.c +index ff352ecca394..83099eb8cf86 100644 +--- a/drivers/input/mouse/synaptics.c ++++ b/drivers/input/mouse/synaptics.c +@@ -244,11 +244,24 @@ static int synaptics_model_id(struct psmouse *psmouse) + return 0; + } + ++static int synaptics_more_extended_queries(struct psmouse *psmouse) ++{ ++ struct synaptics_data *priv = psmouse->private; ++ unsigned char buf[3]; ++ ++ if (synaptics_send_cmd(psmouse, SYN_QUE_MEXT_CAPAB_10, buf)) ++ return -1; ++ ++ priv->ext_cap_10 = (buf[0]<<16) | (buf[1]<<8) | buf[2]; ++ ++ return 0; ++} ++ + /* +- * Read the board id from the touchpad ++ * Read the board id and the "More Extended Queries" from the touchpad + * The board id is encoded in the "QUERY MODES" response + */ +-static int synaptics_board_id(struct psmouse *psmouse) ++static int synaptics_query_modes(struct psmouse *psmouse) + { + struct synaptics_data *priv = psmouse->private; + unsigned char bid[3]; +@@ -260,6 +273,10 @@ static int synaptics_board_id(struct psmouse *psmouse) + if (synaptics_send_cmd(psmouse, SYN_QUE_MODES, bid)) + return -1; + priv->board_id = ((bid[0] & 0xfc) << 6) | bid[1]; ++ ++ if (SYN_MEXT_CAP_BIT(bid[0])) ++ return synaptics_more_extended_queries(psmouse); ++ + return 0; + } + +@@ -449,7 +466,7 @@ static int synaptics_query_hardware(struct psmouse *psmouse) + return -1; + if (synaptics_firmware_id(psmouse)) + return -1; +- if (synaptics_board_id(psmouse)) ++ if (synaptics_query_modes(psmouse)) + return -1; + if (synaptics_capability(psmouse)) + return -1; +diff --git a/drivers/input/mouse/synaptics.h b/drivers/input/mouse/synaptics.h +index aedc3299b14e..85180140509e 100644 +--- a/drivers/input/mouse/synaptics.h ++++ b/drivers/input/mouse/synaptics.h +@@ -22,6 +22,7 @@ + #define SYN_QUE_EXT_CAPAB_0C 0x0c + #define SYN_QUE_EXT_MAX_COORDS 0x0d + #define SYN_QUE_EXT_MIN_COORDS 0x0f ++#define SYN_QUE_MEXT_CAPAB_10 0x10 + + /* synatics modes */ + #define SYN_BIT_ABSOLUTE_MODE (1 << 7) +@@ -53,6 +54,7 @@ + #define SYN_EXT_CAP_REQUESTS(c) (((c) & 0x700000) >> 20) + #define SYN_CAP_MULTI_BUTTON_NO(ec) (((ec) & 0x00f000) >> 12) + #define SYN_CAP_PRODUCT_ID(ec) (((ec) & 0xff0000) >> 16) ++#define SYN_MEXT_CAP_BIT(m) ((m) & (1 << 1)) + + /* + * The following describes response for the 0x0c query. +@@ -89,6 +91,26 @@ + #define SYN_CAP_REDUCED_FILTERING(ex0c) ((ex0c) & 0x000400) + #define SYN_CAP_IMAGE_SENSOR(ex0c) ((ex0c) & 0x000800) + ++/* ++ * The following descibes response for the 0x10 query. ++ * ++ * byte mask name meaning ++ * ---- ---- ------- ------------ ++ * 1 0x01 ext buttons are stick buttons exported in the extended ++ * capability are actually meant to be used ++ * by the tracktick (pass-through). ++ * 1 0x02 SecurePad the touchpad is a SecurePad, so it ++ * contains a built-in fingerprint reader. ++ * 1 0xe0 more ext count how many more extented queries are ++ * available after this one. ++ * 2 0xff SecurePad width the width of the SecurePad fingerprint ++ * reader. ++ * 3 0xff SecurePad height the height of the SecurePad fingerprint ++ * reader. ++ */ ++#define SYN_CAP_EXT_BUTTONS_STICK(ex10) ((ex10) & 0x010000) ++#define SYN_CAP_SECUREPAD(ex10) ((ex10) & 0x020000) ++ + /* synaptics modes query bits */ + #define SYN_MODE_ABSOLUTE(m) ((m) & (1 << 7)) + #define SYN_MODE_RATE(m) ((m) & (1 << 6)) +@@ -143,6 +165,7 @@ struct synaptics_data { + unsigned long int capabilities; /* Capabilities */ + unsigned long int ext_cap; /* Extended Capabilities */ + unsigned long int ext_cap_0c; /* Ext Caps from 0x0c query */ ++ unsigned long int ext_cap_10; /* Ext Caps from 0x10 query */ + unsigned long int identity; /* Identification */ + unsigned int x_res, y_res; /* X/Y resolution in units/mm */ + unsigned int x_max, y_max; /* Max coordinates (from FW) */ +-- +2.1.0 + |