diff options
author | Jaiprakash Khemkar <jkhemkar@nvidia.com> | 2012-10-16 14:33:03 +0530 |
---|---|---|
committer | Simone Willett <swillett@nvidia.com> | 2012-10-29 15:11:09 -0700 |
commit | 123901e38b650c6c1f40ad4046b8c6eac63c1c31 (patch) | |
tree | 48278eede72bb178ad01584bce824465e4f0167e /drivers/media | |
parent | 98741168321d1e074b5b3c10873793b3ec5a2c91 (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.c | 40 |
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; } |