aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/hid/hid-multitouch.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/hid/hid-multitouch.c')
-rw-r--r--drivers/hid/hid-multitouch.c213
1 files changed, 169 insertions, 44 deletions
diff --git a/drivers/hid/hid-multitouch.c b/drivers/hid/hid-multitouch.c
index f1c909f1b239..24fc4423b937 100644
--- a/drivers/hid/hid-multitouch.c
+++ b/drivers/hid/hid-multitouch.c
@@ -50,7 +50,6 @@ MODULE_LICENSE("GPL");
50#define MT_QUIRK_ALWAYS_VALID (1 << 4) 50#define MT_QUIRK_ALWAYS_VALID (1 << 4)
51#define MT_QUIRK_VALID_IS_INRANGE (1 << 5) 51#define MT_QUIRK_VALID_IS_INRANGE (1 << 5)
52#define MT_QUIRK_VALID_IS_CONFIDENCE (1 << 6) 52#define MT_QUIRK_VALID_IS_CONFIDENCE (1 << 6)
53#define MT_QUIRK_EGALAX_XYZ_FIXUP (1 << 7)
54#define MT_QUIRK_SLOT_IS_CONTACTID_MINUS_ONE (1 << 8) 53#define MT_QUIRK_SLOT_IS_CONTACTID_MINUS_ONE (1 << 8)
55 54
56struct mt_slot { 55struct mt_slot {
@@ -60,9 +59,19 @@ struct mt_slot {
60 bool seen_in_this_frame;/* has this slot been updated */ 59 bool seen_in_this_frame;/* has this slot been updated */
61}; 60};
62 61
62struct mt_class {
63 __s32 name; /* MT_CLS */
64 __s32 quirks;
65 __s32 sn_move; /* Signal/noise ratio for move events */
66 __s32 sn_width; /* Signal/noise ratio for width events */
67 __s32 sn_height; /* Signal/noise ratio for height events */
68 __s32 sn_pressure; /* Signal/noise ratio for pressure events */
69 __u8 maxcontacts;
70};
71
63struct mt_device { 72struct mt_device {
64 struct mt_slot curdata; /* placeholder of incoming data */ 73 struct mt_slot curdata; /* placeholder of incoming data */
65 struct mt_class *mtclass; /* our mt device class */ 74 struct mt_class mtclass; /* our mt device class */
66 unsigned last_field_index; /* last field index of the report */ 75 unsigned last_field_index; /* last field index of the report */
67 unsigned last_slot_field; /* the last field of a slot */ 76 unsigned last_slot_field; /* the last field of a slot */
68 int last_mt_collection; /* last known mt-related collection */ 77 int last_mt_collection; /* last known mt-related collection */
@@ -74,30 +83,23 @@ struct mt_device {
74 struct mt_slot *slots; 83 struct mt_slot *slots;
75}; 84};
76 85
77struct mt_class {
78 __s32 name; /* MT_CLS */
79 __s32 quirks;
80 __s32 sn_move; /* Signal/noise ratio for move events */
81 __s32 sn_width; /* Signal/noise ratio for width events */
82 __s32 sn_height; /* Signal/noise ratio for height events */
83 __s32 sn_pressure; /* Signal/noise ratio for pressure events */
84 __u8 maxcontacts;
85};
86
87/* classes of device behavior */ 86/* classes of device behavior */
88#define MT_CLS_DEFAULT 0x0001 87#define MT_CLS_DEFAULT 0x0001
89 88
90#define MT_CLS_SERIAL 0x0002 89#define MT_CLS_SERIAL 0x0002
91#define MT_CLS_CONFIDENCE 0x0003 90#define MT_CLS_CONFIDENCE 0x0003
92#define MT_CLS_CONFIDENCE_MINUS_ONE 0x0004 91#define MT_CLS_CONFIDENCE_CONTACT_ID 0x0004
93#define MT_CLS_DUAL_INRANGE_CONTACTID 0x0005 92#define MT_CLS_CONFIDENCE_MINUS_ONE 0x0005
94#define MT_CLS_DUAL_INRANGE_CONTACTNUMBER 0x0006 93#define MT_CLS_DUAL_INRANGE_CONTACTID 0x0006
95#define MT_CLS_DUAL_NSMU_CONTACTID 0x0007 94#define MT_CLS_DUAL_INRANGE_CONTACTNUMBER 0x0007
95#define MT_CLS_DUAL_NSMU_CONTACTID 0x0008
96#define MT_CLS_INRANGE_CONTACTNUMBER 0x0009
96 97
97/* vendor specific classes */ 98/* vendor specific classes */
98#define MT_CLS_3M 0x0101 99#define MT_CLS_3M 0x0101
99#define MT_CLS_CYPRESS 0x0102 100#define MT_CLS_CYPRESS 0x0102
100#define MT_CLS_EGALAX 0x0103 101#define MT_CLS_EGALAX 0x0103
102#define MT_CLS_EGALAX_SERIAL 0x0104
101 103
102#define MT_DEFAULT_MAXCONTACT 10 104#define MT_DEFAULT_MAXCONTACT 10
103 105
@@ -133,13 +135,16 @@ static int find_slot_from_contactid(struct mt_device *td)
133 return -1; 135 return -1;
134} 136}
135 137
136struct mt_class mt_classes[] = { 138static struct mt_class mt_classes[] = {
137 { .name = MT_CLS_DEFAULT, 139 { .name = MT_CLS_DEFAULT,
138 .quirks = MT_QUIRK_NOT_SEEN_MEANS_UP }, 140 .quirks = MT_QUIRK_NOT_SEEN_MEANS_UP },
139 { .name = MT_CLS_SERIAL, 141 { .name = MT_CLS_SERIAL,
140 .quirks = MT_QUIRK_ALWAYS_VALID}, 142 .quirks = MT_QUIRK_ALWAYS_VALID},
141 { .name = MT_CLS_CONFIDENCE, 143 { .name = MT_CLS_CONFIDENCE,
142 .quirks = MT_QUIRK_VALID_IS_CONFIDENCE }, 144 .quirks = MT_QUIRK_VALID_IS_CONFIDENCE },
145 { .name = MT_CLS_CONFIDENCE_CONTACT_ID,
146 .quirks = MT_QUIRK_VALID_IS_CONFIDENCE |
147 MT_QUIRK_SLOT_IS_CONTACTID },
143 { .name = MT_CLS_CONFIDENCE_MINUS_ONE, 148 { .name = MT_CLS_CONFIDENCE_MINUS_ONE,
144 .quirks = MT_QUIRK_VALID_IS_CONFIDENCE | 149 .quirks = MT_QUIRK_VALID_IS_CONFIDENCE |
145 MT_QUIRK_SLOT_IS_CONTACTID_MINUS_ONE }, 150 MT_QUIRK_SLOT_IS_CONTACTID_MINUS_ONE },
@@ -155,6 +160,9 @@ struct mt_class mt_classes[] = {
155 .quirks = MT_QUIRK_NOT_SEEN_MEANS_UP | 160 .quirks = MT_QUIRK_NOT_SEEN_MEANS_UP |
156 MT_QUIRK_SLOT_IS_CONTACTID, 161 MT_QUIRK_SLOT_IS_CONTACTID,
157 .maxcontacts = 2 }, 162 .maxcontacts = 2 },
163 { .name = MT_CLS_INRANGE_CONTACTNUMBER,
164 .quirks = MT_QUIRK_VALID_IS_INRANGE |
165 MT_QUIRK_SLOT_IS_CONTACTNUMBER },
158 166
159 /* 167 /*
160 * vendor specific classes 168 * vendor specific classes
@@ -171,9 +179,13 @@ struct mt_class mt_classes[] = {
171 .maxcontacts = 10 }, 179 .maxcontacts = 10 },
172 { .name = MT_CLS_EGALAX, 180 { .name = MT_CLS_EGALAX,
173 .quirks = MT_QUIRK_SLOT_IS_CONTACTID | 181 .quirks = MT_QUIRK_SLOT_IS_CONTACTID |
174 MT_QUIRK_VALID_IS_INRANGE | 182 MT_QUIRK_VALID_IS_INRANGE,
175 MT_QUIRK_EGALAX_XYZ_FIXUP, 183 .sn_move = 4096,
176 .maxcontacts = 2, 184 .sn_pressure = 32,
185 },
186 { .name = MT_CLS_EGALAX_SERIAL,
187 .quirks = MT_QUIRK_SLOT_IS_CONTACTID |
188 MT_QUIRK_ALWAYS_VALID,
177 .sn_move = 4096, 189 .sn_move = 4096,
178 .sn_pressure = 32, 190 .sn_pressure = 32,
179 }, 191 },
@@ -181,6 +193,44 @@ struct mt_class mt_classes[] = {
181 { } 193 { }
182}; 194};
183 195
196static ssize_t mt_show_quirks(struct device *dev,
197 struct device_attribute *attr,
198 char *buf)
199{
200 struct hid_device *hdev = container_of(dev, struct hid_device, dev);
201 struct mt_device *td = hid_get_drvdata(hdev);
202
203 return sprintf(buf, "%u\n", td->mtclass.quirks);
204}
205
206static ssize_t mt_set_quirks(struct device *dev,
207 struct device_attribute *attr,
208 const char *buf, size_t count)
209{
210 struct hid_device *hdev = container_of(dev, struct hid_device, dev);
211 struct mt_device *td = hid_get_drvdata(hdev);
212
213 unsigned long val;
214
215 if (kstrtoul(buf, 0, &val))
216 return -EINVAL;
217
218 td->mtclass.quirks = val;
219
220 return count;
221}
222
223static DEVICE_ATTR(quirks, S_IWUSR | S_IRUGO, mt_show_quirks, mt_set_quirks);
224
225static struct attribute *sysfs_attrs[] = {
226 &dev_attr_quirks.attr,
227 NULL
228};
229
230static struct attribute_group mt_attribute_group = {
231 .attrs = sysfs_attrs
232};
233
184static void mt_feature_mapping(struct hid_device *hdev, 234static void mt_feature_mapping(struct hid_device *hdev,
185 struct hid_field *field, struct hid_usage *usage) 235 struct hid_field *field, struct hid_usage *usage)
186{ 236{
@@ -192,9 +242,9 @@ static void mt_feature_mapping(struct hid_device *hdev,
192 break; 242 break;
193 case HID_DG_CONTACTMAX: 243 case HID_DG_CONTACTMAX:
194 td->maxcontacts = field->value[0]; 244 td->maxcontacts = field->value[0];
195 if (td->mtclass->maxcontacts) 245 if (td->mtclass.maxcontacts)
196 /* check if the maxcontacts is given by the class */ 246 /* check if the maxcontacts is given by the class */
197 td->maxcontacts = td->mtclass->maxcontacts; 247 td->maxcontacts = td->mtclass.maxcontacts;
198 248
199 break; 249 break;
200 } 250 }
@@ -214,8 +264,7 @@ static int mt_input_mapping(struct hid_device *hdev, struct hid_input *hi,
214 unsigned long **bit, int *max) 264 unsigned long **bit, int *max)
215{ 265{
216 struct mt_device *td = hid_get_drvdata(hdev); 266 struct mt_device *td = hid_get_drvdata(hdev);
217 struct mt_class *cls = td->mtclass; 267 struct mt_class *cls = &td->mtclass;
218 __s32 quirks = cls->quirks;
219 268
220 /* Only map fields from TouchScreen or TouchPad collections. 269 /* Only map fields from TouchScreen or TouchPad collections.
221 * We need to ignore fields that belong to other collections 270 * We need to ignore fields that belong to other collections
@@ -227,13 +276,17 @@ static int mt_input_mapping(struct hid_device *hdev, struct hid_input *hi,
227 else 276 else
228 return 0; 277 return 0;
229 278
279 /* eGalax devices provide a Digitizer.Stylus input which overrides
280 * the correct Digitizers.Finger X/Y ranges.
281 * Let's just ignore this input. */
282 if (field->physical == HID_DG_STYLUS)
283 return -1;
284
230 switch (usage->hid & HID_USAGE_PAGE) { 285 switch (usage->hid & HID_USAGE_PAGE) {
231 286
232 case HID_UP_GENDESK: 287 case HID_UP_GENDESK:
233 switch (usage->hid) { 288 switch (usage->hid) {
234 case HID_GD_X: 289 case HID_GD_X:
235 if (quirks & MT_QUIRK_EGALAX_XYZ_FIXUP)
236 field->logical_maximum = 32760;
237 hid_map_usage(hi, usage, bit, max, 290 hid_map_usage(hi, usage, bit, max,
238 EV_ABS, ABS_MT_POSITION_X); 291 EV_ABS, ABS_MT_POSITION_X);
239 set_abs(hi->input, ABS_MT_POSITION_X, field, 292 set_abs(hi->input, ABS_MT_POSITION_X, field,
@@ -246,8 +299,6 @@ static int mt_input_mapping(struct hid_device *hdev, struct hid_input *hi,
246 } 299 }
247 return 1; 300 return 1;
248 case HID_GD_Y: 301 case HID_GD_Y:
249 if (quirks & MT_QUIRK_EGALAX_XYZ_FIXUP)
250 field->logical_maximum = 32760;
251 hid_map_usage(hi, usage, bit, max, 302 hid_map_usage(hi, usage, bit, max,
252 EV_ABS, ABS_MT_POSITION_Y); 303 EV_ABS, ABS_MT_POSITION_Y);
253 set_abs(hi->input, ABS_MT_POSITION_Y, field, 304 set_abs(hi->input, ABS_MT_POSITION_Y, field,
@@ -315,8 +366,6 @@ static int mt_input_mapping(struct hid_device *hdev, struct hid_input *hi,
315 } 366 }
316 return 1; 367 return 1;
317 case HID_DG_TIPPRESSURE: 368 case HID_DG_TIPPRESSURE:
318 if (quirks & MT_QUIRK_EGALAX_XYZ_FIXUP)
319 field->logical_minimum = 0;
320 hid_map_usage(hi, usage, bit, max, 369 hid_map_usage(hi, usage, bit, max,
321 EV_ABS, ABS_MT_PRESSURE); 370 EV_ABS, ABS_MT_PRESSURE);
322 set_abs(hi->input, ABS_MT_PRESSURE, field, 371 set_abs(hi->input, ABS_MT_PRESSURE, field,
@@ -363,7 +412,7 @@ static int mt_input_mapped(struct hid_device *hdev, struct hid_input *hi,
363 412
364static int mt_compute_slot(struct mt_device *td) 413static int mt_compute_slot(struct mt_device *td)
365{ 414{
366 __s32 quirks = td->mtclass->quirks; 415 __s32 quirks = td->mtclass.quirks;
367 416
368 if (quirks & MT_QUIRK_SLOT_IS_CONTACTID) 417 if (quirks & MT_QUIRK_SLOT_IS_CONTACTID)
369 return td->curdata.contactid; 418 return td->curdata.contactid;
@@ -407,7 +456,7 @@ static void mt_emit_event(struct mt_device *td, struct input_dev *input)
407 456
408 for (i = 0; i < td->maxcontacts; ++i) { 457 for (i = 0; i < td->maxcontacts; ++i) {
409 struct mt_slot *s = &(td->slots[i]); 458 struct mt_slot *s = &(td->slots[i]);
410 if ((td->mtclass->quirks & MT_QUIRK_NOT_SEEN_MEANS_UP) && 459 if ((td->mtclass.quirks & MT_QUIRK_NOT_SEEN_MEANS_UP) &&
411 !s->seen_in_this_frame) { 460 !s->seen_in_this_frame) {
412 s->touch_state = false; 461 s->touch_state = false;
413 } 462 }
@@ -444,7 +493,7 @@ static int mt_event(struct hid_device *hid, struct hid_field *field,
444 struct hid_usage *usage, __s32 value) 493 struct hid_usage *usage, __s32 value)
445{ 494{
446 struct mt_device *td = hid_get_drvdata(hid); 495 struct mt_device *td = hid_get_drvdata(hid);
447 __s32 quirks = td->mtclass->quirks; 496 __s32 quirks = td->mtclass.quirks;
448 497
449 if (hid->claimed & HID_CLAIMED_INPUT && td->slots) { 498 if (hid->claimed & HID_CLAIMED_INPUT && td->slots) {
450 switch (usage->hid) { 499 switch (usage->hid) {
@@ -552,7 +601,7 @@ static int mt_probe(struct hid_device *hdev, const struct hid_device_id *id)
552 dev_err(&hdev->dev, "cannot allocate multitouch data\n"); 601 dev_err(&hdev->dev, "cannot allocate multitouch data\n");
553 return -ENOMEM; 602 return -ENOMEM;
554 } 603 }
555 td->mtclass = mtclass; 604 td->mtclass = *mtclass;
556 td->inputmode = -1; 605 td->inputmode = -1;
557 td->last_mt_collection = -1; 606 td->last_mt_collection = -1;
558 hid_set_drvdata(hdev, td); 607 hid_set_drvdata(hdev, td);
@@ -574,6 +623,8 @@ static int mt_probe(struct hid_device *hdev, const struct hid_device_id *id)
574 goto fail; 623 goto fail;
575 } 624 }
576 625
626 ret = sysfs_create_group(&hdev->dev.kobj, &mt_attribute_group);
627
577 mt_set_input_mode(hdev); 628 mt_set_input_mode(hdev);
578 629
579 return 0; 630 return 0;
@@ -594,6 +645,7 @@ static int mt_reset_resume(struct hid_device *hdev)
594static void mt_remove(struct hid_device *hdev) 645static void mt_remove(struct hid_device *hdev)
595{ 646{
596 struct mt_device *td = hid_get_drvdata(hdev); 647 struct mt_device *td = hid_get_drvdata(hdev);
648 sysfs_remove_group(&hdev->dev.kobj, &mt_attribute_group);
597 hid_hw_stop(hdev); 649 hid_hw_stop(hdev);
598 kfree(td->slots); 650 kfree(td->slots);
599 kfree(td); 651 kfree(td);
@@ -609,12 +661,20 @@ static const struct hid_device_id mt_devices[] = {
609 { .driver_data = MT_CLS_3M, 661 { .driver_data = MT_CLS_3M,
610 HID_USB_DEVICE(USB_VENDOR_ID_3M, 662 HID_USB_DEVICE(USB_VENDOR_ID_3M,
611 USB_DEVICE_ID_3M2256) }, 663 USB_DEVICE_ID_3M2256) },
664 { .driver_data = MT_CLS_3M,
665 HID_USB_DEVICE(USB_VENDOR_ID_3M,
666 USB_DEVICE_ID_3M3266) },
612 667
613 /* ActionStar panels */ 668 /* ActionStar panels */
614 { .driver_data = MT_CLS_DEFAULT, 669 { .driver_data = MT_CLS_DEFAULT,
615 HID_USB_DEVICE(USB_VENDOR_ID_ACTIONSTAR, 670 HID_USB_DEVICE(USB_VENDOR_ID_ACTIONSTAR,
616 USB_DEVICE_ID_ACTIONSTAR_1011) }, 671 USB_DEVICE_ID_ACTIONSTAR_1011) },
617 672
673 /* Atmel panels */
674 { .driver_data = MT_CLS_SERIAL,
675 HID_USB_DEVICE(USB_VENDOR_ID_ATMEL,
676 USB_DEVICE_ID_ATMEL_MULTITOUCH) },
677
618 /* Cando panels */ 678 /* Cando panels */
619 { .driver_data = MT_CLS_DUAL_INRANGE_CONTACTNUMBER, 679 { .driver_data = MT_CLS_DUAL_INRANGE_CONTACTNUMBER,
620 HID_USB_DEVICE(USB_VENDOR_ID_CANDO, 680 HID_USB_DEVICE(USB_VENDOR_ID_CANDO,
@@ -645,23 +705,32 @@ static const struct hid_device_id mt_devices[] = {
645 USB_DEVICE_ID_CYPRESS_TRUETOUCH) }, 705 USB_DEVICE_ID_CYPRESS_TRUETOUCH) },
646 706
647 /* eGalax devices (resistive) */ 707 /* eGalax devices (resistive) */
648 { .driver_data = MT_CLS_EGALAX, 708 { .driver_data = MT_CLS_EGALAX,
649 HID_USB_DEVICE(USB_VENDOR_ID_DWAV, 709 HID_USB_DEVICE(USB_VENDOR_ID_DWAV,
650 USB_DEVICE_ID_DWAV_EGALAX_MULTITOUCH) }, 710 USB_DEVICE_ID_DWAV_EGALAX_MULTITOUCH_480D) },
651 { .driver_data = MT_CLS_EGALAX, 711 { .driver_data = MT_CLS_EGALAX,
652 HID_USB_DEVICE(USB_VENDOR_ID_DWAV, 712 HID_USB_DEVICE(USB_VENDOR_ID_DWAV,
653 USB_DEVICE_ID_DWAV_EGALAX_MULTITOUCH3) }, 713 USB_DEVICE_ID_DWAV_EGALAX_MULTITOUCH_480E) },
654 714
655 /* eGalax devices (capacitive) */ 715 /* eGalax devices (capacitive) */
656 { .driver_data = MT_CLS_EGALAX, 716 { .driver_data = MT_CLS_EGALAX,
657 HID_USB_DEVICE(USB_VENDOR_ID_DWAV, 717 HID_USB_DEVICE(USB_VENDOR_ID_DWAV,
658 USB_DEVICE_ID_DWAV_EGALAX_MULTITOUCH1) }, 718 USB_DEVICE_ID_DWAV_EGALAX_MULTITOUCH_720C) },
659 { .driver_data = MT_CLS_EGALAX, 719 { .driver_data = MT_CLS_EGALAX,
660 HID_USB_DEVICE(USB_VENDOR_ID_DWAV, 720 HID_USB_DEVICE(USB_VENDOR_ID_DWAV,
661 USB_DEVICE_ID_DWAV_EGALAX_MULTITOUCH2) }, 721 USB_DEVICE_ID_DWAV_EGALAX_MULTITOUCH_726B) },
662 { .driver_data = MT_CLS_EGALAX, 722 { .driver_data = MT_CLS_EGALAX,
663 HID_USB_DEVICE(USB_VENDOR_ID_DWAV, 723 HID_USB_DEVICE(USB_VENDOR_ID_DWAV,
664 USB_DEVICE_ID_DWAV_EGALAX_MULTITOUCH4) }, 724 USB_DEVICE_ID_DWAV_EGALAX_MULTITOUCH_72A1) },
725 { .driver_data = MT_CLS_EGALAX,
726 HID_USB_DEVICE(USB_VENDOR_ID_DWAV,
727 USB_DEVICE_ID_DWAV_EGALAX_MULTITOUCH_72FA) },
728 { .driver_data = MT_CLS_EGALAX,
729 HID_USB_DEVICE(USB_VENDOR_ID_DWAV,
730 USB_DEVICE_ID_DWAV_EGALAX_MULTITOUCH_7302) },
731 { .driver_data = MT_CLS_EGALAX_SERIAL,
732 HID_USB_DEVICE(USB_VENDOR_ID_DWAV,
733 USB_DEVICE_ID_DWAV_EGALAX_MULTITOUCH_A001) },
665 734
666 /* Elo TouchSystems IntelliTouch Plus panel */ 735 /* Elo TouchSystems IntelliTouch Plus panel */
667 { .driver_data = MT_CLS_DUAL_NSMU_CONTACTID, 736 { .driver_data = MT_CLS_DUAL_NSMU_CONTACTID,
@@ -678,6 +747,11 @@ static const struct hid_device_id mt_devices[] = {
678 HID_USB_DEVICE(USB_VENDOR_ID_GOODTOUCH, 747 HID_USB_DEVICE(USB_VENDOR_ID_GOODTOUCH,
679 USB_DEVICE_ID_GOODTOUCH_000f) }, 748 USB_DEVICE_ID_GOODTOUCH_000f) },
680 749
750 /* Hanvon panels */
751 { .driver_data = MT_CLS_DUAL_INRANGE_CONTACTID,
752 HID_USB_DEVICE(USB_VENDOR_ID_HANVON_ALT,
753 USB_DEVICE_ID_HANVON_ALT_MULTITOUCH) },
754
681 /* Ideacom panel */ 755 /* Ideacom panel */
682 { .driver_data = MT_CLS_SERIAL, 756 { .driver_data = MT_CLS_SERIAL,
683 HID_USB_DEVICE(USB_VENDOR_ID_IDEACOM, 757 HID_USB_DEVICE(USB_VENDOR_ID_IDEACOM,
@@ -722,6 +796,17 @@ static const struct hid_device_id mt_devices[] = {
722 HID_USB_DEVICE(USB_VENDOR_ID_PENMOUNT, 796 HID_USB_DEVICE(USB_VENDOR_ID_PENMOUNT,
723 USB_DEVICE_ID_PENMOUNT_PCI) }, 797 USB_DEVICE_ID_PENMOUNT_PCI) },
724 798
799 /* PixArt optical touch screen */
800 { .driver_data = MT_CLS_INRANGE_CONTACTNUMBER,
801 HID_USB_DEVICE(USB_VENDOR_ID_PIXART,
802 USB_DEVICE_ID_PIXART_OPTICAL_TOUCH_SCREEN) },
803 { .driver_data = MT_CLS_INRANGE_CONTACTNUMBER,
804 HID_USB_DEVICE(USB_VENDOR_ID_PIXART,
805 USB_DEVICE_ID_PIXART_OPTICAL_TOUCH_SCREEN1) },
806 { .driver_data = MT_CLS_INRANGE_CONTACTNUMBER,
807 HID_USB_DEVICE(USB_VENDOR_ID_PIXART,
808 USB_DEVICE_ID_PIXART_OPTICAL_TOUCH_SCREEN2) },
809
725 /* PixCir-based panels */ 810 /* PixCir-based panels */
726 { .driver_data = MT_CLS_DUAL_INRANGE_CONTACTID, 811 { .driver_data = MT_CLS_DUAL_INRANGE_CONTACTID,
727 HID_USB_DEVICE(USB_VENDOR_ID_HANVON, 812 HID_USB_DEVICE(USB_VENDOR_ID_HANVON,
@@ -730,6 +815,17 @@ static const struct hid_device_id mt_devices[] = {
730 HID_USB_DEVICE(USB_VENDOR_ID_CANDO, 815 HID_USB_DEVICE(USB_VENDOR_ID_CANDO,
731 USB_DEVICE_ID_CANDO_PIXCIR_MULTI_TOUCH) }, 816 USB_DEVICE_ID_CANDO_PIXCIR_MULTI_TOUCH) },
732 817
818 /* Quanta-based panels */
819 { .driver_data = MT_CLS_CONFIDENCE_CONTACT_ID,
820 HID_USB_DEVICE(USB_VENDOR_ID_QUANTA,
821 USB_DEVICE_ID_QUANTA_OPTICAL_TOUCH) },
822 { .driver_data = MT_CLS_CONFIDENCE_CONTACT_ID,
823 HID_USB_DEVICE(USB_VENDOR_ID_QUANTA,
824 USB_DEVICE_ID_QUANTA_OPTICAL_TOUCH_3001) },
825 { .driver_data = MT_CLS_CONFIDENCE_CONTACT_ID,
826 HID_USB_DEVICE(USB_VENDOR_ID_QUANTA,
827 USB_DEVICE_ID_QUANTA_OPTICAL_TOUCH_3008) },
828
733 /* Stantum panels */ 829 /* Stantum panels */
734 { .driver_data = MT_CLS_CONFIDENCE, 830 { .driver_data = MT_CLS_CONFIDENCE,
735 HID_USB_DEVICE(USB_VENDOR_ID_STANTUM, 831 HID_USB_DEVICE(USB_VENDOR_ID_STANTUM,
@@ -758,6 +854,35 @@ static const struct hid_device_id mt_devices[] = {
758 HID_USB_DEVICE(USB_VENDOR_ID_XAT, 854 HID_USB_DEVICE(USB_VENDOR_ID_XAT,
759 USB_DEVICE_ID_XAT_CSR) }, 855 USB_DEVICE_ID_XAT_CSR) },
760 856
857 /* Xiroku */
858 { .driver_data = MT_CLS_DEFAULT,
859 HID_USB_DEVICE(USB_VENDOR_ID_XIROKU,
860 USB_DEVICE_ID_XIROKU_SPX) },
861 { .driver_data = MT_CLS_DEFAULT,
862 HID_USB_DEVICE(USB_VENDOR_ID_XIROKU,
863 USB_DEVICE_ID_XIROKU_MPX) },
864 { .driver_data = MT_CLS_DEFAULT,
865 HID_USB_DEVICE(USB_VENDOR_ID_XIROKU,
866 USB_DEVICE_ID_XIROKU_CSR) },
867 { .driver_data = MT_CLS_DEFAULT,
868 HID_USB_DEVICE(USB_VENDOR_ID_XIROKU,
869 USB_DEVICE_ID_XIROKU_SPX1) },
870 { .driver_data = MT_CLS_DEFAULT,
871 HID_USB_DEVICE(USB_VENDOR_ID_XIROKU,
872 USB_DEVICE_ID_XIROKU_MPX1) },
873 { .driver_data = MT_CLS_DEFAULT,
874 HID_USB_DEVICE(USB_VENDOR_ID_XIROKU,
875 USB_DEVICE_ID_XIROKU_CSR1) },
876 { .driver_data = MT_CLS_DEFAULT,
877 HID_USB_DEVICE(USB_VENDOR_ID_XIROKU,
878 USB_DEVICE_ID_XIROKU_SPX2) },
879 { .driver_data = MT_CLS_DEFAULT,
880 HID_USB_DEVICE(USB_VENDOR_ID_XIROKU,
881 USB_DEVICE_ID_XIROKU_MPX2) },
882 { .driver_data = MT_CLS_DEFAULT,
883 HID_USB_DEVICE(USB_VENDOR_ID_XIROKU,
884 USB_DEVICE_ID_XIROKU_CSR2) },
885
761 { } 886 { }
762}; 887};
763MODULE_DEVICE_TABLE(hid, mt_devices); 888MODULE_DEVICE_TABLE(hid, mt_devices);