blob: b3722c51ec78a0ac733b06c1aa8782c0ad5d7c34 [file] [log] [blame]
Thomas Gleixner2874c5f2019-05-27 08:55:01 +02001// SPDX-License-Identifier: GPL-2.0-or-later
Jiri Slabybd28ce02008-06-25 23:47:04 +02002/*
Frank Praznik077147a2014-09-14 11:56:39 -04003 * HID driver for Sony / PS2 / PS3 / PS4 BD devices.
Jiri Slabybd28ce02008-06-25 23:47:04 +02004 *
5 * Copyright (c) 1999 Andreas Gal
6 * Copyright (c) 2000-2005 Vojtech Pavlik <vojtech@suse.cz>
7 * Copyright (c) 2005 Michael Haboustak <mike-@cinci.rr.com> for Concept2, Inc
Jiri Slabybd28ce02008-06-25 23:47:04 +02008 * Copyright (c) 2008 Jiri Slaby
Jiri Kosina078328d2013-06-13 12:03:49 +02009 * Copyright (c) 2012 David Dillow <dave@thedillows.org>
10 * Copyright (c) 2006-2013 Jiri Kosina
Colin Leitnerf04d5142013-05-27 23:41:05 +020011 * Copyright (c) 2013 Colin Leitner <colin.leitner@gmail.com>
Frank Praznikc4425c82016-09-22 20:18:10 -040012 * Copyright (c) 2014-2016 Frank Praznik <frank.praznik@gmail.com>
Todd Kelnerb7289cb2018-02-17 16:47:10 -070013 * Copyright (c) 2018 Todd Kelner
Pascal Giardcc894ac2020-11-25 22:02:30 -050014 * Copyright (c) 2020 Pascal Giard <pascal.giard@etsmtl.ca>
Sanjay Govind32e411d2020-12-04 18:45:27 +130015 * Copyright (c) 2020 Sanjay Govind <sanjay.govind9@gmail.com>
Jiri Slabybd28ce02008-06-25 23:47:04 +020016 */
17
18/*
Jiri Slabybd28ce02008-06-25 23:47:04 +020019 */
20
Frank Praznikad142b92014-02-20 11:36:00 -050021/*
22 * NOTE: in order for the Sony PS3 BD Remote Control to be found by
Jiri Kosina078328d2013-06-13 12:03:49 +020023 * a Bluetooth host, the key combination Start+Enter has to be kept pressed
24 * for about 7 seconds with the Bluetooth Host Controller in discovering mode.
25 *
26 * There will be no PIN request from the device.
27 */
28
Jiri Slabybd28ce02008-06-25 23:47:04 +020029#include <linux/device.h>
30#include <linux/hid.h>
31#include <linux/module.h>
Tejun Heo5a0e3ad2010-03-24 17:04:11 +090032#include <linux/slab.h>
Jiri Kosina40e32ee2013-05-28 11:22:09 +020033#include <linux/leds.h>
Frank Praznikd902f472014-01-27 10:17:36 -050034#include <linux/power_supply.h>
35#include <linux/spinlock.h>
Frank Praznikd2d782f2014-02-20 11:36:03 -050036#include <linux/list.h>
Frank Praznik80250872014-04-14 10:11:35 -040037#include <linux/idr.h>
Frank Praznike5606232014-01-27 10:17:37 -050038#include <linux/input/mt.h>
Roderick Colenbrander49b9ca62016-10-07 12:39:36 -070039#include <linux/crc32.h>
Pascal Giardcc894ac2020-11-25 22:02:30 -050040#include <linux/usb.h>
41#include <linux/timer.h>
Roderick Colenbrander49b9ca62016-10-07 12:39:36 -070042#include <asm/unaligned.h>
Jiri Slabybd28ce02008-06-25 23:47:04 +020043
44#include "hid-ids.h"
45
Frank Praznik6c79c182014-01-16 21:43:03 -050046#define VAIO_RDESC_CONSTANT BIT(0)
47#define SIXAXIS_CONTROLLER_USB BIT(1)
48#define SIXAXIS_CONTROLLER_BT BIT(2)
49#define BUZZ_CONTROLLER BIT(3)
50#define PS3REMOTE BIT(4)
Frank Praznik8ab16762014-01-16 21:42:31 -050051#define DUALSHOCK4_CONTROLLER_USB BIT(5)
52#define DUALSHOCK4_CONTROLLER_BT BIT(6)
Roderick Colenbrander35f436c2017-03-07 15:45:04 -080053#define DUALSHOCK4_DONGLE BIT(7)
54#define MOTION_CONTROLLER_USB BIT(8)
55#define MOTION_CONTROLLER_BT BIT(9)
56#define NAVIGATION_CONTROLLER_USB BIT(10)
57#define NAVIGATION_CONTROLLER_BT BIT(11)
58#define SINO_LITE_CONTROLLER BIT(12)
59#define FUTUREMAX_DANCE_MAT BIT(13)
Todd Kelnerb7289cb2018-02-17 16:47:10 -070060#define NSG_MR5U_REMOTE_BT BIT(14)
61#define NSG_MR7U_REMOTE_BT BIT(15)
Hongye Yuan69481052019-01-09 09:18:08 +080062#define SHANWAN_GAMEPAD BIT(16)
Sanjay Govind32e411d2020-12-04 18:45:27 +130063#define GH_GUITAR_CONTROLLER BIT(17)
64#define GHL_GUITAR_PS3WIIU BIT(18)
Jiri Kosinacc6e0bb2008-10-23 12:58:38 +020065
Frank Praznikfee4e2d2014-02-18 17:22:01 -050066#define SIXAXIS_CONTROLLER (SIXAXIS_CONTROLLER_USB | SIXAXIS_CONTROLLER_BT)
Simon Woodb3bca322015-06-09 21:27:04 -060067#define MOTION_CONTROLLER (MOTION_CONTROLLER_USB | MOTION_CONTROLLER_BT)
Simon Wood4545ee02015-06-17 00:08:52 -060068#define NAVIGATION_CONTROLLER (NAVIGATION_CONTROLLER_USB |\
69 NAVIGATION_CONTROLLER_BT)
Frank Praznik68330d82014-02-05 20:03:49 -050070#define DUALSHOCK4_CONTROLLER (DUALSHOCK4_CONTROLLER_USB |\
Roderick Colenbrander35f436c2017-03-07 15:45:04 -080071 DUALSHOCK4_CONTROLLER_BT | \
72 DUALSHOCK4_DONGLE)
Frank Praznikfee4e2d2014-02-18 17:22:01 -050073#define SONY_LED_SUPPORT (SIXAXIS_CONTROLLER | BUZZ_CONTROLLER |\
Simon Wood4545ee02015-06-17 00:08:52 -060074 DUALSHOCK4_CONTROLLER | MOTION_CONTROLLER |\
75 NAVIGATION_CONTROLLER)
Simon Wood12e9a6d72015-06-09 21:27:05 -060076#define SONY_BATTERY_SUPPORT (SIXAXIS_CONTROLLER | DUALSHOCK4_CONTROLLER |\
Simon Wood4545ee02015-06-17 00:08:52 -060077 MOTION_CONTROLLER_BT | NAVIGATION_CONTROLLER)
Frank Praznikc5e0c1c2015-05-05 20:47:30 -040078#define SONY_FF_SUPPORT (SIXAXIS_CONTROLLER | DUALSHOCK4_CONTROLLER |\
79 MOTION_CONTROLLER)
Frank Praznik0f398232016-09-22 20:18:08 -040080#define SONY_BT_DEVICE (SIXAXIS_CONTROLLER_BT | DUALSHOCK4_CONTROLLER_BT |\
81 MOTION_CONTROLLER_BT | NAVIGATION_CONTROLLER_BT)
Todd Kelnerb7289cb2018-02-17 16:47:10 -070082#define NSG_MRXU_REMOTE (NSG_MR5U_REMOTE_BT | NSG_MR7U_REMOTE_BT)
Frank Praznik60781cf2014-01-11 15:13:15 -050083
84#define MAX_LEDS 4
Todd Kelnerb7289cb2018-02-17 16:47:10 -070085#define NSG_MRXU_MAX_X 1667
86#define NSG_MRXU_MAX_Y 1868
Sven Eckelmann0a286ef2013-11-19 20:26:32 +010087
Pascal Giardcc894ac2020-11-25 22:02:30 -050088#define GHL_GUITAR_POKE_INTERVAL 10 /* In seconds */
Sanjay Govind32e411d2020-12-04 18:45:27 +130089#define GUITAR_TILT_USAGE 44
Pascal Giardcc894ac2020-11-25 22:02:30 -050090
91/* Magic value and data taken from GHLtarUtility:
92 * https://github.com/ghlre/GHLtarUtility/blob/master/PS3Guitar.cs
93 * Note: The Wii U and PS3 dongles happen to share the same!
94 */
95static const u16 ghl_ps3wiiu_magic_value = 0x201;
96static const char ghl_ps3wiiu_magic_data[] = {
97 0x02, 0x08, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00
98};
Mauro Carvalho Chehabe57a67d2012-12-14 20:57:34 -020099
Frank Praznikc5e0c1c2015-05-05 20:47:30 -0400100/* PS/3 Motion controller */
Pavel Machek1adf9042016-02-09 13:55:08 +0100101static u8 motion_rdesc[] = {
Frank Praznikc5e0c1c2015-05-05 20:47:30 -0400102 0x05, 0x01, /* Usage Page (Desktop), */
103 0x09, 0x04, /* Usage (Joystick), */
104 0xA1, 0x01, /* Collection (Application), */
105 0xA1, 0x02, /* Collection (Logical), */
106 0x85, 0x01, /* Report ID (1), */
Frank Praznikc5e0c1c2015-05-05 20:47:30 -0400107 0x75, 0x01, /* Report Size (1), */
Simon Wood8b2513c2015-06-09 21:27:07 -0600108 0x95, 0x15, /* Report Count (21), */
Frank Praznikc5e0c1c2015-05-05 20:47:30 -0400109 0x15, 0x00, /* Logical Minimum (0), */
110 0x25, 0x01, /* Logical Maximum (1), */
111 0x35, 0x00, /* Physical Minimum (0), */
112 0x45, 0x01, /* Physical Maximum (1), */
113 0x05, 0x09, /* Usage Page (Button), */
114 0x19, 0x01, /* Usage Minimum (01h), */
Simon Wood8b2513c2015-06-09 21:27:07 -0600115 0x29, 0x15, /* Usage Maximum (15h), */
116 0x81, 0x02, /* Input (Variable), * Buttons */
117 0x95, 0x0B, /* Report Count (11), */
Frank Praznikc5e0c1c2015-05-05 20:47:30 -0400118 0x06, 0x00, 0xFF, /* Usage Page (FF00h), */
Simon Wood8b2513c2015-06-09 21:27:07 -0600119 0x81, 0x03, /* Input (Constant, Variable), * Padding */
Frank Praznikc5e0c1c2015-05-05 20:47:30 -0400120 0x15, 0x00, /* Logical Minimum (0), */
121 0x26, 0xFF, 0x00, /* Logical Maximum (255), */
122 0x05, 0x01, /* Usage Page (Desktop), */
Frank Praznikc5e0c1c2015-05-05 20:47:30 -0400123 0xA1, 0x00, /* Collection (Physical), */
124 0x75, 0x08, /* Report Size (8), */
Simon Wood8b2513c2015-06-09 21:27:07 -0600125 0x95, 0x01, /* Report Count (1), */
Frank Praznikc5e0c1c2015-05-05 20:47:30 -0400126 0x35, 0x00, /* Physical Minimum (0), */
127 0x46, 0xFF, 0x00, /* Physical Maximum (255), */
128 0x09, 0x30, /* Usage (X), */
Simon Wood8b2513c2015-06-09 21:27:07 -0600129 0x81, 0x02, /* Input (Variable), * Trigger */
Frank Praznikc5e0c1c2015-05-05 20:47:30 -0400130 0xC0, /* End Collection, */
Simon Wood8b2513c2015-06-09 21:27:07 -0600131 0x06, 0x00, 0xFF, /* Usage Page (FF00h), */
132 0x75, 0x08, /* Report Size (8), */
133 0x95, 0x07, /* Report Count (7), * skip 7 bytes */
134 0x81, 0x02, /* Input (Variable), */
Frank Praznikc5e0c1c2015-05-05 20:47:30 -0400135 0x05, 0x01, /* Usage Page (Desktop), */
Frank Praznikc5e0c1c2015-05-05 20:47:30 -0400136 0x75, 0x10, /* Report Size (16), */
Simon Wood8b2513c2015-06-09 21:27:07 -0600137 0x46, 0xFF, 0xFF, /* Physical Maximum (65535), */
138 0x27, 0xFF, 0xFF, 0x00, 0x00, /* Logical Maximum (65535), */
139 0x95, 0x03, /* Report Count (3), * 3x Accels */
140 0x09, 0x33, /* Usage (rX), */
141 0x09, 0x34, /* Usage (rY), */
142 0x09, 0x35, /* Usage (rZ), */
Frank Praznikc5e0c1c2015-05-05 20:47:30 -0400143 0x81, 0x02, /* Input (Variable), */
Simon Wood8b2513c2015-06-09 21:27:07 -0600144 0x06, 0x00, 0xFF, /* Usage Page (FF00h), */
145 0x95, 0x03, /* Report Count (3), * Skip Accels 2nd frame */
146 0x81, 0x02, /* Input (Variable), */
147 0x05, 0x01, /* Usage Page (Desktop), */
148 0x09, 0x01, /* Usage (Pointer), */
149 0x95, 0x03, /* Report Count (3), * 3x Gyros */
150 0x81, 0x02, /* Input (Variable), */
151 0x06, 0x00, 0xFF, /* Usage Page (FF00h), */
152 0x95, 0x03, /* Report Count (3), * Skip Gyros 2nd frame */
153 0x81, 0x02, /* Input (Variable), */
154 0x75, 0x0C, /* Report Size (12), */
155 0x46, 0xFF, 0x0F, /* Physical Maximum (4095), */
156 0x26, 0xFF, 0x0F, /* Logical Maximum (4095), */
157 0x95, 0x04, /* Report Count (4), * Skip Temp and Magnetometers */
158 0x81, 0x02, /* Input (Variable), */
159 0x75, 0x08, /* Report Size (8), */
160 0x46, 0xFF, 0x00, /* Physical Maximum (255), */
161 0x26, 0xFF, 0x00, /* Logical Maximum (255), */
162 0x95, 0x06, /* Report Count (6), * Skip Timestamp and Extension Bytes */
163 0x81, 0x02, /* Input (Variable), */
164 0x75, 0x08, /* Report Size (8), */
165 0x95, 0x30, /* Report Count (48), */
166 0x09, 0x01, /* Usage (Pointer), */
167 0x91, 0x02, /* Output (Variable), */
168 0x75, 0x08, /* Report Size (8), */
169 0x95, 0x30, /* Report Count (48), */
170 0x09, 0x01, /* Usage (Pointer), */
171 0xB1, 0x02, /* Feature (Variable), */
Frank Praznikc5e0c1c2015-05-05 20:47:30 -0400172 0xC0, /* End Collection, */
173 0xA1, 0x02, /* Collection (Logical), */
174 0x85, 0x02, /* Report ID (2), */
175 0x75, 0x08, /* Report Size (8), */
176 0x95, 0x30, /* Report Count (48), */
177 0x09, 0x01, /* Usage (Pointer), */
178 0xB1, 0x02, /* Feature (Variable), */
179 0xC0, /* End Collection, */
180 0xA1, 0x02, /* Collection (Logical), */
181 0x85, 0xEE, /* Report ID (238), */
182 0x75, 0x08, /* Report Size (8), */
183 0x95, 0x30, /* Report Count (48), */
184 0x09, 0x01, /* Usage (Pointer), */
185 0xB1, 0x02, /* Feature (Variable), */
186 0xC0, /* End Collection, */
187 0xA1, 0x02, /* Collection (Logical), */
188 0x85, 0xEF, /* Report ID (239), */
189 0x75, 0x08, /* Report Size (8), */
190 0x95, 0x30, /* Report Count (48), */
191 0x09, 0x01, /* Usage (Pointer), */
192 0xB1, 0x02, /* Feature (Variable), */
193 0xC0, /* End Collection, */
194 0xC0 /* End Collection */
195};
196
Pavel Machek1adf9042016-02-09 13:55:08 +0100197static u8 ps3remote_rdesc[] = {
Jiri Kosina078328d2013-06-13 12:03:49 +0200198 0x05, 0x01, /* GUsagePage Generic Desktop */
199 0x09, 0x05, /* LUsage 0x05 [Game Pad] */
200 0xA1, 0x01, /* MCollection Application (mouse, keyboard) */
201
202 /* Use collection 1 for joypad buttons */
203 0xA1, 0x02, /* MCollection Logical (interrelated data) */
204
Antonio Ospiteef916ef2016-02-09 13:55:07 +0100205 /*
206 * Ignore the 1st byte, maybe it is used for a controller
207 * number but it's not needed for correct operation
208 */
Jiri Kosina078328d2013-06-13 12:03:49 +0200209 0x75, 0x08, /* GReportSize 0x08 [8] */
210 0x95, 0x01, /* GReportCount 0x01 [1] */
211 0x81, 0x01, /* MInput 0x01 (Const[0] Arr[1] Abs[2]) */
212
Antonio Ospiteef916ef2016-02-09 13:55:07 +0100213 /*
214 * Bytes from 2nd to 4th are a bitmap for joypad buttons, for these
215 * buttons multiple keypresses are allowed
216 */
Jiri Kosina078328d2013-06-13 12:03:49 +0200217 0x05, 0x09, /* GUsagePage Button */
218 0x19, 0x01, /* LUsageMinimum 0x01 [Button 1 (primary/trigger)] */
219 0x29, 0x18, /* LUsageMaximum 0x18 [Button 24] */
220 0x14, /* GLogicalMinimum [0] */
221 0x25, 0x01, /* GLogicalMaximum 0x01 [1] */
222 0x75, 0x01, /* GReportSize 0x01 [1] */
223 0x95, 0x18, /* GReportCount 0x18 [24] */
224 0x81, 0x02, /* MInput 0x02 (Data[0] Var[1] Abs[2]) */
225
226 0xC0, /* MEndCollection */
227
228 /* Use collection 2 for remote control buttons */
229 0xA1, 0x02, /* MCollection Logical (interrelated data) */
230
231 /* 5th byte is used for remote control buttons */
232 0x05, 0x09, /* GUsagePage Button */
233 0x18, /* LUsageMinimum [No button pressed] */
234 0x29, 0xFE, /* LUsageMaximum 0xFE [Button 254] */
235 0x14, /* GLogicalMinimum [0] */
236 0x26, 0xFE, 0x00, /* GLogicalMaximum 0x00FE [254] */
237 0x75, 0x08, /* GReportSize 0x08 [8] */
238 0x95, 0x01, /* GReportCount 0x01 [1] */
239 0x80, /* MInput */
240
Antonio Ospiteef916ef2016-02-09 13:55:07 +0100241 /*
242 * Ignore bytes from 6th to 11th, 6th to 10th are always constant at
243 * 0xff and 11th is for press indication
244 */
Jiri Kosina078328d2013-06-13 12:03:49 +0200245 0x75, 0x08, /* GReportSize 0x08 [8] */
246 0x95, 0x06, /* GReportCount 0x06 [6] */
247 0x81, 0x01, /* MInput 0x01 (Const[0] Arr[1] Abs[2]) */
248
249 /* 12th byte is for battery strength */
250 0x05, 0x06, /* GUsagePage Generic Device Controls */
251 0x09, 0x20, /* LUsage 0x20 [Battery Strength] */
252 0x14, /* GLogicalMinimum [0] */
253 0x25, 0x05, /* GLogicalMaximum 0x05 [5] */
254 0x75, 0x08, /* GReportSize 0x08 [8] */
255 0x95, 0x01, /* GReportCount 0x01 [1] */
256 0x81, 0x02, /* MInput 0x02 (Data[0] Var[1] Abs[2]) */
257
258 0xC0, /* MEndCollection */
259
260 0xC0 /* MEndCollection [Game Pad] */
261};
262
263static const unsigned int ps3remote_keymap_joypad_buttons[] = {
264 [0x01] = KEY_SELECT,
265 [0x02] = BTN_THUMBL, /* L3 */
266 [0x03] = BTN_THUMBR, /* R3 */
267 [0x04] = BTN_START,
268 [0x05] = KEY_UP,
269 [0x06] = KEY_RIGHT,
270 [0x07] = KEY_DOWN,
271 [0x08] = KEY_LEFT,
272 [0x09] = BTN_TL2, /* L2 */
273 [0x0a] = BTN_TR2, /* R2 */
274 [0x0b] = BTN_TL, /* L1 */
275 [0x0c] = BTN_TR, /* R1 */
276 [0x0d] = KEY_OPTION, /* options/triangle */
277 [0x0e] = KEY_BACK, /* back/circle */
278 [0x0f] = BTN_0, /* cross */
279 [0x10] = KEY_SCREEN, /* view/square */
280 [0x11] = KEY_HOMEPAGE, /* PS button */
281 [0x14] = KEY_ENTER,
282};
283static const unsigned int ps3remote_keymap_remote_buttons[] = {
284 [0x00] = KEY_1,
285 [0x01] = KEY_2,
286 [0x02] = KEY_3,
287 [0x03] = KEY_4,
288 [0x04] = KEY_5,
289 [0x05] = KEY_6,
290 [0x06] = KEY_7,
291 [0x07] = KEY_8,
292 [0x08] = KEY_9,
293 [0x09] = KEY_0,
294 [0x0e] = KEY_ESC, /* return */
295 [0x0f] = KEY_CLEAR,
296 [0x16] = KEY_EJECTCD,
297 [0x1a] = KEY_MENU, /* top menu */
298 [0x28] = KEY_TIME,
299 [0x30] = KEY_PREVIOUS,
300 [0x31] = KEY_NEXT,
301 [0x32] = KEY_PLAY,
302 [0x33] = KEY_REWIND, /* scan back */
303 [0x34] = KEY_FORWARD, /* scan forward */
304 [0x38] = KEY_STOP,
305 [0x39] = KEY_PAUSE,
306 [0x40] = KEY_CONTEXT_MENU, /* pop up/menu */
307 [0x60] = KEY_FRAMEBACK, /* slow/step back */
308 [0x61] = KEY_FRAMEFORWARD, /* slow/step forward */
309 [0x63] = KEY_SUBTITLE,
310 [0x64] = KEY_AUDIO,
311 [0x65] = KEY_ANGLE,
312 [0x70] = KEY_INFO, /* display */
313 [0x80] = KEY_BLUE,
314 [0x81] = KEY_RED,
315 [0x82] = KEY_GREEN,
316 [0x83] = KEY_YELLOW,
317};
318
Colin Leitnerf04d5142013-05-27 23:41:05 +0200319static const unsigned int buzz_keymap[] = {
Frank Praznikad142b92014-02-20 11:36:00 -0500320 /*
321 * The controller has 4 remote buzzers, each with one LED and 5
Colin Leitnerf04d5142013-05-27 23:41:05 +0200322 * buttons.
Antonio Ospite09593e32016-02-09 13:55:06 +0100323 *
Colin Leitnerf04d5142013-05-27 23:41:05 +0200324 * We use the mapping chosen by the controller, which is:
325 *
326 * Key Offset
327 * -------------------
328 * Buzz 1
329 * Blue 5
330 * Orange 4
331 * Green 3
332 * Yellow 2
333 *
334 * So, for example, the orange button on the third buzzer is mapped to
335 * BTN_TRIGGER_HAPPY14
336 */
Antonio Ospite09593e32016-02-09 13:55:06 +0100337 [1] = BTN_TRIGGER_HAPPY1,
338 [2] = BTN_TRIGGER_HAPPY2,
339 [3] = BTN_TRIGGER_HAPPY3,
340 [4] = BTN_TRIGGER_HAPPY4,
341 [5] = BTN_TRIGGER_HAPPY5,
342 [6] = BTN_TRIGGER_HAPPY6,
343 [7] = BTN_TRIGGER_HAPPY7,
344 [8] = BTN_TRIGGER_HAPPY8,
345 [9] = BTN_TRIGGER_HAPPY9,
Colin Leitnerf04d5142013-05-27 23:41:05 +0200346 [10] = BTN_TRIGGER_HAPPY10,
347 [11] = BTN_TRIGGER_HAPPY11,
348 [12] = BTN_TRIGGER_HAPPY12,
349 [13] = BTN_TRIGGER_HAPPY13,
350 [14] = BTN_TRIGGER_HAPPY14,
351 [15] = BTN_TRIGGER_HAPPY15,
352 [16] = BTN_TRIGGER_HAPPY16,
353 [17] = BTN_TRIGGER_HAPPY17,
354 [18] = BTN_TRIGGER_HAPPY18,
355 [19] = BTN_TRIGGER_HAPPY19,
356 [20] = BTN_TRIGGER_HAPPY20,
357};
358
Roderick Colenbranderb8f09702017-03-24 15:17:46 -0700359/* The Navigation controller is a partial DS3 and uses the same HID report
360 * and hence the same keymap indices, however not not all axes/buttons
361 * are physically present. We use the same axis and button mapping as
362 * the DS3, which uses the Linux gamepad spec.
363 */
364static const unsigned int navigation_absmap[] = {
365 [0x30] = ABS_X,
366 [0x31] = ABS_Y,
367 [0x33] = ABS_Z, /* L2 */
368};
369
370/* Buttons not physically available on the device, but still available
371 * in the reports are explicitly set to 0 for documentation purposes.
372 */
373static const unsigned int navigation_keymap[] = {
374 [0x01] = 0, /* Select */
375 [0x02] = BTN_THUMBL, /* L3 */
376 [0x03] = 0, /* R3 */
377 [0x04] = 0, /* Start */
378 [0x05] = BTN_DPAD_UP, /* Up */
379 [0x06] = BTN_DPAD_RIGHT, /* Right */
380 [0x07] = BTN_DPAD_DOWN, /* Down */
381 [0x08] = BTN_DPAD_LEFT, /* Left */
382 [0x09] = BTN_TL2, /* L2 */
383 [0x0a] = 0, /* R2 */
384 [0x0b] = BTN_TL, /* L1 */
385 [0x0c] = 0, /* R1 */
386 [0x0d] = BTN_NORTH, /* Triangle */
387 [0x0e] = BTN_EAST, /* Circle */
388 [0x0f] = BTN_SOUTH, /* Cross */
389 [0x10] = BTN_WEST, /* Square */
390 [0x11] = BTN_MODE, /* PS */
391};
392
Roderick Colenbrandere19a2672017-03-07 15:45:08 -0800393static const unsigned int sixaxis_absmap[] = {
394 [0x30] = ABS_X,
395 [0x31] = ABS_Y,
396 [0x32] = ABS_RX, /* right stick X */
397 [0x35] = ABS_RY, /* right stick Y */
398};
399
400static const unsigned int sixaxis_keymap[] = {
401 [0x01] = BTN_SELECT, /* Select */
402 [0x02] = BTN_THUMBL, /* L3 */
403 [0x03] = BTN_THUMBR, /* R3 */
404 [0x04] = BTN_START, /* Start */
405 [0x05] = BTN_DPAD_UP, /* Up */
406 [0x06] = BTN_DPAD_RIGHT, /* Right */
407 [0x07] = BTN_DPAD_DOWN, /* Down */
408 [0x08] = BTN_DPAD_LEFT, /* Left */
409 [0x09] = BTN_TL2, /* L2 */
410 [0x0a] = BTN_TR2, /* R2 */
411 [0x0b] = BTN_TL, /* L1 */
412 [0x0c] = BTN_TR, /* R1 */
413 [0x0d] = BTN_NORTH, /* Triangle */
414 [0x0e] = BTN_EAST, /* Circle */
415 [0x0f] = BTN_SOUTH, /* Cross */
416 [0x10] = BTN_WEST, /* Square */
417 [0x11] = BTN_MODE, /* PS */
418};
419
Roderick Colenbrander9131f8c2016-11-23 14:07:08 -0800420static const unsigned int ds4_absmap[] = {
421 [0x30] = ABS_X,
422 [0x31] = ABS_Y,
423 [0x32] = ABS_RX, /* right stick X */
424 [0x33] = ABS_Z, /* L2 */
425 [0x34] = ABS_RZ, /* R2 */
426 [0x35] = ABS_RY, /* right stick Y */
427};
428
429static const unsigned int ds4_keymap[] = {
430 [0x1] = BTN_WEST, /* Square */
431 [0x2] = BTN_SOUTH, /* Cross */
432 [0x3] = BTN_EAST, /* Circle */
433 [0x4] = BTN_NORTH, /* Triangle */
434 [0x5] = BTN_TL, /* L1 */
435 [0x6] = BTN_TR, /* R1 */
436 [0x7] = BTN_TL2, /* L2 */
437 [0x8] = BTN_TR2, /* R2 */
438 [0x9] = BTN_SELECT, /* Share */
439 [0xa] = BTN_START, /* Options */
440 [0xb] = BTN_THUMBL, /* L3 */
441 [0xc] = BTN_THUMBR, /* R3 */
442 [0xd] = BTN_MODE, /* PS */
443};
444
Roderick Colenbranderd03ae2e2017-03-07 15:45:03 -0800445static const struct {int x; int y; } ds4_hat_mapping[] = {
446 {0, -1}, {1, -1}, {1, 0}, {1, 1}, {0, 1}, {-1, 1}, {-1, 0}, {-1, -1},
447 {0, 0}
448};
Roderick Colenbrander9131f8c2016-11-23 14:07:08 -0800449
Frank Praznikd902f472014-01-27 10:17:36 -0500450static enum power_supply_property sony_battery_props[] = {
451 POWER_SUPPLY_PROP_PRESENT,
452 POWER_SUPPLY_PROP_CAPACITY,
453 POWER_SUPPLY_PROP_SCOPE,
454 POWER_SUPPLY_PROP_STATUS,
455};
456
Frank Praznik55d3b662014-04-14 10:11:32 -0400457struct sixaxis_led {
Pavel Machek1adf9042016-02-09 13:55:08 +0100458 u8 time_enabled; /* the total time the led is active (0xff means forever) */
459 u8 duty_length; /* how long a cycle is in deciseconds (0 means "really fast") */
460 u8 enabled;
461 u8 duty_off; /* % of duty_length the led is off (0xff means 100%) */
462 u8 duty_on; /* % of duty_length the led is on (0xff mean 100%) */
Frank Praznik55d3b662014-04-14 10:11:32 -0400463} __packed;
464
465struct sixaxis_rumble {
Pavel Machek1adf9042016-02-09 13:55:08 +0100466 u8 padding;
467 u8 right_duration; /* Right motor duration (0xff means forever) */
468 u8 right_motor_on; /* Right (small) motor on/off, only supports values of 0 or 1 (off/on) */
469 u8 left_duration; /* Left motor duration (0xff means forever) */
470 u8 left_motor_force; /* left (large) motor, supports force values from 0 to 255 */
Frank Praznik55d3b662014-04-14 10:11:32 -0400471} __packed;
472
473struct sixaxis_output_report {
Pavel Machek1adf9042016-02-09 13:55:08 +0100474 u8 report_id;
Frank Praznik55d3b662014-04-14 10:11:32 -0400475 struct sixaxis_rumble rumble;
Pavel Machek1adf9042016-02-09 13:55:08 +0100476 u8 padding[4];
477 u8 leds_bitmap; /* bitmap of enabled LEDs: LED_1 = 0x02, LED_2 = 0x04, ... */
Frank Praznik55d3b662014-04-14 10:11:32 -0400478 struct sixaxis_led led[4]; /* LEDx at (4 - x) */
479 struct sixaxis_led _reserved; /* LED5, not actually soldered */
480} __packed;
481
482union sixaxis_output_report_01 {
483 struct sixaxis_output_report data;
Pavel Machek1adf9042016-02-09 13:55:08 +0100484 u8 buf[36];
Frank Praznik55d3b662014-04-14 10:11:32 -0400485};
486
Frank Praznikc5e0c1c2015-05-05 20:47:30 -0400487struct motion_output_report_02 {
488 u8 type, zero;
489 u8 r, g, b;
490 u8 zero2;
491 u8 rumble;
492};
493
Roderick Colenbrander2c159de2016-10-07 12:39:35 -0700494#define DS4_FEATURE_REPORT_0x02_SIZE 37
Roderick Colenbrander55a07d62017-03-07 15:45:01 -0800495#define DS4_FEATURE_REPORT_0x05_SIZE 41
Roderick Colenbrander2c159de2016-10-07 12:39:35 -0700496#define DS4_FEATURE_REPORT_0x81_SIZE 7
Roderick Colenbrander169f15a2017-12-19 11:04:43 -0800497#define DS4_FEATURE_REPORT_0xA3_SIZE 49
Roderick Colenbrander49b9ca62016-10-07 12:39:36 -0700498#define DS4_INPUT_REPORT_0x11_SIZE 78
Roderick Colenbrander2c159de2016-10-07 12:39:35 -0700499#define DS4_OUTPUT_REPORT_0x05_SIZE 32
500#define DS4_OUTPUT_REPORT_0x11_SIZE 78
Antonio Ospite29b691a2015-02-16 18:12:21 +0100501#define SIXAXIS_REPORT_0xF2_SIZE 17
Antonio Ospitea85d67b2015-02-16 18:12:22 +0100502#define SIXAXIS_REPORT_0xF5_SIZE 8
Simon Wood41d2d422015-06-09 21:27:06 -0600503#define MOTION_REPORT_0x02_SIZE 49
Frank Praznik9b2b5c92014-11-12 14:10:09 -0500504
Roderick Colenbrandercdc1c022016-10-07 12:39:38 -0700505/* Offsets relative to USB input report (0x1). Bluetooth (0x11) requires an
506 * additional +2.
507 */
Roderick Colenbranderd03ae2e2017-03-07 15:45:03 -0800508#define DS4_INPUT_REPORT_AXIS_OFFSET 1
Roderick Colenbranderac797b92016-11-23 14:07:07 -0800509#define DS4_INPUT_REPORT_BUTTON_OFFSET 5
Roderick Colenbrander80786eb2017-03-07 15:45:02 -0800510#define DS4_INPUT_REPORT_TIMESTAMP_OFFSET 10
Roderick Colenbrander227c0112017-03-07 15:45:00 -0800511#define DS4_INPUT_REPORT_GYRO_X_OFFSET 13
Roderick Colenbrandercdc1c022016-10-07 12:39:38 -0700512#define DS4_INPUT_REPORT_BATTERY_OFFSET 30
513#define DS4_INPUT_REPORT_TOUCHPAD_OFFSET 33
514
Roderick Colenbrander510c8b72017-03-07 15:45:10 -0800515#define SENSOR_SUFFIX " Motion Sensors"
Roderick Colenbranderac797b92016-11-23 14:07:07 -0800516#define DS4_TOUCHPAD_SUFFIX " Touchpad"
517
Roderick Colenbrander77b499e2017-03-24 15:17:49 -0700518/* Default to 4ms poll interval, which is same as USB (not adjustable). */
519#define DS4_BT_DEFAULT_POLL_INTERVAL_MS 4
520#define DS4_BT_MAX_POLL_INTERVAL_MS 62
Roderick Colenbrander55a07d62017-03-07 15:45:01 -0800521#define DS4_GYRO_RES_PER_DEG_S 1024
522#define DS4_ACC_RES_PER_G 8192
523
Roderick Colenbrander510c8b72017-03-07 15:45:10 -0800524#define SIXAXIS_INPUT_REPORT_ACC_X_OFFSET 41
525#define SIXAXIS_ACC_RES_PER_G 113
526
Jiri Kosina8b402c92015-02-23 11:15:44 +0100527static DEFINE_SPINLOCK(sony_dev_list_lock);
Frank Praznikd2d782f2014-02-20 11:36:03 -0500528static LIST_HEAD(sony_device_list);
Frank Praznik80250872014-04-14 10:11:35 -0400529static DEFINE_IDA(sony_device_id_allocator);
Frank Praznikd2d782f2014-02-20 11:36:03 -0500530
Roderick Colenbrander55a07d62017-03-07 15:45:01 -0800531/* Used for calibration of DS4 accelerometer and gyro. */
532struct ds4_calibration_data {
533 int abs_code;
534 short bias;
535 /* Calibration requires scaling against a sensitivity value, which is a
536 * float. Store sensitivity as a fraction to limit floating point
537 * calculations until final calibration.
538 */
539 int sens_numer;
540 int sens_denom;
541};
542
Roderick Colenbranderf2f47c32017-03-07 15:45:06 -0800543enum ds4_dongle_state {
544 DONGLE_DISCONNECTED,
545 DONGLE_CALIBRATING,
546 DONGLE_CONNECTED,
547 DONGLE_DISABLED
548};
549
Roderick Colenbranderb5322732017-03-07 15:45:05 -0800550enum sony_worker {
Roderick Colenbranderf2f47c32017-03-07 15:45:06 -0800551 SONY_WORKER_STATE,
552 SONY_WORKER_HOTPLUG
Roderick Colenbranderb5322732017-03-07 15:45:05 -0800553};
554
Jiri Kosinacc6e0bb2008-10-23 12:58:38 +0200555struct sony_sc {
Frank Praznikd902f472014-01-27 10:17:36 -0500556 spinlock_t lock;
Frank Praznikd2d782f2014-02-20 11:36:03 -0500557 struct list_head list_node;
Sven Eckelmann0a286ef2013-11-19 20:26:32 +0100558 struct hid_device *hdev;
Roderick Colenbranderac797b92016-11-23 14:07:07 -0800559 struct input_dev *touchpad;
Roderick Colenbrander227c0112017-03-07 15:45:00 -0800560 struct input_dev *sensor_dev;
Frank Praznik60781cf2014-01-11 15:13:15 -0500561 struct led_classdev *leds[MAX_LEDS];
Jiri Kosinacc6e0bb2008-10-23 12:58:38 +0200562 unsigned long quirks;
Roderick Colenbranderf2f47c32017-03-07 15:45:06 -0800563 struct work_struct hotplug_worker;
Sven Eckelmann0a286ef2013-11-19 20:26:32 +0100564 struct work_struct state_worker;
Antonio Ospite09593e32016-02-09 13:55:06 +0100565 void (*send_output_report)(struct sony_sc *);
Krzysztof Kozlowski297d7162015-03-12 08:44:11 +0100566 struct power_supply *battery;
567 struct power_supply_desc battery_desc;
Frank Praznik80250872014-04-14 10:11:35 -0400568 int device_id;
Roderick Colenbrander169f15a2017-12-19 11:04:43 -0800569 unsigned fw_version;
Roderick Colenbrander1a8212e2020-11-09 23:22:29 -0800570 bool fw_version_created;
Roderick Colenbrander169f15a2017-12-19 11:04:43 -0800571 unsigned hw_version;
Roderick Colenbrander1a8212e2020-11-09 23:22:29 -0800572 bool hw_version_created;
Pavel Machek1adf9042016-02-09 13:55:08 +0100573 u8 *output_report_dmabuf;
Colin Leitnerf04d5142013-05-27 23:41:05 +0200574
Sven Eckelmann9f323b62013-11-17 20:38:21 +0100575#ifdef CONFIG_SONY_FF
Pavel Machek1adf9042016-02-09 13:55:08 +0100576 u8 left;
577 u8 right;
Sven Eckelmann9f323b62013-11-17 20:38:21 +0100578#endif
579
Pavel Machek1adf9042016-02-09 13:55:08 +0100580 u8 mac_address[6];
Roderick Colenbranderf2f47c32017-03-07 15:45:06 -0800581 u8 hotplug_worker_initialized;
Roderick Colenbranderb5322732017-03-07 15:45:05 -0800582 u8 state_worker_initialized;
Frank Praznik2a242932016-09-22 20:18:09 -0400583 u8 defer_initialization;
Pavel Machek1adf9042016-02-09 13:55:08 +0100584 u8 battery_capacity;
Roderick Colenbrandera76a6c12020-11-09 23:22:27 -0800585 int battery_status;
Pavel Machek1adf9042016-02-09 13:55:08 +0100586 u8 led_state[MAX_LEDS];
Pavel Machek1adf9042016-02-09 13:55:08 +0100587 u8 led_delay_on[MAX_LEDS];
588 u8 led_delay_off[MAX_LEDS];
589 u8 led_count;
Roderick Colenbrander80786eb2017-03-07 15:45:02 -0800590
591 bool timestamp_initialized;
592 u16 prev_timestamp;
593 unsigned int timestamp_us;
594
Roderick Colenbrander77b499e2017-03-24 15:17:49 -0700595 u8 ds4_bt_poll_interval;
Roderick Colenbranderf2f47c32017-03-07 15:45:06 -0800596 enum ds4_dongle_state ds4_dongle_state;
Roderick Colenbrander55a07d62017-03-07 15:45:01 -0800597 /* DS4 calibration data */
598 struct ds4_calibration_data ds4_calib_data[6];
Pascal Giardcc894ac2020-11-25 22:02:30 -0500599 /* GH Live */
Pascal Giardfb1a79a2021-06-04 12:10:23 -0400600 struct urb *ghl_urb;
Pascal Giardcc894ac2020-11-25 22:02:30 -0500601 struct timer_list ghl_poke_timer;
Jiri Kosinacc6e0bb2008-10-23 12:58:38 +0200602};
603
Roderick Colenbrander405182c2016-12-08 19:09:52 -0800604static void sony_set_leds(struct sony_sc *sc);
605
Roderick Colenbranderb5322732017-03-07 15:45:05 -0800606static inline void sony_schedule_work(struct sony_sc *sc,
607 enum sony_worker which)
Frank Praznik2a242932016-09-22 20:18:09 -0400608{
Roderick Colenbrandere0f69742019-08-02 15:50:19 -0700609 unsigned long flags;
610
Roderick Colenbranderb5322732017-03-07 15:45:05 -0800611 switch (which) {
612 case SONY_WORKER_STATE:
Roderick Colenbrandere0f69742019-08-02 15:50:19 -0700613 spin_lock_irqsave(&sc->lock, flags);
614 if (!sc->defer_initialization && sc->state_worker_initialized)
Roderick Colenbranderb5322732017-03-07 15:45:05 -0800615 schedule_work(&sc->state_worker);
Roderick Colenbrandere0f69742019-08-02 15:50:19 -0700616 spin_unlock_irqrestore(&sc->lock, flags);
Roderick Colenbranderf2f47c32017-03-07 15:45:06 -0800617 break;
618 case SONY_WORKER_HOTPLUG:
619 if (sc->hotplug_worker_initialized)
620 schedule_work(&sc->hotplug_worker);
621 break;
Roderick Colenbranderb5322732017-03-07 15:45:05 -0800622 }
Frank Praznik2a242932016-09-22 20:18:09 -0400623}
624
Pascal Giardcc894ac2020-11-25 22:02:30 -0500625static void ghl_magic_poke_cb(struct urb *urb)
626{
Pascal Giardfb1a79a2021-06-04 12:10:23 -0400627 struct sony_sc *sc = urb->context;
628
629 if (urb->status < 0)
630 hid_err(sc->hdev, "URB transfer failed : %d", urb->status);
631
632 mod_timer(&sc->ghl_poke_timer, jiffies + GHL_GUITAR_POKE_INTERVAL*HZ);
Pascal Giardcc894ac2020-11-25 22:02:30 -0500633}
634
635static void ghl_magic_poke(struct timer_list *t)
636{
Pascal Giardfb1a79a2021-06-04 12:10:23 -0400637 int ret;
Pascal Giardcc894ac2020-11-25 22:02:30 -0500638 struct sony_sc *sc = from_timer(sc, t, ghl_poke_timer);
639
Pascal Giardfb1a79a2021-06-04 12:10:23 -0400640 ret = usb_submit_urb(sc->ghl_urb, GFP_ATOMIC);
641 if (ret < 0)
642 hid_err(sc->hdev, "usb_submit_urb failed: %d", ret);
643}
Pascal Giardcc894ac2020-11-25 22:02:30 -0500644
Pascal Giardfb1a79a2021-06-04 12:10:23 -0400645static int ghl_init_urb(struct sony_sc *sc, struct usb_device *usbdev)
646{
647 struct usb_ctrlrequest *cr;
648 u16 poke_size;
649 u8 *databuf;
650 unsigned int pipe;
651
652 poke_size = ARRAY_SIZE(ghl_ps3wiiu_magic_data);
Pascal Giardcc894ac2020-11-25 22:02:30 -0500653 pipe = usb_sndctrlpipe(usbdev, 0);
654
Pascal Giardfb1a79a2021-06-04 12:10:23 -0400655 cr = devm_kzalloc(&sc->hdev->dev, sizeof(*cr), GFP_ATOMIC);
656 if (cr == NULL)
657 return -ENOMEM;
Pascal Giardcc894ac2020-11-25 22:02:30 -0500658
Pascal Giardfb1a79a2021-06-04 12:10:23 -0400659 databuf = devm_kzalloc(&sc->hdev->dev, poke_size, GFP_ATOMIC);
660 if (databuf == NULL)
661 return -ENOMEM;
Pascal Giardcc894ac2020-11-25 22:02:30 -0500662
Pascal Giardfb1a79a2021-06-04 12:10:23 -0400663 cr->bRequestType =
Pascal Giardcc894ac2020-11-25 22:02:30 -0500664 USB_RECIP_INTERFACE | USB_TYPE_CLASS | USB_DIR_OUT;
Pascal Giardfb1a79a2021-06-04 12:10:23 -0400665 cr->bRequest = USB_REQ_SET_CONFIGURATION;
666 cr->wValue = cpu_to_le16(ghl_ps3wiiu_magic_value);
667 cr->wIndex = 0;
668 cr->wLength = cpu_to_le16(poke_size);
669 memcpy(databuf, ghl_ps3wiiu_magic_data, poke_size);
Pascal Giardcc894ac2020-11-25 22:02:30 -0500670 usb_fill_control_urb(
Pascal Giardfb1a79a2021-06-04 12:10:23 -0400671 sc->ghl_urb, usbdev, pipe,
672 (unsigned char *) cr, databuf, poke_size,
673 ghl_magic_poke_cb, sc);
674 return 0;
Pascal Giardcc894ac2020-11-25 22:02:30 -0500675}
676
677static int guitar_mapping(struct hid_device *hdev, struct hid_input *hi,
678 struct hid_field *field, struct hid_usage *usage,
679 unsigned long **bit, int *max)
680{
681 if ((usage->hid & HID_USAGE_PAGE) == HID_UP_MSVENDOR) {
682 unsigned int abs = usage->hid & HID_USAGE;
683
Sanjay Govind32e411d2020-12-04 18:45:27 +1300684 if (abs == GUITAR_TILT_USAGE) {
Pascal Giardcc894ac2020-11-25 22:02:30 -0500685 hid_map_usage_clear(hi, usage, bit, max, EV_ABS, ABS_RY);
686 return 1;
687 }
688 }
689 return 0;
690}
691
Roderick Colenbrander77b499e2017-03-24 15:17:49 -0700692static ssize_t ds4_show_poll_interval(struct device *dev,
693 struct device_attribute
694 *attr, char *buf)
Antonio Ospitec607fb82014-06-24 13:28:41 +0200695{
Roderick Colenbrander77b499e2017-03-24 15:17:49 -0700696 struct hid_device *hdev = to_hid_device(dev);
697 struct sony_sc *sc = hid_get_drvdata(hdev);
698
699 return snprintf(buf, PAGE_SIZE, "%i\n", sc->ds4_bt_poll_interval);
Antonio Ospitec607fb82014-06-24 13:28:41 +0200700}
701
Roderick Colenbrander77b499e2017-03-24 15:17:49 -0700702static ssize_t ds4_store_poll_interval(struct device *dev,
703 struct device_attribute *attr,
704 const char *buf, size_t count)
705{
706 struct hid_device *hdev = to_hid_device(dev);
707 struct sony_sc *sc = hid_get_drvdata(hdev);
708 unsigned long flags;
709 u8 interval;
710
711 if (kstrtou8(buf, 0, &interval))
712 return -EINVAL;
713
714 if (interval > DS4_BT_MAX_POLL_INTERVAL_MS)
715 return -EINVAL;
716
717 spin_lock_irqsave(&sc->lock, flags);
718 sc->ds4_bt_poll_interval = interval;
719 spin_unlock_irqrestore(&sc->lock, flags);
720
721 sony_schedule_work(sc, SONY_WORKER_STATE);
722
723 return count;
724}
725
726static DEVICE_ATTR(bt_poll_interval, 0644, ds4_show_poll_interval,
727 ds4_store_poll_interval);
728
Roderick Colenbrander169f15a2017-12-19 11:04:43 -0800729static ssize_t sony_show_firmware_version(struct device *dev,
730 struct device_attribute
731 *attr, char *buf)
732{
733 struct hid_device *hdev = to_hid_device(dev);
734 struct sony_sc *sc = hid_get_drvdata(hdev);
735
736 return snprintf(buf, PAGE_SIZE, "0x%04x\n", sc->fw_version);
737}
738
739static DEVICE_ATTR(firmware_version, 0444, sony_show_firmware_version, NULL);
740
741static ssize_t sony_show_hardware_version(struct device *dev,
742 struct device_attribute
743 *attr, char *buf)
744{
745 struct hid_device *hdev = to_hid_device(dev);
746 struct sony_sc *sc = hid_get_drvdata(hdev);
747
748 return snprintf(buf, PAGE_SIZE, "0x%04x\n", sc->hw_version);
749}
750
751static DEVICE_ATTR(hardware_version, 0444, sony_show_hardware_version, NULL);
Roderick Colenbrander77b499e2017-03-24 15:17:49 -0700752
Frank Praznikc5e0c1c2015-05-05 20:47:30 -0400753static u8 *motion_fixup(struct hid_device *hdev, u8 *rdesc,
754 unsigned int *rsize)
755{
756 *rsize = sizeof(motion_rdesc);
757 return motion_rdesc;
758}
759
Pavel Machek1adf9042016-02-09 13:55:08 +0100760static u8 *ps3remote_fixup(struct hid_device *hdev, u8 *rdesc,
Jiri Kosina078328d2013-06-13 12:03:49 +0200761 unsigned int *rsize)
762{
763 *rsize = sizeof(ps3remote_rdesc);
764 return ps3remote_rdesc;
765}
766
767static int ps3remote_mapping(struct hid_device *hdev, struct hid_input *hi,
768 struct hid_field *field, struct hid_usage *usage,
769 unsigned long **bit, int *max)
770{
771 unsigned int key = usage->hid & HID_USAGE;
772
773 if ((usage->hid & HID_USAGE_PAGE) != HID_UP_BUTTON)
774 return -1;
775
776 switch (usage->collection_index) {
777 case 1:
778 if (key >= ARRAY_SIZE(ps3remote_keymap_joypad_buttons))
779 return -1;
780
781 key = ps3remote_keymap_joypad_buttons[key];
782 if (!key)
783 return -1;
784 break;
785 case 2:
786 if (key >= ARRAY_SIZE(ps3remote_keymap_remote_buttons))
787 return -1;
788
789 key = ps3remote_keymap_remote_buttons[key];
790 if (!key)
791 return -1;
792 break;
793 default:
794 return -1;
795 }
796
797 hid_map_usage_clear(hi, usage, bit, max, EV_KEY, key);
798 return 1;
799}
800
Roderick Colenbranderb8f09702017-03-24 15:17:46 -0700801static int navigation_mapping(struct hid_device *hdev, struct hid_input *hi,
802 struct hid_field *field, struct hid_usage *usage,
803 unsigned long **bit, int *max)
804{
805 if ((usage->hid & HID_USAGE_PAGE) == HID_UP_BUTTON) {
806 unsigned int key = usage->hid & HID_USAGE;
807
808 if (key >= ARRAY_SIZE(sixaxis_keymap))
809 return -1;
810
811 key = navigation_keymap[key];
812 if (!key)
813 return -1;
814
815 hid_map_usage_clear(hi, usage, bit, max, EV_KEY, key);
816 return 1;
817 } else if (usage->hid == HID_GD_POINTER) {
818 /* See comment in sixaxis_mapping, basically the L2 (and R2)
819 * triggers are reported through GD Pointer.
820 * In addition we ignore any analog button 'axes' and only
821 * support digital buttons.
822 */
823 switch (usage->usage_index) {
824 case 8: /* L2 */
825 usage->hid = HID_GD_Z;
826 break;
827 default:
828 return -1;
829 }
830
831 hid_map_usage_clear(hi, usage, bit, max, EV_ABS, usage->hid & 0xf);
832 return 1;
833 } else if ((usage->hid & HID_USAGE_PAGE) == HID_UP_GENDESK) {
834 unsigned int abs = usage->hid & HID_USAGE;
835
836 if (abs >= ARRAY_SIZE(navigation_absmap))
837 return -1;
838
839 abs = navigation_absmap[abs];
840
841 hid_map_usage_clear(hi, usage, bit, max, EV_ABS, abs);
842 return 1;
843 }
844
845 return -1;
846}
847
848
Roderick Colenbrandere19a2672017-03-07 15:45:08 -0800849static int sixaxis_mapping(struct hid_device *hdev, struct hid_input *hi,
850 struct hid_field *field, struct hid_usage *usage,
851 unsigned long **bit, int *max)
852{
853 if ((usage->hid & HID_USAGE_PAGE) == HID_UP_BUTTON) {
854 unsigned int key = usage->hid & HID_USAGE;
855
856 if (key >= ARRAY_SIZE(sixaxis_keymap))
857 return -1;
858
859 key = sixaxis_keymap[key];
860 hid_map_usage_clear(hi, usage, bit, max, EV_KEY, key);
861 return 1;
862 } else if (usage->hid == HID_GD_POINTER) {
863 /* The DS3 provides analog values for most buttons and even
864 * for HAT axes through GD Pointer. L2 and R2 are reported
865 * among these as well instead of as GD Z / RZ. Remap L2
866 * and R2 and ignore other analog 'button axes' as there is
867 * no good way for reporting them.
868 */
869 switch (usage->usage_index) {
870 case 8: /* L2 */
871 usage->hid = HID_GD_Z;
872 break;
873 case 9: /* R2 */
874 usage->hid = HID_GD_RZ;
875 break;
876 default:
877 return -1;
878 }
879
880 hid_map_usage_clear(hi, usage, bit, max, EV_ABS, usage->hid & 0xf);
881 return 1;
882 } else if ((usage->hid & HID_USAGE_PAGE) == HID_UP_GENDESK) {
883 unsigned int abs = usage->hid & HID_USAGE;
884
885 if (abs >= ARRAY_SIZE(sixaxis_absmap))
886 return -1;
887
888 abs = sixaxis_absmap[abs];
889
890 hid_map_usage_clear(hi, usage, bit, max, EV_ABS, abs);
891 return 1;
892 }
893
894 return -1;
895}
896
Roderick Colenbrander9131f8c2016-11-23 14:07:08 -0800897static int ds4_mapping(struct hid_device *hdev, struct hid_input *hi,
898 struct hid_field *field, struct hid_usage *usage,
899 unsigned long **bit, int *max)
900{
901 if ((usage->hid & HID_USAGE_PAGE) == HID_UP_BUTTON) {
902 unsigned int key = usage->hid & HID_USAGE;
903
904 if (key >= ARRAY_SIZE(ds4_keymap))
905 return -1;
906
907 key = ds4_keymap[key];
908 hid_map_usage_clear(hi, usage, bit, max, EV_KEY, key);
909 return 1;
910 } else if ((usage->hid & HID_USAGE_PAGE) == HID_UP_GENDESK) {
911 unsigned int abs = usage->hid & HID_USAGE;
912
913 /* Let the HID parser deal with the HAT. */
914 if (usage->hid == HID_GD_HATSWITCH)
915 return 0;
916
917 if (abs >= ARRAY_SIZE(ds4_absmap))
918 return -1;
919
920 abs = ds4_absmap[abs];
921 hid_map_usage_clear(hi, usage, bit, max, EV_ABS, abs);
922 return 1;
923 }
924
925 return 0;
926}
927
Pavel Machek1adf9042016-02-09 13:55:08 +0100928static u8 *sony_report_fixup(struct hid_device *hdev, u8 *rdesc,
Nikolai Kondrashov73e40082010-08-06 23:03:06 +0400929 unsigned int *rsize)
Jiri Kosinacc6e0bb2008-10-23 12:58:38 +0200930{
931 struct sony_sc *sc = hid_get_drvdata(hdev);
932
Mikko Perttunen4ba1eee2016-07-21 19:54:48 +0300933 if (sc->quirks & (SINO_LITE_CONTROLLER | FUTUREMAX_DANCE_MAT))
Scott Moreau74500cc2016-01-13 07:40:42 -0700934 return rdesc;
935
Fernando Luis Vázquez Cao99d24902013-01-22 15:20:38 +0900936 /*
937 * Some Sony RF receivers wrongly declare the mouse pointer as a
938 * a constant non-data variable.
939 */
940 if ((sc->quirks & VAIO_RDESC_CONSTANT) && *rsize >= 56 &&
941 /* usage page: generic desktop controls */
942 /* rdesc[0] == 0x05 && rdesc[1] == 0x01 && */
943 /* usage: mouse */
944 rdesc[2] == 0x09 && rdesc[3] == 0x02 &&
945 /* input (usage page for x,y axes): constant, variable, relative */
946 rdesc[54] == 0x81 && rdesc[55] == 0x07) {
Fernando Luis Vázquez Caoa4649182013-01-15 19:40:48 +0900947 hid_info(hdev, "Fixing up Sony RF Receiver report descriptor\n");
Fernando Luis Vázquez Cao99d24902013-01-22 15:20:38 +0900948 /* input: data, variable, relative */
Jiri Kosinacc6e0bb2008-10-23 12:58:38 +0200949 rdesc[55] = 0x06;
950 }
Simon Wood61ab44b2011-06-10 12:00:26 +0200951
Frank Praznikc5e0c1c2015-05-05 20:47:30 -0400952 if (sc->quirks & MOTION_CONTROLLER)
953 return motion_fixup(hdev, rdesc, rsize);
954
Jiri Kosina078328d2013-06-13 12:03:49 +0200955 if (sc->quirks & PS3REMOTE)
956 return ps3remote_fixup(hdev, rdesc, rsize);
957
Scott Shumatee72455b2020-05-13 13:39:26 -0500958 /*
959 * Some knock-off USB dongles incorrectly report their button count
960 * as 13 instead of 16 causing three non-functional buttons.
961 */
962 if ((sc->quirks & SIXAXIS_CONTROLLER_USB) && *rsize >= 45 &&
963 /* Report Count (13) */
964 rdesc[23] == 0x95 && rdesc[24] == 0x0D &&
965 /* Usage Maximum (13) */
966 rdesc[37] == 0x29 && rdesc[38] == 0x0D &&
967 /* Report Count (3) */
968 rdesc[43] == 0x95 && rdesc[44] == 0x03) {
969 hid_info(hdev, "Fixing up USB dongle report descriptor\n");
970 rdesc[24] = 0x10;
971 rdesc[38] = 0x10;
972 rdesc[44] = 0x00;
973 }
974
Nikolai Kondrashov73e40082010-08-06 23:03:06 +0400975 return rdesc;
Jiri Kosinacc6e0bb2008-10-23 12:58:38 +0200976}
977
Pavel Machek1adf9042016-02-09 13:55:08 +0100978static void sixaxis_parse_report(struct sony_sc *sc, u8 *rd, int size)
Frank Praznikd902f472014-01-27 10:17:36 -0500979{
Pavel Machek1adf9042016-02-09 13:55:08 +0100980 static const u8 sixaxis_battery_capacity[] = { 0, 1, 25, 50, 75, 100 };
Frank Praznikd902f472014-01-27 10:17:36 -0500981 unsigned long flags;
Simon Wood12e9a6d72015-06-09 21:27:05 -0600982 int offset;
Roderick Colenbrandera76a6c12020-11-09 23:22:27 -0800983 u8 battery_capacity;
984 int battery_status;
Frank Praznikd902f472014-01-27 10:17:36 -0500985
Frank Praznikad142b92014-02-20 11:36:00 -0500986 /*
987 * The sixaxis is charging if the battery value is 0xee
Frank Praznikd902f472014-01-27 10:17:36 -0500988 * and it is fully charged if the value is 0xef.
989 * It does not report the actual level while charging so it
990 * is set to 100% while charging is in progress.
991 */
Simon Wood12e9a6d72015-06-09 21:27:05 -0600992 offset = (sc->quirks & MOTION_CONTROLLER) ? 12 : 30;
993
994 if (rd[offset] >= 0xee) {
Frank Praznikd902f472014-01-27 10:17:36 -0500995 battery_capacity = 100;
Roderick Colenbrandera76a6c12020-11-09 23:22:27 -0800996 battery_status = (rd[offset] & 0x01) ? POWER_SUPPLY_STATUS_FULL : POWER_SUPPLY_STATUS_CHARGING;
Frank Praznikd902f472014-01-27 10:17:36 -0500997 } else {
Pavel Machek1adf9042016-02-09 13:55:08 +0100998 u8 index = rd[offset] <= 5 ? rd[offset] : 5;
Frank Praznikac3c9a92014-02-20 11:36:02 -0500999 battery_capacity = sixaxis_battery_capacity[index];
Roderick Colenbrandera76a6c12020-11-09 23:22:27 -08001000 battery_status = POWER_SUPPLY_STATUS_DISCHARGING;
Frank Praznikd902f472014-01-27 10:17:36 -05001001 }
Frank Praznikd902f472014-01-27 10:17:36 -05001002
1003 spin_lock_irqsave(&sc->lock, flags);
Frank Praznikd902f472014-01-27 10:17:36 -05001004 sc->battery_capacity = battery_capacity;
Roderick Colenbrandera76a6c12020-11-09 23:22:27 -08001005 sc->battery_status = battery_status;
Frank Praznikd902f472014-01-27 10:17:36 -05001006 spin_unlock_irqrestore(&sc->lock, flags);
Roderick Colenbrander510c8b72017-03-07 15:45:10 -08001007
1008 if (sc->quirks & SIXAXIS_CONTROLLER) {
1009 int val;
1010
1011 offset = SIXAXIS_INPUT_REPORT_ACC_X_OFFSET;
1012 val = ((rd[offset+1] << 8) | rd[offset]) - 511;
1013 input_report_abs(sc->sensor_dev, ABS_X, val);
1014
1015 /* Y and Z are swapped and inversed */
1016 val = 511 - ((rd[offset+5] << 8) | rd[offset+4]);
1017 input_report_abs(sc->sensor_dev, ABS_Y, val);
1018
1019 val = 511 - ((rd[offset+3] << 8) | rd[offset+2]);
1020 input_report_abs(sc->sensor_dev, ABS_Z, val);
1021
1022 input_sync(sc->sensor_dev);
1023 }
Frank Praznikd902f472014-01-27 10:17:36 -05001024}
1025
Pavel Machek1adf9042016-02-09 13:55:08 +01001026static void dualshock4_parse_report(struct sony_sc *sc, u8 *rd, int size)
Frank Praznikd902f472014-01-27 10:17:36 -05001027{
Roderick Colenbranderd03ae2e2017-03-07 15:45:03 -08001028 struct hid_input *hidinput = list_entry(sc->hdev->inputs.next,
1029 struct hid_input, list);
1030 struct input_dev *input_dev = hidinput->input;
Frank Praznikd902f472014-01-27 10:17:36 -05001031 unsigned long flags;
Roderick Colenbrandercdc1c022016-10-07 12:39:38 -07001032 int n, m, offset, num_touch_data, max_touch_data;
Roderick Colenbrandera76a6c12020-11-09 23:22:27 -08001033 u8 cable_state, battery_capacity;
1034 int battery_status;
Roderick Colenbrander80786eb2017-03-07 15:45:02 -08001035 u16 timestamp;
Frank Praznikd902f472014-01-27 10:17:36 -05001036
Roderick Colenbrandercdc1c022016-10-07 12:39:38 -07001037 /* When using Bluetooth the header is 2 bytes longer, so skip these. */
Roderick Colenbrander35f436c2017-03-07 15:45:04 -08001038 int data_offset = (sc->quirks & DUALSHOCK4_CONTROLLER_BT) ? 2 : 0;
Frank Praznik6c5f8602014-02-05 20:03:47 -05001039
Roderick Colenbranderac797b92016-11-23 14:07:07 -08001040 /* Second bit of third button byte is for the touchpad button. */
1041 offset = data_offset + DS4_INPUT_REPORT_BUTTON_OFFSET;
1042 input_report_key(sc->touchpad, BTN_LEFT, rd[offset+2] & 0x2);
1043
Frank Praznikad142b92014-02-20 11:36:00 -05001044 /*
Roderick Colenbranderd03ae2e2017-03-07 15:45:03 -08001045 * The default behavior of the Dualshock 4 is to send reports using
1046 * report type 1 when running over Bluetooth. However, when feature
1047 * report 2 is requested during the controller initialization it starts
1048 * sending input reports in report 17. Since report 17 is undefined
1049 * in the default HID descriptor, the HID layer won't generate events.
1050 * While it is possible (and this was done before) to fixup the HID
1051 * descriptor to add this mapping, it was better to do this manually.
1052 * The reason is there were various pieces software both open and closed
1053 * source, relying on the descriptors to be the same across various
1054 * operating systems. If the descriptors wouldn't match some
1055 * applications e.g. games on Wine would not be able to function due
1056 * to different descriptors, which such applications are not parsing.
1057 */
1058 if (rd[0] == 17) {
1059 int value;
1060
1061 offset = data_offset + DS4_INPUT_REPORT_AXIS_OFFSET;
1062 input_report_abs(input_dev, ABS_X, rd[offset]);
1063 input_report_abs(input_dev, ABS_Y, rd[offset+1]);
1064 input_report_abs(input_dev, ABS_RX, rd[offset+2]);
1065 input_report_abs(input_dev, ABS_RY, rd[offset+3]);
1066
1067 value = rd[offset+4] & 0xf;
1068 if (value > 7)
1069 value = 8; /* Center 0, 0 */
1070 input_report_abs(input_dev, ABS_HAT0X, ds4_hat_mapping[value].x);
1071 input_report_abs(input_dev, ABS_HAT0Y, ds4_hat_mapping[value].y);
1072
1073 input_report_key(input_dev, BTN_WEST, rd[offset+4] & 0x10);
1074 input_report_key(input_dev, BTN_SOUTH, rd[offset+4] & 0x20);
1075 input_report_key(input_dev, BTN_EAST, rd[offset+4] & 0x40);
1076 input_report_key(input_dev, BTN_NORTH, rd[offset+4] & 0x80);
1077
1078 input_report_key(input_dev, BTN_TL, rd[offset+5] & 0x1);
1079 input_report_key(input_dev, BTN_TR, rd[offset+5] & 0x2);
1080 input_report_key(input_dev, BTN_TL2, rd[offset+5] & 0x4);
1081 input_report_key(input_dev, BTN_TR2, rd[offset+5] & 0x8);
1082 input_report_key(input_dev, BTN_SELECT, rd[offset+5] & 0x10);
1083 input_report_key(input_dev, BTN_START, rd[offset+5] & 0x20);
1084 input_report_key(input_dev, BTN_THUMBL, rd[offset+5] & 0x40);
1085 input_report_key(input_dev, BTN_THUMBR, rd[offset+5] & 0x80);
1086
1087 input_report_key(input_dev, BTN_MODE, rd[offset+6] & 0x1);
1088
1089 input_report_abs(input_dev, ABS_Z, rd[offset+7]);
1090 input_report_abs(input_dev, ABS_RZ, rd[offset+8]);
1091
1092 input_sync(input_dev);
1093 }
1094
Roderick Colenbrander80786eb2017-03-07 15:45:02 -08001095 /* Convert timestamp (in 5.33us unit) to timestamp_us */
1096 offset = data_offset + DS4_INPUT_REPORT_TIMESTAMP_OFFSET;
1097 timestamp = get_unaligned_le16(&rd[offset]);
1098 if (!sc->timestamp_initialized) {
1099 sc->timestamp_us = ((unsigned int)timestamp * 16) / 3;
1100 sc->timestamp_initialized = true;
1101 } else {
1102 u16 delta;
1103
1104 if (sc->prev_timestamp > timestamp)
1105 delta = (U16_MAX - sc->prev_timestamp + timestamp + 1);
1106 else
1107 delta = timestamp - sc->prev_timestamp;
1108 sc->timestamp_us += (delta * 16) / 3;
1109 }
1110 sc->prev_timestamp = timestamp;
1111 input_event(sc->sensor_dev, EV_MSC, MSC_TIMESTAMP, sc->timestamp_us);
1112
Roderick Colenbrander227c0112017-03-07 15:45:00 -08001113 offset = data_offset + DS4_INPUT_REPORT_GYRO_X_OFFSET;
Roderick Colenbrander55a07d62017-03-07 15:45:01 -08001114 for (n = 0; n < 6; n++) {
1115 /* Store data in int for more precision during mult_frac. */
1116 int raw_data = (short)((rd[offset+1] << 8) | rd[offset]);
1117 struct ds4_calibration_data *calib = &sc->ds4_calib_data[n];
Roderick Colenbrander227c0112017-03-07 15:45:00 -08001118
Roderick Colenbrander55a07d62017-03-07 15:45:01 -08001119 /* High precision is needed during calibration, but the
1120 * calibrated values are within 32-bit.
1121 * Note: we swap numerator 'x' and 'numer' in mult_frac for
1122 * precision reasons so we don't need 64-bit.
1123 */
1124 int calib_data = mult_frac(calib->sens_numer,
1125 raw_data - calib->bias,
1126 calib->sens_denom);
1127
1128 input_report_abs(sc->sensor_dev, calib->abs_code, calib_data);
1129 offset += 2;
Roderick Colenbrander227c0112017-03-07 15:45:00 -08001130 }
1131 input_sync(sc->sensor_dev);
1132
Frank Praznikad142b92014-02-20 11:36:00 -05001133 /*
Roderick Colenbrandercdc1c022016-10-07 12:39:38 -07001134 * The lower 4 bits of byte 30 (or 32 for BT) contain the battery level
Frank Praznikd902f472014-01-27 10:17:36 -05001135 * and the 5th bit contains the USB cable state.
1136 */
Roderick Colenbrandercdc1c022016-10-07 12:39:38 -07001137 offset = data_offset + DS4_INPUT_REPORT_BATTERY_OFFSET;
Frank Praznik6c5f8602014-02-05 20:03:47 -05001138 cable_state = (rd[offset] >> 4) & 0x01;
Frank Praznikd902f472014-01-27 10:17:36 -05001139
Frank Praznikad142b92014-02-20 11:36:00 -05001140 /*
Roderick Colenbrandera76a6c12020-11-09 23:22:27 -08001141 * Interpretation of the battery_capacity data depends on the cable state.
1142 * When no cable is connected (bit4 is 0):
1143 * - 0:10: percentage in units of 10%.
1144 * When a cable is plugged in:
1145 * - 0-10: percentage in units of 10%.
1146 * - 11: battery is full
1147 * - 14: not charging due to Voltage or temperature error
1148 * - 15: charge error
Frank Praznikd902f472014-01-27 10:17:36 -05001149 */
Roderick Colenbrandera76a6c12020-11-09 23:22:27 -08001150 if (cable_state) {
1151 u8 battery_data = rd[offset] & 0xf;
Frank Praznikd902f472014-01-27 10:17:36 -05001152
Roderick Colenbrandera76a6c12020-11-09 23:22:27 -08001153 if (battery_data < 10) {
1154 /* Take the mid-point for each battery capacity value,
1155 * because on the hardware side 0 = 0-9%, 1=10-19%, etc.
1156 * This matches official platform behavior, which does
1157 * the same.
1158 */
1159 battery_capacity = battery_data * 10 + 5;
1160 battery_status = POWER_SUPPLY_STATUS_CHARGING;
1161 } else if (battery_data == 10) {
1162 battery_capacity = 100;
1163 battery_status = POWER_SUPPLY_STATUS_CHARGING;
1164 } else if (battery_data == 11) {
1165 battery_capacity = 100;
1166 battery_status = POWER_SUPPLY_STATUS_FULL;
1167 } else { /* 14, 15 and undefined values */
1168 battery_capacity = 0;
1169 battery_status = POWER_SUPPLY_STATUS_UNKNOWN;
1170 }
1171 } else {
1172 u8 battery_data = rd[offset] & 0xf;
Frank Praznik6c5f8602014-02-05 20:03:47 -05001173
Roderick Colenbrandera76a6c12020-11-09 23:22:27 -08001174 if (battery_data < 10)
1175 battery_capacity = battery_data * 10 + 5;
1176 else /* 10 */
1177 battery_capacity = 100;
1178
1179 battery_status = POWER_SUPPLY_STATUS_DISCHARGING;
1180 }
Frank Praznikd902f472014-01-27 10:17:36 -05001181
1182 spin_lock_irqsave(&sc->lock, flags);
Frank Praznikd902f472014-01-27 10:17:36 -05001183 sc->battery_capacity = battery_capacity;
Roderick Colenbrandera76a6c12020-11-09 23:22:27 -08001184 sc->battery_status = battery_status;
Frank Praznikd902f472014-01-27 10:17:36 -05001185 spin_unlock_irqrestore(&sc->lock, flags);
Frank Praznike5606232014-01-27 10:17:37 -05001186
Frank Praznikad142b92014-02-20 11:36:00 -05001187 /*
Roderick Colenbrandercdc1c022016-10-07 12:39:38 -07001188 * The Dualshock 4 multi-touch trackpad data starts at offset 33 on USB
1189 * and 35 on Bluetooth.
1190 * The first byte indicates the number of touch data in the report.
1191 * Trackpad data starts 2 bytes later (e.g. 35 for USB).
Frank Praznike5606232014-01-27 10:17:37 -05001192 */
Roderick Colenbrandercdc1c022016-10-07 12:39:38 -07001193 offset = data_offset + DS4_INPUT_REPORT_TOUCHPAD_OFFSET;
Roderick Colenbrander35f436c2017-03-07 15:45:04 -08001194 max_touch_data = (sc->quirks & DUALSHOCK4_CONTROLLER_BT) ? 4 : 3;
Roderick Colenbrandercdc1c022016-10-07 12:39:38 -07001195 if (rd[offset] > 0 && rd[offset] <= max_touch_data)
1196 num_touch_data = rd[offset];
1197 else
1198 num_touch_data = 1;
1199 offset += 1;
Frank Praznike5606232014-01-27 10:17:37 -05001200
Roderick Colenbrandercdc1c022016-10-07 12:39:38 -07001201 for (m = 0; m < num_touch_data; m++) {
1202 /* Skip past timestamp */
1203 offset += 1;
Frank Praznike5606232014-01-27 10:17:37 -05001204
Roderick Colenbrandercdc1c022016-10-07 12:39:38 -07001205 /*
1206 * The first 7 bits of the first byte is a counter and bit 8 is
1207 * a touch indicator that is 0 when pressed and 1 when not
1208 * pressed.
1209 * The next 3 bytes are two 12 bit touch coordinates, X and Y.
1210 * The data for the second touch is in the same format and
1211 * immediately follows the data for the first.
1212 */
1213 for (n = 0; n < 2; n++) {
1214 u16 x, y;
1215 bool active;
Frank Praznike5606232014-01-27 10:17:37 -05001216
Roderick Colenbrandercdc1c022016-10-07 12:39:38 -07001217 x = rd[offset+1] | ((rd[offset+2] & 0xF) << 8);
1218 y = ((rd[offset+2] & 0xF0) >> 4) | (rd[offset+3] << 4);
1219
1220 active = !(rd[offset] >> 7);
Roderick Colenbranderac797b92016-11-23 14:07:07 -08001221 input_mt_slot(sc->touchpad, n);
1222 input_mt_report_slot_state(sc->touchpad, MT_TOOL_FINGER, active);
Roderick Colenbrandercdc1c022016-10-07 12:39:38 -07001223
1224 if (active) {
Roderick Colenbranderac797b92016-11-23 14:07:07 -08001225 input_report_abs(sc->touchpad, ABS_MT_POSITION_X, x);
1226 input_report_abs(sc->touchpad, ABS_MT_POSITION_Y, y);
Roderick Colenbrandercdc1c022016-10-07 12:39:38 -07001227 }
1228
1229 offset += 4;
1230 }
Roderick Colenbranderac797b92016-11-23 14:07:07 -08001231 input_mt_sync_frame(sc->touchpad);
1232 input_sync(sc->touchpad);
Frank Praznike5606232014-01-27 10:17:37 -05001233 }
Frank Praznikd902f472014-01-27 10:17:36 -05001234}
1235
Todd Kelnerb7289cb2018-02-17 16:47:10 -07001236static void nsg_mrxu_parse_report(struct sony_sc *sc, u8 *rd, int size)
1237{
1238 int n, offset, relx, rely;
1239 u8 active;
1240
1241 /*
1242 * The NSG-MRxU multi-touch trackpad data starts at offset 1 and
1243 * the touch-related data starts at offset 2.
1244 * For the first byte, bit 0 is set when touchpad button is pressed.
1245 * Bit 2 is set when a touch is active and the drag (Fn) key is pressed.
1246 * This drag key is mapped to BTN_LEFT. It is operational only when a
1247 * touch point is active.
1248 * Bit 4 is set when only the first touch point is active.
1249 * Bit 6 is set when only the second touch point is active.
1250 * Bits 5 and 7 are set when both touch points are active.
1251 * The next 3 bytes are two 12 bit X/Y coordinates for the first touch.
1252 * The following byte, offset 5, has the touch width and length.
1253 * Bits 0-4=X (width), bits 5-7=Y (length).
1254 * A signed relative X coordinate is at offset 6.
1255 * The bytes at offset 7-9 are the second touch X/Y coordinates.
1256 * Offset 10 has the second touch width and length.
1257 * Offset 11 has the relative Y coordinate.
1258 */
1259 offset = 1;
1260
1261 input_report_key(sc->touchpad, BTN_LEFT, rd[offset] & 0x0F);
1262 active = (rd[offset] >> 4);
1263 relx = (s8) rd[offset+5];
1264 rely = ((s8) rd[offset+10]) * -1;
1265
1266 offset++;
1267
1268 for (n = 0; n < 2; n++) {
1269 u16 x, y;
1270 u8 contactx, contacty;
1271
1272 x = rd[offset] | ((rd[offset+1] & 0x0F) << 8);
1273 y = ((rd[offset+1] & 0xF0) >> 4) | (rd[offset+2] << 4);
1274
1275 input_mt_slot(sc->touchpad, n);
1276 input_mt_report_slot_state(sc->touchpad, MT_TOOL_FINGER, active & 0x03);
1277
1278 if (active & 0x03) {
1279 contactx = rd[offset+3] & 0x0F;
1280 contacty = rd[offset+3] >> 4;
1281 input_report_abs(sc->touchpad, ABS_MT_TOUCH_MAJOR,
1282 max(contactx, contacty));
1283 input_report_abs(sc->touchpad, ABS_MT_TOUCH_MINOR,
1284 min(contactx, contacty));
1285 input_report_abs(sc->touchpad, ABS_MT_ORIENTATION,
1286 (bool) (contactx > contacty));
1287 input_report_abs(sc->touchpad, ABS_MT_POSITION_X, x);
1288 input_report_abs(sc->touchpad, ABS_MT_POSITION_Y,
1289 NSG_MRXU_MAX_Y - y);
1290 /*
1291 * The relative coordinates belong to the first touch
1292 * point, when present, or to the second touch point
1293 * when the first is not active.
1294 */
1295 if ((n == 0) || ((n == 1) && (active & 0x01))) {
1296 input_report_rel(sc->touchpad, REL_X, relx);
1297 input_report_rel(sc->touchpad, REL_Y, rely);
1298 }
1299 }
1300
1301 offset += 5;
1302 active >>= 2;
1303 }
1304
1305 input_mt_sync_frame(sc->touchpad);
1306
1307 input_sync(sc->touchpad);
1308}
1309
Simon Woodc9e4d872011-06-10 12:00:27 +02001310static int sony_raw_event(struct hid_device *hdev, struct hid_report *report,
Pavel Machek1adf9042016-02-09 13:55:08 +01001311 u8 *rd, int size)
Simon Woodc9e4d872011-06-10 12:00:27 +02001312{
1313 struct sony_sc *sc = hid_get_drvdata(hdev);
1314
Frank Praznikad142b92014-02-20 11:36:00 -05001315 /*
1316 * Sixaxis HID report has acclerometers/gyro with MSByte first, this
Simon Woodc9e4d872011-06-10 12:00:27 +02001317 * has to be BYTE_SWAPPED before passing up to joystick interface
1318 */
Frank Praznikfee4e2d2014-02-18 17:22:01 -05001319 if ((sc->quirks & SIXAXIS_CONTROLLER) && rd[0] == 0x01 && size == 49) {
Frank Praznik8f5f0bc2015-07-23 19:01:16 -04001320 /*
1321 * When connected via Bluetooth the Sixaxis occasionally sends
1322 * a report with the second byte 0xff and the rest zeroed.
1323 *
1324 * This report does not reflect the actual state of the
1325 * controller must be ignored to avoid generating false input
1326 * events.
1327 */
1328 if (rd[1] == 0xff)
1329 return -EINVAL;
1330
Simon Woodc9e4d872011-06-10 12:00:27 +02001331 swap(rd[41], rd[42]);
1332 swap(rd[43], rd[44]);
1333 swap(rd[45], rd[46]);
1334 swap(rd[47], rd[48]);
Frank Praznikd902f472014-01-27 10:17:36 -05001335
1336 sixaxis_parse_report(sc, rd, size);
Simon Wood12e9a6d72015-06-09 21:27:05 -06001337 } else if ((sc->quirks & MOTION_CONTROLLER_BT) && rd[0] == 0x01 && size == 49) {
1338 sixaxis_parse_report(sc, rd, size);
Simon Wood4545ee02015-06-17 00:08:52 -06001339 } else if ((sc->quirks & NAVIGATION_CONTROLLER) && rd[0] == 0x01 &&
1340 size == 49) {
1341 sixaxis_parse_report(sc, rd, size);
Roderick Colenbrander35f436c2017-03-07 15:45:04 -08001342 } else if ((sc->quirks & DUALSHOCK4_CONTROLLER_USB) && rd[0] == 0x01 &&
1343 size == 64) {
1344 dualshock4_parse_report(sc, rd, size);
1345 } else if (((sc->quirks & DUALSHOCK4_CONTROLLER_BT) && rd[0] == 0x11 &&
1346 size == 78)) {
1347 /* CRC check */
1348 u8 bthdr = 0xA1;
1349 u32 crc;
1350 u32 report_crc;
Roderick Colenbrander49b9ca62016-10-07 12:39:36 -07001351
Roderick Colenbrander35f436c2017-03-07 15:45:04 -08001352 crc = crc32_le(0xFFFFFFFF, &bthdr, 1);
1353 crc = ~crc32_le(crc, rd, DS4_INPUT_REPORT_0x11_SIZE-4);
1354 report_crc = get_unaligned_le32(&rd[DS4_INPUT_REPORT_0x11_SIZE-4]);
1355 if (crc != report_crc) {
1356 hid_dbg(sc->hdev, "DualShock 4 input report's CRC check failed, received crc 0x%0x != 0x%0x\n",
1357 report_crc, crc);
1358 return -EILSEQ;
Roderick Colenbrander49b9ca62016-10-07 12:39:36 -07001359 }
Roderick Colenbrander405182c2016-12-08 19:09:52 -08001360
Roderick Colenbrander35f436c2017-03-07 15:45:04 -08001361 dualshock4_parse_report(sc, rd, size);
1362 } else if ((sc->quirks & DUALSHOCK4_DONGLE) && rd[0] == 0x01 &&
1363 size == 64) {
Roderick Colenbranderf2f47c32017-03-07 15:45:06 -08001364 unsigned long flags;
1365 enum ds4_dongle_state dongle_state;
1366
Roderick Colenbrander405182c2016-12-08 19:09:52 -08001367 /*
1368 * In the case of a DS4 USB dongle, bit[2] of byte 31 indicates
1369 * if a DS4 is actually connected (indicated by '0').
1370 * For non-dongle, this bit is always 0 (connected).
1371 */
Roderick Colenbrander35f436c2017-03-07 15:45:04 -08001372 bool connected = (rd[31] & 0x04) ? false : true;
Roderick Colenbrander405182c2016-12-08 19:09:52 -08001373
Roderick Colenbranderf2f47c32017-03-07 15:45:06 -08001374 spin_lock_irqsave(&sc->lock, flags);
1375 dongle_state = sc->ds4_dongle_state;
1376 spin_unlock_irqrestore(&sc->lock, flags);
1377
1378 /*
1379 * The dongle always sends input reports even when no
1380 * DS4 is attached. When a DS4 is connected, we need to
1381 * obtain calibration data before we can use it.
1382 * The code below tracks dongle state and kicks of
1383 * calibration when needed and only allows us to process
1384 * input if a DS4 is actually connected.
1385 */
1386 if (dongle_state == DONGLE_DISCONNECTED && connected) {
Roderick Colenbrander35f436c2017-03-07 15:45:04 -08001387 hid_info(sc->hdev, "DualShock 4 USB dongle: controller connected\n");
1388 sony_set_leds(sc);
Roderick Colenbranderf2f47c32017-03-07 15:45:06 -08001389
1390 spin_lock_irqsave(&sc->lock, flags);
1391 sc->ds4_dongle_state = DONGLE_CALIBRATING;
1392 spin_unlock_irqrestore(&sc->lock, flags);
1393
1394 sony_schedule_work(sc, SONY_WORKER_HOTPLUG);
1395
1396 /* Don't process the report since we don't have
1397 * calibration data, but let hidraw have it anyway.
1398 */
1399 return 0;
1400 } else if ((dongle_state == DONGLE_CONNECTED ||
1401 dongle_state == DONGLE_DISABLED) && !connected) {
Roderick Colenbrander35f436c2017-03-07 15:45:04 -08001402 hid_info(sc->hdev, "DualShock 4 USB dongle: controller disconnected\n");
Roderick Colenbranderf2f47c32017-03-07 15:45:06 -08001403
1404 spin_lock_irqsave(&sc->lock, flags);
1405 sc->ds4_dongle_state = DONGLE_DISCONNECTED;
1406 spin_unlock_irqrestore(&sc->lock, flags);
1407
Roderick Colenbrander35f436c2017-03-07 15:45:04 -08001408 /* Return 0, so hidraw can get the report. */
1409 return 0;
Roderick Colenbranderf2f47c32017-03-07 15:45:06 -08001410 } else if (dongle_state == DONGLE_CALIBRATING ||
1411 dongle_state == DONGLE_DISABLED ||
1412 dongle_state == DONGLE_DISCONNECTED) {
Roderick Colenbrander35f436c2017-03-07 15:45:04 -08001413 /* Return 0, so hidraw can get the report. */
1414 return 0;
Roderick Colenbrander405182c2016-12-08 19:09:52 -08001415 }
1416
Frank Praznikd902f472014-01-27 10:17:36 -05001417 dualshock4_parse_report(sc, rd, size);
Todd Kelnerb7289cb2018-02-17 16:47:10 -07001418
1419 } else if ((sc->quirks & NSG_MRXU_REMOTE) && rd[0] == 0x02) {
1420 nsg_mrxu_parse_report(sc, rd, size);
1421 return 1;
Simon Woodc9e4d872011-06-10 12:00:27 +02001422 }
1423
Frank Praznik2a242932016-09-22 20:18:09 -04001424 if (sc->defer_initialization) {
1425 sc->defer_initialization = 0;
Roderick Colenbranderb5322732017-03-07 15:45:05 -08001426 sony_schedule_work(sc, SONY_WORKER_STATE);
Frank Praznik2a242932016-09-22 20:18:09 -04001427 }
1428
Simon Woodc9e4d872011-06-10 12:00:27 +02001429 return 0;
1430}
1431
Colin Leitnerf04d5142013-05-27 23:41:05 +02001432static int sony_mapping(struct hid_device *hdev, struct hid_input *hi,
1433 struct hid_field *field, struct hid_usage *usage,
1434 unsigned long **bit, int *max)
1435{
1436 struct sony_sc *sc = hid_get_drvdata(hdev);
1437
1438 if (sc->quirks & BUZZ_CONTROLLER) {
1439 unsigned int key = usage->hid & HID_USAGE;
1440
1441 if ((usage->hid & HID_USAGE_PAGE) != HID_UP_BUTTON)
1442 return -1;
1443
1444 switch (usage->collection_index) {
1445 case 1:
1446 if (key >= ARRAY_SIZE(buzz_keymap))
1447 return -1;
1448
1449 key = buzz_keymap[key];
1450 if (!key)
1451 return -1;
1452 break;
1453 default:
1454 return -1;
1455 }
1456
1457 hid_map_usage_clear(hi, usage, bit, max, EV_KEY, key);
1458 return 1;
1459 }
1460
Jiri Kosina078328d2013-06-13 12:03:49 +02001461 if (sc->quirks & PS3REMOTE)
1462 return ps3remote_mapping(hdev, hi, field, usage, bit, max);
1463
Roderick Colenbranderb8f09702017-03-24 15:17:46 -07001464 if (sc->quirks & NAVIGATION_CONTROLLER)
1465 return navigation_mapping(hdev, hi, field, usage, bit, max);
1466
Roderick Colenbrandere19a2672017-03-07 15:45:08 -08001467 if (sc->quirks & SIXAXIS_CONTROLLER)
1468 return sixaxis_mapping(hdev, hi, field, usage, bit, max);
Roderick Colenbrander9131f8c2016-11-23 14:07:08 -08001469
1470 if (sc->quirks & DUALSHOCK4_CONTROLLER)
1471 return ds4_mapping(hdev, hi, field, usage, bit, max);
1472
Sanjay Govind32e411d2020-12-04 18:45:27 +13001473 if (sc->quirks & GH_GUITAR_CONTROLLER)
Pascal Giardcc894ac2020-11-25 22:02:30 -05001474 return guitar_mapping(hdev, hi, field, usage, bit, max);
Roderick Colenbrandere19a2672017-03-07 15:45:08 -08001475
Benjamin Tissoires6f498012013-07-24 16:53:07 +02001476 /* Let hid-core decide for the others */
1477 return 0;
Colin Leitnerf04d5142013-05-27 23:41:05 +02001478}
1479
Roderick Colenbranderac797b92016-11-23 14:07:07 -08001480static int sony_register_touchpad(struct sony_sc *sc, int touch_count,
Todd Kelnerb7289cb2018-02-17 16:47:10 -07001481 int w, int h, int touch_major, int touch_minor, int orientation)
Frank Praznikce8efc32014-09-18 21:15:01 -04001482{
Roderick Colenbranderac797b92016-11-23 14:07:07 -08001483 size_t name_sz;
1484 char *name;
Frank Praznikce8efc32014-09-18 21:15:01 -04001485 int ret;
1486
Hanno Zullacc070a82018-06-14 16:29:08 +02001487 sc->touchpad = devm_input_allocate_device(&sc->hdev->dev);
Roderick Colenbranderac797b92016-11-23 14:07:07 -08001488 if (!sc->touchpad)
1489 return -ENOMEM;
Frank Praznikce8efc32014-09-18 21:15:01 -04001490
Roderick Colenbranderac797b92016-11-23 14:07:07 -08001491 input_set_drvdata(sc->touchpad, sc);
1492 sc->touchpad->dev.parent = &sc->hdev->dev;
1493 sc->touchpad->phys = sc->hdev->phys;
1494 sc->touchpad->uniq = sc->hdev->uniq;
1495 sc->touchpad->id.bustype = sc->hdev->bus;
1496 sc->touchpad->id.vendor = sc->hdev->vendor;
1497 sc->touchpad->id.product = sc->hdev->product;
1498 sc->touchpad->id.version = sc->hdev->version;
1499
1500 /* Append a suffix to the controller name as there are various
1501 * DS4 compatible non-Sony devices with different names.
1502 */
1503 name_sz = strlen(sc->hdev->name) + sizeof(DS4_TOUCHPAD_SUFFIX);
Hanno Zullacc070a82018-06-14 16:29:08 +02001504 name = devm_kzalloc(&sc->hdev->dev, name_sz, GFP_KERNEL);
1505 if (!name)
1506 return -ENOMEM;
Roderick Colenbranderac797b92016-11-23 14:07:07 -08001507 snprintf(name, name_sz, "%s" DS4_TOUCHPAD_SUFFIX, sc->hdev->name);
1508 sc->touchpad->name = name;
1509
Roderick Colenbranderac797b92016-11-23 14:07:07 -08001510 /* We map the button underneath the touchpad to BTN_LEFT. */
1511 __set_bit(EV_KEY, sc->touchpad->evbit);
1512 __set_bit(BTN_LEFT, sc->touchpad->keybit);
1513 __set_bit(INPUT_PROP_BUTTONPAD, sc->touchpad->propbit);
1514
1515 input_set_abs_params(sc->touchpad, ABS_MT_POSITION_X, 0, w, 0, 0);
1516 input_set_abs_params(sc->touchpad, ABS_MT_POSITION_Y, 0, h, 0, 0);
1517
Todd Kelnerb7289cb2018-02-17 16:47:10 -07001518 if (touch_major > 0) {
1519 input_set_abs_params(sc->touchpad, ABS_MT_TOUCH_MAJOR,
1520 0, touch_major, 0, 0);
1521 if (touch_minor > 0)
1522 input_set_abs_params(sc->touchpad, ABS_MT_TOUCH_MINOR,
1523 0, touch_minor, 0, 0);
1524 if (orientation > 0)
1525 input_set_abs_params(sc->touchpad, ABS_MT_ORIENTATION,
1526 0, orientation, 0, 0);
1527 }
1528
1529 if (sc->quirks & NSG_MRXU_REMOTE) {
1530 __set_bit(EV_REL, sc->touchpad->evbit);
1531 }
1532
1533 ret = input_mt_init_slots(sc->touchpad, touch_count, INPUT_MT_POINTER);
1534 if (ret < 0)
Hanno Zullacc070a82018-06-14 16:29:08 +02001535 return ret;
Todd Kelnerb7289cb2018-02-17 16:47:10 -07001536
Roderick Colenbranderac797b92016-11-23 14:07:07 -08001537 ret = input_register_device(sc->touchpad);
1538 if (ret < 0)
Hanno Zullacc070a82018-06-14 16:29:08 +02001539 return ret;
Frank Praznikce8efc32014-09-18 21:15:01 -04001540
1541 return 0;
Roderick Colenbranderac797b92016-11-23 14:07:07 -08001542}
Frank Praznikce8efc32014-09-18 21:15:01 -04001543
Roderick Colenbrander227c0112017-03-07 15:45:00 -08001544static int sony_register_sensors(struct sony_sc *sc)
1545{
1546 size_t name_sz;
1547 char *name;
1548 int ret;
Roderick Colenbrander55a07d62017-03-07 15:45:01 -08001549 int range;
Roderick Colenbrander227c0112017-03-07 15:45:00 -08001550
Hanno Zullaea4a5fd2018-06-14 16:30:02 +02001551 sc->sensor_dev = devm_input_allocate_device(&sc->hdev->dev);
Roderick Colenbrander227c0112017-03-07 15:45:00 -08001552 if (!sc->sensor_dev)
1553 return -ENOMEM;
1554
1555 input_set_drvdata(sc->sensor_dev, sc);
1556 sc->sensor_dev->dev.parent = &sc->hdev->dev;
1557 sc->sensor_dev->phys = sc->hdev->phys;
1558 sc->sensor_dev->uniq = sc->hdev->uniq;
1559 sc->sensor_dev->id.bustype = sc->hdev->bus;
1560 sc->sensor_dev->id.vendor = sc->hdev->vendor;
1561 sc->sensor_dev->id.product = sc->hdev->product;
1562 sc->sensor_dev->id.version = sc->hdev->version;
1563
1564 /* Append a suffix to the controller name as there are various
1565 * DS4 compatible non-Sony devices with different names.
1566 */
Roderick Colenbrander510c8b72017-03-07 15:45:10 -08001567 name_sz = strlen(sc->hdev->name) + sizeof(SENSOR_SUFFIX);
Hanno Zullaea4a5fd2018-06-14 16:30:02 +02001568 name = devm_kzalloc(&sc->hdev->dev, name_sz, GFP_KERNEL);
1569 if (!name)
1570 return -ENOMEM;
Roderick Colenbrander510c8b72017-03-07 15:45:10 -08001571 snprintf(name, name_sz, "%s" SENSOR_SUFFIX, sc->hdev->name);
Roderick Colenbrander227c0112017-03-07 15:45:00 -08001572 sc->sensor_dev->name = name;
1573
Roderick Colenbrander510c8b72017-03-07 15:45:10 -08001574 if (sc->quirks & SIXAXIS_CONTROLLER) {
1575 /* For the DS3 we only support the accelerometer, which works
1576 * quite well even without calibration. The device also has
1577 * a 1-axis gyro, but it is very difficult to manage from within
1578 * the driver even to get data, the sensor is inaccurate and
1579 * the behavior is very different between hardware revisions.
1580 */
1581 input_set_abs_params(sc->sensor_dev, ABS_X, -512, 511, 4, 0);
1582 input_set_abs_params(sc->sensor_dev, ABS_Y, -512, 511, 4, 0);
1583 input_set_abs_params(sc->sensor_dev, ABS_Z, -512, 511, 4, 0);
1584 input_abs_set_res(sc->sensor_dev, ABS_X, SIXAXIS_ACC_RES_PER_G);
1585 input_abs_set_res(sc->sensor_dev, ABS_Y, SIXAXIS_ACC_RES_PER_G);
1586 input_abs_set_res(sc->sensor_dev, ABS_Z, SIXAXIS_ACC_RES_PER_G);
1587 } else if (sc->quirks & DUALSHOCK4_CONTROLLER) {
1588 range = DS4_ACC_RES_PER_G*4;
1589 input_set_abs_params(sc->sensor_dev, ABS_X, -range, range, 16, 0);
1590 input_set_abs_params(sc->sensor_dev, ABS_Y, -range, range, 16, 0);
1591 input_set_abs_params(sc->sensor_dev, ABS_Z, -range, range, 16, 0);
1592 input_abs_set_res(sc->sensor_dev, ABS_X, DS4_ACC_RES_PER_G);
1593 input_abs_set_res(sc->sensor_dev, ABS_Y, DS4_ACC_RES_PER_G);
1594 input_abs_set_res(sc->sensor_dev, ABS_Z, DS4_ACC_RES_PER_G);
Roderick Colenbrander227c0112017-03-07 15:45:00 -08001595
Roderick Colenbrander510c8b72017-03-07 15:45:10 -08001596 range = DS4_GYRO_RES_PER_DEG_S*2048;
1597 input_set_abs_params(sc->sensor_dev, ABS_RX, -range, range, 16, 0);
1598 input_set_abs_params(sc->sensor_dev, ABS_RY, -range, range, 16, 0);
1599 input_set_abs_params(sc->sensor_dev, ABS_RZ, -range, range, 16, 0);
1600 input_abs_set_res(sc->sensor_dev, ABS_RX, DS4_GYRO_RES_PER_DEG_S);
1601 input_abs_set_res(sc->sensor_dev, ABS_RY, DS4_GYRO_RES_PER_DEG_S);
1602 input_abs_set_res(sc->sensor_dev, ABS_RZ, DS4_GYRO_RES_PER_DEG_S);
Roderick Colenbrander227c0112017-03-07 15:45:00 -08001603
Roderick Colenbrander510c8b72017-03-07 15:45:10 -08001604 __set_bit(EV_MSC, sc->sensor_dev->evbit);
1605 __set_bit(MSC_TIMESTAMP, sc->sensor_dev->mscbit);
1606 }
1607
Roderick Colenbrander227c0112017-03-07 15:45:00 -08001608 __set_bit(INPUT_PROP_ACCELEROMETER, sc->sensor_dev->propbit);
1609
1610 ret = input_register_device(sc->sensor_dev);
1611 if (ret < 0)
Hanno Zullaea4a5fd2018-06-14 16:30:02 +02001612 return ret;
Roderick Colenbrander227c0112017-03-07 15:45:00 -08001613
1614 return 0;
Roderick Colenbrander227c0112017-03-07 15:45:00 -08001615}
1616
Antonio Ospite5710fab2011-02-20 18:26:45 +01001617/*
Jiri Slabybd28ce02008-06-25 23:47:04 +02001618 * Sending HID_REQ_GET_REPORT changes the operation mode of the ps3 controller
1619 * to "operational". Without this, the ps3 controller will not report any
1620 * events.
1621 */
Antonio Ospite816651a2010-05-03 22:15:55 +02001622static int sixaxis_set_operational_usb(struct hid_device *hdev)
Jiri Slabybd28ce02008-06-25 23:47:04 +02001623{
Hongye Yuan69481052019-01-09 09:18:08 +08001624 struct sony_sc *sc = hid_get_drvdata(hdev);
Antonio Ospitea85d67b2015-02-16 18:12:22 +01001625 const int buf_size =
1626 max(SIXAXIS_REPORT_0xF2_SIZE, SIXAXIS_REPORT_0xF5_SIZE);
Pavel Machek1adf9042016-02-09 13:55:08 +01001627 u8 *buf;
Jiri Slabybd28ce02008-06-25 23:47:04 +02001628 int ret;
Jiri Slabybd28ce02008-06-25 23:47:04 +02001629
Antonio Ospite2e701a32015-02-16 18:12:24 +01001630 buf = kmalloc(buf_size, GFP_KERNEL);
Jiri Slabybd28ce02008-06-25 23:47:04 +02001631 if (!buf)
1632 return -ENOMEM;
1633
Antonio Ospitea85d67b2015-02-16 18:12:22 +01001634 ret = hid_hw_raw_request(hdev, 0xf2, buf, SIXAXIS_REPORT_0xF2_SIZE,
1635 HID_FEATURE_REPORT, HID_REQ_GET_REPORT);
Lauri Kasanena7de9b82015-02-16 15:06:59 +02001636 if (ret < 0) {
1637 hid_err(hdev, "can't set operational mode: step 1\n");
1638 goto out;
1639 }
Benjamin Tissoiresf204828a2013-09-11 22:12:25 +02001640
Lauri Kasanena7de9b82015-02-16 15:06:59 +02001641 /*
1642 * Some compatible controllers like the Speedlink Strike FX and
1643 * Gasia need another query plus an USB interrupt to get operational.
1644 */
Antonio Ospitea85d67b2015-02-16 18:12:22 +01001645 ret = hid_hw_raw_request(hdev, 0xf5, buf, SIXAXIS_REPORT_0xF5_SIZE,
1646 HID_FEATURE_REPORT, HID_REQ_GET_REPORT);
Lauri Kasanena7de9b82015-02-16 15:06:59 +02001647 if (ret < 0) {
1648 hid_err(hdev, "can't set operational mode: step 2\n");
1649 goto out;
1650 }
1651
Bastien Nocera492ca832017-11-07 15:24:47 +01001652 /*
1653 * But the USB interrupt would cause SHANWAN controllers to
Hongye Yuan69481052019-01-09 09:18:08 +08001654 * start rumbling non-stop, so skip step 3 for these controllers.
Bastien Nocera492ca832017-11-07 15:24:47 +01001655 */
Hongye Yuan69481052019-01-09 09:18:08 +08001656 if (sc->quirks & SHANWAN_GAMEPAD)
1657 goto out;
1658
1659 ret = hid_hw_output_report(hdev, buf, 1);
1660 if (ret < 0) {
1661 hid_info(hdev, "can't set operational mode: step 3, ignoring\n");
1662 ret = 0;
Benjamin Tissoires19f4c2b2016-01-08 17:58:49 +01001663 }
Jiri Slabybd28ce02008-06-25 23:47:04 +02001664
Lauri Kasanena7de9b82015-02-16 15:06:59 +02001665out:
Jiri Slabybd28ce02008-06-25 23:47:04 +02001666 kfree(buf);
1667
1668 return ret;
1669}
1670
Antonio Ospite816651a2010-05-03 22:15:55 +02001671static int sixaxis_set_operational_bt(struct hid_device *hdev)
Bastien Noceraf9ce7c22010-01-20 12:01:53 +00001672{
Pavel Machek1adf9042016-02-09 13:55:08 +01001673 static const u8 report[] = { 0xf4, 0x42, 0x03, 0x00, 0x00 };
1674 u8 *buf;
Frank Praznik9b2b5c92014-11-12 14:10:09 -05001675 int ret;
1676
1677 buf = kmemdup(report, sizeof(report), GFP_KERNEL);
1678 if (!buf)
1679 return -ENOMEM;
1680
1681 ret = hid_hw_raw_request(hdev, buf[0], buf, sizeof(report),
Benjamin Tissoiresb0dd72a2014-02-10 12:58:54 -05001682 HID_FEATURE_REPORT, HID_REQ_SET_REPORT);
Frank Praznik9b2b5c92014-11-12 14:10:09 -05001683
1684 kfree(buf);
1685
1686 return ret;
Bastien Noceraf9ce7c22010-01-20 12:01:53 +00001687}
1688
Frank Praznikad142b92014-02-20 11:36:00 -05001689/*
Roderick Colenbrander55a07d62017-03-07 15:45:01 -08001690 * Request DS4 calibration data for the motion sensors.
1691 * For Bluetooth this also affects the operating mode (see below).
Frank Praznik68330d82014-02-05 20:03:49 -05001692 */
Roderick Colenbrander55a07d62017-03-07 15:45:01 -08001693static int dualshock4_get_calibration_data(struct sony_sc *sc)
Frank Praznik68330d82014-02-05 20:03:49 -05001694{
Pavel Machek1adf9042016-02-09 13:55:08 +01001695 u8 *buf;
Frank Praznik9b2b5c92014-11-12 14:10:09 -05001696 int ret;
Roderick Colenbrander55a07d62017-03-07 15:45:01 -08001697 short gyro_pitch_bias, gyro_pitch_plus, gyro_pitch_minus;
1698 short gyro_yaw_bias, gyro_yaw_plus, gyro_yaw_minus;
1699 short gyro_roll_bias, gyro_roll_plus, gyro_roll_minus;
1700 short gyro_speed_plus, gyro_speed_minus;
1701 short acc_x_plus, acc_x_minus;
1702 short acc_y_plus, acc_y_minus;
1703 short acc_z_plus, acc_z_minus;
1704 int speed_2x;
1705 int range_2g;
Frank Praznik68330d82014-02-05 20:03:49 -05001706
Roderick Colenbrander55a07d62017-03-07 15:45:01 -08001707 /* For Bluetooth we use a different request, which supports CRC.
1708 * Note: in Bluetooth mode feature report 0x02 also changes the state
1709 * of the controller, so that it sends input reports of type 0x11.
1710 */
Roderick Colenbrander35f436c2017-03-07 15:45:04 -08001711 if (sc->quirks & (DUALSHOCK4_CONTROLLER_USB | DUALSHOCK4_DONGLE)) {
Roderick Colenbranderf5dc93b2020-11-09 23:22:28 -08001712 int retries;
1713
Roderick Colenbrander55a07d62017-03-07 15:45:01 -08001714 buf = kmalloc(DS4_FEATURE_REPORT_0x02_SIZE, GFP_KERNEL);
1715 if (!buf)
1716 return -ENOMEM;
Frank Praznik9b2b5c92014-11-12 14:10:09 -05001717
Roderick Colenbranderf5dc93b2020-11-09 23:22:28 -08001718 /* We should normally receive the feature report data we asked
1719 * for, but hidraw applications such as Steam can issue feature
1720 * reports as well. In particular for Dongle reconnects, Steam
1721 * and this function are competing resulting in often receiving
1722 * data for a different HID report, so retry a few times.
1723 */
1724 for (retries = 0; retries < 3; retries++) {
1725 ret = hid_hw_raw_request(sc->hdev, 0x02, buf,
1726 DS4_FEATURE_REPORT_0x02_SIZE,
1727 HID_FEATURE_REPORT,
1728 HID_REQ_GET_REPORT);
1729 if (ret < 0)
1730 goto err_stop;
1731
1732 if (buf[0] != 0x02) {
1733 if (retries < 2) {
1734 hid_warn(sc->hdev, "Retrying DualShock 4 get calibration report (0x02) request\n");
1735 continue;
1736 } else {
1737 ret = -EILSEQ;
1738 goto err_stop;
1739 }
1740 } else {
1741 break;
1742 }
1743 }
Roderick Colenbrander55a07d62017-03-07 15:45:01 -08001744 } else {
1745 u8 bthdr = 0xA3;
1746 u32 crc;
1747 u32 report_crc;
1748 int retries;
Frank Praznik9b2b5c92014-11-12 14:10:09 -05001749
Roderick Colenbrander55a07d62017-03-07 15:45:01 -08001750 buf = kmalloc(DS4_FEATURE_REPORT_0x05_SIZE, GFP_KERNEL);
1751 if (!buf)
1752 return -ENOMEM;
1753
1754 for (retries = 0; retries < 3; retries++) {
1755 ret = hid_hw_raw_request(sc->hdev, 0x05, buf,
1756 DS4_FEATURE_REPORT_0x05_SIZE,
1757 HID_FEATURE_REPORT,
1758 HID_REQ_GET_REPORT);
1759 if (ret < 0)
1760 goto err_stop;
1761
1762 /* CRC check */
1763 crc = crc32_le(0xFFFFFFFF, &bthdr, 1);
1764 crc = ~crc32_le(crc, buf, DS4_FEATURE_REPORT_0x05_SIZE-4);
1765 report_crc = get_unaligned_le32(&buf[DS4_FEATURE_REPORT_0x05_SIZE-4]);
1766 if (crc != report_crc) {
1767 hid_warn(sc->hdev, "DualShock 4 calibration report's CRC check failed, received crc 0x%0x != 0x%0x\n",
1768 report_crc, crc);
1769 if (retries < 2) {
1770 hid_warn(sc->hdev, "Retrying DualShock 4 get calibration report request\n");
1771 continue;
1772 } else {
1773 ret = -EILSEQ;
1774 goto err_stop;
1775 }
1776 } else {
1777 break;
1778 }
1779 }
1780 }
1781
1782 gyro_pitch_bias = get_unaligned_le16(&buf[1]);
1783 gyro_yaw_bias = get_unaligned_le16(&buf[3]);
1784 gyro_roll_bias = get_unaligned_le16(&buf[5]);
1785 if (sc->quirks & DUALSHOCK4_CONTROLLER_USB) {
1786 gyro_pitch_plus = get_unaligned_le16(&buf[7]);
1787 gyro_pitch_minus = get_unaligned_le16(&buf[9]);
1788 gyro_yaw_plus = get_unaligned_le16(&buf[11]);
1789 gyro_yaw_minus = get_unaligned_le16(&buf[13]);
1790 gyro_roll_plus = get_unaligned_le16(&buf[15]);
1791 gyro_roll_minus = get_unaligned_le16(&buf[17]);
1792 } else {
Roderick Colenbrander35f436c2017-03-07 15:45:04 -08001793 /* BT + Dongle */
Roderick Colenbrander55a07d62017-03-07 15:45:01 -08001794 gyro_pitch_plus = get_unaligned_le16(&buf[7]);
1795 gyro_yaw_plus = get_unaligned_le16(&buf[9]);
1796 gyro_roll_plus = get_unaligned_le16(&buf[11]);
1797 gyro_pitch_minus = get_unaligned_le16(&buf[13]);
1798 gyro_yaw_minus = get_unaligned_le16(&buf[15]);
1799 gyro_roll_minus = get_unaligned_le16(&buf[17]);
1800 }
1801 gyro_speed_plus = get_unaligned_le16(&buf[19]);
1802 gyro_speed_minus = get_unaligned_le16(&buf[21]);
1803 acc_x_plus = get_unaligned_le16(&buf[23]);
1804 acc_x_minus = get_unaligned_le16(&buf[25]);
1805 acc_y_plus = get_unaligned_le16(&buf[27]);
1806 acc_y_minus = get_unaligned_le16(&buf[29]);
1807 acc_z_plus = get_unaligned_le16(&buf[31]);
1808 acc_z_minus = get_unaligned_le16(&buf[33]);
1809
1810 /* Set gyroscope calibration and normalization parameters.
1811 * Data values will be normalized to 1/DS4_GYRO_RES_PER_DEG_S degree/s.
1812 */
1813 speed_2x = (gyro_speed_plus + gyro_speed_minus);
1814 sc->ds4_calib_data[0].abs_code = ABS_RX;
1815 sc->ds4_calib_data[0].bias = gyro_pitch_bias;
1816 sc->ds4_calib_data[0].sens_numer = speed_2x*DS4_GYRO_RES_PER_DEG_S;
1817 sc->ds4_calib_data[0].sens_denom = gyro_pitch_plus - gyro_pitch_minus;
1818
1819 sc->ds4_calib_data[1].abs_code = ABS_RY;
1820 sc->ds4_calib_data[1].bias = gyro_yaw_bias;
1821 sc->ds4_calib_data[1].sens_numer = speed_2x*DS4_GYRO_RES_PER_DEG_S;
1822 sc->ds4_calib_data[1].sens_denom = gyro_yaw_plus - gyro_yaw_minus;
1823
1824 sc->ds4_calib_data[2].abs_code = ABS_RZ;
1825 sc->ds4_calib_data[2].bias = gyro_roll_bias;
1826 sc->ds4_calib_data[2].sens_numer = speed_2x*DS4_GYRO_RES_PER_DEG_S;
1827 sc->ds4_calib_data[2].sens_denom = gyro_roll_plus - gyro_roll_minus;
1828
1829 /* Set accelerometer calibration and normalization parameters.
1830 * Data values will be normalized to 1/DS4_ACC_RES_PER_G G.
1831 */
1832 range_2g = acc_x_plus - acc_x_minus;
1833 sc->ds4_calib_data[3].abs_code = ABS_X;
1834 sc->ds4_calib_data[3].bias = acc_x_plus - range_2g / 2;
1835 sc->ds4_calib_data[3].sens_numer = 2*DS4_ACC_RES_PER_G;
1836 sc->ds4_calib_data[3].sens_denom = range_2g;
1837
1838 range_2g = acc_y_plus - acc_y_minus;
1839 sc->ds4_calib_data[4].abs_code = ABS_Y;
1840 sc->ds4_calib_data[4].bias = acc_y_plus - range_2g / 2;
1841 sc->ds4_calib_data[4].sens_numer = 2*DS4_ACC_RES_PER_G;
1842 sc->ds4_calib_data[4].sens_denom = range_2g;
1843
1844 range_2g = acc_z_plus - acc_z_minus;
1845 sc->ds4_calib_data[5].abs_code = ABS_Z;
1846 sc->ds4_calib_data[5].bias = acc_z_plus - range_2g / 2;
1847 sc->ds4_calib_data[5].sens_numer = 2*DS4_ACC_RES_PER_G;
1848 sc->ds4_calib_data[5].sens_denom = range_2g;
1849
1850err_stop:
Frank Praznik9b2b5c92014-11-12 14:10:09 -05001851 kfree(buf);
Frank Praznik9b2b5c92014-11-12 14:10:09 -05001852 return ret;
Jiri Slabybd28ce02008-06-25 23:47:04 +02001853}
1854
Roderick Colenbranderf2f47c32017-03-07 15:45:06 -08001855static void dualshock4_calibration_work(struct work_struct *work)
1856{
1857 struct sony_sc *sc = container_of(work, struct sony_sc, hotplug_worker);
1858 unsigned long flags;
1859 enum ds4_dongle_state dongle_state;
1860 int ret;
1861
1862 ret = dualshock4_get_calibration_data(sc);
1863 if (ret < 0) {
1864 /* This call is very unlikely to fail for the dongle. When it
1865 * fails we are probably in a very bad state, so mark the
1866 * dongle as disabled. We will re-enable the dongle if a new
1867 * DS4 hotplug is detect from sony_raw_event as any issues
1868 * are likely resolved then (the dongle is quite stupid).
1869 */
1870 hid_err(sc->hdev, "DualShock 4 USB dongle: calibration failed, disabling device\n");
1871 dongle_state = DONGLE_DISABLED;
1872 } else {
1873 hid_info(sc->hdev, "DualShock 4 USB dongle: calibration completed\n");
1874 dongle_state = DONGLE_CONNECTED;
1875 }
1876
1877 spin_lock_irqsave(&sc->lock, flags);
1878 sc->ds4_dongle_state = dongle_state;
1879 spin_unlock_irqrestore(&sc->lock, flags);
1880}
1881
Roderick Colenbrander169f15a2017-12-19 11:04:43 -08001882static int dualshock4_get_version_info(struct sony_sc *sc)
1883{
1884 u8 *buf;
1885 int ret;
1886
1887 buf = kmalloc(DS4_FEATURE_REPORT_0xA3_SIZE, GFP_KERNEL);
1888 if (!buf)
1889 return -ENOMEM;
1890
1891 ret = hid_hw_raw_request(sc->hdev, 0xA3, buf,
1892 DS4_FEATURE_REPORT_0xA3_SIZE,
1893 HID_FEATURE_REPORT,
1894 HID_REQ_GET_REPORT);
1895 if (ret < 0) {
1896 kfree(buf);
1897 return ret;
1898 }
1899
1900 sc->hw_version = get_unaligned_le16(&buf[35]);
1901 sc->fw_version = get_unaligned_le16(&buf[41]);
1902
1903 kfree(buf);
1904 return 0;
1905}
1906
Frank Praznik221399b2015-05-05 20:47:32 -04001907static void sixaxis_set_leds_from_id(struct sony_sc *sc)
Frank Praznik80250872014-04-14 10:11:35 -04001908{
Pavel Machek1adf9042016-02-09 13:55:08 +01001909 static const u8 sixaxis_leds[10][4] = {
Frank Praznik80250872014-04-14 10:11:35 -04001910 { 0x01, 0x00, 0x00, 0x00 },
1911 { 0x00, 0x01, 0x00, 0x00 },
1912 { 0x00, 0x00, 0x01, 0x00 },
1913 { 0x00, 0x00, 0x00, 0x01 },
1914 { 0x01, 0x00, 0x00, 0x01 },
1915 { 0x00, 0x01, 0x00, 0x01 },
1916 { 0x00, 0x00, 0x01, 0x01 },
1917 { 0x01, 0x00, 0x01, 0x01 },
1918 { 0x00, 0x01, 0x01, 0x01 },
1919 { 0x01, 0x01, 0x01, 0x01 }
1920 };
1921
Frank Praznik221399b2015-05-05 20:47:32 -04001922 int id = sc->device_id;
1923
1924 BUILD_BUG_ON(MAX_LEDS < ARRAY_SIZE(sixaxis_leds[0]));
Frank Praznik80250872014-04-14 10:11:35 -04001925
1926 if (id < 0)
1927 return;
1928
1929 id %= 10;
Frank Praznik221399b2015-05-05 20:47:32 -04001930 memcpy(sc->led_state, sixaxis_leds[id], sizeof(sixaxis_leds[id]));
Frank Praznik80250872014-04-14 10:11:35 -04001931}
1932
Frank Praznik221399b2015-05-05 20:47:32 -04001933static void dualshock4_set_leds_from_id(struct sony_sc *sc)
Frank Praznik80250872014-04-14 10:11:35 -04001934{
1935 /* The first 4 color/index entries match what the PS4 assigns */
Pavel Machek1adf9042016-02-09 13:55:08 +01001936 static const u8 color_code[7][3] = {
Roderick Colenbrander39254a12017-03-24 15:17:47 -07001937 /* Blue */ { 0x00, 0x00, 0x40 },
1938 /* Red */ { 0x40, 0x00, 0x00 },
1939 /* Green */ { 0x00, 0x40, 0x00 },
1940 /* Pink */ { 0x20, 0x00, 0x20 },
Frank Praznik80250872014-04-14 10:11:35 -04001941 /* Orange */ { 0x02, 0x01, 0x00 },
1942 /* Teal */ { 0x00, 0x01, 0x01 },
1943 /* White */ { 0x01, 0x01, 0x01 }
1944 };
1945
Frank Praznik221399b2015-05-05 20:47:32 -04001946 int id = sc->device_id;
1947
1948 BUILD_BUG_ON(MAX_LEDS < ARRAY_SIZE(color_code[0]));
Frank Praznik80250872014-04-14 10:11:35 -04001949
1950 if (id < 0)
1951 return;
1952
1953 id %= 7;
Frank Praznik221399b2015-05-05 20:47:32 -04001954 memcpy(sc->led_state, color_code[id], sizeof(color_code[id]));
Frank Praznik80250872014-04-14 10:11:35 -04001955}
1956
Frank Praznik221399b2015-05-05 20:47:32 -04001957static void buzz_set_leds(struct sony_sc *sc)
Colin Leitnerf04d5142013-05-27 23:41:05 +02001958{
Frank Praznik221399b2015-05-05 20:47:32 -04001959 struct hid_device *hdev = sc->hdev;
Colin Leitnerf04d5142013-05-27 23:41:05 +02001960 struct list_head *report_list =
1961 &hdev->report_enum[HID_OUTPUT_REPORT].report_list;
1962 struct hid_report *report = list_entry(report_list->next,
1963 struct hid_report, list);
Pavel Machek1adf9042016-02-09 13:55:08 +01001964 s32 *value = report->field[0]->value;
Colin Leitnerf04d5142013-05-27 23:41:05 +02001965
Frank Praznik221399b2015-05-05 20:47:32 -04001966 BUILD_BUG_ON(MAX_LEDS < 4);
1967
Colin Leitnerf04d5142013-05-27 23:41:05 +02001968 value[0] = 0x00;
Frank Praznik221399b2015-05-05 20:47:32 -04001969 value[1] = sc->led_state[0] ? 0xff : 0x00;
1970 value[2] = sc->led_state[1] ? 0xff : 0x00;
1971 value[3] = sc->led_state[2] ? 0xff : 0x00;
1972 value[4] = sc->led_state[3] ? 0xff : 0x00;
Colin Leitnerf04d5142013-05-27 23:41:05 +02001973 value[5] = 0x00;
1974 value[6] = 0x00;
1975 hid_hw_request(hdev, report, HID_REQ_SET_REPORT);
1976}
1977
Frank Praznik221399b2015-05-05 20:47:32 -04001978static void sony_set_leds(struct sony_sc *sc)
Sven Eckelmann0a286ef2013-11-19 20:26:32 +01001979{
Frank Praznik221399b2015-05-05 20:47:32 -04001980 if (!(sc->quirks & BUZZ_CONTROLLER))
Roderick Colenbranderb5322732017-03-07 15:45:05 -08001981 sony_schedule_work(sc, SONY_WORKER_STATE);
Frank Praznik221399b2015-05-05 20:47:32 -04001982 else
1983 buzz_set_leds(sc);
Sven Eckelmann0a286ef2013-11-19 20:26:32 +01001984}
1985
Sven Eckelmannc5382512013-11-19 20:26:30 +01001986static void sony_led_set_brightness(struct led_classdev *led,
Colin Leitnerf04d5142013-05-27 23:41:05 +02001987 enum led_brightness value)
1988{
1989 struct device *dev = led->dev->parent;
Geliang Tangee79a8f2015-12-27 17:25:21 +08001990 struct hid_device *hdev = to_hid_device(dev);
Colin Leitnerf04d5142013-05-27 23:41:05 +02001991 struct sony_sc *drv_data;
Colin Leitnerf04d5142013-05-27 23:41:05 +02001992
1993 int n;
Frank Praznikb3ed4582014-04-14 10:11:36 -04001994 int force_update;
Colin Leitnerf04d5142013-05-27 23:41:05 +02001995
1996 drv_data = hid_get_drvdata(hdev);
Sven Eckelmann2251b852013-11-19 20:26:31 +01001997 if (!drv_data) {
Colin Leitnerf04d5142013-05-27 23:41:05 +02001998 hid_err(hdev, "No device data\n");
1999 return;
2000 }
Colin Leitnerf04d5142013-05-27 23:41:05 +02002001
Frank Praznikb3ed4582014-04-14 10:11:36 -04002002 /*
2003 * The Sixaxis on USB will override any LED settings sent to it
2004 * and keep flashing all of the LEDs until the PS button is pressed.
2005 * Updates, even if redundant, must be always be sent to the
2006 * controller to avoid having to toggle the state of an LED just to
2007 * stop the flashing later on.
2008 */
2009 force_update = !!(drv_data->quirks & SIXAXIS_CONTROLLER_USB);
2010
Frank Praznik60781cf2014-01-11 15:13:15 -05002011 for (n = 0; n < drv_data->led_count; n++) {
Frank Praznikb3ed4582014-04-14 10:11:36 -04002012 if (led == drv_data->leds[n] && (force_update ||
2013 (value != drv_data->led_state[n] ||
2014 drv_data->led_delay_on[n] ||
2015 drv_data->led_delay_off[n]))) {
2016
2017 drv_data->led_state[n] = value;
2018
2019 /* Setting the brightness stops the blinking */
2020 drv_data->led_delay_on[n] = 0;
2021 drv_data->led_delay_off[n] = 0;
2022
Frank Praznik221399b2015-05-05 20:47:32 -04002023 sony_set_leds(drv_data);
Colin Leitnerf04d5142013-05-27 23:41:05 +02002024 break;
2025 }
2026 }
2027}
2028
Sven Eckelmannc5382512013-11-19 20:26:30 +01002029static enum led_brightness sony_led_get_brightness(struct led_classdev *led)
Colin Leitnerf04d5142013-05-27 23:41:05 +02002030{
2031 struct device *dev = led->dev->parent;
Geliang Tangee79a8f2015-12-27 17:25:21 +08002032 struct hid_device *hdev = to_hid_device(dev);
Colin Leitnerf04d5142013-05-27 23:41:05 +02002033 struct sony_sc *drv_data;
Colin Leitnerf04d5142013-05-27 23:41:05 +02002034
2035 int n;
Colin Leitnerf04d5142013-05-27 23:41:05 +02002036
2037 drv_data = hid_get_drvdata(hdev);
Sven Eckelmann2251b852013-11-19 20:26:31 +01002038 if (!drv_data) {
Colin Leitnerf04d5142013-05-27 23:41:05 +02002039 hid_err(hdev, "No device data\n");
2040 return LED_OFF;
2041 }
Colin Leitnerf04d5142013-05-27 23:41:05 +02002042
Frank Praznik60781cf2014-01-11 15:13:15 -05002043 for (n = 0; n < drv_data->led_count; n++) {
Simon Wood7db75042014-02-05 12:34:18 -07002044 if (led == drv_data->leds[n])
2045 return drv_data->led_state[n];
Colin Leitnerf04d5142013-05-27 23:41:05 +02002046 }
2047
Simon Wood7db75042014-02-05 12:34:18 -07002048 return LED_OFF;
Colin Leitnerf04d5142013-05-27 23:41:05 +02002049}
Colin Leitnerf04d5142013-05-27 23:41:05 +02002050
Frank Praznikb3ed4582014-04-14 10:11:36 -04002051static int sony_led_blink_set(struct led_classdev *led, unsigned long *delay_on,
2052 unsigned long *delay_off)
2053{
2054 struct device *dev = led->dev->parent;
Geliang Tangee79a8f2015-12-27 17:25:21 +08002055 struct hid_device *hdev = to_hid_device(dev);
Frank Praznikb3ed4582014-04-14 10:11:36 -04002056 struct sony_sc *drv_data = hid_get_drvdata(hdev);
2057 int n;
Pavel Machek1adf9042016-02-09 13:55:08 +01002058 u8 new_on, new_off;
Frank Praznikb3ed4582014-04-14 10:11:36 -04002059
2060 if (!drv_data) {
2061 hid_err(hdev, "No device data\n");
2062 return -EINVAL;
2063 }
2064
2065 /* Max delay is 255 deciseconds or 2550 milliseconds */
2066 if (*delay_on > 2550)
2067 *delay_on = 2550;
2068 if (*delay_off > 2550)
2069 *delay_off = 2550;
2070
2071 /* Blink at 1 Hz if both values are zero */
2072 if (!*delay_on && !*delay_off)
2073 *delay_on = *delay_off = 500;
2074
2075 new_on = *delay_on / 10;
2076 new_off = *delay_off / 10;
2077
2078 for (n = 0; n < drv_data->led_count; n++) {
2079 if (led == drv_data->leds[n])
2080 break;
2081 }
2082
2083 /* This LED is not registered on this device */
2084 if (n >= drv_data->led_count)
2085 return -EINVAL;
2086
2087 /* Don't schedule work if the values didn't change */
2088 if (new_on != drv_data->led_delay_on[n] ||
2089 new_off != drv_data->led_delay_off[n]) {
2090 drv_data->led_delay_on[n] = new_on;
2091 drv_data->led_delay_off[n] = new_off;
Roderick Colenbranderb5322732017-03-07 15:45:05 -08002092 sony_schedule_work(drv_data, SONY_WORKER_STATE);
Frank Praznikb3ed4582014-04-14 10:11:36 -04002093 }
2094
2095 return 0;
2096}
2097
Frank Praznikfa57a812014-04-14 10:11:33 -04002098static int sony_leds_init(struct sony_sc *sc)
Colin Leitnerf04d5142013-05-27 23:41:05 +02002099{
Frank Praznikfa57a812014-04-14 10:11:33 -04002100 struct hid_device *hdev = sc->hdev;
Jiri Kosina40e32ee2013-05-28 11:22:09 +02002101 int n, ret = 0;
Frank Praznikb3ed4582014-04-14 10:11:36 -04002102 int use_ds4_names;
Jiri Kosina40e32ee2013-05-28 11:22:09 +02002103 struct led_classdev *led;
2104 size_t name_sz;
2105 char *name;
Sven Eckelmann0a286ef2013-11-19 20:26:32 +01002106 size_t name_len;
2107 const char *name_fmt;
Frank Praznikb3ed4582014-04-14 10:11:36 -04002108 static const char * const ds4_name_str[] = { "red", "green", "blue",
2109 "global" };
Pavel Machek1adf9042016-02-09 13:55:08 +01002110 u8 max_brightness[MAX_LEDS] = { [0 ... (MAX_LEDS - 1)] = 1 };
2111 u8 use_hw_blink[MAX_LEDS] = { 0 };
Colin Leitnerf04d5142013-05-27 23:41:05 +02002112
Frank Praznikfa57a812014-04-14 10:11:33 -04002113 BUG_ON(!(sc->quirks & SONY_LED_SUPPORT));
Colin Leitnerf04d5142013-05-27 23:41:05 +02002114
Frank Praznikfa57a812014-04-14 10:11:33 -04002115 if (sc->quirks & BUZZ_CONTROLLER) {
2116 sc->led_count = 4;
Frank Praznikb3ed4582014-04-14 10:11:36 -04002117 use_ds4_names = 0;
Sven Eckelmann0a286ef2013-11-19 20:26:32 +01002118 name_len = strlen("::buzz#");
2119 name_fmt = "%s::buzz%d";
2120 /* Validate expected report characteristics. */
2121 if (!hid_validate_values(hdev, HID_OUTPUT_REPORT, 0, 0, 7))
2122 return -ENODEV;
Frank Praznikfa57a812014-04-14 10:11:33 -04002123 } else if (sc->quirks & DUALSHOCK4_CONTROLLER) {
Frank Praznik221399b2015-05-05 20:47:32 -04002124 dualshock4_set_leds_from_id(sc);
2125 sc->led_state[3] = 1;
Frank Praznikb3ed4582014-04-14 10:11:36 -04002126 sc->led_count = 4;
2127 memset(max_brightness, 255, 3);
2128 use_hw_blink[3] = 1;
2129 use_ds4_names = 1;
Frank Praznik61ebca92014-01-20 12:27:02 -05002130 name_len = 0;
2131 name_fmt = "%s:%s";
Frank Praznikc5e0c1c2015-05-05 20:47:30 -04002132 } else if (sc->quirks & MOTION_CONTROLLER) {
2133 sc->led_count = 3;
2134 memset(max_brightness, 255, 3);
2135 use_ds4_names = 1;
2136 name_len = 0;
2137 name_fmt = "%s:%s";
Simon Wood4545ee02015-06-17 00:08:52 -06002138 } else if (sc->quirks & NAVIGATION_CONTROLLER) {
Pavel Machek1adf9042016-02-09 13:55:08 +01002139 static const u8 navigation_leds[4] = {0x01, 0x00, 0x00, 0x00};
Simon Wood4545ee02015-06-17 00:08:52 -06002140
2141 memcpy(sc->led_state, navigation_leds, sizeof(navigation_leds));
2142 sc->led_count = 1;
2143 memset(use_hw_blink, 1, 4);
2144 use_ds4_names = 0;
2145 name_len = strlen("::sony#");
2146 name_fmt = "%s::sony%d";
Frank Praznik60781cf2014-01-11 15:13:15 -05002147 } else {
Frank Praznik221399b2015-05-05 20:47:32 -04002148 sixaxis_set_leds_from_id(sc);
Frank Praznikfa57a812014-04-14 10:11:33 -04002149 sc->led_count = 4;
Frank Praznikb3ed4582014-04-14 10:11:36 -04002150 memset(use_hw_blink, 1, 4);
2151 use_ds4_names = 0;
Frank Praznik61ebca92014-01-20 12:27:02 -05002152 name_len = strlen("::sony#");
2153 name_fmt = "%s::sony%d";
Frank Praznik60781cf2014-01-11 15:13:15 -05002154 }
2155
Frank Praznikad142b92014-02-20 11:36:00 -05002156 /*
2157 * Clear LEDs as we have no way of reading their initial state. This is
Colin Leitnerf04d5142013-05-27 23:41:05 +02002158 * only relevant if the driver is loaded after somebody actively set the
Frank Praznikad142b92014-02-20 11:36:00 -05002159 * LEDs to on
2160 */
Frank Praznik221399b2015-05-05 20:47:32 -04002161 sony_set_leds(sc);
Colin Leitnerf04d5142013-05-27 23:41:05 +02002162
Sven Eckelmann0a286ef2013-11-19 20:26:32 +01002163 name_sz = strlen(dev_name(&hdev->dev)) + name_len + 1;
Colin Leitnerf04d5142013-05-27 23:41:05 +02002164
Frank Praznikfa57a812014-04-14 10:11:33 -04002165 for (n = 0; n < sc->led_count; n++) {
Frank Praznik61ebca92014-01-20 12:27:02 -05002166
Frank Praznikb3ed4582014-04-14 10:11:36 -04002167 if (use_ds4_names)
2168 name_sz = strlen(dev_name(&hdev->dev)) + strlen(ds4_name_str[n]) + 2;
Frank Praznik61ebca92014-01-20 12:27:02 -05002169
Hanno Zullaf2d98e22018-06-14 16:30:46 +02002170 led = devm_kzalloc(&hdev->dev, sizeof(struct led_classdev) + name_sz, GFP_KERNEL);
Jiri Kosina40e32ee2013-05-28 11:22:09 +02002171 if (!led) {
2172 hid_err(hdev, "Couldn't allocate memory for LED %d\n", n);
Hanno Zullaf2d98e22018-06-14 16:30:46 +02002173 return -ENOMEM;
Colin Leitnerf04d5142013-05-27 23:41:05 +02002174 }
Jiri Kosina40e32ee2013-05-28 11:22:09 +02002175
2176 name = (void *)(&led[1]);
Frank Praznikb3ed4582014-04-14 10:11:36 -04002177 if (use_ds4_names)
2178 snprintf(name, name_sz, name_fmt, dev_name(&hdev->dev),
2179 ds4_name_str[n]);
Frank Praznik61ebca92014-01-20 12:27:02 -05002180 else
2181 snprintf(name, name_sz, name_fmt, dev_name(&hdev->dev), n + 1);
Jiri Kosina40e32ee2013-05-28 11:22:09 +02002182 led->name = name;
Frank Praznik221399b2015-05-05 20:47:32 -04002183 led->brightness = sc->led_state[n];
Frank Praznikb3ed4582014-04-14 10:11:36 -04002184 led->max_brightness = max_brightness[n];
Frank Praznik765a1072017-02-08 13:58:43 -05002185 led->flags = LED_CORE_SUSPENDRESUME;
Sven Eckelmannc5382512013-11-19 20:26:30 +01002186 led->brightness_get = sony_led_get_brightness;
2187 led->brightness_set = sony_led_set_brightness;
Jiri Kosina40e32ee2013-05-28 11:22:09 +02002188
Frank Praznikb3ed4582014-04-14 10:11:36 -04002189 if (use_hw_blink[n])
2190 led->blink_set = sony_led_blink_set;
2191
Frank Praznik80250872014-04-14 10:11:35 -04002192 sc->leds[n] = led;
2193
Hanno Zullaf2d98e22018-06-14 16:30:46 +02002194 ret = devm_led_classdev_register(&hdev->dev, led);
Julia Lawall8cd5fcd2013-12-29 23:47:27 +01002195 if (ret) {
Jiri Kosina40e32ee2013-05-28 11:22:09 +02002196 hid_err(hdev, "Failed to register LED %d\n", n);
Hanno Zullaf2d98e22018-06-14 16:30:46 +02002197 return ret;
Jiri Kosina40e32ee2013-05-28 11:22:09 +02002198 }
Colin Leitnerf04d5142013-05-27 23:41:05 +02002199 }
Colin Leitnerf04d5142013-05-27 23:41:05 +02002200
Hanno Zullaf2d98e22018-06-14 16:30:46 +02002201 return 0;
Colin Leitnerf04d5142013-05-27 23:41:05 +02002202}
2203
Frank Praznikd8aaccd2015-11-11 09:49:37 -05002204static void sixaxis_send_output_report(struct sony_sc *sc)
Sven Eckelmanna08c22c2013-11-09 19:25:57 +01002205{
Frank Praznik9b2b5c92014-11-12 14:10:09 -05002206 static const union sixaxis_output_report_01 default_report = {
Frank Praznik55d3b662014-04-14 10:11:32 -04002207 .buf = {
2208 0x01,
Scott Moreauad07b7a2016-01-13 07:40:43 -07002209 0x01, 0xff, 0x00, 0xff, 0x00,
Frank Praznik55d3b662014-04-14 10:11:32 -04002210 0x00, 0x00, 0x00, 0x00, 0x00,
2211 0xff, 0x27, 0x10, 0x00, 0x32,
2212 0xff, 0x27, 0x10, 0x00, 0x32,
2213 0xff, 0x27, 0x10, 0x00, 0x32,
2214 0xff, 0x27, 0x10, 0x00, 0x32,
2215 0x00, 0x00, 0x00, 0x00, 0x00
2216 }
Sven Eckelmanna08c22c2013-11-09 19:25:57 +01002217 };
Frank Praznik9b2b5c92014-11-12 14:10:09 -05002218 struct sixaxis_output_report *report =
2219 (struct sixaxis_output_report *)sc->output_report_dmabuf;
2220 int n;
2221
2222 /* Initialize the report with default values */
2223 memcpy(report, &default_report, sizeof(struct sixaxis_output_report));
Sven Eckelmann9f323b62013-11-17 20:38:21 +01002224
Sven Eckelmann0a286ef2013-11-19 20:26:32 +01002225#ifdef CONFIG_SONY_FF
Frank Praznik9b2b5c92014-11-12 14:10:09 -05002226 report->rumble.right_motor_on = sc->right ? 1 : 0;
2227 report->rumble.left_motor_force = sc->left;
Sven Eckelmann0a286ef2013-11-19 20:26:32 +01002228#endif
2229
Frank Praznik9b2b5c92014-11-12 14:10:09 -05002230 report->leds_bitmap |= sc->led_state[0] << 1;
2231 report->leds_bitmap |= sc->led_state[1] << 2;
2232 report->leds_bitmap |= sc->led_state[2] << 3;
2233 report->leds_bitmap |= sc->led_state[3] << 4;
Sven Eckelmann9f323b62013-11-17 20:38:21 +01002234
Simon Wood88f65762014-04-14 10:11:37 -04002235 /* Set flag for all leds off, required for 3rd party INTEC controller */
Frank Praznik9b2b5c92014-11-12 14:10:09 -05002236 if ((report->leds_bitmap & 0x1E) == 0)
2237 report->leds_bitmap |= 0x20;
Simon Wood88f65762014-04-14 10:11:37 -04002238
Frank Praznikb3ed4582014-04-14 10:11:36 -04002239 /*
2240 * The LEDs in the report are indexed in reverse order to their
2241 * corresponding light on the controller.
2242 * Index 0 = LED 4, index 1 = LED 3, etc...
2243 *
2244 * In the case of both delay values being zero (blinking disabled) the
2245 * default report values should be used or the controller LED will be
2246 * always off.
2247 */
2248 for (n = 0; n < 4; n++) {
2249 if (sc->led_delay_on[n] || sc->led_delay_off[n]) {
Frank Praznik9b2b5c92014-11-12 14:10:09 -05002250 report->led[3 - n].duty_off = sc->led_delay_off[n];
2251 report->led[3 - n].duty_on = sc->led_delay_on[n];
Frank Praznikb3ed4582014-04-14 10:11:36 -04002252 }
2253 }
2254
Hongye Yuand03213f2019-01-09 09:18:09 +08002255 /* SHANWAN controllers require output reports via intr channel */
2256 if (sc->quirks & SHANWAN_GAMEPAD)
2257 hid_hw_output_report(sc->hdev, (u8 *)report,
2258 sizeof(struct sixaxis_output_report));
2259 else
2260 hid_hw_raw_request(sc->hdev, report->report_id, (u8 *)report,
2261 sizeof(struct sixaxis_output_report),
2262 HID_OUTPUT_REPORT, HID_REQ_SET_REPORT);
Sven Eckelmann9f323b62013-11-17 20:38:21 +01002263}
2264
Frank Praznikd8aaccd2015-11-11 09:49:37 -05002265static void dualshock4_send_output_report(struct sony_sc *sc)
Frank Praznik0bd88dd2014-01-11 15:12:42 -05002266{
Frank Praznik0da8ea62014-01-16 21:42:51 -05002267 struct hid_device *hdev = sc->hdev;
Pavel Machek1adf9042016-02-09 13:55:08 +01002268 u8 *buf = sc->output_report_dmabuf;
Frank Praznik48220232014-02-05 20:03:44 -05002269 int offset;
Frank Praznik0da8ea62014-01-16 21:42:51 -05002270
Frank Praznikc4425c82016-09-22 20:18:10 -04002271 /*
Roderick Colenbrander77b499e2017-03-24 15:17:49 -07002272 * NOTE: The lower 6 bits of buf[1] field of the Bluetooth report
2273 * control the interval at which Dualshock 4 reports data:
2274 * 0x00 - 1ms
2275 * 0x01 - 1ms
2276 * 0x02 - 2ms
2277 * 0x3E - 62ms
2278 * 0x3F - disabled
Frank Praznikc4425c82016-09-22 20:18:10 -04002279 */
Roderick Colenbrander35f436c2017-03-07 15:45:04 -08002280 if (sc->quirks & (DUALSHOCK4_CONTROLLER_USB | DUALSHOCK4_DONGLE)) {
Roderick Colenbrander2c159de2016-10-07 12:39:35 -07002281 memset(buf, 0, DS4_OUTPUT_REPORT_0x05_SIZE);
Frank Praznikfdcf105d2014-02-05 20:03:46 -05002282 buf[0] = 0x05;
Roderick Colenbrander5caceb02017-03-24 15:17:48 -07002283 buf[1] = 0x07; /* blink + LEDs + motor */
Frank Praznikfdcf105d2014-02-05 20:03:46 -05002284 offset = 4;
2285 } else {
Roderick Colenbrander2c159de2016-10-07 12:39:35 -07002286 memset(buf, 0, DS4_OUTPUT_REPORT_0x11_SIZE);
Frank Praznikfdcf105d2014-02-05 20:03:46 -05002287 buf[0] = 0x11;
Roderick Colenbrander77b499e2017-03-24 15:17:49 -07002288 buf[1] = 0xC0 /* HID + CRC */ | sc->ds4_bt_poll_interval;
Roderick Colenbrander5caceb02017-03-24 15:17:48 -07002289 buf[3] = 0x07; /* blink + LEDs + motor */
Frank Praznikfdcf105d2014-02-05 20:03:46 -05002290 offset = 6;
2291 }
Frank Praznik0bd88dd2014-01-11 15:12:42 -05002292
2293#ifdef CONFIG_SONY_FF
Frank Praznik48220232014-02-05 20:03:44 -05002294 buf[offset++] = sc->right;
2295 buf[offset++] = sc->left;
2296#else
2297 offset += 2;
Frank Praznik0bd88dd2014-01-11 15:12:42 -05002298#endif
2299
Frank Praznikb3ed4582014-04-14 10:11:36 -04002300 /* LED 3 is the global control */
2301 if (sc->led_state[3]) {
2302 buf[offset++] = sc->led_state[0];
2303 buf[offset++] = sc->led_state[1];
2304 buf[offset++] = sc->led_state[2];
2305 } else {
2306 offset += 3;
2307 }
2308
2309 /* If both delay values are zero the DualShock 4 disables blinking. */
2310 buf[offset++] = sc->led_delay_on[3];
2311 buf[offset++] = sc->led_delay_off[3];
Frank Praznik60781cf2014-01-11 15:13:15 -05002312
Roderick Colenbrander35f436c2017-03-07 15:45:04 -08002313 if (sc->quirks & (DUALSHOCK4_CONTROLLER_USB | DUALSHOCK4_DONGLE))
Roderick Colenbrander2c159de2016-10-07 12:39:35 -07002314 hid_hw_output_report(hdev, buf, DS4_OUTPUT_REPORT_0x05_SIZE);
Roderick Colenbrandere7ef53a2016-10-07 12:39:37 -07002315 else {
2316 /* CRC generation */
2317 u8 bthdr = 0xA2;
2318 u32 crc;
2319
2320 crc = crc32_le(0xFFFFFFFF, &bthdr, 1);
2321 crc = ~crc32_le(crc, buf, DS4_OUTPUT_REPORT_0x11_SIZE-4);
2322 put_unaligned_le32(crc, &buf[74]);
2323 hid_hw_output_report(hdev, buf, DS4_OUTPUT_REPORT_0x11_SIZE);
2324 }
Frank Praznik0bd88dd2014-01-11 15:12:42 -05002325}
2326
Frank Praznikd8aaccd2015-11-11 09:49:37 -05002327static void motion_send_output_report(struct sony_sc *sc)
Frank Praznikc5e0c1c2015-05-05 20:47:30 -04002328{
Frank Praznikc5e0c1c2015-05-05 20:47:30 -04002329 struct hid_device *hdev = sc->hdev;
2330 struct motion_output_report_02 *report =
2331 (struct motion_output_report_02 *)sc->output_report_dmabuf;
2332
Simon Wood41d2d422015-06-09 21:27:06 -06002333 memset(report, 0, MOTION_REPORT_0x02_SIZE);
Frank Praznikc5e0c1c2015-05-05 20:47:30 -04002334
2335 report->type = 0x02; /* set leds */
2336 report->r = sc->led_state[0];
2337 report->g = sc->led_state[1];
2338 report->b = sc->led_state[2];
2339
2340#ifdef CONFIG_SONY_FF
2341 report->rumble = max(sc->right, sc->left);
2342#endif
2343
Pavel Machek1adf9042016-02-09 13:55:08 +01002344 hid_hw_output_report(hdev, (u8 *)report, MOTION_REPORT_0x02_SIZE);
Frank Praznikc5e0c1c2015-05-05 20:47:30 -04002345}
2346
Frank Praznikdecd9462015-11-11 09:49:38 -05002347static inline void sony_send_output_report(struct sony_sc *sc)
2348{
2349 if (sc->send_output_report)
2350 sc->send_output_report(sc);
2351}
2352
Frank Praznikd8aaccd2015-11-11 09:49:37 -05002353static void sony_state_worker(struct work_struct *work)
2354{
2355 struct sony_sc *sc = container_of(work, struct sony_sc, state_worker);
Antonio Ospiteef916ef2016-02-09 13:55:07 +01002356
Frank Praznikd8aaccd2015-11-11 09:49:37 -05002357 sc->send_output_report(sc);
2358}
2359
Frank Praznik9b2b5c92014-11-12 14:10:09 -05002360static int sony_allocate_output_report(struct sony_sc *sc)
2361{
Simon Wood4545ee02015-06-17 00:08:52 -06002362 if ((sc->quirks & SIXAXIS_CONTROLLER) ||
2363 (sc->quirks & NAVIGATION_CONTROLLER))
Frank Praznik9b2b5c92014-11-12 14:10:09 -05002364 sc->output_report_dmabuf =
Hanno Zullaea58c332018-06-14 16:32:16 +02002365 devm_kmalloc(&sc->hdev->dev,
2366 sizeof(union sixaxis_output_report_01),
Frank Praznik9b2b5c92014-11-12 14:10:09 -05002367 GFP_KERNEL);
2368 else if (sc->quirks & DUALSHOCK4_CONTROLLER_BT)
Hanno Zullaea58c332018-06-14 16:32:16 +02002369 sc->output_report_dmabuf = devm_kmalloc(&sc->hdev->dev,
2370 DS4_OUTPUT_REPORT_0x11_SIZE,
Frank Praznik9b2b5c92014-11-12 14:10:09 -05002371 GFP_KERNEL);
Roderick Colenbrander35f436c2017-03-07 15:45:04 -08002372 else if (sc->quirks & (DUALSHOCK4_CONTROLLER_USB | DUALSHOCK4_DONGLE))
Hanno Zullaea58c332018-06-14 16:32:16 +02002373 sc->output_report_dmabuf = devm_kmalloc(&sc->hdev->dev,
2374 DS4_OUTPUT_REPORT_0x05_SIZE,
Frank Praznik9b2b5c92014-11-12 14:10:09 -05002375 GFP_KERNEL);
Frank Praznikc5e0c1c2015-05-05 20:47:30 -04002376 else if (sc->quirks & MOTION_CONTROLLER)
Hanno Zullaea58c332018-06-14 16:32:16 +02002377 sc->output_report_dmabuf = devm_kmalloc(&sc->hdev->dev,
2378 MOTION_REPORT_0x02_SIZE,
Simon Wood41d2d422015-06-09 21:27:06 -06002379 GFP_KERNEL);
Frank Praznik9b2b5c92014-11-12 14:10:09 -05002380 else
2381 return 0;
2382
2383 if (!sc->output_report_dmabuf)
2384 return -ENOMEM;
2385
2386 return 0;
2387}
2388
Sven Eckelmann0a286ef2013-11-19 20:26:32 +01002389#ifdef CONFIG_SONY_FF
Sven Eckelmann9f323b62013-11-17 20:38:21 +01002390static int sony_play_effect(struct input_dev *dev, void *data,
2391 struct ff_effect *effect)
2392{
Sven Eckelmanna08c22c2013-11-09 19:25:57 +01002393 struct hid_device *hid = input_get_drvdata(dev);
Sven Eckelmann9f323b62013-11-17 20:38:21 +01002394 struct sony_sc *sc = hid_get_drvdata(hid);
Sven Eckelmanna08c22c2013-11-09 19:25:57 +01002395
2396 if (effect->type != FF_RUMBLE)
2397 return 0;
2398
Sven Eckelmann9f323b62013-11-17 20:38:21 +01002399 sc->left = effect->u.rumble.strong_magnitude / 256;
Frank Praznik0bd88dd2014-01-11 15:12:42 -05002400 sc->right = effect->u.rumble.weak_magnitude / 256;
Sven Eckelmanna08c22c2013-11-09 19:25:57 +01002401
Roderick Colenbranderb5322732017-03-07 15:45:05 -08002402 sony_schedule_work(sc, SONY_WORKER_STATE);
Sven Eckelmann9f323b62013-11-17 20:38:21 +01002403 return 0;
Sven Eckelmanna08c22c2013-11-09 19:25:57 +01002404}
2405
Frank Praznikfa57a812014-04-14 10:11:33 -04002406static int sony_init_ff(struct sony_sc *sc)
Sven Eckelmanna08c22c2013-11-09 19:25:57 +01002407{
Alan Sternd9d4b1e2019-10-03 14:53:59 -04002408 struct hid_input *hidinput;
2409 struct input_dev *input_dev;
2410
2411 if (list_empty(&sc->hdev->inputs)) {
2412 hid_err(sc->hdev, "no inputs found\n");
2413 return -ENODEV;
2414 }
2415 hidinput = list_entry(sc->hdev->inputs.next, struct hid_input, list);
2416 input_dev = hidinput->input;
Sven Eckelmanna08c22c2013-11-09 19:25:57 +01002417
2418 input_set_capability(input_dev, EV_FF, FF_RUMBLE);
2419 return input_ff_create_memless(input_dev, NULL, sony_play_effect);
2420}
2421
2422#else
Frank Praznikfa57a812014-04-14 10:11:33 -04002423static int sony_init_ff(struct sony_sc *sc)
Sven Eckelmanna08c22c2013-11-09 19:25:57 +01002424{
2425 return 0;
2426}
Sven Eckelmann9f323b62013-11-17 20:38:21 +01002427
Sven Eckelmanna08c22c2013-11-09 19:25:57 +01002428#endif
2429
Frank Praznikd902f472014-01-27 10:17:36 -05002430static int sony_battery_get_property(struct power_supply *psy,
2431 enum power_supply_property psp,
2432 union power_supply_propval *val)
Frank Praznikc4e1ddf2014-01-17 14:46:26 -05002433{
Krzysztof Kozlowski297d7162015-03-12 08:44:11 +01002434 struct sony_sc *sc = power_supply_get_drvdata(psy);
Frank Praznikd902f472014-01-27 10:17:36 -05002435 unsigned long flags;
2436 int ret = 0;
Roderick Colenbrandera76a6c12020-11-09 23:22:27 -08002437 u8 battery_capacity;
2438 int battery_status;
Frank Praznikd902f472014-01-27 10:17:36 -05002439
2440 spin_lock_irqsave(&sc->lock, flags);
Frank Praznikd902f472014-01-27 10:17:36 -05002441 battery_capacity = sc->battery_capacity;
Roderick Colenbrandera76a6c12020-11-09 23:22:27 -08002442 battery_status = sc->battery_status;
Frank Praznikd902f472014-01-27 10:17:36 -05002443 spin_unlock_irqrestore(&sc->lock, flags);
2444
2445 switch (psp) {
2446 case POWER_SUPPLY_PROP_PRESENT:
2447 val->intval = 1;
2448 break;
2449 case POWER_SUPPLY_PROP_SCOPE:
2450 val->intval = POWER_SUPPLY_SCOPE_DEVICE;
2451 break;
2452 case POWER_SUPPLY_PROP_CAPACITY:
2453 val->intval = battery_capacity;
2454 break;
2455 case POWER_SUPPLY_PROP_STATUS:
Roderick Colenbrandera76a6c12020-11-09 23:22:27 -08002456 val->intval = battery_status;
Frank Praznikd902f472014-01-27 10:17:36 -05002457 break;
2458 default:
2459 ret = -EINVAL;
2460 break;
2461 }
2462 return ret;
2463}
2464
Frank Praznik0f398232016-09-22 20:18:08 -04002465static int sony_battery_probe(struct sony_sc *sc, int append_dev_id)
Frank Praznikd902f472014-01-27 10:17:36 -05002466{
Frank Praznik0f398232016-09-22 20:18:08 -04002467 const char *battery_str_fmt = append_dev_id ?
2468 "sony_controller_battery_%pMR_%i" :
2469 "sony_controller_battery_%pMR";
Krzysztof Kozlowski297d7162015-03-12 08:44:11 +01002470 struct power_supply_config psy_cfg = { .drv_data = sc, };
Frank Praznikc4e1ddf2014-01-17 14:46:26 -05002471 struct hid_device *hdev = sc->hdev;
Frank Praznikd902f472014-01-27 10:17:36 -05002472 int ret;
Frank Praznikc4e1ddf2014-01-17 14:46:26 -05002473
Frank Praznikad142b92014-02-20 11:36:00 -05002474 /*
2475 * Set the default battery level to 100% to avoid low battery warnings
Frank Praznikd9a293a2014-02-05 20:03:48 -05002476 * if the battery is polled before the first device report is received.
2477 */
2478 sc->battery_capacity = 100;
Frank Praznikc4e1ddf2014-01-17 14:46:26 -05002479
Krzysztof Kozlowski297d7162015-03-12 08:44:11 +01002480 sc->battery_desc.properties = sony_battery_props;
2481 sc->battery_desc.num_properties = ARRAY_SIZE(sony_battery_props);
2482 sc->battery_desc.get_property = sony_battery_get_property;
2483 sc->battery_desc.type = POWER_SUPPLY_TYPE_BATTERY;
2484 sc->battery_desc.use_for_apm = 0;
Hanno Zulla8082d3f2018-06-14 16:31:36 +02002485 sc->battery_desc.name = devm_kasprintf(&hdev->dev, GFP_KERNEL,
2486 battery_str_fmt, sc->mac_address, sc->device_id);
Krzysztof Kozlowski297d7162015-03-12 08:44:11 +01002487 if (!sc->battery_desc.name)
Frank Praznikd902f472014-01-27 10:17:36 -05002488 return -ENOMEM;
2489
Hanno Zulla8082d3f2018-06-14 16:31:36 +02002490 sc->battery = devm_power_supply_register(&hdev->dev, &sc->battery_desc,
Krzysztof Kozlowski297d7162015-03-12 08:44:11 +01002491 &psy_cfg);
2492 if (IS_ERR(sc->battery)) {
2493 ret = PTR_ERR(sc->battery);
Frank Praznikd902f472014-01-27 10:17:36 -05002494 hid_err(hdev, "Unable to register battery device\n");
Hanno Zulla8082d3f2018-06-14 16:31:36 +02002495 return ret;
Frank Praznikd902f472014-01-27 10:17:36 -05002496 }
2497
Krzysztof Kozlowski297d7162015-03-12 08:44:11 +01002498 power_supply_powers(sc->battery, &hdev->dev);
Frank Praznikd902f472014-01-27 10:17:36 -05002499 return 0;
Frank Praznikd902f472014-01-27 10:17:36 -05002500}
2501
Frank Praznikd2d782f2014-02-20 11:36:03 -05002502/*
2503 * If a controller is plugged in via USB while already connected via Bluetooth
2504 * it will show up as two devices. A global list of connected controllers and
2505 * their MAC addresses is maintained to ensure that a device is only connected
2506 * once.
Frank Praznik0f398232016-09-22 20:18:08 -04002507 *
2508 * Some USB-only devices masquerade as Sixaxis controllers and all have the
2509 * same dummy Bluetooth address, so a comparison of the connection type is
2510 * required. Devices are only rejected in the case where two devices have
2511 * matching Bluetooth addresses on different bus types.
Frank Praznikd2d782f2014-02-20 11:36:03 -05002512 */
Frank Praznik0f398232016-09-22 20:18:08 -04002513static inline int sony_compare_connection_type(struct sony_sc *sc0,
2514 struct sony_sc *sc1)
2515{
2516 const int sc0_not_bt = !(sc0->quirks & SONY_BT_DEVICE);
2517 const int sc1_not_bt = !(sc1->quirks & SONY_BT_DEVICE);
2518
2519 return sc0_not_bt == sc1_not_bt;
2520}
2521
Frank Praznikd2d782f2014-02-20 11:36:03 -05002522static int sony_check_add_dev_list(struct sony_sc *sc)
2523{
2524 struct sony_sc *entry;
2525 unsigned long flags;
2526 int ret;
2527
2528 spin_lock_irqsave(&sony_dev_list_lock, flags);
2529
2530 list_for_each_entry(entry, &sony_device_list, list_node) {
2531 ret = memcmp(sc->mac_address, entry->mac_address,
2532 sizeof(sc->mac_address));
2533 if (!ret) {
Frank Praznik0f398232016-09-22 20:18:08 -04002534 if (sony_compare_connection_type(sc, entry)) {
2535 ret = 1;
2536 } else {
2537 ret = -EEXIST;
2538 hid_info(sc->hdev,
2539 "controller with MAC address %pMR already connected\n",
Frank Praznikd2d782f2014-02-20 11:36:03 -05002540 sc->mac_address);
Frank Praznik0f398232016-09-22 20:18:08 -04002541 }
Frank Praznikd2d782f2014-02-20 11:36:03 -05002542 goto unlock;
Frank Praznikc4e1ddf2014-01-17 14:46:26 -05002543 }
2544 }
2545
Frank Praznikd2d782f2014-02-20 11:36:03 -05002546 ret = 0;
2547 list_add(&(sc->list_node), &sony_device_list);
Frank Praznikc4e1ddf2014-01-17 14:46:26 -05002548
Frank Praznikd2d782f2014-02-20 11:36:03 -05002549unlock:
2550 spin_unlock_irqrestore(&sony_dev_list_lock, flags);
2551 return ret;
Frank Praznikc4e1ddf2014-01-17 14:46:26 -05002552}
2553
Frank Praznikd2d782f2014-02-20 11:36:03 -05002554static void sony_remove_dev_list(struct sony_sc *sc)
2555{
2556 unsigned long flags;
2557
2558 if (sc->list_node.next) {
2559 spin_lock_irqsave(&sony_dev_list_lock, flags);
2560 list_del(&(sc->list_node));
2561 spin_unlock_irqrestore(&sony_dev_list_lock, flags);
2562 }
2563}
2564
2565static int sony_get_bt_devaddr(struct sony_sc *sc)
2566{
2567 int ret;
2568
2569 /* HIDP stores the device MAC address as a string in the uniq field. */
2570 ret = strlen(sc->hdev->uniq);
2571 if (ret != 17)
2572 return -EINVAL;
2573
2574 ret = sscanf(sc->hdev->uniq,
2575 "%02hhx:%02hhx:%02hhx:%02hhx:%02hhx:%02hhx",
2576 &sc->mac_address[5], &sc->mac_address[4], &sc->mac_address[3],
2577 &sc->mac_address[2], &sc->mac_address[1], &sc->mac_address[0]);
2578
2579 if (ret != 6)
2580 return -EINVAL;
2581
2582 return 0;
2583}
2584
2585static int sony_check_add(struct sony_sc *sc)
2586{
Pavel Machek1adf9042016-02-09 13:55:08 +01002587 u8 *buf = NULL;
Frank Praznikd2d782f2014-02-20 11:36:03 -05002588 int n, ret;
2589
2590 if ((sc->quirks & DUALSHOCK4_CONTROLLER_BT) ||
Simon Wood12e9a6d72015-06-09 21:27:05 -06002591 (sc->quirks & MOTION_CONTROLLER_BT) ||
Simon Wood4545ee02015-06-17 00:08:52 -06002592 (sc->quirks & NAVIGATION_CONTROLLER_BT) ||
Frank Praznikd2d782f2014-02-20 11:36:03 -05002593 (sc->quirks & SIXAXIS_CONTROLLER_BT)) {
2594 /*
2595 * sony_get_bt_devaddr() attempts to parse the Bluetooth MAC
2596 * address from the uniq string where HIDP stores it.
2597 * As uniq cannot be guaranteed to be a MAC address in all cases
2598 * a failure of this function should not prevent the connection.
2599 */
2600 if (sony_get_bt_devaddr(sc) < 0) {
2601 hid_warn(sc->hdev, "UNIQ does not contain a MAC address; duplicate check skipped\n");
2602 return 0;
2603 }
Roderick Colenbrander35f436c2017-03-07 15:45:04 -08002604 } else if (sc->quirks & (DUALSHOCK4_CONTROLLER_USB | DUALSHOCK4_DONGLE)) {
Roderick Colenbrander2c159de2016-10-07 12:39:35 -07002605 buf = kmalloc(DS4_FEATURE_REPORT_0x81_SIZE, GFP_KERNEL);
Frank Praznik9b2b5c92014-11-12 14:10:09 -05002606 if (!buf)
2607 return -ENOMEM;
Frank Praznikd2d782f2014-02-20 11:36:03 -05002608
2609 /*
2610 * The MAC address of a DS4 controller connected via USB can be
2611 * retrieved with feature report 0x81. The address begins at
2612 * offset 1.
2613 */
Frank Praznik9b2b5c92014-11-12 14:10:09 -05002614 ret = hid_hw_raw_request(sc->hdev, 0x81, buf,
Roderick Colenbrander2c159de2016-10-07 12:39:35 -07002615 DS4_FEATURE_REPORT_0x81_SIZE, HID_FEATURE_REPORT,
Frank Praznik9b2b5c92014-11-12 14:10:09 -05002616 HID_REQ_GET_REPORT);
Frank Praznikd2d782f2014-02-20 11:36:03 -05002617
Roderick Colenbrander2c159de2016-10-07 12:39:35 -07002618 if (ret != DS4_FEATURE_REPORT_0x81_SIZE) {
Frank Praznikd2d782f2014-02-20 11:36:03 -05002619 hid_err(sc->hdev, "failed to retrieve feature report 0x81 with the DualShock 4 MAC address\n");
Frank Praznik9b2b5c92014-11-12 14:10:09 -05002620 ret = ret < 0 ? ret : -EINVAL;
2621 goto out_free;
Frank Praznikd2d782f2014-02-20 11:36:03 -05002622 }
2623
2624 memcpy(sc->mac_address, &buf[1], sizeof(sc->mac_address));
Roderick Colenbranderc70d5f72016-12-08 19:09:51 -08002625
2626 snprintf(sc->hdev->uniq, sizeof(sc->hdev->uniq),
Andy Shevchenko648d4932017-12-11 15:06:12 +02002627 "%pMR", sc->mac_address);
Simon Wood4545ee02015-06-17 00:08:52 -06002628 } else if ((sc->quirks & SIXAXIS_CONTROLLER_USB) ||
2629 (sc->quirks & NAVIGATION_CONTROLLER_USB)) {
Frank Praznik9b2b5c92014-11-12 14:10:09 -05002630 buf = kmalloc(SIXAXIS_REPORT_0xF2_SIZE, GFP_KERNEL);
2631 if (!buf)
2632 return -ENOMEM;
Frank Praznikd2d782f2014-02-20 11:36:03 -05002633
2634 /*
2635 * The MAC address of a Sixaxis controller connected via USB can
2636 * be retrieved with feature report 0xf2. The address begins at
2637 * offset 4.
2638 */
Frank Praznik9b2b5c92014-11-12 14:10:09 -05002639 ret = hid_hw_raw_request(sc->hdev, 0xf2, buf,
2640 SIXAXIS_REPORT_0xF2_SIZE, HID_FEATURE_REPORT,
2641 HID_REQ_GET_REPORT);
Frank Praznikd2d782f2014-02-20 11:36:03 -05002642
Frank Praznik9b2b5c92014-11-12 14:10:09 -05002643 if (ret != SIXAXIS_REPORT_0xF2_SIZE) {
Frank Praznikd2d782f2014-02-20 11:36:03 -05002644 hid_err(sc->hdev, "failed to retrieve feature report 0xf2 with the Sixaxis MAC address\n");
Frank Praznik9b2b5c92014-11-12 14:10:09 -05002645 ret = ret < 0 ? ret : -EINVAL;
2646 goto out_free;
Frank Praznikd2d782f2014-02-20 11:36:03 -05002647 }
2648
2649 /*
2650 * The Sixaxis device MAC in the report is big-endian and must
2651 * be byte-swapped.
2652 */
2653 for (n = 0; n < 6; n++)
2654 sc->mac_address[5-n] = buf[4+n];
Roderick Colenbrander5a144be2017-03-24 15:17:45 -07002655
2656 snprintf(sc->hdev->uniq, sizeof(sc->hdev->uniq),
Andy Shevchenko648d4932017-12-11 15:06:12 +02002657 "%pMR", sc->mac_address);
Frank Praznikd2d782f2014-02-20 11:36:03 -05002658 } else {
2659 return 0;
2660 }
2661
Frank Praznik9b2b5c92014-11-12 14:10:09 -05002662 ret = sony_check_add_dev_list(sc);
2663
2664out_free:
2665
2666 kfree(buf);
2667
2668 return ret;
Frank Praznikd2d782f2014-02-20 11:36:03 -05002669}
2670
Frank Praznik80250872014-04-14 10:11:35 -04002671static int sony_set_device_id(struct sony_sc *sc)
2672{
2673 int ret;
2674
2675 /*
2676 * Only DualShock 4 or Sixaxis controllers get an id.
2677 * All others are set to -1.
2678 */
2679 if ((sc->quirks & SIXAXIS_CONTROLLER) ||
2680 (sc->quirks & DUALSHOCK4_CONTROLLER)) {
2681 ret = ida_simple_get(&sony_device_id_allocator, 0, 0,
2682 GFP_KERNEL);
2683 if (ret < 0) {
2684 sc->device_id = -1;
2685 return ret;
2686 }
2687 sc->device_id = ret;
2688 } else {
2689 sc->device_id = -1;
2690 }
2691
2692 return 0;
2693}
2694
2695static void sony_release_device_id(struct sony_sc *sc)
2696{
2697 if (sc->device_id >= 0) {
2698 ida_simple_remove(&sony_device_id_allocator, sc->device_id);
2699 sc->device_id = -1;
2700 }
2701}
2702
Frank Praznikd8aaccd2015-11-11 09:49:37 -05002703static inline void sony_init_output_report(struct sony_sc *sc,
Antonio Ospite09593e32016-02-09 13:55:06 +01002704 void (*send_output_report)(struct sony_sc *))
Frank Praznik46262042014-04-14 10:11:31 -04002705{
Frank Praznikd8aaccd2015-11-11 09:49:37 -05002706 sc->send_output_report = send_output_report;
2707
Roderick Colenbranderb5322732017-03-07 15:45:05 -08002708 if (!sc->state_worker_initialized)
Frank Praznikd8aaccd2015-11-11 09:49:37 -05002709 INIT_WORK(&sc->state_worker, sony_state_worker);
Frank Praznik46262042014-04-14 10:11:31 -04002710
Roderick Colenbranderb5322732017-03-07 15:45:05 -08002711 sc->state_worker_initialized = 1;
Frank Praznik46262042014-04-14 10:11:31 -04002712}
2713
2714static inline void sony_cancel_work_sync(struct sony_sc *sc)
2715{
Roderick Colenbrandere0f69742019-08-02 15:50:19 -07002716 unsigned long flags;
2717
Roderick Colenbranderf2f47c32017-03-07 15:45:06 -08002718 if (sc->hotplug_worker_initialized)
2719 cancel_work_sync(&sc->hotplug_worker);
Roderick Colenbrandere0f69742019-08-02 15:50:19 -07002720 if (sc->state_worker_initialized) {
2721 spin_lock_irqsave(&sc->lock, flags);
2722 sc->state_worker_initialized = 0;
2723 spin_unlock_irqrestore(&sc->lock, flags);
Frank Praznik46262042014-04-14 10:11:31 -04002724 cancel_work_sync(&sc->state_worker);
Roderick Colenbrandere0f69742019-08-02 15:50:19 -07002725 }
Frank Praznik46262042014-04-14 10:11:31 -04002726}
Frank Praznikd2d782f2014-02-20 11:36:03 -05002727
Roderick Colenbrandere1bc84d2016-10-07 12:39:34 -07002728static int sony_input_configured(struct hid_device *hdev,
2729 struct hid_input *hidinput)
Jiri Slabybd28ce02008-06-25 23:47:04 +02002730{
Roderick Colenbrandere1bc84d2016-10-07 12:39:34 -07002731 struct sony_sc *sc = hid_get_drvdata(hdev);
Frank Praznik0f398232016-09-22 20:18:08 -04002732 int append_dev_id;
Roderick Colenbrandere1bc84d2016-10-07 12:39:34 -07002733 int ret;
Jiri Slabybd28ce02008-06-25 23:47:04 +02002734
Frank Praznik80250872014-04-14 10:11:35 -04002735 ret = sony_set_device_id(sc);
2736 if (ret < 0) {
2737 hid_err(hdev, "failed to allocate the device id\n");
2738 goto err_stop;
2739 }
2740
Roderick Colenbranderdf848bc2017-03-07 15:45:11 -08002741 ret = append_dev_id = sony_check_add(sc);
2742 if (ret < 0)
2743 goto err_stop;
2744
Frank Praznik131a8a92015-05-05 20:47:28 -04002745 ret = sony_allocate_output_report(sc);
2746 if (ret < 0) {
2747 hid_err(hdev, "failed to allocate the output report buffer\n");
2748 goto err_stop;
2749 }
2750
Roderick Colenbrander510c8b72017-03-07 15:45:10 -08002751 if (sc->quirks & NAVIGATION_CONTROLLER_USB) {
Benjamin Tissoirese534a932014-03-08 22:52:42 -05002752 /*
2753 * The Sony Sixaxis does not handle HID Output Reports on the
2754 * Interrupt EP like it could, so we need to force HID Output
2755 * Reports to use HID_REQ_SET_REPORT on the Control EP.
2756 *
2757 * There is also another issue about HID Output Reports via USB,
2758 * the Sixaxis does not want the report_id as part of the data
2759 * packet, so we have to discard buf[0] when sending the actual
2760 * control message, even for numbered reports, humpf!
Frank Praznik2a242932016-09-22 20:18:09 -04002761 *
2762 * Additionally, the Sixaxis on USB isn't properly initialized
2763 * until the PS logo button is pressed and as such won't retain
2764 * any state set by an output report, so the initial
2765 * configuration report is deferred until the first input
2766 * report arrives.
Benjamin Tissoirese534a932014-03-08 22:52:42 -05002767 */
2768 hdev->quirks |= HID_QUIRK_NO_OUTPUT_REPORTS_ON_INTR_EP;
2769 hdev->quirks |= HID_QUIRK_SKIP_OUTPUT_REPORT_ID;
Frank Praznik2a242932016-09-22 20:18:09 -04002770 sc->defer_initialization = 1;
Roderick Colenbrander80ecc482017-03-07 15:45:09 -08002771
Antonio Ospite816651a2010-05-03 22:15:55 +02002772 ret = sixaxis_set_operational_usb(hdev);
Roderick Colenbrander80ecc482017-03-07 15:45:09 -08002773 if (ret < 0) {
2774 hid_err(hdev, "Failed to set controller into operational mode\n");
2775 goto err_stop;
2776 }
2777
Frank Praznikd8aaccd2015-11-11 09:49:37 -05002778 sony_init_output_report(sc, sixaxis_send_output_report);
Roderick Colenbrander510c8b72017-03-07 15:45:10 -08002779 } else if (sc->quirks & NAVIGATION_CONTROLLER_BT) {
2780 /*
2781 * The Navigation controller wants output reports sent on the ctrl
2782 * endpoint when connected via Bluetooth.
2783 */
2784 hdev->quirks |= HID_QUIRK_NO_OUTPUT_REPORTS_ON_INTR_EP;
2785
2786 ret = sixaxis_set_operational_bt(hdev);
2787 if (ret < 0) {
2788 hid_err(hdev, "Failed to set controller into operational mode\n");
2789 goto err_stop;
2790 }
2791
2792 sony_init_output_report(sc, sixaxis_send_output_report);
2793 } else if (sc->quirks & SIXAXIS_CONTROLLER_USB) {
2794 /*
2795 * The Sony Sixaxis does not handle HID Output Reports on the
2796 * Interrupt EP and the device only becomes active when the
2797 * PS button is pressed. See comment for Navigation controller
2798 * above for more details.
2799 */
2800 hdev->quirks |= HID_QUIRK_NO_OUTPUT_REPORTS_ON_INTR_EP;
2801 hdev->quirks |= HID_QUIRK_SKIP_OUTPUT_REPORT_ID;
2802 sc->defer_initialization = 1;
2803
2804 ret = sixaxis_set_operational_usb(hdev);
2805 if (ret < 0) {
2806 hid_err(hdev, "Failed to set controller into operational mode\n");
2807 goto err_stop;
2808 }
2809
2810 ret = sony_register_sensors(sc);
2811 if (ret) {
2812 hid_err(sc->hdev,
2813 "Unable to initialize motion sensors: %d\n", ret);
2814 goto err_stop;
2815 }
2816
2817 sony_init_output_report(sc, sixaxis_send_output_report);
2818 } else if (sc->quirks & SIXAXIS_CONTROLLER_BT) {
Frank Praznik2078b9bb2014-03-15 09:41:16 -04002819 /*
2820 * The Sixaxis wants output reports sent on the ctrl endpoint
2821 * when connected via Bluetooth.
2822 */
2823 hdev->quirks |= HID_QUIRK_NO_OUTPUT_REPORTS_ON_INTR_EP;
Roderick Colenbrander80ecc482017-03-07 15:45:09 -08002824
Antonio Ospite816651a2010-05-03 22:15:55 +02002825 ret = sixaxis_set_operational_bt(hdev);
Roderick Colenbrander80ecc482017-03-07 15:45:09 -08002826 if (ret < 0) {
2827 hid_err(hdev, "Failed to set controller into operational mode\n");
2828 goto err_stop;
2829 }
2830
Roderick Colenbrander510c8b72017-03-07 15:45:10 -08002831 ret = sony_register_sensors(sc);
2832 if (ret) {
2833 hid_err(sc->hdev,
2834 "Unable to initialize motion sensors: %d\n", ret);
2835 goto err_stop;
2836 }
2837
Frank Praznikd8aaccd2015-11-11 09:49:37 -05002838 sony_init_output_report(sc, sixaxis_send_output_report);
Frank Praznikfee4e2d2014-02-18 17:22:01 -05002839 } else if (sc->quirks & DUALSHOCK4_CONTROLLER) {
Roderick Colenbrander55a07d62017-03-07 15:45:01 -08002840 ret = dualshock4_get_calibration_data(sc);
2841 if (ret < 0) {
2842 hid_err(hdev, "Failed to get calibration data from Dualshock 4\n");
2843 goto err_stop;
Frank Praznik68330d82014-02-05 20:03:49 -05002844 }
Frank Praznikc4e1ddf2014-01-17 14:46:26 -05002845
Roderick Colenbrander169f15a2017-12-19 11:04:43 -08002846 ret = dualshock4_get_version_info(sc);
2847 if (ret < 0) {
2848 hid_err(sc->hdev, "Failed to get version data from Dualshock 4\n");
2849 goto err_stop;
2850 }
2851
2852 ret = device_create_file(&sc->hdev->dev, &dev_attr_firmware_version);
2853 if (ret) {
Roderick Colenbrander169f15a2017-12-19 11:04:43 -08002854 hid_err(sc->hdev, "can't create sysfs firmware_version attribute err: %d\n", ret);
2855 goto err_stop;
2856 }
Roderick Colenbrander1a8212e2020-11-09 23:22:29 -08002857 sc->fw_version_created = true;
Roderick Colenbrander169f15a2017-12-19 11:04:43 -08002858
2859 ret = device_create_file(&sc->hdev->dev, &dev_attr_hardware_version);
2860 if (ret) {
Roderick Colenbrander169f15a2017-12-19 11:04:43 -08002861 hid_err(sc->hdev, "can't create sysfs hardware_version attribute err: %d\n", ret);
2862 goto err_stop;
2863 }
Roderick Colenbrander1a8212e2020-11-09 23:22:29 -08002864 sc->hw_version_created = true;
Roderick Colenbrander169f15a2017-12-19 11:04:43 -08002865
Roderick Colenbrandere1bc84d2016-10-07 12:39:34 -07002866 /*
2867 * The Dualshock 4 touchpad supports 2 touches and has a
2868 * resolution of 1920x942 (44.86 dots/mm).
2869 */
Todd Kelnerb7289cb2018-02-17 16:47:10 -07002870 ret = sony_register_touchpad(sc, 2, 1920, 942, 0, 0, 0);
Roderick Colenbrandere1bc84d2016-10-07 12:39:34 -07002871 if (ret) {
2872 hid_err(sc->hdev,
2873 "Unable to initialize multi-touch slots: %d\n",
2874 ret);
Roderick Colenbrander2b6579d2016-12-08 19:09:50 -08002875 goto err_stop;
Roderick Colenbrandere1bc84d2016-10-07 12:39:34 -07002876 }
2877
Roderick Colenbrander227c0112017-03-07 15:45:00 -08002878 ret = sony_register_sensors(sc);
2879 if (ret) {
2880 hid_err(sc->hdev,
2881 "Unable to initialize motion sensors: %d\n", ret);
2882 goto err_stop;
2883 }
2884
Roderick Colenbrander77b499e2017-03-24 15:17:49 -07002885 if (sc->quirks & DUALSHOCK4_CONTROLLER_BT) {
2886 sc->ds4_bt_poll_interval = DS4_BT_DEFAULT_POLL_INTERVAL_MS;
2887 ret = device_create_file(&sc->hdev->dev, &dev_attr_bt_poll_interval);
2888 if (ret)
2889 hid_warn(sc->hdev,
2890 "can't create sysfs bt_poll_interval attribute err: %d\n",
2891 ret);
2892 }
2893
Roderick Colenbranderf2f47c32017-03-07 15:45:06 -08002894 if (sc->quirks & DUALSHOCK4_DONGLE) {
2895 INIT_WORK(&sc->hotplug_worker, dualshock4_calibration_work);
2896 sc->hotplug_worker_initialized = 1;
2897 sc->ds4_dongle_state = DONGLE_DISCONNECTED;
2898 }
2899
Frank Praznikd8aaccd2015-11-11 09:49:37 -05002900 sony_init_output_report(sc, dualshock4_send_output_report);
Todd Kelnerb7289cb2018-02-17 16:47:10 -07002901 } else if (sc->quirks & NSG_MRXU_REMOTE) {
2902 /*
2903 * The NSG-MRxU touchpad supports 2 touches and has a
2904 * resolution of 1667x1868
2905 */
2906 ret = sony_register_touchpad(sc, 2,
2907 NSG_MRXU_MAX_X, NSG_MRXU_MAX_Y, 15, 15, 1);
2908 if (ret) {
2909 hid_err(sc->hdev,
2910 "Unable to initialize multi-touch slots: %d\n",
2911 ret);
2912 goto err_stop;
2913 }
2914
Frank Praznikc5e0c1c2015-05-05 20:47:30 -04002915 } else if (sc->quirks & MOTION_CONTROLLER) {
Frank Praznikd8aaccd2015-11-11 09:49:37 -05002916 sony_init_output_report(sc, motion_send_output_report);
Frank Praznik0bd88dd2014-01-11 15:12:42 -05002917 } else {
2918 ret = 0;
2919 }
Bastien Noceraf9ce7c22010-01-20 12:01:53 +00002920
Sven Eckelmann0a286ef2013-11-19 20:26:32 +01002921 if (sc->quirks & SONY_LED_SUPPORT) {
Frank Praznikfa57a812014-04-14 10:11:33 -04002922 ret = sony_leds_init(sc);
Sven Eckelmann0a286ef2013-11-19 20:26:32 +01002923 if (ret < 0)
2924 goto err_stop;
2925 }
2926
Frank Praznikd902f472014-01-27 10:17:36 -05002927 if (sc->quirks & SONY_BATTERY_SUPPORT) {
Frank Praznik0f398232016-09-22 20:18:08 -04002928 ret = sony_battery_probe(sc, append_dev_id);
Frank Praznikd902f472014-01-27 10:17:36 -05002929 if (ret < 0)
2930 goto err_stop;
2931
2932 /* Open the device to receive reports with battery info */
2933 ret = hid_hw_open(hdev);
2934 if (ret < 0) {
2935 hid_err(hdev, "hw open failed\n");
2936 goto err_stop;
2937 }
2938 }
2939
Frank Praznikc8de9db2014-02-20 11:36:01 -05002940 if (sc->quirks & SONY_FF_SUPPORT) {
Frank Praznikfa57a812014-04-14 10:11:33 -04002941 ret = sony_init_ff(sc);
Frank Praznikc8de9db2014-02-20 11:36:01 -05002942 if (ret < 0)
2943 goto err_close;
Frank Praznik5f5750d2014-02-19 13:09:22 -05002944 }
Sven Eckelmanna08c22c2013-11-09 19:25:57 +01002945
Jiri Slabybd28ce02008-06-25 23:47:04 +02002946 return 0;
Frank Praznikd902f472014-01-27 10:17:36 -05002947err_close:
2948 hid_hw_close(hdev);
Jiri Slabybd28ce02008-06-25 23:47:04 +02002949err_stop:
Roderick Colenbrander77b499e2017-03-24 15:17:49 -07002950 /* Piggy back on the default ds4_bt_ poll_interval to determine
2951 * if we need to remove the file as we don't know for sure if we
2952 * executed that logic.
2953 */
2954 if (sc->ds4_bt_poll_interval)
2955 device_remove_file(&sc->hdev->dev, &dev_attr_bt_poll_interval);
Roderick Colenbrander1a8212e2020-11-09 23:22:29 -08002956 if (sc->fw_version_created)
Roderick Colenbrander169f15a2017-12-19 11:04:43 -08002957 device_remove_file(&sc->hdev->dev, &dev_attr_firmware_version);
Roderick Colenbrander1a8212e2020-11-09 23:22:29 -08002958 if (sc->hw_version_created)
Roderick Colenbrander169f15a2017-12-19 11:04:43 -08002959 device_remove_file(&sc->hdev->dev, &dev_attr_hardware_version);
Frank Praznik46262042014-04-14 10:11:31 -04002960 sony_cancel_work_sync(sc);
Frank Praznikd2d782f2014-02-20 11:36:03 -05002961 sony_remove_dev_list(sc);
Frank Praznik80250872014-04-14 10:11:35 -04002962 sony_release_device_id(sc);
Jiri Slabybd28ce02008-06-25 23:47:04 +02002963 return ret;
2964}
2965
Roderick Colenbrandere1bc84d2016-10-07 12:39:34 -07002966static int sony_probe(struct hid_device *hdev, const struct hid_device_id *id)
2967{
2968 int ret;
2969 unsigned long quirks = id->driver_data;
2970 struct sony_sc *sc;
Pascal Giardfb1a79a2021-06-04 12:10:23 -04002971 struct usb_device *usbdev;
Roderick Colenbrandere1bc84d2016-10-07 12:39:34 -07002972 unsigned int connect_mask = HID_CONNECT_DEFAULT;
2973
2974 if (!strcmp(hdev->name, "FutureMax Dance Mat"))
2975 quirks |= FUTUREMAX_DANCE_MAT;
2976
Hongye Yuan69481052019-01-09 09:18:08 +08002977 if (!strcmp(hdev->name, "SHANWAN PS3 GamePad"))
2978 quirks |= SHANWAN_GAMEPAD;
2979
Roderick Colenbrandere1bc84d2016-10-07 12:39:34 -07002980 sc = devm_kzalloc(&hdev->dev, sizeof(*sc), GFP_KERNEL);
2981 if (sc == NULL) {
2982 hid_err(hdev, "can't alloc sony descriptor\n");
2983 return -ENOMEM;
2984 }
2985
2986 spin_lock_init(&sc->lock);
2987
2988 sc->quirks = quirks;
2989 hid_set_drvdata(hdev, sc);
2990 sc->hdev = hdev;
Pascal Giardfb1a79a2021-06-04 12:10:23 -04002991 usbdev = to_usb_device(sc->hdev->dev.parent->parent);
Roderick Colenbrandere1bc84d2016-10-07 12:39:34 -07002992
2993 ret = hid_parse(hdev);
2994 if (ret) {
2995 hid_err(hdev, "parse failed\n");
2996 return ret;
2997 }
2998
2999 if (sc->quirks & VAIO_RDESC_CONSTANT)
3000 connect_mask |= HID_CONNECT_HIDDEV_FORCE;
3001 else if (sc->quirks & SIXAXIS_CONTROLLER)
3002 connect_mask |= HID_CONNECT_HIDDEV_FORCE;
3003
Roderick Colenbrandere19a2672017-03-07 15:45:08 -08003004 /* Patch the hw version on DS3/4 compatible devices, so applications can
Roderick Colenbrander9131f8c2016-11-23 14:07:08 -08003005 * distinguish between the default HID mappings and the mappings defined
3006 * by the Linux game controller spec. This is important for the SDL2
3007 * library, which has a game controller database, which uses device ids
3008 * in combination with version as a key.
3009 */
Roderick Colenbrandere19a2672017-03-07 15:45:08 -08003010 if (sc->quirks & (SIXAXIS_CONTROLLER | DUALSHOCK4_CONTROLLER))
Roderick Colenbrander9131f8c2016-11-23 14:07:08 -08003011 hdev->version |= 0x8000;
3012
Roderick Colenbrandere1bc84d2016-10-07 12:39:34 -07003013 ret = hid_hw_start(hdev, connect_mask);
3014 if (ret) {
3015 hid_err(hdev, "hw start failed\n");
3016 return ret;
3017 }
3018
Roderick Colenbrander4f967f62016-11-23 14:07:06 -08003019 /* sony_input_configured can fail, but this doesn't result
3020 * in hid_hw_start failures (intended). Check whether
3021 * the HID layer claimed the device else fail.
3022 * We don't know the actual reason for the failure, most
3023 * likely it is due to EEXIST in case of double connection
3024 * of USB and Bluetooth, but could have been due to ENOMEM
3025 * or other reasons as well.
3026 */
3027 if (!(hdev->claimed & HID_CLAIMED_INPUT)) {
3028 hid_err(hdev, "failed to claim input\n");
Roderick Colenbrander2bcdacb2019-09-04 14:22:11 -07003029 hid_hw_stop(hdev);
Roderick Colenbrander4f967f62016-11-23 14:07:06 -08003030 return -ENODEV;
3031 }
3032
Pascal Giardcc894ac2020-11-25 22:02:30 -05003033 if (sc->quirks & GHL_GUITAR_PS3WIIU) {
Pascal Giardfb1a79a2021-06-04 12:10:23 -04003034 sc->ghl_urb = usb_alloc_urb(0, GFP_ATOMIC);
3035 if (!sc->ghl_urb)
3036 return -ENOMEM;
3037 ret = ghl_init_urb(sc, usbdev);
3038 if (ret) {
3039 hid_err(hdev, "error preparing URB\n");
3040 return ret;
3041 }
3042
Pascal Giardcc894ac2020-11-25 22:02:30 -05003043 timer_setup(&sc->ghl_poke_timer, ghl_magic_poke, 0);
3044 mod_timer(&sc->ghl_poke_timer,
3045 jiffies + GHL_GUITAR_POKE_INTERVAL*HZ);
3046 }
3047
Roderick Colenbrandere1bc84d2016-10-07 12:39:34 -07003048 return ret;
3049}
3050
Jiri Kosinacc6e0bb2008-10-23 12:58:38 +02003051static void sony_remove(struct hid_device *hdev)
3052{
Colin Leitnerf04d5142013-05-27 23:41:05 +02003053 struct sony_sc *sc = hid_get_drvdata(hdev);
3054
Pascal Giardfb1a79a2021-06-04 12:10:23 -04003055 if (sc->quirks & GHL_GUITAR_PS3WIIU) {
Pascal Giardcc894ac2020-11-25 22:02:30 -05003056 del_timer_sync(&sc->ghl_poke_timer);
Pascal Giardfb1a79a2021-06-04 12:10:23 -04003057 usb_free_urb(sc->ghl_urb);
3058 }
Pascal Giardcc894ac2020-11-25 22:02:30 -05003059
Roderick Colenbranderac797b92016-11-23 14:07:07 -08003060 hid_hw_close(hdev);
3061
Roderick Colenbrander77b499e2017-03-24 15:17:49 -07003062 if (sc->quirks & DUALSHOCK4_CONTROLLER_BT)
3063 device_remove_file(&sc->hdev->dev, &dev_attr_bt_poll_interval);
3064
Roderick Colenbrander1a8212e2020-11-09 23:22:29 -08003065 if (sc->fw_version_created)
Roderick Colenbrander169f15a2017-12-19 11:04:43 -08003066 device_remove_file(&sc->hdev->dev, &dev_attr_firmware_version);
3067
Roderick Colenbrander1a8212e2020-11-09 23:22:29 -08003068 if (sc->hw_version_created)
Roderick Colenbrander169f15a2017-12-19 11:04:43 -08003069 device_remove_file(&sc->hdev->dev, &dev_attr_hardware_version);
3070
Frank Praznik46262042014-04-14 10:11:31 -04003071 sony_cancel_work_sync(sc);
Sven Eckelmann9f323b62013-11-17 20:38:21 +01003072
Frank Praznikd2d782f2014-02-20 11:36:03 -05003073 sony_remove_dev_list(sc);
Jiri Slabybd28ce02008-06-25 23:47:04 +02003074
Frank Praznik80250872014-04-14 10:11:35 -04003075 sony_release_device_id(sc);
3076
Jiri Slabybd28ce02008-06-25 23:47:04 +02003077 hid_hw_stop(hdev);
3078}
3079
Frank Praznikdecd9462015-11-11 09:49:38 -05003080#ifdef CONFIG_PM
3081
3082static int sony_suspend(struct hid_device *hdev, pm_message_t message)
3083{
Frank Praznik765a1072017-02-08 13:58:43 -05003084#ifdef CONFIG_SONY_FF
3085
3086 /* On suspend stop any running force-feedback events */
3087 if (SONY_FF_SUPPORT) {
Frank Praznikdecd9462015-11-11 09:49:38 -05003088 struct sony_sc *sc = hid_get_drvdata(hdev);
3089
Frank Praznikdecd9462015-11-11 09:49:38 -05003090 sc->left = sc->right = 0;
Frank Praznikdecd9462015-11-11 09:49:38 -05003091 sony_send_output_report(sc);
3092 }
3093
Frank Praznik765a1072017-02-08 13:58:43 -05003094#endif
Frank Praznikdecd9462015-11-11 09:49:38 -05003095 return 0;
3096}
3097
3098static int sony_resume(struct hid_device *hdev)
3099{
Frank Praznik765a1072017-02-08 13:58:43 -05003100 struct sony_sc *sc = hid_get_drvdata(hdev);
Frank Praznikdecd9462015-11-11 09:49:38 -05003101
Frank Praznik765a1072017-02-08 13:58:43 -05003102 /*
3103 * The Sixaxis and navigation controllers on USB need to be
3104 * reinitialized on resume or they won't behave properly.
3105 */
3106 if ((sc->quirks & SIXAXIS_CONTROLLER_USB) ||
3107 (sc->quirks & NAVIGATION_CONTROLLER_USB)) {
3108 sixaxis_set_operational_usb(sc->hdev);
3109 sc->defer_initialization = 1;
Frank Praznikdecd9462015-11-11 09:49:38 -05003110 }
3111
3112 return 0;
3113}
3114
3115#endif
3116
Jiri Slabybd28ce02008-06-25 23:47:04 +02003117static const struct hid_device_id sony_devices[] = {
3118 { HID_USB_DEVICE(USB_VENDOR_ID_SONY, USB_DEVICE_ID_SONY_PS3_CONTROLLER),
3119 .driver_data = SIXAXIS_CONTROLLER_USB },
3120 { HID_USB_DEVICE(USB_VENDOR_ID_SONY, USB_DEVICE_ID_SONY_NAVIGATION_CONTROLLER),
Simon Wood4545ee02015-06-17 00:08:52 -06003121 .driver_data = NAVIGATION_CONTROLLER_USB },
Simon Wood6eabaaa2015-06-17 00:08:51 -06003122 { HID_BLUETOOTH_DEVICE(USB_VENDOR_ID_SONY, USB_DEVICE_ID_SONY_NAVIGATION_CONTROLLER),
Simon Wood4545ee02015-06-17 00:08:52 -06003123 .driver_data = NAVIGATION_CONTROLLER_BT },
Frank Praznikc5e0c1c2015-05-05 20:47:30 -04003124 { HID_USB_DEVICE(USB_VENDOR_ID_SONY, USB_DEVICE_ID_SONY_MOTION_CONTROLLER),
Simon Woodb3bca322015-06-09 21:27:04 -06003125 .driver_data = MOTION_CONTROLLER_USB },
Simon Wooda4afa852015-06-03 09:45:19 -06003126 { HID_BLUETOOTH_DEVICE(USB_VENDOR_ID_SONY, USB_DEVICE_ID_SONY_MOTION_CONTROLLER),
Simon Woodb3bca322015-06-09 21:27:04 -06003127 .driver_data = MOTION_CONTROLLER_BT },
Jiri Slabybd28ce02008-06-25 23:47:04 +02003128 { HID_BLUETOOTH_DEVICE(USB_VENDOR_ID_SONY, USB_DEVICE_ID_SONY_PS3_CONTROLLER),
3129 .driver_data = SIXAXIS_CONTROLLER_BT },
3130 { HID_USB_DEVICE(USB_VENDOR_ID_SONY, USB_DEVICE_ID_SONY_VAIO_VGX_MOUSE),
3131 .driver_data = VAIO_RDESC_CONSTANT },
3132 { HID_USB_DEVICE(USB_VENDOR_ID_SONY, USB_DEVICE_ID_SONY_VAIO_VGP_MOUSE),
3133 .driver_data = VAIO_RDESC_CONSTANT },
Antonio Ospiteef916ef2016-02-09 13:55:07 +01003134 /*
3135 * Wired Buzz Controller. Reported as Sony Hub from its USB ID and as
3136 * Logitech joystick from the device descriptor.
3137 */
Jiri Slabybd28ce02008-06-25 23:47:04 +02003138 { HID_USB_DEVICE(USB_VENDOR_ID_SONY, USB_DEVICE_ID_SONY_BUZZ_CONTROLLER),
3139 .driver_data = BUZZ_CONTROLLER },
3140 { HID_USB_DEVICE(USB_VENDOR_ID_SONY, USB_DEVICE_ID_SONY_WIRELESS_BUZZ_CONTROLLER),
3141 .driver_data = BUZZ_CONTROLLER },
3142 /* PS3 BD Remote Control */
3143 { HID_BLUETOOTH_DEVICE(USB_VENDOR_ID_SONY, USB_DEVICE_ID_SONY_PS3_BDREMOTE),
3144 .driver_data = PS3REMOTE },
3145 /* Logitech Harmony Adapter for PS3 */
3146 { HID_BLUETOOTH_DEVICE(USB_VENDOR_ID_LOGITECH, USB_DEVICE_ID_LOGITECH_HARMONY_PS3),
3147 .driver_data = PS3REMOTE },
Frank Praznik68a49e52014-11-12 14:52:28 -05003148 /* SMK-Link PS3 BD Remote Control */
3149 { HID_BLUETOOTH_DEVICE(USB_VENDOR_ID_SMK, USB_DEVICE_ID_SMK_PS3_BDREMOTE),
3150 .driver_data = PS3REMOTE },
Frank Praznik0bd88dd2014-01-11 15:12:42 -05003151 /* Sony Dualshock 4 controllers for PS4 */
3152 { HID_USB_DEVICE(USB_VENDOR_ID_SONY, USB_DEVICE_ID_SONY_PS4_CONTROLLER),
Frank Praznik8ab16762014-01-16 21:42:31 -05003153 .driver_data = DUALSHOCK4_CONTROLLER_USB },
Frank Praznik0bd88dd2014-01-11 15:12:42 -05003154 { HID_BLUETOOTH_DEVICE(USB_VENDOR_ID_SONY, USB_DEVICE_ID_SONY_PS4_CONTROLLER),
Frank Praznik8ab16762014-01-16 21:42:31 -05003155 .driver_data = DUALSHOCK4_CONTROLLER_BT },
Roderick Colenbrandercf1015d2016-10-07 12:39:40 -07003156 { HID_USB_DEVICE(USB_VENDOR_ID_SONY, USB_DEVICE_ID_SONY_PS4_CONTROLLER_2),
3157 .driver_data = DUALSHOCK4_CONTROLLER_USB },
3158 { HID_BLUETOOTH_DEVICE(USB_VENDOR_ID_SONY, USB_DEVICE_ID_SONY_PS4_CONTROLLER_2),
3159 .driver_data = DUALSHOCK4_CONTROLLER_BT },
Roderick Colenbranderde66a1a2016-11-23 14:07:11 -08003160 { HID_USB_DEVICE(USB_VENDOR_ID_SONY, USB_DEVICE_ID_SONY_PS4_CONTROLLER_DONGLE),
Roderick Colenbrander35f436c2017-03-07 15:45:04 -08003161 .driver_data = DUALSHOCK4_DONGLE },
Scott Moreau74500cc2016-01-13 07:40:42 -07003162 /* Nyko Core Controller for PS3 */
3163 { HID_USB_DEVICE(USB_VENDOR_ID_SINO_LITE, USB_DEVICE_ID_SINO_LITE_CONTROLLER),
3164 .driver_data = SIXAXIS_CONTROLLER_USB | SINO_LITE_CONTROLLER },
Todd Kelnerb7289cb2018-02-17 16:47:10 -07003165 /* SMK-Link NSG-MR5U Remote Control */
3166 { HID_BLUETOOTH_DEVICE(USB_VENDOR_ID_SMK, USB_DEVICE_ID_SMK_NSG_MR5U_REMOTE),
3167 .driver_data = NSG_MR5U_REMOTE_BT },
3168 /* SMK-Link NSG-MR7U Remote Control */
3169 { HID_BLUETOOTH_DEVICE(USB_VENDOR_ID_SMK, USB_DEVICE_ID_SMK_NSG_MR7U_REMOTE),
3170 .driver_data = NSG_MR7U_REMOTE_BT },
Pascal Giardcc894ac2020-11-25 22:02:30 -05003171 /* Guitar Hero Live PS3 and Wii U guitar dongles */
Sanjay Govind32e411d2020-12-04 18:45:27 +13003172 { HID_USB_DEVICE(USB_VENDOR_ID_SONY_RHYTHM, USB_DEVICE_ID_SONY_PS3WIIU_GHLIVE_DONGLE),
3173 .driver_data = GHL_GUITAR_PS3WIIU | GH_GUITAR_CONTROLLER },
3174 /* Guitar Hero PC Guitar Dongle */
3175 { HID_USB_DEVICE(USB_VENDOR_ID_ACTIVISION, USB_DEVICE_ID_ACTIVISION_GUITAR_DONGLE),
3176 .driver_data = GH_GUITAR_CONTROLLER },
3177 /* Guitar Hero PS3 World Tour Guitar Dongle */
3178 { HID_USB_DEVICE(USB_VENDOR_ID_SONY_RHYTHM, USB_DEVICE_ID_SONY_PS3_GUITAR_DONGLE),
3179 .driver_data = GH_GUITAR_CONTROLLER },
Jiri Slabybd28ce02008-06-25 23:47:04 +02003180 { }
3181};
3182MODULE_DEVICE_TABLE(hid, sony_devices);
3183
3184static struct hid_driver sony_driver = {
Frank Praznikce8efc32014-09-18 21:15:01 -04003185 .name = "sony",
3186 .id_table = sony_devices,
3187 .input_mapping = sony_mapping,
3188 .input_configured = sony_input_configured,
3189 .probe = sony_probe,
3190 .remove = sony_remove,
3191 .report_fixup = sony_report_fixup,
Frank Praznikdecd9462015-11-11 09:49:38 -05003192 .raw_event = sony_raw_event,
3193
3194#ifdef CONFIG_PM
3195 .suspend = sony_suspend,
3196 .resume = sony_resume,
3197 .reset_resume = sony_resume,
3198#endif
Jiri Slabybd28ce02008-06-25 23:47:04 +02003199};
Frank Praznik80250872014-04-14 10:11:35 -04003200
3201static int __init sony_init(void)
3202{
3203 dbg_hid("Sony:%s\n", __func__);
3204
3205 return hid_register_driver(&sony_driver);
3206}
3207
3208static void __exit sony_exit(void)
3209{
3210 dbg_hid("Sony:%s\n", __func__);
3211
Frank Praznik80250872014-04-14 10:11:35 -04003212 hid_unregister_driver(&sony_driver);
Antonio Ospite6c400652015-02-16 22:58:24 +01003213 ida_destroy(&sony_device_id_allocator);
Frank Praznik80250872014-04-14 10:11:35 -04003214}
3215module_init(sony_init);
3216module_exit(sony_exit);
Jiri Slabybd28ce02008-06-25 23:47:04 +02003217
3218MODULE_LICENSE("GPL");