blob: 1dfed2365d4041f84bdbee1e515b7b54d087c018 [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
Sven Eckelmannf1c458c2013-11-19 20:26:29 +010036#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 Praznik0bd88dd2014-01-11 15:12:42 -050041#define DUALSHOCK4_CONTROLLER BIT(5)
Jiri Kosinacc6e0bb2008-10-23 12:58:38 +020042
Frank Praznik60781cf2014-01-11 15:13:15 -050043#define SONY_LED_SUPPORT (SIXAXIS_CONTROLLER_USB | BUZZ_CONTROLLER | DUALSHOCK4_CONTROLLER)
44
45#define MAX_LEDS 4
Sven Eckelmann0a286ef2013-11-19 20:26:32 +010046
Simon Wood61ab44b2011-06-10 12:00:26 +020047static const u8 sixaxis_rdesc_fixup[] = {
48 0x95, 0x13, 0x09, 0x01, 0x81, 0x02, 0x95, 0x0C,
49 0x81, 0x01, 0x75, 0x10, 0x95, 0x04, 0x26, 0xFF,
50 0x03, 0x46, 0xFF, 0x03, 0x09, 0x01, 0x81, 0x02
51};
52
Mauro Carvalho Chehabe57a67d2012-12-14 20:57:34 -020053static const u8 sixaxis_rdesc_fixup2[] = {
54 0x05, 0x01, 0x09, 0x04, 0xa1, 0x01, 0xa1, 0x02,
55 0x85, 0x01, 0x75, 0x08, 0x95, 0x01, 0x15, 0x00,
56 0x26, 0xff, 0x00, 0x81, 0x03, 0x75, 0x01, 0x95,
57 0x13, 0x15, 0x00, 0x25, 0x01, 0x35, 0x00, 0x45,
58 0x01, 0x05, 0x09, 0x19, 0x01, 0x29, 0x13, 0x81,
59 0x02, 0x75, 0x01, 0x95, 0x0d, 0x06, 0x00, 0xff,
60 0x81, 0x03, 0x15, 0x00, 0x26, 0xff, 0x00, 0x05,
61 0x01, 0x09, 0x01, 0xa1, 0x00, 0x75, 0x08, 0x95,
62 0x04, 0x35, 0x00, 0x46, 0xff, 0x00, 0x09, 0x30,
63 0x09, 0x31, 0x09, 0x32, 0x09, 0x35, 0x81, 0x02,
64 0xc0, 0x05, 0x01, 0x95, 0x13, 0x09, 0x01, 0x81,
65 0x02, 0x95, 0x0c, 0x81, 0x01, 0x75, 0x10, 0x95,
66 0x04, 0x26, 0xff, 0x03, 0x46, 0xff, 0x03, 0x09,
67 0x01, 0x81, 0x02, 0xc0, 0xa1, 0x02, 0x85, 0x02,
68 0x75, 0x08, 0x95, 0x30, 0x09, 0x01, 0xb1, 0x02,
69 0xc0, 0xa1, 0x02, 0x85, 0xee, 0x75, 0x08, 0x95,
70 0x30, 0x09, 0x01, 0xb1, 0x02, 0xc0, 0xa1, 0x02,
71 0x85, 0xef, 0x75, 0x08, 0x95, 0x30, 0x09, 0x01,
72 0xb1, 0x02, 0xc0, 0xc0,
73};
74
Jiri Kosina078328d2013-06-13 12:03:49 +020075static __u8 ps3remote_rdesc[] = {
76 0x05, 0x01, /* GUsagePage Generic Desktop */
77 0x09, 0x05, /* LUsage 0x05 [Game Pad] */
78 0xA1, 0x01, /* MCollection Application (mouse, keyboard) */
79
80 /* Use collection 1 for joypad buttons */
81 0xA1, 0x02, /* MCollection Logical (interrelated data) */
82
83 /* Ignore the 1st byte, maybe it is used for a controller
84 * number but it's not needed for correct operation */
85 0x75, 0x08, /* GReportSize 0x08 [8] */
86 0x95, 0x01, /* GReportCount 0x01 [1] */
87 0x81, 0x01, /* MInput 0x01 (Const[0] Arr[1] Abs[2]) */
88
89 /* Bytes from 2nd to 4th are a bitmap for joypad buttons, for these
90 * buttons multiple keypresses are allowed */
91 0x05, 0x09, /* GUsagePage Button */
92 0x19, 0x01, /* LUsageMinimum 0x01 [Button 1 (primary/trigger)] */
93 0x29, 0x18, /* LUsageMaximum 0x18 [Button 24] */
94 0x14, /* GLogicalMinimum [0] */
95 0x25, 0x01, /* GLogicalMaximum 0x01 [1] */
96 0x75, 0x01, /* GReportSize 0x01 [1] */
97 0x95, 0x18, /* GReportCount 0x18 [24] */
98 0x81, 0x02, /* MInput 0x02 (Data[0] Var[1] Abs[2]) */
99
100 0xC0, /* MEndCollection */
101
102 /* Use collection 2 for remote control buttons */
103 0xA1, 0x02, /* MCollection Logical (interrelated data) */
104
105 /* 5th byte is used for remote control buttons */
106 0x05, 0x09, /* GUsagePage Button */
107 0x18, /* LUsageMinimum [No button pressed] */
108 0x29, 0xFE, /* LUsageMaximum 0xFE [Button 254] */
109 0x14, /* GLogicalMinimum [0] */
110 0x26, 0xFE, 0x00, /* GLogicalMaximum 0x00FE [254] */
111 0x75, 0x08, /* GReportSize 0x08 [8] */
112 0x95, 0x01, /* GReportCount 0x01 [1] */
113 0x80, /* MInput */
114
115 /* Ignore bytes from 6th to 11th, 6th to 10th are always constant at
116 * 0xff and 11th is for press indication */
117 0x75, 0x08, /* GReportSize 0x08 [8] */
118 0x95, 0x06, /* GReportCount 0x06 [6] */
119 0x81, 0x01, /* MInput 0x01 (Const[0] Arr[1] Abs[2]) */
120
121 /* 12th byte is for battery strength */
122 0x05, 0x06, /* GUsagePage Generic Device Controls */
123 0x09, 0x20, /* LUsage 0x20 [Battery Strength] */
124 0x14, /* GLogicalMinimum [0] */
125 0x25, 0x05, /* GLogicalMaximum 0x05 [5] */
126 0x75, 0x08, /* GReportSize 0x08 [8] */
127 0x95, 0x01, /* GReportCount 0x01 [1] */
128 0x81, 0x02, /* MInput 0x02 (Data[0] Var[1] Abs[2]) */
129
130 0xC0, /* MEndCollection */
131
132 0xC0 /* MEndCollection [Game Pad] */
133};
134
135static const unsigned int ps3remote_keymap_joypad_buttons[] = {
136 [0x01] = KEY_SELECT,
137 [0x02] = BTN_THUMBL, /* L3 */
138 [0x03] = BTN_THUMBR, /* R3 */
139 [0x04] = BTN_START,
140 [0x05] = KEY_UP,
141 [0x06] = KEY_RIGHT,
142 [0x07] = KEY_DOWN,
143 [0x08] = KEY_LEFT,
144 [0x09] = BTN_TL2, /* L2 */
145 [0x0a] = BTN_TR2, /* R2 */
146 [0x0b] = BTN_TL, /* L1 */
147 [0x0c] = BTN_TR, /* R1 */
148 [0x0d] = KEY_OPTION, /* options/triangle */
149 [0x0e] = KEY_BACK, /* back/circle */
150 [0x0f] = BTN_0, /* cross */
151 [0x10] = KEY_SCREEN, /* view/square */
152 [0x11] = KEY_HOMEPAGE, /* PS button */
153 [0x14] = KEY_ENTER,
154};
155static const unsigned int ps3remote_keymap_remote_buttons[] = {
156 [0x00] = KEY_1,
157 [0x01] = KEY_2,
158 [0x02] = KEY_3,
159 [0x03] = KEY_4,
160 [0x04] = KEY_5,
161 [0x05] = KEY_6,
162 [0x06] = KEY_7,
163 [0x07] = KEY_8,
164 [0x08] = KEY_9,
165 [0x09] = KEY_0,
166 [0x0e] = KEY_ESC, /* return */
167 [0x0f] = KEY_CLEAR,
168 [0x16] = KEY_EJECTCD,
169 [0x1a] = KEY_MENU, /* top menu */
170 [0x28] = KEY_TIME,
171 [0x30] = KEY_PREVIOUS,
172 [0x31] = KEY_NEXT,
173 [0x32] = KEY_PLAY,
174 [0x33] = KEY_REWIND, /* scan back */
175 [0x34] = KEY_FORWARD, /* scan forward */
176 [0x38] = KEY_STOP,
177 [0x39] = KEY_PAUSE,
178 [0x40] = KEY_CONTEXT_MENU, /* pop up/menu */
179 [0x60] = KEY_FRAMEBACK, /* slow/step back */
180 [0x61] = KEY_FRAMEFORWARD, /* slow/step forward */
181 [0x63] = KEY_SUBTITLE,
182 [0x64] = KEY_AUDIO,
183 [0x65] = KEY_ANGLE,
184 [0x70] = KEY_INFO, /* display */
185 [0x80] = KEY_BLUE,
186 [0x81] = KEY_RED,
187 [0x82] = KEY_GREEN,
188 [0x83] = KEY_YELLOW,
189};
190
Colin Leitnerf04d5142013-05-27 23:41:05 +0200191static const unsigned int buzz_keymap[] = {
192 /* The controller has 4 remote buzzers, each with one LED and 5
193 * buttons.
194 *
195 * We use the mapping chosen by the controller, which is:
196 *
197 * Key Offset
198 * -------------------
199 * Buzz 1
200 * Blue 5
201 * Orange 4
202 * Green 3
203 * Yellow 2
204 *
205 * So, for example, the orange button on the third buzzer is mapped to
206 * BTN_TRIGGER_HAPPY14
207 */
208 [ 1] = BTN_TRIGGER_HAPPY1,
209 [ 2] = BTN_TRIGGER_HAPPY2,
210 [ 3] = BTN_TRIGGER_HAPPY3,
211 [ 4] = BTN_TRIGGER_HAPPY4,
212 [ 5] = BTN_TRIGGER_HAPPY5,
213 [ 6] = BTN_TRIGGER_HAPPY6,
214 [ 7] = BTN_TRIGGER_HAPPY7,
215 [ 8] = BTN_TRIGGER_HAPPY8,
216 [ 9] = BTN_TRIGGER_HAPPY9,
217 [10] = BTN_TRIGGER_HAPPY10,
218 [11] = BTN_TRIGGER_HAPPY11,
219 [12] = BTN_TRIGGER_HAPPY12,
220 [13] = BTN_TRIGGER_HAPPY13,
221 [14] = BTN_TRIGGER_HAPPY14,
222 [15] = BTN_TRIGGER_HAPPY15,
223 [16] = BTN_TRIGGER_HAPPY16,
224 [17] = BTN_TRIGGER_HAPPY17,
225 [18] = BTN_TRIGGER_HAPPY18,
226 [19] = BTN_TRIGGER_HAPPY19,
227 [20] = BTN_TRIGGER_HAPPY20,
228};
229
Jiri Kosinacc6e0bb2008-10-23 12:58:38 +0200230struct sony_sc {
Sven Eckelmann0a286ef2013-11-19 20:26:32 +0100231 struct hid_device *hdev;
Frank Praznik60781cf2014-01-11 15:13:15 -0500232 struct led_classdev *leds[MAX_LEDS];
Jiri Kosinacc6e0bb2008-10-23 12:58:38 +0200233 unsigned long quirks;
Sven Eckelmann0a286ef2013-11-19 20:26:32 +0100234 struct work_struct state_worker;
Colin Leitnerf04d5142013-05-27 23:41:05 +0200235
Sven Eckelmann9f323b62013-11-17 20:38:21 +0100236#ifdef CONFIG_SONY_FF
Sven Eckelmann9f323b62013-11-17 20:38:21 +0100237 __u8 left;
238 __u8 right;
239#endif
240
Frank Praznik60781cf2014-01-11 15:13:15 -0500241 __u8 led_state[MAX_LEDS];
242 __u8 led_count;
Jiri Kosinacc6e0bb2008-10-23 12:58:38 +0200243};
244
Jiri Kosina078328d2013-06-13 12:03:49 +0200245static __u8 *ps3remote_fixup(struct hid_device *hdev, __u8 *rdesc,
246 unsigned int *rsize)
247{
248 *rsize = sizeof(ps3remote_rdesc);
249 return ps3remote_rdesc;
250}
251
252static int ps3remote_mapping(struct hid_device *hdev, struct hid_input *hi,
253 struct hid_field *field, struct hid_usage *usage,
254 unsigned long **bit, int *max)
255{
256 unsigned int key = usage->hid & HID_USAGE;
257
258 if ((usage->hid & HID_USAGE_PAGE) != HID_UP_BUTTON)
259 return -1;
260
261 switch (usage->collection_index) {
262 case 1:
263 if (key >= ARRAY_SIZE(ps3remote_keymap_joypad_buttons))
264 return -1;
265
266 key = ps3remote_keymap_joypad_buttons[key];
267 if (!key)
268 return -1;
269 break;
270 case 2:
271 if (key >= ARRAY_SIZE(ps3remote_keymap_remote_buttons))
272 return -1;
273
274 key = ps3remote_keymap_remote_buttons[key];
275 if (!key)
276 return -1;
277 break;
278 default:
279 return -1;
280 }
281
282 hid_map_usage_clear(hi, usage, bit, max, EV_KEY, key);
283 return 1;
284}
285
286
Jiri Kosinacc6e0bb2008-10-23 12:58:38 +0200287/* Sony Vaio VGX has wrongly mouse pointer declared as constant */
Nikolai Kondrashov73e40082010-08-06 23:03:06 +0400288static __u8 *sony_report_fixup(struct hid_device *hdev, __u8 *rdesc,
289 unsigned int *rsize)
Jiri Kosinacc6e0bb2008-10-23 12:58:38 +0200290{
291 struct sony_sc *sc = hid_get_drvdata(hdev);
292
Fernando Luis Vázquez Cao99d24902013-01-22 15:20:38 +0900293 /*
294 * Some Sony RF receivers wrongly declare the mouse pointer as a
295 * a constant non-data variable.
296 */
297 if ((sc->quirks & VAIO_RDESC_CONSTANT) && *rsize >= 56 &&
298 /* usage page: generic desktop controls */
299 /* rdesc[0] == 0x05 && rdesc[1] == 0x01 && */
300 /* usage: mouse */
301 rdesc[2] == 0x09 && rdesc[3] == 0x02 &&
302 /* input (usage page for x,y axes): constant, variable, relative */
303 rdesc[54] == 0x81 && rdesc[55] == 0x07) {
Fernando Luis Vázquez Caoa46491842013-01-15 19:40:48 +0900304 hid_info(hdev, "Fixing up Sony RF Receiver report descriptor\n");
Fernando Luis Vázquez Cao99d24902013-01-22 15:20:38 +0900305 /* input: data, variable, relative */
Jiri Kosinacc6e0bb2008-10-23 12:58:38 +0200306 rdesc[55] = 0x06;
307 }
Simon Wood61ab44b2011-06-10 12:00:26 +0200308
309 /* The HID descriptor exposed over BT has a trailing zero byte */
310 if ((((sc->quirks & SIXAXIS_CONTROLLER_USB) && *rsize == 148) ||
311 ((sc->quirks & SIXAXIS_CONTROLLER_BT) && *rsize == 149)) &&
312 rdesc[83] == 0x75) {
313 hid_info(hdev, "Fixing up Sony Sixaxis report descriptor\n");
314 memcpy((void *)&rdesc[83], (void *)&sixaxis_rdesc_fixup,
315 sizeof(sixaxis_rdesc_fixup));
Mauro Carvalho Chehabe57a67d2012-12-14 20:57:34 -0200316 } else if (sc->quirks & SIXAXIS_CONTROLLER_USB &&
317 *rsize > sizeof(sixaxis_rdesc_fixup2)) {
318 hid_info(hdev, "Sony Sixaxis clone detected. Using original report descriptor (size: %d clone; %d new)\n",
319 *rsize, (int)sizeof(sixaxis_rdesc_fixup2));
320 *rsize = sizeof(sixaxis_rdesc_fixup2);
321 memcpy(rdesc, &sixaxis_rdesc_fixup2, *rsize);
Simon Wood61ab44b2011-06-10 12:00:26 +0200322 }
Jiri Kosina078328d2013-06-13 12:03:49 +0200323
324 if (sc->quirks & PS3REMOTE)
325 return ps3remote_fixup(hdev, rdesc, rsize);
326
Nikolai Kondrashov73e40082010-08-06 23:03:06 +0400327 return rdesc;
Jiri Kosinacc6e0bb2008-10-23 12:58:38 +0200328}
329
Simon Woodc9e4d872011-06-10 12:00:27 +0200330static int sony_raw_event(struct hid_device *hdev, struct hid_report *report,
331 __u8 *rd, int size)
332{
333 struct sony_sc *sc = hid_get_drvdata(hdev);
334
335 /* Sixaxis HID report has acclerometers/gyro with MSByte first, this
336 * has to be BYTE_SWAPPED before passing up to joystick interface
337 */
338 if ((sc->quirks & (SIXAXIS_CONTROLLER_USB | SIXAXIS_CONTROLLER_BT)) &&
339 rd[0] == 0x01 && size == 49) {
340 swap(rd[41], rd[42]);
341 swap(rd[43], rd[44]);
342 swap(rd[45], rd[46]);
343 swap(rd[47], rd[48]);
344 }
345
346 return 0;
347}
348
Colin Leitnerf04d5142013-05-27 23:41:05 +0200349static int sony_mapping(struct hid_device *hdev, struct hid_input *hi,
350 struct hid_field *field, struct hid_usage *usage,
351 unsigned long **bit, int *max)
352{
353 struct sony_sc *sc = hid_get_drvdata(hdev);
354
355 if (sc->quirks & BUZZ_CONTROLLER) {
356 unsigned int key = usage->hid & HID_USAGE;
357
358 if ((usage->hid & HID_USAGE_PAGE) != HID_UP_BUTTON)
359 return -1;
360
361 switch (usage->collection_index) {
362 case 1:
363 if (key >= ARRAY_SIZE(buzz_keymap))
364 return -1;
365
366 key = buzz_keymap[key];
367 if (!key)
368 return -1;
369 break;
370 default:
371 return -1;
372 }
373
374 hid_map_usage_clear(hi, usage, bit, max, EV_KEY, key);
375 return 1;
376 }
377
Jiri Kosina078328d2013-06-13 12:03:49 +0200378 if (sc->quirks & PS3REMOTE)
379 return ps3remote_mapping(hdev, hi, field, usage, bit, max);
380
Benjamin Tissoires6f498012013-07-24 16:53:07 +0200381 /* Let hid-core decide for the others */
382 return 0;
Colin Leitnerf04d5142013-05-27 23:41:05 +0200383}
384
Antonio Ospite5710fab2011-02-20 18:26:45 +0100385/*
386 * The Sony Sixaxis does not handle HID Output Reports on the Interrupt EP
387 * like it should according to usbhid/hid-core.c::usbhid_output_raw_report()
388 * so we need to override that forcing HID Output Reports on the Control EP.
389 *
390 * There is also another issue about HID Output Reports via USB, the Sixaxis
391 * does not want the report_id as part of the data packet, so we have to
392 * discard buf[0] when sending the actual control message, even for numbered
393 * reports, humpf!
394 */
Antonio Ospite569b10a2010-10-19 16:13:10 +0200395static int sixaxis_usb_output_raw_report(struct hid_device *hid, __u8 *buf,
396 size_t count, unsigned char report_type)
397{
398 struct usb_interface *intf = to_usb_interface(hid->dev.parent);
399 struct usb_device *dev = interface_to_usbdev(intf);
400 struct usb_host_interface *interface = intf->cur_altsetting;
401 int report_id = buf[0];
402 int ret;
403
Antonio Ospite5710fab2011-02-20 18:26:45 +0100404 if (report_type == HID_OUTPUT_REPORT) {
405 /* Don't send the Report ID */
406 buf++;
407 count--;
408 }
409
Antonio Ospite569b10a2010-10-19 16:13:10 +0200410 ret = usb_control_msg(dev, usb_sndctrlpipe(dev, 0),
411 HID_REQ_SET_REPORT,
412 USB_DIR_OUT | USB_TYPE_CLASS | USB_RECIP_INTERFACE,
413 ((report_type + 1) << 8) | report_id,
414 interface->desc.bInterfaceNumber, buf, count,
415 USB_CTRL_SET_TIMEOUT);
416
Antonio Ospite5710fab2011-02-20 18:26:45 +0100417 /* Count also the Report ID, in case of an Output report. */
418 if (ret > 0 && report_type == HID_OUTPUT_REPORT)
419 ret++;
420
Antonio Ospite569b10a2010-10-19 16:13:10 +0200421 return ret;
422}
423
Jiri Slabybd28ce02008-06-25 23:47:04 +0200424/*
425 * Sending HID_REQ_GET_REPORT changes the operation mode of the ps3 controller
426 * to "operational". Without this, the ps3 controller will not report any
427 * events.
428 */
Antonio Ospite816651a2010-05-03 22:15:55 +0200429static int sixaxis_set_operational_usb(struct hid_device *hdev)
Jiri Slabybd28ce02008-06-25 23:47:04 +0200430{
Jiri Slabybd28ce02008-06-25 23:47:04 +0200431 int ret;
432 char *buf = kmalloc(18, GFP_KERNEL);
433
434 if (!buf)
435 return -ENOMEM;
436
Benjamin Tissoiresf204828a2013-09-11 22:12:25 +0200437 ret = hdev->hid_get_raw_report(hdev, 0xf2, buf, 17, HID_FEATURE_REPORT);
438
Jiri Slabybd28ce02008-06-25 23:47:04 +0200439 if (ret < 0)
Joe Perches4291ee32010-12-09 19:29:03 -0800440 hid_err(hdev, "can't set operational mode\n");
Jiri Slabybd28ce02008-06-25 23:47:04 +0200441
442 kfree(buf);
443
444 return ret;
445}
446
Antonio Ospite816651a2010-05-03 22:15:55 +0200447static int sixaxis_set_operational_bt(struct hid_device *hdev)
Bastien Noceraf9ce7c22010-01-20 12:01:53 +0000448{
Antonio Ospitefddb33f2010-05-03 17:19:03 +0200449 unsigned char buf[] = { 0xf4, 0x42, 0x03, 0x00, 0x00 };
Bastien Noceraf9ce7c22010-01-20 12:01:53 +0000450 return hdev->hid_output_raw_report(hdev, buf, sizeof(buf), HID_FEATURE_REPORT);
451}
452
Frank Praznik60781cf2014-01-11 15:13:15 -0500453static void buzz_set_leds(struct hid_device *hdev, const __u8 *leds)
Colin Leitnerf04d5142013-05-27 23:41:05 +0200454{
455 struct list_head *report_list =
456 &hdev->report_enum[HID_OUTPUT_REPORT].report_list;
457 struct hid_report *report = list_entry(report_list->next,
458 struct hid_report, list);
459 __s32 *value = report->field[0]->value;
460
461 value[0] = 0x00;
Frank Praznik60781cf2014-01-11 15:13:15 -0500462 value[1] = leds[0] ? 0xff : 0x00;
463 value[2] = leds[1] ? 0xff : 0x00;
464 value[3] = leds[2] ? 0xff : 0x00;
465 value[4] = leds[3] ? 0xff : 0x00;
Colin Leitnerf04d5142013-05-27 23:41:05 +0200466 value[5] = 0x00;
467 value[6] = 0x00;
468 hid_hw_request(hdev, report, HID_REQ_SET_REPORT);
469}
470
Frank Praznik60781cf2014-01-11 15:13:15 -0500471static void sony_set_leds(struct hid_device *hdev, const __u8 *leds, int count)
Sven Eckelmann0a286ef2013-11-19 20:26:32 +0100472{
473 struct sony_sc *drv_data = hid_get_drvdata(hdev);
Frank Praznik60781cf2014-01-11 15:13:15 -0500474 int n;
Sven Eckelmann0a286ef2013-11-19 20:26:32 +0100475
Frank Praznik60781cf2014-01-11 15:13:15 -0500476 BUG_ON(count > MAX_LEDS);
477
478 if (drv_data->quirks & BUZZ_CONTROLLER && count == 4) {
Sven Eckelmann0a286ef2013-11-19 20:26:32 +0100479 buzz_set_leds(hdev, leds);
Frank Praznik60781cf2014-01-11 15:13:15 -0500480 } else if ((drv_data->quirks & SIXAXIS_CONTROLLER_USB) ||
481 (drv_data->quirks & DUALSHOCK4_CONTROLLER)) {
482 for (n = 0; n < count; n++)
483 drv_data->led_state[n] = leds[n];
Sven Eckelmann0a286ef2013-11-19 20:26:32 +0100484 schedule_work(&drv_data->state_worker);
485 }
486}
487
Sven Eckelmannc5382512013-11-19 20:26:30 +0100488static void sony_led_set_brightness(struct led_classdev *led,
Colin Leitnerf04d5142013-05-27 23:41:05 +0200489 enum led_brightness value)
490{
491 struct device *dev = led->dev->parent;
492 struct hid_device *hdev = container_of(dev, struct hid_device, dev);
493 struct sony_sc *drv_data;
Colin Leitnerf04d5142013-05-27 23:41:05 +0200494
495 int n;
496
497 drv_data = hid_get_drvdata(hdev);
Sven Eckelmann2251b852013-11-19 20:26:31 +0100498 if (!drv_data) {
Colin Leitnerf04d5142013-05-27 23:41:05 +0200499 hid_err(hdev, "No device data\n");
500 return;
501 }
Colin Leitnerf04d5142013-05-27 23:41:05 +0200502
Frank Praznik60781cf2014-01-11 15:13:15 -0500503 for (n = 0; n < drv_data->led_count; n++) {
Sven Eckelmann2251b852013-11-19 20:26:31 +0100504 if (led == drv_data->leds[n]) {
Frank Praznik60781cf2014-01-11 15:13:15 -0500505 if (value != drv_data->led_state[n]) {
506 drv_data->led_state[n] = value;
507 sony_set_leds(hdev, drv_data->led_state, drv_data->led_count);
Colin Leitnerf04d5142013-05-27 23:41:05 +0200508 }
509 break;
510 }
511 }
512}
513
Sven Eckelmannc5382512013-11-19 20:26:30 +0100514static enum led_brightness sony_led_get_brightness(struct led_classdev *led)
Colin Leitnerf04d5142013-05-27 23:41:05 +0200515{
516 struct device *dev = led->dev->parent;
517 struct hid_device *hdev = container_of(dev, struct hid_device, dev);
518 struct sony_sc *drv_data;
Colin Leitnerf04d5142013-05-27 23:41:05 +0200519
520 int n;
521 int on = 0;
522
523 drv_data = hid_get_drvdata(hdev);
Sven Eckelmann2251b852013-11-19 20:26:31 +0100524 if (!drv_data) {
Colin Leitnerf04d5142013-05-27 23:41:05 +0200525 hid_err(hdev, "No device data\n");
526 return LED_OFF;
527 }
Colin Leitnerf04d5142013-05-27 23:41:05 +0200528
Frank Praznik60781cf2014-01-11 15:13:15 -0500529 for (n = 0; n < drv_data->led_count; n++) {
Sven Eckelmann2251b852013-11-19 20:26:31 +0100530 if (led == drv_data->leds[n]) {
Frank Praznik60781cf2014-01-11 15:13:15 -0500531 on = !!(drv_data->led_state[n]);
Colin Leitnerf04d5142013-05-27 23:41:05 +0200532 break;
533 }
534 }
535
536 return on ? LED_FULL : LED_OFF;
537}
Colin Leitnerf04d5142013-05-27 23:41:05 +0200538
Sven Eckelmann0a286ef2013-11-19 20:26:32 +0100539static void sony_leds_remove(struct hid_device *hdev)
540{
541 struct sony_sc *drv_data;
542 struct led_classdev *led;
543 int n;
544
545 drv_data = hid_get_drvdata(hdev);
546 BUG_ON(!(drv_data->quirks & SONY_LED_SUPPORT));
547
Frank Praznik60781cf2014-01-11 15:13:15 -0500548 for (n = 0; n < drv_data->led_count; n++) {
Sven Eckelmann0a286ef2013-11-19 20:26:32 +0100549 led = drv_data->leds[n];
550 drv_data->leds[n] = NULL;
551 if (!led)
552 continue;
553 led_classdev_unregister(led);
554 kfree(led);
555 }
Frank Praznik60781cf2014-01-11 15:13:15 -0500556
557 drv_data->led_count = 0;
Sven Eckelmann0a286ef2013-11-19 20:26:32 +0100558}
559
Sven Eckelmannc5382512013-11-19 20:26:30 +0100560static int sony_leds_init(struct hid_device *hdev)
Colin Leitnerf04d5142013-05-27 23:41:05 +0200561{
562 struct sony_sc *drv_data;
Jiri Kosina40e32ee2013-05-28 11:22:09 +0200563 int n, ret = 0;
Frank Praznik60781cf2014-01-11 15:13:15 -0500564 int max_brightness;
Jiri Kosina40e32ee2013-05-28 11:22:09 +0200565 struct led_classdev *led;
566 size_t name_sz;
567 char *name;
Sven Eckelmann0a286ef2013-11-19 20:26:32 +0100568 size_t name_len;
569 const char *name_fmt;
Frank Praznik60781cf2014-01-11 15:13:15 -0500570 static const __u8 initial_values[MAX_LEDS] = { 0x00, 0x00, 0x00, 0x00 };
Colin Leitnerf04d5142013-05-27 23:41:05 +0200571
572 drv_data = hid_get_drvdata(hdev);
Sven Eckelmann0a286ef2013-11-19 20:26:32 +0100573 BUG_ON(!(drv_data->quirks & SONY_LED_SUPPORT));
Colin Leitnerf04d5142013-05-27 23:41:05 +0200574
Sven Eckelmann0a286ef2013-11-19 20:26:32 +0100575 if (drv_data->quirks & BUZZ_CONTROLLER) {
576 name_len = strlen("::buzz#");
577 name_fmt = "%s::buzz%d";
578 /* Validate expected report characteristics. */
579 if (!hid_validate_values(hdev, HID_OUTPUT_REPORT, 0, 0, 7))
580 return -ENODEV;
581 } else {
582 name_len = strlen("::sony#");
583 name_fmt = "%s::sony%d";
584 }
Kees Cook9446edb2013-09-11 21:56:52 +0200585
Frank Praznik60781cf2014-01-11 15:13:15 -0500586 if (drv_data->quirks & DUALSHOCK4_CONTROLLER) {
587 drv_data->led_count = 3;
588 max_brightness = 255;
589 } else {
590 drv_data->led_count = 4;
591 max_brightness = 1;
592 }
593
Colin Leitnerf04d5142013-05-27 23:41:05 +0200594 /* Clear LEDs as we have no way of reading their initial state. This is
595 * only relevant if the driver is loaded after somebody actively set the
596 * LEDs to on */
Frank Praznik60781cf2014-01-11 15:13:15 -0500597 sony_set_leds(hdev, initial_values, drv_data->led_count);
Colin Leitnerf04d5142013-05-27 23:41:05 +0200598
Sven Eckelmann0a286ef2013-11-19 20:26:32 +0100599 name_sz = strlen(dev_name(&hdev->dev)) + name_len + 1;
Colin Leitnerf04d5142013-05-27 23:41:05 +0200600
Frank Praznik60781cf2014-01-11 15:13:15 -0500601 for (n = 0; n < drv_data->led_count; n++) {
Jiri Kosina40e32ee2013-05-28 11:22:09 +0200602 led = kzalloc(sizeof(struct led_classdev) + name_sz, GFP_KERNEL);
603 if (!led) {
604 hid_err(hdev, "Couldn't allocate memory for LED %d\n", n);
Julia Lawall8cd5fcd2013-12-29 23:47:27 +0100605 ret = -ENOMEM;
Jiri Kosina40e32ee2013-05-28 11:22:09 +0200606 goto error_leds;
Colin Leitnerf04d5142013-05-27 23:41:05 +0200607 }
Jiri Kosina40e32ee2013-05-28 11:22:09 +0200608
609 name = (void *)(&led[1]);
Sven Eckelmann0a286ef2013-11-19 20:26:32 +0100610 snprintf(name, name_sz, name_fmt, dev_name(&hdev->dev), n + 1);
Jiri Kosina40e32ee2013-05-28 11:22:09 +0200611 led->name = name;
612 led->brightness = 0;
Frank Praznik60781cf2014-01-11 15:13:15 -0500613 led->max_brightness = max_brightness;
Sven Eckelmannc5382512013-11-19 20:26:30 +0100614 led->brightness_get = sony_led_get_brightness;
615 led->brightness_set = sony_led_set_brightness;
Jiri Kosina40e32ee2013-05-28 11:22:09 +0200616
Julia Lawall8cd5fcd2013-12-29 23:47:27 +0100617 ret = led_classdev_register(&hdev->dev, led);
618 if (ret) {
Jiri Kosina40e32ee2013-05-28 11:22:09 +0200619 hid_err(hdev, "Failed to register LED %d\n", n);
620 kfree(led);
621 goto error_leds;
622 }
623
Sven Eckelmann2251b852013-11-19 20:26:31 +0100624 drv_data->leds[n] = led;
Colin Leitnerf04d5142013-05-27 23:41:05 +0200625 }
Colin Leitnerf04d5142013-05-27 23:41:05 +0200626
627 return ret;
628
Colin Leitnerf04d5142013-05-27 23:41:05 +0200629error_leds:
Sven Eckelmann0a286ef2013-11-19 20:26:32 +0100630 sony_leds_remove(hdev);
Colin Leitnerf04d5142013-05-27 23:41:05 +0200631
Colin Leitnerf04d5142013-05-27 23:41:05 +0200632 return ret;
Colin Leitnerf04d5142013-05-27 23:41:05 +0200633}
634
Frank Praznikcad665a2014-01-11 15:13:54 -0500635static void sixaxis_state_worker(struct work_struct *work)
Sven Eckelmanna08c22c2013-11-09 19:25:57 +0100636{
Sven Eckelmann92b5c412013-11-19 20:26:28 +0100637 struct sony_sc *sc = container_of(work, struct sony_sc, state_worker);
Sven Eckelmanna08c22c2013-11-09 19:25:57 +0100638 unsigned char buf[] = {
639 0x01,
640 0x00, 0xff, 0x00, 0xff, 0x00,
Sven Eckelmann0a286ef2013-11-19 20:26:32 +0100641 0x00, 0x00, 0x00, 0x00, 0x00,
Sven Eckelmanna08c22c2013-11-09 19:25:57 +0100642 0xff, 0x27, 0x10, 0x00, 0x32,
643 0xff, 0x27, 0x10, 0x00, 0x32,
644 0xff, 0x27, 0x10, 0x00, 0x32,
645 0xff, 0x27, 0x10, 0x00, 0x32,
646 0x00, 0x00, 0x00, 0x00, 0x00
647 };
Sven Eckelmann9f323b62013-11-17 20:38:21 +0100648
Sven Eckelmann0a286ef2013-11-19 20:26:32 +0100649#ifdef CONFIG_SONY_FF
Frank Praznik0bd88dd2014-01-11 15:12:42 -0500650 buf[3] = sc->right ? 1 : 0;
Sven Eckelmann9f323b62013-11-17 20:38:21 +0100651 buf[5] = sc->left;
Sven Eckelmann0a286ef2013-11-19 20:26:32 +0100652#endif
653
Frank Praznik60781cf2014-01-11 15:13:15 -0500654 buf[10] |= sc->led_state[0] << 1;
655 buf[10] |= sc->led_state[1] << 2;
656 buf[10] |= sc->led_state[2] << 3;
657 buf[10] |= sc->led_state[3] << 4;
Sven Eckelmann9f323b62013-11-17 20:38:21 +0100658
659 sc->hdev->hid_output_raw_report(sc->hdev, buf, sizeof(buf),
660 HID_OUTPUT_REPORT);
661}
662
Frank Praznik0bd88dd2014-01-11 15:12:42 -0500663static void dualshock4_state_worker(struct work_struct *work)
664{
665 struct sony_sc *sc = container_of(work, struct sony_sc, state_worker);
666 unsigned char buf[] = {
667 0x05,
668 0x03, 0x00, 0x00, 0x00, 0x00,
669 0x00, 0x00, 0x00, 0x00, 0x00,
670 0x00, 0x00, 0x00, 0x00, 0x00,
671 0x00, 0x00, 0x00, 0x00, 0x00,
672 0x00, 0x00, 0x00, 0x00, 0x00,
673 0x00, 0x00, 0x00, 0x00, 0x00,
674 0x00,
675 };
676
677#ifdef CONFIG_SONY_FF
678 buf[4] = sc->right;
679 buf[5] = sc->left;
680#endif
681
Frank Praznik60781cf2014-01-11 15:13:15 -0500682 buf[6] = sc->led_state[0];
683 buf[7] = sc->led_state[1];
684 buf[8] = sc->led_state[2];
685
Frank Praznik0bd88dd2014-01-11 15:12:42 -0500686 sc->hdev->hid_output_raw_report(sc->hdev, buf, sizeof(buf),
687 HID_OUTPUT_REPORT);
688}
689
Sven Eckelmann0a286ef2013-11-19 20:26:32 +0100690#ifdef CONFIG_SONY_FF
Sven Eckelmann9f323b62013-11-17 20:38:21 +0100691static int sony_play_effect(struct input_dev *dev, void *data,
692 struct ff_effect *effect)
693{
Sven Eckelmanna08c22c2013-11-09 19:25:57 +0100694 struct hid_device *hid = input_get_drvdata(dev);
Sven Eckelmann9f323b62013-11-17 20:38:21 +0100695 struct sony_sc *sc = hid_get_drvdata(hid);
Sven Eckelmanna08c22c2013-11-09 19:25:57 +0100696
697 if (effect->type != FF_RUMBLE)
698 return 0;
699
Sven Eckelmann9f323b62013-11-17 20:38:21 +0100700 sc->left = effect->u.rumble.strong_magnitude / 256;
Frank Praznik0bd88dd2014-01-11 15:12:42 -0500701 sc->right = effect->u.rumble.weak_magnitude / 256;
Sven Eckelmanna08c22c2013-11-09 19:25:57 +0100702
Sven Eckelmann92b5c412013-11-19 20:26:28 +0100703 schedule_work(&sc->state_worker);
Sven Eckelmann9f323b62013-11-17 20:38:21 +0100704 return 0;
Sven Eckelmanna08c22c2013-11-09 19:25:57 +0100705}
706
707static int sony_init_ff(struct hid_device *hdev)
708{
709 struct hid_input *hidinput = list_entry(hdev->inputs.next,
710 struct hid_input, list);
711 struct input_dev *input_dev = hidinput->input;
712
713 input_set_capability(input_dev, EV_FF, FF_RUMBLE);
714 return input_ff_create_memless(input_dev, NULL, sony_play_effect);
715}
716
Sven Eckelmann9f323b62013-11-17 20:38:21 +0100717static void sony_destroy_ff(struct hid_device *hdev)
718{
719 struct sony_sc *sc = hid_get_drvdata(hdev);
720
Sven Eckelmann92b5c412013-11-19 20:26:28 +0100721 cancel_work_sync(&sc->state_worker);
Sven Eckelmann9f323b62013-11-17 20:38:21 +0100722}
723
Sven Eckelmanna08c22c2013-11-09 19:25:57 +0100724#else
725static int sony_init_ff(struct hid_device *hdev)
726{
727 return 0;
728}
Sven Eckelmann9f323b62013-11-17 20:38:21 +0100729
730static void sony_destroy_ff(struct hid_device *hdev)
731{
732}
Sven Eckelmanna08c22c2013-11-09 19:25:57 +0100733#endif
734
Jiri Slabybd28ce02008-06-25 23:47:04 +0200735static int sony_probe(struct hid_device *hdev, const struct hid_device_id *id)
736{
737 int ret;
Jiri Kosinacc6e0bb2008-10-23 12:58:38 +0200738 unsigned long quirks = id->driver_data;
739 struct sony_sc *sc;
Colin Leitnerf04d5142013-05-27 23:41:05 +0200740 unsigned int connect_mask = HID_CONNECT_DEFAULT;
Jiri Kosinacc6e0bb2008-10-23 12:58:38 +0200741
Benjamin Tissoiresabf832b2013-07-24 19:38:04 +0200742 sc = devm_kzalloc(&hdev->dev, sizeof(*sc), GFP_KERNEL);
Jiri Kosinacc6e0bb2008-10-23 12:58:38 +0200743 if (sc == NULL) {
Joe Perches4291ee32010-12-09 19:29:03 -0800744 hid_err(hdev, "can't alloc sony descriptor\n");
Jiri Kosinacc6e0bb2008-10-23 12:58:38 +0200745 return -ENOMEM;
746 }
747
748 sc->quirks = quirks;
749 hid_set_drvdata(hdev, sc);
Sven Eckelmann0a286ef2013-11-19 20:26:32 +0100750 sc->hdev = hdev;
Jiri Slabybd28ce02008-06-25 23:47:04 +0200751
Jiri Slabybd28ce02008-06-25 23:47:04 +0200752 ret = hid_parse(hdev);
753 if (ret) {
Joe Perches4291ee32010-12-09 19:29:03 -0800754 hid_err(hdev, "parse failed\n");
Benjamin Tissoiresabf832b2013-07-24 19:38:04 +0200755 return ret;
Jiri Slabybd28ce02008-06-25 23:47:04 +0200756 }
757
Colin Leitnerf04d5142013-05-27 23:41:05 +0200758 if (sc->quirks & VAIO_RDESC_CONSTANT)
759 connect_mask |= HID_CONNECT_HIDDEV_FORCE;
760 else if (sc->quirks & SIXAXIS_CONTROLLER_USB)
761 connect_mask |= HID_CONNECT_HIDDEV_FORCE;
762 else if (sc->quirks & SIXAXIS_CONTROLLER_BT)
763 connect_mask |= HID_CONNECT_HIDDEV_FORCE;
764
765 ret = hid_hw_start(hdev, connect_mask);
Jiri Slabybd28ce02008-06-25 23:47:04 +0200766 if (ret) {
Joe Perches4291ee32010-12-09 19:29:03 -0800767 hid_err(hdev, "hw start failed\n");
Benjamin Tissoiresabf832b2013-07-24 19:38:04 +0200768 return ret;
Jiri Slabybd28ce02008-06-25 23:47:04 +0200769 }
770
Antonio Ospite569b10a2010-10-19 16:13:10 +0200771 if (sc->quirks & SIXAXIS_CONTROLLER_USB) {
772 hdev->hid_output_raw_report = sixaxis_usb_output_raw_report;
Antonio Ospite816651a2010-05-03 22:15:55 +0200773 ret = sixaxis_set_operational_usb(hdev);
Frank Praznikcad665a2014-01-11 15:13:54 -0500774 INIT_WORK(&sc->state_worker, sixaxis_state_worker);
Antonio Ospite569b10a2010-10-19 16:13:10 +0200775 }
Antonio Ospite816651a2010-05-03 22:15:55 +0200776 else if (sc->quirks & SIXAXIS_CONTROLLER_BT)
777 ret = sixaxis_set_operational_bt(hdev);
Frank Praznik0bd88dd2014-01-11 15:12:42 -0500778 else if (sc->quirks & DUALSHOCK4_CONTROLLER) {
Bastien Noceraf9ce7c22010-01-20 12:01:53 +0000779 ret = 0;
Frank Praznik0bd88dd2014-01-11 15:12:42 -0500780 INIT_WORK(&sc->state_worker, dualshock4_state_worker);
781 } else {
782 ret = 0;
783 }
Bastien Noceraf9ce7c22010-01-20 12:01:53 +0000784
Jiri Kosina4dfdc462008-12-30 00:49:59 +0100785 if (ret < 0)
Jiri Slabybd28ce02008-06-25 23:47:04 +0200786 goto err_stop;
787
Sven Eckelmann0a286ef2013-11-19 20:26:32 +0100788 if (sc->quirks & SONY_LED_SUPPORT) {
789 ret = sony_leds_init(hdev);
790 if (ret < 0)
791 goto err_stop;
792 }
793
Sven Eckelmanna08c22c2013-11-09 19:25:57 +0100794 ret = sony_init_ff(hdev);
795 if (ret < 0)
796 goto err_stop;
797
Jiri Slabybd28ce02008-06-25 23:47:04 +0200798 return 0;
799err_stop:
Sven Eckelmann0a286ef2013-11-19 20:26:32 +0100800 if (sc->quirks & SONY_LED_SUPPORT)
801 sony_leds_remove(hdev);
Jiri Slabybd28ce02008-06-25 23:47:04 +0200802 hid_hw_stop(hdev);
Jiri Slabybd28ce02008-06-25 23:47:04 +0200803 return ret;
804}
805
Jiri Kosinacc6e0bb2008-10-23 12:58:38 +0200806static void sony_remove(struct hid_device *hdev)
807{
Colin Leitnerf04d5142013-05-27 23:41:05 +0200808 struct sony_sc *sc = hid_get_drvdata(hdev);
809
Sven Eckelmann0a286ef2013-11-19 20:26:32 +0100810 if (sc->quirks & SONY_LED_SUPPORT)
Sven Eckelmannc5382512013-11-19 20:26:30 +0100811 sony_leds_remove(hdev);
Colin Leitnerf04d5142013-05-27 23:41:05 +0200812
Sven Eckelmann9f323b62013-11-17 20:38:21 +0100813 sony_destroy_ff(hdev);
814
Jiri Kosinacc6e0bb2008-10-23 12:58:38 +0200815 hid_hw_stop(hdev);
Jiri Kosinacc6e0bb2008-10-23 12:58:38 +0200816}
817
Jiri Slabybd28ce02008-06-25 23:47:04 +0200818static const struct hid_device_id sony_devices[] = {
Antonio Ospite816651a2010-05-03 22:15:55 +0200819 { HID_USB_DEVICE(USB_VENDOR_ID_SONY, USB_DEVICE_ID_SONY_PS3_CONTROLLER),
820 .driver_data = SIXAXIS_CONTROLLER_USB },
Jiri Kosina35dca5b2011-04-28 15:43:13 +0200821 { HID_USB_DEVICE(USB_VENDOR_ID_SONY, USB_DEVICE_ID_SONY_NAVIGATION_CONTROLLER),
822 .driver_data = SIXAXIS_CONTROLLER_USB },
Antonio Ospite816651a2010-05-03 22:15:55 +0200823 { HID_BLUETOOTH_DEVICE(USB_VENDOR_ID_SONY, USB_DEVICE_ID_SONY_PS3_CONTROLLER),
824 .driver_data = SIXAXIS_CONTROLLER_BT },
Jiri Kosinacc6e0bb2008-10-23 12:58:38 +0200825 { HID_USB_DEVICE(USB_VENDOR_ID_SONY, USB_DEVICE_ID_SONY_VAIO_VGX_MOUSE),
826 .driver_data = VAIO_RDESC_CONSTANT },
Fernando Luis Vázquez Caoa46491842013-01-15 19:40:48 +0900827 { HID_USB_DEVICE(USB_VENDOR_ID_SONY, USB_DEVICE_ID_SONY_VAIO_VGP_MOUSE),
828 .driver_data = VAIO_RDESC_CONSTANT },
Colin Leitnerf04d5142013-05-27 23:41:05 +0200829 /* Wired Buzz Controller. Reported as Sony Hub from its USB ID and as
830 * Logitech joystick from the device descriptor. */
831 { HID_USB_DEVICE(USB_VENDOR_ID_SONY, USB_DEVICE_ID_SONY_BUZZ_CONTROLLER),
832 .driver_data = BUZZ_CONTROLLER },
833 { HID_USB_DEVICE(USB_VENDOR_ID_SONY, USB_DEVICE_ID_SONY_WIRELESS_BUZZ_CONTROLLER),
834 .driver_data = BUZZ_CONTROLLER },
Jiri Kosina078328d2013-06-13 12:03:49 +0200835 /* PS3 BD Remote Control */
836 { HID_BLUETOOTH_DEVICE(USB_VENDOR_ID_SONY, USB_DEVICE_ID_SONY_PS3_BDREMOTE),
837 .driver_data = PS3REMOTE },
838 /* Logitech Harmony Adapter for PS3 */
839 { HID_BLUETOOTH_DEVICE(USB_VENDOR_ID_LOGITECH, USB_DEVICE_ID_LOGITECH_HARMONY_PS3),
840 .driver_data = PS3REMOTE },
Frank Praznik0bd88dd2014-01-11 15:12:42 -0500841 /* Sony Dualshock 4 controllers for PS4 */
842 { HID_USB_DEVICE(USB_VENDOR_ID_SONY, USB_DEVICE_ID_SONY_PS4_CONTROLLER),
843 .driver_data = DUALSHOCK4_CONTROLLER },
844 { HID_BLUETOOTH_DEVICE(USB_VENDOR_ID_SONY, USB_DEVICE_ID_SONY_PS4_CONTROLLER),
845 .driver_data = DUALSHOCK4_CONTROLLER },
Jiri Slabybd28ce02008-06-25 23:47:04 +0200846 { }
847};
848MODULE_DEVICE_TABLE(hid, sony_devices);
849
850static struct hid_driver sony_driver = {
Colin Leitnerf04d5142013-05-27 23:41:05 +0200851 .name = "sony",
852 .id_table = sony_devices,
853 .input_mapping = sony_mapping,
854 .probe = sony_probe,
855 .remove = sony_remove,
856 .report_fixup = sony_report_fixup,
857 .raw_event = sony_raw_event
Jiri Slabybd28ce02008-06-25 23:47:04 +0200858};
H Hartley Sweetenf4254582012-12-17 15:28:26 -0700859module_hid_driver(sony_driver);
Jiri Slabybd28ce02008-06-25 23:47:04 +0200860
Jiri Slabybd28ce02008-06-25 23:47:04 +0200861MODULE_LICENSE("GPL");