|
@@ -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,8 +1661,27 @@ static void wacom_wac_pad_report(struct hid_device *hdev,
|
|
|
wacom_notify_battery(wacom_wac, capacity, charging,
|
|
|
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,
|
|
@@ -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)
|
|
|
- wacom_wac_pad_event(hdev, field, usage, value);
|
|
|
- else if (WACOM_PEN_FIELD(field) && wacom->wacom_wac.pen_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)
|
|
|
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)
|