Commit ded1504d authored by Linus Torvalds's avatar Linus Torvalds

Merge master.kernel.org:/pub/scm/linux/kernel/git/davej/cpufreq

* master.kernel.org:/pub/scm/linux/kernel/git/davej/cpufreq:
  [CPUFREQ] Report the number of processors in PowerNow-k8 correctly
  [CPUFREQ] do not declare undefined functions
  [CPUFREQ] cleanup kconfig options
  [CPUFREQ] Longhaul - Revert Longhaul ver. 2
  [CPUFREQ] Remove deprecated /proc/acpi/processor/performance write support
  [CPUFREQ] Fix limited cpufreq when booted on battery
  Fix preemption warnings in speedstep-centrino.c
  [CPUFREQ] Longhaul - Correct PCI code
  [CPUFREQ] p4-clockmod: switch to rdmsr_on_cpu/wrmsr_on_cpu
parents 98b96173 2e497620
...@@ -590,20 +590,23 @@ static acpi_status longhaul_walk_callback(acpi_handle obj_handle, ...@@ -590,20 +590,23 @@ static acpi_status longhaul_walk_callback(acpi_handle obj_handle,
static int enable_arbiter_disable(void) static int enable_arbiter_disable(void)
{ {
struct pci_dev *dev; struct pci_dev *dev;
int status;
int reg; int reg;
u8 pci_cmd; u8 pci_cmd;
status = 1;
/* Find PLE133 host bridge */ /* Find PLE133 host bridge */
reg = 0x78; reg = 0x78;
dev = pci_find_device(PCI_VENDOR_ID_VIA, PCI_DEVICE_ID_VIA_8601_0, NULL); dev = pci_get_device(PCI_VENDOR_ID_VIA, PCI_DEVICE_ID_VIA_8601_0,
NULL);
/* Find CLE266 host bridge */ /* Find CLE266 host bridge */
if (dev == NULL) { if (dev == NULL) {
reg = 0x76; reg = 0x76;
dev = pci_find_device(PCI_VENDOR_ID_VIA, PCI_DEVICE_ID_VIA_862X_0, NULL); dev = pci_get_device(PCI_VENDOR_ID_VIA,
PCI_DEVICE_ID_VIA_862X_0, NULL);
/* Find CN400 V-Link host bridge */ /* Find CN400 V-Link host bridge */
if (dev == NULL) if (dev == NULL)
dev = pci_find_device(PCI_VENDOR_ID_VIA, 0x7259, NULL); dev = pci_get_device(PCI_VENDOR_ID_VIA, 0x7259, NULL);
} }
if (dev != NULL) { if (dev != NULL) {
/* Enable access to port 0x22 */ /* Enable access to port 0x22 */
...@@ -615,10 +618,11 @@ static int enable_arbiter_disable(void) ...@@ -615,10 +618,11 @@ static int enable_arbiter_disable(void)
if (!(pci_cmd & 1<<7)) { if (!(pci_cmd & 1<<7)) {
printk(KERN_ERR PFX printk(KERN_ERR PFX
"Can't enable access to port 0x22.\n"); "Can't enable access to port 0x22.\n");
return 0; status = 0;
} }
} }
return 1; pci_dev_put(dev);
return status;
} }
return 0; return 0;
} }
...@@ -629,7 +633,7 @@ static int longhaul_setup_vt8235(void) ...@@ -629,7 +633,7 @@ static int longhaul_setup_vt8235(void)
u8 pci_cmd; u8 pci_cmd;
/* Find VT8235 southbridge */ /* Find VT8235 southbridge */
dev = pci_find_device(PCI_VENDOR_ID_VIA, PCI_DEVICE_ID_VIA_8235, NULL); dev = pci_get_device(PCI_VENDOR_ID_VIA, PCI_DEVICE_ID_VIA_8235, NULL);
if (dev != NULL) { if (dev != NULL) {
/* Set transition time to max */ /* Set transition time to max */
pci_read_config_byte(dev, 0xec, &pci_cmd); pci_read_config_byte(dev, 0xec, &pci_cmd);
...@@ -641,6 +645,7 @@ static int longhaul_setup_vt8235(void) ...@@ -641,6 +645,7 @@ static int longhaul_setup_vt8235(void)
pci_read_config_byte(dev, 0xe5, &pci_cmd); pci_read_config_byte(dev, 0xe5, &pci_cmd);
pci_cmd |= 1 << 7; pci_cmd |= 1 << 7;
pci_write_config_byte(dev, 0xe5, pci_cmd); pci_write_config_byte(dev, 0xe5, pci_cmd);
pci_dev_put(dev);
return 1; return 1;
} }
return 0; return 0;
...@@ -678,7 +683,7 @@ static int __init longhaul_cpu_init(struct cpufreq_policy *policy) ...@@ -678,7 +683,7 @@ static int __init longhaul_cpu_init(struct cpufreq_policy *policy)
sizeof(samuel2_eblcr)); sizeof(samuel2_eblcr));
break; break;
case 1 ... 15: case 1 ... 15:
longhaul_version = TYPE_LONGHAUL_V2; longhaul_version = TYPE_LONGHAUL_V1;
if (c->x86_mask < 8) { if (c->x86_mask < 8) {
cpu_model = CPU_SAMUEL2; cpu_model = CPU_SAMUEL2;
cpuname = "C3 'Samuel 2' [C5B]"; cpuname = "C3 'Samuel 2' [C5B]";
......
...@@ -27,7 +27,6 @@ ...@@ -27,7 +27,6 @@
#include <linux/cpufreq.h> #include <linux/cpufreq.h>
#include <linux/slab.h> #include <linux/slab.h>
#include <linux/cpumask.h> #include <linux/cpumask.h>
#include <linux/sched.h> /* current / set_cpus_allowed() */
#include <asm/processor.h> #include <asm/processor.h>
#include <asm/msr.h> #include <asm/msr.h>
...@@ -62,7 +61,7 @@ static int cpufreq_p4_setdc(unsigned int cpu, unsigned int newstate) ...@@ -62,7 +61,7 @@ static int cpufreq_p4_setdc(unsigned int cpu, unsigned int newstate)
if (!cpu_online(cpu) || (newstate > DC_DISABLE) || (newstate == DC_RESV)) if (!cpu_online(cpu) || (newstate > DC_DISABLE) || (newstate == DC_RESV))
return -EINVAL; return -EINVAL;
rdmsr(MSR_IA32_THERM_STATUS, l, h); rdmsr_on_cpu(cpu, MSR_IA32_THERM_STATUS, &l, &h);
if (l & 0x01) if (l & 0x01)
dprintk("CPU#%d currently thermal throttled\n", cpu); dprintk("CPU#%d currently thermal throttled\n", cpu);
...@@ -70,10 +69,10 @@ static int cpufreq_p4_setdc(unsigned int cpu, unsigned int newstate) ...@@ -70,10 +69,10 @@ static int cpufreq_p4_setdc(unsigned int cpu, unsigned int newstate)
if (has_N44_O17_errata[cpu] && (newstate == DC_25PT || newstate == DC_DFLT)) if (has_N44_O17_errata[cpu] && (newstate == DC_25PT || newstate == DC_DFLT))
newstate = DC_38PT; newstate = DC_38PT;
rdmsr(MSR_IA32_THERM_CONTROL, l, h); rdmsr_on_cpu(cpu, MSR_IA32_THERM_CONTROL, &l, &h);
if (newstate == DC_DISABLE) { if (newstate == DC_DISABLE) {
dprintk("CPU#%d disabling modulation\n", cpu); dprintk("CPU#%d disabling modulation\n", cpu);
wrmsr(MSR_IA32_THERM_CONTROL, l & ~(1<<4), h); wrmsr_on_cpu(cpu, MSR_IA32_THERM_CONTROL, l & ~(1<<4), h);
} else { } else {
dprintk("CPU#%d setting duty cycle to %d%%\n", dprintk("CPU#%d setting duty cycle to %d%%\n",
cpu, ((125 * newstate) / 10)); cpu, ((125 * newstate) / 10));
...@@ -84,7 +83,7 @@ static int cpufreq_p4_setdc(unsigned int cpu, unsigned int newstate) ...@@ -84,7 +83,7 @@ static int cpufreq_p4_setdc(unsigned int cpu, unsigned int newstate)
*/ */
l = (l & ~14); l = (l & ~14);
l = l | (1<<4) | ((newstate & 0x7)<<1); l = l | (1<<4) | ((newstate & 0x7)<<1);
wrmsr(MSR_IA32_THERM_CONTROL, l, h); wrmsr_on_cpu(cpu, MSR_IA32_THERM_CONTROL, l, h);
} }
return 0; return 0;
...@@ -111,7 +110,6 @@ static int cpufreq_p4_target(struct cpufreq_policy *policy, ...@@ -111,7 +110,6 @@ static int cpufreq_p4_target(struct cpufreq_policy *policy,
{ {
unsigned int newstate = DC_RESV; unsigned int newstate = DC_RESV;
struct cpufreq_freqs freqs; struct cpufreq_freqs freqs;
cpumask_t cpus_allowed;
int i; int i;
if (cpufreq_frequency_table_target(policy, &p4clockmod_table[0], target_freq, relation, &newstate)) if (cpufreq_frequency_table_target(policy, &p4clockmod_table[0], target_freq, relation, &newstate))
...@@ -132,17 +130,8 @@ static int cpufreq_p4_target(struct cpufreq_policy *policy, ...@@ -132,17 +130,8 @@ static int cpufreq_p4_target(struct cpufreq_policy *policy,
/* run on each logical CPU, see section 13.15.3 of IA32 Intel Architecture Software /* run on each logical CPU, see section 13.15.3 of IA32 Intel Architecture Software
* Developer's Manual, Volume 3 * Developer's Manual, Volume 3
*/ */
cpus_allowed = current->cpus_allowed; for_each_cpu_mask(i, policy->cpus)
for_each_cpu_mask(i, policy->cpus) {
cpumask_t this_cpu = cpumask_of_cpu(i);
set_cpus_allowed(current, this_cpu);
BUG_ON(smp_processor_id() != i);
cpufreq_p4_setdc(i, p4clockmod_table[newstate].index); cpufreq_p4_setdc(i, p4clockmod_table[newstate].index);
}
set_cpus_allowed(current, cpus_allowed);
/* notifiers */ /* notifiers */
for_each_cpu_mask(i, policy->cpus) { for_each_cpu_mask(i, policy->cpus) {
...@@ -256,17 +245,9 @@ static int cpufreq_p4_cpu_exit(struct cpufreq_policy *policy) ...@@ -256,17 +245,9 @@ static int cpufreq_p4_cpu_exit(struct cpufreq_policy *policy)
static unsigned int cpufreq_p4_get(unsigned int cpu) static unsigned int cpufreq_p4_get(unsigned int cpu)
{ {
cpumask_t cpus_allowed;
u32 l, h; u32 l, h;
cpus_allowed = current->cpus_allowed; rdmsr_on_cpu(cpu, MSR_IA32_THERM_CONTROL, &l, &h);
set_cpus_allowed(current, cpumask_of_cpu(cpu));
BUG_ON(smp_processor_id() != cpu);
rdmsr(MSR_IA32_THERM_CONTROL, l, h);
set_cpus_allowed(current, cpus_allowed);
if (l & 0x10) { if (l & 0x10) {
l = l >> 1; l = l >> 1;
......
...@@ -661,6 +661,7 @@ static int fill_powernow_table(struct powernow_k8_data *data, struct pst_s *pst, ...@@ -661,6 +661,7 @@ static int fill_powernow_table(struct powernow_k8_data *data, struct pst_s *pst,
dprintk("cfid 0x%x, cvid 0x%x\n", data->currfid, data->currvid); dprintk("cfid 0x%x, cvid 0x%x\n", data->currfid, data->currvid);
data->powernow_table = powernow_table; data->powernow_table = powernow_table;
if (first_cpu(cpu_core_map[data->cpu]) == data->cpu)
print_basics(data); print_basics(data);
for (j = 0; j < data->numps; j++) for (j = 0; j < data->numps; j++)
...@@ -814,6 +815,7 @@ static int powernow_k8_cpu_init_acpi(struct powernow_k8_data *data) ...@@ -814,6 +815,7 @@ static int powernow_k8_cpu_init_acpi(struct powernow_k8_data *data)
/* fill in data */ /* fill in data */
data->numps = data->acpi_data.state_count; data->numps = data->acpi_data.state_count;
if (first_cpu(cpu_core_map[data->cpu]) == data->cpu)
print_basics(data); print_basics(data);
powernow_k8_acpi_pst_values(data, 0); powernow_k8_acpi_pst_values(data, 0);
......
...@@ -215,8 +215,10 @@ static int core_frequency_transition(struct powernow_k8_data *data, u32 reqfid); ...@@ -215,8 +215,10 @@ static int core_frequency_transition(struct powernow_k8_data *data, u32 reqfid);
static void powernow_k8_acpi_pst_values(struct powernow_k8_data *data, unsigned int index); static void powernow_k8_acpi_pst_values(struct powernow_k8_data *data, unsigned int index);
#ifdef CONFIG_X86_POWERNOW_K8_ACPI
static int fill_powernow_table_pstate(struct powernow_k8_data *data, struct cpufreq_frequency_table *powernow_table); static int fill_powernow_table_pstate(struct powernow_k8_data *data, struct cpufreq_frequency_table *powernow_table);
static int fill_powernow_table_fidvid(struct powernow_k8_data *data, struct cpufreq_frequency_table *powernow_table); static int fill_powernow_table_fidvid(struct powernow_k8_data *data, struct cpufreq_frequency_table *powernow_table);
#endif
#ifdef CONFIG_SMP #ifdef CONFIG_SMP
static inline void define_siblings(int cpu, cpumask_t cpu_sharedcore_mask[]) static inline void define_siblings(int cpu, cpumask_t cpu_sharedcore_mask[])
......
...@@ -720,6 +720,7 @@ static int centrino_target (struct cpufreq_policy *policy, ...@@ -720,6 +720,7 @@ static int centrino_target (struct cpufreq_policy *policy,
cpu_set(j, set_mask); cpu_set(j, set_mask);
set_cpus_allowed(current, set_mask); set_cpus_allowed(current, set_mask);
preempt_disable();
if (unlikely(!cpu_isset(smp_processor_id(), set_mask))) { if (unlikely(!cpu_isset(smp_processor_id(), set_mask))) {
dprintk("couldn't limit to CPUs in this domain\n"); dprintk("couldn't limit to CPUs in this domain\n");
retval = -EAGAIN; retval = -EAGAIN;
...@@ -727,6 +728,7 @@ static int centrino_target (struct cpufreq_policy *policy, ...@@ -727,6 +728,7 @@ static int centrino_target (struct cpufreq_policy *policy,
/* We haven't started the transition yet. */ /* We haven't started the transition yet. */
goto migrate_end; goto migrate_end;
} }
preempt_enable();
break; break;
} }
...@@ -761,10 +763,13 @@ static int centrino_target (struct cpufreq_policy *policy, ...@@ -761,10 +763,13 @@ static int centrino_target (struct cpufreq_policy *policy,
} }
wrmsr(MSR_IA32_PERF_CTL, oldmsr, h); wrmsr(MSR_IA32_PERF_CTL, oldmsr, h);
if (policy->shared_type == CPUFREQ_SHARED_TYPE_ANY) if (policy->shared_type == CPUFREQ_SHARED_TYPE_ANY) {
preempt_enable();
break; break;
}
cpu_set(j, covered_cpus); cpu_set(j, covered_cpus);
preempt_enable();
} }
for_each_cpu_mask(k, online_policy_cpus) { for_each_cpu_mask(k, online_policy_cpus) {
...@@ -796,8 +801,11 @@ static int centrino_target (struct cpufreq_policy *policy, ...@@ -796,8 +801,11 @@ static int centrino_target (struct cpufreq_policy *policy,
cpufreq_notify_transition(&freqs, CPUFREQ_POSTCHANGE); cpufreq_notify_transition(&freqs, CPUFREQ_POSTCHANGE);
} }
} }
set_cpus_allowed(current, saved_mask);
return 0;
migrate_end: migrate_end:
preempt_enable();
set_cpus_allowed(current, saved_mask); set_cpus_allowed(current, saved_mask);
return 0; return 0;
} }
......
...@@ -16,6 +16,9 @@ config X86_POWERNOW_K8 ...@@ -16,6 +16,9 @@ config X86_POWERNOW_K8
help help
This adds the CPUFreq driver for mobile AMD Opteron/Athlon64 processors. This adds the CPUFreq driver for mobile AMD Opteron/Athlon64 processors.
To compile this driver as a module, choose M here: the
module will be called powernow-k8.
For details, take a look at <file:Documentation/cpu-freq/>. For details, take a look at <file:Documentation/cpu-freq/>.
If in doubt, say N. If in doubt, say N.
...@@ -38,6 +41,9 @@ config X86_SPEEDSTEP_CENTRINO ...@@ -38,6 +41,9 @@ config X86_SPEEDSTEP_CENTRINO
mobile CPUs. This means Intel Pentium M (Centrino) CPUs mobile CPUs. This means Intel Pentium M (Centrino) CPUs
or 64bit enabled Intel Xeons. or 64bit enabled Intel Xeons.
To compile this driver as a module, choose M here: the
module will be called speedstep-centrino.
For details, take a look at <file:Documentation/cpu-freq/>. For details, take a look at <file:Documentation/cpu-freq/>.
If in doubt, say N. If in doubt, say N.
...@@ -55,6 +61,9 @@ config X86_ACPI_CPUFREQ ...@@ -55,6 +61,9 @@ config X86_ACPI_CPUFREQ
Processor Performance States. Processor Performance States.
This driver also supports Intel Enhanced Speedstep. This driver also supports Intel Enhanced Speedstep.
To compile this driver as a module, choose M here: the
module will be called acpi-cpufreq.
For details, take a look at <file:Documentation/cpu-freq/>. For details, take a look at <file:Documentation/cpu-freq/>.
If in doubt, say N. If in doubt, say N.
...@@ -86,6 +95,9 @@ config X86_P4_CLOCKMOD ...@@ -86,6 +95,9 @@ config X86_P4_CLOCKMOD
slowdowns and noticeable latencies. Normally Speedstep should be used slowdowns and noticeable latencies. Normally Speedstep should be used
instead. instead.
To compile this driver as a module, choose M here: the
module will be called p4-clockmod.
For details, take a look at <file:Documentation/cpu-freq/>. For details, take a look at <file:Documentation/cpu-freq/>.
Unless you are absolutely sure say N. Unless you are absolutely sure say N.
...@@ -98,4 +110,3 @@ config X86_SPEEDSTEP_LIB ...@@ -98,4 +110,3 @@ config X86_SPEEDSTEP_LIB
endif endif
endmenu endmenu
...@@ -433,49 +433,6 @@ static int acpi_processor_perf_open_fs(struct inode *inode, struct file *file) ...@@ -433,49 +433,6 @@ static int acpi_processor_perf_open_fs(struct inode *inode, struct file *file)
PDE(inode)->data); PDE(inode)->data);
} }
static ssize_t
acpi_processor_write_performance(struct file *file,
const char __user * buffer,
size_t count, loff_t * data)
{
int result = 0;
struct seq_file *m = file->private_data;
struct acpi_processor *pr = m->private;
struct acpi_processor_performance *perf;
char state_string[12] = { '\0' };
unsigned int new_state = 0;
struct cpufreq_policy policy;
if (!pr || (count > sizeof(state_string) - 1))
return -EINVAL;
perf = pr->performance;
if (!perf)
return -EINVAL;
if (copy_from_user(state_string, buffer, count))
return -EFAULT;
state_string[count] = '\0';
new_state = simple_strtoul(state_string, NULL, 0);
if (new_state >= perf->state_count)
return -EINVAL;
cpufreq_get_policy(&policy, pr->id);
policy.cpu = pr->id;
policy.min = perf->states[new_state].core_frequency * 1000;
policy.max = perf->states[new_state].core_frequency * 1000;
result = cpufreq_set_policy(&policy);
if (result)
return result;
return count;
}
static void acpi_cpufreq_add_file(struct acpi_processor *pr) static void acpi_cpufreq_add_file(struct acpi_processor *pr)
{ {
struct proc_dir_entry *entry = NULL; struct proc_dir_entry *entry = NULL;
...@@ -487,10 +444,9 @@ static void acpi_cpufreq_add_file(struct acpi_processor *pr) ...@@ -487,10 +444,9 @@ static void acpi_cpufreq_add_file(struct acpi_processor *pr)
/* add file 'performance' [R/W] */ /* add file 'performance' [R/W] */
entry = create_proc_entry(ACPI_PROCESSOR_FILE_PERFORMANCE, entry = create_proc_entry(ACPI_PROCESSOR_FILE_PERFORMANCE,
S_IFREG | S_IRUGO | S_IWUSR, S_IFREG | S_IRUGO,
acpi_device_dir(device)); acpi_device_dir(device));
if (entry){ if (entry){
acpi_processor_perf_fops.write = acpi_processor_write_performance;
entry->proc_fops = &acpi_processor_perf_fops; entry->proc_fops = &acpi_processor_perf_fops;
entry->data = acpi_driver_data(device); entry->data = acpi_driver_data(device);
entry->owner = THIS_MODULE; entry->owner = THIS_MODULE;
......
...@@ -9,6 +9,9 @@ config CPU_FREQ ...@@ -9,6 +9,9 @@ config CPU_FREQ
clock speed, you need to either enable a dynamic cpufreq governor clock speed, you need to either enable a dynamic cpufreq governor
(see below) after boot, or use a userspace tool. (see below) after boot, or use a userspace tool.
To compile this driver as a module, choose M here: the
module will be called cpufreq.
For details, take a look at <file:Documentation/cpu-freq>. For details, take a look at <file:Documentation/cpu-freq>.
If in doubt, say N. If in doubt, say N.
...@@ -37,14 +40,21 @@ config CPU_FREQ_STAT ...@@ -37,14 +40,21 @@ config CPU_FREQ_STAT
default y default y
help help
This driver exports CPU frequency statistics information through sysfs This driver exports CPU frequency statistics information through sysfs
file system file system.
To compile this driver as a module, choose M here: the
module will be called cpufreq_stats.
If in doubt, say N.
config CPU_FREQ_STAT_DETAILS config CPU_FREQ_STAT_DETAILS
bool "CPU frequency translation statistics details" bool "CPU frequency translation statistics details"
depends on CPU_FREQ_STAT depends on CPU_FREQ_STAT
help help
This will show detail CPU frequency translation table in sysfs file This will show detail CPU frequency translation table in sysfs file
system system.
If in doubt, say N.
# Note that it is not currently possible to set the other governors (such as ondemand) # Note that it is not currently possible to set the other governors (such as ondemand)
# as the default, since if they fail to initialise, cpufreq will be # as the default, since if they fail to initialise, cpufreq will be
...@@ -83,6 +93,9 @@ config CPU_FREQ_GOV_PERFORMANCE ...@@ -83,6 +93,9 @@ config CPU_FREQ_GOV_PERFORMANCE
This cpufreq governor sets the frequency statically to the This cpufreq governor sets the frequency statically to the
highest available CPU frequency. highest available CPU frequency.
To compile this driver as a module, choose M here: the
module will be called cpufreq_performance.
If in doubt, say Y. If in doubt, say Y.
config CPU_FREQ_GOV_POWERSAVE config CPU_FREQ_GOV_POWERSAVE
...@@ -91,6 +104,9 @@ config CPU_FREQ_GOV_POWERSAVE ...@@ -91,6 +104,9 @@ config CPU_FREQ_GOV_POWERSAVE
This cpufreq governor sets the frequency statically to the This cpufreq governor sets the frequency statically to the
lowest available CPU frequency. lowest available CPU frequency.
To compile this driver as a module, choose M here: the
module will be called cpufreq_powersave.
If in doubt, say Y. If in doubt, say Y.
config CPU_FREQ_GOV_USERSPACE config CPU_FREQ_GOV_USERSPACE
...@@ -101,6 +117,9 @@ config CPU_FREQ_GOV_USERSPACE ...@@ -101,6 +117,9 @@ config CPU_FREQ_GOV_USERSPACE
be able to set the CPU dynamically, like on LART be able to set the CPU dynamically, like on LART
<http://www.lartmaker.nl/>. <http://www.lartmaker.nl/>.
To compile this driver as a module, choose M here: the
module will be called cpufreq_userspace.
For details, take a look at <file:Documentation/cpu-freq/>. For details, take a look at <file:Documentation/cpu-freq/>.
If in doubt, say Y. If in doubt, say Y.
...@@ -116,6 +135,9 @@ config CPU_FREQ_GOV_ONDEMAND ...@@ -116,6 +135,9 @@ config CPU_FREQ_GOV_ONDEMAND
do fast frequency switching (i.e, very low latency frequency do fast frequency switching (i.e, very low latency frequency
transitions). transitions).
To compile this driver as a module, choose M here: the
module will be called cpufreq_ondemand.
For details, take a look at linux/Documentation/cpu-freq. For details, take a look at linux/Documentation/cpu-freq.
If in doubt, say N. If in doubt, say N.
...@@ -136,6 +158,9 @@ config CPU_FREQ_GOV_CONSERVATIVE ...@@ -136,6 +158,9 @@ config CPU_FREQ_GOV_CONSERVATIVE
step-by-step latency issues between the minimum and maximum frequency step-by-step latency issues between the minimum and maximum frequency
transitions in the CPU) you will probably want to use this governor. transitions in the CPU) you will probably want to use this governor.
To compile this driver as a module, choose M here: the
module will be called cpufreq_conservative.
For details, take a look at linux/Documentation/cpu-freq. For details, take a look at linux/Documentation/cpu-freq.
If in doubt, say N. If in doubt, say N.
......
...@@ -768,6 +768,9 @@ static int cpufreq_add_dev (struct sys_device * sys_dev) ...@@ -768,6 +768,9 @@ static int cpufreq_add_dev (struct sys_device * sys_dev)
unlock_policy_rwsem_write(cpu); unlock_policy_rwsem_write(cpu);
goto err_out; goto err_out;
} }
policy->user_policy.min = policy->cpuinfo.min_freq;
policy->user_policy.max = policy->cpuinfo.max_freq;
policy->user_policy.governor = policy->governor;
#ifdef CONFIG_SMP #ifdef CONFIG_SMP
for_each_cpu_mask(j, policy->cpus) { for_each_cpu_mask(j, policy->cpus) {
...@@ -858,10 +861,13 @@ static int cpufreq_add_dev (struct sys_device * sys_dev) ...@@ -858,10 +861,13 @@ static int cpufreq_add_dev (struct sys_device * sys_dev)
policy->governor = NULL; /* to assure that the starting sequence is policy->governor = NULL; /* to assure that the starting sequence is
* run in cpufreq_set_policy */ * run in cpufreq_set_policy */
unlock_policy_rwsem_write(cpu);
/* set default policy */ /* set default policy */
ret = cpufreq_set_policy(&new_policy); ret = __cpufreq_set_policy(policy, &new_policy);
policy->user_policy.policy = policy->policy;
unlock_policy_rwsem_write(cpu);
if (ret) { if (ret) {
dprintk("setting policy failed\n"); dprintk("setting policy failed\n");
goto err_out_unregister; goto err_out_unregister;
...@@ -1619,43 +1625,6 @@ static int __cpufreq_set_policy(struct cpufreq_policy *data, ...@@ -1619,43 +1625,6 @@ static int __cpufreq_set_policy(struct cpufreq_policy *data,
return ret; return ret;
} }
/**
* cpufreq_set_policy - set a new CPUFreq policy
* @policy: policy to be set.
*
* Sets a new CPU frequency and voltage scaling policy.
*/
int cpufreq_set_policy(struct cpufreq_policy *policy)
{
int ret = 0;
struct cpufreq_policy *data;
if (!policy)
return -EINVAL;
data = cpufreq_cpu_get(policy->cpu);
if (!data)
return -EINVAL;
if (unlikely(lock_policy_rwsem_write(policy->cpu)))
return -EINVAL;
ret = __cpufreq_set_policy(data, policy);
data->user_policy.min = data->min;
data->user_policy.max = data->max;
data->user_policy.policy = data->policy;
data->user_policy.governor = data->governor;
unlock_policy_rwsem_write(policy->cpu);
cpufreq_cpu_put(data);
return ret;
}
EXPORT_SYMBOL(cpufreq_set_policy);
/** /**
* cpufreq_update_policy - re-evaluate an existing cpufreq policy * cpufreq_update_policy - re-evaluate an existing cpufreq policy
* @cpu: CPU which shall be re-evaluated * @cpu: CPU which shall be re-evaluated
......
...@@ -257,7 +257,6 @@ struct freq_attr { ...@@ -257,7 +257,6 @@ struct freq_attr {
/********************************************************************* /*********************************************************************
* CPUFREQ 2.6. INTERFACE * * CPUFREQ 2.6. INTERFACE *
*********************************************************************/ *********************************************************************/
int cpufreq_set_policy(struct cpufreq_policy *policy);
int cpufreq_get_policy(struct cpufreq_policy *policy, unsigned int cpu); int cpufreq_get_policy(struct cpufreq_policy *policy, unsigned int cpu);
int cpufreq_update_policy(unsigned int cpu); int cpufreq_update_policy(unsigned int cpu);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment