From patchwork Mon Nov 3 08:33:09 2014 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Dudley Du X-Patchwork-Id: 5214861 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 14C8EC11AC for ; Mon, 3 Nov 2014 08:37:33 +0000 (UTC) Received: from mail.kernel.org (localhost [127.0.0.1]) by mail.kernel.org (Postfix) with ESMTP id 2867D20173 for ; Mon, 3 Nov 2014 08:37:32 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by mail.kernel.org (Postfix) with ESMTP id 26F932015E for ; Mon, 3 Nov 2014 08:37:31 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1750892AbaKCIhX (ORCPT ); Mon, 3 Nov 2014 03:37:23 -0500 Received: from mail-pd0-f173.google.com ([209.85.192.173]:58825 "EHLO mail-pd0-f173.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1751892AbaKCIhU (ORCPT ); Mon, 3 Nov 2014 03:37:20 -0500 Received: by mail-pd0-f173.google.com with SMTP id v10so11098690pde.4 for ; Mon, 03 Nov 2014 00:37:19 -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=oGnOsIgmdxw0l5U9tSBPEXJ3EqgODNlkpenRO9u8mRw=; b=jGgB7zhXMnUN8Ii84YnRzkpyb64cSlMcrwLcbXRx75xYcE++b5/oeWwZEuDvQLQ9Rd LXFIcQK1ozODqnS7HxSjX0NnmfXXrvmNixwYEeKsZ19SsqQNgyKy34dfoz25eatlzFCZ wm5qd700MTbkDXSlrr7AV2bMT9rOvXF3syE8nD9EJwGA4IJJPiPkmPTTtLd/yw5hogEc hvpei/IhzaRmnNhpreFE+GpTsUVyTRWHHGSlFAaTL4mbhBtbVcL2OAtHoUaMzBnNsnvq ABbhcp/YuJpYTbiayoh8ealxHSOAxCVI8Xlil40q5mgcPYNpyP+J8sVIXT7ujcRxh4JW MPYw== X-Received: by 10.69.15.225 with SMTP id fr1mr42103538pbd.43.1415003839847; Mon, 03 Nov 2014 00:37:19 -0800 (PST) Received: from localhost ([140.207.206.26]) by mx.google.com with ESMTPSA id np11sm16480109pdb.78.2014.11.03.00.37.16 for (version=TLSv1.2 cipher=RC4-SHA bits=128/128); Mon, 03 Nov 2014 00:37:18 -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 v9 17/18] input: cyapa: add read sensors raw data debugfs interface support Date: Mon, 3 Nov 2014 16:33:09 +0800 Message-Id: <1415003590-30485-18-git-send-email-dudl@cypress.com> X-Mailer: git-send-email 1.9.1 In-Reply-To: <1415003590-30485-1-git-send-email-dudl@cypress.com> References: <1415003590-30485-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=-7.4 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 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 | 89 +++++++++++++++++++++++++++++++++++++++++++++ drivers/input/mouse/cyapa.h | 4 ++ 2 files changed, 93 insertions(+) diff --git a/drivers/input/mouse/cyapa.c b/drivers/input/mouse/cyapa.c index bc1d75a..e200beb 100644 --- a/drivers/input/mouse/cyapa.c +++ b/drivers/input/mouse/cyapa.c @@ -577,6 +577,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 ret; + + if (!cyapa) + return -ENODEV; + + /* Start to be supported after Gen5 trackpad devices. */ + if (cyapa->gen < CYAPA_GEN5) + return -ENOTSUPP; + + ret = mutex_lock_interruptible(&cyapa->debugfs_mutex); + if (ret) + return ret; + + if (!get_device(&cyapa->client->dev)) { + ret = -ENODEV; + goto out; + } + + file->private_data = cyapa; +out: + mutex_unlock(&cyapa->debugfs_mutex); + return ret; +} + +static int cyapa_debugfs_raw_data_release(struct inode *inode, + struct file *file) +{ + struct cyapa *cyapa = file->private_data; + int ret; + + if (!cyapa) + return 0; + + ret = mutex_lock_interruptible(&cyapa->debugfs_mutex); + if (ret) + return ret; + 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 ret; + struct cyapa *cyapa = file->private_data; + + ret = mutex_lock_interruptible(&cyapa->state_sync_lock); + if (ret) + return ret; + + if (cyapa->ops->read_raw_data) + ret = cyapa->ops->read_raw_data(cyapa); + else + ret = -EPERM; + mutex_unlock(&cyapa->state_sync_lock); + if (ret) + return ret; + + 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; @@ -595,6 +680,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 288c7de..75b0c33 100644 --- a/drivers/input/mouse/cyapa.h +++ b/drivers/input/mouse/cyapa.h @@ -190,6 +190,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); @@ -298,6 +299,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;