diff options
Diffstat (limited to 'drivers/hid/hid-multitouch.c')
| -rw-r--r-- | drivers/hid/hid-multitouch.c | 24 | 
1 files changed, 20 insertions, 4 deletions
diff --git a/drivers/hid/hid-multitouch.c b/drivers/hid/hid-multitouch.c index d39a5cede0b..f4b77f4d5fb 100644 --- a/drivers/hid/hid-multitouch.c +++ b/drivers/hid/hid-multitouch.c @@ -445,6 +445,16 @@ static int mt_touch_input_mapping(struct hid_device *hdev, struct hid_input *hi,  	    (usage->hid & HID_USAGE_PAGE) == HID_UP_BUTTON)  		td->mt_flags |= INPUT_MT_POINTER; +	/* Only map fields from TouchScreen or TouchPad collections. +         * We need to ignore fields that belong to other collections +         * such as Mouse that might have the same GenericDesktop usages. */ +	if (field->application == HID_DG_TOUCHSCREEN) +		set_bit(INPUT_PROP_DIRECT, hi->input->propbit); +	else if (field->application == HID_DG_TOUCHPAD) +		set_bit(INPUT_PROP_POINTER, hi->input->propbit); +	else +		return 0; +  	if (usage->usage_index)  		prev_usage = &field->usage[usage->usage_index - 1]; @@ -770,12 +780,13 @@ static void mt_touch_report(struct hid_device *hid, struct hid_report *report)  		mt_sync_frame(td, report->field[0]->hidinput->input);  } -static void mt_touch_input_configured(struct hid_device *hdev, +static int mt_touch_input_configured(struct hid_device *hdev,  					struct hid_input *hi)  {  	struct mt_device *td = hid_get_drvdata(hdev);  	struct mt_class *cls = &td->mtclass;  	struct input_dev *input = hi->input; +	int ret;  	if (!td->maxcontacts)  		td->maxcontacts = MT_DEFAULT_MAXCONTACT; @@ -790,9 +801,12 @@ static void mt_touch_input_configured(struct hid_device *hdev,  	if (cls->quirks & MT_QUIRK_NOT_SEEN_MEANS_UP)  		td->mt_flags |= INPUT_MT_DROP_UNUSED; -	input_mt_init_slots(input, td->maxcontacts, td->mt_flags); +	ret = input_mt_init_slots(input, td->maxcontacts, td->mt_flags); +	if (ret) +		return ret;  	td->mt_flags = 0; +	return 0;  }  static int mt_input_mapping(struct hid_device *hdev, struct hid_input *hi, @@ -925,19 +939,21 @@ static void mt_post_parse(struct mt_device *td)  		cls->quirks &= ~MT_QUIRK_CONTACT_CNT_ACCURATE;  } -static void mt_input_configured(struct hid_device *hdev, struct hid_input *hi) +static int mt_input_configured(struct hid_device *hdev, struct hid_input *hi)  {  	struct mt_device *td = hid_get_drvdata(hdev);  	char *name = kstrdup(hdev->name, GFP_KERNEL); +	int ret = 0;  	if (name)  		hi->input->name = name;  	if (hi->report->id == td->mt_report_id) -		mt_touch_input_configured(hdev, hi); +		ret = mt_touch_input_configured(hdev, hi);  	if (hi->report->id == td->pen_report_id)  		mt_pen_input_configured(hdev, hi); +	return ret;  }  static int mt_probe(struct hid_device *hdev, const struct hid_device_id *id)  |