diff options
| -rw-r--r-- | drivers/hid/hid-sony.c | 31 |
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 | ||
| 59 | static const u8 sixaxis_rdesc_fixup[] = { | 59 | static __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 | |||
| 65 | static 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 | ||
| 775 | static __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 | |||
| 781 | static __u8 *ps3remote_fixup(struct hid_device *hdev, __u8 *rdesc, | 782 | static __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); |
