ARM: tegra: cpufreq: Take an extra reference to pllx
authorColin Cross <ccross@android.com>
Thu, 21 Oct 2010 00:47:59 +0000 (17:47 -0700)
committerColin Cross <ccross@android.com>
Mon, 21 Feb 2011 08:10:45 +0000 (00:10 -0800)
During cpu frequency changes, take an extra reference to pllx so
that it doesn't turn off and on while the cpu is temporarily on
pllp.  If the cpu is moved to pllp permanently, pllx will be
turned off.

Acked-by: Olof Johansson <olof@lixom.net>
Signed-off-by: Colin Cross <ccross@android.com>
arch/arm/mach-tegra/cpu-tegra.c
arch/arm/mach-tegra/tegra2_clocks.c

index cda03f11550e2864adb08f3e578d9dbcb8f92695..f02ba603ceb75d40dc94cce70dabb282ae0517be 100644 (file)
@@ -173,6 +173,8 @@ static int tegra_cpu_init(struct cpufreq_policy *policy)
        if (IS_ERR(cpu_clk))
                return PTR_ERR(cpu_clk);
 
+       clk_enable(cpu_clk);
+
        cpufreq_frequency_table_cpuinfo(policy, freq_table);
        cpufreq_frequency_table_get_attr(freq_table, policy->cpu);
        policy->cur = tegra_getspeed(policy->cpu);
index ea07f513e90c5b389b44316616d2edbe5c6b9180..94793dd97aec196ca863da9d14f08dc155e7ae8c 100644 (file)
@@ -385,10 +385,16 @@ static void tegra2_cpu_clk_disable(struct clk *c)
 static int tegra2_cpu_clk_set_rate(struct clk *c, unsigned long rate)
 {
        int ret;
+       /*
+        * Take an extra reference to the main pll so it doesn't turn
+        * off when we move the cpu off of it
+        */
+       clk_enable(c->u.cpu.main);
+
        ret = clk_set_parent(c->parent, c->u.cpu.backup);
        if (ret) {
                pr_err("Failed to switch cpu to clock %s\n", c->u.cpu.backup->name);
-               return ret;
+               goto out;
        }
 
        if (rate == clk_get_rate(c->u.cpu.backup))
@@ -397,17 +403,18 @@ static int tegra2_cpu_clk_set_rate(struct clk *c, unsigned long rate)
        ret = clk_set_rate(c->u.cpu.main, rate);
        if (ret) {
                pr_err("Failed to change cpu pll to %lu\n", rate);
-               return ret;
+               goto out;
        }
 
        ret = clk_set_parent(c->parent, c->u.cpu.main);
        if (ret) {
                pr_err("Failed to switch cpu to clock %s\n", c->u.cpu.main->name);
-               return ret;
+               goto out;
        }
 
 out:
-       return 0;
+       clk_disable(c->u.cpu.main);
+       return ret;
 }
 
 static struct clk_ops tegra_cpu_ops = {