hid-multitouch.c 38.4 KB
Newer Older
1 2 3
/*
 *  HID driver for multitouch panels
 *
4
 *  Copyright (c) 2010-2012 Stephane Chatty <chatty@enac.fr>
5
 *  Copyright (c) 2010-2013 Benjamin Tissoires <benjamin.tissoires@gmail.com>
6
 *  Copyright (c) 2010-2012 Ecole Nationale de l'Aviation Civile, France
7
 *  Copyright (c) 2012-2013 Red Hat, Inc
8
 *
9 10 11 12 13 14
 *  This code is partly based on hid-egalax.c:
 *
 *  Copyright (c) 2010 Stephane Chatty <chatty@enac.fr>
 *  Copyright (c) 2010 Henrik Rydberg <rydberg@euromail.se>
 *  Copyright (c) 2010 Canonical, Ltd.
 *
15 16 17 18 19 20
 *  This code is partly based on hid-3m-pct.c:
 *
 *  Copyright (c) 2009-2010 Stephane Chatty <chatty@enac.fr>
 *  Copyright (c) 2010      Henrik Rydberg <rydberg@euromail.se>
 *  Copyright (c) 2010      Canonical, Ltd.
 *
21 22 23 24 25 26 27 28 29
 */

/*
 * This program is free software; you can redistribute it and/or modify it
 * under the terms of the GNU General Public License as published by the Free
 * Software Foundation; either version 2 of the License, or (at your option)
 * any later version.
 */

30 31 32 33 34 35 36 37 38 39 40
/*
 * This driver is regularly tested thanks to the tool hid-test[1].
 * This tool relies on hid-replay[2] and a database of hid devices[3].
 * Please run these regression tests before patching this module so that
 * your patch won't break existing known devices.
 *
 * [1] https://github.com/bentiss/hid-test
 * [2] https://github.com/bentiss/hid-replay
 * [3] https://github.com/bentiss/hid-devices
 */

41 42 43 44 45 46 47 48 49
#include <linux/device.h>
#include <linux/hid.h>
#include <linux/module.h>
#include <linux/slab.h>
#include <linux/usb.h>
#include <linux/input/mt.h>


MODULE_AUTHOR("Stephane Chatty <chatty@enac.fr>");
50
MODULE_AUTHOR("Benjamin Tissoires <benjamin.tissoires@gmail.com>");
51 52 53 54 55 56 57 58
MODULE_DESCRIPTION("HID multitouch panels");
MODULE_LICENSE("GPL");

#include "hid-ids.h"

/* quirks to control the device */
#define MT_QUIRK_NOT_SEEN_MEANS_UP	(1 << 0)
#define MT_QUIRK_SLOT_IS_CONTACTID	(1 << 1)
59
#define MT_QUIRK_CYPRESS		(1 << 2)
60
#define MT_QUIRK_SLOT_IS_CONTACTNUMBER	(1 << 3)
61 62 63 64
#define MT_QUIRK_ALWAYS_VALID		(1 << 4)
#define MT_QUIRK_VALID_IS_INRANGE	(1 << 5)
#define MT_QUIRK_VALID_IS_CONFIDENCE	(1 << 6)
#define MT_QUIRK_SLOT_IS_CONTACTID_MINUS_ONE	(1 << 8)
65
#define MT_QUIRK_NO_AREA		(1 << 9)
66
#define MT_QUIRK_IGNORE_DUPLICATES	(1 << 10)
67
#define MT_QUIRK_HOVERING		(1 << 11)
68
#define MT_QUIRK_CONTACT_CNT_ACCURATE	(1 << 12)
69 70

struct mt_slot {
71
	__s32 x, y, cx, cy, p, w, h;
72 73
	__s32 contactid;	/* the device ContactID assigned to this slot */
	bool touch_state;	/* is the touch valid? */
74
	bool inrange_state;	/* is the finger in proximity of the sensor? */
75 76
};

77 78 79 80 81 82 83 84
struct mt_class {
	__s32 name;	/* MT_CLS */
	__s32 quirks;
	__s32 sn_move;	/* Signal/noise ratio for move events */
	__s32 sn_width;	/* Signal/noise ratio for width events */
	__s32 sn_height;	/* Signal/noise ratio for height events */
	__s32 sn_pressure;	/* Signal/noise ratio for pressure events */
	__u8 maxcontacts;
85
	bool is_indirect;	/* true for touchpads */
86 87
};

88 89 90 91 92
struct mt_fields {
	unsigned usages[HID_MAX_FIELDS];
	unsigned int length;
};

93 94
struct mt_device {
	struct mt_slot curdata;	/* placeholder of incoming data */
95
	struct mt_class mtclass;	/* our mt device class */
96 97
	struct mt_fields *fields;	/* temporary placeholder for storing the
					   multitouch fields */
98 99
	int cc_index;	/* contact count field index in the report */
	int cc_value_index;	/* contact count value index in the field */
100
	unsigned last_slot_field;	/* the last field of a slot */
101
	unsigned mt_report_id;	/* the report ID of the multitouch device */
102
	unsigned pen_report_id;	/* the report ID of the pen device */
103
	__s8 inputmode;		/* InputMode HID feature, -1 if non-existent */
104
	__s8 inputmode_index;	/* InputMode HID feature index in the report */
105 106
	__s8 maxcontact_report_id;	/* Maximum Contact Number HID feature,
				   -1 if non-existent */
107 108
	__u8 num_received;	/* how many contacts we received */
	__u8 num_expected;	/* expected last contact index */
109
	__u8 maxcontacts;
110 111 112
	__u8 touches_by_report;	/* how many touches are present in one report:
				* 1 means we should use a serial protocol
				* > 1 means hybrid (multitouch) protocol */
113
	bool serial_maybe;	/* need to check for serial protocol */
114
	bool curvalid;		/* is the current contact valid? */
115
	unsigned mt_flags;	/* flags to pass to input-mt */
116 117
};

118 119 120
static void mt_post_parse_default_settings(struct mt_device *td);
static void mt_post_parse(struct mt_device *td);

121
/* classes of device behavior */
122 123
#define MT_CLS_DEFAULT				0x0001

124 125
#define MT_CLS_SERIAL				0x0002
#define MT_CLS_CONFIDENCE			0x0003
126 127 128 129 130
#define MT_CLS_CONFIDENCE_CONTACT_ID		0x0004
#define MT_CLS_CONFIDENCE_MINUS_ONE		0x0005
#define MT_CLS_DUAL_INRANGE_CONTACTID		0x0006
#define MT_CLS_DUAL_INRANGE_CONTACTNUMBER	0x0007
#define MT_CLS_DUAL_NSMU_CONTACTID		0x0008
131
#define MT_CLS_INRANGE_CONTACTNUMBER		0x0009
132
#define MT_CLS_NSMU				0x000a
133
#define MT_CLS_DUAL_CONTACT_NUMBER		0x0010
134
#define MT_CLS_DUAL_CONTACT_ID			0x0011
135 136 137 138 139

/* vendor specific classes */
#define MT_CLS_3M				0x0101
#define MT_CLS_CYPRESS				0x0102
#define MT_CLS_EGALAX				0x0103
140
#define MT_CLS_EGALAX_SERIAL			0x0104
141
#define MT_CLS_TOPSEED				0x0105
142
#define MT_CLS_PANASONIC			0x0106
143
#define MT_CLS_FLATFROG				0x0107
144 145
#define MT_CLS_GENERALTOUCH_TWOFINGERS		0x0108
#define MT_CLS_GENERALTOUCH_PWT_TENFINGERS	0x0109
146

147
#define MT_DEFAULT_MAXCONTACT	10
148
#define MT_MAX_MAXCONTACT	250
149

150 151 152
#define MT_USB_DEVICE(v, p)	HID_DEVICE(BUS_USB, HID_GROUP_MULTITOUCH, v, p)
#define MT_BT_DEVICE(v, p)	HID_DEVICE(BUS_BLUETOOTH, HID_GROUP_MULTITOUCH, v, p)

153 154 155 156 157
/*
 * these device-dependent functions determine what slot corresponds
 * to a valid contact that was just read.
 */

158 159 160 161 162 163 164 165
static int cypress_compute_slot(struct mt_device *td)
{
	if (td->curdata.contactid != 0 || td->num_received == 0)
		return td->curdata.contactid;
	else
		return -1;
}

166
static struct mt_class mt_classes[] = {
167
	{ .name = MT_CLS_DEFAULT,
168 169 170
		.quirks = MT_QUIRK_ALWAYS_VALID |
			MT_QUIRK_CONTACT_CNT_ACCURATE },
	{ .name = MT_CLS_NSMU,
171
		.quirks = MT_QUIRK_NOT_SEEN_MEANS_UP },
172 173
	{ .name = MT_CLS_SERIAL,
		.quirks = MT_QUIRK_ALWAYS_VALID},
174 175
	{ .name = MT_CLS_CONFIDENCE,
		.quirks = MT_QUIRK_VALID_IS_CONFIDENCE },
176 177 178
	{ .name = MT_CLS_CONFIDENCE_CONTACT_ID,
		.quirks = MT_QUIRK_VALID_IS_CONFIDENCE |
			MT_QUIRK_SLOT_IS_CONTACTID },
179 180 181
	{ .name = MT_CLS_CONFIDENCE_MINUS_ONE,
		.quirks = MT_QUIRK_VALID_IS_CONFIDENCE |
			MT_QUIRK_SLOT_IS_CONTACTID_MINUS_ONE },
182
	{ .name = MT_CLS_DUAL_INRANGE_CONTACTID,
183 184 185
		.quirks = MT_QUIRK_VALID_IS_INRANGE |
			MT_QUIRK_SLOT_IS_CONTACTID,
		.maxcontacts = 2 },
186
	{ .name = MT_CLS_DUAL_INRANGE_CONTACTNUMBER,
187 188 189
		.quirks = MT_QUIRK_VALID_IS_INRANGE |
			MT_QUIRK_SLOT_IS_CONTACTNUMBER,
		.maxcontacts = 2 },
190 191 192 193
	{ .name = MT_CLS_DUAL_NSMU_CONTACTID,
		.quirks = MT_QUIRK_NOT_SEEN_MEANS_UP |
			MT_QUIRK_SLOT_IS_CONTACTID,
		.maxcontacts = 2 },
194 195 196
	{ .name = MT_CLS_INRANGE_CONTACTNUMBER,
		.quirks = MT_QUIRK_VALID_IS_INRANGE |
			MT_QUIRK_SLOT_IS_CONTACTNUMBER },
197 198 199 200 201
	{ .name = MT_CLS_DUAL_CONTACT_NUMBER,
		.quirks = MT_QUIRK_ALWAYS_VALID |
			MT_QUIRK_CONTACT_CNT_ACCURATE |
			MT_QUIRK_SLOT_IS_CONTACTNUMBER,
		.maxcontacts = 2 },
202 203 204 205 206
	{ .name = MT_CLS_DUAL_CONTACT_ID,
		.quirks = MT_QUIRK_ALWAYS_VALID |
			MT_QUIRK_CONTACT_CNT_ACCURATE |
			MT_QUIRK_SLOT_IS_CONTACTID,
		.maxcontacts = 2 },
207 208 209 210 211 212 213 214 215

	/*
	 * vendor specific classes
	 */
	{ .name = MT_CLS_3M,
		.quirks = MT_QUIRK_VALID_IS_CONFIDENCE |
			MT_QUIRK_SLOT_IS_CONTACTID,
		.sn_move = 2048,
		.sn_width = 128,
216 217 218
		.sn_height = 128,
		.maxcontacts = 60,
	},
219 220 221 222
	{ .name = MT_CLS_CYPRESS,
		.quirks = MT_QUIRK_NOT_SEEN_MEANS_UP |
			MT_QUIRK_CYPRESS,
		.maxcontacts = 10 },
223 224
	{ .name = MT_CLS_EGALAX,
		.quirks =  MT_QUIRK_SLOT_IS_CONTACTID |
225
			MT_QUIRK_VALID_IS_INRANGE,
226 227 228
		.sn_move = 4096,
		.sn_pressure = 32,
	},
229 230 231
	{ .name = MT_CLS_EGALAX_SERIAL,
		.quirks =  MT_QUIRK_SLOT_IS_CONTACTID |
			MT_QUIRK_ALWAYS_VALID,
232 233 234
		.sn_move = 4096,
		.sn_pressure = 32,
	},
235 236 237 238 239
	{ .name = MT_CLS_TOPSEED,
		.quirks = MT_QUIRK_ALWAYS_VALID,
		.is_indirect = true,
		.maxcontacts = 2,
	},
240 241 242
	{ .name = MT_CLS_PANASONIC,
		.quirks = MT_QUIRK_NOT_SEEN_MEANS_UP,
		.maxcontacts = 4 },
243 244 245 246 247 248 249 250
	{ .name	= MT_CLS_GENERALTOUCH_TWOFINGERS,
		.quirks	= MT_QUIRK_NOT_SEEN_MEANS_UP |
			MT_QUIRK_VALID_IS_INRANGE |
			MT_QUIRK_SLOT_IS_CONTACTNUMBER,
		.maxcontacts = 2
	},
	{ .name	= MT_CLS_GENERALTOUCH_PWT_TENFINGERS,
		.quirks	= MT_QUIRK_NOT_SEEN_MEANS_UP |
251
			MT_QUIRK_SLOT_IS_CONTACTNUMBER
252
	},
253

254 255 256 257 258 259
	{ .name = MT_CLS_FLATFROG,
		.quirks = MT_QUIRK_NOT_SEEN_MEANS_UP |
			MT_QUIRK_NO_AREA,
		.sn_move = 2048,
		.maxcontacts = 40,
	},
260
	{ }
261 262
};

263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286
static ssize_t mt_show_quirks(struct device *dev,
			   struct device_attribute *attr,
			   char *buf)
{
	struct hid_device *hdev = container_of(dev, struct hid_device, dev);
	struct mt_device *td = hid_get_drvdata(hdev);

	return sprintf(buf, "%u\n", td->mtclass.quirks);
}

static ssize_t mt_set_quirks(struct device *dev,
			  struct device_attribute *attr,
			  const char *buf, size_t count)
{
	struct hid_device *hdev = container_of(dev, struct hid_device, dev);
	struct mt_device *td = hid_get_drvdata(hdev);

	unsigned long val;

	if (kstrtoul(buf, 0, &val))
		return -EINVAL;

	td->mtclass.quirks = val;

287
	if (td->cc_index < 0)
288 289
		td->mtclass.quirks &= ~MT_QUIRK_CONTACT_CNT_ACCURATE;

290 291 292 293 294 295 296 297 298 299 300 301 302 303
	return count;
}

static DEVICE_ATTR(quirks, S_IWUSR | S_IRUGO, mt_show_quirks, mt_set_quirks);

static struct attribute *sysfs_attrs[] = {
	&dev_attr_quirks.attr,
	NULL
};

static struct attribute_group mt_attribute_group = {
	.attrs = sysfs_attrs
};

304
static void mt_feature_mapping(struct hid_device *hdev,
305 306
		struct hid_field *field, struct hid_usage *usage)
{
307
	struct mt_device *td = hid_get_drvdata(hdev);
308
	int i;
309 310 311

	switch (usage->hid) {
	case HID_DG_INPUTMODE:
312
		td->inputmode = field->report->id;
313 314 315 316 317 318 319 320 321
		td->inputmode_index = 0; /* has to be updated below */

		for (i=0; i < field->maxusage; i++) {
			if (field->usage[i].hid == usage->hid) {
				td->inputmode_index = i;
				break;
			}
		}

322 323
		break;
	case HID_DG_CONTACTMAX:
324
		td->maxcontact_report_id = field->report->id;
325
		td->maxcontacts = field->value[0];
326 327 328
		if (!td->maxcontacts &&
		    field->logical_maximum <= MT_MAX_MAXCONTACT)
			td->maxcontacts = field->logical_maximum;
329
		if (td->mtclass.maxcontacts)
330
			/* check if the maxcontacts is given by the class */
331
			td->maxcontacts = td->mtclass.maxcontacts;
332 333

		break;
334 335 336 337 338 339 340
	case 0xff0000c5:
		if (field->report_count == 256 && field->report_size == 8) {
			/* Win 8 devices need special quirks */
			__s32 *quirks = &td->mtclass.quirks;
			*quirks |= MT_QUIRK_ALWAYS_VALID;
			*quirks |= MT_QUIRK_IGNORE_DUPLICATES;
			*quirks |= MT_QUIRK_HOVERING;
341
			*quirks |= MT_QUIRK_CONTACT_CNT_ACCURATE;
342 343 344 345 346
			*quirks &= ~MT_QUIRK_NOT_SEEN_MEANS_UP;
			*quirks &= ~MT_QUIRK_VALID_IS_INRANGE;
			*quirks &= ~MT_QUIRK_VALID_IS_CONFIDENCE;
		}
		break;
347 348 349 350 351 352 353 354 355 356
	}
}

static void set_abs(struct input_dev *input, unsigned int code,
		struct hid_field *field, int snratio)
{
	int fmin = field->logical_minimum;
	int fmax = field->logical_maximum;
	int fuzz = snratio ? (fmax - fmin) / snratio : 0;
	input_set_abs_params(input, code, fmin, fmax, fuzz, 0);
357
	input_abs_set_res(input, code, hidinput_calc_abs_res(field, code));
358 359
}

360
static void mt_store_field(struct hid_usage *usage, struct mt_device *td,
361 362
		struct hid_input *hi)
{
363 364 365 366 367 368
	struct mt_fields *f = td->fields;

	if (f->length >= HID_MAX_FIELDS)
		return;

	f->usages[f->length++] = usage->hid;
369 370
}

371 372 373 374 375 376 377 378 379 380 381 382 383 384 385 386 387 388 389 390 391 392 393 394 395 396 397 398 399 400 401 402 403 404 405 406 407
static int mt_pen_input_mapping(struct hid_device *hdev, struct hid_input *hi,
		struct hid_field *field, struct hid_usage *usage,
		unsigned long **bit, int *max)
{
	struct mt_device *td = hid_get_drvdata(hdev);

	td->pen_report_id = field->report->id;

	return 0;
}

static int mt_pen_input_mapped(struct hid_device *hdev, struct hid_input *hi,
		struct hid_field *field, struct hid_usage *usage,
		unsigned long **bit, int *max)
{
	return 0;
}

static int mt_pen_event(struct hid_device *hid, struct hid_field *field,
				struct hid_usage *usage, __s32 value)
{
	/* let hid-input handle it */
	return 0;
}

static void mt_pen_report(struct hid_device *hid, struct hid_report *report)
{
	struct hid_field *field = report->field[0];

	input_sync(field->hidinput->input);
}

static void mt_pen_input_configured(struct hid_device *hdev,
					struct hid_input *hi)
{
}

408
static int mt_touch_input_mapping(struct hid_device *hdev, struct hid_input *hi,
409 410 411 412
		struct hid_field *field, struct hid_usage *usage,
		unsigned long **bit, int *max)
{
	struct mt_device *td = hid_get_drvdata(hdev);
413
	struct mt_class *cls = &td->mtclass;
414
	int code;
415
	struct hid_usage *prev_usage = NULL;
416

417
	if (field->application == HID_DG_TOUCHSCREEN)
418
		td->mt_flags |= INPUT_MT_DIRECT;
419

420 421
	/*
	 * Model touchscreens providing buttons as touchpads.
422 423
	 */
	if (field->application == HID_DG_TOUCHPAD ||
424 425
	    (usage->hid & HID_USAGE_PAGE) == HID_UP_BUTTON)
		td->mt_flags |= INPUT_MT_POINTER;
426

427 428 429
	if (usage->usage_index)
		prev_usage = &field->usage[usage->usage_index - 1];

430 431 432 433 434
	switch (usage->hid & HID_USAGE_PAGE) {

	case HID_UP_GENDESK:
		switch (usage->hid) {
		case HID_GD_X:
435 436 437 438 439 440 441
			if (prev_usage && (prev_usage->hid == usage->hid)) {
				hid_map_usage(hi, usage, bit, max,
					EV_ABS, ABS_MT_TOOL_X);
				set_abs(hi->input, ABS_MT_TOOL_X, field,
					cls->sn_move);
			} else {
				hid_map_usage(hi, usage, bit, max,
442
					EV_ABS, ABS_MT_POSITION_X);
443 444 445 446
				set_abs(hi->input, ABS_MT_POSITION_X, field,
					cls->sn_move);
			}

447
			mt_store_field(usage, td, hi);
448 449
			return 1;
		case HID_GD_Y:
450 451 452 453 454 455 456
			if (prev_usage && (prev_usage->hid == usage->hid)) {
				hid_map_usage(hi, usage, bit, max,
					EV_ABS, ABS_MT_TOOL_Y);
				set_abs(hi->input, ABS_MT_TOOL_Y, field,
					cls->sn_move);
			} else {
				hid_map_usage(hi, usage, bit, max,
457
					EV_ABS, ABS_MT_POSITION_Y);
458 459 460 461
				set_abs(hi->input, ABS_MT_POSITION_Y, field,
					cls->sn_move);
			}

462
			mt_store_field(usage, td, hi);
463 464 465 466 467 468 469
			return 1;
		}
		return 0;

	case HID_UP_DIGITIZER:
		switch (usage->hid) {
		case HID_DG_INRANGE:
470 471 472 473 474 475
			if (cls->quirks & MT_QUIRK_HOVERING) {
				hid_map_usage(hi, usage, bit, max,
					EV_ABS, ABS_MT_DISTANCE);
				input_set_abs_params(hi->input,
					ABS_MT_DISTANCE, 0, 1, 0, 0);
			}
476
			mt_store_field(usage, td, hi);
477 478
			return 1;
		case HID_DG_CONFIDENCE:
479
			mt_store_field(usage, td, hi);
480 481 482 483
			return 1;
		case HID_DG_TIPSWITCH:
			hid_map_usage(hi, usage, bit, max, EV_KEY, BTN_TOUCH);
			input_set_capability(hi->input, EV_KEY, BTN_TOUCH);
484
			mt_store_field(usage, td, hi);
485 486
			return 1;
		case HID_DG_CONTACTID:
487
			mt_store_field(usage, td, hi);
488
			td->touches_by_report++;
489
			td->mt_report_id = field->report->id;
490 491 492 493
			return 1;
		case HID_DG_WIDTH:
			hid_map_usage(hi, usage, bit, max,
					EV_ABS, ABS_MT_TOUCH_MAJOR);
494 495 496
			if (!(cls->quirks & MT_QUIRK_NO_AREA))
				set_abs(hi->input, ABS_MT_TOUCH_MAJOR, field,
					cls->sn_width);
497
			mt_store_field(usage, td, hi);
498 499 500 501
			return 1;
		case HID_DG_HEIGHT:
			hid_map_usage(hi, usage, bit, max,
					EV_ABS, ABS_MT_TOUCH_MINOR);
502 503 504 505
			if (!(cls->quirks & MT_QUIRK_NO_AREA)) {
				set_abs(hi->input, ABS_MT_TOUCH_MINOR, field,
					cls->sn_height);
				input_set_abs_params(hi->input,
506
					ABS_MT_ORIENTATION, 0, 1, 0, 0);
507
			}
508
			mt_store_field(usage, td, hi);
509 510 511 512 513 514
			return 1;
		case HID_DG_TIPPRESSURE:
			hid_map_usage(hi, usage, bit, max,
					EV_ABS, ABS_MT_PRESSURE);
			set_abs(hi->input, ABS_MT_PRESSURE, field,
				cls->sn_pressure);
515
			mt_store_field(usage, td, hi);
516 517
			return 1;
		case HID_DG_CONTACTCOUNT:
518 519
			td->cc_index = field->index;
			td->cc_value_index = usage->usage_index;
520 521 522 523 524
			return 1;
		case HID_DG_CONTACTMAX:
			/* we don't set td->last_slot_field as contactcount and
			 * contact max are global to the report */
			return -1;
525 526 527 528
		case HID_DG_TOUCH:
			/* Legacy devices use TIPSWITCH and not TOUCH.
			 * Let's just ignore this field. */
			return -1;
529
		}
530 531 532
		/* let hid-input decide for the others */
		return 0;

533 534 535 536 537 538
	case HID_UP_BUTTON:
		code = BTN_MOUSE + ((usage->hid - 1) & HID_USAGE);
		hid_map_usage(hi, usage, bit, max, EV_KEY, code);
		input_set_capability(hi->input, EV_KEY, code);
		return 1;

539 540 541 542 543 544 545 546
	case 0xff000000:
		/* we do not want to map these: no input-oriented meaning */
		return -1;
	}

	return 0;
}

547
static int mt_touch_input_mapped(struct hid_device *hdev, struct hid_input *hi,
548 549 550 551 552 553 554 555 556
		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;
}

557
static int mt_compute_slot(struct mt_device *td, struct input_dev *input)
558
{
559
	__s32 quirks = td->mtclass.quirks;
560

561 562
	if (quirks & MT_QUIRK_SLOT_IS_CONTACTID)
		return td->curdata.contactid;
563

564
	if (quirks & MT_QUIRK_CYPRESS)
565 566
		return cypress_compute_slot(td);

567 568
	if (quirks & MT_QUIRK_SLOT_IS_CONTACTNUMBER)
		return td->num_received;
569

570 571 572
	if (quirks & MT_QUIRK_SLOT_IS_CONTACTID_MINUS_ONE)
		return td->curdata.contactid - 1;

573
	return input_mt_get_slot_by_key(input, td->curdata.contactid);
574 575 576 577 578 579
}

/*
 * this function is called when a whole contact has been processed,
 * so that it can assign it to a slot and store the data there
 */
580
static void mt_complete_slot(struct mt_device *td, struct input_dev *input)
581
{
582 583 584 585
	if ((td->mtclass.quirks & MT_QUIRK_CONTACT_CNT_ACCURATE) &&
	    td->num_received >= td->num_expected)
		return;

586
	if (td->curvalid || (td->mtclass.quirks & MT_QUIRK_ALWAYS_VALID)) {
587 588
		int slotnum = mt_compute_slot(td, input);
		struct mt_slot *s = &td->curdata;
589
		struct input_mt *mt = input->mt;
590

591 592
		if (slotnum < 0 || slotnum >= td->maxcontacts)
			return;
593

594 595 596 597 598 599 600
		if ((td->mtclass.quirks & MT_QUIRK_IGNORE_DUPLICATES) && mt) {
			struct input_mt_slot *slot = &mt->slots[slotnum];
			if (input_mt_is_active(slot) &&
			    input_mt_is_used(mt, slot))
				return;
		}

601
		input_mt_slot(input, slotnum);
602
		input_mt_report_slot_state(input, MT_TOOL_FINGER,
603 604 605
			s->touch_state || s->inrange_state);
		if (s->touch_state || s->inrange_state) {
			/* this finger is in proximity of the sensor */
606 607 608 609 610
			int wide = (s->w > s->h);
			/* divided by two to match visual scale of touch */
			int major = max(s->w, s->h) >> 1;
			int minor = min(s->w, s->h) >> 1;

611 612
			input_event(input, EV_ABS, ABS_MT_POSITION_X, s->x);
			input_event(input, EV_ABS, ABS_MT_POSITION_Y, s->y);
613 614
			input_event(input, EV_ABS, ABS_MT_TOOL_X, s->cx);
			input_event(input, EV_ABS, ABS_MT_TOOL_Y, s->cy);
615 616
			input_event(input, EV_ABS, ABS_MT_DISTANCE,
				!s->touch_state);
617
			input_event(input, EV_ABS, ABS_MT_ORIENTATION, wide);
618
			input_event(input, EV_ABS, ABS_MT_PRESSURE, s->p);
619 620
			input_event(input, EV_ABS, ABS_MT_TOUCH_MAJOR, major);
			input_event(input, EV_ABS, ABS_MT_TOUCH_MINOR, minor);
621
		}
622 623
	}

624 625 626 627 628 629 630 631 632
	td->num_received++;
}

/*
 * this function is called when a whole packet has been received and processed,
 * so that it can decide what to send to the input layer.
 */
static void mt_sync_frame(struct mt_device *td, struct input_dev *input)
{
633
	input_mt_sync_frame(input);
634 635 636 637
	input_sync(input);
	td->num_received = 0;
}

638
static int mt_touch_event(struct hid_device *hid, struct hid_field *field,
639
				struct hid_usage *usage, __s32 value)
640 641 642 643 644 645 646 647 648 649
{
	/* we will handle the hidinput part later, now remains hiddev */
	if (hid->claimed & HID_CLAIMED_HIDDEV && hid->hiddev_hid_event)
		hid->hiddev_hid_event(hid, field, usage, value);

	return 1;
}

static void mt_process_mt_event(struct hid_device *hid, struct hid_field *field,
				struct hid_usage *usage, __s32 value)
650 651
{
	struct mt_device *td = hid_get_drvdata(hid);
652
	__s32 quirks = td->mtclass.quirks;
653

654
	if (hid->claimed & HID_CLAIMED_INPUT) {
655 656
		switch (usage->hid) {
		case HID_DG_INRANGE:
657
			if (quirks & MT_QUIRK_VALID_IS_INRANGE)
658
				td->curvalid = value;
659 660
			if (quirks & MT_QUIRK_HOVERING)
				td->curdata.inrange_state = value;
661 662
			break;
		case HID_DG_TIPSWITCH:
663 664
			if (quirks & MT_QUIRK_NOT_SEEN_MEANS_UP)
				td->curvalid = value;
665 666 667
			td->curdata.touch_state = value;
			break;
		case HID_DG_CONFIDENCE:
668 669
			if (quirks & MT_QUIRK_VALID_IS_CONFIDENCE)
				td->curvalid = value;
670 671 672 673 674 675 676 677
			break;
		case HID_DG_CONTACTID:
			td->curdata.contactid = value;
			break;
		case HID_DG_TIPPRESSURE:
			td->curdata.p = value;
			break;
		case HID_GD_X:
678 679 680 681
			if (usage->code == ABS_MT_TOOL_X)
				td->curdata.cx = value;
			else
				td->curdata.x = value;
682 683
			break;
		case HID_GD_Y:
684 685 686 687
			if (usage->code == ABS_MT_TOOL_Y)
				td->curdata.cy = value;
			else
				td->curdata.y = value;
688 689 690 691 692 693 694 695 696
			break;
		case HID_DG_WIDTH:
			td->curdata.w = value;
			break;
		case HID_DG_HEIGHT:
			td->curdata.h = value;
			break;
		case HID_DG_CONTACTCOUNT:
			break;
697 698 699
		case HID_DG_TOUCH:
			/* do nothing */
			break;
700 701

		default:
702
			return;
703 704
		}

705 706 707 708 709
		if (usage->usage_index + 1 == field->report_count) {
			/* we only take into account the last report. */
			if (usage->hid == td->last_slot_field)
				mt_complete_slot(td, field->hidinput->input);
		}
710

711
	}
712
}
713

714
static void mt_touch_report(struct hid_device *hid, struct hid_report *report)
715 716 717 718 719
{
	struct mt_device *td = hid_get_drvdata(hid);
	struct hid_field *field;
	unsigned count;
	int r, n;
720

721 722 723 724
	/*
	 * Includes multi-packet support where subsequent
	 * packets are sent with zero contactcount.
	 */
725 726 727 728 729 730
	if (td->cc_index >= 0) {
		struct hid_field *field = report->field[td->cc_index];
		int value = field->value[td->cc_value_index];
		if (value)
			td->num_expected = value;
	}
731

732 733 734 735 736 737 738 739 740 741 742
	for (r = 0; r < report->maxfield; r++) {
		field = report->field[r];
		count = field->report_count;

		if (!(HID_MAIN_ITEM_VARIABLE & field->flags))
			continue;

		for (n = 0; n < count; n++)
			mt_process_mt_event(hid, field, &field->usage[n],
					field->value[n]);
	}
743 744 745

	if (td->num_received >= td->num_expected)
		mt_sync_frame(td, report->field[0]->hidinput->input);
746 747
}

748 749 750 751 752 753 754 755 756 757 758 759 760 761 762 763 764 765 766 767 768 769 770 771 772 773 774 775 776 777 778 779 780
static void 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;

	if (!td->maxcontacts)
		td->maxcontacts = MT_DEFAULT_MAXCONTACT;

	mt_post_parse(td);
	if (td->serial_maybe)
		mt_post_parse_default_settings(td);

	if (cls->is_indirect)
		td->mt_flags |= INPUT_MT_POINTER;

	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);

	td->mt_flags = 0;
}

static int mt_input_mapping(struct hid_device *hdev, struct hid_input *hi,
		struct hid_field *field, struct hid_usage *usage,
		unsigned long **bit, int *max)
{
	/* 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 &&
781
	    field->application != HID_DG_PEN &&
782
	    field->application != HID_DG_TOUCHPAD)
783
		return -1;
784 785

	if (field->physical == HID_DG_STYLUS)
786
		return mt_pen_input_mapping(hdev, hi, field, usage, bit, max);
787 788 789 790 791 792 793 794

	return mt_touch_input_mapping(hdev, hi, field, usage, bit, max);
}

static int mt_input_mapped(struct hid_device *hdev, struct hid_input *hi,
		struct hid_field *field, struct hid_usage *usage,
		unsigned long **bit, int *max)
{
795 796 797
	if (field->physical == HID_DG_STYLUS)
		return mt_pen_input_mapped(hdev, hi, field, usage, bit, max);

798 799 800 801 802 803 804 805 806 807 808
	return mt_touch_input_mapped(hdev, hi, field, usage, bit, max);
}

static int mt_event(struct hid_device *hid, struct hid_field *field,
				struct hid_usage *usage, __s32 value)
{
	struct mt_device *td = hid_get_drvdata(hid);

	if (field->report->id == td->mt_report_id)
		return mt_touch_event(hid, field, usage, value);

809 810 811
	if (field->report->id == td->pen_report_id)
		return mt_pen_event(hid, field, usage, value);

812 813 814 815 816 817 818 819 820 821 822 823 824
	/* ignore other reports */
	return 1;
}

static void mt_report(struct hid_device *hid, struct hid_report *report)
{
	struct mt_device *td = hid_get_drvdata(hid);

	if (!(hid->claimed & HID_CLAIMED_INPUT))
		return;

	if (report->id == td->mt_report_id)
		mt_touch_report(hid, report);
825 826 827

	if (report->id == td->pen_report_id)
		mt_pen_report(hid, report);
828 829
}

830 831 832 833 834 835 836 837 838 839 840 841
static void mt_set_input_mode(struct hid_device *hdev)
{
	struct mt_device *td = hid_get_drvdata(hdev);
	struct hid_report *r;
	struct hid_report_enum *re;

	if (td->inputmode < 0)
		return;

	re = &(hdev->report_enum[HID_FEATURE_REPORT]);
	r = re->report_id_hash[td->inputmode];
	if (r) {
842
		r->field[0]->value[td->inputmode_index] = 0x02;
843
		hid_hw_request(hdev, r, HID_REQ_SET_REPORT);
844 845 846
	}
}

847 848 849 850 851 852 853 854 855 856 857 858 859 860 861 862 863 864 865 866 867
static void mt_set_maxcontacts(struct hid_device *hdev)
{
	struct mt_device *td = hid_get_drvdata(hdev);
	struct hid_report *r;
	struct hid_report_enum *re;
	int fieldmax, max;

	if (td->maxcontact_report_id < 0)
		return;

	if (!td->mtclass.maxcontacts)
		return;

	re = &hdev->report_enum[HID_FEATURE_REPORT];
	r = re->report_id_hash[td->maxcontact_report_id];
	if (r) {
		max = td->mtclass.maxcontacts;
		fieldmax = r->field[0]->logical_maximum;
		max = min(fieldmax, max);
		if (r->field[0]->value[0] != max) {
			r->field[0]->value[0] = max;
868
			hid_hw_request(hdev, r, HID_REQ_SET_REPORT);
869 870 871 872
		}
	}
}

873 874 875 876 877 878 879 880 881 882
static void mt_post_parse_default_settings(struct mt_device *td)
{
	__s32 quirks = td->mtclass.quirks;

	/* unknown serial device needs special quirks */
	if (td->touches_by_report == 1) {
		quirks |= MT_QUIRK_ALWAYS_VALID;
		quirks &= ~MT_QUIRK_NOT_SEEN_MEANS_UP;
		quirks &= ~MT_QUIRK_VALID_IS_INRANGE;
		quirks &= ~MT_QUIRK_VALID_IS_CONFIDENCE;
883
		quirks &= ~MT_QUIRK_CONTACT_CNT_ACCURATE;
884 885 886 887 888
	}

	td->mtclass.quirks = quirks;
}

889 890 891
static void mt_post_parse(struct mt_device *td)
{
	struct mt_fields *f = td->fields;
892
	struct mt_class *cls = &td->mtclass;
893 894 895 896 897

	if (td->touches_by_report > 0) {
		int field_count_per_touch = f->length / td->touches_by_report;
		td->last_slot_field = f->usages[field_count_per_touch - 1];
	}
898

899
	if (td->cc_index < 0)
900
		cls->quirks &= ~MT_QUIRK_CONTACT_CNT_ACCURATE;
901 902
}

903 904
static void mt_input_configured(struct hid_device *hdev, struct hid_input *hi)
{
905
	struct mt_device *td = hid_get_drvdata(hdev);
906

907 908
	if (hi->report->id == td->mt_report_id)
		mt_touch_input_configured(hdev, hi);
909 910 911

	if (hi->report->id == td->pen_report_id)
		mt_pen_input_configured(hdev, hi);
912 913
}

914 915
static int mt_probe(struct hid_device *hdev, const struct hid_device_id *id)
{
916
	int ret, i;
917
	struct mt_device *td;
918 919
	struct mt_class *mtclass = mt_classes; /* MT_CLS_DEFAULT */

920 921 922 923
	for (i = 0; mt_classes[i].name ; i++) {
		if (id->driver_data == mt_classes[i].name) {
			mtclass = &(mt_classes[i]);
			break;
924 925
		}
	}
926

927 928 929 930
	/* This allows the driver to correctly support devices
	 * that emit events over several HID messages.
	 */
	hdev->quirks |= HID_QUIRK_NO_INPUT_SYNC;
931

932 933 934 935 936 937 938 939
	/*
	 * This allows the driver to handle different input sensors
	 * that emits events through different reports on the same HID
	 * device.
	 */
	hdev->quirks |= HID_QUIRK_MULTI_INPUT;
	hdev->quirks |= HID_QUIRK_NO_EMPTY_INPUT;

940
	td = kzalloc(sizeof(struct mt_device), GFP_KERNEL);
941 942 943 944
	if (!td) {
		dev_err(&hdev->dev, "cannot allocate multitouch data\n");
		return -ENOMEM;
	}
945
	td->mtclass = *mtclass;
946
	td->inputmode = -1;
947
	td->maxcontact_report_id = -1;
948
	td->cc_index = -1;
949 950
	td->mt_report_id = -1;
	td->pen_report_id = -1;
951 952
	hid_set_drvdata(hdev, td);

953 954 955 956 957 958 959
	td->fields = kzalloc(sizeof(struct mt_fields), GFP_KERNEL);
	if (!td->fields) {
		dev_err(&hdev->dev, "cannot allocate multitouch fields data\n");
		ret = -ENOMEM;
		goto fail;
	}

960 961 962
	if (id->vendor == HID_ANY_ID && id->product == HID_ANY_ID)
		td->serial_maybe = true;

963 964 965 966 967
	ret = hid_parse(hdev);
	if (ret != 0)
		goto fail;

	ret = hid_hw_start(hdev, HID_CONNECT_DEFAULT);
968
	if (ret)
969 970
		goto fail;

971 972
	ret = sysfs_create_group(&hdev->dev.kobj, &mt_attribute_group);

973
	mt_set_maxcontacts(hdev);
974 975
	mt_set_input_mode(hdev);

976 977 978
	kfree(td->fields);
	td->fields = NULL;

979 980 981
	return 0;

fail:
982
	kfree(td->fields);
983 984 985 986 987 988 989
	kfree(td);
	return ret;
}

#ifdef CONFIG_PM
static int mt_reset_resume(struct hid_device *hdev)
{
990
	mt_set_maxcontacts(hdev);
991 992 993
	mt_set_input_mode(hdev);
	return 0;
}
994 995 996 997 998 999 1000

static int mt_resume(struct hid_device *hdev)
{
	/* Some Elan legacy devices require SET_IDLE to be set on resume.
	 * It should be safe to send it to other devices too.
	 * Tested on 3M, Stantum, Cypress, Zytronic, eGalax, and Elan panels. */

1001
	hid_hw_idle(hdev, 0, 0, HID_REQ_SET_IDLE);
1002 1003 1004

	return 0;
}
1005 1006 1007 1008 1009
#endif

static void mt_remove(struct hid_device *hdev)
{
	struct mt_device *td = hid_get_drvdata(hdev);
1010
	sysfs_remove_group(&hdev->dev.kobj, &mt_attribute_group);
1011 1012 1013 1014 1015 1016 1017
	hid_hw_stop(hdev);
	kfree(td);
	hid_set_drvdata(hdev, NULL);
}

static const struct hid_device_id mt_devices[] = {

1018 1019
	/* 3M panels */
	{ .driver_data = MT_CLS_3M,
1020
		MT_USB_DEVICE(USB_VENDOR_ID_3M,
1021 1022
			USB_DEVICE_ID_3M1968) },
	{ .driver_data = MT_CLS_3M,
1023
		MT_USB_DEVICE(USB_VENDOR_ID_3M,
1024
			USB_DEVICE_ID_3M2256) },
1025
	{ .driver_data = MT_CLS_3M,
1026
		MT_USB_DEVICE(USB_VENDOR_ID_3M,
1027
			USB_DEVICE_ID_3M3266) },
1028

1029
	/* ActionStar panels */
1030
	{ .driver_data = MT_CLS_NSMU,
1031
		MT_USB_DEVICE(USB_VENDOR_ID_ACTIONSTAR,
1032 1033
			USB_DEVICE_ID_ACTIONSTAR_1011) },

1034 1035
	/* Atmel panels */
	{ .driver_data = MT_CLS_SERIAL,
1036
		MT_USB_DEVICE(USB_VENDOR_ID_ATMEL,
1037
			USB_DEVICE_ID_ATMEL_MULTITOUCH) },
1038
	{ .driver_data = MT_CLS_SERIAL,
1039
		MT_USB_DEVICE(USB_VENDOR_ID_ATMEL,
1040
			USB_DEVICE_ID_ATMEL_MXT_DIGITIZER) },
1041

1042
	/* Baanto multitouch devices */
1043
	{ .driver_data = MT_CLS_NSMU,
1044
		MT_USB_DEVICE(USB_VENDOR_ID_BAANTO,
1045
			USB_DEVICE_ID_BAANTO_MT_190W2) },
1046 1047
	/* Cando panels */
	{ .driver_data = MT_CLS_DUAL_INRANGE_CONTACTNUMBER,
1048
		MT_USB_DEVICE(USB_VENDOR_ID_CANDO,
1049
			USB_DEVICE_ID_CANDO_MULTI_TOUCH) },
1050
	{ .driver_data = MT_CLS_DUAL_CONTACT_NUMBER,
1051
		MT_USB_DEVICE(USB_VENDOR_ID_CANDO,
1052 1053
			USB_DEVICE_ID_CANDO_MULTI_TOUCH_10_1) },
	{ .driver_data = MT_CLS_DUAL_INRANGE_CONTACTNUMBER,
1054
		MT_USB_DEVICE(USB_VENDOR_ID_CANDO,
1055 1056
			USB_DEVICE_ID_CANDO_MULTI_TOUCH_11_6) },
	{ .driver_data = MT_CLS_DUAL_INRANGE_CONTACTNUMBER,
1057
		MT_USB_DEVICE(USB_VENDOR_ID_CANDO,
1058 1059
			USB_DEVICE_ID_CANDO_MULTI_TOUCH_15_6) },

1060
	/* Chunghwa Telecom touch panels */
1061
	{  .driver_data = MT_CLS_NSMU,
1062
		MT_USB_DEVICE(USB_VENDOR_ID_CHUNGHWAT,
1063 1064
			USB_DEVICE_ID_CHUNGHWAT_MULTITOUCH) },

1065
	/* CVTouch panels */
1066
	{ .driver_data = MT_CLS_NSMU,
1067
		MT_USB_DEVICE(USB_VENDOR_ID_CVTOUCH,
1068 1069
			USB_DEVICE_ID_CVTOUCH_SCREEN) },

1070 1071 1072 1073 1074
	/* Cypress panel */
	{ .driver_data = MT_CLS_CYPRESS,
		HID_USB_DEVICE(USB_VENDOR_ID_CYPRESS,
			USB_DEVICE_ID_CYPRESS_TRUETOUCH) },

1075
	/* eGalax devices (resistive) */
1076
	{ .driver_data = MT_CLS_EGALAX,
1077
		MT_USB_DEVICE(USB_VENDOR_ID_DWAV,
1078 1079
			USB_DEVICE_ID_DWAV_EGALAX_MULTITOUCH_480D) },
	{ .driver_data = MT_CLS_EGALAX,
1080
		MT_USB_DEVICE(USB_VENDOR_ID_DWAV,
1081
			USB_DEVICE_ID_DWAV_EGALAX_MULTITOUCH_480E) },
1082 1083

	/* eGalax devices (capacitive) */
1084
	{ .driver_data = MT_CLS_EGALAX,
1085
		MT_USB_DEVICE(USB_VENDOR_ID_DWAV,
1086
			USB_DEVICE_ID_DWAV_EGALAX_MULTITOUCH_720C) },
1087
	{ .driver_data = MT_CLS_EGALAX_SERIAL,
1088
		MT_USB_DEVICE(USB_VENDOR_ID_DWAV,
1089 1090
			USB_DEVICE_ID_DWAV_EGALAX_MULTITOUCH_7207) },
	{ .driver_data = MT_CLS_EGALAX_SERIAL,
1091
		MT_USB_DEVICE(USB_VENDOR_ID_DWAV,
1092 1093
			USB_DEVICE_ID_DWAV_EGALAX_MULTITOUCH_725E) },
	{ .driver_data = MT_CLS_EGALAX_SERIAL,
1094
		MT_USB_DEVICE(USB_VENDOR_ID_DWAV,
1095
			USB_DEVICE_ID_DWAV_EGALAX_MULTITOUCH_7224) },
1096
	{ .driver_data = MT_CLS_EGALAX_SERIAL,
1097
		MT_USB_DEVICE(USB_VENDOR_ID_DWAV,
1098
			USB_DEVICE_ID_DWAV_EGALAX_MULTITOUCH_722A) },
1099
	{ .driver_data = MT_CLS_EGALAX,
1100
		MT_USB_DEVICE(USB_VENDOR_ID_DWAV,
1101
			USB_DEVICE_ID_DWAV_EGALAX_MULTITOUCH_726B) },
1102
	{ .driver_data = MT_CLS_EGALAX_SERIAL,
1103
		MT_USB_DEVICE(USB_VENDOR_ID_DWAV,
1104
			USB_DEVICE_ID_DWAV_EGALAX_MULTITOUCH_7262) },
1105
	{ .driver_data = MT_CLS_EGALAX,
1106
		MT_USB_DEVICE(USB_VENDOR_ID_DWAV,
1107
			USB_DEVICE_ID_DWAV_EGALAX_MULTITOUCH_72A1) },
1108
	{ .driver_data = MT_CLS_EGALAX_SERIAL,
1109
		MT_USB_DEVICE(USB_VENDOR_ID_DWAV,
1110
			USB_DEVICE_ID_DWAV_EGALAX_MULTITOUCH_72AA) },
1111
	{ .driver_data = MT_CLS_EGALAX,
1112
		MT_USB_DEVICE(USB_VENDOR_ID_DWAV,
1113
			USB_DEVICE_ID_DWAV_EGALAX_MULTITOUCH_72FA) },
1114
	{ .driver_data = MT_CLS_EGALAX,
1115
		MT_USB_DEVICE(USB_VENDOR_ID_DWAV,
1116
			USB_DEVICE_ID_DWAV_EGALAX_MULTITOUCH_7302) },
1117
	{ .driver_data = MT_CLS_EGALAX_SERIAL,
1118
		MT_USB_DEVICE(USB_VENDOR_ID_DWAV,
1119
			USB_DEVICE_ID_DWAV_EGALAX_MULTITOUCH_7349) },
1120
	{ .driver_data = MT_CLS_EGALAX_SERIAL,
1121 1122
		MT_USB_DEVICE(USB_VENDOR_ID_DWAV,
			USB_DEVICE_ID_DWAV_EGALAX_MULTITOUCH_73F7) },
1123
	{ .driver_data = MT_CLS_EGALAX_SERIAL,
1124
		MT_USB_DEVICE(USB_VENDOR_ID_DWAV,
1125
			USB_DEVICE_ID_DWAV_EGALAX_MULTITOUCH_A001) },
1126 1127 1128 1129 1130 1131 1132 1133 1134
	{ .driver_data = MT_CLS_EGALAX,
		HID_USB_DEVICE(USB_VENDOR_ID_DWAV,
			USB_DEVICE_ID_DWAV_EGALAX_MULTITOUCH_7224) },
	{ .driver_data = MT_CLS_EGALAX,
		HID_USB_DEVICE(USB_VENDOR_ID_DWAV,
			USB_DEVICE_ID_DWAV_EGALAX_MULTITOUCH_72D0) },
	{ .driver_data = MT_CLS_EGALAX,
		HID_USB_DEVICE(USB_VENDOR_ID_DWAV,
			USB_DEVICE_ID_DWAV_EGALAX_MULTITOUCH_72C4) },
1135

1136
	/* Elo TouchSystems IntelliTouch Plus panel */
1137
	{ .driver_data = MT_CLS_DUAL_CONTACT_ID,
1138
		MT_USB_DEVICE(USB_VENDOR_ID_ELO,
1139 1140
			USB_DEVICE_ID_ELO_TS2515) },

1141 1142 1143 1144 1145
	/* Flatfrog Panels */
	{ .driver_data = MT_CLS_FLATFROG,
		MT_USB_DEVICE(USB_VENDOR_ID_FLATFROG,
			USB_DEVICE_ID_MULTITOUCH_3200) },

1146
	/* GeneralTouch panel */
1147
	{ .driver_data = MT_CLS_GENERALTOUCH_TWOFINGERS,
1148
		MT_USB_DEVICE(USB_VENDOR_ID_GENERAL_TOUCH,
1149
			USB_DEVICE_ID_GENERAL_TOUCH_WIN7_TWOFINGERS) },
1150 1151 1152
	{ .driver_data = MT_CLS_GENERALTOUCH_PWT_TENFINGERS,
		MT_USB_DEVICE(USB_VENDOR_ID_GENERAL_TOUCH,
			USB_DEVICE_ID_GENERAL_TOUCH_WIN8_PWT_TENFINGERS) },
1153

1154
	/* Gametel game controller */
1155
	{ .driver_data = MT_CLS_NSMU,
1156
		MT_BT_DEVICE(USB_VENDOR_ID_FRUCTEL,
1157 1158
			USB_DEVICE_ID_GAMETEL_MT_MODE) },

1159
	/* GoodTouch panels */
1160
	{ .driver_data = MT_CLS_NSMU,
1161
		MT_USB_DEVICE(USB_VENDOR_ID_GOODTOUCH,
1162 1163
			USB_DEVICE_ID_GOODTOUCH_000f) },

1164 1165
	/* Hanvon panels */
	{ .driver_data = MT_CLS_DUAL_INRANGE_CONTACTID,
1166
		MT_USB_DEVICE(USB_VENDOR_ID_HANVON_ALT,
1167 1168
			USB_DEVICE_ID_HANVON_ALT_MULTITOUCH) },

1169 1170
	/* Ideacom panel */
	{ .driver_data = MT_CLS_SERIAL,
1171
		MT_USB_DEVICE(USB_VENDOR_ID_IDEACOM,
1172
			USB_DEVICE_ID_IDEACOM_IDC6650) },
1173
	{ .driver_data = MT_CLS_SERIAL,
1174
		MT_USB_DEVICE(USB_VENDOR_ID_IDEACOM,
1175
			USB_DEVICE_ID_IDEACOM_IDC6651) },
1176

1177
	/* Ilitek dual touch panel */
1178
	{  .driver_data = MT_CLS_NSMU,
1179
		MT_USB_DEVICE(USB_VENDOR_ID_ILITEK,
1180 1181
			USB_DEVICE_ID_ILITEK_MULTITOUCH) },

1182 1183
	/* IRTOUCH panels */
	{ .driver_data = MT_CLS_DUAL_INRANGE_CONTACTID,
1184
		MT_USB_DEVICE(USB_VENDOR_ID_IRTOUCHSYSTEMS,
1185 1186
			USB_DEVICE_ID_IRTOUCH_INFRARED_USB) },

1187 1188
	/* LG Display panels */
	{ .driver_data = MT_CLS_DEFAULT,
1189
		MT_USB_DEVICE(USB_VENDOR_ID_LG,
1190 1191
			USB_DEVICE_ID_LG_MULTITOUCH) },

1192 1193
	/* Lumio panels */
	{ .driver_data = MT_CLS_CONFIDENCE_MINUS_ONE,
1194
		MT_USB_DEVICE(USB_VENDOR_ID_LUMIO,
1195
			USB_DEVICE_ID_CRYSTALTOUCH) },
1196
	{ .driver_data = MT_CLS_CONFIDENCE_MINUS_ONE,
1197
		MT_USB_DEVICE(USB_VENDOR_ID_LUMIO,
1198
			USB_DEVICE_ID_CRYSTALTOUCH_DUAL) },
1199

1200 1201
	/* MosArt panels */
	{ .driver_data = MT_CLS_CONFIDENCE_MINUS_ONE,
1202
		MT_USB_DEVICE(USB_VENDOR_ID_ASUS,
1203 1204
			USB_DEVICE_ID_ASUS_T91MT)},
	{ .driver_data = MT_CLS_CONFIDENCE_MINUS_ONE,
1205
		MT_USB_DEVICE(USB_VENDOR_ID_ASUS,
1206 1207
			USB_DEVICE_ID_ASUSTEK_MULTITOUCH_YFO) },
	{ .driver_data = MT_CLS_CONFIDENCE_MINUS_ONE,
1208
		MT_USB_DEVICE(USB_VENDOR_ID_TURBOX,
1209 1210
			USB_DEVICE_ID_TURBOX_TOUCHSCREEN_MOSART) },

1211
	/* Nexio panels */
1212
	{ .driver_data = MT_CLS_DEFAULT,
1213 1214 1215
		MT_USB_DEVICE(USB_VENDOR_ID_NEXIO,
			USB_DEVICE_ID_NEXIO_MULTITOUCH_420)},

1216 1217
	/* Panasonic panels */
	{ .driver_data = MT_CLS_PANASONIC,
1218
		MT_USB_DEVICE(USB_VENDOR_ID_PANASONIC,
1219 1220
			USB_DEVICE_ID_PANABOARD_UBT780) },
	{ .driver_data = MT_CLS_PANASONIC,
1221
		MT_USB_DEVICE(USB_VENDOR_ID_PANASONIC,
1222 1223
			USB_DEVICE_ID_PANABOARD_UBT880) },

1224
	/* Novatek Panel */
1225
	{ .driver_data = MT_CLS_NSMU,
1226
		MT_USB_DEVICE(USB_VENDOR_ID_NOVATEK,
1227 1228
			USB_DEVICE_ID_NOVATEK_PCT) },

1229 1230
	/* PenMount panels */
	{ .driver_data = MT_CLS_CONFIDENCE,
1231
		MT_USB_DEVICE(USB_VENDOR_ID_PENMOUNT,
1232 1233
			USB_DEVICE_ID_PENMOUNT_PCI) },

1234 1235
	/* PixArt optical touch screen */
	{ .driver_data = MT_CLS_INRANGE_CONTACTNUMBER,
1236
		MT_USB_DEVICE(USB_VENDOR_ID_PIXART,
1237 1238
			USB_DEVICE_ID_PIXART_OPTICAL_TOUCH_SCREEN) },
	{ .driver_data = MT_CLS_INRANGE_CONTACTNUMBER,
1239
		MT_USB_DEVICE(USB_VENDOR_ID_PIXART,
1240 1241
			USB_DEVICE_ID_PIXART_OPTICAL_TOUCH_SCREEN1) },
	{ .driver_data = MT_CLS_INRANGE_CONTACTNUMBER,
1242
		MT_USB_DEVICE(USB_VENDOR_ID_PIXART,
1243 1244
			USB_DEVICE_ID_PIXART_OPTICAL_TOUCH_SCREEN2) },

1245
	/* PixCir-based panels */
1246
	{ .driver_data = MT_CLS_DUAL_INRANGE_CONTACTID,
1247
		MT_USB_DEVICE(USB_VENDOR_ID_HANVON,
1248
			USB_DEVICE_ID_HANVON_MULTITOUCH) },
1249
	{ .driver_data = MT_CLS_DUAL_INRANGE_CONTACTID,
1250
		MT_USB_DEVICE(USB_VENDOR_ID_CANDO,
1251 1252
			USB_DEVICE_ID_CANDO_PIXCIR_MULTI_TOUCH) },

1253 1254
	/* Quanta-based panels */
	{ .driver_data = MT_CLS_CONFIDENCE_CONTACT_ID,
1255
		MT_USB_DEVICE(USB_VENDOR_ID_QUANTA,
1256 1257
			USB_DEVICE_ID_QUANTA_OPTICAL_TOUCH) },
	{ .driver_data = MT_CLS_CONFIDENCE_CONTACT_ID,
1258
		MT_USB_DEVICE(USB_VENDOR_ID_QUANTA,
1259 1260
			USB_DEVICE_ID_QUANTA_OPTICAL_TOUCH_3001) },
	{ .driver_data = MT_CLS_CONFIDENCE_CONTACT_ID,
1261
		MT_USB_DEVICE(USB_VENDOR_ID_QUANTA,
1262 1263
			USB_DEVICE_ID_QUANTA_OPTICAL_TOUCH_3008) },

1264
	/* Stantum panels */
1265
	{ .driver_data = MT_CLS_CONFIDENCE,
1266
		MT_USB_DEVICE(USB_VENDOR_ID_STANTUM,
1267
			USB_DEVICE_ID_MTP)},
1268
	{ .driver_data = MT_CLS_CONFIDENCE,
1269
		MT_USB_DEVICE(USB_VENDOR_ID_STANTUM_STM,
1270
			USB_DEVICE_ID_MTP_STM)},
1271
	{ .driver_data = MT_CLS_DEFAULT,
1272
		MT_USB_DEVICE(USB_VENDOR_ID_STANTUM_SITRONIX,
1273 1274
			USB_DEVICE_ID_MTP_SITRONIX)},

1275 1276
	/* TopSeed panels */
	{ .driver_data = MT_CLS_TOPSEED,
1277
		MT_USB_DEVICE(USB_VENDOR_ID_TOPSEED2,
1278 1279
			USB_DEVICE_ID_TOPSEED2_PERIPAD_701) },

1280
	/* Touch International panels */
1281
	{ .driver_data = MT_CLS_NSMU,
1282
		MT_USB_DEVICE(USB_VENDOR_ID_TOUCH_INTL,
1283 1284
			USB_DEVICE_ID_TOUCH_INTL_MULTI_TOUCH) },

1285
	/* Unitec panels */
1286
	{ .driver_data = MT_CLS_NSMU,
1287
		MT_USB_DEVICE(USB_VENDOR_ID_UNITEC,
1288
			USB_DEVICE_ID_UNITEC_USB_TOUCH_0709) },
1289
	{ .driver_data = MT_CLS_NSMU,
1290
		MT_USB_DEVICE(USB_VENDOR_ID_UNITEC,
1291
			USB_DEVICE_ID_UNITEC_USB_TOUCH_0A19) },
1292
	/* XAT */
1293
	{ .driver_data = MT_CLS_NSMU,
1294
		MT_USB_DEVICE(USB_VENDOR_ID_XAT,
1295
			USB_DEVICE_ID_XAT_CSR) },
1296

1297
	/* Xiroku */
1298
	{ .driver_data = MT_CLS_NSMU,
1299
		MT_USB_DEVICE(USB_VENDOR_ID_XIROKU,
1300
			USB_DEVICE_ID_XIROKU_SPX) },
1301
	{ .driver_data = MT_CLS_NSMU,
1302
		MT_USB_DEVICE(USB_VENDOR_ID_XIROKU,
1303
			USB_DEVICE_ID_XIROKU_MPX) },
1304
	{ .driver_data = MT_CLS_NSMU,
1305
		MT_USB_DEVICE(USB_VENDOR_ID_XIROKU,
1306
			USB_DEVICE_ID_XIROKU_CSR) },
1307
	{ .driver_data = MT_CLS_NSMU,
1308
		MT_USB_DEVICE(USB_VENDOR_ID_XIROKU,
1309
			USB_DEVICE_ID_XIROKU_SPX1) },
1310
	{ .driver_data = MT_CLS_NSMU,
1311
		MT_USB_DEVICE(USB_VENDOR_ID_XIROKU,
1312
			USB_DEVICE_ID_XIROKU_MPX1) },
1313
	{ .driver_data = MT_CLS_NSMU,
1314
		MT_USB_DEVICE(USB_VENDOR_ID_XIROKU,
1315
			USB_DEVICE_ID_XIROKU_CSR1) },
1316
	{ .driver_data = MT_CLS_NSMU,
1317
		MT_USB_DEVICE(USB_VENDOR_ID_XIROKU,
1318
			USB_DEVICE_ID_XIROKU_SPX2) },
1319
	{ .driver_data = MT_CLS_NSMU,
1320
		MT_USB_DEVICE(USB_VENDOR_ID_XIROKU,
1321
			USB_DEVICE_ID_XIROKU_MPX2) },
1322
	{ .driver_data = MT_CLS_NSMU,
1323
		MT_USB_DEVICE(USB_VENDOR_ID_XIROKU,
1324 1325
			USB_DEVICE_ID_XIROKU_CSR2) },

1326 1327 1328 1329 1330
	/* Zytronic panels */
	{ .driver_data = MT_CLS_SERIAL,
		MT_USB_DEVICE(USB_VENDOR_ID_ZYTRONIC,
			USB_DEVICE_ID_ZYTRONIC_ZXY100) },

1331 1332
	/* Generic MT device */
	{ HID_DEVICE(HID_BUS_ANY, HID_GROUP_MULTITOUCH, HID_ANY_ID, HID_ANY_ID) },
1333 1334 1335 1336 1337 1338 1339 1340 1341 1342 1343 1344 1345 1346 1347 1348
	{ }
};
MODULE_DEVICE_TABLE(hid, mt_devices);

static const struct hid_usage_id mt_grabbed_usages[] = {
	{ HID_ANY_ID, HID_ANY_ID, HID_ANY_ID },
	{ HID_ANY_ID - 1, HID_ANY_ID - 1, HID_ANY_ID - 1}
};

static struct hid_driver mt_driver = {
	.name = "hid-multitouch",
	.id_table = mt_devices,
	.probe = mt_probe,
	.remove = mt_remove,
	.input_mapping = mt_input_mapping,
	.input_mapped = mt_input_mapped,
1349
	.input_configured = mt_input_configured,
1350 1351 1352
	.feature_mapping = mt_feature_mapping,
	.usage_table = mt_grabbed_usages,
	.event = mt_event,
1353
	.report = mt_report,
1354 1355
#ifdef CONFIG_PM
	.reset_resume = mt_reset_resume,
1356
	.resume = mt_resume,
1357 1358
#endif
};
1359
module_hid_driver(mt_driver);