Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 0da8ea65 authored by Frank Praznik's avatar Frank Praznik Committed by Jiri Kosina
Browse files

HID: sony: Use standard output reports instead of raw reports to send data to the Dualshock 4.



Use regular HID output reports instead of raw reports in the
dualshock4_state_worker function.  (Thanks Simon Mungewell)

Signed-off-by: default avatarFrank Praznik <frank.praznik@oh.rr.com>
Signed-off-by: default avatarJiri Kosina <jkosina@suse.cz>
parent 8ab1676b
Loading
Loading
Loading
Loading
+28 −17
Original line number Diff line number Diff line
@@ -664,28 +664,39 @@ static void sixaxis_state_worker(struct work_struct *work)
static void dualshock4_state_worker(struct work_struct *work)
{
	struct sony_sc *sc = container_of(work, struct sony_sc, state_worker);
	unsigned char buf[] = {
		0x05,
		0x03, 0x00, 0x00, 0x00, 0x00,
		0x00, 0x00, 0x00, 0x00, 0x00,
		0x00, 0x00, 0x00, 0x00, 0x00,
		0x00, 0x00, 0x00, 0x00, 0x00,
		0x00, 0x00, 0x00, 0x00, 0x00,
		0x00, 0x00, 0x00, 0x00, 0x00,
		0x00,
	};
	struct hid_device *hdev = sc->hdev;
	struct list_head *head, *list;
	struct hid_report *report;
	__s32 *value;

	list = &hdev->report_enum[HID_OUTPUT_REPORT].report_list;

	list_for_each(head, list) {
		report = list_entry(head, struct hid_report, list);

		/* Report 5 is used to send data to the controller via USB */
		if ((sc->quirks & DUALSHOCK4_CONTROLLER_USB) && report->id == 5)
			break;
	}

	if (head == list) {
		hid_err(hdev, "Dualshock 4 output report not found\n");
		return;
	}

	value = report->field[0]->value;
	value[0] = 0x03;

#ifdef CONFIG_SONY_FF
	buf[4] = sc->right;
	buf[5] = sc->left;
	value[3] = sc->right;
	value[4] = sc->left;
#endif

	buf[6] = sc->led_state[0];
	buf[7] = sc->led_state[1];
	buf[8] = sc->led_state[2];
	value[5] = sc->led_state[0];
	value[6] = sc->led_state[1];
	value[7] = sc->led_state[2];

	sc->hdev->hid_output_raw_report(sc->hdev, buf, sizeof(buf),
					HID_OUTPUT_REPORT);
	hid_hw_request(hdev, report, HID_REQ_SET_REPORT);
}

#ifdef CONFIG_SONY_FF