]> rtime.felk.cvut.cz Git - sojka/nv-tegra/linux-3.10.git/commitdiff
video: tegra: camera: export symbols for VI module
authorBryan Wu <pengw@nvidia.com>
Thu, 1 Aug 2013 18:46:15 +0000 (11:46 -0700)
committerDan Willemsen <dwillemsen@nvidia.com>
Sat, 14 Sep 2013 20:40:19 +0000 (13:40 -0700)
If VI driver is built as a module, it needs some symbols from tegra
camera driver.

It also fixed some errors when we unload VI driver module:
 - remove debugfs entry
 - unregister misc device driver
 - release regulator
 - release mutex lock when tegra_camera_powergate_init() fails

Bug 1240806

Change-Id: Ie0a2718d96a80c2bd0c2cc441763593753fe8bea
Signed-off-by: Bryan Wu <pengw@nvidia.com>
Reviewed-on: http://git-master/r/256967
Reviewed-by: Automatic_Commit_Validation_User
Reviewed-by: Terje Bergstrom <tbergstrom@nvidia.com>
Reviewed-by: Allen Martin <amartin@nvidia.com>
drivers/video/tegra/camera/camera.c

index 608afc3dcffc9eb72704f4fea66b8c8618bec537..9b0782b08cb71cea09e653a1e64fd17790d3e7b3 100644 (file)
@@ -13,6 +13,7 @@
  * GNU General Public License for more details.
  *
  */
+#include <linux/export.h>
 
 #include <linux/debugfs.h>
 #include <linux/seq_file.h>
@@ -305,9 +306,12 @@ struct tegra_camera *tegra_camera_register(struct platform_device *ndev)
        /* Powergate VE when boot */
        mutex_lock(&camera->tegra_camera_lock);
 #ifndef CONFIG_ARCH_TEGRA_2x_SOC
+
        ret = tegra_camera_powergate_init(camera);
-       if (ret)
+       if (ret) {
+               mutex_unlock(&camera->tegra_camera_lock);
                goto regulator_fail;
+       }
 #endif
        mutex_unlock(&camera->tegra_camera_lock);
 
@@ -380,23 +384,36 @@ regulator_fail:
        camera = NULL;
        return camera;
 }
+EXPORT_SYMBOL(tegra_camera_register);
 
 int tegra_camera_unregister(struct tegra_camera *camera)
 {
        int i;
+       int ret;
 
        dev_info(camera->dev, "%s: ++\n", __func__);
 
+       tegra_camera_remove_debugfs(camera);
+
        /* Free IRQ */
        tegra_camera_intr_free(camera);
 
        for (i = 0; i < CAMERA_CLK_MAX; i++)
                clk_put(camera->clock[i].clk);
        tegra_camera_isomgr_unregister(camera);
+
+       ret = misc_deregister(&camera->misc_dev);
+       if (ret)
+               dev_err(camera->dev, "deregister misc dev fail, %d\n", ret);
+
+       if (camera->reg)
+               regulator_put(camera->reg);
+
        kfree(camera);
 
        return 0;
 }
+EXPORT_SYMBOL(tegra_camera_unregister);
 
 #ifdef CONFIG_PM
 int tegra_camera_suspend(struct tegra_camera *camera)
@@ -415,10 +432,12 @@ int tegra_camera_suspend(struct tegra_camera *camera)
 
        return ret;
 }
+EXPORT_SYMBOL(tegra_camera_suspend);
 
 int tegra_camera_resume(struct tegra_camera *camera)
 {
        dev_info(camera->dev, "%s: ++\n", __func__);
        return 0;
 }
+EXPORT_SYMBOL(tegra_camera_resume);
 #endif