From patchwork Fri Nov 14 06:03:23 2014 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Dudley Du X-Patchwork-Id: 5303671 Return-Path: X-Original-To: patchwork-linux-input@patchwork.kernel.org Delivered-To: patchwork-parsemail@patchwork2.web.kernel.org Received: from mail.kernel.org (mail.kernel.org [198.145.19.201]) by patchwork2.web.kernel.org (Postfix) with ESMTP id 8A5DAC11AC for ; Fri, 14 Nov 2014 06:08:12 +0000 (UTC) Received: from mail.kernel.org (localhost [127.0.0.1]) by mail.kernel.org (Postfix) with ESMTP id A22EC20149 for ; Fri, 14 Nov 2014 06:08:11 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by mail.kernel.org (Postfix) with ESMTP id BDF9C2013D for ; Fri, 14 Nov 2014 06:08:10 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1754258AbaKNGHb (ORCPT ); Fri, 14 Nov 2014 01:07:31 -0500 Received: from mail-pa0-f50.google.com ([209.85.220.50]:62047 "EHLO mail-pa0-f50.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1754128AbaKNGH1 (ORCPT ); Fri, 14 Nov 2014 01:07:27 -0500 Received: by mail-pa0-f50.google.com with SMTP id eu11so16991228pac.9 for ; Thu, 13 Nov 2014 22:07:27 -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:in-reply-to:references; bh=scY2HvEuiiGO9NSZR8yGRIE607O4/DO4tlNFO3m8HMw=; b=n+osfnAXn4W9y0s/FouMRUMY25y1pPGoc1IGFktam+63+YeZnkbKJuanRp1sfEDLsy x+ftsn0fRIqPeWHoLCBN6QPKselCnsDvEZEuWeO5i7ik7NV2TEI8YCB21TE8t9BKfD8K P4LgU74oLTMpYf/WZDF1Lx7qB4ts02dwb2oL7qiHxeo2Rlfv2/na/8YJgCGnRU7Lra+8 k22svGRgwX311id4k8RkBQFMPJkXnRE8BYuD8cgHfBfgtnuBaD7RxVjtEo5iD5OUWj7b bVN89Jk1eNHbD1rViRN0skZt0dh1OJ/LXx2XFit8KKgmQYfPhsG3qBspe4hCXZcGPRUb NlxQ== X-Received: by 10.66.141.167 with SMTP id rp7mr7905207pab.118.1415945247175; Thu, 13 Nov 2014 22:07:27 -0800 (PST) Received: from localhost ([140.207.206.26]) by mx.google.com with ESMTPSA id g13sm26563381pat.45.2014.11.13.22.07.21 for (version=TLSv1.2 cipher=RC4-SHA bits=128/128); Thu, 13 Nov 2014 22:07:26 -0800 (PST) From: Dudley Du X-Google-Original-From: Dudley Du To: dmitry.torokhov@gmail.com, rydberg@euromail.se Cc: Dudley Du , bleung@google.com, linux-input@vger.kernel.org, linux-kernel@vger.kernel.org Subject: [PATCH v10 17/18] input: cyapa: add read sensors raw data debugfs interface support Date: Fri, 14 Nov 2014 14:03:23 +0800 Message-Id: <1415945004-19868-18-git-send-email-dudl@cypress.com> X-Mailer: git-send-email 1.9.1 In-Reply-To: <1415945004-19868-1-git-send-email-dudl@cypress.com> References: <1415945004-19868-1-git-send-email-dudl@cypress.com> Sender: linux-input-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-input@vger.kernel.org X-Spam-Status: No, score=-6.8 required=5.0 tests=BAYES_00, DKIM_ADSP_CUSTOM_MED, DKIM_SIGNED, FREEMAIL_FROM, RCVD_IN_DNSWL_HI, T_DKIM_INVALID, T_RP_MATCHES_RCVD, UNPARSEABLE_RELAY autolearn=unavailable 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 Add read sensors' raw data from trackpad device interface supported in cyapa driver through debugfs raw_data interface. Through this interface, user can read difference count map of each sensors directly from trackpad device (some customers want). And it's useful to help users to find out the root cause when there is performance gap happened. TEST=test on Chromebooks. Signed-off-by: Dudley Du --- drivers/input/mouse/cyapa.c | 90 +++++++++++++++++++++++++++++++++++++++++++++ drivers/input/mouse/cyapa.h | 4 ++ 2 files changed, 94 insertions(+) diff --git a/drivers/input/mouse/cyapa.c b/drivers/input/mouse/cyapa.c index 5c07ac0..8523f40 100644 --- a/drivers/input/mouse/cyapa.c +++ b/drivers/input/mouse/cyapa.c @@ -34,6 +34,7 @@ #define CYAPA_ADAPTER_FUNC_BOTH 3 #define CYAPA_DEBUGFS_READ_FW "read_fw" +#define CYAPA_DEBUGFS_RAW_DATA "raw_data" #define CYAPA_FW_NAME "cyapa.bin" const char unique_str[] = "CYTRA"; @@ -580,6 +581,91 @@ static const struct file_operations cyapa_read_fw_fops = { .read = cyapa_debugfs_read_fw }; +static int cyapa_debugfs_raw_data_open(struct inode *inode, struct file *file) +{ + struct cyapa *cyapa = inode->i_private; + int error; + + if (!cyapa) + return -ENODEV; + + /* Start to be supported after Gen5 trackpad devices. */ + if (cyapa->gen < CYAPA_GEN5) + return -ENOTSUPP; + + error = mutex_lock_interruptible(&cyapa->debugfs_mutex); + if (error) + return error; + + if (!get_device(&cyapa->client->dev)) { + error = -ENODEV; + goto out; + } + + file->private_data = cyapa; +out: + mutex_unlock(&cyapa->debugfs_mutex); + return error; +} + +static int cyapa_debugfs_raw_data_release(struct inode *inode, + struct file *file) +{ + struct cyapa *cyapa = file->private_data; + int error; + + if (!cyapa) + return 0; + + error = mutex_lock_interruptible(&cyapa->debugfs_mutex); + if (error) + return error; + file->private_data = NULL; + put_device(&cyapa->client->dev); + mutex_unlock(&cyapa->debugfs_mutex); + + return 0; +} + +/* Always return the sensors' latest raw data from trackpad device. */ +static ssize_t cyapa_debugfs_read_raw_data(struct file *file, + char __user *buffer, + size_t count, loff_t *ppos) +{ + int error; + struct cyapa *cyapa = file->private_data; + + error = mutex_lock_interruptible(&cyapa->state_sync_lock); + if (error) + return error; + + if (cyapa->ops->read_raw_data) + error = cyapa->ops->read_raw_data(cyapa); + else + error = -EPERM; + mutex_unlock(&cyapa->state_sync_lock); + if (error) + return error; + + if (*ppos >= cyapa->tp_raw_data_size) + return 0; + + if (count + *ppos > cyapa->tp_raw_data_size) + count = cyapa->tp_raw_data_size - *ppos; + + if (copy_to_user(buffer, &cyapa->tp_raw_data[*ppos], count)) + return -EFAULT; + + *ppos += count; + return count; +} + +static const struct file_operations cyapa_read_raw_data_fops = { + .open = cyapa_debugfs_raw_data_open, + .release = cyapa_debugfs_raw_data_release, + .read = cyapa_debugfs_read_raw_data +}; + static int cyapa_debugfs_init(struct cyapa *cyapa) { struct device *dev = &cyapa->client->dev; @@ -598,6 +684,10 @@ static int cyapa_debugfs_init(struct cyapa *cyapa) debugfs_create_file(CYAPA_DEBUGFS_READ_FW, S_IRUSR, cyapa->dentry_dev, cyapa, &cyapa_read_fw_fops); + if (cyapa->gen >= CYAPA_GEN5) + debugfs_create_file(CYAPA_DEBUGFS_RAW_DATA, S_IRUSR, + cyapa->dentry_dev, cyapa, &cyapa_read_raw_data_fops); + return 0; } diff --git a/drivers/input/mouse/cyapa.h b/drivers/input/mouse/cyapa.h index 6a18be3..4f22b38 100644 --- a/drivers/input/mouse/cyapa.h +++ b/drivers/input/mouse/cyapa.h @@ -187,6 +187,7 @@ struct cyapa_dev_ops { struct device_attribute *, const char *, size_t); int (*read_fw)(struct cyapa *); + int (*read_raw_data)(struct cyapa *); int (*initialize)(struct cyapa *cyapa); @@ -307,6 +308,9 @@ struct cyapa { struct cyapa_tsg_bin_image_head fw_img_head; u8 *fw_image; size_t fw_image_size; + /* Buffer to store sensors' raw data */ + u8 *tp_raw_data; + size_t tp_raw_data_size; const struct cyapa_dev_ops *ops;