aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--drivers/hid/hid-sony.c31
1 files changed, 10 insertions, 21 deletions
diff --git a/drivers/hid/hid-sony.c b/drivers/hid/hid-sony.c
index a77269b06880..11026b55669b 100644
--- a/drivers/hid/hid-sony.c
+++ b/drivers/hid/hid-sony.c
@@ -56,13 +56,7 @@
56 56
57#define MAX_LEDS 4 57#define MAX_LEDS 4
58 58
59static const u8 sixaxis_rdesc_fixup[] = { 59static __u8 sixaxis_rdesc[] = {
60 0x95, 0x13, 0x09, 0x01, 0x81, 0x02, 0x95, 0x0C,
61 0x81, 0x01, 0x75, 0x10, 0x95, 0x04, 0x26, 0xFF,
62 0x03, 0x46, 0xFF, 0x03, 0x09, 0x01, 0x81, 0x02
63};
64
65static const u8 sixaxis_rdesc_fixup2[] = {
66 0x05, 0x01, 0x09, 0x04, 0xa1, 0x01, 0xa1, 0x02, 60 0x05, 0x01, 0x09, 0x04, 0xa1, 0x01, 0xa1, 0x02,
67 0x85, 0x01, 0x75, 0x08, 0x95, 0x01, 0x15, 0x00, 61 0x85, 0x01, 0x75, 0x08, 0x95, 0x01, 0x15, 0x00,
68 0x26, 0xff, 0x00, 0x81, 0x03, 0x75, 0x01, 0x95, 62 0x26, 0xff, 0x00, 0x81, 0x03, 0x75, 0x01, 0x95,
@@ -778,6 +772,13 @@ struct sony_sc {
778 __u8 led_count; 772 __u8 led_count;
779}; 773};
780 774
775static __u8 *sixaxis_fixup(struct hid_device *hdev, __u8 *rdesc,
776 unsigned int *rsize)
777{
778 *rsize = sizeof(sixaxis_rdesc);
779 return sixaxis_rdesc;
780}
781
781static __u8 *ps3remote_fixup(struct hid_device *hdev, __u8 *rdesc, 782static __u8 *ps3remote_fixup(struct hid_device *hdev, __u8 *rdesc,
782 unsigned int *rsize) 783 unsigned int *rsize)
783{ 784{
@@ -857,20 +858,8 @@ static __u8 *sony_report_fixup(struct hid_device *hdev, __u8 *rdesc,
857 *rsize = sizeof(dualshock4_bt_rdesc); 858 *rsize = sizeof(dualshock4_bt_rdesc);
858 } 859 }
859 860
860 /* The HID descriptor exposed over BT has a trailing zero byte */ 861 if (sc->quirks & SIXAXIS_CONTROLLER)
861 if ((((sc->quirks & SIXAXIS_CONTROLLER_USB) && *rsize == 148) || 862 return sixaxis_fixup(hdev, rdesc, rsize);
862 ((sc->quirks & SIXAXIS_CONTROLLER_BT) && *rsize == 149)) &&
863 rdesc[83] == 0x75) {
864 hid_info(hdev, "Fixing up Sony Sixaxis report descriptor\n");
865 memcpy((void *)&rdesc[83], (void *)&sixaxis_rdesc_fixup,
866 sizeof(sixaxis_rdesc_fixup));
867 } else if (sc->quirks & SIXAXIS_CONTROLLER_USB &&
868 *rsize > sizeof(sixaxis_rdesc_fixup2)) {
869 hid_info(hdev, "Sony Sixaxis clone detected. Using original report descriptor (size: %d clone; %d new)\n",
870 *rsize, (int)sizeof(sixaxis_rdesc_fixup2));
871 *rsize = sizeof(sixaxis_rdesc_fixup2);
872 memcpy(rdesc, &sixaxis_rdesc_fixup2, *rsize);
873 }
874 863
875 if (sc->quirks & PS3REMOTE) 864 if (sc->quirks & PS3REMOTE)
876 return ps3remote_fixup(hdev, rdesc, rsize); 865 return ps3remote_fixup(hdev, rdesc, rsize);