aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorRafael J. Wysocki <rafael.j.wysocki@intel.com>2014-05-29 22:29:14 -0400
committerRafael J. Wysocki <rafael.j.wysocki@intel.com>2014-05-30 10:04:36 -0400
commitcccd420859a419756bc4ed25d52989a47d702561 (patch)
tree3005a0d54baf2a6d85fdd20790bef62fb547008d
parenta1ec657213b4abb00e59385171554a3e11eec27c (diff)
ACPI / scan: always register memory hotplug scan handler
Prevent platform devices from being created for ACPI memory device objects if CONFIG_ACPI_HOTPLUG_MEMORY is unset by compiling out the memory hotplug scan handler's callbacks only in that case and still compiling its device ID list in and registering the scan handler in either case. Also unset the memory hotplug scan handler's .attach() callback if acpi_no_memhotplug is set, but still register the scan handler to avoid creating platform devices for ACPI memory devices in that case too. This change is based on a prototype from Zhang Rui. Signed-off-by: Rafael J. Wysocki <rafael.j.wysocki@intel.com> Reviewed-by: Mika Westerberg <mika.westerberg@linux.intel.com>
-rw-r--r--drivers/acpi/Makefile2
-rw-r--r--drivers/acpi/acpi_memhotplug.c31
-rw-r--r--drivers/acpi/internal.h6
3 files changed, 26 insertions, 13 deletions
diff --git a/drivers/acpi/Makefile b/drivers/acpi/Makefile
index 4f23f3295b12..f1c9266430d9 100644
--- a/drivers/acpi/Makefile
+++ b/drivers/acpi/Makefile
@@ -66,7 +66,7 @@ obj-$(CONFIG_ACPI_PCI_SLOT) += pci_slot.o
66obj-$(CONFIG_ACPI_PROCESSOR) += processor.o 66obj-$(CONFIG_ACPI_PROCESSOR) += processor.o
67obj-y += container.o 67obj-y += container.o
68obj-$(CONFIG_ACPI_THERMAL) += thermal.o 68obj-$(CONFIG_ACPI_THERMAL) += thermal.o
69obj-$(CONFIG_ACPI_HOTPLUG_MEMORY) += acpi_memhotplug.o 69obj-y += acpi_memhotplug.o
70obj-$(CONFIG_ACPI_BATTERY) += battery.o 70obj-$(CONFIG_ACPI_BATTERY) += battery.o
71obj-$(CONFIG_ACPI_SBS) += sbshc.o 71obj-$(CONFIG_ACPI_SBS) += sbshc.o
72obj-$(CONFIG_ACPI_SBS) += sbs.o 72obj-$(CONFIG_ACPI_SBS) += sbs.o
diff --git a/drivers/acpi/acpi_memhotplug.c b/drivers/acpi/acpi_memhotplug.c
index b67be85ff0fc..23e2319ead41 100644
--- a/drivers/acpi/acpi_memhotplug.c
+++ b/drivers/acpi/acpi_memhotplug.c
@@ -44,6 +44,13 @@
44 44
45ACPI_MODULE_NAME("acpi_memhotplug"); 45ACPI_MODULE_NAME("acpi_memhotplug");
46 46
47static const struct acpi_device_id memory_device_ids[] = {
48 {ACPI_MEMORY_DEVICE_HID, 0},
49 {"", 0},
50};
51
52#ifdef CONFIG_ACPI_HOTPLUG_MEMORY
53
47/* Memory Device States */ 54/* Memory Device States */
48#define MEMORY_INVALID_STATE 0 55#define MEMORY_INVALID_STATE 0
49#define MEMORY_POWER_ON_STATE 1 56#define MEMORY_POWER_ON_STATE 1
@@ -53,11 +60,6 @@ static int acpi_memory_device_add(struct acpi_device *device,
53 const struct acpi_device_id *not_used); 60 const struct acpi_device_id *not_used);
54static void acpi_memory_device_remove(struct acpi_device *device); 61static void acpi_memory_device_remove(struct acpi_device *device);
55 62
56static const struct acpi_device_id memory_device_ids[] = {
57 {ACPI_MEMORY_DEVICE_HID, 0},
58 {"", 0},
59};
60
61static struct acpi_scan_handler memory_device_handler = { 63static struct acpi_scan_handler memory_device_handler = {
62 .ids = memory_device_ids, 64 .ids = memory_device_ids,
63 .attach = acpi_memory_device_add, 65 .attach = acpi_memory_device_add,
@@ -364,9 +366,11 @@ static bool __initdata acpi_no_memhotplug;
364 366
365void __init acpi_memory_hotplug_init(void) 367void __init acpi_memory_hotplug_init(void)
366{ 368{
367 if (acpi_no_memhotplug) 369 if (acpi_no_memhotplug) {
370 memory_device_handler.attach = NULL;
371 acpi_scan_add_handler(&memory_device_handler);
368 return; 372 return;
369 373 }
370 acpi_scan_add_handler_with_hotplug(&memory_device_handler, "memory"); 374 acpi_scan_add_handler_with_hotplug(&memory_device_handler, "memory");
371} 375}
372 376
@@ -376,3 +380,16 @@ static int __init disable_acpi_memory_hotplug(char *str)
376 return 1; 380 return 1;
377} 381}
378__setup("acpi_no_memhotplug", disable_acpi_memory_hotplug); 382__setup("acpi_no_memhotplug", disable_acpi_memory_hotplug);
383
384#else
385
386static struct acpi_scan_handler memory_device_handler = {
387 .ids = memory_device_ids,
388};
389
390void __init acpi_memory_hotplug_init(void)
391{
392 acpi_scan_add_handler(&memory_device_handler);
393}
394
395#endif /* CONFIG_ACPI_HOTPLUG_MEMORY */
diff --git a/drivers/acpi/internal.h b/drivers/acpi/internal.h
index cc93efd22a24..5ad27bf8e4bd 100644
--- a/drivers/acpi/internal.h
+++ b/drivers/acpi/internal.h
@@ -33,6 +33,7 @@ void acpi_platform_init(void);
33void acpi_pnp_init(void); 33void acpi_pnp_init(void);
34int acpi_sysfs_init(void); 34int acpi_sysfs_init(void);
35void acpi_container_init(void); 35void acpi_container_init(void);
36void acpi_memory_hotplug_init(void);
36#ifdef CONFIG_ACPI_DOCK 37#ifdef CONFIG_ACPI_DOCK
37void register_dock_dependent_device(struct acpi_device *adev, 38void register_dock_dependent_device(struct acpi_device *adev,
38 acpi_handle dshandle); 39 acpi_handle dshandle);
@@ -44,11 +45,6 @@ static inline void register_dock_dependent_device(struct acpi_device *adev,
44static inline int dock_notify(struct acpi_device *adev, u32 event) { return -ENODEV; } 45static inline int dock_notify(struct acpi_device *adev, u32 event) { return -ENODEV; }
45static inline void acpi_dock_add(struct acpi_device *adev) {} 46static inline void acpi_dock_add(struct acpi_device *adev) {}
46#endif 47#endif
47#ifdef CONFIG_ACPI_HOTPLUG_MEMORY
48void acpi_memory_hotplug_init(void);
49#else
50static inline void acpi_memory_hotplug_init(void) {}
51#endif
52#ifdef CONFIG_X86 48#ifdef CONFIG_X86
53void acpi_cmos_rtc_init(void); 49void acpi_cmos_rtc_init(void);
54#else 50#else