diff options
author | Jitendra Kumar <jitendrak@nvidia.com> | 2014-04-28 21:13:27 +0530 |
---|---|---|
committer | Mandar Padmawar <mpadmawar@nvidia.com> | 2014-05-09 06:41:17 -0700 |
commit | 315ef73b778ca43ce461a6ff75a3c65ac9d38c42 (patch) | |
tree | ab2648b986b66f65b72741d2b5dc5396a738b46b /drivers/media/platform/tegra/nvavp/nvavp_dev.c | |
parent | 4fa462cf5c870613bf05590dfb5d0a44c8b2d13c (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.c | 13 |
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; } |