linux-input.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
From: Dudley Du <dudley.dulixin@gmail.com>
To: dmitry.torokhov@gmail.com, rydberg@euromail.se
Cc: Dudley Du <dudl@cypress.com>,
	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	[thread overview]
Message-ID: <1415003590-30485-18-git-send-email-dudl@cypress.com> (raw)
In-Reply-To: <1415003590-30485-1-git-send-email-dudl@cypress.com>

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 <dudl@cypress.com>
---
 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;
 
-- 
1.9.1


  parent reply	other threads:[~2014-11-03  8:37 UTC|newest]

Thread overview: 32+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2014-11-03  8:32 [PATCH v9 01/18] input: cyapa: instruction of cyapa patches Dudley Du
2014-11-03  8:32 ` [PATCH v9 01/18] input: cyapa: add device resource management infrastructure support Dudley Du
2014-11-09 21:25   ` Dmitry Torokhov
2014-11-10  2:48     ` Dudley Du
2014-11-10  3:30       ` Dmitry Torokhov
2014-11-03  8:32 ` [PATCH v9 02/18] input: cyapa: re-design driver to support multi-trackpad in one driver Dudley Du
2014-11-10  8:18   ` Dmitry Torokhov
2014-11-10 11:04     ` Dudley Du
2014-11-03  8:32 ` [PATCH v9 03/18] input: cyapa: add gen3 trackpad device basic functions support Dudley Du
2014-11-10  8:30   ` Dmitry Torokhov
2014-11-10 11:05     ` Dudley Du
2014-11-03  8:32 ` [PATCH v9 04/18] input: cyapa: add gen5 " Dudley Du
2014-11-03  8:32 ` [PATCH v9 05/18] input: cyapa: add power management interfaces supported for the device Dudley Du
2014-11-10  8:38   ` Dmitry Torokhov
2014-11-10 11:05     ` Dudley Du
2014-11-03  8:32 ` [PATCH v9 06/18] input: cyapa: add runtime " Dudley Du
2014-11-03  8:32 ` [PATCH v9 07/18] input: cyapa: add sysfs interfaces supported in the cyapa driver Dudley Du
2014-11-03  8:33 ` [PATCH v9 08/18] input: cyapa: add gen3 trackpad device firmware update function support Dudley Du
2014-11-03  8:33 ` [PATCH v9 09/18] input: cyapa: add gen3 trackpad device read baseline " Dudley Du
2014-11-03  8:33 ` [PATCH v9 10/18] input: cyapa: add gen3 trackpad device force re-calibrate " Dudley Du
2014-11-03  8:33 ` [PATCH v9 11/18] input: cyapa: add gen5 trackpad device firmware update " Dudley Du
2014-11-03  8:33 ` [PATCH v9 12/18] input: cyapa: add gen5 trackpad device read baseline " Dudley Du
2014-11-03  8:33 ` [PATCH v9 13/18] input: cyapa: add gen5 trackpad device force re-calibrate " Dudley Du
2014-11-03  8:33 ` [PATCH v9 14/18] input: cyapa: add read firmware image debugfs interface support Dudley Du
2014-11-03  8:33 ` [PATCH v9 15/18] input: cyapa: add gen3 trackpad device read firmware image function support Dudley Du
2014-11-10  8:39   ` Dmitry Torokhov
2014-11-10 11:05     ` Dudley Du
2014-12-04 17:46       ` Dmitry Torokhov
2014-12-05  1:43         ` Dudley Du
2014-11-03  8:33 ` [PATCH v9 16/18] input: cyapa: add gen5 " Dudley Du
2014-11-03  8:33 ` Dudley Du [this message]
2014-11-03  8:33 ` [PATCH v9 18/18] input: cyapa: add gen5 trackpad device read raw data " Dudley Du

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=1415003590-30485-18-git-send-email-dudl@cypress.com \
    --to=dudley.dulixin@gmail.com \
    --cc=bleung@google.com \
    --cc=dmitry.torokhov@gmail.com \
    --cc=dudl@cypress.com \
    --cc=linux-input@vger.kernel.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=rydberg@euromail.se \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).