Commit f097deef authored by Andrew Duggan's avatar Andrew Duggan Committed by Jiri Kosina

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: default avatarAndrew Duggan <aduggan@synaptics.com>
Tested-by: default avatarGabriele Mazzotta <gabriele.mzt@gmail.com>
Signed-off-by: default avatarJiri Kosina <jkosina@suse.cz>
parent 05ba999f
...@@ -752,6 +752,7 @@ static int rmi_populate_f11(struct hid_device *hdev) ...@@ -752,6 +752,7 @@ static int rmi_populate_f11(struct hid_device *hdev)
bool has_rel; bool has_rel;
bool has_data40 = false; bool has_data40 = false;
bool has_dribble = false; bool has_dribble = false;
bool has_palm_detect = false;
unsigned x_size, y_size; unsigned x_size, y_size;
u16 query_offset; u16 query_offset;
...@@ -820,6 +821,7 @@ static int rmi_populate_f11(struct hid_device *hdev) ...@@ -820,6 +821,7 @@ static int rmi_populate_f11(struct hid_device *hdev)
ret); ret);
return ret; return ret;
} }
has_palm_detect = !!(buf[0] & BIT(0));
has_query10 = !!(buf[0] & BIT(2)); has_query10 = !!(buf[0] & BIT(2));
query_offset += 2; /* query 7 and 8 are present */ query_offset += 2; /* query 7 and 8 are present */
...@@ -906,11 +908,11 @@ static int rmi_populate_f11(struct hid_device *hdev) ...@@ -906,11 +908,11 @@ static int rmi_populate_f11(struct hid_device *hdev)
* retrieve the ctrl registers * retrieve the ctrl registers
* the ctrl register has a size of 20 but a fw bug split it into 16 + 4, * the ctrl register has a size of 20 but a fw bug split it into 16 + 4,
* and there is no way to know if the first 20 bytes are here or not. * and there is no way to know if the first 20 bytes are here or not.
* We use only the first 10 bytes, so get only them. * We use only the first 12 bytes, so get only them.
*/ */
ret = rmi_read_block(hdev, data->f11.control_base_addr, buf, 10); ret = rmi_read_block(hdev, data->f11.control_base_addr, buf, 12);
if (ret) { if (ret) {
hid_err(hdev, "can not read ctrl block of size 10: %d.\n", ret); hid_err(hdev, "can not read ctrl block of size 11: %d.\n", ret);
return ret; return ret;
} }
...@@ -927,6 +929,17 @@ static int rmi_populate_f11(struct hid_device *hdev) ...@@ -927,6 +929,17 @@ static int rmi_populate_f11(struct hid_device *hdev)
} }
} }
if (has_palm_detect) {
buf[11] = buf[11] & ~BIT(0);
ret = rmi_write(hdev, data->f11.control_base_addr + 11,
&buf[11]);
if (ret) {
hid_err(hdev, "can not write to control reg 11: %d.\n",
ret);
return ret;
}
}
return 0; return 0;
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment