diff options
Diffstat (limited to 'drivers/media/platform/vim2m.c')
| -rw-r--r-- | drivers/media/platform/vim2m.c | 42 | 
1 files changed, 37 insertions, 5 deletions
diff --git a/drivers/media/platform/vim2m.c b/drivers/media/platform/vim2m.c index 065483e62db4..462099a141e4 100644 --- a/drivers/media/platform/vim2m.c +++ b/drivers/media/platform/vim2m.c @@ -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,11 +1019,10 @@ 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); -	snprintf(vfd->name, sizeof(vfd->name), "%s", vim2m_videodev.name);  	v4l2_info(&dev->v4l2_dev,  			"Device registered as /dev/video%d\n", vfd->num); @@ -1031,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; @@ -1050,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);  |