From patchwork Wed Aug 2 11:11:41 2017 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: =?utf-8?b?5buW5bSH5qau?= X-Patchwork-Id: 9876621 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 44E0960360 for ; Wed, 2 Aug 2017 11:10:58 +0000 (UTC) Received: from mail.wl.linuxfoundation.org (localhost [127.0.0.1]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id 3AC8828761 for ; Wed, 2 Aug 2017 11:10:58 +0000 (UTC) Received: by mail.wl.linuxfoundation.org (Postfix, from userid 486) id 2FA8D28770; Wed, 2 Aug 2017 11:10:58 +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.9 required=2.0 tests=BAYES_00,RCVD_IN_DNSWL_HI autolearn=unavailable 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 6D5452877B for ; Wed, 2 Aug 2017 11:10:55 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1753072AbdHBLKt (ORCPT ); Wed, 2 Aug 2017 07:10:49 -0400 Received: from emcscan.emc.com.tw ([192.72.220.5]:53039 "EHLO emcscan.emc.com.tw" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1752972AbdHBLKt (ORCPT ); Wed, 2 Aug 2017 07:10:49 -0400 Received: from unknown (HELO webmail.emc.com.tw) ([192.168.10.1]) by emcscan.emc.com.tw with SMTP; 02 Aug 2017 19:11:50 +0800 Received: from 192.168.10.23 by webmail.emc.com.tw with MailAudit ESMTP Server V5.0(93024:0:AUTH_RELAY) (envelope-from ); Wed, 02 Aug 2017 19:13:18 +0800 (CST) Received: from 192.168.33.46 by webmail.emc.com.tw with Mail2000 ESMTPA Server V7.00(2489:1:AUTH_LOGIN) (envelope-from ); Wed, 02 Aug 2017 19:13:18 +0800 (CST) From: KT Liao To: linux-kernel@vger.kernel.org, linux-input@vger.kernel.org, dmitry.torokhov@gmail.com Cc: phoenix@emc.com.tw, kt.liao@emc.com.tw Subject: [PATCH] Input: elantech - support new touchpad IC and extend elan's touchapd command Origianl ic-body field is not sufficient for upcoming IC, Elan ps/2 driver extend the fomation to support future IC. Signed-off-by: KT Liao Date: Wed, 2 Aug 2017 19:11:41 +0800 Message-Id: <1501672301-3443-1-git-send-email-kt.liao@emc.com.tw> X-Mailer: git-send-email 2.7.4 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 --- drivers/input/mouse/elantech.c | 28 ++++++++++++++++++++++++---- drivers/input/mouse/elantech.h | 3 +++ 2 files changed, 27 insertions(+), 4 deletions(-) Signed-off-by: KT Liao diff --git a/drivers/input/mouse/elantech.c b/drivers/input/mouse/elantech.c index 65c9de3..14ab5ba 100644 --- a/drivers/input/mouse/elantech.c +++ b/drivers/input/mouse/elantech.c @@ -1398,6 +1398,10 @@ static bool elantech_is_signature_valid(const unsigned char *param) param[2] < 40) return true; + /* hw_version 0x0F does not need to check rate alose*/ + if ((param[0] & 0x0f) == 0x0f) + return true; + for (i = 0; i < ARRAY_SIZE(rates); i++) if (param[2] == rates[i]) return false; @@ -1576,7 +1580,7 @@ static const struct dmi_system_id no_hw_res_dmi_table[] = { /* * determine hardware version and set some properties according to it. */ -static int elantech_set_properties(struct elantech_data *etd) +static int elantech_set_properties(struct elantech_data *etd, struct psmouse *psmouse) { /* This represents the version of IC body. */ int ver = (etd->fw_version & 0x0f0000) >> 16; @@ -1593,14 +1597,14 @@ static int elantech_set_properties(struct elantech_data *etd) case 5: etd->hw_version = 3; break; - case 6 ... 14: + case 6 ... 15: etd->hw_version = 4; break; default: return -1; } } - + /* decide which send_cmd we're gonna use early */ etd->send_cmd = etd->hw_version >= 3 ? elantech_send_cmd : synaptics_send_cmd; @@ -1634,6 +1638,22 @@ static int elantech_set_properties(struct elantech_data *etd) /* Enable real hardware resolution on hw_version 3 ? */ etd->set_hw_resolution = !dmi_check_system(no_hw_res_dmi_table); + /*if ver == 15 and info_pattern == 0x01, it is ELAN new pattern + *which support a command for extend IC_body/FW_Version reading + */ + etd->info_pattern = etd->fw_version & 0xFF; + if (ver == 0x0F && etd->info_pattern == 0x01) { + if (etd->send_cmd(psmouse, ETP_ICBODY_QUERY, etd->icbody)) { + psmouse_err(psmouse, "failed to query icbody data\n"); + return -1; + } + psmouse_info(psmouse, + "Elan ICBODY query result %02x, %02x, %02x\n", + etd->icbody[0], etd->icbody[1], etd->icbody[2]); + etd->fw_version &= 0xFFFF00; + etd->fw_version |= etd->icbody[2]; + } + return 0; } @@ -1667,7 +1687,7 @@ int elantech_init(struct psmouse *psmouse) } etd->fw_version = (param[0] << 16) | (param[1] << 8) | param[2]; - if (elantech_set_properties(etd)) { + if (elantech_set_properties(etd, psmouse)) { psmouse_err(psmouse, "unknown hardware version, aborting...\n"); goto init_fail; } diff --git a/drivers/input/mouse/elantech.h b/drivers/input/mouse/elantech.h index e1cbf40..708ad85 100644 --- a/drivers/input/mouse/elantech.h +++ b/drivers/input/mouse/elantech.h @@ -21,6 +21,7 @@ #define ETP_CAPABILITIES_QUERY 0x02 #define ETP_SAMPLE_QUERY 0x03 #define ETP_RESOLUTION_QUERY 0x04 +#define ETP_ICBODY_QUERY 0x05 /* * Command values for register reading or writing @@ -130,6 +131,7 @@ struct elantech_data { unsigned char debug; unsigned char capabilities[3]; unsigned char samples[3]; + unsigned char icbody[3]; bool paritycheck; bool jumpy_cursor; bool reports_pressure; @@ -140,6 +142,7 @@ struct elantech_data { unsigned int single_finger_reports; unsigned int y_max; unsigned int width; + unsigned int info_pattern; struct finger_pos mt[ETP_MAX_FINGERS]; unsigned char parity[256]; int (*send_cmd)(struct psmouse *psmouse, unsigned char c, unsigned char *param);