Commit 8ae09259 authored by Linus Torvalds's avatar Linus Torvalds

Merge branch 'hwmon-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/groeck/staging

* 'hwmon-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/groeck/staging:
  x86/hwmon: pkgtemp has no dependency on PCI
  MAINTAINERS: Update hwmon entry
  x86/hwmon: register alternate sibling upon CPU removal
  x86/hwmon: fix initialization of pkgtemp
  x86/hwmon: fix initialization of coretemp
  x86/hwmon: don't leak device attribute file from pkgtemp_probe() and pkgtemp_remove()
  x86/hwmon: avoid deadlock on CPU removal in pkgtemp
  x86/hwmon: fix module init for hotplug-but-no-device-found case
  hwmon: (lis3) Fix Oops with NULL platform data
parents fd194e64 0eae7799
...@@ -2668,6 +2668,8 @@ M: Guenter Roeck <guenter.roeck@ericsson.com> ...@@ -2668,6 +2668,8 @@ M: Guenter Roeck <guenter.roeck@ericsson.com>
L: lm-sensors@lm-sensors.org L: lm-sensors@lm-sensors.org
W: http://www.lm-sensors.org/ W: http://www.lm-sensors.org/
T: quilt kernel.org/pub/linux/kernel/people/jdelvare/linux-2.6/jdelvare-hwmon/ T: quilt kernel.org/pub/linux/kernel/people/jdelvare/linux-2.6/jdelvare-hwmon/
T: quilt kernel.org/pub/linux/kernel/people/groeck/linux-staging/
T: git git://git.kernel.org/pub/scm/linux/kernel/git/groeck/linux-staging.git
S: Maintained S: Maintained
F: Documentation/hwmon/ F: Documentation/hwmon/
F: drivers/hwmon/ F: drivers/hwmon/
......
...@@ -168,6 +168,7 @@ ...@@ -168,6 +168,7 @@
#define X86_FEATURE_XSAVEOPT (7*32+ 4) /* Optimized Xsave */ #define X86_FEATURE_XSAVEOPT (7*32+ 4) /* Optimized Xsave */
#define X86_FEATURE_PLN (7*32+ 5) /* Intel Power Limit Notification */ #define X86_FEATURE_PLN (7*32+ 5) /* Intel Power Limit Notification */
#define X86_FEATURE_PTS (7*32+ 6) /* Intel Package Thermal Status */ #define X86_FEATURE_PTS (7*32+ 6) /* Intel Package Thermal Status */
#define X86_FEATURE_DTS (7*32+ 7) /* Digital Thermal Sensor */
/* Virtualization flags: Linux defined, word 8 */ /* Virtualization flags: Linux defined, word 8 */
#define X86_FEATURE_TPR_SHADOW (8*32+ 0) /* Intel TPR Shadow */ #define X86_FEATURE_TPR_SHADOW (8*32+ 0) /* Intel TPR Shadow */
......
...@@ -31,6 +31,7 @@ void __cpuinit init_scattered_cpuid_features(struct cpuinfo_x86 *c) ...@@ -31,6 +31,7 @@ void __cpuinit init_scattered_cpuid_features(struct cpuinfo_x86 *c)
const struct cpuid_bit *cb; const struct cpuid_bit *cb;
static const struct cpuid_bit __cpuinitconst cpuid_bits[] = { static const struct cpuid_bit __cpuinitconst cpuid_bits[] = {
{ X86_FEATURE_DTS, CR_EAX, 0, 0x00000006, 0 },
{ X86_FEATURE_IDA, CR_EAX, 1, 0x00000006, 0 }, { X86_FEATURE_IDA, CR_EAX, 1, 0x00000006, 0 },
{ X86_FEATURE_ARAT, CR_EAX, 2, 0x00000006, 0 }, { X86_FEATURE_ARAT, CR_EAX, 2, 0x00000006, 0 },
{ X86_FEATURE_PLN, CR_EAX, 4, 0x00000006, 0 }, { X86_FEATURE_PLN, CR_EAX, 4, 0x00000006, 0 },
......
...@@ -409,7 +409,7 @@ config SENSORS_CORETEMP ...@@ -409,7 +409,7 @@ config SENSORS_CORETEMP
config SENSORS_PKGTEMP config SENSORS_PKGTEMP
tristate "Intel processor package temperature sensor" tristate "Intel processor package temperature sensor"
depends on X86 && PCI && EXPERIMENTAL depends on X86 && EXPERIMENTAL
help help
If you say yes here you get support for the package level temperature If you say yes here you get support for the package level temperature
sensor inside your CPU. Check documentation/driver for details. sensor inside your CPU. Check documentation/driver for details.
......
...@@ -423,9 +423,18 @@ static int __cpuinit coretemp_device_add(unsigned int cpu) ...@@ -423,9 +423,18 @@ static int __cpuinit coretemp_device_add(unsigned int cpu)
int err; int err;
struct platform_device *pdev; struct platform_device *pdev;
struct pdev_entry *pdev_entry; struct pdev_entry *pdev_entry;
#ifdef CONFIG_SMP
struct cpuinfo_x86 *c = &cpu_data(cpu); struct cpuinfo_x86 *c = &cpu_data(cpu);
#endif
/*
* CPUID.06H.EAX[0] indicates whether the CPU has thermal
* sensors. We check this bit only, all the early CPUs
* without thermal sensors will be filtered out.
*/
if (!cpu_has(c, X86_FEATURE_DTS)) {
printk(KERN_INFO DRVNAME ": CPU (model=0x%x)"
" has no thermal sensor.\n", c->x86_model);
return 0;
}
mutex_lock(&pdev_list_mutex); mutex_lock(&pdev_list_mutex);
...@@ -482,14 +491,22 @@ static int __cpuinit coretemp_device_add(unsigned int cpu) ...@@ -482,14 +491,22 @@ static int __cpuinit coretemp_device_add(unsigned int cpu)
static void coretemp_device_remove(unsigned int cpu) static void coretemp_device_remove(unsigned int cpu)
{ {
struct pdev_entry *p, *n; struct pdev_entry *p;
unsigned int i;
mutex_lock(&pdev_list_mutex); mutex_lock(&pdev_list_mutex);
list_for_each_entry_safe(p, n, &pdev_list, list) { list_for_each_entry(p, &pdev_list, list) {
if (p->cpu == cpu) { if (p->cpu != cpu)
platform_device_unregister(p->pdev); continue;
list_del(&p->list);
kfree(p); platform_device_unregister(p->pdev);
} list_del(&p->list);
mutex_unlock(&pdev_list_mutex);
kfree(p);
for_each_cpu(i, cpu_sibling_mask(cpu))
if (i != cpu && !coretemp_device_add(i))
break;
return;
} }
mutex_unlock(&pdev_list_mutex); mutex_unlock(&pdev_list_mutex);
} }
...@@ -527,30 +544,21 @@ static int __init coretemp_init(void) ...@@ -527,30 +544,21 @@ static int __init coretemp_init(void)
if (err) if (err)
goto exit; goto exit;
for_each_online_cpu(i) { for_each_online_cpu(i)
struct cpuinfo_x86 *c = &cpu_data(i); coretemp_device_add(i);
/*
* CPUID.06H.EAX[0] indicates whether the CPU has thermal #ifndef CONFIG_HOTPLUG_CPU
* sensors. We check this bit only, all the early CPUs
* without thermal sensors will be filtered out.
*/
if (c->cpuid_level >= 6 && (cpuid_eax(0x06) & 0x01))
coretemp_device_add(i);
else {
printk(KERN_INFO DRVNAME ": CPU (model=0x%x)"
" has no thermal sensor.\n", c->x86_model);
}
}
if (list_empty(&pdev_list)) { if (list_empty(&pdev_list)) {
err = -ENODEV; err = -ENODEV;
goto exit_driver_unreg; goto exit_driver_unreg;
} }
#endif
register_hotcpu_notifier(&coretemp_cpu_notifier); register_hotcpu_notifier(&coretemp_cpu_notifier);
return 0; return 0;
exit_driver_unreg:
#ifndef CONFIG_HOTPLUG_CPU #ifndef CONFIG_HOTPLUG_CPU
exit_driver_unreg:
platform_driver_unregister(&coretemp_driver); platform_driver_unregister(&coretemp_driver);
#endif #endif
exit: exit:
......
...@@ -277,7 +277,7 @@ static irqreturn_t lis302dl_interrupt(int irq, void *dummy) ...@@ -277,7 +277,7 @@ static irqreturn_t lis302dl_interrupt(int irq, void *dummy)
wake_up_interruptible(&lis3_dev.misc_wait); wake_up_interruptible(&lis3_dev.misc_wait);
kill_fasync(&lis3_dev.async_queue, SIGIO, POLL_IN); kill_fasync(&lis3_dev.async_queue, SIGIO, POLL_IN);
out: out:
if (lis3_dev.whoami == WAI_8B && lis3_dev.idev && if (lis3_dev.pdata && lis3_dev.whoami == WAI_8B && lis3_dev.idev &&
lis3_dev.idev->input->users) lis3_dev.idev->input->users)
return IRQ_WAKE_THREAD; return IRQ_WAKE_THREAD;
return IRQ_HANDLED; return IRQ_HANDLED;
...@@ -718,7 +718,7 @@ int lis3lv02d_init_device(struct lis3lv02d *dev) ...@@ -718,7 +718,7 @@ int lis3lv02d_init_device(struct lis3lv02d *dev)
* io-apic is not configurable (and generates a warning) but I keep it * io-apic is not configurable (and generates a warning) but I keep it
* in case of support for other hardware. * in case of support for other hardware.
*/ */
if (dev->whoami == WAI_8B) if (dev->pdata && dev->whoami == WAI_8B)
thread_fn = lis302dl_interrupt_thread1_8b; thread_fn = lis302dl_interrupt_thread1_8b;
else else
thread_fn = NULL; thread_fn = NULL;
......
...@@ -33,7 +33,6 @@ ...@@ -33,7 +33,6 @@
#include <linux/list.h> #include <linux/list.h>
#include <linux/platform_device.h> #include <linux/platform_device.h>
#include <linux/cpu.h> #include <linux/cpu.h>
#include <linux/pci.h>
#include <asm/msr.h> #include <asm/msr.h>
#include <asm/processor.h> #include <asm/processor.h>
...@@ -224,7 +223,7 @@ static int __devinit pkgtemp_probe(struct platform_device *pdev) ...@@ -224,7 +223,7 @@ static int __devinit pkgtemp_probe(struct platform_device *pdev)
err = sysfs_create_group(&pdev->dev.kobj, &pkgtemp_group); err = sysfs_create_group(&pdev->dev.kobj, &pkgtemp_group);
if (err) if (err)
goto exit_free; goto exit_dev;
data->hwmon_dev = hwmon_device_register(&pdev->dev); data->hwmon_dev = hwmon_device_register(&pdev->dev);
if (IS_ERR(data->hwmon_dev)) { if (IS_ERR(data->hwmon_dev)) {
...@@ -238,6 +237,8 @@ static int __devinit pkgtemp_probe(struct platform_device *pdev) ...@@ -238,6 +237,8 @@ static int __devinit pkgtemp_probe(struct platform_device *pdev)
exit_class: exit_class:
sysfs_remove_group(&pdev->dev.kobj, &pkgtemp_group); sysfs_remove_group(&pdev->dev.kobj, &pkgtemp_group);
exit_dev:
device_remove_file(&pdev->dev, &sensor_dev_attr_temp1_max.dev_attr);
exit_free: exit_free:
kfree(data); kfree(data);
exit: exit:
...@@ -250,6 +251,7 @@ static int __devexit pkgtemp_remove(struct platform_device *pdev) ...@@ -250,6 +251,7 @@ static int __devexit pkgtemp_remove(struct platform_device *pdev)
hwmon_device_unregister(data->hwmon_dev); hwmon_device_unregister(data->hwmon_dev);
sysfs_remove_group(&pdev->dev.kobj, &pkgtemp_group); sysfs_remove_group(&pdev->dev.kobj, &pkgtemp_group);
device_remove_file(&pdev->dev, &sensor_dev_attr_temp1_max.dev_attr);
platform_set_drvdata(pdev, NULL); platform_set_drvdata(pdev, NULL);
kfree(data); kfree(data);
return 0; return 0;
...@@ -281,9 +283,10 @@ static int __cpuinit pkgtemp_device_add(unsigned int cpu) ...@@ -281,9 +283,10 @@ static int __cpuinit pkgtemp_device_add(unsigned int cpu)
int err; int err;
struct platform_device *pdev; struct platform_device *pdev;
struct pdev_entry *pdev_entry; struct pdev_entry *pdev_entry;
#ifdef CONFIG_SMP
struct cpuinfo_x86 *c = &cpu_data(cpu); struct cpuinfo_x86 *c = &cpu_data(cpu);
#endif
if (!cpu_has(c, X86_FEATURE_PTS))
return 0;
mutex_lock(&pdev_list_mutex); mutex_lock(&pdev_list_mutex);
...@@ -339,17 +342,18 @@ static int __cpuinit pkgtemp_device_add(unsigned int cpu) ...@@ -339,17 +342,18 @@ static int __cpuinit pkgtemp_device_add(unsigned int cpu)
#ifdef CONFIG_HOTPLUG_CPU #ifdef CONFIG_HOTPLUG_CPU
static void pkgtemp_device_remove(unsigned int cpu) static void pkgtemp_device_remove(unsigned int cpu)
{ {
struct pdev_entry *p, *n; struct pdev_entry *p;
unsigned int i; unsigned int i;
int err; int err;
mutex_lock(&pdev_list_mutex); mutex_lock(&pdev_list_mutex);
list_for_each_entry_safe(p, n, &pdev_list, list) { list_for_each_entry(p, &pdev_list, list) {
if (p->cpu != cpu) if (p->cpu != cpu)
continue; continue;
platform_device_unregister(p->pdev); platform_device_unregister(p->pdev);
list_del(&p->list); list_del(&p->list);
mutex_unlock(&pdev_list_mutex);
kfree(p); kfree(p);
for_each_cpu(i, cpu_core_mask(cpu)) { for_each_cpu(i, cpu_core_mask(cpu)) {
if (i != cpu) { if (i != cpu) {
...@@ -358,7 +362,7 @@ static void pkgtemp_device_remove(unsigned int cpu) ...@@ -358,7 +362,7 @@ static void pkgtemp_device_remove(unsigned int cpu)
break; break;
} }
} }
break; return;
} }
mutex_unlock(&pdev_list_mutex); mutex_unlock(&pdev_list_mutex);
} }
...@@ -399,11 +403,6 @@ static int __init pkgtemp_init(void) ...@@ -399,11 +403,6 @@ static int __init pkgtemp_init(void)
goto exit; goto exit;
for_each_online_cpu(i) { for_each_online_cpu(i) {
struct cpuinfo_x86 *c = &cpu_data(i);
if (!cpu_has(c, X86_FEATURE_PTS))
continue;
err = pkgtemp_device_add(i); err = pkgtemp_device_add(i);
if (err) if (err)
goto exit_devices_unreg; goto exit_devices_unreg;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment