blob: f3d44e5266f0e68647151f0f88d81beb4e734c14 [file] [log] [blame]
Jiri Slabybd28ce02008-06-25 23:47:04 +02001/*
Frank Praznik077147a2014-09-14 11:56:39 -04002 * HID driver for Sony / PS2 / PS3 / PS4 BD devices.
Jiri Slabybd28ce02008-06-25 23:47:04 +02003 *
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
Jiri Slabybd28ce02008-06-25 23:47:04 +02007 * Copyright (c) 2008 Jiri Slaby
Jiri Kosina078328d2013-06-13 12:03:49 +02008 * Copyright (c) 2012 David Dillow <dave@thedillows.org>
9 * Copyright (c) 2006-2013 Jiri Kosina
Colin Leitnerf04d5142013-05-27 23:41:05 +020010 * Copyright (c) 2013 Colin Leitner <colin.leitner@gmail.com>
Frank Praznik077147a2014-09-14 11:56:39 -040011 * Copyright (c) 2014 Frank Praznik <frank.praznik@gmail.com>
Jiri Slabybd28ce02008-06-25 23:47:04 +020012 */
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
Frank Praznikad142b92014-02-20 11:36:00 -050021/*
22 * NOTE: in order for the Sony PS3 BD Remote Control to be found by
Jiri Kosina078328d2013-06-13 12:03:49 +020023 * 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
Jiri Slabybd28ce02008-06-25 23:47:04 +020029#include <linux/device.h>
30#include <linux/hid.h>
31#include <linux/module.h>
Tejun Heo5a0e3ad2010-03-24 17:04:11 +090032#include <linux/slab.h>
Jiri Kosina40e32ee2013-05-28 11:22:09 +020033#include <linux/leds.h>
Frank Praznikd902f472014-01-27 10:17:36 -050034#include <linux/power_supply.h>
35#include <linux/spinlock.h>
Frank Praznikd2d782f2014-02-20 11:36:03 -050036#include <linux/list.h>
Frank Praznik80250872014-04-14 10:11:35 -040037#include <linux/idr.h>
Frank Praznike5606232014-01-27 10:17:37 -050038#include <linux/input/mt.h>
Jiri Slabybd28ce02008-06-25 23:47:04 +020039
40#include "hid-ids.h"
41
Frank Praznik6c79c182014-01-16 21:43:03 -050042#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)
Frank Praznik8ab16762014-01-16 21:42:31 -050047#define DUALSHOCK4_CONTROLLER_USB BIT(5)
48#define DUALSHOCK4_CONTROLLER_BT BIT(6)
Jiri Kosinacc6e0bb2008-10-23 12:58:38 +020049
Frank Praznikfee4e2d2014-02-18 17:22:01 -050050#define SIXAXIS_CONTROLLER (SIXAXIS_CONTROLLER_USB | SIXAXIS_CONTROLLER_BT)
Frank Praznik68330d82014-02-05 20:03:49 -050051#define DUALSHOCK4_CONTROLLER (DUALSHOCK4_CONTROLLER_USB |\
52 DUALSHOCK4_CONTROLLER_BT)
Frank Praznikfee4e2d2014-02-18 17:22:01 -050053#define SONY_LED_SUPPORT (SIXAXIS_CONTROLLER | BUZZ_CONTROLLER |\
Frank Praznik68330d82014-02-05 20:03:49 -050054 DUALSHOCK4_CONTROLLER)
Frank Praznikfee4e2d2014-02-18 17:22:01 -050055#define SONY_BATTERY_SUPPORT (SIXAXIS_CONTROLLER | DUALSHOCK4_CONTROLLER)
Frank Praznikc8de9db2014-02-20 11:36:01 -050056#define SONY_FF_SUPPORT (SIXAXIS_CONTROLLER | DUALSHOCK4_CONTROLLER)
Frank Praznik60781cf2014-01-11 15:13:15 -050057
58#define MAX_LEDS 4
Sven Eckelmann0a286ef2013-11-19 20:26:32 +010059
Antonio Ospitec607fb82014-06-24 13:28:41 +020060static __u8 sixaxis_rdesc[] = {
Antonio Ospitefb705a62014-06-24 13:28:42 +020061 0x05, 0x01, /* Usage Page (Desktop), */
62 0x09, 0x04, /* Usage (Joystik), */
63 0xA1, 0x01, /* Collection (Application), */
64 0xA1, 0x02, /* Collection (Logical), */
65 0x85, 0x01, /* Report ID (1), */
66 0x75, 0x08, /* Report Size (8), */
67 0x95, 0x01, /* Report Count (1), */
68 0x15, 0x00, /* Logical Minimum (0), */
69 0x26, 0xFF, 0x00, /* Logical Maximum (255), */
70 0x81, 0x03, /* Input (Constant, Variable), */
71 0x75, 0x01, /* Report Size (1), */
72 0x95, 0x13, /* Report Count (19), */
73 0x15, 0x00, /* Logical Minimum (0), */
74 0x25, 0x01, /* Logical Maximum (1), */
75 0x35, 0x00, /* Physical Minimum (0), */
76 0x45, 0x01, /* Physical Maximum (1), */
77 0x05, 0x09, /* Usage Page (Button), */
78 0x19, 0x01, /* Usage Minimum (01h), */
79 0x29, 0x13, /* Usage Maximum (13h), */
80 0x81, 0x02, /* Input (Variable), */
81 0x75, 0x01, /* Report Size (1), */
82 0x95, 0x0D, /* Report Count (13), */
83 0x06, 0x00, 0xFF, /* Usage Page (FF00h), */
84 0x81, 0x03, /* Input (Constant, Variable), */
85 0x15, 0x00, /* Logical Minimum (0), */
86 0x26, 0xFF, 0x00, /* Logical Maximum (255), */
87 0x05, 0x01, /* Usage Page (Desktop), */
88 0x09, 0x01, /* Usage (Pointer), */
89 0xA1, 0x00, /* Collection (Physical), */
90 0x75, 0x08, /* Report Size (8), */
91 0x95, 0x04, /* Report Count (4), */
92 0x35, 0x00, /* Physical Minimum (0), */
93 0x46, 0xFF, 0x00, /* Physical Maximum (255), */
94 0x09, 0x30, /* Usage (X), */
95 0x09, 0x31, /* Usage (Y), */
96 0x09, 0x32, /* Usage (Z), */
97 0x09, 0x35, /* Usage (Rz), */
98 0x81, 0x02, /* Input (Variable), */
99 0xC0, /* End Collection, */
100 0x05, 0x01, /* Usage Page (Desktop), */
101 0x95, 0x13, /* Report Count (19), */
102 0x09, 0x01, /* Usage (Pointer), */
103 0x81, 0x02, /* Input (Variable), */
104 0x95, 0x0C, /* Report Count (12), */
105 0x81, 0x01, /* Input (Constant), */
106 0x75, 0x10, /* Report Size (16), */
107 0x95, 0x04, /* Report Count (4), */
108 0x26, 0xFF, 0x03, /* Logical Maximum (1023), */
109 0x46, 0xFF, 0x03, /* Physical Maximum (1023), */
110 0x09, 0x01, /* Usage (Pointer), */
111 0x81, 0x02, /* Input (Variable), */
112 0xC0, /* End Collection, */
113 0xA1, 0x02, /* Collection (Logical), */
114 0x85, 0x02, /* Report ID (2), */
115 0x75, 0x08, /* Report Size (8), */
116 0x95, 0x30, /* Report Count (48), */
117 0x09, 0x01, /* Usage (Pointer), */
118 0xB1, 0x02, /* Feature (Variable), */
119 0xC0, /* End Collection, */
120 0xA1, 0x02, /* Collection (Logical), */
121 0x85, 0xEE, /* Report ID (238), */
122 0x75, 0x08, /* Report Size (8), */
123 0x95, 0x30, /* Report Count (48), */
124 0x09, 0x01, /* Usage (Pointer), */
125 0xB1, 0x02, /* Feature (Variable), */
126 0xC0, /* End Collection, */
127 0xA1, 0x02, /* Collection (Logical), */
128 0x85, 0xEF, /* Report ID (239), */
129 0x75, 0x08, /* Report Size (8), */
130 0x95, 0x30, /* Report Count (48), */
131 0x09, 0x01, /* Usage (Pointer), */
132 0xB1, 0x02, /* Feature (Variable), */
133 0xC0, /* End Collection, */
134 0xC0 /* End Collection */
Mauro Carvalho Chehabe57a67d2012-12-14 20:57:34 -0200135};
136
Frank Praznikad142b92014-02-20 11:36:00 -0500137/*
138 * The default descriptor doesn't provide mapping for the accelerometers
Frank Praznik58d70272014-01-20 12:27:01 -0500139 * or orientation sensors. This fixed descriptor maps the accelerometers
140 * to usage values 0x40, 0x41 and 0x42 and maps the orientation sensors
141 * to usage values 0x43, 0x44 and 0x45.
142 */
Frank Prazniked19d8c2014-01-16 21:43:12 -0500143static u8 dualshock4_usb_rdesc[] = {
Frank Praznik58d70272014-01-20 12:27:01 -0500144 0x05, 0x01, /* Usage Page (Desktop), */
145 0x09, 0x05, /* Usage (Gamepad), */
146 0xA1, 0x01, /* Collection (Application), */
147 0x85, 0x01, /* Report ID (1), */
148 0x09, 0x30, /* Usage (X), */
149 0x09, 0x31, /* Usage (Y), */
150 0x09, 0x32, /* Usage (Z), */
151 0x09, 0x35, /* Usage (Rz), */
152 0x15, 0x00, /* Logical Minimum (0), */
153 0x26, 0xFF, 0x00, /* Logical Maximum (255), */
154 0x75, 0x08, /* Report Size (8), */
155 0x95, 0x04, /* Report Count (4), */
156 0x81, 0x02, /* Input (Variable), */
157 0x09, 0x39, /* Usage (Hat Switch), */
158 0x15, 0x00, /* Logical Minimum (0), */
159 0x25, 0x07, /* Logical Maximum (7), */
160 0x35, 0x00, /* Physical Minimum (0), */
161 0x46, 0x3B, 0x01, /* Physical Maximum (315), */
162 0x65, 0x14, /* Unit (Degrees), */
163 0x75, 0x04, /* Report Size (4), */
164 0x95, 0x01, /* Report Count (1), */
165 0x81, 0x42, /* Input (Variable, Null State), */
166 0x65, 0x00, /* Unit, */
167 0x05, 0x09, /* Usage Page (Button), */
168 0x19, 0x01, /* Usage Minimum (01h), */
169 0x29, 0x0E, /* Usage Maximum (0Eh), */
170 0x15, 0x00, /* Logical Minimum (0), */
171 0x25, 0x01, /* Logical Maximum (1), */
172 0x75, 0x01, /* Report Size (1), */
173 0x95, 0x0E, /* Report Count (14), */
174 0x81, 0x02, /* Input (Variable), */
175 0x06, 0x00, 0xFF, /* Usage Page (FF00h), */
176 0x09, 0x20, /* Usage (20h), */
177 0x75, 0x06, /* Report Size (6), */
178 0x95, 0x01, /* Report Count (1), */
179 0x15, 0x00, /* Logical Minimum (0), */
Frank Praznikfb291cb2014-09-14 11:56:38 -0400180 0x25, 0x3F, /* Logical Maximum (63), */
Frank Praznik58d70272014-01-20 12:27:01 -0500181 0x81, 0x02, /* Input (Variable), */
182 0x05, 0x01, /* Usage Page (Desktop), */
183 0x09, 0x33, /* Usage (Rx), */
184 0x09, 0x34, /* Usage (Ry), */
185 0x15, 0x00, /* Logical Minimum (0), */
186 0x26, 0xFF, 0x00, /* Logical Maximum (255), */
187 0x75, 0x08, /* Report Size (8), */
188 0x95, 0x02, /* Report Count (2), */
189 0x81, 0x02, /* Input (Variable), */
190 0x06, 0x00, 0xFF, /* Usage Page (FF00h), */
191 0x09, 0x21, /* Usage (21h), */
192 0x95, 0x03, /* Report Count (3), */
193 0x81, 0x02, /* Input (Variable), */
194 0x05, 0x01, /* Usage Page (Desktop), */
195 0x19, 0x40, /* Usage Minimum (40h), */
196 0x29, 0x42, /* Usage Maximum (42h), */
197 0x16, 0x00, 0x80, /* Logical Minimum (-32768), */
198 0x26, 0x00, 0x7F, /* Logical Maximum (32767), */
199 0x75, 0x10, /* Report Size (16), */
200 0x95, 0x03, /* Report Count (3), */
201 0x81, 0x02, /* Input (Variable), */
202 0x19, 0x43, /* Usage Minimum (43h), */
203 0x29, 0x45, /* Usage Maximum (45h), */
Frank Praznikfb291cb2014-09-14 11:56:38 -0400204 0x16, 0x00, 0xE0, /* Logical Minimum (-8192), */
205 0x26, 0xFF, 0x1F, /* Logical Maximum (8191), */
Frank Praznik58d70272014-01-20 12:27:01 -0500206 0x95, 0x03, /* Report Count (3), */
207 0x81, 0x02, /* Input (Variable), */
208 0x06, 0x00, 0xFF, /* Usage Page (FF00h), */
209 0x09, 0x21, /* Usage (21h), */
210 0x15, 0x00, /* Logical Minimum (0), */
Frank Praznikfb291cb2014-09-14 11:56:38 -0400211 0x26, 0xFF, 0x00, /* Logical Maximum (255), */
Frank Praznik58d70272014-01-20 12:27:01 -0500212 0x75, 0x08, /* Report Size (8), */
213 0x95, 0x27, /* Report Count (39), */
214 0x81, 0x02, /* Input (Variable), */
215 0x85, 0x05, /* Report ID (5), */
216 0x09, 0x22, /* Usage (22h), */
217 0x95, 0x1F, /* Report Count (31), */
218 0x91, 0x02, /* Output (Variable), */
219 0x85, 0x04, /* Report ID (4), */
220 0x09, 0x23, /* Usage (23h), */
221 0x95, 0x24, /* Report Count (36), */
222 0xB1, 0x02, /* Feature (Variable), */
223 0x85, 0x02, /* Report ID (2), */
224 0x09, 0x24, /* Usage (24h), */
225 0x95, 0x24, /* Report Count (36), */
226 0xB1, 0x02, /* Feature (Variable), */
227 0x85, 0x08, /* Report ID (8), */
228 0x09, 0x25, /* Usage (25h), */
229 0x95, 0x03, /* Report Count (3), */
230 0xB1, 0x02, /* Feature (Variable), */
231 0x85, 0x10, /* Report ID (16), */
232 0x09, 0x26, /* Usage (26h), */
233 0x95, 0x04, /* Report Count (4), */
234 0xB1, 0x02, /* Feature (Variable), */
235 0x85, 0x11, /* Report ID (17), */
236 0x09, 0x27, /* Usage (27h), */
237 0x95, 0x02, /* Report Count (2), */
238 0xB1, 0x02, /* Feature (Variable), */
239 0x85, 0x12, /* Report ID (18), */
240 0x06, 0x02, 0xFF, /* Usage Page (FF02h), */
241 0x09, 0x21, /* Usage (21h), */
242 0x95, 0x0F, /* Report Count (15), */
243 0xB1, 0x02, /* Feature (Variable), */
244 0x85, 0x13, /* Report ID (19), */
245 0x09, 0x22, /* Usage (22h), */
246 0x95, 0x16, /* Report Count (22), */
247 0xB1, 0x02, /* Feature (Variable), */
248 0x85, 0x14, /* Report ID (20), */
249 0x06, 0x05, 0xFF, /* Usage Page (FF05h), */
250 0x09, 0x20, /* Usage (20h), */
251 0x95, 0x10, /* Report Count (16), */
252 0xB1, 0x02, /* Feature (Variable), */
253 0x85, 0x15, /* Report ID (21), */
254 0x09, 0x21, /* Usage (21h), */
255 0x95, 0x2C, /* Report Count (44), */
256 0xB1, 0x02, /* Feature (Variable), */
257 0x06, 0x80, 0xFF, /* Usage Page (FF80h), */
258 0x85, 0x80, /* Report ID (128), */
259 0x09, 0x20, /* Usage (20h), */
260 0x95, 0x06, /* Report Count (6), */
261 0xB1, 0x02, /* Feature (Variable), */
262 0x85, 0x81, /* Report ID (129), */
263 0x09, 0x21, /* Usage (21h), */
264 0x95, 0x06, /* Report Count (6), */
265 0xB1, 0x02, /* Feature (Variable), */
266 0x85, 0x82, /* Report ID (130), */
267 0x09, 0x22, /* Usage (22h), */
268 0x95, 0x05, /* Report Count (5), */
269 0xB1, 0x02, /* Feature (Variable), */
270 0x85, 0x83, /* Report ID (131), */
271 0x09, 0x23, /* Usage (23h), */
272 0x95, 0x01, /* Report Count (1), */
273 0xB1, 0x02, /* Feature (Variable), */
274 0x85, 0x84, /* Report ID (132), */
275 0x09, 0x24, /* Usage (24h), */
276 0x95, 0x04, /* Report Count (4), */
277 0xB1, 0x02, /* Feature (Variable), */
278 0x85, 0x85, /* Report ID (133), */
279 0x09, 0x25, /* Usage (25h), */
280 0x95, 0x06, /* Report Count (6), */
281 0xB1, 0x02, /* Feature (Variable), */
282 0x85, 0x86, /* Report ID (134), */
283 0x09, 0x26, /* Usage (26h), */
284 0x95, 0x06, /* Report Count (6), */
285 0xB1, 0x02, /* Feature (Variable), */
286 0x85, 0x87, /* Report ID (135), */
287 0x09, 0x27, /* Usage (27h), */
288 0x95, 0x23, /* Report Count (35), */
289 0xB1, 0x02, /* Feature (Variable), */
290 0x85, 0x88, /* Report ID (136), */
291 0x09, 0x28, /* Usage (28h), */
292 0x95, 0x22, /* Report Count (34), */
293 0xB1, 0x02, /* Feature (Variable), */
294 0x85, 0x89, /* Report ID (137), */
295 0x09, 0x29, /* Usage (29h), */
296 0x95, 0x02, /* Report Count (2), */
297 0xB1, 0x02, /* Feature (Variable), */
298 0x85, 0x90, /* Report ID (144), */
299 0x09, 0x30, /* Usage (30h), */
300 0x95, 0x05, /* Report Count (5), */
301 0xB1, 0x02, /* Feature (Variable), */
302 0x85, 0x91, /* Report ID (145), */
303 0x09, 0x31, /* Usage (31h), */
304 0x95, 0x03, /* Report Count (3), */
305 0xB1, 0x02, /* Feature (Variable), */
306 0x85, 0x92, /* Report ID (146), */
307 0x09, 0x32, /* Usage (32h), */
308 0x95, 0x03, /* Report Count (3), */
309 0xB1, 0x02, /* Feature (Variable), */
310 0x85, 0x93, /* Report ID (147), */
311 0x09, 0x33, /* Usage (33h), */
312 0x95, 0x0C, /* Report Count (12), */
313 0xB1, 0x02, /* Feature (Variable), */
314 0x85, 0xA0, /* Report ID (160), */
315 0x09, 0x40, /* Usage (40h), */
316 0x95, 0x06, /* Report Count (6), */
317 0xB1, 0x02, /* Feature (Variable), */
318 0x85, 0xA1, /* Report ID (161), */
319 0x09, 0x41, /* Usage (41h), */
320 0x95, 0x01, /* Report Count (1), */
321 0xB1, 0x02, /* Feature (Variable), */
322 0x85, 0xA2, /* Report ID (162), */
323 0x09, 0x42, /* Usage (42h), */
324 0x95, 0x01, /* Report Count (1), */
325 0xB1, 0x02, /* Feature (Variable), */
326 0x85, 0xA3, /* Report ID (163), */
327 0x09, 0x43, /* Usage (43h), */
328 0x95, 0x30, /* Report Count (48), */
329 0xB1, 0x02, /* Feature (Variable), */
330 0x85, 0xA4, /* Report ID (164), */
331 0x09, 0x44, /* Usage (44h), */
332 0x95, 0x0D, /* Report Count (13), */
333 0xB1, 0x02, /* Feature (Variable), */
334 0x85, 0xA5, /* Report ID (165), */
335 0x09, 0x45, /* Usage (45h), */
336 0x95, 0x15, /* Report Count (21), */
337 0xB1, 0x02, /* Feature (Variable), */
338 0x85, 0xA6, /* Report ID (166), */
339 0x09, 0x46, /* Usage (46h), */
340 0x95, 0x15, /* Report Count (21), */
341 0xB1, 0x02, /* Feature (Variable), */
342 0x85, 0xF0, /* Report ID (240), */
343 0x09, 0x47, /* Usage (47h), */
344 0x95, 0x3F, /* Report Count (63), */
345 0xB1, 0x02, /* Feature (Variable), */
346 0x85, 0xF1, /* Report ID (241), */
347 0x09, 0x48, /* Usage (48h), */
348 0x95, 0x3F, /* Report Count (63), */
349 0xB1, 0x02, /* Feature (Variable), */
350 0x85, 0xF2, /* Report ID (242), */
351 0x09, 0x49, /* Usage (49h), */
352 0x95, 0x0F, /* Report Count (15), */
353 0xB1, 0x02, /* Feature (Variable), */
354 0x85, 0xA7, /* Report ID (167), */
355 0x09, 0x4A, /* Usage (4Ah), */
356 0x95, 0x01, /* Report Count (1), */
357 0xB1, 0x02, /* Feature (Variable), */
358 0x85, 0xA8, /* Report ID (168), */
359 0x09, 0x4B, /* Usage (4Bh), */
360 0x95, 0x01, /* Report Count (1), */
361 0xB1, 0x02, /* Feature (Variable), */
362 0x85, 0xA9, /* Report ID (169), */
363 0x09, 0x4C, /* Usage (4Ch), */
364 0x95, 0x08, /* Report Count (8), */
365 0xB1, 0x02, /* Feature (Variable), */
366 0x85, 0xAA, /* Report ID (170), */
367 0x09, 0x4E, /* Usage (4Eh), */
368 0x95, 0x01, /* Report Count (1), */
369 0xB1, 0x02, /* Feature (Variable), */
370 0x85, 0xAB, /* Report ID (171), */
371 0x09, 0x4F, /* Usage (4Fh), */
372 0x95, 0x39, /* Report Count (57), */
373 0xB1, 0x02, /* Feature (Variable), */
374 0x85, 0xAC, /* Report ID (172), */
375 0x09, 0x50, /* Usage (50h), */
376 0x95, 0x39, /* Report Count (57), */
377 0xB1, 0x02, /* Feature (Variable), */
378 0x85, 0xAD, /* Report ID (173), */
379 0x09, 0x51, /* Usage (51h), */
380 0x95, 0x0B, /* Report Count (11), */
381 0xB1, 0x02, /* Feature (Variable), */
382 0x85, 0xAE, /* Report ID (174), */
383 0x09, 0x52, /* Usage (52h), */
384 0x95, 0x01, /* Report Count (1), */
385 0xB1, 0x02, /* Feature (Variable), */
386 0x85, 0xAF, /* Report ID (175), */
387 0x09, 0x53, /* Usage (53h), */
388 0x95, 0x02, /* Report Count (2), */
389 0xB1, 0x02, /* Feature (Variable), */
390 0x85, 0xB0, /* Report ID (176), */
391 0x09, 0x54, /* Usage (54h), */
392 0x95, 0x3F, /* Report Count (63), */
393 0xB1, 0x02, /* Feature (Variable), */
394 0xC0 /* End Collection */
Frank Prazniked19d8c2014-01-16 21:43:12 -0500395};
396
Frank Praznikad142b92014-02-20 11:36:00 -0500397/*
398 * The default behavior of the Dualshock 4 is to send reports using report
Frank Praznik077147a2014-09-14 11:56:39 -0400399 * type 1 when running over Bluetooth. However, when feature report 2 is
400 * requested during the controller initialization it starts sending input
401 * reports in report 17. Since report 17 is undefined in the default HID
Frank Praznikd8296742014-02-05 20:03:45 -0500402 * descriptor the button and axis definitions must be moved to report 17 or
Frank Praznik077147a2014-09-14 11:56:39 -0400403 * the HID layer won't process the received input.
Frank Praznikd8296742014-02-05 20:03:45 -0500404 */
405static u8 dualshock4_bt_rdesc[] = {
406 0x05, 0x01, /* Usage Page (Desktop), */
407 0x09, 0x05, /* Usage (Gamepad), */
408 0xA1, 0x01, /* Collection (Application), */
409 0x85, 0x01, /* Report ID (1), */
410 0x75, 0x08, /* Report Size (8), */
411 0x95, 0x0A, /* Report Count (9), */
412 0x81, 0x02, /* Input (Variable), */
413 0x06, 0x04, 0xFF, /* Usage Page (FF04h), */
414 0x85, 0x02, /* Report ID (2), */
415 0x09, 0x24, /* Usage (24h), */
416 0x95, 0x24, /* Report Count (36), */
417 0xB1, 0x02, /* Feature (Variable), */
418 0x85, 0xA3, /* Report ID (163), */
419 0x09, 0x25, /* Usage (25h), */
420 0x95, 0x30, /* Report Count (48), */
421 0xB1, 0x02, /* Feature (Variable), */
422 0x85, 0x05, /* Report ID (5), */
423 0x09, 0x26, /* Usage (26h), */
424 0x95, 0x28, /* Report Count (40), */
425 0xB1, 0x02, /* Feature (Variable), */
426 0x85, 0x06, /* Report ID (6), */
427 0x09, 0x27, /* Usage (27h), */
428 0x95, 0x34, /* Report Count (52), */
429 0xB1, 0x02, /* Feature (Variable), */
430 0x85, 0x07, /* Report ID (7), */
431 0x09, 0x28, /* Usage (28h), */
432 0x95, 0x30, /* Report Count (48), */
433 0xB1, 0x02, /* Feature (Variable), */
434 0x85, 0x08, /* Report ID (8), */
435 0x09, 0x29, /* Usage (29h), */
436 0x95, 0x2F, /* Report Count (47), */
437 0xB1, 0x02, /* Feature (Variable), */
438 0x06, 0x03, 0xFF, /* Usage Page (FF03h), */
439 0x85, 0x03, /* Report ID (3), */
440 0x09, 0x21, /* Usage (21h), */
441 0x95, 0x26, /* Report Count (38), */
442 0xB1, 0x02, /* Feature (Variable), */
443 0x85, 0x04, /* Report ID (4), */
444 0x09, 0x22, /* Usage (22h), */
445 0x95, 0x2E, /* Report Count (46), */
446 0xB1, 0x02, /* Feature (Variable), */
447 0x85, 0xF0, /* Report ID (240), */
448 0x09, 0x47, /* Usage (47h), */
449 0x95, 0x3F, /* Report Count (63), */
450 0xB1, 0x02, /* Feature (Variable), */
451 0x85, 0xF1, /* Report ID (241), */
452 0x09, 0x48, /* Usage (48h), */
453 0x95, 0x3F, /* Report Count (63), */
454 0xB1, 0x02, /* Feature (Variable), */
455 0x85, 0xF2, /* Report ID (242), */
456 0x09, 0x49, /* Usage (49h), */
457 0x95, 0x0F, /* Report Count (15), */
458 0xB1, 0x02, /* Feature (Variable), */
459 0x85, 0x11, /* Report ID (17), */
460 0x06, 0x00, 0xFF, /* Usage Page (FF00h), */
461 0x09, 0x20, /* Usage (20h), */
462 0x95, 0x02, /* Report Count (2), */
463 0x81, 0x02, /* Input (Variable), */
464 0x05, 0x01, /* Usage Page (Desktop), */
465 0x09, 0x30, /* Usage (X), */
466 0x09, 0x31, /* Usage (Y), */
467 0x09, 0x32, /* Usage (Z), */
468 0x09, 0x35, /* Usage (Rz), */
469 0x15, 0x00, /* Logical Minimum (0), */
470 0x26, 0xFF, 0x00, /* Logical Maximum (255), */
471 0x75, 0x08, /* Report Size (8), */
472 0x95, 0x04, /* Report Count (4), */
473 0x81, 0x02, /* Input (Variable), */
474 0x09, 0x39, /* Usage (Hat Switch), */
475 0x15, 0x00, /* Logical Minimum (0), */
476 0x25, 0x07, /* Logical Maximum (7), */
477 0x75, 0x04, /* Report Size (4), */
478 0x95, 0x01, /* Report Count (1), */
479 0x81, 0x42, /* Input (Variable, Null State), */
480 0x05, 0x09, /* Usage Page (Button), */
481 0x19, 0x01, /* Usage Minimum (01h), */
482 0x29, 0x0E, /* Usage Maximum (0Eh), */
483 0x15, 0x00, /* Logical Minimum (0), */
484 0x25, 0x01, /* Logical Maximum (1), */
485 0x75, 0x01, /* Report Size (1), */
486 0x95, 0x0E, /* Report Count (14), */
487 0x81, 0x02, /* Input (Variable), */
488 0x75, 0x06, /* Report Size (6), */
489 0x95, 0x01, /* Report Count (1), */
490 0x81, 0x01, /* Input (Constant), */
491 0x05, 0x01, /* Usage Page (Desktop), */
492 0x09, 0x33, /* Usage (Rx), */
493 0x09, 0x34, /* Usage (Ry), */
494 0x15, 0x00, /* Logical Minimum (0), */
495 0x26, 0xFF, 0x00, /* Logical Maximum (255), */
496 0x75, 0x08, /* Report Size (8), */
497 0x95, 0x02, /* Report Count (2), */
498 0x81, 0x02, /* Input (Variable), */
499 0x06, 0x00, 0xFF, /* Usage Page (FF00h), */
500 0x09, 0x20, /* Usage (20h), */
501 0x95, 0x03, /* Report Count (3), */
502 0x81, 0x02, /* Input (Variable), */
503 0x05, 0x01, /* Usage Page (Desktop), */
504 0x19, 0x40, /* Usage Minimum (40h), */
505 0x29, 0x42, /* Usage Maximum (42h), */
506 0x16, 0x00, 0x80, /* Logical Minimum (-32768), */
507 0x26, 0x00, 0x7F, /* Logical Maximum (32767), */
508 0x75, 0x10, /* Report Size (16), */
509 0x95, 0x03, /* Report Count (3), */
510 0x81, 0x02, /* Input (Variable), */
511 0x19, 0x43, /* Usage Minimum (43h), */
512 0x29, 0x45, /* Usage Maximum (45h), */
Frank Praznikfb291cb2014-09-14 11:56:38 -0400513 0x16, 0x00, 0xE0, /* Logical Minimum (-8192), */
514 0x26, 0xFF, 0x1F, /* Logical Maximum (8191), */
Frank Praznikd8296742014-02-05 20:03:45 -0500515 0x95, 0x03, /* Report Count (3), */
516 0x81, 0x02, /* Input (Variable), */
517 0x06, 0x00, 0xFF, /* Usage Page (FF00h), */
518 0x09, 0x20, /* Usage (20h), */
519 0x15, 0x00, /* Logical Minimum (0), */
520 0x26, 0xFF, 0x00, /* Logical Maximum (255), */
521 0x75, 0x08, /* Report Size (8), */
522 0x95, 0x31, /* Report Count (51), */
523 0x81, 0x02, /* Input (Variable), */
524 0x09, 0x21, /* Usage (21h), */
525 0x75, 0x08, /* Report Size (8), */
526 0x95, 0x4D, /* Report Count (77), */
527 0x91, 0x02, /* Output (Variable), */
528 0x85, 0x12, /* Report ID (18), */
529 0x09, 0x22, /* Usage (22h), */
530 0x95, 0x8D, /* Report Count (141), */
531 0x81, 0x02, /* Input (Variable), */
532 0x09, 0x23, /* Usage (23h), */
533 0x91, 0x02, /* Output (Variable), */
534 0x85, 0x13, /* Report ID (19), */
535 0x09, 0x24, /* Usage (24h), */
536 0x95, 0xCD, /* Report Count (205), */
537 0x81, 0x02, /* Input (Variable), */
538 0x09, 0x25, /* Usage (25h), */
539 0x91, 0x02, /* Output (Variable), */
540 0x85, 0x14, /* Report ID (20), */
541 0x09, 0x26, /* Usage (26h), */
542 0x96, 0x0D, 0x01, /* Report Count (269), */
543 0x81, 0x02, /* Input (Variable), */
544 0x09, 0x27, /* Usage (27h), */
545 0x91, 0x02, /* Output (Variable), */
546 0x85, 0x15, /* Report ID (21), */
547 0x09, 0x28, /* Usage (28h), */
548 0x96, 0x4D, 0x01, /* Report Count (333), */
549 0x81, 0x02, /* Input (Variable), */
550 0x09, 0x29, /* Usage (29h), */
551 0x91, 0x02, /* Output (Variable), */
552 0x85, 0x16, /* Report ID (22), */
553 0x09, 0x2A, /* Usage (2Ah), */
554 0x96, 0x8D, 0x01, /* Report Count (397), */
555 0x81, 0x02, /* Input (Variable), */
556 0x09, 0x2B, /* Usage (2Bh), */
557 0x91, 0x02, /* Output (Variable), */
558 0x85, 0x17, /* Report ID (23), */
559 0x09, 0x2C, /* Usage (2Ch), */
560 0x96, 0xCD, 0x01, /* Report Count (461), */
561 0x81, 0x02, /* Input (Variable), */
562 0x09, 0x2D, /* Usage (2Dh), */
563 0x91, 0x02, /* Output (Variable), */
564 0x85, 0x18, /* Report ID (24), */
565 0x09, 0x2E, /* Usage (2Eh), */
566 0x96, 0x0D, 0x02, /* Report Count (525), */
567 0x81, 0x02, /* Input (Variable), */
568 0x09, 0x2F, /* Usage (2Fh), */
569 0x91, 0x02, /* Output (Variable), */
570 0x85, 0x19, /* Report ID (25), */
571 0x09, 0x30, /* Usage (30h), */
572 0x96, 0x22, 0x02, /* Report Count (546), */
573 0x81, 0x02, /* Input (Variable), */
574 0x09, 0x31, /* Usage (31h), */
575 0x91, 0x02, /* Output (Variable), */
576 0x06, 0x80, 0xFF, /* Usage Page (FF80h), */
577 0x85, 0x82, /* Report ID (130), */
578 0x09, 0x22, /* Usage (22h), */
579 0x95, 0x3F, /* Report Count (63), */
580 0xB1, 0x02, /* Feature (Variable), */
581 0x85, 0x83, /* Report ID (131), */
582 0x09, 0x23, /* Usage (23h), */
583 0xB1, 0x02, /* Feature (Variable), */
584 0x85, 0x84, /* Report ID (132), */
585 0x09, 0x24, /* Usage (24h), */
586 0xB1, 0x02, /* Feature (Variable), */
587 0x85, 0x90, /* Report ID (144), */
588 0x09, 0x30, /* Usage (30h), */
589 0xB1, 0x02, /* Feature (Variable), */
590 0x85, 0x91, /* Report ID (145), */
591 0x09, 0x31, /* Usage (31h), */
592 0xB1, 0x02, /* Feature (Variable), */
593 0x85, 0x92, /* Report ID (146), */
594 0x09, 0x32, /* Usage (32h), */
595 0xB1, 0x02, /* Feature (Variable), */
596 0x85, 0x93, /* Report ID (147), */
597 0x09, 0x33, /* Usage (33h), */
598 0xB1, 0x02, /* Feature (Variable), */
599 0x85, 0xA0, /* Report ID (160), */
600 0x09, 0x40, /* Usage (40h), */
601 0xB1, 0x02, /* Feature (Variable), */
602 0x85, 0xA4, /* Report ID (164), */
603 0x09, 0x44, /* Usage (44h), */
604 0xB1, 0x02, /* Feature (Variable), */
605 0xC0 /* End Collection */
606};
607
Jiri Kosina078328d2013-06-13 12:03:49 +0200608static __u8 ps3remote_rdesc[] = {
609 0x05, 0x01, /* GUsagePage Generic Desktop */
610 0x09, 0x05, /* LUsage 0x05 [Game Pad] */
611 0xA1, 0x01, /* MCollection Application (mouse, keyboard) */
612
613 /* Use collection 1 for joypad buttons */
614 0xA1, 0x02, /* MCollection Logical (interrelated data) */
615
616 /* Ignore the 1st byte, maybe it is used for a controller
617 * number but it's not needed for correct operation */
618 0x75, 0x08, /* GReportSize 0x08 [8] */
619 0x95, 0x01, /* GReportCount 0x01 [1] */
620 0x81, 0x01, /* MInput 0x01 (Const[0] Arr[1] Abs[2]) */
621
622 /* Bytes from 2nd to 4th are a bitmap for joypad buttons, for these
623 * buttons multiple keypresses are allowed */
624 0x05, 0x09, /* GUsagePage Button */
625 0x19, 0x01, /* LUsageMinimum 0x01 [Button 1 (primary/trigger)] */
626 0x29, 0x18, /* LUsageMaximum 0x18 [Button 24] */
627 0x14, /* GLogicalMinimum [0] */
628 0x25, 0x01, /* GLogicalMaximum 0x01 [1] */
629 0x75, 0x01, /* GReportSize 0x01 [1] */
630 0x95, 0x18, /* GReportCount 0x18 [24] */
631 0x81, 0x02, /* MInput 0x02 (Data[0] Var[1] Abs[2]) */
632
633 0xC0, /* MEndCollection */
634
635 /* Use collection 2 for remote control buttons */
636 0xA1, 0x02, /* MCollection Logical (interrelated data) */
637
638 /* 5th byte is used for remote control buttons */
639 0x05, 0x09, /* GUsagePage Button */
640 0x18, /* LUsageMinimum [No button pressed] */
641 0x29, 0xFE, /* LUsageMaximum 0xFE [Button 254] */
642 0x14, /* GLogicalMinimum [0] */
643 0x26, 0xFE, 0x00, /* GLogicalMaximum 0x00FE [254] */
644 0x75, 0x08, /* GReportSize 0x08 [8] */
645 0x95, 0x01, /* GReportCount 0x01 [1] */
646 0x80, /* MInput */
647
648 /* Ignore bytes from 6th to 11th, 6th to 10th are always constant at
649 * 0xff and 11th is for press indication */
650 0x75, 0x08, /* GReportSize 0x08 [8] */
651 0x95, 0x06, /* GReportCount 0x06 [6] */
652 0x81, 0x01, /* MInput 0x01 (Const[0] Arr[1] Abs[2]) */
653
654 /* 12th byte is for battery strength */
655 0x05, 0x06, /* GUsagePage Generic Device Controls */
656 0x09, 0x20, /* LUsage 0x20 [Battery Strength] */
657 0x14, /* GLogicalMinimum [0] */
658 0x25, 0x05, /* GLogicalMaximum 0x05 [5] */
659 0x75, 0x08, /* GReportSize 0x08 [8] */
660 0x95, 0x01, /* GReportCount 0x01 [1] */
661 0x81, 0x02, /* MInput 0x02 (Data[0] Var[1] Abs[2]) */
662
663 0xC0, /* MEndCollection */
664
665 0xC0 /* MEndCollection [Game Pad] */
666};
667
668static const unsigned int ps3remote_keymap_joypad_buttons[] = {
669 [0x01] = KEY_SELECT,
670 [0x02] = BTN_THUMBL, /* L3 */
671 [0x03] = BTN_THUMBR, /* R3 */
672 [0x04] = BTN_START,
673 [0x05] = KEY_UP,
674 [0x06] = KEY_RIGHT,
675 [0x07] = KEY_DOWN,
676 [0x08] = KEY_LEFT,
677 [0x09] = BTN_TL2, /* L2 */
678 [0x0a] = BTN_TR2, /* R2 */
679 [0x0b] = BTN_TL, /* L1 */
680 [0x0c] = BTN_TR, /* R1 */
681 [0x0d] = KEY_OPTION, /* options/triangle */
682 [0x0e] = KEY_BACK, /* back/circle */
683 [0x0f] = BTN_0, /* cross */
684 [0x10] = KEY_SCREEN, /* view/square */
685 [0x11] = KEY_HOMEPAGE, /* PS button */
686 [0x14] = KEY_ENTER,
687};
688static const unsigned int ps3remote_keymap_remote_buttons[] = {
689 [0x00] = KEY_1,
690 [0x01] = KEY_2,
691 [0x02] = KEY_3,
692 [0x03] = KEY_4,
693 [0x04] = KEY_5,
694 [0x05] = KEY_6,
695 [0x06] = KEY_7,
696 [0x07] = KEY_8,
697 [0x08] = KEY_9,
698 [0x09] = KEY_0,
699 [0x0e] = KEY_ESC, /* return */
700 [0x0f] = KEY_CLEAR,
701 [0x16] = KEY_EJECTCD,
702 [0x1a] = KEY_MENU, /* top menu */
703 [0x28] = KEY_TIME,
704 [0x30] = KEY_PREVIOUS,
705 [0x31] = KEY_NEXT,
706 [0x32] = KEY_PLAY,
707 [0x33] = KEY_REWIND, /* scan back */
708 [0x34] = KEY_FORWARD, /* scan forward */
709 [0x38] = KEY_STOP,
710 [0x39] = KEY_PAUSE,
711 [0x40] = KEY_CONTEXT_MENU, /* pop up/menu */
712 [0x60] = KEY_FRAMEBACK, /* slow/step back */
713 [0x61] = KEY_FRAMEFORWARD, /* slow/step forward */
714 [0x63] = KEY_SUBTITLE,
715 [0x64] = KEY_AUDIO,
716 [0x65] = KEY_ANGLE,
717 [0x70] = KEY_INFO, /* display */
718 [0x80] = KEY_BLUE,
719 [0x81] = KEY_RED,
720 [0x82] = KEY_GREEN,
721 [0x83] = KEY_YELLOW,
722};
723
Colin Leitnerf04d5142013-05-27 23:41:05 +0200724static const unsigned int buzz_keymap[] = {
Frank Praznikad142b92014-02-20 11:36:00 -0500725 /*
726 * The controller has 4 remote buzzers, each with one LED and 5
Colin Leitnerf04d5142013-05-27 23:41:05 +0200727 * buttons.
728 *
729 * We use the mapping chosen by the controller, which is:
730 *
731 * Key Offset
732 * -------------------
733 * Buzz 1
734 * Blue 5
735 * Orange 4
736 * Green 3
737 * Yellow 2
738 *
739 * So, for example, the orange button on the third buzzer is mapped to
740 * BTN_TRIGGER_HAPPY14
741 */
742 [ 1] = BTN_TRIGGER_HAPPY1,
743 [ 2] = BTN_TRIGGER_HAPPY2,
744 [ 3] = BTN_TRIGGER_HAPPY3,
745 [ 4] = BTN_TRIGGER_HAPPY4,
746 [ 5] = BTN_TRIGGER_HAPPY5,
747 [ 6] = BTN_TRIGGER_HAPPY6,
748 [ 7] = BTN_TRIGGER_HAPPY7,
749 [ 8] = BTN_TRIGGER_HAPPY8,
750 [ 9] = BTN_TRIGGER_HAPPY9,
751 [10] = BTN_TRIGGER_HAPPY10,
752 [11] = BTN_TRIGGER_HAPPY11,
753 [12] = BTN_TRIGGER_HAPPY12,
754 [13] = BTN_TRIGGER_HAPPY13,
755 [14] = BTN_TRIGGER_HAPPY14,
756 [15] = BTN_TRIGGER_HAPPY15,
757 [16] = BTN_TRIGGER_HAPPY16,
758 [17] = BTN_TRIGGER_HAPPY17,
759 [18] = BTN_TRIGGER_HAPPY18,
760 [19] = BTN_TRIGGER_HAPPY19,
761 [20] = BTN_TRIGGER_HAPPY20,
762};
763
Frank Praznikd902f472014-01-27 10:17:36 -0500764static enum power_supply_property sony_battery_props[] = {
765 POWER_SUPPLY_PROP_PRESENT,
766 POWER_SUPPLY_PROP_CAPACITY,
767 POWER_SUPPLY_PROP_SCOPE,
768 POWER_SUPPLY_PROP_STATUS,
769};
770
Frank Praznik55d3b662014-04-14 10:11:32 -0400771struct sixaxis_led {
772 __u8 time_enabled; /* the total time the led is active (0xff means forever) */
773 __u8 duty_length; /* how long a cycle is in deciseconds (0 means "really fast") */
774 __u8 enabled;
775 __u8 duty_off; /* % of duty_length the led is off (0xff means 100%) */
776 __u8 duty_on; /* % of duty_length the led is on (0xff mean 100%) */
777} __packed;
778
779struct sixaxis_rumble {
780 __u8 padding;
781 __u8 right_duration; /* Right motor duration (0xff means forever) */
782 __u8 right_motor_on; /* Right (small) motor on/off, only supports values of 0 or 1 (off/on) */
783 __u8 left_duration; /* Left motor duration (0xff means forever) */
784 __u8 left_motor_force; /* left (large) motor, supports force values from 0 to 255 */
785} __packed;
786
787struct sixaxis_output_report {
788 __u8 report_id;
789 struct sixaxis_rumble rumble;
790 __u8 padding[4];
791 __u8 leds_bitmap; /* bitmap of enabled LEDs: LED_1 = 0x02, LED_2 = 0x04, ... */
792 struct sixaxis_led led[4]; /* LEDx at (4 - x) */
793 struct sixaxis_led _reserved; /* LED5, not actually soldered */
794} __packed;
795
796union sixaxis_output_report_01 {
797 struct sixaxis_output_report data;
798 __u8 buf[36];
799};
800
Frank Praznik9b2b5c92014-11-12 14:10:09 -0500801#define DS4_REPORT_0x02_SIZE 37
802#define DS4_REPORT_0x05_SIZE 32
803#define DS4_REPORT_0x11_SIZE 78
804#define DS4_REPORT_0x81_SIZE 7
805#define SIXAXIS_REPORT_0xF2_SIZE 18
806
Frank Praznikd2d782f2014-02-20 11:36:03 -0500807static spinlock_t sony_dev_list_lock;
808static LIST_HEAD(sony_device_list);
Frank Praznik80250872014-04-14 10:11:35 -0400809static DEFINE_IDA(sony_device_id_allocator);
Frank Praznikd2d782f2014-02-20 11:36:03 -0500810
Jiri Kosinacc6e0bb2008-10-23 12:58:38 +0200811struct sony_sc {
Frank Praznikd902f472014-01-27 10:17:36 -0500812 spinlock_t lock;
Frank Praznikd2d782f2014-02-20 11:36:03 -0500813 struct list_head list_node;
Sven Eckelmann0a286ef2013-11-19 20:26:32 +0100814 struct hid_device *hdev;
Frank Praznik60781cf2014-01-11 15:13:15 -0500815 struct led_classdev *leds[MAX_LEDS];
Jiri Kosinacc6e0bb2008-10-23 12:58:38 +0200816 unsigned long quirks;
Sven Eckelmann0a286ef2013-11-19 20:26:32 +0100817 struct work_struct state_worker;
Frank Praznikd902f472014-01-27 10:17:36 -0500818 struct power_supply battery;
Frank Praznik80250872014-04-14 10:11:35 -0400819 int device_id;
Frank Praznik9b2b5c92014-11-12 14:10:09 -0500820 __u8 *output_report_dmabuf;
Colin Leitnerf04d5142013-05-27 23:41:05 +0200821
Sven Eckelmann9f323b62013-11-17 20:38:21 +0100822#ifdef CONFIG_SONY_FF
Sven Eckelmann9f323b62013-11-17 20:38:21 +0100823 __u8 left;
824 __u8 right;
825#endif
826
Frank Praznikd2d782f2014-02-20 11:36:03 -0500827 __u8 mac_address[6];
Frank Praznik5f5750d2014-02-19 13:09:22 -0500828 __u8 worker_initialized;
Frank Praznikd902f472014-01-27 10:17:36 -0500829 __u8 cable_state;
830 __u8 battery_charging;
831 __u8 battery_capacity;
Frank Praznik60781cf2014-01-11 15:13:15 -0500832 __u8 led_state[MAX_LEDS];
Frank Praznikb3ed4582014-04-14 10:11:36 -0400833 __u8 led_delay_on[MAX_LEDS];
834 __u8 led_delay_off[MAX_LEDS];
Frank Praznik60781cf2014-01-11 15:13:15 -0500835 __u8 led_count;
Jiri Kosinacc6e0bb2008-10-23 12:58:38 +0200836};
837
Antonio Ospitec607fb82014-06-24 13:28:41 +0200838static __u8 *sixaxis_fixup(struct hid_device *hdev, __u8 *rdesc,
839 unsigned int *rsize)
840{
841 *rsize = sizeof(sixaxis_rdesc);
842 return sixaxis_rdesc;
843}
844
Jiri Kosina078328d2013-06-13 12:03:49 +0200845static __u8 *ps3remote_fixup(struct hid_device *hdev, __u8 *rdesc,
846 unsigned int *rsize)
847{
848 *rsize = sizeof(ps3remote_rdesc);
849 return ps3remote_rdesc;
850}
851
852static int ps3remote_mapping(struct hid_device *hdev, struct hid_input *hi,
853 struct hid_field *field, struct hid_usage *usage,
854 unsigned long **bit, int *max)
855{
856 unsigned int key = usage->hid & HID_USAGE;
857
858 if ((usage->hid & HID_USAGE_PAGE) != HID_UP_BUTTON)
859 return -1;
860
861 switch (usage->collection_index) {
862 case 1:
863 if (key >= ARRAY_SIZE(ps3remote_keymap_joypad_buttons))
864 return -1;
865
866 key = ps3remote_keymap_joypad_buttons[key];
867 if (!key)
868 return -1;
869 break;
870 case 2:
871 if (key >= ARRAY_SIZE(ps3remote_keymap_remote_buttons))
872 return -1;
873
874 key = ps3remote_keymap_remote_buttons[key];
875 if (!key)
876 return -1;
877 break;
878 default:
879 return -1;
880 }
881
882 hid_map_usage_clear(hi, usage, bit, max, EV_KEY, key);
883 return 1;
884}
885
Nikolai Kondrashov73e40082010-08-06 23:03:06 +0400886static __u8 *sony_report_fixup(struct hid_device *hdev, __u8 *rdesc,
887 unsigned int *rsize)
Jiri Kosinacc6e0bb2008-10-23 12:58:38 +0200888{
889 struct sony_sc *sc = hid_get_drvdata(hdev);
890
Fernando Luis Vázquez Cao99d24902013-01-22 15:20:38 +0900891 /*
892 * Some Sony RF receivers wrongly declare the mouse pointer as a
893 * a constant non-data variable.
894 */
895 if ((sc->quirks & VAIO_RDESC_CONSTANT) && *rsize >= 56 &&
896 /* usage page: generic desktop controls */
897 /* rdesc[0] == 0x05 && rdesc[1] == 0x01 && */
898 /* usage: mouse */
899 rdesc[2] == 0x09 && rdesc[3] == 0x02 &&
900 /* input (usage page for x,y axes): constant, variable, relative */
901 rdesc[54] == 0x81 && rdesc[55] == 0x07) {
Fernando Luis Vázquez Caoa4649182013-01-15 19:40:48 +0900902 hid_info(hdev, "Fixing up Sony RF Receiver report descriptor\n");
Fernando Luis Vázquez Cao99d24902013-01-22 15:20:38 +0900903 /* input: data, variable, relative */
Jiri Kosinacc6e0bb2008-10-23 12:58:38 +0200904 rdesc[55] = 0x06;
905 }
Simon Wood61ab44b2011-06-10 12:00:26 +0200906
Frank Prazniked19d8c2014-01-16 21:43:12 -0500907 /*
908 * The default Dualshock 4 USB descriptor doesn't assign
909 * the gyroscope values to corresponding axes so we need a
910 * modified one.
911 */
912 if ((sc->quirks & DUALSHOCK4_CONTROLLER_USB) && *rsize == 467) {
913 hid_info(hdev, "Using modified Dualshock 4 report descriptor with gyroscope axes\n");
914 rdesc = dualshock4_usb_rdesc;
915 *rsize = sizeof(dualshock4_usb_rdesc);
Frank Praznikd8296742014-02-05 20:03:45 -0500916 } else if ((sc->quirks & DUALSHOCK4_CONTROLLER_BT) && *rsize == 357) {
917 hid_info(hdev, "Using modified Dualshock 4 Bluetooth report descriptor\n");
918 rdesc = dualshock4_bt_rdesc;
919 *rsize = sizeof(dualshock4_bt_rdesc);
Frank Prazniked19d8c2014-01-16 21:43:12 -0500920 }
921
Antonio Ospitec607fb82014-06-24 13:28:41 +0200922 if (sc->quirks & SIXAXIS_CONTROLLER)
923 return sixaxis_fixup(hdev, rdesc, rsize);
Jiri Kosina078328d2013-06-13 12:03:49 +0200924
925 if (sc->quirks & PS3REMOTE)
926 return ps3remote_fixup(hdev, rdesc, rsize);
927
Nikolai Kondrashov73e40082010-08-06 23:03:06 +0400928 return rdesc;
Jiri Kosinacc6e0bb2008-10-23 12:58:38 +0200929}
930
Frank Praznikd902f472014-01-27 10:17:36 -0500931static void sixaxis_parse_report(struct sony_sc *sc, __u8 *rd, int size)
932{
933 static const __u8 sixaxis_battery_capacity[] = { 0, 1, 25, 50, 75, 100 };
934 unsigned long flags;
935 __u8 cable_state, battery_capacity, battery_charging;
936
Frank Praznikad142b92014-02-20 11:36:00 -0500937 /*
938 * The sixaxis is charging if the battery value is 0xee
Frank Praznikd902f472014-01-27 10:17:36 -0500939 * and it is fully charged if the value is 0xef.
940 * It does not report the actual level while charging so it
941 * is set to 100% while charging is in progress.
942 */
943 if (rd[30] >= 0xee) {
944 battery_capacity = 100;
Frank Praznika43e94a2014-02-15 13:35:42 -0500945 battery_charging = !(rd[30] & 0x01);
Frank Praznik9fddd742014-08-29 13:11:52 -0400946 cable_state = 1;
Frank Praznikd902f472014-01-27 10:17:36 -0500947 } else {
Frank Praznikac3c9a92014-02-20 11:36:02 -0500948 __u8 index = rd[30] <= 5 ? rd[30] : 5;
949 battery_capacity = sixaxis_battery_capacity[index];
Frank Praznikd902f472014-01-27 10:17:36 -0500950 battery_charging = 0;
Frank Praznik9fddd742014-08-29 13:11:52 -0400951 cable_state = 0;
Frank Praznikd902f472014-01-27 10:17:36 -0500952 }
Frank Praznikd902f472014-01-27 10:17:36 -0500953
954 spin_lock_irqsave(&sc->lock, flags);
955 sc->cable_state = cable_state;
956 sc->battery_capacity = battery_capacity;
957 sc->battery_charging = battery_charging;
958 spin_unlock_irqrestore(&sc->lock, flags);
959}
960
961static void dualshock4_parse_report(struct sony_sc *sc, __u8 *rd, int size)
962{
Frank Praznike5606232014-01-27 10:17:37 -0500963 struct hid_input *hidinput = list_entry(sc->hdev->inputs.next,
964 struct hid_input, list);
965 struct input_dev *input_dev = hidinput->input;
Frank Praznikd902f472014-01-27 10:17:36 -0500966 unsigned long flags;
Frank Praznik6c5f8602014-02-05 20:03:47 -0500967 int n, offset;
Frank Praznikd902f472014-01-27 10:17:36 -0500968 __u8 cable_state, battery_capacity, battery_charging;
969
Frank Praznikad142b92014-02-20 11:36:00 -0500970 /*
971 * Battery and touchpad data starts at byte 30 in the USB report and
Frank Praznik6c5f8602014-02-05 20:03:47 -0500972 * 32 in Bluetooth report.
973 */
974 offset = (sc->quirks & DUALSHOCK4_CONTROLLER_USB) ? 30 : 32;
975
Frank Praznikad142b92014-02-20 11:36:00 -0500976 /*
977 * The lower 4 bits of byte 30 contain the battery level
Frank Praznikd902f472014-01-27 10:17:36 -0500978 * and the 5th bit contains the USB cable state.
979 */
Frank Praznik6c5f8602014-02-05 20:03:47 -0500980 cable_state = (rd[offset] >> 4) & 0x01;
981 battery_capacity = rd[offset] & 0x0F;
Frank Praznikd902f472014-01-27 10:17:36 -0500982
Frank Praznikad142b92014-02-20 11:36:00 -0500983 /*
984 * When a USB power source is connected the battery level ranges from
Frank Praznik6c5f8602014-02-05 20:03:47 -0500985 * 0 to 10, and when running on battery power it ranges from 0 to 9.
986 * A battery level above 10 when plugged in means charge completed.
Frank Praznikd902f472014-01-27 10:17:36 -0500987 */
Frank Praznik6c5f8602014-02-05 20:03:47 -0500988 if (!cable_state || battery_capacity > 10)
Frank Praznikd902f472014-01-27 10:17:36 -0500989 battery_charging = 0;
990 else
991 battery_charging = 1;
992
Frank Praznik6c5f8602014-02-05 20:03:47 -0500993 if (!cable_state)
994 battery_capacity++;
Frank Praznikd902f472014-01-27 10:17:36 -0500995 if (battery_capacity > 10)
Frank Praznik6c5f8602014-02-05 20:03:47 -0500996 battery_capacity = 10;
997
Frank Praznikd902f472014-01-27 10:17:36 -0500998 battery_capacity *= 10;
999
1000 spin_lock_irqsave(&sc->lock, flags);
1001 sc->cable_state = cable_state;
1002 sc->battery_capacity = battery_capacity;
1003 sc->battery_charging = battery_charging;
1004 spin_unlock_irqrestore(&sc->lock, flags);
Frank Praznike5606232014-01-27 10:17:37 -05001005
Frank Praznik6c5f8602014-02-05 20:03:47 -05001006 offset += 5;
1007
Frank Praznikad142b92014-02-20 11:36:00 -05001008 /*
1009 * The Dualshock 4 multi-touch trackpad data starts at offset 35 on USB
Frank Praznik6c5f8602014-02-05 20:03:47 -05001010 * and 37 on Bluetooth.
Frank Praznike5606232014-01-27 10:17:37 -05001011 * The first 7 bits of the first byte is a counter and bit 8 is a touch
1012 * indicator that is 0 when pressed and 1 when not pressed.
1013 * The next 3 bytes are two 12 bit touch coordinates, X and Y.
1014 * The data for the second touch is in the same format and immediatly
1015 * follows the data for the first.
1016 */
1017 for (n = 0; n < 2; n++) {
1018 __u16 x, y;
1019
1020 x = rd[offset+1] | ((rd[offset+2] & 0xF) << 8);
1021 y = ((rd[offset+2] & 0xF0) >> 4) | (rd[offset+3] << 4);
1022
1023 input_mt_slot(input_dev, n);
1024 input_mt_report_slot_state(input_dev, MT_TOOL_FINGER,
1025 !(rd[offset] >> 7));
1026 input_report_abs(input_dev, ABS_MT_POSITION_X, x);
1027 input_report_abs(input_dev, ABS_MT_POSITION_Y, y);
1028
1029 offset += 4;
1030 }
Frank Praznikd902f472014-01-27 10:17:36 -05001031}
1032
Simon Woodc9e4d872011-06-10 12:00:27 +02001033static int sony_raw_event(struct hid_device *hdev, struct hid_report *report,
1034 __u8 *rd, int size)
1035{
1036 struct sony_sc *sc = hid_get_drvdata(hdev);
1037
Frank Praznikad142b92014-02-20 11:36:00 -05001038 /*
1039 * Sixaxis HID report has acclerometers/gyro with MSByte first, this
Simon Woodc9e4d872011-06-10 12:00:27 +02001040 * has to be BYTE_SWAPPED before passing up to joystick interface
1041 */
Frank Praznikfee4e2d2014-02-18 17:22:01 -05001042 if ((sc->quirks & SIXAXIS_CONTROLLER) && rd[0] == 0x01 && size == 49) {
Simon Woodc9e4d872011-06-10 12:00:27 +02001043 swap(rd[41], rd[42]);
1044 swap(rd[43], rd[44]);
1045 swap(rd[45], rd[46]);
1046 swap(rd[47], rd[48]);
Frank Praznikd902f472014-01-27 10:17:36 -05001047
1048 sixaxis_parse_report(sc, rd, size);
Frank Praznik68330d82014-02-05 20:03:49 -05001049 } else if (((sc->quirks & DUALSHOCK4_CONTROLLER_USB) && rd[0] == 0x01 &&
1050 size == 64) || ((sc->quirks & DUALSHOCK4_CONTROLLER_BT)
1051 && rd[0] == 0x11 && size == 78)) {
Frank Praznikd902f472014-01-27 10:17:36 -05001052 dualshock4_parse_report(sc, rd, size);
Simon Woodc9e4d872011-06-10 12:00:27 +02001053 }
1054
1055 return 0;
1056}
1057
Colin Leitnerf04d5142013-05-27 23:41:05 +02001058static int sony_mapping(struct hid_device *hdev, struct hid_input *hi,
1059 struct hid_field *field, struct hid_usage *usage,
1060 unsigned long **bit, int *max)
1061{
1062 struct sony_sc *sc = hid_get_drvdata(hdev);
1063
1064 if (sc->quirks & BUZZ_CONTROLLER) {
1065 unsigned int key = usage->hid & HID_USAGE;
1066
1067 if ((usage->hid & HID_USAGE_PAGE) != HID_UP_BUTTON)
1068 return -1;
1069
1070 switch (usage->collection_index) {
1071 case 1:
1072 if (key >= ARRAY_SIZE(buzz_keymap))
1073 return -1;
1074
1075 key = buzz_keymap[key];
1076 if (!key)
1077 return -1;
1078 break;
1079 default:
1080 return -1;
1081 }
1082
1083 hid_map_usage_clear(hi, usage, bit, max, EV_KEY, key);
1084 return 1;
1085 }
1086
Jiri Kosina078328d2013-06-13 12:03:49 +02001087 if (sc->quirks & PS3REMOTE)
1088 return ps3remote_mapping(hdev, hi, field, usage, bit, max);
1089
Benjamin Tissoires6f498012013-07-24 16:53:07 +02001090 /* Let hid-core decide for the others */
1091 return 0;
Colin Leitnerf04d5142013-05-27 23:41:05 +02001092}
1093
Frank Praznikce8efc32014-09-18 21:15:01 -04001094static int sony_register_touchpad(struct hid_input *hi, int touch_count,
1095 int w, int h)
1096{
1097 struct input_dev *input_dev = hi->input;
1098 int ret;
1099
1100 ret = input_mt_init_slots(input_dev, touch_count, 0);
1101 if (ret < 0)
1102 return ret;
1103
1104 input_set_abs_params(input_dev, ABS_MT_POSITION_X, 0, w, 0, 0);
1105 input_set_abs_params(input_dev, ABS_MT_POSITION_Y, 0, h, 0, 0);
1106
1107 return 0;
1108}
1109
1110static void sony_input_configured(struct hid_device *hdev,
1111 struct hid_input *hidinput)
1112{
1113 struct sony_sc *sc = hid_get_drvdata(hdev);
1114
1115 /*
1116 * The Dualshock 4 touchpad supports 2 touches and has a
Frank Praznik981c5b42014-09-24 09:38:19 -04001117 * resolution of 1920x942 (44.86 dots/mm).
Frank Praznikce8efc32014-09-18 21:15:01 -04001118 */
1119 if (sc->quirks & DUALSHOCK4_CONTROLLER) {
Frank Praznik981c5b42014-09-24 09:38:19 -04001120 if (sony_register_touchpad(hidinput, 2, 1920, 942) != 0)
Frank Praznikce8efc32014-09-18 21:15:01 -04001121 hid_err(sc->hdev,
1122 "Unable to initialize multi-touch slots\n");
1123 }
1124}
1125
Antonio Ospite5710fab2011-02-20 18:26:45 +01001126/*
Jiri Slabybd28ce02008-06-25 23:47:04 +02001127 * Sending HID_REQ_GET_REPORT changes the operation mode of the ps3 controller
1128 * to "operational". Without this, the ps3 controller will not report any
1129 * events.
1130 */
Antonio Ospite816651a2010-05-03 22:15:55 +02001131static int sixaxis_set_operational_usb(struct hid_device *hdev)
Jiri Slabybd28ce02008-06-25 23:47:04 +02001132{
Jiri Slabybd28ce02008-06-25 23:47:04 +02001133 int ret;
1134 char *buf = kmalloc(18, GFP_KERNEL);
1135
1136 if (!buf)
1137 return -ENOMEM;
1138
Benjamin Tissoirescafebc02014-02-05 16:33:22 -05001139 ret = hid_hw_raw_request(hdev, 0xf2, buf, 17, HID_FEATURE_REPORT,
1140 HID_REQ_GET_REPORT);
Benjamin Tissoiresf204828a2013-09-11 22:12:25 +02001141
Lauri Kasanena7de9b82015-02-16 15:06:59 +02001142 if (ret < 0) {
1143 hid_err(hdev, "can't set operational mode: step 1\n");
1144 goto out;
1145 }
Jiri Slabybd28ce02008-06-25 23:47:04 +02001146
Lauri Kasanena7de9b82015-02-16 15:06:59 +02001147 /*
1148 * Some compatible controllers like the Speedlink Strike FX and
1149 * Gasia need another query plus an USB interrupt to get operational.
1150 */
1151 ret = hid_hw_raw_request(hdev, 0xf5, buf, 8, HID_FEATURE_REPORT,
1152 HID_REQ_GET_REPORT);
1153
1154 if (ret < 0) {
1155 hid_err(hdev, "can't set operational mode: step 2\n");
1156 goto out;
1157 }
1158
1159 ret = hid_hw_output_report(hdev, buf, 1);
1160
1161 if (ret < 0)
1162 hid_err(hdev, "can't set operational mode: step 3\n");
1163
1164out:
Jiri Slabybd28ce02008-06-25 23:47:04 +02001165 kfree(buf);
1166
1167 return ret;
1168}
1169
Antonio Ospite816651a2010-05-03 22:15:55 +02001170static int sixaxis_set_operational_bt(struct hid_device *hdev)
Bastien Noceraf9ce7c22010-01-20 12:01:53 +00001171{
Frank Praznik9b2b5c92014-11-12 14:10:09 -05001172 static const __u8 report[] = { 0xf4, 0x42, 0x03, 0x00, 0x00 };
1173 __u8 *buf;
1174 int ret;
1175
1176 buf = kmemdup(report, sizeof(report), GFP_KERNEL);
1177 if (!buf)
1178 return -ENOMEM;
1179
1180 ret = hid_hw_raw_request(hdev, buf[0], buf, sizeof(report),
Benjamin Tissoiresb0dd72a2014-02-10 12:58:54 -05001181 HID_FEATURE_REPORT, HID_REQ_SET_REPORT);
Frank Praznik9b2b5c92014-11-12 14:10:09 -05001182
1183 kfree(buf);
1184
1185 return ret;
Bastien Noceraf9ce7c22010-01-20 12:01:53 +00001186}
1187
Frank Praznikad142b92014-02-20 11:36:00 -05001188/*
1189 * Requesting feature report 0x02 in Bluetooth mode changes the state of the
Frank Praznik68330d82014-02-05 20:03:49 -05001190 * controller so that it sends full input reports of type 0x11.
1191 */
1192static int dualshock4_set_operational_bt(struct hid_device *hdev)
1193{
Frank Praznik9b2b5c92014-11-12 14:10:09 -05001194 __u8 *buf;
1195 int ret;
Frank Praznik68330d82014-02-05 20:03:49 -05001196
Frank Praznik9b2b5c92014-11-12 14:10:09 -05001197 buf = kmalloc(DS4_REPORT_0x02_SIZE, GFP_KERNEL);
1198 if (!buf)
1199 return -ENOMEM;
1200
1201 ret = hid_hw_raw_request(hdev, 0x02, buf, DS4_REPORT_0x02_SIZE,
Frank Praznik68330d82014-02-05 20:03:49 -05001202 HID_FEATURE_REPORT, HID_REQ_GET_REPORT);
Frank Praznik9b2b5c92014-11-12 14:10:09 -05001203
1204 kfree(buf);
1205
1206 return ret;
Jiri Slabybd28ce02008-06-25 23:47:04 +02001207}
1208
Frank Praznik80250872014-04-14 10:11:35 -04001209static void sixaxis_set_leds_from_id(int id, __u8 values[MAX_LEDS])
1210{
1211 static const __u8 sixaxis_leds[10][4] = {
1212 { 0x01, 0x00, 0x00, 0x00 },
1213 { 0x00, 0x01, 0x00, 0x00 },
1214 { 0x00, 0x00, 0x01, 0x00 },
1215 { 0x00, 0x00, 0x00, 0x01 },
1216 { 0x01, 0x00, 0x00, 0x01 },
1217 { 0x00, 0x01, 0x00, 0x01 },
1218 { 0x00, 0x00, 0x01, 0x01 },
1219 { 0x01, 0x00, 0x01, 0x01 },
1220 { 0x00, 0x01, 0x01, 0x01 },
1221 { 0x01, 0x01, 0x01, 0x01 }
1222 };
1223
1224 BUG_ON(MAX_LEDS < ARRAY_SIZE(sixaxis_leds[0]));
1225
1226 if (id < 0)
1227 return;
1228
1229 id %= 10;
1230 memcpy(values, sixaxis_leds[id], sizeof(sixaxis_leds[id]));
1231}
1232
1233static void dualshock4_set_leds_from_id(int id, __u8 values[MAX_LEDS])
1234{
1235 /* The first 4 color/index entries match what the PS4 assigns */
1236 static const __u8 color_code[7][3] = {
1237 /* Blue */ { 0x00, 0x00, 0x01 },
1238 /* Red */ { 0x01, 0x00, 0x00 },
1239 /* Green */ { 0x00, 0x01, 0x00 },
1240 /* Pink */ { 0x02, 0x00, 0x01 },
1241 /* Orange */ { 0x02, 0x01, 0x00 },
1242 /* Teal */ { 0x00, 0x01, 0x01 },
1243 /* White */ { 0x01, 0x01, 0x01 }
1244 };
1245
1246 BUG_ON(MAX_LEDS < ARRAY_SIZE(color_code[0]));
1247
1248 if (id < 0)
1249 return;
1250
1251 id %= 7;
1252 memcpy(values, color_code[id], sizeof(color_code[id]));
1253}
1254
Frank Praznik60781cf2014-01-11 15:13:15 -05001255static void buzz_set_leds(struct hid_device *hdev, const __u8 *leds)
Colin Leitnerf04d5142013-05-27 23:41:05 +02001256{
1257 struct list_head *report_list =
1258 &hdev->report_enum[HID_OUTPUT_REPORT].report_list;
1259 struct hid_report *report = list_entry(report_list->next,
1260 struct hid_report, list);
1261 __s32 *value = report->field[0]->value;
1262
1263 value[0] = 0x00;
Frank Praznik60781cf2014-01-11 15:13:15 -05001264 value[1] = leds[0] ? 0xff : 0x00;
1265 value[2] = leds[1] ? 0xff : 0x00;
1266 value[3] = leds[2] ? 0xff : 0x00;
1267 value[4] = leds[3] ? 0xff : 0x00;
Colin Leitnerf04d5142013-05-27 23:41:05 +02001268 value[5] = 0x00;
1269 value[6] = 0x00;
1270 hid_hw_request(hdev, report, HID_REQ_SET_REPORT);
1271}
1272
Frank Praznikfa57a812014-04-14 10:11:33 -04001273static void sony_set_leds(struct sony_sc *sc, const __u8 *leds, int count)
Sven Eckelmann0a286ef2013-11-19 20:26:32 +01001274{
Frank Praznik60781cf2014-01-11 15:13:15 -05001275 int n;
Sven Eckelmann0a286ef2013-11-19 20:26:32 +01001276
Frank Praznik60781cf2014-01-11 15:13:15 -05001277 BUG_ON(count > MAX_LEDS);
1278
Frank Praznikfa57a812014-04-14 10:11:33 -04001279 if (sc->quirks & BUZZ_CONTROLLER && count == 4) {
1280 buzz_set_leds(sc->hdev, leds);
Frank Praznikfee4e2d2014-02-18 17:22:01 -05001281 } else {
Frank Praznik60781cf2014-01-11 15:13:15 -05001282 for (n = 0; n < count; n++)
Frank Praznikfa57a812014-04-14 10:11:33 -04001283 sc->led_state[n] = leds[n];
1284 schedule_work(&sc->state_worker);
Sven Eckelmann0a286ef2013-11-19 20:26:32 +01001285 }
1286}
1287
Sven Eckelmannc5382512013-11-19 20:26:30 +01001288static void sony_led_set_brightness(struct led_classdev *led,
Colin Leitnerf04d5142013-05-27 23:41:05 +02001289 enum led_brightness value)
1290{
1291 struct device *dev = led->dev->parent;
1292 struct hid_device *hdev = container_of(dev, struct hid_device, dev);
1293 struct sony_sc *drv_data;
Colin Leitnerf04d5142013-05-27 23:41:05 +02001294
1295 int n;
Frank Praznikb3ed4582014-04-14 10:11:36 -04001296 int force_update;
Colin Leitnerf04d5142013-05-27 23:41:05 +02001297
1298 drv_data = hid_get_drvdata(hdev);
Sven Eckelmann2251b852013-11-19 20:26:31 +01001299 if (!drv_data) {
Colin Leitnerf04d5142013-05-27 23:41:05 +02001300 hid_err(hdev, "No device data\n");
1301 return;
1302 }
Colin Leitnerf04d5142013-05-27 23:41:05 +02001303
Frank Praznikb3ed4582014-04-14 10:11:36 -04001304 /*
1305 * The Sixaxis on USB will override any LED settings sent to it
1306 * and keep flashing all of the LEDs until the PS button is pressed.
1307 * Updates, even if redundant, must be always be sent to the
1308 * controller to avoid having to toggle the state of an LED just to
1309 * stop the flashing later on.
1310 */
1311 force_update = !!(drv_data->quirks & SIXAXIS_CONTROLLER_USB);
1312
Frank Praznik60781cf2014-01-11 15:13:15 -05001313 for (n = 0; n < drv_data->led_count; n++) {
Frank Praznikb3ed4582014-04-14 10:11:36 -04001314 if (led == drv_data->leds[n] && (force_update ||
1315 (value != drv_data->led_state[n] ||
1316 drv_data->led_delay_on[n] ||
1317 drv_data->led_delay_off[n]))) {
1318
1319 drv_data->led_state[n] = value;
1320
1321 /* Setting the brightness stops the blinking */
1322 drv_data->led_delay_on[n] = 0;
1323 drv_data->led_delay_off[n] = 0;
1324
1325 sony_set_leds(drv_data, drv_data->led_state,
1326 drv_data->led_count);
Colin Leitnerf04d5142013-05-27 23:41:05 +02001327 break;
1328 }
1329 }
1330}
1331
Sven Eckelmannc5382512013-11-19 20:26:30 +01001332static enum led_brightness sony_led_get_brightness(struct led_classdev *led)
Colin Leitnerf04d5142013-05-27 23:41:05 +02001333{
1334 struct device *dev = led->dev->parent;
1335 struct hid_device *hdev = container_of(dev, struct hid_device, dev);
1336 struct sony_sc *drv_data;
Colin Leitnerf04d5142013-05-27 23:41:05 +02001337
1338 int n;
Colin Leitnerf04d5142013-05-27 23:41:05 +02001339
1340 drv_data = hid_get_drvdata(hdev);
Sven Eckelmann2251b852013-11-19 20:26:31 +01001341 if (!drv_data) {
Colin Leitnerf04d5142013-05-27 23:41:05 +02001342 hid_err(hdev, "No device data\n");
1343 return LED_OFF;
1344 }
Colin Leitnerf04d5142013-05-27 23:41:05 +02001345
Frank Praznik60781cf2014-01-11 15:13:15 -05001346 for (n = 0; n < drv_data->led_count; n++) {
Simon Wood7db75042014-02-05 12:34:18 -07001347 if (led == drv_data->leds[n])
1348 return drv_data->led_state[n];
Colin Leitnerf04d5142013-05-27 23:41:05 +02001349 }
1350
Simon Wood7db75042014-02-05 12:34:18 -07001351 return LED_OFF;
Colin Leitnerf04d5142013-05-27 23:41:05 +02001352}
Colin Leitnerf04d5142013-05-27 23:41:05 +02001353
Frank Praznikb3ed4582014-04-14 10:11:36 -04001354static int sony_led_blink_set(struct led_classdev *led, unsigned long *delay_on,
1355 unsigned long *delay_off)
1356{
1357 struct device *dev = led->dev->parent;
1358 struct hid_device *hdev = container_of(dev, struct hid_device, dev);
1359 struct sony_sc *drv_data = hid_get_drvdata(hdev);
1360 int n;
1361 __u8 new_on, new_off;
1362
1363 if (!drv_data) {
1364 hid_err(hdev, "No device data\n");
1365 return -EINVAL;
1366 }
1367
1368 /* Max delay is 255 deciseconds or 2550 milliseconds */
1369 if (*delay_on > 2550)
1370 *delay_on = 2550;
1371 if (*delay_off > 2550)
1372 *delay_off = 2550;
1373
1374 /* Blink at 1 Hz if both values are zero */
1375 if (!*delay_on && !*delay_off)
1376 *delay_on = *delay_off = 500;
1377
1378 new_on = *delay_on / 10;
1379 new_off = *delay_off / 10;
1380
1381 for (n = 0; n < drv_data->led_count; n++) {
1382 if (led == drv_data->leds[n])
1383 break;
1384 }
1385
1386 /* This LED is not registered on this device */
1387 if (n >= drv_data->led_count)
1388 return -EINVAL;
1389
1390 /* Don't schedule work if the values didn't change */
1391 if (new_on != drv_data->led_delay_on[n] ||
1392 new_off != drv_data->led_delay_off[n]) {
1393 drv_data->led_delay_on[n] = new_on;
1394 drv_data->led_delay_off[n] = new_off;
1395 schedule_work(&drv_data->state_worker);
1396 }
1397
1398 return 0;
1399}
1400
Frank Praznikfa57a812014-04-14 10:11:33 -04001401static void sony_leds_remove(struct sony_sc *sc)
Sven Eckelmann0a286ef2013-11-19 20:26:32 +01001402{
Sven Eckelmann0a286ef2013-11-19 20:26:32 +01001403 struct led_classdev *led;
1404 int n;
1405
Frank Praznikfa57a812014-04-14 10:11:33 -04001406 BUG_ON(!(sc->quirks & SONY_LED_SUPPORT));
Sven Eckelmann0a286ef2013-11-19 20:26:32 +01001407
Frank Praznikfa57a812014-04-14 10:11:33 -04001408 for (n = 0; n < sc->led_count; n++) {
1409 led = sc->leds[n];
1410 sc->leds[n] = NULL;
Sven Eckelmann0a286ef2013-11-19 20:26:32 +01001411 if (!led)
1412 continue;
1413 led_classdev_unregister(led);
1414 kfree(led);
1415 }
Frank Praznik60781cf2014-01-11 15:13:15 -05001416
Frank Praznikfa57a812014-04-14 10:11:33 -04001417 sc->led_count = 0;
Sven Eckelmann0a286ef2013-11-19 20:26:32 +01001418}
1419
Frank Praznikfa57a812014-04-14 10:11:33 -04001420static int sony_leds_init(struct sony_sc *sc)
Colin Leitnerf04d5142013-05-27 23:41:05 +02001421{
Frank Praznikfa57a812014-04-14 10:11:33 -04001422 struct hid_device *hdev = sc->hdev;
Jiri Kosina40e32ee2013-05-28 11:22:09 +02001423 int n, ret = 0;
Frank Praznikb3ed4582014-04-14 10:11:36 -04001424 int use_ds4_names;
Jiri Kosina40e32ee2013-05-28 11:22:09 +02001425 struct led_classdev *led;
1426 size_t name_sz;
1427 char *name;
Sven Eckelmann0a286ef2013-11-19 20:26:32 +01001428 size_t name_len;
1429 const char *name_fmt;
Frank Praznikb3ed4582014-04-14 10:11:36 -04001430 static const char * const ds4_name_str[] = { "red", "green", "blue",
1431 "global" };
Frank Praznik80250872014-04-14 10:11:35 -04001432 __u8 initial_values[MAX_LEDS] = { 0 };
Frank Praznik5607c892014-07-29 19:55:48 -07001433 __u8 max_brightness[MAX_LEDS] = { [0 ... (MAX_LEDS - 1)] = 1 };
Frank Praznikb3ed4582014-04-14 10:11:36 -04001434 __u8 use_hw_blink[MAX_LEDS] = { 0 };
Colin Leitnerf04d5142013-05-27 23:41:05 +02001435
Frank Praznikfa57a812014-04-14 10:11:33 -04001436 BUG_ON(!(sc->quirks & SONY_LED_SUPPORT));
Colin Leitnerf04d5142013-05-27 23:41:05 +02001437
Frank Praznikfa57a812014-04-14 10:11:33 -04001438 if (sc->quirks & BUZZ_CONTROLLER) {
1439 sc->led_count = 4;
Frank Praznikb3ed4582014-04-14 10:11:36 -04001440 use_ds4_names = 0;
Sven Eckelmann0a286ef2013-11-19 20:26:32 +01001441 name_len = strlen("::buzz#");
1442 name_fmt = "%s::buzz%d";
1443 /* Validate expected report characteristics. */
1444 if (!hid_validate_values(hdev, HID_OUTPUT_REPORT, 0, 0, 7))
1445 return -ENODEV;
Frank Praznikfa57a812014-04-14 10:11:33 -04001446 } else if (sc->quirks & DUALSHOCK4_CONTROLLER) {
Frank Praznik80250872014-04-14 10:11:35 -04001447 dualshock4_set_leds_from_id(sc->device_id, initial_values);
Frank Praznikb3ed4582014-04-14 10:11:36 -04001448 initial_values[3] = 1;
1449 sc->led_count = 4;
1450 memset(max_brightness, 255, 3);
1451 use_hw_blink[3] = 1;
1452 use_ds4_names = 1;
Frank Praznik61ebca92014-01-20 12:27:02 -05001453 name_len = 0;
1454 name_fmt = "%s:%s";
Frank Praznik60781cf2014-01-11 15:13:15 -05001455 } else {
Frank Praznik80250872014-04-14 10:11:35 -04001456 sixaxis_set_leds_from_id(sc->device_id, initial_values);
Frank Praznikfa57a812014-04-14 10:11:33 -04001457 sc->led_count = 4;
Frank Praznikb3ed4582014-04-14 10:11:36 -04001458 memset(use_hw_blink, 1, 4);
1459 use_ds4_names = 0;
Frank Praznik61ebca92014-01-20 12:27:02 -05001460 name_len = strlen("::sony#");
1461 name_fmt = "%s::sony%d";
Frank Praznik60781cf2014-01-11 15:13:15 -05001462 }
1463
Frank Praznikad142b92014-02-20 11:36:00 -05001464 /*
1465 * Clear LEDs as we have no way of reading their initial state. This is
Colin Leitnerf04d5142013-05-27 23:41:05 +02001466 * only relevant if the driver is loaded after somebody actively set the
Frank Praznikad142b92014-02-20 11:36:00 -05001467 * LEDs to on
1468 */
Frank Praznikfa57a812014-04-14 10:11:33 -04001469 sony_set_leds(sc, initial_values, sc->led_count);
Colin Leitnerf04d5142013-05-27 23:41:05 +02001470
Sven Eckelmann0a286ef2013-11-19 20:26:32 +01001471 name_sz = strlen(dev_name(&hdev->dev)) + name_len + 1;
Colin Leitnerf04d5142013-05-27 23:41:05 +02001472
Frank Praznikfa57a812014-04-14 10:11:33 -04001473 for (n = 0; n < sc->led_count; n++) {
Frank Praznik61ebca92014-01-20 12:27:02 -05001474
Frank Praznikb3ed4582014-04-14 10:11:36 -04001475 if (use_ds4_names)
1476 name_sz = strlen(dev_name(&hdev->dev)) + strlen(ds4_name_str[n]) + 2;
Frank Praznik61ebca92014-01-20 12:27:02 -05001477
Jiri Kosina40e32ee2013-05-28 11:22:09 +02001478 led = kzalloc(sizeof(struct led_classdev) + name_sz, GFP_KERNEL);
1479 if (!led) {
1480 hid_err(hdev, "Couldn't allocate memory for LED %d\n", n);
Julia Lawall8cd5fcd2013-12-29 23:47:27 +01001481 ret = -ENOMEM;
Jiri Kosina40e32ee2013-05-28 11:22:09 +02001482 goto error_leds;
Colin Leitnerf04d5142013-05-27 23:41:05 +02001483 }
Jiri Kosina40e32ee2013-05-28 11:22:09 +02001484
1485 name = (void *)(&led[1]);
Frank Praznikb3ed4582014-04-14 10:11:36 -04001486 if (use_ds4_names)
1487 snprintf(name, name_sz, name_fmt, dev_name(&hdev->dev),
1488 ds4_name_str[n]);
Frank Praznik61ebca92014-01-20 12:27:02 -05001489 else
1490 snprintf(name, name_sz, name_fmt, dev_name(&hdev->dev), n + 1);
Jiri Kosina40e32ee2013-05-28 11:22:09 +02001491 led->name = name;
Frank Praznik80250872014-04-14 10:11:35 -04001492 led->brightness = initial_values[n];
Frank Praznikb3ed4582014-04-14 10:11:36 -04001493 led->max_brightness = max_brightness[n];
Sven Eckelmannc5382512013-11-19 20:26:30 +01001494 led->brightness_get = sony_led_get_brightness;
1495 led->brightness_set = sony_led_set_brightness;
Jiri Kosina40e32ee2013-05-28 11:22:09 +02001496
Frank Praznikb3ed4582014-04-14 10:11:36 -04001497 if (use_hw_blink[n])
1498 led->blink_set = sony_led_blink_set;
1499
Frank Praznik80250872014-04-14 10:11:35 -04001500 sc->leds[n] = led;
1501
Julia Lawall8cd5fcd2013-12-29 23:47:27 +01001502 ret = led_classdev_register(&hdev->dev, led);
1503 if (ret) {
Jiri Kosina40e32ee2013-05-28 11:22:09 +02001504 hid_err(hdev, "Failed to register LED %d\n", n);
Frank Praznik80250872014-04-14 10:11:35 -04001505 sc->leds[n] = NULL;
Jiri Kosina40e32ee2013-05-28 11:22:09 +02001506 kfree(led);
1507 goto error_leds;
1508 }
Colin Leitnerf04d5142013-05-27 23:41:05 +02001509 }
Colin Leitnerf04d5142013-05-27 23:41:05 +02001510
1511 return ret;
1512
Colin Leitnerf04d5142013-05-27 23:41:05 +02001513error_leds:
Frank Praznikfa57a812014-04-14 10:11:33 -04001514 sony_leds_remove(sc);
Colin Leitnerf04d5142013-05-27 23:41:05 +02001515
Colin Leitnerf04d5142013-05-27 23:41:05 +02001516 return ret;
Colin Leitnerf04d5142013-05-27 23:41:05 +02001517}
1518
Frank Praznikcad665a2014-01-11 15:13:54 -05001519static void sixaxis_state_worker(struct work_struct *work)
Sven Eckelmanna08c22c2013-11-09 19:25:57 +01001520{
Frank Praznik9b2b5c92014-11-12 14:10:09 -05001521 static const union sixaxis_output_report_01 default_report = {
Frank Praznik55d3b662014-04-14 10:11:32 -04001522 .buf = {
1523 0x01,
1524 0x00, 0xff, 0x00, 0xff, 0x00,
1525 0x00, 0x00, 0x00, 0x00, 0x00,
1526 0xff, 0x27, 0x10, 0x00, 0x32,
1527 0xff, 0x27, 0x10, 0x00, 0x32,
1528 0xff, 0x27, 0x10, 0x00, 0x32,
1529 0xff, 0x27, 0x10, 0x00, 0x32,
1530 0x00, 0x00, 0x00, 0x00, 0x00
1531 }
Sven Eckelmanna08c22c2013-11-09 19:25:57 +01001532 };
Frank Praznik9b2b5c92014-11-12 14:10:09 -05001533 struct sony_sc *sc = container_of(work, struct sony_sc, state_worker);
1534 struct sixaxis_output_report *report =
1535 (struct sixaxis_output_report *)sc->output_report_dmabuf;
1536 int n;
1537
1538 /* Initialize the report with default values */
1539 memcpy(report, &default_report, sizeof(struct sixaxis_output_report));
Sven Eckelmann9f323b62013-11-17 20:38:21 +01001540
Sven Eckelmann0a286ef2013-11-19 20:26:32 +01001541#ifdef CONFIG_SONY_FF
Frank Praznik9b2b5c92014-11-12 14:10:09 -05001542 report->rumble.right_motor_on = sc->right ? 1 : 0;
1543 report->rumble.left_motor_force = sc->left;
Sven Eckelmann0a286ef2013-11-19 20:26:32 +01001544#endif
1545
Frank Praznik9b2b5c92014-11-12 14:10:09 -05001546 report->leds_bitmap |= sc->led_state[0] << 1;
1547 report->leds_bitmap |= sc->led_state[1] << 2;
1548 report->leds_bitmap |= sc->led_state[2] << 3;
1549 report->leds_bitmap |= sc->led_state[3] << 4;
Sven Eckelmann9f323b62013-11-17 20:38:21 +01001550
Simon Wood88f65762014-04-14 10:11:37 -04001551 /* Set flag for all leds off, required for 3rd party INTEC controller */
Frank Praznik9b2b5c92014-11-12 14:10:09 -05001552 if ((report->leds_bitmap & 0x1E) == 0)
1553 report->leds_bitmap |= 0x20;
Simon Wood88f65762014-04-14 10:11:37 -04001554
Frank Praznikb3ed4582014-04-14 10:11:36 -04001555 /*
1556 * The LEDs in the report are indexed in reverse order to their
1557 * corresponding light on the controller.
1558 * Index 0 = LED 4, index 1 = LED 3, etc...
1559 *
1560 * In the case of both delay values being zero (blinking disabled) the
1561 * default report values should be used or the controller LED will be
1562 * always off.
1563 */
1564 for (n = 0; n < 4; n++) {
1565 if (sc->led_delay_on[n] || sc->led_delay_off[n]) {
Frank Praznik9b2b5c92014-11-12 14:10:09 -05001566 report->led[3 - n].duty_off = sc->led_delay_off[n];
1567 report->led[3 - n].duty_on = sc->led_delay_on[n];
Frank Praznikb3ed4582014-04-14 10:11:36 -04001568 }
1569 }
1570
Frank Praznik9b2b5c92014-11-12 14:10:09 -05001571 hid_hw_raw_request(sc->hdev, report->report_id, (__u8 *)report,
1572 sizeof(struct sixaxis_output_report),
1573 HID_OUTPUT_REPORT, HID_REQ_SET_REPORT);
Sven Eckelmann9f323b62013-11-17 20:38:21 +01001574}
1575
Frank Praznik0bd88dd2014-01-11 15:12:42 -05001576static void dualshock4_state_worker(struct work_struct *work)
1577{
1578 struct sony_sc *sc = container_of(work, struct sony_sc, state_worker);
Frank Praznik0da8ea62014-01-16 21:42:51 -05001579 struct hid_device *hdev = sc->hdev;
Frank Praznik9b2b5c92014-11-12 14:10:09 -05001580 __u8 *buf = sc->output_report_dmabuf;
Frank Praznik48220232014-02-05 20:03:44 -05001581 int offset;
Frank Praznik0da8ea62014-01-16 21:42:51 -05001582
Frank Praznikfdcf105d2014-02-05 20:03:46 -05001583 if (sc->quirks & DUALSHOCK4_CONTROLLER_USB) {
Frank Praznik9b2b5c92014-11-12 14:10:09 -05001584 memset(buf, 0, DS4_REPORT_0x05_SIZE);
Frank Praznikfdcf105d2014-02-05 20:03:46 -05001585 buf[0] = 0x05;
Frank Praznikb3ed4582014-04-14 10:11:36 -04001586 buf[1] = 0xFF;
Frank Praznikfdcf105d2014-02-05 20:03:46 -05001587 offset = 4;
1588 } else {
Frank Praznik9b2b5c92014-11-12 14:10:09 -05001589 memset(buf, 0, DS4_REPORT_0x11_SIZE);
Frank Praznikfdcf105d2014-02-05 20:03:46 -05001590 buf[0] = 0x11;
1591 buf[1] = 0xB0;
1592 buf[3] = 0x0F;
1593 offset = 6;
1594 }
Frank Praznik0bd88dd2014-01-11 15:12:42 -05001595
1596#ifdef CONFIG_SONY_FF
Frank Praznik48220232014-02-05 20:03:44 -05001597 buf[offset++] = sc->right;
1598 buf[offset++] = sc->left;
1599#else
1600 offset += 2;
Frank Praznik0bd88dd2014-01-11 15:12:42 -05001601#endif
1602
Frank Praznikb3ed4582014-04-14 10:11:36 -04001603 /* LED 3 is the global control */
1604 if (sc->led_state[3]) {
1605 buf[offset++] = sc->led_state[0];
1606 buf[offset++] = sc->led_state[1];
1607 buf[offset++] = sc->led_state[2];
1608 } else {
1609 offset += 3;
1610 }
1611
1612 /* If both delay values are zero the DualShock 4 disables blinking. */
1613 buf[offset++] = sc->led_delay_on[3];
1614 buf[offset++] = sc->led_delay_off[3];
Frank Praznik60781cf2014-01-11 15:13:15 -05001615
Frank Praznikfdcf105d2014-02-05 20:03:46 -05001616 if (sc->quirks & DUALSHOCK4_CONTROLLER_USB)
Frank Praznik9b2b5c92014-11-12 14:10:09 -05001617 hid_hw_output_report(hdev, buf, DS4_REPORT_0x05_SIZE);
Frank Praznikfdcf105d2014-02-05 20:03:46 -05001618 else
Frank Praznik9b2b5c92014-11-12 14:10:09 -05001619 hid_hw_raw_request(hdev, 0x11, buf, DS4_REPORT_0x11_SIZE,
Frank Praznikfdcf105d2014-02-05 20:03:46 -05001620 HID_OUTPUT_REPORT, HID_REQ_SET_REPORT);
Frank Praznik0bd88dd2014-01-11 15:12:42 -05001621}
1622
Frank Praznik9b2b5c92014-11-12 14:10:09 -05001623static int sony_allocate_output_report(struct sony_sc *sc)
1624{
1625 if (sc->quirks & SIXAXIS_CONTROLLER)
1626 sc->output_report_dmabuf =
1627 kmalloc(sizeof(union sixaxis_output_report_01),
1628 GFP_KERNEL);
1629 else if (sc->quirks & DUALSHOCK4_CONTROLLER_BT)
1630 sc->output_report_dmabuf = kmalloc(DS4_REPORT_0x11_SIZE,
1631 GFP_KERNEL);
1632 else if (sc->quirks & DUALSHOCK4_CONTROLLER_USB)
1633 sc->output_report_dmabuf = kmalloc(DS4_REPORT_0x05_SIZE,
1634 GFP_KERNEL);
1635 else
1636 return 0;
1637
1638 if (!sc->output_report_dmabuf)
1639 return -ENOMEM;
1640
1641 return 0;
1642}
1643
Sven Eckelmann0a286ef2013-11-19 20:26:32 +01001644#ifdef CONFIG_SONY_FF
Sven Eckelmann9f323b62013-11-17 20:38:21 +01001645static int sony_play_effect(struct input_dev *dev, void *data,
1646 struct ff_effect *effect)
1647{
Sven Eckelmanna08c22c2013-11-09 19:25:57 +01001648 struct hid_device *hid = input_get_drvdata(dev);
Sven Eckelmann9f323b62013-11-17 20:38:21 +01001649 struct sony_sc *sc = hid_get_drvdata(hid);
Sven Eckelmanna08c22c2013-11-09 19:25:57 +01001650
1651 if (effect->type != FF_RUMBLE)
1652 return 0;
1653
Sven Eckelmann9f323b62013-11-17 20:38:21 +01001654 sc->left = effect->u.rumble.strong_magnitude / 256;
Frank Praznik0bd88dd2014-01-11 15:12:42 -05001655 sc->right = effect->u.rumble.weak_magnitude / 256;
Sven Eckelmanna08c22c2013-11-09 19:25:57 +01001656
Sven Eckelmann92b5c412013-11-19 20:26:28 +01001657 schedule_work(&sc->state_worker);
Sven Eckelmann9f323b62013-11-17 20:38:21 +01001658 return 0;
Sven Eckelmanna08c22c2013-11-09 19:25:57 +01001659}
1660
Frank Praznikfa57a812014-04-14 10:11:33 -04001661static int sony_init_ff(struct sony_sc *sc)
Sven Eckelmanna08c22c2013-11-09 19:25:57 +01001662{
Frank Praznikfa57a812014-04-14 10:11:33 -04001663 struct hid_input *hidinput = list_entry(sc->hdev->inputs.next,
Sven Eckelmanna08c22c2013-11-09 19:25:57 +01001664 struct hid_input, list);
1665 struct input_dev *input_dev = hidinput->input;
1666
1667 input_set_capability(input_dev, EV_FF, FF_RUMBLE);
1668 return input_ff_create_memless(input_dev, NULL, sony_play_effect);
1669}
1670
1671#else
Frank Praznikfa57a812014-04-14 10:11:33 -04001672static int sony_init_ff(struct sony_sc *sc)
Sven Eckelmanna08c22c2013-11-09 19:25:57 +01001673{
1674 return 0;
1675}
Sven Eckelmann9f323b62013-11-17 20:38:21 +01001676
Sven Eckelmanna08c22c2013-11-09 19:25:57 +01001677#endif
1678
Frank Praznikd902f472014-01-27 10:17:36 -05001679static int sony_battery_get_property(struct power_supply *psy,
1680 enum power_supply_property psp,
1681 union power_supply_propval *val)
Frank Praznikc4e1ddf2014-01-17 14:46:26 -05001682{
Frank Praznikd902f472014-01-27 10:17:36 -05001683 struct sony_sc *sc = container_of(psy, struct sony_sc, battery);
1684 unsigned long flags;
1685 int ret = 0;
1686 u8 battery_charging, battery_capacity, cable_state;
1687
1688 spin_lock_irqsave(&sc->lock, flags);
1689 battery_charging = sc->battery_charging;
1690 battery_capacity = sc->battery_capacity;
1691 cable_state = sc->cable_state;
1692 spin_unlock_irqrestore(&sc->lock, flags);
1693
1694 switch (psp) {
1695 case POWER_SUPPLY_PROP_PRESENT:
1696 val->intval = 1;
1697 break;
1698 case POWER_SUPPLY_PROP_SCOPE:
1699 val->intval = POWER_SUPPLY_SCOPE_DEVICE;
1700 break;
1701 case POWER_SUPPLY_PROP_CAPACITY:
1702 val->intval = battery_capacity;
1703 break;
1704 case POWER_SUPPLY_PROP_STATUS:
1705 if (battery_charging)
1706 val->intval = POWER_SUPPLY_STATUS_CHARGING;
1707 else
1708 if (battery_capacity == 100 && cable_state)
1709 val->intval = POWER_SUPPLY_STATUS_FULL;
1710 else
1711 val->intval = POWER_SUPPLY_STATUS_DISCHARGING;
1712 break;
1713 default:
1714 ret = -EINVAL;
1715 break;
1716 }
1717 return ret;
1718}
1719
1720static int sony_battery_probe(struct sony_sc *sc)
1721{
Frank Praznikc4e1ddf2014-01-17 14:46:26 -05001722 struct hid_device *hdev = sc->hdev;
Frank Praznikd902f472014-01-27 10:17:36 -05001723 int ret;
Frank Praznikc4e1ddf2014-01-17 14:46:26 -05001724
Frank Praznikad142b92014-02-20 11:36:00 -05001725 /*
1726 * Set the default battery level to 100% to avoid low battery warnings
Frank Praznikd9a293a2014-02-05 20:03:48 -05001727 * if the battery is polled before the first device report is received.
1728 */
1729 sc->battery_capacity = 100;
Frank Praznikc4e1ddf2014-01-17 14:46:26 -05001730
Frank Praznikd902f472014-01-27 10:17:36 -05001731 sc->battery.properties = sony_battery_props;
1732 sc->battery.num_properties = ARRAY_SIZE(sony_battery_props);
1733 sc->battery.get_property = sony_battery_get_property;
1734 sc->battery.type = POWER_SUPPLY_TYPE_BATTERY;
1735 sc->battery.use_for_apm = 0;
Frank Praznik314531f2014-04-14 10:11:34 -04001736 sc->battery.name = kasprintf(GFP_KERNEL, "sony_controller_battery_%pMR",
1737 sc->mac_address);
Frank Praznikd902f472014-01-27 10:17:36 -05001738 if (!sc->battery.name)
1739 return -ENOMEM;
1740
1741 ret = power_supply_register(&hdev->dev, &sc->battery);
1742 if (ret) {
1743 hid_err(hdev, "Unable to register battery device\n");
1744 goto err_free;
1745 }
1746
1747 power_supply_powers(&sc->battery, &hdev->dev);
1748 return 0;
1749
1750err_free:
1751 kfree(sc->battery.name);
1752 sc->battery.name = NULL;
1753 return ret;
1754}
1755
1756static void sony_battery_remove(struct sony_sc *sc)
1757{
1758 if (!sc->battery.name)
1759 return;
1760
1761 power_supply_unregister(&sc->battery);
1762 kfree(sc->battery.name);
1763 sc->battery.name = NULL;
1764}
1765
Frank Praznikd2d782f2014-02-20 11:36:03 -05001766/*
1767 * If a controller is plugged in via USB while already connected via Bluetooth
1768 * it will show up as two devices. A global list of connected controllers and
1769 * their MAC addresses is maintained to ensure that a device is only connected
1770 * once.
1771 */
1772static int sony_check_add_dev_list(struct sony_sc *sc)
1773{
1774 struct sony_sc *entry;
1775 unsigned long flags;
1776 int ret;
1777
1778 spin_lock_irqsave(&sony_dev_list_lock, flags);
1779
1780 list_for_each_entry(entry, &sony_device_list, list_node) {
1781 ret = memcmp(sc->mac_address, entry->mac_address,
1782 sizeof(sc->mac_address));
1783 if (!ret) {
1784 ret = -EEXIST;
1785 hid_info(sc->hdev, "controller with MAC address %pMR already connected\n",
1786 sc->mac_address);
1787 goto unlock;
Frank Praznikc4e1ddf2014-01-17 14:46:26 -05001788 }
1789 }
1790
Frank Praznikd2d782f2014-02-20 11:36:03 -05001791 ret = 0;
1792 list_add(&(sc->list_node), &sony_device_list);
Frank Praznikc4e1ddf2014-01-17 14:46:26 -05001793
Frank Praznikd2d782f2014-02-20 11:36:03 -05001794unlock:
1795 spin_unlock_irqrestore(&sony_dev_list_lock, flags);
1796 return ret;
Frank Praznikc4e1ddf2014-01-17 14:46:26 -05001797}
1798
Frank Praznikd2d782f2014-02-20 11:36:03 -05001799static void sony_remove_dev_list(struct sony_sc *sc)
1800{
1801 unsigned long flags;
1802
1803 if (sc->list_node.next) {
1804 spin_lock_irqsave(&sony_dev_list_lock, flags);
1805 list_del(&(sc->list_node));
1806 spin_unlock_irqrestore(&sony_dev_list_lock, flags);
1807 }
1808}
1809
1810static int sony_get_bt_devaddr(struct sony_sc *sc)
1811{
1812 int ret;
1813
1814 /* HIDP stores the device MAC address as a string in the uniq field. */
1815 ret = strlen(sc->hdev->uniq);
1816 if (ret != 17)
1817 return -EINVAL;
1818
1819 ret = sscanf(sc->hdev->uniq,
1820 "%02hhx:%02hhx:%02hhx:%02hhx:%02hhx:%02hhx",
1821 &sc->mac_address[5], &sc->mac_address[4], &sc->mac_address[3],
1822 &sc->mac_address[2], &sc->mac_address[1], &sc->mac_address[0]);
1823
1824 if (ret != 6)
1825 return -EINVAL;
1826
1827 return 0;
1828}
1829
1830static int sony_check_add(struct sony_sc *sc)
1831{
Frank Praznik9b2b5c92014-11-12 14:10:09 -05001832 __u8 *buf = NULL;
Frank Praznikd2d782f2014-02-20 11:36:03 -05001833 int n, ret;
1834
1835 if ((sc->quirks & DUALSHOCK4_CONTROLLER_BT) ||
1836 (sc->quirks & SIXAXIS_CONTROLLER_BT)) {
1837 /*
1838 * sony_get_bt_devaddr() attempts to parse the Bluetooth MAC
1839 * address from the uniq string where HIDP stores it.
1840 * As uniq cannot be guaranteed to be a MAC address in all cases
1841 * a failure of this function should not prevent the connection.
1842 */
1843 if (sony_get_bt_devaddr(sc) < 0) {
1844 hid_warn(sc->hdev, "UNIQ does not contain a MAC address; duplicate check skipped\n");
1845 return 0;
1846 }
1847 } else if (sc->quirks & DUALSHOCK4_CONTROLLER_USB) {
Frank Praznik9b2b5c92014-11-12 14:10:09 -05001848 buf = kmalloc(DS4_REPORT_0x81_SIZE, GFP_KERNEL);
1849 if (!buf)
1850 return -ENOMEM;
Frank Praznikd2d782f2014-02-20 11:36:03 -05001851
1852 /*
1853 * The MAC address of a DS4 controller connected via USB can be
1854 * retrieved with feature report 0x81. The address begins at
1855 * offset 1.
1856 */
Frank Praznik9b2b5c92014-11-12 14:10:09 -05001857 ret = hid_hw_raw_request(sc->hdev, 0x81, buf,
1858 DS4_REPORT_0x81_SIZE, HID_FEATURE_REPORT,
1859 HID_REQ_GET_REPORT);
Frank Praznikd2d782f2014-02-20 11:36:03 -05001860
Frank Praznik9b2b5c92014-11-12 14:10:09 -05001861 if (ret != DS4_REPORT_0x81_SIZE) {
Frank Praznikd2d782f2014-02-20 11:36:03 -05001862 hid_err(sc->hdev, "failed to retrieve feature report 0x81 with the DualShock 4 MAC address\n");
Frank Praznik9b2b5c92014-11-12 14:10:09 -05001863 ret = ret < 0 ? ret : -EINVAL;
1864 goto out_free;
Frank Praznikd2d782f2014-02-20 11:36:03 -05001865 }
1866
1867 memcpy(sc->mac_address, &buf[1], sizeof(sc->mac_address));
1868 } else if (sc->quirks & SIXAXIS_CONTROLLER_USB) {
Frank Praznik9b2b5c92014-11-12 14:10:09 -05001869 buf = kmalloc(SIXAXIS_REPORT_0xF2_SIZE, GFP_KERNEL);
1870 if (!buf)
1871 return -ENOMEM;
Frank Praznikd2d782f2014-02-20 11:36:03 -05001872
1873 /*
1874 * The MAC address of a Sixaxis controller connected via USB can
1875 * be retrieved with feature report 0xf2. The address begins at
1876 * offset 4.
1877 */
Frank Praznik9b2b5c92014-11-12 14:10:09 -05001878 ret = hid_hw_raw_request(sc->hdev, 0xf2, buf,
1879 SIXAXIS_REPORT_0xF2_SIZE, HID_FEATURE_REPORT,
1880 HID_REQ_GET_REPORT);
Frank Praznikd2d782f2014-02-20 11:36:03 -05001881
Frank Praznik9b2b5c92014-11-12 14:10:09 -05001882 if (ret != SIXAXIS_REPORT_0xF2_SIZE) {
Frank Praznikd2d782f2014-02-20 11:36:03 -05001883 hid_err(sc->hdev, "failed to retrieve feature report 0xf2 with the Sixaxis MAC address\n");
Frank Praznik9b2b5c92014-11-12 14:10:09 -05001884 ret = ret < 0 ? ret : -EINVAL;
1885 goto out_free;
Frank Praznikd2d782f2014-02-20 11:36:03 -05001886 }
1887
1888 /*
1889 * The Sixaxis device MAC in the report is big-endian and must
1890 * be byte-swapped.
1891 */
1892 for (n = 0; n < 6; n++)
1893 sc->mac_address[5-n] = buf[4+n];
1894 } else {
1895 return 0;
1896 }
1897
Frank Praznik9b2b5c92014-11-12 14:10:09 -05001898 ret = sony_check_add_dev_list(sc);
1899
1900out_free:
1901
1902 kfree(buf);
1903
1904 return ret;
Frank Praznikd2d782f2014-02-20 11:36:03 -05001905}
1906
Frank Praznik80250872014-04-14 10:11:35 -04001907static int sony_set_device_id(struct sony_sc *sc)
1908{
1909 int ret;
1910
1911 /*
1912 * Only DualShock 4 or Sixaxis controllers get an id.
1913 * All others are set to -1.
1914 */
1915 if ((sc->quirks & SIXAXIS_CONTROLLER) ||
1916 (sc->quirks & DUALSHOCK4_CONTROLLER)) {
1917 ret = ida_simple_get(&sony_device_id_allocator, 0, 0,
1918 GFP_KERNEL);
1919 if (ret < 0) {
1920 sc->device_id = -1;
1921 return ret;
1922 }
1923 sc->device_id = ret;
1924 } else {
1925 sc->device_id = -1;
1926 }
1927
1928 return 0;
1929}
1930
1931static void sony_release_device_id(struct sony_sc *sc)
1932{
1933 if (sc->device_id >= 0) {
1934 ida_simple_remove(&sony_device_id_allocator, sc->device_id);
1935 sc->device_id = -1;
1936 }
1937}
1938
Frank Praznik46262042014-04-14 10:11:31 -04001939static inline void sony_init_work(struct sony_sc *sc,
1940 void (*worker)(struct work_struct *))
1941{
1942 if (!sc->worker_initialized)
1943 INIT_WORK(&sc->state_worker, worker);
1944
1945 sc->worker_initialized = 1;
1946}
1947
1948static inline void sony_cancel_work_sync(struct sony_sc *sc)
1949{
1950 if (sc->worker_initialized)
1951 cancel_work_sync(&sc->state_worker);
1952}
Frank Praznikd2d782f2014-02-20 11:36:03 -05001953
Jiri Slabybd28ce02008-06-25 23:47:04 +02001954static int sony_probe(struct hid_device *hdev, const struct hid_device_id *id)
1955{
1956 int ret;
Jiri Kosinacc6e0bb2008-10-23 12:58:38 +02001957 unsigned long quirks = id->driver_data;
1958 struct sony_sc *sc;
Colin Leitnerf04d5142013-05-27 23:41:05 +02001959 unsigned int connect_mask = HID_CONNECT_DEFAULT;
Jiri Kosinacc6e0bb2008-10-23 12:58:38 +02001960
Benjamin Tissoiresabf832b2013-07-24 19:38:04 +02001961 sc = devm_kzalloc(&hdev->dev, sizeof(*sc), GFP_KERNEL);
Jiri Kosinacc6e0bb2008-10-23 12:58:38 +02001962 if (sc == NULL) {
Joe Perches4291ee32010-12-09 19:29:03 -08001963 hid_err(hdev, "can't alloc sony descriptor\n");
Jiri Kosinacc6e0bb2008-10-23 12:58:38 +02001964 return -ENOMEM;
1965 }
1966
1967 sc->quirks = quirks;
1968 hid_set_drvdata(hdev, sc);
Sven Eckelmann0a286ef2013-11-19 20:26:32 +01001969 sc->hdev = hdev;
Jiri Slabybd28ce02008-06-25 23:47:04 +02001970
Jiri Slabybd28ce02008-06-25 23:47:04 +02001971 ret = hid_parse(hdev);
1972 if (ret) {
Joe Perches4291ee32010-12-09 19:29:03 -08001973 hid_err(hdev, "parse failed\n");
Benjamin Tissoiresabf832b2013-07-24 19:38:04 +02001974 return ret;
Jiri Slabybd28ce02008-06-25 23:47:04 +02001975 }
1976
Colin Leitnerf04d5142013-05-27 23:41:05 +02001977 if (sc->quirks & VAIO_RDESC_CONSTANT)
1978 connect_mask |= HID_CONNECT_HIDDEV_FORCE;
Antonio Ospite50764652014-06-24 13:28:40 +02001979 else if (sc->quirks & SIXAXIS_CONTROLLER)
Colin Leitnerf04d5142013-05-27 23:41:05 +02001980 connect_mask |= HID_CONNECT_HIDDEV_FORCE;
1981
1982 ret = hid_hw_start(hdev, connect_mask);
Jiri Slabybd28ce02008-06-25 23:47:04 +02001983 if (ret) {
Joe Perches4291ee32010-12-09 19:29:03 -08001984 hid_err(hdev, "hw start failed\n");
Benjamin Tissoiresabf832b2013-07-24 19:38:04 +02001985 return ret;
Jiri Slabybd28ce02008-06-25 23:47:04 +02001986 }
1987
Frank Praznik9b2b5c92014-11-12 14:10:09 -05001988 ret = sony_allocate_output_report(sc);
1989 if (ret < 0) {
1990 hid_err(hdev, "failed to allocate the output report buffer\n");
1991 goto err_stop;
1992 }
1993
Frank Praznik80250872014-04-14 10:11:35 -04001994 ret = sony_set_device_id(sc);
1995 if (ret < 0) {
1996 hid_err(hdev, "failed to allocate the device id\n");
1997 goto err_stop;
1998 }
1999
Antonio Ospite569b10a2010-10-19 16:13:10 +02002000 if (sc->quirks & SIXAXIS_CONTROLLER_USB) {
Benjamin Tissoirese534a932014-03-08 22:52:42 -05002001 /*
2002 * The Sony Sixaxis does not handle HID Output Reports on the
2003 * Interrupt EP like it could, so we need to force HID Output
2004 * Reports to use HID_REQ_SET_REPORT on the Control EP.
2005 *
2006 * There is also another issue about HID Output Reports via USB,
2007 * the Sixaxis does not want the report_id as part of the data
2008 * packet, so we have to discard buf[0] when sending the actual
2009 * control message, even for numbered reports, humpf!
2010 */
2011 hdev->quirks |= HID_QUIRK_NO_OUTPUT_REPORTS_ON_INTR_EP;
2012 hdev->quirks |= HID_QUIRK_SKIP_OUTPUT_REPORT_ID;
Antonio Ospite816651a2010-05-03 22:15:55 +02002013 ret = sixaxis_set_operational_usb(hdev);
Frank Praznik46262042014-04-14 10:11:31 -04002014 sony_init_work(sc, sixaxis_state_worker);
Frank Praznikfee4e2d2014-02-18 17:22:01 -05002015 } else if (sc->quirks & SIXAXIS_CONTROLLER_BT) {
Frank Praznik2078b9bb2014-03-15 09:41:16 -04002016 /*
2017 * The Sixaxis wants output reports sent on the ctrl endpoint
2018 * when connected via Bluetooth.
2019 */
2020 hdev->quirks |= HID_QUIRK_NO_OUTPUT_REPORTS_ON_INTR_EP;
Antonio Ospite816651a2010-05-03 22:15:55 +02002021 ret = sixaxis_set_operational_bt(hdev);
Frank Praznik46262042014-04-14 10:11:31 -04002022 sony_init_work(sc, sixaxis_state_worker);
Frank Praznikfee4e2d2014-02-18 17:22:01 -05002023 } else if (sc->quirks & DUALSHOCK4_CONTROLLER) {
Frank Praznik68330d82014-02-05 20:03:49 -05002024 if (sc->quirks & DUALSHOCK4_CONTROLLER_BT) {
Frank Praznik2078b9bb2014-03-15 09:41:16 -04002025 /*
2026 * The DualShock 4 wants output reports sent on the ctrl
2027 * endpoint when connected via Bluetooth.
2028 */
2029 hdev->quirks |= HID_QUIRK_NO_OUTPUT_REPORTS_ON_INTR_EP;
Frank Praznik68330d82014-02-05 20:03:49 -05002030 ret = dualshock4_set_operational_bt(hdev);
2031 if (ret < 0) {
2032 hid_err(hdev, "failed to set the Dualshock 4 operational mode\n");
2033 goto err_stop;
2034 }
2035 }
Frank Praznikc4e1ddf2014-01-17 14:46:26 -05002036
Frank Praznik46262042014-04-14 10:11:31 -04002037 sony_init_work(sc, dualshock4_state_worker);
Frank Praznik0bd88dd2014-01-11 15:12:42 -05002038 } else {
2039 ret = 0;
2040 }
Bastien Noceraf9ce7c22010-01-20 12:01:53 +00002041
Jiri Kosina4dfdc462008-12-30 00:49:59 +01002042 if (ret < 0)
Jiri Slabybd28ce02008-06-25 23:47:04 +02002043 goto err_stop;
2044
Frank Praznikd2d782f2014-02-20 11:36:03 -05002045 ret = sony_check_add(sc);
2046 if (ret < 0)
2047 goto err_stop;
2048
Sven Eckelmann0a286ef2013-11-19 20:26:32 +01002049 if (sc->quirks & SONY_LED_SUPPORT) {
Frank Praznikfa57a812014-04-14 10:11:33 -04002050 ret = sony_leds_init(sc);
Sven Eckelmann0a286ef2013-11-19 20:26:32 +01002051 if (ret < 0)
2052 goto err_stop;
2053 }
2054
Frank Praznikd902f472014-01-27 10:17:36 -05002055 if (sc->quirks & SONY_BATTERY_SUPPORT) {
2056 ret = sony_battery_probe(sc);
2057 if (ret < 0)
2058 goto err_stop;
2059
2060 /* Open the device to receive reports with battery info */
2061 ret = hid_hw_open(hdev);
2062 if (ret < 0) {
2063 hid_err(hdev, "hw open failed\n");
2064 goto err_stop;
2065 }
2066 }
2067
Frank Praznikc8de9db2014-02-20 11:36:01 -05002068 if (sc->quirks & SONY_FF_SUPPORT) {
Frank Praznikfa57a812014-04-14 10:11:33 -04002069 ret = sony_init_ff(sc);
Frank Praznikc8de9db2014-02-20 11:36:01 -05002070 if (ret < 0)
2071 goto err_close;
Frank Praznik5f5750d2014-02-19 13:09:22 -05002072 }
Sven Eckelmanna08c22c2013-11-09 19:25:57 +01002073
Jiri Slabybd28ce02008-06-25 23:47:04 +02002074 return 0;
Frank Praznikd902f472014-01-27 10:17:36 -05002075err_close:
2076 hid_hw_close(hdev);
Jiri Slabybd28ce02008-06-25 23:47:04 +02002077err_stop:
Sven Eckelmann0a286ef2013-11-19 20:26:32 +01002078 if (sc->quirks & SONY_LED_SUPPORT)
Frank Praznikfa57a812014-04-14 10:11:33 -04002079 sony_leds_remove(sc);
Frank Praznikd902f472014-01-27 10:17:36 -05002080 if (sc->quirks & SONY_BATTERY_SUPPORT)
2081 sony_battery_remove(sc);
Frank Praznik46262042014-04-14 10:11:31 -04002082 sony_cancel_work_sync(sc);
Frank Praznik9b2b5c92014-11-12 14:10:09 -05002083 kfree(sc->output_report_dmabuf);
Frank Praznikd2d782f2014-02-20 11:36:03 -05002084 sony_remove_dev_list(sc);
Frank Praznik80250872014-04-14 10:11:35 -04002085 sony_release_device_id(sc);
Jiri Slabybd28ce02008-06-25 23:47:04 +02002086 hid_hw_stop(hdev);
Jiri Slabybd28ce02008-06-25 23:47:04 +02002087 return ret;
2088}
2089
Jiri Kosinacc6e0bb2008-10-23 12:58:38 +02002090static void sony_remove(struct hid_device *hdev)
2091{
Colin Leitnerf04d5142013-05-27 23:41:05 +02002092 struct sony_sc *sc = hid_get_drvdata(hdev);
2093
Sven Eckelmann0a286ef2013-11-19 20:26:32 +01002094 if (sc->quirks & SONY_LED_SUPPORT)
Frank Praznikfa57a812014-04-14 10:11:33 -04002095 sony_leds_remove(sc);
Colin Leitnerf04d5142013-05-27 23:41:05 +02002096
Frank Praznikd902f472014-01-27 10:17:36 -05002097 if (sc->quirks & SONY_BATTERY_SUPPORT) {
2098 hid_hw_close(hdev);
2099 sony_battery_remove(sc);
2100 }
2101
Frank Praznik46262042014-04-14 10:11:31 -04002102 sony_cancel_work_sync(sc);
Sven Eckelmann9f323b62013-11-17 20:38:21 +01002103
Frank Praznik9b2b5c92014-11-12 14:10:09 -05002104 kfree(sc->output_report_dmabuf);
2105
Frank Praznikd2d782f2014-02-20 11:36:03 -05002106 sony_remove_dev_list(sc);
Jiri Slabybd28ce02008-06-25 23:47:04 +02002107
Frank Praznik80250872014-04-14 10:11:35 -04002108 sony_release_device_id(sc);
2109
Jiri Slabybd28ce02008-06-25 23:47:04 +02002110 hid_hw_stop(hdev);
2111}
2112
2113static const struct hid_device_id sony_devices[] = {
2114 { HID_USB_DEVICE(USB_VENDOR_ID_SONY, USB_DEVICE_ID_SONY_PS3_CONTROLLER),
2115 .driver_data = SIXAXIS_CONTROLLER_USB },
2116 { HID_USB_DEVICE(USB_VENDOR_ID_SONY, USB_DEVICE_ID_SONY_NAVIGATION_CONTROLLER),
2117 .driver_data = SIXAXIS_CONTROLLER_USB },
2118 { HID_BLUETOOTH_DEVICE(USB_VENDOR_ID_SONY, USB_DEVICE_ID_SONY_PS3_CONTROLLER),
2119 .driver_data = SIXAXIS_CONTROLLER_BT },
2120 { HID_USB_DEVICE(USB_VENDOR_ID_SONY, USB_DEVICE_ID_SONY_VAIO_VGX_MOUSE),
2121 .driver_data = VAIO_RDESC_CONSTANT },
2122 { HID_USB_DEVICE(USB_VENDOR_ID_SONY, USB_DEVICE_ID_SONY_VAIO_VGP_MOUSE),
2123 .driver_data = VAIO_RDESC_CONSTANT },
2124 /* Wired Buzz Controller. Reported as Sony Hub from its USB ID and as
2125 * Logitech joystick from the device descriptor. */
2126 { HID_USB_DEVICE(USB_VENDOR_ID_SONY, USB_DEVICE_ID_SONY_BUZZ_CONTROLLER),
2127 .driver_data = BUZZ_CONTROLLER },
2128 { HID_USB_DEVICE(USB_VENDOR_ID_SONY, USB_DEVICE_ID_SONY_WIRELESS_BUZZ_CONTROLLER),
2129 .driver_data = BUZZ_CONTROLLER },
2130 /* PS3 BD Remote Control */
2131 { HID_BLUETOOTH_DEVICE(USB_VENDOR_ID_SONY, USB_DEVICE_ID_SONY_PS3_BDREMOTE),
2132 .driver_data = PS3REMOTE },
2133 /* Logitech Harmony Adapter for PS3 */
2134 { HID_BLUETOOTH_DEVICE(USB_VENDOR_ID_LOGITECH, USB_DEVICE_ID_LOGITECH_HARMONY_PS3),
2135 .driver_data = PS3REMOTE },
Frank Praznik68a49e52014-11-12 14:52:28 -05002136 /* SMK-Link PS3 BD Remote Control */
2137 { HID_BLUETOOTH_DEVICE(USB_VENDOR_ID_SMK, USB_DEVICE_ID_SMK_PS3_BDREMOTE),
2138 .driver_data = PS3REMOTE },
Frank Praznik0bd88dd2014-01-11 15:12:42 -05002139 /* Sony Dualshock 4 controllers for PS4 */
2140 { HID_USB_DEVICE(USB_VENDOR_ID_SONY, USB_DEVICE_ID_SONY_PS4_CONTROLLER),
Frank Praznik8ab16762014-01-16 21:42:31 -05002141 .driver_data = DUALSHOCK4_CONTROLLER_USB },
Frank Praznik0bd88dd2014-01-11 15:12:42 -05002142 { HID_BLUETOOTH_DEVICE(USB_VENDOR_ID_SONY, USB_DEVICE_ID_SONY_PS4_CONTROLLER),
Frank Praznik8ab16762014-01-16 21:42:31 -05002143 .driver_data = DUALSHOCK4_CONTROLLER_BT },
Jiri Slabybd28ce02008-06-25 23:47:04 +02002144 { }
2145};
2146MODULE_DEVICE_TABLE(hid, sony_devices);
2147
2148static struct hid_driver sony_driver = {
Frank Praznikce8efc32014-09-18 21:15:01 -04002149 .name = "sony",
2150 .id_table = sony_devices,
2151 .input_mapping = sony_mapping,
2152 .input_configured = sony_input_configured,
2153 .probe = sony_probe,
2154 .remove = sony_remove,
2155 .report_fixup = sony_report_fixup,
2156 .raw_event = sony_raw_event
Jiri Slabybd28ce02008-06-25 23:47:04 +02002157};
Frank Praznik80250872014-04-14 10:11:35 -04002158
2159static int __init sony_init(void)
2160{
2161 dbg_hid("Sony:%s\n", __func__);
2162
2163 return hid_register_driver(&sony_driver);
2164}
2165
2166static void __exit sony_exit(void)
2167{
2168 dbg_hid("Sony:%s\n", __func__);
2169
2170 ida_destroy(&sony_device_id_allocator);
2171 hid_unregister_driver(&sony_driver);
2172}
2173module_init(sony_init);
2174module_exit(sony_exit);
Jiri Slabybd28ce02008-06-25 23:47:04 +02002175
2176MODULE_LICENSE("GPL");