}
 #endif /* CONFIG_I2C */
 
-       /* save our data pointer in this interface device */
-       usb_set_intfdata(interface, dev);
-
        /* let the user know what node this device is now attached to */
        v4l2_info(&dev->v4l2_dev, "device now attached to %s\n",
                  video_device_node_name(dev->video_dev));
 
 static void hdpvr_disconnect(struct usb_interface *interface)
 {
-       struct hdpvr_device *dev;
-
-       dev = usb_get_intfdata(interface);
-       usb_set_intfdata(interface, NULL);
+       struct hdpvr_device *dev = to_hdpvr_dev(usb_get_intfdata(interface));
 
+       v4l2_info(&dev->v4l2_dev, "device %s disconnected\n",
+                 video_device_node_name(dev->video_dev));
        /* prevent more I/O from starting and stop any ongoing */
        mutex_lock(&dev->io_mutex);
        dev->status = STATUS_DISCONNECTED;
-       v4l2_device_disconnect(&dev->v4l2_dev);
-       video_unregister_device(dev->video_dev);
        wake_up_interruptible(&dev->wait_data);
        wake_up_interruptible(&dev->wait_buffer);
        mutex_unlock(&dev->io_mutex);
+       v4l2_device_disconnect(&dev->v4l2_dev);
        msleep(100);
        flush_workqueue(dev->workqueue);
        mutex_lock(&dev->io_mutex);
        hdpvr_cancel_queue(dev);
-       destroy_workqueue(dev->workqueue);
        mutex_unlock(&dev->io_mutex);
-
-       /* deregister I2C adapter */
-#ifdef CONFIG_I2C
-       mutex_lock(&dev->i2c_mutex);
-       if (dev->i2c_adapter)
-               i2c_del_adapter(dev->i2c_adapter);
-       kfree(dev->i2c_adapter);
-       dev->i2c_adapter = NULL;
-       mutex_unlock(&dev->i2c_mutex);
-#endif /* CONFIG_I2C */
-
+       video_unregister_device(dev->video_dev);
        atomic_dec(&dev_nr);
-
-       v4l2_info(&dev->v4l2_dev, "device %s disconnected\n",
-                 video_device_node_name(dev->video_dev));
-
-       v4l2_device_unregister(&dev->v4l2_dev);
-       kfree(dev->usbc_buf);
-       kfree(dev);
 }
 
 
 
        struct hdpvr_device *dev = video_get_drvdata(vdev);
 
        hdpvr_delete(dev);
+       mutex_lock(&dev->io_mutex);
+       destroy_workqueue(dev->workqueue);
+       mutex_unlock(&dev->io_mutex);
+
+       v4l2_device_unregister(&dev->v4l2_dev);
+
+       /* deregister I2C adapter */
+#ifdef CONFIG_I2C
+       mutex_lock(&dev->i2c_mutex);
+       if (dev->i2c_adapter)
+               i2c_del_adapter(dev->i2c_adapter);
+       kfree(dev->i2c_adapter);
+       dev->i2c_adapter = NULL;
+       mutex_unlock(&dev->i2c_mutex);
+#endif /* CONFIG_I2C */
+
+       kfree(dev->usbc_buf);
+       kfree(dev);
 }
 
 static const struct video_device hdpvr_video_template = {