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

Commit 06c7c313 authored by Przemo Firszt's avatar Przemo Firszt Committed by Jiri Kosina
Browse files

HID: separate mode switching function for wacom bluetooth driver



wacom_poke function allows to switch tablet reporting speed. The patch
dosen't add any new functionality, but it's preparation for user-space
speed switching through sysfs.

Signed-off-by: default avatarPrzemo Firszt <przemo@firszt.eu>
Signed-off-by: default avatarBastien Nocera <hadess@hadess.net>
Signed-off-by: default avatarJiri Kosina <jkosina@suse.cz>
parent 59d2334a
Loading
Loading
Loading
Loading
+40 −26
Original line number Diff line number Diff line
@@ -103,6 +103,44 @@ static int wacom_ac_get_property(struct power_supply *psy,
}
#endif

static void wacom_poke(struct hid_device *hdev, u8 speed)
{
	int limit, ret;
	char rep_data[2];

	rep_data[0] = 0x03 ; rep_data[1] = 0x00;
	limit = 3;
	do {
		ret = hdev->hid_output_raw_report(hdev, rep_data, 2,
				HID_FEATURE_REPORT);
	} while (ret < 0 && limit-- > 0);

	if (ret >= 0) {
		if (speed == 0)
			rep_data[0] = 0x05;
		else
			rep_data[0] = 0x06;

		rep_data[1] = 0x00;
		limit = 3;
		do {
			ret = hdev->hid_output_raw_report(hdev, rep_data, 2,
					HID_FEATURE_REPORT);
		} while (ret < 0 && limit-- > 0);

		if (ret >= 0)
			return;
	}

	/*
	 * Note that if the raw queries fail, it's not a hard failure and it
	 * is safe to continue
	 */
	dev_warn(&hdev->dev, "failed to poke device, command %d, err %d\n",
				rep_data[0], ret);
	return;
}

static int wacom_raw_event(struct hid_device *hdev, struct hid_report *report,
		u8 *raw_data, int size)
{
@@ -236,9 +274,7 @@ static int wacom_probe(struct hid_device *hdev,
	struct hid_input *hidinput;
	struct input_dev *input;
	struct wacom_data *wdata;
	char rep_data[2];
	int ret;
	int limit;

	wdata = kzalloc(sizeof(*wdata), GFP_KERNEL);
	if (wdata == NULL) {
@@ -261,30 +297,8 @@ static int wacom_probe(struct hid_device *hdev,
		goto err_free;
	}

	/*
	 * Note that if the raw queries fail, it's not a hard failure and it
	 * is safe to continue
	 */

	/* Set Wacom mode2 */
	rep_data[0] = 0x03; rep_data[1] = 0x00;
	limit = 3;
	do {
		ret = hdev->hid_output_raw_report(hdev, rep_data, 2,
				HID_FEATURE_REPORT);
	} while (ret < 0 && limit-- > 0);
	if (ret < 0)
		dev_warn(&hdev->dev, "failed to poke device #1, %d\n", ret);

	/* 0x06 - high reporting speed, 0x05 - low speed */
	rep_data[0] = 0x06; rep_data[1] = 0x00;
	limit = 3;
	do {
		ret = hdev->hid_output_raw_report(hdev, rep_data, 2,
				HID_FEATURE_REPORT);
	} while (ret < 0 && limit-- > 0);
	if (ret < 0)
		dev_warn(&hdev->dev, "failed to poke device #2, %d\n", ret);
	/* Set Wacom mode 2 with high reporting speed */
	wacom_poke(hdev, 1);

#ifdef CONFIG_HID_WACOM_POWER_SUPPLY
	wdata->battery.properties = wacom_battery_props;