]> asedeno.scripts.mit.edu Git - linux.git/blobdiff - drivers/acpi/processor_driver.c
cxgb4: Signedness bug in init_one()
[linux.git] / drivers / acpi / processor_driver.c
index aea8d674a33d106c07b143f0b1ef50b2b9bc7f0e..08da9c29f1e9a8fe722e5bfc7895357b5ec3277e 100644 (file)
@@ -284,6 +284,29 @@ static int acpi_processor_stop(struct device *dev)
        return 0;
 }
 
+bool acpi_processor_cpufreq_init;
+
+static int acpi_processor_notifier(struct notifier_block *nb,
+                                  unsigned long event, void *data)
+{
+       struct cpufreq_policy *policy = data;
+       int cpu = policy->cpu;
+
+       if (event == CPUFREQ_CREATE_POLICY) {
+               acpi_thermal_cpufreq_init(cpu);
+               acpi_processor_ppc_init(cpu);
+       } else if (event == CPUFREQ_REMOVE_POLICY) {
+               acpi_processor_ppc_exit(cpu);
+               acpi_thermal_cpufreq_exit(cpu);
+       }
+
+       return 0;
+}
+
+static struct notifier_block acpi_processor_notifier_block = {
+       .notifier_call = acpi_processor_notifier,
+};
+
 /*
  * We keep the driver loaded even when ACPI is not running.
  * This is needed for the powernow-k8 driver, that works even without
@@ -310,8 +333,12 @@ static int __init acpi_processor_driver_init(void)
        cpuhp_setup_state_nocalls(CPUHP_ACPI_CPUDRV_DEAD, "acpi/cpu-drv:dead",
                                  NULL, acpi_soft_cpu_dead);
 
-       acpi_thermal_cpufreq_init();
-       acpi_processor_ppc_init();
+       if (!cpufreq_register_notifier(&acpi_processor_notifier_block,
+                                      CPUFREQ_POLICY_NOTIFIER)) {
+               acpi_processor_cpufreq_init = true;
+               acpi_processor_ignore_ppc_init();
+       }
+
        acpi_processor_throttling_init();
        return 0;
 err:
@@ -324,8 +351,12 @@ static void __exit acpi_processor_driver_exit(void)
        if (acpi_disabled)
                return;
 
-       acpi_processor_ppc_exit();
-       acpi_thermal_cpufreq_exit();
+       if (acpi_processor_cpufreq_init) {
+               cpufreq_unregister_notifier(&acpi_processor_notifier_block,
+                                           CPUFREQ_POLICY_NOTIFIER);
+               acpi_processor_cpufreq_init = false;
+       }
+
        cpuhp_remove_state_nocalls(hp_online);
        cpuhp_remove_state_nocalls(CPUHP_ACPI_CPUDRV_DEAD);
        driver_unregister(&acpi_processor_driver);