blob: 995b5cf1afc9442d4381a7aae8badc28f773c118 [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 Praznikc4425c82016-09-22 20:18:10 -040011 * Copyright (c) 2014-2016 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>
Roderick Colenbrander49b9ca62016-10-07 12:39:36 -070039#include <linux/crc32.h>
40#include <asm/unaligned.h>
Jiri Slabybd28ce02008-06-25 23:47:04 +020041
42#include "hid-ids.h"
43
Frank Praznik6c79c182014-01-16 21:43:03 -050044#define VAIO_RDESC_CONSTANT BIT(0)
45#define SIXAXIS_CONTROLLER_USB BIT(1)
46#define SIXAXIS_CONTROLLER_BT BIT(2)
47#define BUZZ_CONTROLLER BIT(3)
48#define PS3REMOTE BIT(4)
Frank Praznik8ab16762014-01-16 21:42:31 -050049#define DUALSHOCK4_CONTROLLER_USB BIT(5)
50#define DUALSHOCK4_CONTROLLER_BT BIT(6)
Simon Woodb3bca322015-06-09 21:27:04 -060051#define MOTION_CONTROLLER_USB BIT(7)
52#define MOTION_CONTROLLER_BT BIT(8)
Simon Wood4545ee02015-06-17 00:08:52 -060053#define NAVIGATION_CONTROLLER_USB BIT(9)
54#define NAVIGATION_CONTROLLER_BT BIT(10)
Scott Moreau74500cc2016-01-13 07:40:42 -070055#define SINO_LITE_CONTROLLER BIT(11)
Mikko Perttunen4ba1eee2016-07-21 19:54:48 +030056#define FUTUREMAX_DANCE_MAT BIT(12)
Jiri Kosinacc6e0bb2008-10-23 12:58:38 +020057
Frank Praznikfee4e2d2014-02-18 17:22:01 -050058#define SIXAXIS_CONTROLLER (SIXAXIS_CONTROLLER_USB | SIXAXIS_CONTROLLER_BT)
Simon Woodb3bca322015-06-09 21:27:04 -060059#define MOTION_CONTROLLER (MOTION_CONTROLLER_USB | MOTION_CONTROLLER_BT)
Simon Wood4545ee02015-06-17 00:08:52 -060060#define NAVIGATION_CONTROLLER (NAVIGATION_CONTROLLER_USB |\
61 NAVIGATION_CONTROLLER_BT)
Frank Praznik68330d82014-02-05 20:03:49 -050062#define DUALSHOCK4_CONTROLLER (DUALSHOCK4_CONTROLLER_USB |\
63 DUALSHOCK4_CONTROLLER_BT)
Frank Praznikfee4e2d2014-02-18 17:22:01 -050064#define SONY_LED_SUPPORT (SIXAXIS_CONTROLLER | BUZZ_CONTROLLER |\
Simon Wood4545ee02015-06-17 00:08:52 -060065 DUALSHOCK4_CONTROLLER | MOTION_CONTROLLER |\
66 NAVIGATION_CONTROLLER)
Simon Wood12e9a6d72015-06-09 21:27:05 -060067#define SONY_BATTERY_SUPPORT (SIXAXIS_CONTROLLER | DUALSHOCK4_CONTROLLER |\
Simon Wood4545ee02015-06-17 00:08:52 -060068 MOTION_CONTROLLER_BT | NAVIGATION_CONTROLLER)
Frank Praznikc5e0c1c2015-05-05 20:47:30 -040069#define SONY_FF_SUPPORT (SIXAXIS_CONTROLLER | DUALSHOCK4_CONTROLLER |\
70 MOTION_CONTROLLER)
Frank Praznik0f398232016-09-22 20:18:08 -040071#define SONY_BT_DEVICE (SIXAXIS_CONTROLLER_BT | DUALSHOCK4_CONTROLLER_BT |\
72 MOTION_CONTROLLER_BT | NAVIGATION_CONTROLLER_BT)
Frank Praznik60781cf2014-01-11 15:13:15 -050073
74#define MAX_LEDS 4
Sven Eckelmann0a286ef2013-11-19 20:26:32 +010075
Frank Praznik4c3e8292015-05-05 20:47:33 -040076/*
77 * The Sixaxis reports both digital and analog values for each button on the
78 * controller except for Start, Select and the PS button. The controller ends
79 * up reporting 27 axes which causes them to spill over into the multi-touch
80 * axis values. Additionally, the controller only has 20 actual, physical axes
81 * so there are several unused axes in between the used ones.
82 */
Pavel Machek1adf9042016-02-09 13:55:08 +010083static u8 sixaxis_rdesc[] = {
Antonio Ospitefb705a62014-06-24 13:28:42 +020084 0x05, 0x01, /* Usage Page (Desktop), */
Frank Praznik4c3e8292015-05-05 20:47:33 -040085 0x09, 0x04, /* Usage (Joystick), */
Antonio Ospitefb705a62014-06-24 13:28:42 +020086 0xA1, 0x01, /* Collection (Application), */
87 0xA1, 0x02, /* Collection (Logical), */
88 0x85, 0x01, /* Report ID (1), */
89 0x75, 0x08, /* Report Size (8), */
90 0x95, 0x01, /* Report Count (1), */
91 0x15, 0x00, /* Logical Minimum (0), */
92 0x26, 0xFF, 0x00, /* Logical Maximum (255), */
93 0x81, 0x03, /* Input (Constant, Variable), */
94 0x75, 0x01, /* Report Size (1), */
95 0x95, 0x13, /* Report Count (19), */
96 0x15, 0x00, /* Logical Minimum (0), */
97 0x25, 0x01, /* Logical Maximum (1), */
98 0x35, 0x00, /* Physical Minimum (0), */
99 0x45, 0x01, /* Physical Maximum (1), */
100 0x05, 0x09, /* Usage Page (Button), */
101 0x19, 0x01, /* Usage Minimum (01h), */
102 0x29, 0x13, /* Usage Maximum (13h), */
103 0x81, 0x02, /* Input (Variable), */
104 0x75, 0x01, /* Report Size (1), */
105 0x95, 0x0D, /* Report Count (13), */
106 0x06, 0x00, 0xFF, /* Usage Page (FF00h), */
107 0x81, 0x03, /* Input (Constant, Variable), */
108 0x15, 0x00, /* Logical Minimum (0), */
109 0x26, 0xFF, 0x00, /* Logical Maximum (255), */
110 0x05, 0x01, /* Usage Page (Desktop), */
111 0x09, 0x01, /* Usage (Pointer), */
112 0xA1, 0x00, /* Collection (Physical), */
113 0x75, 0x08, /* Report Size (8), */
114 0x95, 0x04, /* Report Count (4), */
115 0x35, 0x00, /* Physical Minimum (0), */
116 0x46, 0xFF, 0x00, /* Physical Maximum (255), */
117 0x09, 0x30, /* Usage (X), */
118 0x09, 0x31, /* Usage (Y), */
119 0x09, 0x32, /* Usage (Z), */
120 0x09, 0x35, /* Usage (Rz), */
121 0x81, 0x02, /* Input (Variable), */
122 0xC0, /* End Collection, */
123 0x05, 0x01, /* Usage Page (Desktop), */
124 0x95, 0x13, /* Report Count (19), */
125 0x09, 0x01, /* Usage (Pointer), */
126 0x81, 0x02, /* Input (Variable), */
127 0x95, 0x0C, /* Report Count (12), */
128 0x81, 0x01, /* Input (Constant), */
129 0x75, 0x10, /* Report Size (16), */
130 0x95, 0x04, /* Report Count (4), */
131 0x26, 0xFF, 0x03, /* Logical Maximum (1023), */
132 0x46, 0xFF, 0x03, /* Physical Maximum (1023), */
133 0x09, 0x01, /* Usage (Pointer), */
134 0x81, 0x02, /* Input (Variable), */
135 0xC0, /* End Collection, */
136 0xA1, 0x02, /* Collection (Logical), */
137 0x85, 0x02, /* Report ID (2), */
138 0x75, 0x08, /* Report Size (8), */
139 0x95, 0x30, /* Report Count (48), */
140 0x09, 0x01, /* Usage (Pointer), */
141 0xB1, 0x02, /* Feature (Variable), */
142 0xC0, /* End Collection, */
143 0xA1, 0x02, /* Collection (Logical), */
144 0x85, 0xEE, /* Report ID (238), */
145 0x75, 0x08, /* Report Size (8), */
146 0x95, 0x30, /* Report Count (48), */
147 0x09, 0x01, /* Usage (Pointer), */
148 0xB1, 0x02, /* Feature (Variable), */
149 0xC0, /* End Collection, */
150 0xA1, 0x02, /* Collection (Logical), */
151 0x85, 0xEF, /* Report ID (239), */
152 0x75, 0x08, /* Report Size (8), */
153 0x95, 0x30, /* Report Count (48), */
154 0x09, 0x01, /* Usage (Pointer), */
155 0xB1, 0x02, /* Feature (Variable), */
156 0xC0, /* End Collection, */
157 0xC0 /* End Collection */
Mauro Carvalho Chehabe57a67d2012-12-14 20:57:34 -0200158};
159
Frank Praznikc5e0c1c2015-05-05 20:47:30 -0400160/* PS/3 Motion controller */
Pavel Machek1adf9042016-02-09 13:55:08 +0100161static u8 motion_rdesc[] = {
Frank Praznikc5e0c1c2015-05-05 20:47:30 -0400162 0x05, 0x01, /* Usage Page (Desktop), */
163 0x09, 0x04, /* Usage (Joystick), */
164 0xA1, 0x01, /* Collection (Application), */
165 0xA1, 0x02, /* Collection (Logical), */
166 0x85, 0x01, /* Report ID (1), */
Frank Praznikc5e0c1c2015-05-05 20:47:30 -0400167 0x75, 0x01, /* Report Size (1), */
Simon Wood8b2513c2015-06-09 21:27:07 -0600168 0x95, 0x15, /* Report Count (21), */
Frank Praznikc5e0c1c2015-05-05 20:47:30 -0400169 0x15, 0x00, /* Logical Minimum (0), */
170 0x25, 0x01, /* Logical Maximum (1), */
171 0x35, 0x00, /* Physical Minimum (0), */
172 0x45, 0x01, /* Physical Maximum (1), */
173 0x05, 0x09, /* Usage Page (Button), */
174 0x19, 0x01, /* Usage Minimum (01h), */
Simon Wood8b2513c2015-06-09 21:27:07 -0600175 0x29, 0x15, /* Usage Maximum (15h), */
176 0x81, 0x02, /* Input (Variable), * Buttons */
177 0x95, 0x0B, /* Report Count (11), */
Frank Praznikc5e0c1c2015-05-05 20:47:30 -0400178 0x06, 0x00, 0xFF, /* Usage Page (FF00h), */
Simon Wood8b2513c2015-06-09 21:27:07 -0600179 0x81, 0x03, /* Input (Constant, Variable), * Padding */
Frank Praznikc5e0c1c2015-05-05 20:47:30 -0400180 0x15, 0x00, /* Logical Minimum (0), */
181 0x26, 0xFF, 0x00, /* Logical Maximum (255), */
182 0x05, 0x01, /* Usage Page (Desktop), */
Frank Praznikc5e0c1c2015-05-05 20:47:30 -0400183 0xA1, 0x00, /* Collection (Physical), */
184 0x75, 0x08, /* Report Size (8), */
Simon Wood8b2513c2015-06-09 21:27:07 -0600185 0x95, 0x01, /* Report Count (1), */
Frank Praznikc5e0c1c2015-05-05 20:47:30 -0400186 0x35, 0x00, /* Physical Minimum (0), */
187 0x46, 0xFF, 0x00, /* Physical Maximum (255), */
188 0x09, 0x30, /* Usage (X), */
Simon Wood8b2513c2015-06-09 21:27:07 -0600189 0x81, 0x02, /* Input (Variable), * Trigger */
Frank Praznikc5e0c1c2015-05-05 20:47:30 -0400190 0xC0, /* End Collection, */
Simon Wood8b2513c2015-06-09 21:27:07 -0600191 0x06, 0x00, 0xFF, /* Usage Page (FF00h), */
192 0x75, 0x08, /* Report Size (8), */
193 0x95, 0x07, /* Report Count (7), * skip 7 bytes */
194 0x81, 0x02, /* Input (Variable), */
Frank Praznikc5e0c1c2015-05-05 20:47:30 -0400195 0x05, 0x01, /* Usage Page (Desktop), */
Frank Praznikc5e0c1c2015-05-05 20:47:30 -0400196 0x75, 0x10, /* Report Size (16), */
Simon Wood8b2513c2015-06-09 21:27:07 -0600197 0x46, 0xFF, 0xFF, /* Physical Maximum (65535), */
198 0x27, 0xFF, 0xFF, 0x00, 0x00, /* Logical Maximum (65535), */
199 0x95, 0x03, /* Report Count (3), * 3x Accels */
200 0x09, 0x33, /* Usage (rX), */
201 0x09, 0x34, /* Usage (rY), */
202 0x09, 0x35, /* Usage (rZ), */
Frank Praznikc5e0c1c2015-05-05 20:47:30 -0400203 0x81, 0x02, /* Input (Variable), */
Simon Wood8b2513c2015-06-09 21:27:07 -0600204 0x06, 0x00, 0xFF, /* Usage Page (FF00h), */
205 0x95, 0x03, /* Report Count (3), * Skip Accels 2nd frame */
206 0x81, 0x02, /* Input (Variable), */
207 0x05, 0x01, /* Usage Page (Desktop), */
208 0x09, 0x01, /* Usage (Pointer), */
209 0x95, 0x03, /* Report Count (3), * 3x Gyros */
210 0x81, 0x02, /* Input (Variable), */
211 0x06, 0x00, 0xFF, /* Usage Page (FF00h), */
212 0x95, 0x03, /* Report Count (3), * Skip Gyros 2nd frame */
213 0x81, 0x02, /* Input (Variable), */
214 0x75, 0x0C, /* Report Size (12), */
215 0x46, 0xFF, 0x0F, /* Physical Maximum (4095), */
216 0x26, 0xFF, 0x0F, /* Logical Maximum (4095), */
217 0x95, 0x04, /* Report Count (4), * Skip Temp and Magnetometers */
218 0x81, 0x02, /* Input (Variable), */
219 0x75, 0x08, /* Report Size (8), */
220 0x46, 0xFF, 0x00, /* Physical Maximum (255), */
221 0x26, 0xFF, 0x00, /* Logical Maximum (255), */
222 0x95, 0x06, /* Report Count (6), * Skip Timestamp and Extension Bytes */
223 0x81, 0x02, /* Input (Variable), */
224 0x75, 0x08, /* Report Size (8), */
225 0x95, 0x30, /* Report Count (48), */
226 0x09, 0x01, /* Usage (Pointer), */
227 0x91, 0x02, /* Output (Variable), */
228 0x75, 0x08, /* Report Size (8), */
229 0x95, 0x30, /* Report Count (48), */
230 0x09, 0x01, /* Usage (Pointer), */
231 0xB1, 0x02, /* Feature (Variable), */
Frank Praznikc5e0c1c2015-05-05 20:47:30 -0400232 0xC0, /* End Collection, */
233 0xA1, 0x02, /* Collection (Logical), */
234 0x85, 0x02, /* Report ID (2), */
235 0x75, 0x08, /* Report Size (8), */
236 0x95, 0x30, /* Report Count (48), */
237 0x09, 0x01, /* Usage (Pointer), */
238 0xB1, 0x02, /* Feature (Variable), */
239 0xC0, /* End Collection, */
240 0xA1, 0x02, /* Collection (Logical), */
241 0x85, 0xEE, /* Report ID (238), */
242 0x75, 0x08, /* Report Size (8), */
243 0x95, 0x30, /* Report Count (48), */
244 0x09, 0x01, /* Usage (Pointer), */
245 0xB1, 0x02, /* Feature (Variable), */
246 0xC0, /* End Collection, */
247 0xA1, 0x02, /* Collection (Logical), */
248 0x85, 0xEF, /* Report ID (239), */
249 0x75, 0x08, /* Report Size (8), */
250 0x95, 0x30, /* Report Count (48), */
251 0x09, 0x01, /* Usage (Pointer), */
252 0xB1, 0x02, /* Feature (Variable), */
253 0xC0, /* End Collection, */
254 0xC0 /* End Collection */
255};
256
Simon Woodb2723eb2015-06-17 00:08:53 -0600257/* PS/3 Navigation controller */
Pavel Machek1adf9042016-02-09 13:55:08 +0100258static u8 navigation_rdesc[] = {
Simon Woodb2723eb2015-06-17 00:08:53 -0600259 0x05, 0x01, /* Usage Page (Desktop), */
Antonio Ospited5421762016-01-28 18:23:43 +0100260 0x09, 0x04, /* Usage (Joystick), */
Simon Woodb2723eb2015-06-17 00:08:53 -0600261 0xA1, 0x01, /* Collection (Application), */
262 0xA1, 0x02, /* Collection (Logical), */
263 0x85, 0x01, /* Report ID (1), */
264 0x75, 0x08, /* Report Size (8), */
265 0x95, 0x01, /* Report Count (1), */
266 0x15, 0x00, /* Logical Minimum (0), */
267 0x26, 0xFF, 0x00, /* Logical Maximum (255), */
268 0x81, 0x03, /* Input (Constant, Variable), */
269 0x75, 0x01, /* Report Size (1), */
270 0x95, 0x13, /* Report Count (19), */
271 0x15, 0x00, /* Logical Minimum (0), */
272 0x25, 0x01, /* Logical Maximum (1), */
273 0x35, 0x00, /* Physical Minimum (0), */
274 0x45, 0x01, /* Physical Maximum (1), */
275 0x05, 0x09, /* Usage Page (Button), */
276 0x19, 0x01, /* Usage Minimum (01h), */
277 0x29, 0x13, /* Usage Maximum (13h), */
278 0x81, 0x02, /* Input (Variable), */
279 0x75, 0x01, /* Report Size (1), */
280 0x95, 0x0D, /* Report Count (13), */
281 0x06, 0x00, 0xFF, /* Usage Page (FF00h), */
282 0x81, 0x03, /* Input (Constant, Variable), */
283 0x15, 0x00, /* Logical Minimum (0), */
284 0x26, 0xFF, 0x00, /* Logical Maximum (255), */
285 0x05, 0x01, /* Usage Page (Desktop), */
286 0x09, 0x01, /* Usage (Pointer), */
287 0xA1, 0x00, /* Collection (Physical), */
288 0x75, 0x08, /* Report Size (8), */
289 0x95, 0x02, /* Report Count (2), */
290 0x35, 0x00, /* Physical Minimum (0), */
291 0x46, 0xFF, 0x00, /* Physical Maximum (255), */
292 0x09, 0x30, /* Usage (X), */
293 0x09, 0x31, /* Usage (Y), */
294 0x81, 0x02, /* Input (Variable), */
295 0xC0, /* End Collection, */
296 0x06, 0x00, 0xFF, /* Usage Page (FF00h), */
297 0x95, 0x06, /* Report Count (6), */
298 0x81, 0x03, /* Input (Constant, Variable), */
299 0x05, 0x01, /* Usage Page (Desktop), */
300 0x75, 0x08, /* Report Size (8), */
301 0x95, 0x05, /* Report Count (5), */
302 0x09, 0x01, /* Usage (Pointer), */
303 0x81, 0x02, /* Input (Variable), */
304 0x06, 0x00, 0xFF, /* Usage Page (FF00h), */
Simon Wood2259b5bb2015-07-10 00:10:21 -0600305 0x95, 0x01, /* Report Count (1), */
306 0x81, 0x02, /* Input (Variable), */
307 0x05, 0x01, /* Usage Page (Desktop), */
308 0x95, 0x01, /* Report Count (1), */
309 0x09, 0x01, /* Usage (Pointer), */
310 0x81, 0x02, /* Input (Variable), */
311 0x06, 0x00, 0xFF, /* Usage Page (FF00h), */
312 0x95, 0x1E, /* Report Count (24), */
Simon Woodb2723eb2015-06-17 00:08:53 -0600313 0x81, 0x02, /* Input (Variable), */
314 0x75, 0x08, /* Report Size (8), */
315 0x95, 0x30, /* Report Count (48), */
316 0x09, 0x01, /* Usage (Pointer), */
317 0x91, 0x02, /* Output (Variable), */
318 0x75, 0x08, /* Report Size (8), */
319 0x95, 0x30, /* Report Count (48), */
320 0x09, 0x01, /* Usage (Pointer), */
321 0xB1, 0x02, /* Feature (Variable), */
322 0xC0, /* End Collection, */
323 0xA1, 0x02, /* Collection (Logical), */
324 0x85, 0x02, /* Report ID (2), */
325 0x75, 0x08, /* Report Size (8), */
326 0x95, 0x30, /* Report Count (48), */
327 0x09, 0x01, /* Usage (Pointer), */
328 0xB1, 0x02, /* Feature (Variable), */
329 0xC0, /* End Collection, */
330 0xA1, 0x02, /* Collection (Logical), */
331 0x85, 0xEE, /* Report ID (238), */
332 0x75, 0x08, /* Report Size (8), */
333 0x95, 0x30, /* Report Count (48), */
334 0x09, 0x01, /* Usage (Pointer), */
335 0xB1, 0x02, /* Feature (Variable), */
336 0xC0, /* End Collection, */
337 0xA1, 0x02, /* Collection (Logical), */
338 0x85, 0xEF, /* Report ID (239), */
339 0x75, 0x08, /* Report Size (8), */
340 0x95, 0x30, /* Report Count (48), */
341 0x09, 0x01, /* Usage (Pointer), */
342 0xB1, 0x02, /* Feature (Variable), */
343 0xC0, /* End Collection, */
344 0xC0 /* End Collection */
345};
Frank Praznikc5e0c1c2015-05-05 20:47:30 -0400346
Frank Praznikad142b92014-02-20 11:36:00 -0500347/*
348 * The default descriptor doesn't provide mapping for the accelerometers
Frank Praznik58d70272014-01-20 12:27:01 -0500349 * or orientation sensors. This fixed descriptor maps the accelerometers
350 * to usage values 0x40, 0x41 and 0x42 and maps the orientation sensors
351 * to usage values 0x43, 0x44 and 0x45.
352 */
Frank Prazniked19d8c2014-01-16 21:43:12 -0500353static u8 dualshock4_usb_rdesc[] = {
Frank Praznik58d70272014-01-20 12:27:01 -0500354 0x05, 0x01, /* Usage Page (Desktop), */
355 0x09, 0x05, /* Usage (Gamepad), */
356 0xA1, 0x01, /* Collection (Application), */
357 0x85, 0x01, /* Report ID (1), */
358 0x09, 0x30, /* Usage (X), */
359 0x09, 0x31, /* Usage (Y), */
360 0x09, 0x32, /* Usage (Z), */
361 0x09, 0x35, /* Usage (Rz), */
362 0x15, 0x00, /* Logical Minimum (0), */
363 0x26, 0xFF, 0x00, /* Logical Maximum (255), */
364 0x75, 0x08, /* Report Size (8), */
365 0x95, 0x04, /* Report Count (4), */
366 0x81, 0x02, /* Input (Variable), */
367 0x09, 0x39, /* Usage (Hat Switch), */
368 0x15, 0x00, /* Logical Minimum (0), */
369 0x25, 0x07, /* Logical Maximum (7), */
370 0x35, 0x00, /* Physical Minimum (0), */
371 0x46, 0x3B, 0x01, /* Physical Maximum (315), */
372 0x65, 0x14, /* Unit (Degrees), */
373 0x75, 0x04, /* Report Size (4), */
374 0x95, 0x01, /* Report Count (1), */
375 0x81, 0x42, /* Input (Variable, Null State), */
376 0x65, 0x00, /* Unit, */
377 0x05, 0x09, /* Usage Page (Button), */
378 0x19, 0x01, /* Usage Minimum (01h), */
Roderick Colenbranderac797b92016-11-23 14:07:07 -0800379 0x29, 0x0D, /* Usage Maximum (0Dh), */
Frank Praznik58d70272014-01-20 12:27:01 -0500380 0x15, 0x00, /* Logical Minimum (0), */
381 0x25, 0x01, /* Logical Maximum (1), */
382 0x75, 0x01, /* Report Size (1), */
383 0x95, 0x0E, /* Report Count (14), */
384 0x81, 0x02, /* Input (Variable), */
385 0x06, 0x00, 0xFF, /* Usage Page (FF00h), */
386 0x09, 0x20, /* Usage (20h), */
387 0x75, 0x06, /* Report Size (6), */
388 0x95, 0x01, /* Report Count (1), */
389 0x15, 0x00, /* Logical Minimum (0), */
Frank Praznikfb291cb2014-09-14 11:56:38 -0400390 0x25, 0x3F, /* Logical Maximum (63), */
Frank Praznik58d70272014-01-20 12:27:01 -0500391 0x81, 0x02, /* Input (Variable), */
392 0x05, 0x01, /* Usage Page (Desktop), */
393 0x09, 0x33, /* Usage (Rx), */
394 0x09, 0x34, /* Usage (Ry), */
395 0x15, 0x00, /* Logical Minimum (0), */
396 0x26, 0xFF, 0x00, /* Logical Maximum (255), */
397 0x75, 0x08, /* Report Size (8), */
398 0x95, 0x02, /* Report Count (2), */
399 0x81, 0x02, /* Input (Variable), */
400 0x06, 0x00, 0xFF, /* Usage Page (FF00h), */
401 0x09, 0x21, /* Usage (21h), */
402 0x95, 0x03, /* Report Count (3), */
403 0x81, 0x02, /* Input (Variable), */
404 0x05, 0x01, /* Usage Page (Desktop), */
405 0x19, 0x40, /* Usage Minimum (40h), */
406 0x29, 0x42, /* Usage Maximum (42h), */
407 0x16, 0x00, 0x80, /* Logical Minimum (-32768), */
Roderick Colenbranderbdae9e02016-10-07 12:39:39 -0700408 0x26, 0xFF, 0x7F, /* Logical Maximum (32767), */
Frank Praznik58d70272014-01-20 12:27:01 -0500409 0x75, 0x10, /* Report Size (16), */
410 0x95, 0x03, /* Report Count (3), */
411 0x81, 0x02, /* Input (Variable), */
412 0x19, 0x43, /* Usage Minimum (43h), */
413 0x29, 0x45, /* Usage Maximum (45h), */
Roderick Colenbranderbdae9e02016-10-07 12:39:39 -0700414 0x16, 0x00, 0x80, /* Logical Minimum (-32768), */
415 0x26, 0xFF, 0x7F, /* Logical Maximum (32767), */
Frank Praznik58d70272014-01-20 12:27:01 -0500416 0x95, 0x03, /* Report Count (3), */
417 0x81, 0x02, /* Input (Variable), */
418 0x06, 0x00, 0xFF, /* Usage Page (FF00h), */
419 0x09, 0x21, /* Usage (21h), */
420 0x15, 0x00, /* Logical Minimum (0), */
Frank Praznikfb291cb2014-09-14 11:56:38 -0400421 0x26, 0xFF, 0x00, /* Logical Maximum (255), */
Frank Praznik58d70272014-01-20 12:27:01 -0500422 0x75, 0x08, /* Report Size (8), */
423 0x95, 0x27, /* Report Count (39), */
424 0x81, 0x02, /* Input (Variable), */
425 0x85, 0x05, /* Report ID (5), */
426 0x09, 0x22, /* Usage (22h), */
427 0x95, 0x1F, /* Report Count (31), */
428 0x91, 0x02, /* Output (Variable), */
429 0x85, 0x04, /* Report ID (4), */
430 0x09, 0x23, /* Usage (23h), */
431 0x95, 0x24, /* Report Count (36), */
432 0xB1, 0x02, /* Feature (Variable), */
433 0x85, 0x02, /* Report ID (2), */
434 0x09, 0x24, /* Usage (24h), */
435 0x95, 0x24, /* Report Count (36), */
436 0xB1, 0x02, /* Feature (Variable), */
437 0x85, 0x08, /* Report ID (8), */
438 0x09, 0x25, /* Usage (25h), */
439 0x95, 0x03, /* Report Count (3), */
440 0xB1, 0x02, /* Feature (Variable), */
441 0x85, 0x10, /* Report ID (16), */
442 0x09, 0x26, /* Usage (26h), */
443 0x95, 0x04, /* Report Count (4), */
444 0xB1, 0x02, /* Feature (Variable), */
445 0x85, 0x11, /* Report ID (17), */
446 0x09, 0x27, /* Usage (27h), */
447 0x95, 0x02, /* Report Count (2), */
448 0xB1, 0x02, /* Feature (Variable), */
449 0x85, 0x12, /* Report ID (18), */
450 0x06, 0x02, 0xFF, /* Usage Page (FF02h), */
451 0x09, 0x21, /* Usage (21h), */
452 0x95, 0x0F, /* Report Count (15), */
453 0xB1, 0x02, /* Feature (Variable), */
454 0x85, 0x13, /* Report ID (19), */
455 0x09, 0x22, /* Usage (22h), */
456 0x95, 0x16, /* Report Count (22), */
457 0xB1, 0x02, /* Feature (Variable), */
458 0x85, 0x14, /* Report ID (20), */
459 0x06, 0x05, 0xFF, /* Usage Page (FF05h), */
460 0x09, 0x20, /* Usage (20h), */
461 0x95, 0x10, /* Report Count (16), */
462 0xB1, 0x02, /* Feature (Variable), */
463 0x85, 0x15, /* Report ID (21), */
464 0x09, 0x21, /* Usage (21h), */
465 0x95, 0x2C, /* Report Count (44), */
466 0xB1, 0x02, /* Feature (Variable), */
467 0x06, 0x80, 0xFF, /* Usage Page (FF80h), */
468 0x85, 0x80, /* Report ID (128), */
469 0x09, 0x20, /* Usage (20h), */
470 0x95, 0x06, /* Report Count (6), */
471 0xB1, 0x02, /* Feature (Variable), */
472 0x85, 0x81, /* Report ID (129), */
473 0x09, 0x21, /* Usage (21h), */
474 0x95, 0x06, /* Report Count (6), */
475 0xB1, 0x02, /* Feature (Variable), */
476 0x85, 0x82, /* Report ID (130), */
477 0x09, 0x22, /* Usage (22h), */
478 0x95, 0x05, /* Report Count (5), */
479 0xB1, 0x02, /* Feature (Variable), */
480 0x85, 0x83, /* Report ID (131), */
481 0x09, 0x23, /* Usage (23h), */
482 0x95, 0x01, /* Report Count (1), */
483 0xB1, 0x02, /* Feature (Variable), */
484 0x85, 0x84, /* Report ID (132), */
485 0x09, 0x24, /* Usage (24h), */
486 0x95, 0x04, /* Report Count (4), */
487 0xB1, 0x02, /* Feature (Variable), */
488 0x85, 0x85, /* Report ID (133), */
489 0x09, 0x25, /* Usage (25h), */
490 0x95, 0x06, /* Report Count (6), */
491 0xB1, 0x02, /* Feature (Variable), */
492 0x85, 0x86, /* Report ID (134), */
493 0x09, 0x26, /* Usage (26h), */
494 0x95, 0x06, /* Report Count (6), */
495 0xB1, 0x02, /* Feature (Variable), */
496 0x85, 0x87, /* Report ID (135), */
497 0x09, 0x27, /* Usage (27h), */
498 0x95, 0x23, /* Report Count (35), */
499 0xB1, 0x02, /* Feature (Variable), */
500 0x85, 0x88, /* Report ID (136), */
501 0x09, 0x28, /* Usage (28h), */
502 0x95, 0x22, /* Report Count (34), */
503 0xB1, 0x02, /* Feature (Variable), */
504 0x85, 0x89, /* Report ID (137), */
505 0x09, 0x29, /* Usage (29h), */
506 0x95, 0x02, /* Report Count (2), */
507 0xB1, 0x02, /* Feature (Variable), */
508 0x85, 0x90, /* Report ID (144), */
509 0x09, 0x30, /* Usage (30h), */
510 0x95, 0x05, /* Report Count (5), */
511 0xB1, 0x02, /* Feature (Variable), */
512 0x85, 0x91, /* Report ID (145), */
513 0x09, 0x31, /* Usage (31h), */
514 0x95, 0x03, /* Report Count (3), */
515 0xB1, 0x02, /* Feature (Variable), */
516 0x85, 0x92, /* Report ID (146), */
517 0x09, 0x32, /* Usage (32h), */
518 0x95, 0x03, /* Report Count (3), */
519 0xB1, 0x02, /* Feature (Variable), */
520 0x85, 0x93, /* Report ID (147), */
521 0x09, 0x33, /* Usage (33h), */
522 0x95, 0x0C, /* Report Count (12), */
523 0xB1, 0x02, /* Feature (Variable), */
524 0x85, 0xA0, /* Report ID (160), */
525 0x09, 0x40, /* Usage (40h), */
526 0x95, 0x06, /* Report Count (6), */
527 0xB1, 0x02, /* Feature (Variable), */
528 0x85, 0xA1, /* Report ID (161), */
529 0x09, 0x41, /* Usage (41h), */
530 0x95, 0x01, /* Report Count (1), */
531 0xB1, 0x02, /* Feature (Variable), */
532 0x85, 0xA2, /* Report ID (162), */
533 0x09, 0x42, /* Usage (42h), */
534 0x95, 0x01, /* Report Count (1), */
535 0xB1, 0x02, /* Feature (Variable), */
536 0x85, 0xA3, /* Report ID (163), */
537 0x09, 0x43, /* Usage (43h), */
538 0x95, 0x30, /* Report Count (48), */
539 0xB1, 0x02, /* Feature (Variable), */
540 0x85, 0xA4, /* Report ID (164), */
541 0x09, 0x44, /* Usage (44h), */
542 0x95, 0x0D, /* Report Count (13), */
543 0xB1, 0x02, /* Feature (Variable), */
544 0x85, 0xA5, /* Report ID (165), */
545 0x09, 0x45, /* Usage (45h), */
546 0x95, 0x15, /* Report Count (21), */
547 0xB1, 0x02, /* Feature (Variable), */
548 0x85, 0xA6, /* Report ID (166), */
549 0x09, 0x46, /* Usage (46h), */
550 0x95, 0x15, /* Report Count (21), */
551 0xB1, 0x02, /* Feature (Variable), */
552 0x85, 0xF0, /* Report ID (240), */
553 0x09, 0x47, /* Usage (47h), */
554 0x95, 0x3F, /* Report Count (63), */
555 0xB1, 0x02, /* Feature (Variable), */
556 0x85, 0xF1, /* Report ID (241), */
557 0x09, 0x48, /* Usage (48h), */
558 0x95, 0x3F, /* Report Count (63), */
559 0xB1, 0x02, /* Feature (Variable), */
560 0x85, 0xF2, /* Report ID (242), */
561 0x09, 0x49, /* Usage (49h), */
562 0x95, 0x0F, /* Report Count (15), */
563 0xB1, 0x02, /* Feature (Variable), */
564 0x85, 0xA7, /* Report ID (167), */
565 0x09, 0x4A, /* Usage (4Ah), */
566 0x95, 0x01, /* Report Count (1), */
567 0xB1, 0x02, /* Feature (Variable), */
568 0x85, 0xA8, /* Report ID (168), */
569 0x09, 0x4B, /* Usage (4Bh), */
570 0x95, 0x01, /* Report Count (1), */
571 0xB1, 0x02, /* Feature (Variable), */
572 0x85, 0xA9, /* Report ID (169), */
573 0x09, 0x4C, /* Usage (4Ch), */
574 0x95, 0x08, /* Report Count (8), */
575 0xB1, 0x02, /* Feature (Variable), */
576 0x85, 0xAA, /* Report ID (170), */
577 0x09, 0x4E, /* Usage (4Eh), */
578 0x95, 0x01, /* Report Count (1), */
579 0xB1, 0x02, /* Feature (Variable), */
580 0x85, 0xAB, /* Report ID (171), */
581 0x09, 0x4F, /* Usage (4Fh), */
582 0x95, 0x39, /* Report Count (57), */
583 0xB1, 0x02, /* Feature (Variable), */
584 0x85, 0xAC, /* Report ID (172), */
585 0x09, 0x50, /* Usage (50h), */
586 0x95, 0x39, /* Report Count (57), */
587 0xB1, 0x02, /* Feature (Variable), */
588 0x85, 0xAD, /* Report ID (173), */
589 0x09, 0x51, /* Usage (51h), */
590 0x95, 0x0B, /* Report Count (11), */
591 0xB1, 0x02, /* Feature (Variable), */
592 0x85, 0xAE, /* Report ID (174), */
593 0x09, 0x52, /* Usage (52h), */
594 0x95, 0x01, /* Report Count (1), */
595 0xB1, 0x02, /* Feature (Variable), */
596 0x85, 0xAF, /* Report ID (175), */
597 0x09, 0x53, /* Usage (53h), */
598 0x95, 0x02, /* Report Count (2), */
599 0xB1, 0x02, /* Feature (Variable), */
600 0x85, 0xB0, /* Report ID (176), */
601 0x09, 0x54, /* Usage (54h), */
602 0x95, 0x3F, /* Report Count (63), */
603 0xB1, 0x02, /* Feature (Variable), */
604 0xC0 /* End Collection */
Frank Prazniked19d8c2014-01-16 21:43:12 -0500605};
606
Frank Praznikad142b92014-02-20 11:36:00 -0500607/*
608 * The default behavior of the Dualshock 4 is to send reports using report
Frank Praznik077147a2014-09-14 11:56:39 -0400609 * type 1 when running over Bluetooth. However, when feature report 2 is
610 * requested during the controller initialization it starts sending input
611 * reports in report 17. Since report 17 is undefined in the default HID
Frank Praznikd8296742014-02-05 20:03:45 -0500612 * descriptor the button and axis definitions must be moved to report 17 or
Frank Praznik077147a2014-09-14 11:56:39 -0400613 * the HID layer won't process the received input.
Frank Praznikd8296742014-02-05 20:03:45 -0500614 */
615static u8 dualshock4_bt_rdesc[] = {
616 0x05, 0x01, /* Usage Page (Desktop), */
617 0x09, 0x05, /* Usage (Gamepad), */
618 0xA1, 0x01, /* Collection (Application), */
619 0x85, 0x01, /* Report ID (1), */
620 0x75, 0x08, /* Report Size (8), */
621 0x95, 0x0A, /* Report Count (9), */
622 0x81, 0x02, /* Input (Variable), */
623 0x06, 0x04, 0xFF, /* Usage Page (FF04h), */
624 0x85, 0x02, /* Report ID (2), */
625 0x09, 0x24, /* Usage (24h), */
626 0x95, 0x24, /* Report Count (36), */
627 0xB1, 0x02, /* Feature (Variable), */
628 0x85, 0xA3, /* Report ID (163), */
629 0x09, 0x25, /* Usage (25h), */
630 0x95, 0x30, /* Report Count (48), */
631 0xB1, 0x02, /* Feature (Variable), */
632 0x85, 0x05, /* Report ID (5), */
633 0x09, 0x26, /* Usage (26h), */
634 0x95, 0x28, /* Report Count (40), */
635 0xB1, 0x02, /* Feature (Variable), */
636 0x85, 0x06, /* Report ID (6), */
637 0x09, 0x27, /* Usage (27h), */
638 0x95, 0x34, /* Report Count (52), */
639 0xB1, 0x02, /* Feature (Variable), */
640 0x85, 0x07, /* Report ID (7), */
641 0x09, 0x28, /* Usage (28h), */
642 0x95, 0x30, /* Report Count (48), */
643 0xB1, 0x02, /* Feature (Variable), */
644 0x85, 0x08, /* Report ID (8), */
645 0x09, 0x29, /* Usage (29h), */
646 0x95, 0x2F, /* Report Count (47), */
647 0xB1, 0x02, /* Feature (Variable), */
648 0x06, 0x03, 0xFF, /* Usage Page (FF03h), */
649 0x85, 0x03, /* Report ID (3), */
650 0x09, 0x21, /* Usage (21h), */
651 0x95, 0x26, /* Report Count (38), */
652 0xB1, 0x02, /* Feature (Variable), */
653 0x85, 0x04, /* Report ID (4), */
654 0x09, 0x22, /* Usage (22h), */
655 0x95, 0x2E, /* Report Count (46), */
656 0xB1, 0x02, /* Feature (Variable), */
657 0x85, 0xF0, /* Report ID (240), */
658 0x09, 0x47, /* Usage (47h), */
659 0x95, 0x3F, /* Report Count (63), */
660 0xB1, 0x02, /* Feature (Variable), */
661 0x85, 0xF1, /* Report ID (241), */
662 0x09, 0x48, /* Usage (48h), */
663 0x95, 0x3F, /* Report Count (63), */
664 0xB1, 0x02, /* Feature (Variable), */
665 0x85, 0xF2, /* Report ID (242), */
666 0x09, 0x49, /* Usage (49h), */
667 0x95, 0x0F, /* Report Count (15), */
668 0xB1, 0x02, /* Feature (Variable), */
669 0x85, 0x11, /* Report ID (17), */
670 0x06, 0x00, 0xFF, /* Usage Page (FF00h), */
671 0x09, 0x20, /* Usage (20h), */
672 0x95, 0x02, /* Report Count (2), */
673 0x81, 0x02, /* Input (Variable), */
674 0x05, 0x01, /* Usage Page (Desktop), */
675 0x09, 0x30, /* Usage (X), */
676 0x09, 0x31, /* Usage (Y), */
677 0x09, 0x32, /* Usage (Z), */
678 0x09, 0x35, /* Usage (Rz), */
679 0x15, 0x00, /* Logical Minimum (0), */
680 0x26, 0xFF, 0x00, /* Logical Maximum (255), */
681 0x75, 0x08, /* Report Size (8), */
682 0x95, 0x04, /* Report Count (4), */
683 0x81, 0x02, /* Input (Variable), */
684 0x09, 0x39, /* Usage (Hat Switch), */
685 0x15, 0x00, /* Logical Minimum (0), */
686 0x25, 0x07, /* Logical Maximum (7), */
687 0x75, 0x04, /* Report Size (4), */
688 0x95, 0x01, /* Report Count (1), */
689 0x81, 0x42, /* Input (Variable, Null State), */
690 0x05, 0x09, /* Usage Page (Button), */
691 0x19, 0x01, /* Usage Minimum (01h), */
Roderick Colenbranderac797b92016-11-23 14:07:07 -0800692 0x29, 0x0D, /* Usage Maximum (0Dh), */
Frank Praznikd8296742014-02-05 20:03:45 -0500693 0x15, 0x00, /* Logical Minimum (0), */
694 0x25, 0x01, /* Logical Maximum (1), */
695 0x75, 0x01, /* Report Size (1), */
696 0x95, 0x0E, /* Report Count (14), */
697 0x81, 0x02, /* Input (Variable), */
698 0x75, 0x06, /* Report Size (6), */
699 0x95, 0x01, /* Report Count (1), */
700 0x81, 0x01, /* Input (Constant), */
701 0x05, 0x01, /* Usage Page (Desktop), */
702 0x09, 0x33, /* Usage (Rx), */
703 0x09, 0x34, /* Usage (Ry), */
704 0x15, 0x00, /* Logical Minimum (0), */
705 0x26, 0xFF, 0x00, /* Logical Maximum (255), */
706 0x75, 0x08, /* Report Size (8), */
707 0x95, 0x02, /* Report Count (2), */
708 0x81, 0x02, /* Input (Variable), */
709 0x06, 0x00, 0xFF, /* Usage Page (FF00h), */
710 0x09, 0x20, /* Usage (20h), */
711 0x95, 0x03, /* Report Count (3), */
712 0x81, 0x02, /* Input (Variable), */
713 0x05, 0x01, /* Usage Page (Desktop), */
714 0x19, 0x40, /* Usage Minimum (40h), */
715 0x29, 0x42, /* Usage Maximum (42h), */
716 0x16, 0x00, 0x80, /* Logical Minimum (-32768), */
Roderick Colenbranderbdae9e02016-10-07 12:39:39 -0700717 0x26, 0xFF, 0x7F, /* Logical Maximum (32767), */
Frank Praznikd8296742014-02-05 20:03:45 -0500718 0x75, 0x10, /* Report Size (16), */
719 0x95, 0x03, /* Report Count (3), */
720 0x81, 0x02, /* Input (Variable), */
721 0x19, 0x43, /* Usage Minimum (43h), */
722 0x29, 0x45, /* Usage Maximum (45h), */
Roderick Colenbranderbdae9e02016-10-07 12:39:39 -0700723 0x16, 0x00, 0x80, /* Logical Minimum (-32768), */
724 0x26, 0xFF, 0x7F, /* Logical Maximum (32767), */
Frank Praznikd8296742014-02-05 20:03:45 -0500725 0x95, 0x03, /* Report Count (3), */
726 0x81, 0x02, /* Input (Variable), */
727 0x06, 0x00, 0xFF, /* Usage Page (FF00h), */
728 0x09, 0x20, /* Usage (20h), */
729 0x15, 0x00, /* Logical Minimum (0), */
730 0x26, 0xFF, 0x00, /* Logical Maximum (255), */
731 0x75, 0x08, /* Report Size (8), */
732 0x95, 0x31, /* Report Count (51), */
733 0x81, 0x02, /* Input (Variable), */
734 0x09, 0x21, /* Usage (21h), */
735 0x75, 0x08, /* Report Size (8), */
736 0x95, 0x4D, /* Report Count (77), */
737 0x91, 0x02, /* Output (Variable), */
738 0x85, 0x12, /* Report ID (18), */
739 0x09, 0x22, /* Usage (22h), */
740 0x95, 0x8D, /* Report Count (141), */
741 0x81, 0x02, /* Input (Variable), */
742 0x09, 0x23, /* Usage (23h), */
743 0x91, 0x02, /* Output (Variable), */
744 0x85, 0x13, /* Report ID (19), */
745 0x09, 0x24, /* Usage (24h), */
746 0x95, 0xCD, /* Report Count (205), */
747 0x81, 0x02, /* Input (Variable), */
748 0x09, 0x25, /* Usage (25h), */
749 0x91, 0x02, /* Output (Variable), */
750 0x85, 0x14, /* Report ID (20), */
751 0x09, 0x26, /* Usage (26h), */
752 0x96, 0x0D, 0x01, /* Report Count (269), */
753 0x81, 0x02, /* Input (Variable), */
754 0x09, 0x27, /* Usage (27h), */
755 0x91, 0x02, /* Output (Variable), */
756 0x85, 0x15, /* Report ID (21), */
757 0x09, 0x28, /* Usage (28h), */
758 0x96, 0x4D, 0x01, /* Report Count (333), */
759 0x81, 0x02, /* Input (Variable), */
760 0x09, 0x29, /* Usage (29h), */
761 0x91, 0x02, /* Output (Variable), */
762 0x85, 0x16, /* Report ID (22), */
763 0x09, 0x2A, /* Usage (2Ah), */
764 0x96, 0x8D, 0x01, /* Report Count (397), */
765 0x81, 0x02, /* Input (Variable), */
766 0x09, 0x2B, /* Usage (2Bh), */
767 0x91, 0x02, /* Output (Variable), */
768 0x85, 0x17, /* Report ID (23), */
769 0x09, 0x2C, /* Usage (2Ch), */
770 0x96, 0xCD, 0x01, /* Report Count (461), */
771 0x81, 0x02, /* Input (Variable), */
772 0x09, 0x2D, /* Usage (2Dh), */
773 0x91, 0x02, /* Output (Variable), */
774 0x85, 0x18, /* Report ID (24), */
775 0x09, 0x2E, /* Usage (2Eh), */
776 0x96, 0x0D, 0x02, /* Report Count (525), */
777 0x81, 0x02, /* Input (Variable), */
778 0x09, 0x2F, /* Usage (2Fh), */
779 0x91, 0x02, /* Output (Variable), */
780 0x85, 0x19, /* Report ID (25), */
781 0x09, 0x30, /* Usage (30h), */
782 0x96, 0x22, 0x02, /* Report Count (546), */
783 0x81, 0x02, /* Input (Variable), */
784 0x09, 0x31, /* Usage (31h), */
785 0x91, 0x02, /* Output (Variable), */
786 0x06, 0x80, 0xFF, /* Usage Page (FF80h), */
787 0x85, 0x82, /* Report ID (130), */
788 0x09, 0x22, /* Usage (22h), */
789 0x95, 0x3F, /* Report Count (63), */
790 0xB1, 0x02, /* Feature (Variable), */
791 0x85, 0x83, /* Report ID (131), */
792 0x09, 0x23, /* Usage (23h), */
793 0xB1, 0x02, /* Feature (Variable), */
794 0x85, 0x84, /* Report ID (132), */
795 0x09, 0x24, /* Usage (24h), */
796 0xB1, 0x02, /* Feature (Variable), */
797 0x85, 0x90, /* Report ID (144), */
798 0x09, 0x30, /* Usage (30h), */
799 0xB1, 0x02, /* Feature (Variable), */
800 0x85, 0x91, /* Report ID (145), */
801 0x09, 0x31, /* Usage (31h), */
802 0xB1, 0x02, /* Feature (Variable), */
803 0x85, 0x92, /* Report ID (146), */
804 0x09, 0x32, /* Usage (32h), */
805 0xB1, 0x02, /* Feature (Variable), */
806 0x85, 0x93, /* Report ID (147), */
807 0x09, 0x33, /* Usage (33h), */
808 0xB1, 0x02, /* Feature (Variable), */
809 0x85, 0xA0, /* Report ID (160), */
810 0x09, 0x40, /* Usage (40h), */
811 0xB1, 0x02, /* Feature (Variable), */
812 0x85, 0xA4, /* Report ID (164), */
813 0x09, 0x44, /* Usage (44h), */
814 0xB1, 0x02, /* Feature (Variable), */
815 0xC0 /* End Collection */
816};
817
Pavel Machek1adf9042016-02-09 13:55:08 +0100818static u8 ps3remote_rdesc[] = {
Jiri Kosina078328d2013-06-13 12:03:49 +0200819 0x05, 0x01, /* GUsagePage Generic Desktop */
820 0x09, 0x05, /* LUsage 0x05 [Game Pad] */
821 0xA1, 0x01, /* MCollection Application (mouse, keyboard) */
822
823 /* Use collection 1 for joypad buttons */
824 0xA1, 0x02, /* MCollection Logical (interrelated data) */
825
Antonio Ospiteef916ef2016-02-09 13:55:07 +0100826 /*
827 * Ignore the 1st byte, maybe it is used for a controller
828 * number but it's not needed for correct operation
829 */
Jiri Kosina078328d2013-06-13 12:03:49 +0200830 0x75, 0x08, /* GReportSize 0x08 [8] */
831 0x95, 0x01, /* GReportCount 0x01 [1] */
832 0x81, 0x01, /* MInput 0x01 (Const[0] Arr[1] Abs[2]) */
833
Antonio Ospiteef916ef2016-02-09 13:55:07 +0100834 /*
835 * Bytes from 2nd to 4th are a bitmap for joypad buttons, for these
836 * buttons multiple keypresses are allowed
837 */
Jiri Kosina078328d2013-06-13 12:03:49 +0200838 0x05, 0x09, /* GUsagePage Button */
839 0x19, 0x01, /* LUsageMinimum 0x01 [Button 1 (primary/trigger)] */
840 0x29, 0x18, /* LUsageMaximum 0x18 [Button 24] */
841 0x14, /* GLogicalMinimum [0] */
842 0x25, 0x01, /* GLogicalMaximum 0x01 [1] */
843 0x75, 0x01, /* GReportSize 0x01 [1] */
844 0x95, 0x18, /* GReportCount 0x18 [24] */
845 0x81, 0x02, /* MInput 0x02 (Data[0] Var[1] Abs[2]) */
846
847 0xC0, /* MEndCollection */
848
849 /* Use collection 2 for remote control buttons */
850 0xA1, 0x02, /* MCollection Logical (interrelated data) */
851
852 /* 5th byte is used for remote control buttons */
853 0x05, 0x09, /* GUsagePage Button */
854 0x18, /* LUsageMinimum [No button pressed] */
855 0x29, 0xFE, /* LUsageMaximum 0xFE [Button 254] */
856 0x14, /* GLogicalMinimum [0] */
857 0x26, 0xFE, 0x00, /* GLogicalMaximum 0x00FE [254] */
858 0x75, 0x08, /* GReportSize 0x08 [8] */
859 0x95, 0x01, /* GReportCount 0x01 [1] */
860 0x80, /* MInput */
861
Antonio Ospiteef916ef2016-02-09 13:55:07 +0100862 /*
863 * Ignore bytes from 6th to 11th, 6th to 10th are always constant at
864 * 0xff and 11th is for press indication
865 */
Jiri Kosina078328d2013-06-13 12:03:49 +0200866 0x75, 0x08, /* GReportSize 0x08 [8] */
867 0x95, 0x06, /* GReportCount 0x06 [6] */
868 0x81, 0x01, /* MInput 0x01 (Const[0] Arr[1] Abs[2]) */
869
870 /* 12th byte is for battery strength */
871 0x05, 0x06, /* GUsagePage Generic Device Controls */
872 0x09, 0x20, /* LUsage 0x20 [Battery Strength] */
873 0x14, /* GLogicalMinimum [0] */
874 0x25, 0x05, /* GLogicalMaximum 0x05 [5] */
875 0x75, 0x08, /* GReportSize 0x08 [8] */
876 0x95, 0x01, /* GReportCount 0x01 [1] */
877 0x81, 0x02, /* MInput 0x02 (Data[0] Var[1] Abs[2]) */
878
879 0xC0, /* MEndCollection */
880
881 0xC0 /* MEndCollection [Game Pad] */
882};
883
884static const unsigned int ps3remote_keymap_joypad_buttons[] = {
885 [0x01] = KEY_SELECT,
886 [0x02] = BTN_THUMBL, /* L3 */
887 [0x03] = BTN_THUMBR, /* R3 */
888 [0x04] = BTN_START,
889 [0x05] = KEY_UP,
890 [0x06] = KEY_RIGHT,
891 [0x07] = KEY_DOWN,
892 [0x08] = KEY_LEFT,
893 [0x09] = BTN_TL2, /* L2 */
894 [0x0a] = BTN_TR2, /* R2 */
895 [0x0b] = BTN_TL, /* L1 */
896 [0x0c] = BTN_TR, /* R1 */
897 [0x0d] = KEY_OPTION, /* options/triangle */
898 [0x0e] = KEY_BACK, /* back/circle */
899 [0x0f] = BTN_0, /* cross */
900 [0x10] = KEY_SCREEN, /* view/square */
901 [0x11] = KEY_HOMEPAGE, /* PS button */
902 [0x14] = KEY_ENTER,
903};
904static const unsigned int ps3remote_keymap_remote_buttons[] = {
905 [0x00] = KEY_1,
906 [0x01] = KEY_2,
907 [0x02] = KEY_3,
908 [0x03] = KEY_4,
909 [0x04] = KEY_5,
910 [0x05] = KEY_6,
911 [0x06] = KEY_7,
912 [0x07] = KEY_8,
913 [0x08] = KEY_9,
914 [0x09] = KEY_0,
915 [0x0e] = KEY_ESC, /* return */
916 [0x0f] = KEY_CLEAR,
917 [0x16] = KEY_EJECTCD,
918 [0x1a] = KEY_MENU, /* top menu */
919 [0x28] = KEY_TIME,
920 [0x30] = KEY_PREVIOUS,
921 [0x31] = KEY_NEXT,
922 [0x32] = KEY_PLAY,
923 [0x33] = KEY_REWIND, /* scan back */
924 [0x34] = KEY_FORWARD, /* scan forward */
925 [0x38] = KEY_STOP,
926 [0x39] = KEY_PAUSE,
927 [0x40] = KEY_CONTEXT_MENU, /* pop up/menu */
928 [0x60] = KEY_FRAMEBACK, /* slow/step back */
929 [0x61] = KEY_FRAMEFORWARD, /* slow/step forward */
930 [0x63] = KEY_SUBTITLE,
931 [0x64] = KEY_AUDIO,
932 [0x65] = KEY_ANGLE,
933 [0x70] = KEY_INFO, /* display */
934 [0x80] = KEY_BLUE,
935 [0x81] = KEY_RED,
936 [0x82] = KEY_GREEN,
937 [0x83] = KEY_YELLOW,
938};
939
Colin Leitnerf04d5142013-05-27 23:41:05 +0200940static const unsigned int buzz_keymap[] = {
Frank Praznikad142b92014-02-20 11:36:00 -0500941 /*
942 * The controller has 4 remote buzzers, each with one LED and 5
Colin Leitnerf04d5142013-05-27 23:41:05 +0200943 * buttons.
Antonio Ospite09593e32016-02-09 13:55:06 +0100944 *
Colin Leitnerf04d5142013-05-27 23:41:05 +0200945 * We use the mapping chosen by the controller, which is:
946 *
947 * Key Offset
948 * -------------------
949 * Buzz 1
950 * Blue 5
951 * Orange 4
952 * Green 3
953 * Yellow 2
954 *
955 * So, for example, the orange button on the third buzzer is mapped to
956 * BTN_TRIGGER_HAPPY14
957 */
Antonio Ospite09593e32016-02-09 13:55:06 +0100958 [1] = BTN_TRIGGER_HAPPY1,
959 [2] = BTN_TRIGGER_HAPPY2,
960 [3] = BTN_TRIGGER_HAPPY3,
961 [4] = BTN_TRIGGER_HAPPY4,
962 [5] = BTN_TRIGGER_HAPPY5,
963 [6] = BTN_TRIGGER_HAPPY6,
964 [7] = BTN_TRIGGER_HAPPY7,
965 [8] = BTN_TRIGGER_HAPPY8,
966 [9] = BTN_TRIGGER_HAPPY9,
Colin Leitnerf04d5142013-05-27 23:41:05 +0200967 [10] = BTN_TRIGGER_HAPPY10,
968 [11] = BTN_TRIGGER_HAPPY11,
969 [12] = BTN_TRIGGER_HAPPY12,
970 [13] = BTN_TRIGGER_HAPPY13,
971 [14] = BTN_TRIGGER_HAPPY14,
972 [15] = BTN_TRIGGER_HAPPY15,
973 [16] = BTN_TRIGGER_HAPPY16,
974 [17] = BTN_TRIGGER_HAPPY17,
975 [18] = BTN_TRIGGER_HAPPY18,
976 [19] = BTN_TRIGGER_HAPPY19,
977 [20] = BTN_TRIGGER_HAPPY20,
978};
979
Frank Praznikd902f472014-01-27 10:17:36 -0500980static enum power_supply_property sony_battery_props[] = {
981 POWER_SUPPLY_PROP_PRESENT,
982 POWER_SUPPLY_PROP_CAPACITY,
983 POWER_SUPPLY_PROP_SCOPE,
984 POWER_SUPPLY_PROP_STATUS,
985};
986
Frank Praznik55d3b662014-04-14 10:11:32 -0400987struct sixaxis_led {
Pavel Machek1adf9042016-02-09 13:55:08 +0100988 u8 time_enabled; /* the total time the led is active (0xff means forever) */
989 u8 duty_length; /* how long a cycle is in deciseconds (0 means "really fast") */
990 u8 enabled;
991 u8 duty_off; /* % of duty_length the led is off (0xff means 100%) */
992 u8 duty_on; /* % of duty_length the led is on (0xff mean 100%) */
Frank Praznik55d3b662014-04-14 10:11:32 -0400993} __packed;
994
995struct sixaxis_rumble {
Pavel Machek1adf9042016-02-09 13:55:08 +0100996 u8 padding;
997 u8 right_duration; /* Right motor duration (0xff means forever) */
998 u8 right_motor_on; /* Right (small) motor on/off, only supports values of 0 or 1 (off/on) */
999 u8 left_duration; /* Left motor duration (0xff means forever) */
1000 u8 left_motor_force; /* left (large) motor, supports force values from 0 to 255 */
Frank Praznik55d3b662014-04-14 10:11:32 -04001001} __packed;
1002
1003struct sixaxis_output_report {
Pavel Machek1adf9042016-02-09 13:55:08 +01001004 u8 report_id;
Frank Praznik55d3b662014-04-14 10:11:32 -04001005 struct sixaxis_rumble rumble;
Pavel Machek1adf9042016-02-09 13:55:08 +01001006 u8 padding[4];
1007 u8 leds_bitmap; /* bitmap of enabled LEDs: LED_1 = 0x02, LED_2 = 0x04, ... */
Frank Praznik55d3b662014-04-14 10:11:32 -04001008 struct sixaxis_led led[4]; /* LEDx at (4 - x) */
1009 struct sixaxis_led _reserved; /* LED5, not actually soldered */
1010} __packed;
1011
1012union sixaxis_output_report_01 {
1013 struct sixaxis_output_report data;
Pavel Machek1adf9042016-02-09 13:55:08 +01001014 u8 buf[36];
Frank Praznik55d3b662014-04-14 10:11:32 -04001015};
1016
Frank Praznikc5e0c1c2015-05-05 20:47:30 -04001017struct motion_output_report_02 {
1018 u8 type, zero;
1019 u8 r, g, b;
1020 u8 zero2;
1021 u8 rumble;
1022};
1023
Roderick Colenbrander2c159de2016-10-07 12:39:35 -07001024#define DS4_FEATURE_REPORT_0x02_SIZE 37
1025#define DS4_FEATURE_REPORT_0x81_SIZE 7
Roderick Colenbrander49b9ca62016-10-07 12:39:36 -07001026#define DS4_INPUT_REPORT_0x11_SIZE 78
Roderick Colenbrander2c159de2016-10-07 12:39:35 -07001027#define DS4_OUTPUT_REPORT_0x05_SIZE 32
1028#define DS4_OUTPUT_REPORT_0x11_SIZE 78
Antonio Ospite29b691a2015-02-16 18:12:21 +01001029#define SIXAXIS_REPORT_0xF2_SIZE 17
Antonio Ospitea85d67b2015-02-16 18:12:22 +01001030#define SIXAXIS_REPORT_0xF5_SIZE 8
Simon Wood41d2d422015-06-09 21:27:06 -06001031#define MOTION_REPORT_0x02_SIZE 49
Frank Praznik9b2b5c92014-11-12 14:10:09 -05001032
Roderick Colenbrandercdc1c022016-10-07 12:39:38 -07001033/* Offsets relative to USB input report (0x1). Bluetooth (0x11) requires an
1034 * additional +2.
1035 */
Roderick Colenbranderac797b92016-11-23 14:07:07 -08001036#define DS4_INPUT_REPORT_BUTTON_OFFSET 5
Roderick Colenbrandercdc1c022016-10-07 12:39:38 -07001037#define DS4_INPUT_REPORT_BATTERY_OFFSET 30
1038#define DS4_INPUT_REPORT_TOUCHPAD_OFFSET 33
1039
Roderick Colenbranderac797b92016-11-23 14:07:07 -08001040#define DS4_TOUCHPAD_SUFFIX " Touchpad"
1041
Jiri Kosina8b402c92015-02-23 11:15:44 +01001042static DEFINE_SPINLOCK(sony_dev_list_lock);
Frank Praznikd2d782f2014-02-20 11:36:03 -05001043static LIST_HEAD(sony_device_list);
Frank Praznik80250872014-04-14 10:11:35 -04001044static DEFINE_IDA(sony_device_id_allocator);
Frank Praznikd2d782f2014-02-20 11:36:03 -05001045
Jiri Kosinacc6e0bb2008-10-23 12:58:38 +02001046struct sony_sc {
Frank Praznikd902f472014-01-27 10:17:36 -05001047 spinlock_t lock;
Frank Praznikd2d782f2014-02-20 11:36:03 -05001048 struct list_head list_node;
Sven Eckelmann0a286ef2013-11-19 20:26:32 +01001049 struct hid_device *hdev;
Roderick Colenbranderac797b92016-11-23 14:07:07 -08001050 struct input_dev *touchpad;
Frank Praznik60781cf2014-01-11 15:13:15 -05001051 struct led_classdev *leds[MAX_LEDS];
Jiri Kosinacc6e0bb2008-10-23 12:58:38 +02001052 unsigned long quirks;
Sven Eckelmann0a286ef2013-11-19 20:26:32 +01001053 struct work_struct state_worker;
Antonio Ospite09593e32016-02-09 13:55:06 +01001054 void (*send_output_report)(struct sony_sc *);
Krzysztof Kozlowski297d7162015-03-12 08:44:11 +01001055 struct power_supply *battery;
1056 struct power_supply_desc battery_desc;
Frank Praznik80250872014-04-14 10:11:35 -04001057 int device_id;
Pavel Machek1adf9042016-02-09 13:55:08 +01001058 u8 *output_report_dmabuf;
Colin Leitnerf04d5142013-05-27 23:41:05 +02001059
Sven Eckelmann9f323b62013-11-17 20:38:21 +01001060#ifdef CONFIG_SONY_FF
Pavel Machek1adf9042016-02-09 13:55:08 +01001061 u8 left;
1062 u8 right;
Sven Eckelmann9f323b62013-11-17 20:38:21 +01001063#endif
1064
Pavel Machek1adf9042016-02-09 13:55:08 +01001065 u8 mac_address[6];
1066 u8 worker_initialized;
Frank Praznik2a242932016-09-22 20:18:09 -04001067 u8 defer_initialization;
Pavel Machek1adf9042016-02-09 13:55:08 +01001068 u8 cable_state;
1069 u8 battery_charging;
1070 u8 battery_capacity;
1071 u8 led_state[MAX_LEDS];
1072 u8 resume_led_state[MAX_LEDS];
1073 u8 led_delay_on[MAX_LEDS];
1074 u8 led_delay_off[MAX_LEDS];
1075 u8 led_count;
Jiri Kosinacc6e0bb2008-10-23 12:58:38 +02001076};
1077
Frank Praznik2a242932016-09-22 20:18:09 -04001078static inline void sony_schedule_work(struct sony_sc *sc)
1079{
1080 if (!sc->defer_initialization)
1081 schedule_work(&sc->state_worker);
1082}
1083
Pavel Machek1adf9042016-02-09 13:55:08 +01001084static u8 *sixaxis_fixup(struct hid_device *hdev, u8 *rdesc,
Antonio Ospitec607fb82014-06-24 13:28:41 +02001085 unsigned int *rsize)
1086{
1087 *rsize = sizeof(sixaxis_rdesc);
1088 return sixaxis_rdesc;
1089}
1090
Frank Praznikc5e0c1c2015-05-05 20:47:30 -04001091static u8 *motion_fixup(struct hid_device *hdev, u8 *rdesc,
1092 unsigned int *rsize)
1093{
1094 *rsize = sizeof(motion_rdesc);
1095 return motion_rdesc;
1096}
1097
Simon Woodb2723eb2015-06-17 00:08:53 -06001098static u8 *navigation_fixup(struct hid_device *hdev, u8 *rdesc,
1099 unsigned int *rsize)
1100{
1101 *rsize = sizeof(navigation_rdesc);
1102 return navigation_rdesc;
1103}
1104
Pavel Machek1adf9042016-02-09 13:55:08 +01001105static u8 *ps3remote_fixup(struct hid_device *hdev, u8 *rdesc,
Jiri Kosina078328d2013-06-13 12:03:49 +02001106 unsigned int *rsize)
1107{
1108 *rsize = sizeof(ps3remote_rdesc);
1109 return ps3remote_rdesc;
1110}
1111
1112static int ps3remote_mapping(struct hid_device *hdev, struct hid_input *hi,
1113 struct hid_field *field, struct hid_usage *usage,
1114 unsigned long **bit, int *max)
1115{
1116 unsigned int key = usage->hid & HID_USAGE;
1117
1118 if ((usage->hid & HID_USAGE_PAGE) != HID_UP_BUTTON)
1119 return -1;
1120
1121 switch (usage->collection_index) {
1122 case 1:
1123 if (key >= ARRAY_SIZE(ps3remote_keymap_joypad_buttons))
1124 return -1;
1125
1126 key = ps3remote_keymap_joypad_buttons[key];
1127 if (!key)
1128 return -1;
1129 break;
1130 case 2:
1131 if (key >= ARRAY_SIZE(ps3remote_keymap_remote_buttons))
1132 return -1;
1133
1134 key = ps3remote_keymap_remote_buttons[key];
1135 if (!key)
1136 return -1;
1137 break;
1138 default:
1139 return -1;
1140 }
1141
1142 hid_map_usage_clear(hi, usage, bit, max, EV_KEY, key);
1143 return 1;
1144}
1145
Pavel Machek1adf9042016-02-09 13:55:08 +01001146static u8 *sony_report_fixup(struct hid_device *hdev, u8 *rdesc,
Nikolai Kondrashov73e40082010-08-06 23:03:06 +04001147 unsigned int *rsize)
Jiri Kosinacc6e0bb2008-10-23 12:58:38 +02001148{
1149 struct sony_sc *sc = hid_get_drvdata(hdev);
1150
Mikko Perttunen4ba1eee2016-07-21 19:54:48 +03001151 if (sc->quirks & (SINO_LITE_CONTROLLER | FUTUREMAX_DANCE_MAT))
Scott Moreau74500cc2016-01-13 07:40:42 -07001152 return rdesc;
1153
Fernando Luis Vázquez Cao99d24902013-01-22 15:20:38 +09001154 /*
1155 * Some Sony RF receivers wrongly declare the mouse pointer as a
1156 * a constant non-data variable.
1157 */
1158 if ((sc->quirks & VAIO_RDESC_CONSTANT) && *rsize >= 56 &&
1159 /* usage page: generic desktop controls */
1160 /* rdesc[0] == 0x05 && rdesc[1] == 0x01 && */
1161 /* usage: mouse */
1162 rdesc[2] == 0x09 && rdesc[3] == 0x02 &&
1163 /* input (usage page for x,y axes): constant, variable, relative */
1164 rdesc[54] == 0x81 && rdesc[55] == 0x07) {
Fernando Luis Vázquez Caoa46491842013-01-15 19:40:48 +09001165 hid_info(hdev, "Fixing up Sony RF Receiver report descriptor\n");
Fernando Luis Vázquez Cao99d24902013-01-22 15:20:38 +09001166 /* input: data, variable, relative */
Jiri Kosinacc6e0bb2008-10-23 12:58:38 +02001167 rdesc[55] = 0x06;
1168 }
Simon Wood61ab44b2011-06-10 12:00:26 +02001169
Frank Prazniked19d8c2014-01-16 21:43:12 -05001170 /*
1171 * The default Dualshock 4 USB descriptor doesn't assign
1172 * the gyroscope values to corresponding axes so we need a
1173 * modified one.
1174 */
Frank Praznikb71b5572015-11-06 15:35:53 -05001175 if (sc->quirks & DUALSHOCK4_CONTROLLER_USB) {
Frank Prazniked19d8c2014-01-16 21:43:12 -05001176 hid_info(hdev, "Using modified Dualshock 4 report descriptor with gyroscope axes\n");
1177 rdesc = dualshock4_usb_rdesc;
1178 *rsize = sizeof(dualshock4_usb_rdesc);
Frank Praznikb71b5572015-11-06 15:35:53 -05001179 } else if (sc->quirks & DUALSHOCK4_CONTROLLER_BT) {
Frank Praznikd8296742014-02-05 20:03:45 -05001180 hid_info(hdev, "Using modified Dualshock 4 Bluetooth report descriptor\n");
1181 rdesc = dualshock4_bt_rdesc;
1182 *rsize = sizeof(dualshock4_bt_rdesc);
Frank Prazniked19d8c2014-01-16 21:43:12 -05001183 }
1184
Antonio Ospitec607fb82014-06-24 13:28:41 +02001185 if (sc->quirks & SIXAXIS_CONTROLLER)
1186 return sixaxis_fixup(hdev, rdesc, rsize);
Jiri Kosina078328d2013-06-13 12:03:49 +02001187
Frank Praznikc5e0c1c2015-05-05 20:47:30 -04001188 if (sc->quirks & MOTION_CONTROLLER)
1189 return motion_fixup(hdev, rdesc, rsize);
1190
Simon Wood4545ee02015-06-17 00:08:52 -06001191 if (sc->quirks & NAVIGATION_CONTROLLER)
Simon Woodb2723eb2015-06-17 00:08:53 -06001192 return navigation_fixup(hdev, rdesc, rsize);
Simon Wood4545ee02015-06-17 00:08:52 -06001193
Jiri Kosina078328d2013-06-13 12:03:49 +02001194 if (sc->quirks & PS3REMOTE)
1195 return ps3remote_fixup(hdev, rdesc, rsize);
1196
Nikolai Kondrashov73e40082010-08-06 23:03:06 +04001197 return rdesc;
Jiri Kosinacc6e0bb2008-10-23 12:58:38 +02001198}
1199
Pavel Machek1adf9042016-02-09 13:55:08 +01001200static void sixaxis_parse_report(struct sony_sc *sc, u8 *rd, int size)
Frank Praznikd902f472014-01-27 10:17:36 -05001201{
Pavel Machek1adf9042016-02-09 13:55:08 +01001202 static const u8 sixaxis_battery_capacity[] = { 0, 1, 25, 50, 75, 100 };
Frank Praznikd902f472014-01-27 10:17:36 -05001203 unsigned long flags;
Simon Wood12e9a6d72015-06-09 21:27:05 -06001204 int offset;
Pavel Machek1adf9042016-02-09 13:55:08 +01001205 u8 cable_state, battery_capacity, battery_charging;
Frank Praznikd902f472014-01-27 10:17:36 -05001206
Frank Praznikad142b92014-02-20 11:36:00 -05001207 /*
1208 * The sixaxis is charging if the battery value is 0xee
Frank Praznikd902f472014-01-27 10:17:36 -05001209 * and it is fully charged if the value is 0xef.
1210 * It does not report the actual level while charging so it
1211 * is set to 100% while charging is in progress.
1212 */
Simon Wood12e9a6d72015-06-09 21:27:05 -06001213 offset = (sc->quirks & MOTION_CONTROLLER) ? 12 : 30;
1214
1215 if (rd[offset] >= 0xee) {
Frank Praznikd902f472014-01-27 10:17:36 -05001216 battery_capacity = 100;
Simon Wood12e9a6d72015-06-09 21:27:05 -06001217 battery_charging = !(rd[offset] & 0x01);
Frank Praznik9fddd742014-08-29 13:11:52 -04001218 cable_state = 1;
Frank Praznikd902f472014-01-27 10:17:36 -05001219 } else {
Pavel Machek1adf9042016-02-09 13:55:08 +01001220 u8 index = rd[offset] <= 5 ? rd[offset] : 5;
Frank Praznikac3c9a92014-02-20 11:36:02 -05001221 battery_capacity = sixaxis_battery_capacity[index];
Frank Praznikd902f472014-01-27 10:17:36 -05001222 battery_charging = 0;
Frank Praznik9fddd742014-08-29 13:11:52 -04001223 cable_state = 0;
Frank Praznikd902f472014-01-27 10:17:36 -05001224 }
Frank Praznikd902f472014-01-27 10:17:36 -05001225
1226 spin_lock_irqsave(&sc->lock, flags);
1227 sc->cable_state = cable_state;
1228 sc->battery_capacity = battery_capacity;
1229 sc->battery_charging = battery_charging;
1230 spin_unlock_irqrestore(&sc->lock, flags);
1231}
1232
Pavel Machek1adf9042016-02-09 13:55:08 +01001233static void dualshock4_parse_report(struct sony_sc *sc, u8 *rd, int size)
Frank Praznikd902f472014-01-27 10:17:36 -05001234{
1235 unsigned long flags;
Roderick Colenbrandercdc1c022016-10-07 12:39:38 -07001236 int n, m, offset, num_touch_data, max_touch_data;
Pavel Machek1adf9042016-02-09 13:55:08 +01001237 u8 cable_state, battery_capacity, battery_charging;
Frank Praznikd902f472014-01-27 10:17:36 -05001238
Roderick Colenbrandercdc1c022016-10-07 12:39:38 -07001239 /* When using Bluetooth the header is 2 bytes longer, so skip these. */
1240 int data_offset = (sc->quirks & DUALSHOCK4_CONTROLLER_USB) ? 0 : 2;
Frank Praznik6c5f8602014-02-05 20:03:47 -05001241
Roderick Colenbranderac797b92016-11-23 14:07:07 -08001242 /* Second bit of third button byte is for the touchpad button. */
1243 offset = data_offset + DS4_INPUT_REPORT_BUTTON_OFFSET;
1244 input_report_key(sc->touchpad, BTN_LEFT, rd[offset+2] & 0x2);
1245
Frank Praznikad142b92014-02-20 11:36:00 -05001246 /*
Roderick Colenbrandercdc1c022016-10-07 12:39:38 -07001247 * The lower 4 bits of byte 30 (or 32 for BT) contain the battery level
Frank Praznikd902f472014-01-27 10:17:36 -05001248 * and the 5th bit contains the USB cable state.
1249 */
Roderick Colenbrandercdc1c022016-10-07 12:39:38 -07001250 offset = data_offset + DS4_INPUT_REPORT_BATTERY_OFFSET;
Frank Praznik6c5f8602014-02-05 20:03:47 -05001251 cable_state = (rd[offset] >> 4) & 0x01;
1252 battery_capacity = rd[offset] & 0x0F;
Frank Praznikd902f472014-01-27 10:17:36 -05001253
Frank Praznikad142b92014-02-20 11:36:00 -05001254 /*
1255 * When a USB power source is connected the battery level ranges from
Frank Praznik6c5f8602014-02-05 20:03:47 -05001256 * 0 to 10, and when running on battery power it ranges from 0 to 9.
1257 * A battery level above 10 when plugged in means charge completed.
Frank Praznikd902f472014-01-27 10:17:36 -05001258 */
Frank Praznik6c5f8602014-02-05 20:03:47 -05001259 if (!cable_state || battery_capacity > 10)
Frank Praznikd902f472014-01-27 10:17:36 -05001260 battery_charging = 0;
1261 else
1262 battery_charging = 1;
1263
Frank Praznik6c5f8602014-02-05 20:03:47 -05001264 if (!cable_state)
1265 battery_capacity++;
Frank Praznikd902f472014-01-27 10:17:36 -05001266 if (battery_capacity > 10)
Frank Praznik6c5f8602014-02-05 20:03:47 -05001267 battery_capacity = 10;
1268
Frank Praznikd902f472014-01-27 10:17:36 -05001269 battery_capacity *= 10;
1270
1271 spin_lock_irqsave(&sc->lock, flags);
1272 sc->cable_state = cable_state;
1273 sc->battery_capacity = battery_capacity;
1274 sc->battery_charging = battery_charging;
1275 spin_unlock_irqrestore(&sc->lock, flags);
Frank Praznike5606232014-01-27 10:17:37 -05001276
Frank Praznikad142b92014-02-20 11:36:00 -05001277 /*
Roderick Colenbrandercdc1c022016-10-07 12:39:38 -07001278 * The Dualshock 4 multi-touch trackpad data starts at offset 33 on USB
1279 * and 35 on Bluetooth.
1280 * The first byte indicates the number of touch data in the report.
1281 * Trackpad data starts 2 bytes later (e.g. 35 for USB).
Frank Praznike5606232014-01-27 10:17:37 -05001282 */
Roderick Colenbrandercdc1c022016-10-07 12:39:38 -07001283 offset = data_offset + DS4_INPUT_REPORT_TOUCHPAD_OFFSET;
1284 max_touch_data = (sc->quirks & DUALSHOCK4_CONTROLLER_USB) ? 3 : 4;
1285 if (rd[offset] > 0 && rd[offset] <= max_touch_data)
1286 num_touch_data = rd[offset];
1287 else
1288 num_touch_data = 1;
1289 offset += 1;
Frank Praznike5606232014-01-27 10:17:37 -05001290
Roderick Colenbrandercdc1c022016-10-07 12:39:38 -07001291 for (m = 0; m < num_touch_data; m++) {
1292 /* Skip past timestamp */
1293 offset += 1;
Frank Praznike5606232014-01-27 10:17:37 -05001294
Roderick Colenbrandercdc1c022016-10-07 12:39:38 -07001295 /*
1296 * The first 7 bits of the first byte is a counter and bit 8 is
1297 * a touch indicator that is 0 when pressed and 1 when not
1298 * pressed.
1299 * The next 3 bytes are two 12 bit touch coordinates, X and Y.
1300 * The data for the second touch is in the same format and
1301 * immediately follows the data for the first.
1302 */
1303 for (n = 0; n < 2; n++) {
1304 u16 x, y;
1305 bool active;
Frank Praznike5606232014-01-27 10:17:37 -05001306
Roderick Colenbrandercdc1c022016-10-07 12:39:38 -07001307 x = rd[offset+1] | ((rd[offset+2] & 0xF) << 8);
1308 y = ((rd[offset+2] & 0xF0) >> 4) | (rd[offset+3] << 4);
1309
1310 active = !(rd[offset] >> 7);
Roderick Colenbranderac797b92016-11-23 14:07:07 -08001311 input_mt_slot(sc->touchpad, n);
1312 input_mt_report_slot_state(sc->touchpad, MT_TOOL_FINGER, active);
Roderick Colenbrandercdc1c022016-10-07 12:39:38 -07001313
1314 if (active) {
Roderick Colenbranderac797b92016-11-23 14:07:07 -08001315 input_report_abs(sc->touchpad, ABS_MT_POSITION_X, x);
1316 input_report_abs(sc->touchpad, ABS_MT_POSITION_Y, y);
Roderick Colenbrandercdc1c022016-10-07 12:39:38 -07001317 }
1318
1319 offset += 4;
1320 }
Roderick Colenbranderac797b92016-11-23 14:07:07 -08001321 input_mt_sync_frame(sc->touchpad);
1322 input_sync(sc->touchpad);
Frank Praznike5606232014-01-27 10:17:37 -05001323 }
Frank Praznikd902f472014-01-27 10:17:36 -05001324}
1325
Simon Woodc9e4d872011-06-10 12:00:27 +02001326static int sony_raw_event(struct hid_device *hdev, struct hid_report *report,
Pavel Machek1adf9042016-02-09 13:55:08 +01001327 u8 *rd, int size)
Simon Woodc9e4d872011-06-10 12:00:27 +02001328{
1329 struct sony_sc *sc = hid_get_drvdata(hdev);
1330
Frank Praznikad142b92014-02-20 11:36:00 -05001331 /*
1332 * Sixaxis HID report has acclerometers/gyro with MSByte first, this
Simon Woodc9e4d872011-06-10 12:00:27 +02001333 * has to be BYTE_SWAPPED before passing up to joystick interface
1334 */
Frank Praznikfee4e2d2014-02-18 17:22:01 -05001335 if ((sc->quirks & SIXAXIS_CONTROLLER) && rd[0] == 0x01 && size == 49) {
Frank Praznik8f5f0bc2015-07-23 19:01:16 -04001336 /*
1337 * When connected via Bluetooth the Sixaxis occasionally sends
1338 * a report with the second byte 0xff and the rest zeroed.
1339 *
1340 * This report does not reflect the actual state of the
1341 * controller must be ignored to avoid generating false input
1342 * events.
1343 */
1344 if (rd[1] == 0xff)
1345 return -EINVAL;
1346
Simon Woodc9e4d872011-06-10 12:00:27 +02001347 swap(rd[41], rd[42]);
1348 swap(rd[43], rd[44]);
1349 swap(rd[45], rd[46]);
1350 swap(rd[47], rd[48]);
Frank Praznikd902f472014-01-27 10:17:36 -05001351
1352 sixaxis_parse_report(sc, rd, size);
Simon Wood12e9a6d72015-06-09 21:27:05 -06001353 } else if ((sc->quirks & MOTION_CONTROLLER_BT) && rd[0] == 0x01 && size == 49) {
1354 sixaxis_parse_report(sc, rd, size);
Simon Wood4545ee02015-06-17 00:08:52 -06001355 } else if ((sc->quirks & NAVIGATION_CONTROLLER) && rd[0] == 0x01 &&
1356 size == 49) {
1357 sixaxis_parse_report(sc, rd, size);
Frank Praznik68330d82014-02-05 20:03:49 -05001358 } else if (((sc->quirks & DUALSHOCK4_CONTROLLER_USB) && rd[0] == 0x01 &&
1359 size == 64) || ((sc->quirks & DUALSHOCK4_CONTROLLER_BT)
1360 && rd[0] == 0x11 && size == 78)) {
Roderick Colenbrander49b9ca62016-10-07 12:39:36 -07001361 if (sc->quirks & DUALSHOCK4_CONTROLLER_BT) {
1362 /* CRC check */
1363 u8 bthdr = 0xA1;
1364 u32 crc;
1365 u32 report_crc;
1366
1367 crc = crc32_le(0xFFFFFFFF, &bthdr, 1);
1368 crc = ~crc32_le(crc, rd, DS4_INPUT_REPORT_0x11_SIZE-4);
1369 report_crc = get_unaligned_le32(&rd[DS4_INPUT_REPORT_0x11_SIZE-4]);
1370 if (crc != report_crc) {
1371 hid_dbg(sc->hdev, "DualShock 4 input report's CRC check failed, received crc 0x%0x != 0x%0x\n",
1372 report_crc, crc);
1373 return -EILSEQ;
1374 }
1375 }
Frank Praznikd902f472014-01-27 10:17:36 -05001376 dualshock4_parse_report(sc, rd, size);
Simon Woodc9e4d872011-06-10 12:00:27 +02001377 }
1378
Frank Praznik2a242932016-09-22 20:18:09 -04001379 if (sc->defer_initialization) {
1380 sc->defer_initialization = 0;
1381 sony_schedule_work(sc);
1382 }
1383
Simon Woodc9e4d872011-06-10 12:00:27 +02001384 return 0;
1385}
1386
Colin Leitnerf04d5142013-05-27 23:41:05 +02001387static int sony_mapping(struct hid_device *hdev, struct hid_input *hi,
1388 struct hid_field *field, struct hid_usage *usage,
1389 unsigned long **bit, int *max)
1390{
1391 struct sony_sc *sc = hid_get_drvdata(hdev);
1392
1393 if (sc->quirks & BUZZ_CONTROLLER) {
1394 unsigned int key = usage->hid & HID_USAGE;
1395
1396 if ((usage->hid & HID_USAGE_PAGE) != HID_UP_BUTTON)
1397 return -1;
1398
1399 switch (usage->collection_index) {
1400 case 1:
1401 if (key >= ARRAY_SIZE(buzz_keymap))
1402 return -1;
1403
1404 key = buzz_keymap[key];
1405 if (!key)
1406 return -1;
1407 break;
1408 default:
1409 return -1;
1410 }
1411
1412 hid_map_usage_clear(hi, usage, bit, max, EV_KEY, key);
1413 return 1;
1414 }
1415
Jiri Kosina078328d2013-06-13 12:03:49 +02001416 if (sc->quirks & PS3REMOTE)
1417 return ps3remote_mapping(hdev, hi, field, usage, bit, max);
1418
Benjamin Tissoires6f498012013-07-24 16:53:07 +02001419 /* Let hid-core decide for the others */
1420 return 0;
Colin Leitnerf04d5142013-05-27 23:41:05 +02001421}
1422
Roderick Colenbranderac797b92016-11-23 14:07:07 -08001423static int sony_register_touchpad(struct sony_sc *sc, int touch_count,
Frank Praznikce8efc32014-09-18 21:15:01 -04001424 int w, int h)
1425{
Roderick Colenbranderac797b92016-11-23 14:07:07 -08001426 size_t name_sz;
1427 char *name;
Frank Praznikce8efc32014-09-18 21:15:01 -04001428 int ret;
1429
Roderick Colenbranderac797b92016-11-23 14:07:07 -08001430 sc->touchpad = input_allocate_device();
1431 if (!sc->touchpad)
1432 return -ENOMEM;
Frank Praznikce8efc32014-09-18 21:15:01 -04001433
Roderick Colenbranderac797b92016-11-23 14:07:07 -08001434 input_set_drvdata(sc->touchpad, sc);
1435 sc->touchpad->dev.parent = &sc->hdev->dev;
1436 sc->touchpad->phys = sc->hdev->phys;
1437 sc->touchpad->uniq = sc->hdev->uniq;
1438 sc->touchpad->id.bustype = sc->hdev->bus;
1439 sc->touchpad->id.vendor = sc->hdev->vendor;
1440 sc->touchpad->id.product = sc->hdev->product;
1441 sc->touchpad->id.version = sc->hdev->version;
1442
1443 /* Append a suffix to the controller name as there are various
1444 * DS4 compatible non-Sony devices with different names.
1445 */
1446 name_sz = strlen(sc->hdev->name) + sizeof(DS4_TOUCHPAD_SUFFIX);
1447 name = kzalloc(name_sz, GFP_KERNEL);
1448 if (!name) {
1449 ret = -ENOMEM;
1450 goto err;
1451 }
1452 snprintf(name, name_sz, "%s" DS4_TOUCHPAD_SUFFIX, sc->hdev->name);
1453 sc->touchpad->name = name;
1454
1455 ret = input_mt_init_slots(sc->touchpad, touch_count, 0);
1456 if (ret < 0)
1457 goto err;
1458
1459 /* We map the button underneath the touchpad to BTN_LEFT. */
1460 __set_bit(EV_KEY, sc->touchpad->evbit);
1461 __set_bit(BTN_LEFT, sc->touchpad->keybit);
1462 __set_bit(INPUT_PROP_BUTTONPAD, sc->touchpad->propbit);
1463
1464 input_set_abs_params(sc->touchpad, ABS_MT_POSITION_X, 0, w, 0, 0);
1465 input_set_abs_params(sc->touchpad, ABS_MT_POSITION_Y, 0, h, 0, 0);
1466
1467 ret = input_register_device(sc->touchpad);
1468 if (ret < 0)
1469 goto err;
Frank Praznikce8efc32014-09-18 21:15:01 -04001470
1471 return 0;
Roderick Colenbranderac797b92016-11-23 14:07:07 -08001472
1473err:
1474 kfree(sc->touchpad->name);
1475 sc->touchpad->name = NULL;
1476
1477 input_free_device(sc->touchpad);
1478 sc->touchpad = NULL;
1479
1480 return ret;
Frank Praznikce8efc32014-09-18 21:15:01 -04001481}
1482
Roderick Colenbranderac797b92016-11-23 14:07:07 -08001483static void sony_unregister_touchpad(struct sony_sc *sc)
1484{
1485 if (!sc->touchpad)
1486 return;
1487
1488 kfree(sc->touchpad->name);
1489 sc->touchpad->name = NULL;
1490
1491 input_unregister_device(sc->touchpad);
1492 sc->touchpad = NULL;
1493}
Frank Praznikce8efc32014-09-18 21:15:01 -04001494
Antonio Ospite5710fab2011-02-20 18:26:45 +01001495/*
Jiri Slabybd28ce02008-06-25 23:47:04 +02001496 * Sending HID_REQ_GET_REPORT changes the operation mode of the ps3 controller
1497 * to "operational". Without this, the ps3 controller will not report any
1498 * events.
1499 */
Antonio Ospite816651a2010-05-03 22:15:55 +02001500static int sixaxis_set_operational_usb(struct hid_device *hdev)
Jiri Slabybd28ce02008-06-25 23:47:04 +02001501{
Antonio Ospitea85d67b2015-02-16 18:12:22 +01001502 const int buf_size =
1503 max(SIXAXIS_REPORT_0xF2_SIZE, SIXAXIS_REPORT_0xF5_SIZE);
Pavel Machek1adf9042016-02-09 13:55:08 +01001504 u8 *buf;
Jiri Slabybd28ce02008-06-25 23:47:04 +02001505 int ret;
Jiri Slabybd28ce02008-06-25 23:47:04 +02001506
Antonio Ospite2e701a32015-02-16 18:12:24 +01001507 buf = kmalloc(buf_size, GFP_KERNEL);
Jiri Slabybd28ce02008-06-25 23:47:04 +02001508 if (!buf)
1509 return -ENOMEM;
1510
Antonio Ospitea85d67b2015-02-16 18:12:22 +01001511 ret = hid_hw_raw_request(hdev, 0xf2, buf, SIXAXIS_REPORT_0xF2_SIZE,
1512 HID_FEATURE_REPORT, HID_REQ_GET_REPORT);
Lauri Kasanena7de9b82015-02-16 15:06:59 +02001513 if (ret < 0) {
1514 hid_err(hdev, "can't set operational mode: step 1\n");
1515 goto out;
1516 }
Benjamin Tissoiresf204828a2013-09-11 22:12:25 +02001517
Lauri Kasanena7de9b82015-02-16 15:06:59 +02001518 /*
1519 * Some compatible controllers like the Speedlink Strike FX and
1520 * Gasia need another query plus an USB interrupt to get operational.
1521 */
Antonio Ospitea85d67b2015-02-16 18:12:22 +01001522 ret = hid_hw_raw_request(hdev, 0xf5, buf, SIXAXIS_REPORT_0xF5_SIZE,
1523 HID_FEATURE_REPORT, HID_REQ_GET_REPORT);
Lauri Kasanena7de9b82015-02-16 15:06:59 +02001524 if (ret < 0) {
1525 hid_err(hdev, "can't set operational mode: step 2\n");
1526 goto out;
1527 }
1528
1529 ret = hid_hw_output_report(hdev, buf, 1);
Benjamin Tissoires19f4c2b2016-01-08 17:58:49 +01001530 if (ret < 0) {
1531 hid_info(hdev, "can't set operational mode: step 3, ignoring\n");
1532 ret = 0;
1533 }
Jiri Slabybd28ce02008-06-25 23:47:04 +02001534
Lauri Kasanena7de9b82015-02-16 15:06:59 +02001535out:
Jiri Slabybd28ce02008-06-25 23:47:04 +02001536 kfree(buf);
1537
1538 return ret;
1539}
1540
Antonio Ospite816651a2010-05-03 22:15:55 +02001541static int sixaxis_set_operational_bt(struct hid_device *hdev)
Bastien Noceraf9ce7c22010-01-20 12:01:53 +00001542{
Pavel Machek1adf9042016-02-09 13:55:08 +01001543 static const u8 report[] = { 0xf4, 0x42, 0x03, 0x00, 0x00 };
1544 u8 *buf;
Frank Praznik9b2b5c92014-11-12 14:10:09 -05001545 int ret;
1546
1547 buf = kmemdup(report, sizeof(report), GFP_KERNEL);
1548 if (!buf)
1549 return -ENOMEM;
1550
1551 ret = hid_hw_raw_request(hdev, buf[0], buf, sizeof(report),
Benjamin Tissoiresb0dd72a2014-02-10 12:58:54 -05001552 HID_FEATURE_REPORT, HID_REQ_SET_REPORT);
Frank Praznik9b2b5c92014-11-12 14:10:09 -05001553
1554 kfree(buf);
1555
1556 return ret;
Bastien Noceraf9ce7c22010-01-20 12:01:53 +00001557}
1558
Frank Praznikad142b92014-02-20 11:36:00 -05001559/*
1560 * Requesting feature report 0x02 in Bluetooth mode changes the state of the
Frank Praznik68330d82014-02-05 20:03:49 -05001561 * controller so that it sends full input reports of type 0x11.
1562 */
1563static int dualshock4_set_operational_bt(struct hid_device *hdev)
1564{
Pavel Machek1adf9042016-02-09 13:55:08 +01001565 u8 *buf;
Frank Praznik9b2b5c92014-11-12 14:10:09 -05001566 int ret;
Frank Praznik68330d82014-02-05 20:03:49 -05001567
Roderick Colenbrander2c159de2016-10-07 12:39:35 -07001568 buf = kmalloc(DS4_FEATURE_REPORT_0x02_SIZE, GFP_KERNEL);
Frank Praznik9b2b5c92014-11-12 14:10:09 -05001569 if (!buf)
1570 return -ENOMEM;
1571
Roderick Colenbrander2c159de2016-10-07 12:39:35 -07001572 ret = hid_hw_raw_request(hdev, 0x02, buf, DS4_FEATURE_REPORT_0x02_SIZE,
Frank Praznik68330d82014-02-05 20:03:49 -05001573 HID_FEATURE_REPORT, HID_REQ_GET_REPORT);
Frank Praznik9b2b5c92014-11-12 14:10:09 -05001574
1575 kfree(buf);
1576
1577 return ret;
Jiri Slabybd28ce02008-06-25 23:47:04 +02001578}
1579
Frank Praznik221399b2015-05-05 20:47:32 -04001580static void sixaxis_set_leds_from_id(struct sony_sc *sc)
Frank Praznik80250872014-04-14 10:11:35 -04001581{
Pavel Machek1adf9042016-02-09 13:55:08 +01001582 static const u8 sixaxis_leds[10][4] = {
Frank Praznik80250872014-04-14 10:11:35 -04001583 { 0x01, 0x00, 0x00, 0x00 },
1584 { 0x00, 0x01, 0x00, 0x00 },
1585 { 0x00, 0x00, 0x01, 0x00 },
1586 { 0x00, 0x00, 0x00, 0x01 },
1587 { 0x01, 0x00, 0x00, 0x01 },
1588 { 0x00, 0x01, 0x00, 0x01 },
1589 { 0x00, 0x00, 0x01, 0x01 },
1590 { 0x01, 0x00, 0x01, 0x01 },
1591 { 0x00, 0x01, 0x01, 0x01 },
1592 { 0x01, 0x01, 0x01, 0x01 }
1593 };
1594
Frank Praznik221399b2015-05-05 20:47:32 -04001595 int id = sc->device_id;
1596
1597 BUILD_BUG_ON(MAX_LEDS < ARRAY_SIZE(sixaxis_leds[0]));
Frank Praznik80250872014-04-14 10:11:35 -04001598
1599 if (id < 0)
1600 return;
1601
1602 id %= 10;
Frank Praznik221399b2015-05-05 20:47:32 -04001603 memcpy(sc->led_state, sixaxis_leds[id], sizeof(sixaxis_leds[id]));
Frank Praznik80250872014-04-14 10:11:35 -04001604}
1605
Frank Praznik221399b2015-05-05 20:47:32 -04001606static void dualshock4_set_leds_from_id(struct sony_sc *sc)
Frank Praznik80250872014-04-14 10:11:35 -04001607{
1608 /* The first 4 color/index entries match what the PS4 assigns */
Pavel Machek1adf9042016-02-09 13:55:08 +01001609 static const u8 color_code[7][3] = {
Frank Praznik80250872014-04-14 10:11:35 -04001610 /* Blue */ { 0x00, 0x00, 0x01 },
1611 /* Red */ { 0x01, 0x00, 0x00 },
1612 /* Green */ { 0x00, 0x01, 0x00 },
1613 /* Pink */ { 0x02, 0x00, 0x01 },
1614 /* Orange */ { 0x02, 0x01, 0x00 },
1615 /* Teal */ { 0x00, 0x01, 0x01 },
1616 /* White */ { 0x01, 0x01, 0x01 }
1617 };
1618
Frank Praznik221399b2015-05-05 20:47:32 -04001619 int id = sc->device_id;
1620
1621 BUILD_BUG_ON(MAX_LEDS < ARRAY_SIZE(color_code[0]));
Frank Praznik80250872014-04-14 10:11:35 -04001622
1623 if (id < 0)
1624 return;
1625
1626 id %= 7;
Frank Praznik221399b2015-05-05 20:47:32 -04001627 memcpy(sc->led_state, color_code[id], sizeof(color_code[id]));
Frank Praznik80250872014-04-14 10:11:35 -04001628}
1629
Frank Praznik221399b2015-05-05 20:47:32 -04001630static void buzz_set_leds(struct sony_sc *sc)
Colin Leitnerf04d5142013-05-27 23:41:05 +02001631{
Frank Praznik221399b2015-05-05 20:47:32 -04001632 struct hid_device *hdev = sc->hdev;
Colin Leitnerf04d5142013-05-27 23:41:05 +02001633 struct list_head *report_list =
1634 &hdev->report_enum[HID_OUTPUT_REPORT].report_list;
1635 struct hid_report *report = list_entry(report_list->next,
1636 struct hid_report, list);
Pavel Machek1adf9042016-02-09 13:55:08 +01001637 s32 *value = report->field[0]->value;
Colin Leitnerf04d5142013-05-27 23:41:05 +02001638
Frank Praznik221399b2015-05-05 20:47:32 -04001639 BUILD_BUG_ON(MAX_LEDS < 4);
1640
Colin Leitnerf04d5142013-05-27 23:41:05 +02001641 value[0] = 0x00;
Frank Praznik221399b2015-05-05 20:47:32 -04001642 value[1] = sc->led_state[0] ? 0xff : 0x00;
1643 value[2] = sc->led_state[1] ? 0xff : 0x00;
1644 value[3] = sc->led_state[2] ? 0xff : 0x00;
1645 value[4] = sc->led_state[3] ? 0xff : 0x00;
Colin Leitnerf04d5142013-05-27 23:41:05 +02001646 value[5] = 0x00;
1647 value[6] = 0x00;
1648 hid_hw_request(hdev, report, HID_REQ_SET_REPORT);
1649}
1650
Frank Praznik221399b2015-05-05 20:47:32 -04001651static void sony_set_leds(struct sony_sc *sc)
Sven Eckelmann0a286ef2013-11-19 20:26:32 +01001652{
Frank Praznik221399b2015-05-05 20:47:32 -04001653 if (!(sc->quirks & BUZZ_CONTROLLER))
Frank Praznik2a242932016-09-22 20:18:09 -04001654 sony_schedule_work(sc);
Frank Praznik221399b2015-05-05 20:47:32 -04001655 else
1656 buzz_set_leds(sc);
Sven Eckelmann0a286ef2013-11-19 20:26:32 +01001657}
1658
Sven Eckelmannc5382512013-11-19 20:26:30 +01001659static void sony_led_set_brightness(struct led_classdev *led,
Colin Leitnerf04d5142013-05-27 23:41:05 +02001660 enum led_brightness value)
1661{
1662 struct device *dev = led->dev->parent;
Geliang Tangee79a8f2015-12-27 17:25:21 +08001663 struct hid_device *hdev = to_hid_device(dev);
Colin Leitnerf04d5142013-05-27 23:41:05 +02001664 struct sony_sc *drv_data;
Colin Leitnerf04d5142013-05-27 23:41:05 +02001665
1666 int n;
Frank Praznikb3ed4582014-04-14 10:11:36 -04001667 int force_update;
Colin Leitnerf04d5142013-05-27 23:41:05 +02001668
1669 drv_data = hid_get_drvdata(hdev);
Sven Eckelmann2251b852013-11-19 20:26:31 +01001670 if (!drv_data) {
Colin Leitnerf04d5142013-05-27 23:41:05 +02001671 hid_err(hdev, "No device data\n");
1672 return;
1673 }
Colin Leitnerf04d5142013-05-27 23:41:05 +02001674
Frank Praznikb3ed4582014-04-14 10:11:36 -04001675 /*
1676 * The Sixaxis on USB will override any LED settings sent to it
1677 * and keep flashing all of the LEDs until the PS button is pressed.
1678 * Updates, even if redundant, must be always be sent to the
1679 * controller to avoid having to toggle the state of an LED just to
1680 * stop the flashing later on.
1681 */
1682 force_update = !!(drv_data->quirks & SIXAXIS_CONTROLLER_USB);
1683
Frank Praznik60781cf2014-01-11 15:13:15 -05001684 for (n = 0; n < drv_data->led_count; n++) {
Frank Praznikb3ed4582014-04-14 10:11:36 -04001685 if (led == drv_data->leds[n] && (force_update ||
1686 (value != drv_data->led_state[n] ||
1687 drv_data->led_delay_on[n] ||
1688 drv_data->led_delay_off[n]))) {
1689
1690 drv_data->led_state[n] = value;
1691
1692 /* Setting the brightness stops the blinking */
1693 drv_data->led_delay_on[n] = 0;
1694 drv_data->led_delay_off[n] = 0;
1695
Frank Praznik221399b2015-05-05 20:47:32 -04001696 sony_set_leds(drv_data);
Colin Leitnerf04d5142013-05-27 23:41:05 +02001697 break;
1698 }
1699 }
1700}
1701
Sven Eckelmannc5382512013-11-19 20:26:30 +01001702static enum led_brightness sony_led_get_brightness(struct led_classdev *led)
Colin Leitnerf04d5142013-05-27 23:41:05 +02001703{
1704 struct device *dev = led->dev->parent;
Geliang Tangee79a8f2015-12-27 17:25:21 +08001705 struct hid_device *hdev = to_hid_device(dev);
Colin Leitnerf04d5142013-05-27 23:41:05 +02001706 struct sony_sc *drv_data;
Colin Leitnerf04d5142013-05-27 23:41:05 +02001707
1708 int n;
Colin Leitnerf04d5142013-05-27 23:41:05 +02001709
1710 drv_data = hid_get_drvdata(hdev);
Sven Eckelmann2251b852013-11-19 20:26:31 +01001711 if (!drv_data) {
Colin Leitnerf04d5142013-05-27 23:41:05 +02001712 hid_err(hdev, "No device data\n");
1713 return LED_OFF;
1714 }
Colin Leitnerf04d5142013-05-27 23:41:05 +02001715
Frank Praznik60781cf2014-01-11 15:13:15 -05001716 for (n = 0; n < drv_data->led_count; n++) {
Simon Wood7db75042014-02-05 12:34:18 -07001717 if (led == drv_data->leds[n])
1718 return drv_data->led_state[n];
Colin Leitnerf04d5142013-05-27 23:41:05 +02001719 }
1720
Simon Wood7db75042014-02-05 12:34:18 -07001721 return LED_OFF;
Colin Leitnerf04d5142013-05-27 23:41:05 +02001722}
Colin Leitnerf04d5142013-05-27 23:41:05 +02001723
Frank Praznikb3ed4582014-04-14 10:11:36 -04001724static int sony_led_blink_set(struct led_classdev *led, unsigned long *delay_on,
1725 unsigned long *delay_off)
1726{
1727 struct device *dev = led->dev->parent;
Geliang Tangee79a8f2015-12-27 17:25:21 +08001728 struct hid_device *hdev = to_hid_device(dev);
Frank Praznikb3ed4582014-04-14 10:11:36 -04001729 struct sony_sc *drv_data = hid_get_drvdata(hdev);
1730 int n;
Pavel Machek1adf9042016-02-09 13:55:08 +01001731 u8 new_on, new_off;
Frank Praznikb3ed4582014-04-14 10:11:36 -04001732
1733 if (!drv_data) {
1734 hid_err(hdev, "No device data\n");
1735 return -EINVAL;
1736 }
1737
1738 /* Max delay is 255 deciseconds or 2550 milliseconds */
1739 if (*delay_on > 2550)
1740 *delay_on = 2550;
1741 if (*delay_off > 2550)
1742 *delay_off = 2550;
1743
1744 /* Blink at 1 Hz if both values are zero */
1745 if (!*delay_on && !*delay_off)
1746 *delay_on = *delay_off = 500;
1747
1748 new_on = *delay_on / 10;
1749 new_off = *delay_off / 10;
1750
1751 for (n = 0; n < drv_data->led_count; n++) {
1752 if (led == drv_data->leds[n])
1753 break;
1754 }
1755
1756 /* This LED is not registered on this device */
1757 if (n >= drv_data->led_count)
1758 return -EINVAL;
1759
1760 /* Don't schedule work if the values didn't change */
1761 if (new_on != drv_data->led_delay_on[n] ||
1762 new_off != drv_data->led_delay_off[n]) {
1763 drv_data->led_delay_on[n] = new_on;
1764 drv_data->led_delay_off[n] = new_off;
Frank Praznik2a242932016-09-22 20:18:09 -04001765 sony_schedule_work(drv_data);
Frank Praznikb3ed4582014-04-14 10:11:36 -04001766 }
1767
1768 return 0;
1769}
1770
Frank Praznikfa57a812014-04-14 10:11:33 -04001771static void sony_leds_remove(struct sony_sc *sc)
Sven Eckelmann0a286ef2013-11-19 20:26:32 +01001772{
Sven Eckelmann0a286ef2013-11-19 20:26:32 +01001773 struct led_classdev *led;
1774 int n;
1775
Frank Praznikfa57a812014-04-14 10:11:33 -04001776 BUG_ON(!(sc->quirks & SONY_LED_SUPPORT));
Sven Eckelmann0a286ef2013-11-19 20:26:32 +01001777
Frank Praznikfa57a812014-04-14 10:11:33 -04001778 for (n = 0; n < sc->led_count; n++) {
1779 led = sc->leds[n];
1780 sc->leds[n] = NULL;
Sven Eckelmann0a286ef2013-11-19 20:26:32 +01001781 if (!led)
1782 continue;
1783 led_classdev_unregister(led);
1784 kfree(led);
1785 }
Frank Praznik60781cf2014-01-11 15:13:15 -05001786
Frank Praznikfa57a812014-04-14 10:11:33 -04001787 sc->led_count = 0;
Sven Eckelmann0a286ef2013-11-19 20:26:32 +01001788}
1789
Frank Praznikfa57a812014-04-14 10:11:33 -04001790static int sony_leds_init(struct sony_sc *sc)
Colin Leitnerf04d5142013-05-27 23:41:05 +02001791{
Frank Praznikfa57a812014-04-14 10:11:33 -04001792 struct hid_device *hdev = sc->hdev;
Jiri Kosina40e32ee2013-05-28 11:22:09 +02001793 int n, ret = 0;
Frank Praznikb3ed4582014-04-14 10:11:36 -04001794 int use_ds4_names;
Jiri Kosina40e32ee2013-05-28 11:22:09 +02001795 struct led_classdev *led;
1796 size_t name_sz;
1797 char *name;
Sven Eckelmann0a286ef2013-11-19 20:26:32 +01001798 size_t name_len;
1799 const char *name_fmt;
Frank Praznikb3ed4582014-04-14 10:11:36 -04001800 static const char * const ds4_name_str[] = { "red", "green", "blue",
1801 "global" };
Pavel Machek1adf9042016-02-09 13:55:08 +01001802 u8 max_brightness[MAX_LEDS] = { [0 ... (MAX_LEDS - 1)] = 1 };
1803 u8 use_hw_blink[MAX_LEDS] = { 0 };
Colin Leitnerf04d5142013-05-27 23:41:05 +02001804
Frank Praznikfa57a812014-04-14 10:11:33 -04001805 BUG_ON(!(sc->quirks & SONY_LED_SUPPORT));
Colin Leitnerf04d5142013-05-27 23:41:05 +02001806
Frank Praznikfa57a812014-04-14 10:11:33 -04001807 if (sc->quirks & BUZZ_CONTROLLER) {
1808 sc->led_count = 4;
Frank Praznikb3ed4582014-04-14 10:11:36 -04001809 use_ds4_names = 0;
Sven Eckelmann0a286ef2013-11-19 20:26:32 +01001810 name_len = strlen("::buzz#");
1811 name_fmt = "%s::buzz%d";
1812 /* Validate expected report characteristics. */
1813 if (!hid_validate_values(hdev, HID_OUTPUT_REPORT, 0, 0, 7))
1814 return -ENODEV;
Frank Praznikfa57a812014-04-14 10:11:33 -04001815 } else if (sc->quirks & DUALSHOCK4_CONTROLLER) {
Frank Praznik221399b2015-05-05 20:47:32 -04001816 dualshock4_set_leds_from_id(sc);
1817 sc->led_state[3] = 1;
Frank Praznikb3ed4582014-04-14 10:11:36 -04001818 sc->led_count = 4;
1819 memset(max_brightness, 255, 3);
1820 use_hw_blink[3] = 1;
1821 use_ds4_names = 1;
Frank Praznik61ebca92014-01-20 12:27:02 -05001822 name_len = 0;
1823 name_fmt = "%s:%s";
Frank Praznikc5e0c1c2015-05-05 20:47:30 -04001824 } else if (sc->quirks & MOTION_CONTROLLER) {
1825 sc->led_count = 3;
1826 memset(max_brightness, 255, 3);
1827 use_ds4_names = 1;
1828 name_len = 0;
1829 name_fmt = "%s:%s";
Simon Wood4545ee02015-06-17 00:08:52 -06001830 } else if (sc->quirks & NAVIGATION_CONTROLLER) {
Pavel Machek1adf9042016-02-09 13:55:08 +01001831 static const u8 navigation_leds[4] = {0x01, 0x00, 0x00, 0x00};
Simon Wood4545ee02015-06-17 00:08:52 -06001832
1833 memcpy(sc->led_state, navigation_leds, sizeof(navigation_leds));
1834 sc->led_count = 1;
1835 memset(use_hw_blink, 1, 4);
1836 use_ds4_names = 0;
1837 name_len = strlen("::sony#");
1838 name_fmt = "%s::sony%d";
Frank Praznik60781cf2014-01-11 15:13:15 -05001839 } else {
Frank Praznik221399b2015-05-05 20:47:32 -04001840 sixaxis_set_leds_from_id(sc);
Frank Praznikfa57a812014-04-14 10:11:33 -04001841 sc->led_count = 4;
Frank Praznikb3ed4582014-04-14 10:11:36 -04001842 memset(use_hw_blink, 1, 4);
1843 use_ds4_names = 0;
Frank Praznik61ebca92014-01-20 12:27:02 -05001844 name_len = strlen("::sony#");
1845 name_fmt = "%s::sony%d";
Frank Praznik60781cf2014-01-11 15:13:15 -05001846 }
1847
Frank Praznikad142b92014-02-20 11:36:00 -05001848 /*
1849 * Clear LEDs as we have no way of reading their initial state. This is
Colin Leitnerf04d5142013-05-27 23:41:05 +02001850 * only relevant if the driver is loaded after somebody actively set the
Frank Praznikad142b92014-02-20 11:36:00 -05001851 * LEDs to on
1852 */
Frank Praznik221399b2015-05-05 20:47:32 -04001853 sony_set_leds(sc);
Colin Leitnerf04d5142013-05-27 23:41:05 +02001854
Sven Eckelmann0a286ef2013-11-19 20:26:32 +01001855 name_sz = strlen(dev_name(&hdev->dev)) + name_len + 1;
Colin Leitnerf04d5142013-05-27 23:41:05 +02001856
Frank Praznikfa57a812014-04-14 10:11:33 -04001857 for (n = 0; n < sc->led_count; n++) {
Frank Praznik61ebca92014-01-20 12:27:02 -05001858
Frank Praznikb3ed4582014-04-14 10:11:36 -04001859 if (use_ds4_names)
1860 name_sz = strlen(dev_name(&hdev->dev)) + strlen(ds4_name_str[n]) + 2;
Frank Praznik61ebca92014-01-20 12:27:02 -05001861
Jiri Kosina40e32ee2013-05-28 11:22:09 +02001862 led = kzalloc(sizeof(struct led_classdev) + name_sz, GFP_KERNEL);
1863 if (!led) {
1864 hid_err(hdev, "Couldn't allocate memory for LED %d\n", n);
Julia Lawall8cd5fcd2013-12-29 23:47:27 +01001865 ret = -ENOMEM;
Jiri Kosina40e32ee2013-05-28 11:22:09 +02001866 goto error_leds;
Colin Leitnerf04d5142013-05-27 23:41:05 +02001867 }
Jiri Kosina40e32ee2013-05-28 11:22:09 +02001868
1869 name = (void *)(&led[1]);
Frank Praznikb3ed4582014-04-14 10:11:36 -04001870 if (use_ds4_names)
1871 snprintf(name, name_sz, name_fmt, dev_name(&hdev->dev),
1872 ds4_name_str[n]);
Frank Praznik61ebca92014-01-20 12:27:02 -05001873 else
1874 snprintf(name, name_sz, name_fmt, dev_name(&hdev->dev), n + 1);
Jiri Kosina40e32ee2013-05-28 11:22:09 +02001875 led->name = name;
Frank Praznik221399b2015-05-05 20:47:32 -04001876 led->brightness = sc->led_state[n];
Frank Praznikb3ed4582014-04-14 10:11:36 -04001877 led->max_brightness = max_brightness[n];
Sven Eckelmannc5382512013-11-19 20:26:30 +01001878 led->brightness_get = sony_led_get_brightness;
1879 led->brightness_set = sony_led_set_brightness;
Jiri Kosina40e32ee2013-05-28 11:22:09 +02001880
Frank Praznikb3ed4582014-04-14 10:11:36 -04001881 if (use_hw_blink[n])
1882 led->blink_set = sony_led_blink_set;
1883
Frank Praznik80250872014-04-14 10:11:35 -04001884 sc->leds[n] = led;
1885
Julia Lawall8cd5fcd2013-12-29 23:47:27 +01001886 ret = led_classdev_register(&hdev->dev, led);
1887 if (ret) {
Jiri Kosina40e32ee2013-05-28 11:22:09 +02001888 hid_err(hdev, "Failed to register LED %d\n", n);
Frank Praznik80250872014-04-14 10:11:35 -04001889 sc->leds[n] = NULL;
Jiri Kosina40e32ee2013-05-28 11:22:09 +02001890 kfree(led);
1891 goto error_leds;
1892 }
Colin Leitnerf04d5142013-05-27 23:41:05 +02001893 }
Colin Leitnerf04d5142013-05-27 23:41:05 +02001894
1895 return ret;
1896
Colin Leitnerf04d5142013-05-27 23:41:05 +02001897error_leds:
Frank Praznikfa57a812014-04-14 10:11:33 -04001898 sony_leds_remove(sc);
Colin Leitnerf04d5142013-05-27 23:41:05 +02001899
Colin Leitnerf04d5142013-05-27 23:41:05 +02001900 return ret;
Colin Leitnerf04d5142013-05-27 23:41:05 +02001901}
1902
Frank Praznikd8aaccd2015-11-11 09:49:37 -05001903static void sixaxis_send_output_report(struct sony_sc *sc)
Sven Eckelmanna08c22c2013-11-09 19:25:57 +01001904{
Frank Praznik9b2b5c92014-11-12 14:10:09 -05001905 static const union sixaxis_output_report_01 default_report = {
Frank Praznik55d3b662014-04-14 10:11:32 -04001906 .buf = {
1907 0x01,
Scott Moreauad07b7a2016-01-13 07:40:43 -07001908 0x01, 0xff, 0x00, 0xff, 0x00,
Frank Praznik55d3b662014-04-14 10:11:32 -04001909 0x00, 0x00, 0x00, 0x00, 0x00,
1910 0xff, 0x27, 0x10, 0x00, 0x32,
1911 0xff, 0x27, 0x10, 0x00, 0x32,
1912 0xff, 0x27, 0x10, 0x00, 0x32,
1913 0xff, 0x27, 0x10, 0x00, 0x32,
1914 0x00, 0x00, 0x00, 0x00, 0x00
1915 }
Sven Eckelmanna08c22c2013-11-09 19:25:57 +01001916 };
Frank Praznik9b2b5c92014-11-12 14:10:09 -05001917 struct sixaxis_output_report *report =
1918 (struct sixaxis_output_report *)sc->output_report_dmabuf;
1919 int n;
1920
1921 /* Initialize the report with default values */
1922 memcpy(report, &default_report, sizeof(struct sixaxis_output_report));
Sven Eckelmann9f323b62013-11-17 20:38:21 +01001923
Sven Eckelmann0a286ef2013-11-19 20:26:32 +01001924#ifdef CONFIG_SONY_FF
Frank Praznik9b2b5c92014-11-12 14:10:09 -05001925 report->rumble.right_motor_on = sc->right ? 1 : 0;
1926 report->rumble.left_motor_force = sc->left;
Sven Eckelmann0a286ef2013-11-19 20:26:32 +01001927#endif
1928
Frank Praznik9b2b5c92014-11-12 14:10:09 -05001929 report->leds_bitmap |= sc->led_state[0] << 1;
1930 report->leds_bitmap |= sc->led_state[1] << 2;
1931 report->leds_bitmap |= sc->led_state[2] << 3;
1932 report->leds_bitmap |= sc->led_state[3] << 4;
Sven Eckelmann9f323b62013-11-17 20:38:21 +01001933
Simon Wood88f65762014-04-14 10:11:37 -04001934 /* Set flag for all leds off, required for 3rd party INTEC controller */
Frank Praznik9b2b5c92014-11-12 14:10:09 -05001935 if ((report->leds_bitmap & 0x1E) == 0)
1936 report->leds_bitmap |= 0x20;
Simon Wood88f65762014-04-14 10:11:37 -04001937
Frank Praznikb3ed4582014-04-14 10:11:36 -04001938 /*
1939 * The LEDs in the report are indexed in reverse order to their
1940 * corresponding light on the controller.
1941 * Index 0 = LED 4, index 1 = LED 3, etc...
1942 *
1943 * In the case of both delay values being zero (blinking disabled) the
1944 * default report values should be used or the controller LED will be
1945 * always off.
1946 */
1947 for (n = 0; n < 4; n++) {
1948 if (sc->led_delay_on[n] || sc->led_delay_off[n]) {
Frank Praznik9b2b5c92014-11-12 14:10:09 -05001949 report->led[3 - n].duty_off = sc->led_delay_off[n];
1950 report->led[3 - n].duty_on = sc->led_delay_on[n];
Frank Praznikb3ed4582014-04-14 10:11:36 -04001951 }
1952 }
1953
Pavel Machek1adf9042016-02-09 13:55:08 +01001954 hid_hw_raw_request(sc->hdev, report->report_id, (u8 *)report,
Frank Praznik9b2b5c92014-11-12 14:10:09 -05001955 sizeof(struct sixaxis_output_report),
1956 HID_OUTPUT_REPORT, HID_REQ_SET_REPORT);
Sven Eckelmann9f323b62013-11-17 20:38:21 +01001957}
1958
Frank Praznikd8aaccd2015-11-11 09:49:37 -05001959static void dualshock4_send_output_report(struct sony_sc *sc)
Frank Praznik0bd88dd2014-01-11 15:12:42 -05001960{
Frank Praznik0da8ea62014-01-16 21:42:51 -05001961 struct hid_device *hdev = sc->hdev;
Pavel Machek1adf9042016-02-09 13:55:08 +01001962 u8 *buf = sc->output_report_dmabuf;
Frank Praznik48220232014-02-05 20:03:44 -05001963 int offset;
Frank Praznik0da8ea62014-01-16 21:42:51 -05001964
Frank Praznikc4425c82016-09-22 20:18:10 -04001965 /*
1966 * NOTE: The buf[1] field of the Bluetooth report controls
1967 * the Dualshock 4 reporting rate.
1968 *
1969 * Known values include:
1970 *
1971 * 0x80 - 1000hz (full speed)
1972 * 0xA0 - 31hz
1973 * 0xB0 - 20hz
1974 * 0xD0 - 66hz
1975 */
Frank Praznikfdcf105d2014-02-05 20:03:46 -05001976 if (sc->quirks & DUALSHOCK4_CONTROLLER_USB) {
Roderick Colenbrander2c159de2016-10-07 12:39:35 -07001977 memset(buf, 0, DS4_OUTPUT_REPORT_0x05_SIZE);
Frank Praznikfdcf105d2014-02-05 20:03:46 -05001978 buf[0] = 0x05;
Frank Praznikb3ed4582014-04-14 10:11:36 -04001979 buf[1] = 0xFF;
Frank Praznikfdcf105d2014-02-05 20:03:46 -05001980 offset = 4;
1981 } else {
Roderick Colenbrander2c159de2016-10-07 12:39:35 -07001982 memset(buf, 0, DS4_OUTPUT_REPORT_0x11_SIZE);
Frank Praznikfdcf105d2014-02-05 20:03:46 -05001983 buf[0] = 0x11;
Roderick Colenbrandere7ef53a2016-10-07 12:39:37 -07001984 buf[1] = 0xC0; /* HID + CRC */
Frank Praznikfdcf105d2014-02-05 20:03:46 -05001985 buf[3] = 0x0F;
1986 offset = 6;
1987 }
Frank Praznik0bd88dd2014-01-11 15:12:42 -05001988
1989#ifdef CONFIG_SONY_FF
Frank Praznik48220232014-02-05 20:03:44 -05001990 buf[offset++] = sc->right;
1991 buf[offset++] = sc->left;
1992#else
1993 offset += 2;
Frank Praznik0bd88dd2014-01-11 15:12:42 -05001994#endif
1995
Frank Praznikb3ed4582014-04-14 10:11:36 -04001996 /* LED 3 is the global control */
1997 if (sc->led_state[3]) {
1998 buf[offset++] = sc->led_state[0];
1999 buf[offset++] = sc->led_state[1];
2000 buf[offset++] = sc->led_state[2];
2001 } else {
2002 offset += 3;
2003 }
2004
2005 /* If both delay values are zero the DualShock 4 disables blinking. */
2006 buf[offset++] = sc->led_delay_on[3];
2007 buf[offset++] = sc->led_delay_off[3];
Frank Praznik60781cf2014-01-11 15:13:15 -05002008
Frank Praznikfdcf105d2014-02-05 20:03:46 -05002009 if (sc->quirks & DUALSHOCK4_CONTROLLER_USB)
Roderick Colenbrander2c159de2016-10-07 12:39:35 -07002010 hid_hw_output_report(hdev, buf, DS4_OUTPUT_REPORT_0x05_SIZE);
Roderick Colenbrandere7ef53a2016-10-07 12:39:37 -07002011 else {
2012 /* CRC generation */
2013 u8 bthdr = 0xA2;
2014 u32 crc;
2015
2016 crc = crc32_le(0xFFFFFFFF, &bthdr, 1);
2017 crc = ~crc32_le(crc, buf, DS4_OUTPUT_REPORT_0x11_SIZE-4);
2018 put_unaligned_le32(crc, &buf[74]);
2019 hid_hw_output_report(hdev, buf, DS4_OUTPUT_REPORT_0x11_SIZE);
2020 }
Frank Praznik0bd88dd2014-01-11 15:12:42 -05002021}
2022
Frank Praznikd8aaccd2015-11-11 09:49:37 -05002023static void motion_send_output_report(struct sony_sc *sc)
Frank Praznikc5e0c1c2015-05-05 20:47:30 -04002024{
Frank Praznikc5e0c1c2015-05-05 20:47:30 -04002025 struct hid_device *hdev = sc->hdev;
2026 struct motion_output_report_02 *report =
2027 (struct motion_output_report_02 *)sc->output_report_dmabuf;
2028
Simon Wood41d2d422015-06-09 21:27:06 -06002029 memset(report, 0, MOTION_REPORT_0x02_SIZE);
Frank Praznikc5e0c1c2015-05-05 20:47:30 -04002030
2031 report->type = 0x02; /* set leds */
2032 report->r = sc->led_state[0];
2033 report->g = sc->led_state[1];
2034 report->b = sc->led_state[2];
2035
2036#ifdef CONFIG_SONY_FF
2037 report->rumble = max(sc->right, sc->left);
2038#endif
2039
Pavel Machek1adf9042016-02-09 13:55:08 +01002040 hid_hw_output_report(hdev, (u8 *)report, MOTION_REPORT_0x02_SIZE);
Frank Praznikc5e0c1c2015-05-05 20:47:30 -04002041}
2042
Frank Praznikdecd9462015-11-11 09:49:38 -05002043static inline void sony_send_output_report(struct sony_sc *sc)
2044{
2045 if (sc->send_output_report)
2046 sc->send_output_report(sc);
2047}
2048
Frank Praznikd8aaccd2015-11-11 09:49:37 -05002049static void sony_state_worker(struct work_struct *work)
2050{
2051 struct sony_sc *sc = container_of(work, struct sony_sc, state_worker);
Antonio Ospiteef916ef2016-02-09 13:55:07 +01002052
Frank Praznikd8aaccd2015-11-11 09:49:37 -05002053 sc->send_output_report(sc);
2054}
2055
Frank Praznik9b2b5c92014-11-12 14:10:09 -05002056static int sony_allocate_output_report(struct sony_sc *sc)
2057{
Simon Wood4545ee02015-06-17 00:08:52 -06002058 if ((sc->quirks & SIXAXIS_CONTROLLER) ||
2059 (sc->quirks & NAVIGATION_CONTROLLER))
Frank Praznik9b2b5c92014-11-12 14:10:09 -05002060 sc->output_report_dmabuf =
2061 kmalloc(sizeof(union sixaxis_output_report_01),
2062 GFP_KERNEL);
2063 else if (sc->quirks & DUALSHOCK4_CONTROLLER_BT)
Roderick Colenbrander2c159de2016-10-07 12:39:35 -07002064 sc->output_report_dmabuf = kmalloc(DS4_OUTPUT_REPORT_0x11_SIZE,
Frank Praznik9b2b5c92014-11-12 14:10:09 -05002065 GFP_KERNEL);
2066 else if (sc->quirks & DUALSHOCK4_CONTROLLER_USB)
Roderick Colenbrander2c159de2016-10-07 12:39:35 -07002067 sc->output_report_dmabuf = kmalloc(DS4_OUTPUT_REPORT_0x05_SIZE,
Frank Praznik9b2b5c92014-11-12 14:10:09 -05002068 GFP_KERNEL);
Frank Praznikc5e0c1c2015-05-05 20:47:30 -04002069 else if (sc->quirks & MOTION_CONTROLLER)
Simon Wood41d2d422015-06-09 21:27:06 -06002070 sc->output_report_dmabuf = kmalloc(MOTION_REPORT_0x02_SIZE,
2071 GFP_KERNEL);
Frank Praznik9b2b5c92014-11-12 14:10:09 -05002072 else
2073 return 0;
2074
2075 if (!sc->output_report_dmabuf)
2076 return -ENOMEM;
2077
2078 return 0;
2079}
2080
Sven Eckelmann0a286ef2013-11-19 20:26:32 +01002081#ifdef CONFIG_SONY_FF
Sven Eckelmann9f323b62013-11-17 20:38:21 +01002082static int sony_play_effect(struct input_dev *dev, void *data,
2083 struct ff_effect *effect)
2084{
Sven Eckelmanna08c22c2013-11-09 19:25:57 +01002085 struct hid_device *hid = input_get_drvdata(dev);
Sven Eckelmann9f323b62013-11-17 20:38:21 +01002086 struct sony_sc *sc = hid_get_drvdata(hid);
Sven Eckelmanna08c22c2013-11-09 19:25:57 +01002087
2088 if (effect->type != FF_RUMBLE)
2089 return 0;
2090
Sven Eckelmann9f323b62013-11-17 20:38:21 +01002091 sc->left = effect->u.rumble.strong_magnitude / 256;
Frank Praznik0bd88dd2014-01-11 15:12:42 -05002092 sc->right = effect->u.rumble.weak_magnitude / 256;
Sven Eckelmanna08c22c2013-11-09 19:25:57 +01002093
Frank Praznik2a242932016-09-22 20:18:09 -04002094 sony_schedule_work(sc);
Sven Eckelmann9f323b62013-11-17 20:38:21 +01002095 return 0;
Sven Eckelmanna08c22c2013-11-09 19:25:57 +01002096}
2097
Frank Praznikfa57a812014-04-14 10:11:33 -04002098static int sony_init_ff(struct sony_sc *sc)
Sven Eckelmanna08c22c2013-11-09 19:25:57 +01002099{
Frank Praznikfa57a812014-04-14 10:11:33 -04002100 struct hid_input *hidinput = list_entry(sc->hdev->inputs.next,
Sven Eckelmanna08c22c2013-11-09 19:25:57 +01002101 struct hid_input, list);
2102 struct input_dev *input_dev = hidinput->input;
2103
2104 input_set_capability(input_dev, EV_FF, FF_RUMBLE);
2105 return input_ff_create_memless(input_dev, NULL, sony_play_effect);
2106}
2107
2108#else
Frank Praznikfa57a812014-04-14 10:11:33 -04002109static int sony_init_ff(struct sony_sc *sc)
Sven Eckelmanna08c22c2013-11-09 19:25:57 +01002110{
2111 return 0;
2112}
Sven Eckelmann9f323b62013-11-17 20:38:21 +01002113
Sven Eckelmanna08c22c2013-11-09 19:25:57 +01002114#endif
2115
Frank Praznikd902f472014-01-27 10:17:36 -05002116static int sony_battery_get_property(struct power_supply *psy,
2117 enum power_supply_property psp,
2118 union power_supply_propval *val)
Frank Praznikc4e1ddf2014-01-17 14:46:26 -05002119{
Krzysztof Kozlowski297d7162015-03-12 08:44:11 +01002120 struct sony_sc *sc = power_supply_get_drvdata(psy);
Frank Praznikd902f472014-01-27 10:17:36 -05002121 unsigned long flags;
2122 int ret = 0;
2123 u8 battery_charging, battery_capacity, cable_state;
2124
2125 spin_lock_irqsave(&sc->lock, flags);
2126 battery_charging = sc->battery_charging;
2127 battery_capacity = sc->battery_capacity;
2128 cable_state = sc->cable_state;
2129 spin_unlock_irqrestore(&sc->lock, flags);
2130
2131 switch (psp) {
2132 case POWER_SUPPLY_PROP_PRESENT:
2133 val->intval = 1;
2134 break;
2135 case POWER_SUPPLY_PROP_SCOPE:
2136 val->intval = POWER_SUPPLY_SCOPE_DEVICE;
2137 break;
2138 case POWER_SUPPLY_PROP_CAPACITY:
2139 val->intval = battery_capacity;
2140 break;
2141 case POWER_SUPPLY_PROP_STATUS:
2142 if (battery_charging)
2143 val->intval = POWER_SUPPLY_STATUS_CHARGING;
2144 else
2145 if (battery_capacity == 100 && cable_state)
2146 val->intval = POWER_SUPPLY_STATUS_FULL;
2147 else
2148 val->intval = POWER_SUPPLY_STATUS_DISCHARGING;
2149 break;
2150 default:
2151 ret = -EINVAL;
2152 break;
2153 }
2154 return ret;
2155}
2156
Frank Praznik0f398232016-09-22 20:18:08 -04002157static int sony_battery_probe(struct sony_sc *sc, int append_dev_id)
Frank Praznikd902f472014-01-27 10:17:36 -05002158{
Frank Praznik0f398232016-09-22 20:18:08 -04002159 const char *battery_str_fmt = append_dev_id ?
2160 "sony_controller_battery_%pMR_%i" :
2161 "sony_controller_battery_%pMR";
Krzysztof Kozlowski297d7162015-03-12 08:44:11 +01002162 struct power_supply_config psy_cfg = { .drv_data = sc, };
Frank Praznikc4e1ddf2014-01-17 14:46:26 -05002163 struct hid_device *hdev = sc->hdev;
Frank Praznikd902f472014-01-27 10:17:36 -05002164 int ret;
Frank Praznikc4e1ddf2014-01-17 14:46:26 -05002165
Frank Praznikad142b92014-02-20 11:36:00 -05002166 /*
2167 * Set the default battery level to 100% to avoid low battery warnings
Frank Praznikd9a293a2014-02-05 20:03:48 -05002168 * if the battery is polled before the first device report is received.
2169 */
2170 sc->battery_capacity = 100;
Frank Praznikc4e1ddf2014-01-17 14:46:26 -05002171
Krzysztof Kozlowski297d7162015-03-12 08:44:11 +01002172 sc->battery_desc.properties = sony_battery_props;
2173 sc->battery_desc.num_properties = ARRAY_SIZE(sony_battery_props);
2174 sc->battery_desc.get_property = sony_battery_get_property;
2175 sc->battery_desc.type = POWER_SUPPLY_TYPE_BATTERY;
2176 sc->battery_desc.use_for_apm = 0;
Frank Praznik0f398232016-09-22 20:18:08 -04002177 sc->battery_desc.name = kasprintf(GFP_KERNEL, battery_str_fmt,
2178 sc->mac_address, sc->device_id);
Krzysztof Kozlowski297d7162015-03-12 08:44:11 +01002179 if (!sc->battery_desc.name)
Frank Praznikd902f472014-01-27 10:17:36 -05002180 return -ENOMEM;
2181
Krzysztof Kozlowski297d7162015-03-12 08:44:11 +01002182 sc->battery = power_supply_register(&hdev->dev, &sc->battery_desc,
2183 &psy_cfg);
2184 if (IS_ERR(sc->battery)) {
2185 ret = PTR_ERR(sc->battery);
Frank Praznikd902f472014-01-27 10:17:36 -05002186 hid_err(hdev, "Unable to register battery device\n");
2187 goto err_free;
2188 }
2189
Krzysztof Kozlowski297d7162015-03-12 08:44:11 +01002190 power_supply_powers(sc->battery, &hdev->dev);
Frank Praznikd902f472014-01-27 10:17:36 -05002191 return 0;
2192
2193err_free:
Krzysztof Kozlowski297d7162015-03-12 08:44:11 +01002194 kfree(sc->battery_desc.name);
2195 sc->battery_desc.name = NULL;
Frank Praznikd902f472014-01-27 10:17:36 -05002196 return ret;
2197}
2198
2199static void sony_battery_remove(struct sony_sc *sc)
2200{
Krzysztof Kozlowski297d7162015-03-12 08:44:11 +01002201 if (!sc->battery_desc.name)
Frank Praznikd902f472014-01-27 10:17:36 -05002202 return;
2203
Krzysztof Kozlowski297d7162015-03-12 08:44:11 +01002204 power_supply_unregister(sc->battery);
2205 kfree(sc->battery_desc.name);
2206 sc->battery_desc.name = NULL;
Frank Praznikd902f472014-01-27 10:17:36 -05002207}
2208
Frank Praznikd2d782f2014-02-20 11:36:03 -05002209/*
2210 * If a controller is plugged in via USB while already connected via Bluetooth
2211 * it will show up as two devices. A global list of connected controllers and
2212 * their MAC addresses is maintained to ensure that a device is only connected
2213 * once.
Frank Praznik0f398232016-09-22 20:18:08 -04002214 *
2215 * Some USB-only devices masquerade as Sixaxis controllers and all have the
2216 * same dummy Bluetooth address, so a comparison of the connection type is
2217 * required. Devices are only rejected in the case where two devices have
2218 * matching Bluetooth addresses on different bus types.
Frank Praznikd2d782f2014-02-20 11:36:03 -05002219 */
Frank Praznik0f398232016-09-22 20:18:08 -04002220static inline int sony_compare_connection_type(struct sony_sc *sc0,
2221 struct sony_sc *sc1)
2222{
2223 const int sc0_not_bt = !(sc0->quirks & SONY_BT_DEVICE);
2224 const int sc1_not_bt = !(sc1->quirks & SONY_BT_DEVICE);
2225
2226 return sc0_not_bt == sc1_not_bt;
2227}
2228
Frank Praznikd2d782f2014-02-20 11:36:03 -05002229static int sony_check_add_dev_list(struct sony_sc *sc)
2230{
2231 struct sony_sc *entry;
2232 unsigned long flags;
2233 int ret;
2234
2235 spin_lock_irqsave(&sony_dev_list_lock, flags);
2236
2237 list_for_each_entry(entry, &sony_device_list, list_node) {
2238 ret = memcmp(sc->mac_address, entry->mac_address,
2239 sizeof(sc->mac_address));
2240 if (!ret) {
Frank Praznik0f398232016-09-22 20:18:08 -04002241 if (sony_compare_connection_type(sc, entry)) {
2242 ret = 1;
2243 } else {
2244 ret = -EEXIST;
2245 hid_info(sc->hdev,
2246 "controller with MAC address %pMR already connected\n",
Frank Praznikd2d782f2014-02-20 11:36:03 -05002247 sc->mac_address);
Frank Praznik0f398232016-09-22 20:18:08 -04002248 }
Frank Praznikd2d782f2014-02-20 11:36:03 -05002249 goto unlock;
Frank Praznikc4e1ddf2014-01-17 14:46:26 -05002250 }
2251 }
2252
Frank Praznikd2d782f2014-02-20 11:36:03 -05002253 ret = 0;
2254 list_add(&(sc->list_node), &sony_device_list);
Frank Praznikc4e1ddf2014-01-17 14:46:26 -05002255
Frank Praznikd2d782f2014-02-20 11:36:03 -05002256unlock:
2257 spin_unlock_irqrestore(&sony_dev_list_lock, flags);
2258 return ret;
Frank Praznikc4e1ddf2014-01-17 14:46:26 -05002259}
2260
Frank Praznikd2d782f2014-02-20 11:36:03 -05002261static void sony_remove_dev_list(struct sony_sc *sc)
2262{
2263 unsigned long flags;
2264
2265 if (sc->list_node.next) {
2266 spin_lock_irqsave(&sony_dev_list_lock, flags);
2267 list_del(&(sc->list_node));
2268 spin_unlock_irqrestore(&sony_dev_list_lock, flags);
2269 }
2270}
2271
2272static int sony_get_bt_devaddr(struct sony_sc *sc)
2273{
2274 int ret;
2275
2276 /* HIDP stores the device MAC address as a string in the uniq field. */
2277 ret = strlen(sc->hdev->uniq);
2278 if (ret != 17)
2279 return -EINVAL;
2280
2281 ret = sscanf(sc->hdev->uniq,
2282 "%02hhx:%02hhx:%02hhx:%02hhx:%02hhx:%02hhx",
2283 &sc->mac_address[5], &sc->mac_address[4], &sc->mac_address[3],
2284 &sc->mac_address[2], &sc->mac_address[1], &sc->mac_address[0]);
2285
2286 if (ret != 6)
2287 return -EINVAL;
2288
2289 return 0;
2290}
2291
2292static int sony_check_add(struct sony_sc *sc)
2293{
Pavel Machek1adf9042016-02-09 13:55:08 +01002294 u8 *buf = NULL;
Frank Praznikd2d782f2014-02-20 11:36:03 -05002295 int n, ret;
2296
2297 if ((sc->quirks & DUALSHOCK4_CONTROLLER_BT) ||
Simon Wood12e9a6d72015-06-09 21:27:05 -06002298 (sc->quirks & MOTION_CONTROLLER_BT) ||
Simon Wood4545ee02015-06-17 00:08:52 -06002299 (sc->quirks & NAVIGATION_CONTROLLER_BT) ||
Frank Praznikd2d782f2014-02-20 11:36:03 -05002300 (sc->quirks & SIXAXIS_CONTROLLER_BT)) {
2301 /*
2302 * sony_get_bt_devaddr() attempts to parse the Bluetooth MAC
2303 * address from the uniq string where HIDP stores it.
2304 * As uniq cannot be guaranteed to be a MAC address in all cases
2305 * a failure of this function should not prevent the connection.
2306 */
2307 if (sony_get_bt_devaddr(sc) < 0) {
2308 hid_warn(sc->hdev, "UNIQ does not contain a MAC address; duplicate check skipped\n");
2309 return 0;
2310 }
2311 } else if (sc->quirks & DUALSHOCK4_CONTROLLER_USB) {
Roderick Colenbrander2c159de2016-10-07 12:39:35 -07002312 buf = kmalloc(DS4_FEATURE_REPORT_0x81_SIZE, GFP_KERNEL);
Frank Praznik9b2b5c92014-11-12 14:10:09 -05002313 if (!buf)
2314 return -ENOMEM;
Frank Praznikd2d782f2014-02-20 11:36:03 -05002315
2316 /*
2317 * The MAC address of a DS4 controller connected via USB can be
2318 * retrieved with feature report 0x81. The address begins at
2319 * offset 1.
2320 */
Frank Praznik9b2b5c92014-11-12 14:10:09 -05002321 ret = hid_hw_raw_request(sc->hdev, 0x81, buf,
Roderick Colenbrander2c159de2016-10-07 12:39:35 -07002322 DS4_FEATURE_REPORT_0x81_SIZE, HID_FEATURE_REPORT,
Frank Praznik9b2b5c92014-11-12 14:10:09 -05002323 HID_REQ_GET_REPORT);
Frank Praznikd2d782f2014-02-20 11:36:03 -05002324
Roderick Colenbrander2c159de2016-10-07 12:39:35 -07002325 if (ret != DS4_FEATURE_REPORT_0x81_SIZE) {
Frank Praznikd2d782f2014-02-20 11:36:03 -05002326 hid_err(sc->hdev, "failed to retrieve feature report 0x81 with the DualShock 4 MAC address\n");
Frank Praznik9b2b5c92014-11-12 14:10:09 -05002327 ret = ret < 0 ? ret : -EINVAL;
2328 goto out_free;
Frank Praznikd2d782f2014-02-20 11:36:03 -05002329 }
2330
2331 memcpy(sc->mac_address, &buf[1], sizeof(sc->mac_address));
Simon Wood4545ee02015-06-17 00:08:52 -06002332 } else if ((sc->quirks & SIXAXIS_CONTROLLER_USB) ||
2333 (sc->quirks & NAVIGATION_CONTROLLER_USB)) {
Frank Praznik9b2b5c92014-11-12 14:10:09 -05002334 buf = kmalloc(SIXAXIS_REPORT_0xF2_SIZE, GFP_KERNEL);
2335 if (!buf)
2336 return -ENOMEM;
Frank Praznikd2d782f2014-02-20 11:36:03 -05002337
2338 /*
2339 * The MAC address of a Sixaxis controller connected via USB can
2340 * be retrieved with feature report 0xf2. The address begins at
2341 * offset 4.
2342 */
Frank Praznik9b2b5c92014-11-12 14:10:09 -05002343 ret = hid_hw_raw_request(sc->hdev, 0xf2, buf,
2344 SIXAXIS_REPORT_0xF2_SIZE, HID_FEATURE_REPORT,
2345 HID_REQ_GET_REPORT);
Frank Praznikd2d782f2014-02-20 11:36:03 -05002346
Frank Praznik9b2b5c92014-11-12 14:10:09 -05002347 if (ret != SIXAXIS_REPORT_0xF2_SIZE) {
Frank Praznikd2d782f2014-02-20 11:36:03 -05002348 hid_err(sc->hdev, "failed to retrieve feature report 0xf2 with the Sixaxis MAC address\n");
Frank Praznik9b2b5c92014-11-12 14:10:09 -05002349 ret = ret < 0 ? ret : -EINVAL;
2350 goto out_free;
Frank Praznikd2d782f2014-02-20 11:36:03 -05002351 }
2352
2353 /*
2354 * The Sixaxis device MAC in the report is big-endian and must
2355 * be byte-swapped.
2356 */
2357 for (n = 0; n < 6; n++)
2358 sc->mac_address[5-n] = buf[4+n];
2359 } else {
2360 return 0;
2361 }
2362
Frank Praznik9b2b5c92014-11-12 14:10:09 -05002363 ret = sony_check_add_dev_list(sc);
2364
2365out_free:
2366
2367 kfree(buf);
2368
2369 return ret;
Frank Praznikd2d782f2014-02-20 11:36:03 -05002370}
2371
Frank Praznik80250872014-04-14 10:11:35 -04002372static int sony_set_device_id(struct sony_sc *sc)
2373{
2374 int ret;
2375
2376 /*
2377 * Only DualShock 4 or Sixaxis controllers get an id.
2378 * All others are set to -1.
2379 */
2380 if ((sc->quirks & SIXAXIS_CONTROLLER) ||
2381 (sc->quirks & DUALSHOCK4_CONTROLLER)) {
2382 ret = ida_simple_get(&sony_device_id_allocator, 0, 0,
2383 GFP_KERNEL);
2384 if (ret < 0) {
2385 sc->device_id = -1;
2386 return ret;
2387 }
2388 sc->device_id = ret;
2389 } else {
2390 sc->device_id = -1;
2391 }
2392
2393 return 0;
2394}
2395
2396static void sony_release_device_id(struct sony_sc *sc)
2397{
2398 if (sc->device_id >= 0) {
2399 ida_simple_remove(&sony_device_id_allocator, sc->device_id);
2400 sc->device_id = -1;
2401 }
2402}
2403
Frank Praznikd8aaccd2015-11-11 09:49:37 -05002404static inline void sony_init_output_report(struct sony_sc *sc,
Antonio Ospite09593e32016-02-09 13:55:06 +01002405 void (*send_output_report)(struct sony_sc *))
Frank Praznik46262042014-04-14 10:11:31 -04002406{
Frank Praznikd8aaccd2015-11-11 09:49:37 -05002407 sc->send_output_report = send_output_report;
2408
Frank Praznik46262042014-04-14 10:11:31 -04002409 if (!sc->worker_initialized)
Frank Praznikd8aaccd2015-11-11 09:49:37 -05002410 INIT_WORK(&sc->state_worker, sony_state_worker);
Frank Praznik46262042014-04-14 10:11:31 -04002411
2412 sc->worker_initialized = 1;
2413}
2414
2415static inline void sony_cancel_work_sync(struct sony_sc *sc)
2416{
2417 if (sc->worker_initialized)
2418 cancel_work_sync(&sc->state_worker);
2419}
Frank Praznikd2d782f2014-02-20 11:36:03 -05002420
Roderick Colenbrandere1bc84d2016-10-07 12:39:34 -07002421static int sony_input_configured(struct hid_device *hdev,
2422 struct hid_input *hidinput)
Jiri Slabybd28ce02008-06-25 23:47:04 +02002423{
Roderick Colenbrandere1bc84d2016-10-07 12:39:34 -07002424 struct sony_sc *sc = hid_get_drvdata(hdev);
Frank Praznik0f398232016-09-22 20:18:08 -04002425 int append_dev_id;
Roderick Colenbrandere1bc84d2016-10-07 12:39:34 -07002426 int ret;
Jiri Slabybd28ce02008-06-25 23:47:04 +02002427
Frank Praznik80250872014-04-14 10:11:35 -04002428 ret = sony_set_device_id(sc);
2429 if (ret < 0) {
2430 hid_err(hdev, "failed to allocate the device id\n");
2431 goto err_stop;
2432 }
2433
Frank Praznik131a8a92015-05-05 20:47:28 -04002434 ret = sony_allocate_output_report(sc);
2435 if (ret < 0) {
2436 hid_err(hdev, "failed to allocate the output report buffer\n");
2437 goto err_stop;
2438 }
2439
Simon Wood4545ee02015-06-17 00:08:52 -06002440 if ((sc->quirks & SIXAXIS_CONTROLLER_USB) ||
2441 (sc->quirks & NAVIGATION_CONTROLLER_USB)) {
Benjamin Tissoirese534a932014-03-08 22:52:42 -05002442 /*
2443 * The Sony Sixaxis does not handle HID Output Reports on the
2444 * Interrupt EP like it could, so we need to force HID Output
2445 * Reports to use HID_REQ_SET_REPORT on the Control EP.
2446 *
2447 * There is also another issue about HID Output Reports via USB,
2448 * the Sixaxis does not want the report_id as part of the data
2449 * packet, so we have to discard buf[0] when sending the actual
2450 * control message, even for numbered reports, humpf!
Frank Praznik2a242932016-09-22 20:18:09 -04002451 *
2452 * Additionally, the Sixaxis on USB isn't properly initialized
2453 * until the PS logo button is pressed and as such won't retain
2454 * any state set by an output report, so the initial
2455 * configuration report is deferred until the first input
2456 * report arrives.
Benjamin Tissoirese534a932014-03-08 22:52:42 -05002457 */
2458 hdev->quirks |= HID_QUIRK_NO_OUTPUT_REPORTS_ON_INTR_EP;
2459 hdev->quirks |= HID_QUIRK_SKIP_OUTPUT_REPORT_ID;
Frank Praznik2a242932016-09-22 20:18:09 -04002460 sc->defer_initialization = 1;
Antonio Ospite816651a2010-05-03 22:15:55 +02002461 ret = sixaxis_set_operational_usb(hdev);
Frank Praznikd8aaccd2015-11-11 09:49:37 -05002462 sony_init_output_report(sc, sixaxis_send_output_report);
Simon Wood4545ee02015-06-17 00:08:52 -06002463 } else if ((sc->quirks & SIXAXIS_CONTROLLER_BT) ||
2464 (sc->quirks & NAVIGATION_CONTROLLER_BT)) {
Frank Praznik2078b9bb2014-03-15 09:41:16 -04002465 /*
2466 * The Sixaxis wants output reports sent on the ctrl endpoint
2467 * when connected via Bluetooth.
2468 */
2469 hdev->quirks |= HID_QUIRK_NO_OUTPUT_REPORTS_ON_INTR_EP;
Antonio Ospite816651a2010-05-03 22:15:55 +02002470 ret = sixaxis_set_operational_bt(hdev);
Frank Praznikd8aaccd2015-11-11 09:49:37 -05002471 sony_init_output_report(sc, sixaxis_send_output_report);
Frank Praznikfee4e2d2014-02-18 17:22:01 -05002472 } else if (sc->quirks & DUALSHOCK4_CONTROLLER) {
Frank Praznik68330d82014-02-05 20:03:49 -05002473 if (sc->quirks & DUALSHOCK4_CONTROLLER_BT) {
2474 ret = dualshock4_set_operational_bt(hdev);
2475 if (ret < 0) {
2476 hid_err(hdev, "failed to set the Dualshock 4 operational mode\n");
2477 goto err_stop;
2478 }
2479 }
Frank Praznikc4e1ddf2014-01-17 14:46:26 -05002480
Roderick Colenbrandere1bc84d2016-10-07 12:39:34 -07002481 /*
2482 * The Dualshock 4 touchpad supports 2 touches and has a
2483 * resolution of 1920x942 (44.86 dots/mm).
2484 */
Roderick Colenbranderac797b92016-11-23 14:07:07 -08002485 ret = sony_register_touchpad(sc, 2, 1920, 942);
Roderick Colenbrandere1bc84d2016-10-07 12:39:34 -07002486 if (ret) {
2487 hid_err(sc->hdev,
2488 "Unable to initialize multi-touch slots: %d\n",
2489 ret);
2490 return ret;
2491 }
2492
Frank Praznikd8aaccd2015-11-11 09:49:37 -05002493 sony_init_output_report(sc, dualshock4_send_output_report);
Frank Praznikc5e0c1c2015-05-05 20:47:30 -04002494 } else if (sc->quirks & MOTION_CONTROLLER) {
Frank Praznikd8aaccd2015-11-11 09:49:37 -05002495 sony_init_output_report(sc, motion_send_output_report);
Frank Praznik0bd88dd2014-01-11 15:12:42 -05002496 } else {
2497 ret = 0;
2498 }
Bastien Noceraf9ce7c22010-01-20 12:01:53 +00002499
Jiri Kosina4dfdc462008-12-30 00:49:59 +01002500 if (ret < 0)
Jiri Slabybd28ce02008-06-25 23:47:04 +02002501 goto err_stop;
2502
Frank Praznik0f398232016-09-22 20:18:08 -04002503 ret = append_dev_id = sony_check_add(sc);
Frank Praznikd2d782f2014-02-20 11:36:03 -05002504 if (ret < 0)
2505 goto err_stop;
2506
Sven Eckelmann0a286ef2013-11-19 20:26:32 +01002507 if (sc->quirks & SONY_LED_SUPPORT) {
Frank Praznikfa57a812014-04-14 10:11:33 -04002508 ret = sony_leds_init(sc);
Sven Eckelmann0a286ef2013-11-19 20:26:32 +01002509 if (ret < 0)
2510 goto err_stop;
2511 }
2512
Frank Praznikd902f472014-01-27 10:17:36 -05002513 if (sc->quirks & SONY_BATTERY_SUPPORT) {
Frank Praznik0f398232016-09-22 20:18:08 -04002514 ret = sony_battery_probe(sc, append_dev_id);
Frank Praznikd902f472014-01-27 10:17:36 -05002515 if (ret < 0)
2516 goto err_stop;
2517
2518 /* Open the device to receive reports with battery info */
2519 ret = hid_hw_open(hdev);
2520 if (ret < 0) {
2521 hid_err(hdev, "hw open failed\n");
2522 goto err_stop;
2523 }
2524 }
2525
Frank Praznikc8de9db2014-02-20 11:36:01 -05002526 if (sc->quirks & SONY_FF_SUPPORT) {
Frank Praznikfa57a812014-04-14 10:11:33 -04002527 ret = sony_init_ff(sc);
Frank Praznikc8de9db2014-02-20 11:36:01 -05002528 if (ret < 0)
2529 goto err_close;
Frank Praznik5f5750d2014-02-19 13:09:22 -05002530 }
Sven Eckelmanna08c22c2013-11-09 19:25:57 +01002531
Jiri Slabybd28ce02008-06-25 23:47:04 +02002532 return 0;
Frank Praznikd902f472014-01-27 10:17:36 -05002533err_close:
2534 hid_hw_close(hdev);
Jiri Slabybd28ce02008-06-25 23:47:04 +02002535err_stop:
Sven Eckelmann0a286ef2013-11-19 20:26:32 +01002536 if (sc->quirks & SONY_LED_SUPPORT)
Frank Praznikfa57a812014-04-14 10:11:33 -04002537 sony_leds_remove(sc);
Frank Praznikd902f472014-01-27 10:17:36 -05002538 if (sc->quirks & SONY_BATTERY_SUPPORT)
2539 sony_battery_remove(sc);
Frank Praznik46262042014-04-14 10:11:31 -04002540 sony_cancel_work_sync(sc);
Frank Praznik9b2b5c92014-11-12 14:10:09 -05002541 kfree(sc->output_report_dmabuf);
Frank Praznikd2d782f2014-02-20 11:36:03 -05002542 sony_remove_dev_list(sc);
Frank Praznik80250872014-04-14 10:11:35 -04002543 sony_release_device_id(sc);
Jiri Slabybd28ce02008-06-25 23:47:04 +02002544 hid_hw_stop(hdev);
Jiri Slabybd28ce02008-06-25 23:47:04 +02002545 return ret;
2546}
2547
Roderick Colenbrandere1bc84d2016-10-07 12:39:34 -07002548static int sony_probe(struct hid_device *hdev, const struct hid_device_id *id)
2549{
2550 int ret;
2551 unsigned long quirks = id->driver_data;
2552 struct sony_sc *sc;
2553 unsigned int connect_mask = HID_CONNECT_DEFAULT;
2554
2555 if (!strcmp(hdev->name, "FutureMax Dance Mat"))
2556 quirks |= FUTUREMAX_DANCE_MAT;
2557
2558 sc = devm_kzalloc(&hdev->dev, sizeof(*sc), GFP_KERNEL);
2559 if (sc == NULL) {
2560 hid_err(hdev, "can't alloc sony descriptor\n");
2561 return -ENOMEM;
2562 }
2563
2564 spin_lock_init(&sc->lock);
2565
2566 sc->quirks = quirks;
2567 hid_set_drvdata(hdev, sc);
2568 sc->hdev = hdev;
2569
2570 ret = hid_parse(hdev);
2571 if (ret) {
2572 hid_err(hdev, "parse failed\n");
2573 return ret;
2574 }
2575
2576 if (sc->quirks & VAIO_RDESC_CONSTANT)
2577 connect_mask |= HID_CONNECT_HIDDEV_FORCE;
2578 else if (sc->quirks & SIXAXIS_CONTROLLER)
2579 connect_mask |= HID_CONNECT_HIDDEV_FORCE;
2580
2581 ret = hid_hw_start(hdev, connect_mask);
2582 if (ret) {
2583 hid_err(hdev, "hw start failed\n");
2584 return ret;
2585 }
2586
Roderick Colenbrander4f967f62016-11-23 14:07:06 -08002587 /* sony_input_configured can fail, but this doesn't result
2588 * in hid_hw_start failures (intended). Check whether
2589 * the HID layer claimed the device else fail.
2590 * We don't know the actual reason for the failure, most
2591 * likely it is due to EEXIST in case of double connection
2592 * of USB and Bluetooth, but could have been due to ENOMEM
2593 * or other reasons as well.
2594 */
2595 if (!(hdev->claimed & HID_CLAIMED_INPUT)) {
2596 hid_err(hdev, "failed to claim input\n");
2597 return -ENODEV;
2598 }
2599
Roderick Colenbrandere1bc84d2016-10-07 12:39:34 -07002600 return ret;
2601}
2602
Jiri Kosinacc6e0bb2008-10-23 12:58:38 +02002603static void sony_remove(struct hid_device *hdev)
2604{
Colin Leitnerf04d5142013-05-27 23:41:05 +02002605 struct sony_sc *sc = hid_get_drvdata(hdev);
2606
Roderick Colenbranderac797b92016-11-23 14:07:07 -08002607 hid_hw_close(hdev);
2608
Sven Eckelmann0a286ef2013-11-19 20:26:32 +01002609 if (sc->quirks & SONY_LED_SUPPORT)
Frank Praznikfa57a812014-04-14 10:11:33 -04002610 sony_leds_remove(sc);
Colin Leitnerf04d5142013-05-27 23:41:05 +02002611
Roderick Colenbranderac797b92016-11-23 14:07:07 -08002612 if (sc->quirks & SONY_BATTERY_SUPPORT)
Frank Praznikd902f472014-01-27 10:17:36 -05002613 sony_battery_remove(sc);
Roderick Colenbranderac797b92016-11-23 14:07:07 -08002614
2615 if (sc->touchpad)
2616 sony_unregister_touchpad(sc);
Frank Praznikd902f472014-01-27 10:17:36 -05002617
Frank Praznik46262042014-04-14 10:11:31 -04002618 sony_cancel_work_sync(sc);
Sven Eckelmann9f323b62013-11-17 20:38:21 +01002619
Frank Praznik9b2b5c92014-11-12 14:10:09 -05002620 kfree(sc->output_report_dmabuf);
2621
Frank Praznikd2d782f2014-02-20 11:36:03 -05002622 sony_remove_dev_list(sc);
Jiri Slabybd28ce02008-06-25 23:47:04 +02002623
Frank Praznik80250872014-04-14 10:11:35 -04002624 sony_release_device_id(sc);
2625
Jiri Slabybd28ce02008-06-25 23:47:04 +02002626 hid_hw_stop(hdev);
2627}
2628
Frank Praznikdecd9462015-11-11 09:49:38 -05002629#ifdef CONFIG_PM
2630
2631static int sony_suspend(struct hid_device *hdev, pm_message_t message)
2632{
2633 /*
2634 * On suspend save the current LED state,
2635 * stop running force-feedback and blank the LEDS.
Antonio Ospite09593e32016-02-09 13:55:06 +01002636 */
Frank Praznikdecd9462015-11-11 09:49:38 -05002637 if (SONY_LED_SUPPORT || SONY_FF_SUPPORT) {
2638 struct sony_sc *sc = hid_get_drvdata(hdev);
2639
2640#ifdef CONFIG_SONY_FF
2641 sc->left = sc->right = 0;
2642#endif
2643
2644 memcpy(sc->resume_led_state, sc->led_state,
2645 sizeof(sc->resume_led_state));
2646 memset(sc->led_state, 0, sizeof(sc->led_state));
2647
2648 sony_send_output_report(sc);
2649 }
2650
2651 return 0;
2652}
2653
2654static int sony_resume(struct hid_device *hdev)
2655{
2656 /* Restore the state of controller LEDs on resume */
2657 if (SONY_LED_SUPPORT) {
2658 struct sony_sc *sc = hid_get_drvdata(hdev);
2659
2660 memcpy(sc->led_state, sc->resume_led_state,
2661 sizeof(sc->led_state));
2662
2663 /*
2664 * The Sixaxis and navigation controllers on USB need to be
2665 * reinitialized on resume or they won't behave properly.
2666 */
2667 if ((sc->quirks & SIXAXIS_CONTROLLER_USB) ||
Frank Praznik2a242932016-09-22 20:18:09 -04002668 (sc->quirks & NAVIGATION_CONTROLLER_USB)) {
Frank Praznikdecd9462015-11-11 09:49:38 -05002669 sixaxis_set_operational_usb(sc->hdev);
Frank Praznik2a242932016-09-22 20:18:09 -04002670 sc->defer_initialization = 1;
2671 }
Frank Praznikdecd9462015-11-11 09:49:38 -05002672
2673 sony_set_leds(sc);
2674 }
2675
2676 return 0;
2677}
2678
2679#endif
2680
Jiri Slabybd28ce02008-06-25 23:47:04 +02002681static const struct hid_device_id sony_devices[] = {
2682 { HID_USB_DEVICE(USB_VENDOR_ID_SONY, USB_DEVICE_ID_SONY_PS3_CONTROLLER),
2683 .driver_data = SIXAXIS_CONTROLLER_USB },
2684 { HID_USB_DEVICE(USB_VENDOR_ID_SONY, USB_DEVICE_ID_SONY_NAVIGATION_CONTROLLER),
Simon Wood4545ee02015-06-17 00:08:52 -06002685 .driver_data = NAVIGATION_CONTROLLER_USB },
Simon Wood6eabaaa2015-06-17 00:08:51 -06002686 { HID_BLUETOOTH_DEVICE(USB_VENDOR_ID_SONY, USB_DEVICE_ID_SONY_NAVIGATION_CONTROLLER),
Simon Wood4545ee02015-06-17 00:08:52 -06002687 .driver_data = NAVIGATION_CONTROLLER_BT },
Frank Praznikc5e0c1c2015-05-05 20:47:30 -04002688 { HID_USB_DEVICE(USB_VENDOR_ID_SONY, USB_DEVICE_ID_SONY_MOTION_CONTROLLER),
Simon Woodb3bca322015-06-09 21:27:04 -06002689 .driver_data = MOTION_CONTROLLER_USB },
Simon Wooda4afa852015-06-03 09:45:19 -06002690 { HID_BLUETOOTH_DEVICE(USB_VENDOR_ID_SONY, USB_DEVICE_ID_SONY_MOTION_CONTROLLER),
Simon Woodb3bca322015-06-09 21:27:04 -06002691 .driver_data = MOTION_CONTROLLER_BT },
Jiri Slabybd28ce02008-06-25 23:47:04 +02002692 { HID_BLUETOOTH_DEVICE(USB_VENDOR_ID_SONY, USB_DEVICE_ID_SONY_PS3_CONTROLLER),
2693 .driver_data = SIXAXIS_CONTROLLER_BT },
2694 { HID_USB_DEVICE(USB_VENDOR_ID_SONY, USB_DEVICE_ID_SONY_VAIO_VGX_MOUSE),
2695 .driver_data = VAIO_RDESC_CONSTANT },
2696 { HID_USB_DEVICE(USB_VENDOR_ID_SONY, USB_DEVICE_ID_SONY_VAIO_VGP_MOUSE),
2697 .driver_data = VAIO_RDESC_CONSTANT },
Antonio Ospiteef916ef2016-02-09 13:55:07 +01002698 /*
2699 * Wired Buzz Controller. Reported as Sony Hub from its USB ID and as
2700 * Logitech joystick from the device descriptor.
2701 */
Jiri Slabybd28ce02008-06-25 23:47:04 +02002702 { HID_USB_DEVICE(USB_VENDOR_ID_SONY, USB_DEVICE_ID_SONY_BUZZ_CONTROLLER),
2703 .driver_data = BUZZ_CONTROLLER },
2704 { HID_USB_DEVICE(USB_VENDOR_ID_SONY, USB_DEVICE_ID_SONY_WIRELESS_BUZZ_CONTROLLER),
2705 .driver_data = BUZZ_CONTROLLER },
2706 /* PS3 BD Remote Control */
2707 { HID_BLUETOOTH_DEVICE(USB_VENDOR_ID_SONY, USB_DEVICE_ID_SONY_PS3_BDREMOTE),
2708 .driver_data = PS3REMOTE },
2709 /* Logitech Harmony Adapter for PS3 */
2710 { HID_BLUETOOTH_DEVICE(USB_VENDOR_ID_LOGITECH, USB_DEVICE_ID_LOGITECH_HARMONY_PS3),
2711 .driver_data = PS3REMOTE },
Frank Praznik68a49e52014-11-12 14:52:28 -05002712 /* SMK-Link PS3 BD Remote Control */
2713 { HID_BLUETOOTH_DEVICE(USB_VENDOR_ID_SMK, USB_DEVICE_ID_SMK_PS3_BDREMOTE),
2714 .driver_data = PS3REMOTE },
Frank Praznik0bd88dd2014-01-11 15:12:42 -05002715 /* Sony Dualshock 4 controllers for PS4 */
2716 { HID_USB_DEVICE(USB_VENDOR_ID_SONY, USB_DEVICE_ID_SONY_PS4_CONTROLLER),
Frank Praznik8ab16762014-01-16 21:42:31 -05002717 .driver_data = DUALSHOCK4_CONTROLLER_USB },
Frank Praznik0bd88dd2014-01-11 15:12:42 -05002718 { HID_BLUETOOTH_DEVICE(USB_VENDOR_ID_SONY, USB_DEVICE_ID_SONY_PS4_CONTROLLER),
Frank Praznik8ab16762014-01-16 21:42:31 -05002719 .driver_data = DUALSHOCK4_CONTROLLER_BT },
Roderick Colenbrandercf1015d2016-10-07 12:39:40 -07002720 { HID_USB_DEVICE(USB_VENDOR_ID_SONY, USB_DEVICE_ID_SONY_PS4_CONTROLLER_2),
2721 .driver_data = DUALSHOCK4_CONTROLLER_USB },
2722 { HID_BLUETOOTH_DEVICE(USB_VENDOR_ID_SONY, USB_DEVICE_ID_SONY_PS4_CONTROLLER_2),
2723 .driver_data = DUALSHOCK4_CONTROLLER_BT },
Scott Moreau74500cc2016-01-13 07:40:42 -07002724 /* Nyko Core Controller for PS3 */
2725 { HID_USB_DEVICE(USB_VENDOR_ID_SINO_LITE, USB_DEVICE_ID_SINO_LITE_CONTROLLER),
2726 .driver_data = SIXAXIS_CONTROLLER_USB | SINO_LITE_CONTROLLER },
Jiri Slabybd28ce02008-06-25 23:47:04 +02002727 { }
2728};
2729MODULE_DEVICE_TABLE(hid, sony_devices);
2730
2731static struct hid_driver sony_driver = {
Frank Praznikce8efc32014-09-18 21:15:01 -04002732 .name = "sony",
2733 .id_table = sony_devices,
2734 .input_mapping = sony_mapping,
2735 .input_configured = sony_input_configured,
2736 .probe = sony_probe,
2737 .remove = sony_remove,
2738 .report_fixup = sony_report_fixup,
Frank Praznikdecd9462015-11-11 09:49:38 -05002739 .raw_event = sony_raw_event,
2740
2741#ifdef CONFIG_PM
2742 .suspend = sony_suspend,
2743 .resume = sony_resume,
2744 .reset_resume = sony_resume,
2745#endif
Jiri Slabybd28ce02008-06-25 23:47:04 +02002746};
Frank Praznik80250872014-04-14 10:11:35 -04002747
2748static int __init sony_init(void)
2749{
2750 dbg_hid("Sony:%s\n", __func__);
2751
2752 return hid_register_driver(&sony_driver);
2753}
2754
2755static void __exit sony_exit(void)
2756{
2757 dbg_hid("Sony:%s\n", __func__);
2758
Frank Praznik80250872014-04-14 10:11:35 -04002759 hid_unregister_driver(&sony_driver);
Antonio Ospite6c400652015-02-16 22:58:24 +01002760 ida_destroy(&sony_device_id_allocator);
Frank Praznik80250872014-04-14 10:11:35 -04002761}
2762module_init(sony_init);
2763module_exit(sony_exit);
Jiri Slabybd28ce02008-06-25 23:47:04 +02002764
2765MODULE_LICENSE("GPL");