cpufreq: move freq change notifications to cpufreq core
Most of the drivers do following in their ->target_index() routines: struct cpufreq_freqs freqs; freqs.old = old freq... freqs.new = new freq... cpufreq_notify_transition(policy, &freqs, CPUFREQ_PRECHANGE); /* Change rate here */ cpufreq_notify_transition(policy, &freqs, CPUFREQ_POSTCHANGE); This is replicated over all cpufreq drivers today and there doesn't exists a good enough reason why this shouldn't be moved to cpufreq core instead. There are few special cases though, like exynos5440, which doesn't do everything on the call to ->target_index() routine and call some kind of bottom halves for doing this work, work/tasklet/etc.. They may continue doing notification from their own code as flag: CPUFREQ_ASYNC_NOTIFICATION is already set for them. All drivers are also modified in this patch to avoid breaking 'git bisect', as double notification would happen otherwise. Acked-by: Hans-Christian Egtvedt <egtvedt@samfundet.no> Acked-by: Jesper Nilsson <jesper.nilsson@axis.com> Acked-by: Linus Walleij <linus.walleij@linaro.org> Acked-by: Russell King <linux@arm.linux.org.uk> Acked-by: Stephen Warren <swarren@nvidia.com> Tested-by: Andrew Lunn <andrew@lunn.ch> Tested-by: Nicolas Pitre <nicolas.pitre@linaro.org> Reviewed-by: Lan Tianyu <tianyu.lan@intel.com> Signed-off-by: Viresh Kumar <viresh.kumar@linaro.org> Signed-off-by: Rafael J. Wysocki <rafael.j.wysocki@intel.com>
This commit is contained in:

committed by
Rafael J. Wysocki

parent
7dbf694db6
commit
d4019f0a92
@@ -220,7 +220,7 @@ static int s3c2416_cpufreq_set_target(struct cpufreq_policy *policy,
|
||||
unsigned int index)
|
||||
{
|
||||
struct s3c2416_data *s3c_freq = &s3c2416_cpufreq;
|
||||
struct cpufreq_freqs freqs;
|
||||
unsigned int new_freq;
|
||||
int idx, ret, to_dvs = 0;
|
||||
|
||||
mutex_lock(&cpufreq_lock);
|
||||
@@ -237,25 +237,14 @@ static int s3c2416_cpufreq_set_target(struct cpufreq_policy *policy,
|
||||
goto out;
|
||||
}
|
||||
|
||||
freqs.flags = 0;
|
||||
freqs.old = s3c_freq->is_dvs ? FREQ_DVS
|
||||
: clk_get_rate(s3c_freq->armclk) / 1000;
|
||||
|
||||
/* When leavin dvs mode, always switch the armdiv to the hclk rate
|
||||
* The S3C2416 has stability issues when switching directly to
|
||||
* higher frequencies.
|
||||
*/
|
||||
freqs.new = (s3c_freq->is_dvs && !to_dvs)
|
||||
new_freq = (s3c_freq->is_dvs && !to_dvs)
|
||||
? clk_get_rate(s3c_freq->hclk) / 1000
|
||||
: s3c_freq->freq_table[index].frequency;
|
||||
|
||||
pr_debug("cpufreq: Transition %d-%dkHz\n", freqs.old, freqs.new);
|
||||
|
||||
if (!to_dvs && freqs.old == freqs.new)
|
||||
goto out;
|
||||
|
||||
cpufreq_notify_transition(policy, &freqs, CPUFREQ_PRECHANGE);
|
||||
|
||||
if (to_dvs) {
|
||||
pr_debug("cpufreq: enter dvs\n");
|
||||
ret = s3c2416_cpufreq_enter_dvs(s3c_freq, idx);
|
||||
@@ -263,12 +252,10 @@ static int s3c2416_cpufreq_set_target(struct cpufreq_policy *policy,
|
||||
pr_debug("cpufreq: leave dvs\n");
|
||||
ret = s3c2416_cpufreq_leave_dvs(s3c_freq, idx);
|
||||
} else {
|
||||
pr_debug("cpufreq: change armdiv to %dkHz\n", freqs.new);
|
||||
ret = s3c2416_cpufreq_set_armdiv(s3c_freq, freqs.new);
|
||||
pr_debug("cpufreq: change armdiv to %dkHz\n", new_freq);
|
||||
ret = s3c2416_cpufreq_set_armdiv(s3c_freq, new_freq);
|
||||
}
|
||||
|
||||
cpufreq_notify_transition(policy, &freqs, CPUFREQ_POSTCHANGE);
|
||||
|
||||
out:
|
||||
mutex_unlock(&cpufreq_lock);
|
||||
|
||||
|
Reference in New Issue
Block a user