HID: multitouch: decide if hid-multitouch needs to handle mt devices
Now that hid-generic ignores all win7 compatible multitouch devices, this patch allows hid-multitouch to catch them. The idea is to rely on the quirk HID_QUIRK_MULTITOUCH to drop the device if no ContactID is given. There is the need for a blacklist here as other devices may need a special driver (ntrig for instance). Signed-off-by: Benjamin Tissoires <benjamin.tissoires@gmail.com> Signed-off-by: Jiri Kosina <jkosina@suse.cz>
This commit is contained in:
		
					parent
					
						
							
								b77c3920e9
							
						
					
				
			
			
				commit
				
					
						0db3bfc72a
					
				
			
		
					 1 changed files with 43 additions and 4 deletions
				
			
		|  | @ -291,6 +291,7 @@ static int mt_input_mapping(struct hid_device *hdev, struct hid_input *hi, | |||
| 			td->last_slot_field = usage->hid; | ||||
| 			td->last_field_index = field->index; | ||||
| 			td->last_mt_collection = usage->collection_index; | ||||
| 			hdev->quirks &= ~HID_QUIRK_MULTITOUCH; | ||||
| 			return 1; | ||||
| 		case HID_DG_WIDTH: | ||||
| 			hid_map_usage(hi, usage, bit, max, | ||||
|  | @ -529,12 +530,44 @@ static void mt_set_input_mode(struct hid_device *hdev) | |||
| 	} | ||||
| } | ||||
| 
 | ||||
| /* a list of devices for which there is a specialized multitouch driver */ | ||||
| static const struct hid_device_id mt_have_special_driver[] = { | ||||
| 	{ HID_USB_DEVICE(USB_VENDOR_ID_NTRIG, 0x0001) }, | ||||
| 	{ HID_USB_DEVICE(USB_VENDOR_ID_NTRIG, 0x0006) }, | ||||
| 	{ HID_USB_DEVICE(USB_VENDOR_ID_QUANTA, | ||||
| 			USB_DEVICE_ID_PIXART_IMAGING_INC_OPTICAL_TOUCH_SCREEN) }, | ||||
| 	{ HID_USB_DEVICE(USB_VENDOR_ID_QUANTA, | ||||
| 			USB_DEVICE_ID_QUANTA_OPTICAL_TOUCH) }, | ||||
| 	{ } | ||||
| }; | ||||
| 
 | ||||
| static bool mt_match_one_id(struct hid_device *hdev, | ||||
| 		const struct hid_device_id *id) | ||||
| { | ||||
| 	return id->bus == hdev->bus && | ||||
| 		(id->vendor == HID_ANY_ID || id->vendor == hdev->vendor) && | ||||
| 		(id->product == HID_ANY_ID || id->product == hdev->product); | ||||
| } | ||||
| 
 | ||||
| static const struct hid_device_id *mt_match_id(struct hid_device *hdev, | ||||
| 		const struct hid_device_id *id) | ||||
| { | ||||
| 	for (; id->bus; id++) | ||||
| 		if (mt_match_one_id(hdev, id)) | ||||
| 			return id; | ||||
| 
 | ||||
| 	return NULL; | ||||
| } | ||||
| 
 | ||||
| static int mt_probe(struct hid_device *hdev, const struct hid_device_id *id) | ||||
| { | ||||
| 	int ret, i; | ||||
| 	struct mt_device *td; | ||||
| 	struct mt_class *mtclass = mt_classes; /* MT_CLS_DEFAULT */ | ||||
| 
 | ||||
| 	if (mt_match_id(hdev, mt_have_special_driver)) | ||||
| 		return -ENODEV; | ||||
| 
 | ||||
| 	for (i = 0; mt_classes[i].name ; i++) { | ||||
| 		if (id->driver_data == mt_classes[i].name) { | ||||
| 			mtclass = &(mt_classes[i]); | ||||
|  | @ -542,10 +575,6 @@ static int mt_probe(struct hid_device *hdev, const struct hid_device_id *id) | |||
| 		} | ||||
| 	} | ||||
| 
 | ||||
| 	/* This allows the driver to correctly support devices
 | ||||
| 	 * that emit events over several HID messages. | ||||
| 	 */ | ||||
| 	hdev->quirks |= HID_QUIRK_NO_INPUT_SYNC; | ||||
| 
 | ||||
| 	td = kzalloc(sizeof(struct mt_device), GFP_KERNEL); | ||||
| 	if (!td) { | ||||
|  | @ -561,10 +590,16 @@ static int mt_probe(struct hid_device *hdev, const struct hid_device_id *id) | |||
| 	if (ret != 0) | ||||
| 		goto fail; | ||||
| 
 | ||||
| 	hdev->quirks |= HID_QUIRK_MULTITOUCH; | ||||
| 	ret = hid_hw_start(hdev, HID_CONNECT_DEFAULT); | ||||
| 	if (ret) | ||||
| 		goto fail; | ||||
| 
 | ||||
| 	/* This allows the driver to correctly support devices
 | ||||
| 	 * that emit events over several HID messages. | ||||
| 	 */ | ||||
| 	hdev->quirks |= HID_QUIRK_NO_INPUT_SYNC; | ||||
| 
 | ||||
| 	td->slots = kzalloc(td->maxcontacts * sizeof(struct mt_slot), | ||||
| 				GFP_KERNEL); | ||||
| 	if (!td->slots) { | ||||
|  | @ -758,6 +793,10 @@ static const struct hid_device_id mt_devices[] = { | |||
| 		HID_USB_DEVICE(USB_VENDOR_ID_XAT, | ||||
| 			USB_DEVICE_ID_XAT_CSR) }, | ||||
| 
 | ||||
| 	/* Rest of the world */ | ||||
| 	{ .driver_data = MT_CLS_DEFAULT, | ||||
| 		HID_USB_DEVICE(HID_ANY_ID, HID_ANY_ID) }, | ||||
| 
 | ||||
| 	{ } | ||||
| }; | ||||
| MODULE_DEVICE_TABLE(hid, mt_devices); | ||||
|  |  | |||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue
	
	 Benjamin Tissoires
				Benjamin Tissoires