summaryrefslogtreecommitdiff
path: root/drivers/media
diff options
context:
space:
mode:
authorJaiprakash Khemkar <jkhemkar@nvidia.com>2012-10-16 14:33:03 +0530
committerSimone Willett <swillett@nvidia.com>2012-10-29 15:11:09 -0700
commit123901e38b650c6c1f40ad4046b8c6eac63c1c31 (patch)
tree48278eede72bb178ad01584bce824465e4f0167e /drivers/media
parent98741168321d1e074b5b3c10873793b3ec5a2c91 (diff)
video: tegra: nvavp: Powergate VDE
Bug 1059487 Change-Id: I55f51064070888007be6978b7317288bf5dc6c31 Signed-off-by: Jaiprakash Khemkar <jkhemkar@nvidia.com> Reviewed-on: http://git-master/r/147483 Reviewed-by: Automatic_Commit_Validation_User Reviewed-by: Mohan Nimaje <mnimaje@nvidia.com> Reviewed-by: Chandrakanth Gorantla <cgorantla@nvidia.com> Reviewed-by: Vinayak Pore <vpore@nvidia.com> Reviewed-by: Bharat Nihalani <bnihalani@nvidia.com> Reviewed-by: Gajanan Bhat <gbhat@nvidia.com>
Diffstat (limited to 'drivers/media')
-rw-r--r--drivers/media/video/tegra/nvavp/nvavp_dev.c40
1 files changed, 40 insertions, 0 deletions
diff --git a/drivers/media/video/tegra/nvavp/nvavp_dev.c b/drivers/media/video/tegra/nvavp/nvavp_dev.c
index 251796a1d565..e2c9e9b80a62 100644
--- a/drivers/media/video/tegra/nvavp/nvavp_dev.c
+++ b/drivers/media/video/tegra/nvavp/nvavp_dev.c
@@ -42,6 +42,7 @@
#include <mach/iomap.h>
#include <mach/legacy_irq.h>
#include <linux/nvmap.h>
+#include <mach/powergate.h>
#if defined(CONFIG_TEGRA_AVP_KERNEL_ON_MMU)
#include "../avp/headavp.h"
@@ -259,12 +260,45 @@ static struct clk *nvavp_clk_get(struct nvavp_info *nvavp, int id)
return NULL;
}
+static int nvavp_powergate_vde(struct nvavp_info *nvavp)
+{
+ int ret = 0;
+
+ dev_dbg(&nvavp->nvhost_dev->dev, "%s++\n", __func__);
+
+ /* Powergate VDE */
+ ret = tegra_powergate_partition(TEGRA_POWERGATE_VDEC);
+ if (ret)
+ dev_err(&nvavp->nvhost_dev->dev,
+ "%s: powergate failed\n",
+ __func__);
+
+ return ret;
+}
+
+static int nvavp_unpowergate_vde(struct nvavp_info *nvavp)
+{
+ int ret = 0;
+
+ dev_dbg(&nvavp->nvhost_dev->dev, "%s++\n", __func__);
+
+ /* UnPowergate VDE */
+ ret = tegra_unpowergate_partition(TEGRA_POWERGATE_VDEC);
+ if (ret)
+ dev_err(&nvavp->nvhost_dev->dev,
+ "%s: unpowergate failed\n",
+ __func__);
+
+ return ret;
+}
+
static void nvavp_clks_enable(struct nvavp_info *nvavp)
{
if (nvavp->clk_enabled++ == 0) {
nvhost_module_busy_ext(nvhost_get_parent(nvavp->nvhost_dev));
clk_prepare_enable(nvavp->bsev_clk);
clk_prepare_enable(nvavp->vde_clk);
+ nvavp_unpowergate_vde(nvavp);
clk_set_rate(nvavp->emc_clk, nvavp->emc_clk_rate);
clk_set_rate(nvavp->sclk, nvavp->sclk_rate);
dev_dbg(&nvavp->nvhost_dev->dev, "%s: setting sclk to %lu\n",
@@ -281,6 +315,7 @@ static void nvavp_clks_disable(struct nvavp_info *nvavp)
clk_disable_unprepare(nvavp->vde_clk);
clk_set_rate(nvavp->emc_clk, 0);
clk_set_rate(nvavp->sclk, 0);
+ nvavp_powergate_vde(nvavp);
nvhost_module_idle_ext(nvhost_get_parent(nvavp->nvhost_dev));
dev_dbg(&nvavp->nvhost_dev->dev, "%s: resetting emc_clk "
"and sclk\n", __func__);
@@ -1841,6 +1876,11 @@ static int tegra_nvavp_suspend(struct nvhost_device *ndev, pm_message_t state)
}
}
+ /* Partition vde has to be left on before suspend for the
+ * device to wakeup on resume
+ */
+ nvavp_unpowergate_vde(nvavp);
+
mutex_unlock(&nvavp->open_lock);
return ret;
}