diff options
author | Jiri Kosina <jkosina@suse.cz> | 2014-04-01 18:56:24 +0200 |
---|---|---|
committer | Jiri Kosina <jkosina@suse.cz> | 2014-04-01 18:56:24 +0200 |
commit | ee5f68e6c2f183e6aade0e9c57af13d5eff44f2f (patch) | |
tree | de4132918ec7b033c4981e2ba4aea9027816bdb9 /drivers/hid/uhid.c | |
parent | f74346a04b79c9a5e50a2ee5e923b94195975d17 (diff) | |
parent | 0a7f364e812285246cd617a51194a3f8bd0e8daa (diff) |
Merge branch 'for-3.15/ll-driver-new-callbacks' into for-linus
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 cedc6da93c1..f5a2b193114 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 |