blob: ed2f008f840377c394f1a910c331ea5f472a231e [file] [log] [blame]
Jiri Slabybd28ce02008-06-25 23:47:04 +02001/*
Frank Praznik077147a2014-09-14 11:56:39 -04002 * HID driver for Sony / PS2 / PS3 / PS4 BD devices.
Jiri Slabybd28ce02008-06-25 23:47:04 +02003 *
4 * Copyright (c) 1999 Andreas Gal
5 * Copyright (c) 2000-2005 Vojtech Pavlik <vojtech@suse.cz>
6 * Copyright (c) 2005 Michael Haboustak <mike-@cinci.rr.com> for Concept2, Inc
Jiri Slabybd28ce02008-06-25 23:47:04 +02007 * Copyright (c) 2008 Jiri Slaby
Jiri Kosina078328d2013-06-13 12:03:49 +02008 * Copyright (c) 2012 David Dillow <dave@thedillows.org>
9 * Copyright (c) 2006-2013 Jiri Kosina
Colin Leitnerf04d5142013-05-27 23:41:05 +020010 * Copyright (c) 2013 Colin Leitner <colin.leitner@gmail.com>
Frank Praznik077147a2014-09-14 11:56:39 -040011 * Copyright (c) 2014 Frank Praznik <frank.praznik@gmail.com>
Jiri Slabybd28ce02008-06-25 23:47:04 +020012 */
13
14/*
15 * This program is free software; you can redistribute it and/or modify it
16 * under the terms of the GNU General Public License as published by the Free
17 * Software Foundation; either version 2 of the License, or (at your option)
18 * any later version.
19 */
20
Frank Praznikad142b92014-02-20 11:36:00 -050021/*
22 * NOTE: in order for the Sony PS3 BD Remote Control to be found by
Jiri Kosina078328d2013-06-13 12:03:49 +020023 * a Bluetooth host, the key combination Start+Enter has to be kept pressed
24 * for about 7 seconds with the Bluetooth Host Controller in discovering mode.
25 *
26 * There will be no PIN request from the device.
27 */
28
Jiri Slabybd28ce02008-06-25 23:47:04 +020029#include <linux/device.h>
30#include <linux/hid.h>
31#include <linux/module.h>
Tejun Heo5a0e3ad2010-03-24 17:04:11 +090032#include <linux/slab.h>
Jiri Kosina40e32ee2013-05-28 11:22:09 +020033#include <linux/leds.h>
Frank Praznikd902f472014-01-27 10:17:36 -050034#include <linux/power_supply.h>
35#include <linux/spinlock.h>
Frank Praznikd2d782f2014-02-20 11:36:03 -050036#include <linux/list.h>
Frank Praznik80250872014-04-14 10:11:35 -040037#include <linux/idr.h>
Frank Praznike5606232014-01-27 10:17:37 -050038#include <linux/input/mt.h>
Jiri Slabybd28ce02008-06-25 23:47:04 +020039
40#include "hid-ids.h"
41
Frank Praznik6c79c182014-01-16 21:43:03 -050042#define VAIO_RDESC_CONSTANT BIT(0)
43#define SIXAXIS_CONTROLLER_USB BIT(1)
44#define SIXAXIS_CONTROLLER_BT BIT(2)
45#define BUZZ_CONTROLLER BIT(3)
46#define PS3REMOTE BIT(4)
Frank Praznik8ab16762014-01-16 21:42:31 -050047#define DUALSHOCK4_CONTROLLER_USB BIT(5)
48#define DUALSHOCK4_CONTROLLER_BT BIT(6)
Simon Woodb3bca322015-06-09 21:27:04 -060049#define MOTION_CONTROLLER_USB BIT(7)
50#define MOTION_CONTROLLER_BT BIT(8)
Simon Wood4545ee02015-06-17 00:08:52 -060051#define NAVIGATION_CONTROLLER_USB BIT(9)
52#define NAVIGATION_CONTROLLER_BT BIT(10)
Jiri Kosinacc6e0bb2008-10-23 12:58:38 +020053
Frank Praznikfee4e2d2014-02-18 17:22:01 -050054#define SIXAXIS_CONTROLLER (SIXAXIS_CONTROLLER_USB | SIXAXIS_CONTROLLER_BT)
Simon Woodb3bca322015-06-09 21:27:04 -060055#define MOTION_CONTROLLER (MOTION_CONTROLLER_USB | MOTION_CONTROLLER_BT)
Simon Wood4545ee02015-06-17 00:08:52 -060056#define NAVIGATION_CONTROLLER (NAVIGATION_CONTROLLER_USB |\
57 NAVIGATION_CONTROLLER_BT)
Frank Praznik68330d82014-02-05 20:03:49 -050058#define DUALSHOCK4_CONTROLLER (DUALSHOCK4_CONTROLLER_USB |\
59 DUALSHOCK4_CONTROLLER_BT)
Frank Praznikfee4e2d2014-02-18 17:22:01 -050060#define SONY_LED_SUPPORT (SIXAXIS_CONTROLLER | BUZZ_CONTROLLER |\
Simon Wood4545ee02015-06-17 00:08:52 -060061 DUALSHOCK4_CONTROLLER | MOTION_CONTROLLER |\
62 NAVIGATION_CONTROLLER)
Simon Wood12e9a6d72015-06-09 21:27:05 -060063#define SONY_BATTERY_SUPPORT (SIXAXIS_CONTROLLER | DUALSHOCK4_CONTROLLER |\
Simon Wood4545ee02015-06-17 00:08:52 -060064 MOTION_CONTROLLER_BT | NAVIGATION_CONTROLLER)
Frank Praznikc5e0c1c2015-05-05 20:47:30 -040065#define SONY_FF_SUPPORT (SIXAXIS_CONTROLLER | DUALSHOCK4_CONTROLLER |\
66 MOTION_CONTROLLER)
Frank Praznik60781cf2014-01-11 15:13:15 -050067
68#define MAX_LEDS 4
Sven Eckelmann0a286ef2013-11-19 20:26:32 +010069
Frank Praznik4c3e8292015-05-05 20:47:33 -040070/*
71 * The Sixaxis reports both digital and analog values for each button on the
72 * controller except for Start, Select and the PS button. The controller ends
73 * up reporting 27 axes which causes them to spill over into the multi-touch
74 * axis values. Additionally, the controller only has 20 actual, physical axes
75 * so there are several unused axes in between the used ones.
76 */
Antonio Ospitec607fb82014-06-24 13:28:41 +020077static __u8 sixaxis_rdesc[] = {
Antonio Ospitefb705a62014-06-24 13:28:42 +020078 0x05, 0x01, /* Usage Page (Desktop), */
Frank Praznik4c3e8292015-05-05 20:47:33 -040079 0x09, 0x04, /* Usage (Joystick), */
Antonio Ospitefb705a62014-06-24 13:28:42 +020080 0xA1, 0x01, /* Collection (Application), */
81 0xA1, 0x02, /* Collection (Logical), */
82 0x85, 0x01, /* Report ID (1), */
83 0x75, 0x08, /* Report Size (8), */
84 0x95, 0x01, /* Report Count (1), */
85 0x15, 0x00, /* Logical Minimum (0), */
86 0x26, 0xFF, 0x00, /* Logical Maximum (255), */
87 0x81, 0x03, /* Input (Constant, Variable), */
88 0x75, 0x01, /* Report Size (1), */
89 0x95, 0x13, /* Report Count (19), */
90 0x15, 0x00, /* Logical Minimum (0), */
91 0x25, 0x01, /* Logical Maximum (1), */
92 0x35, 0x00, /* Physical Minimum (0), */
93 0x45, 0x01, /* Physical Maximum (1), */
94 0x05, 0x09, /* Usage Page (Button), */
95 0x19, 0x01, /* Usage Minimum (01h), */
96 0x29, 0x13, /* Usage Maximum (13h), */
97 0x81, 0x02, /* Input (Variable), */
98 0x75, 0x01, /* Report Size (1), */
99 0x95, 0x0D, /* Report Count (13), */
100 0x06, 0x00, 0xFF, /* Usage Page (FF00h), */
101 0x81, 0x03, /* Input (Constant, Variable), */
102 0x15, 0x00, /* Logical Minimum (0), */
103 0x26, 0xFF, 0x00, /* Logical Maximum (255), */
104 0x05, 0x01, /* Usage Page (Desktop), */
105 0x09, 0x01, /* Usage (Pointer), */
106 0xA1, 0x00, /* Collection (Physical), */
107 0x75, 0x08, /* Report Size (8), */
108 0x95, 0x04, /* Report Count (4), */
109 0x35, 0x00, /* Physical Minimum (0), */
110 0x46, 0xFF, 0x00, /* Physical Maximum (255), */
111 0x09, 0x30, /* Usage (X), */
112 0x09, 0x31, /* Usage (Y), */
113 0x09, 0x32, /* Usage (Z), */
114 0x09, 0x35, /* Usage (Rz), */
115 0x81, 0x02, /* Input (Variable), */
116 0xC0, /* End Collection, */
117 0x05, 0x01, /* Usage Page (Desktop), */
118 0x95, 0x13, /* Report Count (19), */
119 0x09, 0x01, /* Usage (Pointer), */
120 0x81, 0x02, /* Input (Variable), */
121 0x95, 0x0C, /* Report Count (12), */
122 0x81, 0x01, /* Input (Constant), */
123 0x75, 0x10, /* Report Size (16), */
124 0x95, 0x04, /* Report Count (4), */
125 0x26, 0xFF, 0x03, /* Logical Maximum (1023), */
126 0x46, 0xFF, 0x03, /* Physical Maximum (1023), */
127 0x09, 0x01, /* Usage (Pointer), */
128 0x81, 0x02, /* Input (Variable), */
129 0xC0, /* End Collection, */
130 0xA1, 0x02, /* Collection (Logical), */
131 0x85, 0x02, /* Report ID (2), */
132 0x75, 0x08, /* Report Size (8), */
133 0x95, 0x30, /* Report Count (48), */
134 0x09, 0x01, /* Usage (Pointer), */
135 0xB1, 0x02, /* Feature (Variable), */
136 0xC0, /* End Collection, */
137 0xA1, 0x02, /* Collection (Logical), */
138 0x85, 0xEE, /* Report ID (238), */
139 0x75, 0x08, /* Report Size (8), */
140 0x95, 0x30, /* Report Count (48), */
141 0x09, 0x01, /* Usage (Pointer), */
142 0xB1, 0x02, /* Feature (Variable), */
143 0xC0, /* End Collection, */
144 0xA1, 0x02, /* Collection (Logical), */
145 0x85, 0xEF, /* Report ID (239), */
146 0x75, 0x08, /* Report Size (8), */
147 0x95, 0x30, /* Report Count (48), */
148 0x09, 0x01, /* Usage (Pointer), */
149 0xB1, 0x02, /* Feature (Variable), */
150 0xC0, /* End Collection, */
151 0xC0 /* End Collection */
Mauro Carvalho Chehabe57a67d2012-12-14 20:57:34 -0200152};
153
Frank Praznikc5e0c1c2015-05-05 20:47:30 -0400154/* PS/3 Motion controller */
155static __u8 motion_rdesc[] = {
156 0x05, 0x01, /* Usage Page (Desktop), */
157 0x09, 0x04, /* Usage (Joystick), */
158 0xA1, 0x01, /* Collection (Application), */
159 0xA1, 0x02, /* Collection (Logical), */
160 0x85, 0x01, /* Report ID (1), */
Frank Praznikc5e0c1c2015-05-05 20:47:30 -0400161 0x75, 0x01, /* Report Size (1), */
Simon Wood8b2513c2015-06-09 21:27:07 -0600162 0x95, 0x15, /* Report Count (21), */
Frank Praznikc5e0c1c2015-05-05 20:47:30 -0400163 0x15, 0x00, /* Logical Minimum (0), */
164 0x25, 0x01, /* Logical Maximum (1), */
165 0x35, 0x00, /* Physical Minimum (0), */
166 0x45, 0x01, /* Physical Maximum (1), */
167 0x05, 0x09, /* Usage Page (Button), */
168 0x19, 0x01, /* Usage Minimum (01h), */
Simon Wood8b2513c2015-06-09 21:27:07 -0600169 0x29, 0x15, /* Usage Maximum (15h), */
170 0x81, 0x02, /* Input (Variable), * Buttons */
171 0x95, 0x0B, /* Report Count (11), */
Frank Praznikc5e0c1c2015-05-05 20:47:30 -0400172 0x06, 0x00, 0xFF, /* Usage Page (FF00h), */
Simon Wood8b2513c2015-06-09 21:27:07 -0600173 0x81, 0x03, /* Input (Constant, Variable), * Padding */
Frank Praznikc5e0c1c2015-05-05 20:47:30 -0400174 0x15, 0x00, /* Logical Minimum (0), */
175 0x26, 0xFF, 0x00, /* Logical Maximum (255), */
176 0x05, 0x01, /* Usage Page (Desktop), */
Frank Praznikc5e0c1c2015-05-05 20:47:30 -0400177 0xA1, 0x00, /* Collection (Physical), */
178 0x75, 0x08, /* Report Size (8), */
Simon Wood8b2513c2015-06-09 21:27:07 -0600179 0x95, 0x01, /* Report Count (1), */
Frank Praznikc5e0c1c2015-05-05 20:47:30 -0400180 0x35, 0x00, /* Physical Minimum (0), */
181 0x46, 0xFF, 0x00, /* Physical Maximum (255), */
182 0x09, 0x30, /* Usage (X), */
Simon Wood8b2513c2015-06-09 21:27:07 -0600183 0x81, 0x02, /* Input (Variable), * Trigger */
Frank Praznikc5e0c1c2015-05-05 20:47:30 -0400184 0xC0, /* End Collection, */
Simon Wood8b2513c2015-06-09 21:27:07 -0600185 0x06, 0x00, 0xFF, /* Usage Page (FF00h), */
186 0x75, 0x08, /* Report Size (8), */
187 0x95, 0x07, /* Report Count (7), * skip 7 bytes */
188 0x81, 0x02, /* Input (Variable), */
Frank Praznikc5e0c1c2015-05-05 20:47:30 -0400189 0x05, 0x01, /* Usage Page (Desktop), */
Frank Praznikc5e0c1c2015-05-05 20:47:30 -0400190 0x75, 0x10, /* Report Size (16), */
Simon Wood8b2513c2015-06-09 21:27:07 -0600191 0x46, 0xFF, 0xFF, /* Physical Maximum (65535), */
192 0x27, 0xFF, 0xFF, 0x00, 0x00, /* Logical Maximum (65535), */
193 0x95, 0x03, /* Report Count (3), * 3x Accels */
194 0x09, 0x33, /* Usage (rX), */
195 0x09, 0x34, /* Usage (rY), */
196 0x09, 0x35, /* Usage (rZ), */
Frank Praznikc5e0c1c2015-05-05 20:47:30 -0400197 0x81, 0x02, /* Input (Variable), */
Simon Wood8b2513c2015-06-09 21:27:07 -0600198 0x06, 0x00, 0xFF, /* Usage Page (FF00h), */
199 0x95, 0x03, /* Report Count (3), * Skip Accels 2nd frame */
200 0x81, 0x02, /* Input (Variable), */
201 0x05, 0x01, /* Usage Page (Desktop), */
202 0x09, 0x01, /* Usage (Pointer), */
203 0x95, 0x03, /* Report Count (3), * 3x Gyros */
204 0x81, 0x02, /* Input (Variable), */
205 0x06, 0x00, 0xFF, /* Usage Page (FF00h), */
206 0x95, 0x03, /* Report Count (3), * Skip Gyros 2nd frame */
207 0x81, 0x02, /* Input (Variable), */
208 0x75, 0x0C, /* Report Size (12), */
209 0x46, 0xFF, 0x0F, /* Physical Maximum (4095), */
210 0x26, 0xFF, 0x0F, /* Logical Maximum (4095), */
211 0x95, 0x04, /* Report Count (4), * Skip Temp and Magnetometers */
212 0x81, 0x02, /* Input (Variable), */
213 0x75, 0x08, /* Report Size (8), */
214 0x46, 0xFF, 0x00, /* Physical Maximum (255), */
215 0x26, 0xFF, 0x00, /* Logical Maximum (255), */
216 0x95, 0x06, /* Report Count (6), * Skip Timestamp and Extension Bytes */
217 0x81, 0x02, /* Input (Variable), */
218 0x75, 0x08, /* Report Size (8), */
219 0x95, 0x30, /* Report Count (48), */
220 0x09, 0x01, /* Usage (Pointer), */
221 0x91, 0x02, /* Output (Variable), */
222 0x75, 0x08, /* Report Size (8), */
223 0x95, 0x30, /* Report Count (48), */
224 0x09, 0x01, /* Usage (Pointer), */
225 0xB1, 0x02, /* Feature (Variable), */
Frank Praznikc5e0c1c2015-05-05 20:47:30 -0400226 0xC0, /* End Collection, */
227 0xA1, 0x02, /* Collection (Logical), */
228 0x85, 0x02, /* Report ID (2), */
229 0x75, 0x08, /* Report Size (8), */
230 0x95, 0x30, /* Report Count (48), */
231 0x09, 0x01, /* Usage (Pointer), */
232 0xB1, 0x02, /* Feature (Variable), */
233 0xC0, /* End Collection, */
234 0xA1, 0x02, /* Collection (Logical), */
235 0x85, 0xEE, /* Report ID (238), */
236 0x75, 0x08, /* Report Size (8), */
237 0x95, 0x30, /* Report Count (48), */
238 0x09, 0x01, /* Usage (Pointer), */
239 0xB1, 0x02, /* Feature (Variable), */
240 0xC0, /* End Collection, */
241 0xA1, 0x02, /* Collection (Logical), */
242 0x85, 0xEF, /* Report ID (239), */
243 0x75, 0x08, /* Report Size (8), */
244 0x95, 0x30, /* Report Count (48), */
245 0x09, 0x01, /* Usage (Pointer), */
246 0xB1, 0x02, /* Feature (Variable), */
247 0xC0, /* End Collection, */
248 0xC0 /* End Collection */
249};
250
Simon Woodb2723eb2015-06-17 00:08:53 -0600251/* PS/3 Navigation controller */
252static __u8 navigation_rdesc[] = {
253 0x05, 0x01, /* Usage Page (Desktop), */
254 0x09, 0x04, /* Usage (Joystik), */
255 0xA1, 0x01, /* Collection (Application), */
256 0xA1, 0x02, /* Collection (Logical), */
257 0x85, 0x01, /* Report ID (1), */
258 0x75, 0x08, /* Report Size (8), */
259 0x95, 0x01, /* Report Count (1), */
260 0x15, 0x00, /* Logical Minimum (0), */
261 0x26, 0xFF, 0x00, /* Logical Maximum (255), */
262 0x81, 0x03, /* Input (Constant, Variable), */
263 0x75, 0x01, /* Report Size (1), */
264 0x95, 0x13, /* Report Count (19), */
265 0x15, 0x00, /* Logical Minimum (0), */
266 0x25, 0x01, /* Logical Maximum (1), */
267 0x35, 0x00, /* Physical Minimum (0), */
268 0x45, 0x01, /* Physical Maximum (1), */
269 0x05, 0x09, /* Usage Page (Button), */
270 0x19, 0x01, /* Usage Minimum (01h), */
271 0x29, 0x13, /* Usage Maximum (13h), */
272 0x81, 0x02, /* Input (Variable), */
273 0x75, 0x01, /* Report Size (1), */
274 0x95, 0x0D, /* Report Count (13), */
275 0x06, 0x00, 0xFF, /* Usage Page (FF00h), */
276 0x81, 0x03, /* Input (Constant, Variable), */
277 0x15, 0x00, /* Logical Minimum (0), */
278 0x26, 0xFF, 0x00, /* Logical Maximum (255), */
279 0x05, 0x01, /* Usage Page (Desktop), */
280 0x09, 0x01, /* Usage (Pointer), */
281 0xA1, 0x00, /* Collection (Physical), */
282 0x75, 0x08, /* Report Size (8), */
283 0x95, 0x02, /* Report Count (2), */
284 0x35, 0x00, /* Physical Minimum (0), */
285 0x46, 0xFF, 0x00, /* Physical Maximum (255), */
286 0x09, 0x30, /* Usage (X), */
287 0x09, 0x31, /* Usage (Y), */
288 0x81, 0x02, /* Input (Variable), */
289 0xC0, /* End Collection, */
290 0x06, 0x00, 0xFF, /* Usage Page (FF00h), */
291 0x95, 0x06, /* Report Count (6), */
292 0x81, 0x03, /* Input (Constant, Variable), */
293 0x05, 0x01, /* Usage Page (Desktop), */
294 0x75, 0x08, /* Report Size (8), */
295 0x95, 0x05, /* Report Count (5), */
296 0x09, 0x01, /* Usage (Pointer), */
297 0x81, 0x02, /* Input (Variable), */
298 0x06, 0x00, 0xFF, /* Usage Page (FF00h), */
299 0x95, 0x20, /* Report Count (26), */
300 0x81, 0x02, /* Input (Variable), */
301 0x75, 0x08, /* Report Size (8), */
302 0x95, 0x30, /* Report Count (48), */
303 0x09, 0x01, /* Usage (Pointer), */
304 0x91, 0x02, /* Output (Variable), */
305 0x75, 0x08, /* Report Size (8), */
306 0x95, 0x30, /* Report Count (48), */
307 0x09, 0x01, /* Usage (Pointer), */
308 0xB1, 0x02, /* Feature (Variable), */
309 0xC0, /* End Collection, */
310 0xA1, 0x02, /* Collection (Logical), */
311 0x85, 0x02, /* Report ID (2), */
312 0x75, 0x08, /* Report Size (8), */
313 0x95, 0x30, /* Report Count (48), */
314 0x09, 0x01, /* Usage (Pointer), */
315 0xB1, 0x02, /* Feature (Variable), */
316 0xC0, /* End Collection, */
317 0xA1, 0x02, /* Collection (Logical), */
318 0x85, 0xEE, /* Report ID (238), */
319 0x75, 0x08, /* Report Size (8), */
320 0x95, 0x30, /* Report Count (48), */
321 0x09, 0x01, /* Usage (Pointer), */
322 0xB1, 0x02, /* Feature (Variable), */
323 0xC0, /* End Collection, */
324 0xA1, 0x02, /* Collection (Logical), */
325 0x85, 0xEF, /* Report ID (239), */
326 0x75, 0x08, /* Report Size (8), */
327 0x95, 0x30, /* Report Count (48), */
328 0x09, 0x01, /* Usage (Pointer), */
329 0xB1, 0x02, /* Feature (Variable), */
330 0xC0, /* End Collection, */
331 0xC0 /* End Collection */
332};
Frank Praznikc5e0c1c2015-05-05 20:47:30 -0400333
Frank Praznikad142b92014-02-20 11:36:00 -0500334/*
335 * The default descriptor doesn't provide mapping for the accelerometers
Frank Praznik58d70272014-01-20 12:27:01 -0500336 * or orientation sensors. This fixed descriptor maps the accelerometers
337 * to usage values 0x40, 0x41 and 0x42 and maps the orientation sensors
338 * to usage values 0x43, 0x44 and 0x45.
339 */
Frank Prazniked19d8c2014-01-16 21:43:12 -0500340static u8 dualshock4_usb_rdesc[] = {
Frank Praznik58d70272014-01-20 12:27:01 -0500341 0x05, 0x01, /* Usage Page (Desktop), */
342 0x09, 0x05, /* Usage (Gamepad), */
343 0xA1, 0x01, /* Collection (Application), */
344 0x85, 0x01, /* Report ID (1), */
345 0x09, 0x30, /* Usage (X), */
346 0x09, 0x31, /* Usage (Y), */
347 0x09, 0x32, /* Usage (Z), */
348 0x09, 0x35, /* Usage (Rz), */
349 0x15, 0x00, /* Logical Minimum (0), */
350 0x26, 0xFF, 0x00, /* Logical Maximum (255), */
351 0x75, 0x08, /* Report Size (8), */
352 0x95, 0x04, /* Report Count (4), */
353 0x81, 0x02, /* Input (Variable), */
354 0x09, 0x39, /* Usage (Hat Switch), */
355 0x15, 0x00, /* Logical Minimum (0), */
356 0x25, 0x07, /* Logical Maximum (7), */
357 0x35, 0x00, /* Physical Minimum (0), */
358 0x46, 0x3B, 0x01, /* Physical Maximum (315), */
359 0x65, 0x14, /* Unit (Degrees), */
360 0x75, 0x04, /* Report Size (4), */
361 0x95, 0x01, /* Report Count (1), */
362 0x81, 0x42, /* Input (Variable, Null State), */
363 0x65, 0x00, /* Unit, */
364 0x05, 0x09, /* Usage Page (Button), */
365 0x19, 0x01, /* Usage Minimum (01h), */
366 0x29, 0x0E, /* Usage Maximum (0Eh), */
367 0x15, 0x00, /* Logical Minimum (0), */
368 0x25, 0x01, /* Logical Maximum (1), */
369 0x75, 0x01, /* Report Size (1), */
370 0x95, 0x0E, /* Report Count (14), */
371 0x81, 0x02, /* Input (Variable), */
372 0x06, 0x00, 0xFF, /* Usage Page (FF00h), */
373 0x09, 0x20, /* Usage (20h), */
374 0x75, 0x06, /* Report Size (6), */
375 0x95, 0x01, /* Report Count (1), */
376 0x15, 0x00, /* Logical Minimum (0), */
Frank Praznikfb291cb2014-09-14 11:56:38 -0400377 0x25, 0x3F, /* Logical Maximum (63), */
Frank Praznik58d70272014-01-20 12:27:01 -0500378 0x81, 0x02, /* Input (Variable), */
379 0x05, 0x01, /* Usage Page (Desktop), */
380 0x09, 0x33, /* Usage (Rx), */
381 0x09, 0x34, /* Usage (Ry), */
382 0x15, 0x00, /* Logical Minimum (0), */
383 0x26, 0xFF, 0x00, /* Logical Maximum (255), */
384 0x75, 0x08, /* Report Size (8), */
385 0x95, 0x02, /* Report Count (2), */
386 0x81, 0x02, /* Input (Variable), */
387 0x06, 0x00, 0xFF, /* Usage Page (FF00h), */
388 0x09, 0x21, /* Usage (21h), */
389 0x95, 0x03, /* Report Count (3), */
390 0x81, 0x02, /* Input (Variable), */
391 0x05, 0x01, /* Usage Page (Desktop), */
392 0x19, 0x40, /* Usage Minimum (40h), */
393 0x29, 0x42, /* Usage Maximum (42h), */
394 0x16, 0x00, 0x80, /* Logical Minimum (-32768), */
395 0x26, 0x00, 0x7F, /* Logical Maximum (32767), */
396 0x75, 0x10, /* Report Size (16), */
397 0x95, 0x03, /* Report Count (3), */
398 0x81, 0x02, /* Input (Variable), */
399 0x19, 0x43, /* Usage Minimum (43h), */
400 0x29, 0x45, /* Usage Maximum (45h), */
Frank Praznikfb291cb2014-09-14 11:56:38 -0400401 0x16, 0x00, 0xE0, /* Logical Minimum (-8192), */
402 0x26, 0xFF, 0x1F, /* Logical Maximum (8191), */
Frank Praznik58d70272014-01-20 12:27:01 -0500403 0x95, 0x03, /* Report Count (3), */
404 0x81, 0x02, /* Input (Variable), */
405 0x06, 0x00, 0xFF, /* Usage Page (FF00h), */
406 0x09, 0x21, /* Usage (21h), */
407 0x15, 0x00, /* Logical Minimum (0), */
Frank Praznikfb291cb2014-09-14 11:56:38 -0400408 0x26, 0xFF, 0x00, /* Logical Maximum (255), */
Frank Praznik58d70272014-01-20 12:27:01 -0500409 0x75, 0x08, /* Report Size (8), */
410 0x95, 0x27, /* Report Count (39), */
411 0x81, 0x02, /* Input (Variable), */
412 0x85, 0x05, /* Report ID (5), */
413 0x09, 0x22, /* Usage (22h), */
414 0x95, 0x1F, /* Report Count (31), */
415 0x91, 0x02, /* Output (Variable), */
416 0x85, 0x04, /* Report ID (4), */
417 0x09, 0x23, /* Usage (23h), */
418 0x95, 0x24, /* Report Count (36), */
419 0xB1, 0x02, /* Feature (Variable), */
420 0x85, 0x02, /* Report ID (2), */
421 0x09, 0x24, /* Usage (24h), */
422 0x95, 0x24, /* Report Count (36), */
423 0xB1, 0x02, /* Feature (Variable), */
424 0x85, 0x08, /* Report ID (8), */
425 0x09, 0x25, /* Usage (25h), */
426 0x95, 0x03, /* Report Count (3), */
427 0xB1, 0x02, /* Feature (Variable), */
428 0x85, 0x10, /* Report ID (16), */
429 0x09, 0x26, /* Usage (26h), */
430 0x95, 0x04, /* Report Count (4), */
431 0xB1, 0x02, /* Feature (Variable), */
432 0x85, 0x11, /* Report ID (17), */
433 0x09, 0x27, /* Usage (27h), */
434 0x95, 0x02, /* Report Count (2), */
435 0xB1, 0x02, /* Feature (Variable), */
436 0x85, 0x12, /* Report ID (18), */
437 0x06, 0x02, 0xFF, /* Usage Page (FF02h), */
438 0x09, 0x21, /* Usage (21h), */
439 0x95, 0x0F, /* Report Count (15), */
440 0xB1, 0x02, /* Feature (Variable), */
441 0x85, 0x13, /* Report ID (19), */
442 0x09, 0x22, /* Usage (22h), */
443 0x95, 0x16, /* Report Count (22), */
444 0xB1, 0x02, /* Feature (Variable), */
445 0x85, 0x14, /* Report ID (20), */
446 0x06, 0x05, 0xFF, /* Usage Page (FF05h), */
447 0x09, 0x20, /* Usage (20h), */
448 0x95, 0x10, /* Report Count (16), */
449 0xB1, 0x02, /* Feature (Variable), */
450 0x85, 0x15, /* Report ID (21), */
451 0x09, 0x21, /* Usage (21h), */
452 0x95, 0x2C, /* Report Count (44), */
453 0xB1, 0x02, /* Feature (Variable), */
454 0x06, 0x80, 0xFF, /* Usage Page (FF80h), */
455 0x85, 0x80, /* Report ID (128), */
456 0x09, 0x20, /* Usage (20h), */
457 0x95, 0x06, /* Report Count (6), */
458 0xB1, 0x02, /* Feature (Variable), */
459 0x85, 0x81, /* Report ID (129), */
460 0x09, 0x21, /* Usage (21h), */
461 0x95, 0x06, /* Report Count (6), */
462 0xB1, 0x02, /* Feature (Variable), */
463 0x85, 0x82, /* Report ID (130), */
464 0x09, 0x22, /* Usage (22h), */
465 0x95, 0x05, /* Report Count (5), */
466 0xB1, 0x02, /* Feature (Variable), */
467 0x85, 0x83, /* Report ID (131), */
468 0x09, 0x23, /* Usage (23h), */
469 0x95, 0x01, /* Report Count (1), */
470 0xB1, 0x02, /* Feature (Variable), */
471 0x85, 0x84, /* Report ID (132), */
472 0x09, 0x24, /* Usage (24h), */
473 0x95, 0x04, /* Report Count (4), */
474 0xB1, 0x02, /* Feature (Variable), */
475 0x85, 0x85, /* Report ID (133), */
476 0x09, 0x25, /* Usage (25h), */
477 0x95, 0x06, /* Report Count (6), */
478 0xB1, 0x02, /* Feature (Variable), */
479 0x85, 0x86, /* Report ID (134), */
480 0x09, 0x26, /* Usage (26h), */
481 0x95, 0x06, /* Report Count (6), */
482 0xB1, 0x02, /* Feature (Variable), */
483 0x85, 0x87, /* Report ID (135), */
484 0x09, 0x27, /* Usage (27h), */
485 0x95, 0x23, /* Report Count (35), */
486 0xB1, 0x02, /* Feature (Variable), */
487 0x85, 0x88, /* Report ID (136), */
488 0x09, 0x28, /* Usage (28h), */
489 0x95, 0x22, /* Report Count (34), */
490 0xB1, 0x02, /* Feature (Variable), */
491 0x85, 0x89, /* Report ID (137), */
492 0x09, 0x29, /* Usage (29h), */
493 0x95, 0x02, /* Report Count (2), */
494 0xB1, 0x02, /* Feature (Variable), */
495 0x85, 0x90, /* Report ID (144), */
496 0x09, 0x30, /* Usage (30h), */
497 0x95, 0x05, /* Report Count (5), */
498 0xB1, 0x02, /* Feature (Variable), */
499 0x85, 0x91, /* Report ID (145), */
500 0x09, 0x31, /* Usage (31h), */
501 0x95, 0x03, /* Report Count (3), */
502 0xB1, 0x02, /* Feature (Variable), */
503 0x85, 0x92, /* Report ID (146), */
504 0x09, 0x32, /* Usage (32h), */
505 0x95, 0x03, /* Report Count (3), */
506 0xB1, 0x02, /* Feature (Variable), */
507 0x85, 0x93, /* Report ID (147), */
508 0x09, 0x33, /* Usage (33h), */
509 0x95, 0x0C, /* Report Count (12), */
510 0xB1, 0x02, /* Feature (Variable), */
511 0x85, 0xA0, /* Report ID (160), */
512 0x09, 0x40, /* Usage (40h), */
513 0x95, 0x06, /* Report Count (6), */
514 0xB1, 0x02, /* Feature (Variable), */
515 0x85, 0xA1, /* Report ID (161), */
516 0x09, 0x41, /* Usage (41h), */
517 0x95, 0x01, /* Report Count (1), */
518 0xB1, 0x02, /* Feature (Variable), */
519 0x85, 0xA2, /* Report ID (162), */
520 0x09, 0x42, /* Usage (42h), */
521 0x95, 0x01, /* Report Count (1), */
522 0xB1, 0x02, /* Feature (Variable), */
523 0x85, 0xA3, /* Report ID (163), */
524 0x09, 0x43, /* Usage (43h), */
525 0x95, 0x30, /* Report Count (48), */
526 0xB1, 0x02, /* Feature (Variable), */
527 0x85, 0xA4, /* Report ID (164), */
528 0x09, 0x44, /* Usage (44h), */
529 0x95, 0x0D, /* Report Count (13), */
530 0xB1, 0x02, /* Feature (Variable), */
531 0x85, 0xA5, /* Report ID (165), */
532 0x09, 0x45, /* Usage (45h), */
533 0x95, 0x15, /* Report Count (21), */
534 0xB1, 0x02, /* Feature (Variable), */
535 0x85, 0xA6, /* Report ID (166), */
536 0x09, 0x46, /* Usage (46h), */
537 0x95, 0x15, /* Report Count (21), */
538 0xB1, 0x02, /* Feature (Variable), */
539 0x85, 0xF0, /* Report ID (240), */
540 0x09, 0x47, /* Usage (47h), */
541 0x95, 0x3F, /* Report Count (63), */
542 0xB1, 0x02, /* Feature (Variable), */
543 0x85, 0xF1, /* Report ID (241), */
544 0x09, 0x48, /* Usage (48h), */
545 0x95, 0x3F, /* Report Count (63), */
546 0xB1, 0x02, /* Feature (Variable), */
547 0x85, 0xF2, /* Report ID (242), */
548 0x09, 0x49, /* Usage (49h), */
549 0x95, 0x0F, /* Report Count (15), */
550 0xB1, 0x02, /* Feature (Variable), */
551 0x85, 0xA7, /* Report ID (167), */
552 0x09, 0x4A, /* Usage (4Ah), */
553 0x95, 0x01, /* Report Count (1), */
554 0xB1, 0x02, /* Feature (Variable), */
555 0x85, 0xA8, /* Report ID (168), */
556 0x09, 0x4B, /* Usage (4Bh), */
557 0x95, 0x01, /* Report Count (1), */
558 0xB1, 0x02, /* Feature (Variable), */
559 0x85, 0xA9, /* Report ID (169), */
560 0x09, 0x4C, /* Usage (4Ch), */
561 0x95, 0x08, /* Report Count (8), */
562 0xB1, 0x02, /* Feature (Variable), */
563 0x85, 0xAA, /* Report ID (170), */
564 0x09, 0x4E, /* Usage (4Eh), */
565 0x95, 0x01, /* Report Count (1), */
566 0xB1, 0x02, /* Feature (Variable), */
567 0x85, 0xAB, /* Report ID (171), */
568 0x09, 0x4F, /* Usage (4Fh), */
569 0x95, 0x39, /* Report Count (57), */
570 0xB1, 0x02, /* Feature (Variable), */
571 0x85, 0xAC, /* Report ID (172), */
572 0x09, 0x50, /* Usage (50h), */
573 0x95, 0x39, /* Report Count (57), */
574 0xB1, 0x02, /* Feature (Variable), */
575 0x85, 0xAD, /* Report ID (173), */
576 0x09, 0x51, /* Usage (51h), */
577 0x95, 0x0B, /* Report Count (11), */
578 0xB1, 0x02, /* Feature (Variable), */
579 0x85, 0xAE, /* Report ID (174), */
580 0x09, 0x52, /* Usage (52h), */
581 0x95, 0x01, /* Report Count (1), */
582 0xB1, 0x02, /* Feature (Variable), */
583 0x85, 0xAF, /* Report ID (175), */
584 0x09, 0x53, /* Usage (53h), */
585 0x95, 0x02, /* Report Count (2), */
586 0xB1, 0x02, /* Feature (Variable), */
587 0x85, 0xB0, /* Report ID (176), */
588 0x09, 0x54, /* Usage (54h), */
589 0x95, 0x3F, /* Report Count (63), */
590 0xB1, 0x02, /* Feature (Variable), */
591 0xC0 /* End Collection */
Frank Prazniked19d8c2014-01-16 21:43:12 -0500592};
593
Frank Praznikad142b92014-02-20 11:36:00 -0500594/*
595 * The default behavior of the Dualshock 4 is to send reports using report
Frank Praznik077147a2014-09-14 11:56:39 -0400596 * type 1 when running over Bluetooth. However, when feature report 2 is
597 * requested during the controller initialization it starts sending input
598 * reports in report 17. Since report 17 is undefined in the default HID
Frank Praznikd8296742014-02-05 20:03:45 -0500599 * descriptor the button and axis definitions must be moved to report 17 or
Frank Praznik077147a2014-09-14 11:56:39 -0400600 * the HID layer won't process the received input.
Frank Praznikd8296742014-02-05 20:03:45 -0500601 */
602static u8 dualshock4_bt_rdesc[] = {
603 0x05, 0x01, /* Usage Page (Desktop), */
604 0x09, 0x05, /* Usage (Gamepad), */
605 0xA1, 0x01, /* Collection (Application), */
606 0x85, 0x01, /* Report ID (1), */
607 0x75, 0x08, /* Report Size (8), */
608 0x95, 0x0A, /* Report Count (9), */
609 0x81, 0x02, /* Input (Variable), */
610 0x06, 0x04, 0xFF, /* Usage Page (FF04h), */
611 0x85, 0x02, /* Report ID (2), */
612 0x09, 0x24, /* Usage (24h), */
613 0x95, 0x24, /* Report Count (36), */
614 0xB1, 0x02, /* Feature (Variable), */
615 0x85, 0xA3, /* Report ID (163), */
616 0x09, 0x25, /* Usage (25h), */
617 0x95, 0x30, /* Report Count (48), */
618 0xB1, 0x02, /* Feature (Variable), */
619 0x85, 0x05, /* Report ID (5), */
620 0x09, 0x26, /* Usage (26h), */
621 0x95, 0x28, /* Report Count (40), */
622 0xB1, 0x02, /* Feature (Variable), */
623 0x85, 0x06, /* Report ID (6), */
624 0x09, 0x27, /* Usage (27h), */
625 0x95, 0x34, /* Report Count (52), */
626 0xB1, 0x02, /* Feature (Variable), */
627 0x85, 0x07, /* Report ID (7), */
628 0x09, 0x28, /* Usage (28h), */
629 0x95, 0x30, /* Report Count (48), */
630 0xB1, 0x02, /* Feature (Variable), */
631 0x85, 0x08, /* Report ID (8), */
632 0x09, 0x29, /* Usage (29h), */
633 0x95, 0x2F, /* Report Count (47), */
634 0xB1, 0x02, /* Feature (Variable), */
635 0x06, 0x03, 0xFF, /* Usage Page (FF03h), */
636 0x85, 0x03, /* Report ID (3), */
637 0x09, 0x21, /* Usage (21h), */
638 0x95, 0x26, /* Report Count (38), */
639 0xB1, 0x02, /* Feature (Variable), */
640 0x85, 0x04, /* Report ID (4), */
641 0x09, 0x22, /* Usage (22h), */
642 0x95, 0x2E, /* Report Count (46), */
643 0xB1, 0x02, /* Feature (Variable), */
644 0x85, 0xF0, /* Report ID (240), */
645 0x09, 0x47, /* Usage (47h), */
646 0x95, 0x3F, /* Report Count (63), */
647 0xB1, 0x02, /* Feature (Variable), */
648 0x85, 0xF1, /* Report ID (241), */
649 0x09, 0x48, /* Usage (48h), */
650 0x95, 0x3F, /* Report Count (63), */
651 0xB1, 0x02, /* Feature (Variable), */
652 0x85, 0xF2, /* Report ID (242), */
653 0x09, 0x49, /* Usage (49h), */
654 0x95, 0x0F, /* Report Count (15), */
655 0xB1, 0x02, /* Feature (Variable), */
656 0x85, 0x11, /* Report ID (17), */
657 0x06, 0x00, 0xFF, /* Usage Page (FF00h), */
658 0x09, 0x20, /* Usage (20h), */
659 0x95, 0x02, /* Report Count (2), */
660 0x81, 0x02, /* Input (Variable), */
661 0x05, 0x01, /* Usage Page (Desktop), */
662 0x09, 0x30, /* Usage (X), */
663 0x09, 0x31, /* Usage (Y), */
664 0x09, 0x32, /* Usage (Z), */
665 0x09, 0x35, /* Usage (Rz), */
666 0x15, 0x00, /* Logical Minimum (0), */
667 0x26, 0xFF, 0x00, /* Logical Maximum (255), */
668 0x75, 0x08, /* Report Size (8), */
669 0x95, 0x04, /* Report Count (4), */
670 0x81, 0x02, /* Input (Variable), */
671 0x09, 0x39, /* Usage (Hat Switch), */
672 0x15, 0x00, /* Logical Minimum (0), */
673 0x25, 0x07, /* Logical Maximum (7), */
674 0x75, 0x04, /* Report Size (4), */
675 0x95, 0x01, /* Report Count (1), */
676 0x81, 0x42, /* Input (Variable, Null State), */
677 0x05, 0x09, /* Usage Page (Button), */
678 0x19, 0x01, /* Usage Minimum (01h), */
679 0x29, 0x0E, /* Usage Maximum (0Eh), */
680 0x15, 0x00, /* Logical Minimum (0), */
681 0x25, 0x01, /* Logical Maximum (1), */
682 0x75, 0x01, /* Report Size (1), */
683 0x95, 0x0E, /* Report Count (14), */
684 0x81, 0x02, /* Input (Variable), */
685 0x75, 0x06, /* Report Size (6), */
686 0x95, 0x01, /* Report Count (1), */
687 0x81, 0x01, /* Input (Constant), */
688 0x05, 0x01, /* Usage Page (Desktop), */
689 0x09, 0x33, /* Usage (Rx), */
690 0x09, 0x34, /* Usage (Ry), */
691 0x15, 0x00, /* Logical Minimum (0), */
692 0x26, 0xFF, 0x00, /* Logical Maximum (255), */
693 0x75, 0x08, /* Report Size (8), */
694 0x95, 0x02, /* Report Count (2), */
695 0x81, 0x02, /* Input (Variable), */
696 0x06, 0x00, 0xFF, /* Usage Page (FF00h), */
697 0x09, 0x20, /* Usage (20h), */
698 0x95, 0x03, /* Report Count (3), */
699 0x81, 0x02, /* Input (Variable), */
700 0x05, 0x01, /* Usage Page (Desktop), */
701 0x19, 0x40, /* Usage Minimum (40h), */
702 0x29, 0x42, /* Usage Maximum (42h), */
703 0x16, 0x00, 0x80, /* Logical Minimum (-32768), */
704 0x26, 0x00, 0x7F, /* Logical Maximum (32767), */
705 0x75, 0x10, /* Report Size (16), */
706 0x95, 0x03, /* Report Count (3), */
707 0x81, 0x02, /* Input (Variable), */
708 0x19, 0x43, /* Usage Minimum (43h), */
709 0x29, 0x45, /* Usage Maximum (45h), */
Frank Praznikfb291cb2014-09-14 11:56:38 -0400710 0x16, 0x00, 0xE0, /* Logical Minimum (-8192), */
711 0x26, 0xFF, 0x1F, /* Logical Maximum (8191), */
Frank Praznikd8296742014-02-05 20:03:45 -0500712 0x95, 0x03, /* Report Count (3), */
713 0x81, 0x02, /* Input (Variable), */
714 0x06, 0x00, 0xFF, /* Usage Page (FF00h), */
715 0x09, 0x20, /* Usage (20h), */
716 0x15, 0x00, /* Logical Minimum (0), */
717 0x26, 0xFF, 0x00, /* Logical Maximum (255), */
718 0x75, 0x08, /* Report Size (8), */
719 0x95, 0x31, /* Report Count (51), */
720 0x81, 0x02, /* Input (Variable), */
721 0x09, 0x21, /* Usage (21h), */
722 0x75, 0x08, /* Report Size (8), */
723 0x95, 0x4D, /* Report Count (77), */
724 0x91, 0x02, /* Output (Variable), */
725 0x85, 0x12, /* Report ID (18), */
726 0x09, 0x22, /* Usage (22h), */
727 0x95, 0x8D, /* Report Count (141), */
728 0x81, 0x02, /* Input (Variable), */
729 0x09, 0x23, /* Usage (23h), */
730 0x91, 0x02, /* Output (Variable), */
731 0x85, 0x13, /* Report ID (19), */
732 0x09, 0x24, /* Usage (24h), */
733 0x95, 0xCD, /* Report Count (205), */
734 0x81, 0x02, /* Input (Variable), */
735 0x09, 0x25, /* Usage (25h), */
736 0x91, 0x02, /* Output (Variable), */
737 0x85, 0x14, /* Report ID (20), */
738 0x09, 0x26, /* Usage (26h), */
739 0x96, 0x0D, 0x01, /* Report Count (269), */
740 0x81, 0x02, /* Input (Variable), */
741 0x09, 0x27, /* Usage (27h), */
742 0x91, 0x02, /* Output (Variable), */
743 0x85, 0x15, /* Report ID (21), */
744 0x09, 0x28, /* Usage (28h), */
745 0x96, 0x4D, 0x01, /* Report Count (333), */
746 0x81, 0x02, /* Input (Variable), */
747 0x09, 0x29, /* Usage (29h), */
748 0x91, 0x02, /* Output (Variable), */
749 0x85, 0x16, /* Report ID (22), */
750 0x09, 0x2A, /* Usage (2Ah), */
751 0x96, 0x8D, 0x01, /* Report Count (397), */
752 0x81, 0x02, /* Input (Variable), */
753 0x09, 0x2B, /* Usage (2Bh), */
754 0x91, 0x02, /* Output (Variable), */
755 0x85, 0x17, /* Report ID (23), */
756 0x09, 0x2C, /* Usage (2Ch), */
757 0x96, 0xCD, 0x01, /* Report Count (461), */
758 0x81, 0x02, /* Input (Variable), */
759 0x09, 0x2D, /* Usage (2Dh), */
760 0x91, 0x02, /* Output (Variable), */
761 0x85, 0x18, /* Report ID (24), */
762 0x09, 0x2E, /* Usage (2Eh), */
763 0x96, 0x0D, 0x02, /* Report Count (525), */
764 0x81, 0x02, /* Input (Variable), */
765 0x09, 0x2F, /* Usage (2Fh), */
766 0x91, 0x02, /* Output (Variable), */
767 0x85, 0x19, /* Report ID (25), */
768 0x09, 0x30, /* Usage (30h), */
769 0x96, 0x22, 0x02, /* Report Count (546), */
770 0x81, 0x02, /* Input (Variable), */
771 0x09, 0x31, /* Usage (31h), */
772 0x91, 0x02, /* Output (Variable), */
773 0x06, 0x80, 0xFF, /* Usage Page (FF80h), */
774 0x85, 0x82, /* Report ID (130), */
775 0x09, 0x22, /* Usage (22h), */
776 0x95, 0x3F, /* Report Count (63), */
777 0xB1, 0x02, /* Feature (Variable), */
778 0x85, 0x83, /* Report ID (131), */
779 0x09, 0x23, /* Usage (23h), */
780 0xB1, 0x02, /* Feature (Variable), */
781 0x85, 0x84, /* Report ID (132), */
782 0x09, 0x24, /* Usage (24h), */
783 0xB1, 0x02, /* Feature (Variable), */
784 0x85, 0x90, /* Report ID (144), */
785 0x09, 0x30, /* Usage (30h), */
786 0xB1, 0x02, /* Feature (Variable), */
787 0x85, 0x91, /* Report ID (145), */
788 0x09, 0x31, /* Usage (31h), */
789 0xB1, 0x02, /* Feature (Variable), */
790 0x85, 0x92, /* Report ID (146), */
791 0x09, 0x32, /* Usage (32h), */
792 0xB1, 0x02, /* Feature (Variable), */
793 0x85, 0x93, /* Report ID (147), */
794 0x09, 0x33, /* Usage (33h), */
795 0xB1, 0x02, /* Feature (Variable), */
796 0x85, 0xA0, /* Report ID (160), */
797 0x09, 0x40, /* Usage (40h), */
798 0xB1, 0x02, /* Feature (Variable), */
799 0x85, 0xA4, /* Report ID (164), */
800 0x09, 0x44, /* Usage (44h), */
801 0xB1, 0x02, /* Feature (Variable), */
802 0xC0 /* End Collection */
803};
804
Jiri Kosina078328d2013-06-13 12:03:49 +0200805static __u8 ps3remote_rdesc[] = {
806 0x05, 0x01, /* GUsagePage Generic Desktop */
807 0x09, 0x05, /* LUsage 0x05 [Game Pad] */
808 0xA1, 0x01, /* MCollection Application (mouse, keyboard) */
809
810 /* Use collection 1 for joypad buttons */
811 0xA1, 0x02, /* MCollection Logical (interrelated data) */
812
813 /* Ignore the 1st byte, maybe it is used for a controller
814 * number but it's not needed for correct operation */
815 0x75, 0x08, /* GReportSize 0x08 [8] */
816 0x95, 0x01, /* GReportCount 0x01 [1] */
817 0x81, 0x01, /* MInput 0x01 (Const[0] Arr[1] Abs[2]) */
818
819 /* Bytes from 2nd to 4th are a bitmap for joypad buttons, for these
820 * buttons multiple keypresses are allowed */
821 0x05, 0x09, /* GUsagePage Button */
822 0x19, 0x01, /* LUsageMinimum 0x01 [Button 1 (primary/trigger)] */
823 0x29, 0x18, /* LUsageMaximum 0x18 [Button 24] */
824 0x14, /* GLogicalMinimum [0] */
825 0x25, 0x01, /* GLogicalMaximum 0x01 [1] */
826 0x75, 0x01, /* GReportSize 0x01 [1] */
827 0x95, 0x18, /* GReportCount 0x18 [24] */
828 0x81, 0x02, /* MInput 0x02 (Data[0] Var[1] Abs[2]) */
829
830 0xC0, /* MEndCollection */
831
832 /* Use collection 2 for remote control buttons */
833 0xA1, 0x02, /* MCollection Logical (interrelated data) */
834
835 /* 5th byte is used for remote control buttons */
836 0x05, 0x09, /* GUsagePage Button */
837 0x18, /* LUsageMinimum [No button pressed] */
838 0x29, 0xFE, /* LUsageMaximum 0xFE [Button 254] */
839 0x14, /* GLogicalMinimum [0] */
840 0x26, 0xFE, 0x00, /* GLogicalMaximum 0x00FE [254] */
841 0x75, 0x08, /* GReportSize 0x08 [8] */
842 0x95, 0x01, /* GReportCount 0x01 [1] */
843 0x80, /* MInput */
844
845 /* Ignore bytes from 6th to 11th, 6th to 10th are always constant at
846 * 0xff and 11th is for press indication */
847 0x75, 0x08, /* GReportSize 0x08 [8] */
848 0x95, 0x06, /* GReportCount 0x06 [6] */
849 0x81, 0x01, /* MInput 0x01 (Const[0] Arr[1] Abs[2]) */
850
851 /* 12th byte is for battery strength */
852 0x05, 0x06, /* GUsagePage Generic Device Controls */
853 0x09, 0x20, /* LUsage 0x20 [Battery Strength] */
854 0x14, /* GLogicalMinimum [0] */
855 0x25, 0x05, /* GLogicalMaximum 0x05 [5] */
856 0x75, 0x08, /* GReportSize 0x08 [8] */
857 0x95, 0x01, /* GReportCount 0x01 [1] */
858 0x81, 0x02, /* MInput 0x02 (Data[0] Var[1] Abs[2]) */
859
860 0xC0, /* MEndCollection */
861
862 0xC0 /* MEndCollection [Game Pad] */
863};
864
865static const unsigned int ps3remote_keymap_joypad_buttons[] = {
866 [0x01] = KEY_SELECT,
867 [0x02] = BTN_THUMBL, /* L3 */
868 [0x03] = BTN_THUMBR, /* R3 */
869 [0x04] = BTN_START,
870 [0x05] = KEY_UP,
871 [0x06] = KEY_RIGHT,
872 [0x07] = KEY_DOWN,
873 [0x08] = KEY_LEFT,
874 [0x09] = BTN_TL2, /* L2 */
875 [0x0a] = BTN_TR2, /* R2 */
876 [0x0b] = BTN_TL, /* L1 */
877 [0x0c] = BTN_TR, /* R1 */
878 [0x0d] = KEY_OPTION, /* options/triangle */
879 [0x0e] = KEY_BACK, /* back/circle */
880 [0x0f] = BTN_0, /* cross */
881 [0x10] = KEY_SCREEN, /* view/square */
882 [0x11] = KEY_HOMEPAGE, /* PS button */
883 [0x14] = KEY_ENTER,
884};
885static const unsigned int ps3remote_keymap_remote_buttons[] = {
886 [0x00] = KEY_1,
887 [0x01] = KEY_2,
888 [0x02] = KEY_3,
889 [0x03] = KEY_4,
890 [0x04] = KEY_5,
891 [0x05] = KEY_6,
892 [0x06] = KEY_7,
893 [0x07] = KEY_8,
894 [0x08] = KEY_9,
895 [0x09] = KEY_0,
896 [0x0e] = KEY_ESC, /* return */
897 [0x0f] = KEY_CLEAR,
898 [0x16] = KEY_EJECTCD,
899 [0x1a] = KEY_MENU, /* top menu */
900 [0x28] = KEY_TIME,
901 [0x30] = KEY_PREVIOUS,
902 [0x31] = KEY_NEXT,
903 [0x32] = KEY_PLAY,
904 [0x33] = KEY_REWIND, /* scan back */
905 [0x34] = KEY_FORWARD, /* scan forward */
906 [0x38] = KEY_STOP,
907 [0x39] = KEY_PAUSE,
908 [0x40] = KEY_CONTEXT_MENU, /* pop up/menu */
909 [0x60] = KEY_FRAMEBACK, /* slow/step back */
910 [0x61] = KEY_FRAMEFORWARD, /* slow/step forward */
911 [0x63] = KEY_SUBTITLE,
912 [0x64] = KEY_AUDIO,
913 [0x65] = KEY_ANGLE,
914 [0x70] = KEY_INFO, /* display */
915 [0x80] = KEY_BLUE,
916 [0x81] = KEY_RED,
917 [0x82] = KEY_GREEN,
918 [0x83] = KEY_YELLOW,
919};
920
Colin Leitnerf04d5142013-05-27 23:41:05 +0200921static const unsigned int buzz_keymap[] = {
Frank Praznikad142b92014-02-20 11:36:00 -0500922 /*
923 * The controller has 4 remote buzzers, each with one LED and 5
Colin Leitnerf04d5142013-05-27 23:41:05 +0200924 * buttons.
925 *
926 * We use the mapping chosen by the controller, which is:
927 *
928 * Key Offset
929 * -------------------
930 * Buzz 1
931 * Blue 5
932 * Orange 4
933 * Green 3
934 * Yellow 2
935 *
936 * So, for example, the orange button on the third buzzer is mapped to
937 * BTN_TRIGGER_HAPPY14
938 */
939 [ 1] = BTN_TRIGGER_HAPPY1,
940 [ 2] = BTN_TRIGGER_HAPPY2,
941 [ 3] = BTN_TRIGGER_HAPPY3,
942 [ 4] = BTN_TRIGGER_HAPPY4,
943 [ 5] = BTN_TRIGGER_HAPPY5,
944 [ 6] = BTN_TRIGGER_HAPPY6,
945 [ 7] = BTN_TRIGGER_HAPPY7,
946 [ 8] = BTN_TRIGGER_HAPPY8,
947 [ 9] = BTN_TRIGGER_HAPPY9,
948 [10] = BTN_TRIGGER_HAPPY10,
949 [11] = BTN_TRIGGER_HAPPY11,
950 [12] = BTN_TRIGGER_HAPPY12,
951 [13] = BTN_TRIGGER_HAPPY13,
952 [14] = BTN_TRIGGER_HAPPY14,
953 [15] = BTN_TRIGGER_HAPPY15,
954 [16] = BTN_TRIGGER_HAPPY16,
955 [17] = BTN_TRIGGER_HAPPY17,
956 [18] = BTN_TRIGGER_HAPPY18,
957 [19] = BTN_TRIGGER_HAPPY19,
958 [20] = BTN_TRIGGER_HAPPY20,
959};
960
Frank Praznikd902f472014-01-27 10:17:36 -0500961static enum power_supply_property sony_battery_props[] = {
962 POWER_SUPPLY_PROP_PRESENT,
963 POWER_SUPPLY_PROP_CAPACITY,
964 POWER_SUPPLY_PROP_SCOPE,
965 POWER_SUPPLY_PROP_STATUS,
966};
967
Frank Praznik55d3b662014-04-14 10:11:32 -0400968struct sixaxis_led {
969 __u8 time_enabled; /* the total time the led is active (0xff means forever) */
970 __u8 duty_length; /* how long a cycle is in deciseconds (0 means "really fast") */
971 __u8 enabled;
972 __u8 duty_off; /* % of duty_length the led is off (0xff means 100%) */
973 __u8 duty_on; /* % of duty_length the led is on (0xff mean 100%) */
974} __packed;
975
976struct sixaxis_rumble {
977 __u8 padding;
978 __u8 right_duration; /* Right motor duration (0xff means forever) */
979 __u8 right_motor_on; /* Right (small) motor on/off, only supports values of 0 or 1 (off/on) */
980 __u8 left_duration; /* Left motor duration (0xff means forever) */
981 __u8 left_motor_force; /* left (large) motor, supports force values from 0 to 255 */
982} __packed;
983
984struct sixaxis_output_report {
985 __u8 report_id;
986 struct sixaxis_rumble rumble;
987 __u8 padding[4];
988 __u8 leds_bitmap; /* bitmap of enabled LEDs: LED_1 = 0x02, LED_2 = 0x04, ... */
989 struct sixaxis_led led[4]; /* LEDx at (4 - x) */
990 struct sixaxis_led _reserved; /* LED5, not actually soldered */
991} __packed;
992
993union sixaxis_output_report_01 {
994 struct sixaxis_output_report data;
995 __u8 buf[36];
996};
997
Frank Praznikc5e0c1c2015-05-05 20:47:30 -0400998struct motion_output_report_02 {
999 u8 type, zero;
1000 u8 r, g, b;
1001 u8 zero2;
1002 u8 rumble;
1003};
1004
Frank Praznik9b2b5c92014-11-12 14:10:09 -05001005#define DS4_REPORT_0x02_SIZE 37
1006#define DS4_REPORT_0x05_SIZE 32
1007#define DS4_REPORT_0x11_SIZE 78
1008#define DS4_REPORT_0x81_SIZE 7
Antonio Ospite29b691a2015-02-16 18:12:21 +01001009#define SIXAXIS_REPORT_0xF2_SIZE 17
Antonio Ospitea85d67b2015-02-16 18:12:22 +01001010#define SIXAXIS_REPORT_0xF5_SIZE 8
Simon Wood41d2d422015-06-09 21:27:06 -06001011#define MOTION_REPORT_0x02_SIZE 49
Frank Praznik9b2b5c92014-11-12 14:10:09 -05001012
Jiri Kosina8b402c92015-02-23 11:15:44 +01001013static DEFINE_SPINLOCK(sony_dev_list_lock);
Frank Praznikd2d782f2014-02-20 11:36:03 -05001014static LIST_HEAD(sony_device_list);
Frank Praznik80250872014-04-14 10:11:35 -04001015static DEFINE_IDA(sony_device_id_allocator);
Frank Praznikd2d782f2014-02-20 11:36:03 -05001016
Jiri Kosinacc6e0bb2008-10-23 12:58:38 +02001017struct sony_sc {
Frank Praznikd902f472014-01-27 10:17:36 -05001018 spinlock_t lock;
Frank Praznikd2d782f2014-02-20 11:36:03 -05001019 struct list_head list_node;
Sven Eckelmann0a286ef2013-11-19 20:26:32 +01001020 struct hid_device *hdev;
Frank Praznik60781cf2014-01-11 15:13:15 -05001021 struct led_classdev *leds[MAX_LEDS];
Jiri Kosinacc6e0bb2008-10-23 12:58:38 +02001022 unsigned long quirks;
Sven Eckelmann0a286ef2013-11-19 20:26:32 +01001023 struct work_struct state_worker;
Krzysztof Kozlowski297d7162015-03-12 08:44:11 +01001024 struct power_supply *battery;
1025 struct power_supply_desc battery_desc;
Frank Praznik80250872014-04-14 10:11:35 -04001026 int device_id;
Frank Praznik9b2b5c92014-11-12 14:10:09 -05001027 __u8 *output_report_dmabuf;
Colin Leitnerf04d5142013-05-27 23:41:05 +02001028
Sven Eckelmann9f323b62013-11-17 20:38:21 +01001029#ifdef CONFIG_SONY_FF
Sven Eckelmann9f323b62013-11-17 20:38:21 +01001030 __u8 left;
1031 __u8 right;
1032#endif
1033
Frank Praznikd2d782f2014-02-20 11:36:03 -05001034 __u8 mac_address[6];
Frank Praznik5f5750d2014-02-19 13:09:22 -05001035 __u8 worker_initialized;
Frank Praznikd902f472014-01-27 10:17:36 -05001036 __u8 cable_state;
1037 __u8 battery_charging;
1038 __u8 battery_capacity;
Frank Praznik60781cf2014-01-11 15:13:15 -05001039 __u8 led_state[MAX_LEDS];
Frank Praznikb3ed4582014-04-14 10:11:36 -04001040 __u8 led_delay_on[MAX_LEDS];
1041 __u8 led_delay_off[MAX_LEDS];
Frank Praznik60781cf2014-01-11 15:13:15 -05001042 __u8 led_count;
Jiri Kosinacc6e0bb2008-10-23 12:58:38 +02001043};
1044
Antonio Ospitec607fb82014-06-24 13:28:41 +02001045static __u8 *sixaxis_fixup(struct hid_device *hdev, __u8 *rdesc,
1046 unsigned int *rsize)
1047{
1048 *rsize = sizeof(sixaxis_rdesc);
1049 return sixaxis_rdesc;
1050}
1051
Frank Praznikc5e0c1c2015-05-05 20:47:30 -04001052static u8 *motion_fixup(struct hid_device *hdev, u8 *rdesc,
1053 unsigned int *rsize)
1054{
1055 *rsize = sizeof(motion_rdesc);
1056 return motion_rdesc;
1057}
1058
Simon Woodb2723eb2015-06-17 00:08:53 -06001059static u8 *navigation_fixup(struct hid_device *hdev, u8 *rdesc,
1060 unsigned int *rsize)
1061{
1062 *rsize = sizeof(navigation_rdesc);
1063 return navigation_rdesc;
1064}
1065
Jiri Kosina078328d2013-06-13 12:03:49 +02001066static __u8 *ps3remote_fixup(struct hid_device *hdev, __u8 *rdesc,
1067 unsigned int *rsize)
1068{
1069 *rsize = sizeof(ps3remote_rdesc);
1070 return ps3remote_rdesc;
1071}
1072
1073static int ps3remote_mapping(struct hid_device *hdev, struct hid_input *hi,
1074 struct hid_field *field, struct hid_usage *usage,
1075 unsigned long **bit, int *max)
1076{
1077 unsigned int key = usage->hid & HID_USAGE;
1078
1079 if ((usage->hid & HID_USAGE_PAGE) != HID_UP_BUTTON)
1080 return -1;
1081
1082 switch (usage->collection_index) {
1083 case 1:
1084 if (key >= ARRAY_SIZE(ps3remote_keymap_joypad_buttons))
1085 return -1;
1086
1087 key = ps3remote_keymap_joypad_buttons[key];
1088 if (!key)
1089 return -1;
1090 break;
1091 case 2:
1092 if (key >= ARRAY_SIZE(ps3remote_keymap_remote_buttons))
1093 return -1;
1094
1095 key = ps3remote_keymap_remote_buttons[key];
1096 if (!key)
1097 return -1;
1098 break;
1099 default:
1100 return -1;
1101 }
1102
1103 hid_map_usage_clear(hi, usage, bit, max, EV_KEY, key);
1104 return 1;
1105}
1106
Nikolai Kondrashov73e40082010-08-06 23:03:06 +04001107static __u8 *sony_report_fixup(struct hid_device *hdev, __u8 *rdesc,
1108 unsigned int *rsize)
Jiri Kosinacc6e0bb2008-10-23 12:58:38 +02001109{
1110 struct sony_sc *sc = hid_get_drvdata(hdev);
1111
Fernando Luis Vázquez Cao99d24902013-01-22 15:20:38 +09001112 /*
1113 * Some Sony RF receivers wrongly declare the mouse pointer as a
1114 * a constant non-data variable.
1115 */
1116 if ((sc->quirks & VAIO_RDESC_CONSTANT) && *rsize >= 56 &&
1117 /* usage page: generic desktop controls */
1118 /* rdesc[0] == 0x05 && rdesc[1] == 0x01 && */
1119 /* usage: mouse */
1120 rdesc[2] == 0x09 && rdesc[3] == 0x02 &&
1121 /* input (usage page for x,y axes): constant, variable, relative */
1122 rdesc[54] == 0x81 && rdesc[55] == 0x07) {
Fernando Luis Vázquez Caoa4649182013-01-15 19:40:48 +09001123 hid_info(hdev, "Fixing up Sony RF Receiver report descriptor\n");
Fernando Luis Vázquez Cao99d24902013-01-22 15:20:38 +09001124 /* input: data, variable, relative */
Jiri Kosinacc6e0bb2008-10-23 12:58:38 +02001125 rdesc[55] = 0x06;
1126 }
Simon Wood61ab44b2011-06-10 12:00:26 +02001127
Frank Prazniked19d8c2014-01-16 21:43:12 -05001128 /*
1129 * The default Dualshock 4 USB descriptor doesn't assign
1130 * the gyroscope values to corresponding axes so we need a
1131 * modified one.
1132 */
1133 if ((sc->quirks & DUALSHOCK4_CONTROLLER_USB) && *rsize == 467) {
1134 hid_info(hdev, "Using modified Dualshock 4 report descriptor with gyroscope axes\n");
1135 rdesc = dualshock4_usb_rdesc;
1136 *rsize = sizeof(dualshock4_usb_rdesc);
Frank Praznikd8296742014-02-05 20:03:45 -05001137 } else if ((sc->quirks & DUALSHOCK4_CONTROLLER_BT) && *rsize == 357) {
1138 hid_info(hdev, "Using modified Dualshock 4 Bluetooth report descriptor\n");
1139 rdesc = dualshock4_bt_rdesc;
1140 *rsize = sizeof(dualshock4_bt_rdesc);
Frank Prazniked19d8c2014-01-16 21:43:12 -05001141 }
1142
Antonio Ospitec607fb82014-06-24 13:28:41 +02001143 if (sc->quirks & SIXAXIS_CONTROLLER)
1144 return sixaxis_fixup(hdev, rdesc, rsize);
Jiri Kosina078328d2013-06-13 12:03:49 +02001145
Frank Praznikc5e0c1c2015-05-05 20:47:30 -04001146 if (sc->quirks & MOTION_CONTROLLER)
1147 return motion_fixup(hdev, rdesc, rsize);
1148
Simon Wood4545ee02015-06-17 00:08:52 -06001149 if (sc->quirks & NAVIGATION_CONTROLLER)
Simon Woodb2723eb2015-06-17 00:08:53 -06001150 return navigation_fixup(hdev, rdesc, rsize);
Simon Wood4545ee02015-06-17 00:08:52 -06001151
Jiri Kosina078328d2013-06-13 12:03:49 +02001152 if (sc->quirks & PS3REMOTE)
1153 return ps3remote_fixup(hdev, rdesc, rsize);
1154
Nikolai Kondrashov73e40082010-08-06 23:03:06 +04001155 return rdesc;
Jiri Kosinacc6e0bb2008-10-23 12:58:38 +02001156}
1157
Frank Praznikd902f472014-01-27 10:17:36 -05001158static void sixaxis_parse_report(struct sony_sc *sc, __u8 *rd, int size)
1159{
1160 static const __u8 sixaxis_battery_capacity[] = { 0, 1, 25, 50, 75, 100 };
1161 unsigned long flags;
Simon Wood12e9a6d72015-06-09 21:27:05 -06001162 int offset;
Frank Praznikd902f472014-01-27 10:17:36 -05001163 __u8 cable_state, battery_capacity, battery_charging;
1164
Frank Praznikad142b92014-02-20 11:36:00 -05001165 /*
1166 * The sixaxis is charging if the battery value is 0xee
Frank Praznikd902f472014-01-27 10:17:36 -05001167 * and it is fully charged if the value is 0xef.
1168 * It does not report the actual level while charging so it
1169 * is set to 100% while charging is in progress.
1170 */
Simon Wood12e9a6d72015-06-09 21:27:05 -06001171 offset = (sc->quirks & MOTION_CONTROLLER) ? 12 : 30;
1172
1173 if (rd[offset] >= 0xee) {
Frank Praznikd902f472014-01-27 10:17:36 -05001174 battery_capacity = 100;
Simon Wood12e9a6d72015-06-09 21:27:05 -06001175 battery_charging = !(rd[offset] & 0x01);
Frank Praznik9fddd742014-08-29 13:11:52 -04001176 cable_state = 1;
Frank Praznikd902f472014-01-27 10:17:36 -05001177 } else {
Simon Wood12e9a6d72015-06-09 21:27:05 -06001178 __u8 index = rd[offset] <= 5 ? rd[offset] : 5;
Frank Praznikac3c9a92014-02-20 11:36:02 -05001179 battery_capacity = sixaxis_battery_capacity[index];
Frank Praznikd902f472014-01-27 10:17:36 -05001180 battery_charging = 0;
Frank Praznik9fddd742014-08-29 13:11:52 -04001181 cable_state = 0;
Frank Praznikd902f472014-01-27 10:17:36 -05001182 }
Frank Praznikd902f472014-01-27 10:17:36 -05001183
1184 spin_lock_irqsave(&sc->lock, flags);
1185 sc->cable_state = cable_state;
1186 sc->battery_capacity = battery_capacity;
1187 sc->battery_charging = battery_charging;
1188 spin_unlock_irqrestore(&sc->lock, flags);
1189}
1190
1191static void dualshock4_parse_report(struct sony_sc *sc, __u8 *rd, int size)
1192{
Frank Praznike5606232014-01-27 10:17:37 -05001193 struct hid_input *hidinput = list_entry(sc->hdev->inputs.next,
1194 struct hid_input, list);
1195 struct input_dev *input_dev = hidinput->input;
Frank Praznikd902f472014-01-27 10:17:36 -05001196 unsigned long flags;
Frank Praznik6c5f8602014-02-05 20:03:47 -05001197 int n, offset;
Frank Praznikd902f472014-01-27 10:17:36 -05001198 __u8 cable_state, battery_capacity, battery_charging;
1199
Frank Praznikad142b92014-02-20 11:36:00 -05001200 /*
1201 * Battery and touchpad data starts at byte 30 in the USB report and
Frank Praznik6c5f8602014-02-05 20:03:47 -05001202 * 32 in Bluetooth report.
1203 */
1204 offset = (sc->quirks & DUALSHOCK4_CONTROLLER_USB) ? 30 : 32;
1205
Frank Praznikad142b92014-02-20 11:36:00 -05001206 /*
1207 * The lower 4 bits of byte 30 contain the battery level
Frank Praznikd902f472014-01-27 10:17:36 -05001208 * and the 5th bit contains the USB cable state.
1209 */
Frank Praznik6c5f8602014-02-05 20:03:47 -05001210 cable_state = (rd[offset] >> 4) & 0x01;
1211 battery_capacity = rd[offset] & 0x0F;
Frank Praznikd902f472014-01-27 10:17:36 -05001212
Frank Praznikad142b92014-02-20 11:36:00 -05001213 /*
1214 * When a USB power source is connected the battery level ranges from
Frank Praznik6c5f8602014-02-05 20:03:47 -05001215 * 0 to 10, and when running on battery power it ranges from 0 to 9.
1216 * A battery level above 10 when plugged in means charge completed.
Frank Praznikd902f472014-01-27 10:17:36 -05001217 */
Frank Praznik6c5f8602014-02-05 20:03:47 -05001218 if (!cable_state || battery_capacity > 10)
Frank Praznikd902f472014-01-27 10:17:36 -05001219 battery_charging = 0;
1220 else
1221 battery_charging = 1;
1222
Frank Praznik6c5f8602014-02-05 20:03:47 -05001223 if (!cable_state)
1224 battery_capacity++;
Frank Praznikd902f472014-01-27 10:17:36 -05001225 if (battery_capacity > 10)
Frank Praznik6c5f8602014-02-05 20:03:47 -05001226 battery_capacity = 10;
1227
Frank Praznikd902f472014-01-27 10:17:36 -05001228 battery_capacity *= 10;
1229
1230 spin_lock_irqsave(&sc->lock, flags);
1231 sc->cable_state = cable_state;
1232 sc->battery_capacity = battery_capacity;
1233 sc->battery_charging = battery_charging;
1234 spin_unlock_irqrestore(&sc->lock, flags);
Frank Praznike5606232014-01-27 10:17:37 -05001235
Frank Praznik6c5f8602014-02-05 20:03:47 -05001236 offset += 5;
1237
Frank Praznikad142b92014-02-20 11:36:00 -05001238 /*
1239 * The Dualshock 4 multi-touch trackpad data starts at offset 35 on USB
Frank Praznik6c5f8602014-02-05 20:03:47 -05001240 * and 37 on Bluetooth.
Frank Praznike5606232014-01-27 10:17:37 -05001241 * The first 7 bits of the first byte is a counter and bit 8 is a touch
1242 * indicator that is 0 when pressed and 1 when not pressed.
1243 * The next 3 bytes are two 12 bit touch coordinates, X and Y.
1244 * The data for the second touch is in the same format and immediatly
1245 * follows the data for the first.
1246 */
1247 for (n = 0; n < 2; n++) {
1248 __u16 x, y;
1249
1250 x = rd[offset+1] | ((rd[offset+2] & 0xF) << 8);
1251 y = ((rd[offset+2] & 0xF0) >> 4) | (rd[offset+3] << 4);
1252
1253 input_mt_slot(input_dev, n);
1254 input_mt_report_slot_state(input_dev, MT_TOOL_FINGER,
1255 !(rd[offset] >> 7));
1256 input_report_abs(input_dev, ABS_MT_POSITION_X, x);
1257 input_report_abs(input_dev, ABS_MT_POSITION_Y, y);
1258
1259 offset += 4;
1260 }
Frank Praznikd902f472014-01-27 10:17:36 -05001261}
1262
Simon Woodc9e4d872011-06-10 12:00:27 +02001263static int sony_raw_event(struct hid_device *hdev, struct hid_report *report,
1264 __u8 *rd, int size)
1265{
1266 struct sony_sc *sc = hid_get_drvdata(hdev);
1267
Frank Praznikad142b92014-02-20 11:36:00 -05001268 /*
1269 * Sixaxis HID report has acclerometers/gyro with MSByte first, this
Simon Woodc9e4d872011-06-10 12:00:27 +02001270 * has to be BYTE_SWAPPED before passing up to joystick interface
1271 */
Frank Praznikfee4e2d2014-02-18 17:22:01 -05001272 if ((sc->quirks & SIXAXIS_CONTROLLER) && rd[0] == 0x01 && size == 49) {
Simon Woodc9e4d872011-06-10 12:00:27 +02001273 swap(rd[41], rd[42]);
1274 swap(rd[43], rd[44]);
1275 swap(rd[45], rd[46]);
1276 swap(rd[47], rd[48]);
Frank Praznikd902f472014-01-27 10:17:36 -05001277
1278 sixaxis_parse_report(sc, rd, size);
Simon Wood12e9a6d72015-06-09 21:27:05 -06001279 } else if ((sc->quirks & MOTION_CONTROLLER_BT) && rd[0] == 0x01 && size == 49) {
1280 sixaxis_parse_report(sc, rd, size);
Simon Wood4545ee02015-06-17 00:08:52 -06001281 } else if ((sc->quirks & NAVIGATION_CONTROLLER) && rd[0] == 0x01 &&
1282 size == 49) {
1283 sixaxis_parse_report(sc, rd, size);
Frank Praznik68330d82014-02-05 20:03:49 -05001284 } else if (((sc->quirks & DUALSHOCK4_CONTROLLER_USB) && rd[0] == 0x01 &&
1285 size == 64) || ((sc->quirks & DUALSHOCK4_CONTROLLER_BT)
1286 && rd[0] == 0x11 && size == 78)) {
Frank Praznikd902f472014-01-27 10:17:36 -05001287 dualshock4_parse_report(sc, rd, size);
Simon Woodc9e4d872011-06-10 12:00:27 +02001288 }
1289
1290 return 0;
1291}
1292
Colin Leitnerf04d5142013-05-27 23:41:05 +02001293static int sony_mapping(struct hid_device *hdev, struct hid_input *hi,
1294 struct hid_field *field, struct hid_usage *usage,
1295 unsigned long **bit, int *max)
1296{
1297 struct sony_sc *sc = hid_get_drvdata(hdev);
1298
1299 if (sc->quirks & BUZZ_CONTROLLER) {
1300 unsigned int key = usage->hid & HID_USAGE;
1301
1302 if ((usage->hid & HID_USAGE_PAGE) != HID_UP_BUTTON)
1303 return -1;
1304
1305 switch (usage->collection_index) {
1306 case 1:
1307 if (key >= ARRAY_SIZE(buzz_keymap))
1308 return -1;
1309
1310 key = buzz_keymap[key];
1311 if (!key)
1312 return -1;
1313 break;
1314 default:
1315 return -1;
1316 }
1317
1318 hid_map_usage_clear(hi, usage, bit, max, EV_KEY, key);
1319 return 1;
1320 }
1321
Jiri Kosina078328d2013-06-13 12:03:49 +02001322 if (sc->quirks & PS3REMOTE)
1323 return ps3remote_mapping(hdev, hi, field, usage, bit, max);
1324
Benjamin Tissoires6f498012013-07-24 16:53:07 +02001325 /* Let hid-core decide for the others */
1326 return 0;
Colin Leitnerf04d5142013-05-27 23:41:05 +02001327}
1328
Frank Praznikce8efc32014-09-18 21:15:01 -04001329static int sony_register_touchpad(struct hid_input *hi, int touch_count,
1330 int w, int h)
1331{
1332 struct input_dev *input_dev = hi->input;
1333 int ret;
1334
1335 ret = input_mt_init_slots(input_dev, touch_count, 0);
1336 if (ret < 0)
1337 return ret;
1338
1339 input_set_abs_params(input_dev, ABS_MT_POSITION_X, 0, w, 0, 0);
1340 input_set_abs_params(input_dev, ABS_MT_POSITION_Y, 0, h, 0, 0);
1341
1342 return 0;
1343}
1344
1345static void sony_input_configured(struct hid_device *hdev,
1346 struct hid_input *hidinput)
1347{
1348 struct sony_sc *sc = hid_get_drvdata(hdev);
1349
1350 /*
1351 * The Dualshock 4 touchpad supports 2 touches and has a
Frank Praznik981c5b42014-09-24 09:38:19 -04001352 * resolution of 1920x942 (44.86 dots/mm).
Frank Praznikce8efc32014-09-18 21:15:01 -04001353 */
1354 if (sc->quirks & DUALSHOCK4_CONTROLLER) {
Frank Praznik981c5b42014-09-24 09:38:19 -04001355 if (sony_register_touchpad(hidinput, 2, 1920, 942) != 0)
Frank Praznikce8efc32014-09-18 21:15:01 -04001356 hid_err(sc->hdev,
1357 "Unable to initialize multi-touch slots\n");
1358 }
1359}
1360
Antonio Ospite5710fab2011-02-20 18:26:45 +01001361/*
Jiri Slabybd28ce02008-06-25 23:47:04 +02001362 * Sending HID_REQ_GET_REPORT changes the operation mode of the ps3 controller
1363 * to "operational". Without this, the ps3 controller will not report any
1364 * events.
1365 */
Antonio Ospite816651a2010-05-03 22:15:55 +02001366static int sixaxis_set_operational_usb(struct hid_device *hdev)
Jiri Slabybd28ce02008-06-25 23:47:04 +02001367{
Antonio Ospitea85d67b2015-02-16 18:12:22 +01001368 const int buf_size =
1369 max(SIXAXIS_REPORT_0xF2_SIZE, SIXAXIS_REPORT_0xF5_SIZE);
Antonio Ospite2e701a32015-02-16 18:12:24 +01001370 __u8 *buf;
Jiri Slabybd28ce02008-06-25 23:47:04 +02001371 int ret;
Jiri Slabybd28ce02008-06-25 23:47:04 +02001372
Antonio Ospite2e701a32015-02-16 18:12:24 +01001373 buf = kmalloc(buf_size, GFP_KERNEL);
Jiri Slabybd28ce02008-06-25 23:47:04 +02001374 if (!buf)
1375 return -ENOMEM;
1376
Antonio Ospitea85d67b2015-02-16 18:12:22 +01001377 ret = hid_hw_raw_request(hdev, 0xf2, buf, SIXAXIS_REPORT_0xF2_SIZE,
1378 HID_FEATURE_REPORT, HID_REQ_GET_REPORT);
Lauri Kasanena7de9b82015-02-16 15:06:59 +02001379 if (ret < 0) {
1380 hid_err(hdev, "can't set operational mode: step 1\n");
1381 goto out;
1382 }
Benjamin Tissoiresf204828a2013-09-11 22:12:25 +02001383
Lauri Kasanena7de9b82015-02-16 15:06:59 +02001384 /*
1385 * Some compatible controllers like the Speedlink Strike FX and
1386 * Gasia need another query plus an USB interrupt to get operational.
1387 */
Antonio Ospitea85d67b2015-02-16 18:12:22 +01001388 ret = hid_hw_raw_request(hdev, 0xf5, buf, SIXAXIS_REPORT_0xF5_SIZE,
1389 HID_FEATURE_REPORT, HID_REQ_GET_REPORT);
Lauri Kasanena7de9b82015-02-16 15:06:59 +02001390 if (ret < 0) {
1391 hid_err(hdev, "can't set operational mode: step 2\n");
1392 goto out;
1393 }
1394
1395 ret = hid_hw_output_report(hdev, buf, 1);
Jiri Slabybd28ce02008-06-25 23:47:04 +02001396 if (ret < 0)
Lauri Kasanena7de9b82015-02-16 15:06:59 +02001397 hid_err(hdev, "can't set operational mode: step 3\n");
Jiri Slabybd28ce02008-06-25 23:47:04 +02001398
Lauri Kasanena7de9b82015-02-16 15:06:59 +02001399out:
Jiri Slabybd28ce02008-06-25 23:47:04 +02001400 kfree(buf);
1401
1402 return ret;
1403}
1404
Antonio Ospite816651a2010-05-03 22:15:55 +02001405static int sixaxis_set_operational_bt(struct hid_device *hdev)
Bastien Noceraf9ce7c22010-01-20 12:01:53 +00001406{
Frank Praznik9b2b5c92014-11-12 14:10:09 -05001407 static const __u8 report[] = { 0xf4, 0x42, 0x03, 0x00, 0x00 };
1408 __u8 *buf;
1409 int ret;
1410
1411 buf = kmemdup(report, sizeof(report), GFP_KERNEL);
1412 if (!buf)
1413 return -ENOMEM;
1414
1415 ret = hid_hw_raw_request(hdev, buf[0], buf, sizeof(report),
Benjamin Tissoiresb0dd72a2014-02-10 12:58:54 -05001416 HID_FEATURE_REPORT, HID_REQ_SET_REPORT);
Frank Praznik9b2b5c92014-11-12 14:10:09 -05001417
1418 kfree(buf);
1419
1420 return ret;
Bastien Noceraf9ce7c22010-01-20 12:01:53 +00001421}
1422
Frank Praznikad142b92014-02-20 11:36:00 -05001423/*
1424 * Requesting feature report 0x02 in Bluetooth mode changes the state of the
Frank Praznik68330d82014-02-05 20:03:49 -05001425 * controller so that it sends full input reports of type 0x11.
1426 */
1427static int dualshock4_set_operational_bt(struct hid_device *hdev)
1428{
Frank Praznik9b2b5c92014-11-12 14:10:09 -05001429 __u8 *buf;
1430 int ret;
Frank Praznik68330d82014-02-05 20:03:49 -05001431
Frank Praznik9b2b5c92014-11-12 14:10:09 -05001432 buf = kmalloc(DS4_REPORT_0x02_SIZE, GFP_KERNEL);
1433 if (!buf)
1434 return -ENOMEM;
1435
1436 ret = hid_hw_raw_request(hdev, 0x02, buf, DS4_REPORT_0x02_SIZE,
Frank Praznik68330d82014-02-05 20:03:49 -05001437 HID_FEATURE_REPORT, HID_REQ_GET_REPORT);
Frank Praznik9b2b5c92014-11-12 14:10:09 -05001438
1439 kfree(buf);
1440
1441 return ret;
Jiri Slabybd28ce02008-06-25 23:47:04 +02001442}
1443
Frank Praznik221399b2015-05-05 20:47:32 -04001444static void sixaxis_set_leds_from_id(struct sony_sc *sc)
Frank Praznik80250872014-04-14 10:11:35 -04001445{
1446 static const __u8 sixaxis_leds[10][4] = {
1447 { 0x01, 0x00, 0x00, 0x00 },
1448 { 0x00, 0x01, 0x00, 0x00 },
1449 { 0x00, 0x00, 0x01, 0x00 },
1450 { 0x00, 0x00, 0x00, 0x01 },
1451 { 0x01, 0x00, 0x00, 0x01 },
1452 { 0x00, 0x01, 0x00, 0x01 },
1453 { 0x00, 0x00, 0x01, 0x01 },
1454 { 0x01, 0x00, 0x01, 0x01 },
1455 { 0x00, 0x01, 0x01, 0x01 },
1456 { 0x01, 0x01, 0x01, 0x01 }
1457 };
1458
Frank Praznik221399b2015-05-05 20:47:32 -04001459 int id = sc->device_id;
1460
1461 BUILD_BUG_ON(MAX_LEDS < ARRAY_SIZE(sixaxis_leds[0]));
Frank Praznik80250872014-04-14 10:11:35 -04001462
1463 if (id < 0)
1464 return;
1465
1466 id %= 10;
Frank Praznik221399b2015-05-05 20:47:32 -04001467 memcpy(sc->led_state, sixaxis_leds[id], sizeof(sixaxis_leds[id]));
Frank Praznik80250872014-04-14 10:11:35 -04001468}
1469
Frank Praznik221399b2015-05-05 20:47:32 -04001470static void dualshock4_set_leds_from_id(struct sony_sc *sc)
Frank Praznik80250872014-04-14 10:11:35 -04001471{
1472 /* The first 4 color/index entries match what the PS4 assigns */
1473 static const __u8 color_code[7][3] = {
1474 /* Blue */ { 0x00, 0x00, 0x01 },
1475 /* Red */ { 0x01, 0x00, 0x00 },
1476 /* Green */ { 0x00, 0x01, 0x00 },
1477 /* Pink */ { 0x02, 0x00, 0x01 },
1478 /* Orange */ { 0x02, 0x01, 0x00 },
1479 /* Teal */ { 0x00, 0x01, 0x01 },
1480 /* White */ { 0x01, 0x01, 0x01 }
1481 };
1482
Frank Praznik221399b2015-05-05 20:47:32 -04001483 int id = sc->device_id;
1484
1485 BUILD_BUG_ON(MAX_LEDS < ARRAY_SIZE(color_code[0]));
Frank Praznik80250872014-04-14 10:11:35 -04001486
1487 if (id < 0)
1488 return;
1489
1490 id %= 7;
Frank Praznik221399b2015-05-05 20:47:32 -04001491 memcpy(sc->led_state, color_code[id], sizeof(color_code[id]));
Frank Praznik80250872014-04-14 10:11:35 -04001492}
1493
Frank Praznik221399b2015-05-05 20:47:32 -04001494static void buzz_set_leds(struct sony_sc *sc)
Colin Leitnerf04d5142013-05-27 23:41:05 +02001495{
Frank Praznik221399b2015-05-05 20:47:32 -04001496 struct hid_device *hdev = sc->hdev;
Colin Leitnerf04d5142013-05-27 23:41:05 +02001497 struct list_head *report_list =
1498 &hdev->report_enum[HID_OUTPUT_REPORT].report_list;
1499 struct hid_report *report = list_entry(report_list->next,
1500 struct hid_report, list);
1501 __s32 *value = report->field[0]->value;
1502
Frank Praznik221399b2015-05-05 20:47:32 -04001503 BUILD_BUG_ON(MAX_LEDS < 4);
1504
Colin Leitnerf04d5142013-05-27 23:41:05 +02001505 value[0] = 0x00;
Frank Praznik221399b2015-05-05 20:47:32 -04001506 value[1] = sc->led_state[0] ? 0xff : 0x00;
1507 value[2] = sc->led_state[1] ? 0xff : 0x00;
1508 value[3] = sc->led_state[2] ? 0xff : 0x00;
1509 value[4] = sc->led_state[3] ? 0xff : 0x00;
Colin Leitnerf04d5142013-05-27 23:41:05 +02001510 value[5] = 0x00;
1511 value[6] = 0x00;
1512 hid_hw_request(hdev, report, HID_REQ_SET_REPORT);
1513}
1514
Frank Praznik221399b2015-05-05 20:47:32 -04001515static void sony_set_leds(struct sony_sc *sc)
Sven Eckelmann0a286ef2013-11-19 20:26:32 +01001516{
Frank Praznik221399b2015-05-05 20:47:32 -04001517 if (!(sc->quirks & BUZZ_CONTROLLER))
Frank Praznikfa57a812014-04-14 10:11:33 -04001518 schedule_work(&sc->state_worker);
Frank Praznik221399b2015-05-05 20:47:32 -04001519 else
1520 buzz_set_leds(sc);
Sven Eckelmann0a286ef2013-11-19 20:26:32 +01001521}
1522
Sven Eckelmannc5382512013-11-19 20:26:30 +01001523static void sony_led_set_brightness(struct led_classdev *led,
Colin Leitnerf04d5142013-05-27 23:41:05 +02001524 enum led_brightness value)
1525{
1526 struct device *dev = led->dev->parent;
1527 struct hid_device *hdev = container_of(dev, struct hid_device, dev);
1528 struct sony_sc *drv_data;
Colin Leitnerf04d5142013-05-27 23:41:05 +02001529
1530 int n;
Frank Praznikb3ed4582014-04-14 10:11:36 -04001531 int force_update;
Colin Leitnerf04d5142013-05-27 23:41:05 +02001532
1533 drv_data = hid_get_drvdata(hdev);
Sven Eckelmann2251b852013-11-19 20:26:31 +01001534 if (!drv_data) {
Colin Leitnerf04d5142013-05-27 23:41:05 +02001535 hid_err(hdev, "No device data\n");
1536 return;
1537 }
Colin Leitnerf04d5142013-05-27 23:41:05 +02001538
Frank Praznikb3ed4582014-04-14 10:11:36 -04001539 /*
1540 * The Sixaxis on USB will override any LED settings sent to it
1541 * and keep flashing all of the LEDs until the PS button is pressed.
1542 * Updates, even if redundant, must be always be sent to the
1543 * controller to avoid having to toggle the state of an LED just to
1544 * stop the flashing later on.
1545 */
1546 force_update = !!(drv_data->quirks & SIXAXIS_CONTROLLER_USB);
1547
Frank Praznik60781cf2014-01-11 15:13:15 -05001548 for (n = 0; n < drv_data->led_count; n++) {
Frank Praznikb3ed4582014-04-14 10:11:36 -04001549 if (led == drv_data->leds[n] && (force_update ||
1550 (value != drv_data->led_state[n] ||
1551 drv_data->led_delay_on[n] ||
1552 drv_data->led_delay_off[n]))) {
1553
1554 drv_data->led_state[n] = value;
1555
1556 /* Setting the brightness stops the blinking */
1557 drv_data->led_delay_on[n] = 0;
1558 drv_data->led_delay_off[n] = 0;
1559
Frank Praznik221399b2015-05-05 20:47:32 -04001560 sony_set_leds(drv_data);
Colin Leitnerf04d5142013-05-27 23:41:05 +02001561 break;
1562 }
1563 }
1564}
1565
Sven Eckelmannc5382512013-11-19 20:26:30 +01001566static enum led_brightness sony_led_get_brightness(struct led_classdev *led)
Colin Leitnerf04d5142013-05-27 23:41:05 +02001567{
1568 struct device *dev = led->dev->parent;
1569 struct hid_device *hdev = container_of(dev, struct hid_device, dev);
1570 struct sony_sc *drv_data;
Colin Leitnerf04d5142013-05-27 23:41:05 +02001571
1572 int n;
Colin Leitnerf04d5142013-05-27 23:41:05 +02001573
1574 drv_data = hid_get_drvdata(hdev);
Sven Eckelmann2251b852013-11-19 20:26:31 +01001575 if (!drv_data) {
Colin Leitnerf04d5142013-05-27 23:41:05 +02001576 hid_err(hdev, "No device data\n");
1577 return LED_OFF;
1578 }
Colin Leitnerf04d5142013-05-27 23:41:05 +02001579
Frank Praznik60781cf2014-01-11 15:13:15 -05001580 for (n = 0; n < drv_data->led_count; n++) {
Simon Wood7db75042014-02-05 12:34:18 -07001581 if (led == drv_data->leds[n])
1582 return drv_data->led_state[n];
Colin Leitnerf04d5142013-05-27 23:41:05 +02001583 }
1584
Simon Wood7db75042014-02-05 12:34:18 -07001585 return LED_OFF;
Colin Leitnerf04d5142013-05-27 23:41:05 +02001586}
Colin Leitnerf04d5142013-05-27 23:41:05 +02001587
Frank Praznikb3ed4582014-04-14 10:11:36 -04001588static int sony_led_blink_set(struct led_classdev *led, unsigned long *delay_on,
1589 unsigned long *delay_off)
1590{
1591 struct device *dev = led->dev->parent;
1592 struct hid_device *hdev = container_of(dev, struct hid_device, dev);
1593 struct sony_sc *drv_data = hid_get_drvdata(hdev);
1594 int n;
1595 __u8 new_on, new_off;
1596
1597 if (!drv_data) {
1598 hid_err(hdev, "No device data\n");
1599 return -EINVAL;
1600 }
1601
1602 /* Max delay is 255 deciseconds or 2550 milliseconds */
1603 if (*delay_on > 2550)
1604 *delay_on = 2550;
1605 if (*delay_off > 2550)
1606 *delay_off = 2550;
1607
1608 /* Blink at 1 Hz if both values are zero */
1609 if (!*delay_on && !*delay_off)
1610 *delay_on = *delay_off = 500;
1611
1612 new_on = *delay_on / 10;
1613 new_off = *delay_off / 10;
1614
1615 for (n = 0; n < drv_data->led_count; n++) {
1616 if (led == drv_data->leds[n])
1617 break;
1618 }
1619
1620 /* This LED is not registered on this device */
1621 if (n >= drv_data->led_count)
1622 return -EINVAL;
1623
1624 /* Don't schedule work if the values didn't change */
1625 if (new_on != drv_data->led_delay_on[n] ||
1626 new_off != drv_data->led_delay_off[n]) {
1627 drv_data->led_delay_on[n] = new_on;
1628 drv_data->led_delay_off[n] = new_off;
1629 schedule_work(&drv_data->state_worker);
1630 }
1631
1632 return 0;
1633}
1634
Frank Praznikfa57a812014-04-14 10:11:33 -04001635static void sony_leds_remove(struct sony_sc *sc)
Sven Eckelmann0a286ef2013-11-19 20:26:32 +01001636{
Sven Eckelmann0a286ef2013-11-19 20:26:32 +01001637 struct led_classdev *led;
1638 int n;
1639
Frank Praznikfa57a812014-04-14 10:11:33 -04001640 BUG_ON(!(sc->quirks & SONY_LED_SUPPORT));
Sven Eckelmann0a286ef2013-11-19 20:26:32 +01001641
Frank Praznikfa57a812014-04-14 10:11:33 -04001642 for (n = 0; n < sc->led_count; n++) {
1643 led = sc->leds[n];
1644 sc->leds[n] = NULL;
Sven Eckelmann0a286ef2013-11-19 20:26:32 +01001645 if (!led)
1646 continue;
1647 led_classdev_unregister(led);
1648 kfree(led);
1649 }
Frank Praznik60781cf2014-01-11 15:13:15 -05001650
Frank Praznikfa57a812014-04-14 10:11:33 -04001651 sc->led_count = 0;
Sven Eckelmann0a286ef2013-11-19 20:26:32 +01001652}
1653
Frank Praznikfa57a812014-04-14 10:11:33 -04001654static int sony_leds_init(struct sony_sc *sc)
Colin Leitnerf04d5142013-05-27 23:41:05 +02001655{
Frank Praznikfa57a812014-04-14 10:11:33 -04001656 struct hid_device *hdev = sc->hdev;
Jiri Kosina40e32ee2013-05-28 11:22:09 +02001657 int n, ret = 0;
Frank Praznikb3ed4582014-04-14 10:11:36 -04001658 int use_ds4_names;
Jiri Kosina40e32ee2013-05-28 11:22:09 +02001659 struct led_classdev *led;
1660 size_t name_sz;
1661 char *name;
Sven Eckelmann0a286ef2013-11-19 20:26:32 +01001662 size_t name_len;
1663 const char *name_fmt;
Frank Praznikb3ed4582014-04-14 10:11:36 -04001664 static const char * const ds4_name_str[] = { "red", "green", "blue",
1665 "global" };
Frank Praznik5607c892014-07-29 19:55:48 -07001666 __u8 max_brightness[MAX_LEDS] = { [0 ... (MAX_LEDS - 1)] = 1 };
Frank Praznikb3ed4582014-04-14 10:11:36 -04001667 __u8 use_hw_blink[MAX_LEDS] = { 0 };
Colin Leitnerf04d5142013-05-27 23:41:05 +02001668
Frank Praznikfa57a812014-04-14 10:11:33 -04001669 BUG_ON(!(sc->quirks & SONY_LED_SUPPORT));
Colin Leitnerf04d5142013-05-27 23:41:05 +02001670
Frank Praznikfa57a812014-04-14 10:11:33 -04001671 if (sc->quirks & BUZZ_CONTROLLER) {
1672 sc->led_count = 4;
Frank Praznikb3ed4582014-04-14 10:11:36 -04001673 use_ds4_names = 0;
Sven Eckelmann0a286ef2013-11-19 20:26:32 +01001674 name_len = strlen("::buzz#");
1675 name_fmt = "%s::buzz%d";
1676 /* Validate expected report characteristics. */
1677 if (!hid_validate_values(hdev, HID_OUTPUT_REPORT, 0, 0, 7))
1678 return -ENODEV;
Frank Praznikfa57a812014-04-14 10:11:33 -04001679 } else if (sc->quirks & DUALSHOCK4_CONTROLLER) {
Frank Praznik221399b2015-05-05 20:47:32 -04001680 dualshock4_set_leds_from_id(sc);
1681 sc->led_state[3] = 1;
Frank Praznikb3ed4582014-04-14 10:11:36 -04001682 sc->led_count = 4;
1683 memset(max_brightness, 255, 3);
1684 use_hw_blink[3] = 1;
1685 use_ds4_names = 1;
Frank Praznik61ebca92014-01-20 12:27:02 -05001686 name_len = 0;
1687 name_fmt = "%s:%s";
Frank Praznikc5e0c1c2015-05-05 20:47:30 -04001688 } else if (sc->quirks & MOTION_CONTROLLER) {
1689 sc->led_count = 3;
1690 memset(max_brightness, 255, 3);
1691 use_ds4_names = 1;
1692 name_len = 0;
1693 name_fmt = "%s:%s";
Simon Wood4545ee02015-06-17 00:08:52 -06001694 } else if (sc->quirks & NAVIGATION_CONTROLLER) {
1695 static const __u8 navigation_leds[4] = {0x01, 0x00, 0x00, 0x00};
1696
1697 memcpy(sc->led_state, navigation_leds, sizeof(navigation_leds));
1698 sc->led_count = 1;
1699 memset(use_hw_blink, 1, 4);
1700 use_ds4_names = 0;
1701 name_len = strlen("::sony#");
1702 name_fmt = "%s::sony%d";
Frank Praznik60781cf2014-01-11 15:13:15 -05001703 } else {
Frank Praznik221399b2015-05-05 20:47:32 -04001704 sixaxis_set_leds_from_id(sc);
Frank Praznikfa57a812014-04-14 10:11:33 -04001705 sc->led_count = 4;
Frank Praznikb3ed4582014-04-14 10:11:36 -04001706 memset(use_hw_blink, 1, 4);
1707 use_ds4_names = 0;
Frank Praznik61ebca92014-01-20 12:27:02 -05001708 name_len = strlen("::sony#");
1709 name_fmt = "%s::sony%d";
Frank Praznik60781cf2014-01-11 15:13:15 -05001710 }
1711
Frank Praznikad142b92014-02-20 11:36:00 -05001712 /*
1713 * Clear LEDs as we have no way of reading their initial state. This is
Colin Leitnerf04d5142013-05-27 23:41:05 +02001714 * only relevant if the driver is loaded after somebody actively set the
Frank Praznikad142b92014-02-20 11:36:00 -05001715 * LEDs to on
1716 */
Frank Praznik221399b2015-05-05 20:47:32 -04001717 sony_set_leds(sc);
Colin Leitnerf04d5142013-05-27 23:41:05 +02001718
Sven Eckelmann0a286ef2013-11-19 20:26:32 +01001719 name_sz = strlen(dev_name(&hdev->dev)) + name_len + 1;
Colin Leitnerf04d5142013-05-27 23:41:05 +02001720
Frank Praznikfa57a812014-04-14 10:11:33 -04001721 for (n = 0; n < sc->led_count; n++) {
Frank Praznik61ebca92014-01-20 12:27:02 -05001722
Frank Praznikb3ed4582014-04-14 10:11:36 -04001723 if (use_ds4_names)
1724 name_sz = strlen(dev_name(&hdev->dev)) + strlen(ds4_name_str[n]) + 2;
Frank Praznik61ebca92014-01-20 12:27:02 -05001725
Jiri Kosina40e32ee2013-05-28 11:22:09 +02001726 led = kzalloc(sizeof(struct led_classdev) + name_sz, GFP_KERNEL);
1727 if (!led) {
1728 hid_err(hdev, "Couldn't allocate memory for LED %d\n", n);
Julia Lawall8cd5fcd2013-12-29 23:47:27 +01001729 ret = -ENOMEM;
Jiri Kosina40e32ee2013-05-28 11:22:09 +02001730 goto error_leds;
Colin Leitnerf04d5142013-05-27 23:41:05 +02001731 }
Jiri Kosina40e32ee2013-05-28 11:22:09 +02001732
1733 name = (void *)(&led[1]);
Frank Praznikb3ed4582014-04-14 10:11:36 -04001734 if (use_ds4_names)
1735 snprintf(name, name_sz, name_fmt, dev_name(&hdev->dev),
1736 ds4_name_str[n]);
Frank Praznik61ebca92014-01-20 12:27:02 -05001737 else
1738 snprintf(name, name_sz, name_fmt, dev_name(&hdev->dev), n + 1);
Jiri Kosina40e32ee2013-05-28 11:22:09 +02001739 led->name = name;
Frank Praznik221399b2015-05-05 20:47:32 -04001740 led->brightness = sc->led_state[n];
Frank Praznikb3ed4582014-04-14 10:11:36 -04001741 led->max_brightness = max_brightness[n];
Sven Eckelmannc5382512013-11-19 20:26:30 +01001742 led->brightness_get = sony_led_get_brightness;
1743 led->brightness_set = sony_led_set_brightness;
Jiri Kosina40e32ee2013-05-28 11:22:09 +02001744
Frank Praznikb3ed4582014-04-14 10:11:36 -04001745 if (use_hw_blink[n])
1746 led->blink_set = sony_led_blink_set;
1747
Frank Praznik80250872014-04-14 10:11:35 -04001748 sc->leds[n] = led;
1749
Julia Lawall8cd5fcd2013-12-29 23:47:27 +01001750 ret = led_classdev_register(&hdev->dev, led);
1751 if (ret) {
Jiri Kosina40e32ee2013-05-28 11:22:09 +02001752 hid_err(hdev, "Failed to register LED %d\n", n);
Frank Praznik80250872014-04-14 10:11:35 -04001753 sc->leds[n] = NULL;
Jiri Kosina40e32ee2013-05-28 11:22:09 +02001754 kfree(led);
1755 goto error_leds;
1756 }
Colin Leitnerf04d5142013-05-27 23:41:05 +02001757 }
Colin Leitnerf04d5142013-05-27 23:41:05 +02001758
1759 return ret;
1760
Colin Leitnerf04d5142013-05-27 23:41:05 +02001761error_leds:
Frank Praznikfa57a812014-04-14 10:11:33 -04001762 sony_leds_remove(sc);
Colin Leitnerf04d5142013-05-27 23:41:05 +02001763
Colin Leitnerf04d5142013-05-27 23:41:05 +02001764 return ret;
Colin Leitnerf04d5142013-05-27 23:41:05 +02001765}
1766
Frank Praznikcad665a2014-01-11 15:13:54 -05001767static void sixaxis_state_worker(struct work_struct *work)
Sven Eckelmanna08c22c2013-11-09 19:25:57 +01001768{
Frank Praznik9b2b5c92014-11-12 14:10:09 -05001769 static const union sixaxis_output_report_01 default_report = {
Frank Praznik55d3b662014-04-14 10:11:32 -04001770 .buf = {
1771 0x01,
1772 0x00, 0xff, 0x00, 0xff, 0x00,
1773 0x00, 0x00, 0x00, 0x00, 0x00,
1774 0xff, 0x27, 0x10, 0x00, 0x32,
1775 0xff, 0x27, 0x10, 0x00, 0x32,
1776 0xff, 0x27, 0x10, 0x00, 0x32,
1777 0xff, 0x27, 0x10, 0x00, 0x32,
1778 0x00, 0x00, 0x00, 0x00, 0x00
1779 }
Sven Eckelmanna08c22c2013-11-09 19:25:57 +01001780 };
Frank Praznik9b2b5c92014-11-12 14:10:09 -05001781 struct sony_sc *sc = container_of(work, struct sony_sc, state_worker);
1782 struct sixaxis_output_report *report =
1783 (struct sixaxis_output_report *)sc->output_report_dmabuf;
1784 int n;
1785
1786 /* Initialize the report with default values */
1787 memcpy(report, &default_report, sizeof(struct sixaxis_output_report));
Sven Eckelmann9f323b62013-11-17 20:38:21 +01001788
Sven Eckelmann0a286ef2013-11-19 20:26:32 +01001789#ifdef CONFIG_SONY_FF
Frank Praznik9b2b5c92014-11-12 14:10:09 -05001790 report->rumble.right_motor_on = sc->right ? 1 : 0;
1791 report->rumble.left_motor_force = sc->left;
Sven Eckelmann0a286ef2013-11-19 20:26:32 +01001792#endif
1793
Frank Praznik9b2b5c92014-11-12 14:10:09 -05001794 report->leds_bitmap |= sc->led_state[0] << 1;
1795 report->leds_bitmap |= sc->led_state[1] << 2;
1796 report->leds_bitmap |= sc->led_state[2] << 3;
1797 report->leds_bitmap |= sc->led_state[3] << 4;
Sven Eckelmann9f323b62013-11-17 20:38:21 +01001798
Simon Wood88f65762014-04-14 10:11:37 -04001799 /* Set flag for all leds off, required for 3rd party INTEC controller */
Frank Praznik9b2b5c92014-11-12 14:10:09 -05001800 if ((report->leds_bitmap & 0x1E) == 0)
1801 report->leds_bitmap |= 0x20;
Simon Wood88f65762014-04-14 10:11:37 -04001802
Frank Praznikb3ed4582014-04-14 10:11:36 -04001803 /*
1804 * The LEDs in the report are indexed in reverse order to their
1805 * corresponding light on the controller.
1806 * Index 0 = LED 4, index 1 = LED 3, etc...
1807 *
1808 * In the case of both delay values being zero (blinking disabled) the
1809 * default report values should be used or the controller LED will be
1810 * always off.
1811 */
1812 for (n = 0; n < 4; n++) {
1813 if (sc->led_delay_on[n] || sc->led_delay_off[n]) {
Frank Praznik9b2b5c92014-11-12 14:10:09 -05001814 report->led[3 - n].duty_off = sc->led_delay_off[n];
1815 report->led[3 - n].duty_on = sc->led_delay_on[n];
Frank Praznikb3ed4582014-04-14 10:11:36 -04001816 }
1817 }
1818
Frank Praznik9b2b5c92014-11-12 14:10:09 -05001819 hid_hw_raw_request(sc->hdev, report->report_id, (__u8 *)report,
1820 sizeof(struct sixaxis_output_report),
1821 HID_OUTPUT_REPORT, HID_REQ_SET_REPORT);
Sven Eckelmann9f323b62013-11-17 20:38:21 +01001822}
1823
Frank Praznik0bd88dd2014-01-11 15:12:42 -05001824static void dualshock4_state_worker(struct work_struct *work)
1825{
1826 struct sony_sc *sc = container_of(work, struct sony_sc, state_worker);
Frank Praznik0da8ea62014-01-16 21:42:51 -05001827 struct hid_device *hdev = sc->hdev;
Frank Praznik9b2b5c92014-11-12 14:10:09 -05001828 __u8 *buf = sc->output_report_dmabuf;
Frank Praznik48220232014-02-05 20:03:44 -05001829 int offset;
Frank Praznik0da8ea62014-01-16 21:42:51 -05001830
Frank Praznikfdcf105d2014-02-05 20:03:46 -05001831 if (sc->quirks & DUALSHOCK4_CONTROLLER_USB) {
Frank Praznik9b2b5c92014-11-12 14:10:09 -05001832 memset(buf, 0, DS4_REPORT_0x05_SIZE);
Frank Praznikfdcf105d2014-02-05 20:03:46 -05001833 buf[0] = 0x05;
Frank Praznikb3ed4582014-04-14 10:11:36 -04001834 buf[1] = 0xFF;
Frank Praznikfdcf105d2014-02-05 20:03:46 -05001835 offset = 4;
1836 } else {
Frank Praznik9b2b5c92014-11-12 14:10:09 -05001837 memset(buf, 0, DS4_REPORT_0x11_SIZE);
Frank Praznikfdcf105d2014-02-05 20:03:46 -05001838 buf[0] = 0x11;
1839 buf[1] = 0xB0;
1840 buf[3] = 0x0F;
1841 offset = 6;
1842 }
Frank Praznik0bd88dd2014-01-11 15:12:42 -05001843
1844#ifdef CONFIG_SONY_FF
Frank Praznik48220232014-02-05 20:03:44 -05001845 buf[offset++] = sc->right;
1846 buf[offset++] = sc->left;
1847#else
1848 offset += 2;
Frank Praznik0bd88dd2014-01-11 15:12:42 -05001849#endif
1850
Frank Praznikb3ed4582014-04-14 10:11:36 -04001851 /* LED 3 is the global control */
1852 if (sc->led_state[3]) {
1853 buf[offset++] = sc->led_state[0];
1854 buf[offset++] = sc->led_state[1];
1855 buf[offset++] = sc->led_state[2];
1856 } else {
1857 offset += 3;
1858 }
1859
1860 /* If both delay values are zero the DualShock 4 disables blinking. */
1861 buf[offset++] = sc->led_delay_on[3];
1862 buf[offset++] = sc->led_delay_off[3];
Frank Praznik60781cf2014-01-11 15:13:15 -05001863
Frank Praznikfdcf105d2014-02-05 20:03:46 -05001864 if (sc->quirks & DUALSHOCK4_CONTROLLER_USB)
Frank Praznik9b2b5c92014-11-12 14:10:09 -05001865 hid_hw_output_report(hdev, buf, DS4_REPORT_0x05_SIZE);
Frank Praznikfdcf105d2014-02-05 20:03:46 -05001866 else
Frank Praznik9b2b5c92014-11-12 14:10:09 -05001867 hid_hw_raw_request(hdev, 0x11, buf, DS4_REPORT_0x11_SIZE,
Frank Praznikfdcf105d2014-02-05 20:03:46 -05001868 HID_OUTPUT_REPORT, HID_REQ_SET_REPORT);
Frank Praznik0bd88dd2014-01-11 15:12:42 -05001869}
1870
Frank Praznikc5e0c1c2015-05-05 20:47:30 -04001871static void motion_state_worker(struct work_struct *work)
1872{
1873 struct sony_sc *sc = container_of(work, struct sony_sc, state_worker);
1874 struct hid_device *hdev = sc->hdev;
1875 struct motion_output_report_02 *report =
1876 (struct motion_output_report_02 *)sc->output_report_dmabuf;
1877
Simon Wood41d2d422015-06-09 21:27:06 -06001878 memset(report, 0, MOTION_REPORT_0x02_SIZE);
Frank Praznikc5e0c1c2015-05-05 20:47:30 -04001879
1880 report->type = 0x02; /* set leds */
1881 report->r = sc->led_state[0];
1882 report->g = sc->led_state[1];
1883 report->b = sc->led_state[2];
1884
1885#ifdef CONFIG_SONY_FF
1886 report->rumble = max(sc->right, sc->left);
1887#endif
1888
Simon Wood41d2d422015-06-09 21:27:06 -06001889 hid_hw_output_report(hdev, (__u8 *)report, MOTION_REPORT_0x02_SIZE);
Frank Praznikc5e0c1c2015-05-05 20:47:30 -04001890}
1891
Frank Praznik9b2b5c92014-11-12 14:10:09 -05001892static int sony_allocate_output_report(struct sony_sc *sc)
1893{
Simon Wood4545ee02015-06-17 00:08:52 -06001894 if ((sc->quirks & SIXAXIS_CONTROLLER) ||
1895 (sc->quirks & NAVIGATION_CONTROLLER))
Frank Praznik9b2b5c92014-11-12 14:10:09 -05001896 sc->output_report_dmabuf =
1897 kmalloc(sizeof(union sixaxis_output_report_01),
1898 GFP_KERNEL);
1899 else if (sc->quirks & DUALSHOCK4_CONTROLLER_BT)
1900 sc->output_report_dmabuf = kmalloc(DS4_REPORT_0x11_SIZE,
1901 GFP_KERNEL);
1902 else if (sc->quirks & DUALSHOCK4_CONTROLLER_USB)
1903 sc->output_report_dmabuf = kmalloc(DS4_REPORT_0x05_SIZE,
1904 GFP_KERNEL);
Frank Praznikc5e0c1c2015-05-05 20:47:30 -04001905 else if (sc->quirks & MOTION_CONTROLLER)
Simon Wood41d2d422015-06-09 21:27:06 -06001906 sc->output_report_dmabuf = kmalloc(MOTION_REPORT_0x02_SIZE,
1907 GFP_KERNEL);
Frank Praznik9b2b5c92014-11-12 14:10:09 -05001908 else
1909 return 0;
1910
1911 if (!sc->output_report_dmabuf)
1912 return -ENOMEM;
1913
1914 return 0;
1915}
1916
Sven Eckelmann0a286ef2013-11-19 20:26:32 +01001917#ifdef CONFIG_SONY_FF
Sven Eckelmann9f323b62013-11-17 20:38:21 +01001918static int sony_play_effect(struct input_dev *dev, void *data,
1919 struct ff_effect *effect)
1920{
Sven Eckelmanna08c22c2013-11-09 19:25:57 +01001921 struct hid_device *hid = input_get_drvdata(dev);
Sven Eckelmann9f323b62013-11-17 20:38:21 +01001922 struct sony_sc *sc = hid_get_drvdata(hid);
Sven Eckelmanna08c22c2013-11-09 19:25:57 +01001923
1924 if (effect->type != FF_RUMBLE)
1925 return 0;
1926
Sven Eckelmann9f323b62013-11-17 20:38:21 +01001927 sc->left = effect->u.rumble.strong_magnitude / 256;
Frank Praznik0bd88dd2014-01-11 15:12:42 -05001928 sc->right = effect->u.rumble.weak_magnitude / 256;
Sven Eckelmanna08c22c2013-11-09 19:25:57 +01001929
Sven Eckelmann92b5c412013-11-19 20:26:28 +01001930 schedule_work(&sc->state_worker);
Sven Eckelmann9f323b62013-11-17 20:38:21 +01001931 return 0;
Sven Eckelmanna08c22c2013-11-09 19:25:57 +01001932}
1933
Frank Praznikfa57a812014-04-14 10:11:33 -04001934static int sony_init_ff(struct sony_sc *sc)
Sven Eckelmanna08c22c2013-11-09 19:25:57 +01001935{
Frank Praznikfa57a812014-04-14 10:11:33 -04001936 struct hid_input *hidinput = list_entry(sc->hdev->inputs.next,
Sven Eckelmanna08c22c2013-11-09 19:25:57 +01001937 struct hid_input, list);
1938 struct input_dev *input_dev = hidinput->input;
1939
1940 input_set_capability(input_dev, EV_FF, FF_RUMBLE);
1941 return input_ff_create_memless(input_dev, NULL, sony_play_effect);
1942}
1943
1944#else
Frank Praznikfa57a812014-04-14 10:11:33 -04001945static int sony_init_ff(struct sony_sc *sc)
Sven Eckelmanna08c22c2013-11-09 19:25:57 +01001946{
1947 return 0;
1948}
Sven Eckelmann9f323b62013-11-17 20:38:21 +01001949
Sven Eckelmanna08c22c2013-11-09 19:25:57 +01001950#endif
1951
Frank Praznikd902f472014-01-27 10:17:36 -05001952static int sony_battery_get_property(struct power_supply *psy,
1953 enum power_supply_property psp,
1954 union power_supply_propval *val)
Frank Praznikc4e1ddf2014-01-17 14:46:26 -05001955{
Krzysztof Kozlowski297d7162015-03-12 08:44:11 +01001956 struct sony_sc *sc = power_supply_get_drvdata(psy);
Frank Praznikd902f472014-01-27 10:17:36 -05001957 unsigned long flags;
1958 int ret = 0;
1959 u8 battery_charging, battery_capacity, cable_state;
1960
1961 spin_lock_irqsave(&sc->lock, flags);
1962 battery_charging = sc->battery_charging;
1963 battery_capacity = sc->battery_capacity;
1964 cable_state = sc->cable_state;
1965 spin_unlock_irqrestore(&sc->lock, flags);
1966
1967 switch (psp) {
1968 case POWER_SUPPLY_PROP_PRESENT:
1969 val->intval = 1;
1970 break;
1971 case POWER_SUPPLY_PROP_SCOPE:
1972 val->intval = POWER_SUPPLY_SCOPE_DEVICE;
1973 break;
1974 case POWER_SUPPLY_PROP_CAPACITY:
1975 val->intval = battery_capacity;
1976 break;
1977 case POWER_SUPPLY_PROP_STATUS:
1978 if (battery_charging)
1979 val->intval = POWER_SUPPLY_STATUS_CHARGING;
1980 else
1981 if (battery_capacity == 100 && cable_state)
1982 val->intval = POWER_SUPPLY_STATUS_FULL;
1983 else
1984 val->intval = POWER_SUPPLY_STATUS_DISCHARGING;
1985 break;
1986 default:
1987 ret = -EINVAL;
1988 break;
1989 }
1990 return ret;
1991}
1992
1993static int sony_battery_probe(struct sony_sc *sc)
1994{
Krzysztof Kozlowski297d7162015-03-12 08:44:11 +01001995 struct power_supply_config psy_cfg = { .drv_data = sc, };
Frank Praznikc4e1ddf2014-01-17 14:46:26 -05001996 struct hid_device *hdev = sc->hdev;
Frank Praznikd902f472014-01-27 10:17:36 -05001997 int ret;
Frank Praznikc4e1ddf2014-01-17 14:46:26 -05001998
Frank Praznikad142b92014-02-20 11:36:00 -05001999 /*
2000 * Set the default battery level to 100% to avoid low battery warnings
Frank Praznikd9a293a2014-02-05 20:03:48 -05002001 * if the battery is polled before the first device report is received.
2002 */
2003 sc->battery_capacity = 100;
Frank Praznikc4e1ddf2014-01-17 14:46:26 -05002004
Krzysztof Kozlowski297d7162015-03-12 08:44:11 +01002005 sc->battery_desc.properties = sony_battery_props;
2006 sc->battery_desc.num_properties = ARRAY_SIZE(sony_battery_props);
2007 sc->battery_desc.get_property = sony_battery_get_property;
2008 sc->battery_desc.type = POWER_SUPPLY_TYPE_BATTERY;
2009 sc->battery_desc.use_for_apm = 0;
2010 sc->battery_desc.name = kasprintf(GFP_KERNEL,
2011 "sony_controller_battery_%pMR",
2012 sc->mac_address);
2013 if (!sc->battery_desc.name)
Frank Praznikd902f472014-01-27 10:17:36 -05002014 return -ENOMEM;
2015
Krzysztof Kozlowski297d7162015-03-12 08:44:11 +01002016 sc->battery = power_supply_register(&hdev->dev, &sc->battery_desc,
2017 &psy_cfg);
2018 if (IS_ERR(sc->battery)) {
2019 ret = PTR_ERR(sc->battery);
Frank Praznikd902f472014-01-27 10:17:36 -05002020 hid_err(hdev, "Unable to register battery device\n");
2021 goto err_free;
2022 }
2023
Krzysztof Kozlowski297d7162015-03-12 08:44:11 +01002024 power_supply_powers(sc->battery, &hdev->dev);
Frank Praznikd902f472014-01-27 10:17:36 -05002025 return 0;
2026
2027err_free:
Krzysztof Kozlowski297d7162015-03-12 08:44:11 +01002028 kfree(sc->battery_desc.name);
2029 sc->battery_desc.name = NULL;
Frank Praznikd902f472014-01-27 10:17:36 -05002030 return ret;
2031}
2032
2033static void sony_battery_remove(struct sony_sc *sc)
2034{
Krzysztof Kozlowski297d7162015-03-12 08:44:11 +01002035 if (!sc->battery_desc.name)
Frank Praznikd902f472014-01-27 10:17:36 -05002036 return;
2037
Krzysztof Kozlowski297d7162015-03-12 08:44:11 +01002038 power_supply_unregister(sc->battery);
2039 kfree(sc->battery_desc.name);
2040 sc->battery_desc.name = NULL;
Frank Praznikd902f472014-01-27 10:17:36 -05002041}
2042
Frank Praznikd2d782f2014-02-20 11:36:03 -05002043/*
2044 * If a controller is plugged in via USB while already connected via Bluetooth
2045 * it will show up as two devices. A global list of connected controllers and
2046 * their MAC addresses is maintained to ensure that a device is only connected
2047 * once.
2048 */
2049static int sony_check_add_dev_list(struct sony_sc *sc)
2050{
2051 struct sony_sc *entry;
2052 unsigned long flags;
2053 int ret;
2054
2055 spin_lock_irqsave(&sony_dev_list_lock, flags);
2056
2057 list_for_each_entry(entry, &sony_device_list, list_node) {
2058 ret = memcmp(sc->mac_address, entry->mac_address,
2059 sizeof(sc->mac_address));
2060 if (!ret) {
2061 ret = -EEXIST;
2062 hid_info(sc->hdev, "controller with MAC address %pMR already connected\n",
2063 sc->mac_address);
2064 goto unlock;
Frank Praznikc4e1ddf2014-01-17 14:46:26 -05002065 }
2066 }
2067
Frank Praznikd2d782f2014-02-20 11:36:03 -05002068 ret = 0;
2069 list_add(&(sc->list_node), &sony_device_list);
Frank Praznikc4e1ddf2014-01-17 14:46:26 -05002070
Frank Praznikd2d782f2014-02-20 11:36:03 -05002071unlock:
2072 spin_unlock_irqrestore(&sony_dev_list_lock, flags);
2073 return ret;
Frank Praznikc4e1ddf2014-01-17 14:46:26 -05002074}
2075
Frank Praznikd2d782f2014-02-20 11:36:03 -05002076static void sony_remove_dev_list(struct sony_sc *sc)
2077{
2078 unsigned long flags;
2079
2080 if (sc->list_node.next) {
2081 spin_lock_irqsave(&sony_dev_list_lock, flags);
2082 list_del(&(sc->list_node));
2083 spin_unlock_irqrestore(&sony_dev_list_lock, flags);
2084 }
2085}
2086
2087static int sony_get_bt_devaddr(struct sony_sc *sc)
2088{
2089 int ret;
2090
2091 /* HIDP stores the device MAC address as a string in the uniq field. */
2092 ret = strlen(sc->hdev->uniq);
2093 if (ret != 17)
2094 return -EINVAL;
2095
2096 ret = sscanf(sc->hdev->uniq,
2097 "%02hhx:%02hhx:%02hhx:%02hhx:%02hhx:%02hhx",
2098 &sc->mac_address[5], &sc->mac_address[4], &sc->mac_address[3],
2099 &sc->mac_address[2], &sc->mac_address[1], &sc->mac_address[0]);
2100
2101 if (ret != 6)
2102 return -EINVAL;
2103
2104 return 0;
2105}
2106
2107static int sony_check_add(struct sony_sc *sc)
2108{
Frank Praznik9b2b5c92014-11-12 14:10:09 -05002109 __u8 *buf = NULL;
Frank Praznikd2d782f2014-02-20 11:36:03 -05002110 int n, ret;
2111
2112 if ((sc->quirks & DUALSHOCK4_CONTROLLER_BT) ||
Simon Wood12e9a6d72015-06-09 21:27:05 -06002113 (sc->quirks & MOTION_CONTROLLER_BT) ||
Simon Wood4545ee02015-06-17 00:08:52 -06002114 (sc->quirks & NAVIGATION_CONTROLLER_BT) ||
Frank Praznikd2d782f2014-02-20 11:36:03 -05002115 (sc->quirks & SIXAXIS_CONTROLLER_BT)) {
2116 /*
2117 * sony_get_bt_devaddr() attempts to parse the Bluetooth MAC
2118 * address from the uniq string where HIDP stores it.
2119 * As uniq cannot be guaranteed to be a MAC address in all cases
2120 * a failure of this function should not prevent the connection.
2121 */
2122 if (sony_get_bt_devaddr(sc) < 0) {
2123 hid_warn(sc->hdev, "UNIQ does not contain a MAC address; duplicate check skipped\n");
2124 return 0;
2125 }
2126 } else if (sc->quirks & DUALSHOCK4_CONTROLLER_USB) {
Frank Praznik9b2b5c92014-11-12 14:10:09 -05002127 buf = kmalloc(DS4_REPORT_0x81_SIZE, GFP_KERNEL);
2128 if (!buf)
2129 return -ENOMEM;
Frank Praznikd2d782f2014-02-20 11:36:03 -05002130
2131 /*
2132 * The MAC address of a DS4 controller connected via USB can be
2133 * retrieved with feature report 0x81. The address begins at
2134 * offset 1.
2135 */
Frank Praznik9b2b5c92014-11-12 14:10:09 -05002136 ret = hid_hw_raw_request(sc->hdev, 0x81, buf,
2137 DS4_REPORT_0x81_SIZE, HID_FEATURE_REPORT,
2138 HID_REQ_GET_REPORT);
Frank Praznikd2d782f2014-02-20 11:36:03 -05002139
Frank Praznik9b2b5c92014-11-12 14:10:09 -05002140 if (ret != DS4_REPORT_0x81_SIZE) {
Frank Praznikd2d782f2014-02-20 11:36:03 -05002141 hid_err(sc->hdev, "failed to retrieve feature report 0x81 with the DualShock 4 MAC address\n");
Frank Praznik9b2b5c92014-11-12 14:10:09 -05002142 ret = ret < 0 ? ret : -EINVAL;
2143 goto out_free;
Frank Praznikd2d782f2014-02-20 11:36:03 -05002144 }
2145
2146 memcpy(sc->mac_address, &buf[1], sizeof(sc->mac_address));
Simon Wood4545ee02015-06-17 00:08:52 -06002147 } else if ((sc->quirks & SIXAXIS_CONTROLLER_USB) ||
2148 (sc->quirks & NAVIGATION_CONTROLLER_USB)) {
Frank Praznik9b2b5c92014-11-12 14:10:09 -05002149 buf = kmalloc(SIXAXIS_REPORT_0xF2_SIZE, GFP_KERNEL);
2150 if (!buf)
2151 return -ENOMEM;
Frank Praznikd2d782f2014-02-20 11:36:03 -05002152
2153 /*
2154 * The MAC address of a Sixaxis controller connected via USB can
2155 * be retrieved with feature report 0xf2. The address begins at
2156 * offset 4.
2157 */
Frank Praznik9b2b5c92014-11-12 14:10:09 -05002158 ret = hid_hw_raw_request(sc->hdev, 0xf2, buf,
2159 SIXAXIS_REPORT_0xF2_SIZE, HID_FEATURE_REPORT,
2160 HID_REQ_GET_REPORT);
Frank Praznikd2d782f2014-02-20 11:36:03 -05002161
Frank Praznik9b2b5c92014-11-12 14:10:09 -05002162 if (ret != SIXAXIS_REPORT_0xF2_SIZE) {
Frank Praznikd2d782f2014-02-20 11:36:03 -05002163 hid_err(sc->hdev, "failed to retrieve feature report 0xf2 with the Sixaxis MAC address\n");
Frank Praznik9b2b5c92014-11-12 14:10:09 -05002164 ret = ret < 0 ? ret : -EINVAL;
2165 goto out_free;
Frank Praznikd2d782f2014-02-20 11:36:03 -05002166 }
2167
2168 /*
2169 * The Sixaxis device MAC in the report is big-endian and must
2170 * be byte-swapped.
2171 */
2172 for (n = 0; n < 6; n++)
2173 sc->mac_address[5-n] = buf[4+n];
2174 } else {
2175 return 0;
2176 }
2177
Frank Praznik9b2b5c92014-11-12 14:10:09 -05002178 ret = sony_check_add_dev_list(sc);
2179
2180out_free:
2181
2182 kfree(buf);
2183
2184 return ret;
Frank Praznikd2d782f2014-02-20 11:36:03 -05002185}
2186
Frank Praznik80250872014-04-14 10:11:35 -04002187static int sony_set_device_id(struct sony_sc *sc)
2188{
2189 int ret;
2190
2191 /*
2192 * Only DualShock 4 or Sixaxis controllers get an id.
2193 * All others are set to -1.
2194 */
2195 if ((sc->quirks & SIXAXIS_CONTROLLER) ||
2196 (sc->quirks & DUALSHOCK4_CONTROLLER)) {
2197 ret = ida_simple_get(&sony_device_id_allocator, 0, 0,
2198 GFP_KERNEL);
2199 if (ret < 0) {
2200 sc->device_id = -1;
2201 return ret;
2202 }
2203 sc->device_id = ret;
2204 } else {
2205 sc->device_id = -1;
2206 }
2207
2208 return 0;
2209}
2210
2211static void sony_release_device_id(struct sony_sc *sc)
2212{
2213 if (sc->device_id >= 0) {
2214 ida_simple_remove(&sony_device_id_allocator, sc->device_id);
2215 sc->device_id = -1;
2216 }
2217}
2218
Frank Praznik46262042014-04-14 10:11:31 -04002219static inline void sony_init_work(struct sony_sc *sc,
2220 void (*worker)(struct work_struct *))
2221{
2222 if (!sc->worker_initialized)
2223 INIT_WORK(&sc->state_worker, worker);
2224
2225 sc->worker_initialized = 1;
2226}
2227
2228static inline void sony_cancel_work_sync(struct sony_sc *sc)
2229{
2230 if (sc->worker_initialized)
2231 cancel_work_sync(&sc->state_worker);
2232}
Frank Praznikd2d782f2014-02-20 11:36:03 -05002233
Jiri Slabybd28ce02008-06-25 23:47:04 +02002234static int sony_probe(struct hid_device *hdev, const struct hid_device_id *id)
2235{
2236 int ret;
Jiri Kosinacc6e0bb2008-10-23 12:58:38 +02002237 unsigned long quirks = id->driver_data;
2238 struct sony_sc *sc;
Colin Leitnerf04d5142013-05-27 23:41:05 +02002239 unsigned int connect_mask = HID_CONNECT_DEFAULT;
Jiri Kosinacc6e0bb2008-10-23 12:58:38 +02002240
Benjamin Tissoiresabf832b2013-07-24 19:38:04 +02002241 sc = devm_kzalloc(&hdev->dev, sizeof(*sc), GFP_KERNEL);
Jiri Kosinacc6e0bb2008-10-23 12:58:38 +02002242 if (sc == NULL) {
Joe Perches4291ee32010-12-09 19:29:03 -08002243 hid_err(hdev, "can't alloc sony descriptor\n");
Jiri Kosinacc6e0bb2008-10-23 12:58:38 +02002244 return -ENOMEM;
2245 }
2246
Frank Praznikb94993f2015-02-22 20:42:46 -05002247 spin_lock_init(&sc->lock);
2248
Jiri Kosinacc6e0bb2008-10-23 12:58:38 +02002249 sc->quirks = quirks;
2250 hid_set_drvdata(hdev, sc);
Sven Eckelmann0a286ef2013-11-19 20:26:32 +01002251 sc->hdev = hdev;
Jiri Slabybd28ce02008-06-25 23:47:04 +02002252
Jiri Slabybd28ce02008-06-25 23:47:04 +02002253 ret = hid_parse(hdev);
2254 if (ret) {
Joe Perches4291ee32010-12-09 19:29:03 -08002255 hid_err(hdev, "parse failed\n");
Benjamin Tissoiresabf832b2013-07-24 19:38:04 +02002256 return ret;
Jiri Slabybd28ce02008-06-25 23:47:04 +02002257 }
2258
Colin Leitnerf04d5142013-05-27 23:41:05 +02002259 if (sc->quirks & VAIO_RDESC_CONSTANT)
2260 connect_mask |= HID_CONNECT_HIDDEV_FORCE;
Antonio Ospite50764652014-06-24 13:28:40 +02002261 else if (sc->quirks & SIXAXIS_CONTROLLER)
Colin Leitnerf04d5142013-05-27 23:41:05 +02002262 connect_mask |= HID_CONNECT_HIDDEV_FORCE;
2263
2264 ret = hid_hw_start(hdev, connect_mask);
Jiri Slabybd28ce02008-06-25 23:47:04 +02002265 if (ret) {
Joe Perches4291ee32010-12-09 19:29:03 -08002266 hid_err(hdev, "hw start failed\n");
Benjamin Tissoiresabf832b2013-07-24 19:38:04 +02002267 return ret;
Jiri Slabybd28ce02008-06-25 23:47:04 +02002268 }
2269
Frank Praznik80250872014-04-14 10:11:35 -04002270 ret = sony_set_device_id(sc);
2271 if (ret < 0) {
2272 hid_err(hdev, "failed to allocate the device id\n");
2273 goto err_stop;
2274 }
2275
Frank Praznik131a8a92015-05-05 20:47:28 -04002276 ret = sony_allocate_output_report(sc);
2277 if (ret < 0) {
2278 hid_err(hdev, "failed to allocate the output report buffer\n");
2279 goto err_stop;
2280 }
2281
Simon Wood4545ee02015-06-17 00:08:52 -06002282 if ((sc->quirks & SIXAXIS_CONTROLLER_USB) ||
2283 (sc->quirks & NAVIGATION_CONTROLLER_USB)) {
Benjamin Tissoirese534a932014-03-08 22:52:42 -05002284 /*
2285 * The Sony Sixaxis does not handle HID Output Reports on the
2286 * Interrupt EP like it could, so we need to force HID Output
2287 * Reports to use HID_REQ_SET_REPORT on the Control EP.
2288 *
2289 * There is also another issue about HID Output Reports via USB,
2290 * the Sixaxis does not want the report_id as part of the data
2291 * packet, so we have to discard buf[0] when sending the actual
2292 * control message, even for numbered reports, humpf!
2293 */
2294 hdev->quirks |= HID_QUIRK_NO_OUTPUT_REPORTS_ON_INTR_EP;
2295 hdev->quirks |= HID_QUIRK_SKIP_OUTPUT_REPORT_ID;
Antonio Ospite816651a2010-05-03 22:15:55 +02002296 ret = sixaxis_set_operational_usb(hdev);
Frank Praznik46262042014-04-14 10:11:31 -04002297 sony_init_work(sc, sixaxis_state_worker);
Simon Wood4545ee02015-06-17 00:08:52 -06002298 } else if ((sc->quirks & SIXAXIS_CONTROLLER_BT) ||
2299 (sc->quirks & NAVIGATION_CONTROLLER_BT)) {
Frank Praznik2078b9b2014-03-15 09:41:16 -04002300 /*
2301 * The Sixaxis wants output reports sent on the ctrl endpoint
2302 * when connected via Bluetooth.
2303 */
2304 hdev->quirks |= HID_QUIRK_NO_OUTPUT_REPORTS_ON_INTR_EP;
Antonio Ospite816651a2010-05-03 22:15:55 +02002305 ret = sixaxis_set_operational_bt(hdev);
Frank Praznik46262042014-04-14 10:11:31 -04002306 sony_init_work(sc, sixaxis_state_worker);
Frank Praznikfee4e2d2014-02-18 17:22:01 -05002307 } else if (sc->quirks & DUALSHOCK4_CONTROLLER) {
Frank Praznik68330d82014-02-05 20:03:49 -05002308 if (sc->quirks & DUALSHOCK4_CONTROLLER_BT) {
Frank Praznik2078b9b2014-03-15 09:41:16 -04002309 /*
2310 * The DualShock 4 wants output reports sent on the ctrl
2311 * endpoint when connected via Bluetooth.
2312 */
2313 hdev->quirks |= HID_QUIRK_NO_OUTPUT_REPORTS_ON_INTR_EP;
Frank Praznik68330d82014-02-05 20:03:49 -05002314 ret = dualshock4_set_operational_bt(hdev);
2315 if (ret < 0) {
2316 hid_err(hdev, "failed to set the Dualshock 4 operational mode\n");
2317 goto err_stop;
2318 }
2319 }
Frank Praznikc4e1ddf2014-01-17 14:46:26 -05002320
Frank Praznik46262042014-04-14 10:11:31 -04002321 sony_init_work(sc, dualshock4_state_worker);
Frank Praznikc5e0c1c2015-05-05 20:47:30 -04002322 } else if (sc->quirks & MOTION_CONTROLLER) {
2323 sony_init_work(sc, motion_state_worker);
Frank Praznik0bd88dd2014-01-11 15:12:42 -05002324 } else {
2325 ret = 0;
2326 }
Bastien Noceraf9ce7c22010-01-20 12:01:53 +00002327
Jiri Kosina4dfdc462008-12-30 00:49:59 +01002328 if (ret < 0)
Jiri Slabybd28ce02008-06-25 23:47:04 +02002329 goto err_stop;
2330
Frank Praznikd2d782f2014-02-20 11:36:03 -05002331 ret = sony_check_add(sc);
2332 if (ret < 0)
2333 goto err_stop;
2334
Sven Eckelmann0a286ef2013-11-19 20:26:32 +01002335 if (sc->quirks & SONY_LED_SUPPORT) {
Frank Praznikfa57a812014-04-14 10:11:33 -04002336 ret = sony_leds_init(sc);
Sven Eckelmann0a286ef2013-11-19 20:26:32 +01002337 if (ret < 0)
2338 goto err_stop;
2339 }
2340
Frank Praznikd902f472014-01-27 10:17:36 -05002341 if (sc->quirks & SONY_BATTERY_SUPPORT) {
2342 ret = sony_battery_probe(sc);
2343 if (ret < 0)
2344 goto err_stop;
2345
2346 /* Open the device to receive reports with battery info */
2347 ret = hid_hw_open(hdev);
2348 if (ret < 0) {
2349 hid_err(hdev, "hw open failed\n");
2350 goto err_stop;
2351 }
2352 }
2353
Frank Praznikc8de9db2014-02-20 11:36:01 -05002354 if (sc->quirks & SONY_FF_SUPPORT) {
Frank Praznikfa57a812014-04-14 10:11:33 -04002355 ret = sony_init_ff(sc);
Frank Praznikc8de9db2014-02-20 11:36:01 -05002356 if (ret < 0)
2357 goto err_close;
Frank Praznik5f5750d2014-02-19 13:09:22 -05002358 }
Sven Eckelmanna08c22c2013-11-09 19:25:57 +01002359
Jiri Slabybd28ce02008-06-25 23:47:04 +02002360 return 0;
Frank Praznikd902f472014-01-27 10:17:36 -05002361err_close:
2362 hid_hw_close(hdev);
Jiri Slabybd28ce02008-06-25 23:47:04 +02002363err_stop:
Sven Eckelmann0a286ef2013-11-19 20:26:32 +01002364 if (sc->quirks & SONY_LED_SUPPORT)
Frank Praznikfa57a812014-04-14 10:11:33 -04002365 sony_leds_remove(sc);
Frank Praznikd902f472014-01-27 10:17:36 -05002366 if (sc->quirks & SONY_BATTERY_SUPPORT)
2367 sony_battery_remove(sc);
Frank Praznik46262042014-04-14 10:11:31 -04002368 sony_cancel_work_sync(sc);
Frank Praznik9b2b5c92014-11-12 14:10:09 -05002369 kfree(sc->output_report_dmabuf);
Frank Praznikd2d782f2014-02-20 11:36:03 -05002370 sony_remove_dev_list(sc);
Frank Praznik80250872014-04-14 10:11:35 -04002371 sony_release_device_id(sc);
Jiri Slabybd28ce02008-06-25 23:47:04 +02002372 hid_hw_stop(hdev);
Jiri Slabybd28ce02008-06-25 23:47:04 +02002373 return ret;
2374}
2375
Jiri Kosinacc6e0bb2008-10-23 12:58:38 +02002376static void sony_remove(struct hid_device *hdev)
2377{
Colin Leitnerf04d5142013-05-27 23:41:05 +02002378 struct sony_sc *sc = hid_get_drvdata(hdev);
2379
Sven Eckelmann0a286ef2013-11-19 20:26:32 +01002380 if (sc->quirks & SONY_LED_SUPPORT)
Frank Praznikfa57a812014-04-14 10:11:33 -04002381 sony_leds_remove(sc);
Colin Leitnerf04d5142013-05-27 23:41:05 +02002382
Frank Praznikd902f472014-01-27 10:17:36 -05002383 if (sc->quirks & SONY_BATTERY_SUPPORT) {
2384 hid_hw_close(hdev);
2385 sony_battery_remove(sc);
2386 }
2387
Frank Praznik46262042014-04-14 10:11:31 -04002388 sony_cancel_work_sync(sc);
Sven Eckelmann9f323b62013-11-17 20:38:21 +01002389
Frank Praznik9b2b5c92014-11-12 14:10:09 -05002390 kfree(sc->output_report_dmabuf);
2391
Frank Praznikd2d782f2014-02-20 11:36:03 -05002392 sony_remove_dev_list(sc);
Jiri Slabybd28ce02008-06-25 23:47:04 +02002393
Frank Praznik80250872014-04-14 10:11:35 -04002394 sony_release_device_id(sc);
2395
Jiri Slabybd28ce02008-06-25 23:47:04 +02002396 hid_hw_stop(hdev);
2397}
2398
2399static const struct hid_device_id sony_devices[] = {
2400 { HID_USB_DEVICE(USB_VENDOR_ID_SONY, USB_DEVICE_ID_SONY_PS3_CONTROLLER),
2401 .driver_data = SIXAXIS_CONTROLLER_USB },
2402 { HID_USB_DEVICE(USB_VENDOR_ID_SONY, USB_DEVICE_ID_SONY_NAVIGATION_CONTROLLER),
Simon Wood4545ee02015-06-17 00:08:52 -06002403 .driver_data = NAVIGATION_CONTROLLER_USB },
Simon Wood6eabaaa2015-06-17 00:08:51 -06002404 { HID_BLUETOOTH_DEVICE(USB_VENDOR_ID_SONY, USB_DEVICE_ID_SONY_NAVIGATION_CONTROLLER),
Simon Wood4545ee02015-06-17 00:08:52 -06002405 .driver_data = NAVIGATION_CONTROLLER_BT },
Frank Praznikc5e0c1c2015-05-05 20:47:30 -04002406 { HID_USB_DEVICE(USB_VENDOR_ID_SONY, USB_DEVICE_ID_SONY_MOTION_CONTROLLER),
Simon Woodb3bca322015-06-09 21:27:04 -06002407 .driver_data = MOTION_CONTROLLER_USB },
Simon Wooda4afa852015-06-03 09:45:19 -06002408 { HID_BLUETOOTH_DEVICE(USB_VENDOR_ID_SONY, USB_DEVICE_ID_SONY_MOTION_CONTROLLER),
Simon Woodb3bca322015-06-09 21:27:04 -06002409 .driver_data = MOTION_CONTROLLER_BT },
Jiri Slabybd28ce02008-06-25 23:47:04 +02002410 { HID_BLUETOOTH_DEVICE(USB_VENDOR_ID_SONY, USB_DEVICE_ID_SONY_PS3_CONTROLLER),
2411 .driver_data = SIXAXIS_CONTROLLER_BT },
2412 { HID_USB_DEVICE(USB_VENDOR_ID_SONY, USB_DEVICE_ID_SONY_VAIO_VGX_MOUSE),
2413 .driver_data = VAIO_RDESC_CONSTANT },
2414 { HID_USB_DEVICE(USB_VENDOR_ID_SONY, USB_DEVICE_ID_SONY_VAIO_VGP_MOUSE),
2415 .driver_data = VAIO_RDESC_CONSTANT },
2416 /* Wired Buzz Controller. Reported as Sony Hub from its USB ID and as
2417 * Logitech joystick from the device descriptor. */
2418 { HID_USB_DEVICE(USB_VENDOR_ID_SONY, USB_DEVICE_ID_SONY_BUZZ_CONTROLLER),
2419 .driver_data = BUZZ_CONTROLLER },
2420 { HID_USB_DEVICE(USB_VENDOR_ID_SONY, USB_DEVICE_ID_SONY_WIRELESS_BUZZ_CONTROLLER),
2421 .driver_data = BUZZ_CONTROLLER },
2422 /* PS3 BD Remote Control */
2423 { HID_BLUETOOTH_DEVICE(USB_VENDOR_ID_SONY, USB_DEVICE_ID_SONY_PS3_BDREMOTE),
2424 .driver_data = PS3REMOTE },
2425 /* Logitech Harmony Adapter for PS3 */
2426 { HID_BLUETOOTH_DEVICE(USB_VENDOR_ID_LOGITECH, USB_DEVICE_ID_LOGITECH_HARMONY_PS3),
2427 .driver_data = PS3REMOTE },
Frank Praznik68a49e52014-11-12 14:52:28 -05002428 /* SMK-Link PS3 BD Remote Control */
2429 { HID_BLUETOOTH_DEVICE(USB_VENDOR_ID_SMK, USB_DEVICE_ID_SMK_PS3_BDREMOTE),
2430 .driver_data = PS3REMOTE },
Frank Praznik0bd88dd2014-01-11 15:12:42 -05002431 /* Sony Dualshock 4 controllers for PS4 */
2432 { HID_USB_DEVICE(USB_VENDOR_ID_SONY, USB_DEVICE_ID_SONY_PS4_CONTROLLER),
Frank Praznik8ab16762014-01-16 21:42:31 -05002433 .driver_data = DUALSHOCK4_CONTROLLER_USB },
Frank Praznik0bd88dd2014-01-11 15:12:42 -05002434 { HID_BLUETOOTH_DEVICE(USB_VENDOR_ID_SONY, USB_DEVICE_ID_SONY_PS4_CONTROLLER),
Frank Praznik8ab16762014-01-16 21:42:31 -05002435 .driver_data = DUALSHOCK4_CONTROLLER_BT },
Jiri Slabybd28ce02008-06-25 23:47:04 +02002436 { }
2437};
2438MODULE_DEVICE_TABLE(hid, sony_devices);
2439
2440static struct hid_driver sony_driver = {
Frank Praznikce8efc32014-09-18 21:15:01 -04002441 .name = "sony",
2442 .id_table = sony_devices,
2443 .input_mapping = sony_mapping,
2444 .input_configured = sony_input_configured,
2445 .probe = sony_probe,
2446 .remove = sony_remove,
2447 .report_fixup = sony_report_fixup,
2448 .raw_event = sony_raw_event
Jiri Slabybd28ce02008-06-25 23:47:04 +02002449};
Frank Praznik80250872014-04-14 10:11:35 -04002450
2451static int __init sony_init(void)
2452{
2453 dbg_hid("Sony:%s\n", __func__);
2454
2455 return hid_register_driver(&sony_driver);
2456}
2457
2458static void __exit sony_exit(void)
2459{
2460 dbg_hid("Sony:%s\n", __func__);
2461
Frank Praznik80250872014-04-14 10:11:35 -04002462 hid_unregister_driver(&sony_driver);
Antonio Ospite6c400652015-02-16 22:58:24 +01002463 ida_destroy(&sony_device_id_allocator);
Frank Praznik80250872014-04-14 10:11:35 -04002464}
2465module_init(sony_init);
2466module_exit(sony_exit);
Jiri Slabybd28ce02008-06-25 23:47:04 +02002467
2468MODULE_LICENSE("GPL");