forked from Minki/linux
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
This commit is contained in:
commit
ded1504dfa
@ -590,20 +590,23 @@ static acpi_status longhaul_walk_callback(acpi_handle obj_handle,
|
||||
static int enable_arbiter_disable(void)
|
||||
{
|
||||
struct pci_dev *dev;
|
||||
int status;
|
||||
int reg;
|
||||
u8 pci_cmd;
|
||||
|
||||
status = 1;
|
||||
/* Find PLE133 host bridge */
|
||||
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 */
|
||||
if (dev == NULL) {
|
||||
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 */
|
||||
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) {
|
||||
/* Enable access to port 0x22 */
|
||||
@ -615,10 +618,11 @@ static int enable_arbiter_disable(void)
|
||||
if (!(pci_cmd & 1<<7)) {
|
||||
printk(KERN_ERR PFX
|
||||
"Can't enable access to port 0x22.\n");
|
||||
return 0;
|
||||
status = 0;
|
||||
}
|
||||
}
|
||||
return 1;
|
||||
pci_dev_put(dev);
|
||||
return status;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
@ -629,7 +633,7 @@ static int longhaul_setup_vt8235(void)
|
||||
u8 pci_cmd;
|
||||
|
||||
/* 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) {
|
||||
/* Set transition time to max */
|
||||
pci_read_config_byte(dev, 0xec, &pci_cmd);
|
||||
@ -641,6 +645,7 @@ static int longhaul_setup_vt8235(void)
|
||||
pci_read_config_byte(dev, 0xe5, &pci_cmd);
|
||||
pci_cmd |= 1 << 7;
|
||||
pci_write_config_byte(dev, 0xe5, pci_cmd);
|
||||
pci_dev_put(dev);
|
||||
return 1;
|
||||
}
|
||||
return 0;
|
||||
@ -678,7 +683,7 @@ static int __init longhaul_cpu_init(struct cpufreq_policy *policy)
|
||||
sizeof(samuel2_eblcr));
|
||||
break;
|
||||
case 1 ... 15:
|
||||
longhaul_version = TYPE_LONGHAUL_V2;
|
||||
longhaul_version = TYPE_LONGHAUL_V1;
|
||||
if (c->x86_mask < 8) {
|
||||
cpu_model = CPU_SAMUEL2;
|
||||
cpuname = "C3 'Samuel 2' [C5B]";
|
||||
|
@ -27,7 +27,6 @@
|
||||
#include <linux/cpufreq.h>
|
||||
#include <linux/slab.h>
|
||||
#include <linux/cpumask.h>
|
||||
#include <linux/sched.h> /* current / set_cpus_allowed() */
|
||||
|
||||
#include <asm/processor.h>
|
||||
#include <asm/msr.h>
|
||||
@ -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))
|
||||
return -EINVAL;
|
||||
|
||||
rdmsr(MSR_IA32_THERM_STATUS, l, h);
|
||||
rdmsr_on_cpu(cpu, MSR_IA32_THERM_STATUS, &l, &h);
|
||||
|
||||
if (l & 0x01)
|
||||
dprintk("CPU#%d currently thermal throttled\n", cpu);
|
||||
@ -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))
|
||||
newstate = DC_38PT;
|
||||
|
||||
rdmsr(MSR_IA32_THERM_CONTROL, l, h);
|
||||
rdmsr_on_cpu(cpu, MSR_IA32_THERM_CONTROL, &l, &h);
|
||||
if (newstate == DC_DISABLE) {
|
||||
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 {
|
||||
dprintk("CPU#%d setting duty cycle to %d%%\n",
|
||||
cpu, ((125 * newstate) / 10));
|
||||
@ -84,7 +83,7 @@ static int cpufreq_p4_setdc(unsigned int cpu, unsigned int newstate)
|
||||
*/
|
||||
l = (l & ~14);
|
||||
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;
|
||||
@ -111,7 +110,6 @@ static int cpufreq_p4_target(struct cpufreq_policy *policy,
|
||||
{
|
||||
unsigned int newstate = DC_RESV;
|
||||
struct cpufreq_freqs freqs;
|
||||
cpumask_t cpus_allowed;
|
||||
int i;
|
||||
|
||||
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,
|
||||
/* run on each logical CPU, see section 13.15.3 of IA32 Intel Architecture Software
|
||||
* Developer's Manual, Volume 3
|
||||
*/
|
||||
cpus_allowed = current->cpus_allowed;
|
||||
|
||||
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);
|
||||
|
||||
for_each_cpu_mask(i, policy->cpus)
|
||||
cpufreq_p4_setdc(i, p4clockmod_table[newstate].index);
|
||||
}
|
||||
set_cpus_allowed(current, cpus_allowed);
|
||||
|
||||
/* notifiers */
|
||||
for_each_cpu_mask(i, policy->cpus) {
|
||||
@ -256,17 +245,9 @@ static int cpufreq_p4_cpu_exit(struct cpufreq_policy *policy)
|
||||
|
||||
static unsigned int cpufreq_p4_get(unsigned int cpu)
|
||||
{
|
||||
cpumask_t cpus_allowed;
|
||||
u32 l, h;
|
||||
|
||||
cpus_allowed = current->cpus_allowed;
|
||||
|
||||
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);
|
||||
rdmsr_on_cpu(cpu, MSR_IA32_THERM_CONTROL, &l, &h);
|
||||
|
||||
if (l & 0x10) {
|
||||
l = l >> 1;
|
||||
|
@ -661,7 +661,8 @@ 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);
|
||||
data->powernow_table = powernow_table;
|
||||
print_basics(data);
|
||||
if (first_cpu(cpu_core_map[data->cpu]) == data->cpu)
|
||||
print_basics(data);
|
||||
|
||||
for (j = 0; j < data->numps; j++)
|
||||
if ((pst[j].fid==data->currfid) && (pst[j].vid==data->currvid))
|
||||
@ -814,7 +815,8 @@ static int powernow_k8_cpu_init_acpi(struct powernow_k8_data *data)
|
||||
|
||||
/* fill in data */
|
||||
data->numps = data->acpi_data.state_count;
|
||||
print_basics(data);
|
||||
if (first_cpu(cpu_core_map[data->cpu]) == data->cpu)
|
||||
print_basics(data);
|
||||
powernow_k8_acpi_pst_values(data, 0);
|
||||
|
||||
/* notify BIOS that we exist */
|
||||
|
@ -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);
|
||||
|
||||
#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_fidvid(struct powernow_k8_data *data, struct cpufreq_frequency_table *powernow_table);
|
||||
#endif
|
||||
|
||||
#ifdef CONFIG_SMP
|
||||
static inline void define_siblings(int cpu, cpumask_t cpu_sharedcore_mask[])
|
||||
|
@ -720,6 +720,7 @@ static int centrino_target (struct cpufreq_policy *policy,
|
||||
cpu_set(j, set_mask);
|
||||
|
||||
set_cpus_allowed(current, set_mask);
|
||||
preempt_disable();
|
||||
if (unlikely(!cpu_isset(smp_processor_id(), set_mask))) {
|
||||
dprintk("couldn't limit to CPUs in this domain\n");
|
||||
retval = -EAGAIN;
|
||||
@ -727,6 +728,7 @@ static int centrino_target (struct cpufreq_policy *policy,
|
||||
/* We haven't started the transition yet. */
|
||||
goto migrate_end;
|
||||
}
|
||||
preempt_enable();
|
||||
break;
|
||||
}
|
||||
|
||||
@ -761,10 +763,13 @@ static int centrino_target (struct cpufreq_policy *policy,
|
||||
}
|
||||
|
||||
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;
|
||||
}
|
||||
|
||||
cpu_set(j, covered_cpus);
|
||||
preempt_enable();
|
||||
}
|
||||
|
||||
for_each_cpu_mask(k, online_policy_cpus) {
|
||||
@ -796,8 +801,11 @@ static int centrino_target (struct cpufreq_policy *policy,
|
||||
cpufreq_notify_transition(&freqs, CPUFREQ_POSTCHANGE);
|
||||
}
|
||||
}
|
||||
set_cpus_allowed(current, saved_mask);
|
||||
return 0;
|
||||
|
||||
migrate_end:
|
||||
preempt_enable();
|
||||
set_cpus_allowed(current, saved_mask);
|
||||
return 0;
|
||||
}
|
||||
|
@ -16,6 +16,9 @@ config X86_POWERNOW_K8
|
||||
help
|
||||
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/>.
|
||||
|
||||
If in doubt, say N.
|
||||
@ -38,6 +41,9 @@ config X86_SPEEDSTEP_CENTRINO
|
||||
mobile CPUs. This means Intel Pentium M (Centrino) CPUs
|
||||
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/>.
|
||||
|
||||
If in doubt, say N.
|
||||
@ -55,6 +61,9 @@ config X86_ACPI_CPUFREQ
|
||||
Processor Performance States.
|
||||
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/>.
|
||||
|
||||
If in doubt, say N.
|
||||
@ -62,7 +71,7 @@ config X86_ACPI_CPUFREQ
|
||||
comment "shared options"
|
||||
|
||||
config X86_ACPI_CPUFREQ_PROC_INTF
|
||||
bool "/proc/acpi/processor/../performance interface (deprecated)"
|
||||
bool "/proc/acpi/processor/../performance interface (deprecated)"
|
||||
depends on PROC_FS
|
||||
depends on X86_ACPI_CPUFREQ || X86_SPEEDSTEP_CENTRINO_ACPI || X86_POWERNOW_K8_ACPI
|
||||
help
|
||||
@ -86,16 +95,18 @@ config X86_P4_CLOCKMOD
|
||||
slowdowns and noticeable latencies. Normally Speedstep should be used
|
||||
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/>.
|
||||
|
||||
Unless you are absolutely sure say N.
|
||||
|
||||
|
||||
config X86_SPEEDSTEP_LIB
|
||||
tristate
|
||||
default X86_P4_CLOCKMOD
|
||||
tristate
|
||||
default X86_P4_CLOCKMOD
|
||||
|
||||
endif
|
||||
|
||||
endmenu
|
||||
|
||||
|
@ -433,49 +433,6 @@ static int acpi_processor_perf_open_fs(struct inode *inode, struct file *file)
|
||||
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)
|
||||
{
|
||||
struct proc_dir_entry *entry = NULL;
|
||||
@ -487,10 +444,9 @@ static void acpi_cpufreq_add_file(struct acpi_processor *pr)
|
||||
|
||||
/* add file 'performance' [R/W] */
|
||||
entry = create_proc_entry(ACPI_PROCESSOR_FILE_PERFORMANCE,
|
||||
S_IFREG | S_IRUGO | S_IWUSR,
|
||||
S_IFREG | S_IRUGO,
|
||||
acpi_device_dir(device));
|
||||
if (entry){
|
||||
acpi_processor_perf_fops.write = acpi_processor_write_performance;
|
||||
entry->proc_fops = &acpi_processor_perf_fops;
|
||||
entry->data = acpi_driver_data(device);
|
||||
entry->owner = THIS_MODULE;
|
||||
|
@ -9,6 +9,9 @@ config CPU_FREQ
|
||||
clock speed, you need to either enable a dynamic cpufreq governor
|
||||
(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>.
|
||||
|
||||
If in doubt, say N.
|
||||
@ -16,7 +19,7 @@ config CPU_FREQ
|
||||
if CPU_FREQ
|
||||
|
||||
config CPU_FREQ_TABLE
|
||||
tristate
|
||||
tristate
|
||||
|
||||
config CPU_FREQ_DEBUG
|
||||
bool "Enable CPUfreq debugging"
|
||||
@ -32,19 +35,26 @@ config CPU_FREQ_DEBUG
|
||||
4 to activate CPUfreq governor debugging
|
||||
|
||||
config CPU_FREQ_STAT
|
||||
tristate "CPU frequency translation statistics"
|
||||
select CPU_FREQ_TABLE
|
||||
default y
|
||||
help
|
||||
This driver exports CPU frequency statistics information through sysfs
|
||||
file system
|
||||
tristate "CPU frequency translation statistics"
|
||||
select CPU_FREQ_TABLE
|
||||
default y
|
||||
help
|
||||
This driver exports CPU frequency statistics information through sysfs
|
||||
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
|
||||
bool "CPU frequency translation statistics details"
|
||||
depends on CPU_FREQ_STAT
|
||||
help
|
||||
This will show detail CPU frequency translation table in sysfs file
|
||||
system
|
||||
bool "CPU frequency translation statistics details"
|
||||
depends on CPU_FREQ_STAT
|
||||
help
|
||||
This will show detail CPU frequency translation table in sysfs file
|
||||
system.
|
||||
|
||||
If in doubt, say N.
|
||||
|
||||
# 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
|
||||
@ -78,29 +88,38 @@ config CPU_FREQ_DEFAULT_GOV_USERSPACE
|
||||
endchoice
|
||||
|
||||
config CPU_FREQ_GOV_PERFORMANCE
|
||||
tristate "'performance' governor"
|
||||
help
|
||||
tristate "'performance' governor"
|
||||
help
|
||||
This cpufreq governor sets the frequency statically to the
|
||||
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.
|
||||
|
||||
config CPU_FREQ_GOV_POWERSAVE
|
||||
tristate "'powersave' governor"
|
||||
help
|
||||
tristate "'powersave' governor"
|
||||
help
|
||||
This cpufreq governor sets the frequency statically to the
|
||||
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.
|
||||
|
||||
config CPU_FREQ_GOV_USERSPACE
|
||||
tristate "'userspace' governor for userspace frequency scaling"
|
||||
help
|
||||
tristate "'userspace' governor for userspace frequency scaling"
|
||||
help
|
||||
Enable this cpufreq governor when you either want to set the
|
||||
CPU frequency manually or when an userspace program shall
|
||||
be able to set the CPU dynamically, like on LART
|
||||
<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/>.
|
||||
|
||||
If in doubt, say Y.
|
||||
@ -116,6 +135,9 @@ config CPU_FREQ_GOV_ONDEMAND
|
||||
do fast frequency switching (i.e, very low latency frequency
|
||||
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.
|
||||
|
||||
If in doubt, say N.
|
||||
@ -136,6 +158,9 @@ config CPU_FREQ_GOV_CONSERVATIVE
|
||||
step-by-step latency issues between the minimum and maximum frequency
|
||||
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.
|
||||
|
||||
If in doubt, say N.
|
||||
|
@ -768,6 +768,9 @@ static int cpufreq_add_dev (struct sys_device * sys_dev)
|
||||
unlock_policy_rwsem_write(cpu);
|
||||
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
|
||||
for_each_cpu_mask(j, policy->cpus) {
|
||||
@ -858,10 +861,13 @@ static int cpufreq_add_dev (struct sys_device * sys_dev)
|
||||
|
||||
policy->governor = NULL; /* to assure that the starting sequence is
|
||||
* run in cpufreq_set_policy */
|
||||
unlock_policy_rwsem_write(cpu);
|
||||
|
||||
/* 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) {
|
||||
dprintk("setting policy failed\n");
|
||||
goto err_out_unregister;
|
||||
@ -1619,43 +1625,6 @@ error_out:
|
||||
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
|
||||
* @cpu: CPU which shall be re-evaluated
|
||||
|
@ -257,7 +257,6 @@ struct freq_attr {
|
||||
/*********************************************************************
|
||||
* 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_update_policy(unsigned int cpu);
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user