blob: 8973f087a1a27d42df6c0ef630d2b3d5bc1a280b [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 Praznike5606232014-01-27 10:17:37 -050036#include <linux/input/mt.h>
Jiri Slabybd28ce02008-06-25 23:47:04 +020037
38#include "hid-ids.h"
39
Frank Praznik6c79c182014-01-16 21:43:03 -050040#define VAIO_RDESC_CONSTANT BIT(0)
41#define SIXAXIS_CONTROLLER_USB BIT(1)
42#define SIXAXIS_CONTROLLER_BT BIT(2)
43#define BUZZ_CONTROLLER BIT(3)
44#define PS3REMOTE BIT(4)
Frank Praznik8ab16762014-01-16 21:42:31 -050045#define DUALSHOCK4_CONTROLLER_USB BIT(5)
46#define DUALSHOCK4_CONTROLLER_BT BIT(6)
Jiri Kosinacc6e0bb2008-10-23 12:58:38 +020047
Frank Praznikfee4e2d2014-02-18 17:22:01 -050048#define SIXAXIS_CONTROLLER (SIXAXIS_CONTROLLER_USB | SIXAXIS_CONTROLLER_BT)
Frank Praznik68330d82014-02-05 20:03:49 -050049#define DUALSHOCK4_CONTROLLER (DUALSHOCK4_CONTROLLER_USB |\
50 DUALSHOCK4_CONTROLLER_BT)
Frank Praznikfee4e2d2014-02-18 17:22:01 -050051#define SONY_LED_SUPPORT (SIXAXIS_CONTROLLER | BUZZ_CONTROLLER |\
Frank Praznik68330d82014-02-05 20:03:49 -050052 DUALSHOCK4_CONTROLLER)
Frank Praznikfee4e2d2014-02-18 17:22:01 -050053#define SONY_BATTERY_SUPPORT (SIXAXIS_CONTROLLER | DUALSHOCK4_CONTROLLER)
Frank Praznikc8de9db2014-02-20 11:36:01 -050054#define SONY_FF_SUPPORT (SIXAXIS_CONTROLLER | DUALSHOCK4_CONTROLLER)
Frank Praznik60781cf2014-01-11 15:13:15 -050055
56#define MAX_LEDS 4
Sven Eckelmann0a286ef2013-11-19 20:26:32 +010057
Simon Wood61ab44b2011-06-10 12:00:26 +020058static const u8 sixaxis_rdesc_fixup[] = {
59 0x95, 0x13, 0x09, 0x01, 0x81, 0x02, 0x95, 0x0C,
60 0x81, 0x01, 0x75, 0x10, 0x95, 0x04, 0x26, 0xFF,
61 0x03, 0x46, 0xFF, 0x03, 0x09, 0x01, 0x81, 0x02
62};
63
Mauro Carvalho Chehabe57a67d2012-12-14 20:57:34 -020064static const u8 sixaxis_rdesc_fixup2[] = {
65 0x05, 0x01, 0x09, 0x04, 0xa1, 0x01, 0xa1, 0x02,
66 0x85, 0x01, 0x75, 0x08, 0x95, 0x01, 0x15, 0x00,
67 0x26, 0xff, 0x00, 0x81, 0x03, 0x75, 0x01, 0x95,
68 0x13, 0x15, 0x00, 0x25, 0x01, 0x35, 0x00, 0x45,
69 0x01, 0x05, 0x09, 0x19, 0x01, 0x29, 0x13, 0x81,
70 0x02, 0x75, 0x01, 0x95, 0x0d, 0x06, 0x00, 0xff,
71 0x81, 0x03, 0x15, 0x00, 0x26, 0xff, 0x00, 0x05,
72 0x01, 0x09, 0x01, 0xa1, 0x00, 0x75, 0x08, 0x95,
73 0x04, 0x35, 0x00, 0x46, 0xff, 0x00, 0x09, 0x30,
74 0x09, 0x31, 0x09, 0x32, 0x09, 0x35, 0x81, 0x02,
75 0xc0, 0x05, 0x01, 0x95, 0x13, 0x09, 0x01, 0x81,
76 0x02, 0x95, 0x0c, 0x81, 0x01, 0x75, 0x10, 0x95,
77 0x04, 0x26, 0xff, 0x03, 0x46, 0xff, 0x03, 0x09,
78 0x01, 0x81, 0x02, 0xc0, 0xa1, 0x02, 0x85, 0x02,
79 0x75, 0x08, 0x95, 0x30, 0x09, 0x01, 0xb1, 0x02,
80 0xc0, 0xa1, 0x02, 0x85, 0xee, 0x75, 0x08, 0x95,
81 0x30, 0x09, 0x01, 0xb1, 0x02, 0xc0, 0xa1, 0x02,
82 0x85, 0xef, 0x75, 0x08, 0x95, 0x30, 0x09, 0x01,
83 0xb1, 0x02, 0xc0, 0xc0,
84};
85
Frank Praznikad142b92014-02-20 11:36:00 -050086/*
87 * The default descriptor doesn't provide mapping for the accelerometers
Frank Praznik58d70272014-01-20 12:27:01 -050088 * or orientation sensors. This fixed descriptor maps the accelerometers
89 * to usage values 0x40, 0x41 and 0x42 and maps the orientation sensors
90 * to usage values 0x43, 0x44 and 0x45.
91 */
Frank Prazniked19d8c2014-01-16 21:43:12 -050092static u8 dualshock4_usb_rdesc[] = {
Frank Praznik58d70272014-01-20 12:27:01 -050093 0x05, 0x01, /* Usage Page (Desktop), */
94 0x09, 0x05, /* Usage (Gamepad), */
95 0xA1, 0x01, /* Collection (Application), */
96 0x85, 0x01, /* Report ID (1), */
97 0x09, 0x30, /* Usage (X), */
98 0x09, 0x31, /* Usage (Y), */
99 0x09, 0x32, /* Usage (Z), */
100 0x09, 0x35, /* Usage (Rz), */
101 0x15, 0x00, /* Logical Minimum (0), */
102 0x26, 0xFF, 0x00, /* Logical Maximum (255), */
103 0x75, 0x08, /* Report Size (8), */
104 0x95, 0x04, /* Report Count (4), */
105 0x81, 0x02, /* Input (Variable), */
106 0x09, 0x39, /* Usage (Hat Switch), */
107 0x15, 0x00, /* Logical Minimum (0), */
108 0x25, 0x07, /* Logical Maximum (7), */
109 0x35, 0x00, /* Physical Minimum (0), */
110 0x46, 0x3B, 0x01, /* Physical Maximum (315), */
111 0x65, 0x14, /* Unit (Degrees), */
112 0x75, 0x04, /* Report Size (4), */
113 0x95, 0x01, /* Report Count (1), */
114 0x81, 0x42, /* Input (Variable, Null State), */
115 0x65, 0x00, /* Unit, */
116 0x05, 0x09, /* Usage Page (Button), */
117 0x19, 0x01, /* Usage Minimum (01h), */
118 0x29, 0x0E, /* Usage Maximum (0Eh), */
119 0x15, 0x00, /* Logical Minimum (0), */
120 0x25, 0x01, /* Logical Maximum (1), */
121 0x75, 0x01, /* Report Size (1), */
122 0x95, 0x0E, /* Report Count (14), */
123 0x81, 0x02, /* Input (Variable), */
124 0x06, 0x00, 0xFF, /* Usage Page (FF00h), */
125 0x09, 0x20, /* Usage (20h), */
126 0x75, 0x06, /* Report Size (6), */
127 0x95, 0x01, /* Report Count (1), */
128 0x15, 0x00, /* Logical Minimum (0), */
129 0x25, 0x7F, /* Logical Maximum (127), */
130 0x81, 0x02, /* Input (Variable), */
131 0x05, 0x01, /* Usage Page (Desktop), */
132 0x09, 0x33, /* Usage (Rx), */
133 0x09, 0x34, /* Usage (Ry), */
134 0x15, 0x00, /* Logical Minimum (0), */
135 0x26, 0xFF, 0x00, /* Logical Maximum (255), */
136 0x75, 0x08, /* Report Size (8), */
137 0x95, 0x02, /* Report Count (2), */
138 0x81, 0x02, /* Input (Variable), */
139 0x06, 0x00, 0xFF, /* Usage Page (FF00h), */
140 0x09, 0x21, /* Usage (21h), */
141 0x95, 0x03, /* Report Count (3), */
142 0x81, 0x02, /* Input (Variable), */
143 0x05, 0x01, /* Usage Page (Desktop), */
144 0x19, 0x40, /* Usage Minimum (40h), */
145 0x29, 0x42, /* Usage Maximum (42h), */
146 0x16, 0x00, 0x80, /* Logical Minimum (-32768), */
147 0x26, 0x00, 0x7F, /* Logical Maximum (32767), */
148 0x75, 0x10, /* Report Size (16), */
149 0x95, 0x03, /* Report Count (3), */
150 0x81, 0x02, /* Input (Variable), */
151 0x19, 0x43, /* Usage Minimum (43h), */
152 0x29, 0x45, /* Usage Maximum (45h), */
153 0x16, 0xFF, 0xBF, /* Logical Minimum (-16385), */
154 0x26, 0x00, 0x40, /* Logical Maximum (16384), */
155 0x95, 0x03, /* Report Count (3), */
156 0x81, 0x02, /* Input (Variable), */
157 0x06, 0x00, 0xFF, /* Usage Page (FF00h), */
158 0x09, 0x21, /* Usage (21h), */
159 0x15, 0x00, /* Logical Minimum (0), */
160 0x25, 0xFF, /* Logical Maximum (255), */
161 0x75, 0x08, /* Report Size (8), */
162 0x95, 0x27, /* Report Count (39), */
163 0x81, 0x02, /* Input (Variable), */
164 0x85, 0x05, /* Report ID (5), */
165 0x09, 0x22, /* Usage (22h), */
166 0x95, 0x1F, /* Report Count (31), */
167 0x91, 0x02, /* Output (Variable), */
168 0x85, 0x04, /* Report ID (4), */
169 0x09, 0x23, /* Usage (23h), */
170 0x95, 0x24, /* Report Count (36), */
171 0xB1, 0x02, /* Feature (Variable), */
172 0x85, 0x02, /* Report ID (2), */
173 0x09, 0x24, /* Usage (24h), */
174 0x95, 0x24, /* Report Count (36), */
175 0xB1, 0x02, /* Feature (Variable), */
176 0x85, 0x08, /* Report ID (8), */
177 0x09, 0x25, /* Usage (25h), */
178 0x95, 0x03, /* Report Count (3), */
179 0xB1, 0x02, /* Feature (Variable), */
180 0x85, 0x10, /* Report ID (16), */
181 0x09, 0x26, /* Usage (26h), */
182 0x95, 0x04, /* Report Count (4), */
183 0xB1, 0x02, /* Feature (Variable), */
184 0x85, 0x11, /* Report ID (17), */
185 0x09, 0x27, /* Usage (27h), */
186 0x95, 0x02, /* Report Count (2), */
187 0xB1, 0x02, /* Feature (Variable), */
188 0x85, 0x12, /* Report ID (18), */
189 0x06, 0x02, 0xFF, /* Usage Page (FF02h), */
190 0x09, 0x21, /* Usage (21h), */
191 0x95, 0x0F, /* Report Count (15), */
192 0xB1, 0x02, /* Feature (Variable), */
193 0x85, 0x13, /* Report ID (19), */
194 0x09, 0x22, /* Usage (22h), */
195 0x95, 0x16, /* Report Count (22), */
196 0xB1, 0x02, /* Feature (Variable), */
197 0x85, 0x14, /* Report ID (20), */
198 0x06, 0x05, 0xFF, /* Usage Page (FF05h), */
199 0x09, 0x20, /* Usage (20h), */
200 0x95, 0x10, /* Report Count (16), */
201 0xB1, 0x02, /* Feature (Variable), */
202 0x85, 0x15, /* Report ID (21), */
203 0x09, 0x21, /* Usage (21h), */
204 0x95, 0x2C, /* Report Count (44), */
205 0xB1, 0x02, /* Feature (Variable), */
206 0x06, 0x80, 0xFF, /* Usage Page (FF80h), */
207 0x85, 0x80, /* Report ID (128), */
208 0x09, 0x20, /* Usage (20h), */
209 0x95, 0x06, /* Report Count (6), */
210 0xB1, 0x02, /* Feature (Variable), */
211 0x85, 0x81, /* Report ID (129), */
212 0x09, 0x21, /* Usage (21h), */
213 0x95, 0x06, /* Report Count (6), */
214 0xB1, 0x02, /* Feature (Variable), */
215 0x85, 0x82, /* Report ID (130), */
216 0x09, 0x22, /* Usage (22h), */
217 0x95, 0x05, /* Report Count (5), */
218 0xB1, 0x02, /* Feature (Variable), */
219 0x85, 0x83, /* Report ID (131), */
220 0x09, 0x23, /* Usage (23h), */
221 0x95, 0x01, /* Report Count (1), */
222 0xB1, 0x02, /* Feature (Variable), */
223 0x85, 0x84, /* Report ID (132), */
224 0x09, 0x24, /* Usage (24h), */
225 0x95, 0x04, /* Report Count (4), */
226 0xB1, 0x02, /* Feature (Variable), */
227 0x85, 0x85, /* Report ID (133), */
228 0x09, 0x25, /* Usage (25h), */
229 0x95, 0x06, /* Report Count (6), */
230 0xB1, 0x02, /* Feature (Variable), */
231 0x85, 0x86, /* Report ID (134), */
232 0x09, 0x26, /* Usage (26h), */
233 0x95, 0x06, /* Report Count (6), */
234 0xB1, 0x02, /* Feature (Variable), */
235 0x85, 0x87, /* Report ID (135), */
236 0x09, 0x27, /* Usage (27h), */
237 0x95, 0x23, /* Report Count (35), */
238 0xB1, 0x02, /* Feature (Variable), */
239 0x85, 0x88, /* Report ID (136), */
240 0x09, 0x28, /* Usage (28h), */
241 0x95, 0x22, /* Report Count (34), */
242 0xB1, 0x02, /* Feature (Variable), */
243 0x85, 0x89, /* Report ID (137), */
244 0x09, 0x29, /* Usage (29h), */
245 0x95, 0x02, /* Report Count (2), */
246 0xB1, 0x02, /* Feature (Variable), */
247 0x85, 0x90, /* Report ID (144), */
248 0x09, 0x30, /* Usage (30h), */
249 0x95, 0x05, /* Report Count (5), */
250 0xB1, 0x02, /* Feature (Variable), */
251 0x85, 0x91, /* Report ID (145), */
252 0x09, 0x31, /* Usage (31h), */
253 0x95, 0x03, /* Report Count (3), */
254 0xB1, 0x02, /* Feature (Variable), */
255 0x85, 0x92, /* Report ID (146), */
256 0x09, 0x32, /* Usage (32h), */
257 0x95, 0x03, /* Report Count (3), */
258 0xB1, 0x02, /* Feature (Variable), */
259 0x85, 0x93, /* Report ID (147), */
260 0x09, 0x33, /* Usage (33h), */
261 0x95, 0x0C, /* Report Count (12), */
262 0xB1, 0x02, /* Feature (Variable), */
263 0x85, 0xA0, /* Report ID (160), */
264 0x09, 0x40, /* Usage (40h), */
265 0x95, 0x06, /* Report Count (6), */
266 0xB1, 0x02, /* Feature (Variable), */
267 0x85, 0xA1, /* Report ID (161), */
268 0x09, 0x41, /* Usage (41h), */
269 0x95, 0x01, /* Report Count (1), */
270 0xB1, 0x02, /* Feature (Variable), */
271 0x85, 0xA2, /* Report ID (162), */
272 0x09, 0x42, /* Usage (42h), */
273 0x95, 0x01, /* Report Count (1), */
274 0xB1, 0x02, /* Feature (Variable), */
275 0x85, 0xA3, /* Report ID (163), */
276 0x09, 0x43, /* Usage (43h), */
277 0x95, 0x30, /* Report Count (48), */
278 0xB1, 0x02, /* Feature (Variable), */
279 0x85, 0xA4, /* Report ID (164), */
280 0x09, 0x44, /* Usage (44h), */
281 0x95, 0x0D, /* Report Count (13), */
282 0xB1, 0x02, /* Feature (Variable), */
283 0x85, 0xA5, /* Report ID (165), */
284 0x09, 0x45, /* Usage (45h), */
285 0x95, 0x15, /* Report Count (21), */
286 0xB1, 0x02, /* Feature (Variable), */
287 0x85, 0xA6, /* Report ID (166), */
288 0x09, 0x46, /* Usage (46h), */
289 0x95, 0x15, /* Report Count (21), */
290 0xB1, 0x02, /* Feature (Variable), */
291 0x85, 0xF0, /* Report ID (240), */
292 0x09, 0x47, /* Usage (47h), */
293 0x95, 0x3F, /* Report Count (63), */
294 0xB1, 0x02, /* Feature (Variable), */
295 0x85, 0xF1, /* Report ID (241), */
296 0x09, 0x48, /* Usage (48h), */
297 0x95, 0x3F, /* Report Count (63), */
298 0xB1, 0x02, /* Feature (Variable), */
299 0x85, 0xF2, /* Report ID (242), */
300 0x09, 0x49, /* Usage (49h), */
301 0x95, 0x0F, /* Report Count (15), */
302 0xB1, 0x02, /* Feature (Variable), */
303 0x85, 0xA7, /* Report ID (167), */
304 0x09, 0x4A, /* Usage (4Ah), */
305 0x95, 0x01, /* Report Count (1), */
306 0xB1, 0x02, /* Feature (Variable), */
307 0x85, 0xA8, /* Report ID (168), */
308 0x09, 0x4B, /* Usage (4Bh), */
309 0x95, 0x01, /* Report Count (1), */
310 0xB1, 0x02, /* Feature (Variable), */
311 0x85, 0xA9, /* Report ID (169), */
312 0x09, 0x4C, /* Usage (4Ch), */
313 0x95, 0x08, /* Report Count (8), */
314 0xB1, 0x02, /* Feature (Variable), */
315 0x85, 0xAA, /* Report ID (170), */
316 0x09, 0x4E, /* Usage (4Eh), */
317 0x95, 0x01, /* Report Count (1), */
318 0xB1, 0x02, /* Feature (Variable), */
319 0x85, 0xAB, /* Report ID (171), */
320 0x09, 0x4F, /* Usage (4Fh), */
321 0x95, 0x39, /* Report Count (57), */
322 0xB1, 0x02, /* Feature (Variable), */
323 0x85, 0xAC, /* Report ID (172), */
324 0x09, 0x50, /* Usage (50h), */
325 0x95, 0x39, /* Report Count (57), */
326 0xB1, 0x02, /* Feature (Variable), */
327 0x85, 0xAD, /* Report ID (173), */
328 0x09, 0x51, /* Usage (51h), */
329 0x95, 0x0B, /* Report Count (11), */
330 0xB1, 0x02, /* Feature (Variable), */
331 0x85, 0xAE, /* Report ID (174), */
332 0x09, 0x52, /* Usage (52h), */
333 0x95, 0x01, /* Report Count (1), */
334 0xB1, 0x02, /* Feature (Variable), */
335 0x85, 0xAF, /* Report ID (175), */
336 0x09, 0x53, /* Usage (53h), */
337 0x95, 0x02, /* Report Count (2), */
338 0xB1, 0x02, /* Feature (Variable), */
339 0x85, 0xB0, /* Report ID (176), */
340 0x09, 0x54, /* Usage (54h), */
341 0x95, 0x3F, /* Report Count (63), */
342 0xB1, 0x02, /* Feature (Variable), */
343 0xC0 /* End Collection */
Frank Prazniked19d8c2014-01-16 21:43:12 -0500344};
345
Frank Praznikad142b92014-02-20 11:36:00 -0500346/*
347 * The default behavior of the Dualshock 4 is to send reports using report
Frank Praznikd8296742014-02-05 20:03:45 -0500348 * type 1 when running over Bluetooth. However, as soon as it receives a
349 * report of type 17 to set the LEDs or rumble it starts returning it's state
350 * in report 17 instead of 1. Since report 17 is undefined in the default HID
351 * descriptor the button and axis definitions must be moved to report 17 or
352 * the HID layer won't process the received input once a report is sent.
353 */
354static u8 dualshock4_bt_rdesc[] = {
355 0x05, 0x01, /* Usage Page (Desktop), */
356 0x09, 0x05, /* Usage (Gamepad), */
357 0xA1, 0x01, /* Collection (Application), */
358 0x85, 0x01, /* Report ID (1), */
359 0x75, 0x08, /* Report Size (8), */
360 0x95, 0x0A, /* Report Count (9), */
361 0x81, 0x02, /* Input (Variable), */
362 0x06, 0x04, 0xFF, /* Usage Page (FF04h), */
363 0x85, 0x02, /* Report ID (2), */
364 0x09, 0x24, /* Usage (24h), */
365 0x95, 0x24, /* Report Count (36), */
366 0xB1, 0x02, /* Feature (Variable), */
367 0x85, 0xA3, /* Report ID (163), */
368 0x09, 0x25, /* Usage (25h), */
369 0x95, 0x30, /* Report Count (48), */
370 0xB1, 0x02, /* Feature (Variable), */
371 0x85, 0x05, /* Report ID (5), */
372 0x09, 0x26, /* Usage (26h), */
373 0x95, 0x28, /* Report Count (40), */
374 0xB1, 0x02, /* Feature (Variable), */
375 0x85, 0x06, /* Report ID (6), */
376 0x09, 0x27, /* Usage (27h), */
377 0x95, 0x34, /* Report Count (52), */
378 0xB1, 0x02, /* Feature (Variable), */
379 0x85, 0x07, /* Report ID (7), */
380 0x09, 0x28, /* Usage (28h), */
381 0x95, 0x30, /* Report Count (48), */
382 0xB1, 0x02, /* Feature (Variable), */
383 0x85, 0x08, /* Report ID (8), */
384 0x09, 0x29, /* Usage (29h), */
385 0x95, 0x2F, /* Report Count (47), */
386 0xB1, 0x02, /* Feature (Variable), */
387 0x06, 0x03, 0xFF, /* Usage Page (FF03h), */
388 0x85, 0x03, /* Report ID (3), */
389 0x09, 0x21, /* Usage (21h), */
390 0x95, 0x26, /* Report Count (38), */
391 0xB1, 0x02, /* Feature (Variable), */
392 0x85, 0x04, /* Report ID (4), */
393 0x09, 0x22, /* Usage (22h), */
394 0x95, 0x2E, /* Report Count (46), */
395 0xB1, 0x02, /* Feature (Variable), */
396 0x85, 0xF0, /* Report ID (240), */
397 0x09, 0x47, /* Usage (47h), */
398 0x95, 0x3F, /* Report Count (63), */
399 0xB1, 0x02, /* Feature (Variable), */
400 0x85, 0xF1, /* Report ID (241), */
401 0x09, 0x48, /* Usage (48h), */
402 0x95, 0x3F, /* Report Count (63), */
403 0xB1, 0x02, /* Feature (Variable), */
404 0x85, 0xF2, /* Report ID (242), */
405 0x09, 0x49, /* Usage (49h), */
406 0x95, 0x0F, /* Report Count (15), */
407 0xB1, 0x02, /* Feature (Variable), */
408 0x85, 0x11, /* Report ID (17), */
409 0x06, 0x00, 0xFF, /* Usage Page (FF00h), */
410 0x09, 0x20, /* Usage (20h), */
411 0x95, 0x02, /* Report Count (2), */
412 0x81, 0x02, /* Input (Variable), */
413 0x05, 0x01, /* Usage Page (Desktop), */
414 0x09, 0x30, /* Usage (X), */
415 0x09, 0x31, /* Usage (Y), */
416 0x09, 0x32, /* Usage (Z), */
417 0x09, 0x35, /* Usage (Rz), */
418 0x15, 0x00, /* Logical Minimum (0), */
419 0x26, 0xFF, 0x00, /* Logical Maximum (255), */
420 0x75, 0x08, /* Report Size (8), */
421 0x95, 0x04, /* Report Count (4), */
422 0x81, 0x02, /* Input (Variable), */
423 0x09, 0x39, /* Usage (Hat Switch), */
424 0x15, 0x00, /* Logical Minimum (0), */
425 0x25, 0x07, /* Logical Maximum (7), */
426 0x75, 0x04, /* Report Size (4), */
427 0x95, 0x01, /* Report Count (1), */
428 0x81, 0x42, /* Input (Variable, Null State), */
429 0x05, 0x09, /* Usage Page (Button), */
430 0x19, 0x01, /* Usage Minimum (01h), */
431 0x29, 0x0E, /* Usage Maximum (0Eh), */
432 0x15, 0x00, /* Logical Minimum (0), */
433 0x25, 0x01, /* Logical Maximum (1), */
434 0x75, 0x01, /* Report Size (1), */
435 0x95, 0x0E, /* Report Count (14), */
436 0x81, 0x02, /* Input (Variable), */
437 0x75, 0x06, /* Report Size (6), */
438 0x95, 0x01, /* Report Count (1), */
439 0x81, 0x01, /* Input (Constant), */
440 0x05, 0x01, /* Usage Page (Desktop), */
441 0x09, 0x33, /* Usage (Rx), */
442 0x09, 0x34, /* Usage (Ry), */
443 0x15, 0x00, /* Logical Minimum (0), */
444 0x26, 0xFF, 0x00, /* Logical Maximum (255), */
445 0x75, 0x08, /* Report Size (8), */
446 0x95, 0x02, /* Report Count (2), */
447 0x81, 0x02, /* Input (Variable), */
448 0x06, 0x00, 0xFF, /* Usage Page (FF00h), */
449 0x09, 0x20, /* Usage (20h), */
450 0x95, 0x03, /* Report Count (3), */
451 0x81, 0x02, /* Input (Variable), */
452 0x05, 0x01, /* Usage Page (Desktop), */
453 0x19, 0x40, /* Usage Minimum (40h), */
454 0x29, 0x42, /* Usage Maximum (42h), */
455 0x16, 0x00, 0x80, /* Logical Minimum (-32768), */
456 0x26, 0x00, 0x7F, /* Logical Maximum (32767), */
457 0x75, 0x10, /* Report Size (16), */
458 0x95, 0x03, /* Report Count (3), */
459 0x81, 0x02, /* Input (Variable), */
460 0x19, 0x43, /* Usage Minimum (43h), */
461 0x29, 0x45, /* Usage Maximum (45h), */
462 0x16, 0xFF, 0xBF, /* Logical Minimum (-16385), */
463 0x26, 0x00, 0x40, /* Logical Maximum (16384), */
464 0x95, 0x03, /* Report Count (3), */
465 0x81, 0x02, /* Input (Variable), */
466 0x06, 0x00, 0xFF, /* Usage Page (FF00h), */
467 0x09, 0x20, /* Usage (20h), */
468 0x15, 0x00, /* Logical Minimum (0), */
469 0x26, 0xFF, 0x00, /* Logical Maximum (255), */
470 0x75, 0x08, /* Report Size (8), */
471 0x95, 0x31, /* Report Count (51), */
472 0x81, 0x02, /* Input (Variable), */
473 0x09, 0x21, /* Usage (21h), */
474 0x75, 0x08, /* Report Size (8), */
475 0x95, 0x4D, /* Report Count (77), */
476 0x91, 0x02, /* Output (Variable), */
477 0x85, 0x12, /* Report ID (18), */
478 0x09, 0x22, /* Usage (22h), */
479 0x95, 0x8D, /* Report Count (141), */
480 0x81, 0x02, /* Input (Variable), */
481 0x09, 0x23, /* Usage (23h), */
482 0x91, 0x02, /* Output (Variable), */
483 0x85, 0x13, /* Report ID (19), */
484 0x09, 0x24, /* Usage (24h), */
485 0x95, 0xCD, /* Report Count (205), */
486 0x81, 0x02, /* Input (Variable), */
487 0x09, 0x25, /* Usage (25h), */
488 0x91, 0x02, /* Output (Variable), */
489 0x85, 0x14, /* Report ID (20), */
490 0x09, 0x26, /* Usage (26h), */
491 0x96, 0x0D, 0x01, /* Report Count (269), */
492 0x81, 0x02, /* Input (Variable), */
493 0x09, 0x27, /* Usage (27h), */
494 0x91, 0x02, /* Output (Variable), */
495 0x85, 0x15, /* Report ID (21), */
496 0x09, 0x28, /* Usage (28h), */
497 0x96, 0x4D, 0x01, /* Report Count (333), */
498 0x81, 0x02, /* Input (Variable), */
499 0x09, 0x29, /* Usage (29h), */
500 0x91, 0x02, /* Output (Variable), */
501 0x85, 0x16, /* Report ID (22), */
502 0x09, 0x2A, /* Usage (2Ah), */
503 0x96, 0x8D, 0x01, /* Report Count (397), */
504 0x81, 0x02, /* Input (Variable), */
505 0x09, 0x2B, /* Usage (2Bh), */
506 0x91, 0x02, /* Output (Variable), */
507 0x85, 0x17, /* Report ID (23), */
508 0x09, 0x2C, /* Usage (2Ch), */
509 0x96, 0xCD, 0x01, /* Report Count (461), */
510 0x81, 0x02, /* Input (Variable), */
511 0x09, 0x2D, /* Usage (2Dh), */
512 0x91, 0x02, /* Output (Variable), */
513 0x85, 0x18, /* Report ID (24), */
514 0x09, 0x2E, /* Usage (2Eh), */
515 0x96, 0x0D, 0x02, /* Report Count (525), */
516 0x81, 0x02, /* Input (Variable), */
517 0x09, 0x2F, /* Usage (2Fh), */
518 0x91, 0x02, /* Output (Variable), */
519 0x85, 0x19, /* Report ID (25), */
520 0x09, 0x30, /* Usage (30h), */
521 0x96, 0x22, 0x02, /* Report Count (546), */
522 0x81, 0x02, /* Input (Variable), */
523 0x09, 0x31, /* Usage (31h), */
524 0x91, 0x02, /* Output (Variable), */
525 0x06, 0x80, 0xFF, /* Usage Page (FF80h), */
526 0x85, 0x82, /* Report ID (130), */
527 0x09, 0x22, /* Usage (22h), */
528 0x95, 0x3F, /* Report Count (63), */
529 0xB1, 0x02, /* Feature (Variable), */
530 0x85, 0x83, /* Report ID (131), */
531 0x09, 0x23, /* Usage (23h), */
532 0xB1, 0x02, /* Feature (Variable), */
533 0x85, 0x84, /* Report ID (132), */
534 0x09, 0x24, /* Usage (24h), */
535 0xB1, 0x02, /* Feature (Variable), */
536 0x85, 0x90, /* Report ID (144), */
537 0x09, 0x30, /* Usage (30h), */
538 0xB1, 0x02, /* Feature (Variable), */
539 0x85, 0x91, /* Report ID (145), */
540 0x09, 0x31, /* Usage (31h), */
541 0xB1, 0x02, /* Feature (Variable), */
542 0x85, 0x92, /* Report ID (146), */
543 0x09, 0x32, /* Usage (32h), */
544 0xB1, 0x02, /* Feature (Variable), */
545 0x85, 0x93, /* Report ID (147), */
546 0x09, 0x33, /* Usage (33h), */
547 0xB1, 0x02, /* Feature (Variable), */
548 0x85, 0xA0, /* Report ID (160), */
549 0x09, 0x40, /* Usage (40h), */
550 0xB1, 0x02, /* Feature (Variable), */
551 0x85, 0xA4, /* Report ID (164), */
552 0x09, 0x44, /* Usage (44h), */
553 0xB1, 0x02, /* Feature (Variable), */
554 0xC0 /* End Collection */
555};
556
Jiri Kosina078328d2013-06-13 12:03:49 +0200557static __u8 ps3remote_rdesc[] = {
558 0x05, 0x01, /* GUsagePage Generic Desktop */
559 0x09, 0x05, /* LUsage 0x05 [Game Pad] */
560 0xA1, 0x01, /* MCollection Application (mouse, keyboard) */
561
562 /* Use collection 1 for joypad buttons */
563 0xA1, 0x02, /* MCollection Logical (interrelated data) */
564
565 /* Ignore the 1st byte, maybe it is used for a controller
566 * number but it's not needed for correct operation */
567 0x75, 0x08, /* GReportSize 0x08 [8] */
568 0x95, 0x01, /* GReportCount 0x01 [1] */
569 0x81, 0x01, /* MInput 0x01 (Const[0] Arr[1] Abs[2]) */
570
571 /* Bytes from 2nd to 4th are a bitmap for joypad buttons, for these
572 * buttons multiple keypresses are allowed */
573 0x05, 0x09, /* GUsagePage Button */
574 0x19, 0x01, /* LUsageMinimum 0x01 [Button 1 (primary/trigger)] */
575 0x29, 0x18, /* LUsageMaximum 0x18 [Button 24] */
576 0x14, /* GLogicalMinimum [0] */
577 0x25, 0x01, /* GLogicalMaximum 0x01 [1] */
578 0x75, 0x01, /* GReportSize 0x01 [1] */
579 0x95, 0x18, /* GReportCount 0x18 [24] */
580 0x81, 0x02, /* MInput 0x02 (Data[0] Var[1] Abs[2]) */
581
582 0xC0, /* MEndCollection */
583
584 /* Use collection 2 for remote control buttons */
585 0xA1, 0x02, /* MCollection Logical (interrelated data) */
586
587 /* 5th byte is used for remote control buttons */
588 0x05, 0x09, /* GUsagePage Button */
589 0x18, /* LUsageMinimum [No button pressed] */
590 0x29, 0xFE, /* LUsageMaximum 0xFE [Button 254] */
591 0x14, /* GLogicalMinimum [0] */
592 0x26, 0xFE, 0x00, /* GLogicalMaximum 0x00FE [254] */
593 0x75, 0x08, /* GReportSize 0x08 [8] */
594 0x95, 0x01, /* GReportCount 0x01 [1] */
595 0x80, /* MInput */
596
597 /* Ignore bytes from 6th to 11th, 6th to 10th are always constant at
598 * 0xff and 11th is for press indication */
599 0x75, 0x08, /* GReportSize 0x08 [8] */
600 0x95, 0x06, /* GReportCount 0x06 [6] */
601 0x81, 0x01, /* MInput 0x01 (Const[0] Arr[1] Abs[2]) */
602
603 /* 12th byte is for battery strength */
604 0x05, 0x06, /* GUsagePage Generic Device Controls */
605 0x09, 0x20, /* LUsage 0x20 [Battery Strength] */
606 0x14, /* GLogicalMinimum [0] */
607 0x25, 0x05, /* GLogicalMaximum 0x05 [5] */
608 0x75, 0x08, /* GReportSize 0x08 [8] */
609 0x95, 0x01, /* GReportCount 0x01 [1] */
610 0x81, 0x02, /* MInput 0x02 (Data[0] Var[1] Abs[2]) */
611
612 0xC0, /* MEndCollection */
613
614 0xC0 /* MEndCollection [Game Pad] */
615};
616
617static const unsigned int ps3remote_keymap_joypad_buttons[] = {
618 [0x01] = KEY_SELECT,
619 [0x02] = BTN_THUMBL, /* L3 */
620 [0x03] = BTN_THUMBR, /* R3 */
621 [0x04] = BTN_START,
622 [0x05] = KEY_UP,
623 [0x06] = KEY_RIGHT,
624 [0x07] = KEY_DOWN,
625 [0x08] = KEY_LEFT,
626 [0x09] = BTN_TL2, /* L2 */
627 [0x0a] = BTN_TR2, /* R2 */
628 [0x0b] = BTN_TL, /* L1 */
629 [0x0c] = BTN_TR, /* R1 */
630 [0x0d] = KEY_OPTION, /* options/triangle */
631 [0x0e] = KEY_BACK, /* back/circle */
632 [0x0f] = BTN_0, /* cross */
633 [0x10] = KEY_SCREEN, /* view/square */
634 [0x11] = KEY_HOMEPAGE, /* PS button */
635 [0x14] = KEY_ENTER,
636};
637static const unsigned int ps3remote_keymap_remote_buttons[] = {
638 [0x00] = KEY_1,
639 [0x01] = KEY_2,
640 [0x02] = KEY_3,
641 [0x03] = KEY_4,
642 [0x04] = KEY_5,
643 [0x05] = KEY_6,
644 [0x06] = KEY_7,
645 [0x07] = KEY_8,
646 [0x08] = KEY_9,
647 [0x09] = KEY_0,
648 [0x0e] = KEY_ESC, /* return */
649 [0x0f] = KEY_CLEAR,
650 [0x16] = KEY_EJECTCD,
651 [0x1a] = KEY_MENU, /* top menu */
652 [0x28] = KEY_TIME,
653 [0x30] = KEY_PREVIOUS,
654 [0x31] = KEY_NEXT,
655 [0x32] = KEY_PLAY,
656 [0x33] = KEY_REWIND, /* scan back */
657 [0x34] = KEY_FORWARD, /* scan forward */
658 [0x38] = KEY_STOP,
659 [0x39] = KEY_PAUSE,
660 [0x40] = KEY_CONTEXT_MENU, /* pop up/menu */
661 [0x60] = KEY_FRAMEBACK, /* slow/step back */
662 [0x61] = KEY_FRAMEFORWARD, /* slow/step forward */
663 [0x63] = KEY_SUBTITLE,
664 [0x64] = KEY_AUDIO,
665 [0x65] = KEY_ANGLE,
666 [0x70] = KEY_INFO, /* display */
667 [0x80] = KEY_BLUE,
668 [0x81] = KEY_RED,
669 [0x82] = KEY_GREEN,
670 [0x83] = KEY_YELLOW,
671};
672
Colin Leitnerf04d5142013-05-27 23:41:05 +0200673static const unsigned int buzz_keymap[] = {
Frank Praznikad142b92014-02-20 11:36:00 -0500674 /*
675 * The controller has 4 remote buzzers, each with one LED and 5
Colin Leitnerf04d5142013-05-27 23:41:05 +0200676 * buttons.
677 *
678 * We use the mapping chosen by the controller, which is:
679 *
680 * Key Offset
681 * -------------------
682 * Buzz 1
683 * Blue 5
684 * Orange 4
685 * Green 3
686 * Yellow 2
687 *
688 * So, for example, the orange button on the third buzzer is mapped to
689 * BTN_TRIGGER_HAPPY14
690 */
691 [ 1] = BTN_TRIGGER_HAPPY1,
692 [ 2] = BTN_TRIGGER_HAPPY2,
693 [ 3] = BTN_TRIGGER_HAPPY3,
694 [ 4] = BTN_TRIGGER_HAPPY4,
695 [ 5] = BTN_TRIGGER_HAPPY5,
696 [ 6] = BTN_TRIGGER_HAPPY6,
697 [ 7] = BTN_TRIGGER_HAPPY7,
698 [ 8] = BTN_TRIGGER_HAPPY8,
699 [ 9] = BTN_TRIGGER_HAPPY9,
700 [10] = BTN_TRIGGER_HAPPY10,
701 [11] = BTN_TRIGGER_HAPPY11,
702 [12] = BTN_TRIGGER_HAPPY12,
703 [13] = BTN_TRIGGER_HAPPY13,
704 [14] = BTN_TRIGGER_HAPPY14,
705 [15] = BTN_TRIGGER_HAPPY15,
706 [16] = BTN_TRIGGER_HAPPY16,
707 [17] = BTN_TRIGGER_HAPPY17,
708 [18] = BTN_TRIGGER_HAPPY18,
709 [19] = BTN_TRIGGER_HAPPY19,
710 [20] = BTN_TRIGGER_HAPPY20,
711};
712
Frank Praznikd902f472014-01-27 10:17:36 -0500713static enum power_supply_property sony_battery_props[] = {
714 POWER_SUPPLY_PROP_PRESENT,
715 POWER_SUPPLY_PROP_CAPACITY,
716 POWER_SUPPLY_PROP_SCOPE,
717 POWER_SUPPLY_PROP_STATUS,
718};
719
Frank Praznik55d3b662014-04-14 10:11:32 -0400720struct sixaxis_led {
721 __u8 time_enabled; /* the total time the led is active (0xff means forever) */
722 __u8 duty_length; /* how long a cycle is in deciseconds (0 means "really fast") */
723 __u8 enabled;
724 __u8 duty_off; /* % of duty_length the led is off (0xff means 100%) */
725 __u8 duty_on; /* % of duty_length the led is on (0xff mean 100%) */
726} __packed;
727
728struct sixaxis_rumble {
729 __u8 padding;
730 __u8 right_duration; /* Right motor duration (0xff means forever) */
731 __u8 right_motor_on; /* Right (small) motor on/off, only supports values of 0 or 1 (off/on) */
732 __u8 left_duration; /* Left motor duration (0xff means forever) */
733 __u8 left_motor_force; /* left (large) motor, supports force values from 0 to 255 */
734} __packed;
735
736struct sixaxis_output_report {
737 __u8 report_id;
738 struct sixaxis_rumble rumble;
739 __u8 padding[4];
740 __u8 leds_bitmap; /* bitmap of enabled LEDs: LED_1 = 0x02, LED_2 = 0x04, ... */
741 struct sixaxis_led led[4]; /* LEDx at (4 - x) */
742 struct sixaxis_led _reserved; /* LED5, not actually soldered */
743} __packed;
744
745union sixaxis_output_report_01 {
746 struct sixaxis_output_report data;
747 __u8 buf[36];
748};
749
Frank Praznikd2d782f2014-02-20 11:36:03 -0500750static spinlock_t sony_dev_list_lock;
751static LIST_HEAD(sony_device_list);
752
Jiri Kosinacc6e0bb2008-10-23 12:58:38 +0200753struct sony_sc {
Frank Praznikd902f472014-01-27 10:17:36 -0500754 spinlock_t lock;
Frank Praznikd2d782f2014-02-20 11:36:03 -0500755 struct list_head list_node;
Sven Eckelmann0a286ef2013-11-19 20:26:32 +0100756 struct hid_device *hdev;
Frank Praznik60781cf2014-01-11 15:13:15 -0500757 struct led_classdev *leds[MAX_LEDS];
Jiri Kosinacc6e0bb2008-10-23 12:58:38 +0200758 unsigned long quirks;
Sven Eckelmann0a286ef2013-11-19 20:26:32 +0100759 struct work_struct state_worker;
Frank Praznikd902f472014-01-27 10:17:36 -0500760 struct power_supply battery;
Colin Leitnerf04d5142013-05-27 23:41:05 +0200761
Sven Eckelmann9f323b62013-11-17 20:38:21 +0100762#ifdef CONFIG_SONY_FF
Sven Eckelmann9f323b62013-11-17 20:38:21 +0100763 __u8 left;
764 __u8 right;
765#endif
766
Frank Praznikd2d782f2014-02-20 11:36:03 -0500767 __u8 mac_address[6];
Frank Praznik5f5750d2014-02-19 13:09:22 -0500768 __u8 worker_initialized;
Frank Praznikd902f472014-01-27 10:17:36 -0500769 __u8 cable_state;
770 __u8 battery_charging;
771 __u8 battery_capacity;
Frank Praznik60781cf2014-01-11 15:13:15 -0500772 __u8 led_state[MAX_LEDS];
773 __u8 led_count;
Jiri Kosinacc6e0bb2008-10-23 12:58:38 +0200774};
775
Jiri Kosina078328d2013-06-13 12:03:49 +0200776static __u8 *ps3remote_fixup(struct hid_device *hdev, __u8 *rdesc,
777 unsigned int *rsize)
778{
779 *rsize = sizeof(ps3remote_rdesc);
780 return ps3remote_rdesc;
781}
782
783static int ps3remote_mapping(struct hid_device *hdev, struct hid_input *hi,
784 struct hid_field *field, struct hid_usage *usage,
785 unsigned long **bit, int *max)
786{
787 unsigned int key = usage->hid & HID_USAGE;
788
789 if ((usage->hid & HID_USAGE_PAGE) != HID_UP_BUTTON)
790 return -1;
791
792 switch (usage->collection_index) {
793 case 1:
794 if (key >= ARRAY_SIZE(ps3remote_keymap_joypad_buttons))
795 return -1;
796
797 key = ps3remote_keymap_joypad_buttons[key];
798 if (!key)
799 return -1;
800 break;
801 case 2:
802 if (key >= ARRAY_SIZE(ps3remote_keymap_remote_buttons))
803 return -1;
804
805 key = ps3remote_keymap_remote_buttons[key];
806 if (!key)
807 return -1;
808 break;
809 default:
810 return -1;
811 }
812
813 hid_map_usage_clear(hi, usage, bit, max, EV_KEY, key);
814 return 1;
815}
816
817
Jiri Kosinacc6e0bb2008-10-23 12:58:38 +0200818/* Sony Vaio VGX has wrongly mouse pointer declared as constant */
Nikolai Kondrashov73e40082010-08-06 23:03:06 +0400819static __u8 *sony_report_fixup(struct hid_device *hdev, __u8 *rdesc,
820 unsigned int *rsize)
Jiri Kosinacc6e0bb2008-10-23 12:58:38 +0200821{
822 struct sony_sc *sc = hid_get_drvdata(hdev);
823
Fernando Luis Vázquez Cao99d24902013-01-22 15:20:38 +0900824 /*
825 * Some Sony RF receivers wrongly declare the mouse pointer as a
826 * a constant non-data variable.
827 */
828 if ((sc->quirks & VAIO_RDESC_CONSTANT) && *rsize >= 56 &&
829 /* usage page: generic desktop controls */
830 /* rdesc[0] == 0x05 && rdesc[1] == 0x01 && */
831 /* usage: mouse */
832 rdesc[2] == 0x09 && rdesc[3] == 0x02 &&
833 /* input (usage page for x,y axes): constant, variable, relative */
834 rdesc[54] == 0x81 && rdesc[55] == 0x07) {
Fernando Luis Vázquez Caoa4649182013-01-15 19:40:48 +0900835 hid_info(hdev, "Fixing up Sony RF Receiver report descriptor\n");
Fernando Luis Vázquez Cao99d24902013-01-22 15:20:38 +0900836 /* input: data, variable, relative */
Jiri Kosinacc6e0bb2008-10-23 12:58:38 +0200837 rdesc[55] = 0x06;
838 }
Simon Wood61ab44b2011-06-10 12:00:26 +0200839
Frank Prazniked19d8c2014-01-16 21:43:12 -0500840 /*
841 * The default Dualshock 4 USB descriptor doesn't assign
842 * the gyroscope values to corresponding axes so we need a
843 * modified one.
844 */
845 if ((sc->quirks & DUALSHOCK4_CONTROLLER_USB) && *rsize == 467) {
846 hid_info(hdev, "Using modified Dualshock 4 report descriptor with gyroscope axes\n");
847 rdesc = dualshock4_usb_rdesc;
848 *rsize = sizeof(dualshock4_usb_rdesc);
Frank Praznikd8296742014-02-05 20:03:45 -0500849 } else if ((sc->quirks & DUALSHOCK4_CONTROLLER_BT) && *rsize == 357) {
850 hid_info(hdev, "Using modified Dualshock 4 Bluetooth report descriptor\n");
851 rdesc = dualshock4_bt_rdesc;
852 *rsize = sizeof(dualshock4_bt_rdesc);
Frank Prazniked19d8c2014-01-16 21:43:12 -0500853 }
854
Simon Wood61ab44b2011-06-10 12:00:26 +0200855 /* The HID descriptor exposed over BT has a trailing zero byte */
856 if ((((sc->quirks & SIXAXIS_CONTROLLER_USB) && *rsize == 148) ||
857 ((sc->quirks & SIXAXIS_CONTROLLER_BT) && *rsize == 149)) &&
858 rdesc[83] == 0x75) {
859 hid_info(hdev, "Fixing up Sony Sixaxis report descriptor\n");
860 memcpy((void *)&rdesc[83], (void *)&sixaxis_rdesc_fixup,
861 sizeof(sixaxis_rdesc_fixup));
Mauro Carvalho Chehabe57a67d2012-12-14 20:57:34 -0200862 } else if (sc->quirks & SIXAXIS_CONTROLLER_USB &&
863 *rsize > sizeof(sixaxis_rdesc_fixup2)) {
864 hid_info(hdev, "Sony Sixaxis clone detected. Using original report descriptor (size: %d clone; %d new)\n",
865 *rsize, (int)sizeof(sixaxis_rdesc_fixup2));
866 *rsize = sizeof(sixaxis_rdesc_fixup2);
867 memcpy(rdesc, &sixaxis_rdesc_fixup2, *rsize);
Simon Wood61ab44b2011-06-10 12:00:26 +0200868 }
Jiri Kosina078328d2013-06-13 12:03:49 +0200869
870 if (sc->quirks & PS3REMOTE)
871 return ps3remote_fixup(hdev, rdesc, rsize);
872
Nikolai Kondrashov73e40082010-08-06 23:03:06 +0400873 return rdesc;
Jiri Kosinacc6e0bb2008-10-23 12:58:38 +0200874}
875
Frank Praznikd902f472014-01-27 10:17:36 -0500876static void sixaxis_parse_report(struct sony_sc *sc, __u8 *rd, int size)
877{
878 static const __u8 sixaxis_battery_capacity[] = { 0, 1, 25, 50, 75, 100 };
879 unsigned long flags;
880 __u8 cable_state, battery_capacity, battery_charging;
881
Frank Praznikad142b92014-02-20 11:36:00 -0500882 /*
883 * The sixaxis is charging if the battery value is 0xee
Frank Praznikd902f472014-01-27 10:17:36 -0500884 * and it is fully charged if the value is 0xef.
885 * It does not report the actual level while charging so it
886 * is set to 100% while charging is in progress.
887 */
888 if (rd[30] >= 0xee) {
889 battery_capacity = 100;
Frank Praznika43e94a2014-02-15 13:35:42 -0500890 battery_charging = !(rd[30] & 0x01);
Frank Praznikd902f472014-01-27 10:17:36 -0500891 } else {
Frank Praznikac3c9a92014-02-20 11:36:02 -0500892 __u8 index = rd[30] <= 5 ? rd[30] : 5;
893 battery_capacity = sixaxis_battery_capacity[index];
Frank Praznikd902f472014-01-27 10:17:36 -0500894 battery_charging = 0;
895 }
Frank Praznik914c5782014-03-15 09:41:15 -0400896 cable_state = !(rd[31] & 0x04);
Frank Praznikd902f472014-01-27 10:17:36 -0500897
898 spin_lock_irqsave(&sc->lock, flags);
899 sc->cable_state = cable_state;
900 sc->battery_capacity = battery_capacity;
901 sc->battery_charging = battery_charging;
902 spin_unlock_irqrestore(&sc->lock, flags);
903}
904
905static void dualshock4_parse_report(struct sony_sc *sc, __u8 *rd, int size)
906{
Frank Praznike5606232014-01-27 10:17:37 -0500907 struct hid_input *hidinput = list_entry(sc->hdev->inputs.next,
908 struct hid_input, list);
909 struct input_dev *input_dev = hidinput->input;
Frank Praznikd902f472014-01-27 10:17:36 -0500910 unsigned long flags;
Frank Praznik6c5f8602014-02-05 20:03:47 -0500911 int n, offset;
Frank Praznikd902f472014-01-27 10:17:36 -0500912 __u8 cable_state, battery_capacity, battery_charging;
913
Frank Praznikad142b92014-02-20 11:36:00 -0500914 /*
915 * Battery and touchpad data starts at byte 30 in the USB report and
Frank Praznik6c5f8602014-02-05 20:03:47 -0500916 * 32 in Bluetooth report.
917 */
918 offset = (sc->quirks & DUALSHOCK4_CONTROLLER_USB) ? 30 : 32;
919
Frank Praznikad142b92014-02-20 11:36:00 -0500920 /*
921 * The lower 4 bits of byte 30 contain the battery level
Frank Praznikd902f472014-01-27 10:17:36 -0500922 * and the 5th bit contains the USB cable state.
923 */
Frank Praznik6c5f8602014-02-05 20:03:47 -0500924 cable_state = (rd[offset] >> 4) & 0x01;
925 battery_capacity = rd[offset] & 0x0F;
Frank Praznikd902f472014-01-27 10:17:36 -0500926
Frank Praznikad142b92014-02-20 11:36:00 -0500927 /*
928 * When a USB power source is connected the battery level ranges from
Frank Praznik6c5f8602014-02-05 20:03:47 -0500929 * 0 to 10, and when running on battery power it ranges from 0 to 9.
930 * A battery level above 10 when plugged in means charge completed.
Frank Praznikd902f472014-01-27 10:17:36 -0500931 */
Frank Praznik6c5f8602014-02-05 20:03:47 -0500932 if (!cable_state || battery_capacity > 10)
Frank Praznikd902f472014-01-27 10:17:36 -0500933 battery_charging = 0;
934 else
935 battery_charging = 1;
936
Frank Praznik6c5f8602014-02-05 20:03:47 -0500937 if (!cable_state)
938 battery_capacity++;
Frank Praznikd902f472014-01-27 10:17:36 -0500939 if (battery_capacity > 10)
Frank Praznik6c5f8602014-02-05 20:03:47 -0500940 battery_capacity = 10;
941
Frank Praznikd902f472014-01-27 10:17:36 -0500942 battery_capacity *= 10;
943
944 spin_lock_irqsave(&sc->lock, flags);
945 sc->cable_state = cable_state;
946 sc->battery_capacity = battery_capacity;
947 sc->battery_charging = battery_charging;
948 spin_unlock_irqrestore(&sc->lock, flags);
Frank Praznike5606232014-01-27 10:17:37 -0500949
Frank Praznik6c5f8602014-02-05 20:03:47 -0500950 offset += 5;
951
Frank Praznikad142b92014-02-20 11:36:00 -0500952 /*
953 * The Dualshock 4 multi-touch trackpad data starts at offset 35 on USB
Frank Praznik6c5f8602014-02-05 20:03:47 -0500954 * and 37 on Bluetooth.
Frank Praznike5606232014-01-27 10:17:37 -0500955 * The first 7 bits of the first byte is a counter and bit 8 is a touch
956 * indicator that is 0 when pressed and 1 when not pressed.
957 * The next 3 bytes are two 12 bit touch coordinates, X and Y.
958 * The data for the second touch is in the same format and immediatly
959 * follows the data for the first.
960 */
961 for (n = 0; n < 2; n++) {
962 __u16 x, y;
963
964 x = rd[offset+1] | ((rd[offset+2] & 0xF) << 8);
965 y = ((rd[offset+2] & 0xF0) >> 4) | (rd[offset+3] << 4);
966
967 input_mt_slot(input_dev, n);
968 input_mt_report_slot_state(input_dev, MT_TOOL_FINGER,
969 !(rd[offset] >> 7));
970 input_report_abs(input_dev, ABS_MT_POSITION_X, x);
971 input_report_abs(input_dev, ABS_MT_POSITION_Y, y);
972
973 offset += 4;
974 }
Frank Praznikd902f472014-01-27 10:17:36 -0500975}
976
Simon Woodc9e4d872011-06-10 12:00:27 +0200977static int sony_raw_event(struct hid_device *hdev, struct hid_report *report,
978 __u8 *rd, int size)
979{
980 struct sony_sc *sc = hid_get_drvdata(hdev);
981
Frank Praznikad142b92014-02-20 11:36:00 -0500982 /*
983 * Sixaxis HID report has acclerometers/gyro with MSByte first, this
Simon Woodc9e4d872011-06-10 12:00:27 +0200984 * has to be BYTE_SWAPPED before passing up to joystick interface
985 */
Frank Praznikfee4e2d2014-02-18 17:22:01 -0500986 if ((sc->quirks & SIXAXIS_CONTROLLER) && rd[0] == 0x01 && size == 49) {
Simon Woodc9e4d872011-06-10 12:00:27 +0200987 swap(rd[41], rd[42]);
988 swap(rd[43], rd[44]);
989 swap(rd[45], rd[46]);
990 swap(rd[47], rd[48]);
Frank Praznikd902f472014-01-27 10:17:36 -0500991
992 sixaxis_parse_report(sc, rd, size);
Frank Praznik68330d82014-02-05 20:03:49 -0500993 } else if (((sc->quirks & DUALSHOCK4_CONTROLLER_USB) && rd[0] == 0x01 &&
994 size == 64) || ((sc->quirks & DUALSHOCK4_CONTROLLER_BT)
995 && rd[0] == 0x11 && size == 78)) {
Frank Praznikd902f472014-01-27 10:17:36 -0500996 dualshock4_parse_report(sc, rd, size);
Simon Woodc9e4d872011-06-10 12:00:27 +0200997 }
998
999 return 0;
1000}
1001
Colin Leitnerf04d5142013-05-27 23:41:05 +02001002static int sony_mapping(struct hid_device *hdev, struct hid_input *hi,
1003 struct hid_field *field, struct hid_usage *usage,
1004 unsigned long **bit, int *max)
1005{
1006 struct sony_sc *sc = hid_get_drvdata(hdev);
1007
1008 if (sc->quirks & BUZZ_CONTROLLER) {
1009 unsigned int key = usage->hid & HID_USAGE;
1010
1011 if ((usage->hid & HID_USAGE_PAGE) != HID_UP_BUTTON)
1012 return -1;
1013
1014 switch (usage->collection_index) {
1015 case 1:
1016 if (key >= ARRAY_SIZE(buzz_keymap))
1017 return -1;
1018
1019 key = buzz_keymap[key];
1020 if (!key)
1021 return -1;
1022 break;
1023 default:
1024 return -1;
1025 }
1026
1027 hid_map_usage_clear(hi, usage, bit, max, EV_KEY, key);
1028 return 1;
1029 }
1030
Jiri Kosina078328d2013-06-13 12:03:49 +02001031 if (sc->quirks & PS3REMOTE)
1032 return ps3remote_mapping(hdev, hi, field, usage, bit, max);
1033
Benjamin Tissoires6f498012013-07-24 16:53:07 +02001034 /* Let hid-core decide for the others */
1035 return 0;
Colin Leitnerf04d5142013-05-27 23:41:05 +02001036}
1037
Antonio Ospite5710fab2011-02-20 18:26:45 +01001038/*
Jiri Slabybd28ce02008-06-25 23:47:04 +02001039 * Sending HID_REQ_GET_REPORT changes the operation mode of the ps3 controller
1040 * to "operational". Without this, the ps3 controller will not report any
1041 * events.
1042 */
Antonio Ospite816651a2010-05-03 22:15:55 +02001043static int sixaxis_set_operational_usb(struct hid_device *hdev)
Jiri Slabybd28ce02008-06-25 23:47:04 +02001044{
Jiri Slabybd28ce02008-06-25 23:47:04 +02001045 int ret;
1046 char *buf = kmalloc(18, GFP_KERNEL);
1047
1048 if (!buf)
1049 return -ENOMEM;
1050
Benjamin Tissoirescafebc02014-02-05 16:33:22 -05001051 ret = hid_hw_raw_request(hdev, 0xf2, buf, 17, HID_FEATURE_REPORT,
1052 HID_REQ_GET_REPORT);
Benjamin Tissoiresf204828a2013-09-11 22:12:25 +02001053
Jiri Slabybd28ce02008-06-25 23:47:04 +02001054 if (ret < 0)
Joe Perches4291ee32010-12-09 19:29:03 -08001055 hid_err(hdev, "can't set operational mode\n");
Jiri Slabybd28ce02008-06-25 23:47:04 +02001056
1057 kfree(buf);
1058
1059 return ret;
1060}
1061
Antonio Ospite816651a2010-05-03 22:15:55 +02001062static int sixaxis_set_operational_bt(struct hid_device *hdev)
Bastien Noceraf9ce7c22010-01-20 12:01:53 +00001063{
Antonio Ospitefddb33f2010-05-03 17:19:03 +02001064 unsigned char buf[] = { 0xf4, 0x42, 0x03, 0x00, 0x00 };
Benjamin Tissoiresb0dd72a2014-02-10 12:58:54 -05001065 return hid_hw_raw_request(hdev, buf[0], buf, sizeof(buf),
1066 HID_FEATURE_REPORT, HID_REQ_SET_REPORT);
Bastien Noceraf9ce7c22010-01-20 12:01:53 +00001067}
1068
Frank Praznikad142b92014-02-20 11:36:00 -05001069/*
1070 * Requesting feature report 0x02 in Bluetooth mode changes the state of the
Frank Praznik68330d82014-02-05 20:03:49 -05001071 * controller so that it sends full input reports of type 0x11.
1072 */
1073static int dualshock4_set_operational_bt(struct hid_device *hdev)
1074{
1075 __u8 buf[37] = { 0 };
1076
1077 return hid_hw_raw_request(hdev, 0x02, buf, sizeof(buf),
1078 HID_FEATURE_REPORT, HID_REQ_GET_REPORT);
Jiri Slabybd28ce02008-06-25 23:47:04 +02001079}
1080
Frank Praznik60781cf2014-01-11 15:13:15 -05001081static void buzz_set_leds(struct hid_device *hdev, const __u8 *leds)
Colin Leitnerf04d5142013-05-27 23:41:05 +02001082{
1083 struct list_head *report_list =
1084 &hdev->report_enum[HID_OUTPUT_REPORT].report_list;
1085 struct hid_report *report = list_entry(report_list->next,
1086 struct hid_report, list);
1087 __s32 *value = report->field[0]->value;
1088
1089 value[0] = 0x00;
Frank Praznik60781cf2014-01-11 15:13:15 -05001090 value[1] = leds[0] ? 0xff : 0x00;
1091 value[2] = leds[1] ? 0xff : 0x00;
1092 value[3] = leds[2] ? 0xff : 0x00;
1093 value[4] = leds[3] ? 0xff : 0x00;
Colin Leitnerf04d5142013-05-27 23:41:05 +02001094 value[5] = 0x00;
1095 value[6] = 0x00;
1096 hid_hw_request(hdev, report, HID_REQ_SET_REPORT);
1097}
1098
Frank Praznikfa57a812014-04-14 10:11:33 -04001099static void sony_set_leds(struct sony_sc *sc, const __u8 *leds, int count)
Sven Eckelmann0a286ef2013-11-19 20:26:32 +01001100{
Frank Praznik60781cf2014-01-11 15:13:15 -05001101 int n;
Sven Eckelmann0a286ef2013-11-19 20:26:32 +01001102
Frank Praznik60781cf2014-01-11 15:13:15 -05001103 BUG_ON(count > MAX_LEDS);
1104
Frank Praznikfa57a812014-04-14 10:11:33 -04001105 if (sc->quirks & BUZZ_CONTROLLER && count == 4) {
1106 buzz_set_leds(sc->hdev, leds);
Frank Praznikfee4e2d2014-02-18 17:22:01 -05001107 } else {
Frank Praznik60781cf2014-01-11 15:13:15 -05001108 for (n = 0; n < count; n++)
Frank Praznikfa57a812014-04-14 10:11:33 -04001109 sc->led_state[n] = leds[n];
1110 schedule_work(&sc->state_worker);
Sven Eckelmann0a286ef2013-11-19 20:26:32 +01001111 }
1112}
1113
Sven Eckelmannc5382512013-11-19 20:26:30 +01001114static void sony_led_set_brightness(struct led_classdev *led,
Colin Leitnerf04d5142013-05-27 23:41:05 +02001115 enum led_brightness value)
1116{
1117 struct device *dev = led->dev->parent;
1118 struct hid_device *hdev = container_of(dev, struct hid_device, dev);
1119 struct sony_sc *drv_data;
Colin Leitnerf04d5142013-05-27 23:41:05 +02001120
1121 int n;
1122
1123 drv_data = hid_get_drvdata(hdev);
Sven Eckelmann2251b852013-11-19 20:26:31 +01001124 if (!drv_data) {
Colin Leitnerf04d5142013-05-27 23:41:05 +02001125 hid_err(hdev, "No device data\n");
1126 return;
1127 }
Colin Leitnerf04d5142013-05-27 23:41:05 +02001128
Frank Praznik60781cf2014-01-11 15:13:15 -05001129 for (n = 0; n < drv_data->led_count; n++) {
Sven Eckelmann2251b852013-11-19 20:26:31 +01001130 if (led == drv_data->leds[n]) {
Frank Praznik60781cf2014-01-11 15:13:15 -05001131 if (value != drv_data->led_state[n]) {
1132 drv_data->led_state[n] = value;
Frank Praznikfa57a812014-04-14 10:11:33 -04001133 sony_set_leds(drv_data, drv_data->led_state,
1134 drv_data->led_count);
Colin Leitnerf04d5142013-05-27 23:41:05 +02001135 }
1136 break;
1137 }
1138 }
1139}
1140
Sven Eckelmannc5382512013-11-19 20:26:30 +01001141static enum led_brightness sony_led_get_brightness(struct led_classdev *led)
Colin Leitnerf04d5142013-05-27 23:41:05 +02001142{
1143 struct device *dev = led->dev->parent;
1144 struct hid_device *hdev = container_of(dev, struct hid_device, dev);
1145 struct sony_sc *drv_data;
Colin Leitnerf04d5142013-05-27 23:41:05 +02001146
1147 int n;
Colin Leitnerf04d5142013-05-27 23:41:05 +02001148
1149 drv_data = hid_get_drvdata(hdev);
Sven Eckelmann2251b852013-11-19 20:26:31 +01001150 if (!drv_data) {
Colin Leitnerf04d5142013-05-27 23:41:05 +02001151 hid_err(hdev, "No device data\n");
1152 return LED_OFF;
1153 }
Colin Leitnerf04d5142013-05-27 23:41:05 +02001154
Frank Praznik60781cf2014-01-11 15:13:15 -05001155 for (n = 0; n < drv_data->led_count; n++) {
Simon Wood7db75042014-02-05 12:34:18 -07001156 if (led == drv_data->leds[n])
1157 return drv_data->led_state[n];
Colin Leitnerf04d5142013-05-27 23:41:05 +02001158 }
1159
Simon Wood7db75042014-02-05 12:34:18 -07001160 return LED_OFF;
Colin Leitnerf04d5142013-05-27 23:41:05 +02001161}
Colin Leitnerf04d5142013-05-27 23:41:05 +02001162
Frank Praznikfa57a812014-04-14 10:11:33 -04001163static void sony_leds_remove(struct sony_sc *sc)
Sven Eckelmann0a286ef2013-11-19 20:26:32 +01001164{
Sven Eckelmann0a286ef2013-11-19 20:26:32 +01001165 struct led_classdev *led;
1166 int n;
1167
Frank Praznikfa57a812014-04-14 10:11:33 -04001168 BUG_ON(!(sc->quirks & SONY_LED_SUPPORT));
Sven Eckelmann0a286ef2013-11-19 20:26:32 +01001169
Frank Praznikfa57a812014-04-14 10:11:33 -04001170 for (n = 0; n < sc->led_count; n++) {
1171 led = sc->leds[n];
1172 sc->leds[n] = NULL;
Sven Eckelmann0a286ef2013-11-19 20:26:32 +01001173 if (!led)
1174 continue;
1175 led_classdev_unregister(led);
1176 kfree(led);
1177 }
Frank Praznik60781cf2014-01-11 15:13:15 -05001178
Frank Praznikfa57a812014-04-14 10:11:33 -04001179 sc->led_count = 0;
Sven Eckelmann0a286ef2013-11-19 20:26:32 +01001180}
1181
Frank Praznikfa57a812014-04-14 10:11:33 -04001182static int sony_leds_init(struct sony_sc *sc)
Colin Leitnerf04d5142013-05-27 23:41:05 +02001183{
Frank Praznikfa57a812014-04-14 10:11:33 -04001184 struct hid_device *hdev = sc->hdev;
Jiri Kosina40e32ee2013-05-28 11:22:09 +02001185 int n, ret = 0;
Frank Praznik60781cf2014-01-11 15:13:15 -05001186 int max_brightness;
Frank Praznik61ebca92014-01-20 12:27:02 -05001187 int use_colors;
Jiri Kosina40e32ee2013-05-28 11:22:09 +02001188 struct led_classdev *led;
1189 size_t name_sz;
1190 char *name;
Sven Eckelmann0a286ef2013-11-19 20:26:32 +01001191 size_t name_len;
1192 const char *name_fmt;
Frank Praznik61ebca92014-01-20 12:27:02 -05001193 static const char * const color_str[] = { "red", "green", "blue" };
Frank Praznik60781cf2014-01-11 15:13:15 -05001194 static const __u8 initial_values[MAX_LEDS] = { 0x00, 0x00, 0x00, 0x00 };
Colin Leitnerf04d5142013-05-27 23:41:05 +02001195
Frank Praznikfa57a812014-04-14 10:11:33 -04001196 BUG_ON(!(sc->quirks & SONY_LED_SUPPORT));
Colin Leitnerf04d5142013-05-27 23:41:05 +02001197
Frank Praznikfa57a812014-04-14 10:11:33 -04001198 if (sc->quirks & BUZZ_CONTROLLER) {
1199 sc->led_count = 4;
Frank Praznik61ebca92014-01-20 12:27:02 -05001200 max_brightness = 1;
1201 use_colors = 0;
Sven Eckelmann0a286ef2013-11-19 20:26:32 +01001202 name_len = strlen("::buzz#");
1203 name_fmt = "%s::buzz%d";
1204 /* Validate expected report characteristics. */
1205 if (!hid_validate_values(hdev, HID_OUTPUT_REPORT, 0, 0, 7))
1206 return -ENODEV;
Frank Praznikfa57a812014-04-14 10:11:33 -04001207 } else if (sc->quirks & DUALSHOCK4_CONTROLLER) {
1208 sc->led_count = 3;
Frank Praznik60781cf2014-01-11 15:13:15 -05001209 max_brightness = 255;
Frank Praznik61ebca92014-01-20 12:27:02 -05001210 use_colors = 1;
1211 name_len = 0;
1212 name_fmt = "%s:%s";
Frank Praznik60781cf2014-01-11 15:13:15 -05001213 } else {
Frank Praznikfa57a812014-04-14 10:11:33 -04001214 sc->led_count = 4;
Frank Praznik60781cf2014-01-11 15:13:15 -05001215 max_brightness = 1;
Frank Praznik61ebca92014-01-20 12:27:02 -05001216 use_colors = 0;
1217 name_len = strlen("::sony#");
1218 name_fmt = "%s::sony%d";
Frank Praznik60781cf2014-01-11 15:13:15 -05001219 }
1220
Frank Praznikad142b92014-02-20 11:36:00 -05001221 /*
1222 * Clear LEDs as we have no way of reading their initial state. This is
Colin Leitnerf04d5142013-05-27 23:41:05 +02001223 * only relevant if the driver is loaded after somebody actively set the
Frank Praznikad142b92014-02-20 11:36:00 -05001224 * LEDs to on
1225 */
Frank Praznikfa57a812014-04-14 10:11:33 -04001226 sony_set_leds(sc, initial_values, sc->led_count);
Colin Leitnerf04d5142013-05-27 23:41:05 +02001227
Sven Eckelmann0a286ef2013-11-19 20:26:32 +01001228 name_sz = strlen(dev_name(&hdev->dev)) + name_len + 1;
Colin Leitnerf04d5142013-05-27 23:41:05 +02001229
Frank Praznikfa57a812014-04-14 10:11:33 -04001230 for (n = 0; n < sc->led_count; n++) {
Frank Praznik61ebca92014-01-20 12:27:02 -05001231
1232 if (use_colors)
1233 name_sz = strlen(dev_name(&hdev->dev)) + strlen(color_str[n]) + 2;
1234
Jiri Kosina40e32ee2013-05-28 11:22:09 +02001235 led = kzalloc(sizeof(struct led_classdev) + name_sz, GFP_KERNEL);
1236 if (!led) {
1237 hid_err(hdev, "Couldn't allocate memory for LED %d\n", n);
Julia Lawall8cd5fcd2013-12-29 23:47:27 +01001238 ret = -ENOMEM;
Jiri Kosina40e32ee2013-05-28 11:22:09 +02001239 goto error_leds;
Colin Leitnerf04d5142013-05-27 23:41:05 +02001240 }
Jiri Kosina40e32ee2013-05-28 11:22:09 +02001241
1242 name = (void *)(&led[1]);
Frank Praznik61ebca92014-01-20 12:27:02 -05001243 if (use_colors)
1244 snprintf(name, name_sz, name_fmt, dev_name(&hdev->dev), color_str[n]);
1245 else
1246 snprintf(name, name_sz, name_fmt, dev_name(&hdev->dev), n + 1);
Jiri Kosina40e32ee2013-05-28 11:22:09 +02001247 led->name = name;
1248 led->brightness = 0;
Frank Praznik60781cf2014-01-11 15:13:15 -05001249 led->max_brightness = max_brightness;
Sven Eckelmannc5382512013-11-19 20:26:30 +01001250 led->brightness_get = sony_led_get_brightness;
1251 led->brightness_set = sony_led_set_brightness;
Jiri Kosina40e32ee2013-05-28 11:22:09 +02001252
Julia Lawall8cd5fcd2013-12-29 23:47:27 +01001253 ret = led_classdev_register(&hdev->dev, led);
1254 if (ret) {
Jiri Kosina40e32ee2013-05-28 11:22:09 +02001255 hid_err(hdev, "Failed to register LED %d\n", n);
1256 kfree(led);
1257 goto error_leds;
1258 }
1259
Frank Praznikfa57a812014-04-14 10:11:33 -04001260 sc->leds[n] = led;
Colin Leitnerf04d5142013-05-27 23:41:05 +02001261 }
Colin Leitnerf04d5142013-05-27 23:41:05 +02001262
1263 return ret;
1264
Colin Leitnerf04d5142013-05-27 23:41:05 +02001265error_leds:
Frank Praznikfa57a812014-04-14 10:11:33 -04001266 sony_leds_remove(sc);
Colin Leitnerf04d5142013-05-27 23:41:05 +02001267
Colin Leitnerf04d5142013-05-27 23:41:05 +02001268 return ret;
Colin Leitnerf04d5142013-05-27 23:41:05 +02001269}
1270
Frank Praznikcad665a2014-01-11 15:13:54 -05001271static void sixaxis_state_worker(struct work_struct *work)
Sven Eckelmanna08c22c2013-11-09 19:25:57 +01001272{
Sven Eckelmann92b5c412013-11-19 20:26:28 +01001273 struct sony_sc *sc = container_of(work, struct sony_sc, state_worker);
Frank Praznik55d3b662014-04-14 10:11:32 -04001274 union sixaxis_output_report_01 report = {
1275 .buf = {
1276 0x01,
1277 0x00, 0xff, 0x00, 0xff, 0x00,
1278 0x00, 0x00, 0x00, 0x00, 0x00,
1279 0xff, 0x27, 0x10, 0x00, 0x32,
1280 0xff, 0x27, 0x10, 0x00, 0x32,
1281 0xff, 0x27, 0x10, 0x00, 0x32,
1282 0xff, 0x27, 0x10, 0x00, 0x32,
1283 0x00, 0x00, 0x00, 0x00, 0x00
1284 }
Sven Eckelmanna08c22c2013-11-09 19:25:57 +01001285 };
Sven Eckelmann9f323b62013-11-17 20:38:21 +01001286
Sven Eckelmann0a286ef2013-11-19 20:26:32 +01001287#ifdef CONFIG_SONY_FF
Frank Praznik55d3b662014-04-14 10:11:32 -04001288 report.data.rumble.right_motor_on = sc->right ? 1 : 0;
1289 report.data.rumble.left_motor_force = sc->left;
Sven Eckelmann0a286ef2013-11-19 20:26:32 +01001290#endif
1291
Frank Praznik55d3b662014-04-14 10:11:32 -04001292 report.data.leds_bitmap |= sc->led_state[0] << 1;
1293 report.data.leds_bitmap |= sc->led_state[1] << 2;
1294 report.data.leds_bitmap |= sc->led_state[2] << 3;
1295 report.data.leds_bitmap |= sc->led_state[3] << 4;
Sven Eckelmann9f323b62013-11-17 20:38:21 +01001296
Frank Praznik55d3b662014-04-14 10:11:32 -04001297 hid_hw_raw_request(sc->hdev, report.data.report_id, report.buf,
1298 sizeof(report), HID_OUTPUT_REPORT, HID_REQ_SET_REPORT);
Sven Eckelmann9f323b62013-11-17 20:38:21 +01001299}
1300
Frank Praznik0bd88dd2014-01-11 15:12:42 -05001301static void dualshock4_state_worker(struct work_struct *work)
1302{
1303 struct sony_sc *sc = container_of(work, struct sony_sc, state_worker);
Frank Praznik0da8ea62014-01-16 21:42:51 -05001304 struct hid_device *hdev = sc->hdev;
Frank Praznik48220232014-02-05 20:03:44 -05001305 int offset;
Frank Praznik0da8ea62014-01-16 21:42:51 -05001306
Frank Praznikfdcf105d2014-02-05 20:03:46 -05001307 __u8 buf[78] = { 0 };
Frank Praznik48220232014-02-05 20:03:44 -05001308
Frank Praznikfdcf105d2014-02-05 20:03:46 -05001309 if (sc->quirks & DUALSHOCK4_CONTROLLER_USB) {
1310 buf[0] = 0x05;
1311 buf[1] = 0x03;
1312 offset = 4;
1313 } else {
1314 buf[0] = 0x11;
1315 buf[1] = 0xB0;
1316 buf[3] = 0x0F;
1317 offset = 6;
1318 }
Frank Praznik0bd88dd2014-01-11 15:12:42 -05001319
1320#ifdef CONFIG_SONY_FF
Frank Praznik48220232014-02-05 20:03:44 -05001321 buf[offset++] = sc->right;
1322 buf[offset++] = sc->left;
1323#else
1324 offset += 2;
Frank Praznik0bd88dd2014-01-11 15:12:42 -05001325#endif
1326
Frank Praznik48220232014-02-05 20:03:44 -05001327 buf[offset++] = sc->led_state[0];
1328 buf[offset++] = sc->led_state[1];
1329 buf[offset++] = sc->led_state[2];
Frank Praznik60781cf2014-01-11 15:13:15 -05001330
Frank Praznikfdcf105d2014-02-05 20:03:46 -05001331 if (sc->quirks & DUALSHOCK4_CONTROLLER_USB)
1332 hid_hw_output_report(hdev, buf, 32);
1333 else
1334 hid_hw_raw_request(hdev, 0x11, buf, 78,
1335 HID_OUTPUT_REPORT, HID_REQ_SET_REPORT);
Frank Praznik0bd88dd2014-01-11 15:12:42 -05001336}
1337
Sven Eckelmann0a286ef2013-11-19 20:26:32 +01001338#ifdef CONFIG_SONY_FF
Sven Eckelmann9f323b62013-11-17 20:38:21 +01001339static int sony_play_effect(struct input_dev *dev, void *data,
1340 struct ff_effect *effect)
1341{
Sven Eckelmanna08c22c2013-11-09 19:25:57 +01001342 struct hid_device *hid = input_get_drvdata(dev);
Sven Eckelmann9f323b62013-11-17 20:38:21 +01001343 struct sony_sc *sc = hid_get_drvdata(hid);
Sven Eckelmanna08c22c2013-11-09 19:25:57 +01001344
1345 if (effect->type != FF_RUMBLE)
1346 return 0;
1347
Sven Eckelmann9f323b62013-11-17 20:38:21 +01001348 sc->left = effect->u.rumble.strong_magnitude / 256;
Frank Praznik0bd88dd2014-01-11 15:12:42 -05001349 sc->right = effect->u.rumble.weak_magnitude / 256;
Sven Eckelmanna08c22c2013-11-09 19:25:57 +01001350
Sven Eckelmann92b5c412013-11-19 20:26:28 +01001351 schedule_work(&sc->state_worker);
Sven Eckelmann9f323b62013-11-17 20:38:21 +01001352 return 0;
Sven Eckelmanna08c22c2013-11-09 19:25:57 +01001353}
1354
Frank Praznikfa57a812014-04-14 10:11:33 -04001355static int sony_init_ff(struct sony_sc *sc)
Sven Eckelmanna08c22c2013-11-09 19:25:57 +01001356{
Frank Praznikfa57a812014-04-14 10:11:33 -04001357 struct hid_input *hidinput = list_entry(sc->hdev->inputs.next,
Sven Eckelmanna08c22c2013-11-09 19:25:57 +01001358 struct hid_input, list);
1359 struct input_dev *input_dev = hidinput->input;
1360
1361 input_set_capability(input_dev, EV_FF, FF_RUMBLE);
1362 return input_ff_create_memless(input_dev, NULL, sony_play_effect);
1363}
1364
1365#else
Frank Praznikfa57a812014-04-14 10:11:33 -04001366static int sony_init_ff(struct sony_sc *sc)
Sven Eckelmanna08c22c2013-11-09 19:25:57 +01001367{
1368 return 0;
1369}
Sven Eckelmann9f323b62013-11-17 20:38:21 +01001370
Sven Eckelmanna08c22c2013-11-09 19:25:57 +01001371#endif
1372
Frank Praznikd902f472014-01-27 10:17:36 -05001373static int sony_battery_get_property(struct power_supply *psy,
1374 enum power_supply_property psp,
1375 union power_supply_propval *val)
Frank Praznikc4e1ddf2014-01-17 14:46:26 -05001376{
Frank Praznikd902f472014-01-27 10:17:36 -05001377 struct sony_sc *sc = container_of(psy, struct sony_sc, battery);
1378 unsigned long flags;
1379 int ret = 0;
1380 u8 battery_charging, battery_capacity, cable_state;
1381
1382 spin_lock_irqsave(&sc->lock, flags);
1383 battery_charging = sc->battery_charging;
1384 battery_capacity = sc->battery_capacity;
1385 cable_state = sc->cable_state;
1386 spin_unlock_irqrestore(&sc->lock, flags);
1387
1388 switch (psp) {
1389 case POWER_SUPPLY_PROP_PRESENT:
1390 val->intval = 1;
1391 break;
1392 case POWER_SUPPLY_PROP_SCOPE:
1393 val->intval = POWER_SUPPLY_SCOPE_DEVICE;
1394 break;
1395 case POWER_SUPPLY_PROP_CAPACITY:
1396 val->intval = battery_capacity;
1397 break;
1398 case POWER_SUPPLY_PROP_STATUS:
1399 if (battery_charging)
1400 val->intval = POWER_SUPPLY_STATUS_CHARGING;
1401 else
1402 if (battery_capacity == 100 && cable_state)
1403 val->intval = POWER_SUPPLY_STATUS_FULL;
1404 else
1405 val->intval = POWER_SUPPLY_STATUS_DISCHARGING;
1406 break;
1407 default:
1408 ret = -EINVAL;
1409 break;
1410 }
1411 return ret;
1412}
1413
1414static int sony_battery_probe(struct sony_sc *sc)
1415{
1416 static atomic_t power_id_seq = ATOMIC_INIT(0);
1417 unsigned long power_id;
Frank Praznikc4e1ddf2014-01-17 14:46:26 -05001418 struct hid_device *hdev = sc->hdev;
Frank Praznikd902f472014-01-27 10:17:36 -05001419 int ret;
Frank Praznikc4e1ddf2014-01-17 14:46:26 -05001420
Frank Praznikad142b92014-02-20 11:36:00 -05001421 /*
1422 * Set the default battery level to 100% to avoid low battery warnings
Frank Praznikd9a293a2014-02-05 20:03:48 -05001423 * if the battery is polled before the first device report is received.
1424 */
1425 sc->battery_capacity = 100;
Frank Praznikc4e1ddf2014-01-17 14:46:26 -05001426
Frank Praznikd902f472014-01-27 10:17:36 -05001427 power_id = (unsigned long)atomic_inc_return(&power_id_seq);
Frank Praznikc4e1ddf2014-01-17 14:46:26 -05001428
Frank Praznikd902f472014-01-27 10:17:36 -05001429 sc->battery.properties = sony_battery_props;
1430 sc->battery.num_properties = ARRAY_SIZE(sony_battery_props);
1431 sc->battery.get_property = sony_battery_get_property;
1432 sc->battery.type = POWER_SUPPLY_TYPE_BATTERY;
1433 sc->battery.use_for_apm = 0;
1434 sc->battery.name = kasprintf(GFP_KERNEL, "sony_controller_battery_%lu",
1435 power_id);
1436 if (!sc->battery.name)
1437 return -ENOMEM;
1438
1439 ret = power_supply_register(&hdev->dev, &sc->battery);
1440 if (ret) {
1441 hid_err(hdev, "Unable to register battery device\n");
1442 goto err_free;
1443 }
1444
1445 power_supply_powers(&sc->battery, &hdev->dev);
1446 return 0;
1447
1448err_free:
1449 kfree(sc->battery.name);
1450 sc->battery.name = NULL;
1451 return ret;
1452}
1453
1454static void sony_battery_remove(struct sony_sc *sc)
1455{
1456 if (!sc->battery.name)
1457 return;
1458
1459 power_supply_unregister(&sc->battery);
1460 kfree(sc->battery.name);
1461 sc->battery.name = NULL;
1462}
1463
Frank Praznike5606232014-01-27 10:17:37 -05001464static int sony_register_touchpad(struct sony_sc *sc, int touch_count,
1465 int w, int h)
1466{
1467 struct hid_input *hidinput = list_entry(sc->hdev->inputs.next,
1468 struct hid_input, list);
1469 struct input_dev *input_dev = hidinput->input;
1470 int ret;
1471
1472 ret = input_mt_init_slots(input_dev, touch_count, 0);
1473 if (ret < 0) {
1474 hid_err(sc->hdev, "Unable to initialize multi-touch slots\n");
1475 return ret;
1476 }
1477
1478 input_set_abs_params(input_dev, ABS_MT_POSITION_X, 0, w, 0, 0);
1479 input_set_abs_params(input_dev, ABS_MT_POSITION_Y, 0, h, 0, 0);
1480
1481 return 0;
1482}
1483
Frank Praznikd2d782f2014-02-20 11:36:03 -05001484/*
1485 * If a controller is plugged in via USB while already connected via Bluetooth
1486 * it will show up as two devices. A global list of connected controllers and
1487 * their MAC addresses is maintained to ensure that a device is only connected
1488 * once.
1489 */
1490static int sony_check_add_dev_list(struct sony_sc *sc)
1491{
1492 struct sony_sc *entry;
1493 unsigned long flags;
1494 int ret;
1495
1496 spin_lock_irqsave(&sony_dev_list_lock, flags);
1497
1498 list_for_each_entry(entry, &sony_device_list, list_node) {
1499 ret = memcmp(sc->mac_address, entry->mac_address,
1500 sizeof(sc->mac_address));
1501 if (!ret) {
1502 ret = -EEXIST;
1503 hid_info(sc->hdev, "controller with MAC address %pMR already connected\n",
1504 sc->mac_address);
1505 goto unlock;
Frank Praznikc4e1ddf2014-01-17 14:46:26 -05001506 }
1507 }
1508
Frank Praznikd2d782f2014-02-20 11:36:03 -05001509 ret = 0;
1510 list_add(&(sc->list_node), &sony_device_list);
Frank Praznikc4e1ddf2014-01-17 14:46:26 -05001511
Frank Praznikd2d782f2014-02-20 11:36:03 -05001512unlock:
1513 spin_unlock_irqrestore(&sony_dev_list_lock, flags);
1514 return ret;
Frank Praznikc4e1ddf2014-01-17 14:46:26 -05001515}
1516
Frank Praznikd2d782f2014-02-20 11:36:03 -05001517static void sony_remove_dev_list(struct sony_sc *sc)
1518{
1519 unsigned long flags;
1520
1521 if (sc->list_node.next) {
1522 spin_lock_irqsave(&sony_dev_list_lock, flags);
1523 list_del(&(sc->list_node));
1524 spin_unlock_irqrestore(&sony_dev_list_lock, flags);
1525 }
1526}
1527
1528static int sony_get_bt_devaddr(struct sony_sc *sc)
1529{
1530 int ret;
1531
1532 /* HIDP stores the device MAC address as a string in the uniq field. */
1533 ret = strlen(sc->hdev->uniq);
1534 if (ret != 17)
1535 return -EINVAL;
1536
1537 ret = sscanf(sc->hdev->uniq,
1538 "%02hhx:%02hhx:%02hhx:%02hhx:%02hhx:%02hhx",
1539 &sc->mac_address[5], &sc->mac_address[4], &sc->mac_address[3],
1540 &sc->mac_address[2], &sc->mac_address[1], &sc->mac_address[0]);
1541
1542 if (ret != 6)
1543 return -EINVAL;
1544
1545 return 0;
1546}
1547
1548static int sony_check_add(struct sony_sc *sc)
1549{
1550 int n, ret;
1551
1552 if ((sc->quirks & DUALSHOCK4_CONTROLLER_BT) ||
1553 (sc->quirks & SIXAXIS_CONTROLLER_BT)) {
1554 /*
1555 * sony_get_bt_devaddr() attempts to parse the Bluetooth MAC
1556 * address from the uniq string where HIDP stores it.
1557 * As uniq cannot be guaranteed to be a MAC address in all cases
1558 * a failure of this function should not prevent the connection.
1559 */
1560 if (sony_get_bt_devaddr(sc) < 0) {
1561 hid_warn(sc->hdev, "UNIQ does not contain a MAC address; duplicate check skipped\n");
1562 return 0;
1563 }
1564 } else if (sc->quirks & DUALSHOCK4_CONTROLLER_USB) {
1565 __u8 buf[7];
1566
1567 /*
1568 * The MAC address of a DS4 controller connected via USB can be
1569 * retrieved with feature report 0x81. The address begins at
1570 * offset 1.
1571 */
1572 ret = hid_hw_raw_request(sc->hdev, 0x81, buf, sizeof(buf),
1573 HID_FEATURE_REPORT, HID_REQ_GET_REPORT);
1574
1575 if (ret != 7) {
1576 hid_err(sc->hdev, "failed to retrieve feature report 0x81 with the DualShock 4 MAC address\n");
1577 return ret < 0 ? ret : -EINVAL;
1578 }
1579
1580 memcpy(sc->mac_address, &buf[1], sizeof(sc->mac_address));
1581 } else if (sc->quirks & SIXAXIS_CONTROLLER_USB) {
1582 __u8 buf[18];
1583
1584 /*
1585 * The MAC address of a Sixaxis controller connected via USB can
1586 * be retrieved with feature report 0xf2. The address begins at
1587 * offset 4.
1588 */
1589 ret = hid_hw_raw_request(sc->hdev, 0xf2, buf, sizeof(buf),
1590 HID_FEATURE_REPORT, HID_REQ_GET_REPORT);
1591
1592 if (ret != 18) {
1593 hid_err(sc->hdev, "failed to retrieve feature report 0xf2 with the Sixaxis MAC address\n");
1594 return ret < 0 ? ret : -EINVAL;
1595 }
1596
1597 /*
1598 * The Sixaxis device MAC in the report is big-endian and must
1599 * be byte-swapped.
1600 */
1601 for (n = 0; n < 6; n++)
1602 sc->mac_address[5-n] = buf[4+n];
1603 } else {
1604 return 0;
1605 }
1606
1607 return sony_check_add_dev_list(sc);
1608}
1609
Frank Praznik46262042014-04-14 10:11:31 -04001610static inline void sony_init_work(struct sony_sc *sc,
1611 void (*worker)(struct work_struct *))
1612{
1613 if (!sc->worker_initialized)
1614 INIT_WORK(&sc->state_worker, worker);
1615
1616 sc->worker_initialized = 1;
1617}
1618
1619static inline void sony_cancel_work_sync(struct sony_sc *sc)
1620{
1621 if (sc->worker_initialized)
1622 cancel_work_sync(&sc->state_worker);
1623}
Frank Praznikd2d782f2014-02-20 11:36:03 -05001624
Jiri Slabybd28ce02008-06-25 23:47:04 +02001625static int sony_probe(struct hid_device *hdev, const struct hid_device_id *id)
1626{
1627 int ret;
Jiri Kosinacc6e0bb2008-10-23 12:58:38 +02001628 unsigned long quirks = id->driver_data;
1629 struct sony_sc *sc;
Colin Leitnerf04d5142013-05-27 23:41:05 +02001630 unsigned int connect_mask = HID_CONNECT_DEFAULT;
Jiri Kosinacc6e0bb2008-10-23 12:58:38 +02001631
Benjamin Tissoiresabf832b2013-07-24 19:38:04 +02001632 sc = devm_kzalloc(&hdev->dev, sizeof(*sc), GFP_KERNEL);
Jiri Kosinacc6e0bb2008-10-23 12:58:38 +02001633 if (sc == NULL) {
Joe Perches4291ee32010-12-09 19:29:03 -08001634 hid_err(hdev, "can't alloc sony descriptor\n");
Jiri Kosinacc6e0bb2008-10-23 12:58:38 +02001635 return -ENOMEM;
1636 }
1637
1638 sc->quirks = quirks;
1639 hid_set_drvdata(hdev, sc);
Sven Eckelmann0a286ef2013-11-19 20:26:32 +01001640 sc->hdev = hdev;
Jiri Slabybd28ce02008-06-25 23:47:04 +02001641
Jiri Slabybd28ce02008-06-25 23:47:04 +02001642 ret = hid_parse(hdev);
1643 if (ret) {
Joe Perches4291ee32010-12-09 19:29:03 -08001644 hid_err(hdev, "parse failed\n");
Benjamin Tissoiresabf832b2013-07-24 19:38:04 +02001645 return ret;
Jiri Slabybd28ce02008-06-25 23:47:04 +02001646 }
1647
Colin Leitnerf04d5142013-05-27 23:41:05 +02001648 if (sc->quirks & VAIO_RDESC_CONSTANT)
1649 connect_mask |= HID_CONNECT_HIDDEV_FORCE;
1650 else if (sc->quirks & SIXAXIS_CONTROLLER_USB)
1651 connect_mask |= HID_CONNECT_HIDDEV_FORCE;
1652 else if (sc->quirks & SIXAXIS_CONTROLLER_BT)
1653 connect_mask |= HID_CONNECT_HIDDEV_FORCE;
1654
1655 ret = hid_hw_start(hdev, connect_mask);
Jiri Slabybd28ce02008-06-25 23:47:04 +02001656 if (ret) {
Joe Perches4291ee32010-12-09 19:29:03 -08001657 hid_err(hdev, "hw start failed\n");
Benjamin Tissoiresabf832b2013-07-24 19:38:04 +02001658 return ret;
Jiri Slabybd28ce02008-06-25 23:47:04 +02001659 }
1660
Antonio Ospite569b10a2010-10-19 16:13:10 +02001661 if (sc->quirks & SIXAXIS_CONTROLLER_USB) {
Benjamin Tissoirese534a932014-03-08 22:52:42 -05001662 /*
1663 * The Sony Sixaxis does not handle HID Output Reports on the
1664 * Interrupt EP like it could, so we need to force HID Output
1665 * Reports to use HID_REQ_SET_REPORT on the Control EP.
1666 *
1667 * There is also another issue about HID Output Reports via USB,
1668 * the Sixaxis does not want the report_id as part of the data
1669 * packet, so we have to discard buf[0] when sending the actual
1670 * control message, even for numbered reports, humpf!
1671 */
1672 hdev->quirks |= HID_QUIRK_NO_OUTPUT_REPORTS_ON_INTR_EP;
1673 hdev->quirks |= HID_QUIRK_SKIP_OUTPUT_REPORT_ID;
Antonio Ospite816651a2010-05-03 22:15:55 +02001674 ret = sixaxis_set_operational_usb(hdev);
Frank Praznik46262042014-04-14 10:11:31 -04001675 sony_init_work(sc, sixaxis_state_worker);
Frank Praznikfee4e2d2014-02-18 17:22:01 -05001676 } else if (sc->quirks & SIXAXIS_CONTROLLER_BT) {
Frank Praznik2078b9bb2014-03-15 09:41:16 -04001677 /*
1678 * The Sixaxis wants output reports sent on the ctrl endpoint
1679 * when connected via Bluetooth.
1680 */
1681 hdev->quirks |= HID_QUIRK_NO_OUTPUT_REPORTS_ON_INTR_EP;
Antonio Ospite816651a2010-05-03 22:15:55 +02001682 ret = sixaxis_set_operational_bt(hdev);
Frank Praznik46262042014-04-14 10:11:31 -04001683 sony_init_work(sc, sixaxis_state_worker);
Frank Praznikfee4e2d2014-02-18 17:22:01 -05001684 } else if (sc->quirks & DUALSHOCK4_CONTROLLER) {
Frank Praznik68330d82014-02-05 20:03:49 -05001685 if (sc->quirks & DUALSHOCK4_CONTROLLER_BT) {
Frank Praznik2078b9bb2014-03-15 09:41:16 -04001686 /*
1687 * The DualShock 4 wants output reports sent on the ctrl
1688 * endpoint when connected via Bluetooth.
1689 */
1690 hdev->quirks |= HID_QUIRK_NO_OUTPUT_REPORTS_ON_INTR_EP;
Frank Praznik68330d82014-02-05 20:03:49 -05001691 ret = dualshock4_set_operational_bt(hdev);
1692 if (ret < 0) {
1693 hid_err(hdev, "failed to set the Dualshock 4 operational mode\n");
1694 goto err_stop;
1695 }
1696 }
Frank Praznikad142b92014-02-20 11:36:00 -05001697 /*
1698 * The Dualshock 4 touchpad supports 2 touches and has a
Frank Praznike5606232014-01-27 10:17:37 -05001699 * resolution of 1920x940.
1700 */
1701 ret = sony_register_touchpad(sc, 2, 1920, 940);
Frank Praznikc4e1ddf2014-01-17 14:46:26 -05001702 if (ret < 0)
1703 goto err_stop;
1704
Frank Praznik46262042014-04-14 10:11:31 -04001705 sony_init_work(sc, dualshock4_state_worker);
Frank Praznik0bd88dd2014-01-11 15:12:42 -05001706 } else {
1707 ret = 0;
1708 }
Bastien Noceraf9ce7c22010-01-20 12:01:53 +00001709
Jiri Kosina4dfdc462008-12-30 00:49:59 +01001710 if (ret < 0)
Jiri Slabybd28ce02008-06-25 23:47:04 +02001711 goto err_stop;
1712
Frank Praznikd2d782f2014-02-20 11:36:03 -05001713 ret = sony_check_add(sc);
1714 if (ret < 0)
1715 goto err_stop;
1716
Sven Eckelmann0a286ef2013-11-19 20:26:32 +01001717 if (sc->quirks & SONY_LED_SUPPORT) {
Frank Praznikfa57a812014-04-14 10:11:33 -04001718 ret = sony_leds_init(sc);
Sven Eckelmann0a286ef2013-11-19 20:26:32 +01001719 if (ret < 0)
1720 goto err_stop;
1721 }
1722
Frank Praznikd902f472014-01-27 10:17:36 -05001723 if (sc->quirks & SONY_BATTERY_SUPPORT) {
1724 ret = sony_battery_probe(sc);
1725 if (ret < 0)
1726 goto err_stop;
1727
1728 /* Open the device to receive reports with battery info */
1729 ret = hid_hw_open(hdev);
1730 if (ret < 0) {
1731 hid_err(hdev, "hw open failed\n");
1732 goto err_stop;
1733 }
1734 }
1735
Frank Praznikc8de9db2014-02-20 11:36:01 -05001736 if (sc->quirks & SONY_FF_SUPPORT) {
Frank Praznikfa57a812014-04-14 10:11:33 -04001737 ret = sony_init_ff(sc);
Frank Praznikc8de9db2014-02-20 11:36:01 -05001738 if (ret < 0)
1739 goto err_close;
Frank Praznik5f5750d2014-02-19 13:09:22 -05001740 }
Sven Eckelmanna08c22c2013-11-09 19:25:57 +01001741
Jiri Slabybd28ce02008-06-25 23:47:04 +02001742 return 0;
Frank Praznikd902f472014-01-27 10:17:36 -05001743err_close:
1744 hid_hw_close(hdev);
Jiri Slabybd28ce02008-06-25 23:47:04 +02001745err_stop:
Sven Eckelmann0a286ef2013-11-19 20:26:32 +01001746 if (sc->quirks & SONY_LED_SUPPORT)
Frank Praznikfa57a812014-04-14 10:11:33 -04001747 sony_leds_remove(sc);
Frank Praznikd902f472014-01-27 10:17:36 -05001748 if (sc->quirks & SONY_BATTERY_SUPPORT)
1749 sony_battery_remove(sc);
Frank Praznik46262042014-04-14 10:11:31 -04001750 sony_cancel_work_sync(sc);
Frank Praznikd2d782f2014-02-20 11:36:03 -05001751 sony_remove_dev_list(sc);
Jiri Slabybd28ce02008-06-25 23:47:04 +02001752 hid_hw_stop(hdev);
Jiri Slabybd28ce02008-06-25 23:47:04 +02001753 return ret;
1754}
1755
Jiri Kosinacc6e0bb2008-10-23 12:58:38 +02001756static void sony_remove(struct hid_device *hdev)
1757{
Colin Leitnerf04d5142013-05-27 23:41:05 +02001758 struct sony_sc *sc = hid_get_drvdata(hdev);
1759
Sven Eckelmann0a286ef2013-11-19 20:26:32 +01001760 if (sc->quirks & SONY_LED_SUPPORT)
Frank Praznikfa57a812014-04-14 10:11:33 -04001761 sony_leds_remove(sc);
Colin Leitnerf04d5142013-05-27 23:41:05 +02001762
Frank Praznikd902f472014-01-27 10:17:36 -05001763 if (sc->quirks & SONY_BATTERY_SUPPORT) {
1764 hid_hw_close(hdev);
1765 sony_battery_remove(sc);
1766 }
1767
Frank Praznik46262042014-04-14 10:11:31 -04001768 sony_cancel_work_sync(sc);
Sven Eckelmann9f323b62013-11-17 20:38:21 +01001769
Frank Praznikd2d782f2014-02-20 11:36:03 -05001770 sony_remove_dev_list(sc);
Jiri Slabybd28ce02008-06-25 23:47:04 +02001771
Colin Leitnerf04d5142013-05-27 23:41:05 +02001772 hid_hw_stop(hdev);
1773}
1774
1775static const struct hid_device_id sony_devices[] = {
1776 { HID_USB_DEVICE(USB_VENDOR_ID_SONY, USB_DEVICE_ID_SONY_PS3_CONTROLLER),
1777 .driver_data = SIXAXIS_CONTROLLER_USB },
1778 { HID_USB_DEVICE(USB_VENDOR_ID_SONY, USB_DEVICE_ID_SONY_NAVIGATION_CONTROLLER),
Jiri Slabybd28ce02008-06-25 23:47:04 +02001779 .driver_data = SIXAXIS_CONTROLLER_USB },
H Hartley Sweetenf4254582012-12-17 15:28:26 -07001780 { HID_BLUETOOTH_DEVICE(USB_VENDOR_ID_SONY, USB_DEVICE_ID_SONY_PS3_CONTROLLER),
Jiri Slabybd28ce02008-06-25 23:47:04 +02001781 .driver_data = SIXAXIS_CONTROLLER_BT },
Jiri Slabybd28ce02008-06-25 23:47:04 +02001782 { HID_USB_DEVICE(USB_VENDOR_ID_SONY, USB_DEVICE_ID_SONY_VAIO_VGX_MOUSE),
Jiri Slabybd28ce02008-06-25 23:47:04 +02001783 .driver_data = VAIO_RDESC_CONSTANT },
1784 { HID_USB_DEVICE(USB_VENDOR_ID_SONY, USB_DEVICE_ID_SONY_VAIO_VGP_MOUSE),
1785 .driver_data = VAIO_RDESC_CONSTANT },
1786 /* Wired Buzz Controller. Reported as Sony Hub from its USB ID and as
1787 * Logitech joystick from the device descriptor. */
1788 { HID_USB_DEVICE(USB_VENDOR_ID_SONY, USB_DEVICE_ID_SONY_BUZZ_CONTROLLER),
1789 .driver_data = BUZZ_CONTROLLER },
1790 { HID_USB_DEVICE(USB_VENDOR_ID_SONY, USB_DEVICE_ID_SONY_WIRELESS_BUZZ_CONTROLLER),
1791 .driver_data = BUZZ_CONTROLLER },
1792 /* PS3 BD Remote Control */
1793 { HID_BLUETOOTH_DEVICE(USB_VENDOR_ID_SONY, USB_DEVICE_ID_SONY_PS3_BDREMOTE),
1794 .driver_data = PS3REMOTE },
1795 /* Logitech Harmony Adapter for PS3 */
1796 { HID_BLUETOOTH_DEVICE(USB_VENDOR_ID_LOGITECH, USB_DEVICE_ID_LOGITECH_HARMONY_PS3),
1797 .driver_data = PS3REMOTE },
Frank Praznik0bd88dd2014-01-11 15:12:42 -05001798 /* Sony Dualshock 4 controllers for PS4 */
1799 { HID_USB_DEVICE(USB_VENDOR_ID_SONY, USB_DEVICE_ID_SONY_PS4_CONTROLLER),
Frank Praznik8ab16762014-01-16 21:42:31 -05001800 .driver_data = DUALSHOCK4_CONTROLLER_USB },
Frank Praznik0bd88dd2014-01-11 15:12:42 -05001801 { HID_BLUETOOTH_DEVICE(USB_VENDOR_ID_SONY, USB_DEVICE_ID_SONY_PS4_CONTROLLER),
Frank Praznik8ab16762014-01-16 21:42:31 -05001802 .driver_data = DUALSHOCK4_CONTROLLER_BT },
Jiri Slabybd28ce02008-06-25 23:47:04 +02001803 { }
1804};
1805MODULE_DEVICE_TABLE(hid, sony_devices);
1806
1807static struct hid_driver sony_driver = {
1808 .name = "sony",
1809 .id_table = sony_devices,
1810 .input_mapping = sony_mapping,
1811 .probe = sony_probe,
1812 .remove = sony_remove,
1813 .report_fixup = sony_report_fixup,
1814 .raw_event = sony_raw_event
1815};
1816module_hid_driver(sony_driver);
1817
1818MODULE_LICENSE("GPL");