Commit 69481059 authored by Hongye Yuan's avatar Hongye Yuan Committed by Benjamin Tissoires
Browse files

HID: sony: Transform one-time SHANWAN check into quirk



Transform the one-time check for a SHANWAN PS3 clone gamepad into a
quirk, to avoid doing the same string comparison in multiple places.

Signed-off-by: default avatarHongye Yuan <outmatch@gmail.com>
Reviewed-by: default avatarBastien Nocera <hadess@hadess.net>
Signed-off-by: default avatarBenjamin Tissoires <benjamin.tissoires@redhat.com>
parent cf26057a
Loading
Loading
Loading
Loading
+13 −7
Original line number Diff line number Diff line
@@ -58,6 +58,7 @@
#define FUTUREMAX_DANCE_MAT       BIT(13)
#define NSG_MR5U_REMOTE_BT        BIT(14)
#define NSG_MR7U_REMOTE_BT        BIT(15)
#define SHANWAN_GAMEPAD           BIT(16)

#define SIXAXIS_CONTROLLER (SIXAXIS_CONTROLLER_USB | SIXAXIS_CONTROLLER_BT)
#define MOTION_CONTROLLER (MOTION_CONTROLLER_USB | MOTION_CONTROLLER_BT)
@@ -1490,6 +1491,7 @@ static int sony_register_sensors(struct sony_sc *sc)
 */
static int sixaxis_set_operational_usb(struct hid_device *hdev)
{
	struct sony_sc *sc = hid_get_drvdata(hdev);
	const int buf_size =
		max(SIXAXIS_REPORT_0xF2_SIZE, SIXAXIS_REPORT_0xF5_SIZE);
	u8 *buf;
@@ -1519,15 +1521,16 @@ static int sixaxis_set_operational_usb(struct hid_device *hdev)

	/*
	 * 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);
	if (ret < 0) {
		hid_info(hdev, "can't set operational mode: step 3, ignoring\n");
		ret = 0;
	}
	}

out:
	kfree(buf);
@@ -2811,6 +2814,9 @@ static int sony_probe(struct hid_device *hdev, const struct hid_device_id *id)
	if (!strcmp(hdev->name, "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);
	if (sc == NULL) {
		hid_err(hdev, "can't alloc sony descriptor\n");