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