2 * HID driver for Sony / PS2 / PS3 / PS4 BD devices.
4 * Copyright (c) 1999 Andreas Gal
5 * Copyright (c) 2000-2005 Vojtech Pavlik <vojtech@suse.cz>
6 * Copyright (c) 2005 Michael Haboustak <mike-@cinci.rr.com> for Concept2, Inc
7 * Copyright (c) 2008 Jiri Slaby
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>
11 * Copyright (c) 2014-2016 Frank Praznik <frank.praznik@gmail.com>
15 * This program is free software; you can redistribute it and/or modify it
16 * under the terms of the GNU General Public License as published by the Free
17 * Software Foundation; either version 2 of the License, or (at your option)
22 * NOTE: in order for the Sony PS3 BD Remote Control to be found by
23 * a Bluetooth host, the key combination Start+Enter has to be kept pressed
24 * for about 7 seconds with the Bluetooth Host Controller in discovering mode.
26 * There will be no PIN request from the device.
29 #include <linux/device.h>
30 #include <linux/hid.h>
31 #include <linux/module.h>
32 #include <linux/slab.h>
33 #include <linux/leds.h>
34 #include <linux/power_supply.h>
35 #include <linux/spinlock.h>
36 #include <linux/list.h>
37 #include <linux/idr.h>
38 #include <linux/input/mt.h>
39 #include <linux/crc32.h>
40 #include <asm/unaligned.h>
44 #define VAIO_RDESC_CONSTANT BIT(0)
45 #define SIXAXIS_CONTROLLER_USB BIT(1)
46 #define SIXAXIS_CONTROLLER_BT BIT(2)
47 #define BUZZ_CONTROLLER BIT(3)
48 #define PS3REMOTE BIT(4)
49 #define DUALSHOCK4_CONTROLLER_USB BIT(5)
50 #define DUALSHOCK4_CONTROLLER_BT BIT(6)
51 #define MOTION_CONTROLLER_USB BIT(7)
52 #define MOTION_CONTROLLER_BT BIT(8)
53 #define NAVIGATION_CONTROLLER_USB BIT(9)
54 #define NAVIGATION_CONTROLLER_BT BIT(10)
55 #define SINO_LITE_CONTROLLER BIT(11)
56 #define FUTUREMAX_DANCE_MAT BIT(12)
58 #define SIXAXIS_CONTROLLER (SIXAXIS_CONTROLLER_USB | SIXAXIS_CONTROLLER_BT)
59 #define MOTION_CONTROLLER (MOTION_CONTROLLER_USB | MOTION_CONTROLLER_BT)
60 #define NAVIGATION_CONTROLLER (NAVIGATION_CONTROLLER_USB |\
61 NAVIGATION_CONTROLLER_BT)
62 #define DUALSHOCK4_CONTROLLER (DUALSHOCK4_CONTROLLER_USB |\
63 DUALSHOCK4_CONTROLLER_BT)
64 #define SONY_LED_SUPPORT (SIXAXIS_CONTROLLER | BUZZ_CONTROLLER |\
65 DUALSHOCK4_CONTROLLER | MOTION_CONTROLLER |\
66 NAVIGATION_CONTROLLER)
67 #define SONY_BATTERY_SUPPORT (SIXAXIS_CONTROLLER | DUALSHOCK4_CONTROLLER |\
68 MOTION_CONTROLLER_BT | NAVIGATION_CONTROLLER)
69 #define SONY_FF_SUPPORT (SIXAXIS_CONTROLLER | DUALSHOCK4_CONTROLLER |\
71 #define SONY_BT_DEVICE (SIXAXIS_CONTROLLER_BT | DUALSHOCK4_CONTROLLER_BT |\
72 MOTION_CONTROLLER_BT | NAVIGATION_CONTROLLER_BT)
77 * The Sixaxis reports both digital and analog values for each button on the
78 * controller except for Start, Select and the PS button. The controller ends
79 * up reporting 27 axes which causes them to spill over into the multi-touch
80 * axis values. Additionally, the controller only has 20 actual, physical axes
81 * so there are several unused axes in between the used ones.
83 static u8 sixaxis_rdesc[] = {
84 0x05, 0x01, /* Usage Page (Desktop), */
85 0x09, 0x04, /* Usage (Joystick), */
86 0xA1, 0x01, /* Collection (Application), */
87 0xA1, 0x02, /* Collection (Logical), */
88 0x85, 0x01, /* Report ID (1), */
89 0x75, 0x08, /* Report Size (8), */
90 0x95, 0x01, /* Report Count (1), */
91 0x15, 0x00, /* Logical Minimum (0), */
92 0x26, 0xFF, 0x00, /* Logical Maximum (255), */
93 0x81, 0x03, /* Input (Constant, Variable), */
94 0x75, 0x01, /* Report Size (1), */
95 0x95, 0x13, /* Report Count (19), */
96 0x15, 0x00, /* Logical Minimum (0), */
97 0x25, 0x01, /* Logical Maximum (1), */
98 0x35, 0x00, /* Physical Minimum (0), */
99 0x45, 0x01, /* Physical Maximum (1), */
100 0x05, 0x09, /* Usage Page (Button), */
101 0x19, 0x01, /* Usage Minimum (01h), */
102 0x29, 0x13, /* Usage Maximum (13h), */
103 0x81, 0x02, /* Input (Variable), */
104 0x75, 0x01, /* Report Size (1), */
105 0x95, 0x0D, /* Report Count (13), */
106 0x06, 0x00, 0xFF, /* Usage Page (FF00h), */
107 0x81, 0x03, /* Input (Constant, Variable), */
108 0x15, 0x00, /* Logical Minimum (0), */
109 0x26, 0xFF, 0x00, /* Logical Maximum (255), */
110 0x05, 0x01, /* Usage Page (Desktop), */
111 0x09, 0x01, /* Usage (Pointer), */
112 0xA1, 0x00, /* Collection (Physical), */
113 0x75, 0x08, /* Report Size (8), */
114 0x95, 0x04, /* Report Count (4), */
115 0x35, 0x00, /* Physical Minimum (0), */
116 0x46, 0xFF, 0x00, /* Physical Maximum (255), */
117 0x09, 0x30, /* Usage (X), */
118 0x09, 0x31, /* Usage (Y), */
119 0x09, 0x32, /* Usage (Z), */
120 0x09, 0x35, /* Usage (Rz), */
121 0x81, 0x02, /* Input (Variable), */
122 0xC0, /* End Collection, */
123 0x05, 0x01, /* Usage Page (Desktop), */
124 0x95, 0x13, /* Report Count (19), */
125 0x09, 0x01, /* Usage (Pointer), */
126 0x81, 0x02, /* Input (Variable), */
127 0x95, 0x0C, /* Report Count (12), */
128 0x81, 0x01, /* Input (Constant), */
129 0x75, 0x10, /* Report Size (16), */
130 0x95, 0x04, /* Report Count (4), */
131 0x26, 0xFF, 0x03, /* Logical Maximum (1023), */
132 0x46, 0xFF, 0x03, /* Physical Maximum (1023), */
133 0x09, 0x01, /* Usage (Pointer), */
134 0x81, 0x02, /* Input (Variable), */
135 0xC0, /* End Collection, */
136 0xA1, 0x02, /* Collection (Logical), */
137 0x85, 0x02, /* Report ID (2), */
138 0x75, 0x08, /* Report Size (8), */
139 0x95, 0x30, /* Report Count (48), */
140 0x09, 0x01, /* Usage (Pointer), */
141 0xB1, 0x02, /* Feature (Variable), */
142 0xC0, /* End Collection, */
143 0xA1, 0x02, /* Collection (Logical), */
144 0x85, 0xEE, /* Report ID (238), */
145 0x75, 0x08, /* Report Size (8), */
146 0x95, 0x30, /* Report Count (48), */
147 0x09, 0x01, /* Usage (Pointer), */
148 0xB1, 0x02, /* Feature (Variable), */
149 0xC0, /* End Collection, */
150 0xA1, 0x02, /* Collection (Logical), */
151 0x85, 0xEF, /* Report ID (239), */
152 0x75, 0x08, /* Report Size (8), */
153 0x95, 0x30, /* Report Count (48), */
154 0x09, 0x01, /* Usage (Pointer), */
155 0xB1, 0x02, /* Feature (Variable), */
156 0xC0, /* End Collection, */
157 0xC0 /* End Collection */
160 /* PS/3 Motion controller */
161 static u8 motion_rdesc[] = {
162 0x05, 0x01, /* Usage Page (Desktop), */
163 0x09, 0x04, /* Usage (Joystick), */
164 0xA1, 0x01, /* Collection (Application), */
165 0xA1, 0x02, /* Collection (Logical), */
166 0x85, 0x01, /* Report ID (1), */
167 0x75, 0x01, /* Report Size (1), */
168 0x95, 0x15, /* Report Count (21), */
169 0x15, 0x00, /* Logical Minimum (0), */
170 0x25, 0x01, /* Logical Maximum (1), */
171 0x35, 0x00, /* Physical Minimum (0), */
172 0x45, 0x01, /* Physical Maximum (1), */
173 0x05, 0x09, /* Usage Page (Button), */
174 0x19, 0x01, /* Usage Minimum (01h), */
175 0x29, 0x15, /* Usage Maximum (15h), */
176 0x81, 0x02, /* Input (Variable), * Buttons */
177 0x95, 0x0B, /* Report Count (11), */
178 0x06, 0x00, 0xFF, /* Usage Page (FF00h), */
179 0x81, 0x03, /* Input (Constant, Variable), * Padding */
180 0x15, 0x00, /* Logical Minimum (0), */
181 0x26, 0xFF, 0x00, /* Logical Maximum (255), */
182 0x05, 0x01, /* Usage Page (Desktop), */
183 0xA1, 0x00, /* Collection (Physical), */
184 0x75, 0x08, /* Report Size (8), */
185 0x95, 0x01, /* Report Count (1), */
186 0x35, 0x00, /* Physical Minimum (0), */
187 0x46, 0xFF, 0x00, /* Physical Maximum (255), */
188 0x09, 0x30, /* Usage (X), */
189 0x81, 0x02, /* Input (Variable), * Trigger */
190 0xC0, /* End Collection, */
191 0x06, 0x00, 0xFF, /* Usage Page (FF00h), */
192 0x75, 0x08, /* Report Size (8), */
193 0x95, 0x07, /* Report Count (7), * skip 7 bytes */
194 0x81, 0x02, /* Input (Variable), */
195 0x05, 0x01, /* Usage Page (Desktop), */
196 0x75, 0x10, /* Report Size (16), */
197 0x46, 0xFF, 0xFF, /* Physical Maximum (65535), */
198 0x27, 0xFF, 0xFF, 0x00, 0x00, /* Logical Maximum (65535), */
199 0x95, 0x03, /* Report Count (3), * 3x Accels */
200 0x09, 0x33, /* Usage (rX), */
201 0x09, 0x34, /* Usage (rY), */
202 0x09, 0x35, /* Usage (rZ), */
203 0x81, 0x02, /* Input (Variable), */
204 0x06, 0x00, 0xFF, /* Usage Page (FF00h), */
205 0x95, 0x03, /* Report Count (3), * Skip Accels 2nd frame */
206 0x81, 0x02, /* Input (Variable), */
207 0x05, 0x01, /* Usage Page (Desktop), */
208 0x09, 0x01, /* Usage (Pointer), */
209 0x95, 0x03, /* Report Count (3), * 3x Gyros */
210 0x81, 0x02, /* Input (Variable), */
211 0x06, 0x00, 0xFF, /* Usage Page (FF00h), */
212 0x95, 0x03, /* Report Count (3), * Skip Gyros 2nd frame */
213 0x81, 0x02, /* Input (Variable), */
214 0x75, 0x0C, /* Report Size (12), */
215 0x46, 0xFF, 0x0F, /* Physical Maximum (4095), */
216 0x26, 0xFF, 0x0F, /* Logical Maximum (4095), */
217 0x95, 0x04, /* Report Count (4), * Skip Temp and Magnetometers */
218 0x81, 0x02, /* Input (Variable), */
219 0x75, 0x08, /* Report Size (8), */
220 0x46, 0xFF, 0x00, /* Physical Maximum (255), */
221 0x26, 0xFF, 0x00, /* Logical Maximum (255), */
222 0x95, 0x06, /* Report Count (6), * Skip Timestamp and Extension Bytes */
223 0x81, 0x02, /* Input (Variable), */
224 0x75, 0x08, /* Report Size (8), */
225 0x95, 0x30, /* Report Count (48), */
226 0x09, 0x01, /* Usage (Pointer), */
227 0x91, 0x02, /* Output (Variable), */
228 0x75, 0x08, /* Report Size (8), */
229 0x95, 0x30, /* Report Count (48), */
230 0x09, 0x01, /* Usage (Pointer), */
231 0xB1, 0x02, /* Feature (Variable), */
232 0xC0, /* End Collection, */
233 0xA1, 0x02, /* Collection (Logical), */
234 0x85, 0x02, /* Report ID (2), */
235 0x75, 0x08, /* Report Size (8), */
236 0x95, 0x30, /* Report Count (48), */
237 0x09, 0x01, /* Usage (Pointer), */
238 0xB1, 0x02, /* Feature (Variable), */
239 0xC0, /* End Collection, */
240 0xA1, 0x02, /* Collection (Logical), */
241 0x85, 0xEE, /* Report ID (238), */
242 0x75, 0x08, /* Report Size (8), */
243 0x95, 0x30, /* Report Count (48), */
244 0x09, 0x01, /* Usage (Pointer), */
245 0xB1, 0x02, /* Feature (Variable), */
246 0xC0, /* End Collection, */
247 0xA1, 0x02, /* Collection (Logical), */
248 0x85, 0xEF, /* Report ID (239), */
249 0x75, 0x08, /* Report Size (8), */
250 0x95, 0x30, /* Report Count (48), */
251 0x09, 0x01, /* Usage (Pointer), */
252 0xB1, 0x02, /* Feature (Variable), */
253 0xC0, /* End Collection, */
254 0xC0 /* End Collection */
257 /* PS/3 Navigation controller */
258 static u8 navigation_rdesc[] = {
259 0x05, 0x01, /* Usage Page (Desktop), */
260 0x09, 0x04, /* Usage (Joystick), */
261 0xA1, 0x01, /* Collection (Application), */
262 0xA1, 0x02, /* Collection (Logical), */
263 0x85, 0x01, /* Report ID (1), */
264 0x75, 0x08, /* Report Size (8), */
265 0x95, 0x01, /* Report Count (1), */
266 0x15, 0x00, /* Logical Minimum (0), */
267 0x26, 0xFF, 0x00, /* Logical Maximum (255), */
268 0x81, 0x03, /* Input (Constant, Variable), */
269 0x75, 0x01, /* Report Size (1), */
270 0x95, 0x13, /* Report Count (19), */
271 0x15, 0x00, /* Logical Minimum (0), */
272 0x25, 0x01, /* Logical Maximum (1), */
273 0x35, 0x00, /* Physical Minimum (0), */
274 0x45, 0x01, /* Physical Maximum (1), */
275 0x05, 0x09, /* Usage Page (Button), */
276 0x19, 0x01, /* Usage Minimum (01h), */
277 0x29, 0x13, /* Usage Maximum (13h), */
278 0x81, 0x02, /* Input (Variable), */
279 0x75, 0x01, /* Report Size (1), */
280 0x95, 0x0D, /* Report Count (13), */
281 0x06, 0x00, 0xFF, /* Usage Page (FF00h), */
282 0x81, 0x03, /* Input (Constant, Variable), */
283 0x15, 0x00, /* Logical Minimum (0), */
284 0x26, 0xFF, 0x00, /* Logical Maximum (255), */
285 0x05, 0x01, /* Usage Page (Desktop), */
286 0x09, 0x01, /* Usage (Pointer), */
287 0xA1, 0x00, /* Collection (Physical), */
288 0x75, 0x08, /* Report Size (8), */
289 0x95, 0x02, /* Report Count (2), */
290 0x35, 0x00, /* Physical Minimum (0), */
291 0x46, 0xFF, 0x00, /* Physical Maximum (255), */
292 0x09, 0x30, /* Usage (X), */
293 0x09, 0x31, /* Usage (Y), */
294 0x81, 0x02, /* Input (Variable), */
295 0xC0, /* End Collection, */
296 0x06, 0x00, 0xFF, /* Usage Page (FF00h), */
297 0x95, 0x06, /* Report Count (6), */
298 0x81, 0x03, /* Input (Constant, Variable), */
299 0x05, 0x01, /* Usage Page (Desktop), */
300 0x75, 0x08, /* Report Size (8), */
301 0x95, 0x05, /* Report Count (5), */
302 0x09, 0x01, /* Usage (Pointer), */
303 0x81, 0x02, /* Input (Variable), */
304 0x06, 0x00, 0xFF, /* Usage Page (FF00h), */
305 0x95, 0x01, /* Report Count (1), */
306 0x81, 0x02, /* Input (Variable), */
307 0x05, 0x01, /* Usage Page (Desktop), */
308 0x95, 0x01, /* Report Count (1), */
309 0x09, 0x01, /* Usage (Pointer), */
310 0x81, 0x02, /* Input (Variable), */
311 0x06, 0x00, 0xFF, /* Usage Page (FF00h), */
312 0x95, 0x1E, /* Report Count (24), */
313 0x81, 0x02, /* Input (Variable), */
314 0x75, 0x08, /* Report Size (8), */
315 0x95, 0x30, /* Report Count (48), */
316 0x09, 0x01, /* Usage (Pointer), */
317 0x91, 0x02, /* Output (Variable), */
318 0x75, 0x08, /* Report Size (8), */
319 0x95, 0x30, /* Report Count (48), */
320 0x09, 0x01, /* Usage (Pointer), */
321 0xB1, 0x02, /* Feature (Variable), */
322 0xC0, /* End Collection, */
323 0xA1, 0x02, /* Collection (Logical), */
324 0x85, 0x02, /* Report ID (2), */
325 0x75, 0x08, /* Report Size (8), */
326 0x95, 0x30, /* Report Count (48), */
327 0x09, 0x01, /* Usage (Pointer), */
328 0xB1, 0x02, /* Feature (Variable), */
329 0xC0, /* End Collection, */
330 0xA1, 0x02, /* Collection (Logical), */
331 0x85, 0xEE, /* Report ID (238), */
332 0x75, 0x08, /* Report Size (8), */
333 0x95, 0x30, /* Report Count (48), */
334 0x09, 0x01, /* Usage (Pointer), */
335 0xB1, 0x02, /* Feature (Variable), */
336 0xC0, /* End Collection, */
337 0xA1, 0x02, /* Collection (Logical), */
338 0x85, 0xEF, /* Report ID (239), */
339 0x75, 0x08, /* Report Size (8), */
340 0x95, 0x30, /* Report Count (48), */
341 0x09, 0x01, /* Usage (Pointer), */
342 0xB1, 0x02, /* Feature (Variable), */
343 0xC0, /* End Collection, */
344 0xC0 /* End Collection */
348 * The default descriptor doesn't provide mapping for the accelerometers
349 * or orientation sensors. This fixed descriptor maps the accelerometers
350 * to usage values 0x40, 0x41 and 0x42 and maps the orientation sensors
351 * to usage values 0x43, 0x44 and 0x45.
353 static u8 dualshock4_usb_rdesc[] = {
354 0x05, 0x01, /* Usage Page (Desktop), */
355 0x09, 0x05, /* Usage (Gamepad), */
356 0xA1, 0x01, /* Collection (Application), */
357 0x85, 0x01, /* Report ID (1), */
358 0x09, 0x30, /* Usage (X), */
359 0x09, 0x31, /* Usage (Y), */
360 0x09, 0x32, /* Usage (Z), */
361 0x09, 0x35, /* Usage (Rz), */
362 0x15, 0x00, /* Logical Minimum (0), */
363 0x26, 0xFF, 0x00, /* Logical Maximum (255), */
364 0x75, 0x08, /* Report Size (8), */
365 0x95, 0x04, /* Report Count (4), */
366 0x81, 0x02, /* Input (Variable), */
367 0x09, 0x39, /* Usage (Hat Switch), */
368 0x15, 0x00, /* Logical Minimum (0), */
369 0x25, 0x07, /* Logical Maximum (7), */
370 0x35, 0x00, /* Physical Minimum (0), */
371 0x46, 0x3B, 0x01, /* Physical Maximum (315), */
372 0x65, 0x14, /* Unit (Degrees), */
373 0x75, 0x04, /* Report Size (4), */
374 0x95, 0x01, /* Report Count (1), */
375 0x81, 0x42, /* Input (Variable, Null State), */
376 0x65, 0x00, /* Unit, */
377 0x05, 0x09, /* Usage Page (Button), */
378 0x19, 0x01, /* Usage Minimum (01h), */
379 0x29, 0x0D, /* Usage Maximum (0Dh), */
380 0x15, 0x00, /* Logical Minimum (0), */
381 0x25, 0x01, /* Logical Maximum (1), */
382 0x75, 0x01, /* Report Size (1), */
383 0x95, 0x0E, /* Report Count (14), */
384 0x81, 0x02, /* Input (Variable), */
385 0x06, 0x00, 0xFF, /* Usage Page (FF00h), */
386 0x09, 0x20, /* Usage (20h), */
387 0x75, 0x06, /* Report Size (6), */
388 0x95, 0x01, /* Report Count (1), */
389 0x15, 0x00, /* Logical Minimum (0), */
390 0x25, 0x3F, /* Logical Maximum (63), */
391 0x81, 0x02, /* Input (Variable), */
392 0x05, 0x01, /* Usage Page (Desktop), */
393 0x09, 0x33, /* Usage (Rx), */
394 0x09, 0x34, /* Usage (Ry), */
395 0x15, 0x00, /* Logical Minimum (0), */
396 0x26, 0xFF, 0x00, /* Logical Maximum (255), */
397 0x75, 0x08, /* Report Size (8), */
398 0x95, 0x02, /* Report Count (2), */
399 0x81, 0x02, /* Input (Variable), */
400 0x06, 0x00, 0xFF, /* Usage Page (FF00h), */
401 0x09, 0x21, /* Usage (21h), */
402 0x95, 0x03, /* Report Count (3), */
403 0x81, 0x02, /* Input (Variable), */
404 0x05, 0x01, /* Usage Page (Desktop), */
405 0x19, 0x40, /* Usage Minimum (40h), */
406 0x29, 0x42, /* Usage Maximum (42h), */
407 0x16, 0x00, 0x80, /* Logical Minimum (-32768), */
408 0x26, 0xFF, 0x7F, /* Logical Maximum (32767), */
409 0x75, 0x10, /* Report Size (16), */
410 0x95, 0x03, /* Report Count (3), */
411 0x81, 0x02, /* Input (Variable), */
412 0x19, 0x43, /* Usage Minimum (43h), */
413 0x29, 0x45, /* Usage Maximum (45h), */
414 0x16, 0x00, 0x80, /* Logical Minimum (-32768), */
415 0x26, 0xFF, 0x7F, /* Logical Maximum (32767), */
416 0x95, 0x03, /* Report Count (3), */
417 0x81, 0x02, /* Input (Variable), */
418 0x06, 0x00, 0xFF, /* Usage Page (FF00h), */
419 0x09, 0x21, /* Usage (21h), */
420 0x15, 0x00, /* Logical Minimum (0), */
421 0x26, 0xFF, 0x00, /* Logical Maximum (255), */
422 0x75, 0x08, /* Report Size (8), */
423 0x95, 0x27, /* Report Count (39), */
424 0x81, 0x02, /* Input (Variable), */
425 0x85, 0x05, /* Report ID (5), */
426 0x09, 0x22, /* Usage (22h), */
427 0x95, 0x1F, /* Report Count (31), */
428 0x91, 0x02, /* Output (Variable), */
429 0x85, 0x04, /* Report ID (4), */
430 0x09, 0x23, /* Usage (23h), */
431 0x95, 0x24, /* Report Count (36), */
432 0xB1, 0x02, /* Feature (Variable), */
433 0x85, 0x02, /* Report ID (2), */
434 0x09, 0x24, /* Usage (24h), */
435 0x95, 0x24, /* Report Count (36), */
436 0xB1, 0x02, /* Feature (Variable), */
437 0x85, 0x08, /* Report ID (8), */
438 0x09, 0x25, /* Usage (25h), */
439 0x95, 0x03, /* Report Count (3), */
440 0xB1, 0x02, /* Feature (Variable), */
441 0x85, 0x10, /* Report ID (16), */
442 0x09, 0x26, /* Usage (26h), */
443 0x95, 0x04, /* Report Count (4), */
444 0xB1, 0x02, /* Feature (Variable), */
445 0x85, 0x11, /* Report ID (17), */
446 0x09, 0x27, /* Usage (27h), */
447 0x95, 0x02, /* Report Count (2), */
448 0xB1, 0x02, /* Feature (Variable), */
449 0x85, 0x12, /* Report ID (18), */
450 0x06, 0x02, 0xFF, /* Usage Page (FF02h), */
451 0x09, 0x21, /* Usage (21h), */
452 0x95, 0x0F, /* Report Count (15), */
453 0xB1, 0x02, /* Feature (Variable), */
454 0x85, 0x13, /* Report ID (19), */
455 0x09, 0x22, /* Usage (22h), */
456 0x95, 0x16, /* Report Count (22), */
457 0xB1, 0x02, /* Feature (Variable), */
458 0x85, 0x14, /* Report ID (20), */
459 0x06, 0x05, 0xFF, /* Usage Page (FF05h), */
460 0x09, 0x20, /* Usage (20h), */
461 0x95, 0x10, /* Report Count (16), */
462 0xB1, 0x02, /* Feature (Variable), */
463 0x85, 0x15, /* Report ID (21), */
464 0x09, 0x21, /* Usage (21h), */
465 0x95, 0x2C, /* Report Count (44), */
466 0xB1, 0x02, /* Feature (Variable), */
467 0x06, 0x80, 0xFF, /* Usage Page (FF80h), */
468 0x85, 0x80, /* Report ID (128), */
469 0x09, 0x20, /* Usage (20h), */
470 0x95, 0x06, /* Report Count (6), */
471 0xB1, 0x02, /* Feature (Variable), */
472 0x85, 0x81, /* Report ID (129), */
473 0x09, 0x21, /* Usage (21h), */
474 0x95, 0x06, /* Report Count (6), */
475 0xB1, 0x02, /* Feature (Variable), */
476 0x85, 0x82, /* Report ID (130), */
477 0x09, 0x22, /* Usage (22h), */
478 0x95, 0x05, /* Report Count (5), */
479 0xB1, 0x02, /* Feature (Variable), */
480 0x85, 0x83, /* Report ID (131), */
481 0x09, 0x23, /* Usage (23h), */
482 0x95, 0x01, /* Report Count (1), */
483 0xB1, 0x02, /* Feature (Variable), */
484 0x85, 0x84, /* Report ID (132), */
485 0x09, 0x24, /* Usage (24h), */
486 0x95, 0x04, /* Report Count (4), */
487 0xB1, 0x02, /* Feature (Variable), */
488 0x85, 0x85, /* Report ID (133), */
489 0x09, 0x25, /* Usage (25h), */
490 0x95, 0x06, /* Report Count (6), */
491 0xB1, 0x02, /* Feature (Variable), */
492 0x85, 0x86, /* Report ID (134), */
493 0x09, 0x26, /* Usage (26h), */
494 0x95, 0x06, /* Report Count (6), */
495 0xB1, 0x02, /* Feature (Variable), */
496 0x85, 0x87, /* Report ID (135), */
497 0x09, 0x27, /* Usage (27h), */
498 0x95, 0x23, /* Report Count (35), */
499 0xB1, 0x02, /* Feature (Variable), */
500 0x85, 0x88, /* Report ID (136), */
501 0x09, 0x28, /* Usage (28h), */
502 0x95, 0x22, /* Report Count (34), */
503 0xB1, 0x02, /* Feature (Variable), */
504 0x85, 0x89, /* Report ID (137), */
505 0x09, 0x29, /* Usage (29h), */
506 0x95, 0x02, /* Report Count (2), */
507 0xB1, 0x02, /* Feature (Variable), */
508 0x85, 0x90, /* Report ID (144), */
509 0x09, 0x30, /* Usage (30h), */
510 0x95, 0x05, /* Report Count (5), */
511 0xB1, 0x02, /* Feature (Variable), */
512 0x85, 0x91, /* Report ID (145), */
513 0x09, 0x31, /* Usage (31h), */
514 0x95, 0x03, /* Report Count (3), */
515 0xB1, 0x02, /* Feature (Variable), */
516 0x85, 0x92, /* Report ID (146), */
517 0x09, 0x32, /* Usage (32h), */
518 0x95, 0x03, /* Report Count (3), */
519 0xB1, 0x02, /* Feature (Variable), */
520 0x85, 0x93, /* Report ID (147), */
521 0x09, 0x33, /* Usage (33h), */
522 0x95, 0x0C, /* Report Count (12), */
523 0xB1, 0x02, /* Feature (Variable), */
524 0x85, 0xA0, /* Report ID (160), */
525 0x09, 0x40, /* Usage (40h), */
526 0x95, 0x06, /* Report Count (6), */
527 0xB1, 0x02, /* Feature (Variable), */
528 0x85, 0xA1, /* Report ID (161), */
529 0x09, 0x41, /* Usage (41h), */
530 0x95, 0x01, /* Report Count (1), */
531 0xB1, 0x02, /* Feature (Variable), */
532 0x85, 0xA2, /* Report ID (162), */
533 0x09, 0x42, /* Usage (42h), */
534 0x95, 0x01, /* Report Count (1), */
535 0xB1, 0x02, /* Feature (Variable), */
536 0x85, 0xA3, /* Report ID (163), */
537 0x09, 0x43, /* Usage (43h), */
538 0x95, 0x30, /* Report Count (48), */
539 0xB1, 0x02, /* Feature (Variable), */
540 0x85, 0xA4, /* Report ID (164), */
541 0x09, 0x44, /* Usage (44h), */
542 0x95, 0x0D, /* Report Count (13), */
543 0xB1, 0x02, /* Feature (Variable), */
544 0x85, 0xA5, /* Report ID (165), */
545 0x09, 0x45, /* Usage (45h), */
546 0x95, 0x15, /* Report Count (21), */
547 0xB1, 0x02, /* Feature (Variable), */
548 0x85, 0xA6, /* Report ID (166), */
549 0x09, 0x46, /* Usage (46h), */
550 0x95, 0x15, /* Report Count (21), */
551 0xB1, 0x02, /* Feature (Variable), */
552 0x85, 0xF0, /* Report ID (240), */
553 0x09, 0x47, /* Usage (47h), */
554 0x95, 0x3F, /* Report Count (63), */
555 0xB1, 0x02, /* Feature (Variable), */
556 0x85, 0xF1, /* Report ID (241), */
557 0x09, 0x48, /* Usage (48h), */
558 0x95, 0x3F, /* Report Count (63), */
559 0xB1, 0x02, /* Feature (Variable), */
560 0x85, 0xF2, /* Report ID (242), */
561 0x09, 0x49, /* Usage (49h), */
562 0x95, 0x0F, /* Report Count (15), */
563 0xB1, 0x02, /* Feature (Variable), */
564 0x85, 0xA7, /* Report ID (167), */
565 0x09, 0x4A, /* Usage (4Ah), */
566 0x95, 0x01, /* Report Count (1), */
567 0xB1, 0x02, /* Feature (Variable), */
568 0x85, 0xA8, /* Report ID (168), */
569 0x09, 0x4B, /* Usage (4Bh), */
570 0x95, 0x01, /* Report Count (1), */
571 0xB1, 0x02, /* Feature (Variable), */
572 0x85, 0xA9, /* Report ID (169), */
573 0x09, 0x4C, /* Usage (4Ch), */
574 0x95, 0x08, /* Report Count (8), */
575 0xB1, 0x02, /* Feature (Variable), */
576 0x85, 0xAA, /* Report ID (170), */
577 0x09, 0x4E, /* Usage (4Eh), */
578 0x95, 0x01, /* Report Count (1), */
579 0xB1, 0x02, /* Feature (Variable), */
580 0x85, 0xAB, /* Report ID (171), */
581 0x09, 0x4F, /* Usage (4Fh), */
582 0x95, 0x39, /* Report Count (57), */
583 0xB1, 0x02, /* Feature (Variable), */
584 0x85, 0xAC, /* Report ID (172), */
585 0x09, 0x50, /* Usage (50h), */
586 0x95, 0x39, /* Report Count (57), */
587 0xB1, 0x02, /* Feature (Variable), */
588 0x85, 0xAD, /* Report ID (173), */
589 0x09, 0x51, /* Usage (51h), */
590 0x95, 0x0B, /* Report Count (11), */
591 0xB1, 0x02, /* Feature (Variable), */
592 0x85, 0xAE, /* Report ID (174), */
593 0x09, 0x52, /* Usage (52h), */
594 0x95, 0x01, /* Report Count (1), */
595 0xB1, 0x02, /* Feature (Variable), */
596 0x85, 0xAF, /* Report ID (175), */
597 0x09, 0x53, /* Usage (53h), */
598 0x95, 0x02, /* Report Count (2), */
599 0xB1, 0x02, /* Feature (Variable), */
600 0x85, 0xB0, /* Report ID (176), */
601 0x09, 0x54, /* Usage (54h), */
602 0x95, 0x3F, /* Report Count (63), */
603 0xB1, 0x02, /* Feature (Variable), */
604 0xC0 /* End Collection */
608 * The default behavior of the Dualshock 4 is to send reports using report
609 * type 1 when running over Bluetooth. However, when feature report 2 is
610 * requested during the controller initialization it starts sending input
611 * reports in report 17. Since report 17 is undefined in the default HID
612 * descriptor the button and axis definitions must be moved to report 17 or
613 * the HID layer won't process the received input.
615 static u8 dualshock4_bt_rdesc[] = {
616 0x05, 0x01, /* Usage Page (Desktop), */
617 0x09, 0x05, /* Usage (Gamepad), */
618 0xA1, 0x01, /* Collection (Application), */
619 0x85, 0x01, /* Report ID (1), */
620 0x75, 0x08, /* Report Size (8), */
621 0x95, 0x0A, /* Report Count (9), */
622 0x81, 0x02, /* Input (Variable), */
623 0x06, 0x04, 0xFF, /* Usage Page (FF04h), */
624 0x85, 0x02, /* Report ID (2), */
625 0x09, 0x24, /* Usage (24h), */
626 0x95, 0x24, /* Report Count (36), */
627 0xB1, 0x02, /* Feature (Variable), */
628 0x85, 0xA3, /* Report ID (163), */
629 0x09, 0x25, /* Usage (25h), */
630 0x95, 0x30, /* Report Count (48), */
631 0xB1, 0x02, /* Feature (Variable), */
632 0x85, 0x05, /* Report ID (5), */
633 0x09, 0x26, /* Usage (26h), */
634 0x95, 0x28, /* Report Count (40), */
635 0xB1, 0x02, /* Feature (Variable), */
636 0x85, 0x06, /* Report ID (6), */
637 0x09, 0x27, /* Usage (27h), */
638 0x95, 0x34, /* Report Count (52), */
639 0xB1, 0x02, /* Feature (Variable), */
640 0x85, 0x07, /* Report ID (7), */
641 0x09, 0x28, /* Usage (28h), */
642 0x95, 0x30, /* Report Count (48), */
643 0xB1, 0x02, /* Feature (Variable), */
644 0x85, 0x08, /* Report ID (8), */
645 0x09, 0x29, /* Usage (29h), */
646 0x95, 0x2F, /* Report Count (47), */
647 0xB1, 0x02, /* Feature (Variable), */
648 0x06, 0x03, 0xFF, /* Usage Page (FF03h), */
649 0x85, 0x03, /* Report ID (3), */
650 0x09, 0x21, /* Usage (21h), */
651 0x95, 0x26, /* Report Count (38), */
652 0xB1, 0x02, /* Feature (Variable), */
653 0x85, 0x04, /* Report ID (4), */
654 0x09, 0x22, /* Usage (22h), */
655 0x95, 0x2E, /* Report Count (46), */
656 0xB1, 0x02, /* Feature (Variable), */
657 0x85, 0xF0, /* Report ID (240), */
658 0x09, 0x47, /* Usage (47h), */
659 0x95, 0x3F, /* Report Count (63), */
660 0xB1, 0x02, /* Feature (Variable), */
661 0x85, 0xF1, /* Report ID (241), */
662 0x09, 0x48, /* Usage (48h), */
663 0x95, 0x3F, /* Report Count (63), */
664 0xB1, 0x02, /* Feature (Variable), */
665 0x85, 0xF2, /* Report ID (242), */
666 0x09, 0x49, /* Usage (49h), */
667 0x95, 0x0F, /* Report Count (15), */
668 0xB1, 0x02, /* Feature (Variable), */
669 0x85, 0x11, /* Report ID (17), */
670 0x06, 0x00, 0xFF, /* Usage Page (FF00h), */
671 0x09, 0x20, /* Usage (20h), */
672 0x95, 0x02, /* Report Count (2), */
673 0x81, 0x02, /* Input (Variable), */
674 0x05, 0x01, /* Usage Page (Desktop), */
675 0x09, 0x30, /* Usage (X), */
676 0x09, 0x31, /* Usage (Y), */
677 0x09, 0x32, /* Usage (Z), */
678 0x09, 0x35, /* Usage (Rz), */
679 0x15, 0x00, /* Logical Minimum (0), */
680 0x26, 0xFF, 0x00, /* Logical Maximum (255), */
681 0x75, 0x08, /* Report Size (8), */
682 0x95, 0x04, /* Report Count (4), */
683 0x81, 0x02, /* Input (Variable), */
684 0x09, 0x39, /* Usage (Hat Switch), */
685 0x15, 0x00, /* Logical Minimum (0), */
686 0x25, 0x07, /* Logical Maximum (7), */
687 0x75, 0x04, /* Report Size (4), */
688 0x95, 0x01, /* Report Count (1), */
689 0x81, 0x42, /* Input (Variable, Null State), */
690 0x05, 0x09, /* Usage Page (Button), */
691 0x19, 0x01, /* Usage Minimum (01h), */
692 0x29, 0x0D, /* Usage Maximum (0Dh), */
693 0x15, 0x00, /* Logical Minimum (0), */
694 0x25, 0x01, /* Logical Maximum (1), */
695 0x75, 0x01, /* Report Size (1), */
696 0x95, 0x0E, /* Report Count (14), */
697 0x81, 0x02, /* Input (Variable), */
698 0x75, 0x06, /* Report Size (6), */
699 0x95, 0x01, /* Report Count (1), */
700 0x81, 0x01, /* Input (Constant), */
701 0x05, 0x01, /* Usage Page (Desktop), */
702 0x09, 0x33, /* Usage (Rx), */
703 0x09, 0x34, /* Usage (Ry), */
704 0x15, 0x00, /* Logical Minimum (0), */
705 0x26, 0xFF, 0x00, /* Logical Maximum (255), */
706 0x75, 0x08, /* Report Size (8), */
707 0x95, 0x02, /* Report Count (2), */
708 0x81, 0x02, /* Input (Variable), */
709 0x06, 0x00, 0xFF, /* Usage Page (FF00h), */
710 0x09, 0x20, /* Usage (20h), */
711 0x95, 0x03, /* Report Count (3), */
712 0x81, 0x02, /* Input (Variable), */
713 0x05, 0x01, /* Usage Page (Desktop), */
714 0x19, 0x40, /* Usage Minimum (40h), */
715 0x29, 0x42, /* Usage Maximum (42h), */
716 0x16, 0x00, 0x80, /* Logical Minimum (-32768), */
717 0x26, 0xFF, 0x7F, /* Logical Maximum (32767), */
718 0x75, 0x10, /* Report Size (16), */
719 0x95, 0x03, /* Report Count (3), */
720 0x81, 0x02, /* Input (Variable), */
721 0x19, 0x43, /* Usage Minimum (43h), */
722 0x29, 0x45, /* Usage Maximum (45h), */
723 0x16, 0x00, 0x80, /* Logical Minimum (-32768), */
724 0x26, 0xFF, 0x7F, /* Logical Maximum (32767), */
725 0x95, 0x03, /* Report Count (3), */
726 0x81, 0x02, /* Input (Variable), */
727 0x06, 0x00, 0xFF, /* Usage Page (FF00h), */
728 0x09, 0x20, /* Usage (20h), */
729 0x15, 0x00, /* Logical Minimum (0), */
730 0x26, 0xFF, 0x00, /* Logical Maximum (255), */
731 0x75, 0x08, /* Report Size (8), */
732 0x95, 0x31, /* Report Count (51), */
733 0x81, 0x02, /* Input (Variable), */
734 0x09, 0x21, /* Usage (21h), */
735 0x75, 0x08, /* Report Size (8), */
736 0x95, 0x4D, /* Report Count (77), */
737 0x91, 0x02, /* Output (Variable), */
738 0x85, 0x12, /* Report ID (18), */
739 0x09, 0x22, /* Usage (22h), */
740 0x95, 0x8D, /* Report Count (141), */
741 0x81, 0x02, /* Input (Variable), */
742 0x09, 0x23, /* Usage (23h), */
743 0x91, 0x02, /* Output (Variable), */
744 0x85, 0x13, /* Report ID (19), */
745 0x09, 0x24, /* Usage (24h), */
746 0x95, 0xCD, /* Report Count (205), */
747 0x81, 0x02, /* Input (Variable), */
748 0x09, 0x25, /* Usage (25h), */
749 0x91, 0x02, /* Output (Variable), */
750 0x85, 0x14, /* Report ID (20), */
751 0x09, 0x26, /* Usage (26h), */
752 0x96, 0x0D, 0x01, /* Report Count (269), */
753 0x81, 0x02, /* Input (Variable), */
754 0x09, 0x27, /* Usage (27h), */
755 0x91, 0x02, /* Output (Variable), */
756 0x85, 0x15, /* Report ID (21), */
757 0x09, 0x28, /* Usage (28h), */
758 0x96, 0x4D, 0x01, /* Report Count (333), */
759 0x81, 0x02, /* Input (Variable), */
760 0x09, 0x29, /* Usage (29h), */
761 0x91, 0x02, /* Output (Variable), */
762 0x85, 0x16, /* Report ID (22), */
763 0x09, 0x2A, /* Usage (2Ah), */
764 0x96, 0x8D, 0x01, /* Report Count (397), */
765 0x81, 0x02, /* Input (Variable), */
766 0x09, 0x2B, /* Usage (2Bh), */
767 0x91, 0x02, /* Output (Variable), */
768 0x85, 0x17, /* Report ID (23), */
769 0x09, 0x2C, /* Usage (2Ch), */
770 0x96, 0xCD, 0x01, /* Report Count (461), */
771 0x81, 0x02, /* Input (Variable), */
772 0x09, 0x2D, /* Usage (2Dh), */
773 0x91, 0x02, /* Output (Variable), */
774 0x85, 0x18, /* Report ID (24), */
775 0x09, 0x2E, /* Usage (2Eh), */
776 0x96, 0x0D, 0x02, /* Report Count (525), */
777 0x81, 0x02, /* Input (Variable), */
778 0x09, 0x2F, /* Usage (2Fh), */
779 0x91, 0x02, /* Output (Variable), */
780 0x85, 0x19, /* Report ID (25), */
781 0x09, 0x30, /* Usage (30h), */
782 0x96, 0x22, 0x02, /* Report Count (546), */
783 0x81, 0x02, /* Input (Variable), */
784 0x09, 0x31, /* Usage (31h), */
785 0x91, 0x02, /* Output (Variable), */
786 0x06, 0x80, 0xFF, /* Usage Page (FF80h), */
787 0x85, 0x82, /* Report ID (130), */
788 0x09, 0x22, /* Usage (22h), */
789 0x95, 0x3F, /* Report Count (63), */
790 0xB1, 0x02, /* Feature (Variable), */
791 0x85, 0x83, /* Report ID (131), */
792 0x09, 0x23, /* Usage (23h), */
793 0xB1, 0x02, /* Feature (Variable), */
794 0x85, 0x84, /* Report ID (132), */
795 0x09, 0x24, /* Usage (24h), */
796 0xB1, 0x02, /* Feature (Variable), */
797 0x85, 0x90, /* Report ID (144), */
798 0x09, 0x30, /* Usage (30h), */
799 0xB1, 0x02, /* Feature (Variable), */
800 0x85, 0x91, /* Report ID (145), */
801 0x09, 0x31, /* Usage (31h), */
802 0xB1, 0x02, /* Feature (Variable), */
803 0x85, 0x92, /* Report ID (146), */
804 0x09, 0x32, /* Usage (32h), */
805 0xB1, 0x02, /* Feature (Variable), */
806 0x85, 0x93, /* Report ID (147), */
807 0x09, 0x33, /* Usage (33h), */
808 0xB1, 0x02, /* Feature (Variable), */
809 0x85, 0xA0, /* Report ID (160), */
810 0x09, 0x40, /* Usage (40h), */
811 0xB1, 0x02, /* Feature (Variable), */
812 0x85, 0xA4, /* Report ID (164), */
813 0x09, 0x44, /* Usage (44h), */
814 0xB1, 0x02, /* Feature (Variable), */
815 0xC0 /* End Collection */
818 static u8 ps3remote_rdesc[] = {
819 0x05, 0x01, /* GUsagePage Generic Desktop */
820 0x09, 0x05, /* LUsage 0x05 [Game Pad] */
821 0xA1, 0x01, /* MCollection Application (mouse, keyboard) */
823 /* Use collection 1 for joypad buttons */
824 0xA1, 0x02, /* MCollection Logical (interrelated data) */
827 * Ignore the 1st byte, maybe it is used for a controller
828 * number but it's not needed for correct operation
830 0x75, 0x08, /* GReportSize 0x08 [8] */
831 0x95, 0x01, /* GReportCount 0x01 [1] */
832 0x81, 0x01, /* MInput 0x01 (Const[0] Arr[1] Abs[2]) */
835 * Bytes from 2nd to 4th are a bitmap for joypad buttons, for these
836 * buttons multiple keypresses are allowed
838 0x05, 0x09, /* GUsagePage Button */
839 0x19, 0x01, /* LUsageMinimum 0x01 [Button 1 (primary/trigger)] */
840 0x29, 0x18, /* LUsageMaximum 0x18 [Button 24] */
841 0x14, /* GLogicalMinimum [0] */
842 0x25, 0x01, /* GLogicalMaximum 0x01 [1] */
843 0x75, 0x01, /* GReportSize 0x01 [1] */
844 0x95, 0x18, /* GReportCount 0x18 [24] */
845 0x81, 0x02, /* MInput 0x02 (Data[0] Var[1] Abs[2]) */
847 0xC0, /* MEndCollection */
849 /* Use collection 2 for remote control buttons */
850 0xA1, 0x02, /* MCollection Logical (interrelated data) */
852 /* 5th byte is used for remote control buttons */
853 0x05, 0x09, /* GUsagePage Button */
854 0x18, /* LUsageMinimum [No button pressed] */
855 0x29, 0xFE, /* LUsageMaximum 0xFE [Button 254] */
856 0x14, /* GLogicalMinimum [0] */
857 0x26, 0xFE, 0x00, /* GLogicalMaximum 0x00FE [254] */
858 0x75, 0x08, /* GReportSize 0x08 [8] */
859 0x95, 0x01, /* GReportCount 0x01 [1] */
863 * Ignore bytes from 6th to 11th, 6th to 10th are always constant at
864 * 0xff and 11th is for press indication
866 0x75, 0x08, /* GReportSize 0x08 [8] */
867 0x95, 0x06, /* GReportCount 0x06 [6] */
868 0x81, 0x01, /* MInput 0x01 (Const[0] Arr[1] Abs[2]) */
870 /* 12th byte is for battery strength */
871 0x05, 0x06, /* GUsagePage Generic Device Controls */
872 0x09, 0x20, /* LUsage 0x20 [Battery Strength] */
873 0x14, /* GLogicalMinimum [0] */
874 0x25, 0x05, /* GLogicalMaximum 0x05 [5] */
875 0x75, 0x08, /* GReportSize 0x08 [8] */
876 0x95, 0x01, /* GReportCount 0x01 [1] */
877 0x81, 0x02, /* MInput 0x02 (Data[0] Var[1] Abs[2]) */
879 0xC0, /* MEndCollection */
881 0xC0 /* MEndCollection [Game Pad] */
884 static const unsigned int ps3remote_keymap_joypad_buttons[] = {
886 [0x02] = BTN_THUMBL, /* L3 */
887 [0x03] = BTN_THUMBR, /* R3 */
893 [0x09] = BTN_TL2, /* L2 */
894 [0x0a] = BTN_TR2, /* R2 */
895 [0x0b] = BTN_TL, /* L1 */
896 [0x0c] = BTN_TR, /* R1 */
897 [0x0d] = KEY_OPTION, /* options/triangle */
898 [0x0e] = KEY_BACK, /* back/circle */
899 [0x0f] = BTN_0, /* cross */
900 [0x10] = KEY_SCREEN, /* view/square */
901 [0x11] = KEY_HOMEPAGE, /* PS button */
904 static const unsigned int ps3remote_keymap_remote_buttons[] = {
915 [0x0e] = KEY_ESC, /* return */
917 [0x16] = KEY_EJECTCD,
918 [0x1a] = KEY_MENU, /* top menu */
920 [0x30] = KEY_PREVIOUS,
923 [0x33] = KEY_REWIND, /* scan back */
924 [0x34] = KEY_FORWARD, /* scan forward */
927 [0x40] = KEY_CONTEXT_MENU, /* pop up/menu */
928 [0x60] = KEY_FRAMEBACK, /* slow/step back */
929 [0x61] = KEY_FRAMEFORWARD, /* slow/step forward */
930 [0x63] = KEY_SUBTITLE,
933 [0x70] = KEY_INFO, /* display */
940 static const unsigned int buzz_keymap[] = {
942 * The controller has 4 remote buzzers, each with one LED and 5
945 * We use the mapping chosen by the controller, which is:
948 * -------------------
955 * So, for example, the orange button on the third buzzer is mapped to
956 * BTN_TRIGGER_HAPPY14
958 [1] = BTN_TRIGGER_HAPPY1,
959 [2] = BTN_TRIGGER_HAPPY2,
960 [3] = BTN_TRIGGER_HAPPY3,
961 [4] = BTN_TRIGGER_HAPPY4,
962 [5] = BTN_TRIGGER_HAPPY5,
963 [6] = BTN_TRIGGER_HAPPY6,
964 [7] = BTN_TRIGGER_HAPPY7,
965 [8] = BTN_TRIGGER_HAPPY8,
966 [9] = BTN_TRIGGER_HAPPY9,
967 [10] = BTN_TRIGGER_HAPPY10,
968 [11] = BTN_TRIGGER_HAPPY11,
969 [12] = BTN_TRIGGER_HAPPY12,
970 [13] = BTN_TRIGGER_HAPPY13,
971 [14] = BTN_TRIGGER_HAPPY14,
972 [15] = BTN_TRIGGER_HAPPY15,
973 [16] = BTN_TRIGGER_HAPPY16,
974 [17] = BTN_TRIGGER_HAPPY17,
975 [18] = BTN_TRIGGER_HAPPY18,
976 [19] = BTN_TRIGGER_HAPPY19,
977 [20] = BTN_TRIGGER_HAPPY20,
980 static const unsigned int ds4_absmap[] = {
983 [0x32] = ABS_RX, /* right stick X */
984 [0x33] = ABS_Z, /* L2 */
985 [0x34] = ABS_RZ, /* R2 */
986 [0x35] = ABS_RY, /* right stick Y */
989 static const unsigned int ds4_keymap[] = {
990 [0x1] = BTN_WEST, /* Square */
991 [0x2] = BTN_SOUTH, /* Cross */
992 [0x3] = BTN_EAST, /* Circle */
993 [0x4] = BTN_NORTH, /* Triangle */
994 [0x5] = BTN_TL, /* L1 */
995 [0x6] = BTN_TR, /* R1 */
996 [0x7] = BTN_TL2, /* L2 */
997 [0x8] = BTN_TR2, /* R2 */
998 [0x9] = BTN_SELECT, /* Share */
999 [0xa] = BTN_START, /* Options */
1000 [0xb] = BTN_THUMBL, /* L3 */
1001 [0xc] = BTN_THUMBR, /* R3 */
1002 [0xd] = BTN_MODE, /* PS */
1006 static enum power_supply_property sony_battery_props[] = {
1007 POWER_SUPPLY_PROP_PRESENT,
1008 POWER_SUPPLY_PROP_CAPACITY,
1009 POWER_SUPPLY_PROP_SCOPE,
1010 POWER_SUPPLY_PROP_STATUS,
1013 struct sixaxis_led {
1014 u8 time_enabled; /* the total time the led is active (0xff means forever) */
1015 u8 duty_length; /* how long a cycle is in deciseconds (0 means "really fast") */
1017 u8 duty_off; /* % of duty_length the led is off (0xff means 100%) */
1018 u8 duty_on; /* % of duty_length the led is on (0xff mean 100%) */
1021 struct sixaxis_rumble {
1023 u8 right_duration; /* Right motor duration (0xff means forever) */
1024 u8 right_motor_on; /* Right (small) motor on/off, only supports values of 0 or 1 (off/on) */
1025 u8 left_duration; /* Left motor duration (0xff means forever) */
1026 u8 left_motor_force; /* left (large) motor, supports force values from 0 to 255 */
1029 struct sixaxis_output_report {
1031 struct sixaxis_rumble rumble;
1033 u8 leds_bitmap; /* bitmap of enabled LEDs: LED_1 = 0x02, LED_2 = 0x04, ... */
1034 struct sixaxis_led led[4]; /* LEDx at (4 - x) */
1035 struct sixaxis_led _reserved; /* LED5, not actually soldered */
1038 union sixaxis_output_report_01 {
1039 struct sixaxis_output_report data;
1043 struct motion_output_report_02 {
1050 #define DS4_FEATURE_REPORT_0x02_SIZE 37
1051 #define DS4_FEATURE_REPORT_0x81_SIZE 7
1052 #define DS4_INPUT_REPORT_0x11_SIZE 78
1053 #define DS4_OUTPUT_REPORT_0x05_SIZE 32
1054 #define DS4_OUTPUT_REPORT_0x11_SIZE 78
1055 #define SIXAXIS_REPORT_0xF2_SIZE 17
1056 #define SIXAXIS_REPORT_0xF5_SIZE 8
1057 #define MOTION_REPORT_0x02_SIZE 49
1059 /* Offsets relative to USB input report (0x1). Bluetooth (0x11) requires an
1062 #define DS4_INPUT_REPORT_BUTTON_OFFSET 5
1063 #define DS4_INPUT_REPORT_BATTERY_OFFSET 30
1064 #define DS4_INPUT_REPORT_TOUCHPAD_OFFSET 33
1066 #define DS4_TOUCHPAD_SUFFIX " Touchpad"
1068 static DEFINE_SPINLOCK(sony_dev_list_lock);
1069 static LIST_HEAD(sony_device_list);
1070 static DEFINE_IDA(sony_device_id_allocator);
1074 struct list_head list_node;
1075 struct hid_device *hdev;
1076 struct input_dev *touchpad;
1077 struct led_classdev *leds[MAX_LEDS];
1078 unsigned long quirks;
1079 struct work_struct state_worker;
1080 void (*send_output_report)(struct sony_sc *);
1081 struct power_supply *battery;
1082 struct power_supply_desc battery_desc;
1084 u8 *output_report_dmabuf;
1086 #ifdef CONFIG_SONY_FF
1092 u8 worker_initialized;
1093 u8 defer_initialization;
1095 u8 battery_charging;
1096 u8 battery_capacity;
1097 u8 led_state[MAX_LEDS];
1098 u8 resume_led_state[MAX_LEDS];
1099 u8 led_delay_on[MAX_LEDS];
1100 u8 led_delay_off[MAX_LEDS];
1104 static inline void sony_schedule_work(struct sony_sc *sc)
1106 if (!sc->defer_initialization)
1107 schedule_work(&sc->state_worker);
1110 static u8 *sixaxis_fixup(struct hid_device *hdev, u8 *rdesc,
1111 unsigned int *rsize)
1113 *rsize = sizeof(sixaxis_rdesc);
1114 return sixaxis_rdesc;
1117 static u8 *motion_fixup(struct hid_device *hdev, u8 *rdesc,
1118 unsigned int *rsize)
1120 *rsize = sizeof(motion_rdesc);
1121 return motion_rdesc;
1124 static u8 *navigation_fixup(struct hid_device *hdev, u8 *rdesc,
1125 unsigned int *rsize)
1127 *rsize = sizeof(navigation_rdesc);
1128 return navigation_rdesc;
1131 static u8 *ps3remote_fixup(struct hid_device *hdev, u8 *rdesc,
1132 unsigned int *rsize)
1134 *rsize = sizeof(ps3remote_rdesc);
1135 return ps3remote_rdesc;
1138 static int ps3remote_mapping(struct hid_device *hdev, struct hid_input *hi,
1139 struct hid_field *field, struct hid_usage *usage,
1140 unsigned long **bit, int *max)
1142 unsigned int key = usage->hid & HID_USAGE;
1144 if ((usage->hid & HID_USAGE_PAGE) != HID_UP_BUTTON)
1147 switch (usage->collection_index) {
1149 if (key >= ARRAY_SIZE(ps3remote_keymap_joypad_buttons))
1152 key = ps3remote_keymap_joypad_buttons[key];
1157 if (key >= ARRAY_SIZE(ps3remote_keymap_remote_buttons))
1160 key = ps3remote_keymap_remote_buttons[key];
1168 hid_map_usage_clear(hi, usage, bit, max, EV_KEY, key);
1172 static int ds4_mapping(struct hid_device *hdev, struct hid_input *hi,
1173 struct hid_field *field, struct hid_usage *usage,
1174 unsigned long **bit, int *max)
1176 if ((usage->hid & HID_USAGE_PAGE) == HID_UP_BUTTON) {
1177 unsigned int key = usage->hid & HID_USAGE;
1179 if (key >= ARRAY_SIZE(ds4_keymap))
1182 key = ds4_keymap[key];
1183 hid_map_usage_clear(hi, usage, bit, max, EV_KEY, key);
1185 } else if ((usage->hid & HID_USAGE_PAGE) == HID_UP_GENDESK) {
1186 unsigned int abs = usage->hid & HID_USAGE;
1188 /* Let the HID parser deal with the HAT. */
1189 if (usage->hid == HID_GD_HATSWITCH)
1192 if (abs >= ARRAY_SIZE(ds4_absmap))
1195 abs = ds4_absmap[abs];
1196 hid_map_usage_clear(hi, usage, bit, max, EV_ABS, abs);
1203 static u8 *sony_report_fixup(struct hid_device *hdev, u8 *rdesc,
1204 unsigned int *rsize)
1206 struct sony_sc *sc = hid_get_drvdata(hdev);
1208 if (sc->quirks & (SINO_LITE_CONTROLLER | FUTUREMAX_DANCE_MAT))
1212 * Some Sony RF receivers wrongly declare the mouse pointer as a
1213 * a constant non-data variable.
1215 if ((sc->quirks & VAIO_RDESC_CONSTANT) && *rsize >= 56 &&
1216 /* usage page: generic desktop controls */
1217 /* rdesc[0] == 0x05 && rdesc[1] == 0x01 && */
1219 rdesc[2] == 0x09 && rdesc[3] == 0x02 &&
1220 /* input (usage page for x,y axes): constant, variable, relative */
1221 rdesc[54] == 0x81 && rdesc[55] == 0x07) {
1222 hid_info(hdev, "Fixing up Sony RF Receiver report descriptor\n");
1223 /* input: data, variable, relative */
1228 * The default Dualshock 4 USB descriptor doesn't assign
1229 * the gyroscope values to corresponding axes so we need a
1232 if (sc->quirks & DUALSHOCK4_CONTROLLER_USB) {
1233 hid_info(hdev, "Using modified Dualshock 4 report descriptor with gyroscope axes\n");
1234 rdesc = dualshock4_usb_rdesc;
1235 *rsize = sizeof(dualshock4_usb_rdesc);
1236 } else if (sc->quirks & DUALSHOCK4_CONTROLLER_BT) {
1237 hid_info(hdev, "Using modified Dualshock 4 Bluetooth report descriptor\n");
1238 rdesc = dualshock4_bt_rdesc;
1239 *rsize = sizeof(dualshock4_bt_rdesc);
1242 if (sc->quirks & SIXAXIS_CONTROLLER)
1243 return sixaxis_fixup(hdev, rdesc, rsize);
1245 if (sc->quirks & MOTION_CONTROLLER)
1246 return motion_fixup(hdev, rdesc, rsize);
1248 if (sc->quirks & NAVIGATION_CONTROLLER)
1249 return navigation_fixup(hdev, rdesc, rsize);
1251 if (sc->quirks & PS3REMOTE)
1252 return ps3remote_fixup(hdev, rdesc, rsize);
1257 static void sixaxis_parse_report(struct sony_sc *sc, u8 *rd, int size)
1259 static const u8 sixaxis_battery_capacity[] = { 0, 1, 25, 50, 75, 100 };
1260 unsigned long flags;
1262 u8 cable_state, battery_capacity, battery_charging;
1265 * The sixaxis is charging if the battery value is 0xee
1266 * and it is fully charged if the value is 0xef.
1267 * It does not report the actual level while charging so it
1268 * is set to 100% while charging is in progress.
1270 offset = (sc->quirks & MOTION_CONTROLLER) ? 12 : 30;
1272 if (rd[offset] >= 0xee) {
1273 battery_capacity = 100;
1274 battery_charging = !(rd[offset] & 0x01);
1277 u8 index = rd[offset] <= 5 ? rd[offset] : 5;
1278 battery_capacity = sixaxis_battery_capacity[index];
1279 battery_charging = 0;
1283 spin_lock_irqsave(&sc->lock, flags);
1284 sc->cable_state = cable_state;
1285 sc->battery_capacity = battery_capacity;
1286 sc->battery_charging = battery_charging;
1287 spin_unlock_irqrestore(&sc->lock, flags);
1290 static void dualshock4_parse_report(struct sony_sc *sc, u8 *rd, int size)
1292 unsigned long flags;
1293 int n, m, offset, num_touch_data, max_touch_data;
1294 u8 cable_state, battery_capacity, battery_charging;
1296 /* When using Bluetooth the header is 2 bytes longer, so skip these. */
1297 int data_offset = (sc->quirks & DUALSHOCK4_CONTROLLER_USB) ? 0 : 2;
1299 /* Second bit of third button byte is for the touchpad button. */
1300 offset = data_offset + DS4_INPUT_REPORT_BUTTON_OFFSET;
1301 input_report_key(sc->touchpad, BTN_LEFT, rd[offset+2] & 0x2);
1304 * The lower 4 bits of byte 30 (or 32 for BT) contain the battery level
1305 * and the 5th bit contains the USB cable state.
1307 offset = data_offset + DS4_INPUT_REPORT_BATTERY_OFFSET;
1308 cable_state = (rd[offset] >> 4) & 0x01;
1309 battery_capacity = rd[offset] & 0x0F;
1312 * When a USB power source is connected the battery level ranges from
1313 * 0 to 10, and when running on battery power it ranges from 0 to 9.
1314 * A battery level above 10 when plugged in means charge completed.
1316 if (!cable_state || battery_capacity > 10)
1317 battery_charging = 0;
1319 battery_charging = 1;
1323 if (battery_capacity > 10)
1324 battery_capacity = 10;
1326 battery_capacity *= 10;
1328 spin_lock_irqsave(&sc->lock, flags);
1329 sc->cable_state = cable_state;
1330 sc->battery_capacity = battery_capacity;
1331 sc->battery_charging = battery_charging;
1332 spin_unlock_irqrestore(&sc->lock, flags);
1335 * The Dualshock 4 multi-touch trackpad data starts at offset 33 on USB
1336 * and 35 on Bluetooth.
1337 * The first byte indicates the number of touch data in the report.
1338 * Trackpad data starts 2 bytes later (e.g. 35 for USB).
1340 offset = data_offset + DS4_INPUT_REPORT_TOUCHPAD_OFFSET;
1341 max_touch_data = (sc->quirks & DUALSHOCK4_CONTROLLER_USB) ? 3 : 4;
1342 if (rd[offset] > 0 && rd[offset] <= max_touch_data)
1343 num_touch_data = rd[offset];
1348 for (m = 0; m < num_touch_data; m++) {
1349 /* Skip past timestamp */
1353 * The first 7 bits of the first byte is a counter and bit 8 is
1354 * a touch indicator that is 0 when pressed and 1 when not
1356 * The next 3 bytes are two 12 bit touch coordinates, X and Y.
1357 * The data for the second touch is in the same format and
1358 * immediately follows the data for the first.
1360 for (n = 0; n < 2; n++) {
1364 x = rd[offset+1] | ((rd[offset+2] & 0xF) << 8);
1365 y = ((rd[offset+2] & 0xF0) >> 4) | (rd[offset+3] << 4);
1367 active = !(rd[offset] >> 7);
1368 input_mt_slot(sc->touchpad, n);
1369 input_mt_report_slot_state(sc->touchpad, MT_TOOL_FINGER, active);
1372 input_report_abs(sc->touchpad, ABS_MT_POSITION_X, x);
1373 input_report_abs(sc->touchpad, ABS_MT_POSITION_Y, y);
1378 input_mt_sync_frame(sc->touchpad);
1379 input_sync(sc->touchpad);
1383 static int sony_raw_event(struct hid_device *hdev, struct hid_report *report,
1386 struct sony_sc *sc = hid_get_drvdata(hdev);
1389 * Sixaxis HID report has acclerometers/gyro with MSByte first, this
1390 * has to be BYTE_SWAPPED before passing up to joystick interface
1392 if ((sc->quirks & SIXAXIS_CONTROLLER) && rd[0] == 0x01 && size == 49) {
1394 * When connected via Bluetooth the Sixaxis occasionally sends
1395 * a report with the second byte 0xff and the rest zeroed.
1397 * This report does not reflect the actual state of the
1398 * controller must be ignored to avoid generating false input
1404 swap(rd[41], rd[42]);
1405 swap(rd[43], rd[44]);
1406 swap(rd[45], rd[46]);
1407 swap(rd[47], rd[48]);
1409 sixaxis_parse_report(sc, rd, size);
1410 } else if ((sc->quirks & MOTION_CONTROLLER_BT) && rd[0] == 0x01 && size == 49) {
1411 sixaxis_parse_report(sc, rd, size);
1412 } else if ((sc->quirks & NAVIGATION_CONTROLLER) && rd[0] == 0x01 &&
1414 sixaxis_parse_report(sc, rd, size);
1415 } else if (((sc->quirks & DUALSHOCK4_CONTROLLER_USB) && rd[0] == 0x01 &&
1416 size == 64) || ((sc->quirks & DUALSHOCK4_CONTROLLER_BT)
1417 && rd[0] == 0x11 && size == 78)) {
1418 if (sc->quirks & DUALSHOCK4_CONTROLLER_BT) {
1424 crc = crc32_le(0xFFFFFFFF, &bthdr, 1);
1425 crc = ~crc32_le(crc, rd, DS4_INPUT_REPORT_0x11_SIZE-4);
1426 report_crc = get_unaligned_le32(&rd[DS4_INPUT_REPORT_0x11_SIZE-4]);
1427 if (crc != report_crc) {
1428 hid_dbg(sc->hdev, "DualShock 4 input report's CRC check failed, received crc 0x%0x != 0x%0x\n",
1433 dualshock4_parse_report(sc, rd, size);
1436 if (sc->defer_initialization) {
1437 sc->defer_initialization = 0;
1438 sony_schedule_work(sc);
1444 static int sony_mapping(struct hid_device *hdev, struct hid_input *hi,
1445 struct hid_field *field, struct hid_usage *usage,
1446 unsigned long **bit, int *max)
1448 struct sony_sc *sc = hid_get_drvdata(hdev);
1450 if (sc->quirks & BUZZ_CONTROLLER) {
1451 unsigned int key = usage->hid & HID_USAGE;
1453 if ((usage->hid & HID_USAGE_PAGE) != HID_UP_BUTTON)
1456 switch (usage->collection_index) {
1458 if (key >= ARRAY_SIZE(buzz_keymap))
1461 key = buzz_keymap[key];
1469 hid_map_usage_clear(hi, usage, bit, max, EV_KEY, key);
1473 if (sc->quirks & PS3REMOTE)
1474 return ps3remote_mapping(hdev, hi, field, usage, bit, max);
1477 if (sc->quirks & DUALSHOCK4_CONTROLLER)
1478 return ds4_mapping(hdev, hi, field, usage, bit, max);
1480 /* Let hid-core decide for the others */
1484 static int sony_register_touchpad(struct sony_sc *sc, int touch_count,
1491 sc->touchpad = input_allocate_device();
1495 input_set_drvdata(sc->touchpad, sc);
1496 sc->touchpad->dev.parent = &sc->hdev->dev;
1497 sc->touchpad->phys = sc->hdev->phys;
1498 sc->touchpad->uniq = sc->hdev->uniq;
1499 sc->touchpad->id.bustype = sc->hdev->bus;
1500 sc->touchpad->id.vendor = sc->hdev->vendor;
1501 sc->touchpad->id.product = sc->hdev->product;
1502 sc->touchpad->id.version = sc->hdev->version;
1504 /* Append a suffix to the controller name as there are various
1505 * DS4 compatible non-Sony devices with different names.
1507 name_sz = strlen(sc->hdev->name) + sizeof(DS4_TOUCHPAD_SUFFIX);
1508 name = kzalloc(name_sz, GFP_KERNEL);
1513 snprintf(name, name_sz, "%s" DS4_TOUCHPAD_SUFFIX, sc->hdev->name);
1514 sc->touchpad->name = name;
1516 ret = input_mt_init_slots(sc->touchpad, touch_count, 0);
1520 /* We map the button underneath the touchpad to BTN_LEFT. */
1521 __set_bit(EV_KEY, sc->touchpad->evbit);
1522 __set_bit(BTN_LEFT, sc->touchpad->keybit);
1523 __set_bit(INPUT_PROP_BUTTONPAD, sc->touchpad->propbit);
1525 input_set_abs_params(sc->touchpad, ABS_MT_POSITION_X, 0, w, 0, 0);
1526 input_set_abs_params(sc->touchpad, ABS_MT_POSITION_Y, 0, h, 0, 0);
1528 ret = input_register_device(sc->touchpad);
1535 kfree(sc->touchpad->name);
1536 sc->touchpad->name = NULL;
1538 input_free_device(sc->touchpad);
1539 sc->touchpad = NULL;
1544 static void sony_unregister_touchpad(struct sony_sc *sc)
1549 kfree(sc->touchpad->name);
1550 sc->touchpad->name = NULL;
1552 input_unregister_device(sc->touchpad);
1553 sc->touchpad = NULL;
1557 * Sending HID_REQ_GET_REPORT changes the operation mode of the ps3 controller
1558 * to "operational". Without this, the ps3 controller will not report any
1561 static int sixaxis_set_operational_usb(struct hid_device *hdev)
1563 const int buf_size =
1564 max(SIXAXIS_REPORT_0xF2_SIZE, SIXAXIS_REPORT_0xF5_SIZE);
1568 buf = kmalloc(buf_size, GFP_KERNEL);
1572 ret = hid_hw_raw_request(hdev, 0xf2, buf, SIXAXIS_REPORT_0xF2_SIZE,
1573 HID_FEATURE_REPORT, HID_REQ_GET_REPORT);
1575 hid_err(hdev, "can't set operational mode: step 1\n");
1580 * Some compatible controllers like the Speedlink Strike FX and
1581 * Gasia need another query plus an USB interrupt to get operational.
1583 ret = hid_hw_raw_request(hdev, 0xf5, buf, SIXAXIS_REPORT_0xF5_SIZE,
1584 HID_FEATURE_REPORT, HID_REQ_GET_REPORT);
1586 hid_err(hdev, "can't set operational mode: step 2\n");
1590 ret = hid_hw_output_report(hdev, buf, 1);
1592 hid_info(hdev, "can't set operational mode: step 3, ignoring\n");
1602 static int sixaxis_set_operational_bt(struct hid_device *hdev)
1604 static const u8 report[] = { 0xf4, 0x42, 0x03, 0x00, 0x00 };
1608 buf = kmemdup(report, sizeof(report), GFP_KERNEL);
1612 ret = hid_hw_raw_request(hdev, buf[0], buf, sizeof(report),
1613 HID_FEATURE_REPORT, HID_REQ_SET_REPORT);
1621 * Requesting feature report 0x02 in Bluetooth mode changes the state of the
1622 * controller so that it sends full input reports of type 0x11.
1624 static int dualshock4_set_operational_bt(struct hid_device *hdev)
1629 buf = kmalloc(DS4_FEATURE_REPORT_0x02_SIZE, GFP_KERNEL);
1633 ret = hid_hw_raw_request(hdev, 0x02, buf, DS4_FEATURE_REPORT_0x02_SIZE,
1634 HID_FEATURE_REPORT, HID_REQ_GET_REPORT);
1641 static void sixaxis_set_leds_from_id(struct sony_sc *sc)
1643 static const u8 sixaxis_leds[10][4] = {
1644 { 0x01, 0x00, 0x00, 0x00 },
1645 { 0x00, 0x01, 0x00, 0x00 },
1646 { 0x00, 0x00, 0x01, 0x00 },
1647 { 0x00, 0x00, 0x00, 0x01 },
1648 { 0x01, 0x00, 0x00, 0x01 },
1649 { 0x00, 0x01, 0x00, 0x01 },
1650 { 0x00, 0x00, 0x01, 0x01 },
1651 { 0x01, 0x00, 0x01, 0x01 },
1652 { 0x00, 0x01, 0x01, 0x01 },
1653 { 0x01, 0x01, 0x01, 0x01 }
1656 int id = sc->device_id;
1658 BUILD_BUG_ON(MAX_LEDS < ARRAY_SIZE(sixaxis_leds[0]));
1664 memcpy(sc->led_state, sixaxis_leds[id], sizeof(sixaxis_leds[id]));
1667 static void dualshock4_set_leds_from_id(struct sony_sc *sc)
1669 /* The first 4 color/index entries match what the PS4 assigns */
1670 static const u8 color_code[7][3] = {
1671 /* Blue */ { 0x00, 0x00, 0x01 },
1672 /* Red */ { 0x01, 0x00, 0x00 },
1673 /* Green */ { 0x00, 0x01, 0x00 },
1674 /* Pink */ { 0x02, 0x00, 0x01 },
1675 /* Orange */ { 0x02, 0x01, 0x00 },
1676 /* Teal */ { 0x00, 0x01, 0x01 },
1677 /* White */ { 0x01, 0x01, 0x01 }
1680 int id = sc->device_id;
1682 BUILD_BUG_ON(MAX_LEDS < ARRAY_SIZE(color_code[0]));
1688 memcpy(sc->led_state, color_code[id], sizeof(color_code[id]));
1691 static void buzz_set_leds(struct sony_sc *sc)
1693 struct hid_device *hdev = sc->hdev;
1694 struct list_head *report_list =
1695 &hdev->report_enum[HID_OUTPUT_REPORT].report_list;
1696 struct hid_report *report = list_entry(report_list->next,
1697 struct hid_report, list);
1698 s32 *value = report->field[0]->value;
1700 BUILD_BUG_ON(MAX_LEDS < 4);
1703 value[1] = sc->led_state[0] ? 0xff : 0x00;
1704 value[2] = sc->led_state[1] ? 0xff : 0x00;
1705 value[3] = sc->led_state[2] ? 0xff : 0x00;
1706 value[4] = sc->led_state[3] ? 0xff : 0x00;
1709 hid_hw_request(hdev, report, HID_REQ_SET_REPORT);
1712 static void sony_set_leds(struct sony_sc *sc)
1714 if (!(sc->quirks & BUZZ_CONTROLLER))
1715 sony_schedule_work(sc);
1720 static void sony_led_set_brightness(struct led_classdev *led,
1721 enum led_brightness value)
1723 struct device *dev = led->dev->parent;
1724 struct hid_device *hdev = to_hid_device(dev);
1725 struct sony_sc *drv_data;
1730 drv_data = hid_get_drvdata(hdev);
1732 hid_err(hdev, "No device data\n");
1737 * The Sixaxis on USB will override any LED settings sent to it
1738 * and keep flashing all of the LEDs until the PS button is pressed.
1739 * Updates, even if redundant, must be always be sent to the
1740 * controller to avoid having to toggle the state of an LED just to
1741 * stop the flashing later on.
1743 force_update = !!(drv_data->quirks & SIXAXIS_CONTROLLER_USB);
1745 for (n = 0; n < drv_data->led_count; n++) {
1746 if (led == drv_data->leds[n] && (force_update ||
1747 (value != drv_data->led_state[n] ||
1748 drv_data->led_delay_on[n] ||
1749 drv_data->led_delay_off[n]))) {
1751 drv_data->led_state[n] = value;
1753 /* Setting the brightness stops the blinking */
1754 drv_data->led_delay_on[n] = 0;
1755 drv_data->led_delay_off[n] = 0;
1757 sony_set_leds(drv_data);
1763 static enum led_brightness sony_led_get_brightness(struct led_classdev *led)
1765 struct device *dev = led->dev->parent;
1766 struct hid_device *hdev = to_hid_device(dev);
1767 struct sony_sc *drv_data;
1771 drv_data = hid_get_drvdata(hdev);
1773 hid_err(hdev, "No device data\n");
1777 for (n = 0; n < drv_data->led_count; n++) {
1778 if (led == drv_data->leds[n])
1779 return drv_data->led_state[n];
1785 static int sony_led_blink_set(struct led_classdev *led, unsigned long *delay_on,
1786 unsigned long *delay_off)
1788 struct device *dev = led->dev->parent;
1789 struct hid_device *hdev = to_hid_device(dev);
1790 struct sony_sc *drv_data = hid_get_drvdata(hdev);
1795 hid_err(hdev, "No device data\n");
1799 /* Max delay is 255 deciseconds or 2550 milliseconds */
1800 if (*delay_on > 2550)
1802 if (*delay_off > 2550)
1805 /* Blink at 1 Hz if both values are zero */
1806 if (!*delay_on && !*delay_off)
1807 *delay_on = *delay_off = 500;
1809 new_on = *delay_on / 10;
1810 new_off = *delay_off / 10;
1812 for (n = 0; n < drv_data->led_count; n++) {
1813 if (led == drv_data->leds[n])
1817 /* This LED is not registered on this device */
1818 if (n >= drv_data->led_count)
1821 /* Don't schedule work if the values didn't change */
1822 if (new_on != drv_data->led_delay_on[n] ||
1823 new_off != drv_data->led_delay_off[n]) {
1824 drv_data->led_delay_on[n] = new_on;
1825 drv_data->led_delay_off[n] = new_off;
1826 sony_schedule_work(drv_data);
1832 static void sony_leds_remove(struct sony_sc *sc)
1834 struct led_classdev *led;
1837 BUG_ON(!(sc->quirks & SONY_LED_SUPPORT));
1839 for (n = 0; n < sc->led_count; n++) {
1844 led_classdev_unregister(led);
1851 static int sony_leds_init(struct sony_sc *sc)
1853 struct hid_device *hdev = sc->hdev;
1856 struct led_classdev *led;
1860 const char *name_fmt;
1861 static const char * const ds4_name_str[] = { "red", "green", "blue",
1863 u8 max_brightness[MAX_LEDS] = { [0 ... (MAX_LEDS - 1)] = 1 };
1864 u8 use_hw_blink[MAX_LEDS] = { 0 };
1866 BUG_ON(!(sc->quirks & SONY_LED_SUPPORT));
1868 if (sc->quirks & BUZZ_CONTROLLER) {
1871 name_len = strlen("::buzz#");
1872 name_fmt = "%s::buzz%d";
1873 /* Validate expected report characteristics. */
1874 if (!hid_validate_values(hdev, HID_OUTPUT_REPORT, 0, 0, 7))
1876 } else if (sc->quirks & DUALSHOCK4_CONTROLLER) {
1877 dualshock4_set_leds_from_id(sc);
1878 sc->led_state[3] = 1;
1880 memset(max_brightness, 255, 3);
1881 use_hw_blink[3] = 1;
1885 } else if (sc->quirks & MOTION_CONTROLLER) {
1887 memset(max_brightness, 255, 3);
1891 } else if (sc->quirks & NAVIGATION_CONTROLLER) {
1892 static const u8 navigation_leds[4] = {0x01, 0x00, 0x00, 0x00};
1894 memcpy(sc->led_state, navigation_leds, sizeof(navigation_leds));
1896 memset(use_hw_blink, 1, 4);
1898 name_len = strlen("::sony#");
1899 name_fmt = "%s::sony%d";
1901 sixaxis_set_leds_from_id(sc);
1903 memset(use_hw_blink, 1, 4);
1905 name_len = strlen("::sony#");
1906 name_fmt = "%s::sony%d";
1910 * Clear LEDs as we have no way of reading their initial state. This is
1911 * only relevant if the driver is loaded after somebody actively set the
1916 name_sz = strlen(dev_name(&hdev->dev)) + name_len + 1;
1918 for (n = 0; n < sc->led_count; n++) {
1921 name_sz = strlen(dev_name(&hdev->dev)) + strlen(ds4_name_str[n]) + 2;
1923 led = kzalloc(sizeof(struct led_classdev) + name_sz, GFP_KERNEL);
1925 hid_err(hdev, "Couldn't allocate memory for LED %d\n", n);
1930 name = (void *)(&led[1]);
1932 snprintf(name, name_sz, name_fmt, dev_name(&hdev->dev),
1935 snprintf(name, name_sz, name_fmt, dev_name(&hdev->dev), n + 1);
1937 led->brightness = sc->led_state[n];
1938 led->max_brightness = max_brightness[n];
1939 led->brightness_get = sony_led_get_brightness;
1940 led->brightness_set = sony_led_set_brightness;
1942 if (use_hw_blink[n])
1943 led->blink_set = sony_led_blink_set;
1947 ret = led_classdev_register(&hdev->dev, led);
1949 hid_err(hdev, "Failed to register LED %d\n", n);
1959 sony_leds_remove(sc);
1964 static void sixaxis_send_output_report(struct sony_sc *sc)
1966 static const union sixaxis_output_report_01 default_report = {
1969 0x01, 0xff, 0x00, 0xff, 0x00,
1970 0x00, 0x00, 0x00, 0x00, 0x00,
1971 0xff, 0x27, 0x10, 0x00, 0x32,
1972 0xff, 0x27, 0x10, 0x00, 0x32,
1973 0xff, 0x27, 0x10, 0x00, 0x32,
1974 0xff, 0x27, 0x10, 0x00, 0x32,
1975 0x00, 0x00, 0x00, 0x00, 0x00
1978 struct sixaxis_output_report *report =
1979 (struct sixaxis_output_report *)sc->output_report_dmabuf;
1982 /* Initialize the report with default values */
1983 memcpy(report, &default_report, sizeof(struct sixaxis_output_report));
1985 #ifdef CONFIG_SONY_FF
1986 report->rumble.right_motor_on = sc->right ? 1 : 0;
1987 report->rumble.left_motor_force = sc->left;
1990 report->leds_bitmap |= sc->led_state[0] << 1;
1991 report->leds_bitmap |= sc->led_state[1] << 2;
1992 report->leds_bitmap |= sc->led_state[2] << 3;
1993 report->leds_bitmap |= sc->led_state[3] << 4;
1995 /* Set flag for all leds off, required for 3rd party INTEC controller */
1996 if ((report->leds_bitmap & 0x1E) == 0)
1997 report->leds_bitmap |= 0x20;
2000 * The LEDs in the report are indexed in reverse order to their
2001 * corresponding light on the controller.
2002 * Index 0 = LED 4, index 1 = LED 3, etc...
2004 * In the case of both delay values being zero (blinking disabled) the
2005 * default report values should be used or the controller LED will be
2008 for (n = 0; n < 4; n++) {
2009 if (sc->led_delay_on[n] || sc->led_delay_off[n]) {
2010 report->led[3 - n].duty_off = sc->led_delay_off[n];
2011 report->led[3 - n].duty_on = sc->led_delay_on[n];
2015 hid_hw_raw_request(sc->hdev, report->report_id, (u8 *)report,
2016 sizeof(struct sixaxis_output_report),
2017 HID_OUTPUT_REPORT, HID_REQ_SET_REPORT);
2020 static void dualshock4_send_output_report(struct sony_sc *sc)
2022 struct hid_device *hdev = sc->hdev;
2023 u8 *buf = sc->output_report_dmabuf;
2027 * NOTE: The buf[1] field of the Bluetooth report controls
2028 * the Dualshock 4 reporting rate.
2030 * Known values include:
2032 * 0x80 - 1000hz (full speed)
2037 if (sc->quirks & DUALSHOCK4_CONTROLLER_USB) {
2038 memset(buf, 0, DS4_OUTPUT_REPORT_0x05_SIZE);
2043 memset(buf, 0, DS4_OUTPUT_REPORT_0x11_SIZE);
2045 buf[1] = 0xC0; /* HID + CRC */
2050 #ifdef CONFIG_SONY_FF
2051 buf[offset++] = sc->right;
2052 buf[offset++] = sc->left;
2057 /* LED 3 is the global control */
2058 if (sc->led_state[3]) {
2059 buf[offset++] = sc->led_state[0];
2060 buf[offset++] = sc->led_state[1];
2061 buf[offset++] = sc->led_state[2];
2066 /* If both delay values are zero the DualShock 4 disables blinking. */
2067 buf[offset++] = sc->led_delay_on[3];
2068 buf[offset++] = sc->led_delay_off[3];
2070 if (sc->quirks & DUALSHOCK4_CONTROLLER_USB)
2071 hid_hw_output_report(hdev, buf, DS4_OUTPUT_REPORT_0x05_SIZE);
2073 /* CRC generation */
2077 crc = crc32_le(0xFFFFFFFF, &bthdr, 1);
2078 crc = ~crc32_le(crc, buf, DS4_OUTPUT_REPORT_0x11_SIZE-4);
2079 put_unaligned_le32(crc, &buf[74]);
2080 hid_hw_output_report(hdev, buf, DS4_OUTPUT_REPORT_0x11_SIZE);
2084 static void motion_send_output_report(struct sony_sc *sc)
2086 struct hid_device *hdev = sc->hdev;
2087 struct motion_output_report_02 *report =
2088 (struct motion_output_report_02 *)sc->output_report_dmabuf;
2090 memset(report, 0, MOTION_REPORT_0x02_SIZE);
2092 report->type = 0x02; /* set leds */
2093 report->r = sc->led_state[0];
2094 report->g = sc->led_state[1];
2095 report->b = sc->led_state[2];
2097 #ifdef CONFIG_SONY_FF
2098 report->rumble = max(sc->right, sc->left);
2101 hid_hw_output_report(hdev, (u8 *)report, MOTION_REPORT_0x02_SIZE);
2104 static inline void sony_send_output_report(struct sony_sc *sc)
2106 if (sc->send_output_report)
2107 sc->send_output_report(sc);
2110 static void sony_state_worker(struct work_struct *work)
2112 struct sony_sc *sc = container_of(work, struct sony_sc, state_worker);
2114 sc->send_output_report(sc);
2117 static int sony_allocate_output_report(struct sony_sc *sc)
2119 if ((sc->quirks & SIXAXIS_CONTROLLER) ||
2120 (sc->quirks & NAVIGATION_CONTROLLER))
2121 sc->output_report_dmabuf =
2122 kmalloc(sizeof(union sixaxis_output_report_01),
2124 else if (sc->quirks & DUALSHOCK4_CONTROLLER_BT)
2125 sc->output_report_dmabuf = kmalloc(DS4_OUTPUT_REPORT_0x11_SIZE,
2127 else if (sc->quirks & DUALSHOCK4_CONTROLLER_USB)
2128 sc->output_report_dmabuf = kmalloc(DS4_OUTPUT_REPORT_0x05_SIZE,
2130 else if (sc->quirks & MOTION_CONTROLLER)
2131 sc->output_report_dmabuf = kmalloc(MOTION_REPORT_0x02_SIZE,
2136 if (!sc->output_report_dmabuf)
2142 #ifdef CONFIG_SONY_FF
2143 static int sony_play_effect(struct input_dev *dev, void *data,
2144 struct ff_effect *effect)
2146 struct hid_device *hid = input_get_drvdata(dev);
2147 struct sony_sc *sc = hid_get_drvdata(hid);
2149 if (effect->type != FF_RUMBLE)
2152 sc->left = effect->u.rumble.strong_magnitude / 256;
2153 sc->right = effect->u.rumble.weak_magnitude / 256;
2155 sony_schedule_work(sc);
2159 static int sony_init_ff(struct sony_sc *sc)
2161 struct hid_input *hidinput = list_entry(sc->hdev->inputs.next,
2162 struct hid_input, list);
2163 struct input_dev *input_dev = hidinput->input;
2165 input_set_capability(input_dev, EV_FF, FF_RUMBLE);
2166 return input_ff_create_memless(input_dev, NULL, sony_play_effect);
2170 static int sony_init_ff(struct sony_sc *sc)
2177 static int sony_battery_get_property(struct power_supply *psy,
2178 enum power_supply_property psp,
2179 union power_supply_propval *val)
2181 struct sony_sc *sc = power_supply_get_drvdata(psy);
2182 unsigned long flags;
2184 u8 battery_charging, battery_capacity, cable_state;
2186 spin_lock_irqsave(&sc->lock, flags);
2187 battery_charging = sc->battery_charging;
2188 battery_capacity = sc->battery_capacity;
2189 cable_state = sc->cable_state;
2190 spin_unlock_irqrestore(&sc->lock, flags);
2193 case POWER_SUPPLY_PROP_PRESENT:
2196 case POWER_SUPPLY_PROP_SCOPE:
2197 val->intval = POWER_SUPPLY_SCOPE_DEVICE;
2199 case POWER_SUPPLY_PROP_CAPACITY:
2200 val->intval = battery_capacity;
2202 case POWER_SUPPLY_PROP_STATUS:
2203 if (battery_charging)
2204 val->intval = POWER_SUPPLY_STATUS_CHARGING;
2206 if (battery_capacity == 100 && cable_state)
2207 val->intval = POWER_SUPPLY_STATUS_FULL;
2209 val->intval = POWER_SUPPLY_STATUS_DISCHARGING;
2218 static int sony_battery_probe(struct sony_sc *sc, int append_dev_id)
2220 const char *battery_str_fmt = append_dev_id ?
2221 "sony_controller_battery_%pMR_%i" :
2222 "sony_controller_battery_%pMR";
2223 struct power_supply_config psy_cfg = { .drv_data = sc, };
2224 struct hid_device *hdev = sc->hdev;
2228 * Set the default battery level to 100% to avoid low battery warnings
2229 * if the battery is polled before the first device report is received.
2231 sc->battery_capacity = 100;
2233 sc->battery_desc.properties = sony_battery_props;
2234 sc->battery_desc.num_properties = ARRAY_SIZE(sony_battery_props);
2235 sc->battery_desc.get_property = sony_battery_get_property;
2236 sc->battery_desc.type = POWER_SUPPLY_TYPE_BATTERY;
2237 sc->battery_desc.use_for_apm = 0;
2238 sc->battery_desc.name = kasprintf(GFP_KERNEL, battery_str_fmt,
2239 sc->mac_address, sc->device_id);
2240 if (!sc->battery_desc.name)
2243 sc->battery = power_supply_register(&hdev->dev, &sc->battery_desc,
2245 if (IS_ERR(sc->battery)) {
2246 ret = PTR_ERR(sc->battery);
2247 hid_err(hdev, "Unable to register battery device\n");
2251 power_supply_powers(sc->battery, &hdev->dev);
2255 kfree(sc->battery_desc.name);
2256 sc->battery_desc.name = NULL;
2260 static void sony_battery_remove(struct sony_sc *sc)
2262 if (!sc->battery_desc.name)
2265 power_supply_unregister(sc->battery);
2266 kfree(sc->battery_desc.name);
2267 sc->battery_desc.name = NULL;
2271 * If a controller is plugged in via USB while already connected via Bluetooth
2272 * it will show up as two devices. A global list of connected controllers and
2273 * their MAC addresses is maintained to ensure that a device is only connected
2276 * Some USB-only devices masquerade as Sixaxis controllers and all have the
2277 * same dummy Bluetooth address, so a comparison of the connection type is
2278 * required. Devices are only rejected in the case where two devices have
2279 * matching Bluetooth addresses on different bus types.
2281 static inline int sony_compare_connection_type(struct sony_sc *sc0,
2282 struct sony_sc *sc1)
2284 const int sc0_not_bt = !(sc0->quirks & SONY_BT_DEVICE);
2285 const int sc1_not_bt = !(sc1->quirks & SONY_BT_DEVICE);
2287 return sc0_not_bt == sc1_not_bt;
2290 static int sony_check_add_dev_list(struct sony_sc *sc)
2292 struct sony_sc *entry;
2293 unsigned long flags;
2296 spin_lock_irqsave(&sony_dev_list_lock, flags);
2298 list_for_each_entry(entry, &sony_device_list, list_node) {
2299 ret = memcmp(sc->mac_address, entry->mac_address,
2300 sizeof(sc->mac_address));
2302 if (sony_compare_connection_type(sc, entry)) {
2307 "controller with MAC address %pMR already connected\n",
2315 list_add(&(sc->list_node), &sony_device_list);
2318 spin_unlock_irqrestore(&sony_dev_list_lock, flags);
2322 static void sony_remove_dev_list(struct sony_sc *sc)
2324 unsigned long flags;
2326 if (sc->list_node.next) {
2327 spin_lock_irqsave(&sony_dev_list_lock, flags);
2328 list_del(&(sc->list_node));
2329 spin_unlock_irqrestore(&sony_dev_list_lock, flags);
2333 static int sony_get_bt_devaddr(struct sony_sc *sc)
2337 /* HIDP stores the device MAC address as a string in the uniq field. */
2338 ret = strlen(sc->hdev->uniq);
2342 ret = sscanf(sc->hdev->uniq,
2343 "%02hhx:%02hhx:%02hhx:%02hhx:%02hhx:%02hhx",
2344 &sc->mac_address[5], &sc->mac_address[4], &sc->mac_address[3],
2345 &sc->mac_address[2], &sc->mac_address[1], &sc->mac_address[0]);
2353 static int sony_check_add(struct sony_sc *sc)
2358 if ((sc->quirks & DUALSHOCK4_CONTROLLER_BT) ||
2359 (sc->quirks & MOTION_CONTROLLER_BT) ||
2360 (sc->quirks & NAVIGATION_CONTROLLER_BT) ||
2361 (sc->quirks & SIXAXIS_CONTROLLER_BT)) {
2363 * sony_get_bt_devaddr() attempts to parse the Bluetooth MAC
2364 * address from the uniq string where HIDP stores it.
2365 * As uniq cannot be guaranteed to be a MAC address in all cases
2366 * a failure of this function should not prevent the connection.
2368 if (sony_get_bt_devaddr(sc) < 0) {
2369 hid_warn(sc->hdev, "UNIQ does not contain a MAC address; duplicate check skipped\n");
2372 } else if (sc->quirks & DUALSHOCK4_CONTROLLER_USB) {
2373 buf = kmalloc(DS4_FEATURE_REPORT_0x81_SIZE, GFP_KERNEL);
2378 * The MAC address of a DS4 controller connected via USB can be
2379 * retrieved with feature report 0x81. The address begins at
2382 ret = hid_hw_raw_request(sc->hdev, 0x81, buf,
2383 DS4_FEATURE_REPORT_0x81_SIZE, HID_FEATURE_REPORT,
2384 HID_REQ_GET_REPORT);
2386 if (ret != DS4_FEATURE_REPORT_0x81_SIZE) {
2387 hid_err(sc->hdev, "failed to retrieve feature report 0x81 with the DualShock 4 MAC address\n");
2388 ret = ret < 0 ? ret : -EINVAL;
2392 memcpy(sc->mac_address, &buf[1], sizeof(sc->mac_address));
2393 } else if ((sc->quirks & SIXAXIS_CONTROLLER_USB) ||
2394 (sc->quirks & NAVIGATION_CONTROLLER_USB)) {
2395 buf = kmalloc(SIXAXIS_REPORT_0xF2_SIZE, GFP_KERNEL);
2400 * The MAC address of a Sixaxis controller connected via USB can
2401 * be retrieved with feature report 0xf2. The address begins at
2404 ret = hid_hw_raw_request(sc->hdev, 0xf2, buf,
2405 SIXAXIS_REPORT_0xF2_SIZE, HID_FEATURE_REPORT,
2406 HID_REQ_GET_REPORT);
2408 if (ret != SIXAXIS_REPORT_0xF2_SIZE) {
2409 hid_err(sc->hdev, "failed to retrieve feature report 0xf2 with the Sixaxis MAC address\n");
2410 ret = ret < 0 ? ret : -EINVAL;
2415 * The Sixaxis device MAC in the report is big-endian and must
2418 for (n = 0; n < 6; n++)
2419 sc->mac_address[5-n] = buf[4+n];
2424 ret = sony_check_add_dev_list(sc);
2433 static int sony_set_device_id(struct sony_sc *sc)
2438 * Only DualShock 4 or Sixaxis controllers get an id.
2439 * All others are set to -1.
2441 if ((sc->quirks & SIXAXIS_CONTROLLER) ||
2442 (sc->quirks & DUALSHOCK4_CONTROLLER)) {
2443 ret = ida_simple_get(&sony_device_id_allocator, 0, 0,
2449 sc->device_id = ret;
2457 static void sony_release_device_id(struct sony_sc *sc)
2459 if (sc->device_id >= 0) {
2460 ida_simple_remove(&sony_device_id_allocator, sc->device_id);
2465 static inline void sony_init_output_report(struct sony_sc *sc,
2466 void (*send_output_report)(struct sony_sc *))
2468 sc->send_output_report = send_output_report;
2470 if (!sc->worker_initialized)
2471 INIT_WORK(&sc->state_worker, sony_state_worker);
2473 sc->worker_initialized = 1;
2476 static inline void sony_cancel_work_sync(struct sony_sc *sc)
2478 if (sc->worker_initialized)
2479 cancel_work_sync(&sc->state_worker);
2482 static int sony_input_configured(struct hid_device *hdev,
2483 struct hid_input *hidinput)
2485 struct sony_sc *sc = hid_get_drvdata(hdev);
2489 ret = sony_set_device_id(sc);
2491 hid_err(hdev, "failed to allocate the device id\n");
2495 ret = sony_allocate_output_report(sc);
2497 hid_err(hdev, "failed to allocate the output report buffer\n");
2501 if ((sc->quirks & SIXAXIS_CONTROLLER_USB) ||
2502 (sc->quirks & NAVIGATION_CONTROLLER_USB)) {
2504 * The Sony Sixaxis does not handle HID Output Reports on the
2505 * Interrupt EP like it could, so we need to force HID Output
2506 * Reports to use HID_REQ_SET_REPORT on the Control EP.
2508 * There is also another issue about HID Output Reports via USB,
2509 * the Sixaxis does not want the report_id as part of the data
2510 * packet, so we have to discard buf[0] when sending the actual
2511 * control message, even for numbered reports, humpf!
2513 * Additionally, the Sixaxis on USB isn't properly initialized
2514 * until the PS logo button is pressed and as such won't retain
2515 * any state set by an output report, so the initial
2516 * configuration report is deferred until the first input
2519 hdev->quirks |= HID_QUIRK_NO_OUTPUT_REPORTS_ON_INTR_EP;
2520 hdev->quirks |= HID_QUIRK_SKIP_OUTPUT_REPORT_ID;
2521 sc->defer_initialization = 1;
2522 ret = sixaxis_set_operational_usb(hdev);
2523 sony_init_output_report(sc, sixaxis_send_output_report);
2524 } else if ((sc->quirks & SIXAXIS_CONTROLLER_BT) ||
2525 (sc->quirks & NAVIGATION_CONTROLLER_BT)) {
2527 * The Sixaxis wants output reports sent on the ctrl endpoint
2528 * when connected via Bluetooth.
2530 hdev->quirks |= HID_QUIRK_NO_OUTPUT_REPORTS_ON_INTR_EP;
2531 ret = sixaxis_set_operational_bt(hdev);
2532 sony_init_output_report(sc, sixaxis_send_output_report);
2533 } else if (sc->quirks & DUALSHOCK4_CONTROLLER) {
2534 if (sc->quirks & DUALSHOCK4_CONTROLLER_BT) {
2535 ret = dualshock4_set_operational_bt(hdev);
2537 hid_err(hdev, "failed to set the Dualshock 4 operational mode\n");
2543 * The Dualshock 4 touchpad supports 2 touches and has a
2544 * resolution of 1920x942 (44.86 dots/mm).
2546 ret = sony_register_touchpad(sc, 2, 1920, 942);
2549 "Unable to initialize multi-touch slots: %d\n",
2554 sony_init_output_report(sc, dualshock4_send_output_report);
2555 } else if (sc->quirks & MOTION_CONTROLLER) {
2556 sony_init_output_report(sc, motion_send_output_report);
2564 ret = append_dev_id = sony_check_add(sc);
2568 if (sc->quirks & SONY_LED_SUPPORT) {
2569 ret = sony_leds_init(sc);
2574 if (sc->quirks & SONY_BATTERY_SUPPORT) {
2575 ret = sony_battery_probe(sc, append_dev_id);
2579 /* Open the device to receive reports with battery info */
2580 ret = hid_hw_open(hdev);
2582 hid_err(hdev, "hw open failed\n");
2587 if (sc->quirks & SONY_FF_SUPPORT) {
2588 ret = sony_init_ff(sc);
2597 if (sc->quirks & SONY_LED_SUPPORT)
2598 sony_leds_remove(sc);
2599 if (sc->quirks & SONY_BATTERY_SUPPORT)
2600 sony_battery_remove(sc);
2601 sony_cancel_work_sync(sc);
2602 kfree(sc->output_report_dmabuf);
2603 sony_remove_dev_list(sc);
2604 sony_release_device_id(sc);
2609 static int sony_probe(struct hid_device *hdev, const struct hid_device_id *id)
2612 unsigned long quirks = id->driver_data;
2614 unsigned int connect_mask = HID_CONNECT_DEFAULT;
2616 if (!strcmp(hdev->name, "FutureMax Dance Mat"))
2617 quirks |= FUTUREMAX_DANCE_MAT;
2619 sc = devm_kzalloc(&hdev->dev, sizeof(*sc), GFP_KERNEL);
2621 hid_err(hdev, "can't alloc sony descriptor\n");
2625 spin_lock_init(&sc->lock);
2627 sc->quirks = quirks;
2628 hid_set_drvdata(hdev, sc);
2631 ret = hid_parse(hdev);
2633 hid_err(hdev, "parse failed\n");
2637 if (sc->quirks & VAIO_RDESC_CONSTANT)
2638 connect_mask |= HID_CONNECT_HIDDEV_FORCE;
2639 else if (sc->quirks & SIXAXIS_CONTROLLER)
2640 connect_mask |= HID_CONNECT_HIDDEV_FORCE;
2642 /* Patch the hw version on DS4 compatible devices, so applications can
2643 * distinguish between the default HID mappings and the mappings defined
2644 * by the Linux game controller spec. This is important for the SDL2
2645 * library, which has a game controller database, which uses device ids
2646 * in combination with version as a key.
2648 if (sc->quirks & DUALSHOCK4_CONTROLLER)
2649 hdev->version |= 0x8000;
2651 ret = hid_hw_start(hdev, connect_mask);
2653 hid_err(hdev, "hw start failed\n");
2657 /* sony_input_configured can fail, but this doesn't result
2658 * in hid_hw_start failures (intended). Check whether
2659 * the HID layer claimed the device else fail.
2660 * We don't know the actual reason for the failure, most
2661 * likely it is due to EEXIST in case of double connection
2662 * of USB and Bluetooth, but could have been due to ENOMEM
2663 * or other reasons as well.
2665 if (!(hdev->claimed & HID_CLAIMED_INPUT)) {
2666 hid_err(hdev, "failed to claim input\n");
2673 static void sony_remove(struct hid_device *hdev)
2675 struct sony_sc *sc = hid_get_drvdata(hdev);
2679 if (sc->quirks & SONY_LED_SUPPORT)
2680 sony_leds_remove(sc);
2682 if (sc->quirks & SONY_BATTERY_SUPPORT)
2683 sony_battery_remove(sc);
2686 sony_unregister_touchpad(sc);
2688 sony_cancel_work_sync(sc);
2690 kfree(sc->output_report_dmabuf);
2692 sony_remove_dev_list(sc);
2694 sony_release_device_id(sc);
2701 static int sony_suspend(struct hid_device *hdev, pm_message_t message)
2704 * On suspend save the current LED state,
2705 * stop running force-feedback and blank the LEDS.
2707 if (SONY_LED_SUPPORT || SONY_FF_SUPPORT) {
2708 struct sony_sc *sc = hid_get_drvdata(hdev);
2710 #ifdef CONFIG_SONY_FF
2711 sc->left = sc->right = 0;
2714 memcpy(sc->resume_led_state, sc->led_state,
2715 sizeof(sc->resume_led_state));
2716 memset(sc->led_state, 0, sizeof(sc->led_state));
2718 sony_send_output_report(sc);
2724 static int sony_resume(struct hid_device *hdev)
2726 /* Restore the state of controller LEDs on resume */
2727 if (SONY_LED_SUPPORT) {
2728 struct sony_sc *sc = hid_get_drvdata(hdev);
2730 memcpy(sc->led_state, sc->resume_led_state,
2731 sizeof(sc->led_state));
2734 * The Sixaxis and navigation controllers on USB need to be
2735 * reinitialized on resume or they won't behave properly.
2737 if ((sc->quirks & SIXAXIS_CONTROLLER_USB) ||
2738 (sc->quirks & NAVIGATION_CONTROLLER_USB)) {
2739 sixaxis_set_operational_usb(sc->hdev);
2740 sc->defer_initialization = 1;
2751 static const struct hid_device_id sony_devices[] = {
2752 { HID_USB_DEVICE(USB_VENDOR_ID_SONY, USB_DEVICE_ID_SONY_PS3_CONTROLLER),
2753 .driver_data = SIXAXIS_CONTROLLER_USB },
2754 { HID_USB_DEVICE(USB_VENDOR_ID_SONY, USB_DEVICE_ID_SONY_NAVIGATION_CONTROLLER),
2755 .driver_data = NAVIGATION_CONTROLLER_USB },
2756 { HID_BLUETOOTH_DEVICE(USB_VENDOR_ID_SONY, USB_DEVICE_ID_SONY_NAVIGATION_CONTROLLER),
2757 .driver_data = NAVIGATION_CONTROLLER_BT },
2758 { HID_USB_DEVICE(USB_VENDOR_ID_SONY, USB_DEVICE_ID_SONY_MOTION_CONTROLLER),
2759 .driver_data = MOTION_CONTROLLER_USB },
2760 { HID_BLUETOOTH_DEVICE(USB_VENDOR_ID_SONY, USB_DEVICE_ID_SONY_MOTION_CONTROLLER),
2761 .driver_data = MOTION_CONTROLLER_BT },
2762 { HID_BLUETOOTH_DEVICE(USB_VENDOR_ID_SONY, USB_DEVICE_ID_SONY_PS3_CONTROLLER),
2763 .driver_data = SIXAXIS_CONTROLLER_BT },
2764 { HID_USB_DEVICE(USB_VENDOR_ID_SONY, USB_DEVICE_ID_SONY_VAIO_VGX_MOUSE),
2765 .driver_data = VAIO_RDESC_CONSTANT },
2766 { HID_USB_DEVICE(USB_VENDOR_ID_SONY, USB_DEVICE_ID_SONY_VAIO_VGP_MOUSE),
2767 .driver_data = VAIO_RDESC_CONSTANT },
2769 * Wired Buzz Controller. Reported as Sony Hub from its USB ID and as
2770 * Logitech joystick from the device descriptor.
2772 { HID_USB_DEVICE(USB_VENDOR_ID_SONY, USB_DEVICE_ID_SONY_BUZZ_CONTROLLER),
2773 .driver_data = BUZZ_CONTROLLER },
2774 { HID_USB_DEVICE(USB_VENDOR_ID_SONY, USB_DEVICE_ID_SONY_WIRELESS_BUZZ_CONTROLLER),
2775 .driver_data = BUZZ_CONTROLLER },
2776 /* PS3 BD Remote Control */
2777 { HID_BLUETOOTH_DEVICE(USB_VENDOR_ID_SONY, USB_DEVICE_ID_SONY_PS3_BDREMOTE),
2778 .driver_data = PS3REMOTE },
2779 /* Logitech Harmony Adapter for PS3 */
2780 { HID_BLUETOOTH_DEVICE(USB_VENDOR_ID_LOGITECH, USB_DEVICE_ID_LOGITECH_HARMONY_PS3),
2781 .driver_data = PS3REMOTE },
2782 /* SMK-Link PS3 BD Remote Control */
2783 { HID_BLUETOOTH_DEVICE(USB_VENDOR_ID_SMK, USB_DEVICE_ID_SMK_PS3_BDREMOTE),
2784 .driver_data = PS3REMOTE },
2785 /* Sony Dualshock 4 controllers for PS4 */
2786 { HID_USB_DEVICE(USB_VENDOR_ID_SONY, USB_DEVICE_ID_SONY_PS4_CONTROLLER),
2787 .driver_data = DUALSHOCK4_CONTROLLER_USB },
2788 { HID_BLUETOOTH_DEVICE(USB_VENDOR_ID_SONY, USB_DEVICE_ID_SONY_PS4_CONTROLLER),
2789 .driver_data = DUALSHOCK4_CONTROLLER_BT },
2790 { HID_USB_DEVICE(USB_VENDOR_ID_SONY, USB_DEVICE_ID_SONY_PS4_CONTROLLER_2),
2791 .driver_data = DUALSHOCK4_CONTROLLER_USB },
2792 { HID_BLUETOOTH_DEVICE(USB_VENDOR_ID_SONY, USB_DEVICE_ID_SONY_PS4_CONTROLLER_2),
2793 .driver_data = DUALSHOCK4_CONTROLLER_BT },
2794 { HID_USB_DEVICE(USB_VENDOR_ID_SONY, USB_DEVICE_ID_SONY_PS4_CONTROLLER_DONGLE),
2795 .driver_data = DUALSHOCK4_CONTROLLER_USB },
2796 /* Nyko Core Controller for PS3 */
2797 { HID_USB_DEVICE(USB_VENDOR_ID_SINO_LITE, USB_DEVICE_ID_SINO_LITE_CONTROLLER),
2798 .driver_data = SIXAXIS_CONTROLLER_USB | SINO_LITE_CONTROLLER },
2801 MODULE_DEVICE_TABLE(hid, sony_devices);
2803 static struct hid_driver sony_driver = {
2805 .id_table = sony_devices,
2806 .input_mapping = sony_mapping,
2807 .input_configured = sony_input_configured,
2808 .probe = sony_probe,
2809 .remove = sony_remove,
2810 .report_fixup = sony_report_fixup,
2811 .raw_event = sony_raw_event,
2814 .suspend = sony_suspend,
2815 .resume = sony_resume,
2816 .reset_resume = sony_resume,
2820 static int __init sony_init(void)
2822 dbg_hid("Sony:%s\n", __func__);
2824 return hid_register_driver(&sony_driver);
2827 static void __exit sony_exit(void)
2829 dbg_hid("Sony:%s\n", __func__);
2831 hid_unregister_driver(&sony_driver);
2832 ida_destroy(&sony_device_id_allocator);
2834 module_init(sony_init);
2835 module_exit(sony_exit);
2837 MODULE_LICENSE("GPL");