From patchwork Fri Mar 10 06:41:47 2017 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Masaki Ota <012nexus@gmail.com> X-Patchwork-Id: 9615153 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 F2D0460414 for ; Fri, 10 Mar 2017 06:42:38 +0000 (UTC) Received: from mail.wl.linuxfoundation.org (localhost [127.0.0.1]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id E3433286DB for ; Fri, 10 Mar 2017 06:42:38 +0000 (UTC) Received: by mail.wl.linuxfoundation.org (Postfix, from userid 486) id D5503286D4; Fri, 10 Mar 2017 06:42:38 +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.0 required=2.0 tests=BAYES_00, DKIM_ADSP_CUSTOM_MED, DKIM_SIGNED,FREEMAIL_FROM,FROM_STARTS_WITH_NUMS,RCVD_IN_DNSWL_HI, T_DKIM_INVALID 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 34EB7286D4 for ; Fri, 10 Mar 2017 06:42:38 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1750926AbdCJGmS (ORCPT ); Fri, 10 Mar 2017 01:42:18 -0500 Received: from mail-pg0-f67.google.com ([74.125.83.67]:36287 "EHLO mail-pg0-f67.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1750806AbdCJGmQ (ORCPT ); Fri, 10 Mar 2017 01:42:16 -0500 Received: by mail-pg0-f67.google.com with SMTP id 25so9261582pgy.3; Thu, 09 Mar 2017 22:41:53 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:to:cc:subject:date:message-id; bh=x8Qa0jVkeF8/rVnGjTVNrypQqPRPZzTetyhtMIZZSNE=; b=GnkF0m39jJ4rTwHy/uRzvuPaZ0tfNhDYGFXT1cLTdf+gG2i7oXtx0hrqhOuML2vHH6 HmH4dZVaZI2bPvsrDr4BJP9oe4/VAxSMlLFgHw7/NJ8XcEJI5zXWFgDA9DdjN+NgNNM3 xlunbZNx8cjf4XHurjyC6GBRITlF/MhFHsakrItLgLA3/PpEcQMtVqjvE69h/qeHrkXW ep8KPlEAOqGa/a0Q9h4tO1Y3MRj1IxSWb1SPzyhV5m5xDrb8USHND3GJW096vKyyENi7 JKAfpEs39yb388MOuzZdhoQObzf4V5UZew4j6Kul7iG/axQCVaToE1DHv7oG+x9ihaIJ tCIw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id; bh=x8Qa0jVkeF8/rVnGjTVNrypQqPRPZzTetyhtMIZZSNE=; b=KaFTaYUm1OQofyZMT4Rslzu/tSgxqMrvSoEn50wyIwtRffz4IXzfvORahgOs+KWsMo N0k7NldJrsRH157fIVVK5r0AqU84uj4QakbXLUAkQ67RDfNwbJ/C4gAX1/Q0L/7+NKSJ v3J0MJCGfg19LFxZRX7z7ZFlwASND0iMr+vWFcDmeW6r51LJu8Ru+sJvqJT26c1WRT0N Rake99UdXzN58kR/HvHYsk7Y4T02GL0CySMdW85MU2Zc0IUcP4a0i7FrTz14qzOcLsqo lpjYnZ4gka1YgYJqd7AiYb+PvLOnXw5F/4mgsYyUs0ZYCe4YcdTvtJr0XAM0XhJeCQSt tibQ== X-Gm-Message-State: AMke39lI2z8xevHj9TrQ7TPO64GtScIWVhPxEoySoOT7BvmDzN+6zrcqXRZubshDpl5pJQ== X-Received: by 10.99.7.206 with SMTP id 197mr18360044pgh.95.1489128112643; Thu, 09 Mar 2017 22:41:52 -0800 (PST) Received: from localhost (p2239-ipad303aobadori.miyagi.ocn.ne.jp. [123.216.73.239]) by smtp.gmail.com with ESMTPSA id b14sm16152320pfh.114.2017.03.09.22.41.51 (version=TLS1_2 cipher=ECDHE-RSA-CHACHA20-POLY1305 bits=256/256); Thu, 09 Mar 2017 22:41:52 -0800 (PST) From: Masaki Ota <012nexus@gmail.com> X-Google-Original-From: Masaki Ota To: dmitry.torokhov@gmail.com, linux-kernel@paulsd.com, nick.m.fletcher@gmail.com Cc: joseph.salisbury@canonical.com, ben@smart-cactus.org, mhocko@suse.com, pali.rohar@gmail.com, rydberg@bitmath.org, linux-input@vger.kernel.org, linux-kernel@vger.kernel.org, masaki.ota@jp.alps.com Subject: [PATCH] Fix V8 device information issue Date: Fri, 10 Mar 2017 15:41:47 +0900 Message-Id: <20170310064147.10992-1-masaki.ota@jp.alps.com> X-Mailer: git-send-email 2.9.3 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 From: Masaki Ota -Fix the issue that V8(E7=73 03 28) devices are not assined correct device information from OTP. -Specified correct OTP bit for the V8 device setting of Button pad, DualPoint and Touchpad size. Signed-off-by: Masaki Ota --- drivers/input/mouse/alps.c | 74 ++++++++++++++++++++++++++++++++++++---------- drivers/input/mouse/alps.h | 6 ++++ 2 files changed, 64 insertions(+), 16 deletions(-) diff --git a/drivers/input/mouse/alps.c b/drivers/input/mouse/alps.c index e761955..462871c 100644 --- a/drivers/input/mouse/alps.c +++ b/drivers/input/mouse/alps.c @@ -2467,21 +2467,46 @@ static int alps_update_device_area_ss4_v2(unsigned char otp[][4], int num_y_electrode; int x_pitch, y_pitch, x_phys, y_phys; - num_x_electrode = SS4_NUMSENSOR_XOFFSET + (otp[1][0] & 0x0F); - num_y_electrode = SS4_NUMSENSOR_YOFFSET + ((otp[1][0] >> 4) & 0x0F); + if (priv->dev_id[2] == 0x28) { + num_x_electrode = + SS4PLUS_NUMSENSOR_XOFFSET + (otp[0][2] & 0x0F); + num_y_electrode = + SS4PLUS_NUMSENSOR_YOFFSET + ((otp[0][2] >> 4) & 0x0F); - priv->x_max = (num_x_electrode - 1) * SS4_COUNT_PER_ELECTRODE; - priv->y_max = (num_y_electrode - 1) * SS4_COUNT_PER_ELECTRODE; + priv->x_max = + (num_x_electrode - 1) * SS4PLUS_COUNT_PER_ELECTRODE; + priv->y_max = + (num_y_electrode - 1) * SS4PLUS_COUNT_PER_ELECTRODE; - x_pitch = ((otp[1][2] >> 2) & 0x07) + SS4_MIN_PITCH_MM; - y_pitch = ((otp[1][2] >> 5) & 0x07) + SS4_MIN_PITCH_MM; + x_pitch = (otp[0][1] & 0x0F) + SS4PLUS_MIN_PITCH_MM; + y_pitch = ((otp[0][1] >> 4) & 0x0F) + SS4PLUS_MIN_PITCH_MM; - x_phys = x_pitch * (num_x_electrode - 1); /* In 0.1 mm units */ - y_phys = y_pitch * (num_y_electrode - 1); /* In 0.1 mm units */ + x_phys = x_pitch * (num_x_electrode - 1); /* In 0.1 mm units */ + y_phys = y_pitch * (num_y_electrode - 1); /* In 0.1 mm units */ - priv->x_res = priv->x_max * 10 / x_phys; /* units / mm */ - priv->y_res = priv->y_max * 10 / y_phys; /* units / mm */ + priv->x_res = priv->x_max * 10 / x_phys; /* units / mm */ + priv->y_res = priv->y_max * 10 / y_phys; /* units / mm */ + + } else { + num_x_electrode = + SS4_NUMSENSOR_XOFFSET + (otp[1][0] & 0x0F); + num_y_electrode = + SS4_NUMSENSOR_YOFFSET + ((otp[1][0] >> 4) & 0x0F); + + priv->x_max = + (num_x_electrode - 1) * SS4_COUNT_PER_ELECTRODE; + priv->y_max = + (num_y_electrode - 1) * SS4_COUNT_PER_ELECTRODE; + + x_pitch = ((otp[1][2] >> 2) & 0x07) + SS4_MIN_PITCH_MM; + y_pitch = ((otp[1][2] >> 5) & 0x07) + SS4_MIN_PITCH_MM; + x_phys = x_pitch * (num_x_electrode - 1); /* In 0.1 mm units */ + y_phys = y_pitch * (num_y_electrode - 1); /* In 0.1 mm units */ + + priv->x_res = priv->x_max * 10 / x_phys; /* units / mm */ + priv->y_res = priv->y_max * 10 / y_phys; /* units / mm */ + } return 0; } @@ -2490,7 +2515,10 @@ static int alps_update_btn_info_ss4_v2(unsigned char otp[][4], { unsigned char is_btnless; - is_btnless = (otp[1][1] >> 3) & 0x01; + if (priv->dev_id[2] == 0x28) + is_btnless = (otp[1][0] >> 1) & 0x01; + else + is_btnless = (otp[1][1] >> 3) & 0x01; if (is_btnless) priv->flags |= ALPS_BUTTONPAD; @@ -2498,6 +2526,21 @@ static int alps_update_btn_info_ss4_v2(unsigned char otp[][4], return 0; } +static int alps_update_dual_info_ss4_v2(unsigned char otp[][4], + struct alps_data *priv) +{ + unsigned char is_dual = 0; + + if (priv->dev_id[2] == 0x28) + is_dual = (otp[0][0] >> 4) & 0x01; + + if (is_dual) + priv->flags |= ALPS_DUALPOINT | + ALPS_DUALPOINT_WITH_PRESSURE; + + return 0; +} + static int alps_set_defaults_ss4_v2(struct psmouse *psmouse, struct alps_data *priv) { @@ -2513,6 +2556,8 @@ static int alps_set_defaults_ss4_v2(struct psmouse *psmouse, alps_update_btn_info_ss4_v2(otp, priv); + alps_update_dual_info_ss4_v2(otp, priv); + return 0; } @@ -2758,10 +2803,6 @@ static int alps_set_protocol(struct psmouse *psmouse, if (alps_set_defaults_ss4_v2(psmouse, priv)) return -EIO; - if (priv->fw_ver[1] == 0x1) - priv->flags |= ALPS_DUALPOINT | - ALPS_DUALPOINT_WITH_PRESSURE; - break; } @@ -2850,7 +2891,8 @@ static int alps_identify(struct psmouse *psmouse, struct alps_data *priv) } if (priv) { - /* Save the Firmware version */ + /* Save Device ID and Firmware version */ + memcpy(priv->dev_id, e7, 3); memcpy(priv->fw_ver, ec, 3); error = alps_set_protocol(psmouse, priv, protocol); if (error) diff --git a/drivers/input/mouse/alps.h b/drivers/input/mouse/alps.h index dea3163..f085c96 100644 --- a/drivers/input/mouse/alps.h +++ b/drivers/input/mouse/alps.h @@ -55,6 +55,11 @@ enum SS4_PACKET_ID { #define SS4_MASK_NORMAL_BUTTONS 0x07 +#define SS4PLUS_COUNT_PER_ELECTRODE 128 +#define SS4PLUS_NUMSENSOR_XOFFSET 16 +#define SS4PLUS_NUMSENSOR_YOFFSET 5 +#define SS4PLUS_MIN_PITCH_MM 37 + #define SS4_IS_IDLE_V2(_b) (((_b[0]) == 0x18) && \ ((_b[1]) == 0x10) && \ ((_b[2]) == 0x00) && \ @@ -279,6 +284,7 @@ struct alps_data { int addr_command; u16 proto_version; u8 byte0, mask0; + u8 dev_id[3]; u8 fw_ver[3]; int flags; int x_max;