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

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
...@@ -1591,18 +1591,13 @@ static void wacom_wac_pad_usage_mapping(struct hid_device *hdev, ...@@ -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 hid_usage *usage, __s32 value)
{ {
struct wacom *wacom = hid_get_drvdata(hdev); struct wacom *wacom = hid_get_drvdata(hdev);
struct wacom_wac *wacom_wac = &wacom->wacom_wac; struct wacom_wac *wacom_wac = &wacom->wacom_wac;
struct input_dev *input = wacom_wac->pad_input;
unsigned equivalent_usage = wacom_equivalent_usage(usage->hid); 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) { switch (equivalent_usage) {
case WACOM_HID_WD_BATTERY_LEVEL: case WACOM_HID_WD_BATTERY_LEVEL:
wacom_wac->hid_data.battery_capacity = value; 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 ...@@ -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.ps_connected = value;
wacom_wac->hid_data.bat_connected = 1; wacom_wac->hid_data.bat_connected = 1;
break; 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: case WACOM_HID_WD_TOUCHRINGSTATUS:
break; break;
default: default:
features->input_event_flag = true;
input_event(input, usage->type, usage->code, value); input_event(input, usage->type, usage->code, value);
break; break;
} }
...@@ -1633,21 +1645,12 @@ static void wacom_wac_pad_pre_report(struct hid_device *hdev, ...@@ -1633,21 +1645,12 @@ static void wacom_wac_pad_pre_report(struct hid_device *hdev,
wacom_wac->hid_data.inrange_state = 0; 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 hid_report *report)
{ {
struct wacom *wacom = hid_get_drvdata(hdev); struct wacom *wacom = hid_get_drvdata(hdev);
struct wacom_wac *wacom_wac = &wacom->wacom_wac; struct wacom_wac *wacom_wac = &wacom->wacom_wac;
struct wacom_features *features = &wacom_wac->features; 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) { if (features->quirks & WACOM_QUIRK_BATTERY) {
int capacity = wacom_wac->hid_data.battery_capacity; int capacity = wacom_wac->hid_data.battery_capacity;
...@@ -1658,8 +1661,27 @@ static void wacom_wac_pad_report(struct hid_device *hdev, ...@@ -1658,8 +1661,27 @@ static void wacom_wac_pad_report(struct hid_device *hdev,
wacom_notify_battery(wacom_wac, capacity, charging, wacom_notify_battery(wacom_wac, capacity, charging,
connected, powered); connected, powered);
} }
}
input_sync(input); 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, static void wacom_wac_pen_usage_mapping(struct hid_device *hdev,
...@@ -2118,9 +2140,11 @@ void wacom_wac_event(struct hid_device *hdev, struct hid_field *field, ...@@ -2118,9 +2140,11 @@ void wacom_wac_event(struct hid_device *hdev, struct hid_field *field,
if (wacom->wacom_wac.features.type != HID_GENERIC) if (wacom->wacom_wac.features.type != HID_GENERIC)
return; return;
if (WACOM_PAD_FIELD(field) && wacom->wacom_wac.pad_input) if (WACOM_PAD_FIELD(field)) {
wacom_wac_pad_event(hdev, field, usage, value); wacom_wac_pad_battery_event(hdev, field, usage, value);
else if (WACOM_PEN_FIELD(field) && wacom->wacom_wac.pen_input) 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)
wacom_wac_pen_event(hdev, field, usage, value); wacom_wac_pen_event(hdev, field, usage, value);
else if (WACOM_FINGER_FIELD(field) && wacom->wacom_wac.touch_input) else if (WACOM_FINGER_FIELD(field) && wacom->wacom_wac.touch_input)
wacom_wac_finger_event(hdev, field, usage, value); wacom_wac_finger_event(hdev, field, usage, value);
...@@ -2163,12 +2187,14 @@ void wacom_wac_report(struct hid_device *hdev, struct hid_report *report) ...@@ -2163,12 +2187,14 @@ void wacom_wac_report(struct hid_device *hdev, struct hid_report *report)
wacom_report_events(hdev, report); wacom_report_events(hdev, report);
if (WACOM_PAD_FIELD(field) && wacom->wacom_wac.pad_input) if (WACOM_PAD_FIELD(field)) {
return wacom_wac_pad_report(hdev, report); wacom_wac_pad_battery_report(hdev, report);
else if (WACOM_PEN_FIELD(field) && wacom->wacom_wac.pen_input) if (wacom->wacom_wac.pad_input)
return wacom_wac_pen_report(hdev, report); 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) 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) static int wacom_bpt_touch(struct wacom_wac *wacom)
......
...@@ -232,6 +232,7 @@ struct wacom_features { ...@@ -232,6 +232,7 @@ struct wacom_features {
int pktlen; int pktlen;
bool check_for_hid_type; bool check_for_hid_type;
int hid_type; int hid_type;
bool input_event_flag;
}; };
struct wacom_shared { struct wacom_shared {
......
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