Message ID | 1342713281-31114-2-git-send-email-shawn.guo@linaro.org (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
On Thu, Jul 19, 2012 at 9:24 PM, Shawn Guo <shawn.guo@linaro.org> wrote: > > From: Richard Zhao <richard.zhao@linaro.org> > > If CONFIG_SMP, cpufreq skips loops_per_jiffy update, because different > arch has different per-cpu loops_per_jiffy definition. > > Signed-off-by: Richard Zhao <richard.zhao@linaro.org> > Acked-by: Russell King <rmk+kernel@arm.linux.org.uk> > --- Nice. Avoids other driver duplicating this code. May be you can keep Richard's credit in commit too. FWIW, Acked-by: Santosh Shilimkar <santosh.shilimkar@ti.com>
On Fri, Jul 20, 2012 at 12:06:50PM +0530, Shilimkar, Santosh wrote: > On Thu, Jul 19, 2012 at 9:24 PM, Shawn Guo <shawn.guo@linaro.org> wrote: > > > > From: Richard Zhao <richard.zhao@linaro.org> > > > > If CONFIG_SMP, cpufreq skips loops_per_jiffy update, because different > > arch has different per-cpu loops_per_jiffy definition. > > > > Signed-off-by: Richard Zhao <richard.zhao@linaro.org> > > Acked-by: Russell King <rmk+kernel@arm.linux.org.uk> > > --- > Nice. Avoids other driver duplicating this code. > May be you can keep Richard's credit in commit too. > It's all Richard's credit in the commit. > FWIW, Acked-by: Santosh Shilimkar <santosh.shilimkar@ti.com> Thanks.
n Fri, Jul 20, 2012 at 1:26 PM, Shawn Guo <shawn.guo@linaro.org> wrote: > On Fri, Jul 20, 2012 at 12:06:50PM +0530, Shilimkar, Santosh wrote: >> On Thu, Jul 19, 2012 at 9:24 PM, Shawn Guo <shawn.guo@linaro.org> wrote: >> > >> > From: Richard Zhao <richard.zhao@linaro.org> >> > >> > If CONFIG_SMP, cpufreq skips loops_per_jiffy update, because different >> > arch has different per-cpu loops_per_jiffy definition. >> > >> > Signed-off-by: Richard Zhao <richard.zhao@linaro.org> >> > Acked-by: Russell King <rmk+kernel@arm.linux.org.uk> >> > --- >> Nice. Avoids other driver duplicating this code. >> May be you can keep Richard's credit in commit too. >> > It's all Richard's credit in the commit. > Sorry.... I missed that :-(
diff --git a/arch/arm/kernel/smp.c b/arch/arm/kernel/smp.c index 2c7217d..83412d2 100644 --- a/arch/arm/kernel/smp.c +++ b/arch/arm/kernel/smp.c @@ -25,6 +25,7 @@ #include <linux/percpu.h> #include <linux/clockchips.h> #include <linux/completion.h> +#include <linux/cpufreq.h> #include <linux/atomic.h> #include <asm/cacheflush.h> @@ -583,3 +584,56 @@ int setup_profiling_timer(unsigned int multiplier) { return -EINVAL; } + +#ifdef CONFIG_CPU_FREQ + +static DEFINE_PER_CPU(unsigned long, l_p_j_ref); +static DEFINE_PER_CPU(unsigned long, l_p_j_ref_freq); +static unsigned long global_l_p_j_ref; +static unsigned long global_l_p_j_ref_freq; + +static int cpufreq_callback(struct notifier_block *nb, + unsigned long val, void *data) +{ + struct cpufreq_freqs *freq = data; + int cpu = freq->cpu; + + if (freq->flags & CPUFREQ_CONST_LOOPS) + return NOTIFY_OK; + + if (!per_cpu(l_p_j_ref, cpu)) { + per_cpu(l_p_j_ref, cpu) = + per_cpu(cpu_data, cpu).loops_per_jiffy; + per_cpu(l_p_j_ref_freq, cpu) = freq->old; + if (!global_l_p_j_ref) { + global_l_p_j_ref = loops_per_jiffy; + global_l_p_j_ref_freq = freq->old; + } + } + + if ((val == CPUFREQ_PRECHANGE && freq->old < freq->new) || + (val == CPUFREQ_POSTCHANGE && freq->old > freq->new) || + (val == CPUFREQ_RESUMECHANGE || val == CPUFREQ_SUSPENDCHANGE)) { + loops_per_jiffy = cpufreq_scale(global_l_p_j_ref, + global_l_p_j_ref_freq, + freq->new); + per_cpu(cpu_data, cpu).loops_per_jiffy = + cpufreq_scale(per_cpu(l_p_j_ref, cpu), + per_cpu(l_p_j_ref_freq, cpu), + freq->new); + } + return NOTIFY_OK; +} + +static struct notifier_block cpufreq_notifier = { + .notifier_call = cpufreq_callback, +}; + +static int __init register_cpufreq_notifier(void) +{ + return cpufreq_register_notifier(&cpufreq_notifier, + CPUFREQ_TRANSITION_NOTIFIER); +} +core_initcall(register_cpufreq_notifier); + +#endif