diff options
author | Hans Verkuil <hans.verkuil@cisco.com> | 2015-03-13 06:41:05 -0400 |
---|---|---|
committer | Mauro Carvalho Chehab <mchehab@osg.samsung.com> | 2015-04-02 20:08:04 -0400 |
commit | 87c674e24362cf0f8d5b70d2e20f6160045fd753 (patch) | |
tree | fea4f19a0abf5efa6f52f43a77e4783854d58f56 /drivers/media/platform | |
parent | f46d740fb0258982f00ffdbddc6486e674edafb5 (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.c | 43 |
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 | ||
622 | static 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 | |||
622 | static int vivid_create_instance(struct platform_device *pdev, int inst) | 638 | static 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); | ||
1262 | free_dev: | 1279 | free_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; |