Merge branch 'timers-cleanup-for-linus' of git://git.kernel.org/pub/scm/linux/kernel...
[pandora-kernel.git] / drivers / hid / hid-sony.c
index 5398507..5cd25bd 100644 (file)
@@ -61,6 +61,25 @@ static __u8 *sony_report_fixup(struct hid_device *hdev, __u8 *rdesc,
        return rdesc;
 }
 
+static int sony_raw_event(struct hid_device *hdev, struct hid_report *report,
+               __u8 *rd, int size)
+{
+       struct sony_sc *sc = hid_get_drvdata(hdev);
+
+       /* Sixaxis HID report has acclerometers/gyro with MSByte first, this
+        * has to be BYTE_SWAPPED before passing up to joystick interface
+        */
+       if ((sc->quirks & (SIXAXIS_CONTROLLER_USB | SIXAXIS_CONTROLLER_BT)) &&
+                       rd[0] == 0x01 && size == 49) {
+               swap(rd[41], rd[42]);
+               swap(rd[43], rd[44]);
+               swap(rd[45], rd[46]);
+               swap(rd[47], rd[48]);
+       }
+
+       return 0;
+}
+
 /*
  * The Sony Sixaxis does not handle HID Output Reports on the Interrupt EP
  * like it should according to usbhid/hid-core.c::usbhid_output_raw_report()
@@ -209,6 +228,7 @@ static struct hid_driver sony_driver = {
        .probe = sony_probe,
        .remove = sony_remove,
        .report_fixup = sony_report_fixup,
+       .raw_event = sony_raw_event
 };
 
 static int __init sony_init(void)