hid-sony.c 96.0 KB
Newer Older
J
Jiri Slaby 已提交
1
/*
2
 *  HID driver for Sony / PS2 / PS3 / PS4 BD devices.
J
Jiri Slaby 已提交
3 4 5 6 7
 *
 *  Copyright (c) 1999 Andreas Gal
 *  Copyright (c) 2000-2005 Vojtech Pavlik <vojtech@suse.cz>
 *  Copyright (c) 2005 Michael Haboustak <mike-@cinci.rr.com> for Concept2, Inc
 *  Copyright (c) 2008 Jiri Slaby
8 9
 *  Copyright (c) 2012 David Dillow <dave@thedillows.org>
 *  Copyright (c) 2006-2013 Jiri Kosina
10
 *  Copyright (c) 2013 Colin Leitner <colin.leitner@gmail.com>
11
 *  Copyright (c) 2014-2016 Frank Praznik <frank.praznik@gmail.com>
J
Jiri Slaby 已提交
12 13 14 15 16 17 18 19 20
 */

/*
 * This program is free software; you can redistribute it and/or modify it
 * under the terms of the GNU General Public License as published by the Free
 * Software Foundation; either version 2 of the License, or (at your option)
 * any later version.
 */

21 22
/*
 * NOTE: in order for the Sony PS3 BD Remote Control to be found by
23 24 25 26 27 28
 * a Bluetooth host, the key combination Start+Enter has to be kept pressed
 * for about 7 seconds with the Bluetooth Host Controller in discovering mode.
 *
 * There will be no PIN request from the device.
 */

J
Jiri Slaby 已提交
29 30 31
#include <linux/device.h>
#include <linux/hid.h>
#include <linux/module.h>
32
#include <linux/slab.h>
J
Jiri Kosina 已提交
33
#include <linux/leds.h>
34 35
#include <linux/power_supply.h>
#include <linux/spinlock.h>
36
#include <linux/list.h>
37
#include <linux/idr.h>
38
#include <linux/input/mt.h>
J
Jiri Slaby 已提交
39 40 41

#include "hid-ids.h"

42 43 44 45 46
#define VAIO_RDESC_CONSTANT       BIT(0)
#define SIXAXIS_CONTROLLER_USB    BIT(1)
#define SIXAXIS_CONTROLLER_BT     BIT(2)
#define BUZZ_CONTROLLER           BIT(3)
#define PS3REMOTE                 BIT(4)
47 48
#define DUALSHOCK4_CONTROLLER_USB BIT(5)
#define DUALSHOCK4_CONTROLLER_BT  BIT(6)
49 50
#define MOTION_CONTROLLER_USB     BIT(7)
#define MOTION_CONTROLLER_BT      BIT(8)
51 52
#define NAVIGATION_CONTROLLER_USB BIT(9)
#define NAVIGATION_CONTROLLER_BT  BIT(10)
53
#define SINO_LITE_CONTROLLER      BIT(11)
54
#define FUTUREMAX_DANCE_MAT       BIT(12)
55

56
#define SIXAXIS_CONTROLLER (SIXAXIS_CONTROLLER_USB | SIXAXIS_CONTROLLER_BT)
57
#define MOTION_CONTROLLER (MOTION_CONTROLLER_USB | MOTION_CONTROLLER_BT)
58 59
#define NAVIGATION_CONTROLLER (NAVIGATION_CONTROLLER_USB |\
				NAVIGATION_CONTROLLER_BT)
60 61
#define DUALSHOCK4_CONTROLLER (DUALSHOCK4_CONTROLLER_USB |\
				DUALSHOCK4_CONTROLLER_BT)
62
#define SONY_LED_SUPPORT (SIXAXIS_CONTROLLER | BUZZ_CONTROLLER |\
63 64
				DUALSHOCK4_CONTROLLER | MOTION_CONTROLLER |\
				NAVIGATION_CONTROLLER)
65
#define SONY_BATTERY_SUPPORT (SIXAXIS_CONTROLLER | DUALSHOCK4_CONTROLLER |\
66
				MOTION_CONTROLLER_BT | NAVIGATION_CONTROLLER)
67 68
#define SONY_FF_SUPPORT (SIXAXIS_CONTROLLER | DUALSHOCK4_CONTROLLER |\
				MOTION_CONTROLLER)
69 70
#define SONY_BT_DEVICE (SIXAXIS_CONTROLLER_BT | DUALSHOCK4_CONTROLLER_BT |\
			MOTION_CONTROLLER_BT | NAVIGATION_CONTROLLER_BT)
71 72

#define MAX_LEDS 4
73

74 75 76 77 78 79 80
/*
 * The Sixaxis reports both digital and analog values for each button on the
 * controller except for Start, Select and the PS button.  The controller ends
 * up reporting 27 axes which causes them to spill over into the multi-touch
 * axis values.  Additionally, the controller only has 20 actual, physical axes
 * so there are several unused axes in between the used ones.
 */
81
static u8 sixaxis_rdesc[] = {
82
	0x05, 0x01,         /*  Usage Page (Desktop),               */
83
	0x09, 0x04,         /*  Usage (Joystick),                   */
84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155
	0xA1, 0x01,         /*  Collection (Application),           */
	0xA1, 0x02,         /*      Collection (Logical),           */
	0x85, 0x01,         /*          Report ID (1),              */
	0x75, 0x08,         /*          Report Size (8),            */
	0x95, 0x01,         /*          Report Count (1),           */
	0x15, 0x00,         /*          Logical Minimum (0),        */
	0x26, 0xFF, 0x00,   /*          Logical Maximum (255),      */
	0x81, 0x03,         /*          Input (Constant, Variable), */
	0x75, 0x01,         /*          Report Size (1),            */
	0x95, 0x13,         /*          Report Count (19),          */
	0x15, 0x00,         /*          Logical Minimum (0),        */
	0x25, 0x01,         /*          Logical Maximum (1),        */
	0x35, 0x00,         /*          Physical Minimum (0),       */
	0x45, 0x01,         /*          Physical Maximum (1),       */
	0x05, 0x09,         /*          Usage Page (Button),        */
	0x19, 0x01,         /*          Usage Minimum (01h),        */
	0x29, 0x13,         /*          Usage Maximum (13h),        */
	0x81, 0x02,         /*          Input (Variable),           */
	0x75, 0x01,         /*          Report Size (1),            */
	0x95, 0x0D,         /*          Report Count (13),          */
	0x06, 0x00, 0xFF,   /*          Usage Page (FF00h),         */
	0x81, 0x03,         /*          Input (Constant, Variable), */
	0x15, 0x00,         /*          Logical Minimum (0),        */
	0x26, 0xFF, 0x00,   /*          Logical Maximum (255),      */
	0x05, 0x01,         /*          Usage Page (Desktop),       */
	0x09, 0x01,         /*          Usage (Pointer),            */
	0xA1, 0x00,         /*          Collection (Physical),      */
	0x75, 0x08,         /*              Report Size (8),        */
	0x95, 0x04,         /*              Report Count (4),       */
	0x35, 0x00,         /*              Physical Minimum (0),   */
	0x46, 0xFF, 0x00,   /*              Physical Maximum (255), */
	0x09, 0x30,         /*              Usage (X),              */
	0x09, 0x31,         /*              Usage (Y),              */
	0x09, 0x32,         /*              Usage (Z),              */
	0x09, 0x35,         /*              Usage (Rz),             */
	0x81, 0x02,         /*              Input (Variable),       */
	0xC0,               /*          End Collection,             */
	0x05, 0x01,         /*          Usage Page (Desktop),       */
	0x95, 0x13,         /*          Report Count (19),          */
	0x09, 0x01,         /*          Usage (Pointer),            */
	0x81, 0x02,         /*          Input (Variable),           */
	0x95, 0x0C,         /*          Report Count (12),          */
	0x81, 0x01,         /*          Input (Constant),           */
	0x75, 0x10,         /*          Report Size (16),           */
	0x95, 0x04,         /*          Report Count (4),           */
	0x26, 0xFF, 0x03,   /*          Logical Maximum (1023),     */
	0x46, 0xFF, 0x03,   /*          Physical Maximum (1023),    */
	0x09, 0x01,         /*          Usage (Pointer),            */
	0x81, 0x02,         /*          Input (Variable),           */
	0xC0,               /*      End Collection,                 */
	0xA1, 0x02,         /*      Collection (Logical),           */
	0x85, 0x02,         /*          Report ID (2),              */
	0x75, 0x08,         /*          Report Size (8),            */
	0x95, 0x30,         /*          Report Count (48),          */
	0x09, 0x01,         /*          Usage (Pointer),            */
	0xB1, 0x02,         /*          Feature (Variable),         */
	0xC0,               /*      End Collection,                 */
	0xA1, 0x02,         /*      Collection (Logical),           */
	0x85, 0xEE,         /*          Report ID (238),            */
	0x75, 0x08,         /*          Report Size (8),            */
	0x95, 0x30,         /*          Report Count (48),          */
	0x09, 0x01,         /*          Usage (Pointer),            */
	0xB1, 0x02,         /*          Feature (Variable),         */
	0xC0,               /*      End Collection,                 */
	0xA1, 0x02,         /*      Collection (Logical),           */
	0x85, 0xEF,         /*          Report ID (239),            */
	0x75, 0x08,         /*          Report Size (8),            */
	0x95, 0x30,         /*          Report Count (48),          */
	0x09, 0x01,         /*          Usage (Pointer),            */
	0xB1, 0x02,         /*          Feature (Variable),         */
	0xC0,               /*      End Collection,                 */
	0xC0                /*  End Collection                      */
156 157
};

158
/* PS/3 Motion controller */
159
static u8 motion_rdesc[] = {
160 161 162 163 164 165
	0x05, 0x01,         /*  Usage Page (Desktop),               */
	0x09, 0x04,         /*  Usage (Joystick),                   */
	0xA1, 0x01,         /*  Collection (Application),           */
	0xA1, 0x02,         /*      Collection (Logical),           */
	0x85, 0x01,         /*          Report ID (1),              */
	0x75, 0x01,         /*          Report Size (1),            */
166
	0x95, 0x15,         /*          Report Count (21),          */
167 168 169 170 171 172
	0x15, 0x00,         /*          Logical Minimum (0),        */
	0x25, 0x01,         /*          Logical Maximum (1),        */
	0x35, 0x00,         /*          Physical Minimum (0),       */
	0x45, 0x01,         /*          Physical Maximum (1),       */
	0x05, 0x09,         /*          Usage Page (Button),        */
	0x19, 0x01,         /*          Usage Minimum (01h),        */
173 174 175
	0x29, 0x15,         /*          Usage Maximum (15h),        */
	0x81, 0x02,         /*          Input (Variable),           * Buttons */
	0x95, 0x0B,         /*          Report Count (11),          */
176
	0x06, 0x00, 0xFF,   /*          Usage Page (FF00h),         */
177
	0x81, 0x03,         /*          Input (Constant, Variable), * Padding */
178 179 180 181 182
	0x15, 0x00,         /*          Logical Minimum (0),        */
	0x26, 0xFF, 0x00,   /*          Logical Maximum (255),      */
	0x05, 0x01,         /*          Usage Page (Desktop),       */
	0xA1, 0x00,         /*          Collection (Physical),      */
	0x75, 0x08,         /*              Report Size (8),        */
183
	0x95, 0x01,         /*              Report Count (1),       */
184 185 186
	0x35, 0x00,         /*              Physical Minimum (0),   */
	0x46, 0xFF, 0x00,   /*              Physical Maximum (255), */
	0x09, 0x30,         /*              Usage (X),              */
187
	0x81, 0x02,         /*              Input (Variable),       * Trigger */
188
	0xC0,               /*          End Collection,             */
189 190 191
	0x06, 0x00, 0xFF,   /*          Usage Page (FF00h),         */
	0x75, 0x08,         /*          Report Size (8),            */
	0x95, 0x07,         /*          Report Count (7),           * skip 7 bytes */
192
	0x81, 0x02,         /*          Input (Variable),           */
193
	0x05, 0x01,         /*          Usage Page (Desktop),       */
194
	0x75, 0x10,         /*          Report Size (16),           */
195 196 197 198 199 200 201 202 203 204 205
	0x46, 0xFF, 0xFF,   /*          Physical Maximum (65535),   */
	0x27, 0xFF, 0xFF, 0x00, 0x00, /*      Logical Maximum (65535),    */
	0x95, 0x03,         /*          Report Count (3),           * 3x Accels */
	0x09, 0x33,         /*              Usage (rX),             */
	0x09, 0x34,         /*              Usage (rY),             */
	0x09, 0x35,         /*              Usage (rZ),             */
	0x81, 0x02,         /*          Input (Variable),           */
	0x06, 0x00, 0xFF,   /*          Usage Page (FF00h),         */
	0x95, 0x03,         /*          Report Count (3),           * Skip Accels 2nd frame */
	0x81, 0x02,         /*          Input (Variable),           */
	0x05, 0x01,         /*          Usage Page (Desktop),       */
206
	0x09, 0x01,         /*          Usage (Pointer),            */
207 208 209 210
	0x95, 0x03,         /*          Report Count (3),           * 3x Gyros */
	0x81, 0x02,         /*          Input (Variable),           */
	0x06, 0x00, 0xFF,   /*          Usage Page (FF00h),         */
	0x95, 0x03,         /*          Report Count (3),           * Skip Gyros 2nd frame */
211
	0x81, 0x02,         /*          Input (Variable),           */
212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229
	0x75, 0x0C,         /*          Report Size (12),           */
	0x46, 0xFF, 0x0F,   /*          Physical Maximum (4095),    */
	0x26, 0xFF, 0x0F,   /*          Logical Maximum (4095),     */
	0x95, 0x04,         /*          Report Count (4),           * Skip Temp and Magnetometers */
	0x81, 0x02,         /*          Input (Variable),           */
	0x75, 0x08,         /*          Report Size (8),            */
	0x46, 0xFF, 0x00,   /*          Physical Maximum (255),     */
	0x26, 0xFF, 0x00,   /*          Logical Maximum (255),      */
	0x95, 0x06,         /*          Report Count (6),           * Skip Timestamp and Extension Bytes */
	0x81, 0x02,         /*          Input (Variable),           */
	0x75, 0x08,         /*          Report Size (8),            */
	0x95, 0x30,         /*          Report Count (48),          */
	0x09, 0x01,         /*          Usage (Pointer),            */
	0x91, 0x02,         /*          Output (Variable),          */
	0x75, 0x08,         /*          Report Size (8),            */
	0x95, 0x30,         /*          Report Count (48),          */
	0x09, 0x01,         /*          Usage (Pointer),            */
	0xB1, 0x02,         /*          Feature (Variable),         */
230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254
	0xC0,               /*      End Collection,                 */
	0xA1, 0x02,         /*      Collection (Logical),           */
	0x85, 0x02,         /*          Report ID (2),              */
	0x75, 0x08,         /*          Report Size (8),            */
	0x95, 0x30,         /*          Report Count (48),          */
	0x09, 0x01,         /*          Usage (Pointer),            */
	0xB1, 0x02,         /*          Feature (Variable),         */
	0xC0,               /*      End Collection,                 */
	0xA1, 0x02,         /*      Collection (Logical),           */
	0x85, 0xEE,         /*          Report ID (238),            */
	0x75, 0x08,         /*          Report Size (8),            */
	0x95, 0x30,         /*          Report Count (48),          */
	0x09, 0x01,         /*          Usage (Pointer),            */
	0xB1, 0x02,         /*          Feature (Variable),         */
	0xC0,               /*      End Collection,                 */
	0xA1, 0x02,         /*      Collection (Logical),           */
	0x85, 0xEF,         /*          Report ID (239),            */
	0x75, 0x08,         /*          Report Size (8),            */
	0x95, 0x30,         /*          Report Count (48),          */
	0x09, 0x01,         /*          Usage (Pointer),            */
	0xB1, 0x02,         /*          Feature (Variable),         */
	0xC0,               /*      End Collection,                 */
	0xC0                /*  End Collection                      */
};

255
/* PS/3 Navigation controller */
256
static u8 navigation_rdesc[] = {
257
	0x05, 0x01,         /*  Usage Page (Desktop),               */
258
	0x09, 0x04,         /*  Usage (Joystick),                   */
259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302
	0xA1, 0x01,         /*  Collection (Application),           */
	0xA1, 0x02,         /*      Collection (Logical),           */
	0x85, 0x01,         /*          Report ID (1),              */
	0x75, 0x08,         /*          Report Size (8),            */
	0x95, 0x01,         /*          Report Count (1),           */
	0x15, 0x00,         /*          Logical Minimum (0),        */
	0x26, 0xFF, 0x00,   /*          Logical Maximum (255),      */
	0x81, 0x03,         /*          Input (Constant, Variable), */
	0x75, 0x01,         /*          Report Size (1),            */
	0x95, 0x13,         /*          Report Count (19),          */
	0x15, 0x00,         /*          Logical Minimum (0),        */
	0x25, 0x01,         /*          Logical Maximum (1),        */
	0x35, 0x00,         /*          Physical Minimum (0),       */
	0x45, 0x01,         /*          Physical Maximum (1),       */
	0x05, 0x09,         /*          Usage Page (Button),        */
	0x19, 0x01,         /*          Usage Minimum (01h),        */
	0x29, 0x13,         /*          Usage Maximum (13h),        */
	0x81, 0x02,         /*          Input (Variable),           */
	0x75, 0x01,         /*          Report Size (1),            */
	0x95, 0x0D,         /*          Report Count (13),          */
	0x06, 0x00, 0xFF,   /*          Usage Page (FF00h),         */
	0x81, 0x03,         /*          Input (Constant, Variable), */
	0x15, 0x00,         /*          Logical Minimum (0),        */
	0x26, 0xFF, 0x00,   /*          Logical Maximum (255),      */
	0x05, 0x01,         /*          Usage Page (Desktop),       */
	0x09, 0x01,         /*          Usage (Pointer),            */
	0xA1, 0x00,         /*          Collection (Physical),      */
	0x75, 0x08,         /*              Report Size (8),        */
	0x95, 0x02,         /*              Report Count (2),       */
	0x35, 0x00,         /*              Physical Minimum (0),   */
	0x46, 0xFF, 0x00,   /*              Physical Maximum (255), */
	0x09, 0x30,         /*              Usage (X),              */
	0x09, 0x31,         /*              Usage (Y),              */
	0x81, 0x02,         /*              Input (Variable),       */
	0xC0,               /*          End Collection,             */
	0x06, 0x00, 0xFF,   /*          Usage Page (FF00h),         */
	0x95, 0x06,         /*          Report Count (6),           */
	0x81, 0x03,         /*          Input (Constant, Variable), */
	0x05, 0x01,         /*          Usage Page (Desktop),       */
	0x75, 0x08,         /*          Report Size (8),            */
	0x95, 0x05,         /*          Report Count (5),           */
	0x09, 0x01,         /*          Usage (Pointer),            */
	0x81, 0x02,         /*          Input (Variable),           */
	0x06, 0x00, 0xFF,   /*          Usage Page (FF00h),         */
303 304 305 306 307 308 309 310
	0x95, 0x01,         /*          Report Count (1),           */
	0x81, 0x02,         /*          Input (Variable),           */
	0x05, 0x01,         /*          Usage Page (Desktop),       */
	0x95, 0x01,         /*          Report Count (1),           */
	0x09, 0x01,         /*          Usage (Pointer),            */
	0x81, 0x02,         /*          Input (Variable),           */
	0x06, 0x00, 0xFF,   /*          Usage Page (FF00h),         */
	0x95, 0x1E,         /*          Report Count (24),          */
311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343
	0x81, 0x02,         /*          Input (Variable),           */
	0x75, 0x08,         /*          Report Size (8),            */
	0x95, 0x30,         /*          Report Count (48),          */
	0x09, 0x01,         /*          Usage (Pointer),            */
	0x91, 0x02,         /*          Output (Variable),          */
	0x75, 0x08,         /*          Report Size (8),            */
	0x95, 0x30,         /*          Report Count (48),          */
	0x09, 0x01,         /*          Usage (Pointer),            */
	0xB1, 0x02,         /*          Feature (Variable),         */
	0xC0,               /*      End Collection,                 */
	0xA1, 0x02,         /*      Collection (Logical),           */
	0x85, 0x02,         /*          Report ID (2),              */
	0x75, 0x08,         /*          Report Size (8),            */
	0x95, 0x30,         /*          Report Count (48),          */
	0x09, 0x01,         /*          Usage (Pointer),            */
	0xB1, 0x02,         /*          Feature (Variable),         */
	0xC0,               /*      End Collection,                 */
	0xA1, 0x02,         /*      Collection (Logical),           */
	0x85, 0xEE,         /*          Report ID (238),            */
	0x75, 0x08,         /*          Report Size (8),            */
	0x95, 0x30,         /*          Report Count (48),          */
	0x09, 0x01,         /*          Usage (Pointer),            */
	0xB1, 0x02,         /*          Feature (Variable),         */
	0xC0,               /*      End Collection,                 */
	0xA1, 0x02,         /*      Collection (Logical),           */
	0x85, 0xEF,         /*          Report ID (239),            */
	0x75, 0x08,         /*          Report Size (8),            */
	0x95, 0x30,         /*          Report Count (48),          */
	0x09, 0x01,         /*          Usage (Pointer),            */
	0xB1, 0x02,         /*          Feature (Variable),         */
	0xC0,               /*      End Collection,                 */
	0xC0                /*  End Collection                      */
};
344

345 346
/*
 * The default descriptor doesn't provide mapping for the accelerometers
347 348 349 350
 * or orientation sensors.  This fixed descriptor maps the accelerometers
 * to usage values 0x40, 0x41 and 0x42 and maps the orientation sensors
 * to usage values 0x43, 0x44 and 0x45.
 */
351
static u8 dualshock4_usb_rdesc[] = {
352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 385 386 387
	0x05, 0x01,         /*  Usage Page (Desktop),               */
	0x09, 0x05,         /*  Usage (Gamepad),                    */
	0xA1, 0x01,         /*  Collection (Application),           */
	0x85, 0x01,         /*      Report ID (1),                  */
	0x09, 0x30,         /*      Usage (X),                      */
	0x09, 0x31,         /*      Usage (Y),                      */
	0x09, 0x32,         /*      Usage (Z),                      */
	0x09, 0x35,         /*      Usage (Rz),                     */
	0x15, 0x00,         /*      Logical Minimum (0),            */
	0x26, 0xFF, 0x00,   /*      Logical Maximum (255),          */
	0x75, 0x08,         /*      Report Size (8),                */
	0x95, 0x04,         /*      Report Count (4),               */
	0x81, 0x02,         /*      Input (Variable),               */
	0x09, 0x39,         /*      Usage (Hat Switch),             */
	0x15, 0x00,         /*      Logical Minimum (0),            */
	0x25, 0x07,         /*      Logical Maximum (7),            */
	0x35, 0x00,         /*      Physical Minimum (0),           */
	0x46, 0x3B, 0x01,   /*      Physical Maximum (315),         */
	0x65, 0x14,         /*      Unit (Degrees),                 */
	0x75, 0x04,         /*      Report Size (4),                */
	0x95, 0x01,         /*      Report Count (1),               */
	0x81, 0x42,         /*      Input (Variable, Null State),   */
	0x65, 0x00,         /*      Unit,                           */
	0x05, 0x09,         /*      Usage Page (Button),            */
	0x19, 0x01,         /*      Usage Minimum (01h),            */
	0x29, 0x0E,         /*      Usage Maximum (0Eh),            */
	0x15, 0x00,         /*      Logical Minimum (0),            */
	0x25, 0x01,         /*      Logical Maximum (1),            */
	0x75, 0x01,         /*      Report Size (1),                */
	0x95, 0x0E,         /*      Report Count (14),              */
	0x81, 0x02,         /*      Input (Variable),               */
	0x06, 0x00, 0xFF,   /*      Usage Page (FF00h),             */
	0x09, 0x20,         /*      Usage (20h),                    */
	0x75, 0x06,         /*      Report Size (6),                */
	0x95, 0x01,         /*      Report Count (1),               */
	0x15, 0x00,         /*      Logical Minimum (0),            */
388
	0x25, 0x3F,         /*      Logical Maximum (63),           */
389 390 391 392 393 394 395 396 397 398 399 400 401 402 403 404 405 406 407 408 409 410 411
	0x81, 0x02,         /*      Input (Variable),               */
	0x05, 0x01,         /*      Usage Page (Desktop),           */
	0x09, 0x33,         /*      Usage (Rx),                     */
	0x09, 0x34,         /*      Usage (Ry),                     */
	0x15, 0x00,         /*      Logical Minimum (0),            */
	0x26, 0xFF, 0x00,   /*      Logical Maximum (255),          */
	0x75, 0x08,         /*      Report Size (8),                */
	0x95, 0x02,         /*      Report Count (2),               */
	0x81, 0x02,         /*      Input (Variable),               */
	0x06, 0x00, 0xFF,   /*      Usage Page (FF00h),             */
	0x09, 0x21,         /*      Usage (21h),                    */
	0x95, 0x03,         /*      Report Count (3),               */
	0x81, 0x02,         /*      Input (Variable),               */
	0x05, 0x01,         /*      Usage Page (Desktop),           */
	0x19, 0x40,         /*      Usage Minimum (40h),            */
	0x29, 0x42,         /*      Usage Maximum (42h),            */
	0x16, 0x00, 0x80,   /*      Logical Minimum (-32768),       */
	0x26, 0x00, 0x7F,   /*      Logical Maximum (32767),        */
	0x75, 0x10,         /*      Report Size (16),               */
	0x95, 0x03,         /*      Report Count (3),               */
	0x81, 0x02,         /*      Input (Variable),               */
	0x19, 0x43,         /*      Usage Minimum (43h),            */
	0x29, 0x45,         /*      Usage Maximum (45h),            */
412 413
	0x16, 0x00, 0xE0,   /*      Logical Minimum (-8192),        */
	0x26, 0xFF, 0x1F,   /*      Logical Maximum (8191),         */
414 415 416 417 418
	0x95, 0x03,         /*      Report Count (3),               */
	0x81, 0x02,         /*      Input (Variable),               */
	0x06, 0x00, 0xFF,   /*      Usage Page (FF00h),             */
	0x09, 0x21,         /*      Usage (21h),                    */
	0x15, 0x00,         /*      Logical Minimum (0),            */
419
	0x26, 0xFF, 0x00,   /*      Logical Maximum (255),          */
420 421 422 423 424 425 426 427 428 429 430 431 432 433 434 435 436 437 438 439 440 441 442 443 444 445 446 447 448 449 450 451 452 453 454 455 456 457 458 459 460 461 462 463 464 465 466 467 468 469 470 471 472 473 474 475 476 477 478 479 480 481 482 483 484 485 486 487 488 489 490 491 492 493 494 495 496 497 498 499 500 501 502 503 504 505 506 507 508 509 510 511 512 513 514 515 516 517 518 519 520 521 522 523 524 525 526 527 528 529 530 531 532 533 534 535 536 537 538 539 540 541 542 543 544 545 546 547 548 549 550 551 552 553 554 555 556 557 558 559 560 561 562 563 564 565 566 567 568 569 570 571 572 573 574 575 576 577 578 579 580 581 582 583 584 585 586 587 588 589 590 591 592 593 594 595 596 597 598 599 600 601 602
	0x75, 0x08,         /*      Report Size (8),                */
	0x95, 0x27,         /*      Report Count (39),              */
	0x81, 0x02,         /*      Input (Variable),               */
	0x85, 0x05,         /*      Report ID (5),                  */
	0x09, 0x22,         /*      Usage (22h),                    */
	0x95, 0x1F,         /*      Report Count (31),              */
	0x91, 0x02,         /*      Output (Variable),              */
	0x85, 0x04,         /*      Report ID (4),                  */
	0x09, 0x23,         /*      Usage (23h),                    */
	0x95, 0x24,         /*      Report Count (36),              */
	0xB1, 0x02,         /*      Feature (Variable),             */
	0x85, 0x02,         /*      Report ID (2),                  */
	0x09, 0x24,         /*      Usage (24h),                    */
	0x95, 0x24,         /*      Report Count (36),              */
	0xB1, 0x02,         /*      Feature (Variable),             */
	0x85, 0x08,         /*      Report ID (8),                  */
	0x09, 0x25,         /*      Usage (25h),                    */
	0x95, 0x03,         /*      Report Count (3),               */
	0xB1, 0x02,         /*      Feature (Variable),             */
	0x85, 0x10,         /*      Report ID (16),                 */
	0x09, 0x26,         /*      Usage (26h),                    */
	0x95, 0x04,         /*      Report Count (4),               */
	0xB1, 0x02,         /*      Feature (Variable),             */
	0x85, 0x11,         /*      Report ID (17),                 */
	0x09, 0x27,         /*      Usage (27h),                    */
	0x95, 0x02,         /*      Report Count (2),               */
	0xB1, 0x02,         /*      Feature (Variable),             */
	0x85, 0x12,         /*      Report ID (18),                 */
	0x06, 0x02, 0xFF,   /*      Usage Page (FF02h),             */
	0x09, 0x21,         /*      Usage (21h),                    */
	0x95, 0x0F,         /*      Report Count (15),              */
	0xB1, 0x02,         /*      Feature (Variable),             */
	0x85, 0x13,         /*      Report ID (19),                 */
	0x09, 0x22,         /*      Usage (22h),                    */
	0x95, 0x16,         /*      Report Count (22),              */
	0xB1, 0x02,         /*      Feature (Variable),             */
	0x85, 0x14,         /*      Report ID (20),                 */
	0x06, 0x05, 0xFF,   /*      Usage Page (FF05h),             */
	0x09, 0x20,         /*      Usage (20h),                    */
	0x95, 0x10,         /*      Report Count (16),              */
	0xB1, 0x02,         /*      Feature (Variable),             */
	0x85, 0x15,         /*      Report ID (21),                 */
	0x09, 0x21,         /*      Usage (21h),                    */
	0x95, 0x2C,         /*      Report Count (44),              */
	0xB1, 0x02,         /*      Feature (Variable),             */
	0x06, 0x80, 0xFF,   /*      Usage Page (FF80h),             */
	0x85, 0x80,         /*      Report ID (128),                */
	0x09, 0x20,         /*      Usage (20h),                    */
	0x95, 0x06,         /*      Report Count (6),               */
	0xB1, 0x02,         /*      Feature (Variable),             */
	0x85, 0x81,         /*      Report ID (129),                */
	0x09, 0x21,         /*      Usage (21h),                    */
	0x95, 0x06,         /*      Report Count (6),               */
	0xB1, 0x02,         /*      Feature (Variable),             */
	0x85, 0x82,         /*      Report ID (130),                */
	0x09, 0x22,         /*      Usage (22h),                    */
	0x95, 0x05,         /*      Report Count (5),               */
	0xB1, 0x02,         /*      Feature (Variable),             */
	0x85, 0x83,         /*      Report ID (131),                */
	0x09, 0x23,         /*      Usage (23h),                    */
	0x95, 0x01,         /*      Report Count (1),               */
	0xB1, 0x02,         /*      Feature (Variable),             */
	0x85, 0x84,         /*      Report ID (132),                */
	0x09, 0x24,         /*      Usage (24h),                    */
	0x95, 0x04,         /*      Report Count (4),               */
	0xB1, 0x02,         /*      Feature (Variable),             */
	0x85, 0x85,         /*      Report ID (133),                */
	0x09, 0x25,         /*      Usage (25h),                    */
	0x95, 0x06,         /*      Report Count (6),               */
	0xB1, 0x02,         /*      Feature (Variable),             */
	0x85, 0x86,         /*      Report ID (134),                */
	0x09, 0x26,         /*      Usage (26h),                    */
	0x95, 0x06,         /*      Report Count (6),               */
	0xB1, 0x02,         /*      Feature (Variable),             */
	0x85, 0x87,         /*      Report ID (135),                */
	0x09, 0x27,         /*      Usage (27h),                    */
	0x95, 0x23,         /*      Report Count (35),              */
	0xB1, 0x02,         /*      Feature (Variable),             */
	0x85, 0x88,         /*      Report ID (136),                */
	0x09, 0x28,         /*      Usage (28h),                    */
	0x95, 0x22,         /*      Report Count (34),              */
	0xB1, 0x02,         /*      Feature (Variable),             */
	0x85, 0x89,         /*      Report ID (137),                */
	0x09, 0x29,         /*      Usage (29h),                    */
	0x95, 0x02,         /*      Report Count (2),               */
	0xB1, 0x02,         /*      Feature (Variable),             */
	0x85, 0x90,         /*      Report ID (144),                */
	0x09, 0x30,         /*      Usage (30h),                    */
	0x95, 0x05,         /*      Report Count (5),               */
	0xB1, 0x02,         /*      Feature (Variable),             */
	0x85, 0x91,         /*      Report ID (145),                */
	0x09, 0x31,         /*      Usage (31h),                    */
	0x95, 0x03,         /*      Report Count (3),               */
	0xB1, 0x02,         /*      Feature (Variable),             */
	0x85, 0x92,         /*      Report ID (146),                */
	0x09, 0x32,         /*      Usage (32h),                    */
	0x95, 0x03,         /*      Report Count (3),               */
	0xB1, 0x02,         /*      Feature (Variable),             */
	0x85, 0x93,         /*      Report ID (147),                */
	0x09, 0x33,         /*      Usage (33h),                    */
	0x95, 0x0C,         /*      Report Count (12),              */
	0xB1, 0x02,         /*      Feature (Variable),             */
	0x85, 0xA0,         /*      Report ID (160),                */
	0x09, 0x40,         /*      Usage (40h),                    */
	0x95, 0x06,         /*      Report Count (6),               */
	0xB1, 0x02,         /*      Feature (Variable),             */
	0x85, 0xA1,         /*      Report ID (161),                */
	0x09, 0x41,         /*      Usage (41h),                    */
	0x95, 0x01,         /*      Report Count (1),               */
	0xB1, 0x02,         /*      Feature (Variable),             */
	0x85, 0xA2,         /*      Report ID (162),                */
	0x09, 0x42,         /*      Usage (42h),                    */
	0x95, 0x01,         /*      Report Count (1),               */
	0xB1, 0x02,         /*      Feature (Variable),             */
	0x85, 0xA3,         /*      Report ID (163),                */
	0x09, 0x43,         /*      Usage (43h),                    */
	0x95, 0x30,         /*      Report Count (48),              */
	0xB1, 0x02,         /*      Feature (Variable),             */
	0x85, 0xA4,         /*      Report ID (164),                */
	0x09, 0x44,         /*      Usage (44h),                    */
	0x95, 0x0D,         /*      Report Count (13),              */
	0xB1, 0x02,         /*      Feature (Variable),             */
	0x85, 0xA5,         /*      Report ID (165),                */
	0x09, 0x45,         /*      Usage (45h),                    */
	0x95, 0x15,         /*      Report Count (21),              */
	0xB1, 0x02,         /*      Feature (Variable),             */
	0x85, 0xA6,         /*      Report ID (166),                */
	0x09, 0x46,         /*      Usage (46h),                    */
	0x95, 0x15,         /*      Report Count (21),              */
	0xB1, 0x02,         /*      Feature (Variable),             */
	0x85, 0xF0,         /*      Report ID (240),                */
	0x09, 0x47,         /*      Usage (47h),                    */
	0x95, 0x3F,         /*      Report Count (63),              */
	0xB1, 0x02,         /*      Feature (Variable),             */
	0x85, 0xF1,         /*      Report ID (241),                */
	0x09, 0x48,         /*      Usage (48h),                    */
	0x95, 0x3F,         /*      Report Count (63),              */
	0xB1, 0x02,         /*      Feature (Variable),             */
	0x85, 0xF2,         /*      Report ID (242),                */
	0x09, 0x49,         /*      Usage (49h),                    */
	0x95, 0x0F,         /*      Report Count (15),              */
	0xB1, 0x02,         /*      Feature (Variable),             */
	0x85, 0xA7,         /*      Report ID (167),                */
	0x09, 0x4A,         /*      Usage (4Ah),                    */
	0x95, 0x01,         /*      Report Count (1),               */
	0xB1, 0x02,         /*      Feature (Variable),             */
	0x85, 0xA8,         /*      Report ID (168),                */
	0x09, 0x4B,         /*      Usage (4Bh),                    */
	0x95, 0x01,         /*      Report Count (1),               */
	0xB1, 0x02,         /*      Feature (Variable),             */
	0x85, 0xA9,         /*      Report ID (169),                */
	0x09, 0x4C,         /*      Usage (4Ch),                    */
	0x95, 0x08,         /*      Report Count (8),               */
	0xB1, 0x02,         /*      Feature (Variable),             */
	0x85, 0xAA,         /*      Report ID (170),                */
	0x09, 0x4E,         /*      Usage (4Eh),                    */
	0x95, 0x01,         /*      Report Count (1),               */
	0xB1, 0x02,         /*      Feature (Variable),             */
	0x85, 0xAB,         /*      Report ID (171),                */
	0x09, 0x4F,         /*      Usage (4Fh),                    */
	0x95, 0x39,         /*      Report Count (57),              */
	0xB1, 0x02,         /*      Feature (Variable),             */
	0x85, 0xAC,         /*      Report ID (172),                */
	0x09, 0x50,         /*      Usage (50h),                    */
	0x95, 0x39,         /*      Report Count (57),              */
	0xB1, 0x02,         /*      Feature (Variable),             */
	0x85, 0xAD,         /*      Report ID (173),                */
	0x09, 0x51,         /*      Usage (51h),                    */
	0x95, 0x0B,         /*      Report Count (11),              */
	0xB1, 0x02,         /*      Feature (Variable),             */
	0x85, 0xAE,         /*      Report ID (174),                */
	0x09, 0x52,         /*      Usage (52h),                    */
	0x95, 0x01,         /*      Report Count (1),               */
	0xB1, 0x02,         /*      Feature (Variable),             */
	0x85, 0xAF,         /*      Report ID (175),                */
	0x09, 0x53,         /*      Usage (53h),                    */
	0x95, 0x02,         /*      Report Count (2),               */
	0xB1, 0x02,         /*      Feature (Variable),             */
	0x85, 0xB0,         /*      Report ID (176),                */
	0x09, 0x54,         /*      Usage (54h),                    */
	0x95, 0x3F,         /*      Report Count (63),              */
	0xB1, 0x02,         /*      Feature (Variable),             */
	0xC0                /*  End Collection                      */
603 604
};

605 606
/*
 * The default behavior of the Dualshock 4 is to send reports using report
607 608 609
 * type 1 when running over Bluetooth. However, when feature report 2 is
 * requested during the controller initialization it starts sending input
 * reports in report 17.  Since report 17 is undefined in the default HID
610
 * descriptor the button and axis definitions must be moved to report 17 or
611
 * the HID layer won't process the received input.
612 613 614 615 616 617 618 619 620 621 622 623 624 625 626 627 628 629 630 631 632 633 634 635 636 637 638 639 640 641 642 643 644 645 646 647 648 649 650 651 652 653 654 655 656 657 658 659 660 661 662 663 664 665 666 667 668 669 670 671 672 673 674 675 676 677 678 679 680 681 682 683 684 685 686 687 688 689 690 691 692 693 694 695 696 697 698 699 700 701 702 703 704 705 706 707 708 709 710 711 712 713 714 715 716 717 718 719 720
 */
static u8 dualshock4_bt_rdesc[] = {
	0x05, 0x01,         /*  Usage Page (Desktop),               */
	0x09, 0x05,         /*  Usage (Gamepad),                    */
	0xA1, 0x01,         /*  Collection (Application),           */
	0x85, 0x01,         /*      Report ID (1),                  */
	0x75, 0x08,         /*      Report Size (8),                */
	0x95, 0x0A,         /*      Report Count (9),               */
	0x81, 0x02,         /*      Input (Variable),               */
	0x06, 0x04, 0xFF,   /*      Usage Page (FF04h),             */
	0x85, 0x02,         /*      Report ID (2),                  */
	0x09, 0x24,         /*      Usage (24h),                    */
	0x95, 0x24,         /*      Report Count (36),              */
	0xB1, 0x02,         /*      Feature (Variable),             */
	0x85, 0xA3,         /*      Report ID (163),                */
	0x09, 0x25,         /*      Usage (25h),                    */
	0x95, 0x30,         /*      Report Count (48),              */
	0xB1, 0x02,         /*      Feature (Variable),             */
	0x85, 0x05,         /*      Report ID (5),                  */
	0x09, 0x26,         /*      Usage (26h),                    */
	0x95, 0x28,         /*      Report Count (40),              */
	0xB1, 0x02,         /*      Feature (Variable),             */
	0x85, 0x06,         /*      Report ID (6),                  */
	0x09, 0x27,         /*      Usage (27h),                    */
	0x95, 0x34,         /*      Report Count (52),              */
	0xB1, 0x02,         /*      Feature (Variable),             */
	0x85, 0x07,         /*      Report ID (7),                  */
	0x09, 0x28,         /*      Usage (28h),                    */
	0x95, 0x30,         /*      Report Count (48),              */
	0xB1, 0x02,         /*      Feature (Variable),             */
	0x85, 0x08,         /*      Report ID (8),                  */
	0x09, 0x29,         /*      Usage (29h),                    */
	0x95, 0x2F,         /*      Report Count (47),              */
	0xB1, 0x02,         /*      Feature (Variable),             */
	0x06, 0x03, 0xFF,   /*      Usage Page (FF03h),             */
	0x85, 0x03,         /*      Report ID (3),                  */
	0x09, 0x21,         /*      Usage (21h),                    */
	0x95, 0x26,         /*      Report Count (38),              */
	0xB1, 0x02,         /*      Feature (Variable),             */
	0x85, 0x04,         /*      Report ID (4),                  */
	0x09, 0x22,         /*      Usage (22h),                    */
	0x95, 0x2E,         /*      Report Count (46),              */
	0xB1, 0x02,         /*      Feature (Variable),             */
	0x85, 0xF0,         /*      Report ID (240),                */
	0x09, 0x47,         /*      Usage (47h),                    */
	0x95, 0x3F,         /*      Report Count (63),              */
	0xB1, 0x02,         /*      Feature (Variable),             */
	0x85, 0xF1,         /*      Report ID (241),                */
	0x09, 0x48,         /*      Usage (48h),                    */
	0x95, 0x3F,         /*      Report Count (63),              */
	0xB1, 0x02,         /*      Feature (Variable),             */
	0x85, 0xF2,         /*      Report ID (242),                */
	0x09, 0x49,         /*      Usage (49h),                    */
	0x95, 0x0F,         /*      Report Count (15),              */
	0xB1, 0x02,         /*      Feature (Variable),             */
	0x85, 0x11,         /*      Report ID (17),                 */
	0x06, 0x00, 0xFF,   /*      Usage Page (FF00h),             */
	0x09, 0x20,         /*      Usage (20h),                    */
	0x95, 0x02,         /*      Report Count (2),               */
	0x81, 0x02,         /*      Input (Variable),               */
	0x05, 0x01,         /*      Usage Page (Desktop),           */
	0x09, 0x30,         /*      Usage (X),                      */
	0x09, 0x31,         /*      Usage (Y),                      */
	0x09, 0x32,         /*      Usage (Z),                      */
	0x09, 0x35,         /*      Usage (Rz),                     */
	0x15, 0x00,         /*      Logical Minimum (0),            */
	0x26, 0xFF, 0x00,   /*      Logical Maximum (255),          */
	0x75, 0x08,         /*      Report Size (8),                */
	0x95, 0x04,         /*      Report Count (4),               */
	0x81, 0x02,         /*      Input (Variable),               */
	0x09, 0x39,         /*      Usage (Hat Switch),             */
	0x15, 0x00,         /*      Logical Minimum (0),            */
	0x25, 0x07,         /*      Logical Maximum (7),            */
	0x75, 0x04,         /*      Report Size (4),                */
	0x95, 0x01,         /*      Report Count (1),               */
	0x81, 0x42,         /*      Input (Variable, Null State),   */
	0x05, 0x09,         /*      Usage Page (Button),            */
	0x19, 0x01,         /*      Usage Minimum (01h),            */
	0x29, 0x0E,         /*      Usage Maximum (0Eh),            */
	0x15, 0x00,         /*      Logical Minimum (0),            */
	0x25, 0x01,         /*      Logical Maximum (1),            */
	0x75, 0x01,         /*      Report Size (1),                */
	0x95, 0x0E,         /*      Report Count (14),              */
	0x81, 0x02,         /*      Input (Variable),               */
	0x75, 0x06,         /*      Report Size (6),                */
	0x95, 0x01,         /*      Report Count (1),               */
	0x81, 0x01,         /*      Input (Constant),               */
	0x05, 0x01,         /*      Usage Page (Desktop),           */
	0x09, 0x33,         /*      Usage (Rx),                     */
	0x09, 0x34,         /*      Usage (Ry),                     */
	0x15, 0x00,         /*      Logical Minimum (0),            */
	0x26, 0xFF, 0x00,   /*      Logical Maximum (255),          */
	0x75, 0x08,         /*      Report Size (8),                */
	0x95, 0x02,         /*      Report Count (2),               */
	0x81, 0x02,         /*      Input (Variable),               */
	0x06, 0x00, 0xFF,   /*      Usage Page (FF00h),             */
	0x09, 0x20,         /*      Usage (20h),                    */
	0x95, 0x03,         /*      Report Count (3),               */
	0x81, 0x02,         /*      Input (Variable),               */
	0x05, 0x01,         /*      Usage Page (Desktop),           */
	0x19, 0x40,         /*      Usage Minimum (40h),            */
	0x29, 0x42,         /*      Usage Maximum (42h),            */
	0x16, 0x00, 0x80,   /*      Logical Minimum (-32768),       */
	0x26, 0x00, 0x7F,   /*      Logical Maximum (32767),        */
	0x75, 0x10,         /*      Report Size (16),               */
	0x95, 0x03,         /*      Report Count (3),               */
	0x81, 0x02,         /*      Input (Variable),               */
	0x19, 0x43,         /*      Usage Minimum (43h),            */
	0x29, 0x45,         /*      Usage Maximum (45h),            */
721 722
	0x16, 0x00, 0xE0,   /*      Logical Minimum (-8192),        */
	0x26, 0xFF, 0x1F,   /*      Logical Maximum (8191),         */
723 724 725 726 727 728 729 730 731 732 733 734 735 736 737 738 739 740 741 742 743 744 745 746 747 748 749 750 751 752 753 754 755 756 757 758 759 760 761 762 763 764 765 766 767 768 769 770 771 772 773 774 775 776 777 778 779 780 781 782 783 784 785 786 787 788 789 790 791 792 793 794 795 796 797 798 799 800 801 802 803 804 805 806 807 808 809 810 811 812 813 814 815
	0x95, 0x03,         /*      Report Count (3),               */
	0x81, 0x02,         /*      Input (Variable),               */
	0x06, 0x00, 0xFF,   /*      Usage Page (FF00h),             */
	0x09, 0x20,         /*      Usage (20h),                    */
	0x15, 0x00,         /*      Logical Minimum (0),            */
	0x26, 0xFF, 0x00,   /*      Logical Maximum (255),          */
	0x75, 0x08,         /*      Report Size (8),                */
	0x95, 0x31,         /*      Report Count (51),              */
	0x81, 0x02,         /*      Input (Variable),               */
	0x09, 0x21,         /*      Usage (21h),                    */
	0x75, 0x08,         /*      Report Size (8),                */
	0x95, 0x4D,         /*      Report Count (77),              */
	0x91, 0x02,         /*      Output (Variable),              */
	0x85, 0x12,         /*      Report ID (18),                 */
	0x09, 0x22,         /*      Usage (22h),                    */
	0x95, 0x8D,         /*      Report Count (141),             */
	0x81, 0x02,         /*      Input (Variable),               */
	0x09, 0x23,         /*      Usage (23h),                    */
	0x91, 0x02,         /*      Output (Variable),              */
	0x85, 0x13,         /*      Report ID (19),                 */
	0x09, 0x24,         /*      Usage (24h),                    */
	0x95, 0xCD,         /*      Report Count (205),             */
	0x81, 0x02,         /*      Input (Variable),               */
	0x09, 0x25,         /*      Usage (25h),                    */
	0x91, 0x02,         /*      Output (Variable),              */
	0x85, 0x14,         /*      Report ID (20),                 */
	0x09, 0x26,         /*      Usage (26h),                    */
	0x96, 0x0D, 0x01,   /*      Report Count (269),             */
	0x81, 0x02,         /*      Input (Variable),               */
	0x09, 0x27,         /*      Usage (27h),                    */
	0x91, 0x02,         /*      Output (Variable),              */
	0x85, 0x15,         /*      Report ID (21),                 */
	0x09, 0x28,         /*      Usage (28h),                    */
	0x96, 0x4D, 0x01,   /*      Report Count (333),             */
	0x81, 0x02,         /*      Input (Variable),               */
	0x09, 0x29,         /*      Usage (29h),                    */
	0x91, 0x02,         /*      Output (Variable),              */
	0x85, 0x16,         /*      Report ID (22),                 */
	0x09, 0x2A,         /*      Usage (2Ah),                    */
	0x96, 0x8D, 0x01,   /*      Report Count (397),             */
	0x81, 0x02,         /*      Input (Variable),               */
	0x09, 0x2B,         /*      Usage (2Bh),                    */
	0x91, 0x02,         /*      Output (Variable),              */
	0x85, 0x17,         /*      Report ID (23),                 */
	0x09, 0x2C,         /*      Usage (2Ch),                    */
	0x96, 0xCD, 0x01,   /*      Report Count (461),             */
	0x81, 0x02,         /*      Input (Variable),               */
	0x09, 0x2D,         /*      Usage (2Dh),                    */
	0x91, 0x02,         /*      Output (Variable),              */
	0x85, 0x18,         /*      Report ID (24),                 */
	0x09, 0x2E,         /*      Usage (2Eh),                    */
	0x96, 0x0D, 0x02,   /*      Report Count (525),             */
	0x81, 0x02,         /*      Input (Variable),               */
	0x09, 0x2F,         /*      Usage (2Fh),                    */
	0x91, 0x02,         /*      Output (Variable),              */
	0x85, 0x19,         /*      Report ID (25),                 */
	0x09, 0x30,         /*      Usage (30h),                    */
	0x96, 0x22, 0x02,   /*      Report Count (546),             */
	0x81, 0x02,         /*      Input (Variable),               */
	0x09, 0x31,         /*      Usage (31h),                    */
	0x91, 0x02,         /*      Output (Variable),              */
	0x06, 0x80, 0xFF,   /*      Usage Page (FF80h),             */
	0x85, 0x82,         /*      Report ID (130),                */
	0x09, 0x22,         /*      Usage (22h),                    */
	0x95, 0x3F,         /*      Report Count (63),              */
	0xB1, 0x02,         /*      Feature (Variable),             */
	0x85, 0x83,         /*      Report ID (131),                */
	0x09, 0x23,         /*      Usage (23h),                    */
	0xB1, 0x02,         /*      Feature (Variable),             */
	0x85, 0x84,         /*      Report ID (132),                */
	0x09, 0x24,         /*      Usage (24h),                    */
	0xB1, 0x02,         /*      Feature (Variable),             */
	0x85, 0x90,         /*      Report ID (144),                */
	0x09, 0x30,         /*      Usage (30h),                    */
	0xB1, 0x02,         /*      Feature (Variable),             */
	0x85, 0x91,         /*      Report ID (145),                */
	0x09, 0x31,         /*      Usage (31h),                    */
	0xB1, 0x02,         /*      Feature (Variable),             */
	0x85, 0x92,         /*      Report ID (146),                */
	0x09, 0x32,         /*      Usage (32h),                    */
	0xB1, 0x02,         /*      Feature (Variable),             */
	0x85, 0x93,         /*      Report ID (147),                */
	0x09, 0x33,         /*      Usage (33h),                    */
	0xB1, 0x02,         /*      Feature (Variable),             */
	0x85, 0xA0,         /*      Report ID (160),                */
	0x09, 0x40,         /*      Usage (40h),                    */
	0xB1, 0x02,         /*      Feature (Variable),             */
	0x85, 0xA4,         /*      Report ID (164),                */
	0x09, 0x44,         /*      Usage (44h),                    */
	0xB1, 0x02,         /*      Feature (Variable),             */
	0xC0                /*  End Collection                      */
};

816
static u8 ps3remote_rdesc[] = {
817 818 819 820 821 822 823
	0x05, 0x01,          /* GUsagePage Generic Desktop */
	0x09, 0x05,          /* LUsage 0x05 [Game Pad] */
	0xA1, 0x01,          /* MCollection Application (mouse, keyboard) */

	 /* Use collection 1 for joypad buttons */
	 0xA1, 0x02,         /* MCollection Logical (interrelated data) */

824 825 826 827
	  /*
	   * Ignore the 1st byte, maybe it is used for a controller
	   * number but it's not needed for correct operation
	   */
828 829 830 831
	  0x75, 0x08,        /* GReportSize 0x08 [8] */
	  0x95, 0x01,        /* GReportCount 0x01 [1] */
	  0x81, 0x01,        /* MInput 0x01 (Const[0] Arr[1] Abs[2]) */

832 833 834 835
	  /*
	   * Bytes from 2nd to 4th are a bitmap for joypad buttons, for these
	   * buttons multiple keypresses are allowed
	   */
836 837 838 839 840 841 842 843 844 845 846 847 848 849 850 851 852 853 854 855 856 857 858 859
	  0x05, 0x09,        /* GUsagePage Button */
	  0x19, 0x01,        /* LUsageMinimum 0x01 [Button 1 (primary/trigger)] */
	  0x29, 0x18,        /* LUsageMaximum 0x18 [Button 24] */
	  0x14,              /* GLogicalMinimum [0] */
	  0x25, 0x01,        /* GLogicalMaximum 0x01 [1] */
	  0x75, 0x01,        /* GReportSize 0x01 [1] */
	  0x95, 0x18,        /* GReportCount 0x18 [24] */
	  0x81, 0x02,        /* MInput 0x02 (Data[0] Var[1] Abs[2]) */

	  0xC0,              /* MEndCollection */

	 /* Use collection 2 for remote control buttons */
	 0xA1, 0x02,         /* MCollection Logical (interrelated data) */

	  /* 5th byte is used for remote control buttons */
	  0x05, 0x09,        /* GUsagePage Button */
	  0x18,              /* LUsageMinimum [No button pressed] */
	  0x29, 0xFE,        /* LUsageMaximum 0xFE [Button 254] */
	  0x14,              /* GLogicalMinimum [0] */
	  0x26, 0xFE, 0x00,  /* GLogicalMaximum 0x00FE [254] */
	  0x75, 0x08,        /* GReportSize 0x08 [8] */
	  0x95, 0x01,        /* GReportCount 0x01 [1] */
	  0x80,              /* MInput  */

860 861 862 863
	  /*
	   * Ignore bytes from 6th to 11th, 6th to 10th are always constant at
	   * 0xff and 11th is for press indication
	   */
864 865 866 867 868 869 870 871 872 873 874 875 876 877 878 879 880 881 882 883 884 885 886 887 888 889 890 891 892 893 894 895 896 897 898 899 900 901 902 903 904 905 906 907 908 909 910 911 912 913 914 915 916 917 918 919 920 921 922 923 924 925 926 927 928 929 930 931 932 933 934 935 936 937
	  0x75, 0x08,        /* GReportSize 0x08 [8] */
	  0x95, 0x06,        /* GReportCount 0x06 [6] */
	  0x81, 0x01,        /* MInput 0x01 (Const[0] Arr[1] Abs[2]) */

	  /* 12th byte is for battery strength */
	  0x05, 0x06,        /* GUsagePage Generic Device Controls */
	  0x09, 0x20,        /* LUsage 0x20 [Battery Strength] */
	  0x14,              /* GLogicalMinimum [0] */
	  0x25, 0x05,        /* GLogicalMaximum 0x05 [5] */
	  0x75, 0x08,        /* GReportSize 0x08 [8] */
	  0x95, 0x01,        /* GReportCount 0x01 [1] */
	  0x81, 0x02,        /* MInput 0x02 (Data[0] Var[1] Abs[2]) */

	  0xC0,              /* MEndCollection */

	 0xC0                /* MEndCollection [Game Pad] */
};

static const unsigned int ps3remote_keymap_joypad_buttons[] = {
	[0x01] = KEY_SELECT,
	[0x02] = BTN_THUMBL,		/* L3 */
	[0x03] = BTN_THUMBR,		/* R3 */
	[0x04] = BTN_START,
	[0x05] = KEY_UP,
	[0x06] = KEY_RIGHT,
	[0x07] = KEY_DOWN,
	[0x08] = KEY_LEFT,
	[0x09] = BTN_TL2,		/* L2 */
	[0x0a] = BTN_TR2,		/* R2 */
	[0x0b] = BTN_TL,		/* L1 */
	[0x0c] = BTN_TR,		/* R1 */
	[0x0d] = KEY_OPTION,		/* options/triangle */
	[0x0e] = KEY_BACK,		/* back/circle */
	[0x0f] = BTN_0,			/* cross */
	[0x10] = KEY_SCREEN,		/* view/square */
	[0x11] = KEY_HOMEPAGE,		/* PS button */
	[0x14] = KEY_ENTER,
};
static const unsigned int ps3remote_keymap_remote_buttons[] = {
	[0x00] = KEY_1,
	[0x01] = KEY_2,
	[0x02] = KEY_3,
	[0x03] = KEY_4,
	[0x04] = KEY_5,
	[0x05] = KEY_6,
	[0x06] = KEY_7,
	[0x07] = KEY_8,
	[0x08] = KEY_9,
	[0x09] = KEY_0,
	[0x0e] = KEY_ESC,		/* return */
	[0x0f] = KEY_CLEAR,
	[0x16] = KEY_EJECTCD,
	[0x1a] = KEY_MENU,		/* top menu */
	[0x28] = KEY_TIME,
	[0x30] = KEY_PREVIOUS,
	[0x31] = KEY_NEXT,
	[0x32] = KEY_PLAY,
	[0x33] = KEY_REWIND,		/* scan back */
	[0x34] = KEY_FORWARD,		/* scan forward */
	[0x38] = KEY_STOP,
	[0x39] = KEY_PAUSE,
	[0x40] = KEY_CONTEXT_MENU,	/* pop up/menu */
	[0x60] = KEY_FRAMEBACK,		/* slow/step back */
	[0x61] = KEY_FRAMEFORWARD,	/* slow/step forward */
	[0x63] = KEY_SUBTITLE,
	[0x64] = KEY_AUDIO,
	[0x65] = KEY_ANGLE,
	[0x70] = KEY_INFO,		/* display */
	[0x80] = KEY_BLUE,
	[0x81] = KEY_RED,
	[0x82] = KEY_GREEN,
	[0x83] = KEY_YELLOW,
};

938
static const unsigned int buzz_keymap[] = {
939 940
	/*
	 * The controller has 4 remote buzzers, each with one LED and 5
941
	 * buttons.
942
	 *
943 944 945 946 947 948 949 950 951 952 953 954 955
	 * We use the mapping chosen by the controller, which is:
	 *
	 * Key          Offset
	 * -------------------
	 * Buzz              1
	 * Blue              5
	 * Orange            4
	 * Green             3
	 * Yellow            2
	 *
	 * So, for example, the orange button on the third buzzer is mapped to
	 * BTN_TRIGGER_HAPPY14
	 */
956 957 958 959 960 961 962 963 964
	 [1] = BTN_TRIGGER_HAPPY1,
	 [2] = BTN_TRIGGER_HAPPY2,
	 [3] = BTN_TRIGGER_HAPPY3,
	 [4] = BTN_TRIGGER_HAPPY4,
	 [5] = BTN_TRIGGER_HAPPY5,
	 [6] = BTN_TRIGGER_HAPPY6,
	 [7] = BTN_TRIGGER_HAPPY7,
	 [8] = BTN_TRIGGER_HAPPY8,
	 [9] = BTN_TRIGGER_HAPPY9,
965 966 967 968 969 970 971 972 973 974 975 976 977
	[10] = BTN_TRIGGER_HAPPY10,
	[11] = BTN_TRIGGER_HAPPY11,
	[12] = BTN_TRIGGER_HAPPY12,
	[13] = BTN_TRIGGER_HAPPY13,
	[14] = BTN_TRIGGER_HAPPY14,
	[15] = BTN_TRIGGER_HAPPY15,
	[16] = BTN_TRIGGER_HAPPY16,
	[17] = BTN_TRIGGER_HAPPY17,
	[18] = BTN_TRIGGER_HAPPY18,
	[19] = BTN_TRIGGER_HAPPY19,
	[20] = BTN_TRIGGER_HAPPY20,
};

978 979 980 981 982 983 984
static enum power_supply_property sony_battery_props[] = {
	POWER_SUPPLY_PROP_PRESENT,
	POWER_SUPPLY_PROP_CAPACITY,
	POWER_SUPPLY_PROP_SCOPE,
	POWER_SUPPLY_PROP_STATUS,
};

985
struct sixaxis_led {
986 987 988 989 990
	u8 time_enabled; /* the total time the led is active (0xff means forever) */
	u8 duty_length;  /* how long a cycle is in deciseconds (0 means "really fast") */
	u8 enabled;
	u8 duty_off; /* % of duty_length the led is off (0xff means 100%) */
	u8 duty_on;  /* % of duty_length the led is on (0xff mean 100%) */
991 992 993
} __packed;

struct sixaxis_rumble {
994 995 996 997 998
	u8 padding;
	u8 right_duration; /* Right motor duration (0xff means forever) */
	u8 right_motor_on; /* Right (small) motor on/off, only supports values of 0 or 1 (off/on) */
	u8 left_duration;    /* Left motor duration (0xff means forever) */
	u8 left_motor_force; /* left (large) motor, supports force values from 0 to 255 */
999 1000 1001
} __packed;

struct sixaxis_output_report {
1002
	u8 report_id;
1003
	struct sixaxis_rumble rumble;
1004 1005
	u8 padding[4];
	u8 leds_bitmap; /* bitmap of enabled LEDs: LED_1 = 0x02, LED_2 = 0x04, ... */
1006 1007 1008 1009 1010 1011
	struct sixaxis_led led[4];    /* LEDx at (4 - x) */
	struct sixaxis_led _reserved; /* LED5, not actually soldered */
} __packed;

union sixaxis_output_report_01 {
	struct sixaxis_output_report data;
1012
	u8 buf[36];
1013 1014
};

1015 1016 1017 1018 1019 1020 1021
struct motion_output_report_02 {
	u8 type, zero;
	u8 r, g, b;
	u8 zero2;
	u8 rumble;
};

1022 1023 1024 1025
#define DS4_FEATURE_REPORT_0x02_SIZE 37
#define DS4_FEATURE_REPORT_0x81_SIZE 7
#define DS4_OUTPUT_REPORT_0x05_SIZE 32
#define DS4_OUTPUT_REPORT_0x11_SIZE 78
1026
#define SIXAXIS_REPORT_0xF2_SIZE 17
1027
#define SIXAXIS_REPORT_0xF5_SIZE 8
1028
#define MOTION_REPORT_0x02_SIZE 49
1029

1030
static DEFINE_SPINLOCK(sony_dev_list_lock);
1031
static LIST_HEAD(sony_device_list);
1032
static DEFINE_IDA(sony_device_id_allocator);
1033

1034
struct sony_sc {
1035
	spinlock_t lock;
1036
	struct list_head list_node;
1037
	struct hid_device *hdev;
1038
	struct led_classdev *leds[MAX_LEDS];
1039
	unsigned long quirks;
1040
	struct work_struct state_worker;
1041
	void (*send_output_report)(struct sony_sc *);
1042 1043
	struct power_supply *battery;
	struct power_supply_desc battery_desc;
1044
	int device_id;
1045
	u8 *output_report_dmabuf;
1046

1047
#ifdef CONFIG_SONY_FF
1048 1049
	u8 left;
	u8 right;
1050 1051
#endif

1052 1053
	u8 mac_address[6];
	u8 worker_initialized;
1054
	u8 defer_initialization;
1055 1056 1057 1058 1059 1060 1061 1062
	u8 cable_state;
	u8 battery_charging;
	u8 battery_capacity;
	u8 led_state[MAX_LEDS];
	u8 resume_led_state[MAX_LEDS];
	u8 led_delay_on[MAX_LEDS];
	u8 led_delay_off[MAX_LEDS];
	u8 led_count;
1063 1064
};

1065 1066 1067 1068 1069 1070
static inline void sony_schedule_work(struct sony_sc *sc)
{
	if (!sc->defer_initialization)
		schedule_work(&sc->state_worker);
}

1071
static u8 *sixaxis_fixup(struct hid_device *hdev, u8 *rdesc,
1072 1073 1074 1075 1076 1077
			     unsigned int *rsize)
{
	*rsize = sizeof(sixaxis_rdesc);
	return sixaxis_rdesc;
}

1078 1079 1080 1081 1082 1083 1084
static u8 *motion_fixup(struct hid_device *hdev, u8 *rdesc,
			     unsigned int *rsize)
{
	*rsize = sizeof(motion_rdesc);
	return motion_rdesc;
}

1085 1086 1087 1088 1089 1090 1091
static u8 *navigation_fixup(struct hid_device *hdev, u8 *rdesc,
			     unsigned int *rsize)
{
	*rsize = sizeof(navigation_rdesc);
	return navigation_rdesc;
}

1092
static u8 *ps3remote_fixup(struct hid_device *hdev, u8 *rdesc,
1093 1094 1095 1096 1097 1098 1099 1100 1101 1102 1103 1104 1105 1106 1107 1108 1109 1110 1111 1112 1113 1114 1115 1116 1117 1118 1119 1120 1121 1122 1123 1124 1125 1126 1127 1128 1129 1130 1131 1132
			     unsigned int *rsize)
{
	*rsize = sizeof(ps3remote_rdesc);
	return ps3remote_rdesc;
}

static int ps3remote_mapping(struct hid_device *hdev, struct hid_input *hi,
			     struct hid_field *field, struct hid_usage *usage,
			     unsigned long **bit, int *max)
{
	unsigned int key = usage->hid & HID_USAGE;

	if ((usage->hid & HID_USAGE_PAGE) != HID_UP_BUTTON)
		return -1;

	switch (usage->collection_index) {
	case 1:
		if (key >= ARRAY_SIZE(ps3remote_keymap_joypad_buttons))
			return -1;

		key = ps3remote_keymap_joypad_buttons[key];
		if (!key)
			return -1;
		break;
	case 2:
		if (key >= ARRAY_SIZE(ps3remote_keymap_remote_buttons))
			return -1;

		key = ps3remote_keymap_remote_buttons[key];
		if (!key)
			return -1;
		break;
	default:
		return -1;
	}

	hid_map_usage_clear(hi, usage, bit, max, EV_KEY, key);
	return 1;
}

1133
static u8 *sony_report_fixup(struct hid_device *hdev, u8 *rdesc,
1134
		unsigned int *rsize)
1135 1136 1137
{
	struct sony_sc *sc = hid_get_drvdata(hdev);

1138
	if (sc->quirks & (SINO_LITE_CONTROLLER | FUTUREMAX_DANCE_MAT))
1139 1140
		return rdesc;

1141 1142 1143 1144 1145 1146 1147 1148 1149 1150 1151
	/*
	 * Some Sony RF receivers wrongly declare the mouse pointer as a
	 * a constant non-data variable.
	 */
	if ((sc->quirks & VAIO_RDESC_CONSTANT) && *rsize >= 56 &&
	    /* usage page: generic desktop controls */
	    /* rdesc[0] == 0x05 && rdesc[1] == 0x01 && */
	    /* usage: mouse */
	    rdesc[2] == 0x09 && rdesc[3] == 0x02 &&
	    /* input (usage page for x,y axes): constant, variable, relative */
	    rdesc[54] == 0x81 && rdesc[55] == 0x07) {
1152
		hid_info(hdev, "Fixing up Sony RF Receiver report descriptor\n");
1153
		/* input: data, variable, relative */
1154 1155
		rdesc[55] = 0x06;
	}
1156

1157 1158 1159 1160 1161
	/*
	 * The default Dualshock 4 USB descriptor doesn't assign
	 * the gyroscope values to corresponding axes so we need a
	 * modified one.
	 */
1162
	if (sc->quirks & DUALSHOCK4_CONTROLLER_USB) {
1163 1164 1165
		hid_info(hdev, "Using modified Dualshock 4 report descriptor with gyroscope axes\n");
		rdesc = dualshock4_usb_rdesc;
		*rsize = sizeof(dualshock4_usb_rdesc);
1166
	} else if (sc->quirks & DUALSHOCK4_CONTROLLER_BT) {
1167 1168 1169
		hid_info(hdev, "Using modified Dualshock 4 Bluetooth report descriptor\n");
		rdesc = dualshock4_bt_rdesc;
		*rsize = sizeof(dualshock4_bt_rdesc);
1170 1171
	}

1172 1173
	if (sc->quirks & SIXAXIS_CONTROLLER)
		return sixaxis_fixup(hdev, rdesc, rsize);
1174

1175 1176 1177
	if (sc->quirks & MOTION_CONTROLLER)
		return motion_fixup(hdev, rdesc, rsize);

1178
	if (sc->quirks & NAVIGATION_CONTROLLER)
1179
		return navigation_fixup(hdev, rdesc, rsize);
1180

1181 1182 1183
	if (sc->quirks & PS3REMOTE)
		return ps3remote_fixup(hdev, rdesc, rsize);

1184
	return rdesc;
1185 1186
}

1187
static void sixaxis_parse_report(struct sony_sc *sc, u8 *rd, int size)
1188
{
1189
	static const u8 sixaxis_battery_capacity[] = { 0, 1, 25, 50, 75, 100 };
1190
	unsigned long flags;
1191
	int offset;
1192
	u8 cable_state, battery_capacity, battery_charging;
1193

1194 1195
	/*
	 * The sixaxis is charging if the battery value is 0xee
1196 1197 1198 1199
	 * and it is fully charged if the value is 0xef.
	 * It does not report the actual level while charging so it
	 * is set to 100% while charging is in progress.
	 */
1200 1201 1202
	offset = (sc->quirks & MOTION_CONTROLLER) ? 12 : 30;

	if (rd[offset] >= 0xee) {
1203
		battery_capacity = 100;
1204
		battery_charging = !(rd[offset] & 0x01);
1205
		cable_state = 1;
1206
	} else {
1207
		u8 index = rd[offset] <= 5 ? rd[offset] : 5;
1208
		battery_capacity = sixaxis_battery_capacity[index];
1209
		battery_charging = 0;
1210
		cable_state = 0;
1211 1212 1213 1214 1215 1216 1217 1218 1219
	}

	spin_lock_irqsave(&sc->lock, flags);
	sc->cable_state = cable_state;
	sc->battery_capacity = battery_capacity;
	sc->battery_charging = battery_charging;
	spin_unlock_irqrestore(&sc->lock, flags);
}

1220
static void dualshock4_parse_report(struct sony_sc *sc, u8 *rd, int size)
1221
{
1222 1223 1224
	struct hid_input *hidinput = list_entry(sc->hdev->inputs.next,
						struct hid_input, list);
	struct input_dev *input_dev = hidinput->input;
1225
	unsigned long flags;
1226
	int n, offset;
1227
	u8 cable_state, battery_capacity, battery_charging;
1228

1229 1230
	/*
	 * Battery and touchpad data starts at byte 30 in the USB report and
1231 1232 1233 1234
	 * 32 in Bluetooth report.
	 */
	offset = (sc->quirks & DUALSHOCK4_CONTROLLER_USB) ? 30 : 32;

1235 1236
	/*
	 * The lower 4 bits of byte 30 contain the battery level
1237 1238
	 * and the 5th bit contains the USB cable state.
	 */
1239 1240
	cable_state = (rd[offset] >> 4) & 0x01;
	battery_capacity = rd[offset] & 0x0F;
1241

1242 1243
	/*
	 * When a USB power source is connected the battery level ranges from
1244 1245
	 * 0 to 10, and when running on battery power it ranges from 0 to 9.
	 * A battery level above 10 when plugged in means charge completed.
1246
	 */
1247
	if (!cable_state || battery_capacity > 10)
1248 1249 1250 1251
		battery_charging = 0;
	else
		battery_charging = 1;

1252 1253
	if (!cable_state)
		battery_capacity++;
1254
	if (battery_capacity > 10)
1255 1256
		battery_capacity = 10;

1257 1258 1259 1260 1261 1262 1263
	battery_capacity *= 10;

	spin_lock_irqsave(&sc->lock, flags);
	sc->cable_state = cable_state;
	sc->battery_capacity = battery_capacity;
	sc->battery_charging = battery_charging;
	spin_unlock_irqrestore(&sc->lock, flags);
1264

1265 1266
	offset += 5;

1267 1268
	/*
	 * The Dualshock 4 multi-touch trackpad data starts at offset 35 on USB
1269
	 * and 37 on Bluetooth.
1270 1271 1272 1273 1274 1275 1276
	 * The first 7 bits of the first byte is a counter and bit 8 is a touch
	 * indicator that is 0 when pressed and 1 when not pressed.
	 * The next 3 bytes are two 12 bit touch coordinates, X and Y.
	 * The data for the second touch is in the same format and immediatly
	 * follows the data for the first.
	 */
	for (n = 0; n < 2; n++) {
1277
		u16 x, y;
1278 1279 1280 1281 1282 1283 1284 1285 1286 1287 1288 1289

		x = rd[offset+1] | ((rd[offset+2] & 0xF) << 8);
		y = ((rd[offset+2] & 0xF0) >> 4) | (rd[offset+3] << 4);

		input_mt_slot(input_dev, n);
		input_mt_report_slot_state(input_dev, MT_TOOL_FINGER,
					!(rd[offset] >> 7));
		input_report_abs(input_dev, ABS_MT_POSITION_X, x);
		input_report_abs(input_dev, ABS_MT_POSITION_Y, y);

		offset += 4;
	}
1290 1291
}

1292
static int sony_raw_event(struct hid_device *hdev, struct hid_report *report,
1293
		u8 *rd, int size)
1294 1295 1296
{
	struct sony_sc *sc = hid_get_drvdata(hdev);

1297 1298
	/*
	 * Sixaxis HID report has acclerometers/gyro with MSByte first, this
1299 1300
	 * has to be BYTE_SWAPPED before passing up to joystick interface
	 */
1301
	if ((sc->quirks & SIXAXIS_CONTROLLER) && rd[0] == 0x01 && size == 49) {
1302 1303 1304 1305 1306 1307 1308 1309 1310 1311 1312
		/*
		 * When connected via Bluetooth the Sixaxis occasionally sends
		 * a report with the second byte 0xff and the rest zeroed.
		 *
		 * This report does not reflect the actual state of the
		 * controller must be ignored to avoid generating false input
		 * events.
		 */
		if (rd[1] == 0xff)
			return -EINVAL;

1313 1314 1315 1316
		swap(rd[41], rd[42]);
		swap(rd[43], rd[44]);
		swap(rd[45], rd[46]);
		swap(rd[47], rd[48]);
1317

1318 1319
		sixaxis_parse_report(sc, rd, size);
	} else if ((sc->quirks & MOTION_CONTROLLER_BT) && rd[0] == 0x01 && size == 49) {
1320
		sixaxis_parse_report(sc, rd, size);
1321 1322 1323
	} else if ((sc->quirks & NAVIGATION_CONTROLLER) && rd[0] == 0x01 &&
			size == 49) {
		sixaxis_parse_report(sc, rd, size);
1324 1325 1326
	} else if (((sc->quirks & DUALSHOCK4_CONTROLLER_USB) && rd[0] == 0x01 &&
			size == 64) || ((sc->quirks & DUALSHOCK4_CONTROLLER_BT)
			&& rd[0] == 0x11 && size == 78)) {
1327
		dualshock4_parse_report(sc, rd, size);
1328 1329
	}

1330 1331 1332 1333 1334
	if (sc->defer_initialization) {
		sc->defer_initialization = 0;
		sony_schedule_work(sc);
	}

1335 1336 1337
	return 0;
}

1338 1339 1340 1341 1342 1343 1344 1345 1346 1347 1348 1349 1350 1351 1352 1353 1354 1355 1356 1357 1358 1359 1360 1361 1362 1363 1364 1365 1366
static int sony_mapping(struct hid_device *hdev, struct hid_input *hi,
			struct hid_field *field, struct hid_usage *usage,
			unsigned long **bit, int *max)
{
	struct sony_sc *sc = hid_get_drvdata(hdev);

	if (sc->quirks & BUZZ_CONTROLLER) {
		unsigned int key = usage->hid & HID_USAGE;

		if ((usage->hid & HID_USAGE_PAGE) != HID_UP_BUTTON)
			return -1;

		switch (usage->collection_index) {
		case 1:
			if (key >= ARRAY_SIZE(buzz_keymap))
				return -1;

			key = buzz_keymap[key];
			if (!key)
				return -1;
			break;
		default:
			return -1;
		}

		hid_map_usage_clear(hi, usage, bit, max, EV_KEY, key);
		return 1;
	}

1367 1368 1369
	if (sc->quirks & PS3REMOTE)
		return ps3remote_mapping(hdev, hi, field, usage, bit, max);

1370 1371
	/* Let hid-core decide for the others */
	return 0;
1372 1373
}

1374 1375 1376 1377 1378 1379 1380 1381 1382 1383 1384 1385 1386 1387 1388 1389 1390
static int sony_register_touchpad(struct hid_input *hi, int touch_count,
					int w, int h)
{
	struct input_dev *input_dev = hi->input;
	int ret;

	ret = input_mt_init_slots(input_dev, touch_count, 0);
	if (ret < 0)
		return ret;

	input_set_abs_params(input_dev, ABS_MT_POSITION_X, 0, w, 0, 0);
	input_set_abs_params(input_dev, ABS_MT_POSITION_Y, 0, h, 0, 0);

	return 0;
}


J
Jiri Slaby 已提交
1391 1392 1393 1394 1395
/*
 * Sending HID_REQ_GET_REPORT changes the operation mode of the ps3 controller
 * to "operational".  Without this, the ps3 controller will not report any
 * events.
 */
1396
static int sixaxis_set_operational_usb(struct hid_device *hdev)
J
Jiri Slaby 已提交
1397
{
1398 1399
	const int buf_size =
		max(SIXAXIS_REPORT_0xF2_SIZE, SIXAXIS_REPORT_0xF5_SIZE);
1400
	u8 *buf;
J
Jiri Slaby 已提交
1401 1402
	int ret;

1403
	buf = kmalloc(buf_size, GFP_KERNEL);
J
Jiri Slaby 已提交
1404 1405 1406
	if (!buf)
		return -ENOMEM;

1407 1408
	ret = hid_hw_raw_request(hdev, 0xf2, buf, SIXAXIS_REPORT_0xF2_SIZE,
				 HID_FEATURE_REPORT, HID_REQ_GET_REPORT);
1409 1410 1411 1412
	if (ret < 0) {
		hid_err(hdev, "can't set operational mode: step 1\n");
		goto out;
	}
1413

1414 1415 1416 1417
	/*
	 * Some compatible controllers like the Speedlink Strike FX and
	 * Gasia need another query plus an USB interrupt to get operational.
	 */
1418 1419
	ret = hid_hw_raw_request(hdev, 0xf5, buf, SIXAXIS_REPORT_0xF5_SIZE,
				 HID_FEATURE_REPORT, HID_REQ_GET_REPORT);
1420 1421 1422 1423
	if (ret < 0) {
		hid_err(hdev, "can't set operational mode: step 2\n");
		goto out;
	}
1424

1425
	ret = hid_hw_output_report(hdev, buf, 1);
1426 1427 1428 1429
	if (ret < 0) {
		hid_info(hdev, "can't set operational mode: step 3, ignoring\n");
		ret = 0;
	}
J
Jiri Slaby 已提交
1430

1431
out:
J
Jiri Slaby 已提交
1432 1433 1434 1435 1436
	kfree(buf);

	return ret;
}

1437
static int sixaxis_set_operational_bt(struct hid_device *hdev)
1438
{
1439 1440
	static const u8 report[] = { 0xf4, 0x42, 0x03, 0x00, 0x00 };
	u8 *buf;
1441 1442 1443 1444 1445 1446 1447
	int ret;

	buf = kmemdup(report, sizeof(report), GFP_KERNEL);
	if (!buf)
		return -ENOMEM;

	ret = hid_hw_raw_request(hdev, buf[0], buf, sizeof(report),
1448
				  HID_FEATURE_REPORT, HID_REQ_SET_REPORT);
1449 1450 1451 1452

	kfree(buf);

	return ret;
1453 1454
}

1455 1456
/*
 * Requesting feature report 0x02 in Bluetooth mode changes the state of the
1457 1458 1459 1460
 * controller so that it sends full input reports of type 0x11.
 */
static int dualshock4_set_operational_bt(struct hid_device *hdev)
{
1461
	u8 *buf;
1462
	int ret;
1463

1464
	buf = kmalloc(DS4_FEATURE_REPORT_0x02_SIZE, GFP_KERNEL);
1465 1466 1467
	if (!buf)
		return -ENOMEM;

1468
	ret = hid_hw_raw_request(hdev, 0x02, buf, DS4_FEATURE_REPORT_0x02_SIZE,
1469
				HID_FEATURE_REPORT, HID_REQ_GET_REPORT);
1470 1471 1472 1473

	kfree(buf);

	return ret;
1474 1475
}

1476
static void sixaxis_set_leds_from_id(struct sony_sc *sc)
1477
{
1478
	static const u8 sixaxis_leds[10][4] = {
1479 1480 1481 1482 1483 1484 1485 1486 1487 1488 1489 1490
				{ 0x01, 0x00, 0x00, 0x00 },
				{ 0x00, 0x01, 0x00, 0x00 },
				{ 0x00, 0x00, 0x01, 0x00 },
				{ 0x00, 0x00, 0x00, 0x01 },
				{ 0x01, 0x00, 0x00, 0x01 },
				{ 0x00, 0x01, 0x00, 0x01 },
				{ 0x00, 0x00, 0x01, 0x01 },
				{ 0x01, 0x00, 0x01, 0x01 },
				{ 0x00, 0x01, 0x01, 0x01 },
				{ 0x01, 0x01, 0x01, 0x01 }
	};

1491 1492 1493
	int id = sc->device_id;

	BUILD_BUG_ON(MAX_LEDS < ARRAY_SIZE(sixaxis_leds[0]));
1494 1495 1496 1497 1498

	if (id < 0)
		return;

	id %= 10;
1499
	memcpy(sc->led_state, sixaxis_leds[id], sizeof(sixaxis_leds[id]));
1500 1501
}

1502
static void dualshock4_set_leds_from_id(struct sony_sc *sc)
1503 1504
{
	/* The first 4 color/index entries match what the PS4 assigns */
1505
	static const u8 color_code[7][3] = {
1506 1507 1508 1509 1510 1511 1512 1513 1514
			/* Blue   */	{ 0x00, 0x00, 0x01 },
			/* Red	  */	{ 0x01, 0x00, 0x00 },
			/* Green  */	{ 0x00, 0x01, 0x00 },
			/* Pink   */	{ 0x02, 0x00, 0x01 },
			/* Orange */	{ 0x02, 0x01, 0x00 },
			/* Teal   */	{ 0x00, 0x01, 0x01 },
			/* White  */	{ 0x01, 0x01, 0x01 }
	};

1515 1516 1517
	int id = sc->device_id;

	BUILD_BUG_ON(MAX_LEDS < ARRAY_SIZE(color_code[0]));
1518 1519 1520 1521 1522

	if (id < 0)
		return;

	id %= 7;
1523
	memcpy(sc->led_state, color_code[id], sizeof(color_code[id]));
1524 1525
}

1526
static void buzz_set_leds(struct sony_sc *sc)
1527
{
1528
	struct hid_device *hdev = sc->hdev;
1529 1530 1531 1532
	struct list_head *report_list =
		&hdev->report_enum[HID_OUTPUT_REPORT].report_list;
	struct hid_report *report = list_entry(report_list->next,
		struct hid_report, list);
1533
	s32 *value = report->field[0]->value;
1534

1535 1536
	BUILD_BUG_ON(MAX_LEDS < 4);

1537
	value[0] = 0x00;
1538 1539 1540 1541
	value[1] = sc->led_state[0] ? 0xff : 0x00;
	value[2] = sc->led_state[1] ? 0xff : 0x00;
	value[3] = sc->led_state[2] ? 0xff : 0x00;
	value[4] = sc->led_state[3] ? 0xff : 0x00;
1542 1543 1544 1545 1546
	value[5] = 0x00;
	value[6] = 0x00;
	hid_hw_request(hdev, report, HID_REQ_SET_REPORT);
}

1547
static void sony_set_leds(struct sony_sc *sc)
1548
{
1549
	if (!(sc->quirks & BUZZ_CONTROLLER))
1550
		sony_schedule_work(sc);
1551 1552
	else
		buzz_set_leds(sc);
1553 1554
}

1555
static void sony_led_set_brightness(struct led_classdev *led,
1556 1557 1558
				    enum led_brightness value)
{
	struct device *dev = led->dev->parent;
G
Geliang Tang 已提交
1559
	struct hid_device *hdev = to_hid_device(dev);
1560 1561 1562
	struct sony_sc *drv_data;

	int n;
1563
	int force_update;
1564 1565

	drv_data = hid_get_drvdata(hdev);
1566
	if (!drv_data) {
1567 1568 1569 1570
		hid_err(hdev, "No device data\n");
		return;
	}

1571 1572 1573 1574 1575 1576 1577 1578 1579
	/*
	 * The Sixaxis on USB will override any LED settings sent to it
	 * and keep flashing all of the LEDs until the PS button is pressed.
	 * Updates, even if redundant, must be always be sent to the
	 * controller to avoid having to toggle the state of an LED just to
	 * stop the flashing later on.
	 */
	force_update = !!(drv_data->quirks & SIXAXIS_CONTROLLER_USB);

1580
	for (n = 0; n < drv_data->led_count; n++) {
1581 1582 1583 1584 1585 1586 1587 1588 1589 1590 1591
		if (led == drv_data->leds[n] && (force_update ||
			(value != drv_data->led_state[n] ||
			drv_data->led_delay_on[n] ||
			drv_data->led_delay_off[n]))) {

			drv_data->led_state[n] = value;

			/* Setting the brightness stops the blinking */
			drv_data->led_delay_on[n] = 0;
			drv_data->led_delay_off[n] = 0;

1592
			sony_set_leds(drv_data);
1593 1594 1595 1596 1597
			break;
		}
	}
}

1598
static enum led_brightness sony_led_get_brightness(struct led_classdev *led)
1599 1600
{
	struct device *dev = led->dev->parent;
G
Geliang Tang 已提交
1601
	struct hid_device *hdev = to_hid_device(dev);
1602 1603 1604 1605 1606
	struct sony_sc *drv_data;

	int n;

	drv_data = hid_get_drvdata(hdev);
1607
	if (!drv_data) {
1608 1609 1610 1611
		hid_err(hdev, "No device data\n");
		return LED_OFF;
	}

1612
	for (n = 0; n < drv_data->led_count; n++) {
1613 1614
		if (led == drv_data->leds[n])
			return drv_data->led_state[n];
1615 1616
	}

1617
	return LED_OFF;
1618 1619
}

1620 1621 1622 1623
static int sony_led_blink_set(struct led_classdev *led, unsigned long *delay_on,
				unsigned long *delay_off)
{
	struct device *dev = led->dev->parent;
G
Geliang Tang 已提交
1624
	struct hid_device *hdev = to_hid_device(dev);
1625 1626
	struct sony_sc *drv_data = hid_get_drvdata(hdev);
	int n;
1627
	u8 new_on, new_off;
1628 1629 1630 1631 1632 1633 1634 1635 1636 1637 1638 1639 1640 1641 1642 1643 1644 1645 1646 1647 1648 1649 1650 1651 1652 1653 1654 1655 1656 1657 1658 1659 1660

	if (!drv_data) {
		hid_err(hdev, "No device data\n");
		return -EINVAL;
	}

	/* Max delay is 255 deciseconds or 2550 milliseconds */
	if (*delay_on > 2550)
		*delay_on = 2550;
	if (*delay_off > 2550)
		*delay_off = 2550;

	/* Blink at 1 Hz if both values are zero */
	if (!*delay_on && !*delay_off)
		*delay_on = *delay_off = 500;

	new_on = *delay_on / 10;
	new_off = *delay_off / 10;

	for (n = 0; n < drv_data->led_count; n++) {
		if (led == drv_data->leds[n])
			break;
	}

	/* This LED is not registered on this device */
	if (n >= drv_data->led_count)
		return -EINVAL;

	/* Don't schedule work if the values didn't change */
	if (new_on != drv_data->led_delay_on[n] ||
		new_off != drv_data->led_delay_off[n]) {
		drv_data->led_delay_on[n] = new_on;
		drv_data->led_delay_off[n] = new_off;
1661
		sony_schedule_work(drv_data);
1662 1663 1664 1665 1666
	}

	return 0;
}

1667
static void sony_leds_remove(struct sony_sc *sc)
1668 1669 1670 1671
{
	struct led_classdev *led;
	int n;

1672
	BUG_ON(!(sc->quirks & SONY_LED_SUPPORT));
1673

1674 1675 1676
	for (n = 0; n < sc->led_count; n++) {
		led = sc->leds[n];
		sc->leds[n] = NULL;
1677 1678 1679 1680 1681
		if (!led)
			continue;
		led_classdev_unregister(led);
		kfree(led);
	}
1682

1683
	sc->led_count = 0;
1684 1685
}

1686
static int sony_leds_init(struct sony_sc *sc)
1687
{
1688
	struct hid_device *hdev = sc->hdev;
J
Jiri Kosina 已提交
1689
	int n, ret = 0;
1690
	int use_ds4_names;
J
Jiri Kosina 已提交
1691 1692 1693
	struct led_classdev *led;
	size_t name_sz;
	char *name;
1694 1695
	size_t name_len;
	const char *name_fmt;
1696 1697
	static const char * const ds4_name_str[] = { "red", "green", "blue",
						  "global" };
1698 1699
	u8 max_brightness[MAX_LEDS] = { [0 ... (MAX_LEDS - 1)] = 1 };
	u8 use_hw_blink[MAX_LEDS] = { 0 };
1700

1701
	BUG_ON(!(sc->quirks & SONY_LED_SUPPORT));
1702

1703 1704
	if (sc->quirks & BUZZ_CONTROLLER) {
		sc->led_count = 4;
1705
		use_ds4_names = 0;
1706 1707 1708 1709 1710
		name_len = strlen("::buzz#");
		name_fmt = "%s::buzz%d";
		/* Validate expected report characteristics. */
		if (!hid_validate_values(hdev, HID_OUTPUT_REPORT, 0, 0, 7))
			return -ENODEV;
1711
	} else if (sc->quirks & DUALSHOCK4_CONTROLLER) {
1712 1713
		dualshock4_set_leds_from_id(sc);
		sc->led_state[3] = 1;
1714 1715 1716 1717
		sc->led_count = 4;
		memset(max_brightness, 255, 3);
		use_hw_blink[3] = 1;
		use_ds4_names = 1;
1718 1719
		name_len = 0;
		name_fmt = "%s:%s";
1720 1721 1722 1723 1724 1725
	} else if (sc->quirks & MOTION_CONTROLLER) {
		sc->led_count = 3;
		memset(max_brightness, 255, 3);
		use_ds4_names = 1;
		name_len = 0;
		name_fmt = "%s:%s";
1726
	} else if (sc->quirks & NAVIGATION_CONTROLLER) {
1727
		static const u8 navigation_leds[4] = {0x01, 0x00, 0x00, 0x00};
1728 1729 1730 1731 1732 1733 1734

		memcpy(sc->led_state, navigation_leds, sizeof(navigation_leds));
		sc->led_count = 1;
		memset(use_hw_blink, 1, 4);
		use_ds4_names = 0;
		name_len = strlen("::sony#");
		name_fmt = "%s::sony%d";
1735
	} else {
1736
		sixaxis_set_leds_from_id(sc);
1737
		sc->led_count = 4;
1738 1739
		memset(use_hw_blink, 1, 4);
		use_ds4_names = 0;
1740 1741
		name_len = strlen("::sony#");
		name_fmt = "%s::sony%d";
1742 1743
	}

1744 1745
	/*
	 * Clear LEDs as we have no way of reading their initial state. This is
1746
	 * only relevant if the driver is loaded after somebody actively set the
1747 1748
	 * LEDs to on
	 */
1749
	sony_set_leds(sc);
1750

1751
	name_sz = strlen(dev_name(&hdev->dev)) + name_len + 1;
1752

1753
	for (n = 0; n < sc->led_count; n++) {
1754

1755 1756
		if (use_ds4_names)
			name_sz = strlen(dev_name(&hdev->dev)) + strlen(ds4_name_str[n]) + 2;
1757

J
Jiri Kosina 已提交
1758 1759 1760
		led = kzalloc(sizeof(struct led_classdev) + name_sz, GFP_KERNEL);
		if (!led) {
			hid_err(hdev, "Couldn't allocate memory for LED %d\n", n);
J
Julia Lawall 已提交
1761
			ret = -ENOMEM;
J
Jiri Kosina 已提交
1762 1763
			goto error_leds;
		}
1764

J
Jiri Kosina 已提交
1765
		name = (void *)(&led[1]);
1766 1767 1768
		if (use_ds4_names)
			snprintf(name, name_sz, name_fmt, dev_name(&hdev->dev),
			ds4_name_str[n]);
1769 1770
		else
			snprintf(name, name_sz, name_fmt, dev_name(&hdev->dev), n + 1);
J
Jiri Kosina 已提交
1771
		led->name = name;
1772
		led->brightness = sc->led_state[n];
1773
		led->max_brightness = max_brightness[n];
1774 1775
		led->brightness_get = sony_led_get_brightness;
		led->brightness_set = sony_led_set_brightness;
1776

1777 1778 1779
		if (use_hw_blink[n])
			led->blink_set = sony_led_blink_set;

1780 1781
		sc->leds[n] = led;

J
Julia Lawall 已提交
1782 1783
		ret = led_classdev_register(&hdev->dev, led);
		if (ret) {
J
Jiri Kosina 已提交
1784
			hid_err(hdev, "Failed to register LED %d\n", n);
1785
			sc->leds[n] = NULL;
J
Jiri Kosina 已提交
1786 1787
			kfree(led);
			goto error_leds;
1788 1789 1790 1791 1792 1793
		}
	}

	return ret;

error_leds:
1794
	sony_leds_remove(sc);
1795 1796 1797 1798

	return ret;
}

1799
static void sixaxis_send_output_report(struct sony_sc *sc)
1800
{
1801
	static const union sixaxis_output_report_01 default_report = {
1802 1803
		.buf = {
			0x01,
1804
			0x01, 0xff, 0x00, 0xff, 0x00,
1805 1806 1807 1808 1809 1810 1811
			0x00, 0x00, 0x00, 0x00, 0x00,
			0xff, 0x27, 0x10, 0x00, 0x32,
			0xff, 0x27, 0x10, 0x00, 0x32,
			0xff, 0x27, 0x10, 0x00, 0x32,
			0xff, 0x27, 0x10, 0x00, 0x32,
			0x00, 0x00, 0x00, 0x00, 0x00
		}
1812
	};
1813 1814 1815 1816 1817 1818
	struct sixaxis_output_report *report =
		(struct sixaxis_output_report *)sc->output_report_dmabuf;
	int n;

	/* Initialize the report with default values */
	memcpy(report, &default_report, sizeof(struct sixaxis_output_report));
1819

1820
#ifdef CONFIG_SONY_FF
1821 1822
	report->rumble.right_motor_on = sc->right ? 1 : 0;
	report->rumble.left_motor_force = sc->left;
1823 1824
#endif

1825 1826 1827 1828
	report->leds_bitmap |= sc->led_state[0] << 1;
	report->leds_bitmap |= sc->led_state[1] << 2;
	report->leds_bitmap |= sc->led_state[2] << 3;
	report->leds_bitmap |= sc->led_state[3] << 4;
1829

1830
	/* Set flag for all leds off, required for 3rd party INTEC controller */
1831 1832
	if ((report->leds_bitmap & 0x1E) == 0)
		report->leds_bitmap |= 0x20;
1833

1834 1835 1836 1837 1838 1839 1840 1841 1842 1843 1844
	/*
	 * The LEDs in the report are indexed in reverse order to their
	 * corresponding light on the controller.
	 * Index 0 = LED 4, index 1 = LED 3, etc...
	 *
	 * In the case of both delay values being zero (blinking disabled) the
	 * default report values should be used or the controller LED will be
	 * always off.
	 */
	for (n = 0; n < 4; n++) {
		if (sc->led_delay_on[n] || sc->led_delay_off[n]) {
1845 1846
			report->led[3 - n].duty_off = sc->led_delay_off[n];
			report->led[3 - n].duty_on = sc->led_delay_on[n];
1847 1848 1849
		}
	}

1850
	hid_hw_raw_request(sc->hdev, report->report_id, (u8 *)report,
1851 1852
			sizeof(struct sixaxis_output_report),
			HID_OUTPUT_REPORT, HID_REQ_SET_REPORT);
1853 1854
}

1855
static void dualshock4_send_output_report(struct sony_sc *sc)
1856
{
1857
	struct hid_device *hdev = sc->hdev;
1858
	u8 *buf = sc->output_report_dmabuf;
1859 1860
	int offset;

1861 1862 1863 1864 1865 1866 1867 1868 1869 1870 1871
	/*
	 * NOTE: The buf[1] field of the Bluetooth report controls
	 * the Dualshock 4 reporting rate.
	 *
	 * Known values include:
	 *
	 * 0x80 - 1000hz (full speed)
	 * 0xA0 - 31hz
	 * 0xB0 - 20hz
	 * 0xD0 - 66hz
	 */
1872
	if (sc->quirks & DUALSHOCK4_CONTROLLER_USB) {
1873
		memset(buf, 0, DS4_OUTPUT_REPORT_0x05_SIZE);
1874
		buf[0] = 0x05;
1875
		buf[1] = 0xFF;
1876 1877
		offset = 4;
	} else {
1878
		memset(buf, 0, DS4_OUTPUT_REPORT_0x11_SIZE);
1879
		buf[0] = 0x11;
1880
		buf[1] = 0x80;
1881 1882 1883
		buf[3] = 0x0F;
		offset = 6;
	}
1884 1885

#ifdef CONFIG_SONY_FF
1886 1887 1888 1889
	buf[offset++] = sc->right;
	buf[offset++] = sc->left;
#else
	offset += 2;
1890 1891
#endif

1892 1893 1894 1895 1896 1897 1898 1899 1900 1901 1902 1903
	/* LED 3 is the global control */
	if (sc->led_state[3]) {
		buf[offset++] = sc->led_state[0];
		buf[offset++] = sc->led_state[1];
		buf[offset++] = sc->led_state[2];
	} else {
		offset += 3;
	}

	/* If both delay values are zero the DualShock 4 disables blinking. */
	buf[offset++] = sc->led_delay_on[3];
	buf[offset++] = sc->led_delay_off[3];
1904

1905
	if (sc->quirks & DUALSHOCK4_CONTROLLER_USB)
1906
		hid_hw_output_report(hdev, buf, DS4_OUTPUT_REPORT_0x05_SIZE);
1907
	else
1908
		hid_hw_raw_request(hdev, 0x11, buf, DS4_OUTPUT_REPORT_0x11_SIZE,
1909
				HID_OUTPUT_REPORT, HID_REQ_SET_REPORT);
1910 1911
}

1912
static void motion_send_output_report(struct sony_sc *sc)
1913 1914 1915 1916 1917
{
	struct hid_device *hdev = sc->hdev;
	struct motion_output_report_02 *report =
		(struct motion_output_report_02 *)sc->output_report_dmabuf;

1918
	memset(report, 0, MOTION_REPORT_0x02_SIZE);
1919 1920 1921 1922 1923 1924 1925 1926 1927 1928

	report->type = 0x02; /* set leds */
	report->r = sc->led_state[0];
	report->g = sc->led_state[1];
	report->b = sc->led_state[2];

#ifdef CONFIG_SONY_FF
	report->rumble = max(sc->right, sc->left);
#endif

1929
	hid_hw_output_report(hdev, (u8 *)report, MOTION_REPORT_0x02_SIZE);
1930 1931
}

1932 1933 1934 1935 1936 1937
static inline void sony_send_output_report(struct sony_sc *sc)
{
	if (sc->send_output_report)
		sc->send_output_report(sc);
}

1938 1939 1940
static void sony_state_worker(struct work_struct *work)
{
	struct sony_sc *sc = container_of(work, struct sony_sc, state_worker);
1941

1942 1943 1944
	sc->send_output_report(sc);
}

1945 1946
static int sony_allocate_output_report(struct sony_sc *sc)
{
1947 1948
	if ((sc->quirks & SIXAXIS_CONTROLLER) ||
			(sc->quirks & NAVIGATION_CONTROLLER))
1949 1950 1951 1952
		sc->output_report_dmabuf =
			kmalloc(sizeof(union sixaxis_output_report_01),
				GFP_KERNEL);
	else if (sc->quirks & DUALSHOCK4_CONTROLLER_BT)
1953
		sc->output_report_dmabuf = kmalloc(DS4_OUTPUT_REPORT_0x11_SIZE,
1954 1955
						GFP_KERNEL);
	else if (sc->quirks & DUALSHOCK4_CONTROLLER_USB)
1956
		sc->output_report_dmabuf = kmalloc(DS4_OUTPUT_REPORT_0x05_SIZE,
1957
						GFP_KERNEL);
1958
	else if (sc->quirks & MOTION_CONTROLLER)
1959 1960
		sc->output_report_dmabuf = kmalloc(MOTION_REPORT_0x02_SIZE,
						GFP_KERNEL);
1961 1962 1963 1964 1965 1966 1967 1968 1969
	else
		return 0;

	if (!sc->output_report_dmabuf)
		return -ENOMEM;

	return 0;
}

1970
#ifdef CONFIG_SONY_FF
1971 1972 1973
static int sony_play_effect(struct input_dev *dev, void *data,
			    struct ff_effect *effect)
{
1974
	struct hid_device *hid = input_get_drvdata(dev);
1975
	struct sony_sc *sc = hid_get_drvdata(hid);
1976 1977 1978 1979

	if (effect->type != FF_RUMBLE)
		return 0;

1980
	sc->left = effect->u.rumble.strong_magnitude / 256;
1981
	sc->right = effect->u.rumble.weak_magnitude / 256;
1982

1983
	sony_schedule_work(sc);
1984
	return 0;
1985 1986
}

1987
static int sony_init_ff(struct sony_sc *sc)
1988
{
1989
	struct hid_input *hidinput = list_entry(sc->hdev->inputs.next,
1990 1991 1992 1993 1994 1995 1996 1997
						struct hid_input, list);
	struct input_dev *input_dev = hidinput->input;

	input_set_capability(input_dev, EV_FF, FF_RUMBLE);
	return input_ff_create_memless(input_dev, NULL, sony_play_effect);
}

#else
1998
static int sony_init_ff(struct sony_sc *sc)
1999 2000 2001
{
	return 0;
}
2002

2003 2004
#endif

2005 2006 2007 2008
static int sony_battery_get_property(struct power_supply *psy,
				     enum power_supply_property psp,
				     union power_supply_propval *val)
{
2009
	struct sony_sc *sc = power_supply_get_drvdata(psy);
2010 2011 2012 2013 2014 2015 2016 2017 2018 2019 2020 2021 2022 2023 2024 2025 2026 2027 2028 2029 2030 2031 2032 2033 2034 2035 2036 2037 2038 2039 2040 2041 2042 2043
	unsigned long flags;
	int ret = 0;
	u8 battery_charging, battery_capacity, cable_state;

	spin_lock_irqsave(&sc->lock, flags);
	battery_charging = sc->battery_charging;
	battery_capacity = sc->battery_capacity;
	cable_state = sc->cable_state;
	spin_unlock_irqrestore(&sc->lock, flags);

	switch (psp) {
	case POWER_SUPPLY_PROP_PRESENT:
		val->intval = 1;
		break;
	case POWER_SUPPLY_PROP_SCOPE:
		val->intval = POWER_SUPPLY_SCOPE_DEVICE;
		break;
	case POWER_SUPPLY_PROP_CAPACITY:
		val->intval = battery_capacity;
		break;
	case POWER_SUPPLY_PROP_STATUS:
		if (battery_charging)
			val->intval = POWER_SUPPLY_STATUS_CHARGING;
		else
			if (battery_capacity == 100 && cable_state)
				val->intval = POWER_SUPPLY_STATUS_FULL;
			else
				val->intval = POWER_SUPPLY_STATUS_DISCHARGING;
		break;
	default:
		ret = -EINVAL;
		break;
	}
	return ret;
2044 2045
}

2046
static int sony_battery_probe(struct sony_sc *sc, int append_dev_id)
2047
{
2048 2049 2050
	const char *battery_str_fmt = append_dev_id ?
		"sony_controller_battery_%pMR_%i" :
		"sony_controller_battery_%pMR";
2051
	struct power_supply_config psy_cfg = { .drv_data = sc, };
2052
	struct hid_device *hdev = sc->hdev;
2053
	int ret;
2054

2055 2056
	/*
	 * Set the default battery level to 100% to avoid low battery warnings
2057 2058 2059 2060
	 * if the battery is polled before the first device report is received.
	 */
	sc->battery_capacity = 100;

2061 2062 2063 2064 2065
	sc->battery_desc.properties = sony_battery_props;
	sc->battery_desc.num_properties = ARRAY_SIZE(sony_battery_props);
	sc->battery_desc.get_property = sony_battery_get_property;
	sc->battery_desc.type = POWER_SUPPLY_TYPE_BATTERY;
	sc->battery_desc.use_for_apm = 0;
2066 2067
	sc->battery_desc.name = kasprintf(GFP_KERNEL, battery_str_fmt,
					  sc->mac_address, sc->device_id);
2068
	if (!sc->battery_desc.name)
2069
		return -ENOMEM;
2070

2071 2072 2073 2074
	sc->battery = power_supply_register(&hdev->dev, &sc->battery_desc,
					    &psy_cfg);
	if (IS_ERR(sc->battery)) {
		ret = PTR_ERR(sc->battery);
2075 2076 2077
		hid_err(hdev, "Unable to register battery device\n");
		goto err_free;
	}
2078

2079
	power_supply_powers(sc->battery, &hdev->dev);
2080
	return 0;
2081 2082

err_free:
2083 2084
	kfree(sc->battery_desc.name);
	sc->battery_desc.name = NULL;
2085
	return ret;
2086
}
2087

2088
static void sony_battery_remove(struct sony_sc *sc)
2089
{
2090
	if (!sc->battery_desc.name)
2091 2092
		return;

2093 2094 2095
	power_supply_unregister(sc->battery);
	kfree(sc->battery_desc.name);
	sc->battery_desc.name = NULL;
2096
}
2097

2098 2099 2100 2101 2102
/*
 * If a controller is plugged in via USB while already connected via Bluetooth
 * it will show up as two devices. A global list of connected controllers and
 * their MAC addresses is maintained to ensure that a device is only connected
 * once.
2103 2104 2105 2106 2107
 *
 * Some USB-only devices masquerade as Sixaxis controllers and all have the
 * same dummy Bluetooth address, so a comparison of the connection type is
 * required.  Devices are only rejected in the case where two devices have
 * matching Bluetooth addresses on different bus types.
2108
 */
2109 2110 2111 2112 2113 2114 2115 2116 2117
static inline int sony_compare_connection_type(struct sony_sc *sc0,
						struct sony_sc *sc1)
{
	const int sc0_not_bt = !(sc0->quirks & SONY_BT_DEVICE);
	const int sc1_not_bt = !(sc1->quirks & SONY_BT_DEVICE);

	return sc0_not_bt == sc1_not_bt;
}

2118 2119 2120 2121 2122 2123 2124 2125 2126 2127 2128 2129
static int sony_check_add_dev_list(struct sony_sc *sc)
{
	struct sony_sc *entry;
	unsigned long flags;
	int ret;

	spin_lock_irqsave(&sony_dev_list_lock, flags);

	list_for_each_entry(entry, &sony_device_list, list_node) {
		ret = memcmp(sc->mac_address, entry->mac_address,
				sizeof(sc->mac_address));
		if (!ret) {
2130 2131 2132 2133 2134 2135
			if (sony_compare_connection_type(sc, entry)) {
				ret = 1;
			} else {
				ret = -EEXIST;
				hid_info(sc->hdev,
				"controller with MAC address %pMR already connected\n",
2136
				sc->mac_address);
2137
			}
2138
			goto unlock;
2139 2140 2141
		}
	}

2142 2143
	ret = 0;
	list_add(&(sc->list_node), &sony_device_list);
2144

2145 2146 2147 2148 2149 2150 2151 2152
unlock:
	spin_unlock_irqrestore(&sony_dev_list_lock, flags);
	return ret;
}

static void sony_remove_dev_list(struct sony_sc *sc)
{
	unsigned long flags;
2153

2154 2155 2156 2157 2158
	if (sc->list_node.next) {
		spin_lock_irqsave(&sony_dev_list_lock, flags);
		list_del(&(sc->list_node));
		spin_unlock_irqrestore(&sony_dev_list_lock, flags);
	}
2159 2160
}

2161 2162 2163 2164 2165 2166 2167 2168 2169 2170 2171 2172 2173 2174 2175 2176 2177 2178 2179 2180 2181 2182
static int sony_get_bt_devaddr(struct sony_sc *sc)
{
	int ret;

	/* HIDP stores the device MAC address as a string in the uniq field. */
	ret = strlen(sc->hdev->uniq);
	if (ret != 17)
		return -EINVAL;

	ret = sscanf(sc->hdev->uniq,
		"%02hhx:%02hhx:%02hhx:%02hhx:%02hhx:%02hhx",
		&sc->mac_address[5], &sc->mac_address[4], &sc->mac_address[3],
		&sc->mac_address[2], &sc->mac_address[1], &sc->mac_address[0]);

	if (ret != 6)
		return -EINVAL;

	return 0;
}

static int sony_check_add(struct sony_sc *sc)
{
2183
	u8 *buf = NULL;
2184 2185 2186
	int n, ret;

	if ((sc->quirks & DUALSHOCK4_CONTROLLER_BT) ||
2187
	    (sc->quirks & MOTION_CONTROLLER_BT) ||
2188
	    (sc->quirks & NAVIGATION_CONTROLLER_BT) ||
2189 2190 2191 2192 2193 2194 2195 2196 2197 2198 2199 2200
	    (sc->quirks & SIXAXIS_CONTROLLER_BT)) {
		/*
		 * sony_get_bt_devaddr() attempts to parse the Bluetooth MAC
		 * address from the uniq string where HIDP stores it.
		 * As uniq cannot be guaranteed to be a MAC address in all cases
		 * a failure of this function should not prevent the connection.
		 */
		if (sony_get_bt_devaddr(sc) < 0) {
			hid_warn(sc->hdev, "UNIQ does not contain a MAC address; duplicate check skipped\n");
			return 0;
		}
	} else if (sc->quirks & DUALSHOCK4_CONTROLLER_USB) {
2201
		buf = kmalloc(DS4_FEATURE_REPORT_0x81_SIZE, GFP_KERNEL);
2202 2203
		if (!buf)
			return -ENOMEM;
2204 2205 2206 2207 2208 2209

		/*
		 * The MAC address of a DS4 controller connected via USB can be
		 * retrieved with feature report 0x81. The address begins at
		 * offset 1.
		 */
2210
		ret = hid_hw_raw_request(sc->hdev, 0x81, buf,
2211
				DS4_FEATURE_REPORT_0x81_SIZE, HID_FEATURE_REPORT,
2212
				HID_REQ_GET_REPORT);
2213

2214
		if (ret != DS4_FEATURE_REPORT_0x81_SIZE) {
2215
			hid_err(sc->hdev, "failed to retrieve feature report 0x81 with the DualShock 4 MAC address\n");
2216 2217
			ret = ret < 0 ? ret : -EINVAL;
			goto out_free;
2218 2219 2220
		}

		memcpy(sc->mac_address, &buf[1], sizeof(sc->mac_address));
2221 2222
	} else if ((sc->quirks & SIXAXIS_CONTROLLER_USB) ||
			(sc->quirks & NAVIGATION_CONTROLLER_USB)) {
2223 2224 2225
		buf = kmalloc(SIXAXIS_REPORT_0xF2_SIZE, GFP_KERNEL);
		if (!buf)
			return -ENOMEM;
2226 2227 2228 2229 2230 2231

		/*
		 * The MAC address of a Sixaxis controller connected via USB can
		 * be retrieved with feature report 0xf2. The address begins at
		 * offset 4.
		 */
2232 2233 2234
		ret = hid_hw_raw_request(sc->hdev, 0xf2, buf,
				SIXAXIS_REPORT_0xF2_SIZE, HID_FEATURE_REPORT,
				HID_REQ_GET_REPORT);
2235

2236
		if (ret != SIXAXIS_REPORT_0xF2_SIZE) {
2237
			hid_err(sc->hdev, "failed to retrieve feature report 0xf2 with the Sixaxis MAC address\n");
2238 2239
			ret = ret < 0 ? ret : -EINVAL;
			goto out_free;
2240 2241 2242 2243 2244 2245 2246 2247 2248 2249 2250 2251
		}

		/*
		 * The Sixaxis device MAC in the report is big-endian and must
		 * be byte-swapped.
		 */
		for (n = 0; n < 6; n++)
			sc->mac_address[5-n] = buf[4+n];
	} else {
		return 0;
	}

2252 2253 2254 2255 2256 2257 2258
	ret = sony_check_add_dev_list(sc);

out_free:

	kfree(buf);

	return ret;
2259 2260
}

2261 2262 2263 2264 2265 2266 2267 2268 2269 2270 2271 2272 2273 2274 2275 2276 2277 2278 2279 2280 2281 2282 2283 2284 2285 2286 2287 2288 2289 2290 2291 2292
static int sony_set_device_id(struct sony_sc *sc)
{
	int ret;

	/*
	 * Only DualShock 4 or Sixaxis controllers get an id.
	 * All others are set to -1.
	 */
	if ((sc->quirks & SIXAXIS_CONTROLLER) ||
	    (sc->quirks & DUALSHOCK4_CONTROLLER)) {
		ret = ida_simple_get(&sony_device_id_allocator, 0, 0,
					GFP_KERNEL);
		if (ret < 0) {
			sc->device_id = -1;
			return ret;
		}
		sc->device_id = ret;
	} else {
		sc->device_id = -1;
	}

	return 0;
}

static void sony_release_device_id(struct sony_sc *sc)
{
	if (sc->device_id >= 0) {
		ida_simple_remove(&sony_device_id_allocator, sc->device_id);
		sc->device_id = -1;
	}
}

2293
static inline void sony_init_output_report(struct sony_sc *sc,
2294
				void (*send_output_report)(struct sony_sc *))
2295
{
2296 2297
	sc->send_output_report = send_output_report;

2298
	if (!sc->worker_initialized)
2299
		INIT_WORK(&sc->state_worker, sony_state_worker);
2300 2301 2302 2303 2304 2305 2306 2307 2308

	sc->worker_initialized = 1;
}

static inline void sony_cancel_work_sync(struct sony_sc *sc)
{
	if (sc->worker_initialized)
		cancel_work_sync(&sc->state_worker);
}
2309

2310 2311
static int sony_input_configured(struct hid_device *hdev,
					struct hid_input *hidinput)
J
Jiri Slaby 已提交
2312
{
2313
	struct sony_sc *sc = hid_get_drvdata(hdev);
2314
	int append_dev_id;
2315
	int ret;
J
Jiri Slaby 已提交
2316

2317
	ret = sony_set_device_id(sc);
2318
	if (ret < 0) {
2319
		hid_err(hdev, "failed to allocate the device id\n");
2320 2321 2322
		goto err_stop;
	}

2323
	ret = sony_allocate_output_report(sc);
2324
	if (ret < 0) {
2325
		hid_err(hdev, "failed to allocate the output report buffer\n");
2326 2327 2328
		goto err_stop;
	}

2329 2330
	if ((sc->quirks & SIXAXIS_CONTROLLER_USB) ||
			(sc->quirks & NAVIGATION_CONTROLLER_USB)) {
2331 2332 2333 2334 2335 2336 2337 2338 2339
		/*
		 * The Sony Sixaxis does not handle HID Output Reports on the
		 * Interrupt EP like it could, so we need to force HID Output
		 * Reports to use HID_REQ_SET_REPORT on the Control EP.
		 *
		 * There is also another issue about HID Output Reports via USB,
		 * the Sixaxis does not want the report_id as part of the data
		 * packet, so we have to discard buf[0] when sending the actual
		 * control message, even for numbered reports, humpf!
2340 2341 2342 2343 2344 2345
		 *
		 * Additionally, the Sixaxis on USB isn't properly initialized
		 * until the PS logo button is pressed and as such won't retain
		 * any state set by an output report, so the initial
		 * configuration report is deferred until the first input
		 * report arrives.
2346 2347 2348
		 */
		hdev->quirks |= HID_QUIRK_NO_OUTPUT_REPORTS_ON_INTR_EP;
		hdev->quirks |= HID_QUIRK_SKIP_OUTPUT_REPORT_ID;
2349
		sc->defer_initialization = 1;
2350
		ret = sixaxis_set_operational_usb(hdev);
2351
		sony_init_output_report(sc, sixaxis_send_output_report);
2352 2353
	} else if ((sc->quirks & SIXAXIS_CONTROLLER_BT) ||
			(sc->quirks & NAVIGATION_CONTROLLER_BT)) {
2354 2355 2356 2357 2358
		/*
		 * The Sixaxis wants output reports sent on the ctrl endpoint
		 * when connected via Bluetooth.
		 */
		hdev->quirks |= HID_QUIRK_NO_OUTPUT_REPORTS_ON_INTR_EP;
2359
		ret = sixaxis_set_operational_bt(hdev);
2360
		sony_init_output_report(sc, sixaxis_send_output_report);
2361
	} else if (sc->quirks & DUALSHOCK4_CONTROLLER) {
2362
		if (sc->quirks & DUALSHOCK4_CONTROLLER_BT) {
2363 2364 2365 2366 2367
			/*
			 * The DualShock 4 wants output reports sent on the ctrl
			 * endpoint when connected via Bluetooth.
			 */
			hdev->quirks |= HID_QUIRK_NO_OUTPUT_REPORTS_ON_INTR_EP;
2368 2369 2370 2371 2372 2373
			ret = dualshock4_set_operational_bt(hdev);
			if (ret < 0) {
				hid_err(hdev, "failed to set the Dualshock 4 operational mode\n");
				goto err_stop;
			}
		}
2374

2375 2376 2377 2378 2379 2380 2381 2382 2383 2384 2385 2386
		/*
		 * The Dualshock 4 touchpad supports 2 touches and has a
		 * resolution of 1920x942 (44.86 dots/mm).
		 */
		ret = sony_register_touchpad(hidinput, 2, 1920, 942);
		if (ret) {
			hid_err(sc->hdev,
			"Unable to initialize multi-touch slots: %d\n",
			ret);
			return ret;
		}

2387
		sony_init_output_report(sc, dualshock4_send_output_report);
2388
	} else if (sc->quirks & MOTION_CONTROLLER) {
2389
		sony_init_output_report(sc, motion_send_output_report);
2390 2391 2392
	} else {
		ret = 0;
	}
2393

2394 2395 2396
	if (ret < 0)
		goto err_stop;

2397
	ret = append_dev_id = sony_check_add(sc);
2398
	if (ret < 0)
J
Jiri Slaby 已提交
2399 2400
		goto err_stop;

2401
	if (sc->quirks & SONY_LED_SUPPORT) {
2402
		ret = sony_leds_init(sc);
2403 2404 2405 2406
		if (ret < 0)
			goto err_stop;
	}

2407
	if (sc->quirks & SONY_BATTERY_SUPPORT) {
2408
		ret = sony_battery_probe(sc, append_dev_id);
2409 2410 2411 2412 2413 2414 2415 2416 2417 2418 2419
		if (ret < 0)
			goto err_stop;

		/* Open the device to receive reports with battery info */
		ret = hid_hw_open(hdev);
		if (ret < 0) {
			hid_err(hdev, "hw open failed\n");
			goto err_stop;
		}
	}

F
Frank Praznik 已提交
2420
	if (sc->quirks & SONY_FF_SUPPORT) {
2421
		ret = sony_init_ff(sc);
F
Frank Praznik 已提交
2422 2423
		if (ret < 0)
			goto err_close;
2424
	}
2425

J
Jiri Slaby 已提交
2426
	return 0;
2427 2428
err_close:
	hid_hw_close(hdev);
J
Jiri Slaby 已提交
2429
err_stop:
2430
	if (sc->quirks & SONY_LED_SUPPORT)
2431
		sony_leds_remove(sc);
2432 2433
	if (sc->quirks & SONY_BATTERY_SUPPORT)
		sony_battery_remove(sc);
2434
	sony_cancel_work_sync(sc);
2435
	kfree(sc->output_report_dmabuf);
2436
	sony_remove_dev_list(sc);
2437
	sony_release_device_id(sc);
J
Jiri Slaby 已提交
2438 2439 2440 2441
	hid_hw_stop(hdev);
	return ret;
}

2442 2443 2444 2445 2446 2447 2448 2449 2450 2451 2452 2453 2454 2455 2456 2457 2458 2459 2460 2461 2462 2463 2464 2465 2466 2467 2468 2469 2470 2471 2472 2473 2474 2475 2476 2477 2478 2479 2480 2481 2482 2483
static int sony_probe(struct hid_device *hdev, const struct hid_device_id *id)
{
	int ret;
	unsigned long quirks = id->driver_data;
	struct sony_sc *sc;
	unsigned int connect_mask = HID_CONNECT_DEFAULT;

	if (!strcmp(hdev->name, "FutureMax Dance Mat"))
		quirks |= FUTUREMAX_DANCE_MAT;

	sc = devm_kzalloc(&hdev->dev, sizeof(*sc), GFP_KERNEL);
	if (sc == NULL) {
		hid_err(hdev, "can't alloc sony descriptor\n");
		return -ENOMEM;
	}

	spin_lock_init(&sc->lock);

	sc->quirks = quirks;
	hid_set_drvdata(hdev, sc);
	sc->hdev = hdev;

	ret = hid_parse(hdev);
	if (ret) {
		hid_err(hdev, "parse failed\n");
		return ret;
	}

	if (sc->quirks & VAIO_RDESC_CONSTANT)
		connect_mask |= HID_CONNECT_HIDDEV_FORCE;
	else if (sc->quirks & SIXAXIS_CONTROLLER)
		connect_mask |= HID_CONNECT_HIDDEV_FORCE;

	ret = hid_hw_start(hdev, connect_mask);
	if (ret) {
		hid_err(hdev, "hw start failed\n");
		return ret;
	}

	return ret;
}

2484 2485
static void sony_remove(struct hid_device *hdev)
{
2486 2487
	struct sony_sc *sc = hid_get_drvdata(hdev);

2488
	if (sc->quirks & SONY_LED_SUPPORT)
2489
		sony_leds_remove(sc);
2490

2491 2492 2493 2494 2495
	if (sc->quirks & SONY_BATTERY_SUPPORT) {
		hid_hw_close(hdev);
		sony_battery_remove(sc);
	}

2496
	sony_cancel_work_sync(sc);
2497

2498 2499
	kfree(sc->output_report_dmabuf);

2500
	sony_remove_dev_list(sc);
2501

2502 2503
	sony_release_device_id(sc);

2504 2505 2506
	hid_hw_stop(hdev);
}

2507 2508 2509 2510 2511 2512 2513
#ifdef CONFIG_PM

static int sony_suspend(struct hid_device *hdev, pm_message_t message)
{
	/*
	 * On suspend save the current LED state,
	 * stop running force-feedback and blank the LEDS.
2514
	 */
2515 2516 2517 2518 2519 2520 2521 2522 2523 2524 2525 2526 2527 2528 2529 2530 2531 2532 2533 2534 2535 2536 2537 2538 2539 2540 2541 2542 2543 2544 2545
	if (SONY_LED_SUPPORT || SONY_FF_SUPPORT) {
		struct sony_sc *sc = hid_get_drvdata(hdev);

#ifdef CONFIG_SONY_FF
		sc->left = sc->right = 0;
#endif

		memcpy(sc->resume_led_state, sc->led_state,
			sizeof(sc->resume_led_state));
		memset(sc->led_state, 0, sizeof(sc->led_state));

		sony_send_output_report(sc);
	}

	return 0;
}

static int sony_resume(struct hid_device *hdev)
{
	/* Restore the state of controller LEDs on resume */
	if (SONY_LED_SUPPORT) {
		struct sony_sc *sc = hid_get_drvdata(hdev);

		memcpy(sc->led_state, sc->resume_led_state,
			sizeof(sc->led_state));

		/*
		 * The Sixaxis and navigation controllers on USB need to be
		 * reinitialized on resume or they won't behave properly.
		 */
		if ((sc->quirks & SIXAXIS_CONTROLLER_USB) ||
2546
			(sc->quirks & NAVIGATION_CONTROLLER_USB)) {
2547
			sixaxis_set_operational_usb(sc->hdev);
2548 2549
			sc->defer_initialization = 1;
		}
2550 2551 2552 2553 2554 2555 2556 2557 2558

		sony_set_leds(sc);
	}

	return 0;
}

#endif

J
Jiri Slaby 已提交
2559
static const struct hid_device_id sony_devices[] = {
2560 2561
	{ HID_USB_DEVICE(USB_VENDOR_ID_SONY, USB_DEVICE_ID_SONY_PS3_CONTROLLER),
		.driver_data = SIXAXIS_CONTROLLER_USB },
2562
	{ HID_USB_DEVICE(USB_VENDOR_ID_SONY, USB_DEVICE_ID_SONY_NAVIGATION_CONTROLLER),
2563
		.driver_data = NAVIGATION_CONTROLLER_USB },
2564
	{ HID_BLUETOOTH_DEVICE(USB_VENDOR_ID_SONY, USB_DEVICE_ID_SONY_NAVIGATION_CONTROLLER),
2565
		.driver_data = NAVIGATION_CONTROLLER_BT },
2566
	{ HID_USB_DEVICE(USB_VENDOR_ID_SONY, USB_DEVICE_ID_SONY_MOTION_CONTROLLER),
2567
		.driver_data = MOTION_CONTROLLER_USB },
2568
	{ HID_BLUETOOTH_DEVICE(USB_VENDOR_ID_SONY, USB_DEVICE_ID_SONY_MOTION_CONTROLLER),
2569
		.driver_data = MOTION_CONTROLLER_BT },
2570 2571
	{ HID_BLUETOOTH_DEVICE(USB_VENDOR_ID_SONY, USB_DEVICE_ID_SONY_PS3_CONTROLLER),
		.driver_data = SIXAXIS_CONTROLLER_BT },
2572 2573
	{ HID_USB_DEVICE(USB_VENDOR_ID_SONY, USB_DEVICE_ID_SONY_VAIO_VGX_MOUSE),
		.driver_data = VAIO_RDESC_CONSTANT },
2574 2575
	{ HID_USB_DEVICE(USB_VENDOR_ID_SONY, USB_DEVICE_ID_SONY_VAIO_VGP_MOUSE),
		.driver_data = VAIO_RDESC_CONSTANT },
2576 2577 2578 2579
	/*
	 * Wired Buzz Controller. Reported as Sony Hub from its USB ID and as
	 * Logitech joystick from the device descriptor.
	 */
2580 2581 2582 2583
	{ HID_USB_DEVICE(USB_VENDOR_ID_SONY, USB_DEVICE_ID_SONY_BUZZ_CONTROLLER),
		.driver_data = BUZZ_CONTROLLER },
	{ HID_USB_DEVICE(USB_VENDOR_ID_SONY, USB_DEVICE_ID_SONY_WIRELESS_BUZZ_CONTROLLER),
		.driver_data = BUZZ_CONTROLLER },
2584 2585 2586 2587 2588 2589
	/* PS3 BD Remote Control */
	{ HID_BLUETOOTH_DEVICE(USB_VENDOR_ID_SONY, USB_DEVICE_ID_SONY_PS3_BDREMOTE),
		.driver_data = PS3REMOTE },
	/* Logitech Harmony Adapter for PS3 */
	{ HID_BLUETOOTH_DEVICE(USB_VENDOR_ID_LOGITECH, USB_DEVICE_ID_LOGITECH_HARMONY_PS3),
		.driver_data = PS3REMOTE },
2590 2591 2592
	/* SMK-Link PS3 BD Remote Control */
	{ HID_BLUETOOTH_DEVICE(USB_VENDOR_ID_SMK, USB_DEVICE_ID_SMK_PS3_BDREMOTE),
		.driver_data = PS3REMOTE },
2593 2594
	/* Sony Dualshock 4 controllers for PS4 */
	{ HID_USB_DEVICE(USB_VENDOR_ID_SONY, USB_DEVICE_ID_SONY_PS4_CONTROLLER),
2595
		.driver_data = DUALSHOCK4_CONTROLLER_USB },
2596
	{ HID_BLUETOOTH_DEVICE(USB_VENDOR_ID_SONY, USB_DEVICE_ID_SONY_PS4_CONTROLLER),
2597
		.driver_data = DUALSHOCK4_CONTROLLER_BT },
2598 2599 2600
	/* Nyko Core Controller for PS3 */
	{ HID_USB_DEVICE(USB_VENDOR_ID_SINO_LITE, USB_DEVICE_ID_SINO_LITE_CONTROLLER),
		.driver_data = SIXAXIS_CONTROLLER_USB | SINO_LITE_CONTROLLER },
J
Jiri Slaby 已提交
2601 2602 2603 2604 2605
	{ }
};
MODULE_DEVICE_TABLE(hid, sony_devices);

static struct hid_driver sony_driver = {
2606 2607 2608 2609 2610 2611 2612
	.name             = "sony",
	.id_table         = sony_devices,
	.input_mapping    = sony_mapping,
	.input_configured = sony_input_configured,
	.probe            = sony_probe,
	.remove           = sony_remove,
	.report_fixup     = sony_report_fixup,
2613 2614 2615 2616 2617 2618 2619
	.raw_event        = sony_raw_event,

#ifdef CONFIG_PM
	.suspend          = sony_suspend,
	.resume	          = sony_resume,
	.reset_resume     = sony_resume,
#endif
J
Jiri Slaby 已提交
2620
};
2621 2622 2623 2624 2625 2626 2627 2628 2629 2630 2631 2632 2633

static int __init sony_init(void)
{
	dbg_hid("Sony:%s\n", __func__);

	return hid_register_driver(&sony_driver);
}

static void __exit sony_exit(void)
{
	dbg_hid("Sony:%s\n", __func__);

	hid_unregister_driver(&sony_driver);
2634
	ida_destroy(&sony_device_id_allocator);
2635 2636 2637
}
module_init(sony_init);
module_exit(sony_exit);
J
Jiri Slaby 已提交
2638 2639

MODULE_LICENSE("GPL");