aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/hid/hid-rmi.c
diff options
context:
space:
mode:
authorAndrew Duggan <aduggan@synaptics.com>2015-02-24 20:36:50 -0500
committerJiri Kosina <jkosina@suse.cz>2015-02-25 09:26:44 -0500
commitf097deef59a60109648efd48f6c9fe7f56966938 (patch)
treeb2d6cbaac48fb9b8c3a7d5d2058ad2e3a8f5db73 /drivers/hid/hid-rmi.c
parent05ba999fcabb747214d177279de55f00a74850d4 (diff)
HID: rmi: disable palm detect gesture when present
A touchpad may have firmware based palm detection code enabled which suppresses 2D data from being reported when the firmware believes a palm is on the touchpad. This functionality is meant to be used in mouse mode without a driver. When a driver is present, the driver can do a better job of determining if a contact is a palm. If this gesture is enabled on a touchpad operating in rmi mode then the firmware will not properly clear the palm detect interrupt, causing the touchpad to interrupt indefinately. This patch disables the palm detect gesture when the touchpad is operating in rmi mode. Signed-off-by: Andrew Duggan <aduggan@synaptics.com> Tested-by: Gabriele Mazzotta <gabriele.mzt@gmail.com> Signed-off-by: Jiri Kosina <jkosina@suse.cz>
Diffstat (limited to 'drivers/hid/hid-rmi.c')
-rw-r--r--drivers/hid/hid-rmi.c19
1 files changed, 16 insertions, 3 deletions
diff --git a/drivers/hid/hid-rmi.c b/drivers/hid/hid-rmi.c
index 6e74eae6b652..368ffdf2c0a3 100644
--- a/drivers/hid/hid-rmi.c
+++ b/drivers/hid/hid-rmi.c
@@ -752,6 +752,7 @@ static int rmi_populate_f11(struct hid_device *hdev)
752 bool has_rel; 752 bool has_rel;
753 bool has_data40 = false; 753 bool has_data40 = false;
754 bool has_dribble = false; 754 bool has_dribble = false;
755 bool has_palm_detect = false;
755 unsigned x_size, y_size; 756 unsigned x_size, y_size;
756 u16 query_offset; 757 u16 query_offset;
757 758
@@ -820,6 +821,7 @@ static int rmi_populate_f11(struct hid_device *hdev)
820 ret); 821 ret);
821 return ret; 822 return ret;
822 } 823 }
824 has_palm_detect = !!(buf[0] & BIT(0));
823 has_query10 = !!(buf[0] & BIT(2)); 825 has_query10 = !!(buf[0] & BIT(2));
824 826
825 query_offset += 2; /* query 7 and 8 are present */ 827 query_offset += 2; /* query 7 and 8 are present */
@@ -906,11 +908,11 @@ static int rmi_populate_f11(struct hid_device *hdev)
906 * retrieve the ctrl registers 908 * retrieve the ctrl registers
907 * the ctrl register has a size of 20 but a fw bug split it into 16 + 4, 909 * the ctrl register has a size of 20 but a fw bug split it into 16 + 4,
908 * and there is no way to know if the first 20 bytes are here or not. 910 * and there is no way to know if the first 20 bytes are here or not.
909 * We use only the first 10 bytes, so get only them. 911 * We use only the first 12 bytes, so get only them.
910 */ 912 */
911 ret = rmi_read_block(hdev, data->f11.control_base_addr, buf, 10); 913 ret = rmi_read_block(hdev, data->f11.control_base_addr, buf, 12);
912 if (ret) { 914 if (ret) {
913 hid_err(hdev, "can not read ctrl block of size 10: %d.\n", ret); 915 hid_err(hdev, "can not read ctrl block of size 11: %d.\n", ret);
914 return ret; 916 return ret;
915 } 917 }
916 918
@@ -927,6 +929,17 @@ static int rmi_populate_f11(struct hid_device *hdev)
927 } 929 }
928 } 930 }
929 931
932 if (has_palm_detect) {
933 buf[11] = buf[11] & ~BIT(0);
934 ret = rmi_write(hdev, data->f11.control_base_addr + 11,
935 &buf[11]);
936 if (ret) {
937 hid_err(hdev, "can not write to control reg 11: %d.\n",
938 ret);
939 return ret;
940 }
941 }
942
930 return 0; 943 return 0;
931} 944}
932 945