summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorpeter mikolajczyk <pmikolajczyk@nvidia.com>2011-10-25 14:12:20 -0700
committerRohan Somvanshi <rsomvanshi@nvidia.com>2011-10-31 05:39:47 -0700
commit824b69dcaca1afb939add038fb53596582840552 (patch)
tree4a45f8cdc248b65d0a9e20347b48ba8db6ca2db7
parent066682d454c2f00cefe9db60b6930106e3899a5d (diff)
media: video: tegra: Prevent sleep when cam open
Adding a check for camera open in order to prevent driver from allowing the system to go to sleep. Application layers must release camera before suspend is called bug 870768 Change-Id: I5df86a22e46af724fd2cf4d8a0440350cbd4aba2 Reviewed-on: http://git-master/r/60307 Reviewed-by: Nathan Lord <nlord@nvidia.com> Reviewed-by: Peter Mikolajczyk <pmikolajczyk@nvidia.com> Tested-by: Peter Mikolajczyk <pmikolajczyk@nvidia.com> Tested-by: Gerrit_Virtual_Submit Reviewed-by: Jon Mayo <jmayo@nvidia.com>
-rw-r--r--drivers/media/video/tegra/tegra_camera.c33
1 files changed, 33 insertions, 0 deletions
diff --git a/drivers/media/video/tegra/tegra_camera.c b/drivers/media/video/tegra/tegra_camera.c
index 309ddc4a47d2..f163a2011f78 100644
--- a/drivers/media/video/tegra/tegra_camera.c
+++ b/drivers/media/video/tegra/tegra_camera.c
@@ -109,6 +109,20 @@ struct tegra_camera_block tegra_camera_block[] = {
#define TEGRA_CAMERA_PD2VI_CLK_SEL_VI_SENSOR_CLK (1<<25)
#define TEGRA_CAMERA_PD2VI_CLK_SEL_PD2VI_CLK 0
+static bool tegra_camera_enabled(struct platform_device *pdev)
+{
+ bool ret = false;
+ struct tegra_camera_dev *dev = platform_get_drvdata(pdev);
+
+ mutex_lock(&dev->tegra_camera_lock);
+ ret = tegra_camera_block[TEGRA_CAMERA_MODULE_ISP].is_enabled == true ||
+ tegra_camera_block[TEGRA_CAMERA_MODULE_VI].is_enabled == true ||
+ tegra_camera_block[TEGRA_CAMERA_MODULE_CSI].is_enabled == true ||
+ dev->power_refcnt != 0;
+ mutex_unlock(&dev->tegra_camera_lock);
+ return ret;
+}
+
static int tegra_camera_clk_set_rate(struct tegra_camera_dev *dev)
{
u32 offset;
@@ -494,9 +508,28 @@ static int tegra_camera_remove(struct platform_device *pdev)
return 0;
}
+static int tegra_camera_suspend(struct platform_device *pdev, pm_message_t state)
+{
+ int ret = 0;
+
+ if (tegra_camera_enabled(pdev)) {
+ ret = -EBUSY;
+ pr_info("tegra_camera cannot suspend, application is holding on to camera. \n");
+ }
+
+ return ret;
+}
+
+static int tegra_camera_resume(struct platform_device *pdev)
+{
+ return 0;
+}
+
static struct platform_driver tegra_camera_driver = {
.probe = tegra_camera_probe,
.remove = tegra_camera_remove,
+ .suspend = tegra_camera_suspend,
+ .resume = tegra_camera_resume,
.driver = { .name = TEGRA_CAMERA_NAME }
};