blob: edffe2c47cf9a17d22ba208d0742c9e7299c7f2f [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
Frank Prazniked19d8c2014-01-16 21:43:12 -050076static u8 dualshock4_usb_rdesc[] = {
77 0x05, 0x01, 0x09, 0x05, 0xa1, 0x01, 0x85, 0x01,
78 0x09, 0x30, 0x09, 0x31, 0x09, 0x32, 0x09, 0x35,
79 0x15, 0x00, 0x26, 0xff, 0x00, 0x75, 0x08, 0x95,
80 0x04, 0x81, 0x02, 0x09, 0x39, 0x15, 0x00, 0x25,
81 0x07, 0x35, 0x00, 0x46, 0x3b, 0x01, 0x65, 0x14,
82 0x75, 0x04, 0x95, 0x01, 0x81, 0x42, 0x65, 0x00,
83 0x05, 0x09, 0x19, 0x01, 0x29, 0x0e, 0x15, 0x00,
84 0x25, 0x01, 0x75, 0x01, 0x95, 0x0e, 0x81, 0x02,
85 0x06, 0x00, 0xff, 0x09, 0x20, 0x75, 0x06, 0x95,
86 0x01, 0x15, 0x00, 0x25, 0x7f, 0x81, 0x02, 0x05,
87 0x01, 0x09, 0x33, 0x09, 0x34, 0x15, 0x00, 0x26,
88 0xff, 0x00, 0x75, 0x08, 0x95, 0x02, 0x81, 0x02,
89 0x06, 0x00, 0xff, 0x09, 0x21, 0x95, 0x03, 0x81,
90 0x02, 0x05, 0x01, 0x19, 0x40, 0x29, 0x42, 0x16,
91 0x00, 0x80, 0x26, 0x00, 0x7f, 0x75, 0x10, 0x95,
92 0x03, 0x81, 0x02, 0x05, 0x01, 0x19, 0x43, 0x29,
93 0x45, 0x16, 0xff, 0xbf, 0x26, 0x00, 0x40, 0x95,
94 0x03, 0x81, 0x02, 0x06, 0x00, 0xff, 0x09, 0x21,
95 0x75, 0x08, 0x95, 0x27, 0x81, 0x02, 0x85, 0x05,
96 0x09, 0x22, 0x95, 0x1f, 0x91, 0x02, 0x85, 0x04,
97 0x09, 0x23, 0x95, 0x24, 0xb1, 0x02, 0x85, 0x02,
98 0x09, 0x24, 0x95, 0x24, 0xb1, 0x02, 0x85, 0x08,
99 0x09, 0x25, 0x95, 0x03, 0xb1, 0x02, 0x85, 0x10,
100 0x09, 0x26, 0x95, 0x04, 0xb1, 0x02, 0x85, 0x11,
101 0x09, 0x27, 0x95, 0x02, 0xb1, 0x02, 0x85, 0x12,
102 0x06, 0x02, 0xff, 0x09, 0x21, 0x95, 0x0f, 0xb1,
103 0x02, 0x85, 0x13, 0x09, 0x22, 0x95, 0x16, 0xb1,
104 0x02, 0x85, 0x14, 0x06, 0x05, 0xff, 0x09, 0x20,
105 0x95, 0x10, 0xb1, 0x02, 0x85, 0x15, 0x09, 0x21,
106 0x95, 0x2c, 0xb1, 0x02, 0x06, 0x80, 0xff, 0x85,
107 0x80, 0x09, 0x20, 0x95, 0x06, 0xb1, 0x02, 0x85,
108 0x81, 0x09, 0x21, 0x95, 0x06, 0xb1, 0x02, 0x85,
109 0x82, 0x09, 0x22, 0x95, 0x05, 0xb1, 0x02, 0x85,
110 0x83, 0x09, 0x23, 0x95, 0x01, 0xb1, 0x02, 0x85,
111 0x84, 0x09, 0x24, 0x95, 0x04, 0xb1, 0x02, 0x85,
112 0x85, 0x09, 0x25, 0x95, 0x06, 0xb1, 0x02, 0x85,
113 0x86, 0x09, 0x26, 0x95, 0x06, 0xb1, 0x02, 0x85,
114 0x87, 0x09, 0x27, 0x95, 0x23, 0xb1, 0x02, 0x85,
115 0x88, 0x09, 0x28, 0x95, 0x22, 0xb1, 0x02, 0x85,
116 0x89, 0x09, 0x29, 0x95, 0x02, 0xb1, 0x02, 0x85,
117 0x90, 0x09, 0x30, 0x95, 0x05, 0xb1, 0x02, 0x85,
118 0x91, 0x09, 0x31, 0x95, 0x03, 0xb1, 0x02, 0x85,
119 0x92, 0x09, 0x32, 0x95, 0x03, 0xb1, 0x02, 0x85,
120 0x93, 0x09, 0x33, 0x95, 0x0c, 0xb1, 0x02, 0x85,
121 0xa0, 0x09, 0x40, 0x95, 0x06, 0xb1, 0x02, 0x85,
122 0xa1, 0x09, 0x41, 0x95, 0x01, 0xb1, 0x02, 0x85,
123 0xa2, 0x09, 0x42, 0x95, 0x01, 0xb1, 0x02, 0x85,
124 0xa3, 0x09, 0x43, 0x95, 0x30, 0xb1, 0x02, 0x85,
125 0xa4, 0x09, 0x44, 0x95, 0x0d, 0xb1, 0x02, 0x85,
126 0xa5, 0x09, 0x45, 0x95, 0x15, 0xb1, 0x02, 0x85,
127 0xa6, 0x09, 0x46, 0x95, 0x15, 0xb1, 0x02, 0x85,
128 0xf0, 0x09, 0x47, 0x95, 0x3f, 0xb1, 0x02, 0x85,
129 0xf1, 0x09, 0x48, 0x95, 0x3f, 0xb1, 0x02, 0x85,
130 0xf2, 0x09, 0x49, 0x95, 0x0f, 0xb1, 0x02, 0x85,
131 0xa7, 0x09, 0x4a, 0x95, 0x01, 0xb1, 0x02, 0x85,
132 0xa8, 0x09, 0x4b, 0x95, 0x01, 0xb1, 0x02, 0x85,
133 0xa9, 0x09, 0x4c, 0x95, 0x08, 0xb1, 0x02, 0x85,
134 0xaa, 0x09, 0x4e, 0x95, 0x01, 0xb1, 0x02, 0x85,
135 0xab, 0x09, 0x4f, 0x95, 0x39, 0xb1, 0x02, 0x85,
136 0xac, 0x09, 0x50, 0x95, 0x39, 0xb1, 0x02, 0x85,
137 0xad, 0x09, 0x51, 0x95, 0x0b, 0xb1, 0x02, 0x85,
138 0xae, 0x09, 0x52, 0x95, 0x01, 0xb1, 0x02, 0x85,
139 0xaf, 0x09, 0x53, 0x95, 0x02, 0xb1, 0x02, 0x85,
140 0xb0, 0x09, 0x54, 0x95, 0x3f, 0xb1, 0x02, 0xc0,
141};
142
Jiri Kosina078328d2013-06-13 12:03:49 +0200143static __u8 ps3remote_rdesc[] = {
144 0x05, 0x01, /* GUsagePage Generic Desktop */
145 0x09, 0x05, /* LUsage 0x05 [Game Pad] */
146 0xA1, 0x01, /* MCollection Application (mouse, keyboard) */
147
148 /* Use collection 1 for joypad buttons */
149 0xA1, 0x02, /* MCollection Logical (interrelated data) */
150
151 /* Ignore the 1st byte, maybe it is used for a controller
152 * number but it's not needed for correct operation */
153 0x75, 0x08, /* GReportSize 0x08 [8] */
154 0x95, 0x01, /* GReportCount 0x01 [1] */
155 0x81, 0x01, /* MInput 0x01 (Const[0] Arr[1] Abs[2]) */
156
157 /* Bytes from 2nd to 4th are a bitmap for joypad buttons, for these
158 * buttons multiple keypresses are allowed */
159 0x05, 0x09, /* GUsagePage Button */
160 0x19, 0x01, /* LUsageMinimum 0x01 [Button 1 (primary/trigger)] */
161 0x29, 0x18, /* LUsageMaximum 0x18 [Button 24] */
162 0x14, /* GLogicalMinimum [0] */
163 0x25, 0x01, /* GLogicalMaximum 0x01 [1] */
164 0x75, 0x01, /* GReportSize 0x01 [1] */
165 0x95, 0x18, /* GReportCount 0x18 [24] */
166 0x81, 0x02, /* MInput 0x02 (Data[0] Var[1] Abs[2]) */
167
168 0xC0, /* MEndCollection */
169
170 /* Use collection 2 for remote control buttons */
171 0xA1, 0x02, /* MCollection Logical (interrelated data) */
172
173 /* 5th byte is used for remote control buttons */
174 0x05, 0x09, /* GUsagePage Button */
175 0x18, /* LUsageMinimum [No button pressed] */
176 0x29, 0xFE, /* LUsageMaximum 0xFE [Button 254] */
177 0x14, /* GLogicalMinimum [0] */
178 0x26, 0xFE, 0x00, /* GLogicalMaximum 0x00FE [254] */
179 0x75, 0x08, /* GReportSize 0x08 [8] */
180 0x95, 0x01, /* GReportCount 0x01 [1] */
181 0x80, /* MInput */
182
183 /* Ignore bytes from 6th to 11th, 6th to 10th are always constant at
184 * 0xff and 11th is for press indication */
185 0x75, 0x08, /* GReportSize 0x08 [8] */
186 0x95, 0x06, /* GReportCount 0x06 [6] */
187 0x81, 0x01, /* MInput 0x01 (Const[0] Arr[1] Abs[2]) */
188
189 /* 12th byte is for battery strength */
190 0x05, 0x06, /* GUsagePage Generic Device Controls */
191 0x09, 0x20, /* LUsage 0x20 [Battery Strength] */
192 0x14, /* GLogicalMinimum [0] */
193 0x25, 0x05, /* GLogicalMaximum 0x05 [5] */
194 0x75, 0x08, /* GReportSize 0x08 [8] */
195 0x95, 0x01, /* GReportCount 0x01 [1] */
196 0x81, 0x02, /* MInput 0x02 (Data[0] Var[1] Abs[2]) */
197
198 0xC0, /* MEndCollection */
199
200 0xC0 /* MEndCollection [Game Pad] */
201};
202
203static const unsigned int ps3remote_keymap_joypad_buttons[] = {
204 [0x01] = KEY_SELECT,
205 [0x02] = BTN_THUMBL, /* L3 */
206 [0x03] = BTN_THUMBR, /* R3 */
207 [0x04] = BTN_START,
208 [0x05] = KEY_UP,
209 [0x06] = KEY_RIGHT,
210 [0x07] = KEY_DOWN,
211 [0x08] = KEY_LEFT,
212 [0x09] = BTN_TL2, /* L2 */
213 [0x0a] = BTN_TR2, /* R2 */
214 [0x0b] = BTN_TL, /* L1 */
215 [0x0c] = BTN_TR, /* R1 */
216 [0x0d] = KEY_OPTION, /* options/triangle */
217 [0x0e] = KEY_BACK, /* back/circle */
218 [0x0f] = BTN_0, /* cross */
219 [0x10] = KEY_SCREEN, /* view/square */
220 [0x11] = KEY_HOMEPAGE, /* PS button */
221 [0x14] = KEY_ENTER,
222};
223static const unsigned int ps3remote_keymap_remote_buttons[] = {
224 [0x00] = KEY_1,
225 [0x01] = KEY_2,
226 [0x02] = KEY_3,
227 [0x03] = KEY_4,
228 [0x04] = KEY_5,
229 [0x05] = KEY_6,
230 [0x06] = KEY_7,
231 [0x07] = KEY_8,
232 [0x08] = KEY_9,
233 [0x09] = KEY_0,
234 [0x0e] = KEY_ESC, /* return */
235 [0x0f] = KEY_CLEAR,
236 [0x16] = KEY_EJECTCD,
237 [0x1a] = KEY_MENU, /* top menu */
238 [0x28] = KEY_TIME,
239 [0x30] = KEY_PREVIOUS,
240 [0x31] = KEY_NEXT,
241 [0x32] = KEY_PLAY,
242 [0x33] = KEY_REWIND, /* scan back */
243 [0x34] = KEY_FORWARD, /* scan forward */
244 [0x38] = KEY_STOP,
245 [0x39] = KEY_PAUSE,
246 [0x40] = KEY_CONTEXT_MENU, /* pop up/menu */
247 [0x60] = KEY_FRAMEBACK, /* slow/step back */
248 [0x61] = KEY_FRAMEFORWARD, /* slow/step forward */
249 [0x63] = KEY_SUBTITLE,
250 [0x64] = KEY_AUDIO,
251 [0x65] = KEY_ANGLE,
252 [0x70] = KEY_INFO, /* display */
253 [0x80] = KEY_BLUE,
254 [0x81] = KEY_RED,
255 [0x82] = KEY_GREEN,
256 [0x83] = KEY_YELLOW,
257};
258
Colin Leitnerf04d5142013-05-27 23:41:05 +0200259static const unsigned int buzz_keymap[] = {
260 /* The controller has 4 remote buzzers, each with one LED and 5
261 * buttons.
262 *
263 * We use the mapping chosen by the controller, which is:
264 *
265 * Key Offset
266 * -------------------
267 * Buzz 1
268 * Blue 5
269 * Orange 4
270 * Green 3
271 * Yellow 2
272 *
273 * So, for example, the orange button on the third buzzer is mapped to
274 * BTN_TRIGGER_HAPPY14
275 */
276 [ 1] = BTN_TRIGGER_HAPPY1,
277 [ 2] = BTN_TRIGGER_HAPPY2,
278 [ 3] = BTN_TRIGGER_HAPPY3,
279 [ 4] = BTN_TRIGGER_HAPPY4,
280 [ 5] = BTN_TRIGGER_HAPPY5,
281 [ 6] = BTN_TRIGGER_HAPPY6,
282 [ 7] = BTN_TRIGGER_HAPPY7,
283 [ 8] = BTN_TRIGGER_HAPPY8,
284 [ 9] = BTN_TRIGGER_HAPPY9,
285 [10] = BTN_TRIGGER_HAPPY10,
286 [11] = BTN_TRIGGER_HAPPY11,
287 [12] = BTN_TRIGGER_HAPPY12,
288 [13] = BTN_TRIGGER_HAPPY13,
289 [14] = BTN_TRIGGER_HAPPY14,
290 [15] = BTN_TRIGGER_HAPPY15,
291 [16] = BTN_TRIGGER_HAPPY16,
292 [17] = BTN_TRIGGER_HAPPY17,
293 [18] = BTN_TRIGGER_HAPPY18,
294 [19] = BTN_TRIGGER_HAPPY19,
295 [20] = BTN_TRIGGER_HAPPY20,
296};
297
Jiri Kosinacc6e0bb2008-10-23 12:58:38 +0200298struct sony_sc {
Sven Eckelmann0a286ef2013-11-19 20:26:32 +0100299 struct hid_device *hdev;
Frank Praznik60781cf2014-01-11 15:13:15 -0500300 struct led_classdev *leds[MAX_LEDS];
Jiri Kosinacc6e0bb2008-10-23 12:58:38 +0200301 unsigned long quirks;
Sven Eckelmann0a286ef2013-11-19 20:26:32 +0100302 struct work_struct state_worker;
Colin Leitnerf04d5142013-05-27 23:41:05 +0200303
Sven Eckelmann9f323b62013-11-17 20:38:21 +0100304#ifdef CONFIG_SONY_FF
Sven Eckelmann9f323b62013-11-17 20:38:21 +0100305 __u8 left;
306 __u8 right;
307#endif
308
Frank Praznik60781cf2014-01-11 15:13:15 -0500309 __u8 led_state[MAX_LEDS];
310 __u8 led_count;
Jiri Kosinacc6e0bb2008-10-23 12:58:38 +0200311};
312
Jiri Kosina078328d2013-06-13 12:03:49 +0200313static __u8 *ps3remote_fixup(struct hid_device *hdev, __u8 *rdesc,
314 unsigned int *rsize)
315{
316 *rsize = sizeof(ps3remote_rdesc);
317 return ps3remote_rdesc;
318}
319
320static int ps3remote_mapping(struct hid_device *hdev, struct hid_input *hi,
321 struct hid_field *field, struct hid_usage *usage,
322 unsigned long **bit, int *max)
323{
324 unsigned int key = usage->hid & HID_USAGE;
325
326 if ((usage->hid & HID_USAGE_PAGE) != HID_UP_BUTTON)
327 return -1;
328
329 switch (usage->collection_index) {
330 case 1:
331 if (key >= ARRAY_SIZE(ps3remote_keymap_joypad_buttons))
332 return -1;
333
334 key = ps3remote_keymap_joypad_buttons[key];
335 if (!key)
336 return -1;
337 break;
338 case 2:
339 if (key >= ARRAY_SIZE(ps3remote_keymap_remote_buttons))
340 return -1;
341
342 key = ps3remote_keymap_remote_buttons[key];
343 if (!key)
344 return -1;
345 break;
346 default:
347 return -1;
348 }
349
350 hid_map_usage_clear(hi, usage, bit, max, EV_KEY, key);
351 return 1;
352}
353
354
Jiri Kosinacc6e0bb2008-10-23 12:58:38 +0200355/* Sony Vaio VGX has wrongly mouse pointer declared as constant */
Nikolai Kondrashov73e40082010-08-06 23:03:06 +0400356static __u8 *sony_report_fixup(struct hid_device *hdev, __u8 *rdesc,
357 unsigned int *rsize)
Jiri Kosinacc6e0bb2008-10-23 12:58:38 +0200358{
359 struct sony_sc *sc = hid_get_drvdata(hdev);
360
Fernando Luis Vázquez Cao99d24902013-01-22 15:20:38 +0900361 /*
362 * Some Sony RF receivers wrongly declare the mouse pointer as a
363 * a constant non-data variable.
364 */
365 if ((sc->quirks & VAIO_RDESC_CONSTANT) && *rsize >= 56 &&
366 /* usage page: generic desktop controls */
367 /* rdesc[0] == 0x05 && rdesc[1] == 0x01 && */
368 /* usage: mouse */
369 rdesc[2] == 0x09 && rdesc[3] == 0x02 &&
370 /* input (usage page for x,y axes): constant, variable, relative */
371 rdesc[54] == 0x81 && rdesc[55] == 0x07) {
Fernando Luis Vázquez Caoa4649182013-01-15 19:40:48 +0900372 hid_info(hdev, "Fixing up Sony RF Receiver report descriptor\n");
Fernando Luis Vázquez Cao99d24902013-01-22 15:20:38 +0900373 /* input: data, variable, relative */
Jiri Kosinacc6e0bb2008-10-23 12:58:38 +0200374 rdesc[55] = 0x06;
375 }
Simon Wood61ab44b2011-06-10 12:00:26 +0200376
Frank Prazniked19d8c2014-01-16 21:43:12 -0500377 /*
378 * The default Dualshock 4 USB descriptor doesn't assign
379 * the gyroscope values to corresponding axes so we need a
380 * modified one.
381 */
382 if ((sc->quirks & DUALSHOCK4_CONTROLLER_USB) && *rsize == 467) {
383 hid_info(hdev, "Using modified Dualshock 4 report descriptor with gyroscope axes\n");
384 rdesc = dualshock4_usb_rdesc;
385 *rsize = sizeof(dualshock4_usb_rdesc);
386 }
387
Simon Wood61ab44b2011-06-10 12:00:26 +0200388 /* The HID descriptor exposed over BT has a trailing zero byte */
389 if ((((sc->quirks & SIXAXIS_CONTROLLER_USB) && *rsize == 148) ||
390 ((sc->quirks & SIXAXIS_CONTROLLER_BT) && *rsize == 149)) &&
391 rdesc[83] == 0x75) {
392 hid_info(hdev, "Fixing up Sony Sixaxis report descriptor\n");
393 memcpy((void *)&rdesc[83], (void *)&sixaxis_rdesc_fixup,
394 sizeof(sixaxis_rdesc_fixup));
Mauro Carvalho Chehabe57a67d2012-12-14 20:57:34 -0200395 } else if (sc->quirks & SIXAXIS_CONTROLLER_USB &&
396 *rsize > sizeof(sixaxis_rdesc_fixup2)) {
397 hid_info(hdev, "Sony Sixaxis clone detected. Using original report descriptor (size: %d clone; %d new)\n",
398 *rsize, (int)sizeof(sixaxis_rdesc_fixup2));
399 *rsize = sizeof(sixaxis_rdesc_fixup2);
400 memcpy(rdesc, &sixaxis_rdesc_fixup2, *rsize);
Simon Wood61ab44b2011-06-10 12:00:26 +0200401 }
Jiri Kosina078328d2013-06-13 12:03:49 +0200402
403 if (sc->quirks & PS3REMOTE)
404 return ps3remote_fixup(hdev, rdesc, rsize);
405
Nikolai Kondrashov73e40082010-08-06 23:03:06 +0400406 return rdesc;
Jiri Kosinacc6e0bb2008-10-23 12:58:38 +0200407}
408
Simon Woodc9e4d872011-06-10 12:00:27 +0200409static int sony_raw_event(struct hid_device *hdev, struct hid_report *report,
410 __u8 *rd, int size)
411{
412 struct sony_sc *sc = hid_get_drvdata(hdev);
413
414 /* Sixaxis HID report has acclerometers/gyro with MSByte first, this
415 * has to be BYTE_SWAPPED before passing up to joystick interface
416 */
417 if ((sc->quirks & (SIXAXIS_CONTROLLER_USB | SIXAXIS_CONTROLLER_BT)) &&
418 rd[0] == 0x01 && size == 49) {
419 swap(rd[41], rd[42]);
420 swap(rd[43], rd[44]);
421 swap(rd[45], rd[46]);
422 swap(rd[47], rd[48]);
423 }
424
425 return 0;
426}
427
Colin Leitnerf04d5142013-05-27 23:41:05 +0200428static int sony_mapping(struct hid_device *hdev, struct hid_input *hi,
429 struct hid_field *field, struct hid_usage *usage,
430 unsigned long **bit, int *max)
431{
432 struct sony_sc *sc = hid_get_drvdata(hdev);
433
434 if (sc->quirks & BUZZ_CONTROLLER) {
435 unsigned int key = usage->hid & HID_USAGE;
436
437 if ((usage->hid & HID_USAGE_PAGE) != HID_UP_BUTTON)
438 return -1;
439
440 switch (usage->collection_index) {
441 case 1:
442 if (key >= ARRAY_SIZE(buzz_keymap))
443 return -1;
444
445 key = buzz_keymap[key];
446 if (!key)
447 return -1;
448 break;
449 default:
450 return -1;
451 }
452
453 hid_map_usage_clear(hi, usage, bit, max, EV_KEY, key);
454 return 1;
455 }
456
Jiri Kosina078328d2013-06-13 12:03:49 +0200457 if (sc->quirks & PS3REMOTE)
458 return ps3remote_mapping(hdev, hi, field, usage, bit, max);
459
Benjamin Tissoires6f498012013-07-24 16:53:07 +0200460 /* Let hid-core decide for the others */
461 return 0;
Colin Leitnerf04d5142013-05-27 23:41:05 +0200462}
463
Antonio Ospite5710fab2011-02-20 18:26:45 +0100464/*
465 * The Sony Sixaxis does not handle HID Output Reports on the Interrupt EP
466 * like it should according to usbhid/hid-core.c::usbhid_output_raw_report()
467 * so we need to override that forcing HID Output Reports on the Control EP.
468 *
469 * There is also another issue about HID Output Reports via USB, the Sixaxis
470 * does not want the report_id as part of the data packet, so we have to
471 * discard buf[0] when sending the actual control message, even for numbered
472 * reports, humpf!
473 */
Antonio Ospite569b10a2010-10-19 16:13:10 +0200474static int sixaxis_usb_output_raw_report(struct hid_device *hid, __u8 *buf,
475 size_t count, unsigned char report_type)
476{
477 struct usb_interface *intf = to_usb_interface(hid->dev.parent);
478 struct usb_device *dev = interface_to_usbdev(intf);
479 struct usb_host_interface *interface = intf->cur_altsetting;
480 int report_id = buf[0];
481 int ret;
482
Antonio Ospite5710fab2011-02-20 18:26:45 +0100483 if (report_type == HID_OUTPUT_REPORT) {
484 /* Don't send the Report ID */
485 buf++;
486 count--;
487 }
488
Antonio Ospite569b10a2010-10-19 16:13:10 +0200489 ret = usb_control_msg(dev, usb_sndctrlpipe(dev, 0),
490 HID_REQ_SET_REPORT,
491 USB_DIR_OUT | USB_TYPE_CLASS | USB_RECIP_INTERFACE,
492 ((report_type + 1) << 8) | report_id,
493 interface->desc.bInterfaceNumber, buf, count,
494 USB_CTRL_SET_TIMEOUT);
495
Antonio Ospite5710fab2011-02-20 18:26:45 +0100496 /* Count also the Report ID, in case of an Output report. */
497 if (ret > 0 && report_type == HID_OUTPUT_REPORT)
498 ret++;
499
Antonio Ospite569b10a2010-10-19 16:13:10 +0200500 return ret;
501}
502
Jiri Slabybd28ce02008-06-25 23:47:04 +0200503/*
504 * Sending HID_REQ_GET_REPORT changes the operation mode of the ps3 controller
505 * to "operational". Without this, the ps3 controller will not report any
506 * events.
507 */
Antonio Ospite816651a2010-05-03 22:15:55 +0200508static int sixaxis_set_operational_usb(struct hid_device *hdev)
Jiri Slabybd28ce02008-06-25 23:47:04 +0200509{
Jiri Slabybd28ce02008-06-25 23:47:04 +0200510 int ret;
511 char *buf = kmalloc(18, GFP_KERNEL);
512
513 if (!buf)
514 return -ENOMEM;
515
Benjamin Tissoiresf204828a2013-09-11 22:12:25 +0200516 ret = hdev->hid_get_raw_report(hdev, 0xf2, buf, 17, HID_FEATURE_REPORT);
517
Jiri Slabybd28ce02008-06-25 23:47:04 +0200518 if (ret < 0)
Joe Perches4291ee32010-12-09 19:29:03 -0800519 hid_err(hdev, "can't set operational mode\n");
Jiri Slabybd28ce02008-06-25 23:47:04 +0200520
521 kfree(buf);
522
523 return ret;
524}
525
Antonio Ospite816651a2010-05-03 22:15:55 +0200526static int sixaxis_set_operational_bt(struct hid_device *hdev)
Bastien Noceraf9ce7c22010-01-20 12:01:53 +0000527{
Antonio Ospitefddb33f2010-05-03 17:19:03 +0200528 unsigned char buf[] = { 0xf4, 0x42, 0x03, 0x00, 0x00 };
Bastien Noceraf9ce7c22010-01-20 12:01:53 +0000529 return hdev->hid_output_raw_report(hdev, buf, sizeof(buf), HID_FEATURE_REPORT);
530}
531
Frank Praznik60781cf2014-01-11 15:13:15 -0500532static void buzz_set_leds(struct hid_device *hdev, const __u8 *leds)
Colin Leitnerf04d5142013-05-27 23:41:05 +0200533{
534 struct list_head *report_list =
535 &hdev->report_enum[HID_OUTPUT_REPORT].report_list;
536 struct hid_report *report = list_entry(report_list->next,
537 struct hid_report, list);
538 __s32 *value = report->field[0]->value;
539
540 value[0] = 0x00;
Frank Praznik60781cf2014-01-11 15:13:15 -0500541 value[1] = leds[0] ? 0xff : 0x00;
542 value[2] = leds[1] ? 0xff : 0x00;
543 value[3] = leds[2] ? 0xff : 0x00;
544 value[4] = leds[3] ? 0xff : 0x00;
Colin Leitnerf04d5142013-05-27 23:41:05 +0200545 value[5] = 0x00;
546 value[6] = 0x00;
547 hid_hw_request(hdev, report, HID_REQ_SET_REPORT);
548}
549
Frank Praznik60781cf2014-01-11 15:13:15 -0500550static void sony_set_leds(struct hid_device *hdev, const __u8 *leds, int count)
Sven Eckelmann0a286ef2013-11-19 20:26:32 +0100551{
552 struct sony_sc *drv_data = hid_get_drvdata(hdev);
Frank Praznik60781cf2014-01-11 15:13:15 -0500553 int n;
Sven Eckelmann0a286ef2013-11-19 20:26:32 +0100554
Frank Praznik60781cf2014-01-11 15:13:15 -0500555 BUG_ON(count > MAX_LEDS);
556
557 if (drv_data->quirks & BUZZ_CONTROLLER && count == 4) {
Sven Eckelmann0a286ef2013-11-19 20:26:32 +0100558 buzz_set_leds(hdev, leds);
Frank Praznik60781cf2014-01-11 15:13:15 -0500559 } else if ((drv_data->quirks & SIXAXIS_CONTROLLER_USB) ||
Frank Praznik8ab16762014-01-16 21:42:31 -0500560 (drv_data->quirks & DUALSHOCK4_CONTROLLER_USB)) {
Frank Praznik60781cf2014-01-11 15:13:15 -0500561 for (n = 0; n < count; n++)
562 drv_data->led_state[n] = leds[n];
Sven Eckelmann0a286ef2013-11-19 20:26:32 +0100563 schedule_work(&drv_data->state_worker);
564 }
565}
566
Sven Eckelmannc5382512013-11-19 20:26:30 +0100567static void sony_led_set_brightness(struct led_classdev *led,
Colin Leitnerf04d5142013-05-27 23:41:05 +0200568 enum led_brightness value)
569{
570 struct device *dev = led->dev->parent;
571 struct hid_device *hdev = container_of(dev, struct hid_device, dev);
572 struct sony_sc *drv_data;
Colin Leitnerf04d5142013-05-27 23:41:05 +0200573
574 int n;
575
576 drv_data = hid_get_drvdata(hdev);
Sven Eckelmann2251b852013-11-19 20:26:31 +0100577 if (!drv_data) {
Colin Leitnerf04d5142013-05-27 23:41:05 +0200578 hid_err(hdev, "No device data\n");
579 return;
580 }
Colin Leitnerf04d5142013-05-27 23:41:05 +0200581
Frank Praznik60781cf2014-01-11 15:13:15 -0500582 for (n = 0; n < drv_data->led_count; n++) {
Sven Eckelmann2251b852013-11-19 20:26:31 +0100583 if (led == drv_data->leds[n]) {
Frank Praznik60781cf2014-01-11 15:13:15 -0500584 if (value != drv_data->led_state[n]) {
585 drv_data->led_state[n] = value;
586 sony_set_leds(hdev, drv_data->led_state, drv_data->led_count);
Colin Leitnerf04d5142013-05-27 23:41:05 +0200587 }
588 break;
589 }
590 }
591}
592
Sven Eckelmannc5382512013-11-19 20:26:30 +0100593static enum led_brightness sony_led_get_brightness(struct led_classdev *led)
Colin Leitnerf04d5142013-05-27 23:41:05 +0200594{
595 struct device *dev = led->dev->parent;
596 struct hid_device *hdev = container_of(dev, struct hid_device, dev);
597 struct sony_sc *drv_data;
Colin Leitnerf04d5142013-05-27 23:41:05 +0200598
599 int n;
600 int on = 0;
601
602 drv_data = hid_get_drvdata(hdev);
Sven Eckelmann2251b852013-11-19 20:26:31 +0100603 if (!drv_data) {
Colin Leitnerf04d5142013-05-27 23:41:05 +0200604 hid_err(hdev, "No device data\n");
605 return LED_OFF;
606 }
Colin Leitnerf04d5142013-05-27 23:41:05 +0200607
Frank Praznik60781cf2014-01-11 15:13:15 -0500608 for (n = 0; n < drv_data->led_count; n++) {
Sven Eckelmann2251b852013-11-19 20:26:31 +0100609 if (led == drv_data->leds[n]) {
Frank Praznik60781cf2014-01-11 15:13:15 -0500610 on = !!(drv_data->led_state[n]);
Colin Leitnerf04d5142013-05-27 23:41:05 +0200611 break;
612 }
613 }
614
615 return on ? LED_FULL : LED_OFF;
616}
Colin Leitnerf04d5142013-05-27 23:41:05 +0200617
Sven Eckelmann0a286ef2013-11-19 20:26:32 +0100618static void sony_leds_remove(struct hid_device *hdev)
619{
620 struct sony_sc *drv_data;
621 struct led_classdev *led;
622 int n;
623
624 drv_data = hid_get_drvdata(hdev);
625 BUG_ON(!(drv_data->quirks & SONY_LED_SUPPORT));
626
Frank Praznik60781cf2014-01-11 15:13:15 -0500627 for (n = 0; n < drv_data->led_count; n++) {
Sven Eckelmann0a286ef2013-11-19 20:26:32 +0100628 led = drv_data->leds[n];
629 drv_data->leds[n] = NULL;
630 if (!led)
631 continue;
632 led_classdev_unregister(led);
633 kfree(led);
634 }
Frank Praznik60781cf2014-01-11 15:13:15 -0500635
636 drv_data->led_count = 0;
Sven Eckelmann0a286ef2013-11-19 20:26:32 +0100637}
638
Sven Eckelmannc5382512013-11-19 20:26:30 +0100639static int sony_leds_init(struct hid_device *hdev)
Colin Leitnerf04d5142013-05-27 23:41:05 +0200640{
641 struct sony_sc *drv_data;
Jiri Kosina40e32ee2013-05-28 11:22:09 +0200642 int n, ret = 0;
Frank Praznik60781cf2014-01-11 15:13:15 -0500643 int max_brightness;
Jiri Kosina40e32ee2013-05-28 11:22:09 +0200644 struct led_classdev *led;
645 size_t name_sz;
646 char *name;
Sven Eckelmann0a286ef2013-11-19 20:26:32 +0100647 size_t name_len;
648 const char *name_fmt;
Frank Praznik60781cf2014-01-11 15:13:15 -0500649 static const __u8 initial_values[MAX_LEDS] = { 0x00, 0x00, 0x00, 0x00 };
Colin Leitnerf04d5142013-05-27 23:41:05 +0200650
651 drv_data = hid_get_drvdata(hdev);
Sven Eckelmann0a286ef2013-11-19 20:26:32 +0100652 BUG_ON(!(drv_data->quirks & SONY_LED_SUPPORT));
Colin Leitnerf04d5142013-05-27 23:41:05 +0200653
Sven Eckelmann0a286ef2013-11-19 20:26:32 +0100654 if (drv_data->quirks & BUZZ_CONTROLLER) {
655 name_len = strlen("::buzz#");
656 name_fmt = "%s::buzz%d";
657 /* Validate expected report characteristics. */
658 if (!hid_validate_values(hdev, HID_OUTPUT_REPORT, 0, 0, 7))
659 return -ENODEV;
660 } else {
661 name_len = strlen("::sony#");
662 name_fmt = "%s::sony%d";
663 }
Kees Cook9446edb2013-09-11 21:56:52 +0200664
Frank Praznik8ab16762014-01-16 21:42:31 -0500665 if (drv_data->quirks & DUALSHOCK4_CONTROLLER_USB) {
Frank Praznik60781cf2014-01-11 15:13:15 -0500666 drv_data->led_count = 3;
667 max_brightness = 255;
668 } else {
669 drv_data->led_count = 4;
670 max_brightness = 1;
671 }
672
Colin Leitnerf04d5142013-05-27 23:41:05 +0200673 /* Clear LEDs as we have no way of reading their initial state. This is
674 * only relevant if the driver is loaded after somebody actively set the
675 * LEDs to on */
Frank Praznik60781cf2014-01-11 15:13:15 -0500676 sony_set_leds(hdev, initial_values, drv_data->led_count);
Colin Leitnerf04d5142013-05-27 23:41:05 +0200677
Sven Eckelmann0a286ef2013-11-19 20:26:32 +0100678 name_sz = strlen(dev_name(&hdev->dev)) + name_len + 1;
Colin Leitnerf04d5142013-05-27 23:41:05 +0200679
Frank Praznik60781cf2014-01-11 15:13:15 -0500680 for (n = 0; n < drv_data->led_count; n++) {
Jiri Kosina40e32ee2013-05-28 11:22:09 +0200681 led = kzalloc(sizeof(struct led_classdev) + name_sz, GFP_KERNEL);
682 if (!led) {
683 hid_err(hdev, "Couldn't allocate memory for LED %d\n", n);
Julia Lawall8cd5fcd2013-12-29 23:47:27 +0100684 ret = -ENOMEM;
Jiri Kosina40e32ee2013-05-28 11:22:09 +0200685 goto error_leds;
Colin Leitnerf04d5142013-05-27 23:41:05 +0200686 }
Jiri Kosina40e32ee2013-05-28 11:22:09 +0200687
688 name = (void *)(&led[1]);
Sven Eckelmann0a286ef2013-11-19 20:26:32 +0100689 snprintf(name, name_sz, name_fmt, dev_name(&hdev->dev), n + 1);
Jiri Kosina40e32ee2013-05-28 11:22:09 +0200690 led->name = name;
691 led->brightness = 0;
Frank Praznik60781cf2014-01-11 15:13:15 -0500692 led->max_brightness = max_brightness;
Sven Eckelmannc5382512013-11-19 20:26:30 +0100693 led->brightness_get = sony_led_get_brightness;
694 led->brightness_set = sony_led_set_brightness;
Jiri Kosina40e32ee2013-05-28 11:22:09 +0200695
Julia Lawall8cd5fcd2013-12-29 23:47:27 +0100696 ret = led_classdev_register(&hdev->dev, led);
697 if (ret) {
Jiri Kosina40e32ee2013-05-28 11:22:09 +0200698 hid_err(hdev, "Failed to register LED %d\n", n);
699 kfree(led);
700 goto error_leds;
701 }
702
Sven Eckelmann2251b852013-11-19 20:26:31 +0100703 drv_data->leds[n] = led;
Colin Leitnerf04d5142013-05-27 23:41:05 +0200704 }
Colin Leitnerf04d5142013-05-27 23:41:05 +0200705
706 return ret;
707
Colin Leitnerf04d5142013-05-27 23:41:05 +0200708error_leds:
Sven Eckelmann0a286ef2013-11-19 20:26:32 +0100709 sony_leds_remove(hdev);
Colin Leitnerf04d5142013-05-27 23:41:05 +0200710
Colin Leitnerf04d5142013-05-27 23:41:05 +0200711 return ret;
Colin Leitnerf04d5142013-05-27 23:41:05 +0200712}
713
Frank Praznikcad665a2014-01-11 15:13:54 -0500714static void sixaxis_state_worker(struct work_struct *work)
Sven Eckelmanna08c22c2013-11-09 19:25:57 +0100715{
Sven Eckelmann92b5c412013-11-19 20:26:28 +0100716 struct sony_sc *sc = container_of(work, struct sony_sc, state_worker);
Sven Eckelmanna08c22c2013-11-09 19:25:57 +0100717 unsigned char buf[] = {
718 0x01,
719 0x00, 0xff, 0x00, 0xff, 0x00,
Sven Eckelmann0a286ef2013-11-19 20:26:32 +0100720 0x00, 0x00, 0x00, 0x00, 0x00,
Sven Eckelmanna08c22c2013-11-09 19:25:57 +0100721 0xff, 0x27, 0x10, 0x00, 0x32,
722 0xff, 0x27, 0x10, 0x00, 0x32,
723 0xff, 0x27, 0x10, 0x00, 0x32,
724 0xff, 0x27, 0x10, 0x00, 0x32,
725 0x00, 0x00, 0x00, 0x00, 0x00
726 };
Sven Eckelmann9f323b62013-11-17 20:38:21 +0100727
Sven Eckelmann0a286ef2013-11-19 20:26:32 +0100728#ifdef CONFIG_SONY_FF
Frank Praznik0bd88dd2014-01-11 15:12:42 -0500729 buf[3] = sc->right ? 1 : 0;
Sven Eckelmann9f323b62013-11-17 20:38:21 +0100730 buf[5] = sc->left;
Sven Eckelmann0a286ef2013-11-19 20:26:32 +0100731#endif
732
Frank Praznik60781cf2014-01-11 15:13:15 -0500733 buf[10] |= sc->led_state[0] << 1;
734 buf[10] |= sc->led_state[1] << 2;
735 buf[10] |= sc->led_state[2] << 3;
736 buf[10] |= sc->led_state[3] << 4;
Sven Eckelmann9f323b62013-11-17 20:38:21 +0100737
738 sc->hdev->hid_output_raw_report(sc->hdev, buf, sizeof(buf),
739 HID_OUTPUT_REPORT);
740}
741
Frank Praznik0bd88dd2014-01-11 15:12:42 -0500742static void dualshock4_state_worker(struct work_struct *work)
743{
744 struct sony_sc *sc = container_of(work, struct sony_sc, state_worker);
Frank Praznik0da8ea62014-01-16 21:42:51 -0500745 struct hid_device *hdev = sc->hdev;
746 struct list_head *head, *list;
747 struct hid_report *report;
748 __s32 *value;
749
750 list = &hdev->report_enum[HID_OUTPUT_REPORT].report_list;
751
752 list_for_each(head, list) {
753 report = list_entry(head, struct hid_report, list);
754
755 /* Report 5 is used to send data to the controller via USB */
756 if ((sc->quirks & DUALSHOCK4_CONTROLLER_USB) && report->id == 5)
757 break;
758 }
759
760 if (head == list) {
761 hid_err(hdev, "Dualshock 4 output report not found\n");
762 return;
763 }
764
765 value = report->field[0]->value;
766 value[0] = 0x03;
Frank Praznik0bd88dd2014-01-11 15:12:42 -0500767
768#ifdef CONFIG_SONY_FF
Frank Praznik0da8ea62014-01-16 21:42:51 -0500769 value[3] = sc->right;
770 value[4] = sc->left;
Frank Praznik0bd88dd2014-01-11 15:12:42 -0500771#endif
772
Frank Praznik0da8ea62014-01-16 21:42:51 -0500773 value[5] = sc->led_state[0];
774 value[6] = sc->led_state[1];
775 value[7] = sc->led_state[2];
Frank Praznik60781cf2014-01-11 15:13:15 -0500776
Frank Praznik0da8ea62014-01-16 21:42:51 -0500777 hid_hw_request(hdev, report, HID_REQ_SET_REPORT);
Frank Praznik0bd88dd2014-01-11 15:12:42 -0500778}
779
Sven Eckelmann0a286ef2013-11-19 20:26:32 +0100780#ifdef CONFIG_SONY_FF
Sven Eckelmann9f323b62013-11-17 20:38:21 +0100781static int sony_play_effect(struct input_dev *dev, void *data,
782 struct ff_effect *effect)
783{
Sven Eckelmanna08c22c2013-11-09 19:25:57 +0100784 struct hid_device *hid = input_get_drvdata(dev);
Sven Eckelmann9f323b62013-11-17 20:38:21 +0100785 struct sony_sc *sc = hid_get_drvdata(hid);
Sven Eckelmanna08c22c2013-11-09 19:25:57 +0100786
787 if (effect->type != FF_RUMBLE)
788 return 0;
789
Sven Eckelmann9f323b62013-11-17 20:38:21 +0100790 sc->left = effect->u.rumble.strong_magnitude / 256;
Frank Praznik0bd88dd2014-01-11 15:12:42 -0500791 sc->right = effect->u.rumble.weak_magnitude / 256;
Sven Eckelmanna08c22c2013-11-09 19:25:57 +0100792
Sven Eckelmann92b5c412013-11-19 20:26:28 +0100793 schedule_work(&sc->state_worker);
Sven Eckelmann9f323b62013-11-17 20:38:21 +0100794 return 0;
Sven Eckelmanna08c22c2013-11-09 19:25:57 +0100795}
796
797static int sony_init_ff(struct hid_device *hdev)
798{
799 struct hid_input *hidinput = list_entry(hdev->inputs.next,
800 struct hid_input, list);
801 struct input_dev *input_dev = hidinput->input;
802
803 input_set_capability(input_dev, EV_FF, FF_RUMBLE);
804 return input_ff_create_memless(input_dev, NULL, sony_play_effect);
805}
806
Sven Eckelmann9f323b62013-11-17 20:38:21 +0100807static void sony_destroy_ff(struct hid_device *hdev)
808{
809 struct sony_sc *sc = hid_get_drvdata(hdev);
810
Sven Eckelmann92b5c412013-11-19 20:26:28 +0100811 cancel_work_sync(&sc->state_worker);
Sven Eckelmann9f323b62013-11-17 20:38:21 +0100812}
813
Sven Eckelmanna08c22c2013-11-09 19:25:57 +0100814#else
815static int sony_init_ff(struct hid_device *hdev)
816{
817 return 0;
818}
Sven Eckelmann9f323b62013-11-17 20:38:21 +0100819
820static void sony_destroy_ff(struct hid_device *hdev)
821{
822}
Sven Eckelmanna08c22c2013-11-09 19:25:57 +0100823#endif
824
Jiri Slabybd28ce02008-06-25 23:47:04 +0200825static int sony_probe(struct hid_device *hdev, const struct hid_device_id *id)
826{
827 int ret;
Jiri Kosinacc6e0bb2008-10-23 12:58:38 +0200828 unsigned long quirks = id->driver_data;
829 struct sony_sc *sc;
Colin Leitnerf04d5142013-05-27 23:41:05 +0200830 unsigned int connect_mask = HID_CONNECT_DEFAULT;
Jiri Kosinacc6e0bb2008-10-23 12:58:38 +0200831
Benjamin Tissoiresabf832b2013-07-24 19:38:04 +0200832 sc = devm_kzalloc(&hdev->dev, sizeof(*sc), GFP_KERNEL);
Jiri Kosinacc6e0bb2008-10-23 12:58:38 +0200833 if (sc == NULL) {
Joe Perches4291ee32010-12-09 19:29:03 -0800834 hid_err(hdev, "can't alloc sony descriptor\n");
Jiri Kosinacc6e0bb2008-10-23 12:58:38 +0200835 return -ENOMEM;
836 }
837
838 sc->quirks = quirks;
839 hid_set_drvdata(hdev, sc);
Sven Eckelmann0a286ef2013-11-19 20:26:32 +0100840 sc->hdev = hdev;
Jiri Slabybd28ce02008-06-25 23:47:04 +0200841
Jiri Slabybd28ce02008-06-25 23:47:04 +0200842 ret = hid_parse(hdev);
843 if (ret) {
Joe Perches4291ee32010-12-09 19:29:03 -0800844 hid_err(hdev, "parse failed\n");
Benjamin Tissoiresabf832b2013-07-24 19:38:04 +0200845 return ret;
Jiri Slabybd28ce02008-06-25 23:47:04 +0200846 }
847
Colin Leitnerf04d5142013-05-27 23:41:05 +0200848 if (sc->quirks & VAIO_RDESC_CONSTANT)
849 connect_mask |= HID_CONNECT_HIDDEV_FORCE;
850 else if (sc->quirks & SIXAXIS_CONTROLLER_USB)
851 connect_mask |= HID_CONNECT_HIDDEV_FORCE;
852 else if (sc->quirks & SIXAXIS_CONTROLLER_BT)
853 connect_mask |= HID_CONNECT_HIDDEV_FORCE;
854
855 ret = hid_hw_start(hdev, connect_mask);
Jiri Slabybd28ce02008-06-25 23:47:04 +0200856 if (ret) {
Joe Perches4291ee32010-12-09 19:29:03 -0800857 hid_err(hdev, "hw start failed\n");
Benjamin Tissoiresabf832b2013-07-24 19:38:04 +0200858 return ret;
Jiri Slabybd28ce02008-06-25 23:47:04 +0200859 }
860
Antonio Ospite569b10a2010-10-19 16:13:10 +0200861 if (sc->quirks & SIXAXIS_CONTROLLER_USB) {
862 hdev->hid_output_raw_report = sixaxis_usb_output_raw_report;
Antonio Ospite816651a2010-05-03 22:15:55 +0200863 ret = sixaxis_set_operational_usb(hdev);
Frank Praznikcad665a2014-01-11 15:13:54 -0500864 INIT_WORK(&sc->state_worker, sixaxis_state_worker);
Antonio Ospite569b10a2010-10-19 16:13:10 +0200865 }
Antonio Ospite816651a2010-05-03 22:15:55 +0200866 else if (sc->quirks & SIXAXIS_CONTROLLER_BT)
867 ret = sixaxis_set_operational_bt(hdev);
Frank Praznik8ab16762014-01-16 21:42:31 -0500868 else if (sc->quirks & DUALSHOCK4_CONTROLLER_USB) {
Bastien Noceraf9ce7c22010-01-20 12:01:53 +0000869 ret = 0;
Frank Praznik0bd88dd2014-01-11 15:12:42 -0500870 INIT_WORK(&sc->state_worker, dualshock4_state_worker);
871 } else {
872 ret = 0;
873 }
Bastien Noceraf9ce7c22010-01-20 12:01:53 +0000874
Jiri Kosina4dfdc462008-12-30 00:49:59 +0100875 if (ret < 0)
Jiri Slabybd28ce02008-06-25 23:47:04 +0200876 goto err_stop;
877
Sven Eckelmann0a286ef2013-11-19 20:26:32 +0100878 if (sc->quirks & SONY_LED_SUPPORT) {
879 ret = sony_leds_init(hdev);
880 if (ret < 0)
881 goto err_stop;
882 }
883
Sven Eckelmanna08c22c2013-11-09 19:25:57 +0100884 ret = sony_init_ff(hdev);
885 if (ret < 0)
886 goto err_stop;
887
Jiri Slabybd28ce02008-06-25 23:47:04 +0200888 return 0;
889err_stop:
Sven Eckelmann0a286ef2013-11-19 20:26:32 +0100890 if (sc->quirks & SONY_LED_SUPPORT)
891 sony_leds_remove(hdev);
Jiri Slabybd28ce02008-06-25 23:47:04 +0200892 hid_hw_stop(hdev);
Jiri Slabybd28ce02008-06-25 23:47:04 +0200893 return ret;
894}
895
Jiri Kosinacc6e0bb2008-10-23 12:58:38 +0200896static void sony_remove(struct hid_device *hdev)
897{
Colin Leitnerf04d5142013-05-27 23:41:05 +0200898 struct sony_sc *sc = hid_get_drvdata(hdev);
899
Sven Eckelmann0a286ef2013-11-19 20:26:32 +0100900 if (sc->quirks & SONY_LED_SUPPORT)
Sven Eckelmannc5382512013-11-19 20:26:30 +0100901 sony_leds_remove(hdev);
Colin Leitnerf04d5142013-05-27 23:41:05 +0200902
Sven Eckelmann9f323b62013-11-17 20:38:21 +0100903 sony_destroy_ff(hdev);
904
Jiri Kosinacc6e0bb2008-10-23 12:58:38 +0200905 hid_hw_stop(hdev);
Jiri Kosinacc6e0bb2008-10-23 12:58:38 +0200906}
907
Jiri Slabybd28ce02008-06-25 23:47:04 +0200908static const struct hid_device_id sony_devices[] = {
Antonio Ospite816651a2010-05-03 22:15:55 +0200909 { HID_USB_DEVICE(USB_VENDOR_ID_SONY, USB_DEVICE_ID_SONY_PS3_CONTROLLER),
910 .driver_data = SIXAXIS_CONTROLLER_USB },
Jiri Kosina35dca5b2011-04-28 15:43:13 +0200911 { HID_USB_DEVICE(USB_VENDOR_ID_SONY, USB_DEVICE_ID_SONY_NAVIGATION_CONTROLLER),
912 .driver_data = SIXAXIS_CONTROLLER_USB },
Antonio Ospite816651a2010-05-03 22:15:55 +0200913 { HID_BLUETOOTH_DEVICE(USB_VENDOR_ID_SONY, USB_DEVICE_ID_SONY_PS3_CONTROLLER),
914 .driver_data = SIXAXIS_CONTROLLER_BT },
Jiri Kosinacc6e0bb2008-10-23 12:58:38 +0200915 { HID_USB_DEVICE(USB_VENDOR_ID_SONY, USB_DEVICE_ID_SONY_VAIO_VGX_MOUSE),
916 .driver_data = VAIO_RDESC_CONSTANT },
Fernando Luis Vázquez Caoa4649182013-01-15 19:40:48 +0900917 { HID_USB_DEVICE(USB_VENDOR_ID_SONY, USB_DEVICE_ID_SONY_VAIO_VGP_MOUSE),
918 .driver_data = VAIO_RDESC_CONSTANT },
Colin Leitnerf04d5142013-05-27 23:41:05 +0200919 /* Wired Buzz Controller. Reported as Sony Hub from its USB ID and as
920 * Logitech joystick from the device descriptor. */
921 { HID_USB_DEVICE(USB_VENDOR_ID_SONY, USB_DEVICE_ID_SONY_BUZZ_CONTROLLER),
922 .driver_data = BUZZ_CONTROLLER },
923 { HID_USB_DEVICE(USB_VENDOR_ID_SONY, USB_DEVICE_ID_SONY_WIRELESS_BUZZ_CONTROLLER),
924 .driver_data = BUZZ_CONTROLLER },
Jiri Kosina078328d2013-06-13 12:03:49 +0200925 /* PS3 BD Remote Control */
926 { HID_BLUETOOTH_DEVICE(USB_VENDOR_ID_SONY, USB_DEVICE_ID_SONY_PS3_BDREMOTE),
927 .driver_data = PS3REMOTE },
928 /* Logitech Harmony Adapter for PS3 */
929 { HID_BLUETOOTH_DEVICE(USB_VENDOR_ID_LOGITECH, USB_DEVICE_ID_LOGITECH_HARMONY_PS3),
930 .driver_data = PS3REMOTE },
Frank Praznik0bd88dd2014-01-11 15:12:42 -0500931 /* Sony Dualshock 4 controllers for PS4 */
932 { HID_USB_DEVICE(USB_VENDOR_ID_SONY, USB_DEVICE_ID_SONY_PS4_CONTROLLER),
Frank Praznik8ab16762014-01-16 21:42:31 -0500933 .driver_data = DUALSHOCK4_CONTROLLER_USB },
Frank Praznik0bd88dd2014-01-11 15:12:42 -0500934 { HID_BLUETOOTH_DEVICE(USB_VENDOR_ID_SONY, USB_DEVICE_ID_SONY_PS4_CONTROLLER),
Frank Praznik8ab16762014-01-16 21:42:31 -0500935 .driver_data = DUALSHOCK4_CONTROLLER_BT },
Jiri Slabybd28ce02008-06-25 23:47:04 +0200936 { }
937};
938MODULE_DEVICE_TABLE(hid, sony_devices);
939
940static struct hid_driver sony_driver = {
Colin Leitnerf04d5142013-05-27 23:41:05 +0200941 .name = "sony",
942 .id_table = sony_devices,
943 .input_mapping = sony_mapping,
944 .probe = sony_probe,
945 .remove = sony_remove,
946 .report_fixup = sony_report_fixup,
947 .raw_event = sony_raw_event
Jiri Slabybd28ce02008-06-25 23:47:04 +0200948};
H Hartley Sweetenf4254582012-12-17 15:28:26 -0700949module_hid_driver(sony_driver);
Jiri Slabybd28ce02008-06-25 23:47:04 +0200950
Jiri Slabybd28ce02008-06-25 23:47:04 +0200951MODULE_LICENSE("GPL");