From: Ping Cheng <pingli...@gmail.com>

post input_sync only when there are input events posted

Signed-off-by: Ping Cheng <ping.ch...@wacom.com>
Reviewed-By: Jason Gerecke <jason.gere...@wacom.com>
Signed-off-by: Jiri Kosina <jkos...@suse.cz>
[jason.gere...@wacom.com: Imported into input-wacom repository (c9cfb2a)]
Signed-off-by: Jason Gerecke <jason.gere...@wacom.com>
[jason.gere...@wacom.com: Backported from input-wacom repository (0ce8595)]
Signed-off-by: Jason Gerecke <jason.gere...@wacom.com>
---
 3.17/wacom_wac.c | 76 +++++++++++++++++++++++++++++++++++++-------------------
 3.17/wacom_wac.h |  1 +
 2 files changed, 52 insertions(+), 25 deletions(-)

diff --git a/3.17/wacom_wac.c b/3.17/wacom_wac.c
index 4e042b6..6b00374 100644
--- a/3.17/wacom_wac.c
+++ b/3.17/wacom_wac.c
@@ -1599,18 +1599,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;
@@ -1622,11 +1617,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;
        }
@@ -1641,21 +1653,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;
@@ -1666,8 +1669,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,
@@ -2126,9 +2148,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);
@@ -2171,12 +2195,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)
diff --git a/3.17/wacom_wac.h b/3.17/wacom_wac.h
index 968eb60..e366f0a 100644
--- a/3.17/wacom_wac.h
+++ b/3.17/wacom_wac.h
@@ -248,6 +248,7 @@ struct wacom_features {
        int pktlen;
        bool check_for_hid_type;
        int hid_type;
+       bool input_event_flag;
 };
 
 struct wacom_shared {
-- 
2.11.0


------------------------------------------------------------------------------
Check out the vibrant tech community on one of the world's most
engaging tech sites, SlashDot.org! http://sdm.link/slashdot
_______________________________________________
Linuxwacom-devel mailing list
Linuxwacom-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/linuxwacom-devel

Reply via email to