aboutsummaryrefslogtreecommitdiffstats
path: root/drivers
diff options
context:
space:
mode:
authorLinus Torvalds <torvalds@ppc970.osdl.org>2004-08-22 01:18:04 -0700
committerLinus Torvalds <torvalds@ppc970.osdl.org>2004-08-22 01:18:04 -0700
commit26a9b9cfb717e342e9c6e1877e3c0cbed2922057 (patch)
treefb4df5ce71149da50270abf773430d5d7a1d07a8 /drivers
parentf9ee7122964e06b3a50de26b219157efb392de00 (diff)
parenta0dea52bb03981cccc9ea6cb19e51c5587d4c441 (diff)
downloadhistory-26a9b9cfb717e342e9c6e1877e3c0cbed2922057.tar.gz
Merge bk://linux-dj.bkbits.net/cpufreq
into ppc970.osdl.org:/home/torvalds/v2.6/linux
Diffstat (limited to 'drivers')
-rw-r--r--drivers/cpufreq/cpufreq.c169
-rw-r--r--drivers/cpufreq/cpufreq_userspace.c27
-rw-r--r--drivers/cpufreq/proc_intf.c17
3 files changed, 130 insertions, 83 deletions
diff --git a/drivers/cpufreq/cpufreq.c b/drivers/cpufreq/cpufreq.c
index a7fa79f5b867fc..6fed4862301dd1 100644
--- a/drivers/cpufreq/cpufreq.c
+++ b/drivers/cpufreq/cpufreq.c
@@ -100,6 +100,88 @@ static void cpufreq_cpu_put(struct cpufreq_policy *data)
}
/*********************************************************************
+ * EXTERNALLY AFFECTING FREQUENCY CHANGES *
+ *********************************************************************/
+
+/**
+ * adjust_jiffies - adjust the system "loops_per_jiffy"
+ *
+ * This function alters the system "loops_per_jiffy" for the clock
+ * speed change. Note that loops_per_jiffy cannot be updated on SMP
+ * systems as each CPU might be scaled differently. So, use the arch
+ * per-CPU loops_per_jiffy value wherever possible.
+ */
+#ifndef CONFIG_SMP
+static unsigned long l_p_j_ref;
+static unsigned int l_p_j_ref_freq;
+
+static inline void adjust_jiffies(unsigned long val, struct cpufreq_freqs *ci)
+{
+ if (ci->flags & CPUFREQ_CONST_LOOPS)
+ return;
+
+ if (!l_p_j_ref_freq) {
+ l_p_j_ref = loops_per_jiffy;
+ l_p_j_ref_freq = ci->old;
+ }
+ if ((val == CPUFREQ_PRECHANGE && ci->old < ci->new) ||
+ (val == CPUFREQ_POSTCHANGE && ci->old > ci->new) ||
+ (val == CPUFREQ_RESUMECHANGE))
+ loops_per_jiffy = cpufreq_scale(l_p_j_ref, l_p_j_ref_freq, ci->new);
+}
+#else
+static inline void adjust_jiffies(unsigned long val, struct cpufreq_freqs *ci) { return; }
+#endif
+
+
+/**
+ * cpufreq_notify_transition - call notifier chain and adjust_jiffies on frequency transition
+ *
+ * This function calls the transition notifiers and the "adjust_jiffies" function. It is called
+ * twice on all CPU frequency changes that have external effects.
+ */
+void cpufreq_notify_transition(struct cpufreq_freqs *freqs, unsigned int state)
+{
+ BUG_ON(irqs_disabled());
+
+ freqs->flags = cpufreq_driver->flags;
+
+ down_read(&cpufreq_notifier_rwsem);
+ switch (state) {
+ case CPUFREQ_PRECHANGE:
+ /* detect if the driver reported a value as "old frequency" which
+ * is not equal to what the cpufreq core thinks is "old frequency".
+ */
+ if (!(cpufreq_driver->flags & CPUFREQ_CONST_LOOPS)) {
+ if ((likely(cpufreq_cpu_data[freqs->cpu])) &&
+ (likely(cpufreq_cpu_data[freqs->cpu]->cur)) &&
+ (unlikely(freqs->old != cpufreq_cpu_data[freqs->cpu]->cur)))
+ {
+ if (cpufreq_driver->flags & CPUFREQ_PANIC_OUTOFSYNC)
+ panic("CPU Frequency is out of sync.");
+
+ printk(KERN_WARNING "Warning: CPU frequency is %u, "
+ "cpufreq assumed %u kHz.\n", freqs->old, cpufreq_cpu_data[freqs->cpu]->cur);
+ freqs->old = cpufreq_cpu_data[freqs->cpu]->cur;
+ }
+ }
+ notifier_call_chain(&cpufreq_transition_notifier_list, CPUFREQ_PRECHANGE, freqs);
+ adjust_jiffies(CPUFREQ_PRECHANGE, freqs);
+ break;
+ case CPUFREQ_POSTCHANGE:
+ adjust_jiffies(CPUFREQ_POSTCHANGE, freqs);
+ notifier_call_chain(&cpufreq_transition_notifier_list, CPUFREQ_POSTCHANGE, freqs);
+ if (likely(cpufreq_cpu_data[freqs->cpu]))
+ cpufreq_cpu_data[freqs->cpu]->cur = freqs->new;
+ break;
+ }
+ up_read(&cpufreq_notifier_rwsem);
+}
+EXPORT_SYMBOL_GPL(cpufreq_notify_transition);
+
+
+
+/*********************************************************************
* SYSFS INTERFACE *
*********************************************************************/
@@ -617,8 +699,8 @@ static int cpufreq_resume(struct sys_device * sysdev)
if (cpufreq_driver->flags & CPUFREQ_PANIC_RESUME_OUTOFSYNC)
panic("CPU Frequency is out of sync.");
- printk(KERN_WARNING "Warning: CPU frequency out of sync: cpufreq and timing"
- "core thinks of %u, is %u kHz.\n", cpu_policy->cur, cur_freq);
+ printk(KERN_WARNING "Warning: CPU frequency is %u, "
+ "cpufreq assumed %u kHz.\n", cur_freq, cpu_policy->cur);
freqs.cpu = cpu;
freqs.old = cpu_policy->cur;
@@ -626,6 +708,8 @@ static int cpufreq_resume(struct sys_device * sysdev)
notifier_call_chain(&cpufreq_transition_notifier_list, CPUFREQ_RESUMECHANGE, &freqs);
adjust_jiffies(CPUFREQ_RESUMECHANGE, &freqs);
+
+ cpu_policy->cur = cur_freq;
}
}
@@ -1006,87 +1090,6 @@ EXPORT_SYMBOL(cpufreq_update_policy);
/*********************************************************************
- * EXTERNALLY AFFECTING FREQUENCY CHANGES *
- *********************************************************************/
-
-/**
- * adjust_jiffies - adjust the system "loops_per_jiffy"
- *
- * This function alters the system "loops_per_jiffy" for the clock
- * speed change. Note that loops_per_jiffy cannot be updated on SMP
- * systems as each CPU might be scaled differently. So, use the arch
- * per-CPU loops_per_jiffy value wherever possible.
- */
-#ifndef CONFIG_SMP
-static unsigned long l_p_j_ref;
-static unsigned int l_p_j_ref_freq;
-
-static inline void adjust_jiffies(unsigned long val, struct cpufreq_freqs *ci)
-{
- if (ci->flags & CPUFREQ_CONST_LOOPS)
- return;
-
- if (!l_p_j_ref_freq) {
- l_p_j_ref = loops_per_jiffy;
- l_p_j_ref_freq = ci->old;
- }
- if ((val == CPUFREQ_PRECHANGE && ci->old < ci->new) ||
- (val == CPUFREQ_POSTCHANGE && ci->old > ci->new) ||
- (val == CPUFREQ_RESUMECHANGE))
- loops_per_jiffy = cpufreq_scale(l_p_j_ref, l_p_j_ref_freq, ci->new);
-}
-#else
-static inline void adjust_jiffies(unsigned long val, struct cpufreq_freqs *ci) { return; }
-#endif
-
-
-/**
- * cpufreq_notify_transition - call notifier chain and adjust_jiffies on frequency transition
- *
- * This function calls the transition notifiers and the "adjust_jiffies" function. It is called
- * twice on all CPU frequency changes that have external effects.
- */
-void cpufreq_notify_transition(struct cpufreq_freqs *freqs, unsigned int state)
-{
- BUG_ON(irqs_disabled());
-
- freqs->flags = cpufreq_driver->flags;
-
- down_read(&cpufreq_notifier_rwsem);
- switch (state) {
- case CPUFREQ_PRECHANGE:
- /* detect if the driver reported a value as "old frequency" which
- * is not equal to what the cpufreq core thinks is "old frequency".
- */
- if (!(cpufreq_driver->flags & CPUFREQ_CONST_LOOPS)) {
- if ((likely(cpufreq_cpu_data[freqs->cpu]->cur)) &&
- (unlikely(freqs->old != cpufreq_cpu_data[freqs->cpu]->cur)))
- {
- if (cpufreq_driver->flags & CPUFREQ_PANIC_OUTOFSYNC)
- panic("CPU Frequency is out of sync.");
-
- printk(KERN_WARNING "Warning: CPU frequency out of sync: "
- "cpufreq and timing core thinks of %u, is %u kHz.\n",
- cpufreq_cpu_data[freqs->cpu]->cur, freqs->old);
- freqs->old = cpufreq_cpu_data[freqs->cpu]->cur;
- }
- }
- notifier_call_chain(&cpufreq_transition_notifier_list, CPUFREQ_PRECHANGE, freqs);
- adjust_jiffies(CPUFREQ_PRECHANGE, freqs);
- break;
- case CPUFREQ_POSTCHANGE:
- adjust_jiffies(CPUFREQ_POSTCHANGE, freqs);
- notifier_call_chain(&cpufreq_transition_notifier_list, CPUFREQ_POSTCHANGE, freqs);
- cpufreq_cpu_data[freqs->cpu]->cur = freqs->new;
- break;
- }
- up_read(&cpufreq_notifier_rwsem);
-}
-EXPORT_SYMBOL_GPL(cpufreq_notify_transition);
-
-
-
-/*********************************************************************
* REGISTER / UNREGISTER CPUFREQ DRIVER *
*********************************************************************/
diff --git a/drivers/cpufreq/cpufreq_userspace.c b/drivers/cpufreq/cpufreq_userspace.c
index 161e8a27c6c56a..558cc9dd01852b 100644
--- a/drivers/cpufreq/cpufreq_userspace.c
+++ b/drivers/cpufreq/cpufreq_userspace.c
@@ -82,6 +82,13 @@ userspace_cpufreq_notifier(struct notifier_block *nb, unsigned long val,
{
struct cpufreq_freqs *freq = data;
+ /* Don't update cur_freq if CPU is managed and we're
+ * waking up: else we won't remember what frequency
+ * we need to set the CPU to.
+ */
+ if (cpu_is_managed[freq->cpu] && (val == CPUFREQ_RESUMECHANGE))
+ return 0;
+
cpu_cur_freq[freq->cpu] = freq->new;
return 0;
@@ -147,6 +154,9 @@ EXPORT_SYMBOL_GPL(cpufreq_setmax);
#ifdef CONFIG_CPU_FREQ_24_API
+#warning The /proc/sys/cpu/ and sysctl interface to cpufreq will be removed from the 2.6. kernel series soon after 2005-01-01
+
+static unsigned int warning_print = 0;
/*********************** cpufreq_sysctl interface ********************/
static int
@@ -162,6 +172,13 @@ cpufreq_procctl(ctl_table *ctl, int write, struct file *filp,
return 0;
}
+ if (!warning_print) {
+ warning_print++;
+ printk(KERN_INFO "Access to /proc/sys/cpu/ is deprecated and "
+ "will be removed from (new) 2.6. kernels soon "
+ "after 2005-01-01\n");
+ }
+
if (write) {
unsigned int freq;
@@ -197,6 +214,13 @@ cpufreq_sysctl(ctl_table *table, int __user *name, int nlen,
if (!cpu_online(cpu))
return -EINVAL;
+ if (!warning_print) {
+ warning_print++;
+ printk(KERN_INFO "Access to /proc/sys/cpu/ is deprecated and "
+ "will be removed from (new) 2.6. kernels soon "
+ "after 2005-01-01\n");
+ }
+
if (oldval && oldlenp) {
size_t oldlen;
@@ -522,6 +546,9 @@ static int cpufreq_governor_userspace(struct cpufreq_policy *policy,
else if (policy->min > cpu_cur_freq[cpu])
__cpufreq_driver_target(&current_policy[cpu], policy->min,
CPUFREQ_RELATION_L);
+ else
+ __cpufreq_driver_target(&current_policy[cpu], cpu_cur_freq[cpu],
+ CPUFREQ_RELATION_L);
memcpy (&current_policy[cpu], policy, sizeof(struct cpufreq_policy));
up(&userspace_sem);
break;
diff --git a/drivers/cpufreq/proc_intf.c b/drivers/cpufreq/proc_intf.c
index a0eaf6f1d42497..673977899e50d0 100644
--- a/drivers/cpufreq/proc_intf.c
+++ b/drivers/cpufreq/proc_intf.c
@@ -12,9 +12,12 @@
#include <linux/proc_fs.h>
#include <asm/uaccess.h>
+#warning This module will be removed from the 2.6. kernel series soon after 2005-01-01
#define CPUFREQ_ALL_CPUS ((NR_CPUS))
+static unsigned int warning_print = 0;
+
/**
* cpufreq_parse_policy - parse a policy string
* @input_string: the string to parse.
@@ -110,6 +113,13 @@ static int cpufreq_proc_read (
if (off != 0)
goto end;
+ if (!warning_print) {
+ warning_print++;
+ printk(KERN_INFO "Access to /proc/cpufreq is deprecated and "
+ "will be removed from (new) 2.6. kernels soon "
+ "after 2005-01-01\n");
+ }
+
p += sprintf(p, " minimum CPU frequency - maximum CPU frequency - policy\n");
for (i=0;i<NR_CPUS;i++) {
if (!cpu_online(i))
@@ -179,6 +189,13 @@ static int cpufreq_proc_write (
if (copy_from_user(proc_string, buffer, count))
return -EFAULT;
+
+ if (!warning_print) {
+ warning_print++;
+ printk(KERN_INFO "Access to /proc/cpufreq is deprecated and "
+ "will be removed from (new) 2.6. kernels soon "
+ "after 2005-01-01\n");
+ }
proc_string[count] = '\0';