summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAlex Frid <afrid@nvidia.com>2011-07-13 18:55:44 -0700
committerVarun Colbert <vcolbert@nvidia.com>2011-07-15 16:09:48 -0700
commit3239dc690305147fc7d368eca44b5b47553969f5 (patch)
treeace1f49e01fb9c9765290db6e2aed60ec336be30
parent614180886aee985f0a2f1ca31d500ecd7d490d5c (diff)
ARM: tegra: clock: Update EMC parents after deep sleep
On Tegra3 EMC parents may be changed underneath clock framework by low level resume code. Updated parents ref-count respectively in such case. Change-Id: Ib3fbe4915c5f5a24dcf1686f060e9bc1144c8559 Reviewed-on: http://git-master/r/40959 Reviewed-by: Varun Colbert <vcolbert@nvidia.com> Tested-by: Varun Colbert <vcolbert@nvidia.com>
-rw-r--r--arch/arm/mach-tegra/tegra3_clocks.c18
1 files changed, 16 insertions, 2 deletions
diff --git a/arch/arm/mach-tegra/tegra3_clocks.c b/arch/arm/mach-tegra/tegra3_clocks.c
index c20b66fb354a..807e9b32e08e 100644
--- a/arch/arm/mach-tegra/tegra3_clocks.c
+++ b/arch/arm/mach-tegra/tegra3_clocks.c
@@ -4323,6 +4323,7 @@ void tegra_clk_resume(void)
u32 plla_base;
u32 plld_base;
u32 plld2_base;
+ struct clk *p;
val = clk_readl(OSC_CTRL) & ~OSC_CTRL_MASK;
val |= *ctx++;
@@ -4421,9 +4422,22 @@ void tegra_clk_resume(void)
clk_writel(plld_base, tegra_pll_d.reg + PLL_BASE);
clk_writel(plld2_base, tegra_pll_d2.reg + PLL_BASE);
- /* Since EMC clock is not restored update current state, and mark
- EMC DFS as out of sync */
+ /* Since EMC clock is not restored, and may not preserve parent across
+ suspend, update current state, and mark EMC DFS as out of sync */
+ p = tegra_clk_emc.parent;
tegra3_periph_clk_init(&tegra_clk_emc);
+
+ if (p != tegra_clk_emc.parent) {
+ /* FIXME: old parent is left enabled here even if EMC was its
+ only child before suspend (never happens on Tegra3) */
+ pr_debug("EMC parent(refcount) across suspend: %s(%d) : %s(%d)",
+ p->name, p->refcnt, tegra_clk_emc.parent->name,
+ tegra_clk_emc.parent->refcnt);
+
+ BUG_ON(!p->refcnt);
+ p->refcnt--;
+ tegra_clk_emc.parent->refcnt++;
+ }
tegra_emc_timing_invalidate();
tegra3_pll_clk_init(&tegra_pll_u); /* Re-init utmi parameters */