Merge branch 'fixes' of git://git.kernel.org/pub/scm/linux/kernel/git/davej/cpufreq
* 'fixes' of git://git.kernel.org/pub/scm/linux/kernel/git/davej/cpufreq: [CPUFREQ] p4-clockmod: print EST-capable warning message only once [CPUFREQ] fix BUG on cpufreq policy init failure [CPUFREQ] Fix another notifier leak in powernow-k8. [CPUFREQ] Missing "unregister_cpu_notifier" in powernow-k8.c
This commit is contained in:
@@ -158,9 +158,9 @@ static unsigned int cpufreq_p4_get_frequency(struct cpuinfo_x86 *c)
|
|||||||
{
|
{
|
||||||
if (c->x86 == 0x06) {
|
if (c->x86 == 0x06) {
|
||||||
if (cpu_has(c, X86_FEATURE_EST))
|
if (cpu_has(c, X86_FEATURE_EST))
|
||||||
printk(KERN_WARNING PFX "Warning: EST-capable CPU "
|
printk_once(KERN_WARNING PFX "Warning: EST-capable "
|
||||||
"detected. The acpi-cpufreq module offers "
|
"CPU detected. The acpi-cpufreq module offers "
|
||||||
"voltage scaling in addition of frequency "
|
"voltage scaling in addition to frequency "
|
||||||
"scaling. You should use that instead of "
|
"scaling. You should use that instead of "
|
||||||
"p4-clockmod, if possible.\n");
|
"p4-clockmod, if possible.\n");
|
||||||
switch (c->x86_model) {
|
switch (c->x86_model) {
|
||||||
|
@@ -1537,6 +1537,7 @@ static struct notifier_block cpb_nb = {
|
|||||||
static int __cpuinit powernowk8_init(void)
|
static int __cpuinit powernowk8_init(void)
|
||||||
{
|
{
|
||||||
unsigned int i, supported_cpus = 0, cpu;
|
unsigned int i, supported_cpus = 0, cpu;
|
||||||
|
int rv;
|
||||||
|
|
||||||
for_each_online_cpu(i) {
|
for_each_online_cpu(i) {
|
||||||
int rc;
|
int rc;
|
||||||
@@ -1555,14 +1556,14 @@ static int __cpuinit powernowk8_init(void)
|
|||||||
|
|
||||||
cpb_capable = true;
|
cpb_capable = true;
|
||||||
|
|
||||||
register_cpu_notifier(&cpb_nb);
|
|
||||||
|
|
||||||
msrs = msrs_alloc();
|
msrs = msrs_alloc();
|
||||||
if (!msrs) {
|
if (!msrs) {
|
||||||
printk(KERN_ERR "%s: Error allocating msrs!\n", __func__);
|
printk(KERN_ERR "%s: Error allocating msrs!\n", __func__);
|
||||||
return -ENOMEM;
|
return -ENOMEM;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
register_cpu_notifier(&cpb_nb);
|
||||||
|
|
||||||
rdmsr_on_cpus(cpu_online_mask, MSR_K7_HWCR, msrs);
|
rdmsr_on_cpus(cpu_online_mask, MSR_K7_HWCR, msrs);
|
||||||
|
|
||||||
for_each_cpu(cpu, cpu_online_mask) {
|
for_each_cpu(cpu, cpu_online_mask) {
|
||||||
@@ -1574,7 +1575,13 @@ static int __cpuinit powernowk8_init(void)
|
|||||||
(cpb_enabled ? "on" : "off"));
|
(cpb_enabled ? "on" : "off"));
|
||||||
}
|
}
|
||||||
|
|
||||||
return cpufreq_register_driver(&cpufreq_amd64_driver);
|
rv = cpufreq_register_driver(&cpufreq_amd64_driver);
|
||||||
|
if (rv < 0 && boot_cpu_has(X86_FEATURE_CPB)) {
|
||||||
|
unregister_cpu_notifier(&cpb_nb);
|
||||||
|
msrs_free(msrs);
|
||||||
|
msrs = NULL;
|
||||||
|
}
|
||||||
|
return rv;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* driver entry point for term */
|
/* driver entry point for term */
|
||||||
|
@@ -1919,8 +1919,10 @@ int cpufreq_register_driver(struct cpufreq_driver *driver_data)
|
|||||||
|
|
||||||
ret = sysdev_driver_register(&cpu_sysdev_class,
|
ret = sysdev_driver_register(&cpu_sysdev_class,
|
||||||
&cpufreq_sysdev_driver);
|
&cpufreq_sysdev_driver);
|
||||||
|
if (ret)
|
||||||
|
goto err_null_driver;
|
||||||
|
|
||||||
if ((!ret) && !(cpufreq_driver->flags & CPUFREQ_STICKY)) {
|
if (!(cpufreq_driver->flags & CPUFREQ_STICKY)) {
|
||||||
int i;
|
int i;
|
||||||
ret = -ENODEV;
|
ret = -ENODEV;
|
||||||
|
|
||||||
@@ -1935,21 +1937,22 @@ int cpufreq_register_driver(struct cpufreq_driver *driver_data)
|
|||||||
if (ret) {
|
if (ret) {
|
||||||
dprintk("no CPU initialized for driver %s\n",
|
dprintk("no CPU initialized for driver %s\n",
|
||||||
driver_data->name);
|
driver_data->name);
|
||||||
sysdev_driver_unregister(&cpu_sysdev_class,
|
goto err_sysdev_unreg;
|
||||||
&cpufreq_sysdev_driver);
|
|
||||||
|
|
||||||
spin_lock_irqsave(&cpufreq_driver_lock, flags);
|
|
||||||
cpufreq_driver = NULL;
|
|
||||||
spin_unlock_irqrestore(&cpufreq_driver_lock, flags);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!ret) {
|
register_hotcpu_notifier(&cpufreq_cpu_notifier);
|
||||||
register_hotcpu_notifier(&cpufreq_cpu_notifier);
|
dprintk("driver %s up and running\n", driver_data->name);
|
||||||
dprintk("driver %s up and running\n", driver_data->name);
|
cpufreq_debug_enable_ratelimit();
|
||||||
cpufreq_debug_enable_ratelimit();
|
|
||||||
}
|
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
err_sysdev_unreg:
|
||||||
|
sysdev_driver_unregister(&cpu_sysdev_class,
|
||||||
|
&cpufreq_sysdev_driver);
|
||||||
|
err_null_driver:
|
||||||
|
spin_lock_irqsave(&cpufreq_driver_lock, flags);
|
||||||
|
cpufreq_driver = NULL;
|
||||||
|
spin_unlock_irqrestore(&cpufreq_driver_lock, flags);
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
EXPORT_SYMBOL_GPL(cpufreq_register_driver);
|
EXPORT_SYMBOL_GPL(cpufreq_register_driver);
|
||||||
|
Reference in New Issue
Block a user