]> rtime.felk.cvut.cz Git - sojka/nv-tegra/linux-3.10.git/commitdiff
media: tegra_camera: free syncpts at driver remove
authorDeepak Nibade <dnibade@nvidia.com>
Fri, 28 Mar 2014 06:16:46 +0000 (11:46 +0530)
committerTerje Bergstrom <tbergstrom@nvidia.com>
Mon, 31 Mar 2014 07:10:26 +0000 (00:10 -0700)
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>
drivers/media/platform/soc_camera/tegra_camera/common.c
drivers/media/platform/soc_camera/tegra_camera/common.h
drivers/media/platform/soc_camera/tegra_camera/vi.c
drivers/media/platform/soc_camera/tegra_camera/vi2.c

index 41685abc38b65a7a30a2a0d5e0c9013be9fa3fb2..1ea3447e945cb8f5c71f91bd696a39ee7878d1b5 100644 (file)
@@ -941,6 +941,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);
 
index 76de2a070cc6e07048828fd1836942a5127360e4..3e713c8c550d9af816f280b8c12d25a4e6ecc405 100644 (file)
@@ -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);
 
index 6bdec974164d82b23774c64be27232b82d58fb04..1f07d6895d9fffdf2eb251800cdadb9fb08ea03e 100644 (file)
@@ -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,
 
index 8fc4618c2546823ac6a99046fb0841b02507c498..b97e0b341fe0574b90ebbdf3a3731358922cebff 100644 (file)
@@ -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,