From 78f1e818cf70711a4834fc008f87077b12fbb9f2 Mon Sep 17 00:00:00 2001 From: Jake Day Date: Tue, 7 Nov 2017 20:14:55 -0500 Subject: [PATCH] fix for multi-touch hid input --- kernel/drivers/hid/hid-multitouch.c | 25 +++++++++++++++++-------- 1 file changed, 17 insertions(+), 8 deletions(-) diff --git a/kernel/drivers/hid/hid-multitouch.c b/kernel/drivers/hid/hid-multitouch.c index f66abb6e7..1cfbd26fb 100644 --- a/kernel/drivers/hid/hid-multitouch.c +++ b/kernel/drivers/hid/hid-multitouch.c @@ -140,6 +140,7 @@ struct mt_device { static void mt_post_parse_default_settings(struct mt_device *td); static void mt_post_parse(struct mt_device *td); +static int cc_seen = 0; /* classes of device behavior */ #define MT_CLS_DEFAULT 0x0001 @@ -589,11 +590,11 @@ static int mt_touch_input_mapping(struct hid_device *hdev, struct hid_input *hi, usage->usage_index >= field->report_count) return 1; - //if (td->cc_index < 0) { + if(cc_seen != 1) { td->cc_index = field->index; td->cc_value_index = usage->usage_index; - //} - + cc_seen++; + } return 1; case HID_DG_CONTACTMAX: /* we don't set td->last_slot_field as contactcount and @@ -630,6 +631,16 @@ static int mt_touch_input_mapping(struct hid_device *hdev, struct hid_input *hi, return 0; } +static int mt_touch_input_mapped(struct hid_device *hdev, struct hid_input *hi, + struct hid_field *field, struct hid_usage *usage, + unsigned long **bit, int *max) +{ + if (usage->type == EV_KEY || usage->type == EV_ABS) + set_bit(usage->type, hi->input->evbit); + + return -1; +} + static int mt_compute_slot(struct mt_device *td, struct input_dev *input) { __s32 quirks = td->mtclass.quirks; @@ -1000,10 +1011,8 @@ static int mt_input_mapped(struct hid_device *hdev, struct hid_input *hi, return 0; if (field->application == HID_DG_TOUCHSCREEN || - field->application == HID_DG_TOUCHPAD) { - /* We own these mappings, tell hid-input to ignore them */ - return -1; - } + field->application == HID_DG_TOUCHPAD) + return mt_touch_input_mapped(hdev, hi, field, usage, bit, max); /* let hid-core decide for the others */ return 0; @@ -1292,6 +1301,7 @@ static int mt_probe(struct hid_device *hdev, const struct hid_device_id *id) td->inputmode_value = MT_INPUTMODE_TOUCHSCREEN; td->cc_index = -1; td->mt_report_id = -1; + cc_seen = 0; hid_set_drvdata(hdev, td); td->fields = devm_kzalloc(&hdev->dev, sizeof(struct mt_fields), @@ -1338,7 +1348,6 @@ static int mt_probe(struct hid_device *hdev, const struct hid_device_id *id) hdev->quirks |= HID_QUIRK_NO_INIT_REPORTS; setup_timer(&td->release_timer, mt_expired_timeout, (long)hdev); - ret = hid_parse(hdev); if (ret != 0) return ret;