blob: d03203a82e8f78962697791590ef45b35c003833 [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 Colenbrander6dfd5bf2016-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)
Roderick Colenbrander8f1d4702017-03-07 15:45:04 -080051#define DUALSHOCK4_DONGLE BIT(7)
52#define MOTION_CONTROLLER_USB BIT(8)
53#define MOTION_CONTROLLER_BT BIT(9)
54#define NAVIGATION_CONTROLLER_USB BIT(10)
55#define NAVIGATION_CONTROLLER_BT BIT(11)
56#define SINO_LITE_CONTROLLER BIT(12)
57#define FUTUREMAX_DANCE_MAT BIT(13)
Jiri Kosinacc6e0bb2008-10-23 12:58:38 +020058
Frank Praznikfee4e2d2014-02-18 17:22:01 -050059#define SIXAXIS_CONTROLLER (SIXAXIS_CONTROLLER_USB | SIXAXIS_CONTROLLER_BT)
Simon Woodb3bca322015-06-09 21:27:04 -060060#define MOTION_CONTROLLER (MOTION_CONTROLLER_USB | MOTION_CONTROLLER_BT)
Simon Wood4545ee02015-06-17 00:08:52 -060061#define NAVIGATION_CONTROLLER (NAVIGATION_CONTROLLER_USB |\
62 NAVIGATION_CONTROLLER_BT)
Frank Praznik68330d82014-02-05 20:03:49 -050063#define DUALSHOCK4_CONTROLLER (DUALSHOCK4_CONTROLLER_USB |\
Roderick Colenbrander8f1d4702017-03-07 15:45:04 -080064 DUALSHOCK4_CONTROLLER_BT | \
65 DUALSHOCK4_DONGLE)
Frank Praznikfee4e2d2014-02-18 17:22:01 -050066#define SONY_LED_SUPPORT (SIXAXIS_CONTROLLER | BUZZ_CONTROLLER |\
Simon Wood4545ee02015-06-17 00:08:52 -060067 DUALSHOCK4_CONTROLLER | MOTION_CONTROLLER |\
68 NAVIGATION_CONTROLLER)
Simon Wood12e9a6d72015-06-09 21:27:05 -060069#define SONY_BATTERY_SUPPORT (SIXAXIS_CONTROLLER | DUALSHOCK4_CONTROLLER |\
Simon Wood4545ee02015-06-17 00:08:52 -060070 MOTION_CONTROLLER_BT | NAVIGATION_CONTROLLER)
Frank Praznikc5e0c1c2015-05-05 20:47:30 -040071#define SONY_FF_SUPPORT (SIXAXIS_CONTROLLER | DUALSHOCK4_CONTROLLER |\
72 MOTION_CONTROLLER)
Frank Praznik0f398232016-09-22 20:18:08 -040073#define SONY_BT_DEVICE (SIXAXIS_CONTROLLER_BT | DUALSHOCK4_CONTROLLER_BT |\
74 MOTION_CONTROLLER_BT | NAVIGATION_CONTROLLER_BT)
Frank Praznik60781cf2014-01-11 15:13:15 -050075
76#define MAX_LEDS 4
Sven Eckelmann0a286ef2013-11-19 20:26:32 +010077
Mauro Carvalho Chehabe57a67d2012-12-14 20:57:34 -020078
Frank Praznikc5e0c1c2015-05-05 20:47:30 -040079/* PS/3 Motion controller */
Pavel Machek1adf9042016-02-09 13:55:08 +010080static u8 motion_rdesc[] = {
Frank Praznikc5e0c1c2015-05-05 20:47:30 -040081 0x05, 0x01, /* Usage Page (Desktop), */
82 0x09, 0x04, /* Usage (Joystick), */
83 0xA1, 0x01, /* Collection (Application), */
84 0xA1, 0x02, /* Collection (Logical), */
85 0x85, 0x01, /* Report ID (1), */
Frank Praznikc5e0c1c2015-05-05 20:47:30 -040086 0x75, 0x01, /* Report Size (1), */
Simon Wood8b2513c2015-06-09 21:27:07 -060087 0x95, 0x15, /* Report Count (21), */
Frank Praznikc5e0c1c2015-05-05 20:47:30 -040088 0x15, 0x00, /* Logical Minimum (0), */
89 0x25, 0x01, /* Logical Maximum (1), */
90 0x35, 0x00, /* Physical Minimum (0), */
91 0x45, 0x01, /* Physical Maximum (1), */
92 0x05, 0x09, /* Usage Page (Button), */
93 0x19, 0x01, /* Usage Minimum (01h), */
Simon Wood8b2513c2015-06-09 21:27:07 -060094 0x29, 0x15, /* Usage Maximum (15h), */
95 0x81, 0x02, /* Input (Variable), * Buttons */
96 0x95, 0x0B, /* Report Count (11), */
Frank Praznikc5e0c1c2015-05-05 20:47:30 -040097 0x06, 0x00, 0xFF, /* Usage Page (FF00h), */
Simon Wood8b2513c2015-06-09 21:27:07 -060098 0x81, 0x03, /* Input (Constant, Variable), * Padding */
Frank Praznikc5e0c1c2015-05-05 20:47:30 -040099 0x15, 0x00, /* Logical Minimum (0), */
100 0x26, 0xFF, 0x00, /* Logical Maximum (255), */
101 0x05, 0x01, /* Usage Page (Desktop), */
Frank Praznikc5e0c1c2015-05-05 20:47:30 -0400102 0xA1, 0x00, /* Collection (Physical), */
103 0x75, 0x08, /* Report Size (8), */
Simon Wood8b2513c2015-06-09 21:27:07 -0600104 0x95, 0x01, /* Report Count (1), */
Frank Praznikc5e0c1c2015-05-05 20:47:30 -0400105 0x35, 0x00, /* Physical Minimum (0), */
106 0x46, 0xFF, 0x00, /* Physical Maximum (255), */
107 0x09, 0x30, /* Usage (X), */
Simon Wood8b2513c2015-06-09 21:27:07 -0600108 0x81, 0x02, /* Input (Variable), * Trigger */
Frank Praznikc5e0c1c2015-05-05 20:47:30 -0400109 0xC0, /* End Collection, */
Simon Wood8b2513c2015-06-09 21:27:07 -0600110 0x06, 0x00, 0xFF, /* Usage Page (FF00h), */
111 0x75, 0x08, /* Report Size (8), */
112 0x95, 0x07, /* Report Count (7), * skip 7 bytes */
113 0x81, 0x02, /* Input (Variable), */
Frank Praznikc5e0c1c2015-05-05 20:47:30 -0400114 0x05, 0x01, /* Usage Page (Desktop), */
Frank Praznikc5e0c1c2015-05-05 20:47:30 -0400115 0x75, 0x10, /* Report Size (16), */
Simon Wood8b2513c2015-06-09 21:27:07 -0600116 0x46, 0xFF, 0xFF, /* Physical Maximum (65535), */
117 0x27, 0xFF, 0xFF, 0x00, 0x00, /* Logical Maximum (65535), */
118 0x95, 0x03, /* Report Count (3), * 3x Accels */
119 0x09, 0x33, /* Usage (rX), */
120 0x09, 0x34, /* Usage (rY), */
121 0x09, 0x35, /* Usage (rZ), */
Frank Praznikc5e0c1c2015-05-05 20:47:30 -0400122 0x81, 0x02, /* Input (Variable), */
Simon Wood8b2513c2015-06-09 21:27:07 -0600123 0x06, 0x00, 0xFF, /* Usage Page (FF00h), */
124 0x95, 0x03, /* Report Count (3), * Skip Accels 2nd frame */
125 0x81, 0x02, /* Input (Variable), */
126 0x05, 0x01, /* Usage Page (Desktop), */
127 0x09, 0x01, /* Usage (Pointer), */
128 0x95, 0x03, /* Report Count (3), * 3x Gyros */
129 0x81, 0x02, /* Input (Variable), */
130 0x06, 0x00, 0xFF, /* Usage Page (FF00h), */
131 0x95, 0x03, /* Report Count (3), * Skip Gyros 2nd frame */
132 0x81, 0x02, /* Input (Variable), */
133 0x75, 0x0C, /* Report Size (12), */
134 0x46, 0xFF, 0x0F, /* Physical Maximum (4095), */
135 0x26, 0xFF, 0x0F, /* Logical Maximum (4095), */
136 0x95, 0x04, /* Report Count (4), * Skip Temp and Magnetometers */
137 0x81, 0x02, /* Input (Variable), */
138 0x75, 0x08, /* Report Size (8), */
139 0x46, 0xFF, 0x00, /* Physical Maximum (255), */
140 0x26, 0xFF, 0x00, /* Logical Maximum (255), */
141 0x95, 0x06, /* Report Count (6), * Skip Timestamp and Extension Bytes */
142 0x81, 0x02, /* Input (Variable), */
143 0x75, 0x08, /* Report Size (8), */
144 0x95, 0x30, /* Report Count (48), */
145 0x09, 0x01, /* Usage (Pointer), */
146 0x91, 0x02, /* Output (Variable), */
147 0x75, 0x08, /* Report Size (8), */
148 0x95, 0x30, /* Report Count (48), */
149 0x09, 0x01, /* Usage (Pointer), */
150 0xB1, 0x02, /* Feature (Variable), */
Frank Praznikc5e0c1c2015-05-05 20:47:30 -0400151 0xC0, /* End Collection, */
152 0xA1, 0x02, /* Collection (Logical), */
153 0x85, 0x02, /* Report ID (2), */
154 0x75, 0x08, /* Report Size (8), */
155 0x95, 0x30, /* Report Count (48), */
156 0x09, 0x01, /* Usage (Pointer), */
157 0xB1, 0x02, /* Feature (Variable), */
158 0xC0, /* End Collection, */
159 0xA1, 0x02, /* Collection (Logical), */
160 0x85, 0xEE, /* Report ID (238), */
161 0x75, 0x08, /* Report Size (8), */
162 0x95, 0x30, /* Report Count (48), */
163 0x09, 0x01, /* Usage (Pointer), */
164 0xB1, 0x02, /* Feature (Variable), */
165 0xC0, /* End Collection, */
166 0xA1, 0x02, /* Collection (Logical), */
167 0x85, 0xEF, /* Report ID (239), */
168 0x75, 0x08, /* Report Size (8), */
169 0x95, 0x30, /* Report Count (48), */
170 0x09, 0x01, /* Usage (Pointer), */
171 0xB1, 0x02, /* Feature (Variable), */
172 0xC0, /* End Collection, */
173 0xC0 /* End Collection */
174};
175
Pavel Machek1adf9042016-02-09 13:55:08 +0100176static u8 ps3remote_rdesc[] = {
Jiri Kosina078328d2013-06-13 12:03:49 +0200177 0x05, 0x01, /* GUsagePage Generic Desktop */
178 0x09, 0x05, /* LUsage 0x05 [Game Pad] */
179 0xA1, 0x01, /* MCollection Application (mouse, keyboard) */
180
181 /* Use collection 1 for joypad buttons */
182 0xA1, 0x02, /* MCollection Logical (interrelated data) */
183
Antonio Ospiteef916ef2016-02-09 13:55:07 +0100184 /*
185 * Ignore the 1st byte, maybe it is used for a controller
186 * number but it's not needed for correct operation
187 */
Jiri Kosina078328d2013-06-13 12:03:49 +0200188 0x75, 0x08, /* GReportSize 0x08 [8] */
189 0x95, 0x01, /* GReportCount 0x01 [1] */
190 0x81, 0x01, /* MInput 0x01 (Const[0] Arr[1] Abs[2]) */
191
Antonio Ospiteef916ef2016-02-09 13:55:07 +0100192 /*
193 * Bytes from 2nd to 4th are a bitmap for joypad buttons, for these
194 * buttons multiple keypresses are allowed
195 */
Jiri Kosina078328d2013-06-13 12:03:49 +0200196 0x05, 0x09, /* GUsagePage Button */
197 0x19, 0x01, /* LUsageMinimum 0x01 [Button 1 (primary/trigger)] */
198 0x29, 0x18, /* LUsageMaximum 0x18 [Button 24] */
199 0x14, /* GLogicalMinimum [0] */
200 0x25, 0x01, /* GLogicalMaximum 0x01 [1] */
201 0x75, 0x01, /* GReportSize 0x01 [1] */
202 0x95, 0x18, /* GReportCount 0x18 [24] */
203 0x81, 0x02, /* MInput 0x02 (Data[0] Var[1] Abs[2]) */
204
205 0xC0, /* MEndCollection */
206
207 /* Use collection 2 for remote control buttons */
208 0xA1, 0x02, /* MCollection Logical (interrelated data) */
209
210 /* 5th byte is used for remote control buttons */
211 0x05, 0x09, /* GUsagePage Button */
212 0x18, /* LUsageMinimum [No button pressed] */
213 0x29, 0xFE, /* LUsageMaximum 0xFE [Button 254] */
214 0x14, /* GLogicalMinimum [0] */
215 0x26, 0xFE, 0x00, /* GLogicalMaximum 0x00FE [254] */
216 0x75, 0x08, /* GReportSize 0x08 [8] */
217 0x95, 0x01, /* GReportCount 0x01 [1] */
218 0x80, /* MInput */
219
Antonio Ospiteef916ef2016-02-09 13:55:07 +0100220 /*
221 * Ignore bytes from 6th to 11th, 6th to 10th are always constant at
222 * 0xff and 11th is for press indication
223 */
Jiri Kosina078328d2013-06-13 12:03:49 +0200224 0x75, 0x08, /* GReportSize 0x08 [8] */
225 0x95, 0x06, /* GReportCount 0x06 [6] */
226 0x81, 0x01, /* MInput 0x01 (Const[0] Arr[1] Abs[2]) */
227
228 /* 12th byte is for battery strength */
229 0x05, 0x06, /* GUsagePage Generic Device Controls */
230 0x09, 0x20, /* LUsage 0x20 [Battery Strength] */
231 0x14, /* GLogicalMinimum [0] */
232 0x25, 0x05, /* GLogicalMaximum 0x05 [5] */
233 0x75, 0x08, /* GReportSize 0x08 [8] */
234 0x95, 0x01, /* GReportCount 0x01 [1] */
235 0x81, 0x02, /* MInput 0x02 (Data[0] Var[1] Abs[2]) */
236
237 0xC0, /* MEndCollection */
238
239 0xC0 /* MEndCollection [Game Pad] */
240};
241
242static const unsigned int ps3remote_keymap_joypad_buttons[] = {
243 [0x01] = KEY_SELECT,
244 [0x02] = BTN_THUMBL, /* L3 */
245 [0x03] = BTN_THUMBR, /* R3 */
246 [0x04] = BTN_START,
247 [0x05] = KEY_UP,
248 [0x06] = KEY_RIGHT,
249 [0x07] = KEY_DOWN,
250 [0x08] = KEY_LEFT,
251 [0x09] = BTN_TL2, /* L2 */
252 [0x0a] = BTN_TR2, /* R2 */
253 [0x0b] = BTN_TL, /* L1 */
254 [0x0c] = BTN_TR, /* R1 */
255 [0x0d] = KEY_OPTION, /* options/triangle */
256 [0x0e] = KEY_BACK, /* back/circle */
257 [0x0f] = BTN_0, /* cross */
258 [0x10] = KEY_SCREEN, /* view/square */
259 [0x11] = KEY_HOMEPAGE, /* PS button */
260 [0x14] = KEY_ENTER,
261};
262static const unsigned int ps3remote_keymap_remote_buttons[] = {
263 [0x00] = KEY_1,
264 [0x01] = KEY_2,
265 [0x02] = KEY_3,
266 [0x03] = KEY_4,
267 [0x04] = KEY_5,
268 [0x05] = KEY_6,
269 [0x06] = KEY_7,
270 [0x07] = KEY_8,
271 [0x08] = KEY_9,
272 [0x09] = KEY_0,
273 [0x0e] = KEY_ESC, /* return */
274 [0x0f] = KEY_CLEAR,
275 [0x16] = KEY_EJECTCD,
276 [0x1a] = KEY_MENU, /* top menu */
277 [0x28] = KEY_TIME,
278 [0x30] = KEY_PREVIOUS,
279 [0x31] = KEY_NEXT,
280 [0x32] = KEY_PLAY,
281 [0x33] = KEY_REWIND, /* scan back */
282 [0x34] = KEY_FORWARD, /* scan forward */
283 [0x38] = KEY_STOP,
284 [0x39] = KEY_PAUSE,
285 [0x40] = KEY_CONTEXT_MENU, /* pop up/menu */
286 [0x60] = KEY_FRAMEBACK, /* slow/step back */
287 [0x61] = KEY_FRAMEFORWARD, /* slow/step forward */
288 [0x63] = KEY_SUBTITLE,
289 [0x64] = KEY_AUDIO,
290 [0x65] = KEY_ANGLE,
291 [0x70] = KEY_INFO, /* display */
292 [0x80] = KEY_BLUE,
293 [0x81] = KEY_RED,
294 [0x82] = KEY_GREEN,
295 [0x83] = KEY_YELLOW,
296};
297
Colin Leitnerf04d5142013-05-27 23:41:05 +0200298static const unsigned int buzz_keymap[] = {
Frank Praznikad142b92014-02-20 11:36:00 -0500299 /*
300 * The controller has 4 remote buzzers, each with one LED and 5
Colin Leitnerf04d5142013-05-27 23:41:05 +0200301 * buttons.
Antonio Ospite09593e32016-02-09 13:55:06 +0100302 *
Colin Leitnerf04d5142013-05-27 23:41:05 +0200303 * We use the mapping chosen by the controller, which is:
304 *
305 * Key Offset
306 * -------------------
307 * Buzz 1
308 * Blue 5
309 * Orange 4
310 * Green 3
311 * Yellow 2
312 *
313 * So, for example, the orange button on the third buzzer is mapped to
314 * BTN_TRIGGER_HAPPY14
315 */
Antonio Ospite09593e32016-02-09 13:55:06 +0100316 [1] = BTN_TRIGGER_HAPPY1,
317 [2] = BTN_TRIGGER_HAPPY2,
318 [3] = BTN_TRIGGER_HAPPY3,
319 [4] = BTN_TRIGGER_HAPPY4,
320 [5] = BTN_TRIGGER_HAPPY5,
321 [6] = BTN_TRIGGER_HAPPY6,
322 [7] = BTN_TRIGGER_HAPPY7,
323 [8] = BTN_TRIGGER_HAPPY8,
324 [9] = BTN_TRIGGER_HAPPY9,
Colin Leitnerf04d5142013-05-27 23:41:05 +0200325 [10] = BTN_TRIGGER_HAPPY10,
326 [11] = BTN_TRIGGER_HAPPY11,
327 [12] = BTN_TRIGGER_HAPPY12,
328 [13] = BTN_TRIGGER_HAPPY13,
329 [14] = BTN_TRIGGER_HAPPY14,
330 [15] = BTN_TRIGGER_HAPPY15,
331 [16] = BTN_TRIGGER_HAPPY16,
332 [17] = BTN_TRIGGER_HAPPY17,
333 [18] = BTN_TRIGGER_HAPPY18,
334 [19] = BTN_TRIGGER_HAPPY19,
335 [20] = BTN_TRIGGER_HAPPY20,
336};
337
Roderick Colenbrander41deb922017-03-24 15:17:46 -0700338/* The Navigation controller is a partial DS3 and uses the same HID report
339 * and hence the same keymap indices, however not not all axes/buttons
340 * are physically present. We use the same axis and button mapping as
341 * the DS3, which uses the Linux gamepad spec.
342 */
343static const unsigned int navigation_absmap[] = {
344 [0x30] = ABS_X,
345 [0x31] = ABS_Y,
346 [0x33] = ABS_Z, /* L2 */
347};
348
349/* Buttons not physically available on the device, but still available
350 * in the reports are explicitly set to 0 for documentation purposes.
351 */
352static const unsigned int navigation_keymap[] = {
353 [0x01] = 0, /* Select */
354 [0x02] = BTN_THUMBL, /* L3 */
355 [0x03] = 0, /* R3 */
356 [0x04] = 0, /* Start */
357 [0x05] = BTN_DPAD_UP, /* Up */
358 [0x06] = BTN_DPAD_RIGHT, /* Right */
359 [0x07] = BTN_DPAD_DOWN, /* Down */
360 [0x08] = BTN_DPAD_LEFT, /* Left */
361 [0x09] = BTN_TL2, /* L2 */
362 [0x0a] = 0, /* R2 */
363 [0x0b] = BTN_TL, /* L1 */
364 [0x0c] = 0, /* R1 */
365 [0x0d] = BTN_NORTH, /* Triangle */
366 [0x0e] = BTN_EAST, /* Circle */
367 [0x0f] = BTN_SOUTH, /* Cross */
368 [0x10] = BTN_WEST, /* Square */
369 [0x11] = BTN_MODE, /* PS */
370};
371
Roderick Colenbranderbe985302017-03-07 15:45:08 -0800372static const unsigned int sixaxis_absmap[] = {
373 [0x30] = ABS_X,
374 [0x31] = ABS_Y,
375 [0x32] = ABS_RX, /* right stick X */
376 [0x35] = ABS_RY, /* right stick Y */
377};
378
379static const unsigned int sixaxis_keymap[] = {
380 [0x01] = BTN_SELECT, /* Select */
381 [0x02] = BTN_THUMBL, /* L3 */
382 [0x03] = BTN_THUMBR, /* R3 */
383 [0x04] = BTN_START, /* Start */
384 [0x05] = BTN_DPAD_UP, /* Up */
385 [0x06] = BTN_DPAD_RIGHT, /* Right */
386 [0x07] = BTN_DPAD_DOWN, /* Down */
387 [0x08] = BTN_DPAD_LEFT, /* Left */
388 [0x09] = BTN_TL2, /* L2 */
389 [0x0a] = BTN_TR2, /* R2 */
390 [0x0b] = BTN_TL, /* L1 */
391 [0x0c] = BTN_TR, /* R1 */
392 [0x0d] = BTN_NORTH, /* Triangle */
393 [0x0e] = BTN_EAST, /* Circle */
394 [0x0f] = BTN_SOUTH, /* Cross */
395 [0x10] = BTN_WEST, /* Square */
396 [0x11] = BTN_MODE, /* PS */
397};
398
Roderick Colenbrander687aa022016-11-23 14:07:08 -0800399static const unsigned int ds4_absmap[] = {
400 [0x30] = ABS_X,
401 [0x31] = ABS_Y,
402 [0x32] = ABS_RX, /* right stick X */
403 [0x33] = ABS_Z, /* L2 */
404 [0x34] = ABS_RZ, /* R2 */
405 [0x35] = ABS_RY, /* right stick Y */
406};
407
408static const unsigned int ds4_keymap[] = {
409 [0x1] = BTN_WEST, /* Square */
410 [0x2] = BTN_SOUTH, /* Cross */
411 [0x3] = BTN_EAST, /* Circle */
412 [0x4] = BTN_NORTH, /* Triangle */
413 [0x5] = BTN_TL, /* L1 */
414 [0x6] = BTN_TR, /* R1 */
415 [0x7] = BTN_TL2, /* L2 */
416 [0x8] = BTN_TR2, /* R2 */
417 [0x9] = BTN_SELECT, /* Share */
418 [0xa] = BTN_START, /* Options */
419 [0xb] = BTN_THUMBL, /* L3 */
420 [0xc] = BTN_THUMBR, /* R3 */
421 [0xd] = BTN_MODE, /* PS */
422};
423
Roderick Colenbrander8621b7b2017-03-07 15:45:03 -0800424static const struct {int x; int y; } ds4_hat_mapping[] = {
425 {0, -1}, {1, -1}, {1, 0}, {1, 1}, {0, 1}, {-1, 1}, {-1, 0}, {-1, -1},
426 {0, 0}
427};
Roderick Colenbrander687aa022016-11-23 14:07:08 -0800428
Frank Praznikd902f472014-01-27 10:17:36 -0500429static enum power_supply_property sony_battery_props[] = {
430 POWER_SUPPLY_PROP_PRESENT,
431 POWER_SUPPLY_PROP_CAPACITY,
432 POWER_SUPPLY_PROP_SCOPE,
433 POWER_SUPPLY_PROP_STATUS,
434};
435
Frank Praznik55d3b662014-04-14 10:11:32 -0400436struct sixaxis_led {
Pavel Machek1adf9042016-02-09 13:55:08 +0100437 u8 time_enabled; /* the total time the led is active (0xff means forever) */
438 u8 duty_length; /* how long a cycle is in deciseconds (0 means "really fast") */
439 u8 enabled;
440 u8 duty_off; /* % of duty_length the led is off (0xff means 100%) */
441 u8 duty_on; /* % of duty_length the led is on (0xff mean 100%) */
Frank Praznik55d3b662014-04-14 10:11:32 -0400442} __packed;
443
444struct sixaxis_rumble {
Pavel Machek1adf9042016-02-09 13:55:08 +0100445 u8 padding;
446 u8 right_duration; /* Right motor duration (0xff means forever) */
447 u8 right_motor_on; /* Right (small) motor on/off, only supports values of 0 or 1 (off/on) */
448 u8 left_duration; /* Left motor duration (0xff means forever) */
449 u8 left_motor_force; /* left (large) motor, supports force values from 0 to 255 */
Frank Praznik55d3b662014-04-14 10:11:32 -0400450} __packed;
451
452struct sixaxis_output_report {
Pavel Machek1adf9042016-02-09 13:55:08 +0100453 u8 report_id;
Frank Praznik55d3b662014-04-14 10:11:32 -0400454 struct sixaxis_rumble rumble;
Pavel Machek1adf9042016-02-09 13:55:08 +0100455 u8 padding[4];
456 u8 leds_bitmap; /* bitmap of enabled LEDs: LED_1 = 0x02, LED_2 = 0x04, ... */
Frank Praznik55d3b662014-04-14 10:11:32 -0400457 struct sixaxis_led led[4]; /* LEDx at (4 - x) */
458 struct sixaxis_led _reserved; /* LED5, not actually soldered */
459} __packed;
460
461union sixaxis_output_report_01 {
462 struct sixaxis_output_report data;
Pavel Machek1adf9042016-02-09 13:55:08 +0100463 u8 buf[36];
Frank Praznik55d3b662014-04-14 10:11:32 -0400464};
465
Frank Praznikc5e0c1c2015-05-05 20:47:30 -0400466struct motion_output_report_02 {
467 u8 type, zero;
468 u8 r, g, b;
469 u8 zero2;
470 u8 rumble;
471};
472
Roderick Colenbrander5443a632016-10-07 12:39:35 -0700473#define DS4_FEATURE_REPORT_0x02_SIZE 37
Roderick Colenbrander9b70faa2017-03-07 15:45:01 -0800474#define DS4_FEATURE_REPORT_0x05_SIZE 41
Roderick Colenbrander5443a632016-10-07 12:39:35 -0700475#define DS4_FEATURE_REPORT_0x81_SIZE 7
Roderick Colenbrander6dfd5bf2016-10-07 12:39:36 -0700476#define DS4_INPUT_REPORT_0x11_SIZE 78
Roderick Colenbrander5443a632016-10-07 12:39:35 -0700477#define DS4_OUTPUT_REPORT_0x05_SIZE 32
478#define DS4_OUTPUT_REPORT_0x11_SIZE 78
Antonio Ospite29b691a2015-02-16 18:12:21 +0100479#define SIXAXIS_REPORT_0xF2_SIZE 17
Antonio Ospitea85d67b2015-02-16 18:12:22 +0100480#define SIXAXIS_REPORT_0xF5_SIZE 8
Simon Wood41d2d422015-06-09 21:27:06 -0600481#define MOTION_REPORT_0x02_SIZE 49
Frank Praznik9b2b5c92014-11-12 14:10:09 -0500482
Roderick Colenbrander6e62c0b2016-10-07 12:39:38 -0700483/* Offsets relative to USB input report (0x1). Bluetooth (0x11) requires an
484 * additional +2.
485 */
Roderick Colenbrander8621b7b2017-03-07 15:45:03 -0800486#define DS4_INPUT_REPORT_AXIS_OFFSET 1
Roderick Colenbrander42027ee2016-11-23 14:07:07 -0800487#define DS4_INPUT_REPORT_BUTTON_OFFSET 5
Roderick Colenbranderf79133c2017-03-07 15:45:02 -0800488#define DS4_INPUT_REPORT_TIMESTAMP_OFFSET 10
Roderick Colenbrander6f561e92017-03-07 15:45:00 -0800489#define DS4_INPUT_REPORT_GYRO_X_OFFSET 13
Roderick Colenbrander6e62c0b2016-10-07 12:39:38 -0700490#define DS4_INPUT_REPORT_BATTERY_OFFSET 30
491#define DS4_INPUT_REPORT_TOUCHPAD_OFFSET 33
492
Roderick Colenbrander89e9ccd2017-03-07 15:45:10 -0800493#define SENSOR_SUFFIX " Motion Sensors"
Roderick Colenbrander42027ee2016-11-23 14:07:07 -0800494#define DS4_TOUCHPAD_SUFFIX " Touchpad"
495
Roderick Colenbrander786bd402017-03-24 15:17:49 -0700496/* Default to 4ms poll interval, which is same as USB (not adjustable). */
497#define DS4_BT_DEFAULT_POLL_INTERVAL_MS 4
498#define DS4_BT_MAX_POLL_INTERVAL_MS 62
Roderick Colenbrander9b70faa2017-03-07 15:45:01 -0800499#define DS4_GYRO_RES_PER_DEG_S 1024
500#define DS4_ACC_RES_PER_G 8192
501
Roderick Colenbrander89e9ccd2017-03-07 15:45:10 -0800502#define SIXAXIS_INPUT_REPORT_ACC_X_OFFSET 41
503#define SIXAXIS_ACC_RES_PER_G 113
504
Jiri Kosina8b402c92015-02-23 11:15:44 +0100505static DEFINE_SPINLOCK(sony_dev_list_lock);
Frank Praznikd2d782f2014-02-20 11:36:03 -0500506static LIST_HEAD(sony_device_list);
Frank Praznik80250872014-04-14 10:11:35 -0400507static DEFINE_IDA(sony_device_id_allocator);
Frank Praznikd2d782f2014-02-20 11:36:03 -0500508
Roderick Colenbrander9b70faa2017-03-07 15:45:01 -0800509/* Used for calibration of DS4 accelerometer and gyro. */
510struct ds4_calibration_data {
511 int abs_code;
512 short bias;
513 /* Calibration requires scaling against a sensitivity value, which is a
514 * float. Store sensitivity as a fraction to limit floating point
515 * calculations until final calibration.
516 */
517 int sens_numer;
518 int sens_denom;
519};
520
Roderick Colenbrander72dbb852017-03-07 15:45:06 -0800521enum ds4_dongle_state {
522 DONGLE_DISCONNECTED,
523 DONGLE_CALIBRATING,
524 DONGLE_CONNECTED,
525 DONGLE_DISABLED
526};
527
Roderick Colenbrander3a60a132017-03-07 15:45:05 -0800528enum sony_worker {
Roderick Colenbrander72dbb852017-03-07 15:45:06 -0800529 SONY_WORKER_STATE,
530 SONY_WORKER_HOTPLUG
Roderick Colenbrander3a60a132017-03-07 15:45:05 -0800531};
532
Jiri Kosinacc6e0bb2008-10-23 12:58:38 +0200533struct sony_sc {
Frank Praznikd902f472014-01-27 10:17:36 -0500534 spinlock_t lock;
Frank Praznikd2d782f2014-02-20 11:36:03 -0500535 struct list_head list_node;
Sven Eckelmann0a286ef2013-11-19 20:26:32 +0100536 struct hid_device *hdev;
Roderick Colenbrander42027ee2016-11-23 14:07:07 -0800537 struct input_dev *touchpad;
Roderick Colenbrander6f561e92017-03-07 15:45:00 -0800538 struct input_dev *sensor_dev;
Frank Praznik60781cf2014-01-11 15:13:15 -0500539 struct led_classdev *leds[MAX_LEDS];
Jiri Kosinacc6e0bb2008-10-23 12:58:38 +0200540 unsigned long quirks;
Roderick Colenbrander72dbb852017-03-07 15:45:06 -0800541 struct work_struct hotplug_worker;
Sven Eckelmann0a286ef2013-11-19 20:26:32 +0100542 struct work_struct state_worker;
Antonio Ospite09593e32016-02-09 13:55:06 +0100543 void (*send_output_report)(struct sony_sc *);
Krzysztof Kozlowski297d7162015-03-12 08:44:11 +0100544 struct power_supply *battery;
545 struct power_supply_desc battery_desc;
Frank Praznik80250872014-04-14 10:11:35 -0400546 int device_id;
Pavel Machek1adf9042016-02-09 13:55:08 +0100547 u8 *output_report_dmabuf;
Colin Leitnerf04d5142013-05-27 23:41:05 +0200548
Sven Eckelmann9f323b62013-11-17 20:38:21 +0100549#ifdef CONFIG_SONY_FF
Pavel Machek1adf9042016-02-09 13:55:08 +0100550 u8 left;
551 u8 right;
Sven Eckelmann9f323b62013-11-17 20:38:21 +0100552#endif
553
Pavel Machek1adf9042016-02-09 13:55:08 +0100554 u8 mac_address[6];
Roderick Colenbrander72dbb852017-03-07 15:45:06 -0800555 u8 hotplug_worker_initialized;
Roderick Colenbrander3a60a132017-03-07 15:45:05 -0800556 u8 state_worker_initialized;
Frank Praznik2a242932016-09-22 20:18:09 -0400557 u8 defer_initialization;
Pavel Machek1adf9042016-02-09 13:55:08 +0100558 u8 cable_state;
559 u8 battery_charging;
560 u8 battery_capacity;
561 u8 led_state[MAX_LEDS];
Pavel Machek1adf9042016-02-09 13:55:08 +0100562 u8 led_delay_on[MAX_LEDS];
563 u8 led_delay_off[MAX_LEDS];
564 u8 led_count;
Roderick Colenbranderf79133c2017-03-07 15:45:02 -0800565
566 bool timestamp_initialized;
567 u16 prev_timestamp;
568 unsigned int timestamp_us;
569
Roderick Colenbrander786bd402017-03-24 15:17:49 -0700570 u8 ds4_bt_poll_interval;
Roderick Colenbrander72dbb852017-03-07 15:45:06 -0800571 enum ds4_dongle_state ds4_dongle_state;
Roderick Colenbrander9b70faa2017-03-07 15:45:01 -0800572 /* DS4 calibration data */
573 struct ds4_calibration_data ds4_calib_data[6];
Jiri Kosinacc6e0bb2008-10-23 12:58:38 +0200574};
575
Roderick Colenbrander40e1f202016-12-08 19:09:52 -0800576static void sony_set_leds(struct sony_sc *sc);
577
Roderick Colenbrander3a60a132017-03-07 15:45:05 -0800578static inline void sony_schedule_work(struct sony_sc *sc,
579 enum sony_worker which)
Frank Praznik2a242932016-09-22 20:18:09 -0400580{
Roderick Colenbrander3a60a132017-03-07 15:45:05 -0800581 switch (which) {
582 case SONY_WORKER_STATE:
583 if (!sc->defer_initialization)
584 schedule_work(&sc->state_worker);
Roderick Colenbrander72dbb852017-03-07 15:45:06 -0800585 break;
586 case SONY_WORKER_HOTPLUG:
587 if (sc->hotplug_worker_initialized)
588 schedule_work(&sc->hotplug_worker);
589 break;
Roderick Colenbrander3a60a132017-03-07 15:45:05 -0800590 }
Frank Praznik2a242932016-09-22 20:18:09 -0400591}
592
Roderick Colenbrander786bd402017-03-24 15:17:49 -0700593static ssize_t ds4_show_poll_interval(struct device *dev,
594 struct device_attribute
595 *attr, char *buf)
596{
597 struct hid_device *hdev = to_hid_device(dev);
598 struct sony_sc *sc = hid_get_drvdata(hdev);
599
600 return snprintf(buf, PAGE_SIZE, "%i\n", sc->ds4_bt_poll_interval);
601}
602
603static ssize_t ds4_store_poll_interval(struct device *dev,
604 struct device_attribute *attr,
605 const char *buf, size_t count)
606{
607 struct hid_device *hdev = to_hid_device(dev);
608 struct sony_sc *sc = hid_get_drvdata(hdev);
609 unsigned long flags;
610 u8 interval;
611
612 if (kstrtou8(buf, 0, &interval))
613 return -EINVAL;
614
615 if (interval > DS4_BT_MAX_POLL_INTERVAL_MS)
616 return -EINVAL;
617
618 spin_lock_irqsave(&sc->lock, flags);
619 sc->ds4_bt_poll_interval = interval;
620 spin_unlock_irqrestore(&sc->lock, flags);
621
622 sony_schedule_work(sc, SONY_WORKER_STATE);
623
624 return count;
625}
626
627static DEVICE_ATTR(bt_poll_interval, 0644, ds4_show_poll_interval,
628 ds4_store_poll_interval);
629
630
Frank Praznikc5e0c1c2015-05-05 20:47:30 -0400631static u8 *motion_fixup(struct hid_device *hdev, u8 *rdesc,
632 unsigned int *rsize)
633{
634 *rsize = sizeof(motion_rdesc);
635 return motion_rdesc;
636}
637
Pavel Machek1adf9042016-02-09 13:55:08 +0100638static u8 *ps3remote_fixup(struct hid_device *hdev, u8 *rdesc,
Jiri Kosina078328d2013-06-13 12:03:49 +0200639 unsigned int *rsize)
640{
641 *rsize = sizeof(ps3remote_rdesc);
642 return ps3remote_rdesc;
643}
644
645static int ps3remote_mapping(struct hid_device *hdev, struct hid_input *hi,
646 struct hid_field *field, struct hid_usage *usage,
647 unsigned long **bit, int *max)
648{
649 unsigned int key = usage->hid & HID_USAGE;
650
651 if ((usage->hid & HID_USAGE_PAGE) != HID_UP_BUTTON)
652 return -1;
653
654 switch (usage->collection_index) {
655 case 1:
656 if (key >= ARRAY_SIZE(ps3remote_keymap_joypad_buttons))
657 return -1;
658
659 key = ps3remote_keymap_joypad_buttons[key];
660 if (!key)
661 return -1;
662 break;
663 case 2:
664 if (key >= ARRAY_SIZE(ps3remote_keymap_remote_buttons))
665 return -1;
666
667 key = ps3remote_keymap_remote_buttons[key];
668 if (!key)
669 return -1;
670 break;
671 default:
672 return -1;
673 }
674
675 hid_map_usage_clear(hi, usage, bit, max, EV_KEY, key);
676 return 1;
677}
678
Roderick Colenbrander41deb922017-03-24 15:17:46 -0700679static int navigation_mapping(struct hid_device *hdev, struct hid_input *hi,
680 struct hid_field *field, struct hid_usage *usage,
681 unsigned long **bit, int *max)
682{
683 if ((usage->hid & HID_USAGE_PAGE) == HID_UP_BUTTON) {
684 unsigned int key = usage->hid & HID_USAGE;
685
686 if (key >= ARRAY_SIZE(sixaxis_keymap))
687 return -1;
688
689 key = navigation_keymap[key];
690 if (!key)
691 return -1;
692
693 hid_map_usage_clear(hi, usage, bit, max, EV_KEY, key);
694 return 1;
695 } else if (usage->hid == HID_GD_POINTER) {
696 /* See comment in sixaxis_mapping, basically the L2 (and R2)
697 * triggers are reported through GD Pointer.
698 * In addition we ignore any analog button 'axes' and only
699 * support digital buttons.
700 */
701 switch (usage->usage_index) {
702 case 8: /* L2 */
703 usage->hid = HID_GD_Z;
704 break;
705 default:
706 return -1;
707 }
708
709 hid_map_usage_clear(hi, usage, bit, max, EV_ABS, usage->hid & 0xf);
710 return 1;
711 } else if ((usage->hid & HID_USAGE_PAGE) == HID_UP_GENDESK) {
712 unsigned int abs = usage->hid & HID_USAGE;
713
714 if (abs >= ARRAY_SIZE(navigation_absmap))
715 return -1;
716
717 abs = navigation_absmap[abs];
718
719 hid_map_usage_clear(hi, usage, bit, max, EV_ABS, abs);
720 return 1;
721 }
722
723 return -1;
724}
725
726
Roderick Colenbranderbe985302017-03-07 15:45:08 -0800727static int sixaxis_mapping(struct hid_device *hdev, struct hid_input *hi,
728 struct hid_field *field, struct hid_usage *usage,
729 unsigned long **bit, int *max)
730{
731 if ((usage->hid & HID_USAGE_PAGE) == HID_UP_BUTTON) {
732 unsigned int key = usage->hid & HID_USAGE;
733
734 if (key >= ARRAY_SIZE(sixaxis_keymap))
735 return -1;
736
737 key = sixaxis_keymap[key];
738 hid_map_usage_clear(hi, usage, bit, max, EV_KEY, key);
739 return 1;
740 } else if (usage->hid == HID_GD_POINTER) {
741 /* The DS3 provides analog values for most buttons and even
742 * for HAT axes through GD Pointer. L2 and R2 are reported
743 * among these as well instead of as GD Z / RZ. Remap L2
744 * and R2 and ignore other analog 'button axes' as there is
745 * no good way for reporting them.
746 */
747 switch (usage->usage_index) {
748 case 8: /* L2 */
749 usage->hid = HID_GD_Z;
750 break;
751 case 9: /* R2 */
752 usage->hid = HID_GD_RZ;
753 break;
754 default:
755 return -1;
756 }
757
758 hid_map_usage_clear(hi, usage, bit, max, EV_ABS, usage->hid & 0xf);
759 return 1;
760 } else if ((usage->hid & HID_USAGE_PAGE) == HID_UP_GENDESK) {
761 unsigned int abs = usage->hid & HID_USAGE;
762
763 if (abs >= ARRAY_SIZE(sixaxis_absmap))
764 return -1;
765
766 abs = sixaxis_absmap[abs];
767
768 hid_map_usage_clear(hi, usage, bit, max, EV_ABS, abs);
769 return 1;
770 }
771
772 return -1;
773}
774
Roderick Colenbrander687aa022016-11-23 14:07:08 -0800775static int ds4_mapping(struct hid_device *hdev, struct hid_input *hi,
776 struct hid_field *field, struct hid_usage *usage,
777 unsigned long **bit, int *max)
778{
779 if ((usage->hid & HID_USAGE_PAGE) == HID_UP_BUTTON) {
780 unsigned int key = usage->hid & HID_USAGE;
781
782 if (key >= ARRAY_SIZE(ds4_keymap))
783 return -1;
784
785 key = ds4_keymap[key];
786 hid_map_usage_clear(hi, usage, bit, max, EV_KEY, key);
787 return 1;
788 } else if ((usage->hid & HID_USAGE_PAGE) == HID_UP_GENDESK) {
789 unsigned int abs = usage->hid & HID_USAGE;
790
791 /* Let the HID parser deal with the HAT. */
792 if (usage->hid == HID_GD_HATSWITCH)
793 return 0;
794
795 if (abs >= ARRAY_SIZE(ds4_absmap))
796 return -1;
797
798 abs = ds4_absmap[abs];
799 hid_map_usage_clear(hi, usage, bit, max, EV_ABS, abs);
800 return 1;
801 }
802
803 return 0;
804}
805
Pavel Machek1adf9042016-02-09 13:55:08 +0100806static u8 *sony_report_fixup(struct hid_device *hdev, u8 *rdesc,
Nikolai Kondrashov73e40082010-08-06 23:03:06 +0400807 unsigned int *rsize)
Jiri Kosinacc6e0bb2008-10-23 12:58:38 +0200808{
809 struct sony_sc *sc = hid_get_drvdata(hdev);
810
Mikko Perttunen4ba1eee2016-07-21 19:54:48 +0300811 if (sc->quirks & (SINO_LITE_CONTROLLER | FUTUREMAX_DANCE_MAT))
Scott Moreau74500cc2016-01-13 07:40:42 -0700812 return rdesc;
813
Fernando Luis Vázquez Cao99d24902013-01-22 15:20:38 +0900814 /*
815 * Some Sony RF receivers wrongly declare the mouse pointer as a
816 * a constant non-data variable.
817 */
818 if ((sc->quirks & VAIO_RDESC_CONSTANT) && *rsize >= 56 &&
819 /* usage page: generic desktop controls */
820 /* rdesc[0] == 0x05 && rdesc[1] == 0x01 && */
821 /* usage: mouse */
822 rdesc[2] == 0x09 && rdesc[3] == 0x02 &&
823 /* input (usage page for x,y axes): constant, variable, relative */
824 rdesc[54] == 0x81 && rdesc[55] == 0x07) {
Fernando Luis Vázquez Caoa4649182013-01-15 19:40:48 +0900825 hid_info(hdev, "Fixing up Sony RF Receiver report descriptor\n");
Fernando Luis Vázquez Cao99d24902013-01-22 15:20:38 +0900826 /* input: data, variable, relative */
Jiri Kosinacc6e0bb2008-10-23 12:58:38 +0200827 rdesc[55] = 0x06;
828 }
Simon Wood61ab44b2011-06-10 12:00:26 +0200829
Frank Praznikc5e0c1c2015-05-05 20:47:30 -0400830 if (sc->quirks & MOTION_CONTROLLER)
831 return motion_fixup(hdev, rdesc, rsize);
832
Jiri Kosina078328d2013-06-13 12:03:49 +0200833 if (sc->quirks & PS3REMOTE)
834 return ps3remote_fixup(hdev, rdesc, rsize);
835
Nikolai Kondrashov73e40082010-08-06 23:03:06 +0400836 return rdesc;
Jiri Kosinacc6e0bb2008-10-23 12:58:38 +0200837}
838
Pavel Machek1adf9042016-02-09 13:55:08 +0100839static void sixaxis_parse_report(struct sony_sc *sc, u8 *rd, int size)
Frank Praznikd902f472014-01-27 10:17:36 -0500840{
Pavel Machek1adf9042016-02-09 13:55:08 +0100841 static const u8 sixaxis_battery_capacity[] = { 0, 1, 25, 50, 75, 100 };
Frank Praznikd902f472014-01-27 10:17:36 -0500842 unsigned long flags;
Simon Wood12e9a6d72015-06-09 21:27:05 -0600843 int offset;
Pavel Machek1adf9042016-02-09 13:55:08 +0100844 u8 cable_state, battery_capacity, battery_charging;
Frank Praznikd902f472014-01-27 10:17:36 -0500845
Frank Praznikad142b92014-02-20 11:36:00 -0500846 /*
847 * The sixaxis is charging if the battery value is 0xee
Frank Praznikd902f472014-01-27 10:17:36 -0500848 * and it is fully charged if the value is 0xef.
849 * It does not report the actual level while charging so it
850 * is set to 100% while charging is in progress.
851 */
Simon Wood12e9a6d72015-06-09 21:27:05 -0600852 offset = (sc->quirks & MOTION_CONTROLLER) ? 12 : 30;
853
854 if (rd[offset] >= 0xee) {
Frank Praznikd902f472014-01-27 10:17:36 -0500855 battery_capacity = 100;
Simon Wood12e9a6d72015-06-09 21:27:05 -0600856 battery_charging = !(rd[offset] & 0x01);
Frank Praznik9fddd742014-08-29 13:11:52 -0400857 cable_state = 1;
Frank Praznikd902f472014-01-27 10:17:36 -0500858 } else {
Pavel Machek1adf9042016-02-09 13:55:08 +0100859 u8 index = rd[offset] <= 5 ? rd[offset] : 5;
Frank Praznikac3c9a92014-02-20 11:36:02 -0500860 battery_capacity = sixaxis_battery_capacity[index];
Frank Praznikd902f472014-01-27 10:17:36 -0500861 battery_charging = 0;
Frank Praznik9fddd742014-08-29 13:11:52 -0400862 cable_state = 0;
Frank Praznikd902f472014-01-27 10:17:36 -0500863 }
Frank Praznikd902f472014-01-27 10:17:36 -0500864
865 spin_lock_irqsave(&sc->lock, flags);
866 sc->cable_state = cable_state;
867 sc->battery_capacity = battery_capacity;
868 sc->battery_charging = battery_charging;
869 spin_unlock_irqrestore(&sc->lock, flags);
Roderick Colenbrander89e9ccd2017-03-07 15:45:10 -0800870
871 if (sc->quirks & SIXAXIS_CONTROLLER) {
872 int val;
873
874 offset = SIXAXIS_INPUT_REPORT_ACC_X_OFFSET;
875 val = ((rd[offset+1] << 8) | rd[offset]) - 511;
876 input_report_abs(sc->sensor_dev, ABS_X, val);
877
878 /* Y and Z are swapped and inversed */
879 val = 511 - ((rd[offset+5] << 8) | rd[offset+4]);
880 input_report_abs(sc->sensor_dev, ABS_Y, val);
881
882 val = 511 - ((rd[offset+3] << 8) | rd[offset+2]);
883 input_report_abs(sc->sensor_dev, ABS_Z, val);
884
885 input_sync(sc->sensor_dev);
886 }
Frank Praznikd902f472014-01-27 10:17:36 -0500887}
888
Pavel Machek1adf9042016-02-09 13:55:08 +0100889static void dualshock4_parse_report(struct sony_sc *sc, u8 *rd, int size)
Frank Praznikd902f472014-01-27 10:17:36 -0500890{
Roderick Colenbrander8621b7b2017-03-07 15:45:03 -0800891 struct hid_input *hidinput = list_entry(sc->hdev->inputs.next,
892 struct hid_input, list);
893 struct input_dev *input_dev = hidinput->input;
Frank Praznikd902f472014-01-27 10:17:36 -0500894 unsigned long flags;
Roderick Colenbrander6e62c0b2016-10-07 12:39:38 -0700895 int n, m, offset, num_touch_data, max_touch_data;
Pavel Machek1adf9042016-02-09 13:55:08 +0100896 u8 cable_state, battery_capacity, battery_charging;
Roderick Colenbranderf79133c2017-03-07 15:45:02 -0800897 u16 timestamp;
Frank Praznikd902f472014-01-27 10:17:36 -0500898
Roderick Colenbrander6e62c0b2016-10-07 12:39:38 -0700899 /* When using Bluetooth the header is 2 bytes longer, so skip these. */
Roderick Colenbrander8f1d4702017-03-07 15:45:04 -0800900 int data_offset = (sc->quirks & DUALSHOCK4_CONTROLLER_BT) ? 2 : 0;
Frank Praznik6c5f8602014-02-05 20:03:47 -0500901
Roderick Colenbrander42027ee2016-11-23 14:07:07 -0800902 /* Second bit of third button byte is for the touchpad button. */
903 offset = data_offset + DS4_INPUT_REPORT_BUTTON_OFFSET;
904 input_report_key(sc->touchpad, BTN_LEFT, rd[offset+2] & 0x2);
905
Roderick Colenbrander8621b7b2017-03-07 15:45:03 -0800906 /*
907 * The default behavior of the Dualshock 4 is to send reports using
908 * report type 1 when running over Bluetooth. However, when feature
909 * report 2 is requested during the controller initialization it starts
910 * sending input reports in report 17. Since report 17 is undefined
911 * in the default HID descriptor, the HID layer won't generate events.
912 * While it is possible (and this was done before) to fixup the HID
913 * descriptor to add this mapping, it was better to do this manually.
914 * The reason is there were various pieces software both open and closed
915 * source, relying on the descriptors to be the same across various
916 * operating systems. If the descriptors wouldn't match some
917 * applications e.g. games on Wine would not be able to function due
918 * to different descriptors, which such applications are not parsing.
919 */
920 if (rd[0] == 17) {
921 int value;
922
923 offset = data_offset + DS4_INPUT_REPORT_AXIS_OFFSET;
924 input_report_abs(input_dev, ABS_X, rd[offset]);
925 input_report_abs(input_dev, ABS_Y, rd[offset+1]);
926 input_report_abs(input_dev, ABS_RX, rd[offset+2]);
927 input_report_abs(input_dev, ABS_RY, rd[offset+3]);
928
929 value = rd[offset+4] & 0xf;
930 if (value > 7)
931 value = 8; /* Center 0, 0 */
932 input_report_abs(input_dev, ABS_HAT0X, ds4_hat_mapping[value].x);
933 input_report_abs(input_dev, ABS_HAT0Y, ds4_hat_mapping[value].y);
934
935 input_report_key(input_dev, BTN_WEST, rd[offset+4] & 0x10);
936 input_report_key(input_dev, BTN_SOUTH, rd[offset+4] & 0x20);
937 input_report_key(input_dev, BTN_EAST, rd[offset+4] & 0x40);
938 input_report_key(input_dev, BTN_NORTH, rd[offset+4] & 0x80);
939
940 input_report_key(input_dev, BTN_TL, rd[offset+5] & 0x1);
941 input_report_key(input_dev, BTN_TR, rd[offset+5] & 0x2);
942 input_report_key(input_dev, BTN_TL2, rd[offset+5] & 0x4);
943 input_report_key(input_dev, BTN_TR2, rd[offset+5] & 0x8);
944 input_report_key(input_dev, BTN_SELECT, rd[offset+5] & 0x10);
945 input_report_key(input_dev, BTN_START, rd[offset+5] & 0x20);
946 input_report_key(input_dev, BTN_THUMBL, rd[offset+5] & 0x40);
947 input_report_key(input_dev, BTN_THUMBR, rd[offset+5] & 0x80);
948
949 input_report_key(input_dev, BTN_MODE, rd[offset+6] & 0x1);
950
951 input_report_abs(input_dev, ABS_Z, rd[offset+7]);
952 input_report_abs(input_dev, ABS_RZ, rd[offset+8]);
953
954 input_sync(input_dev);
955 }
956
Roderick Colenbranderf79133c2017-03-07 15:45:02 -0800957 /* Convert timestamp (in 5.33us unit) to timestamp_us */
958 offset = data_offset + DS4_INPUT_REPORT_TIMESTAMP_OFFSET;
959 timestamp = get_unaligned_le16(&rd[offset]);
960 if (!sc->timestamp_initialized) {
961 sc->timestamp_us = ((unsigned int)timestamp * 16) / 3;
962 sc->timestamp_initialized = true;
963 } else {
964 u16 delta;
965
966 if (sc->prev_timestamp > timestamp)
967 delta = (U16_MAX - sc->prev_timestamp + timestamp + 1);
968 else
969 delta = timestamp - sc->prev_timestamp;
970 sc->timestamp_us += (delta * 16) / 3;
971 }
972 sc->prev_timestamp = timestamp;
973 input_event(sc->sensor_dev, EV_MSC, MSC_TIMESTAMP, sc->timestamp_us);
974
Roderick Colenbrander6f561e92017-03-07 15:45:00 -0800975 offset = data_offset + DS4_INPUT_REPORT_GYRO_X_OFFSET;
Roderick Colenbrander9b70faa2017-03-07 15:45:01 -0800976 for (n = 0; n < 6; n++) {
977 /* Store data in int for more precision during mult_frac. */
978 int raw_data = (short)((rd[offset+1] << 8) | rd[offset]);
979 struct ds4_calibration_data *calib = &sc->ds4_calib_data[n];
Roderick Colenbrander6f561e92017-03-07 15:45:00 -0800980
Roderick Colenbrander9b70faa2017-03-07 15:45:01 -0800981 /* High precision is needed during calibration, but the
982 * calibrated values are within 32-bit.
983 * Note: we swap numerator 'x' and 'numer' in mult_frac for
984 * precision reasons so we don't need 64-bit.
985 */
986 int calib_data = mult_frac(calib->sens_numer,
987 raw_data - calib->bias,
988 calib->sens_denom);
989
990 input_report_abs(sc->sensor_dev, calib->abs_code, calib_data);
991 offset += 2;
Roderick Colenbrander6f561e92017-03-07 15:45:00 -0800992 }
993 input_sync(sc->sensor_dev);
994
Frank Praznikad142b92014-02-20 11:36:00 -0500995 /*
Roderick Colenbrander6e62c0b2016-10-07 12:39:38 -0700996 * The lower 4 bits of byte 30 (or 32 for BT) contain the battery level
Frank Praznikd902f472014-01-27 10:17:36 -0500997 * and the 5th bit contains the USB cable state.
998 */
Roderick Colenbrander6e62c0b2016-10-07 12:39:38 -0700999 offset = data_offset + DS4_INPUT_REPORT_BATTERY_OFFSET;
Frank Praznik6c5f8602014-02-05 20:03:47 -05001000 cable_state = (rd[offset] >> 4) & 0x01;
1001 battery_capacity = rd[offset] & 0x0F;
Frank Praznikd902f472014-01-27 10:17:36 -05001002
Frank Praznikad142b92014-02-20 11:36:00 -05001003 /*
1004 * When a USB power source is connected the battery level ranges from
Frank Praznik6c5f8602014-02-05 20:03:47 -05001005 * 0 to 10, and when running on battery power it ranges from 0 to 9.
1006 * A battery level above 10 when plugged in means charge completed.
Frank Praznikd902f472014-01-27 10:17:36 -05001007 */
Frank Praznik6c5f8602014-02-05 20:03:47 -05001008 if (!cable_state || battery_capacity > 10)
Frank Praznikd902f472014-01-27 10:17:36 -05001009 battery_charging = 0;
1010 else
1011 battery_charging = 1;
1012
Frank Praznik6c5f8602014-02-05 20:03:47 -05001013 if (!cable_state)
1014 battery_capacity++;
Frank Praznikd902f472014-01-27 10:17:36 -05001015 if (battery_capacity > 10)
Frank Praznik6c5f8602014-02-05 20:03:47 -05001016 battery_capacity = 10;
1017
Frank Praznikd902f472014-01-27 10:17:36 -05001018 battery_capacity *= 10;
1019
1020 spin_lock_irqsave(&sc->lock, flags);
1021 sc->cable_state = cable_state;
1022 sc->battery_capacity = battery_capacity;
1023 sc->battery_charging = battery_charging;
1024 spin_unlock_irqrestore(&sc->lock, flags);
Frank Praznike5606232014-01-27 10:17:37 -05001025
Frank Praznikad142b92014-02-20 11:36:00 -05001026 /*
Roderick Colenbrander6e62c0b2016-10-07 12:39:38 -07001027 * The Dualshock 4 multi-touch trackpad data starts at offset 33 on USB
1028 * and 35 on Bluetooth.
1029 * The first byte indicates the number of touch data in the report.
1030 * Trackpad data starts 2 bytes later (e.g. 35 for USB).
Frank Praznike5606232014-01-27 10:17:37 -05001031 */
Roderick Colenbrander6e62c0b2016-10-07 12:39:38 -07001032 offset = data_offset + DS4_INPUT_REPORT_TOUCHPAD_OFFSET;
Roderick Colenbrander8f1d4702017-03-07 15:45:04 -08001033 max_touch_data = (sc->quirks & DUALSHOCK4_CONTROLLER_BT) ? 4 : 3;
Roderick Colenbrander6e62c0b2016-10-07 12:39:38 -07001034 if (rd[offset] > 0 && rd[offset] <= max_touch_data)
1035 num_touch_data = rd[offset];
1036 else
1037 num_touch_data = 1;
1038 offset += 1;
Frank Praznike5606232014-01-27 10:17:37 -05001039
Roderick Colenbrander6e62c0b2016-10-07 12:39:38 -07001040 for (m = 0; m < num_touch_data; m++) {
1041 /* Skip past timestamp */
1042 offset += 1;
Frank Praznike5606232014-01-27 10:17:37 -05001043
Roderick Colenbrander6e62c0b2016-10-07 12:39:38 -07001044 /*
1045 * The first 7 bits of the first byte is a counter and bit 8 is
1046 * a touch indicator that is 0 when pressed and 1 when not
1047 * pressed.
1048 * The next 3 bytes are two 12 bit touch coordinates, X and Y.
1049 * The data for the second touch is in the same format and
1050 * immediately follows the data for the first.
1051 */
1052 for (n = 0; n < 2; n++) {
1053 u16 x, y;
1054 bool active;
Frank Praznike5606232014-01-27 10:17:37 -05001055
Roderick Colenbrander6e62c0b2016-10-07 12:39:38 -07001056 x = rd[offset+1] | ((rd[offset+2] & 0xF) << 8);
1057 y = ((rd[offset+2] & 0xF0) >> 4) | (rd[offset+3] << 4);
1058
1059 active = !(rd[offset] >> 7);
Roderick Colenbrander42027ee2016-11-23 14:07:07 -08001060 input_mt_slot(sc->touchpad, n);
1061 input_mt_report_slot_state(sc->touchpad, MT_TOOL_FINGER, active);
Roderick Colenbrander6e62c0b2016-10-07 12:39:38 -07001062
1063 if (active) {
Roderick Colenbrander42027ee2016-11-23 14:07:07 -08001064 input_report_abs(sc->touchpad, ABS_MT_POSITION_X, x);
1065 input_report_abs(sc->touchpad, ABS_MT_POSITION_Y, y);
Roderick Colenbrander6e62c0b2016-10-07 12:39:38 -07001066 }
1067
1068 offset += 4;
1069 }
Roderick Colenbrander42027ee2016-11-23 14:07:07 -08001070 input_mt_sync_frame(sc->touchpad);
1071 input_sync(sc->touchpad);
Frank Praznike5606232014-01-27 10:17:37 -05001072 }
Frank Praznikd902f472014-01-27 10:17:36 -05001073}
1074
Simon Woodc9e4d872011-06-10 12:00:27 +02001075static int sony_raw_event(struct hid_device *hdev, struct hid_report *report,
Pavel Machek1adf9042016-02-09 13:55:08 +01001076 u8 *rd, int size)
Simon Woodc9e4d872011-06-10 12:00:27 +02001077{
1078 struct sony_sc *sc = hid_get_drvdata(hdev);
1079
Frank Praznikad142b92014-02-20 11:36:00 -05001080 /*
1081 * Sixaxis HID report has acclerometers/gyro with MSByte first, this
Simon Woodc9e4d872011-06-10 12:00:27 +02001082 * has to be BYTE_SWAPPED before passing up to joystick interface
1083 */
Frank Praznikfee4e2d2014-02-18 17:22:01 -05001084 if ((sc->quirks & SIXAXIS_CONTROLLER) && rd[0] == 0x01 && size == 49) {
Frank Praznik8f5f0bc2015-07-23 19:01:16 -04001085 /*
1086 * When connected via Bluetooth the Sixaxis occasionally sends
1087 * a report with the second byte 0xff and the rest zeroed.
1088 *
1089 * This report does not reflect the actual state of the
1090 * controller must be ignored to avoid generating false input
1091 * events.
1092 */
1093 if (rd[1] == 0xff)
1094 return -EINVAL;
1095
Simon Woodc9e4d872011-06-10 12:00:27 +02001096 swap(rd[41], rd[42]);
1097 swap(rd[43], rd[44]);
1098 swap(rd[45], rd[46]);
1099 swap(rd[47], rd[48]);
Frank Praznikd902f472014-01-27 10:17:36 -05001100
1101 sixaxis_parse_report(sc, rd, size);
Simon Wood12e9a6d72015-06-09 21:27:05 -06001102 } else if ((sc->quirks & MOTION_CONTROLLER_BT) && rd[0] == 0x01 && size == 49) {
1103 sixaxis_parse_report(sc, rd, size);
Simon Wood4545ee02015-06-17 00:08:52 -06001104 } else if ((sc->quirks & NAVIGATION_CONTROLLER) && rd[0] == 0x01 &&
1105 size == 49) {
1106 sixaxis_parse_report(sc, rd, size);
Roderick Colenbrander8f1d4702017-03-07 15:45:04 -08001107 } else if ((sc->quirks & DUALSHOCK4_CONTROLLER_USB) && rd[0] == 0x01 &&
1108 size == 64) {
1109 dualshock4_parse_report(sc, rd, size);
1110 } else if (((sc->quirks & DUALSHOCK4_CONTROLLER_BT) && rd[0] == 0x11 &&
1111 size == 78)) {
1112 /* CRC check */
1113 u8 bthdr = 0xA1;
1114 u32 crc;
1115 u32 report_crc;
Roderick Colenbrander6dfd5bf2016-10-07 12:39:36 -07001116
Roderick Colenbrander8f1d4702017-03-07 15:45:04 -08001117 crc = crc32_le(0xFFFFFFFF, &bthdr, 1);
1118 crc = ~crc32_le(crc, rd, DS4_INPUT_REPORT_0x11_SIZE-4);
1119 report_crc = get_unaligned_le32(&rd[DS4_INPUT_REPORT_0x11_SIZE-4]);
1120 if (crc != report_crc) {
1121 hid_dbg(sc->hdev, "DualShock 4 input report's CRC check failed, received crc 0x%0x != 0x%0x\n",
1122 report_crc, crc);
1123 return -EILSEQ;
Roderick Colenbrander6dfd5bf2016-10-07 12:39:36 -07001124 }
Roderick Colenbrander40e1f202016-12-08 19:09:52 -08001125
Roderick Colenbrander8f1d4702017-03-07 15:45:04 -08001126 dualshock4_parse_report(sc, rd, size);
1127 } else if ((sc->quirks & DUALSHOCK4_DONGLE) && rd[0] == 0x01 &&
1128 size == 64) {
Roderick Colenbrander72dbb852017-03-07 15:45:06 -08001129 unsigned long flags;
1130 enum ds4_dongle_state dongle_state;
1131
Roderick Colenbrander40e1f202016-12-08 19:09:52 -08001132 /*
1133 * In the case of a DS4 USB dongle, bit[2] of byte 31 indicates
1134 * if a DS4 is actually connected (indicated by '0').
1135 * For non-dongle, this bit is always 0 (connected).
1136 */
Roderick Colenbrander8f1d4702017-03-07 15:45:04 -08001137 bool connected = (rd[31] & 0x04) ? false : true;
Roderick Colenbrander40e1f202016-12-08 19:09:52 -08001138
Roderick Colenbrander72dbb852017-03-07 15:45:06 -08001139 spin_lock_irqsave(&sc->lock, flags);
1140 dongle_state = sc->ds4_dongle_state;
1141 spin_unlock_irqrestore(&sc->lock, flags);
1142
1143 /*
1144 * The dongle always sends input reports even when no
1145 * DS4 is attached. When a DS4 is connected, we need to
1146 * obtain calibration data before we can use it.
1147 * The code below tracks dongle state and kicks of
1148 * calibration when needed and only allows us to process
1149 * input if a DS4 is actually connected.
1150 */
1151 if (dongle_state == DONGLE_DISCONNECTED && connected) {
Roderick Colenbrander8f1d4702017-03-07 15:45:04 -08001152 hid_info(sc->hdev, "DualShock 4 USB dongle: controller connected\n");
1153 sony_set_leds(sc);
Roderick Colenbrander72dbb852017-03-07 15:45:06 -08001154
1155 spin_lock_irqsave(&sc->lock, flags);
1156 sc->ds4_dongle_state = DONGLE_CALIBRATING;
1157 spin_unlock_irqrestore(&sc->lock, flags);
1158
1159 sony_schedule_work(sc, SONY_WORKER_HOTPLUG);
1160
1161 /* Don't process the report since we don't have
1162 * calibration data, but let hidraw have it anyway.
1163 */
1164 return 0;
1165 } else if ((dongle_state == DONGLE_CONNECTED ||
1166 dongle_state == DONGLE_DISABLED) && !connected) {
Roderick Colenbrander8f1d4702017-03-07 15:45:04 -08001167 hid_info(sc->hdev, "DualShock 4 USB dongle: controller disconnected\n");
Roderick Colenbrander72dbb852017-03-07 15:45:06 -08001168
1169 spin_lock_irqsave(&sc->lock, flags);
1170 sc->ds4_dongle_state = DONGLE_DISCONNECTED;
1171 spin_unlock_irqrestore(&sc->lock, flags);
1172
Roderick Colenbrander8f1d4702017-03-07 15:45:04 -08001173 /* Return 0, so hidraw can get the report. */
1174 return 0;
Roderick Colenbrander72dbb852017-03-07 15:45:06 -08001175 } else if (dongle_state == DONGLE_CALIBRATING ||
1176 dongle_state == DONGLE_DISABLED ||
1177 dongle_state == DONGLE_DISCONNECTED) {
Roderick Colenbrander8f1d4702017-03-07 15:45:04 -08001178 /* Return 0, so hidraw can get the report. */
1179 return 0;
Roderick Colenbrander40e1f202016-12-08 19:09:52 -08001180 }
1181
Frank Praznikd902f472014-01-27 10:17:36 -05001182 dualshock4_parse_report(sc, rd, size);
Simon Woodc9e4d872011-06-10 12:00:27 +02001183 }
1184
Frank Praznik2a242932016-09-22 20:18:09 -04001185 if (sc->defer_initialization) {
1186 sc->defer_initialization = 0;
Roderick Colenbrander3a60a132017-03-07 15:45:05 -08001187 sony_schedule_work(sc, SONY_WORKER_STATE);
Frank Praznik2a242932016-09-22 20:18:09 -04001188 }
1189
Simon Woodc9e4d872011-06-10 12:00:27 +02001190 return 0;
1191}
1192
Colin Leitnerf04d5142013-05-27 23:41:05 +02001193static int sony_mapping(struct hid_device *hdev, struct hid_input *hi,
1194 struct hid_field *field, struct hid_usage *usage,
1195 unsigned long **bit, int *max)
1196{
1197 struct sony_sc *sc = hid_get_drvdata(hdev);
1198
1199 if (sc->quirks & BUZZ_CONTROLLER) {
1200 unsigned int key = usage->hid & HID_USAGE;
1201
1202 if ((usage->hid & HID_USAGE_PAGE) != HID_UP_BUTTON)
1203 return -1;
1204
1205 switch (usage->collection_index) {
1206 case 1:
1207 if (key >= ARRAY_SIZE(buzz_keymap))
1208 return -1;
1209
1210 key = buzz_keymap[key];
1211 if (!key)
1212 return -1;
1213 break;
1214 default:
1215 return -1;
1216 }
1217
1218 hid_map_usage_clear(hi, usage, bit, max, EV_KEY, key);
1219 return 1;
1220 }
1221
Jiri Kosina078328d2013-06-13 12:03:49 +02001222 if (sc->quirks & PS3REMOTE)
1223 return ps3remote_mapping(hdev, hi, field, usage, bit, max);
1224
Roderick Colenbrander41deb922017-03-24 15:17:46 -07001225 if (sc->quirks & NAVIGATION_CONTROLLER)
1226 return navigation_mapping(hdev, hi, field, usage, bit, max);
1227
Roderick Colenbranderbe985302017-03-07 15:45:08 -08001228 if (sc->quirks & SIXAXIS_CONTROLLER)
1229 return sixaxis_mapping(hdev, hi, field, usage, bit, max);
Roderick Colenbrander687aa022016-11-23 14:07:08 -08001230
1231 if (sc->quirks & DUALSHOCK4_CONTROLLER)
1232 return ds4_mapping(hdev, hi, field, usage, bit, max);
1233
Roderick Colenbranderbe985302017-03-07 15:45:08 -08001234
Benjamin Tissoires6f498012013-07-24 16:53:07 +02001235 /* Let hid-core decide for the others */
1236 return 0;
Colin Leitnerf04d5142013-05-27 23:41:05 +02001237}
1238
Roderick Colenbrander42027ee2016-11-23 14:07:07 -08001239static int sony_register_touchpad(struct sony_sc *sc, int touch_count,
Frank Praznikce8efc32014-09-18 21:15:01 -04001240 int w, int h)
1241{
Roderick Colenbrander42027ee2016-11-23 14:07:07 -08001242 size_t name_sz;
1243 char *name;
Frank Praznikce8efc32014-09-18 21:15:01 -04001244 int ret;
1245
Roderick Colenbrander42027ee2016-11-23 14:07:07 -08001246 sc->touchpad = input_allocate_device();
1247 if (!sc->touchpad)
1248 return -ENOMEM;
Frank Praznikce8efc32014-09-18 21:15:01 -04001249
Roderick Colenbrander42027ee2016-11-23 14:07:07 -08001250 input_set_drvdata(sc->touchpad, sc);
1251 sc->touchpad->dev.parent = &sc->hdev->dev;
1252 sc->touchpad->phys = sc->hdev->phys;
1253 sc->touchpad->uniq = sc->hdev->uniq;
1254 sc->touchpad->id.bustype = sc->hdev->bus;
1255 sc->touchpad->id.vendor = sc->hdev->vendor;
1256 sc->touchpad->id.product = sc->hdev->product;
1257 sc->touchpad->id.version = sc->hdev->version;
1258
1259 /* Append a suffix to the controller name as there are various
1260 * DS4 compatible non-Sony devices with different names.
1261 */
1262 name_sz = strlen(sc->hdev->name) + sizeof(DS4_TOUCHPAD_SUFFIX);
1263 name = kzalloc(name_sz, GFP_KERNEL);
1264 if (!name) {
1265 ret = -ENOMEM;
1266 goto err;
1267 }
1268 snprintf(name, name_sz, "%s" DS4_TOUCHPAD_SUFFIX, sc->hdev->name);
1269 sc->touchpad->name = name;
1270
Roderick Colenbrander73416502017-03-07 15:45:07 -08001271 ret = input_mt_init_slots(sc->touchpad, touch_count, INPUT_MT_POINTER);
Roderick Colenbrander42027ee2016-11-23 14:07:07 -08001272 if (ret < 0)
1273 goto err;
1274
1275 /* We map the button underneath the touchpad to BTN_LEFT. */
1276 __set_bit(EV_KEY, sc->touchpad->evbit);
1277 __set_bit(BTN_LEFT, sc->touchpad->keybit);
1278 __set_bit(INPUT_PROP_BUTTONPAD, sc->touchpad->propbit);
1279
1280 input_set_abs_params(sc->touchpad, ABS_MT_POSITION_X, 0, w, 0, 0);
1281 input_set_abs_params(sc->touchpad, ABS_MT_POSITION_Y, 0, h, 0, 0);
1282
1283 ret = input_register_device(sc->touchpad);
1284 if (ret < 0)
1285 goto err;
Frank Praznikce8efc32014-09-18 21:15:01 -04001286
1287 return 0;
Roderick Colenbrander42027ee2016-11-23 14:07:07 -08001288
1289err:
1290 kfree(sc->touchpad->name);
1291 sc->touchpad->name = NULL;
1292
1293 input_free_device(sc->touchpad);
1294 sc->touchpad = NULL;
1295
1296 return ret;
Frank Praznikce8efc32014-09-18 21:15:01 -04001297}
1298
Roderick Colenbrander42027ee2016-11-23 14:07:07 -08001299static void sony_unregister_touchpad(struct sony_sc *sc)
1300{
1301 if (!sc->touchpad)
1302 return;
1303
1304 kfree(sc->touchpad->name);
1305 sc->touchpad->name = NULL;
1306
1307 input_unregister_device(sc->touchpad);
1308 sc->touchpad = NULL;
1309}
Frank Praznikce8efc32014-09-18 21:15:01 -04001310
Roderick Colenbrander6f561e92017-03-07 15:45:00 -08001311static int sony_register_sensors(struct sony_sc *sc)
1312{
1313 size_t name_sz;
1314 char *name;
1315 int ret;
Roderick Colenbrander9b70faa2017-03-07 15:45:01 -08001316 int range;
Roderick Colenbrander6f561e92017-03-07 15:45:00 -08001317
1318 sc->sensor_dev = input_allocate_device();
1319 if (!sc->sensor_dev)
1320 return -ENOMEM;
1321
1322 input_set_drvdata(sc->sensor_dev, sc);
1323 sc->sensor_dev->dev.parent = &sc->hdev->dev;
1324 sc->sensor_dev->phys = sc->hdev->phys;
1325 sc->sensor_dev->uniq = sc->hdev->uniq;
1326 sc->sensor_dev->id.bustype = sc->hdev->bus;
1327 sc->sensor_dev->id.vendor = sc->hdev->vendor;
1328 sc->sensor_dev->id.product = sc->hdev->product;
1329 sc->sensor_dev->id.version = sc->hdev->version;
1330
1331 /* Append a suffix to the controller name as there are various
1332 * DS4 compatible non-Sony devices with different names.
1333 */
Roderick Colenbrander89e9ccd2017-03-07 15:45:10 -08001334 name_sz = strlen(sc->hdev->name) + sizeof(SENSOR_SUFFIX);
Roderick Colenbrander6f561e92017-03-07 15:45:00 -08001335 name = kzalloc(name_sz, GFP_KERNEL);
1336 if (!name) {
1337 ret = -ENOMEM;
1338 goto err;
1339 }
Roderick Colenbrander89e9ccd2017-03-07 15:45:10 -08001340 snprintf(name, name_sz, "%s" SENSOR_SUFFIX, sc->hdev->name);
Roderick Colenbrander6f561e92017-03-07 15:45:00 -08001341 sc->sensor_dev->name = name;
1342
Roderick Colenbrander89e9ccd2017-03-07 15:45:10 -08001343 if (sc->quirks & SIXAXIS_CONTROLLER) {
1344 /* For the DS3 we only support the accelerometer, which works
1345 * quite well even without calibration. The device also has
1346 * a 1-axis gyro, but it is very difficult to manage from within
1347 * the driver even to get data, the sensor is inaccurate and
1348 * the behavior is very different between hardware revisions.
1349 */
1350 input_set_abs_params(sc->sensor_dev, ABS_X, -512, 511, 4, 0);
1351 input_set_abs_params(sc->sensor_dev, ABS_Y, -512, 511, 4, 0);
1352 input_set_abs_params(sc->sensor_dev, ABS_Z, -512, 511, 4, 0);
1353 input_abs_set_res(sc->sensor_dev, ABS_X, SIXAXIS_ACC_RES_PER_G);
1354 input_abs_set_res(sc->sensor_dev, ABS_Y, SIXAXIS_ACC_RES_PER_G);
1355 input_abs_set_res(sc->sensor_dev, ABS_Z, SIXAXIS_ACC_RES_PER_G);
1356 } else if (sc->quirks & DUALSHOCK4_CONTROLLER) {
1357 range = DS4_ACC_RES_PER_G*4;
1358 input_set_abs_params(sc->sensor_dev, ABS_X, -range, range, 16, 0);
1359 input_set_abs_params(sc->sensor_dev, ABS_Y, -range, range, 16, 0);
1360 input_set_abs_params(sc->sensor_dev, ABS_Z, -range, range, 16, 0);
1361 input_abs_set_res(sc->sensor_dev, ABS_X, DS4_ACC_RES_PER_G);
1362 input_abs_set_res(sc->sensor_dev, ABS_Y, DS4_ACC_RES_PER_G);
1363 input_abs_set_res(sc->sensor_dev, ABS_Z, DS4_ACC_RES_PER_G);
Roderick Colenbrander6f561e92017-03-07 15:45:00 -08001364
Roderick Colenbrander89e9ccd2017-03-07 15:45:10 -08001365 range = DS4_GYRO_RES_PER_DEG_S*2048;
1366 input_set_abs_params(sc->sensor_dev, ABS_RX, -range, range, 16, 0);
1367 input_set_abs_params(sc->sensor_dev, ABS_RY, -range, range, 16, 0);
1368 input_set_abs_params(sc->sensor_dev, ABS_RZ, -range, range, 16, 0);
1369 input_abs_set_res(sc->sensor_dev, ABS_RX, DS4_GYRO_RES_PER_DEG_S);
1370 input_abs_set_res(sc->sensor_dev, ABS_RY, DS4_GYRO_RES_PER_DEG_S);
1371 input_abs_set_res(sc->sensor_dev, ABS_RZ, DS4_GYRO_RES_PER_DEG_S);
Roderick Colenbrander6f561e92017-03-07 15:45:00 -08001372
Roderick Colenbrander89e9ccd2017-03-07 15:45:10 -08001373 __set_bit(EV_MSC, sc->sensor_dev->evbit);
1374 __set_bit(MSC_TIMESTAMP, sc->sensor_dev->mscbit);
1375 }
1376
Roderick Colenbrander6f561e92017-03-07 15:45:00 -08001377 __set_bit(INPUT_PROP_ACCELEROMETER, sc->sensor_dev->propbit);
1378
1379 ret = input_register_device(sc->sensor_dev);
1380 if (ret < 0)
1381 goto err;
1382
1383 return 0;
1384
1385err:
1386 kfree(sc->sensor_dev->name);
1387 sc->sensor_dev->name = NULL;
1388
1389 input_free_device(sc->sensor_dev);
1390 sc->sensor_dev = NULL;
1391
1392 return ret;
1393}
1394
1395static void sony_unregister_sensors(struct sony_sc *sc)
1396{
1397 if (!sc->sensor_dev)
1398 return;
1399
1400 kfree(sc->sensor_dev->name);
1401 sc->sensor_dev->name = NULL;
1402
1403 input_unregister_device(sc->sensor_dev);
1404 sc->sensor_dev = NULL;
1405}
1406
1407
Antonio Ospite5710fab2011-02-20 18:26:45 +01001408/*
Jiri Slabybd28ce02008-06-25 23:47:04 +02001409 * Sending HID_REQ_GET_REPORT changes the operation mode of the ps3 controller
1410 * to "operational". Without this, the ps3 controller will not report any
1411 * events.
1412 */
Antonio Ospite816651a2010-05-03 22:15:55 +02001413static int sixaxis_set_operational_usb(struct hid_device *hdev)
Jiri Slabybd28ce02008-06-25 23:47:04 +02001414{
Antonio Ospitea85d67b2015-02-16 18:12:22 +01001415 const int buf_size =
1416 max(SIXAXIS_REPORT_0xF2_SIZE, SIXAXIS_REPORT_0xF5_SIZE);
Pavel Machek1adf9042016-02-09 13:55:08 +01001417 u8 *buf;
Jiri Slabybd28ce02008-06-25 23:47:04 +02001418 int ret;
Jiri Slabybd28ce02008-06-25 23:47:04 +02001419
Antonio Ospite2e701a32015-02-16 18:12:24 +01001420 buf = kmalloc(buf_size, GFP_KERNEL);
Jiri Slabybd28ce02008-06-25 23:47:04 +02001421 if (!buf)
1422 return -ENOMEM;
1423
Antonio Ospitea85d67b2015-02-16 18:12:22 +01001424 ret = hid_hw_raw_request(hdev, 0xf2, buf, SIXAXIS_REPORT_0xF2_SIZE,
1425 HID_FEATURE_REPORT, HID_REQ_GET_REPORT);
Lauri Kasanena7de9b82015-02-16 15:06:59 +02001426 if (ret < 0) {
1427 hid_err(hdev, "can't set operational mode: step 1\n");
1428 goto out;
1429 }
Benjamin Tissoiresf204828a2013-09-11 22:12:25 +02001430
Lauri Kasanena7de9b82015-02-16 15:06:59 +02001431 /*
1432 * Some compatible controllers like the Speedlink Strike FX and
1433 * Gasia need another query plus an USB interrupt to get operational.
1434 */
Antonio Ospitea85d67b2015-02-16 18:12:22 +01001435 ret = hid_hw_raw_request(hdev, 0xf5, buf, SIXAXIS_REPORT_0xF5_SIZE,
1436 HID_FEATURE_REPORT, HID_REQ_GET_REPORT);
Lauri Kasanena7de9b82015-02-16 15:06:59 +02001437 if (ret < 0) {
1438 hid_err(hdev, "can't set operational mode: step 2\n");
1439 goto out;
1440 }
1441
1442 ret = hid_hw_output_report(hdev, buf, 1);
Benjamin Tissoires19f4c2b2016-01-08 17:58:49 +01001443 if (ret < 0) {
1444 hid_info(hdev, "can't set operational mode: step 3, ignoring\n");
1445 ret = 0;
1446 }
Jiri Slabybd28ce02008-06-25 23:47:04 +02001447
Lauri Kasanena7de9b82015-02-16 15:06:59 +02001448out:
Jiri Slabybd28ce02008-06-25 23:47:04 +02001449 kfree(buf);
1450
1451 return ret;
1452}
1453
Antonio Ospite816651a2010-05-03 22:15:55 +02001454static int sixaxis_set_operational_bt(struct hid_device *hdev)
Bastien Noceraf9ce7c22010-01-20 12:01:53 +00001455{
Pavel Machek1adf9042016-02-09 13:55:08 +01001456 static const u8 report[] = { 0xf4, 0x42, 0x03, 0x00, 0x00 };
1457 u8 *buf;
Frank Praznik9b2b5c92014-11-12 14:10:09 -05001458 int ret;
1459
1460 buf = kmemdup(report, sizeof(report), GFP_KERNEL);
1461 if (!buf)
1462 return -ENOMEM;
1463
1464 ret = hid_hw_raw_request(hdev, buf[0], buf, sizeof(report),
Benjamin Tissoiresb0dd72a2014-02-10 12:58:54 -05001465 HID_FEATURE_REPORT, HID_REQ_SET_REPORT);
Frank Praznik9b2b5c92014-11-12 14:10:09 -05001466
1467 kfree(buf);
1468
1469 return ret;
Bastien Noceraf9ce7c22010-01-20 12:01:53 +00001470}
1471
Frank Praznikad142b92014-02-20 11:36:00 -05001472/*
Roderick Colenbrander9b70faa2017-03-07 15:45:01 -08001473 * Request DS4 calibration data for the motion sensors.
1474 * For Bluetooth this also affects the operating mode (see below).
Frank Praznik68330d82014-02-05 20:03:49 -05001475 */
Roderick Colenbrander9b70faa2017-03-07 15:45:01 -08001476static int dualshock4_get_calibration_data(struct sony_sc *sc)
Frank Praznik68330d82014-02-05 20:03:49 -05001477{
Pavel Machek1adf9042016-02-09 13:55:08 +01001478 u8 *buf;
Frank Praznik9b2b5c92014-11-12 14:10:09 -05001479 int ret;
Roderick Colenbrander9b70faa2017-03-07 15:45:01 -08001480 short gyro_pitch_bias, gyro_pitch_plus, gyro_pitch_minus;
1481 short gyro_yaw_bias, gyro_yaw_plus, gyro_yaw_minus;
1482 short gyro_roll_bias, gyro_roll_plus, gyro_roll_minus;
1483 short gyro_speed_plus, gyro_speed_minus;
1484 short acc_x_plus, acc_x_minus;
1485 short acc_y_plus, acc_y_minus;
1486 short acc_z_plus, acc_z_minus;
1487 int speed_2x;
1488 int range_2g;
Frank Praznik68330d82014-02-05 20:03:49 -05001489
Roderick Colenbrander9b70faa2017-03-07 15:45:01 -08001490 /* For Bluetooth we use a different request, which supports CRC.
1491 * Note: in Bluetooth mode feature report 0x02 also changes the state
1492 * of the controller, so that it sends input reports of type 0x11.
1493 */
Roderick Colenbrander8f1d4702017-03-07 15:45:04 -08001494 if (sc->quirks & (DUALSHOCK4_CONTROLLER_USB | DUALSHOCK4_DONGLE)) {
Roderick Colenbrander9b70faa2017-03-07 15:45:01 -08001495 buf = kmalloc(DS4_FEATURE_REPORT_0x02_SIZE, GFP_KERNEL);
1496 if (!buf)
1497 return -ENOMEM;
Frank Praznik9b2b5c92014-11-12 14:10:09 -05001498
Roderick Colenbrander9b70faa2017-03-07 15:45:01 -08001499 ret = hid_hw_raw_request(sc->hdev, 0x02, buf,
1500 DS4_FEATURE_REPORT_0x02_SIZE,
1501 HID_FEATURE_REPORT,
1502 HID_REQ_GET_REPORT);
1503 if (ret < 0)
1504 goto err_stop;
1505 } else {
1506 u8 bthdr = 0xA3;
1507 u32 crc;
1508 u32 report_crc;
1509 int retries;
Frank Praznik9b2b5c92014-11-12 14:10:09 -05001510
Roderick Colenbrander9b70faa2017-03-07 15:45:01 -08001511 buf = kmalloc(DS4_FEATURE_REPORT_0x05_SIZE, GFP_KERNEL);
1512 if (!buf)
1513 return -ENOMEM;
1514
1515 for (retries = 0; retries < 3; retries++) {
1516 ret = hid_hw_raw_request(sc->hdev, 0x05, buf,
1517 DS4_FEATURE_REPORT_0x05_SIZE,
1518 HID_FEATURE_REPORT,
1519 HID_REQ_GET_REPORT);
1520 if (ret < 0)
1521 goto err_stop;
1522
1523 /* CRC check */
1524 crc = crc32_le(0xFFFFFFFF, &bthdr, 1);
1525 crc = ~crc32_le(crc, buf, DS4_FEATURE_REPORT_0x05_SIZE-4);
1526 report_crc = get_unaligned_le32(&buf[DS4_FEATURE_REPORT_0x05_SIZE-4]);
1527 if (crc != report_crc) {
1528 hid_warn(sc->hdev, "DualShock 4 calibration report's CRC check failed, received crc 0x%0x != 0x%0x\n",
1529 report_crc, crc);
1530 if (retries < 2) {
1531 hid_warn(sc->hdev, "Retrying DualShock 4 get calibration report request\n");
1532 continue;
1533 } else {
1534 ret = -EILSEQ;
1535 goto err_stop;
1536 }
1537 } else {
1538 break;
1539 }
1540 }
1541 }
1542
1543 gyro_pitch_bias = get_unaligned_le16(&buf[1]);
1544 gyro_yaw_bias = get_unaligned_le16(&buf[3]);
1545 gyro_roll_bias = get_unaligned_le16(&buf[5]);
1546 if (sc->quirks & DUALSHOCK4_CONTROLLER_USB) {
1547 gyro_pitch_plus = get_unaligned_le16(&buf[7]);
1548 gyro_pitch_minus = get_unaligned_le16(&buf[9]);
1549 gyro_yaw_plus = get_unaligned_le16(&buf[11]);
1550 gyro_yaw_minus = get_unaligned_le16(&buf[13]);
1551 gyro_roll_plus = get_unaligned_le16(&buf[15]);
1552 gyro_roll_minus = get_unaligned_le16(&buf[17]);
1553 } else {
Roderick Colenbrander8f1d4702017-03-07 15:45:04 -08001554 /* BT + Dongle */
Roderick Colenbrander9b70faa2017-03-07 15:45:01 -08001555 gyro_pitch_plus = get_unaligned_le16(&buf[7]);
1556 gyro_yaw_plus = get_unaligned_le16(&buf[9]);
1557 gyro_roll_plus = get_unaligned_le16(&buf[11]);
1558 gyro_pitch_minus = get_unaligned_le16(&buf[13]);
1559 gyro_yaw_minus = get_unaligned_le16(&buf[15]);
1560 gyro_roll_minus = get_unaligned_le16(&buf[17]);
1561 }
1562 gyro_speed_plus = get_unaligned_le16(&buf[19]);
1563 gyro_speed_minus = get_unaligned_le16(&buf[21]);
1564 acc_x_plus = get_unaligned_le16(&buf[23]);
1565 acc_x_minus = get_unaligned_le16(&buf[25]);
1566 acc_y_plus = get_unaligned_le16(&buf[27]);
1567 acc_y_minus = get_unaligned_le16(&buf[29]);
1568 acc_z_plus = get_unaligned_le16(&buf[31]);
1569 acc_z_minus = get_unaligned_le16(&buf[33]);
1570
1571 /* Set gyroscope calibration and normalization parameters.
1572 * Data values will be normalized to 1/DS4_GYRO_RES_PER_DEG_S degree/s.
1573 */
1574 speed_2x = (gyro_speed_plus + gyro_speed_minus);
1575 sc->ds4_calib_data[0].abs_code = ABS_RX;
1576 sc->ds4_calib_data[0].bias = gyro_pitch_bias;
1577 sc->ds4_calib_data[0].sens_numer = speed_2x*DS4_GYRO_RES_PER_DEG_S;
1578 sc->ds4_calib_data[0].sens_denom = gyro_pitch_plus - gyro_pitch_minus;
1579
1580 sc->ds4_calib_data[1].abs_code = ABS_RY;
1581 sc->ds4_calib_data[1].bias = gyro_yaw_bias;
1582 sc->ds4_calib_data[1].sens_numer = speed_2x*DS4_GYRO_RES_PER_DEG_S;
1583 sc->ds4_calib_data[1].sens_denom = gyro_yaw_plus - gyro_yaw_minus;
1584
1585 sc->ds4_calib_data[2].abs_code = ABS_RZ;
1586 sc->ds4_calib_data[2].bias = gyro_roll_bias;
1587 sc->ds4_calib_data[2].sens_numer = speed_2x*DS4_GYRO_RES_PER_DEG_S;
1588 sc->ds4_calib_data[2].sens_denom = gyro_roll_plus - gyro_roll_minus;
1589
1590 /* Set accelerometer calibration and normalization parameters.
1591 * Data values will be normalized to 1/DS4_ACC_RES_PER_G G.
1592 */
1593 range_2g = acc_x_plus - acc_x_minus;
1594 sc->ds4_calib_data[3].abs_code = ABS_X;
1595 sc->ds4_calib_data[3].bias = acc_x_plus - range_2g / 2;
1596 sc->ds4_calib_data[3].sens_numer = 2*DS4_ACC_RES_PER_G;
1597 sc->ds4_calib_data[3].sens_denom = range_2g;
1598
1599 range_2g = acc_y_plus - acc_y_minus;
1600 sc->ds4_calib_data[4].abs_code = ABS_Y;
1601 sc->ds4_calib_data[4].bias = acc_y_plus - range_2g / 2;
1602 sc->ds4_calib_data[4].sens_numer = 2*DS4_ACC_RES_PER_G;
1603 sc->ds4_calib_data[4].sens_denom = range_2g;
1604
1605 range_2g = acc_z_plus - acc_z_minus;
1606 sc->ds4_calib_data[5].abs_code = ABS_Z;
1607 sc->ds4_calib_data[5].bias = acc_z_plus - range_2g / 2;
1608 sc->ds4_calib_data[5].sens_numer = 2*DS4_ACC_RES_PER_G;
1609 sc->ds4_calib_data[5].sens_denom = range_2g;
1610
1611err_stop:
Frank Praznik9b2b5c92014-11-12 14:10:09 -05001612 kfree(buf);
Frank Praznik9b2b5c92014-11-12 14:10:09 -05001613 return ret;
Jiri Slabybd28ce02008-06-25 23:47:04 +02001614}
1615
Roderick Colenbrander72dbb852017-03-07 15:45:06 -08001616static void dualshock4_calibration_work(struct work_struct *work)
1617{
1618 struct sony_sc *sc = container_of(work, struct sony_sc, hotplug_worker);
1619 unsigned long flags;
1620 enum ds4_dongle_state dongle_state;
1621 int ret;
1622
1623 ret = dualshock4_get_calibration_data(sc);
1624 if (ret < 0) {
1625 /* This call is very unlikely to fail for the dongle. When it
1626 * fails we are probably in a very bad state, so mark the
1627 * dongle as disabled. We will re-enable the dongle if a new
1628 * DS4 hotplug is detect from sony_raw_event as any issues
1629 * are likely resolved then (the dongle is quite stupid).
1630 */
1631 hid_err(sc->hdev, "DualShock 4 USB dongle: calibration failed, disabling device\n");
1632 dongle_state = DONGLE_DISABLED;
1633 } else {
1634 hid_info(sc->hdev, "DualShock 4 USB dongle: calibration completed\n");
1635 dongle_state = DONGLE_CONNECTED;
1636 }
1637
1638 spin_lock_irqsave(&sc->lock, flags);
1639 sc->ds4_dongle_state = dongle_state;
1640 spin_unlock_irqrestore(&sc->lock, flags);
1641}
1642
Frank Praznik221399b2015-05-05 20:47:32 -04001643static void sixaxis_set_leds_from_id(struct sony_sc *sc)
Frank Praznik80250872014-04-14 10:11:35 -04001644{
Pavel Machek1adf9042016-02-09 13:55:08 +01001645 static const u8 sixaxis_leds[10][4] = {
Frank Praznik80250872014-04-14 10:11:35 -04001646 { 0x01, 0x00, 0x00, 0x00 },
1647 { 0x00, 0x01, 0x00, 0x00 },
1648 { 0x00, 0x00, 0x01, 0x00 },
1649 { 0x00, 0x00, 0x00, 0x01 },
1650 { 0x01, 0x00, 0x00, 0x01 },
1651 { 0x00, 0x01, 0x00, 0x01 },
1652 { 0x00, 0x00, 0x01, 0x01 },
1653 { 0x01, 0x00, 0x01, 0x01 },
1654 { 0x00, 0x01, 0x01, 0x01 },
1655 { 0x01, 0x01, 0x01, 0x01 }
1656 };
1657
Frank Praznik221399b2015-05-05 20:47:32 -04001658 int id = sc->device_id;
1659
1660 BUILD_BUG_ON(MAX_LEDS < ARRAY_SIZE(sixaxis_leds[0]));
Frank Praznik80250872014-04-14 10:11:35 -04001661
1662 if (id < 0)
1663 return;
1664
1665 id %= 10;
Frank Praznik221399b2015-05-05 20:47:32 -04001666 memcpy(sc->led_state, sixaxis_leds[id], sizeof(sixaxis_leds[id]));
Frank Praznik80250872014-04-14 10:11:35 -04001667}
1668
Frank Praznik221399b2015-05-05 20:47:32 -04001669static void dualshock4_set_leds_from_id(struct sony_sc *sc)
Frank Praznik80250872014-04-14 10:11:35 -04001670{
1671 /* The first 4 color/index entries match what the PS4 assigns */
Pavel Machek1adf9042016-02-09 13:55:08 +01001672 static const u8 color_code[7][3] = {
Roderick Colenbranderacde02b2017-03-24 15:17:47 -07001673 /* Blue */ { 0x00, 0x00, 0x40 },
1674 /* Red */ { 0x40, 0x00, 0x00 },
1675 /* Green */ { 0x00, 0x40, 0x00 },
1676 /* Pink */ { 0x20, 0x00, 0x20 },
Frank Praznik80250872014-04-14 10:11:35 -04001677 /* Orange */ { 0x02, 0x01, 0x00 },
1678 /* Teal */ { 0x00, 0x01, 0x01 },
1679 /* White */ { 0x01, 0x01, 0x01 }
1680 };
1681
Frank Praznik221399b2015-05-05 20:47:32 -04001682 int id = sc->device_id;
1683
1684 BUILD_BUG_ON(MAX_LEDS < ARRAY_SIZE(color_code[0]));
Frank Praznik80250872014-04-14 10:11:35 -04001685
1686 if (id < 0)
1687 return;
1688
1689 id %= 7;
Frank Praznik221399b2015-05-05 20:47:32 -04001690 memcpy(sc->led_state, color_code[id], sizeof(color_code[id]));
Frank Praznik80250872014-04-14 10:11:35 -04001691}
1692
Frank Praznik221399b2015-05-05 20:47:32 -04001693static void buzz_set_leds(struct sony_sc *sc)
Colin Leitnerf04d5142013-05-27 23:41:05 +02001694{
Frank Praznik221399b2015-05-05 20:47:32 -04001695 struct hid_device *hdev = sc->hdev;
Colin Leitnerf04d5142013-05-27 23:41:05 +02001696 struct list_head *report_list =
1697 &hdev->report_enum[HID_OUTPUT_REPORT].report_list;
1698 struct hid_report *report = list_entry(report_list->next,
1699 struct hid_report, list);
Pavel Machek1adf9042016-02-09 13:55:08 +01001700 s32 *value = report->field[0]->value;
Colin Leitnerf04d5142013-05-27 23:41:05 +02001701
Frank Praznik221399b2015-05-05 20:47:32 -04001702 BUILD_BUG_ON(MAX_LEDS < 4);
1703
Colin Leitnerf04d5142013-05-27 23:41:05 +02001704 value[0] = 0x00;
Frank Praznik221399b2015-05-05 20:47:32 -04001705 value[1] = sc->led_state[0] ? 0xff : 0x00;
1706 value[2] = sc->led_state[1] ? 0xff : 0x00;
1707 value[3] = sc->led_state[2] ? 0xff : 0x00;
1708 value[4] = sc->led_state[3] ? 0xff : 0x00;
Colin Leitnerf04d5142013-05-27 23:41:05 +02001709 value[5] = 0x00;
1710 value[6] = 0x00;
1711 hid_hw_request(hdev, report, HID_REQ_SET_REPORT);
1712}
1713
Frank Praznik221399b2015-05-05 20:47:32 -04001714static void sony_set_leds(struct sony_sc *sc)
Sven Eckelmann0a286ef2013-11-19 20:26:32 +01001715{
Frank Praznik221399b2015-05-05 20:47:32 -04001716 if (!(sc->quirks & BUZZ_CONTROLLER))
Roderick Colenbrander3a60a132017-03-07 15:45:05 -08001717 sony_schedule_work(sc, SONY_WORKER_STATE);
Frank Praznik221399b2015-05-05 20:47:32 -04001718 else
1719 buzz_set_leds(sc);
Sven Eckelmann0a286ef2013-11-19 20:26:32 +01001720}
1721
Sven Eckelmannc5382512013-11-19 20:26:30 +01001722static void sony_led_set_brightness(struct led_classdev *led,
Colin Leitnerf04d5142013-05-27 23:41:05 +02001723 enum led_brightness value)
1724{
1725 struct device *dev = led->dev->parent;
Geliang Tangee79a8f2015-12-27 17:25:21 +08001726 struct hid_device *hdev = to_hid_device(dev);
Colin Leitnerf04d5142013-05-27 23:41:05 +02001727 struct sony_sc *drv_data;
Colin Leitnerf04d5142013-05-27 23:41:05 +02001728
1729 int n;
Frank Praznikb3ed4582014-04-14 10:11:36 -04001730 int force_update;
Colin Leitnerf04d5142013-05-27 23:41:05 +02001731
1732 drv_data = hid_get_drvdata(hdev);
Sven Eckelmann2251b852013-11-19 20:26:31 +01001733 if (!drv_data) {
Colin Leitnerf04d5142013-05-27 23:41:05 +02001734 hid_err(hdev, "No device data\n");
1735 return;
1736 }
Colin Leitnerf04d5142013-05-27 23:41:05 +02001737
Frank Praznikb3ed4582014-04-14 10:11:36 -04001738 /*
1739 * The Sixaxis on USB will override any LED settings sent to it
1740 * and keep flashing all of the LEDs until the PS button is pressed.
1741 * Updates, even if redundant, must be always be sent to the
1742 * controller to avoid having to toggle the state of an LED just to
1743 * stop the flashing later on.
1744 */
1745 force_update = !!(drv_data->quirks & SIXAXIS_CONTROLLER_USB);
1746
Frank Praznik60781cf2014-01-11 15:13:15 -05001747 for (n = 0; n < drv_data->led_count; n++) {
Frank Praznikb3ed4582014-04-14 10:11:36 -04001748 if (led == drv_data->leds[n] && (force_update ||
1749 (value != drv_data->led_state[n] ||
1750 drv_data->led_delay_on[n] ||
1751 drv_data->led_delay_off[n]))) {
1752
1753 drv_data->led_state[n] = value;
1754
1755 /* Setting the brightness stops the blinking */
1756 drv_data->led_delay_on[n] = 0;
1757 drv_data->led_delay_off[n] = 0;
1758
Frank Praznik221399b2015-05-05 20:47:32 -04001759 sony_set_leds(drv_data);
Colin Leitnerf04d5142013-05-27 23:41:05 +02001760 break;
1761 }
1762 }
1763}
1764
Sven Eckelmannc5382512013-11-19 20:26:30 +01001765static enum led_brightness sony_led_get_brightness(struct led_classdev *led)
Colin Leitnerf04d5142013-05-27 23:41:05 +02001766{
1767 struct device *dev = led->dev->parent;
Geliang Tangee79a8f2015-12-27 17:25:21 +08001768 struct hid_device *hdev = to_hid_device(dev);
Colin Leitnerf04d5142013-05-27 23:41:05 +02001769 struct sony_sc *drv_data;
Colin Leitnerf04d5142013-05-27 23:41:05 +02001770
1771 int n;
Colin Leitnerf04d5142013-05-27 23:41:05 +02001772
1773 drv_data = hid_get_drvdata(hdev);
Sven Eckelmann2251b852013-11-19 20:26:31 +01001774 if (!drv_data) {
Colin Leitnerf04d5142013-05-27 23:41:05 +02001775 hid_err(hdev, "No device data\n");
1776 return LED_OFF;
1777 }
Colin Leitnerf04d5142013-05-27 23:41:05 +02001778
Frank Praznik60781cf2014-01-11 15:13:15 -05001779 for (n = 0; n < drv_data->led_count; n++) {
Simon Wood7db75042014-02-05 12:34:18 -07001780 if (led == drv_data->leds[n])
1781 return drv_data->led_state[n];
Colin Leitnerf04d5142013-05-27 23:41:05 +02001782 }
1783
Simon Wood7db75042014-02-05 12:34:18 -07001784 return LED_OFF;
Colin Leitnerf04d5142013-05-27 23:41:05 +02001785}
Colin Leitnerf04d5142013-05-27 23:41:05 +02001786
Frank Praznikb3ed4582014-04-14 10:11:36 -04001787static int sony_led_blink_set(struct led_classdev *led, unsigned long *delay_on,
1788 unsigned long *delay_off)
1789{
1790 struct device *dev = led->dev->parent;
Geliang Tangee79a8f2015-12-27 17:25:21 +08001791 struct hid_device *hdev = to_hid_device(dev);
Frank Praznikb3ed4582014-04-14 10:11:36 -04001792 struct sony_sc *drv_data = hid_get_drvdata(hdev);
1793 int n;
Pavel Machek1adf9042016-02-09 13:55:08 +01001794 u8 new_on, new_off;
Frank Praznikb3ed4582014-04-14 10:11:36 -04001795
1796 if (!drv_data) {
1797 hid_err(hdev, "No device data\n");
1798 return -EINVAL;
1799 }
1800
1801 /* Max delay is 255 deciseconds or 2550 milliseconds */
1802 if (*delay_on > 2550)
1803 *delay_on = 2550;
1804 if (*delay_off > 2550)
1805 *delay_off = 2550;
1806
1807 /* Blink at 1 Hz if both values are zero */
1808 if (!*delay_on && !*delay_off)
1809 *delay_on = *delay_off = 500;
1810
1811 new_on = *delay_on / 10;
1812 new_off = *delay_off / 10;
1813
1814 for (n = 0; n < drv_data->led_count; n++) {
1815 if (led == drv_data->leds[n])
1816 break;
1817 }
1818
1819 /* This LED is not registered on this device */
1820 if (n >= drv_data->led_count)
1821 return -EINVAL;
1822
1823 /* Don't schedule work if the values didn't change */
1824 if (new_on != drv_data->led_delay_on[n] ||
1825 new_off != drv_data->led_delay_off[n]) {
1826 drv_data->led_delay_on[n] = new_on;
1827 drv_data->led_delay_off[n] = new_off;
Roderick Colenbrander3a60a132017-03-07 15:45:05 -08001828 sony_schedule_work(drv_data, SONY_WORKER_STATE);
Frank Praznikb3ed4582014-04-14 10:11:36 -04001829 }
1830
1831 return 0;
1832}
1833
Frank Praznikfa57a812014-04-14 10:11:33 -04001834static void sony_leds_remove(struct sony_sc *sc)
Sven Eckelmann0a286ef2013-11-19 20:26:32 +01001835{
Sven Eckelmann0a286ef2013-11-19 20:26:32 +01001836 struct led_classdev *led;
1837 int n;
1838
Frank Praznikfa57a812014-04-14 10:11:33 -04001839 BUG_ON(!(sc->quirks & SONY_LED_SUPPORT));
Sven Eckelmann0a286ef2013-11-19 20:26:32 +01001840
Frank Praznikfa57a812014-04-14 10:11:33 -04001841 for (n = 0; n < sc->led_count; n++) {
1842 led = sc->leds[n];
1843 sc->leds[n] = NULL;
Sven Eckelmann0a286ef2013-11-19 20:26:32 +01001844 if (!led)
1845 continue;
1846 led_classdev_unregister(led);
1847 kfree(led);
1848 }
Frank Praznik60781cf2014-01-11 15:13:15 -05001849
Frank Praznikfa57a812014-04-14 10:11:33 -04001850 sc->led_count = 0;
Sven Eckelmann0a286ef2013-11-19 20:26:32 +01001851}
1852
Frank Praznikfa57a812014-04-14 10:11:33 -04001853static int sony_leds_init(struct sony_sc *sc)
Colin Leitnerf04d5142013-05-27 23:41:05 +02001854{
Frank Praznikfa57a812014-04-14 10:11:33 -04001855 struct hid_device *hdev = sc->hdev;
Jiri Kosina40e32ee2013-05-28 11:22:09 +02001856 int n, ret = 0;
Frank Praznikb3ed4582014-04-14 10:11:36 -04001857 int use_ds4_names;
Jiri Kosina40e32ee2013-05-28 11:22:09 +02001858 struct led_classdev *led;
1859 size_t name_sz;
1860 char *name;
Sven Eckelmann0a286ef2013-11-19 20:26:32 +01001861 size_t name_len;
1862 const char *name_fmt;
Frank Praznikb3ed4582014-04-14 10:11:36 -04001863 static const char * const ds4_name_str[] = { "red", "green", "blue",
1864 "global" };
Pavel Machek1adf9042016-02-09 13:55:08 +01001865 u8 max_brightness[MAX_LEDS] = { [0 ... (MAX_LEDS - 1)] = 1 };
1866 u8 use_hw_blink[MAX_LEDS] = { 0 };
Colin Leitnerf04d5142013-05-27 23:41:05 +02001867
Frank Praznikfa57a812014-04-14 10:11:33 -04001868 BUG_ON(!(sc->quirks & SONY_LED_SUPPORT));
Colin Leitnerf04d5142013-05-27 23:41:05 +02001869
Frank Praznikfa57a812014-04-14 10:11:33 -04001870 if (sc->quirks & BUZZ_CONTROLLER) {
1871 sc->led_count = 4;
Frank Praznikb3ed4582014-04-14 10:11:36 -04001872 use_ds4_names = 0;
Sven Eckelmann0a286ef2013-11-19 20:26:32 +01001873 name_len = strlen("::buzz#");
1874 name_fmt = "%s::buzz%d";
1875 /* Validate expected report characteristics. */
1876 if (!hid_validate_values(hdev, HID_OUTPUT_REPORT, 0, 0, 7))
1877 return -ENODEV;
Frank Praznikfa57a812014-04-14 10:11:33 -04001878 } else if (sc->quirks & DUALSHOCK4_CONTROLLER) {
Frank Praznik221399b2015-05-05 20:47:32 -04001879 dualshock4_set_leds_from_id(sc);
1880 sc->led_state[3] = 1;
Frank Praznikb3ed4582014-04-14 10:11:36 -04001881 sc->led_count = 4;
1882 memset(max_brightness, 255, 3);
1883 use_hw_blink[3] = 1;
1884 use_ds4_names = 1;
Frank Praznik61ebca92014-01-20 12:27:02 -05001885 name_len = 0;
1886 name_fmt = "%s:%s";
Frank Praznikc5e0c1c2015-05-05 20:47:30 -04001887 } else if (sc->quirks & MOTION_CONTROLLER) {
1888 sc->led_count = 3;
1889 memset(max_brightness, 255, 3);
1890 use_ds4_names = 1;
1891 name_len = 0;
1892 name_fmt = "%s:%s";
Simon Wood4545ee02015-06-17 00:08:52 -06001893 } else if (sc->quirks & NAVIGATION_CONTROLLER) {
Pavel Machek1adf9042016-02-09 13:55:08 +01001894 static const u8 navigation_leds[4] = {0x01, 0x00, 0x00, 0x00};
Simon Wood4545ee02015-06-17 00:08:52 -06001895
1896 memcpy(sc->led_state, navigation_leds, sizeof(navigation_leds));
1897 sc->led_count = 1;
1898 memset(use_hw_blink, 1, 4);
1899 use_ds4_names = 0;
1900 name_len = strlen("::sony#");
1901 name_fmt = "%s::sony%d";
Frank Praznik60781cf2014-01-11 15:13:15 -05001902 } else {
Frank Praznik221399b2015-05-05 20:47:32 -04001903 sixaxis_set_leds_from_id(sc);
Frank Praznikfa57a812014-04-14 10:11:33 -04001904 sc->led_count = 4;
Frank Praznikb3ed4582014-04-14 10:11:36 -04001905 memset(use_hw_blink, 1, 4);
1906 use_ds4_names = 0;
Frank Praznik61ebca92014-01-20 12:27:02 -05001907 name_len = strlen("::sony#");
1908 name_fmt = "%s::sony%d";
Frank Praznik60781cf2014-01-11 15:13:15 -05001909 }
1910
Frank Praznikad142b92014-02-20 11:36:00 -05001911 /*
1912 * Clear LEDs as we have no way of reading their initial state. This is
Colin Leitnerf04d5142013-05-27 23:41:05 +02001913 * only relevant if the driver is loaded after somebody actively set the
Frank Praznikad142b92014-02-20 11:36:00 -05001914 * LEDs to on
1915 */
Frank Praznik221399b2015-05-05 20:47:32 -04001916 sony_set_leds(sc);
Colin Leitnerf04d5142013-05-27 23:41:05 +02001917
Sven Eckelmann0a286ef2013-11-19 20:26:32 +01001918 name_sz = strlen(dev_name(&hdev->dev)) + name_len + 1;
Colin Leitnerf04d5142013-05-27 23:41:05 +02001919
Frank Praznikfa57a812014-04-14 10:11:33 -04001920 for (n = 0; n < sc->led_count; n++) {
Frank Praznik61ebca92014-01-20 12:27:02 -05001921
Frank Praznikb3ed4582014-04-14 10:11:36 -04001922 if (use_ds4_names)
1923 name_sz = strlen(dev_name(&hdev->dev)) + strlen(ds4_name_str[n]) + 2;
Frank Praznik61ebca92014-01-20 12:27:02 -05001924
Jiri Kosina40e32ee2013-05-28 11:22:09 +02001925 led = kzalloc(sizeof(struct led_classdev) + name_sz, GFP_KERNEL);
1926 if (!led) {
1927 hid_err(hdev, "Couldn't allocate memory for LED %d\n", n);
Julia Lawall8cd5fcd2013-12-29 23:47:27 +01001928 ret = -ENOMEM;
Jiri Kosina40e32ee2013-05-28 11:22:09 +02001929 goto error_leds;
Colin Leitnerf04d5142013-05-27 23:41:05 +02001930 }
Jiri Kosina40e32ee2013-05-28 11:22:09 +02001931
1932 name = (void *)(&led[1]);
Frank Praznikb3ed4582014-04-14 10:11:36 -04001933 if (use_ds4_names)
1934 snprintf(name, name_sz, name_fmt, dev_name(&hdev->dev),
1935 ds4_name_str[n]);
Frank Praznik61ebca92014-01-20 12:27:02 -05001936 else
1937 snprintf(name, name_sz, name_fmt, dev_name(&hdev->dev), n + 1);
Jiri Kosina40e32ee2013-05-28 11:22:09 +02001938 led->name = name;
Frank Praznik221399b2015-05-05 20:47:32 -04001939 led->brightness = sc->led_state[n];
Frank Praznikb3ed4582014-04-14 10:11:36 -04001940 led->max_brightness = max_brightness[n];
Frank Praznike6061c12017-02-08 13:58:43 -05001941 led->flags = LED_CORE_SUSPENDRESUME;
Sven Eckelmannc5382512013-11-19 20:26:30 +01001942 led->brightness_get = sony_led_get_brightness;
1943 led->brightness_set = sony_led_set_brightness;
Jiri Kosina40e32ee2013-05-28 11:22:09 +02001944
Frank Praznikb3ed4582014-04-14 10:11:36 -04001945 if (use_hw_blink[n])
1946 led->blink_set = sony_led_blink_set;
1947
Frank Praznik80250872014-04-14 10:11:35 -04001948 sc->leds[n] = led;
1949
Julia Lawall8cd5fcd2013-12-29 23:47:27 +01001950 ret = led_classdev_register(&hdev->dev, led);
1951 if (ret) {
Jiri Kosina40e32ee2013-05-28 11:22:09 +02001952 hid_err(hdev, "Failed to register LED %d\n", n);
Frank Praznik80250872014-04-14 10:11:35 -04001953 sc->leds[n] = NULL;
Jiri Kosina40e32ee2013-05-28 11:22:09 +02001954 kfree(led);
1955 goto error_leds;
1956 }
Colin Leitnerf04d5142013-05-27 23:41:05 +02001957 }
Colin Leitnerf04d5142013-05-27 23:41:05 +02001958
1959 return ret;
1960
Colin Leitnerf04d5142013-05-27 23:41:05 +02001961error_leds:
Frank Praznikfa57a812014-04-14 10:11:33 -04001962 sony_leds_remove(sc);
Colin Leitnerf04d5142013-05-27 23:41:05 +02001963
Colin Leitnerf04d5142013-05-27 23:41:05 +02001964 return ret;
Colin Leitnerf04d5142013-05-27 23:41:05 +02001965}
1966
Frank Praznikd8aaccd2015-11-11 09:49:37 -05001967static void sixaxis_send_output_report(struct sony_sc *sc)
Sven Eckelmanna08c22c2013-11-09 19:25:57 +01001968{
Frank Praznik9b2b5c92014-11-12 14:10:09 -05001969 static const union sixaxis_output_report_01 default_report = {
Frank Praznik55d3b662014-04-14 10:11:32 -04001970 .buf = {
1971 0x01,
Scott Moreauad07b7a2016-01-13 07:40:43 -07001972 0x01, 0xff, 0x00, 0xff, 0x00,
Frank Praznik55d3b662014-04-14 10:11:32 -04001973 0x00, 0x00, 0x00, 0x00, 0x00,
1974 0xff, 0x27, 0x10, 0x00, 0x32,
1975 0xff, 0x27, 0x10, 0x00, 0x32,
1976 0xff, 0x27, 0x10, 0x00, 0x32,
1977 0xff, 0x27, 0x10, 0x00, 0x32,
1978 0x00, 0x00, 0x00, 0x00, 0x00
1979 }
Sven Eckelmanna08c22c2013-11-09 19:25:57 +01001980 };
Frank Praznik9b2b5c92014-11-12 14:10:09 -05001981 struct sixaxis_output_report *report =
1982 (struct sixaxis_output_report *)sc->output_report_dmabuf;
1983 int n;
1984
1985 /* Initialize the report with default values */
1986 memcpy(report, &default_report, sizeof(struct sixaxis_output_report));
Sven Eckelmann9f323b62013-11-17 20:38:21 +01001987
Sven Eckelmann0a286ef2013-11-19 20:26:32 +01001988#ifdef CONFIG_SONY_FF
Frank Praznik9b2b5c92014-11-12 14:10:09 -05001989 report->rumble.right_motor_on = sc->right ? 1 : 0;
1990 report->rumble.left_motor_force = sc->left;
Sven Eckelmann0a286ef2013-11-19 20:26:32 +01001991#endif
1992
Frank Praznik9b2b5c92014-11-12 14:10:09 -05001993 report->leds_bitmap |= sc->led_state[0] << 1;
1994 report->leds_bitmap |= sc->led_state[1] << 2;
1995 report->leds_bitmap |= sc->led_state[2] << 3;
1996 report->leds_bitmap |= sc->led_state[3] << 4;
Sven Eckelmann9f323b62013-11-17 20:38:21 +01001997
Simon Wood88f65762014-04-14 10:11:37 -04001998 /* Set flag for all leds off, required for 3rd party INTEC controller */
Frank Praznik9b2b5c92014-11-12 14:10:09 -05001999 if ((report->leds_bitmap & 0x1E) == 0)
2000 report->leds_bitmap |= 0x20;
Simon Wood88f65762014-04-14 10:11:37 -04002001
Frank Praznikb3ed4582014-04-14 10:11:36 -04002002 /*
2003 * The LEDs in the report are indexed in reverse order to their
2004 * corresponding light on the controller.
2005 * Index 0 = LED 4, index 1 = LED 3, etc...
2006 *
2007 * In the case of both delay values being zero (blinking disabled) the
2008 * default report values should be used or the controller LED will be
2009 * always off.
2010 */
2011 for (n = 0; n < 4; n++) {
2012 if (sc->led_delay_on[n] || sc->led_delay_off[n]) {
Frank Praznik9b2b5c92014-11-12 14:10:09 -05002013 report->led[3 - n].duty_off = sc->led_delay_off[n];
2014 report->led[3 - n].duty_on = sc->led_delay_on[n];
Frank Praznikb3ed4582014-04-14 10:11:36 -04002015 }
2016 }
2017
Pavel Machek1adf9042016-02-09 13:55:08 +01002018 hid_hw_raw_request(sc->hdev, report->report_id, (u8 *)report,
Frank Praznik9b2b5c92014-11-12 14:10:09 -05002019 sizeof(struct sixaxis_output_report),
2020 HID_OUTPUT_REPORT, HID_REQ_SET_REPORT);
Sven Eckelmann9f323b62013-11-17 20:38:21 +01002021}
2022
Frank Praznikd8aaccd2015-11-11 09:49:37 -05002023static void dualshock4_send_output_report(struct sony_sc *sc)
Frank Praznik0bd88dd2014-01-11 15:12:42 -05002024{
Frank Praznik0da8ea62014-01-16 21:42:51 -05002025 struct hid_device *hdev = sc->hdev;
Pavel Machek1adf9042016-02-09 13:55:08 +01002026 u8 *buf = sc->output_report_dmabuf;
Frank Praznik48220232014-02-05 20:03:44 -05002027 int offset;
Frank Praznik0da8ea62014-01-16 21:42:51 -05002028
Frank Praznikc4425c82016-09-22 20:18:10 -04002029 /*
Roderick Colenbrander786bd402017-03-24 15:17:49 -07002030 * NOTE: The lower 6 bits of buf[1] field of the Bluetooth report
2031 * control the interval at which Dualshock 4 reports data:
2032 * 0x00 - 1ms
2033 * 0x01 - 1ms
2034 * 0x02 - 2ms
2035 * 0x3E - 62ms
2036 * 0x3F - disabled
Frank Praznikc4425c82016-09-22 20:18:10 -04002037 */
Roderick Colenbrander8f1d4702017-03-07 15:45:04 -08002038 if (sc->quirks & (DUALSHOCK4_CONTROLLER_USB | DUALSHOCK4_DONGLE)) {
Roderick Colenbrander5443a632016-10-07 12:39:35 -07002039 memset(buf, 0, DS4_OUTPUT_REPORT_0x05_SIZE);
Frank Praznikfdcf105d2014-02-05 20:03:46 -05002040 buf[0] = 0x05;
Roderick Colenbrander9c4dcd72017-03-24 15:17:48 -07002041 buf[1] = 0x07; /* blink + LEDs + motor */
Frank Praznikfdcf105d2014-02-05 20:03:46 -05002042 offset = 4;
2043 } else {
Roderick Colenbrander5443a632016-10-07 12:39:35 -07002044 memset(buf, 0, DS4_OUTPUT_REPORT_0x11_SIZE);
Frank Praznikfdcf105d2014-02-05 20:03:46 -05002045 buf[0] = 0x11;
Roderick Colenbrander786bd402017-03-24 15:17:49 -07002046 buf[1] = 0xC0 /* HID + CRC */ | sc->ds4_bt_poll_interval;
Roderick Colenbrander9c4dcd72017-03-24 15:17:48 -07002047 buf[3] = 0x07; /* blink + LEDs + motor */
Frank Praznikfdcf105d2014-02-05 20:03:46 -05002048 offset = 6;
2049 }
Frank Praznik0bd88dd2014-01-11 15:12:42 -05002050
2051#ifdef CONFIG_SONY_FF
Frank Praznik48220232014-02-05 20:03:44 -05002052 buf[offset++] = sc->right;
2053 buf[offset++] = sc->left;
2054#else
2055 offset += 2;
Frank Praznik0bd88dd2014-01-11 15:12:42 -05002056#endif
2057
Frank Praznikb3ed4582014-04-14 10:11:36 -04002058 /* LED 3 is the global control */
2059 if (sc->led_state[3]) {
2060 buf[offset++] = sc->led_state[0];
2061 buf[offset++] = sc->led_state[1];
2062 buf[offset++] = sc->led_state[2];
2063 } else {
2064 offset += 3;
2065 }
2066
2067 /* If both delay values are zero the DualShock 4 disables blinking. */
2068 buf[offset++] = sc->led_delay_on[3];
2069 buf[offset++] = sc->led_delay_off[3];
Frank Praznik60781cf2014-01-11 15:13:15 -05002070
Roderick Colenbrander8f1d4702017-03-07 15:45:04 -08002071 if (sc->quirks & (DUALSHOCK4_CONTROLLER_USB | DUALSHOCK4_DONGLE))
Roderick Colenbrander5443a632016-10-07 12:39:35 -07002072 hid_hw_output_report(hdev, buf, DS4_OUTPUT_REPORT_0x05_SIZE);
Roderick Colenbranderc076f052016-10-07 12:39:37 -07002073 else {
2074 /* CRC generation */
2075 u8 bthdr = 0xA2;
2076 u32 crc;
2077
2078 crc = crc32_le(0xFFFFFFFF, &bthdr, 1);
2079 crc = ~crc32_le(crc, buf, DS4_OUTPUT_REPORT_0x11_SIZE-4);
2080 put_unaligned_le32(crc, &buf[74]);
2081 hid_hw_output_report(hdev, buf, DS4_OUTPUT_REPORT_0x11_SIZE);
2082 }
Frank Praznik0bd88dd2014-01-11 15:12:42 -05002083}
2084
Frank Praznikd8aaccd2015-11-11 09:49:37 -05002085static void motion_send_output_report(struct sony_sc *sc)
Frank Praznikc5e0c1c2015-05-05 20:47:30 -04002086{
Frank Praznikc5e0c1c2015-05-05 20:47:30 -04002087 struct hid_device *hdev = sc->hdev;
2088 struct motion_output_report_02 *report =
2089 (struct motion_output_report_02 *)sc->output_report_dmabuf;
2090
Simon Wood41d2d422015-06-09 21:27:06 -06002091 memset(report, 0, MOTION_REPORT_0x02_SIZE);
Frank Praznikc5e0c1c2015-05-05 20:47:30 -04002092
2093 report->type = 0x02; /* set leds */
2094 report->r = sc->led_state[0];
2095 report->g = sc->led_state[1];
2096 report->b = sc->led_state[2];
2097
2098#ifdef CONFIG_SONY_FF
2099 report->rumble = max(sc->right, sc->left);
2100#endif
2101
Pavel Machek1adf9042016-02-09 13:55:08 +01002102 hid_hw_output_report(hdev, (u8 *)report, MOTION_REPORT_0x02_SIZE);
Frank Praznikc5e0c1c2015-05-05 20:47:30 -04002103}
2104
Frank Praznikdecd9462015-11-11 09:49:38 -05002105static inline void sony_send_output_report(struct sony_sc *sc)
2106{
2107 if (sc->send_output_report)
2108 sc->send_output_report(sc);
2109}
2110
Frank Praznikd8aaccd2015-11-11 09:49:37 -05002111static void sony_state_worker(struct work_struct *work)
2112{
2113 struct sony_sc *sc = container_of(work, struct sony_sc, state_worker);
Antonio Ospiteef916ef2016-02-09 13:55:07 +01002114
Frank Praznikd8aaccd2015-11-11 09:49:37 -05002115 sc->send_output_report(sc);
2116}
2117
Frank Praznik9b2b5c92014-11-12 14:10:09 -05002118static int sony_allocate_output_report(struct sony_sc *sc)
2119{
Simon Wood4545ee02015-06-17 00:08:52 -06002120 if ((sc->quirks & SIXAXIS_CONTROLLER) ||
2121 (sc->quirks & NAVIGATION_CONTROLLER))
Frank Praznik9b2b5c92014-11-12 14:10:09 -05002122 sc->output_report_dmabuf =
2123 kmalloc(sizeof(union sixaxis_output_report_01),
2124 GFP_KERNEL);
2125 else if (sc->quirks & DUALSHOCK4_CONTROLLER_BT)
Roderick Colenbrander5443a632016-10-07 12:39:35 -07002126 sc->output_report_dmabuf = kmalloc(DS4_OUTPUT_REPORT_0x11_SIZE,
Frank Praznik9b2b5c92014-11-12 14:10:09 -05002127 GFP_KERNEL);
Roderick Colenbrander8f1d4702017-03-07 15:45:04 -08002128 else if (sc->quirks & (DUALSHOCK4_CONTROLLER_USB | DUALSHOCK4_DONGLE))
Roderick Colenbrander5443a632016-10-07 12:39:35 -07002129 sc->output_report_dmabuf = kmalloc(DS4_OUTPUT_REPORT_0x05_SIZE,
Frank Praznik9b2b5c92014-11-12 14:10:09 -05002130 GFP_KERNEL);
Frank Praznikc5e0c1c2015-05-05 20:47:30 -04002131 else if (sc->quirks & MOTION_CONTROLLER)
Simon Wood41d2d422015-06-09 21:27:06 -06002132 sc->output_report_dmabuf = kmalloc(MOTION_REPORT_0x02_SIZE,
2133 GFP_KERNEL);
Frank Praznik9b2b5c92014-11-12 14:10:09 -05002134 else
2135 return 0;
2136
2137 if (!sc->output_report_dmabuf)
2138 return -ENOMEM;
2139
2140 return 0;
2141}
2142
Sven Eckelmann0a286ef2013-11-19 20:26:32 +01002143#ifdef CONFIG_SONY_FF
Sven Eckelmann9f323b62013-11-17 20:38:21 +01002144static int sony_play_effect(struct input_dev *dev, void *data,
2145 struct ff_effect *effect)
2146{
Sven Eckelmanna08c22c2013-11-09 19:25:57 +01002147 struct hid_device *hid = input_get_drvdata(dev);
Sven Eckelmann9f323b62013-11-17 20:38:21 +01002148 struct sony_sc *sc = hid_get_drvdata(hid);
Sven Eckelmanna08c22c2013-11-09 19:25:57 +01002149
2150 if (effect->type != FF_RUMBLE)
2151 return 0;
2152
Sven Eckelmann9f323b62013-11-17 20:38:21 +01002153 sc->left = effect->u.rumble.strong_magnitude / 256;
Frank Praznik0bd88dd2014-01-11 15:12:42 -05002154 sc->right = effect->u.rumble.weak_magnitude / 256;
Sven Eckelmanna08c22c2013-11-09 19:25:57 +01002155
Roderick Colenbrander3a60a132017-03-07 15:45:05 -08002156 sony_schedule_work(sc, SONY_WORKER_STATE);
Sven Eckelmann9f323b62013-11-17 20:38:21 +01002157 return 0;
Sven Eckelmanna08c22c2013-11-09 19:25:57 +01002158}
2159
Frank Praznikfa57a812014-04-14 10:11:33 -04002160static int sony_init_ff(struct sony_sc *sc)
Sven Eckelmanna08c22c2013-11-09 19:25:57 +01002161{
Frank Praznikfa57a812014-04-14 10:11:33 -04002162 struct hid_input *hidinput = list_entry(sc->hdev->inputs.next,
Sven Eckelmanna08c22c2013-11-09 19:25:57 +01002163 struct hid_input, list);
2164 struct input_dev *input_dev = hidinput->input;
2165
2166 input_set_capability(input_dev, EV_FF, FF_RUMBLE);
2167 return input_ff_create_memless(input_dev, NULL, sony_play_effect);
2168}
2169
2170#else
Frank Praznikfa57a812014-04-14 10:11:33 -04002171static int sony_init_ff(struct sony_sc *sc)
Sven Eckelmanna08c22c2013-11-09 19:25:57 +01002172{
2173 return 0;
2174}
Sven Eckelmann9f323b62013-11-17 20:38:21 +01002175
Sven Eckelmanna08c22c2013-11-09 19:25:57 +01002176#endif
2177
Frank Praznikd902f472014-01-27 10:17:36 -05002178static int sony_battery_get_property(struct power_supply *psy,
2179 enum power_supply_property psp,
2180 union power_supply_propval *val)
Frank Praznikc4e1ddf2014-01-17 14:46:26 -05002181{
Krzysztof Kozlowski297d7162015-03-12 08:44:11 +01002182 struct sony_sc *sc = power_supply_get_drvdata(psy);
Frank Praznikd902f472014-01-27 10:17:36 -05002183 unsigned long flags;
2184 int ret = 0;
2185 u8 battery_charging, battery_capacity, cable_state;
2186
2187 spin_lock_irqsave(&sc->lock, flags);
2188 battery_charging = sc->battery_charging;
2189 battery_capacity = sc->battery_capacity;
2190 cable_state = sc->cable_state;
2191 spin_unlock_irqrestore(&sc->lock, flags);
2192
2193 switch (psp) {
2194 case POWER_SUPPLY_PROP_PRESENT:
2195 val->intval = 1;
2196 break;
2197 case POWER_SUPPLY_PROP_SCOPE:
2198 val->intval = POWER_SUPPLY_SCOPE_DEVICE;
2199 break;
2200 case POWER_SUPPLY_PROP_CAPACITY:
2201 val->intval = battery_capacity;
2202 break;
2203 case POWER_SUPPLY_PROP_STATUS:
2204 if (battery_charging)
2205 val->intval = POWER_SUPPLY_STATUS_CHARGING;
2206 else
2207 if (battery_capacity == 100 && cable_state)
2208 val->intval = POWER_SUPPLY_STATUS_FULL;
2209 else
2210 val->intval = POWER_SUPPLY_STATUS_DISCHARGING;
2211 break;
2212 default:
2213 ret = -EINVAL;
2214 break;
2215 }
2216 return ret;
2217}
2218
Frank Praznik0f398232016-09-22 20:18:08 -04002219static int sony_battery_probe(struct sony_sc *sc, int append_dev_id)
Frank Praznikd902f472014-01-27 10:17:36 -05002220{
Frank Praznik0f398232016-09-22 20:18:08 -04002221 const char *battery_str_fmt = append_dev_id ?
2222 "sony_controller_battery_%pMR_%i" :
2223 "sony_controller_battery_%pMR";
Krzysztof Kozlowski297d7162015-03-12 08:44:11 +01002224 struct power_supply_config psy_cfg = { .drv_data = sc, };
Frank Praznikc4e1ddf2014-01-17 14:46:26 -05002225 struct hid_device *hdev = sc->hdev;
Frank Praznikd902f472014-01-27 10:17:36 -05002226 int ret;
Frank Praznikc4e1ddf2014-01-17 14:46:26 -05002227
Frank Praznikad142b92014-02-20 11:36:00 -05002228 /*
2229 * Set the default battery level to 100% to avoid low battery warnings
Frank Praznikd9a293a2014-02-05 20:03:48 -05002230 * if the battery is polled before the first device report is received.
2231 */
2232 sc->battery_capacity = 100;
Frank Praznikc4e1ddf2014-01-17 14:46:26 -05002233
Krzysztof Kozlowski297d7162015-03-12 08:44:11 +01002234 sc->battery_desc.properties = sony_battery_props;
2235 sc->battery_desc.num_properties = ARRAY_SIZE(sony_battery_props);
2236 sc->battery_desc.get_property = sony_battery_get_property;
2237 sc->battery_desc.type = POWER_SUPPLY_TYPE_BATTERY;
2238 sc->battery_desc.use_for_apm = 0;
Frank Praznik0f398232016-09-22 20:18:08 -04002239 sc->battery_desc.name = kasprintf(GFP_KERNEL, battery_str_fmt,
2240 sc->mac_address, sc->device_id);
Krzysztof Kozlowski297d7162015-03-12 08:44:11 +01002241 if (!sc->battery_desc.name)
Frank Praznikd902f472014-01-27 10:17:36 -05002242 return -ENOMEM;
2243
Krzysztof Kozlowski297d7162015-03-12 08:44:11 +01002244 sc->battery = power_supply_register(&hdev->dev, &sc->battery_desc,
2245 &psy_cfg);
2246 if (IS_ERR(sc->battery)) {
2247 ret = PTR_ERR(sc->battery);
Frank Praznikd902f472014-01-27 10:17:36 -05002248 hid_err(hdev, "Unable to register battery device\n");
2249 goto err_free;
2250 }
2251
Krzysztof Kozlowski297d7162015-03-12 08:44:11 +01002252 power_supply_powers(sc->battery, &hdev->dev);
Frank Praznikd902f472014-01-27 10:17:36 -05002253 return 0;
2254
2255err_free:
Krzysztof Kozlowski297d7162015-03-12 08:44:11 +01002256 kfree(sc->battery_desc.name);
2257 sc->battery_desc.name = NULL;
Frank Praznikd902f472014-01-27 10:17:36 -05002258 return ret;
2259}
2260
2261static void sony_battery_remove(struct sony_sc *sc)
2262{
Krzysztof Kozlowski297d7162015-03-12 08:44:11 +01002263 if (!sc->battery_desc.name)
Frank Praznikd902f472014-01-27 10:17:36 -05002264 return;
2265
Krzysztof Kozlowski297d7162015-03-12 08:44:11 +01002266 power_supply_unregister(sc->battery);
2267 kfree(sc->battery_desc.name);
2268 sc->battery_desc.name = NULL;
Frank Praznikd902f472014-01-27 10:17:36 -05002269}
2270
Frank Praznikd2d782f2014-02-20 11:36:03 -05002271/*
2272 * If a controller is plugged in via USB while already connected via Bluetooth
2273 * it will show up as two devices. A global list of connected controllers and
2274 * their MAC addresses is maintained to ensure that a device is only connected
2275 * once.
Frank Praznik0f398232016-09-22 20:18:08 -04002276 *
2277 * Some USB-only devices masquerade as Sixaxis controllers and all have the
2278 * same dummy Bluetooth address, so a comparison of the connection type is
2279 * required. Devices are only rejected in the case where two devices have
2280 * matching Bluetooth addresses on different bus types.
Frank Praznikd2d782f2014-02-20 11:36:03 -05002281 */
Frank Praznik0f398232016-09-22 20:18:08 -04002282static inline int sony_compare_connection_type(struct sony_sc *sc0,
2283 struct sony_sc *sc1)
2284{
2285 const int sc0_not_bt = !(sc0->quirks & SONY_BT_DEVICE);
2286 const int sc1_not_bt = !(sc1->quirks & SONY_BT_DEVICE);
2287
2288 return sc0_not_bt == sc1_not_bt;
2289}
2290
Frank Praznikd2d782f2014-02-20 11:36:03 -05002291static int sony_check_add_dev_list(struct sony_sc *sc)
2292{
2293 struct sony_sc *entry;
2294 unsigned long flags;
2295 int ret;
2296
2297 spin_lock_irqsave(&sony_dev_list_lock, flags);
2298
2299 list_for_each_entry(entry, &sony_device_list, list_node) {
2300 ret = memcmp(sc->mac_address, entry->mac_address,
2301 sizeof(sc->mac_address));
2302 if (!ret) {
Frank Praznik0f398232016-09-22 20:18:08 -04002303 if (sony_compare_connection_type(sc, entry)) {
2304 ret = 1;
2305 } else {
2306 ret = -EEXIST;
2307 hid_info(sc->hdev,
2308 "controller with MAC address %pMR already connected\n",
Frank Praznikd2d782f2014-02-20 11:36:03 -05002309 sc->mac_address);
Frank Praznik0f398232016-09-22 20:18:08 -04002310 }
Frank Praznikd2d782f2014-02-20 11:36:03 -05002311 goto unlock;
Frank Praznikc4e1ddf2014-01-17 14:46:26 -05002312 }
2313 }
2314
Frank Praznikd2d782f2014-02-20 11:36:03 -05002315 ret = 0;
2316 list_add(&(sc->list_node), &sony_device_list);
Frank Praznikc4e1ddf2014-01-17 14:46:26 -05002317
Frank Praznikd2d782f2014-02-20 11:36:03 -05002318unlock:
2319 spin_unlock_irqrestore(&sony_dev_list_lock, flags);
2320 return ret;
Frank Praznikc4e1ddf2014-01-17 14:46:26 -05002321}
2322
Frank Praznikd2d782f2014-02-20 11:36:03 -05002323static void sony_remove_dev_list(struct sony_sc *sc)
2324{
2325 unsigned long flags;
2326
2327 if (sc->list_node.next) {
2328 spin_lock_irqsave(&sony_dev_list_lock, flags);
2329 list_del(&(sc->list_node));
2330 spin_unlock_irqrestore(&sony_dev_list_lock, flags);
2331 }
2332}
2333
2334static int sony_get_bt_devaddr(struct sony_sc *sc)
2335{
2336 int ret;
2337
2338 /* HIDP stores the device MAC address as a string in the uniq field. */
2339 ret = strlen(sc->hdev->uniq);
2340 if (ret != 17)
2341 return -EINVAL;
2342
2343 ret = sscanf(sc->hdev->uniq,
2344 "%02hhx:%02hhx:%02hhx:%02hhx:%02hhx:%02hhx",
2345 &sc->mac_address[5], &sc->mac_address[4], &sc->mac_address[3],
2346 &sc->mac_address[2], &sc->mac_address[1], &sc->mac_address[0]);
2347
2348 if (ret != 6)
2349 return -EINVAL;
2350
2351 return 0;
2352}
2353
2354static int sony_check_add(struct sony_sc *sc)
2355{
Pavel Machek1adf9042016-02-09 13:55:08 +01002356 u8 *buf = NULL;
Frank Praznikd2d782f2014-02-20 11:36:03 -05002357 int n, ret;
2358
2359 if ((sc->quirks & DUALSHOCK4_CONTROLLER_BT) ||
Simon Wood12e9a6d72015-06-09 21:27:05 -06002360 (sc->quirks & MOTION_CONTROLLER_BT) ||
Simon Wood4545ee02015-06-17 00:08:52 -06002361 (sc->quirks & NAVIGATION_CONTROLLER_BT) ||
Frank Praznikd2d782f2014-02-20 11:36:03 -05002362 (sc->quirks & SIXAXIS_CONTROLLER_BT)) {
2363 /*
2364 * sony_get_bt_devaddr() attempts to parse the Bluetooth MAC
2365 * address from the uniq string where HIDP stores it.
2366 * As uniq cannot be guaranteed to be a MAC address in all cases
2367 * a failure of this function should not prevent the connection.
2368 */
2369 if (sony_get_bt_devaddr(sc) < 0) {
2370 hid_warn(sc->hdev, "UNIQ does not contain a MAC address; duplicate check skipped\n");
2371 return 0;
2372 }
Roderick Colenbrander8f1d4702017-03-07 15:45:04 -08002373 } else if (sc->quirks & (DUALSHOCK4_CONTROLLER_USB | DUALSHOCK4_DONGLE)) {
Roderick Colenbrander5443a632016-10-07 12:39:35 -07002374 buf = kmalloc(DS4_FEATURE_REPORT_0x81_SIZE, GFP_KERNEL);
Frank Praznik9b2b5c92014-11-12 14:10:09 -05002375 if (!buf)
2376 return -ENOMEM;
Frank Praznikd2d782f2014-02-20 11:36:03 -05002377
2378 /*
2379 * The MAC address of a DS4 controller connected via USB can be
2380 * retrieved with feature report 0x81. The address begins at
2381 * offset 1.
2382 */
Frank Praznik9b2b5c92014-11-12 14:10:09 -05002383 ret = hid_hw_raw_request(sc->hdev, 0x81, buf,
Roderick Colenbrander5443a632016-10-07 12:39:35 -07002384 DS4_FEATURE_REPORT_0x81_SIZE, HID_FEATURE_REPORT,
Frank Praznik9b2b5c92014-11-12 14:10:09 -05002385 HID_REQ_GET_REPORT);
Frank Praznikd2d782f2014-02-20 11:36:03 -05002386
Roderick Colenbrander5443a632016-10-07 12:39:35 -07002387 if (ret != DS4_FEATURE_REPORT_0x81_SIZE) {
Frank Praznikd2d782f2014-02-20 11:36:03 -05002388 hid_err(sc->hdev, "failed to retrieve feature report 0x81 with the DualShock 4 MAC address\n");
Frank Praznik9b2b5c92014-11-12 14:10:09 -05002389 ret = ret < 0 ? ret : -EINVAL;
2390 goto out_free;
Frank Praznikd2d782f2014-02-20 11:36:03 -05002391 }
2392
2393 memcpy(sc->mac_address, &buf[1], sizeof(sc->mac_address));
Roderick Colenbranderfe9724e2016-12-08 19:09:51 -08002394
2395 snprintf(sc->hdev->uniq, sizeof(sc->hdev->uniq),
2396 "%02hhx:%02hhx:%02hhx:%02hhx:%02hhx:%02hhx",
2397 sc->mac_address[5], sc->mac_address[4],
2398 sc->mac_address[3], sc->mac_address[2],
2399 sc->mac_address[1], sc->mac_address[0]);
Simon Wood4545ee02015-06-17 00:08:52 -06002400 } else if ((sc->quirks & SIXAXIS_CONTROLLER_USB) ||
2401 (sc->quirks & NAVIGATION_CONTROLLER_USB)) {
Frank Praznik9b2b5c92014-11-12 14:10:09 -05002402 buf = kmalloc(SIXAXIS_REPORT_0xF2_SIZE, GFP_KERNEL);
2403 if (!buf)
2404 return -ENOMEM;
Frank Praznikd2d782f2014-02-20 11:36:03 -05002405
2406 /*
2407 * The MAC address of a Sixaxis controller connected via USB can
2408 * be retrieved with feature report 0xf2. The address begins at
2409 * offset 4.
2410 */
Frank Praznik9b2b5c92014-11-12 14:10:09 -05002411 ret = hid_hw_raw_request(sc->hdev, 0xf2, buf,
2412 SIXAXIS_REPORT_0xF2_SIZE, HID_FEATURE_REPORT,
2413 HID_REQ_GET_REPORT);
Frank Praznikd2d782f2014-02-20 11:36:03 -05002414
Frank Praznik9b2b5c92014-11-12 14:10:09 -05002415 if (ret != SIXAXIS_REPORT_0xF2_SIZE) {
Frank Praznikd2d782f2014-02-20 11:36:03 -05002416 hid_err(sc->hdev, "failed to retrieve feature report 0xf2 with the Sixaxis MAC address\n");
Frank Praznik9b2b5c92014-11-12 14:10:09 -05002417 ret = ret < 0 ? ret : -EINVAL;
2418 goto out_free;
Frank Praznikd2d782f2014-02-20 11:36:03 -05002419 }
2420
2421 /*
2422 * The Sixaxis device MAC in the report is big-endian and must
2423 * be byte-swapped.
2424 */
2425 for (n = 0; n < 6; n++)
2426 sc->mac_address[5-n] = buf[4+n];
Roderick Colenbrander83df3ca2017-03-24 15:17:45 -07002427
2428 snprintf(sc->hdev->uniq, sizeof(sc->hdev->uniq),
2429 "%02hhx:%02hhx:%02hhx:%02hhx:%02hhx:%02hhx",
2430 sc->mac_address[5], sc->mac_address[4],
2431 sc->mac_address[3], sc->mac_address[2],
2432 sc->mac_address[1], sc->mac_address[0]);
Frank Praznikd2d782f2014-02-20 11:36:03 -05002433 } else {
2434 return 0;
2435 }
2436
Frank Praznik9b2b5c92014-11-12 14:10:09 -05002437 ret = sony_check_add_dev_list(sc);
2438
2439out_free:
2440
2441 kfree(buf);
2442
2443 return ret;
Frank Praznikd2d782f2014-02-20 11:36:03 -05002444}
2445
Frank Praznik80250872014-04-14 10:11:35 -04002446static int sony_set_device_id(struct sony_sc *sc)
2447{
2448 int ret;
2449
2450 /*
2451 * Only DualShock 4 or Sixaxis controllers get an id.
2452 * All others are set to -1.
2453 */
2454 if ((sc->quirks & SIXAXIS_CONTROLLER) ||
2455 (sc->quirks & DUALSHOCK4_CONTROLLER)) {
2456 ret = ida_simple_get(&sony_device_id_allocator, 0, 0,
2457 GFP_KERNEL);
2458 if (ret < 0) {
2459 sc->device_id = -1;
2460 return ret;
2461 }
2462 sc->device_id = ret;
2463 } else {
2464 sc->device_id = -1;
2465 }
2466
2467 return 0;
2468}
2469
2470static void sony_release_device_id(struct sony_sc *sc)
2471{
2472 if (sc->device_id >= 0) {
2473 ida_simple_remove(&sony_device_id_allocator, sc->device_id);
2474 sc->device_id = -1;
2475 }
2476}
2477
Frank Praznikd8aaccd2015-11-11 09:49:37 -05002478static inline void sony_init_output_report(struct sony_sc *sc,
Antonio Ospite09593e32016-02-09 13:55:06 +01002479 void (*send_output_report)(struct sony_sc *))
Frank Praznik46262042014-04-14 10:11:31 -04002480{
Frank Praznikd8aaccd2015-11-11 09:49:37 -05002481 sc->send_output_report = send_output_report;
2482
Roderick Colenbrander3a60a132017-03-07 15:45:05 -08002483 if (!sc->state_worker_initialized)
Frank Praznikd8aaccd2015-11-11 09:49:37 -05002484 INIT_WORK(&sc->state_worker, sony_state_worker);
Frank Praznik46262042014-04-14 10:11:31 -04002485
Roderick Colenbrander3a60a132017-03-07 15:45:05 -08002486 sc->state_worker_initialized = 1;
Frank Praznik46262042014-04-14 10:11:31 -04002487}
2488
2489static inline void sony_cancel_work_sync(struct sony_sc *sc)
2490{
Roderick Colenbrander72dbb852017-03-07 15:45:06 -08002491 if (sc->hotplug_worker_initialized)
2492 cancel_work_sync(&sc->hotplug_worker);
Roderick Colenbrander3a60a132017-03-07 15:45:05 -08002493 if (sc->state_worker_initialized)
Frank Praznik46262042014-04-14 10:11:31 -04002494 cancel_work_sync(&sc->state_worker);
2495}
Frank Praznikd2d782f2014-02-20 11:36:03 -05002496
Roderick Colenbrander786bd402017-03-24 15:17:49 -07002497
Roderick Colenbrander5a3ee242016-10-07 12:39:34 -07002498static int sony_input_configured(struct hid_device *hdev,
2499 struct hid_input *hidinput)
Jiri Slabybd28ce02008-06-25 23:47:04 +02002500{
Roderick Colenbrander5a3ee242016-10-07 12:39:34 -07002501 struct sony_sc *sc = hid_get_drvdata(hdev);
Frank Praznik0f398232016-09-22 20:18:08 -04002502 int append_dev_id;
Roderick Colenbrander5a3ee242016-10-07 12:39:34 -07002503 int ret;
Jiri Slabybd28ce02008-06-25 23:47:04 +02002504
Frank Praznik80250872014-04-14 10:11:35 -04002505 ret = sony_set_device_id(sc);
2506 if (ret < 0) {
2507 hid_err(hdev, "failed to allocate the device id\n");
2508 goto err_stop;
2509 }
2510
Roderick Colenbranderef1f52b2017-03-07 15:45:11 -08002511 ret = append_dev_id = sony_check_add(sc);
2512 if (ret < 0)
2513 goto err_stop;
2514
Frank Praznik131a8a92015-05-05 20:47:28 -04002515 ret = sony_allocate_output_report(sc);
2516 if (ret < 0) {
2517 hid_err(hdev, "failed to allocate the output report buffer\n");
2518 goto err_stop;
2519 }
2520
Roderick Colenbrander89e9ccd2017-03-07 15:45:10 -08002521 if (sc->quirks & NAVIGATION_CONTROLLER_USB) {
Benjamin Tissoirese534a932014-03-08 22:52:42 -05002522 /*
2523 * The Sony Sixaxis does not handle HID Output Reports on the
2524 * Interrupt EP like it could, so we need to force HID Output
2525 * Reports to use HID_REQ_SET_REPORT on the Control EP.
2526 *
2527 * There is also another issue about HID Output Reports via USB,
2528 * the Sixaxis does not want the report_id as part of the data
2529 * packet, so we have to discard buf[0] when sending the actual
2530 * control message, even for numbered reports, humpf!
Frank Praznik2a242932016-09-22 20:18:09 -04002531 *
2532 * Additionally, the Sixaxis on USB isn't properly initialized
2533 * until the PS logo button is pressed and as such won't retain
2534 * any state set by an output report, so the initial
2535 * configuration report is deferred until the first input
2536 * report arrives.
Benjamin Tissoirese534a932014-03-08 22:52:42 -05002537 */
2538 hdev->quirks |= HID_QUIRK_NO_OUTPUT_REPORTS_ON_INTR_EP;
2539 hdev->quirks |= HID_QUIRK_SKIP_OUTPUT_REPORT_ID;
Frank Praznik2a242932016-09-22 20:18:09 -04002540 sc->defer_initialization = 1;
Roderick Colenbrander7bfac192017-03-07 15:45:09 -08002541
Antonio Ospite816651a2010-05-03 22:15:55 +02002542 ret = sixaxis_set_operational_usb(hdev);
Roderick Colenbrander7bfac192017-03-07 15:45:09 -08002543 if (ret < 0) {
2544 hid_err(hdev, "Failed to set controller into operational mode\n");
2545 goto err_stop;
2546 }
2547
Frank Praznikd8aaccd2015-11-11 09:49:37 -05002548 sony_init_output_report(sc, sixaxis_send_output_report);
Roderick Colenbrander89e9ccd2017-03-07 15:45:10 -08002549 } else if (sc->quirks & NAVIGATION_CONTROLLER_BT) {
2550 /*
2551 * The Navigation controller wants output reports sent on the ctrl
2552 * endpoint when connected via Bluetooth.
2553 */
2554 hdev->quirks |= HID_QUIRK_NO_OUTPUT_REPORTS_ON_INTR_EP;
2555
2556 ret = sixaxis_set_operational_bt(hdev);
2557 if (ret < 0) {
2558 hid_err(hdev, "Failed to set controller into operational mode\n");
2559 goto err_stop;
2560 }
2561
2562 sony_init_output_report(sc, sixaxis_send_output_report);
2563 } else if (sc->quirks & SIXAXIS_CONTROLLER_USB) {
2564 /*
2565 * The Sony Sixaxis does not handle HID Output Reports on the
2566 * Interrupt EP and the device only becomes active when the
2567 * PS button is pressed. See comment for Navigation controller
2568 * above for more details.
2569 */
2570 hdev->quirks |= HID_QUIRK_NO_OUTPUT_REPORTS_ON_INTR_EP;
2571 hdev->quirks |= HID_QUIRK_SKIP_OUTPUT_REPORT_ID;
2572 sc->defer_initialization = 1;
2573
2574 ret = sixaxis_set_operational_usb(hdev);
2575 if (ret < 0) {
2576 hid_err(hdev, "Failed to set controller into operational mode\n");
2577 goto err_stop;
2578 }
2579
2580 ret = sony_register_sensors(sc);
2581 if (ret) {
2582 hid_err(sc->hdev,
2583 "Unable to initialize motion sensors: %d\n", ret);
2584 goto err_stop;
2585 }
2586
2587 sony_init_output_report(sc, sixaxis_send_output_report);
2588 } else if (sc->quirks & SIXAXIS_CONTROLLER_BT) {
Frank Praznik2078b9b2014-03-15 09:41:16 -04002589 /*
2590 * The Sixaxis wants output reports sent on the ctrl endpoint
2591 * when connected via Bluetooth.
2592 */
2593 hdev->quirks |= HID_QUIRK_NO_OUTPUT_REPORTS_ON_INTR_EP;
Roderick Colenbrander7bfac192017-03-07 15:45:09 -08002594
Antonio Ospite816651a2010-05-03 22:15:55 +02002595 ret = sixaxis_set_operational_bt(hdev);
Roderick Colenbrander7bfac192017-03-07 15:45:09 -08002596 if (ret < 0) {
2597 hid_err(hdev, "Failed to set controller into operational mode\n");
2598 goto err_stop;
2599 }
2600
Roderick Colenbrander89e9ccd2017-03-07 15:45:10 -08002601 ret = sony_register_sensors(sc);
2602 if (ret) {
2603 hid_err(sc->hdev,
2604 "Unable to initialize motion sensors: %d\n", ret);
2605 goto err_stop;
2606 }
2607
Frank Praznikd8aaccd2015-11-11 09:49:37 -05002608 sony_init_output_report(sc, sixaxis_send_output_report);
Frank Praznikfee4e2d2014-02-18 17:22:01 -05002609 } else if (sc->quirks & DUALSHOCK4_CONTROLLER) {
Roderick Colenbrander9b70faa2017-03-07 15:45:01 -08002610 ret = dualshock4_get_calibration_data(sc);
2611 if (ret < 0) {
2612 hid_err(hdev, "Failed to get calibration data from Dualshock 4\n");
2613 goto err_stop;
Frank Praznik68330d82014-02-05 20:03:49 -05002614 }
Frank Praznikc4e1ddf2014-01-17 14:46:26 -05002615
Roderick Colenbrander5a3ee242016-10-07 12:39:34 -07002616 /*
2617 * The Dualshock 4 touchpad supports 2 touches and has a
2618 * resolution of 1920x942 (44.86 dots/mm).
2619 */
Roderick Colenbrander42027ee2016-11-23 14:07:07 -08002620 ret = sony_register_touchpad(sc, 2, 1920, 942);
Roderick Colenbrander5a3ee242016-10-07 12:39:34 -07002621 if (ret) {
2622 hid_err(sc->hdev,
2623 "Unable to initialize multi-touch slots: %d\n",
2624 ret);
Roderick Colenbranderf2217fd2016-12-08 19:09:50 -08002625 goto err_stop;
Roderick Colenbrander5a3ee242016-10-07 12:39:34 -07002626 }
2627
Roderick Colenbrander6f561e92017-03-07 15:45:00 -08002628 ret = sony_register_sensors(sc);
2629 if (ret) {
2630 hid_err(sc->hdev,
2631 "Unable to initialize motion sensors: %d\n", ret);
2632 goto err_stop;
2633 }
2634
Roderick Colenbrander786bd402017-03-24 15:17:49 -07002635 if (sc->quirks & DUALSHOCK4_CONTROLLER_BT) {
2636 sc->ds4_bt_poll_interval = DS4_BT_DEFAULT_POLL_INTERVAL_MS;
2637 ret = device_create_file(&sc->hdev->dev, &dev_attr_bt_poll_interval);
2638 if (ret)
2639 hid_warn(sc->hdev,
2640 "can't create sysfs bt_poll_interval attribute err: %d\n",
2641 ret);
2642 }
2643
Roderick Colenbrander72dbb852017-03-07 15:45:06 -08002644 if (sc->quirks & DUALSHOCK4_DONGLE) {
2645 INIT_WORK(&sc->hotplug_worker, dualshock4_calibration_work);
2646 sc->hotplug_worker_initialized = 1;
2647 sc->ds4_dongle_state = DONGLE_DISCONNECTED;
2648 }
2649
Frank Praznikd8aaccd2015-11-11 09:49:37 -05002650 sony_init_output_report(sc, dualshock4_send_output_report);
Frank Praznikc5e0c1c2015-05-05 20:47:30 -04002651 } else if (sc->quirks & MOTION_CONTROLLER) {
Frank Praznikd8aaccd2015-11-11 09:49:37 -05002652 sony_init_output_report(sc, motion_send_output_report);
Frank Praznik0bd88dd2014-01-11 15:12:42 -05002653 } else {
2654 ret = 0;
2655 }
Bastien Noceraf9ce7c22010-01-20 12:01:53 +00002656
Sven Eckelmann0a286ef2013-11-19 20:26:32 +01002657 if (sc->quirks & SONY_LED_SUPPORT) {
Frank Praznikfa57a812014-04-14 10:11:33 -04002658 ret = sony_leds_init(sc);
Sven Eckelmann0a286ef2013-11-19 20:26:32 +01002659 if (ret < 0)
2660 goto err_stop;
2661 }
2662
Frank Praznikd902f472014-01-27 10:17:36 -05002663 if (sc->quirks & SONY_BATTERY_SUPPORT) {
Frank Praznik0f398232016-09-22 20:18:08 -04002664 ret = sony_battery_probe(sc, append_dev_id);
Frank Praznikd902f472014-01-27 10:17:36 -05002665 if (ret < 0)
2666 goto err_stop;
2667
2668 /* Open the device to receive reports with battery info */
2669 ret = hid_hw_open(hdev);
2670 if (ret < 0) {
2671 hid_err(hdev, "hw open failed\n");
2672 goto err_stop;
2673 }
2674 }
2675
Frank Praznikc8de9db2014-02-20 11:36:01 -05002676 if (sc->quirks & SONY_FF_SUPPORT) {
Frank Praznikfa57a812014-04-14 10:11:33 -04002677 ret = sony_init_ff(sc);
Frank Praznikc8de9db2014-02-20 11:36:01 -05002678 if (ret < 0)
2679 goto err_close;
Frank Praznik5f5750d2014-02-19 13:09:22 -05002680 }
Sven Eckelmanna08c22c2013-11-09 19:25:57 +01002681
Jiri Slabybd28ce02008-06-25 23:47:04 +02002682 return 0;
Frank Praznikd902f472014-01-27 10:17:36 -05002683err_close:
2684 hid_hw_close(hdev);
Jiri Slabybd28ce02008-06-25 23:47:04 +02002685err_stop:
Roderick Colenbrander786bd402017-03-24 15:17:49 -07002686 /* Piggy back on the default ds4_bt_ poll_interval to determine
2687 * if we need to remove the file as we don't know for sure if we
2688 * executed that logic.
2689 */
2690 if (sc->ds4_bt_poll_interval)
2691 device_remove_file(&sc->hdev->dev, &dev_attr_bt_poll_interval);
Sven Eckelmann0a286ef2013-11-19 20:26:32 +01002692 if (sc->quirks & SONY_LED_SUPPORT)
Frank Praznikfa57a812014-04-14 10:11:33 -04002693 sony_leds_remove(sc);
Frank Praznikd902f472014-01-27 10:17:36 -05002694 if (sc->quirks & SONY_BATTERY_SUPPORT)
2695 sony_battery_remove(sc);
Roderick Colenbrandere40b52f2017-02-24 16:14:15 -08002696 if (sc->touchpad)
2697 sony_unregister_touchpad(sc);
Roderick Colenbrander71120842017-03-24 15:17:50 -07002698 if (sc->sensor_dev)
2699 sony_unregister_sensors(sc);
Frank Praznik46262042014-04-14 10:11:31 -04002700 sony_cancel_work_sync(sc);
Frank Praznik9b2b5c92014-11-12 14:10:09 -05002701 kfree(sc->output_report_dmabuf);
Frank Praznikd2d782f2014-02-20 11:36:03 -05002702 sony_remove_dev_list(sc);
Frank Praznik80250872014-04-14 10:11:35 -04002703 sony_release_device_id(sc);
Jiri Slabybd28ce02008-06-25 23:47:04 +02002704 hid_hw_stop(hdev);
Jiri Slabybd28ce02008-06-25 23:47:04 +02002705 return ret;
2706}
2707
Roderick Colenbrander5a3ee242016-10-07 12:39:34 -07002708static int sony_probe(struct hid_device *hdev, const struct hid_device_id *id)
2709{
2710 int ret;
2711 unsigned long quirks = id->driver_data;
2712 struct sony_sc *sc;
2713 unsigned int connect_mask = HID_CONNECT_DEFAULT;
2714
2715 if (!strcmp(hdev->name, "FutureMax Dance Mat"))
2716 quirks |= FUTUREMAX_DANCE_MAT;
2717
2718 sc = devm_kzalloc(&hdev->dev, sizeof(*sc), GFP_KERNEL);
2719 if (sc == NULL) {
2720 hid_err(hdev, "can't alloc sony descriptor\n");
2721 return -ENOMEM;
2722 }
2723
2724 spin_lock_init(&sc->lock);
2725
2726 sc->quirks = quirks;
2727 hid_set_drvdata(hdev, sc);
2728 sc->hdev = hdev;
2729
2730 ret = hid_parse(hdev);
2731 if (ret) {
2732 hid_err(hdev, "parse failed\n");
2733 return ret;
2734 }
2735
2736 if (sc->quirks & VAIO_RDESC_CONSTANT)
2737 connect_mask |= HID_CONNECT_HIDDEV_FORCE;
2738 else if (sc->quirks & SIXAXIS_CONTROLLER)
2739 connect_mask |= HID_CONNECT_HIDDEV_FORCE;
2740
Roderick Colenbranderbe985302017-03-07 15:45:08 -08002741 /* Patch the hw version on DS3/4 compatible devices, so applications can
Roderick Colenbrander687aa022016-11-23 14:07:08 -08002742 * distinguish between the default HID mappings and the mappings defined
2743 * by the Linux game controller spec. This is important for the SDL2
2744 * library, which has a game controller database, which uses device ids
2745 * in combination with version as a key.
2746 */
Roderick Colenbranderbe985302017-03-07 15:45:08 -08002747 if (sc->quirks & (SIXAXIS_CONTROLLER | DUALSHOCK4_CONTROLLER))
Roderick Colenbrander687aa022016-11-23 14:07:08 -08002748 hdev->version |= 0x8000;
2749
Roderick Colenbrander5a3ee242016-10-07 12:39:34 -07002750 ret = hid_hw_start(hdev, connect_mask);
2751 if (ret) {
2752 hid_err(hdev, "hw start failed\n");
2753 return ret;
2754 }
2755
Roderick Colenbrandere7914622016-11-23 14:07:06 -08002756 /* sony_input_configured can fail, but this doesn't result
2757 * in hid_hw_start failures (intended). Check whether
2758 * the HID layer claimed the device else fail.
2759 * We don't know the actual reason for the failure, most
2760 * likely it is due to EEXIST in case of double connection
2761 * of USB and Bluetooth, but could have been due to ENOMEM
2762 * or other reasons as well.
2763 */
2764 if (!(hdev->claimed & HID_CLAIMED_INPUT)) {
2765 hid_err(hdev, "failed to claim input\n");
2766 return -ENODEV;
2767 }
2768
Roderick Colenbrander5a3ee242016-10-07 12:39:34 -07002769 return ret;
2770}
2771
Jiri Kosinacc6e0bb2008-10-23 12:58:38 +02002772static void sony_remove(struct hid_device *hdev)
2773{
Colin Leitnerf04d5142013-05-27 23:41:05 +02002774 struct sony_sc *sc = hid_get_drvdata(hdev);
2775
Roderick Colenbrander42027ee2016-11-23 14:07:07 -08002776 hid_hw_close(hdev);
2777
Sven Eckelmann0a286ef2013-11-19 20:26:32 +01002778 if (sc->quirks & SONY_LED_SUPPORT)
Frank Praznikfa57a812014-04-14 10:11:33 -04002779 sony_leds_remove(sc);
Colin Leitnerf04d5142013-05-27 23:41:05 +02002780
Roderick Colenbrander42027ee2016-11-23 14:07:07 -08002781 if (sc->quirks & SONY_BATTERY_SUPPORT)
Frank Praznikd902f472014-01-27 10:17:36 -05002782 sony_battery_remove(sc);
Roderick Colenbrander42027ee2016-11-23 14:07:07 -08002783
2784 if (sc->touchpad)
2785 sony_unregister_touchpad(sc);
Frank Praznikd902f472014-01-27 10:17:36 -05002786
Roderick Colenbrander6f561e92017-03-07 15:45:00 -08002787 if (sc->sensor_dev)
2788 sony_unregister_sensors(sc);
2789
Roderick Colenbrander786bd402017-03-24 15:17:49 -07002790 if (sc->quirks & DUALSHOCK4_CONTROLLER_BT)
2791 device_remove_file(&sc->hdev->dev, &dev_attr_bt_poll_interval);
2792
Frank Praznik46262042014-04-14 10:11:31 -04002793 sony_cancel_work_sync(sc);
Sven Eckelmann9f323b62013-11-17 20:38:21 +01002794
Frank Praznik9b2b5c92014-11-12 14:10:09 -05002795 kfree(sc->output_report_dmabuf);
2796
Frank Praznikd2d782f2014-02-20 11:36:03 -05002797 sony_remove_dev_list(sc);
Jiri Slabybd28ce02008-06-25 23:47:04 +02002798
Frank Praznik80250872014-04-14 10:11:35 -04002799 sony_release_device_id(sc);
2800
Jiri Slabybd28ce02008-06-25 23:47:04 +02002801 hid_hw_stop(hdev);
2802}
2803
Frank Praznikdecd9462015-11-11 09:49:38 -05002804#ifdef CONFIG_PM
2805
2806static int sony_suspend(struct hid_device *hdev, pm_message_t message)
2807{
Frank Praznike6061c12017-02-08 13:58:43 -05002808#ifdef CONFIG_SONY_FF
2809
2810 /* On suspend stop any running force-feedback events */
2811 if (SONY_FF_SUPPORT) {
Frank Praznikdecd9462015-11-11 09:49:38 -05002812 struct sony_sc *sc = hid_get_drvdata(hdev);
2813
Frank Praznikdecd9462015-11-11 09:49:38 -05002814 sc->left = sc->right = 0;
Frank Praznikdecd9462015-11-11 09:49:38 -05002815 sony_send_output_report(sc);
2816 }
2817
Frank Praznike6061c12017-02-08 13:58:43 -05002818#endif
Frank Praznikdecd9462015-11-11 09:49:38 -05002819 return 0;
2820}
2821
2822static int sony_resume(struct hid_device *hdev)
2823{
Frank Praznike6061c12017-02-08 13:58:43 -05002824 struct sony_sc *sc = hid_get_drvdata(hdev);
Frank Praznikdecd9462015-11-11 09:49:38 -05002825
Frank Praznike6061c12017-02-08 13:58:43 -05002826 /*
2827 * The Sixaxis and navigation controllers on USB need to be
2828 * reinitialized on resume or they won't behave properly.
2829 */
2830 if ((sc->quirks & SIXAXIS_CONTROLLER_USB) ||
2831 (sc->quirks & NAVIGATION_CONTROLLER_USB)) {
2832 sixaxis_set_operational_usb(sc->hdev);
2833 sc->defer_initialization = 1;
Frank Praznikdecd9462015-11-11 09:49:38 -05002834 }
2835
2836 return 0;
2837}
2838
2839#endif
2840
Jiri Slabybd28ce02008-06-25 23:47:04 +02002841static const struct hid_device_id sony_devices[] = {
2842 { HID_USB_DEVICE(USB_VENDOR_ID_SONY, USB_DEVICE_ID_SONY_PS3_CONTROLLER),
2843 .driver_data = SIXAXIS_CONTROLLER_USB },
2844 { HID_USB_DEVICE(USB_VENDOR_ID_SONY, USB_DEVICE_ID_SONY_NAVIGATION_CONTROLLER),
Simon Wood4545ee02015-06-17 00:08:52 -06002845 .driver_data = NAVIGATION_CONTROLLER_USB },
Simon Wood6eabaaa2015-06-17 00:08:51 -06002846 { HID_BLUETOOTH_DEVICE(USB_VENDOR_ID_SONY, USB_DEVICE_ID_SONY_NAVIGATION_CONTROLLER),
Simon Wood4545ee02015-06-17 00:08:52 -06002847 .driver_data = NAVIGATION_CONTROLLER_BT },
Frank Praznikc5e0c1c2015-05-05 20:47:30 -04002848 { HID_USB_DEVICE(USB_VENDOR_ID_SONY, USB_DEVICE_ID_SONY_MOTION_CONTROLLER),
Simon Woodb3bca322015-06-09 21:27:04 -06002849 .driver_data = MOTION_CONTROLLER_USB },
Simon Wooda4afa852015-06-03 09:45:19 -06002850 { HID_BLUETOOTH_DEVICE(USB_VENDOR_ID_SONY, USB_DEVICE_ID_SONY_MOTION_CONTROLLER),
Simon Woodb3bca322015-06-09 21:27:04 -06002851 .driver_data = MOTION_CONTROLLER_BT },
Jiri Slabybd28ce02008-06-25 23:47:04 +02002852 { HID_BLUETOOTH_DEVICE(USB_VENDOR_ID_SONY, USB_DEVICE_ID_SONY_PS3_CONTROLLER),
2853 .driver_data = SIXAXIS_CONTROLLER_BT },
2854 { HID_USB_DEVICE(USB_VENDOR_ID_SONY, USB_DEVICE_ID_SONY_VAIO_VGX_MOUSE),
2855 .driver_data = VAIO_RDESC_CONSTANT },
2856 { HID_USB_DEVICE(USB_VENDOR_ID_SONY, USB_DEVICE_ID_SONY_VAIO_VGP_MOUSE),
2857 .driver_data = VAIO_RDESC_CONSTANT },
Antonio Ospiteef916ef2016-02-09 13:55:07 +01002858 /*
2859 * Wired Buzz Controller. Reported as Sony Hub from its USB ID and as
2860 * Logitech joystick from the device descriptor.
2861 */
Jiri Slabybd28ce02008-06-25 23:47:04 +02002862 { HID_USB_DEVICE(USB_VENDOR_ID_SONY, USB_DEVICE_ID_SONY_BUZZ_CONTROLLER),
2863 .driver_data = BUZZ_CONTROLLER },
2864 { HID_USB_DEVICE(USB_VENDOR_ID_SONY, USB_DEVICE_ID_SONY_WIRELESS_BUZZ_CONTROLLER),
2865 .driver_data = BUZZ_CONTROLLER },
2866 /* PS3 BD Remote Control */
2867 { HID_BLUETOOTH_DEVICE(USB_VENDOR_ID_SONY, USB_DEVICE_ID_SONY_PS3_BDREMOTE),
2868 .driver_data = PS3REMOTE },
2869 /* Logitech Harmony Adapter for PS3 */
2870 { HID_BLUETOOTH_DEVICE(USB_VENDOR_ID_LOGITECH, USB_DEVICE_ID_LOGITECH_HARMONY_PS3),
2871 .driver_data = PS3REMOTE },
Frank Praznik68a49e52014-11-12 14:52:28 -05002872 /* SMK-Link PS3 BD Remote Control */
2873 { HID_BLUETOOTH_DEVICE(USB_VENDOR_ID_SMK, USB_DEVICE_ID_SMK_PS3_BDREMOTE),
2874 .driver_data = PS3REMOTE },
Frank Praznik0bd88dd2014-01-11 15:12:42 -05002875 /* Sony Dualshock 4 controllers for PS4 */
2876 { HID_USB_DEVICE(USB_VENDOR_ID_SONY, USB_DEVICE_ID_SONY_PS4_CONTROLLER),
Frank Praznik8ab16762014-01-16 21:42:31 -05002877 .driver_data = DUALSHOCK4_CONTROLLER_USB },
Frank Praznik0bd88dd2014-01-11 15:12:42 -05002878 { HID_BLUETOOTH_DEVICE(USB_VENDOR_ID_SONY, USB_DEVICE_ID_SONY_PS4_CONTROLLER),
Frank Praznik8ab16762014-01-16 21:42:31 -05002879 .driver_data = DUALSHOCK4_CONTROLLER_BT },
Roderick Colenbranderf5ff43c2016-10-07 12:39:40 -07002880 { HID_USB_DEVICE(USB_VENDOR_ID_SONY, USB_DEVICE_ID_SONY_PS4_CONTROLLER_2),
2881 .driver_data = DUALSHOCK4_CONTROLLER_USB },
2882 { HID_BLUETOOTH_DEVICE(USB_VENDOR_ID_SONY, USB_DEVICE_ID_SONY_PS4_CONTROLLER_2),
2883 .driver_data = DUALSHOCK4_CONTROLLER_BT },
Roderick Colenbrander72386b22016-11-23 14:07:11 -08002884 { HID_USB_DEVICE(USB_VENDOR_ID_SONY, USB_DEVICE_ID_SONY_PS4_CONTROLLER_DONGLE),
Roderick Colenbrander8f1d4702017-03-07 15:45:04 -08002885 .driver_data = DUALSHOCK4_DONGLE },
Scott Moreau74500cc2016-01-13 07:40:42 -07002886 /* Nyko Core Controller for PS3 */
2887 { HID_USB_DEVICE(USB_VENDOR_ID_SINO_LITE, USB_DEVICE_ID_SINO_LITE_CONTROLLER),
2888 .driver_data = SIXAXIS_CONTROLLER_USB | SINO_LITE_CONTROLLER },
Jiri Slabybd28ce02008-06-25 23:47:04 +02002889 { }
2890};
2891MODULE_DEVICE_TABLE(hid, sony_devices);
2892
2893static struct hid_driver sony_driver = {
Frank Praznikce8efc32014-09-18 21:15:01 -04002894 .name = "sony",
2895 .id_table = sony_devices,
2896 .input_mapping = sony_mapping,
2897 .input_configured = sony_input_configured,
2898 .probe = sony_probe,
2899 .remove = sony_remove,
2900 .report_fixup = sony_report_fixup,
Frank Praznikdecd9462015-11-11 09:49:38 -05002901 .raw_event = sony_raw_event,
2902
2903#ifdef CONFIG_PM
2904 .suspend = sony_suspend,
2905 .resume = sony_resume,
2906 .reset_resume = sony_resume,
2907#endif
Jiri Slabybd28ce02008-06-25 23:47:04 +02002908};
Frank Praznik80250872014-04-14 10:11:35 -04002909
2910static int __init sony_init(void)
2911{
2912 dbg_hid("Sony:%s\n", __func__);
2913
2914 return hid_register_driver(&sony_driver);
2915}
2916
2917static void __exit sony_exit(void)
2918{
2919 dbg_hid("Sony:%s\n", __func__);
2920
Frank Praznik80250872014-04-14 10:11:35 -04002921 hid_unregister_driver(&sony_driver);
Antonio Ospite6c400652015-02-16 22:58:24 +01002922 ida_destroy(&sony_device_id_allocator);
Frank Praznik80250872014-04-14 10:11:35 -04002923}
2924module_init(sony_init);
2925module_exit(sony_exit);
Jiri Slabybd28ce02008-06-25 23:47:04 +02002926
2927MODULE_LICENSE("GPL");