diff options
-rw-r--r-- | drivers/hid/hid-sony.c | 20 |
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 | ||
64 | static 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 | ||
214 | static int __init sony_init(void) | 234 | static int __init sony_init(void) |