blob: b41356cacc14d8820120de984e7f17792491252c [file] [log] [blame]
Jiri Slabybd28ce02008-06-25 23:47:04 +02001/*
Jiri Kosina078328d2013-06-13 12:03:49 +02002 * HID driver for Sony / PS2 / PS3 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>
Jiri Slabybd28ce02008-06-25 23:47:04 +020011 */
12
13/*
14 * This program is free software; you can redistribute it and/or modify it
15 * under the terms of the GNU General Public License as published by the Free
16 * Software Foundation; either version 2 of the License, or (at your option)
17 * any later version.
18 */
19
Frank Praznikad142b92014-02-20 11:36:00 -050020/*
21 * NOTE: in order for the Sony PS3 BD Remote Control to be found by
Jiri Kosina078328d2013-06-13 12:03:49 +020022 * a Bluetooth host, the key combination Start+Enter has to be kept pressed
23 * for about 7 seconds with the Bluetooth Host Controller in discovering mode.
24 *
25 * There will be no PIN request from the device.
26 */
27
Jiri Slabybd28ce02008-06-25 23:47:04 +020028#include <linux/device.h>
29#include <linux/hid.h>
30#include <linux/module.h>
Tejun Heo5a0e3ad2010-03-24 17:04:11 +090031#include <linux/slab.h>
Jiri Kosina40e32ee2013-05-28 11:22:09 +020032#include <linux/leds.h>
Frank Praznikd902f472014-01-27 10:17:36 -050033#include <linux/power_supply.h>
34#include <linux/spinlock.h>
Frank Praznikd2d782f2014-02-20 11:36:03 -050035#include <linux/list.h>
Frank Praznik80250872014-04-14 10:11:35 -040036#include <linux/idr.h>
Frank Praznike5606232014-01-27 10:17:37 -050037#include <linux/input/mt.h>
Jiri Slabybd28ce02008-06-25 23:47:04 +020038
39#include "hid-ids.h"
40
Frank Praznik6c79c182014-01-16 21:43:03 -050041#define VAIO_RDESC_CONSTANT BIT(0)
42#define SIXAXIS_CONTROLLER_USB BIT(1)
43#define SIXAXIS_CONTROLLER_BT BIT(2)
44#define BUZZ_CONTROLLER BIT(3)
45#define PS3REMOTE BIT(4)
Frank Praznik8ab16762014-01-16 21:42:31 -050046#define DUALSHOCK4_CONTROLLER_USB BIT(5)
47#define DUALSHOCK4_CONTROLLER_BT BIT(6)
Jiri Kosinacc6e0bb2008-10-23 12:58:38 +020048
Frank Praznikfee4e2d2014-02-18 17:22:01 -050049#define SIXAXIS_CONTROLLER (SIXAXIS_CONTROLLER_USB | SIXAXIS_CONTROLLER_BT)
Frank Praznik68330d82014-02-05 20:03:49 -050050#define DUALSHOCK4_CONTROLLER (DUALSHOCK4_CONTROLLER_USB |\
51 DUALSHOCK4_CONTROLLER_BT)
Frank Praznikfee4e2d2014-02-18 17:22:01 -050052#define SONY_LED_SUPPORT (SIXAXIS_CONTROLLER | BUZZ_CONTROLLER |\
Frank Praznik68330d82014-02-05 20:03:49 -050053 DUALSHOCK4_CONTROLLER)
Frank Praznikfee4e2d2014-02-18 17:22:01 -050054#define SONY_BATTERY_SUPPORT (SIXAXIS_CONTROLLER | DUALSHOCK4_CONTROLLER)
Frank Praznikc8de9db2014-02-20 11:36:01 -050055#define SONY_FF_SUPPORT (SIXAXIS_CONTROLLER | DUALSHOCK4_CONTROLLER)
Frank Praznik60781cf2014-01-11 15:13:15 -050056
57#define MAX_LEDS 4
Sven Eckelmann0a286ef2013-11-19 20:26:32 +010058
Simon Wood61ab44b2011-06-10 12:00:26 +020059static const u8 sixaxis_rdesc_fixup[] = {
60 0x95, 0x13, 0x09, 0x01, 0x81, 0x02, 0x95, 0x0C,
61 0x81, 0x01, 0x75, 0x10, 0x95, 0x04, 0x26, 0xFF,
62 0x03, 0x46, 0xFF, 0x03, 0x09, 0x01, 0x81, 0x02
63};
64
Mauro Carvalho Chehabe57a67d2012-12-14 20:57:34 -020065static const u8 sixaxis_rdesc_fixup2[] = {
66 0x05, 0x01, 0x09, 0x04, 0xa1, 0x01, 0xa1, 0x02,
67 0x85, 0x01, 0x75, 0x08, 0x95, 0x01, 0x15, 0x00,
68 0x26, 0xff, 0x00, 0x81, 0x03, 0x75, 0x01, 0x95,
69 0x13, 0x15, 0x00, 0x25, 0x01, 0x35, 0x00, 0x45,
70 0x01, 0x05, 0x09, 0x19, 0x01, 0x29, 0x13, 0x81,
71 0x02, 0x75, 0x01, 0x95, 0x0d, 0x06, 0x00, 0xff,
72 0x81, 0x03, 0x15, 0x00, 0x26, 0xff, 0x00, 0x05,
73 0x01, 0x09, 0x01, 0xa1, 0x00, 0x75, 0x08, 0x95,
74 0x04, 0x35, 0x00, 0x46, 0xff, 0x00, 0x09, 0x30,
75 0x09, 0x31, 0x09, 0x32, 0x09, 0x35, 0x81, 0x02,
76 0xc0, 0x05, 0x01, 0x95, 0x13, 0x09, 0x01, 0x81,
77 0x02, 0x95, 0x0c, 0x81, 0x01, 0x75, 0x10, 0x95,
78 0x04, 0x26, 0xff, 0x03, 0x46, 0xff, 0x03, 0x09,
79 0x01, 0x81, 0x02, 0xc0, 0xa1, 0x02, 0x85, 0x02,
80 0x75, 0x08, 0x95, 0x30, 0x09, 0x01, 0xb1, 0x02,
81 0xc0, 0xa1, 0x02, 0x85, 0xee, 0x75, 0x08, 0x95,
82 0x30, 0x09, 0x01, 0xb1, 0x02, 0xc0, 0xa1, 0x02,
83 0x85, 0xef, 0x75, 0x08, 0x95, 0x30, 0x09, 0x01,
84 0xb1, 0x02, 0xc0, 0xc0,
85};
86
Frank Praznikad142b92014-02-20 11:36:00 -050087/*
88 * The default descriptor doesn't provide mapping for the accelerometers
Frank Praznik58d70272014-01-20 12:27:01 -050089 * or orientation sensors. This fixed descriptor maps the accelerometers
90 * to usage values 0x40, 0x41 and 0x42 and maps the orientation sensors
91 * to usage values 0x43, 0x44 and 0x45.
92 */
Frank Prazniked19d8c2014-01-16 21:43:12 -050093static u8 dualshock4_usb_rdesc[] = {
Frank Praznik58d70272014-01-20 12:27:01 -050094 0x05, 0x01, /* Usage Page (Desktop), */
95 0x09, 0x05, /* Usage (Gamepad), */
96 0xA1, 0x01, /* Collection (Application), */
97 0x85, 0x01, /* Report ID (1), */
98 0x09, 0x30, /* Usage (X), */
99 0x09, 0x31, /* Usage (Y), */
100 0x09, 0x32, /* Usage (Z), */
101 0x09, 0x35, /* Usage (Rz), */
102 0x15, 0x00, /* Logical Minimum (0), */
103 0x26, 0xFF, 0x00, /* Logical Maximum (255), */
104 0x75, 0x08, /* Report Size (8), */
105 0x95, 0x04, /* Report Count (4), */
106 0x81, 0x02, /* Input (Variable), */
107 0x09, 0x39, /* Usage (Hat Switch), */
108 0x15, 0x00, /* Logical Minimum (0), */
109 0x25, 0x07, /* Logical Maximum (7), */
110 0x35, 0x00, /* Physical Minimum (0), */
111 0x46, 0x3B, 0x01, /* Physical Maximum (315), */
112 0x65, 0x14, /* Unit (Degrees), */
113 0x75, 0x04, /* Report Size (4), */
114 0x95, 0x01, /* Report Count (1), */
115 0x81, 0x42, /* Input (Variable, Null State), */
116 0x65, 0x00, /* Unit, */
117 0x05, 0x09, /* Usage Page (Button), */
118 0x19, 0x01, /* Usage Minimum (01h), */
119 0x29, 0x0E, /* Usage Maximum (0Eh), */
120 0x15, 0x00, /* Logical Minimum (0), */
121 0x25, 0x01, /* Logical Maximum (1), */
122 0x75, 0x01, /* Report Size (1), */
123 0x95, 0x0E, /* Report Count (14), */
124 0x81, 0x02, /* Input (Variable), */
125 0x06, 0x00, 0xFF, /* Usage Page (FF00h), */
126 0x09, 0x20, /* Usage (20h), */
127 0x75, 0x06, /* Report Size (6), */
128 0x95, 0x01, /* Report Count (1), */
129 0x15, 0x00, /* Logical Minimum (0), */
130 0x25, 0x7F, /* Logical Maximum (127), */
131 0x81, 0x02, /* Input (Variable), */
132 0x05, 0x01, /* Usage Page (Desktop), */
133 0x09, 0x33, /* Usage (Rx), */
134 0x09, 0x34, /* Usage (Ry), */
135 0x15, 0x00, /* Logical Minimum (0), */
136 0x26, 0xFF, 0x00, /* Logical Maximum (255), */
137 0x75, 0x08, /* Report Size (8), */
138 0x95, 0x02, /* Report Count (2), */
139 0x81, 0x02, /* Input (Variable), */
140 0x06, 0x00, 0xFF, /* Usage Page (FF00h), */
141 0x09, 0x21, /* Usage (21h), */
142 0x95, 0x03, /* Report Count (3), */
143 0x81, 0x02, /* Input (Variable), */
144 0x05, 0x01, /* Usage Page (Desktop), */
145 0x19, 0x40, /* Usage Minimum (40h), */
146 0x29, 0x42, /* Usage Maximum (42h), */
147 0x16, 0x00, 0x80, /* Logical Minimum (-32768), */
148 0x26, 0x00, 0x7F, /* Logical Maximum (32767), */
149 0x75, 0x10, /* Report Size (16), */
150 0x95, 0x03, /* Report Count (3), */
151 0x81, 0x02, /* Input (Variable), */
152 0x19, 0x43, /* Usage Minimum (43h), */
153 0x29, 0x45, /* Usage Maximum (45h), */
154 0x16, 0xFF, 0xBF, /* Logical Minimum (-16385), */
155 0x26, 0x00, 0x40, /* Logical Maximum (16384), */
156 0x95, 0x03, /* Report Count (3), */
157 0x81, 0x02, /* Input (Variable), */
158 0x06, 0x00, 0xFF, /* Usage Page (FF00h), */
159 0x09, 0x21, /* Usage (21h), */
160 0x15, 0x00, /* Logical Minimum (0), */
161 0x25, 0xFF, /* Logical Maximum (255), */
162 0x75, 0x08, /* Report Size (8), */
163 0x95, 0x27, /* Report Count (39), */
164 0x81, 0x02, /* Input (Variable), */
165 0x85, 0x05, /* Report ID (5), */
166 0x09, 0x22, /* Usage (22h), */
167 0x95, 0x1F, /* Report Count (31), */
168 0x91, 0x02, /* Output (Variable), */
169 0x85, 0x04, /* Report ID (4), */
170 0x09, 0x23, /* Usage (23h), */
171 0x95, 0x24, /* Report Count (36), */
172 0xB1, 0x02, /* Feature (Variable), */
173 0x85, 0x02, /* Report ID (2), */
174 0x09, 0x24, /* Usage (24h), */
175 0x95, 0x24, /* Report Count (36), */
176 0xB1, 0x02, /* Feature (Variable), */
177 0x85, 0x08, /* Report ID (8), */
178 0x09, 0x25, /* Usage (25h), */
179 0x95, 0x03, /* Report Count (3), */
180 0xB1, 0x02, /* Feature (Variable), */
181 0x85, 0x10, /* Report ID (16), */
182 0x09, 0x26, /* Usage (26h), */
183 0x95, 0x04, /* Report Count (4), */
184 0xB1, 0x02, /* Feature (Variable), */
185 0x85, 0x11, /* Report ID (17), */
186 0x09, 0x27, /* Usage (27h), */
187 0x95, 0x02, /* Report Count (2), */
188 0xB1, 0x02, /* Feature (Variable), */
189 0x85, 0x12, /* Report ID (18), */
190 0x06, 0x02, 0xFF, /* Usage Page (FF02h), */
191 0x09, 0x21, /* Usage (21h), */
192 0x95, 0x0F, /* Report Count (15), */
193 0xB1, 0x02, /* Feature (Variable), */
194 0x85, 0x13, /* Report ID (19), */
195 0x09, 0x22, /* Usage (22h), */
196 0x95, 0x16, /* Report Count (22), */
197 0xB1, 0x02, /* Feature (Variable), */
198 0x85, 0x14, /* Report ID (20), */
199 0x06, 0x05, 0xFF, /* Usage Page (FF05h), */
200 0x09, 0x20, /* Usage (20h), */
201 0x95, 0x10, /* Report Count (16), */
202 0xB1, 0x02, /* Feature (Variable), */
203 0x85, 0x15, /* Report ID (21), */
204 0x09, 0x21, /* Usage (21h), */
205 0x95, 0x2C, /* Report Count (44), */
206 0xB1, 0x02, /* Feature (Variable), */
207 0x06, 0x80, 0xFF, /* Usage Page (FF80h), */
208 0x85, 0x80, /* Report ID (128), */
209 0x09, 0x20, /* Usage (20h), */
210 0x95, 0x06, /* Report Count (6), */
211 0xB1, 0x02, /* Feature (Variable), */
212 0x85, 0x81, /* Report ID (129), */
213 0x09, 0x21, /* Usage (21h), */
214 0x95, 0x06, /* Report Count (6), */
215 0xB1, 0x02, /* Feature (Variable), */
216 0x85, 0x82, /* Report ID (130), */
217 0x09, 0x22, /* Usage (22h), */
218 0x95, 0x05, /* Report Count (5), */
219 0xB1, 0x02, /* Feature (Variable), */
220 0x85, 0x83, /* Report ID (131), */
221 0x09, 0x23, /* Usage (23h), */
222 0x95, 0x01, /* Report Count (1), */
223 0xB1, 0x02, /* Feature (Variable), */
224 0x85, 0x84, /* Report ID (132), */
225 0x09, 0x24, /* Usage (24h), */
226 0x95, 0x04, /* Report Count (4), */
227 0xB1, 0x02, /* Feature (Variable), */
228 0x85, 0x85, /* Report ID (133), */
229 0x09, 0x25, /* Usage (25h), */
230 0x95, 0x06, /* Report Count (6), */
231 0xB1, 0x02, /* Feature (Variable), */
232 0x85, 0x86, /* Report ID (134), */
233 0x09, 0x26, /* Usage (26h), */
234 0x95, 0x06, /* Report Count (6), */
235 0xB1, 0x02, /* Feature (Variable), */
236 0x85, 0x87, /* Report ID (135), */
237 0x09, 0x27, /* Usage (27h), */
238 0x95, 0x23, /* Report Count (35), */
239 0xB1, 0x02, /* Feature (Variable), */
240 0x85, 0x88, /* Report ID (136), */
241 0x09, 0x28, /* Usage (28h), */
242 0x95, 0x22, /* Report Count (34), */
243 0xB1, 0x02, /* Feature (Variable), */
244 0x85, 0x89, /* Report ID (137), */
245 0x09, 0x29, /* Usage (29h), */
246 0x95, 0x02, /* Report Count (2), */
247 0xB1, 0x02, /* Feature (Variable), */
248 0x85, 0x90, /* Report ID (144), */
249 0x09, 0x30, /* Usage (30h), */
250 0x95, 0x05, /* Report Count (5), */
251 0xB1, 0x02, /* Feature (Variable), */
252 0x85, 0x91, /* Report ID (145), */
253 0x09, 0x31, /* Usage (31h), */
254 0x95, 0x03, /* Report Count (3), */
255 0xB1, 0x02, /* Feature (Variable), */
256 0x85, 0x92, /* Report ID (146), */
257 0x09, 0x32, /* Usage (32h), */
258 0x95, 0x03, /* Report Count (3), */
259 0xB1, 0x02, /* Feature (Variable), */
260 0x85, 0x93, /* Report ID (147), */
261 0x09, 0x33, /* Usage (33h), */
262 0x95, 0x0C, /* Report Count (12), */
263 0xB1, 0x02, /* Feature (Variable), */
264 0x85, 0xA0, /* Report ID (160), */
265 0x09, 0x40, /* Usage (40h), */
266 0x95, 0x06, /* Report Count (6), */
267 0xB1, 0x02, /* Feature (Variable), */
268 0x85, 0xA1, /* Report ID (161), */
269 0x09, 0x41, /* Usage (41h), */
270 0x95, 0x01, /* Report Count (1), */
271 0xB1, 0x02, /* Feature (Variable), */
272 0x85, 0xA2, /* Report ID (162), */
273 0x09, 0x42, /* Usage (42h), */
274 0x95, 0x01, /* Report Count (1), */
275 0xB1, 0x02, /* Feature (Variable), */
276 0x85, 0xA3, /* Report ID (163), */
277 0x09, 0x43, /* Usage (43h), */
278 0x95, 0x30, /* Report Count (48), */
279 0xB1, 0x02, /* Feature (Variable), */
280 0x85, 0xA4, /* Report ID (164), */
281 0x09, 0x44, /* Usage (44h), */
282 0x95, 0x0D, /* Report Count (13), */
283 0xB1, 0x02, /* Feature (Variable), */
284 0x85, 0xA5, /* Report ID (165), */
285 0x09, 0x45, /* Usage (45h), */
286 0x95, 0x15, /* Report Count (21), */
287 0xB1, 0x02, /* Feature (Variable), */
288 0x85, 0xA6, /* Report ID (166), */
289 0x09, 0x46, /* Usage (46h), */
290 0x95, 0x15, /* Report Count (21), */
291 0xB1, 0x02, /* Feature (Variable), */
292 0x85, 0xF0, /* Report ID (240), */
293 0x09, 0x47, /* Usage (47h), */
294 0x95, 0x3F, /* Report Count (63), */
295 0xB1, 0x02, /* Feature (Variable), */
296 0x85, 0xF1, /* Report ID (241), */
297 0x09, 0x48, /* Usage (48h), */
298 0x95, 0x3F, /* Report Count (63), */
299 0xB1, 0x02, /* Feature (Variable), */
300 0x85, 0xF2, /* Report ID (242), */
301 0x09, 0x49, /* Usage (49h), */
302 0x95, 0x0F, /* Report Count (15), */
303 0xB1, 0x02, /* Feature (Variable), */
304 0x85, 0xA7, /* Report ID (167), */
305 0x09, 0x4A, /* Usage (4Ah), */
306 0x95, 0x01, /* Report Count (1), */
307 0xB1, 0x02, /* Feature (Variable), */
308 0x85, 0xA8, /* Report ID (168), */
309 0x09, 0x4B, /* Usage (4Bh), */
310 0x95, 0x01, /* Report Count (1), */
311 0xB1, 0x02, /* Feature (Variable), */
312 0x85, 0xA9, /* Report ID (169), */
313 0x09, 0x4C, /* Usage (4Ch), */
314 0x95, 0x08, /* Report Count (8), */
315 0xB1, 0x02, /* Feature (Variable), */
316 0x85, 0xAA, /* Report ID (170), */
317 0x09, 0x4E, /* Usage (4Eh), */
318 0x95, 0x01, /* Report Count (1), */
319 0xB1, 0x02, /* Feature (Variable), */
320 0x85, 0xAB, /* Report ID (171), */
321 0x09, 0x4F, /* Usage (4Fh), */
322 0x95, 0x39, /* Report Count (57), */
323 0xB1, 0x02, /* Feature (Variable), */
324 0x85, 0xAC, /* Report ID (172), */
325 0x09, 0x50, /* Usage (50h), */
326 0x95, 0x39, /* Report Count (57), */
327 0xB1, 0x02, /* Feature (Variable), */
328 0x85, 0xAD, /* Report ID (173), */
329 0x09, 0x51, /* Usage (51h), */
330 0x95, 0x0B, /* Report Count (11), */
331 0xB1, 0x02, /* Feature (Variable), */
332 0x85, 0xAE, /* Report ID (174), */
333 0x09, 0x52, /* Usage (52h), */
334 0x95, 0x01, /* Report Count (1), */
335 0xB1, 0x02, /* Feature (Variable), */
336 0x85, 0xAF, /* Report ID (175), */
337 0x09, 0x53, /* Usage (53h), */
338 0x95, 0x02, /* Report Count (2), */
339 0xB1, 0x02, /* Feature (Variable), */
340 0x85, 0xB0, /* Report ID (176), */
341 0x09, 0x54, /* Usage (54h), */
342 0x95, 0x3F, /* Report Count (63), */
343 0xB1, 0x02, /* Feature (Variable), */
344 0xC0 /* End Collection */
Frank Prazniked19d8c2014-01-16 21:43:12 -0500345};
346
Frank Praznikad142b92014-02-20 11:36:00 -0500347/*
348 * The default behavior of the Dualshock 4 is to send reports using report
Frank Praznikd8296742014-02-05 20:03:45 -0500349 * type 1 when running over Bluetooth. However, as soon as it receives a
350 * report of type 17 to set the LEDs or rumble it starts returning it's state
351 * in report 17 instead of 1. Since report 17 is undefined in the default HID
352 * descriptor the button and axis definitions must be moved to report 17 or
353 * the HID layer won't process the received input once a report is sent.
354 */
355static u8 dualshock4_bt_rdesc[] = {
356 0x05, 0x01, /* Usage Page (Desktop), */
357 0x09, 0x05, /* Usage (Gamepad), */
358 0xA1, 0x01, /* Collection (Application), */
359 0x85, 0x01, /* Report ID (1), */
360 0x75, 0x08, /* Report Size (8), */
361 0x95, 0x0A, /* Report Count (9), */
362 0x81, 0x02, /* Input (Variable), */
363 0x06, 0x04, 0xFF, /* Usage Page (FF04h), */
364 0x85, 0x02, /* Report ID (2), */
365 0x09, 0x24, /* Usage (24h), */
366 0x95, 0x24, /* Report Count (36), */
367 0xB1, 0x02, /* Feature (Variable), */
368 0x85, 0xA3, /* Report ID (163), */
369 0x09, 0x25, /* Usage (25h), */
370 0x95, 0x30, /* Report Count (48), */
371 0xB1, 0x02, /* Feature (Variable), */
372 0x85, 0x05, /* Report ID (5), */
373 0x09, 0x26, /* Usage (26h), */
374 0x95, 0x28, /* Report Count (40), */
375 0xB1, 0x02, /* Feature (Variable), */
376 0x85, 0x06, /* Report ID (6), */
377 0x09, 0x27, /* Usage (27h), */
378 0x95, 0x34, /* Report Count (52), */
379 0xB1, 0x02, /* Feature (Variable), */
380 0x85, 0x07, /* Report ID (7), */
381 0x09, 0x28, /* Usage (28h), */
382 0x95, 0x30, /* Report Count (48), */
383 0xB1, 0x02, /* Feature (Variable), */
384 0x85, 0x08, /* Report ID (8), */
385 0x09, 0x29, /* Usage (29h), */
386 0x95, 0x2F, /* Report Count (47), */
387 0xB1, 0x02, /* Feature (Variable), */
388 0x06, 0x03, 0xFF, /* Usage Page (FF03h), */
389 0x85, 0x03, /* Report ID (3), */
390 0x09, 0x21, /* Usage (21h), */
391 0x95, 0x26, /* Report Count (38), */
392 0xB1, 0x02, /* Feature (Variable), */
393 0x85, 0x04, /* Report ID (4), */
394 0x09, 0x22, /* Usage (22h), */
395 0x95, 0x2E, /* Report Count (46), */
396 0xB1, 0x02, /* Feature (Variable), */
397 0x85, 0xF0, /* Report ID (240), */
398 0x09, 0x47, /* Usage (47h), */
399 0x95, 0x3F, /* Report Count (63), */
400 0xB1, 0x02, /* Feature (Variable), */
401 0x85, 0xF1, /* Report ID (241), */
402 0x09, 0x48, /* Usage (48h), */
403 0x95, 0x3F, /* Report Count (63), */
404 0xB1, 0x02, /* Feature (Variable), */
405 0x85, 0xF2, /* Report ID (242), */
406 0x09, 0x49, /* Usage (49h), */
407 0x95, 0x0F, /* Report Count (15), */
408 0xB1, 0x02, /* Feature (Variable), */
409 0x85, 0x11, /* Report ID (17), */
410 0x06, 0x00, 0xFF, /* Usage Page (FF00h), */
411 0x09, 0x20, /* Usage (20h), */
412 0x95, 0x02, /* Report Count (2), */
413 0x81, 0x02, /* Input (Variable), */
414 0x05, 0x01, /* Usage Page (Desktop), */
415 0x09, 0x30, /* Usage (X), */
416 0x09, 0x31, /* Usage (Y), */
417 0x09, 0x32, /* Usage (Z), */
418 0x09, 0x35, /* Usage (Rz), */
419 0x15, 0x00, /* Logical Minimum (0), */
420 0x26, 0xFF, 0x00, /* Logical Maximum (255), */
421 0x75, 0x08, /* Report Size (8), */
422 0x95, 0x04, /* Report Count (4), */
423 0x81, 0x02, /* Input (Variable), */
424 0x09, 0x39, /* Usage (Hat Switch), */
425 0x15, 0x00, /* Logical Minimum (0), */
426 0x25, 0x07, /* Logical Maximum (7), */
427 0x75, 0x04, /* Report Size (4), */
428 0x95, 0x01, /* Report Count (1), */
429 0x81, 0x42, /* Input (Variable, Null State), */
430 0x05, 0x09, /* Usage Page (Button), */
431 0x19, 0x01, /* Usage Minimum (01h), */
432 0x29, 0x0E, /* Usage Maximum (0Eh), */
433 0x15, 0x00, /* Logical Minimum (0), */
434 0x25, 0x01, /* Logical Maximum (1), */
435 0x75, 0x01, /* Report Size (1), */
436 0x95, 0x0E, /* Report Count (14), */
437 0x81, 0x02, /* Input (Variable), */
438 0x75, 0x06, /* Report Size (6), */
439 0x95, 0x01, /* Report Count (1), */
440 0x81, 0x01, /* Input (Constant), */
441 0x05, 0x01, /* Usage Page (Desktop), */
442 0x09, 0x33, /* Usage (Rx), */
443 0x09, 0x34, /* Usage (Ry), */
444 0x15, 0x00, /* Logical Minimum (0), */
445 0x26, 0xFF, 0x00, /* Logical Maximum (255), */
446 0x75, 0x08, /* Report Size (8), */
447 0x95, 0x02, /* Report Count (2), */
448 0x81, 0x02, /* Input (Variable), */
449 0x06, 0x00, 0xFF, /* Usage Page (FF00h), */
450 0x09, 0x20, /* Usage (20h), */
451 0x95, 0x03, /* Report Count (3), */
452 0x81, 0x02, /* Input (Variable), */
453 0x05, 0x01, /* Usage Page (Desktop), */
454 0x19, 0x40, /* Usage Minimum (40h), */
455 0x29, 0x42, /* Usage Maximum (42h), */
456 0x16, 0x00, 0x80, /* Logical Minimum (-32768), */
457 0x26, 0x00, 0x7F, /* Logical Maximum (32767), */
458 0x75, 0x10, /* Report Size (16), */
459 0x95, 0x03, /* Report Count (3), */
460 0x81, 0x02, /* Input (Variable), */
461 0x19, 0x43, /* Usage Minimum (43h), */
462 0x29, 0x45, /* Usage Maximum (45h), */
463 0x16, 0xFF, 0xBF, /* Logical Minimum (-16385), */
464 0x26, 0x00, 0x40, /* Logical Maximum (16384), */
465 0x95, 0x03, /* Report Count (3), */
466 0x81, 0x02, /* Input (Variable), */
467 0x06, 0x00, 0xFF, /* Usage Page (FF00h), */
468 0x09, 0x20, /* Usage (20h), */
469 0x15, 0x00, /* Logical Minimum (0), */
470 0x26, 0xFF, 0x00, /* Logical Maximum (255), */
471 0x75, 0x08, /* Report Size (8), */
472 0x95, 0x31, /* Report Count (51), */
473 0x81, 0x02, /* Input (Variable), */
474 0x09, 0x21, /* Usage (21h), */
475 0x75, 0x08, /* Report Size (8), */
476 0x95, 0x4D, /* Report Count (77), */
477 0x91, 0x02, /* Output (Variable), */
478 0x85, 0x12, /* Report ID (18), */
479 0x09, 0x22, /* Usage (22h), */
480 0x95, 0x8D, /* Report Count (141), */
481 0x81, 0x02, /* Input (Variable), */
482 0x09, 0x23, /* Usage (23h), */
483 0x91, 0x02, /* Output (Variable), */
484 0x85, 0x13, /* Report ID (19), */
485 0x09, 0x24, /* Usage (24h), */
486 0x95, 0xCD, /* Report Count (205), */
487 0x81, 0x02, /* Input (Variable), */
488 0x09, 0x25, /* Usage (25h), */
489 0x91, 0x02, /* Output (Variable), */
490 0x85, 0x14, /* Report ID (20), */
491 0x09, 0x26, /* Usage (26h), */
492 0x96, 0x0D, 0x01, /* Report Count (269), */
493 0x81, 0x02, /* Input (Variable), */
494 0x09, 0x27, /* Usage (27h), */
495 0x91, 0x02, /* Output (Variable), */
496 0x85, 0x15, /* Report ID (21), */
497 0x09, 0x28, /* Usage (28h), */
498 0x96, 0x4D, 0x01, /* Report Count (333), */
499 0x81, 0x02, /* Input (Variable), */
500 0x09, 0x29, /* Usage (29h), */
501 0x91, 0x02, /* Output (Variable), */
502 0x85, 0x16, /* Report ID (22), */
503 0x09, 0x2A, /* Usage (2Ah), */
504 0x96, 0x8D, 0x01, /* Report Count (397), */
505 0x81, 0x02, /* Input (Variable), */
506 0x09, 0x2B, /* Usage (2Bh), */
507 0x91, 0x02, /* Output (Variable), */
508 0x85, 0x17, /* Report ID (23), */
509 0x09, 0x2C, /* Usage (2Ch), */
510 0x96, 0xCD, 0x01, /* Report Count (461), */
511 0x81, 0x02, /* Input (Variable), */
512 0x09, 0x2D, /* Usage (2Dh), */
513 0x91, 0x02, /* Output (Variable), */
514 0x85, 0x18, /* Report ID (24), */
515 0x09, 0x2E, /* Usage (2Eh), */
516 0x96, 0x0D, 0x02, /* Report Count (525), */
517 0x81, 0x02, /* Input (Variable), */
518 0x09, 0x2F, /* Usage (2Fh), */
519 0x91, 0x02, /* Output (Variable), */
520 0x85, 0x19, /* Report ID (25), */
521 0x09, 0x30, /* Usage (30h), */
522 0x96, 0x22, 0x02, /* Report Count (546), */
523 0x81, 0x02, /* Input (Variable), */
524 0x09, 0x31, /* Usage (31h), */
525 0x91, 0x02, /* Output (Variable), */
526 0x06, 0x80, 0xFF, /* Usage Page (FF80h), */
527 0x85, 0x82, /* Report ID (130), */
528 0x09, 0x22, /* Usage (22h), */
529 0x95, 0x3F, /* Report Count (63), */
530 0xB1, 0x02, /* Feature (Variable), */
531 0x85, 0x83, /* Report ID (131), */
532 0x09, 0x23, /* Usage (23h), */
533 0xB1, 0x02, /* Feature (Variable), */
534 0x85, 0x84, /* Report ID (132), */
535 0x09, 0x24, /* Usage (24h), */
536 0xB1, 0x02, /* Feature (Variable), */
537 0x85, 0x90, /* Report ID (144), */
538 0x09, 0x30, /* Usage (30h), */
539 0xB1, 0x02, /* Feature (Variable), */
540 0x85, 0x91, /* Report ID (145), */
541 0x09, 0x31, /* Usage (31h), */
542 0xB1, 0x02, /* Feature (Variable), */
543 0x85, 0x92, /* Report ID (146), */
544 0x09, 0x32, /* Usage (32h), */
545 0xB1, 0x02, /* Feature (Variable), */
546 0x85, 0x93, /* Report ID (147), */
547 0x09, 0x33, /* Usage (33h), */
548 0xB1, 0x02, /* Feature (Variable), */
549 0x85, 0xA0, /* Report ID (160), */
550 0x09, 0x40, /* Usage (40h), */
551 0xB1, 0x02, /* Feature (Variable), */
552 0x85, 0xA4, /* Report ID (164), */
553 0x09, 0x44, /* Usage (44h), */
554 0xB1, 0x02, /* Feature (Variable), */
555 0xC0 /* End Collection */
556};
557
Jiri Kosina078328d2013-06-13 12:03:49 +0200558static __u8 ps3remote_rdesc[] = {
559 0x05, 0x01, /* GUsagePage Generic Desktop */
560 0x09, 0x05, /* LUsage 0x05 [Game Pad] */
561 0xA1, 0x01, /* MCollection Application (mouse, keyboard) */
562
563 /* Use collection 1 for joypad buttons */
564 0xA1, 0x02, /* MCollection Logical (interrelated data) */
565
566 /* Ignore the 1st byte, maybe it is used for a controller
567 * number but it's not needed for correct operation */
568 0x75, 0x08, /* GReportSize 0x08 [8] */
569 0x95, 0x01, /* GReportCount 0x01 [1] */
570 0x81, 0x01, /* MInput 0x01 (Const[0] Arr[1] Abs[2]) */
571
572 /* Bytes from 2nd to 4th are a bitmap for joypad buttons, for these
573 * buttons multiple keypresses are allowed */
574 0x05, 0x09, /* GUsagePage Button */
575 0x19, 0x01, /* LUsageMinimum 0x01 [Button 1 (primary/trigger)] */
576 0x29, 0x18, /* LUsageMaximum 0x18 [Button 24] */
577 0x14, /* GLogicalMinimum [0] */
578 0x25, 0x01, /* GLogicalMaximum 0x01 [1] */
579 0x75, 0x01, /* GReportSize 0x01 [1] */
580 0x95, 0x18, /* GReportCount 0x18 [24] */
581 0x81, 0x02, /* MInput 0x02 (Data[0] Var[1] Abs[2]) */
582
583 0xC0, /* MEndCollection */
584
585 /* Use collection 2 for remote control buttons */
586 0xA1, 0x02, /* MCollection Logical (interrelated data) */
587
588 /* 5th byte is used for remote control buttons */
589 0x05, 0x09, /* GUsagePage Button */
590 0x18, /* LUsageMinimum [No button pressed] */
591 0x29, 0xFE, /* LUsageMaximum 0xFE [Button 254] */
592 0x14, /* GLogicalMinimum [0] */
593 0x26, 0xFE, 0x00, /* GLogicalMaximum 0x00FE [254] */
594 0x75, 0x08, /* GReportSize 0x08 [8] */
595 0x95, 0x01, /* GReportCount 0x01 [1] */
596 0x80, /* MInput */
597
598 /* Ignore bytes from 6th to 11th, 6th to 10th are always constant at
599 * 0xff and 11th is for press indication */
600 0x75, 0x08, /* GReportSize 0x08 [8] */
601 0x95, 0x06, /* GReportCount 0x06 [6] */
602 0x81, 0x01, /* MInput 0x01 (Const[0] Arr[1] Abs[2]) */
603
604 /* 12th byte is for battery strength */
605 0x05, 0x06, /* GUsagePage Generic Device Controls */
606 0x09, 0x20, /* LUsage 0x20 [Battery Strength] */
607 0x14, /* GLogicalMinimum [0] */
608 0x25, 0x05, /* GLogicalMaximum 0x05 [5] */
609 0x75, 0x08, /* GReportSize 0x08 [8] */
610 0x95, 0x01, /* GReportCount 0x01 [1] */
611 0x81, 0x02, /* MInput 0x02 (Data[0] Var[1] Abs[2]) */
612
613 0xC0, /* MEndCollection */
614
615 0xC0 /* MEndCollection [Game Pad] */
616};
617
618static const unsigned int ps3remote_keymap_joypad_buttons[] = {
619 [0x01] = KEY_SELECT,
620 [0x02] = BTN_THUMBL, /* L3 */
621 [0x03] = BTN_THUMBR, /* R3 */
622 [0x04] = BTN_START,
623 [0x05] = KEY_UP,
624 [0x06] = KEY_RIGHT,
625 [0x07] = KEY_DOWN,
626 [0x08] = KEY_LEFT,
627 [0x09] = BTN_TL2, /* L2 */
628 [0x0a] = BTN_TR2, /* R2 */
629 [0x0b] = BTN_TL, /* L1 */
630 [0x0c] = BTN_TR, /* R1 */
631 [0x0d] = KEY_OPTION, /* options/triangle */
632 [0x0e] = KEY_BACK, /* back/circle */
633 [0x0f] = BTN_0, /* cross */
634 [0x10] = KEY_SCREEN, /* view/square */
635 [0x11] = KEY_HOMEPAGE, /* PS button */
636 [0x14] = KEY_ENTER,
637};
638static const unsigned int ps3remote_keymap_remote_buttons[] = {
639 [0x00] = KEY_1,
640 [0x01] = KEY_2,
641 [0x02] = KEY_3,
642 [0x03] = KEY_4,
643 [0x04] = KEY_5,
644 [0x05] = KEY_6,
645 [0x06] = KEY_7,
646 [0x07] = KEY_8,
647 [0x08] = KEY_9,
648 [0x09] = KEY_0,
649 [0x0e] = KEY_ESC, /* return */
650 [0x0f] = KEY_CLEAR,
651 [0x16] = KEY_EJECTCD,
652 [0x1a] = KEY_MENU, /* top menu */
653 [0x28] = KEY_TIME,
654 [0x30] = KEY_PREVIOUS,
655 [0x31] = KEY_NEXT,
656 [0x32] = KEY_PLAY,
657 [0x33] = KEY_REWIND, /* scan back */
658 [0x34] = KEY_FORWARD, /* scan forward */
659 [0x38] = KEY_STOP,
660 [0x39] = KEY_PAUSE,
661 [0x40] = KEY_CONTEXT_MENU, /* pop up/menu */
662 [0x60] = KEY_FRAMEBACK, /* slow/step back */
663 [0x61] = KEY_FRAMEFORWARD, /* slow/step forward */
664 [0x63] = KEY_SUBTITLE,
665 [0x64] = KEY_AUDIO,
666 [0x65] = KEY_ANGLE,
667 [0x70] = KEY_INFO, /* display */
668 [0x80] = KEY_BLUE,
669 [0x81] = KEY_RED,
670 [0x82] = KEY_GREEN,
671 [0x83] = KEY_YELLOW,
672};
673
Colin Leitnerf04d5142013-05-27 23:41:05 +0200674static const unsigned int buzz_keymap[] = {
Frank Praznikad142b92014-02-20 11:36:00 -0500675 /*
676 * The controller has 4 remote buzzers, each with one LED and 5
Colin Leitnerf04d5142013-05-27 23:41:05 +0200677 * buttons.
678 *
679 * We use the mapping chosen by the controller, which is:
680 *
681 * Key Offset
682 * -------------------
683 * Buzz 1
684 * Blue 5
685 * Orange 4
686 * Green 3
687 * Yellow 2
688 *
689 * So, for example, the orange button on the third buzzer is mapped to
690 * BTN_TRIGGER_HAPPY14
691 */
692 [ 1] = BTN_TRIGGER_HAPPY1,
693 [ 2] = BTN_TRIGGER_HAPPY2,
694 [ 3] = BTN_TRIGGER_HAPPY3,
695 [ 4] = BTN_TRIGGER_HAPPY4,
696 [ 5] = BTN_TRIGGER_HAPPY5,
697 [ 6] = BTN_TRIGGER_HAPPY6,
698 [ 7] = BTN_TRIGGER_HAPPY7,
699 [ 8] = BTN_TRIGGER_HAPPY8,
700 [ 9] = BTN_TRIGGER_HAPPY9,
701 [10] = BTN_TRIGGER_HAPPY10,
702 [11] = BTN_TRIGGER_HAPPY11,
703 [12] = BTN_TRIGGER_HAPPY12,
704 [13] = BTN_TRIGGER_HAPPY13,
705 [14] = BTN_TRIGGER_HAPPY14,
706 [15] = BTN_TRIGGER_HAPPY15,
707 [16] = BTN_TRIGGER_HAPPY16,
708 [17] = BTN_TRIGGER_HAPPY17,
709 [18] = BTN_TRIGGER_HAPPY18,
710 [19] = BTN_TRIGGER_HAPPY19,
711 [20] = BTN_TRIGGER_HAPPY20,
712};
713
Frank Praznikd902f472014-01-27 10:17:36 -0500714static enum power_supply_property sony_battery_props[] = {
715 POWER_SUPPLY_PROP_PRESENT,
716 POWER_SUPPLY_PROP_CAPACITY,
717 POWER_SUPPLY_PROP_SCOPE,
718 POWER_SUPPLY_PROP_STATUS,
719};
720
Frank Praznik55d3b662014-04-14 10:11:32 -0400721struct sixaxis_led {
722 __u8 time_enabled; /* the total time the led is active (0xff means forever) */
723 __u8 duty_length; /* how long a cycle is in deciseconds (0 means "really fast") */
724 __u8 enabled;
725 __u8 duty_off; /* % of duty_length the led is off (0xff means 100%) */
726 __u8 duty_on; /* % of duty_length the led is on (0xff mean 100%) */
727} __packed;
728
729struct sixaxis_rumble {
730 __u8 padding;
731 __u8 right_duration; /* Right motor duration (0xff means forever) */
732 __u8 right_motor_on; /* Right (small) motor on/off, only supports values of 0 or 1 (off/on) */
733 __u8 left_duration; /* Left motor duration (0xff means forever) */
734 __u8 left_motor_force; /* left (large) motor, supports force values from 0 to 255 */
735} __packed;
736
737struct sixaxis_output_report {
738 __u8 report_id;
739 struct sixaxis_rumble rumble;
740 __u8 padding[4];
741 __u8 leds_bitmap; /* bitmap of enabled LEDs: LED_1 = 0x02, LED_2 = 0x04, ... */
742 struct sixaxis_led led[4]; /* LEDx at (4 - x) */
743 struct sixaxis_led _reserved; /* LED5, not actually soldered */
744} __packed;
745
746union sixaxis_output_report_01 {
747 struct sixaxis_output_report data;
748 __u8 buf[36];
749};
750
Frank Praznikd2d782f2014-02-20 11:36:03 -0500751static spinlock_t sony_dev_list_lock;
752static LIST_HEAD(sony_device_list);
Frank Praznik80250872014-04-14 10:11:35 -0400753static DEFINE_IDA(sony_device_id_allocator);
Frank Praznikd2d782f2014-02-20 11:36:03 -0500754
Jiri Kosinacc6e0bb2008-10-23 12:58:38 +0200755struct sony_sc {
Frank Praznikd902f472014-01-27 10:17:36 -0500756 spinlock_t lock;
Frank Praznikd2d782f2014-02-20 11:36:03 -0500757 struct list_head list_node;
Sven Eckelmann0a286ef2013-11-19 20:26:32 +0100758 struct hid_device *hdev;
Frank Praznik60781cf2014-01-11 15:13:15 -0500759 struct led_classdev *leds[MAX_LEDS];
Jiri Kosinacc6e0bb2008-10-23 12:58:38 +0200760 unsigned long quirks;
Sven Eckelmann0a286ef2013-11-19 20:26:32 +0100761 struct work_struct state_worker;
Frank Praznikd902f472014-01-27 10:17:36 -0500762 struct power_supply battery;
Frank Praznik80250872014-04-14 10:11:35 -0400763 int device_id;
Colin Leitnerf04d5142013-05-27 23:41:05 +0200764
Sven Eckelmann9f323b62013-11-17 20:38:21 +0100765#ifdef CONFIG_SONY_FF
Sven Eckelmann9f323b62013-11-17 20:38:21 +0100766 __u8 left;
767 __u8 right;
768#endif
769
Frank Praznikd2d782f2014-02-20 11:36:03 -0500770 __u8 mac_address[6];
Frank Praznik5f5750d2014-02-19 13:09:22 -0500771 __u8 worker_initialized;
Frank Praznikd902f472014-01-27 10:17:36 -0500772 __u8 cable_state;
773 __u8 battery_charging;
774 __u8 battery_capacity;
Frank Praznik60781cf2014-01-11 15:13:15 -0500775 __u8 led_state[MAX_LEDS];
776 __u8 led_count;
Jiri Kosinacc6e0bb2008-10-23 12:58:38 +0200777};
778
Jiri Kosina078328d2013-06-13 12:03:49 +0200779static __u8 *ps3remote_fixup(struct hid_device *hdev, __u8 *rdesc,
780 unsigned int *rsize)
781{
782 *rsize = sizeof(ps3remote_rdesc);
783 return ps3remote_rdesc;
784}
785
786static int ps3remote_mapping(struct hid_device *hdev, struct hid_input *hi,
787 struct hid_field *field, struct hid_usage *usage,
788 unsigned long **bit, int *max)
789{
790 unsigned int key = usage->hid & HID_USAGE;
791
792 if ((usage->hid & HID_USAGE_PAGE) != HID_UP_BUTTON)
793 return -1;
794
795 switch (usage->collection_index) {
796 case 1:
797 if (key >= ARRAY_SIZE(ps3remote_keymap_joypad_buttons))
798 return -1;
799
800 key = ps3remote_keymap_joypad_buttons[key];
801 if (!key)
802 return -1;
803 break;
804 case 2:
805 if (key >= ARRAY_SIZE(ps3remote_keymap_remote_buttons))
806 return -1;
807
808 key = ps3remote_keymap_remote_buttons[key];
809 if (!key)
810 return -1;
811 break;
812 default:
813 return -1;
814 }
815
816 hid_map_usage_clear(hi, usage, bit, max, EV_KEY, key);
817 return 1;
818}
819
820
Jiri Kosinacc6e0bb2008-10-23 12:58:38 +0200821/* Sony Vaio VGX has wrongly mouse pointer declared as constant */
Nikolai Kondrashov73e40082010-08-06 23:03:06 +0400822static __u8 *sony_report_fixup(struct hid_device *hdev, __u8 *rdesc,
823 unsigned int *rsize)
Jiri Kosinacc6e0bb2008-10-23 12:58:38 +0200824{
825 struct sony_sc *sc = hid_get_drvdata(hdev);
826
Fernando Luis Vázquez Cao99d24902013-01-22 15:20:38 +0900827 /*
828 * Some Sony RF receivers wrongly declare the mouse pointer as a
829 * a constant non-data variable.
830 */
831 if ((sc->quirks & VAIO_RDESC_CONSTANT) && *rsize >= 56 &&
832 /* usage page: generic desktop controls */
833 /* rdesc[0] == 0x05 && rdesc[1] == 0x01 && */
834 /* usage: mouse */
835 rdesc[2] == 0x09 && rdesc[3] == 0x02 &&
836 /* input (usage page for x,y axes): constant, variable, relative */
837 rdesc[54] == 0x81 && rdesc[55] == 0x07) {
Fernando Luis Vázquez Caoa4649182013-01-15 19:40:48 +0900838 hid_info(hdev, "Fixing up Sony RF Receiver report descriptor\n");
Fernando Luis Vázquez Cao99d24902013-01-22 15:20:38 +0900839 /* input: data, variable, relative */
Jiri Kosinacc6e0bb2008-10-23 12:58:38 +0200840 rdesc[55] = 0x06;
841 }
Simon Wood61ab44b2011-06-10 12:00:26 +0200842
Frank Prazniked19d8c2014-01-16 21:43:12 -0500843 /*
844 * The default Dualshock 4 USB descriptor doesn't assign
845 * the gyroscope values to corresponding axes so we need a
846 * modified one.
847 */
848 if ((sc->quirks & DUALSHOCK4_CONTROLLER_USB) && *rsize == 467) {
849 hid_info(hdev, "Using modified Dualshock 4 report descriptor with gyroscope axes\n");
850 rdesc = dualshock4_usb_rdesc;
851 *rsize = sizeof(dualshock4_usb_rdesc);
Frank Praznikd8296742014-02-05 20:03:45 -0500852 } else if ((sc->quirks & DUALSHOCK4_CONTROLLER_BT) && *rsize == 357) {
853 hid_info(hdev, "Using modified Dualshock 4 Bluetooth report descriptor\n");
854 rdesc = dualshock4_bt_rdesc;
855 *rsize = sizeof(dualshock4_bt_rdesc);
Frank Prazniked19d8c2014-01-16 21:43:12 -0500856 }
857
Simon Wood61ab44b2011-06-10 12:00:26 +0200858 /* The HID descriptor exposed over BT has a trailing zero byte */
859 if ((((sc->quirks & SIXAXIS_CONTROLLER_USB) && *rsize == 148) ||
860 ((sc->quirks & SIXAXIS_CONTROLLER_BT) && *rsize == 149)) &&
861 rdesc[83] == 0x75) {
862 hid_info(hdev, "Fixing up Sony Sixaxis report descriptor\n");
863 memcpy((void *)&rdesc[83], (void *)&sixaxis_rdesc_fixup,
864 sizeof(sixaxis_rdesc_fixup));
Mauro Carvalho Chehabe57a67d2012-12-14 20:57:34 -0200865 } else if (sc->quirks & SIXAXIS_CONTROLLER_USB &&
866 *rsize > sizeof(sixaxis_rdesc_fixup2)) {
867 hid_info(hdev, "Sony Sixaxis clone detected. Using original report descriptor (size: %d clone; %d new)\n",
868 *rsize, (int)sizeof(sixaxis_rdesc_fixup2));
869 *rsize = sizeof(sixaxis_rdesc_fixup2);
870 memcpy(rdesc, &sixaxis_rdesc_fixup2, *rsize);
Simon Wood61ab44b2011-06-10 12:00:26 +0200871 }
Jiri Kosina078328d2013-06-13 12:03:49 +0200872
873 if (sc->quirks & PS3REMOTE)
874 return ps3remote_fixup(hdev, rdesc, rsize);
875
Nikolai Kondrashov73e40082010-08-06 23:03:06 +0400876 return rdesc;
Jiri Kosinacc6e0bb2008-10-23 12:58:38 +0200877}
878
Frank Praznikd902f472014-01-27 10:17:36 -0500879static void sixaxis_parse_report(struct sony_sc *sc, __u8 *rd, int size)
880{
881 static const __u8 sixaxis_battery_capacity[] = { 0, 1, 25, 50, 75, 100 };
882 unsigned long flags;
883 __u8 cable_state, battery_capacity, battery_charging;
884
Frank Praznikad142b92014-02-20 11:36:00 -0500885 /*
886 * The sixaxis is charging if the battery value is 0xee
Frank Praznikd902f472014-01-27 10:17:36 -0500887 * and it is fully charged if the value is 0xef.
888 * It does not report the actual level while charging so it
889 * is set to 100% while charging is in progress.
890 */
891 if (rd[30] >= 0xee) {
892 battery_capacity = 100;
Frank Praznika43e94a2014-02-15 13:35:42 -0500893 battery_charging = !(rd[30] & 0x01);
Frank Praznikd902f472014-01-27 10:17:36 -0500894 } else {
Frank Praznikac3c9a92014-02-20 11:36:02 -0500895 __u8 index = rd[30] <= 5 ? rd[30] : 5;
896 battery_capacity = sixaxis_battery_capacity[index];
Frank Praznikd902f472014-01-27 10:17:36 -0500897 battery_charging = 0;
898 }
Frank Praznik914c5782014-03-15 09:41:15 -0400899 cable_state = !(rd[31] & 0x04);
Frank Praznikd902f472014-01-27 10:17:36 -0500900
901 spin_lock_irqsave(&sc->lock, flags);
902 sc->cable_state = cable_state;
903 sc->battery_capacity = battery_capacity;
904 sc->battery_charging = battery_charging;
905 spin_unlock_irqrestore(&sc->lock, flags);
906}
907
908static void dualshock4_parse_report(struct sony_sc *sc, __u8 *rd, int size)
909{
Frank Praznike5606232014-01-27 10:17:37 -0500910 struct hid_input *hidinput = list_entry(sc->hdev->inputs.next,
911 struct hid_input, list);
912 struct input_dev *input_dev = hidinput->input;
Frank Praznikd902f472014-01-27 10:17:36 -0500913 unsigned long flags;
Frank Praznik6c5f8602014-02-05 20:03:47 -0500914 int n, offset;
Frank Praznikd902f472014-01-27 10:17:36 -0500915 __u8 cable_state, battery_capacity, battery_charging;
916
Frank Praznikad142b92014-02-20 11:36:00 -0500917 /*
918 * Battery and touchpad data starts at byte 30 in the USB report and
Frank Praznik6c5f8602014-02-05 20:03:47 -0500919 * 32 in Bluetooth report.
920 */
921 offset = (sc->quirks & DUALSHOCK4_CONTROLLER_USB) ? 30 : 32;
922
Frank Praznikad142b92014-02-20 11:36:00 -0500923 /*
924 * The lower 4 bits of byte 30 contain the battery level
Frank Praznikd902f472014-01-27 10:17:36 -0500925 * and the 5th bit contains the USB cable state.
926 */
Frank Praznik6c5f8602014-02-05 20:03:47 -0500927 cable_state = (rd[offset] >> 4) & 0x01;
928 battery_capacity = rd[offset] & 0x0F;
Frank Praznikd902f472014-01-27 10:17:36 -0500929
Frank Praznikad142b92014-02-20 11:36:00 -0500930 /*
931 * When a USB power source is connected the battery level ranges from
Frank Praznik6c5f8602014-02-05 20:03:47 -0500932 * 0 to 10, and when running on battery power it ranges from 0 to 9.
933 * A battery level above 10 when plugged in means charge completed.
Frank Praznikd902f472014-01-27 10:17:36 -0500934 */
Frank Praznik6c5f8602014-02-05 20:03:47 -0500935 if (!cable_state || battery_capacity > 10)
Frank Praznikd902f472014-01-27 10:17:36 -0500936 battery_charging = 0;
937 else
938 battery_charging = 1;
939
Frank Praznik6c5f8602014-02-05 20:03:47 -0500940 if (!cable_state)
941 battery_capacity++;
Frank Praznikd902f472014-01-27 10:17:36 -0500942 if (battery_capacity > 10)
Frank Praznik6c5f8602014-02-05 20:03:47 -0500943 battery_capacity = 10;
944
Frank Praznikd902f472014-01-27 10:17:36 -0500945 battery_capacity *= 10;
946
947 spin_lock_irqsave(&sc->lock, flags);
948 sc->cable_state = cable_state;
949 sc->battery_capacity = battery_capacity;
950 sc->battery_charging = battery_charging;
951 spin_unlock_irqrestore(&sc->lock, flags);
Frank Praznike5606232014-01-27 10:17:37 -0500952
Frank Praznik6c5f8602014-02-05 20:03:47 -0500953 offset += 5;
954
Frank Praznikad142b92014-02-20 11:36:00 -0500955 /*
956 * The Dualshock 4 multi-touch trackpad data starts at offset 35 on USB
Frank Praznik6c5f8602014-02-05 20:03:47 -0500957 * and 37 on Bluetooth.
Frank Praznike5606232014-01-27 10:17:37 -0500958 * The first 7 bits of the first byte is a counter and bit 8 is a touch
959 * indicator that is 0 when pressed and 1 when not pressed.
960 * The next 3 bytes are two 12 bit touch coordinates, X and Y.
961 * The data for the second touch is in the same format and immediatly
962 * follows the data for the first.
963 */
964 for (n = 0; n < 2; n++) {
965 __u16 x, y;
966
967 x = rd[offset+1] | ((rd[offset+2] & 0xF) << 8);
968 y = ((rd[offset+2] & 0xF0) >> 4) | (rd[offset+3] << 4);
969
970 input_mt_slot(input_dev, n);
971 input_mt_report_slot_state(input_dev, MT_TOOL_FINGER,
972 !(rd[offset] >> 7));
973 input_report_abs(input_dev, ABS_MT_POSITION_X, x);
974 input_report_abs(input_dev, ABS_MT_POSITION_Y, y);
975
976 offset += 4;
977 }
Frank Praznikd902f472014-01-27 10:17:36 -0500978}
979
Simon Woodc9e4d872011-06-10 12:00:27 +0200980static int sony_raw_event(struct hid_device *hdev, struct hid_report *report,
981 __u8 *rd, int size)
982{
983 struct sony_sc *sc = hid_get_drvdata(hdev);
984
Frank Praznikad142b92014-02-20 11:36:00 -0500985 /*
986 * Sixaxis HID report has acclerometers/gyro with MSByte first, this
Simon Woodc9e4d872011-06-10 12:00:27 +0200987 * has to be BYTE_SWAPPED before passing up to joystick interface
988 */
Frank Praznikfee4e2d2014-02-18 17:22:01 -0500989 if ((sc->quirks & SIXAXIS_CONTROLLER) && rd[0] == 0x01 && size == 49) {
Simon Woodc9e4d872011-06-10 12:00:27 +0200990 swap(rd[41], rd[42]);
991 swap(rd[43], rd[44]);
992 swap(rd[45], rd[46]);
993 swap(rd[47], rd[48]);
Frank Praznikd902f472014-01-27 10:17:36 -0500994
995 sixaxis_parse_report(sc, rd, size);
Frank Praznik68330d82014-02-05 20:03:49 -0500996 } else if (((sc->quirks & DUALSHOCK4_CONTROLLER_USB) && rd[0] == 0x01 &&
997 size == 64) || ((sc->quirks & DUALSHOCK4_CONTROLLER_BT)
998 && rd[0] == 0x11 && size == 78)) {
Frank Praznikd902f472014-01-27 10:17:36 -0500999 dualshock4_parse_report(sc, rd, size);
Simon Woodc9e4d872011-06-10 12:00:27 +02001000 }
1001
1002 return 0;
1003}
1004
Colin Leitnerf04d5142013-05-27 23:41:05 +02001005static int sony_mapping(struct hid_device *hdev, struct hid_input *hi,
1006 struct hid_field *field, struct hid_usage *usage,
1007 unsigned long **bit, int *max)
1008{
1009 struct sony_sc *sc = hid_get_drvdata(hdev);
1010
1011 if (sc->quirks & BUZZ_CONTROLLER) {
1012 unsigned int key = usage->hid & HID_USAGE;
1013
1014 if ((usage->hid & HID_USAGE_PAGE) != HID_UP_BUTTON)
1015 return -1;
1016
1017 switch (usage->collection_index) {
1018 case 1:
1019 if (key >= ARRAY_SIZE(buzz_keymap))
1020 return -1;
1021
1022 key = buzz_keymap[key];
1023 if (!key)
1024 return -1;
1025 break;
1026 default:
1027 return -1;
1028 }
1029
1030 hid_map_usage_clear(hi, usage, bit, max, EV_KEY, key);
1031 return 1;
1032 }
1033
Jiri Kosina078328d2013-06-13 12:03:49 +02001034 if (sc->quirks & PS3REMOTE)
1035 return ps3remote_mapping(hdev, hi, field, usage, bit, max);
1036
Benjamin Tissoires6f498012013-07-24 16:53:07 +02001037 /* Let hid-core decide for the others */
1038 return 0;
Colin Leitnerf04d5142013-05-27 23:41:05 +02001039}
1040
Antonio Ospite5710fab2011-02-20 18:26:45 +01001041/*
Jiri Slabybd28ce02008-06-25 23:47:04 +02001042 * Sending HID_REQ_GET_REPORT changes the operation mode of the ps3 controller
1043 * to "operational". Without this, the ps3 controller will not report any
1044 * events.
1045 */
Antonio Ospite816651a2010-05-03 22:15:55 +02001046static int sixaxis_set_operational_usb(struct hid_device *hdev)
Jiri Slabybd28ce02008-06-25 23:47:04 +02001047{
Jiri Slabybd28ce02008-06-25 23:47:04 +02001048 int ret;
1049 char *buf = kmalloc(18, GFP_KERNEL);
1050
1051 if (!buf)
1052 return -ENOMEM;
1053
Benjamin Tissoirescafebc02014-02-05 16:33:22 -05001054 ret = hid_hw_raw_request(hdev, 0xf2, buf, 17, HID_FEATURE_REPORT,
1055 HID_REQ_GET_REPORT);
Benjamin Tissoiresf204828a2013-09-11 22:12:25 +02001056
Jiri Slabybd28ce02008-06-25 23:47:04 +02001057 if (ret < 0)
Joe Perches4291ee32010-12-09 19:29:03 -08001058 hid_err(hdev, "can't set operational mode\n");
Jiri Slabybd28ce02008-06-25 23:47:04 +02001059
1060 kfree(buf);
1061
1062 return ret;
1063}
1064
Antonio Ospite816651a2010-05-03 22:15:55 +02001065static int sixaxis_set_operational_bt(struct hid_device *hdev)
Bastien Noceraf9ce7c22010-01-20 12:01:53 +00001066{
Antonio Ospitefddb33f2010-05-03 17:19:03 +02001067 unsigned char buf[] = { 0xf4, 0x42, 0x03, 0x00, 0x00 };
Benjamin Tissoiresb0dd72a2014-02-10 12:58:54 -05001068 return hid_hw_raw_request(hdev, buf[0], buf, sizeof(buf),
1069 HID_FEATURE_REPORT, HID_REQ_SET_REPORT);
Bastien Noceraf9ce7c22010-01-20 12:01:53 +00001070}
1071
Frank Praznikad142b92014-02-20 11:36:00 -05001072/*
1073 * Requesting feature report 0x02 in Bluetooth mode changes the state of the
Frank Praznik68330d82014-02-05 20:03:49 -05001074 * controller so that it sends full input reports of type 0x11.
1075 */
1076static int dualshock4_set_operational_bt(struct hid_device *hdev)
1077{
1078 __u8 buf[37] = { 0 };
1079
1080 return hid_hw_raw_request(hdev, 0x02, buf, sizeof(buf),
1081 HID_FEATURE_REPORT, HID_REQ_GET_REPORT);
Jiri Slabybd28ce02008-06-25 23:47:04 +02001082}
1083
Frank Praznik80250872014-04-14 10:11:35 -04001084static void sixaxis_set_leds_from_id(int id, __u8 values[MAX_LEDS])
1085{
1086 static const __u8 sixaxis_leds[10][4] = {
1087 { 0x01, 0x00, 0x00, 0x00 },
1088 { 0x00, 0x01, 0x00, 0x00 },
1089 { 0x00, 0x00, 0x01, 0x00 },
1090 { 0x00, 0x00, 0x00, 0x01 },
1091 { 0x01, 0x00, 0x00, 0x01 },
1092 { 0x00, 0x01, 0x00, 0x01 },
1093 { 0x00, 0x00, 0x01, 0x01 },
1094 { 0x01, 0x00, 0x01, 0x01 },
1095 { 0x00, 0x01, 0x01, 0x01 },
1096 { 0x01, 0x01, 0x01, 0x01 }
1097 };
1098
1099 BUG_ON(MAX_LEDS < ARRAY_SIZE(sixaxis_leds[0]));
1100
1101 if (id < 0)
1102 return;
1103
1104 id %= 10;
1105 memcpy(values, sixaxis_leds[id], sizeof(sixaxis_leds[id]));
1106}
1107
1108static void dualshock4_set_leds_from_id(int id, __u8 values[MAX_LEDS])
1109{
1110 /* The first 4 color/index entries match what the PS4 assigns */
1111 static const __u8 color_code[7][3] = {
1112 /* Blue */ { 0x00, 0x00, 0x01 },
1113 /* Red */ { 0x01, 0x00, 0x00 },
1114 /* Green */ { 0x00, 0x01, 0x00 },
1115 /* Pink */ { 0x02, 0x00, 0x01 },
1116 /* Orange */ { 0x02, 0x01, 0x00 },
1117 /* Teal */ { 0x00, 0x01, 0x01 },
1118 /* White */ { 0x01, 0x01, 0x01 }
1119 };
1120
1121 BUG_ON(MAX_LEDS < ARRAY_SIZE(color_code[0]));
1122
1123 if (id < 0)
1124 return;
1125
1126 id %= 7;
1127 memcpy(values, color_code[id], sizeof(color_code[id]));
1128}
1129
Frank Praznik60781cf2014-01-11 15:13:15 -05001130static void buzz_set_leds(struct hid_device *hdev, const __u8 *leds)
Colin Leitnerf04d5142013-05-27 23:41:05 +02001131{
1132 struct list_head *report_list =
1133 &hdev->report_enum[HID_OUTPUT_REPORT].report_list;
1134 struct hid_report *report = list_entry(report_list->next,
1135 struct hid_report, list);
1136 __s32 *value = report->field[0]->value;
1137
1138 value[0] = 0x00;
Frank Praznik60781cf2014-01-11 15:13:15 -05001139 value[1] = leds[0] ? 0xff : 0x00;
1140 value[2] = leds[1] ? 0xff : 0x00;
1141 value[3] = leds[2] ? 0xff : 0x00;
1142 value[4] = leds[3] ? 0xff : 0x00;
Colin Leitnerf04d5142013-05-27 23:41:05 +02001143 value[5] = 0x00;
1144 value[6] = 0x00;
1145 hid_hw_request(hdev, report, HID_REQ_SET_REPORT);
1146}
1147
Frank Praznikfa57a812014-04-14 10:11:33 -04001148static void sony_set_leds(struct sony_sc *sc, const __u8 *leds, int count)
Sven Eckelmann0a286ef2013-11-19 20:26:32 +01001149{
Frank Praznik60781cf2014-01-11 15:13:15 -05001150 int n;
Sven Eckelmann0a286ef2013-11-19 20:26:32 +01001151
Frank Praznik60781cf2014-01-11 15:13:15 -05001152 BUG_ON(count > MAX_LEDS);
1153
Frank Praznikfa57a812014-04-14 10:11:33 -04001154 if (sc->quirks & BUZZ_CONTROLLER && count == 4) {
1155 buzz_set_leds(sc->hdev, leds);
Frank Praznikfee4e2d2014-02-18 17:22:01 -05001156 } else {
Frank Praznik60781cf2014-01-11 15:13:15 -05001157 for (n = 0; n < count; n++)
Frank Praznikfa57a812014-04-14 10:11:33 -04001158 sc->led_state[n] = leds[n];
1159 schedule_work(&sc->state_worker);
Sven Eckelmann0a286ef2013-11-19 20:26:32 +01001160 }
1161}
1162
Sven Eckelmannc5382512013-11-19 20:26:30 +01001163static void sony_led_set_brightness(struct led_classdev *led,
Colin Leitnerf04d5142013-05-27 23:41:05 +02001164 enum led_brightness value)
1165{
1166 struct device *dev = led->dev->parent;
1167 struct hid_device *hdev = container_of(dev, struct hid_device, dev);
1168 struct sony_sc *drv_data;
Colin Leitnerf04d5142013-05-27 23:41:05 +02001169
1170 int n;
1171
1172 drv_data = hid_get_drvdata(hdev);
Sven Eckelmann2251b852013-11-19 20:26:31 +01001173 if (!drv_data) {
Colin Leitnerf04d5142013-05-27 23:41:05 +02001174 hid_err(hdev, "No device data\n");
1175 return;
1176 }
Colin Leitnerf04d5142013-05-27 23:41:05 +02001177
Frank Praznik60781cf2014-01-11 15:13:15 -05001178 for (n = 0; n < drv_data->led_count; n++) {
Sven Eckelmann2251b852013-11-19 20:26:31 +01001179 if (led == drv_data->leds[n]) {
Frank Praznik60781cf2014-01-11 15:13:15 -05001180 if (value != drv_data->led_state[n]) {
1181 drv_data->led_state[n] = value;
Frank Praznikfa57a812014-04-14 10:11:33 -04001182 sony_set_leds(drv_data, drv_data->led_state,
1183 drv_data->led_count);
Colin Leitnerf04d5142013-05-27 23:41:05 +02001184 }
1185 break;
1186 }
1187 }
1188}
1189
Sven Eckelmannc5382512013-11-19 20:26:30 +01001190static enum led_brightness sony_led_get_brightness(struct led_classdev *led)
Colin Leitnerf04d5142013-05-27 23:41:05 +02001191{
1192 struct device *dev = led->dev->parent;
1193 struct hid_device *hdev = container_of(dev, struct hid_device, dev);
1194 struct sony_sc *drv_data;
Colin Leitnerf04d5142013-05-27 23:41:05 +02001195
1196 int n;
Colin Leitnerf04d5142013-05-27 23:41:05 +02001197
1198 drv_data = hid_get_drvdata(hdev);
Sven Eckelmann2251b852013-11-19 20:26:31 +01001199 if (!drv_data) {
Colin Leitnerf04d5142013-05-27 23:41:05 +02001200 hid_err(hdev, "No device data\n");
1201 return LED_OFF;
1202 }
Colin Leitnerf04d5142013-05-27 23:41:05 +02001203
Frank Praznik60781cf2014-01-11 15:13:15 -05001204 for (n = 0; n < drv_data->led_count; n++) {
Simon Wood7db75042014-02-05 12:34:18 -07001205 if (led == drv_data->leds[n])
1206 return drv_data->led_state[n];
Colin Leitnerf04d5142013-05-27 23:41:05 +02001207 }
1208
Simon Wood7db75042014-02-05 12:34:18 -07001209 return LED_OFF;
Colin Leitnerf04d5142013-05-27 23:41:05 +02001210}
Colin Leitnerf04d5142013-05-27 23:41:05 +02001211
Frank Praznikfa57a812014-04-14 10:11:33 -04001212static void sony_leds_remove(struct sony_sc *sc)
Sven Eckelmann0a286ef2013-11-19 20:26:32 +01001213{
Sven Eckelmann0a286ef2013-11-19 20:26:32 +01001214 struct led_classdev *led;
1215 int n;
1216
Frank Praznikfa57a812014-04-14 10:11:33 -04001217 BUG_ON(!(sc->quirks & SONY_LED_SUPPORT));
Sven Eckelmann0a286ef2013-11-19 20:26:32 +01001218
Frank Praznikfa57a812014-04-14 10:11:33 -04001219 for (n = 0; n < sc->led_count; n++) {
1220 led = sc->leds[n];
1221 sc->leds[n] = NULL;
Sven Eckelmann0a286ef2013-11-19 20:26:32 +01001222 if (!led)
1223 continue;
1224 led_classdev_unregister(led);
1225 kfree(led);
1226 }
Frank Praznik60781cf2014-01-11 15:13:15 -05001227
Frank Praznikfa57a812014-04-14 10:11:33 -04001228 sc->led_count = 0;
Sven Eckelmann0a286ef2013-11-19 20:26:32 +01001229}
1230
Frank Praznikfa57a812014-04-14 10:11:33 -04001231static int sony_leds_init(struct sony_sc *sc)
Colin Leitnerf04d5142013-05-27 23:41:05 +02001232{
Frank Praznikfa57a812014-04-14 10:11:33 -04001233 struct hid_device *hdev = sc->hdev;
Jiri Kosina40e32ee2013-05-28 11:22:09 +02001234 int n, ret = 0;
Frank Praznik60781cf2014-01-11 15:13:15 -05001235 int max_brightness;
Frank Praznik61ebca92014-01-20 12:27:02 -05001236 int use_colors;
Jiri Kosina40e32ee2013-05-28 11:22:09 +02001237 struct led_classdev *led;
1238 size_t name_sz;
1239 char *name;
Sven Eckelmann0a286ef2013-11-19 20:26:32 +01001240 size_t name_len;
1241 const char *name_fmt;
Frank Praznik61ebca92014-01-20 12:27:02 -05001242 static const char * const color_str[] = { "red", "green", "blue" };
Frank Praznik80250872014-04-14 10:11:35 -04001243 __u8 initial_values[MAX_LEDS] = { 0 };
Colin Leitnerf04d5142013-05-27 23:41:05 +02001244
Frank Praznikfa57a812014-04-14 10:11:33 -04001245 BUG_ON(!(sc->quirks & SONY_LED_SUPPORT));
Colin Leitnerf04d5142013-05-27 23:41:05 +02001246
Frank Praznikfa57a812014-04-14 10:11:33 -04001247 if (sc->quirks & BUZZ_CONTROLLER) {
1248 sc->led_count = 4;
Frank Praznik61ebca92014-01-20 12:27:02 -05001249 max_brightness = 1;
1250 use_colors = 0;
Sven Eckelmann0a286ef2013-11-19 20:26:32 +01001251 name_len = strlen("::buzz#");
1252 name_fmt = "%s::buzz%d";
1253 /* Validate expected report characteristics. */
1254 if (!hid_validate_values(hdev, HID_OUTPUT_REPORT, 0, 0, 7))
1255 return -ENODEV;
Frank Praznikfa57a812014-04-14 10:11:33 -04001256 } else if (sc->quirks & DUALSHOCK4_CONTROLLER) {
Frank Praznik80250872014-04-14 10:11:35 -04001257 dualshock4_set_leds_from_id(sc->device_id, initial_values);
Frank Praznikfa57a812014-04-14 10:11:33 -04001258 sc->led_count = 3;
Frank Praznik60781cf2014-01-11 15:13:15 -05001259 max_brightness = 255;
Frank Praznik61ebca92014-01-20 12:27:02 -05001260 use_colors = 1;
1261 name_len = 0;
1262 name_fmt = "%s:%s";
Frank Praznik60781cf2014-01-11 15:13:15 -05001263 } else {
Frank Praznik80250872014-04-14 10:11:35 -04001264 sixaxis_set_leds_from_id(sc->device_id, initial_values);
Frank Praznikfa57a812014-04-14 10:11:33 -04001265 sc->led_count = 4;
Frank Praznik60781cf2014-01-11 15:13:15 -05001266 max_brightness = 1;
Frank Praznik61ebca92014-01-20 12:27:02 -05001267 use_colors = 0;
1268 name_len = strlen("::sony#");
1269 name_fmt = "%s::sony%d";
Frank Praznik60781cf2014-01-11 15:13:15 -05001270 }
1271
Frank Praznikad142b92014-02-20 11:36:00 -05001272 /*
1273 * Clear LEDs as we have no way of reading their initial state. This is
Colin Leitnerf04d5142013-05-27 23:41:05 +02001274 * only relevant if the driver is loaded after somebody actively set the
Frank Praznikad142b92014-02-20 11:36:00 -05001275 * LEDs to on
1276 */
Frank Praznikfa57a812014-04-14 10:11:33 -04001277 sony_set_leds(sc, initial_values, sc->led_count);
Colin Leitnerf04d5142013-05-27 23:41:05 +02001278
Sven Eckelmann0a286ef2013-11-19 20:26:32 +01001279 name_sz = strlen(dev_name(&hdev->dev)) + name_len + 1;
Colin Leitnerf04d5142013-05-27 23:41:05 +02001280
Frank Praznikfa57a812014-04-14 10:11:33 -04001281 for (n = 0; n < sc->led_count; n++) {
Frank Praznik61ebca92014-01-20 12:27:02 -05001282
1283 if (use_colors)
1284 name_sz = strlen(dev_name(&hdev->dev)) + strlen(color_str[n]) + 2;
1285
Jiri Kosina40e32ee2013-05-28 11:22:09 +02001286 led = kzalloc(sizeof(struct led_classdev) + name_sz, GFP_KERNEL);
1287 if (!led) {
1288 hid_err(hdev, "Couldn't allocate memory for LED %d\n", n);
Julia Lawall8cd5fcd2013-12-29 23:47:27 +01001289 ret = -ENOMEM;
Jiri Kosina40e32ee2013-05-28 11:22:09 +02001290 goto error_leds;
Colin Leitnerf04d5142013-05-27 23:41:05 +02001291 }
Jiri Kosina40e32ee2013-05-28 11:22:09 +02001292
1293 name = (void *)(&led[1]);
Frank Praznik61ebca92014-01-20 12:27:02 -05001294 if (use_colors)
1295 snprintf(name, name_sz, name_fmt, dev_name(&hdev->dev), color_str[n]);
1296 else
1297 snprintf(name, name_sz, name_fmt, dev_name(&hdev->dev), n + 1);
Jiri Kosina40e32ee2013-05-28 11:22:09 +02001298 led->name = name;
Frank Praznik80250872014-04-14 10:11:35 -04001299 led->brightness = initial_values[n];
Frank Praznik60781cf2014-01-11 15:13:15 -05001300 led->max_brightness = max_brightness;
Sven Eckelmannc5382512013-11-19 20:26:30 +01001301 led->brightness_get = sony_led_get_brightness;
1302 led->brightness_set = sony_led_set_brightness;
Jiri Kosina40e32ee2013-05-28 11:22:09 +02001303
Frank Praznik80250872014-04-14 10:11:35 -04001304 sc->leds[n] = led;
1305
Julia Lawall8cd5fcd2013-12-29 23:47:27 +01001306 ret = led_classdev_register(&hdev->dev, led);
1307 if (ret) {
Jiri Kosina40e32ee2013-05-28 11:22:09 +02001308 hid_err(hdev, "Failed to register LED %d\n", n);
Frank Praznik80250872014-04-14 10:11:35 -04001309 sc->leds[n] = NULL;
Jiri Kosina40e32ee2013-05-28 11:22:09 +02001310 kfree(led);
1311 goto error_leds;
1312 }
Colin Leitnerf04d5142013-05-27 23:41:05 +02001313 }
Colin Leitnerf04d5142013-05-27 23:41:05 +02001314
1315 return ret;
1316
Colin Leitnerf04d5142013-05-27 23:41:05 +02001317error_leds:
Frank Praznikfa57a812014-04-14 10:11:33 -04001318 sony_leds_remove(sc);
Colin Leitnerf04d5142013-05-27 23:41:05 +02001319
Colin Leitnerf04d5142013-05-27 23:41:05 +02001320 return ret;
Colin Leitnerf04d5142013-05-27 23:41:05 +02001321}
1322
Frank Praznikcad665a2014-01-11 15:13:54 -05001323static void sixaxis_state_worker(struct work_struct *work)
Sven Eckelmanna08c22c2013-11-09 19:25:57 +01001324{
Sven Eckelmann92b5c412013-11-19 20:26:28 +01001325 struct sony_sc *sc = container_of(work, struct sony_sc, state_worker);
Frank Praznik55d3b662014-04-14 10:11:32 -04001326 union sixaxis_output_report_01 report = {
1327 .buf = {
1328 0x01,
1329 0x00, 0xff, 0x00, 0xff, 0x00,
1330 0x00, 0x00, 0x00, 0x00, 0x00,
1331 0xff, 0x27, 0x10, 0x00, 0x32,
1332 0xff, 0x27, 0x10, 0x00, 0x32,
1333 0xff, 0x27, 0x10, 0x00, 0x32,
1334 0xff, 0x27, 0x10, 0x00, 0x32,
1335 0x00, 0x00, 0x00, 0x00, 0x00
1336 }
Sven Eckelmanna08c22c2013-11-09 19:25:57 +01001337 };
Sven Eckelmann9f323b62013-11-17 20:38:21 +01001338
Sven Eckelmann0a286ef2013-11-19 20:26:32 +01001339#ifdef CONFIG_SONY_FF
Frank Praznik55d3b662014-04-14 10:11:32 -04001340 report.data.rumble.right_motor_on = sc->right ? 1 : 0;
1341 report.data.rumble.left_motor_force = sc->left;
Sven Eckelmann0a286ef2013-11-19 20:26:32 +01001342#endif
1343
Frank Praznik55d3b662014-04-14 10:11:32 -04001344 report.data.leds_bitmap |= sc->led_state[0] << 1;
1345 report.data.leds_bitmap |= sc->led_state[1] << 2;
1346 report.data.leds_bitmap |= sc->led_state[2] << 3;
1347 report.data.leds_bitmap |= sc->led_state[3] << 4;
Sven Eckelmann9f323b62013-11-17 20:38:21 +01001348
Frank Praznik55d3b662014-04-14 10:11:32 -04001349 hid_hw_raw_request(sc->hdev, report.data.report_id, report.buf,
1350 sizeof(report), HID_OUTPUT_REPORT, HID_REQ_SET_REPORT);
Sven Eckelmann9f323b62013-11-17 20:38:21 +01001351}
1352
Frank Praznik0bd88dd2014-01-11 15:12:42 -05001353static void dualshock4_state_worker(struct work_struct *work)
1354{
1355 struct sony_sc *sc = container_of(work, struct sony_sc, state_worker);
Frank Praznik0da8ea62014-01-16 21:42:51 -05001356 struct hid_device *hdev = sc->hdev;
Frank Praznik48220232014-02-05 20:03:44 -05001357 int offset;
Frank Praznik0da8ea62014-01-16 21:42:51 -05001358
Frank Praznikfdcf105d2014-02-05 20:03:46 -05001359 __u8 buf[78] = { 0 };
Frank Praznik48220232014-02-05 20:03:44 -05001360
Frank Praznikfdcf105d2014-02-05 20:03:46 -05001361 if (sc->quirks & DUALSHOCK4_CONTROLLER_USB) {
1362 buf[0] = 0x05;
1363 buf[1] = 0x03;
1364 offset = 4;
1365 } else {
1366 buf[0] = 0x11;
1367 buf[1] = 0xB0;
1368 buf[3] = 0x0F;
1369 offset = 6;
1370 }
Frank Praznik0bd88dd2014-01-11 15:12:42 -05001371
1372#ifdef CONFIG_SONY_FF
Frank Praznik48220232014-02-05 20:03:44 -05001373 buf[offset++] = sc->right;
1374 buf[offset++] = sc->left;
1375#else
1376 offset += 2;
Frank Praznik0bd88dd2014-01-11 15:12:42 -05001377#endif
1378
Frank Praznik48220232014-02-05 20:03:44 -05001379 buf[offset++] = sc->led_state[0];
1380 buf[offset++] = sc->led_state[1];
1381 buf[offset++] = sc->led_state[2];
Frank Praznik60781cf2014-01-11 15:13:15 -05001382
Frank Praznikfdcf105d2014-02-05 20:03:46 -05001383 if (sc->quirks & DUALSHOCK4_CONTROLLER_USB)
1384 hid_hw_output_report(hdev, buf, 32);
1385 else
1386 hid_hw_raw_request(hdev, 0x11, buf, 78,
1387 HID_OUTPUT_REPORT, HID_REQ_SET_REPORT);
Frank Praznik0bd88dd2014-01-11 15:12:42 -05001388}
1389
Sven Eckelmann0a286ef2013-11-19 20:26:32 +01001390#ifdef CONFIG_SONY_FF
Sven Eckelmann9f323b62013-11-17 20:38:21 +01001391static int sony_play_effect(struct input_dev *dev, void *data,
1392 struct ff_effect *effect)
1393{
Sven Eckelmanna08c22c2013-11-09 19:25:57 +01001394 struct hid_device *hid = input_get_drvdata(dev);
Sven Eckelmann9f323b62013-11-17 20:38:21 +01001395 struct sony_sc *sc = hid_get_drvdata(hid);
Sven Eckelmanna08c22c2013-11-09 19:25:57 +01001396
1397 if (effect->type != FF_RUMBLE)
1398 return 0;
1399
Sven Eckelmann9f323b62013-11-17 20:38:21 +01001400 sc->left = effect->u.rumble.strong_magnitude / 256;
Frank Praznik0bd88dd2014-01-11 15:12:42 -05001401 sc->right = effect->u.rumble.weak_magnitude / 256;
Sven Eckelmanna08c22c2013-11-09 19:25:57 +01001402
Sven Eckelmann92b5c412013-11-19 20:26:28 +01001403 schedule_work(&sc->state_worker);
Sven Eckelmann9f323b62013-11-17 20:38:21 +01001404 return 0;
Sven Eckelmanna08c22c2013-11-09 19:25:57 +01001405}
1406
Frank Praznikfa57a812014-04-14 10:11:33 -04001407static int sony_init_ff(struct sony_sc *sc)
Sven Eckelmanna08c22c2013-11-09 19:25:57 +01001408{
Frank Praznikfa57a812014-04-14 10:11:33 -04001409 struct hid_input *hidinput = list_entry(sc->hdev->inputs.next,
Sven Eckelmanna08c22c2013-11-09 19:25:57 +01001410 struct hid_input, list);
1411 struct input_dev *input_dev = hidinput->input;
1412
1413 input_set_capability(input_dev, EV_FF, FF_RUMBLE);
1414 return input_ff_create_memless(input_dev, NULL, sony_play_effect);
1415}
1416
1417#else
Frank Praznikfa57a812014-04-14 10:11:33 -04001418static int sony_init_ff(struct sony_sc *sc)
Sven Eckelmanna08c22c2013-11-09 19:25:57 +01001419{
1420 return 0;
1421}
Sven Eckelmann9f323b62013-11-17 20:38:21 +01001422
Sven Eckelmanna08c22c2013-11-09 19:25:57 +01001423#endif
1424
Frank Praznikd902f472014-01-27 10:17:36 -05001425static int sony_battery_get_property(struct power_supply *psy,
1426 enum power_supply_property psp,
1427 union power_supply_propval *val)
Frank Praznikc4e1ddf2014-01-17 14:46:26 -05001428{
Frank Praznikd902f472014-01-27 10:17:36 -05001429 struct sony_sc *sc = container_of(psy, struct sony_sc, battery);
1430 unsigned long flags;
1431 int ret = 0;
1432 u8 battery_charging, battery_capacity, cable_state;
1433
1434 spin_lock_irqsave(&sc->lock, flags);
1435 battery_charging = sc->battery_charging;
1436 battery_capacity = sc->battery_capacity;
1437 cable_state = sc->cable_state;
1438 spin_unlock_irqrestore(&sc->lock, flags);
1439
1440 switch (psp) {
1441 case POWER_SUPPLY_PROP_PRESENT:
1442 val->intval = 1;
1443 break;
1444 case POWER_SUPPLY_PROP_SCOPE:
1445 val->intval = POWER_SUPPLY_SCOPE_DEVICE;
1446 break;
1447 case POWER_SUPPLY_PROP_CAPACITY:
1448 val->intval = battery_capacity;
1449 break;
1450 case POWER_SUPPLY_PROP_STATUS:
1451 if (battery_charging)
1452 val->intval = POWER_SUPPLY_STATUS_CHARGING;
1453 else
1454 if (battery_capacity == 100 && cable_state)
1455 val->intval = POWER_SUPPLY_STATUS_FULL;
1456 else
1457 val->intval = POWER_SUPPLY_STATUS_DISCHARGING;
1458 break;
1459 default:
1460 ret = -EINVAL;
1461 break;
1462 }
1463 return ret;
1464}
1465
1466static int sony_battery_probe(struct sony_sc *sc)
1467{
Frank Praznikc4e1ddf2014-01-17 14:46:26 -05001468 struct hid_device *hdev = sc->hdev;
Frank Praznikd902f472014-01-27 10:17:36 -05001469 int ret;
Frank Praznikc4e1ddf2014-01-17 14:46:26 -05001470
Frank Praznikad142b92014-02-20 11:36:00 -05001471 /*
1472 * Set the default battery level to 100% to avoid low battery warnings
Frank Praznikd9a293a2014-02-05 20:03:48 -05001473 * if the battery is polled before the first device report is received.
1474 */
1475 sc->battery_capacity = 100;
Frank Praznikc4e1ddf2014-01-17 14:46:26 -05001476
Frank Praznikd902f472014-01-27 10:17:36 -05001477 sc->battery.properties = sony_battery_props;
1478 sc->battery.num_properties = ARRAY_SIZE(sony_battery_props);
1479 sc->battery.get_property = sony_battery_get_property;
1480 sc->battery.type = POWER_SUPPLY_TYPE_BATTERY;
1481 sc->battery.use_for_apm = 0;
Frank Praznik314531f2014-04-14 10:11:34 -04001482 sc->battery.name = kasprintf(GFP_KERNEL, "sony_controller_battery_%pMR",
1483 sc->mac_address);
Frank Praznikd902f472014-01-27 10:17:36 -05001484 if (!sc->battery.name)
1485 return -ENOMEM;
1486
1487 ret = power_supply_register(&hdev->dev, &sc->battery);
1488 if (ret) {
1489 hid_err(hdev, "Unable to register battery device\n");
1490 goto err_free;
1491 }
1492
1493 power_supply_powers(&sc->battery, &hdev->dev);
1494 return 0;
1495
1496err_free:
1497 kfree(sc->battery.name);
1498 sc->battery.name = NULL;
1499 return ret;
1500}
1501
1502static void sony_battery_remove(struct sony_sc *sc)
1503{
1504 if (!sc->battery.name)
1505 return;
1506
1507 power_supply_unregister(&sc->battery);
1508 kfree(sc->battery.name);
1509 sc->battery.name = NULL;
1510}
1511
Frank Praznike5606232014-01-27 10:17:37 -05001512static int sony_register_touchpad(struct sony_sc *sc, int touch_count,
1513 int w, int h)
1514{
1515 struct hid_input *hidinput = list_entry(sc->hdev->inputs.next,
1516 struct hid_input, list);
1517 struct input_dev *input_dev = hidinput->input;
1518 int ret;
1519
1520 ret = input_mt_init_slots(input_dev, touch_count, 0);
1521 if (ret < 0) {
1522 hid_err(sc->hdev, "Unable to initialize multi-touch slots\n");
1523 return ret;
1524 }
1525
1526 input_set_abs_params(input_dev, ABS_MT_POSITION_X, 0, w, 0, 0);
1527 input_set_abs_params(input_dev, ABS_MT_POSITION_Y, 0, h, 0, 0);
1528
1529 return 0;
1530}
1531
Frank Praznikd2d782f2014-02-20 11:36:03 -05001532/*
1533 * If a controller is plugged in via USB while already connected via Bluetooth
1534 * it will show up as two devices. A global list of connected controllers and
1535 * their MAC addresses is maintained to ensure that a device is only connected
1536 * once.
1537 */
1538static int sony_check_add_dev_list(struct sony_sc *sc)
1539{
1540 struct sony_sc *entry;
1541 unsigned long flags;
1542 int ret;
1543
1544 spin_lock_irqsave(&sony_dev_list_lock, flags);
1545
1546 list_for_each_entry(entry, &sony_device_list, list_node) {
1547 ret = memcmp(sc->mac_address, entry->mac_address,
1548 sizeof(sc->mac_address));
1549 if (!ret) {
1550 ret = -EEXIST;
1551 hid_info(sc->hdev, "controller with MAC address %pMR already connected\n",
1552 sc->mac_address);
1553 goto unlock;
Frank Praznikc4e1ddf2014-01-17 14:46:26 -05001554 }
1555 }
1556
Frank Praznikd2d782f2014-02-20 11:36:03 -05001557 ret = 0;
1558 list_add(&(sc->list_node), &sony_device_list);
Frank Praznikc4e1ddf2014-01-17 14:46:26 -05001559
Frank Praznikd2d782f2014-02-20 11:36:03 -05001560unlock:
1561 spin_unlock_irqrestore(&sony_dev_list_lock, flags);
1562 return ret;
Frank Praznikc4e1ddf2014-01-17 14:46:26 -05001563}
1564
Frank Praznikd2d782f2014-02-20 11:36:03 -05001565static void sony_remove_dev_list(struct sony_sc *sc)
1566{
1567 unsigned long flags;
1568
1569 if (sc->list_node.next) {
1570 spin_lock_irqsave(&sony_dev_list_lock, flags);
1571 list_del(&(sc->list_node));
1572 spin_unlock_irqrestore(&sony_dev_list_lock, flags);
1573 }
1574}
1575
1576static int sony_get_bt_devaddr(struct sony_sc *sc)
1577{
1578 int ret;
1579
1580 /* HIDP stores the device MAC address as a string in the uniq field. */
1581 ret = strlen(sc->hdev->uniq);
1582 if (ret != 17)
1583 return -EINVAL;
1584
1585 ret = sscanf(sc->hdev->uniq,
1586 "%02hhx:%02hhx:%02hhx:%02hhx:%02hhx:%02hhx",
1587 &sc->mac_address[5], &sc->mac_address[4], &sc->mac_address[3],
1588 &sc->mac_address[2], &sc->mac_address[1], &sc->mac_address[0]);
1589
1590 if (ret != 6)
1591 return -EINVAL;
1592
1593 return 0;
1594}
1595
1596static int sony_check_add(struct sony_sc *sc)
1597{
1598 int n, ret;
1599
1600 if ((sc->quirks & DUALSHOCK4_CONTROLLER_BT) ||
1601 (sc->quirks & SIXAXIS_CONTROLLER_BT)) {
1602 /*
1603 * sony_get_bt_devaddr() attempts to parse the Bluetooth MAC
1604 * address from the uniq string where HIDP stores it.
1605 * As uniq cannot be guaranteed to be a MAC address in all cases
1606 * a failure of this function should not prevent the connection.
1607 */
1608 if (sony_get_bt_devaddr(sc) < 0) {
1609 hid_warn(sc->hdev, "UNIQ does not contain a MAC address; duplicate check skipped\n");
1610 return 0;
1611 }
1612 } else if (sc->quirks & DUALSHOCK4_CONTROLLER_USB) {
1613 __u8 buf[7];
1614
1615 /*
1616 * The MAC address of a DS4 controller connected via USB can be
1617 * retrieved with feature report 0x81. The address begins at
1618 * offset 1.
1619 */
1620 ret = hid_hw_raw_request(sc->hdev, 0x81, buf, sizeof(buf),
1621 HID_FEATURE_REPORT, HID_REQ_GET_REPORT);
1622
1623 if (ret != 7) {
1624 hid_err(sc->hdev, "failed to retrieve feature report 0x81 with the DualShock 4 MAC address\n");
1625 return ret < 0 ? ret : -EINVAL;
1626 }
1627
1628 memcpy(sc->mac_address, &buf[1], sizeof(sc->mac_address));
1629 } else if (sc->quirks & SIXAXIS_CONTROLLER_USB) {
1630 __u8 buf[18];
1631
1632 /*
1633 * The MAC address of a Sixaxis controller connected via USB can
1634 * be retrieved with feature report 0xf2. The address begins at
1635 * offset 4.
1636 */
1637 ret = hid_hw_raw_request(sc->hdev, 0xf2, buf, sizeof(buf),
1638 HID_FEATURE_REPORT, HID_REQ_GET_REPORT);
1639
1640 if (ret != 18) {
1641 hid_err(sc->hdev, "failed to retrieve feature report 0xf2 with the Sixaxis MAC address\n");
1642 return ret < 0 ? ret : -EINVAL;
1643 }
1644
1645 /*
1646 * The Sixaxis device MAC in the report is big-endian and must
1647 * be byte-swapped.
1648 */
1649 for (n = 0; n < 6; n++)
1650 sc->mac_address[5-n] = buf[4+n];
1651 } else {
1652 return 0;
1653 }
1654
1655 return sony_check_add_dev_list(sc);
1656}
1657
Frank Praznik80250872014-04-14 10:11:35 -04001658static int sony_set_device_id(struct sony_sc *sc)
1659{
1660 int ret;
1661
1662 /*
1663 * Only DualShock 4 or Sixaxis controllers get an id.
1664 * All others are set to -1.
1665 */
1666 if ((sc->quirks & SIXAXIS_CONTROLLER) ||
1667 (sc->quirks & DUALSHOCK4_CONTROLLER)) {
1668 ret = ida_simple_get(&sony_device_id_allocator, 0, 0,
1669 GFP_KERNEL);
1670 if (ret < 0) {
1671 sc->device_id = -1;
1672 return ret;
1673 }
1674 sc->device_id = ret;
1675 } else {
1676 sc->device_id = -1;
1677 }
1678
1679 return 0;
1680}
1681
1682static void sony_release_device_id(struct sony_sc *sc)
1683{
1684 if (sc->device_id >= 0) {
1685 ida_simple_remove(&sony_device_id_allocator, sc->device_id);
1686 sc->device_id = -1;
1687 }
1688}
1689
Frank Praznik46262042014-04-14 10:11:31 -04001690static inline void sony_init_work(struct sony_sc *sc,
1691 void (*worker)(struct work_struct *))
1692{
1693 if (!sc->worker_initialized)
1694 INIT_WORK(&sc->state_worker, worker);
1695
1696 sc->worker_initialized = 1;
1697}
1698
1699static inline void sony_cancel_work_sync(struct sony_sc *sc)
1700{
1701 if (sc->worker_initialized)
1702 cancel_work_sync(&sc->state_worker);
1703}
Frank Praznikd2d782f2014-02-20 11:36:03 -05001704
Jiri Slabybd28ce02008-06-25 23:47:04 +02001705static int sony_probe(struct hid_device *hdev, const struct hid_device_id *id)
1706{
1707 int ret;
Jiri Kosinacc6e0bb2008-10-23 12:58:38 +02001708 unsigned long quirks = id->driver_data;
1709 struct sony_sc *sc;
Colin Leitnerf04d5142013-05-27 23:41:05 +02001710 unsigned int connect_mask = HID_CONNECT_DEFAULT;
Jiri Kosinacc6e0bb2008-10-23 12:58:38 +02001711
Benjamin Tissoiresabf832b2013-07-24 19:38:04 +02001712 sc = devm_kzalloc(&hdev->dev, sizeof(*sc), GFP_KERNEL);
Jiri Kosinacc6e0bb2008-10-23 12:58:38 +02001713 if (sc == NULL) {
Joe Perches4291ee32010-12-09 19:29:03 -08001714 hid_err(hdev, "can't alloc sony descriptor\n");
Jiri Kosinacc6e0bb2008-10-23 12:58:38 +02001715 return -ENOMEM;
1716 }
1717
1718 sc->quirks = quirks;
1719 hid_set_drvdata(hdev, sc);
Sven Eckelmann0a286ef2013-11-19 20:26:32 +01001720 sc->hdev = hdev;
Jiri Slabybd28ce02008-06-25 23:47:04 +02001721
Jiri Slabybd28ce02008-06-25 23:47:04 +02001722 ret = hid_parse(hdev);
1723 if (ret) {
Joe Perches4291ee32010-12-09 19:29:03 -08001724 hid_err(hdev, "parse failed\n");
Benjamin Tissoiresabf832b2013-07-24 19:38:04 +02001725 return ret;
Jiri Slabybd28ce02008-06-25 23:47:04 +02001726 }
1727
Colin Leitnerf04d5142013-05-27 23:41:05 +02001728 if (sc->quirks & VAIO_RDESC_CONSTANT)
1729 connect_mask |= HID_CONNECT_HIDDEV_FORCE;
1730 else if (sc->quirks & SIXAXIS_CONTROLLER_USB)
1731 connect_mask |= HID_CONNECT_HIDDEV_FORCE;
1732 else if (sc->quirks & SIXAXIS_CONTROLLER_BT)
1733 connect_mask |= HID_CONNECT_HIDDEV_FORCE;
1734
1735 ret = hid_hw_start(hdev, connect_mask);
Jiri Slabybd28ce02008-06-25 23:47:04 +02001736 if (ret) {
Joe Perches4291ee32010-12-09 19:29:03 -08001737 hid_err(hdev, "hw start failed\n");
Benjamin Tissoiresabf832b2013-07-24 19:38:04 +02001738 return ret;
Jiri Slabybd28ce02008-06-25 23:47:04 +02001739 }
1740
Frank Praznik80250872014-04-14 10:11:35 -04001741 ret = sony_set_device_id(sc);
1742 if (ret < 0) {
1743 hid_err(hdev, "failed to allocate the device id\n");
1744 goto err_stop;
1745 }
1746
Antonio Ospite569b10a2010-10-19 16:13:10 +02001747 if (sc->quirks & SIXAXIS_CONTROLLER_USB) {
Benjamin Tissoirese534a932014-03-08 22:52:42 -05001748 /*
1749 * The Sony Sixaxis does not handle HID Output Reports on the
1750 * Interrupt EP like it could, so we need to force HID Output
1751 * Reports to use HID_REQ_SET_REPORT on the Control EP.
1752 *
1753 * There is also another issue about HID Output Reports via USB,
1754 * the Sixaxis does not want the report_id as part of the data
1755 * packet, so we have to discard buf[0] when sending the actual
1756 * control message, even for numbered reports, humpf!
1757 */
1758 hdev->quirks |= HID_QUIRK_NO_OUTPUT_REPORTS_ON_INTR_EP;
1759 hdev->quirks |= HID_QUIRK_SKIP_OUTPUT_REPORT_ID;
Antonio Ospite816651a2010-05-03 22:15:55 +02001760 ret = sixaxis_set_operational_usb(hdev);
Frank Praznik46262042014-04-14 10:11:31 -04001761 sony_init_work(sc, sixaxis_state_worker);
Frank Praznikfee4e2d2014-02-18 17:22:01 -05001762 } else if (sc->quirks & SIXAXIS_CONTROLLER_BT) {
Frank Praznik2078b9bb2014-03-15 09:41:16 -04001763 /*
1764 * The Sixaxis wants output reports sent on the ctrl endpoint
1765 * when connected via Bluetooth.
1766 */
1767 hdev->quirks |= HID_QUIRK_NO_OUTPUT_REPORTS_ON_INTR_EP;
Antonio Ospite816651a2010-05-03 22:15:55 +02001768 ret = sixaxis_set_operational_bt(hdev);
Frank Praznik46262042014-04-14 10:11:31 -04001769 sony_init_work(sc, sixaxis_state_worker);
Frank Praznikfee4e2d2014-02-18 17:22:01 -05001770 } else if (sc->quirks & DUALSHOCK4_CONTROLLER) {
Frank Praznik68330d82014-02-05 20:03:49 -05001771 if (sc->quirks & DUALSHOCK4_CONTROLLER_BT) {
Frank Praznik2078b9bb2014-03-15 09:41:16 -04001772 /*
1773 * The DualShock 4 wants output reports sent on the ctrl
1774 * endpoint when connected via Bluetooth.
1775 */
1776 hdev->quirks |= HID_QUIRK_NO_OUTPUT_REPORTS_ON_INTR_EP;
Frank Praznik68330d82014-02-05 20:03:49 -05001777 ret = dualshock4_set_operational_bt(hdev);
1778 if (ret < 0) {
1779 hid_err(hdev, "failed to set the Dualshock 4 operational mode\n");
1780 goto err_stop;
1781 }
1782 }
Frank Praznikad142b92014-02-20 11:36:00 -05001783 /*
1784 * The Dualshock 4 touchpad supports 2 touches and has a
Frank Praznike5606232014-01-27 10:17:37 -05001785 * resolution of 1920x940.
1786 */
1787 ret = sony_register_touchpad(sc, 2, 1920, 940);
Frank Praznikc4e1ddf2014-01-17 14:46:26 -05001788 if (ret < 0)
1789 goto err_stop;
1790
Frank Praznik46262042014-04-14 10:11:31 -04001791 sony_init_work(sc, dualshock4_state_worker);
Frank Praznik0bd88dd2014-01-11 15:12:42 -05001792 } else {
1793 ret = 0;
1794 }
Bastien Noceraf9ce7c22010-01-20 12:01:53 +00001795
Jiri Kosina4dfdc462008-12-30 00:49:59 +01001796 if (ret < 0)
Jiri Slabybd28ce02008-06-25 23:47:04 +02001797 goto err_stop;
1798
Frank Praznikd2d782f2014-02-20 11:36:03 -05001799 ret = sony_check_add(sc);
1800 if (ret < 0)
1801 goto err_stop;
1802
Sven Eckelmann0a286ef2013-11-19 20:26:32 +01001803 if (sc->quirks & SONY_LED_SUPPORT) {
Frank Praznikfa57a812014-04-14 10:11:33 -04001804 ret = sony_leds_init(sc);
Sven Eckelmann0a286ef2013-11-19 20:26:32 +01001805 if (ret < 0)
1806 goto err_stop;
1807 }
1808
Frank Praznikd902f472014-01-27 10:17:36 -05001809 if (sc->quirks & SONY_BATTERY_SUPPORT) {
1810 ret = sony_battery_probe(sc);
1811 if (ret < 0)
1812 goto err_stop;
1813
1814 /* Open the device to receive reports with battery info */
1815 ret = hid_hw_open(hdev);
1816 if (ret < 0) {
1817 hid_err(hdev, "hw open failed\n");
1818 goto err_stop;
1819 }
1820 }
1821
Frank Praznikc8de9db2014-02-20 11:36:01 -05001822 if (sc->quirks & SONY_FF_SUPPORT) {
Frank Praznikfa57a812014-04-14 10:11:33 -04001823 ret = sony_init_ff(sc);
Frank Praznikc8de9db2014-02-20 11:36:01 -05001824 if (ret < 0)
1825 goto err_close;
Frank Praznik5f5750d2014-02-19 13:09:22 -05001826 }
Sven Eckelmanna08c22c2013-11-09 19:25:57 +01001827
Jiri Slabybd28ce02008-06-25 23:47:04 +02001828 return 0;
Frank Praznikd902f472014-01-27 10:17:36 -05001829err_close:
1830 hid_hw_close(hdev);
Jiri Slabybd28ce02008-06-25 23:47:04 +02001831err_stop:
Sven Eckelmann0a286ef2013-11-19 20:26:32 +01001832 if (sc->quirks & SONY_LED_SUPPORT)
Frank Praznikfa57a812014-04-14 10:11:33 -04001833 sony_leds_remove(sc);
Frank Praznikd902f472014-01-27 10:17:36 -05001834 if (sc->quirks & SONY_BATTERY_SUPPORT)
1835 sony_battery_remove(sc);
Frank Praznik46262042014-04-14 10:11:31 -04001836 sony_cancel_work_sync(sc);
Frank Praznikd2d782f2014-02-20 11:36:03 -05001837 sony_remove_dev_list(sc);
Frank Praznik80250872014-04-14 10:11:35 -04001838 sony_release_device_id(sc);
Jiri Slabybd28ce02008-06-25 23:47:04 +02001839 hid_hw_stop(hdev);
Jiri Slabybd28ce02008-06-25 23:47:04 +02001840 return ret;
1841}
1842
Jiri Kosinacc6e0bb2008-10-23 12:58:38 +02001843static void sony_remove(struct hid_device *hdev)
1844{
Colin Leitnerf04d5142013-05-27 23:41:05 +02001845 struct sony_sc *sc = hid_get_drvdata(hdev);
1846
Sven Eckelmann0a286ef2013-11-19 20:26:32 +01001847 if (sc->quirks & SONY_LED_SUPPORT)
Frank Praznikfa57a812014-04-14 10:11:33 -04001848 sony_leds_remove(sc);
Colin Leitnerf04d5142013-05-27 23:41:05 +02001849
Frank Praznikd902f472014-01-27 10:17:36 -05001850 if (sc->quirks & SONY_BATTERY_SUPPORT) {
1851 hid_hw_close(hdev);
1852 sony_battery_remove(sc);
1853 }
1854
Frank Praznik46262042014-04-14 10:11:31 -04001855 sony_cancel_work_sync(sc);
Sven Eckelmann9f323b62013-11-17 20:38:21 +01001856
Frank Praznikd2d782f2014-02-20 11:36:03 -05001857 sony_remove_dev_list(sc);
Jiri Slabybd28ce02008-06-25 23:47:04 +02001858
Frank Praznik80250872014-04-14 10:11:35 -04001859 sony_release_device_id(sc);
1860
Jiri Slabybd28ce02008-06-25 23:47:04 +02001861 hid_hw_stop(hdev);
1862}
1863
1864static const struct hid_device_id sony_devices[] = {
1865 { HID_USB_DEVICE(USB_VENDOR_ID_SONY, USB_DEVICE_ID_SONY_PS3_CONTROLLER),
1866 .driver_data = SIXAXIS_CONTROLLER_USB },
1867 { HID_USB_DEVICE(USB_VENDOR_ID_SONY, USB_DEVICE_ID_SONY_NAVIGATION_CONTROLLER),
1868 .driver_data = SIXAXIS_CONTROLLER_USB },
1869 { HID_BLUETOOTH_DEVICE(USB_VENDOR_ID_SONY, USB_DEVICE_ID_SONY_PS3_CONTROLLER),
1870 .driver_data = SIXAXIS_CONTROLLER_BT },
1871 { HID_USB_DEVICE(USB_VENDOR_ID_SONY, USB_DEVICE_ID_SONY_VAIO_VGX_MOUSE),
1872 .driver_data = VAIO_RDESC_CONSTANT },
1873 { HID_USB_DEVICE(USB_VENDOR_ID_SONY, USB_DEVICE_ID_SONY_VAIO_VGP_MOUSE),
1874 .driver_data = VAIO_RDESC_CONSTANT },
1875 /* Wired Buzz Controller. Reported as Sony Hub from its USB ID and as
1876 * Logitech joystick from the device descriptor. */
1877 { HID_USB_DEVICE(USB_VENDOR_ID_SONY, USB_DEVICE_ID_SONY_BUZZ_CONTROLLER),
1878 .driver_data = BUZZ_CONTROLLER },
1879 { HID_USB_DEVICE(USB_VENDOR_ID_SONY, USB_DEVICE_ID_SONY_WIRELESS_BUZZ_CONTROLLER),
1880 .driver_data = BUZZ_CONTROLLER },
1881 /* PS3 BD Remote Control */
1882 { HID_BLUETOOTH_DEVICE(USB_VENDOR_ID_SONY, USB_DEVICE_ID_SONY_PS3_BDREMOTE),
1883 .driver_data = PS3REMOTE },
1884 /* Logitech Harmony Adapter for PS3 */
1885 { HID_BLUETOOTH_DEVICE(USB_VENDOR_ID_LOGITECH, USB_DEVICE_ID_LOGITECH_HARMONY_PS3),
1886 .driver_data = PS3REMOTE },
Frank Praznik0bd88dd2014-01-11 15:12:42 -05001887 /* Sony Dualshock 4 controllers for PS4 */
1888 { HID_USB_DEVICE(USB_VENDOR_ID_SONY, USB_DEVICE_ID_SONY_PS4_CONTROLLER),
Frank Praznik8ab16762014-01-16 21:42:31 -05001889 .driver_data = DUALSHOCK4_CONTROLLER_USB },
Frank Praznik0bd88dd2014-01-11 15:12:42 -05001890 { HID_BLUETOOTH_DEVICE(USB_VENDOR_ID_SONY, USB_DEVICE_ID_SONY_PS4_CONTROLLER),
Frank Praznik8ab16762014-01-16 21:42:31 -05001891 .driver_data = DUALSHOCK4_CONTROLLER_BT },
Jiri Slabybd28ce02008-06-25 23:47:04 +02001892 { }
1893};
1894MODULE_DEVICE_TABLE(hid, sony_devices);
1895
1896static struct hid_driver sony_driver = {
1897 .name = "sony",
1898 .id_table = sony_devices,
1899 .input_mapping = sony_mapping,
1900 .probe = sony_probe,
1901 .remove = sony_remove,
1902 .report_fixup = sony_report_fixup,
1903 .raw_event = sony_raw_event
1904};
Frank Praznik80250872014-04-14 10:11:35 -04001905
1906static int __init sony_init(void)
1907{
1908 dbg_hid("Sony:%s\n", __func__);
1909
1910 return hid_register_driver(&sony_driver);
1911}
1912
1913static void __exit sony_exit(void)
1914{
1915 dbg_hid("Sony:%s\n", __func__);
1916
1917 ida_destroy(&sony_device_id_allocator);
1918 hid_unregister_driver(&sony_driver);
1919}
1920module_init(sony_init);
1921module_exit(sony_exit);
Jiri Slabybd28ce02008-06-25 23:47:04 +02001922
1923MODULE_LICENSE("GPL");