[media] v4l: vsp1: Cleanup video nodes at removal time
authorLaurent Pinchart <laurent.pinchart+renesas@ideasonboard.com>
Wed, 28 May 2014 15:49:13 +0000 (12:49 -0300)
committerMauro Carvalho Chehab <m.chehab@samsung.com>
Thu, 17 Jul 2014 15:44:52 +0000 (12:44 -0300)
Video nodes created and initialized in the RPF and WPF init code paths
are never unregistered, and the related resources (videobuf alloc
context and media entity) never released.

Fix this by storing a pointer to the vsp1_video object in vsp1_entity
and calling vsp1_video_cleanup() from vsp1_entity_destroy(). This also
allows simplifying the init error code paths.

Signed-off-by: Laurent Pinchart <laurent.pinchart+renesas@ideasonboard.com>
Signed-off-by: Mauro Carvalho Chehab <m.chehab@samsung.com>
drivers/media/platform/vsp1/vsp1_entity.c
drivers/media/platform/vsp1/vsp1_entity.h
drivers/media/platform/vsp1/vsp1_rpf.c
drivers/media/platform/vsp1/vsp1_wpf.c

index 44167834285daf47b47233ccd91e6f00fc93798b..ceac0d7e564305087257e9e0eaf3f5cadb2e150a 100644 (file)
@@ -20,6 +20,7 @@
 
 #include "vsp1.h"
 #include "vsp1_entity.h"
+#include "vsp1_video.h"
 
 /* -----------------------------------------------------------------------------
  * V4L2 Subdevice Operations
@@ -185,6 +186,8 @@ int vsp1_entity_init(struct vsp1_device *vsp1, struct vsp1_entity *entity,
 
 void vsp1_entity_destroy(struct vsp1_entity *entity)
 {
+       if (entity->video)
+               vsp1_video_cleanup(entity->video);
        if (entity->subdev.ctrl_handler)
                v4l2_ctrl_handler_free(entity->subdev.ctrl_handler);
        media_entity_cleanup(&entity->subdev.entity);
index 7afbd8a7ba668153948a05984ff2889625906431..f0257f68f16a41fc1ac9a932f6aa9e733e46bba0 100644 (file)
@@ -18,6 +18,7 @@
 #include <media/v4l2-subdev.h>
 
 struct vsp1_device;
+struct vsp1_video;
 
 enum vsp1_entity_type {
        VSP1_ENTITY_BRU,
@@ -68,6 +69,8 @@ struct vsp1_entity {
 
        struct v4l2_subdev subdev;
        struct v4l2_mbus_framefmt *formats;
+
+       struct vsp1_video *video;
 };
 
 static inline struct vsp1_entity *to_vsp1_entity(struct v4l2_subdev *subdev)
index c3d98642a4aa692010b43a6b6b3d9c934c0735e4..9b3fc70e18f001a74a50168fec8c484735d3a7a6 100644 (file)
@@ -205,7 +205,9 @@ struct vsp1_rwpf *vsp1_rpf_create(struct vsp1_device *vsp1, unsigned int index)
 
        ret = vsp1_video_init(video, &rpf->entity);
        if (ret < 0)
-               goto error_video;
+               goto error;
+
+       rpf->entity.video = video;
 
        /* Connect the video device to the RPF. */
        ret = media_entity_create_link(&rpf->video.video.entity, 0,
@@ -214,13 +216,11 @@ struct vsp1_rwpf *vsp1_rpf_create(struct vsp1_device *vsp1, unsigned int index)
                                       MEDIA_LNK_FL_ENABLED |
                                       MEDIA_LNK_FL_IMMUTABLE);
        if (ret < 0)
-               goto error_link;
+               goto error;
 
        return rpf;
 
-error_link:
-       vsp1_video_cleanup(video);
-error_video:
-       media_entity_cleanup(&rpf->entity.subdev.entity);
+error:
+       vsp1_entity_destroy(&rpf->entity);
        return ERR_PTR(ret);
 }
index 1294340dcb36530bb4829f94dabc9506a77b2378..36c479362f8c43fba7affd2dfddf85ced4c95a6c 100644 (file)
@@ -216,7 +216,9 @@ struct vsp1_rwpf *vsp1_wpf_create(struct vsp1_device *vsp1, unsigned int index)
 
        ret = vsp1_video_init(video, &wpf->entity);
        if (ret < 0)
-               goto error_video;
+               goto error;
+
+       wpf->entity.video = video;
 
        /* Connect the video device to the WPF. All connections are immutable
         * except for the WPF0 source link if a LIF is present.
@@ -229,15 +231,13 @@ struct vsp1_rwpf *vsp1_wpf_create(struct vsp1_device *vsp1, unsigned int index)
                                       RWPF_PAD_SOURCE,
                                       &wpf->video.video.entity, 0, flags);
        if (ret < 0)
-               goto error_link;
+               goto error;
 
        wpf->entity.sink = &wpf->video.video.entity;
 
        return wpf;
 
-error_link:
-       vsp1_video_cleanup(video);
-error_video:
-       media_entity_cleanup(&wpf->entity.subdev.entity);
+error:
+       vsp1_entity_destroy(&wpf->entity);
        return ERR_PTR(ret);
 }