summaryrefslogtreecommitdiff
path: root/drivers/input/touchscreen/atmel_mxt_ts.c
diff options
context:
space:
mode:
authorNick Dyer <nick.dyer@itdev.co.uk>2011-08-23 16:34:31 +0100
committerDan Willemsen <dwillemsen@nvidia.com>2013-09-14 12:37:33 -0700
commit5bef2cf2737e580b6b5b478b8efe496a960c2c79 (patch)
treeb15771d242942b9398f6d8ac2ae7266e371a6234 /drivers/input/touchscreen/atmel_mxt_ts.c
parenta9666bb4527dd99a6bbf6d4f594c9ab91627a17a (diff)
Input: atmel_mxt_ts - Add facility via sysfs for pausing and resuming driver
There are user-space diagnostic utilities which can connect to the maxtouch chip via this driver. It is sometimes (but not always) useful to disable creation of input events, since it allows arbitrary touch inputs to be tested. Signed-off-by: Nick Dyer <nick.dyer@itdev.co.uk> Rebase-Id: R19e8a93d145b6c94dd0ae2c6b4d00b5a0622aa06
Diffstat (limited to 'drivers/input/touchscreen/atmel_mxt_ts.c')
-rw-r--r--drivers/input/touchscreen/atmel_mxt_ts.c36
1 files changed, 36 insertions, 0 deletions
diff --git a/drivers/input/touchscreen/atmel_mxt_ts.c b/drivers/input/touchscreen/atmel_mxt_ts.c
index c55f9519df0c..28388864f802 100644
--- a/drivers/input/touchscreen/atmel_mxt_ts.c
+++ b/drivers/input/touchscreen/atmel_mxt_ts.c
@@ -268,6 +268,7 @@ struct mxt_data {
unsigned int max_y;
struct bin_attribute mem_access_attr;
bool debug_enabled;
+ bool driver_paused;
};
static bool mxt_object_readable(unsigned int type)
@@ -594,6 +595,9 @@ static void mxt_input_touchevent(struct mxt_data *data,
int area;
int pressure;
+ if (data->driver_paused)
+ return;
+
/* Check the touch is present on the screen */
if (!(status & MXT_DETECT)) {
if (status & MXT_RELEASE) {
@@ -1108,6 +1112,35 @@ static ssize_t mxt_update_fw_store(struct device *dev,
return count;
}
+static ssize_t mxt_pause_show(struct device *dev,
+ struct device_attribute *attr, char *buf)
+{
+ struct mxt_data *data = dev_get_drvdata(dev);
+ ssize_t count;
+ char c;
+
+ c = data->driver_paused ? '1' : '0';
+ count = sprintf(buf, "%c\n", c);
+
+ return count;
+}
+
+static ssize_t mxt_pause_store(struct device *dev,
+ struct device_attribute *attr, const char *buf, size_t count)
+{
+ struct mxt_data *data = dev_get_drvdata(dev);
+ int i;
+
+ if (sscanf(buf, "%u", &i) == 1 && i < 2) {
+ data->driver_paused = (i == 1);
+ dev_dbg(dev, "%s\n", i ? "paused" : "unpaused");
+ return count;
+ } else {
+ dev_dbg(dev, "pause_driver write error\n");
+ return -EINVAL;
+ }
+}
+
static ssize_t mxt_debug_enable_show(struct device *dev,
struct device_attribute *attr, char *buf)
{
@@ -1192,11 +1225,14 @@ static DEVICE_ATTR(object, S_IRUGO, mxt_object_show, NULL);
static DEVICE_ATTR(update_fw, S_IWUSR, NULL, mxt_update_fw_store);
static DEVICE_ATTR(debug_enable, S_IWUSR | S_IRUSR, mxt_debug_enable_show,
mxt_debug_enable_store);
+static DEVICE_ATTR(pause_driver, S_IWUSR | S_IRUSR, mxt_pause_show,
+ mxt_pause_store);
static struct attribute *mxt_attrs[] = {
&dev_attr_object.attr,
&dev_attr_update_fw.attr,
&dev_attr_debug_enable.attr,
+ &dev_attr_pause_driver.attr,
NULL
};