Staging: hv: mousevsc: Cleanup and properly implement reportdesc_callback()
authorK. Y. Srinivasan <kys@microsoft.com>
Thu, 29 Sep 2011 18:54:48 +0000 (11:54 -0700)
committerGreg Kroah-Hartman <gregkh@suse.de>
Tue, 4 Oct 2011 17:39:33 +0000 (10:39 -0700)
Cleanup and properly implement reportdesc_callback(); properly allocate the
hid_device and properly initialize the hid device structure.

Signed-off-by: K. Y. Srinivasan <kys@microsoft.com>
Signed-off-by: Haiyang Zhang <haiyangz@microsoft.com>
Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
drivers/staging/hv/hv_mouse.c

index ea9e1f30c144f8f5368e08315d706ba934fafa23..8d94aef9010290bc42aacaaa380b27a431fb34ed 100644 (file)
@@ -646,56 +646,45 @@ static void mousevsc_hid_close(struct hid_device *hid)
 {
 }
 
+static struct hid_ll_driver mousevsc_ll_driver = {
+       .open = mousevsc_hid_open,
+       .close = mousevsc_hid_close,
+};
+
+static struct hid_driver mousevsc_hid_driver;
+
 static void reportdesc_callback(struct hv_device *dev, void *packet, u32 len)
 {
        struct hid_device *hid_dev;
        struct mousevsc_dev *input_device = hv_get_drvdata(dev);
 
-       /* hid_debug = -1; */
-       hid_dev = kmalloc(sizeof(struct hid_device), GFP_KERNEL);
+       hid_dev = hid_allocate_device();
+       if (IS_ERR(hid_dev))
+               return;
+
+       hid_dev->ll_driver = &mousevsc_ll_driver;
+       hid_dev->driver = &mousevsc_hid_driver;
 
        if (hid_parse_report(hid_dev, packet, len)) {
                DPRINT_INFO(INPUTVSC_DRV, "Unable to call hd_parse_report");
                return;
        }
 
-       if (hid_dev) {
-               DPRINT_INFO(INPUTVSC_DRV, "hid_device created");
-
-               hid_dev->ll_driver->open  = mousevsc_hid_open;
-               hid_dev->ll_driver->close = mousevsc_hid_close;
+       hid_dev->bus = BUS_VIRTUAL;
+       hid_dev->vendor = input_device->hid_dev_info.vendor;
+       hid_dev->product = input_device->hid_dev_info.product;
+       hid_dev->version = input_device->hid_dev_info.version;
 
-               hid_dev->bus = BUS_VIRTUAL;
-               hid_dev->vendor = input_device->hid_dev_info.vendor;
-               hid_dev->product = input_device->hid_dev_info.product;
-               hid_dev->version = input_device->hid_dev_info.version;
-               hid_dev->dev = dev->device;
+       sprintf(hid_dev->name, "%s", "Microsoft Vmbus HID-compliant Mouse");
 
-               sprintf(hid_dev->name, "%s",
-                       "Microsoft Vmbus HID-compliant Mouse");
+       if (!hidinput_connect(hid_dev, 0)) {
+               hid_dev->claimed |= HID_CLAIMED_INPUT;
 
-               /*
-                * HJ Do we want to call it with a 0
-                */
-               if (!hidinput_connect(hid_dev, 0)) {
-                       hid_dev->claimed |= HID_CLAIMED_INPUT;
-
-                       input_device->connected = 1;
-
-                       DPRINT_INFO(INPUTVSC_DRV,
-                                    "HID device claimed by input\n");
-               }
-
-               if (!hid_dev->claimed) {
-                       DPRINT_ERR(INPUTVSC_DRV,
-                                   "HID device not claimed by "
-                                   "input or hiddev\n");
-               }
+               input_device->connected = 1;
 
-               input_device->hid_device = hid_dev;
        }
 
-       kfree(hid_dev);
+       input_device->hid_device = hid_dev;
 }
 
 static int mousevsc_on_device_add(struct hv_device *device,
@@ -825,6 +814,7 @@ static int mousevsc_remove(struct hv_device *dev)
        if (input_dev->connected) {
                hidinput_disconnect(input_dev->hid_device);
                input_dev->connected = 0;
+               hid_destroy_device(input_dev->hid_device);
        }
 
        /*