/* * vpfe_pipeline_disable() - Disable streaming on a pipeline * @vpfe_dev: vpfe device * @pipe: VPFE pipeline * * Walk the entities chain starting at the pipeline output video node and stop * all modules in the chain. * * Return 0 if all modules have been properly stopped, or -ETIMEDOUT if a module * can't be stopped. */ static int vpfe_pipeline_disable(struct vpfe_pipeline *pipe) { struct media_entity_graph graph; struct media_entity *entity; struct v4l2_subdev *subdev; struct media_device *mdev; int ret = 0; if (pipe->state == VPFE_PIPELINE_STREAM_CONTINUOUS) entity = vpfe_get_input_entity(pipe->outputs[0]); else entity = &pipe->inputs[0]->video_dev.entity; mdev = entity->parent; mutex_lock(&mdev->graph_mutex); media_entity_graph_walk_start(&graph, entity); while ((entity = media_entity_graph_walk_next(&graph))) { if (media_entity_type(entity) == MEDIA_ENT_T_DEVNODE) continue; subdev = media_entity_to_v4l2_subdev(entity); ret = v4l2_subdev_call(subdev, video, s_stream, 0); if (ret < 0 && ret != -ENOIOCTLCMD) break; } mutex_unlock(&mdev->graph_mutex); return ret ? -ETIMEDOUT : 0; }
/* * vpfe_pipeline_enable() - Enable streaming on a pipeline * @vpfe_dev: vpfe device * @pipe: vpfe pipeline * * Walk the entities chain starting at the pipeline output video node and start * all modules in the chain in the given mode. * * Return 0 if successful, or the return value of the failed video::s_stream * operation otherwise. */ static int vpfe_pipeline_enable(struct vpfe_pipeline *pipe) { struct media_entity *entity; struct v4l2_subdev *subdev; struct media_device *mdev; int ret; if (pipe->state == VPFE_PIPELINE_STREAM_CONTINUOUS) entity = vpfe_get_input_entity(pipe->outputs[0]); else entity = &pipe->inputs[0]->video_dev.entity; mdev = entity->graph_obj.mdev; mutex_lock(&mdev->graph_mutex); ret = media_graph_walk_init(&pipe->graph, mdev); if (ret) goto out; media_graph_walk_start(&pipe->graph, entity); while ((entity = media_graph_walk_next(&pipe->graph))) { if (!is_media_entity_v4l2_subdev(entity)) continue; subdev = media_entity_to_v4l2_subdev(entity); ret = v4l2_subdev_call(subdev, video, s_stream, 1); if (ret < 0 && ret != -ENOIOCTLCMD) break; } out: if (ret) media_graph_walk_cleanup(&pipe->graph); mutex_unlock(&mdev->graph_mutex); return ret; }