|
@@ -140,6 +140,9 @@ static struct vim2m_fmt *find_format(struct v4l2_format *f)
|
|
|
struct vim2m_dev {
|
|
|
struct v4l2_device v4l2_dev;
|
|
|
struct video_device vfd;
|
|
|
+#ifdef CONFIG_MEDIA_CONTROLLER
|
|
|
+ struct media_device mdev;
|
|
|
+#endif
|
|
|
|
|
|
atomic_t num_inst;
|
|
|
struct mutex dev_mutex;
|
|
@@ -1016,7 +1019,7 @@ static int vim2m_probe(struct platform_device *pdev)
|
|
|
ret = video_register_device(vfd, VFL_TYPE_GRABBER, 0);
|
|
|
if (ret) {
|
|
|
v4l2_err(&dev->v4l2_dev, "Failed to register video device\n");
|
|
|
- goto unreg_dev;
|
|
|
+ goto unreg_v4l2;
|
|
|
}
|
|
|
|
|
|
video_set_drvdata(vfd, dev);
|
|
@@ -1030,15 +1033,39 @@ static int vim2m_probe(struct platform_device *pdev)
|
|
|
if (IS_ERR(dev->m2m_dev)) {
|
|
|
v4l2_err(&dev->v4l2_dev, "Failed to init mem2mem device\n");
|
|
|
ret = PTR_ERR(dev->m2m_dev);
|
|
|
- goto err_m2m;
|
|
|
+ goto unreg_dev;
|
|
|
+ }
|
|
|
+
|
|
|
+#ifdef CONFIG_MEDIA_CONTROLLER
|
|
|
+ dev->mdev.dev = &pdev->dev;
|
|
|
+ strlcpy(dev->mdev.model, "vim2m", sizeof(dev->mdev.model));
|
|
|
+ media_device_init(&dev->mdev);
|
|
|
+ dev->v4l2_dev.mdev = &dev->mdev;
|
|
|
+
|
|
|
+ ret = v4l2_m2m_register_media_controller(dev->m2m_dev,
|
|
|
+ vfd, MEDIA_ENT_F_PROC_VIDEO_SCALER);
|
|
|
+ if (ret) {
|
|
|
+ v4l2_err(&dev->v4l2_dev, "Failed to init mem2mem media controller\n");
|
|
|
+ goto unreg_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;
|
|
|
+ }
|
|
|
+#endif
|
|
|
return 0;
|
|
|
|
|
|
-err_m2m:
|
|
|
+#ifdef CONFIG_MEDIA_CONTROLLER
|
|
|
+unreg_m2m_mc:
|
|
|
+ v4l2_m2m_unregister_media_controller(dev->m2m_dev);
|
|
|
+unreg_m2m:
|
|
|
v4l2_m2m_release(dev->m2m_dev);
|
|
|
- video_unregister_device(&dev->vfd);
|
|
|
+#endif
|
|
|
unreg_dev:
|
|
|
+ video_unregister_device(&dev->vfd);
|
|
|
+unreg_v4l2:
|
|
|
v4l2_device_unregister(&dev->v4l2_dev);
|
|
|
|
|
|
return ret;
|
|
@@ -1049,6 +1076,12 @@ static int vim2m_remove(struct platform_device *pdev)
|
|
|
struct vim2m_dev *dev = platform_get_drvdata(pdev);
|
|
|
|
|
|
v4l2_info(&dev->v4l2_dev, "Removing " MEM2MEM_NAME);
|
|
|
+
|
|
|
+#ifdef CONFIG_MEDIA_CONTROLLER
|
|
|
+ media_device_unregister(&dev->mdev);
|
|
|
+ v4l2_m2m_unregister_media_controller(dev->m2m_dev);
|
|
|
+ media_device_cleanup(&dev->mdev);
|
|
|
+#endif
|
|
|
v4l2_m2m_release(dev->m2m_dev);
|
|
|
del_timer_sync(&dev->timer);
|
|
|
video_unregister_device(&dev->vfd);
|