summaryrefslogtreecommitdiff
path: root/drivers/media/platform/tegra/nvavp/nvavp_dev.c
diff options
context:
space:
mode:
authorJitendra Kumar <jitendrak@nvidia.com>2014-04-28 21:13:27 +0530
committerMandar Padmawar <mpadmawar@nvidia.com>2014-05-09 06:41:17 -0700
commit315ef73b778ca43ce461a6ff75a3c65ac9d38c42 (patch)
treeab2648b986b66f65b72741d2b5dc5396a738b46b /drivers/media/platform/tegra/nvavp/nvavp_dev.c
parent4fa462cf5c870613bf05590dfb5d0a44c8b2d13c (diff)
media: tegra: nvavp: Handle init race condition
Call to nvavp_init from tegra_nvavp_open and tegra_nvavp_runtime_resume leads to race condition. This change is to handle it properly. Bug 1487327 Signed-off-by: Jitendra Kumar <jitendrak@nvidia.com> Change-Id: I5b9981149e6d84e02951d9c9b7f08b1ff44d82fd Reviewed-on: http://git-master/r/404304 (cherry picked from commit 476f2f2b863365979cc3429f369c072720b8c41f) Reviewed-on: http://git-master/r/406909 Reviewed-by: Mandar Padmawar <mpadmawar@nvidia.com> Tested-by: Mandar Padmawar <mpadmawar@nvidia.com>
Diffstat (limited to 'drivers/media/platform/tegra/nvavp/nvavp_dev.c')
-rw-r--r--drivers/media/platform/tegra/nvavp/nvavp_dev.c13
1 files changed, 8 insertions, 5 deletions
diff --git a/drivers/media/platform/tegra/nvavp/nvavp_dev.c b/drivers/media/platform/tegra/nvavp/nvavp_dev.c
index 4593816c6f05..5375c874a67d 100644
--- a/drivers/media/platform/tegra/nvavp/nvavp_dev.c
+++ b/drivers/media/platform/tegra/nvavp/nvavp_dev.c
@@ -187,8 +187,11 @@ static struct nvavp_info *nvavp_info_ctx;
static int nvavp_runtime_get(struct nvavp_info *nvavp)
{
- if (nvavp->init_task != current)
+ if (nvavp->init_task != current) {
+ mutex_unlock(&nvavp->open_lock);
pm_runtime_get_sync(&nvavp->nvhost_dev->dev);
+ mutex_lock(&nvavp->open_lock);
+ }
else
pm_runtime_get_noresume(&nvavp->nvhost_dev->dev);
@@ -2557,6 +2560,8 @@ static int tegra_nvavp_runtime_resume(struct device *dev)
struct platform_device *pdev = to_platform_device(dev);
struct nvavp_info *nvavp = platform_get_drvdata(pdev);
+ mutex_lock(&nvavp->open_lock);
+
if (nvavp->video_refcnt)
nvavp_init(nvavp, NVAVP_VIDEO_CHANNEL);
#if defined(CONFIG_TEGRA_NVAVP_AUDIO)
@@ -2564,6 +2569,8 @@ static int tegra_nvavp_runtime_resume(struct device *dev)
nvavp_init(nvavp, NVAVP_AUDIO_CHANNEL);
#endif
+ mutex_unlock(&nvavp->open_lock);
+
return 0;
}
@@ -2572,15 +2579,11 @@ static int tegra_nvavp_resume(struct device *dev)
struct platform_device *pdev = to_platform_device(dev);
struct nvavp_info *nvavp = platform_get_drvdata(pdev);
- mutex_lock(&nvavp->open_lock);
-
/* To balance the unpowergate in suspend routine */
nvavp_powergate_vde(nvavp);
tegra_nvavp_runtime_resume(dev);
- mutex_unlock(&nvavp->open_lock);
-
return 0;
}