diff options
Diffstat (limited to 'drivers/acpi/processor_driver.c')
| -rw-r--r-- | drivers/acpi/processor_driver.c | 43 | 
1 files changed, 12 insertions, 31 deletions
diff --git a/drivers/acpi/processor_driver.c b/drivers/acpi/processor_driver.c index 67db60eda370..cb52dd000b95 100644 --- a/drivers/acpi/processor_driver.c +++ b/drivers/acpi/processor_driver.c @@ -33,7 +33,6 @@ MODULE_AUTHOR("Paul Diefenbaugh");  MODULE_DESCRIPTION("ACPI Processor Driver");  MODULE_LICENSE("GPL"); -static int acpi_processor_start(struct device *dev);  static int acpi_processor_stop(struct device *dev);  static const struct acpi_device_id processor_device_ids[] = { @@ -47,7 +46,6 @@ static struct device_driver acpi_processor_driver = {  	.name = "processor",  	.bus = &cpu_subsys,  	.acpi_match_table = processor_device_ids, -	.probe = acpi_processor_start,  	.remove = acpi_processor_stop,  }; @@ -115,12 +113,9 @@ static int acpi_soft_cpu_online(unsigned int cpu)  	 * CPU got physically hotplugged and onlined for the first time:  	 * Initialize missing things.  	 */ -	if (pr->flags.need_hotplug_init) { +	if (!pr->flags.previously_online) {  		int ret; -		pr_info("Will online and init hotplugged CPU: %d\n", -			pr->id); -		pr->flags.need_hotplug_init = 0;  		ret = __acpi_processor_start(device);  		WARN(ret, "Failed to start CPU: %d\n", pr->id);  	} else { @@ -167,9 +162,6 @@ static int __acpi_processor_start(struct acpi_device *device)  	if (!pr)  		return -ENODEV; -	if (pr->flags.need_hotplug_init) -		return 0; -  	result = acpi_cppc_processor_probe(pr);  	if (result && !IS_ENABLED(CONFIG_ACPI_CPU_FREQ_PSS))  		dev_dbg(&device->dev, "CPPC data invalid or not present\n"); @@ -185,32 +177,21 @@ static int __acpi_processor_start(struct acpi_device *device)  	status = acpi_install_notify_handler(device->handle, ACPI_DEVICE_NOTIFY,  					     acpi_processor_notify, device); -	if (ACPI_SUCCESS(status)) -		return 0; +	if (!ACPI_SUCCESS(status)) { +		result = -ENODEV; +		goto err_thermal_exit; +	} +	pr->flags.previously_online = 1; -	result = -ENODEV; -	acpi_processor_thermal_exit(pr, device); +	return 0; +err_thermal_exit: +	acpi_processor_thermal_exit(pr, device);  err_power_exit:  	acpi_processor_power_exit(pr);  	return result;  } -static int acpi_processor_start(struct device *dev) -{ -	struct acpi_device *device = ACPI_COMPANION(dev); -	int ret; - -	if (!device) -		return -ENODEV; - -	/* Protect against concurrent CPU hotplug operations */ -	cpu_hotplug_disable(); -	ret = __acpi_processor_start(device); -	cpu_hotplug_enable(); -	return ret; -} -  static int acpi_processor_stop(struct device *dev)  {  	struct acpi_device *device = ACPI_COMPANION(dev); @@ -279,9 +260,9 @@ static int __init acpi_processor_driver_init(void)  	if (result < 0)  		return result; -	result = cpuhp_setup_state_nocalls(CPUHP_AP_ONLINE_DYN, -					   "acpi/cpu-drv:online", -					   acpi_soft_cpu_online, NULL); +	result = cpuhp_setup_state(CPUHP_AP_ONLINE_DYN, +				   "acpi/cpu-drv:online", +				   acpi_soft_cpu_online, NULL);  	if (result < 0)  		goto err;  	hp_online = result;  |