diff options
| author | Linus Torvalds <torvalds@linux-foundation.org> | 2010-05-10 12:44:53 -0400 |
|---|---|---|
| committer | Linus Torvalds <torvalds@linux-foundation.org> | 2010-05-10 12:44:53 -0400 |
| commit | b77b907fae863f3bc546a336a8bc5e660d371788 (patch) | |
| tree | 51ea4f5d2ea9c82a7d4ba51dcef7b525b18d6a6d | |
| parent | b57f95a38233a2e73b679bea4a5453a1cc2a1cc9 (diff) | |
| parent | fde4e2f73208b8f34f123791e39c0cb6bc74b32a (diff) | |
Merge branch 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/jikos/hid
* 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/jikos/hid:
HID: fix suspend crash by moving initializations earlier
HID: sony: fix sony_set_operational_bt
HID: ntrig: Remove unused macro, TripleTap and QuadTap
HID: ntrig: TipSwitch for single touch mode touch.
HID: hidraw: fix numbered reports
HID: wacom: remove annoying non-error printk
HID: ntrig: Emit TOUCH with DOUBLETAP for single touch
HID: add support for cymotion master solar keyboard
HID: ntrig: explain firmware quirk
HID: fix N-trig touch panel with recent firmware
| -rw-r--r-- | drivers/hid/hid-cherry.c | 1 | ||||
| -rw-r--r-- | drivers/hid/hid-core.c | 10 | ||||
| -rw-r--r-- | drivers/hid/hid-ids.h | 1 | ||||
| -rw-r--r-- | drivers/hid/hid-ntrig.c | 72 | ||||
| -rw-r--r-- | drivers/hid/hid-sony.c | 2 | ||||
| -rw-r--r-- | drivers/hid/hid-wacom.c | 1 | ||||
| -rw-r--r-- | drivers/hid/usbhid/hid-core.c | 13 |
7 files changed, 46 insertions, 54 deletions
diff --git a/drivers/hid/hid-cherry.c b/drivers/hid/hid-cherry.c index 7e597d7f770f..24663a8717b1 100644 --- a/drivers/hid/hid-cherry.c +++ b/drivers/hid/hid-cherry.c | |||
| @@ -59,6 +59,7 @@ static int ch_input_mapping(struct hid_device *hdev, struct hid_input *hi, | |||
| 59 | 59 | ||
| 60 | static const struct hid_device_id ch_devices[] = { | 60 | static const struct hid_device_id ch_devices[] = { |
| 61 | { HID_USB_DEVICE(USB_VENDOR_ID_CHERRY, USB_DEVICE_ID_CHERRY_CYMOTION) }, | 61 | { HID_USB_DEVICE(USB_VENDOR_ID_CHERRY, USB_DEVICE_ID_CHERRY_CYMOTION) }, |
| 62 | { HID_USB_DEVICE(USB_VENDOR_ID_CHERRY, USB_DEVICE_ID_CHERRY_CYMOTION_SOLAR) }, | ||
| 62 | { } | 63 | { } |
| 63 | }; | 64 | }; |
| 64 | MODULE_DEVICE_TABLE(hid, ch_devices); | 65 | MODULE_DEVICE_TABLE(hid, ch_devices); |
diff --git a/drivers/hid/hid-core.c b/drivers/hid/hid-core.c index 2e2aa759d230..143e788b729b 100644 --- a/drivers/hid/hid-core.c +++ b/drivers/hid/hid-core.c | |||
| @@ -1043,13 +1043,8 @@ void hid_report_raw_event(struct hid_device *hid, int type, u8 *data, int size, | |||
| 1043 | 1043 | ||
| 1044 | if ((hid->claimed & HID_CLAIMED_HIDDEV) && hid->hiddev_report_event) | 1044 | if ((hid->claimed & HID_CLAIMED_HIDDEV) && hid->hiddev_report_event) |
| 1045 | hid->hiddev_report_event(hid, report); | 1045 | hid->hiddev_report_event(hid, report); |
| 1046 | if (hid->claimed & HID_CLAIMED_HIDRAW) { | 1046 | if (hid->claimed & HID_CLAIMED_HIDRAW) |
| 1047 | /* numbered reports need to be passed with the report num */ | 1047 | hidraw_report_event(hid, data, size); |
| 1048 | if (report_enum->numbered) | ||
| 1049 | hidraw_report_event(hid, data - 1, size + 1); | ||
| 1050 | else | ||
| 1051 | hidraw_report_event(hid, data, size); | ||
| 1052 | } | ||
| 1053 | 1048 | ||
| 1054 | for (a = 0; a < report->maxfield; a++) | 1049 | for (a = 0; a < report->maxfield; a++) |
| 1055 | hid_input_field(hid, report->field[a], cdata, interrupt); | 1050 | hid_input_field(hid, report->field[a], cdata, interrupt); |
| @@ -1296,6 +1291,7 @@ static const struct hid_device_id hid_blacklist[] = { | |||
| 1296 | { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_GEYSER1_TP_ONLY) }, | 1291 | { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_GEYSER1_TP_ONLY) }, |
| 1297 | { HID_USB_DEVICE(USB_VENDOR_ID_BELKIN, USB_DEVICE_ID_FLIP_KVM) }, | 1292 | { HID_USB_DEVICE(USB_VENDOR_ID_BELKIN, USB_DEVICE_ID_FLIP_KVM) }, |
| 1298 | { HID_USB_DEVICE(USB_VENDOR_ID_CHERRY, USB_DEVICE_ID_CHERRY_CYMOTION) }, | 1293 | { HID_USB_DEVICE(USB_VENDOR_ID_CHERRY, USB_DEVICE_ID_CHERRY_CYMOTION) }, |
| 1294 | { HID_USB_DEVICE(USB_VENDOR_ID_CHERRY, USB_DEVICE_ID_CHERRY_CYMOTION_SOLAR) }, | ||
| 1299 | { HID_USB_DEVICE(USB_VENDOR_ID_CHICONY, USB_DEVICE_ID_CHICONY_TACTICAL_PAD) }, | 1295 | { HID_USB_DEVICE(USB_VENDOR_ID_CHICONY, USB_DEVICE_ID_CHICONY_TACTICAL_PAD) }, |
| 1300 | { HID_USB_DEVICE(USB_VENDOR_ID_CYPRESS, USB_DEVICE_ID_CYPRESS_BARCODE_1) }, | 1296 | { HID_USB_DEVICE(USB_VENDOR_ID_CYPRESS, USB_DEVICE_ID_CYPRESS_BARCODE_1) }, |
| 1301 | { HID_USB_DEVICE(USB_VENDOR_ID_CYPRESS, USB_DEVICE_ID_CYPRESS_BARCODE_2) }, | 1297 | { HID_USB_DEVICE(USB_VENDOR_ID_CYPRESS, USB_DEVICE_ID_CYPRESS_BARCODE_2) }, |
diff --git a/drivers/hid/hid-ids.h b/drivers/hid/hid-ids.h index 797e06470356..09d27649a0f7 100644 --- a/drivers/hid/hid-ids.h +++ b/drivers/hid/hid-ids.h | |||
| @@ -131,6 +131,7 @@ | |||
| 131 | 131 | ||
| 132 | #define USB_VENDOR_ID_CHERRY 0x046a | 132 | #define USB_VENDOR_ID_CHERRY 0x046a |
| 133 | #define USB_DEVICE_ID_CHERRY_CYMOTION 0x0023 | 133 | #define USB_DEVICE_ID_CHERRY_CYMOTION 0x0023 |
| 134 | #define USB_DEVICE_ID_CHERRY_CYMOTION_SOLAR 0x0027 | ||
| 134 | 135 | ||
| 135 | #define USB_VENDOR_ID_CHIC 0x05fe | 136 | #define USB_VENDOR_ID_CHIC 0x05fe |
| 136 | #define USB_DEVICE_ID_CHIC_GAMEPAD 0x0014 | 137 | #define USB_DEVICE_ID_CHIC_GAMEPAD 0x0014 |
diff --git a/drivers/hid/hid-ntrig.c b/drivers/hid/hid-ntrig.c index 9b24fc510712..4777bbfa1cc2 100644 --- a/drivers/hid/hid-ntrig.c +++ b/drivers/hid/hid-ntrig.c | |||
| @@ -1,8 +1,8 @@ | |||
| 1 | /* | 1 | /* |
| 2 | * HID driver for N-Trig touchscreens | 2 | * HID driver for N-Trig touchscreens |
| 3 | * | 3 | * |
| 4 | * Copyright (c) 2008 Rafi Rubin | 4 | * Copyright (c) 2008-2010 Rafi Rubin |
| 5 | * Copyright (c) 2009 Stephane Chatty | 5 | * Copyright (c) 2009-2010 Stephane Chatty |
| 6 | * | 6 | * |
| 7 | */ | 7 | */ |
| 8 | 8 | ||
| @@ -15,6 +15,8 @@ | |||
| 15 | 15 | ||
| 16 | #include <linux/device.h> | 16 | #include <linux/device.h> |
| 17 | #include <linux/hid.h> | 17 | #include <linux/hid.h> |
| 18 | #include <linux/usb.h> | ||
| 19 | #include "usbhid/usbhid.h" | ||
| 18 | #include <linux/module.h> | 20 | #include <linux/module.h> |
| 19 | #include <linux/slab.h> | 21 | #include <linux/slab.h> |
| 20 | 22 | ||
| @@ -22,17 +24,16 @@ | |||
| 22 | 24 | ||
| 23 | #define NTRIG_DUPLICATE_USAGES 0x001 | 25 | #define NTRIG_DUPLICATE_USAGES 0x001 |
| 24 | 26 | ||
| 25 | #define nt_map_key_clear(c) hid_map_usage_clear(hi, usage, bit, max, \ | ||
| 26 | EV_KEY, (c)) | ||
| 27 | |||
| 28 | struct ntrig_data { | 27 | struct ntrig_data { |
| 29 | /* Incoming raw values for a single contact */ | 28 | /* Incoming raw values for a single contact */ |
| 30 | __u16 x, y, w, h; | 29 | __u16 x, y, w, h; |
| 31 | __u16 id; | 30 | __u16 id; |
| 32 | __u8 confidence; | 31 | |
| 32 | bool tipswitch; | ||
| 33 | bool confidence; | ||
| 34 | bool first_contact_touch; | ||
| 33 | 35 | ||
| 34 | bool reading_mt; | 36 | bool reading_mt; |
| 35 | __u8 first_contact_confidence; | ||
| 36 | 37 | ||
| 37 | __u8 mt_footer[4]; | 38 | __u8 mt_footer[4]; |
| 38 | __u8 mt_foot_count; | 39 | __u8 mt_foot_count; |
| @@ -139,9 +140,10 @@ static int ntrig_event (struct hid_device *hid, struct hid_field *field, | |||
| 139 | case 0xff000001: | 140 | case 0xff000001: |
| 140 | /* Tag indicating the start of a multitouch group */ | 141 | /* Tag indicating the start of a multitouch group */ |
| 141 | nd->reading_mt = 1; | 142 | nd->reading_mt = 1; |
| 142 | nd->first_contact_confidence = 0; | 143 | nd->first_contact_touch = 0; |
| 143 | break; | 144 | break; |
| 144 | case HID_DG_TIPSWITCH: | 145 | case HID_DG_TIPSWITCH: |
| 146 | nd->tipswitch = value; | ||
| 145 | /* Prevent emission of touch until validated */ | 147 | /* Prevent emission of touch until validated */ |
| 146 | return 1; | 148 | return 1; |
| 147 | case HID_DG_CONFIDENCE: | 149 | case HID_DG_CONFIDENCE: |
| @@ -169,8 +171,14 @@ static int ntrig_event (struct hid_device *hid, struct hid_field *field, | |||
| 169 | * to emit a normal (X, Y) position | 171 | * to emit a normal (X, Y) position |
| 170 | */ | 172 | */ |
| 171 | if (!nd->reading_mt) { | 173 | if (!nd->reading_mt) { |
| 174 | /* | ||
| 175 | * TipSwitch indicates the presence of a | ||
| 176 | * finger in single touch mode. | ||
| 177 | */ | ||
| 178 | input_report_key(input, BTN_TOUCH, | ||
| 179 | nd->tipswitch); | ||
| 172 | input_report_key(input, BTN_TOOL_DOUBLETAP, | 180 | input_report_key(input, BTN_TOOL_DOUBLETAP, |
| 173 | (nd->confidence != 0)); | 181 | nd->tipswitch); |
| 174 | input_event(input, EV_ABS, ABS_X, nd->x); | 182 | input_event(input, EV_ABS, ABS_X, nd->x); |
| 175 | input_event(input, EV_ABS, ABS_Y, nd->y); | 183 | input_event(input, EV_ABS, ABS_Y, nd->y); |
| 176 | } | 184 | } |
| @@ -209,7 +217,13 @@ static int ntrig_event (struct hid_device *hid, struct hid_field *field, | |||
| 209 | 217 | ||
| 210 | /* emit a normal (X, Y) for the first point only */ | 218 | /* emit a normal (X, Y) for the first point only */ |
| 211 | if (nd->id == 0) { | 219 | if (nd->id == 0) { |
| 212 | nd->first_contact_confidence = nd->confidence; | 220 | /* |
| 221 | * TipSwitch is superfluous in multitouch | ||
| 222 | * mode. The footer events tell us | ||
| 223 | * if there is a finger on the screen or | ||
| 224 | * not. | ||
| 225 | */ | ||
| 226 | nd->first_contact_touch = nd->confidence; | ||
| 213 | input_event(input, EV_ABS, ABS_X, nd->x); | 227 | input_event(input, EV_ABS, ABS_X, nd->x); |
| 214 | input_event(input, EV_ABS, ABS_Y, nd->y); | 228 | input_event(input, EV_ABS, ABS_Y, nd->y); |
| 215 | } | 229 | } |
| @@ -239,30 +253,11 @@ static int ntrig_event (struct hid_device *hid, struct hid_field *field, | |||
| 239 | 253 | ||
| 240 | nd->reading_mt = 0; | 254 | nd->reading_mt = 0; |
| 241 | 255 | ||
| 242 | if (nd->first_contact_confidence) { | 256 | if (nd->first_contact_touch) { |
| 243 | switch (value) { | 257 | input_report_key(input, BTN_TOOL_DOUBLETAP, 1); |
| 244 | case 0: /* for single touch devices */ | ||
| 245 | case 1: | ||
| 246 | input_report_key(input, | ||
| 247 | BTN_TOOL_DOUBLETAP, 1); | ||
| 248 | break; | ||
| 249 | case 2: | ||
| 250 | input_report_key(input, | ||
| 251 | BTN_TOOL_TRIPLETAP, 1); | ||
| 252 | break; | ||
| 253 | case 3: | ||
| 254 | default: | ||
| 255 | input_report_key(input, | ||
| 256 | BTN_TOOL_QUADTAP, 1); | ||
| 257 | } | ||
| 258 | input_report_key(input, BTN_TOUCH, 1); | 258 | input_report_key(input, BTN_TOUCH, 1); |
| 259 | } else { | 259 | } else { |
| 260 | input_report_key(input, | 260 | input_report_key(input, BTN_TOOL_DOUBLETAP, 0); |
| 261 | BTN_TOOL_DOUBLETAP, 0); | ||
| 262 | input_report_key(input, | ||
| 263 | BTN_TOOL_TRIPLETAP, 0); | ||
| 264 | input_report_key(input, | ||
| 265 | BTN_TOOL_QUADTAP, 0); | ||
| 266 | input_report_key(input, BTN_TOUCH, 0); | 261 | input_report_key(input, BTN_TOUCH, 0); |
| 267 | } | 262 | } |
| 268 | break; | 263 | break; |
| @@ -286,6 +281,7 @@ static int ntrig_probe(struct hid_device *hdev, const struct hid_device_id *id) | |||
| 286 | struct ntrig_data *nd; | 281 | struct ntrig_data *nd; |
| 287 | struct hid_input *hidinput; | 282 | struct hid_input *hidinput; |
| 288 | struct input_dev *input; | 283 | struct input_dev *input; |
| 284 | struct hid_report *report; | ||
| 289 | 285 | ||
| 290 | if (id->driver_data) | 286 | if (id->driver_data) |
| 291 | hdev->quirks |= HID_QUIRK_MULTI_INPUT; | 287 | hdev->quirks |= HID_QUIRK_MULTI_INPUT; |
| @@ -327,13 +323,7 @@ static int ntrig_probe(struct hid_device *hdev, const struct hid_device_id *id) | |||
| 327 | __clear_bit(BTN_TOOL_PEN, input->keybit); | 323 | __clear_bit(BTN_TOOL_PEN, input->keybit); |
| 328 | __clear_bit(BTN_TOOL_FINGER, input->keybit); | 324 | __clear_bit(BTN_TOOL_FINGER, input->keybit); |
| 329 | __clear_bit(BTN_0, input->keybit); | 325 | __clear_bit(BTN_0, input->keybit); |
| 330 | /* | ||
| 331 | * A little something special to enable | ||
| 332 | * two and three finger taps. | ||
| 333 | */ | ||
| 334 | __set_bit(BTN_TOOL_DOUBLETAP, input->keybit); | 326 | __set_bit(BTN_TOOL_DOUBLETAP, input->keybit); |
| 335 | __set_bit(BTN_TOOL_TRIPLETAP, input->keybit); | ||
| 336 | __set_bit(BTN_TOOL_QUADTAP, input->keybit); | ||
| 337 | /* | 327 | /* |
| 338 | * The physical touchscreen (single touch) | 328 | * The physical touchscreen (single touch) |
| 339 | * input has a value for physical, whereas | 329 | * input has a value for physical, whereas |
| @@ -349,6 +339,12 @@ static int ntrig_probe(struct hid_device *hdev, const struct hid_device_id *id) | |||
| 349 | } | 339 | } |
| 350 | } | 340 | } |
| 351 | 341 | ||
| 342 | /* This is needed for devices with more recent firmware versions */ | ||
| 343 | report = hdev->report_enum[HID_FEATURE_REPORT].report_id_hash[0x0a]; | ||
| 344 | if (report) | ||
| 345 | usbhid_submit_report(hdev, report, USB_DIR_OUT); | ||
| 346 | |||
| 347 | |||
| 352 | return 0; | 348 | return 0; |
| 353 | err_free: | 349 | err_free: |
| 354 | kfree(nd); | 350 | kfree(nd); |
diff --git a/drivers/hid/hid-sony.c b/drivers/hid/hid-sony.c index 7502a4b2fa86..402d5574b574 100644 --- a/drivers/hid/hid-sony.c +++ b/drivers/hid/hid-sony.c | |||
| @@ -76,7 +76,7 @@ static int sony_set_operational_usb(struct hid_device *hdev) | |||
| 76 | 76 | ||
| 77 | static int sony_set_operational_bt(struct hid_device *hdev) | 77 | static int sony_set_operational_bt(struct hid_device *hdev) |
| 78 | { | 78 | { |
| 79 | unsigned char buf[] = { 0x53, 0xf4, 0x42, 0x03, 0x00, 0x00 }; | 79 | unsigned char buf[] = { 0xf4, 0x42, 0x03, 0x00, 0x00 }; |
| 80 | return hdev->hid_output_raw_report(hdev, buf, sizeof(buf), HID_FEATURE_REPORT); | 80 | return hdev->hid_output_raw_report(hdev, buf, sizeof(buf), HID_FEATURE_REPORT); |
| 81 | } | 81 | } |
| 82 | 82 | ||
diff --git a/drivers/hid/hid-wacom.c b/drivers/hid/hid-wacom.c index f7700cf49721..f947d8337e21 100644 --- a/drivers/hid/hid-wacom.c +++ b/drivers/hid/hid-wacom.c | |||
| @@ -277,7 +277,6 @@ static int __init wacom_init(void) | |||
| 277 | ret = hid_register_driver(&wacom_driver); | 277 | ret = hid_register_driver(&wacom_driver); |
| 278 | if (ret) | 278 | if (ret) |
| 279 | printk(KERN_ERR "can't register wacom driver\n"); | 279 | printk(KERN_ERR "can't register wacom driver\n"); |
| 280 | printk(KERN_ERR "wacom driver registered\n"); | ||
| 281 | return ret; | 280 | return ret; |
| 282 | } | 281 | } |
| 283 | 282 | ||
diff --git a/drivers/hid/usbhid/hid-core.c b/drivers/hid/usbhid/hid-core.c index 56d06cd8075b..7b85b696fdab 100644 --- a/drivers/hid/usbhid/hid-core.c +++ b/drivers/hid/usbhid/hid-core.c | |||
| @@ -999,13 +999,6 @@ static int usbhid_start(struct hid_device *hid) | |||
| 999 | } | 999 | } |
| 1000 | } | 1000 | } |
| 1001 | 1001 | ||
| 1002 | init_waitqueue_head(&usbhid->wait); | ||
| 1003 | INIT_WORK(&usbhid->reset_work, hid_reset); | ||
| 1004 | INIT_WORK(&usbhid->restart_work, __usbhid_restart_queues); | ||
| 1005 | setup_timer(&usbhid->io_retry, hid_retry_timeout, (unsigned long) hid); | ||
| 1006 | |||
| 1007 | spin_lock_init(&usbhid->lock); | ||
| 1008 | |||
| 1009 | usbhid->urbctrl = usb_alloc_urb(0, GFP_KERNEL); | 1002 | usbhid->urbctrl = usb_alloc_urb(0, GFP_KERNEL); |
| 1010 | if (!usbhid->urbctrl) { | 1003 | if (!usbhid->urbctrl) { |
| 1011 | ret = -ENOMEM; | 1004 | ret = -ENOMEM; |
| @@ -1179,6 +1172,12 @@ static int usbhid_probe(struct usb_interface *intf, const struct usb_device_id * | |||
| 1179 | usbhid->intf = intf; | 1172 | usbhid->intf = intf; |
| 1180 | usbhid->ifnum = interface->desc.bInterfaceNumber; | 1173 | usbhid->ifnum = interface->desc.bInterfaceNumber; |
| 1181 | 1174 | ||
| 1175 | init_waitqueue_head(&usbhid->wait); | ||
| 1176 | INIT_WORK(&usbhid->reset_work, hid_reset); | ||
| 1177 | INIT_WORK(&usbhid->restart_work, __usbhid_restart_queues); | ||
| 1178 | setup_timer(&usbhid->io_retry, hid_retry_timeout, (unsigned long) hid); | ||
| 1179 | spin_lock_init(&usbhid->lock); | ||
| 1180 | |||
| 1182 | ret = hid_add_device(hid); | 1181 | ret = hid_add_device(hid); |
| 1183 | if (ret) { | 1182 | if (ret) { |
| 1184 | if (ret != -ENODEV) | 1183 | if (ret != -ENODEV) |
