blob: a7c81677c540577efb94e4a71c3c9f7e61c9aded [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
Frank Praznik6c79c182014-01-16 21:43:03 -050036#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)
Frank Praznik8ab16762014-01-16 21:42:31 -050041#define DUALSHOCK4_CONTROLLER_USB BIT(5)
42#define DUALSHOCK4_CONTROLLER_BT BIT(6)
Jiri Kosinacc6e0bb2008-10-23 12:58:38 +020043
Frank Praznik8ab16762014-01-16 21:42:31 -050044#define SONY_LED_SUPPORT (SIXAXIS_CONTROLLER_USB | BUZZ_CONTROLLER | DUALSHOCK4_CONTROLLER_USB)
Frank Praznik60781cf2014-01-11 15:13:15 -050045
46#define MAX_LEDS 4
Sven Eckelmann0a286ef2013-11-19 20:26:32 +010047
Simon Wood61ab44b2011-06-10 12:00:26 +020048static 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
Mauro Carvalho Chehabe57a67d2012-12-14 20:57:34 -020054static 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
Jiri Kosina078328d2013-06-13 12:03:49 +020076static __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
Colin Leitnerf04d5142013-05-27 23:41:05 +0200192static 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
Jiri Kosinacc6e0bb2008-10-23 12:58:38 +0200231struct sony_sc {
Sven Eckelmann0a286ef2013-11-19 20:26:32 +0100232 struct hid_device *hdev;
Frank Praznik60781cf2014-01-11 15:13:15 -0500233 struct led_classdev *leds[MAX_LEDS];
Jiri Kosinacc6e0bb2008-10-23 12:58:38 +0200234 unsigned long quirks;
Sven Eckelmann0a286ef2013-11-19 20:26:32 +0100235 struct work_struct state_worker;
Colin Leitnerf04d5142013-05-27 23:41:05 +0200236
Sven Eckelmann9f323b62013-11-17 20:38:21 +0100237#ifdef CONFIG_SONY_FF
Sven Eckelmann9f323b62013-11-17 20:38:21 +0100238 __u8 left;
239 __u8 right;
240#endif
241
Frank Praznik60781cf2014-01-11 15:13:15 -0500242 __u8 led_state[MAX_LEDS];
243 __u8 led_count;
Jiri Kosinacc6e0bb2008-10-23 12:58:38 +0200244};
245
Jiri Kosina078328d2013-06-13 12:03:49 +0200246static __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
Jiri Kosinacc6e0bb2008-10-23 12:58:38 +0200288/* Sony Vaio VGX has wrongly mouse pointer declared as constant */
Nikolai Kondrashov73e40082010-08-06 23:03:06 +0400289static __u8 *sony_report_fixup(struct hid_device *hdev, __u8 *rdesc,
290 unsigned int *rsize)
Jiri Kosinacc6e0bb2008-10-23 12:58:38 +0200291{
292 struct sony_sc *sc = hid_get_drvdata(hdev);
293
Fernando Luis Vázquez Cao99d24902013-01-22 15:20:38 +0900294 /*
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) {
Fernando Luis Vázquez Caoa4649182013-01-15 19:40:48 +0900305 hid_info(hdev, "Fixing up Sony RF Receiver report descriptor\n");
Fernando Luis Vázquez Cao99d24902013-01-22 15:20:38 +0900306 /* input: data, variable, relative */
Jiri Kosinacc6e0bb2008-10-23 12:58:38 +0200307 rdesc[55] = 0x06;
308 }
Simon Wood61ab44b2011-06-10 12:00:26 +0200309
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));
Mauro Carvalho Chehabe57a67d2012-12-14 20:57:34 -0200317 } 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);
Simon Wood61ab44b2011-06-10 12:00:26 +0200323 }
Jiri Kosina078328d2013-06-13 12:03:49 +0200324
325 if (sc->quirks & PS3REMOTE)
326 return ps3remote_fixup(hdev, rdesc, rsize);
327
Nikolai Kondrashov73e40082010-08-06 23:03:06 +0400328 return rdesc;
Jiri Kosinacc6e0bb2008-10-23 12:58:38 +0200329}
330
Simon Woodc9e4d872011-06-10 12:00:27 +0200331static 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
Colin Leitnerf04d5142013-05-27 23:41:05 +0200350static 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
Jiri Kosina078328d2013-06-13 12:03:49 +0200379 if (sc->quirks & PS3REMOTE)
380 return ps3remote_mapping(hdev, hi, field, usage, bit, max);
381
Benjamin Tissoires6f498012013-07-24 16:53:07 +0200382 /* Let hid-core decide for the others */
383 return 0;
Colin Leitnerf04d5142013-05-27 23:41:05 +0200384}
385
Antonio Ospite5710fab2011-02-20 18:26:45 +0100386/*
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 */
Antonio Ospite569b10a2010-10-19 16:13:10 +0200396static 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
Antonio Ospite5710fab2011-02-20 18:26:45 +0100405 if (report_type == HID_OUTPUT_REPORT) {
406 /* Don't send the Report ID */
407 buf++;
408 count--;
409 }
410
Antonio Ospite569b10a2010-10-19 16:13:10 +0200411 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
Antonio Ospite5710fab2011-02-20 18:26:45 +0100418 /* Count also the Report ID, in case of an Output report. */
419 if (ret > 0 && report_type == HID_OUTPUT_REPORT)
420 ret++;
421
Antonio Ospite569b10a2010-10-19 16:13:10 +0200422 return ret;
423}
424
Jiri Slabybd28ce02008-06-25 23:47:04 +0200425/*
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 */
Antonio Ospite816651a2010-05-03 22:15:55 +0200430static int sixaxis_set_operational_usb(struct hid_device *hdev)
Jiri Slabybd28ce02008-06-25 23:47:04 +0200431{
Jiri Slabybd28ce02008-06-25 23:47:04 +0200432 int ret;
433 char *buf = kmalloc(18, GFP_KERNEL);
434
435 if (!buf)
436 return -ENOMEM;
437
Benjamin Tissoiresf204828a2013-09-11 22:12:25 +0200438 ret = hdev->hid_get_raw_report(hdev, 0xf2, buf, 17, HID_FEATURE_REPORT);
439
Jiri Slabybd28ce02008-06-25 23:47:04 +0200440 if (ret < 0)
Joe Perches4291ee32010-12-09 19:29:03 -0800441 hid_err(hdev, "can't set operational mode\n");
Jiri Slabybd28ce02008-06-25 23:47:04 +0200442
443 kfree(buf);
444
445 return ret;
446}
447
Antonio Ospite816651a2010-05-03 22:15:55 +0200448static int sixaxis_set_operational_bt(struct hid_device *hdev)
Bastien Noceraf9ce7c22010-01-20 12:01:53 +0000449{
Antonio Ospitefddb33f2010-05-03 17:19:03 +0200450 unsigned char buf[] = { 0xf4, 0x42, 0x03, 0x00, 0x00 };
Bastien Noceraf9ce7c22010-01-20 12:01:53 +0000451 return hdev->hid_output_raw_report(hdev, buf, sizeof(buf), HID_FEATURE_REPORT);
452}
453
Frank Praznik60781cf2014-01-11 15:13:15 -0500454static void buzz_set_leds(struct hid_device *hdev, const __u8 *leds)
Colin Leitnerf04d5142013-05-27 23:41:05 +0200455{
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;
Frank Praznik60781cf2014-01-11 15:13:15 -0500463 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;
Colin Leitnerf04d5142013-05-27 23:41:05 +0200467 value[5] = 0x00;
468 value[6] = 0x00;
469 hid_hw_request(hdev, report, HID_REQ_SET_REPORT);
470}
471
Frank Praznik60781cf2014-01-11 15:13:15 -0500472static void sony_set_leds(struct hid_device *hdev, const __u8 *leds, int count)
Sven Eckelmann0a286ef2013-11-19 20:26:32 +0100473{
474 struct sony_sc *drv_data = hid_get_drvdata(hdev);
Frank Praznik60781cf2014-01-11 15:13:15 -0500475 int n;
Sven Eckelmann0a286ef2013-11-19 20:26:32 +0100476
Frank Praznik60781cf2014-01-11 15:13:15 -0500477 BUG_ON(count > MAX_LEDS);
478
479 if (drv_data->quirks & BUZZ_CONTROLLER && count == 4) {
Sven Eckelmann0a286ef2013-11-19 20:26:32 +0100480 buzz_set_leds(hdev, leds);
Frank Praznik60781cf2014-01-11 15:13:15 -0500481 } else if ((drv_data->quirks & SIXAXIS_CONTROLLER_USB) ||
Frank Praznik8ab16762014-01-16 21:42:31 -0500482 (drv_data->quirks & DUALSHOCK4_CONTROLLER_USB)) {
Frank Praznik60781cf2014-01-11 15:13:15 -0500483 for (n = 0; n < count; n++)
484 drv_data->led_state[n] = leds[n];
Sven Eckelmann0a286ef2013-11-19 20:26:32 +0100485 schedule_work(&drv_data->state_worker);
486 }
487}
488
Sven Eckelmannc5382512013-11-19 20:26:30 +0100489static void sony_led_set_brightness(struct led_classdev *led,
Colin Leitnerf04d5142013-05-27 23:41:05 +0200490 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;
Colin Leitnerf04d5142013-05-27 23:41:05 +0200495
496 int n;
497
498 drv_data = hid_get_drvdata(hdev);
Sven Eckelmann2251b852013-11-19 20:26:31 +0100499 if (!drv_data) {
Colin Leitnerf04d5142013-05-27 23:41:05 +0200500 hid_err(hdev, "No device data\n");
501 return;
502 }
Colin Leitnerf04d5142013-05-27 23:41:05 +0200503
Frank Praznik60781cf2014-01-11 15:13:15 -0500504 for (n = 0; n < drv_data->led_count; n++) {
Sven Eckelmann2251b852013-11-19 20:26:31 +0100505 if (led == drv_data->leds[n]) {
Frank Praznik60781cf2014-01-11 15:13:15 -0500506 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);
Colin Leitnerf04d5142013-05-27 23:41:05 +0200509 }
510 break;
511 }
512 }
513}
514
Sven Eckelmannc5382512013-11-19 20:26:30 +0100515static enum led_brightness sony_led_get_brightness(struct led_classdev *led)
Colin Leitnerf04d5142013-05-27 23:41:05 +0200516{
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;
Colin Leitnerf04d5142013-05-27 23:41:05 +0200520
521 int n;
522 int on = 0;
523
524 drv_data = hid_get_drvdata(hdev);
Sven Eckelmann2251b852013-11-19 20:26:31 +0100525 if (!drv_data) {
Colin Leitnerf04d5142013-05-27 23:41:05 +0200526 hid_err(hdev, "No device data\n");
527 return LED_OFF;
528 }
Colin Leitnerf04d5142013-05-27 23:41:05 +0200529
Frank Praznik60781cf2014-01-11 15:13:15 -0500530 for (n = 0; n < drv_data->led_count; n++) {
Sven Eckelmann2251b852013-11-19 20:26:31 +0100531 if (led == drv_data->leds[n]) {
Frank Praznik60781cf2014-01-11 15:13:15 -0500532 on = !!(drv_data->led_state[n]);
Colin Leitnerf04d5142013-05-27 23:41:05 +0200533 break;
534 }
535 }
536
537 return on ? LED_FULL : LED_OFF;
538}
Colin Leitnerf04d5142013-05-27 23:41:05 +0200539
Sven Eckelmann0a286ef2013-11-19 20:26:32 +0100540static 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
Frank Praznik60781cf2014-01-11 15:13:15 -0500549 for (n = 0; n < drv_data->led_count; n++) {
Sven Eckelmann0a286ef2013-11-19 20:26:32 +0100550 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 }
Frank Praznik60781cf2014-01-11 15:13:15 -0500557
558 drv_data->led_count = 0;
Sven Eckelmann0a286ef2013-11-19 20:26:32 +0100559}
560
Sven Eckelmannc5382512013-11-19 20:26:30 +0100561static int sony_leds_init(struct hid_device *hdev)
Colin Leitnerf04d5142013-05-27 23:41:05 +0200562{
563 struct sony_sc *drv_data;
Jiri Kosina40e32ee2013-05-28 11:22:09 +0200564 int n, ret = 0;
Frank Praznik60781cf2014-01-11 15:13:15 -0500565 int max_brightness;
Jiri Kosina40e32ee2013-05-28 11:22:09 +0200566 struct led_classdev *led;
567 size_t name_sz;
568 char *name;
Sven Eckelmann0a286ef2013-11-19 20:26:32 +0100569 size_t name_len;
570 const char *name_fmt;
Frank Praznik60781cf2014-01-11 15:13:15 -0500571 static const __u8 initial_values[MAX_LEDS] = { 0x00, 0x00, 0x00, 0x00 };
Colin Leitnerf04d5142013-05-27 23:41:05 +0200572
573 drv_data = hid_get_drvdata(hdev);
Sven Eckelmann0a286ef2013-11-19 20:26:32 +0100574 BUG_ON(!(drv_data->quirks & SONY_LED_SUPPORT));
Colin Leitnerf04d5142013-05-27 23:41:05 +0200575
Sven Eckelmann0a286ef2013-11-19 20:26:32 +0100576 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 }
Kees Cook9446edb2013-09-11 21:56:52 +0200586
Frank Praznik8ab16762014-01-16 21:42:31 -0500587 if (drv_data->quirks & DUALSHOCK4_CONTROLLER_USB) {
Frank Praznik60781cf2014-01-11 15:13:15 -0500588 drv_data->led_count = 3;
589 max_brightness = 255;
590 } else {
591 drv_data->led_count = 4;
592 max_brightness = 1;
593 }
594
Colin Leitnerf04d5142013-05-27 23:41:05 +0200595 /* 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 */
Frank Praznik60781cf2014-01-11 15:13:15 -0500598 sony_set_leds(hdev, initial_values, drv_data->led_count);
Colin Leitnerf04d5142013-05-27 23:41:05 +0200599
Sven Eckelmann0a286ef2013-11-19 20:26:32 +0100600 name_sz = strlen(dev_name(&hdev->dev)) + name_len + 1;
Colin Leitnerf04d5142013-05-27 23:41:05 +0200601
Frank Praznik60781cf2014-01-11 15:13:15 -0500602 for (n = 0; n < drv_data->led_count; n++) {
Jiri Kosina40e32ee2013-05-28 11:22:09 +0200603 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);
Julia Lawall8cd5fcd2013-12-29 23:47:27 +0100606 ret = -ENOMEM;
Jiri Kosina40e32ee2013-05-28 11:22:09 +0200607 goto error_leds;
Colin Leitnerf04d5142013-05-27 23:41:05 +0200608 }
Jiri Kosina40e32ee2013-05-28 11:22:09 +0200609
610 name = (void *)(&led[1]);
Sven Eckelmann0a286ef2013-11-19 20:26:32 +0100611 snprintf(name, name_sz, name_fmt, dev_name(&hdev->dev), n + 1);
Jiri Kosina40e32ee2013-05-28 11:22:09 +0200612 led->name = name;
613 led->brightness = 0;
Frank Praznik60781cf2014-01-11 15:13:15 -0500614 led->max_brightness = max_brightness;
Sven Eckelmannc5382512013-11-19 20:26:30 +0100615 led->brightness_get = sony_led_get_brightness;
616 led->brightness_set = sony_led_set_brightness;
Jiri Kosina40e32ee2013-05-28 11:22:09 +0200617
Julia Lawall8cd5fcd2013-12-29 23:47:27 +0100618 ret = led_classdev_register(&hdev->dev, led);
619 if (ret) {
Jiri Kosina40e32ee2013-05-28 11:22:09 +0200620 hid_err(hdev, "Failed to register LED %d\n", n);
621 kfree(led);
622 goto error_leds;
623 }
624
Sven Eckelmann2251b852013-11-19 20:26:31 +0100625 drv_data->leds[n] = led;
Colin Leitnerf04d5142013-05-27 23:41:05 +0200626 }
Colin Leitnerf04d5142013-05-27 23:41:05 +0200627
628 return ret;
629
Colin Leitnerf04d5142013-05-27 23:41:05 +0200630error_leds:
Sven Eckelmann0a286ef2013-11-19 20:26:32 +0100631 sony_leds_remove(hdev);
Colin Leitnerf04d5142013-05-27 23:41:05 +0200632
Colin Leitnerf04d5142013-05-27 23:41:05 +0200633 return ret;
Colin Leitnerf04d5142013-05-27 23:41:05 +0200634}
635
Frank Praznikcad665a2014-01-11 15:13:54 -0500636static void sixaxis_state_worker(struct work_struct *work)
Sven Eckelmanna08c22c2013-11-09 19:25:57 +0100637{
Sven Eckelmann92b5c412013-11-19 20:26:28 +0100638 struct sony_sc *sc = container_of(work, struct sony_sc, state_worker);
Sven Eckelmanna08c22c2013-11-09 19:25:57 +0100639 unsigned char buf[] = {
640 0x01,
641 0x00, 0xff, 0x00, 0xff, 0x00,
Sven Eckelmann0a286ef2013-11-19 20:26:32 +0100642 0x00, 0x00, 0x00, 0x00, 0x00,
Sven Eckelmanna08c22c2013-11-09 19:25:57 +0100643 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 };
Sven Eckelmann9f323b62013-11-17 20:38:21 +0100649
Sven Eckelmann0a286ef2013-11-19 20:26:32 +0100650#ifdef CONFIG_SONY_FF
Frank Praznik0bd88dd2014-01-11 15:12:42 -0500651 buf[3] = sc->right ? 1 : 0;
Sven Eckelmann9f323b62013-11-17 20:38:21 +0100652 buf[5] = sc->left;
Sven Eckelmann0a286ef2013-11-19 20:26:32 +0100653#endif
654
Frank Praznik60781cf2014-01-11 15:13:15 -0500655 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;
Sven Eckelmann9f323b62013-11-17 20:38:21 +0100659
660 sc->hdev->hid_output_raw_report(sc->hdev, buf, sizeof(buf),
661 HID_OUTPUT_REPORT);
662}
663
Frank Praznik0bd88dd2014-01-11 15:12:42 -0500664static void dualshock4_state_worker(struct work_struct *work)
665{
666 struct sony_sc *sc = container_of(work, struct sony_sc, state_worker);
Frank Praznik0da8ea62014-01-16 21:42:51 -0500667 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;
Frank Praznik0bd88dd2014-01-11 15:12:42 -0500689
690#ifdef CONFIG_SONY_FF
Frank Praznik0da8ea62014-01-16 21:42:51 -0500691 value[3] = sc->right;
692 value[4] = sc->left;
Frank Praznik0bd88dd2014-01-11 15:12:42 -0500693#endif
694
Frank Praznik0da8ea62014-01-16 21:42:51 -0500695 value[5] = sc->led_state[0];
696 value[6] = sc->led_state[1];
697 value[7] = sc->led_state[2];
Frank Praznik60781cf2014-01-11 15:13:15 -0500698
Frank Praznik0da8ea62014-01-16 21:42:51 -0500699 hid_hw_request(hdev, report, HID_REQ_SET_REPORT);
Frank Praznik0bd88dd2014-01-11 15:12:42 -0500700}
701
Sven Eckelmann0a286ef2013-11-19 20:26:32 +0100702#ifdef CONFIG_SONY_FF
Sven Eckelmann9f323b62013-11-17 20:38:21 +0100703static int sony_play_effect(struct input_dev *dev, void *data,
704 struct ff_effect *effect)
705{
Sven Eckelmanna08c22c2013-11-09 19:25:57 +0100706 struct hid_device *hid = input_get_drvdata(dev);
Sven Eckelmann9f323b62013-11-17 20:38:21 +0100707 struct sony_sc *sc = hid_get_drvdata(hid);
Sven Eckelmanna08c22c2013-11-09 19:25:57 +0100708
709 if (effect->type != FF_RUMBLE)
710 return 0;
711
Sven Eckelmann9f323b62013-11-17 20:38:21 +0100712 sc->left = effect->u.rumble.strong_magnitude / 256;
Frank Praznik0bd88dd2014-01-11 15:12:42 -0500713 sc->right = effect->u.rumble.weak_magnitude / 256;
Sven Eckelmanna08c22c2013-11-09 19:25:57 +0100714
Sven Eckelmann92b5c412013-11-19 20:26:28 +0100715 schedule_work(&sc->state_worker);
Sven Eckelmann9f323b62013-11-17 20:38:21 +0100716 return 0;
Sven Eckelmanna08c22c2013-11-09 19:25:57 +0100717}
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
Sven Eckelmann9f323b62013-11-17 20:38:21 +0100729static void sony_destroy_ff(struct hid_device *hdev)
730{
731 struct sony_sc *sc = hid_get_drvdata(hdev);
732
Sven Eckelmann92b5c412013-11-19 20:26:28 +0100733 cancel_work_sync(&sc->state_worker);
Sven Eckelmann9f323b62013-11-17 20:38:21 +0100734}
735
Sven Eckelmanna08c22c2013-11-09 19:25:57 +0100736#else
737static int sony_init_ff(struct hid_device *hdev)
738{
739 return 0;
740}
Sven Eckelmann9f323b62013-11-17 20:38:21 +0100741
742static void sony_destroy_ff(struct hid_device *hdev)
743{
744}
Sven Eckelmanna08c22c2013-11-09 19:25:57 +0100745#endif
746
Jiri Slabybd28ce02008-06-25 23:47:04 +0200747static int sony_probe(struct hid_device *hdev, const struct hid_device_id *id)
748{
749 int ret;
Jiri Kosinacc6e0bb2008-10-23 12:58:38 +0200750 unsigned long quirks = id->driver_data;
751 struct sony_sc *sc;
Colin Leitnerf04d5142013-05-27 23:41:05 +0200752 unsigned int connect_mask = HID_CONNECT_DEFAULT;
Jiri Kosinacc6e0bb2008-10-23 12:58:38 +0200753
Benjamin Tissoiresabf832b2013-07-24 19:38:04 +0200754 sc = devm_kzalloc(&hdev->dev, sizeof(*sc), GFP_KERNEL);
Jiri Kosinacc6e0bb2008-10-23 12:58:38 +0200755 if (sc == NULL) {
Joe Perches4291ee32010-12-09 19:29:03 -0800756 hid_err(hdev, "can't alloc sony descriptor\n");
Jiri Kosinacc6e0bb2008-10-23 12:58:38 +0200757 return -ENOMEM;
758 }
759
760 sc->quirks = quirks;
761 hid_set_drvdata(hdev, sc);
Sven Eckelmann0a286ef2013-11-19 20:26:32 +0100762 sc->hdev = hdev;
Jiri Slabybd28ce02008-06-25 23:47:04 +0200763
Jiri Slabybd28ce02008-06-25 23:47:04 +0200764 ret = hid_parse(hdev);
765 if (ret) {
Joe Perches4291ee32010-12-09 19:29:03 -0800766 hid_err(hdev, "parse failed\n");
Benjamin Tissoiresabf832b2013-07-24 19:38:04 +0200767 return ret;
Jiri Slabybd28ce02008-06-25 23:47:04 +0200768 }
769
Colin Leitnerf04d5142013-05-27 23:41:05 +0200770 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);
Jiri Slabybd28ce02008-06-25 23:47:04 +0200778 if (ret) {
Joe Perches4291ee32010-12-09 19:29:03 -0800779 hid_err(hdev, "hw start failed\n");
Benjamin Tissoiresabf832b2013-07-24 19:38:04 +0200780 return ret;
Jiri Slabybd28ce02008-06-25 23:47:04 +0200781 }
782
Antonio Ospite569b10a2010-10-19 16:13:10 +0200783 if (sc->quirks & SIXAXIS_CONTROLLER_USB) {
784 hdev->hid_output_raw_report = sixaxis_usb_output_raw_report;
Antonio Ospite816651a2010-05-03 22:15:55 +0200785 ret = sixaxis_set_operational_usb(hdev);
Frank Praznikcad665a2014-01-11 15:13:54 -0500786 INIT_WORK(&sc->state_worker, sixaxis_state_worker);
Antonio Ospite569b10a2010-10-19 16:13:10 +0200787 }
Antonio Ospite816651a2010-05-03 22:15:55 +0200788 else if (sc->quirks & SIXAXIS_CONTROLLER_BT)
789 ret = sixaxis_set_operational_bt(hdev);
Frank Praznik8ab16762014-01-16 21:42:31 -0500790 else if (sc->quirks & DUALSHOCK4_CONTROLLER_USB) {
Bastien Noceraf9ce7c22010-01-20 12:01:53 +0000791 ret = 0;
Frank Praznik0bd88dd2014-01-11 15:12:42 -0500792 INIT_WORK(&sc->state_worker, dualshock4_state_worker);
793 } else {
794 ret = 0;
795 }
Bastien Noceraf9ce7c22010-01-20 12:01:53 +0000796
Jiri Kosina4dfdc462008-12-30 00:49:59 +0100797 if (ret < 0)
Jiri Slabybd28ce02008-06-25 23:47:04 +0200798 goto err_stop;
799
Sven Eckelmann0a286ef2013-11-19 20:26:32 +0100800 if (sc->quirks & SONY_LED_SUPPORT) {
801 ret = sony_leds_init(hdev);
802 if (ret < 0)
803 goto err_stop;
804 }
805
Sven Eckelmanna08c22c2013-11-09 19:25:57 +0100806 ret = sony_init_ff(hdev);
807 if (ret < 0)
808 goto err_stop;
809
Jiri Slabybd28ce02008-06-25 23:47:04 +0200810 return 0;
811err_stop:
Sven Eckelmann0a286ef2013-11-19 20:26:32 +0100812 if (sc->quirks & SONY_LED_SUPPORT)
813 sony_leds_remove(hdev);
Jiri Slabybd28ce02008-06-25 23:47:04 +0200814 hid_hw_stop(hdev);
Jiri Slabybd28ce02008-06-25 23:47:04 +0200815 return ret;
816}
817
Jiri Kosinacc6e0bb2008-10-23 12:58:38 +0200818static void sony_remove(struct hid_device *hdev)
819{
Colin Leitnerf04d5142013-05-27 23:41:05 +0200820 struct sony_sc *sc = hid_get_drvdata(hdev);
821
Sven Eckelmann0a286ef2013-11-19 20:26:32 +0100822 if (sc->quirks & SONY_LED_SUPPORT)
Sven Eckelmannc5382512013-11-19 20:26:30 +0100823 sony_leds_remove(hdev);
Colin Leitnerf04d5142013-05-27 23:41:05 +0200824
Sven Eckelmann9f323b62013-11-17 20:38:21 +0100825 sony_destroy_ff(hdev);
826
Jiri Kosinacc6e0bb2008-10-23 12:58:38 +0200827 hid_hw_stop(hdev);
Jiri Kosinacc6e0bb2008-10-23 12:58:38 +0200828}
829
Jiri Slabybd28ce02008-06-25 23:47:04 +0200830static const struct hid_device_id sony_devices[] = {
Antonio Ospite816651a2010-05-03 22:15:55 +0200831 { HID_USB_DEVICE(USB_VENDOR_ID_SONY, USB_DEVICE_ID_SONY_PS3_CONTROLLER),
832 .driver_data = SIXAXIS_CONTROLLER_USB },
Jiri Kosina35dca5b2011-04-28 15:43:13 +0200833 { HID_USB_DEVICE(USB_VENDOR_ID_SONY, USB_DEVICE_ID_SONY_NAVIGATION_CONTROLLER),
834 .driver_data = SIXAXIS_CONTROLLER_USB },
Antonio Ospite816651a2010-05-03 22:15:55 +0200835 { HID_BLUETOOTH_DEVICE(USB_VENDOR_ID_SONY, USB_DEVICE_ID_SONY_PS3_CONTROLLER),
836 .driver_data = SIXAXIS_CONTROLLER_BT },
Jiri Kosinacc6e0bb2008-10-23 12:58:38 +0200837 { HID_USB_DEVICE(USB_VENDOR_ID_SONY, USB_DEVICE_ID_SONY_VAIO_VGX_MOUSE),
838 .driver_data = VAIO_RDESC_CONSTANT },
Fernando Luis Vázquez Caoa4649182013-01-15 19:40:48 +0900839 { HID_USB_DEVICE(USB_VENDOR_ID_SONY, USB_DEVICE_ID_SONY_VAIO_VGP_MOUSE),
840 .driver_data = VAIO_RDESC_CONSTANT },
Colin Leitnerf04d5142013-05-27 23:41:05 +0200841 /* 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 },
Jiri Kosina078328d2013-06-13 12:03:49 +0200847 /* 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 },
Frank Praznik0bd88dd2014-01-11 15:12:42 -0500853 /* Sony Dualshock 4 controllers for PS4 */
854 { HID_USB_DEVICE(USB_VENDOR_ID_SONY, USB_DEVICE_ID_SONY_PS4_CONTROLLER),
Frank Praznik8ab16762014-01-16 21:42:31 -0500855 .driver_data = DUALSHOCK4_CONTROLLER_USB },
Frank Praznik0bd88dd2014-01-11 15:12:42 -0500856 { HID_BLUETOOTH_DEVICE(USB_VENDOR_ID_SONY, USB_DEVICE_ID_SONY_PS4_CONTROLLER),
Frank Praznik8ab16762014-01-16 21:42:31 -0500857 .driver_data = DUALSHOCK4_CONTROLLER_BT },
Jiri Slabybd28ce02008-06-25 23:47:04 +0200858 { }
859};
860MODULE_DEVICE_TABLE(hid, sony_devices);
861
862static struct hid_driver sony_driver = {
Colin Leitnerf04d5142013-05-27 23:41:05 +0200863 .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
Jiri Slabybd28ce02008-06-25 23:47:04 +0200870};
H Hartley Sweetenf4254582012-12-17 15:28:26 -0700871module_hid_driver(sony_driver);
Jiri Slabybd28ce02008-06-25 23:47:04 +0200872
Jiri Slabybd28ce02008-06-25 23:47:04 +0200873MODULE_LICENSE("GPL");