xref: /openbmc/linux/arch/arm/include/asm/cpuidle.h (revision 762f99f4f3cb41a775b5157dd761217beba65873)
1b2441318SGreg Kroah-Hartman /* SPDX-License-Identifier: GPL-2.0 */
2e1689795SRobert Lee #ifndef __ASM_ARM_CPUIDLE_H
3e1689795SRobert Lee #define __ASM_ARM_CPUIDLE_H
4e1689795SRobert Lee 
5eeebc3bbSDaniel Lezcano #include <asm/proc-fns.h>
6eeebc3bbSDaniel Lezcano 
7e1689795SRobert Lee #ifdef CONFIG_CPU_IDLE
8e1689795SRobert Lee extern int arm_cpuidle_simple_enter(struct cpuidle_device *dev,
9e1689795SRobert Lee 		struct cpuidle_driver *drv, int index);
10d94b93a9SArnd Bergmann #define __cpuidle_method_section __used __section("__cpuidle_method_of_table")
11e1689795SRobert Lee #else
arm_cpuidle_simple_enter(struct cpuidle_device * dev,struct cpuidle_driver * drv,int index)12e1689795SRobert Lee static inline int arm_cpuidle_simple_enter(struct cpuidle_device *dev,
13e1689795SRobert Lee 		struct cpuidle_driver *drv, int index) { return -ENODEV; }
14d94b93a9SArnd Bergmann #define __cpuidle_method_section __maybe_unused /* drop silently */
15e1689795SRobert Lee #endif
16e1689795SRobert Lee 
17e1689795SRobert Lee /* Common ARM WFI state */
18e1689795SRobert Lee #define ARM_CPUIDLE_WFI_STATE_PWR(p) {\
19e1689795SRobert Lee 	.enter                  = arm_cpuidle_simple_enter,\
20e1689795SRobert Lee 	.exit_latency           = 1,\
21e1689795SRobert Lee 	.target_residency       = 1,\
22e1689795SRobert Lee 	.power_usage		= p,\
23e1689795SRobert Lee 	.name                   = "WFI",\
24e1689795SRobert Lee 	.desc                   = "ARM WFI",\
25e1689795SRobert Lee }
26e1689795SRobert Lee 
27e1689795SRobert Lee /*
28e1689795SRobert Lee  * in case power_specified == 1, give a default WFI power value needed
29e1689795SRobert Lee  * by some governors
30e1689795SRobert Lee  */
31e1689795SRobert Lee #define ARM_CPUIDLE_WFI_STATE ARM_CPUIDLE_WFI_STATE_PWR(UINT_MAX)
32e1689795SRobert Lee 
33449e056cSDaniel Lezcano struct device_node;
34449e056cSDaniel Lezcano 
35449e056cSDaniel Lezcano struct cpuidle_ops {
36f6419f24SLorenzo Pieralisi 	int (*suspend)(unsigned long arg);
37449e056cSDaniel Lezcano 	int (*init)(struct device_node *, int cpu);
38449e056cSDaniel Lezcano };
39449e056cSDaniel Lezcano 
40449e056cSDaniel Lezcano struct of_cpuidle_method {
41449e056cSDaniel Lezcano 	const char *method;
4233475a87SJisheng Zhang 	const struct cpuidle_ops *ops;
43449e056cSDaniel Lezcano };
44449e056cSDaniel Lezcano 
45449e056cSDaniel Lezcano #define CPUIDLE_METHOD_OF_DECLARE(name, _method, _ops)			\
46449e056cSDaniel Lezcano 	static const struct of_cpuidle_method __cpuidle_method_of_table_##name \
47d94b93a9SArnd Bergmann 	__cpuidle_method_section = { .method = _method, .ops = _ops }
48449e056cSDaniel Lezcano 
49449e056cSDaniel Lezcano extern int arm_cpuidle_suspend(int index);
50449e056cSDaniel Lezcano 
51449e056cSDaniel Lezcano extern int arm_cpuidle_init(int cpu);
52449e056cSDaniel Lezcano 
53*8848f066SMarc Zyngier struct arm_cpuidle_irq_context { };
54*8848f066SMarc Zyngier 
55*8848f066SMarc Zyngier #define arm_cpuidle_save_irq_context(c)		(void)c
56*8848f066SMarc Zyngier #define arm_cpuidle_restore_irq_context(c)	(void)c
57*8848f066SMarc Zyngier 
58e1689795SRobert Lee #endif
59