]> git.karo-electronics.de Git - karo-tx-linux.git/blobdiff - drivers/acpi/processor_core.c
cpuidle: fix C3 for no bus-master control case
[karo-tx-linux.git] / drivers / acpi / processor_core.c
index 9f11dc296cdd7bc29f5545cd8524eb03ede594e3..a7351084f2f8d48a28c5e024aff9a0b83ac8dce2 100644 (file)
@@ -44,6 +44,7 @@
 #include <linux/seq_file.h>
 #include <linux/dmi.h>
 #include <linux/moduleparam.h>
+#include <linux/cpuidle.h>
 
 #include <asm/io.h>
 #include <asm/system.h>
@@ -1049,11 +1050,13 @@ static int __init acpi_processor_init(void)
                return -ENOMEM;
        acpi_processor_dir->owner = THIS_MODULE;
 
+       result = cpuidle_register_driver(&acpi_idle_driver);
+       if (result < 0)
+               goto out_proc;
+
        result = acpi_bus_register_driver(&acpi_processor_driver);
-       if (result < 0) {
-               remove_proc_entry(ACPI_PROCESSOR_CLASS, acpi_root_dir);
-               return result;
-       }
+       if (result < 0)
+               goto out_cpuidle;
 
        acpi_processor_install_hotplug_notify();
 
@@ -1062,11 +1065,18 @@ static int __init acpi_processor_init(void)
        acpi_processor_ppc_init();
 
        return 0;
+
+out_cpuidle:
+       cpuidle_unregister_driver(&acpi_idle_driver);
+
+out_proc:
+       remove_proc_entry(ACPI_PROCESSOR_CLASS, acpi_root_dir);
+
+       return result;
 }
 
 static void __exit acpi_processor_exit(void)
 {
-
        acpi_processor_ppc_exit();
 
        acpi_thermal_cpufreq_exit();
@@ -1075,6 +1085,8 @@ static void __exit acpi_processor_exit(void)
 
        acpi_bus_unregister_driver(&acpi_processor_driver);
 
+       cpuidle_unregister_driver(&acpi_idle_driver);
+
        remove_proc_entry(ACPI_PROCESSOR_CLASS, acpi_root_dir);
 
        return;