HID: sony: Use separate identifiers for USB and Bluetooth connected Dualshock 4 contr...
[deliverable/linux.git] / drivers / hid / hid-sony.c
CommitLineData
bd28ce00 1/*
078328da 2 * HID driver for Sony / PS2 / PS3 BD devices.
bd28ce00
JS
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
bd28ce00 7 * Copyright (c) 2008 Jiri Slaby
078328da
JK
8 * Copyright (c) 2012 David Dillow <dave@thedillows.org>
9 * Copyright (c) 2006-2013 Jiri Kosina
f04d5140 10 * Copyright (c) 2013 Colin Leitner <colin.leitner@gmail.com>
bd28ce00
JS
11 */
12
13/*
14 * This program is free software; you can redistribute it and/or modify it
15 * under the terms of the GNU General Public License as published by the Free
16 * Software Foundation; either version 2 of the License, or (at your option)
17 * any later version.
18 */
19
078328da
JK
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.
23 *
24 * There will be no PIN request from the device.
25 */
26
bd28ce00
JS
27#include <linux/device.h>
28#include <linux/hid.h>
29#include <linux/module.h>
5a0e3ad6 30#include <linux/slab.h>
bd28ce00 31#include <linux/usb.h>
40e32ee6 32#include <linux/leds.h>
bd28ce00
JS
33
34#include "hid-ids.h"
35
f1c458ca
SE
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)
8ab1676b
FP
41#define DUALSHOCK4_CONTROLLER_USB BIT(5)
42#define DUALSHOCK4_CONTROLLER_BT BIT(6)
cc6e0bbb 43
8ab1676b 44#define SONY_LED_SUPPORT (SIXAXIS_CONTROLLER_USB | BUZZ_CONTROLLER | DUALSHOCK4_CONTROLLER_USB)
60781cf4
FP
45
46#define MAX_LEDS 4
0a286ef2 47
61ab44be
SW
48static 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
52};
53
e57a67da
MCC
54static 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,
74};
75
078328da
JK
76static __u8 ps3remote_rdesc[] = {
77 0x05, 0x01, /* GUsagePage Generic Desktop */
78 0x09, 0x05, /* LUsage 0x05 [Game Pad] */
79 0xA1, 0x01, /* MCollection Application (mouse, keyboard) */
80
81 /* Use collection 1 for joypad buttons */
82 0xA1, 0x02, /* MCollection Logical (interrelated data) */
83
84 /* Ignore the 1st byte, maybe it is used for a controller
85 * number but it's not needed for correct operation */
86 0x75, 0x08, /* GReportSize 0x08 [8] */
87 0x95, 0x01, /* GReportCount 0x01 [1] */
88 0x81, 0x01, /* MInput 0x01 (Const[0] Arr[1] Abs[2]) */
89
90 /* Bytes from 2nd to 4th are a bitmap for joypad buttons, for these
91 * buttons multiple keypresses are allowed */
92 0x05, 0x09, /* GUsagePage Button */
93 0x19, 0x01, /* LUsageMinimum 0x01 [Button 1 (primary/trigger)] */
94 0x29, 0x18, /* LUsageMaximum 0x18 [Button 24] */
95 0x14, /* GLogicalMinimum [0] */
96 0x25, 0x01, /* GLogicalMaximum 0x01 [1] */
97 0x75, 0x01, /* GReportSize 0x01 [1] */
98 0x95, 0x18, /* GReportCount 0x18 [24] */
99 0x81, 0x02, /* MInput 0x02 (Data[0] Var[1] Abs[2]) */
100
101 0xC0, /* MEndCollection */
102
103 /* Use collection 2 for remote control buttons */
104 0xA1, 0x02, /* MCollection Logical (interrelated data) */
105
106 /* 5th byte is used for remote control buttons */
107 0x05, 0x09, /* GUsagePage Button */
108 0x18, /* LUsageMinimum [No button pressed] */
109 0x29, 0xFE, /* LUsageMaximum 0xFE [Button 254] */
110 0x14, /* GLogicalMinimum [0] */
111 0x26, 0xFE, 0x00, /* GLogicalMaximum 0x00FE [254] */
112 0x75, 0x08, /* GReportSize 0x08 [8] */
113 0x95, 0x01, /* GReportCount 0x01 [1] */
114 0x80, /* MInput */
115
116 /* Ignore bytes from 6th to 11th, 6th to 10th are always constant at
117 * 0xff and 11th is for press indication */
118 0x75, 0x08, /* GReportSize 0x08 [8] */
119 0x95, 0x06, /* GReportCount 0x06 [6] */
120 0x81, 0x01, /* MInput 0x01 (Const[0] Arr[1] Abs[2]) */
121
122 /* 12th byte is for battery strength */
123 0x05, 0x06, /* GUsagePage Generic Device Controls */
124 0x09, 0x20, /* LUsage 0x20 [Battery Strength] */
125 0x14, /* GLogicalMinimum [0] */
126 0x25, 0x05, /* GLogicalMaximum 0x05 [5] */
127 0x75, 0x08, /* GReportSize 0x08 [8] */
128 0x95, 0x01, /* GReportCount 0x01 [1] */
129 0x81, 0x02, /* MInput 0x02 (Data[0] Var[1] Abs[2]) */
130
131 0xC0, /* MEndCollection */
132
133 0xC0 /* MEndCollection [Game Pad] */
134};
135
136static const unsigned int ps3remote_keymap_joypad_buttons[] = {
137 [0x01] = KEY_SELECT,
138 [0x02] = BTN_THUMBL, /* L3 */
139 [0x03] = BTN_THUMBR, /* R3 */
140 [0x04] = BTN_START,
141 [0x05] = KEY_UP,
142 [0x06] = KEY_RIGHT,
143 [0x07] = KEY_DOWN,
144 [0x08] = KEY_LEFT,
145 [0x09] = BTN_TL2, /* L2 */
146 [0x0a] = BTN_TR2, /* R2 */
147 [0x0b] = BTN_TL, /* L1 */
148 [0x0c] = BTN_TR, /* R1 */
149 [0x0d] = KEY_OPTION, /* options/triangle */
150 [0x0e] = KEY_BACK, /* back/circle */
151 [0x0f] = BTN_0, /* cross */
152 [0x10] = KEY_SCREEN, /* view/square */
153 [0x11] = KEY_HOMEPAGE, /* PS button */
154 [0x14] = KEY_ENTER,
155};
156static const unsigned int ps3remote_keymap_remote_buttons[] = {
157 [0x00] = KEY_1,
158 [0x01] = KEY_2,
159 [0x02] = KEY_3,
160 [0x03] = KEY_4,
161 [0x04] = KEY_5,
162 [0x05] = KEY_6,
163 [0x06] = KEY_7,
164 [0x07] = KEY_8,
165 [0x08] = KEY_9,
166 [0x09] = KEY_0,
167 [0x0e] = KEY_ESC, /* return */
168 [0x0f] = KEY_CLEAR,
169 [0x16] = KEY_EJECTCD,
170 [0x1a] = KEY_MENU, /* top menu */
171 [0x28] = KEY_TIME,
172 [0x30] = KEY_PREVIOUS,
173 [0x31] = KEY_NEXT,
174 [0x32] = KEY_PLAY,
175 [0x33] = KEY_REWIND, /* scan back */
176 [0x34] = KEY_FORWARD, /* scan forward */
177 [0x38] = KEY_STOP,
178 [0x39] = KEY_PAUSE,
179 [0x40] = KEY_CONTEXT_MENU, /* pop up/menu */
180 [0x60] = KEY_FRAMEBACK, /* slow/step back */
181 [0x61] = KEY_FRAMEFORWARD, /* slow/step forward */
182 [0x63] = KEY_SUBTITLE,
183 [0x64] = KEY_AUDIO,
184 [0x65] = KEY_ANGLE,
185 [0x70] = KEY_INFO, /* display */
186 [0x80] = KEY_BLUE,
187 [0x81] = KEY_RED,
188 [0x82] = KEY_GREEN,
189 [0x83] = KEY_YELLOW,
190};
191
f04d5140
CL
192static const unsigned int buzz_keymap[] = {
193 /* The controller has 4 remote buzzers, each with one LED and 5
194 * buttons.
195 *
196 * We use the mapping chosen by the controller, which is:
197 *
198 * Key Offset
199 * -------------------
200 * Buzz 1
201 * Blue 5
202 * Orange 4
203 * Green 3
204 * Yellow 2
205 *
206 * So, for example, the orange button on the third buzzer is mapped to
207 * BTN_TRIGGER_HAPPY14
208 */
209 [ 1] = BTN_TRIGGER_HAPPY1,
210 [ 2] = BTN_TRIGGER_HAPPY2,
211 [ 3] = BTN_TRIGGER_HAPPY3,
212 [ 4] = BTN_TRIGGER_HAPPY4,
213 [ 5] = BTN_TRIGGER_HAPPY5,
214 [ 6] = BTN_TRIGGER_HAPPY6,
215 [ 7] = BTN_TRIGGER_HAPPY7,
216 [ 8] = BTN_TRIGGER_HAPPY8,
217 [ 9] = BTN_TRIGGER_HAPPY9,
218 [10] = BTN_TRIGGER_HAPPY10,
219 [11] = BTN_TRIGGER_HAPPY11,
220 [12] = BTN_TRIGGER_HAPPY12,
221 [13] = BTN_TRIGGER_HAPPY13,
222 [14] = BTN_TRIGGER_HAPPY14,
223 [15] = BTN_TRIGGER_HAPPY15,
224 [16] = BTN_TRIGGER_HAPPY16,
225 [17] = BTN_TRIGGER_HAPPY17,
226 [18] = BTN_TRIGGER_HAPPY18,
227 [19] = BTN_TRIGGER_HAPPY19,
228 [20] = BTN_TRIGGER_HAPPY20,
229};
230
cc6e0bbb 231struct sony_sc {
0a286ef2 232 struct hid_device *hdev;
60781cf4 233 struct led_classdev *leds[MAX_LEDS];
cc6e0bbb 234 unsigned long quirks;
0a286ef2 235 struct work_struct state_worker;
f04d5140 236
9f323b68 237#ifdef CONFIG_SONY_FF
9f323b68
SE
238 __u8 left;
239 __u8 right;
240#endif
241
60781cf4
FP
242 __u8 led_state[MAX_LEDS];
243 __u8 led_count;
cc6e0bbb
JK
244};
245
078328da
JK
246static __u8 *ps3remote_fixup(struct hid_device *hdev, __u8 *rdesc,
247 unsigned int *rsize)
248{
249 *rsize = sizeof(ps3remote_rdesc);
250 return ps3remote_rdesc;
251}
252
253static int ps3remote_mapping(struct hid_device *hdev, struct hid_input *hi,
254 struct hid_field *field, struct hid_usage *usage,
255 unsigned long **bit, int *max)
256{
257 unsigned int key = usage->hid & HID_USAGE;
258
259 if ((usage->hid & HID_USAGE_PAGE) != HID_UP_BUTTON)
260 return -1;
261
262 switch (usage->collection_index) {
263 case 1:
264 if (key >= ARRAY_SIZE(ps3remote_keymap_joypad_buttons))
265 return -1;
266
267 key = ps3remote_keymap_joypad_buttons[key];
268 if (!key)
269 return -1;
270 break;
271 case 2:
272 if (key >= ARRAY_SIZE(ps3remote_keymap_remote_buttons))
273 return -1;
274
275 key = ps3remote_keymap_remote_buttons[key];
276 if (!key)
277 return -1;
278 break;
279 default:
280 return -1;
281 }
282
283 hid_map_usage_clear(hi, usage, bit, max, EV_KEY, key);
284 return 1;
285}
286
287
cc6e0bbb 288/* Sony Vaio VGX has wrongly mouse pointer declared as constant */
73e4008d
NK
289static __u8 *sony_report_fixup(struct hid_device *hdev, __u8 *rdesc,
290 unsigned int *rsize)
cc6e0bbb
JK
291{
292 struct sony_sc *sc = hid_get_drvdata(hdev);
293
99d24902
FLVC
294 /*
295 * Some Sony RF receivers wrongly declare the mouse pointer as a
296 * a constant non-data variable.
297 */
298 if ((sc->quirks & VAIO_RDESC_CONSTANT) && *rsize >= 56 &&
299 /* usage page: generic desktop controls */
300 /* rdesc[0] == 0x05 && rdesc[1] == 0x01 && */
301 /* usage: mouse */
302 rdesc[2] == 0x09 && rdesc[3] == 0x02 &&
303 /* input (usage page for x,y axes): constant, variable, relative */
304 rdesc[54] == 0x81 && rdesc[55] == 0x07) {
a4649184 305 hid_info(hdev, "Fixing up Sony RF Receiver report descriptor\n");
99d24902 306 /* input: data, variable, relative */
cc6e0bbb
JK
307 rdesc[55] = 0x06;
308 }
61ab44be
SW
309
310 /* The HID descriptor exposed over BT has a trailing zero byte */
311 if ((((sc->quirks & SIXAXIS_CONTROLLER_USB) && *rsize == 148) ||
312 ((sc->quirks & SIXAXIS_CONTROLLER_BT) && *rsize == 149)) &&
313 rdesc[83] == 0x75) {
314 hid_info(hdev, "Fixing up Sony Sixaxis report descriptor\n");
315 memcpy((void *)&rdesc[83], (void *)&sixaxis_rdesc_fixup,
316 sizeof(sixaxis_rdesc_fixup));
e57a67da
MCC
317 } else if (sc->quirks & SIXAXIS_CONTROLLER_USB &&
318 *rsize > sizeof(sixaxis_rdesc_fixup2)) {
319 hid_info(hdev, "Sony Sixaxis clone detected. Using original report descriptor (size: %d clone; %d new)\n",
320 *rsize, (int)sizeof(sixaxis_rdesc_fixup2));
321 *rsize = sizeof(sixaxis_rdesc_fixup2);
322 memcpy(rdesc, &sixaxis_rdesc_fixup2, *rsize);
61ab44be 323 }
078328da
JK
324
325 if (sc->quirks & PS3REMOTE)
326 return ps3remote_fixup(hdev, rdesc, rsize);
327
73e4008d 328 return rdesc;
cc6e0bbb
JK
329}
330
c9e4d877
SW
331static int sony_raw_event(struct hid_device *hdev, struct hid_report *report,
332 __u8 *rd, int size)
333{
334 struct sony_sc *sc = hid_get_drvdata(hdev);
335
336 /* Sixaxis HID report has acclerometers/gyro with MSByte first, this
337 * has to be BYTE_SWAPPED before passing up to joystick interface
338 */
339 if ((sc->quirks & (SIXAXIS_CONTROLLER_USB | SIXAXIS_CONTROLLER_BT)) &&
340 rd[0] == 0x01 && size == 49) {
341 swap(rd[41], rd[42]);
342 swap(rd[43], rd[44]);
343 swap(rd[45], rd[46]);
344 swap(rd[47], rd[48]);
345 }
346
347 return 0;
348}
349
f04d5140
CL
350static int sony_mapping(struct hid_device *hdev, struct hid_input *hi,
351 struct hid_field *field, struct hid_usage *usage,
352 unsigned long **bit, int *max)
353{
354 struct sony_sc *sc = hid_get_drvdata(hdev);
355
356 if (sc->quirks & BUZZ_CONTROLLER) {
357 unsigned int key = usage->hid & HID_USAGE;
358
359 if ((usage->hid & HID_USAGE_PAGE) != HID_UP_BUTTON)
360 return -1;
361
362 switch (usage->collection_index) {
363 case 1:
364 if (key >= ARRAY_SIZE(buzz_keymap))
365 return -1;
366
367 key = buzz_keymap[key];
368 if (!key)
369 return -1;
370 break;
371 default:
372 return -1;
373 }
374
375 hid_map_usage_clear(hi, usage, bit, max, EV_KEY, key);
376 return 1;
377 }
378
078328da
JK
379 if (sc->quirks & PS3REMOTE)
380 return ps3remote_mapping(hdev, hi, field, usage, bit, max);
381
6f498018
BT
382 /* Let hid-core decide for the others */
383 return 0;
f04d5140
CL
384}
385
5710fabf
AO
386/*
387 * The Sony Sixaxis does not handle HID Output Reports on the Interrupt EP
388 * like it should according to usbhid/hid-core.c::usbhid_output_raw_report()
389 * so we need to override that forcing HID Output Reports on the Control EP.
390 *
391 * There is also another issue about HID Output Reports via USB, the Sixaxis
392 * does not want the report_id as part of the data packet, so we have to
393 * discard buf[0] when sending the actual control message, even for numbered
394 * reports, humpf!
395 */
569b10a5
AO
396static int sixaxis_usb_output_raw_report(struct hid_device *hid, __u8 *buf,
397 size_t count, unsigned char report_type)
398{
399 struct usb_interface *intf = to_usb_interface(hid->dev.parent);
400 struct usb_device *dev = interface_to_usbdev(intf);
401 struct usb_host_interface *interface = intf->cur_altsetting;
402 int report_id = buf[0];
403 int ret;
404
5710fabf
AO
405 if (report_type == HID_OUTPUT_REPORT) {
406 /* Don't send the Report ID */
407 buf++;
408 count--;
409 }
410
569b10a5
AO
411 ret = usb_control_msg(dev, usb_sndctrlpipe(dev, 0),
412 HID_REQ_SET_REPORT,
413 USB_DIR_OUT | USB_TYPE_CLASS | USB_RECIP_INTERFACE,
414 ((report_type + 1) << 8) | report_id,
415 interface->desc.bInterfaceNumber, buf, count,
416 USB_CTRL_SET_TIMEOUT);
417
5710fabf
AO
418 /* Count also the Report ID, in case of an Output report. */
419 if (ret > 0 && report_type == HID_OUTPUT_REPORT)
420 ret++;
421
569b10a5
AO
422 return ret;
423}
424
bd28ce00
JS
425/*
426 * Sending HID_REQ_GET_REPORT changes the operation mode of the ps3 controller
427 * to "operational". Without this, the ps3 controller will not report any
428 * events.
429 */
816651a7 430static int sixaxis_set_operational_usb(struct hid_device *hdev)
bd28ce00 431{
bd28ce00
JS
432 int ret;
433 char *buf = kmalloc(18, GFP_KERNEL);
434
435 if (!buf)
436 return -ENOMEM;
437
f204828a
BT
438 ret = hdev->hid_get_raw_report(hdev, 0xf2, buf, 17, HID_FEATURE_REPORT);
439
bd28ce00 440 if (ret < 0)
4291ee30 441 hid_err(hdev, "can't set operational mode\n");
bd28ce00
JS
442
443 kfree(buf);
444
445 return ret;
446}
447
816651a7 448static int sixaxis_set_operational_bt(struct hid_device *hdev)
f9ce7c28 449{
fddb33f2 450 unsigned char buf[] = { 0xf4, 0x42, 0x03, 0x00, 0x00 };
f9ce7c28
BN
451 return hdev->hid_output_raw_report(hdev, buf, sizeof(buf), HID_FEATURE_REPORT);
452}
453
60781cf4 454static void buzz_set_leds(struct hid_device *hdev, const __u8 *leds)
f04d5140
CL
455{
456 struct list_head *report_list =
457 &hdev->report_enum[HID_OUTPUT_REPORT].report_list;
458 struct hid_report *report = list_entry(report_list->next,
459 struct hid_report, list);
460 __s32 *value = report->field[0]->value;
461
462 value[0] = 0x00;
60781cf4
FP
463 value[1] = leds[0] ? 0xff : 0x00;
464 value[2] = leds[1] ? 0xff : 0x00;
465 value[3] = leds[2] ? 0xff : 0x00;
466 value[4] = leds[3] ? 0xff : 0x00;
f04d5140
CL
467 value[5] = 0x00;
468 value[6] = 0x00;
469 hid_hw_request(hdev, report, HID_REQ_SET_REPORT);
470}
471
60781cf4 472static void sony_set_leds(struct hid_device *hdev, const __u8 *leds, int count)
0a286ef2
SE
473{
474 struct sony_sc *drv_data = hid_get_drvdata(hdev);
60781cf4 475 int n;
0a286ef2 476
60781cf4
FP
477 BUG_ON(count > MAX_LEDS);
478
479 if (drv_data->quirks & BUZZ_CONTROLLER && count == 4) {
0a286ef2 480 buzz_set_leds(hdev, leds);
60781cf4 481 } else if ((drv_data->quirks & SIXAXIS_CONTROLLER_USB) ||
8ab1676b 482 (drv_data->quirks & DUALSHOCK4_CONTROLLER_USB)) {
60781cf4
FP
483 for (n = 0; n < count; n++)
484 drv_data->led_state[n] = leds[n];
0a286ef2
SE
485 schedule_work(&drv_data->state_worker);
486 }
487}
488
c5382519 489static void sony_led_set_brightness(struct led_classdev *led,
f04d5140
CL
490 enum led_brightness value)
491{
492 struct device *dev = led->dev->parent;
493 struct hid_device *hdev = container_of(dev, struct hid_device, dev);
494 struct sony_sc *drv_data;
f04d5140
CL
495
496 int n;
497
498 drv_data = hid_get_drvdata(hdev);
2251b85f 499 if (!drv_data) {
f04d5140
CL
500 hid_err(hdev, "No device data\n");
501 return;
502 }
f04d5140 503
60781cf4 504 for (n = 0; n < drv_data->led_count; n++) {
2251b85f 505 if (led == drv_data->leds[n]) {
60781cf4
FP
506 if (value != drv_data->led_state[n]) {
507 drv_data->led_state[n] = value;
508 sony_set_leds(hdev, drv_data->led_state, drv_data->led_count);
f04d5140
CL
509 }
510 break;
511 }
512 }
513}
514
c5382519 515static enum led_brightness sony_led_get_brightness(struct led_classdev *led)
f04d5140
CL
516{
517 struct device *dev = led->dev->parent;
518 struct hid_device *hdev = container_of(dev, struct hid_device, dev);
519 struct sony_sc *drv_data;
f04d5140
CL
520
521 int n;
522 int on = 0;
523
524 drv_data = hid_get_drvdata(hdev);
2251b85f 525 if (!drv_data) {
f04d5140
CL
526 hid_err(hdev, "No device data\n");
527 return LED_OFF;
528 }
f04d5140 529
60781cf4 530 for (n = 0; n < drv_data->led_count; n++) {
2251b85f 531 if (led == drv_data->leds[n]) {
60781cf4 532 on = !!(drv_data->led_state[n]);
f04d5140
CL
533 break;
534 }
535 }
536
537 return on ? LED_FULL : LED_OFF;
538}
f04d5140 539
0a286ef2
SE
540static void sony_leds_remove(struct hid_device *hdev)
541{
542 struct sony_sc *drv_data;
543 struct led_classdev *led;
544 int n;
545
546 drv_data = hid_get_drvdata(hdev);
547 BUG_ON(!(drv_data->quirks & SONY_LED_SUPPORT));
548
60781cf4 549 for (n = 0; n < drv_data->led_count; n++) {
0a286ef2
SE
550 led = drv_data->leds[n];
551 drv_data->leds[n] = NULL;
552 if (!led)
553 continue;
554 led_classdev_unregister(led);
555 kfree(led);
556 }
60781cf4
FP
557
558 drv_data->led_count = 0;
0a286ef2
SE
559}
560
c5382519 561static int sony_leds_init(struct hid_device *hdev)
f04d5140
CL
562{
563 struct sony_sc *drv_data;
40e32ee6 564 int n, ret = 0;
60781cf4 565 int max_brightness;
40e32ee6
JK
566 struct led_classdev *led;
567 size_t name_sz;
568 char *name;
0a286ef2
SE
569 size_t name_len;
570 const char *name_fmt;
60781cf4 571 static const __u8 initial_values[MAX_LEDS] = { 0x00, 0x00, 0x00, 0x00 };
f04d5140
CL
572
573 drv_data = hid_get_drvdata(hdev);
0a286ef2
SE
574 BUG_ON(!(drv_data->quirks & SONY_LED_SUPPORT));
575
576 if (drv_data->quirks & BUZZ_CONTROLLER) {
577 name_len = strlen("::buzz#");
578 name_fmt = "%s::buzz%d";
579 /* Validate expected report characteristics. */
580 if (!hid_validate_values(hdev, HID_OUTPUT_REPORT, 0, 0, 7))
581 return -ENODEV;
582 } else {
583 name_len = strlen("::sony#");
584 name_fmt = "%s::sony%d";
585 }
9446edb9 586
8ab1676b 587 if (drv_data->quirks & DUALSHOCK4_CONTROLLER_USB) {
60781cf4
FP
588 drv_data->led_count = 3;
589 max_brightness = 255;
590 } else {
591 drv_data->led_count = 4;
592 max_brightness = 1;
593 }
594
f04d5140
CL
595 /* Clear LEDs as we have no way of reading their initial state. This is
596 * only relevant if the driver is loaded after somebody actively set the
597 * LEDs to on */
60781cf4 598 sony_set_leds(hdev, initial_values, drv_data->led_count);
f04d5140 599
0a286ef2 600 name_sz = strlen(dev_name(&hdev->dev)) + name_len + 1;
f04d5140 601
60781cf4 602 for (n = 0; n < drv_data->led_count; n++) {
40e32ee6
JK
603 led = kzalloc(sizeof(struct led_classdev) + name_sz, GFP_KERNEL);
604 if (!led) {
605 hid_err(hdev, "Couldn't allocate memory for LED %d\n", n);
8cd5fcda 606 ret = -ENOMEM;
40e32ee6
JK
607 goto error_leds;
608 }
f04d5140 609
40e32ee6 610 name = (void *)(&led[1]);
0a286ef2 611 snprintf(name, name_sz, name_fmt, dev_name(&hdev->dev), n + 1);
40e32ee6
JK
612 led->name = name;
613 led->brightness = 0;
60781cf4 614 led->max_brightness = max_brightness;
c5382519
SE
615 led->brightness_get = sony_led_get_brightness;
616 led->brightness_set = sony_led_set_brightness;
f04d5140 617
8cd5fcda
JL
618 ret = led_classdev_register(&hdev->dev, led);
619 if (ret) {
40e32ee6
JK
620 hid_err(hdev, "Failed to register LED %d\n", n);
621 kfree(led);
622 goto error_leds;
f04d5140 623 }
40e32ee6 624
2251b85f 625 drv_data->leds[n] = led;
f04d5140 626 }
f04d5140
CL
627
628 return ret;
629
f04d5140 630error_leds:
0a286ef2 631 sony_leds_remove(hdev);
f04d5140 632
f04d5140 633 return ret;
f04d5140
CL
634}
635
cad665a2 636static void sixaxis_state_worker(struct work_struct *work)
a08c22c0 637{
92b5c411 638 struct sony_sc *sc = container_of(work, struct sony_sc, state_worker);
a08c22c0
SE
639 unsigned char buf[] = {
640 0x01,
641 0x00, 0xff, 0x00, 0xff, 0x00,
0a286ef2 642 0x00, 0x00, 0x00, 0x00, 0x00,
a08c22c0
SE
643 0xff, 0x27, 0x10, 0x00, 0x32,
644 0xff, 0x27, 0x10, 0x00, 0x32,
645 0xff, 0x27, 0x10, 0x00, 0x32,
646 0xff, 0x27, 0x10, 0x00, 0x32,
647 0x00, 0x00, 0x00, 0x00, 0x00
648 };
9f323b68 649
0a286ef2 650#ifdef CONFIG_SONY_FF
0bd88dd3 651 buf[3] = sc->right ? 1 : 0;
9f323b68 652 buf[5] = sc->left;
0a286ef2
SE
653#endif
654
60781cf4
FP
655 buf[10] |= sc->led_state[0] << 1;
656 buf[10] |= sc->led_state[1] << 2;
657 buf[10] |= sc->led_state[2] << 3;
658 buf[10] |= sc->led_state[3] << 4;
9f323b68
SE
659
660 sc->hdev->hid_output_raw_report(sc->hdev, buf, sizeof(buf),
661 HID_OUTPUT_REPORT);
662}
663
0bd88dd3
FP
664static void dualshock4_state_worker(struct work_struct *work)
665{
666 struct sony_sc *sc = container_of(work, struct sony_sc, state_worker);
667 unsigned char buf[] = {
668 0x05,
669 0x03, 0x00, 0x00, 0x00, 0x00,
670 0x00, 0x00, 0x00, 0x00, 0x00,
671 0x00, 0x00, 0x00, 0x00, 0x00,
672 0x00, 0x00, 0x00, 0x00, 0x00,
673 0x00, 0x00, 0x00, 0x00, 0x00,
674 0x00, 0x00, 0x00, 0x00, 0x00,
675 0x00,
676 };
677
678#ifdef CONFIG_SONY_FF
679 buf[4] = sc->right;
680 buf[5] = sc->left;
681#endif
682
60781cf4
FP
683 buf[6] = sc->led_state[0];
684 buf[7] = sc->led_state[1];
685 buf[8] = sc->led_state[2];
686
0bd88dd3
FP
687 sc->hdev->hid_output_raw_report(sc->hdev, buf, sizeof(buf),
688 HID_OUTPUT_REPORT);
689}
690
0a286ef2 691#ifdef CONFIG_SONY_FF
9f323b68
SE
692static int sony_play_effect(struct input_dev *dev, void *data,
693 struct ff_effect *effect)
694{
a08c22c0 695 struct hid_device *hid = input_get_drvdata(dev);
9f323b68 696 struct sony_sc *sc = hid_get_drvdata(hid);
a08c22c0
SE
697
698 if (effect->type != FF_RUMBLE)
699 return 0;
700
9f323b68 701 sc->left = effect->u.rumble.strong_magnitude / 256;
0bd88dd3 702 sc->right = effect->u.rumble.weak_magnitude / 256;
a08c22c0 703
92b5c411 704 schedule_work(&sc->state_worker);
9f323b68 705 return 0;
a08c22c0
SE
706}
707
708static int sony_init_ff(struct hid_device *hdev)
709{
710 struct hid_input *hidinput = list_entry(hdev->inputs.next,
711 struct hid_input, list);
712 struct input_dev *input_dev = hidinput->input;
713
714 input_set_capability(input_dev, EV_FF, FF_RUMBLE);
715 return input_ff_create_memless(input_dev, NULL, sony_play_effect);
716}
717
9f323b68
SE
718static void sony_destroy_ff(struct hid_device *hdev)
719{
720 struct sony_sc *sc = hid_get_drvdata(hdev);
721
92b5c411 722 cancel_work_sync(&sc->state_worker);
9f323b68
SE
723}
724
a08c22c0
SE
725#else
726static int sony_init_ff(struct hid_device *hdev)
727{
728 return 0;
729}
9f323b68
SE
730
731static void sony_destroy_ff(struct hid_device *hdev)
732{
733}
a08c22c0
SE
734#endif
735
bd28ce00
JS
736static int sony_probe(struct hid_device *hdev, const struct hid_device_id *id)
737{
738 int ret;
cc6e0bbb
JK
739 unsigned long quirks = id->driver_data;
740 struct sony_sc *sc;
f04d5140 741 unsigned int connect_mask = HID_CONNECT_DEFAULT;
cc6e0bbb 742
abf832bf 743 sc = devm_kzalloc(&hdev->dev, sizeof(*sc), GFP_KERNEL);
cc6e0bbb 744 if (sc == NULL) {
4291ee30 745 hid_err(hdev, "can't alloc sony descriptor\n");
cc6e0bbb
JK
746 return -ENOMEM;
747 }
748
749 sc->quirks = quirks;
750 hid_set_drvdata(hdev, sc);
0a286ef2 751 sc->hdev = hdev;
bd28ce00 752
bd28ce00
JS
753 ret = hid_parse(hdev);
754 if (ret) {
4291ee30 755 hid_err(hdev, "parse failed\n");
abf832bf 756 return ret;
bd28ce00
JS
757 }
758
f04d5140
CL
759 if (sc->quirks & VAIO_RDESC_CONSTANT)
760 connect_mask |= HID_CONNECT_HIDDEV_FORCE;
761 else if (sc->quirks & SIXAXIS_CONTROLLER_USB)
762 connect_mask |= HID_CONNECT_HIDDEV_FORCE;
763 else if (sc->quirks & SIXAXIS_CONTROLLER_BT)
764 connect_mask |= HID_CONNECT_HIDDEV_FORCE;
765
766 ret = hid_hw_start(hdev, connect_mask);
bd28ce00 767 if (ret) {
4291ee30 768 hid_err(hdev, "hw start failed\n");
abf832bf 769 return ret;
bd28ce00
JS
770 }
771
569b10a5
AO
772 if (sc->quirks & SIXAXIS_CONTROLLER_USB) {
773 hdev->hid_output_raw_report = sixaxis_usb_output_raw_report;
816651a7 774 ret = sixaxis_set_operational_usb(hdev);
cad665a2 775 INIT_WORK(&sc->state_worker, sixaxis_state_worker);
569b10a5 776 }
816651a7
AO
777 else if (sc->quirks & SIXAXIS_CONTROLLER_BT)
778 ret = sixaxis_set_operational_bt(hdev);
8ab1676b 779 else if (sc->quirks & DUALSHOCK4_CONTROLLER_USB) {
f9ce7c28 780 ret = 0;
0bd88dd3
FP
781 INIT_WORK(&sc->state_worker, dualshock4_state_worker);
782 } else {
783 ret = 0;
784 }
f9ce7c28 785
4dfdc464 786 if (ret < 0)
bd28ce00
JS
787 goto err_stop;
788
0a286ef2
SE
789 if (sc->quirks & SONY_LED_SUPPORT) {
790 ret = sony_leds_init(hdev);
791 if (ret < 0)
792 goto err_stop;
793 }
794
a08c22c0
SE
795 ret = sony_init_ff(hdev);
796 if (ret < 0)
797 goto err_stop;
798
bd28ce00
JS
799 return 0;
800err_stop:
0a286ef2
SE
801 if (sc->quirks & SONY_LED_SUPPORT)
802 sony_leds_remove(hdev);
bd28ce00 803 hid_hw_stop(hdev);
bd28ce00
JS
804 return ret;
805}
806
cc6e0bbb
JK
807static void sony_remove(struct hid_device *hdev)
808{
f04d5140
CL
809 struct sony_sc *sc = hid_get_drvdata(hdev);
810
0a286ef2 811 if (sc->quirks & SONY_LED_SUPPORT)
c5382519 812 sony_leds_remove(hdev);
f04d5140 813
9f323b68
SE
814 sony_destroy_ff(hdev);
815
cc6e0bbb 816 hid_hw_stop(hdev);
cc6e0bbb
JK
817}
818
bd28ce00 819static const struct hid_device_id sony_devices[] = {
816651a7
AO
820 { HID_USB_DEVICE(USB_VENDOR_ID_SONY, USB_DEVICE_ID_SONY_PS3_CONTROLLER),
821 .driver_data = SIXAXIS_CONTROLLER_USB },
35dca5b4
JK
822 { HID_USB_DEVICE(USB_VENDOR_ID_SONY, USB_DEVICE_ID_SONY_NAVIGATION_CONTROLLER),
823 .driver_data = SIXAXIS_CONTROLLER_USB },
816651a7
AO
824 { HID_BLUETOOTH_DEVICE(USB_VENDOR_ID_SONY, USB_DEVICE_ID_SONY_PS3_CONTROLLER),
825 .driver_data = SIXAXIS_CONTROLLER_BT },
cc6e0bbb
JK
826 { HID_USB_DEVICE(USB_VENDOR_ID_SONY, USB_DEVICE_ID_SONY_VAIO_VGX_MOUSE),
827 .driver_data = VAIO_RDESC_CONSTANT },
a4649184
FLVC
828 { HID_USB_DEVICE(USB_VENDOR_ID_SONY, USB_DEVICE_ID_SONY_VAIO_VGP_MOUSE),
829 .driver_data = VAIO_RDESC_CONSTANT },
f04d5140
CL
830 /* Wired Buzz Controller. Reported as Sony Hub from its USB ID and as
831 * Logitech joystick from the device descriptor. */
832 { HID_USB_DEVICE(USB_VENDOR_ID_SONY, USB_DEVICE_ID_SONY_BUZZ_CONTROLLER),
833 .driver_data = BUZZ_CONTROLLER },
834 { HID_USB_DEVICE(USB_VENDOR_ID_SONY, USB_DEVICE_ID_SONY_WIRELESS_BUZZ_CONTROLLER),
835 .driver_data = BUZZ_CONTROLLER },
078328da
JK
836 /* PS3 BD Remote Control */
837 { HID_BLUETOOTH_DEVICE(USB_VENDOR_ID_SONY, USB_DEVICE_ID_SONY_PS3_BDREMOTE),
838 .driver_data = PS3REMOTE },
839 /* Logitech Harmony Adapter for PS3 */
840 { HID_BLUETOOTH_DEVICE(USB_VENDOR_ID_LOGITECH, USB_DEVICE_ID_LOGITECH_HARMONY_PS3),
841 .driver_data = PS3REMOTE },
0bd88dd3
FP
842 /* Sony Dualshock 4 controllers for PS4 */
843 { HID_USB_DEVICE(USB_VENDOR_ID_SONY, USB_DEVICE_ID_SONY_PS4_CONTROLLER),
8ab1676b 844 .driver_data = DUALSHOCK4_CONTROLLER_USB },
0bd88dd3 845 { HID_BLUETOOTH_DEVICE(USB_VENDOR_ID_SONY, USB_DEVICE_ID_SONY_PS4_CONTROLLER),
8ab1676b 846 .driver_data = DUALSHOCK4_CONTROLLER_BT },
bd28ce00
JS
847 { }
848};
849MODULE_DEVICE_TABLE(hid, sony_devices);
850
851static struct hid_driver sony_driver = {
f04d5140
CL
852 .name = "sony",
853 .id_table = sony_devices,
854 .input_mapping = sony_mapping,
855 .probe = sony_probe,
856 .remove = sony_remove,
857 .report_fixup = sony_report_fixup,
858 .raw_event = sony_raw_event
bd28ce00 859};
f425458e 860module_hid_driver(sony_driver);
bd28ce00 861
bd28ce00 862MODULE_LICENSE("GPL");
This page took 0.373474 seconds and 5 git commands to generate.