diff options
Diffstat (limited to 'drivers/media/platform/omap3isp/isp.c')
| -rw-r--r-- | drivers/media/platform/omap3isp/isp.c | 16 | 
1 files changed, 14 insertions, 2 deletions
| diff --git a/drivers/media/platform/omap3isp/isp.c b/drivers/media/platform/omap3isp/isp.c index a6bb7d9bf75f..53025c8c7531 100644 --- a/drivers/media/platform/omap3isp/isp.c +++ b/drivers/media/platform/omap3isp/isp.c @@ -691,6 +691,8 @@ static int isp_pipeline_enable(struct isp_pipeline *pipe,  	pipe->do_propagation = false; +	mutex_lock(&isp->media_dev.graph_mutex); +  	entity = &pipe->output->video.entity;  	while (1) {  		pad = &entity->pads[0]; @@ -705,8 +707,10 @@ static int isp_pipeline_enable(struct isp_pipeline *pipe,  		subdev = media_entity_to_v4l2_subdev(entity);  		ret = v4l2_subdev_call(subdev, video, s_stream, mode); -		if (ret < 0 && ret != -ENOIOCTLCMD) +		if (ret < 0 && ret != -ENOIOCTLCMD) { +			mutex_unlock(&isp->media_dev.graph_mutex);  			return ret; +		}  		if (subdev == &isp->isp_ccdc.subdev) {  			v4l2_subdev_call(&isp->isp_aewb.subdev, video, @@ -723,6 +727,8 @@ static int isp_pipeline_enable(struct isp_pipeline *pipe,  			break;  	} +	mutex_unlock(&isp->media_dev.graph_mutex); +  	return 0;  } @@ -2028,6 +2034,8 @@ static int isp_subdev_notifier_complete(struct v4l2_async_notifier *async)  	struct v4l2_subdev *sd;  	int ret; +	mutex_lock(&isp->media_dev.graph_mutex); +  	ret = media_entity_enum_init(&isp->crashed, &isp->media_dev);  	if (ret)  		return ret; @@ -2038,10 +2046,14 @@ static int isp_subdev_notifier_complete(struct v4l2_async_notifier *async)  		ret = isp_link_entity(isp, &sd->entity,  				      v4l2_subdev_to_bus_cfg(sd)->interface); -		if (ret < 0) +		if (ret < 0) { +			mutex_unlock(&isp->media_dev.graph_mutex);  			return ret; +		}  	} +	mutex_unlock(&isp->media_dev.graph_mutex); +  	ret = v4l2_device_register_subdev_nodes(&isp->v4l2_dev);  	if (ret < 0)  		return ret; | 
