mirror of
git://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
synced 2025-08-05 16:54:27 +00:00
media: vimc: stream: init/terminate the first entity
The s_stream callback was not being called for the first entity in the stream pipeline array. Instead of verifying the type of the node (video or subdevice) and calling s_stream from the second entity in the pipeline, do this process for all the entities in the pipeline for consistency. The previous code was not a problem because the first entity is a video device and not a subdevice, but this patch prepares vimc to allow setting some configuration in the entity before calling s_stream. Signed-off-by: Helen Koike <helen.koike@collabora.com> Tested-by: André Almeida <andre.almeida@collabora.com> Signed-off-by: Hans Verkuil <hverkuil-cisco@xs4all.nl> [hverkuil-cisco@xs4all.nl: fix line-too-long warning] Signed-off-by: Mauro Carvalho Chehab <mchehab+samsung@kernel.org>
This commit is contained in:
parent
43e3b726f5
commit
6f3f3e1199
1 changed files with 16 additions and 10 deletions
|
@ -46,19 +46,18 @@ static struct media_entity *vimc_get_source_entity(struct media_entity *ent)
|
|||
*/
|
||||
static void vimc_streamer_pipeline_terminate(struct vimc_stream *stream)
|
||||
{
|
||||
struct media_entity *entity;
|
||||
struct vimc_ent_device *ved;
|
||||
struct v4l2_subdev *sd;
|
||||
|
||||
while (stream->pipe_size) {
|
||||
stream->pipe_size--;
|
||||
entity = stream->ved_pipeline[stream->pipe_size]->ent;
|
||||
entity = vimc_get_source_entity(entity);
|
||||
ved = stream->ved_pipeline[stream->pipe_size];
|
||||
stream->ved_pipeline[stream->pipe_size] = NULL;
|
||||
|
||||
if (!is_media_entity_v4l2_subdev(entity))
|
||||
if (!is_media_entity_v4l2_subdev(ved->ent))
|
||||
continue;
|
||||
|
||||
sd = media_entity_to_v4l2_subdev(entity);
|
||||
sd = media_entity_to_v4l2_subdev(ved->ent);
|
||||
v4l2_subdev_call(sd, video, s_stream, 0);
|
||||
}
|
||||
}
|
||||
|
@ -89,18 +88,25 @@ static int vimc_streamer_pipeline_init(struct vimc_stream *stream,
|
|||
}
|
||||
stream->ved_pipeline[stream->pipe_size++] = ved;
|
||||
|
||||
if (is_media_entity_v4l2_subdev(ved->ent)) {
|
||||
sd = media_entity_to_v4l2_subdev(ved->ent);
|
||||
ret = v4l2_subdev_call(sd, video, s_stream, 1);
|
||||
if (ret && ret != -ENOIOCTLCMD) {
|
||||
pr_err("subdev_call error %s\n",
|
||||
ved->ent->name);
|
||||
vimc_streamer_pipeline_terminate(stream);
|
||||
return ret;
|
||||
}
|
||||
}
|
||||
|
||||
entity = vimc_get_source_entity(ved->ent);
|
||||
/* Check if the end of the pipeline was reached*/
|
||||
if (!entity)
|
||||
return 0;
|
||||
|
||||
/* Get the next device in the pipeline */
|
||||
if (is_media_entity_v4l2_subdev(entity)) {
|
||||
sd = media_entity_to_v4l2_subdev(entity);
|
||||
ret = v4l2_subdev_call(sd, video, s_stream, 1);
|
||||
if (ret && ret != -ENOIOCTLCMD) {
|
||||
vimc_streamer_pipeline_terminate(stream);
|
||||
return ret;
|
||||
}
|
||||
ved = v4l2_get_subdevdata(sd);
|
||||
} else {
|
||||
vdev = container_of(entity,
|
||||
|
|
Loading…
Add table
Reference in a new issue