2 * HID driver for Sony / PS2 / PS3 BD devices.
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
7 * Copyright (c) 2008 Jiri Slaby
8 * Copyright (c) 2012 David Dillow <dave@thedillows.org>
9 * Copyright (c) 2006-2013 Jiri Kosina
10 * Copyright (c) 2013 Colin Leitner <colin.leitner@gmail.com>
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)
20 /* 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.
24 * There will be no PIN request from the device.
27 #include <linux/device.h>
28 #include <linux/hid.h>
29 #include <linux/module.h>
30 #include <linux/slab.h>
31 #include <linux/usb.h>
32 #include <linux/leds.h>
36 #define VAIO_RDESC_CONSTANT (1 << 0)
37 #define SIXAXIS_CONTROLLER_USB (1 << 1)
38 #define SIXAXIS_CONTROLLER_BT (1 << 2)
39 #define BUZZ_CONTROLLER (1 << 3)
40 #define PS3REMOTE (1 << 4)
42 static const u8 sixaxis_rdesc_fixup[] = {
43 0x95, 0x13, 0x09, 0x01, 0x81, 0x02, 0x95, 0x0C,
44 0x81, 0x01, 0x75, 0x10, 0x95, 0x04, 0x26, 0xFF,
45 0x03, 0x46, 0xFF, 0x03, 0x09, 0x01, 0x81, 0x02
48 static const u8 sixaxis_rdesc_fixup2[] = {
49 0x05, 0x01, 0x09, 0x04, 0xa1, 0x01, 0xa1, 0x02,
50 0x85, 0x01, 0x75, 0x08, 0x95, 0x01, 0x15, 0x00,
51 0x26, 0xff, 0x00, 0x81, 0x03, 0x75, 0x01, 0x95,
52 0x13, 0x15, 0x00, 0x25, 0x01, 0x35, 0x00, 0x45,
53 0x01, 0x05, 0x09, 0x19, 0x01, 0x29, 0x13, 0x81,
54 0x02, 0x75, 0x01, 0x95, 0x0d, 0x06, 0x00, 0xff,
55 0x81, 0x03, 0x15, 0x00, 0x26, 0xff, 0x00, 0x05,
56 0x01, 0x09, 0x01, 0xa1, 0x00, 0x75, 0x08, 0x95,
57 0x04, 0x35, 0x00, 0x46, 0xff, 0x00, 0x09, 0x30,
58 0x09, 0x31, 0x09, 0x32, 0x09, 0x35, 0x81, 0x02,
59 0xc0, 0x05, 0x01, 0x95, 0x13, 0x09, 0x01, 0x81,
60 0x02, 0x95, 0x0c, 0x81, 0x01, 0x75, 0x10, 0x95,
61 0x04, 0x26, 0xff, 0x03, 0x46, 0xff, 0x03, 0x09,
62 0x01, 0x81, 0x02, 0xc0, 0xa1, 0x02, 0x85, 0x02,
63 0x75, 0x08, 0x95, 0x30, 0x09, 0x01, 0xb1, 0x02,
64 0xc0, 0xa1, 0x02, 0x85, 0xee, 0x75, 0x08, 0x95,
65 0x30, 0x09, 0x01, 0xb1, 0x02, 0xc0, 0xa1, 0x02,
66 0x85, 0xef, 0x75, 0x08, 0x95, 0x30, 0x09, 0x01,
67 0xb1, 0x02, 0xc0, 0xc0,
70 static __u8 ps3remote_rdesc[] = {
71 0x05, 0x01, /* GUsagePage Generic Desktop */
72 0x09, 0x05, /* LUsage 0x05 [Game Pad] */
73 0xA1, 0x01, /* MCollection Application (mouse, keyboard) */
75 /* Use collection 1 for joypad buttons */
76 0xA1, 0x02, /* MCollection Logical (interrelated data) */
78 /* Ignore the 1st byte, maybe it is used for a controller
79 * number but it's not needed for correct operation */
80 0x75, 0x08, /* GReportSize 0x08 [8] */
81 0x95, 0x01, /* GReportCount 0x01 [1] */
82 0x81, 0x01, /* MInput 0x01 (Const[0] Arr[1] Abs[2]) */
84 /* Bytes from 2nd to 4th are a bitmap for joypad buttons, for these
85 * buttons multiple keypresses are allowed */
86 0x05, 0x09, /* GUsagePage Button */
87 0x19, 0x01, /* LUsageMinimum 0x01 [Button 1 (primary/trigger)] */
88 0x29, 0x18, /* LUsageMaximum 0x18 [Button 24] */
89 0x14, /* GLogicalMinimum [0] */
90 0x25, 0x01, /* GLogicalMaximum 0x01 [1] */
91 0x75, 0x01, /* GReportSize 0x01 [1] */
92 0x95, 0x18, /* GReportCount 0x18 [24] */
93 0x81, 0x02, /* MInput 0x02 (Data[0] Var[1] Abs[2]) */
95 0xC0, /* MEndCollection */
97 /* Use collection 2 for remote control buttons */
98 0xA1, 0x02, /* MCollection Logical (interrelated data) */
100 /* 5th byte is used for remote control buttons */
101 0x05, 0x09, /* GUsagePage Button */
102 0x18, /* LUsageMinimum [No button pressed] */
103 0x29, 0xFE, /* LUsageMaximum 0xFE [Button 254] */
104 0x14, /* GLogicalMinimum [0] */
105 0x26, 0xFE, 0x00, /* GLogicalMaximum 0x00FE [254] */
106 0x75, 0x08, /* GReportSize 0x08 [8] */
107 0x95, 0x01, /* GReportCount 0x01 [1] */
110 /* Ignore bytes from 6th to 11th, 6th to 10th are always constant at
111 * 0xff and 11th is for press indication */
112 0x75, 0x08, /* GReportSize 0x08 [8] */
113 0x95, 0x06, /* GReportCount 0x06 [6] */
114 0x81, 0x01, /* MInput 0x01 (Const[0] Arr[1] Abs[2]) */
116 /* 12th byte is for battery strength */
117 0x05, 0x06, /* GUsagePage Generic Device Controls */
118 0x09, 0x20, /* LUsage 0x20 [Battery Strength] */
119 0x14, /* GLogicalMinimum [0] */
120 0x25, 0x05, /* GLogicalMaximum 0x05 [5] */
121 0x75, 0x08, /* GReportSize 0x08 [8] */
122 0x95, 0x01, /* GReportCount 0x01 [1] */
123 0x81, 0x02, /* MInput 0x02 (Data[0] Var[1] Abs[2]) */
125 0xC0, /* MEndCollection */
127 0xC0 /* MEndCollection [Game Pad] */
130 static const unsigned int ps3remote_keymap_joypad_buttons[] = {
132 [0x02] = BTN_THUMBL, /* L3 */
133 [0x03] = BTN_THUMBR, /* R3 */
139 [0x09] = BTN_TL2, /* L2 */
140 [0x0a] = BTN_TR2, /* R2 */
141 [0x0b] = BTN_TL, /* L1 */
142 [0x0c] = BTN_TR, /* R1 */
143 [0x0d] = KEY_OPTION, /* options/triangle */
144 [0x0e] = KEY_BACK, /* back/circle */
145 [0x0f] = BTN_0, /* cross */
146 [0x10] = KEY_SCREEN, /* view/square */
147 [0x11] = KEY_HOMEPAGE, /* PS button */
150 static const unsigned int ps3remote_keymap_remote_buttons[] = {
161 [0x0e] = KEY_ESC, /* return */
163 [0x16] = KEY_EJECTCD,
164 [0x1a] = KEY_MENU, /* top menu */
166 [0x30] = KEY_PREVIOUS,
169 [0x33] = KEY_REWIND, /* scan back */
170 [0x34] = KEY_FORWARD, /* scan forward */
173 [0x40] = KEY_CONTEXT_MENU, /* pop up/menu */
174 [0x60] = KEY_FRAMEBACK, /* slow/step back */
175 [0x61] = KEY_FRAMEFORWARD, /* slow/step forward */
176 [0x63] = KEY_SUBTITLE,
179 [0x70] = KEY_INFO, /* display */
186 static const unsigned int buzz_keymap[] = {
187 /* The controller has 4 remote buzzers, each with one LED and 5
190 * We use the mapping chosen by the controller, which is:
193 * -------------------
200 * So, for example, the orange button on the third buzzer is mapped to
201 * BTN_TRIGGER_HAPPY14
203 [ 1] = BTN_TRIGGER_HAPPY1,
204 [ 2] = BTN_TRIGGER_HAPPY2,
205 [ 3] = BTN_TRIGGER_HAPPY3,
206 [ 4] = BTN_TRIGGER_HAPPY4,
207 [ 5] = BTN_TRIGGER_HAPPY5,
208 [ 6] = BTN_TRIGGER_HAPPY6,
209 [ 7] = BTN_TRIGGER_HAPPY7,
210 [ 8] = BTN_TRIGGER_HAPPY8,
211 [ 9] = BTN_TRIGGER_HAPPY9,
212 [10] = BTN_TRIGGER_HAPPY10,
213 [11] = BTN_TRIGGER_HAPPY11,
214 [12] = BTN_TRIGGER_HAPPY12,
215 [13] = BTN_TRIGGER_HAPPY13,
216 [14] = BTN_TRIGGER_HAPPY14,
217 [15] = BTN_TRIGGER_HAPPY15,
218 [16] = BTN_TRIGGER_HAPPY16,
219 [17] = BTN_TRIGGER_HAPPY17,
220 [18] = BTN_TRIGGER_HAPPY18,
221 [19] = BTN_TRIGGER_HAPPY19,
222 [20] = BTN_TRIGGER_HAPPY20,
226 unsigned long quirks;
233 struct led_classdev *leds[4];
236 static __u8 *ps3remote_fixup(struct hid_device *hdev, __u8 *rdesc,
239 *rsize = sizeof(ps3remote_rdesc);
240 return ps3remote_rdesc;
243 static int ps3remote_mapping(struct hid_device *hdev, struct hid_input *hi,
244 struct hid_field *field, struct hid_usage *usage,
245 unsigned long **bit, int *max)
247 unsigned int key = usage->hid & HID_USAGE;
249 if ((usage->hid & HID_USAGE_PAGE) != HID_UP_BUTTON)
252 switch (usage->collection_index) {
254 if (key >= ARRAY_SIZE(ps3remote_keymap_joypad_buttons))
257 key = ps3remote_keymap_joypad_buttons[key];
262 if (key >= ARRAY_SIZE(ps3remote_keymap_remote_buttons))
265 key = ps3remote_keymap_remote_buttons[key];
273 hid_map_usage_clear(hi, usage, bit, max, EV_KEY, key);
278 /* Sony Vaio VGX has wrongly mouse pointer declared as constant */
279 static __u8 *sony_report_fixup(struct hid_device *hdev, __u8 *rdesc,
282 struct sony_sc *sc = hid_get_drvdata(hdev);
285 * Some Sony RF receivers wrongly declare the mouse pointer as a
286 * a constant non-data variable.
288 if ((sc->quirks & VAIO_RDESC_CONSTANT) && *rsize >= 56 &&
289 /* usage page: generic desktop controls */
290 /* rdesc[0] == 0x05 && rdesc[1] == 0x01 && */
292 rdesc[2] == 0x09 && rdesc[3] == 0x02 &&
293 /* input (usage page for x,y axes): constant, variable, relative */
294 rdesc[54] == 0x81 && rdesc[55] == 0x07) {
295 hid_info(hdev, "Fixing up Sony RF Receiver report descriptor\n");
296 /* input: data, variable, relative */
300 /* The HID descriptor exposed over BT has a trailing zero byte */
301 if ((((sc->quirks & SIXAXIS_CONTROLLER_USB) && *rsize == 148) ||
302 ((sc->quirks & SIXAXIS_CONTROLLER_BT) && *rsize == 149)) &&
304 hid_info(hdev, "Fixing up Sony Sixaxis report descriptor\n");
305 memcpy((void *)&rdesc[83], (void *)&sixaxis_rdesc_fixup,
306 sizeof(sixaxis_rdesc_fixup));
307 } else if (sc->quirks & SIXAXIS_CONTROLLER_USB &&
308 *rsize > sizeof(sixaxis_rdesc_fixup2)) {
309 hid_info(hdev, "Sony Sixaxis clone detected. Using original report descriptor (size: %d clone; %d new)\n",
310 *rsize, (int)sizeof(sixaxis_rdesc_fixup2));
311 *rsize = sizeof(sixaxis_rdesc_fixup2);
312 memcpy(rdesc, &sixaxis_rdesc_fixup2, *rsize);
315 if (sc->quirks & PS3REMOTE)
316 return ps3remote_fixup(hdev, rdesc, rsize);
321 static int sony_raw_event(struct hid_device *hdev, struct hid_report *report,
324 struct sony_sc *sc = hid_get_drvdata(hdev);
326 /* Sixaxis HID report has acclerometers/gyro with MSByte first, this
327 * has to be BYTE_SWAPPED before passing up to joystick interface
329 if ((sc->quirks & (SIXAXIS_CONTROLLER_USB | SIXAXIS_CONTROLLER_BT)) &&
330 rd[0] == 0x01 && size == 49) {
331 swap(rd[41], rd[42]);
332 swap(rd[43], rd[44]);
333 swap(rd[45], rd[46]);
334 swap(rd[47], rd[48]);
340 static int sony_mapping(struct hid_device *hdev, struct hid_input *hi,
341 struct hid_field *field, struct hid_usage *usage,
342 unsigned long **bit, int *max)
344 struct sony_sc *sc = hid_get_drvdata(hdev);
346 if (sc->quirks & BUZZ_CONTROLLER) {
347 unsigned int key = usage->hid & HID_USAGE;
349 if ((usage->hid & HID_USAGE_PAGE) != HID_UP_BUTTON)
352 switch (usage->collection_index) {
354 if (key >= ARRAY_SIZE(buzz_keymap))
357 key = buzz_keymap[key];
365 hid_map_usage_clear(hi, usage, bit, max, EV_KEY, key);
369 if (sc->quirks & PS3REMOTE)
370 return ps3remote_mapping(hdev, hi, field, usage, bit, max);
372 /* Let hid-core decide for the others */
377 * The Sony Sixaxis does not handle HID Output Reports on the Interrupt EP
378 * like it should according to usbhid/hid-core.c::usbhid_output_raw_report()
379 * so we need to override that forcing HID Output Reports on the Control EP.
381 * There is also another issue about HID Output Reports via USB, the Sixaxis
382 * does not want the report_id as part of the data packet, so we have to
383 * discard buf[0] when sending the actual control message, even for numbered
386 static int sixaxis_usb_output_raw_report(struct hid_device *hid, __u8 *buf,
387 size_t count, unsigned char report_type)
389 struct usb_interface *intf = to_usb_interface(hid->dev.parent);
390 struct usb_device *dev = interface_to_usbdev(intf);
391 struct usb_host_interface *interface = intf->cur_altsetting;
392 int report_id = buf[0];
395 if (report_type == HID_OUTPUT_REPORT) {
396 /* Don't send the Report ID */
401 ret = usb_control_msg(dev, usb_sndctrlpipe(dev, 0),
403 USB_DIR_OUT | USB_TYPE_CLASS | USB_RECIP_INTERFACE,
404 ((report_type + 1) << 8) | report_id,
405 interface->desc.bInterfaceNumber, buf, count,
406 USB_CTRL_SET_TIMEOUT);
408 /* Count also the Report ID, in case of an Output report. */
409 if (ret > 0 && report_type == HID_OUTPUT_REPORT)
416 * Sending HID_REQ_GET_REPORT changes the operation mode of the ps3 controller
417 * to "operational". Without this, the ps3 controller will not report any
420 static int sixaxis_set_operational_usb(struct hid_device *hdev)
423 char *buf = kmalloc(18, GFP_KERNEL);
428 ret = hdev->hid_get_raw_report(hdev, 0xf2, buf, 17, HID_FEATURE_REPORT);
431 hid_err(hdev, "can't set operational mode\n");
438 static int sixaxis_set_operational_bt(struct hid_device *hdev)
440 unsigned char buf[] = { 0xf4, 0x42, 0x03, 0x00, 0x00 };
441 return hdev->hid_output_raw_report(hdev, buf, sizeof(buf), HID_FEATURE_REPORT);
444 static void buzz_set_leds(struct hid_device *hdev, int leds)
446 struct list_head *report_list =
447 &hdev->report_enum[HID_OUTPUT_REPORT].report_list;
448 struct hid_report *report = list_entry(report_list->next,
449 struct hid_report, list);
450 __s32 *value = report->field[0]->value;
453 value[1] = (leds & 1) ? 0xff : 0x00;
454 value[2] = (leds & 2) ? 0xff : 0x00;
455 value[3] = (leds & 4) ? 0xff : 0x00;
456 value[4] = (leds & 8) ? 0xff : 0x00;
459 hid_hw_request(hdev, report, HID_REQ_SET_REPORT);
462 static void buzz_led_set_brightness(struct led_classdev *led,
463 enum led_brightness value)
465 struct device *dev = led->dev->parent;
466 struct hid_device *hdev = container_of(dev, struct hid_device, dev);
467 struct sony_sc *drv_data;
468 struct buzz_extra *buzz;
472 drv_data = hid_get_drvdata(hdev);
473 if (!drv_data || !drv_data->extra) {
474 hid_err(hdev, "No device data\n");
477 buzz = drv_data->extra;
479 for (n = 0; n < 4; n++) {
480 if (led == buzz->leds[n]) {
481 int on = !! (buzz->led_state & (1 << n));
482 if (value == LED_OFF && on) {
483 buzz->led_state &= ~(1 << n);
484 buzz_set_leds(hdev, buzz->led_state);
485 } else if (value != LED_OFF && !on) {
486 buzz->led_state |= (1 << n);
487 buzz_set_leds(hdev, buzz->led_state);
494 static enum led_brightness buzz_led_get_brightness(struct led_classdev *led)
496 struct device *dev = led->dev->parent;
497 struct hid_device *hdev = container_of(dev, struct hid_device, dev);
498 struct sony_sc *drv_data;
499 struct buzz_extra *buzz;
504 drv_data = hid_get_drvdata(hdev);
505 if (!drv_data || !drv_data->extra) {
506 hid_err(hdev, "No device data\n");
509 buzz = drv_data->extra;
511 for (n = 0; n < 4; n++) {
512 if (led == buzz->leds[n]) {
513 on = !! (buzz->led_state & (1 << n));
518 return on ? LED_FULL : LED_OFF;
521 static int buzz_init(struct hid_device *hdev)
523 struct sony_sc *drv_data;
524 struct buzz_extra *buzz;
526 struct led_classdev *led;
530 drv_data = hid_get_drvdata(hdev);
531 BUG_ON(!(drv_data->quirks & BUZZ_CONTROLLER));
533 /* Validate expected report characteristics. */
534 if (!hid_validate_values(hdev, HID_OUTPUT_REPORT, 0, 0, 7))
537 buzz = kzalloc(sizeof(*buzz), GFP_KERNEL);
539 hid_err(hdev, "Insufficient memory, cannot allocate driver data\n");
542 drv_data->extra = buzz;
544 /* Clear LEDs as we have no way of reading their initial state. This is
545 * only relevant if the driver is loaded after somebody actively set the
547 buzz_set_leds(hdev, 0x00);
549 name_sz = strlen(dev_name(&hdev->dev)) + strlen("::buzz#") + 1;
551 for (n = 0; n < 4; n++) {
552 led = kzalloc(sizeof(struct led_classdev) + name_sz, GFP_KERNEL);
554 hid_err(hdev, "Couldn't allocate memory for LED %d\n", n);
558 name = (void *)(&led[1]);
559 snprintf(name, name_sz, "%s::buzz%d", dev_name(&hdev->dev), n + 1);
562 led->max_brightness = 1;
563 led->brightness_get = buzz_led_get_brightness;
564 led->brightness_set = buzz_led_set_brightness;
566 if (led_classdev_register(&hdev->dev, led)) {
567 hid_err(hdev, "Failed to register LED %d\n", n);
578 for (n = 0; n < 4; n++) {
580 buzz->leds[n] = NULL;
583 led_classdev_unregister(led);
587 kfree(drv_data->extra);
588 drv_data->extra = NULL;
592 static void buzz_remove(struct hid_device *hdev)
594 struct sony_sc *drv_data;
595 struct buzz_extra *buzz;
596 struct led_classdev *led;
599 drv_data = hid_get_drvdata(hdev);
600 BUG_ON(!(drv_data->quirks & BUZZ_CONTROLLER));
602 buzz = drv_data->extra;
604 for (n = 0; n < 4; n++) {
606 buzz->leds[n] = NULL;
609 led_classdev_unregister(led);
613 kfree(drv_data->extra);
614 drv_data->extra = NULL;
617 #ifdef CONFIG_SONY_FF
618 static int sony_play_effect(struct input_dev *dev, void *data,
619 struct ff_effect *effect)
621 unsigned char buf[] = {
623 0x00, 0xff, 0x00, 0xff, 0x00,
624 0x00, 0x00, 0x00, 0x00, 0x03,
625 0xff, 0x27, 0x10, 0x00, 0x32,
626 0xff, 0x27, 0x10, 0x00, 0x32,
627 0xff, 0x27, 0x10, 0x00, 0x32,
628 0xff, 0x27, 0x10, 0x00, 0x32,
629 0x00, 0x00, 0x00, 0x00, 0x00
633 struct hid_device *hid = input_get_drvdata(dev);
635 if (effect->type != FF_RUMBLE)
638 left = effect->u.rumble.strong_magnitude / 256;
639 right = effect->u.rumble.weak_magnitude ? 1 : 0;
644 return hid->hid_output_raw_report(hid, buf, sizeof(buf),
648 static int sony_init_ff(struct hid_device *hdev)
650 struct hid_input *hidinput = list_entry(hdev->inputs.next,
651 struct hid_input, list);
652 struct input_dev *input_dev = hidinput->input;
654 input_set_capability(input_dev, EV_FF, FF_RUMBLE);
655 return input_ff_create_memless(input_dev, NULL, sony_play_effect);
659 static int sony_init_ff(struct hid_device *hdev)
665 static int sony_probe(struct hid_device *hdev, const struct hid_device_id *id)
668 unsigned long quirks = id->driver_data;
670 unsigned int connect_mask = HID_CONNECT_DEFAULT;
672 sc = devm_kzalloc(&hdev->dev, sizeof(*sc), GFP_KERNEL);
674 hid_err(hdev, "can't alloc sony descriptor\n");
679 hid_set_drvdata(hdev, sc);
681 ret = hid_parse(hdev);
683 hid_err(hdev, "parse failed\n");
687 if (sc->quirks & VAIO_RDESC_CONSTANT)
688 connect_mask |= HID_CONNECT_HIDDEV_FORCE;
689 else if (sc->quirks & SIXAXIS_CONTROLLER_USB)
690 connect_mask |= HID_CONNECT_HIDDEV_FORCE;
691 else if (sc->quirks & SIXAXIS_CONTROLLER_BT)
692 connect_mask |= HID_CONNECT_HIDDEV_FORCE;
694 ret = hid_hw_start(hdev, connect_mask);
696 hid_err(hdev, "hw start failed\n");
700 if (sc->quirks & SIXAXIS_CONTROLLER_USB) {
701 hdev->hid_output_raw_report = sixaxis_usb_output_raw_report;
702 ret = sixaxis_set_operational_usb(hdev);
704 else if (sc->quirks & SIXAXIS_CONTROLLER_BT)
705 ret = sixaxis_set_operational_bt(hdev);
706 else if (sc->quirks & BUZZ_CONTROLLER)
707 ret = buzz_init(hdev);
714 ret = sony_init_ff(hdev);
724 static void sony_remove(struct hid_device *hdev)
726 struct sony_sc *sc = hid_get_drvdata(hdev);
728 if (sc->quirks & BUZZ_CONTROLLER)
734 static const struct hid_device_id sony_devices[] = {
735 { HID_USB_DEVICE(USB_VENDOR_ID_SONY, USB_DEVICE_ID_SONY_PS3_CONTROLLER),
736 .driver_data = SIXAXIS_CONTROLLER_USB },
737 { HID_USB_DEVICE(USB_VENDOR_ID_SONY, USB_DEVICE_ID_SONY_NAVIGATION_CONTROLLER),
738 .driver_data = SIXAXIS_CONTROLLER_USB },
739 { HID_BLUETOOTH_DEVICE(USB_VENDOR_ID_SONY, USB_DEVICE_ID_SONY_PS3_CONTROLLER),
740 .driver_data = SIXAXIS_CONTROLLER_BT },
741 { HID_USB_DEVICE(USB_VENDOR_ID_SONY, USB_DEVICE_ID_SONY_VAIO_VGX_MOUSE),
742 .driver_data = VAIO_RDESC_CONSTANT },
743 { HID_USB_DEVICE(USB_VENDOR_ID_SONY, USB_DEVICE_ID_SONY_VAIO_VGP_MOUSE),
744 .driver_data = VAIO_RDESC_CONSTANT },
745 /* Wired Buzz Controller. Reported as Sony Hub from its USB ID and as
746 * Logitech joystick from the device descriptor. */
747 { HID_USB_DEVICE(USB_VENDOR_ID_SONY, USB_DEVICE_ID_SONY_BUZZ_CONTROLLER),
748 .driver_data = BUZZ_CONTROLLER },
749 { HID_USB_DEVICE(USB_VENDOR_ID_SONY, USB_DEVICE_ID_SONY_WIRELESS_BUZZ_CONTROLLER),
750 .driver_data = BUZZ_CONTROLLER },
751 /* PS3 BD Remote Control */
752 { HID_BLUETOOTH_DEVICE(USB_VENDOR_ID_SONY, USB_DEVICE_ID_SONY_PS3_BDREMOTE),
753 .driver_data = PS3REMOTE },
754 /* Logitech Harmony Adapter for PS3 */
755 { HID_BLUETOOTH_DEVICE(USB_VENDOR_ID_LOGITECH, USB_DEVICE_ID_LOGITECH_HARMONY_PS3),
756 .driver_data = PS3REMOTE },
759 MODULE_DEVICE_TABLE(hid, sony_devices);
761 static struct hid_driver sony_driver = {
763 .id_table = sony_devices,
764 .input_mapping = sony_mapping,
766 .remove = sony_remove,
767 .report_fixup = sony_report_fixup,
768 .raw_event = sony_raw_event
770 module_hid_driver(sony_driver);
772 MODULE_LICENSE("GPL");