diff options
author | Benjamin Tissoires <benjamin.tissoires@enac.fr> | 2011-01-07 23:46:30 +0100 |
---|---|---|
committer | Jiri Kosina <jkosina@suse.cz> | 2011-01-11 21:26:54 +0100 |
commit | a3b5e577d96bfccbc41ebf4df784e3a153072273 (patch) | |
tree | bcf9fa39e19b6ddb120225dcd7e8df19a9384655 /drivers/hid/hid-multitouch.c | |
parent | 5519cab477b61326963c8d523520db0342862b63 (diff) |
HID: hid-multitouch: add support for Cypress TrueTouch panels
Added support for Cypress TrueTouch panels, which detect up to 10 fingers
Signed-off-by: Benjamin Tissoires <benjamin.tissoires@enac.fr>
Signed-off-by: Stéphane Chatty <chatty@enac.fr>
Signed-off-by: Jiri Kosina <jkosina@suse.cz>
Diffstat (limited to 'drivers/hid/hid-multitouch.c')
-rw-r--r-- | drivers/hid/hid-multitouch.c | 19 |
1 files changed, 19 insertions, 0 deletions
diff --git a/drivers/hid/hid-multitouch.c b/drivers/hid/hid-multitouch.c index 3b05dfe910bc..7af9f7136bd5 100644 --- a/drivers/hid/hid-multitouch.c +++ b/drivers/hid/hid-multitouch.c @@ -32,6 +32,7 @@ MODULE_LICENSE("GPL"); /* quirks to control the device */ #define MT_QUIRK_NOT_SEEN_MEANS_UP (1 << 0) #define MT_QUIRK_SLOT_IS_CONTACTID (1 << 1) +#define MT_QUIRK_CYPRESS (1 << 2) struct mt_slot { __s32 x, y, p, w, h; @@ -62,6 +63,7 @@ struct mt_class { /* classes of device behavior */ #define MT_CLS_DEFAULT 0 #define MT_CLS_DUAL1 1 +#define MT_CLS_CYPRESS 2 /* * these device-dependent functions determine what slot corresponds @@ -73,6 +75,14 @@ static int slot_is_contactid(struct mt_device *td) return td->curdata.contactid; } +static int cypress_compute_slot(struct mt_device *td) +{ + if (td->curdata.contactid != 0 || td->num_received == 0) + return td->curdata.contactid; + else + return -1; +} + static int find_slot_from_contactid(struct mt_device *td) { int i; @@ -95,6 +105,7 @@ static int find_slot_from_contactid(struct mt_device *td) struct mt_class mt_classes[] = { { 0, 0, 0, 10 }, /* MT_CLS_DEFAULT */ { MT_QUIRK_SLOT_IS_CONTACTID, 0, 0, 2 }, /* MT_CLS_DUAL1 */ + { MT_QUIRK_CYPRESS | MT_QUIRK_NOT_SEEN_MEANS_UP, 0, 0, 10 }, /* MT_CLS_CYPRESS */ }; static void mt_feature_mapping(struct hid_device *hdev, struct hid_input *hi, @@ -223,6 +234,9 @@ static int mt_compute_slot(struct mt_device *td) if (cls->quirks & MT_QUIRK_SLOT_IS_CONTACTID) return slot_is_contactid(td); + if (cls->quirks & MT_QUIRK_CYPRESS) + return cypress_compute_slot(td); + return find_slot_from_contactid(td); } @@ -422,6 +436,11 @@ static void mt_remove(struct hid_device *hdev) static const struct hid_device_id mt_devices[] = { + /* Cypress panel */ + { .driver_data = MT_CLS_CYPRESS, + HID_USB_DEVICE(USB_VENDOR_ID_CYPRESS, + USB_DEVICE_ID_CYPRESS_TRUETOUCH) }, + /* PixCir-based panels */ { .driver_data = MT_CLS_DUAL1, HID_USB_DEVICE(USB_VENDOR_ID_HANVON, |