mirror of https://gitee.com/openkylin/linux.git
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
This commit is contained in:
commit
8ae09259ff
|
@ -2668,6 +2668,8 @@ M: Guenter Roeck <guenter.roeck@ericsson.com>
|
|||
L: lm-sensors@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/groeck/linux-staging/
|
||||
T: git git://git.kernel.org/pub/scm/linux/kernel/git/groeck/linux-staging.git
|
||||
S: Maintained
|
||||
F: Documentation/hwmon/
|
||||
F: drivers/hwmon/
|
||||
|
|
|
@ -168,6 +168,7 @@
|
|||
#define X86_FEATURE_XSAVEOPT (7*32+ 4) /* Optimized Xsave */
|
||||
#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_DTS (7*32+ 7) /* Digital Thermal Sensor */
|
||||
|
||||
/* Virtualization flags: Linux defined, word 8 */
|
||||
#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)
|
|||
const struct cpuid_bit *cb;
|
||||
|
||||
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_ARAT, CR_EAX, 2, 0x00000006, 0 },
|
||||
{ X86_FEATURE_PLN, CR_EAX, 4, 0x00000006, 0 },
|
||||
|
|
|
@ -409,7 +409,7 @@ config SENSORS_CORETEMP
|
|||
|
||||
config SENSORS_PKGTEMP
|
||||
tristate "Intel processor package temperature sensor"
|
||||
depends on X86 && PCI && EXPERIMENTAL
|
||||
depends on X86 && EXPERIMENTAL
|
||||
help
|
||||
If you say yes here you get support for the package level temperature
|
||||
sensor inside your CPU. Check documentation/driver for details.
|
||||
|
|
|
@ -423,9 +423,18 @@ static int __cpuinit coretemp_device_add(unsigned int cpu)
|
|||
int err;
|
||||
struct platform_device *pdev;
|
||||
struct pdev_entry *pdev_entry;
|
||||
#ifdef CONFIG_SMP
|
||||
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);
|
||||
|
||||
|
@ -482,14 +491,22 @@ static int __cpuinit coretemp_device_add(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);
|
||||
list_for_each_entry_safe(p, n, &pdev_list, list) {
|
||||
if (p->cpu == cpu) {
|
||||
platform_device_unregister(p->pdev);
|
||||
list_del(&p->list);
|
||||
kfree(p);
|
||||
}
|
||||
list_for_each_entry(p, &pdev_list, list) {
|
||||
if (p->cpu != cpu)
|
||||
continue;
|
||||
|
||||
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);
|
||||
}
|
||||
|
@ -527,30 +544,21 @@ static int __init coretemp_init(void)
|
|||
if (err)
|
||||
goto exit;
|
||||
|
||||
for_each_online_cpu(i) {
|
||||
struct cpuinfo_x86 *c = &cpu_data(i);
|
||||
/*
|
||||
* 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 (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);
|
||||
}
|
||||
}
|
||||
for_each_online_cpu(i)
|
||||
coretemp_device_add(i);
|
||||
|
||||
#ifndef CONFIG_HOTPLUG_CPU
|
||||
if (list_empty(&pdev_list)) {
|
||||
err = -ENODEV;
|
||||
goto exit_driver_unreg;
|
||||
}
|
||||
#endif
|
||||
|
||||
register_hotcpu_notifier(&coretemp_cpu_notifier);
|
||||
return 0;
|
||||
|
||||
exit_driver_unreg:
|
||||
#ifndef CONFIG_HOTPLUG_CPU
|
||||
exit_driver_unreg:
|
||||
platform_driver_unregister(&coretemp_driver);
|
||||
#endif
|
||||
exit:
|
||||
|
|
|
@ -277,7 +277,7 @@ static irqreturn_t lis302dl_interrupt(int irq, void *dummy)
|
|||
wake_up_interruptible(&lis3_dev.misc_wait);
|
||||
kill_fasync(&lis3_dev.async_queue, SIGIO, POLL_IN);
|
||||
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)
|
||||
return IRQ_WAKE_THREAD;
|
||||
return IRQ_HANDLED;
|
||||
|
@ -718,7 +718,7 @@ int lis3lv02d_init_device(struct lis3lv02d *dev)
|
|||
* io-apic is not configurable (and generates a warning) but I keep it
|
||||
* 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;
|
||||
else
|
||||
thread_fn = NULL;
|
||||
|
|
|
@ -33,7 +33,6 @@
|
|||
#include <linux/list.h>
|
||||
#include <linux/platform_device.h>
|
||||
#include <linux/cpu.h>
|
||||
#include <linux/pci.h>
|
||||
#include <asm/msr.h>
|
||||
#include <asm/processor.h>
|
||||
|
||||
|
@ -224,7 +223,7 @@ static int __devinit pkgtemp_probe(struct platform_device *pdev)
|
|||
|
||||
err = sysfs_create_group(&pdev->dev.kobj, &pkgtemp_group);
|
||||
if (err)
|
||||
goto exit_free;
|
||||
goto exit_dev;
|
||||
|
||||
data->hwmon_dev = hwmon_device_register(&pdev->dev);
|
||||
if (IS_ERR(data->hwmon_dev)) {
|
||||
|
@ -238,6 +237,8 @@ static int __devinit pkgtemp_probe(struct platform_device *pdev)
|
|||
|
||||
exit_class:
|
||||
sysfs_remove_group(&pdev->dev.kobj, &pkgtemp_group);
|
||||
exit_dev:
|
||||
device_remove_file(&pdev->dev, &sensor_dev_attr_temp1_max.dev_attr);
|
||||
exit_free:
|
||||
kfree(data);
|
||||
exit:
|
||||
|
@ -250,6 +251,7 @@ static int __devexit pkgtemp_remove(struct platform_device *pdev)
|
|||
|
||||
hwmon_device_unregister(data->hwmon_dev);
|
||||
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);
|
||||
kfree(data);
|
||||
return 0;
|
||||
|
@ -281,9 +283,10 @@ static int __cpuinit pkgtemp_device_add(unsigned int cpu)
|
|||
int err;
|
||||
struct platform_device *pdev;
|
||||
struct pdev_entry *pdev_entry;
|
||||
#ifdef CONFIG_SMP
|
||||
struct cpuinfo_x86 *c = &cpu_data(cpu);
|
||||
#endif
|
||||
|
||||
if (!cpu_has(c, X86_FEATURE_PTS))
|
||||
return 0;
|
||||
|
||||
mutex_lock(&pdev_list_mutex);
|
||||
|
||||
|
@ -339,17 +342,18 @@ static int __cpuinit pkgtemp_device_add(unsigned int cpu)
|
|||
#ifdef CONFIG_HOTPLUG_CPU
|
||||
static void pkgtemp_device_remove(unsigned int cpu)
|
||||
{
|
||||
struct pdev_entry *p, *n;
|
||||
struct pdev_entry *p;
|
||||
unsigned int i;
|
||||
int err;
|
||||
|
||||
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)
|
||||
continue;
|
||||
|
||||
platform_device_unregister(p->pdev);
|
||||
list_del(&p->list);
|
||||
mutex_unlock(&pdev_list_mutex);
|
||||
kfree(p);
|
||||
for_each_cpu(i, cpu_core_mask(cpu)) {
|
||||
if (i != cpu) {
|
||||
|
@ -358,7 +362,7 @@ static void pkgtemp_device_remove(unsigned int cpu)
|
|||
break;
|
||||
}
|
||||
}
|
||||
break;
|
||||
return;
|
||||
}
|
||||
mutex_unlock(&pdev_list_mutex);
|
||||
}
|
||||
|
@ -399,11 +403,6 @@ static int __init pkgtemp_init(void)
|
|||
goto exit;
|
||||
|
||||
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);
|
||||
if (err)
|
||||
goto exit_devices_unreg;
|
||||
|
|
Loading…
Reference in New Issue