Skip to content

Commit

Permalink
Merge master.kernel.org:/pub/scm/linux/kernel/git/davej/cpufreq
Browse files Browse the repository at this point in the history
  • Loading branch information
Linus Torvalds committed Jan 31, 2006
2 parents 9aef3b7 + c067286 commit 28e0cf2
Show file tree
Hide file tree
Showing 7 changed files with 141 additions and 113 deletions.
1 change: 1 addition & 0 deletions arch/i386/kernel/cpu/cpufreq/Kconfig
Original file line number Diff line number Diff line change
Expand Up @@ -96,6 +96,7 @@ config X86_POWERNOW_K8_ACPI

config X86_GX_SUSPMOD
tristate "Cyrix MediaGX/NatSemi Geode Suspend Modulation"
depends on PCI
help
This add the CPUFreq driver for NatSemi Geode processors which
support suspend modulation.
Expand Down
9 changes: 9 additions & 0 deletions arch/i386/kernel/cpu/cpufreq/p4-clockmod.c
Original file line number Diff line number Diff line change
Expand Up @@ -52,6 +52,7 @@ enum {


static int has_N44_O17_errata[NR_CPUS];
static int has_N60_errata[NR_CPUS];
static unsigned int stock_freq;
static struct cpufreq_driver p4clockmod_driver;
static unsigned int cpufreq_p4_get(unsigned int cpu);
Expand Down Expand Up @@ -226,6 +227,12 @@ static int cpufreq_p4_cpu_init(struct cpufreq_policy *policy)
case 0x0f12:
has_N44_O17_errata[policy->cpu] = 1;
dprintk("has errata -- disabling low frequencies\n");
break;

case 0x0f29:
has_N60_errata[policy->cpu] = 1;
dprintk("has errata -- disabling frequencies lower than 2ghz\n");
break;
}

/* get max frequency */
Expand All @@ -237,6 +244,8 @@ static int cpufreq_p4_cpu_init(struct cpufreq_policy *policy)
for (i=1; (p4clockmod_table[i].frequency != CPUFREQ_TABLE_END); i++) {
if ((i<2) && (has_N44_O17_errata[policy->cpu]))
p4clockmod_table[i].frequency = CPUFREQ_ENTRY_INVALID;
else if (has_N60_errata[policy->cpu] && p4clockmod_table[i].frequency < 2000000)
p4clockmod_table[i].frequency = CPUFREQ_ENTRY_INVALID;
else
p4clockmod_table[i].frequency = (stock_freq * i)/8;
}
Expand Down
70 changes: 41 additions & 29 deletions drivers/cpufreq/cpufreq.c
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,7 @@
#include <linux/slab.h>
#include <linux/cpu.h>
#include <linux/completion.h>
#include <linux/mutex.h>

#define dprintk(msg...) cpufreq_debug_printk(CPUFREQ_DEBUG_CORE, "cpufreq-core", msg)

Expand Down Expand Up @@ -55,7 +56,7 @@ static DECLARE_RWSEM (cpufreq_notifier_rwsem);


static LIST_HEAD(cpufreq_governor_list);
static DECLARE_MUTEX (cpufreq_governor_sem);
static DEFINE_MUTEX (cpufreq_governor_mutex);

struct cpufreq_policy * cpufreq_cpu_get(unsigned int cpu)
{
Expand Down Expand Up @@ -297,18 +298,18 @@ static int cpufreq_parse_governor (char *str_governor, unsigned int *policy,
return -EINVAL;
} else {
struct cpufreq_governor *t;
down(&cpufreq_governor_sem);
mutex_lock(&cpufreq_governor_mutex);
if (!cpufreq_driver || !cpufreq_driver->target)
goto out;
list_for_each_entry(t, &cpufreq_governor_list, governor_list) {
if (!strnicmp(str_governor,t->name,CPUFREQ_NAME_LEN)) {
*governor = t;
up(&cpufreq_governor_sem);
mutex_unlock(&cpufreq_governor_mutex);
return 0;
}
}
out:
up(&cpufreq_governor_sem);
mutex_unlock(&cpufreq_governor_mutex);
}
return -EINVAL;
}
Expand Down Expand Up @@ -600,7 +601,8 @@ static int cpufreq_add_dev (struct sys_device * sys_dev)
policy->cpu = cpu;
policy->cpus = cpumask_of_cpu(cpu);

init_MUTEX_LOCKED(&policy->lock);
mutex_init(&policy->lock);
mutex_lock(&policy->lock);
init_completion(&policy->kobj_unregister);
INIT_WORK(&policy->update, handle_update, (void *)(long)cpu);

Expand All @@ -610,6 +612,7 @@ static int cpufreq_add_dev (struct sys_device * sys_dev)
ret = cpufreq_driver->init(policy);
if (ret) {
dprintk("initialization failed\n");
mutex_unlock(&policy->lock);
goto err_out;
}

Expand All @@ -621,9 +624,10 @@ static int cpufreq_add_dev (struct sys_device * sys_dev)
strlcpy(policy->kobj.name, "cpufreq", KOBJ_NAME_LEN);

ret = kobject_register(&policy->kobj);
if (ret)
if (ret) {
mutex_unlock(&policy->lock);
goto err_out_driver_exit;

}
/* set up files for this cpu device */
drv_attr = cpufreq_driver->attr;
while ((drv_attr) && (*drv_attr)) {
Expand All @@ -641,7 +645,7 @@ static int cpufreq_add_dev (struct sys_device * sys_dev)
spin_unlock_irqrestore(&cpufreq_driver_lock, flags);
policy->governor = NULL; /* to assure that the starting sequence is
* run in cpufreq_set_policy */
up(&policy->lock);
mutex_unlock(&policy->lock);

/* set default policy */

Expand Down Expand Up @@ -762,10 +766,10 @@ static int cpufreq_remove_dev (struct sys_device * sys_dev)
spin_unlock_irqrestore(&cpufreq_driver_lock, flags);
#endif

down(&data->lock);
mutex_lock(&data->lock);
if (cpufreq_driver->target)
__cpufreq_governor(data, CPUFREQ_GOV_STOP);
up(&data->lock);
mutex_unlock(&data->lock);

kobject_unregister(&data->kobj);

Expand Down Expand Up @@ -834,9 +838,9 @@ unsigned int cpufreq_quick_get(unsigned int cpu)
unsigned int ret = 0;

if (policy) {
down(&policy->lock);
mutex_lock(&policy->lock);
ret = policy->cur;
up(&policy->lock);
mutex_unlock(&policy->lock);
cpufreq_cpu_put(policy);
}

Expand All @@ -862,7 +866,7 @@ unsigned int cpufreq_get(unsigned int cpu)
if (!cpufreq_driver->get)
goto out;

down(&policy->lock);
mutex_lock(&policy->lock);

ret = cpufreq_driver->get(cpu);

Expand All @@ -875,7 +879,7 @@ unsigned int cpufreq_get(unsigned int cpu)
}
}

up(&policy->lock);
mutex_unlock(&policy->lock);

out:
cpufreq_cpu_put(policy);
Expand Down Expand Up @@ -1158,11 +1162,11 @@ int cpufreq_driver_target(struct cpufreq_policy *policy,
if (!policy)
return -EINVAL;

down(&policy->lock);
mutex_lock(&policy->lock);

ret = __cpufreq_driver_target(policy, target_freq, relation);

up(&policy->lock);
mutex_unlock(&policy->lock);

cpufreq_cpu_put(policy);

Expand Down Expand Up @@ -1199,9 +1203,9 @@ int cpufreq_governor(unsigned int cpu, unsigned int event)
if (!policy)
return -EINVAL;

down(&policy->lock);
mutex_lock(&policy->lock);
ret = __cpufreq_governor(policy, event);
up(&policy->lock);
mutex_unlock(&policy->lock);

cpufreq_cpu_put(policy);

Expand All @@ -1217,17 +1221,17 @@ int cpufreq_register_governor(struct cpufreq_governor *governor)
if (!governor)
return -EINVAL;

down(&cpufreq_governor_sem);
mutex_lock(&cpufreq_governor_mutex);

list_for_each_entry(t, &cpufreq_governor_list, governor_list) {
if (!strnicmp(governor->name,t->name,CPUFREQ_NAME_LEN)) {
up(&cpufreq_governor_sem);
mutex_unlock(&cpufreq_governor_mutex);
return -EBUSY;
}
}
list_add(&governor->governor_list, &cpufreq_governor_list);

up(&cpufreq_governor_sem);
mutex_unlock(&cpufreq_governor_mutex);

return 0;
}
Expand All @@ -1239,9 +1243,9 @@ void cpufreq_unregister_governor(struct cpufreq_governor *governor)
if (!governor)
return;

down(&cpufreq_governor_sem);
mutex_lock(&cpufreq_governor_mutex);
list_del(&governor->governor_list);
up(&cpufreq_governor_sem);
mutex_unlock(&cpufreq_governor_mutex);
return;
}
EXPORT_SYMBOL_GPL(cpufreq_unregister_governor);
Expand All @@ -1268,9 +1272,9 @@ int cpufreq_get_policy(struct cpufreq_policy *policy, unsigned int cpu)
if (!cpu_policy)
return -EINVAL;

down(&cpu_policy->lock);
mutex_lock(&cpu_policy->lock);
memcpy(policy, cpu_policy, sizeof(struct cpufreq_policy));
up(&cpu_policy->lock);
mutex_unlock(&cpu_policy->lock);

cpufreq_cpu_put(cpu_policy);

Expand Down Expand Up @@ -1382,15 +1386,15 @@ int cpufreq_set_policy(struct cpufreq_policy *policy)
return -EINVAL;

/* lock this CPU */
down(&data->lock);
mutex_lock(&data->lock);

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;

up(&data->lock);
mutex_unlock(&data->lock);
cpufreq_cpu_put(data);

return ret;
Expand All @@ -1414,7 +1418,7 @@ int cpufreq_update_policy(unsigned int cpu)
if (!data)
return -ENODEV;

down(&data->lock);
mutex_lock(&data->lock);

dprintk("updating policy for CPU %u\n", cpu);
memcpy(&policy,
Expand All @@ -1425,9 +1429,17 @@ int cpufreq_update_policy(unsigned int cpu)
policy.policy = data->user_policy.policy;
policy.governor = data->user_policy.governor;

/* BIOS might change freq behind our back
-> ask driver for current freq and notify governors about a change */
if (cpufreq_driver->get) {
policy.cur = cpufreq_driver->get(cpu);
if (data->cur != policy.cur)
cpufreq_out_of_sync(cpu, data->cur, policy.cur);
}

ret = __cpufreq_set_policy(data, &policy);

up(&data->lock);
mutex_unlock(&data->lock);

cpufreq_cpu_put(data);
return ret;
Expand Down
Loading

0 comments on commit 28e0cf2

Please sign in to comment.