2 * HID driver for Sony / PS2 / PS3 BD devices.
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>
14 * This program is free software; you can redistribute it and/or modify it
15 * under the terms of the GNU General Public License as published by the Free
16 * Software Foundation; either version 2 of the License, or (at your option)
20 /* NOTE: in order for the Sony PS3 BD Remote Control to be found by
21 * a Bluetooth host, the key combination Start+Enter has to be kept pressed
22 * for about 7 seconds with the Bluetooth Host Controller in discovering mode.
24 * There will be no PIN request from the device.
27 #include <linux/device.h>
28 #include <linux/hid.h>
29 #include <linux/module.h>
30 #include <linux/slab.h>
31 #include <linux/usb.h>
32 #include <linux/leds.h>
36 #define VAIO_RDESC_CONSTANT BIT(0)
37 #define SIXAXIS_CONTROLLER_USB BIT(1)
38 #define SIXAXIS_CONTROLLER_BT BIT(2)
39 #define BUZZ_CONTROLLER BIT(3)
40 #define PS3REMOTE BIT(4)
41 #define DUALSHOCK4_CONTROLLER_USB BIT(5)
42 #define DUALSHOCK4_CONTROLLER_BT BIT(6)
44 #define SONY_LED_SUPPORT (SIXAXIS_CONTROLLER_USB | BUZZ_CONTROLLER | DUALSHOCK4_CONTROLLER_USB)
48 static const u8 sixaxis_rdesc_fixup[] = {
49 0x95, 0x13, 0x09, 0x01, 0x81, 0x02, 0x95, 0x0C,
50 0x81, 0x01, 0x75, 0x10, 0x95, 0x04, 0x26, 0xFF,
51 0x03, 0x46, 0xFF, 0x03, 0x09, 0x01, 0x81, 0x02
54 static const u8 sixaxis_rdesc_fixup2[] = {
55 0x05, 0x01, 0x09, 0x04, 0xa1, 0x01, 0xa1, 0x02,
56 0x85, 0x01, 0x75, 0x08, 0x95, 0x01, 0x15, 0x00,
57 0x26, 0xff, 0x00, 0x81, 0x03, 0x75, 0x01, 0x95,
58 0x13, 0x15, 0x00, 0x25, 0x01, 0x35, 0x00, 0x45,
59 0x01, 0x05, 0x09, 0x19, 0x01, 0x29, 0x13, 0x81,
60 0x02, 0x75, 0x01, 0x95, 0x0d, 0x06, 0x00, 0xff,
61 0x81, 0x03, 0x15, 0x00, 0x26, 0xff, 0x00, 0x05,
62 0x01, 0x09, 0x01, 0xa1, 0x00, 0x75, 0x08, 0x95,
63 0x04, 0x35, 0x00, 0x46, 0xff, 0x00, 0x09, 0x30,
64 0x09, 0x31, 0x09, 0x32, 0x09, 0x35, 0x81, 0x02,
65 0xc0, 0x05, 0x01, 0x95, 0x13, 0x09, 0x01, 0x81,
66 0x02, 0x95, 0x0c, 0x81, 0x01, 0x75, 0x10, 0x95,
67 0x04, 0x26, 0xff, 0x03, 0x46, 0xff, 0x03, 0x09,
68 0x01, 0x81, 0x02, 0xc0, 0xa1, 0x02, 0x85, 0x02,
69 0x75, 0x08, 0x95, 0x30, 0x09, 0x01, 0xb1, 0x02,
70 0xc0, 0xa1, 0x02, 0x85, 0xee, 0x75, 0x08, 0x95,
71 0x30, 0x09, 0x01, 0xb1, 0x02, 0xc0, 0xa1, 0x02,
72 0x85, 0xef, 0x75, 0x08, 0x95, 0x30, 0x09, 0x01,
73 0xb1, 0x02, 0xc0, 0xc0,
76 static u8 dualshock4_usb_rdesc[] = {
77 0x05, 0x01, 0x09, 0x05, 0xa1, 0x01, 0x85, 0x01,
78 0x09, 0x30, 0x09, 0x31, 0x09, 0x32, 0x09, 0x35,
79 0x15, 0x00, 0x26, 0xff, 0x00, 0x75, 0x08, 0x95,
80 0x04, 0x81, 0x02, 0x09, 0x39, 0x15, 0x00, 0x25,
81 0x07, 0x35, 0x00, 0x46, 0x3b, 0x01, 0x65, 0x14,
82 0x75, 0x04, 0x95, 0x01, 0x81, 0x42, 0x65, 0x00,
83 0x05, 0x09, 0x19, 0x01, 0x29, 0x0e, 0x15, 0x00,
84 0x25, 0x01, 0x75, 0x01, 0x95, 0x0e, 0x81, 0x02,
85 0x06, 0x00, 0xff, 0x09, 0x20, 0x75, 0x06, 0x95,
86 0x01, 0x15, 0x00, 0x25, 0x7f, 0x81, 0x02, 0x05,
87 0x01, 0x09, 0x33, 0x09, 0x34, 0x15, 0x00, 0x26,
88 0xff, 0x00, 0x75, 0x08, 0x95, 0x02, 0x81, 0x02,
89 0x06, 0x00, 0xff, 0x09, 0x21, 0x95, 0x03, 0x81,
90 0x02, 0x05, 0x01, 0x19, 0x40, 0x29, 0x42, 0x16,
91 0x00, 0x80, 0x26, 0x00, 0x7f, 0x75, 0x10, 0x95,
92 0x03, 0x81, 0x02, 0x05, 0x01, 0x19, 0x43, 0x29,
93 0x45, 0x16, 0xff, 0xbf, 0x26, 0x00, 0x40, 0x95,
94 0x03, 0x81, 0x02, 0x06, 0x00, 0xff, 0x09, 0x21,
95 0x75, 0x08, 0x95, 0x27, 0x81, 0x02, 0x85, 0x05,
96 0x09, 0x22, 0x95, 0x1f, 0x91, 0x02, 0x85, 0x04,
97 0x09, 0x23, 0x95, 0x24, 0xb1, 0x02, 0x85, 0x02,
98 0x09, 0x24, 0x95, 0x24, 0xb1, 0x02, 0x85, 0x08,
99 0x09, 0x25, 0x95, 0x03, 0xb1, 0x02, 0x85, 0x10,
100 0x09, 0x26, 0x95, 0x04, 0xb1, 0x02, 0x85, 0x11,
101 0x09, 0x27, 0x95, 0x02, 0xb1, 0x02, 0x85, 0x12,
102 0x06, 0x02, 0xff, 0x09, 0x21, 0x95, 0x0f, 0xb1,
103 0x02, 0x85, 0x13, 0x09, 0x22, 0x95, 0x16, 0xb1,
104 0x02, 0x85, 0x14, 0x06, 0x05, 0xff, 0x09, 0x20,
105 0x95, 0x10, 0xb1, 0x02, 0x85, 0x15, 0x09, 0x21,
106 0x95, 0x2c, 0xb1, 0x02, 0x06, 0x80, 0xff, 0x85,
107 0x80, 0x09, 0x20, 0x95, 0x06, 0xb1, 0x02, 0x85,
108 0x81, 0x09, 0x21, 0x95, 0x06, 0xb1, 0x02, 0x85,
109 0x82, 0x09, 0x22, 0x95, 0x05, 0xb1, 0x02, 0x85,
110 0x83, 0x09, 0x23, 0x95, 0x01, 0xb1, 0x02, 0x85,
111 0x84, 0x09, 0x24, 0x95, 0x04, 0xb1, 0x02, 0x85,
112 0x85, 0x09, 0x25, 0x95, 0x06, 0xb1, 0x02, 0x85,
113 0x86, 0x09, 0x26, 0x95, 0x06, 0xb1, 0x02, 0x85,
114 0x87, 0x09, 0x27, 0x95, 0x23, 0xb1, 0x02, 0x85,
115 0x88, 0x09, 0x28, 0x95, 0x22, 0xb1, 0x02, 0x85,
116 0x89, 0x09, 0x29, 0x95, 0x02, 0xb1, 0x02, 0x85,
117 0x90, 0x09, 0x30, 0x95, 0x05, 0xb1, 0x02, 0x85,
118 0x91, 0x09, 0x31, 0x95, 0x03, 0xb1, 0x02, 0x85,
119 0x92, 0x09, 0x32, 0x95, 0x03, 0xb1, 0x02, 0x85,
120 0x93, 0x09, 0x33, 0x95, 0x0c, 0xb1, 0x02, 0x85,
121 0xa0, 0x09, 0x40, 0x95, 0x06, 0xb1, 0x02, 0x85,
122 0xa1, 0x09, 0x41, 0x95, 0x01, 0xb1, 0x02, 0x85,
123 0xa2, 0x09, 0x42, 0x95, 0x01, 0xb1, 0x02, 0x85,
124 0xa3, 0x09, 0x43, 0x95, 0x30, 0xb1, 0x02, 0x85,
125 0xa4, 0x09, 0x44, 0x95, 0x0d, 0xb1, 0x02, 0x85,
126 0xa5, 0x09, 0x45, 0x95, 0x15, 0xb1, 0x02, 0x85,
127 0xa6, 0x09, 0x46, 0x95, 0x15, 0xb1, 0x02, 0x85,
128 0xf0, 0x09, 0x47, 0x95, 0x3f, 0xb1, 0x02, 0x85,
129 0xf1, 0x09, 0x48, 0x95, 0x3f, 0xb1, 0x02, 0x85,
130 0xf2, 0x09, 0x49, 0x95, 0x0f, 0xb1, 0x02, 0x85,
131 0xa7, 0x09, 0x4a, 0x95, 0x01, 0xb1, 0x02, 0x85,
132 0xa8, 0x09, 0x4b, 0x95, 0x01, 0xb1, 0x02, 0x85,
133 0xa9, 0x09, 0x4c, 0x95, 0x08, 0xb1, 0x02, 0x85,
134 0xaa, 0x09, 0x4e, 0x95, 0x01, 0xb1, 0x02, 0x85,
135 0xab, 0x09, 0x4f, 0x95, 0x39, 0xb1, 0x02, 0x85,
136 0xac, 0x09, 0x50, 0x95, 0x39, 0xb1, 0x02, 0x85,
137 0xad, 0x09, 0x51, 0x95, 0x0b, 0xb1, 0x02, 0x85,
138 0xae, 0x09, 0x52, 0x95, 0x01, 0xb1, 0x02, 0x85,
139 0xaf, 0x09, 0x53, 0x95, 0x02, 0xb1, 0x02, 0x85,
140 0xb0, 0x09, 0x54, 0x95, 0x3f, 0xb1, 0x02, 0xc0,
143 static __u8 ps3remote_rdesc[] = {
144 0x05, 0x01, /* GUsagePage Generic Desktop */
145 0x09, 0x05, /* LUsage 0x05 [Game Pad] */
146 0xA1, 0x01, /* MCollection Application (mouse, keyboard) */
148 /* Use collection 1 for joypad buttons */
149 0xA1, 0x02, /* MCollection Logical (interrelated data) */
151 /* Ignore the 1st byte, maybe it is used for a controller
152 * number but it's not needed for correct operation */
153 0x75, 0x08, /* GReportSize 0x08 [8] */
154 0x95, 0x01, /* GReportCount 0x01 [1] */
155 0x81, 0x01, /* MInput 0x01 (Const[0] Arr[1] Abs[2]) */
157 /* Bytes from 2nd to 4th are a bitmap for joypad buttons, for these
158 * buttons multiple keypresses are allowed */
159 0x05, 0x09, /* GUsagePage Button */
160 0x19, 0x01, /* LUsageMinimum 0x01 [Button 1 (primary/trigger)] */
161 0x29, 0x18, /* LUsageMaximum 0x18 [Button 24] */
162 0x14, /* GLogicalMinimum [0] */
163 0x25, 0x01, /* GLogicalMaximum 0x01 [1] */
164 0x75, 0x01, /* GReportSize 0x01 [1] */
165 0x95, 0x18, /* GReportCount 0x18 [24] */
166 0x81, 0x02, /* MInput 0x02 (Data[0] Var[1] Abs[2]) */
168 0xC0, /* MEndCollection */
170 /* Use collection 2 for remote control buttons */
171 0xA1, 0x02, /* MCollection Logical (interrelated data) */
173 /* 5th byte is used for remote control buttons */
174 0x05, 0x09, /* GUsagePage Button */
175 0x18, /* LUsageMinimum [No button pressed] */
176 0x29, 0xFE, /* LUsageMaximum 0xFE [Button 254] */
177 0x14, /* GLogicalMinimum [0] */
178 0x26, 0xFE, 0x00, /* GLogicalMaximum 0x00FE [254] */
179 0x75, 0x08, /* GReportSize 0x08 [8] */
180 0x95, 0x01, /* GReportCount 0x01 [1] */
183 /* Ignore bytes from 6th to 11th, 6th to 10th are always constant at
184 * 0xff and 11th is for press indication */
185 0x75, 0x08, /* GReportSize 0x08 [8] */
186 0x95, 0x06, /* GReportCount 0x06 [6] */
187 0x81, 0x01, /* MInput 0x01 (Const[0] Arr[1] Abs[2]) */
189 /* 12th byte is for battery strength */
190 0x05, 0x06, /* GUsagePage Generic Device Controls */
191 0x09, 0x20, /* LUsage 0x20 [Battery Strength] */
192 0x14, /* GLogicalMinimum [0] */
193 0x25, 0x05, /* GLogicalMaximum 0x05 [5] */
194 0x75, 0x08, /* GReportSize 0x08 [8] */
195 0x95, 0x01, /* GReportCount 0x01 [1] */
196 0x81, 0x02, /* MInput 0x02 (Data[0] Var[1] Abs[2]) */
198 0xC0, /* MEndCollection */
200 0xC0 /* MEndCollection [Game Pad] */
203 static const unsigned int ps3remote_keymap_joypad_buttons[] = {
205 [0x02] = BTN_THUMBL, /* L3 */
206 [0x03] = BTN_THUMBR, /* R3 */
212 [0x09] = BTN_TL2, /* L2 */
213 [0x0a] = BTN_TR2, /* R2 */
214 [0x0b] = BTN_TL, /* L1 */
215 [0x0c] = BTN_TR, /* R1 */
216 [0x0d] = KEY_OPTION, /* options/triangle */
217 [0x0e] = KEY_BACK, /* back/circle */
218 [0x0f] = BTN_0, /* cross */
219 [0x10] = KEY_SCREEN, /* view/square */
220 [0x11] = KEY_HOMEPAGE, /* PS button */
223 static const unsigned int ps3remote_keymap_remote_buttons[] = {
234 [0x0e] = KEY_ESC, /* return */
236 [0x16] = KEY_EJECTCD,
237 [0x1a] = KEY_MENU, /* top menu */
239 [0x30] = KEY_PREVIOUS,
242 [0x33] = KEY_REWIND, /* scan back */
243 [0x34] = KEY_FORWARD, /* scan forward */
246 [0x40] = KEY_CONTEXT_MENU, /* pop up/menu */
247 [0x60] = KEY_FRAMEBACK, /* slow/step back */
248 [0x61] = KEY_FRAMEFORWARD, /* slow/step forward */
249 [0x63] = KEY_SUBTITLE,
252 [0x70] = KEY_INFO, /* display */
259 static const unsigned int buzz_keymap[] = {
260 /* The controller has 4 remote buzzers, each with one LED and 5
263 * We use the mapping chosen by the controller, which is:
266 * -------------------
273 * So, for example, the orange button on the third buzzer is mapped to
274 * BTN_TRIGGER_HAPPY14
276 [ 1] = BTN_TRIGGER_HAPPY1,
277 [ 2] = BTN_TRIGGER_HAPPY2,
278 [ 3] = BTN_TRIGGER_HAPPY3,
279 [ 4] = BTN_TRIGGER_HAPPY4,
280 [ 5] = BTN_TRIGGER_HAPPY5,
281 [ 6] = BTN_TRIGGER_HAPPY6,
282 [ 7] = BTN_TRIGGER_HAPPY7,
283 [ 8] = BTN_TRIGGER_HAPPY8,
284 [ 9] = BTN_TRIGGER_HAPPY9,
285 [10] = BTN_TRIGGER_HAPPY10,
286 [11] = BTN_TRIGGER_HAPPY11,
287 [12] = BTN_TRIGGER_HAPPY12,
288 [13] = BTN_TRIGGER_HAPPY13,
289 [14] = BTN_TRIGGER_HAPPY14,
290 [15] = BTN_TRIGGER_HAPPY15,
291 [16] = BTN_TRIGGER_HAPPY16,
292 [17] = BTN_TRIGGER_HAPPY17,
293 [18] = BTN_TRIGGER_HAPPY18,
294 [19] = BTN_TRIGGER_HAPPY19,
295 [20] = BTN_TRIGGER_HAPPY20,
299 struct hid_device *hdev;
300 struct led_classdev *leds[MAX_LEDS];
301 unsigned long quirks;
302 struct work_struct state_worker;
304 #ifdef CONFIG_SONY_FF
309 __u8 led_state[MAX_LEDS];
313 static __u8 *ps3remote_fixup(struct hid_device *hdev, __u8 *rdesc,
316 *rsize = sizeof(ps3remote_rdesc);
317 return ps3remote_rdesc;
320 static int ps3remote_mapping(struct hid_device *hdev, struct hid_input *hi,
321 struct hid_field *field, struct hid_usage *usage,
322 unsigned long **bit, int *max)
324 unsigned int key = usage->hid & HID_USAGE;
326 if ((usage->hid & HID_USAGE_PAGE) != HID_UP_BUTTON)
329 switch (usage->collection_index) {
331 if (key >= ARRAY_SIZE(ps3remote_keymap_joypad_buttons))
334 key = ps3remote_keymap_joypad_buttons[key];
339 if (key >= ARRAY_SIZE(ps3remote_keymap_remote_buttons))
342 key = ps3remote_keymap_remote_buttons[key];
350 hid_map_usage_clear(hi, usage, bit, max, EV_KEY, key);
355 /* Sony Vaio VGX has wrongly mouse pointer declared as constant */
356 static __u8 *sony_report_fixup(struct hid_device *hdev, __u8 *rdesc,
359 struct sony_sc *sc = hid_get_drvdata(hdev);
362 * Some Sony RF receivers wrongly declare the mouse pointer as a
363 * a constant non-data variable.
365 if ((sc->quirks & VAIO_RDESC_CONSTANT) && *rsize >= 56 &&
366 /* usage page: generic desktop controls */
367 /* rdesc[0] == 0x05 && rdesc[1] == 0x01 && */
369 rdesc[2] == 0x09 && rdesc[3] == 0x02 &&
370 /* input (usage page for x,y axes): constant, variable, relative */
371 rdesc[54] == 0x81 && rdesc[55] == 0x07) {
372 hid_info(hdev, "Fixing up Sony RF Receiver report descriptor\n");
373 /* input: data, variable, relative */
378 * The default Dualshock 4 USB descriptor doesn't assign
379 * the gyroscope values to corresponding axes so we need a
382 if ((sc->quirks & DUALSHOCK4_CONTROLLER_USB) && *rsize == 467) {
383 hid_info(hdev, "Using modified Dualshock 4 report descriptor with gyroscope axes\n");
384 rdesc = dualshock4_usb_rdesc;
385 *rsize = sizeof(dualshock4_usb_rdesc);
388 /* The HID descriptor exposed over BT has a trailing zero byte */
389 if ((((sc->quirks & SIXAXIS_CONTROLLER_USB) && *rsize == 148) ||
390 ((sc->quirks & SIXAXIS_CONTROLLER_BT) && *rsize == 149)) &&
392 hid_info(hdev, "Fixing up Sony Sixaxis report descriptor\n");
393 memcpy((void *)&rdesc[83], (void *)&sixaxis_rdesc_fixup,
394 sizeof(sixaxis_rdesc_fixup));
395 } else if (sc->quirks & SIXAXIS_CONTROLLER_USB &&
396 *rsize > sizeof(sixaxis_rdesc_fixup2)) {
397 hid_info(hdev, "Sony Sixaxis clone detected. Using original report descriptor (size: %d clone; %d new)\n",
398 *rsize, (int)sizeof(sixaxis_rdesc_fixup2));
399 *rsize = sizeof(sixaxis_rdesc_fixup2);
400 memcpy(rdesc, &sixaxis_rdesc_fixup2, *rsize);
403 if (sc->quirks & PS3REMOTE)
404 return ps3remote_fixup(hdev, rdesc, rsize);
409 static int sony_raw_event(struct hid_device *hdev, struct hid_report *report,
412 struct sony_sc *sc = hid_get_drvdata(hdev);
414 /* Sixaxis HID report has acclerometers/gyro with MSByte first, this
415 * has to be BYTE_SWAPPED before passing up to joystick interface
417 if ((sc->quirks & (SIXAXIS_CONTROLLER_USB | SIXAXIS_CONTROLLER_BT)) &&
418 rd[0] == 0x01 && size == 49) {
419 swap(rd[41], rd[42]);
420 swap(rd[43], rd[44]);
421 swap(rd[45], rd[46]);
422 swap(rd[47], rd[48]);
428 static int sony_mapping(struct hid_device *hdev, struct hid_input *hi,
429 struct hid_field *field, struct hid_usage *usage,
430 unsigned long **bit, int *max)
432 struct sony_sc *sc = hid_get_drvdata(hdev);
434 if (sc->quirks & BUZZ_CONTROLLER) {
435 unsigned int key = usage->hid & HID_USAGE;
437 if ((usage->hid & HID_USAGE_PAGE) != HID_UP_BUTTON)
440 switch (usage->collection_index) {
442 if (key >= ARRAY_SIZE(buzz_keymap))
445 key = buzz_keymap[key];
453 hid_map_usage_clear(hi, usage, bit, max, EV_KEY, key);
457 if (sc->quirks & PS3REMOTE)
458 return ps3remote_mapping(hdev, hi, field, usage, bit, max);
460 /* Let hid-core decide for the others */
465 * The Sony Sixaxis does not handle HID Output Reports on the Interrupt EP
466 * like it should according to usbhid/hid-core.c::usbhid_output_raw_report()
467 * so we need to override that forcing HID Output Reports on the Control EP.
469 * There is also another issue about HID Output Reports via USB, the Sixaxis
470 * does not want the report_id as part of the data packet, so we have to
471 * discard buf[0] when sending the actual control message, even for numbered
474 static int sixaxis_usb_output_raw_report(struct hid_device *hid, __u8 *buf,
475 size_t count, unsigned char report_type)
477 struct usb_interface *intf = to_usb_interface(hid->dev.parent);
478 struct usb_device *dev = interface_to_usbdev(intf);
479 struct usb_host_interface *interface = intf->cur_altsetting;
480 int report_id = buf[0];
483 if (report_type == HID_OUTPUT_REPORT) {
484 /* Don't send the Report ID */
489 ret = usb_control_msg(dev, usb_sndctrlpipe(dev, 0),
491 USB_DIR_OUT | USB_TYPE_CLASS | USB_RECIP_INTERFACE,
492 ((report_type + 1) << 8) | report_id,
493 interface->desc.bInterfaceNumber, buf, count,
494 USB_CTRL_SET_TIMEOUT);
496 /* Count also the Report ID, in case of an Output report. */
497 if (ret > 0 && report_type == HID_OUTPUT_REPORT)
504 * Sending HID_REQ_GET_REPORT changes the operation mode of the ps3 controller
505 * to "operational". Without this, the ps3 controller will not report any
508 static int sixaxis_set_operational_usb(struct hid_device *hdev)
511 char *buf = kmalloc(18, GFP_KERNEL);
516 ret = hdev->hid_get_raw_report(hdev, 0xf2, buf, 17, HID_FEATURE_REPORT);
519 hid_err(hdev, "can't set operational mode\n");
526 static int sixaxis_set_operational_bt(struct hid_device *hdev)
528 unsigned char buf[] = { 0xf4, 0x42, 0x03, 0x00, 0x00 };
529 return hdev->hid_output_raw_report(hdev, buf, sizeof(buf), HID_FEATURE_REPORT);
532 static void buzz_set_leds(struct hid_device *hdev, const __u8 *leds)
534 struct list_head *report_list =
535 &hdev->report_enum[HID_OUTPUT_REPORT].report_list;
536 struct hid_report *report = list_entry(report_list->next,
537 struct hid_report, list);
538 __s32 *value = report->field[0]->value;
541 value[1] = leds[0] ? 0xff : 0x00;
542 value[2] = leds[1] ? 0xff : 0x00;
543 value[3] = leds[2] ? 0xff : 0x00;
544 value[4] = leds[3] ? 0xff : 0x00;
547 hid_hw_request(hdev, report, HID_REQ_SET_REPORT);
550 static void sony_set_leds(struct hid_device *hdev, const __u8 *leds, int count)
552 struct sony_sc *drv_data = hid_get_drvdata(hdev);
555 BUG_ON(count > MAX_LEDS);
557 if (drv_data->quirks & BUZZ_CONTROLLER && count == 4) {
558 buzz_set_leds(hdev, leds);
559 } else if ((drv_data->quirks & SIXAXIS_CONTROLLER_USB) ||
560 (drv_data->quirks & DUALSHOCK4_CONTROLLER_USB)) {
561 for (n = 0; n < count; n++)
562 drv_data->led_state[n] = leds[n];
563 schedule_work(&drv_data->state_worker);
567 static void sony_led_set_brightness(struct led_classdev *led,
568 enum led_brightness value)
570 struct device *dev = led->dev->parent;
571 struct hid_device *hdev = container_of(dev, struct hid_device, dev);
572 struct sony_sc *drv_data;
576 drv_data = hid_get_drvdata(hdev);
578 hid_err(hdev, "No device data\n");
582 for (n = 0; n < drv_data->led_count; n++) {
583 if (led == drv_data->leds[n]) {
584 if (value != drv_data->led_state[n]) {
585 drv_data->led_state[n] = value;
586 sony_set_leds(hdev, drv_data->led_state, drv_data->led_count);
593 static enum led_brightness sony_led_get_brightness(struct led_classdev *led)
595 struct device *dev = led->dev->parent;
596 struct hid_device *hdev = container_of(dev, struct hid_device, dev);
597 struct sony_sc *drv_data;
602 drv_data = hid_get_drvdata(hdev);
604 hid_err(hdev, "No device data\n");
608 for (n = 0; n < drv_data->led_count; n++) {
609 if (led == drv_data->leds[n]) {
610 on = !!(drv_data->led_state[n]);
615 return on ? LED_FULL : LED_OFF;
618 static void sony_leds_remove(struct hid_device *hdev)
620 struct sony_sc *drv_data;
621 struct led_classdev *led;
624 drv_data = hid_get_drvdata(hdev);
625 BUG_ON(!(drv_data->quirks & SONY_LED_SUPPORT));
627 for (n = 0; n < drv_data->led_count; n++) {
628 led = drv_data->leds[n];
629 drv_data->leds[n] = NULL;
632 led_classdev_unregister(led);
636 drv_data->led_count = 0;
639 static int sony_leds_init(struct hid_device *hdev)
641 struct sony_sc *drv_data;
644 struct led_classdev *led;
648 const char *name_fmt;
649 static const __u8 initial_values[MAX_LEDS] = { 0x00, 0x00, 0x00, 0x00 };
651 drv_data = hid_get_drvdata(hdev);
652 BUG_ON(!(drv_data->quirks & SONY_LED_SUPPORT));
654 if (drv_data->quirks & BUZZ_CONTROLLER) {
655 name_len = strlen("::buzz#");
656 name_fmt = "%s::buzz%d";
657 /* Validate expected report characteristics. */
658 if (!hid_validate_values(hdev, HID_OUTPUT_REPORT, 0, 0, 7))
661 name_len = strlen("::sony#");
662 name_fmt = "%s::sony%d";
665 if (drv_data->quirks & DUALSHOCK4_CONTROLLER_USB) {
666 drv_data->led_count = 3;
667 max_brightness = 255;
669 drv_data->led_count = 4;
673 /* Clear LEDs as we have no way of reading their initial state. This is
674 * only relevant if the driver is loaded after somebody actively set the
676 sony_set_leds(hdev, initial_values, drv_data->led_count);
678 name_sz = strlen(dev_name(&hdev->dev)) + name_len + 1;
680 for (n = 0; n < drv_data->led_count; n++) {
681 led = kzalloc(sizeof(struct led_classdev) + name_sz, GFP_KERNEL);
683 hid_err(hdev, "Couldn't allocate memory for LED %d\n", n);
688 name = (void *)(&led[1]);
689 snprintf(name, name_sz, name_fmt, dev_name(&hdev->dev), n + 1);
692 led->max_brightness = max_brightness;
693 led->brightness_get = sony_led_get_brightness;
694 led->brightness_set = sony_led_set_brightness;
696 ret = led_classdev_register(&hdev->dev, led);
698 hid_err(hdev, "Failed to register LED %d\n", n);
703 drv_data->leds[n] = led;
709 sony_leds_remove(hdev);
714 static void sixaxis_state_worker(struct work_struct *work)
716 struct sony_sc *sc = container_of(work, struct sony_sc, state_worker);
717 unsigned char buf[] = {
719 0x00, 0xff, 0x00, 0xff, 0x00,
720 0x00, 0x00, 0x00, 0x00, 0x00,
721 0xff, 0x27, 0x10, 0x00, 0x32,
722 0xff, 0x27, 0x10, 0x00, 0x32,
723 0xff, 0x27, 0x10, 0x00, 0x32,
724 0xff, 0x27, 0x10, 0x00, 0x32,
725 0x00, 0x00, 0x00, 0x00, 0x00
728 #ifdef CONFIG_SONY_FF
729 buf[3] = sc->right ? 1 : 0;
733 buf[10] |= sc->led_state[0] << 1;
734 buf[10] |= sc->led_state[1] << 2;
735 buf[10] |= sc->led_state[2] << 3;
736 buf[10] |= sc->led_state[3] << 4;
738 sc->hdev->hid_output_raw_report(sc->hdev, buf, sizeof(buf),
742 static void dualshock4_state_worker(struct work_struct *work)
744 struct sony_sc *sc = container_of(work, struct sony_sc, state_worker);
745 struct hid_device *hdev = sc->hdev;
746 struct list_head *head, *list;
747 struct hid_report *report;
750 list = &hdev->report_enum[HID_OUTPUT_REPORT].report_list;
752 list_for_each(head, list) {
753 report = list_entry(head, struct hid_report, list);
755 /* Report 5 is used to send data to the controller via USB */
756 if ((sc->quirks & DUALSHOCK4_CONTROLLER_USB) && report->id == 5)
761 hid_err(hdev, "Dualshock 4 output report not found\n");
765 value = report->field[0]->value;
768 #ifdef CONFIG_SONY_FF
769 value[3] = sc->right;
773 value[5] = sc->led_state[0];
774 value[6] = sc->led_state[1];
775 value[7] = sc->led_state[2];
777 hid_hw_request(hdev, report, HID_REQ_SET_REPORT);
780 #ifdef CONFIG_SONY_FF
781 static int sony_play_effect(struct input_dev *dev, void *data,
782 struct ff_effect *effect)
784 struct hid_device *hid = input_get_drvdata(dev);
785 struct sony_sc *sc = hid_get_drvdata(hid);
787 if (effect->type != FF_RUMBLE)
790 sc->left = effect->u.rumble.strong_magnitude / 256;
791 sc->right = effect->u.rumble.weak_magnitude / 256;
793 schedule_work(&sc->state_worker);
797 static int sony_init_ff(struct hid_device *hdev)
799 struct hid_input *hidinput = list_entry(hdev->inputs.next,
800 struct hid_input, list);
801 struct input_dev *input_dev = hidinput->input;
803 input_set_capability(input_dev, EV_FF, FF_RUMBLE);
804 return input_ff_create_memless(input_dev, NULL, sony_play_effect);
807 static void sony_destroy_ff(struct hid_device *hdev)
809 struct sony_sc *sc = hid_get_drvdata(hdev);
811 cancel_work_sync(&sc->state_worker);
815 static int sony_init_ff(struct hid_device *hdev)
820 static void sony_destroy_ff(struct hid_device *hdev)
825 static int sony_probe(struct hid_device *hdev, const struct hid_device_id *id)
828 unsigned long quirks = id->driver_data;
830 unsigned int connect_mask = HID_CONNECT_DEFAULT;
832 sc = devm_kzalloc(&hdev->dev, sizeof(*sc), GFP_KERNEL);
834 hid_err(hdev, "can't alloc sony descriptor\n");
839 hid_set_drvdata(hdev, sc);
842 ret = hid_parse(hdev);
844 hid_err(hdev, "parse failed\n");
848 if (sc->quirks & VAIO_RDESC_CONSTANT)
849 connect_mask |= HID_CONNECT_HIDDEV_FORCE;
850 else if (sc->quirks & SIXAXIS_CONTROLLER_USB)
851 connect_mask |= HID_CONNECT_HIDDEV_FORCE;
852 else if (sc->quirks & SIXAXIS_CONTROLLER_BT)
853 connect_mask |= HID_CONNECT_HIDDEV_FORCE;
855 ret = hid_hw_start(hdev, connect_mask);
857 hid_err(hdev, "hw start failed\n");
861 if (sc->quirks & SIXAXIS_CONTROLLER_USB) {
862 hdev->hid_output_raw_report = sixaxis_usb_output_raw_report;
863 ret = sixaxis_set_operational_usb(hdev);
864 INIT_WORK(&sc->state_worker, sixaxis_state_worker);
866 else if (sc->quirks & SIXAXIS_CONTROLLER_BT)
867 ret = sixaxis_set_operational_bt(hdev);
868 else if (sc->quirks & DUALSHOCK4_CONTROLLER_USB) {
870 INIT_WORK(&sc->state_worker, dualshock4_state_worker);
878 if (sc->quirks & SONY_LED_SUPPORT) {
879 ret = sony_leds_init(hdev);
884 ret = sony_init_ff(hdev);
890 if (sc->quirks & SONY_LED_SUPPORT)
891 sony_leds_remove(hdev);
896 static void sony_remove(struct hid_device *hdev)
898 struct sony_sc *sc = hid_get_drvdata(hdev);
900 if (sc->quirks & SONY_LED_SUPPORT)
901 sony_leds_remove(hdev);
903 sony_destroy_ff(hdev);
908 static const struct hid_device_id sony_devices[] = {
909 { HID_USB_DEVICE(USB_VENDOR_ID_SONY, USB_DEVICE_ID_SONY_PS3_CONTROLLER),
910 .driver_data = SIXAXIS_CONTROLLER_USB },
911 { HID_USB_DEVICE(USB_VENDOR_ID_SONY, USB_DEVICE_ID_SONY_NAVIGATION_CONTROLLER),
912 .driver_data = SIXAXIS_CONTROLLER_USB },
913 { HID_BLUETOOTH_DEVICE(USB_VENDOR_ID_SONY, USB_DEVICE_ID_SONY_PS3_CONTROLLER),
914 .driver_data = SIXAXIS_CONTROLLER_BT },
915 { HID_USB_DEVICE(USB_VENDOR_ID_SONY, USB_DEVICE_ID_SONY_VAIO_VGX_MOUSE),
916 .driver_data = VAIO_RDESC_CONSTANT },
917 { HID_USB_DEVICE(USB_VENDOR_ID_SONY, USB_DEVICE_ID_SONY_VAIO_VGP_MOUSE),
918 .driver_data = VAIO_RDESC_CONSTANT },
919 /* Wired Buzz Controller. Reported as Sony Hub from its USB ID and as
920 * Logitech joystick from the device descriptor. */
921 { HID_USB_DEVICE(USB_VENDOR_ID_SONY, USB_DEVICE_ID_SONY_BUZZ_CONTROLLER),
922 .driver_data = BUZZ_CONTROLLER },
923 { HID_USB_DEVICE(USB_VENDOR_ID_SONY, USB_DEVICE_ID_SONY_WIRELESS_BUZZ_CONTROLLER),
924 .driver_data = BUZZ_CONTROLLER },
925 /* PS3 BD Remote Control */
926 { HID_BLUETOOTH_DEVICE(USB_VENDOR_ID_SONY, USB_DEVICE_ID_SONY_PS3_BDREMOTE),
927 .driver_data = PS3REMOTE },
928 /* Logitech Harmony Adapter for PS3 */
929 { HID_BLUETOOTH_DEVICE(USB_VENDOR_ID_LOGITECH, USB_DEVICE_ID_LOGITECH_HARMONY_PS3),
930 .driver_data = PS3REMOTE },
931 /* Sony Dualshock 4 controllers for PS4 */
932 { HID_USB_DEVICE(USB_VENDOR_ID_SONY, USB_DEVICE_ID_SONY_PS4_CONTROLLER),
933 .driver_data = DUALSHOCK4_CONTROLLER_USB },
934 { HID_BLUETOOTH_DEVICE(USB_VENDOR_ID_SONY, USB_DEVICE_ID_SONY_PS4_CONTROLLER),
935 .driver_data = DUALSHOCK4_CONTROLLER_BT },
938 MODULE_DEVICE_TABLE(hid, sony_devices);
940 static struct hid_driver sony_driver = {
942 .id_table = sony_devices,
943 .input_mapping = sony_mapping,
945 .remove = sony_remove,
946 .report_fixup = sony_report_fixup,
947 .raw_event = sony_raw_event
949 module_hid_driver(sony_driver);
951 MODULE_LICENSE("GPL");