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