HID: wiimote: Add wiimote event handler
authorDavid Herrmann <dh.herrmann@googlemail.com>
Tue, 5 Jul 2011 11:45:15 +0000 (13:45 +0200)
committerJiri Kosina <jkosina@suse.cz>
Mon, 11 Jul 2011 12:30:23 +0000 (14:30 +0200)
Create array of all event handlers and call each handler when we
receive the related event.

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

index bfc50493ec6b14cc894128b0142c57fa549982c9..c86ae92b51db7ad8d3dd3f138520833c8b585273 100644 (file)
@@ -130,10 +130,22 @@ static int wiimote_input_event(struct input_dev *dev, unsigned int type,
        return 0;
 }
 
+struct wiiproto_handler {
+       __u8 id;
+       size_t size;
+       void (*func)(struct wiimote_data *wdata, const __u8 *payload);
+};
+
+static struct wiiproto_handler handlers[] = {
+       { .id = 0 }
+};
+
 static int wiimote_hid_event(struct hid_device *hdev, struct hid_report *report,
                                                        u8 *raw_data, int size)
 {
        struct wiimote_data *wdata = hid_get_drvdata(hdev);
+       struct wiiproto_handler *h;
+       int i;
 
        if (!atomic_read(&wdata->ready))
                return -EBUSY;
@@ -143,6 +155,12 @@ static int wiimote_hid_event(struct hid_device *hdev, struct hid_report *report,
        if (size < 1)
                return -EINVAL;
 
+       for (i = 0; handlers[i].id; ++i) {
+               h = &handlers[i];
+               if (h->id == raw_data[0] && h->size < size)
+                       h->func(wdata, &raw_data[1]);
+       }
+
        return 0;
 }