aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/media/platform
diff options
context:
space:
mode:
authorHans Verkuil <hans.verkuil@cisco.com>2015-03-13 06:41:05 -0400
committerMauro Carvalho Chehab <mchehab@osg.samsung.com>2015-04-02 20:08:04 -0400
commit87c674e24362cf0f8d5b70d2e20f6160045fd753 (patch)
treefea4f19a0abf5efa6f52f43a77e4783854d58f56 /drivers/media/platform
parentf46d740fb0258982f00ffdbddc6486e674edafb5 (diff)
[media] vivid: use v4l2_device.release to clean up the driver
Use the release callback of the v4l2_device to clean up the memory. This prevents vivid from breaking if someone tries to unbind the driver. Signed-off-by: Hans Verkuil <hans.verkuil@cisco.com> Signed-off-by: Mauro Carvalho Chehab <mchehab@osg.samsung.com>
Diffstat (limited to 'drivers/media/platform')
-rw-r--r--drivers/media/platform/vivid/vivid-core.c43
1 files changed, 23 insertions, 20 deletions
diff --git a/drivers/media/platform/vivid/vivid-core.c b/drivers/media/platform/vivid/vivid-core.c
index d2558db27751..d33f16495dbc 100644
--- a/drivers/media/platform/vivid/vivid-core.c
+++ b/drivers/media/platform/vivid/vivid-core.c
@@ -619,6 +619,22 @@ static const struct v4l2_ioctl_ops vivid_ioctl_ops = {
619 Initialization and module stuff 619 Initialization and module stuff
620 ------------------------------------------------------------------*/ 620 ------------------------------------------------------------------*/
621 621
622static void vivid_dev_release(struct v4l2_device *v4l2_dev)
623{
624 struct vivid_dev *dev = container_of(v4l2_dev, struct vivid_dev, v4l2_dev);
625
626 vivid_free_controls(dev);
627 v4l2_device_unregister(&dev->v4l2_dev);
628 vfree(dev->scaled_line);
629 vfree(dev->blended_line);
630 vfree(dev->edid);
631 vfree(dev->bitmap_cap);
632 vfree(dev->bitmap_out);
633 tpg_free(&dev->tpg);
634 kfree(dev->query_dv_timings_qmenu);
635 kfree(dev);
636}
637
622static int vivid_create_instance(struct platform_device *pdev, int inst) 638static int vivid_create_instance(struct platform_device *pdev, int inst)
623{ 639{
624 static const struct v4l2_dv_timings def_dv_timings = 640 static const struct v4l2_dv_timings def_dv_timings =
@@ -648,8 +664,11 @@ static int vivid_create_instance(struct platform_device *pdev, int inst)
648 snprintf(dev->v4l2_dev.name, sizeof(dev->v4l2_dev.name), 664 snprintf(dev->v4l2_dev.name, sizeof(dev->v4l2_dev.name),
649 "%s-%03d", VIVID_MODULE_NAME, inst); 665 "%s-%03d", VIVID_MODULE_NAME, inst);
650 ret = v4l2_device_register(&pdev->dev, &dev->v4l2_dev); 666 ret = v4l2_device_register(&pdev->dev, &dev->v4l2_dev);
651 if (ret) 667 if (ret) {
652 goto free_dev; 668 kfree(dev);
669 return ret;
670 }
671 dev->v4l2_dev.release = vivid_dev_release;
653 672
654 /* start detecting feature set */ 673 /* start detecting feature set */
655 674
@@ -1257,15 +1276,8 @@ unreg_dev:
1257 video_unregister_device(&dev->vbi_cap_dev); 1276 video_unregister_device(&dev->vbi_cap_dev);
1258 video_unregister_device(&dev->vid_out_dev); 1277 video_unregister_device(&dev->vid_out_dev);
1259 video_unregister_device(&dev->vid_cap_dev); 1278 video_unregister_device(&dev->vid_cap_dev);
1260 vivid_free_controls(dev);
1261 v4l2_device_unregister(&dev->v4l2_dev);
1262free_dev: 1279free_dev:
1263 vfree(dev->scaled_line); 1280 v4l2_device_put(&dev->v4l2_dev);
1264 vfree(dev->blended_line);
1265 vfree(dev->edid);
1266 tpg_free(&dev->tpg);
1267 kfree(dev->query_dv_timings_qmenu);
1268 kfree(dev);
1269 return ret; 1281 return ret;
1270} 1282}
1271 1283
@@ -1359,16 +1371,7 @@ static int vivid_remove(struct platform_device *pdev)
1359 unregister_framebuffer(&dev->fb_info); 1371 unregister_framebuffer(&dev->fb_info);
1360 vivid_fb_release_buffers(dev); 1372 vivid_fb_release_buffers(dev);
1361 } 1373 }
1362 v4l2_device_unregister(&dev->v4l2_dev); 1374 v4l2_device_put(&dev->v4l2_dev);
1363 vivid_free_controls(dev);
1364 vfree(dev->scaled_line);
1365 vfree(dev->blended_line);
1366 vfree(dev->edid);
1367 vfree(dev->bitmap_cap);
1368 vfree(dev->bitmap_out);
1369 tpg_free(&dev->tpg);
1370 kfree(dev->query_dv_timings_qmenu);
1371 kfree(dev);
1372 vivid_devs[i] = NULL; 1375 vivid_devs[i] = NULL;
1373 } 1376 }
1374 return 0; 1377 return 0;