HID: wiimote: Add wiimote device structure
authorDavid Herrmann <dh.herrmann@googlemail.com>
Tue, 5 Jul 2011 11:45:10 +0000 (13:45 +0200)
committerJiri Kosina <jkosina@suse.cz>
Mon, 11 Jul 2011 12:30:22 +0000 (14:30 +0200)
Allocate wiimote device structure with all wiimote related data
when registering new wiimote devices.

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

index ed4fe18..ff7cf12 100644 (file)
 #define WIIMOTE_VERSION "0.1"
 #define WIIMOTE_NAME "Nintendo Wii Remote"
 
+struct wiimote_data {
+       struct hid_device *hdev;
+};
+
 static int wiimote_hid_event(struct hid_device *hdev, struct hid_report *report,
                                                        u8 *raw_data, int size)
 {
@@ -26,31 +30,64 @@ static int wiimote_hid_event(struct hid_device *hdev, struct hid_report *report,
        return 0;
 }
 
+static struct wiimote_data *wiimote_create(struct hid_device *hdev)
+{
+       struct wiimote_data *wdata;
+
+       wdata = kzalloc(sizeof(*wdata), GFP_KERNEL);
+       if (!wdata)
+               return NULL;
+
+       wdata->hdev = hdev;
+       hid_set_drvdata(hdev, wdata);
+
+       return wdata;
+}
+
+static void wiimote_destroy(struct wiimote_data *wdata)
+{
+       kfree(wdata);
+}
+
 static int wiimote_hid_probe(struct hid_device *hdev,
                                const struct hid_device_id *id)
 {
+       struct wiimote_data *wdata;
        int ret;
 
+       wdata = wiimote_create(hdev);
+       if (!wdata) {
+               hid_err(hdev, "Can't alloc device\n");
+               return -ENOMEM;
+       }
+
        ret = hid_parse(hdev);
        if (ret) {
                hid_err(hdev, "HID parse failed\n");
-               return ret;
+               goto err;
        }
 
        ret = hid_hw_start(hdev, HID_CONNECT_HIDRAW);
        if (ret) {
                hid_err(hdev, "HW start failed\n");
-               return ret;
+               goto err;
        }
 
        hid_info(hdev, "New device registered\n");
        return 0;
+
+err:
+       wiimote_destroy(wdata);
+       return ret;
 }
 
 static void wiimote_hid_remove(struct hid_device *hdev)
 {
+       struct wiimote_data *wdata = hid_get_drvdata(hdev);
+
        hid_info(hdev, "Device removed\n");
        hid_hw_stop(hdev);
+       wiimote_destroy(wdata);
 }
 
 static const struct hid_device_id wiimote_hid_devices[] = {