Commit 97809a31 authored by Jiri Kosina's avatar Jiri Kosina

Merge branch 'for-5.1/hid-sony' into for-linus

Fixes for Shanwan PS3 support from Hongye Yuan
parents 8311463d d03213f1
...@@ -58,6 +58,7 @@ ...@@ -58,6 +58,7 @@
#define FUTUREMAX_DANCE_MAT BIT(13) #define FUTUREMAX_DANCE_MAT BIT(13)
#define NSG_MR5U_REMOTE_BT BIT(14) #define NSG_MR5U_REMOTE_BT BIT(14)
#define NSG_MR7U_REMOTE_BT BIT(15) #define NSG_MR7U_REMOTE_BT BIT(15)
#define SHANWAN_GAMEPAD BIT(16)
#define SIXAXIS_CONTROLLER (SIXAXIS_CONTROLLER_USB | SIXAXIS_CONTROLLER_BT) #define SIXAXIS_CONTROLLER (SIXAXIS_CONTROLLER_USB | SIXAXIS_CONTROLLER_BT)
#define MOTION_CONTROLLER (MOTION_CONTROLLER_USB | MOTION_CONTROLLER_BT) #define MOTION_CONTROLLER (MOTION_CONTROLLER_USB | MOTION_CONTROLLER_BT)
...@@ -1490,6 +1491,7 @@ static int sony_register_sensors(struct sony_sc *sc) ...@@ -1490,6 +1491,7 @@ static int sony_register_sensors(struct sony_sc *sc)
*/ */
static int sixaxis_set_operational_usb(struct hid_device *hdev) static int sixaxis_set_operational_usb(struct hid_device *hdev)
{ {
struct sony_sc *sc = hid_get_drvdata(hdev);
const int buf_size = const int buf_size =
max(SIXAXIS_REPORT_0xF2_SIZE, SIXAXIS_REPORT_0xF5_SIZE); max(SIXAXIS_REPORT_0xF2_SIZE, SIXAXIS_REPORT_0xF5_SIZE);
u8 *buf; u8 *buf;
...@@ -1519,15 +1521,16 @@ static int sixaxis_set_operational_usb(struct hid_device *hdev) ...@@ -1519,15 +1521,16 @@ static int sixaxis_set_operational_usb(struct hid_device *hdev)
/* /*
* But the USB interrupt would cause SHANWAN controllers to * But the USB interrupt would cause SHANWAN controllers to
* start rumbling non-stop. * start rumbling non-stop, so skip step 3 for these controllers.
*/ */
if (strcmp(hdev->name, "SHANWAN PS3 GamePad")) { if (sc->quirks & SHANWAN_GAMEPAD)
goto out;
ret = hid_hw_output_report(hdev, buf, 1); ret = hid_hw_output_report(hdev, buf, 1);
if (ret < 0) { if (ret < 0) {
hid_info(hdev, "can't set operational mode: step 3, ignoring\n"); hid_info(hdev, "can't set operational mode: step 3, ignoring\n");
ret = 0; ret = 0;
} }
}
out: out:
kfree(buf); kfree(buf);
...@@ -2097,6 +2100,11 @@ static void sixaxis_send_output_report(struct sony_sc *sc) ...@@ -2097,6 +2100,11 @@ static void sixaxis_send_output_report(struct sony_sc *sc)
} }
} }
/* SHANWAN controllers require output reports via intr channel */
if (sc->quirks & SHANWAN_GAMEPAD)
hid_hw_output_report(sc->hdev, (u8 *)report,
sizeof(struct sixaxis_output_report));
else
hid_hw_raw_request(sc->hdev, report->report_id, (u8 *)report, hid_hw_raw_request(sc->hdev, report->report_id, (u8 *)report,
sizeof(struct sixaxis_output_report), sizeof(struct sixaxis_output_report),
HID_OUTPUT_REPORT, HID_REQ_SET_REPORT); HID_OUTPUT_REPORT, HID_REQ_SET_REPORT);
...@@ -2811,6 +2819,9 @@ static int sony_probe(struct hid_device *hdev, const struct hid_device_id *id) ...@@ -2811,6 +2819,9 @@ static int sony_probe(struct hid_device *hdev, const struct hid_device_id *id)
if (!strcmp(hdev->name, "FutureMax Dance Mat")) if (!strcmp(hdev->name, "FutureMax Dance Mat"))
quirks |= FUTUREMAX_DANCE_MAT; quirks |= FUTUREMAX_DANCE_MAT;
if (!strcmp(hdev->name, "SHANWAN PS3 GamePad"))
quirks |= SHANWAN_GAMEPAD;
sc = devm_kzalloc(&hdev->dev, sizeof(*sc), GFP_KERNEL); sc = devm_kzalloc(&hdev->dev, sizeof(*sc), GFP_KERNEL);
if (sc == NULL) { if (sc == NULL) {
hid_err(hdev, "can't alloc sony descriptor\n"); hid_err(hdev, "can't alloc sony descriptor\n");
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment