[PATCH 1/2] hid-ntrig: sysfs nodes for modes

From: Rafi Rubin
Date: Fri Mar 11 2011 - 02:39:12 EST


Signed-off-by: Rafi Rubin <rafi@xxxxxxxxxxxxxx>

---

If the code is there, might as well expose a friendly interface to the
user.
---
drivers/hid/hid-ntrig.c | 61 +++++++++++++++++++++++++++++++++++++++++++++++
1 files changed, 61 insertions(+), 0 deletions(-)

diff --git a/drivers/hid/hid-ntrig.c b/drivers/hid/hid-ntrig.c
index fa862c5..24ab6a5 100644
--- a/drivers/hid/hid-ntrig.c
+++ b/drivers/hid/hid-ntrig.c
@@ -24,6 +24,8 @@

#define NTRIG_DUPLICATE_USAGES 0x001

+static const char *ntrig_modes[4] = { "pen", "touch", "auto", "dual" };
+
static unsigned int min_width;
module_param(min_width, uint, 0644);
MODULE_PARM_DESC(min_width, "Minimum touch contact width to accept.");
@@ -430,6 +432,64 @@ static ssize_t set_deactivate_slack(struct device *dev,
static DEVICE_ATTR(deactivate_slack, S_IWUSR | S_IRUGO, show_deactivate_slack,
set_deactivate_slack);

+
+static ssize_t show_mode(struct device *dev,
+ struct device_attribute *attr,
+ char *buf)
+{
+ int mode = ntrig_get_mode(container_of(dev, struct hid_device, dev));
+ int i, ret;
+ char *s = buf;
+
+ if (mode < 0)
+ return mode;
+
+
+ for (i = 0; i < 4; i++)
+ s += sprintf(s, "%s%s%s ", (i == mode) ? "[" : "",
+ ntrig_modes[i], (i == mode) ? "]" : "");
+
+ if (mode >= 4)
+ s += sprintf(s, "[%d]\n", mode);
+ else
+ *(s - 1) = '\n';
+
+ ret = s - buf;
+
+ return ret;
+}
+
+static ssize_t store_mode(struct device *dev,
+ struct device_attribute *attr,
+ const char *buf, size_t count)
+{
+ int len;
+ int i;
+ int mode = -EINVAL;
+ char *p;
+
+ p = memchr(buf, '\n', count);
+ len = p ? p - buf : count;
+
+ if (len == 1 && buf[0] >= '0' && buf[0] <= '4') {
+ mode = buf[0] - '0';
+ } else
+ for (i = 0; i < 4; i++)
+ if (len == strlen(ntrig_modes[i]) &&
+ !strncmp(buf, ntrig_modes[i], len)) {
+ mode = i;
+ break;
+ }
+
+ if (mode < 0)
+ return mode;
+
+ ntrig_set_mode(container_of(dev, struct hid_device, dev), mode);
+
+ return count;
+}
+static DEVICE_ATTR(mode, S_IWUSR | S_IRUGO, show_mode, store_mode);
+
static struct attribute *sysfs_attrs[] = {
&dev_attr_sensor_physical_width.attr,
&dev_attr_sensor_physical_height.attr,
@@ -441,6 +501,7 @@ static struct attribute *sysfs_attrs[] = {
&dev_attr_activation_width.attr,
&dev_attr_activation_height.attr,
&dev_attr_deactivate_slack.attr,
+ &dev_attr_mode.attr,
NULL
};

--
1.7.2.3

--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/