Skip to content

Commit

Permalink
[media] media: Media Controller non-locking __media_entity_pipeline_s…
Browse files Browse the repository at this point in the history
…tart/stop()

Add non-locking __media_entity_pipeline_start/stop()
interfaces to be called from code paths that hold the
graph_mutex.

Signed-off-by: Shuah Khan <[email protected]>
Signed-off-by: Mauro Carvalho Chehab <[email protected]>
  • Loading branch information
Shuah Khan authored and mchehab committed Feb 27, 2016
1 parent efc7027 commit fb49f20
Show file tree
Hide file tree
Showing 2 changed files with 43 additions and 10 deletions.
34 changes: 24 additions & 10 deletions drivers/media/media-entity.c
Original file line number Diff line number Diff line change
Expand Up @@ -366,17 +366,15 @@ EXPORT_SYMBOL_GPL(media_entity_graph_walk_next);
* Pipeline management
*/

__must_check int media_entity_pipeline_start(struct media_entity *entity,
struct media_pipeline *pipe)
__must_check int __media_entity_pipeline_start(struct media_entity *entity,
struct media_pipeline *pipe)
{
struct media_device *mdev = entity->graph_obj.mdev;
struct media_entity_graph *graph = &pipe->graph;
struct media_entity *entity_err = entity;
struct media_link *link;
int ret;

mutex_lock(&mdev->graph_mutex);

if (!pipe->streaming_count++) {
ret = media_entity_graph_walk_init(&pipe->graph, mdev);
if (ret)
Expand Down Expand Up @@ -457,8 +455,6 @@ __must_check int media_entity_pipeline_start(struct media_entity *entity,
}
}

mutex_unlock(&mdev->graph_mutex);

return 0;

error:
Expand Down Expand Up @@ -488,19 +484,28 @@ __must_check int media_entity_pipeline_start(struct media_entity *entity,
if (!--pipe->streaming_count)
media_entity_graph_walk_cleanup(graph);

mutex_unlock(&mdev->graph_mutex);
return ret;
}
EXPORT_SYMBOL_GPL(__media_entity_pipeline_start);

__must_check int media_entity_pipeline_start(struct media_entity *entity,
struct media_pipeline *pipe)
{
struct media_device *mdev = entity->graph_obj.mdev;
int ret;

mutex_lock(&mdev->graph_mutex);
ret = __media_entity_pipeline_start(entity, pipe);
mutex_unlock(&mdev->graph_mutex);
return ret;
}
EXPORT_SYMBOL_GPL(media_entity_pipeline_start);

void media_entity_pipeline_stop(struct media_entity *entity)
void __media_entity_pipeline_stop(struct media_entity *entity)
{
struct media_device *mdev = entity->graph_obj.mdev;
struct media_entity_graph *graph = &entity->pipe->graph;
struct media_pipeline *pipe = entity->pipe;

mutex_lock(&mdev->graph_mutex);

WARN_ON(!pipe->streaming_count);
media_entity_graph_walk_start(graph, entity);
Expand All @@ -517,6 +522,15 @@ void media_entity_pipeline_stop(struct media_entity *entity)
if (!--pipe->streaming_count)
media_entity_graph_walk_cleanup(graph);

}
EXPORT_SYMBOL_GPL(__media_entity_pipeline_stop);

void media_entity_pipeline_stop(struct media_entity *entity)
{
struct media_device *mdev = entity->graph_obj.mdev;

mutex_lock(&mdev->graph_mutex);
__media_entity_pipeline_stop(entity);
mutex_unlock(&mdev->graph_mutex);
}
EXPORT_SYMBOL_GPL(media_entity_pipeline_stop);
Expand Down
19 changes: 19 additions & 0 deletions include/media/media-entity.h
Original file line number Diff line number Diff line change
Expand Up @@ -832,6 +832,16 @@ media_entity_graph_walk_next(struct media_entity_graph *graph);
*/
__must_check int media_entity_pipeline_start(struct media_entity *entity,
struct media_pipeline *pipe);
/**
* __media_entity_pipeline_start - Mark a pipeline as streaming
*
* @entity: Starting entity
* @pipe: Media pipeline to be assigned to all entities in the pipeline.
*
* Note: This is the non-locking version of media_entity_pipeline_start()
*/
__must_check int __media_entity_pipeline_start(struct media_entity *entity,
struct media_pipeline *pipe);

/**
* media_entity_pipeline_stop - Mark a pipeline as not streaming
Expand All @@ -847,6 +857,15 @@ __must_check int media_entity_pipeline_start(struct media_entity *entity,
*/
void media_entity_pipeline_stop(struct media_entity *entity);

/**
* __media_entity_pipeline_stop - Mark a pipeline as not streaming
*
* @entity: Starting entity
*
* Note: This is the non-locking version of media_entity_pipeline_stop()
*/
void __media_entity_pipeline_stop(struct media_entity *entity);

/**
* media_devnode_create() - creates and initializes a device node interface
*
Expand Down

0 comments on commit fb49f20

Please sign in to comment.