[media] media: Media Controller non-locking __media_entity_pipeline_start/stop()
authorShuah Khan <shuahkh@osg.samsung.com>
Thu, 11 Feb 2016 23:41:24 +0000 (21:41 -0200)
committerMauro Carvalho Chehab <mchehab@osg.samsung.com>
Sat, 27 Feb 2016 11:33:28 +0000 (08:33 -0300)
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 <shuahkh@osg.samsung.com>
Signed-off-by: Mauro Carvalho Chehab <mchehab@osg.samsung.com>
drivers/media/media-entity.c
include/media/media-entity.h

index bab592c..bcd7464 100644 (file)
@@ -366,8 +366,8 @@ 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;
@@ -375,8 +375,6 @@ __must_check int media_entity_pipeline_start(struct media_entity *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)
@@ -457,8 +455,6 @@ __must_check int media_entity_pipeline_start(struct media_entity *entity,
                }
        }
 
-       mutex_unlock(&mdev->graph_mutex);
-
        return 0;
 
 error:
@@ -488,19 +484,28 @@ error_graph_walk_start:
        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);
@@ -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);
index fe485d3..d58e29d 100644 (file)
@@ -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
@@ -848,6 +858,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
  *
  * @mdev:      pointer to struct &media_device