diff options
Diffstat (limited to 'drivers/media/v4l2-core/v4l2-dev.c')
| -rw-r--r-- | drivers/media/v4l2-core/v4l2-dev.c | 16 | 
1 files changed, 10 insertions, 6 deletions
| diff --git a/drivers/media/v4l2-core/v4l2-dev.c b/drivers/media/v4l2-core/v4l2-dev.c index 4ffd7d60a901..69e775930fc4 100644 --- a/drivers/media/v4l2-core/v4l2-dev.c +++ b/drivers/media/v4l2-core/v4l2-dev.c @@ -202,7 +202,7 @@ static void v4l2_device_release(struct device *cd)  	mutex_unlock(&videodev_lock);  #if defined(CONFIG_MEDIA_CONTROLLER) -	if (v4l2_dev->mdev) { +	if (v4l2_dev->mdev && vdev->vfl_dir != VFL_DIR_M2M) {  		/* Remove interfaces and interface links */  		media_devnode_remove(vdev->intf_devnode);  		if (vdev->entity.function != MEDIA_ENT_F_UNKNOWN) @@ -733,19 +733,22 @@ static void determine_valid_ioctls(struct video_device *vdev)  			BASE_VIDIOC_PRIVATE);  } -static int video_register_media_controller(struct video_device *vdev, int type) +static int video_register_media_controller(struct video_device *vdev)  {  #if defined(CONFIG_MEDIA_CONTROLLER)  	u32 intf_type;  	int ret; -	if (!vdev->v4l2_dev->mdev) +	/* Memory-to-memory devices are more complex and use +	 * their own function to register its mc entities. +	 */ +	if (!vdev->v4l2_dev->mdev || vdev->vfl_dir == VFL_DIR_M2M)  		return 0;  	vdev->entity.obj_type = MEDIA_ENTITY_TYPE_VIDEO_DEVICE;  	vdev->entity.function = MEDIA_ENT_F_UNKNOWN; -	switch (type) { +	switch (vdev->vfl_type) {  	case VFL_TYPE_GRABBER:  		intf_type = MEDIA_INTF_T_V4L_VIDEO;  		vdev->entity.function = MEDIA_ENT_F_IO_V4L; @@ -808,7 +811,8 @@ static int video_register_media_controller(struct video_device *vdev, int type)  		link = media_create_intf_link(&vdev->entity,  					      &vdev->intf_devnode->intf, -					      MEDIA_LNK_FL_ENABLED); +					      MEDIA_LNK_FL_ENABLED | +					      MEDIA_LNK_FL_IMMUTABLE);  		if (!link) {  			media_devnode_remove(vdev->intf_devnode);  			media_device_unregister_entity(&vdev->entity); @@ -993,7 +997,7 @@ int __video_register_device(struct video_device *vdev,  	v4l2_device_get(vdev->v4l2_dev);  	/* Part 5: Register the entity. */ -	ret = video_register_media_controller(vdev, type); +	ret = video_register_media_controller(vdev);  	/* Part 6: Activate this minor. The char device can now be used. */  	set_bit(V4L2_FL_REGISTERED, &vdev->flags); |