diff options
Diffstat (limited to 'drivers/acpi/processor_driver.c')
| -rw-r--r-- | drivers/acpi/processor_driver.c | 39 | 
1 files changed, 35 insertions, 4 deletions
diff --git a/drivers/acpi/processor_driver.c b/drivers/acpi/processor_driver.c index aea8d674a33d..08da9c29f1e9 100644 --- a/drivers/acpi/processor_driver.c +++ b/drivers/acpi/processor_driver.c @@ -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);  |