]> rtime.felk.cvut.cz Git - sojka/nv-tegra/linux-3.10.git/commitdiff
ARM: tegra: Move cluster switch code
authorSai Gurrappadi <sgurrappadi@nvidia.com>
Thu, 25 Sep 2014 19:02:11 +0000 (12:02 -0700)
committerDiwakar Tundlam <dtundlam@nvidia.com>
Tue, 30 Sep 2014 00:24:48 +0000 (17:24 -0700)
Moved out the cluster switch code to a more appriopriate location as
cluster switch doesn't have a direct dependency on CPU_FREQ. The callers
of cluster_switch will now have to ensure proper locking is done on
their end.

Also make sure clk rates are in the correct range on a cluster switch
request.

Change-Id: I6d90d0aae239cff0566714b9c34db04304aa63ca
Signed-off-by: Sai Gurrappadi <sgurrappadi@nvidia.com>
Reviewed-on: http://git-master/r/539057
Reviewed-by: Automatic_Commit_Validation_User
GVS: Gerrit_Virtual_Submit
Reviewed-by: Diwakar Tundlam <dtundlam@nvidia.com>
drivers/platform/tegra/cluster-control.c
drivers/platform/tegra/cpu-tegra.c
drivers/platform/tegra/tegra21_clocks.c

index 167408d028a6ff0c710ce1510993f47a8ca72179..cea34635fdb0c2abb87481f3dc45876da8ccac98 100644 (file)
@@ -174,6 +174,20 @@ int tegra_cluster_control(unsigned int us, unsigned int flags)
        return 0;
 }
 
+int tegra_cluster_switch(struct clk *cpu_clk, struct clk *new_clk)
+{
+       int ret;
+
+       ret = clk_set_parent(cpu_clk, new_clk);
+       if (ret)
+               return ret;
+
+       return 0;
+}
+
+void tegra_cluster_switch_prolog(unsigned int flags) {}
+void tegra_cluster_switch_epilog(unsigned int flags) {}
+
 #ifdef CONFIG_DEBUG_FS
 static int cluster_set(void *data, u64 val)
 {
index 85f03ec240a8f3978347c6d93bbb110cbe536683..55b94acba029342132553e37c15456a66ead6863 100644 (file)
@@ -709,57 +709,6 @@ _out:
        return 0;
 }
 
-#ifdef CONFIG_TEGRA_HMP_CLUSTER_CONTROL
-static int tegra_cluster_switch_locked(struct clk *cpu_clk, struct clk *new_clk)
-{
-       int ret;
-
-       ret = clk_set_parent(cpu_clk, new_clk);
-       if (ret)
-               return ret;
-
-       return 0;
-}
-
-/* Explicitly hold the lock here to protect manual cluster switch requests */
-int tegra_cluster_switch(struct clk *cpu_clk, struct clk *new_clk)
-{
-       int ret;
-       unsigned long speed, min, max;
-
-       /* Order hotplug lock before cpufreq lock. Deadlock otherwise. */
-       get_online_cpus();
-
-       mutex_lock(&tegra_cpu_lock);
-       speed = tegra_getspeed(0);
-       min = clk_get_min_rate(new_clk) / 1000;
-       max = clk_get_max_rate(new_clk) / 1000;
-
-       if (speed < min)
-               speed = min;
-       else if (speed > max)
-               speed = max;
-       else
-               speed = 0;
-
-       if (speed) {
-               ret = tegra_update_cpu_speed(speed);
-               if (ret)
-                       goto out;
-       }
-       ret = tegra_cluster_switch_locked(cpu_clk, new_clk);
-out:
-       mutex_unlock(&tegra_cpu_lock);
-
-       put_online_cpus();
-
-       return ret;
-}
-
-void tegra_cluster_switch_prolog(unsigned int flags) {}
-void tegra_cluster_switch_epilog(unsigned int flags) {}
-#endif
-
 unsigned int tegra_count_slow_cpus(unsigned long speed_limit)
 {
        unsigned int cnt = 0;
index 36e64a6137048f8d5504eb916249daf8056a0ba5..8afe7e4d8a4d7c1defdb1d2b8802da4e523b985d 100644 (file)
@@ -1424,36 +1424,32 @@ static int tegra21_cpu_cmplx_clk_set_parent(struct clk *c, struct clk *p)
        if (!sel->input)
                return -EINVAL;
 
+       /* over/under-clocking after switch - allow, but update rate */
+       if ((rate > p->max_rate) || (rate < p->min_rate)) {
+               rate = rate > p->max_rate ? p->max_rate : p->min_rate;
+               ret = clk_set_rate(c->parent, rate);
+               if (ret) {
+                       pr_err("%s: Failed to set rate %lu for %s\n",
+                                       __func__, rate, p->name);
+                       return ret;
+               }
+       }
+
 #if PARAMETERIZE_CLUSTER_SWITCH
        spin_lock(&parameters_lock);
        flags = switch_flags;
        delay = switch_delay;
        switch_flags = 0;
        spin_unlock(&parameters_lock);
-
-       if (flags) {
-               /* over/under-clocking after switch - allow, but update rate */
-               if ((rate > p->max_rate) || (rate < p->min_rate)) {
-                       rate = rate > p->max_rate ? p->max_rate : p->min_rate;
-                       ret = clk_set_rate(c->parent, rate);
-                       if (ret) {
-                               pr_err("%s: Failed to set rate %lu for %s\n",
-                                       __func__, rate, p->name);
-                               return ret;
-                       }
-               }
-       } else
 #endif
-       {
-               if (rate > p->max_rate) {       /* over-clocking - no switch */
-                       pr_warn("%s: No %s mode switch to %s at rate %lu\n",
-                                __func__, c->name, p->name, rate);
-                       return -ECANCELED;
-               }
-               flags = TEGRA_POWER_CLUSTER_IMMEDIATE;
-               flags |= TEGRA_POWER_CLUSTER_PART_DEFAULT;
-               delay = 0;
-       }
+       if (rate > p->max_rate) {       /* over-clocking - no switch */
+               pr_warn("%s: No %s mode switch to %s at rate %lu\n",
+                               __func__, c->name, p->name, rate);
+               return -ECANCELED;
+       }
+       flags = TEGRA_POWER_CLUSTER_IMMEDIATE;
+       flags |= TEGRA_POWER_CLUSTER_PART_DEFAULT;
+       delay = 0;
        flags |= (p->u.cpu.mode == MODE_LP) ? TEGRA_POWER_CLUSTER_LP :
                TEGRA_POWER_CLUSTER_G;