History

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

Pull HID updates from Jiri Kosina: - HID battery handling cleanup by David Herrmann - ELO 4000/4500 driver, which has been finally ported to be proper HID driver by Jiri Slaby - ps3remote driver functionality is now provided by generic sony driver, by Jiri Kosina - PS2/3 Buzz controllers support, by Colin Leitner - rework of wiimote driver including full extensions hotpluggin support, sub-device modularization and speaker support by David Herrmann * 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/jikos/hid: (55 commits) HID: wacom: Intuos4 battery charging changes HID: i2c-hid: support sending HID output reports using the output register HID: kye: Add report fixup for Genius Gila Gaming mouse HID: wiimote: support Nintendo Wii U Pro Controller Input: make gamepad API keycodes more clear input: document gamepad API and add extra keycodes HID: explain out-of-range check better HID: fix false positive out of range values HID: wiimote: fix coccinelle warnings HID: roccat: check cdev_add return value HID: fold ps3remote driver into generic Sony driver HID: hyperv: convert alloc+memcpy to memdup HID: core: fix reporting of raw events HID: wiimote: discard invalid EXT data reports HID: wiimote: fix classic controller parsing HID: wiimote: init EXT/MP during device detection HID: wiimote: fix DRM debug-attr to correctly parse input HID: wiimote: add MP quirks HID: wiimote: remove old static extension support HID: wiimote: add "bboard_calib" attribute ...

Linus Torvalds committed 13 years ago

Commit 3366dd92 parents 697a067 21796b325 files · +4640 −1728Browse files

Unified · Split

25 files
  1. Documentation/ABI/testing/sysfs-driver-hid-wiimote +38 −1
  2. drivers/hid/Kconfig +41 −22
  3. drivers/hid/Makefile +4 −5
  4. drivers/hid/hid-core.c +11 −1
  5. drivers/hid/hid-elo.c +273 −0
  6. drivers/hid/hid-holtek-mouse.c +77 −0
  7. drivers/hid/hid-huion.c +177 −0
  8. drivers/hid/hid-hyperv.c +1 −3
  9. drivers/hid/hid-ids.h +18 −4
  10. drivers/hid/hid-input.c +8 −3
  11. drivers/hid/hid-kye.c +21 −0
  12. drivers/hid/hid-multitouch.c +18 −16
  13. drivers/hid/hid-ps3remote.c +0 −204
  14. drivers/hid/hid-roccat.c +13 −3
  15. drivers/hid/hid-sony.c +462 −11
  16. drivers/hid/hid-wacom.c +13 −1
  17. drivers/hid/hid-wiimote-core.c +1101 −557
  18. drivers/hid/hid-wiimote-debug.c +9 −5
  19. drivers/hid/hid-wiimote-ext.c +0 −849
  20. drivers/hid/hid-wiimote-modules.c +2086 −0
  21. drivers/hid/hid-wiimote.h +190 −27
  22. drivers/hid/i2c-hid/i2c-hid.c +17 −3
  23. include/uapi/linux/input.h +13 −4
  24. net/bluetooth/hidp/core.c +47 −9
  25. net/bluetooth/hidp/hidp.h +2 −0
Documentation/ABI/testing/sysfs-driver-hid-wiimote+38−1
@@ -12,7 +12,7 @@ Description: Make it possible to set/get current led state. Reading from it · 11 unmodified lines
1212 What: /sys/bus/hid/drivers/wiimote/<dev>/extension
1313 Date: August 2011
1414 KernelVersion: 3.2
15−Contact: David Herrmann <dh.herrmann@googlemail.com>
15+Contact: David Herrmann <dh.herrmann@gmail.com>
1616 Description: This file contains the currently connected and initialized
1717 extensions. It can be one of: none, motionp, nunchuck, classic,
1818 motionp+nunchuck, motionp+classic
@@ -20,3 +20,40 @@ Description: This file contains the currently connected and initialized · 1 unmodified line
2020 the official Nintendo Nunchuck extension and classic is the
2121 Nintendo Classic Controller extension. The motionp extension can
2222 be combined with the other two.
23+ Starting with kernel-version 3.11 Motion Plus hotplugging is
24+ supported and if detected, it's no longer reported as static
25+ extension. You will get uevent notifications for the motion-plus
26+ device then.
27+
28+What: /sys/bus/hid/drivers/wiimote/<dev>/devtype
29+Date: May 2013
30+KernelVersion: 3.11
31+Contact: David Herrmann <dh.herrmann@gmail.com>
32+Description: While a device is initialized by the wiimote driver, we perform
33+ a device detection and signal a "change" uevent after it is
34+ done. This file shows the detected device type. "pending" means
35+ that the detection is still ongoing, "unknown" means, that the
36+ device couldn't be detected or loaded. "generic" means, that the
37+ device couldn't be detected but supports basic Wii Remote
38+ features and can be used.
39+ Other strings for each device-type are available and may be
40+ added if new device-specific detections are added.
41+ Currently supported are:
42+ gen10: First Wii Remote generation
43+ gen20: Second Wii Remote Plus generation (builtin MP)
44+ balanceboard: Wii Balance Board
45+
46+What: /sys/bus/hid/drivers/wiimote/<dev>/bboard_calib
47+Date: May 2013
48+KernelVersion: 3.11
49+Contact: David Herrmann <dh.herrmann@gmail.com>
50+Description: This attribute is only provided if the device was detected as a
51+ balance board. It provides a single line with 3 calibration
52+ values for all 4 sensors. The values are separated by colons and
53+ are each 2 bytes long (encoded as 4 digit hexadecimal value).
54+ First, 0kg values for all 4 sensors are written, followed by the
55+ 17kg values for all 4 sensors and last the 34kg values for all 4
56+ sensors.
57+ Calibration data is already applied by the kernel to all input
58+ values but may be used by user-space to perform other
59+ transformations.
drivers/hid/Kconfig+41−22
@@ -217,6 +217,13 @@ config HID_ELECOM · 216 unmodified lines
217217 ---help---
218218 Support for the ELECOM BM084 (bluetooth mouse).
219219
220+config HID_ELO
221+ tristate "ELO USB 4000/4500 touchscreen"
222+ depends on USB_HID
223+ ---help---
224+ Support for the ELO USB 4000/4500 touchscreens. Note that this is for
225+ different devices than those handled by CONFIG_TOUCHSCREEN_USB_ELO.
226+
220227 config HID_EZKEY
221228 tristate "Ezkey BTC 8193 keyboard" if EXPERT
222229 depends on HID
@@ -231,6 +238,9 @@ config HID_HOLTEK · 8 unmodified lines
231238 Support for Holtek based devices:
232239 - Holtek On Line Grip based game controller
233240 - Trust GXT 18 Gaming Keyboard
241+ - Sharkoon Drakonia / Perixx MX-2000 gaming mice
242+ - Tracer Sniper TRM-503 / NOVA Gaming Slider X200 /
243+ Zalman ZM-GM1
234244
235245 config HOLTEK_FF
236246 bool "Holtek On Line Grip force feedback support"
@@ -240,6 +250,12 @@ config HOLTEK_FF · 3 unmodified lines
240250 Say Y here if you have a Holtek On Line Grip based game controller
241251 and want to have force feedback support for it.
242252
253+config HID_HUION
254+ tristate "Huion tablets"
255+ depends on USB_HID
256+ ---help---
257+ Support for Huion 580 tablet.
258+
243259 config HID_KEYTOUCH
244260 tristate "Keytouch HID devices"
245261 depends on HID
@@ -561,15 +577,6 @@ config HID_PRIMAX · 315 unmodified lines
561577 Support for Primax devices that are not fully compliant with the
562578 HID standard.
563579
564−config HID_PS3REMOTE
565− tristate "Sony PS3 BD Remote Control"
566− depends on HID
567− ---help---
568− Support for the Sony PS3 Blue-ray Disk Remote Control and Logitech
569− Harmony Adapter for PS3, which connect over Bluetooth.
570−
571− Support for the 6-axis controllers is provided by HID_SONY.
572−
573580 config HID_ROCCAT
574581 tristate "Roccat device support"
575582 depends on USB_HID
@@ -594,12 +601,17 @@ config HID_SAMSUNG · 18 unmodified lines
594601 Support for Samsung InfraRed remote control or keyboards.
595602
596603 config HID_SONY
597− tristate "Sony PS3 controller"
604+ tristate "Sony PS2/3 accessories"
598605 depends on USB_HID
606+ depends on NEW_LEDS
607+ depends on LEDS_CLASS
599608 ---help---
600− Support for Sony PS3 6-axis controllers.
609+ Support for
601610
602− Support for the Sony PS3 BD Remote is provided by HID_PS3REMOTE.
611+ * Sony PS3 6-axis controllers
612+ * Buzz controllers
613+ * Sony PS3 Blue-ray Disk Remote Control (Bluetooth)
614+ * Logitech Harmony adapter for Sony Playstation 3 (Bluetooth)
603615
604616 config HID_SPEEDLINK
605617 tristate "Speedlink VAD Cezanne mouse support"
@@ -707,22 +719,29 @@ config HID_WACOM · 101 unmodified lines
707719 Support for Wacom Graphire Bluetooth and Intuos4 WL tablets.
708720
709721 config HID_WIIMOTE
710− tristate "Nintendo Wii Remote support"
722+ tristate "Nintendo Wii / Wii U peripherals"
711723 depends on HID
712724 depends on LEDS_CLASS
713725 select POWER_SUPPLY
714726 select INPUT_FF_MEMLESS
715727 ---help---
716− Support for the Nintendo Wii Remote bluetooth device.
728+ Support for Nintendo Wii and Wii U Bluetooth peripherals. Supported
729+ devices are the Wii Remote and its extension devices, but also devices
730+ based on the Wii Remote like the Wii U Pro Controller or the
731+ Wii Balance Board.
717732
718−config HID_WIIMOTE_EXT
719− bool "Nintendo Wii Remote Extension support"
720− depends on HID_WIIMOTE
721− default HID_WIIMOTE
722− ---help---
723− Support for extension controllers of the Nintendo Wii Remote. Say yes
724− here if you want to use the Nintendo Motion+, Nunchuck or Classic
725− extension controllers with your Wii Remote.
733+ Support for all official Nintendo extensions is available, however, 3rd
734+ party extensions might not be supported. Please report these devices to:
735+ http://github.com/dvdhrm/xwiimote/issues
736+
737+ Other Nintendo Wii U peripherals that are IEEE 802.11 based (including
738+ the Wii U Gamepad) might be supported in the future. But currently
739+ support is limited to Bluetooth based devices.
740+
741+ If unsure, say N.
742+
743+ To compile this driver as a module, choose M here: the
744+ module will be called hid-wiimote.
726745
727746 config HID_ZEROPLUS
728747 tristate "Zeroplus based game controller support"
drivers/hid/Makefile+4−5
@@ -28,10 +28,7 @@ ifdef CONFIG_LOGIWHEELS_FF · 27 unmodified lines
2828 hid-logitech-y += hid-lg4ff.o
2929 endif
3030
31−hid-wiimote-y := hid-wiimote-core.o
32−ifdef CONFIG_HID_WIIMOTE_EXT
33− hid-wiimote-y += hid-wiimote-ext.o
34−endif
31+hid-wiimote-y := hid-wiimote-core.o hid-wiimote-modules.o
3532 ifdef CONFIG_DEBUG_FS
3633 hid-wiimote-y += hid-wiimote-debug.o
3734 endif
@@ -48,10 +45,13 @@ obj-$(CONFIG_HID_CYPRESS) += hid-cypress.o · 10 unmodified lines
4845 obj-$(CONFIG_HID_DRAGONRISE) += hid-dr.o
4946 obj-$(CONFIG_HID_EMS_FF) += hid-emsff.o
5047 obj-$(CONFIG_HID_ELECOM) += hid-elecom.o
48+obj-$(CONFIG_HID_ELO) += hid-elo.o
5149 obj-$(CONFIG_HID_EZKEY) += hid-ezkey.o
5250 obj-$(CONFIG_HID_GYRATION) += hid-gyration.o
5351 obj-$(CONFIG_HID_HOLTEK) += hid-holtek-kbd.o
52+obj-$(CONFIG_HID_HOLTEK) += hid-holtek-mouse.o
5453 obj-$(CONFIG_HID_HOLTEK) += hid-holtekff.o
54+obj-$(CONFIG_HID_HUION) += hid-huion.o
5555 obj-$(CONFIG_HID_HYPERV_MOUSE) += hid-hyperv.o
5656 obj-$(CONFIG_HID_ICADE) += hid-icade.o
5757 obj-$(CONFIG_HID_KENSINGTON) += hid-kensington.o
@@ -92,7 +92,6 @@ hid-picolcd-y += hid-picolcd_debugfs.o · 34 unmodified lines
9292 endif
9393
9494 obj-$(CONFIG_HID_PRIMAX) += hid-primax.o
95−obj-$(CONFIG_HID_PS3REMOTE) += hid-ps3remote.o
9695 obj-$(CONFIG_HID_ROCCAT) += hid-roccat.o hid-roccat-common.o \
9796 hid-roccat-arvo.o hid-roccat-isku.o hid-roccat-kone.o \
9897 hid-roccat-koneplus.o hid-roccat-konepure.o hid-roccat-kovaplus.o \
drivers/hid/hid-core.c+11−1
@@ -1293,7 +1293,7 @@ int hid_input_report(struct hid_device *hid, int type, u8 *data, int size, int i · 1292 unmodified lines
12931293
12941294 if (hdrv && hdrv->raw_event && hid_match_report(hid, report)) {
12951295 ret = hdrv->raw_event(hid, report, data, size);
1296− if (ret != 0) {
1296+ if (ret < 0) {
12971297 ret = ret < 0 ? ret : 0;
12981298 goto unlock;
12991299 }
@@ -1573,6 +1573,8 @@ static const struct hid_device_id hid_have_special_driver[] = { · 273 unmodified lines
15731573 { HID_USB_DEVICE(USB_VENDOR_ID_DRAGONRISE, 0x0006) },
15741574 { HID_USB_DEVICE(USB_VENDOR_ID_DRAGONRISE, 0x0011) },
15751575 { HID_BLUETOOTH_DEVICE(USB_VENDOR_ID_ELECOM, USB_DEVICE_ID_ELECOM_BM084) },
1576+ { HID_USB_DEVICE(USB_VENDOR_ID_ELO, 0x0009) },
1577+ { HID_USB_DEVICE(USB_VENDOR_ID_ELO, 0x0030) },
15761578 { HID_USB_DEVICE(USB_VENDOR_ID_EMS, USB_DEVICE_ID_EMS_TRIO_LINKER_PLUS_II) },
15771579 { HID_USB_DEVICE(USB_VENDOR_ID_EZKEY, USB_DEVICE_ID_BTC_8193) },
15781580 { HID_USB_DEVICE(USB_VENDOR_ID_GAMERON, USB_DEVICE_ID_GAMERON_DUAL_PSX_ADAPTOR) },
@@ -1584,10 +1586,14 @@ static const struct hid_device_id hid_have_special_driver[] = { · 5 unmodified lines
15841586 { HID_USB_DEVICE(USB_VENDOR_ID_GYRATION, USB_DEVICE_ID_GYRATION_REMOTE_3) },
15851587 { HID_USB_DEVICE(USB_VENDOR_ID_HOLTEK, USB_DEVICE_ID_HOLTEK_ON_LINE_GRIP) },
15861588 { HID_USB_DEVICE(USB_VENDOR_ID_HOLTEK_ALT, USB_DEVICE_ID_HOLTEK_ALT_KEYBOARD) },
1589+ { HID_USB_DEVICE(USB_VENDOR_ID_HOLTEK_ALT, USB_DEVICE_ID_HOLTEK_ALT_MOUSE_A04A) },
1590+ { HID_USB_DEVICE(USB_VENDOR_ID_HOLTEK_ALT, USB_DEVICE_ID_HOLTEK_ALT_MOUSE_A067) },
1591+ { HID_USB_DEVICE(USB_VENDOR_ID_HUION, USB_DEVICE_ID_HUION_580) },
15871592 { HID_USB_DEVICE(USB_VENDOR_ID_JESS2, USB_DEVICE_ID_JESS2_COLOR_RUMBLE_PAD) },
15881593 { HID_BLUETOOTH_DEVICE(USB_VENDOR_ID_ION, USB_DEVICE_ID_ICADE) },
15891594 { HID_USB_DEVICE(USB_VENDOR_ID_KENSINGTON, USB_DEVICE_ID_KS_SLIMBLADE) },
15901595 { HID_USB_DEVICE(USB_VENDOR_ID_KEYTOUCH, USB_DEVICE_ID_KEYTOUCH_IEC) },
1596+ { HID_USB_DEVICE(USB_VENDOR_ID_KYE, USB_DEVICE_ID_GENIUS_GILA_GAMING_MOUSE) },
15911597 { HID_USB_DEVICE(USB_VENDOR_ID_KYE, USB_DEVICE_ID_KYE_ERGO_525V) },
15921598 { HID_USB_DEVICE(USB_VENDOR_ID_KYE, USB_DEVICE_ID_KYE_EASYPEN_I405X) },
15931599 { HID_USB_DEVICE(USB_VENDOR_ID_KYE, USB_DEVICE_ID_KYE_MOUSEPEN_I608X) },
@@ -1680,6 +1686,8 @@ static const struct hid_device_id hid_have_special_driver[] = { · 86 unmodified lines
16801686 { HID_USB_DEVICE(USB_VENDOR_ID_SAMSUNG, USB_DEVICE_ID_SAMSUNG_IR_REMOTE) },
16811687 { HID_USB_DEVICE(USB_VENDOR_ID_SAMSUNG, USB_DEVICE_ID_SAMSUNG_WIRELESS_KBD_MOUSE) },
16821688 { HID_USB_DEVICE(USB_VENDOR_ID_SKYCABLE, USB_DEVICE_ID_SKYCABLE_WIRELESS_PRESENTER) },
1689+ { HID_USB_DEVICE(USB_VENDOR_ID_SONY, USB_DEVICE_ID_SONY_BUZZ_CONTROLLER) },
1690+ { HID_USB_DEVICE(USB_VENDOR_ID_SONY, USB_DEVICE_ID_SONY_WIRELESS_BUZZ_CONTROLLER) },
16831691 { HID_BLUETOOTH_DEVICE(USB_VENDOR_ID_SONY, USB_DEVICE_ID_SONY_PS3_BDREMOTE) },
16841692 { HID_USB_DEVICE(USB_VENDOR_ID_SONY, USB_DEVICE_ID_SONY_PS3_CONTROLLER) },
16851693 { HID_USB_DEVICE(USB_VENDOR_ID_SONY, USB_DEVICE_ID_SONY_NAVIGATION_CONTROLLER) },
@@ -2042,6 +2050,8 @@ static const struct hid_device_id hid_ignore_list[] = { · 356 unmodified lines
20422050 { HID_USB_DEVICE(USB_VENDOR_ID_GTCO, USB_DEVICE_ID_GTCO_1006) },
20432051 { HID_USB_DEVICE(USB_VENDOR_ID_GTCO, USB_DEVICE_ID_GTCO_1007) },
20442052 { HID_USB_DEVICE(USB_VENDOR_ID_IMATION, USB_DEVICE_ID_DISC_STAKKA) },
2053+ { HID_USB_DEVICE(USB_VENDOR_ID_JABRA, USB_DEVICE_ID_JABRA_SPEAK_410) },
2054+ { HID_USB_DEVICE(USB_VENDOR_ID_JABRA, USB_DEVICE_ID_JABRA_SPEAK_510) },
20452055 { HID_USB_DEVICE(USB_VENDOR_ID_KBGEAR, USB_DEVICE_ID_KBGEAR_JAMSTUDIO) },
20462056 { HID_USB_DEVICE(USB_VENDOR_ID_KWORLD, USB_DEVICE_ID_KWORLD_RADIO_FM700) },
20472057 { HID_USB_DEVICE(USB_VENDOR_ID_KYE, USB_DEVICE_ID_KYE_GPEN_560) },
drivers/hid/hid-elo.c+273−0
@@ -0,0 +1,273 @@
1+/*
2+ * HID driver for ELO usb touchscreen 4000/4500
3+ *
4+ * Copyright (c) 2013 Jiri Slaby
5+ *
6+ * Data parsing taken from elousb driver by Vojtech Pavlik.
7+ *
8+ * This driver is licensed under the terms of GPLv2.
9+ */
10+
11+#include <linux/hid.h>
12+#include <linux/input.h>
13+#include <linux/module.h>
14+#include <linux/usb.h>
15+#include <linux/workqueue.h>
16+
17+#include "hid-ids.h"
18+
19+#define ELO_PERIODIC_READ_INTERVAL HZ
20+#define ELO_SMARTSET_CMD_TIMEOUT 2000 /* msec */
21+
22+/* Elo SmartSet commands */
23+#define ELO_FLUSH_SMARTSET_RESPONSES 0x02 /* Flush all pending smartset responses */
24+#define ELO_SEND_SMARTSET_COMMAND 0x05 /* Send a smartset command */
25+#define ELO_GET_SMARTSET_RESPONSE 0x06 /* Get a smartset response */
26+#define ELO_DIAG 0x64 /* Diagnostics command */
27+#define ELO_SMARTSET_PACKET_SIZE 8
28+
29+struct elo_priv {
30+ struct usb_device *usbdev;
31+ struct delayed_work work;
32+ unsigned char buffer[ELO_SMARTSET_PACKET_SIZE];
33+};
34+
35+static struct workqueue_struct *wq;
36+static bool use_fw_quirk = true;
37+module_param(use_fw_quirk, bool, S_IRUGO);
38+MODULE_PARM_DESC(use_fw_quirk, "Do periodic pokes for broken M firmwares (default = true)");
39+
40+static void elo_input_configured(struct hid_device *hdev,
41+ struct hid_input *hidinput)
42+{
43+ struct input_dev *input = hidinput->input;
44+
45+ set_bit(BTN_TOUCH, input->keybit);
46+ set_bit(ABS_PRESSURE, input->absbit);
47+ input_set_abs_params(input, ABS_PRESSURE, 0, 256, 0, 0);
48+}
49+
50+static void elo_process_data(struct input_dev *input, const u8 *data, int size)
51+{
52+ int press;
53+
54+ input_report_abs(input, ABS_X, (data[3] << 8) | data[2]);
55+ input_report_abs(input, ABS_Y, (data[5] << 8) | data[4]);
56+
57+ press = 0;
58+ if (data[1] & 0x80)
59+ press = (data[7] << 8) | data[6];
60+ input_report_abs(input, ABS_PRESSURE, press);
61+
62+ if (data[1] & 0x03) {
63+ input_report_key(input, BTN_TOUCH, 1);
64+ input_sync(input);
65+ }
66+
67+ if (data[1] & 0x04)
68+ input_report_key(input, BTN_TOUCH, 0);
69+
70+ input_sync(input);
71+}
72+
73+static int elo_raw_event(struct hid_device *hdev, struct hid_report *report,
74+ u8 *data, int size)
75+{
76+ struct hid_input *hidinput;
77+
78+ if (!(hdev->claimed & HID_CLAIMED_INPUT) || list_empty(&hdev->inputs))
79+ return 0;
80+
81+ hidinput = list_first_entry(&hdev->inputs, struct hid_input, list);
82+
83+ switch (report->id) {
84+ case 0:
85+ if (data[0] == 'T') { /* Mandatory ELO packet marker */
86+ elo_process_data(hidinput->input, data, size);
87+ return 1;
88+ }
89+ break;
90+ default: /* unknown report */
91+ /* Unknown report type; pass upstream */
92+ hid_info(hdev, "unknown report type %d\n", report->id);
93+ break;
94+ }
95+
96+ return 0;
97+}
98+
99+static int elo_smartset_send_get(struct usb_device *dev, u8 command,
100+ void *data)
101+{
102+ unsigned int pipe;
103+ u8 dir;
104+
105+ if (command == ELO_SEND_SMARTSET_COMMAND) {
106+ pipe = usb_sndctrlpipe(dev, 0);
107+ dir = USB_DIR_OUT;
108+ } else if (command == ELO_GET_SMARTSET_RESPONSE) {
109+ pipe = usb_rcvctrlpipe(dev, 0);
110+ dir = USB_DIR_IN;
111+ } else
112+ return -EINVAL;
113+
114+ return usb_control_msg(dev, pipe, command,
115+ dir | USB_TYPE_VENDOR | USB_RECIP_DEVICE,
116+ 0, 0, data, ELO_SMARTSET_PACKET_SIZE,
117+ ELO_SMARTSET_CMD_TIMEOUT);
118+}
119+
120+static int elo_flush_smartset_responses(struct usb_device *dev)
121+{
122+ return usb_control_msg(dev, usb_sndctrlpipe(dev, 0),
123+ ELO_FLUSH_SMARTSET_RESPONSES,
124+ USB_DIR_OUT | USB_TYPE_VENDOR | USB_RECIP_DEVICE,
125+ 0, 0, NULL, 0, USB_CTRL_SET_TIMEOUT);
126+}
127+
128+static void elo_work(struct work_struct *work)
129+{
130+ struct elo_priv *priv = container_of(work, struct elo_priv, work.work);
131+ struct usb_device *dev = priv->usbdev;
132+ unsigned char *buffer = priv->buffer;
133+ int ret;
134+
135+ ret = elo_flush_smartset_responses(dev);
136+ if (ret < 0) {
137+ dev_err(&dev->dev, "initial FLUSH_SMARTSET_RESPONSES failed, error %d\n",
138+ ret);
139+ goto fail;
140+ }
141+
142+ /* send Diagnostics command */
143+ *buffer = ELO_DIAG;
144+ ret = elo_smartset_send_get(dev, ELO_SEND_SMARTSET_COMMAND, buffer);
145+ if (ret < 0) {
146+ dev_err(&dev->dev, "send Diagnostics Command failed, error %d\n",
147+ ret);
148+ goto fail;
149+ }
150+
151+ /* get the result */
152+ ret = elo_smartset_send_get(dev, ELO_GET_SMARTSET_RESPONSE, buffer);
153+ if (ret < 0) {
154+ dev_err(&dev->dev, "get Diagnostics Command response failed, error %d\n",
155+ ret);
156+ goto fail;
157+ }
158+
159+ /* read the ack */
160+ if (*buffer != 'A') {
161+ ret = elo_smartset_send_get(dev, ELO_GET_SMARTSET_RESPONSE,
162+ buffer);
163+ if (ret < 0) {
164+ dev_err(&dev->dev, "get acknowledge response failed, error %d\n",
165+ ret);
166+ goto fail;
167+ }
168+ }
169+
170+fail:
171+ ret = elo_flush_smartset_responses(dev);
172+ if (ret < 0)
173+ dev_err(&dev->dev, "final FLUSH_SMARTSET_RESPONSES failed, error %d\n",
174+ ret);
175+ queue_delayed_work(wq, &priv->work, ELO_PERIODIC_READ_INTERVAL);
176+}
177+
178+/*
179+ * Not all Elo devices need the periodic HID descriptor reads.
180+ * Only firmware version M needs this.
181+ */
182+static bool elo_broken_firmware(struct usb_device *dev)
183+{
184+ return use_fw_quirk && le16_to_cpu(dev->descriptor.bcdDevice) == 0x10d;
185+}
186+
187+static int elo_probe(struct hid_device *hdev, const struct hid_device_id *id)
188+{
189+ struct elo_priv *priv;
190+ int ret;
191+
192+ priv = kzalloc(sizeof(*priv), GFP_KERNEL);
193+ if (!priv)
194+ return -ENOMEM;
195+
196+ INIT_DELAYED_WORK(&priv->work, elo_work);
197+ priv->usbdev = interface_to_usbdev(to_usb_interface(hdev->dev.parent));
198+
199+ hid_set_drvdata(hdev, priv);
200+
201+ ret = hid_parse(hdev);
202+ if (ret) {
203+ hid_err(hdev, "parse failed\n");
204+ goto err_free;
205+ }
206+
207+ ret = hid_hw_start(hdev, HID_CONNECT_DEFAULT);
208+ if (ret) {
209+ hid_err(hdev, "hw start failed\n");
210+ goto err_free;
211+ }
212+
213+ if (elo_broken_firmware(priv->usbdev)) {
214+ hid_info(hdev, "broken firmware found, installing workaround\n");
215+ queue_delayed_work(wq, &priv->work, ELO_PERIODIC_READ_INTERVAL);
216+ }
217+
218+ return 0;
219+err_free:
220+ kfree(priv);
221+ return ret;
222+}
223+
224+static void elo_remove(struct hid_device *hdev)
225+{
226+ struct elo_priv *priv = hid_get_drvdata(hdev);
227+
228+ hid_hw_stop(hdev);
229+ flush_workqueue(wq);
230+ kfree(priv);
231+}
232+
233+static const struct hid_device_id elo_devices[] = {
234+ { HID_USB_DEVICE(USB_VENDOR_ID_ELO, 0x0009), },
235+ { HID_USB_DEVICE(USB_VENDOR_ID_ELO, 0x0030), },
236+ { }
237+};
238+MODULE_DEVICE_TABLE(hid, elo_devices);
239+
240+static struct hid_driver elo_driver = {
241+ .name = "elo",
242+ .id_table = elo_devices,
243+ .probe = elo_probe,
244+ .remove = elo_remove,
245+ .raw_event = elo_raw_event,
246+ .input_configured = elo_input_configured,
247+};
248+
249+static int __init elo_driver_init(void)
250+{
251+ int ret;
252+
253+ wq = create_singlethread_workqueue("elousb");
254+ if (!wq)
255+ return -ENOMEM;
256+
257+ ret = hid_register_driver(&elo_driver);
258+ if (ret)
259+ destroy_workqueue(wq);
260+
261+ return ret;
262+}
263+module_init(elo_driver_init);
264+
265+static void __exit elo_driver_exit(void)
266+{
267+ hid_unregister_driver(&elo_driver);
268+ destroy_workqueue(wq);
269+}
270+module_exit(elo_driver_exit);
271+
272+MODULE_AUTHOR("Jiri Slaby <jslaby@suse.cz>");
273+MODULE_LICENSE("GPL");
drivers/hid/hid-holtek-mouse.c+77−0
@@ -0,0 +1,77 @@
1+/*
2+ * HID driver for Holtek gaming mice
3+ * Copyright (c) 2013 Christian Ohm
4+ * Heavily inspired by various other HID drivers that adjust the report
5+ * descriptor.
6+*/
7+
8+/*
9+ * This program is free software; you can redistribute it and/or modify it
10+ * under the terms of the GNU General Public License as published by the Free
11+ * Software Foundation; either version 2 of the License, or (at your option)
12+ * any later version.
13+ */
14+
15+#include <linux/hid.h>
16+#include <linux/module.h>
17+#include <linux/usb.h>
18+
19+#include "hid-ids.h"
20+
21+/*
22+ * The report descriptor of some Holtek based gaming mice specifies an
23+ * excessively large number of consumer usages (2^15), which is more than
24+ * HID_MAX_USAGES. This prevents proper parsing of the report descriptor.
25+ *
26+ * This driver fixes the report descriptor for:
27+ * - USB ID 04d9:a067, sold as Sharkoon Drakonia and Perixx MX-2000
28+ * - USB ID 04d9:a04a, sold as Tracer Sniper TRM-503, NOVA Gaming Slider X200
29+ * and Zalman ZM-GM1
30+ */
31+
32+static __u8 *holtek_mouse_report_fixup(struct hid_device *hdev, __u8 *rdesc,
33+ unsigned int *rsize)
34+{
35+ struct usb_interface *intf = to_usb_interface(hdev->dev.parent);
36+
37+ if (intf->cur_altsetting->desc.bInterfaceNumber == 1) {
38+ /* Change usage maximum and logical maximum from 0x7fff to
39+ * 0x2fff, so they don't exceed HID_MAX_USAGES */
40+ switch (hdev->product) {
41+ case USB_DEVICE_ID_HOLTEK_ALT_MOUSE_A067:
42+ if (*rsize >= 122 && rdesc[115] == 0xff && rdesc[116] == 0x7f
43+ && rdesc[120] == 0xff && rdesc[121] == 0x7f) {
44+ hid_info(hdev, "Fixing up report descriptor\n");
45+ rdesc[116] = rdesc[121] = 0x2f;
46+ }
47+ break;
48+ case USB_DEVICE_ID_HOLTEK_ALT_MOUSE_A04A:
49+ if (*rsize >= 113 && rdesc[106] == 0xff && rdesc[107] == 0x7f
50+ && rdesc[111] == 0xff && rdesc[112] == 0x7f) {
51+ hid_info(hdev, "Fixing up report descriptor\n");
52+ rdesc[107] = rdesc[112] = 0x2f;
53+ }
54+ break;
55+ }
56+
57+ }
58+ return rdesc;
59+}
60+
61+static const struct hid_device_id holtek_mouse_devices[] = {
62+ { HID_USB_DEVICE(USB_VENDOR_ID_HOLTEK_ALT,
63+ USB_DEVICE_ID_HOLTEK_ALT_MOUSE_A067) },
64+ { HID_USB_DEVICE(USB_VENDOR_ID_HOLTEK_ALT,
65+ USB_DEVICE_ID_HOLTEK_ALT_MOUSE_A04A) },
66+ { }
67+};
68+MODULE_DEVICE_TABLE(hid, holtek_mouse_devices);
69+
70+static struct hid_driver holtek_mouse_driver = {
71+ .name = "holtek_mouse",
72+ .id_table = holtek_mouse_devices,
73+ .report_fixup = holtek_mouse_report_fixup,
74+};
75+
76+module_hid_driver(holtek_mouse_driver);
77+MODULE_LICENSE("GPL");
drivers/hid/hid-huion.c+177−0
@@ -0,0 +1,177 @@
1+/*
2+ * HID driver for Huion devices not fully compliant with HID standard
3+ *
4+ * Copyright (c) 2013 Martin Rusko
5+ */
6+
7+/*
8+ * This program is free software; you can redistribute it and/or modify it
9+ * under the terms of the GNU General Public License as published by the Free
10+ * Software Foundation; either version 2 of the License, or (at your option)
11+ * any later version.
12+ */
13+
14+#include <linux/device.h>
15+#include <linux/hid.h>
16+#include <linux/module.h>
17+#include <linux/usb.h>
18+#include "usbhid/usbhid.h"
19+
20+#include "hid-ids.h"
21+
22+/* Original Huion 580 report descriptor size */
23+#define HUION_580_RDESC_ORIG_SIZE 177
24+
25+/* Fixed Huion 580 report descriptor */
26+static __u8 huion_580_rdesc_fixed[] = {
27+ 0x05, 0x0D, /* Usage Page (Digitizer), */
28+ 0x09, 0x02, /* Usage (Pen), */
29+ 0xA1, 0x01, /* Collection (Application), */
30+ 0x85, 0x07, /* Report ID (7), */
31+ 0x09, 0x20, /* Usage (Stylus), */
32+ 0xA0, /* Collection (Physical), */
33+ 0x14, /* Logical Minimum (0), */
34+ 0x25, 0x01, /* Logical Maximum (1), */
35+ 0x75, 0x01, /* Report Size (1), */
36+ 0x09, 0x42, /* Usage (Tip Switch), */
37+ 0x09, 0x44, /* Usage (Barrel Switch), */
38+ 0x09, 0x46, /* Usage (Tablet Pick), */
39+ 0x95, 0x03, /* Report Count (3), */
40+ 0x81, 0x02, /* Input (Variable), */
41+ 0x95, 0x03, /* Report Count (3), */
42+ 0x81, 0x03, /* Input (Constant, Variable), */
43+ 0x09, 0x32, /* Usage (In Range), */
44+ 0x95, 0x01, /* Report Count (1), */
45+ 0x81, 0x02, /* Input (Variable), */
46+ 0x95, 0x01, /* Report Count (1), */
47+ 0x81, 0x03, /* Input (Constant, Variable), */
48+ 0x75, 0x10, /* Report Size (16), */
49+ 0x95, 0x01, /* Report Count (1), */
50+ 0xA4, /* Push, */
51+ 0x05, 0x01, /* Usage Page (Desktop), */
52+ 0x65, 0x13, /* Unit (Inch), */
53+ 0x55, 0xFD, /* Unit Exponent (-3), */
54+ 0x34, /* Physical Minimum (0), */
55+ 0x09, 0x30, /* Usage (X), */
56+ 0x46, 0x40, 0x1F, /* Physical Maximum (8000), */
57+ 0x26, 0x00, 0x7D, /* Logical Maximum (32000), */
58+ 0x81, 0x02, /* Input (Variable), */
59+ 0x09, 0x31, /* Usage (Y), */
60+ 0x46, 0x88, 0x13, /* Physical Maximum (5000), */
61+ 0x26, 0x20, 0x4E, /* Logical Maximum (20000), */
62+ 0x81, 0x02, /* Input (Variable), */
63+ 0xB4, /* Pop, */
64+ 0x09, 0x30, /* Usage (Tip Pressure), */
65+ 0x26, 0xFF, 0x07, /* Logical Maximum (2047), */
66+ 0x81, 0x02, /* Input (Variable), */
67+ 0xC0, /* End Collection, */
68+ 0xC0 /* End Collection */
69+};
70+
71+static __u8 *huion_report_fixup(struct hid_device *hdev, __u8 *rdesc,
72+ unsigned int *rsize)
73+{
74+ switch (hdev->product) {
75+ case USB_DEVICE_ID_HUION_580:
76+ if (*rsize == HUION_580_RDESC_ORIG_SIZE) {
77+ rdesc = huion_580_rdesc_fixed;
78+ *rsize = sizeof(huion_580_rdesc_fixed);
79+ }
80+ break;
81+ }
82+ return rdesc;
83+}
84+
85+/**
86+ * Enable fully-functional tablet mode by reading special string
87+ * descriptor.
88+ *
89+ * @hdev: HID device
90+ *
91+ * The specific string descriptor and data were discovered by sniffing
92+ * the Windows driver traffic.
93+ */
94+static int huion_tablet_enable(struct hid_device *hdev)
95+{
96+ int rc;
97+ char buf[22];
98+
99+ rc = usb_string(hid_to_usb_dev(hdev), 0x64, buf, sizeof(buf));
100+ if (rc < 0)
101+ return rc;
102+
103+ return 0;
104+}
105+
106+static int huion_probe(struct hid_device *hdev, const struct hid_device_id *id)
107+{
108+ int ret;
109+ struct usb_interface *intf = to_usb_interface(hdev->dev.parent);
110+
111+ /* Ignore interfaces 1 (mouse) and 2 (keyboard) for Huion 580 tablet,
112+ * as they are not used
113+ */
114+ switch (id->product) {
115+ case USB_DEVICE_ID_HUION_580:
116+ if (intf->cur_altsetting->desc.bInterfaceNumber != 0x00)
117+ return -ENODEV;
118+ break;
119+ }
120+
121+ ret = hid_parse(hdev);
122+ if (ret) {
123+ hid_err(hdev, "parse failed\n");
124+ goto err;
125+ }
126+
127+ ret = hid_hw_start(hdev, HID_CONNECT_DEFAULT);
128+ if (ret) {
129+ hid_err(hdev, "hw start failed\n");
130+ goto err;
131+ }
132+
133+ switch (id->product) {
134+ case USB_DEVICE_ID_HUION_580:
135+ ret = huion_tablet_enable(hdev);
136+ if (ret) {
137+ hid_err(hdev, "tablet enabling failed\n");
138+ goto enabling_err;
139+ }
140+ break;
141+ }
142+
143+ return 0;
144+enabling_err:
145+ hid_hw_stop(hdev);
146+err:
147+ return ret;
148+}
149+
150+static int huion_raw_event(struct hid_device *hdev, struct hid_report *report,
151+ u8 *data, int size)
152+{
153+ /* If this is a pen input report then invert the in-range bit */
154+ if (report->type == HID_INPUT_REPORT && report->id == 0x07 && size >= 2)
155+ data[1] ^= 0x40;
156+
157+ return 0;
158+}
159+
160+static const struct hid_device_id huion_devices[] = {
161+ { HID_USB_DEVICE(USB_VENDOR_ID_HUION, USB_DEVICE_ID_HUION_580) },
162+ { }
163+};
164+MODULE_DEVICE_TABLE(hid, huion_devices);
165+
166+static struct hid_driver huion_driver = {
167+ .name = "huion",
168+ .id_table = huion_devices,
169+ .probe = huion_probe,
170+ .report_fixup = huion_report_fixup,
171+ .raw_event = huion_raw_event,
172+};
173+module_hid_driver(huion_driver);
174+
175+MODULE_AUTHOR("Martin Rusko");
176+MODULE_DESCRIPTION("Huion HID driver");
177+MODULE_LICENSE("GPL");
drivers/hid/hid-hyperv.c+1−3
@@ -199,13 +199,11 @@ static void mousevsc_on_receive_device_info(struct mousevsc_dev *input_device, · 198 unmodified lines
199199 if (desc->bLength == 0)
200200 goto cleanup;
201201
202− input_device->hid_desc = kzalloc(desc->bLength, GFP_ATOMIC);
202+ input_device->hid_desc = kmemdup(desc, desc->bLength, GFP_ATOMIC);
203203
204204 if (!input_device->hid_desc)
205205 goto cleanup;
206206
207− memcpy(input_device->hid_desc, desc, desc->bLength);
208−
209207 input_device->report_desc_size = desc->desc[0].wDescriptorLength;
210208 if (input_device->report_desc_size == 0) {
211209 input_device->dev_info_status = -EINVAL;
drivers/hid/hid-ids.h+18−4
@@ -248,6 +248,9 @@ · 247 unmodified lines
248248 #define USB_DEVICE_ID_CYPRESS_BARCODE_4 0xed81
249249 #define USB_DEVICE_ID_CYPRESS_TRUETOUCH 0xc001
250250
251+#define USB_VENDOR_ID_DATA_MODUL 0x7374
252+#define USB_VENDOR_ID_DATA_MODUL_EASYMAXTOUCH 0x1201
253+
251254 #define USB_VENDOR_ID_DEALEXTREAME 0x10c5
252255 #define USB_DEVICE_ID_DEALEXTREAME_RADIO_SI4701 0x819a
253256
@@ -272,16 +275,15 @@ · 18 unmodified lines
272275 #define USB_DEVICE_ID_DWAV_EGALAX_MULTITOUCH_725E 0x725e
273276 #define USB_DEVICE_ID_DWAV_EGALAX_MULTITOUCH_7262 0x7262
274277 #define USB_DEVICE_ID_DWAV_EGALAX_MULTITOUCH_726B 0x726b
275−#define USB_DEVICE_ID_DWAV_EGALAX_MULTITOUCH_72AA 0x72aa
276278 #define USB_DEVICE_ID_DWAV_EGALAX_MULTITOUCH_72A1 0x72a1
279+#define USB_DEVICE_ID_DWAV_EGALAX_MULTITOUCH_72AA 0x72aa
280+#define USB_DEVICE_ID_DWAV_EGALAX_MULTITOUCH_72C4 0x72c4
281+#define USB_DEVICE_ID_DWAV_EGALAX_MULTITOUCH_72D0 0x72d0
277282 #define USB_DEVICE_ID_DWAV_EGALAX_MULTITOUCH_72FA 0x72fa
278283 #define USB_DEVICE_ID_DWAV_EGALAX_MULTITOUCH_7302 0x7302
279284 #define USB_DEVICE_ID_DWAV_EGALAX_MULTITOUCH_7349 0x7349
280285 #define USB_DEVICE_ID_DWAV_EGALAX_MULTITOUCH_73F7 0x73f7
281286 #define USB_DEVICE_ID_DWAV_EGALAX_MULTITOUCH_A001 0xa001
282−#define USB_DEVICE_ID_DWAV_EGALAX_MULTITOUCH_7224 0x7224
283−#define USB_DEVICE_ID_DWAV_EGALAX_MULTITOUCH_72D0 0x72d0
284−#define USB_DEVICE_ID_DWAV_EGALAX_MULTITOUCH_72C4 0x72c4
285287
286288 #define USB_VENDOR_ID_ELECOM 0x056e
287289 #define USB_DEVICE_ID_ELECOM_BM084 0x0061
@@ -425,6 +427,9 @@ · 137 unmodified lines
425427 #define USB_DEVICE_ID_UGCI_FLYING 0x0020
426428 #define USB_DEVICE_ID_UGCI_FIGHTING 0x0030
427429
430+#define USB_VENDOR_ID_HUION 0x256c
431+#define USB_DEVICE_ID_HUION_580 0x006e
432+
428433 #define USB_VENDOR_ID_IDEACOM 0x1cb6
429434 #define USB_DEVICE_ID_IDEACOM_IDC6650 0x6650
430435 #define USB_DEVICE_ID_IDEACOM_IDC6651 0x6651
@@ -440,6 +445,8 @@ · 9 unmodified lines
440445
441446 #define USB_VENDOR_ID_HOLTEK_ALT 0x04d9
442447 #define USB_DEVICE_ID_HOLTEK_ALT_KEYBOARD 0xa055
448+#define USB_DEVICE_ID_HOLTEK_ALT_MOUSE_A067 0xa067
449+#define USB_DEVICE_ID_HOLTEK_ALT_MOUSE_A04A 0xa04a
443450
444451 #define USB_VENDOR_ID_IMATION 0x0718
445452 #define USB_DEVICE_ID_DISC_STAKKA 0xd000
@@ -447,6 +454,10 @@ · 1 unmodified line
447454 #define USB_VENDOR_ID_IRTOUCHSYSTEMS 0x6615
448455 #define USB_DEVICE_ID_IRTOUCH_INFRARED_USB 0x0070
449456
457+#define USB_VENDOR_ID_JABRA 0x0b0e
458+#define USB_DEVICE_ID_JABRA_SPEAK_410 0x0412
459+#define USB_DEVICE_ID_JABRA_SPEAK_510 0x0420
460+
450461 #define USB_VENDOR_ID_JESS 0x0c45
451462 #define USB_DEVICE_ID_JESS_YUREX 0x1010
452463
@@ -467,6 +478,7 @@ · 14 unmodified lines
467478
468479 #define USB_VENDOR_ID_KYE 0x0458
469480 #define USB_DEVICE_ID_KYE_ERGO_525V 0x0087
481+#define USB_DEVICE_ID_GENIUS_GILA_GAMING_MOUSE 0x0138
470482 #define USB_DEVICE_ID_KYE_GPEN_560 0x5003
471483 #define USB_DEVICE_ID_KYE_EASYPEN_I405X 0x5010
472484 #define USB_DEVICE_ID_KYE_MOUSEPEN_I608X 0x5011
@@ -734,6 +746,8 @@ · 261 unmodified lines
734746 #define USB_DEVICE_ID_SONY_PS3_BDREMOTE 0x0306
735747 #define USB_DEVICE_ID_SONY_PS3_CONTROLLER 0x0268
736748 #define USB_DEVICE_ID_SONY_NAVIGATION_CONTROLLER 0x042f
749+#define USB_DEVICE_ID_SONY_BUZZ_CONTROLLER 0x0002
750+#define USB_DEVICE_ID_SONY_WIRELESS_BUZZ_CONTROLLER 0x1000
737751
738752 #define USB_VENDOR_ID_SOUNDGRAPH 0x15c2
739753 #define USB_DEVICE_ID_SOUNDGRAPH_IMON_FIRST 0x0034
drivers/hid/hid-input.c+8−3
@@ -354,10 +354,10 @@ static int hidinput_get_battery_property(struct power_supply *psy, · 353 unmodified lines
354354 dev->battery_report_type);
355355
356356 if (ret != 2) {
357− if (ret >= 0)
358− ret = -EINVAL;
357+ ret = -ENODATA;
359358 break;
360359 }
360+ ret = 0;
361361
362362 if (dev->battery_min < dev->battery_max &&
363363 buf[1] >= dev->battery_min &&
@@ -1042,9 +1042,14 @@ void hidinput_hid_event(struct hid_device *hid, struct hid_field *field, struct · 678 unmodified lines
10421042
10431043 /*
10441044 * Ignore out-of-range values as per HID specification,
1045− * section 5.10 and 6.2.25
1045+ * section 5.10 and 6.2.25.
1046+ *
1047+ * The logical_minimum < logical_maximum check is done so that we
1048+ * don't unintentionally discard values sent by devices which
1049+ * don't specify logical min and max.
10461050 */
10471051 if ((field->flags & HID_MAIN_ITEM_VARIABLE) &&
1052+ (field->logical_minimum < field->logical_maximum) &&
10481053 (value < field->logical_minimum ||
10491054 value > field->logical_maximum)) {
10501055 dbg_hid("Ignoring out-of-range value %x\n", value);
drivers/hid/hid-kye.c+21−0
@@ -314,6 +314,25 @@ static __u8 *kye_report_fixup(struct hid_device *hdev, __u8 *rdesc, · 313 unmodified lines
314314 *rsize = sizeof(easypen_m610x_rdesc_fixed);
315315 }
316316 break;
317+ case USB_DEVICE_ID_GENIUS_GILA_GAMING_MOUSE:
318+ /*
319+ * the fixup that need to be done:
320+ * - change Usage Maximum in the Comsumer Control
321+ * (report ID 3) to a reasonable value
322+ */
323+ if (*rsize >= 135 &&
324+ /* Usage Page (Consumer Devices) */
325+ rdesc[104] == 0x05 && rdesc[105] == 0x0c &&
326+ /* Usage (Consumer Control) */
327+ rdesc[106] == 0x09 && rdesc[107] == 0x01 &&
328+ /* Usage Maximum > 12287 */
329+ rdesc[114] == 0x2a && rdesc[116] > 0x2f) {
330+ hid_info(hdev,
331+ "fixing up Genius Gila Gaming Mouse "
332+ "report descriptor\n");
333+ rdesc[116] = 0x2f;
334+ }
335+ break;
317336 }
318337 return rdesc;
319338 }
@@ -407,6 +426,8 @@ static const struct hid_device_id kye_devices[] = { · 87 unmodified lines
407426 USB_DEVICE_ID_KYE_MOUSEPEN_I608X) },
408427 { HID_USB_DEVICE(USB_VENDOR_ID_KYE,
409428 USB_DEVICE_ID_KYE_EASYPEN_M610X) },
429+ { HID_USB_DEVICE(USB_VENDOR_ID_KYE,
430+ USB_DEVICE_ID_GENIUS_GILA_GAMING_MOUSE) },
410431 { }
411432 };
412433 MODULE_DEVICE_TABLE(hid, kye_devices);
drivers/hid/hid-multitouch.c+18−16
@@ -1111,6 +1111,11 @@ static const struct hid_device_id mt_devices[] = { · 1110 unmodified lines
11111111 HID_USB_DEVICE(USB_VENDOR_ID_CYPRESS,
11121112 USB_DEVICE_ID_CYPRESS_TRUETOUCH) },
11131113
1114+ /* Data Modul easyMaxTouch */
1115+ { .driver_data = MT_CLS_DEFAULT,
1116+ MT_USB_DEVICE(USB_VENDOR_ID_DATA_MODUL,
1117+ USB_VENDOR_ID_DATA_MODUL_EASYMAXTOUCH) },
1118+
11141119 /* eGalax devices (resistive) */
11151120 { .driver_data = MT_CLS_EGALAX,
11161121 MT_USB_DEVICE(USB_VENDOR_ID_DWAV,
@@ -1120,33 +1125,39 @@ static const struct hid_device_id mt_devices[] = { · 3 unmodified lines
11201125 USB_DEVICE_ID_DWAV_EGALAX_MULTITOUCH_480E) },
11211126
11221127 /* eGalax devices (capacitive) */
1123− { .driver_data = MT_CLS_EGALAX,
1124− MT_USB_DEVICE(USB_VENDOR_ID_DWAV,
1125− USB_DEVICE_ID_DWAV_EGALAX_MULTITOUCH_720C) },
11261128 { .driver_data = MT_CLS_EGALAX_SERIAL,
11271129 MT_USB_DEVICE(USB_VENDOR_ID_DWAV,
11281130 USB_DEVICE_ID_DWAV_EGALAX_MULTITOUCH_7207) },
1129− { .driver_data = MT_CLS_EGALAX_SERIAL,
1131+ { .driver_data = MT_CLS_EGALAX,
11301132 MT_USB_DEVICE(USB_VENDOR_ID_DWAV,
1131− USB_DEVICE_ID_DWAV_EGALAX_MULTITOUCH_725E) },
1133+ USB_DEVICE_ID_DWAV_EGALAX_MULTITOUCH_720C) },
11321134 { .driver_data = MT_CLS_EGALAX_SERIAL,
11331135 MT_USB_DEVICE(USB_VENDOR_ID_DWAV,
11341136 USB_DEVICE_ID_DWAV_EGALAX_MULTITOUCH_7224) },
11351137 { .driver_data = MT_CLS_EGALAX_SERIAL,
11361138 MT_USB_DEVICE(USB_VENDOR_ID_DWAV,
11371139 USB_DEVICE_ID_DWAV_EGALAX_MULTITOUCH_722A) },
1138− { .driver_data = MT_CLS_EGALAX,
1140+ { .driver_data = MT_CLS_EGALAX_SERIAL,
11391141 MT_USB_DEVICE(USB_VENDOR_ID_DWAV,
1140− USB_DEVICE_ID_DWAV_EGALAX_MULTITOUCH_726B) },
1142+ USB_DEVICE_ID_DWAV_EGALAX_MULTITOUCH_725E) },
11411143 { .driver_data = MT_CLS_EGALAX_SERIAL,
11421144 MT_USB_DEVICE(USB_VENDOR_ID_DWAV,
11431145 USB_DEVICE_ID_DWAV_EGALAX_MULTITOUCH_7262) },
1146+ { .driver_data = MT_CLS_EGALAX,
1147+ MT_USB_DEVICE(USB_VENDOR_ID_DWAV,
1148+ USB_DEVICE_ID_DWAV_EGALAX_MULTITOUCH_726B) },
11441149 { .driver_data = MT_CLS_EGALAX,
11451150 MT_USB_DEVICE(USB_VENDOR_ID_DWAV,
11461151 USB_DEVICE_ID_DWAV_EGALAX_MULTITOUCH_72A1) },
11471152 { .driver_data = MT_CLS_EGALAX_SERIAL,
11481153 MT_USB_DEVICE(USB_VENDOR_ID_DWAV,
11491154 USB_DEVICE_ID_DWAV_EGALAX_MULTITOUCH_72AA) },
1155+ { .driver_data = MT_CLS_EGALAX,
1156+ HID_USB_DEVICE(USB_VENDOR_ID_DWAV,
1157+ USB_DEVICE_ID_DWAV_EGALAX_MULTITOUCH_72C4) },
1158+ { .driver_data = MT_CLS_EGALAX,
1159+ HID_USB_DEVICE(USB_VENDOR_ID_DWAV,
1160+ USB_DEVICE_ID_DWAV_EGALAX_MULTITOUCH_72D0) },
11501161 { .driver_data = MT_CLS_EGALAX,
11511162 MT_USB_DEVICE(USB_VENDOR_ID_DWAV,
11521163 USB_DEVICE_ID_DWAV_EGALAX_MULTITOUCH_72FA) },
@@ -1162,15 +1173,6 @@ static const struct hid_device_id mt_devices[] = { · 9 unmodified lines
11621173 { .driver_data = MT_CLS_EGALAX_SERIAL,
11631174 MT_USB_DEVICE(USB_VENDOR_ID_DWAV,
11641175 USB_DEVICE_ID_DWAV_EGALAX_MULTITOUCH_A001) },
1165− { .driver_data = MT_CLS_EGALAX,
1166− HID_USB_DEVICE(USB_VENDOR_ID_DWAV,
1167− USB_DEVICE_ID_DWAV_EGALAX_MULTITOUCH_7224) },
1168− { .driver_data = MT_CLS_EGALAX,
1169− HID_USB_DEVICE(USB_VENDOR_ID_DWAV,
1170− USB_DEVICE_ID_DWAV_EGALAX_MULTITOUCH_72D0) },
1171− { .driver_data = MT_CLS_EGALAX,
1172− HID_USB_DEVICE(USB_VENDOR_ID_DWAV,
1173− USB_DEVICE_ID_DWAV_EGALAX_MULTITOUCH_72C4) },
11741176
11751177 /* Elo TouchSystems IntelliTouch Plus panel */
11761178 { .driver_data = MT_CLS_DUAL_CONTACT_ID,
drivers/hid/hid-ps3remote.c+0−204
@@ -1,204 +0,0 @@
1−/*
2− * HID driver for Sony PS3 BD Remote Control
3− *
4− * Copyright (c) 2012 David Dillow <dave@thedillows.org>
5− * Based on a blend of the bluez fakehid user-space code by Marcel Holtmann
6− * and other kernel HID drivers.
7− */
8−
9−/*
10− * This program is free software; you can redistribute it and/or modify it
11− * under the terms of the GNU General Public License as published by the Free
12− * Software Foundation; either version 2 of the License, or (at your option)
13− * any later version.
14− */
15−
16−/* NOTE: in order for the Sony PS3 BD Remote Control to be found by
17− * a Bluetooth host, the key combination Start+Enter has to be kept pressed
18− * for about 7 seconds with the Bluetooth Host Controller in discovering mode.
19− *
20− * There will be no PIN request from the device.
21− */
22−
23−#include <linux/device.h>
24−#include <linux/hid.h>
25−#include <linux/module.h>
26−
27−#include "hid-ids.h"
28−
29−static __u8 ps3remote_rdesc[] = {
30− 0x05, 0x01, /* GUsagePage Generic Desktop */
31− 0x09, 0x05, /* LUsage 0x05 [Game Pad] */
32− 0xA1, 0x01, /* MCollection Application (mouse, keyboard) */
33−
34− /* Use collection 1 for joypad buttons */
35− 0xA1, 0x02, /* MCollection Logical (interrelated data) */
36−
37− /* Ignore the 1st byte, maybe it is used for a controller
38− * number but it's not needed for correct operation */
39− 0x75, 0x08, /* GReportSize 0x08 [8] */
40− 0x95, 0x01, /* GReportCount 0x01 [1] */
41− 0x81, 0x01, /* MInput 0x01 (Const[0] Arr[1] Abs[2]) */
42−
43− /* Bytes from 2nd to 4th are a bitmap for joypad buttons, for these
44− * buttons multiple keypresses are allowed */
45− 0x05, 0x09, /* GUsagePage Button */
46− 0x19, 0x01, /* LUsageMinimum 0x01 [Button 1 (primary/trigger)] */
47− 0x29, 0x18, /* LUsageMaximum 0x18 [Button 24] */
48− 0x14, /* GLogicalMinimum [0] */
49− 0x25, 0x01, /* GLogicalMaximum 0x01 [1] */
50− 0x75, 0x01, /* GReportSize 0x01 [1] */
51− 0x95, 0x18, /* GReportCount 0x18 [24] */
52− 0x81, 0x02, /* MInput 0x02 (Data[0] Var[1] Abs[2]) */
53−
54− 0xC0, /* MEndCollection */
55−
56− /* Use collection 2 for remote control buttons */
57− 0xA1, 0x02, /* MCollection Logical (interrelated data) */
58−
59− /* 5th byte is used for remote control buttons */
60− 0x05, 0x09, /* GUsagePage Button */
61− 0x18, /* LUsageMinimum [No button pressed] */
62− 0x29, 0xFE, /* LUsageMaximum 0xFE [Button 254] */
63− 0x14, /* GLogicalMinimum [0] */
64− 0x26, 0xFE, 0x00, /* GLogicalMaximum 0x00FE [254] */
65− 0x75, 0x08, /* GReportSize 0x08 [8] */
66− 0x95, 0x01, /* GReportCount 0x01 [1] */
67− 0x80, /* MInput */
68−
69− /* Ignore bytes from 6th to 11th, 6th to 10th are always constant at
70− * 0xff and 11th is for press indication */
71− 0x75, 0x08, /* GReportSize 0x08 [8] */
72− 0x95, 0x06, /* GReportCount 0x06 [6] */
73− 0x81, 0x01, /* MInput 0x01 (Const[0] Arr[1] Abs[2]) */
74−
75− /* 12th byte is for battery strength */
76− 0x05, 0x06, /* GUsagePage Generic Device Controls */
77− 0x09, 0x20, /* LUsage 0x20 [Battery Strength] */
78− 0x14, /* GLogicalMinimum [0] */
79− 0x25, 0x05, /* GLogicalMaximum 0x05 [5] */
80− 0x75, 0x08, /* GReportSize 0x08 [8] */
81− 0x95, 0x01, /* GReportCount 0x01 [1] */
82− 0x81, 0x02, /* MInput 0x02 (Data[0] Var[1] Abs[2]) */
83−
84− 0xC0, /* MEndCollection */
85−
86− 0xC0 /* MEndCollection [Game Pad] */
87−};
88−
89−static const unsigned int ps3remote_keymap_joypad_buttons[] = {
90− [0x01] = KEY_SELECT,
91− [0x02] = BTN_THUMBL, /* L3 */
92− [0x03] = BTN_THUMBR, /* R3 */
93− [0x04] = BTN_START,
94− [0x05] = KEY_UP,
95− [0x06] = KEY_RIGHT,
96− [0x07] = KEY_DOWN,
97− [0x08] = KEY_LEFT,
98− [0x09] = BTN_TL2, /* L2 */
99− [0x0a] = BTN_TR2, /* R2 */
100− [0x0b] = BTN_TL, /* L1 */
101− [0x0c] = BTN_TR, /* R1 */
102− [0x0d] = KEY_OPTION, /* options/triangle */
103− [0x0e] = KEY_BACK, /* back/circle */
104− [0x0f] = BTN_0, /* cross */
105− [0x10] = KEY_SCREEN, /* view/square */
106− [0x11] = KEY_HOMEPAGE, /* PS button */
107− [0x14] = KEY_ENTER,
108−};
109−static const unsigned int ps3remote_keymap_remote_buttons[] = {
110− [0x00] = KEY_1,
111− [0x01] = KEY_2,
112− [0x02] = KEY_3,
113− [0x03] = KEY_4,
114− [0x04] = KEY_5,
115− [0x05] = KEY_6,
116− [0x06] = KEY_7,
117− [0x07] = KEY_8,
118− [0x08] = KEY_9,
119− [0x09] = KEY_0,
120− [0x0e] = KEY_ESC, /* return */
121− [0x0f] = KEY_CLEAR,
122− [0x16] = KEY_EJECTCD,
123− [0x1a] = KEY_MENU, /* top menu */
124− [0x28] = KEY_TIME,
125− [0x30] = KEY_PREVIOUS,
126− [0x31] = KEY_NEXT,
127− [0x32] = KEY_PLAY,
128− [0x33] = KEY_REWIND, /* scan back */
129− [0x34] = KEY_FORWARD, /* scan forward */
130− [0x38] = KEY_STOP,
131− [0x39] = KEY_PAUSE,
132− [0x40] = KEY_CONTEXT_MENU, /* pop up/menu */
133− [0x60] = KEY_FRAMEBACK, /* slow/step back */
134− [0x61] = KEY_FRAMEFORWARD, /* slow/step forward */
135− [0x63] = KEY_SUBTITLE,
136− [0x64] = KEY_AUDIO,
137− [0x65] = KEY_ANGLE,
138− [0x70] = KEY_INFO, /* display */
139− [0x80] = KEY_BLUE,
140− [0x81] = KEY_RED,
141− [0x82] = KEY_GREEN,
142− [0x83] = KEY_YELLOW,
143−};
144−
145−static __u8 *ps3remote_fixup(struct hid_device *hdev, __u8 *rdesc,
146− unsigned int *rsize)
147−{
148− *rsize = sizeof(ps3remote_rdesc);
149− return ps3remote_rdesc;
150−}
151−
152−static int ps3remote_mapping(struct hid_device *hdev, struct hid_input *hi,
153− struct hid_field *field, struct hid_usage *usage,
154− unsigned long **bit, int *max)
155−{
156− unsigned int key = usage->hid & HID_USAGE;
157−
158− if ((usage->hid & HID_USAGE_PAGE) != HID_UP_BUTTON)
159− return -1;
160−
161− switch (usage->collection_index) {
162− case 1:
163− if (key >= ARRAY_SIZE(ps3remote_keymap_joypad_buttons))
164− return -1;
165−
166− key = ps3remote_keymap_joypad_buttons[key];
167− if (!key)
168− return -1;
169− break;
170− case 2:
171− if (key >= ARRAY_SIZE(ps3remote_keymap_remote_buttons))
172− return -1;
173−
174− key = ps3remote_keymap_remote_buttons[key];
175− if (!key)
176− return -1;
177− break;
178− default:
179− return -1;
180− }
181−
182− hid_map_usage_clear(hi, usage, bit, max, EV_KEY, key);
183− return 1;
184−}
185−
186−static const struct hid_device_id ps3remote_devices[] = {
187− /* PS3 BD Remote Control */
188− { HID_BLUETOOTH_DEVICE(USB_VENDOR_ID_SONY, USB_DEVICE_ID_SONY_PS3_BDREMOTE) },
189− /* Logitech Harmony Adapter for PS3 */
190− { HID_BLUETOOTH_DEVICE(USB_VENDOR_ID_LOGITECH, USB_DEVICE_ID_LOGITECH_HARMONY_PS3) },
191− { }
192−};
193−MODULE_DEVICE_TABLE(hid, ps3remote_devices);
194−
195−static struct hid_driver ps3remote_driver = {
196− .name = "ps3_remote",
197− .id_table = ps3remote_devices,
198− .report_fixup = ps3remote_fixup,
199− .input_mapping = ps3remote_mapping,
200−};
201−module_hid_driver(ps3remote_driver);
202−
203−MODULE_LICENSE("GPL");
204−MODULE_AUTHOR("David Dillow <dave@thedillows.org>, Antonio Ospite <ospite@studenti.unina.it>");
drivers/hid/hid-roccat.c+13−3
@@ -366,7 +366,7 @@ void roccat_disconnect(int minor) · 365 unmodified lines
366366 mutex_lock(&devices_lock);
367367 devices[minor] = NULL;
368368 mutex_unlock(&devices_lock);
369−
369+
370370 if (device->open) {
371371 hid_hw_close(device->hid);
372372 wake_up_interruptible(&device->wait);
@@ -426,13 +426,23 @@ static int __init roccat_init(void) · 53 unmodified lines
426426
427427 if (retval < 0) {
428428 pr_warn("can't get major number\n");
429− return retval;
429+ goto error;
430430 }
431431
432432 cdev_init(&roccat_cdev, &roccat_ops);
433− cdev_add(&roccat_cdev, dev_id, ROCCAT_MAX_DEVICES);
433+ retval = cdev_add(&roccat_cdev, dev_id, ROCCAT_MAX_DEVICES);
434434
435+ if (retval < 0) {
436+ pr_warn("cannot add cdev\n");
437+ goto cleanup_alloc_chrdev_region;
438+ }
435439 return 0;
440+
441+
442+ cleanup_alloc_chrdev_region:
443+ unregister_chrdev_region(dev_id, ROCCAT_MAX_DEVICES);
444+ error:
445+ return retval;
436446 }
437447
438448 static void __exit roccat_exit(void)
drivers/hid/hid-sony.c+462−11
@@ -1,11 +1,13 @@
11 /*
2− * HID driver for some sony "special" devices
2+ * HID driver for Sony / PS2 / PS3 BD devices.
33 *
44 * Copyright (c) 1999 Andreas Gal
55 * Copyright (c) 2000-2005 Vojtech Pavlik <vojtech@suse.cz>
66 * Copyright (c) 2005 Michael Haboustak <mike-@cinci.rr.com> for Concept2, Inc
77 * Copyright (c) 2008 Jiri Slaby
8− * Copyright (c) 2006-2008 Jiri Kosina
8+ * Copyright (c) 2012 David Dillow <dave@thedillows.org>
9+ * Copyright (c) 2006-2013 Jiri Kosina
10+ * Copyright (c) 2013 Colin Leitner <colin.leitner@gmail.com>
911 */
1012
1113 /*
@@ -15,17 +17,27 @@ · 3 unmodified lines
1517 * any later version.
1618 */
1719
20+/* NOTE: in order for the Sony PS3 BD Remote Control to be found by
21+ * a Bluetooth host, the key combination Start+Enter has to be kept pressed
22+ * for about 7 seconds with the Bluetooth Host Controller in discovering mode.
23+ *
24+ * There will be no PIN request from the device.
25+ */
26+
1827 #include <linux/device.h>
1928 #include <linux/hid.h>
2029 #include <linux/module.h>
2130 #include <linux/slab.h>
2231 #include <linux/usb.h>
32+#include <linux/leds.h>
2333
2434 #include "hid-ids.h"
2535
2636 #define VAIO_RDESC_CONSTANT (1 << 0)
2737 #define SIXAXIS_CONTROLLER_USB (1 << 1)
2838 #define SIXAXIS_CONTROLLER_BT (1 << 2)
39+#define BUZZ_CONTROLLER (1 << 3)
40+#define PS3REMOTE (1 << 4)
2941
3042 static const u8 sixaxis_rdesc_fixup[] = {
3143 0x95, 0x13, 0x09, 0x01, 0x81, 0x02, 0x95, 0x0C,
@@ -55,10 +67,214 @@ static const u8 sixaxis_rdesc_fixup2[] = { · 23 unmodified lines
5567 0xb1, 0x02, 0xc0, 0xc0,
5668 };
5769
70+static __u8 ps3remote_rdesc[] = {
71+ 0x05, 0x01, /* GUsagePage Generic Desktop */
72+ 0x09, 0x05, /* LUsage 0x05 [Game Pad] */
73+ 0xA1, 0x01, /* MCollection Application (mouse, keyboard) */
74+
75+ /* Use collection 1 for joypad buttons */
76+ 0xA1, 0x02, /* MCollection Logical (interrelated data) */
77+
78+ /* Ignore the 1st byte, maybe it is used for a controller
79+ * number but it's not needed for correct operation */
80+ 0x75, 0x08, /* GReportSize 0x08 [8] */
81+ 0x95, 0x01, /* GReportCount 0x01 [1] */
82+ 0x81, 0x01, /* MInput 0x01 (Const[0] Arr[1] Abs[2]) */
83+
84+ /* Bytes from 2nd to 4th are a bitmap for joypad buttons, for these
85+ * buttons multiple keypresses are allowed */
86+ 0x05, 0x09, /* GUsagePage Button */
87+ 0x19, 0x01, /* LUsageMinimum 0x01 [Button 1 (primary/trigger)] */
88+ 0x29, 0x18, /* LUsageMaximum 0x18 [Button 24] */
89+ 0x14, /* GLogicalMinimum [0] */
90+ 0x25, 0x01, /* GLogicalMaximum 0x01 [1] */
91+ 0x75, 0x01, /* GReportSize 0x01 [1] */
92+ 0x95, 0x18, /* GReportCount 0x18 [24] */
93+ 0x81, 0x02, /* MInput 0x02 (Data[0] Var[1] Abs[2]) */
94+
95+ 0xC0, /* MEndCollection */
96+
97+ /* Use collection 2 for remote control buttons */
98+ 0xA1, 0x02, /* MCollection Logical (interrelated data) */
99+
100+ /* 5th byte is used for remote control buttons */
101+ 0x05, 0x09, /* GUsagePage Button */
102+ 0x18, /* LUsageMinimum [No button pressed] */
103+ 0x29, 0xFE, /* LUsageMaximum 0xFE [Button 254] */
104+ 0x14, /* GLogicalMinimum [0] */
105+ 0x26, 0xFE, 0x00, /* GLogicalMaximum 0x00FE [254] */
106+ 0x75, 0x08, /* GReportSize 0x08 [8] */
107+ 0x95, 0x01, /* GReportCount 0x01 [1] */
108+ 0x80, /* MInput */
109+
110+ /* Ignore bytes from 6th to 11th, 6th to 10th are always constant at
111+ * 0xff and 11th is for press indication */
112+ 0x75, 0x08, /* GReportSize 0x08 [8] */
113+ 0x95, 0x06, /* GReportCount 0x06 [6] */
114+ 0x81, 0x01, /* MInput 0x01 (Const[0] Arr[1] Abs[2]) */
115+
116+ /* 12th byte is for battery strength */
117+ 0x05, 0x06, /* GUsagePage Generic Device Controls */
118+ 0x09, 0x20, /* LUsage 0x20 [Battery Strength] */
119+ 0x14, /* GLogicalMinimum [0] */
120+ 0x25, 0x05, /* GLogicalMaximum 0x05 [5] */
121+ 0x75, 0x08, /* GReportSize 0x08 [8] */
122+ 0x95, 0x01, /* GReportCount 0x01 [1] */
123+ 0x81, 0x02, /* MInput 0x02 (Data[0] Var[1] Abs[2]) */
124+
125+ 0xC0, /* MEndCollection */
126+
127+ 0xC0 /* MEndCollection [Game Pad] */
128+};
129+
130+static const unsigned int ps3remote_keymap_joypad_buttons[] = {
131+ [0x01] = KEY_SELECT,
132+ [0x02] = BTN_THUMBL, /* L3 */
133+ [0x03] = BTN_THUMBR, /* R3 */
134+ [0x04] = BTN_START,
135+ [0x05] = KEY_UP,
136+ [0x06] = KEY_RIGHT,
137+ [0x07] = KEY_DOWN,
138+ [0x08] = KEY_LEFT,
139+ [0x09] = BTN_TL2, /* L2 */
140+ [0x0a] = BTN_TR2, /* R2 */
141+ [0x0b] = BTN_TL, /* L1 */
142+ [0x0c] = BTN_TR, /* R1 */
143+ [0x0d] = KEY_OPTION, /* options/triangle */
144+ [0x0e] = KEY_BACK, /* back/circle */
145+ [0x0f] = BTN_0, /* cross */
146+ [0x10] = KEY_SCREEN, /* view/square */
147+ [0x11] = KEY_HOMEPAGE, /* PS button */
148+ [0x14] = KEY_ENTER,
149+};
150+static const unsigned int ps3remote_keymap_remote_buttons[] = {
151+ [0x00] = KEY_1,
152+ [0x01] = KEY_2,
153+ [0x02] = KEY_3,
154+ [0x03] = KEY_4,
155+ [0x04] = KEY_5,
156+ [0x05] = KEY_6,
157+ [0x06] = KEY_7,
158+ [0x07] = KEY_8,
159+ [0x08] = KEY_9,
160+ [0x09] = KEY_0,
161+ [0x0e] = KEY_ESC, /* return */
162+ [0x0f] = KEY_CLEAR,
163+ [0x16] = KEY_EJECTCD,
164+ [0x1a] = KEY_MENU, /* top menu */
165+ [0x28] = KEY_TIME,
166+ [0x30] = KEY_PREVIOUS,
167+ [0x31] = KEY_NEXT,
168+ [0x32] = KEY_PLAY,
169+ [0x33] = KEY_REWIND, /* scan back */
170+ [0x34] = KEY_FORWARD, /* scan forward */
171+ [0x38] = KEY_STOP,
172+ [0x39] = KEY_PAUSE,
173+ [0x40] = KEY_CONTEXT_MENU, /* pop up/menu */
174+ [0x60] = KEY_FRAMEBACK, /* slow/step back */
175+ [0x61] = KEY_FRAMEFORWARD, /* slow/step forward */
176+ [0x63] = KEY_SUBTITLE,
177+ [0x64] = KEY_AUDIO,
178+ [0x65] = KEY_ANGLE,
179+ [0x70] = KEY_INFO, /* display */
180+ [0x80] = KEY_BLUE,
181+ [0x81] = KEY_RED,
182+ [0x82] = KEY_GREEN,
183+ [0x83] = KEY_YELLOW,
184+};
185+
186+static const unsigned int buzz_keymap[] = {
187+ /* The controller has 4 remote buzzers, each with one LED and 5
188+ * buttons.
189+ *
190+ * We use the mapping chosen by the controller, which is:
191+ *
192+ * Key Offset
193+ * -------------------
194+ * Buzz 1
195+ * Blue 5
196+ * Orange 4
197+ * Green 3
198+ * Yellow 2
199+ *
200+ * So, for example, the orange button on the third buzzer is mapped to
201+ * BTN_TRIGGER_HAPPY14
202+ */
203+ [ 1] = BTN_TRIGGER_HAPPY1,
204+ [ 2] = BTN_TRIGGER_HAPPY2,
205+ [ 3] = BTN_TRIGGER_HAPPY3,
206+ [ 4] = BTN_TRIGGER_HAPPY4,
207+ [ 5] = BTN_TRIGGER_HAPPY5,
208+ [ 6] = BTN_TRIGGER_HAPPY6,
209+ [ 7] = BTN_TRIGGER_HAPPY7,
210+ [ 8] = BTN_TRIGGER_HAPPY8,
211+ [ 9] = BTN_TRIGGER_HAPPY9,
212+ [10] = BTN_TRIGGER_HAPPY10,
213+ [11] = BTN_TRIGGER_HAPPY11,
214+ [12] = BTN_TRIGGER_HAPPY12,
215+ [13] = BTN_TRIGGER_HAPPY13,
216+ [14] = BTN_TRIGGER_HAPPY14,
217+ [15] = BTN_TRIGGER_HAPPY15,
218+ [16] = BTN_TRIGGER_HAPPY16,
219+ [17] = BTN_TRIGGER_HAPPY17,
220+ [18] = BTN_TRIGGER_HAPPY18,
221+ [19] = BTN_TRIGGER_HAPPY19,
222+ [20] = BTN_TRIGGER_HAPPY20,
223+};
224+
58225 struct sony_sc {
59226 unsigned long quirks;
227+
228+ void *extra;
60229 };
61230
231+struct buzz_extra {
232+ int led_state;
233+ struct led_classdev *leds[4];
234+};
235+
236+static __u8 *ps3remote_fixup(struct hid_device *hdev, __u8 *rdesc,
237+ unsigned int *rsize)
238+{
239+ *rsize = sizeof(ps3remote_rdesc);
240+ return ps3remote_rdesc;
241+}
242+
243+static int ps3remote_mapping(struct hid_device *hdev, struct hid_input *hi,
244+ struct hid_field *field, struct hid_usage *usage,
245+ unsigned long **bit, int *max)
246+{
247+ unsigned int key = usage->hid & HID_USAGE;
248+
249+ if ((usage->hid & HID_USAGE_PAGE) != HID_UP_BUTTON)
250+ return -1;
251+
252+ switch (usage->collection_index) {
253+ case 1:
254+ if (key >= ARRAY_SIZE(ps3remote_keymap_joypad_buttons))
255+ return -1;
256+
257+ key = ps3remote_keymap_joypad_buttons[key];
258+ if (!key)
259+ return -1;
260+ break;
261+ case 2:
262+ if (key >= ARRAY_SIZE(ps3remote_keymap_remote_buttons))
263+ return -1;
264+
265+ key = ps3remote_keymap_remote_buttons[key];
266+ if (!key)
267+ return -1;
268+ break;
269+ default:
270+ return -1;
271+ }
272+
273+ hid_map_usage_clear(hi, usage, bit, max, EV_KEY, key);
274+ return 1;
275+}
276+
277+
62278 /* Sony Vaio VGX has wrongly mouse pointer declared as constant */
63279 static __u8 *sony_report_fixup(struct hid_device *hdev, __u8 *rdesc,
64280 unsigned int *rsize)
@@ -95,6 +311,10 @@ static __u8 *sony_report_fixup(struct hid_device *hdev, __u8 *rdesc, · 30 unmodified lines
95311 *rsize = sizeof(sixaxis_rdesc_fixup2);
96312 memcpy(rdesc, &sixaxis_rdesc_fixup2, *rsize);
97313 }
314+
315+ if (sc->quirks & PS3REMOTE)
316+ return ps3remote_fixup(hdev, rdesc, rsize);
317+
98318 return rdesc;
99319 }
100320
@@ -117,6 +337,41 @@ static int sony_raw_event(struct hid_device *hdev, struct hid_report *report, · 16 unmodified lines
117337 return 0;
118338 }
119339
340+static int sony_mapping(struct hid_device *hdev, struct hid_input *hi,
341+ struct hid_field *field, struct hid_usage *usage,
342+ unsigned long **bit, int *max)
343+{
344+ struct sony_sc *sc = hid_get_drvdata(hdev);
345+
346+ if (sc->quirks & BUZZ_CONTROLLER) {
347+ unsigned int key = usage->hid & HID_USAGE;
348+
349+ if ((usage->hid & HID_USAGE_PAGE) != HID_UP_BUTTON)
350+ return -1;
351+
352+ switch (usage->collection_index) {
353+ case 1:
354+ if (key >= ARRAY_SIZE(buzz_keymap))
355+ return -1;
356+
357+ key = buzz_keymap[key];
358+ if (!key)
359+ return -1;
360+ break;
361+ default:
362+ return -1;
363+ }
364+
365+ hid_map_usage_clear(hi, usage, bit, max, EV_KEY, key);
366+ return 1;
367+ }
368+
369+ if (sc->quirks & PS3REMOTE)
370+ return ps3remote_mapping(hdev, hi, field, usage, bit, max);
371+
372+ return -1;
373+}
374+
120375 /*
121376 * The Sony Sixaxis does not handle HID Output Reports on the Interrupt EP
122377 * like it should according to usbhid/hid-core.c::usbhid_output_raw_report()
@@ -192,11 +447,181 @@ static int sixaxis_set_operational_bt(struct hid_device *hdev) · 69 unmodified lines
192447 return hdev->hid_output_raw_report(hdev, buf, sizeof(buf), HID_FEATURE_REPORT);
193448 }
194449
450+static void buzz_set_leds(struct hid_device *hdev, int leds)
451+{
452+ struct list_head *report_list =
453+ &hdev->report_enum[HID_OUTPUT_REPORT].report_list;
454+ struct hid_report *report = list_entry(report_list->next,
455+ struct hid_report, list);
456+ __s32 *value = report->field[0]->value;
457+
458+ value[0] = 0x00;
459+ value[1] = (leds & 1) ? 0xff : 0x00;
460+ value[2] = (leds & 2) ? 0xff : 0x00;
461+ value[3] = (leds & 4) ? 0xff : 0x00;
462+ value[4] = (leds & 8) ? 0xff : 0x00;
463+ value[5] = 0x00;
464+ value[6] = 0x00;
465+ hid_hw_request(hdev, report, HID_REQ_SET_REPORT);
466+}
467+
468+static void buzz_led_set_brightness(struct led_classdev *led,
469+ enum led_brightness value)
470+{
471+ struct device *dev = led->dev->parent;
472+ struct hid_device *hdev = container_of(dev, struct hid_device, dev);
473+ struct sony_sc *drv_data;
474+ struct buzz_extra *buzz;
475+
476+ int n;
477+
478+ drv_data = hid_get_drvdata(hdev);
479+ if (!drv_data || !drv_data->extra) {
480+ hid_err(hdev, "No device data\n");
481+ return;
482+ }
483+ buzz = drv_data->extra;
484+
485+ for (n = 0; n < 4; n++) {
486+ if (led == buzz->leds[n]) {
487+ int on = !! (buzz->led_state & (1 << n));
488+ if (value == LED_OFF && on) {
489+ buzz->led_state &= ~(1 << n);
490+ buzz_set_leds(hdev, buzz->led_state);
491+ } else if (value != LED_OFF && !on) {
492+ buzz->led_state |= (1 << n);
493+ buzz_set_leds(hdev, buzz->led_state);
494+ }
495+ break;
496+ }
497+ }
498+}
499+
500+static enum led_brightness buzz_led_get_brightness(struct led_classdev *led)
501+{
502+ struct device *dev = led->dev->parent;
503+ struct hid_device *hdev = container_of(dev, struct hid_device, dev);
504+ struct sony_sc *drv_data;
505+ struct buzz_extra *buzz;
506+
507+ int n;
508+ int on = 0;
509+
510+ drv_data = hid_get_drvdata(hdev);
511+ if (!drv_data || !drv_data->extra) {
512+ hid_err(hdev, "No device data\n");
513+ return LED_OFF;
514+ }
515+ buzz = drv_data->extra;
516+
517+ for (n = 0; n < 4; n++) {
518+ if (led == buzz->leds[n]) {
519+ on = !! (buzz->led_state & (1 << n));
520+ break;
521+ }
522+ }
523+
524+ return on ? LED_FULL : LED_OFF;
525+}
526+
527+static int buzz_init(struct hid_device *hdev)
528+{
529+ struct sony_sc *drv_data;
530+ struct buzz_extra *buzz;
531+ int n, ret = 0;
532+ struct led_classdev *led;
533+ size_t name_sz;
534+ char *name;
535+
536+ drv_data = hid_get_drvdata(hdev);
537+ BUG_ON(!(drv_data->quirks & BUZZ_CONTROLLER));
538+
539+ buzz = kzalloc(sizeof(*buzz), GFP_KERNEL);
540+ if (!buzz) {
541+ hid_err(hdev, "Insufficient memory, cannot allocate driver data\n");
542+ return -ENOMEM;
543+ }
544+ drv_data->extra = buzz;
545+
546+ /* Clear LEDs as we have no way of reading their initial state. This is
547+ * only relevant if the driver is loaded after somebody actively set the
548+ * LEDs to on */
549+ buzz_set_leds(hdev, 0x00);
550+
551+ name_sz = strlen(dev_name(&hdev->dev)) + strlen("::buzz#") + 1;
552+
553+ for (n = 0; n < 4; n++) {
554+ led = kzalloc(sizeof(struct led_classdev) + name_sz, GFP_KERNEL);
555+ if (!led) {
556+ hid_err(hdev, "Couldn't allocate memory for LED %d\n", n);
557+ goto error_leds;
558+ }
559+
560+ name = (void *)(&led[1]);
561+ snprintf(name, name_sz, "%s::buzz%d", dev_name(&hdev->dev), n + 1);
562+ led->name = name;
563+ led->brightness = 0;
564+ led->max_brightness = 1;
565+ led->brightness_get = buzz_led_get_brightness;
566+ led->brightness_set = buzz_led_set_brightness;
567+
568+ if (led_classdev_register(&hdev->dev, led)) {
569+ hid_err(hdev, "Failed to register LED %d\n", n);
570+ kfree(led);
571+ goto error_leds;
572+ }
573+
574+ buzz->leds[n] = led;
575+ }
576+
577+ return ret;
578+
579+error_leds:
580+ for (n = 0; n < 4; n++) {
581+ led = buzz->leds[n];
582+ buzz->leds[n] = NULL;
583+ if (!led)
584+ continue;
585+ led_classdev_unregister(led);
586+ kfree(led);
587+ }
588+
589+ kfree(drv_data->extra);
590+ drv_data->extra = NULL;
591+ return ret;
592+}
593+
594+static void buzz_remove(struct hid_device *hdev)
595+{
596+ struct sony_sc *drv_data;
597+ struct buzz_extra *buzz;
598+ struct led_classdev *led;
599+ int n;
600+
601+ drv_data = hid_get_drvdata(hdev);
602+ BUG_ON(!(drv_data->quirks & BUZZ_CONTROLLER));
603+
604+ buzz = drv_data->extra;
605+
606+ for (n = 0; n < 4; n++) {
607+ led = buzz->leds[n];
608+ buzz->leds[n] = NULL;
609+ if (!led)
610+ continue;
611+ led_classdev_unregister(led);
612+ kfree(led);
613+ }
614+
615+ kfree(drv_data->extra);
616+ drv_data->extra = NULL;
617+}
618+
195619 static int sony_probe(struct hid_device *hdev, const struct hid_device_id *id)
196620 {
197621 int ret;
198622 unsigned long quirks = id->driver_data;
199623 struct sony_sc *sc;
624+ unsigned int connect_mask = HID_CONNECT_DEFAULT;
200625
201626 sc = kzalloc(sizeof(*sc), GFP_KERNEL);
202627 if (sc == NULL) {
@@ -213,8 +638,14 @@ static int sony_probe(struct hid_device *hdev, const struct hid_device_id *id) · 10 unmodified lines
213638 goto err_free;
214639 }
215640
216− ret = hid_hw_start(hdev, HID_CONNECT_DEFAULT |
217− HID_CONNECT_HIDDEV_FORCE);
641+ if (sc->quirks & VAIO_RDESC_CONSTANT)
642+ connect_mask |= HID_CONNECT_HIDDEV_FORCE;
643+ else if (sc->quirks & SIXAXIS_CONTROLLER_USB)
644+ connect_mask |= HID_CONNECT_HIDDEV_FORCE;
645+ else if (sc->quirks & SIXAXIS_CONTROLLER_BT)
646+ connect_mask |= HID_CONNECT_HIDDEV_FORCE;
647+
648+ ret = hid_hw_start(hdev, connect_mask);
218649 if (ret) {
219650 hid_err(hdev, "hw start failed\n");
220651 goto err_free;
@@ -226,6 +657,8 @@ static int sony_probe(struct hid_device *hdev, const struct hid_device_id *id) · 5 unmodified lines
226657 }
227658 else if (sc->quirks & SIXAXIS_CONTROLLER_BT)
228659 ret = sixaxis_set_operational_bt(hdev);
660+ else if (sc->quirks & BUZZ_CONTROLLER)
661+ ret = buzz_init(hdev);
229662 else
230663 ret = 0;
231664
@@ -242,8 +675,13 @@ err_free: · 10 unmodified lines
242675
243676 static void sony_remove(struct hid_device *hdev)
244677 {
678+ struct sony_sc *sc = hid_get_drvdata(hdev);
679+
680+ if (sc->quirks & BUZZ_CONTROLLER)
681+ buzz_remove(hdev);
682+
245683 hid_hw_stop(hdev);
246− kfree(hid_get_drvdata(hdev));
684+ kfree(sc);
247685 }
248686
249687 static const struct hid_device_id sony_devices[] = {
@@ -257,17 +695,30 @@ static const struct hid_device_id sony_devices[] = { · 7 unmodified lines
257695 .driver_data = VAIO_RDESC_CONSTANT },
258696 { HID_USB_DEVICE(USB_VENDOR_ID_SONY, USB_DEVICE_ID_SONY_VAIO_VGP_MOUSE),
259697 .driver_data = VAIO_RDESC_CONSTANT },
698+ /* Wired Buzz Controller. Reported as Sony Hub from its USB ID and as
699+ * Logitech joystick from the device descriptor. */
700+ { HID_USB_DEVICE(USB_VENDOR_ID_SONY, USB_DEVICE_ID_SONY_BUZZ_CONTROLLER),
701+ .driver_data = BUZZ_CONTROLLER },
702+ { HID_USB_DEVICE(USB_VENDOR_ID_SONY, USB_DEVICE_ID_SONY_WIRELESS_BUZZ_CONTROLLER),
703+ .driver_data = BUZZ_CONTROLLER },
704+ /* PS3 BD Remote Control */
705+ { HID_BLUETOOTH_DEVICE(USB_VENDOR_ID_SONY, USB_DEVICE_ID_SONY_PS3_BDREMOTE),
706+ .driver_data = PS3REMOTE },
707+ /* Logitech Harmony Adapter for PS3 */
708+ { HID_BLUETOOTH_DEVICE(USB_VENDOR_ID_LOGITECH, USB_DEVICE_ID_LOGITECH_HARMONY_PS3),
709+ .driver_data = PS3REMOTE },
260710 { }
261711 };
262712 MODULE_DEVICE_TABLE(hid, sony_devices);
263713
264714 static struct hid_driver sony_driver = {
265− .name = "sony",
266− .id_table = sony_devices,
267− .probe = sony_probe,
268− .remove = sony_remove,
269− .report_fixup = sony_report_fixup,
270− .raw_event = sony_raw_event
715+ .name = "sony",
716+ .id_table = sony_devices,
717+ .input_mapping = sony_mapping,
718+ .probe = sony_probe,
719+ .remove = sony_remove,
720+ .report_fixup = sony_report_fixup,
721+ .raw_event = sony_raw_event
271722 };
272723 module_hid_driver(sony_driver);
273724
drivers/hid/hid-wacom.c+13−1
@@ -46,6 +46,7 @@ struct wacom_data { · 45 unmodified lines
4646 __u8 battery_capacity;
4747 __u8 power_raw;
4848 __u8 ps_connected;
49+ __u8 bat_charging;
4950 struct power_supply battery;
5051 struct power_supply ac;
5152 __u8 led_selector;
@@ -62,6 +63,7 @@ static enum power_supply_property wacom_battery_props[] = { · 10 unmodified lines
6263 POWER_SUPPLY_PROP_PRESENT,
6364 POWER_SUPPLY_PROP_CAPACITY,
6465 POWER_SUPPLY_PROP_SCOPE,
66+ POWER_SUPPLY_PROP_STATUS,
6567 };
6668
6769 static enum power_supply_property wacom_ac_props[] = {
@@ -287,6 +289,15 @@ static int wacom_battery_get_property(struct power_supply *psy, · 219 unmodified lines
287289 case POWER_SUPPLY_PROP_CAPACITY:
288290 val->intval = wdata->battery_capacity;
289291 break;
292+ case POWER_SUPPLY_PROP_STATUS:
293+ if (wdata->bat_charging)
294+ val->intval = POWER_SUPPLY_STATUS_CHARGING;
295+ else
296+ if (wdata->battery_capacity == 100 && wdata->ps_connected)
297+ val->intval = POWER_SUPPLY_STATUS_FULL;
298+ else
299+ val->intval = POWER_SUPPLY_STATUS_DISCHARGING;
300+ break;
290301 default:
291302 ret = -EINVAL;
292303 break;
@@ -727,7 +738,8 @@ static int wacom_raw_event(struct hid_device *hdev, struct hid_report *report, · 434 unmodified lines
727738 if (power_raw != wdata->power_raw) {
728739 wdata->power_raw = power_raw;
729740 wdata->battery_capacity = batcap_i4[power_raw & 0x07];
730− wdata->ps_connected = power_raw & 0x08;
741+ wdata->bat_charging = (power_raw & 0x08) ? 1 : 0;
742+ wdata->ps_connected = (power_raw & 0x10) ? 1 : 0;
731743 }
732744
733745 break;
drivers/hid/hid-wiimote-core.c+1101−557
@@ -1,6 +1,6 @@
11 /*
2− * HID driver for Nintendo Wiimote devices
3− * Copyright (c) 2011 David Herrmann
2+ * HID driver for Nintendo Wii / Wii U peripherals
3+ * Copyright (c) 2011-2013 David Herrmann <dh.herrmann@gmail.com>
44 */
55
66 /*
@@ -14,53 +14,19 @@ · 7 unmodified lines
1414 #include <linux/device.h>
1515 #include <linux/hid.h>
1616 #include <linux/input.h>
17−#include <linux/leds.h>
1817 #include <linux/module.h>
1918 #include <linux/mutex.h>
20−#include <linux/power_supply.h>
2119 #include <linux/spinlock.h>
2220 #include "hid-ids.h"
2321 #include "hid-wiimote.h"
2422
25−enum wiiproto_keys {
26− WIIPROTO_KEY_LEFT,
27− WIIPROTO_KEY_RIGHT,
28− WIIPROTO_KEY_UP,
29− WIIPROTO_KEY_DOWN,
30− WIIPROTO_KEY_PLUS,
31− WIIPROTO_KEY_MINUS,
32− WIIPROTO_KEY_ONE,
33− WIIPROTO_KEY_TWO,
34− WIIPROTO_KEY_A,
35− WIIPROTO_KEY_B,
36− WIIPROTO_KEY_HOME,
37− WIIPROTO_KEY_COUNT
38−};
39−
40−static __u16 wiiproto_keymap[] = {
41− KEY_LEFT, /* WIIPROTO_KEY_LEFT */
42− KEY_RIGHT, /* WIIPROTO_KEY_RIGHT */
43− KEY_UP, /* WIIPROTO_KEY_UP */
44− KEY_DOWN, /* WIIPROTO_KEY_DOWN */
45− KEY_NEXT, /* WIIPROTO_KEY_PLUS */
46− KEY_PREVIOUS, /* WIIPROTO_KEY_MINUS */
47− BTN_1, /* WIIPROTO_KEY_ONE */
48− BTN_2, /* WIIPROTO_KEY_TWO */
49− BTN_A, /* WIIPROTO_KEY_A */
50− BTN_B, /* WIIPROTO_KEY_B */
51− BTN_MODE, /* WIIPROTO_KEY_HOME */
52−};
23+/* output queue handling */
5324
54−static enum power_supply_property wiimote_battery_props[] = {
55− POWER_SUPPLY_PROP_CAPACITY,
56− POWER_SUPPLY_PROP_SCOPE,
57−};
58−
59−static ssize_t wiimote_hid_send(struct hid_device *hdev, __u8 *buffer,
60− size_t count)
25+static int wiimote_hid_send(struct hid_device *hdev, __u8 *buffer,
26+ size_t count)
6127 {
6228 __u8 *buf;
63− ssize_t ret;
29+ int ret;
6430
6531 if (!hdev->hid_output_raw_report)
6632 return -ENODEV;
@@ -75,24 +41,33 @@ static ssize_t wiimote_hid_send(struct hid_device *hdev, __u8 *buffer, · 8 unmodified lines
7541 return ret;
7642 }
7743
78−static void wiimote_worker(struct work_struct *work)
44+static void wiimote_queue_worker(struct work_struct *work)
7945 {
80− struct wiimote_data *wdata = container_of(work, struct wiimote_data,
81− worker);
46+ struct wiimote_queue *queue = container_of(work, struct wiimote_queue,
47+ worker);
48+ struct wiimote_data *wdata = container_of(queue, struct wiimote_data,
49+ queue);
8250 unsigned long flags;
51+ int ret;
8352
84− spin_lock_irqsave(&wdata->qlock, flags);
53+ spin_lock_irqsave(&wdata->queue.lock, flags);
8554
86− while (wdata->head != wdata->tail) {
87− spin_unlock_irqrestore(&wdata->qlock, flags);
88− wiimote_hid_send(wdata->hdev, wdata->outq[wdata->tail].data,
89− wdata->outq[wdata->tail].size);
90− spin_lock_irqsave(&wdata->qlock, flags);
55+ while (wdata->queue.head != wdata->queue.tail) {
56+ spin_unlock_irqrestore(&wdata->queue.lock, flags);
57+ ret = wiimote_hid_send(wdata->hdev,
58+ wdata->queue.outq[wdata->queue.tail].data,
59+ wdata->queue.outq[wdata->queue.tail].size);
60+ if (ret < 0) {
61+ spin_lock_irqsave(&wdata->state.lock, flags);
62+ wiimote_cmd_abort(wdata);
63+ spin_unlock_irqrestore(&wdata->state.lock, flags);
64+ }
65+ spin_lock_irqsave(&wdata->queue.lock, flags);
9166
92− wdata->tail = (wdata->tail + 1) % WIIMOTE_BUFSIZE;
67+ wdata->queue.tail = (wdata->queue.tail + 1) % WIIMOTE_BUFSIZE;
9368 }
9469
95− spin_unlock_irqrestore(&wdata->qlock, flags);
70+ spin_unlock_irqrestore(&wdata->queue.lock, flags);
9671 }
9772
9873 static void wiimote_queue(struct wiimote_data *wdata, const __u8 *buffer,
@@ -103,7 +78,9 @@ static void wiimote_queue(struct wiimote_data *wdata, const __u8 *buffer, · 4 unmodified lines
10378
10479 if (count > HID_MAX_BUFFER_SIZE) {
10580 hid_warn(wdata->hdev, "Sending too large output report\n");
106− return;
81+
82+ spin_lock_irqsave(&wdata->queue.lock, flags);
83+ goto out_error;
10784 }
10885
10986 /*
@@ -116,22 +93,28 @@ static void wiimote_queue(struct wiimote_data *wdata, const __u8 *buffer, · 6 unmodified lines
11693 * will reschedule itself until the queue is empty.
11794 */
11895
119− spin_lock_irqsave(&wdata->qlock, flags);
96+ spin_lock_irqsave(&wdata->queue.lock, flags);
12097
121− memcpy(wdata->outq[wdata->head].data, buffer, count);
122− wdata->outq[wdata->head].size = count;
123− newhead = (wdata->head + 1) % WIIMOTE_BUFSIZE;
98+ memcpy(wdata->queue.outq[wdata->queue.head].data, buffer, count);
99+ wdata->queue.outq[wdata->queue.head].size = count;
100+ newhead = (wdata->queue.head + 1) % WIIMOTE_BUFSIZE;
124101
125− if (wdata->head == wdata->tail) {
126− wdata->head = newhead;
127− schedule_work(&wdata->worker);
128− } else if (newhead != wdata->tail) {
129− wdata->head = newhead;
102+ if (wdata->queue.head == wdata->queue.tail) {
103+ wdata->queue.head = newhead;
104+ schedule_work(&wdata->queue.worker);
105+ } else if (newhead != wdata->queue.tail) {
106+ wdata->queue.head = newhead;
130107 } else {
131108 hid_warn(wdata->hdev, "Output queue is full");
109+ goto out_error;
132110 }
133111
134− spin_unlock_irqrestore(&wdata->qlock, flags);
112+ goto out_unlock;
113+
114+out_error:
115+ wiimote_cmd_abort(wdata);
116+out_unlock:
117+ spin_unlock_irqrestore(&wdata->queue.lock, flags);
135118 }
136119
137120 /*
@@ -147,7 +130,7 @@ static inline void wiiproto_keep_rumble(struct wiimote_data *wdata, __u8 *cmd1) · 9 unmodified lines
147130 *cmd1 |= 0x01;
148131 }
149132
150−static void wiiproto_req_rumble(struct wiimote_data *wdata, __u8 rumble)
133+void wiiproto_req_rumble(struct wiimote_data *wdata, __u8 rumble)
151134 {
152135 __u8 cmd[2];
153136
@@ -167,7 +150,7 @@ static void wiiproto_req_rumble(struct wiimote_data *wdata, __u8 rumble) · 13 unmodified lines
167150 wiimote_queue(wdata, cmd, sizeof(cmd));
168151 }
169152
170−static void wiiproto_req_leds(struct wiimote_data *wdata, int leds)
153+void wiiproto_req_leds(struct wiimote_data *wdata, int leds)
171154 {
172155 __u8 cmd[2];
173156
@@ -196,17 +179,46 @@ static void wiiproto_req_leds(struct wiimote_data *wdata, int leds) · 22 unmodified lines
196179 * Check what peripherals of the wiimote are currently
197180 * active and select a proper DRM that supports all of
198181 * the requested data inputs.
182+ *
183+ * Not all combinations are actually supported. The following
184+ * combinations work only with limitations:
185+ * - IR cam in extended or full mode disables any data transmission
186+ * of extension controllers. There is no DRM mode that supports
187+ * extension bytes plus extended/full IR.
188+ * - IR cam with accelerometer and extension *_EXT8 is not supported.
189+ * However, all extensions that need *_EXT8 are devices that don't
190+ * support IR cameras. Hence, this shouldn't happen under normal
191+ * operation.
192+ * - *_EXT16 is only supported in combination with buttons and
193+ * accelerometer. No IR or similar can be active simultaneously. As
194+ * above, all modules that require it are mutually exclusive with
195+ * IR/etc. so this doesn't matter.
199196 */
200197 static __u8 select_drm(struct wiimote_data *wdata)
201198 {
202199 __u8 ir = wdata->state.flags & WIIPROTO_FLAGS_IR;
203− bool ext = wiiext_active(wdata);
200+ bool ext;
204201
205− if (ir == WIIPROTO_FLAG_IR_BASIC) {
206− if (wdata->state.flags & WIIPROTO_FLAG_ACCEL)
207− return WIIPROTO_REQ_DRM_KAIE;
202+ ext = (wdata->state.flags & WIIPROTO_FLAG_EXT_USED) ||
203+ (wdata->state.flags & WIIPROTO_FLAG_MP_USED);
204+
205+ /* some 3rd-party balance-boards are hard-coded to KEE, *sigh* */
206+ if (wdata->state.devtype == WIIMOTE_DEV_BALANCE_BOARD) {
207+ if (ext)
208+ return WIIPROTO_REQ_DRM_KEE;
208209 else
210+ return WIIPROTO_REQ_DRM_K;
211+ }
212+
213+ if (ir == WIIPROTO_FLAG_IR_BASIC) {
214+ if (wdata->state.flags & WIIPROTO_FLAG_ACCEL) {
215+ if (ext)
216+ return WIIPROTO_REQ_DRM_KAIE;
217+ else
218+ return WIIPROTO_REQ_DRM_KAI;
219+ } else {
209220 return WIIPROTO_REQ_DRM_KIE;
221+ }
210222 } else if (ir == WIIPROTO_FLAG_IR_EXT) {
211223 return WIIPROTO_REQ_DRM_KAI;
212224 } else if (ir == WIIPROTO_FLAG_IR_FULL) {
@@ -219,7 +231,7 @@ static __u8 select_drm(struct wiimote_data *wdata) · 6 unmodified lines
219231 return WIIPROTO_REQ_DRM_KA;
220232 } else {
221233 if (ext)
222− return WIIPROTO_REQ_DRM_KE;
234+ return WIIPROTO_REQ_DRM_KEE;
223235 else
224236 return WIIPROTO_REQ_DRM_K;
225237 }
@@ -230,7 +242,9 @@ void wiiproto_req_drm(struct wiimote_data *wdata, __u8 drm) · 4 unmodified lines
230242 {
231243 __u8 cmd[3];
232244
233− if (drm == WIIPROTO_REQ_NULL)
245+ if (wdata->state.flags & WIIPROTO_FLAG_DRM_LOCKED)
246+ drm = wdata->state.drm;
247+ else if (drm == WIIPROTO_REQ_NULL)
234248 drm = select_drm(wdata);
235249
236250 cmd[0] = WIIPROTO_REQ_DRM;
@@ -242,7 +256,7 @@ void wiiproto_req_drm(struct wiimote_data *wdata, __u8 drm) · 5 unmodified lines
242256 wiimote_queue(wdata, cmd, sizeof(cmd));
243257 }
244258
245−static void wiiproto_req_status(struct wiimote_data *wdata)
259+void wiiproto_req_status(struct wiimote_data *wdata)
246260 {
247261 __u8 cmd[2];
248262
@@ -253,7 +267,7 @@ static void wiiproto_req_status(struct wiimote_data *wdata) · 4 unmodified lines
253267 wiimote_queue(wdata, cmd, sizeof(cmd));
254268 }
255269
256−static void wiiproto_req_accel(struct wiimote_data *wdata, __u8 accel)
270+void wiiproto_req_accel(struct wiimote_data *wdata, __u8 accel)
257271 {
258272 accel = !!accel;
259273 if (accel == !!(wdata->state.flags & WIIPROTO_FLAG_ACCEL))
@@ -267,7 +281,7 @@ static void wiiproto_req_accel(struct wiimote_data *wdata, __u8 accel) · 7 unmodified lines
267281 wiiproto_req_drm(wdata, WIIPROTO_REQ_NULL);
268282 }
269283
270−static void wiiproto_req_ir1(struct wiimote_data *wdata, __u8 flags)
284+void wiiproto_req_ir1(struct wiimote_data *wdata, __u8 flags)
271285 {
272286 __u8 cmd[2];
273287
@@ -278,7 +292,7 @@ static void wiiproto_req_ir1(struct wiimote_data *wdata, __u8 flags) · 4 unmodified lines
278292 wiimote_queue(wdata, cmd, sizeof(cmd));
279293 }
280294
281−static void wiiproto_req_ir2(struct wiimote_data *wdata, __u8 flags)
295+void wiiproto_req_ir2(struct wiimote_data *wdata, __u8 flags)
282296 {
283297 __u8 cmd[2];
284298
@@ -394,399 +408,998 @@ ssize_t wiimote_cmd_read(struct wiimote_data *wdata, __u32 offset, __u8 *rmem, · 109 unmodified lines
394408 return ret;
395409 }
396410
397−static int wiimote_battery_get_property(struct power_supply *psy,
398− enum power_supply_property psp,
399− union power_supply_propval *val)
411+/* requires the cmd-mutex to be held */
412+static int wiimote_cmd_init_ext(struct wiimote_data *wdata)
400413 {
401− struct wiimote_data *wdata = container_of(psy,
402− struct wiimote_data, battery);
403− int ret = 0, state;
404− unsigned long flags;
414+ __u8 wmem;
415+ int ret;
405416
406− if (psp == POWER_SUPPLY_PROP_SCOPE) {
407− val->intval = POWER_SUPPLY_SCOPE_DEVICE;
408− return 0;
409− }
417+ /* initialize extension */
418+ wmem = 0x55;
419+ ret = wiimote_cmd_write(wdata, 0xa400f0, &wmem, sizeof(wmem));
420+ if (ret)
421+ return ret;
410422
411− ret = wiimote_cmd_acquire(wdata);
423+ /* disable default encryption */
424+ wmem = 0x0;
425+ ret = wiimote_cmd_write(wdata, 0xa400fb, &wmem, sizeof(wmem));
412426 if (ret)
413427 return ret;
414428
415− spin_lock_irqsave(&wdata->state.lock, flags);
416− wiimote_cmd_set(wdata, WIIPROTO_REQ_SREQ, 0);
417− wiiproto_req_status(wdata);
418− spin_unlock_irqrestore(&wdata->state.lock, flags);
429+ return 0;
430+}
419431
420− ret = wiimote_cmd_wait(wdata);
421− state = wdata->state.cmd_battery;
422− wiimote_cmd_release(wdata);
432+/* requires the cmd-mutex to be held */
433+static __u8 wiimote_cmd_read_ext(struct wiimote_data *wdata, __u8 *rmem)
434+{
435+ int ret;
436+
437+ /* read extension ID */
438+ ret = wiimote_cmd_read(wdata, 0xa400fa, rmem, 6);
439+ if (ret != 6)
440+ return WIIMOTE_EXT_NONE;
441+
442+ hid_dbg(wdata->hdev, "extension ID: %02x:%02x %02x:%02x %02x:%02x\n",
443+ rmem[0], rmem[1], rmem[2], rmem[3], rmem[4], rmem[5]);
423444
445+ if (rmem[0] == 0xff && rmem[1] == 0xff && rmem[2] == 0xff &&
446+ rmem[3] == 0xff && rmem[4] == 0xff && rmem[5] == 0xff)
447+ return WIIMOTE_EXT_NONE;
448+
449+ if (rmem[4] == 0x00 && rmem[5] == 0x00)
450+ return WIIMOTE_EXT_NUNCHUK;
451+ if (rmem[4] == 0x01 && rmem[5] == 0x01)
452+ return WIIMOTE_EXT_CLASSIC_CONTROLLER;
453+ if (rmem[4] == 0x04 && rmem[5] == 0x02)
454+ return WIIMOTE_EXT_BALANCE_BOARD;
455+ if (rmem[4] == 0x01 && rmem[5] == 0x20)
456+ return WIIMOTE_EXT_PRO_CONTROLLER;
457+
458+ return WIIMOTE_EXT_UNKNOWN;
459+}
460+
461+/* requires the cmd-mutex to be held */
462+static int wiimote_cmd_init_mp(struct wiimote_data *wdata)
463+{
464+ __u8 wmem;
465+ int ret;
466+
467+ /* initialize MP */
468+ wmem = 0x55;
469+ ret = wiimote_cmd_write(wdata, 0xa600f0, &wmem, sizeof(wmem));
424470 if (ret)
425471 return ret;
426472
427− switch (psp) {
428− case POWER_SUPPLY_PROP_CAPACITY:
429− val->intval = state * 100 / 255;
430− break;
431− default:
432− ret = -EINVAL;
433− break;
473+ /* disable default encryption */
474+ wmem = 0x0;
475+ ret = wiimote_cmd_write(wdata, 0xa600fb, &wmem, sizeof(wmem));
476+ if (ret)
477+ return ret;
478+
479+ return 0;
480+}
481+
482+/* requires the cmd-mutex to be held */
483+static bool wiimote_cmd_map_mp(struct wiimote_data *wdata, __u8 exttype)
484+{
485+ __u8 wmem;
486+
487+ /* map MP with correct pass-through mode */
488+ switch (exttype) {
489+ case WIIMOTE_EXT_CLASSIC_CONTROLLER:
490+ wmem = 0x07;
491+ break;
492+ case WIIMOTE_EXT_NUNCHUK:
493+ wmem = 0x05;
494+ break;
495+ default:
496+ wmem = 0x04;
497+ break;
434498 }
435499
436− return ret;
500+ return wiimote_cmd_write(wdata, 0xa600fe, &wmem, sizeof(wmem));
437501 }
438502
439−static int wiimote_init_ir(struct wiimote_data *wdata, __u16 mode)
503+/* requires the cmd-mutex to be held */
504+static bool wiimote_cmd_read_mp(struct wiimote_data *wdata, __u8 *rmem)
440505 {
441506 int ret;
442− unsigned long flags;
443− __u8 format = 0;
444− static const __u8 data_enable[] = { 0x01 };
445− static const __u8 data_sens1[] = { 0x02, 0x00, 0x00, 0x71, 0x01,
446− 0x00, 0xaa, 0x00, 0x64 };
447− static const __u8 data_sens2[] = { 0x63, 0x03 };
448− static const __u8 data_fin[] = { 0x08 };
449507
450− spin_lock_irqsave(&wdata->state.lock, flags);
508+ /* read motion plus ID */
509+ ret = wiimote_cmd_read(wdata, 0xa600fa, rmem, 6);
510+ if (ret != 6)
511+ return false;
451512
452− if (mode == (wdata->state.flags & WIIPROTO_FLAGS_IR)) {
453− spin_unlock_irqrestore(&wdata->state.lock, flags);
454− return 0;
455− }
513+ hid_dbg(wdata->hdev, "motion plus ID: %02x:%02x %02x:%02x %02x:%02x\n",
514+ rmem[0], rmem[1], rmem[2], rmem[3], rmem[4], rmem[5]);
456515
457− if (mode == 0) {
458− wdata->state.flags &= ~WIIPROTO_FLAGS_IR;
459− wiiproto_req_ir1(wdata, 0);
460− wiiproto_req_ir2(wdata, 0);
461− wiiproto_req_drm(wdata, WIIPROTO_REQ_NULL);
462− spin_unlock_irqrestore(&wdata->state.lock, flags);
463− return 0;
464− }
516+ if (rmem[5] == 0x05)
517+ return true;
465518
466− spin_unlock_irqrestore(&wdata->state.lock, flags);
519+ hid_info(wdata->hdev, "unknown motion plus ID: %02x:%02x %02x:%02x %02x:%02x\n",
520+ rmem[0], rmem[1], rmem[2], rmem[3], rmem[4], rmem[5]);
467521
468− ret = wiimote_cmd_acquire(wdata);
469− if (ret)
470− return ret;
522+ return false;
523+}
471524
472− /* send PIXEL CLOCK ENABLE cmd first */
473− spin_lock_irqsave(&wdata->state.lock, flags);
474− wiimote_cmd_set(wdata, WIIPROTO_REQ_IR1, 0);
475− wiiproto_req_ir1(wdata, 0x06);
476− spin_unlock_irqrestore(&wdata->state.lock, flags);
525+/* requires the cmd-mutex to be held */
526+static __u8 wiimote_cmd_read_mp_mapped(struct wiimote_data *wdata)
527+{
528+ int ret;
529+ __u8 rmem[6];
477530
478− ret = wiimote_cmd_wait(wdata);
479− if (ret)
480− goto unlock;
481− if (wdata->state.cmd_err) {
482− ret = -EIO;
483− goto unlock;
531+ /* read motion plus ID */
532+ ret = wiimote_cmd_read(wdata, 0xa400fa, rmem, 6);
533+ if (ret != 6)
534+ return WIIMOTE_MP_NONE;
535+
536+ hid_dbg(wdata->hdev, "mapped motion plus ID: %02x:%02x %02x:%02x %02x:%02x\n",
537+ rmem[0], rmem[1], rmem[2], rmem[3], rmem[4], rmem[5]);
538+
539+ if (rmem[0] == 0xff && rmem[1] == 0xff && rmem[2] == 0xff &&
540+ rmem[3] == 0xff && rmem[4] == 0xff && rmem[5] == 0xff)
541+ return WIIMOTE_MP_NONE;
542+
543+ if (rmem[4] == 0x04 && rmem[5] == 0x05)
544+ return WIIMOTE_MP_SINGLE;
545+ else if (rmem[4] == 0x05 && rmem[5] == 0x05)
546+ return WIIMOTE_MP_PASSTHROUGH_NUNCHUK;
547+ else if (rmem[4] == 0x07 && rmem[5] == 0x05)
548+ return WIIMOTE_MP_PASSTHROUGH_CLASSIC;
549+
550+ return WIIMOTE_MP_UNKNOWN;
551+}
552+
553+/* device module handling */
554+
555+static const __u8 * const wiimote_devtype_mods[WIIMOTE_DEV_NUM] = {
556+ [WIIMOTE_DEV_PENDING] = (const __u8[]){
557+ WIIMOD_NULL,
558+ },
559+ [WIIMOTE_DEV_UNKNOWN] = (const __u8[]){
560+ WIIMOD_NO_MP,
561+ WIIMOD_NULL,
562+ },
563+ [WIIMOTE_DEV_GENERIC] = (const __u8[]){
564+ WIIMOD_KEYS,
565+ WIIMOD_RUMBLE,
566+ WIIMOD_BATTERY,
567+ WIIMOD_LED1,
568+ WIIMOD_LED2,
569+ WIIMOD_LED3,
570+ WIIMOD_LED4,
571+ WIIMOD_ACCEL,
572+ WIIMOD_IR,
573+ WIIMOD_NULL,
574+ },
575+ [WIIMOTE_DEV_GEN10] = (const __u8[]){
576+ WIIMOD_KEYS,
577+ WIIMOD_RUMBLE,
578+ WIIMOD_BATTERY,
579+ WIIMOD_LED1,
580+ WIIMOD_LED2,
581+ WIIMOD_LED3,
582+ WIIMOD_LED4,
583+ WIIMOD_ACCEL,
584+ WIIMOD_IR,
585+ WIIMOD_NULL,
586+ },
587+ [WIIMOTE_DEV_GEN20] = (const __u8[]){
588+ WIIMOD_KEYS,
589+ WIIMOD_RUMBLE,
590+ WIIMOD_BATTERY,
591+ WIIMOD_LED1,
592+ WIIMOD_LED2,
593+ WIIMOD_LED3,
594+ WIIMOD_LED4,
595+ WIIMOD_ACCEL,
596+ WIIMOD_IR,
597+ WIIMOD_BUILTIN_MP,
598+ WIIMOD_NULL,
599+ },
600+ [WIIMOTE_DEV_BALANCE_BOARD] = (const __u8[]) {
601+ WIIMOD_BATTERY,
602+ WIIMOD_LED1,
603+ WIIMOD_NO_MP,
604+ WIIMOD_NULL,
605+ },
606+ [WIIMOTE_DEV_PRO_CONTROLLER] = (const __u8[]) {
607+ WIIMOD_BATTERY,
608+ WIIMOD_LED1,
609+ WIIMOD_LED2,
610+ WIIMOD_LED3,
611+ WIIMOD_LED4,
612+ WIIMOD_NO_MP,
613+ WIIMOD_NULL,
614+ },
615+};
616+
617+static void wiimote_modules_load(struct wiimote_data *wdata,
618+ unsigned int devtype)
619+{
620+ bool need_input = false;
621+ const __u8 *mods, *iter;
622+ const struct wiimod_ops *ops;
623+ int ret;
624+
625+ mods = wiimote_devtype_mods[devtype];
626+
627+ for (iter = mods; *iter != WIIMOD_NULL; ++iter) {
628+ if (wiimod_table[*iter]->flags & WIIMOD_FLAG_INPUT) {
629+ need_input = true;
630+ break;
631+ }
484632 }
485633
486− /* enable IR LOGIC */
487− spin_lock_irqsave(&wdata->state.lock, flags);
488− wiimote_cmd_set(wdata, WIIPROTO_REQ_IR2, 0);
489− wiiproto_req_ir2(wdata, 0x06);
490− spin_unlock_irqrestore(&wdata->state.lock, flags);
634+ if (need_input) {
635+ wdata->input = input_allocate_device();
636+ if (!wdata->input)
637+ return;
638+
639+ input_set_drvdata(wdata->input, wdata);
640+ wdata->input->dev.parent = &wdata->hdev->dev;
641+ wdata->input->id.bustype = wdata->hdev->bus;
642+ wdata->input->id.vendor = wdata->hdev->vendor;
643+ wdata->input->id.product = wdata->hdev->product;
644+ wdata->input->id.version = wdata->hdev->version;
645+ wdata->input->name = WIIMOTE_NAME;
646+ }
491647
492− ret = wiimote_cmd_wait(wdata);
493− if (ret)
494− goto unlock;
495− if (wdata->state.cmd_err) {
496− ret = -EIO;
497− goto unlock;
648+ for (iter = mods; *iter != WIIMOD_NULL; ++iter) {
649+ ops = wiimod_table[*iter];
650+ if (!ops->probe)
651+ continue;
652+
653+ ret = ops->probe(ops, wdata);
654+ if (ret)
655+ goto error;
498656 }
499657
500− /* enable IR cam but do not make it send data, yet */
501− ret = wiimote_cmd_write(wdata, 0xb00030, data_enable,
502− sizeof(data_enable));
503− if (ret)
504− goto unlock;
658+ if (wdata->input) {
659+ ret = input_register_device(wdata->input);
660+ if (ret)
661+ goto error;
662+ }
505663
506− /* write first sensitivity block */
507− ret = wiimote_cmd_write(wdata, 0xb00000, data_sens1,
508− sizeof(data_sens1));
509− if (ret)
510− goto unlock;
664+ spin_lock_irq(&wdata->state.lock);
665+ wdata->state.devtype = devtype;
666+ spin_unlock_irq(&wdata->state.lock);
667+ return;
511668
512− /* write second sensitivity block */
513− ret = wiimote_cmd_write(wdata, 0xb0001a, data_sens2,
514− sizeof(data_sens2));
515− if (ret)
516− goto unlock;
669+error:
670+ for ( ; iter-- != mods; ) {
671+ ops = wiimod_table[*iter];
672+ if (ops->remove)
673+ ops->remove(ops, wdata);
674+ }
517675
518− /* put IR cam into desired state */
519− switch (mode) {
520− case WIIPROTO_FLAG_IR_FULL:
521− format = 5;
522− break;
523− case WIIPROTO_FLAG_IR_EXT:
524− format = 3;
525− break;
526− case WIIPROTO_FLAG_IR_BASIC:
527− format = 1;
528− break;
676+ if (wdata->input) {
677+ input_free_device(wdata->input);
678+ wdata->input = NULL;
529679 }
530− ret = wiimote_cmd_write(wdata, 0xb00033, &format, sizeof(format));
531− if (ret)
532− goto unlock;
680+}
533681
534− /* make IR cam send data */
535− ret = wiimote_cmd_write(wdata, 0xb00030, data_fin, sizeof(data_fin));
536− if (ret)
537− goto unlock;
682+static void wiimote_modules_unload(struct wiimote_data *wdata)
683+{
684+ const __u8 *mods, *iter;
685+ const struct wiimod_ops *ops;
686+ unsigned long flags;
687+
688+ mods = wiimote_devtype_mods[wdata->state.devtype];
538689
539− /* request new DRM mode compatible to IR mode */
540690 spin_lock_irqsave(&wdata->state.lock, flags);
541− wdata->state.flags &= ~WIIPROTO_FLAGS_IR;
542− wdata->state.flags |= mode & WIIPROTO_FLAGS_IR;
543− wiiproto_req_drm(wdata, WIIPROTO_REQ_NULL);
691+ wdata->state.devtype = WIIMOTE_DEV_UNKNOWN;
544692 spin_unlock_irqrestore(&wdata->state.lock, flags);
545693
546−unlock:
547− wiimote_cmd_release(wdata);
548− return ret;
694+ /* find end of list */
695+ for (iter = mods; *iter != WIIMOD_NULL; ++iter)
696+ /* empty */ ;
697+
698+ if (wdata->input) {
699+ input_get_device(wdata->input);
700+ input_unregister_device(wdata->input);
701+ }
702+
703+ for ( ; iter-- != mods; ) {
704+ ops = wiimod_table[*iter];
705+ if (ops->remove)
706+ ops->remove(ops, wdata);
707+ }
708+
709+ if (wdata->input) {
710+ input_put_device(wdata->input);
711+ wdata->input = NULL;
712+ }
549713 }
550714
551−static enum led_brightness wiimote_leds_get(struct led_classdev *led_dev)
715+/* device extension handling */
716+
717+static void wiimote_ext_load(struct wiimote_data *wdata, unsigned int ext)
552718 {
553− struct wiimote_data *wdata;
554− struct device *dev = led_dev->dev->parent;
555− int i;
556719 unsigned long flags;
557− bool value = false;
720+ const struct wiimod_ops *ops;
721+ int ret;
558722
559− wdata = hid_get_drvdata(container_of(dev, struct hid_device, dev));
723+ ops = wiimod_ext_table[ext];
560724
561− for (i = 0; i < 4; ++i) {
562− if (wdata->leds[i] == led_dev) {
563− spin_lock_irqsave(&wdata->state.lock, flags);
564− value = wdata->state.flags & WIIPROTO_FLAG_LED(i + 1);
565− spin_unlock_irqrestore(&wdata->state.lock, flags);
566− break;
567− }
725+ if (ops->probe) {
726+ ret = ops->probe(ops, wdata);
727+ if (ret)
728+ ext = WIIMOTE_EXT_UNKNOWN;
568729 }
569730
570− return value ? LED_FULL : LED_OFF;
731+ spin_lock_irqsave(&wdata->state.lock, flags);
732+ wdata->state.exttype = ext;
733+ spin_unlock_irqrestore(&wdata->state.lock, flags);
571734 }
572735
573−static void wiimote_leds_set(struct led_classdev *led_dev,
574− enum led_brightness value)
736+static void wiimote_ext_unload(struct wiimote_data *wdata)
575737 {
576− struct wiimote_data *wdata;
577− struct device *dev = led_dev->dev->parent;
578− int i;
579738 unsigned long flags;
580− __u8 state, flag;
739+ const struct wiimod_ops *ops;
581740
582− wdata = hid_get_drvdata(container_of(dev, struct hid_device, dev));
741+ ops = wiimod_ext_table[wdata->state.exttype];
583742
584− for (i = 0; i < 4; ++i) {
585− if (wdata->leds[i] == led_dev) {
586− flag = WIIPROTO_FLAG_LED(i + 1);
587− spin_lock_irqsave(&wdata->state.lock, flags);
588− state = wdata->state.flags;
589− if (value == LED_OFF)
590− wiiproto_req_leds(wdata, state & ~flag);
591− else
592− wiiproto_req_leds(wdata, state | flag);
593− spin_unlock_irqrestore(&wdata->state.lock, flags);
594− break;
595− }
743+ spin_lock_irqsave(&wdata->state.lock, flags);
744+ wdata->state.exttype = WIIMOTE_EXT_UNKNOWN;
745+ wdata->state.flags &= ~WIIPROTO_FLAG_EXT_USED;
746+ spin_unlock_irqrestore(&wdata->state.lock, flags);
747+
748+ if (ops->remove)
749+ ops->remove(ops, wdata);
750+}
751+
752+static void wiimote_mp_load(struct wiimote_data *wdata)
753+{
754+ unsigned long flags;
755+ const struct wiimod_ops *ops;
756+ int ret;
757+ __u8 mode = 2;
758+
759+ ops = &wiimod_mp;
760+ if (ops->probe) {
761+ ret = ops->probe(ops, wdata);
762+ if (ret)
763+ mode = 1;
596764 }
765+
766+ spin_lock_irqsave(&wdata->state.lock, flags);
767+ wdata->state.mp = mode;
768+ spin_unlock_irqrestore(&wdata->state.lock, flags);
597769 }
598770
599−static int wiimote_ff_play(struct input_dev *dev, void *data,
600− struct ff_effect *eff)
771+static void wiimote_mp_unload(struct wiimote_data *wdata)
601772 {
602− struct wiimote_data *wdata = input_get_drvdata(dev);
603− __u8 value;
604773 unsigned long flags;
774+ const struct wiimod_ops *ops;
605775
606− /*
607− * The wiimote supports only a single rumble motor so if any magnitude
608− * is set to non-zero then we start the rumble motor. If both are set to
609− * zero, we stop the rumble motor.
610− */
776+ if (wdata->state.mp < 2)
777+ return;
611778
612− if (eff->u.rumble.strong_magnitude || eff->u.rumble.weak_magnitude)
613− value = 1;
614− else
615− value = 0;
779+ ops = &wiimod_mp;
616780
617781 spin_lock_irqsave(&wdata->state.lock, flags);
618− wiiproto_req_rumble(wdata, value);
782+ wdata->state.mp = 0;
783+ wdata->state.flags &= ~WIIPROTO_FLAG_MP_USED;
619784 spin_unlock_irqrestore(&wdata->state.lock, flags);
620785
621− return 0;
786+ if (ops->remove)
787+ ops->remove(ops, wdata);
622788 }
623789
624−static int wiimote_input_open(struct input_dev *dev)
625−{
626− struct wiimote_data *wdata = input_get_drvdata(dev);
790+/* device (re-)initialization and detection */
627791
628− return hid_hw_open(wdata->hdev);
629−}
792+static const char *wiimote_devtype_names[WIIMOTE_DEV_NUM] = {
793+ [WIIMOTE_DEV_PENDING] = "Pending",
794+ [WIIMOTE_DEV_UNKNOWN] = "Unknown",
795+ [WIIMOTE_DEV_GENERIC] = "Generic",
796+ [WIIMOTE_DEV_GEN10] = "Nintendo Wii Remote (Gen 1)",
797+ [WIIMOTE_DEV_GEN20] = "Nintendo Wii Remote Plus (Gen 2)",
798+ [WIIMOTE_DEV_BALANCE_BOARD] = "Nintendo Wii Balance Board",
799+ [WIIMOTE_DEV_PRO_CONTROLLER] = "Nintendo Wii U Pro Controller",
800+};
630801
631−static void wiimote_input_close(struct input_dev *dev)
802+/* Try to guess the device type based on all collected information. We
803+ * first try to detect by static extension types, then VID/PID and the
804+ * device name. If we cannot detect the device, we use
805+ * WIIMOTE_DEV_GENERIC so all modules will get probed on the device. */
806+static void wiimote_init_set_type(struct wiimote_data *wdata,
807+ __u8 exttype)
632808 {
633− struct wiimote_data *wdata = input_get_drvdata(dev);
809+ __u8 devtype = WIIMOTE_DEV_GENERIC;
810+ __u16 vendor, product;
811+ const char *name;
812+
813+ vendor = wdata->hdev->vendor;
814+ product = wdata->hdev->product;
815+ name = wdata->hdev->name;
816+
817+ if (exttype == WIIMOTE_EXT_BALANCE_BOARD) {
818+ devtype = WIIMOTE_DEV_BALANCE_BOARD;
819+ goto done;
820+ } else if (exttype == WIIMOTE_EXT_PRO_CONTROLLER) {
821+ devtype = WIIMOTE_DEV_PRO_CONTROLLER;
822+ goto done;
823+ }
634824
635− hid_hw_close(wdata->hdev);
825+ if (!strcmp(name, "Nintendo RVL-CNT-01")) {
826+ devtype = WIIMOTE_DEV_GEN10;
827+ goto done;
828+ } else if (!strcmp(name, "Nintendo RVL-CNT-01-TR")) {
829+ devtype = WIIMOTE_DEV_GEN20;
830+ goto done;
831+ } else if (!strcmp(name, "Nintendo RVL-WBC-01")) {
832+ devtype = WIIMOTE_DEV_BALANCE_BOARD;
833+ goto done;
834+ } else if (!strcmp(name, "Nintendo RVL-CNT-01-UC")) {
835+ devtype = WIIMOTE_DEV_PRO_CONTROLLER;
836+ goto done;
837+ }
838+
839+ if (vendor == USB_VENDOR_ID_NINTENDO) {
840+ if (product == USB_DEVICE_ID_NINTENDO_WIIMOTE) {
841+ devtype = WIIMOTE_DEV_GEN10;
842+ goto done;
843+ } else if (product == USB_DEVICE_ID_NINTENDO_WIIMOTE2) {
844+ devtype = WIIMOTE_DEV_GEN20;
845+ goto done;
846+ }
847+ }
848+
849+done:
850+ if (devtype == WIIMOTE_DEV_GENERIC)
851+ hid_info(wdata->hdev, "cannot detect device; NAME: %s VID: %04x PID: %04x EXT: %04x\n",
852+ name, vendor, product, exttype);
853+ else
854+ hid_info(wdata->hdev, "detected device: %s\n",
855+ wiimote_devtype_names[devtype]);
856+
857+ wiimote_modules_load(wdata, devtype);
636858 }
637859
638−static int wiimote_accel_open(struct input_dev *dev)
860+static void wiimote_init_detect(struct wiimote_data *wdata)
639861 {
640− struct wiimote_data *wdata = input_get_drvdata(dev);
862+ __u8 exttype = WIIMOTE_EXT_NONE, extdata[6];
863+ bool ext;
641864 int ret;
642− unsigned long flags;
643865
644− ret = hid_hw_open(wdata->hdev);
866+ wiimote_cmd_acquire_noint(wdata);
867+
868+ spin_lock_irq(&wdata->state.lock);
869+ wdata->state.devtype = WIIMOTE_DEV_UNKNOWN;
870+ wiimote_cmd_set(wdata, WIIPROTO_REQ_SREQ, 0);
871+ wiiproto_req_status(wdata);
872+ spin_unlock_irq(&wdata->state.lock);
873+
874+ ret = wiimote_cmd_wait_noint(wdata);
645875 if (ret)
646− return ret;
876+ goto out_release;
647877
648− spin_lock_irqsave(&wdata->state.lock, flags);
649− wiiproto_req_accel(wdata, true);
650− spin_unlock_irqrestore(&wdata->state.lock, flags);
878+ spin_lock_irq(&wdata->state.lock);
879+ ext = wdata->state.flags & WIIPROTO_FLAG_EXT_PLUGGED;
880+ spin_unlock_irq(&wdata->state.lock);
651881
652− return 0;
882+ if (!ext)
883+ goto out_release;
884+
885+ wiimote_cmd_init_ext(wdata);
886+ exttype = wiimote_cmd_read_ext(wdata, extdata);
887+
888+out_release:
889+ wiimote_cmd_release(wdata);
890+ wiimote_init_set_type(wdata, exttype);
891+
892+ /* schedule MP timer */
893+ spin_lock_irq(&wdata->state.lock);
894+ if (!(wdata->state.flags & WIIPROTO_FLAG_BUILTIN_MP) &&
895+ !(wdata->state.flags & WIIPROTO_FLAG_NO_MP))
896+ mod_timer(&wdata->timer, jiffies + HZ * 4);
897+ spin_unlock_irq(&wdata->state.lock);
653898 }
654899
655−static void wiimote_accel_close(struct input_dev *dev)
900+/*
901+ * MP hotplug events are not generated by the wiimote. Therefore, we need
902+ * polling to detect it. We use a 4s interval for polling MP registers. This
903+ * seems reasonable considering applications can trigger it manually via
904+ * sysfs requests.
905+ */
906+static void wiimote_init_poll_mp(struct wiimote_data *wdata)
656907 {
657− struct wiimote_data *wdata = input_get_drvdata(dev);
658− unsigned long flags;
908+ bool mp;
909+ __u8 mpdata[6];
659910
660− spin_lock_irqsave(&wdata->state.lock, flags);
661− wiiproto_req_accel(wdata, false);
662− spin_unlock_irqrestore(&wdata->state.lock, flags);
911+ wiimote_cmd_acquire_noint(wdata);
912+ wiimote_cmd_init_mp(wdata);
913+ mp = wiimote_cmd_read_mp(wdata, mpdata);
914+ wiimote_cmd_release(wdata);
663915
664− hid_hw_close(wdata->hdev);
916+ /* load/unload MP module if it changed */
917+ if (mp) {
918+ if (!wdata->state.mp) {
919+ hid_info(wdata->hdev, "detected extension: Nintendo Wii Motion Plus\n");
920+ wiimote_mp_load(wdata);
921+ }
922+ } else if (wdata->state.mp) {
923+ wiimote_mp_unload(wdata);
924+ }
925+
926+ mod_timer(&wdata->timer, jiffies + HZ * 4);
665927 }
666928
667−static int wiimote_ir_open(struct input_dev *dev)
929+/*
930+ * Check whether the wiimote is in the expected state. The extension registers
931+ * may change during hotplug and initialization so we might get hotplug events
932+ * that we caused by remapping some memory.
933+ * We use some heuristics here to check known states. If the wiimote is in the
934+ * expected state, we can ignore the hotplug event.
935+ *
936+ * Returns "true" if the device is in expected state, "false" if we should
937+ * redo hotplug handling and extension initialization.
938+ */
939+static bool wiimote_init_check(struct wiimote_data *wdata)
668940 {
669− struct wiimote_data *wdata = input_get_drvdata(dev);
670− int ret;
941+ __u32 flags;
942+ __u8 type, data[6];
943+ bool ret, poll_mp;
671944
672− ret = hid_hw_open(wdata->hdev);
673− if (ret)
674− return ret;
945+ spin_lock_irq(&wdata->state.lock);
946+ flags = wdata->state.flags;
947+ spin_unlock_irq(&wdata->state.lock);
675948
676− ret = wiimote_init_ir(wdata, WIIPROTO_FLAG_IR_BASIC);
677− if (ret) {
678− hid_hw_close(wdata->hdev);
679− return ret;
949+ wiimote_cmd_acquire_noint(wdata);
950+
951+ /* If MP is used and active, but the extension is not, we expect:
952+ * read_mp_mapped() == WIIMOTE_MP_SINGLE
953+ * state.flags == !EXT_ACTIVE && !MP_PLUGGED && MP_ACTIVE
954+ * We do not check EXT_PLUGGED because it might change during
955+ * initialization of MP without extensions.
956+ * - If MP is unplugged/replugged, read_mp_mapped() fails
957+ * - If EXT is plugged, MP_PLUGGED will get set */
958+ if (wdata->state.exttype == WIIMOTE_EXT_NONE &&
959+ wdata->state.mp > 0 && (flags & WIIPROTO_FLAG_MP_USED)) {
960+ type = wiimote_cmd_read_mp_mapped(wdata);
961+ ret = type == WIIMOTE_MP_SINGLE;
962+
963+ spin_lock_irq(&wdata->state.lock);
964+ ret = ret && !(wdata->state.flags & WIIPROTO_FLAG_EXT_ACTIVE);
965+ ret = ret && !(wdata->state.flags & WIIPROTO_FLAG_MP_PLUGGED);
966+ ret = ret && (wdata->state.flags & WIIPROTO_FLAG_MP_ACTIVE);
967+ spin_unlock_irq(&wdata->state.lock);
968+
969+ if (!ret)
970+ hid_dbg(wdata->hdev, "state left: !EXT && MP\n");
971+
972+ /* while MP is mapped, we get EXT_PLUGGED events */
973+ poll_mp = false;
974+
975+ goto out_release;
680976 }
681977
682− return 0;
978+ /* If MP is unused, but the extension port is used, we expect:
979+ * read_ext == state.exttype
980+ * state.flags == !MP_ACTIVE && EXT_ACTIVE
981+ * - If MP is plugged/unplugged, our timer detects it
982+ * - If EXT is unplugged/replugged, EXT_ACTIVE will become unset */
983+ if (!(flags & WIIPROTO_FLAG_MP_USED) &&
984+ wdata->state.exttype != WIIMOTE_EXT_NONE) {
985+ type = wiimote_cmd_read_ext(wdata, data);
986+ ret = type == wdata->state.exttype;
987+
988+ spin_lock_irq(&wdata->state.lock);
989+ ret = ret && !(wdata->state.flags & WIIPROTO_FLAG_MP_ACTIVE);
990+ ret = ret && (wdata->state.flags & WIIPROTO_FLAG_EXT_ACTIVE);
991+ spin_unlock_irq(&wdata->state.lock);
992+
993+ if (!ret)
994+ hid_dbg(wdata->hdev, "state left: EXT && !MP\n");
995+
996+ /* poll MP for hotplug events */
997+ poll_mp = true;
998+
999+ goto out_release;
1000+ }
1001+
1002+ /* If neither MP nor an extension are used, we expect:
1003+ * read_ext() == WIIMOTE_EXT_NONE
1004+ * state.flags == !MP_ACTIVE && !EXT_ACTIVE && !EXT_PLUGGED
1005+ * No need to perform any action in this case as everything is
1006+ * disabled already.
1007+ * - If MP is plugged/unplugged, our timer detects it
1008+ * - If EXT is plugged, EXT_PLUGGED will be set */
1009+ if (!(flags & WIIPROTO_FLAG_MP_USED) &&
1010+ wdata->state.exttype == WIIMOTE_EXT_NONE) {
1011+ type = wiimote_cmd_read_ext(wdata, data);
1012+ ret = type == wdata->state.exttype;
1013+
1014+ spin_lock_irq(&wdata->state.lock);
1015+ ret = ret && !(wdata->state.flags & WIIPROTO_FLAG_EXT_ACTIVE);
1016+ ret = ret && !(wdata->state.flags & WIIPROTO_FLAG_MP_ACTIVE);
1017+ ret = ret && !(wdata->state.flags & WIIPROTO_FLAG_EXT_PLUGGED);
1018+ spin_unlock_irq(&wdata->state.lock);
1019+
1020+ if (!ret)
1021+ hid_dbg(wdata->hdev, "state left: !EXT && !MP\n");
1022+
1023+ /* poll MP for hotplug events */
1024+ poll_mp = true;
1025+
1026+ goto out_release;
1027+ }
1028+
1029+ /* The trickiest part is if both EXT and MP are active. We cannot read
1030+ * the EXT ID, anymore, because MP is mapped over it. However, we use
1031+ * a handy trick here:
1032+ * - EXT_ACTIVE is unset whenever !MP_PLUGGED is sent
1033+ * MP_PLUGGED might be re-sent again before we are scheduled, but
1034+ * EXT_ACTIVE will stay unset.
1035+ * So it is enough to check for mp_mapped() and MP_ACTIVE and
1036+ * EXT_ACTIVE. EXT_PLUGGED is a sanity check. */
1037+ if (wdata->state.exttype != WIIMOTE_EXT_NONE &&
1038+ wdata->state.mp > 0 && (flags & WIIPROTO_FLAG_MP_USED)) {
1039+ type = wiimote_cmd_read_mp_mapped(wdata);
1040+ ret = type != WIIMOTE_MP_NONE;
1041+ ret = ret && type != WIIMOTE_MP_UNKNOWN;
1042+ ret = ret && type != WIIMOTE_MP_SINGLE;
1043+
1044+ spin_lock_irq(&wdata->state.lock);
1045+ ret = ret && (wdata->state.flags & WIIPROTO_FLAG_EXT_PLUGGED);
1046+ ret = ret && (wdata->state.flags & WIIPROTO_FLAG_EXT_ACTIVE);
1047+ ret = ret && (wdata->state.flags & WIIPROTO_FLAG_MP_ACTIVE);
1048+ spin_unlock_irq(&wdata->state.lock);
1049+
1050+ if (!ret)
1051+ hid_dbg(wdata->hdev, "state left: EXT && MP\n");
1052+
1053+ /* while MP is mapped, we get EXT_PLUGGED events */
1054+ poll_mp = false;
1055+
1056+ goto out_release;
1057+ }
1058+
1059+ /* unknown state */
1060+ ret = false;
1061+
1062+out_release:
1063+ wiimote_cmd_release(wdata);
1064+
1065+ /* only poll for MP if requested and if state didn't change */
1066+ if (ret && poll_mp && !(flags & WIIPROTO_FLAG_BUILTIN_MP) &&
1067+ !(flags & WIIPROTO_FLAG_NO_MP))
1068+ wiimote_init_poll_mp(wdata);
1069+
1070+ return ret;
6831071 }
6841072
685−static void wiimote_ir_close(struct input_dev *dev)
1073+static const char *wiimote_exttype_names[WIIMOTE_EXT_NUM] = {
1074+ [WIIMOTE_EXT_NONE] = "None",
1075+ [WIIMOTE_EXT_UNKNOWN] = "Unknown",
1076+ [WIIMOTE_EXT_NUNCHUK] = "Nintendo Wii Nunchuk",
1077+ [WIIMOTE_EXT_CLASSIC_CONTROLLER] = "Nintendo Wii Classic Controller",
1078+ [WIIMOTE_EXT_BALANCE_BOARD] = "Nintendo Wii Balance Board",
1079+ [WIIMOTE_EXT_PRO_CONTROLLER] = "Nintendo Wii U Pro Controller",
1080+};
1081+
1082+/*
1083+ * Handle hotplug events
1084+ * If we receive an hotplug event and the device-check failed, we deinitialize
1085+ * the extension ports, re-read all extension IDs and set the device into
1086+ * the desired state. This involves mapping MP into the main extension
1087+ * registers, setting up extension passthrough modes and initializing the
1088+ * requested extensions.
1089+ */
1090+static void wiimote_init_hotplug(struct wiimote_data *wdata)
6861091 {
687− struct wiimote_data *wdata = input_get_drvdata(dev);
1092+ __u8 exttype, extdata[6], mpdata[6];
1093+ __u32 flags;
1094+ bool mp;
6881095
689− wiimote_init_ir(wdata, 0);
690− hid_hw_close(wdata->hdev);
1096+ hid_dbg(wdata->hdev, "detect extensions..\n");
1097+
1098+ wiimote_cmd_acquire_noint(wdata);
1099+
1100+ spin_lock_irq(&wdata->state.lock);
1101+
1102+ /* get state snapshot that we will then work on */
1103+ flags = wdata->state.flags;
1104+
1105+ /* disable event forwarding temporarily */
1106+ wdata->state.flags &= ~WIIPROTO_FLAG_EXT_ACTIVE;
1107+ wdata->state.flags &= ~WIIPROTO_FLAG_MP_ACTIVE;
1108+
1109+ spin_unlock_irq(&wdata->state.lock);
1110+
1111+ /* init extension and MP (deactivates current extension or MP) */
1112+ wiimote_cmd_init_ext(wdata);
1113+ if (flags & WIIPROTO_FLAG_NO_MP) {
1114+ mp = false;
1115+ } else {
1116+ wiimote_cmd_init_mp(wdata);
1117+ mp = wiimote_cmd_read_mp(wdata, mpdata);
1118+ }
1119+ exttype = wiimote_cmd_read_ext(wdata, extdata);
1120+
1121+ wiimote_cmd_release(wdata);
1122+
1123+ /* load/unload extension module if it changed */
1124+ if (exttype != wdata->state.exttype) {
1125+ /* unload previous extension */
1126+ wiimote_ext_unload(wdata);
1127+
1128+ if (exttype == WIIMOTE_EXT_UNKNOWN) {
1129+ hid_info(wdata->hdev, "cannot detect extension; %02x:%02x %02x:%02x %02x:%02x\n",
1130+ extdata[0], extdata[1], extdata[2],
1131+ extdata[3], extdata[4], extdata[5]);
1132+ } else if (exttype == WIIMOTE_EXT_NONE) {
1133+ spin_lock_irq(&wdata->state.lock);
1134+ wdata->state.exttype = WIIMOTE_EXT_NONE;
1135+ spin_unlock_irq(&wdata->state.lock);
1136+ } else {
1137+ hid_info(wdata->hdev, "detected extension: %s\n",
1138+ wiimote_exttype_names[exttype]);
1139+ /* try loading new extension */
1140+ wiimote_ext_load(wdata, exttype);
1141+ }
1142+ }
1143+
1144+ /* load/unload MP module if it changed */
1145+ if (mp) {
1146+ if (!wdata->state.mp) {
1147+ hid_info(wdata->hdev, "detected extension: Nintendo Wii Motion Plus\n");
1148+ wiimote_mp_load(wdata);
1149+ }
1150+ } else if (wdata->state.mp) {
1151+ wiimote_mp_unload(wdata);
1152+ }
1153+
1154+ /* if MP is not used, do not map or activate it */
1155+ if (!(flags & WIIPROTO_FLAG_MP_USED))
1156+ mp = false;
1157+
1158+ /* map MP into main extension registers if used */
1159+ if (mp) {
1160+ wiimote_cmd_acquire_noint(wdata);
1161+ wiimote_cmd_map_mp(wdata, exttype);
1162+ wiimote_cmd_release(wdata);
1163+
1164+ /* delete MP hotplug timer */
1165+ del_timer_sync(&wdata->timer);
1166+ } else {
1167+ /* reschedule MP hotplug timer */
1168+ if (!(flags & WIIPROTO_FLAG_BUILTIN_MP) &&
1169+ !(flags & WIIPROTO_FLAG_NO_MP))
1170+ mod_timer(&wdata->timer, jiffies + HZ * 4);
1171+ }
1172+
1173+ spin_lock_irq(&wdata->state.lock);
1174+
1175+ /* enable data forwarding again and set expected hotplug state */
1176+ if (mp) {
1177+ wdata->state.flags |= WIIPROTO_FLAG_MP_ACTIVE;
1178+ if (wdata->state.exttype == WIIMOTE_EXT_NONE) {
1179+ wdata->state.flags &= ~WIIPROTO_FLAG_EXT_PLUGGED;
1180+ wdata->state.flags &= ~WIIPROTO_FLAG_MP_PLUGGED;
1181+ } else {
1182+ wdata->state.flags &= ~WIIPROTO_FLAG_EXT_PLUGGED;
1183+ wdata->state.flags |= WIIPROTO_FLAG_MP_PLUGGED;
1184+ wdata->state.flags |= WIIPROTO_FLAG_EXT_ACTIVE;
1185+ }
1186+ } else if (wdata->state.exttype != WIIMOTE_EXT_NONE) {
1187+ wdata->state.flags |= WIIPROTO_FLAG_EXT_ACTIVE;
1188+ }
1189+
1190+ /* request status report for hotplug state updates */
1191+ wiiproto_req_status(wdata);
1192+
1193+ spin_unlock_irq(&wdata->state.lock);
1194+
1195+ hid_dbg(wdata->hdev, "detected extensions: MP: %d EXT: %d\n",
1196+ wdata->state.mp, wdata->state.exttype);
6911197 }
6921198
693−static void handler_keys(struct wiimote_data *wdata, const __u8 *payload)
1199+static void wiimote_init_worker(struct work_struct *work)
1200+{
1201+ struct wiimote_data *wdata = container_of(work, struct wiimote_data,
1202+ init_worker);
1203+ bool changed = false;
1204+
1205+ if (wdata->state.devtype == WIIMOTE_DEV_PENDING) {
1206+ wiimote_init_detect(wdata);
1207+ changed = true;
1208+ }
1209+
1210+ if (changed || !wiimote_init_check(wdata))
1211+ wiimote_init_hotplug(wdata);
1212+
1213+ if (changed)
1214+ kobject_uevent(&wdata->hdev->dev.kobj, KOBJ_CHANGE);
1215+}
1216+
1217+void __wiimote_schedule(struct wiimote_data *wdata)
6941218 {
695− input_report_key(wdata->input, wiiproto_keymap[WIIPROTO_KEY_LEFT],
696− !!(payload[0] & 0x01));
697− input_report_key(wdata->input, wiiproto_keymap[WIIPROTO_KEY_RIGHT],
698− !!(payload[0] & 0x02));
699− input_report_key(wdata->input, wiiproto_keymap[WIIPROTO_KEY_DOWN],
700− !!(payload[0] & 0x04));
701− input_report_key(wdata->input, wiiproto_keymap[WIIPROTO_KEY_UP],
702− !!(payload[0] & 0x08));
703− input_report_key(wdata->input, wiiproto_keymap[WIIPROTO_KEY_PLUS],
704− !!(payload[0] & 0x10));
705− input_report_key(wdata->input, wiiproto_keymap[WIIPROTO_KEY_TWO],
706− !!(payload[1] & 0x01));
707− input_report_key(wdata->input, wiiproto_keymap[WIIPROTO_KEY_ONE],
708− !!(payload[1] & 0x02));
709− input_report_key(wdata->input, wiiproto_keymap[WIIPROTO_KEY_B],
710− !!(payload[1] & 0x04));
711− input_report_key(wdata->input, wiiproto_keymap[WIIPROTO_KEY_A],
712− !!(payload[1] & 0x08));
713− input_report_key(wdata->input, wiiproto_keymap[WIIPROTO_KEY_MINUS],
714− !!(payload[1] & 0x10));
715− input_report_key(wdata->input, wiiproto_keymap[WIIPROTO_KEY_HOME],
716− !!(payload[1] & 0x80));
717− input_sync(wdata->input);
1219+ if (!(wdata->state.flags & WIIPROTO_FLAG_EXITING))
1220+ schedule_work(&wdata->init_worker);
7181221 }
7191222
720−static void handler_accel(struct wiimote_data *wdata, const __u8 *payload)
1223+static void wiimote_schedule(struct wiimote_data *wdata)
7211224 {
722− __u16 x, y, z;
1225+ unsigned long flags;
7231226
724− if (!(wdata->state.flags & WIIPROTO_FLAG_ACCEL))
725− return;
1227+ spin_lock_irqsave(&wdata->state.lock, flags);
1228+ __wiimote_schedule(wdata);
1229+ spin_unlock_irqrestore(&wdata->state.lock, flags);
1230+}
7261231
727− /*
728− * payload is: BB BB XX YY ZZ
729− * Accelerometer data is encoded into 3 10bit values. XX, YY and ZZ
730− * contain the upper 8 bits of each value. The lower 2 bits are
731− * contained in the buttons data BB BB.
732− * Bits 6 and 7 of the first buttons byte BB is the lower 2 bits of the
733− * X accel value. Bit 5 of the second buttons byte is the 2nd bit of Y
734− * accel value and bit 6 is the second bit of the Z value.
735− * The first bit of Y and Z values is not available and always set to 0.
736− * 0x200 is returned on no movement.
737− */
1232+static void wiimote_init_timeout(unsigned long arg)
1233+{
1234+ struct wiimote_data *wdata = (void*)arg;
7381235
739− x = payload[2] << 2;
740− y = payload[3] << 2;
741− z = payload[4] << 2;
1236+ wiimote_schedule(wdata);
1237+}
1238+
1239+/* protocol handlers */
1240+
1241+static void handler_keys(struct wiimote_data *wdata, const __u8 *payload)
1242+{
1243+ const __u8 *iter, *mods;
1244+ const struct wiimod_ops *ops;
7421245
743− x |= (payload[0] >> 5) & 0x3;
744− y |= (payload[1] >> 4) & 0x2;
745− z |= (payload[1] >> 5) & 0x2;
1246+ ops = wiimod_ext_table[wdata->state.exttype];
1247+ if (ops->in_keys) {
1248+ ops->in_keys(wdata, payload);
1249+ return;
1250+ }
7461251
747− input_report_abs(wdata->accel, ABS_RX, x - 0x200);
748− input_report_abs(wdata->accel, ABS_RY, y - 0x200);
749− input_report_abs(wdata->accel, ABS_RZ, z - 0x200);
750− input_sync(wdata->accel);
1252+ mods = wiimote_devtype_mods[wdata->state.devtype];
1253+ for (iter = mods; *iter != WIIMOD_NULL; ++iter) {
1254+ ops = wiimod_table[*iter];
1255+ if (ops->in_keys) {
1256+ ops->in_keys(wdata, payload);
1257+ break;
1258+ }
1259+ }
7511260 }
7521261
753−#define ir_to_input0(wdata, ir, packed) __ir_to_input((wdata), (ir), (packed), \
754− ABS_HAT0X, ABS_HAT0Y)
755−#define ir_to_input1(wdata, ir, packed) __ir_to_input((wdata), (ir), (packed), \
756− ABS_HAT1X, ABS_HAT1Y)
757−#define ir_to_input2(wdata, ir, packed) __ir_to_input((wdata), (ir), (packed), \
758− ABS_HAT2X, ABS_HAT2Y)
759−#define ir_to_input3(wdata, ir, packed) __ir_to_input((wdata), (ir), (packed), \
760− ABS_HAT3X, ABS_HAT3Y)
1262+static void handler_accel(struct wiimote_data *wdata, const __u8 *payload)
1263+{
1264+ const __u8 *iter, *mods;
1265+ const struct wiimod_ops *ops;
1266+
1267+ ops = wiimod_ext_table[wdata->state.exttype];
1268+ if (ops->in_accel) {
1269+ ops->in_accel(wdata, payload);
1270+ return;
1271+ }
7611272
762−static void __ir_to_input(struct wiimote_data *wdata, const __u8 *ir,
763− bool packed, __u8 xid, __u8 yid)
1273+ mods = wiimote_devtype_mods[wdata->state.devtype];
1274+ for (iter = mods; *iter != WIIMOD_NULL; ++iter) {
1275+ ops = wiimod_table[*iter];
1276+ if (ops->in_accel) {
1277+ ops->in_accel(wdata, payload);
1278+ break;
1279+ }
1280+ }
1281+}
1282+
1283+static bool valid_ext_handler(const struct wiimod_ops *ops, size_t len)
7641284 {
765− __u16 x, y;
1285+ if (!ops->in_ext)
1286+ return false;
1287+ if ((ops->flags & WIIMOD_FLAG_EXT8) && len < 8)
1288+ return false;
1289+ if ((ops->flags & WIIMOD_FLAG_EXT16) && len < 16)
1290+ return false;
1291+
1292+ return true;
1293+}
7661294
767− if (!(wdata->state.flags & WIIPROTO_FLAGS_IR))
1295+static void handler_ext(struct wiimote_data *wdata, const __u8 *payload,
1296+ size_t len)
1297+{
1298+ static const __u8 invalid[21] = { 0xff, 0xff, 0xff, 0xff,
1299+ 0xff, 0xff, 0xff, 0xff,
1300+ 0xff, 0xff, 0xff, 0xff,
1301+ 0xff, 0xff, 0xff, 0xff,
1302+ 0xff, 0xff, 0xff, 0xff,
1303+ 0xff };
1304+ const __u8 *iter, *mods;
1305+ const struct wiimod_ops *ops;
1306+ bool is_mp;
1307+
1308+ if (len > 21)
1309+ len = 21;
1310+ if (len < 6 || !memcmp(payload, invalid, len))
7681311 return;
7691312
770− /*
771− * Basic IR data is encoded into 3 bytes. The first two bytes are the
772− * lower 8 bit of the X/Y data, the 3rd byte contains the upper 2 bits
773− * of both.
774− * If data is packed, then the 3rd byte is put first and slightly
775− * reordered. This allows to interleave packed and non-packed data to
776− * have two IR sets in 5 bytes instead of 6.
777− * The resulting 10bit X/Y values are passed to the ABS_HATXY input dev.
778− */
1313+ /* if MP is active, track MP slot hotplugging */
1314+ if (wdata->state.flags & WIIPROTO_FLAG_MP_ACTIVE) {
1315+ /* this bit is set for invalid events (eg. during hotplug) */
1316+ if (payload[5] & 0x01)
1317+ return;
1318+
1319+ if (payload[4] & 0x01) {
1320+ if (!(wdata->state.flags & WIIPROTO_FLAG_MP_PLUGGED)) {
1321+ hid_dbg(wdata->hdev, "MP hotplug: 1\n");
1322+ wdata->state.flags |= WIIPROTO_FLAG_MP_PLUGGED;
1323+ __wiimote_schedule(wdata);
1324+ }
1325+ } else {
1326+ if (wdata->state.flags & WIIPROTO_FLAG_MP_PLUGGED) {
1327+ hid_dbg(wdata->hdev, "MP hotplug: 0\n");
1328+ wdata->state.flags &= ~WIIPROTO_FLAG_MP_PLUGGED;
1329+ wdata->state.flags &= ~WIIPROTO_FLAG_EXT_ACTIVE;
1330+ __wiimote_schedule(wdata);
1331+ }
1332+ }
7791333
780− if (packed) {
781− x = ir[1] | ((ir[0] & 0x03) << 8);
782− y = ir[2] | ((ir[0] & 0x0c) << 6);
1334+ /* detect MP data that is sent interleaved with EXT data */
1335+ is_mp = payload[5] & 0x02;
7831336 } else {
784− x = ir[0] | ((ir[2] & 0x30) << 4);
785− y = ir[1] | ((ir[2] & 0xc0) << 2);
1337+ is_mp = false;
1338+ }
1339+
1340+ /* ignore EXT events if no extension is active */
1341+ if (!(wdata->state.flags & WIIPROTO_FLAG_EXT_ACTIVE) && !is_mp)
1342+ return;
1343+
1344+ /* try forwarding to extension handler, first */
1345+ ops = wiimod_ext_table[wdata->state.exttype];
1346+ if (is_mp && ops->in_mp) {
1347+ ops->in_mp(wdata, payload);
1348+ return;
1349+ } else if (!is_mp && valid_ext_handler(ops, len)) {
1350+ ops->in_ext(wdata, payload);
1351+ return;
1352+ }
1353+
1354+ /* try forwarding to MP handler */
1355+ ops = &wiimod_mp;
1356+ if (is_mp && ops->in_mp) {
1357+ ops->in_mp(wdata, payload);
1358+ return;
1359+ } else if (!is_mp && valid_ext_handler(ops, len)) {
1360+ ops->in_ext(wdata, payload);
1361+ return;
7861362 }
7871363
788− input_report_abs(wdata->ir, xid, x);
789− input_report_abs(wdata->ir, yid, y);
1364+ /* try forwarding to loaded modules */
1365+ mods = wiimote_devtype_mods[wdata->state.devtype];
1366+ for (iter = mods; *iter != WIIMOD_NULL; ++iter) {
1367+ ops = wiimod_table[*iter];
1368+ if (is_mp && ops->in_mp) {
1369+ ops->in_mp(wdata, payload);
1370+ return;
1371+ } else if (!is_mp && valid_ext_handler(ops, len)) {
1372+ ops->in_ext(wdata, payload);
1373+ return;
1374+ }
1375+ }
1376+}
1377+
1378+#define ir_to_input0(wdata, ir, packed) handler_ir((wdata), (ir), (packed), 0)
1379+#define ir_to_input1(wdata, ir, packed) handler_ir((wdata), (ir), (packed), 1)
1380+#define ir_to_input2(wdata, ir, packed) handler_ir((wdata), (ir), (packed), 2)
1381+#define ir_to_input3(wdata, ir, packed) handler_ir((wdata), (ir), (packed), 3)
1382+
1383+static void handler_ir(struct wiimote_data *wdata, const __u8 *payload,
1384+ bool packed, unsigned int id)
1385+{
1386+ const __u8 *iter, *mods;
1387+ const struct wiimod_ops *ops;
1388+
1389+ ops = wiimod_ext_table[wdata->state.exttype];
1390+ if (ops->in_ir) {
1391+ ops->in_ir(wdata, payload, packed, id);
1392+ return;
1393+ }
1394+
1395+ mods = wiimote_devtype_mods[wdata->state.devtype];
1396+ for (iter = mods; *iter != WIIMOD_NULL; ++iter) {
1397+ ops = wiimod_table[*iter];
1398+ if (ops->in_ir) {
1399+ ops->in_ir(wdata, payload, packed, id);
1400+ break;
1401+ }
1402+ }
7901403 }
7911404
7921405 /* reduced status report with "BB BB" key data only */
@@ -804,12 +1417,27 @@ static void handler_status(struct wiimote_data *wdata, const __u8 *payload) · 11 unmodified lines
8041417 {
8051418 handler_status_K(wdata, payload);
8061419
807− wiiext_event(wdata, payload[2] & 0x02);
1420+ /* update extension status */
1421+ if (payload[2] & 0x02) {
1422+ if (!(wdata->state.flags & WIIPROTO_FLAG_EXT_PLUGGED)) {
1423+ hid_dbg(wdata->hdev, "EXT hotplug: 1\n");
1424+ wdata->state.flags |= WIIPROTO_FLAG_EXT_PLUGGED;
1425+ __wiimote_schedule(wdata);
1426+ }
1427+ } else {
1428+ if (wdata->state.flags & WIIPROTO_FLAG_EXT_PLUGGED) {
1429+ hid_dbg(wdata->hdev, "EXT hotplug: 0\n");
1430+ wdata->state.flags &= ~WIIPROTO_FLAG_EXT_PLUGGED;
1431+ wdata->state.flags &= ~WIIPROTO_FLAG_MP_PLUGGED;
1432+ wdata->state.flags &= ~WIIPROTO_FLAG_EXT_ACTIVE;
1433+ wdata->state.flags &= ~WIIPROTO_FLAG_MP_ACTIVE;
1434+ __wiimote_schedule(wdata);
1435+ }
1436+ }
8081437
809− if (wiimote_cmd_pending(wdata, WIIPROTO_REQ_SREQ, 0)) {
810− wdata->state.cmd_battery = payload[5];
1438+ wdata->state.cmd_battery = payload[5];
1439+ if (wiimote_cmd_pending(wdata, WIIPROTO_REQ_SREQ, 0))
8111440 wiimote_cmd_complete(wdata);
812− }
8131441 }
8141442
8151443 /* reduced generic report with "BB BB" key data only */
@@ -864,7 +1492,7 @@ static void handler_drm_KA(struct wiimote_data *wdata, const __u8 *payload) · 48 unmodified lines
8641492 static void handler_drm_KE(struct wiimote_data *wdata, const __u8 *payload)
8651493 {
8661494 handler_keys(wdata, payload);
867− wiiext_handle(wdata, &payload[2]);
1495+ handler_ext(wdata, &payload[2], 8);
8681496 }
8691497
8701498 static void handler_drm_KAI(struct wiimote_data *wdata, const __u8 *payload)
@@ -875,13 +1503,12 @@ static void handler_drm_KAI(struct wiimote_data *wdata, const __u8 *payload) · 4 unmodified lines
8751503 ir_to_input1(wdata, &payload[8], false);
8761504 ir_to_input2(wdata, &payload[11], false);
8771505 ir_to_input3(wdata, &payload[14], false);
878− input_sync(wdata->ir);
8791506 }
8801507
8811508 static void handler_drm_KEE(struct wiimote_data *wdata, const __u8 *payload)
8821509 {
8831510 handler_keys(wdata, payload);
884− wiiext_handle(wdata, &payload[2]);
1511+ handler_ext(wdata, &payload[2], 19);
8851512 }
8861513
8871514 static void handler_drm_KIE(struct wiimote_data *wdata, const __u8 *payload)
@@ -891,15 +1518,14 @@ static void handler_drm_KIE(struct wiimote_data *wdata, const __u8 *payload) · 3 unmodified lines
8911518 ir_to_input1(wdata, &payload[4], true);
8921519 ir_to_input2(wdata, &payload[7], false);
8931520 ir_to_input3(wdata, &payload[9], true);
894− input_sync(wdata->ir);
895− wiiext_handle(wdata, &payload[12]);
1521+ handler_ext(wdata, &payload[12], 9);
8961522 }
8971523
8981524 static void handler_drm_KAE(struct wiimote_data *wdata, const __u8 *payload)
8991525 {
9001526 handler_keys(wdata, payload);
9011527 handler_accel(wdata, payload);
902− wiiext_handle(wdata, &payload[5]);
1528+ handler_ext(wdata, &payload[5], 16);
9031529 }
9041530
9051531 static void handler_drm_KAIE(struct wiimote_data *wdata, const __u8 *payload)
@@ -910,13 +1536,12 @@ static void handler_drm_KAIE(struct wiimote_data *wdata, const __u8 *payload) · 4 unmodified lines
9101536 ir_to_input1(wdata, &payload[7], true);
9111537 ir_to_input2(wdata, &payload[10], false);
9121538 ir_to_input3(wdata, &payload[12], true);
913− input_sync(wdata->ir);
914− wiiext_handle(wdata, &payload[15]);
1539+ handler_ext(wdata, &payload[15], 6);
9151540 }
9161541
9171542 static void handler_drm_E(struct wiimote_data *wdata, const __u8 *payload)
9181543 {
919− wiiext_handle(wdata, payload);
1544+ handler_ext(wdata, payload, 21);
9201545 }
9211546
9221547 static void handler_drm_SKAI1(struct wiimote_data *wdata, const __u8 *payload)
@@ -929,7 +1554,6 @@ static void handler_drm_SKAI1(struct wiimote_data *wdata, const __u8 *payload) · 6 unmodified lines
9291554
9301555 ir_to_input0(wdata, &payload[3], false);
9311556 ir_to_input1(wdata, &payload[12], false);
932− input_sync(wdata->ir);
9331557 }
9341558
9351559 static void handler_drm_SKAI2(struct wiimote_data *wdata, const __u8 *payload)
@@ -950,7 +1574,6 @@ static void handler_drm_SKAI2(struct wiimote_data *wdata, const __u8 *payload) · 14 unmodified lines
9501574
9511575 ir_to_input2(wdata, &payload[3], false);
9521576 ir_to_input3(wdata, &payload[12], false);
953− input_sync(wdata->ir);
9541577 }
9551578
9561579 struct wiiproto_handler {
@@ -1017,177 +1640,136 @@ static int wiimote_hid_event(struct hid_device *hdev, struct hid_report *report, · 60 unmodified lines
10171640 return 0;
10181641 }
10191642
1020−static void wiimote_leds_destroy(struct wiimote_data *wdata)
1643+static ssize_t wiimote_ext_show(struct device *dev,
1644+ struct device_attribute *attr,
1645+ char *buf)
10211646 {
1022− int i;
1023− struct led_classdev *led;
1024−
1025− for (i = 0; i < 4; ++i) {
1026− if (wdata->leds[i]) {
1027− led = wdata->leds[i];
1028− wdata->leds[i] = NULL;
1029− led_classdev_unregister(led);
1030− kfree(led);
1031− }
1647+ struct wiimote_data *wdata = dev_to_wii(dev);
1648+ __u8 type;
1649+ unsigned long flags;
1650+
1651+ spin_lock_irqsave(&wdata->state.lock, flags);
1652+ type = wdata->state.exttype;
1653+ spin_unlock_irqrestore(&wdata->state.lock, flags);
1654+
1655+ switch (type) {
1656+ case WIIMOTE_EXT_NONE:
1657+ return sprintf(buf, "none\n");
1658+ case WIIMOTE_EXT_NUNCHUK:
1659+ return sprintf(buf, "nunchuk\n");
1660+ case WIIMOTE_EXT_CLASSIC_CONTROLLER:
1661+ return sprintf(buf, "classic\n");
1662+ case WIIMOTE_EXT_BALANCE_BOARD:
1663+ return sprintf(buf, "balanceboard\n");
1664+ case WIIMOTE_EXT_PRO_CONTROLLER:
1665+ return sprintf(buf, "procontroller\n");
1666+ case WIIMOTE_EXT_UNKNOWN:
1667+ /* fallthrough */
1668+ default:
1669+ return sprintf(buf, "unknown\n");
10321670 }
10331671 }
10341672
1035−static int wiimote_leds_create(struct wiimote_data *wdata)
1673+static ssize_t wiimote_ext_store(struct device *dev,
1674+ struct device_attribute *attr,
1675+ const char *buf, size_t count)
10361676 {
1037− int i, ret;
1038− struct device *dev = &wdata->hdev->dev;
1039− size_t namesz = strlen(dev_name(dev)) + 9;
1040− struct led_classdev *led;
1041− char *name;
1677+ struct wiimote_data *wdata = dev_to_wii(dev);
10421678
1043− for (i = 0; i < 4; ++i) {
1044− led = kzalloc(sizeof(struct led_classdev) + namesz, GFP_KERNEL);
1045− if (!led) {
1046− ret = -ENOMEM;
1047− goto err;
1048− }
1049− name = (void*)&led[1];
1050− snprintf(name, namesz, "%s:blue:p%d", dev_name(dev), i);
1051− led->name = name;
1052− led->brightness = 0;
1053− led->max_brightness = 1;
1054− led->brightness_get = wiimote_leds_get;
1055− led->brightness_set = wiimote_leds_set;
1056−
1057− ret = led_classdev_register(dev, led);
1058− if (ret) {
1059− kfree(led);
1060− goto err;
1061− }
1062− wdata->leds[i] = led;
1679+ if (!strcmp(buf, "scan")) {
1680+ wiimote_schedule(wdata);
1681+ } else {
1682+ return -EINVAL;
10631683 }
10641684
1065− return 0;
1685+ return strnlen(buf, PAGE_SIZE);
1686+}
10661687
1067−err:
1068− wiimote_leds_destroy(wdata);
1069− return ret;
1688+static DEVICE_ATTR(extension, S_IRUGO | S_IWUSR | S_IWGRP, wiimote_ext_show,
1689+ wiimote_ext_store);
1690+
1691+static ssize_t wiimote_dev_show(struct device *dev,
1692+ struct device_attribute *attr,
1693+ char *buf)
1694+{
1695+ struct wiimote_data *wdata = dev_to_wii(dev);
1696+ __u8 type;
1697+ unsigned long flags;
1698+
1699+ spin_lock_irqsave(&wdata->state.lock, flags);
1700+ type = wdata->state.devtype;
1701+ spin_unlock_irqrestore(&wdata->state.lock, flags);
1702+
1703+ switch (type) {
1704+ case WIIMOTE_DEV_GENERIC:
1705+ return sprintf(buf, "generic\n");
1706+ case WIIMOTE_DEV_GEN10:
1707+ return sprintf(buf, "gen10\n");
1708+ case WIIMOTE_DEV_GEN20:
1709+ return sprintf(buf, "gen20\n");
1710+ case WIIMOTE_DEV_BALANCE_BOARD:
1711+ return sprintf(buf, "balanceboard\n");
1712+ case WIIMOTE_DEV_PRO_CONTROLLER:
1713+ return sprintf(buf, "procontroller\n");
1714+ case WIIMOTE_DEV_PENDING:
1715+ return sprintf(buf, "pending\n");
1716+ case WIIMOTE_DEV_UNKNOWN:
1717+ /* fallthrough */
1718+ default:
1719+ return sprintf(buf, "unknown\n");
1720+ }
10701721 }
10711722
1723+static DEVICE_ATTR(devtype, S_IRUGO, wiimote_dev_show, NULL);
1724+
10721725 static struct wiimote_data *wiimote_create(struct hid_device *hdev)
10731726 {
10741727 struct wiimote_data *wdata;
1075− int i;
10761728
10771729 wdata = kzalloc(sizeof(*wdata), GFP_KERNEL);
10781730 if (!wdata)
10791731 return NULL;
10801732
1081− wdata->input = input_allocate_device();
1082− if (!wdata->input)
1083− goto err;
1084−
10851733 wdata->hdev = hdev;
10861734 hid_set_drvdata(hdev, wdata);
10871735
1088− input_set_drvdata(wdata->input, wdata);
1089− wdata->input->open = wiimote_input_open;
1090− wdata->input->close = wiimote_input_close;
1091− wdata->input->dev.parent = &wdata->hdev->dev;
1092− wdata->input->id.bustype = wdata->hdev->bus;
1093− wdata->input->id.vendor = wdata->hdev->vendor;
1094− wdata->input->id.product = wdata->hdev->product;
1095− wdata->input->id.version = wdata->hdev->version;
1096− wdata->input->name = WIIMOTE_NAME;
1097−
1098− set_bit(EV_KEY, wdata->input->evbit);
1099− for (i = 0; i < WIIPROTO_KEY_COUNT; ++i)
1100− set_bit(wiiproto_keymap[i], wdata->input->keybit);
1101−
1102− set_bit(FF_RUMBLE, wdata->input->ffbit);
1103− if (input_ff_create_memless(wdata->input, NULL, wiimote_ff_play))
1104− goto err_input;
1105−
1106− wdata->accel = input_allocate_device();
1107− if (!wdata->accel)
1108− goto err_input;
1109−
1110− input_set_drvdata(wdata->accel, wdata);
1111− wdata->accel->open = wiimote_accel_open;
1112− wdata->accel->close = wiimote_accel_close;
1113− wdata->accel->dev.parent = &wdata->hdev->dev;
1114− wdata->accel->id.bustype = wdata->hdev->bus;
1115− wdata->accel->id.vendor = wdata->hdev->vendor;
1116− wdata->accel->id.product = wdata->hdev->product;
1117− wdata->accel->id.version = wdata->hdev->version;
1118− wdata->accel->name = WIIMOTE_NAME " Accelerometer";
1119−
1120− set_bit(EV_ABS, wdata->accel->evbit);
1121− set_bit(ABS_RX, wdata->accel->absbit);
1122− set_bit(ABS_RY, wdata->accel->absbit);
1123− set_bit(ABS_RZ, wdata->accel->absbit);
1124− input_set_abs_params(wdata->accel, ABS_RX, -500, 500, 2, 4);
1125− input_set_abs_params(wdata->accel, ABS_RY, -500, 500, 2, 4);
1126− input_set_abs_params(wdata->accel, ABS_RZ, -500, 500, 2, 4);
1127−
1128− wdata->ir = input_allocate_device();
1129− if (!wdata->ir)
1130− goto err_ir;
1131−
1132− input_set_drvdata(wdata->ir, wdata);
1133− wdata->ir->open = wiimote_ir_open;
1134− wdata->ir->close = wiimote_ir_close;
1135− wdata->ir->dev.parent = &wdata->hdev->dev;
1136− wdata->ir->id.bustype = wdata->hdev->bus;
1137− wdata->ir->id.vendor = wdata->hdev->vendor;
1138− wdata->ir->id.product = wdata->hdev->product;
1139− wdata->ir->id.version = wdata->hdev->version;
1140− wdata->ir->name = WIIMOTE_NAME " IR";
1141−
1142− set_bit(EV_ABS, wdata->ir->evbit);
1143− set_bit(ABS_HAT0X, wdata->ir->absbit);
1144− set_bit(ABS_HAT0Y, wdata->ir->absbit);
1145− set_bit(ABS_HAT1X, wdata->ir->absbit);
1146− set_bit(ABS_HAT1Y, wdata->ir->absbit);
1147− set_bit(ABS_HAT2X, wdata->ir->absbit);
1148− set_bit(ABS_HAT2Y, wdata->ir->absbit);
1149− set_bit(ABS_HAT3X, wdata->ir->absbit);
1150− set_bit(ABS_HAT3Y, wdata->ir->absbit);
1151− input_set_abs_params(wdata->ir, ABS_HAT0X, 0, 1023, 2, 4);
1152− input_set_abs_params(wdata->ir, ABS_HAT0Y, 0, 767, 2, 4);
1153− input_set_abs_params(wdata->ir, ABS_HAT1X, 0, 1023, 2, 4);
1154− input_set_abs_params(wdata->ir, ABS_HAT1Y, 0, 767, 2, 4);
1155− input_set_abs_params(wdata->ir, ABS_HAT2X, 0, 1023, 2, 4);
1156− input_set_abs_params(wdata->ir, ABS_HAT2Y, 0, 767, 2, 4);
1157− input_set_abs_params(wdata->ir, ABS_HAT3X, 0, 1023, 2, 4);
1158− input_set_abs_params(wdata->ir, ABS_HAT3Y, 0, 767, 2, 4);
1159−
1160− spin_lock_init(&wdata->qlock);
1161− INIT_WORK(&wdata->worker, wiimote_worker);
1736+ spin_lock_init(&wdata->queue.lock);
1737+ INIT_WORK(&wdata->queue.worker, wiimote_queue_worker);
11621738
11631739 spin_lock_init(&wdata->state.lock);
11641740 init_completion(&wdata->state.ready);
11651741 mutex_init(&wdata->state.sync);
11661742 wdata->state.drm = WIIPROTO_REQ_DRM_K;
1743+ wdata->state.cmd_battery = 0xff;
11671744
1168− return wdata;
1745+ INIT_WORK(&wdata->init_worker, wiimote_init_worker);
1746+ setup_timer(&wdata->timer, wiimote_init_timeout, (long)wdata);
11691747
1170−err_ir:
1171− input_free_device(wdata->accel);
1172−err_input:
1173− input_free_device(wdata->input);
1174−err:
1175− kfree(wdata);
1176− return NULL;
1748+ return wdata;
11771749 }
11781750
11791751 static void wiimote_destroy(struct wiimote_data *wdata)
11801752 {
1753+ unsigned long flags;
1754+
11811755 wiidebug_deinit(wdata);
1182− wiiext_deinit(wdata);
1183− wiimote_leds_destroy(wdata);
1184−
1185− power_supply_unregister(&wdata->battery);
1186− kfree(wdata->battery.name);
1187− input_unregister_device(wdata->accel);
1188− input_unregister_device(wdata->ir);
1189− input_unregister_device(wdata->input);
1190− cancel_work_sync(&wdata->worker);
1756+
1757+ /* prevent init_worker from being scheduled again */
1758+ spin_lock_irqsave(&wdata->state.lock, flags);
1759+ wdata->state.flags |= WIIPROTO_FLAG_EXITING;
1760+ spin_unlock_irqrestore(&wdata->state.lock, flags);
1761+
1762+ cancel_work_sync(&wdata->init_worker);
1763+ del_timer_sync(&wdata->timer);
1764+
1765+ device_remove_file(&wdata->hdev->dev, &dev_attr_devtype);
1766+ device_remove_file(&wdata->hdev->dev, &dev_attr_extension);
1767+
1768+ wiimote_mp_unload(wdata);
1769+ wiimote_ext_unload(wdata);
1770+ wiimote_modules_unload(wdata);
1771+ cancel_work_sync(&wdata->queue.worker);
1772+ hid_hw_close(wdata->hdev);
11911773 hid_hw_stop(wdata->hdev);
11921774
11931775 kfree(wdata);
@@ -1219,62 +1801,32 @@ static int wiimote_hid_probe(struct hid_device *hdev, · 25 unmodified lines
12191801 goto err;
12201802 }
12211803
1222− ret = input_register_device(wdata->accel);
1804+ ret = hid_hw_open(hdev);
12231805 if (ret) {
1224− hid_err(hdev, "Cannot register input device\n");
1806+ hid_err(hdev, "cannot start hardware I/O\n");
12251807 goto err_stop;
12261808 }
12271809
1228− ret = input_register_device(wdata->ir);
1229− if (ret) {
1230− hid_err(hdev, "Cannot register input device\n");
1231− goto err_ir;
1232− }
1233−
1234− ret = input_register_device(wdata->input);
1810+ ret = device_create_file(&hdev->dev, &dev_attr_extension);
12351811 if (ret) {
1236− hid_err(hdev, "Cannot register input device\n");
1237− goto err_input;
1238− }
1239−
1240− wdata->battery.properties = wiimote_battery_props;
1241− wdata->battery.num_properties = ARRAY_SIZE(wiimote_battery_props);
1242− wdata->battery.get_property = wiimote_battery_get_property;
1243− wdata->battery.type = POWER_SUPPLY_TYPE_BATTERY;
1244− wdata->battery.use_for_apm = 0;
1245− wdata->battery.name = kasprintf(GFP_KERNEL, "wiimote_battery_%s",
1246− wdata->hdev->uniq);
1247− if (!wdata->battery.name) {
1248− ret = -ENOMEM;
1249− goto err_battery_name;
1812+ hid_err(hdev, "cannot create sysfs attribute\n");
1813+ goto err_close;
12501814 }
12511815
1252− ret = power_supply_register(&wdata->hdev->dev, &wdata->battery);
1816+ ret = device_create_file(&hdev->dev, &dev_attr_devtype);
12531817 if (ret) {
1254− hid_err(hdev, "Cannot register battery device\n");
1255− goto err_battery;
1818+ hid_err(hdev, "cannot create sysfs attribute\n");
1819+ goto err_ext;
12561820 }
12571821
1258− power_supply_powers(&wdata->battery, &hdev->dev);
1259−
1260− ret = wiimote_leds_create(wdata);
1261− if (ret)
1262− goto err_free;
1263−
1264− ret = wiiext_init(wdata);
1265− if (ret)
1266− goto err_free;
1267−
12681822 ret = wiidebug_init(wdata);
12691823 if (ret)
12701824 goto err_free;
12711825
12721826 hid_info(hdev, "New device registered\n");
12731827
1274− /* by default set led1 after device initialization */
1275− spin_lock_irq(&wdata->state.lock);
1276− wiiproto_req_leds(wdata, WIIPROTO_FLAG_LED1);
1277− spin_unlock_irq(&wdata->state.lock);
1828+ /* schedule device detection */
1829+ wiimote_schedule(wdata);
12781830
12791831 return 0;
12801832
@@ -1282,23 +1834,15 @@ err_free: · 1 unmodified line
12821834 wiimote_destroy(wdata);
12831835 return ret;
12841836
1285−err_battery:
1286− kfree(wdata->battery.name);
1287−err_battery_name:
1288− input_unregister_device(wdata->input);
1289− wdata->input = NULL;
1290−err_input:
1291− input_unregister_device(wdata->ir);
1292− wdata->ir = NULL;
1293−err_ir:
1294− input_unregister_device(wdata->accel);
1295− wdata->accel = NULL;
1837+err_ext:
1838+ device_remove_file(&wdata->hdev->dev, &dev_attr_extension);
1839+err_close:
1840+ hid_hw_close(hdev);
12961841 err_stop:
12971842 hid_hw_stop(hdev);
12981843 err:
12991844 input_free_device(wdata->ir);
13001845 input_free_device(wdata->accel);
1301− input_free_device(wdata->input);
13021846 kfree(wdata);
13031847 return ret;
13041848 }
@@ -1331,4 +1875,4 @@ module_hid_driver(wiimote_hid_driver); · 26 unmodified lines
13311875
13321876 MODULE_LICENSE("GPL");
13331877 MODULE_AUTHOR("David Herrmann <dh.herrmann@gmail.com>");
1334−MODULE_DESCRIPTION(WIIMOTE_NAME " Device Driver");
1878+MODULE_DESCRIPTION("Driver for Nintendo Wii / Wii U peripherals");
drivers/hid/hid-wiimote-debug.c+9−5
@@ -1,6 +1,6 @@
11 /*
2− * Debug support for HID Nintendo Wiimote devices
3− * Copyright (c) 2011 David Herrmann
2+ * Debug support for HID Nintendo Wii / Wii U peripherals
3+ * Copyright (c) 2011-2013 David Herrmann <dh.herrmann@gmail.com>
44 */
55
66 /*
@@ -127,7 +127,8 @@ static int wiidebug_drm_open(struct inode *i, struct file *f) · 120 unmodified lines
127127 static ssize_t wiidebug_drm_write(struct file *f, const char __user *u,
128128 size_t s, loff_t *off)
129129 {
130− struct wiimote_debug *dbg = f->private_data;
130+ struct seq_file *sf = f->private_data;
131+ struct wiimote_debug *dbg = sf->private;
131132 unsigned long flags;
132133 char buf[16];
133134 ssize_t len;
@@ -140,7 +141,7 @@ static ssize_t wiidebug_drm_write(struct file *f, const char __user *u, · 6 unmodified lines
140141 if (copy_from_user(buf, u, len))
141142 return -EFAULT;
142143
143− buf[15] = 0;
144+ buf[len] = 0;
144145
145146 for (i = 0; i < WIIPROTO_REQ_MAX; ++i) {
146147 if (!wiidebug_drmmap[i])
@@ -150,10 +151,13 @@ static ssize_t wiidebug_drm_write(struct file *f, const char __user *u, · 3 unmodified lines
150151 }
151152
152153 if (i == WIIPROTO_REQ_MAX)
153− i = simple_strtoul(buf, NULL, 10);
154+ i = simple_strtoul(buf, NULL, 16);
154155
155156 spin_lock_irqsave(&dbg->wdata->state.lock, flags);
157+ dbg->wdata->state.flags &= ~WIIPROTO_FLAG_DRM_LOCKED;
156158 wiiproto_req_drm(dbg->wdata, (__u8) i);
159+ if (i != WIIPROTO_REQ_NULL)
160+ dbg->wdata->state.flags |= WIIPROTO_FLAG_DRM_LOCKED;
157161 spin_unlock_irqrestore(&dbg->wdata->state.lock, flags);
158162
159163 return len;
drivers/hid/hid-wiimote-ext.c+0−849
@@ -1,849 +0,0 @@
1−/*
2− * HID driver for Nintendo Wiimote extension devices
3− * Copyright (c) 2011 David Herrmann
4− */
5−
6−/*
7− * This program is free software; you can redistribute it and/or modify it
8− * under the terms of the GNU General Public License as published by the Free
9− * Software Foundation; either version 2 of the License, or (at your option)
10− * any later version.
11− */
12−
13−#include <linux/atomic.h>
14−#include <linux/module.h>
15−#include <linux/spinlock.h>
16−#include <linux/workqueue.h>
17−#include "hid-wiimote.h"
18−
19−struct wiimote_ext {
20− struct wiimote_data *wdata;
21− struct work_struct worker;
22− struct input_dev *input;
23− struct input_dev *mp_input;
24−
25− atomic_t opened;
26− atomic_t mp_opened;
27− bool plugged;
28− bool mp_plugged;
29− bool motionp;
30− __u8 ext_type;
31− __u16 calib[4][3];
32−};
33−
34−enum wiiext_type {
35− WIIEXT_NONE, /* placeholder */
36− WIIEXT_CLASSIC, /* Nintendo classic controller */
37− WIIEXT_NUNCHUCK, /* Nintendo nunchuck controller */
38− WIIEXT_BALANCE_BOARD, /* Nintendo balance board controller */
39−};
40−
41−enum wiiext_keys {
42− WIIEXT_KEY_C,
43− WIIEXT_KEY_Z,
44− WIIEXT_KEY_A,
45− WIIEXT_KEY_B,
46− WIIEXT_KEY_X,
47− WIIEXT_KEY_Y,
48− WIIEXT_KEY_ZL,
49− WIIEXT_KEY_ZR,
50− WIIEXT_KEY_PLUS,
51− WIIEXT_KEY_MINUS,
52− WIIEXT_KEY_HOME,
53− WIIEXT_KEY_LEFT,
54− WIIEXT_KEY_RIGHT,
55− WIIEXT_KEY_UP,
56− WIIEXT_KEY_DOWN,
57− WIIEXT_KEY_LT,
58− WIIEXT_KEY_RT,
59− WIIEXT_KEY_COUNT
60−};
61−
62−static __u16 wiiext_keymap[] = {
63− BTN_C, /* WIIEXT_KEY_C */
64− BTN_Z, /* WIIEXT_KEY_Z */
65− BTN_A, /* WIIEXT_KEY_A */
66− BTN_B, /* WIIEXT_KEY_B */
67− BTN_X, /* WIIEXT_KEY_X */
68− BTN_Y, /* WIIEXT_KEY_Y */
69− BTN_TL2, /* WIIEXT_KEY_ZL */
70− BTN_TR2, /* WIIEXT_KEY_ZR */
71− KEY_NEXT, /* WIIEXT_KEY_PLUS */
72− KEY_PREVIOUS, /* WIIEXT_KEY_MINUS */
73− BTN_MODE, /* WIIEXT_KEY_HOME */
74− KEY_LEFT, /* WIIEXT_KEY_LEFT */
75− KEY_RIGHT, /* WIIEXT_KEY_RIGHT */
76− KEY_UP, /* WIIEXT_KEY_UP */
77− KEY_DOWN, /* WIIEXT_KEY_DOWN */
78− BTN_TL, /* WIIEXT_KEY_LT */
79− BTN_TR, /* WIIEXT_KEY_RT */
80−};
81−
82−/* disable all extensions */
83−static void ext_disable(struct wiimote_ext *ext)
84−{
85− unsigned long flags;
86− __u8 wmem = 0x55;
87−
88− if (!wiimote_cmd_acquire(ext->wdata)) {
89− wiimote_cmd_write(ext->wdata, 0xa400f0, &wmem, sizeof(wmem));
90− wiimote_cmd_release(ext->wdata);
91− }
92−
93− spin_lock_irqsave(&ext->wdata->state.lock, flags);
94− ext->motionp = false;
95− ext->ext_type = WIIEXT_NONE;
96− wiiproto_req_drm(ext->wdata, WIIPROTO_REQ_NULL);
97− spin_unlock_irqrestore(&ext->wdata->state.lock, flags);
98−}
99−
100−static bool motionp_read(struct wiimote_ext *ext)
101−{
102− __u8 rmem[2], wmem;
103− ssize_t ret;
104− bool avail = false;
105−
106− if (!atomic_read(&ext->mp_opened))
107− return false;
108−
109− if (wiimote_cmd_acquire(ext->wdata))
110− return false;
111−
112− /* initialize motion plus */
113− wmem = 0x55;
114− ret = wiimote_cmd_write(ext->wdata, 0xa600f0, &wmem, sizeof(wmem));
115− if (ret)
116− goto error;
117−
118− /* read motion plus ID */
119− ret = wiimote_cmd_read(ext->wdata, 0xa600fe, rmem, 2);
120− if (ret == 2 || rmem[1] == 0x5)
121− avail = true;
122−
123−error:
124− wiimote_cmd_release(ext->wdata);
125− return avail;
126−}
127−
128−static __u8 ext_read(struct wiimote_ext *ext)
129−{
130− ssize_t ret;
131− __u8 buf[24], i, j, offs = 0;
132− __u8 rmem[2], wmem;
133− __u8 type = WIIEXT_NONE;
134−
135− if (!ext->plugged || !atomic_read(&ext->opened))
136− return WIIEXT_NONE;
137−
138− if (wiimote_cmd_acquire(ext->wdata))
139− return WIIEXT_NONE;
140−
141− /* initialize extension */
142− wmem = 0x55;
143− ret = wiimote_cmd_write(ext->wdata, 0xa400f0, &wmem, sizeof(wmem));
144− if (!ret) {
145− /* disable encryption */
146− wmem = 0x0;
147− wiimote_cmd_write(ext->wdata, 0xa400fb, &wmem, sizeof(wmem));
148− }
149−
150− /* read extension ID */
151− ret = wiimote_cmd_read(ext->wdata, 0xa400fe, rmem, 2);
152− if (ret == 2) {
153− if (rmem[0] == 0 && rmem[1] == 0)
154− type = WIIEXT_NUNCHUCK;
155− else if (rmem[0] == 0x01 && rmem[1] == 0x01)
156− type = WIIEXT_CLASSIC;
157− else if (rmem[0] == 0x04 && rmem[1] == 0x02)
158− type = WIIEXT_BALANCE_BOARD;
159− }
160−
161− /* get balance board calibration data */
162− if (type == WIIEXT_BALANCE_BOARD) {
163− ret = wiimote_cmd_read(ext->wdata, 0xa40024, buf, 12);
164− ret += wiimote_cmd_read(ext->wdata, 0xa40024 + 12,
165− buf + 12, 12);
166−
167− if (ret != 24) {
168− type = WIIEXT_NONE;
169− } else {
170− for (i = 0; i < 3; i++) {
171− for (j = 0; j < 4; j++) {
172− ext->calib[j][i] = buf[offs];
173− ext->calib[j][i] <<= 8;
174− ext->calib[j][i] |= buf[offs + 1];
175− offs += 2;
176− }
177− }
178− }
179− }
180−
181− wiimote_cmd_release(ext->wdata);
182−
183− return type;
184−}
185−
186−static void ext_enable(struct wiimote_ext *ext, bool motionp, __u8 ext_type)
187−{
188− unsigned long flags;
189− __u8 wmem;
190− int ret;
191−
192− if (motionp) {
193− if (wiimote_cmd_acquire(ext->wdata))
194− return;
195−
196− if (ext_type == WIIEXT_CLASSIC)
197− wmem = 0x07;
198− else if (ext_type == WIIEXT_NUNCHUCK)
199− wmem = 0x05;
200− else
201− wmem = 0x04;
202−
203− ret = wiimote_cmd_write(ext->wdata, 0xa600fe, &wmem, sizeof(wmem));
204− wiimote_cmd_release(ext->wdata);
205− if (ret)
206− return;
207− }
208−
209− spin_lock_irqsave(&ext->wdata->state.lock, flags);
210− ext->motionp = motionp;
211− ext->ext_type = ext_type;
212− wiiproto_req_drm(ext->wdata, WIIPROTO_REQ_NULL);
213− spin_unlock_irqrestore(&ext->wdata->state.lock, flags);
214−}
215−
216−static void wiiext_worker(struct work_struct *work)
217−{
218− struct wiimote_ext *ext = container_of(work, struct wiimote_ext,
219− worker);
220− bool motionp;
221− __u8 ext_type;
222−
223− ext_disable(ext);
224− motionp = motionp_read(ext);
225− ext_type = ext_read(ext);
226− ext_enable(ext, motionp, ext_type);
227−}
228−
229−/* schedule work only once, otherwise mark for reschedule */
230−static void wiiext_schedule(struct wiimote_ext *ext)
231−{
232− schedule_work(&ext->worker);
233−}
234−
235−/*
236− * Reacts on extension port events
237− * Whenever the driver gets an event from the wiimote that an extension has been
238− * plugged or unplugged, this funtion shall be called. It checks what extensions
239− * are connected and initializes and activates them.
240− * This can be called in atomic context. The initialization is done in a
241− * separate worker thread. The state.lock spinlock must be held by the caller.
242− */
243−void wiiext_event(struct wiimote_data *wdata, bool plugged)
244−{
245− if (!wdata->ext)
246− return;
247−
248− if (wdata->ext->plugged == plugged)
249− return;
250−
251− wdata->ext->plugged = plugged;
252−
253− if (!plugged)
254− wdata->ext->mp_plugged = false;
255−
256− /*
257− * We need to call wiiext_schedule(wdata->ext) here, however, the
258− * extension initialization logic is not fully understood and so
259− * automatic initialization is not supported, yet.
260− */
261−}
262−
263−/*
264− * Returns true if the current DRM mode should contain extension data and false
265− * if there is no interest in extension data.
266− * All supported extensions send 6 byte extension data so any DRM that contains
267− * extension bytes is fine.
268− * The caller must hold the state.lock spinlock.
269− */
270−bool wiiext_active(struct wiimote_data *wdata)
271−{
272− if (!wdata->ext)
273− return false;
274−
275− return wdata->ext->motionp || wdata->ext->ext_type;
276−}
277−
278−static void handler_motionp(struct wiimote_ext *ext, const __u8 *payload)
279−{
280− __s32 x, y, z;
281− bool plugged;
282−
283− /* | 8 7 6 5 4 3 | 2 | 1 |
284− * -----+------------------------------+-----+-----+
285− * 1 | Yaw Speed <7:0> |
286− * 2 | Roll Speed <7:0> |
287− * 3 | Pitch Speed <7:0> |
288− * -----+------------------------------+-----+-----+
289− * 4 | Yaw Speed <13:8> | Yaw |Pitch|
290− * -----+------------------------------+-----+-----+
291− * 5 | Roll Speed <13:8> |Roll | Ext |
292− * -----+------------------------------+-----+-----+
293− * 6 | Pitch Speed <13:8> | 1 | 0 |
294− * -----+------------------------------+-----+-----+
295− * The single bits Yaw, Roll, Pitch in the lower right corner specify
296− * whether the wiimote is rotating fast (0) or slow (1). Speed for slow
297− * roation is 440 deg/s and for fast rotation 2000 deg/s. To get a
298− * linear scale we multiply by 2000/440 = ~4.5454 which is 18 for fast
299− * and 9 for slow.
300− * If the wiimote is not rotating the sensor reports 2^13 = 8192.
301− * Ext specifies whether an extension is connected to the motionp.
302− */
303−
304− x = payload[0];
305− y = payload[1];
306− z = payload[2];
307−
308− x |= (((__u16)payload[3]) << 6) & 0xff00;
309− y |= (((__u16)payload[4]) << 6) & 0xff00;
310− z |= (((__u16)payload[5]) << 6) & 0xff00;
311−
312− x -= 8192;
313− y -= 8192;
314− z -= 8192;
315−
316− if (!(payload[3] & 0x02))
317− x *= 18;
318− else
319− x *= 9;
320− if (!(payload[4] & 0x02))
321− y *= 18;
322− else
323− y *= 9;
324− if (!(payload[3] & 0x01))
325− z *= 18;
326− else
327− z *= 9;
328−
329− input_report_abs(ext->mp_input, ABS_RX, x);
330− input_report_abs(ext->mp_input, ABS_RY, y);
331− input_report_abs(ext->mp_input, ABS_RZ, z);
332− input_sync(ext->mp_input);
333−
334− plugged = payload[5] & 0x01;
335− if (plugged != ext->mp_plugged)
336− ext->mp_plugged = plugged;
337−}
338−
339−static void handler_nunchuck(struct wiimote_ext *ext, const __u8 *payload)
340−{
341− __s16 x, y, z, bx, by;
342−
343− /* Byte | 8 7 | 6 5 | 4 3 | 2 | 1 |
344− * -----+----------+---------+---------+----+-----+
345− * 1 | Button X <7:0> |
346− * 2 | Button Y <7:0> |
347− * -----+----------+---------+---------+----+-----+
348− * 3 | Speed X <9:2> |
349− * 4 | Speed Y <9:2> |
350− * 5 | Speed Z <9:2> |
351− * -----+----------+---------+---------+----+-----+
352− * 6 | Z <1:0> | Y <1:0> | X <1:0> | BC | BZ |
353− * -----+----------+---------+---------+----+-----+
354− * Button X/Y is the analog stick. Speed X, Y and Z are the
355− * accelerometer data in the same format as the wiimote's accelerometer.
356− * The 6th byte contains the LSBs of the accelerometer data.
357− * BC and BZ are the C and Z buttons: 0 means pressed
358− *
359− * If reported interleaved with motionp, then the layout changes. The
360− * 5th and 6th byte changes to:
361− * -----+-----------------------------------+-----+
362− * 5 | Speed Z <9:3> | EXT |
363− * -----+--------+-----+-----+----+----+----+-----+
364− * 6 |Z <2:1> |Y <1>|X <1>| BC | BZ | 0 | 0 |
365− * -----+--------+-----+-----+----+----+----+-----+
366− * All three accelerometer values lose their LSB. The other data is
367− * still available but slightly moved.
368− *
369− * Center data for button values is 128. Center value for accelerometer
370− * values it 512 / 0x200
371− */
372−
373− bx = payload[0];
374− by = payload[1];
375− bx -= 128;
376− by -= 128;
377−
378− x = payload[2] << 2;
379− y = payload[3] << 2;
380− z = payload[4] << 2;
381−
382− if (ext->motionp) {
383− x |= (payload[5] >> 3) & 0x02;
384− y |= (payload[5] >> 4) & 0x02;
385− z &= ~0x4;
386− z |= (payload[5] >> 5) & 0x06;
387− } else {
388− x |= (payload[5] >> 2) & 0x03;
389− y |= (payload[5] >> 4) & 0x03;
390− z |= (payload[5] >> 6) & 0x03;
391− }
392−
393− x -= 0x200;
394− y -= 0x200;
395− z -= 0x200;
396−
397− input_report_abs(ext->input, ABS_HAT0X, bx);
398− input_report_abs(ext->input, ABS_HAT0Y, by);
399−
400− input_report_abs(ext->input, ABS_RX, x);
401− input_report_abs(ext->input, ABS_RY, y);
402− input_report_abs(ext->input, ABS_RZ, z);
403−
404− if (ext->motionp) {
405− input_report_key(ext->input,
406− wiiext_keymap[WIIEXT_KEY_Z], !(payload[5] & 0x04));
407− input_report_key(ext->input,
408− wiiext_keymap[WIIEXT_KEY_C], !(payload[5] & 0x08));
409− } else {
410− input_report_key(ext->input,
411− wiiext_keymap[WIIEXT_KEY_Z], !(payload[5] & 0x01));
412− input_report_key(ext->input,
413− wiiext_keymap[WIIEXT_KEY_C], !(payload[5] & 0x02));
414− }
415−
416− input_sync(ext->input);
417−}
418−
419−static void handler_classic(struct wiimote_ext *ext, const __u8 *payload)
420−{
421− __s8 rx, ry, lx, ly, lt, rt;
422−
423− /* Byte | 8 | 7 | 6 | 5 | 4 | 3 | 2 | 1 |
424− * -----+-----+-----+-----+-----+-----+-----+-----+-----+
425− * 1 | RX <5:4> | LX <5:0> |
426− * 2 | RX <3:2> | LY <5:0> |
427− * -----+-----+-----+-----+-----------------------------+
428− * 3 |RX<1>| LT <5:4> | RY <5:1> |
429− * -----+-----+-----------+-----------------------------+
430− * 4 | LT <3:1> | RT <5:1> |
431− * -----+-----+-----+-----+-----+-----+-----+-----+-----+
432− * 5 | BDR | BDD | BLT | B- | BH | B+ | BRT | 1 |
433− * -----+-----+-----+-----+-----+-----+-----+-----+-----+
434− * 6 | BZL | BB | BY | BA | BX | BZR | BDL | BDU |
435− * -----+-----+-----+-----+-----+-----+-----+-----+-----+
436− * All buttons are 0 if pressed
437− * RX and RY are right analog stick
438− * LX and LY are left analog stick
439− * LT is left trigger, RT is right trigger
440− * BLT is 0 if left trigger is fully pressed
441− * BRT is 0 if right trigger is fully pressed
442− * BDR, BDD, BDL, BDU form the D-Pad with right, down, left, up buttons
443− * BZL is left Z button and BZR is right Z button
444− * B-, BH, B+ are +, HOME and - buttons
445− * BB, BY, BA, BX are A, B, X, Y buttons
446− * LSB of RX, RY, LT, and RT are not transmitted and always 0.
447− *
448− * With motionp enabled it changes slightly to this:
449− * Byte | 8 | 7 | 6 | 5 | 4 | 3 | 2 | 1 |
450− * -----+-----+-----+-----+-----+-----+-----+-----+-----+
451− * 1 | RX <4:3> | LX <5:1> | BDU |
452− * 2 | RX <2:1> | LY <5:1> | BDL |
453− * -----+-----+-----+-----+-----------------------+-----+
454− * 3 |RX<0>| LT <4:3> | RY <4:0> |
455− * -----+-----+-----------+-----------------------------+
456− * 4 | LT <2:0> | RT <4:0> |
457− * -----+-----+-----+-----+-----+-----+-----+-----+-----+
458− * 5 | BDR | BDD | BLT | B- | BH | B+ | BRT | EXT |
459− * -----+-----+-----+-----+-----+-----+-----+-----+-----+
460− * 6 | BZL | BB | BY | BA | BX | BZR | 0 | 0 |
461− * -----+-----+-----+-----+-----+-----+-----+-----+-----+
462− * Only the LSBs of LX and LY are lost. BDU and BDL are moved, the rest
463− * is the same as before.
464− */
465−
466− if (ext->motionp) {
467− lx = payload[0] & 0x3e;
468− ly = payload[0] & 0x3e;
469− } else {
470− lx = payload[0] & 0x3f;
471− ly = payload[0] & 0x3f;
472− }
473−
474− rx = (payload[0] >> 3) & 0x14;
475− rx |= (payload[1] >> 5) & 0x06;
476− rx |= (payload[2] >> 7) & 0x01;
477− ry = payload[2] & 0x1f;
478−
479− rt = payload[3] & 0x1f;
480− lt = (payload[2] >> 2) & 0x18;
481− lt |= (payload[3] >> 5) & 0x07;
482−
483− rx <<= 1;
484− ry <<= 1;
485− rt <<= 1;
486− lt <<= 1;
487−
488− input_report_abs(ext->input, ABS_HAT1X, lx - 0x20);
489− input_report_abs(ext->input, ABS_HAT1Y, ly - 0x20);
490− input_report_abs(ext->input, ABS_HAT2X, rx - 0x20);
491− input_report_abs(ext->input, ABS_HAT2Y, ry - 0x20);
492− input_report_abs(ext->input, ABS_HAT3X, rt - 0x20);
493− input_report_abs(ext->input, ABS_HAT3Y, lt - 0x20);
494−
495− input_report_key(ext->input, wiiext_keymap[WIIEXT_KEY_RIGHT],
496− !!(payload[4] & 0x80));
497− input_report_key(ext->input, wiiext_keymap[WIIEXT_KEY_DOWN],
498− !!(payload[4] & 0x40));
499− input_report_key(ext->input, wiiext_keymap[WIIEXT_KEY_LT],
500− !!(payload[4] & 0x20));
501− input_report_key(ext->input, wiiext_keymap[WIIEXT_KEY_MINUS],
502− !!(payload[4] & 0x10));
503− input_report_key(ext->input, wiiext_keymap[WIIEXT_KEY_HOME],
504− !!(payload[4] & 0x08));
505− input_report_key(ext->input, wiiext_keymap[WIIEXT_KEY_PLUS],
506− !!(payload[4] & 0x04));
507− input_report_key(ext->input, wiiext_keymap[WIIEXT_KEY_RT],
508− !!(payload[4] & 0x02));
509− input_report_key(ext->input, wiiext_keymap[WIIEXT_KEY_ZL],
510− !!(payload[5] & 0x80));
511− input_report_key(ext->input, wiiext_keymap[WIIEXT_KEY_B],
512− !!(payload[5] & 0x40));
513− input_report_key(ext->input, wiiext_keymap[WIIEXT_KEY_Y],
514− !!(payload[5] & 0x20));
515− input_report_key(ext->input, wiiext_keymap[WIIEXT_KEY_A],
516− !!(payload[5] & 0x10));
517− input_report_key(ext->input, wiiext_keymap[WIIEXT_KEY_X],
518− !!(payload[5] & 0x08));
519− input_report_key(ext->input, wiiext_keymap[WIIEXT_KEY_ZR],
520− !!(payload[5] & 0x04));
521−
522− if (ext->motionp) {
523− input_report_key(ext->input, wiiext_keymap[WIIEXT_KEY_UP],
524− !!(payload[0] & 0x01));
525− input_report_key(ext->input, wiiext_keymap[WIIEXT_KEY_LEFT],
526− !!(payload[1] & 0x01));
527− } else {
528− input_report_key(ext->input, wiiext_keymap[WIIEXT_KEY_UP],
529− !!(payload[5] & 0x01));
530− input_report_key(ext->input, wiiext_keymap[WIIEXT_KEY_LEFT],
531− !!(payload[5] & 0x02));
532− }
533−
534− input_sync(ext->input);
535−}
536−
537−static void handler_balance_board(struct wiimote_ext *ext, const __u8 *payload)
538−{
539− __s32 val[4], tmp;
540− unsigned int i;
541−
542− /* Byte | 8 7 6 5 4 3 2 1 |
543− * -----+--------------------------+
544− * 1 | Top Right <15:8> |
545− * 2 | Top Right <7:0> |
546− * -----+--------------------------+
547− * 3 | Bottom Right <15:8> |
548− * 4 | Bottom Right <7:0> |
549− * -----+--------------------------+
550− * 5 | Top Left <15:8> |
551− * 6 | Top Left <7:0> |
552− * -----+--------------------------+
553− * 7 | Bottom Left <15:8> |
554− * 8 | Bottom Left <7:0> |
555− * -----+--------------------------+
556− *
557− * These values represent the weight-measurements of the Wii-balance
558− * board with 16bit precision.
559− *
560− * The balance-board is never reported interleaved with motionp.
561− */
562−
563− val[0] = payload[0];
564− val[0] <<= 8;
565− val[0] |= payload[1];
566−
567− val[1] = payload[2];
568− val[1] <<= 8;
569− val[1] |= payload[3];
570−
571− val[2] = payload[4];
572− val[2] <<= 8;
573− val[2] |= payload[5];
574−
575− val[3] = payload[6];
576− val[3] <<= 8;
577− val[3] |= payload[7];
578−
579− /* apply calibration data */
580− for (i = 0; i < 4; i++) {
581− if (val[i] < ext->calib[i][1]) {
582− tmp = val[i] - ext->calib[i][0];
583− tmp *= 1700;
584− tmp /= ext->calib[i][1] - ext->calib[i][0];
585− } else {
586− tmp = val[i] - ext->calib[i][1];
587− tmp *= 1700;
588− tmp /= ext->calib[i][2] - ext->calib[i][1];
589− tmp += 1700;
590− }
591− val[i] = tmp;
592− }
593−
594− input_report_abs(ext->input, ABS_HAT0X, val[0]);
595− input_report_abs(ext->input, ABS_HAT0Y, val[1]);
596− input_report_abs(ext->input, ABS_HAT1X, val[2]);
597− input_report_abs(ext->input, ABS_HAT1Y, val[3]);
598−
599− input_sync(ext->input);
600−}
601−
602−/* call this with state.lock spinlock held */
603−void wiiext_handle(struct wiimote_data *wdata, const __u8 *payload)
604−{
605− struct wiimote_ext *ext = wdata->ext;
606−
607− if (!ext)
608− return;
609−
610− if (ext->motionp && (payload[5] & 0x02)) {
611− handler_motionp(ext, payload);
612− } else if (ext->ext_type == WIIEXT_NUNCHUCK) {
613− handler_nunchuck(ext, payload);
614− } else if (ext->ext_type == WIIEXT_CLASSIC) {
615− handler_classic(ext, payload);
616− } else if (ext->ext_type == WIIEXT_BALANCE_BOARD) {
617− handler_balance_board(ext, payload);
618− }
619−}
620−
621−static ssize_t wiiext_show(struct device *dev, struct device_attribute *attr,
622− char *buf)
623−{
624− struct wiimote_data *wdata = dev_to_wii(dev);
625− __u8 type = WIIEXT_NONE;
626− bool motionp = false;
627− unsigned long flags;
628−
629− spin_lock_irqsave(&wdata->state.lock, flags);
630− if (wdata->ext) {
631− motionp = wdata->ext->motionp;
632− type = wdata->ext->ext_type;
633− }
634− spin_unlock_irqrestore(&wdata->state.lock, flags);
635−
636− if (type == WIIEXT_NUNCHUCK) {
637− if (motionp)
638− return sprintf(buf, "motionp+nunchuck\n");
639− else
640− return sprintf(buf, "nunchuck\n");
641− } else if (type == WIIEXT_CLASSIC) {
642− if (motionp)
643− return sprintf(buf, "motionp+classic\n");
644− else
645− return sprintf(buf, "classic\n");
646− } else if (type == WIIEXT_BALANCE_BOARD) {
647− if (motionp)
648− return sprintf(buf, "motionp+balanceboard\n");
649− else
650− return sprintf(buf, "balanceboard\n");
651− } else {
652− if (motionp)
653− return sprintf(buf, "motionp\n");
654− else
655− return sprintf(buf, "none\n");
656− }
657−}
658−
659−static DEVICE_ATTR(extension, S_IRUGO, wiiext_show, NULL);
660−
661−static int wiiext_input_open(struct input_dev *dev)
662−{
663− struct wiimote_ext *ext = input_get_drvdata(dev);
664− int ret;
665−
666− ret = hid_hw_open(ext->wdata->hdev);
667− if (ret)
668− return ret;
669−
670− atomic_inc(&ext->opened);
671− wiiext_schedule(ext);
672−
673− return 0;
674−}
675−
676−static void wiiext_input_close(struct input_dev *dev)
677−{
678− struct wiimote_ext *ext = input_get_drvdata(dev);
679−
680− atomic_dec(&ext->opened);
681− wiiext_schedule(ext);
682− hid_hw_close(ext->wdata->hdev);
683−}
684−
685−static int wiiext_mp_open(struct input_dev *dev)
686−{
687− struct wiimote_ext *ext = input_get_drvdata(dev);
688− int ret;
689−
690− ret = hid_hw_open(ext->wdata->hdev);
691− if (ret)
692− return ret;
693−
694− atomic_inc(&ext->mp_opened);
695− wiiext_schedule(ext);
696−
697− return 0;
698−}
699−
700−static void wiiext_mp_close(struct input_dev *dev)
701−{
702− struct wiimote_ext *ext = input_get_drvdata(dev);
703−
704− atomic_dec(&ext->mp_opened);
705− wiiext_schedule(ext);
706− hid_hw_close(ext->wdata->hdev);
707−}
708−
709−/* Initializes the extension driver of a wiimote */
710−int wiiext_init(struct wiimote_data *wdata)
711−{
712− struct wiimote_ext *ext;
713− unsigned long flags;
714− int ret, i;
715−
716− ext = kzalloc(sizeof(*ext), GFP_KERNEL);
717− if (!ext)
718− return -ENOMEM;
719−
720− ext->wdata = wdata;
721− INIT_WORK(&ext->worker, wiiext_worker);
722−
723− ext->input = input_allocate_device();
724− if (!ext->input) {
725− ret = -ENOMEM;
726− goto err_input;
727− }
728−
729− input_set_drvdata(ext->input, ext);
730− ext->input->open = wiiext_input_open;
731− ext->input->close = wiiext_input_close;
732− ext->input->dev.parent = &wdata->hdev->dev;
733− ext->input->id.bustype = wdata->hdev->bus;
734− ext->input->id.vendor = wdata->hdev->vendor;
735− ext->input->id.product = wdata->hdev->product;
736− ext->input->id.version = wdata->hdev->version;
737− ext->input->name = WIIMOTE_NAME " Extension";
738−
739− set_bit(EV_KEY, ext->input->evbit);
740− for (i = 0; i < WIIEXT_KEY_COUNT; ++i)
741− set_bit(wiiext_keymap[i], ext->input->keybit);
742−
743− set_bit(EV_ABS, ext->input->evbit);
744− set_bit(ABS_HAT0X, ext->input->absbit);
745− set_bit(ABS_HAT0Y, ext->input->absbit);
746− set_bit(ABS_HAT1X, ext->input->absbit);
747− set_bit(ABS_HAT1Y, ext->input->absbit);
748− set_bit(ABS_HAT2X, ext->input->absbit);
749− set_bit(ABS_HAT2Y, ext->input->absbit);
750− set_bit(ABS_HAT3X, ext->input->absbit);
751− set_bit(ABS_HAT3Y, ext->input->absbit);
752− input_set_abs_params(ext->input, ABS_HAT0X, -120, 120, 2, 4);
753− input_set_abs_params(ext->input, ABS_HAT0Y, -120, 120, 2, 4);
754− input_set_abs_params(ext->input, ABS_HAT1X, -30, 30, 1, 1);
755− input_set_abs_params(ext->input, ABS_HAT1Y, -30, 30, 1, 1);
756− input_set_abs_params(ext->input, ABS_HAT2X, -30, 30, 1, 1);
757− input_set_abs_params(ext->input, ABS_HAT2Y, -30, 30, 1, 1);
758− input_set_abs_params(ext->input, ABS_HAT3X, -30, 30, 1, 1);
759− input_set_abs_params(ext->input, ABS_HAT3Y, -30, 30, 1, 1);
760− set_bit(ABS_RX, ext->input->absbit);
761− set_bit(ABS_RY, ext->input->absbit);
762− set_bit(ABS_RZ, ext->input->absbit);
763− input_set_abs_params(ext->input, ABS_RX, -500, 500, 2, 4);
764− input_set_abs_params(ext->input, ABS_RY, -500, 500, 2, 4);
765− input_set_abs_params(ext->input, ABS_RZ, -500, 500, 2, 4);
766−
767− ret = input_register_device(ext->input);
768− if (ret) {
769− input_free_device(ext->input);
770− goto err_input;
771− }
772−
773− ext->mp_input = input_allocate_device();
774− if (!ext->mp_input) {
775− ret = -ENOMEM;
776− goto err_mp;
777− }
778−
779− input_set_drvdata(ext->mp_input, ext);
780− ext->mp_input->open = wiiext_mp_open;
781− ext->mp_input->close = wiiext_mp_close;
782− ext->mp_input->dev.parent = &wdata->hdev->dev;
783− ext->mp_input->id.bustype = wdata->hdev->bus;
784− ext->mp_input->id.vendor = wdata->hdev->vendor;
785− ext->mp_input->id.product = wdata->hdev->product;
786− ext->mp_input->id.version = wdata->hdev->version;
787− ext->mp_input->name = WIIMOTE_NAME " Motion+";
788−
789− set_bit(EV_ABS, ext->mp_input->evbit);
790− set_bit(ABS_RX, ext->mp_input->absbit);
791− set_bit(ABS_RY, ext->mp_input->absbit);
792− set_bit(ABS_RZ, ext->mp_input->absbit);
793− input_set_abs_params(ext->mp_input, ABS_RX, -160000, 160000, 4, 8);
794− input_set_abs_params(ext->mp_input, ABS_RY, -160000, 160000, 4, 8);
795− input_set_abs_params(ext->mp_input, ABS_RZ, -160000, 160000, 4, 8);
796−
797− ret = input_register_device(ext->mp_input);
798− if (ret) {
799− input_free_device(ext->mp_input);
800− goto err_mp;
801− }
802−
803− ret = device_create_file(&wdata->hdev->dev, &dev_attr_extension);
804− if (ret)
805− goto err_dev;
806−
807− spin_lock_irqsave(&wdata->state.lock, flags);
808− wdata->ext = ext;
809− spin_unlock_irqrestore(&wdata->state.lock, flags);
810−
811− return 0;
812−
813−err_dev:
814− input_unregister_device(ext->mp_input);
815−err_mp:
816− input_unregister_device(ext->input);
817−err_input:
818− kfree(ext);
819− return ret;
820−}
821−
822−/* Deinitializes the extension driver of a wiimote */
823−void wiiext_deinit(struct wiimote_data *wdata)
824−{
825− struct wiimote_ext *ext = wdata->ext;
826− unsigned long flags;
827−
828− if (!ext)
829− return;
830−
831− /*
832− * We first unset wdata->ext to avoid further input from the wiimote
833− * core. The worker thread does not access this pointer so it is not
834− * affected by this.
835− * We kill the worker after this so it does not get respawned during
836− * deinitialization.
837− */
838−
839− spin_lock_irqsave(&wdata->state.lock, flags);
840− wdata->ext = NULL;
841− spin_unlock_irqrestore(&wdata->state.lock, flags);
842−
843− device_remove_file(&wdata->hdev->dev, &dev_attr_extension);
844− input_unregister_device(ext->mp_input);
845− input_unregister_device(ext->input);
846−
847− cancel_work_sync(&ext->worker);
848− kfree(ext);
849−}
drivers/hid/hid-wiimote-modules.c+2086−0
@@ -0,0 +1,2086 @@
1+/*
2+ * Device Modules for Nintendo Wii / Wii U HID Driver
3+ * Copyright (c) 2011-2013 David Herrmann <dh.herrmann@gmail.com>
4+ */
5+
6+/*
7+ * This program is free software; you can redistribute it and/or modify it
8+ * under the terms of the GNU General Public License as published by the Free
9+ * Software Foundation; either version 2 of the License, or (at your option)
10+ * any later version.
11+ */
12+
13+/*
14+ * Wiimote Modules
15+ * Nintendo devices provide different peripherals and many new devices lack
16+ * initial features like the IR camera. Therefore, each peripheral device is
17+ * implemented as an independent module and we probe on each device only the
18+ * modules for the hardware that really is available.
19+ *
20+ * Module registration is sequential. Unregistration is done in reverse order.
21+ * After device detection, the needed modules are loaded. Users can trigger
22+ * re-detection which causes all modules to be unloaded and then reload the
23+ * modules for the new detected device.
24+ *
25+ * wdata->input is a shared input device. It is always initialized prior to
26+ * module registration. If at least one registered module is marked as
27+ * WIIMOD_FLAG_INPUT, then the input device will get registered after all
28+ * modules were registered.
29+ * Please note that it is unregistered _before_ the "remove" callbacks are
30+ * called. This guarantees that no input interaction is done, anymore. However,
31+ * the wiimote core keeps a reference to the input device so it is freed only
32+ * after all modules were removed. It is safe to send events to unregistered
33+ * input devices.
34+ */
35+
36+#include <linux/device.h>
37+#include <linux/hid.h>
38+#include <linux/input.h>
39+#include <linux/spinlock.h>
40+#include "hid-wiimote.h"
41+
42+/*
43+ * Keys
44+ * The initial Wii Remote provided a bunch of buttons that are reported as
45+ * part of the core protocol. Many later devices dropped these and report
46+ * invalid data in the core button reports. Load this only on devices which
47+ * correctly send button reports.
48+ * It uses the shared input device.
49+ */
50+
51+static const __u16 wiimod_keys_map[] = {
52+ KEY_LEFT, /* WIIPROTO_KEY_LEFT */
53+ KEY_RIGHT, /* WIIPROTO_KEY_RIGHT */
54+ KEY_UP, /* WIIPROTO_KEY_UP */
55+ KEY_DOWN, /* WIIPROTO_KEY_DOWN */
56+ KEY_NEXT, /* WIIPROTO_KEY_PLUS */
57+ KEY_PREVIOUS, /* WIIPROTO_KEY_MINUS */
58+ BTN_1, /* WIIPROTO_KEY_ONE */
59+ BTN_2, /* WIIPROTO_KEY_TWO */
60+ BTN_A, /* WIIPROTO_KEY_A */
61+ BTN_B, /* WIIPROTO_KEY_B */
62+ BTN_MODE, /* WIIPROTO_KEY_HOME */
63+};
64+
65+static void wiimod_keys_in_keys(struct wiimote_data *wdata, const __u8 *keys)
66+{
67+ input_report_key(wdata->input, wiimod_keys_map[WIIPROTO_KEY_LEFT],
68+ !!(keys[0] & 0x01));
69+ input_report_key(wdata->input, wiimod_keys_map[WIIPROTO_KEY_RIGHT],
70+ !!(keys[0] & 0x02));
71+ input_report_key(wdata->input, wiimod_keys_map[WIIPROTO_KEY_DOWN],
72+ !!(keys[0] & 0x04));
73+ input_report_key(wdata->input, wiimod_keys_map[WIIPROTO_KEY_UP],
74+ !!(keys[0] & 0x08));
75+ input_report_key(wdata->input, wiimod_keys_map[WIIPROTO_KEY_PLUS],
76+ !!(keys[0] & 0x10));
77+ input_report_key(wdata->input, wiimod_keys_map[WIIPROTO_KEY_TWO],
78+ !!(keys[1] & 0x01));
79+ input_report_key(wdata->input, wiimod_keys_map[WIIPROTO_KEY_ONE],
80+ !!(keys[1] & 0x02));
81+ input_report_key(wdata->input, wiimod_keys_map[WIIPROTO_KEY_B],
82+ !!(keys[1] & 0x04));
83+ input_report_key(wdata->input, wiimod_keys_map[WIIPROTO_KEY_A],
84+ !!(keys[1] & 0x08));
85+ input_report_key(wdata->input, wiimod_keys_map[WIIPROTO_KEY_MINUS],
86+ !!(keys[1] & 0x10));
87+ input_report_key(wdata->input, wiimod_keys_map[WIIPROTO_KEY_HOME],
88+ !!(keys[1] & 0x80));
89+ input_sync(wdata->input);
90+}
91+
92+static int wiimod_keys_probe(const struct wiimod_ops *ops,
93+ struct wiimote_data *wdata)
94+{
95+ unsigned int i;
96+
97+ set_bit(EV_KEY, wdata->input->evbit);
98+ for (i = 0; i < WIIPROTO_KEY_COUNT; ++i)
99+ set_bit(wiimod_keys_map[i], wdata->input->keybit);
100+
101+ return 0;
102+}
103+
104+static const struct wiimod_ops wiimod_keys = {
105+ .flags = WIIMOD_FLAG_INPUT,
106+ .arg = 0,
107+ .probe = wiimod_keys_probe,
108+ .remove = NULL,
109+ .in_keys = wiimod_keys_in_keys,
110+};
111+
112+/*
113+ * Rumble
114+ * Nearly all devices provide a rumble feature. A small motor for
115+ * force-feedback effects. We provide an FF_RUMBLE memless ff device on the
116+ * shared input device if this module is loaded.
117+ * The rumble motor is controlled via a flag on almost every output report so
118+ * the wiimote core handles the rumble flag. But if a device doesn't provide
119+ * the rumble motor, this flag shouldn't be set.
120+ */
121+
122+static int wiimod_rumble_play(struct input_dev *dev, void *data,
123+ struct ff_effect *eff)
124+{
125+ struct wiimote_data *wdata = input_get_drvdata(dev);
126+ __u8 value;
127+ unsigned long flags;
128+
129+ /*
130+ * The wiimote supports only a single rumble motor so if any magnitude
131+ * is set to non-zero then we start the rumble motor. If both are set to
132+ * zero, we stop the rumble motor.
133+ */
134+
135+ if (eff->u.rumble.strong_magnitude || eff->u.rumble.weak_magnitude)
136+ value = 1;
137+ else
138+ value = 0;
139+
140+ spin_lock_irqsave(&wdata->state.lock, flags);
141+ wiiproto_req_rumble(wdata, value);
142+ spin_unlock_irqrestore(&wdata->state.lock, flags);
143+
144+ return 0;
145+}
146+
147+static int wiimod_rumble_probe(const struct wiimod_ops *ops,
148+ struct wiimote_data *wdata)
149+{
150+ set_bit(FF_RUMBLE, wdata->input->ffbit);
151+ if (input_ff_create_memless(wdata->input, NULL, wiimod_rumble_play))
152+ return -ENOMEM;
153+
154+ return 0;
155+}
156+
157+static void wiimod_rumble_remove(const struct wiimod_ops *ops,
158+ struct wiimote_data *wdata)
159+{
160+ unsigned long flags;
161+
162+ spin_lock_irqsave(&wdata->state.lock, flags);
163+ wiiproto_req_rumble(wdata, 0);
164+ spin_unlock_irqrestore(&wdata->state.lock, flags);
165+}
166+
167+static const struct wiimod_ops wiimod_rumble = {
168+ .flags = WIIMOD_FLAG_INPUT,
169+ .arg = 0,
170+ .probe = wiimod_rumble_probe,
171+ .remove = wiimod_rumble_remove,
172+};
173+
174+/*
175+ * Battery
176+ * 1 byte of battery capacity information is sent along every protocol status
177+ * report. The wiimote core caches it but we try to update it on every
178+ * user-space request.
179+ * This is supported by nearly every device so it's almost always enabled.
180+ */
181+
182+static enum power_supply_property wiimod_battery_props[] = {
183+ POWER_SUPPLY_PROP_CAPACITY,
184+ POWER_SUPPLY_PROP_SCOPE,
185+};
186+
187+static int wiimod_battery_get_property(struct power_supply *psy,
188+ enum power_supply_property psp,
189+ union power_supply_propval *val)
190+{
191+ struct wiimote_data *wdata = container_of(psy, struct wiimote_data,
192+ battery);
193+ int ret = 0, state;
194+ unsigned long flags;
195+
196+ if (psp == POWER_SUPPLY_PROP_SCOPE) {
197+ val->intval = POWER_SUPPLY_SCOPE_DEVICE;
198+ return 0;
199+ } else if (psp != POWER_SUPPLY_PROP_CAPACITY) {
200+ return -EINVAL;
201+ }
202+
203+ ret = wiimote_cmd_acquire(wdata);
204+ if (ret)
205+ return ret;
206+
207+ spin_lock_irqsave(&wdata->state.lock, flags);
208+ wiimote_cmd_set(wdata, WIIPROTO_REQ_SREQ, 0);
209+ wiiproto_req_status(wdata);
210+ spin_unlock_irqrestore(&wdata->state.lock, flags);
211+
212+ wiimote_cmd_wait(wdata);
213+ wiimote_cmd_release(wdata);
214+
215+ spin_lock_irqsave(&wdata->state.lock, flags);
216+ state = wdata->state.cmd_battery;
217+ spin_unlock_irqrestore(&wdata->state.lock, flags);
218+
219+ val->intval = state * 100 / 255;
220+ return ret;
221+}
222+
223+static int wiimod_battery_probe(const struct wiimod_ops *ops,
224+ struct wiimote_data *wdata)
225+{
226+ int ret;
227+
228+ wdata->battery.properties = wiimod_battery_props;
229+ wdata->battery.num_properties = ARRAY_SIZE(wiimod_battery_props);
230+ wdata->battery.get_property = wiimod_battery_get_property;
231+ wdata->battery.type = POWER_SUPPLY_TYPE_BATTERY;
232+ wdata->battery.use_for_apm = 0;
233+ wdata->battery.name = kasprintf(GFP_KERNEL, "wiimote_battery_%s",
234+ wdata->hdev->uniq);
235+ if (!wdata->battery.name)
236+ return -ENOMEM;
237+
238+ ret = power_supply_register(&wdata->hdev->dev, &wdata->battery);
239+ if (ret) {
240+ hid_err(wdata->hdev, "cannot register battery device\n");
241+ goto err_free;
242+ }
243+
244+ power_supply_powers(&wdata->battery, &wdata->hdev->dev);
245+ return 0;
246+
247+err_free:
248+ kfree(wdata->battery.name);
249+ wdata->battery.name = NULL;
250+ return ret;
251+}
252+
253+static void wiimod_battery_remove(const struct wiimod_ops *ops,
254+ struct wiimote_data *wdata)
255+{
256+ if (!wdata->battery.name)
257+ return;
258+
259+ power_supply_unregister(&wdata->battery);
260+ kfree(wdata->battery.name);
261+ wdata->battery.name = NULL;
262+}
263+
264+static const struct wiimod_ops wiimod_battery = {
265+ .flags = 0,
266+ .arg = 0,
267+ .probe = wiimod_battery_probe,
268+ .remove = wiimod_battery_remove,
269+};
270+
271+/*
272+ * LED
273+ * 0 to 4 player LEDs are supported by devices. The "arg" field of the
274+ * wiimod_ops structure specifies which LED this module controls. This allows
275+ * to register a limited number of LEDs.
276+ * State is managed by wiimote core.
277+ */
278+
279+static enum led_brightness wiimod_led_get(struct led_classdev *led_dev)
280+{
281+ struct wiimote_data *wdata;
282+ struct device *dev = led_dev->dev->parent;
283+ int i;
284+ unsigned long flags;
285+ bool value = false;
286+
287+ wdata = hid_get_drvdata(container_of(dev, struct hid_device, dev));
288+
289+ for (i = 0; i < 4; ++i) {
290+ if (wdata->leds[i] == led_dev) {
291+ spin_lock_irqsave(&wdata->state.lock, flags);
292+ value = wdata->state.flags & WIIPROTO_FLAG_LED(i + 1);
293+ spin_unlock_irqrestore(&wdata->state.lock, flags);
294+ break;
295+ }
296+ }
297+
298+ return value ? LED_FULL : LED_OFF;
299+}
300+
301+static void wiimod_led_set(struct led_classdev *led_dev,
302+ enum led_brightness value)
303+{
304+ struct wiimote_data *wdata;
305+ struct device *dev = led_dev->dev->parent;
306+ int i;
307+ unsigned long flags;
308+ __u8 state, flag;
309+
310+ wdata = hid_get_drvdata(container_of(dev, struct hid_device, dev));
311+
312+ for (i = 0; i < 4; ++i) {
313+ if (wdata->leds[i] == led_dev) {
314+ flag = WIIPROTO_FLAG_LED(i + 1);
315+ spin_lock_irqsave(&wdata->state.lock, flags);
316+ state = wdata->state.flags;
317+ if (value == LED_OFF)
318+ wiiproto_req_leds(wdata, state & ~flag);
319+ else
320+ wiiproto_req_leds(wdata, state | flag);
321+ spin_unlock_irqrestore(&wdata->state.lock, flags);
322+ break;
323+ }
324+ }
325+}
326+
327+static int wiimod_led_probe(const struct wiimod_ops *ops,
328+ struct wiimote_data *wdata)
329+{
330+ struct device *dev = &wdata->hdev->dev;
331+ size_t namesz = strlen(dev_name(dev)) + 9;
332+ struct led_classdev *led;
333+ unsigned long flags;
334+ char *name;
335+ int ret;
336+
337+ led = kzalloc(sizeof(struct led_classdev) + namesz, GFP_KERNEL);
338+ if (!led)
339+ return -ENOMEM;
340+
341+ name = (void*)&led[1];
342+ snprintf(name, namesz, "%s:blue:p%lu", dev_name(dev), ops->arg);
343+ led->name = name;
344+ led->brightness = 0;
345+ led->max_brightness = 1;
346+ led->brightness_get = wiimod_led_get;
347+ led->brightness_set = wiimod_led_set;
348+
349+ wdata->leds[ops->arg] = led;
350+ ret = led_classdev_register(dev, led);
351+ if (ret)
352+ goto err_free;
353+
354+ /* enable LED1 to stop initial LED-blinking */
355+ if (ops->arg == 0) {
356+ spin_lock_irqsave(&wdata->state.lock, flags);
357+ wiiproto_req_leds(wdata, WIIPROTO_FLAG_LED1);
358+ spin_unlock_irqrestore(&wdata->state.lock, flags);
359+ }
360+
361+ return 0;
362+
363+err_free:
364+ wdata->leds[ops->arg] = NULL;
365+ kfree(led);
366+ return ret;
367+}
368+
369+static void wiimod_led_remove(const struct wiimod_ops *ops,
370+ struct wiimote_data *wdata)
371+{
372+ if (!wdata->leds[ops->arg])
373+ return;
374+
375+ led_classdev_unregister(wdata->leds[ops->arg]);
376+ kfree(wdata->leds[ops->arg]);
377+ wdata->leds[ops->arg] = NULL;
378+}
379+
380+static const struct wiimod_ops wiimod_leds[4] = {
381+ {
382+ .flags = 0,
383+ .arg = 0,
384+ .probe = wiimod_led_probe,
385+ .remove = wiimod_led_remove,
386+ },
387+ {
388+ .flags = 0,
389+ .arg = 1,
390+ .probe = wiimod_led_probe,
391+ .remove = wiimod_led_remove,
392+ },
393+ {
394+ .flags = 0,
395+ .arg = 2,
396+ .probe = wiimod_led_probe,
397+ .remove = wiimod_led_remove,
398+ },
399+ {
400+ .flags = 0,
401+ .arg = 3,
402+ .probe = wiimod_led_probe,
403+ .remove = wiimod_led_remove,
404+ },
405+};
406+
407+/*
408+ * Accelerometer
409+ * 3 axis accelerometer data is part of nearly all DRMs. If not supported by a
410+ * device, it's mostly cleared to 0. This module parses this data and provides
411+ * it via a separate input device.
412+ */
413+
414+static void wiimod_accel_in_accel(struct wiimote_data *wdata,
415+ const __u8 *accel)
416+{
417+ __u16 x, y, z;
418+
419+ if (!(wdata->state.flags & WIIPROTO_FLAG_ACCEL))
420+ return;
421+
422+ /*
423+ * payload is: BB BB XX YY ZZ
424+ * Accelerometer data is encoded into 3 10bit values. XX, YY and ZZ
425+ * contain the upper 8 bits of each value. The lower 2 bits are
426+ * contained in the buttons data BB BB.
427+ * Bits 6 and 7 of the first buttons byte BB is the lower 2 bits of the
428+ * X accel value. Bit 5 of the second buttons byte is the 2nd bit of Y
429+ * accel value and bit 6 is the second bit of the Z value.
430+ * The first bit of Y and Z values is not available and always set to 0.
431+ * 0x200 is returned on no movement.
432+ */
433+
434+ x = accel[2] << 2;
435+ y = accel[3] << 2;
436+ z = accel[4] << 2;
437+
438+ x |= (accel[0] >> 5) & 0x3;
439+ y |= (accel[1] >> 4) & 0x2;
440+ z |= (accel[1] >> 5) & 0x2;
441+
442+ input_report_abs(wdata->accel, ABS_RX, x - 0x200);
443+ input_report_abs(wdata->accel, ABS_RY, y - 0x200);
444+ input_report_abs(wdata->accel, ABS_RZ, z - 0x200);
445+ input_sync(wdata->accel);
446+}
447+
448+static int wiimod_accel_open(struct input_dev *dev)
449+{
450+ struct wiimote_data *wdata = input_get_drvdata(dev);
451+ unsigned long flags;
452+
453+ spin_lock_irqsave(&wdata->state.lock, flags);
454+ wiiproto_req_accel(wdata, true);
455+ spin_unlock_irqrestore(&wdata->state.lock, flags);
456+
457+ return 0;
458+}
459+
460+static void wiimod_accel_close(struct input_dev *dev)
461+{
462+ struct wiimote_data *wdata = input_get_drvdata(dev);
463+ unsigned long flags;
464+
465+ spin_lock_irqsave(&wdata->state.lock, flags);
466+ wiiproto_req_accel(wdata, false);
467+ spin_unlock_irqrestore(&wdata->state.lock, flags);
468+}
469+
470+static int wiimod_accel_probe(const struct wiimod_ops *ops,
471+ struct wiimote_data *wdata)
472+{
473+ int ret;
474+
475+ wdata->accel = input_allocate_device();
476+ if (!wdata->accel)
477+ return -ENOMEM;
478+
479+ input_set_drvdata(wdata->accel, wdata);
480+ wdata->accel->open = wiimod_accel_open;
481+ wdata->accel->close = wiimod_accel_close;
482+ wdata->accel->dev.parent = &wdata->hdev->dev;
483+ wdata->accel->id.bustype = wdata->hdev->bus;
484+ wdata->accel->id.vendor = wdata->hdev->vendor;
485+ wdata->accel->id.product = wdata->hdev->product;
486+ wdata->accel->id.version = wdata->hdev->version;
487+ wdata->accel->name = WIIMOTE_NAME " Accelerometer";
488+
489+ set_bit(EV_ABS, wdata->accel->evbit);
490+ set_bit(ABS_RX, wdata->accel->absbit);
491+ set_bit(ABS_RY, wdata->accel->absbit);
492+ set_bit(ABS_RZ, wdata->accel->absbit);
493+ input_set_abs_params(wdata->accel, ABS_RX, -500, 500, 2, 4);
494+ input_set_abs_params(wdata->accel, ABS_RY, -500, 500, 2, 4);
495+ input_set_abs_params(wdata->accel, ABS_RZ, -500, 500, 2, 4);
496+
497+ ret = input_register_device(wdata->accel);
498+ if (ret) {
499+ hid_err(wdata->hdev, "cannot register input device\n");
500+ goto err_free;
501+ }
502+
503+ return 0;
504+
505+err_free:
506+ input_free_device(wdata->accel);
507+ wdata->accel = NULL;
508+ return ret;
509+}
510+
511+static void wiimod_accel_remove(const struct wiimod_ops *ops,
512+ struct wiimote_data *wdata)
513+{
514+ if (!wdata->accel)
515+ return;
516+
517+ input_unregister_device(wdata->accel);
518+ wdata->accel = NULL;
519+}
520+
521+static const struct wiimod_ops wiimod_accel = {
522+ .flags = 0,
523+ .arg = 0,
524+ .probe = wiimod_accel_probe,
525+ .remove = wiimod_accel_remove,
526+ .in_accel = wiimod_accel_in_accel,
527+};
528+
529+/*
530+ * IR Cam
531+ * Up to 4 IR sources can be tracked by a normal Wii Remote. The IR cam needs
532+ * to be initialized with a fairly complex procedure and consumes a lot of
533+ * power. Therefore, as long as no application uses the IR input device, it is
534+ * kept offline.
535+ * Nearly no other device than the normal Wii Remotes supports the IR cam so
536+ * you can disable this module for these devices.
537+ */
538+
539+static void wiimod_ir_in_ir(struct wiimote_data *wdata, const __u8 *ir,
540+ bool packed, unsigned int id)
541+{
542+ __u16 x, y;
543+ __u8 xid, yid;
544+ bool sync = false;
545+
546+ if (!(wdata->state.flags & WIIPROTO_FLAGS_IR))
547+ return;
548+
549+ switch (id) {
550+ case 0:
551+ xid = ABS_HAT0X;
552+ yid = ABS_HAT0Y;
553+ break;
554+ case 1:
555+ xid = ABS_HAT1X;
556+ yid = ABS_HAT1Y;
557+ break;
558+ case 2:
559+ xid = ABS_HAT2X;
560+ yid = ABS_HAT2Y;
561+ break;
562+ case 3:
563+ xid = ABS_HAT3X;
564+ yid = ABS_HAT3Y;
565+ sync = true;
566+ break;
567+ default:
568+ return;
569+ }
570+
571+ /*
572+ * Basic IR data is encoded into 3 bytes. The first two bytes are the
573+ * lower 8 bit of the X/Y data, the 3rd byte contains the upper 2 bits
574+ * of both.
575+ * If data is packed, then the 3rd byte is put first and slightly
576+ * reordered. This allows to interleave packed and non-packed data to
577+ * have two IR sets in 5 bytes instead of 6.
578+ * The resulting 10bit X/Y values are passed to the ABS_HAT? input dev.
579+ */
580+
581+ if (packed) {
582+ x = ir[1] | ((ir[0] & 0x03) << 8);
583+ y = ir[2] | ((ir[0] & 0x0c) << 6);
584+ } else {
585+ x = ir[0] | ((ir[2] & 0x30) << 4);
586+ y = ir[1] | ((ir[2] & 0xc0) << 2);
587+ }
588+
589+ input_report_abs(wdata->ir, xid, x);
590+ input_report_abs(wdata->ir, yid, y);
591+
592+ if (sync)
593+ input_sync(wdata->ir);
594+}
595+
596+static int wiimod_ir_change(struct wiimote_data *wdata, __u16 mode)
597+{
598+ int ret;
599+ unsigned long flags;
600+ __u8 format = 0;
601+ static const __u8 data_enable[] = { 0x01 };
602+ static const __u8 data_sens1[] = { 0x02, 0x00, 0x00, 0x71, 0x01,
603+ 0x00, 0xaa, 0x00, 0x64 };
604+ static const __u8 data_sens2[] = { 0x63, 0x03 };
605+ static const __u8 data_fin[] = { 0x08 };
606+
607+ spin_lock_irqsave(&wdata->state.lock, flags);
608+
609+ if (mode == (wdata->state.flags & WIIPROTO_FLAGS_IR)) {
610+ spin_unlock_irqrestore(&wdata->state.lock, flags);
611+ return 0;
612+ }
613+
614+ if (mode == 0) {
615+ wdata->state.flags &= ~WIIPROTO_FLAGS_IR;
616+ wiiproto_req_ir1(wdata, 0);
617+ wiiproto_req_ir2(wdata, 0);
618+ wiiproto_req_drm(wdata, WIIPROTO_REQ_NULL);
619+ spin_unlock_irqrestore(&wdata->state.lock, flags);
620+ return 0;
621+ }
622+
623+ spin_unlock_irqrestore(&wdata->state.lock, flags);
624+
625+ ret = wiimote_cmd_acquire(wdata);
626+ if (ret)
627+ return ret;
628+
629+ /* send PIXEL CLOCK ENABLE cmd first */
630+ spin_lock_irqsave(&wdata->state.lock, flags);
631+ wiimote_cmd_set(wdata, WIIPROTO_REQ_IR1, 0);
632+ wiiproto_req_ir1(wdata, 0x06);
633+ spin_unlock_irqrestore(&wdata->state.lock, flags);
634+
635+ ret = wiimote_cmd_wait(wdata);
636+ if (ret)
637+ goto unlock;
638+ if (wdata->state.cmd_err) {
639+ ret = -EIO;
640+ goto unlock;
641+ }
642+
643+ /* enable IR LOGIC */
644+ spin_lock_irqsave(&wdata->state.lock, flags);
645+ wiimote_cmd_set(wdata, WIIPROTO_REQ_IR2, 0);
646+ wiiproto_req_ir2(wdata, 0x06);
647+ spin_unlock_irqrestore(&wdata->state.lock, flags);
648+
649+ ret = wiimote_cmd_wait(wdata);
650+ if (ret)
651+ goto unlock;
652+ if (wdata->state.cmd_err) {
653+ ret = -EIO;
654+ goto unlock;
655+ }
656+
657+ /* enable IR cam but do not make it send data, yet */
658+ ret = wiimote_cmd_write(wdata, 0xb00030, data_enable,
659+ sizeof(data_enable));
660+ if (ret)
661+ goto unlock;
662+
663+ /* write first sensitivity block */
664+ ret = wiimote_cmd_write(wdata, 0xb00000, data_sens1,
665+ sizeof(data_sens1));
666+ if (ret)
667+ goto unlock;
668+
669+ /* write second sensitivity block */
670+ ret = wiimote_cmd_write(wdata, 0xb0001a, data_sens2,
671+ sizeof(data_sens2));
672+ if (ret)
673+ goto unlock;
674+
675+ /* put IR cam into desired state */
676+ switch (mode) {
677+ case WIIPROTO_FLAG_IR_FULL:
678+ format = 5;
679+ break;
680+ case WIIPROTO_FLAG_IR_EXT:
681+ format = 3;
682+ break;
683+ case WIIPROTO_FLAG_IR_BASIC:
684+ format = 1;
685+ break;
686+ }
687+ ret = wiimote_cmd_write(wdata, 0xb00033, &format, sizeof(format));
688+ if (ret)
689+ goto unlock;
690+
691+ /* make IR cam send data */
692+ ret = wiimote_cmd_write(wdata, 0xb00030, data_fin, sizeof(data_fin));
693+ if (ret)
694+ goto unlock;
695+
696+ /* request new DRM mode compatible to IR mode */
697+ spin_lock_irqsave(&wdata->state.lock, flags);
698+ wdata->state.flags &= ~WIIPROTO_FLAGS_IR;
699+ wdata->state.flags |= mode & WIIPROTO_FLAGS_IR;
700+ wiiproto_req_drm(wdata, WIIPROTO_REQ_NULL);
701+ spin_unlock_irqrestore(&wdata->state.lock, flags);
702+
703+unlock:
704+ wiimote_cmd_release(wdata);
705+ return ret;
706+}
707+
708+static int wiimod_ir_open(struct input_dev *dev)
709+{
710+ struct wiimote_data *wdata = input_get_drvdata(dev);
711+
712+ return wiimod_ir_change(wdata, WIIPROTO_FLAG_IR_BASIC);
713+}
714+
715+static void wiimod_ir_close(struct input_dev *dev)
716+{
717+ struct wiimote_data *wdata = input_get_drvdata(dev);
718+
719+ wiimod_ir_change(wdata, 0);
720+}
721+
722+static int wiimod_ir_probe(const struct wiimod_ops *ops,
723+ struct wiimote_data *wdata)
724+{
725+ int ret;
726+
727+ wdata->ir = input_allocate_device();
728+ if (!wdata->ir)
729+ return -ENOMEM;
730+
731+ input_set_drvdata(wdata->ir, wdata);
732+ wdata->ir->open = wiimod_ir_open;
733+ wdata->ir->close = wiimod_ir_close;
734+ wdata->ir->dev.parent = &wdata->hdev->dev;
735+ wdata->ir->id.bustype = wdata->hdev->bus;
736+ wdata->ir->id.vendor = wdata->hdev->vendor;
737+ wdata->ir->id.product = wdata->hdev->product;
738+ wdata->ir->id.version = wdata->hdev->version;
739+ wdata->ir->name = WIIMOTE_NAME " IR";
740+
741+ set_bit(EV_ABS, wdata->ir->evbit);
742+ set_bit(ABS_HAT0X, wdata->ir->absbit);
743+ set_bit(ABS_HAT0Y, wdata->ir->absbit);
744+ set_bit(ABS_HAT1X, wdata->ir->absbit);
745+ set_bit(ABS_HAT1Y, wdata->ir->absbit);
746+ set_bit(ABS_HAT2X, wdata->ir->absbit);
747+ set_bit(ABS_HAT2Y, wdata->ir->absbit);
748+ set_bit(ABS_HAT3X, wdata->ir->absbit);
749+ set_bit(ABS_HAT3Y, wdata->ir->absbit);
750+ input_set_abs_params(wdata->ir, ABS_HAT0X, 0, 1023, 2, 4);
751+ input_set_abs_params(wdata->ir, ABS_HAT0Y, 0, 767, 2, 4);
752+ input_set_abs_params(wdata->ir, ABS_HAT1X, 0, 1023, 2, 4);
753+ input_set_abs_params(wdata->ir, ABS_HAT1Y, 0, 767, 2, 4);
754+ input_set_abs_params(wdata->ir, ABS_HAT2X, 0, 1023, 2, 4);
755+ input_set_abs_params(wdata->ir, ABS_HAT2Y, 0, 767, 2, 4);
756+ input_set_abs_params(wdata->ir, ABS_HAT3X, 0, 1023, 2, 4);
757+ input_set_abs_params(wdata->ir, ABS_HAT3Y, 0, 767, 2, 4);
758+
759+ ret = input_register_device(wdata->ir);
760+ if (ret) {
761+ hid_err(wdata->hdev, "cannot register input device\n");
762+ goto err_free;
763+ }
764+
765+ return 0;
766+
767+err_free:
768+ input_free_device(wdata->ir);
769+ wdata->ir = NULL;
770+ return ret;
771+}
772+
773+static void wiimod_ir_remove(const struct wiimod_ops *ops,
774+ struct wiimote_data *wdata)
775+{
776+ if (!wdata->ir)
777+ return;
778+
779+ input_unregister_device(wdata->ir);
780+ wdata->ir = NULL;
781+}
782+
783+static const struct wiimod_ops wiimod_ir = {
784+ .flags = 0,
785+ .arg = 0,
786+ .probe = wiimod_ir_probe,
787+ .remove = wiimod_ir_remove,
788+ .in_ir = wiimod_ir_in_ir,
789+};
790+
791+/*
792+ * Nunchuk Extension
793+ * The Nintendo Wii Nunchuk was the first official extension published by
794+ * Nintendo. It provides two additional keys and a separate accelerometer. It
795+ * can be hotplugged to standard Wii Remotes.
796+ */
797+
798+enum wiimod_nunchuk_keys {
799+ WIIMOD_NUNCHUK_KEY_C,
800+ WIIMOD_NUNCHUK_KEY_Z,
801+ WIIMOD_NUNCHUK_KEY_NUM,
802+};
803+
804+static const __u16 wiimod_nunchuk_map[] = {
805+ BTN_C, /* WIIMOD_NUNCHUK_KEY_C */
806+ BTN_Z, /* WIIMOD_NUNCHUK_KEY_Z */
807+};
808+
809+static void wiimod_nunchuk_in_ext(struct wiimote_data *wdata, const __u8 *ext)
810+{
811+ __s16 x, y, z, bx, by;
812+
813+ /* Byte | 8 7 | 6 5 | 4 3 | 2 | 1 |
814+ * -----+----------+---------+---------+----+-----+
815+ * 1 | Button X <7:0> |
816+ * 2 | Button Y <7:0> |
817+ * -----+----------+---------+---------+----+-----+
818+ * 3 | Speed X <9:2> |
819+ * 4 | Speed Y <9:2> |
820+ * 5 | Speed Z <9:2> |
821+ * -----+----------+---------+---------+----+-----+
822+ * 6 | Z <1:0> | Y <1:0> | X <1:0> | BC | BZ |
823+ * -----+----------+---------+---------+----+-----+
824+ * Button X/Y is the analog stick. Speed X, Y and Z are the
825+ * accelerometer data in the same format as the wiimote's accelerometer.
826+ * The 6th byte contains the LSBs of the accelerometer data.
827+ * BC and BZ are the C and Z buttons: 0 means pressed
828+ *
829+ * If reported interleaved with motionp, then the layout changes. The
830+ * 5th and 6th byte changes to:
831+ * -----+-----------------------------------+-----+
832+ * 5 | Speed Z <9:3> | EXT |
833+ * -----+--------+-----+-----+----+----+----+-----+
834+ * 6 |Z <2:1> |Y <1>|X <1>| BC | BZ | 0 | 0 |
835+ * -----+--------+-----+-----+----+----+----+-----+
836+ * All three accelerometer values lose their LSB. The other data is
837+ * still available but slightly moved.
838+ *
839+ * Center data for button values is 128. Center value for accelerometer
840+ * values it 512 / 0x200
841+ */
842+
843+ bx = ext[0];
844+ by = ext[1];
845+ bx -= 128;
846+ by -= 128;
847+
848+ x = ext[2] << 2;
849+ y = ext[3] << 2;
850+ z = ext[4] << 2;
851+
852+ if (wdata->state.flags & WIIPROTO_FLAG_MP_ACTIVE) {
853+ x |= (ext[5] >> 3) & 0x02;
854+ y |= (ext[5] >> 4) & 0x02;
855+ z &= ~0x4;
856+ z |= (ext[5] >> 5) & 0x06;
857+ } else {
858+ x |= (ext[5] >> 2) & 0x03;
859+ y |= (ext[5] >> 4) & 0x03;
860+ z |= (ext[5] >> 6) & 0x03;
861+ }
862+
863+ x -= 0x200;
864+ y -= 0x200;
865+ z -= 0x200;
866+
867+ input_report_abs(wdata->extension.input, ABS_HAT0X, bx);
868+ input_report_abs(wdata->extension.input, ABS_HAT0Y, by);
869+
870+ input_report_abs(wdata->extension.input, ABS_RX, x);
871+ input_report_abs(wdata->extension.input, ABS_RY, y);
872+ input_report_abs(wdata->extension.input, ABS_RZ, z);
873+
874+ if (wdata->state.flags & WIIPROTO_FLAG_MP_ACTIVE) {
875+ input_report_key(wdata->extension.input,
876+ wiimod_nunchuk_map[WIIMOD_NUNCHUK_KEY_Z],
877+ !(ext[5] & 0x04));
878+ input_report_key(wdata->extension.input,
879+ wiimod_nunchuk_map[WIIMOD_NUNCHUK_KEY_C],
880+ !(ext[5] & 0x08));
881+ } else {
882+ input_report_key(wdata->extension.input,
883+ wiimod_nunchuk_map[WIIMOD_NUNCHUK_KEY_Z],
884+ !(ext[5] & 0x01));
885+ input_report_key(wdata->extension.input,
886+ wiimod_nunchuk_map[WIIMOD_NUNCHUK_KEY_C],
887+ !(ext[5] & 0x02));
888+ }
889+
890+ input_sync(wdata->extension.input);
891+}
892+
893+static int wiimod_nunchuk_open(struct input_dev *dev)
894+{
895+ struct wiimote_data *wdata = input_get_drvdata(dev);
896+ unsigned long flags;
897+
898+ spin_lock_irqsave(&wdata->state.lock, flags);
899+ wdata->state.flags |= WIIPROTO_FLAG_EXT_USED;
900+ wiiproto_req_drm(wdata, WIIPROTO_REQ_NULL);
901+ spin_unlock_irqrestore(&wdata->state.lock, flags);
902+
903+ return 0;
904+}
905+
906+static void wiimod_nunchuk_close(struct input_dev *dev)
907+{
908+ struct wiimote_data *wdata = input_get_drvdata(dev);
909+ unsigned long flags;
910+
911+ spin_lock_irqsave(&wdata->state.lock, flags);
912+ wdata->state.flags &= ~WIIPROTO_FLAG_EXT_USED;
913+ wiiproto_req_drm(wdata, WIIPROTO_REQ_NULL);
914+ spin_unlock_irqrestore(&wdata->state.lock, flags);
915+}
916+
917+static int wiimod_nunchuk_probe(const struct wiimod_ops *ops,
918+ struct wiimote_data *wdata)
919+{
920+ int ret, i;
921+
922+ wdata->extension.input = input_allocate_device();
923+ if (!wdata->extension.input)
924+ return -ENOMEM;
925+
926+ input_set_drvdata(wdata->extension.input, wdata);
927+ wdata->extension.input->open = wiimod_nunchuk_open;
928+ wdata->extension.input->close = wiimod_nunchuk_close;
929+ wdata->extension.input->dev.parent = &wdata->hdev->dev;
930+ wdata->extension.input->id.bustype = wdata->hdev->bus;
931+ wdata->extension.input->id.vendor = wdata->hdev->vendor;
932+ wdata->extension.input->id.product = wdata->hdev->product;
933+ wdata->extension.input->id.version = wdata->hdev->version;
934+ wdata->extension.input->name = WIIMOTE_NAME " Nunchuk";
935+
936+ set_bit(EV_KEY, wdata->extension.input->evbit);
937+ for (i = 0; i < WIIMOD_NUNCHUK_KEY_NUM; ++i)
938+ set_bit(wiimod_nunchuk_map[i],
939+ wdata->extension.input->keybit);
940+
941+ set_bit(EV_ABS, wdata->extension.input->evbit);
942+ set_bit(ABS_HAT0X, wdata->extension.input->absbit);
943+ set_bit(ABS_HAT0Y, wdata->extension.input->absbit);
944+ input_set_abs_params(wdata->extension.input,
945+ ABS_HAT0X, -120, 120, 2, 4);
946+ input_set_abs_params(wdata->extension.input,
947+ ABS_HAT0Y, -120, 120, 2, 4);
948+ set_bit(ABS_RX, wdata->extension.input->absbit);
949+ set_bit(ABS_RY, wdata->extension.input->absbit);
950+ set_bit(ABS_RZ, wdata->extension.input->absbit);
951+ input_set_abs_params(wdata->extension.input,
952+ ABS_RX, -500, 500, 2, 4);
953+ input_set_abs_params(wdata->extension.input,
954+ ABS_RY, -500, 500, 2, 4);
955+ input_set_abs_params(wdata->extension.input,
956+ ABS_RZ, -500, 500, 2, 4);
957+
958+ ret = input_register_device(wdata->extension.input);
959+ if (ret)
960+ goto err_free;
961+
962+ return 0;
963+
964+err_free:
965+ input_free_device(wdata->extension.input);
966+ wdata->extension.input = NULL;
967+ return ret;
968+}
969+
970+static void wiimod_nunchuk_remove(const struct wiimod_ops *ops,
971+ struct wiimote_data *wdata)
972+{
973+ if (!wdata->extension.input)
974+ return;
975+
976+ input_unregister_device(wdata->extension.input);
977+ wdata->extension.input = NULL;
978+}
979+
980+static const struct wiimod_ops wiimod_nunchuk = {
981+ .flags = 0,
982+ .arg = 0,
983+ .probe = wiimod_nunchuk_probe,
984+ .remove = wiimod_nunchuk_remove,
985+ .in_ext = wiimod_nunchuk_in_ext,
986+};
987+
988+/*
989+ * Classic Controller
990+ * Another official extension from Nintendo. It provides a classic
991+ * gamecube-like controller that can be hotplugged on the Wii Remote.
992+ * It has several hardware buttons and switches that are all reported via
993+ * a normal extension device.
994+ */
995+
996+enum wiimod_classic_keys {
997+ WIIMOD_CLASSIC_KEY_A,
998+ WIIMOD_CLASSIC_KEY_B,
999+ WIIMOD_CLASSIC_KEY_X,
1000+ WIIMOD_CLASSIC_KEY_Y,
1001+ WIIMOD_CLASSIC_KEY_ZL,
1002+ WIIMOD_CLASSIC_KEY_ZR,
1003+ WIIMOD_CLASSIC_KEY_PLUS,
1004+ WIIMOD_CLASSIC_KEY_MINUS,
1005+ WIIMOD_CLASSIC_KEY_HOME,
1006+ WIIMOD_CLASSIC_KEY_LEFT,
1007+ WIIMOD_CLASSIC_KEY_RIGHT,
1008+ WIIMOD_CLASSIC_KEY_UP,
1009+ WIIMOD_CLASSIC_KEY_DOWN,
1010+ WIIMOD_CLASSIC_KEY_LT,
1011+ WIIMOD_CLASSIC_KEY_RT,
1012+ WIIMOD_CLASSIC_KEY_NUM,
1013+};
1014+
1015+static const __u16 wiimod_classic_map[] = {
1016+ BTN_A, /* WIIMOD_CLASSIC_KEY_A */
1017+ BTN_B, /* WIIMOD_CLASSIC_KEY_B */
1018+ BTN_X, /* WIIMOD_CLASSIC_KEY_X */
1019+ BTN_Y, /* WIIMOD_CLASSIC_KEY_Y */
1020+ BTN_TL2, /* WIIMOD_CLASSIC_KEY_ZL */
1021+ BTN_TR2, /* WIIMOD_CLASSIC_KEY_ZR */
1022+ KEY_NEXT, /* WIIMOD_CLASSIC_KEY_PLUS */
1023+ KEY_PREVIOUS, /* WIIMOD_CLASSIC_KEY_MINUS */
1024+ BTN_MODE, /* WIIMOD_CLASSIC_KEY_HOME */
1025+ KEY_LEFT, /* WIIMOD_CLASSIC_KEY_LEFT */
1026+ KEY_RIGHT, /* WIIMOD_CLASSIC_KEY_RIGHT */
1027+ KEY_UP, /* WIIMOD_CLASSIC_KEY_UP */
1028+ KEY_DOWN, /* WIIMOD_CLASSIC_KEY_DOWN */
1029+ BTN_TL, /* WIIMOD_CLASSIC_KEY_LT */
1030+ BTN_TR, /* WIIMOD_CLASSIC_KEY_RT */
1031+};
1032+
1033+static void wiimod_classic_in_ext(struct wiimote_data *wdata, const __u8 *ext)
1034+{
1035+ __s8 rx, ry, lx, ly, lt, rt;
1036+
1037+ /* Byte | 8 | 7 | 6 | 5 | 4 | 3 | 2 | 1 |
1038+ * -----+-----+-----+-----+-----+-----+-----+-----+-----+
1039+ * 1 | RX <5:4> | LX <5:0> |
1040+ * 2 | RX <3:2> | LY <5:0> |
1041+ * -----+-----+-----+-----+-----------------------------+
1042+ * 3 |RX<1>| LT <5:4> | RY <5:1> |
1043+ * -----+-----+-----------+-----------------------------+
1044+ * 4 | LT <3:1> | RT <5:1> |
1045+ * -----+-----+-----+-----+-----+-----+-----+-----+-----+
1046+ * 5 | BDR | BDD | BLT | B- | BH | B+ | BRT | 1 |
1047+ * -----+-----+-----+-----+-----+-----+-----+-----+-----+
1048+ * 6 | BZL | BB | BY | BA | BX | BZR | BDL | BDU |
1049+ * -----+-----+-----+-----+-----+-----+-----+-----+-----+
1050+ * All buttons are 0 if pressed
1051+ * RX and RY are right analog stick
1052+ * LX and LY are left analog stick
1053+ * LT is left trigger, RT is right trigger
1054+ * BLT is 0 if left trigger is fully pressed
1055+ * BRT is 0 if right trigger is fully pressed
1056+ * BDR, BDD, BDL, BDU form the D-Pad with right, down, left, up buttons
1057+ * BZL is left Z button and BZR is right Z button
1058+ * B-, BH, B+ are +, HOME and - buttons
1059+ * BB, BY, BA, BX are A, B, X, Y buttons
1060+ * LSB of RX, RY, LT, and RT are not transmitted and always 0.
1061+ *
1062+ * With motionp enabled it changes slightly to this:
1063+ * Byte | 8 | 7 | 6 | 5 | 4 | 3 | 2 | 1 |
1064+ * -----+-----+-----+-----+-----+-----+-----+-----+-----+
1065+ * 1 | RX <5:4> | LX <5:1> | BDU |
1066+ * 2 | RX <3:2> | LY <5:1> | BDL |
1067+ * -----+-----+-----+-----+-----------------------+-----+
1068+ * 3 |RX<1>| LT <5:4> | RY <5:1> |
1069+ * -----+-----+-----------+-----------------------------+
1070+ * 4 | LT <3:1> | RT <5:1> |
1071+ * -----+-----+-----+-----+-----+-----+-----+-----+-----+
1072+ * 5 | BDR | BDD | BLT | B- | BH | B+ | BRT | EXT |
1073+ * -----+-----+-----+-----+-----+-----+-----+-----+-----+
1074+ * 6 | BZL | BB | BY | BA | BX | BZR | 0 | 0 |
1075+ * -----+-----+-----+-----+-----+-----+-----+-----+-----+
1076+ * Only the LSBs of LX and LY are lost. BDU and BDL are moved, the rest
1077+ * is the same as before.
1078+ */
1079+
1080+ if (wdata->state.flags & WIIPROTO_FLAG_MP_ACTIVE) {
1081+ lx = ext[0] & 0x3e;
1082+ ly = ext[1] & 0x3e;
1083+ } else {
1084+ lx = ext[0] & 0x3f;
1085+ ly = ext[1] & 0x3f;
1086+ }
1087+
1088+ rx = (ext[0] >> 3) & 0x18;
1089+ rx |= (ext[1] >> 5) & 0x06;
1090+ rx |= (ext[2] >> 7) & 0x01;
1091+ ry = ext[2] & 0x1f;
1092+
1093+ rt = ext[3] & 0x1f;
1094+ lt = (ext[2] >> 2) & 0x18;
1095+ lt |= (ext[3] >> 5) & 0x07;
1096+
1097+ rx <<= 1;
1098+ ry <<= 1;
1099+ rt <<= 1;
1100+ lt <<= 1;
1101+
1102+ input_report_abs(wdata->extension.input, ABS_HAT1X, lx - 0x20);
1103+ input_report_abs(wdata->extension.input, ABS_HAT1Y, ly - 0x20);
1104+ input_report_abs(wdata->extension.input, ABS_HAT2X, rx - 0x20);
1105+ input_report_abs(wdata->extension.input, ABS_HAT2Y, ry - 0x20);
1106+ input_report_abs(wdata->extension.input, ABS_HAT3X, rt);
1107+ input_report_abs(wdata->extension.input, ABS_HAT3Y, lt);
1108+
1109+ input_report_key(wdata->extension.input,
1110+ wiimod_classic_map[WIIMOD_CLASSIC_KEY_RIGHT],
1111+ !(ext[4] & 0x80));
1112+ input_report_key(wdata->extension.input,
1113+ wiimod_classic_map[WIIMOD_CLASSIC_KEY_DOWN],
1114+ !(ext[4] & 0x40));
1115+ input_report_key(wdata->extension.input,
1116+ wiimod_classic_map[WIIMOD_CLASSIC_KEY_LT],
1117+ !(ext[4] & 0x20));
1118+ input_report_key(wdata->extension.input,
1119+ wiimod_classic_map[WIIMOD_CLASSIC_KEY_MINUS],
1120+ !(ext[4] & 0x10));
1121+ input_report_key(wdata->extension.input,
1122+ wiimod_classic_map[WIIMOD_CLASSIC_KEY_HOME],
1123+ !(ext[4] & 0x08));
1124+ input_report_key(wdata->extension.input,
1125+ wiimod_classic_map[WIIMOD_CLASSIC_KEY_PLUS],
1126+ !(ext[4] & 0x04));
1127+ input_report_key(wdata->extension.input,
1128+ wiimod_classic_map[WIIMOD_CLASSIC_KEY_RT],
1129+ !(ext[4] & 0x02));
1130+ input_report_key(wdata->extension.input,
1131+ wiimod_classic_map[WIIMOD_CLASSIC_KEY_ZL],
1132+ !(ext[5] & 0x80));
1133+ input_report_key(wdata->extension.input,
1134+ wiimod_classic_map[WIIMOD_CLASSIC_KEY_B],
1135+ !(ext[5] & 0x40));
1136+ input_report_key(wdata->extension.input,
1137+ wiimod_classic_map[WIIMOD_CLASSIC_KEY_Y],
1138+ !(ext[5] & 0x20));
1139+ input_report_key(wdata->extension.input,
1140+ wiimod_classic_map[WIIMOD_CLASSIC_KEY_A],
1141+ !(ext[5] & 0x10));
1142+ input_report_key(wdata->extension.input,
1143+ wiimod_classic_map[WIIMOD_CLASSIC_KEY_X],
1144+ !(ext[5] & 0x08));
1145+ input_report_key(wdata->extension.input,
1146+ wiimod_classic_map[WIIMOD_CLASSIC_KEY_ZR],
1147+ !(ext[5] & 0x04));
1148+
1149+ if (wdata->state.flags & WIIPROTO_FLAG_MP_ACTIVE) {
1150+ input_report_key(wdata->extension.input,
1151+ wiimod_classic_map[WIIMOD_CLASSIC_KEY_LEFT],
1152+ !(ext[1] & 0x01));
1153+ input_report_key(wdata->extension.input,
1154+ wiimod_classic_map[WIIMOD_CLASSIC_KEY_UP],
1155+ !(ext[0] & 0x01));
1156+ } else {
1157+ input_report_key(wdata->extension.input,
1158+ wiimod_classic_map[WIIMOD_CLASSIC_KEY_LEFT],
1159+ !(ext[5] & 0x02));
1160+ input_report_key(wdata->extension.input,
1161+ wiimod_classic_map[WIIMOD_CLASSIC_KEY_UP],
1162+ !(ext[5] & 0x01));
1163+ }
1164+
1165+ input_sync(wdata->extension.input);
1166+}
1167+
1168+static int wiimod_classic_open(struct input_dev *dev)
1169+{
1170+ struct wiimote_data *wdata = input_get_drvdata(dev);
1171+ unsigned long flags;
1172+
1173+ spin_lock_irqsave(&wdata->state.lock, flags);
1174+ wdata->state.flags |= WIIPROTO_FLAG_EXT_USED;
1175+ wiiproto_req_drm(wdata, WIIPROTO_REQ_NULL);
1176+ spin_unlock_irqrestore(&wdata->state.lock, flags);
1177+
1178+ return 0;
1179+}
1180+
1181+static void wiimod_classic_close(struct input_dev *dev)
1182+{
1183+ struct wiimote_data *wdata = input_get_drvdata(dev);
1184+ unsigned long flags;
1185+
1186+ spin_lock_irqsave(&wdata->state.lock, flags);
1187+ wdata->state.flags &= ~WIIPROTO_FLAG_EXT_USED;
1188+ wiiproto_req_drm(wdata, WIIPROTO_REQ_NULL);
1189+ spin_unlock_irqrestore(&wdata->state.lock, flags);
1190+}
1191+
1192+static int wiimod_classic_probe(const struct wiimod_ops *ops,
1193+ struct wiimote_data *wdata)
1194+{
1195+ int ret, i;
1196+
1197+ wdata->extension.input = input_allocate_device();
1198+ if (!wdata->extension.input)
1199+ return -ENOMEM;
1200+
1201+ input_set_drvdata(wdata->extension.input, wdata);
1202+ wdata->extension.input->open = wiimod_classic_open;
1203+ wdata->extension.input->close = wiimod_classic_close;
1204+ wdata->extension.input->dev.parent = &wdata->hdev->dev;
1205+ wdata->extension.input->id.bustype = wdata->hdev->bus;
1206+ wdata->extension.input->id.vendor = wdata->hdev->vendor;
1207+ wdata->extension.input->id.product = wdata->hdev->product;
1208+ wdata->extension.input->id.version = wdata->hdev->version;
1209+ wdata->extension.input->name = WIIMOTE_NAME " Classic Controller";
1210+
1211+ set_bit(EV_KEY, wdata->extension.input->evbit);
1212+ for (i = 0; i < WIIMOD_CLASSIC_KEY_NUM; ++i)
1213+ set_bit(wiimod_classic_map[i],
1214+ wdata->extension.input->keybit);
1215+
1216+ set_bit(EV_ABS, wdata->extension.input->evbit);
1217+ set_bit(ABS_HAT1X, wdata->extension.input->absbit);
1218+ set_bit(ABS_HAT1Y, wdata->extension.input->absbit);
1219+ set_bit(ABS_HAT2X, wdata->extension.input->absbit);
1220+ set_bit(ABS_HAT2Y, wdata->extension.input->absbit);
1221+ set_bit(ABS_HAT3X, wdata->extension.input->absbit);
1222+ set_bit(ABS_HAT3Y, wdata->extension.input->absbit);
1223+ input_set_abs_params(wdata->extension.input,
1224+ ABS_HAT1X, -30, 30, 1, 1);
1225+ input_set_abs_params(wdata->extension.input,
1226+ ABS_HAT1Y, -30, 30, 1, 1);
1227+ input_set_abs_params(wdata->extension.input,
1228+ ABS_HAT2X, -30, 30, 1, 1);
1229+ input_set_abs_params(wdata->extension.input,
1230+ ABS_HAT2Y, -30, 30, 1, 1);
1231+ input_set_abs_params(wdata->extension.input,
1232+ ABS_HAT3X, -30, 30, 1, 1);
1233+ input_set_abs_params(wdata->extension.input,
1234+ ABS_HAT3Y, -30, 30, 1, 1);
1235+
1236+ ret = input_register_device(wdata->extension.input);
1237+ if (ret)
1238+ goto err_free;
1239+
1240+ return 0;
1241+
1242+err_free:
1243+ input_free_device(wdata->extension.input);
1244+ wdata->extension.input = NULL;
1245+ return ret;
1246+}
1247+
1248+static void wiimod_classic_remove(const struct wiimod_ops *ops,
1249+ struct wiimote_data *wdata)
1250+{
1251+ if (!wdata->extension.input)
1252+ return;
1253+
1254+ input_unregister_device(wdata->extension.input);
1255+ wdata->extension.input = NULL;
1256+}
1257+
1258+static const struct wiimod_ops wiimod_classic = {
1259+ .flags = 0,
1260+ .arg = 0,
1261+ .probe = wiimod_classic_probe,
1262+ .remove = wiimod_classic_remove,
1263+ .in_ext = wiimod_classic_in_ext,
1264+};
1265+
1266+/*
1267+ * Balance Board Extension
1268+ * The Nintendo Wii Balance Board provides four hardware weight sensor plus a
1269+ * single push button. No other peripherals are available. However, the
1270+ * balance-board data is sent via a standard Wii Remote extension. All other
1271+ * data for non-present hardware is zeroed out.
1272+ * Some 3rd party devices react allergic if we try to access normal Wii Remote
1273+ * hardware, so this extension module should be the only module that is loaded
1274+ * on balance boards.
1275+ * The balance board needs 8 bytes extension data instead of basic 6 bytes so
1276+ * it needs the WIIMOD_FLAG_EXT8 flag.
1277+ */
1278+
1279+static void wiimod_bboard_in_keys(struct wiimote_data *wdata, const __u8 *keys)
1280+{
1281+ input_report_key(wdata->extension.input, BTN_A,
1282+ !!(keys[1] & 0x08));
1283+ input_sync(wdata->extension.input);
1284+}
1285+
1286+static void wiimod_bboard_in_ext(struct wiimote_data *wdata,
1287+ const __u8 *ext)
1288+{
1289+ __s32 val[4], tmp, div;
1290+ unsigned int i;
1291+ struct wiimote_state *s = &wdata->state;
1292+
1293+ /*
1294+ * Balance board data layout:
1295+ *
1296+ * Byte | 8 7 6 5 4 3 2 1 |
1297+ * -----+--------------------------+
1298+ * 1 | Top Right <15:8> |
1299+ * 2 | Top Right <7:0> |
1300+ * -----+--------------------------+
1301+ * 3 | Bottom Right <15:8> |
1302+ * 4 | Bottom Right <7:0> |
1303+ * -----+--------------------------+
1304+ * 5 | Top Left <15:8> |
1305+ * 6 | Top Left <7:0> |
1306+ * -----+--------------------------+
1307+ * 7 | Bottom Left <15:8> |
1308+ * 8 | Bottom Left <7:0> |
1309+ * -----+--------------------------+
1310+ *
1311+ * These values represent the weight-measurements of the Wii-balance
1312+ * board with 16bit precision.
1313+ *
1314+ * The balance-board is never reported interleaved with motionp.
1315+ */
1316+
1317+ val[0] = ext[0];
1318+ val[0] <<= 8;
1319+ val[0] |= ext[1];
1320+
1321+ val[1] = ext[2];
1322+ val[1] <<= 8;
1323+ val[1] |= ext[3];
1324+
1325+ val[2] = ext[4];
1326+ val[2] <<= 8;
1327+ val[2] |= ext[5];
1328+
1329+ val[3] = ext[6];
1330+ val[3] <<= 8;
1331+ val[3] |= ext[7];
1332+
1333+ /* apply calibration data */
1334+ for (i = 0; i < 4; i++) {
1335+ if (val[i] <= s->calib_bboard[i][0]) {
1336+ tmp = 0;
1337+ } else if (val[i] < s->calib_bboard[i][1]) {
1338+ tmp = val[i] - s->calib_bboard[i][0];
1339+ tmp *= 1700;
1340+ div = s->calib_bboard[i][1] - s->calib_bboard[i][0];
1341+ tmp /= div ? div : 1;
1342+ } else {
1343+ tmp = val[i] - s->calib_bboard[i][1];
1344+ tmp *= 1700;
1345+ div = s->calib_bboard[i][2] - s->calib_bboard[i][1];
1346+ tmp /= div ? div : 1;
1347+ tmp += 1700;
1348+ }
1349+ val[i] = tmp;
1350+ }
1351+
1352+ input_report_abs(wdata->extension.input, ABS_HAT0X, val[0]);
1353+ input_report_abs(wdata->extension.input, ABS_HAT0Y, val[1]);
1354+ input_report_abs(wdata->extension.input, ABS_HAT1X, val[2]);
1355+ input_report_abs(wdata->extension.input, ABS_HAT1Y, val[3]);
1356+ input_sync(wdata->extension.input);
1357+}
1358+
1359+static int wiimod_bboard_open(struct input_dev *dev)
1360+{
1361+ struct wiimote_data *wdata = input_get_drvdata(dev);
1362+ unsigned long flags;
1363+
1364+ spin_lock_irqsave(&wdata->state.lock, flags);
1365+ wdata->state.flags |= WIIPROTO_FLAG_EXT_USED;
1366+ wiiproto_req_drm(wdata, WIIPROTO_REQ_NULL);
1367+ spin_unlock_irqrestore(&wdata->state.lock, flags);
1368+
1369+ return 0;
1370+}
1371+
1372+static void wiimod_bboard_close(struct input_dev *dev)
1373+{
1374+ struct wiimote_data *wdata = input_get_drvdata(dev);
1375+ unsigned long flags;
1376+
1377+ spin_lock_irqsave(&wdata->state.lock, flags);
1378+ wdata->state.flags &= ~WIIPROTO_FLAG_EXT_USED;
1379+ wiiproto_req_drm(wdata, WIIPROTO_REQ_NULL);
1380+ spin_unlock_irqrestore(&wdata->state.lock, flags);
1381+}
1382+
1383+static ssize_t wiimod_bboard_calib_show(struct device *dev,
1384+ struct device_attribute *attr,
1385+ char *out)
1386+{
1387+ struct wiimote_data *wdata = dev_to_wii(dev);
1388+ int i, j, ret;
1389+ __u16 val;
1390+ __u8 buf[24], offs;
1391+
1392+ ret = wiimote_cmd_acquire(wdata);
1393+ if (ret)
1394+ return ret;
1395+
1396+ ret = wiimote_cmd_read(wdata, 0xa40024, buf, 12);
1397+ if (ret != 12) {
1398+ wiimote_cmd_release(wdata);
1399+ return ret < 0 ? ret : -EIO;
1400+ }
1401+ ret = wiimote_cmd_read(wdata, 0xa40024 + 12, buf + 12, 12);
1402+ if (ret != 12) {
1403+ wiimote_cmd_release(wdata);
1404+ return ret < 0 ? ret : -EIO;
1405+ }
1406+
1407+ wiimote_cmd_release(wdata);
1408+
1409+ spin_lock_irq(&wdata->state.lock);
1410+ offs = 0;
1411+ for (i = 0; i < 3; ++i) {
1412+ for (j = 0; j < 4; ++j) {
1413+ wdata->state.calib_bboard[j][i] = buf[offs];
1414+ wdata->state.calib_bboard[j][i] <<= 8;
1415+ wdata->state.calib_bboard[j][i] |= buf[offs + 1];
1416+ offs += 2;
1417+ }
1418+ }
1419+ spin_unlock_irq(&wdata->state.lock);
1420+
1421+ ret = 0;
1422+ for (i = 0; i < 3; ++i) {
1423+ for (j = 0; j < 4; ++j) {
1424+ val = wdata->state.calib_bboard[j][i];
1425+ if (i == 2 && j == 3)
1426+ ret += sprintf(&out[ret], "%04x\n", val);
1427+ else
1428+ ret += sprintf(&out[ret], "%04x:", val);
1429+ }
1430+ }
1431+
1432+ return ret;
1433+}
1434+
1435+static DEVICE_ATTR(bboard_calib, S_IRUGO, wiimod_bboard_calib_show, NULL);
1436+
1437+static int wiimod_bboard_probe(const struct wiimod_ops *ops,
1438+ struct wiimote_data *wdata)
1439+{
1440+ int ret, i, j;
1441+ __u8 buf[24], offs;
1442+
1443+ wiimote_cmd_acquire_noint(wdata);
1444+
1445+ ret = wiimote_cmd_read(wdata, 0xa40024, buf, 12);
1446+ if (ret != 12) {
1447+ wiimote_cmd_release(wdata);
1448+ return ret < 0 ? ret : -EIO;
1449+ }
1450+ ret = wiimote_cmd_read(wdata, 0xa40024 + 12, buf + 12, 12);
1451+ if (ret != 12) {
1452+ wiimote_cmd_release(wdata);
1453+ return ret < 0 ? ret : -EIO;
1454+ }
1455+
1456+ wiimote_cmd_release(wdata);
1457+
1458+ offs = 0;
1459+ for (i = 0; i < 3; ++i) {
1460+ for (j = 0; j < 4; ++j) {
1461+ wdata->state.calib_bboard[j][i] = buf[offs];
1462+ wdata->state.calib_bboard[j][i] <<= 8;
1463+ wdata->state.calib_bboard[j][i] |= buf[offs + 1];
1464+ offs += 2;
1465+ }
1466+ }
1467+
1468+ wdata->extension.input = input_allocate_device();
1469+ if (!wdata->extension.input)
1470+ return -ENOMEM;
1471+
1472+ ret = device_create_file(&wdata->hdev->dev,
1473+ &dev_attr_bboard_calib);
1474+ if (ret) {
1475+ hid_err(wdata->hdev, "cannot create sysfs attribute\n");
1476+ goto err_free;
1477+ }
1478+
1479+ input_set_drvdata(wdata->extension.input, wdata);
1480+ wdata->extension.input->open = wiimod_bboard_open;
1481+ wdata->extension.input->close = wiimod_bboard_close;
1482+ wdata->extension.input->dev.parent = &wdata->hdev->dev;
1483+ wdata->extension.input->id.bustype = wdata->hdev->bus;
1484+ wdata->extension.input->id.vendor = wdata->hdev->vendor;
1485+ wdata->extension.input->id.product = wdata->hdev->product;
1486+ wdata->extension.input->id.version = wdata->hdev->version;
1487+ wdata->extension.input->name = WIIMOTE_NAME " Balance Board";
1488+
1489+ set_bit(EV_KEY, wdata->extension.input->evbit);
1490+ set_bit(BTN_A, wdata->extension.input->keybit);
1491+
1492+ set_bit(EV_ABS, wdata->extension.input->evbit);
1493+ set_bit(ABS_HAT0X, wdata->extension.input->absbit);
1494+ set_bit(ABS_HAT0Y, wdata->extension.input->absbit);
1495+ set_bit(ABS_HAT1X, wdata->extension.input->absbit);
1496+ set_bit(ABS_HAT1Y, wdata->extension.input->absbit);
1497+ input_set_abs_params(wdata->extension.input,
1498+ ABS_HAT0X, 0, 65535, 2, 4);
1499+ input_set_abs_params(wdata->extension.input,
1500+ ABS_HAT0Y, 0, 65535, 2, 4);
1501+ input_set_abs_params(wdata->extension.input,
1502+ ABS_HAT1X, 0, 65535, 2, 4);
1503+ input_set_abs_params(wdata->extension.input,
1504+ ABS_HAT1Y, 0, 65535, 2, 4);
1505+
1506+ ret = input_register_device(wdata->extension.input);
1507+ if (ret)
1508+ goto err_file;
1509+
1510+ return 0;
1511+
1512+err_file:
1513+ device_remove_file(&wdata->hdev->dev,
1514+ &dev_attr_bboard_calib);
1515+err_free:
1516+ input_free_device(wdata->extension.input);
1517+ wdata->extension.input = NULL;
1518+ return ret;
1519+}
1520+
1521+static void wiimod_bboard_remove(const struct wiimod_ops *ops,
1522+ struct wiimote_data *wdata)
1523+{
1524+ if (!wdata->extension.input)
1525+ return;
1526+
1527+ input_unregister_device(wdata->extension.input);
1528+ wdata->extension.input = NULL;
1529+ device_remove_file(&wdata->hdev->dev,
1530+ &dev_attr_bboard_calib);
1531+}
1532+
1533+static const struct wiimod_ops wiimod_bboard = {
1534+ .flags = WIIMOD_FLAG_EXT8,
1535+ .arg = 0,
1536+ .probe = wiimod_bboard_probe,
1537+ .remove = wiimod_bboard_remove,
1538+ .in_keys = wiimod_bboard_in_keys,
1539+ .in_ext = wiimod_bboard_in_ext,
1540+};
1541+
1542+/*
1543+ * Pro Controller
1544+ * Released with the Wii U was the Nintendo Wii U Pro Controller. It does not
1545+ * work together with the classic Wii, but only with the new Wii U. However, it
1546+ * uses the same protocol and provides a builtin "classic controller pro"
1547+ * extension, few standard buttons, a rumble motor, 4 LEDs and a battery.
1548+ * We provide all these via a standard extension device as the device doesn't
1549+ * feature an extension port.
1550+ */
1551+
1552+enum wiimod_pro_keys {
1553+ WIIMOD_PRO_KEY_A,
1554+ WIIMOD_PRO_KEY_B,
1555+ WIIMOD_PRO_KEY_X,
1556+ WIIMOD_PRO_KEY_Y,
1557+ WIIMOD_PRO_KEY_PLUS,
1558+ WIIMOD_PRO_KEY_MINUS,
1559+ WIIMOD_PRO_KEY_HOME,
1560+ WIIMOD_PRO_KEY_LEFT,
1561+ WIIMOD_PRO_KEY_RIGHT,
1562+ WIIMOD_PRO_KEY_UP,
1563+ WIIMOD_PRO_KEY_DOWN,
1564+ WIIMOD_PRO_KEY_TL,
1565+ WIIMOD_PRO_KEY_TR,
1566+ WIIMOD_PRO_KEY_ZL,
1567+ WIIMOD_PRO_KEY_ZR,
1568+ WIIMOD_PRO_KEY_THUMBL,
1569+ WIIMOD_PRO_KEY_THUMBR,
1570+ WIIMOD_PRO_KEY_NUM,
1571+};
1572+
1573+static const __u16 wiimod_pro_map[] = {
1574+ BTN_EAST, /* WIIMOD_PRO_KEY_A */
1575+ BTN_SOUTH, /* WIIMOD_PRO_KEY_B */
1576+ BTN_NORTH, /* WIIMOD_PRO_KEY_X */
1577+ BTN_WEST, /* WIIMOD_PRO_KEY_Y */
1578+ BTN_START, /* WIIMOD_PRO_KEY_PLUS */
1579+ BTN_SELECT, /* WIIMOD_PRO_KEY_MINUS */
1580+ BTN_MODE, /* WIIMOD_PRO_KEY_HOME */
1581+ BTN_DPAD_LEFT, /* WIIMOD_PRO_KEY_LEFT */
1582+ BTN_DPAD_RIGHT, /* WIIMOD_PRO_KEY_RIGHT */
1583+ BTN_DPAD_UP, /* WIIMOD_PRO_KEY_UP */
1584+ BTN_DPAD_DOWN, /* WIIMOD_PRO_KEY_DOWN */
1585+ BTN_TL, /* WIIMOD_PRO_KEY_TL */
1586+ BTN_TR, /* WIIMOD_PRO_KEY_TR */
1587+ BTN_TL2, /* WIIMOD_PRO_KEY_ZL */
1588+ BTN_TR2, /* WIIMOD_PRO_KEY_ZR */
1589+ BTN_THUMBL, /* WIIMOD_PRO_KEY_THUMBL */
1590+ BTN_THUMBR, /* WIIMOD_PRO_KEY_THUMBR */
1591+};
1592+
1593+static void wiimod_pro_in_ext(struct wiimote_data *wdata, const __u8 *ext)
1594+{
1595+ __s16 rx, ry, lx, ly;
1596+
1597+ /* Byte | 8 | 7 | 6 | 5 | 4 | 3 | 2 | 1 |
1598+ * -----+-----+-----+-----+-----+-----+-----+-----+-----+
1599+ * 1 | LX <7:0> |
1600+ * -----+-----------------------+-----------------------+
1601+ * 2 | 0 0 0 0 | LX <11:8> |
1602+ * -----+-----------------------+-----------------------+
1603+ * 3 | RX <7:0> |
1604+ * -----+-----------------------+-----------------------+
1605+ * 4 | 0 0 0 0 | RX <11:8> |
1606+ * -----+-----------------------+-----------------------+
1607+ * 5 | LY <7:0> |
1608+ * -----+-----------------------+-----------------------+
1609+ * 6 | 0 0 0 0 | LY <11:8> |
1610+ * -----+-----------------------+-----------------------+
1611+ * 7 | RY <7:0> |
1612+ * -----+-----------------------+-----------------------+
1613+ * 8 | 0 0 0 0 | RY <11:8> |
1614+ * -----+-----+-----+-----+-----+-----+-----+-----+-----+
1615+ * 9 | BDR | BDD | BLT | B- | BH | B+ | BRT | 1 |
1616+ * -----+-----+-----+-----+-----+-----+-----+-----+-----+
1617+ * 10 | BZL | BB | BY | BA | BX | BZR | BDL | BDU |
1618+ * -----+-----+-----+-----+-----+-----+-----+-----+-----+
1619+ * 11 | 1 | BATTERY | USB |CHARG|LTHUM|RTHUM|
1620+ * -----+-----+-----------------+-----------+-----+-----+
1621+ * All buttons are low-active (0 if pressed)
1622+ * RX and RY are right analog stick
1623+ * LX and LY are left analog stick
1624+ * BLT is left trigger, BRT is right trigger.
1625+ * BDR, BDD, BDL, BDU form the D-Pad with right, down, left, up buttons
1626+ * BZL is left Z button and BZR is right Z button
1627+ * B-, BH, B+ are +, HOME and - buttons
1628+ * BB, BY, BA, BX are A, B, X, Y buttons
1629+ *
1630+ * Bits marked as 0/1 are unknown and never changed during tests.
1631+ *
1632+ * Not entirely verified:
1633+ * CHARG: 1 if uncharging, 0 if charging
1634+ * USB: 1 if not connected, 0 if connected
1635+ * BATTERY: battery capacity from 000 (empty) to 100 (full)
1636+ */
1637+
1638+ lx = (ext[0] & 0xff) | ((ext[1] & 0x0f) << 8);
1639+ rx = (ext[2] & 0xff) | ((ext[3] & 0x0f) << 8);
1640+ ly = (ext[4] & 0xff) | ((ext[5] & 0x0f) << 8);
1641+ ry = (ext[6] & 0xff) | ((ext[7] & 0x0f) << 8);
1642+
1643+ input_report_abs(wdata->extension.input, ABS_X, lx - 0x800);
1644+ input_report_abs(wdata->extension.input, ABS_Y, ly - 0x800);
1645+ input_report_abs(wdata->extension.input, ABS_RX, rx - 0x800);
1646+ input_report_abs(wdata->extension.input, ABS_RY, ry - 0x800);
1647+
1648+ input_report_key(wdata->extension.input,
1649+ wiimod_pro_map[WIIMOD_PRO_KEY_RIGHT],
1650+ !(ext[8] & 0x80));
1651+ input_report_key(wdata->extension.input,
1652+ wiimod_pro_map[WIIMOD_PRO_KEY_DOWN],
1653+ !(ext[8] & 0x40));
1654+ input_report_key(wdata->extension.input,
1655+ wiimod_pro_map[WIIMOD_PRO_KEY_TL],
1656+ !(ext[8] & 0x20));
1657+ input_report_key(wdata->extension.input,
1658+ wiimod_pro_map[WIIMOD_PRO_KEY_MINUS],
1659+ !(ext[8] & 0x10));
1660+ input_report_key(wdata->extension.input,
1661+ wiimod_pro_map[WIIMOD_PRO_KEY_HOME],
1662+ !(ext[8] & 0x08));
1663+ input_report_key(wdata->extension.input,
1664+ wiimod_pro_map[WIIMOD_PRO_KEY_PLUS],
1665+ !(ext[8] & 0x04));
1666+ input_report_key(wdata->extension.input,
1667+ wiimod_pro_map[WIIMOD_PRO_KEY_TR],
1668+ !(ext[8] & 0x02));
1669+
1670+ input_report_key(wdata->extension.input,
1671+ wiimod_pro_map[WIIMOD_PRO_KEY_ZL],
1672+ !(ext[9] & 0x80));
1673+ input_report_key(wdata->extension.input,
1674+ wiimod_pro_map[WIIMOD_PRO_KEY_B],
1675+ !(ext[9] & 0x40));
1676+ input_report_key(wdata->extension.input,
1677+ wiimod_pro_map[WIIMOD_PRO_KEY_Y],
1678+ !(ext[9] & 0x20));
1679+ input_report_key(wdata->extension.input,
1680+ wiimod_pro_map[WIIMOD_PRO_KEY_A],
1681+ !(ext[9] & 0x10));
1682+ input_report_key(wdata->extension.input,
1683+ wiimod_pro_map[WIIMOD_PRO_KEY_X],
1684+ !(ext[9] & 0x08));
1685+ input_report_key(wdata->extension.input,
1686+ wiimod_pro_map[WIIMOD_PRO_KEY_ZR],
1687+ !(ext[9] & 0x04));
1688+ input_report_key(wdata->extension.input,
1689+ wiimod_pro_map[WIIMOD_PRO_KEY_LEFT],
1690+ !(ext[9] & 0x02));
1691+ input_report_key(wdata->extension.input,
1692+ wiimod_pro_map[WIIMOD_PRO_KEY_UP],
1693+ !(ext[9] & 0x01));
1694+
1695+ input_report_key(wdata->extension.input,
1696+ wiimod_pro_map[WIIMOD_PRO_KEY_THUMBL],
1697+ !(ext[10] & 0x02));
1698+ input_report_key(wdata->extension.input,
1699+ wiimod_pro_map[WIIMOD_PRO_KEY_THUMBR],
1700+ !(ext[10] & 0x01));
1701+
1702+ input_sync(wdata->extension.input);
1703+}
1704+
1705+static int wiimod_pro_open(struct input_dev *dev)
1706+{
1707+ struct wiimote_data *wdata = input_get_drvdata(dev);
1708+ unsigned long flags;
1709+
1710+ spin_lock_irqsave(&wdata->state.lock, flags);
1711+ wdata->state.flags |= WIIPROTO_FLAG_EXT_USED;
1712+ wiiproto_req_drm(wdata, WIIPROTO_REQ_NULL);
1713+ spin_unlock_irqrestore(&wdata->state.lock, flags);
1714+
1715+ return 0;
1716+}
1717+
1718+static void wiimod_pro_close(struct input_dev *dev)
1719+{
1720+ struct wiimote_data *wdata = input_get_drvdata(dev);
1721+ unsigned long flags;
1722+
1723+ spin_lock_irqsave(&wdata->state.lock, flags);
1724+ wdata->state.flags &= ~WIIPROTO_FLAG_EXT_USED;
1725+ wiiproto_req_drm(wdata, WIIPROTO_REQ_NULL);
1726+ spin_unlock_irqrestore(&wdata->state.lock, flags);
1727+}
1728+
1729+static int wiimod_pro_play(struct input_dev *dev, void *data,
1730+ struct ff_effect *eff)
1731+{
1732+ struct wiimote_data *wdata = input_get_drvdata(dev);
1733+ __u8 value;
1734+ unsigned long flags;
1735+
1736+ /*
1737+ * The wiimote supports only a single rumble motor so if any magnitude
1738+ * is set to non-zero then we start the rumble motor. If both are set to
1739+ * zero, we stop the rumble motor.
1740+ */
1741+
1742+ if (eff->u.rumble.strong_magnitude || eff->u.rumble.weak_magnitude)
1743+ value = 1;
1744+ else
1745+ value = 0;
1746+
1747+ spin_lock_irqsave(&wdata->state.lock, flags);
1748+ wiiproto_req_rumble(wdata, value);
1749+ spin_unlock_irqrestore(&wdata->state.lock, flags);
1750+
1751+ return 0;
1752+}
1753+
1754+static int wiimod_pro_probe(const struct wiimod_ops *ops,
1755+ struct wiimote_data *wdata)
1756+{
1757+ int ret, i;
1758+
1759+ wdata->extension.input = input_allocate_device();
1760+ if (!wdata->extension.input)
1761+ return -ENOMEM;
1762+
1763+ set_bit(FF_RUMBLE, wdata->extension.input->ffbit);
1764+ input_set_drvdata(wdata->extension.input, wdata);
1765+
1766+ if (input_ff_create_memless(wdata->extension.input, NULL,
1767+ wiimod_pro_play)) {
1768+ ret = -ENOMEM;
1769+ goto err_free;
1770+ }
1771+
1772+ wdata->extension.input->open = wiimod_pro_open;
1773+ wdata->extension.input->close = wiimod_pro_close;
1774+ wdata->extension.input->dev.parent = &wdata->hdev->dev;
1775+ wdata->extension.input->id.bustype = wdata->hdev->bus;
1776+ wdata->extension.input->id.vendor = wdata->hdev->vendor;
1777+ wdata->extension.input->id.product = wdata->hdev->product;
1778+ wdata->extension.input->id.version = wdata->hdev->version;
1779+ wdata->extension.input->name = WIIMOTE_NAME " Pro Controller";
1780+
1781+ set_bit(EV_KEY, wdata->extension.input->evbit);
1782+ for (i = 0; i < WIIMOD_PRO_KEY_NUM; ++i)
1783+ set_bit(wiimod_pro_map[i],
1784+ wdata->extension.input->keybit);
1785+
1786+ set_bit(EV_ABS, wdata->extension.input->evbit);
1787+ set_bit(ABS_X, wdata->extension.input->absbit);
1788+ set_bit(ABS_Y, wdata->extension.input->absbit);
1789+ set_bit(ABS_RX, wdata->extension.input->absbit);
1790+ set_bit(ABS_RY, wdata->extension.input->absbit);
1791+ input_set_abs_params(wdata->extension.input,
1792+ ABS_X, -0x800, 0x800, 2, 4);
1793+ input_set_abs_params(wdata->extension.input,
1794+ ABS_Y, -0x800, 0x800, 2, 4);
1795+ input_set_abs_params(wdata->extension.input,
1796+ ABS_RX, -0x800, 0x800, 2, 4);
1797+ input_set_abs_params(wdata->extension.input,
1798+ ABS_RY, -0x800, 0x800, 2, 4);
1799+
1800+ ret = input_register_device(wdata->extension.input);
1801+ if (ret)
1802+ goto err_free;
1803+
1804+ return 0;
1805+
1806+err_free:
1807+ input_free_device(wdata->extension.input);
1808+ wdata->extension.input = NULL;
1809+ return ret;
1810+}
1811+
1812+static void wiimod_pro_remove(const struct wiimod_ops *ops,
1813+ struct wiimote_data *wdata)
1814+{
1815+ unsigned long flags;
1816+
1817+ if (!wdata->extension.input)
1818+ return;
1819+
1820+ spin_lock_irqsave(&wdata->state.lock, flags);
1821+ wiiproto_req_rumble(wdata, 0);
1822+ spin_unlock_irqrestore(&wdata->state.lock, flags);
1823+
1824+ input_unregister_device(wdata->extension.input);
1825+ wdata->extension.input = NULL;
1826+}
1827+
1828+static const struct wiimod_ops wiimod_pro = {
1829+ .flags = WIIMOD_FLAG_EXT16,
1830+ .arg = 0,
1831+ .probe = wiimod_pro_probe,
1832+ .remove = wiimod_pro_remove,
1833+ .in_ext = wiimod_pro_in_ext,
1834+};
1835+
1836+/*
1837+ * Builtin Motion Plus
1838+ * This module simply sets the WIIPROTO_FLAG_BUILTIN_MP protocol flag which
1839+ * disables polling for Motion-Plus. This should be set only for devices which
1840+ * don't allow MP hotplugging.
1841+ */
1842+
1843+static int wiimod_builtin_mp_probe(const struct wiimod_ops *ops,
1844+ struct wiimote_data *wdata)
1845+{
1846+ unsigned long flags;
1847+
1848+ spin_lock_irqsave(&wdata->state.lock, flags);
1849+ wdata->state.flags |= WIIPROTO_FLAG_BUILTIN_MP;
1850+ spin_unlock_irqrestore(&wdata->state.lock, flags);
1851+
1852+ return 0;
1853+}
1854+
1855+static void wiimod_builtin_mp_remove(const struct wiimod_ops *ops,
1856+ struct wiimote_data *wdata)
1857+{
1858+ unsigned long flags;
1859+
1860+ spin_lock_irqsave(&wdata->state.lock, flags);
1861+ wdata->state.flags |= WIIPROTO_FLAG_BUILTIN_MP;
1862+ spin_unlock_irqrestore(&wdata->state.lock, flags);
1863+}
1864+
1865+static const struct wiimod_ops wiimod_builtin_mp = {
1866+ .flags = 0,
1867+ .arg = 0,
1868+ .probe = wiimod_builtin_mp_probe,
1869+ .remove = wiimod_builtin_mp_remove,
1870+};
1871+
1872+/*
1873+ * No Motion Plus
1874+ * This module simply sets the WIIPROTO_FLAG_NO_MP protocol flag which
1875+ * disables motion-plus. This is needed for devices that advertise this but we
1876+ * don't know how to use it (or whether it is actually present).
1877+ */
1878+
1879+static int wiimod_no_mp_probe(const struct wiimod_ops *ops,
1880+ struct wiimote_data *wdata)
1881+{
1882+ unsigned long flags;
1883+
1884+ spin_lock_irqsave(&wdata->state.lock, flags);
1885+ wdata->state.flags |= WIIPROTO_FLAG_NO_MP;
1886+ spin_unlock_irqrestore(&wdata->state.lock, flags);
1887+
1888+ return 0;
1889+}
1890+
1891+static void wiimod_no_mp_remove(const struct wiimod_ops *ops,
1892+ struct wiimote_data *wdata)
1893+{
1894+ unsigned long flags;
1895+
1896+ spin_lock_irqsave(&wdata->state.lock, flags);
1897+ wdata->state.flags |= WIIPROTO_FLAG_NO_MP;
1898+ spin_unlock_irqrestore(&wdata->state.lock, flags);
1899+}
1900+
1901+static const struct wiimod_ops wiimod_no_mp = {
1902+ .flags = 0,
1903+ .arg = 0,
1904+ .probe = wiimod_no_mp_probe,
1905+ .remove = wiimod_no_mp_remove,
1906+};
1907+
1908+/*
1909+ * Motion Plus
1910+ * The Motion Plus extension provides rotation sensors (gyro) as a small
1911+ * extension device for Wii Remotes. Many devices have them built-in so
1912+ * you cannot see them from the outside.
1913+ * Motion Plus extensions are special because they are on a separate extension
1914+ * port and allow other extensions to be used simultaneously. This is all
1915+ * handled by the Wiimote Core so we don't have to deal with it.
1916+ */
1917+
1918+static void wiimod_mp_in_mp(struct wiimote_data *wdata, const __u8 *ext)
1919+{
1920+ __s32 x, y, z;
1921+
1922+ /* | 8 7 6 5 4 3 | 2 | 1 |
1923+ * -----+------------------------------+-----+-----+
1924+ * 1 | Yaw Speed <7:0> |
1925+ * 2 | Roll Speed <7:0> |
1926+ * 3 | Pitch Speed <7:0> |
1927+ * -----+------------------------------+-----+-----+
1928+ * 4 | Yaw Speed <13:8> | Yaw |Pitch|
1929+ * -----+------------------------------+-----+-----+
1930+ * 5 | Roll Speed <13:8> |Roll | Ext |
1931+ * -----+------------------------------+-----+-----+
1932+ * 6 | Pitch Speed <13:8> | 1 | 0 |
1933+ * -----+------------------------------+-----+-----+
1934+ * The single bits Yaw, Roll, Pitch in the lower right corner specify
1935+ * whether the wiimote is rotating fast (0) or slow (1). Speed for slow
1936+ * roation is 440 deg/s and for fast rotation 2000 deg/s. To get a
1937+ * linear scale we multiply by 2000/440 = ~4.5454 which is 18 for fast
1938+ * and 9 for slow.
1939+ * If the wiimote is not rotating the sensor reports 2^13 = 8192.
1940+ * Ext specifies whether an extension is connected to the motionp.
1941+ * which is parsed by wiimote-core.
1942+ */
1943+
1944+ x = ext[0];
1945+ y = ext[1];
1946+ z = ext[2];
1947+
1948+ x |= (((__u16)ext[3]) << 6) & 0xff00;
1949+ y |= (((__u16)ext[4]) << 6) & 0xff00;
1950+ z |= (((__u16)ext[5]) << 6) & 0xff00;
1951+
1952+ x -= 8192;
1953+ y -= 8192;
1954+ z -= 8192;
1955+
1956+ if (!(ext[3] & 0x02))
1957+ x *= 18;
1958+ else
1959+ x *= 9;
1960+ if (!(ext[4] & 0x02))
1961+ y *= 18;
1962+ else
1963+ y *= 9;
1964+ if (!(ext[3] & 0x01))
1965+ z *= 18;
1966+ else
1967+ z *= 9;
1968+
1969+ input_report_abs(wdata->mp, ABS_RX, x);
1970+ input_report_abs(wdata->mp, ABS_RY, y);
1971+ input_report_abs(wdata->mp, ABS_RZ, z);
1972+ input_sync(wdata->mp);
1973+}
1974+
1975+static int wiimod_mp_open(struct input_dev *dev)
1976+{
1977+ struct wiimote_data *wdata = input_get_drvdata(dev);
1978+ unsigned long flags;
1979+
1980+ spin_lock_irqsave(&wdata->state.lock, flags);
1981+ wdata->state.flags |= WIIPROTO_FLAG_MP_USED;
1982+ wiiproto_req_drm(wdata, WIIPROTO_REQ_NULL);
1983+ __wiimote_schedule(wdata);
1984+ spin_unlock_irqrestore(&wdata->state.lock, flags);
1985+
1986+ return 0;
1987+}
1988+
1989+static void wiimod_mp_close(struct input_dev *dev)
1990+{
1991+ struct wiimote_data *wdata = input_get_drvdata(dev);
1992+ unsigned long flags;
1993+
1994+ spin_lock_irqsave(&wdata->state.lock, flags);
1995+ wdata->state.flags &= ~WIIPROTO_FLAG_MP_USED;
1996+ wiiproto_req_drm(wdata, WIIPROTO_REQ_NULL);
1997+ __wiimote_schedule(wdata);
1998+ spin_unlock_irqrestore(&wdata->state.lock, flags);
1999+}
2000+
2001+static int wiimod_mp_probe(const struct wiimod_ops *ops,
2002+ struct wiimote_data *wdata)
2003+{
2004+ int ret;
2005+
2006+ wdata->mp = input_allocate_device();
2007+ if (!wdata->mp)
2008+ return -ENOMEM;
2009+
2010+ input_set_drvdata(wdata->mp, wdata);
2011+ wdata->mp->open = wiimod_mp_open;
2012+ wdata->mp->close = wiimod_mp_close;
2013+ wdata->mp->dev.parent = &wdata->hdev->dev;
2014+ wdata->mp->id.bustype = wdata->hdev->bus;
2015+ wdata->mp->id.vendor = wdata->hdev->vendor;
2016+ wdata->mp->id.product = wdata->hdev->product;
2017+ wdata->mp->id.version = wdata->hdev->version;
2018+ wdata->mp->name = WIIMOTE_NAME " Motion Plus";
2019+
2020+ set_bit(EV_ABS, wdata->mp->evbit);
2021+ set_bit(ABS_RX, wdata->mp->absbit);
2022+ set_bit(ABS_RY, wdata->mp->absbit);
2023+ set_bit(ABS_RZ, wdata->mp->absbit);
2024+ input_set_abs_params(wdata->mp,
2025+ ABS_RX, -16000, 16000, 4, 8);
2026+ input_set_abs_params(wdata->mp,
2027+ ABS_RY, -16000, 16000, 4, 8);
2028+ input_set_abs_params(wdata->mp,
2029+ ABS_RZ, -16000, 16000, 4, 8);
2030+
2031+ ret = input_register_device(wdata->mp);
2032+ if (ret)
2033+ goto err_free;
2034+
2035+ return 0;
2036+
2037+err_free:
2038+ input_free_device(wdata->mp);
2039+ wdata->mp = NULL;
2040+ return ret;
2041+}
2042+
2043+static void wiimod_mp_remove(const struct wiimod_ops *ops,
2044+ struct wiimote_data *wdata)
2045+{
2046+ if (!wdata->mp)
2047+ return;
2048+
2049+ input_unregister_device(wdata->mp);
2050+ wdata->mp = NULL;
2051+}
2052+
2053+const struct wiimod_ops wiimod_mp = {
2054+ .flags = 0,
2055+ .arg = 0,
2056+ .probe = wiimod_mp_probe,
2057+ .remove = wiimod_mp_remove,
2058+ .in_mp = wiimod_mp_in_mp,
2059+};
2060+
2061+/* module table */
2062+
2063+static const struct wiimod_ops wiimod_dummy;
2064+
2065+const struct wiimod_ops *wiimod_table[WIIMOD_NUM] = {
2066+ [WIIMOD_KEYS] = &wiimod_keys,
2067+ [WIIMOD_RUMBLE] = &wiimod_rumble,
2068+ [WIIMOD_BATTERY] = &wiimod_battery,
2069+ [WIIMOD_LED1] = &wiimod_leds[0],
2070+ [WIIMOD_LED2] = &wiimod_leds[1],
2071+ [WIIMOD_LED3] = &wiimod_leds[2],
2072+ [WIIMOD_LED4] = &wiimod_leds[3],
2073+ [WIIMOD_ACCEL] = &wiimod_accel,
2074+ [WIIMOD_IR] = &wiimod_ir,
2075+ [WIIMOD_BUILTIN_MP] = &wiimod_builtin_mp,
2076+ [WIIMOD_NO_MP] = &wiimod_no_mp,
2077+};
2078+
2079+const struct wiimod_ops *wiimod_ext_table[WIIMOTE_EXT_NUM] = {
2080+ [WIIMOTE_EXT_NONE] = &wiimod_dummy,
2081+ [WIIMOTE_EXT_UNKNOWN] = &wiimod_dummy,
2082+ [WIIMOTE_EXT_NUNCHUK] = &wiimod_nunchuk,
2083+ [WIIMOTE_EXT_CLASSIC_CONTROLLER] = &wiimod_classic,
2084+ [WIIMOTE_EXT_BALANCE_BOARD] = &wiimod_bboard,
2085+ [WIIMOTE_EXT_PRO_CONTROLLER] = &wiimod_pro,
2086+};
drivers/hid/hid-wiimote.h+190−27
@@ -2,8 +2,8 @@ · 1 unmodified line
22 #define __HID_WIIMOTE_H
33
44 /*
5− * HID driver for Nintendo Wiimote devices
6− * Copyright (c) 2011 David Herrmann
5+ * HID driver for Nintendo Wii / Wii U peripherals
6+ * Copyright (c) 2011-2013 David Herrmann <dh.herrmann@gmail.com>
77 */
88
99 /*
@@ -22,6 +22,7 @@ · 12 unmodified lines
2222 #include <linux/mutex.h>
2323 #include <linux/power_supply.h>
2424 #include <linux/spinlock.h>
25+#include <linux/timer.h>
2526
2627 #define WIIMOTE_NAME "Nintendo Wii Remote"
2728 #define WIIMOTE_BUFSIZE 32
@@ -35,6 +36,17 @@ · 7 unmodified lines
3536 #define WIIPROTO_FLAG_IR_BASIC 0x40
3637 #define WIIPROTO_FLAG_IR_EXT 0x80
3738 #define WIIPROTO_FLAG_IR_FULL 0xc0 /* IR_BASIC | IR_EXT */
39+#define WIIPROTO_FLAG_EXT_PLUGGED 0x0100
40+#define WIIPROTO_FLAG_EXT_USED 0x0200
41+#define WIIPROTO_FLAG_EXT_ACTIVE 0x0400
42+#define WIIPROTO_FLAG_MP_PLUGGED 0x0800
43+#define WIIPROTO_FLAG_MP_USED 0x1000
44+#define WIIPROTO_FLAG_MP_ACTIVE 0x2000
45+#define WIIPROTO_FLAG_EXITING 0x4000
46+#define WIIPROTO_FLAG_DRM_LOCKED 0x8000
47+#define WIIPROTO_FLAG_BUILTIN_MP 0x010000
48+#define WIIPROTO_FLAG_NO_MP 0x020000
49+
3850 #define WIIPROTO_FLAGS_LEDS (WIIPROTO_FLAG_LED1 | WIIPROTO_FLAG_LED2 | \
3951 WIIPROTO_FLAG_LED3 | WIIPROTO_FLAG_LED4)
4052 #define WIIPROTO_FLAGS_IR (WIIPROTO_FLAG_IR_BASIC | WIIPROTO_FLAG_IR_EXT | \
@@ -43,16 +55,71 @@ · 2 unmodified lines
4355 /* return flag for led \num */
4456 #define WIIPROTO_FLAG_LED(num) (WIIPROTO_FLAG_LED1 << (num - 1))
4557
58+enum wiiproto_keys {
59+ WIIPROTO_KEY_LEFT,
60+ WIIPROTO_KEY_RIGHT,
61+ WIIPROTO_KEY_UP,
62+ WIIPROTO_KEY_DOWN,
63+ WIIPROTO_KEY_PLUS,
64+ WIIPROTO_KEY_MINUS,
65+ WIIPROTO_KEY_ONE,
66+ WIIPROTO_KEY_TWO,
67+ WIIPROTO_KEY_A,
68+ WIIPROTO_KEY_B,
69+ WIIPROTO_KEY_HOME,
70+ WIIPROTO_KEY_COUNT
71+};
72+
73+enum wiimote_devtype {
74+ WIIMOTE_DEV_PENDING,
75+ WIIMOTE_DEV_UNKNOWN,
76+ WIIMOTE_DEV_GENERIC,
77+ WIIMOTE_DEV_GEN10,
78+ WIIMOTE_DEV_GEN20,
79+ WIIMOTE_DEV_BALANCE_BOARD,
80+ WIIMOTE_DEV_PRO_CONTROLLER,
81+ WIIMOTE_DEV_NUM,
82+};
83+
84+enum wiimote_exttype {
85+ WIIMOTE_EXT_NONE,
86+ WIIMOTE_EXT_UNKNOWN,
87+ WIIMOTE_EXT_NUNCHUK,
88+ WIIMOTE_EXT_CLASSIC_CONTROLLER,
89+ WIIMOTE_EXT_BALANCE_BOARD,
90+ WIIMOTE_EXT_PRO_CONTROLLER,
91+ WIIMOTE_EXT_NUM,
92+};
93+
94+enum wiimote_mptype {
95+ WIIMOTE_MP_NONE,
96+ WIIMOTE_MP_UNKNOWN,
97+ WIIMOTE_MP_SINGLE,
98+ WIIMOTE_MP_PASSTHROUGH_NUNCHUK,
99+ WIIMOTE_MP_PASSTHROUGH_CLASSIC,
100+};
101+
46102 struct wiimote_buf {
47103 __u8 data[HID_MAX_BUFFER_SIZE];
48104 size_t size;
49105 };
50106
107+struct wiimote_queue {
108+ spinlock_t lock;
109+ struct work_struct worker;
110+ __u8 head;
111+ __u8 tail;
112+ struct wiimote_buf outq[WIIMOTE_BUFSIZE];
113+};
114+
51115 struct wiimote_state {
52116 spinlock_t lock;
53− __u8 flags;
117+ __u32 flags;
54118 __u8 accel_split[2];
55119 __u8 drm;
120+ __u8 devtype;
121+ __u8 exttype;
122+ __u8 mp;
56123
57124 /* synchronous cmd requests */
58125 struct mutex sync;
@@ -65,6 +132,9 @@ struct wiimote_state { · 6 unmodified lines
65132 __u8 cmd_err;
66133 __u8 *cmd_read_buf;
67134 __u8 cmd_read_size;
135+
136+ /* calibration data */
137+ __u16 calib_bboard[4][3];
68138 };
69139
70140 struct wiimote_data {
@@ -74,18 +144,63 @@ struct wiimote_data { · 3 unmodified lines
74144 struct input_dev *accel;
75145 struct input_dev *ir;
76146 struct power_supply battery;
77− struct wiimote_ext *ext;
147+ struct input_dev *mp;
148+ struct timer_list timer;
78149 struct wiimote_debug *debug;
79150
80− spinlock_t qlock;
81− __u8 head;
82− __u8 tail;
83− struct wiimote_buf outq[WIIMOTE_BUFSIZE];
84− struct work_struct worker;
151+ union {
152+ struct input_dev *input;
153+ } extension;
85154
155+ struct wiimote_queue queue;
86156 struct wiimote_state state;
157+ struct work_struct init_worker;
158+};
159+
160+/* wiimote modules */
161+
162+enum wiimod_module {
163+ WIIMOD_KEYS,
164+ WIIMOD_RUMBLE,
165+ WIIMOD_BATTERY,
166+ WIIMOD_LED1,
167+ WIIMOD_LED2,
168+ WIIMOD_LED3,
169+ WIIMOD_LED4,
170+ WIIMOD_ACCEL,
171+ WIIMOD_IR,
172+ WIIMOD_BUILTIN_MP,
173+ WIIMOD_NO_MP,
174+ WIIMOD_NUM,
175+ WIIMOD_NULL = WIIMOD_NUM,
176+};
177+
178+#define WIIMOD_FLAG_INPUT 0x0001
179+#define WIIMOD_FLAG_EXT8 0x0002
180+#define WIIMOD_FLAG_EXT16 0x0004
181+
182+struct wiimod_ops {
183+ __u16 flags;
184+ unsigned long arg;
185+ int (*probe) (const struct wiimod_ops *ops,
186+ struct wiimote_data *wdata);
187+ void (*remove) (const struct wiimod_ops *ops,
188+ struct wiimote_data *wdata);
189+
190+ void (*in_keys) (struct wiimote_data *wdata, const __u8 *keys);
191+ void (*in_accel) (struct wiimote_data *wdata, const __u8 *accel);
192+ void (*in_ir) (struct wiimote_data *wdata, const __u8 *ir, bool packed,
193+ unsigned int id);
194+ void (*in_mp) (struct wiimote_data *wdata, const __u8 *mp);
195+ void (*in_ext) (struct wiimote_data *wdata, const __u8 *ext);
87196 };
88197
198+extern const struct wiimod_ops *wiimod_table[WIIMOD_NUM];
199+extern const struct wiimod_ops *wiimod_ext_table[WIIMOTE_EXT_NUM];
200+extern const struct wiimod_ops wiimod_mp;
201+
202+/* wiimote requests */
203+
89204 enum wiiproto_reqs {
90205 WIIPROTO_REQ_NULL = 0x0,
91206 WIIPROTO_REQ_RUMBLE = 0x10,
@@ -99,24 +214,55 @@ enum wiiproto_reqs { · 7 unmodified lines
99214 WIIPROTO_REQ_STATUS = 0x20,
100215 WIIPROTO_REQ_DATA = 0x21,
101216 WIIPROTO_REQ_RETURN = 0x22,
217+
218+ /* DRM_K: BB*2 */
102219 WIIPROTO_REQ_DRM_K = 0x30,
220+
221+ /* DRM_KA: BB*2 AA*3 */
103222 WIIPROTO_REQ_DRM_KA = 0x31,
223+
224+ /* DRM_KE: BB*2 EE*8 */
104225 WIIPROTO_REQ_DRM_KE = 0x32,
226+
227+ /* DRM_KAI: BB*2 AA*3 II*12 */
105228 WIIPROTO_REQ_DRM_KAI = 0x33,
229+
230+ /* DRM_KEE: BB*2 EE*19 */
106231 WIIPROTO_REQ_DRM_KEE = 0x34,
232+
233+ /* DRM_KAE: BB*2 AA*3 EE*16 */
107234 WIIPROTO_REQ_DRM_KAE = 0x35,
235+
236+ /* DRM_KIE: BB*2 II*10 EE*9 */
108237 WIIPROTO_REQ_DRM_KIE = 0x36,
238+
239+ /* DRM_KAIE: BB*2 AA*3 II*10 EE*6 */
109240 WIIPROTO_REQ_DRM_KAIE = 0x37,
241+
242+ /* DRM_E: EE*21 */
110243 WIIPROTO_REQ_DRM_E = 0x3d,
244+
245+ /* DRM_SKAI1: BB*2 AA*1 II*18 */
111246 WIIPROTO_REQ_DRM_SKAI1 = 0x3e,
247+
248+ /* DRM_SKAI2: BB*2 AA*1 II*18 */
112249 WIIPROTO_REQ_DRM_SKAI2 = 0x3f,
250+
113251 WIIPROTO_REQ_MAX
114252 };
115253
116254 #define dev_to_wii(pdev) hid_get_drvdata(container_of(pdev, struct hid_device, \
117255 dev))
118256
257+void __wiimote_schedule(struct wiimote_data *wdata);
258+
119259 extern void wiiproto_req_drm(struct wiimote_data *wdata, __u8 drm);
260+extern void wiiproto_req_rumble(struct wiimote_data *wdata, __u8 rumble);
261+extern void wiiproto_req_leds(struct wiimote_data *wdata, int leds);
262+extern void wiiproto_req_status(struct wiimote_data *wdata);
263+extern void wiiproto_req_accel(struct wiimote_data *wdata, __u8 accel);
264+extern void wiiproto_req_ir1(struct wiimote_data *wdata, __u8 flags);
265+extern void wiiproto_req_ir2(struct wiimote_data *wdata, __u8 flags);
120266 extern int wiimote_cmd_write(struct wiimote_data *wdata, __u32 offset,
121267 const __u8 *wmem, __u8 size);
122268 extern ssize_t wiimote_cmd_read(struct wiimote_data *wdata, __u32 offset,
@@ -129,24 +275,6 @@ extern ssize_t wiimote_cmd_read(struct wiimote_data *wdata, __u32 offset, · 6 unmodified lines
129275 extern void wiiproto_req_rmem(struct wiimote_data *wdata, bool eeprom,
130276 __u32 offset, __u16 size);
131277
132−#ifdef CONFIG_HID_WIIMOTE_EXT
133−
134−extern int wiiext_init(struct wiimote_data *wdata);
135−extern void wiiext_deinit(struct wiimote_data *wdata);
136−extern void wiiext_event(struct wiimote_data *wdata, bool plugged);
137−extern bool wiiext_active(struct wiimote_data *wdata);
138−extern void wiiext_handle(struct wiimote_data *wdata, const __u8 *payload);
139−
140−#else
141−
142−static inline int wiiext_init(void *u) { return 0; }
143−static inline void wiiext_deinit(void *u) { }
144−static inline void wiiext_event(void *u, bool p) { }
145−static inline bool wiiext_active(void *u) { return false; }
146−static inline void wiiext_handle(void *u, const __u8 *p) { }
147−
148−#endif
149−
150278 #ifdef CONFIG_DEBUG_FS
151279
152280 extern int wiidebug_init(struct wiimote_data *wdata);
@@ -173,11 +301,26 @@ static inline void wiimote_cmd_complete(struct wiimote_data *wdata) · 20 unmodified lines
173301 complete(&wdata->state.ready);
174302 }
175303
304+/* requires the state.lock spinlock to be held */
305+static inline void wiimote_cmd_abort(struct wiimote_data *wdata)
306+{
307+ /* Abort synchronous request by waking up the sleeping caller. But
308+ * reset the state.cmd field to an invalid value so no further event
309+ * handlers will work with it. */
310+ wdata->state.cmd = WIIPROTO_REQ_MAX;
311+ complete(&wdata->state.ready);
312+}
313+
176314 static inline int wiimote_cmd_acquire(struct wiimote_data *wdata)
177315 {
178316 return mutex_lock_interruptible(&wdata->state.sync) ? -ERESTARTSYS : 0;
179317 }
180318
319+static inline void wiimote_cmd_acquire_noint(struct wiimote_data *wdata)
320+{
321+ mutex_lock(&wdata->state.sync);
322+}
323+
181324 /* requires the state.lock spinlock to be held */
182325 static inline void wiimote_cmd_set(struct wiimote_data *wdata, int cmd,
183326 __u32 opt)
@@ -196,11 +339,31 @@ static inline int wiimote_cmd_wait(struct wiimote_data *wdata) · 12 unmodified lines
196339 {
197340 int ret;
198341
342+ /* The completion acts as implicit memory barrier so we can safely
343+ * assume that state.cmd is set on success/failure and isn't accessed
344+ * by any other thread, anymore. */
345+
199346 ret = wait_for_completion_interruptible_timeout(&wdata->state.ready, HZ);
200347 if (ret < 0)
201348 return -ERESTARTSYS;
202349 else if (ret == 0)
203350 return -EIO;
351+ else if (wdata->state.cmd != WIIPROTO_REQ_NULL)
352+ return -EIO;
353+ else
354+ return 0;
355+}
356+
357+static inline int wiimote_cmd_wait_noint(struct wiimote_data *wdata)
358+{
359+ unsigned long ret;
360+
361+ /* no locking needed; see wiimote_cmd_wait() */
362+ ret = wait_for_completion_timeout(&wdata->state.ready, HZ);
363+ if (!ret)
364+ return -EIO;
365+ else if (wdata->state.cmd != WIIPROTO_REQ_NULL)
366+ return -EIO;
204367 else
205368 return 0;
206369 }
drivers/hid/i2c-hid/i2c-hid.c+17−3
@@ -108,6 +108,7 @@ static const struct i2c_hid_cmd hid_reset_cmd = { I2C_HID_CMD(0x01), · 107 unmodified lines
108108 static const struct i2c_hid_cmd hid_get_report_cmd = { I2C_HID_CMD(0x02) };
109109 static const struct i2c_hid_cmd hid_set_report_cmd = { I2C_HID_CMD(0x03) };
110110 static const struct i2c_hid_cmd hid_set_power_cmd = { I2C_HID_CMD(0x08) };
111+static const struct i2c_hid_cmd hid_no_cmd = { .length = 0 };
111112
112113 /*
113114 * These definitions are not used here, but are defined by the spec.
@@ -259,8 +260,11 @@ static int i2c_hid_set_report(struct i2c_client *client, u8 reportType, · 145 unmodified lines
259260 {
260261 struct i2c_hid *ihid = i2c_get_clientdata(client);
261262 u8 *args = ihid->argsbuf;
263+ const struct i2c_hid_cmd * hidcmd = &hid_set_report_cmd;
262264 int ret;
263265 u16 dataRegister = le16_to_cpu(ihid->hdesc.wDataRegister);
266+ u16 outputRegister = le16_to_cpu(ihid->hdesc.wOutputRegister);
267+ u16 maxOutputLength = le16_to_cpu(ihid->hdesc.wMaxOutputLength);
264268
265269 /* hidraw already checked that data_len < HID_MAX_BUFFER_SIZE */
266270 u16 size = 2 /* size */ +
@@ -278,8 +282,18 @@ static int i2c_hid_set_report(struct i2c_client *client, u8 reportType, · 11 unmodified lines
278282 reportID = 0x0F;
279283 }
280284
281− args[index++] = dataRegister & 0xFF;
282− args[index++] = dataRegister >> 8;
285+ /*
286+ * use the data register for feature reports or if the device does not
287+ * support the output register
288+ */
289+ if (reportType == 0x03 || maxOutputLength == 0) {
290+ args[index++] = dataRegister & 0xFF;
291+ args[index++] = dataRegister >> 8;
292+ } else {
293+ args[index++] = outputRegister & 0xFF;
294+ args[index++] = outputRegister >> 8;
295+ hidcmd = &hid_no_cmd;
296+ }
283297
284298 args[index++] = size & 0xFF;
285299 args[index++] = size >> 8;
@@ -289,7 +303,7 @@ static int i2c_hid_set_report(struct i2c_client *client, u8 reportType, · 3 unmodified lines
289303
290304 memcpy(&args[index], buf, data_len);
291305
292− ret = __i2c_hid_command(client, &hid_set_report_cmd, reportID,
306+ ret = __i2c_hid_command(client, hidcmd, reportID,
293307 reportType, args, args_len, NULL, 0);
294308 if (ret) {
295309 dev_err(&client->dev, "failed to set a report to device.\n");
include/uapi/linux/input.h+13−4
@@ -506,11 +506,15 @@ struct input_keymap_entry { · 505 unmodified lines
506506 #define BTN_DEAD 0x12f
507507
508508 #define BTN_GAMEPAD 0x130
509−#define BTN_A 0x130
510−#define BTN_B 0x131
509+#define BTN_SOUTH 0x130
510+#define BTN_A BTN_SOUTH
511+#define BTN_EAST 0x131
512+#define BTN_B BTN_EAST
511513 #define BTN_C 0x132
512−#define BTN_X 0x133
513−#define BTN_Y 0x134
514+#define BTN_NORTH 0x133
515+#define BTN_X BTN_NORTH
516+#define BTN_WEST 0x134
517+#define BTN_Y BTN_WEST
514518 #define BTN_Z 0x135
515519 #define BTN_TL 0x136
516520 #define BTN_TR 0x137
@@ -707,6 +711,11 @@ struct input_keymap_entry { · 190 unmodified lines
707711 #define KEY_ATTENDANT_TOGGLE 0x21d /* Attendant call on or off */
708712 #define KEY_LIGHTS_TOGGLE 0x21e /* Reading light on or off */
709713
714+#define BTN_DPAD_UP 0x220
715+#define BTN_DPAD_DOWN 0x221
716+#define BTN_DPAD_LEFT 0x222
717+#define BTN_DPAD_RIGHT 0x223
718+
710719 #define BTN_TRIGGER_HAPPY 0x2c0
711720 #define BTN_TRIGGER_HAPPY1 0x2c0
712721 #define BTN_TRIGGER_HAPPY2 0x2c1
net/bluetooth/hidp/core.c+47−9
@@ -850,6 +850,29 @@ static void hidp_session_dev_del(struct hidp_session *session) · 849 unmodified lines
850850 input_unregister_device(session->input);
851851 }
852852
853+/*
854+ * Asynchronous device registration
855+ * HID device drivers might want to perform I/O during initialization to
856+ * detect device types. Therefore, call device registration in a separate
857+ * worker so the HIDP thread can schedule I/O operations.
858+ * Note that this must be called after the worker thread was initialized
859+ * successfully. This will then add the devices and increase session state
860+ * on success, otherwise it will terminate the session thread.
861+ */
862+static void hidp_session_dev_work(struct work_struct *work)
863+{
864+ struct hidp_session *session = container_of(work,
865+ struct hidp_session,
866+ dev_init);
867+ int ret;
868+
869+ ret = hidp_session_dev_add(session);
870+ if (!ret)
871+ atomic_inc(&session->state);
872+ else
873+ hidp_session_terminate(session);
874+}
875+
853876 /*
854877 * Create new session object
855878 * Allocate session object, initialize static fields, copy input data into the
@@ -897,6 +920,7 @@ static int hidp_session_new(struct hidp_session **out, const bdaddr_t *bdaddr, · 41 unmodified lines
897920 session->idle_to = req->idle_to;
898921
899922 /* device management */
923+ INIT_WORK(&session->dev_init, hidp_session_dev_work);
900924 setup_timer(&session->timer, hidp_idle_timeout,
901925 (unsigned long)session);
902926
@@ -1035,8 +1059,8 @@ static void hidp_session_terminate(struct hidp_session *session) · 132 unmodified lines
10351059 * Probe HIDP session
10361060 * This is called from the l2cap_conn core when our l2cap_user object is bound
10371061 * to the hci-connection. We get the session via the \user object and can now
1038− * start the session thread, register the HID/input devices and link it into
1039− * the global session list.
1062+ * start the session thread, link it into the global session list and
1063+ * schedule HID/input device registration.
10401064 * The global session-list owns its own reference to the session object so you
10411065 * can drop your own reference after registering the l2cap_user object.
10421066 */
@@ -1058,21 +1082,30 @@ static int hidp_session_probe(struct l2cap_conn *conn, · 15 unmodified lines
10581082 goto out_unlock;
10591083 }
10601084
1085+ if (session->input) {
1086+ ret = hidp_session_dev_add(session);
1087+ if (ret)
1088+ goto out_unlock;
1089+ }
1090+
10611091 ret = hidp_session_start_sync(session);
10621092 if (ret)
1063− goto out_unlock;
1093+ goto out_del;
10641094
1065− ret = hidp_session_dev_add(session);
1066− if (ret)
1067− goto out_stop;
1095+ /* HID device registration is async to allow I/O during probe */
1096+ if (session->input)
1097+ atomic_inc(&session->state);
1098+ else
1099+ schedule_work(&session->dev_init);
10681100
10691101 hidp_session_get(session);
10701102 list_add(&session->list, &hidp_session_list);
10711103 ret = 0;
10721104 goto out_unlock;
10731105
1074−out_stop:
1075− hidp_session_terminate(session);
1106+out_del:
1107+ if (session->input)
1108+ hidp_session_dev_del(session);
10761109 out_unlock:
10771110 up_write(&hidp_session_sem);
10781111 return ret;
@@ -1102,7 +1135,12 @@ static void hidp_session_remove(struct l2cap_conn *conn, · 23 unmodified lines
11021135 down_write(&hidp_session_sem);
11031136
11041137 hidp_session_terminate(session);
1105− hidp_session_dev_del(session);
1138+
1139+ cancel_work_sync(&session->dev_init);
1140+ if (session->input ||
1141+ atomic_read(&session->state) > HIDP_SESSION_PREPARING)
1142+ hidp_session_dev_del(session);
1143+
11061144 list_del(&session->list);
11071145
11081146 up_write(&hidp_session_sem);
net/bluetooth/hidp/hidp.h+2−0
@@ -128,6 +128,7 @@ int hidp_get_conninfo(struct hidp_conninfo *ci); · 127 unmodified lines
128128
129129 enum hidp_session_state {
130130 HIDP_SESSION_IDLING,
131+ HIDP_SESSION_PREPARING,
131132 HIDP_SESSION_RUNNING,
132133 };
133134
@@ -156,6 +157,7 @@ struct hidp_session { · 22 unmodified lines
156157 unsigned long idle_to;
157158
158159 /* device management */
160+ struct work_struct dev_init;
159161 struct input_dev *input;
160162 struct hid_device *hid;
161163 struct timer_list timer;