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)
{
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;
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(¶meters_lock);
flags = switch_flags;
delay = switch_delay;
switch_flags = 0;
spin_unlock(¶meters_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;