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