aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/cpufreq/s3c2416-cpufreq.c
diff options
context:
space:
mode:
authorViresh Kumar <viresh.kumar@linaro.org>2013-08-14 10:08:24 -0400
committerRafael J. Wysocki <rafael.j.wysocki@intel.com>2013-10-30 19:11:08 -0400
commitd4019f0a92ab802f385cc9c8ad3ab7b5449712cb (patch)
treeebd06695585e457ae1bf219653452b111e7508db /drivers/cpufreq/s3c2416-cpufreq.c
parent7dbf694db6ac7c759599316d50d7050efcbd512a (diff)
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>
Diffstat (limited to 'drivers/cpufreq/s3c2416-cpufreq.c')
-rw-r--r--drivers/cpufreq/s3c2416-cpufreq.c21
1 files changed, 4 insertions, 17 deletions
diff --git a/drivers/cpufreq/s3c2416-cpufreq.c b/drivers/cpufreq/s3c2416-cpufreq.c
index 4188accd34ab..8d904a00027b 100644
--- a/drivers/cpufreq/s3c2416-cpufreq.c
+++ b/drivers/cpufreq/s3c2416-cpufreq.c
@@ -220,7 +220,7 @@ static int s3c2416_cpufreq_set_target(struct cpufreq_policy *policy,
220 unsigned int index) 220 unsigned int index)
221{ 221{
222 struct s3c2416_data *s3c_freq = &s3c2416_cpufreq; 222 struct s3c2416_data *s3c_freq = &s3c2416_cpufreq;
223 struct cpufreq_freqs freqs; 223 unsigned int new_freq;
224 int idx, ret, to_dvs = 0; 224 int idx, ret, to_dvs = 0;
225 225
226 mutex_lock(&cpufreq_lock); 226 mutex_lock(&cpufreq_lock);
@@ -237,25 +237,14 @@ static int s3c2416_cpufreq_set_target(struct cpufreq_policy *policy,
237 goto out; 237 goto out;
238 } 238 }
239 239
240 freqs.flags = 0;
241 freqs.old = s3c_freq->is_dvs ? FREQ_DVS
242 : clk_get_rate(s3c_freq->armclk) / 1000;
243
244 /* When leavin dvs mode, always switch the armdiv to the hclk rate 240 /* When leavin dvs mode, always switch the armdiv to the hclk rate
245 * The S3C2416 has stability issues when switching directly to 241 * The S3C2416 has stability issues when switching directly to
246 * higher frequencies. 242 * higher frequencies.
247 */ 243 */
248 freqs.new = (s3c_freq->is_dvs && !to_dvs) 244 new_freq = (s3c_freq->is_dvs && !to_dvs)
249 ? clk_get_rate(s3c_freq->hclk) / 1000 245 ? clk_get_rate(s3c_freq->hclk) / 1000
250 : s3c_freq->freq_table[index].frequency; 246 : s3c_freq->freq_table[index].frequency;
251 247
252 pr_debug("cpufreq: Transition %d-%dkHz\n", freqs.old, freqs.new);
253
254 if (!to_dvs && freqs.old == freqs.new)
255 goto out;
256
257 cpufreq_notify_transition(policy, &freqs, CPUFREQ_PRECHANGE);
258
259 if (to_dvs) { 248 if (to_dvs) {
260 pr_debug("cpufreq: enter dvs\n"); 249 pr_debug("cpufreq: enter dvs\n");
261 ret = s3c2416_cpufreq_enter_dvs(s3c_freq, idx); 250 ret = s3c2416_cpufreq_enter_dvs(s3c_freq, idx);
@@ -263,12 +252,10 @@ static int s3c2416_cpufreq_set_target(struct cpufreq_policy *policy,
263 pr_debug("cpufreq: leave dvs\n"); 252 pr_debug("cpufreq: leave dvs\n");
264 ret = s3c2416_cpufreq_leave_dvs(s3c_freq, idx); 253 ret = s3c2416_cpufreq_leave_dvs(s3c_freq, idx);
265 } else { 254 } else {
266 pr_debug("cpufreq: change armdiv to %dkHz\n", freqs.new); 255 pr_debug("cpufreq: change armdiv to %dkHz\n", new_freq);
267 ret = s3c2416_cpufreq_set_armdiv(s3c_freq, freqs.new); 256 ret = s3c2416_cpufreq_set_armdiv(s3c_freq, new_freq);
268 } 257 }
269 258
270 cpufreq_notify_transition(policy, &freqs, CPUFREQ_POSTCHANGE);
271
272out: 259out:
273 mutex_unlock(&cpufreq_lock); 260 mutex_unlock(&cpufreq_lock);
274 261