blob: 28b847ad5458ec4b07cdb7cb3eda2df6dda4688b [file] [log] [blame]
Jiri Slabybd28ce02008-06-25 23:47:04 +02001/*
Jiri Kosina078328d2013-06-13 12:03:49 +02002 * HID driver for Sony / PS2 / PS3 BD devices.
Jiri Slabybd28ce02008-06-25 23:47:04 +02003 *
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
Jiri Slabybd28ce02008-06-25 23:47:04 +02007 * Copyright (c) 2008 Jiri Slaby
Jiri Kosina078328d2013-06-13 12:03:49 +02008 * Copyright (c) 2012 David Dillow <dave@thedillows.org>
9 * Copyright (c) 2006-2013 Jiri Kosina
Colin Leitnerf04d5142013-05-27 23:41:05 +020010 * Copyright (c) 2013 Colin Leitner <colin.leitner@gmail.com>
Jiri Slabybd28ce02008-06-25 23:47:04 +020011 */
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
Jiri Kosina078328d2013-06-13 12:03:49 +020020/* 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
Jiri Slabybd28ce02008-06-25 23:47:04 +020027#include <linux/device.h>
28#include <linux/hid.h>
29#include <linux/module.h>
Tejun Heo5a0e3ad2010-03-24 17:04:11 +090030#include <linux/slab.h>
Jiri Slabybd28ce02008-06-25 23:47:04 +020031#include <linux/usb.h>
Jiri Kosina40e32ee2013-05-28 11:22:09 +020032#include <linux/leds.h>
Jiri Slabybd28ce02008-06-25 23:47:04 +020033
34#include "hid-ids.h"
35
Antonio Ospite816651a2010-05-03 22:15:55 +020036#define VAIO_RDESC_CONSTANT (1 << 0)
37#define SIXAXIS_CONTROLLER_USB (1 << 1)
38#define SIXAXIS_CONTROLLER_BT (1 << 2)
Colin Leitnerf04d5142013-05-27 23:41:05 +020039#define BUZZ_CONTROLLER (1 << 3)
Jiri Kosina078328d2013-06-13 12:03:49 +020040#define PS3REMOTE (1 << 4)
Jiri Kosinacc6e0bb2008-10-23 12:58:38 +020041
Simon Wood61ab44b2011-06-10 12:00:26 +020042static const u8 sixaxis_rdesc_fixup[] = {
43 0x95, 0x13, 0x09, 0x01, 0x81, 0x02, 0x95, 0x0C,
44 0x81, 0x01, 0x75, 0x10, 0x95, 0x04, 0x26, 0xFF,
45 0x03, 0x46, 0xFF, 0x03, 0x09, 0x01, 0x81, 0x02
46};
47
Mauro Carvalho Chehabe57a67d2012-12-14 20:57:34 -020048static const u8 sixaxis_rdesc_fixup2[] = {
49 0x05, 0x01, 0x09, 0x04, 0xa1, 0x01, 0xa1, 0x02,
50 0x85, 0x01, 0x75, 0x08, 0x95, 0x01, 0x15, 0x00,
51 0x26, 0xff, 0x00, 0x81, 0x03, 0x75, 0x01, 0x95,
52 0x13, 0x15, 0x00, 0x25, 0x01, 0x35, 0x00, 0x45,
53 0x01, 0x05, 0x09, 0x19, 0x01, 0x29, 0x13, 0x81,
54 0x02, 0x75, 0x01, 0x95, 0x0d, 0x06, 0x00, 0xff,
55 0x81, 0x03, 0x15, 0x00, 0x26, 0xff, 0x00, 0x05,
56 0x01, 0x09, 0x01, 0xa1, 0x00, 0x75, 0x08, 0x95,
57 0x04, 0x35, 0x00, 0x46, 0xff, 0x00, 0x09, 0x30,
58 0x09, 0x31, 0x09, 0x32, 0x09, 0x35, 0x81, 0x02,
59 0xc0, 0x05, 0x01, 0x95, 0x13, 0x09, 0x01, 0x81,
60 0x02, 0x95, 0x0c, 0x81, 0x01, 0x75, 0x10, 0x95,
61 0x04, 0x26, 0xff, 0x03, 0x46, 0xff, 0x03, 0x09,
62 0x01, 0x81, 0x02, 0xc0, 0xa1, 0x02, 0x85, 0x02,
63 0x75, 0x08, 0x95, 0x30, 0x09, 0x01, 0xb1, 0x02,
64 0xc0, 0xa1, 0x02, 0x85, 0xee, 0x75, 0x08, 0x95,
65 0x30, 0x09, 0x01, 0xb1, 0x02, 0xc0, 0xa1, 0x02,
66 0x85, 0xef, 0x75, 0x08, 0x95, 0x30, 0x09, 0x01,
67 0xb1, 0x02, 0xc0, 0xc0,
68};
69
Jiri Kosina078328d2013-06-13 12:03:49 +020070static __u8 ps3remote_rdesc[] = {
71 0x05, 0x01, /* GUsagePage Generic Desktop */
72 0x09, 0x05, /* LUsage 0x05 [Game Pad] */
73 0xA1, 0x01, /* MCollection Application (mouse, keyboard) */
74
75 /* Use collection 1 for joypad buttons */
76 0xA1, 0x02, /* MCollection Logical (interrelated data) */
77
78 /* Ignore the 1st byte, maybe it is used for a controller
79 * number but it's not needed for correct operation */
80 0x75, 0x08, /* GReportSize 0x08 [8] */
81 0x95, 0x01, /* GReportCount 0x01 [1] */
82 0x81, 0x01, /* MInput 0x01 (Const[0] Arr[1] Abs[2]) */
83
84 /* Bytes from 2nd to 4th are a bitmap for joypad buttons, for these
85 * buttons multiple keypresses are allowed */
86 0x05, 0x09, /* GUsagePage Button */
87 0x19, 0x01, /* LUsageMinimum 0x01 [Button 1 (primary/trigger)] */
88 0x29, 0x18, /* LUsageMaximum 0x18 [Button 24] */
89 0x14, /* GLogicalMinimum [0] */
90 0x25, 0x01, /* GLogicalMaximum 0x01 [1] */
91 0x75, 0x01, /* GReportSize 0x01 [1] */
92 0x95, 0x18, /* GReportCount 0x18 [24] */
93 0x81, 0x02, /* MInput 0x02 (Data[0] Var[1] Abs[2]) */
94
95 0xC0, /* MEndCollection */
96
97 /* Use collection 2 for remote control buttons */
98 0xA1, 0x02, /* MCollection Logical (interrelated data) */
99
100 /* 5th byte is used for remote control buttons */
101 0x05, 0x09, /* GUsagePage Button */
102 0x18, /* LUsageMinimum [No button pressed] */
103 0x29, 0xFE, /* LUsageMaximum 0xFE [Button 254] */
104 0x14, /* GLogicalMinimum [0] */
105 0x26, 0xFE, 0x00, /* GLogicalMaximum 0x00FE [254] */
106 0x75, 0x08, /* GReportSize 0x08 [8] */
107 0x95, 0x01, /* GReportCount 0x01 [1] */
108 0x80, /* MInput */
109
110 /* Ignore bytes from 6th to 11th, 6th to 10th are always constant at
111 * 0xff and 11th is for press indication */
112 0x75, 0x08, /* GReportSize 0x08 [8] */
113 0x95, 0x06, /* GReportCount 0x06 [6] */
114 0x81, 0x01, /* MInput 0x01 (Const[0] Arr[1] Abs[2]) */
115
116 /* 12th byte is for battery strength */
117 0x05, 0x06, /* GUsagePage Generic Device Controls */
118 0x09, 0x20, /* LUsage 0x20 [Battery Strength] */
119 0x14, /* GLogicalMinimum [0] */
120 0x25, 0x05, /* GLogicalMaximum 0x05 [5] */
121 0x75, 0x08, /* GReportSize 0x08 [8] */
122 0x95, 0x01, /* GReportCount 0x01 [1] */
123 0x81, 0x02, /* MInput 0x02 (Data[0] Var[1] Abs[2]) */
124
125 0xC0, /* MEndCollection */
126
127 0xC0 /* MEndCollection [Game Pad] */
128};
129
130static const unsigned int ps3remote_keymap_joypad_buttons[] = {
131 [0x01] = KEY_SELECT,
132 [0x02] = BTN_THUMBL, /* L3 */
133 [0x03] = BTN_THUMBR, /* R3 */
134 [0x04] = BTN_START,
135 [0x05] = KEY_UP,
136 [0x06] = KEY_RIGHT,
137 [0x07] = KEY_DOWN,
138 [0x08] = KEY_LEFT,
139 [0x09] = BTN_TL2, /* L2 */
140 [0x0a] = BTN_TR2, /* R2 */
141 [0x0b] = BTN_TL, /* L1 */
142 [0x0c] = BTN_TR, /* R1 */
143 [0x0d] = KEY_OPTION, /* options/triangle */
144 [0x0e] = KEY_BACK, /* back/circle */
145 [0x0f] = BTN_0, /* cross */
146 [0x10] = KEY_SCREEN, /* view/square */
147 [0x11] = KEY_HOMEPAGE, /* PS button */
148 [0x14] = KEY_ENTER,
149};
150static const unsigned int ps3remote_keymap_remote_buttons[] = {
151 [0x00] = KEY_1,
152 [0x01] = KEY_2,
153 [0x02] = KEY_3,
154 [0x03] = KEY_4,
155 [0x04] = KEY_5,
156 [0x05] = KEY_6,
157 [0x06] = KEY_7,
158 [0x07] = KEY_8,
159 [0x08] = KEY_9,
160 [0x09] = KEY_0,
161 [0x0e] = KEY_ESC, /* return */
162 [0x0f] = KEY_CLEAR,
163 [0x16] = KEY_EJECTCD,
164 [0x1a] = KEY_MENU, /* top menu */
165 [0x28] = KEY_TIME,
166 [0x30] = KEY_PREVIOUS,
167 [0x31] = KEY_NEXT,
168 [0x32] = KEY_PLAY,
169 [0x33] = KEY_REWIND, /* scan back */
170 [0x34] = KEY_FORWARD, /* scan forward */
171 [0x38] = KEY_STOP,
172 [0x39] = KEY_PAUSE,
173 [0x40] = KEY_CONTEXT_MENU, /* pop up/menu */
174 [0x60] = KEY_FRAMEBACK, /* slow/step back */
175 [0x61] = KEY_FRAMEFORWARD, /* slow/step forward */
176 [0x63] = KEY_SUBTITLE,
177 [0x64] = KEY_AUDIO,
178 [0x65] = KEY_ANGLE,
179 [0x70] = KEY_INFO, /* display */
180 [0x80] = KEY_BLUE,
181 [0x81] = KEY_RED,
182 [0x82] = KEY_GREEN,
183 [0x83] = KEY_YELLOW,
184};
185
Colin Leitnerf04d5142013-05-27 23:41:05 +0200186static const unsigned int buzz_keymap[] = {
187 /* The controller has 4 remote buzzers, each with one LED and 5
188 * buttons.
189 *
190 * We use the mapping chosen by the controller, which is:
191 *
192 * Key Offset
193 * -------------------
194 * Buzz 1
195 * Blue 5
196 * Orange 4
197 * Green 3
198 * Yellow 2
199 *
200 * So, for example, the orange button on the third buzzer is mapped to
201 * BTN_TRIGGER_HAPPY14
202 */
203 [ 1] = BTN_TRIGGER_HAPPY1,
204 [ 2] = BTN_TRIGGER_HAPPY2,
205 [ 3] = BTN_TRIGGER_HAPPY3,
206 [ 4] = BTN_TRIGGER_HAPPY4,
207 [ 5] = BTN_TRIGGER_HAPPY5,
208 [ 6] = BTN_TRIGGER_HAPPY6,
209 [ 7] = BTN_TRIGGER_HAPPY7,
210 [ 8] = BTN_TRIGGER_HAPPY8,
211 [ 9] = BTN_TRIGGER_HAPPY9,
212 [10] = BTN_TRIGGER_HAPPY10,
213 [11] = BTN_TRIGGER_HAPPY11,
214 [12] = BTN_TRIGGER_HAPPY12,
215 [13] = BTN_TRIGGER_HAPPY13,
216 [14] = BTN_TRIGGER_HAPPY14,
217 [15] = BTN_TRIGGER_HAPPY15,
218 [16] = BTN_TRIGGER_HAPPY16,
219 [17] = BTN_TRIGGER_HAPPY17,
220 [18] = BTN_TRIGGER_HAPPY18,
221 [19] = BTN_TRIGGER_HAPPY19,
222 [20] = BTN_TRIGGER_HAPPY20,
223};
224
Jiri Kosinacc6e0bb2008-10-23 12:58:38 +0200225struct sony_sc {
226 unsigned long quirks;
Colin Leitnerf04d5142013-05-27 23:41:05 +0200227
Sven Eckelmann9f323b62013-11-17 20:38:21 +0100228#ifdef CONFIG_SONY_FF
Sven Eckelmann92b5c412013-11-19 20:26:28 +0100229 struct work_struct state_worker;
Sven Eckelmann9f323b62013-11-17 20:38:21 +0100230 struct hid_device *hdev;
231 __u8 left;
232 __u8 right;
233#endif
234
Colin Leitnerf04d5142013-05-27 23:41:05 +0200235 void *extra;
236};
237
238struct buzz_extra {
Colin Leitnerf04d5142013-05-27 23:41:05 +0200239 int led_state;
240 struct led_classdev *leds[4];
Jiri Kosinacc6e0bb2008-10-23 12:58:38 +0200241};
242
Jiri Kosina078328d2013-06-13 12:03:49 +0200243static __u8 *ps3remote_fixup(struct hid_device *hdev, __u8 *rdesc,
244 unsigned int *rsize)
245{
246 *rsize = sizeof(ps3remote_rdesc);
247 return ps3remote_rdesc;
248}
249
250static int ps3remote_mapping(struct hid_device *hdev, struct hid_input *hi,
251 struct hid_field *field, struct hid_usage *usage,
252 unsigned long **bit, int *max)
253{
254 unsigned int key = usage->hid & HID_USAGE;
255
256 if ((usage->hid & HID_USAGE_PAGE) != HID_UP_BUTTON)
257 return -1;
258
259 switch (usage->collection_index) {
260 case 1:
261 if (key >= ARRAY_SIZE(ps3remote_keymap_joypad_buttons))
262 return -1;
263
264 key = ps3remote_keymap_joypad_buttons[key];
265 if (!key)
266 return -1;
267 break;
268 case 2:
269 if (key >= ARRAY_SIZE(ps3remote_keymap_remote_buttons))
270 return -1;
271
272 key = ps3remote_keymap_remote_buttons[key];
273 if (!key)
274 return -1;
275 break;
276 default:
277 return -1;
278 }
279
280 hid_map_usage_clear(hi, usage, bit, max, EV_KEY, key);
281 return 1;
282}
283
284
Jiri Kosinacc6e0bb2008-10-23 12:58:38 +0200285/* Sony Vaio VGX has wrongly mouse pointer declared as constant */
Nikolai Kondrashov73e40082010-08-06 23:03:06 +0400286static __u8 *sony_report_fixup(struct hid_device *hdev, __u8 *rdesc,
287 unsigned int *rsize)
Jiri Kosinacc6e0bb2008-10-23 12:58:38 +0200288{
289 struct sony_sc *sc = hid_get_drvdata(hdev);
290
Fernando Luis Vázquez Cao99d24902013-01-22 15:20:38 +0900291 /*
292 * Some Sony RF receivers wrongly declare the mouse pointer as a
293 * a constant non-data variable.
294 */
295 if ((sc->quirks & VAIO_RDESC_CONSTANT) && *rsize >= 56 &&
296 /* usage page: generic desktop controls */
297 /* rdesc[0] == 0x05 && rdesc[1] == 0x01 && */
298 /* usage: mouse */
299 rdesc[2] == 0x09 && rdesc[3] == 0x02 &&
300 /* input (usage page for x,y axes): constant, variable, relative */
301 rdesc[54] == 0x81 && rdesc[55] == 0x07) {
Fernando Luis Vázquez Caoa4649182013-01-15 19:40:48 +0900302 hid_info(hdev, "Fixing up Sony RF Receiver report descriptor\n");
Fernando Luis Vázquez Cao99d24902013-01-22 15:20:38 +0900303 /* input: data, variable, relative */
Jiri Kosinacc6e0bb2008-10-23 12:58:38 +0200304 rdesc[55] = 0x06;
305 }
Simon Wood61ab44b2011-06-10 12:00:26 +0200306
307 /* The HID descriptor exposed over BT has a trailing zero byte */
308 if ((((sc->quirks & SIXAXIS_CONTROLLER_USB) && *rsize == 148) ||
309 ((sc->quirks & SIXAXIS_CONTROLLER_BT) && *rsize == 149)) &&
310 rdesc[83] == 0x75) {
311 hid_info(hdev, "Fixing up Sony Sixaxis report descriptor\n");
312 memcpy((void *)&rdesc[83], (void *)&sixaxis_rdesc_fixup,
313 sizeof(sixaxis_rdesc_fixup));
Mauro Carvalho Chehabe57a67d2012-12-14 20:57:34 -0200314 } else if (sc->quirks & SIXAXIS_CONTROLLER_USB &&
315 *rsize > sizeof(sixaxis_rdesc_fixup2)) {
316 hid_info(hdev, "Sony Sixaxis clone detected. Using original report descriptor (size: %d clone; %d new)\n",
317 *rsize, (int)sizeof(sixaxis_rdesc_fixup2));
318 *rsize = sizeof(sixaxis_rdesc_fixup2);
319 memcpy(rdesc, &sixaxis_rdesc_fixup2, *rsize);
Simon Wood61ab44b2011-06-10 12:00:26 +0200320 }
Jiri Kosina078328d2013-06-13 12:03:49 +0200321
322 if (sc->quirks & PS3REMOTE)
323 return ps3remote_fixup(hdev, rdesc, rsize);
324
Nikolai Kondrashov73e40082010-08-06 23:03:06 +0400325 return rdesc;
Jiri Kosinacc6e0bb2008-10-23 12:58:38 +0200326}
327
Simon Woodc9e4d872011-06-10 12:00:27 +0200328static int sony_raw_event(struct hid_device *hdev, struct hid_report *report,
329 __u8 *rd, int size)
330{
331 struct sony_sc *sc = hid_get_drvdata(hdev);
332
333 /* Sixaxis HID report has acclerometers/gyro with MSByte first, this
334 * has to be BYTE_SWAPPED before passing up to joystick interface
335 */
336 if ((sc->quirks & (SIXAXIS_CONTROLLER_USB | SIXAXIS_CONTROLLER_BT)) &&
337 rd[0] == 0x01 && size == 49) {
338 swap(rd[41], rd[42]);
339 swap(rd[43], rd[44]);
340 swap(rd[45], rd[46]);
341 swap(rd[47], rd[48]);
342 }
343
344 return 0;
345}
346
Colin Leitnerf04d5142013-05-27 23:41:05 +0200347static int sony_mapping(struct hid_device *hdev, struct hid_input *hi,
348 struct hid_field *field, struct hid_usage *usage,
349 unsigned long **bit, int *max)
350{
351 struct sony_sc *sc = hid_get_drvdata(hdev);
352
353 if (sc->quirks & BUZZ_CONTROLLER) {
354 unsigned int key = usage->hid & HID_USAGE;
355
356 if ((usage->hid & HID_USAGE_PAGE) != HID_UP_BUTTON)
357 return -1;
358
359 switch (usage->collection_index) {
360 case 1:
361 if (key >= ARRAY_SIZE(buzz_keymap))
362 return -1;
363
364 key = buzz_keymap[key];
365 if (!key)
366 return -1;
367 break;
368 default:
369 return -1;
370 }
371
372 hid_map_usage_clear(hi, usage, bit, max, EV_KEY, key);
373 return 1;
374 }
375
Jiri Kosina078328d2013-06-13 12:03:49 +0200376 if (sc->quirks & PS3REMOTE)
377 return ps3remote_mapping(hdev, hi, field, usage, bit, max);
378
Benjamin Tissoires6f498012013-07-24 16:53:07 +0200379 /* Let hid-core decide for the others */
380 return 0;
Colin Leitnerf04d5142013-05-27 23:41:05 +0200381}
382
Antonio Ospite5710fab2011-02-20 18:26:45 +0100383/*
384 * The Sony Sixaxis does not handle HID Output Reports on the Interrupt EP
385 * like it should according to usbhid/hid-core.c::usbhid_output_raw_report()
386 * so we need to override that forcing HID Output Reports on the Control EP.
387 *
388 * There is also another issue about HID Output Reports via USB, the Sixaxis
389 * does not want the report_id as part of the data packet, so we have to
390 * discard buf[0] when sending the actual control message, even for numbered
391 * reports, humpf!
392 */
Antonio Ospite569b10a2010-10-19 16:13:10 +0200393static int sixaxis_usb_output_raw_report(struct hid_device *hid, __u8 *buf,
394 size_t count, unsigned char report_type)
395{
396 struct usb_interface *intf = to_usb_interface(hid->dev.parent);
397 struct usb_device *dev = interface_to_usbdev(intf);
398 struct usb_host_interface *interface = intf->cur_altsetting;
399 int report_id = buf[0];
400 int ret;
401
Antonio Ospite5710fab2011-02-20 18:26:45 +0100402 if (report_type == HID_OUTPUT_REPORT) {
403 /* Don't send the Report ID */
404 buf++;
405 count--;
406 }
407
Antonio Ospite569b10a2010-10-19 16:13:10 +0200408 ret = usb_control_msg(dev, usb_sndctrlpipe(dev, 0),
409 HID_REQ_SET_REPORT,
410 USB_DIR_OUT | USB_TYPE_CLASS | USB_RECIP_INTERFACE,
411 ((report_type + 1) << 8) | report_id,
412 interface->desc.bInterfaceNumber, buf, count,
413 USB_CTRL_SET_TIMEOUT);
414
Antonio Ospite5710fab2011-02-20 18:26:45 +0100415 /* Count also the Report ID, in case of an Output report. */
416 if (ret > 0 && report_type == HID_OUTPUT_REPORT)
417 ret++;
418
Antonio Ospite569b10a2010-10-19 16:13:10 +0200419 return ret;
420}
421
Jiri Slabybd28ce02008-06-25 23:47:04 +0200422/*
423 * Sending HID_REQ_GET_REPORT changes the operation mode of the ps3 controller
424 * to "operational". Without this, the ps3 controller will not report any
425 * events.
426 */
Antonio Ospite816651a2010-05-03 22:15:55 +0200427static int sixaxis_set_operational_usb(struct hid_device *hdev)
Jiri Slabybd28ce02008-06-25 23:47:04 +0200428{
Jiri Slabybd28ce02008-06-25 23:47:04 +0200429 int ret;
430 char *buf = kmalloc(18, GFP_KERNEL);
431
432 if (!buf)
433 return -ENOMEM;
434
Benjamin Tissoiresf204828a2013-09-11 22:12:25 +0200435 ret = hdev->hid_get_raw_report(hdev, 0xf2, buf, 17, HID_FEATURE_REPORT);
436
Jiri Slabybd28ce02008-06-25 23:47:04 +0200437 if (ret < 0)
Joe Perches4291ee32010-12-09 19:29:03 -0800438 hid_err(hdev, "can't set operational mode\n");
Jiri Slabybd28ce02008-06-25 23:47:04 +0200439
440 kfree(buf);
441
442 return ret;
443}
444
Antonio Ospite816651a2010-05-03 22:15:55 +0200445static int sixaxis_set_operational_bt(struct hid_device *hdev)
Bastien Noceraf9ce7c22010-01-20 12:01:53 +0000446{
Antonio Ospitefddb33f2010-05-03 17:19:03 +0200447 unsigned char buf[] = { 0xf4, 0x42, 0x03, 0x00, 0x00 };
Bastien Noceraf9ce7c22010-01-20 12:01:53 +0000448 return hdev->hid_output_raw_report(hdev, buf, sizeof(buf), HID_FEATURE_REPORT);
449}
450
Colin Leitnerf04d5142013-05-27 23:41:05 +0200451static void buzz_set_leds(struct hid_device *hdev, int leds)
452{
453 struct list_head *report_list =
454 &hdev->report_enum[HID_OUTPUT_REPORT].report_list;
455 struct hid_report *report = list_entry(report_list->next,
456 struct hid_report, list);
457 __s32 *value = report->field[0]->value;
458
459 value[0] = 0x00;
460 value[1] = (leds & 1) ? 0xff : 0x00;
461 value[2] = (leds & 2) ? 0xff : 0x00;
462 value[3] = (leds & 4) ? 0xff : 0x00;
463 value[4] = (leds & 8) ? 0xff : 0x00;
464 value[5] = 0x00;
465 value[6] = 0x00;
466 hid_hw_request(hdev, report, HID_REQ_SET_REPORT);
467}
468
469static void buzz_led_set_brightness(struct led_classdev *led,
470 enum led_brightness value)
471{
472 struct device *dev = led->dev->parent;
473 struct hid_device *hdev = container_of(dev, struct hid_device, dev);
474 struct sony_sc *drv_data;
475 struct buzz_extra *buzz;
476
477 int n;
478
479 drv_data = hid_get_drvdata(hdev);
480 if (!drv_data || !drv_data->extra) {
481 hid_err(hdev, "No device data\n");
482 return;
483 }
484 buzz = drv_data->extra;
485
486 for (n = 0; n < 4; n++) {
487 if (led == buzz->leds[n]) {
488 int on = !! (buzz->led_state & (1 << n));
489 if (value == LED_OFF && on) {
490 buzz->led_state &= ~(1 << n);
491 buzz_set_leds(hdev, buzz->led_state);
492 } else if (value != LED_OFF && !on) {
493 buzz->led_state |= (1 << n);
494 buzz_set_leds(hdev, buzz->led_state);
495 }
496 break;
497 }
498 }
499}
500
501static enum led_brightness buzz_led_get_brightness(struct led_classdev *led)
502{
503 struct device *dev = led->dev->parent;
504 struct hid_device *hdev = container_of(dev, struct hid_device, dev);
505 struct sony_sc *drv_data;
506 struct buzz_extra *buzz;
507
508 int n;
509 int on = 0;
510
511 drv_data = hid_get_drvdata(hdev);
512 if (!drv_data || !drv_data->extra) {
513 hid_err(hdev, "No device data\n");
514 return LED_OFF;
515 }
516 buzz = drv_data->extra;
517
518 for (n = 0; n < 4; n++) {
519 if (led == buzz->leds[n]) {
520 on = !! (buzz->led_state & (1 << n));
521 break;
522 }
523 }
524
525 return on ? LED_FULL : LED_OFF;
526}
Colin Leitnerf04d5142013-05-27 23:41:05 +0200527
528static int buzz_init(struct hid_device *hdev)
529{
530 struct sony_sc *drv_data;
531 struct buzz_extra *buzz;
Jiri Kosina40e32ee2013-05-28 11:22:09 +0200532 int n, ret = 0;
533 struct led_classdev *led;
534 size_t name_sz;
535 char *name;
Colin Leitnerf04d5142013-05-27 23:41:05 +0200536
537 drv_data = hid_get_drvdata(hdev);
538 BUG_ON(!(drv_data->quirks & BUZZ_CONTROLLER));
539
Kees Cook9446edb2013-09-11 21:56:52 +0200540 /* Validate expected report characteristics. */
541 if (!hid_validate_values(hdev, HID_OUTPUT_REPORT, 0, 0, 7))
542 return -ENODEV;
543
Colin Leitnerf04d5142013-05-27 23:41:05 +0200544 buzz = kzalloc(sizeof(*buzz), GFP_KERNEL);
545 if (!buzz) {
546 hid_err(hdev, "Insufficient memory, cannot allocate driver data\n");
547 return -ENOMEM;
548 }
549 drv_data->extra = buzz;
550
551 /* Clear LEDs as we have no way of reading their initial state. This is
552 * only relevant if the driver is loaded after somebody actively set the
553 * LEDs to on */
554 buzz_set_leds(hdev, 0x00);
555
Jiri Kosina40e32ee2013-05-28 11:22:09 +0200556 name_sz = strlen(dev_name(&hdev->dev)) + strlen("::buzz#") + 1;
Colin Leitnerf04d5142013-05-27 23:41:05 +0200557
Jiri Kosina40e32ee2013-05-28 11:22:09 +0200558 for (n = 0; n < 4; n++) {
559 led = kzalloc(sizeof(struct led_classdev) + name_sz, GFP_KERNEL);
560 if (!led) {
561 hid_err(hdev, "Couldn't allocate memory for LED %d\n", n);
562 goto error_leds;
Colin Leitnerf04d5142013-05-27 23:41:05 +0200563 }
Jiri Kosina40e32ee2013-05-28 11:22:09 +0200564
565 name = (void *)(&led[1]);
566 snprintf(name, name_sz, "%s::buzz%d", dev_name(&hdev->dev), n + 1);
567 led->name = name;
568 led->brightness = 0;
569 led->max_brightness = 1;
570 led->brightness_get = buzz_led_get_brightness;
571 led->brightness_set = buzz_led_set_brightness;
572
573 if (led_classdev_register(&hdev->dev, led)) {
574 hid_err(hdev, "Failed to register LED %d\n", n);
575 kfree(led);
576 goto error_leds;
577 }
578
579 buzz->leds[n] = led;
Colin Leitnerf04d5142013-05-27 23:41:05 +0200580 }
Colin Leitnerf04d5142013-05-27 23:41:05 +0200581
582 return ret;
583
Colin Leitnerf04d5142013-05-27 23:41:05 +0200584error_leds:
Jiri Kosina40e32ee2013-05-28 11:22:09 +0200585 for (n = 0; n < 4; n++) {
586 led = buzz->leds[n];
587 buzz->leds[n] = NULL;
588 if (!led)
589 continue;
590 led_classdev_unregister(led);
591 kfree(led);
Colin Leitnerf04d5142013-05-27 23:41:05 +0200592 }
593
594 kfree(drv_data->extra);
595 drv_data->extra = NULL;
596 return ret;
Colin Leitnerf04d5142013-05-27 23:41:05 +0200597}
598
599static void buzz_remove(struct hid_device *hdev)
600{
601 struct sony_sc *drv_data;
602 struct buzz_extra *buzz;
Jiri Kosina40e32ee2013-05-28 11:22:09 +0200603 struct led_classdev *led;
604 int n;
Colin Leitnerf04d5142013-05-27 23:41:05 +0200605
606 drv_data = hid_get_drvdata(hdev);
607 BUG_ON(!(drv_data->quirks & BUZZ_CONTROLLER));
608
609 buzz = drv_data->extra;
Colin Leitnerf04d5142013-05-27 23:41:05 +0200610
Jiri Kosina40e32ee2013-05-28 11:22:09 +0200611 for (n = 0; n < 4; n++) {
612 led = buzz->leds[n];
613 buzz->leds[n] = NULL;
614 if (!led)
615 continue;
616 led_classdev_unregister(led);
617 kfree(led);
Colin Leitnerf04d5142013-05-27 23:41:05 +0200618 }
Colin Leitnerf04d5142013-05-27 23:41:05 +0200619
620 kfree(drv_data->extra);
621 drv_data->extra = NULL;
622}
623
Sven Eckelmanna08c22c2013-11-09 19:25:57 +0100624#ifdef CONFIG_SONY_FF
Sven Eckelmann92b5c412013-11-19 20:26:28 +0100625static void sony_state_worker(struct work_struct *work)
Sven Eckelmanna08c22c2013-11-09 19:25:57 +0100626{
Sven Eckelmann92b5c412013-11-19 20:26:28 +0100627 struct sony_sc *sc = container_of(work, struct sony_sc, state_worker);
Sven Eckelmanna08c22c2013-11-09 19:25:57 +0100628 unsigned char buf[] = {
629 0x01,
630 0x00, 0xff, 0x00, 0xff, 0x00,
631 0x00, 0x00, 0x00, 0x00, 0x03,
632 0xff, 0x27, 0x10, 0x00, 0x32,
633 0xff, 0x27, 0x10, 0x00, 0x32,
634 0xff, 0x27, 0x10, 0x00, 0x32,
635 0xff, 0x27, 0x10, 0x00, 0x32,
636 0x00, 0x00, 0x00, 0x00, 0x00
637 };
Sven Eckelmann9f323b62013-11-17 20:38:21 +0100638
639 buf[3] = sc->right;
640 buf[5] = sc->left;
641
642 sc->hdev->hid_output_raw_report(sc->hdev, buf, sizeof(buf),
643 HID_OUTPUT_REPORT);
644}
645
646static int sony_play_effect(struct input_dev *dev, void *data,
647 struct ff_effect *effect)
648{
Sven Eckelmanna08c22c2013-11-09 19:25:57 +0100649 struct hid_device *hid = input_get_drvdata(dev);
Sven Eckelmann9f323b62013-11-17 20:38:21 +0100650 struct sony_sc *sc = hid_get_drvdata(hid);
Sven Eckelmanna08c22c2013-11-09 19:25:57 +0100651
652 if (effect->type != FF_RUMBLE)
653 return 0;
654
Sven Eckelmann9f323b62013-11-17 20:38:21 +0100655 sc->left = effect->u.rumble.strong_magnitude / 256;
656 sc->right = effect->u.rumble.weak_magnitude ? 1 : 0;
Sven Eckelmanna08c22c2013-11-09 19:25:57 +0100657
Sven Eckelmann92b5c412013-11-19 20:26:28 +0100658 schedule_work(&sc->state_worker);
Sven Eckelmann9f323b62013-11-17 20:38:21 +0100659 return 0;
Sven Eckelmanna08c22c2013-11-09 19:25:57 +0100660}
661
662static int sony_init_ff(struct hid_device *hdev)
663{
664 struct hid_input *hidinput = list_entry(hdev->inputs.next,
665 struct hid_input, list);
666 struct input_dev *input_dev = hidinput->input;
Sven Eckelmann9f323b62013-11-17 20:38:21 +0100667 struct sony_sc *sc = hid_get_drvdata(hdev);
668
669 sc->hdev = hdev;
Sven Eckelmann92b5c412013-11-19 20:26:28 +0100670 INIT_WORK(&sc->state_worker, sony_state_worker);
Sven Eckelmanna08c22c2013-11-09 19:25:57 +0100671
672 input_set_capability(input_dev, EV_FF, FF_RUMBLE);
673 return input_ff_create_memless(input_dev, NULL, sony_play_effect);
674}
675
Sven Eckelmann9f323b62013-11-17 20:38:21 +0100676static void sony_destroy_ff(struct hid_device *hdev)
677{
678 struct sony_sc *sc = hid_get_drvdata(hdev);
679
Sven Eckelmann92b5c412013-11-19 20:26:28 +0100680 cancel_work_sync(&sc->state_worker);
Sven Eckelmann9f323b62013-11-17 20:38:21 +0100681}
682
Sven Eckelmanna08c22c2013-11-09 19:25:57 +0100683#else
684static int sony_init_ff(struct hid_device *hdev)
685{
686 return 0;
687}
Sven Eckelmann9f323b62013-11-17 20:38:21 +0100688
689static void sony_destroy_ff(struct hid_device *hdev)
690{
691}
Sven Eckelmanna08c22c2013-11-09 19:25:57 +0100692#endif
693
Jiri Slabybd28ce02008-06-25 23:47:04 +0200694static int sony_probe(struct hid_device *hdev, const struct hid_device_id *id)
695{
696 int ret;
Jiri Kosinacc6e0bb2008-10-23 12:58:38 +0200697 unsigned long quirks = id->driver_data;
698 struct sony_sc *sc;
Colin Leitnerf04d5142013-05-27 23:41:05 +0200699 unsigned int connect_mask = HID_CONNECT_DEFAULT;
Jiri Kosinacc6e0bb2008-10-23 12:58:38 +0200700
Benjamin Tissoiresabf832b2013-07-24 19:38:04 +0200701 sc = devm_kzalloc(&hdev->dev, sizeof(*sc), GFP_KERNEL);
Jiri Kosinacc6e0bb2008-10-23 12:58:38 +0200702 if (sc == NULL) {
Joe Perches4291ee32010-12-09 19:29:03 -0800703 hid_err(hdev, "can't alloc sony descriptor\n");
Jiri Kosinacc6e0bb2008-10-23 12:58:38 +0200704 return -ENOMEM;
705 }
706
707 sc->quirks = quirks;
708 hid_set_drvdata(hdev, sc);
Jiri Slabybd28ce02008-06-25 23:47:04 +0200709
Jiri Slabybd28ce02008-06-25 23:47:04 +0200710 ret = hid_parse(hdev);
711 if (ret) {
Joe Perches4291ee32010-12-09 19:29:03 -0800712 hid_err(hdev, "parse failed\n");
Benjamin Tissoiresabf832b2013-07-24 19:38:04 +0200713 return ret;
Jiri Slabybd28ce02008-06-25 23:47:04 +0200714 }
715
Colin Leitnerf04d5142013-05-27 23:41:05 +0200716 if (sc->quirks & VAIO_RDESC_CONSTANT)
717 connect_mask |= HID_CONNECT_HIDDEV_FORCE;
718 else if (sc->quirks & SIXAXIS_CONTROLLER_USB)
719 connect_mask |= HID_CONNECT_HIDDEV_FORCE;
720 else if (sc->quirks & SIXAXIS_CONTROLLER_BT)
721 connect_mask |= HID_CONNECT_HIDDEV_FORCE;
722
723 ret = hid_hw_start(hdev, connect_mask);
Jiri Slabybd28ce02008-06-25 23:47:04 +0200724 if (ret) {
Joe Perches4291ee32010-12-09 19:29:03 -0800725 hid_err(hdev, "hw start failed\n");
Benjamin Tissoiresabf832b2013-07-24 19:38:04 +0200726 return ret;
Jiri Slabybd28ce02008-06-25 23:47:04 +0200727 }
728
Antonio Ospite569b10a2010-10-19 16:13:10 +0200729 if (sc->quirks & SIXAXIS_CONTROLLER_USB) {
730 hdev->hid_output_raw_report = sixaxis_usb_output_raw_report;
Antonio Ospite816651a2010-05-03 22:15:55 +0200731 ret = sixaxis_set_operational_usb(hdev);
Antonio Ospite569b10a2010-10-19 16:13:10 +0200732 }
Antonio Ospite816651a2010-05-03 22:15:55 +0200733 else if (sc->quirks & SIXAXIS_CONTROLLER_BT)
734 ret = sixaxis_set_operational_bt(hdev);
Colin Leitnerf04d5142013-05-27 23:41:05 +0200735 else if (sc->quirks & BUZZ_CONTROLLER)
736 ret = buzz_init(hdev);
Antonio Ospite816651a2010-05-03 22:15:55 +0200737 else
Bastien Noceraf9ce7c22010-01-20 12:01:53 +0000738 ret = 0;
Bastien Noceraf9ce7c22010-01-20 12:01:53 +0000739
Jiri Kosina4dfdc462008-12-30 00:49:59 +0100740 if (ret < 0)
Jiri Slabybd28ce02008-06-25 23:47:04 +0200741 goto err_stop;
742
Sven Eckelmanna08c22c2013-11-09 19:25:57 +0100743 ret = sony_init_ff(hdev);
744 if (ret < 0)
745 goto err_stop;
746
Jiri Slabybd28ce02008-06-25 23:47:04 +0200747 return 0;
748err_stop:
749 hid_hw_stop(hdev);
Jiri Slabybd28ce02008-06-25 23:47:04 +0200750 return ret;
751}
752
Jiri Kosinacc6e0bb2008-10-23 12:58:38 +0200753static void sony_remove(struct hid_device *hdev)
754{
Colin Leitnerf04d5142013-05-27 23:41:05 +0200755 struct sony_sc *sc = hid_get_drvdata(hdev);
756
757 if (sc->quirks & BUZZ_CONTROLLER)
758 buzz_remove(hdev);
759
Sven Eckelmann9f323b62013-11-17 20:38:21 +0100760 sony_destroy_ff(hdev);
761
Jiri Kosinacc6e0bb2008-10-23 12:58:38 +0200762 hid_hw_stop(hdev);
Jiri Kosinacc6e0bb2008-10-23 12:58:38 +0200763}
764
Jiri Slabybd28ce02008-06-25 23:47:04 +0200765static const struct hid_device_id sony_devices[] = {
Antonio Ospite816651a2010-05-03 22:15:55 +0200766 { HID_USB_DEVICE(USB_VENDOR_ID_SONY, USB_DEVICE_ID_SONY_PS3_CONTROLLER),
767 .driver_data = SIXAXIS_CONTROLLER_USB },
Jiri Kosina35dca5b2011-04-28 15:43:13 +0200768 { HID_USB_DEVICE(USB_VENDOR_ID_SONY, USB_DEVICE_ID_SONY_NAVIGATION_CONTROLLER),
769 .driver_data = SIXAXIS_CONTROLLER_USB },
Antonio Ospite816651a2010-05-03 22:15:55 +0200770 { HID_BLUETOOTH_DEVICE(USB_VENDOR_ID_SONY, USB_DEVICE_ID_SONY_PS3_CONTROLLER),
771 .driver_data = SIXAXIS_CONTROLLER_BT },
Jiri Kosinacc6e0bb2008-10-23 12:58:38 +0200772 { HID_USB_DEVICE(USB_VENDOR_ID_SONY, USB_DEVICE_ID_SONY_VAIO_VGX_MOUSE),
773 .driver_data = VAIO_RDESC_CONSTANT },
Fernando Luis Vázquez Caoa4649182013-01-15 19:40:48 +0900774 { HID_USB_DEVICE(USB_VENDOR_ID_SONY, USB_DEVICE_ID_SONY_VAIO_VGP_MOUSE),
775 .driver_data = VAIO_RDESC_CONSTANT },
Colin Leitnerf04d5142013-05-27 23:41:05 +0200776 /* Wired Buzz Controller. Reported as Sony Hub from its USB ID and as
777 * Logitech joystick from the device descriptor. */
778 { HID_USB_DEVICE(USB_VENDOR_ID_SONY, USB_DEVICE_ID_SONY_BUZZ_CONTROLLER),
779 .driver_data = BUZZ_CONTROLLER },
780 { HID_USB_DEVICE(USB_VENDOR_ID_SONY, USB_DEVICE_ID_SONY_WIRELESS_BUZZ_CONTROLLER),
781 .driver_data = BUZZ_CONTROLLER },
Jiri Kosina078328d2013-06-13 12:03:49 +0200782 /* PS3 BD Remote Control */
783 { HID_BLUETOOTH_DEVICE(USB_VENDOR_ID_SONY, USB_DEVICE_ID_SONY_PS3_BDREMOTE),
784 .driver_data = PS3REMOTE },
785 /* Logitech Harmony Adapter for PS3 */
786 { HID_BLUETOOTH_DEVICE(USB_VENDOR_ID_LOGITECH, USB_DEVICE_ID_LOGITECH_HARMONY_PS3),
787 .driver_data = PS3REMOTE },
Jiri Slabybd28ce02008-06-25 23:47:04 +0200788 { }
789};
790MODULE_DEVICE_TABLE(hid, sony_devices);
791
792static struct hid_driver sony_driver = {
Colin Leitnerf04d5142013-05-27 23:41:05 +0200793 .name = "sony",
794 .id_table = sony_devices,
795 .input_mapping = sony_mapping,
796 .probe = sony_probe,
797 .remove = sony_remove,
798 .report_fixup = sony_report_fixup,
799 .raw_event = sony_raw_event
Jiri Slabybd28ce02008-06-25 23:47:04 +0200800};
H Hartley Sweetenf4254582012-12-17 15:28:26 -0700801module_hid_driver(sony_driver);
Jiri Slabybd28ce02008-06-25 23:47:04 +0200802
Jiri Slabybd28ce02008-06-25 23:47:04 +0200803MODULE_LICENSE("GPL");