1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29#include <linux/device.h>
30#include <linux/hid.h>
31#include <linux/module.h>
32#include <linux/slab.h>
33#include <linux/leds.h>
34#include <linux/power_supply.h>
35#include <linux/spinlock.h>
36#include <linux/list.h>
37#include <linux/idr.h>
38#include <linux/input/mt.h>
39#include <linux/crc32.h>
40#include <asm/unaligned.h>
41
42#include "hid-ids.h"
43
44#define VAIO_RDESC_CONSTANT BIT(0)
45#define SIXAXIS_CONTROLLER_USB BIT(1)
46#define SIXAXIS_CONTROLLER_BT BIT(2)
47#define BUZZ_CONTROLLER BIT(3)
48#define PS3REMOTE BIT(4)
49#define DUALSHOCK4_CONTROLLER_USB BIT(5)
50#define DUALSHOCK4_CONTROLLER_BT BIT(6)
51#define DUALSHOCK4_DONGLE BIT(7)
52#define MOTION_CONTROLLER_USB BIT(8)
53#define MOTION_CONTROLLER_BT BIT(9)
54#define NAVIGATION_CONTROLLER_USB BIT(10)
55#define NAVIGATION_CONTROLLER_BT BIT(11)
56#define SINO_LITE_CONTROLLER BIT(12)
57#define FUTUREMAX_DANCE_MAT BIT(13)
58
59#define SIXAXIS_CONTROLLER (SIXAXIS_CONTROLLER_USB | SIXAXIS_CONTROLLER_BT)
60#define MOTION_CONTROLLER (MOTION_CONTROLLER_USB | MOTION_CONTROLLER_BT)
61#define NAVIGATION_CONTROLLER (NAVIGATION_CONTROLLER_USB |\
62 NAVIGATION_CONTROLLER_BT)
63#define DUALSHOCK4_CONTROLLER (DUALSHOCK4_CONTROLLER_USB |\
64 DUALSHOCK4_CONTROLLER_BT | \
65 DUALSHOCK4_DONGLE)
66#define SONY_LED_SUPPORT (SIXAXIS_CONTROLLER | BUZZ_CONTROLLER |\
67 DUALSHOCK4_CONTROLLER | MOTION_CONTROLLER |\
68 NAVIGATION_CONTROLLER)
69#define SONY_BATTERY_SUPPORT (SIXAXIS_CONTROLLER | DUALSHOCK4_CONTROLLER |\
70 MOTION_CONTROLLER_BT | NAVIGATION_CONTROLLER)
71#define SONY_FF_SUPPORT (SIXAXIS_CONTROLLER | DUALSHOCK4_CONTROLLER |\
72 MOTION_CONTROLLER)
73#define SONY_BT_DEVICE (SIXAXIS_CONTROLLER_BT | DUALSHOCK4_CONTROLLER_BT |\
74 MOTION_CONTROLLER_BT | NAVIGATION_CONTROLLER_BT)
75
76#define MAX_LEDS 4
77
78
79
80static u8 motion_rdesc[] = {
81 0x05, 0x01,
82 0x09, 0x04,
83 0xA1, 0x01,
84 0xA1, 0x02,
85 0x85, 0x01,
86 0x75, 0x01,
87 0x95, 0x15,
88 0x15, 0x00,
89 0x25, 0x01,
90 0x35, 0x00,
91 0x45, 0x01,
92 0x05, 0x09,
93 0x19, 0x01,
94 0x29, 0x15,
95 0x81, 0x02,
96 0x95, 0x0B,
97 0x06, 0x00, 0xFF,
98 0x81, 0x03,
99 0x15, 0x00,
100 0x26, 0xFF, 0x00,
101 0x05, 0x01,
102 0xA1, 0x00,
103 0x75, 0x08,
104 0x95, 0x01,
105 0x35, 0x00,
106 0x46, 0xFF, 0x00,
107 0x09, 0x30,
108 0x81, 0x02,
109 0xC0,
110 0x06, 0x00, 0xFF,
111 0x75, 0x08,
112 0x95, 0x07,
113 0x81, 0x02,
114 0x05, 0x01,
115 0x75, 0x10,
116 0x46, 0xFF, 0xFF,
117 0x27, 0xFF, 0xFF, 0x00, 0x00,
118 0x95, 0x03,
119 0x09, 0x33,
120 0x09, 0x34,
121 0x09, 0x35,
122 0x81, 0x02,
123 0x06, 0x00, 0xFF,
124 0x95, 0x03,
125 0x81, 0x02,
126 0x05, 0x01,
127 0x09, 0x01,
128 0x95, 0x03,
129 0x81, 0x02,
130 0x06, 0x00, 0xFF,
131 0x95, 0x03,
132 0x81, 0x02,
133 0x75, 0x0C,
134 0x46, 0xFF, 0x0F,
135 0x26, 0xFF, 0x0F,
136 0x95, 0x04,
137 0x81, 0x02,
138 0x75, 0x08,
139 0x46, 0xFF, 0x00,
140 0x26, 0xFF, 0x00,
141 0x95, 0x06,
142 0x81, 0x02,
143 0x75, 0x08,
144 0x95, 0x30,
145 0x09, 0x01,
146 0x91, 0x02,
147 0x75, 0x08,
148 0x95, 0x30,
149 0x09, 0x01,
150 0xB1, 0x02,
151 0xC0,
152 0xA1, 0x02,
153 0x85, 0x02,
154 0x75, 0x08,
155 0x95, 0x30,
156 0x09, 0x01,
157 0xB1, 0x02,
158 0xC0,
159 0xA1, 0x02,
160 0x85, 0xEE,
161 0x75, 0x08,
162 0x95, 0x30,
163 0x09, 0x01,
164 0xB1, 0x02,
165 0xC0,
166 0xA1, 0x02,
167 0x85, 0xEF,
168 0x75, 0x08,
169 0x95, 0x30,
170 0x09, 0x01,
171 0xB1, 0x02,
172 0xC0,
173 0xC0
174};
175
176static u8 ps3remote_rdesc[] = {
177 0x05, 0x01,
178 0x09, 0x05,
179 0xA1, 0x01,
180
181
182 0xA1, 0x02,
183
184
185
186
187
188 0x75, 0x08,
189 0x95, 0x01,
190 0x81, 0x01,
191
192
193
194
195
196 0x05, 0x09,
197 0x19, 0x01,
198 0x29, 0x18,
199 0x14,
200 0x25, 0x01,
201 0x75, 0x01,
202 0x95, 0x18,
203 0x81, 0x02,
204
205 0xC0,
206
207
208 0xA1, 0x02,
209
210
211 0x05, 0x09,
212 0x18,
213 0x29, 0xFE,
214 0x14,
215 0x26, 0xFE, 0x00,
216 0x75, 0x08,
217 0x95, 0x01,
218 0x80,
219
220
221
222
223
224 0x75, 0x08,
225 0x95, 0x06,
226 0x81, 0x01,
227
228
229 0x05, 0x06,
230 0x09, 0x20,
231 0x14,
232 0x25, 0x05,
233 0x75, 0x08,
234 0x95, 0x01,
235 0x81, 0x02,
236
237 0xC0,
238
239 0xC0
240};
241
242static const unsigned int ps3remote_keymap_joypad_buttons[] = {
243 [0x01] = KEY_SELECT,
244 [0x02] = BTN_THUMBL,
245 [0x03] = BTN_THUMBR,
246 [0x04] = BTN_START,
247 [0x05] = KEY_UP,
248 [0x06] = KEY_RIGHT,
249 [0x07] = KEY_DOWN,
250 [0x08] = KEY_LEFT,
251 [0x09] = BTN_TL2,
252 [0x0a] = BTN_TR2,
253 [0x0b] = BTN_TL,
254 [0x0c] = BTN_TR,
255 [0x0d] = KEY_OPTION,
256 [0x0e] = KEY_BACK,
257 [0x0f] = BTN_0,
258 [0x10] = KEY_SCREEN,
259 [0x11] = KEY_HOMEPAGE,
260 [0x14] = KEY_ENTER,
261};
262static const unsigned int ps3remote_keymap_remote_buttons[] = {
263 [0x00] = KEY_1,
264 [0x01] = KEY_2,
265 [0x02] = KEY_3,
266 [0x03] = KEY_4,
267 [0x04] = KEY_5,
268 [0x05] = KEY_6,
269 [0x06] = KEY_7,
270 [0x07] = KEY_8,
271 [0x08] = KEY_9,
272 [0x09] = KEY_0,
273 [0x0e] = KEY_ESC,
274 [0x0f] = KEY_CLEAR,
275 [0x16] = KEY_EJECTCD,
276 [0x1a] = KEY_MENU,
277 [0x28] = KEY_TIME,
278 [0x30] = KEY_PREVIOUS,
279 [0x31] = KEY_NEXT,
280 [0x32] = KEY_PLAY,
281 [0x33] = KEY_REWIND,
282 [0x34] = KEY_FORWARD,
283 [0x38] = KEY_STOP,
284 [0x39] = KEY_PAUSE,
285 [0x40] = KEY_CONTEXT_MENU,
286 [0x60] = KEY_FRAMEBACK,
287 [0x61] = KEY_FRAMEFORWARD,
288 [0x63] = KEY_SUBTITLE,
289 [0x64] = KEY_AUDIO,
290 [0x65] = KEY_ANGLE,
291 [0x70] = KEY_INFO,
292 [0x80] = KEY_BLUE,
293 [0x81] = KEY_RED,
294 [0x82] = KEY_GREEN,
295 [0x83] = KEY_YELLOW,
296};
297
298static const unsigned int buzz_keymap[] = {
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316 [1] = BTN_TRIGGER_HAPPY1,
317 [2] = BTN_TRIGGER_HAPPY2,
318 [3] = BTN_TRIGGER_HAPPY3,
319 [4] = BTN_TRIGGER_HAPPY4,
320 [5] = BTN_TRIGGER_HAPPY5,
321 [6] = BTN_TRIGGER_HAPPY6,
322 [7] = BTN_TRIGGER_HAPPY7,
323 [8] = BTN_TRIGGER_HAPPY8,
324 [9] = BTN_TRIGGER_HAPPY9,
325 [10] = BTN_TRIGGER_HAPPY10,
326 [11] = BTN_TRIGGER_HAPPY11,
327 [12] = BTN_TRIGGER_HAPPY12,
328 [13] = BTN_TRIGGER_HAPPY13,
329 [14] = BTN_TRIGGER_HAPPY14,
330 [15] = BTN_TRIGGER_HAPPY15,
331 [16] = BTN_TRIGGER_HAPPY16,
332 [17] = BTN_TRIGGER_HAPPY17,
333 [18] = BTN_TRIGGER_HAPPY18,
334 [19] = BTN_TRIGGER_HAPPY19,
335 [20] = BTN_TRIGGER_HAPPY20,
336};
337
338
339
340
341
342
343static const unsigned int navigation_absmap[] = {
344 [0x30] = ABS_X,
345 [0x31] = ABS_Y,
346 [0x33] = ABS_Z,
347};
348
349
350
351
352static const unsigned int navigation_keymap[] = {
353 [0x01] = 0,
354 [0x02] = BTN_THUMBL,
355 [0x03] = 0,
356 [0x04] = 0,
357 [0x05] = BTN_DPAD_UP,
358 [0x06] = BTN_DPAD_RIGHT,
359 [0x07] = BTN_DPAD_DOWN,
360 [0x08] = BTN_DPAD_LEFT,
361 [0x09] = BTN_TL2,
362 [0x0a] = 0,
363 [0x0b] = BTN_TL,
364 [0x0c] = 0,
365 [0x0d] = BTN_NORTH,
366 [0x0e] = BTN_EAST,
367 [0x0f] = BTN_SOUTH,
368 [0x10] = BTN_WEST,
369 [0x11] = BTN_MODE,
370};
371
372static const unsigned int sixaxis_absmap[] = {
373 [0x30] = ABS_X,
374 [0x31] = ABS_Y,
375 [0x32] = ABS_RX,
376 [0x35] = ABS_RY,
377};
378
379static const unsigned int sixaxis_keymap[] = {
380 [0x01] = BTN_SELECT,
381 [0x02] = BTN_THUMBL,
382 [0x03] = BTN_THUMBR,
383 [0x04] = BTN_START,
384 [0x05] = BTN_DPAD_UP,
385 [0x06] = BTN_DPAD_RIGHT,
386 [0x07] = BTN_DPAD_DOWN,
387 [0x08] = BTN_DPAD_LEFT,
388 [0x09] = BTN_TL2,
389 [0x0a] = BTN_TR2,
390 [0x0b] = BTN_TL,
391 [0x0c] = BTN_TR,
392 [0x0d] = BTN_NORTH,
393 [0x0e] = BTN_EAST,
394 [0x0f] = BTN_SOUTH,
395 [0x10] = BTN_WEST,
396 [0x11] = BTN_MODE,
397};
398
399static const unsigned int ds4_absmap[] = {
400 [0x30] = ABS_X,
401 [0x31] = ABS_Y,
402 [0x32] = ABS_RX,
403 [0x33] = ABS_Z,
404 [0x34] = ABS_RZ,
405 [0x35] = ABS_RY,
406};
407
408static const unsigned int ds4_keymap[] = {
409 [0x1] = BTN_WEST,
410 [0x2] = BTN_SOUTH,
411 [0x3] = BTN_EAST,
412 [0x4] = BTN_NORTH,
413 [0x5] = BTN_TL,
414 [0x6] = BTN_TR,
415 [0x7] = BTN_TL2,
416 [0x8] = BTN_TR2,
417 [0x9] = BTN_SELECT,
418 [0xa] = BTN_START,
419 [0xb] = BTN_THUMBL,
420 [0xc] = BTN_THUMBR,
421 [0xd] = BTN_MODE,
422};
423
424static const struct {int x; int y; } ds4_hat_mapping[] = {
425 {0, -1}, {1, -1}, {1, 0}, {1, 1}, {0, 1}, {-1, 1}, {-1, 0}, {-1, -1},
426 {0, 0}
427};
428
429static enum power_supply_property sony_battery_props[] = {
430 POWER_SUPPLY_PROP_PRESENT,
431 POWER_SUPPLY_PROP_CAPACITY,
432 POWER_SUPPLY_PROP_SCOPE,
433 POWER_SUPPLY_PROP_STATUS,
434};
435
436struct sixaxis_led {
437 u8 time_enabled;
438 u8 duty_length;
439 u8 enabled;
440 u8 duty_off;
441 u8 duty_on;
442} __packed;
443
444struct sixaxis_rumble {
445 u8 padding;
446 u8 right_duration;
447 u8 right_motor_on;
448 u8 left_duration;
449 u8 left_motor_force;
450} __packed;
451
452struct sixaxis_output_report {
453 u8 report_id;
454 struct sixaxis_rumble rumble;
455 u8 padding[4];
456 u8 leds_bitmap;
457 struct sixaxis_led led[4];
458 struct sixaxis_led _reserved;
459} __packed;
460
461union sixaxis_output_report_01 {
462 struct sixaxis_output_report data;
463 u8 buf[36];
464};
465
466struct motion_output_report_02 {
467 u8 type, zero;
468 u8 r, g, b;
469 u8 zero2;
470 u8 rumble;
471};
472
473#define DS4_FEATURE_REPORT_0x02_SIZE 37
474#define DS4_FEATURE_REPORT_0x05_SIZE 41
475#define DS4_FEATURE_REPORT_0x81_SIZE 7
476#define DS4_INPUT_REPORT_0x11_SIZE 78
477#define DS4_OUTPUT_REPORT_0x05_SIZE 32
478#define DS4_OUTPUT_REPORT_0x11_SIZE 78
479#define SIXAXIS_REPORT_0xF2_SIZE 17
480#define SIXAXIS_REPORT_0xF5_SIZE 8
481#define MOTION_REPORT_0x02_SIZE 49
482
483
484
485
486#define DS4_INPUT_REPORT_AXIS_OFFSET 1
487#define DS4_INPUT_REPORT_BUTTON_OFFSET 5
488#define DS4_INPUT_REPORT_TIMESTAMP_OFFSET 10
489#define DS4_INPUT_REPORT_GYRO_X_OFFSET 13
490#define DS4_INPUT_REPORT_BATTERY_OFFSET 30
491#define DS4_INPUT_REPORT_TOUCHPAD_OFFSET 33
492
493#define SENSOR_SUFFIX " Motion Sensors"
494#define DS4_TOUCHPAD_SUFFIX " Touchpad"
495
496
497#define DS4_BT_DEFAULT_POLL_INTERVAL_MS 4
498#define DS4_BT_MAX_POLL_INTERVAL_MS 62
499#define DS4_GYRO_RES_PER_DEG_S 1024
500#define DS4_ACC_RES_PER_G 8192
501
502#define SIXAXIS_INPUT_REPORT_ACC_X_OFFSET 41
503#define SIXAXIS_ACC_RES_PER_G 113
504
505static DEFINE_SPINLOCK(sony_dev_list_lock);
506static LIST_HEAD(sony_device_list);
507static DEFINE_IDA(sony_device_id_allocator);
508
509
510struct ds4_calibration_data {
511 int abs_code;
512 short bias;
513
514
515
516
517 int sens_numer;
518 int sens_denom;
519};
520
521enum ds4_dongle_state {
522 DONGLE_DISCONNECTED,
523 DONGLE_CALIBRATING,
524 DONGLE_CONNECTED,
525 DONGLE_DISABLED
526};
527
528enum sony_worker {
529 SONY_WORKER_STATE,
530 SONY_WORKER_HOTPLUG
531};
532
533struct sony_sc {
534 spinlock_t lock;
535 struct list_head list_node;
536 struct hid_device *hdev;
537 struct input_dev *touchpad;
538 struct input_dev *sensor_dev;
539 struct led_classdev *leds[MAX_LEDS];
540 unsigned long quirks;
541 struct work_struct hotplug_worker;
542 struct work_struct state_worker;
543 void (*send_output_report)(struct sony_sc *);
544 struct power_supply *battery;
545 struct power_supply_desc battery_desc;
546 int device_id;
547 u8 *output_report_dmabuf;
548
549#ifdef CONFIG_SONY_FF
550 u8 left;
551 u8 right;
552#endif
553
554 u8 mac_address[6];
555 u8 hotplug_worker_initialized;
556 u8 state_worker_initialized;
557 u8 defer_initialization;
558 u8 cable_state;
559 u8 battery_charging;
560 u8 battery_capacity;
561 u8 led_state[MAX_LEDS];
562 u8 led_delay_on[MAX_LEDS];
563 u8 led_delay_off[MAX_LEDS];
564 u8 led_count;
565
566 bool timestamp_initialized;
567 u16 prev_timestamp;
568 unsigned int timestamp_us;
569
570 u8 ds4_bt_poll_interval;
571 enum ds4_dongle_state ds4_dongle_state;
572
573 struct ds4_calibration_data ds4_calib_data[6];
574};
575
576static void sony_set_leds(struct sony_sc *sc);
577
578static inline void sony_schedule_work(struct sony_sc *sc,
579 enum sony_worker which)
580{
581 switch (which) {
582 case SONY_WORKER_STATE:
583 if (!sc->defer_initialization)
584 schedule_work(&sc->state_worker);
585 break;
586 case SONY_WORKER_HOTPLUG:
587 if (sc->hotplug_worker_initialized)
588 schedule_work(&sc->hotplug_worker);
589 break;
590 }
591}
592
593static ssize_t ds4_show_poll_interval(struct device *dev,
594 struct device_attribute
595 *attr, char *buf)
596{
597 struct hid_device *hdev = to_hid_device(dev);
598 struct sony_sc *sc = hid_get_drvdata(hdev);
599
600 return snprintf(buf, PAGE_SIZE, "%i\n", sc->ds4_bt_poll_interval);
601}
602
603static ssize_t ds4_store_poll_interval(struct device *dev,
604 struct device_attribute *attr,
605 const char *buf, size_t count)
606{
607 struct hid_device *hdev = to_hid_device(dev);
608 struct sony_sc *sc = hid_get_drvdata(hdev);
609 unsigned long flags;
610 u8 interval;
611
612 if (kstrtou8(buf, 0, &interval))
613 return -EINVAL;
614
615 if (interval > DS4_BT_MAX_POLL_INTERVAL_MS)
616 return -EINVAL;
617
618 spin_lock_irqsave(&sc->lock, flags);
619 sc->ds4_bt_poll_interval = interval;
620 spin_unlock_irqrestore(&sc->lock, flags);
621
622 sony_schedule_work(sc, SONY_WORKER_STATE);
623
624 return count;
625}
626
627static DEVICE_ATTR(bt_poll_interval, 0644, ds4_show_poll_interval,
628 ds4_store_poll_interval);
629
630
631static u8 *motion_fixup(struct hid_device *hdev, u8 *rdesc,
632 unsigned int *rsize)
633{
634 *rsize = sizeof(motion_rdesc);
635 return motion_rdesc;
636}
637
638static u8 *ps3remote_fixup(struct hid_device *hdev, u8 *rdesc,
639 unsigned int *rsize)
640{
641 *rsize = sizeof(ps3remote_rdesc);
642 return ps3remote_rdesc;
643}
644
645static int ps3remote_mapping(struct hid_device *hdev, struct hid_input *hi,
646 struct hid_field *field, struct hid_usage *usage,
647 unsigned long **bit, int *max)
648{
649 unsigned int key = usage->hid & HID_USAGE;
650
651 if ((usage->hid & HID_USAGE_PAGE) != HID_UP_BUTTON)
652 return -1;
653
654 switch (usage->collection_index) {
655 case 1:
656 if (key >= ARRAY_SIZE(ps3remote_keymap_joypad_buttons))
657 return -1;
658
659 key = ps3remote_keymap_joypad_buttons[key];
660 if (!key)
661 return -1;
662 break;
663 case 2:
664 if (key >= ARRAY_SIZE(ps3remote_keymap_remote_buttons))
665 return -1;
666
667 key = ps3remote_keymap_remote_buttons[key];
668 if (!key)
669 return -1;
670 break;
671 default:
672 return -1;
673 }
674
675 hid_map_usage_clear(hi, usage, bit, max, EV_KEY, key);
676 return 1;
677}
678
679static int navigation_mapping(struct hid_device *hdev, struct hid_input *hi,
680 struct hid_field *field, struct hid_usage *usage,
681 unsigned long **bit, int *max)
682{
683 if ((usage->hid & HID_USAGE_PAGE) == HID_UP_BUTTON) {
684 unsigned int key = usage->hid & HID_USAGE;
685
686 if (key >= ARRAY_SIZE(sixaxis_keymap))
687 return -1;
688
689 key = navigation_keymap[key];
690 if (!key)
691 return -1;
692
693 hid_map_usage_clear(hi, usage, bit, max, EV_KEY, key);
694 return 1;
695 } else if (usage->hid == HID_GD_POINTER) {
696
697
698
699
700
701 switch (usage->usage_index) {
702 case 8:
703 usage->hid = HID_GD_Z;
704 break;
705 default:
706 return -1;
707 }
708
709 hid_map_usage_clear(hi, usage, bit, max, EV_ABS, usage->hid & 0xf);
710 return 1;
711 } else if ((usage->hid & HID_USAGE_PAGE) == HID_UP_GENDESK) {
712 unsigned int abs = usage->hid & HID_USAGE;
713
714 if (abs >= ARRAY_SIZE(navigation_absmap))
715 return -1;
716
717 abs = navigation_absmap[abs];
718
719 hid_map_usage_clear(hi, usage, bit, max, EV_ABS, abs);
720 return 1;
721 }
722
723 return -1;
724}
725
726
727static int sixaxis_mapping(struct hid_device *hdev, struct hid_input *hi,
728 struct hid_field *field, struct hid_usage *usage,
729 unsigned long **bit, int *max)
730{
731 if ((usage->hid & HID_USAGE_PAGE) == HID_UP_BUTTON) {
732 unsigned int key = usage->hid & HID_USAGE;
733
734 if (key >= ARRAY_SIZE(sixaxis_keymap))
735 return -1;
736
737 key = sixaxis_keymap[key];
738 hid_map_usage_clear(hi, usage, bit, max, EV_KEY, key);
739 return 1;
740 } else if (usage->hid == HID_GD_POINTER) {
741
742
743
744
745
746
747 switch (usage->usage_index) {
748 case 8:
749 usage->hid = HID_GD_Z;
750 break;
751 case 9:
752 usage->hid = HID_GD_RZ;
753 break;
754 default:
755 return -1;
756 }
757
758 hid_map_usage_clear(hi, usage, bit, max, EV_ABS, usage->hid & 0xf);
759 return 1;
760 } else if ((usage->hid & HID_USAGE_PAGE) == HID_UP_GENDESK) {
761 unsigned int abs = usage->hid & HID_USAGE;
762
763 if (abs >= ARRAY_SIZE(sixaxis_absmap))
764 return -1;
765
766 abs = sixaxis_absmap[abs];
767
768 hid_map_usage_clear(hi, usage, bit, max, EV_ABS, abs);
769 return 1;
770 }
771
772 return -1;
773}
774
775static int ds4_mapping(struct hid_device *hdev, struct hid_input *hi,
776 struct hid_field *field, struct hid_usage *usage,
777 unsigned long **bit, int *max)
778{
779 if ((usage->hid & HID_USAGE_PAGE) == HID_UP_BUTTON) {
780 unsigned int key = usage->hid & HID_USAGE;
781
782 if (key >= ARRAY_SIZE(ds4_keymap))
783 return -1;
784
785 key = ds4_keymap[key];
786 hid_map_usage_clear(hi, usage, bit, max, EV_KEY, key);
787 return 1;
788 } else if ((usage->hid & HID_USAGE_PAGE) == HID_UP_GENDESK) {
789 unsigned int abs = usage->hid & HID_USAGE;
790
791
792 if (usage->hid == HID_GD_HATSWITCH)
793 return 0;
794
795 if (abs >= ARRAY_SIZE(ds4_absmap))
796 return -1;
797
798 abs = ds4_absmap[abs];
799 hid_map_usage_clear(hi, usage, bit, max, EV_ABS, abs);
800 return 1;
801 }
802
803 return 0;
804}
805
806static u8 *sony_report_fixup(struct hid_device *hdev, u8 *rdesc,
807 unsigned int *rsize)
808{
809 struct sony_sc *sc = hid_get_drvdata(hdev);
810
811 if (sc->quirks & (SINO_LITE_CONTROLLER | FUTUREMAX_DANCE_MAT))
812 return rdesc;
813
814
815
816
817
818 if ((sc->quirks & VAIO_RDESC_CONSTANT) && *rsize >= 56 &&
819
820
821
822 rdesc[2] == 0x09 && rdesc[3] == 0x02 &&
823
824 rdesc[54] == 0x81 && rdesc[55] == 0x07) {
825 hid_info(hdev, "Fixing up Sony RF Receiver report descriptor\n");
826
827 rdesc[55] = 0x06;
828 }
829
830 if (sc->quirks & MOTION_CONTROLLER)
831 return motion_fixup(hdev, rdesc, rsize);
832
833 if (sc->quirks & PS3REMOTE)
834 return ps3remote_fixup(hdev, rdesc, rsize);
835
836 return rdesc;
837}
838
839static void sixaxis_parse_report(struct sony_sc *sc, u8 *rd, int size)
840{
841 static const u8 sixaxis_battery_capacity[] = { 0, 1, 25, 50, 75, 100 };
842 unsigned long flags;
843 int offset;
844 u8 cable_state, battery_capacity, battery_charging;
845
846
847
848
849
850
851
852 offset = (sc->quirks & MOTION_CONTROLLER) ? 12 : 30;
853
854 if (rd[offset] >= 0xee) {
855 battery_capacity = 100;
856 battery_charging = !(rd[offset] & 0x01);
857 cable_state = 1;
858 } else {
859 u8 index = rd[offset] <= 5 ? rd[offset] : 5;
860 battery_capacity = sixaxis_battery_capacity[index];
861 battery_charging = 0;
862 cable_state = 0;
863 }
864
865 spin_lock_irqsave(&sc->lock, flags);
866 sc->cable_state = cable_state;
867 sc->battery_capacity = battery_capacity;
868 sc->battery_charging = battery_charging;
869 spin_unlock_irqrestore(&sc->lock, flags);
870
871 if (sc->quirks & SIXAXIS_CONTROLLER) {
872 int val;
873
874 offset = SIXAXIS_INPUT_REPORT_ACC_X_OFFSET;
875 val = ((rd[offset+1] << 8) | rd[offset]) - 511;
876 input_report_abs(sc->sensor_dev, ABS_X, val);
877
878
879 val = 511 - ((rd[offset+5] << 8) | rd[offset+4]);
880 input_report_abs(sc->sensor_dev, ABS_Y, val);
881
882 val = 511 - ((rd[offset+3] << 8) | rd[offset+2]);
883 input_report_abs(sc->sensor_dev, ABS_Z, val);
884
885 input_sync(sc->sensor_dev);
886 }
887}
888
889static void dualshock4_parse_report(struct sony_sc *sc, u8 *rd, int size)
890{
891 struct hid_input *hidinput = list_entry(sc->hdev->inputs.next,
892 struct hid_input, list);
893 struct input_dev *input_dev = hidinput->input;
894 unsigned long flags;
895 int n, m, offset, num_touch_data, max_touch_data;
896 u8 cable_state, battery_capacity, battery_charging;
897 u16 timestamp;
898
899
900 int data_offset = (sc->quirks & DUALSHOCK4_CONTROLLER_BT) ? 2 : 0;
901
902
903 offset = data_offset + DS4_INPUT_REPORT_BUTTON_OFFSET;
904 input_report_key(sc->touchpad, BTN_LEFT, rd[offset+2] & 0x2);
905
906
907
908
909
910
911
912
913
914
915
916
917
918
919
920 if (rd[0] == 17) {
921 int value;
922
923 offset = data_offset + DS4_INPUT_REPORT_AXIS_OFFSET;
924 input_report_abs(input_dev, ABS_X, rd[offset]);
925 input_report_abs(input_dev, ABS_Y, rd[offset+1]);
926 input_report_abs(input_dev, ABS_RX, rd[offset+2]);
927 input_report_abs(input_dev, ABS_RY, rd[offset+3]);
928
929 value = rd[offset+4] & 0xf;
930 if (value > 7)
931 value = 8;
932 input_report_abs(input_dev, ABS_HAT0X, ds4_hat_mapping[value].x);
933 input_report_abs(input_dev, ABS_HAT0Y, ds4_hat_mapping[value].y);
934
935 input_report_key(input_dev, BTN_WEST, rd[offset+4] & 0x10);
936 input_report_key(input_dev, BTN_SOUTH, rd[offset+4] & 0x20);
937 input_report_key(input_dev, BTN_EAST, rd[offset+4] & 0x40);
938 input_report_key(input_dev, BTN_NORTH, rd[offset+4] & 0x80);
939
940 input_report_key(input_dev, BTN_TL, rd[offset+5] & 0x1);
941 input_report_key(input_dev, BTN_TR, rd[offset+5] & 0x2);
942 input_report_key(input_dev, BTN_TL2, rd[offset+5] & 0x4);
943 input_report_key(input_dev, BTN_TR2, rd[offset+5] & 0x8);
944 input_report_key(input_dev, BTN_SELECT, rd[offset+5] & 0x10);
945 input_report_key(input_dev, BTN_START, rd[offset+5] & 0x20);
946 input_report_key(input_dev, BTN_THUMBL, rd[offset+5] & 0x40);
947 input_report_key(input_dev, BTN_THUMBR, rd[offset+5] & 0x80);
948
949 input_report_key(input_dev, BTN_MODE, rd[offset+6] & 0x1);
950
951 input_report_abs(input_dev, ABS_Z, rd[offset+7]);
952 input_report_abs(input_dev, ABS_RZ, rd[offset+8]);
953
954 input_sync(input_dev);
955 }
956
957
958 offset = data_offset + DS4_INPUT_REPORT_TIMESTAMP_OFFSET;
959 timestamp = get_unaligned_le16(&rd[offset]);
960 if (!sc->timestamp_initialized) {
961 sc->timestamp_us = ((unsigned int)timestamp * 16) / 3;
962 sc->timestamp_initialized = true;
963 } else {
964 u16 delta;
965
966 if (sc->prev_timestamp > timestamp)
967 delta = (U16_MAX - sc->prev_timestamp + timestamp + 1);
968 else
969 delta = timestamp - sc->prev_timestamp;
970 sc->timestamp_us += (delta * 16) / 3;
971 }
972 sc->prev_timestamp = timestamp;
973 input_event(sc->sensor_dev, EV_MSC, MSC_TIMESTAMP, sc->timestamp_us);
974
975 offset = data_offset + DS4_INPUT_REPORT_GYRO_X_OFFSET;
976 for (n = 0; n < 6; n++) {
977
978 int raw_data = (short)((rd[offset+1] << 8) | rd[offset]);
979 struct ds4_calibration_data *calib = &sc->ds4_calib_data[n];
980
981
982
983
984
985
986 int calib_data = mult_frac(calib->sens_numer,
987 raw_data - calib->bias,
988 calib->sens_denom);
989
990 input_report_abs(sc->sensor_dev, calib->abs_code, calib_data);
991 offset += 2;
992 }
993 input_sync(sc->sensor_dev);
994
995
996
997
998
999 offset = data_offset + DS4_INPUT_REPORT_BATTERY_OFFSET;
1000 cable_state = (rd[offset] >> 4) & 0x01;
1001 battery_capacity = rd[offset] & 0x0F;
1002
1003
1004
1005
1006
1007
1008 if (!cable_state || battery_capacity > 10)
1009 battery_charging = 0;
1010 else
1011 battery_charging = 1;
1012
1013 if (!cable_state)
1014 battery_capacity++;
1015 if (battery_capacity > 10)
1016 battery_capacity = 10;
1017
1018 battery_capacity *= 10;
1019
1020 spin_lock_irqsave(&sc->lock, flags);
1021 sc->cable_state = cable_state;
1022 sc->battery_capacity = battery_capacity;
1023 sc->battery_charging = battery_charging;
1024 spin_unlock_irqrestore(&sc->lock, flags);
1025
1026
1027
1028
1029
1030
1031
1032 offset = data_offset + DS4_INPUT_REPORT_TOUCHPAD_OFFSET;
1033 max_touch_data = (sc->quirks & DUALSHOCK4_CONTROLLER_BT) ? 4 : 3;
1034 if (rd[offset] > 0 && rd[offset] <= max_touch_data)
1035 num_touch_data = rd[offset];
1036 else
1037 num_touch_data = 1;
1038 offset += 1;
1039
1040 for (m = 0; m < num_touch_data; m++) {
1041
1042 offset += 1;
1043
1044
1045
1046
1047
1048
1049
1050
1051
1052 for (n = 0; n < 2; n++) {
1053 u16 x, y;
1054 bool active;
1055
1056 x = rd[offset+1] | ((rd[offset+2] & 0xF) << 8);
1057 y = ((rd[offset+2] & 0xF0) >> 4) | (rd[offset+3] << 4);
1058
1059 active = !(rd[offset] >> 7);
1060 input_mt_slot(sc->touchpad, n);
1061 input_mt_report_slot_state(sc->touchpad, MT_TOOL_FINGER, active);
1062
1063 if (active) {
1064 input_report_abs(sc->touchpad, ABS_MT_POSITION_X, x);
1065 input_report_abs(sc->touchpad, ABS_MT_POSITION_Y, y);
1066 }
1067
1068 offset += 4;
1069 }
1070 input_mt_sync_frame(sc->touchpad);
1071 input_sync(sc->touchpad);
1072 }
1073}
1074
1075static int sony_raw_event(struct hid_device *hdev, struct hid_report *report,
1076 u8 *rd, int size)
1077{
1078 struct sony_sc *sc = hid_get_drvdata(hdev);
1079
1080
1081
1082
1083
1084 if ((sc->quirks & SIXAXIS_CONTROLLER) && rd[0] == 0x01 && size == 49) {
1085
1086
1087
1088
1089
1090
1091
1092
1093 if (rd[1] == 0xff)
1094 return -EINVAL;
1095
1096 swap(rd[41], rd[42]);
1097 swap(rd[43], rd[44]);
1098 swap(rd[45], rd[46]);
1099 swap(rd[47], rd[48]);
1100
1101 sixaxis_parse_report(sc, rd, size);
1102 } else if ((sc->quirks & MOTION_CONTROLLER_BT) && rd[0] == 0x01 && size == 49) {
1103 sixaxis_parse_report(sc, rd, size);
1104 } else if ((sc->quirks & NAVIGATION_CONTROLLER) && rd[0] == 0x01 &&
1105 size == 49) {
1106 sixaxis_parse_report(sc, rd, size);
1107 } else if ((sc->quirks & DUALSHOCK4_CONTROLLER_USB) && rd[0] == 0x01 &&
1108 size == 64) {
1109 dualshock4_parse_report(sc, rd, size);
1110 } else if (((sc->quirks & DUALSHOCK4_CONTROLLER_BT) && rd[0] == 0x11 &&
1111 size == 78)) {
1112
1113 u8 bthdr = 0xA1;
1114 u32 crc;
1115 u32 report_crc;
1116
1117 crc = crc32_le(0xFFFFFFFF, &bthdr, 1);
1118 crc = ~crc32_le(crc, rd, DS4_INPUT_REPORT_0x11_SIZE-4);
1119 report_crc = get_unaligned_le32(&rd[DS4_INPUT_REPORT_0x11_SIZE-4]);
1120 if (crc != report_crc) {
1121 hid_dbg(sc->hdev, "DualShock 4 input report's CRC check failed, received crc 0x%0x != 0x%0x\n",
1122 report_crc, crc);
1123 return -EILSEQ;
1124 }
1125
1126 dualshock4_parse_report(sc, rd, size);
1127 } else if ((sc->quirks & DUALSHOCK4_DONGLE) && rd[0] == 0x01 &&
1128 size == 64) {
1129 unsigned long flags;
1130 enum ds4_dongle_state dongle_state;
1131
1132
1133
1134
1135
1136
1137 bool connected = (rd[31] & 0x04) ? false : true;
1138
1139 spin_lock_irqsave(&sc->lock, flags);
1140 dongle_state = sc->ds4_dongle_state;
1141 spin_unlock_irqrestore(&sc->lock, flags);
1142
1143
1144
1145
1146
1147
1148
1149
1150
1151 if (dongle_state == DONGLE_DISCONNECTED && connected) {
1152 hid_info(sc->hdev, "DualShock 4 USB dongle: controller connected\n");
1153 sony_set_leds(sc);
1154
1155 spin_lock_irqsave(&sc->lock, flags);
1156 sc->ds4_dongle_state = DONGLE_CALIBRATING;
1157 spin_unlock_irqrestore(&sc->lock, flags);
1158
1159 sony_schedule_work(sc, SONY_WORKER_HOTPLUG);
1160
1161
1162
1163
1164 return 0;
1165 } else if ((dongle_state == DONGLE_CONNECTED ||
1166 dongle_state == DONGLE_DISABLED) && !connected) {
1167 hid_info(sc->hdev, "DualShock 4 USB dongle: controller disconnected\n");
1168
1169 spin_lock_irqsave(&sc->lock, flags);
1170 sc->ds4_dongle_state = DONGLE_DISCONNECTED;
1171 spin_unlock_irqrestore(&sc->lock, flags);
1172
1173
1174 return 0;
1175 } else if (dongle_state == DONGLE_CALIBRATING ||
1176 dongle_state == DONGLE_DISABLED ||
1177 dongle_state == DONGLE_DISCONNECTED) {
1178
1179 return 0;
1180 }
1181
1182 dualshock4_parse_report(sc, rd, size);
1183 }
1184
1185 if (sc->defer_initialization) {
1186 sc->defer_initialization = 0;
1187 sony_schedule_work(sc, SONY_WORKER_STATE);
1188 }
1189
1190 return 0;
1191}
1192
1193static int sony_mapping(struct hid_device *hdev, struct hid_input *hi,
1194 struct hid_field *field, struct hid_usage *usage,
1195 unsigned long **bit, int *max)
1196{
1197 struct sony_sc *sc = hid_get_drvdata(hdev);
1198
1199 if (sc->quirks & BUZZ_CONTROLLER) {
1200 unsigned int key = usage->hid & HID_USAGE;
1201
1202 if ((usage->hid & HID_USAGE_PAGE) != HID_UP_BUTTON)
1203 return -1;
1204
1205 switch (usage->collection_index) {
1206 case 1:
1207 if (key >= ARRAY_SIZE(buzz_keymap))
1208 return -1;
1209
1210 key = buzz_keymap[key];
1211 if (!key)
1212 return -1;
1213 break;
1214 default:
1215 return -1;
1216 }
1217
1218 hid_map_usage_clear(hi, usage, bit, max, EV_KEY, key);
1219 return 1;
1220 }
1221
1222 if (sc->quirks & PS3REMOTE)
1223 return ps3remote_mapping(hdev, hi, field, usage, bit, max);
1224
1225 if (sc->quirks & NAVIGATION_CONTROLLER)
1226 return navigation_mapping(hdev, hi, field, usage, bit, max);
1227
1228 if (sc->quirks & SIXAXIS_CONTROLLER)
1229 return sixaxis_mapping(hdev, hi, field, usage, bit, max);
1230
1231 if (sc->quirks & DUALSHOCK4_CONTROLLER)
1232 return ds4_mapping(hdev, hi, field, usage, bit, max);
1233
1234
1235
1236 return 0;
1237}
1238
1239static int sony_register_touchpad(struct sony_sc *sc, int touch_count,
1240 int w, int h)
1241{
1242 size_t name_sz;
1243 char *name;
1244 int ret;
1245
1246 sc->touchpad = input_allocate_device();
1247 if (!sc->touchpad)
1248 return -ENOMEM;
1249
1250 input_set_drvdata(sc->touchpad, sc);
1251 sc->touchpad->dev.parent = &sc->hdev->dev;
1252 sc->touchpad->phys = sc->hdev->phys;
1253 sc->touchpad->uniq = sc->hdev->uniq;
1254 sc->touchpad->id.bustype = sc->hdev->bus;
1255 sc->touchpad->id.vendor = sc->hdev->vendor;
1256 sc->touchpad->id.product = sc->hdev->product;
1257 sc->touchpad->id.version = sc->hdev->version;
1258
1259
1260
1261
1262 name_sz = strlen(sc->hdev->name) + sizeof(DS4_TOUCHPAD_SUFFIX);
1263 name = kzalloc(name_sz, GFP_KERNEL);
1264 if (!name) {
1265 ret = -ENOMEM;
1266 goto err;
1267 }
1268 snprintf(name, name_sz, "%s" DS4_TOUCHPAD_SUFFIX, sc->hdev->name);
1269 sc->touchpad->name = name;
1270
1271 ret = input_mt_init_slots(sc->touchpad, touch_count, INPUT_MT_POINTER);
1272 if (ret < 0)
1273 goto err;
1274
1275
1276 __set_bit(EV_KEY, sc->touchpad->evbit);
1277 __set_bit(BTN_LEFT, sc->touchpad->keybit);
1278 __set_bit(INPUT_PROP_BUTTONPAD, sc->touchpad->propbit);
1279
1280 input_set_abs_params(sc->touchpad, ABS_MT_POSITION_X, 0, w, 0, 0);
1281 input_set_abs_params(sc->touchpad, ABS_MT_POSITION_Y, 0, h, 0, 0);
1282
1283 ret = input_register_device(sc->touchpad);
1284 if (ret < 0)
1285 goto err;
1286
1287 return 0;
1288
1289err:
1290 kfree(sc->touchpad->name);
1291 sc->touchpad->name = NULL;
1292
1293 input_free_device(sc->touchpad);
1294 sc->touchpad = NULL;
1295
1296 return ret;
1297}
1298
1299static void sony_unregister_touchpad(struct sony_sc *sc)
1300{
1301 if (!sc->touchpad)
1302 return;
1303
1304 kfree(sc->touchpad->name);
1305 sc->touchpad->name = NULL;
1306
1307 input_unregister_device(sc->touchpad);
1308 sc->touchpad = NULL;
1309}
1310
1311static int sony_register_sensors(struct sony_sc *sc)
1312{
1313 size_t name_sz;
1314 char *name;
1315 int ret;
1316 int range;
1317
1318 sc->sensor_dev = input_allocate_device();
1319 if (!sc->sensor_dev)
1320 return -ENOMEM;
1321
1322 input_set_drvdata(sc->sensor_dev, sc);
1323 sc->sensor_dev->dev.parent = &sc->hdev->dev;
1324 sc->sensor_dev->phys = sc->hdev->phys;
1325 sc->sensor_dev->uniq = sc->hdev->uniq;
1326 sc->sensor_dev->id.bustype = sc->hdev->bus;
1327 sc->sensor_dev->id.vendor = sc->hdev->vendor;
1328 sc->sensor_dev->id.product = sc->hdev->product;
1329 sc->sensor_dev->id.version = sc->hdev->version;
1330
1331
1332
1333
1334 name_sz = strlen(sc->hdev->name) + sizeof(SENSOR_SUFFIX);
1335 name = kzalloc(name_sz, GFP_KERNEL);
1336 if (!name) {
1337 ret = -ENOMEM;
1338 goto err;
1339 }
1340 snprintf(name, name_sz, "%s" SENSOR_SUFFIX, sc->hdev->name);
1341 sc->sensor_dev->name = name;
1342
1343 if (sc->quirks & SIXAXIS_CONTROLLER) {
1344
1345
1346
1347
1348
1349
1350 input_set_abs_params(sc->sensor_dev, ABS_X, -512, 511, 4, 0);
1351 input_set_abs_params(sc->sensor_dev, ABS_Y, -512, 511, 4, 0);
1352 input_set_abs_params(sc->sensor_dev, ABS_Z, -512, 511, 4, 0);
1353 input_abs_set_res(sc->sensor_dev, ABS_X, SIXAXIS_ACC_RES_PER_G);
1354 input_abs_set_res(sc->sensor_dev, ABS_Y, SIXAXIS_ACC_RES_PER_G);
1355 input_abs_set_res(sc->sensor_dev, ABS_Z, SIXAXIS_ACC_RES_PER_G);
1356 } else if (sc->quirks & DUALSHOCK4_CONTROLLER) {
1357 range = DS4_ACC_RES_PER_G*4;
1358 input_set_abs_params(sc->sensor_dev, ABS_X, -range, range, 16, 0);
1359 input_set_abs_params(sc->sensor_dev, ABS_Y, -range, range, 16, 0);
1360 input_set_abs_params(sc->sensor_dev, ABS_Z, -range, range, 16, 0);
1361 input_abs_set_res(sc->sensor_dev, ABS_X, DS4_ACC_RES_PER_G);
1362 input_abs_set_res(sc->sensor_dev, ABS_Y, DS4_ACC_RES_PER_G);
1363 input_abs_set_res(sc->sensor_dev, ABS_Z, DS4_ACC_RES_PER_G);
1364
1365 range = DS4_GYRO_RES_PER_DEG_S*2048;
1366 input_set_abs_params(sc->sensor_dev, ABS_RX, -range, range, 16, 0);
1367 input_set_abs_params(sc->sensor_dev, ABS_RY, -range, range, 16, 0);
1368 input_set_abs_params(sc->sensor_dev, ABS_RZ, -range, range, 16, 0);
1369 input_abs_set_res(sc->sensor_dev, ABS_RX, DS4_GYRO_RES_PER_DEG_S);
1370 input_abs_set_res(sc->sensor_dev, ABS_RY, DS4_GYRO_RES_PER_DEG_S);
1371 input_abs_set_res(sc->sensor_dev, ABS_RZ, DS4_GYRO_RES_PER_DEG_S);
1372
1373 __set_bit(EV_MSC, sc->sensor_dev->evbit);
1374 __set_bit(MSC_TIMESTAMP, sc->sensor_dev->mscbit);
1375 }
1376
1377 __set_bit(INPUT_PROP_ACCELEROMETER, sc->sensor_dev->propbit);
1378
1379 ret = input_register_device(sc->sensor_dev);
1380 if (ret < 0)
1381 goto err;
1382
1383 return 0;
1384
1385err:
1386 kfree(sc->sensor_dev->name);
1387 sc->sensor_dev->name = NULL;
1388
1389 input_free_device(sc->sensor_dev);
1390 sc->sensor_dev = NULL;
1391
1392 return ret;
1393}
1394
1395static void sony_unregister_sensors(struct sony_sc *sc)
1396{
1397 if (!sc->sensor_dev)
1398 return;
1399
1400 kfree(sc->sensor_dev->name);
1401 sc->sensor_dev->name = NULL;
1402
1403 input_unregister_device(sc->sensor_dev);
1404 sc->sensor_dev = NULL;
1405}
1406
1407
1408
1409
1410
1411
1412
1413static int sixaxis_set_operational_usb(struct hid_device *hdev)
1414{
1415 const int buf_size =
1416 max(SIXAXIS_REPORT_0xF2_SIZE, SIXAXIS_REPORT_0xF5_SIZE);
1417 u8 *buf;
1418 int ret;
1419
1420 buf = kmalloc(buf_size, GFP_KERNEL);
1421 if (!buf)
1422 return -ENOMEM;
1423
1424 ret = hid_hw_raw_request(hdev, 0xf2, buf, SIXAXIS_REPORT_0xF2_SIZE,
1425 HID_FEATURE_REPORT, HID_REQ_GET_REPORT);
1426 if (ret < 0) {
1427 hid_err(hdev, "can't set operational mode: step 1\n");
1428 goto out;
1429 }
1430
1431
1432
1433
1434
1435 ret = hid_hw_raw_request(hdev, 0xf5, buf, SIXAXIS_REPORT_0xF5_SIZE,
1436 HID_FEATURE_REPORT, HID_REQ_GET_REPORT);
1437 if (ret < 0) {
1438 hid_err(hdev, "can't set operational mode: step 2\n");
1439 goto out;
1440 }
1441
1442 ret = hid_hw_output_report(hdev, buf, 1);
1443 if (ret < 0) {
1444 hid_info(hdev, "can't set operational mode: step 3, ignoring\n");
1445 ret = 0;
1446 }
1447
1448out:
1449 kfree(buf);
1450
1451 return ret;
1452}
1453
1454static int sixaxis_set_operational_bt(struct hid_device *hdev)
1455{
1456 static const u8 report[] = { 0xf4, 0x42, 0x03, 0x00, 0x00 };
1457 u8 *buf;
1458 int ret;
1459
1460 buf = kmemdup(report, sizeof(report), GFP_KERNEL);
1461 if (!buf)
1462 return -ENOMEM;
1463
1464 ret = hid_hw_raw_request(hdev, buf[0], buf, sizeof(report),
1465 HID_FEATURE_REPORT, HID_REQ_SET_REPORT);
1466
1467 kfree(buf);
1468
1469 return ret;
1470}
1471
1472
1473
1474
1475
1476static int dualshock4_get_calibration_data(struct sony_sc *sc)
1477{
1478 u8 *buf;
1479 int ret;
1480 short gyro_pitch_bias, gyro_pitch_plus, gyro_pitch_minus;
1481 short gyro_yaw_bias, gyro_yaw_plus, gyro_yaw_minus;
1482 short gyro_roll_bias, gyro_roll_plus, gyro_roll_minus;
1483 short gyro_speed_plus, gyro_speed_minus;
1484 short acc_x_plus, acc_x_minus;
1485 short acc_y_plus, acc_y_minus;
1486 short acc_z_plus, acc_z_minus;
1487 int speed_2x;
1488 int range_2g;
1489
1490
1491
1492
1493
1494 if (sc->quirks & (DUALSHOCK4_CONTROLLER_USB | DUALSHOCK4_DONGLE)) {
1495 buf = kmalloc(DS4_FEATURE_REPORT_0x02_SIZE, GFP_KERNEL);
1496 if (!buf)
1497 return -ENOMEM;
1498
1499 ret = hid_hw_raw_request(sc->hdev, 0x02, buf,
1500 DS4_FEATURE_REPORT_0x02_SIZE,
1501 HID_FEATURE_REPORT,
1502 HID_REQ_GET_REPORT);
1503 if (ret < 0)
1504 goto err_stop;
1505 } else {
1506 u8 bthdr = 0xA3;
1507 u32 crc;
1508 u32 report_crc;
1509 int retries;
1510
1511 buf = kmalloc(DS4_FEATURE_REPORT_0x05_SIZE, GFP_KERNEL);
1512 if (!buf)
1513 return -ENOMEM;
1514
1515 for (retries = 0; retries < 3; retries++) {
1516 ret = hid_hw_raw_request(sc->hdev, 0x05, buf,
1517 DS4_FEATURE_REPORT_0x05_SIZE,
1518 HID_FEATURE_REPORT,
1519 HID_REQ_GET_REPORT);
1520 if (ret < 0)
1521 goto err_stop;
1522
1523
1524 crc = crc32_le(0xFFFFFFFF, &bthdr, 1);
1525 crc = ~crc32_le(crc, buf, DS4_FEATURE_REPORT_0x05_SIZE-4);
1526 report_crc = get_unaligned_le32(&buf[DS4_FEATURE_REPORT_0x05_SIZE-4]);
1527 if (crc != report_crc) {
1528 hid_warn(sc->hdev, "DualShock 4 calibration report's CRC check failed, received crc 0x%0x != 0x%0x\n",
1529 report_crc, crc);
1530 if (retries < 2) {
1531 hid_warn(sc->hdev, "Retrying DualShock 4 get calibration report request\n");
1532 continue;
1533 } else {
1534 ret = -EILSEQ;
1535 goto err_stop;
1536 }
1537 } else {
1538 break;
1539 }
1540 }
1541 }
1542
1543 gyro_pitch_bias = get_unaligned_le16(&buf[1]);
1544 gyro_yaw_bias = get_unaligned_le16(&buf[3]);
1545 gyro_roll_bias = get_unaligned_le16(&buf[5]);
1546 if (sc->quirks & DUALSHOCK4_CONTROLLER_USB) {
1547 gyro_pitch_plus = get_unaligned_le16(&buf[7]);
1548 gyro_pitch_minus = get_unaligned_le16(&buf[9]);
1549 gyro_yaw_plus = get_unaligned_le16(&buf[11]);
1550 gyro_yaw_minus = get_unaligned_le16(&buf[13]);
1551 gyro_roll_plus = get_unaligned_le16(&buf[15]);
1552 gyro_roll_minus = get_unaligned_le16(&buf[17]);
1553 } else {
1554
1555 gyro_pitch_plus = get_unaligned_le16(&buf[7]);
1556 gyro_yaw_plus = get_unaligned_le16(&buf[9]);
1557 gyro_roll_plus = get_unaligned_le16(&buf[11]);
1558 gyro_pitch_minus = get_unaligned_le16(&buf[13]);
1559 gyro_yaw_minus = get_unaligned_le16(&buf[15]);
1560 gyro_roll_minus = get_unaligned_le16(&buf[17]);
1561 }
1562 gyro_speed_plus = get_unaligned_le16(&buf[19]);
1563 gyro_speed_minus = get_unaligned_le16(&buf[21]);
1564 acc_x_plus = get_unaligned_le16(&buf[23]);
1565 acc_x_minus = get_unaligned_le16(&buf[25]);
1566 acc_y_plus = get_unaligned_le16(&buf[27]);
1567 acc_y_minus = get_unaligned_le16(&buf[29]);
1568 acc_z_plus = get_unaligned_le16(&buf[31]);
1569 acc_z_minus = get_unaligned_le16(&buf[33]);
1570
1571
1572
1573
1574 speed_2x = (gyro_speed_plus + gyro_speed_minus);
1575 sc->ds4_calib_data[0].abs_code = ABS_RX;
1576 sc->ds4_calib_data[0].bias = gyro_pitch_bias;
1577 sc->ds4_calib_data[0].sens_numer = speed_2x*DS4_GYRO_RES_PER_DEG_S;
1578 sc->ds4_calib_data[0].sens_denom = gyro_pitch_plus - gyro_pitch_minus;
1579
1580 sc->ds4_calib_data[1].abs_code = ABS_RY;
1581 sc->ds4_calib_data[1].bias = gyro_yaw_bias;
1582 sc->ds4_calib_data[1].sens_numer = speed_2x*DS4_GYRO_RES_PER_DEG_S;
1583 sc->ds4_calib_data[1].sens_denom = gyro_yaw_plus - gyro_yaw_minus;
1584
1585 sc->ds4_calib_data[2].abs_code = ABS_RZ;
1586 sc->ds4_calib_data[2].bias = gyro_roll_bias;
1587 sc->ds4_calib_data[2].sens_numer = speed_2x*DS4_GYRO_RES_PER_DEG_S;
1588 sc->ds4_calib_data[2].sens_denom = gyro_roll_plus - gyro_roll_minus;
1589
1590
1591
1592
1593 range_2g = acc_x_plus - acc_x_minus;
1594 sc->ds4_calib_data[3].abs_code = ABS_X;
1595 sc->ds4_calib_data[3].bias = acc_x_plus - range_2g / 2;
1596 sc->ds4_calib_data[3].sens_numer = 2*DS4_ACC_RES_PER_G;
1597 sc->ds4_calib_data[3].sens_denom = range_2g;
1598
1599 range_2g = acc_y_plus - acc_y_minus;
1600 sc->ds4_calib_data[4].abs_code = ABS_Y;
1601 sc->ds4_calib_data[4].bias = acc_y_plus - range_2g / 2;
1602 sc->ds4_calib_data[4].sens_numer = 2*DS4_ACC_RES_PER_G;
1603 sc->ds4_calib_data[4].sens_denom = range_2g;
1604
1605 range_2g = acc_z_plus - acc_z_minus;
1606 sc->ds4_calib_data[5].abs_code = ABS_Z;
1607 sc->ds4_calib_data[5].bias = acc_z_plus - range_2g / 2;
1608 sc->ds4_calib_data[5].sens_numer = 2*DS4_ACC_RES_PER_G;
1609 sc->ds4_calib_data[5].sens_denom = range_2g;
1610
1611err_stop:
1612 kfree(buf);
1613 return ret;
1614}
1615
1616static void dualshock4_calibration_work(struct work_struct *work)
1617{
1618 struct sony_sc *sc = container_of(work, struct sony_sc, hotplug_worker);
1619 unsigned long flags;
1620 enum ds4_dongle_state dongle_state;
1621 int ret;
1622
1623 ret = dualshock4_get_calibration_data(sc);
1624 if (ret < 0) {
1625
1626
1627
1628
1629
1630
1631 hid_err(sc->hdev, "DualShock 4 USB dongle: calibration failed, disabling device\n");
1632 dongle_state = DONGLE_DISABLED;
1633 } else {
1634 hid_info(sc->hdev, "DualShock 4 USB dongle: calibration completed\n");
1635 dongle_state = DONGLE_CONNECTED;
1636 }
1637
1638 spin_lock_irqsave(&sc->lock, flags);
1639 sc->ds4_dongle_state = dongle_state;
1640 spin_unlock_irqrestore(&sc->lock, flags);
1641}
1642
1643static void sixaxis_set_leds_from_id(struct sony_sc *sc)
1644{
1645 static const u8 sixaxis_leds[10][4] = {
1646 { 0x01, 0x00, 0x00, 0x00 },
1647 { 0x00, 0x01, 0x00, 0x00 },
1648 { 0x00, 0x00, 0x01, 0x00 },
1649 { 0x00, 0x00, 0x00, 0x01 },
1650 { 0x01, 0x00, 0x00, 0x01 },
1651 { 0x00, 0x01, 0x00, 0x01 },
1652 { 0x00, 0x00, 0x01, 0x01 },
1653 { 0x01, 0x00, 0x01, 0x01 },
1654 { 0x00, 0x01, 0x01, 0x01 },
1655 { 0x01, 0x01, 0x01, 0x01 }
1656 };
1657
1658 int id = sc->device_id;
1659
1660 BUILD_BUG_ON(MAX_LEDS < ARRAY_SIZE(sixaxis_leds[0]));
1661
1662 if (id < 0)
1663 return;
1664
1665 id %= 10;
1666 memcpy(sc->led_state, sixaxis_leds[id], sizeof(sixaxis_leds[id]));
1667}
1668
1669static void dualshock4_set_leds_from_id(struct sony_sc *sc)
1670{
1671
1672 static const u8 color_code[7][3] = {
1673 { 0x00, 0x00, 0x40 },
1674 { 0x40, 0x00, 0x00 },
1675 { 0x00, 0x40, 0x00 },
1676 { 0x20, 0x00, 0x20 },
1677 { 0x02, 0x01, 0x00 },
1678 { 0x00, 0x01, 0x01 },
1679 { 0x01, 0x01, 0x01 }
1680 };
1681
1682 int id = sc->device_id;
1683
1684 BUILD_BUG_ON(MAX_LEDS < ARRAY_SIZE(color_code[0]));
1685
1686 if (id < 0)
1687 return;
1688
1689 id %= 7;
1690 memcpy(sc->led_state, color_code[id], sizeof(color_code[id]));
1691}
1692
1693static void buzz_set_leds(struct sony_sc *sc)
1694{
1695 struct hid_device *hdev = sc->hdev;
1696 struct list_head *report_list =
1697 &hdev->report_enum[HID_OUTPUT_REPORT].report_list;
1698 struct hid_report *report = list_entry(report_list->next,
1699 struct hid_report, list);
1700 s32 *value = report->field[0]->value;
1701
1702 BUILD_BUG_ON(MAX_LEDS < 4);
1703
1704 value[0] = 0x00;
1705 value[1] = sc->led_state[0] ? 0xff : 0x00;
1706 value[2] = sc->led_state[1] ? 0xff : 0x00;
1707 value[3] = sc->led_state[2] ? 0xff : 0x00;
1708 value[4] = sc->led_state[3] ? 0xff : 0x00;
1709 value[5] = 0x00;
1710 value[6] = 0x00;
1711 hid_hw_request(hdev, report, HID_REQ_SET_REPORT);
1712}
1713
1714static void sony_set_leds(struct sony_sc *sc)
1715{
1716 if (!(sc->quirks & BUZZ_CONTROLLER))
1717 sony_schedule_work(sc, SONY_WORKER_STATE);
1718 else
1719 buzz_set_leds(sc);
1720}
1721
1722static void sony_led_set_brightness(struct led_classdev *led,
1723 enum led_brightness value)
1724{
1725 struct device *dev = led->dev->parent;
1726 struct hid_device *hdev = to_hid_device(dev);
1727 struct sony_sc *drv_data;
1728
1729 int n;
1730 int force_update;
1731
1732 drv_data = hid_get_drvdata(hdev);
1733 if (!drv_data) {
1734 hid_err(hdev, "No device data\n");
1735 return;
1736 }
1737
1738
1739
1740
1741
1742
1743
1744
1745 force_update = !!(drv_data->quirks & SIXAXIS_CONTROLLER_USB);
1746
1747 for (n = 0; n < drv_data->led_count; n++) {
1748 if (led == drv_data->leds[n] && (force_update ||
1749 (value != drv_data->led_state[n] ||
1750 drv_data->led_delay_on[n] ||
1751 drv_data->led_delay_off[n]))) {
1752
1753 drv_data->led_state[n] = value;
1754
1755
1756 drv_data->led_delay_on[n] = 0;
1757 drv_data->led_delay_off[n] = 0;
1758
1759 sony_set_leds(drv_data);
1760 break;
1761 }
1762 }
1763}
1764
1765static enum led_brightness sony_led_get_brightness(struct led_classdev *led)
1766{
1767 struct device *dev = led->dev->parent;
1768 struct hid_device *hdev = to_hid_device(dev);
1769 struct sony_sc *drv_data;
1770
1771 int n;
1772
1773 drv_data = hid_get_drvdata(hdev);
1774 if (!drv_data) {
1775 hid_err(hdev, "No device data\n");
1776 return LED_OFF;
1777 }
1778
1779 for (n = 0; n < drv_data->led_count; n++) {
1780 if (led == drv_data->leds[n])
1781 return drv_data->led_state[n];
1782 }
1783
1784 return LED_OFF;
1785}
1786
1787static int sony_led_blink_set(struct led_classdev *led, unsigned long *delay_on,
1788 unsigned long *delay_off)
1789{
1790 struct device *dev = led->dev->parent;
1791 struct hid_device *hdev = to_hid_device(dev);
1792 struct sony_sc *drv_data = hid_get_drvdata(hdev);
1793 int n;
1794 u8 new_on, new_off;
1795
1796 if (!drv_data) {
1797 hid_err(hdev, "No device data\n");
1798 return -EINVAL;
1799 }
1800
1801
1802 if (*delay_on > 2550)
1803 *delay_on = 2550;
1804 if (*delay_off > 2550)
1805 *delay_off = 2550;
1806
1807
1808 if (!*delay_on && !*delay_off)
1809 *delay_on = *delay_off = 500;
1810
1811 new_on = *delay_on / 10;
1812 new_off = *delay_off / 10;
1813
1814 for (n = 0; n < drv_data->led_count; n++) {
1815 if (led == drv_data->leds[n])
1816 break;
1817 }
1818
1819
1820 if (n >= drv_data->led_count)
1821 return -EINVAL;
1822
1823
1824 if (new_on != drv_data->led_delay_on[n] ||
1825 new_off != drv_data->led_delay_off[n]) {
1826 drv_data->led_delay_on[n] = new_on;
1827 drv_data->led_delay_off[n] = new_off;
1828 sony_schedule_work(drv_data, SONY_WORKER_STATE);
1829 }
1830
1831 return 0;
1832}
1833
1834static void sony_leds_remove(struct sony_sc *sc)
1835{
1836 struct led_classdev *led;
1837 int n;
1838
1839 BUG_ON(!(sc->quirks & SONY_LED_SUPPORT));
1840
1841 for (n = 0; n < sc->led_count; n++) {
1842 led = sc->leds[n];
1843 sc->leds[n] = NULL;
1844 if (!led)
1845 continue;
1846 led_classdev_unregister(led);
1847 kfree(led);
1848 }
1849
1850 sc->led_count = 0;
1851}
1852
1853static int sony_leds_init(struct sony_sc *sc)
1854{
1855 struct hid_device *hdev = sc->hdev;
1856 int n, ret = 0;
1857 int use_ds4_names;
1858 struct led_classdev *led;
1859 size_t name_sz;
1860 char *name;
1861 size_t name_len;
1862 const char *name_fmt;
1863 static const char * const ds4_name_str[] = { "red", "green", "blue",
1864 "global" };
1865 u8 max_brightness[MAX_LEDS] = { [0 ... (MAX_LEDS - 1)] = 1 };
1866 u8 use_hw_blink[MAX_LEDS] = { 0 };
1867
1868 BUG_ON(!(sc->quirks & SONY_LED_SUPPORT));
1869
1870 if (sc->quirks & BUZZ_CONTROLLER) {
1871 sc->led_count = 4;
1872 use_ds4_names = 0;
1873 name_len = strlen("::buzz#");
1874 name_fmt = "%s::buzz%d";
1875
1876 if (!hid_validate_values(hdev, HID_OUTPUT_REPORT, 0, 0, 7))
1877 return -ENODEV;
1878 } else if (sc->quirks & DUALSHOCK4_CONTROLLER) {
1879 dualshock4_set_leds_from_id(sc);
1880 sc->led_state[3] = 1;
1881 sc->led_count = 4;
1882 memset(max_brightness, 255, 3);
1883 use_hw_blink[3] = 1;
1884 use_ds4_names = 1;
1885 name_len = 0;
1886 name_fmt = "%s:%s";
1887 } else if (sc->quirks & MOTION_CONTROLLER) {
1888 sc->led_count = 3;
1889 memset(max_brightness, 255, 3);
1890 use_ds4_names = 1;
1891 name_len = 0;
1892 name_fmt = "%s:%s";
1893 } else if (sc->quirks & NAVIGATION_CONTROLLER) {
1894 static const u8 navigation_leds[4] = {0x01, 0x00, 0x00, 0x00};
1895
1896 memcpy(sc->led_state, navigation_leds, sizeof(navigation_leds));
1897 sc->led_count = 1;
1898 memset(use_hw_blink, 1, 4);
1899 use_ds4_names = 0;
1900 name_len = strlen("::sony#");
1901 name_fmt = "%s::sony%d";
1902 } else {
1903 sixaxis_set_leds_from_id(sc);
1904 sc->led_count = 4;
1905 memset(use_hw_blink, 1, 4);
1906 use_ds4_names = 0;
1907 name_len = strlen("::sony#");
1908 name_fmt = "%s::sony%d";
1909 }
1910
1911
1912
1913
1914
1915
1916 sony_set_leds(sc);
1917
1918 name_sz = strlen(dev_name(&hdev->dev)) + name_len + 1;
1919
1920 for (n = 0; n < sc->led_count; n++) {
1921
1922 if (use_ds4_names)
1923 name_sz = strlen(dev_name(&hdev->dev)) + strlen(ds4_name_str[n]) + 2;
1924
1925 led = kzalloc(sizeof(struct led_classdev) + name_sz, GFP_KERNEL);
1926 if (!led) {
1927 hid_err(hdev, "Couldn't allocate memory for LED %d\n", n);
1928 ret = -ENOMEM;
1929 goto error_leds;
1930 }
1931
1932 name = (void *)(&led[1]);
1933 if (use_ds4_names)
1934 snprintf(name, name_sz, name_fmt, dev_name(&hdev->dev),
1935 ds4_name_str[n]);
1936 else
1937 snprintf(name, name_sz, name_fmt, dev_name(&hdev->dev), n + 1);
1938 led->name = name;
1939 led->brightness = sc->led_state[n];
1940 led->max_brightness = max_brightness[n];
1941 led->flags = LED_CORE_SUSPENDRESUME;
1942 led->brightness_get = sony_led_get_brightness;
1943 led->brightness_set = sony_led_set_brightness;
1944
1945 if (use_hw_blink[n])
1946 led->blink_set = sony_led_blink_set;
1947
1948 sc->leds[n] = led;
1949
1950 ret = led_classdev_register(&hdev->dev, led);
1951 if (ret) {
1952 hid_err(hdev, "Failed to register LED %d\n", n);
1953 sc->leds[n] = NULL;
1954 kfree(led);
1955 goto error_leds;
1956 }
1957 }
1958
1959 return ret;
1960
1961error_leds:
1962 sony_leds_remove(sc);
1963
1964 return ret;
1965}
1966
1967static void sixaxis_send_output_report(struct sony_sc *sc)
1968{
1969 static const union sixaxis_output_report_01 default_report = {
1970 .buf = {
1971 0x01,
1972 0x01, 0xff, 0x00, 0xff, 0x00,
1973 0x00, 0x00, 0x00, 0x00, 0x00,
1974 0xff, 0x27, 0x10, 0x00, 0x32,
1975 0xff, 0x27, 0x10, 0x00, 0x32,
1976 0xff, 0x27, 0x10, 0x00, 0x32,
1977 0xff, 0x27, 0x10, 0x00, 0x32,
1978 0x00, 0x00, 0x00, 0x00, 0x00
1979 }
1980 };
1981 struct sixaxis_output_report *report =
1982 (struct sixaxis_output_report *)sc->output_report_dmabuf;
1983 int n;
1984
1985
1986 memcpy(report, &default_report, sizeof(struct sixaxis_output_report));
1987
1988#ifdef CONFIG_SONY_FF
1989 report->rumble.right_motor_on = sc->right ? 1 : 0;
1990 report->rumble.left_motor_force = sc->left;
1991#endif
1992
1993 report->leds_bitmap |= sc->led_state[0] << 1;
1994 report->leds_bitmap |= sc->led_state[1] << 2;
1995 report->leds_bitmap |= sc->led_state[2] << 3;
1996 report->leds_bitmap |= sc->led_state[3] << 4;
1997
1998
1999 if ((report->leds_bitmap & 0x1E) == 0)
2000 report->leds_bitmap |= 0x20;
2001
2002
2003
2004
2005
2006
2007
2008
2009
2010
2011 for (n = 0; n < 4; n++) {
2012 if (sc->led_delay_on[n] || sc->led_delay_off[n]) {
2013 report->led[3 - n].duty_off = sc->led_delay_off[n];
2014 report->led[3 - n].duty_on = sc->led_delay_on[n];
2015 }
2016 }
2017
2018 hid_hw_raw_request(sc->hdev, report->report_id, (u8 *)report,
2019 sizeof(struct sixaxis_output_report),
2020 HID_OUTPUT_REPORT, HID_REQ_SET_REPORT);
2021}
2022
2023static void dualshock4_send_output_report(struct sony_sc *sc)
2024{
2025 struct hid_device *hdev = sc->hdev;
2026 u8 *buf = sc->output_report_dmabuf;
2027 int offset;
2028
2029
2030
2031
2032
2033
2034
2035
2036
2037
2038 if (sc->quirks & (DUALSHOCK4_CONTROLLER_USB | DUALSHOCK4_DONGLE)) {
2039 memset(buf, 0, DS4_OUTPUT_REPORT_0x05_SIZE);
2040 buf[0] = 0x05;
2041 buf[1] = 0x07;
2042 offset = 4;
2043 } else {
2044 memset(buf, 0, DS4_OUTPUT_REPORT_0x11_SIZE);
2045 buf[0] = 0x11;
2046 buf[1] = 0xC0 | sc->ds4_bt_poll_interval;
2047 buf[3] = 0x07;
2048 offset = 6;
2049 }
2050
2051#ifdef CONFIG_SONY_FF
2052 buf[offset++] = sc->right;
2053 buf[offset++] = sc->left;
2054#else
2055 offset += 2;
2056#endif
2057
2058
2059 if (sc->led_state[3]) {
2060 buf[offset++] = sc->led_state[0];
2061 buf[offset++] = sc->led_state[1];
2062 buf[offset++] = sc->led_state[2];
2063 } else {
2064 offset += 3;
2065 }
2066
2067
2068 buf[offset++] = sc->led_delay_on[3];
2069 buf[offset++] = sc->led_delay_off[3];
2070
2071 if (sc->quirks & (DUALSHOCK4_CONTROLLER_USB | DUALSHOCK4_DONGLE))
2072 hid_hw_output_report(hdev, buf, DS4_OUTPUT_REPORT_0x05_SIZE);
2073 else {
2074
2075 u8 bthdr = 0xA2;
2076 u32 crc;
2077
2078 crc = crc32_le(0xFFFFFFFF, &bthdr, 1);
2079 crc = ~crc32_le(crc, buf, DS4_OUTPUT_REPORT_0x11_SIZE-4);
2080 put_unaligned_le32(crc, &buf[74]);
2081 hid_hw_output_report(hdev, buf, DS4_OUTPUT_REPORT_0x11_SIZE);
2082 }
2083}
2084
2085static void motion_send_output_report(struct sony_sc *sc)
2086{
2087 struct hid_device *hdev = sc->hdev;
2088 struct motion_output_report_02 *report =
2089 (struct motion_output_report_02 *)sc->output_report_dmabuf;
2090
2091 memset(report, 0, MOTION_REPORT_0x02_SIZE);
2092
2093 report->type = 0x02;
2094 report->r = sc->led_state[0];
2095 report->g = sc->led_state[1];
2096 report->b = sc->led_state[2];
2097
2098#ifdef CONFIG_SONY_FF
2099 report->rumble = max(sc->right, sc->left);
2100#endif
2101
2102 hid_hw_output_report(hdev, (u8 *)report, MOTION_REPORT_0x02_SIZE);
2103}
2104
2105static inline void sony_send_output_report(struct sony_sc *sc)
2106{
2107 if (sc->send_output_report)
2108 sc->send_output_report(sc);
2109}
2110
2111static void sony_state_worker(struct work_struct *work)
2112{
2113 struct sony_sc *sc = container_of(work, struct sony_sc, state_worker);
2114
2115 sc->send_output_report(sc);
2116}
2117
2118static int sony_allocate_output_report(struct sony_sc *sc)
2119{
2120 if ((sc->quirks & SIXAXIS_CONTROLLER) ||
2121 (sc->quirks & NAVIGATION_CONTROLLER))
2122 sc->output_report_dmabuf =
2123 kmalloc(sizeof(union sixaxis_output_report_01),
2124 GFP_KERNEL);
2125 else if (sc->quirks & DUALSHOCK4_CONTROLLER_BT)
2126 sc->output_report_dmabuf = kmalloc(DS4_OUTPUT_REPORT_0x11_SIZE,
2127 GFP_KERNEL);
2128 else if (sc->quirks & (DUALSHOCK4_CONTROLLER_USB | DUALSHOCK4_DONGLE))
2129 sc->output_report_dmabuf = kmalloc(DS4_OUTPUT_REPORT_0x05_SIZE,
2130 GFP_KERNEL);
2131 else if (sc->quirks & MOTION_CONTROLLER)
2132 sc->output_report_dmabuf = kmalloc(MOTION_REPORT_0x02_SIZE,
2133 GFP_KERNEL);
2134 else
2135 return 0;
2136
2137 if (!sc->output_report_dmabuf)
2138 return -ENOMEM;
2139
2140 return 0;
2141}
2142
2143#ifdef CONFIG_SONY_FF
2144static int sony_play_effect(struct input_dev *dev, void *data,
2145 struct ff_effect *effect)
2146{
2147 struct hid_device *hid = input_get_drvdata(dev);
2148 struct sony_sc *sc = hid_get_drvdata(hid);
2149
2150 if (effect->type != FF_RUMBLE)
2151 return 0;
2152
2153 sc->left = effect->u.rumble.strong_magnitude / 256;
2154 sc->right = effect->u.rumble.weak_magnitude / 256;
2155
2156 sony_schedule_work(sc, SONY_WORKER_STATE);
2157 return 0;
2158}
2159
2160static int sony_init_ff(struct sony_sc *sc)
2161{
2162 struct hid_input *hidinput = list_entry(sc->hdev->inputs.next,
2163 struct hid_input, list);
2164 struct input_dev *input_dev = hidinput->input;
2165
2166 input_set_capability(input_dev, EV_FF, FF_RUMBLE);
2167 return input_ff_create_memless(input_dev, NULL, sony_play_effect);
2168}
2169
2170#else
2171static int sony_init_ff(struct sony_sc *sc)
2172{
2173 return 0;
2174}
2175
2176#endif
2177
2178static int sony_battery_get_property(struct power_supply *psy,
2179 enum power_supply_property psp,
2180 union power_supply_propval *val)
2181{
2182 struct sony_sc *sc = power_supply_get_drvdata(psy);
2183 unsigned long flags;
2184 int ret = 0;
2185 u8 battery_charging, battery_capacity, cable_state;
2186
2187 spin_lock_irqsave(&sc->lock, flags);
2188 battery_charging = sc->battery_charging;
2189 battery_capacity = sc->battery_capacity;
2190 cable_state = sc->cable_state;
2191 spin_unlock_irqrestore(&sc->lock, flags);
2192
2193 switch (psp) {
2194 case POWER_SUPPLY_PROP_PRESENT:
2195 val->intval = 1;
2196 break;
2197 case POWER_SUPPLY_PROP_SCOPE:
2198 val->intval = POWER_SUPPLY_SCOPE_DEVICE;
2199 break;
2200 case POWER_SUPPLY_PROP_CAPACITY:
2201 val->intval = battery_capacity;
2202 break;
2203 case POWER_SUPPLY_PROP_STATUS:
2204 if (battery_charging)
2205 val->intval = POWER_SUPPLY_STATUS_CHARGING;
2206 else
2207 if (battery_capacity == 100 && cable_state)
2208 val->intval = POWER_SUPPLY_STATUS_FULL;
2209 else
2210 val->intval = POWER_SUPPLY_STATUS_DISCHARGING;
2211 break;
2212 default:
2213 ret = -EINVAL;
2214 break;
2215 }
2216 return ret;
2217}
2218
2219static int sony_battery_probe(struct sony_sc *sc, int append_dev_id)
2220{
2221 const char *battery_str_fmt = append_dev_id ?
2222 "sony_controller_battery_%pMR_%i" :
2223 "sony_controller_battery_%pMR";
2224 struct power_supply_config psy_cfg = { .drv_data = sc, };
2225 struct hid_device *hdev = sc->hdev;
2226 int ret;
2227
2228
2229
2230
2231
2232 sc->battery_capacity = 100;
2233
2234 sc->battery_desc.properties = sony_battery_props;
2235 sc->battery_desc.num_properties = ARRAY_SIZE(sony_battery_props);
2236 sc->battery_desc.get_property = sony_battery_get_property;
2237 sc->battery_desc.type = POWER_SUPPLY_TYPE_BATTERY;
2238 sc->battery_desc.use_for_apm = 0;
2239 sc->battery_desc.name = kasprintf(GFP_KERNEL, battery_str_fmt,
2240 sc->mac_address, sc->device_id);
2241 if (!sc->battery_desc.name)
2242 return -ENOMEM;
2243
2244 sc->battery = power_supply_register(&hdev->dev, &sc->battery_desc,
2245 &psy_cfg);
2246 if (IS_ERR(sc->battery)) {
2247 ret = PTR_ERR(sc->battery);
2248 hid_err(hdev, "Unable to register battery device\n");
2249 goto err_free;
2250 }
2251
2252 power_supply_powers(sc->battery, &hdev->dev);
2253 return 0;
2254
2255err_free:
2256 kfree(sc->battery_desc.name);
2257 sc->battery_desc.name = NULL;
2258 return ret;
2259}
2260
2261static void sony_battery_remove(struct sony_sc *sc)
2262{
2263 if (!sc->battery_desc.name)
2264 return;
2265
2266 power_supply_unregister(sc->battery);
2267 kfree(sc->battery_desc.name);
2268 sc->battery_desc.name = NULL;
2269}
2270
2271
2272
2273
2274
2275
2276
2277
2278
2279
2280
2281
2282static inline int sony_compare_connection_type(struct sony_sc *sc0,
2283 struct sony_sc *sc1)
2284{
2285 const int sc0_not_bt = !(sc0->quirks & SONY_BT_DEVICE);
2286 const int sc1_not_bt = !(sc1->quirks & SONY_BT_DEVICE);
2287
2288 return sc0_not_bt == sc1_not_bt;
2289}
2290
2291static int sony_check_add_dev_list(struct sony_sc *sc)
2292{
2293 struct sony_sc *entry;
2294 unsigned long flags;
2295 int ret;
2296
2297 spin_lock_irqsave(&sony_dev_list_lock, flags);
2298
2299 list_for_each_entry(entry, &sony_device_list, list_node) {
2300 ret = memcmp(sc->mac_address, entry->mac_address,
2301 sizeof(sc->mac_address));
2302 if (!ret) {
2303 if (sony_compare_connection_type(sc, entry)) {
2304 ret = 1;
2305 } else {
2306 ret = -EEXIST;
2307 hid_info(sc->hdev,
2308 "controller with MAC address %pMR already connected\n",
2309 sc->mac_address);
2310 }
2311 goto unlock;
2312 }
2313 }
2314
2315 ret = 0;
2316 list_add(&(sc->list_node), &sony_device_list);
2317
2318unlock:
2319 spin_unlock_irqrestore(&sony_dev_list_lock, flags);
2320 return ret;
2321}
2322
2323static void sony_remove_dev_list(struct sony_sc *sc)
2324{
2325 unsigned long flags;
2326
2327 if (sc->list_node.next) {
2328 spin_lock_irqsave(&sony_dev_list_lock, flags);
2329 list_del(&(sc->list_node));
2330 spin_unlock_irqrestore(&sony_dev_list_lock, flags);
2331 }
2332}
2333
2334static int sony_get_bt_devaddr(struct sony_sc *sc)
2335{
2336 int ret;
2337
2338
2339 ret = strlen(sc->hdev->uniq);
2340 if (ret != 17)
2341 return -EINVAL;
2342
2343 ret = sscanf(sc->hdev->uniq,
2344 "%02hhx:%02hhx:%02hhx:%02hhx:%02hhx:%02hhx",
2345 &sc->mac_address[5], &sc->mac_address[4], &sc->mac_address[3],
2346 &sc->mac_address[2], &sc->mac_address[1], &sc->mac_address[0]);
2347
2348 if (ret != 6)
2349 return -EINVAL;
2350
2351 return 0;
2352}
2353
2354static int sony_check_add(struct sony_sc *sc)
2355{
2356 u8 *buf = NULL;
2357 int n, ret;
2358
2359 if ((sc->quirks & DUALSHOCK4_CONTROLLER_BT) ||
2360 (sc->quirks & MOTION_CONTROLLER_BT) ||
2361 (sc->quirks & NAVIGATION_CONTROLLER_BT) ||
2362 (sc->quirks & SIXAXIS_CONTROLLER_BT)) {
2363
2364
2365
2366
2367
2368
2369 if (sony_get_bt_devaddr(sc) < 0) {
2370 hid_warn(sc->hdev, "UNIQ does not contain a MAC address; duplicate check skipped\n");
2371 return 0;
2372 }
2373 } else if (sc->quirks & (DUALSHOCK4_CONTROLLER_USB | DUALSHOCK4_DONGLE)) {
2374 buf = kmalloc(DS4_FEATURE_REPORT_0x81_SIZE, GFP_KERNEL);
2375 if (!buf)
2376 return -ENOMEM;
2377
2378
2379
2380
2381
2382
2383 ret = hid_hw_raw_request(sc->hdev, 0x81, buf,
2384 DS4_FEATURE_REPORT_0x81_SIZE, HID_FEATURE_REPORT,
2385 HID_REQ_GET_REPORT);
2386
2387 if (ret != DS4_FEATURE_REPORT_0x81_SIZE) {
2388 hid_err(sc->hdev, "failed to retrieve feature report 0x81 with the DualShock 4 MAC address\n");
2389 ret = ret < 0 ? ret : -EINVAL;
2390 goto out_free;
2391 }
2392
2393 memcpy(sc->mac_address, &buf[1], sizeof(sc->mac_address));
2394
2395 snprintf(sc->hdev->uniq, sizeof(sc->hdev->uniq),
2396 "%02hhx:%02hhx:%02hhx:%02hhx:%02hhx:%02hhx",
2397 sc->mac_address[5], sc->mac_address[4],
2398 sc->mac_address[3], sc->mac_address[2],
2399 sc->mac_address[1], sc->mac_address[0]);
2400 } else if ((sc->quirks & SIXAXIS_CONTROLLER_USB) ||
2401 (sc->quirks & NAVIGATION_CONTROLLER_USB)) {
2402 buf = kmalloc(SIXAXIS_REPORT_0xF2_SIZE, GFP_KERNEL);
2403 if (!buf)
2404 return -ENOMEM;
2405
2406
2407
2408
2409
2410
2411 ret = hid_hw_raw_request(sc->hdev, 0xf2, buf,
2412 SIXAXIS_REPORT_0xF2_SIZE, HID_FEATURE_REPORT,
2413 HID_REQ_GET_REPORT);
2414
2415 if (ret != SIXAXIS_REPORT_0xF2_SIZE) {
2416 hid_err(sc->hdev, "failed to retrieve feature report 0xf2 with the Sixaxis MAC address\n");
2417 ret = ret < 0 ? ret : -EINVAL;
2418 goto out_free;
2419 }
2420
2421
2422
2423
2424
2425 for (n = 0; n < 6; n++)
2426 sc->mac_address[5-n] = buf[4+n];
2427
2428 snprintf(sc->hdev->uniq, sizeof(sc->hdev->uniq),
2429 "%02hhx:%02hhx:%02hhx:%02hhx:%02hhx:%02hhx",
2430 sc->mac_address[5], sc->mac_address[4],
2431 sc->mac_address[3], sc->mac_address[2],
2432 sc->mac_address[1], sc->mac_address[0]);
2433 } else {
2434 return 0;
2435 }
2436
2437 ret = sony_check_add_dev_list(sc);
2438
2439out_free:
2440
2441 kfree(buf);
2442
2443 return ret;
2444}
2445
2446static int sony_set_device_id(struct sony_sc *sc)
2447{
2448 int ret;
2449
2450
2451
2452
2453
2454 if ((sc->quirks & SIXAXIS_CONTROLLER) ||
2455 (sc->quirks & DUALSHOCK4_CONTROLLER)) {
2456 ret = ida_simple_get(&sony_device_id_allocator, 0, 0,
2457 GFP_KERNEL);
2458 if (ret < 0) {
2459 sc->device_id = -1;
2460 return ret;
2461 }
2462 sc->device_id = ret;
2463 } else {
2464 sc->device_id = -1;
2465 }
2466
2467 return 0;
2468}
2469
2470static void sony_release_device_id(struct sony_sc *sc)
2471{
2472 if (sc->device_id >= 0) {
2473 ida_simple_remove(&sony_device_id_allocator, sc->device_id);
2474 sc->device_id = -1;
2475 }
2476}
2477
2478static inline void sony_init_output_report(struct sony_sc *sc,
2479 void (*send_output_report)(struct sony_sc *))
2480{
2481 sc->send_output_report = send_output_report;
2482
2483 if (!sc->state_worker_initialized)
2484 INIT_WORK(&sc->state_worker, sony_state_worker);
2485
2486 sc->state_worker_initialized = 1;
2487}
2488
2489static inline void sony_cancel_work_sync(struct sony_sc *sc)
2490{
2491 if (sc->hotplug_worker_initialized)
2492 cancel_work_sync(&sc->hotplug_worker);
2493 if (sc->state_worker_initialized)
2494 cancel_work_sync(&sc->state_worker);
2495}
2496
2497
2498static int sony_input_configured(struct hid_device *hdev,
2499 struct hid_input *hidinput)
2500{
2501 struct sony_sc *sc = hid_get_drvdata(hdev);
2502 int append_dev_id;
2503 int ret;
2504
2505 ret = sony_set_device_id(sc);
2506 if (ret < 0) {
2507 hid_err(hdev, "failed to allocate the device id\n");
2508 goto err_stop;
2509 }
2510
2511 ret = append_dev_id = sony_check_add(sc);
2512 if (ret < 0)
2513 goto err_stop;
2514
2515 ret = sony_allocate_output_report(sc);
2516 if (ret < 0) {
2517 hid_err(hdev, "failed to allocate the output report buffer\n");
2518 goto err_stop;
2519 }
2520
2521 if (sc->quirks & NAVIGATION_CONTROLLER_USB) {
2522
2523
2524
2525
2526
2527
2528
2529
2530
2531
2532
2533
2534
2535
2536
2537
2538 hdev->quirks |= HID_QUIRK_NO_OUTPUT_REPORTS_ON_INTR_EP;
2539 hdev->quirks |= HID_QUIRK_SKIP_OUTPUT_REPORT_ID;
2540 sc->defer_initialization = 1;
2541
2542 ret = sixaxis_set_operational_usb(hdev);
2543 if (ret < 0) {
2544 hid_err(hdev, "Failed to set controller into operational mode\n");
2545 goto err_stop;
2546 }
2547
2548 sony_init_output_report(sc, sixaxis_send_output_report);
2549 } else if (sc->quirks & NAVIGATION_CONTROLLER_BT) {
2550
2551
2552
2553
2554 hdev->quirks |= HID_QUIRK_NO_OUTPUT_REPORTS_ON_INTR_EP;
2555
2556 ret = sixaxis_set_operational_bt(hdev);
2557 if (ret < 0) {
2558 hid_err(hdev, "Failed to set controller into operational mode\n");
2559 goto err_stop;
2560 }
2561
2562 sony_init_output_report(sc, sixaxis_send_output_report);
2563 } else if (sc->quirks & SIXAXIS_CONTROLLER_USB) {
2564
2565
2566
2567
2568
2569
2570 hdev->quirks |= HID_QUIRK_NO_OUTPUT_REPORTS_ON_INTR_EP;
2571 hdev->quirks |= HID_QUIRK_SKIP_OUTPUT_REPORT_ID;
2572 sc->defer_initialization = 1;
2573
2574 ret = sixaxis_set_operational_usb(hdev);
2575 if (ret < 0) {
2576 hid_err(hdev, "Failed to set controller into operational mode\n");
2577 goto err_stop;
2578 }
2579
2580 ret = sony_register_sensors(sc);
2581 if (ret) {
2582 hid_err(sc->hdev,
2583 "Unable to initialize motion sensors: %d\n", ret);
2584 goto err_stop;
2585 }
2586
2587 sony_init_output_report(sc, sixaxis_send_output_report);
2588 } else if (sc->quirks & SIXAXIS_CONTROLLER_BT) {
2589
2590
2591
2592
2593 hdev->quirks |= HID_QUIRK_NO_OUTPUT_REPORTS_ON_INTR_EP;
2594
2595 ret = sixaxis_set_operational_bt(hdev);
2596 if (ret < 0) {
2597 hid_err(hdev, "Failed to set controller into operational mode\n");
2598 goto err_stop;
2599 }
2600
2601 ret = sony_register_sensors(sc);
2602 if (ret) {
2603 hid_err(sc->hdev,
2604 "Unable to initialize motion sensors: %d\n", ret);
2605 goto err_stop;
2606 }
2607
2608 sony_init_output_report(sc, sixaxis_send_output_report);
2609 } else if (sc->quirks & DUALSHOCK4_CONTROLLER) {
2610 ret = dualshock4_get_calibration_data(sc);
2611 if (ret < 0) {
2612 hid_err(hdev, "Failed to get calibration data from Dualshock 4\n");
2613 goto err_stop;
2614 }
2615
2616
2617
2618
2619
2620 ret = sony_register_touchpad(sc, 2, 1920, 942);
2621 if (ret) {
2622 hid_err(sc->hdev,
2623 "Unable to initialize multi-touch slots: %d\n",
2624 ret);
2625 goto err_stop;
2626 }
2627
2628 ret = sony_register_sensors(sc);
2629 if (ret) {
2630 hid_err(sc->hdev,
2631 "Unable to initialize motion sensors: %d\n", ret);
2632 goto err_stop;
2633 }
2634
2635 if (sc->quirks & DUALSHOCK4_CONTROLLER_BT) {
2636 sc->ds4_bt_poll_interval = DS4_BT_DEFAULT_POLL_INTERVAL_MS;
2637 ret = device_create_file(&sc->hdev->dev, &dev_attr_bt_poll_interval);
2638 if (ret)
2639 hid_warn(sc->hdev,
2640 "can't create sysfs bt_poll_interval attribute err: %d\n",
2641 ret);
2642 }
2643
2644 if (sc->quirks & DUALSHOCK4_DONGLE) {
2645 INIT_WORK(&sc->hotplug_worker, dualshock4_calibration_work);
2646 sc->hotplug_worker_initialized = 1;
2647 sc->ds4_dongle_state = DONGLE_DISCONNECTED;
2648 }
2649
2650 sony_init_output_report(sc, dualshock4_send_output_report);
2651 } else if (sc->quirks & MOTION_CONTROLLER) {
2652 sony_init_output_report(sc, motion_send_output_report);
2653 } else {
2654 ret = 0;
2655 }
2656
2657 if (sc->quirks & SONY_LED_SUPPORT) {
2658 ret = sony_leds_init(sc);
2659 if (ret < 0)
2660 goto err_stop;
2661 }
2662
2663 if (sc->quirks & SONY_BATTERY_SUPPORT) {
2664 ret = sony_battery_probe(sc, append_dev_id);
2665 if (ret < 0)
2666 goto err_stop;
2667
2668
2669 ret = hid_hw_open(hdev);
2670 if (ret < 0) {
2671 hid_err(hdev, "hw open failed\n");
2672 goto err_stop;
2673 }
2674 }
2675
2676 if (sc->quirks & SONY_FF_SUPPORT) {
2677 ret = sony_init_ff(sc);
2678 if (ret < 0)
2679 goto err_close;
2680 }
2681
2682 return 0;
2683err_close:
2684 hid_hw_close(hdev);
2685err_stop:
2686
2687
2688
2689
2690 if (sc->ds4_bt_poll_interval)
2691 device_remove_file(&sc->hdev->dev, &dev_attr_bt_poll_interval);
2692 if (sc->quirks & SONY_LED_SUPPORT)
2693 sony_leds_remove(sc);
2694 if (sc->quirks & SONY_BATTERY_SUPPORT)
2695 sony_battery_remove(sc);
2696 if (sc->touchpad)
2697 sony_unregister_touchpad(sc);
2698 if (sc->sensor_dev)
2699 sony_unregister_sensors(sc);
2700 sony_cancel_work_sync(sc);
2701 kfree(sc->output_report_dmabuf);
2702 sony_remove_dev_list(sc);
2703 sony_release_device_id(sc);
2704 hid_hw_stop(hdev);
2705 return ret;
2706}
2707
2708static int sony_probe(struct hid_device *hdev, const struct hid_device_id *id)
2709{
2710 int ret;
2711 unsigned long quirks = id->driver_data;
2712 struct sony_sc *sc;
2713 unsigned int connect_mask = HID_CONNECT_DEFAULT;
2714
2715 if (!strcmp(hdev->name, "FutureMax Dance Mat"))
2716 quirks |= FUTUREMAX_DANCE_MAT;
2717
2718 sc = devm_kzalloc(&hdev->dev, sizeof(*sc), GFP_KERNEL);
2719 if (sc == NULL) {
2720 hid_err(hdev, "can't alloc sony descriptor\n");
2721 return -ENOMEM;
2722 }
2723
2724 spin_lock_init(&sc->lock);
2725
2726 sc->quirks = quirks;
2727 hid_set_drvdata(hdev, sc);
2728 sc->hdev = hdev;
2729
2730 ret = hid_parse(hdev);
2731 if (ret) {
2732 hid_err(hdev, "parse failed\n");
2733 return ret;
2734 }
2735
2736 if (sc->quirks & VAIO_RDESC_CONSTANT)
2737 connect_mask |= HID_CONNECT_HIDDEV_FORCE;
2738 else if (sc->quirks & SIXAXIS_CONTROLLER)
2739 connect_mask |= HID_CONNECT_HIDDEV_FORCE;
2740
2741
2742
2743
2744
2745
2746
2747 if (sc->quirks & (SIXAXIS_CONTROLLER | DUALSHOCK4_CONTROLLER))
2748 hdev->version |= 0x8000;
2749
2750 ret = hid_hw_start(hdev, connect_mask);
2751 if (ret) {
2752 hid_err(hdev, "hw start failed\n");
2753 return ret;
2754 }
2755
2756
2757
2758
2759
2760
2761
2762
2763
2764 if (!(hdev->claimed & HID_CLAIMED_INPUT)) {
2765 hid_err(hdev, "failed to claim input\n");
2766 return -ENODEV;
2767 }
2768
2769 return ret;
2770}
2771
2772static void sony_remove(struct hid_device *hdev)
2773{
2774 struct sony_sc *sc = hid_get_drvdata(hdev);
2775
2776 hid_hw_close(hdev);
2777
2778 if (sc->quirks & SONY_LED_SUPPORT)
2779 sony_leds_remove(sc);
2780
2781 if (sc->quirks & SONY_BATTERY_SUPPORT)
2782 sony_battery_remove(sc);
2783
2784 if (sc->touchpad)
2785 sony_unregister_touchpad(sc);
2786
2787 if (sc->sensor_dev)
2788 sony_unregister_sensors(sc);
2789
2790 if (sc->quirks & DUALSHOCK4_CONTROLLER_BT)
2791 device_remove_file(&sc->hdev->dev, &dev_attr_bt_poll_interval);
2792
2793 sony_cancel_work_sync(sc);
2794
2795 kfree(sc->output_report_dmabuf);
2796
2797 sony_remove_dev_list(sc);
2798
2799 sony_release_device_id(sc);
2800
2801 hid_hw_stop(hdev);
2802}
2803
2804#ifdef CONFIG_PM
2805
2806static int sony_suspend(struct hid_device *hdev, pm_message_t message)
2807{
2808#ifdef CONFIG_SONY_FF
2809
2810
2811 if (SONY_FF_SUPPORT) {
2812 struct sony_sc *sc = hid_get_drvdata(hdev);
2813
2814 sc->left = sc->right = 0;
2815 sony_send_output_report(sc);
2816 }
2817
2818#endif
2819 return 0;
2820}
2821
2822static int sony_resume(struct hid_device *hdev)
2823{
2824 struct sony_sc *sc = hid_get_drvdata(hdev);
2825
2826
2827
2828
2829
2830 if ((sc->quirks & SIXAXIS_CONTROLLER_USB) ||
2831 (sc->quirks & NAVIGATION_CONTROLLER_USB)) {
2832 sixaxis_set_operational_usb(sc->hdev);
2833 sc->defer_initialization = 1;
2834 }
2835
2836 return 0;
2837}
2838
2839#endif
2840
2841static const struct hid_device_id sony_devices[] = {
2842 { HID_USB_DEVICE(USB_VENDOR_ID_SONY, USB_DEVICE_ID_SONY_PS3_CONTROLLER),
2843 .driver_data = SIXAXIS_CONTROLLER_USB },
2844 { HID_USB_DEVICE(USB_VENDOR_ID_SONY, USB_DEVICE_ID_SONY_NAVIGATION_CONTROLLER),
2845 .driver_data = NAVIGATION_CONTROLLER_USB },
2846 { HID_BLUETOOTH_DEVICE(USB_VENDOR_ID_SONY, USB_DEVICE_ID_SONY_NAVIGATION_CONTROLLER),
2847 .driver_data = NAVIGATION_CONTROLLER_BT },
2848 { HID_USB_DEVICE(USB_VENDOR_ID_SONY, USB_DEVICE_ID_SONY_MOTION_CONTROLLER),
2849 .driver_data = MOTION_CONTROLLER_USB },
2850 { HID_BLUETOOTH_DEVICE(USB_VENDOR_ID_SONY, USB_DEVICE_ID_SONY_MOTION_CONTROLLER),
2851 .driver_data = MOTION_CONTROLLER_BT },
2852 { HID_BLUETOOTH_DEVICE(USB_VENDOR_ID_SONY, USB_DEVICE_ID_SONY_PS3_CONTROLLER),
2853 .driver_data = SIXAXIS_CONTROLLER_BT },
2854 { HID_USB_DEVICE(USB_VENDOR_ID_SONY, USB_DEVICE_ID_SONY_VAIO_VGX_MOUSE),
2855 .driver_data = VAIO_RDESC_CONSTANT },
2856 { HID_USB_DEVICE(USB_VENDOR_ID_SONY, USB_DEVICE_ID_SONY_VAIO_VGP_MOUSE),
2857 .driver_data = VAIO_RDESC_CONSTANT },
2858
2859
2860
2861
2862 { HID_USB_DEVICE(USB_VENDOR_ID_SONY, USB_DEVICE_ID_SONY_BUZZ_CONTROLLER),
2863 .driver_data = BUZZ_CONTROLLER },
2864 { HID_USB_DEVICE(USB_VENDOR_ID_SONY, USB_DEVICE_ID_SONY_WIRELESS_BUZZ_CONTROLLER),
2865 .driver_data = BUZZ_CONTROLLER },
2866
2867 { HID_BLUETOOTH_DEVICE(USB_VENDOR_ID_SONY, USB_DEVICE_ID_SONY_PS3_BDREMOTE),
2868 .driver_data = PS3REMOTE },
2869
2870 { HID_BLUETOOTH_DEVICE(USB_VENDOR_ID_LOGITECH, USB_DEVICE_ID_LOGITECH_HARMONY_PS3),
2871 .driver_data = PS3REMOTE },
2872
2873 { HID_BLUETOOTH_DEVICE(USB_VENDOR_ID_SMK, USB_DEVICE_ID_SMK_PS3_BDREMOTE),
2874 .driver_data = PS3REMOTE },
2875
2876 { HID_USB_DEVICE(USB_VENDOR_ID_SONY, USB_DEVICE_ID_SONY_PS4_CONTROLLER),
2877 .driver_data = DUALSHOCK4_CONTROLLER_USB },
2878 { HID_BLUETOOTH_DEVICE(USB_VENDOR_ID_SONY, USB_DEVICE_ID_SONY_PS4_CONTROLLER),
2879 .driver_data = DUALSHOCK4_CONTROLLER_BT },
2880 { HID_USB_DEVICE(USB_VENDOR_ID_SONY, USB_DEVICE_ID_SONY_PS4_CONTROLLER_2),
2881 .driver_data = DUALSHOCK4_CONTROLLER_USB },
2882 { HID_BLUETOOTH_DEVICE(USB_VENDOR_ID_SONY, USB_DEVICE_ID_SONY_PS4_CONTROLLER_2),
2883 .driver_data = DUALSHOCK4_CONTROLLER_BT },
2884 { HID_USB_DEVICE(USB_VENDOR_ID_SONY, USB_DEVICE_ID_SONY_PS4_CONTROLLER_DONGLE),
2885 .driver_data = DUALSHOCK4_DONGLE },
2886
2887 { HID_USB_DEVICE(USB_VENDOR_ID_SINO_LITE, USB_DEVICE_ID_SINO_LITE_CONTROLLER),
2888 .driver_data = SIXAXIS_CONTROLLER_USB | SINO_LITE_CONTROLLER },
2889 { }
2890};
2891MODULE_DEVICE_TABLE(hid, sony_devices);
2892
2893static struct hid_driver sony_driver = {
2894 .name = "sony",
2895 .id_table = sony_devices,
2896 .input_mapping = sony_mapping,
2897 .input_configured = sony_input_configured,
2898 .probe = sony_probe,
2899 .remove = sony_remove,
2900 .report_fixup = sony_report_fixup,
2901 .raw_event = sony_raw_event,
2902
2903#ifdef CONFIG_PM
2904 .suspend = sony_suspend,
2905 .resume = sony_resume,
2906 .reset_resume = sony_resume,
2907#endif
2908};
2909
2910static int __init sony_init(void)
2911{
2912 dbg_hid("Sony:%s\n", __func__);
2913
2914 return hid_register_driver(&sony_driver);
2915}
2916
2917static void __exit sony_exit(void)
2918{
2919 dbg_hid("Sony:%s\n", __func__);
2920
2921 hid_unregister_driver(&sony_driver);
2922 ida_destroy(&sony_device_id_allocator);
2923}
2924module_init(sony_init);
2925module_exit(sony_exit);
2926
2927MODULE_LICENSE("GPL");
2928