hid-multitouch.c revision e6aac3427ef03f61e7478514d0648b58359d05d1
15519cab477b61326963c8d523520db0342862b63Benjamin Tissoires/* 25519cab477b61326963c8d523520db0342862b63Benjamin Tissoires * HID driver for multitouch panels 35519cab477b61326963c8d523520db0342862b63Benjamin Tissoires * 45519cab477b61326963c8d523520db0342862b63Benjamin Tissoires * Copyright (c) 2010-2011 Stephane Chatty <chatty@enac.fr> 55519cab477b61326963c8d523520db0342862b63Benjamin Tissoires * Copyright (c) 2010-2011 Benjamin Tissoires <benjamin.tissoires@gmail.com> 65519cab477b61326963c8d523520db0342862b63Benjamin Tissoires * Copyright (c) 2010-2011 Ecole Nationale de l'Aviation Civile, France 75519cab477b61326963c8d523520db0342862b63Benjamin Tissoires * 84875ac114d8bce99838a9b0ee7c3f5469cc6352eRichard Nauber * This code is partly based on hid-egalax.c: 94875ac114d8bce99838a9b0ee7c3f5469cc6352eRichard Nauber * 104875ac114d8bce99838a9b0ee7c3f5469cc6352eRichard Nauber * Copyright (c) 2010 Stephane Chatty <chatty@enac.fr> 114875ac114d8bce99838a9b0ee7c3f5469cc6352eRichard Nauber * Copyright (c) 2010 Henrik Rydberg <rydberg@euromail.se> 124875ac114d8bce99838a9b0ee7c3f5469cc6352eRichard Nauber * Copyright (c) 2010 Canonical, Ltd. 134875ac114d8bce99838a9b0ee7c3f5469cc6352eRichard Nauber * 14f786bba4499cf3de20da345ce090457ebcef03b0Benjamin Tissoires * This code is partly based on hid-3m-pct.c: 15f786bba4499cf3de20da345ce090457ebcef03b0Benjamin Tissoires * 16f786bba4499cf3de20da345ce090457ebcef03b0Benjamin Tissoires * Copyright (c) 2009-2010 Stephane Chatty <chatty@enac.fr> 17f786bba4499cf3de20da345ce090457ebcef03b0Benjamin Tissoires * Copyright (c) 2010 Henrik Rydberg <rydberg@euromail.se> 18f786bba4499cf3de20da345ce090457ebcef03b0Benjamin Tissoires * Copyright (c) 2010 Canonical, Ltd. 19f786bba4499cf3de20da345ce090457ebcef03b0Benjamin Tissoires * 205519cab477b61326963c8d523520db0342862b63Benjamin Tissoires */ 215519cab477b61326963c8d523520db0342862b63Benjamin Tissoires 225519cab477b61326963c8d523520db0342862b63Benjamin Tissoires/* 235519cab477b61326963c8d523520db0342862b63Benjamin Tissoires * This program is free software; you can redistribute it and/or modify it 245519cab477b61326963c8d523520db0342862b63Benjamin Tissoires * under the terms of the GNU General Public License as published by the Free 255519cab477b61326963c8d523520db0342862b63Benjamin Tissoires * Software Foundation; either version 2 of the License, or (at your option) 265519cab477b61326963c8d523520db0342862b63Benjamin Tissoires * any later version. 275519cab477b61326963c8d523520db0342862b63Benjamin Tissoires */ 285519cab477b61326963c8d523520db0342862b63Benjamin Tissoires 295519cab477b61326963c8d523520db0342862b63Benjamin Tissoires#include <linux/device.h> 305519cab477b61326963c8d523520db0342862b63Benjamin Tissoires#include <linux/hid.h> 315519cab477b61326963c8d523520db0342862b63Benjamin Tissoires#include <linux/module.h> 325519cab477b61326963c8d523520db0342862b63Benjamin Tissoires#include <linux/slab.h> 335519cab477b61326963c8d523520db0342862b63Benjamin Tissoires#include <linux/usb.h> 345519cab477b61326963c8d523520db0342862b63Benjamin Tissoires#include <linux/input/mt.h> 355519cab477b61326963c8d523520db0342862b63Benjamin Tissoires#include "usbhid/usbhid.h" 365519cab477b61326963c8d523520db0342862b63Benjamin Tissoires 375519cab477b61326963c8d523520db0342862b63Benjamin Tissoires 385519cab477b61326963c8d523520db0342862b63Benjamin TissoiresMODULE_AUTHOR("Stephane Chatty <chatty@enac.fr>"); 39ef2fafb3e233ca9cb390fc3c1461b7f3859998fcBenjamin TissoiresMODULE_AUTHOR("Benjamin Tissoires <benjamin.tissoires@gmail.com>"); 405519cab477b61326963c8d523520db0342862b63Benjamin TissoiresMODULE_DESCRIPTION("HID multitouch panels"); 415519cab477b61326963c8d523520db0342862b63Benjamin TissoiresMODULE_LICENSE("GPL"); 425519cab477b61326963c8d523520db0342862b63Benjamin Tissoires 435519cab477b61326963c8d523520db0342862b63Benjamin Tissoires#include "hid-ids.h" 445519cab477b61326963c8d523520db0342862b63Benjamin Tissoires 455519cab477b61326963c8d523520db0342862b63Benjamin Tissoires/* quirks to control the device */ 465519cab477b61326963c8d523520db0342862b63Benjamin Tissoires#define MT_QUIRK_NOT_SEEN_MEANS_UP (1 << 0) 475519cab477b61326963c8d523520db0342862b63Benjamin Tissoires#define MT_QUIRK_SLOT_IS_CONTACTID (1 << 1) 482d93666e70662cfcf1927e1a858685f5b38d5d65Benjamin Tissoires#define MT_QUIRK_CYPRESS (1 << 2) 495572da08a784621f2ab4fdc8dc65471261871795Benjamin Tissoires#define MT_QUIRK_SLOT_IS_CONTACTNUMBER (1 << 3) 502d93666e70662cfcf1927e1a858685f5b38d5d65Benjamin Tissoires#define MT_QUIRK_VALID_IS_INRANGE (1 << 4) 512d93666e70662cfcf1927e1a858685f5b38d5d65Benjamin Tissoires#define MT_QUIRK_VALID_IS_CONFIDENCE (1 << 5) 524875ac114d8bce99838a9b0ee7c3f5469cc6352eRichard Nauber#define MT_QUIRK_EGALAX_XYZ_FIXUP (1 << 6) 534a6ee685fbcba4a440cf86f41557752ba81e2ccfBenjamin Tissoires#define MT_QUIRK_SLOT_IS_CONTACTID_MINUS_ONE (1 << 7) 545519cab477b61326963c8d523520db0342862b63Benjamin Tissoires 555519cab477b61326963c8d523520db0342862b63Benjamin Tissoiresstruct mt_slot { 565519cab477b61326963c8d523520db0342862b63Benjamin Tissoires __s32 x, y, p, w, h; 575519cab477b61326963c8d523520db0342862b63Benjamin Tissoires __s32 contactid; /* the device ContactID assigned to this slot */ 585519cab477b61326963c8d523520db0342862b63Benjamin Tissoires bool touch_state; /* is the touch valid? */ 595519cab477b61326963c8d523520db0342862b63Benjamin Tissoires bool seen_in_this_frame;/* has this slot been updated */ 605519cab477b61326963c8d523520db0342862b63Benjamin Tissoires}; 615519cab477b61326963c8d523520db0342862b63Benjamin Tissoires 625519cab477b61326963c8d523520db0342862b63Benjamin Tissoiresstruct mt_device { 635519cab477b61326963c8d523520db0342862b63Benjamin Tissoires struct mt_slot curdata; /* placeholder of incoming data */ 645519cab477b61326963c8d523520db0342862b63Benjamin Tissoires struct mt_class *mtclass; /* our mt device class */ 655519cab477b61326963c8d523520db0342862b63Benjamin Tissoires unsigned last_field_index; /* last field index of the report */ 665519cab477b61326963c8d523520db0342862b63Benjamin Tissoires unsigned last_slot_field; /* the last field of a slot */ 675519cab477b61326963c8d523520db0342862b63Benjamin Tissoires __s8 inputmode; /* InputMode HID feature, -1 if non-existent */ 685519cab477b61326963c8d523520db0342862b63Benjamin Tissoires __u8 num_received; /* how many contacts we received */ 695519cab477b61326963c8d523520db0342862b63Benjamin Tissoires __u8 num_expected; /* expected last contact index */ 709498f954a4ec389806333041a1018909c6fe0518Benjamin Tissoires __u8 maxcontacts; 715519cab477b61326963c8d523520db0342862b63Benjamin Tissoires bool curvalid; /* is the current contact valid? */ 729498f954a4ec389806333041a1018909c6fe0518Benjamin Tissoires struct mt_slot *slots; 735519cab477b61326963c8d523520db0342862b63Benjamin Tissoires}; 745519cab477b61326963c8d523520db0342862b63Benjamin Tissoires 755519cab477b61326963c8d523520db0342862b63Benjamin Tissoiresstruct mt_class { 762d93666e70662cfcf1927e1a858685f5b38d5d65Benjamin Tissoires __s32 name; /* MT_CLS */ 775519cab477b61326963c8d523520db0342862b63Benjamin Tissoires __s32 quirks; 785519cab477b61326963c8d523520db0342862b63Benjamin Tissoires __s32 sn_move; /* Signal/noise ratio for move events */ 79f786bba4499cf3de20da345ce090457ebcef03b0Benjamin Tissoires __s32 sn_width; /* Signal/noise ratio for width events */ 80f786bba4499cf3de20da345ce090457ebcef03b0Benjamin Tissoires __s32 sn_height; /* Signal/noise ratio for height events */ 815519cab477b61326963c8d523520db0342862b63Benjamin Tissoires __s32 sn_pressure; /* Signal/noise ratio for pressure events */ 825519cab477b61326963c8d523520db0342862b63Benjamin Tissoires __u8 maxcontacts; 835519cab477b61326963c8d523520db0342862b63Benjamin Tissoires}; 845519cab477b61326963c8d523520db0342862b63Benjamin Tissoires 855519cab477b61326963c8d523520db0342862b63Benjamin Tissoires/* classes of device behavior */ 861e9cf35b995610e7ba2934d3dc92e3a03fa361a1Benjamin Tissoires#define MT_CLS_DEFAULT 1 871e9cf35b995610e7ba2934d3dc92e3a03fa361a1Benjamin Tissoires#define MT_CLS_DUAL_INRANGE_CONTACTID 2 881e9cf35b995610e7ba2934d3dc92e3a03fa361a1Benjamin Tissoires#define MT_CLS_DUAL_INRANGE_CONTACTNUMBER 3 891e9cf35b995610e7ba2934d3dc92e3a03fa361a1Benjamin Tissoires#define MT_CLS_CYPRESS 4 904875ac114d8bce99838a9b0ee7c3f5469cc6352eRichard Nauber#define MT_CLS_EGALAX 5 91043b403aede4a528ed99ceaf050f567f1283a23eBenjamin Tissoires#define MT_CLS_STANTUM 6 92f786bba4499cf3de20da345ce090457ebcef03b0Benjamin Tissoires#define MT_CLS_3M 7 936ab3a9a63fc16b04f7de48eb0190d516dd7574dfJohn Sung#define MT_CLS_CONFIDENCE 8 944a6ee685fbcba4a440cf86f41557752ba81e2ccfBenjamin Tissoires#define MT_CLS_CONFIDENCE_MINUS_ONE 9 95c04abeeff9d76a703cac1e6d312853b0fc8136f5Benjamin Tissoires#define MT_CLS_DUAL_NSMU_CONTACTID 10 965519cab477b61326963c8d523520db0342862b63Benjamin Tissoires 979498f954a4ec389806333041a1018909c6fe0518Benjamin Tissoires#define MT_DEFAULT_MAXCONTACT 10 989498f954a4ec389806333041a1018909c6fe0518Benjamin Tissoires 995519cab477b61326963c8d523520db0342862b63Benjamin Tissoires/* 1005519cab477b61326963c8d523520db0342862b63Benjamin Tissoires * these device-dependent functions determine what slot corresponds 1015519cab477b61326963c8d523520db0342862b63Benjamin Tissoires * to a valid contact that was just read. 1025519cab477b61326963c8d523520db0342862b63Benjamin Tissoires */ 1035519cab477b61326963c8d523520db0342862b63Benjamin Tissoires 104a3b5e577d96bfccbc41ebf4df784e3a153072273Benjamin Tissoiresstatic int cypress_compute_slot(struct mt_device *td) 105a3b5e577d96bfccbc41ebf4df784e3a153072273Benjamin Tissoires{ 106a3b5e577d96bfccbc41ebf4df784e3a153072273Benjamin Tissoires if (td->curdata.contactid != 0 || td->num_received == 0) 107a3b5e577d96bfccbc41ebf4df784e3a153072273Benjamin Tissoires return td->curdata.contactid; 108a3b5e577d96bfccbc41ebf4df784e3a153072273Benjamin Tissoires else 109a3b5e577d96bfccbc41ebf4df784e3a153072273Benjamin Tissoires return -1; 110a3b5e577d96bfccbc41ebf4df784e3a153072273Benjamin Tissoires} 111a3b5e577d96bfccbc41ebf4df784e3a153072273Benjamin Tissoires 1125519cab477b61326963c8d523520db0342862b63Benjamin Tissoiresstatic int find_slot_from_contactid(struct mt_device *td) 1135519cab477b61326963c8d523520db0342862b63Benjamin Tissoires{ 1145519cab477b61326963c8d523520db0342862b63Benjamin Tissoires int i; 1159498f954a4ec389806333041a1018909c6fe0518Benjamin Tissoires for (i = 0; i < td->maxcontacts; ++i) { 1165519cab477b61326963c8d523520db0342862b63Benjamin Tissoires if (td->slots[i].contactid == td->curdata.contactid && 1175519cab477b61326963c8d523520db0342862b63Benjamin Tissoires td->slots[i].touch_state) 1185519cab477b61326963c8d523520db0342862b63Benjamin Tissoires return i; 1195519cab477b61326963c8d523520db0342862b63Benjamin Tissoires } 1209498f954a4ec389806333041a1018909c6fe0518Benjamin Tissoires for (i = 0; i < td->maxcontacts; ++i) { 1215519cab477b61326963c8d523520db0342862b63Benjamin Tissoires if (!td->slots[i].seen_in_this_frame && 1225519cab477b61326963c8d523520db0342862b63Benjamin Tissoires !td->slots[i].touch_state) 1235519cab477b61326963c8d523520db0342862b63Benjamin Tissoires return i; 1245519cab477b61326963c8d523520db0342862b63Benjamin Tissoires } 1255519cab477b61326963c8d523520db0342862b63Benjamin Tissoires /* should not occurs. If this happens that means 1265519cab477b61326963c8d523520db0342862b63Benjamin Tissoires * that the device sent more touches that it says 1275519cab477b61326963c8d523520db0342862b63Benjamin Tissoires * in the report descriptor. It is ignored then. */ 1282d93666e70662cfcf1927e1a858685f5b38d5d65Benjamin Tissoires return -1; 1295519cab477b61326963c8d523520db0342862b63Benjamin Tissoires} 1305519cab477b61326963c8d523520db0342862b63Benjamin Tissoires 1315519cab477b61326963c8d523520db0342862b63Benjamin Tissoiresstruct mt_class mt_classes[] = { 1322d93666e70662cfcf1927e1a858685f5b38d5d65Benjamin Tissoires { .name = MT_CLS_DEFAULT, 1339498f954a4ec389806333041a1018909c6fe0518Benjamin Tissoires .quirks = MT_QUIRK_NOT_SEEN_MEANS_UP }, 1341e9cf35b995610e7ba2934d3dc92e3a03fa361a1Benjamin Tissoires { .name = MT_CLS_DUAL_INRANGE_CONTACTID, 1352d93666e70662cfcf1927e1a858685f5b38d5d65Benjamin Tissoires .quirks = MT_QUIRK_VALID_IS_INRANGE | 1362d93666e70662cfcf1927e1a858685f5b38d5d65Benjamin Tissoires MT_QUIRK_SLOT_IS_CONTACTID, 1372d93666e70662cfcf1927e1a858685f5b38d5d65Benjamin Tissoires .maxcontacts = 2 }, 1381e9cf35b995610e7ba2934d3dc92e3a03fa361a1Benjamin Tissoires { .name = MT_CLS_DUAL_INRANGE_CONTACTNUMBER, 1392d93666e70662cfcf1927e1a858685f5b38d5d65Benjamin Tissoires .quirks = MT_QUIRK_VALID_IS_INRANGE | 1402d93666e70662cfcf1927e1a858685f5b38d5d65Benjamin Tissoires MT_QUIRK_SLOT_IS_CONTACTNUMBER, 1412d93666e70662cfcf1927e1a858685f5b38d5d65Benjamin Tissoires .maxcontacts = 2 }, 1422d93666e70662cfcf1927e1a858685f5b38d5d65Benjamin Tissoires { .name = MT_CLS_CYPRESS, 1432d93666e70662cfcf1927e1a858685f5b38d5d65Benjamin Tissoires .quirks = MT_QUIRK_NOT_SEEN_MEANS_UP | 1442d93666e70662cfcf1927e1a858685f5b38d5d65Benjamin Tissoires MT_QUIRK_CYPRESS, 1452d93666e70662cfcf1927e1a858685f5b38d5d65Benjamin Tissoires .maxcontacts = 10 }, 1464a6ee685fbcba4a440cf86f41557752ba81e2ccfBenjamin Tissoires { .name = MT_CLS_CONFIDENCE_MINUS_ONE, 1474a6ee685fbcba4a440cf86f41557752ba81e2ccfBenjamin Tissoires .quirks = MT_QUIRK_VALID_IS_CONFIDENCE | 1484a6ee685fbcba4a440cf86f41557752ba81e2ccfBenjamin Tissoires MT_QUIRK_SLOT_IS_CONTACTID_MINUS_ONE }, 1494875ac114d8bce99838a9b0ee7c3f5469cc6352eRichard Nauber { .name = MT_CLS_EGALAX, 1504875ac114d8bce99838a9b0ee7c3f5469cc6352eRichard Nauber .quirks = MT_QUIRK_SLOT_IS_CONTACTID | 1514875ac114d8bce99838a9b0ee7c3f5469cc6352eRichard Nauber MT_QUIRK_VALID_IS_INRANGE | 1524875ac114d8bce99838a9b0ee7c3f5469cc6352eRichard Nauber MT_QUIRK_EGALAX_XYZ_FIXUP, 1534875ac114d8bce99838a9b0ee7c3f5469cc6352eRichard Nauber .maxcontacts = 2, 1544875ac114d8bce99838a9b0ee7c3f5469cc6352eRichard Nauber .sn_move = 4096, 1554875ac114d8bce99838a9b0ee7c3f5469cc6352eRichard Nauber .sn_pressure = 32, 1564875ac114d8bce99838a9b0ee7c3f5469cc6352eRichard Nauber }, 157043b403aede4a528ed99ceaf050f567f1283a23eBenjamin Tissoires { .name = MT_CLS_STANTUM, 158043b403aede4a528ed99ceaf050f567f1283a23eBenjamin Tissoires .quirks = MT_QUIRK_VALID_IS_CONFIDENCE }, 159f786bba4499cf3de20da345ce090457ebcef03b0Benjamin Tissoires { .name = MT_CLS_3M, 160f786bba4499cf3de20da345ce090457ebcef03b0Benjamin Tissoires .quirks = MT_QUIRK_VALID_IS_CONFIDENCE | 161f786bba4499cf3de20da345ce090457ebcef03b0Benjamin Tissoires MT_QUIRK_SLOT_IS_CONTACTID, 162f786bba4499cf3de20da345ce090457ebcef03b0Benjamin Tissoires .sn_move = 2048, 163f786bba4499cf3de20da345ce090457ebcef03b0Benjamin Tissoires .sn_width = 128, 164f786bba4499cf3de20da345ce090457ebcef03b0Benjamin Tissoires .sn_height = 128 }, 1656ab3a9a63fc16b04f7de48eb0190d516dd7574dfJohn Sung { .name = MT_CLS_CONFIDENCE, 1666ab3a9a63fc16b04f7de48eb0190d516dd7574dfJohn Sung .quirks = MT_QUIRK_VALID_IS_CONFIDENCE }, 167c04abeeff9d76a703cac1e6d312853b0fc8136f5Benjamin Tissoires { .name = MT_CLS_DUAL_NSMU_CONTACTID, 168c04abeeff9d76a703cac1e6d312853b0fc8136f5Benjamin Tissoires .quirks = MT_QUIRK_NOT_SEEN_MEANS_UP | 169c04abeeff9d76a703cac1e6d312853b0fc8136f5Benjamin Tissoires MT_QUIRK_SLOT_IS_CONTACTID, 170c04abeeff9d76a703cac1e6d312853b0fc8136f5Benjamin Tissoires .maxcontacts = 2 }, 171043b403aede4a528ed99ceaf050f567f1283a23eBenjamin Tissoires 1722d93666e70662cfcf1927e1a858685f5b38d5d65Benjamin Tissoires { } 1735519cab477b61326963c8d523520db0342862b63Benjamin Tissoires}; 1745519cab477b61326963c8d523520db0342862b63Benjamin Tissoires 175f635bd11c8d332d917fb9a4cad3071b2357d5b2aHenrik Rydbergstatic void mt_feature_mapping(struct hid_device *hdev, 1765519cab477b61326963c8d523520db0342862b63Benjamin Tissoires struct hid_field *field, struct hid_usage *usage) 1775519cab477b61326963c8d523520db0342862b63Benjamin Tissoires{ 1789498f954a4ec389806333041a1018909c6fe0518Benjamin Tissoires struct mt_device *td = hid_get_drvdata(hdev); 1799498f954a4ec389806333041a1018909c6fe0518Benjamin Tissoires 1809498f954a4ec389806333041a1018909c6fe0518Benjamin Tissoires switch (usage->hid) { 1819498f954a4ec389806333041a1018909c6fe0518Benjamin Tissoires case HID_DG_INPUTMODE: 1825519cab477b61326963c8d523520db0342862b63Benjamin Tissoires td->inputmode = field->report->id; 1839498f954a4ec389806333041a1018909c6fe0518Benjamin Tissoires break; 1849498f954a4ec389806333041a1018909c6fe0518Benjamin Tissoires case HID_DG_CONTACTMAX: 1859498f954a4ec389806333041a1018909c6fe0518Benjamin Tissoires td->maxcontacts = field->value[0]; 1869498f954a4ec389806333041a1018909c6fe0518Benjamin Tissoires if (td->mtclass->maxcontacts) 1879498f954a4ec389806333041a1018909c6fe0518Benjamin Tissoires /* check if the maxcontacts is given by the class */ 1889498f954a4ec389806333041a1018909c6fe0518Benjamin Tissoires td->maxcontacts = td->mtclass->maxcontacts; 1899498f954a4ec389806333041a1018909c6fe0518Benjamin Tissoires 1909498f954a4ec389806333041a1018909c6fe0518Benjamin Tissoires break; 1915519cab477b61326963c8d523520db0342862b63Benjamin Tissoires } 1925519cab477b61326963c8d523520db0342862b63Benjamin Tissoires} 1935519cab477b61326963c8d523520db0342862b63Benjamin Tissoires 1945519cab477b61326963c8d523520db0342862b63Benjamin Tissoiresstatic void set_abs(struct input_dev *input, unsigned int code, 1955519cab477b61326963c8d523520db0342862b63Benjamin Tissoires struct hid_field *field, int snratio) 1965519cab477b61326963c8d523520db0342862b63Benjamin Tissoires{ 1975519cab477b61326963c8d523520db0342862b63Benjamin Tissoires int fmin = field->logical_minimum; 1985519cab477b61326963c8d523520db0342862b63Benjamin Tissoires int fmax = field->logical_maximum; 1995519cab477b61326963c8d523520db0342862b63Benjamin Tissoires int fuzz = snratio ? (fmax - fmin) / snratio : 0; 2005519cab477b61326963c8d523520db0342862b63Benjamin Tissoires input_set_abs_params(input, code, fmin, fmax, fuzz, 0); 2015519cab477b61326963c8d523520db0342862b63Benjamin Tissoires} 2025519cab477b61326963c8d523520db0342862b63Benjamin Tissoires 2035519cab477b61326963c8d523520db0342862b63Benjamin Tissoiresstatic int mt_input_mapping(struct hid_device *hdev, struct hid_input *hi, 2045519cab477b61326963c8d523520db0342862b63Benjamin Tissoires struct hid_field *field, struct hid_usage *usage, 2055519cab477b61326963c8d523520db0342862b63Benjamin Tissoires unsigned long **bit, int *max) 2065519cab477b61326963c8d523520db0342862b63Benjamin Tissoires{ 2075519cab477b61326963c8d523520db0342862b63Benjamin Tissoires struct mt_device *td = hid_get_drvdata(hdev); 2085519cab477b61326963c8d523520db0342862b63Benjamin Tissoires struct mt_class *cls = td->mtclass; 2094875ac114d8bce99838a9b0ee7c3f5469cc6352eRichard Nauber __s32 quirks = cls->quirks; 2104875ac114d8bce99838a9b0ee7c3f5469cc6352eRichard Nauber 2115519cab477b61326963c8d523520db0342862b63Benjamin Tissoires switch (usage->hid & HID_USAGE_PAGE) { 2125519cab477b61326963c8d523520db0342862b63Benjamin Tissoires 2135519cab477b61326963c8d523520db0342862b63Benjamin Tissoires case HID_UP_GENDESK: 2145519cab477b61326963c8d523520db0342862b63Benjamin Tissoires switch (usage->hid) { 2155519cab477b61326963c8d523520db0342862b63Benjamin Tissoires case HID_GD_X: 2164875ac114d8bce99838a9b0ee7c3f5469cc6352eRichard Nauber if (quirks & MT_QUIRK_EGALAX_XYZ_FIXUP) 2174875ac114d8bce99838a9b0ee7c3f5469cc6352eRichard Nauber field->logical_maximum = 32760; 2185519cab477b61326963c8d523520db0342862b63Benjamin Tissoires hid_map_usage(hi, usage, bit, max, 2195519cab477b61326963c8d523520db0342862b63Benjamin Tissoires EV_ABS, ABS_MT_POSITION_X); 2205519cab477b61326963c8d523520db0342862b63Benjamin Tissoires set_abs(hi->input, ABS_MT_POSITION_X, field, 2215519cab477b61326963c8d523520db0342862b63Benjamin Tissoires cls->sn_move); 2225519cab477b61326963c8d523520db0342862b63Benjamin Tissoires /* touchscreen emulation */ 2235519cab477b61326963c8d523520db0342862b63Benjamin Tissoires set_abs(hi->input, ABS_X, field, cls->sn_move); 2245519cab477b61326963c8d523520db0342862b63Benjamin Tissoires td->last_slot_field = usage->hid; 2252955caed8b9865c1f04fcde6bd7103d5d5ec9415Benjamin Tissoires td->last_field_index = field->index; 2265519cab477b61326963c8d523520db0342862b63Benjamin Tissoires return 1; 2275519cab477b61326963c8d523520db0342862b63Benjamin Tissoires case HID_GD_Y: 2284875ac114d8bce99838a9b0ee7c3f5469cc6352eRichard Nauber if (quirks & MT_QUIRK_EGALAX_XYZ_FIXUP) 2294875ac114d8bce99838a9b0ee7c3f5469cc6352eRichard Nauber field->logical_maximum = 32760; 2305519cab477b61326963c8d523520db0342862b63Benjamin Tissoires hid_map_usage(hi, usage, bit, max, 2315519cab477b61326963c8d523520db0342862b63Benjamin Tissoires EV_ABS, ABS_MT_POSITION_Y); 2325519cab477b61326963c8d523520db0342862b63Benjamin Tissoires set_abs(hi->input, ABS_MT_POSITION_Y, field, 2335519cab477b61326963c8d523520db0342862b63Benjamin Tissoires cls->sn_move); 2345519cab477b61326963c8d523520db0342862b63Benjamin Tissoires /* touchscreen emulation */ 2355519cab477b61326963c8d523520db0342862b63Benjamin Tissoires set_abs(hi->input, ABS_Y, field, cls->sn_move); 2365519cab477b61326963c8d523520db0342862b63Benjamin Tissoires td->last_slot_field = usage->hid; 2372955caed8b9865c1f04fcde6bd7103d5d5ec9415Benjamin Tissoires td->last_field_index = field->index; 2385519cab477b61326963c8d523520db0342862b63Benjamin Tissoires return 1; 2395519cab477b61326963c8d523520db0342862b63Benjamin Tissoires } 2405519cab477b61326963c8d523520db0342862b63Benjamin Tissoires return 0; 2415519cab477b61326963c8d523520db0342862b63Benjamin Tissoires 2425519cab477b61326963c8d523520db0342862b63Benjamin Tissoires case HID_UP_DIGITIZER: 2435519cab477b61326963c8d523520db0342862b63Benjamin Tissoires switch (usage->hid) { 2445519cab477b61326963c8d523520db0342862b63Benjamin Tissoires case HID_DG_INRANGE: 2455519cab477b61326963c8d523520db0342862b63Benjamin Tissoires td->last_slot_field = usage->hid; 2462955caed8b9865c1f04fcde6bd7103d5d5ec9415Benjamin Tissoires td->last_field_index = field->index; 2475519cab477b61326963c8d523520db0342862b63Benjamin Tissoires return 1; 2485519cab477b61326963c8d523520db0342862b63Benjamin Tissoires case HID_DG_CONFIDENCE: 2495519cab477b61326963c8d523520db0342862b63Benjamin Tissoires td->last_slot_field = usage->hid; 2502955caed8b9865c1f04fcde6bd7103d5d5ec9415Benjamin Tissoires td->last_field_index = field->index; 2515519cab477b61326963c8d523520db0342862b63Benjamin Tissoires return 1; 2525519cab477b61326963c8d523520db0342862b63Benjamin Tissoires case HID_DG_TIPSWITCH: 2535519cab477b61326963c8d523520db0342862b63Benjamin Tissoires hid_map_usage(hi, usage, bit, max, EV_KEY, BTN_TOUCH); 2545519cab477b61326963c8d523520db0342862b63Benjamin Tissoires input_set_capability(hi->input, EV_KEY, BTN_TOUCH); 2555519cab477b61326963c8d523520db0342862b63Benjamin Tissoires td->last_slot_field = usage->hid; 2562955caed8b9865c1f04fcde6bd7103d5d5ec9415Benjamin Tissoires td->last_field_index = field->index; 2575519cab477b61326963c8d523520db0342862b63Benjamin Tissoires return 1; 2585519cab477b61326963c8d523520db0342862b63Benjamin Tissoires case HID_DG_CONTACTID: 2599498f954a4ec389806333041a1018909c6fe0518Benjamin Tissoires input_mt_init_slots(hi->input, td->maxcontacts); 2605519cab477b61326963c8d523520db0342862b63Benjamin Tissoires td->last_slot_field = usage->hid; 2612955caed8b9865c1f04fcde6bd7103d5d5ec9415Benjamin Tissoires td->last_field_index = field->index; 2625519cab477b61326963c8d523520db0342862b63Benjamin Tissoires return 1; 2635519cab477b61326963c8d523520db0342862b63Benjamin Tissoires case HID_DG_WIDTH: 2645519cab477b61326963c8d523520db0342862b63Benjamin Tissoires hid_map_usage(hi, usage, bit, max, 2655519cab477b61326963c8d523520db0342862b63Benjamin Tissoires EV_ABS, ABS_MT_TOUCH_MAJOR); 266f786bba4499cf3de20da345ce090457ebcef03b0Benjamin Tissoires set_abs(hi->input, ABS_MT_TOUCH_MAJOR, field, 267f786bba4499cf3de20da345ce090457ebcef03b0Benjamin Tissoires cls->sn_width); 2685519cab477b61326963c8d523520db0342862b63Benjamin Tissoires td->last_slot_field = usage->hid; 2692955caed8b9865c1f04fcde6bd7103d5d5ec9415Benjamin Tissoires td->last_field_index = field->index; 2705519cab477b61326963c8d523520db0342862b63Benjamin Tissoires return 1; 2715519cab477b61326963c8d523520db0342862b63Benjamin Tissoires case HID_DG_HEIGHT: 2725519cab477b61326963c8d523520db0342862b63Benjamin Tissoires hid_map_usage(hi, usage, bit, max, 2735519cab477b61326963c8d523520db0342862b63Benjamin Tissoires EV_ABS, ABS_MT_TOUCH_MINOR); 274f786bba4499cf3de20da345ce090457ebcef03b0Benjamin Tissoires set_abs(hi->input, ABS_MT_TOUCH_MINOR, field, 275f786bba4499cf3de20da345ce090457ebcef03b0Benjamin Tissoires cls->sn_height); 2761e648a13720ef5de51f132501acf3e443d1a36d4Benjamin Tissoires input_set_abs_params(hi->input, 2771e648a13720ef5de51f132501acf3e443d1a36d4Benjamin Tissoires ABS_MT_ORIENTATION, 0, 1, 0, 0); 2785519cab477b61326963c8d523520db0342862b63Benjamin Tissoires td->last_slot_field = usage->hid; 2792955caed8b9865c1f04fcde6bd7103d5d5ec9415Benjamin Tissoires td->last_field_index = field->index; 2805519cab477b61326963c8d523520db0342862b63Benjamin Tissoires return 1; 2815519cab477b61326963c8d523520db0342862b63Benjamin Tissoires case HID_DG_TIPPRESSURE: 2824875ac114d8bce99838a9b0ee7c3f5469cc6352eRichard Nauber if (quirks & MT_QUIRK_EGALAX_XYZ_FIXUP) 2834875ac114d8bce99838a9b0ee7c3f5469cc6352eRichard Nauber field->logical_minimum = 0; 2845519cab477b61326963c8d523520db0342862b63Benjamin Tissoires hid_map_usage(hi, usage, bit, max, 2855519cab477b61326963c8d523520db0342862b63Benjamin Tissoires EV_ABS, ABS_MT_PRESSURE); 2865519cab477b61326963c8d523520db0342862b63Benjamin Tissoires set_abs(hi->input, ABS_MT_PRESSURE, field, 2875519cab477b61326963c8d523520db0342862b63Benjamin Tissoires cls->sn_pressure); 2885519cab477b61326963c8d523520db0342862b63Benjamin Tissoires /* touchscreen emulation */ 2895519cab477b61326963c8d523520db0342862b63Benjamin Tissoires set_abs(hi->input, ABS_PRESSURE, field, 2905519cab477b61326963c8d523520db0342862b63Benjamin Tissoires cls->sn_pressure); 2915519cab477b61326963c8d523520db0342862b63Benjamin Tissoires td->last_slot_field = usage->hid; 2922955caed8b9865c1f04fcde6bd7103d5d5ec9415Benjamin Tissoires td->last_field_index = field->index; 2935519cab477b61326963c8d523520db0342862b63Benjamin Tissoires return 1; 2945519cab477b61326963c8d523520db0342862b63Benjamin Tissoires case HID_DG_CONTACTCOUNT: 2952955caed8b9865c1f04fcde6bd7103d5d5ec9415Benjamin Tissoires td->last_field_index = field->index; 2965519cab477b61326963c8d523520db0342862b63Benjamin Tissoires return 1; 2975519cab477b61326963c8d523520db0342862b63Benjamin Tissoires case HID_DG_CONTACTMAX: 2985519cab477b61326963c8d523520db0342862b63Benjamin Tissoires /* we don't set td->last_slot_field as contactcount and 2995519cab477b61326963c8d523520db0342862b63Benjamin Tissoires * contact max are global to the report */ 3002955caed8b9865c1f04fcde6bd7103d5d5ec9415Benjamin Tissoires td->last_field_index = field->index; 3015519cab477b61326963c8d523520db0342862b63Benjamin Tissoires return -1; 3025519cab477b61326963c8d523520db0342862b63Benjamin Tissoires } 3035519cab477b61326963c8d523520db0342862b63Benjamin Tissoires /* let hid-input decide for the others */ 3045519cab477b61326963c8d523520db0342862b63Benjamin Tissoires return 0; 3055519cab477b61326963c8d523520db0342862b63Benjamin Tissoires 3065519cab477b61326963c8d523520db0342862b63Benjamin Tissoires case 0xff000000: 3075519cab477b61326963c8d523520db0342862b63Benjamin Tissoires /* we do not want to map these: no input-oriented meaning */ 3085519cab477b61326963c8d523520db0342862b63Benjamin Tissoires return -1; 3095519cab477b61326963c8d523520db0342862b63Benjamin Tissoires } 3105519cab477b61326963c8d523520db0342862b63Benjamin Tissoires 3115519cab477b61326963c8d523520db0342862b63Benjamin Tissoires return 0; 3125519cab477b61326963c8d523520db0342862b63Benjamin Tissoires} 3135519cab477b61326963c8d523520db0342862b63Benjamin Tissoires 3145519cab477b61326963c8d523520db0342862b63Benjamin Tissoiresstatic int mt_input_mapped(struct hid_device *hdev, struct hid_input *hi, 3155519cab477b61326963c8d523520db0342862b63Benjamin Tissoires struct hid_field *field, struct hid_usage *usage, 3165519cab477b61326963c8d523520db0342862b63Benjamin Tissoires unsigned long **bit, int *max) 3175519cab477b61326963c8d523520db0342862b63Benjamin Tissoires{ 3185519cab477b61326963c8d523520db0342862b63Benjamin Tissoires if (usage->type == EV_KEY || usage->type == EV_ABS) 3195519cab477b61326963c8d523520db0342862b63Benjamin Tissoires set_bit(usage->type, hi->input->evbit); 3205519cab477b61326963c8d523520db0342862b63Benjamin Tissoires 3215519cab477b61326963c8d523520db0342862b63Benjamin Tissoires return -1; 3225519cab477b61326963c8d523520db0342862b63Benjamin Tissoires} 3235519cab477b61326963c8d523520db0342862b63Benjamin Tissoires 3245519cab477b61326963c8d523520db0342862b63Benjamin Tissoiresstatic int mt_compute_slot(struct mt_device *td) 3255519cab477b61326963c8d523520db0342862b63Benjamin Tissoires{ 3262d93666e70662cfcf1927e1a858685f5b38d5d65Benjamin Tissoires __s32 quirks = td->mtclass->quirks; 3275519cab477b61326963c8d523520db0342862b63Benjamin Tissoires 3282d93666e70662cfcf1927e1a858685f5b38d5d65Benjamin Tissoires if (quirks & MT_QUIRK_SLOT_IS_CONTACTID) 3292d93666e70662cfcf1927e1a858685f5b38d5d65Benjamin Tissoires return td->curdata.contactid; 3305519cab477b61326963c8d523520db0342862b63Benjamin Tissoires 3312d93666e70662cfcf1927e1a858685f5b38d5d65Benjamin Tissoires if (quirks & MT_QUIRK_CYPRESS) 332a3b5e577d96bfccbc41ebf4df784e3a153072273Benjamin Tissoires return cypress_compute_slot(td); 333a3b5e577d96bfccbc41ebf4df784e3a153072273Benjamin Tissoires 3342d93666e70662cfcf1927e1a858685f5b38d5d65Benjamin Tissoires if (quirks & MT_QUIRK_SLOT_IS_CONTACTNUMBER) 3352d93666e70662cfcf1927e1a858685f5b38d5d65Benjamin Tissoires return td->num_received; 3365572da08a784621f2ab4fdc8dc65471261871795Benjamin Tissoires 3374a6ee685fbcba4a440cf86f41557752ba81e2ccfBenjamin Tissoires if (quirks & MT_QUIRK_SLOT_IS_CONTACTID_MINUS_ONE) 3384a6ee685fbcba4a440cf86f41557752ba81e2ccfBenjamin Tissoires return td->curdata.contactid - 1; 3394a6ee685fbcba4a440cf86f41557752ba81e2ccfBenjamin Tissoires 3405519cab477b61326963c8d523520db0342862b63Benjamin Tissoires return find_slot_from_contactid(td); 3415519cab477b61326963c8d523520db0342862b63Benjamin Tissoires} 3425519cab477b61326963c8d523520db0342862b63Benjamin Tissoires 3435519cab477b61326963c8d523520db0342862b63Benjamin Tissoires/* 3445519cab477b61326963c8d523520db0342862b63Benjamin Tissoires * this function is called when a whole contact has been processed, 3455519cab477b61326963c8d523520db0342862b63Benjamin Tissoires * so that it can assign it to a slot and store the data there 3465519cab477b61326963c8d523520db0342862b63Benjamin Tissoires */ 3475519cab477b61326963c8d523520db0342862b63Benjamin Tissoiresstatic void mt_complete_slot(struct mt_device *td) 3485519cab477b61326963c8d523520db0342862b63Benjamin Tissoires{ 3492d93666e70662cfcf1927e1a858685f5b38d5d65Benjamin Tissoires td->curdata.seen_in_this_frame = true; 3505519cab477b61326963c8d523520db0342862b63Benjamin Tissoires if (td->curvalid) { 3515519cab477b61326963c8d523520db0342862b63Benjamin Tissoires int slotnum = mt_compute_slot(td); 3525519cab477b61326963c8d523520db0342862b63Benjamin Tissoires 3539498f954a4ec389806333041a1018909c6fe0518Benjamin Tissoires if (slotnum >= 0 && slotnum < td->maxcontacts) 3542d93666e70662cfcf1927e1a858685f5b38d5d65Benjamin Tissoires td->slots[slotnum] = td->curdata; 3555519cab477b61326963c8d523520db0342862b63Benjamin Tissoires } 3565519cab477b61326963c8d523520db0342862b63Benjamin Tissoires td->num_received++; 3575519cab477b61326963c8d523520db0342862b63Benjamin Tissoires} 3585519cab477b61326963c8d523520db0342862b63Benjamin Tissoires 3595519cab477b61326963c8d523520db0342862b63Benjamin Tissoires 3605519cab477b61326963c8d523520db0342862b63Benjamin Tissoires/* 3615519cab477b61326963c8d523520db0342862b63Benjamin Tissoires * this function is called when a whole packet has been received and processed, 3625519cab477b61326963c8d523520db0342862b63Benjamin Tissoires * so that it can decide what to send to the input layer. 3635519cab477b61326963c8d523520db0342862b63Benjamin Tissoires */ 3645519cab477b61326963c8d523520db0342862b63Benjamin Tissoiresstatic void mt_emit_event(struct mt_device *td, struct input_dev *input) 3655519cab477b61326963c8d523520db0342862b63Benjamin Tissoires{ 3665519cab477b61326963c8d523520db0342862b63Benjamin Tissoires int i; 3675519cab477b61326963c8d523520db0342862b63Benjamin Tissoires 3689498f954a4ec389806333041a1018909c6fe0518Benjamin Tissoires for (i = 0; i < td->maxcontacts; ++i) { 3695519cab477b61326963c8d523520db0342862b63Benjamin Tissoires struct mt_slot *s = &(td->slots[i]); 3705519cab477b61326963c8d523520db0342862b63Benjamin Tissoires if ((td->mtclass->quirks & MT_QUIRK_NOT_SEEN_MEANS_UP) && 3715519cab477b61326963c8d523520db0342862b63Benjamin Tissoires !s->seen_in_this_frame) { 3725519cab477b61326963c8d523520db0342862b63Benjamin Tissoires s->touch_state = false; 3735519cab477b61326963c8d523520db0342862b63Benjamin Tissoires } 3745519cab477b61326963c8d523520db0342862b63Benjamin Tissoires 3755519cab477b61326963c8d523520db0342862b63Benjamin Tissoires input_mt_slot(input, i); 3765519cab477b61326963c8d523520db0342862b63Benjamin Tissoires input_mt_report_slot_state(input, MT_TOOL_FINGER, 3775519cab477b61326963c8d523520db0342862b63Benjamin Tissoires s->touch_state); 3782d93666e70662cfcf1927e1a858685f5b38d5d65Benjamin Tissoires if (s->touch_state) { 379f786bba4499cf3de20da345ce090457ebcef03b0Benjamin Tissoires /* this finger is on the screen */ 380f786bba4499cf3de20da345ce090457ebcef03b0Benjamin Tissoires int wide = (s->w > s->h); 381f786bba4499cf3de20da345ce090457ebcef03b0Benjamin Tissoires /* divided by two to match visual scale of touch */ 382f786bba4499cf3de20da345ce090457ebcef03b0Benjamin Tissoires int major = max(s->w, s->h) >> 1; 383f786bba4499cf3de20da345ce090457ebcef03b0Benjamin Tissoires int minor = min(s->w, s->h) >> 1; 384f786bba4499cf3de20da345ce090457ebcef03b0Benjamin Tissoires 3852d93666e70662cfcf1927e1a858685f5b38d5d65Benjamin Tissoires input_event(input, EV_ABS, ABS_MT_POSITION_X, s->x); 3862d93666e70662cfcf1927e1a858685f5b38d5d65Benjamin Tissoires input_event(input, EV_ABS, ABS_MT_POSITION_Y, s->y); 387f786bba4499cf3de20da345ce090457ebcef03b0Benjamin Tissoires input_event(input, EV_ABS, ABS_MT_ORIENTATION, wide); 3882d93666e70662cfcf1927e1a858685f5b38d5d65Benjamin Tissoires input_event(input, EV_ABS, ABS_MT_PRESSURE, s->p); 389f786bba4499cf3de20da345ce090457ebcef03b0Benjamin Tissoires input_event(input, EV_ABS, ABS_MT_TOUCH_MAJOR, major); 390f786bba4499cf3de20da345ce090457ebcef03b0Benjamin Tissoires input_event(input, EV_ABS, ABS_MT_TOUCH_MINOR, minor); 3912d93666e70662cfcf1927e1a858685f5b38d5d65Benjamin Tissoires } 3925519cab477b61326963c8d523520db0342862b63Benjamin Tissoires s->seen_in_this_frame = false; 3935519cab477b61326963c8d523520db0342862b63Benjamin Tissoires 3945519cab477b61326963c8d523520db0342862b63Benjamin Tissoires } 3955519cab477b61326963c8d523520db0342862b63Benjamin Tissoires 3965519cab477b61326963c8d523520db0342862b63Benjamin Tissoires input_mt_report_pointer_emulation(input, true); 3975519cab477b61326963c8d523520db0342862b63Benjamin Tissoires input_sync(input); 3985519cab477b61326963c8d523520db0342862b63Benjamin Tissoires td->num_received = 0; 3995519cab477b61326963c8d523520db0342862b63Benjamin Tissoires} 4005519cab477b61326963c8d523520db0342862b63Benjamin Tissoires 4015519cab477b61326963c8d523520db0342862b63Benjamin Tissoires 4025519cab477b61326963c8d523520db0342862b63Benjamin Tissoires 4035519cab477b61326963c8d523520db0342862b63Benjamin Tissoiresstatic int mt_event(struct hid_device *hid, struct hid_field *field, 4045519cab477b61326963c8d523520db0342862b63Benjamin Tissoires struct hid_usage *usage, __s32 value) 4055519cab477b61326963c8d523520db0342862b63Benjamin Tissoires{ 4065519cab477b61326963c8d523520db0342862b63Benjamin Tissoires struct mt_device *td = hid_get_drvdata(hid); 4072d93666e70662cfcf1927e1a858685f5b38d5d65Benjamin Tissoires __s32 quirks = td->mtclass->quirks; 4085519cab477b61326963c8d523520db0342862b63Benjamin Tissoires 4099498f954a4ec389806333041a1018909c6fe0518Benjamin Tissoires if (hid->claimed & HID_CLAIMED_INPUT && td->slots) { 4105519cab477b61326963c8d523520db0342862b63Benjamin Tissoires switch (usage->hid) { 4115519cab477b61326963c8d523520db0342862b63Benjamin Tissoires case HID_DG_INRANGE: 4122d93666e70662cfcf1927e1a858685f5b38d5d65Benjamin Tissoires if (quirks & MT_QUIRK_VALID_IS_INRANGE) 4132d93666e70662cfcf1927e1a858685f5b38d5d65Benjamin Tissoires td->curvalid = value; 4145519cab477b61326963c8d523520db0342862b63Benjamin Tissoires break; 4155519cab477b61326963c8d523520db0342862b63Benjamin Tissoires case HID_DG_TIPSWITCH: 4162d93666e70662cfcf1927e1a858685f5b38d5d65Benjamin Tissoires if (quirks & MT_QUIRK_NOT_SEEN_MEANS_UP) 4172d93666e70662cfcf1927e1a858685f5b38d5d65Benjamin Tissoires td->curvalid = value; 4185519cab477b61326963c8d523520db0342862b63Benjamin Tissoires td->curdata.touch_state = value; 4195519cab477b61326963c8d523520db0342862b63Benjamin Tissoires break; 4205519cab477b61326963c8d523520db0342862b63Benjamin Tissoires case HID_DG_CONFIDENCE: 4212d93666e70662cfcf1927e1a858685f5b38d5d65Benjamin Tissoires if (quirks & MT_QUIRK_VALID_IS_CONFIDENCE) 4222d93666e70662cfcf1927e1a858685f5b38d5d65Benjamin Tissoires td->curvalid = value; 4235519cab477b61326963c8d523520db0342862b63Benjamin Tissoires break; 4245519cab477b61326963c8d523520db0342862b63Benjamin Tissoires case HID_DG_CONTACTID: 4255519cab477b61326963c8d523520db0342862b63Benjamin Tissoires td->curdata.contactid = value; 4265519cab477b61326963c8d523520db0342862b63Benjamin Tissoires break; 4275519cab477b61326963c8d523520db0342862b63Benjamin Tissoires case HID_DG_TIPPRESSURE: 4285519cab477b61326963c8d523520db0342862b63Benjamin Tissoires td->curdata.p = value; 4295519cab477b61326963c8d523520db0342862b63Benjamin Tissoires break; 4305519cab477b61326963c8d523520db0342862b63Benjamin Tissoires case HID_GD_X: 4315519cab477b61326963c8d523520db0342862b63Benjamin Tissoires td->curdata.x = value; 4325519cab477b61326963c8d523520db0342862b63Benjamin Tissoires break; 4335519cab477b61326963c8d523520db0342862b63Benjamin Tissoires case HID_GD_Y: 4345519cab477b61326963c8d523520db0342862b63Benjamin Tissoires td->curdata.y = value; 4355519cab477b61326963c8d523520db0342862b63Benjamin Tissoires break; 4365519cab477b61326963c8d523520db0342862b63Benjamin Tissoires case HID_DG_WIDTH: 4375519cab477b61326963c8d523520db0342862b63Benjamin Tissoires td->curdata.w = value; 4385519cab477b61326963c8d523520db0342862b63Benjamin Tissoires break; 4395519cab477b61326963c8d523520db0342862b63Benjamin Tissoires case HID_DG_HEIGHT: 4405519cab477b61326963c8d523520db0342862b63Benjamin Tissoires td->curdata.h = value; 4415519cab477b61326963c8d523520db0342862b63Benjamin Tissoires break; 4425519cab477b61326963c8d523520db0342862b63Benjamin Tissoires case HID_DG_CONTACTCOUNT: 4435519cab477b61326963c8d523520db0342862b63Benjamin Tissoires /* 4442d93666e70662cfcf1927e1a858685f5b38d5d65Benjamin Tissoires * Includes multi-packet support where subsequent 4452d93666e70662cfcf1927e1a858685f5b38d5d65Benjamin Tissoires * packets are sent with zero contactcount. 4465519cab477b61326963c8d523520db0342862b63Benjamin Tissoires */ 4475519cab477b61326963c8d523520db0342862b63Benjamin Tissoires if (value) 4482d93666e70662cfcf1927e1a858685f5b38d5d65Benjamin Tissoires td->num_expected = value; 4495519cab477b61326963c8d523520db0342862b63Benjamin Tissoires break; 4505519cab477b61326963c8d523520db0342862b63Benjamin Tissoires 4515519cab477b61326963c8d523520db0342862b63Benjamin Tissoires default: 4525519cab477b61326963c8d523520db0342862b63Benjamin Tissoires /* fallback to the generic hidinput handling */ 4535519cab477b61326963c8d523520db0342862b63Benjamin Tissoires return 0; 4545519cab477b61326963c8d523520db0342862b63Benjamin Tissoires } 4555519cab477b61326963c8d523520db0342862b63Benjamin Tissoires 456f153fc3990d4ad2709a52d7150e2c04363afb1fbHenrik Rydberg if (usage->hid == td->last_slot_field) { 4572d93666e70662cfcf1927e1a858685f5b38d5d65Benjamin Tissoires mt_complete_slot(td); 458f153fc3990d4ad2709a52d7150e2c04363afb1fbHenrik Rydberg } 4592d93666e70662cfcf1927e1a858685f5b38d5d65Benjamin Tissoires 4602d93666e70662cfcf1927e1a858685f5b38d5d65Benjamin Tissoires if (field->index == td->last_field_index 4612d93666e70662cfcf1927e1a858685f5b38d5d65Benjamin Tissoires && td->num_received >= td->num_expected) 4622d93666e70662cfcf1927e1a858685f5b38d5d65Benjamin Tissoires mt_emit_event(td, field->hidinput->input); 4635519cab477b61326963c8d523520db0342862b63Benjamin Tissoires 4642d93666e70662cfcf1927e1a858685f5b38d5d65Benjamin Tissoires } 4655519cab477b61326963c8d523520db0342862b63Benjamin Tissoires 4665519cab477b61326963c8d523520db0342862b63Benjamin Tissoires /* we have handled the hidinput part, now remains hiddev */ 4675519cab477b61326963c8d523520db0342862b63Benjamin Tissoires if (hid->claimed & HID_CLAIMED_HIDDEV && hid->hiddev_hid_event) 4685519cab477b61326963c8d523520db0342862b63Benjamin Tissoires hid->hiddev_hid_event(hid, field, usage, value); 4695519cab477b61326963c8d523520db0342862b63Benjamin Tissoires 4705519cab477b61326963c8d523520db0342862b63Benjamin Tissoires return 1; 4715519cab477b61326963c8d523520db0342862b63Benjamin Tissoires} 4725519cab477b61326963c8d523520db0342862b63Benjamin Tissoires 4735519cab477b61326963c8d523520db0342862b63Benjamin Tissoiresstatic void mt_set_input_mode(struct hid_device *hdev) 4745519cab477b61326963c8d523520db0342862b63Benjamin Tissoires{ 4755519cab477b61326963c8d523520db0342862b63Benjamin Tissoires struct mt_device *td = hid_get_drvdata(hdev); 4765519cab477b61326963c8d523520db0342862b63Benjamin Tissoires struct hid_report *r; 4775519cab477b61326963c8d523520db0342862b63Benjamin Tissoires struct hid_report_enum *re; 4785519cab477b61326963c8d523520db0342862b63Benjamin Tissoires 4795519cab477b61326963c8d523520db0342862b63Benjamin Tissoires if (td->inputmode < 0) 4805519cab477b61326963c8d523520db0342862b63Benjamin Tissoires return; 4815519cab477b61326963c8d523520db0342862b63Benjamin Tissoires 4825519cab477b61326963c8d523520db0342862b63Benjamin Tissoires re = &(hdev->report_enum[HID_FEATURE_REPORT]); 4835519cab477b61326963c8d523520db0342862b63Benjamin Tissoires r = re->report_id_hash[td->inputmode]; 4845519cab477b61326963c8d523520db0342862b63Benjamin Tissoires if (r) { 4855519cab477b61326963c8d523520db0342862b63Benjamin Tissoires r->field[0]->value[0] = 0x02; 4865519cab477b61326963c8d523520db0342862b63Benjamin Tissoires usbhid_submit_report(hdev, r, USB_DIR_OUT); 4875519cab477b61326963c8d523520db0342862b63Benjamin Tissoires } 4885519cab477b61326963c8d523520db0342862b63Benjamin Tissoires} 4895519cab477b61326963c8d523520db0342862b63Benjamin Tissoires 4905519cab477b61326963c8d523520db0342862b63Benjamin Tissoiresstatic int mt_probe(struct hid_device *hdev, const struct hid_device_id *id) 4915519cab477b61326963c8d523520db0342862b63Benjamin Tissoires{ 4922d93666e70662cfcf1927e1a858685f5b38d5d65Benjamin Tissoires int ret, i; 4935519cab477b61326963c8d523520db0342862b63Benjamin Tissoires struct mt_device *td; 4942d93666e70662cfcf1927e1a858685f5b38d5d65Benjamin Tissoires struct mt_class *mtclass = mt_classes; /* MT_CLS_DEFAULT */ 4952d93666e70662cfcf1927e1a858685f5b38d5d65Benjamin Tissoires 4962d93666e70662cfcf1927e1a858685f5b38d5d65Benjamin Tissoires for (i = 0; mt_classes[i].name ; i++) { 4972d93666e70662cfcf1927e1a858685f5b38d5d65Benjamin Tissoires if (id->driver_data == mt_classes[i].name) { 4982d93666e70662cfcf1927e1a858685f5b38d5d65Benjamin Tissoires mtclass = &(mt_classes[i]); 4992d93666e70662cfcf1927e1a858685f5b38d5d65Benjamin Tissoires break; 5002d93666e70662cfcf1927e1a858685f5b38d5d65Benjamin Tissoires } 5012d93666e70662cfcf1927e1a858685f5b38d5d65Benjamin Tissoires } 5025519cab477b61326963c8d523520db0342862b63Benjamin Tissoires 5035519cab477b61326963c8d523520db0342862b63Benjamin Tissoires /* This allows the driver to correctly support devices 5045519cab477b61326963c8d523520db0342862b63Benjamin Tissoires * that emit events over several HID messages. 5055519cab477b61326963c8d523520db0342862b63Benjamin Tissoires */ 5065519cab477b61326963c8d523520db0342862b63Benjamin Tissoires hdev->quirks |= HID_QUIRK_NO_INPUT_SYNC; 5075519cab477b61326963c8d523520db0342862b63Benjamin Tissoires 5089498f954a4ec389806333041a1018909c6fe0518Benjamin Tissoires td = kzalloc(sizeof(struct mt_device), GFP_KERNEL); 5095519cab477b61326963c8d523520db0342862b63Benjamin Tissoires if (!td) { 5105519cab477b61326963c8d523520db0342862b63Benjamin Tissoires dev_err(&hdev->dev, "cannot allocate multitouch data\n"); 5115519cab477b61326963c8d523520db0342862b63Benjamin Tissoires return -ENOMEM; 5125519cab477b61326963c8d523520db0342862b63Benjamin Tissoires } 5135519cab477b61326963c8d523520db0342862b63Benjamin Tissoires td->mtclass = mtclass; 5145519cab477b61326963c8d523520db0342862b63Benjamin Tissoires td->inputmode = -1; 5155519cab477b61326963c8d523520db0342862b63Benjamin Tissoires hid_set_drvdata(hdev, td); 5165519cab477b61326963c8d523520db0342862b63Benjamin Tissoires 5175519cab477b61326963c8d523520db0342862b63Benjamin Tissoires ret = hid_parse(hdev); 5185519cab477b61326963c8d523520db0342862b63Benjamin Tissoires if (ret != 0) 5195519cab477b61326963c8d523520db0342862b63Benjamin Tissoires goto fail; 5205519cab477b61326963c8d523520db0342862b63Benjamin Tissoires 5215519cab477b61326963c8d523520db0342862b63Benjamin Tissoires ret = hid_hw_start(hdev, HID_CONNECT_DEFAULT); 5222d93666e70662cfcf1927e1a858685f5b38d5d65Benjamin Tissoires if (ret) 5235519cab477b61326963c8d523520db0342862b63Benjamin Tissoires goto fail; 5245519cab477b61326963c8d523520db0342862b63Benjamin Tissoires 5259498f954a4ec389806333041a1018909c6fe0518Benjamin Tissoires if (!td->maxcontacts) 5269498f954a4ec389806333041a1018909c6fe0518Benjamin Tissoires td->maxcontacts = MT_DEFAULT_MAXCONTACT; 5279498f954a4ec389806333041a1018909c6fe0518Benjamin Tissoires 5289498f954a4ec389806333041a1018909c6fe0518Benjamin Tissoires td->slots = kzalloc(td->maxcontacts * sizeof(struct mt_slot), 5299498f954a4ec389806333041a1018909c6fe0518Benjamin Tissoires GFP_KERNEL); 5309498f954a4ec389806333041a1018909c6fe0518Benjamin Tissoires if (!td->slots) { 5319498f954a4ec389806333041a1018909c6fe0518Benjamin Tissoires dev_err(&hdev->dev, "cannot allocate multitouch slots\n"); 5329498f954a4ec389806333041a1018909c6fe0518Benjamin Tissoires hid_hw_stop(hdev); 5339498f954a4ec389806333041a1018909c6fe0518Benjamin Tissoires ret = -ENOMEM; 5349498f954a4ec389806333041a1018909c6fe0518Benjamin Tissoires goto fail; 5359498f954a4ec389806333041a1018909c6fe0518Benjamin Tissoires } 5369498f954a4ec389806333041a1018909c6fe0518Benjamin Tissoires 5375519cab477b61326963c8d523520db0342862b63Benjamin Tissoires mt_set_input_mode(hdev); 5385519cab477b61326963c8d523520db0342862b63Benjamin Tissoires 5395519cab477b61326963c8d523520db0342862b63Benjamin Tissoires return 0; 5405519cab477b61326963c8d523520db0342862b63Benjamin Tissoires 5415519cab477b61326963c8d523520db0342862b63Benjamin Tissoiresfail: 5425519cab477b61326963c8d523520db0342862b63Benjamin Tissoires kfree(td); 5435519cab477b61326963c8d523520db0342862b63Benjamin Tissoires return ret; 5445519cab477b61326963c8d523520db0342862b63Benjamin Tissoires} 5455519cab477b61326963c8d523520db0342862b63Benjamin Tissoires 5465519cab477b61326963c8d523520db0342862b63Benjamin Tissoires#ifdef CONFIG_PM 5475519cab477b61326963c8d523520db0342862b63Benjamin Tissoiresstatic int mt_reset_resume(struct hid_device *hdev) 5485519cab477b61326963c8d523520db0342862b63Benjamin Tissoires{ 5495519cab477b61326963c8d523520db0342862b63Benjamin Tissoires mt_set_input_mode(hdev); 5505519cab477b61326963c8d523520db0342862b63Benjamin Tissoires return 0; 5515519cab477b61326963c8d523520db0342862b63Benjamin Tissoires} 5525519cab477b61326963c8d523520db0342862b63Benjamin Tissoires#endif 5535519cab477b61326963c8d523520db0342862b63Benjamin Tissoires 5545519cab477b61326963c8d523520db0342862b63Benjamin Tissoiresstatic void mt_remove(struct hid_device *hdev) 5555519cab477b61326963c8d523520db0342862b63Benjamin Tissoires{ 5565519cab477b61326963c8d523520db0342862b63Benjamin Tissoires struct mt_device *td = hid_get_drvdata(hdev); 5575519cab477b61326963c8d523520db0342862b63Benjamin Tissoires hid_hw_stop(hdev); 5589498f954a4ec389806333041a1018909c6fe0518Benjamin Tissoires kfree(td->slots); 5595519cab477b61326963c8d523520db0342862b63Benjamin Tissoires kfree(td); 5605519cab477b61326963c8d523520db0342862b63Benjamin Tissoires hid_set_drvdata(hdev, NULL); 5615519cab477b61326963c8d523520db0342862b63Benjamin Tissoires} 5625519cab477b61326963c8d523520db0342862b63Benjamin Tissoires 5635519cab477b61326963c8d523520db0342862b63Benjamin Tissoiresstatic const struct hid_device_id mt_devices[] = { 5645519cab477b61326963c8d523520db0342862b63Benjamin Tissoires 565f786bba4499cf3de20da345ce090457ebcef03b0Benjamin Tissoires /* 3M panels */ 566f786bba4499cf3de20da345ce090457ebcef03b0Benjamin Tissoires { .driver_data = MT_CLS_3M, 567f786bba4499cf3de20da345ce090457ebcef03b0Benjamin Tissoires HID_USB_DEVICE(USB_VENDOR_ID_3M, 568f786bba4499cf3de20da345ce090457ebcef03b0Benjamin Tissoires USB_DEVICE_ID_3M1968) }, 569f786bba4499cf3de20da345ce090457ebcef03b0Benjamin Tissoires { .driver_data = MT_CLS_3M, 570f786bba4499cf3de20da345ce090457ebcef03b0Benjamin Tissoires HID_USB_DEVICE(USB_VENDOR_ID_3M, 571f786bba4499cf3de20da345ce090457ebcef03b0Benjamin Tissoires USB_DEVICE_ID_3M2256) }, 572f786bba4499cf3de20da345ce090457ebcef03b0Benjamin Tissoires 573e6aac3427ef03f61e7478514d0648b58359d05d1Benjamin Tissoires /* ActionStar panels */ 574e6aac3427ef03f61e7478514d0648b58359d05d1Benjamin Tissoires { .driver_data = MT_CLS_DEFAULT, 575e6aac3427ef03f61e7478514d0648b58359d05d1Benjamin Tissoires HID_USB_DEVICE(USB_VENDOR_ID_ACTIONSTAR, 576e6aac3427ef03f61e7478514d0648b58359d05d1Benjamin Tissoires USB_DEVICE_ID_ACTIONSTAR_1011) }, 577e6aac3427ef03f61e7478514d0648b58359d05d1Benjamin Tissoires 578a841b62c5d5f75ce3676fde755696d30cc8de99aBenjamin Tissoires /* Cando panels */ 579a841b62c5d5f75ce3676fde755696d30cc8de99aBenjamin Tissoires { .driver_data = MT_CLS_DUAL_INRANGE_CONTACTNUMBER, 580a841b62c5d5f75ce3676fde755696d30cc8de99aBenjamin Tissoires HID_USB_DEVICE(USB_VENDOR_ID_CANDO, 581a841b62c5d5f75ce3676fde755696d30cc8de99aBenjamin Tissoires USB_DEVICE_ID_CANDO_MULTI_TOUCH) }, 582a841b62c5d5f75ce3676fde755696d30cc8de99aBenjamin Tissoires { .driver_data = MT_CLS_DUAL_INRANGE_CONTACTNUMBER, 583a841b62c5d5f75ce3676fde755696d30cc8de99aBenjamin Tissoires HID_USB_DEVICE(USB_VENDOR_ID_CANDO, 584a841b62c5d5f75ce3676fde755696d30cc8de99aBenjamin Tissoires USB_DEVICE_ID_CANDO_MULTI_TOUCH_10_1) }, 585a841b62c5d5f75ce3676fde755696d30cc8de99aBenjamin Tissoires { .driver_data = MT_CLS_DUAL_INRANGE_CONTACTNUMBER, 586a841b62c5d5f75ce3676fde755696d30cc8de99aBenjamin Tissoires HID_USB_DEVICE(USB_VENDOR_ID_CANDO, 587a841b62c5d5f75ce3676fde755696d30cc8de99aBenjamin Tissoires USB_DEVICE_ID_CANDO_MULTI_TOUCH_11_6) }, 588a841b62c5d5f75ce3676fde755696d30cc8de99aBenjamin Tissoires { .driver_data = MT_CLS_DUAL_INRANGE_CONTACTNUMBER, 589a841b62c5d5f75ce3676fde755696d30cc8de99aBenjamin Tissoires HID_USB_DEVICE(USB_VENDOR_ID_CANDO, 590a841b62c5d5f75ce3676fde755696d30cc8de99aBenjamin Tissoires USB_DEVICE_ID_CANDO_MULTI_TOUCH_15_6) }, 591a841b62c5d5f75ce3676fde755696d30cc8de99aBenjamin Tissoires 592a3b5e577d96bfccbc41ebf4df784e3a153072273Benjamin Tissoires /* Cypress panel */ 593a3b5e577d96bfccbc41ebf4df784e3a153072273Benjamin Tissoires { .driver_data = MT_CLS_CYPRESS, 594a3b5e577d96bfccbc41ebf4df784e3a153072273Benjamin Tissoires HID_USB_DEVICE(USB_VENDOR_ID_CYPRESS, 595a3b5e577d96bfccbc41ebf4df784e3a153072273Benjamin Tissoires USB_DEVICE_ID_CYPRESS_TRUETOUCH) }, 596a3b5e577d96bfccbc41ebf4df784e3a153072273Benjamin Tissoires 597c04abeeff9d76a703cac1e6d312853b0fc8136f5Benjamin Tissoires /* Elo TouchSystems IntelliTouch Plus panel */ 598c04abeeff9d76a703cac1e6d312853b0fc8136f5Benjamin Tissoires { .driver_data = MT_CLS_DUAL_NSMU_CONTACTID, 599c04abeeff9d76a703cac1e6d312853b0fc8136f5Benjamin Tissoires HID_USB_DEVICE(USB_VENDOR_ID_ELO, 600c04abeeff9d76a703cac1e6d312853b0fc8136f5Benjamin Tissoires USB_DEVICE_ID_ELO_TS2515) }, 601c04abeeff9d76a703cac1e6d312853b0fc8136f5Benjamin Tissoires 6025572da08a784621f2ab4fdc8dc65471261871795Benjamin Tissoires /* GeneralTouch panel */ 6031e9cf35b995610e7ba2934d3dc92e3a03fa361a1Benjamin Tissoires { .driver_data = MT_CLS_DUAL_INRANGE_CONTACTNUMBER, 6045572da08a784621f2ab4fdc8dc65471261871795Benjamin Tissoires HID_USB_DEVICE(USB_VENDOR_ID_GENERAL_TOUCH, 6055572da08a784621f2ab4fdc8dc65471261871795Benjamin Tissoires USB_DEVICE_ID_GENERAL_TOUCH_WIN7_TWOFINGERS) }, 6065572da08a784621f2ab4fdc8dc65471261871795Benjamin Tissoires 6074e61f0d75aa86c9e59451f6bcffcdceb355b4fc4Austin Zhang /* Ilitek dual touch panel */ 6084e61f0d75aa86c9e59451f6bcffcdceb355b4fc4Austin Zhang { .driver_data = MT_CLS_DEFAULT, 6094e61f0d75aa86c9e59451f6bcffcdceb355b4fc4Austin Zhang HID_USB_DEVICE(USB_VENDOR_ID_ILITEK, 6104e61f0d75aa86c9e59451f6bcffcdceb355b4fc4Austin Zhang USB_DEVICE_ID_ILITEK_MULTITOUCH) }, 6114e61f0d75aa86c9e59451f6bcffcdceb355b4fc4Austin Zhang 6124dfcced8a1f42248f9e7a461485f6aa5f66d2105Benjamin Tissoires /* IRTOUCH panels */ 6134dfcced8a1f42248f9e7a461485f6aa5f66d2105Benjamin Tissoires { .driver_data = MT_CLS_DUAL_INRANGE_CONTACTID, 6144dfcced8a1f42248f9e7a461485f6aa5f66d2105Benjamin Tissoires HID_USB_DEVICE(USB_VENDOR_ID_IRTOUCHSYSTEMS, 6154dfcced8a1f42248f9e7a461485f6aa5f66d2105Benjamin Tissoires USB_DEVICE_ID_IRTOUCH_INFRARED_USB) }, 6164dfcced8a1f42248f9e7a461485f6aa5f66d2105Benjamin Tissoires 617df167c4a0d68a9dbde044a39a77f255ac666f93eBenjamin Tissoires /* Lumio panels */ 618df167c4a0d68a9dbde044a39a77f255ac666f93eBenjamin Tissoires { .driver_data = MT_CLS_CONFIDENCE_MINUS_ONE, 619df167c4a0d68a9dbde044a39a77f255ac666f93eBenjamin Tissoires HID_USB_DEVICE(USB_VENDOR_ID_LUMIO, 620df167c4a0d68a9dbde044a39a77f255ac666f93eBenjamin Tissoires USB_DEVICE_ID_CRYSTALTOUCH) }, 621df167c4a0d68a9dbde044a39a77f255ac666f93eBenjamin Tissoires 6224a6ee685fbcba4a440cf86f41557752ba81e2ccfBenjamin Tissoires /* MosArt panels */ 6234a6ee685fbcba4a440cf86f41557752ba81e2ccfBenjamin Tissoires { .driver_data = MT_CLS_CONFIDENCE_MINUS_ONE, 6244a6ee685fbcba4a440cf86f41557752ba81e2ccfBenjamin Tissoires HID_USB_DEVICE(USB_VENDOR_ID_ASUS, 6254a6ee685fbcba4a440cf86f41557752ba81e2ccfBenjamin Tissoires USB_DEVICE_ID_ASUS_T91MT)}, 6264a6ee685fbcba4a440cf86f41557752ba81e2ccfBenjamin Tissoires { .driver_data = MT_CLS_CONFIDENCE_MINUS_ONE, 6274a6ee685fbcba4a440cf86f41557752ba81e2ccfBenjamin Tissoires HID_USB_DEVICE(USB_VENDOR_ID_ASUS, 6284a6ee685fbcba4a440cf86f41557752ba81e2ccfBenjamin Tissoires USB_DEVICE_ID_ASUSTEK_MULTITOUCH_YFO) }, 6294a6ee685fbcba4a440cf86f41557752ba81e2ccfBenjamin Tissoires { .driver_data = MT_CLS_CONFIDENCE_MINUS_ONE, 6304a6ee685fbcba4a440cf86f41557752ba81e2ccfBenjamin Tissoires HID_USB_DEVICE(USB_VENDOR_ID_TURBOX, 6314a6ee685fbcba4a440cf86f41557752ba81e2ccfBenjamin Tissoires USB_DEVICE_ID_TURBOX_TOUCHSCREEN_MOSART) }, 6324a6ee685fbcba4a440cf86f41557752ba81e2ccfBenjamin Tissoires 6336ab3a9a63fc16b04f7de48eb0190d516dd7574dfJohn Sung /* PenMount panels */ 6346ab3a9a63fc16b04f7de48eb0190d516dd7574dfJohn Sung { .driver_data = MT_CLS_CONFIDENCE, 6356ab3a9a63fc16b04f7de48eb0190d516dd7574dfJohn Sung HID_USB_DEVICE(USB_VENDOR_ID_PENMOUNT, 6366ab3a9a63fc16b04f7de48eb0190d516dd7574dfJohn Sung USB_DEVICE_ID_PENMOUNT_PCI) }, 6376ab3a9a63fc16b04f7de48eb0190d516dd7574dfJohn Sung 6385519cab477b61326963c8d523520db0342862b63Benjamin Tissoires /* PixCir-based panels */ 6391e9cf35b995610e7ba2934d3dc92e3a03fa361a1Benjamin Tissoires { .driver_data = MT_CLS_DUAL_INRANGE_CONTACTID, 6405519cab477b61326963c8d523520db0342862b63Benjamin Tissoires HID_USB_DEVICE(USB_VENDOR_ID_HANVON, 6415519cab477b61326963c8d523520db0342862b63Benjamin Tissoires USB_DEVICE_ID_HANVON_MULTITOUCH) }, 6421e9cf35b995610e7ba2934d3dc92e3a03fa361a1Benjamin Tissoires { .driver_data = MT_CLS_DUAL_INRANGE_CONTACTID, 6435519cab477b61326963c8d523520db0342862b63Benjamin Tissoires HID_USB_DEVICE(USB_VENDOR_ID_CANDO, 6445519cab477b61326963c8d523520db0342862b63Benjamin Tissoires USB_DEVICE_ID_CANDO_PIXCIR_MULTI_TOUCH) }, 6455519cab477b61326963c8d523520db0342862b63Benjamin Tissoires 6464875ac114d8bce99838a9b0ee7c3f5469cc6352eRichard Nauber /* Resistive eGalax devices */ 6474875ac114d8bce99838a9b0ee7c3f5469cc6352eRichard Nauber { .driver_data = MT_CLS_EGALAX, 6484875ac114d8bce99838a9b0ee7c3f5469cc6352eRichard Nauber HID_USB_DEVICE(USB_VENDOR_ID_DWAV, 6494875ac114d8bce99838a9b0ee7c3f5469cc6352eRichard Nauber USB_DEVICE_ID_DWAV_EGALAX_MULTITOUCH) }, 6504875ac114d8bce99838a9b0ee7c3f5469cc6352eRichard Nauber { .driver_data = MT_CLS_EGALAX, 6514875ac114d8bce99838a9b0ee7c3f5469cc6352eRichard Nauber HID_USB_DEVICE(USB_VENDOR_ID_DWAV, 6524875ac114d8bce99838a9b0ee7c3f5469cc6352eRichard Nauber USB_DEVICE_ID_DWAV_EGALAX_MULTITOUCH3) }, 6534875ac114d8bce99838a9b0ee7c3f5469cc6352eRichard Nauber 6544875ac114d8bce99838a9b0ee7c3f5469cc6352eRichard Nauber /* Capacitive eGalax devices */ 6554875ac114d8bce99838a9b0ee7c3f5469cc6352eRichard Nauber { .driver_data = MT_CLS_EGALAX, 6564875ac114d8bce99838a9b0ee7c3f5469cc6352eRichard Nauber HID_USB_DEVICE(USB_VENDOR_ID_DWAV, 6574875ac114d8bce99838a9b0ee7c3f5469cc6352eRichard Nauber USB_DEVICE_ID_DWAV_EGALAX_MULTITOUCH1) }, 6584875ac114d8bce99838a9b0ee7c3f5469cc6352eRichard Nauber { .driver_data = MT_CLS_EGALAX, 6594875ac114d8bce99838a9b0ee7c3f5469cc6352eRichard Nauber HID_USB_DEVICE(USB_VENDOR_ID_DWAV, 6604875ac114d8bce99838a9b0ee7c3f5469cc6352eRichard Nauber USB_DEVICE_ID_DWAV_EGALAX_MULTITOUCH2) }, 6614875ac114d8bce99838a9b0ee7c3f5469cc6352eRichard Nauber { .driver_data = MT_CLS_EGALAX, 6624875ac114d8bce99838a9b0ee7c3f5469cc6352eRichard Nauber HID_USB_DEVICE(USB_VENDOR_ID_DWAV, 6634875ac114d8bce99838a9b0ee7c3f5469cc6352eRichard Nauber USB_DEVICE_ID_DWAV_EGALAX_MULTITOUCH4) }, 6644875ac114d8bce99838a9b0ee7c3f5469cc6352eRichard Nauber 665043b403aede4a528ed99ceaf050f567f1283a23eBenjamin Tissoires /* Stantum panels */ 666043b403aede4a528ed99ceaf050f567f1283a23eBenjamin Tissoires { .driver_data = MT_CLS_STANTUM, 667043b403aede4a528ed99ceaf050f567f1283a23eBenjamin Tissoires HID_USB_DEVICE(USB_VENDOR_ID_STANTUM, 668043b403aede4a528ed99ceaf050f567f1283a23eBenjamin Tissoires USB_DEVICE_ID_MTP)}, 669043b403aede4a528ed99ceaf050f567f1283a23eBenjamin Tissoires { .driver_data = MT_CLS_STANTUM, 670043b403aede4a528ed99ceaf050f567f1283a23eBenjamin Tissoires HID_USB_DEVICE(USB_VENDOR_ID_STANTUM, 671043b403aede4a528ed99ceaf050f567f1283a23eBenjamin Tissoires USB_DEVICE_ID_MTP_STM)}, 672043b403aede4a528ed99ceaf050f567f1283a23eBenjamin Tissoires { .driver_data = MT_CLS_STANTUM, 673043b403aede4a528ed99ceaf050f567f1283a23eBenjamin Tissoires HID_USB_DEVICE(USB_VENDOR_ID_STANTUM, 674043b403aede4a528ed99ceaf050f567f1283a23eBenjamin Tissoires USB_DEVICE_ID_MTP_SITRONIX)}, 675043b403aede4a528ed99ceaf050f567f1283a23eBenjamin Tissoires 6765519cab477b61326963c8d523520db0342862b63Benjamin Tissoires { } 6775519cab477b61326963c8d523520db0342862b63Benjamin Tissoires}; 6785519cab477b61326963c8d523520db0342862b63Benjamin TissoiresMODULE_DEVICE_TABLE(hid, mt_devices); 6795519cab477b61326963c8d523520db0342862b63Benjamin Tissoires 6805519cab477b61326963c8d523520db0342862b63Benjamin Tissoiresstatic const struct hid_usage_id mt_grabbed_usages[] = { 6815519cab477b61326963c8d523520db0342862b63Benjamin Tissoires { HID_ANY_ID, HID_ANY_ID, HID_ANY_ID }, 6825519cab477b61326963c8d523520db0342862b63Benjamin Tissoires { HID_ANY_ID - 1, HID_ANY_ID - 1, HID_ANY_ID - 1} 6835519cab477b61326963c8d523520db0342862b63Benjamin Tissoires}; 6845519cab477b61326963c8d523520db0342862b63Benjamin Tissoires 6855519cab477b61326963c8d523520db0342862b63Benjamin Tissoiresstatic struct hid_driver mt_driver = { 6865519cab477b61326963c8d523520db0342862b63Benjamin Tissoires .name = "hid-multitouch", 6875519cab477b61326963c8d523520db0342862b63Benjamin Tissoires .id_table = mt_devices, 6885519cab477b61326963c8d523520db0342862b63Benjamin Tissoires .probe = mt_probe, 6895519cab477b61326963c8d523520db0342862b63Benjamin Tissoires .remove = mt_remove, 6905519cab477b61326963c8d523520db0342862b63Benjamin Tissoires .input_mapping = mt_input_mapping, 6915519cab477b61326963c8d523520db0342862b63Benjamin Tissoires .input_mapped = mt_input_mapped, 6925519cab477b61326963c8d523520db0342862b63Benjamin Tissoires .feature_mapping = mt_feature_mapping, 6935519cab477b61326963c8d523520db0342862b63Benjamin Tissoires .usage_table = mt_grabbed_usages, 6945519cab477b61326963c8d523520db0342862b63Benjamin Tissoires .event = mt_event, 6955519cab477b61326963c8d523520db0342862b63Benjamin Tissoires#ifdef CONFIG_PM 6965519cab477b61326963c8d523520db0342862b63Benjamin Tissoires .reset_resume = mt_reset_resume, 6975519cab477b61326963c8d523520db0342862b63Benjamin Tissoires#endif 6985519cab477b61326963c8d523520db0342862b63Benjamin Tissoires}; 6995519cab477b61326963c8d523520db0342862b63Benjamin Tissoires 7005519cab477b61326963c8d523520db0342862b63Benjamin Tissoiresstatic int __init mt_init(void) 7015519cab477b61326963c8d523520db0342862b63Benjamin Tissoires{ 7025519cab477b61326963c8d523520db0342862b63Benjamin Tissoires return hid_register_driver(&mt_driver); 7035519cab477b61326963c8d523520db0342862b63Benjamin Tissoires} 7045519cab477b61326963c8d523520db0342862b63Benjamin Tissoires 7055519cab477b61326963c8d523520db0342862b63Benjamin Tissoiresstatic void __exit mt_exit(void) 7065519cab477b61326963c8d523520db0342862b63Benjamin Tissoires{ 7075519cab477b61326963c8d523520db0342862b63Benjamin Tissoires hid_unregister_driver(&mt_driver); 7085519cab477b61326963c8d523520db0342862b63Benjamin Tissoires} 7095519cab477b61326963c8d523520db0342862b63Benjamin Tissoires 7105519cab477b61326963c8d523520db0342862b63Benjamin Tissoiresmodule_init(mt_init); 7115519cab477b61326963c8d523520db0342862b63Benjamin Tissoiresmodule_exit(mt_exit); 712