]> www.infradead.org Git - users/jedix/linux-maple.git/commitdiff
ACPI: processor: add __acpi_processor_[un]register_driver helpers.
authorTang Liang <liang.tang@oracle.com>
Wed, 19 Oct 2011 09:01:20 +0000 (17:01 +0800)
committerKonrad Rzeszutek Wilk <konrad.wilk@oracle.com>
Tue, 13 Dec 2011 17:03:14 +0000 (12:03 -0500)
This patch implement __acpi_processor_[un]register_driver helper,
so we can registry override processor driver function. Specifically
the Xen processor driver.

By default the values are set to the native one.

Signed-off-by: Tang Liang <liang.tang@oracle.com>
Signed-off-by: Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>
drivers/acpi/processor_driver.c
include/acpi/processor.h

index bd6288ba15542d983e5c5b7f3142a4380a448e2b..f76b00e303b9421c3b3d0d1729efd32e9ff6d87c 100644 (file)
@@ -90,6 +90,11 @@ static const struct acpi_device_id processor_device_ids[] = {
 };
 MODULE_DEVICE_TABLE(acpi, processor_device_ids);
 
+int (*__acpi_processor_register_driver)(void) = acpi_processor_register_driver;
+void (*__acpi_processor_unregister_driver)(void) \
+       = acpi_processor_unregister_driver;
+
+
 static struct acpi_driver acpi_processor_driver = {
        .name = "processor",
        .class = ACPI_PROCESSOR_CLASS,
@@ -780,6 +785,29 @@ void acpi_processor_uninstall_hotplug_notify(void)
        unregister_hotcpu_notifier(&acpi_cpu_notifier);
 }
 
+int acpi_processor_register_driver(void)
+{
+       int result = 0;
+       if (!cpuidle_register_driver(&acpi_idle_driver)) {
+               printk(KERN_DEBUG "ACPI: %s registered with cpuidle\n",
+                       acpi_idle_driver.name);
+       } else {
+               printk(KERN_DEBUG "ACPI: acpi_idle yielding to %s\n",
+                       cpuidle_get_driver()->name);
+       }
+
+       result = acpi_bus_register_driver(&acpi_processor_driver);
+       return result;
+}
+
+void acpi_processor_unregister_driver(void)
+{
+       acpi_bus_unregister_driver(&acpi_processor_driver);
+
+       cpuidle_unregister_driver(&acpi_idle_driver);
+
+       return;
+}
 /*
  * We keep the driver loaded even when ACPI is not running.
  * This is needed for the powernow-k8 driver, that works even without
@@ -795,18 +823,12 @@ static int __init acpi_processor_init(void)
 
        memset(&errata, 0, sizeof(errata));
 
-       if (!cpuidle_register_driver(&acpi_idle_driver)) {
-               printk(KERN_DEBUG "ACPI: %s registered with cpuidle\n",
-                       acpi_idle_driver.name);
-       } else {
-               printk(KERN_DEBUG "ACPI: acpi_idle yielding to %s\n",
-                       cpuidle_get_driver()->name);
+       if (__acpi_processor_register_driver) {
+               result = __acpi_processor_register_driver();
+               if (result < 0)
+                       goto out_cpuidle;
        }
 
-       result = acpi_bus_register_driver(&acpi_processor_driver);
-       if (result < 0)
-               goto out_cpuidle;
-
        acpi_processor_install_hotplug_notify();
 
        acpi_thermal_cpufreq_init();
@@ -823,6 +845,7 @@ out_cpuidle:
        return result;
 }
 
+
 static void __exit acpi_processor_exit(void)
 {
        if (acpi_disabled)
@@ -834,9 +857,8 @@ static void __exit acpi_processor_exit(void)
 
        acpi_processor_uninstall_hotplug_notify();
 
-       acpi_bus_unregister_driver(&acpi_processor_driver);
-
-       cpuidle_unregister_driver(&acpi_idle_driver);
+       if (__acpi_processor_unregister_driver)
+               __acpi_processor_unregister_driver();
 
        return;
 }
index 94b10a14aafbe412566d574ee6558790bcb726d6..b84bc2bcfa3e58d48a2da8634525d1904559d2ca 100644 (file)
@@ -242,7 +242,8 @@ int acpi_processor_notify_smm(struct module *calling_module);
 
 void acpi_processor_install_hotplug_notify(void);
 void acpi_processor_uninstall_hotplug_notify(void);
-
+int acpi_processor_register_driver(void);
+void acpi_processor_unregister_driver(void);
 int acpi_processor_add(struct acpi_device *device);
 int acpi_processor_remove(struct acpi_device *device, int type);
 void acpi_processor_notify(struct acpi_device *device, u32 event);