return 0;
 }
 
+static void vim2m_device_release(struct video_device *vdev)
+{
+       struct vim2m_dev *dev = container_of(vdev, struct vim2m_dev, vfd);
+
+       v4l2_device_unregister(&dev->v4l2_dev);
+       v4l2_m2m_release(dev->m2m_dev);
+       kfree(dev);
+}
+
 static const struct v4l2_file_operations vim2m_fops = {
        .owner          = THIS_MODULE,
        .open           = vim2m_open,
        .fops           = &vim2m_fops,
        .ioctl_ops      = &vim2m_ioctl_ops,
        .minor          = -1,
-       .release        = video_device_release_empty,
+       .release        = vim2m_device_release,
        .device_caps    = V4L2_CAP_VIDEO_M2M | V4L2_CAP_STREAMING,
 };
 
        struct video_device *vfd;
        int ret;
 
-       dev = devm_kzalloc(&pdev->dev, sizeof(*dev), GFP_KERNEL);
+       dev = kzalloc(sizeof(*dev), GFP_KERNEL);
        if (!dev)
                return -ENOMEM;
 
        ret = v4l2_device_register(&pdev->dev, &dev->v4l2_dev);
        if (ret)
-               return ret;
+               goto error_free;
 
        atomic_set(&dev->num_inst, 0);
        mutex_init(&dev->dev_mutex);
        ret = video_register_device(vfd, VFL_TYPE_GRABBER, 0);
        if (ret) {
                v4l2_err(&dev->v4l2_dev, "Failed to register video device\n");
-               goto unreg_v4l2;
+               goto error_v4l2;
        }
 
        video_set_drvdata(vfd, dev);
        if (IS_ERR(dev->m2m_dev)) {
                v4l2_err(&dev->v4l2_dev, "Failed to init mem2mem device\n");
                ret = PTR_ERR(dev->m2m_dev);
-               goto unreg_dev;
+               goto error_dev;
        }
 
 #ifdef CONFIG_MEDIA_CONTROLLER
                                                 MEDIA_ENT_F_PROC_VIDEO_SCALER);
        if (ret) {
                v4l2_err(&dev->v4l2_dev, "Failed to init mem2mem media controller\n");
-               goto unreg_m2m;
+               goto error_m2m;
        }
 
        ret = media_device_register(&dev->mdev);
        if (ret) {
                v4l2_err(&dev->v4l2_dev, "Failed to register mem2mem media device\n");
-               goto unreg_m2m_mc;
+               goto error_m2m_mc;
        }
 #endif
        return 0;
 
 #ifdef CONFIG_MEDIA_CONTROLLER
-unreg_m2m_mc:
+error_m2m_mc:
        v4l2_m2m_unregister_media_controller(dev->m2m_dev);
-unreg_m2m:
+error_m2m:
        v4l2_m2m_release(dev->m2m_dev);
 #endif
-unreg_dev:
+error_dev:
        video_unregister_device(&dev->vfd);
-unreg_v4l2:
+error_v4l2:
        v4l2_device_unregister(&dev->v4l2_dev);
+error_free:
+       kfree(dev);
 
        return ret;
 }
        v4l2_m2m_unregister_media_controller(dev->m2m_dev);
        media_device_cleanup(&dev->mdev);
 #endif
-       v4l2_m2m_release(dev->m2m_dev);
        video_unregister_device(&dev->vfd);
-       v4l2_device_unregister(&dev->v4l2_dev);
 
        return 0;
 }