|
@@ -149,9 +149,11 @@ static void au0828_unregister_media_device(struct au0828_dev *dev)
|
|
|
}
|
|
|
|
|
|
/* clear enable_source, disable_source */
|
|
|
+ mutex_lock(&mdev->graph_mutex);
|
|
|
dev->media_dev->source_priv = NULL;
|
|
|
dev->media_dev->enable_source = NULL;
|
|
|
dev->media_dev->disable_source = NULL;
|
|
|
+ mutex_unlock(&mdev->graph_mutex);
|
|
|
|
|
|
media_device_unregister(dev->media_dev);
|
|
|
media_device_cleanup(dev->media_dev);
|
|
@@ -274,6 +276,7 @@ create_link:
|
|
|
}
|
|
|
}
|
|
|
|
|
|
+/* Callers should hold graph_mutex */
|
|
|
static int au0828_enable_source(struct media_entity *entity,
|
|
|
struct media_pipeline *pipe)
|
|
|
{
|
|
@@ -287,8 +290,6 @@ static int au0828_enable_source(struct media_entity *entity,
|
|
|
if (!mdev)
|
|
|
return -ENODEV;
|
|
|
|
|
|
- mutex_lock(&mdev->graph_mutex);
|
|
|
-
|
|
|
dev = mdev->source_priv;
|
|
|
|
|
|
/*
|
|
@@ -415,12 +416,12 @@ static int au0828_enable_source(struct media_entity *entity,
|
|
|
dev->active_source->name, dev->active_sink->name,
|
|
|
dev->active_link_owner->name, ret);
|
|
|
end:
|
|
|
- mutex_unlock(&mdev->graph_mutex);
|
|
|
pr_debug("au0828_enable_source() end %s %d %d\n",
|
|
|
entity->name, entity->function, ret);
|
|
|
return ret;
|
|
|
}
|
|
|
|
|
|
+/* Callers should hold graph_mutex */
|
|
|
static void au0828_disable_source(struct media_entity *entity)
|
|
|
{
|
|
|
int ret = 0;
|
|
@@ -430,13 +431,10 @@ static void au0828_disable_source(struct media_entity *entity)
|
|
|
if (!mdev)
|
|
|
return;
|
|
|
|
|
|
- mutex_lock(&mdev->graph_mutex);
|
|
|
dev = mdev->source_priv;
|
|
|
|
|
|
- if (!dev->active_link) {
|
|
|
- ret = -ENODEV;
|
|
|
- goto end;
|
|
|
- }
|
|
|
+ if (!dev->active_link)
|
|
|
+ return;
|
|
|
|
|
|
/* link is active - stop pipeline from source (tuner) */
|
|
|
if (dev->active_link->sink->entity == dev->active_sink &&
|
|
@@ -446,7 +444,7 @@ static void au0828_disable_source(struct media_entity *entity)
|
|
|
* has active pipeline
|
|
|
*/
|
|
|
if (dev->active_link_owner != entity)
|
|
|
- goto end;
|
|
|
+ return;
|
|
|
__media_pipeline_stop(entity);
|
|
|
ret = __media_entity_setup_link(dev->active_link, 0);
|
|
|
if (ret)
|
|
@@ -461,9 +459,6 @@ static void au0828_disable_source(struct media_entity *entity)
|
|
|
dev->active_source = NULL;
|
|
|
dev->active_sink = NULL;
|
|
|
}
|
|
|
-
|
|
|
-end:
|
|
|
- mutex_unlock(&mdev->graph_mutex);
|
|
|
}
|
|
|
#endif
|
|
|
|
|
@@ -545,9 +540,11 @@ static int au0828_media_device_register(struct au0828_dev *dev,
|
|
|
return ret;
|
|
|
}
|
|
|
/* set enable_source */
|
|
|
+ mutex_lock(&dev->media_dev->graph_mutex);
|
|
|
dev->media_dev->source_priv = (void *) dev;
|
|
|
dev->media_dev->enable_source = au0828_enable_source;
|
|
|
dev->media_dev->disable_source = au0828_disable_source;
|
|
|
+ mutex_unlock(&dev->media_dev->graph_mutex);
|
|
|
#endif
|
|
|
return 0;
|
|
|
}
|