]> git.karo-electronics.de Git - karo-tx-linux.git/blob - drivers/hid/hid-multitouch.c
Merge branch 'for-next' of git://github.com/rydberg/linux into from-henrik
[karo-tx-linux.git] / drivers / hid / hid-multitouch.c
1 /*
2  *  HID driver for multitouch panels
3  *
4  *  Copyright (c) 2010-2012 Stephane Chatty <chatty@enac.fr>
5  *  Copyright (c) 2010-2012 Benjamin Tissoires <benjamin.tissoires@gmail.com>
6  *  Copyright (c) 2010-2012 Ecole Nationale de l'Aviation Civile, France
7  *
8  *  This code is partly based on hid-egalax.c:
9  *
10  *  Copyright (c) 2010 Stephane Chatty <chatty@enac.fr>
11  *  Copyright (c) 2010 Henrik Rydberg <rydberg@euromail.se>
12  *  Copyright (c) 2010 Canonical, Ltd.
13  *
14  *  This code is partly based on hid-3m-pct.c:
15  *
16  *  Copyright (c) 2009-2010 Stephane Chatty <chatty@enac.fr>
17  *  Copyright (c) 2010      Henrik Rydberg <rydberg@euromail.se>
18  *  Copyright (c) 2010      Canonical, Ltd.
19  *
20  */
21
22 /*
23  * This program is free software; you can redistribute it and/or modify it
24  * under the terms of the GNU General Public License as published by the Free
25  * Software Foundation; either version 2 of the License, or (at your option)
26  * any later version.
27  */
28
29 #include <linux/device.h>
30 #include <linux/hid.h>
31 #include <linux/module.h>
32 #include <linux/slab.h>
33 #include <linux/usb.h>
34 #include <linux/input/mt.h>
35 #include "usbhid/usbhid.h"
36
37
38 MODULE_AUTHOR("Stephane Chatty <chatty@enac.fr>");
39 MODULE_AUTHOR("Benjamin Tissoires <benjamin.tissoires@gmail.com>");
40 MODULE_DESCRIPTION("HID multitouch panels");
41 MODULE_LICENSE("GPL");
42
43 #include "hid-ids.h"
44
45 /* quirks to control the device */
46 #define MT_QUIRK_NOT_SEEN_MEANS_UP      (1 << 0)
47 #define MT_QUIRK_SLOT_IS_CONTACTID      (1 << 1)
48 #define MT_QUIRK_CYPRESS                (1 << 2)
49 #define MT_QUIRK_SLOT_IS_CONTACTNUMBER  (1 << 3)
50 #define MT_QUIRK_ALWAYS_VALID           (1 << 4)
51 #define MT_QUIRK_VALID_IS_INRANGE       (1 << 5)
52 #define MT_QUIRK_VALID_IS_CONFIDENCE    (1 << 6)
53 #define MT_QUIRK_SLOT_IS_CONTACTID_MINUS_ONE    (1 << 8)
54 #define MT_QUIRK_NO_AREA                (1 << 9)
55
56 struct mt_slot {
57         __s32 x, y, p, w, h;
58         __s32 contactid;        /* the device ContactID assigned to this slot */
59         bool touch_state;       /* is the touch valid? */
60 };
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         bool is_indirect;       /* true for touchpads */
71 };
72
73 struct mt_fields {
74         unsigned usages[HID_MAX_FIELDS];
75         unsigned int length;
76 };
77
78 struct mt_device {
79         struct mt_slot curdata; /* placeholder of incoming data */
80         struct mt_class mtclass;        /* our mt device class */
81         struct mt_fields *fields;       /* temporary placeholder for storing the
82                                            multitouch fields */
83         unsigned last_field_index;      /* last field index of the report */
84         unsigned last_slot_field;       /* the last field of a slot */
85         __s8 inputmode;         /* InputMode HID feature, -1 if non-existent */
86         __s8 inputmode_index;   /* InputMode HID feature index in the report */
87         __s8 maxcontact_report_id;      /* Maximum Contact Number HID feature,
88                                    -1 if non-existent */
89         __u8 num_received;      /* how many contacts we received */
90         __u8 num_expected;      /* expected last contact index */
91         __u8 maxcontacts;
92         __u8 touches_by_report; /* how many touches are present in one report:
93                                 * 1 means we should use a serial protocol
94                                 * > 1 means hybrid (multitouch) protocol */
95         bool serial_maybe;      /* need to check for serial protocol */
96         bool curvalid;          /* is the current contact valid? */
97         unsigned mt_flags;      /* flags to pass to input-mt */
98 };
99
100 /* classes of device behavior */
101 #define MT_CLS_DEFAULT                          0x0001
102
103 #define MT_CLS_SERIAL                           0x0002
104 #define MT_CLS_CONFIDENCE                       0x0003
105 #define MT_CLS_CONFIDENCE_CONTACT_ID            0x0004
106 #define MT_CLS_CONFIDENCE_MINUS_ONE             0x0005
107 #define MT_CLS_DUAL_INRANGE_CONTACTID           0x0006
108 #define MT_CLS_DUAL_INRANGE_CONTACTNUMBER       0x0007
109 #define MT_CLS_DUAL_NSMU_CONTACTID              0x0008
110 #define MT_CLS_INRANGE_CONTACTNUMBER            0x0009
111
112 /* vendor specific classes */
113 #define MT_CLS_3M                               0x0101
114 #define MT_CLS_CYPRESS                          0x0102
115 #define MT_CLS_EGALAX                           0x0103
116 #define MT_CLS_EGALAX_SERIAL                    0x0104
117 #define MT_CLS_TOPSEED                          0x0105
118 #define MT_CLS_PANASONIC                        0x0106
119 #define MT_CLS_FLATFROG                         0x0107
120
121 #define MT_DEFAULT_MAXCONTACT   10
122
123 #define MT_USB_DEVICE(v, p)     HID_DEVICE(BUS_USB, HID_GROUP_MULTITOUCH, v, p)
124 #define MT_BT_DEVICE(v, p)      HID_DEVICE(BUS_BLUETOOTH, HID_GROUP_MULTITOUCH, v, p)
125
126 /*
127  * these device-dependent functions determine what slot corresponds
128  * to a valid contact that was just read.
129  */
130
131 static int cypress_compute_slot(struct mt_device *td)
132 {
133         if (td->curdata.contactid != 0 || td->num_received == 0)
134                 return td->curdata.contactid;
135         else
136                 return -1;
137 }
138
139 static struct mt_class mt_classes[] = {
140         { .name = MT_CLS_DEFAULT,
141                 .quirks = MT_QUIRK_NOT_SEEN_MEANS_UP },
142         { .name = MT_CLS_SERIAL,
143                 .quirks = MT_QUIRK_ALWAYS_VALID},
144         { .name = MT_CLS_CONFIDENCE,
145                 .quirks = MT_QUIRK_VALID_IS_CONFIDENCE },
146         { .name = MT_CLS_CONFIDENCE_CONTACT_ID,
147                 .quirks = MT_QUIRK_VALID_IS_CONFIDENCE |
148                         MT_QUIRK_SLOT_IS_CONTACTID },
149         { .name = MT_CLS_CONFIDENCE_MINUS_ONE,
150                 .quirks = MT_QUIRK_VALID_IS_CONFIDENCE |
151                         MT_QUIRK_SLOT_IS_CONTACTID_MINUS_ONE },
152         { .name = MT_CLS_DUAL_INRANGE_CONTACTID,
153                 .quirks = MT_QUIRK_VALID_IS_INRANGE |
154                         MT_QUIRK_SLOT_IS_CONTACTID,
155                 .maxcontacts = 2 },
156         { .name = MT_CLS_DUAL_INRANGE_CONTACTNUMBER,
157                 .quirks = MT_QUIRK_VALID_IS_INRANGE |
158                         MT_QUIRK_SLOT_IS_CONTACTNUMBER,
159                 .maxcontacts = 2 },
160         { .name = MT_CLS_DUAL_NSMU_CONTACTID,
161                 .quirks = MT_QUIRK_NOT_SEEN_MEANS_UP |
162                         MT_QUIRK_SLOT_IS_CONTACTID,
163                 .maxcontacts = 2 },
164         { .name = MT_CLS_INRANGE_CONTACTNUMBER,
165                 .quirks = MT_QUIRK_VALID_IS_INRANGE |
166                         MT_QUIRK_SLOT_IS_CONTACTNUMBER },
167
168         /*
169          * vendor specific classes
170          */
171         { .name = MT_CLS_3M,
172                 .quirks = MT_QUIRK_VALID_IS_CONFIDENCE |
173                         MT_QUIRK_SLOT_IS_CONTACTID,
174                 .sn_move = 2048,
175                 .sn_width = 128,
176                 .sn_height = 128,
177                 .maxcontacts = 60,
178         },
179         { .name = MT_CLS_CYPRESS,
180                 .quirks = MT_QUIRK_NOT_SEEN_MEANS_UP |
181                         MT_QUIRK_CYPRESS,
182                 .maxcontacts = 10 },
183         { .name = MT_CLS_EGALAX,
184                 .quirks =  MT_QUIRK_SLOT_IS_CONTACTID |
185                         MT_QUIRK_VALID_IS_INRANGE,
186                 .sn_move = 4096,
187                 .sn_pressure = 32,
188         },
189         { .name = MT_CLS_EGALAX_SERIAL,
190                 .quirks =  MT_QUIRK_SLOT_IS_CONTACTID |
191                         MT_QUIRK_ALWAYS_VALID,
192                 .sn_move = 4096,
193                 .sn_pressure = 32,
194         },
195         { .name = MT_CLS_TOPSEED,
196                 .quirks = MT_QUIRK_ALWAYS_VALID,
197                 .is_indirect = true,
198                 .maxcontacts = 2,
199         },
200         { .name = MT_CLS_PANASONIC,
201                 .quirks = MT_QUIRK_NOT_SEEN_MEANS_UP,
202                 .maxcontacts = 4 },
203
204         { .name = MT_CLS_FLATFROG,
205                 .quirks = MT_QUIRK_NOT_SEEN_MEANS_UP |
206                         MT_QUIRK_NO_AREA,
207                 .sn_move = 2048,
208                 .maxcontacts = 40,
209         },
210         { }
211 };
212
213 static ssize_t mt_show_quirks(struct device *dev,
214                            struct device_attribute *attr,
215                            char *buf)
216 {
217         struct hid_device *hdev = container_of(dev, struct hid_device, dev);
218         struct mt_device *td = hid_get_drvdata(hdev);
219
220         return sprintf(buf, "%u\n", td->mtclass.quirks);
221 }
222
223 static ssize_t mt_set_quirks(struct device *dev,
224                           struct device_attribute *attr,
225                           const char *buf, size_t count)
226 {
227         struct hid_device *hdev = container_of(dev, struct hid_device, dev);
228         struct mt_device *td = hid_get_drvdata(hdev);
229
230         unsigned long val;
231
232         if (kstrtoul(buf, 0, &val))
233                 return -EINVAL;
234
235         td->mtclass.quirks = val;
236
237         return count;
238 }
239
240 static DEVICE_ATTR(quirks, S_IWUSR | S_IRUGO, mt_show_quirks, mt_set_quirks);
241
242 static struct attribute *sysfs_attrs[] = {
243         &dev_attr_quirks.attr,
244         NULL
245 };
246
247 static struct attribute_group mt_attribute_group = {
248         .attrs = sysfs_attrs
249 };
250
251 static void mt_feature_mapping(struct hid_device *hdev,
252                 struct hid_field *field, struct hid_usage *usage)
253 {
254         struct mt_device *td = hid_get_drvdata(hdev);
255         int i;
256
257         switch (usage->hid) {
258         case HID_DG_INPUTMODE:
259                 td->inputmode = field->report->id;
260                 td->inputmode_index = 0; /* has to be updated below */
261
262                 for (i=0; i < field->maxusage; i++) {
263                         if (field->usage[i].hid == usage->hid) {
264                                 td->inputmode_index = i;
265                                 break;
266                         }
267                 }
268
269                 break;
270         case HID_DG_CONTACTMAX:
271                 td->maxcontact_report_id = field->report->id;
272                 td->maxcontacts = field->value[0];
273                 if (td->mtclass.maxcontacts)
274                         /* check if the maxcontacts is given by the class */
275                         td->maxcontacts = td->mtclass.maxcontacts;
276
277                 break;
278         }
279 }
280
281 static void set_abs(struct input_dev *input, unsigned int code,
282                 struct hid_field *field, int snratio)
283 {
284         int fmin = field->logical_minimum;
285         int fmax = field->logical_maximum;
286         int fuzz = snratio ? (fmax - fmin) / snratio : 0;
287         input_set_abs_params(input, code, fmin, fmax, fuzz, 0);
288 }
289
290 static void mt_store_field(struct hid_usage *usage, struct mt_device *td,
291                 struct hid_input *hi)
292 {
293         struct mt_fields *f = td->fields;
294
295         if (f->length >= HID_MAX_FIELDS)
296                 return;
297
298         f->usages[f->length++] = usage->hid;
299 }
300
301 static int mt_input_mapping(struct hid_device *hdev, struct hid_input *hi,
302                 struct hid_field *field, struct hid_usage *usage,
303                 unsigned long **bit, int *max)
304 {
305         struct mt_device *td = hid_get_drvdata(hdev);
306         struct mt_class *cls = &td->mtclass;
307         int code;
308
309         /* Only map fields from TouchScreen or TouchPad collections.
310         * We need to ignore fields that belong to other collections
311         * such as Mouse that might have the same GenericDesktop usages. */
312         if (field->application == HID_DG_TOUCHSCREEN)
313                 td->mt_flags |= INPUT_MT_DIRECT;
314         else if (field->application != HID_DG_TOUCHPAD)
315                 return 0;
316
317         /*
318          * Model touchscreens providing buttons as touchpads.
319          */
320         if (field->application == HID_DG_TOUCHPAD ||
321             (usage->hid & HID_USAGE_PAGE) == HID_UP_BUTTON)
322                 td->mt_flags |= INPUT_MT_POINTER;
323
324         /* eGalax devices provide a Digitizer.Stylus input which overrides
325          * the correct Digitizers.Finger X/Y ranges.
326          * Let's just ignore this input. */
327         if (field->physical == HID_DG_STYLUS)
328                 return -1;
329
330         switch (usage->hid & HID_USAGE_PAGE) {
331
332         case HID_UP_GENDESK:
333                 switch (usage->hid) {
334                 case HID_GD_X:
335                         hid_map_usage(hi, usage, bit, max,
336                                         EV_ABS, ABS_MT_POSITION_X);
337                         set_abs(hi->input, ABS_MT_POSITION_X, field,
338                                 cls->sn_move);
339                         mt_store_field(usage, td, hi);
340                         td->last_field_index = field->index;
341                         return 1;
342                 case HID_GD_Y:
343                         hid_map_usage(hi, usage, bit, max,
344                                         EV_ABS, ABS_MT_POSITION_Y);
345                         set_abs(hi->input, ABS_MT_POSITION_Y, field,
346                                 cls->sn_move);
347                         mt_store_field(usage, td, hi);
348                         td->last_field_index = field->index;
349                         return 1;
350                 }
351                 return 0;
352
353         case HID_UP_DIGITIZER:
354                 switch (usage->hid) {
355                 case HID_DG_INRANGE:
356                         mt_store_field(usage, td, hi);
357                         td->last_field_index = field->index;
358                         return 1;
359                 case HID_DG_CONFIDENCE:
360                         mt_store_field(usage, td, hi);
361                         td->last_field_index = field->index;
362                         return 1;
363                 case HID_DG_TIPSWITCH:
364                         hid_map_usage(hi, usage, bit, max, EV_KEY, BTN_TOUCH);
365                         input_set_capability(hi->input, EV_KEY, BTN_TOUCH);
366                         mt_store_field(usage, td, hi);
367                         td->last_field_index = field->index;
368                         return 1;
369                 case HID_DG_CONTACTID:
370                         mt_store_field(usage, td, hi);
371                         td->last_field_index = field->index;
372                         td->touches_by_report++;
373                         return 1;
374                 case HID_DG_WIDTH:
375                         hid_map_usage(hi, usage, bit, max,
376                                         EV_ABS, ABS_MT_TOUCH_MAJOR);
377                         if (!(cls->quirks & MT_QUIRK_NO_AREA))
378                                 set_abs(hi->input, ABS_MT_TOUCH_MAJOR, field,
379                                         cls->sn_width);
380                         mt_store_field(usage, td, hi);
381                         td->last_field_index = field->index;
382                         return 1;
383                 case HID_DG_HEIGHT:
384                         hid_map_usage(hi, usage, bit, max,
385                                         EV_ABS, ABS_MT_TOUCH_MINOR);
386                         if (!(cls->quirks & MT_QUIRK_NO_AREA)) {
387                                 set_abs(hi->input, ABS_MT_TOUCH_MINOR, field,
388                                         cls->sn_height);
389                                 input_set_abs_params(hi->input,
390                                         ABS_MT_ORIENTATION, 0, 1, 0, 0);
391                         }
392                         mt_store_field(usage, td, hi);
393                         td->last_field_index = field->index;
394                         return 1;
395                 case HID_DG_TIPPRESSURE:
396                         hid_map_usage(hi, usage, bit, max,
397                                         EV_ABS, ABS_MT_PRESSURE);
398                         set_abs(hi->input, ABS_MT_PRESSURE, field,
399                                 cls->sn_pressure);
400                         mt_store_field(usage, td, hi);
401                         td->last_field_index = field->index;
402                         return 1;
403                 case HID_DG_CONTACTCOUNT:
404                         td->last_field_index = field->index;
405                         return 1;
406                 case HID_DG_CONTACTMAX:
407                         /* we don't set td->last_slot_field as contactcount and
408                          * contact max are global to the report */
409                         td->last_field_index = field->index;
410                         return -1;
411                 }
412                 case HID_DG_TOUCH:
413                         /* Legacy devices use TIPSWITCH and not TOUCH.
414                          * Let's just ignore this field. */
415                         return -1;
416                 /* let hid-input decide for the others */
417                 return 0;
418
419         case HID_UP_BUTTON:
420                 code = BTN_MOUSE + ((usage->hid - 1) & HID_USAGE);
421                 hid_map_usage(hi, usage, bit, max, EV_KEY, code);
422                 input_set_capability(hi->input, EV_KEY, code);
423                 return 1;
424
425         case 0xff000000:
426                 /* we do not want to map these: no input-oriented meaning */
427                 return -1;
428         }
429
430         return 0;
431 }
432
433 static int mt_input_mapped(struct hid_device *hdev, struct hid_input *hi,
434                 struct hid_field *field, struct hid_usage *usage,
435                 unsigned long **bit, int *max)
436 {
437         if (usage->type == EV_KEY || usage->type == EV_ABS)
438                 set_bit(usage->type, hi->input->evbit);
439
440         return -1;
441 }
442
443 static int mt_compute_slot(struct mt_device *td, struct input_dev *input)
444 {
445         __s32 quirks = td->mtclass.quirks;
446
447         if (quirks & MT_QUIRK_SLOT_IS_CONTACTID)
448                 return td->curdata.contactid;
449
450         if (quirks & MT_QUIRK_CYPRESS)
451                 return cypress_compute_slot(td);
452
453         if (quirks & MT_QUIRK_SLOT_IS_CONTACTNUMBER)
454                 return td->num_received;
455
456         if (quirks & MT_QUIRK_SLOT_IS_CONTACTID_MINUS_ONE)
457                 return td->curdata.contactid - 1;
458
459         return input_mt_get_slot_by_key(input, td->curdata.contactid);
460 }
461
462 /*
463  * this function is called when a whole contact has been processed,
464  * so that it can assign it to a slot and store the data there
465  */
466 static void mt_complete_slot(struct mt_device *td, struct input_dev *input)
467 {
468         if (td->curvalid) {
469                 int slotnum = mt_compute_slot(td, input);
470                 struct mt_slot *s = &td->curdata;
471
472                 if (slotnum < 0 || slotnum >= td->maxcontacts)
473                         return;
474
475                 input_mt_slot(input, slotnum);
476                 input_mt_report_slot_state(input, MT_TOOL_FINGER,
477                         s->touch_state);
478                 if (s->touch_state) {
479                         /* this finger is on the screen */
480                         int wide = (s->w > s->h);
481                         /* divided by two to match visual scale of touch */
482                         int major = max(s->w, s->h) >> 1;
483                         int minor = min(s->w, s->h) >> 1;
484
485                         input_event(input, EV_ABS, ABS_MT_POSITION_X, s->x);
486                         input_event(input, EV_ABS, ABS_MT_POSITION_Y, s->y);
487                         input_event(input, EV_ABS, ABS_MT_ORIENTATION, wide);
488                         input_event(input, EV_ABS, ABS_MT_PRESSURE, s->p);
489                         input_event(input, EV_ABS, ABS_MT_TOUCH_MAJOR, major);
490                         input_event(input, EV_ABS, ABS_MT_TOUCH_MINOR, minor);
491                 }
492         }
493
494         td->num_received++;
495 }
496
497 /*
498  * this function is called when a whole packet has been received and processed,
499  * so that it can decide what to send to the input layer.
500  */
501 static void mt_sync_frame(struct mt_device *td, struct input_dev *input)
502 {
503         input_mt_sync_frame(input);
504         input_sync(input);
505         td->num_received = 0;
506 }
507
508 static int mt_event(struct hid_device *hid, struct hid_field *field,
509                                 struct hid_usage *usage, __s32 value)
510 {
511         struct mt_device *td = hid_get_drvdata(hid);
512         __s32 quirks = td->mtclass.quirks;
513
514         if (hid->claimed & HID_CLAIMED_INPUT) {
515                 switch (usage->hid) {
516                 case HID_DG_INRANGE:
517                         if (quirks & MT_QUIRK_ALWAYS_VALID)
518                                 td->curvalid = true;
519                         else if (quirks & MT_QUIRK_VALID_IS_INRANGE)
520                                 td->curvalid = value;
521                         break;
522                 case HID_DG_TIPSWITCH:
523                         if (quirks & MT_QUIRK_NOT_SEEN_MEANS_UP)
524                                 td->curvalid = value;
525                         td->curdata.touch_state = value;
526                         break;
527                 case HID_DG_CONFIDENCE:
528                         if (quirks & MT_QUIRK_VALID_IS_CONFIDENCE)
529                                 td->curvalid = value;
530                         break;
531                 case HID_DG_CONTACTID:
532                         td->curdata.contactid = value;
533                         break;
534                 case HID_DG_TIPPRESSURE:
535                         td->curdata.p = value;
536                         break;
537                 case HID_GD_X:
538                         td->curdata.x = value;
539                         break;
540                 case HID_GD_Y:
541                         td->curdata.y = value;
542                         break;
543                 case HID_DG_WIDTH:
544                         td->curdata.w = value;
545                         break;
546                 case HID_DG_HEIGHT:
547                         td->curdata.h = value;
548                         break;
549                 case HID_DG_CONTACTCOUNT:
550                         /*
551                          * Includes multi-packet support where subsequent
552                          * packets are sent with zero contactcount.
553                          */
554                         if (value)
555                                 td->num_expected = value;
556                         break;
557                 case HID_DG_TOUCH:
558                         /* do nothing */
559                         break;
560
561                 default:
562                         /* fallback to the generic hidinput handling */
563                         return 0;
564                 }
565
566                 if (usage->hid == td->last_slot_field)
567                         mt_complete_slot(td, field->hidinput->input);
568
569                 if (field->index == td->last_field_index
570                         && td->num_received >= td->num_expected)
571                         mt_sync_frame(td, field->hidinput->input);
572
573         }
574
575         /* we have handled the hidinput part, now remains hiddev */
576         if (hid->claimed & HID_CLAIMED_HIDDEV && hid->hiddev_hid_event)
577                 hid->hiddev_hid_event(hid, field, usage, value);
578
579         return 1;
580 }
581
582 static void mt_set_input_mode(struct hid_device *hdev)
583 {
584         struct mt_device *td = hid_get_drvdata(hdev);
585         struct hid_report *r;
586         struct hid_report_enum *re;
587
588         if (td->inputmode < 0)
589                 return;
590
591         re = &(hdev->report_enum[HID_FEATURE_REPORT]);
592         r = re->report_id_hash[td->inputmode];
593         if (r) {
594                 r->field[0]->value[td->inputmode_index] = 0x02;
595                 usbhid_submit_report(hdev, r, USB_DIR_OUT);
596         }
597 }
598
599 static void mt_set_maxcontacts(struct hid_device *hdev)
600 {
601         struct mt_device *td = hid_get_drvdata(hdev);
602         struct hid_report *r;
603         struct hid_report_enum *re;
604         int fieldmax, max;
605
606         if (td->maxcontact_report_id < 0)
607                 return;
608
609         if (!td->mtclass.maxcontacts)
610                 return;
611
612         re = &hdev->report_enum[HID_FEATURE_REPORT];
613         r = re->report_id_hash[td->maxcontact_report_id];
614         if (r) {
615                 max = td->mtclass.maxcontacts;
616                 fieldmax = r->field[0]->logical_maximum;
617                 max = min(fieldmax, max);
618                 if (r->field[0]->value[0] != max) {
619                         r->field[0]->value[0] = max;
620                         usbhid_submit_report(hdev, r, USB_DIR_OUT);
621                 }
622         }
623 }
624
625 static void mt_post_parse_default_settings(struct mt_device *td)
626 {
627         __s32 quirks = td->mtclass.quirks;
628
629         /* unknown serial device needs special quirks */
630         if (td->touches_by_report == 1) {
631                 quirks |= MT_QUIRK_ALWAYS_VALID;
632                 quirks &= ~MT_QUIRK_NOT_SEEN_MEANS_UP;
633                 quirks &= ~MT_QUIRK_VALID_IS_INRANGE;
634                 quirks &= ~MT_QUIRK_VALID_IS_CONFIDENCE;
635         }
636
637         td->mtclass.quirks = quirks;
638 }
639
640 static void mt_post_parse(struct mt_device *td)
641 {
642         struct mt_fields *f = td->fields;
643
644         if (td->touches_by_report > 0) {
645                 int field_count_per_touch = f->length / td->touches_by_report;
646                 td->last_slot_field = f->usages[field_count_per_touch - 1];
647         }
648 }
649
650 static void mt_input_configured(struct hid_device *hdev, struct hid_input *hi)
651
652 {
653         struct mt_device *td = hid_get_drvdata(hdev);
654         struct mt_class *cls = &td->mtclass;
655         struct input_dev *input = hi->input;
656
657         /* Only initialize slots for MT input devices */
658         if (!test_bit(ABS_MT_POSITION_X, input->absbit))
659                 return;
660
661         if (!td->maxcontacts)
662                 td->maxcontacts = MT_DEFAULT_MAXCONTACT;
663
664         mt_post_parse(td);
665         if (td->serial_maybe)
666                 mt_post_parse_default_settings(td);
667
668         if (cls->is_indirect)
669                 td->mt_flags |= INPUT_MT_POINTER;
670
671         if (cls->quirks & MT_QUIRK_NOT_SEEN_MEANS_UP)
672                 td->mt_flags |= INPUT_MT_DROP_UNUSED;
673
674         input_mt_init_slots(input, td->maxcontacts, td->mt_flags);
675
676         td->mt_flags = 0;
677 }
678
679 static int mt_probe(struct hid_device *hdev, const struct hid_device_id *id)
680 {
681         int ret, i;
682         struct mt_device *td;
683         struct mt_class *mtclass = mt_classes; /* MT_CLS_DEFAULT */
684
685         if (id) {
686                 for (i = 0; mt_classes[i].name ; i++) {
687                         if (id->driver_data == mt_classes[i].name) {
688                                 mtclass = &(mt_classes[i]);
689                                 break;
690                         }
691                 }
692         }
693
694         /* This allows the driver to correctly support devices
695          * that emit events over several HID messages.
696          */
697         hdev->quirks |= HID_QUIRK_NO_INPUT_SYNC;
698
699         td = kzalloc(sizeof(struct mt_device), GFP_KERNEL);
700         if (!td) {
701                 dev_err(&hdev->dev, "cannot allocate multitouch data\n");
702                 return -ENOMEM;
703         }
704         td->mtclass = *mtclass;
705         td->inputmode = -1;
706         td->maxcontact_report_id = -1;
707         hid_set_drvdata(hdev, td);
708
709         td->fields = kzalloc(sizeof(struct mt_fields), GFP_KERNEL);
710         if (!td->fields) {
711                 dev_err(&hdev->dev, "cannot allocate multitouch fields data\n");
712                 ret = -ENOMEM;
713                 goto fail;
714         }
715
716         if (id->vendor == HID_ANY_ID && id->product == HID_ANY_ID)
717                 td->serial_maybe = true;
718
719         ret = hid_parse(hdev);
720         if (ret != 0)
721                 goto fail;
722
723         ret = hid_hw_start(hdev, HID_CONNECT_DEFAULT);
724         if (ret)
725                 goto fail;
726
727         ret = sysfs_create_group(&hdev->dev.kobj, &mt_attribute_group);
728
729         mt_set_maxcontacts(hdev);
730         mt_set_input_mode(hdev);
731
732         kfree(td->fields);
733         td->fields = NULL;
734
735         return 0;
736
737 fail:
738         kfree(td->fields);
739         kfree(td);
740         return ret;
741 }
742
743 #ifdef CONFIG_PM
744 static int mt_reset_resume(struct hid_device *hdev)
745 {
746         mt_set_maxcontacts(hdev);
747         mt_set_input_mode(hdev);
748         return 0;
749 }
750 #endif
751
752 static void mt_remove(struct hid_device *hdev)
753 {
754         struct mt_device *td = hid_get_drvdata(hdev);
755         sysfs_remove_group(&hdev->dev.kobj, &mt_attribute_group);
756         hid_hw_stop(hdev);
757         kfree(td);
758         hid_set_drvdata(hdev, NULL);
759 }
760
761 static const struct hid_device_id mt_devices[] = {
762
763         /* 3M panels */
764         { .driver_data = MT_CLS_3M,
765                 MT_USB_DEVICE(USB_VENDOR_ID_3M,
766                         USB_DEVICE_ID_3M1968) },
767         { .driver_data = MT_CLS_3M,
768                 MT_USB_DEVICE(USB_VENDOR_ID_3M,
769                         USB_DEVICE_ID_3M2256) },
770         { .driver_data = MT_CLS_3M,
771                 MT_USB_DEVICE(USB_VENDOR_ID_3M,
772                         USB_DEVICE_ID_3M3266) },
773
774         /* ActionStar panels */
775         { .driver_data = MT_CLS_DEFAULT,
776                 MT_USB_DEVICE(USB_VENDOR_ID_ACTIONSTAR,
777                         USB_DEVICE_ID_ACTIONSTAR_1011) },
778
779         /* Atmel panels */
780         { .driver_data = MT_CLS_SERIAL,
781                 MT_USB_DEVICE(USB_VENDOR_ID_ATMEL,
782                         USB_DEVICE_ID_ATMEL_MULTITOUCH) },
783         { .driver_data = MT_CLS_SERIAL,
784                 MT_USB_DEVICE(USB_VENDOR_ID_ATMEL,
785                         USB_DEVICE_ID_ATMEL_MXT_DIGITIZER) },
786
787         /* Baanto multitouch devices */
788         { .driver_data = MT_CLS_DEFAULT,
789                 MT_USB_DEVICE(USB_VENDOR_ID_BAANTO,
790                         USB_DEVICE_ID_BAANTO_MT_190W2) },
791         /* Cando panels */
792         { .driver_data = MT_CLS_DUAL_INRANGE_CONTACTNUMBER,
793                 MT_USB_DEVICE(USB_VENDOR_ID_CANDO,
794                         USB_DEVICE_ID_CANDO_MULTI_TOUCH) },
795         { .driver_data = MT_CLS_DUAL_INRANGE_CONTACTNUMBER,
796                 MT_USB_DEVICE(USB_VENDOR_ID_CANDO,
797                         USB_DEVICE_ID_CANDO_MULTI_TOUCH_10_1) },
798         { .driver_data = MT_CLS_DUAL_INRANGE_CONTACTNUMBER,
799                 MT_USB_DEVICE(USB_VENDOR_ID_CANDO,
800                         USB_DEVICE_ID_CANDO_MULTI_TOUCH_11_6) },
801         { .driver_data = MT_CLS_DUAL_INRANGE_CONTACTNUMBER,
802                 MT_USB_DEVICE(USB_VENDOR_ID_CANDO,
803                         USB_DEVICE_ID_CANDO_MULTI_TOUCH_15_6) },
804
805         /* Chunghwa Telecom touch panels */
806         {  .driver_data = MT_CLS_DEFAULT,
807                 MT_USB_DEVICE(USB_VENDOR_ID_CHUNGHWAT,
808                         USB_DEVICE_ID_CHUNGHWAT_MULTITOUCH) },
809
810         /* CVTouch panels */
811         { .driver_data = MT_CLS_DEFAULT,
812                 MT_USB_DEVICE(USB_VENDOR_ID_CVTOUCH,
813                         USB_DEVICE_ID_CVTOUCH_SCREEN) },
814
815         /* Cypress panel */
816         { .driver_data = MT_CLS_CYPRESS,
817                 HID_USB_DEVICE(USB_VENDOR_ID_CYPRESS,
818                         USB_DEVICE_ID_CYPRESS_TRUETOUCH) },
819
820         /* eGalax devices (resistive) */
821         { .driver_data = MT_CLS_EGALAX,
822                 MT_USB_DEVICE(USB_VENDOR_ID_DWAV,
823                         USB_DEVICE_ID_DWAV_EGALAX_MULTITOUCH_480D) },
824         { .driver_data = MT_CLS_EGALAX,
825                 MT_USB_DEVICE(USB_VENDOR_ID_DWAV,
826                         USB_DEVICE_ID_DWAV_EGALAX_MULTITOUCH_480E) },
827
828         /* eGalax devices (capacitive) */
829         { .driver_data = MT_CLS_EGALAX,
830                 MT_USB_DEVICE(USB_VENDOR_ID_DWAV,
831                         USB_DEVICE_ID_DWAV_EGALAX_MULTITOUCH_720C) },
832         { .driver_data = MT_CLS_EGALAX_SERIAL,
833                 MT_USB_DEVICE(USB_VENDOR_ID_DWAV,
834                         USB_DEVICE_ID_DWAV_EGALAX_MULTITOUCH_7207) },
835         { .driver_data = MT_CLS_EGALAX_SERIAL,
836                 MT_USB_DEVICE(USB_VENDOR_ID_DWAV,
837                         USB_DEVICE_ID_DWAV_EGALAX_MULTITOUCH_725E) },
838         { .driver_data = MT_CLS_EGALAX_SERIAL,
839                 MT_USB_DEVICE(USB_VENDOR_ID_DWAV,
840                         USB_DEVICE_ID_DWAV_EGALAX_MULTITOUCH_7224) },
841         { .driver_data = MT_CLS_EGALAX_SERIAL,
842                 MT_USB_DEVICE(USB_VENDOR_ID_DWAV,
843                         USB_DEVICE_ID_DWAV_EGALAX_MULTITOUCH_722A) },
844         { .driver_data = MT_CLS_EGALAX,
845                 MT_USB_DEVICE(USB_VENDOR_ID_DWAV,
846                         USB_DEVICE_ID_DWAV_EGALAX_MULTITOUCH_726B) },
847         { .driver_data = MT_CLS_EGALAX_SERIAL,
848                 MT_USB_DEVICE(USB_VENDOR_ID_DWAV,
849                         USB_DEVICE_ID_DWAV_EGALAX_MULTITOUCH_7262) },
850         { .driver_data = MT_CLS_EGALAX,
851                 MT_USB_DEVICE(USB_VENDOR_ID_DWAV,
852                         USB_DEVICE_ID_DWAV_EGALAX_MULTITOUCH_72A1) },
853         { .driver_data = MT_CLS_EGALAX_SERIAL,
854                 MT_USB_DEVICE(USB_VENDOR_ID_DWAV,
855                         USB_DEVICE_ID_DWAV_EGALAX_MULTITOUCH_72AA) },
856         { .driver_data = MT_CLS_EGALAX,
857                 MT_USB_DEVICE(USB_VENDOR_ID_DWAV,
858                         USB_DEVICE_ID_DWAV_EGALAX_MULTITOUCH_72FA) },
859         { .driver_data = MT_CLS_EGALAX,
860                 MT_USB_DEVICE(USB_VENDOR_ID_DWAV,
861                         USB_DEVICE_ID_DWAV_EGALAX_MULTITOUCH_7302) },
862         { .driver_data = MT_CLS_EGALAX_SERIAL,
863                 MT_USB_DEVICE(USB_VENDOR_ID_DWAV,
864                         USB_DEVICE_ID_DWAV_EGALAX_MULTITOUCH_7349) },
865         { .driver_data = MT_CLS_EGALAX_SERIAL,
866                 MT_USB_DEVICE(USB_VENDOR_ID_DWAV,
867                         USB_DEVICE_ID_DWAV_EGALAX_MULTITOUCH_A001) },
868
869         /* Elo TouchSystems IntelliTouch Plus panel */
870         { .driver_data = MT_CLS_DUAL_NSMU_CONTACTID,
871                 MT_USB_DEVICE(USB_VENDOR_ID_ELO,
872                         USB_DEVICE_ID_ELO_TS2515) },
873
874         /* Flatfrog Panels */
875         { .driver_data = MT_CLS_FLATFROG,
876                 MT_USB_DEVICE(USB_VENDOR_ID_FLATFROG,
877                         USB_DEVICE_ID_MULTITOUCH_3200) },
878
879         /* GeneralTouch panel */
880         { .driver_data = MT_CLS_DUAL_INRANGE_CONTACTNUMBER,
881                 MT_USB_DEVICE(USB_VENDOR_ID_GENERAL_TOUCH,
882                         USB_DEVICE_ID_GENERAL_TOUCH_WIN7_TWOFINGERS) },
883
884         /* Gametel game controller */
885         { .driver_data = MT_CLS_DEFAULT,
886                 MT_BT_DEVICE(USB_VENDOR_ID_FRUCTEL,
887                         USB_DEVICE_ID_GAMETEL_MT_MODE) },
888
889         /* GoodTouch panels */
890         { .driver_data = MT_CLS_DEFAULT,
891                 MT_USB_DEVICE(USB_VENDOR_ID_GOODTOUCH,
892                         USB_DEVICE_ID_GOODTOUCH_000f) },
893
894         /* Hanvon panels */
895         { .driver_data = MT_CLS_DUAL_INRANGE_CONTACTID,
896                 MT_USB_DEVICE(USB_VENDOR_ID_HANVON_ALT,
897                         USB_DEVICE_ID_HANVON_ALT_MULTITOUCH) },
898
899         /* Ideacom panel */
900         { .driver_data = MT_CLS_SERIAL,
901                 MT_USB_DEVICE(USB_VENDOR_ID_IDEACOM,
902                         USB_DEVICE_ID_IDEACOM_IDC6650) },
903         { .driver_data = MT_CLS_SERIAL,
904                 MT_USB_DEVICE(USB_VENDOR_ID_IDEACOM,
905                         USB_DEVICE_ID_IDEACOM_IDC6651) },
906
907         /* Ilitek dual touch panel */
908         {  .driver_data = MT_CLS_DEFAULT,
909                 MT_USB_DEVICE(USB_VENDOR_ID_ILITEK,
910                         USB_DEVICE_ID_ILITEK_MULTITOUCH) },
911
912         /* IRTOUCH panels */
913         { .driver_data = MT_CLS_DUAL_INRANGE_CONTACTID,
914                 MT_USB_DEVICE(USB_VENDOR_ID_IRTOUCHSYSTEMS,
915                         USB_DEVICE_ID_IRTOUCH_INFRARED_USB) },
916
917         /* LG Display panels */
918         { .driver_data = MT_CLS_DEFAULT,
919                 MT_USB_DEVICE(USB_VENDOR_ID_LG,
920                         USB_DEVICE_ID_LG_MULTITOUCH) },
921
922         /* Lumio panels */
923         { .driver_data = MT_CLS_CONFIDENCE_MINUS_ONE,
924                 MT_USB_DEVICE(USB_VENDOR_ID_LUMIO,
925                         USB_DEVICE_ID_CRYSTALTOUCH) },
926         { .driver_data = MT_CLS_CONFIDENCE_MINUS_ONE,
927                 MT_USB_DEVICE(USB_VENDOR_ID_LUMIO,
928                         USB_DEVICE_ID_CRYSTALTOUCH_DUAL) },
929
930         /* MosArt panels */
931         { .driver_data = MT_CLS_CONFIDENCE_MINUS_ONE,
932                 MT_USB_DEVICE(USB_VENDOR_ID_ASUS,
933                         USB_DEVICE_ID_ASUS_T91MT)},
934         { .driver_data = MT_CLS_CONFIDENCE_MINUS_ONE,
935                 MT_USB_DEVICE(USB_VENDOR_ID_ASUS,
936                         USB_DEVICE_ID_ASUSTEK_MULTITOUCH_YFO) },
937         { .driver_data = MT_CLS_CONFIDENCE_MINUS_ONE,
938                 MT_USB_DEVICE(USB_VENDOR_ID_TURBOX,
939                         USB_DEVICE_ID_TURBOX_TOUCHSCREEN_MOSART) },
940
941         /* Panasonic panels */
942         { .driver_data = MT_CLS_PANASONIC,
943                 MT_USB_DEVICE(USB_VENDOR_ID_PANASONIC,
944                         USB_DEVICE_ID_PANABOARD_UBT780) },
945         { .driver_data = MT_CLS_PANASONIC,
946                 MT_USB_DEVICE(USB_VENDOR_ID_PANASONIC,
947                         USB_DEVICE_ID_PANABOARD_UBT880) },
948
949         /* Novatek Panel */
950         { .driver_data = MT_CLS_DEFAULT,
951                 MT_USB_DEVICE(USB_VENDOR_ID_NOVATEK,
952                         USB_DEVICE_ID_NOVATEK_PCT) },
953
954         /* PenMount panels */
955         { .driver_data = MT_CLS_CONFIDENCE,
956                 MT_USB_DEVICE(USB_VENDOR_ID_PENMOUNT,
957                         USB_DEVICE_ID_PENMOUNT_PCI) },
958
959         /* PixArt optical touch screen */
960         { .driver_data = MT_CLS_INRANGE_CONTACTNUMBER,
961                 MT_USB_DEVICE(USB_VENDOR_ID_PIXART,
962                         USB_DEVICE_ID_PIXART_OPTICAL_TOUCH_SCREEN) },
963         { .driver_data = MT_CLS_INRANGE_CONTACTNUMBER,
964                 MT_USB_DEVICE(USB_VENDOR_ID_PIXART,
965                         USB_DEVICE_ID_PIXART_OPTICAL_TOUCH_SCREEN1) },
966         { .driver_data = MT_CLS_INRANGE_CONTACTNUMBER,
967                 MT_USB_DEVICE(USB_VENDOR_ID_PIXART,
968                         USB_DEVICE_ID_PIXART_OPTICAL_TOUCH_SCREEN2) },
969
970         /* PixCir-based panels */
971         { .driver_data = MT_CLS_DUAL_INRANGE_CONTACTID,
972                 MT_USB_DEVICE(USB_VENDOR_ID_HANVON,
973                         USB_DEVICE_ID_HANVON_MULTITOUCH) },
974         { .driver_data = MT_CLS_DUAL_INRANGE_CONTACTID,
975                 MT_USB_DEVICE(USB_VENDOR_ID_CANDO,
976                         USB_DEVICE_ID_CANDO_PIXCIR_MULTI_TOUCH) },
977
978         /* Quanta-based panels */
979         { .driver_data = MT_CLS_CONFIDENCE_CONTACT_ID,
980                 MT_USB_DEVICE(USB_VENDOR_ID_QUANTA,
981                         USB_DEVICE_ID_QUANTA_OPTICAL_TOUCH) },
982         { .driver_data = MT_CLS_CONFIDENCE_CONTACT_ID,
983                 MT_USB_DEVICE(USB_VENDOR_ID_QUANTA,
984                         USB_DEVICE_ID_QUANTA_OPTICAL_TOUCH_3001) },
985         { .driver_data = MT_CLS_CONFIDENCE_CONTACT_ID,
986                 MT_USB_DEVICE(USB_VENDOR_ID_QUANTA,
987                         USB_DEVICE_ID_QUANTA_OPTICAL_TOUCH_3008) },
988
989         /* Stantum panels */
990         { .driver_data = MT_CLS_CONFIDENCE,
991                 MT_USB_DEVICE(USB_VENDOR_ID_STANTUM,
992                         USB_DEVICE_ID_MTP)},
993         { .driver_data = MT_CLS_CONFIDENCE,
994                 MT_USB_DEVICE(USB_VENDOR_ID_STANTUM_STM,
995                         USB_DEVICE_ID_MTP_STM)},
996         { .driver_data = MT_CLS_CONFIDENCE,
997                 MT_USB_DEVICE(USB_VENDOR_ID_STANTUM_SITRONIX,
998                         USB_DEVICE_ID_MTP_SITRONIX)},
999
1000         /* TopSeed panels */
1001         { .driver_data = MT_CLS_TOPSEED,
1002                 MT_USB_DEVICE(USB_VENDOR_ID_TOPSEED2,
1003                         USB_DEVICE_ID_TOPSEED2_PERIPAD_701) },
1004
1005         /* Touch International panels */
1006         { .driver_data = MT_CLS_DEFAULT,
1007                 MT_USB_DEVICE(USB_VENDOR_ID_TOUCH_INTL,
1008                         USB_DEVICE_ID_TOUCH_INTL_MULTI_TOUCH) },
1009
1010         /* Unitec panels */
1011         { .driver_data = MT_CLS_DEFAULT,
1012                 MT_USB_DEVICE(USB_VENDOR_ID_UNITEC,
1013                         USB_DEVICE_ID_UNITEC_USB_TOUCH_0709) },
1014         { .driver_data = MT_CLS_DEFAULT,
1015                 MT_USB_DEVICE(USB_VENDOR_ID_UNITEC,
1016                         USB_DEVICE_ID_UNITEC_USB_TOUCH_0A19) },
1017         /* XAT */
1018         { .driver_data = MT_CLS_DEFAULT,
1019                 MT_USB_DEVICE(USB_VENDOR_ID_XAT,
1020                         USB_DEVICE_ID_XAT_CSR) },
1021
1022         /* Xiroku */
1023         { .driver_data = MT_CLS_DEFAULT,
1024                 MT_USB_DEVICE(USB_VENDOR_ID_XIROKU,
1025                         USB_DEVICE_ID_XIROKU_SPX) },
1026         { .driver_data = MT_CLS_DEFAULT,
1027                 MT_USB_DEVICE(USB_VENDOR_ID_XIROKU,
1028                         USB_DEVICE_ID_XIROKU_MPX) },
1029         { .driver_data = MT_CLS_DEFAULT,
1030                 MT_USB_DEVICE(USB_VENDOR_ID_XIROKU,
1031                         USB_DEVICE_ID_XIROKU_CSR) },
1032         { .driver_data = MT_CLS_DEFAULT,
1033                 MT_USB_DEVICE(USB_VENDOR_ID_XIROKU,
1034                         USB_DEVICE_ID_XIROKU_SPX1) },
1035         { .driver_data = MT_CLS_DEFAULT,
1036                 MT_USB_DEVICE(USB_VENDOR_ID_XIROKU,
1037                         USB_DEVICE_ID_XIROKU_MPX1) },
1038         { .driver_data = MT_CLS_DEFAULT,
1039                 MT_USB_DEVICE(USB_VENDOR_ID_XIROKU,
1040                         USB_DEVICE_ID_XIROKU_CSR1) },
1041         { .driver_data = MT_CLS_DEFAULT,
1042                 MT_USB_DEVICE(USB_VENDOR_ID_XIROKU,
1043                         USB_DEVICE_ID_XIROKU_SPX2) },
1044         { .driver_data = MT_CLS_DEFAULT,
1045                 MT_USB_DEVICE(USB_VENDOR_ID_XIROKU,
1046                         USB_DEVICE_ID_XIROKU_MPX2) },
1047         { .driver_data = MT_CLS_DEFAULT,
1048                 MT_USB_DEVICE(USB_VENDOR_ID_XIROKU,
1049                         USB_DEVICE_ID_XIROKU_CSR2) },
1050
1051         /* Zytronic panels */
1052         { .driver_data = MT_CLS_SERIAL,
1053                 MT_USB_DEVICE(USB_VENDOR_ID_ZYTRONIC,
1054                         USB_DEVICE_ID_ZYTRONIC_ZXY100) },
1055
1056         /* Generic MT device */
1057         { HID_DEVICE(HID_BUS_ANY, HID_GROUP_MULTITOUCH, HID_ANY_ID, HID_ANY_ID) },
1058         { }
1059 };
1060 MODULE_DEVICE_TABLE(hid, mt_devices);
1061
1062 static const struct hid_usage_id mt_grabbed_usages[] = {
1063         { HID_ANY_ID, HID_ANY_ID, HID_ANY_ID },
1064         { HID_ANY_ID - 1, HID_ANY_ID - 1, HID_ANY_ID - 1}
1065 };
1066
1067 static struct hid_driver mt_driver = {
1068         .name = "hid-multitouch",
1069         .id_table = mt_devices,
1070         .probe = mt_probe,
1071         .remove = mt_remove,
1072         .input_mapping = mt_input_mapping,
1073         .input_mapped = mt_input_mapped,
1074         .input_configured = mt_input_configured,
1075         .feature_mapping = mt_feature_mapping,
1076         .usage_table = mt_grabbed_usages,
1077         .event = mt_event,
1078 #ifdef CONFIG_PM
1079         .reset_resume = mt_reset_resume,
1080 #endif
1081 };
1082
1083 static int __init mt_init(void)
1084 {
1085         return hid_register_driver(&mt_driver);
1086 }
1087
1088 static void __exit mt_exit(void)
1089 {
1090         hid_unregister_driver(&mt_driver);
1091 }
1092
1093 module_init(mt_init);
1094 module_exit(mt_exit);