aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/hwmon/coretemp.c
diff options
context:
space:
mode:
authorJan Beulich <jbeulich@novell.com>2010-09-24 01:21:34 -0400
committerGuenter Roeck <guenter.roeck@ericsson.com>2010-09-24 14:44:19 -0400
commita46590533ad7b0f3f640732081d7e1658145c0ba (patch)
tree3ee17795bbcf7a057a032c41938103d7402ea302 /drivers/hwmon/coretemp.c
parentd172132f358552eabd7a7410e478ffeead445243 (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/hwmon/coretemp.c')
-rw-r--r--drivers/hwmon/coretemp.c29
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)) {