diff options
author | Deepak Nibade <dnibade@nvidia.com> | 2014-03-28 11:46:46 +0530 |
---|---|---|
committer | Terje Bergstrom <tbergstrom@nvidia.com> | 2014-03-31 00:10:26 -0700 |
commit | 2ac28aa128a04f9bfa16ed27106be0dc544de741 (patch) | |
tree | edf9a8d5c804e1a6e5337b83937ae3cfb33b580b /drivers | |
parent | a715d19226b7fa7b97119c7a5961a3c7cf460137 (diff) |
media: tegra_camera: free syncpts at driver remove
Use nvhost_free_syncpts() to free the syncpts during driver
unload
This is required to fix syncpts leak
Bug 1489488
Bug 1305024
Change-Id: Ic02771e2078ddead4c9b54826a669bb7c3653ba2
Signed-off-by: Deepak Nibade <dnibade@nvidia.com>
Reviewed-on: http://git-master/r/388116
Reviewed-by: Automatic_Commit_Validation_User
Reviewed-by: Shridhar Rasal <srasal@nvidia.com>
Reviewed-by: Bryan Wu <pengw@nvidia.com>
Tested-by: Bryan Wu <pengw@nvidia.com>
Reviewed-by: Terje Bergstrom <tbergstrom@nvidia.com>
Diffstat (limited to 'drivers')
4 files changed, 22 insertions, 0 deletions
diff --git a/drivers/media/platform/soc_camera/tegra_camera/common.c b/drivers/media/platform/soc_camera/tegra_camera/common.c index 41685abc38b6..1ea3447e945c 100644 --- a/drivers/media/platform/soc_camera/tegra_camera/common.c +++ b/drivers/media/platform/soc_camera/tegra_camera/common.c @@ -942,6 +942,9 @@ static int tegra_camera_remove(struct platform_device *pdev) vb2_dma_contig_cleanup_ctx(cam->alloc_ctx); if (cam->ops) + cam->ops->free_syncpts(cam); + + if (cam->ops) cam->ops->clks_deinit(cam); kfree(cam); diff --git a/drivers/media/platform/soc_camera/tegra_camera/common.h b/drivers/media/platform/soc_camera/tegra_camera/common.h index 76de2a070cc6..3e713c8c550d 100644 --- a/drivers/media/platform/soc_camera/tegra_camera/common.h +++ b/drivers/media/platform/soc_camera/tegra_camera/common.h @@ -68,6 +68,7 @@ struct tegra_camera_ops { int (*capture_stop)(struct tegra_camera_dev *vi2_cam, int port); void (*init_syncpts)(struct tegra_camera_dev *vi2_cam); + void (*free_syncpts)(struct tegra_camera_dev *vi2_cam); void (*incr_syncpts)(struct tegra_camera_dev *vi2_cam); void (*save_syncpts)(struct tegra_camera_dev *vi2_cam); diff --git a/drivers/media/platform/soc_camera/tegra_camera/vi.c b/drivers/media/platform/soc_camera/tegra_camera/vi.c index 6bdec974164d..1f07d6895d9f 100644 --- a/drivers/media/platform/soc_camera/tegra_camera/vi.c +++ b/drivers/media/platform/soc_camera/tegra_camera/vi.c @@ -412,6 +412,15 @@ static void vi_init_syncpts(struct tegra_camera_dev *cam) cam->syncpt_id_vip = nvhost_get_syncpt_client_managed("vi_vip"); } +static void vi_free_syncpts(struct tegra_camera_dev *cam) +{ + nvhost_free_syncpt(cam->syncpt_id_csi_a); + + nvhost_free_syncpt(cam->syncpt_id_csi_b); + + nvhost_free_syncpt(cam->syncpt_id_vip); +} + static void vi_save_syncpts(struct tegra_camera_dev *cam) { u32 val; @@ -1057,6 +1066,7 @@ struct tegra_camera_ops vi_ops = { .deactivate = vi_powergate, .init_syncpts = vi_init_syncpts, + .free_syncpts = vi_free_syncpts, .save_syncpts = vi_save_syncpts, .incr_syncpts = vi_incr_syncpts, diff --git a/drivers/media/platform/soc_camera/tegra_camera/vi2.c b/drivers/media/platform/soc_camera/tegra_camera/vi2.c index 8fc4618c2546..b97e0b341fe0 100644 --- a/drivers/media/platform/soc_camera/tegra_camera/vi2.c +++ b/drivers/media/platform/soc_camera/tegra_camera/vi2.c @@ -435,6 +435,13 @@ static void vi2_init_syncpts(struct tegra_camera_dev *cam) cam->syncpt_id_csi_b = nvhost_get_syncpt_client_managed("vi_csi_B"); } +static void vi2_free_syncpts(struct tegra_camera_dev *cam) +{ + nvhost_free_syncpt(cam->syncpt_id_csi_a); + + nvhost_free_syncpt(cam->syncpt_id_csi_b); +} + static void vi2_save_syncpts(struct tegra_camera_dev *cam) { u32 val; @@ -802,6 +809,7 @@ struct tegra_camera_ops vi2_ops = { .activate = vi2_sw_reset, .init_syncpts = vi2_init_syncpts, + .free_syncpts = vi2_free_syncpts, .save_syncpts = vi2_save_syncpts, .incr_syncpts = vi2_incr_syncpts, |