diff options
author | Frank Praznik <frank.praznik@oh.rr.com> | 2014-01-22 13:49:43 -0500 |
---|---|---|
committer | Jiri Kosina <jkosina@suse.cz> | 2014-01-29 14:23:42 +0100 |
commit | 596cfdd80ab8ad11c750511da2c8c9a33f188ba0 (patch) | |
tree | 7266007b518015bee998d610cec35087cfee9f4b /drivers/hid/uhid.c | |
parent | 975a683271e690e7e467b274f22efadf1e696b5e (diff) |
HID: Add the transport-driver function to the uhid driver
Add the uhid_output_report transport-driver function to the uhid driver.
Signed-off-by: Frank Praznik <frank.praznik@oh.rr.com>
Acked-by: David Herrmann <dh.herrmann@gmail.com>
Signed-off-by: Jiri Kosina <jkosina@suse.cz>
Diffstat (limited to 'drivers/hid/uhid.c')
-rw-r--r-- | drivers/hid/uhid.c | 27 |
1 files changed, 27 insertions, 0 deletions
diff --git a/drivers/hid/uhid.c b/drivers/hid/uhid.c index cedc6da93c19..f5a2b1931143 100644 --- a/drivers/hid/uhid.c +++ b/drivers/hid/uhid.c @@ -244,12 +244,39 @@ static int uhid_hid_output_raw(struct hid_device *hid, __u8 *buf, size_t count, return count; } +static int uhid_hid_output_report(struct hid_device *hid, __u8 *buf, + size_t count) +{ + struct uhid_device *uhid = hid->driver_data; + unsigned long flags; + struct uhid_event *ev; + + if (count < 1 || count > UHID_DATA_MAX) + return -EINVAL; + + ev = kzalloc(sizeof(*ev), GFP_KERNEL); + if (!ev) + return -ENOMEM; + + ev->type = UHID_OUTPUT; + ev->u.output.size = count; + ev->u.output.rtype = UHID_OUTPUT_REPORT; + memcpy(ev->u.output.data, buf, count); + + spin_lock_irqsave(&uhid->qlock, flags); + uhid_queue(uhid, ev); + spin_unlock_irqrestore(&uhid->qlock, flags); + + return count; +} + static struct hid_ll_driver uhid_hid_driver = { .start = uhid_hid_start, .stop = uhid_hid_stop, .open = uhid_hid_open, .close = uhid_hid_close, .parse = uhid_hid_parse, + .output_report = uhid_hid_output_report, }; #ifdef CONFIG_COMPAT |