diff options
author | Jan Beulich <jbeulich@novell.com> | 2010-09-24 01:21:34 -0400 |
---|---|---|
committer | Guenter Roeck <guenter.roeck@ericsson.com> | 2010-09-24 14:44:19 -0400 |
commit | a46590533ad7b0f3f640732081d7e1658145c0ba (patch) | |
tree | 3ee17795bbcf7a057a032c41938103d7402ea302 /drivers | |
parent | d172132f358552eabd7a7410e478ffeead445243 (diff) |
x86/hwmon: fix initialization of coretemp
Using cpuid_eax() to determine feature availability on other than
the current CPU is invalid. And feature availability should also be
checked in the hotplug code path.
Signed-off-by: Jan Beulich <jbeulich@novell.com>
Cc: Rudolf Marek <r.marek@assembler.cz>
Cc: Fenghua Yu <fenghua.yu@intel.com>
Signed-off-by: Guenter Roeck <guenter.roeck@ericsson.com>
Diffstat (limited to 'drivers')
-rw-r--r-- | drivers/hwmon/coretemp.c | 29 |
1 files changed, 13 insertions, 16 deletions
diff --git a/drivers/hwmon/coretemp.c b/drivers/hwmon/coretemp.c index 6b3ef553bd13..5850da64ae28 100644 --- a/drivers/hwmon/coretemp.c +++ b/drivers/hwmon/coretemp.c | |||
@@ -423,9 +423,18 @@ static int __cpuinit coretemp_device_add(unsigned int cpu) | |||
423 | int err; | 423 | int err; |
424 | struct platform_device *pdev; | 424 | struct platform_device *pdev; |
425 | struct pdev_entry *pdev_entry; | 425 | struct pdev_entry *pdev_entry; |
426 | #ifdef CONFIG_SMP | ||
427 | struct cpuinfo_x86 *c = &cpu_data(cpu); | 426 | struct cpuinfo_x86 *c = &cpu_data(cpu); |
428 | #endif | 427 | |
428 | /* | ||
429 | * CPUID.06H.EAX[0] indicates whether the CPU has thermal | ||
430 | * sensors. We check this bit only, all the early CPUs | ||
431 | * without thermal sensors will be filtered out. | ||
432 | */ | ||
433 | if (!cpu_has(c, X86_FEATURE_DTS)) { | ||
434 | printk(KERN_INFO DRVNAME ": CPU (model=0x%x)" | ||
435 | " has no thermal sensor.\n", c->x86_model); | ||
436 | return 0; | ||
437 | } | ||
429 | 438 | ||
430 | mutex_lock(&pdev_list_mutex); | 439 | mutex_lock(&pdev_list_mutex); |
431 | 440 | ||
@@ -527,20 +536,8 @@ static int __init coretemp_init(void) | |||
527 | if (err) | 536 | if (err) |
528 | goto exit; | 537 | goto exit; |
529 | 538 | ||
530 | for_each_online_cpu(i) { | 539 | for_each_online_cpu(i) |
531 | struct cpuinfo_x86 *c = &cpu_data(i); | 540 | coretemp_device_add(i); |
532 | /* | ||
533 | * CPUID.06H.EAX[0] indicates whether the CPU has thermal | ||
534 | * sensors. We check this bit only, all the early CPUs | ||
535 | * without thermal sensors will be filtered out. | ||
536 | */ | ||
537 | if (c->cpuid_level >= 6 && (cpuid_eax(0x06) & 0x01)) | ||
538 | coretemp_device_add(i); | ||
539 | else { | ||
540 | printk(KERN_INFO DRVNAME ": CPU (model=0x%x)" | ||
541 | " has no thermal sensor.\n", c->x86_model); | ||
542 | } | ||
543 | } | ||
544 | 541 | ||
545 | #ifndef CONFIG_HOTPLUG_CPU | 542 | #ifndef CONFIG_HOTPLUG_CPU |
546 | if (list_empty(&pdev_list)) { | 543 | if (list_empty(&pdev_list)) { |