Commit 5df682b2 authored by Joseph Salisbury's avatar Joseph Salisbury Committed by Dmitry Torokhov

Input: cypress_ps2 - do not consider data bad if palm is detected

If hardware (or firmware) detects palm on the surface of the device it does
not mean that the data packet is bad from the protocol standpoint. Instead
of reporting PSMOUSE_BAD_DATA in this case simply threat it as if nothing
touches the surface.

BugLink: http://bugs.launchpad.net/bugs/1229361Signed-off-by: default avatarJoseph Salisbury <joseph.salisbury@canonical.com>
Tested-by: default avatarKamal Mostafa <kamal@canonical.com>
Signed-off-by: default avatarDmitry Torokhov <dmitry.torokhov@gmail.com>
parent c2e60959
...@@ -439,7 +439,7 @@ static int cypress_get_finger_count(unsigned char header_byte) ...@@ -439,7 +439,7 @@ static int cypress_get_finger_count(unsigned char header_byte)
case 2: return 5; case 2: return 5;
default: default:
/* Invalid contact (e.g. palm). Ignore it. */ /* Invalid contact (e.g. palm). Ignore it. */
return -1; return 0;
} }
} }
...@@ -452,17 +452,10 @@ static int cypress_parse_packet(struct psmouse *psmouse, ...@@ -452,17 +452,10 @@ static int cypress_parse_packet(struct psmouse *psmouse,
{ {
unsigned char *packet = psmouse->packet; unsigned char *packet = psmouse->packet;
unsigned char header_byte = packet[0]; unsigned char header_byte = packet[0];
int contact_cnt;
memset(report_data, 0, sizeof(struct cytp_report_data)); memset(report_data, 0, sizeof(struct cytp_report_data));
contact_cnt = cypress_get_finger_count(header_byte); 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; report_data->tap = (header_byte & ABS_MULTIFINGER_TAP) ? 1 : 0;
if (report_data->contact_cnt == 1) { if (report_data->contact_cnt == 1) {
...@@ -535,11 +528,9 @@ static void cypress_process_packet(struct psmouse *psmouse, bool zero_pkt) ...@@ -535,11 +528,9 @@ static void cypress_process_packet(struct psmouse *psmouse, bool zero_pkt)
int slots[CYTP_MAX_MT_SLOTS]; int slots[CYTP_MAX_MT_SLOTS];
int n; int n;
if (cypress_parse_packet(psmouse, cytp, &report_data)) cypress_parse_packet(psmouse, cytp, &report_data);
return;
n = report_data.contact_cnt; n = report_data.contact_cnt;
if (n > CYTP_MAX_MT_SLOTS) if (n > CYTP_MAX_MT_SLOTS)
n = CYTP_MAX_MT_SLOTS; n = CYTP_MAX_MT_SLOTS;
...@@ -605,10 +596,6 @@ static psmouse_ret_t cypress_validate_byte(struct psmouse *psmouse) ...@@ -605,10 +596,6 @@ static psmouse_ret_t cypress_validate_byte(struct psmouse *psmouse)
return PSMOUSE_BAD_DATA; return PSMOUSE_BAD_DATA;
contact_cnt = cypress_get_finger_count(packet[0]); contact_cnt = cypress_get_finger_count(packet[0]);
if (contact_cnt < 0)
return PSMOUSE_BAD_DATA;
if (cytp->mode & CYTP_BIT_ABS_NO_PRESSURE) if (cytp->mode & CYTP_BIT_ABS_NO_PRESSURE)
cypress_set_packet_size(psmouse, contact_cnt == 2 ? 7 : 4); cypress_set_packet_size(psmouse, contact_cnt == 2 ? 7 : 4);
else else
......
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