aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorZhang Rui <rui.zhang@intel.com>2014-03-13 12:34:05 -0400
committerZhang Rui <rui.zhang@intel.com>2014-09-11 11:35:15 -0400
commit3230bbfce8a9270acc77fafd0d9ff90e94f28993 (patch)
tree6565a4262c6198ade0c1d1d97f3b930f59aa107e
parent52addcf9d6669fa439387610bc65c92fa0980cef (diff)
ACPI: introduce ACPI int340x thermal scan handler
Newer laptops and tablets that use ACPI may have thermal sensors and other devices with thermal control capabilities outside the core CPU/SOC, for thermal safety reasons. They are exposed for the OS to use via 1) INT3400 ACPI device object as the master. 2) INT3401 ~ INT340B ACPI device objects as the slaves. This patch introduces a scan handler to enumerate the INT3400 ACPI device object to platform bus, and prevent its slaves from being enumerated before the controller driver being probed. Signed-off-by: Zhang Rui <rui.zhang@intel.com>
-rw-r--r--drivers/acpi/Makefile1
-rw-r--r--drivers/acpi/int340x_thermal.c51
-rw-r--r--drivers/acpi/internal.h1
-rw-r--r--drivers/acpi/scan.c1
-rw-r--r--drivers/thermal/Kconfig17
5 files changed, 71 insertions, 0 deletions
diff --git a/drivers/acpi/Makefile b/drivers/acpi/Makefile
index 505d4d79fe3e..c3b2fcb729f3 100644
--- a/drivers/acpi/Makefile
+++ b/drivers/acpi/Makefile
@@ -43,6 +43,7 @@ acpi-y += pci_root.o pci_link.o pci_irq.o
43acpi-y += acpi_lpss.o 43acpi-y += acpi_lpss.o
44acpi-y += acpi_platform.o 44acpi-y += acpi_platform.o
45acpi-y += acpi_pnp.o 45acpi-y += acpi_pnp.o
46acpi-y += int340x_thermal.o
46acpi-y += power.o 47acpi-y += power.o
47acpi-y += event.o 48acpi-y += event.o
48acpi-y += sysfs.o 49acpi-y += sysfs.o
diff --git a/drivers/acpi/int340x_thermal.c b/drivers/acpi/int340x_thermal.c
new file mode 100644
index 000000000000..2103bb6d9016
--- /dev/null
+++ b/drivers/acpi/int340x_thermal.c
@@ -0,0 +1,51 @@
1/*
2 * ACPI support for int340x thermal drivers
3 *
4 * Copyright (C) 2014, Intel Corporation
5 * Authors: Zhang Rui <rui.zhang@intel.com>
6 *
7 * This program is free software; you can redistribute it and/or modify
8 * it under the terms of the GNU General Public License version 2 as
9 * published by the Free Software Foundation.
10 */
11
12#include <linux/acpi.h>
13#include <linux/module.h>
14
15#include "internal.h"
16
17#define DO_ENUMERATION 0x01
18static const struct acpi_device_id int340x_thermal_device_ids[] = {
19 {"INT3400", DO_ENUMERATION },
20 {"INT3401"},
21 {"INT3402"},
22 {"INT3403"},
23 {"INT3404"},
24 {"INT3406"},
25 {"INT3407"},
26 {"INT3408"},
27 {"INT3409"},
28 {"INT340A"},
29 {"INT340B"},
30 {""},
31};
32
33static int int340x_thermal_handler_attach(struct acpi_device *adev,
34 const struct acpi_device_id *id)
35{
36#ifdef CONFIG_INT340X_THERMAL
37 if (id->driver_data == DO_ENUMERATION)
38 acpi_create_platform_device(adev);
39#endif
40 return 1;
41}
42
43static struct acpi_scan_handler int340x_thermal_handler = {
44 .ids = int340x_thermal_device_ids,
45 .attach = int340x_thermal_handler_attach,
46};
47
48void __init acpi_int340x_thermal_init(void)
49{
50 acpi_scan_add_handler(&int340x_thermal_handler);
51}
diff --git a/drivers/acpi/internal.h b/drivers/acpi/internal.h
index 4c5cf77e7576..de47f9f746c9 100644
--- a/drivers/acpi/internal.h
+++ b/drivers/acpi/internal.h
@@ -31,6 +31,7 @@ void acpi_pci_link_init(void);
31void acpi_processor_init(void); 31void acpi_processor_init(void);
32void acpi_platform_init(void); 32void acpi_platform_init(void);
33void acpi_pnp_init(void); 33void acpi_pnp_init(void);
34void acpi_int340x_thermal_init(void);
34int acpi_sysfs_init(void); 35int acpi_sysfs_init(void);
35void acpi_container_init(void); 36void acpi_container_init(void);
36void acpi_memory_hotplug_init(void); 37void acpi_memory_hotplug_init(void);
diff --git a/drivers/acpi/scan.c b/drivers/acpi/scan.c
index 0a817ad24f16..eed9740651f8 100644
--- a/drivers/acpi/scan.c
+++ b/drivers/acpi/scan.c
@@ -2306,6 +2306,7 @@ int __init acpi_scan_init(void)
2306 acpi_container_init(); 2306 acpi_container_init();
2307 acpi_memory_hotplug_init(); 2307 acpi_memory_hotplug_init();
2308 acpi_pnp_init(); 2308 acpi_pnp_init();
2309 acpi_int340x_thermal_init();
2309 2310
2310 mutex_lock(&acpi_scan_lock); 2311 mutex_lock(&acpi_scan_lock);
2311 /* 2312 /*
diff --git a/drivers/thermal/Kconfig b/drivers/thermal/Kconfig
index 693208eb9047..2ff7416ca930 100644
--- a/drivers/thermal/Kconfig
+++ b/drivers/thermal/Kconfig
@@ -234,6 +234,23 @@ config INTEL_SOC_DTS_THERMAL
234 notification methods.The other trip is a critical trip point, which 234 notification methods.The other trip is a critical trip point, which
235 was set by the driver based on the TJ MAX temperature. 235 was set by the driver based on the TJ MAX temperature.
236 236
237config INT340X_THERMAL
238 bool
239 depends on X86 && ACPI
240 help
241 Newer laptops and tablets that use ACPI may have thermal sensors and
242 other devices with thermal control capabilities outside the core
243 CPU/SOC, for thermal safety reasons.
244 They are exposed for the OS to use via the INT3400 ACPI device object
245 as the master, and INT3401~INT340B ACPI device objects as the slaves.
246 Enable this to expose the temperature information and cooling ability
247 from these objects to userspace via the normal thermal framework.
248 This means that a wide range of applications and GUI widgets can show
249 the information to the user or use this information for making
250 decisions. For example, the Intel Thermal Daemon can use this
251 information to allow the user to select his laptop to run without
252 turning on the fans.
253
237menu "Texas Instruments thermal drivers" 254menu "Texas Instruments thermal drivers"
238source "drivers/thermal/ti-soc-thermal/Kconfig" 255source "drivers/thermal/ti-soc-thermal/Kconfig"
239endmenu 256endmenu