Merge branch 'sched-urgent-for-linus' of git://git.kernel.org/pub/scm/linux/kernel...
[deliverable/linux.git] / drivers / hid / hid-sony.c
1 /*
2 * HID driver for Sony / PS2 / PS3 / PS4 BD devices.
3 *
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 Frank Praznik <frank.praznik@gmail.com>
12 */
13
14 /*
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)
18 * any later version.
19 */
20
21 /*
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.
25 *
26 * There will be no PIN request from the device.
27 */
28
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
40 #include "hid-ids.h"
41
42 #define VAIO_RDESC_CONSTANT BIT(0)
43 #define SIXAXIS_CONTROLLER_USB BIT(1)
44 #define SIXAXIS_CONTROLLER_BT BIT(2)
45 #define BUZZ_CONTROLLER BIT(3)
46 #define PS3REMOTE BIT(4)
47 #define DUALSHOCK4_CONTROLLER_USB BIT(5)
48 #define DUALSHOCK4_CONTROLLER_BT BIT(6)
49 #define MOTION_CONTROLLER_USB BIT(7)
50 #define MOTION_CONTROLLER_BT BIT(8)
51 #define NAVIGATION_CONTROLLER_USB BIT(9)
52 #define NAVIGATION_CONTROLLER_BT BIT(10)
53
54 #define SIXAXIS_CONTROLLER (SIXAXIS_CONTROLLER_USB | SIXAXIS_CONTROLLER_BT)
55 #define MOTION_CONTROLLER (MOTION_CONTROLLER_USB | MOTION_CONTROLLER_BT)
56 #define NAVIGATION_CONTROLLER (NAVIGATION_CONTROLLER_USB |\
57 NAVIGATION_CONTROLLER_BT)
58 #define DUALSHOCK4_CONTROLLER (DUALSHOCK4_CONTROLLER_USB |\
59 DUALSHOCK4_CONTROLLER_BT)
60 #define SONY_LED_SUPPORT (SIXAXIS_CONTROLLER | BUZZ_CONTROLLER |\
61 DUALSHOCK4_CONTROLLER | MOTION_CONTROLLER |\
62 NAVIGATION_CONTROLLER)
63 #define SONY_BATTERY_SUPPORT (SIXAXIS_CONTROLLER | DUALSHOCK4_CONTROLLER |\
64 MOTION_CONTROLLER_BT | NAVIGATION_CONTROLLER)
65 #define SONY_FF_SUPPORT (SIXAXIS_CONTROLLER | DUALSHOCK4_CONTROLLER |\
66 MOTION_CONTROLLER)
67
68 #define MAX_LEDS 4
69
70 /*
71 * The Sixaxis reports both digital and analog values for each button on the
72 * controller except for Start, Select and the PS button. The controller ends
73 * up reporting 27 axes which causes them to spill over into the multi-touch
74 * axis values. Additionally, the controller only has 20 actual, physical axes
75 * so there are several unused axes in between the used ones.
76 */
77 static __u8 sixaxis_rdesc[] = {
78 0x05, 0x01, /* Usage Page (Desktop), */
79 0x09, 0x04, /* Usage (Joystick), */
80 0xA1, 0x01, /* Collection (Application), */
81 0xA1, 0x02, /* Collection (Logical), */
82 0x85, 0x01, /* Report ID (1), */
83 0x75, 0x08, /* Report Size (8), */
84 0x95, 0x01, /* Report Count (1), */
85 0x15, 0x00, /* Logical Minimum (0), */
86 0x26, 0xFF, 0x00, /* Logical Maximum (255), */
87 0x81, 0x03, /* Input (Constant, Variable), */
88 0x75, 0x01, /* Report Size (1), */
89 0x95, 0x13, /* Report Count (19), */
90 0x15, 0x00, /* Logical Minimum (0), */
91 0x25, 0x01, /* Logical Maximum (1), */
92 0x35, 0x00, /* Physical Minimum (0), */
93 0x45, 0x01, /* Physical Maximum (1), */
94 0x05, 0x09, /* Usage Page (Button), */
95 0x19, 0x01, /* Usage Minimum (01h), */
96 0x29, 0x13, /* Usage Maximum (13h), */
97 0x81, 0x02, /* Input (Variable), */
98 0x75, 0x01, /* Report Size (1), */
99 0x95, 0x0D, /* Report Count (13), */
100 0x06, 0x00, 0xFF, /* Usage Page (FF00h), */
101 0x81, 0x03, /* Input (Constant, Variable), */
102 0x15, 0x00, /* Logical Minimum (0), */
103 0x26, 0xFF, 0x00, /* Logical Maximum (255), */
104 0x05, 0x01, /* Usage Page (Desktop), */
105 0x09, 0x01, /* Usage (Pointer), */
106 0xA1, 0x00, /* Collection (Physical), */
107 0x75, 0x08, /* Report Size (8), */
108 0x95, 0x04, /* Report Count (4), */
109 0x35, 0x00, /* Physical Minimum (0), */
110 0x46, 0xFF, 0x00, /* Physical Maximum (255), */
111 0x09, 0x30, /* Usage (X), */
112 0x09, 0x31, /* Usage (Y), */
113 0x09, 0x32, /* Usage (Z), */
114 0x09, 0x35, /* Usage (Rz), */
115 0x81, 0x02, /* Input (Variable), */
116 0xC0, /* End Collection, */
117 0x05, 0x01, /* Usage Page (Desktop), */
118 0x95, 0x13, /* Report Count (19), */
119 0x09, 0x01, /* Usage (Pointer), */
120 0x81, 0x02, /* Input (Variable), */
121 0x95, 0x0C, /* Report Count (12), */
122 0x81, 0x01, /* Input (Constant), */
123 0x75, 0x10, /* Report Size (16), */
124 0x95, 0x04, /* Report Count (4), */
125 0x26, 0xFF, 0x03, /* Logical Maximum (1023), */
126 0x46, 0xFF, 0x03, /* Physical Maximum (1023), */
127 0x09, 0x01, /* Usage (Pointer), */
128 0x81, 0x02, /* Input (Variable), */
129 0xC0, /* End Collection, */
130 0xA1, 0x02, /* Collection (Logical), */
131 0x85, 0x02, /* Report ID (2), */
132 0x75, 0x08, /* Report Size (8), */
133 0x95, 0x30, /* Report Count (48), */
134 0x09, 0x01, /* Usage (Pointer), */
135 0xB1, 0x02, /* Feature (Variable), */
136 0xC0, /* End Collection, */
137 0xA1, 0x02, /* Collection (Logical), */
138 0x85, 0xEE, /* Report ID (238), */
139 0x75, 0x08, /* Report Size (8), */
140 0x95, 0x30, /* Report Count (48), */
141 0x09, 0x01, /* Usage (Pointer), */
142 0xB1, 0x02, /* Feature (Variable), */
143 0xC0, /* End Collection, */
144 0xA1, 0x02, /* Collection (Logical), */
145 0x85, 0xEF, /* Report ID (239), */
146 0x75, 0x08, /* Report Size (8), */
147 0x95, 0x30, /* Report Count (48), */
148 0x09, 0x01, /* Usage (Pointer), */
149 0xB1, 0x02, /* Feature (Variable), */
150 0xC0, /* End Collection, */
151 0xC0 /* End Collection */
152 };
153
154 /* PS/3 Motion controller */
155 static __u8 motion_rdesc[] = {
156 0x05, 0x01, /* Usage Page (Desktop), */
157 0x09, 0x04, /* Usage (Joystick), */
158 0xA1, 0x01, /* Collection (Application), */
159 0xA1, 0x02, /* Collection (Logical), */
160 0x85, 0x01, /* Report ID (1), */
161 0x75, 0x01, /* Report Size (1), */
162 0x95, 0x15, /* Report Count (21), */
163 0x15, 0x00, /* Logical Minimum (0), */
164 0x25, 0x01, /* Logical Maximum (1), */
165 0x35, 0x00, /* Physical Minimum (0), */
166 0x45, 0x01, /* Physical Maximum (1), */
167 0x05, 0x09, /* Usage Page (Button), */
168 0x19, 0x01, /* Usage Minimum (01h), */
169 0x29, 0x15, /* Usage Maximum (15h), */
170 0x81, 0x02, /* Input (Variable), * Buttons */
171 0x95, 0x0B, /* Report Count (11), */
172 0x06, 0x00, 0xFF, /* Usage Page (FF00h), */
173 0x81, 0x03, /* Input (Constant, Variable), * Padding */
174 0x15, 0x00, /* Logical Minimum (0), */
175 0x26, 0xFF, 0x00, /* Logical Maximum (255), */
176 0x05, 0x01, /* Usage Page (Desktop), */
177 0xA1, 0x00, /* Collection (Physical), */
178 0x75, 0x08, /* Report Size (8), */
179 0x95, 0x01, /* Report Count (1), */
180 0x35, 0x00, /* Physical Minimum (0), */
181 0x46, 0xFF, 0x00, /* Physical Maximum (255), */
182 0x09, 0x30, /* Usage (X), */
183 0x81, 0x02, /* Input (Variable), * Trigger */
184 0xC0, /* End Collection, */
185 0x06, 0x00, 0xFF, /* Usage Page (FF00h), */
186 0x75, 0x08, /* Report Size (8), */
187 0x95, 0x07, /* Report Count (7), * skip 7 bytes */
188 0x81, 0x02, /* Input (Variable), */
189 0x05, 0x01, /* Usage Page (Desktop), */
190 0x75, 0x10, /* Report Size (16), */
191 0x46, 0xFF, 0xFF, /* Physical Maximum (65535), */
192 0x27, 0xFF, 0xFF, 0x00, 0x00, /* Logical Maximum (65535), */
193 0x95, 0x03, /* Report Count (3), * 3x Accels */
194 0x09, 0x33, /* Usage (rX), */
195 0x09, 0x34, /* Usage (rY), */
196 0x09, 0x35, /* Usage (rZ), */
197 0x81, 0x02, /* Input (Variable), */
198 0x06, 0x00, 0xFF, /* Usage Page (FF00h), */
199 0x95, 0x03, /* Report Count (3), * Skip Accels 2nd frame */
200 0x81, 0x02, /* Input (Variable), */
201 0x05, 0x01, /* Usage Page (Desktop), */
202 0x09, 0x01, /* Usage (Pointer), */
203 0x95, 0x03, /* Report Count (3), * 3x Gyros */
204 0x81, 0x02, /* Input (Variable), */
205 0x06, 0x00, 0xFF, /* Usage Page (FF00h), */
206 0x95, 0x03, /* Report Count (3), * Skip Gyros 2nd frame */
207 0x81, 0x02, /* Input (Variable), */
208 0x75, 0x0C, /* Report Size (12), */
209 0x46, 0xFF, 0x0F, /* Physical Maximum (4095), */
210 0x26, 0xFF, 0x0F, /* Logical Maximum (4095), */
211 0x95, 0x04, /* Report Count (4), * Skip Temp and Magnetometers */
212 0x81, 0x02, /* Input (Variable), */
213 0x75, 0x08, /* Report Size (8), */
214 0x46, 0xFF, 0x00, /* Physical Maximum (255), */
215 0x26, 0xFF, 0x00, /* Logical Maximum (255), */
216 0x95, 0x06, /* Report Count (6), * Skip Timestamp and Extension Bytes */
217 0x81, 0x02, /* Input (Variable), */
218 0x75, 0x08, /* Report Size (8), */
219 0x95, 0x30, /* Report Count (48), */
220 0x09, 0x01, /* Usage (Pointer), */
221 0x91, 0x02, /* Output (Variable), */
222 0x75, 0x08, /* Report Size (8), */
223 0x95, 0x30, /* Report Count (48), */
224 0x09, 0x01, /* Usage (Pointer), */
225 0xB1, 0x02, /* Feature (Variable), */
226 0xC0, /* End Collection, */
227 0xA1, 0x02, /* Collection (Logical), */
228 0x85, 0x02, /* Report ID (2), */
229 0x75, 0x08, /* Report Size (8), */
230 0x95, 0x30, /* Report Count (48), */
231 0x09, 0x01, /* Usage (Pointer), */
232 0xB1, 0x02, /* Feature (Variable), */
233 0xC0, /* End Collection, */
234 0xA1, 0x02, /* Collection (Logical), */
235 0x85, 0xEE, /* Report ID (238), */
236 0x75, 0x08, /* Report Size (8), */
237 0x95, 0x30, /* Report Count (48), */
238 0x09, 0x01, /* Usage (Pointer), */
239 0xB1, 0x02, /* Feature (Variable), */
240 0xC0, /* End Collection, */
241 0xA1, 0x02, /* Collection (Logical), */
242 0x85, 0xEF, /* Report ID (239), */
243 0x75, 0x08, /* Report Size (8), */
244 0x95, 0x30, /* Report Count (48), */
245 0x09, 0x01, /* Usage (Pointer), */
246 0xB1, 0x02, /* Feature (Variable), */
247 0xC0, /* End Collection, */
248 0xC0 /* End Collection */
249 };
250
251 /* PS/3 Navigation controller */
252 static __u8 navigation_rdesc[] = {
253 0x05, 0x01, /* Usage Page (Desktop), */
254 0x09, 0x04, /* Usage (Joystik), */
255 0xA1, 0x01, /* Collection (Application), */
256 0xA1, 0x02, /* Collection (Logical), */
257 0x85, 0x01, /* Report ID (1), */
258 0x75, 0x08, /* Report Size (8), */
259 0x95, 0x01, /* Report Count (1), */
260 0x15, 0x00, /* Logical Minimum (0), */
261 0x26, 0xFF, 0x00, /* Logical Maximum (255), */
262 0x81, 0x03, /* Input (Constant, Variable), */
263 0x75, 0x01, /* Report Size (1), */
264 0x95, 0x13, /* Report Count (19), */
265 0x15, 0x00, /* Logical Minimum (0), */
266 0x25, 0x01, /* Logical Maximum (1), */
267 0x35, 0x00, /* Physical Minimum (0), */
268 0x45, 0x01, /* Physical Maximum (1), */
269 0x05, 0x09, /* Usage Page (Button), */
270 0x19, 0x01, /* Usage Minimum (01h), */
271 0x29, 0x13, /* Usage Maximum (13h), */
272 0x81, 0x02, /* Input (Variable), */
273 0x75, 0x01, /* Report Size (1), */
274 0x95, 0x0D, /* Report Count (13), */
275 0x06, 0x00, 0xFF, /* Usage Page (FF00h), */
276 0x81, 0x03, /* Input (Constant, Variable), */
277 0x15, 0x00, /* Logical Minimum (0), */
278 0x26, 0xFF, 0x00, /* Logical Maximum (255), */
279 0x05, 0x01, /* Usage Page (Desktop), */
280 0x09, 0x01, /* Usage (Pointer), */
281 0xA1, 0x00, /* Collection (Physical), */
282 0x75, 0x08, /* Report Size (8), */
283 0x95, 0x02, /* Report Count (2), */
284 0x35, 0x00, /* Physical Minimum (0), */
285 0x46, 0xFF, 0x00, /* Physical Maximum (255), */
286 0x09, 0x30, /* Usage (X), */
287 0x09, 0x31, /* Usage (Y), */
288 0x81, 0x02, /* Input (Variable), */
289 0xC0, /* End Collection, */
290 0x06, 0x00, 0xFF, /* Usage Page (FF00h), */
291 0x95, 0x06, /* Report Count (6), */
292 0x81, 0x03, /* Input (Constant, Variable), */
293 0x05, 0x01, /* Usage Page (Desktop), */
294 0x75, 0x08, /* Report Size (8), */
295 0x95, 0x05, /* Report Count (5), */
296 0x09, 0x01, /* Usage (Pointer), */
297 0x81, 0x02, /* Input (Variable), */
298 0x06, 0x00, 0xFF, /* Usage Page (FF00h), */
299 0x95, 0x20, /* Report Count (26), */
300 0x81, 0x02, /* Input (Variable), */
301 0x75, 0x08, /* Report Size (8), */
302 0x95, 0x30, /* Report Count (48), */
303 0x09, 0x01, /* Usage (Pointer), */
304 0x91, 0x02, /* Output (Variable), */
305 0x75, 0x08, /* Report Size (8), */
306 0x95, 0x30, /* Report Count (48), */
307 0x09, 0x01, /* Usage (Pointer), */
308 0xB1, 0x02, /* Feature (Variable), */
309 0xC0, /* End Collection, */
310 0xA1, 0x02, /* Collection (Logical), */
311 0x85, 0x02, /* Report ID (2), */
312 0x75, 0x08, /* Report Size (8), */
313 0x95, 0x30, /* Report Count (48), */
314 0x09, 0x01, /* Usage (Pointer), */
315 0xB1, 0x02, /* Feature (Variable), */
316 0xC0, /* End Collection, */
317 0xA1, 0x02, /* Collection (Logical), */
318 0x85, 0xEE, /* Report ID (238), */
319 0x75, 0x08, /* Report Size (8), */
320 0x95, 0x30, /* Report Count (48), */
321 0x09, 0x01, /* Usage (Pointer), */
322 0xB1, 0x02, /* Feature (Variable), */
323 0xC0, /* End Collection, */
324 0xA1, 0x02, /* Collection (Logical), */
325 0x85, 0xEF, /* Report ID (239), */
326 0x75, 0x08, /* Report Size (8), */
327 0x95, 0x30, /* Report Count (48), */
328 0x09, 0x01, /* Usage (Pointer), */
329 0xB1, 0x02, /* Feature (Variable), */
330 0xC0, /* End Collection, */
331 0xC0 /* End Collection */
332 };
333
334 /*
335 * The default descriptor doesn't provide mapping for the accelerometers
336 * or orientation sensors. This fixed descriptor maps the accelerometers
337 * to usage values 0x40, 0x41 and 0x42 and maps the orientation sensors
338 * to usage values 0x43, 0x44 and 0x45.
339 */
340 static u8 dualshock4_usb_rdesc[] = {
341 0x05, 0x01, /* Usage Page (Desktop), */
342 0x09, 0x05, /* Usage (Gamepad), */
343 0xA1, 0x01, /* Collection (Application), */
344 0x85, 0x01, /* Report ID (1), */
345 0x09, 0x30, /* Usage (X), */
346 0x09, 0x31, /* Usage (Y), */
347 0x09, 0x32, /* Usage (Z), */
348 0x09, 0x35, /* Usage (Rz), */
349 0x15, 0x00, /* Logical Minimum (0), */
350 0x26, 0xFF, 0x00, /* Logical Maximum (255), */
351 0x75, 0x08, /* Report Size (8), */
352 0x95, 0x04, /* Report Count (4), */
353 0x81, 0x02, /* Input (Variable), */
354 0x09, 0x39, /* Usage (Hat Switch), */
355 0x15, 0x00, /* Logical Minimum (0), */
356 0x25, 0x07, /* Logical Maximum (7), */
357 0x35, 0x00, /* Physical Minimum (0), */
358 0x46, 0x3B, 0x01, /* Physical Maximum (315), */
359 0x65, 0x14, /* Unit (Degrees), */
360 0x75, 0x04, /* Report Size (4), */
361 0x95, 0x01, /* Report Count (1), */
362 0x81, 0x42, /* Input (Variable, Null State), */
363 0x65, 0x00, /* Unit, */
364 0x05, 0x09, /* Usage Page (Button), */
365 0x19, 0x01, /* Usage Minimum (01h), */
366 0x29, 0x0E, /* Usage Maximum (0Eh), */
367 0x15, 0x00, /* Logical Minimum (0), */
368 0x25, 0x01, /* Logical Maximum (1), */
369 0x75, 0x01, /* Report Size (1), */
370 0x95, 0x0E, /* Report Count (14), */
371 0x81, 0x02, /* Input (Variable), */
372 0x06, 0x00, 0xFF, /* Usage Page (FF00h), */
373 0x09, 0x20, /* Usage (20h), */
374 0x75, 0x06, /* Report Size (6), */
375 0x95, 0x01, /* Report Count (1), */
376 0x15, 0x00, /* Logical Minimum (0), */
377 0x25, 0x3F, /* Logical Maximum (63), */
378 0x81, 0x02, /* Input (Variable), */
379 0x05, 0x01, /* Usage Page (Desktop), */
380 0x09, 0x33, /* Usage (Rx), */
381 0x09, 0x34, /* Usage (Ry), */
382 0x15, 0x00, /* Logical Minimum (0), */
383 0x26, 0xFF, 0x00, /* Logical Maximum (255), */
384 0x75, 0x08, /* Report Size (8), */
385 0x95, 0x02, /* Report Count (2), */
386 0x81, 0x02, /* Input (Variable), */
387 0x06, 0x00, 0xFF, /* Usage Page (FF00h), */
388 0x09, 0x21, /* Usage (21h), */
389 0x95, 0x03, /* Report Count (3), */
390 0x81, 0x02, /* Input (Variable), */
391 0x05, 0x01, /* Usage Page (Desktop), */
392 0x19, 0x40, /* Usage Minimum (40h), */
393 0x29, 0x42, /* Usage Maximum (42h), */
394 0x16, 0x00, 0x80, /* Logical Minimum (-32768), */
395 0x26, 0x00, 0x7F, /* Logical Maximum (32767), */
396 0x75, 0x10, /* Report Size (16), */
397 0x95, 0x03, /* Report Count (3), */
398 0x81, 0x02, /* Input (Variable), */
399 0x19, 0x43, /* Usage Minimum (43h), */
400 0x29, 0x45, /* Usage Maximum (45h), */
401 0x16, 0x00, 0xE0, /* Logical Minimum (-8192), */
402 0x26, 0xFF, 0x1F, /* Logical Maximum (8191), */
403 0x95, 0x03, /* Report Count (3), */
404 0x81, 0x02, /* Input (Variable), */
405 0x06, 0x00, 0xFF, /* Usage Page (FF00h), */
406 0x09, 0x21, /* Usage (21h), */
407 0x15, 0x00, /* Logical Minimum (0), */
408 0x26, 0xFF, 0x00, /* Logical Maximum (255), */
409 0x75, 0x08, /* Report Size (8), */
410 0x95, 0x27, /* Report Count (39), */
411 0x81, 0x02, /* Input (Variable), */
412 0x85, 0x05, /* Report ID (5), */
413 0x09, 0x22, /* Usage (22h), */
414 0x95, 0x1F, /* Report Count (31), */
415 0x91, 0x02, /* Output (Variable), */
416 0x85, 0x04, /* Report ID (4), */
417 0x09, 0x23, /* Usage (23h), */
418 0x95, 0x24, /* Report Count (36), */
419 0xB1, 0x02, /* Feature (Variable), */
420 0x85, 0x02, /* Report ID (2), */
421 0x09, 0x24, /* Usage (24h), */
422 0x95, 0x24, /* Report Count (36), */
423 0xB1, 0x02, /* Feature (Variable), */
424 0x85, 0x08, /* Report ID (8), */
425 0x09, 0x25, /* Usage (25h), */
426 0x95, 0x03, /* Report Count (3), */
427 0xB1, 0x02, /* Feature (Variable), */
428 0x85, 0x10, /* Report ID (16), */
429 0x09, 0x26, /* Usage (26h), */
430 0x95, 0x04, /* Report Count (4), */
431 0xB1, 0x02, /* Feature (Variable), */
432 0x85, 0x11, /* Report ID (17), */
433 0x09, 0x27, /* Usage (27h), */
434 0x95, 0x02, /* Report Count (2), */
435 0xB1, 0x02, /* Feature (Variable), */
436 0x85, 0x12, /* Report ID (18), */
437 0x06, 0x02, 0xFF, /* Usage Page (FF02h), */
438 0x09, 0x21, /* Usage (21h), */
439 0x95, 0x0F, /* Report Count (15), */
440 0xB1, 0x02, /* Feature (Variable), */
441 0x85, 0x13, /* Report ID (19), */
442 0x09, 0x22, /* Usage (22h), */
443 0x95, 0x16, /* Report Count (22), */
444 0xB1, 0x02, /* Feature (Variable), */
445 0x85, 0x14, /* Report ID (20), */
446 0x06, 0x05, 0xFF, /* Usage Page (FF05h), */
447 0x09, 0x20, /* Usage (20h), */
448 0x95, 0x10, /* Report Count (16), */
449 0xB1, 0x02, /* Feature (Variable), */
450 0x85, 0x15, /* Report ID (21), */
451 0x09, 0x21, /* Usage (21h), */
452 0x95, 0x2C, /* Report Count (44), */
453 0xB1, 0x02, /* Feature (Variable), */
454 0x06, 0x80, 0xFF, /* Usage Page (FF80h), */
455 0x85, 0x80, /* Report ID (128), */
456 0x09, 0x20, /* Usage (20h), */
457 0x95, 0x06, /* Report Count (6), */
458 0xB1, 0x02, /* Feature (Variable), */
459 0x85, 0x81, /* Report ID (129), */
460 0x09, 0x21, /* Usage (21h), */
461 0x95, 0x06, /* Report Count (6), */
462 0xB1, 0x02, /* Feature (Variable), */
463 0x85, 0x82, /* Report ID (130), */
464 0x09, 0x22, /* Usage (22h), */
465 0x95, 0x05, /* Report Count (5), */
466 0xB1, 0x02, /* Feature (Variable), */
467 0x85, 0x83, /* Report ID (131), */
468 0x09, 0x23, /* Usage (23h), */
469 0x95, 0x01, /* Report Count (1), */
470 0xB1, 0x02, /* Feature (Variable), */
471 0x85, 0x84, /* Report ID (132), */
472 0x09, 0x24, /* Usage (24h), */
473 0x95, 0x04, /* Report Count (4), */
474 0xB1, 0x02, /* Feature (Variable), */
475 0x85, 0x85, /* Report ID (133), */
476 0x09, 0x25, /* Usage (25h), */
477 0x95, 0x06, /* Report Count (6), */
478 0xB1, 0x02, /* Feature (Variable), */
479 0x85, 0x86, /* Report ID (134), */
480 0x09, 0x26, /* Usage (26h), */
481 0x95, 0x06, /* Report Count (6), */
482 0xB1, 0x02, /* Feature (Variable), */
483 0x85, 0x87, /* Report ID (135), */
484 0x09, 0x27, /* Usage (27h), */
485 0x95, 0x23, /* Report Count (35), */
486 0xB1, 0x02, /* Feature (Variable), */
487 0x85, 0x88, /* Report ID (136), */
488 0x09, 0x28, /* Usage (28h), */
489 0x95, 0x22, /* Report Count (34), */
490 0xB1, 0x02, /* Feature (Variable), */
491 0x85, 0x89, /* Report ID (137), */
492 0x09, 0x29, /* Usage (29h), */
493 0x95, 0x02, /* Report Count (2), */
494 0xB1, 0x02, /* Feature (Variable), */
495 0x85, 0x90, /* Report ID (144), */
496 0x09, 0x30, /* Usage (30h), */
497 0x95, 0x05, /* Report Count (5), */
498 0xB1, 0x02, /* Feature (Variable), */
499 0x85, 0x91, /* Report ID (145), */
500 0x09, 0x31, /* Usage (31h), */
501 0x95, 0x03, /* Report Count (3), */
502 0xB1, 0x02, /* Feature (Variable), */
503 0x85, 0x92, /* Report ID (146), */
504 0x09, 0x32, /* Usage (32h), */
505 0x95, 0x03, /* Report Count (3), */
506 0xB1, 0x02, /* Feature (Variable), */
507 0x85, 0x93, /* Report ID (147), */
508 0x09, 0x33, /* Usage (33h), */
509 0x95, 0x0C, /* Report Count (12), */
510 0xB1, 0x02, /* Feature (Variable), */
511 0x85, 0xA0, /* Report ID (160), */
512 0x09, 0x40, /* Usage (40h), */
513 0x95, 0x06, /* Report Count (6), */
514 0xB1, 0x02, /* Feature (Variable), */
515 0x85, 0xA1, /* Report ID (161), */
516 0x09, 0x41, /* Usage (41h), */
517 0x95, 0x01, /* Report Count (1), */
518 0xB1, 0x02, /* Feature (Variable), */
519 0x85, 0xA2, /* Report ID (162), */
520 0x09, 0x42, /* Usage (42h), */
521 0x95, 0x01, /* Report Count (1), */
522 0xB1, 0x02, /* Feature (Variable), */
523 0x85, 0xA3, /* Report ID (163), */
524 0x09, 0x43, /* Usage (43h), */
525 0x95, 0x30, /* Report Count (48), */
526 0xB1, 0x02, /* Feature (Variable), */
527 0x85, 0xA4, /* Report ID (164), */
528 0x09, 0x44, /* Usage (44h), */
529 0x95, 0x0D, /* Report Count (13), */
530 0xB1, 0x02, /* Feature (Variable), */
531 0x85, 0xA5, /* Report ID (165), */
532 0x09, 0x45, /* Usage (45h), */
533 0x95, 0x15, /* Report Count (21), */
534 0xB1, 0x02, /* Feature (Variable), */
535 0x85, 0xA6, /* Report ID (166), */
536 0x09, 0x46, /* Usage (46h), */
537 0x95, 0x15, /* Report Count (21), */
538 0xB1, 0x02, /* Feature (Variable), */
539 0x85, 0xF0, /* Report ID (240), */
540 0x09, 0x47, /* Usage (47h), */
541 0x95, 0x3F, /* Report Count (63), */
542 0xB1, 0x02, /* Feature (Variable), */
543 0x85, 0xF1, /* Report ID (241), */
544 0x09, 0x48, /* Usage (48h), */
545 0x95, 0x3F, /* Report Count (63), */
546 0xB1, 0x02, /* Feature (Variable), */
547 0x85, 0xF2, /* Report ID (242), */
548 0x09, 0x49, /* Usage (49h), */
549 0x95, 0x0F, /* Report Count (15), */
550 0xB1, 0x02, /* Feature (Variable), */
551 0x85, 0xA7, /* Report ID (167), */
552 0x09, 0x4A, /* Usage (4Ah), */
553 0x95, 0x01, /* Report Count (1), */
554 0xB1, 0x02, /* Feature (Variable), */
555 0x85, 0xA8, /* Report ID (168), */
556 0x09, 0x4B, /* Usage (4Bh), */
557 0x95, 0x01, /* Report Count (1), */
558 0xB1, 0x02, /* Feature (Variable), */
559 0x85, 0xA9, /* Report ID (169), */
560 0x09, 0x4C, /* Usage (4Ch), */
561 0x95, 0x08, /* Report Count (8), */
562 0xB1, 0x02, /* Feature (Variable), */
563 0x85, 0xAA, /* Report ID (170), */
564 0x09, 0x4E, /* Usage (4Eh), */
565 0x95, 0x01, /* Report Count (1), */
566 0xB1, 0x02, /* Feature (Variable), */
567 0x85, 0xAB, /* Report ID (171), */
568 0x09, 0x4F, /* Usage (4Fh), */
569 0x95, 0x39, /* Report Count (57), */
570 0xB1, 0x02, /* Feature (Variable), */
571 0x85, 0xAC, /* Report ID (172), */
572 0x09, 0x50, /* Usage (50h), */
573 0x95, 0x39, /* Report Count (57), */
574 0xB1, 0x02, /* Feature (Variable), */
575 0x85, 0xAD, /* Report ID (173), */
576 0x09, 0x51, /* Usage (51h), */
577 0x95, 0x0B, /* Report Count (11), */
578 0xB1, 0x02, /* Feature (Variable), */
579 0x85, 0xAE, /* Report ID (174), */
580 0x09, 0x52, /* Usage (52h), */
581 0x95, 0x01, /* Report Count (1), */
582 0xB1, 0x02, /* Feature (Variable), */
583 0x85, 0xAF, /* Report ID (175), */
584 0x09, 0x53, /* Usage (53h), */
585 0x95, 0x02, /* Report Count (2), */
586 0xB1, 0x02, /* Feature (Variable), */
587 0x85, 0xB0, /* Report ID (176), */
588 0x09, 0x54, /* Usage (54h), */
589 0x95, 0x3F, /* Report Count (63), */
590 0xB1, 0x02, /* Feature (Variable), */
591 0xC0 /* End Collection */
592 };
593
594 /*
595 * The default behavior of the Dualshock 4 is to send reports using report
596 * type 1 when running over Bluetooth. However, when feature report 2 is
597 * requested during the controller initialization it starts sending input
598 * reports in report 17. Since report 17 is undefined in the default HID
599 * descriptor the button and axis definitions must be moved to report 17 or
600 * the HID layer won't process the received input.
601 */
602 static u8 dualshock4_bt_rdesc[] = {
603 0x05, 0x01, /* Usage Page (Desktop), */
604 0x09, 0x05, /* Usage (Gamepad), */
605 0xA1, 0x01, /* Collection (Application), */
606 0x85, 0x01, /* Report ID (1), */
607 0x75, 0x08, /* Report Size (8), */
608 0x95, 0x0A, /* Report Count (9), */
609 0x81, 0x02, /* Input (Variable), */
610 0x06, 0x04, 0xFF, /* Usage Page (FF04h), */
611 0x85, 0x02, /* Report ID (2), */
612 0x09, 0x24, /* Usage (24h), */
613 0x95, 0x24, /* Report Count (36), */
614 0xB1, 0x02, /* Feature (Variable), */
615 0x85, 0xA3, /* Report ID (163), */
616 0x09, 0x25, /* Usage (25h), */
617 0x95, 0x30, /* Report Count (48), */
618 0xB1, 0x02, /* Feature (Variable), */
619 0x85, 0x05, /* Report ID (5), */
620 0x09, 0x26, /* Usage (26h), */
621 0x95, 0x28, /* Report Count (40), */
622 0xB1, 0x02, /* Feature (Variable), */
623 0x85, 0x06, /* Report ID (6), */
624 0x09, 0x27, /* Usage (27h), */
625 0x95, 0x34, /* Report Count (52), */
626 0xB1, 0x02, /* Feature (Variable), */
627 0x85, 0x07, /* Report ID (7), */
628 0x09, 0x28, /* Usage (28h), */
629 0x95, 0x30, /* Report Count (48), */
630 0xB1, 0x02, /* Feature (Variable), */
631 0x85, 0x08, /* Report ID (8), */
632 0x09, 0x29, /* Usage (29h), */
633 0x95, 0x2F, /* Report Count (47), */
634 0xB1, 0x02, /* Feature (Variable), */
635 0x06, 0x03, 0xFF, /* Usage Page (FF03h), */
636 0x85, 0x03, /* Report ID (3), */
637 0x09, 0x21, /* Usage (21h), */
638 0x95, 0x26, /* Report Count (38), */
639 0xB1, 0x02, /* Feature (Variable), */
640 0x85, 0x04, /* Report ID (4), */
641 0x09, 0x22, /* Usage (22h), */
642 0x95, 0x2E, /* Report Count (46), */
643 0xB1, 0x02, /* Feature (Variable), */
644 0x85, 0xF0, /* Report ID (240), */
645 0x09, 0x47, /* Usage (47h), */
646 0x95, 0x3F, /* Report Count (63), */
647 0xB1, 0x02, /* Feature (Variable), */
648 0x85, 0xF1, /* Report ID (241), */
649 0x09, 0x48, /* Usage (48h), */
650 0x95, 0x3F, /* Report Count (63), */
651 0xB1, 0x02, /* Feature (Variable), */
652 0x85, 0xF2, /* Report ID (242), */
653 0x09, 0x49, /* Usage (49h), */
654 0x95, 0x0F, /* Report Count (15), */
655 0xB1, 0x02, /* Feature (Variable), */
656 0x85, 0x11, /* Report ID (17), */
657 0x06, 0x00, 0xFF, /* Usage Page (FF00h), */
658 0x09, 0x20, /* Usage (20h), */
659 0x95, 0x02, /* Report Count (2), */
660 0x81, 0x02, /* Input (Variable), */
661 0x05, 0x01, /* Usage Page (Desktop), */
662 0x09, 0x30, /* Usage (X), */
663 0x09, 0x31, /* Usage (Y), */
664 0x09, 0x32, /* Usage (Z), */
665 0x09, 0x35, /* Usage (Rz), */
666 0x15, 0x00, /* Logical Minimum (0), */
667 0x26, 0xFF, 0x00, /* Logical Maximum (255), */
668 0x75, 0x08, /* Report Size (8), */
669 0x95, 0x04, /* Report Count (4), */
670 0x81, 0x02, /* Input (Variable), */
671 0x09, 0x39, /* Usage (Hat Switch), */
672 0x15, 0x00, /* Logical Minimum (0), */
673 0x25, 0x07, /* Logical Maximum (7), */
674 0x75, 0x04, /* Report Size (4), */
675 0x95, 0x01, /* Report Count (1), */
676 0x81, 0x42, /* Input (Variable, Null State), */
677 0x05, 0x09, /* Usage Page (Button), */
678 0x19, 0x01, /* Usage Minimum (01h), */
679 0x29, 0x0E, /* Usage Maximum (0Eh), */
680 0x15, 0x00, /* Logical Minimum (0), */
681 0x25, 0x01, /* Logical Maximum (1), */
682 0x75, 0x01, /* Report Size (1), */
683 0x95, 0x0E, /* Report Count (14), */
684 0x81, 0x02, /* Input (Variable), */
685 0x75, 0x06, /* Report Size (6), */
686 0x95, 0x01, /* Report Count (1), */
687 0x81, 0x01, /* Input (Constant), */
688 0x05, 0x01, /* Usage Page (Desktop), */
689 0x09, 0x33, /* Usage (Rx), */
690 0x09, 0x34, /* Usage (Ry), */
691 0x15, 0x00, /* Logical Minimum (0), */
692 0x26, 0xFF, 0x00, /* Logical Maximum (255), */
693 0x75, 0x08, /* Report Size (8), */
694 0x95, 0x02, /* Report Count (2), */
695 0x81, 0x02, /* Input (Variable), */
696 0x06, 0x00, 0xFF, /* Usage Page (FF00h), */
697 0x09, 0x20, /* Usage (20h), */
698 0x95, 0x03, /* Report Count (3), */
699 0x81, 0x02, /* Input (Variable), */
700 0x05, 0x01, /* Usage Page (Desktop), */
701 0x19, 0x40, /* Usage Minimum (40h), */
702 0x29, 0x42, /* Usage Maximum (42h), */
703 0x16, 0x00, 0x80, /* Logical Minimum (-32768), */
704 0x26, 0x00, 0x7F, /* Logical Maximum (32767), */
705 0x75, 0x10, /* Report Size (16), */
706 0x95, 0x03, /* Report Count (3), */
707 0x81, 0x02, /* Input (Variable), */
708 0x19, 0x43, /* Usage Minimum (43h), */
709 0x29, 0x45, /* Usage Maximum (45h), */
710 0x16, 0x00, 0xE0, /* Logical Minimum (-8192), */
711 0x26, 0xFF, 0x1F, /* Logical Maximum (8191), */
712 0x95, 0x03, /* Report Count (3), */
713 0x81, 0x02, /* Input (Variable), */
714 0x06, 0x00, 0xFF, /* Usage Page (FF00h), */
715 0x09, 0x20, /* Usage (20h), */
716 0x15, 0x00, /* Logical Minimum (0), */
717 0x26, 0xFF, 0x00, /* Logical Maximum (255), */
718 0x75, 0x08, /* Report Size (8), */
719 0x95, 0x31, /* Report Count (51), */
720 0x81, 0x02, /* Input (Variable), */
721 0x09, 0x21, /* Usage (21h), */
722 0x75, 0x08, /* Report Size (8), */
723 0x95, 0x4D, /* Report Count (77), */
724 0x91, 0x02, /* Output (Variable), */
725 0x85, 0x12, /* Report ID (18), */
726 0x09, 0x22, /* Usage (22h), */
727 0x95, 0x8D, /* Report Count (141), */
728 0x81, 0x02, /* Input (Variable), */
729 0x09, 0x23, /* Usage (23h), */
730 0x91, 0x02, /* Output (Variable), */
731 0x85, 0x13, /* Report ID (19), */
732 0x09, 0x24, /* Usage (24h), */
733 0x95, 0xCD, /* Report Count (205), */
734 0x81, 0x02, /* Input (Variable), */
735 0x09, 0x25, /* Usage (25h), */
736 0x91, 0x02, /* Output (Variable), */
737 0x85, 0x14, /* Report ID (20), */
738 0x09, 0x26, /* Usage (26h), */
739 0x96, 0x0D, 0x01, /* Report Count (269), */
740 0x81, 0x02, /* Input (Variable), */
741 0x09, 0x27, /* Usage (27h), */
742 0x91, 0x02, /* Output (Variable), */
743 0x85, 0x15, /* Report ID (21), */
744 0x09, 0x28, /* Usage (28h), */
745 0x96, 0x4D, 0x01, /* Report Count (333), */
746 0x81, 0x02, /* Input (Variable), */
747 0x09, 0x29, /* Usage (29h), */
748 0x91, 0x02, /* Output (Variable), */
749 0x85, 0x16, /* Report ID (22), */
750 0x09, 0x2A, /* Usage (2Ah), */
751 0x96, 0x8D, 0x01, /* Report Count (397), */
752 0x81, 0x02, /* Input (Variable), */
753 0x09, 0x2B, /* Usage (2Bh), */
754 0x91, 0x02, /* Output (Variable), */
755 0x85, 0x17, /* Report ID (23), */
756 0x09, 0x2C, /* Usage (2Ch), */
757 0x96, 0xCD, 0x01, /* Report Count (461), */
758 0x81, 0x02, /* Input (Variable), */
759 0x09, 0x2D, /* Usage (2Dh), */
760 0x91, 0x02, /* Output (Variable), */
761 0x85, 0x18, /* Report ID (24), */
762 0x09, 0x2E, /* Usage (2Eh), */
763 0x96, 0x0D, 0x02, /* Report Count (525), */
764 0x81, 0x02, /* Input (Variable), */
765 0x09, 0x2F, /* Usage (2Fh), */
766 0x91, 0x02, /* Output (Variable), */
767 0x85, 0x19, /* Report ID (25), */
768 0x09, 0x30, /* Usage (30h), */
769 0x96, 0x22, 0x02, /* Report Count (546), */
770 0x81, 0x02, /* Input (Variable), */
771 0x09, 0x31, /* Usage (31h), */
772 0x91, 0x02, /* Output (Variable), */
773 0x06, 0x80, 0xFF, /* Usage Page (FF80h), */
774 0x85, 0x82, /* Report ID (130), */
775 0x09, 0x22, /* Usage (22h), */
776 0x95, 0x3F, /* Report Count (63), */
777 0xB1, 0x02, /* Feature (Variable), */
778 0x85, 0x83, /* Report ID (131), */
779 0x09, 0x23, /* Usage (23h), */
780 0xB1, 0x02, /* Feature (Variable), */
781 0x85, 0x84, /* Report ID (132), */
782 0x09, 0x24, /* Usage (24h), */
783 0xB1, 0x02, /* Feature (Variable), */
784 0x85, 0x90, /* Report ID (144), */
785 0x09, 0x30, /* Usage (30h), */
786 0xB1, 0x02, /* Feature (Variable), */
787 0x85, 0x91, /* Report ID (145), */
788 0x09, 0x31, /* Usage (31h), */
789 0xB1, 0x02, /* Feature (Variable), */
790 0x85, 0x92, /* Report ID (146), */
791 0x09, 0x32, /* Usage (32h), */
792 0xB1, 0x02, /* Feature (Variable), */
793 0x85, 0x93, /* Report ID (147), */
794 0x09, 0x33, /* Usage (33h), */
795 0xB1, 0x02, /* Feature (Variable), */
796 0x85, 0xA0, /* Report ID (160), */
797 0x09, 0x40, /* Usage (40h), */
798 0xB1, 0x02, /* Feature (Variable), */
799 0x85, 0xA4, /* Report ID (164), */
800 0x09, 0x44, /* Usage (44h), */
801 0xB1, 0x02, /* Feature (Variable), */
802 0xC0 /* End Collection */
803 };
804
805 static __u8 ps3remote_rdesc[] = {
806 0x05, 0x01, /* GUsagePage Generic Desktop */
807 0x09, 0x05, /* LUsage 0x05 [Game Pad] */
808 0xA1, 0x01, /* MCollection Application (mouse, keyboard) */
809
810 /* Use collection 1 for joypad buttons */
811 0xA1, 0x02, /* MCollection Logical (interrelated data) */
812
813 /* Ignore the 1st byte, maybe it is used for a controller
814 * number but it's not needed for correct operation */
815 0x75, 0x08, /* GReportSize 0x08 [8] */
816 0x95, 0x01, /* GReportCount 0x01 [1] */
817 0x81, 0x01, /* MInput 0x01 (Const[0] Arr[1] Abs[2]) */
818
819 /* Bytes from 2nd to 4th are a bitmap for joypad buttons, for these
820 * buttons multiple keypresses are allowed */
821 0x05, 0x09, /* GUsagePage Button */
822 0x19, 0x01, /* LUsageMinimum 0x01 [Button 1 (primary/trigger)] */
823 0x29, 0x18, /* LUsageMaximum 0x18 [Button 24] */
824 0x14, /* GLogicalMinimum [0] */
825 0x25, 0x01, /* GLogicalMaximum 0x01 [1] */
826 0x75, 0x01, /* GReportSize 0x01 [1] */
827 0x95, 0x18, /* GReportCount 0x18 [24] */
828 0x81, 0x02, /* MInput 0x02 (Data[0] Var[1] Abs[2]) */
829
830 0xC0, /* MEndCollection */
831
832 /* Use collection 2 for remote control buttons */
833 0xA1, 0x02, /* MCollection Logical (interrelated data) */
834
835 /* 5th byte is used for remote control buttons */
836 0x05, 0x09, /* GUsagePage Button */
837 0x18, /* LUsageMinimum [No button pressed] */
838 0x29, 0xFE, /* LUsageMaximum 0xFE [Button 254] */
839 0x14, /* GLogicalMinimum [0] */
840 0x26, 0xFE, 0x00, /* GLogicalMaximum 0x00FE [254] */
841 0x75, 0x08, /* GReportSize 0x08 [8] */
842 0x95, 0x01, /* GReportCount 0x01 [1] */
843 0x80, /* MInput */
844
845 /* Ignore bytes from 6th to 11th, 6th to 10th are always constant at
846 * 0xff and 11th is for press indication */
847 0x75, 0x08, /* GReportSize 0x08 [8] */
848 0x95, 0x06, /* GReportCount 0x06 [6] */
849 0x81, 0x01, /* MInput 0x01 (Const[0] Arr[1] Abs[2]) */
850
851 /* 12th byte is for battery strength */
852 0x05, 0x06, /* GUsagePage Generic Device Controls */
853 0x09, 0x20, /* LUsage 0x20 [Battery Strength] */
854 0x14, /* GLogicalMinimum [0] */
855 0x25, 0x05, /* GLogicalMaximum 0x05 [5] */
856 0x75, 0x08, /* GReportSize 0x08 [8] */
857 0x95, 0x01, /* GReportCount 0x01 [1] */
858 0x81, 0x02, /* MInput 0x02 (Data[0] Var[1] Abs[2]) */
859
860 0xC0, /* MEndCollection */
861
862 0xC0 /* MEndCollection [Game Pad] */
863 };
864
865 static const unsigned int ps3remote_keymap_joypad_buttons[] = {
866 [0x01] = KEY_SELECT,
867 [0x02] = BTN_THUMBL, /* L3 */
868 [0x03] = BTN_THUMBR, /* R3 */
869 [0x04] = BTN_START,
870 [0x05] = KEY_UP,
871 [0x06] = KEY_RIGHT,
872 [0x07] = KEY_DOWN,
873 [0x08] = KEY_LEFT,
874 [0x09] = BTN_TL2, /* L2 */
875 [0x0a] = BTN_TR2, /* R2 */
876 [0x0b] = BTN_TL, /* L1 */
877 [0x0c] = BTN_TR, /* R1 */
878 [0x0d] = KEY_OPTION, /* options/triangle */
879 [0x0e] = KEY_BACK, /* back/circle */
880 [0x0f] = BTN_0, /* cross */
881 [0x10] = KEY_SCREEN, /* view/square */
882 [0x11] = KEY_HOMEPAGE, /* PS button */
883 [0x14] = KEY_ENTER,
884 };
885 static const unsigned int ps3remote_keymap_remote_buttons[] = {
886 [0x00] = KEY_1,
887 [0x01] = KEY_2,
888 [0x02] = KEY_3,
889 [0x03] = KEY_4,
890 [0x04] = KEY_5,
891 [0x05] = KEY_6,
892 [0x06] = KEY_7,
893 [0x07] = KEY_8,
894 [0x08] = KEY_9,
895 [0x09] = KEY_0,
896 [0x0e] = KEY_ESC, /* return */
897 [0x0f] = KEY_CLEAR,
898 [0x16] = KEY_EJECTCD,
899 [0x1a] = KEY_MENU, /* top menu */
900 [0x28] = KEY_TIME,
901 [0x30] = KEY_PREVIOUS,
902 [0x31] = KEY_NEXT,
903 [0x32] = KEY_PLAY,
904 [0x33] = KEY_REWIND, /* scan back */
905 [0x34] = KEY_FORWARD, /* scan forward */
906 [0x38] = KEY_STOP,
907 [0x39] = KEY_PAUSE,
908 [0x40] = KEY_CONTEXT_MENU, /* pop up/menu */
909 [0x60] = KEY_FRAMEBACK, /* slow/step back */
910 [0x61] = KEY_FRAMEFORWARD, /* slow/step forward */
911 [0x63] = KEY_SUBTITLE,
912 [0x64] = KEY_AUDIO,
913 [0x65] = KEY_ANGLE,
914 [0x70] = KEY_INFO, /* display */
915 [0x80] = KEY_BLUE,
916 [0x81] = KEY_RED,
917 [0x82] = KEY_GREEN,
918 [0x83] = KEY_YELLOW,
919 };
920
921 static const unsigned int buzz_keymap[] = {
922 /*
923 * The controller has 4 remote buzzers, each with one LED and 5
924 * buttons.
925 *
926 * We use the mapping chosen by the controller, which is:
927 *
928 * Key Offset
929 * -------------------
930 * Buzz 1
931 * Blue 5
932 * Orange 4
933 * Green 3
934 * Yellow 2
935 *
936 * So, for example, the orange button on the third buzzer is mapped to
937 * BTN_TRIGGER_HAPPY14
938 */
939 [ 1] = BTN_TRIGGER_HAPPY1,
940 [ 2] = BTN_TRIGGER_HAPPY2,
941 [ 3] = BTN_TRIGGER_HAPPY3,
942 [ 4] = BTN_TRIGGER_HAPPY4,
943 [ 5] = BTN_TRIGGER_HAPPY5,
944 [ 6] = BTN_TRIGGER_HAPPY6,
945 [ 7] = BTN_TRIGGER_HAPPY7,
946 [ 8] = BTN_TRIGGER_HAPPY8,
947 [ 9] = BTN_TRIGGER_HAPPY9,
948 [10] = BTN_TRIGGER_HAPPY10,
949 [11] = BTN_TRIGGER_HAPPY11,
950 [12] = BTN_TRIGGER_HAPPY12,
951 [13] = BTN_TRIGGER_HAPPY13,
952 [14] = BTN_TRIGGER_HAPPY14,
953 [15] = BTN_TRIGGER_HAPPY15,
954 [16] = BTN_TRIGGER_HAPPY16,
955 [17] = BTN_TRIGGER_HAPPY17,
956 [18] = BTN_TRIGGER_HAPPY18,
957 [19] = BTN_TRIGGER_HAPPY19,
958 [20] = BTN_TRIGGER_HAPPY20,
959 };
960
961 static enum power_supply_property sony_battery_props[] = {
962 POWER_SUPPLY_PROP_PRESENT,
963 POWER_SUPPLY_PROP_CAPACITY,
964 POWER_SUPPLY_PROP_SCOPE,
965 POWER_SUPPLY_PROP_STATUS,
966 };
967
968 struct sixaxis_led {
969 __u8 time_enabled; /* the total time the led is active (0xff means forever) */
970 __u8 duty_length; /* how long a cycle is in deciseconds (0 means "really fast") */
971 __u8 enabled;
972 __u8 duty_off; /* % of duty_length the led is off (0xff means 100%) */
973 __u8 duty_on; /* % of duty_length the led is on (0xff mean 100%) */
974 } __packed;
975
976 struct sixaxis_rumble {
977 __u8 padding;
978 __u8 right_duration; /* Right motor duration (0xff means forever) */
979 __u8 right_motor_on; /* Right (small) motor on/off, only supports values of 0 or 1 (off/on) */
980 __u8 left_duration; /* Left motor duration (0xff means forever) */
981 __u8 left_motor_force; /* left (large) motor, supports force values from 0 to 255 */
982 } __packed;
983
984 struct sixaxis_output_report {
985 __u8 report_id;
986 struct sixaxis_rumble rumble;
987 __u8 padding[4];
988 __u8 leds_bitmap; /* bitmap of enabled LEDs: LED_1 = 0x02, LED_2 = 0x04, ... */
989 struct sixaxis_led led[4]; /* LEDx at (4 - x) */
990 struct sixaxis_led _reserved; /* LED5, not actually soldered */
991 } __packed;
992
993 union sixaxis_output_report_01 {
994 struct sixaxis_output_report data;
995 __u8 buf[36];
996 };
997
998 struct motion_output_report_02 {
999 u8 type, zero;
1000 u8 r, g, b;
1001 u8 zero2;
1002 u8 rumble;
1003 };
1004
1005 #define DS4_REPORT_0x02_SIZE 37
1006 #define DS4_REPORT_0x05_SIZE 32
1007 #define DS4_REPORT_0x11_SIZE 78
1008 #define DS4_REPORT_0x81_SIZE 7
1009 #define SIXAXIS_REPORT_0xF2_SIZE 17
1010 #define SIXAXIS_REPORT_0xF5_SIZE 8
1011 #define MOTION_REPORT_0x02_SIZE 49
1012
1013 static DEFINE_SPINLOCK(sony_dev_list_lock);
1014 static LIST_HEAD(sony_device_list);
1015 static DEFINE_IDA(sony_device_id_allocator);
1016
1017 struct sony_sc {
1018 spinlock_t lock;
1019 struct list_head list_node;
1020 struct hid_device *hdev;
1021 struct led_classdev *leds[MAX_LEDS];
1022 unsigned long quirks;
1023 struct work_struct state_worker;
1024 struct power_supply *battery;
1025 struct power_supply_desc battery_desc;
1026 int device_id;
1027 __u8 *output_report_dmabuf;
1028
1029 #ifdef CONFIG_SONY_FF
1030 __u8 left;
1031 __u8 right;
1032 #endif
1033
1034 __u8 mac_address[6];
1035 __u8 worker_initialized;
1036 __u8 cable_state;
1037 __u8 battery_charging;
1038 __u8 battery_capacity;
1039 __u8 led_state[MAX_LEDS];
1040 __u8 led_delay_on[MAX_LEDS];
1041 __u8 led_delay_off[MAX_LEDS];
1042 __u8 led_count;
1043 };
1044
1045 static __u8 *sixaxis_fixup(struct hid_device *hdev, __u8 *rdesc,
1046 unsigned int *rsize)
1047 {
1048 *rsize = sizeof(sixaxis_rdesc);
1049 return sixaxis_rdesc;
1050 }
1051
1052 static u8 *motion_fixup(struct hid_device *hdev, u8 *rdesc,
1053 unsigned int *rsize)
1054 {
1055 *rsize = sizeof(motion_rdesc);
1056 return motion_rdesc;
1057 }
1058
1059 static u8 *navigation_fixup(struct hid_device *hdev, u8 *rdesc,
1060 unsigned int *rsize)
1061 {
1062 *rsize = sizeof(navigation_rdesc);
1063 return navigation_rdesc;
1064 }
1065
1066 static __u8 *ps3remote_fixup(struct hid_device *hdev, __u8 *rdesc,
1067 unsigned int *rsize)
1068 {
1069 *rsize = sizeof(ps3remote_rdesc);
1070 return ps3remote_rdesc;
1071 }
1072
1073 static int ps3remote_mapping(struct hid_device *hdev, struct hid_input *hi,
1074 struct hid_field *field, struct hid_usage *usage,
1075 unsigned long **bit, int *max)
1076 {
1077 unsigned int key = usage->hid & HID_USAGE;
1078
1079 if ((usage->hid & HID_USAGE_PAGE) != HID_UP_BUTTON)
1080 return -1;
1081
1082 switch (usage->collection_index) {
1083 case 1:
1084 if (key >= ARRAY_SIZE(ps3remote_keymap_joypad_buttons))
1085 return -1;
1086
1087 key = ps3remote_keymap_joypad_buttons[key];
1088 if (!key)
1089 return -1;
1090 break;
1091 case 2:
1092 if (key >= ARRAY_SIZE(ps3remote_keymap_remote_buttons))
1093 return -1;
1094
1095 key = ps3remote_keymap_remote_buttons[key];
1096 if (!key)
1097 return -1;
1098 break;
1099 default:
1100 return -1;
1101 }
1102
1103 hid_map_usage_clear(hi, usage, bit, max, EV_KEY, key);
1104 return 1;
1105 }
1106
1107 static __u8 *sony_report_fixup(struct hid_device *hdev, __u8 *rdesc,
1108 unsigned int *rsize)
1109 {
1110 struct sony_sc *sc = hid_get_drvdata(hdev);
1111
1112 /*
1113 * Some Sony RF receivers wrongly declare the mouse pointer as a
1114 * a constant non-data variable.
1115 */
1116 if ((sc->quirks & VAIO_RDESC_CONSTANT) && *rsize >= 56 &&
1117 /* usage page: generic desktop controls */
1118 /* rdesc[0] == 0x05 && rdesc[1] == 0x01 && */
1119 /* usage: mouse */
1120 rdesc[2] == 0x09 && rdesc[3] == 0x02 &&
1121 /* input (usage page for x,y axes): constant, variable, relative */
1122 rdesc[54] == 0x81 && rdesc[55] == 0x07) {
1123 hid_info(hdev, "Fixing up Sony RF Receiver report descriptor\n");
1124 /* input: data, variable, relative */
1125 rdesc[55] = 0x06;
1126 }
1127
1128 /*
1129 * The default Dualshock 4 USB descriptor doesn't assign
1130 * the gyroscope values to corresponding axes so we need a
1131 * modified one.
1132 */
1133 if ((sc->quirks & DUALSHOCK4_CONTROLLER_USB) && *rsize == 467) {
1134 hid_info(hdev, "Using modified Dualshock 4 report descriptor with gyroscope axes\n");
1135 rdesc = dualshock4_usb_rdesc;
1136 *rsize = sizeof(dualshock4_usb_rdesc);
1137 } else if ((sc->quirks & DUALSHOCK4_CONTROLLER_BT) && *rsize == 357) {
1138 hid_info(hdev, "Using modified Dualshock 4 Bluetooth report descriptor\n");
1139 rdesc = dualshock4_bt_rdesc;
1140 *rsize = sizeof(dualshock4_bt_rdesc);
1141 }
1142
1143 if (sc->quirks & SIXAXIS_CONTROLLER)
1144 return sixaxis_fixup(hdev, rdesc, rsize);
1145
1146 if (sc->quirks & MOTION_CONTROLLER)
1147 return motion_fixup(hdev, rdesc, rsize);
1148
1149 if (sc->quirks & NAVIGATION_CONTROLLER)
1150 return navigation_fixup(hdev, rdesc, rsize);
1151
1152 if (sc->quirks & PS3REMOTE)
1153 return ps3remote_fixup(hdev, rdesc, rsize);
1154
1155 return rdesc;
1156 }
1157
1158 static void sixaxis_parse_report(struct sony_sc *sc, __u8 *rd, int size)
1159 {
1160 static const __u8 sixaxis_battery_capacity[] = { 0, 1, 25, 50, 75, 100 };
1161 unsigned long flags;
1162 int offset;
1163 __u8 cable_state, battery_capacity, battery_charging;
1164
1165 /*
1166 * The sixaxis is charging if the battery value is 0xee
1167 * and it is fully charged if the value is 0xef.
1168 * It does not report the actual level while charging so it
1169 * is set to 100% while charging is in progress.
1170 */
1171 offset = (sc->quirks & MOTION_CONTROLLER) ? 12 : 30;
1172
1173 if (rd[offset] >= 0xee) {
1174 battery_capacity = 100;
1175 battery_charging = !(rd[offset] & 0x01);
1176 cable_state = 1;
1177 } else {
1178 __u8 index = rd[offset] <= 5 ? rd[offset] : 5;
1179 battery_capacity = sixaxis_battery_capacity[index];
1180 battery_charging = 0;
1181 cable_state = 0;
1182 }
1183
1184 spin_lock_irqsave(&sc->lock, flags);
1185 sc->cable_state = cable_state;
1186 sc->battery_capacity = battery_capacity;
1187 sc->battery_charging = battery_charging;
1188 spin_unlock_irqrestore(&sc->lock, flags);
1189 }
1190
1191 static void dualshock4_parse_report(struct sony_sc *sc, __u8 *rd, int size)
1192 {
1193 struct hid_input *hidinput = list_entry(sc->hdev->inputs.next,
1194 struct hid_input, list);
1195 struct input_dev *input_dev = hidinput->input;
1196 unsigned long flags;
1197 int n, offset;
1198 __u8 cable_state, battery_capacity, battery_charging;
1199
1200 /*
1201 * Battery and touchpad data starts at byte 30 in the USB report and
1202 * 32 in Bluetooth report.
1203 */
1204 offset = (sc->quirks & DUALSHOCK4_CONTROLLER_USB) ? 30 : 32;
1205
1206 /*
1207 * The lower 4 bits of byte 30 contain the battery level
1208 * and the 5th bit contains the USB cable state.
1209 */
1210 cable_state = (rd[offset] >> 4) & 0x01;
1211 battery_capacity = rd[offset] & 0x0F;
1212
1213 /*
1214 * When a USB power source is connected the battery level ranges from
1215 * 0 to 10, and when running on battery power it ranges from 0 to 9.
1216 * A battery level above 10 when plugged in means charge completed.
1217 */
1218 if (!cable_state || battery_capacity > 10)
1219 battery_charging = 0;
1220 else
1221 battery_charging = 1;
1222
1223 if (!cable_state)
1224 battery_capacity++;
1225 if (battery_capacity > 10)
1226 battery_capacity = 10;
1227
1228 battery_capacity *= 10;
1229
1230 spin_lock_irqsave(&sc->lock, flags);
1231 sc->cable_state = cable_state;
1232 sc->battery_capacity = battery_capacity;
1233 sc->battery_charging = battery_charging;
1234 spin_unlock_irqrestore(&sc->lock, flags);
1235
1236 offset += 5;
1237
1238 /*
1239 * The Dualshock 4 multi-touch trackpad data starts at offset 35 on USB
1240 * and 37 on Bluetooth.
1241 * The first 7 bits of the first byte is a counter and bit 8 is a touch
1242 * indicator that is 0 when pressed and 1 when not pressed.
1243 * The next 3 bytes are two 12 bit touch coordinates, X and Y.
1244 * The data for the second touch is in the same format and immediatly
1245 * follows the data for the first.
1246 */
1247 for (n = 0; n < 2; n++) {
1248 __u16 x, y;
1249
1250 x = rd[offset+1] | ((rd[offset+2] & 0xF) << 8);
1251 y = ((rd[offset+2] & 0xF0) >> 4) | (rd[offset+3] << 4);
1252
1253 input_mt_slot(input_dev, n);
1254 input_mt_report_slot_state(input_dev, MT_TOOL_FINGER,
1255 !(rd[offset] >> 7));
1256 input_report_abs(input_dev, ABS_MT_POSITION_X, x);
1257 input_report_abs(input_dev, ABS_MT_POSITION_Y, y);
1258
1259 offset += 4;
1260 }
1261 }
1262
1263 static int sony_raw_event(struct hid_device *hdev, struct hid_report *report,
1264 __u8 *rd, int size)
1265 {
1266 struct sony_sc *sc = hid_get_drvdata(hdev);
1267
1268 /*
1269 * Sixaxis HID report has acclerometers/gyro with MSByte first, this
1270 * has to be BYTE_SWAPPED before passing up to joystick interface
1271 */
1272 if ((sc->quirks & SIXAXIS_CONTROLLER) && rd[0] == 0x01 && size == 49) {
1273 swap(rd[41], rd[42]);
1274 swap(rd[43], rd[44]);
1275 swap(rd[45], rd[46]);
1276 swap(rd[47], rd[48]);
1277
1278 sixaxis_parse_report(sc, rd, size);
1279 } else if ((sc->quirks & MOTION_CONTROLLER_BT) && rd[0] == 0x01 && size == 49) {
1280 sixaxis_parse_report(sc, rd, size);
1281 } else if ((sc->quirks & NAVIGATION_CONTROLLER) && rd[0] == 0x01 &&
1282 size == 49) {
1283 sixaxis_parse_report(sc, rd, size);
1284 } else if (((sc->quirks & DUALSHOCK4_CONTROLLER_USB) && rd[0] == 0x01 &&
1285 size == 64) || ((sc->quirks & DUALSHOCK4_CONTROLLER_BT)
1286 && rd[0] == 0x11 && size == 78)) {
1287 dualshock4_parse_report(sc, rd, size);
1288 }
1289
1290 return 0;
1291 }
1292
1293 static int sony_mapping(struct hid_device *hdev, struct hid_input *hi,
1294 struct hid_field *field, struct hid_usage *usage,
1295 unsigned long **bit, int *max)
1296 {
1297 struct sony_sc *sc = hid_get_drvdata(hdev);
1298
1299 if (sc->quirks & BUZZ_CONTROLLER) {
1300 unsigned int key = usage->hid & HID_USAGE;
1301
1302 if ((usage->hid & HID_USAGE_PAGE) != HID_UP_BUTTON)
1303 return -1;
1304
1305 switch (usage->collection_index) {
1306 case 1:
1307 if (key >= ARRAY_SIZE(buzz_keymap))
1308 return -1;
1309
1310 key = buzz_keymap[key];
1311 if (!key)
1312 return -1;
1313 break;
1314 default:
1315 return -1;
1316 }
1317
1318 hid_map_usage_clear(hi, usage, bit, max, EV_KEY, key);
1319 return 1;
1320 }
1321
1322 if (sc->quirks & PS3REMOTE)
1323 return ps3remote_mapping(hdev, hi, field, usage, bit, max);
1324
1325 /* Let hid-core decide for the others */
1326 return 0;
1327 }
1328
1329 static int sony_register_touchpad(struct hid_input *hi, int touch_count,
1330 int w, int h)
1331 {
1332 struct input_dev *input_dev = hi->input;
1333 int ret;
1334
1335 ret = input_mt_init_slots(input_dev, touch_count, 0);
1336 if (ret < 0)
1337 return ret;
1338
1339 input_set_abs_params(input_dev, ABS_MT_POSITION_X, 0, w, 0, 0);
1340 input_set_abs_params(input_dev, ABS_MT_POSITION_Y, 0, h, 0, 0);
1341
1342 return 0;
1343 }
1344
1345 static void sony_input_configured(struct hid_device *hdev,
1346 struct hid_input *hidinput)
1347 {
1348 struct sony_sc *sc = hid_get_drvdata(hdev);
1349
1350 /*
1351 * The Dualshock 4 touchpad supports 2 touches and has a
1352 * resolution of 1920x942 (44.86 dots/mm).
1353 */
1354 if (sc->quirks & DUALSHOCK4_CONTROLLER) {
1355 if (sony_register_touchpad(hidinput, 2, 1920, 942) != 0)
1356 hid_err(sc->hdev,
1357 "Unable to initialize multi-touch slots\n");
1358 }
1359 }
1360
1361 /*
1362 * Sending HID_REQ_GET_REPORT changes the operation mode of the ps3 controller
1363 * to "operational". Without this, the ps3 controller will not report any
1364 * events.
1365 */
1366 static int sixaxis_set_operational_usb(struct hid_device *hdev)
1367 {
1368 const int buf_size =
1369 max(SIXAXIS_REPORT_0xF2_SIZE, SIXAXIS_REPORT_0xF5_SIZE);
1370 __u8 *buf;
1371 int ret;
1372
1373 buf = kmalloc(buf_size, GFP_KERNEL);
1374 if (!buf)
1375 return -ENOMEM;
1376
1377 ret = hid_hw_raw_request(hdev, 0xf2, buf, SIXAXIS_REPORT_0xF2_SIZE,
1378 HID_FEATURE_REPORT, HID_REQ_GET_REPORT);
1379 if (ret < 0) {
1380 hid_err(hdev, "can't set operational mode: step 1\n");
1381 goto out;
1382 }
1383
1384 /*
1385 * Some compatible controllers like the Speedlink Strike FX and
1386 * Gasia need another query plus an USB interrupt to get operational.
1387 */
1388 ret = hid_hw_raw_request(hdev, 0xf5, buf, SIXAXIS_REPORT_0xF5_SIZE,
1389 HID_FEATURE_REPORT, HID_REQ_GET_REPORT);
1390 if (ret < 0) {
1391 hid_err(hdev, "can't set operational mode: step 2\n");
1392 goto out;
1393 }
1394
1395 ret = hid_hw_output_report(hdev, buf, 1);
1396 if (ret < 0)
1397 hid_err(hdev, "can't set operational mode: step 3\n");
1398
1399 out:
1400 kfree(buf);
1401
1402 return ret;
1403 }
1404
1405 static int sixaxis_set_operational_bt(struct hid_device *hdev)
1406 {
1407 static const __u8 report[] = { 0xf4, 0x42, 0x03, 0x00, 0x00 };
1408 __u8 *buf;
1409 int ret;
1410
1411 buf = kmemdup(report, sizeof(report), GFP_KERNEL);
1412 if (!buf)
1413 return -ENOMEM;
1414
1415 ret = hid_hw_raw_request(hdev, buf[0], buf, sizeof(report),
1416 HID_FEATURE_REPORT, HID_REQ_SET_REPORT);
1417
1418 kfree(buf);
1419
1420 return ret;
1421 }
1422
1423 /*
1424 * Requesting feature report 0x02 in Bluetooth mode changes the state of the
1425 * controller so that it sends full input reports of type 0x11.
1426 */
1427 static int dualshock4_set_operational_bt(struct hid_device *hdev)
1428 {
1429 __u8 *buf;
1430 int ret;
1431
1432 buf = kmalloc(DS4_REPORT_0x02_SIZE, GFP_KERNEL);
1433 if (!buf)
1434 return -ENOMEM;
1435
1436 ret = hid_hw_raw_request(hdev, 0x02, buf, DS4_REPORT_0x02_SIZE,
1437 HID_FEATURE_REPORT, HID_REQ_GET_REPORT);
1438
1439 kfree(buf);
1440
1441 return ret;
1442 }
1443
1444 static void sixaxis_set_leds_from_id(struct sony_sc *sc)
1445 {
1446 static const __u8 sixaxis_leds[10][4] = {
1447 { 0x01, 0x00, 0x00, 0x00 },
1448 { 0x00, 0x01, 0x00, 0x00 },
1449 { 0x00, 0x00, 0x01, 0x00 },
1450 { 0x00, 0x00, 0x00, 0x01 },
1451 { 0x01, 0x00, 0x00, 0x01 },
1452 { 0x00, 0x01, 0x00, 0x01 },
1453 { 0x00, 0x00, 0x01, 0x01 },
1454 { 0x01, 0x00, 0x01, 0x01 },
1455 { 0x00, 0x01, 0x01, 0x01 },
1456 { 0x01, 0x01, 0x01, 0x01 }
1457 };
1458
1459 int id = sc->device_id;
1460
1461 BUILD_BUG_ON(MAX_LEDS < ARRAY_SIZE(sixaxis_leds[0]));
1462
1463 if (id < 0)
1464 return;
1465
1466 id %= 10;
1467 memcpy(sc->led_state, sixaxis_leds[id], sizeof(sixaxis_leds[id]));
1468 }
1469
1470 static void dualshock4_set_leds_from_id(struct sony_sc *sc)
1471 {
1472 /* The first 4 color/index entries match what the PS4 assigns */
1473 static const __u8 color_code[7][3] = {
1474 /* Blue */ { 0x00, 0x00, 0x01 },
1475 /* Red */ { 0x01, 0x00, 0x00 },
1476 /* Green */ { 0x00, 0x01, 0x00 },
1477 /* Pink */ { 0x02, 0x00, 0x01 },
1478 /* Orange */ { 0x02, 0x01, 0x00 },
1479 /* Teal */ { 0x00, 0x01, 0x01 },
1480 /* White */ { 0x01, 0x01, 0x01 }
1481 };
1482
1483 int id = sc->device_id;
1484
1485 BUILD_BUG_ON(MAX_LEDS < ARRAY_SIZE(color_code[0]));
1486
1487 if (id < 0)
1488 return;
1489
1490 id %= 7;
1491 memcpy(sc->led_state, color_code[id], sizeof(color_code[id]));
1492 }
1493
1494 static void buzz_set_leds(struct sony_sc *sc)
1495 {
1496 struct hid_device *hdev = sc->hdev;
1497 struct list_head *report_list =
1498 &hdev->report_enum[HID_OUTPUT_REPORT].report_list;
1499 struct hid_report *report = list_entry(report_list->next,
1500 struct hid_report, list);
1501 __s32 *value = report->field[0]->value;
1502
1503 BUILD_BUG_ON(MAX_LEDS < 4);
1504
1505 value[0] = 0x00;
1506 value[1] = sc->led_state[0] ? 0xff : 0x00;
1507 value[2] = sc->led_state[1] ? 0xff : 0x00;
1508 value[3] = sc->led_state[2] ? 0xff : 0x00;
1509 value[4] = sc->led_state[3] ? 0xff : 0x00;
1510 value[5] = 0x00;
1511 value[6] = 0x00;
1512 hid_hw_request(hdev, report, HID_REQ_SET_REPORT);
1513 }
1514
1515 static void sony_set_leds(struct sony_sc *sc)
1516 {
1517 if (!(sc->quirks & BUZZ_CONTROLLER))
1518 schedule_work(&sc->state_worker);
1519 else
1520 buzz_set_leds(sc);
1521 }
1522
1523 static void sony_led_set_brightness(struct led_classdev *led,
1524 enum led_brightness value)
1525 {
1526 struct device *dev = led->dev->parent;
1527 struct hid_device *hdev = container_of(dev, struct hid_device, dev);
1528 struct sony_sc *drv_data;
1529
1530 int n;
1531 int force_update;
1532
1533 drv_data = hid_get_drvdata(hdev);
1534 if (!drv_data) {
1535 hid_err(hdev, "No device data\n");
1536 return;
1537 }
1538
1539 /*
1540 * The Sixaxis on USB will override any LED settings sent to it
1541 * and keep flashing all of the LEDs until the PS button is pressed.
1542 * Updates, even if redundant, must be always be sent to the
1543 * controller to avoid having to toggle the state of an LED just to
1544 * stop the flashing later on.
1545 */
1546 force_update = !!(drv_data->quirks & SIXAXIS_CONTROLLER_USB);
1547
1548 for (n = 0; n < drv_data->led_count; n++) {
1549 if (led == drv_data->leds[n] && (force_update ||
1550 (value != drv_data->led_state[n] ||
1551 drv_data->led_delay_on[n] ||
1552 drv_data->led_delay_off[n]))) {
1553
1554 drv_data->led_state[n] = value;
1555
1556 /* Setting the brightness stops the blinking */
1557 drv_data->led_delay_on[n] = 0;
1558 drv_data->led_delay_off[n] = 0;
1559
1560 sony_set_leds(drv_data);
1561 break;
1562 }
1563 }
1564 }
1565
1566 static enum led_brightness sony_led_get_brightness(struct led_classdev *led)
1567 {
1568 struct device *dev = led->dev->parent;
1569 struct hid_device *hdev = container_of(dev, struct hid_device, dev);
1570 struct sony_sc *drv_data;
1571
1572 int n;
1573
1574 drv_data = hid_get_drvdata(hdev);
1575 if (!drv_data) {
1576 hid_err(hdev, "No device data\n");
1577 return LED_OFF;
1578 }
1579
1580 for (n = 0; n < drv_data->led_count; n++) {
1581 if (led == drv_data->leds[n])
1582 return drv_data->led_state[n];
1583 }
1584
1585 return LED_OFF;
1586 }
1587
1588 static int sony_led_blink_set(struct led_classdev *led, unsigned long *delay_on,
1589 unsigned long *delay_off)
1590 {
1591 struct device *dev = led->dev->parent;
1592 struct hid_device *hdev = container_of(dev, struct hid_device, dev);
1593 struct sony_sc *drv_data = hid_get_drvdata(hdev);
1594 int n;
1595 __u8 new_on, new_off;
1596
1597 if (!drv_data) {
1598 hid_err(hdev, "No device data\n");
1599 return -EINVAL;
1600 }
1601
1602 /* Max delay is 255 deciseconds or 2550 milliseconds */
1603 if (*delay_on > 2550)
1604 *delay_on = 2550;
1605 if (*delay_off > 2550)
1606 *delay_off = 2550;
1607
1608 /* Blink at 1 Hz if both values are zero */
1609 if (!*delay_on && !*delay_off)
1610 *delay_on = *delay_off = 500;
1611
1612 new_on = *delay_on / 10;
1613 new_off = *delay_off / 10;
1614
1615 for (n = 0; n < drv_data->led_count; n++) {
1616 if (led == drv_data->leds[n])
1617 break;
1618 }
1619
1620 /* This LED is not registered on this device */
1621 if (n >= drv_data->led_count)
1622 return -EINVAL;
1623
1624 /* Don't schedule work if the values didn't change */
1625 if (new_on != drv_data->led_delay_on[n] ||
1626 new_off != drv_data->led_delay_off[n]) {
1627 drv_data->led_delay_on[n] = new_on;
1628 drv_data->led_delay_off[n] = new_off;
1629 schedule_work(&drv_data->state_worker);
1630 }
1631
1632 return 0;
1633 }
1634
1635 static void sony_leds_remove(struct sony_sc *sc)
1636 {
1637 struct led_classdev *led;
1638 int n;
1639
1640 BUG_ON(!(sc->quirks & SONY_LED_SUPPORT));
1641
1642 for (n = 0; n < sc->led_count; n++) {
1643 led = sc->leds[n];
1644 sc->leds[n] = NULL;
1645 if (!led)
1646 continue;
1647 led_classdev_unregister(led);
1648 kfree(led);
1649 }
1650
1651 sc->led_count = 0;
1652 }
1653
1654 static int sony_leds_init(struct sony_sc *sc)
1655 {
1656 struct hid_device *hdev = sc->hdev;
1657 int n, ret = 0;
1658 int use_ds4_names;
1659 struct led_classdev *led;
1660 size_t name_sz;
1661 char *name;
1662 size_t name_len;
1663 const char *name_fmt;
1664 static const char * const ds4_name_str[] = { "red", "green", "blue",
1665 "global" };
1666 __u8 max_brightness[MAX_LEDS] = { [0 ... (MAX_LEDS - 1)] = 1 };
1667 __u8 use_hw_blink[MAX_LEDS] = { 0 };
1668
1669 BUG_ON(!(sc->quirks & SONY_LED_SUPPORT));
1670
1671 if (sc->quirks & BUZZ_CONTROLLER) {
1672 sc->led_count = 4;
1673 use_ds4_names = 0;
1674 name_len = strlen("::buzz#");
1675 name_fmt = "%s::buzz%d";
1676 /* Validate expected report characteristics. */
1677 if (!hid_validate_values(hdev, HID_OUTPUT_REPORT, 0, 0, 7))
1678 return -ENODEV;
1679 } else if (sc->quirks & DUALSHOCK4_CONTROLLER) {
1680 dualshock4_set_leds_from_id(sc);
1681 sc->led_state[3] = 1;
1682 sc->led_count = 4;
1683 memset(max_brightness, 255, 3);
1684 use_hw_blink[3] = 1;
1685 use_ds4_names = 1;
1686 name_len = 0;
1687 name_fmt = "%s:%s";
1688 } else if (sc->quirks & MOTION_CONTROLLER) {
1689 sc->led_count = 3;
1690 memset(max_brightness, 255, 3);
1691 use_ds4_names = 1;
1692 name_len = 0;
1693 name_fmt = "%s:%s";
1694 } else if (sc->quirks & NAVIGATION_CONTROLLER) {
1695 static const __u8 navigation_leds[4] = {0x01, 0x00, 0x00, 0x00};
1696
1697 memcpy(sc->led_state, navigation_leds, sizeof(navigation_leds));
1698 sc->led_count = 1;
1699 memset(use_hw_blink, 1, 4);
1700 use_ds4_names = 0;
1701 name_len = strlen("::sony#");
1702 name_fmt = "%s::sony%d";
1703 } else {
1704 sixaxis_set_leds_from_id(sc);
1705 sc->led_count = 4;
1706 memset(use_hw_blink, 1, 4);
1707 use_ds4_names = 0;
1708 name_len = strlen("::sony#");
1709 name_fmt = "%s::sony%d";
1710 }
1711
1712 /*
1713 * Clear LEDs as we have no way of reading their initial state. This is
1714 * only relevant if the driver is loaded after somebody actively set the
1715 * LEDs to on
1716 */
1717 sony_set_leds(sc);
1718
1719 name_sz = strlen(dev_name(&hdev->dev)) + name_len + 1;
1720
1721 for (n = 0; n < sc->led_count; n++) {
1722
1723 if (use_ds4_names)
1724 name_sz = strlen(dev_name(&hdev->dev)) + strlen(ds4_name_str[n]) + 2;
1725
1726 led = kzalloc(sizeof(struct led_classdev) + name_sz, GFP_KERNEL);
1727 if (!led) {
1728 hid_err(hdev, "Couldn't allocate memory for LED %d\n", n);
1729 ret = -ENOMEM;
1730 goto error_leds;
1731 }
1732
1733 name = (void *)(&led[1]);
1734 if (use_ds4_names)
1735 snprintf(name, name_sz, name_fmt, dev_name(&hdev->dev),
1736 ds4_name_str[n]);
1737 else
1738 snprintf(name, name_sz, name_fmt, dev_name(&hdev->dev), n + 1);
1739 led->name = name;
1740 led->brightness = sc->led_state[n];
1741 led->max_brightness = max_brightness[n];
1742 led->brightness_get = sony_led_get_brightness;
1743 led->brightness_set = sony_led_set_brightness;
1744
1745 if (use_hw_blink[n])
1746 led->blink_set = sony_led_blink_set;
1747
1748 sc->leds[n] = led;
1749
1750 ret = led_classdev_register(&hdev->dev, led);
1751 if (ret) {
1752 hid_err(hdev, "Failed to register LED %d\n", n);
1753 sc->leds[n] = NULL;
1754 kfree(led);
1755 goto error_leds;
1756 }
1757 }
1758
1759 return ret;
1760
1761 error_leds:
1762 sony_leds_remove(sc);
1763
1764 return ret;
1765 }
1766
1767 static void sixaxis_state_worker(struct work_struct *work)
1768 {
1769 static const union sixaxis_output_report_01 default_report = {
1770 .buf = {
1771 0x01,
1772 0x00, 0xff, 0x00, 0xff, 0x00,
1773 0x00, 0x00, 0x00, 0x00, 0x00,
1774 0xff, 0x27, 0x10, 0x00, 0x32,
1775 0xff, 0x27, 0x10, 0x00, 0x32,
1776 0xff, 0x27, 0x10, 0x00, 0x32,
1777 0xff, 0x27, 0x10, 0x00, 0x32,
1778 0x00, 0x00, 0x00, 0x00, 0x00
1779 }
1780 };
1781 struct sony_sc *sc = container_of(work, struct sony_sc, state_worker);
1782 struct sixaxis_output_report *report =
1783 (struct sixaxis_output_report *)sc->output_report_dmabuf;
1784 int n;
1785
1786 /* Initialize the report with default values */
1787 memcpy(report, &default_report, sizeof(struct sixaxis_output_report));
1788
1789 #ifdef CONFIG_SONY_FF
1790 report->rumble.right_motor_on = sc->right ? 1 : 0;
1791 report->rumble.left_motor_force = sc->left;
1792 #endif
1793
1794 report->leds_bitmap |= sc->led_state[0] << 1;
1795 report->leds_bitmap |= sc->led_state[1] << 2;
1796 report->leds_bitmap |= sc->led_state[2] << 3;
1797 report->leds_bitmap |= sc->led_state[3] << 4;
1798
1799 /* Set flag for all leds off, required for 3rd party INTEC controller */
1800 if ((report->leds_bitmap & 0x1E) == 0)
1801 report->leds_bitmap |= 0x20;
1802
1803 /*
1804 * The LEDs in the report are indexed in reverse order to their
1805 * corresponding light on the controller.
1806 * Index 0 = LED 4, index 1 = LED 3, etc...
1807 *
1808 * In the case of both delay values being zero (blinking disabled) the
1809 * default report values should be used or the controller LED will be
1810 * always off.
1811 */
1812 for (n = 0; n < 4; n++) {
1813 if (sc->led_delay_on[n] || sc->led_delay_off[n]) {
1814 report->led[3 - n].duty_off = sc->led_delay_off[n];
1815 report->led[3 - n].duty_on = sc->led_delay_on[n];
1816 }
1817 }
1818
1819 hid_hw_raw_request(sc->hdev, report->report_id, (__u8 *)report,
1820 sizeof(struct sixaxis_output_report),
1821 HID_OUTPUT_REPORT, HID_REQ_SET_REPORT);
1822 }
1823
1824 static void dualshock4_state_worker(struct work_struct *work)
1825 {
1826 struct sony_sc *sc = container_of(work, struct sony_sc, state_worker);
1827 struct hid_device *hdev = sc->hdev;
1828 __u8 *buf = sc->output_report_dmabuf;
1829 int offset;
1830
1831 if (sc->quirks & DUALSHOCK4_CONTROLLER_USB) {
1832 memset(buf, 0, DS4_REPORT_0x05_SIZE);
1833 buf[0] = 0x05;
1834 buf[1] = 0xFF;
1835 offset = 4;
1836 } else {
1837 memset(buf, 0, DS4_REPORT_0x11_SIZE);
1838 buf[0] = 0x11;
1839 buf[1] = 0xB0;
1840 buf[3] = 0x0F;
1841 offset = 6;
1842 }
1843
1844 #ifdef CONFIG_SONY_FF
1845 buf[offset++] = sc->right;
1846 buf[offset++] = sc->left;
1847 #else
1848 offset += 2;
1849 #endif
1850
1851 /* LED 3 is the global control */
1852 if (sc->led_state[3]) {
1853 buf[offset++] = sc->led_state[0];
1854 buf[offset++] = sc->led_state[1];
1855 buf[offset++] = sc->led_state[2];
1856 } else {
1857 offset += 3;
1858 }
1859
1860 /* If both delay values are zero the DualShock 4 disables blinking. */
1861 buf[offset++] = sc->led_delay_on[3];
1862 buf[offset++] = sc->led_delay_off[3];
1863
1864 if (sc->quirks & DUALSHOCK4_CONTROLLER_USB)
1865 hid_hw_output_report(hdev, buf, DS4_REPORT_0x05_SIZE);
1866 else
1867 hid_hw_raw_request(hdev, 0x11, buf, DS4_REPORT_0x11_SIZE,
1868 HID_OUTPUT_REPORT, HID_REQ_SET_REPORT);
1869 }
1870
1871 static void motion_state_worker(struct work_struct *work)
1872 {
1873 struct sony_sc *sc = container_of(work, struct sony_sc, state_worker);
1874 struct hid_device *hdev = sc->hdev;
1875 struct motion_output_report_02 *report =
1876 (struct motion_output_report_02 *)sc->output_report_dmabuf;
1877
1878 memset(report, 0, MOTION_REPORT_0x02_SIZE);
1879
1880 report->type = 0x02; /* set leds */
1881 report->r = sc->led_state[0];
1882 report->g = sc->led_state[1];
1883 report->b = sc->led_state[2];
1884
1885 #ifdef CONFIG_SONY_FF
1886 report->rumble = max(sc->right, sc->left);
1887 #endif
1888
1889 hid_hw_output_report(hdev, (__u8 *)report, MOTION_REPORT_0x02_SIZE);
1890 }
1891
1892 static int sony_allocate_output_report(struct sony_sc *sc)
1893 {
1894 if ((sc->quirks & SIXAXIS_CONTROLLER) ||
1895 (sc->quirks & NAVIGATION_CONTROLLER))
1896 sc->output_report_dmabuf =
1897 kmalloc(sizeof(union sixaxis_output_report_01),
1898 GFP_KERNEL);
1899 else if (sc->quirks & DUALSHOCK4_CONTROLLER_BT)
1900 sc->output_report_dmabuf = kmalloc(DS4_REPORT_0x11_SIZE,
1901 GFP_KERNEL);
1902 else if (sc->quirks & DUALSHOCK4_CONTROLLER_USB)
1903 sc->output_report_dmabuf = kmalloc(DS4_REPORT_0x05_SIZE,
1904 GFP_KERNEL);
1905 else if (sc->quirks & MOTION_CONTROLLER)
1906 sc->output_report_dmabuf = kmalloc(MOTION_REPORT_0x02_SIZE,
1907 GFP_KERNEL);
1908 else
1909 return 0;
1910
1911 if (!sc->output_report_dmabuf)
1912 return -ENOMEM;
1913
1914 return 0;
1915 }
1916
1917 #ifdef CONFIG_SONY_FF
1918 static int sony_play_effect(struct input_dev *dev, void *data,
1919 struct ff_effect *effect)
1920 {
1921 struct hid_device *hid = input_get_drvdata(dev);
1922 struct sony_sc *sc = hid_get_drvdata(hid);
1923
1924 if (effect->type != FF_RUMBLE)
1925 return 0;
1926
1927 sc->left = effect->u.rumble.strong_magnitude / 256;
1928 sc->right = effect->u.rumble.weak_magnitude / 256;
1929
1930 schedule_work(&sc->state_worker);
1931 return 0;
1932 }
1933
1934 static int sony_init_ff(struct sony_sc *sc)
1935 {
1936 struct hid_input *hidinput = list_entry(sc->hdev->inputs.next,
1937 struct hid_input, list);
1938 struct input_dev *input_dev = hidinput->input;
1939
1940 input_set_capability(input_dev, EV_FF, FF_RUMBLE);
1941 return input_ff_create_memless(input_dev, NULL, sony_play_effect);
1942 }
1943
1944 #else
1945 static int sony_init_ff(struct sony_sc *sc)
1946 {
1947 return 0;
1948 }
1949
1950 #endif
1951
1952 static int sony_battery_get_property(struct power_supply *psy,
1953 enum power_supply_property psp,
1954 union power_supply_propval *val)
1955 {
1956 struct sony_sc *sc = power_supply_get_drvdata(psy);
1957 unsigned long flags;
1958 int ret = 0;
1959 u8 battery_charging, battery_capacity, cable_state;
1960
1961 spin_lock_irqsave(&sc->lock, flags);
1962 battery_charging = sc->battery_charging;
1963 battery_capacity = sc->battery_capacity;
1964 cable_state = sc->cable_state;
1965 spin_unlock_irqrestore(&sc->lock, flags);
1966
1967 switch (psp) {
1968 case POWER_SUPPLY_PROP_PRESENT:
1969 val->intval = 1;
1970 break;
1971 case POWER_SUPPLY_PROP_SCOPE:
1972 val->intval = POWER_SUPPLY_SCOPE_DEVICE;
1973 break;
1974 case POWER_SUPPLY_PROP_CAPACITY:
1975 val->intval = battery_capacity;
1976 break;
1977 case POWER_SUPPLY_PROP_STATUS:
1978 if (battery_charging)
1979 val->intval = POWER_SUPPLY_STATUS_CHARGING;
1980 else
1981 if (battery_capacity == 100 && cable_state)
1982 val->intval = POWER_SUPPLY_STATUS_FULL;
1983 else
1984 val->intval = POWER_SUPPLY_STATUS_DISCHARGING;
1985 break;
1986 default:
1987 ret = -EINVAL;
1988 break;
1989 }
1990 return ret;
1991 }
1992
1993 static int sony_battery_probe(struct sony_sc *sc)
1994 {
1995 struct power_supply_config psy_cfg = { .drv_data = sc, };
1996 struct hid_device *hdev = sc->hdev;
1997 int ret;
1998
1999 /*
2000 * Set the default battery level to 100% to avoid low battery warnings
2001 * if the battery is polled before the first device report is received.
2002 */
2003 sc->battery_capacity = 100;
2004
2005 sc->battery_desc.properties = sony_battery_props;
2006 sc->battery_desc.num_properties = ARRAY_SIZE(sony_battery_props);
2007 sc->battery_desc.get_property = sony_battery_get_property;
2008 sc->battery_desc.type = POWER_SUPPLY_TYPE_BATTERY;
2009 sc->battery_desc.use_for_apm = 0;
2010 sc->battery_desc.name = kasprintf(GFP_KERNEL,
2011 "sony_controller_battery_%pMR",
2012 sc->mac_address);
2013 if (!sc->battery_desc.name)
2014 return -ENOMEM;
2015
2016 sc->battery = power_supply_register(&hdev->dev, &sc->battery_desc,
2017 &psy_cfg);
2018 if (IS_ERR(sc->battery)) {
2019 ret = PTR_ERR(sc->battery);
2020 hid_err(hdev, "Unable to register battery device\n");
2021 goto err_free;
2022 }
2023
2024 power_supply_powers(sc->battery, &hdev->dev);
2025 return 0;
2026
2027 err_free:
2028 kfree(sc->battery_desc.name);
2029 sc->battery_desc.name = NULL;
2030 return ret;
2031 }
2032
2033 static void sony_battery_remove(struct sony_sc *sc)
2034 {
2035 if (!sc->battery_desc.name)
2036 return;
2037
2038 power_supply_unregister(sc->battery);
2039 kfree(sc->battery_desc.name);
2040 sc->battery_desc.name = NULL;
2041 }
2042
2043 /*
2044 * If a controller is plugged in via USB while already connected via Bluetooth
2045 * it will show up as two devices. A global list of connected controllers and
2046 * their MAC addresses is maintained to ensure that a device is only connected
2047 * once.
2048 */
2049 static int sony_check_add_dev_list(struct sony_sc *sc)
2050 {
2051 struct sony_sc *entry;
2052 unsigned long flags;
2053 int ret;
2054
2055 spin_lock_irqsave(&sony_dev_list_lock, flags);
2056
2057 list_for_each_entry(entry, &sony_device_list, list_node) {
2058 ret = memcmp(sc->mac_address, entry->mac_address,
2059 sizeof(sc->mac_address));
2060 if (!ret) {
2061 ret = -EEXIST;
2062 hid_info(sc->hdev, "controller with MAC address %pMR already connected\n",
2063 sc->mac_address);
2064 goto unlock;
2065 }
2066 }
2067
2068 ret = 0;
2069 list_add(&(sc->list_node), &sony_device_list);
2070
2071 unlock:
2072 spin_unlock_irqrestore(&sony_dev_list_lock, flags);
2073 return ret;
2074 }
2075
2076 static void sony_remove_dev_list(struct sony_sc *sc)
2077 {
2078 unsigned long flags;
2079
2080 if (sc->list_node.next) {
2081 spin_lock_irqsave(&sony_dev_list_lock, flags);
2082 list_del(&(sc->list_node));
2083 spin_unlock_irqrestore(&sony_dev_list_lock, flags);
2084 }
2085 }
2086
2087 static int sony_get_bt_devaddr(struct sony_sc *sc)
2088 {
2089 int ret;
2090
2091 /* HIDP stores the device MAC address as a string in the uniq field. */
2092 ret = strlen(sc->hdev->uniq);
2093 if (ret != 17)
2094 return -EINVAL;
2095
2096 ret = sscanf(sc->hdev->uniq,
2097 "%02hhx:%02hhx:%02hhx:%02hhx:%02hhx:%02hhx",
2098 &sc->mac_address[5], &sc->mac_address[4], &sc->mac_address[3],
2099 &sc->mac_address[2], &sc->mac_address[1], &sc->mac_address[0]);
2100
2101 if (ret != 6)
2102 return -EINVAL;
2103
2104 return 0;
2105 }
2106
2107 static int sony_check_add(struct sony_sc *sc)
2108 {
2109 __u8 *buf = NULL;
2110 int n, ret;
2111
2112 if ((sc->quirks & DUALSHOCK4_CONTROLLER_BT) ||
2113 (sc->quirks & MOTION_CONTROLLER_BT) ||
2114 (sc->quirks & NAVIGATION_CONTROLLER_BT) ||
2115 (sc->quirks & SIXAXIS_CONTROLLER_BT)) {
2116 /*
2117 * sony_get_bt_devaddr() attempts to parse the Bluetooth MAC
2118 * address from the uniq string where HIDP stores it.
2119 * As uniq cannot be guaranteed to be a MAC address in all cases
2120 * a failure of this function should not prevent the connection.
2121 */
2122 if (sony_get_bt_devaddr(sc) < 0) {
2123 hid_warn(sc->hdev, "UNIQ does not contain a MAC address; duplicate check skipped\n");
2124 return 0;
2125 }
2126 } else if (sc->quirks & DUALSHOCK4_CONTROLLER_USB) {
2127 buf = kmalloc(DS4_REPORT_0x81_SIZE, GFP_KERNEL);
2128 if (!buf)
2129 return -ENOMEM;
2130
2131 /*
2132 * The MAC address of a DS4 controller connected via USB can be
2133 * retrieved with feature report 0x81. The address begins at
2134 * offset 1.
2135 */
2136 ret = hid_hw_raw_request(sc->hdev, 0x81, buf,
2137 DS4_REPORT_0x81_SIZE, HID_FEATURE_REPORT,
2138 HID_REQ_GET_REPORT);
2139
2140 if (ret != DS4_REPORT_0x81_SIZE) {
2141 hid_err(sc->hdev, "failed to retrieve feature report 0x81 with the DualShock 4 MAC address\n");
2142 ret = ret < 0 ? ret : -EINVAL;
2143 goto out_free;
2144 }
2145
2146 memcpy(sc->mac_address, &buf[1], sizeof(sc->mac_address));
2147 } else if ((sc->quirks & SIXAXIS_CONTROLLER_USB) ||
2148 (sc->quirks & NAVIGATION_CONTROLLER_USB)) {
2149 buf = kmalloc(SIXAXIS_REPORT_0xF2_SIZE, GFP_KERNEL);
2150 if (!buf)
2151 return -ENOMEM;
2152
2153 /*
2154 * The MAC address of a Sixaxis controller connected via USB can
2155 * be retrieved with feature report 0xf2. The address begins at
2156 * offset 4.
2157 */
2158 ret = hid_hw_raw_request(sc->hdev, 0xf2, buf,
2159 SIXAXIS_REPORT_0xF2_SIZE, HID_FEATURE_REPORT,
2160 HID_REQ_GET_REPORT);
2161
2162 if (ret != SIXAXIS_REPORT_0xF2_SIZE) {
2163 hid_err(sc->hdev, "failed to retrieve feature report 0xf2 with the Sixaxis MAC address\n");
2164 ret = ret < 0 ? ret : -EINVAL;
2165 goto out_free;
2166 }
2167
2168 /*
2169 * The Sixaxis device MAC in the report is big-endian and must
2170 * be byte-swapped.
2171 */
2172 for (n = 0; n < 6; n++)
2173 sc->mac_address[5-n] = buf[4+n];
2174 } else {
2175 return 0;
2176 }
2177
2178 ret = sony_check_add_dev_list(sc);
2179
2180 out_free:
2181
2182 kfree(buf);
2183
2184 return ret;
2185 }
2186
2187 static int sony_set_device_id(struct sony_sc *sc)
2188 {
2189 int ret;
2190
2191 /*
2192 * Only DualShock 4 or Sixaxis controllers get an id.
2193 * All others are set to -1.
2194 */
2195 if ((sc->quirks & SIXAXIS_CONTROLLER) ||
2196 (sc->quirks & DUALSHOCK4_CONTROLLER)) {
2197 ret = ida_simple_get(&sony_device_id_allocator, 0, 0,
2198 GFP_KERNEL);
2199 if (ret < 0) {
2200 sc->device_id = -1;
2201 return ret;
2202 }
2203 sc->device_id = ret;
2204 } else {
2205 sc->device_id = -1;
2206 }
2207
2208 return 0;
2209 }
2210
2211 static void sony_release_device_id(struct sony_sc *sc)
2212 {
2213 if (sc->device_id >= 0) {
2214 ida_simple_remove(&sony_device_id_allocator, sc->device_id);
2215 sc->device_id = -1;
2216 }
2217 }
2218
2219 static inline void sony_init_work(struct sony_sc *sc,
2220 void (*worker)(struct work_struct *))
2221 {
2222 if (!sc->worker_initialized)
2223 INIT_WORK(&sc->state_worker, worker);
2224
2225 sc->worker_initialized = 1;
2226 }
2227
2228 static inline void sony_cancel_work_sync(struct sony_sc *sc)
2229 {
2230 if (sc->worker_initialized)
2231 cancel_work_sync(&sc->state_worker);
2232 }
2233
2234 static int sony_probe(struct hid_device *hdev, const struct hid_device_id *id)
2235 {
2236 int ret;
2237 unsigned long quirks = id->driver_data;
2238 struct sony_sc *sc;
2239 unsigned int connect_mask = HID_CONNECT_DEFAULT;
2240
2241 sc = devm_kzalloc(&hdev->dev, sizeof(*sc), GFP_KERNEL);
2242 if (sc == NULL) {
2243 hid_err(hdev, "can't alloc sony descriptor\n");
2244 return -ENOMEM;
2245 }
2246
2247 spin_lock_init(&sc->lock);
2248
2249 sc->quirks = quirks;
2250 hid_set_drvdata(hdev, sc);
2251 sc->hdev = hdev;
2252
2253 ret = hid_parse(hdev);
2254 if (ret) {
2255 hid_err(hdev, "parse failed\n");
2256 return ret;
2257 }
2258
2259 if (sc->quirks & VAIO_RDESC_CONSTANT)
2260 connect_mask |= HID_CONNECT_HIDDEV_FORCE;
2261 else if (sc->quirks & SIXAXIS_CONTROLLER)
2262 connect_mask |= HID_CONNECT_HIDDEV_FORCE;
2263
2264 ret = hid_hw_start(hdev, connect_mask);
2265 if (ret) {
2266 hid_err(hdev, "hw start failed\n");
2267 return ret;
2268 }
2269
2270 ret = sony_set_device_id(sc);
2271 if (ret < 0) {
2272 hid_err(hdev, "failed to allocate the device id\n");
2273 goto err_stop;
2274 }
2275
2276 ret = sony_allocate_output_report(sc);
2277 if (ret < 0) {
2278 hid_err(hdev, "failed to allocate the output report buffer\n");
2279 goto err_stop;
2280 }
2281
2282 if ((sc->quirks & SIXAXIS_CONTROLLER_USB) ||
2283 (sc->quirks & NAVIGATION_CONTROLLER_USB)) {
2284 /*
2285 * The Sony Sixaxis does not handle HID Output Reports on the
2286 * Interrupt EP like it could, so we need to force HID Output
2287 * Reports to use HID_REQ_SET_REPORT on the Control EP.
2288 *
2289 * There is also another issue about HID Output Reports via USB,
2290 * the Sixaxis does not want the report_id as part of the data
2291 * packet, so we have to discard buf[0] when sending the actual
2292 * control message, even for numbered reports, humpf!
2293 */
2294 hdev->quirks |= HID_QUIRK_NO_OUTPUT_REPORTS_ON_INTR_EP;
2295 hdev->quirks |= HID_QUIRK_SKIP_OUTPUT_REPORT_ID;
2296 ret = sixaxis_set_operational_usb(hdev);
2297 sony_init_work(sc, sixaxis_state_worker);
2298 } else if ((sc->quirks & SIXAXIS_CONTROLLER_BT) ||
2299 (sc->quirks & NAVIGATION_CONTROLLER_BT)) {
2300 /*
2301 * The Sixaxis wants output reports sent on the ctrl endpoint
2302 * when connected via Bluetooth.
2303 */
2304 hdev->quirks |= HID_QUIRK_NO_OUTPUT_REPORTS_ON_INTR_EP;
2305 ret = sixaxis_set_operational_bt(hdev);
2306 sony_init_work(sc, sixaxis_state_worker);
2307 } else if (sc->quirks & DUALSHOCK4_CONTROLLER) {
2308 if (sc->quirks & DUALSHOCK4_CONTROLLER_BT) {
2309 /*
2310 * The DualShock 4 wants output reports sent on the ctrl
2311 * endpoint when connected via Bluetooth.
2312 */
2313 hdev->quirks |= HID_QUIRK_NO_OUTPUT_REPORTS_ON_INTR_EP;
2314 ret = dualshock4_set_operational_bt(hdev);
2315 if (ret < 0) {
2316 hid_err(hdev, "failed to set the Dualshock 4 operational mode\n");
2317 goto err_stop;
2318 }
2319 }
2320
2321 sony_init_work(sc, dualshock4_state_worker);
2322 } else if (sc->quirks & MOTION_CONTROLLER) {
2323 sony_init_work(sc, motion_state_worker);
2324 } else {
2325 ret = 0;
2326 }
2327
2328 if (ret < 0)
2329 goto err_stop;
2330
2331 ret = sony_check_add(sc);
2332 if (ret < 0)
2333 goto err_stop;
2334
2335 if (sc->quirks & SONY_LED_SUPPORT) {
2336 ret = sony_leds_init(sc);
2337 if (ret < 0)
2338 goto err_stop;
2339 }
2340
2341 if (sc->quirks & SONY_BATTERY_SUPPORT) {
2342 ret = sony_battery_probe(sc);
2343 if (ret < 0)
2344 goto err_stop;
2345
2346 /* Open the device to receive reports with battery info */
2347 ret = hid_hw_open(hdev);
2348 if (ret < 0) {
2349 hid_err(hdev, "hw open failed\n");
2350 goto err_stop;
2351 }
2352 }
2353
2354 if (sc->quirks & SONY_FF_SUPPORT) {
2355 ret = sony_init_ff(sc);
2356 if (ret < 0)
2357 goto err_close;
2358 }
2359
2360 return 0;
2361 err_close:
2362 hid_hw_close(hdev);
2363 err_stop:
2364 if (sc->quirks & SONY_LED_SUPPORT)
2365 sony_leds_remove(sc);
2366 if (sc->quirks & SONY_BATTERY_SUPPORT)
2367 sony_battery_remove(sc);
2368 sony_cancel_work_sync(sc);
2369 kfree(sc->output_report_dmabuf);
2370 sony_remove_dev_list(sc);
2371 sony_release_device_id(sc);
2372 hid_hw_stop(hdev);
2373 return ret;
2374 }
2375
2376 static void sony_remove(struct hid_device *hdev)
2377 {
2378 struct sony_sc *sc = hid_get_drvdata(hdev);
2379
2380 if (sc->quirks & SONY_LED_SUPPORT)
2381 sony_leds_remove(sc);
2382
2383 if (sc->quirks & SONY_BATTERY_SUPPORT) {
2384 hid_hw_close(hdev);
2385 sony_battery_remove(sc);
2386 }
2387
2388 sony_cancel_work_sync(sc);
2389
2390 kfree(sc->output_report_dmabuf);
2391
2392 sony_remove_dev_list(sc);
2393
2394 sony_release_device_id(sc);
2395
2396 hid_hw_stop(hdev);
2397 }
2398
2399 static const struct hid_device_id sony_devices[] = {
2400 { HID_USB_DEVICE(USB_VENDOR_ID_SONY, USB_DEVICE_ID_SONY_PS3_CONTROLLER),
2401 .driver_data = SIXAXIS_CONTROLLER_USB },
2402 { HID_USB_DEVICE(USB_VENDOR_ID_SONY, USB_DEVICE_ID_SONY_NAVIGATION_CONTROLLER),
2403 .driver_data = NAVIGATION_CONTROLLER_USB },
2404 { HID_BLUETOOTH_DEVICE(USB_VENDOR_ID_SONY, USB_DEVICE_ID_SONY_NAVIGATION_CONTROLLER),
2405 .driver_data = NAVIGATION_CONTROLLER_BT },
2406 { HID_USB_DEVICE(USB_VENDOR_ID_SONY, USB_DEVICE_ID_SONY_MOTION_CONTROLLER),
2407 .driver_data = MOTION_CONTROLLER_USB },
2408 { HID_BLUETOOTH_DEVICE(USB_VENDOR_ID_SONY, USB_DEVICE_ID_SONY_MOTION_CONTROLLER),
2409 .driver_data = MOTION_CONTROLLER_BT },
2410 { HID_BLUETOOTH_DEVICE(USB_VENDOR_ID_SONY, USB_DEVICE_ID_SONY_PS3_CONTROLLER),
2411 .driver_data = SIXAXIS_CONTROLLER_BT },
2412 { HID_USB_DEVICE(USB_VENDOR_ID_SONY, USB_DEVICE_ID_SONY_VAIO_VGX_MOUSE),
2413 .driver_data = VAIO_RDESC_CONSTANT },
2414 { HID_USB_DEVICE(USB_VENDOR_ID_SONY, USB_DEVICE_ID_SONY_VAIO_VGP_MOUSE),
2415 .driver_data = VAIO_RDESC_CONSTANT },
2416 /* Wired Buzz Controller. Reported as Sony Hub from its USB ID and as
2417 * Logitech joystick from the device descriptor. */
2418 { HID_USB_DEVICE(USB_VENDOR_ID_SONY, USB_DEVICE_ID_SONY_BUZZ_CONTROLLER),
2419 .driver_data = BUZZ_CONTROLLER },
2420 { HID_USB_DEVICE(USB_VENDOR_ID_SONY, USB_DEVICE_ID_SONY_WIRELESS_BUZZ_CONTROLLER),
2421 .driver_data = BUZZ_CONTROLLER },
2422 /* PS3 BD Remote Control */
2423 { HID_BLUETOOTH_DEVICE(USB_VENDOR_ID_SONY, USB_DEVICE_ID_SONY_PS3_BDREMOTE),
2424 .driver_data = PS3REMOTE },
2425 /* Logitech Harmony Adapter for PS3 */
2426 { HID_BLUETOOTH_DEVICE(USB_VENDOR_ID_LOGITECH, USB_DEVICE_ID_LOGITECH_HARMONY_PS3),
2427 .driver_data = PS3REMOTE },
2428 /* SMK-Link PS3 BD Remote Control */
2429 { HID_BLUETOOTH_DEVICE(USB_VENDOR_ID_SMK, USB_DEVICE_ID_SMK_PS3_BDREMOTE),
2430 .driver_data = PS3REMOTE },
2431 /* Sony Dualshock 4 controllers for PS4 */
2432 { HID_USB_DEVICE(USB_VENDOR_ID_SONY, USB_DEVICE_ID_SONY_PS4_CONTROLLER),
2433 .driver_data = DUALSHOCK4_CONTROLLER_USB },
2434 { HID_BLUETOOTH_DEVICE(USB_VENDOR_ID_SONY, USB_DEVICE_ID_SONY_PS4_CONTROLLER),
2435 .driver_data = DUALSHOCK4_CONTROLLER_BT },
2436 { }
2437 };
2438 MODULE_DEVICE_TABLE(hid, sony_devices);
2439
2440 static struct hid_driver sony_driver = {
2441 .name = "sony",
2442 .id_table = sony_devices,
2443 .input_mapping = sony_mapping,
2444 .input_configured = sony_input_configured,
2445 .probe = sony_probe,
2446 .remove = sony_remove,
2447 .report_fixup = sony_report_fixup,
2448 .raw_event = sony_raw_event
2449 };
2450
2451 static int __init sony_init(void)
2452 {
2453 dbg_hid("Sony:%s\n", __func__);
2454
2455 return hid_register_driver(&sony_driver);
2456 }
2457
2458 static void __exit sony_exit(void)
2459 {
2460 dbg_hid("Sony:%s\n", __func__);
2461
2462 hid_unregister_driver(&sony_driver);
2463 ida_destroy(&sony_device_id_allocator);
2464 }
2465 module_init(sony_init);
2466 module_exit(sony_exit);
2467
2468 MODULE_LICENSE("GPL");
This page took 0.091224 seconds and 5 git commands to generate.