#include <linux/io.h>
#include <linux/suspend.h>
+#include <asm/smp_twd.h>
#include <asm/system.h>
#include <mach/hardware.h>
return rate;
}
+static void tegra_cpufreq_rescale_twd_other_cpu(void *data) {
+ unsigned long new_rate = *(unsigned long *)data;
+ twd_recalc_prescaler(new_rate);
+}
+
+static void tegra_cpufreq_rescale_twds(unsigned long new_rate)
+{
+ twd_recalc_prescaler(new_rate);
+ smp_call_function(tegra_cpufreq_rescale_twd_other_cpu, &new_rate, 1);
+}
+
static int tegra_update_cpu_speed(unsigned long rate)
{
int ret = 0;
for_each_online_cpu(freqs.cpu)
cpufreq_notify_transition(&freqs, CPUFREQ_PRECHANGE);
+ if (freqs.new > freqs.old)
+ tegra_cpufreq_rescale_twds(freqs.new * 1000);
+
#ifdef CONFIG_CPU_FREQ_DEBUG
printk(KERN_DEBUG "cpufreq-tegra: transition: %u --> %u\n",
freqs.old, freqs.new);
return ret;
}
+ if (freqs.new < freqs.old)
+ tegra_cpufreq_rescale_twds(freqs.new * 1000);
+
for_each_online_cpu(freqs.cpu)
cpufreq_notify_transition(&freqs, CPUFREQ_POSTCHANGE);