Version:  2.0.40 2.2.26 2.4.37 3.1 3.2 3.3 3.4 3.5 3.6 3.7 3.8 3.9 3.10 3.11 3.12 3.13 3.14 3.15 3.16 3.17

Linux/drivers/hid/hid-sony.c

  1 /*
  2  *  HID driver for Sony / PS2 / PS3 BD devices.
  3  *
  4  *  Copyright (c) 1999 Andreas Gal
  5  *  Copyright (c) 2000-2005 Vojtech Pavlik <vojtech@suse.cz>
  6  *  Copyright (c) 2005 Michael Haboustak <mike-@cinci.rr.com> for Concept2, Inc
  7  *  Copyright (c) 2008 Jiri Slaby
  8  *  Copyright (c) 2012 David Dillow <dave@thedillows.org>
  9  *  Copyright (c) 2006-2013 Jiri Kosina
 10  *  Copyright (c) 2013 Colin Leitner <colin.leitner@gmail.com>
 11  */
 12 
 13 /*
 14  * This program is free software; you can redistribute it and/or modify it
 15  * under the terms of the GNU General Public License as published by the Free
 16  * Software Foundation; either version 2 of the License, or (at your option)
 17  * any later version.
 18  */
 19 
 20 /*
 21  * NOTE: in order for the Sony PS3 BD Remote Control to be found by
 22  * a Bluetooth host, the key combination Start+Enter has to be kept pressed
 23  * for about 7 seconds with the Bluetooth Host Controller in discovering mode.
 24  *
 25  * There will be no PIN request from the device.
 26  */
 27 
 28 #include <linux/device.h>
 29 #include <linux/hid.h>
 30 #include <linux/module.h>
 31 #include <linux/slab.h>
 32 #include <linux/leds.h>
 33 #include <linux/power_supply.h>
 34 #include <linux/spinlock.h>
 35 #include <linux/list.h>
 36 #include <linux/idr.h>
 37 #include <linux/input/mt.h>
 38 
 39 #include "hid-ids.h"
 40 
 41 #define VAIO_RDESC_CONSTANT       BIT(0)
 42 #define SIXAXIS_CONTROLLER_USB    BIT(1)
 43 #define SIXAXIS_CONTROLLER_BT     BIT(2)
 44 #define BUZZ_CONTROLLER           BIT(3)
 45 #define PS3REMOTE                 BIT(4)
 46 #define DUALSHOCK4_CONTROLLER_USB BIT(5)
 47 #define DUALSHOCK4_CONTROLLER_BT  BIT(6)
 48 
 49 #define SIXAXIS_CONTROLLER (SIXAXIS_CONTROLLER_USB | SIXAXIS_CONTROLLER_BT)
 50 #define DUALSHOCK4_CONTROLLER (DUALSHOCK4_CONTROLLER_USB |\
 51                                 DUALSHOCK4_CONTROLLER_BT)
 52 #define SONY_LED_SUPPORT (SIXAXIS_CONTROLLER | BUZZ_CONTROLLER |\
 53                                 DUALSHOCK4_CONTROLLER)
 54 #define SONY_BATTERY_SUPPORT (SIXAXIS_CONTROLLER | DUALSHOCK4_CONTROLLER)
 55 #define SONY_FF_SUPPORT (SIXAXIS_CONTROLLER | DUALSHOCK4_CONTROLLER)
 56 
 57 #define MAX_LEDS 4
 58 
 59 static __u8 sixaxis_rdesc[] = {
 60         0x05, 0x01,         /*  Usage Page (Desktop),               */
 61         0x09, 0x04,         /*  Usage (Joystik),                    */
 62         0xA1, 0x01,         /*  Collection (Application),           */
 63         0xA1, 0x02,         /*      Collection (Logical),           */
 64         0x85, 0x01,         /*          Report ID (1),              */
 65         0x75, 0x08,         /*          Report Size (8),            */
 66         0x95, 0x01,         /*          Report Count (1),           */
 67         0x15, 0x00,         /*          Logical Minimum (0),        */
 68         0x26, 0xFF, 0x00,   /*          Logical Maximum (255),      */
 69         0x81, 0x03,         /*          Input (Constant, Variable), */
 70         0x75, 0x01,         /*          Report Size (1),            */
 71         0x95, 0x13,         /*          Report Count (19),          */
 72         0x15, 0x00,         /*          Logical Minimum (0),        */
 73         0x25, 0x01,         /*          Logical Maximum (1),        */
 74         0x35, 0x00,         /*          Physical Minimum (0),       */
 75         0x45, 0x01,         /*          Physical Maximum (1),       */
 76         0x05, 0x09,         /*          Usage Page (Button),        */
 77         0x19, 0x01,         /*          Usage Minimum (01h),        */
 78         0x29, 0x13,         /*          Usage Maximum (13h),        */
 79         0x81, 0x02,         /*          Input (Variable),           */
 80         0x75, 0x01,         /*          Report Size (1),            */
 81         0x95, 0x0D,         /*          Report Count (13),          */
 82         0x06, 0x00, 0xFF,   /*          Usage Page (FF00h),         */
 83         0x81, 0x03,         /*          Input (Constant, Variable), */
 84         0x15, 0x00,         /*          Logical Minimum (0),        */
 85         0x26, 0xFF, 0x00,   /*          Logical Maximum (255),      */
 86         0x05, 0x01,         /*          Usage Page (Desktop),       */
 87         0x09, 0x01,         /*          Usage (Pointer),            */
 88         0xA1, 0x00,         /*          Collection (Physical),      */
 89         0x75, 0x08,         /*              Report Size (8),        */
 90         0x95, 0x04,         /*              Report Count (4),       */
 91         0x35, 0x00,         /*              Physical Minimum (0),   */
 92         0x46, 0xFF, 0x00,   /*              Physical Maximum (255), */
 93         0x09, 0x30,         /*              Usage (X),              */
 94         0x09, 0x31,         /*              Usage (Y),              */
 95         0x09, 0x32,         /*              Usage (Z),              */
 96         0x09, 0x35,         /*              Usage (Rz),             */
 97         0x81, 0x02,         /*              Input (Variable),       */
 98         0xC0,               /*          End Collection,             */
 99         0x05, 0x01,         /*          Usage Page (Desktop),       */
100         0x95, 0x13,         /*          Report Count (19),          */
101         0x09, 0x01,         /*          Usage (Pointer),            */
102         0x81, 0x02,         /*          Input (Variable),           */
103         0x95, 0x0C,         /*          Report Count (12),          */
104         0x81, 0x01,         /*          Input (Constant),           */
105         0x75, 0x10,         /*          Report Size (16),           */
106         0x95, 0x04,         /*          Report Count (4),           */
107         0x26, 0xFF, 0x03,   /*          Logical Maximum (1023),     */
108         0x46, 0xFF, 0x03,   /*          Physical Maximum (1023),    */
109         0x09, 0x01,         /*          Usage (Pointer),            */
110         0x81, 0x02,         /*          Input (Variable),           */
111         0xC0,               /*      End Collection,                 */
112         0xA1, 0x02,         /*      Collection (Logical),           */
113         0x85, 0x02,         /*          Report ID (2),              */
114         0x75, 0x08,         /*          Report Size (8),            */
115         0x95, 0x30,         /*          Report Count (48),          */
116         0x09, 0x01,         /*          Usage (Pointer),            */
117         0xB1, 0x02,         /*          Feature (Variable),         */
118         0xC0,               /*      End Collection,                 */
119         0xA1, 0x02,         /*      Collection (Logical),           */
120         0x85, 0xEE,         /*          Report ID (238),            */
121         0x75, 0x08,         /*          Report Size (8),            */
122         0x95, 0x30,         /*          Report Count (48),          */
123         0x09, 0x01,         /*          Usage (Pointer),            */
124         0xB1, 0x02,         /*          Feature (Variable),         */
125         0xC0,               /*      End Collection,                 */
126         0xA1, 0x02,         /*      Collection (Logical),           */
127         0x85, 0xEF,         /*          Report ID (239),            */
128         0x75, 0x08,         /*          Report Size (8),            */
129         0x95, 0x30,         /*          Report Count (48),          */
130         0x09, 0x01,         /*          Usage (Pointer),            */
131         0xB1, 0x02,         /*          Feature (Variable),         */
132         0xC0,               /*      End Collection,                 */
133         0xC0                /*  End Collection                      */
134 };
135 
136 /*
137  * The default descriptor doesn't provide mapping for the accelerometers
138  * or orientation sensors.  This fixed descriptor maps the accelerometers
139  * to usage values 0x40, 0x41 and 0x42 and maps the orientation sensors
140  * to usage values 0x43, 0x44 and 0x45.
141  */
142 static u8 dualshock4_usb_rdesc[] = {
143         0x05, 0x01,         /*  Usage Page (Desktop),               */
144         0x09, 0x05,         /*  Usage (Gamepad),                    */
145         0xA1, 0x01,         /*  Collection (Application),           */
146         0x85, 0x01,         /*      Report ID (1),                  */
147         0x09, 0x30,         /*      Usage (X),                      */
148         0x09, 0x31,         /*      Usage (Y),                      */
149         0x09, 0x32,         /*      Usage (Z),                      */
150         0x09, 0x35,         /*      Usage (Rz),                     */
151         0x15, 0x00,         /*      Logical Minimum (0),            */
152         0x26, 0xFF, 0x00,   /*      Logical Maximum (255),          */
153         0x75, 0x08,         /*      Report Size (8),                */
154         0x95, 0x04,         /*      Report Count (4),               */
155         0x81, 0x02,         /*      Input (Variable),               */
156         0x09, 0x39,         /*      Usage (Hat Switch),             */
157         0x15, 0x00,         /*      Logical Minimum (0),            */
158         0x25, 0x07,         /*      Logical Maximum (7),            */
159         0x35, 0x00,         /*      Physical Minimum (0),           */
160         0x46, 0x3B, 0x01,   /*      Physical Maximum (315),         */
161         0x65, 0x14,         /*      Unit (Degrees),                 */
162         0x75, 0x04,         /*      Report Size (4),                */
163         0x95, 0x01,         /*      Report Count (1),               */
164         0x81, 0x42,         /*      Input (Variable, Null State),   */
165         0x65, 0x00,         /*      Unit,                           */
166         0x05, 0x09,         /*      Usage Page (Button),            */
167         0x19, 0x01,         /*      Usage Minimum (01h),            */
168         0x29, 0x0E,         /*      Usage Maximum (0Eh),            */
169         0x15, 0x00,         /*      Logical Minimum (0),            */
170         0x25, 0x01,         /*      Logical Maximum (1),            */
171         0x75, 0x01,         /*      Report Size (1),                */
172         0x95, 0x0E,         /*      Report Count (14),              */
173         0x81, 0x02,         /*      Input (Variable),               */
174         0x06, 0x00, 0xFF,   /*      Usage Page (FF00h),             */
175         0x09, 0x20,         /*      Usage (20h),                    */
176         0x75, 0x06,         /*      Report Size (6),                */
177         0x95, 0x01,         /*      Report Count (1),               */
178         0x15, 0x00,         /*      Logical Minimum (0),            */
179         0x25, 0x7F,         /*      Logical Maximum (127),          */
180         0x81, 0x02,         /*      Input (Variable),               */
181         0x05, 0x01,         /*      Usage Page (Desktop),           */
182         0x09, 0x33,         /*      Usage (Rx),                     */
183         0x09, 0x34,         /*      Usage (Ry),                     */
184         0x15, 0x00,         /*      Logical Minimum (0),            */
185         0x26, 0xFF, 0x00,   /*      Logical Maximum (255),          */
186         0x75, 0x08,         /*      Report Size (8),                */
187         0x95, 0x02,         /*      Report Count (2),               */
188         0x81, 0x02,         /*      Input (Variable),               */
189         0x06, 0x00, 0xFF,   /*      Usage Page (FF00h),             */
190         0x09, 0x21,         /*      Usage (21h),                    */
191         0x95, 0x03,         /*      Report Count (3),               */
192         0x81, 0x02,         /*      Input (Variable),               */
193         0x05, 0x01,         /*      Usage Page (Desktop),           */
194         0x19, 0x40,         /*      Usage Minimum (40h),            */
195         0x29, 0x42,         /*      Usage Maximum (42h),            */
196         0x16, 0x00, 0x80,   /*      Logical Minimum (-32768),       */
197         0x26, 0x00, 0x7F,   /*      Logical Maximum (32767),        */
198         0x75, 0x10,         /*      Report Size (16),               */
199         0x95, 0x03,         /*      Report Count (3),               */
200         0x81, 0x02,         /*      Input (Variable),               */
201         0x19, 0x43,         /*      Usage Minimum (43h),            */
202         0x29, 0x45,         /*      Usage Maximum (45h),            */
203         0x16, 0xFF, 0xBF,   /*      Logical Minimum (-16385),       */
204         0x26, 0x00, 0x40,   /*      Logical Maximum (16384),        */
205         0x95, 0x03,         /*      Report Count (3),               */
206         0x81, 0x02,         /*      Input (Variable),               */
207         0x06, 0x00, 0xFF,   /*      Usage Page (FF00h),             */
208         0x09, 0x21,         /*      Usage (21h),                    */
209         0x15, 0x00,         /*      Logical Minimum (0),            */
210         0x25, 0xFF,         /*      Logical Maximum (255),          */
211         0x75, 0x08,         /*      Report Size (8),                */
212         0x95, 0x27,         /*      Report Count (39),              */
213         0x81, 0x02,         /*      Input (Variable),               */
214         0x85, 0x05,         /*      Report ID (5),                  */
215         0x09, 0x22,         /*      Usage (22h),                    */
216         0x95, 0x1F,         /*      Report Count (31),              */
217         0x91, 0x02,         /*      Output (Variable),              */
218         0x85, 0x04,         /*      Report ID (4),                  */
219         0x09, 0x23,         /*      Usage (23h),                    */
220         0x95, 0x24,         /*      Report Count (36),              */
221         0xB1, 0x02,         /*      Feature (Variable),             */
222         0x85, 0x02,         /*      Report ID (2),                  */
223         0x09, 0x24,         /*      Usage (24h),                    */
224         0x95, 0x24,         /*      Report Count (36),              */
225         0xB1, 0x02,         /*      Feature (Variable),             */
226         0x85, 0x08,         /*      Report ID (8),                  */
227         0x09, 0x25,         /*      Usage (25h),                    */
228         0x95, 0x03,         /*      Report Count (3),               */
229         0xB1, 0x02,         /*      Feature (Variable),             */
230         0x85, 0x10,         /*      Report ID (16),                 */
231         0x09, 0x26,         /*      Usage (26h),                    */
232         0x95, 0x04,         /*      Report Count (4),               */
233         0xB1, 0x02,         /*      Feature (Variable),             */
234         0x85, 0x11,         /*      Report ID (17),                 */
235         0x09, 0x27,         /*      Usage (27h),                    */
236         0x95, 0x02,         /*      Report Count (2),               */
237         0xB1, 0x02,         /*      Feature (Variable),             */
238         0x85, 0x12,         /*      Report ID (18),                 */
239         0x06, 0x02, 0xFF,   /*      Usage Page (FF02h),             */
240         0x09, 0x21,         /*      Usage (21h),                    */
241         0x95, 0x0F,         /*      Report Count (15),              */
242         0xB1, 0x02,         /*      Feature (Variable),             */
243         0x85, 0x13,         /*      Report ID (19),                 */
244         0x09, 0x22,         /*      Usage (22h),                    */
245         0x95, 0x16,         /*      Report Count (22),              */
246         0xB1, 0x02,         /*      Feature (Variable),             */
247         0x85, 0x14,         /*      Report ID (20),                 */
248         0x06, 0x05, 0xFF,   /*      Usage Page (FF05h),             */
249         0x09, 0x20,         /*      Usage (20h),                    */
250         0x95, 0x10,         /*      Report Count (16),              */
251         0xB1, 0x02,         /*      Feature (Variable),             */
252         0x85, 0x15,         /*      Report ID (21),                 */
253         0x09, 0x21,         /*      Usage (21h),                    */
254         0x95, 0x2C,         /*      Report Count (44),              */
255         0xB1, 0x02,         /*      Feature (Variable),             */
256         0x06, 0x80, 0xFF,   /*      Usage Page (FF80h),             */
257         0x85, 0x80,         /*      Report ID (128),                */
258         0x09, 0x20,         /*      Usage (20h),                    */
259         0x95, 0x06,         /*      Report Count (6),               */
260         0xB1, 0x02,         /*      Feature (Variable),             */
261         0x85, 0x81,         /*      Report ID (129),                */
262         0x09, 0x21,         /*      Usage (21h),                    */
263         0x95, 0x06,         /*      Report Count (6),               */
264         0xB1, 0x02,         /*      Feature (Variable),             */
265         0x85, 0x82,         /*      Report ID (130),                */
266         0x09, 0x22,         /*      Usage (22h),                    */
267         0x95, 0x05,         /*      Report Count (5),               */
268         0xB1, 0x02,         /*      Feature (Variable),             */
269         0x85, 0x83,         /*      Report ID (131),                */
270         0x09, 0x23,         /*      Usage (23h),                    */
271         0x95, 0x01,         /*      Report Count (1),               */
272         0xB1, 0x02,         /*      Feature (Variable),             */
273         0x85, 0x84,         /*      Report ID (132),                */
274         0x09, 0x24,         /*      Usage (24h),                    */
275         0x95, 0x04,         /*      Report Count (4),               */
276         0xB1, 0x02,         /*      Feature (Variable),             */
277         0x85, 0x85,         /*      Report ID (133),                */
278         0x09, 0x25,         /*      Usage (25h),                    */
279         0x95, 0x06,         /*      Report Count (6),               */
280         0xB1, 0x02,         /*      Feature (Variable),             */
281         0x85, 0x86,         /*      Report ID (134),                */
282         0x09, 0x26,         /*      Usage (26h),                    */
283         0x95, 0x06,         /*      Report Count (6),               */
284         0xB1, 0x02,         /*      Feature (Variable),             */
285         0x85, 0x87,         /*      Report ID (135),                */
286         0x09, 0x27,         /*      Usage (27h),                    */
287         0x95, 0x23,         /*      Report Count (35),              */
288         0xB1, 0x02,         /*      Feature (Variable),             */
289         0x85, 0x88,         /*      Report ID (136),                */
290         0x09, 0x28,         /*      Usage (28h),                    */
291         0x95, 0x22,         /*      Report Count (34),              */
292         0xB1, 0x02,         /*      Feature (Variable),             */
293         0x85, 0x89,         /*      Report ID (137),                */
294         0x09, 0x29,         /*      Usage (29h),                    */
295         0x95, 0x02,         /*      Report Count (2),               */
296         0xB1, 0x02,         /*      Feature (Variable),             */
297         0x85, 0x90,         /*      Report ID (144),                */
298         0x09, 0x30,         /*      Usage (30h),                    */
299         0x95, 0x05,         /*      Report Count (5),               */
300         0xB1, 0x02,         /*      Feature (Variable),             */
301         0x85, 0x91,         /*      Report ID (145),                */
302         0x09, 0x31,         /*      Usage (31h),                    */
303         0x95, 0x03,         /*      Report Count (3),               */
304         0xB1, 0x02,         /*      Feature (Variable),             */
305         0x85, 0x92,         /*      Report ID (146),                */
306         0x09, 0x32,         /*      Usage (32h),                    */
307         0x95, 0x03,         /*      Report Count (3),               */
308         0xB1, 0x02,         /*      Feature (Variable),             */
309         0x85, 0x93,         /*      Report ID (147),                */
310         0x09, 0x33,         /*      Usage (33h),                    */
311         0x95, 0x0C,         /*      Report Count (12),              */
312         0xB1, 0x02,         /*      Feature (Variable),             */
313         0x85, 0xA0,         /*      Report ID (160),                */
314         0x09, 0x40,         /*      Usage (40h),                    */
315         0x95, 0x06,         /*      Report Count (6),               */
316         0xB1, 0x02,         /*      Feature (Variable),             */
317         0x85, 0xA1,         /*      Report ID (161),                */
318         0x09, 0x41,         /*      Usage (41h),                    */
319         0x95, 0x01,         /*      Report Count (1),               */
320         0xB1, 0x02,         /*      Feature (Variable),             */
321         0x85, 0xA2,         /*      Report ID (162),                */
322         0x09, 0x42,         /*      Usage (42h),                    */
323         0x95, 0x01,         /*      Report Count (1),               */
324         0xB1, 0x02,         /*      Feature (Variable),             */
325         0x85, 0xA3,         /*      Report ID (163),                */
326         0x09, 0x43,         /*      Usage (43h),                    */
327         0x95, 0x30,         /*      Report Count (48),              */
328         0xB1, 0x02,         /*      Feature (Variable),             */
329         0x85, 0xA4,         /*      Report ID (164),                */
330         0x09, 0x44,         /*      Usage (44h),                    */
331         0x95, 0x0D,         /*      Report Count (13),              */
332         0xB1, 0x02,         /*      Feature (Variable),             */
333         0x85, 0xA5,         /*      Report ID (165),                */
334         0x09, 0x45,         /*      Usage (45h),                    */
335         0x95, 0x15,         /*      Report Count (21),              */
336         0xB1, 0x02,         /*      Feature (Variable),             */
337         0x85, 0xA6,         /*      Report ID (166),                */
338         0x09, 0x46,         /*      Usage (46h),                    */
339         0x95, 0x15,         /*      Report Count (21),              */
340         0xB1, 0x02,         /*      Feature (Variable),             */
341         0x85, 0xF0,         /*      Report ID (240),                */
342         0x09, 0x47,         /*      Usage (47h),                    */
343         0x95, 0x3F,         /*      Report Count (63),              */
344         0xB1, 0x02,         /*      Feature (Variable),             */
345         0x85, 0xF1,         /*      Report ID (241),                */
346         0x09, 0x48,         /*      Usage (48h),                    */
347         0x95, 0x3F,         /*      Report Count (63),              */
348         0xB1, 0x02,         /*      Feature (Variable),             */
349         0x85, 0xF2,         /*      Report ID (242),                */
350         0x09, 0x49,         /*      Usage (49h),                    */
351         0x95, 0x0F,         /*      Report Count (15),              */
352         0xB1, 0x02,         /*      Feature (Variable),             */
353         0x85, 0xA7,         /*      Report ID (167),                */
354         0x09, 0x4A,         /*      Usage (4Ah),                    */
355         0x95, 0x01,         /*      Report Count (1),               */
356         0xB1, 0x02,         /*      Feature (Variable),             */
357         0x85, 0xA8,         /*      Report ID (168),                */
358         0x09, 0x4B,         /*      Usage (4Bh),                    */
359         0x95, 0x01,         /*      Report Count (1),               */
360         0xB1, 0x02,         /*      Feature (Variable),             */
361         0x85, 0xA9,         /*      Report ID (169),                */
362         0x09, 0x4C,         /*      Usage (4Ch),                    */
363         0x95, 0x08,         /*      Report Count (8),               */
364         0xB1, 0x02,         /*      Feature (Variable),             */
365         0x85, 0xAA,         /*      Report ID (170),                */
366         0x09, 0x4E,         /*      Usage (4Eh),                    */
367         0x95, 0x01,         /*      Report Count (1),               */
368         0xB1, 0x02,         /*      Feature (Variable),             */
369         0x85, 0xAB,         /*      Report ID (171),                */
370         0x09, 0x4F,         /*      Usage (4Fh),                    */
371         0x95, 0x39,         /*      Report Count (57),              */
372         0xB1, 0x02,         /*      Feature (Variable),             */
373         0x85, 0xAC,         /*      Report ID (172),                */
374         0x09, 0x50,         /*      Usage (50h),                    */
375         0x95, 0x39,         /*      Report Count (57),              */
376         0xB1, 0x02,         /*      Feature (Variable),             */
377         0x85, 0xAD,         /*      Report ID (173),                */
378         0x09, 0x51,         /*      Usage (51h),                    */
379         0x95, 0x0B,         /*      Report Count (11),              */
380         0xB1, 0x02,         /*      Feature (Variable),             */
381         0x85, 0xAE,         /*      Report ID (174),                */
382         0x09, 0x52,         /*      Usage (52h),                    */
383         0x95, 0x01,         /*      Report Count (1),               */
384         0xB1, 0x02,         /*      Feature (Variable),             */
385         0x85, 0xAF,         /*      Report ID (175),                */
386         0x09, 0x53,         /*      Usage (53h),                    */
387         0x95, 0x02,         /*      Report Count (2),               */
388         0xB1, 0x02,         /*      Feature (Variable),             */
389         0x85, 0xB0,         /*      Report ID (176),                */
390         0x09, 0x54,         /*      Usage (54h),                    */
391         0x95, 0x3F,         /*      Report Count (63),              */
392         0xB1, 0x02,         /*      Feature (Variable),             */
393         0xC0                /*  End Collection                      */
394 };
395 
396 /*
397  * The default behavior of the Dualshock 4 is to send reports using report
398  * type 1 when running over Bluetooth. However, as soon as it receives a
399  * report of type 17 to set the LEDs or rumble it starts returning it's state
400  * in report 17 instead of 1.  Since report 17 is undefined in the default HID
401  * descriptor the button and axis definitions must be moved to report 17 or
402  * the HID layer won't process the received input once a report is sent.
403  */
404 static u8 dualshock4_bt_rdesc[] = {
405         0x05, 0x01,         /*  Usage Page (Desktop),               */
406         0x09, 0x05,         /*  Usage (Gamepad),                    */
407         0xA1, 0x01,         /*  Collection (Application),           */
408         0x85, 0x01,         /*      Report ID (1),                  */
409         0x75, 0x08,         /*      Report Size (8),                */
410         0x95, 0x0A,         /*      Report Count (9),               */
411         0x81, 0x02,         /*      Input (Variable),               */
412         0x06, 0x04, 0xFF,   /*      Usage Page (FF04h),             */
413         0x85, 0x02,         /*      Report ID (2),                  */
414         0x09, 0x24,         /*      Usage (24h),                    */
415         0x95, 0x24,         /*      Report Count (36),              */
416         0xB1, 0x02,         /*      Feature (Variable),             */
417         0x85, 0xA3,         /*      Report ID (163),                */
418         0x09, 0x25,         /*      Usage (25h),                    */
419         0x95, 0x30,         /*      Report Count (48),              */
420         0xB1, 0x02,         /*      Feature (Variable),             */
421         0x85, 0x05,         /*      Report ID (5),                  */
422         0x09, 0x26,         /*      Usage (26h),                    */
423         0x95, 0x28,         /*      Report Count (40),              */
424         0xB1, 0x02,         /*      Feature (Variable),             */
425         0x85, 0x06,         /*      Report ID (6),                  */
426         0x09, 0x27,         /*      Usage (27h),                    */
427         0x95, 0x34,         /*      Report Count (52),              */
428         0xB1, 0x02,         /*      Feature (Variable),             */
429         0x85, 0x07,         /*      Report ID (7),                  */
430         0x09, 0x28,         /*      Usage (28h),                    */
431         0x95, 0x30,         /*      Report Count (48),              */
432         0xB1, 0x02,         /*      Feature (Variable),             */
433         0x85, 0x08,         /*      Report ID (8),                  */
434         0x09, 0x29,         /*      Usage (29h),                    */
435         0x95, 0x2F,         /*      Report Count (47),              */
436         0xB1, 0x02,         /*      Feature (Variable),             */
437         0x06, 0x03, 0xFF,   /*      Usage Page (FF03h),             */
438         0x85, 0x03,         /*      Report ID (3),                  */
439         0x09, 0x21,         /*      Usage (21h),                    */
440         0x95, 0x26,         /*      Report Count (38),              */
441         0xB1, 0x02,         /*      Feature (Variable),             */
442         0x85, 0x04,         /*      Report ID (4),                  */
443         0x09, 0x22,         /*      Usage (22h),                    */
444         0x95, 0x2E,         /*      Report Count (46),              */
445         0xB1, 0x02,         /*      Feature (Variable),             */
446         0x85, 0xF0,         /*      Report ID (240),                */
447         0x09, 0x47,         /*      Usage (47h),                    */
448         0x95, 0x3F,         /*      Report Count (63),              */
449         0xB1, 0x02,         /*      Feature (Variable),             */
450         0x85, 0xF1,         /*      Report ID (241),                */
451         0x09, 0x48,         /*      Usage (48h),                    */
452         0x95, 0x3F,         /*      Report Count (63),              */
453         0xB1, 0x02,         /*      Feature (Variable),             */
454         0x85, 0xF2,         /*      Report ID (242),                */
455         0x09, 0x49,         /*      Usage (49h),                    */
456         0x95, 0x0F,         /*      Report Count (15),              */
457         0xB1, 0x02,         /*      Feature (Variable),             */
458         0x85, 0x11,         /*      Report ID (17),                 */
459         0x06, 0x00, 0xFF,   /*      Usage Page (FF00h),             */
460         0x09, 0x20,         /*      Usage (20h),                    */
461         0x95, 0x02,         /*      Report Count (2),               */
462         0x81, 0x02,         /*      Input (Variable),               */
463         0x05, 0x01,         /*      Usage Page (Desktop),           */
464         0x09, 0x30,         /*      Usage (X),                      */
465         0x09, 0x31,         /*      Usage (Y),                      */
466         0x09, 0x32,         /*      Usage (Z),                      */
467         0x09, 0x35,         /*      Usage (Rz),                     */
468         0x15, 0x00,         /*      Logical Minimum (0),            */
469         0x26, 0xFF, 0x00,   /*      Logical Maximum (255),          */
470         0x75, 0x08,         /*      Report Size (8),                */
471         0x95, 0x04,         /*      Report Count (4),               */
472         0x81, 0x02,         /*      Input (Variable),               */
473         0x09, 0x39,         /*      Usage (Hat Switch),             */
474         0x15, 0x00,         /*      Logical Minimum (0),            */
475         0x25, 0x07,         /*      Logical Maximum (7),            */
476         0x75, 0x04,         /*      Report Size (4),                */
477         0x95, 0x01,         /*      Report Count (1),               */
478         0x81, 0x42,         /*      Input (Variable, Null State),   */
479         0x05, 0x09,         /*      Usage Page (Button),            */
480         0x19, 0x01,         /*      Usage Minimum (01h),            */
481         0x29, 0x0E,         /*      Usage Maximum (0Eh),            */
482         0x15, 0x00,         /*      Logical Minimum (0),            */
483         0x25, 0x01,         /*      Logical Maximum (1),            */
484         0x75, 0x01,         /*      Report Size (1),                */
485         0x95, 0x0E,         /*      Report Count (14),              */
486         0x81, 0x02,         /*      Input (Variable),               */
487         0x75, 0x06,         /*      Report Size (6),                */
488         0x95, 0x01,         /*      Report Count (1),               */
489         0x81, 0x01,         /*      Input (Constant),               */
490         0x05, 0x01,         /*      Usage Page (Desktop),           */
491         0x09, 0x33,         /*      Usage (Rx),                     */
492         0x09, 0x34,         /*      Usage (Ry),                     */
493         0x15, 0x00,         /*      Logical Minimum (0),            */
494         0x26, 0xFF, 0x00,   /*      Logical Maximum (255),          */
495         0x75, 0x08,         /*      Report Size (8),                */
496         0x95, 0x02,         /*      Report Count (2),               */
497         0x81, 0x02,         /*      Input (Variable),               */
498         0x06, 0x00, 0xFF,   /*      Usage Page (FF00h),             */
499         0x09, 0x20,         /*      Usage (20h),                    */
500         0x95, 0x03,         /*      Report Count (3),               */
501         0x81, 0x02,         /*      Input (Variable),               */
502         0x05, 0x01,         /*      Usage Page (Desktop),           */
503         0x19, 0x40,         /*      Usage Minimum (40h),            */
504         0x29, 0x42,         /*      Usage Maximum (42h),            */
505         0x16, 0x00, 0x80,   /*      Logical Minimum (-32768),       */
506         0x26, 0x00, 0x7F,   /*      Logical Maximum (32767),        */
507         0x75, 0x10,         /*      Report Size (16),               */
508         0x95, 0x03,         /*      Report Count (3),               */
509         0x81, 0x02,         /*      Input (Variable),               */
510         0x19, 0x43,         /*      Usage Minimum (43h),            */
511         0x29, 0x45,         /*      Usage Maximum (45h),            */
512         0x16, 0xFF, 0xBF,   /*      Logical Minimum (-16385),       */
513         0x26, 0x00, 0x40,   /*      Logical Maximum (16384),        */
514         0x95, 0x03,         /*      Report Count (3),               */
515         0x81, 0x02,         /*      Input (Variable),               */
516         0x06, 0x00, 0xFF,   /*      Usage Page (FF00h),             */
517         0x09, 0x20,         /*      Usage (20h),                    */
518         0x15, 0x00,         /*      Logical Minimum (0),            */
519         0x26, 0xFF, 0x00,   /*      Logical Maximum (255),          */
520         0x75, 0x08,         /*      Report Size (8),                */
521         0x95, 0x31,         /*      Report Count (51),              */
522         0x81, 0x02,         /*      Input (Variable),               */
523         0x09, 0x21,         /*      Usage (21h),                    */
524         0x75, 0x08,         /*      Report Size (8),                */
525         0x95, 0x4D,         /*      Report Count (77),              */
526         0x91, 0x02,         /*      Output (Variable),              */
527         0x85, 0x12,         /*      Report ID (18),                 */
528         0x09, 0x22,         /*      Usage (22h),                    */
529         0x95, 0x8D,         /*      Report Count (141),             */
530         0x81, 0x02,         /*      Input (Variable),               */
531         0x09, 0x23,         /*      Usage (23h),                    */
532         0x91, 0x02,         /*      Output (Variable),              */
533         0x85, 0x13,         /*      Report ID (19),                 */
534         0x09, 0x24,         /*      Usage (24h),                    */
535         0x95, 0xCD,         /*      Report Count (205),             */
536         0x81, 0x02,         /*      Input (Variable),               */
537         0x09, 0x25,         /*      Usage (25h),                    */
538         0x91, 0x02,         /*      Output (Variable),              */
539         0x85, 0x14,         /*      Report ID (20),                 */
540         0x09, 0x26,         /*      Usage (26h),                    */
541         0x96, 0x0D, 0x01,   /*      Report Count (269),             */
542         0x81, 0x02,         /*      Input (Variable),               */
543         0x09, 0x27,         /*      Usage (27h),                    */
544         0x91, 0x02,         /*      Output (Variable),              */
545         0x85, 0x15,         /*      Report ID (21),                 */
546         0x09, 0x28,         /*      Usage (28h),                    */
547         0x96, 0x4D, 0x01,   /*      Report Count (333),             */
548         0x81, 0x02,         /*      Input (Variable),               */
549         0x09, 0x29,         /*      Usage (29h),                    */
550         0x91, 0x02,         /*      Output (Variable),              */
551         0x85, 0x16,         /*      Report ID (22),                 */
552         0x09, 0x2A,         /*      Usage (2Ah),                    */
553         0x96, 0x8D, 0x01,   /*      Report Count (397),             */
554         0x81, 0x02,         /*      Input (Variable),               */
555         0x09, 0x2B,         /*      Usage (2Bh),                    */
556         0x91, 0x02,         /*      Output (Variable),              */
557         0x85, 0x17,         /*      Report ID (23),                 */
558         0x09, 0x2C,         /*      Usage (2Ch),                    */
559         0x96, 0xCD, 0x01,   /*      Report Count (461),             */
560         0x81, 0x02,         /*      Input (Variable),               */
561         0x09, 0x2D,         /*      Usage (2Dh),                    */
562         0x91, 0x02,         /*      Output (Variable),              */
563         0x85, 0x18,         /*      Report ID (24),                 */
564         0x09, 0x2E,         /*      Usage (2Eh),                    */
565         0x96, 0x0D, 0x02,   /*      Report Count (525),             */
566         0x81, 0x02,         /*      Input (Variable),               */
567         0x09, 0x2F,         /*      Usage (2Fh),                    */
568         0x91, 0x02,         /*      Output (Variable),              */
569         0x85, 0x19,         /*      Report ID (25),                 */
570         0x09, 0x30,         /*      Usage (30h),                    */
571         0x96, 0x22, 0x02,   /*      Report Count (546),             */
572         0x81, 0x02,         /*      Input (Variable),               */
573         0x09, 0x31,         /*      Usage (31h),                    */
574         0x91, 0x02,         /*      Output (Variable),              */
575         0x06, 0x80, 0xFF,   /*      Usage Page (FF80h),             */
576         0x85, 0x82,         /*      Report ID (130),                */
577         0x09, 0x22,         /*      Usage (22h),                    */
578         0x95, 0x3F,         /*      Report Count (63),              */
579         0xB1, 0x02,         /*      Feature (Variable),             */
580         0x85, 0x83,         /*      Report ID (131),                */
581         0x09, 0x23,         /*      Usage (23h),                    */
582         0xB1, 0x02,         /*      Feature (Variable),             */
583         0x85, 0x84,         /*      Report ID (132),                */
584         0x09, 0x24,         /*      Usage (24h),                    */
585         0xB1, 0x02,         /*      Feature (Variable),             */
586         0x85, 0x90,         /*      Report ID (144),                */
587         0x09, 0x30,         /*      Usage (30h),                    */
588         0xB1, 0x02,         /*      Feature (Variable),             */
589         0x85, 0x91,         /*      Report ID (145),                */
590         0x09, 0x31,         /*      Usage (31h),                    */
591         0xB1, 0x02,         /*      Feature (Variable),             */
592         0x85, 0x92,         /*      Report ID (146),                */
593         0x09, 0x32,         /*      Usage (32h),                    */
594         0xB1, 0x02,         /*      Feature (Variable),             */
595         0x85, 0x93,         /*      Report ID (147),                */
596         0x09, 0x33,         /*      Usage (33h),                    */
597         0xB1, 0x02,         /*      Feature (Variable),             */
598         0x85, 0xA0,         /*      Report ID (160),                */
599         0x09, 0x40,         /*      Usage (40h),                    */
600         0xB1, 0x02,         /*      Feature (Variable),             */
601         0x85, 0xA4,         /*      Report ID (164),                */
602         0x09, 0x44,         /*      Usage (44h),                    */
603         0xB1, 0x02,         /*      Feature (Variable),             */
604         0xC0                /*  End Collection                      */
605 };
606 
607 static __u8 ps3remote_rdesc[] = {
608         0x05, 0x01,          /* GUsagePage Generic Desktop */
609         0x09, 0x05,          /* LUsage 0x05 [Game Pad] */
610         0xA1, 0x01,          /* MCollection Application (mouse, keyboard) */
611 
612          /* Use collection 1 for joypad buttons */
613          0xA1, 0x02,         /* MCollection Logical (interrelated data) */
614 
615           /* Ignore the 1st byte, maybe it is used for a controller
616            * number but it's not needed for correct operation */
617           0x75, 0x08,        /* GReportSize 0x08 [8] */
618           0x95, 0x01,        /* GReportCount 0x01 [1] */
619           0x81, 0x01,        /* MInput 0x01 (Const[0] Arr[1] Abs[2]) */
620 
621           /* Bytes from 2nd to 4th are a bitmap for joypad buttons, for these
622            * buttons multiple keypresses are allowed */
623           0x05, 0x09,        /* GUsagePage Button */
624           0x19, 0x01,        /* LUsageMinimum 0x01 [Button 1 (primary/trigger)] */
625           0x29, 0x18,        /* LUsageMaximum 0x18 [Button 24] */
626           0x14,              /* GLogicalMinimum [0] */
627           0x25, 0x01,        /* GLogicalMaximum 0x01 [1] */
628           0x75, 0x01,        /* GReportSize 0x01 [1] */
629           0x95, 0x18,        /* GReportCount 0x18 [24] */
630           0x81, 0x02,        /* MInput 0x02 (Data[0] Var[1] Abs[2]) */
631 
632           0xC0,              /* MEndCollection */
633 
634          /* Use collection 2 for remote control buttons */
635          0xA1, 0x02,         /* MCollection Logical (interrelated data) */
636 
637           /* 5th byte is used for remote control buttons */
638           0x05, 0x09,        /* GUsagePage Button */
639           0x18,              /* LUsageMinimum [No button pressed] */
640           0x29, 0xFE,        /* LUsageMaximum 0xFE [Button 254] */
641           0x14,              /* GLogicalMinimum [0] */
642           0x26, 0xFE, 0x00,  /* GLogicalMaximum 0x00FE [254] */
643           0x75, 0x08,        /* GReportSize 0x08 [8] */
644           0x95, 0x01,        /* GReportCount 0x01 [1] */
645           0x80,              /* MInput  */
646 
647           /* Ignore bytes from 6th to 11th, 6th to 10th are always constant at
648            * 0xff and 11th is for press indication */
649           0x75, 0x08,        /* GReportSize 0x08 [8] */
650           0x95, 0x06,        /* GReportCount 0x06 [6] */
651           0x81, 0x01,        /* MInput 0x01 (Const[0] Arr[1] Abs[2]) */
652 
653           /* 12th byte is for battery strength */
654           0x05, 0x06,        /* GUsagePage Generic Device Controls */
655           0x09, 0x20,        /* LUsage 0x20 [Battery Strength] */
656           0x14,              /* GLogicalMinimum [0] */
657           0x25, 0x05,        /* GLogicalMaximum 0x05 [5] */
658           0x75, 0x08,        /* GReportSize 0x08 [8] */
659           0x95, 0x01,        /* GReportCount 0x01 [1] */
660           0x81, 0x02,        /* MInput 0x02 (Data[0] Var[1] Abs[2]) */
661 
662           0xC0,              /* MEndCollection */
663 
664          0xC0                /* MEndCollection [Game Pad] */
665 };
666 
667 static const unsigned int ps3remote_keymap_joypad_buttons[] = {
668         [0x01] = KEY_SELECT,
669         [0x02] = BTN_THUMBL,            /* L3 */
670         [0x03] = BTN_THUMBR,            /* R3 */
671         [0x04] = BTN_START,
672         [0x05] = KEY_UP,
673         [0x06] = KEY_RIGHT,
674         [0x07] = KEY_DOWN,
675         [0x08] = KEY_LEFT,
676         [0x09] = BTN_TL2,               /* L2 */
677         [0x0a] = BTN_TR2,               /* R2 */
678         [0x0b] = BTN_TL,                /* L1 */
679         [0x0c] = BTN_TR,                /* R1 */
680         [0x0d] = KEY_OPTION,            /* options/triangle */
681         [0x0e] = KEY_BACK,              /* back/circle */
682         [0x0f] = BTN_0,                 /* cross */
683         [0x10] = KEY_SCREEN,            /* view/square */
684         [0x11] = KEY_HOMEPAGE,          /* PS button */
685         [0x14] = KEY_ENTER,
686 };
687 static const unsigned int ps3remote_keymap_remote_buttons[] = {
688         [0x00] = KEY_1,
689         [0x01] = KEY_2,
690         [0x02] = KEY_3,
691         [0x03] = KEY_4,
692         [0x04] = KEY_5,
693         [0x05] = KEY_6,
694         [0x06] = KEY_7,
695         [0x07] = KEY_8,
696         [0x08] = KEY_9,
697         [0x09] = KEY_0,
698         [0x0e] = KEY_ESC,               /* return */
699         [0x0f] = KEY_CLEAR,
700         [0x16] = KEY_EJECTCD,
701         [0x1a] = KEY_MENU,              /* top menu */
702         [0x28] = KEY_TIME,
703         [0x30] = KEY_PREVIOUS,
704         [0x31] = KEY_NEXT,
705         [0x32] = KEY_PLAY,
706         [0x33] = KEY_REWIND,            /* scan back */
707         [0x34] = KEY_FORWARD,           /* scan forward */
708         [0x38] = KEY_STOP,
709         [0x39] = KEY_PAUSE,
710         [0x40] = KEY_CONTEXT_MENU,      /* pop up/menu */
711         [0x60] = KEY_FRAMEBACK,         /* slow/step back */
712         [0x61] = KEY_FRAMEFORWARD,      /* slow/step forward */
713         [0x63] = KEY_SUBTITLE,
714         [0x64] = KEY_AUDIO,
715         [0x65] = KEY_ANGLE,
716         [0x70] = KEY_INFO,              /* display */
717         [0x80] = KEY_BLUE,
718         [0x81] = KEY_RED,
719         [0x82] = KEY_GREEN,
720         [0x83] = KEY_YELLOW,
721 };
722 
723 static const unsigned int buzz_keymap[] = {
724         /*
725          * The controller has 4 remote buzzers, each with one LED and 5
726          * buttons.
727          * 
728          * We use the mapping chosen by the controller, which is:
729          *
730          * Key          Offset
731          * -------------------
732          * Buzz              1
733          * Blue              5
734          * Orange            4
735          * Green             3
736          * Yellow            2
737          *
738          * So, for example, the orange button on the third buzzer is mapped to
739          * BTN_TRIGGER_HAPPY14
740          */
741         [ 1] = BTN_TRIGGER_HAPPY1,
742         [ 2] = BTN_TRIGGER_HAPPY2,
743         [ 3] = BTN_TRIGGER_HAPPY3,
744         [ 4] = BTN_TRIGGER_HAPPY4,
745         [ 5] = BTN_TRIGGER_HAPPY5,
746         [ 6] = BTN_TRIGGER_HAPPY6,
747         [ 7] = BTN_TRIGGER_HAPPY7,
748         [ 8] = BTN_TRIGGER_HAPPY8,
749         [ 9] = BTN_TRIGGER_HAPPY9,
750         [10] = BTN_TRIGGER_HAPPY10,
751         [11] = BTN_TRIGGER_HAPPY11,
752         [12] = BTN_TRIGGER_HAPPY12,
753         [13] = BTN_TRIGGER_HAPPY13,
754         [14] = BTN_TRIGGER_HAPPY14,
755         [15] = BTN_TRIGGER_HAPPY15,
756         [16] = BTN_TRIGGER_HAPPY16,
757         [17] = BTN_TRIGGER_HAPPY17,
758         [18] = BTN_TRIGGER_HAPPY18,
759         [19] = BTN_TRIGGER_HAPPY19,
760         [20] = BTN_TRIGGER_HAPPY20,
761 };
762 
763 static enum power_supply_property sony_battery_props[] = {
764         POWER_SUPPLY_PROP_PRESENT,
765         POWER_SUPPLY_PROP_CAPACITY,
766         POWER_SUPPLY_PROP_SCOPE,
767         POWER_SUPPLY_PROP_STATUS,
768 };
769 
770 struct sixaxis_led {
771         __u8 time_enabled; /* the total time the led is active (0xff means forever) */
772         __u8 duty_length;  /* how long a cycle is in deciseconds (0 means "really fast") */
773         __u8 enabled;
774         __u8 duty_off; /* % of duty_length the led is off (0xff means 100%) */
775         __u8 duty_on;  /* % of duty_length the led is on (0xff mean 100%) */
776 } __packed;
777 
778 struct sixaxis_rumble {
779         __u8 padding;
780         __u8 right_duration; /* Right motor duration (0xff means forever) */
781         __u8 right_motor_on; /* Right (small) motor on/off, only supports values of 0 or 1 (off/on) */
782         __u8 left_duration;    /* Left motor duration (0xff means forever) */
783         __u8 left_motor_force; /* left (large) motor, supports force values from 0 to 255 */
784 } __packed;
785 
786 struct sixaxis_output_report {
787         __u8 report_id;
788         struct sixaxis_rumble rumble;
789         __u8 padding[4];
790         __u8 leds_bitmap; /* bitmap of enabled LEDs: LED_1 = 0x02, LED_2 = 0x04, ... */
791         struct sixaxis_led led[4];    /* LEDx at (4 - x) */
792         struct sixaxis_led _reserved; /* LED5, not actually soldered */
793 } __packed;
794 
795 union sixaxis_output_report_01 {
796         struct sixaxis_output_report data;
797         __u8 buf[36];
798 };
799 
800 static spinlock_t sony_dev_list_lock;
801 static LIST_HEAD(sony_device_list);
802 static DEFINE_IDA(sony_device_id_allocator);
803 
804 struct sony_sc {
805         spinlock_t lock;
806         struct list_head list_node;
807         struct hid_device *hdev;
808         struct led_classdev *leds[MAX_LEDS];
809         unsigned long quirks;
810         struct work_struct state_worker;
811         struct power_supply battery;
812         int device_id;
813 
814 #ifdef CONFIG_SONY_FF
815         __u8 left;
816         __u8 right;
817 #endif
818 
819         __u8 mac_address[6];
820         __u8 worker_initialized;
821         __u8 cable_state;
822         __u8 battery_charging;
823         __u8 battery_capacity;
824         __u8 led_state[MAX_LEDS];
825         __u8 led_delay_on[MAX_LEDS];
826         __u8 led_delay_off[MAX_LEDS];
827         __u8 led_count;
828 };
829 
830 static __u8 *sixaxis_fixup(struct hid_device *hdev, __u8 *rdesc,
831                              unsigned int *rsize)
832 {
833         *rsize = sizeof(sixaxis_rdesc);
834         return sixaxis_rdesc;
835 }
836 
837 static __u8 *ps3remote_fixup(struct hid_device *hdev, __u8 *rdesc,
838                              unsigned int *rsize)
839 {
840         *rsize = sizeof(ps3remote_rdesc);
841         return ps3remote_rdesc;
842 }
843 
844 static int ps3remote_mapping(struct hid_device *hdev, struct hid_input *hi,
845                              struct hid_field *field, struct hid_usage *usage,
846                              unsigned long **bit, int *max)
847 {
848         unsigned int key = usage->hid & HID_USAGE;
849 
850         if ((usage->hid & HID_USAGE_PAGE) != HID_UP_BUTTON)
851                 return -1;
852 
853         switch (usage->collection_index) {
854         case 1:
855                 if (key >= ARRAY_SIZE(ps3remote_keymap_joypad_buttons))
856                         return -1;
857 
858                 key = ps3remote_keymap_joypad_buttons[key];
859                 if (!key)
860                         return -1;
861                 break;
862         case 2:
863                 if (key >= ARRAY_SIZE(ps3remote_keymap_remote_buttons))
864                         return -1;
865 
866                 key = ps3remote_keymap_remote_buttons[key];
867                 if (!key)
868                         return -1;
869                 break;
870         default:
871                 return -1;
872         }
873 
874         hid_map_usage_clear(hi, usage, bit, max, EV_KEY, key);
875         return 1;
876 }
877 
878 static __u8 *sony_report_fixup(struct hid_device *hdev, __u8 *rdesc,
879                 unsigned int *rsize)
880 {
881         struct sony_sc *sc = hid_get_drvdata(hdev);
882 
883         /*
884          * Some Sony RF receivers wrongly declare the mouse pointer as a
885          * a constant non-data variable.
886          */
887         if ((sc->quirks & VAIO_RDESC_CONSTANT) && *rsize >= 56 &&
888             /* usage page: generic desktop controls */
889             /* rdesc[0] == 0x05 && rdesc[1] == 0x01 && */
890             /* usage: mouse */
891             rdesc[2] == 0x09 && rdesc[3] == 0x02 &&
892             /* input (usage page for x,y axes): constant, variable, relative */
893             rdesc[54] == 0x81 && rdesc[55] == 0x07) {
894                 hid_info(hdev, "Fixing up Sony RF Receiver report descriptor\n");
895                 /* input: data, variable, relative */
896                 rdesc[55] = 0x06;
897         }
898 
899         /*
900          * The default Dualshock 4 USB descriptor doesn't assign
901          * the gyroscope values to corresponding axes so we need a
902          * modified one.
903          */
904         if ((sc->quirks & DUALSHOCK4_CONTROLLER_USB) && *rsize == 467) {
905                 hid_info(hdev, "Using modified Dualshock 4 report descriptor with gyroscope axes\n");
906                 rdesc = dualshock4_usb_rdesc;
907                 *rsize = sizeof(dualshock4_usb_rdesc);
908         } else if ((sc->quirks & DUALSHOCK4_CONTROLLER_BT) && *rsize == 357) {
909                 hid_info(hdev, "Using modified Dualshock 4 Bluetooth report descriptor\n");
910                 rdesc = dualshock4_bt_rdesc;
911                 *rsize = sizeof(dualshock4_bt_rdesc);
912         }
913 
914         if (sc->quirks & SIXAXIS_CONTROLLER)
915                 return sixaxis_fixup(hdev, rdesc, rsize);
916 
917         if (sc->quirks & PS3REMOTE)
918                 return ps3remote_fixup(hdev, rdesc, rsize);
919 
920         return rdesc;
921 }
922 
923 static void sixaxis_parse_report(struct sony_sc *sc, __u8 *rd, int size)
924 {
925         static const __u8 sixaxis_battery_capacity[] = { 0, 1, 25, 50, 75, 100 };
926         unsigned long flags;
927         __u8 cable_state, battery_capacity, battery_charging;
928 
929         /*
930          * The sixaxis is charging if the battery value is 0xee
931          * and it is fully charged if the value is 0xef.
932          * It does not report the actual level while charging so it
933          * is set to 100% while charging is in progress.
934          */
935         if (rd[30] >= 0xee) {
936                 battery_capacity = 100;
937                 battery_charging = !(rd[30] & 0x01);
938         } else {
939                 __u8 index = rd[30] <= 5 ? rd[30] : 5;
940                 battery_capacity = sixaxis_battery_capacity[index];
941                 battery_charging = 0;
942         }
943         cable_state = !(rd[31] & 0x04);
944 
945         spin_lock_irqsave(&sc->lock, flags);
946         sc->cable_state = cable_state;
947         sc->battery_capacity = battery_capacity;
948         sc->battery_charging = battery_charging;
949         spin_unlock_irqrestore(&sc->lock, flags);
950 }
951 
952 static void dualshock4_parse_report(struct sony_sc *sc, __u8 *rd, int size)
953 {
954         struct hid_input *hidinput = list_entry(sc->hdev->inputs.next,
955                                                 struct hid_input, list);
956         struct input_dev *input_dev = hidinput->input;
957         unsigned long flags;
958         int n, offset;
959         __u8 cable_state, battery_capacity, battery_charging;
960 
961         /*
962          * Battery and touchpad data starts at byte 30 in the USB report and
963          * 32 in Bluetooth report.
964          */
965         offset = (sc->quirks & DUALSHOCK4_CONTROLLER_USB) ? 30 : 32;
966 
967         /*
968          * The lower 4 bits of byte 30 contain the battery level
969          * and the 5th bit contains the USB cable state.
970          */
971         cable_state = (rd[offset] >> 4) & 0x01;
972         battery_capacity = rd[offset] & 0x0F;
973 
974         /*
975          * When a USB power source is connected the battery level ranges from
976          * 0 to 10, and when running on battery power it ranges from 0 to 9.
977          * A battery level above 10 when plugged in means charge completed.
978          */
979         if (!cable_state || battery_capacity > 10)
980                 battery_charging = 0;
981         else
982                 battery_charging = 1;
983 
984         if (!cable_state)
985                 battery_capacity++;
986         if (battery_capacity > 10)
987                 battery_capacity = 10;
988 
989         battery_capacity *= 10;
990 
991         spin_lock_irqsave(&sc->lock, flags);
992         sc->cable_state = cable_state;
993         sc->battery_capacity = battery_capacity;
994         sc->battery_charging = battery_charging;
995         spin_unlock_irqrestore(&sc->lock, flags);
996 
997         offset += 5;
998 
999         /*
1000          * The Dualshock 4 multi-touch trackpad data starts at offset 35 on USB
1001          * and 37 on Bluetooth.
1002          * The first 7 bits of the first byte is a counter and bit 8 is a touch
1003          * indicator that is 0 when pressed and 1 when not pressed.
1004          * The next 3 bytes are two 12 bit touch coordinates, X and Y.
1005          * The data for the second touch is in the same format and immediatly
1006          * follows the data for the first.
1007          */
1008         for (n = 0; n < 2; n++) {
1009                 __u16 x, y;
1010 
1011                 x = rd[offset+1] | ((rd[offset+2] & 0xF) << 8);
1012                 y = ((rd[offset+2] & 0xF0) >> 4) | (rd[offset+3] << 4);
1013 
1014                 input_mt_slot(input_dev, n);
1015                 input_mt_report_slot_state(input_dev, MT_TOOL_FINGER,
1016                                         !(rd[offset] >> 7));
1017                 input_report_abs(input_dev, ABS_MT_POSITION_X, x);
1018                 input_report_abs(input_dev, ABS_MT_POSITION_Y, y);
1019 
1020                 offset += 4;
1021         }
1022 }
1023 
1024 static int sony_raw_event(struct hid_device *hdev, struct hid_report *report,
1025                 __u8 *rd, int size)
1026 {
1027         struct sony_sc *sc = hid_get_drvdata(hdev);
1028 
1029         /*
1030          * Sixaxis HID report has acclerometers/gyro with MSByte first, this
1031          * has to be BYTE_SWAPPED before passing up to joystick interface
1032          */
1033         if ((sc->quirks & SIXAXIS_CONTROLLER) && rd[0] == 0x01 && size == 49) {
1034                 swap(rd[41], rd[42]);
1035                 swap(rd[43], rd[44]);
1036                 swap(rd[45], rd[46]);
1037                 swap(rd[47], rd[48]);
1038 
1039                 sixaxis_parse_report(sc, rd, size);
1040         } else if (((sc->quirks & DUALSHOCK4_CONTROLLER_USB) && rd[0] == 0x01 &&
1041                         size == 64) || ((sc->quirks & DUALSHOCK4_CONTROLLER_BT)
1042                         && rd[0] == 0x11 && size == 78)) {
1043                 dualshock4_parse_report(sc, rd, size);
1044         }
1045 
1046         return 0;
1047 }
1048 
1049 static int sony_mapping(struct hid_device *hdev, struct hid_input *hi,
1050                         struct hid_field *field, struct hid_usage *usage,
1051                         unsigned long **bit, int *max)
1052 {
1053         struct sony_sc *sc = hid_get_drvdata(hdev);
1054 
1055         if (sc->quirks & BUZZ_CONTROLLER) {
1056                 unsigned int key = usage->hid & HID_USAGE;
1057 
1058                 if ((usage->hid & HID_USAGE_PAGE) != HID_UP_BUTTON)
1059                         return -1;
1060 
1061                 switch (usage->collection_index) {
1062                 case 1:
1063                         if (key >= ARRAY_SIZE(buzz_keymap))
1064                                 return -1;
1065 
1066                         key = buzz_keymap[key];
1067                         if (!key)
1068                                 return -1;
1069                         break;
1070                 default:
1071                         return -1;
1072                 }
1073 
1074                 hid_map_usage_clear(hi, usage, bit, max, EV_KEY, key);
1075                 return 1;
1076         }
1077 
1078         if (sc->quirks & PS3REMOTE)
1079                 return ps3remote_mapping(hdev, hi, field, usage, bit, max);
1080 
1081         /* Let hid-core decide for the others */
1082         return 0;
1083 }
1084 
1085 /*
1086  * Sending HID_REQ_GET_REPORT changes the operation mode of the ps3 controller
1087  * to "operational".  Without this, the ps3 controller will not report any
1088  * events.
1089  */
1090 static int sixaxis_set_operational_usb(struct hid_device *hdev)
1091 {
1092         int ret;
1093         char *buf = kmalloc(18, GFP_KERNEL);
1094 
1095         if (!buf)
1096                 return -ENOMEM;
1097 
1098         ret = hid_hw_raw_request(hdev, 0xf2, buf, 17, HID_FEATURE_REPORT,
1099                                  HID_REQ_GET_REPORT);
1100 
1101         if (ret < 0)
1102                 hid_err(hdev, "can't set operational mode\n");
1103 
1104         kfree(buf);
1105 
1106         return ret;
1107 }
1108 
1109 static int sixaxis_set_operational_bt(struct hid_device *hdev)
1110 {
1111         unsigned char buf[] = { 0xf4,  0x42, 0x03, 0x00, 0x00 };
1112         return hid_hw_raw_request(hdev, buf[0], buf, sizeof(buf),
1113                                   HID_FEATURE_REPORT, HID_REQ_SET_REPORT);
1114 }
1115 
1116 /*
1117  * Requesting feature report 0x02 in Bluetooth mode changes the state of the
1118  * controller so that it sends full input reports of type 0x11.
1119  */
1120 static int dualshock4_set_operational_bt(struct hid_device *hdev)
1121 {
1122         __u8 buf[37] = { 0 };
1123 
1124         return hid_hw_raw_request(hdev, 0x02, buf, sizeof(buf),
1125                                 HID_FEATURE_REPORT, HID_REQ_GET_REPORT);
1126 }
1127 
1128 static void sixaxis_set_leds_from_id(int id, __u8 values[MAX_LEDS])
1129 {
1130         static const __u8 sixaxis_leds[10][4] = {
1131                                 { 0x01, 0x00, 0x00, 0x00 },
1132                                 { 0x00, 0x01, 0x00, 0x00 },
1133                                 { 0x00, 0x00, 0x01, 0x00 },
1134                                 { 0x00, 0x00, 0x00, 0x01 },
1135                                 { 0x01, 0x00, 0x00, 0x01 },
1136                                 { 0x00, 0x01, 0x00, 0x01 },
1137                                 { 0x00, 0x00, 0x01, 0x01 },
1138                                 { 0x01, 0x00, 0x01, 0x01 },
1139                                 { 0x00, 0x01, 0x01, 0x01 },
1140                                 { 0x01, 0x01, 0x01, 0x01 }
1141         };
1142 
1143         BUG_ON(MAX_LEDS < ARRAY_SIZE(sixaxis_leds[0]));
1144 
1145         if (id < 0)
1146                 return;
1147 
1148         id %= 10;
1149         memcpy(values, sixaxis_leds[id], sizeof(sixaxis_leds[id]));
1150 }
1151 
1152 static void dualshock4_set_leds_from_id(int id, __u8 values[MAX_LEDS])
1153 {
1154         /* The first 4 color/index entries match what the PS4 assigns */
1155         static const __u8 color_code[7][3] = {
1156                         /* Blue   */    { 0x00, 0x00, 0x01 },
1157                         /* Red    */    { 0x01, 0x00, 0x00 },
1158                         /* Green  */    { 0x00, 0x01, 0x00 },
1159                         /* Pink   */    { 0x02, 0x00, 0x01 },
1160                         /* Orange */    { 0x02, 0x01, 0x00 },
1161                         /* Teal   */    { 0x00, 0x01, 0x01 },
1162                         /* White  */    { 0x01, 0x01, 0x01 }
1163         };
1164 
1165         BUG_ON(MAX_LEDS < ARRAY_SIZE(color_code[0]));
1166 
1167         if (id < 0)
1168                 return;
1169 
1170         id %= 7;
1171         memcpy(values, color_code[id], sizeof(color_code[id]));
1172 }
1173 
1174 static void buzz_set_leds(struct hid_device *hdev, const __u8 *leds)
1175 {
1176         struct list_head *report_list =
1177                 &hdev->report_enum[HID_OUTPUT_REPORT].report_list;
1178         struct hid_report *report = list_entry(report_list->next,
1179                 struct hid_report, list);
1180         __s32 *value = report->field[0]->value;
1181 
1182         value[0] = 0x00;
1183         value[1] = leds[0] ? 0xff : 0x00;
1184         value[2] = leds[1] ? 0xff : 0x00;
1185         value[3] = leds[2] ? 0xff : 0x00;
1186         value[4] = leds[3] ? 0xff : 0x00;
1187         value[5] = 0x00;
1188         value[6] = 0x00;
1189         hid_hw_request(hdev, report, HID_REQ_SET_REPORT);
1190 }
1191 
1192 static void sony_set_leds(struct sony_sc *sc, const __u8 *leds, int count)
1193 {
1194         int n;
1195 
1196         BUG_ON(count > MAX_LEDS);
1197 
1198         if (sc->quirks & BUZZ_CONTROLLER && count == 4) {
1199                 buzz_set_leds(sc->hdev, leds);
1200         } else {
1201                 for (n = 0; n < count; n++)
1202                         sc->led_state[n] = leds[n];
1203                 schedule_work(&sc->state_worker);
1204         }
1205 }
1206 
1207 static void sony_led_set_brightness(struct led_classdev *led,
1208                                     enum led_brightness value)
1209 {
1210         struct device *dev = led->dev->parent;
1211         struct hid_device *hdev = container_of(dev, struct hid_device, dev);
1212         struct sony_sc *drv_data;
1213 
1214         int n;
1215         int force_update;
1216 
1217         drv_data = hid_get_drvdata(hdev);
1218         if (!drv_data) {
1219                 hid_err(hdev, "No device data\n");
1220                 return;
1221         }
1222 
1223         /*
1224          * The Sixaxis on USB will override any LED settings sent to it
1225          * and keep flashing all of the LEDs until the PS button is pressed.
1226          * Updates, even if redundant, must be always be sent to the
1227          * controller to avoid having to toggle the state of an LED just to
1228          * stop the flashing later on.
1229          */
1230         force_update = !!(drv_data->quirks & SIXAXIS_CONTROLLER_USB);
1231 
1232         for (n = 0; n < drv_data->led_count; n++) {
1233                 if (led == drv_data->leds[n] && (force_update ||
1234                         (value != drv_data->led_state[n] ||
1235                         drv_data->led_delay_on[n] ||
1236                         drv_data->led_delay_off[n]))) {
1237 
1238                         drv_data->led_state[n] = value;
1239 
1240                         /* Setting the brightness stops the blinking */
1241                         drv_data->led_delay_on[n] = 0;
1242                         drv_data->led_delay_off[n] = 0;
1243 
1244                         sony_set_leds(drv_data, drv_data->led_state,
1245                                         drv_data->led_count);
1246                         break;
1247                 }
1248         }
1249 }
1250 
1251 static enum led_brightness sony_led_get_brightness(struct led_classdev *led)
1252 {
1253         struct device *dev = led->dev->parent;
1254         struct hid_device *hdev = container_of(dev, struct hid_device, dev);
1255         struct sony_sc *drv_data;
1256 
1257         int n;
1258 
1259         drv_data = hid_get_drvdata(hdev);
1260         if (!drv_data) {
1261                 hid_err(hdev, "No device data\n");
1262                 return LED_OFF;
1263         }
1264 
1265         for (n = 0; n < drv_data->led_count; n++) {
1266                 if (led == drv_data->leds[n])
1267                         return drv_data->led_state[n];
1268         }
1269 
1270         return LED_OFF;
1271 }
1272 
1273 static int sony_led_blink_set(struct led_classdev *led, unsigned long *delay_on,
1274                                 unsigned long *delay_off)
1275 {
1276         struct device *dev = led->dev->parent;
1277         struct hid_device *hdev = container_of(dev, struct hid_device, dev);
1278         struct sony_sc *drv_data = hid_get_drvdata(hdev);
1279         int n;
1280         __u8 new_on, new_off;
1281 
1282         if (!drv_data) {
1283                 hid_err(hdev, "No device data\n");
1284                 return -EINVAL;
1285         }
1286 
1287         /* Max delay is 255 deciseconds or 2550 milliseconds */
1288         if (*delay_on > 2550)
1289                 *delay_on = 2550;
1290         if (*delay_off > 2550)
1291                 *delay_off = 2550;
1292 
1293         /* Blink at 1 Hz if both values are zero */
1294         if (!*delay_on && !*delay_off)
1295                 *delay_on = *delay_off = 500;
1296 
1297         new_on = *delay_on / 10;
1298         new_off = *delay_off / 10;
1299 
1300         for (n = 0; n < drv_data->led_count; n++) {
1301                 if (led == drv_data->leds[n])
1302                         break;
1303         }
1304 
1305         /* This LED is not registered on this device */
1306         if (n >= drv_data->led_count)
1307                 return -EINVAL;
1308 
1309         /* Don't schedule work if the values didn't change */
1310         if (new_on != drv_data->led_delay_on[n] ||
1311                 new_off != drv_data->led_delay_off[n]) {
1312                 drv_data->led_delay_on[n] = new_on;
1313                 drv_data->led_delay_off[n] = new_off;
1314                 schedule_work(&drv_data->state_worker);
1315         }
1316 
1317         return 0;
1318 }
1319 
1320 static void sony_leds_remove(struct sony_sc *sc)
1321 {
1322         struct led_classdev *led;
1323         int n;
1324 
1325         BUG_ON(!(sc->quirks & SONY_LED_SUPPORT));
1326 
1327         for (n = 0; n < sc->led_count; n++) {
1328                 led = sc->leds[n];
1329                 sc->leds[n] = NULL;
1330                 if (!led)
1331                         continue;
1332                 led_classdev_unregister(led);
1333                 kfree(led);
1334         }
1335 
1336         sc->led_count = 0;
1337 }
1338 
1339 static int sony_leds_init(struct sony_sc *sc)
1340 {
1341         struct hid_device *hdev = sc->hdev;
1342         int n, ret = 0;
1343         int use_ds4_names;
1344         struct led_classdev *led;
1345         size_t name_sz;
1346         char *name;
1347         size_t name_len;
1348         const char *name_fmt;
1349         static const char * const ds4_name_str[] = { "red", "green", "blue",
1350                                                   "global" };
1351         __u8 initial_values[MAX_LEDS] = { 0 };
1352         __u8 max_brightness[MAX_LEDS] = { [0 ... (MAX_LEDS - 1)] = 1 };
1353         __u8 use_hw_blink[MAX_LEDS] = { 0 };
1354 
1355         BUG_ON(!(sc->quirks & SONY_LED_SUPPORT));
1356 
1357         if (sc->quirks & BUZZ_CONTROLLER) {
1358                 sc->led_count = 4;
1359                 use_ds4_names = 0;
1360                 name_len = strlen("::buzz#");
1361                 name_fmt = "%s::buzz%d";
1362                 /* Validate expected report characteristics. */
1363                 if (!hid_validate_values(hdev, HID_OUTPUT_REPORT, 0, 0, 7))
1364                         return -ENODEV;
1365         } else if (sc->quirks & DUALSHOCK4_CONTROLLER) {
1366                 dualshock4_set_leds_from_id(sc->device_id, initial_values);
1367                 initial_values[3] = 1;
1368                 sc->led_count = 4;
1369                 memset(max_brightness, 255, 3);
1370                 use_hw_blink[3] = 1;
1371                 use_ds4_names = 1;
1372                 name_len = 0;
1373                 name_fmt = "%s:%s";
1374         } else {
1375                 sixaxis_set_leds_from_id(sc->device_id, initial_values);
1376                 sc->led_count = 4;
1377                 memset(use_hw_blink, 1, 4);
1378                 use_ds4_names = 0;
1379                 name_len = strlen("::sony#");
1380                 name_fmt = "%s::sony%d";
1381         }
1382 
1383         /*
1384          * Clear LEDs as we have no way of reading their initial state. This is
1385          * only relevant if the driver is loaded after somebody actively set the
1386          * LEDs to on
1387          */
1388         sony_set_leds(sc, initial_values, sc->led_count);
1389 
1390         name_sz = strlen(dev_name(&hdev->dev)) + name_len + 1;
1391 
1392         for (n = 0; n < sc->led_count; n++) {
1393 
1394                 if (use_ds4_names)
1395                         name_sz = strlen(dev_name(&hdev->dev)) + strlen(ds4_name_str[n]) + 2;
1396 
1397                 led = kzalloc(sizeof(struct led_classdev) + name_sz, GFP_KERNEL);
1398                 if (!led) {
1399                         hid_err(hdev, "Couldn't allocate memory for LED %d\n", n);
1400                         ret = -ENOMEM;
1401                         goto error_leds;
1402                 }
1403 
1404                 name = (void *)(&led[1]);
1405                 if (use_ds4_names)
1406                         snprintf(name, name_sz, name_fmt, dev_name(&hdev->dev),
1407                         ds4_name_str[n]);
1408                 else
1409                         snprintf(name, name_sz, name_fmt, dev_name(&hdev->dev), n + 1);
1410                 led->name = name;
1411                 led->brightness = initial_values[n];
1412                 led->max_brightness = max_brightness[n];
1413                 led->brightness_get = sony_led_get_brightness;
1414                 led->brightness_set = sony_led_set_brightness;
1415 
1416                 if (use_hw_blink[n])
1417                         led->blink_set = sony_led_blink_set;
1418 
1419                 sc->leds[n] = led;
1420 
1421                 ret = led_classdev_register(&hdev->dev, led);
1422                 if (ret) {
1423                         hid_err(hdev, "Failed to register LED %d\n", n);
1424                         sc->leds[n] = NULL;
1425                         kfree(led);
1426                         goto error_leds;
1427                 }
1428         }
1429 
1430         return ret;
1431 
1432 error_leds:
1433         sony_leds_remove(sc);
1434 
1435         return ret;
1436 }
1437 
1438 static void sixaxis_state_worker(struct work_struct *work)
1439 {
1440         struct sony_sc *sc = container_of(work, struct sony_sc, state_worker);
1441         int n;
1442         union sixaxis_output_report_01 report = {
1443                 .buf = {
1444                         0x01,
1445                         0x00, 0xff, 0x00, 0xff, 0x00,
1446                         0x00, 0x00, 0x00, 0x00, 0x00,
1447                         0xff, 0x27, 0x10, 0x00, 0x32,
1448                         0xff, 0x27, 0x10, 0x00, 0x32,
1449                         0xff, 0x27, 0x10, 0x00, 0x32,
1450                         0xff, 0x27, 0x10, 0x00, 0x32,
1451                         0x00, 0x00, 0x00, 0x00, 0x00
1452                 }
1453         };
1454 
1455 #ifdef CONFIG_SONY_FF
1456         report.data.rumble.right_motor_on = sc->right ? 1 : 0;
1457         report.data.rumble.left_motor_force = sc->left;
1458 #endif
1459 
1460         report.data.leds_bitmap |= sc->led_state[0] << 1;
1461         report.data.leds_bitmap |= sc->led_state[1] << 2;
1462         report.data.leds_bitmap |= sc->led_state[2] << 3;
1463         report.data.leds_bitmap |= sc->led_state[3] << 4;
1464 
1465         /* Set flag for all leds off, required for 3rd party INTEC controller */
1466         if ((report.data.leds_bitmap & 0x1E) == 0)
1467                 report.data.leds_bitmap |= 0x20;
1468 
1469         /*
1470          * The LEDs in the report are indexed in reverse order to their
1471          * corresponding light on the controller.
1472          * Index 0 = LED 4, index 1 = LED 3, etc...
1473          *
1474          * In the case of both delay values being zero (blinking disabled) the
1475          * default report values should be used or the controller LED will be
1476          * always off.
1477          */
1478         for (n = 0; n < 4; n++) {
1479                 if (sc->led_delay_on[n] || sc->led_delay_off[n]) {
1480                         report.data.led[3 - n].duty_off = sc->led_delay_off[n];
1481                         report.data.led[3 - n].duty_on = sc->led_delay_on[n];
1482                 }
1483         }
1484 
1485         hid_hw_raw_request(sc->hdev, report.data.report_id, report.buf,
1486                         sizeof(report), HID_OUTPUT_REPORT, HID_REQ_SET_REPORT);
1487 }
1488 
1489 static void dualshock4_state_worker(struct work_struct *work)
1490 {
1491         struct sony_sc *sc = container_of(work, struct sony_sc, state_worker);
1492         struct hid_device *hdev = sc->hdev;
1493         int offset;
1494 
1495         __u8 buf[78] = { 0 };
1496 
1497         if (sc->quirks & DUALSHOCK4_CONTROLLER_USB) {
1498                 buf[0] = 0x05;
1499                 buf[1] = 0xFF;
1500                 offset = 4;
1501         } else {
1502                 buf[0] = 0x11;
1503                 buf[1] = 0xB0;
1504                 buf[3] = 0x0F;
1505                 offset = 6;
1506         }
1507 
1508 #ifdef CONFIG_SONY_FF
1509         buf[offset++] = sc->right;
1510         buf[offset++] = sc->left;
1511 #else
1512         offset += 2;
1513 #endif
1514 
1515         /* LED 3 is the global control */
1516         if (sc->led_state[3]) {
1517                 buf[offset++] = sc->led_state[0];
1518                 buf[offset++] = sc->led_state[1];
1519                 buf[offset++] = sc->led_state[2];
1520         } else {
1521                 offset += 3;
1522         }
1523 
1524         /* If both delay values are zero the DualShock 4 disables blinking. */
1525         buf[offset++] = sc->led_delay_on[3];
1526         buf[offset++] = sc->led_delay_off[3];
1527 
1528         if (sc->quirks & DUALSHOCK4_CONTROLLER_USB)
1529                 hid_hw_output_report(hdev, buf, 32);
1530         else
1531                 hid_hw_raw_request(hdev, 0x11, buf, 78,
1532                                 HID_OUTPUT_REPORT, HID_REQ_SET_REPORT);
1533 }
1534 
1535 #ifdef CONFIG_SONY_FF
1536 static int sony_play_effect(struct input_dev *dev, void *data,
1537                             struct ff_effect *effect)
1538 {
1539         struct hid_device *hid = input_get_drvdata(dev);
1540         struct sony_sc *sc = hid_get_drvdata(hid);
1541 
1542         if (effect->type != FF_RUMBLE)
1543                 return 0;
1544 
1545         sc->left = effect->u.rumble.strong_magnitude / 256;
1546         sc->right = effect->u.rumble.weak_magnitude / 256;
1547 
1548         schedule_work(&sc->state_worker);
1549         return 0;
1550 }
1551 
1552 static int sony_init_ff(struct sony_sc *sc)
1553 {
1554         struct hid_input *hidinput = list_entry(sc->hdev->inputs.next,
1555                                                 struct hid_input, list);
1556         struct input_dev *input_dev = hidinput->input;
1557 
1558         input_set_capability(input_dev, EV_FF, FF_RUMBLE);
1559         return input_ff_create_memless(input_dev, NULL, sony_play_effect);
1560 }
1561 
1562 #else
1563 static int sony_init_ff(struct sony_sc *sc)
1564 {
1565         return 0;
1566 }
1567 
1568 #endif
1569 
1570 static int sony_battery_get_property(struct power_supply *psy,
1571                                      enum power_supply_property psp,
1572                                      union power_supply_propval *val)
1573 {
1574         struct sony_sc *sc = container_of(psy, struct sony_sc, battery);
1575         unsigned long flags;
1576         int ret = 0;
1577         u8 battery_charging, battery_capacity, cable_state;
1578 
1579         spin_lock_irqsave(&sc->lock, flags);
1580         battery_charging = sc->battery_charging;
1581         battery_capacity = sc->battery_capacity;
1582         cable_state = sc->cable_state;
1583         spin_unlock_irqrestore(&sc->lock, flags);
1584 
1585         switch (psp) {
1586         case POWER_SUPPLY_PROP_PRESENT:
1587                 val->intval = 1;
1588                 break;
1589         case POWER_SUPPLY_PROP_SCOPE:
1590                 val->intval = POWER_SUPPLY_SCOPE_DEVICE;
1591                 break;
1592         case POWER_SUPPLY_PROP_CAPACITY:
1593                 val->intval = battery_capacity;
1594                 break;
1595         case POWER_SUPPLY_PROP_STATUS:
1596                 if (battery_charging)
1597                         val->intval = POWER_SUPPLY_STATUS_CHARGING;
1598                 else
1599                         if (battery_capacity == 100 && cable_state)
1600                                 val->intval = POWER_SUPPLY_STATUS_FULL;
1601                         else
1602                                 val->intval = POWER_SUPPLY_STATUS_DISCHARGING;
1603                 break;
1604         default:
1605                 ret = -EINVAL;
1606                 break;
1607         }
1608         return ret;
1609 }
1610 
1611 static int sony_battery_probe(struct sony_sc *sc)
1612 {
1613         struct hid_device *hdev = sc->hdev;
1614         int ret;
1615 
1616         /*
1617          * Set the default battery level to 100% to avoid low battery warnings
1618          * if the battery is polled before the first device report is received.
1619          */
1620         sc->battery_capacity = 100;
1621 
1622         sc->battery.properties = sony_battery_props;
1623         sc->battery.num_properties = ARRAY_SIZE(sony_battery_props);
1624         sc->battery.get_property = sony_battery_get_property;
1625         sc->battery.type = POWER_SUPPLY_TYPE_BATTERY;
1626         sc->battery.use_for_apm = 0;
1627         sc->battery.name = kasprintf(GFP_KERNEL, "sony_controller_battery_%pMR",
1628                                      sc->mac_address);
1629         if (!sc->battery.name)
1630                 return -ENOMEM;
1631 
1632         ret = power_supply_register(&hdev->dev, &sc->battery);
1633         if (ret) {
1634                 hid_err(hdev, "Unable to register battery device\n");
1635                 goto err_free;
1636         }
1637 
1638         power_supply_powers(&sc->battery, &hdev->dev);
1639         return 0;
1640 
1641 err_free:
1642         kfree(sc->battery.name);
1643         sc->battery.name = NULL;
1644         return ret;
1645 }
1646 
1647 static void sony_battery_remove(struct sony_sc *sc)
1648 {
1649         if (!sc->battery.name)
1650                 return;
1651 
1652         power_supply_unregister(&sc->battery);
1653         kfree(sc->battery.name);
1654         sc->battery.name = NULL;
1655 }
1656 
1657 static int sony_register_touchpad(struct sony_sc *sc, int touch_count,
1658                                         int w, int h)
1659 {
1660         struct hid_input *hidinput = list_entry(sc->hdev->inputs.next,
1661                                                 struct hid_input, list);
1662         struct input_dev *input_dev = hidinput->input;
1663         int ret;
1664 
1665         ret = input_mt_init_slots(input_dev, touch_count, 0);
1666         if (ret < 0) {
1667                 hid_err(sc->hdev, "Unable to initialize multi-touch slots\n");
1668                 return ret;
1669         }
1670 
1671         input_set_abs_params(input_dev, ABS_MT_POSITION_X, 0, w, 0, 0);
1672         input_set_abs_params(input_dev, ABS_MT_POSITION_Y, 0, h, 0, 0);
1673 
1674         return 0;
1675 }
1676 
1677 /*
1678  * If a controller is plugged in via USB while already connected via Bluetooth
1679  * it will show up as two devices. A global list of connected controllers and
1680  * their MAC addresses is maintained to ensure that a device is only connected
1681  * once.
1682  */
1683 static int sony_check_add_dev_list(struct sony_sc *sc)
1684 {
1685         struct sony_sc *entry;
1686         unsigned long flags;
1687         int ret;
1688 
1689         spin_lock_irqsave(&sony_dev_list_lock, flags);
1690 
1691         list_for_each_entry(entry, &sony_device_list, list_node) {
1692                 ret = memcmp(sc->mac_address, entry->mac_address,
1693                                 sizeof(sc->mac_address));
1694                 if (!ret) {
1695                         ret = -EEXIST;
1696                         hid_info(sc->hdev, "controller with MAC address %pMR already connected\n",
1697                                 sc->mac_address);
1698                         goto unlock;
1699                 }
1700         }
1701 
1702         ret = 0;
1703         list_add(&(sc->list_node), &sony_device_list);
1704 
1705 unlock:
1706         spin_unlock_irqrestore(&sony_dev_list_lock, flags);
1707         return ret;
1708 }
1709 
1710 static void sony_remove_dev_list(struct sony_sc *sc)
1711 {
1712         unsigned long flags;
1713 
1714         if (sc->list_node.next) {
1715                 spin_lock_irqsave(&sony_dev_list_lock, flags);
1716                 list_del(&(sc->list_node));
1717                 spin_unlock_irqrestore(&sony_dev_list_lock, flags);
1718         }
1719 }
1720 
1721 static int sony_get_bt_devaddr(struct sony_sc *sc)
1722 {
1723         int ret;
1724 
1725         /* HIDP stores the device MAC address as a string in the uniq field. */
1726         ret = strlen(sc->hdev->uniq);
1727         if (ret != 17)
1728                 return -EINVAL;
1729 
1730         ret = sscanf(sc->hdev->uniq,
1731                 "%02hhx:%02hhx:%02hhx:%02hhx:%02hhx:%02hhx",
1732                 &sc->mac_address[5], &sc->mac_address[4], &sc->mac_address[3],
1733                 &sc->mac_address[2], &sc->mac_address[1], &sc->mac_address[0]);
1734 
1735         if (ret != 6)
1736                 return -EINVAL;
1737 
1738         return 0;
1739 }
1740 
1741 static int sony_check_add(struct sony_sc *sc)
1742 {
1743         int n, ret;
1744 
1745         if ((sc->quirks & DUALSHOCK4_CONTROLLER_BT) ||
1746             (sc->quirks & SIXAXIS_CONTROLLER_BT)) {
1747                 /*
1748                  * sony_get_bt_devaddr() attempts to parse the Bluetooth MAC
1749                  * address from the uniq string where HIDP stores it.
1750                  * As uniq cannot be guaranteed to be a MAC address in all cases
1751                  * a failure of this function should not prevent the connection.
1752                  */
1753                 if (sony_get_bt_devaddr(sc) < 0) {
1754                         hid_warn(sc->hdev, "UNIQ does not contain a MAC address; duplicate check skipped\n");
1755                         return 0;
1756                 }
1757         } else if (sc->quirks & DUALSHOCK4_CONTROLLER_USB) {
1758                 __u8 buf[7];
1759 
1760                 /*
1761                  * The MAC address of a DS4 controller connected via USB can be
1762                  * retrieved with feature report 0x81. The address begins at
1763                  * offset 1.
1764                  */
1765                 ret = hid_hw_raw_request(sc->hdev, 0x81, buf, sizeof(buf),
1766                                 HID_FEATURE_REPORT, HID_REQ_GET_REPORT);
1767 
1768                 if (ret != 7) {
1769                         hid_err(sc->hdev, "failed to retrieve feature report 0x81 with the DualShock 4 MAC address\n");
1770                         return ret < 0 ? ret : -EINVAL;
1771                 }
1772 
1773                 memcpy(sc->mac_address, &buf[1], sizeof(sc->mac_address));
1774         } else if (sc->quirks & SIXAXIS_CONTROLLER_USB) {
1775                 __u8 buf[18];
1776 
1777                 /*
1778                  * The MAC address of a Sixaxis controller connected via USB can
1779                  * be retrieved with feature report 0xf2. The address begins at
1780                  * offset 4.
1781                  */
1782                 ret = hid_hw_raw_request(sc->hdev, 0xf2, buf, sizeof(buf),
1783                                 HID_FEATURE_REPORT, HID_REQ_GET_REPORT);
1784 
1785                 if (ret != 18) {
1786                         hid_err(sc->hdev, "failed to retrieve feature report 0xf2 with the Sixaxis MAC address\n");
1787                         return ret < 0 ? ret : -EINVAL;
1788                 }
1789 
1790                 /*
1791                  * The Sixaxis device MAC in the report is big-endian and must
1792                  * be byte-swapped.
1793                  */
1794                 for (n = 0; n < 6; n++)
1795                         sc->mac_address[5-n] = buf[4+n];
1796         } else {
1797                 return 0;
1798         }
1799 
1800         return sony_check_add_dev_list(sc);
1801 }
1802 
1803 static int sony_set_device_id(struct sony_sc *sc)
1804 {
1805         int ret;
1806 
1807         /*
1808          * Only DualShock 4 or Sixaxis controllers get an id.
1809          * All others are set to -1.
1810          */
1811         if ((sc->quirks & SIXAXIS_CONTROLLER) ||
1812             (sc->quirks & DUALSHOCK4_CONTROLLER)) {
1813                 ret = ida_simple_get(&sony_device_id_allocator, 0, 0,
1814                                         GFP_KERNEL);
1815                 if (ret < 0) {
1816                         sc->device_id = -1;
1817                         return ret;
1818                 }
1819                 sc->device_id = ret;
1820         } else {
1821                 sc->device_id = -1;
1822         }
1823 
1824         return 0;
1825 }
1826 
1827 static void sony_release_device_id(struct sony_sc *sc)
1828 {
1829         if (sc->device_id >= 0) {
1830                 ida_simple_remove(&sony_device_id_allocator, sc->device_id);
1831                 sc->device_id = -1;
1832         }
1833 }
1834 
1835 static inline void sony_init_work(struct sony_sc *sc,
1836                                         void (*worker)(struct work_struct *))
1837 {
1838         if (!sc->worker_initialized)
1839                 INIT_WORK(&sc->state_worker, worker);
1840 
1841         sc->worker_initialized = 1;
1842 }
1843 
1844 static inline void sony_cancel_work_sync(struct sony_sc *sc)
1845 {
1846         if (sc->worker_initialized)
1847                 cancel_work_sync(&sc->state_worker);
1848 }
1849 
1850 static int sony_probe(struct hid_device *hdev, const struct hid_device_id *id)
1851 {
1852         int ret;
1853         unsigned long quirks = id->driver_data;
1854         struct sony_sc *sc;
1855         unsigned int connect_mask = HID_CONNECT_DEFAULT;
1856 
1857         sc = devm_kzalloc(&hdev->dev, sizeof(*sc), GFP_KERNEL);
1858         if (sc == NULL) {
1859                 hid_err(hdev, "can't alloc sony descriptor\n");
1860                 return -ENOMEM;
1861         }
1862 
1863         sc->quirks = quirks;
1864         hid_set_drvdata(hdev, sc);
1865         sc->hdev = hdev;
1866 
1867         ret = hid_parse(hdev);
1868         if (ret) {
1869                 hid_err(hdev, "parse failed\n");
1870                 return ret;
1871         }
1872 
1873         if (sc->quirks & VAIO_RDESC_CONSTANT)
1874                 connect_mask |= HID_CONNECT_HIDDEV_FORCE;
1875         else if (sc->quirks & SIXAXIS_CONTROLLER)
1876                 connect_mask |= HID_CONNECT_HIDDEV_FORCE;
1877 
1878         ret = hid_hw_start(hdev, connect_mask);
1879         if (ret) {
1880                 hid_err(hdev, "hw start failed\n");
1881                 return ret;
1882         }
1883 
1884         ret = sony_set_device_id(sc);
1885         if (ret < 0) {
1886                 hid_err(hdev, "failed to allocate the device id\n");
1887                 goto err_stop;
1888         }
1889 
1890         if (sc->quirks & SIXAXIS_CONTROLLER_USB) {
1891                 /*
1892                  * The Sony Sixaxis does not handle HID Output Reports on the
1893                  * Interrupt EP like it could, so we need to force HID Output
1894                  * Reports to use HID_REQ_SET_REPORT on the Control EP.
1895                  *
1896                  * There is also another issue about HID Output Reports via USB,
1897                  * the Sixaxis does not want the report_id as part of the data
1898                  * packet, so we have to discard buf[0] when sending the actual
1899                  * control message, even for numbered reports, humpf!
1900                  */
1901                 hdev->quirks |= HID_QUIRK_NO_OUTPUT_REPORTS_ON_INTR_EP;
1902                 hdev->quirks |= HID_QUIRK_SKIP_OUTPUT_REPORT_ID;
1903                 ret = sixaxis_set_operational_usb(hdev);
1904                 sony_init_work(sc, sixaxis_state_worker);
1905         } else if (sc->quirks & SIXAXIS_CONTROLLER_BT) {
1906                 /*
1907                  * The Sixaxis wants output reports sent on the ctrl endpoint
1908                  * when connected via Bluetooth.
1909                  */
1910                 hdev->quirks |= HID_QUIRK_NO_OUTPUT_REPORTS_ON_INTR_EP;
1911                 ret = sixaxis_set_operational_bt(hdev);
1912                 sony_init_work(sc, sixaxis_state_worker);
1913         } else if (sc->quirks & DUALSHOCK4_CONTROLLER) {
1914                 if (sc->quirks & DUALSHOCK4_CONTROLLER_BT) {
1915                         /*
1916                          * The DualShock 4 wants output reports sent on the ctrl
1917                          * endpoint when connected via Bluetooth.
1918                          */
1919                         hdev->quirks |= HID_QUIRK_NO_OUTPUT_REPORTS_ON_INTR_EP;
1920                         ret = dualshock4_set_operational_bt(hdev);
1921                         if (ret < 0) {
1922                                 hid_err(hdev, "failed to set the Dualshock 4 operational mode\n");
1923                                 goto err_stop;
1924                         }
1925                 }
1926                 /*
1927                  * The Dualshock 4 touchpad supports 2 touches and has a
1928                  * resolution of 1920x940.
1929                  */
1930                 ret = sony_register_touchpad(sc, 2, 1920, 940);
1931                 if (ret < 0)
1932                         goto err_stop;
1933 
1934                 sony_init_work(sc, dualshock4_state_worker);
1935         } else {
1936                 ret = 0;
1937         }
1938 
1939         if (ret < 0)
1940                 goto err_stop;
1941 
1942         ret = sony_check_add(sc);
1943         if (ret < 0)
1944                 goto err_stop;
1945 
1946         if (sc->quirks & SONY_LED_SUPPORT) {
1947                 ret = sony_leds_init(sc);
1948                 if (ret < 0)
1949                         goto err_stop;
1950         }
1951 
1952         if (sc->quirks & SONY_BATTERY_SUPPORT) {
1953                 ret = sony_battery_probe(sc);
1954                 if (ret < 0)
1955                         goto err_stop;
1956 
1957                 /* Open the device to receive reports with battery info */
1958                 ret = hid_hw_open(hdev);
1959                 if (ret < 0) {
1960                         hid_err(hdev, "hw open failed\n");
1961                         goto err_stop;
1962                 }
1963         }
1964 
1965         if (sc->quirks & SONY_FF_SUPPORT) {
1966                 ret = sony_init_ff(sc);
1967                 if (ret < 0)
1968                         goto err_close;
1969         }
1970 
1971         return 0;
1972 err_close:
1973         hid_hw_close(hdev);
1974 err_stop:
1975         if (sc->quirks & SONY_LED_SUPPORT)
1976                 sony_leds_remove(sc);
1977         if (sc->quirks & SONY_BATTERY_SUPPORT)
1978                 sony_battery_remove(sc);
1979         sony_cancel_work_sync(sc);
1980         sony_remove_dev_list(sc);
1981         sony_release_device_id(sc);
1982         hid_hw_stop(hdev);
1983         return ret;
1984 }
1985 
1986 static void sony_remove(struct hid_device *hdev)
1987 {
1988         struct sony_sc *sc = hid_get_drvdata(hdev);
1989 
1990         if (sc->quirks & SONY_LED_SUPPORT)
1991                 sony_leds_remove(sc);
1992 
1993         if (sc->quirks & SONY_BATTERY_SUPPORT) {
1994                 hid_hw_close(hdev);
1995                 sony_battery_remove(sc);
1996         }
1997 
1998         sony_cancel_work_sync(sc);
1999 
2000         sony_remove_dev_list(sc);
2001 
2002         sony_release_device_id(sc);
2003 
2004         hid_hw_stop(hdev);
2005 }
2006 
2007 static const struct hid_device_id sony_devices[] = {
2008         { HID_USB_DEVICE(USB_VENDOR_ID_SONY, USB_DEVICE_ID_SONY_PS3_CONTROLLER),
2009                 .driver_data = SIXAXIS_CONTROLLER_USB },
2010         { HID_USB_DEVICE(USB_VENDOR_ID_SONY, USB_DEVICE_ID_SONY_NAVIGATION_CONTROLLER),
2011                 .driver_data = SIXAXIS_CONTROLLER_USB },
2012         { HID_BLUETOOTH_DEVICE(USB_VENDOR_ID_SONY, USB_DEVICE_ID_SONY_PS3_CONTROLLER),
2013                 .driver_data = SIXAXIS_CONTROLLER_BT },
2014         { HID_USB_DEVICE(USB_VENDOR_ID_SONY, USB_DEVICE_ID_SONY_VAIO_VGX_MOUSE),
2015                 .driver_data = VAIO_RDESC_CONSTANT },
2016         { HID_USB_DEVICE(USB_VENDOR_ID_SONY, USB_DEVICE_ID_SONY_VAIO_VGP_MOUSE),
2017                 .driver_data = VAIO_RDESC_CONSTANT },
2018         /* Wired Buzz Controller. Reported as Sony Hub from its USB ID and as
2019          * Logitech joystick from the device descriptor. */
2020         { HID_USB_DEVICE(USB_VENDOR_ID_SONY, USB_DEVICE_ID_SONY_BUZZ_CONTROLLER),
2021                 .driver_data = BUZZ_CONTROLLER },
2022         { HID_USB_DEVICE(USB_VENDOR_ID_SONY, USB_DEVICE_ID_SONY_WIRELESS_BUZZ_CONTROLLER),
2023                 .driver_data = BUZZ_CONTROLLER },
2024         /* PS3 BD Remote Control */
2025         { HID_BLUETOOTH_DEVICE(USB_VENDOR_ID_SONY, USB_DEVICE_ID_SONY_PS3_BDREMOTE),
2026                 .driver_data = PS3REMOTE },
2027         /* Logitech Harmony Adapter for PS3 */
2028         { HID_BLUETOOTH_DEVICE(USB_VENDOR_ID_LOGITECH, USB_DEVICE_ID_LOGITECH_HARMONY_PS3),
2029                 .driver_data = PS3REMOTE },
2030         /* Sony Dualshock 4 controllers for PS4 */
2031         { HID_USB_DEVICE(USB_VENDOR_ID_SONY, USB_DEVICE_ID_SONY_PS4_CONTROLLER),
2032                 .driver_data = DUALSHOCK4_CONTROLLER_USB },
2033         { HID_BLUETOOTH_DEVICE(USB_VENDOR_ID_SONY, USB_DEVICE_ID_SONY_PS4_CONTROLLER),
2034                 .driver_data = DUALSHOCK4_CONTROLLER_BT },
2035         { }
2036 };
2037 MODULE_DEVICE_TABLE(hid, sony_devices);
2038 
2039 static struct hid_driver sony_driver = {
2040         .name          = "sony",
2041         .id_table      = sony_devices,
2042         .input_mapping = sony_mapping,
2043         .probe         = sony_probe,
2044         .remove        = sony_remove,
2045         .report_fixup  = sony_report_fixup,
2046         .raw_event     = sony_raw_event
2047 };
2048 
2049 static int __init sony_init(void)
2050 {
2051         dbg_hid("Sony:%s\n", __func__);
2052 
2053         return hid_register_driver(&sony_driver);
2054 }
2055 
2056 static void __exit sony_exit(void)
2057 {
2058         dbg_hid("Sony:%s\n", __func__);
2059 
2060         ida_destroy(&sony_device_id_allocator);
2061         hid_unregister_driver(&sony_driver);
2062 }
2063 module_init(sony_init);
2064 module_exit(sony_exit);
2065 
2066 MODULE_LICENSE("GPL");
2067 

This page was automatically generated by LXR 0.3.1 (source).  •  Linux is a registered trademark of Linus Torvalds  •  Contact us