|
@@ -1046,10 +1046,10 @@ static int __fimc_md_modify_pipeline(struct media_entity *entity, bool enable)
|
|
}
|
|
}
|
|
|
|
|
|
/* Locking: called with entity->graph_obj.mdev->graph_mutex mutex held. */
|
|
/* Locking: called with entity->graph_obj.mdev->graph_mutex mutex held. */
|
|
-static int __fimc_md_modify_pipelines(struct media_entity *entity, bool enable)
|
|
|
|
|
|
+static int __fimc_md_modify_pipelines(struct media_entity *entity, bool enable,
|
|
|
|
+ struct media_entity_graph *graph)
|
|
{
|
|
{
|
|
struct media_entity *entity_err = entity;
|
|
struct media_entity *entity_err = entity;
|
|
- struct media_entity_graph graph;
|
|
|
|
int ret;
|
|
int ret;
|
|
|
|
|
|
/*
|
|
/*
|
|
@@ -1058,9 +1058,9 @@ static int __fimc_md_modify_pipelines(struct media_entity *entity, bool enable)
|
|
* through active links. This is needed as we cannot power on/off the
|
|
* through active links. This is needed as we cannot power on/off the
|
|
* subdevs in random order.
|
|
* subdevs in random order.
|
|
*/
|
|
*/
|
|
- media_entity_graph_walk_start(&graph, entity);
|
|
|
|
|
|
+ media_entity_graph_walk_start(graph, entity);
|
|
|
|
|
|
- while ((entity = media_entity_graph_walk_next(&graph))) {
|
|
|
|
|
|
+ while ((entity = media_entity_graph_walk_next(graph))) {
|
|
if (!is_media_entity_v4l2_io(entity))
|
|
if (!is_media_entity_v4l2_io(entity))
|
|
continue;
|
|
continue;
|
|
|
|
|
|
@@ -1071,10 +1071,11 @@ static int __fimc_md_modify_pipelines(struct media_entity *entity, bool enable)
|
|
}
|
|
}
|
|
|
|
|
|
return 0;
|
|
return 0;
|
|
- err:
|
|
|
|
- media_entity_graph_walk_start(&graph, entity_err);
|
|
|
|
|
|
|
|
- while ((entity_err = media_entity_graph_walk_next(&graph))) {
|
|
|
|
|
|
+err:
|
|
|
|
+ media_entity_graph_walk_start(graph, entity_err);
|
|
|
|
+
|
|
|
|
+ while ((entity_err = media_entity_graph_walk_next(graph))) {
|
|
if (!is_media_entity_v4l2_io(entity_err))
|
|
if (!is_media_entity_v4l2_io(entity_err))
|
|
continue;
|
|
continue;
|
|
|
|
|
|
@@ -1090,21 +1091,29 @@ static int __fimc_md_modify_pipelines(struct media_entity *entity, bool enable)
|
|
static int fimc_md_link_notify(struct media_link *link, unsigned int flags,
|
|
static int fimc_md_link_notify(struct media_link *link, unsigned int flags,
|
|
unsigned int notification)
|
|
unsigned int notification)
|
|
{
|
|
{
|
|
|
|
+ struct media_entity_graph *graph =
|
|
|
|
+ &container_of(link->graph_obj.mdev, struct fimc_md,
|
|
|
|
+ media_dev)->link_setup_graph;
|
|
struct media_entity *sink = link->sink->entity;
|
|
struct media_entity *sink = link->sink->entity;
|
|
int ret = 0;
|
|
int ret = 0;
|
|
|
|
|
|
/* Before link disconnection */
|
|
/* Before link disconnection */
|
|
if (notification == MEDIA_DEV_NOTIFY_PRE_LINK_CH) {
|
|
if (notification == MEDIA_DEV_NOTIFY_PRE_LINK_CH) {
|
|
|
|
+ ret = media_entity_graph_walk_init(graph,
|
|
|
|
+ link->graph_obj.mdev);
|
|
|
|
+ if (ret)
|
|
|
|
+ return ret;
|
|
if (!(flags & MEDIA_LNK_FL_ENABLED))
|
|
if (!(flags & MEDIA_LNK_FL_ENABLED))
|
|
- ret = __fimc_md_modify_pipelines(sink, false);
|
|
|
|
|
|
+ ret = __fimc_md_modify_pipelines(sink, false, graph);
|
|
#if 0
|
|
#if 0
|
|
else
|
|
else
|
|
/* TODO: Link state change validation */
|
|
/* TODO: Link state change validation */
|
|
#endif
|
|
#endif
|
|
/* After link activation */
|
|
/* After link activation */
|
|
- } else if (notification == MEDIA_DEV_NOTIFY_POST_LINK_CH &&
|
|
|
|
- (link->flags & MEDIA_LNK_FL_ENABLED)) {
|
|
|
|
- ret = __fimc_md_modify_pipelines(sink, true);
|
|
|
|
|
|
+ } else if (notification == MEDIA_DEV_NOTIFY_POST_LINK_CH) {
|
|
|
|
+ if (link->flags & MEDIA_LNK_FL_ENABLED)
|
|
|
|
+ ret = __fimc_md_modify_pipelines(sink, true, graph);
|
|
|
|
+ media_entity_graph_walk_cleanup(graph);
|
|
}
|
|
}
|
|
|
|
|
|
return ret ? -EPIPE : 0;
|
|
return ret ? -EPIPE : 0;
|