diff options
author | Zhang Rui <rui.zhang@intel.com> | 2014-03-13 12:34:05 -0400 |
---|---|---|
committer | Zhang Rui <rui.zhang@intel.com> | 2014-09-11 11:35:15 -0400 |
commit | 3230bbfce8a9270acc77fafd0d9ff90e94f28993 (patch) | |
tree | 6565a4262c6198ade0c1d1d97f3b930f59aa107e /drivers/acpi | |
parent | 52addcf9d6669fa439387610bc65c92fa0980cef (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>
Diffstat (limited to 'drivers/acpi')
-rw-r--r-- | drivers/acpi/Makefile | 1 | ||||
-rw-r--r-- | drivers/acpi/int340x_thermal.c | 51 | ||||
-rw-r--r-- | drivers/acpi/internal.h | 1 | ||||
-rw-r--r-- | drivers/acpi/scan.c | 1 |
4 files changed, 54 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 | |||
43 | acpi-y += acpi_lpss.o | 43 | acpi-y += acpi_lpss.o |
44 | acpi-y += acpi_platform.o | 44 | acpi-y += acpi_platform.o |
45 | acpi-y += acpi_pnp.o | 45 | acpi-y += acpi_pnp.o |
46 | acpi-y += int340x_thermal.o | ||
46 | acpi-y += power.o | 47 | acpi-y += power.o |
47 | acpi-y += event.o | 48 | acpi-y += event.o |
48 | acpi-y += sysfs.o | 49 | acpi-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 | ||
18 | static 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 | |||
33 | static 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 | |||
43 | static struct acpi_scan_handler int340x_thermal_handler = { | ||
44 | .ids = int340x_thermal_device_ids, | ||
45 | .attach = int340x_thermal_handler_attach, | ||
46 | }; | ||
47 | |||
48 | void __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); | |||
31 | void acpi_processor_init(void); | 31 | void acpi_processor_init(void); |
32 | void acpi_platform_init(void); | 32 | void acpi_platform_init(void); |
33 | void acpi_pnp_init(void); | 33 | void acpi_pnp_init(void); |
34 | void acpi_int340x_thermal_init(void); | ||
34 | int acpi_sysfs_init(void); | 35 | int acpi_sysfs_init(void); |
35 | void acpi_container_init(void); | 36 | void acpi_container_init(void); |
36 | void acpi_memory_hotplug_init(void); | 37 | void 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 | /* |