diff options
author | peter mikolajczyk <pmikolajczyk@nvidia.com> | 2011-10-25 14:12:20 -0700 |
---|---|---|
committer | Rohan Somvanshi <rsomvanshi@nvidia.com> | 2011-10-31 05:39:47 -0700 |
commit | 824b69dcaca1afb939add038fb53596582840552 (patch) | |
tree | 4a45f8cdc248b65d0a9e20347b48ba8db6ca2db7 | |
parent | 066682d454c2f00cefe9db60b6930106e3899a5d (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.c | 33 |
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 } }; |