diff options
Diffstat (limited to 'drivers/hid/hid-multitouch.c')
-rw-r--r-- | drivers/hid/hid-multitouch.c | 213 |
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 | ||
56 | struct mt_slot { | 55 | struct 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 | ||
62 | struct 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 | |||
63 | struct mt_device { | 72 | struct 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 | ||
77 | struct 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 | ||
136 | struct mt_class mt_classes[] = { | 138 | static 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 | ||
196 | static 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 | |||
206 | static 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 | |||
223 | static DEVICE_ATTR(quirks, S_IWUSR | S_IRUGO, mt_show_quirks, mt_set_quirks); | ||
224 | |||
225 | static struct attribute *sysfs_attrs[] = { | ||
226 | &dev_attr_quirks.attr, | ||
227 | NULL | ||
228 | }; | ||
229 | |||
230 | static struct attribute_group mt_attribute_group = { | ||
231 | .attrs = sysfs_attrs | ||
232 | }; | ||
233 | |||
184 | static void mt_feature_mapping(struct hid_device *hdev, | 234 | static 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 | ||
364 | static int mt_compute_slot(struct mt_device *td) | 413 | static 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) | |||
594 | static void mt_remove(struct hid_device *hdev) | 645 | static 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 | }; |
763 | MODULE_DEVICE_TABLE(hid, mt_devices); | 888 | MODULE_DEVICE_TABLE(hid, mt_devices); |