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

Merge branch 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/jikos/hid

Pull HID subsystem updates from Jiri Kosina:
"HID subsystem and drivers update. Highlights:

- new support of a group of Win7/Win8 multitouch devices, from
Benjamin Tissoires

- fix for compat interface brokenness in uhid, from Dmitry Torokhov

- conversion of drivers to use hid_driver helper, by H Hartley
Sweeten

- HID over I2C transport received ACPI enumeration support, written
by Mika Westerberg

- there is an ongoing effort to make HID sensor hubs independent of
USB transport. The first self-contained part of this work is
provided here, done by Mika Westerberg

- a few smaller fixes here and there, support for a couple new
devices added"

* 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/jikos/hid: (43 commits)
HID: Correct Logitech order in hid-ids.h
HID: LG4FF: Remove unnecessary deadzone code
HID: LG: Prevent the Logitech Gaming Wheels deadzone
HID: LG: Fix detection of Logitech Speed Force Wireless (WiiWheel)
HID: LG: Add support for Logitech Momo Force (Red) Wheel
HID: hidraw: print message when succesfully initialized
HID: logitech: split accel, brake for Driving Force wheel
HID: logitech: add report descriptor for Driving Force wheel
HID: add ThingM blink(1) USB RGB LED support
HID: uhid: make creating devices work on 64/32 systems
HID: wiimote: fix nunchuck button parser
HID: blacklist Velleman data acquisition boards
HID: sensor-hub: don't limit the driver only to USB bus
HID: sensor-hub: get rid of unused sensor_hub_grabbed_usages[] table
HID: extend autodetect to handle I2C sensors as well
HID: ntrig: use input_configured() callback to set the name
HID: multitouch: do not use pointers towards hid-core
HID: add missing GENERIC_HARDIRQ dependency
HID: multitouch: make MT_CLS_ALWAYS_TRUE the new default class
HID: multitouch: fix protocol for Elo panels
...

+1405 -824
+21
Documentation/ABI/testing/sysfs-driver-hid-srws1
··· 1 + What: /sys/class/leds/SRWS1::<serial>::RPM1 2 + What: /sys/class/leds/SRWS1::<serial>::RPM2 3 + What: /sys/class/leds/SRWS1::<serial>::RPM3 4 + What: /sys/class/leds/SRWS1::<serial>::RPM4 5 + What: /sys/class/leds/SRWS1::<serial>::RPM5 6 + What: /sys/class/leds/SRWS1::<serial>::RPM6 7 + What: /sys/class/leds/SRWS1::<serial>::RPM7 8 + What: /sys/class/leds/SRWS1::<serial>::RPM8 9 + What: /sys/class/leds/SRWS1::<serial>::RPM9 10 + What: /sys/class/leds/SRWS1::<serial>::RPM10 11 + What: /sys/class/leds/SRWS1::<serial>::RPM11 12 + What: /sys/class/leds/SRWS1::<serial>::RPM12 13 + What: /sys/class/leds/SRWS1::<serial>::RPM13 14 + What: /sys/class/leds/SRWS1::<serial>::RPM14 15 + What: /sys/class/leds/SRWS1::<serial>::RPM15 16 + What: /sys/class/leds/SRWS1::<serial>::RPMALL 17 + Date: Jan 2013 18 + KernelVersion: 3.9 19 + Contact: Simon Wood <simon@mungewell.org> 20 + Description: Provides a control for turning on/off the LEDs which form 21 + an RPM meter on the front of the controller
+23
Documentation/ABI/testing/sysfs-driver-hid-thingm
··· 1 + What: /sys/class/leds/blink1::<serial>/rgb 2 + Date: January 2013 3 + Contact: Vivien Didelot <vivien.didelot@savoirfairelinux.com> 4 + Description: The ThingM blink1 is an USB RGB LED. The color notation is 5 + 3-byte hexadecimal. Read this attribute to get the last set 6 + color. Write the 24-bit hexadecimal color to change the current 7 + LED color. The default color is full white (0xFFFFFF). 8 + For instance, set the color to green with: echo 00FF00 > rgb 9 + 10 + What: /sys/class/leds/blink1::<serial>/fade 11 + Date: January 2013 12 + Contact: Vivien Didelot <vivien.didelot@savoirfairelinux.com> 13 + Description: This attribute allows to set a fade time in milliseconds for 14 + the next color change. Read the attribute to know the current 15 + fade time. The default value is set to 0 (no fade time). For 16 + instance, set a fade time of 2 seconds with: echo 2000 > fade 17 + 18 + What: /sys/class/leds/blink1::<serial>/play 19 + Date: January 2013 20 + Contact: Vivien Didelot <vivien.didelot@savoirfairelinux.com> 21 + Description: This attribute is used to play/pause the light patterns. Write 1 22 + to start playing, 0 to stop. Reading this attribute returns the 23 + current playing status.
+5
MAINTAINERS
··· 7611 7611 F: drivers/thermal/ 7612 7612 F: include/linux/thermal.h 7613 7613 7614 + THINGM BLINK(1) USB RGB LED DRIVER 7615 + M: Vivien Didelot <vivien.didelot@savoirfairelinux.com> 7616 + S: Maintained 7617 + F: drivers/hid/hid-thingm.c 7618 + 7614 7619 THINKPAD ACPI EXTRAS DRIVER 7615 7620 M: Henrique de Moraes Holschuh <ibm-acpi@hmh.eng.br> 7616 7621 L: ibm-acpi-devel@lists.sourceforge.net
+17 -1
drivers/hid/Kconfig
··· 596 596 ---help--- 597 597 Support for Speedlink Vicious and Divine Cezanne mouse. 598 598 599 + config HID_STEELSERIES 600 + tristate "Steelseries SRW-S1 steering wheel support" 601 + depends on USB_HID 602 + ---help--- 603 + Support for Steelseries SRW-S1 steering wheel 604 + 599 605 config HID_SUNPLUS 600 606 tristate "Sunplus wireless desktop" 601 607 depends on USB_HID ··· 660 654 ---help--- 661 655 Say Y if you have a TopSeed Cyberlink or BTC Emprex or Conceptronic 662 656 CLLRCMCE remote control. 657 + 658 + config HID_THINGM 659 + tristate "ThingM blink(1) USB RGB LED" 660 + depends on USB_HID 661 + depends on LEDS_CLASS 662 + ---help--- 663 + Support for the ThingM blink(1) USB RGB LED. This driver registers a 664 + Linux LED class instance, plus additional sysfs attributes to control 665 + RGB colors, fade time and playing. The device is exposed through hidraw 666 + to access other functions. 663 667 664 668 config HID_THRUSTMASTER 665 669 tristate "ThrustMaster devices support" ··· 735 719 736 720 config HID_SENSOR_HUB 737 721 tristate "HID Sensors framework support" 738 - depends on USB_HID 722 + depends on USB_HID && GENERIC_HARDIRQS 739 723 select MFD_CORE 740 724 default n 741 725 -- help---
+2
drivers/hid/Makefile
··· 101 101 obj-$(CONFIG_HID_SMARTJOYPLUS) += hid-sjoy.o 102 102 obj-$(CONFIG_HID_SONY) += hid-sony.o 103 103 obj-$(CONFIG_HID_SPEEDLINK) += hid-speedlink.o 104 + obj-$(CONFIG_HID_STEELSERIES) += hid-steelseries.o 104 105 obj-$(CONFIG_HID_SUNPLUS) += hid-sunplus.o 105 106 obj-$(CONFIG_HID_GREENASIA) += hid-gaff.o 107 + obj-$(CONFIG_HID_THINGM) += hid-thingm.o 106 108 obj-$(CONFIG_HID_THRUSTMASTER) += hid-tmff.o 107 109 obj-$(CONFIG_HID_TIVO) += hid-tivo.o 108 110 obj-$(CONFIG_HID_TOPSEED) += hid-topseed.o
+1 -12
drivers/hid/hid-a4tech.c
··· 146 146 .probe = a4_probe, 147 147 .remove = a4_remove, 148 148 }; 149 + module_hid_driver(a4_driver); 149 150 150 - static int __init a4_init(void) 151 - { 152 - return hid_register_driver(&a4_driver); 153 - } 154 - 155 - static void __exit a4_exit(void) 156 - { 157 - hid_unregister_driver(&a4_driver); 158 - } 159 - 160 - module_init(a4_init); 161 - module_exit(a4_exit); 162 151 MODULE_LICENSE("GPL");
+1 -18
drivers/hid/hid-apple.c
··· 555 555 .input_mapping = apple_input_mapping, 556 556 .input_mapped = apple_input_mapped, 557 557 }; 558 + module_hid_driver(apple_driver); 558 559 559 - static int __init apple_init(void) 560 - { 561 - int ret; 562 - 563 - ret = hid_register_driver(&apple_driver); 564 - if (ret) 565 - pr_err("can't register apple driver\n"); 566 - 567 - return ret; 568 - } 569 - 570 - static void __exit apple_exit(void) 571 - { 572 - hid_unregister_driver(&apple_driver); 573 - } 574 - 575 - module_init(apple_init); 576 - module_exit(apple_exit); 577 560 MODULE_LICENSE("GPL");
+1 -12
drivers/hid/hid-aureal.c
··· 37 37 .id_table = aureal_devices, 38 38 .report_fixup = aureal_report_fixup, 39 39 }; 40 + module_hid_driver(aureal_driver); 40 41 41 - static int __init aureal_init(void) 42 - { 43 - return hid_register_driver(&aureal_driver); 44 - } 45 - 46 - static void __exit aureal_exit(void) 47 - { 48 - hid_unregister_driver(&aureal_driver); 49 - } 50 - 51 - module_init(aureal_init); 52 - module_exit(aureal_exit); 53 42 MODULE_LICENSE("GPL");
+1 -13
drivers/hid/hid-axff.c
··· 192 192 .probe = ax_probe, 193 193 .remove = ax_remove, 194 194 }; 195 - 196 - static int __init ax_init(void) 197 - { 198 - return hid_register_driver(&ax_driver); 199 - } 200 - 201 - static void __exit ax_exit(void) 202 - { 203 - hid_unregister_driver(&ax_driver); 204 - } 205 - 206 - module_init(ax_init); 207 - module_exit(ax_exit); 195 + module_hid_driver(ax_driver); 208 196 209 197 MODULE_AUTHOR("Sergei Kolzun"); 210 198 MODULE_DESCRIPTION("Force feedback support for ACRUX game controllers");
+1 -12
drivers/hid/hid-belkin.c
··· 86 86 .input_mapping = belkin_input_mapping, 87 87 .probe = belkin_probe, 88 88 }; 89 + module_hid_driver(belkin_driver); 89 90 90 - static int __init belkin_init(void) 91 - { 92 - return hid_register_driver(&belkin_driver); 93 - } 94 - 95 - static void __exit belkin_exit(void) 96 - { 97 - hid_unregister_driver(&belkin_driver); 98 - } 99 - 100 - module_init(belkin_init); 101 - module_exit(belkin_exit); 102 91 MODULE_LICENSE("GPL");
+1 -12
drivers/hid/hid-cherry.c
··· 69 69 .report_fixup = ch_report_fixup, 70 70 .input_mapping = ch_input_mapping, 71 71 }; 72 + module_hid_driver(ch_driver); 72 73 73 - static int __init ch_init(void) 74 - { 75 - return hid_register_driver(&ch_driver); 76 - } 77 - 78 - static void __exit ch_exit(void) 79 - { 80 - hid_unregister_driver(&ch_driver); 81 - } 82 - 83 - module_init(ch_init); 84 - module_exit(ch_exit); 85 74 MODULE_LICENSE("GPL");
+1 -12
drivers/hid/hid-chicony.c
··· 70 70 .id_table = ch_devices, 71 71 .input_mapping = ch_input_mapping, 72 72 }; 73 + module_hid_driver(ch_driver); 73 74 74 - static int __init ch_init(void) 75 - { 76 - return hid_register_driver(&ch_driver); 77 - } 78 - 79 - static void __exit ch_exit(void) 80 - { 81 - hid_unregister_driver(&ch_driver); 82 - } 83 - 84 - module_init(ch_init); 85 - module_exit(ch_exit); 86 75 MODULE_LICENSE("GPL");
+16 -1
drivers/hid/hid-core.c
··· 729 729 item.type == HID_ITEM_TYPE_MAIN && 730 730 item.tag == HID_MAIN_ITEM_TAG_BEGIN_COLLECTION && 731 731 (item_udata(&item) & 0xff) == HID_COLLECTION_PHYSICAL && 732 - hid->bus == BUS_USB) 732 + (hid->bus == BUS_USB || hid->bus == BUS_I2C)) 733 733 hid->group = HID_GROUP_SENSOR_HUB; 734 734 } 735 735 ··· 1195 1195 { 1196 1196 struct hid_report_enum *report_enum = hid->report_enum + type; 1197 1197 struct hid_report *report; 1198 + struct hid_driver *hdrv; 1198 1199 unsigned int a; 1199 1200 int rsize, csize = size; 1200 1201 u8 *cdata = data; ··· 1232 1231 if (hid->claimed != HID_CLAIMED_HIDRAW) { 1233 1232 for (a = 0; a < report->maxfield; a++) 1234 1233 hid_input_field(hid, report->field[a], cdata, interrupt); 1234 + hdrv = hid->driver; 1235 + if (hdrv && hdrv->report) 1236 + hdrv->report(hid, report); 1235 1237 } 1236 1238 1237 1239 if (hid->claimed & HID_CLAIMED_INPUT) ··· 1603 1599 { HID_USB_DEVICE(USB_VENDOR_ID_GYRATION, USB_DEVICE_ID_GYRATION_REMOTE_3) }, 1604 1600 { HID_USB_DEVICE(USB_VENDOR_ID_HOLTEK, USB_DEVICE_ID_HOLTEK_ON_LINE_GRIP) }, 1605 1601 { HID_USB_DEVICE(USB_VENDOR_ID_HOLTEK_ALT, USB_DEVICE_ID_HOLTEK_ALT_KEYBOARD) }, 1602 + { HID_USB_DEVICE(USB_VENDOR_ID_JESS2, USB_DEVICE_ID_JESS2_COLOR_RUMBLE_PAD) }, 1606 1603 { HID_BLUETOOTH_DEVICE(USB_VENDOR_ID_ION, USB_DEVICE_ID_ICADE) }, 1607 1604 { HID_USB_DEVICE(USB_VENDOR_ID_KENSINGTON, USB_DEVICE_ID_KS_SLIMBLADE) }, 1608 1605 { HID_USB_DEVICE(USB_VENDOR_ID_KEYTOUCH, USB_DEVICE_ID_KEYTOUCH_IEC) }, ··· 1702 1697 { HID_USB_DEVICE(USB_VENDOR_ID_SONY, USB_DEVICE_ID_SONY_NAVIGATION_CONTROLLER) }, 1703 1698 { HID_BLUETOOTH_DEVICE(USB_VENDOR_ID_SONY, USB_DEVICE_ID_SONY_PS3_CONTROLLER) }, 1704 1699 { HID_USB_DEVICE(USB_VENDOR_ID_SONY, USB_DEVICE_ID_SONY_VAIO_VGX_MOUSE) }, 1700 + { HID_USB_DEVICE(USB_VENDOR_ID_STEELSERIES, USB_DEVICE_ID_STEELSERIES_SRWS1) }, 1705 1701 { HID_USB_DEVICE(USB_VENDOR_ID_SUNPLUS, USB_DEVICE_ID_SUNPLUS_WDESKTOP) }, 1702 + { HID_USB_DEVICE(USB_VENDOR_ID_THINGM, USB_DEVICE_ID_BLINK1) }, 1706 1703 { HID_USB_DEVICE(USB_VENDOR_ID_THRUSTMASTER, 0xb300) }, 1707 1704 { HID_USB_DEVICE(USB_VENDOR_ID_THRUSTMASTER, 0xb304) }, 1708 1705 { HID_USB_DEVICE(USB_VENDOR_ID_THRUSTMASTER, 0xb323) }, ··· 2233 2226 if ((hdev->product == USB_DEVICE_ID_EGALAX_TOUCHCONTROLLER || 2234 2227 hdev->product == USB_DEVICE_ID_DWAV_TOUCHCONTROLLER) && 2235 2228 hdev->type != HID_TYPE_USBMOUSE) 2229 + return true; 2230 + break; 2231 + case USB_VENDOR_ID_VELLEMAN: 2232 + /* These are not HID devices. They are handled by comedi. */ 2233 + if ((hdev->product >= USB_DEVICE_ID_VELLEMAN_K8055_FIRST && 2234 + hdev->product <= USB_DEVICE_ID_VELLEMAN_K8055_LAST) || 2235 + (hdev->product >= USB_DEVICE_ID_VELLEMAN_K8061_FIRST && 2236 + hdev->product <= USB_DEVICE_ID_VELLEMAN_K8061_LAST)) 2236 2237 return true; 2237 2238 break; 2238 2239 }
+1 -12
drivers/hid/hid-cypress.c
··· 144 144 .event = cp_event, 145 145 .probe = cp_probe, 146 146 }; 147 + module_hid_driver(cp_driver); 147 148 148 - static int __init cp_init(void) 149 - { 150 - return hid_register_driver(&cp_driver); 151 - } 152 - 153 - static void __exit cp_exit(void) 154 - { 155 - hid_unregister_driver(&cp_driver); 156 - } 157 - 158 - module_init(cp_init); 159 - module_exit(cp_exit); 160 149 MODULE_LICENSE("GPL");
+1 -12
drivers/hid/hid-dr.c
··· 297 297 .report_fixup = dr_report_fixup, 298 298 .probe = dr_probe, 299 299 }; 300 + module_hid_driver(dr_driver); 300 301 301 - static int __init dr_init(void) 302 - { 303 - return hid_register_driver(&dr_driver); 304 - } 305 - 306 - static void __exit dr_exit(void) 307 - { 308 - hid_unregister_driver(&dr_driver); 309 - } 310 - 311 - module_init(dr_init); 312 - module_exit(dr_exit); 313 302 MODULE_LICENSE("GPL");
+1 -12
drivers/hid/hid-elecom.c
··· 41 41 .id_table = elecom_devices, 42 42 .report_fixup = elecom_report_fixup 43 43 }; 44 + module_hid_driver(elecom_driver); 44 45 45 - static int __init elecom_init(void) 46 - { 47 - return hid_register_driver(&elecom_driver); 48 - } 49 - 50 - static void __exit elecom_exit(void) 51 - { 52 - hid_unregister_driver(&elecom_driver); 53 - } 54 - 55 - module_init(elecom_init); 56 - module_exit(elecom_exit); 57 46 MODULE_LICENSE("GPL");
+1 -12
drivers/hid/hid-emsff.c
··· 150 150 .id_table = ems_devices, 151 151 .probe = ems_probe, 152 152 }; 153 + module_hid_driver(ems_driver); 153 154 154 - static int ems_init(void) 155 - { 156 - return hid_register_driver(&ems_driver); 157 - } 158 - 159 - static void ems_exit(void) 160 - { 161 - hid_unregister_driver(&ems_driver); 162 - } 163 - 164 - module_init(ems_init); 165 - module_exit(ems_exit); 166 155 MODULE_LICENSE("GPL"); 167 156
+1 -12
drivers/hid/hid-ezkey.c
··· 76 76 .input_mapping = ez_input_mapping, 77 77 .event = ez_event, 78 78 }; 79 + module_hid_driver(ez_driver); 79 80 80 - static int __init ez_init(void) 81 - { 82 - return hid_register_driver(&ez_driver); 83 - } 84 - 85 - static void __exit ez_exit(void) 86 - { 87 - hid_unregister_driver(&ez_driver); 88 - } 89 - 90 - module_init(ez_init); 91 - module_exit(ez_exit); 92 81 MODULE_LICENSE("GPL");
+1 -12
drivers/hid/hid-gaff.c
··· 176 176 .id_table = ga_devices, 177 177 .probe = ga_probe, 178 178 }; 179 + module_hid_driver(ga_driver); 179 180 180 - static int __init ga_init(void) 181 - { 182 - return hid_register_driver(&ga_driver); 183 - } 184 - 185 - static void __exit ga_exit(void) 186 - { 187 - hid_unregister_driver(&ga_driver); 188 - } 189 - 190 - module_init(ga_init); 191 - module_exit(ga_exit); 192 181 MODULE_LICENSE("GPL");
+1 -13
drivers/hid/hid-generic.c
··· 34 34 .name = "hid-generic", 35 35 .id_table = hid_table, 36 36 }; 37 - 38 - static int __init hid_init(void) 39 - { 40 - return hid_register_driver(&hid_generic); 41 - } 42 - 43 - static void __exit hid_exit(void) 44 - { 45 - hid_unregister_driver(&hid_generic); 46 - } 47 - 48 - module_init(hid_init); 49 - module_exit(hid_exit); 37 + module_hid_driver(hid_generic); 50 38 51 39 MODULE_AUTHOR("Henrik Rydberg"); 52 40 MODULE_DESCRIPTION("HID generic driver");
+1 -12
drivers/hid/hid-gyration.c
··· 88 88 .input_mapping = gyration_input_mapping, 89 89 .event = gyration_event, 90 90 }; 91 + module_hid_driver(gyration_driver); 91 92 92 - static int __init gyration_init(void) 93 - { 94 - return hid_register_driver(&gyration_driver); 95 - } 96 - 97 - static void __exit gyration_exit(void) 98 - { 99 - hid_unregister_driver(&gyration_driver); 100 - } 101 - 102 - module_init(gyration_init); 103 - module_exit(gyration_exit); 104 93 MODULE_LICENSE("GPL");
+1 -12
drivers/hid/hid-holtek-kbd.c
··· 167 167 .report_fixup = holtek_kbd_report_fixup, 168 168 .probe = holtek_kbd_probe 169 169 }; 170 + module_hid_driver(holtek_kbd_driver); 170 171 171 - static int __init holtek_kbd_init(void) 172 - { 173 - return hid_register_driver(&holtek_kbd_driver); 174 - } 175 - 176 - static void __exit holtek_kbd_exit(void) 177 - { 178 - hid_unregister_driver(&holtek_kbd_driver); 179 - } 180 - 181 - module_exit(holtek_kbd_exit); 182 - module_init(holtek_kbd_init); 183 172 MODULE_LICENSE("GPL");
+1 -14
drivers/hid/hid-holtekff.c
··· 224 224 .id_table = holtek_devices, 225 225 .probe = holtek_probe, 226 226 }; 227 - 228 - static int __init holtek_init(void) 229 - { 230 - return hid_register_driver(&holtek_driver); 231 - } 232 - 233 - static void __exit holtek_exit(void) 234 - { 235 - hid_unregister_driver(&holtek_driver); 236 - } 237 - 238 - module_init(holtek_init); 239 - module_exit(holtek_exit); 240 - 227 + module_hid_driver(holtek_driver);
+1 -18
drivers/hid/hid-icade.c
··· 235 235 .input_mapped = icade_input_mapped, 236 236 .input_mapping = icade_input_mapping, 237 237 }; 238 + module_hid_driver(icade_driver); 238 239 239 - static int __init icade_init(void) 240 - { 241 - int ret; 242 - 243 - ret = hid_register_driver(&icade_driver); 244 - if (ret) 245 - pr_err("can't register icade driver\n"); 246 - 247 - return ret; 248 - } 249 - 250 - static void __exit icade_exit(void) 251 - { 252 - hid_unregister_driver(&icade_driver); 253 - } 254 - 255 - module_init(icade_init); 256 - module_exit(icade_exit); 257 240 MODULE_LICENSE("GPL"); 258 241 MODULE_AUTHOR("Bastien Nocera <hadess@hadess.net>"); 259 242 MODULE_DESCRIPTION("ION iCade input driver");
+20 -1
drivers/hid/hid-ids.h
··· 445 445 #define USB_VENDOR_ID_JESS 0x0c45 446 446 #define USB_DEVICE_ID_JESS_YUREX 0x1010 447 447 448 + #define USB_VENDOR_ID_JESS2 0x0f30 449 + #define USB_DEVICE_ID_JESS2_COLOR_RUMBLE_PAD 0x0111 450 + 448 451 #define USB_VENDOR_ID_KBGEAR 0x084e 449 452 #define USB_DEVICE_ID_KBGEAR_JAMSTUDIO 0x1001 450 453 ··· 528 525 #define USB_DEVICE_ID_LOGITECH_WINGMAN_F3D 0xc283 529 526 #define USB_DEVICE_ID_LOGITECH_FORCE3D_PRO 0xc286 530 527 #define USB_DEVICE_ID_LOGITECH_FLIGHT_SYSTEM_G940 0xc287 531 - #define USB_DEVICE_ID_LOGITECH_WHEEL 0xc294 532 528 #define USB_DEVICE_ID_LOGITECH_WINGMAN_FFG 0xc293 529 + #define USB_DEVICE_ID_LOGITECH_WHEEL 0xc294 533 530 #define USB_DEVICE_ID_LOGITECH_MOMO_WHEEL 0xc295 534 531 #define USB_DEVICE_ID_LOGITECH_DFP_WHEEL 0xc298 535 532 #define USB_DEVICE_ID_LOGITECH_G25_WHEEL 0xc299 ··· 599 596 600 597 #define USB_VENDOR_ID_NEC 0x073e 601 598 #define USB_DEVICE_ID_NEC_USB_GAME_PAD 0x0301 599 + 600 + #define USB_VENDOR_ID_NEXIO 0x1870 601 + #define USB_DEVICE_ID_NEXIO_MULTITOUCH_420 0x010d 602 602 603 603 #define USB_VENDOR_ID_NEXTWINDOW 0x1926 604 604 #define USB_DEVICE_ID_NEXTWINDOW_TOUCHSCREEN 0x0003 ··· 715 709 716 710 #define USB_VENDOR_ID_SONY 0x054c 717 711 #define USB_DEVICE_ID_SONY_VAIO_VGX_MOUSE 0x024b 712 + #define USB_DEVICE_ID_SONY_VAIO_VGP_MOUSE 0x0374 718 713 #define USB_DEVICE_ID_SONY_PS3_BDREMOTE 0x0306 719 714 #define USB_DEVICE_ID_SONY_PS3_CONTROLLER 0x0268 720 715 #define USB_DEVICE_ID_SONY_NAVIGATION_CONTROLLER 0x042f ··· 732 725 733 726 #define USB_VENDOR_ID_STANTUM_SITRONIX 0x1403 734 727 #define USB_DEVICE_ID_MTP_SITRONIX 0x5001 728 + 729 + #define USB_VENDOR_ID_STEELSERIES 0x1038 730 + #define USB_DEVICE_ID_STEELSERIES_SRWS1 0x1410 735 731 736 732 #define USB_VENDOR_ID_SUN 0x0430 737 733 #define USB_DEVICE_ID_RARITAN_KVM_DONGLE 0xcdab ··· 756 746 #define USB_DEVICE_ID_SYNAPTICS_COMP_TP 0x0009 757 747 #define USB_DEVICE_ID_SYNAPTICS_WTP 0x0010 758 748 #define USB_DEVICE_ID_SYNAPTICS_DPAD 0x0013 749 + 750 + #define USB_VENDOR_ID_THINGM 0x27b8 751 + #define USB_DEVICE_ID_BLINK1 0x01ed 759 752 760 753 #define USB_VENDOR_ID_THRUSTMASTER 0x044f 761 754 ··· 806 793 #define USB_VENDOR_ID_UNITEC 0x227d 807 794 #define USB_DEVICE_ID_UNITEC_USB_TOUCH_0709 0x0709 808 795 #define USB_DEVICE_ID_UNITEC_USB_TOUCH_0A19 0x0a19 796 + 797 + #define USB_VENDOR_ID_VELLEMAN 0x10cf 798 + #define USB_DEVICE_ID_VELLEMAN_K8055_FIRST 0x5500 799 + #define USB_DEVICE_ID_VELLEMAN_K8055_LAST 0x5503 800 + #define USB_DEVICE_ID_VELLEMAN_K8061_FIRST 0x8061 801 + #define USB_DEVICE_ID_VELLEMAN_K8061_LAST 0x8068 809 802 810 803 #define USB_VENDOR_ID_VERNIER 0x08f7 811 804 #define USB_DEVICE_ID_VERNIER_LABPRO 0x0001
+1 -12
drivers/hid/hid-kensington.c
··· 47 47 .id_table = ks_devices, 48 48 .input_mapping = ks_input_mapping, 49 49 }; 50 + module_hid_driver(ks_driver); 50 51 51 - static int __init ks_init(void) 52 - { 53 - return hid_register_driver(&ks_driver); 54 - } 55 - 56 - static void __exit ks_exit(void) 57 - { 58 - hid_unregister_driver(&ks_driver); 59 - } 60 - 61 - module_init(ks_init); 62 - module_exit(ks_exit); 63 52 MODULE_LICENSE("GPL");
+1 -12
drivers/hid/hid-keytouch.c
··· 49 49 .id_table = keytouch_devices, 50 50 .report_fixup = keytouch_report_fixup, 51 51 }; 52 + module_hid_driver(keytouch_driver); 52 53 53 - static int __init keytouch_init(void) 54 - { 55 - return hid_register_driver(&keytouch_driver); 56 - } 57 - 58 - static void __exit keytouch_exit(void) 59 - { 60 - hid_unregister_driver(&keytouch_driver); 61 - } 62 - 63 - module_init(keytouch_init); 64 - module_exit(keytouch_exit); 65 54 MODULE_LICENSE("GPL"); 66 55 MODULE_AUTHOR("Jiri Kosina");
+1 -12
drivers/hid/hid-kye.c
··· 419 419 .probe = kye_probe, 420 420 .report_fixup = kye_report_fixup, 421 421 }; 422 + module_hid_driver(kye_driver); 422 423 423 - static int __init kye_init(void) 424 - { 425 - return hid_register_driver(&kye_driver); 426 - } 427 - 428 - static void __exit kye_exit(void) 429 - { 430 - hid_unregister_driver(&kye_driver); 431 - } 432 - 433 - module_init(kye_init); 434 - module_exit(kye_exit); 435 424 MODULE_LICENSE("GPL");
+1 -12
drivers/hid/hid-lcpower.c
··· 54 54 .id_table = ts_devices, 55 55 .input_mapping = ts_input_mapping, 56 56 }; 57 + module_hid_driver(ts_driver); 57 58 58 - static int __init ts_init(void) 59 - { 60 - return hid_register_driver(&ts_driver); 61 - } 62 - 63 - static void __exit ts_exit(void) 64 - { 65 - hid_unregister_driver(&ts_driver); 66 - } 67 - 68 - module_init(ts_init); 69 - module_exit(ts_exit); 70 59 MODULE_LICENSE("GPL");
+1 -13
drivers/hid/hid-lenovo-tpkbd.c
··· 468 468 .probe = tpkbd_probe, 469 469 .remove = tpkbd_remove, 470 470 }; 471 - 472 - static int __init tpkbd_init(void) 473 - { 474 - return hid_register_driver(&tpkbd_driver); 475 - } 476 - 477 - static void __exit tpkbd_exit(void) 478 - { 479 - hid_unregister_driver(&tpkbd_driver); 480 - } 481 - 482 - module_init(tpkbd_init); 483 - module_exit(tpkbd_exit); 471 + module_hid_driver(tpkbd_driver); 484 472 485 473 MODULE_LICENSE("GPL");
+186 -26
drivers/hid/hid-lg.c
··· 21 21 #include <linux/module.h> 22 22 #include <linux/random.h> 23 23 #include <linux/sched.h> 24 + #include <linux/usb.h> 24 25 #include <linux/wait.h> 25 26 27 + #include "usbhid/usbhid.h" 26 28 #include "hid-ids.h" 27 29 #include "hid-lg.h" 28 30 ··· 42 40 #define LG_FF3 0x1000 43 41 #define LG_FF4 0x2000 44 42 45 - /* Size of the original descriptor of the Driving Force Pro wheel */ 43 + /* Size of the original descriptors of the Driving Force (and Pro) wheels */ 44 + #define DF_RDESC_ORIG_SIZE 130 46 45 #define DFP_RDESC_ORIG_SIZE 97 46 + #define MOMO_RDESC_ORIG_SIZE 87 47 47 48 - /* Fixed report descriptor for Logitech Driving Force Pro wheel controller 48 + /* Fixed report descriptors for Logitech Driving Force (and Pro) 49 + * wheel controllers 49 50 * 50 - * The original descriptor hides the separate throttle and brake axes in 51 + * The original descriptors hide the separate throttle and brake axes in 51 52 * a custom vendor usage page, providing only a combined value as 52 53 * GenericDesktop.Y. 53 - * This descriptor removes the combined Y axis and instead reports 54 + * These descriptors remove the combined Y axis and instead report 54 55 * separate throttle (Y) and brake (RZ). 55 56 */ 57 + static __u8 df_rdesc_fixed[] = { 58 + 0x05, 0x01, /* Usage Page (Desktop), */ 59 + 0x09, 0x04, /* Usage (Joystik), */ 60 + 0xA1, 0x01, /* Collection (Application), */ 61 + 0xA1, 0x02, /* Collection (Logical), */ 62 + 0x95, 0x01, /* Report Count (1), */ 63 + 0x75, 0x0A, /* Report Size (10), */ 64 + 0x14, /* Logical Minimum (0), */ 65 + 0x26, 0xFF, 0x03, /* Logical Maximum (1023), */ 66 + 0x34, /* Physical Minimum (0), */ 67 + 0x46, 0xFF, 0x03, /* Physical Maximum (1023), */ 68 + 0x09, 0x30, /* Usage (X), */ 69 + 0x81, 0x02, /* Input (Variable), */ 70 + 0x95, 0x0C, /* Report Count (12), */ 71 + 0x75, 0x01, /* Report Size (1), */ 72 + 0x25, 0x01, /* Logical Maximum (1), */ 73 + 0x45, 0x01, /* Physical Maximum (1), */ 74 + 0x05, 0x09, /* Usage (Buttons), */ 75 + 0x19, 0x01, /* Usage Minimum (1), */ 76 + 0x29, 0x0c, /* Usage Maximum (12), */ 77 + 0x81, 0x02, /* Input (Variable), */ 78 + 0x95, 0x02, /* Report Count (2), */ 79 + 0x06, 0x00, 0xFF, /* Usage Page (Vendor: 65280), */ 80 + 0x09, 0x01, /* Usage (?: 1), */ 81 + 0x81, 0x02, /* Input (Variable), */ 82 + 0x05, 0x01, /* Usage Page (Desktop), */ 83 + 0x26, 0xFF, 0x00, /* Logical Maximum (255), */ 84 + 0x46, 0xFF, 0x00, /* Physical Maximum (255), */ 85 + 0x95, 0x01, /* Report Count (1), */ 86 + 0x75, 0x08, /* Report Size (8), */ 87 + 0x81, 0x02, /* Input (Variable), */ 88 + 0x25, 0x07, /* Logical Maximum (7), */ 89 + 0x46, 0x3B, 0x01, /* Physical Maximum (315), */ 90 + 0x75, 0x04, /* Report Size (4), */ 91 + 0x65, 0x14, /* Unit (Degrees), */ 92 + 0x09, 0x39, /* Usage (Hat Switch), */ 93 + 0x81, 0x42, /* Input (Variable, Null State), */ 94 + 0x75, 0x01, /* Report Size (1), */ 95 + 0x95, 0x04, /* Report Count (4), */ 96 + 0x65, 0x00, /* Unit (none), */ 97 + 0x06, 0x00, 0xFF, /* Usage Page (Vendor: 65280), */ 98 + 0x09, 0x01, /* Usage (?: 1), */ 99 + 0x25, 0x01, /* Logical Maximum (1), */ 100 + 0x45, 0x01, /* Physical Maximum (1), */ 101 + 0x81, 0x02, /* Input (Variable), */ 102 + 0x05, 0x01, /* Usage Page (Desktop), */ 103 + 0x95, 0x01, /* Report Count (1), */ 104 + 0x75, 0x08, /* Report Size (8), */ 105 + 0x26, 0xFF, 0x00, /* Logical Maximum (255), */ 106 + 0x46, 0xFF, 0x00, /* Physical Maximum (255), */ 107 + 0x09, 0x31, /* Usage (Y), */ 108 + 0x81, 0x02, /* Input (Variable), */ 109 + 0x09, 0x35, /* Usage (Rz), */ 110 + 0x81, 0x02, /* Input (Variable), */ 111 + 0xC0, /* End Collection, */ 112 + 0xA1, 0x02, /* Collection (Logical), */ 113 + 0x26, 0xFF, 0x00, /* Logical Maximum (255), */ 114 + 0x46, 0xFF, 0x00, /* Physical Maximum (255), */ 115 + 0x95, 0x07, /* Report Count (7), */ 116 + 0x75, 0x08, /* Report Size (8), */ 117 + 0x09, 0x03, /* Usage (?: 3), */ 118 + 0x91, 0x02, /* Output (Variable), */ 119 + 0xC0, /* End Collection, */ 120 + 0xC0 /* End Collection */ 121 + }; 122 + 56 123 static __u8 dfp_rdesc_fixed[] = { 57 124 0x05, 0x01, /* Usage Page (Desktop), */ 58 125 0x09, 0x04, /* Usage (Joystik), */ ··· 170 99 0xC0 /* End Collection */ 171 100 }; 172 101 102 + static __u8 momo_rdesc_fixed[] = { 103 + 0x05, 0x01, /* Usage Page (Desktop), */ 104 + 0x09, 0x04, /* Usage (Joystik), */ 105 + 0xA1, 0x01, /* Collection (Application), */ 106 + 0xA1, 0x02, /* Collection (Logical), */ 107 + 0x95, 0x01, /* Report Count (1), */ 108 + 0x75, 0x0A, /* Report Size (10), */ 109 + 0x15, 0x00, /* Logical Minimum (0), */ 110 + 0x26, 0xFF, 0x03, /* Logical Maximum (1023), */ 111 + 0x35, 0x00, /* Physical Minimum (0), */ 112 + 0x46, 0xFF, 0x03, /* Physical Maximum (1023), */ 113 + 0x09, 0x30, /* Usage (X), */ 114 + 0x81, 0x02, /* Input (Variable), */ 115 + 0x95, 0x08, /* Report Count (8), */ 116 + 0x75, 0x01, /* Report Size (1), */ 117 + 0x25, 0x01, /* Logical Maximum (1), */ 118 + 0x45, 0x01, /* Physical Maximum (1), */ 119 + 0x05, 0x09, /* Usage Page (Button), */ 120 + 0x19, 0x01, /* Usage Minimum (01h), */ 121 + 0x29, 0x08, /* Usage Maximum (08h), */ 122 + 0x81, 0x02, /* Input (Variable), */ 123 + 0x06, 0x00, 0xFF, /* Usage Page (FF00h), */ 124 + 0x75, 0x0E, /* Report Size (14), */ 125 + 0x95, 0x01, /* Report Count (1), */ 126 + 0x26, 0xFF, 0x00, /* Logical Maximum (255), */ 127 + 0x46, 0xFF, 0x00, /* Physical Maximum (255), */ 128 + 0x09, 0x00, /* Usage (00h), */ 129 + 0x81, 0x02, /* Input (Variable), */ 130 + 0x05, 0x01, /* Usage Page (Desktop), */ 131 + 0x75, 0x08, /* Report Size (8), */ 132 + 0x09, 0x31, /* Usage (Y), */ 133 + 0x81, 0x02, /* Input (Variable), */ 134 + 0x09, 0x32, /* Usage (Z), */ 135 + 0x81, 0x02, /* Input (Variable), */ 136 + 0x06, 0x00, 0xFF, /* Usage Page (FF00h), */ 137 + 0x09, 0x01, /* Usage (01h), */ 138 + 0x81, 0x02, /* Input (Variable), */ 139 + 0xC0, /* End Collection, */ 140 + 0xA1, 0x02, /* Collection (Logical), */ 141 + 0x09, 0x02, /* Usage (02h), */ 142 + 0x95, 0x07, /* Report Count (7), */ 143 + 0x91, 0x02, /* Output (Variable), */ 144 + 0xC0, /* End Collection, */ 145 + 0xC0 /* End Collection */ 146 + }; 173 147 174 148 /* 175 149 * Certain Logitech keyboards send in report #3 keys which are far ··· 225 109 unsigned int *rsize) 226 110 { 227 111 struct lg_drv_data *drv_data = hid_get_drvdata(hdev); 112 + struct usb_device_descriptor *udesc; 113 + __u16 bcdDevice, rev_maj, rev_min; 228 114 229 115 if ((drv_data->quirks & LG_RDESC) && *rsize >= 90 && rdesc[83] == 0x26 && 230 116 rdesc[84] == 0x8c && rdesc[85] == 0x02) { ··· 242 124 "fixing up rel/abs in Logitech report descriptor\n"); 243 125 rdesc[33] = rdesc[50] = 0x02; 244 126 } 245 - if ((drv_data->quirks & LG_FF4) && *rsize >= 101 && 246 - rdesc[41] == 0x95 && rdesc[42] == 0x0B && 247 - rdesc[47] == 0x05 && rdesc[48] == 0x09) { 248 - hid_info(hdev, "fixing up Logitech Speed Force Wireless button descriptor\n"); 249 - rdesc[41] = 0x05; 250 - rdesc[42] = 0x09; 251 - rdesc[47] = 0x95; 252 - rdesc[48] = 0x0B; 253 - } 254 127 255 128 switch (hdev->product) { 129 + 130 + /* Several wheels report as this id when operating in emulation mode. */ 131 + case USB_DEVICE_ID_LOGITECH_WHEEL: 132 + udesc = &(hid_to_usb_dev(hdev)->descriptor); 133 + if (!udesc) { 134 + hid_err(hdev, "NULL USB device descriptor\n"); 135 + break; 136 + } 137 + bcdDevice = le16_to_cpu(udesc->bcdDevice); 138 + rev_maj = bcdDevice >> 8; 139 + rev_min = bcdDevice & 0xff; 140 + 141 + /* Update the report descriptor for only the Driving Force wheel */ 142 + if (rev_maj == 1 && rev_min == 2 && 143 + *rsize == DF_RDESC_ORIG_SIZE) { 144 + hid_info(hdev, 145 + "fixing up Logitech Driving Force report descriptor\n"); 146 + rdesc = df_rdesc_fixed; 147 + *rsize = sizeof(df_rdesc_fixed); 148 + } 149 + break; 150 + 151 + case USB_DEVICE_ID_LOGITECH_MOMO_WHEEL: 152 + if (*rsize == MOMO_RDESC_ORIG_SIZE) { 153 + hid_info(hdev, 154 + "fixing up Logitech Momo Force (Red) report descriptor\n"); 155 + rdesc = momo_rdesc_fixed; 156 + *rsize = sizeof(momo_rdesc_fixed); 157 + } 158 + break; 159 + 256 160 case USB_DEVICE_ID_LOGITECH_DFP_WHEEL: 257 161 if (*rsize == DFP_RDESC_ORIG_SIZE) { 258 162 hid_info(hdev, 259 163 "fixing up Logitech Driving Force Pro report descriptor\n"); 260 164 rdesc = dfp_rdesc_fixed; 261 165 *rsize = sizeof(dfp_rdesc_fixed); 166 + } 167 + break; 168 + 169 + case USB_DEVICE_ID_LOGITECH_WII_WHEEL: 170 + if (*rsize >= 101 && rdesc[41] == 0x95 && rdesc[42] == 0x0B && 171 + rdesc[47] == 0x05 && rdesc[48] == 0x09) { 172 + hid_info(hdev, "fixing up Logitech Speed Force Wireless report descriptor\n"); 173 + rdesc[41] = 0x05; 174 + rdesc[42] = 0x09; 175 + rdesc[47] = 0x95; 176 + rdesc[48] = 0x0B; 262 177 } 263 178 break; 264 179 } ··· 479 328 usage->type == EV_REL || usage->type == EV_ABS)) 480 329 clear_bit(usage->code, *bit); 481 330 331 + /* Ensure that Logitech wheels are not given a default fuzz/flat value */ 332 + if (usage->type == EV_ABS && (usage->code == ABS_X || 333 + usage->code == ABS_Y || usage->code == ABS_Z || 334 + usage->code == ABS_RZ)) { 335 + switch (hdev->product) { 336 + case USB_DEVICE_ID_LOGITECH_WHEEL: 337 + case USB_DEVICE_ID_LOGITECH_MOMO_WHEEL: 338 + case USB_DEVICE_ID_LOGITECH_DFP_WHEEL: 339 + case USB_DEVICE_ID_LOGITECH_G25_WHEEL: 340 + case USB_DEVICE_ID_LOGITECH_DFGT_WHEEL: 341 + case USB_DEVICE_ID_LOGITECH_G27_WHEEL: 342 + case USB_DEVICE_ID_LOGITECH_WII_WHEEL: 343 + case USB_DEVICE_ID_LOGITECH_MOMO_WHEEL2: 344 + field->application = HID_GD_MULTIAXIS; 345 + break; 346 + default: 347 + break; 348 + } 349 + } 350 + 482 351 return 0; 483 352 } 484 353 ··· 636 465 { HID_USB_DEVICE(USB_VENDOR_ID_LOGITECH, USB_DEVICE_ID_LOGITECH_FORCE3D_PRO), 637 466 .driver_data = LG_FF }, 638 467 { HID_USB_DEVICE(USB_VENDOR_ID_LOGITECH, USB_DEVICE_ID_LOGITECH_MOMO_WHEEL), 639 - .driver_data = LG_FF4 }, 468 + .driver_data = LG_NOGET | LG_FF4 }, 640 469 { HID_USB_DEVICE(USB_VENDOR_ID_LOGITECH, USB_DEVICE_ID_LOGITECH_MOMO_WHEEL2), 641 470 .driver_data = LG_FF4 }, 642 471 { HID_USB_DEVICE(USB_VENDOR_ID_LOGITECH, USB_DEVICE_ID_LOGITECH_G25_WHEEL), ··· 674 503 .probe = lg_probe, 675 504 .remove = lg_remove, 676 505 }; 506 + module_hid_driver(lg_driver); 677 507 678 - static int __init lg_init(void) 679 - { 680 - return hid_register_driver(&lg_driver); 681 - } 682 - 683 - static void __exit lg_exit(void) 684 - { 685 - hid_unregister_driver(&lg_driver); 686 - } 687 - 688 - module_init(lg_init); 689 - module_exit(lg_exit); 690 508 MODULE_LICENSE("GPL");
-17
drivers/hid/hid-lg4ff.c
··· 43 43 #define G27_REV_MAJ 0x12 44 44 #define G27_REV_MIN 0x38 45 45 46 - #define DFP_X_MIN 0 47 - #define DFP_X_MAX 16383 48 - #define DFP_PEDAL_MIN 0 49 - #define DFP_PEDAL_MAX 255 50 - 51 46 #define to_hid_device(pdev) container_of(pdev, struct hid_device, dev) 52 47 53 48 static void hid_lg4ff_set_range_dfp(struct hid_device *hid, u16 range); ··· 592 597 if (error) 593 598 return error; 594 599 dbg_hid("sysfs interface created\n"); 595 - 596 - /* Set default axes parameters */ 597 - switch (lg4ff_devices[i].product_id) { 598 - case USB_DEVICE_ID_LOGITECH_DFP_WHEEL: 599 - dbg_hid("Setting axes parameters for Driving Force Pro\n"); 600 - input_set_abs_params(dev, ABS_X, DFP_X_MIN, DFP_X_MAX, 0, 0); 601 - input_set_abs_params(dev, ABS_Y, DFP_PEDAL_MIN, DFP_PEDAL_MAX, 0, 0); 602 - input_set_abs_params(dev, ABS_RZ, DFP_PEDAL_MIN, DFP_PEDAL_MAX, 0, 0); 603 - break; 604 - default: 605 - break; 606 - } 607 600 608 601 /* Set the maximum range to start with */ 609 602 entry->range = entry->max_range;
+1 -18
drivers/hid/hid-magicmouse.c
··· 569 569 .raw_event = magicmouse_raw_event, 570 570 .input_mapping = magicmouse_input_mapping, 571 571 }; 572 + module_hid_driver(magicmouse_driver); 572 573 573 - static int __init magicmouse_init(void) 574 - { 575 - int ret; 576 - 577 - ret = hid_register_driver(&magicmouse_driver); 578 - if (ret) 579 - pr_err("can't register magicmouse driver\n"); 580 - 581 - return ret; 582 - } 583 - 584 - static void __exit magicmouse_exit(void) 585 - { 586 - hid_unregister_driver(&magicmouse_driver); 587 - } 588 - 589 - module_init(magicmouse_init); 590 - module_exit(magicmouse_exit); 591 574 MODULE_LICENSE("GPL");
+1 -12
drivers/hid/hid-microsoft.c
··· 221 221 .event = ms_event, 222 222 .probe = ms_probe, 223 223 }; 224 + module_hid_driver(ms_driver); 224 225 225 - static int __init ms_init(void) 226 - { 227 - return hid_register_driver(&ms_driver); 228 - } 229 - 230 - static void __exit ms_exit(void) 231 - { 232 - hid_unregister_driver(&ms_driver); 233 - } 234 - 235 - module_init(ms_init); 236 - module_exit(ms_exit); 237 226 MODULE_LICENSE("GPL");
+1 -12
drivers/hid/hid-monterey.c
··· 63 63 .report_fixup = mr_report_fixup, 64 64 .input_mapping = mr_input_mapping, 65 65 }; 66 + module_hid_driver(mr_driver); 66 67 67 - static int __init mr_init(void) 68 - { 69 - return hid_register_driver(&mr_driver); 70 - } 71 - 72 - static void __exit mr_exit(void) 73 - { 74 - hid_unregister_driver(&mr_driver); 75 - } 76 - 77 - module_init(mr_init); 78 - module_exit(mr_exit); 79 68 MODULE_LICENSE("GPL");
+114 -49
drivers/hid/hid-multitouch.c
··· 54 54 #define MT_QUIRK_NO_AREA (1 << 9) 55 55 #define MT_QUIRK_IGNORE_DUPLICATES (1 << 10) 56 56 #define MT_QUIRK_HOVERING (1 << 11) 57 + #define MT_QUIRK_CONTACT_CNT_ACCURATE (1 << 12) 57 58 58 59 struct mt_slot { 59 60 __s32 x, y, cx, cy, p, w, h; ··· 84 83 struct mt_class mtclass; /* our mt device class */ 85 84 struct mt_fields *fields; /* temporary placeholder for storing the 86 85 multitouch fields */ 86 + int cc_index; /* contact count field index in the report */ 87 + int cc_value_index; /* contact count value index in the field */ 87 88 unsigned last_field_index; /* last field index of the report */ 88 89 unsigned last_slot_field; /* the last field of a slot */ 90 + unsigned mt_report_id; /* the report ID of the multitouch device */ 89 91 __s8 inputmode; /* InputMode HID feature, -1 if non-existent */ 90 92 __s8 inputmode_index; /* InputMode HID feature index in the report */ 91 93 __s8 maxcontact_report_id; /* Maximum Contact Number HID feature, ··· 115 111 #define MT_CLS_DUAL_INRANGE_CONTACTNUMBER 0x0007 116 112 #define MT_CLS_DUAL_NSMU_CONTACTID 0x0008 117 113 #define MT_CLS_INRANGE_CONTACTNUMBER 0x0009 114 + #define MT_CLS_NSMU 0x000a 115 + #define MT_CLS_DUAL_CONTACT_NUMBER 0x0010 116 + #define MT_CLS_DUAL_CONTACT_ID 0x0011 118 117 119 118 /* vendor specific classes */ 120 119 #define MT_CLS_3M 0x0101 ··· 151 144 152 145 static struct mt_class mt_classes[] = { 153 146 { .name = MT_CLS_DEFAULT, 147 + .quirks = MT_QUIRK_ALWAYS_VALID | 148 + MT_QUIRK_CONTACT_CNT_ACCURATE }, 149 + { .name = MT_CLS_NSMU, 154 150 .quirks = MT_QUIRK_NOT_SEEN_MEANS_UP }, 155 151 { .name = MT_CLS_SERIAL, 156 152 .quirks = MT_QUIRK_ALWAYS_VALID}, ··· 180 170 { .name = MT_CLS_INRANGE_CONTACTNUMBER, 181 171 .quirks = MT_QUIRK_VALID_IS_INRANGE | 182 172 MT_QUIRK_SLOT_IS_CONTACTNUMBER }, 173 + { .name = MT_CLS_DUAL_CONTACT_NUMBER, 174 + .quirks = MT_QUIRK_ALWAYS_VALID | 175 + MT_QUIRK_CONTACT_CNT_ACCURATE | 176 + MT_QUIRK_SLOT_IS_CONTACTNUMBER, 177 + .maxcontacts = 2 }, 178 + { .name = MT_CLS_DUAL_CONTACT_ID, 179 + .quirks = MT_QUIRK_ALWAYS_VALID | 180 + MT_QUIRK_CONTACT_CNT_ACCURATE | 181 + MT_QUIRK_SLOT_IS_CONTACTID, 182 + .maxcontacts = 2 }, 183 183 184 184 /* 185 185 * vendor specific classes ··· 270 250 271 251 td->mtclass.quirks = val; 272 252 253 + if (td->cc_index < 0) 254 + td->mtclass.quirks &= ~MT_QUIRK_CONTACT_CNT_ACCURATE; 255 + 273 256 return count; 274 257 } 275 258 ··· 324 301 *quirks |= MT_QUIRK_ALWAYS_VALID; 325 302 *quirks |= MT_QUIRK_IGNORE_DUPLICATES; 326 303 *quirks |= MT_QUIRK_HOVERING; 304 + *quirks |= MT_QUIRK_CONTACT_CNT_ACCURATE; 327 305 *quirks &= ~MT_QUIRK_NOT_SEEN_MEANS_UP; 328 306 *quirks &= ~MT_QUIRK_VALID_IS_INRANGE; 329 307 *quirks &= ~MT_QUIRK_VALID_IS_CONFIDENCE; ··· 452 428 mt_store_field(usage, td, hi); 453 429 td->last_field_index = field->index; 454 430 td->touches_by_report++; 431 + td->mt_report_id = field->report->id; 455 432 return 1; 456 433 case HID_DG_WIDTH: 457 434 hid_map_usage(hi, usage, bit, max, ··· 484 459 td->last_field_index = field->index; 485 460 return 1; 486 461 case HID_DG_CONTACTCOUNT: 462 + td->cc_index = field->index; 463 + td->cc_value_index = usage->usage_index; 487 464 td->last_field_index = field->index; 488 465 return 1; 489 466 case HID_DG_CONTACTMAX: ··· 550 523 */ 551 524 static void mt_complete_slot(struct mt_device *td, struct input_dev *input) 552 525 { 526 + if ((td->mtclass.quirks & MT_QUIRK_CONTACT_CNT_ACCURATE) && 527 + td->num_received >= td->num_expected) 528 + return; 529 + 553 530 if (td->curvalid || (td->mtclass.quirks & MT_QUIRK_ALWAYS_VALID)) { 554 531 int slotnum = mt_compute_slot(td, input); 555 532 struct mt_slot *s = &td->curdata; ··· 609 578 static int mt_event(struct hid_device *hid, struct hid_field *field, 610 579 struct hid_usage *usage, __s32 value) 611 580 { 581 + /* we will handle the hidinput part later, now remains hiddev */ 582 + if (hid->claimed & HID_CLAIMED_HIDDEV && hid->hiddev_hid_event) 583 + hid->hiddev_hid_event(hid, field, usage, value); 584 + 585 + return 1; 586 + } 587 + 588 + static void mt_process_mt_event(struct hid_device *hid, struct hid_field *field, 589 + struct hid_usage *usage, __s32 value) 590 + { 612 591 struct mt_device *td = hid_get_drvdata(hid); 613 592 __s32 quirks = td->mtclass.quirks; 614 593 ··· 664 623 td->curdata.h = value; 665 624 break; 666 625 case HID_DG_CONTACTCOUNT: 667 - /* 668 - * Includes multi-packet support where subsequent 669 - * packets are sent with zero contactcount. 670 - */ 671 - if (value) 672 - td->num_expected = value; 673 626 break; 674 627 case HID_DG_TOUCH: 675 628 /* do nothing */ 676 629 break; 677 630 678 631 default: 679 - /* fallback to the generic hidinput handling */ 680 - return 0; 632 + return; 681 633 } 682 634 683 635 if (usage->usage_index + 1 == field->report_count) { ··· 684 650 } 685 651 686 652 } 653 + } 687 654 688 - /* we have handled the hidinput part, now remains hiddev */ 689 - if (hid->claimed & HID_CLAIMED_HIDDEV && hid->hiddev_hid_event) 690 - hid->hiddev_hid_event(hid, field, usage, value); 655 + static void mt_report(struct hid_device *hid, struct hid_report *report) 656 + { 657 + struct mt_device *td = hid_get_drvdata(hid); 658 + struct hid_field *field; 659 + unsigned count; 660 + int r, n; 691 661 692 - return 1; 662 + if (report->id != td->mt_report_id) 663 + return; 664 + 665 + if (!(hid->claimed & HID_CLAIMED_INPUT)) 666 + return; 667 + 668 + /* 669 + * Includes multi-packet support where subsequent 670 + * packets are sent with zero contactcount. 671 + */ 672 + if (td->cc_index >= 0) { 673 + struct hid_field *field = report->field[td->cc_index]; 674 + int value = field->value[td->cc_value_index]; 675 + if (value) 676 + td->num_expected = value; 677 + } 678 + 679 + for (r = 0; r < report->maxfield; r++) { 680 + field = report->field[r]; 681 + count = field->report_count; 682 + 683 + if (!(HID_MAIN_ITEM_VARIABLE & field->flags)) 684 + continue; 685 + 686 + for (n = 0; n < count; n++) 687 + mt_process_mt_event(hid, field, &field->usage[n], 688 + field->value[n]); 689 + } 693 690 } 694 691 695 692 static void mt_set_input_mode(struct hid_device *hdev) ··· 776 711 quirks &= ~MT_QUIRK_NOT_SEEN_MEANS_UP; 777 712 quirks &= ~MT_QUIRK_VALID_IS_INRANGE; 778 713 quirks &= ~MT_QUIRK_VALID_IS_CONFIDENCE; 714 + quirks &= ~MT_QUIRK_CONTACT_CNT_ACCURATE; 779 715 } 780 716 781 717 td->mtclass.quirks = quirks; ··· 785 719 static void mt_post_parse(struct mt_device *td) 786 720 { 787 721 struct mt_fields *f = td->fields; 722 + struct mt_class *cls = &td->mtclass; 788 723 789 724 if (td->touches_by_report > 0) { 790 725 int field_count_per_touch = f->length / td->touches_by_report; 791 726 td->last_slot_field = f->usages[field_count_per_touch - 1]; 792 727 } 728 + 729 + if (td->cc_index < 0) 730 + cls->quirks &= ~MT_QUIRK_CONTACT_CNT_ACCURATE; 793 731 } 794 732 795 733 static void mt_input_configured(struct hid_device *hdev, struct hid_input *hi) ··· 851 781 td->mtclass = *mtclass; 852 782 td->inputmode = -1; 853 783 td->maxcontact_report_id = -1; 784 + td->cc_index = -1; 854 785 hid_set_drvdata(hdev, td); 855 786 856 787 td->fields = kzalloc(sizeof(struct mt_fields), GFP_KERNEL); ··· 946 875 USB_DEVICE_ID_3M3266) }, 947 876 948 877 /* ActionStar panels */ 949 - { .driver_data = MT_CLS_DEFAULT, 878 + { .driver_data = MT_CLS_NSMU, 950 879 MT_USB_DEVICE(USB_VENDOR_ID_ACTIONSTAR, 951 880 USB_DEVICE_ID_ACTIONSTAR_1011) }, 952 881 ··· 959 888 USB_DEVICE_ID_ATMEL_MXT_DIGITIZER) }, 960 889 961 890 /* Baanto multitouch devices */ 962 - { .driver_data = MT_CLS_DEFAULT, 891 + { .driver_data = MT_CLS_NSMU, 963 892 MT_USB_DEVICE(USB_VENDOR_ID_BAANTO, 964 893 USB_DEVICE_ID_BAANTO_MT_190W2) }, 965 894 /* Cando panels */ 966 895 { .driver_data = MT_CLS_DUAL_INRANGE_CONTACTNUMBER, 967 896 MT_USB_DEVICE(USB_VENDOR_ID_CANDO, 968 897 USB_DEVICE_ID_CANDO_MULTI_TOUCH) }, 969 - { .driver_data = MT_CLS_DUAL_INRANGE_CONTACTNUMBER, 898 + { .driver_data = MT_CLS_DUAL_CONTACT_NUMBER, 970 899 MT_USB_DEVICE(USB_VENDOR_ID_CANDO, 971 900 USB_DEVICE_ID_CANDO_MULTI_TOUCH_10_1) }, 972 901 { .driver_data = MT_CLS_DUAL_INRANGE_CONTACTNUMBER, ··· 977 906 USB_DEVICE_ID_CANDO_MULTI_TOUCH_15_6) }, 978 907 979 908 /* Chunghwa Telecom touch panels */ 980 - { .driver_data = MT_CLS_DEFAULT, 909 + { .driver_data = MT_CLS_NSMU, 981 910 MT_USB_DEVICE(USB_VENDOR_ID_CHUNGHWAT, 982 911 USB_DEVICE_ID_CHUNGHWAT_MULTITOUCH) }, 983 912 984 913 /* CVTouch panels */ 985 - { .driver_data = MT_CLS_DEFAULT, 914 + { .driver_data = MT_CLS_NSMU, 986 915 MT_USB_DEVICE(USB_VENDOR_ID_CVTOUCH, 987 916 USB_DEVICE_ID_CVTOUCH_SCREEN) }, 988 917 ··· 1053 982 USB_DEVICE_ID_DWAV_EGALAX_MULTITOUCH_72C4) }, 1054 983 1055 984 /* Elo TouchSystems IntelliTouch Plus panel */ 1056 - { .driver_data = MT_CLS_DUAL_NSMU_CONTACTID, 985 + { .driver_data = MT_CLS_DUAL_CONTACT_ID, 1057 986 MT_USB_DEVICE(USB_VENDOR_ID_ELO, 1058 987 USB_DEVICE_ID_ELO_TS2515) }, 1059 988 ··· 1071 1000 USB_DEVICE_ID_GENERAL_TOUCH_WIN8_PWT_TENFINGERS) }, 1072 1001 1073 1002 /* Gametel game controller */ 1074 - { .driver_data = MT_CLS_DEFAULT, 1003 + { .driver_data = MT_CLS_NSMU, 1075 1004 MT_BT_DEVICE(USB_VENDOR_ID_FRUCTEL, 1076 1005 USB_DEVICE_ID_GAMETEL_MT_MODE) }, 1077 1006 1078 1007 /* GoodTouch panels */ 1079 - { .driver_data = MT_CLS_DEFAULT, 1008 + { .driver_data = MT_CLS_NSMU, 1080 1009 MT_USB_DEVICE(USB_VENDOR_ID_GOODTOUCH, 1081 1010 USB_DEVICE_ID_GOODTOUCH_000f) }, 1082 1011 ··· 1094 1023 USB_DEVICE_ID_IDEACOM_IDC6651) }, 1095 1024 1096 1025 /* Ilitek dual touch panel */ 1097 - { .driver_data = MT_CLS_DEFAULT, 1026 + { .driver_data = MT_CLS_NSMU, 1098 1027 MT_USB_DEVICE(USB_VENDOR_ID_ILITEK, 1099 1028 USB_DEVICE_ID_ILITEK_MULTITOUCH) }, 1100 1029 ··· 1127 1056 MT_USB_DEVICE(USB_VENDOR_ID_TURBOX, 1128 1057 USB_DEVICE_ID_TURBOX_TOUCHSCREEN_MOSART) }, 1129 1058 1059 + /* Nexio panels */ 1060 + { .driver_data = MT_CLS_DEFAULT, 1061 + MT_USB_DEVICE(USB_VENDOR_ID_NEXIO, 1062 + USB_DEVICE_ID_NEXIO_MULTITOUCH_420)}, 1063 + 1130 1064 /* Panasonic panels */ 1131 1065 { .driver_data = MT_CLS_PANASONIC, 1132 1066 MT_USB_DEVICE(USB_VENDOR_ID_PANASONIC, ··· 1141 1065 USB_DEVICE_ID_PANABOARD_UBT880) }, 1142 1066 1143 1067 /* Novatek Panel */ 1144 - { .driver_data = MT_CLS_DEFAULT, 1068 + { .driver_data = MT_CLS_NSMU, 1145 1069 MT_USB_DEVICE(USB_VENDOR_ID_NOVATEK, 1146 1070 USB_DEVICE_ID_NOVATEK_PCT) }, 1147 1071 ··· 1187 1111 { .driver_data = MT_CLS_CONFIDENCE, 1188 1112 MT_USB_DEVICE(USB_VENDOR_ID_STANTUM_STM, 1189 1113 USB_DEVICE_ID_MTP_STM)}, 1190 - { .driver_data = MT_CLS_CONFIDENCE, 1114 + { .driver_data = MT_CLS_DEFAULT, 1191 1115 MT_USB_DEVICE(USB_VENDOR_ID_STANTUM_SITRONIX, 1192 1116 USB_DEVICE_ID_MTP_SITRONIX)}, 1193 1117 ··· 1197 1121 USB_DEVICE_ID_TOPSEED2_PERIPAD_701) }, 1198 1122 1199 1123 /* Touch International panels */ 1200 - { .driver_data = MT_CLS_DEFAULT, 1124 + { .driver_data = MT_CLS_NSMU, 1201 1125 MT_USB_DEVICE(USB_VENDOR_ID_TOUCH_INTL, 1202 1126 USB_DEVICE_ID_TOUCH_INTL_MULTI_TOUCH) }, 1203 1127 1204 1128 /* Unitec panels */ 1205 - { .driver_data = MT_CLS_DEFAULT, 1129 + { .driver_data = MT_CLS_NSMU, 1206 1130 MT_USB_DEVICE(USB_VENDOR_ID_UNITEC, 1207 1131 USB_DEVICE_ID_UNITEC_USB_TOUCH_0709) }, 1208 - { .driver_data = MT_CLS_DEFAULT, 1132 + { .driver_data = MT_CLS_NSMU, 1209 1133 MT_USB_DEVICE(USB_VENDOR_ID_UNITEC, 1210 1134 USB_DEVICE_ID_UNITEC_USB_TOUCH_0A19) }, 1211 1135 /* XAT */ 1212 - { .driver_data = MT_CLS_DEFAULT, 1136 + { .driver_data = MT_CLS_NSMU, 1213 1137 MT_USB_DEVICE(USB_VENDOR_ID_XAT, 1214 1138 USB_DEVICE_ID_XAT_CSR) }, 1215 1139 1216 1140 /* Xiroku */ 1217 - { .driver_data = MT_CLS_DEFAULT, 1141 + { .driver_data = MT_CLS_NSMU, 1218 1142 MT_USB_DEVICE(USB_VENDOR_ID_XIROKU, 1219 1143 USB_DEVICE_ID_XIROKU_SPX) }, 1220 - { .driver_data = MT_CLS_DEFAULT, 1144 + { .driver_data = MT_CLS_NSMU, 1221 1145 MT_USB_DEVICE(USB_VENDOR_ID_XIROKU, 1222 1146 USB_DEVICE_ID_XIROKU_MPX) }, 1223 - { .driver_data = MT_CLS_DEFAULT, 1147 + { .driver_data = MT_CLS_NSMU, 1224 1148 MT_USB_DEVICE(USB_VENDOR_ID_XIROKU, 1225 1149 USB_DEVICE_ID_XIROKU_CSR) }, 1226 - { .driver_data = MT_CLS_DEFAULT, 1150 + { .driver_data = MT_CLS_NSMU, 1227 1151 MT_USB_DEVICE(USB_VENDOR_ID_XIROKU, 1228 1152 USB_DEVICE_ID_XIROKU_SPX1) }, 1229 - { .driver_data = MT_CLS_DEFAULT, 1153 + { .driver_data = MT_CLS_NSMU, 1230 1154 MT_USB_DEVICE(USB_VENDOR_ID_XIROKU, 1231 1155 USB_DEVICE_ID_XIROKU_MPX1) }, 1232 - { .driver_data = MT_CLS_DEFAULT, 1156 + { .driver_data = MT_CLS_NSMU, 1233 1157 MT_USB_DEVICE(USB_VENDOR_ID_XIROKU, 1234 1158 USB_DEVICE_ID_XIROKU_CSR1) }, 1235 - { .driver_data = MT_CLS_DEFAULT, 1159 + { .driver_data = MT_CLS_NSMU, 1236 1160 MT_USB_DEVICE(USB_VENDOR_ID_XIROKU, 1237 1161 USB_DEVICE_ID_XIROKU_SPX2) }, 1238 - { .driver_data = MT_CLS_DEFAULT, 1162 + { .driver_data = MT_CLS_NSMU, 1239 1163 MT_USB_DEVICE(USB_VENDOR_ID_XIROKU, 1240 1164 USB_DEVICE_ID_XIROKU_MPX2) }, 1241 - { .driver_data = MT_CLS_DEFAULT, 1165 + { .driver_data = MT_CLS_NSMU, 1242 1166 MT_USB_DEVICE(USB_VENDOR_ID_XIROKU, 1243 1167 USB_DEVICE_ID_XIROKU_CSR2) }, 1244 1168 ··· 1269 1193 .feature_mapping = mt_feature_mapping, 1270 1194 .usage_table = mt_grabbed_usages, 1271 1195 .event = mt_event, 1196 + .report = mt_report, 1272 1197 #ifdef CONFIG_PM 1273 1198 .reset_resume = mt_reset_resume, 1274 1199 .resume = mt_resume, 1275 1200 #endif 1276 1201 }; 1277 - 1278 - static int __init mt_init(void) 1279 - { 1280 - return hid_register_driver(&mt_driver); 1281 - } 1282 - 1283 - static void __exit mt_exit(void) 1284 - { 1285 - hid_unregister_driver(&mt_driver); 1286 - } 1287 - 1288 - module_init(mt_init); 1289 - module_exit(mt_exit); 1202 + module_hid_driver(mt_driver);
+35 -46
drivers/hid/hid-ntrig.c
··· 858 858 return 1; 859 859 } 860 860 861 + static void ntrig_input_configured(struct hid_device *hid, 862 + struct hid_input *hidinput) 863 + 864 + { 865 + struct input_dev *input = hidinput->input; 866 + 867 + if (hidinput->report->maxfield < 1) 868 + return; 869 + 870 + switch (hidinput->report->field[0]->application) { 871 + case HID_DG_PEN: 872 + input->name = "N-Trig Pen"; 873 + break; 874 + case HID_DG_TOUCHSCREEN: 875 + /* These keys are redundant for fingers, clear them 876 + * to prevent incorrect identification */ 877 + __clear_bit(BTN_TOOL_PEN, input->keybit); 878 + __clear_bit(BTN_TOOL_FINGER, input->keybit); 879 + __clear_bit(BTN_0, input->keybit); 880 + __set_bit(BTN_TOOL_DOUBLETAP, input->keybit); 881 + /* 882 + * The physical touchscreen (single touch) 883 + * input has a value for physical, whereas 884 + * the multitouch only has logical input 885 + * fields. 886 + */ 887 + input->name = (hidinput->report->field[0]->physical) ? 888 + "N-Trig Touchscreen" : 889 + "N-Trig MultiTouch"; 890 + break; 891 + } 892 + } 893 + 861 894 static int ntrig_probe(struct hid_device *hdev, const struct hid_device_id *id) 862 895 { 863 896 int ret; 864 897 struct ntrig_data *nd; 865 - struct hid_input *hidinput; 866 - struct input_dev *input; 867 898 struct hid_report *report; 868 899 869 900 if (id->driver_data) ··· 930 899 if (ret) { 931 900 hid_err(hdev, "hw start failed\n"); 932 901 goto err_free; 933 - } 934 - 935 - 936 - list_for_each_entry(hidinput, &hdev->inputs, list) { 937 - if (hidinput->report->maxfield < 1) 938 - continue; 939 - 940 - input = hidinput->input; 941 - switch (hidinput->report->field[0]->application) { 942 - case HID_DG_PEN: 943 - input->name = "N-Trig Pen"; 944 - break; 945 - case HID_DG_TOUCHSCREEN: 946 - /* These keys are redundant for fingers, clear them 947 - * to prevent incorrect identification */ 948 - __clear_bit(BTN_TOOL_PEN, input->keybit); 949 - __clear_bit(BTN_TOOL_FINGER, input->keybit); 950 - __clear_bit(BTN_0, input->keybit); 951 - __set_bit(BTN_TOOL_DOUBLETAP, input->keybit); 952 - /* 953 - * The physical touchscreen (single touch) 954 - * input has a value for physical, whereas 955 - * the multitouch only has logical input 956 - * fields. 957 - */ 958 - input->name = 959 - (hidinput->report->field[0] 960 - ->physical) ? 961 - "N-Trig Touchscreen" : 962 - "N-Trig MultiTouch"; 963 - break; 964 - } 965 902 } 966 903 967 904 /* This is needed for devices with more recent firmware versions */ ··· 1022 1023 .remove = ntrig_remove, 1023 1024 .input_mapping = ntrig_input_mapping, 1024 1025 .input_mapped = ntrig_input_mapped, 1026 + .input_configured = ntrig_input_configured, 1025 1027 .usage_table = ntrig_grabbed_usages, 1026 1028 .event = ntrig_event, 1027 1029 }; 1030 + module_hid_driver(ntrig_driver); 1028 1031 1029 - static int __init ntrig_init(void) 1030 - { 1031 - return hid_register_driver(&ntrig_driver); 1032 - } 1033 - 1034 - static void __exit ntrig_exit(void) 1035 - { 1036 - hid_unregister_driver(&ntrig_driver); 1037 - } 1038 - 1039 - module_init(ntrig_init); 1040 - module_exit(ntrig_exit); 1041 1032 MODULE_LICENSE("GPL");
+1 -12
drivers/hid/hid-ortek.c
··· 50 50 .id_table = ortek_devices, 51 51 .report_fixup = ortek_report_fixup 52 52 }; 53 + module_hid_driver(ortek_driver); 53 54 54 - static int __init ortek_init(void) 55 - { 56 - return hid_register_driver(&ortek_driver); 57 - } 58 - 59 - static void __exit ortek_exit(void) 60 - { 61 - hid_unregister_driver(&ortek_driver); 62 - } 63 - 64 - module_init(ortek_init); 65 - module_exit(ortek_exit); 66 55 MODULE_LICENSE("GPL");
+1 -12
drivers/hid/hid-petalynx.c
··· 103 103 .input_mapping = pl_input_mapping, 104 104 .probe = pl_probe, 105 105 }; 106 + module_hid_driver(pl_driver); 106 107 107 - static int __init pl_init(void) 108 - { 109 - return hid_register_driver(&pl_driver); 110 - } 111 - 112 - static void __exit pl_exit(void) 113 - { 114 - hid_unregister_driver(&pl_driver); 115 - } 116 - 117 - module_init(pl_init); 118 - module_exit(pl_exit); 119 108 MODULE_LICENSE("GPL");
+1 -12
drivers/hid/hid-picolcd_core.c
··· 672 672 .reset_resume = picolcd_reset_resume, 673 673 #endif 674 674 }; 675 + module_hid_driver(picolcd_driver); 675 676 676 - static int __init picolcd_init(void) 677 - { 678 - return hid_register_driver(&picolcd_driver); 679 - } 680 - 681 - static void __exit picolcd_exit(void) 682 - { 683 - hid_unregister_driver(&picolcd_driver); 684 - } 685 - 686 - module_init(picolcd_init); 687 - module_exit(picolcd_exit); 688 677 MODULE_DESCRIPTION("Minibox graphics PicoLCD Driver"); 689 678 MODULE_LICENSE("GPL v2");
+12 -14
drivers/hid/hid-pl.c
··· 14 14 * 0e8f:0003 "GASIA USB Gamepad" 15 15 * - another version of the König gamepad 16 16 * 17 + * 0f30:0111 "Saitek Color Rumble Pad" 18 + * 17 19 * Copyright (c) 2007, 2009 Anssi Hannula <anssi.hannula@gmail.com> 18 20 */ 19 21 ··· 53 51 54 52 struct plff_device { 55 53 struct hid_report *report; 54 + s32 maxval; 56 55 s32 *strong; 57 56 s32 *weak; 58 57 }; ··· 69 66 right = effect->u.rumble.weak_magnitude; 70 67 debug("called with 0x%04x 0x%04x", left, right); 71 68 72 - left = left * 0x7f / 0xffff; 73 - right = right * 0x7f / 0xffff; 69 + left = left * plff->maxval / 0xffff; 70 + right = right * plff->maxval / 0xffff; 74 71 75 72 *plff->strong = left; 76 73 *plff->weak = right; ··· 90 87 struct list_head *report_ptr = report_list; 91 88 struct input_dev *dev; 92 89 int error; 90 + s32 maxval; 93 91 s32 *strong; 94 92 s32 *weak; 95 93 ··· 127 123 return -ENODEV; 128 124 } 129 125 126 + maxval = 0x7f; 130 127 if (report->field[0]->report_count >= 4) { 131 128 report->field[0]->value[0] = 0x00; 132 129 report->field[0]->value[1] = 0x00; ··· 140 135 report->field[1]->value[0] = 0x00; 141 136 strong = &report->field[2]->value[0]; 142 137 weak = &report->field[3]->value[0]; 138 + if (hid->vendor == USB_VENDOR_ID_JESS2) 139 + maxval = 0xff; 143 140 debug("detected 4-field device"); 144 141 } else { 145 142 hid_err(hid, "not enough fields or values\n"); ··· 165 158 plff->report = report; 166 159 plff->strong = strong; 167 160 plff->weak = weak; 161 + plff->maxval = maxval; 168 162 169 163 *strong = 0x00; 170 164 *weak = 0x00; ··· 215 207 { HID_USB_DEVICE(USB_VENDOR_ID_GAMERON, USB_DEVICE_ID_GAMERON_DUAL_PCS_ADAPTOR), 216 208 .driver_data = 1 }, /* Twin USB Joystick */ 217 209 { HID_USB_DEVICE(USB_VENDOR_ID_GREENASIA, 0x0003), }, 210 + { HID_USB_DEVICE(USB_VENDOR_ID_JESS2, USB_DEVICE_ID_JESS2_COLOR_RUMBLE_PAD), }, 218 211 { } 219 212 }; 220 213 MODULE_DEVICE_TABLE(hid, pl_devices); ··· 225 216 .id_table = pl_devices, 226 217 .probe = pl_probe, 227 218 }; 219 + module_hid_driver(pl_driver); 228 220 229 - static int __init pl_init(void) 230 - { 231 - return hid_register_driver(&pl_driver); 232 - } 233 - 234 - static void __exit pl_exit(void) 235 - { 236 - hid_unregister_driver(&pl_driver); 237 - } 238 - 239 - module_init(pl_init); 240 - module_exit(pl_exit); 241 221 MODULE_LICENSE("GPL");
+1 -12
drivers/hid/hid-primax.c
··· 75 75 .id_table = px_devices, 76 76 .raw_event = px_raw_event, 77 77 }; 78 + module_hid_driver(px_driver); 78 79 79 - static int __init px_init(void) 80 - { 81 - return hid_register_driver(&px_driver); 82 - } 83 - 84 - static void __exit px_exit(void) 85 - { 86 - hid_unregister_driver(&px_driver); 87 - } 88 - 89 - module_init(px_init); 90 - module_exit(px_exit); 91 80 MODULE_AUTHOR("Terry Lambert <tlambert@google.com>"); 92 81 MODULE_LICENSE("GPL");
+1 -18
drivers/hid/hid-prodikeys.c
··· 889 889 .probe = pk_probe, 890 890 .remove = pk_remove, 891 891 }; 892 + module_hid_driver(pk_driver); 892 893 893 - static int pk_init(void) 894 - { 895 - int ret; 896 - 897 - ret = hid_register_driver(&pk_driver); 898 - if (ret) 899 - pr_err("can't register prodikeys driver\n"); 900 - 901 - return ret; 902 - } 903 - 904 - static void pk_exit(void) 905 - { 906 - hid_unregister_driver(&pk_driver); 907 - } 908 - 909 - module_init(pk_init); 910 - module_exit(pk_exit); 911 894 MODULE_LICENSE("GPL");
+1 -12
drivers/hid/hid-ps3remote.c
··· 198 198 .report_fixup = ps3remote_fixup, 199 199 .input_mapping = ps3remote_mapping, 200 200 }; 201 + module_hid_driver(ps3remote_driver); 201 202 202 - static int __init ps3remote_init(void) 203 - { 204 - return hid_register_driver(&ps3remote_driver); 205 - } 206 - 207 - static void __exit ps3remote_exit(void) 208 - { 209 - hid_unregister_driver(&ps3remote_driver); 210 - } 211 - 212 - module_init(ps3remote_init); 213 - module_exit(ps3remote_exit); 214 203 MODULE_LICENSE("GPL"); 215 204 MODULE_AUTHOR("David Dillow <dave@thedillows.org>, Antonio Ospite <ospite@studenti.unina.it>");
+1 -13
drivers/hid/hid-roccat-lua.c
··· 208 208 .probe = lua_probe, 209 209 .remove = lua_remove 210 210 }; 211 - 212 - static int __init lua_init(void) 213 - { 214 - return hid_register_driver(&lua_driver); 215 - } 216 - 217 - static void __exit lua_exit(void) 218 - { 219 - hid_unregister_driver(&lua_driver); 220 - } 221 - 222 - module_init(lua_init); 223 - module_exit(lua_exit); 211 + module_hid_driver(lua_driver); 224 212 225 213 MODULE_AUTHOR("Stefan Achatz"); 226 214 MODULE_DESCRIPTION("USB Roccat Lua driver");
+1 -12
drivers/hid/hid-saitek.c
··· 54 54 .id_table = saitek_devices, 55 55 .report_fixup = saitek_report_fixup 56 56 }; 57 + module_hid_driver(saitek_driver); 57 58 58 - static int __init saitek_init(void) 59 - { 60 - return hid_register_driver(&saitek_driver); 61 - } 62 - 63 - static void __exit saitek_exit(void) 64 - { 65 - hid_unregister_driver(&saitek_driver); 66 - } 67 - 68 - module_init(saitek_init); 69 - module_exit(saitek_exit); 70 59 MODULE_LICENSE("GPL");
+1 -12
drivers/hid/hid-samsung.c
··· 196 196 .input_mapping = samsung_input_mapping, 197 197 .probe = samsung_probe, 198 198 }; 199 + module_hid_driver(samsung_driver); 199 200 200 - static int __init samsung_init(void) 201 - { 202 - return hid_register_driver(&samsung_driver); 203 - } 204 - 205 - static void __exit samsung_exit(void) 206 - { 207 - hid_unregister_driver(&samsung_driver); 208 - } 209 - 210 - module_init(samsung_init); 211 - module_exit(samsung_exit); 212 201 MODULE_LICENSE("GPL");
+3 -19
drivers/hid/hid-sensor-hub.c
··· 605 605 } 606 606 607 607 static const struct hid_device_id sensor_hub_devices[] = { 608 - { HID_DEVICE(BUS_USB, HID_GROUP_SENSOR_HUB, HID_ANY_ID, HID_ANY_ID) }, 608 + { HID_DEVICE(HID_BUS_ANY, HID_GROUP_SENSOR_HUB, HID_ANY_ID, 609 + HID_ANY_ID) }, 609 610 { } 610 611 }; 611 612 MODULE_DEVICE_TABLE(hid, sensor_hub_devices); 612 - 613 - static const struct hid_usage_id sensor_hub_grabbed_usages[] = { 614 - { HID_ANY_ID, HID_ANY_ID, HID_ANY_ID }, 615 - { HID_ANY_ID - 1, HID_ANY_ID - 1, HID_ANY_ID - 1 } 616 - }; 617 613 618 614 static struct hid_driver sensor_hub_driver = { 619 615 .name = "hid-sensor-hub", ··· 623 627 .reset_resume = sensor_hub_reset_resume, 624 628 #endif 625 629 }; 626 - 627 - static int __init sensor_hub_init(void) 628 - { 629 - return hid_register_driver(&sensor_hub_driver); 630 - } 631 - 632 - static void __exit sensor_hub_exit(void) 633 - { 634 - hid_unregister_driver(&sensor_hub_driver); 635 - } 636 - 637 - module_init(sensor_hub_init); 638 - module_exit(sensor_hub_exit); 630 + module_hid_driver(sensor_hub_driver); 639 631 640 632 MODULE_DESCRIPTION("HID Sensor Hub driver"); 641 633 MODULE_AUTHOR("Srinivas Pandruvada <srinivas.pandruvada@intel.com>");
+1 -12
drivers/hid/hid-sjoy.c
··· 177 177 .id_table = sjoy_devices, 178 178 .probe = sjoy_probe, 179 179 }; 180 + module_hid_driver(sjoy_driver); 180 181 181 - static int __init sjoy_init(void) 182 - { 183 - return hid_register_driver(&sjoy_driver); 184 - } 185 - 186 - static void __exit sjoy_exit(void) 187 - { 188 - hid_unregister_driver(&sjoy_driver); 189 - } 190 - 191 - module_init(sjoy_init); 192 - module_exit(sjoy_exit); 193 182 MODULE_LICENSE("GPL"); 194 183 MODULE_AUTHOR("Jussi Kivilinna"); 195 184
+44 -15
drivers/hid/hid-sony.c
··· 33 33 0x03, 0x46, 0xFF, 0x03, 0x09, 0x01, 0x81, 0x02 34 34 }; 35 35 36 + static const u8 sixaxis_rdesc_fixup2[] = { 37 + 0x05, 0x01, 0x09, 0x04, 0xa1, 0x01, 0xa1, 0x02, 38 + 0x85, 0x01, 0x75, 0x08, 0x95, 0x01, 0x15, 0x00, 39 + 0x26, 0xff, 0x00, 0x81, 0x03, 0x75, 0x01, 0x95, 40 + 0x13, 0x15, 0x00, 0x25, 0x01, 0x35, 0x00, 0x45, 41 + 0x01, 0x05, 0x09, 0x19, 0x01, 0x29, 0x13, 0x81, 42 + 0x02, 0x75, 0x01, 0x95, 0x0d, 0x06, 0x00, 0xff, 43 + 0x81, 0x03, 0x15, 0x00, 0x26, 0xff, 0x00, 0x05, 44 + 0x01, 0x09, 0x01, 0xa1, 0x00, 0x75, 0x08, 0x95, 45 + 0x04, 0x35, 0x00, 0x46, 0xff, 0x00, 0x09, 0x30, 46 + 0x09, 0x31, 0x09, 0x32, 0x09, 0x35, 0x81, 0x02, 47 + 0xc0, 0x05, 0x01, 0x95, 0x13, 0x09, 0x01, 0x81, 48 + 0x02, 0x95, 0x0c, 0x81, 0x01, 0x75, 0x10, 0x95, 49 + 0x04, 0x26, 0xff, 0x03, 0x46, 0xff, 0x03, 0x09, 50 + 0x01, 0x81, 0x02, 0xc0, 0xa1, 0x02, 0x85, 0x02, 51 + 0x75, 0x08, 0x95, 0x30, 0x09, 0x01, 0xb1, 0x02, 52 + 0xc0, 0xa1, 0x02, 0x85, 0xee, 0x75, 0x08, 0x95, 53 + 0x30, 0x09, 0x01, 0xb1, 0x02, 0xc0, 0xa1, 0x02, 54 + 0x85, 0xef, 0x75, 0x08, 0x95, 0x30, 0x09, 0x01, 55 + 0xb1, 0x02, 0xc0, 0xc0, 56 + }; 57 + 36 58 struct sony_sc { 37 59 unsigned long quirks; 38 60 }; ··· 65 43 { 66 44 struct sony_sc *sc = hid_get_drvdata(hdev); 67 45 68 - if ((sc->quirks & VAIO_RDESC_CONSTANT) && 69 - *rsize >= 56 && rdesc[54] == 0x81 && rdesc[55] == 0x07) { 70 - hid_info(hdev, "Fixing up Sony Vaio VGX report descriptor\n"); 46 + /* 47 + * Some Sony RF receivers wrongly declare the mouse pointer as a 48 + * a constant non-data variable. 49 + */ 50 + if ((sc->quirks & VAIO_RDESC_CONSTANT) && *rsize >= 56 && 51 + /* usage page: generic desktop controls */ 52 + /* rdesc[0] == 0x05 && rdesc[1] == 0x01 && */ 53 + /* usage: mouse */ 54 + rdesc[2] == 0x09 && rdesc[3] == 0x02 && 55 + /* input (usage page for x,y axes): constant, variable, relative */ 56 + rdesc[54] == 0x81 && rdesc[55] == 0x07) { 57 + hid_info(hdev, "Fixing up Sony RF Receiver report descriptor\n"); 58 + /* input: data, variable, relative */ 71 59 rdesc[55] = 0x06; 72 60 } 73 61 ··· 88 56 hid_info(hdev, "Fixing up Sony Sixaxis report descriptor\n"); 89 57 memcpy((void *)&rdesc[83], (void *)&sixaxis_rdesc_fixup, 90 58 sizeof(sixaxis_rdesc_fixup)); 59 + } else if (sc->quirks & SIXAXIS_CONTROLLER_USB && 60 + *rsize > sizeof(sixaxis_rdesc_fixup2)) { 61 + hid_info(hdev, "Sony Sixaxis clone detected. Using original report descriptor (size: %d clone; %d new)\n", 62 + *rsize, (int)sizeof(sixaxis_rdesc_fixup2)); 63 + *rsize = sizeof(sixaxis_rdesc_fixup2); 64 + memcpy(rdesc, &sixaxis_rdesc_fixup2, *rsize); 91 65 } 92 66 return rdesc; 93 67 } ··· 255 217 .driver_data = SIXAXIS_CONTROLLER_BT }, 256 218 { HID_USB_DEVICE(USB_VENDOR_ID_SONY, USB_DEVICE_ID_SONY_VAIO_VGX_MOUSE), 257 219 .driver_data = VAIO_RDESC_CONSTANT }, 220 + { HID_USB_DEVICE(USB_VENDOR_ID_SONY, USB_DEVICE_ID_SONY_VAIO_VGP_MOUSE), 221 + .driver_data = VAIO_RDESC_CONSTANT }, 258 222 { } 259 223 }; 260 224 MODULE_DEVICE_TABLE(hid, sony_devices); ··· 269 229 .report_fixup = sony_report_fixup, 270 230 .raw_event = sony_raw_event 271 231 }; 232 + module_hid_driver(sony_driver); 272 233 273 - static int __init sony_init(void) 274 - { 275 - return hid_register_driver(&sony_driver); 276 - } 277 - 278 - static void __exit sony_exit(void) 279 - { 280 - hid_unregister_driver(&sony_driver); 281 - } 282 - 283 - module_init(sony_init); 284 - module_exit(sony_exit); 285 234 MODULE_LICENSE("GPL");
+1 -12
drivers/hid/hid-speedlink.c
··· 73 73 .input_mapping = speedlink_input_mapping, 74 74 .event = speedlink_event, 75 75 }; 76 + module_hid_driver(speedlink_driver); 76 77 77 - static int __init speedlink_init(void) 78 - { 79 - return hid_register_driver(&speedlink_driver); 80 - } 81 - 82 - static void __exit speedlink_exit(void) 83 - { 84 - hid_unregister_driver(&speedlink_driver); 85 - } 86 - 87 - module_init(speedlink_init); 88 - module_exit(speedlink_exit); 89 78 MODULE_LICENSE("GPL");
+393
drivers/hid/hid-steelseries.c
··· 1 + /* 2 + * HID driver for Steelseries SRW-S1 3 + * 4 + * Copyright (c) 2013 Simon Wood 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/usb.h> 16 + #include <linux/hid.h> 17 + #include <linux/module.h> 18 + 19 + #include "usbhid/usbhid.h" 20 + #include "hid-ids.h" 21 + 22 + #if defined(CONFIG_LEDS_CLASS) || defined(CONFIG_LEDS_CLASS_MODULE) 23 + #define SRWS1_NUMBER_LEDS 15 24 + struct steelseries_srws1_data { 25 + __u16 led_state; 26 + /* the last element is used for setting all leds simultaneously */ 27 + struct led_classdev *led[SRWS1_NUMBER_LEDS + 1]; 28 + }; 29 + #endif 30 + 31 + /* Fixed report descriptor for Steelseries SRW-S1 wheel controller 32 + * 33 + * The original descriptor hides the sensitivity and assists dials 34 + * a custom vendor usage page. This inserts a patch to make them 35 + * appear in the 'Generic Desktop' usage. 36 + */ 37 + 38 + static __u8 steelseries_srws1_rdesc_fixed[] = { 39 + 0x05, 0x01, /* Usage Page (Desktop) */ 40 + 0x09, 0x08, /* Usage (MultiAxis), Changed */ 41 + 0xA1, 0x01, /* Collection (Application), */ 42 + 0xA1, 0x02, /* Collection (Logical), */ 43 + 0x95, 0x01, /* Report Count (1), */ 44 + 0x05, 0x01, /* Changed Usage Page (Desktop), */ 45 + 0x09, 0x30, /* Changed Usage (X), */ 46 + 0x16, 0xF8, 0xF8, /* Logical Minimum (-1800), */ 47 + 0x26, 0x08, 0x07, /* Logical Maximum (1800), */ 48 + 0x65, 0x14, /* Unit (Degrees), */ 49 + 0x55, 0x0F, /* Unit Exponent (15), */ 50 + 0x75, 0x10, /* Report Size (16), */ 51 + 0x81, 0x02, /* Input (Variable), */ 52 + 0x09, 0x31, /* Changed Usage (Y), */ 53 + 0x15, 0x00, /* Logical Minimum (0), */ 54 + 0x26, 0xFF, 0x03, /* Logical Maximum (1023), */ 55 + 0x75, 0x0C, /* Report Size (12), */ 56 + 0x81, 0x02, /* Input (Variable), */ 57 + 0x09, 0x32, /* Changed Usage (Z), */ 58 + 0x15, 0x00, /* Logical Minimum (0), */ 59 + 0x26, 0xFF, 0x03, /* Logical Maximum (1023), */ 60 + 0x75, 0x0C, /* Report Size (12), */ 61 + 0x81, 0x02, /* Input (Variable), */ 62 + 0x05, 0x01, /* Usage Page (Desktop), */ 63 + 0x09, 0x39, /* Usage (Hat Switch), */ 64 + 0x25, 0x07, /* Logical Maximum (7), */ 65 + 0x35, 0x00, /* Physical Minimum (0), */ 66 + 0x46, 0x3B, 0x01, /* Physical Maximum (315), */ 67 + 0x65, 0x14, /* Unit (Degrees), */ 68 + 0x75, 0x04, /* Report Size (4), */ 69 + 0x95, 0x01, /* Report Count (1), */ 70 + 0x81, 0x02, /* Input (Variable), */ 71 + 0x25, 0x01, /* Logical Maximum (1), */ 72 + 0x45, 0x01, /* Physical Maximum (1), */ 73 + 0x65, 0x00, /* Unit, */ 74 + 0x75, 0x01, /* Report Size (1), */ 75 + 0x95, 0x03, /* Report Count (3), */ 76 + 0x81, 0x01, /* Input (Constant), */ 77 + 0x05, 0x09, /* Usage Page (Button), */ 78 + 0x19, 0x01, /* Usage Minimum (01h), */ 79 + 0x29, 0x11, /* Usage Maximum (11h), */ 80 + 0x95, 0x11, /* Report Count (17), */ 81 + 0x81, 0x02, /* Input (Variable), */ 82 + /* ---- Dial patch starts here ---- */ 83 + 0x05, 0x01, /* Usage Page (Desktop), */ 84 + 0x09, 0x33, /* Usage (RX), */ 85 + 0x75, 0x04, /* Report Size (4), */ 86 + 0x95, 0x02, /* Report Count (2), */ 87 + 0x15, 0x00, /* Logical Minimum (0), */ 88 + 0x25, 0x0b, /* Logical Maximum (b), */ 89 + 0x81, 0x02, /* Input (Variable), */ 90 + 0x09, 0x35, /* Usage (RZ), */ 91 + 0x75, 0x04, /* Report Size (4), */ 92 + 0x95, 0x01, /* Report Count (1), */ 93 + 0x25, 0x03, /* Logical Maximum (3), */ 94 + 0x81, 0x02, /* Input (Variable), */ 95 + /* ---- Dial patch ends here ---- */ 96 + 0x06, 0x00, 0xFF, /* Usage Page (FF00h), */ 97 + 0x09, 0x01, /* Usage (01h), */ 98 + 0x75, 0x04, /* Changed Report Size (4), */ 99 + 0x95, 0x0D, /* Changed Report Count (13), */ 100 + 0x81, 0x02, /* Input (Variable), */ 101 + 0xC0, /* End Collection, */ 102 + 0xA1, 0x02, /* Collection (Logical), */ 103 + 0x09, 0x02, /* Usage (02h), */ 104 + 0x75, 0x08, /* Report Size (8), */ 105 + 0x95, 0x10, /* Report Count (16), */ 106 + 0x91, 0x02, /* Output (Variable), */ 107 + 0xC0, /* End Collection, */ 108 + 0xC0 /* End Collection */ 109 + }; 110 + 111 + #if defined(CONFIG_LEDS_CLASS) || defined(CONFIG_LEDS_CLASS_MODULE) 112 + static void steelseries_srws1_set_leds(struct hid_device *hdev, __u16 leds) 113 + { 114 + struct list_head *report_list = &hdev->report_enum[HID_OUTPUT_REPORT].report_list; 115 + struct hid_report *report = list_entry(report_list->next, struct hid_report, list); 116 + __s32 *value = report->field[0]->value; 117 + 118 + value[0] = 0x40; 119 + value[1] = leds & 0xFF; 120 + value[2] = leds >> 8; 121 + value[3] = 0x00; 122 + value[4] = 0x00; 123 + value[5] = 0x00; 124 + value[6] = 0x00; 125 + value[7] = 0x00; 126 + value[8] = 0x00; 127 + value[9] = 0x00; 128 + value[10] = 0x00; 129 + value[11] = 0x00; 130 + value[12] = 0x00; 131 + value[13] = 0x00; 132 + value[14] = 0x00; 133 + value[15] = 0x00; 134 + 135 + usbhid_submit_report(hdev, report, USB_DIR_OUT); 136 + 137 + /* Note: LED change does not show on device until the device is read/polled */ 138 + } 139 + 140 + static void steelseries_srws1_led_all_set_brightness(struct led_classdev *led_cdev, 141 + enum led_brightness value) 142 + { 143 + struct device *dev = led_cdev->dev->parent; 144 + struct hid_device *hid = container_of(dev, struct hid_device, dev); 145 + struct steelseries_srws1_data *drv_data = hid_get_drvdata(hid); 146 + 147 + if (!drv_data) { 148 + hid_err(hid, "Device data not found."); 149 + return; 150 + } 151 + 152 + if (value == LED_OFF) 153 + drv_data->led_state = 0; 154 + else 155 + drv_data->led_state = (1 << (SRWS1_NUMBER_LEDS + 1)) - 1; 156 + 157 + steelseries_srws1_set_leds(hid, drv_data->led_state); 158 + } 159 + 160 + static enum led_brightness steelseries_srws1_led_all_get_brightness(struct led_classdev *led_cdev) 161 + { 162 + struct device *dev = led_cdev->dev->parent; 163 + struct hid_device *hid = container_of(dev, struct hid_device, dev); 164 + struct steelseries_srws1_data *drv_data; 165 + 166 + drv_data = hid_get_drvdata(hid); 167 + 168 + if (!drv_data) { 169 + hid_err(hid, "Device data not found."); 170 + return LED_OFF; 171 + } 172 + 173 + return (drv_data->led_state >> SRWS1_NUMBER_LEDS) ? LED_FULL : LED_OFF; 174 + } 175 + 176 + static void steelseries_srws1_led_set_brightness(struct led_classdev *led_cdev, 177 + enum led_brightness value) 178 + { 179 + struct device *dev = led_cdev->dev->parent; 180 + struct hid_device *hid = container_of(dev, struct hid_device, dev); 181 + struct steelseries_srws1_data *drv_data = hid_get_drvdata(hid); 182 + int i, state = 0; 183 + 184 + if (!drv_data) { 185 + hid_err(hid, "Device data not found."); 186 + return; 187 + } 188 + 189 + for (i = 0; i < SRWS1_NUMBER_LEDS; i++) { 190 + if (led_cdev != drv_data->led[i]) 191 + continue; 192 + 193 + state = (drv_data->led_state >> i) & 1; 194 + if (value == LED_OFF && state) { 195 + drv_data->led_state &= ~(1 << i); 196 + steelseries_srws1_set_leds(hid, drv_data->led_state); 197 + } else if (value != LED_OFF && !state) { 198 + drv_data->led_state |= 1 << i; 199 + steelseries_srws1_set_leds(hid, drv_data->led_state); 200 + } 201 + break; 202 + } 203 + } 204 + 205 + static enum led_brightness steelseries_srws1_led_get_brightness(struct led_classdev *led_cdev) 206 + { 207 + struct device *dev = led_cdev->dev->parent; 208 + struct hid_device *hid = container_of(dev, struct hid_device, dev); 209 + struct steelseries_srws1_data *drv_data; 210 + int i, value = 0; 211 + 212 + drv_data = hid_get_drvdata(hid); 213 + 214 + if (!drv_data) { 215 + hid_err(hid, "Device data not found."); 216 + return LED_OFF; 217 + } 218 + 219 + for (i = 0; i < SRWS1_NUMBER_LEDS; i++) 220 + if (led_cdev == drv_data->led[i]) { 221 + value = (drv_data->led_state >> i) & 1; 222 + break; 223 + } 224 + 225 + return value ? LED_FULL : LED_OFF; 226 + } 227 + 228 + static int steelseries_srws1_probe(struct hid_device *hdev, 229 + const struct hid_device_id *id) 230 + { 231 + int ret, i; 232 + struct led_classdev *led; 233 + size_t name_sz; 234 + char *name; 235 + 236 + struct steelseries_srws1_data *drv_data = kzalloc(sizeof(*drv_data), GFP_KERNEL); 237 + 238 + if (drv_data == NULL) { 239 + hid_err(hdev, "can't alloc SRW-S1 memory\n"); 240 + return -ENOMEM; 241 + } 242 + 243 + hid_set_drvdata(hdev, drv_data); 244 + 245 + ret = hid_parse(hdev); 246 + if (ret) { 247 + hid_err(hdev, "parse failed\n"); 248 + goto err_free; 249 + } 250 + 251 + ret = hid_hw_start(hdev, HID_CONNECT_DEFAULT); 252 + if (ret) { 253 + hid_err(hdev, "hw start failed\n"); 254 + goto err_free; 255 + } 256 + 257 + /* register led subsystem */ 258 + drv_data->led_state = 0; 259 + for (i = 0; i < SRWS1_NUMBER_LEDS + 1; i++) 260 + drv_data->led[i] = NULL; 261 + 262 + steelseries_srws1_set_leds(hdev, 0); 263 + 264 + name_sz = strlen(hdev->uniq) + 16; 265 + 266 + /* 'ALL', for setting all LEDs simultaneously */ 267 + led = kzalloc(sizeof(struct led_classdev)+name_sz, GFP_KERNEL); 268 + if (!led) { 269 + hid_err(hdev, "can't allocate memory for LED ALL\n"); 270 + goto err_led; 271 + } 272 + 273 + name = (void *)(&led[1]); 274 + snprintf(name, name_sz, "SRWS1::%s::RPMALL", hdev->uniq); 275 + led->name = name; 276 + led->brightness = 0; 277 + led->max_brightness = 1; 278 + led->brightness_get = steelseries_srws1_led_all_get_brightness; 279 + led->brightness_set = steelseries_srws1_led_all_set_brightness; 280 + 281 + drv_data->led[SRWS1_NUMBER_LEDS] = led; 282 + ret = led_classdev_register(&hdev->dev, led); 283 + if (ret) 284 + goto err_led; 285 + 286 + /* Each individual LED */ 287 + for (i = 0; i < SRWS1_NUMBER_LEDS; i++) { 288 + led = kzalloc(sizeof(struct led_classdev)+name_sz, GFP_KERNEL); 289 + if (!led) { 290 + hid_err(hdev, "can't allocate memory for LED %d\n", i); 291 + goto err_led; 292 + } 293 + 294 + name = (void *)(&led[1]); 295 + snprintf(name, name_sz, "SRWS1::%s::RPM%d", hdev->uniq, i+1); 296 + led->name = name; 297 + led->brightness = 0; 298 + led->max_brightness = 1; 299 + led->brightness_get = steelseries_srws1_led_get_brightness; 300 + led->brightness_set = steelseries_srws1_led_set_brightness; 301 + 302 + drv_data->led[i] = led; 303 + ret = led_classdev_register(&hdev->dev, led); 304 + 305 + if (ret) { 306 + hid_err(hdev, "failed to register LED %d. Aborting.\n", i); 307 + err_led: 308 + /* Deregister all LEDs (if any) */ 309 + for (i = 0; i < SRWS1_NUMBER_LEDS + 1; i++) { 310 + led = drv_data->led[i]; 311 + drv_data->led[i] = NULL; 312 + if (!led) 313 + continue; 314 + led_classdev_unregister(led); 315 + kfree(led); 316 + } 317 + goto out; /* but let the driver continue without LEDs */ 318 + } 319 + } 320 + out: 321 + return 0; 322 + err_free: 323 + kfree(drv_data); 324 + return ret; 325 + } 326 + 327 + static void steelseries_srws1_remove(struct hid_device *hdev) 328 + { 329 + int i; 330 + struct led_classdev *led; 331 + 332 + struct steelseries_srws1_data *drv_data = hid_get_drvdata(hdev); 333 + 334 + if (drv_data) { 335 + /* Deregister LEDs (if any) */ 336 + for (i = 0; i < SRWS1_NUMBER_LEDS + 1; i++) { 337 + led = drv_data->led[i]; 338 + drv_data->led[i] = NULL; 339 + if (!led) 340 + continue; 341 + led_classdev_unregister(led); 342 + kfree(led); 343 + } 344 + 345 + } 346 + 347 + hid_hw_stop(hdev); 348 + kfree(drv_data); 349 + return; 350 + } 351 + #endif 352 + 353 + static __u8 *steelseries_srws1_report_fixup(struct hid_device *hdev, __u8 *rdesc, 354 + unsigned int *rsize) 355 + { 356 + if (*rsize >= 115 && rdesc[11] == 0x02 && rdesc[13] == 0xc8 357 + && rdesc[29] == 0xbb && rdesc[40] == 0xc5) { 358 + hid_info(hdev, "Fixing up Steelseries SRW-S1 report descriptor\n"); 359 + rdesc = steelseries_srws1_rdesc_fixed; 360 + *rsize = sizeof(steelseries_srws1_rdesc_fixed); 361 + } 362 + return rdesc; 363 + } 364 + 365 + static const struct hid_device_id steelseries_srws1_devices[] = { 366 + { HID_USB_DEVICE(USB_VENDOR_ID_STEELSERIES, USB_DEVICE_ID_STEELSERIES_SRWS1) }, 367 + { } 368 + }; 369 + MODULE_DEVICE_TABLE(hid, steelseries_srws1_devices); 370 + 371 + static struct hid_driver steelseries_srws1_driver = { 372 + .name = "steelseries_srws1", 373 + .id_table = steelseries_srws1_devices, 374 + #if defined(CONFIG_LEDS_CLASS) || defined(CONFIG_LEDS_CLASS_MODULE) 375 + .probe = steelseries_srws1_probe, 376 + .remove = steelseries_srws1_remove, 377 + #endif 378 + .report_fixup = steelseries_srws1_report_fixup 379 + }; 380 + 381 + static int __init steelseries_srws1_init(void) 382 + { 383 + return hid_register_driver(&steelseries_srws1_driver); 384 + } 385 + 386 + static void __exit steelseries_srws1_exit(void) 387 + { 388 + hid_unregister_driver(&steelseries_srws1_driver); 389 + } 390 + 391 + module_init(steelseries_srws1_init); 392 + module_exit(steelseries_srws1_exit); 393 + MODULE_LICENSE("GPL");
+1 -12
drivers/hid/hid-sunplus.c
··· 63 63 .report_fixup = sp_report_fixup, 64 64 .input_mapping = sp_input_mapping, 65 65 }; 66 + module_hid_driver(sp_driver); 66 67 67 - static int __init sp_init(void) 68 - { 69 - return hid_register_driver(&sp_driver); 70 - } 71 - 72 - static void __exit sp_exit(void) 73 - { 74 - hid_unregister_driver(&sp_driver); 75 - } 76 - 77 - module_init(sp_init); 78 - module_exit(sp_exit); 79 68 MODULE_LICENSE("GPL");
+272
drivers/hid/hid-thingm.c
··· 1 + /* 2 + * ThingM blink(1) USB RGB LED driver 3 + * 4 + * Copyright 2013 Savoir-faire Linux Inc. 5 + * Vivien Didelot <vivien.didelot@savoirfairelinux.com> 6 + * 7 + * This program is free software; you can redistribute it and/or 8 + * modify it under the terms of the GNU General Public License as 9 + * published by the Free Software Foundation, version 2. 10 + */ 11 + 12 + #include <linux/hid.h> 13 + #include <linux/leds.h> 14 + #include <linux/module.h> 15 + #include <linux/usb.h> 16 + 17 + #include "hid-ids.h" 18 + 19 + #define BLINK1_CMD_SIZE 9 20 + 21 + #define blink1_rgb_to_r(rgb) ((rgb & 0xFF0000) >> 16) 22 + #define blink1_rgb_to_g(rgb) ((rgb & 0x00FF00) >> 8) 23 + #define blink1_rgb_to_b(rgb) ((rgb & 0x0000FF) >> 0) 24 + 25 + /** 26 + * struct blink1_data - blink(1) device specific data 27 + * @hdev: HID device. 28 + * @led_cdev: LED class instance. 29 + * @rgb: 8-bit per channel RGB notation. 30 + * @fade: fade time in hundredths of a second. 31 + * @brightness: brightness coefficient. 32 + * @play: play/pause in-memory patterns. 33 + */ 34 + struct blink1_data { 35 + struct hid_device *hdev; 36 + struct led_classdev led_cdev; 37 + u32 rgb; 38 + u16 fade; 39 + u8 brightness; 40 + bool play; 41 + }; 42 + 43 + static int blink1_send_command(struct blink1_data *data, 44 + u8 buf[BLINK1_CMD_SIZE]) 45 + { 46 + int ret; 47 + 48 + hid_dbg(data->hdev, "command: %d%c%.2x%.2x%.2x%.2x%.2x%.2x%.2x\n", 49 + buf[0], buf[1], buf[2], buf[3], buf[4], 50 + buf[5], buf[6], buf[7], buf[8]); 51 + 52 + ret = data->hdev->hid_output_raw_report(data->hdev, buf, 53 + BLINK1_CMD_SIZE, HID_FEATURE_REPORT); 54 + 55 + return ret < 0 ? ret : 0; 56 + } 57 + 58 + static int blink1_update_color(struct blink1_data *data) 59 + { 60 + u8 buf[BLINK1_CMD_SIZE] = { 1, 'n', 0, 0, 0, 0, 0, 0, 0 }; 61 + 62 + if (data->brightness) { 63 + unsigned int coef = DIV_ROUND_CLOSEST(255, data->brightness); 64 + 65 + buf[2] = DIV_ROUND_CLOSEST(blink1_rgb_to_r(data->rgb), coef); 66 + buf[3] = DIV_ROUND_CLOSEST(blink1_rgb_to_g(data->rgb), coef); 67 + buf[4] = DIV_ROUND_CLOSEST(blink1_rgb_to_b(data->rgb), coef); 68 + } 69 + 70 + if (data->fade) { 71 + buf[1] = 'c'; 72 + buf[5] = (data->fade & 0xFF00) >> 8; 73 + buf[6] = (data->fade & 0x00FF); 74 + } 75 + 76 + return blink1_send_command(data, buf); 77 + } 78 + 79 + static void blink1_led_set(struct led_classdev *led_cdev, 80 + enum led_brightness brightness) 81 + { 82 + struct blink1_data *data = dev_get_drvdata(led_cdev->dev->parent); 83 + 84 + data->brightness = brightness; 85 + if (blink1_update_color(data)) 86 + hid_err(data->hdev, "failed to update color\n"); 87 + } 88 + 89 + static enum led_brightness blink1_led_get(struct led_classdev *led_cdev) 90 + { 91 + struct blink1_data *data = dev_get_drvdata(led_cdev->dev->parent); 92 + 93 + return data->brightness; 94 + } 95 + 96 + static ssize_t blink1_show_rgb(struct device *dev, 97 + struct device_attribute *attr, char *buf) 98 + { 99 + struct blink1_data *data = dev_get_drvdata(dev->parent); 100 + 101 + return sprintf(buf, "%.6X\n", data->rgb); 102 + } 103 + 104 + static ssize_t blink1_store_rgb(struct device *dev, 105 + struct device_attribute *attr, const char *buf, size_t count) 106 + { 107 + struct blink1_data *data = dev_get_drvdata(dev->parent); 108 + long unsigned int rgb; 109 + int ret; 110 + 111 + ret = kstrtoul(buf, 16, &rgb); 112 + if (ret) 113 + return ret; 114 + 115 + /* RGB triplet notation is 24-bit hexadecimal */ 116 + if (rgb > 0xFFFFFF) 117 + return -EINVAL; 118 + 119 + data->rgb = rgb; 120 + ret = blink1_update_color(data); 121 + 122 + return ret ? ret : count; 123 + } 124 + 125 + static DEVICE_ATTR(rgb, S_IRUGO | S_IWUSR, blink1_show_rgb, blink1_store_rgb); 126 + 127 + static ssize_t blink1_show_fade(struct device *dev, 128 + struct device_attribute *attr, char *buf) 129 + { 130 + struct blink1_data *data = dev_get_drvdata(dev->parent); 131 + 132 + return sprintf(buf, "%d\n", data->fade * 10); 133 + } 134 + 135 + static ssize_t blink1_store_fade(struct device *dev, 136 + struct device_attribute *attr, const char *buf, size_t count) 137 + { 138 + struct blink1_data *data = dev_get_drvdata(dev->parent); 139 + long unsigned int fade; 140 + int ret; 141 + 142 + ret = kstrtoul(buf, 10, &fade); 143 + if (ret) 144 + return ret; 145 + 146 + /* blink(1) accepts 16-bit fade time, number of 10ms ticks */ 147 + fade = DIV_ROUND_CLOSEST(fade, 10); 148 + if (fade > 65535) 149 + return -EINVAL; 150 + 151 + data->fade = fade; 152 + 153 + return count; 154 + } 155 + 156 + static DEVICE_ATTR(fade, S_IRUGO | S_IWUSR, 157 + blink1_show_fade, blink1_store_fade); 158 + 159 + static ssize_t blink1_show_play(struct device *dev, 160 + struct device_attribute *attr, char *buf) 161 + { 162 + struct blink1_data *data = dev_get_drvdata(dev->parent); 163 + 164 + return sprintf(buf, "%d\n", data->play); 165 + } 166 + 167 + static ssize_t blink1_store_play(struct device *dev, 168 + struct device_attribute *attr, const char *buf, size_t count) 169 + { 170 + struct blink1_data *data = dev_get_drvdata(dev->parent); 171 + u8 cmd[BLINK1_CMD_SIZE] = { 1, 'p', 0, 0, 0, 0, 0, 0, 0 }; 172 + long unsigned int play; 173 + int ret; 174 + 175 + ret = kstrtoul(buf, 10, &play); 176 + if (ret) 177 + return ret; 178 + 179 + data->play = !!play; 180 + cmd[2] = data->play; 181 + ret = blink1_send_command(data, cmd); 182 + 183 + return ret ? ret : count; 184 + } 185 + 186 + static DEVICE_ATTR(play, S_IRUGO | S_IWUSR, 187 + blink1_show_play, blink1_store_play); 188 + 189 + static const struct attribute_group blink1_sysfs_group = { 190 + .attrs = (struct attribute *[]) { 191 + &dev_attr_rgb.attr, 192 + &dev_attr_fade.attr, 193 + &dev_attr_play.attr, 194 + NULL 195 + }, 196 + }; 197 + 198 + static int thingm_probe(struct hid_device *hdev, const struct hid_device_id *id) 199 + { 200 + struct blink1_data *data; 201 + struct led_classdev *led; 202 + char led_name[13]; 203 + int ret; 204 + 205 + data = devm_kzalloc(&hdev->dev, sizeof(struct blink1_data), GFP_KERNEL); 206 + if (!data) 207 + return -ENOMEM; 208 + 209 + hid_set_drvdata(hdev, data); 210 + data->hdev = hdev; 211 + data->rgb = 0xFFFFFF; /* set a default white color */ 212 + 213 + ret = hid_parse(hdev); 214 + if (ret) 215 + goto error; 216 + 217 + ret = hid_hw_start(hdev, HID_CONNECT_HIDRAW); 218 + if (ret) 219 + goto error; 220 + 221 + /* blink(1) serial numbers range is 0x1A001000 to 0x1A002FFF */ 222 + led = &data->led_cdev; 223 + snprintf(led_name, sizeof(led_name), "blink1::%s", hdev->uniq + 4); 224 + led->name = led_name; 225 + led->brightness_set = blink1_led_set; 226 + led->brightness_get = blink1_led_get; 227 + ret = led_classdev_register(&hdev->dev, led); 228 + if (ret) 229 + goto stop; 230 + 231 + ret = sysfs_create_group(&led->dev->kobj, &blink1_sysfs_group); 232 + if (ret) 233 + goto remove_led; 234 + 235 + return 0; 236 + 237 + remove_led: 238 + led_classdev_unregister(led); 239 + stop: 240 + hid_hw_stop(hdev); 241 + error: 242 + return ret; 243 + } 244 + 245 + static void thingm_remove(struct hid_device *hdev) 246 + { 247 + struct blink1_data *data = hid_get_drvdata(hdev); 248 + struct led_classdev *led = &data->led_cdev; 249 + 250 + sysfs_remove_group(&led->dev->kobj, &blink1_sysfs_group); 251 + led_classdev_unregister(led); 252 + hid_hw_stop(hdev); 253 + } 254 + 255 + static const struct hid_device_id thingm_table[] = { 256 + { HID_USB_DEVICE(USB_VENDOR_ID_THINGM, USB_DEVICE_ID_BLINK1) }, 257 + { } 258 + }; 259 + MODULE_DEVICE_TABLE(hid, thingm_table); 260 + 261 + static struct hid_driver thingm_driver = { 262 + .name = "thingm", 263 + .probe = thingm_probe, 264 + .remove = thingm_remove, 265 + .id_table = thingm_table, 266 + }; 267 + 268 + module_hid_driver(thingm_driver); 269 + 270 + MODULE_LICENSE("GPL"); 271 + MODULE_AUTHOR("Vivien Didelot <vivien.didelot@savoirfairelinux.com>"); 272 + MODULE_DESCRIPTION("ThingM blink(1) USB RGB LED driver");
+1 -12
drivers/hid/hid-tivo.c
··· 73 73 .id_table = tivo_devices, 74 74 .input_mapping = tivo_input_mapping, 75 75 }; 76 + module_hid_driver(tivo_driver); 76 77 77 - static int __init tivo_init(void) 78 - { 79 - return hid_register_driver(&tivo_driver); 80 - } 81 - 82 - static void __exit tivo_exit(void) 83 - { 84 - hid_unregister_driver(&tivo_driver); 85 - } 86 - 87 - module_init(tivo_init); 88 - module_exit(tivo_exit); 89 78 MODULE_LICENSE("GPL"); 90 79 MODULE_AUTHOR("Jarod Wilson <jarod@redhat.com>");
+1 -12
drivers/hid/hid-tmff.c
··· 261 261 .id_table = tm_devices, 262 262 .probe = tm_probe, 263 263 }; 264 + module_hid_driver(tm_driver); 264 265 265 - static int __init tm_init(void) 266 - { 267 - return hid_register_driver(&tm_driver); 268 - } 269 - 270 - static void __exit tm_exit(void) 271 - { 272 - hid_unregister_driver(&tm_driver); 273 - } 274 - 275 - module_init(tm_init); 276 - module_exit(tm_exit); 277 266 MODULE_LICENSE("GPL");
+1 -12
drivers/hid/hid-topseed.c
··· 76 76 .id_table = ts_devices, 77 77 .input_mapping = ts_input_mapping, 78 78 }; 79 + module_hid_driver(ts_driver); 79 80 80 - static int __init ts_init(void) 81 - { 82 - return hid_register_driver(&ts_driver); 83 - } 84 - 85 - static void __exit ts_exit(void) 86 - { 87 - hid_unregister_driver(&ts_driver); 88 - } 89 - 90 - module_init(ts_init); 91 - module_exit(ts_exit); 92 81 MODULE_LICENSE("GPL");
+1 -12
drivers/hid/hid-twinhan.c
··· 131 131 .id_table = twinhan_devices, 132 132 .input_mapping = twinhan_input_mapping, 133 133 }; 134 + module_hid_driver(twinhan_driver); 134 135 135 - static int __init twinhan_init(void) 136 - { 137 - return hid_register_driver(&twinhan_driver); 138 - } 139 - 140 - static void __exit twinhan_exit(void) 141 - { 142 - hid_unregister_driver(&twinhan_driver); 143 - } 144 - 145 - module_init(twinhan_init); 146 - module_exit(twinhan_exit); 147 136 MODULE_LICENSE("GPL");
+1 -12
drivers/hid/hid-uclogic.c
··· 650 650 .id_table = uclogic_devices, 651 651 .report_fixup = uclogic_report_fixup, 652 652 }; 653 + module_hid_driver(uclogic_driver); 653 654 654 - static int __init uclogic_init(void) 655 - { 656 - return hid_register_driver(&uclogic_driver); 657 - } 658 - 659 - static void __exit uclogic_exit(void) 660 - { 661 - hid_unregister_driver(&uclogic_driver); 662 - } 663 - 664 - module_init(uclogic_init); 665 - module_exit(uclogic_exit); 666 655 MODULE_LICENSE("GPL");
+1 -17
drivers/hid/hid-wacom.c
··· 953 953 .raw_event = wacom_raw_event, 954 954 .input_mapped = wacom_input_mapped, 955 955 }; 956 + module_hid_driver(wacom_driver); 956 957 957 - static int __init wacom_init(void) 958 - { 959 - int ret; 960 - 961 - ret = hid_register_driver(&wacom_driver); 962 - if (ret) 963 - pr_err("can't register wacom driver\n"); 964 - return ret; 965 - } 966 - 967 - static void __exit wacom_exit(void) 968 - { 969 - hid_unregister_driver(&wacom_driver); 970 - } 971 - 972 - module_init(wacom_init); 973 - module_exit(wacom_exit); 974 958 MODULE_DESCRIPTION("Driver for Wacom Graphire Bluetooth and Wacom Intuos4 WL"); 975 959 MODULE_LICENSE("GPL");
+1 -12
drivers/hid/hid-waltop.c
··· 779 779 .report_fixup = waltop_report_fixup, 780 780 .raw_event = waltop_raw_event, 781 781 }; 782 + module_hid_driver(waltop_driver); 782 783 783 - static int __init waltop_init(void) 784 - { 785 - return hid_register_driver(&waltop_driver); 786 - } 787 - 788 - static void __exit waltop_exit(void) 789 - { 790 - hid_unregister_driver(&waltop_driver); 791 - } 792 - 793 - module_init(waltop_init); 794 - module_exit(waltop_exit); 795 784 MODULE_LICENSE("GPL");
+1 -18
drivers/hid/hid-wiimote-core.c
··· 1294 1294 .remove = wiimote_hid_remove, 1295 1295 .raw_event = wiimote_hid_event, 1296 1296 }; 1297 + module_hid_driver(wiimote_hid_driver); 1297 1298 1298 - static int __init wiimote_init(void) 1299 - { 1300 - int ret; 1301 - 1302 - ret = hid_register_driver(&wiimote_hid_driver); 1303 - if (ret) 1304 - pr_err("Can't register wiimote hid driver\n"); 1305 - 1306 - return ret; 1307 - } 1308 - 1309 - static void __exit wiimote_exit(void) 1310 - { 1311 - hid_unregister_driver(&wiimote_hid_driver); 1312 - } 1313 - 1314 - module_init(wiimote_init); 1315 - module_exit(wiimote_exit); 1316 1299 MODULE_LICENSE("GPL"); 1317 1300 MODULE_AUTHOR("David Herrmann <dh.herrmann@gmail.com>"); 1318 1301 MODULE_DESCRIPTION(WIIMOTE_NAME " Device Driver");
+1 -1
drivers/hid/hid-wiimote-debug.c
··· 31 31 unsigned long flags; 32 32 ssize_t ret; 33 33 char buf[16]; 34 - __u16 size; 34 + __u16 size = 0; 35 35 36 36 if (s == 0) 37 37 return -EINVAL;
+4 -4
drivers/hid/hid-wiimote-ext.c
··· 403 403 404 404 if (ext->motionp) { 405 405 input_report_key(ext->input, 406 - wiiext_keymap[WIIEXT_KEY_Z], !!(payload[5] & 0x04)); 406 + wiiext_keymap[WIIEXT_KEY_Z], !(payload[5] & 0x04)); 407 407 input_report_key(ext->input, 408 - wiiext_keymap[WIIEXT_KEY_C], !!(payload[5] & 0x08)); 408 + wiiext_keymap[WIIEXT_KEY_C], !(payload[5] & 0x08)); 409 409 } else { 410 410 input_report_key(ext->input, 411 - wiiext_keymap[WIIEXT_KEY_Z], !!(payload[5] & 0x01)); 411 + wiiext_keymap[WIIEXT_KEY_Z], !(payload[5] & 0x01)); 412 412 input_report_key(ext->input, 413 - wiiext_keymap[WIIEXT_KEY_C], !!(payload[5] & 0x02)); 413 + wiiext_keymap[WIIEXT_KEY_C], !(payload[5] & 0x02)); 414 414 } 415 415 416 416 input_sync(ext->input);
+1 -12
drivers/hid/hid-zpff.c
··· 152 152 .id_table = zp_devices, 153 153 .probe = zp_probe, 154 154 }; 155 + module_hid_driver(zp_driver); 155 156 156 - static int __init zp_init(void) 157 - { 158 - return hid_register_driver(&zp_driver); 159 - } 160 - 161 - static void __exit zp_exit(void) 162 - { 163 - hid_unregister_driver(&zp_driver); 164 - } 165 - 166 - module_init(zp_init); 167 - module_exit(zp_exit); 168 157 MODULE_LICENSE("GPL");
+1 -12
drivers/hid/hid-zydacron.c
··· 219 219 .probe = zc_probe, 220 220 .remove = zc_remove, 221 221 }; 222 + module_hid_driver(zc_driver); 222 223 223 - static int __init zc_init(void) 224 - { 225 - return hid_register_driver(&zc_driver); 226 - } 227 - 228 - static void __exit zc_exit(void) 229 - { 230 - hid_unregister_driver(&zc_driver); 231 - } 232 - 233 - module_init(zc_init); 234 - module_exit(zc_exit); 235 224 MODULE_LICENSE("GPL");
+1
drivers/hid/hidraw.c
··· 581 581 if (result < 0) 582 582 goto error_class; 583 583 584 + printk(KERN_INFO "hidraw: raw HID events driver (C) Jiri Kosina\n"); 584 585 out: 585 586 return result; 586 587
+81 -6
drivers/hid/i2c-hid/i2c-hid.c
··· 34 34 #include <linux/kernel.h> 35 35 #include <linux/hid.h> 36 36 #include <linux/mutex.h> 37 + #include <linux/acpi.h> 37 38 38 39 #include <linux/i2c/i2c-hid.h> 39 40 ··· 140 139 unsigned long flags; /* device flags */ 141 140 142 141 wait_queue_head_t wait; /* For waiting the interrupt */ 142 + 143 + struct i2c_hid_platform_data pdata; 143 144 }; 144 145 145 146 static int __i2c_hid_command(struct i2c_client *client, ··· 824 821 return 0; 825 822 } 826 823 824 + #ifdef CONFIG_ACPI 825 + static int i2c_hid_acpi_pdata(struct i2c_client *client, 826 + struct i2c_hid_platform_data *pdata) 827 + { 828 + static u8 i2c_hid_guid[] = { 829 + 0xF7, 0xF6, 0xDF, 0x3C, 0x67, 0x42, 0x55, 0x45, 830 + 0xAD, 0x05, 0xB3, 0x0A, 0x3D, 0x89, 0x38, 0xDE, 831 + }; 832 + struct acpi_buffer buf = { ACPI_ALLOCATE_BUFFER, NULL }; 833 + union acpi_object params[4], *obj; 834 + struct acpi_object_list input; 835 + struct acpi_device *adev; 836 + acpi_handle handle; 837 + 838 + handle = ACPI_HANDLE(&client->dev); 839 + if (!handle || acpi_bus_get_device(handle, &adev)) 840 + return -ENODEV; 841 + 842 + input.count = ARRAY_SIZE(params); 843 + input.pointer = params; 844 + 845 + params[0].type = ACPI_TYPE_BUFFER; 846 + params[0].buffer.length = sizeof(i2c_hid_guid); 847 + params[0].buffer.pointer = i2c_hid_guid; 848 + params[1].type = ACPI_TYPE_INTEGER; 849 + params[1].integer.value = 1; 850 + params[2].type = ACPI_TYPE_INTEGER; 851 + params[2].integer.value = 1; /* HID function */ 852 + params[3].type = ACPI_TYPE_INTEGER; 853 + params[3].integer.value = 0; 854 + 855 + if (ACPI_FAILURE(acpi_evaluate_object(handle, "_DSM", &input, &buf))) { 856 + dev_err(&client->dev, "device _DSM execution failed\n"); 857 + return -ENODEV; 858 + } 859 + 860 + obj = (union acpi_object *)buf.pointer; 861 + if (obj->type != ACPI_TYPE_INTEGER) { 862 + dev_err(&client->dev, "device _DSM returned invalid type: %d\n", 863 + obj->type); 864 + kfree(buf.pointer); 865 + return -EINVAL; 866 + } 867 + 868 + pdata->hid_descriptor_address = obj->integer.value; 869 + 870 + kfree(buf.pointer); 871 + return 0; 872 + } 873 + 874 + static const struct acpi_device_id i2c_hid_acpi_match[] = { 875 + {"ACPI0C50", 0 }, 876 + {"PNP0C50", 0 }, 877 + { }, 878 + }; 879 + MODULE_DEVICE_TABLE(acpi, i2c_hid_acpi_match); 880 + #else 881 + static inline int i2c_hid_acpi_pdata(struct i2c_client *client, 882 + struct i2c_hid_platform_data *pdata) 883 + { 884 + return -ENODEV; 885 + } 886 + #endif 887 + 827 888 static int i2c_hid_probe(struct i2c_client *client, 828 889 const struct i2c_device_id *dev_id) 829 890 { ··· 899 832 900 833 dbg_hid("HID probe called for i2c 0x%02x\n", client->addr); 901 834 902 - if (!platform_data) { 903 - dev_err(&client->dev, "HID register address not provided\n"); 904 - return -EINVAL; 905 - } 906 - 907 835 if (!client->irq) { 908 836 dev_err(&client->dev, 909 837 "HID over i2c has not been provided an Int IRQ\n"); ··· 909 847 if (!ihid) 910 848 return -ENOMEM; 911 849 850 + if (!platform_data) { 851 + ret = i2c_hid_acpi_pdata(client, &ihid->pdata); 852 + if (ret) { 853 + dev_err(&client->dev, 854 + "HID register address not provided\n"); 855 + goto err; 856 + } 857 + } else { 858 + ihid->pdata = *platform_data; 859 + } 860 + 912 861 i2c_set_clientdata(client, ihid); 913 862 914 863 ihid->client = client; 915 864 916 - hidRegister = platform_data->hid_descriptor_address; 865 + hidRegister = ihid->pdata.hid_descriptor_address; 917 866 ihid->wHIDDescRegister = cpu_to_le16(hidRegister); 918 867 919 868 init_waitqueue_head(&ihid->wait); ··· 957 884 hid->hid_get_raw_report = i2c_hid_get_raw_report; 958 885 hid->hid_output_raw_report = i2c_hid_output_raw_report; 959 886 hid->dev.parent = &client->dev; 887 + ACPI_HANDLE_SET(&hid->dev, ACPI_HANDLE(&client->dev)); 960 888 hid->bus = BUS_I2C; 961 889 hid->version = le16_to_cpu(ihid->hdesc.bcdVersion); 962 890 hid->vendor = le16_to_cpu(ihid->hdesc.wVendorID); ··· 1049 975 .name = "i2c_hid", 1050 976 .owner = THIS_MODULE, 1051 977 .pm = &i2c_hid_pm, 978 + .acpi_match_table = ACPI_PTR(i2c_hid_acpi_match), 1052 979 }, 1053 980 1054 981 .probe = i2c_hid_probe,
+92 -3
drivers/hid/uhid.c
··· 11 11 */ 12 12 13 13 #include <linux/atomic.h> 14 + #include <linux/compat.h> 14 15 #include <linux/device.h> 15 16 #include <linux/fs.h> 16 17 #include <linux/hid.h> ··· 277 276 .parse = uhid_hid_parse, 278 277 }; 279 278 279 + #ifdef CONFIG_COMPAT 280 + 281 + /* Apparently we haven't stepped on these rakes enough times yet. */ 282 + struct uhid_create_req_compat { 283 + __u8 name[128]; 284 + __u8 phys[64]; 285 + __u8 uniq[64]; 286 + 287 + compat_uptr_t rd_data; 288 + __u16 rd_size; 289 + 290 + __u16 bus; 291 + __u32 vendor; 292 + __u32 product; 293 + __u32 version; 294 + __u32 country; 295 + } __attribute__((__packed__)); 296 + 297 + static int uhid_event_from_user(const char __user *buffer, size_t len, 298 + struct uhid_event *event) 299 + { 300 + if (is_compat_task()) { 301 + u32 type; 302 + 303 + if (get_user(type, buffer)) 304 + return -EFAULT; 305 + 306 + if (type == UHID_CREATE) { 307 + /* 308 + * This is our messed up request with compat pointer. 309 + * It is largish (more than 256 bytes) so we better 310 + * allocate it from the heap. 311 + */ 312 + struct uhid_create_req_compat *compat; 313 + 314 + compat = kmalloc(sizeof(*compat), GFP_KERNEL); 315 + if (!compat) 316 + return -ENOMEM; 317 + 318 + buffer += sizeof(type); 319 + len -= sizeof(type); 320 + if (copy_from_user(compat, buffer, 321 + min(len, sizeof(*compat)))) { 322 + kfree(compat); 323 + return -EFAULT; 324 + } 325 + 326 + /* Shuffle the data over to proper structure */ 327 + event->type = type; 328 + 329 + memcpy(event->u.create.name, compat->name, 330 + sizeof(compat->name)); 331 + memcpy(event->u.create.phys, compat->phys, 332 + sizeof(compat->phys)); 333 + memcpy(event->u.create.uniq, compat->uniq, 334 + sizeof(compat->uniq)); 335 + 336 + event->u.create.rd_data = compat_ptr(compat->rd_data); 337 + event->u.create.rd_size = compat->rd_size; 338 + 339 + event->u.create.bus = compat->bus; 340 + event->u.create.vendor = compat->vendor; 341 + event->u.create.product = compat->product; 342 + event->u.create.version = compat->version; 343 + event->u.create.country = compat->country; 344 + 345 + kfree(compat); 346 + return 0; 347 + } 348 + /* All others can be copied directly */ 349 + } 350 + 351 + if (copy_from_user(event, buffer, min(len, sizeof(*event)))) 352 + return -EFAULT; 353 + 354 + return 0; 355 + } 356 + #else 357 + static int uhid_event_from_user(const char __user *buffer, size_t len, 358 + struct uhid_event *event) 359 + { 360 + if (copy_from_user(event, buffer, min(len, sizeof(*event)))) 361 + return -EFAULT; 362 + 363 + return 0; 364 + } 365 + #endif 366 + 280 367 static int uhid_dev_create(struct uhid_device *uhid, 281 368 const struct uhid_event *ev) 282 369 { ··· 587 498 588 499 memset(&uhid->input_buf, 0, sizeof(uhid->input_buf)); 589 500 len = min(count, sizeof(uhid->input_buf)); 590 - if (copy_from_user(&uhid->input_buf, buffer, len)) { 591 - ret = -EFAULT; 501 + 502 + ret = uhid_event_from_user(buffer, len, &uhid->input_buf); 503 + if (ret) 592 504 goto unlock; 593 - } 594 505 595 506 switch (uhid->input_buf.type) { 596 507 case UHID_CREATE:
+14 -3
include/linux/hid.h
··· 589 589 * @raw_event: if report in report_table, this hook is called (NULL means nop) 590 590 * @usage_table: on which events to call event (NULL means all) 591 591 * @event: if usage in usage_table, this hook is called (NULL means nop) 592 + * @report: this hook is called after parsing a report (NULL means nop) 592 593 * @report_fixup: called before report descriptor parsing (NULL means nop) 593 594 * @input_mapping: invoked on input registering before mapping an usage 594 595 * @input_mapped: invoked on input registering after mapping an usage ··· 628 627 const struct hid_usage_id *usage_table; 629 628 int (*event)(struct hid_device *hdev, struct hid_field *field, 630 629 struct hid_usage *usage, __s32 value); 630 + void (*report)(struct hid_device *hdev, struct hid_report *report); 631 631 632 632 __u8 *(*report_fixup)(struct hid_device *hdev, __u8 *buf, 633 633 unsigned int *size); ··· 701 699 __hid_register_driver(driver, THIS_MODULE, KBUILD_MODNAME) 702 700 703 701 extern void hid_unregister_driver(struct hid_driver *); 702 + 703 + /** 704 + * module_hid_driver() - Helper macro for registering a HID driver 705 + * @__hid_driver: hid_driver struct 706 + * 707 + * Helper macro for HID drivers which do not do anything special in module 708 + * init/exit. This eliminates a lot of boilerplate. Each module may only 709 + * use this macro once, and calling it replaces module_init() and module_exit() 710 + */ 711 + #define module_hid_driver(__hid_driver) \ 712 + module_driver(__hid_driver, hid_register_driver, \ 713 + hid_unregister_driver) 704 714 705 715 extern void hidinput_hid_event(struct hid_device *, struct hid_field *, struct hid_usage *, __s32); 706 716 extern void hidinput_report_event(struct hid_device *hid, struct hid_report *report); ··· 885 871 886 872 int hid_report_raw_event(struct hid_device *hid, int type, u8 *data, int size, 887 873 int interrupt); 888 - 889 - extern int hid_generic_init(void); 890 - extern void hid_generic_exit(void); 891 874 892 875 /* HID quirks API */ 893 876 u32 usbhid_lookup_quirk(const u16 idVendor, const u16 idProduct);
+1 -1
include/uapi/linux/uhid.h
··· 86 86 __u16 err; 87 87 __u16 size; 88 88 __u8 data[UHID_DATA_MAX]; 89 - }; 89 + } __attribute__((__packed__)); 90 90 91 91 struct uhid_event { 92 92 __u32 type;