From patchwork Fri Dec 9 06:06:15 2016 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Ping Cheng X-Patchwork-Id: 9467555 Return-Path: Received: from mail.wl.linuxfoundation.org (pdx-wl-mail.web.codeaurora.org [172.30.200.125]) by pdx-korg-patchwork.web.codeaurora.org (Postfix) with ESMTP id 36461602F0 for ; Fri, 9 Dec 2016 06:06:26 +0000 (UTC) Received: from mail.wl.linuxfoundation.org (localhost [127.0.0.1]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id 289DC2861A for ; Fri, 9 Dec 2016 06:06:26 +0000 (UTC) Received: by mail.wl.linuxfoundation.org (Postfix, from userid 486) id 1CA8A2861F; Fri, 9 Dec 2016 06:06:26 +0000 (UTC) X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on pdx-wl-mail.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-6.8 required=2.0 tests=BAYES_00, DKIM_ADSP_CUSTOM_MED, DKIM_SIGNED, FREEMAIL_FROM, RCVD_IN_DNSWL_HI, T_DKIM_INVALID autolearn=ham version=3.3.1 Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id AFA1E2861A for ; Fri, 9 Dec 2016 06:06:24 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1753079AbcLIGGY (ORCPT ); Fri, 9 Dec 2016 01:06:24 -0500 Received: from mail-pg0-f68.google.com ([74.125.83.68]:33703 "EHLO mail-pg0-f68.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1752070AbcLIGGX (ORCPT ); Fri, 9 Dec 2016 01:06:23 -0500 Received: by mail-pg0-f68.google.com with SMTP id 3so1206657pgd.0 for ; Thu, 08 Dec 2016 22:06:23 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=from:to:cc:subject:date:message-id; bh=lltpuvIkvdiIn18dhbht4XZAHqN+ci+wKHoSRQc6q4o=; b=lsOzRqclJR1JpnsXvzO1GpL/XxMMJo3JG/RshB5XIL6cACLYstH0BH/JbJ0kIGoNTX NvSFaWU19lNyOKo+nrq/TphE3uabaGpYge8MxLGjiIEIexYOAygLo/Eg9P8rrrJU6cCu 42/oXx2MWDZpgbol/Ixe8oDJjYqz16df5dwhk3jWG9v0CUAt72V5CZuL5tmEApyTfIK1 RX0KVFraH0uQGECdfPUy89461LDLjmm12bqWum5Y3ilNA8T/kGdrJI6WhTqS7BJ5/Q+7 FfJK0pzFh9xVANNcmLmv3az2jCK5LCnyaObkxl7uDvOuCj7MiVWw5SuGSFiGq5AuJ+Gs 499g== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20130820; h=x-gm-message-state:from:to:cc:subject:date:message-id; bh=lltpuvIkvdiIn18dhbht4XZAHqN+ci+wKHoSRQc6q4o=; b=H3axXIAYAKe/XqZNv74ueDRGiWJUa1pNXfZ2wfSGNuBmWGD5Fi7/pl+Y+4JnamoCKz +zz48WLuY6rJt9RX1ZqI0XFDG0W1oAVSMnh6WdUxVw40hNFWT9crv64MBEG2m//oabEX CTfxNaAFJv0tYkMbo1JvQgPuMx4mPel+S46h5scn2toBGkJNN5y2rS3MIth/B4ypBvpP Fn4wYPKmg7pw/HuqoMhatt32ZfjNu2ktD3R8NkSGO4ZG6OrL0fAdvYMMxNN4SFnVXsCJ wz2X7Po2gPSSbUYS8VOBLyMvyBzT0IhU5cJFnZfq53Bt5+6IM1MckvFaUaGyTA1conSV sasA== X-Gm-Message-State: AKaTC00BsfnsQ73hDmex0RV40eIMBvpsrbDNjDqJvhVI3/8GQwEoLADvg5MOBEqSQlecFw== X-Received: by 10.99.119.71 with SMTP id s68mr140235874pgc.11.1481263582672; Thu, 08 Dec 2016 22:06:22 -0800 (PST) Received: from localhost.net (c-24-21-228-48.hsd1.wa.comcast.net. [24.21.228.48]) by smtp.gmail.com with ESMTPSA id 2sm54421315pgy.27.2016.12.08.22.06.21 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Thu, 08 Dec 2016 22:06:22 -0800 (PST) From: Ping Cheng X-Google-Original-From: Ping Cheng To: linux-input@vger.kernel.org Cc: jikos@kernel.org, jason.gerecke@wacom.com, Ping Cheng , Ping Cheng Subject: [PATCH 4/4 v2] HID: wacom: generic: Don't sync input on empty input packets Date: Thu, 8 Dec 2016 22:06:15 -0800 Message-Id: <1481263575-7275-1-git-send-email-pingc@wacom.com> X-Mailer: git-send-email 1.8.3.1 Sender: linux-input-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-input@vger.kernel.org X-Virus-Scanned: ClamAV using ClamSMTP post input_sync only when there are input events posted Signed-off-by: Ping Cheng Reviewed-By: Jason Gerecke --- v2: Moved wacom_wac_pad_battery_event and wacom_wac_pad_battery_report outside of wacom_wac_pad_event and wacom_wac_pad_report as suggested by Jason to simplify the calling process. --- drivers/hid/wacom_wac.c | 76 +++++++++++++++++++++++++++++++++---------------- drivers/hid/wacom_wac.h | 1 + 2 files changed, 52 insertions(+), 25 deletions(-) diff --git a/drivers/hid/wacom_wac.c b/drivers/hid/wacom_wac.c index 7a748a7..b1a9a3c 100644 --- a/drivers/hid/wacom_wac.c +++ b/drivers/hid/wacom_wac.c @@ -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) diff --git a/drivers/hid/wacom_wac.h b/drivers/hid/wacom_wac.h index a54a301..fb0e50a 100644 --- a/drivers/hid/wacom_wac.h +++ b/drivers/hid/wacom_wac.h @@ -232,6 +232,7 @@ struct wacom_features { int pktlen; bool check_for_hid_type; int hid_type; + bool input_event_flag; }; struct wacom_shared {