diff options
author | Laurent Pinchart <laurent.pinchart@ideasonboard.com> | 2011-06-28 17:17:48 -0400 |
---|---|---|
committer | Mauro Carvalho Chehab <mchehab@redhat.com> | 2011-06-30 22:18:13 -0400 |
commit | a96aa5342d575980e5b572cde88036f3a878ebee (patch) | |
tree | b6da16dbf0f2bb9f76533ae5faf24f6eff343dff | |
parent | c064b8eac8da5d494fd221f14219c4f39502deb2 (diff) |
[media] uvcvideo: Ignore entities for terminals with no supported format
If a streaming interface has no supported format, the driver won't
create a video device for the associated terminal. Fix an oops by
ignoring that terminal when creating links between entities.
Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
Signed-off-by: Mauro Carvalho Chehab <mchehab@redhat.com>
-rw-r--r-- | drivers/media/video/uvc/uvc_entity.c | 34 |
1 files changed, 21 insertions, 13 deletions
diff --git a/drivers/media/video/uvc/uvc_entity.c b/drivers/media/video/uvc/uvc_entity.c index c3ab0c813be2..48fea373c25a 100644 --- a/drivers/media/video/uvc/uvc_entity.c +++ b/drivers/media/video/uvc/uvc_entity.c | |||
@@ -27,14 +27,20 @@ static int uvc_mc_register_entity(struct uvc_video_chain *chain, | |||
27 | struct uvc_entity *entity) | 27 | struct uvc_entity *entity) |
28 | { | 28 | { |
29 | const u32 flags = MEDIA_LNK_FL_ENABLED | MEDIA_LNK_FL_IMMUTABLE; | 29 | const u32 flags = MEDIA_LNK_FL_ENABLED | MEDIA_LNK_FL_IMMUTABLE; |
30 | struct uvc_entity *remote; | 30 | struct media_entity *sink; |
31 | unsigned int i; | 31 | unsigned int i; |
32 | u8 remote_pad; | 32 | int ret; |
33 | int ret = 0; | 33 | |
34 | sink = (UVC_ENTITY_TYPE(entity) == UVC_TT_STREAMING) | ||
35 | ? (entity->vdev ? &entity->vdev->entity : NULL) | ||
36 | : &entity->subdev.entity; | ||
37 | if (sink == NULL) | ||
38 | return 0; | ||
34 | 39 | ||
35 | for (i = 0; i < entity->num_pads; ++i) { | 40 | for (i = 0; i < entity->num_pads; ++i) { |
36 | struct media_entity *source; | 41 | struct media_entity *source; |
37 | struct media_entity *sink; | 42 | struct uvc_entity *remote; |
43 | u8 remote_pad; | ||
38 | 44 | ||
39 | if (!(entity->pads[i].flags & MEDIA_PAD_FL_SINK)) | 45 | if (!(entity->pads[i].flags & MEDIA_PAD_FL_SINK)) |
40 | continue; | 46 | continue; |
@@ -43,10 +49,11 @@ static int uvc_mc_register_entity(struct uvc_video_chain *chain, | |||
43 | if (remote == NULL) | 49 | if (remote == NULL) |
44 | return -EINVAL; | 50 | return -EINVAL; |
45 | 51 | ||
46 | source = (UVC_ENTITY_TYPE(remote) == UVC_TT_STREAMING) | 52 | source = (UVC_ENTITY_TYPE(remote) != UVC_TT_STREAMING) |
47 | ? &remote->vdev->entity : &remote->subdev.entity; | 53 | ? (remote->vdev ? &remote->vdev->entity : NULL) |
48 | sink = (UVC_ENTITY_TYPE(entity) == UVC_TT_STREAMING) | 54 | : &remote->subdev.entity; |
49 | ? &entity->vdev->entity : &entity->subdev.entity; | 55 | if (source == NULL) |
56 | continue; | ||
50 | 57 | ||
51 | remote_pad = remote->num_pads - 1; | 58 | remote_pad = remote->num_pads - 1; |
52 | ret = media_entity_create_link(source, remote_pad, | 59 | ret = media_entity_create_link(source, remote_pad, |
@@ -55,11 +62,10 @@ static int uvc_mc_register_entity(struct uvc_video_chain *chain, | |||
55 | return ret; | 62 | return ret; |
56 | } | 63 | } |
57 | 64 | ||
58 | if (UVC_ENTITY_TYPE(entity) != UVC_TT_STREAMING) | 65 | if (UVC_ENTITY_TYPE(entity) == UVC_TT_STREAMING) |
59 | ret = v4l2_device_register_subdev(&chain->dev->vdev, | 66 | return 0; |
60 | &entity->subdev); | ||
61 | 67 | ||
62 | return ret; | 68 | return v4l2_device_register_subdev(&chain->dev->vdev, &entity->subdev); |
63 | } | 69 | } |
64 | 70 | ||
65 | static struct v4l2_subdev_ops uvc_subdev_ops = { | 71 | static struct v4l2_subdev_ops uvc_subdev_ops = { |
@@ -84,9 +90,11 @@ static int uvc_mc_init_entity(struct uvc_entity *entity) | |||
84 | 90 | ||
85 | ret = media_entity_init(&entity->subdev.entity, | 91 | ret = media_entity_init(&entity->subdev.entity, |
86 | entity->num_pads, entity->pads, 0); | 92 | entity->num_pads, entity->pads, 0); |
87 | } else | 93 | } else if (entity->vdev != NULL) { |
88 | ret = media_entity_init(&entity->vdev->entity, | 94 | ret = media_entity_init(&entity->vdev->entity, |
89 | entity->num_pads, entity->pads, 0); | 95 | entity->num_pads, entity->pads, 0); |
96 | } else | ||
97 | ret = 0; | ||
90 | 98 | ||
91 | return ret; | 99 | return ret; |
92 | } | 100 | } |