From patchwork Mon Mar 28 20:10:50 2016 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: "Gerecke, Jason" X-Patchwork-Id: 8680301 Return-Path: X-Original-To: patchwork-linux-input@patchwork.kernel.org Delivered-To: patchwork-parsemail@patchwork1.web.kernel.org Received: from mail.kernel.org (mail.kernel.org [198.145.29.136]) by patchwork1.web.kernel.org (Postfix) with ESMTP id 6B94A9F54E for ; Mon, 28 Mar 2016 20:11:04 +0000 (UTC) Received: from mail.kernel.org (localhost [127.0.0.1]) by mail.kernel.org (Postfix) with ESMTP id 57FBC20279 for ; Mon, 28 Mar 2016 20:11:03 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by mail.kernel.org (Postfix) with ESMTP id D8C712020F for ; Mon, 28 Mar 2016 20:11:01 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1752252AbcC1ULB (ORCPT ); Mon, 28 Mar 2016 16:11:01 -0400 Received: from mail-pf0-f169.google.com ([209.85.192.169]:36127 "EHLO mail-pf0-f169.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1751560AbcC1ULA (ORCPT ); Mon, 28 Mar 2016 16:11:00 -0400 Received: by mail-pf0-f169.google.com with SMTP id u190so145602742pfb.3 for ; Mon, 28 Mar 2016 13:11:00 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=from:to:cc:subject:date:message-id; bh=tKa5oqiffwxqQKw2RknSMu4giyqrVwtVg1vqOHEHsuU=; b=DX5RWEUsR2QVdteomQ4RCaxRnoM5QYntbDQLkVPqXFCDpUu2OXNaN72X2WdGg0mJNu 5bSQvIH32gsuZmV3avbP1d/DrraVH7ncfz+Xk+/WdZJ803A9lpJyLWrvyw6/ZX/QnTo4 F/dsdwQP2Fd4eRxAIrSvJYQyLGQTYNlzWN/ncYTARyII8ho5cja0CLHN36QDJ4PesZic 1k/V64q4qI3cRlx5ljDuyXTG/6HM2ibxf6IlNypfeHB+gg7rMMRmkXvPi3+zGsFEVhnL 6Hd5N/3Nazyk5T4f+uavpT3cgSq35Hjz6mmL1RyImADwlpqqz1feWbCbLv0Sdt/f6Cjb 6ckw== 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=tKa5oqiffwxqQKw2RknSMu4giyqrVwtVg1vqOHEHsuU=; b=JHchgoJSXvd8/oR3arxEOTwfFJXd9IyGWaU+YLkrVZI8uIHyMTcvL1w6MNJAPWZucA QdZwJF9Y8pwa+RnEs7w0tAzx/EDitdSAaWPOvXB+sAAMJGqNGEeVPhw/tiMqdvbBcues Dl2FtnWPe2aWED7jJkjewctzIEOz1Yxqe5CkyYS9irW+DF5YIiaNSygxg7CQansvRKRe xzm8wuVy/XHnzy1cqHaU88B8tExlol7O4lEaVBlcltjkDQEoLMIbupn6CM6ljt4Qjt8O SAg2fIo4WqDqvPXI04BabfcV/C9tYWBr7Ci3P67PK6iwPXa6KsWG7c0xGZ3cl6FJ/oe7 DiMA== X-Gm-Message-State: AD7BkJIzN7fEWP7eAVl6PWN316nU4iG2F7uUHj8oTCM9XBVCpblAvj1V5AL77GKoeeEDXg== X-Received: by 10.98.80.206 with SMTP id g75mr45797861pfj.127.1459195859479; Mon, 28 Mar 2016 13:10:59 -0700 (PDT) Received: from wacom-arch2.corp.onewacom.com ([67.51.163.2]) by smtp.gmail.com with ESMTPSA id 16sm37687434pfk.28.2016.03.28.13.10.58 (version=TLS1_2 cipher=ECDHE-RSA-AES128-SHA bits=128/128); Mon, 28 Mar 2016 13:10:58 -0700 (PDT) From: Jason Gerecke To: linux-input@vger.kernel.org Cc: Ping Cheng , Jiri Kosina , Benjamin Tissoires , Jason Gerecke , Jason Gerecke Subject: [PATCH] HID: wacom: Support switching from vendor-defined input format on G9 and G11 Date: Mon, 28 Mar 2016 13:10:50 -0700 Message-Id: <1459195850-11128-1-git-send-email-killertofu@gmail.com> X-Mailer: git-send-email 2.7.3 Sender: linux-input-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-input@vger.kernel.org X-Spam-Status: No, score=-7.8 required=5.0 tests=BAYES_00, DKIM_ADSP_CUSTOM_MED, DKIM_SIGNED, FREEMAIL_FROM, RCVD_IN_DNSWL_HI, RP_MATCHES_RCVD, T_DKIM_INVALID, UNPARSEABLE_RELAY autolearn=ham version=3.3.1 X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on mail.kernel.org X-Virus-Scanned: ClamAV using ClamSMTP A tablet PC booted into Windows may have its pen/touch hardware switched into "Wacom mode" similar to what we do with explicitly-supported hardware. Some devices appear to maintain this state across reboots, preventing their use with the generic HID driver. This patch adds support for the vendor- defined "input format" feature report of G9 and G11 chips and has the HID codepath always attempt to reset the device back to an appropriate format. Fixes: https://sourceforge.net/p/linuxwacom/bugs/307/ Fixes: https://sourceforge.net/p/linuxwacom/bugs/310/ Fixes: https://github.com/linuxwacom/input-wacom/issues/15 Signed-off-by: Jason Gerecke --- drivers/hid/wacom_sys.c | 55 +++++++++++++++++++++++++++++++++++++++++++++++-- drivers/hid/wacom_wac.h | 13 ++++++++++-- 2 files changed, 64 insertions(+), 4 deletions(-) diff --git a/drivers/hid/wacom_sys.c b/drivers/hid/wacom_sys.c index 68a5609..d7ef7b0 100644 --- a/drivers/hid/wacom_sys.c +++ b/drivers/hid/wacom_sys.c @@ -152,6 +152,32 @@ static void wacom_feature_mapping(struct hid_device *hdev, hid_data->inputmode = field->report->id; hid_data->inputmode_index = usage->usage_index; break; + + /* The vendor-defined application collections leave most usages + * as null (0x0000), making them much more difficult to match... + */ + case HID_UP_DIGITIZER: + if (field->application == WACOM_G9_DIGITIZER || + field->application == WACOM_G11_DIGITIZER) { + if (field->report->id == 0x0B) { + hid_data->inputformat = field->report->id; + hid_data->inputformat_index = 0; + hid_data->inputformat_value = 0; /* 0: HID; 1: Vendor-defined */ + } + } + break; + + case WACOM_G9_PAGE: + case WACOM_G11_PAGE: + if (field->application == WACOM_G9_TOUCHSCREEN || + field->application == WACOM_G11_TOUCHSCREEN) { + if (field->report->id == 0x03) { + hid_data->inputformat = field->report->id; + hid_data->inputformat_index = 0; + hid_data->inputformat_value = 0; /* 0: HID; 4: Vendor-defined */ + } + } + break; } } @@ -322,6 +348,25 @@ static int wacom_hid_set_device_mode(struct hid_device *hdev) return 0; } +static int wacom_hid_set_device_format(struct hid_device *hdev) +{ + struct wacom *wacom = hid_get_drvdata(hdev); + struct hid_data *hid_data = &wacom->wacom_wac.hid_data; + struct hid_report *r; + struct hid_report_enum *re; + + if (hid_data->inputformat < 0) + return 0; + + re = &(hdev->report_enum[HID_FEATURE_REPORT]); + r = re->report_id_hash[hid_data->inputformat]; + if (r) { + r->field[0]->value[hid_data->inputformat_index] = hid_data->inputformat_value; + hid_hw_request(hdev, r, HID_REQ_SET_REPORT); + } + return 0; +} + static int wacom_set_device_mode(struct hid_device *hdev, int report_id, int length, int mode) { @@ -414,8 +459,14 @@ static int wacom_query_tablet_data(struct hid_device *hdev, if (hdev->bus == BUS_BLUETOOTH) return wacom_bt_query_tablet_data(hdev, 1, features); - if (features->type == HID_GENERIC) - return wacom_hid_set_device_mode(hdev); + if (features->type == HID_GENERIC) { + int err; + err = wacom_hid_set_device_mode(hdev); + if (err) + return err; + err = wacom_hid_set_device_format(hdev); + return err; + } if (features->device_type & WACOM_DEVICETYPE_TOUCH) { if (features->type > TABLETPC) { diff --git a/drivers/hid/wacom_wac.h b/drivers/hid/wacom_wac.h index 25baa7f..37d5dec 100644 --- a/drivers/hid/wacom_wac.h +++ b/drivers/hid/wacom_wac.h @@ -84,6 +84,12 @@ #define WACOM_DEVICETYPE_WL_MONITOR 0x0008 #define WACOM_VENDORDEFINED_PEN 0xff0d0001 +#define WACOM_G9_PAGE 0xff090000 +#define WACOM_G9_DIGITIZER (WACOM_G9_PAGE | 0x02) +#define WACOM_G9_TOUCHSCREEN (WACOM_G9_PAGE | 0x11) +#define WACOM_G11_PAGE 0xff110000 +#define WACOM_G11_DIGITIZER (WACOM_G11_PAGE | 0x02) +#define WACOM_G11_TOUCHSCREEN (WACOM_G11_PAGE | 0x11) #define WACOM_PEN_FIELD(f) (((f)->logical == HID_DG_STYLUS) || \ ((f)->physical == HID_DG_STYLUS) || \ @@ -193,8 +199,11 @@ struct wacom_shared { }; struct hid_data { - __s16 inputmode; /* InputMode HID feature, -1 if non-existent */ - __s16 inputmode_index; /* InputMode HID feature index in the report */ + __s16 inputmode; /* InputMode HID feature, -1 if non-existent */ + __s16 inputmode_index; /* InputMode HID feature index in the report */ + __s16 inputformat; /* Vendor-defined "input format" feature, -1 if non-existent */ + __s16 inputformat_index; /* Vendor-defined "input format" feature index in the report */ + __u8 inputformat_value; /* Value expected by device to switch to HID mode */ bool inrange_state; bool invert_state; bool tipswitch;