Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

Merge branch 'upstream' into for-linus

Conflicts:
drivers/hid/hid-wacom.c

+679 -79
+10
Documentation/ABI/testing/sysfs-wacom
··· 1 + What: /sys/class/hidraw/hidraw*/device/speed 2 + Date: April 2010 3 + Kernel Version: 2.6.35 4 + Contact: linux-bluetooth@vger.kernel.org 5 + Description: 6 + The /sys/class/hidraw/hidraw*/device/speed file controls 7 + reporting speed of wacom bluetooth tablet. Reading from 8 + this file returns 1 if tablet reports in high speed mode 9 + or 0 otherwise. Writing to this file one of these values 10 + switches reporting speed.
+17 -2
drivers/hid/Kconfig
··· 273 273 depends on USB_HID 274 274 default !EMBEDDED 275 275 ---help--- 276 - Support for Samsung InfraRed remote control. 276 + Support for Samsung InfraRed remote control or keyboards. 277 277 278 278 config HID_SONY 279 279 tristate "Sony" if EMBEDDED ··· 332 332 depends on USB_HID 333 333 default !EMBEDDED 334 334 ---help--- 335 - Say Y if you have a TopSeed Cyberlink remote control. 335 + Say Y if you have a TopSeed Cyberlink or BTC Emprex remote control. 336 336 337 337 config HID_THRUSTMASTER 338 338 tristate "ThrustMaster devices support" if EMBEDDED ··· 357 357 ---help--- 358 358 Support for Wacom Graphire Bluetooth tablet. 359 359 360 + config HID_WACOM_POWER_SUPPLY 361 + bool "Wacom Bluetooth devices power supply status support" 362 + depends on HID_WACOM 363 + select POWER_SUPPLY 364 + ---help--- 365 + Say Y here if you want to enable power supply status monitoring for 366 + Wacom Bluetooth devices. 367 + 360 368 config HID_ZEROPLUS 361 369 tristate "Zeroplus based game controller support" if EMBEDDED 362 370 depends on USB_HID ··· 379 371 ---help--- 380 372 Say Y here if you have a Zeroplus based game controller and want 381 373 to have force feedback support for it. 374 + 375 + config HID_ZYDACRON 376 + tristate "Zydacron remote control support" if EMBEDDED 377 + depends on USB_HID 378 + default !EMBEDDED 379 + ---help--- 380 + Support for Zydacron remote control. 382 381 383 382 endmenu 384 383
+1
drivers/hid/Makefile
··· 54 54 obj-$(CONFIG_HID_TOPSEED) += hid-topseed.o 55 55 obj-$(CONFIG_HID_TWINHAN) += hid-twinhan.o 56 56 obj-$(CONFIG_HID_ZEROPLUS) += hid-zpff.o 57 + obj-$(CONFIG_HID_ZYDACRON) += hid-zydacron.o 57 58 obj-$(CONFIG_HID_WACOM) += hid-wacom.o 58 59 59 60 obj-$(CONFIG_USB_HID) += usbhid/
+28 -3
drivers/hid/hid-3m-pct.c
··· 1 1 /* 2 2 * HID driver for 3M PCT multitouch panels 3 3 * 4 - * Copyright (c) 2009 Stephane Chatty <chatty@enac.fr> 4 + * Copyright (c) 2009-2010 Stephane Chatty <chatty@enac.fr> 5 5 * 6 6 */ 7 7 ··· 25 25 #include "hid-ids.h" 26 26 27 27 struct mmm_finger { 28 - __s32 x, y; 28 + __s32 x, y, w, h; 29 29 __u8 rank; 30 30 bool touch, valid; 31 31 }; ··· 82 82 /* touchscreen emulation */ 83 83 hid_map_usage(hi, usage, bit, max, EV_KEY, BTN_TOUCH); 84 84 return 1; 85 + case HID_DG_WIDTH: 86 + hid_map_usage(hi, usage, bit, max, 87 + EV_ABS, ABS_MT_TOUCH_MAJOR); 88 + return 1; 89 + case HID_DG_HEIGHT: 90 + hid_map_usage(hi, usage, bit, max, 91 + EV_ABS, ABS_MT_TOUCH_MINOR); 92 + input_set_abs_params(hi->input, ABS_MT_ORIENTATION, 93 + 1, 1, 0, 0); 94 + return 1; 85 95 case HID_DG_CONTACTID: 96 + field->logical_maximum = 59; 86 97 hid_map_usage(hi, usage, bit, max, 87 98 EV_ABS, ABS_MT_TRACKING_ID); 88 99 return 1; ··· 139 128 /* this finger is just placeholder data, ignore */ 140 129 } else if (f->touch) { 141 130 /* this finger is on the screen */ 131 + int wide = (f->w > f->h); 142 132 input_event(input, EV_ABS, ABS_MT_TRACKING_ID, i); 143 133 input_event(input, EV_ABS, ABS_MT_POSITION_X, f->x); 144 134 input_event(input, EV_ABS, ABS_MT_POSITION_Y, f->y); 135 + input_event(input, EV_ABS, ABS_MT_ORIENTATION, wide); 136 + input_event(input, EV_ABS, ABS_MT_TOUCH_MAJOR, 137 + wide ? f->w : f->h); 138 + input_event(input, EV_ABS, ABS_MT_TOUCH_MINOR, 139 + wide ? f->h : f->w); 145 140 input_mt_sync(input); 146 141 /* 147 142 * touchscreen emulation: maintain the age rank ··· 214 197 case HID_DG_CONFIDENCE: 215 198 md->valid = value; 216 199 break; 200 + case HID_DG_WIDTH: 201 + if (md->valid) 202 + md->f[md->curid].w = value; 203 + break; 204 + case HID_DG_HEIGHT: 205 + if (md->valid) 206 + md->f[md->curid].h = value; 207 + break; 217 208 case HID_DG_CONTACTID: 218 209 if (md->valid) { 219 210 md->curid = value; ··· 280 255 281 256 static const struct hid_device_id mmm_devices[] = { 282 257 { HID_USB_DEVICE(USB_VENDOR_ID_3M, USB_DEVICE_ID_3M1968) }, 258 + { HID_USB_DEVICE(USB_VENDOR_ID_3M, USB_DEVICE_ID_3M2256) }, 283 259 { } 284 260 }; 285 261 MODULE_DEVICE_TABLE(hid, mmm_devices); ··· 313 287 314 288 module_init(mmm_init); 315 289 module_exit(mmm_exit); 316 - MODULE_LICENSE("GPL"); 317 290
+13 -10
drivers/hid/hid-core.c
··· 653 653 if (device->driver->report_fixup) 654 654 device->driver->report_fixup(device, start, size); 655 655 656 - device->rdesc = kmalloc(size, GFP_KERNEL); 656 + device->rdesc = kmemdup(start, size, GFP_KERNEL); 657 657 if (device->rdesc == NULL) 658 658 return -ENOMEM; 659 - memcpy(device->rdesc, start, size); 660 659 device->rsize = size; 661 660 662 661 parser = vmalloc(sizeof(struct hid_parser)); ··· 939 940 unsigned count = field->report_count; 940 941 unsigned offset = field->report_offset; 941 942 unsigned size = field->report_size; 942 - unsigned bitsused = offset + count * size; 943 943 unsigned n; 944 - 945 - /* make sure the unused bits in the last byte are zeros */ 946 - if (count > 0 && size > 0 && (bitsused % 8) != 0) 947 - data[(bitsused-1)/8] &= (1 << (bitsused % 8)) - 1; 948 944 949 945 for (n = 0; n < count; n++) { 950 946 if (field->logical_minimum < 0) /* signed values */ ··· 960 966 if (report->id > 0) 961 967 *data++ = report->id; 962 968 969 + memset(data, 0, ((report->size - 1) >> 3) + 1); 963 970 for (n = 0; n < report->maxfield; n++) 964 971 hid_output_field(report->field[n], data); 965 972 } ··· 1162 1167 unsigned int i; 1163 1168 int len; 1164 1169 1170 + if (hdev->quirks & HID_QUIRK_HIDDEV_FORCE) 1171 + connect_mask |= (HID_CONNECT_HIDDEV_FORCE | HID_CONNECT_HIDDEV); 1165 1172 if (hdev->bus != BUS_USB) 1166 1173 connect_mask &= ~HID_CONNECT_HIDDEV; 1167 1174 if (hid_hiddev(hdev)) ··· 1243 1246 /* a list of devices for which there is a specialized driver on HID bus */ 1244 1247 static const struct hid_device_id hid_blacklist[] = { 1245 1248 { HID_USB_DEVICE(USB_VENDOR_ID_3M, USB_DEVICE_ID_3M1968) }, 1249 + { HID_USB_DEVICE(USB_VENDOR_ID_3M, USB_DEVICE_ID_3M2256) }, 1246 1250 { HID_USB_DEVICE(USB_VENDOR_ID_A4TECH, USB_DEVICE_ID_A4TECH_WCP32PU) }, 1247 1251 { HID_USB_DEVICE(USB_VENDOR_ID_A4TECH, USB_DEVICE_ID_A4TECH_X5_005D) }, 1248 1252 { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_ATV_IRCONTROL) }, ··· 1288 1290 { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_FOUNTAIN_TP_ONLY) }, 1289 1291 { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_GEYSER1_TP_ONLY) }, 1290 1292 { HID_USB_DEVICE(USB_VENDOR_ID_BELKIN, USB_DEVICE_ID_FLIP_KVM) }, 1293 + { HID_USB_DEVICE(USB_VENDOR_ID_BTC, USB_DEVICE_ID_BTC_EMPREX_REMOTE) }, 1291 1294 { HID_USB_DEVICE(USB_VENDOR_ID_CHERRY, USB_DEVICE_ID_CHERRY_CYMOTION) }, 1292 1295 { HID_USB_DEVICE(USB_VENDOR_ID_CHERRY, USB_DEVICE_ID_CHERRY_CYMOTION_SOLAR) }, 1293 1296 { HID_USB_DEVICE(USB_VENDOR_ID_CHICONY, USB_DEVICE_ID_CHICONY_TACTICAL_PAD) }, ··· 1342 1343 { HID_USB_DEVICE(USB_VENDOR_ID_QUANTA, USB_DEVICE_ID_QUANTA_OPTICAL_TOUCH) }, 1343 1344 { HID_USB_DEVICE(USB_VENDOR_ID_QUANTA, USB_DEVICE_ID_PIXART_IMAGING_INC_OPTICAL_TOUCH_SCREEN) }, 1344 1345 { HID_USB_DEVICE(USB_VENDOR_ID_SAMSUNG, USB_DEVICE_ID_SAMSUNG_IR_REMOTE) }, 1346 + { HID_USB_DEVICE(USB_VENDOR_ID_SAMSUNG, USB_DEVICE_ID_SAMSUNG_WIRELESS_KBD_MOUSE) }, 1345 1347 { HID_USB_DEVICE(USB_VENDOR_ID_SONY, USB_DEVICE_ID_SONY_PS3_CONTROLLER) }, 1346 1348 { HID_BLUETOOTH_DEVICE(USB_VENDOR_ID_SONY, USB_DEVICE_ID_SONY_PS3_CONTROLLER) }, 1347 1349 { HID_USB_DEVICE(USB_VENDOR_ID_SONY, USB_DEVICE_ID_SONY_VAIO_VGX_MOUSE) }, ··· 1359 1359 { HID_USB_DEVICE(USB_VENDOR_ID_TWINHAN, USB_DEVICE_ID_TWINHAN_IR_REMOTE) }, 1360 1360 { HID_USB_DEVICE(USB_VENDOR_ID_WISEGROUP, USB_DEVICE_ID_SMARTJOY_PLUS) }, 1361 1361 { HID_BLUETOOTH_DEVICE(USB_VENDOR_ID_WACOM, USB_DEVICE_ID_WACOM_GRAPHIRE_BLUETOOTH) }, 1362 + { HID_BLUETOOTH_DEVICE(USB_VENDOR_ID_WACOM, USB_DEVICE_ID_WACOM_INTUOS4_BLUETOOTH) }, 1362 1363 { HID_USB_DEVICE(USB_VENDOR_ID_ZEROPLUS, 0x0005) }, 1363 1364 { HID_USB_DEVICE(USB_VENDOR_ID_ZEROPLUS, 0x0030) }, 1365 + { HID_USB_DEVICE(USB_VENDOR_ID_ZYDACRON, USB_DEVICE_ID_ZYDACRON_REMOTE_CONTROL) }, 1364 1366 1365 1367 { HID_BLUETOOTH_DEVICE(USB_VENDOR_ID_MICROSOFT, USB_DEVICE_ID_MS_PRESENTER_8K_BT) }, 1366 1368 { } ··· 1759 1757 1760 1758 /* we need to kill them here, otherwise they will stay allocated to 1761 1759 * wait for coming driver */ 1762 - if (hid_ignore(hdev)) 1760 + if (!(hdev->quirks & HID_QUIRK_NO_IGNORE) && hid_ignore(hdev)) 1763 1761 return -ENODEV; 1764 1762 1765 1763 /* XXX hack, any other cleaner solution after the driver core ··· 1767 1765 dev_set_name(&hdev->dev, "%04X:%04X:%04X.%04X", hdev->bus, 1768 1766 hdev->vendor, hdev->product, atomic_inc_return(&id)); 1769 1767 1768 + hid_debug_register(hdev, dev_name(&hdev->dev)); 1770 1769 ret = device_add(&hdev->dev); 1771 1770 if (!ret) 1772 1771 hdev->status |= HID_STAT_ADDED; 1773 - 1774 - hid_debug_register(hdev, dev_name(&hdev->dev)); 1772 + else 1773 + hid_debug_unregister(hdev); 1775 1774 1776 1775 return ret; 1777 1776 }
+12
drivers/hid/hid-ids.h
··· 20 20 21 21 #define USB_VENDOR_ID_3M 0x0596 22 22 #define USB_DEVICE_ID_3M1968 0x0500 23 + #define USB_DEVICE_ID_3M2256 0x0502 23 24 24 25 #define USB_VENDOR_ID_A4TECH 0x09da 25 26 #define USB_DEVICE_ID_A4TECH_WCP32PU 0x0006 ··· 124 123 #define USB_VENDOR_ID_BERKSHIRE 0x0c98 125 124 #define USB_DEVICE_ID_BERKSHIRE_PCWD 0x1140 126 125 126 + #define USB_VENDOR_ID_BTC 0x046e 127 + #define USB_DEVICE_ID_BTC_EMPREX_REMOTE 0x5578 128 + 127 129 #define USB_VENDOR_ID_CH 0x068e 128 130 #define USB_DEVICE_ID_CH_PRO_PEDALS 0x00f2 129 131 #define USB_DEVICE_ID_CH_COMBATSTICK 0x00f4 ··· 174 170 #define USB_DEVICE_ID_DMI_ENC 0x5fab 175 171 176 172 #define USB_VENDOR_ID_DRAGONRISE 0x0079 173 + 174 + #define USB_VENDOR_ID_EGALAX 0x0EEF 175 + #define USB_DEVICE_ID_EGALAX_TOUCHCONTROLLER 0x0001 177 176 178 177 #define USB_VENDOR_ID_ELO 0x04E7 179 178 #define USB_DEVICE_ID_ELO_TS2700 0x0020 ··· 416 409 417 410 #define USB_VENDOR_ID_SAMSUNG 0x0419 418 411 #define USB_DEVICE_ID_SAMSUNG_IR_REMOTE 0x0001 412 + #define USB_DEVICE_ID_SAMSUNG_WIRELESS_KBD_MOUSE 0x0600 419 413 420 414 #define USB_VENDOR_ID_SONY 0x054c 421 415 #define USB_DEVICE_ID_SONY_VAIO_VGX_MOUSE 0x024b ··· 465 457 466 458 #define USB_VENDOR_ID_WACOM 0x056a 467 459 #define USB_DEVICE_ID_WACOM_GRAPHIRE_BLUETOOTH 0x81 460 + #define USB_DEVICE_ID_WACOM_INTUOS4_BLUETOOTH 0xbd 468 461 469 462 #define USB_VENDOR_ID_WISEGROUP 0x0925 470 463 #define USB_DEVICE_ID_SMARTJOY_PLUS 0x0005 ··· 483 474 #define USB_DEVICE_ID_YEALINK_P1K_P4K_B2K 0xb001 484 475 485 476 #define USB_VENDOR_ID_ZEROPLUS 0x0c12 477 + 478 + #define USB_VENDOR_ID_ZYDACRON 0x13EC 479 + #define USB_DEVICE_ID_ZYDACRON_REMOTE_CONTROL 0x0006 486 480 487 481 #define USB_VENDOR_ID_KYE 0x0458 488 482 #define USB_DEVICE_ID_KYE_ERGO_525V 0x0087
+9
drivers/hid/hid-lg.c
··· 126 126 case 0x1004: lg_map_key_clear(KEY_VIDEO); break; 127 127 case 0x1005: lg_map_key_clear(KEY_AUDIO); break; 128 128 case 0x100a: lg_map_key_clear(KEY_DOCUMENTS); break; 129 + /* The following two entries are Playlist 1 and 2 on the MX3200 */ 130 + case 0x100f: lg_map_key_clear(KEY_FN_1); break; 131 + case 0x1010: lg_map_key_clear(KEY_FN_2); break; 129 132 case 0x1011: lg_map_key_clear(KEY_PREVIOUSSONG); break; 130 133 case 0x1012: lg_map_key_clear(KEY_NEXTSONG); break; 131 134 case 0x1013: lg_map_key_clear(KEY_CAMERA); break; ··· 140 137 case 0x1019: lg_map_key_clear(KEY_PROG1); break; 141 138 case 0x101a: lg_map_key_clear(KEY_PROG2); break; 142 139 case 0x101b: lg_map_key_clear(KEY_PROG3); break; 140 + case 0x101c: lg_map_key_clear(KEY_CYCLEWINDOWS); break; 143 141 case 0x101f: lg_map_key_clear(KEY_ZOOMIN); break; 144 142 case 0x1020: lg_map_key_clear(KEY_ZOOMOUT); break; 145 143 case 0x1021: lg_map_key_clear(KEY_ZOOMRESET); break; ··· 151 147 case 0x1029: lg_map_key_clear(KEY_SHUFFLE); break; 152 148 case 0x102a: lg_map_key_clear(KEY_BACK); break; 153 149 case 0x102b: lg_map_key_clear(KEY_CYCLEWINDOWS); break; 150 + case 0x102d: lg_map_key_clear(KEY_WWW); break; 151 + /* The following two are 'Start/answer call' and 'End/reject call' 152 + on the MX3200 */ 153 + case 0x1031: lg_map_key_clear(KEY_OK); break; 154 + case 0x1032: lg_map_key_clear(KEY_CANCEL); break; 154 155 case 0x1041: lg_map_key_clear(KEY_BATTERY); break; 155 156 case 0x1042: lg_map_key_clear(KEY_WORDPROCESSOR); break; 156 157 case 0x1043: lg_map_key_clear(KEY_SPREADSHEET); break;
+83 -12
drivers/hid/hid-samsung.c
··· 7 7 * Copyright (c) 2006-2007 Jiri Kosina 8 8 * Copyright (c) 2007 Paul Walmsley 9 9 * Copyright (c) 2008 Jiri Slaby 10 + * Copyright (c) 2010 Don Prince <dhprince.devel@yahoo.co.uk> 11 + * 12 + * 13 + * This driver supports several HID devices: 14 + * 15 + * [0419:0001] Samsung IrDA remote controller (reports as Cypress USB Mouse). 16 + * various hid report fixups for different variants. 17 + * 18 + * [0419:0600] Creative Desktop Wireless 6000 keyboard/mouse combo 19 + * several key mappings used from the consumer usage page 20 + * deviate from the USB HUT 1.12 standard. 21 + * 10 22 */ 11 23 12 24 /* ··· 29 17 */ 30 18 31 19 #include <linux/device.h> 20 + #include <linux/usb.h> 32 21 #include <linux/hid.h> 33 22 #include <linux/module.h> 34 23 35 24 #include "hid-ids.h" 36 25 37 26 /* 38 - * Samsung IrDA remote controller (reports as Cypress USB Mouse). 39 - * 40 27 * There are several variants for 0419:0001: 41 28 * 42 29 * 1. 184 byte report descriptor ··· 54 43 * 4. 171 byte report descriptor 55 44 * Report #3 has an array field with logical range 0..1 instead of 1..3. 56 45 */ 57 - static inline void samsung_dev_trace(struct hid_device *hdev, 46 + static inline void samsung_irda_dev_trace(struct hid_device *hdev, 58 47 unsigned int rsize) 59 48 { 60 49 dev_info(&hdev->dev, "fixing up Samsung IrDA %d byte report " 61 50 "descriptor\n", rsize); 62 51 } 63 52 64 - static void samsung_report_fixup(struct hid_device *hdev, __u8 *rdesc, 53 + static void samsung_irda_report_fixup(struct hid_device *hdev, __u8 *rdesc, 65 54 unsigned int rsize) 66 55 { 67 56 if (rsize == 184 && rdesc[175] == 0x25 && rdesc[176] == 0x40 && 68 57 rdesc[177] == 0x75 && rdesc[178] == 0x30 && 69 58 rdesc[179] == 0x95 && rdesc[180] == 0x01 && 70 59 rdesc[182] == 0x40) { 71 - samsung_dev_trace(hdev, 184); 60 + samsung_irda_dev_trace(hdev, 184); 72 61 rdesc[176] = 0xff; 73 62 rdesc[178] = 0x08; 74 63 rdesc[180] = 0x06; ··· 76 65 } else 77 66 if (rsize == 203 && rdesc[192] == 0x15 && rdesc[193] == 0x0 && 78 67 rdesc[194] == 0x25 && rdesc[195] == 0x12) { 79 - samsung_dev_trace(hdev, 203); 68 + samsung_irda_dev_trace(hdev, 203); 80 69 rdesc[193] = 0x1; 81 70 rdesc[195] = 0xf; 82 71 } else 83 72 if (rsize == 135 && rdesc[124] == 0x15 && rdesc[125] == 0x0 && 84 73 rdesc[126] == 0x25 && rdesc[127] == 0x11) { 85 - samsung_dev_trace(hdev, 135); 74 + samsung_irda_dev_trace(hdev, 135); 86 75 rdesc[125] = 0x1; 87 76 rdesc[127] = 0xe; 88 77 } else 89 78 if (rsize == 171 && rdesc[160] == 0x15 && rdesc[161] == 0x0 && 90 79 rdesc[162] == 0x25 && rdesc[163] == 0x01) { 91 - samsung_dev_trace(hdev, 171); 80 + samsung_irda_dev_trace(hdev, 171); 92 81 rdesc[161] = 0x1; 93 82 rdesc[163] = 0x3; 94 83 } 84 + } 85 + 86 + #define samsung_kbd_mouse_map_key_clear(c) \ 87 + hid_map_usage_clear(hi, usage, bit, max, EV_KEY, (c)) 88 + 89 + static int samsung_kbd_mouse_input_mapping(struct hid_device *hdev, 90 + struct hid_input *hi, struct hid_field *field, struct hid_usage *usage, 91 + unsigned long **bit, int *max) 92 + { 93 + struct usb_interface *intf = to_usb_interface(hdev->dev.parent); 94 + unsigned short ifnum = intf->cur_altsetting->desc.bInterfaceNumber; 95 + 96 + if (1 != ifnum || HID_UP_CONSUMER != (usage->hid & HID_USAGE_PAGE)) 97 + return 0; 98 + 99 + dbg_hid("samsung wireless keyboard/mouse input mapping event [0x%x]\n", 100 + usage->hid & HID_USAGE); 101 + 102 + switch (usage->hid & HID_USAGE) { 103 + /* report 2 */ 104 + case 0x183: samsung_kbd_mouse_map_key_clear(KEY_MEDIA); break; 105 + case 0x195: samsung_kbd_mouse_map_key_clear(KEY_EMAIL); break; 106 + case 0x196: samsung_kbd_mouse_map_key_clear(KEY_CALC); break; 107 + case 0x197: samsung_kbd_mouse_map_key_clear(KEY_COMPUTER); break; 108 + case 0x22b: samsung_kbd_mouse_map_key_clear(KEY_SEARCH); break; 109 + case 0x22c: samsung_kbd_mouse_map_key_clear(KEY_WWW); break; 110 + case 0x22d: samsung_kbd_mouse_map_key_clear(KEY_BACK); break; 111 + case 0x22e: samsung_kbd_mouse_map_key_clear(KEY_FORWARD); break; 112 + case 0x22f: samsung_kbd_mouse_map_key_clear(KEY_FAVORITES); break; 113 + case 0x230: samsung_kbd_mouse_map_key_clear(KEY_REFRESH); break; 114 + case 0x231: samsung_kbd_mouse_map_key_clear(KEY_STOP); break; 115 + default: 116 + return 0; 117 + } 118 + 119 + return 1; 120 + } 121 + 122 + static void samsung_report_fixup(struct hid_device *hdev, __u8 *rdesc, 123 + unsigned int rsize) 124 + { 125 + if (USB_DEVICE_ID_SAMSUNG_IR_REMOTE == hdev->product) 126 + samsung_irda_report_fixup(hdev, rdesc, rsize); 127 + } 128 + 129 + static int samsung_input_mapping(struct hid_device *hdev, struct hid_input *hi, 130 + struct hid_field *field, struct hid_usage *usage, 131 + unsigned long **bit, int *max) 132 + { 133 + int ret = 0; 134 + 135 + if (USB_DEVICE_ID_SAMSUNG_WIRELESS_KBD_MOUSE == hdev->product) 136 + ret = samsung_kbd_mouse_input_mapping(hdev, 137 + hi, field, usage, bit, max); 138 + 139 + return ret; 95 140 } 96 141 97 142 static int samsung_probe(struct hid_device *hdev, ··· 162 95 goto err_free; 163 96 } 164 97 165 - if (hdev->rsize == 184) { 166 - /* disable hidinput, force hiddev */ 167 - cmask = (cmask & ~HID_CONNECT_HIDINPUT) | 168 - HID_CONNECT_HIDDEV_FORCE; 98 + if (USB_DEVICE_ID_SAMSUNG_IR_REMOTE == hdev->product) { 99 + if (hdev->rsize == 184) { 100 + /* disable hidinput, force hiddev */ 101 + cmask = (cmask & ~HID_CONNECT_HIDINPUT) | 102 + HID_CONNECT_HIDDEV_FORCE; 103 + } 169 104 } 170 105 171 106 ret = hid_hw_start(hdev, cmask); ··· 183 114 184 115 static const struct hid_device_id samsung_devices[] = { 185 116 { HID_USB_DEVICE(USB_VENDOR_ID_SAMSUNG, USB_DEVICE_ID_SAMSUNG_IR_REMOTE) }, 117 + { HID_USB_DEVICE(USB_VENDOR_ID_SAMSUNG, USB_DEVICE_ID_SAMSUNG_WIRELESS_KBD_MOUSE) }, 186 118 { } 187 119 }; 188 120 MODULE_DEVICE_TABLE(hid, samsung_devices); ··· 192 122 .name = "samsung", 193 123 .id_table = samsung_devices, 194 124 .report_fixup = samsung_report_fixup, 125 + .input_mapping = samsung_input_mapping, 195 126 .probe = samsung_probe, 196 127 }; 197 128
+24 -14
drivers/hid/hid-topseed.c
··· 3 3 * 4 4 * Copyright (c) 2008 Lev Babiev 5 5 * based on hid-cherry driver 6 + * 7 + * Modified to also support BTC "Emprex 3009URF III Vista MCE Remote" by 8 + * Wayne Thomas 2010. 6 9 */ 7 10 8 11 /* ··· 27 24 struct hid_field *field, struct hid_usage *usage, 28 25 unsigned long **bit, int *max) 29 26 { 30 - if ((usage->hid & HID_USAGE_PAGE) != 0x0ffbc0000) 27 + if ((usage->hid & HID_USAGE_PAGE) != HID_UP_LOGIVENDOR) 31 28 return 0; 32 29 33 30 switch (usage->hid & HID_USAGE) { 34 - case 0x00d: ts_map_key_clear(KEY_HOME); break; 35 - case 0x024: ts_map_key_clear(KEY_MENU); break; 36 - case 0x025: ts_map_key_clear(KEY_TV); break; 37 - case 0x048: ts_map_key_clear(KEY_RED); break; 38 - case 0x047: ts_map_key_clear(KEY_GREEN); break; 39 - case 0x049: ts_map_key_clear(KEY_YELLOW); break; 40 - case 0x04a: ts_map_key_clear(KEY_BLUE); break; 41 - case 0x04b: ts_map_key_clear(KEY_ANGLE); break; 42 - case 0x04c: ts_map_key_clear(KEY_LANGUAGE); break; 43 - case 0x04d: ts_map_key_clear(KEY_SUBTITLE); break; 44 - case 0x031: ts_map_key_clear(KEY_AUDIO); break; 45 - case 0x032: ts_map_key_clear(KEY_TEXT); break; 46 - case 0x033: ts_map_key_clear(KEY_CHANNEL); break; 31 + case 0x00d: ts_map_key_clear(KEY_MEDIA); break; 32 + case 0x024: ts_map_key_clear(KEY_MENU); break; 33 + case 0x025: ts_map_key_clear(KEY_TV); break; 34 + case 0x031: ts_map_key_clear(KEY_AUDIO); break; 35 + case 0x032: ts_map_key_clear(KEY_TEXT); break; 36 + case 0x033: ts_map_key_clear(KEY_CHANNEL); break; 37 + case 0x047: ts_map_key_clear(KEY_MP3); break; 38 + case 0x048: ts_map_key_clear(KEY_TV2); break; 39 + case 0x049: ts_map_key_clear(KEY_CAMERA); break; 40 + case 0x04a: ts_map_key_clear(KEY_VIDEO); break; 41 + case 0x04b: ts_map_key_clear(KEY_ANGLE); break; 42 + case 0x04c: ts_map_key_clear(KEY_LANGUAGE); break; 43 + case 0x04d: ts_map_key_clear(KEY_SUBTITLE); break; 44 + case 0x050: ts_map_key_clear(KEY_RADIO); break; 45 + case 0x05a: ts_map_key_clear(KEY_TEXT); break; 46 + case 0x05b: ts_map_key_clear(KEY_RED); break; 47 + case 0x05c: ts_map_key_clear(KEY_GREEN); break; 48 + case 0x05d: ts_map_key_clear(KEY_YELLOW); break; 49 + case 0x05e: ts_map_key_clear(KEY_BLUE); break; 47 50 default: 48 51 return 0; 49 52 } ··· 59 50 60 51 static const struct hid_device_id ts_devices[] = { 61 52 { HID_USB_DEVICE(USB_VENDOR_ID_TOPSEED, USB_DEVICE_ID_TOPSEED_CYBERLINK) }, 53 + { HID_USB_DEVICE(USB_VENDOR_ID_BTC, USB_DEVICE_ID_BTC_EMPREX_REMOTE) }, 62 54 { } 63 55 }; 64 56 MODULE_DEVICE_TABLE(hid, ts_devices);
+204 -25
drivers/hid/hid-wacom.c
··· 22 22 #include <linux/hid.h> 23 23 #include <linux/module.h> 24 24 #include <linux/slab.h> 25 + #ifdef CONFIG_HID_WACOM_POWER_SUPPLY 26 + #include <linux/power_supply.h> 27 + #endif 25 28 26 29 #include "hid-ids.h" 27 30 28 31 struct wacom_data { 29 32 __u16 tool; 30 33 unsigned char butstate; 34 + unsigned char high_speed; 35 + #ifdef CONFIG_HID_WACOM_POWER_SUPPLY 36 + int battery_capacity; 37 + struct power_supply battery; 38 + struct power_supply ac; 39 + #endif 31 40 }; 41 + 42 + #ifdef CONFIG_HID_WACOM_POWER_SUPPLY 43 + /*percent of battery capacity, 0 means AC online*/ 44 + static unsigned short batcap[8] = { 1, 15, 25, 35, 50, 70, 100, 0 }; 45 + 46 + static enum power_supply_property wacom_battery_props[] = { 47 + POWER_SUPPLY_PROP_PRESENT, 48 + POWER_SUPPLY_PROP_CAPACITY 49 + }; 50 + 51 + static enum power_supply_property wacom_ac_props[] = { 52 + POWER_SUPPLY_PROP_PRESENT, 53 + POWER_SUPPLY_PROP_ONLINE 54 + }; 55 + 56 + static int wacom_battery_get_property(struct power_supply *psy, 57 + enum power_supply_property psp, 58 + union power_supply_propval *val) 59 + { 60 + struct wacom_data *wdata = container_of(psy, 61 + struct wacom_data, battery); 62 + int power_state = batcap[wdata->battery_capacity]; 63 + int ret = 0; 64 + 65 + switch (psp) { 66 + case POWER_SUPPLY_PROP_PRESENT: 67 + val->intval = 1; 68 + break; 69 + case POWER_SUPPLY_PROP_CAPACITY: 70 + /* show 100% battery capacity when charging */ 71 + if (power_state == 0) 72 + val->intval = 100; 73 + else 74 + val->intval = power_state; 75 + break; 76 + default: 77 + ret = -EINVAL; 78 + break; 79 + } 80 + return ret; 81 + } 82 + 83 + static int wacom_ac_get_property(struct power_supply *psy, 84 + enum power_supply_property psp, 85 + union power_supply_propval *val) 86 + { 87 + struct wacom_data *wdata = container_of(psy, struct wacom_data, ac); 88 + int power_state = batcap[wdata->battery_capacity]; 89 + int ret = 0; 90 + 91 + switch (psp) { 92 + case POWER_SUPPLY_PROP_PRESENT: 93 + /* fall through */ 94 + case POWER_SUPPLY_PROP_ONLINE: 95 + if (power_state == 0) 96 + val->intval = 1; 97 + else 98 + val->intval = 0; 99 + break; 100 + default: 101 + ret = -EINVAL; 102 + break; 103 + } 104 + return ret; 105 + } 106 + #endif 107 + 108 + static void wacom_poke(struct hid_device *hdev, u8 speed) 109 + { 110 + struct wacom_data *wdata = hid_get_drvdata(hdev); 111 + int limit, ret; 112 + char rep_data[2]; 113 + 114 + rep_data[0] = 0x03 ; rep_data[1] = 0x00; 115 + limit = 3; 116 + do { 117 + ret = hdev->hid_output_raw_report(hdev, rep_data, 2, 118 + HID_FEATURE_REPORT); 119 + } while (ret < 0 && limit-- > 0); 120 + 121 + if (ret >= 0) { 122 + if (speed == 0) 123 + rep_data[0] = 0x05; 124 + else 125 + rep_data[0] = 0x06; 126 + 127 + rep_data[1] = 0x00; 128 + limit = 3; 129 + do { 130 + ret = hdev->hid_output_raw_report(hdev, rep_data, 2, 131 + HID_FEATURE_REPORT); 132 + } while (ret < 0 && limit-- > 0); 133 + 134 + if (ret >= 0) { 135 + wdata->high_speed = speed; 136 + return; 137 + } 138 + } 139 + 140 + /* 141 + * Note that if the raw queries fail, it's not a hard failure and it 142 + * is safe to continue 143 + */ 144 + dev_warn(&hdev->dev, "failed to poke device, command %d, err %d\n", 145 + rep_data[0], ret); 146 + return; 147 + } 148 + 149 + static ssize_t wacom_show_speed(struct device *dev, 150 + struct device_attribute 151 + *attr, char *buf) 152 + { 153 + struct wacom_data *wdata = dev_get_drvdata(dev); 154 + 155 + return snprintf(buf, PAGE_SIZE, "%i\n", wdata->high_speed); 156 + } 157 + 158 + static ssize_t wacom_store_speed(struct device *dev, 159 + struct device_attribute *attr, 160 + const char *buf, size_t count) 161 + { 162 + struct hid_device *hdev = container_of(dev, struct hid_device, dev); 163 + int new_speed; 164 + 165 + if (sscanf(buf, "%1d", &new_speed ) != 1) 166 + return -EINVAL; 167 + 168 + if (new_speed == 0 || new_speed == 1) { 169 + wacom_poke(hdev, new_speed); 170 + return strnlen(buf, PAGE_SIZE); 171 + } else 172 + return -EINVAL; 173 + } 174 + 175 + static DEVICE_ATTR(speed, S_IRUGO | S_IWUGO, 176 + wacom_show_speed, wacom_store_speed); 32 177 33 178 static int wacom_raw_event(struct hid_device *hdev, struct hid_report *report, 34 179 u8 *raw_data, int size) ··· 293 148 input_sync(input); 294 149 } 295 150 151 + #ifdef CONFIG_HID_WACOM_POWER_SUPPLY 152 + /* Store current battery capacity */ 153 + rw = (data[7] >> 2 & 0x07); 154 + if (rw != wdata->battery_capacity) 155 + wdata->battery_capacity = rw; 156 + #endif 296 157 return 1; 297 158 } 298 159 ··· 308 157 struct hid_input *hidinput; 309 158 struct input_dev *input; 310 159 struct wacom_data *wdata; 311 - char rep_data[2]; 312 160 int ret; 313 - int limit; 314 161 315 162 wdata = kzalloc(sizeof(*wdata), GFP_KERNEL); 316 163 if (wdata == NULL) { ··· 331 182 goto err_free; 332 183 } 333 184 334 - /* 335 - * Note that if the raw queries fail, it's not a hard failure and it 336 - * is safe to continue 337 - */ 185 + ret = device_create_file(&hdev->dev, &dev_attr_speed); 186 + if (ret) 187 + dev_warn(&hdev->dev, 188 + "can't create sysfs speed attribute err: %d\n", ret); 338 189 339 - /* Set Wacom mode2 */ 340 - rep_data[0] = 0x03; rep_data[1] = 0x00; 341 - limit = 3; 342 - do { 343 - ret = hdev->hid_output_raw_report(hdev, rep_data, 2, 344 - HID_FEATURE_REPORT); 345 - } while (ret < 0 && limit-- > 0); 346 - if (ret < 0) 347 - dev_warn(&hdev->dev, "failed to poke device #1, %d\n", ret); 190 + /* Set Wacom mode 2 with high reporting speed */ 191 + wacom_poke(hdev, 1); 348 192 349 - /* 0x06 - high reporting speed, 0x05 - low speed */ 350 - rep_data[0] = 0x06; rep_data[1] = 0x00; 351 - limit = 3; 352 - do { 353 - ret = hdev->hid_output_raw_report(hdev, rep_data, 2, 354 - HID_FEATURE_REPORT); 355 - } while (ret < 0 && limit-- > 0); 356 - if (ret < 0) 357 - dev_warn(&hdev->dev, "failed to poke device #2, %d\n", ret); 193 + #ifdef CONFIG_HID_WACOM_POWER_SUPPLY 194 + wdata->battery.properties = wacom_battery_props; 195 + wdata->battery.num_properties = ARRAY_SIZE(wacom_battery_props); 196 + wdata->battery.get_property = wacom_battery_get_property; 197 + wdata->battery.name = "wacom_battery"; 198 + wdata->battery.type = POWER_SUPPLY_TYPE_BATTERY; 199 + wdata->battery.use_for_apm = 0; 358 200 201 + ret = power_supply_register(&hdev->dev, &wdata->battery); 202 + if (ret) { 203 + dev_warn(&hdev->dev, 204 + "can't create sysfs battery attribute, err: %d\n", ret); 205 + /* 206 + * battery attribute is not critical for the tablet, but if it 207 + * failed then there is no need to create ac attribute 208 + */ 209 + goto move_on; 210 + } 211 + 212 + wdata->ac.properties = wacom_ac_props; 213 + wdata->ac.num_properties = ARRAY_SIZE(wacom_ac_props); 214 + wdata->ac.get_property = wacom_ac_get_property; 215 + wdata->ac.name = "wacom_ac"; 216 + wdata->ac.type = POWER_SUPPLY_TYPE_MAINS; 217 + wdata->ac.use_for_apm = 0; 218 + 219 + ret = power_supply_register(&hdev->dev, &wdata->ac); 220 + if (ret) { 221 + dev_warn(&hdev->dev, 222 + "can't create ac battery attribute, err: %d\n", ret); 223 + /* 224 + * ac attribute is not critical for the tablet, but if it 225 + * failed then we don't want to battery attribute to exist 226 + */ 227 + power_supply_unregister(&wdata->battery); 228 + } 229 + 230 + move_on: 231 + #endif 359 232 hidinput = list_entry(hdev->inputs.next, struct hid_input, list); 360 233 input = hidinput->input; 361 234 ··· 422 251 423 252 static void wacom_remove(struct hid_device *hdev) 424 253 { 254 + #ifdef CONFIG_HID_WACOM_POWER_SUPPLY 255 + struct wacom_data *wdata = hid_get_drvdata(hdev); 256 + #endif 425 257 hid_hw_stop(hdev); 258 + 259 + #ifdef CONFIG_HID_WACOM_POWER_SUPPLY 260 + power_supply_unregister(&wdata->battery); 261 + power_supply_unregister(&wdata->ac); 262 + #endif 426 263 kfree(hid_get_drvdata(hdev)); 427 264 } 428 265 429 266 static const struct hid_device_id wacom_devices[] = { 430 267 { HID_BLUETOOTH_DEVICE(USB_VENDOR_ID_WACOM, USB_DEVICE_ID_WACOM_GRAPHIRE_BLUETOOTH) }, 431 - 268 + { HID_BLUETOOTH_DEVICE(USB_VENDOR_ID_WACOM, USB_DEVICE_ID_WACOM_INTUOS4_BLUETOOTH) }, 432 269 { } 433 270 }; 434 271 MODULE_DEVICE_TABLE(hid, wacom_devices);
+237
drivers/hid/hid-zydacron.c
··· 1 + /* 2 + * HID driver for zydacron remote control 3 + * 4 + * Copyright (c) 2010 Don Prince <dhprince.devel@yahoo.co.uk> 5 + */ 6 + 7 + /* 8 + * This program is free software; you can redistribute it and/or modify it 9 + * under the terms of the GNU General Public License as published by the Free 10 + * Software Foundation; either version 2 of the License, or (at your option) 11 + * any later version. 12 + */ 13 + 14 + #include <linux/device.h> 15 + #include <linux/hid.h> 16 + #include <linux/module.h> 17 + 18 + #include "hid-ids.h" 19 + 20 + struct zc_device { 21 + struct input_dev *input_ep81; 22 + unsigned short last_key[4]; 23 + }; 24 + 25 + 26 + /* 27 + * Zydacron remote control has an invalid HID report descriptor, 28 + * that needs fixing before we can parse it. 29 + */ 30 + static void zc_report_fixup(struct hid_device *hdev, __u8 *rdesc, 31 + unsigned int rsize) 32 + { 33 + if (rsize >= 253 && 34 + rdesc[0x96] == 0xbc && rdesc[0x97] == 0xff && 35 + rdesc[0xca] == 0xbc && rdesc[0xcb] == 0xff && 36 + rdesc[0xe1] == 0xbc && rdesc[0xe2] == 0xff) { 37 + dev_info(&hdev->dev, 38 + "fixing up zydacron remote control report " 39 + "descriptor\n"); 40 + rdesc[0x96] = rdesc[0xca] = rdesc[0xe1] = 0x0c; 41 + rdesc[0x97] = rdesc[0xcb] = rdesc[0xe2] = 0x00; 42 + } 43 + } 44 + 45 + #define zc_map_key_clear(c) \ 46 + hid_map_usage_clear(hi, usage, bit, max, EV_KEY, (c)) 47 + 48 + static int zc_input_mapping(struct hid_device *hdev, struct hid_input *hi, 49 + struct hid_field *field, struct hid_usage *usage, 50 + unsigned long **bit, int *max) 51 + { 52 + int i; 53 + struct zc_device *zc = hid_get_drvdata(hdev); 54 + zc->input_ep81 = hi->input; 55 + 56 + if ((usage->hid & HID_USAGE_PAGE) != HID_UP_CONSUMER) 57 + return 0; 58 + 59 + dbg_hid("zynacron input mapping event [0x%x]\n", 60 + usage->hid & HID_USAGE); 61 + 62 + switch (usage->hid & HID_USAGE) { 63 + /* report 2 */ 64 + case 0x10: 65 + zc_map_key_clear(KEY_MODE); 66 + break; 67 + case 0x30: 68 + zc_map_key_clear(KEY_SCREEN); 69 + break; 70 + case 0x70: 71 + zc_map_key_clear(KEY_INFO); 72 + break; 73 + /* report 3 */ 74 + case 0x04: 75 + zc_map_key_clear(KEY_RADIO); 76 + break; 77 + /* report 4 */ 78 + case 0x0d: 79 + zc_map_key_clear(KEY_PVR); 80 + break; 81 + case 0x25: 82 + zc_map_key_clear(KEY_TV); 83 + break; 84 + case 0x47: 85 + zc_map_key_clear(KEY_AUDIO); 86 + break; 87 + case 0x49: 88 + zc_map_key_clear(KEY_AUX); 89 + break; 90 + case 0x4a: 91 + zc_map_key_clear(KEY_VIDEO); 92 + break; 93 + case 0x48: 94 + zc_map_key_clear(KEY_DVD); 95 + break; 96 + case 0x24: 97 + zc_map_key_clear(KEY_MENU); 98 + break; 99 + case 0x32: 100 + zc_map_key_clear(KEY_TEXT); 101 + break; 102 + default: 103 + return 0; 104 + } 105 + 106 + for (i = 0; i < 4; i++) 107 + zc->last_key[i] = 0; 108 + 109 + return 1; 110 + } 111 + 112 + static int zc_raw_event(struct hid_device *hdev, struct hid_report *report, 113 + u8 *data, int size) 114 + { 115 + struct zc_device *zc = hid_get_drvdata(hdev); 116 + int ret = 0; 117 + unsigned key; 118 + unsigned short index; 119 + 120 + if (report->id == data[0]) { 121 + 122 + /* break keys */ 123 + for (index = 0; index < 4; index++) { 124 + key = zc->last_key[index]; 125 + if (key) { 126 + input_event(zc->input_ep81, EV_KEY, key, 0); 127 + zc->last_key[index] = 0; 128 + } 129 + } 130 + 131 + key = 0; 132 + switch (report->id) { 133 + case 0x02: 134 + case 0x03: 135 + switch (data[1]) { 136 + case 0x10: 137 + key = KEY_MODE; 138 + index = 0; 139 + break; 140 + case 0x30: 141 + key = KEY_SCREEN; 142 + index = 1; 143 + break; 144 + case 0x70: 145 + key = KEY_INFO; 146 + index = 2; 147 + break; 148 + case 0x04: 149 + key = KEY_RADIO; 150 + index = 3; 151 + break; 152 + } 153 + 154 + if (key) { 155 + input_event(zc->input_ep81, EV_KEY, key, 1); 156 + zc->last_key[index] = key; 157 + } 158 + 159 + ret = 1; 160 + break; 161 + } 162 + } 163 + 164 + return ret; 165 + } 166 + 167 + static int zc_probe(struct hid_device *hdev, const struct hid_device_id *id) 168 + { 169 + int ret; 170 + struct zc_device *zc; 171 + 172 + zc = kzalloc(sizeof(*zc), GFP_KERNEL); 173 + if (zc == NULL) { 174 + dev_err(&hdev->dev, "zydacron: can't alloc descriptor\n"); 175 + return -ENOMEM; 176 + } 177 + 178 + hid_set_drvdata(hdev, zc); 179 + 180 + ret = hid_parse(hdev); 181 + if (ret) { 182 + dev_err(&hdev->dev, "zydacron: parse failed\n"); 183 + goto err_free; 184 + } 185 + 186 + ret = hid_hw_start(hdev, HID_CONNECT_DEFAULT); 187 + if (ret) { 188 + dev_err(&hdev->dev, "zydacron: hw start failed\n"); 189 + goto err_free; 190 + } 191 + 192 + return 0; 193 + err_free: 194 + kfree(zc); 195 + 196 + return ret; 197 + } 198 + 199 + static void zc_remove(struct hid_device *hdev) 200 + { 201 + struct zc_device *zc = hid_get_drvdata(hdev); 202 + 203 + hid_hw_stop(hdev); 204 + 205 + if (NULL != zc) 206 + kfree(zc); 207 + } 208 + 209 + static const struct hid_device_id zc_devices[] = { 210 + { HID_USB_DEVICE(USB_VENDOR_ID_ZYDACRON, USB_DEVICE_ID_ZYDACRON_REMOTE_CONTROL) }, 211 + { } 212 + }; 213 + MODULE_DEVICE_TABLE(hid, zc_devices); 214 + 215 + static struct hid_driver zc_driver = { 216 + .name = "zydacron", 217 + .id_table = zc_devices, 218 + .report_fixup = zc_report_fixup, 219 + .input_mapping = zc_input_mapping, 220 + .raw_event = zc_raw_event, 221 + .probe = zc_probe, 222 + .remove = zc_remove, 223 + }; 224 + 225 + static int __init zc_init(void) 226 + { 227 + return hid_register_driver(&zc_driver); 228 + } 229 + 230 + static void __exit zc_exit(void) 231 + { 232 + hid_unregister_driver(&zc_driver); 233 + } 234 + 235 + module_init(zc_init); 236 + module_exit(zc_exit); 237 + MODULE_LICENSE("GPL");
+1 -1
drivers/hid/hidraw.c
··· 311 311 -EFAULT : len; 312 312 break; 313 313 } 314 - } 314 + } 315 315 316 316 ret = -ENOTTY; 317 317 }
+36 -12
drivers/hid/usbhid/hid-core.c
··· 807 807 struct usb_host_interface *interface = intf->cur_altsetting; 808 808 int ret; 809 809 810 - ret = usb_control_msg(dev, usb_sndctrlpipe(dev, 0), 811 - HID_REQ_SET_REPORT, 812 - USB_DIR_OUT | USB_TYPE_CLASS | USB_RECIP_INTERFACE, 813 - ((report_type + 1) << 8) | *buf, 814 - interface->desc.bInterfaceNumber, buf + 1, count - 1, 815 - USB_CTRL_SET_TIMEOUT); 816 - 817 - /* count also the report id */ 818 - if (ret > 0) 819 - ret++; 810 + if (usbhid->urbout) { 811 + int actual_length; 812 + int skipped_report_id = 0; 813 + if (buf[0] == 0x0) { 814 + /* Don't send the Report ID */ 815 + buf++; 816 + count--; 817 + skipped_report_id = 1; 818 + } 819 + ret = usb_interrupt_msg(dev, usbhid->urbout->pipe, 820 + buf, count, &actual_length, 821 + USB_CTRL_SET_TIMEOUT); 822 + /* return the number of bytes transferred */ 823 + if (ret == 0) { 824 + ret = actual_length; 825 + /* count also the report id */ 826 + if (skipped_report_id) 827 + ret++; 828 + } 829 + } else { 830 + ret = usb_control_msg(dev, usb_sndctrlpipe(dev, 0), 831 + HID_REQ_SET_REPORT, 832 + USB_DIR_OUT | USB_TYPE_CLASS | USB_RECIP_INTERFACE, 833 + ((report_type + 1) << 8) | *buf, 834 + interface->desc.bInterfaceNumber, buf + 1, count - 1, 835 + USB_CTRL_SET_TIMEOUT); 836 + /* count also the report id */ 837 + if (ret > 0) 838 + ret++; 839 + } 820 840 821 841 return ret; 822 842 } ··· 1039 1019 /* Some keyboards don't work until their LEDs have been set. 1040 1020 * Since BIOSes do set the LEDs, it must be safe for any device 1041 1021 * that supports the keyboard boot protocol. 1022 + * In addition, enable remote wakeup by default for all keyboard 1023 + * devices supporting the boot protocol. 1042 1024 */ 1043 1025 if (interface->desc.bInterfaceSubClass == USB_INTERFACE_SUBCLASS_BOOT && 1044 1026 interface->desc.bInterfaceProtocol == 1045 - USB_INTERFACE_PROTOCOL_KEYBOARD) 1027 + USB_INTERFACE_PROTOCOL_KEYBOARD) { 1046 1028 usbhid_set_leds(hid); 1047 - 1029 + device_set_wakeup_enable(&dev->dev, 1); 1030 + } 1048 1031 return 0; 1049 1032 1050 1033 fail: ··· 1156 1133 hid->vendor = le16_to_cpu(dev->descriptor.idVendor); 1157 1134 hid->product = le16_to_cpu(dev->descriptor.idProduct); 1158 1135 hid->name[0] = 0; 1136 + hid->quirks = usbhid_lookup_quirk(hid->vendor, hid->product); 1159 1137 if (intf->cur_altsetting->desc.bInterfaceProtocol == 1160 1138 USB_INTERFACE_PROTOCOL_MOUSE) 1161 1139 hid->type = HID_TYPE_USBMOUSE;
+1
drivers/hid/usbhid/hid-quirks.c
··· 33 33 { USB_VENDOR_ID_AASHIMA, USB_DEVICE_ID_AASHIMA_PREDATOR, HID_QUIRK_BADPAD }, 34 34 { USB_VENDOR_ID_ALPS, USB_DEVICE_ID_IBM_GAMEPAD, HID_QUIRK_BADPAD }, 35 35 { USB_VENDOR_ID_CHIC, USB_DEVICE_ID_CHIC_GAMEPAD, HID_QUIRK_BADPAD }, 36 + { USB_VENDOR_ID_EGALAX, USB_DEVICE_ID_EGALAX_TOUCHCONTROLLER, HID_QUIRK_MULTI_INPUT }, 36 37 { USB_VENDOR_ID_HAPP, USB_DEVICE_ID_UGCI_DRIVING, HID_QUIRK_BADPAD | HID_QUIRK_MULTI_INPUT }, 37 38 { USB_VENDOR_ID_HAPP, USB_DEVICE_ID_UGCI_FLYING, HID_QUIRK_BADPAD | HID_QUIRK_MULTI_INPUT }, 38 39 { USB_VENDOR_ID_HAPP, USB_DEVICE_ID_UGCI_FIGHTING, HID_QUIRK_BADPAD | HID_QUIRK_MULTI_INPUT },
+1
drivers/hid/usbhid/usbkbd.c
··· 313 313 goto fail2; 314 314 315 315 usb_set_intfdata(iface, kbd); 316 + device_set_wakeup_enable(&dev->dev, 1); 316 317 return 0; 317 318 318 319 fail2:
+2
include/linux/hid.h
··· 308 308 #define HID_QUIRK_NOTOUCH 0x00000002 309 309 #define HID_QUIRK_IGNORE 0x00000004 310 310 #define HID_QUIRK_NOGET 0x00000008 311 + #define HID_QUIRK_HIDDEV_FORCE 0x00000010 311 312 #define HID_QUIRK_BADPAD 0x00000020 312 313 #define HID_QUIRK_MULTI_INPUT 0x00000040 313 314 #define HID_QUIRK_SKIP_OUTPUT_REPORTS 0x00010000 314 315 #define HID_QUIRK_FULLSPEED_INTERVAL 0x10000000 315 316 #define HID_QUIRK_NO_INIT_REPORTS 0x20000000 317 + #define HID_QUIRK_NO_IGNORE 0x40000000 316 318 317 319 /* 318 320 * This is the global environment of the parser. This information is