 af3cfdbf56
			
		
	
	
	af3cfdbf56
	
	
	
		
			
			ARM64_CPU_SUSPEND config option was introduced to make code providing context save/restore selectable only on platforms requiring power management capabilities. Currently ARM64_CPU_SUSPEND depends on the PM_SLEEP config option which in turn is set by the SUSPEND config option. The introduction of CPU_IDLE for arm64 requires that code configured by ARM64_CPU_SUSPEND (context save/restore) should be compiled in in order to enable the CPU idle driver to rely on CPU operations carrying out context save/restore. The ARM64_CPUIDLE config option (ARM64 generic idle driver) is therefore forced to select ARM64_CPU_SUSPEND, even if there may be (ie PM_SLEEP) failed dependencies, which is not a clean way of handling the kernel configuration option. For these reasons, this patch removes the ARM64_CPU_SUSPEND config option and makes the context save/restore dependent on CPU_PM, which is selected whenever either SUSPEND or CPU_IDLE are configured, cleaning up dependencies in the process. This way, code previously configured through ARM64_CPU_SUSPEND is compiled in whenever a power management subsystem requires it to be present in the kernel (SUSPEND || CPU_IDLE), which is the behaviour expected on ARM64 kernels. The cpu_suspend and cpu_init_idle CPU operations are added only if CPU_IDLE is selected, since they are CPU_IDLE specific methods and should be grouped and defined accordingly. PSCI CPU operations are updated to reflect the introduced changes. Signed-off-by: Lorenzo Pieralisi <lorenzo.pieralisi@arm.com> Cc: Arnd Bergmann <arnd@arndb.de> Cc: Will Deacon <will.deacon@arm.com> Cc: Krzysztof Kozlowski <k.kozlowski@samsung.com> Cc: Daniel Lezcano <daniel.lezcano@linaro.org> Cc: Mark Rutland <mark.rutland@arm.com> Signed-off-by: Catalin Marinas <catalin.marinas@arm.com>
		
			
				
	
	
		
			51 lines
		
	
	
	
		
			1.2 KiB
			
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			51 lines
		
	
	
	
		
			1.2 KiB
			
		
	
	
	
		
			C
		
	
	
	
	
	
| /*
 | |
|  * ARM64 CPU idle arch support
 | |
|  *
 | |
|  * Copyright (C) 2014 ARM Ltd.
 | |
|  * Author: Lorenzo Pieralisi <lorenzo.pieralisi@arm.com>
 | |
|  *
 | |
|  * This program is free software; you can redistribute it and/or modify
 | |
|  * it under the terms of the GNU General Public License version 2 as
 | |
|  * published by the Free Software Foundation.
 | |
|  */
 | |
| 
 | |
| #include <linux/of.h>
 | |
| #include <linux/of_device.h>
 | |
| 
 | |
| #include <asm/cpuidle.h>
 | |
| #include <asm/cpu_ops.h>
 | |
| 
 | |
| int cpu_init_idle(unsigned int cpu)
 | |
| {
 | |
| 	int ret = -EOPNOTSUPP;
 | |
| 	struct device_node *cpu_node = of_cpu_device_node_get(cpu);
 | |
| 
 | |
| 	if (!cpu_node)
 | |
| 		return -ENODEV;
 | |
| 
 | |
| 	if (cpu_ops[cpu] && cpu_ops[cpu]->cpu_init_idle)
 | |
| 		ret = cpu_ops[cpu]->cpu_init_idle(cpu_node, cpu);
 | |
| 
 | |
| 	of_node_put(cpu_node);
 | |
| 	return ret;
 | |
| }
 | |
| 
 | |
| /**
 | |
|  * cpu_suspend() - function to enter a low-power idle state
 | |
|  * @arg: argument to pass to CPU suspend operations
 | |
|  *
 | |
|  * Return: 0 on success, -EOPNOTSUPP if CPU suspend hook not initialized, CPU
 | |
|  * operations back-end error code otherwise.
 | |
|  */
 | |
| int cpu_suspend(unsigned long arg)
 | |
| {
 | |
| 	int cpu = smp_processor_id();
 | |
| 
 | |
| 	/*
 | |
| 	 * If cpu_ops have not been registered or suspend
 | |
| 	 * has not been initialized, cpu_suspend call fails early.
 | |
| 	 */
 | |
| 	if (!cpu_ops[cpu] || !cpu_ops[cpu]->cpu_suspend)
 | |
| 		return -EOPNOTSUPP;
 | |
| 	return cpu_ops[cpu]->cpu_suspend(arg);
 | |
| }
 |