aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJoseph Lo <josephl@nvidia.com>2013-07-03 05:50:44 -0400
committerStephen Warren <swarren@nvidia.com>2013-07-19 12:08:08 -0400
commitad7d114083afda5fbbb52488c42b4a17107c6872 (patch)
treef58169470deecbb2ce8ce17b44e49f9c295f5550
parentdd6fe9a927eaaa98f70b44464a810e6e4d33318c (diff)
clk: tegra: add suspend/resume function for tegra_cpu_car_ops
Adding suspend/resume function for tegra_cpu_car_ops. We only save and restore the setting of the clock of CoreSight. Other clocks still need to be taken care by clock driver. Cc: Mike Turquette <mturquette@linaro.org> Signed-off-by: Joseph Lo <josephl@nvidia.com> Signed-off-by: Stephen Warren <swarren@nvidia.com>
-rw-r--r--drivers/clk/tegra/clk-tegra114.c26
1 files changed, 26 insertions, 0 deletions
diff --git a/drivers/clk/tegra/clk-tegra114.c b/drivers/clk/tegra/clk-tegra114.c
index b6015cb4fc01..f74ed194f723 100644
--- a/drivers/clk/tegra/clk-tegra114.c
+++ b/drivers/clk/tegra/clk-tegra114.c
@@ -290,6 +290,12 @@
290/* Tegra CPU clock and reset control regs */ 290/* Tegra CPU clock and reset control regs */
291#define CLK_RST_CONTROLLER_CPU_CMPLX_STATUS 0x470 291#define CLK_RST_CONTROLLER_CPU_CMPLX_STATUS 0x470
292 292
293#ifdef CONFIG_PM_SLEEP
294static struct cpu_clk_suspend_context {
295 u32 clk_csite_src;
296} tegra114_cpu_clk_sctx;
297#endif
298
293static int periph_clk_enb_refcnt[CLK_OUT_ENB_NUM * 32]; 299static int periph_clk_enb_refcnt[CLK_OUT_ENB_NUM * 32];
294 300
295static void __iomem *clk_base; 301static void __iomem *clk_base;
@@ -2142,9 +2148,29 @@ static void tegra114_disable_cpu_clock(u32 cpu)
2142 /* flow controller would take care in the power sequence. */ 2148 /* flow controller would take care in the power sequence. */
2143} 2149}
2144 2150
2151#ifdef CONFIG_PM_SLEEP
2152static void tegra114_cpu_clock_suspend(void)
2153{
2154 /* switch coresite to clk_m, save off original source */
2155 tegra114_cpu_clk_sctx.clk_csite_src =
2156 readl(clk_base + CLK_SOURCE_CSITE);
2157 writel(3 << 30, clk_base + CLK_SOURCE_CSITE);
2158}
2159
2160static void tegra114_cpu_clock_resume(void)
2161{
2162 writel(tegra114_cpu_clk_sctx.clk_csite_src,
2163 clk_base + CLK_SOURCE_CSITE);
2164}
2165#endif
2166
2145static struct tegra_cpu_car_ops tegra114_cpu_car_ops = { 2167static struct tegra_cpu_car_ops tegra114_cpu_car_ops = {
2146 .wait_for_reset = tegra114_wait_cpu_in_reset, 2168 .wait_for_reset = tegra114_wait_cpu_in_reset,
2147 .disable_clock = tegra114_disable_cpu_clock, 2169 .disable_clock = tegra114_disable_cpu_clock,
2170#ifdef CONFIG_PM_SLEEP
2171 .suspend = tegra114_cpu_clock_suspend,
2172 .resume = tegra114_cpu_clock_resume,
2173#endif
2148}; 2174};
2149 2175
2150static const struct of_device_id pmc_match[] __initconst = { 2176static const struct of_device_id pmc_match[] __initconst = {