Version:  2.0.40 2.2.26 2.4.37 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 3.18 3.19

Linux/drivers/hid/hid-sony.c

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

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