blob: 6ce2e3ab069360a67ca2e3a05c7856cc1af152b2 [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{
Frank Praznikc4e1ddf2014-01-17 14:46:26 -05001416 struct hid_device *hdev = sc->hdev;
Frank Praznikd902f472014-01-27 10:17:36 -05001417 int ret;
Frank Praznikc4e1ddf2014-01-17 14:46:26 -05001418
Frank Praznikad142b92014-02-20 11:36:00 -05001419 /*
1420 * Set the default battery level to 100% to avoid low battery warnings
Frank Praznikd9a293a2014-02-05 20:03:48 -05001421 * if the battery is polled before the first device report is received.
1422 */
1423 sc->battery_capacity = 100;
Frank Praznikc4e1ddf2014-01-17 14:46:26 -05001424
Frank Praznikd902f472014-01-27 10:17:36 -05001425 sc->battery.properties = sony_battery_props;
1426 sc->battery.num_properties = ARRAY_SIZE(sony_battery_props);
1427 sc->battery.get_property = sony_battery_get_property;
1428 sc->battery.type = POWER_SUPPLY_TYPE_BATTERY;
1429 sc->battery.use_for_apm = 0;
Frank Praznik314531f2014-04-14 10:11:34 -04001430 sc->battery.name = kasprintf(GFP_KERNEL, "sony_controller_battery_%pMR",
1431 sc->mac_address);
Frank Praznikd902f472014-01-27 10:17:36 -05001432 if (!sc->battery.name)
1433 return -ENOMEM;
1434
1435 ret = power_supply_register(&hdev->dev, &sc->battery);
1436 if (ret) {
1437 hid_err(hdev, "Unable to register battery device\n");
1438 goto err_free;
1439 }
1440
1441 power_supply_powers(&sc->battery, &hdev->dev);
1442 return 0;
1443
1444err_free:
1445 kfree(sc->battery.name);
1446 sc->battery.name = NULL;
1447 return ret;
1448}
1449
1450static void sony_battery_remove(struct sony_sc *sc)
1451{
1452 if (!sc->battery.name)
1453 return;
1454
1455 power_supply_unregister(&sc->battery);
1456 kfree(sc->battery.name);
1457 sc->battery.name = NULL;
1458}
1459
Frank Praznike5606232014-01-27 10:17:37 -05001460static int sony_register_touchpad(struct sony_sc *sc, int touch_count,
1461 int w, int h)
1462{
1463 struct hid_input *hidinput = list_entry(sc->hdev->inputs.next,
1464 struct hid_input, list);
1465 struct input_dev *input_dev = hidinput->input;
1466 int ret;
1467
1468 ret = input_mt_init_slots(input_dev, touch_count, 0);
1469 if (ret < 0) {
1470 hid_err(sc->hdev, "Unable to initialize multi-touch slots\n");
1471 return ret;
1472 }
1473
1474 input_set_abs_params(input_dev, ABS_MT_POSITION_X, 0, w, 0, 0);
1475 input_set_abs_params(input_dev, ABS_MT_POSITION_Y, 0, h, 0, 0);
1476
1477 return 0;
1478}
1479
Frank Praznikd2d782f2014-02-20 11:36:03 -05001480/*
1481 * If a controller is plugged in via USB while already connected via Bluetooth
1482 * it will show up as two devices. A global list of connected controllers and
1483 * their MAC addresses is maintained to ensure that a device is only connected
1484 * once.
1485 */
1486static int sony_check_add_dev_list(struct sony_sc *sc)
1487{
1488 struct sony_sc *entry;
1489 unsigned long flags;
1490 int ret;
1491
1492 spin_lock_irqsave(&sony_dev_list_lock, flags);
1493
1494 list_for_each_entry(entry, &sony_device_list, list_node) {
1495 ret = memcmp(sc->mac_address, entry->mac_address,
1496 sizeof(sc->mac_address));
1497 if (!ret) {
1498 ret = -EEXIST;
1499 hid_info(sc->hdev, "controller with MAC address %pMR already connected\n",
1500 sc->mac_address);
1501 goto unlock;
Frank Praznikc4e1ddf2014-01-17 14:46:26 -05001502 }
1503 }
1504
Frank Praznikd2d782f2014-02-20 11:36:03 -05001505 ret = 0;
1506 list_add(&(sc->list_node), &sony_device_list);
Frank Praznikc4e1ddf2014-01-17 14:46:26 -05001507
Frank Praznikd2d782f2014-02-20 11:36:03 -05001508unlock:
1509 spin_unlock_irqrestore(&sony_dev_list_lock, flags);
1510 return ret;
Frank Praznikc4e1ddf2014-01-17 14:46:26 -05001511}
1512
Frank Praznikd2d782f2014-02-20 11:36:03 -05001513static void sony_remove_dev_list(struct sony_sc *sc)
1514{
1515 unsigned long flags;
1516
1517 if (sc->list_node.next) {
1518 spin_lock_irqsave(&sony_dev_list_lock, flags);
1519 list_del(&(sc->list_node));
1520 spin_unlock_irqrestore(&sony_dev_list_lock, flags);
1521 }
1522}
1523
1524static int sony_get_bt_devaddr(struct sony_sc *sc)
1525{
1526 int ret;
1527
1528 /* HIDP stores the device MAC address as a string in the uniq field. */
1529 ret = strlen(sc->hdev->uniq);
1530 if (ret != 17)
1531 return -EINVAL;
1532
1533 ret = sscanf(sc->hdev->uniq,
1534 "%02hhx:%02hhx:%02hhx:%02hhx:%02hhx:%02hhx",
1535 &sc->mac_address[5], &sc->mac_address[4], &sc->mac_address[3],
1536 &sc->mac_address[2], &sc->mac_address[1], &sc->mac_address[0]);
1537
1538 if (ret != 6)
1539 return -EINVAL;
1540
1541 return 0;
1542}
1543
1544static int sony_check_add(struct sony_sc *sc)
1545{
1546 int n, ret;
1547
1548 if ((sc->quirks & DUALSHOCK4_CONTROLLER_BT) ||
1549 (sc->quirks & SIXAXIS_CONTROLLER_BT)) {
1550 /*
1551 * sony_get_bt_devaddr() attempts to parse the Bluetooth MAC
1552 * address from the uniq string where HIDP stores it.
1553 * As uniq cannot be guaranteed to be a MAC address in all cases
1554 * a failure of this function should not prevent the connection.
1555 */
1556 if (sony_get_bt_devaddr(sc) < 0) {
1557 hid_warn(sc->hdev, "UNIQ does not contain a MAC address; duplicate check skipped\n");
1558 return 0;
1559 }
1560 } else if (sc->quirks & DUALSHOCK4_CONTROLLER_USB) {
1561 __u8 buf[7];
1562
1563 /*
1564 * The MAC address of a DS4 controller connected via USB can be
1565 * retrieved with feature report 0x81. The address begins at
1566 * offset 1.
1567 */
1568 ret = hid_hw_raw_request(sc->hdev, 0x81, buf, sizeof(buf),
1569 HID_FEATURE_REPORT, HID_REQ_GET_REPORT);
1570
1571 if (ret != 7) {
1572 hid_err(sc->hdev, "failed to retrieve feature report 0x81 with the DualShock 4 MAC address\n");
1573 return ret < 0 ? ret : -EINVAL;
1574 }
1575
1576 memcpy(sc->mac_address, &buf[1], sizeof(sc->mac_address));
1577 } else if (sc->quirks & SIXAXIS_CONTROLLER_USB) {
1578 __u8 buf[18];
1579
1580 /*
1581 * The MAC address of a Sixaxis controller connected via USB can
1582 * be retrieved with feature report 0xf2. The address begins at
1583 * offset 4.
1584 */
1585 ret = hid_hw_raw_request(sc->hdev, 0xf2, buf, sizeof(buf),
1586 HID_FEATURE_REPORT, HID_REQ_GET_REPORT);
1587
1588 if (ret != 18) {
1589 hid_err(sc->hdev, "failed to retrieve feature report 0xf2 with the Sixaxis MAC address\n");
1590 return ret < 0 ? ret : -EINVAL;
1591 }
1592
1593 /*
1594 * The Sixaxis device MAC in the report is big-endian and must
1595 * be byte-swapped.
1596 */
1597 for (n = 0; n < 6; n++)
1598 sc->mac_address[5-n] = buf[4+n];
1599 } else {
1600 return 0;
1601 }
1602
1603 return sony_check_add_dev_list(sc);
1604}
1605
Frank Praznik46262042014-04-14 10:11:31 -04001606static inline void sony_init_work(struct sony_sc *sc,
1607 void (*worker)(struct work_struct *))
1608{
1609 if (!sc->worker_initialized)
1610 INIT_WORK(&sc->state_worker, worker);
1611
1612 sc->worker_initialized = 1;
1613}
1614
1615static inline void sony_cancel_work_sync(struct sony_sc *sc)
1616{
1617 if (sc->worker_initialized)
1618 cancel_work_sync(&sc->state_worker);
1619}
Frank Praznikd2d782f2014-02-20 11:36:03 -05001620
Jiri Slabybd28ce02008-06-25 23:47:04 +02001621static int sony_probe(struct hid_device *hdev, const struct hid_device_id *id)
1622{
1623 int ret;
Jiri Kosinacc6e0bb2008-10-23 12:58:38 +02001624 unsigned long quirks = id->driver_data;
1625 struct sony_sc *sc;
Colin Leitnerf04d5142013-05-27 23:41:05 +02001626 unsigned int connect_mask = HID_CONNECT_DEFAULT;
Jiri Kosinacc6e0bb2008-10-23 12:58:38 +02001627
Benjamin Tissoiresabf832b2013-07-24 19:38:04 +02001628 sc = devm_kzalloc(&hdev->dev, sizeof(*sc), GFP_KERNEL);
Jiri Kosinacc6e0bb2008-10-23 12:58:38 +02001629 if (sc == NULL) {
Joe Perches4291ee32010-12-09 19:29:03 -08001630 hid_err(hdev, "can't alloc sony descriptor\n");
Jiri Kosinacc6e0bb2008-10-23 12:58:38 +02001631 return -ENOMEM;
1632 }
1633
1634 sc->quirks = quirks;
1635 hid_set_drvdata(hdev, sc);
Sven Eckelmann0a286ef2013-11-19 20:26:32 +01001636 sc->hdev = hdev;
Jiri Slabybd28ce02008-06-25 23:47:04 +02001637
Jiri Slabybd28ce02008-06-25 23:47:04 +02001638 ret = hid_parse(hdev);
1639 if (ret) {
Joe Perches4291ee32010-12-09 19:29:03 -08001640 hid_err(hdev, "parse failed\n");
Benjamin Tissoiresabf832b2013-07-24 19:38:04 +02001641 return ret;
Jiri Slabybd28ce02008-06-25 23:47:04 +02001642 }
1643
Colin Leitnerf04d5142013-05-27 23:41:05 +02001644 if (sc->quirks & VAIO_RDESC_CONSTANT)
1645 connect_mask |= HID_CONNECT_HIDDEV_FORCE;
1646 else if (sc->quirks & SIXAXIS_CONTROLLER_USB)
1647 connect_mask |= HID_CONNECT_HIDDEV_FORCE;
1648 else if (sc->quirks & SIXAXIS_CONTROLLER_BT)
1649 connect_mask |= HID_CONNECT_HIDDEV_FORCE;
1650
1651 ret = hid_hw_start(hdev, connect_mask);
Jiri Slabybd28ce02008-06-25 23:47:04 +02001652 if (ret) {
Joe Perches4291ee32010-12-09 19:29:03 -08001653 hid_err(hdev, "hw start failed\n");
Benjamin Tissoiresabf832b2013-07-24 19:38:04 +02001654 return ret;
Jiri Slabybd28ce02008-06-25 23:47:04 +02001655 }
1656
Antonio Ospite569b10a2010-10-19 16:13:10 +02001657 if (sc->quirks & SIXAXIS_CONTROLLER_USB) {
Benjamin Tissoirese534a932014-03-08 22:52:42 -05001658 /*
1659 * The Sony Sixaxis does not handle HID Output Reports on the
1660 * Interrupt EP like it could, so we need to force HID Output
1661 * Reports to use HID_REQ_SET_REPORT on the Control EP.
1662 *
1663 * There is also another issue about HID Output Reports via USB,
1664 * the Sixaxis does not want the report_id as part of the data
1665 * packet, so we have to discard buf[0] when sending the actual
1666 * control message, even for numbered reports, humpf!
1667 */
1668 hdev->quirks |= HID_QUIRK_NO_OUTPUT_REPORTS_ON_INTR_EP;
1669 hdev->quirks |= HID_QUIRK_SKIP_OUTPUT_REPORT_ID;
Antonio Ospite816651a2010-05-03 22:15:55 +02001670 ret = sixaxis_set_operational_usb(hdev);
Frank Praznik46262042014-04-14 10:11:31 -04001671 sony_init_work(sc, sixaxis_state_worker);
Frank Praznikfee4e2d2014-02-18 17:22:01 -05001672 } else if (sc->quirks & SIXAXIS_CONTROLLER_BT) {
Frank Praznik2078b9bb2014-03-15 09:41:16 -04001673 /*
1674 * The Sixaxis wants output reports sent on the ctrl endpoint
1675 * when connected via Bluetooth.
1676 */
1677 hdev->quirks |= HID_QUIRK_NO_OUTPUT_REPORTS_ON_INTR_EP;
Antonio Ospite816651a2010-05-03 22:15:55 +02001678 ret = sixaxis_set_operational_bt(hdev);
Frank Praznik46262042014-04-14 10:11:31 -04001679 sony_init_work(sc, sixaxis_state_worker);
Frank Praznikfee4e2d2014-02-18 17:22:01 -05001680 } else if (sc->quirks & DUALSHOCK4_CONTROLLER) {
Frank Praznik68330d82014-02-05 20:03:49 -05001681 if (sc->quirks & DUALSHOCK4_CONTROLLER_BT) {
Frank Praznik2078b9bb2014-03-15 09:41:16 -04001682 /*
1683 * The DualShock 4 wants output reports sent on the ctrl
1684 * endpoint when connected via Bluetooth.
1685 */
1686 hdev->quirks |= HID_QUIRK_NO_OUTPUT_REPORTS_ON_INTR_EP;
Frank Praznik68330d82014-02-05 20:03:49 -05001687 ret = dualshock4_set_operational_bt(hdev);
1688 if (ret < 0) {
1689 hid_err(hdev, "failed to set the Dualshock 4 operational mode\n");
1690 goto err_stop;
1691 }
1692 }
Frank Praznikad142b92014-02-20 11:36:00 -05001693 /*
1694 * The Dualshock 4 touchpad supports 2 touches and has a
Frank Praznike5606232014-01-27 10:17:37 -05001695 * resolution of 1920x940.
1696 */
1697 ret = sony_register_touchpad(sc, 2, 1920, 940);
Frank Praznikc4e1ddf2014-01-17 14:46:26 -05001698 if (ret < 0)
1699 goto err_stop;
1700
Frank Praznik46262042014-04-14 10:11:31 -04001701 sony_init_work(sc, dualshock4_state_worker);
Frank Praznik0bd88dd2014-01-11 15:12:42 -05001702 } else {
1703 ret = 0;
1704 }
Bastien Noceraf9ce7c22010-01-20 12:01:53 +00001705
Jiri Kosina4dfdc462008-12-30 00:49:59 +01001706 if (ret < 0)
Jiri Slabybd28ce02008-06-25 23:47:04 +02001707 goto err_stop;
1708
Frank Praznikd2d782f2014-02-20 11:36:03 -05001709 ret = sony_check_add(sc);
1710 if (ret < 0)
1711 goto err_stop;
1712
Sven Eckelmann0a286ef2013-11-19 20:26:32 +01001713 if (sc->quirks & SONY_LED_SUPPORT) {
Frank Praznikfa57a812014-04-14 10:11:33 -04001714 ret = sony_leds_init(sc);
Sven Eckelmann0a286ef2013-11-19 20:26:32 +01001715 if (ret < 0)
1716 goto err_stop;
1717 }
1718
Frank Praznikd902f472014-01-27 10:17:36 -05001719 if (sc->quirks & SONY_BATTERY_SUPPORT) {
1720 ret = sony_battery_probe(sc);
1721 if (ret < 0)
1722 goto err_stop;
1723
1724 /* Open the device to receive reports with battery info */
1725 ret = hid_hw_open(hdev);
1726 if (ret < 0) {
1727 hid_err(hdev, "hw open failed\n");
1728 goto err_stop;
1729 }
1730 }
1731
Frank Praznikc8de9db2014-02-20 11:36:01 -05001732 if (sc->quirks & SONY_FF_SUPPORT) {
Frank Praznikfa57a812014-04-14 10:11:33 -04001733 ret = sony_init_ff(sc);
Frank Praznikc8de9db2014-02-20 11:36:01 -05001734 if (ret < 0)
1735 goto err_close;
Frank Praznik5f5750d2014-02-19 13:09:22 -05001736 }
Sven Eckelmanna08c22c2013-11-09 19:25:57 +01001737
Jiri Slabybd28ce02008-06-25 23:47:04 +02001738 return 0;
Frank Praznikd902f472014-01-27 10:17:36 -05001739err_close:
1740 hid_hw_close(hdev);
Jiri Slabybd28ce02008-06-25 23:47:04 +02001741err_stop:
Sven Eckelmann0a286ef2013-11-19 20:26:32 +01001742 if (sc->quirks & SONY_LED_SUPPORT)
Frank Praznikfa57a812014-04-14 10:11:33 -04001743 sony_leds_remove(sc);
Frank Praznikd902f472014-01-27 10:17:36 -05001744 if (sc->quirks & SONY_BATTERY_SUPPORT)
1745 sony_battery_remove(sc);
Frank Praznik46262042014-04-14 10:11:31 -04001746 sony_cancel_work_sync(sc);
Frank Praznikd2d782f2014-02-20 11:36:03 -05001747 sony_remove_dev_list(sc);
Jiri Slabybd28ce02008-06-25 23:47:04 +02001748 hid_hw_stop(hdev);
Jiri Slabybd28ce02008-06-25 23:47:04 +02001749 return ret;
1750}
1751
Jiri Kosinacc6e0bb2008-10-23 12:58:38 +02001752static void sony_remove(struct hid_device *hdev)
1753{
Colin Leitnerf04d5142013-05-27 23:41:05 +02001754 struct sony_sc *sc = hid_get_drvdata(hdev);
1755
Sven Eckelmann0a286ef2013-11-19 20:26:32 +01001756 if (sc->quirks & SONY_LED_SUPPORT)
Frank Praznikfa57a812014-04-14 10:11:33 -04001757 sony_leds_remove(sc);
Colin Leitnerf04d5142013-05-27 23:41:05 +02001758
Frank Praznikd902f472014-01-27 10:17:36 -05001759 if (sc->quirks & SONY_BATTERY_SUPPORT) {
1760 hid_hw_close(hdev);
1761 sony_battery_remove(sc);
1762 }
1763
Frank Praznik46262042014-04-14 10:11:31 -04001764 sony_cancel_work_sync(sc);
Sven Eckelmann9f323b62013-11-17 20:38:21 +01001765
Frank Praznikd2d782f2014-02-20 11:36:03 -05001766 sony_remove_dev_list(sc);
Jiri Slabybd28ce02008-06-25 23:47:04 +02001767
Colin Leitnerf04d5142013-05-27 23:41:05 +02001768 hid_hw_stop(hdev);
1769}
1770
1771static const struct hid_device_id sony_devices[] = {
1772 { HID_USB_DEVICE(USB_VENDOR_ID_SONY, USB_DEVICE_ID_SONY_PS3_CONTROLLER),
1773 .driver_data = SIXAXIS_CONTROLLER_USB },
1774 { HID_USB_DEVICE(USB_VENDOR_ID_SONY, USB_DEVICE_ID_SONY_NAVIGATION_CONTROLLER),
Jiri Slabybd28ce02008-06-25 23:47:04 +02001775 .driver_data = SIXAXIS_CONTROLLER_USB },
H Hartley Sweetenf4254582012-12-17 15:28:26 -07001776 { HID_BLUETOOTH_DEVICE(USB_VENDOR_ID_SONY, USB_DEVICE_ID_SONY_PS3_CONTROLLER),
Jiri Slabybd28ce02008-06-25 23:47:04 +02001777 .driver_data = SIXAXIS_CONTROLLER_BT },
Jiri Slabybd28ce02008-06-25 23:47:04 +02001778 { HID_USB_DEVICE(USB_VENDOR_ID_SONY, USB_DEVICE_ID_SONY_VAIO_VGX_MOUSE),
Jiri Slabybd28ce02008-06-25 23:47:04 +02001779 .driver_data = VAIO_RDESC_CONSTANT },
1780 { HID_USB_DEVICE(USB_VENDOR_ID_SONY, USB_DEVICE_ID_SONY_VAIO_VGP_MOUSE),
1781 .driver_data = VAIO_RDESC_CONSTANT },
1782 /* Wired Buzz Controller. Reported as Sony Hub from its USB ID and as
1783 * Logitech joystick from the device descriptor. */
1784 { HID_USB_DEVICE(USB_VENDOR_ID_SONY, USB_DEVICE_ID_SONY_BUZZ_CONTROLLER),
1785 .driver_data = BUZZ_CONTROLLER },
1786 { HID_USB_DEVICE(USB_VENDOR_ID_SONY, USB_DEVICE_ID_SONY_WIRELESS_BUZZ_CONTROLLER),
1787 .driver_data = BUZZ_CONTROLLER },
1788 /* PS3 BD Remote Control */
1789 { HID_BLUETOOTH_DEVICE(USB_VENDOR_ID_SONY, USB_DEVICE_ID_SONY_PS3_BDREMOTE),
1790 .driver_data = PS3REMOTE },
1791 /* Logitech Harmony Adapter for PS3 */
1792 { HID_BLUETOOTH_DEVICE(USB_VENDOR_ID_LOGITECH, USB_DEVICE_ID_LOGITECH_HARMONY_PS3),
1793 .driver_data = PS3REMOTE },
Frank Praznik0bd88dd2014-01-11 15:12:42 -05001794 /* Sony Dualshock 4 controllers for PS4 */
1795 { HID_USB_DEVICE(USB_VENDOR_ID_SONY, USB_DEVICE_ID_SONY_PS4_CONTROLLER),
Frank Praznik8ab16762014-01-16 21:42:31 -05001796 .driver_data = DUALSHOCK4_CONTROLLER_USB },
Frank Praznik0bd88dd2014-01-11 15:12:42 -05001797 { HID_BLUETOOTH_DEVICE(USB_VENDOR_ID_SONY, USB_DEVICE_ID_SONY_PS4_CONTROLLER),
Frank Praznik8ab16762014-01-16 21:42:31 -05001798 .driver_data = DUALSHOCK4_CONTROLLER_BT },
Jiri Slabybd28ce02008-06-25 23:47:04 +02001799 { }
1800};
1801MODULE_DEVICE_TABLE(hid, sony_devices);
1802
1803static struct hid_driver sony_driver = {
1804 .name = "sony",
1805 .id_table = sony_devices,
1806 .input_mapping = sony_mapping,
1807 .probe = sony_probe,
1808 .remove = sony_remove,
1809 .report_fixup = sony_report_fixup,
1810 .raw_event = sony_raw_event
1811};
1812module_hid_driver(sony_driver);
1813
1814MODULE_LICENSE("GPL");