162306a36Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0 */
262306a36Sopenharmony_ci#ifndef __ASM_ARM_CPUIDLE_H
362306a36Sopenharmony_ci#define __ASM_ARM_CPUIDLE_H
462306a36Sopenharmony_ci
562306a36Sopenharmony_ci#include <asm/proc-fns.h>
662306a36Sopenharmony_ci
762306a36Sopenharmony_ci#ifdef CONFIG_CPU_IDLE
862306a36Sopenharmony_ciextern int arm_cpuidle_simple_enter(struct cpuidle_device *dev,
962306a36Sopenharmony_ci		struct cpuidle_driver *drv, int index);
1062306a36Sopenharmony_ci#define __cpuidle_method_section __used __section("__cpuidle_method_of_table")
1162306a36Sopenharmony_ci#else
1262306a36Sopenharmony_cistatic inline int arm_cpuidle_simple_enter(struct cpuidle_device *dev,
1362306a36Sopenharmony_ci		struct cpuidle_driver *drv, int index) { return -ENODEV; }
1462306a36Sopenharmony_ci#define __cpuidle_method_section __maybe_unused /* drop silently */
1562306a36Sopenharmony_ci#endif
1662306a36Sopenharmony_ci
1762306a36Sopenharmony_ci/* Common ARM WFI state */
1862306a36Sopenharmony_ci#define ARM_CPUIDLE_WFI_STATE_PWR(p) {\
1962306a36Sopenharmony_ci	.enter                  = arm_cpuidle_simple_enter,\
2062306a36Sopenharmony_ci	.exit_latency           = 1,\
2162306a36Sopenharmony_ci	.target_residency       = 1,\
2262306a36Sopenharmony_ci	.power_usage		= p,\
2362306a36Sopenharmony_ci	.name                   = "WFI",\
2462306a36Sopenharmony_ci	.desc                   = "ARM WFI",\
2562306a36Sopenharmony_ci}
2662306a36Sopenharmony_ci
2762306a36Sopenharmony_ci/*
2862306a36Sopenharmony_ci * in case power_specified == 1, give a default WFI power value needed
2962306a36Sopenharmony_ci * by some governors
3062306a36Sopenharmony_ci */
3162306a36Sopenharmony_ci#define ARM_CPUIDLE_WFI_STATE ARM_CPUIDLE_WFI_STATE_PWR(UINT_MAX)
3262306a36Sopenharmony_ci
3362306a36Sopenharmony_cistruct device_node;
3462306a36Sopenharmony_ci
3562306a36Sopenharmony_cistruct cpuidle_ops {
3662306a36Sopenharmony_ci	int (*suspend)(unsigned long arg);
3762306a36Sopenharmony_ci	int (*init)(struct device_node *, int cpu);
3862306a36Sopenharmony_ci};
3962306a36Sopenharmony_ci
4062306a36Sopenharmony_cistruct of_cpuidle_method {
4162306a36Sopenharmony_ci	const char *method;
4262306a36Sopenharmony_ci	const struct cpuidle_ops *ops;
4362306a36Sopenharmony_ci};
4462306a36Sopenharmony_ci
4562306a36Sopenharmony_ci#define CPUIDLE_METHOD_OF_DECLARE(name, _method, _ops)			\
4662306a36Sopenharmony_ci	static const struct of_cpuidle_method __cpuidle_method_of_table_##name \
4762306a36Sopenharmony_ci	__cpuidle_method_section = { .method = _method, .ops = _ops }
4862306a36Sopenharmony_ci
4962306a36Sopenharmony_ciextern int arm_cpuidle_suspend(int index);
5062306a36Sopenharmony_ci
5162306a36Sopenharmony_ciextern int arm_cpuidle_init(int cpu);
5262306a36Sopenharmony_ci
5362306a36Sopenharmony_cistruct arm_cpuidle_irq_context { };
5462306a36Sopenharmony_ci
5562306a36Sopenharmony_ci#define arm_cpuidle_save_irq_context(c)		(void)c
5662306a36Sopenharmony_ci#define arm_cpuidle_restore_irq_context(c)	(void)c
5762306a36Sopenharmony_ci
5862306a36Sopenharmony_ci#endif
59