aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/hid
diff options
context:
space:
mode:
authorDavid Herrmann <dh.herrmann@googlemail.com>2012-06-10 15:16:19 +0200
committerPawit Pornkitprasan <p.pawit@gmail.com>2012-12-05 23:04:10 +0700
commit8b32afb36dd38aea4e7ce3cfda58d6ec9a45e3fc (patch)
treeec916770d30bcdc8dd34ab1cfe45b9914359f796 /drivers/hid
parentf4c5ebe1b081247b21a856eb011764763e231188 (diff)
downloadkernel_samsung_aries-8b32afb36dd38aea4e7ce3cfda58d6ec9a45e3fc.zip
kernel_samsung_aries-8b32afb36dd38aea4e7ce3cfda58d6ec9a45e3fc.tar.gz
kernel_samsung_aries-8b32afb36dd38aea4e7ce3cfda58d6ec9a45e3fc.tar.bz2
HID: uhid: allow feeding input data into uhid devices
This adds a new event type UHID_INPUT which allows user-space to feed raw HID reports into the HID subsystem. We copy the data into kernel memory and directly feed it into the HID core. There is no error handling of the events couldn't be parsed so user-space should consider all events successfull unless read() returns an error. Signed-off-by: David Herrmann <dh.herrmann@googlemail.com> Signed-off-by: Jiri Kosina <jkosina@suse.cz>
Diffstat (limited to 'drivers/hid')
-rw-r--r--drivers/hid/uhid.c14
1 files changed, 14 insertions, 0 deletions
diff --git a/drivers/hid/uhid.c b/drivers/hid/uhid.c
index 61ee7cc..3d1ebda 100644
--- a/drivers/hid/uhid.c
+++ b/drivers/hid/uhid.c
@@ -210,6 +210,17 @@ static int uhid_dev_destroy(struct uhid_device *uhid)
return 0;
}
+static int uhid_dev_input(struct uhid_device *uhid, struct uhid_event *ev)
+{
+ if (!uhid->running)
+ return -EINVAL;
+
+ hid_input_report(uhid->hid, HID_INPUT_REPORT, ev->u.input.data,
+ min_t(size_t, ev->u.input.size, UHID_DATA_MAX), 0);
+
+ return 0;
+}
+
static int uhid_char_open(struct inode *inode, struct file *file)
{
struct uhid_device *uhid;
@@ -321,6 +332,9 @@ static ssize_t uhid_char_write(struct file *file, const char __user *buffer,
case UHID_DESTROY:
ret = uhid_dev_destroy(uhid);
break;
+ case UHID_INPUT:
+ ret = uhid_dev_input(uhid, &uhid->input_buf);
+ break;
default:
ret = -EOPNOTSUPP;
}