summaryrefslogtreecommitdiff
path: root/drivers/media/platform/vsp1/vsp1_drv.c
diff options
context:
space:
mode:
authorLaurent Pinchart <laurent.pinchart+renesas@ideasonboard.com>2015-07-28 18:46:00 (GMT)
committerMauro Carvalho Chehab <mchehab@osg.samsung.com>2016-02-19 10:52:54 (GMT)
commit9d40637a6e140902696fa8495aac913f5011a3bd (patch)
tree8be0df23d9f2c0136c3f3dd387f09981d5e5a76f /drivers/media/platform/vsp1/vsp1_drv.c
parentf7ebf3ca09c5f3f5b5c17b03cd59b7aca1ed09d2 (diff)
downloadlinux-9d40637a6e140902696fa8495aac913f5011a3bd.tar.xz
[media] v4l: vsp1: Move video device out of struct vsp1_rwpf
To make the video device nodes optional we need to decouple the [rw]pf instances from the video devices. Move video devices out of struct vsp1_rwpf and instantiate them dynamically in the core driver code. Signed-off-by: Laurent Pinchart <laurent.pinchart+renesas@ideasonboard.com> Signed-off-by: Mauro Carvalho Chehab <mchehab@osg.samsung.com>
Diffstat (limited to 'drivers/media/platform/vsp1/vsp1_drv.c')
-rw-r--r--drivers/media/platform/vsp1/vsp1_drv.c40
1 files changed, 33 insertions, 7 deletions
diff --git a/drivers/media/platform/vsp1/vsp1_drv.c b/drivers/media/platform/vsp1/vsp1_drv.c
index d7f6531..8a7b111 100644
--- a/drivers/media/platform/vsp1/vsp1_drv.c
+++ b/drivers/media/platform/vsp1/vsp1_drv.c
@@ -28,6 +28,7 @@
#include "vsp1_rwpf.h"
#include "vsp1_sru.h"
#include "vsp1_uds.h"
+#include "vsp1_video.h"
/* -----------------------------------------------------------------------------
* Interrupt Handling
@@ -88,8 +89,8 @@ static int vsp1_create_links(struct vsp1_device *vsp1, struct vsp1_entity *sink)
/* RPFs have no source entities, just connect their source pad
* to their video device.
*/
- return media_create_pad_link(&rpf->video.video.entity, 0,
- &rpf->entity.subdev.entity,
+ return media_create_pad_link(&rpf->entity.video->video.entity,
+ 0, &rpf->entity.subdev.entity,
RWPF_PAD_SINK,
MEDIA_LNK_FL_ENABLED |
MEDIA_LNK_FL_IMMUTABLE);
@@ -138,8 +139,8 @@ static int vsp1_create_links(struct vsp1_device *vsp1, struct vsp1_entity *sink)
return media_create_pad_link(&wpf->entity.subdev.entity,
RWPF_PAD_SOURCE,
- &wpf->video.video.entity, 0,
- flags);
+ &wpf->entity.video->video.entity,
+ 0, flags);
}
return 0;
@@ -147,14 +148,19 @@ static int vsp1_create_links(struct vsp1_device *vsp1, struct vsp1_entity *sink)
static void vsp1_destroy_entities(struct vsp1_device *vsp1)
{
- struct vsp1_entity *entity;
- struct vsp1_entity *next;
+ struct vsp1_entity *entity, *_entity;
+ struct vsp1_video *video, *_video;
- list_for_each_entry_safe(entity, next, &vsp1->entities, list_dev) {
+ list_for_each_entry_safe(entity, _entity, &vsp1->entities, list_dev) {
list_del(&entity->list_dev);
vsp1_entity_destroy(entity);
}
+ list_for_each_entry_safe(video, _video, &vsp1->videos, list) {
+ list_del(&video->list);
+ vsp1_video_cleanup(video);
+ }
+
v4l2_device_unregister(&vsp1->v4l2_dev);
media_device_unregister(&vsp1->media_dev);
media_device_cleanup(&vsp1->media_dev);
@@ -228,6 +234,7 @@ static int vsp1_create_entities(struct vsp1_device *vsp1)
}
for (i = 0; i < vsp1->pdata.rpf_count; ++i) {
+ struct vsp1_video *video;
struct vsp1_rwpf *rpf;
rpf = vsp1_rpf_create(vsp1, i);
@@ -238,6 +245,14 @@ static int vsp1_create_entities(struct vsp1_device *vsp1)
vsp1->rpf[i] = rpf;
list_add_tail(&rpf->entity.list_dev, &vsp1->entities);
+
+ video = vsp1_video_create(vsp1, rpf);
+ if (IS_ERR(video)) {
+ ret = PTR_ERR(video);
+ goto done;
+ }
+
+ list_add_tail(&video->list, &vsp1->videos);
}
if (vsp1->pdata.features & VSP1_HAS_SRU) {
@@ -264,6 +279,7 @@ static int vsp1_create_entities(struct vsp1_device *vsp1)
}
for (i = 0; i < vsp1->pdata.wpf_count; ++i) {
+ struct vsp1_video *video;
struct vsp1_rwpf *wpf;
wpf = vsp1_wpf_create(vsp1, i);
@@ -274,6 +290,15 @@ static int vsp1_create_entities(struct vsp1_device *vsp1)
vsp1->wpf[i] = wpf;
list_add_tail(&wpf->entity.list_dev, &vsp1->entities);
+
+ video = vsp1_video_create(vsp1, wpf);
+ if (IS_ERR(video)) {
+ ret = PTR_ERR(video);
+ goto done;
+ }
+
+ list_add_tail(&video->list, &vsp1->videos);
+ wpf->entity.sink = &video->video.entity;
}
/* Register all subdevs. */
@@ -515,6 +540,7 @@ static int vsp1_probe(struct platform_device *pdev)
vsp1->dev = &pdev->dev;
mutex_init(&vsp1->lock);
INIT_LIST_HEAD(&vsp1->entities);
+ INIT_LIST_HEAD(&vsp1->videos);
ret = vsp1_parse_dt(vsp1);
if (ret < 0)