]> Pileus Git - ~andy/linux/commitdiff
HID: uhid: forward output request to user-space
authorDavid Herrmann <dh.herrmann@googlemail.com>
Sun, 10 Jun 2012 13:16:23 +0000 (15:16 +0200)
committerJiri Kosina <jkosina@suse.cz>
Mon, 18 Jun 2012 11:42:02 +0000 (13:42 +0200)
If the hid-driver wants to send standardized data to the device it uses a
linux input_event. We forward this to the user-space transport-level
driver so they can perform the requested action on the device.

Signed-off-by: David Herrmann <dh.herrmann@googlemail.com>
Signed-off-by: Jiri Kosina <jkosina@suse.cz>
drivers/hid/uhid.c
include/linux/uhid.h

index 0226ba3f5307009384e6755e10d0ca83092e2090..4dd693e1c8b8a420bb0da7323672d4b27b000c21 100644 (file)
@@ -112,6 +112,24 @@ static void uhid_hid_close(struct hid_device *hid)
 static int uhid_hid_input(struct input_dev *input, unsigned int type,
                          unsigned int code, int value)
 {
+       struct hid_device *hid = input_get_drvdata(input);
+       struct uhid_device *uhid = hid->driver_data;
+       unsigned long flags;
+       struct uhid_event *ev;
+
+       ev = kzalloc(sizeof(*ev), GFP_ATOMIC);
+       if (!ev)
+               return -ENOMEM;
+
+       ev->type = UHID_OUTPUT_EV;
+       ev->u.output_ev.type = type;
+       ev->u.output_ev.code = code;
+       ev->u.output_ev.value = value;
+
+       spin_lock_irqsave(&uhid->qlock, flags);
+       uhid_queue(uhid, ev);
+       spin_unlock_irqrestore(&uhid->qlock, flags);
+
        return 0;
 }
 
index 351650b7a0f69622f53121f5626de2fe6ee2d019..3fa484921010398b4614c8d53454b84342f0ace0 100644 (file)
@@ -29,6 +29,7 @@ enum uhid_event_type {
        UHID_STOP,
        UHID_OPEN,
        UHID_CLOSE,
+       UHID_OUTPUT_EV,
        UHID_INPUT,
 };
 
@@ -53,12 +54,19 @@ struct uhid_input_req {
        __u16 size;
 } __attribute__((__packed__));
 
+struct uhid_output_ev_req {
+       __u16 type;
+       __u16 code;
+       __s32 value;
+} __attribute__((__packed__));
+
 struct uhid_event {
        __u32 type;
 
        union {
                struct uhid_create_req create;
                struct uhid_input_req input;
+               struct uhid_output_ev_req output_ev;
        } u;
 } __attribute__((__packed__));