HID: sony: Use standard output reports instead of raw reports to send data to the...
[linux-2.6-block.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);
0da8ea65
FP
667 struct hid_device *hdev = sc->hdev;
668 struct list_head *head, *list;
669 struct hid_report *report;
670 __s32 *value;
671
672 list = &hdev->report_enum[HID_OUTPUT_REPORT].report_list;
673
674 list_for_each(head, list) {
675 report = list_entry(head, struct hid_report, list);
676
677 /* Report 5 is used to send data to the controller via USB */
678 if ((sc->quirks & DUALSHOCK4_CONTROLLER_USB) && report->id == 5)
679 break;
680 }
681
682 if (head == list) {
683 hid_err(hdev, "Dualshock 4 output report not found\n");
684 return;
685 }
686
687 value = report->field[0]->value;
688 value[0] = 0x03;
0bd88dd3
FP
689
690#ifdef CONFIG_SONY_FF
0da8ea65
FP
691 value[3] = sc->right;
692 value[4] = sc->left;
0bd88dd3
FP
693#endif
694
0da8ea65
FP
695 value[5] = sc->led_state[0];
696 value[6] = sc->led_state[1];
697 value[7] = sc->led_state[2];
60781cf4 698
0da8ea65 699 hid_hw_request(hdev, report, HID_REQ_SET_REPORT);
0bd88dd3
FP
700}
701
0a286ef2 702#ifdef CONFIG_SONY_FF
9f323b68
SE
703static int sony_play_effect(struct input_dev *dev, void *data,
704 struct ff_effect *effect)
705{
a08c22c0 706 struct hid_device *hid = input_get_drvdata(dev);
9f323b68 707 struct sony_sc *sc = hid_get_drvdata(hid);
a08c22c0
SE
708
709 if (effect->type != FF_RUMBLE)
710 return 0;
711
9f323b68 712 sc->left = effect->u.rumble.strong_magnitude / 256;
0bd88dd3 713 sc->right = effect->u.rumble.weak_magnitude / 256;
a08c22c0 714
92b5c411 715 schedule_work(&sc->state_worker);
9f323b68 716 return 0;
a08c22c0
SE
717}
718
719static int sony_init_ff(struct hid_device *hdev)
720{
721 struct hid_input *hidinput = list_entry(hdev->inputs.next,
722 struct hid_input, list);
723 struct input_dev *input_dev = hidinput->input;
724
725 input_set_capability(input_dev, EV_FF, FF_RUMBLE);
726 return input_ff_create_memless(input_dev, NULL, sony_play_effect);
727}
728
9f323b68
SE
729static void sony_destroy_ff(struct hid_device *hdev)
730{
731 struct sony_sc *sc = hid_get_drvdata(hdev);
732
92b5c411 733 cancel_work_sync(&sc->state_worker);
9f323b68
SE
734}
735
a08c22c0
SE
736#else
737static int sony_init_ff(struct hid_device *hdev)
738{
739 return 0;
740}
9f323b68
SE
741
742static void sony_destroy_ff(struct hid_device *hdev)
743{
744}
a08c22c0
SE
745#endif
746
bd28ce00
JS
747static int sony_probe(struct hid_device *hdev, const struct hid_device_id *id)
748{
749 int ret;
cc6e0bbb
JK
750 unsigned long quirks = id->driver_data;
751 struct sony_sc *sc;
f04d5140 752 unsigned int connect_mask = HID_CONNECT_DEFAULT;
cc6e0bbb 753
abf832bf 754 sc = devm_kzalloc(&hdev->dev, sizeof(*sc), GFP_KERNEL);
cc6e0bbb 755 if (sc == NULL) {
4291ee30 756 hid_err(hdev, "can't alloc sony descriptor\n");
cc6e0bbb
JK
757 return -ENOMEM;
758 }
759
760 sc->quirks = quirks;
761 hid_set_drvdata(hdev, sc);
0a286ef2 762 sc->hdev = hdev;
bd28ce00 763
bd28ce00
JS
764 ret = hid_parse(hdev);
765 if (ret) {
4291ee30 766 hid_err(hdev, "parse failed\n");
abf832bf 767 return ret;
bd28ce00
JS
768 }
769
f04d5140
CL
770 if (sc->quirks & VAIO_RDESC_CONSTANT)
771 connect_mask |= HID_CONNECT_HIDDEV_FORCE;
772 else if (sc->quirks & SIXAXIS_CONTROLLER_USB)
773 connect_mask |= HID_CONNECT_HIDDEV_FORCE;
774 else if (sc->quirks & SIXAXIS_CONTROLLER_BT)
775 connect_mask |= HID_CONNECT_HIDDEV_FORCE;
776
777 ret = hid_hw_start(hdev, connect_mask);
bd28ce00 778 if (ret) {
4291ee30 779 hid_err(hdev, "hw start failed\n");
abf832bf 780 return ret;
bd28ce00
JS
781 }
782
569b10a5
AO
783 if (sc->quirks & SIXAXIS_CONTROLLER_USB) {
784 hdev->hid_output_raw_report = sixaxis_usb_output_raw_report;
816651a7 785 ret = sixaxis_set_operational_usb(hdev);
cad665a2 786 INIT_WORK(&sc->state_worker, sixaxis_state_worker);
569b10a5 787 }
816651a7
AO
788 else if (sc->quirks & SIXAXIS_CONTROLLER_BT)
789 ret = sixaxis_set_operational_bt(hdev);
8ab1676b 790 else if (sc->quirks & DUALSHOCK4_CONTROLLER_USB) {
f9ce7c28 791 ret = 0;
0bd88dd3
FP
792 INIT_WORK(&sc->state_worker, dualshock4_state_worker);
793 } else {
794 ret = 0;
795 }
f9ce7c28 796
4dfdc464 797 if (ret < 0)
bd28ce00
JS
798 goto err_stop;
799
0a286ef2
SE
800 if (sc->quirks & SONY_LED_SUPPORT) {
801 ret = sony_leds_init(hdev);
802 if (ret < 0)
803 goto err_stop;
804 }
805
a08c22c0
SE
806 ret = sony_init_ff(hdev);
807 if (ret < 0)
808 goto err_stop;
809
bd28ce00
JS
810 return 0;
811err_stop:
0a286ef2
SE
812 if (sc->quirks & SONY_LED_SUPPORT)
813 sony_leds_remove(hdev);
bd28ce00 814 hid_hw_stop(hdev);
bd28ce00
JS
815 return ret;
816}
817
cc6e0bbb
JK
818static void sony_remove(struct hid_device *hdev)
819{
f04d5140
CL
820 struct sony_sc *sc = hid_get_drvdata(hdev);
821
0a286ef2 822 if (sc->quirks & SONY_LED_SUPPORT)
c5382519 823 sony_leds_remove(hdev);
f04d5140 824
9f323b68
SE
825 sony_destroy_ff(hdev);
826
cc6e0bbb 827 hid_hw_stop(hdev);
cc6e0bbb
JK
828}
829
bd28ce00 830static const struct hid_device_id sony_devices[] = {
816651a7
AO
831 { HID_USB_DEVICE(USB_VENDOR_ID_SONY, USB_DEVICE_ID_SONY_PS3_CONTROLLER),
832 .driver_data = SIXAXIS_CONTROLLER_USB },
35dca5b4
JK
833 { HID_USB_DEVICE(USB_VENDOR_ID_SONY, USB_DEVICE_ID_SONY_NAVIGATION_CONTROLLER),
834 .driver_data = SIXAXIS_CONTROLLER_USB },
816651a7
AO
835 { HID_BLUETOOTH_DEVICE(USB_VENDOR_ID_SONY, USB_DEVICE_ID_SONY_PS3_CONTROLLER),
836 .driver_data = SIXAXIS_CONTROLLER_BT },
cc6e0bbb
JK
837 { HID_USB_DEVICE(USB_VENDOR_ID_SONY, USB_DEVICE_ID_SONY_VAIO_VGX_MOUSE),
838 .driver_data = VAIO_RDESC_CONSTANT },
a4649184
FLVC
839 { HID_USB_DEVICE(USB_VENDOR_ID_SONY, USB_DEVICE_ID_SONY_VAIO_VGP_MOUSE),
840 .driver_data = VAIO_RDESC_CONSTANT },
f04d5140
CL
841 /* Wired Buzz Controller. Reported as Sony Hub from its USB ID and as
842 * Logitech joystick from the device descriptor. */
843 { HID_USB_DEVICE(USB_VENDOR_ID_SONY, USB_DEVICE_ID_SONY_BUZZ_CONTROLLER),
844 .driver_data = BUZZ_CONTROLLER },
845 { HID_USB_DEVICE(USB_VENDOR_ID_SONY, USB_DEVICE_ID_SONY_WIRELESS_BUZZ_CONTROLLER),
846 .driver_data = BUZZ_CONTROLLER },
078328da
JK
847 /* PS3 BD Remote Control */
848 { HID_BLUETOOTH_DEVICE(USB_VENDOR_ID_SONY, USB_DEVICE_ID_SONY_PS3_BDREMOTE),
849 .driver_data = PS3REMOTE },
850 /* Logitech Harmony Adapter for PS3 */
851 { HID_BLUETOOTH_DEVICE(USB_VENDOR_ID_LOGITECH, USB_DEVICE_ID_LOGITECH_HARMONY_PS3),
852 .driver_data = PS3REMOTE },
0bd88dd3
FP
853 /* Sony Dualshock 4 controllers for PS4 */
854 { HID_USB_DEVICE(USB_VENDOR_ID_SONY, USB_DEVICE_ID_SONY_PS4_CONTROLLER),
8ab1676b 855 .driver_data = DUALSHOCK4_CONTROLLER_USB },
0bd88dd3 856 { HID_BLUETOOTH_DEVICE(USB_VENDOR_ID_SONY, USB_DEVICE_ID_SONY_PS4_CONTROLLER),
8ab1676b 857 .driver_data = DUALSHOCK4_CONTROLLER_BT },
bd28ce00
JS
858 { }
859};
860MODULE_DEVICE_TABLE(hid, sony_devices);
861
862static struct hid_driver sony_driver = {
f04d5140
CL
863 .name = "sony",
864 .id_table = sony_devices,
865 .input_mapping = sony_mapping,
866 .probe = sony_probe,
867 .remove = sony_remove,
868 .report_fixup = sony_report_fixup,
869 .raw_event = sony_raw_event
bd28ce00 870};
f425458e 871module_hid_driver(sony_driver);
bd28ce00 872
bd28ce00 873MODULE_LICENSE("GPL");