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

Commit c9cfb2ac authored by Ping Cheng's avatar Ping Cheng Committed by Jiri Kosina
Browse files

HID: wacom: generic: Don't sync input on empty input packets



post input_sync only when there are input events posted

Signed-off-by: default avatarPing Cheng <ping.cheng@wacom.com>
Reviewed-By: default avatarJason Gerecke <jason.gerecke@wacom.com>
Signed-off-by: default avatarJiri Kosina <jkosina@suse.cz>
parent f3f24e7b
Loading
Loading
Loading
Loading
+51 −25
Original line number Diff line number Diff line
@@ -1591,18 +1591,13 @@ static void wacom_wac_pad_usage_mapping(struct hid_device *hdev,
	}
}

static void wacom_wac_pad_event(struct hid_device *hdev, struct hid_field *field,
static void wacom_wac_pad_battery_event(struct hid_device *hdev, struct hid_field *field,
		struct hid_usage *usage, __s32 value)
{
	struct wacom *wacom = hid_get_drvdata(hdev);
	struct wacom_wac *wacom_wac = &wacom->wacom_wac;
	struct input_dev *input = wacom_wac->pad_input;
	unsigned equivalent_usage = wacom_equivalent_usage(usage->hid);

	if (wacom_equivalent_usage(field->physical) == HID_DG_TABLETFUNCTIONKEY) {
		wacom_wac->hid_data.inrange_state |= value;
	}

	switch (equivalent_usage) {
	case WACOM_HID_WD_BATTERY_LEVEL:
		wacom_wac->hid_data.battery_capacity = value;
@@ -1614,11 +1609,28 @@ static void wacom_wac_pad_event(struct hid_device *hdev, struct hid_field *field
		wacom_wac->hid_data.ps_connected = value;
		wacom_wac->hid_data.bat_connected = 1;
		break;
	}
}

static void wacom_wac_pad_event(struct hid_device *hdev, struct hid_field *field,
		struct hid_usage *usage, __s32 value)
{
	struct wacom *wacom = hid_get_drvdata(hdev);
	struct wacom_wac *wacom_wac = &wacom->wacom_wac;
	struct input_dev *input = wacom_wac->pad_input;
	struct wacom_features *features = &wacom_wac->features;
	unsigned equivalent_usage = wacom_equivalent_usage(usage->hid);

	if (wacom_equivalent_usage(field->physical) == HID_DG_TABLETFUNCTIONKEY) {
		wacom_wac->hid_data.inrange_state |= value;
	}

	switch (equivalent_usage) {
	case WACOM_HID_WD_TOUCHRINGSTATUS:
		break;

	default:
		features->input_event_flag = true;
		input_event(input, usage->type, usage->code, value);
		break;
	}
@@ -1633,21 +1645,12 @@ static void wacom_wac_pad_pre_report(struct hid_device *hdev,
	wacom_wac->hid_data.inrange_state = 0;
}

static void wacom_wac_pad_report(struct hid_device *hdev,
static void wacom_wac_pad_battery_report(struct hid_device *hdev,
		struct hid_report *report)
{
	struct wacom *wacom = hid_get_drvdata(hdev);
	struct wacom_wac *wacom_wac = &wacom->wacom_wac;
	struct wacom_features *features = &wacom_wac->features;
	struct input_dev *input = wacom_wac->pad_input;
	bool active = wacom_wac->hid_data.inrange_state != 0;

	/*
	 * don't report prox for events like accelerometer
	 * or battery status
	 */
	if (wacom_equivalent_usage(report->field[0]->physical) == HID_DG_TABLETFUNCTIONKEY)
		input_event(input, EV_ABS, ABS_MISC, active ? PAD_DEVICE_ID : 0);

	if (features->quirks & WACOM_QUIRK_BATTERY) {
		int capacity = wacom_wac->hid_data.battery_capacity;
@@ -1658,9 +1661,28 @@ static void wacom_wac_pad_report(struct hid_device *hdev,
		wacom_notify_battery(wacom_wac, capacity, charging,
				     connected, powered);
	}
}

static void wacom_wac_pad_report(struct hid_device *hdev,
		struct hid_report *report)
{
	struct wacom *wacom = hid_get_drvdata(hdev);
	struct wacom_wac *wacom_wac = &wacom->wacom_wac;
	struct wacom_features *features = &wacom_wac->features;
	struct input_dev *input = wacom_wac->pad_input;
	bool active = wacom_wac->hid_data.inrange_state != 0;

	/* report prox for expresskey events */
	if (wacom_equivalent_usage(report->field[0]->physical) == HID_DG_TABLETFUNCTIONKEY) {
		features->input_event_flag = true;
		input_event(input, EV_ABS, ABS_MISC, active ? PAD_DEVICE_ID : 0);
	}

	if (features->input_event_flag) {
		features->input_event_flag = false;
		input_sync(input);
	}
}

static void wacom_wac_pen_usage_mapping(struct hid_device *hdev,
		struct hid_field *field, struct hid_usage *usage)
@@ -2118,9 +2140,11 @@ void wacom_wac_event(struct hid_device *hdev, struct hid_field *field,
	if (wacom->wacom_wac.features.type != HID_GENERIC)
		return;

	if (WACOM_PAD_FIELD(field) && wacom->wacom_wac.pad_input)
	if (WACOM_PAD_FIELD(field)) {
		wacom_wac_pad_battery_event(hdev, field, usage, value);
		if (wacom->wacom_wac.pad_input)
			wacom_wac_pad_event(hdev, field, usage, value);
	else if (WACOM_PEN_FIELD(field) && wacom->wacom_wac.pen_input)
	} else if (WACOM_PEN_FIELD(field) && wacom->wacom_wac.pen_input)
		wacom_wac_pen_event(hdev, field, usage, value);
	else if (WACOM_FINGER_FIELD(field) && wacom->wacom_wac.touch_input)
		wacom_wac_finger_event(hdev, field, usage, value);
@@ -2163,12 +2187,14 @@ void wacom_wac_report(struct hid_device *hdev, struct hid_report *report)

	wacom_report_events(hdev, report);

	if (WACOM_PAD_FIELD(field) && wacom->wacom_wac.pad_input)
		return wacom_wac_pad_report(hdev, report);
	else if (WACOM_PEN_FIELD(field) && wacom->wacom_wac.pen_input)
		return wacom_wac_pen_report(hdev, report);
	if (WACOM_PAD_FIELD(field)) {
		wacom_wac_pad_battery_report(hdev, report);
		if (wacom->wacom_wac.pad_input)
			wacom_wac_pad_report(hdev, report);
	} else if (WACOM_PEN_FIELD(field) && wacom->wacom_wac.pen_input)
		wacom_wac_pen_report(hdev, report);
	else if (WACOM_FINGER_FIELD(field) && wacom->wacom_wac.touch_input)
		return wacom_wac_finger_report(hdev, report);
		wacom_wac_finger_report(hdev, report);
}

static int wacom_bpt_touch(struct wacom_wac *wacom)
+1 −0
Original line number Diff line number Diff line
@@ -232,6 +232,7 @@ struct wacom_features {
	int pktlen;
	bool check_for_hid_type;
	int hid_type;
	bool input_event_flag;
};

struct wacom_shared {