aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--drivers/hid/hid-sony.c20
1 files changed, 20 insertions, 0 deletions
diff --git a/drivers/hid/hid-sony.c b/drivers/hid/hid-sony.c
index 539850769b17..5cd25bd907f8 100644
--- a/drivers/hid/hid-sony.c
+++ b/drivers/hid/hid-sony.c
@@ -61,6 +61,25 @@ static __u8 *sony_report_fixup(struct hid_device *hdev, __u8 *rdesc,
61 return rdesc; 61 return rdesc;
62} 62}
63 63
64static int sony_raw_event(struct hid_device *hdev, struct hid_report *report,
65 __u8 *rd, int size)
66{
67 struct sony_sc *sc = hid_get_drvdata(hdev);
68
69 /* Sixaxis HID report has acclerometers/gyro with MSByte first, this
70 * has to be BYTE_SWAPPED before passing up to joystick interface
71 */
72 if ((sc->quirks & (SIXAXIS_CONTROLLER_USB | SIXAXIS_CONTROLLER_BT)) &&
73 rd[0] == 0x01 && size == 49) {
74 swap(rd[41], rd[42]);
75 swap(rd[43], rd[44]);
76 swap(rd[45], rd[46]);
77 swap(rd[47], rd[48]);
78 }
79
80 return 0;
81}
82
64/* 83/*
65 * The Sony Sixaxis does not handle HID Output Reports on the Interrupt EP 84 * The Sony Sixaxis does not handle HID Output Reports on the Interrupt EP
66 * like it should according to usbhid/hid-core.c::usbhid_output_raw_report() 85 * like it should according to usbhid/hid-core.c::usbhid_output_raw_report()
@@ -209,6 +228,7 @@ static struct hid_driver sony_driver = {
209 .probe = sony_probe, 228 .probe = sony_probe,
210 .remove = sony_remove, 229 .remove = sony_remove,
211 .report_fixup = sony_report_fixup, 230 .report_fixup = sony_report_fixup,
231 .raw_event = sony_raw_event
212}; 232};
213 233
214static int __init sony_init(void) 234static int __init sony_init(void)