1*9c92ab61SThomas Gleixner /* SPDX-License-Identifier: GPL-2.0-only */
2ab10023eSColin Cross /*
3ab10023eSColin Cross * Copyright (C) 2011 Google, Inc.
4ab10023eSColin Cross *
5ab10023eSColin Cross * Author:
6ab10023eSColin Cross * Colin Cross <[email protected]>
7ab10023eSColin Cross */
8ab10023eSColin Cross
9ab10023eSColin Cross #ifndef _LINUX_CPU_PM_H
10ab10023eSColin Cross #define _LINUX_CPU_PM_H
11ab10023eSColin Cross
12ab10023eSColin Cross #include <linux/kernel.h>
13ab10023eSColin Cross #include <linux/notifier.h>
14ab10023eSColin Cross
15ab10023eSColin Cross /*
16ab10023eSColin Cross * When a CPU goes to a low power state that turns off power to the CPU's
17ab10023eSColin Cross * power domain, the contents of some blocks (floating point coprocessors,
18ab10023eSColin Cross * interrupt controllers, caches, timers) in the same power domain can
19ab10023eSColin Cross * be lost. The cpm_pm notifiers provide a method for platform idle, suspend,
20ab10023eSColin Cross * and hotplug implementations to notify the drivers for these blocks that
21ab10023eSColin Cross * they may be reset.
22ab10023eSColin Cross *
23ab10023eSColin Cross * All cpu_pm notifications must be called with interrupts disabled.
24ab10023eSColin Cross *
25ab10023eSColin Cross * The notifications are split into two classes: CPU notifications and CPU
26ab10023eSColin Cross * cluster notifications.
27ab10023eSColin Cross *
28ab10023eSColin Cross * CPU notifications apply to a single CPU and must be called on the affected
29ab10023eSColin Cross * CPU. They are used to save per-cpu context for affected blocks.
30ab10023eSColin Cross *
31ab10023eSColin Cross * CPU cluster notifications apply to all CPUs in a single power domain. They
32ab10023eSColin Cross * are used to save any global context for affected blocks, and must be called
33ab10023eSColin Cross * after all the CPUs in the power domain have been notified of the low power
34ab10023eSColin Cross * state.
35ab10023eSColin Cross */
36ab10023eSColin Cross
37ab10023eSColin Cross /*
38ab10023eSColin Cross * Event codes passed as unsigned long val to notifier calls
39ab10023eSColin Cross */
40ab10023eSColin Cross enum cpu_pm_event {
41ab10023eSColin Cross /* A single cpu is entering a low power state */
42ab10023eSColin Cross CPU_PM_ENTER,
43ab10023eSColin Cross
44ab10023eSColin Cross /* A single cpu failed to enter a low power state */
45ab10023eSColin Cross CPU_PM_ENTER_FAILED,
46ab10023eSColin Cross
47ab10023eSColin Cross /* A single cpu is exiting a low power state */
48ab10023eSColin Cross CPU_PM_EXIT,
49ab10023eSColin Cross
50ab10023eSColin Cross /* A cpu power domain is entering a low power state */
51ab10023eSColin Cross CPU_CLUSTER_PM_ENTER,
52ab10023eSColin Cross
53ab10023eSColin Cross /* A cpu power domain failed to enter a low power state */
54ab10023eSColin Cross CPU_CLUSTER_PM_ENTER_FAILED,
55ab10023eSColin Cross
56ab10023eSColin Cross /* A cpu power domain is exiting a low power state */
57ab10023eSColin Cross CPU_CLUSTER_PM_EXIT,
58ab10023eSColin Cross };
59ab10023eSColin Cross
60ab10023eSColin Cross #ifdef CONFIG_CPU_PM
61ab10023eSColin Cross int cpu_pm_register_notifier(struct notifier_block *nb);
62ab10023eSColin Cross int cpu_pm_unregister_notifier(struct notifier_block *nb);
63ab10023eSColin Cross int cpu_pm_enter(void);
64ab10023eSColin Cross int cpu_pm_exit(void);
65ab10023eSColin Cross int cpu_cluster_pm_enter(void);
66ab10023eSColin Cross int cpu_cluster_pm_exit(void);
67ab10023eSColin Cross
68ab10023eSColin Cross #else
69ab10023eSColin Cross
cpu_pm_register_notifier(struct notifier_block * nb)70ab10023eSColin Cross static inline int cpu_pm_register_notifier(struct notifier_block *nb)
71ab10023eSColin Cross {
72ab10023eSColin Cross return 0;
73ab10023eSColin Cross }
74ab10023eSColin Cross
cpu_pm_unregister_notifier(struct notifier_block * nb)75ab10023eSColin Cross static inline int cpu_pm_unregister_notifier(struct notifier_block *nb)
76ab10023eSColin Cross {
77ab10023eSColin Cross return 0;
78ab10023eSColin Cross }
79ab10023eSColin Cross
cpu_pm_enter(void)80ab10023eSColin Cross static inline int cpu_pm_enter(void)
81ab10023eSColin Cross {
82ab10023eSColin Cross return 0;
83ab10023eSColin Cross }
84ab10023eSColin Cross
cpu_pm_exit(void)85ab10023eSColin Cross static inline int cpu_pm_exit(void)
86ab10023eSColin Cross {
87ab10023eSColin Cross return 0;
88ab10023eSColin Cross }
89ab10023eSColin Cross
cpu_cluster_pm_enter(void)90ab10023eSColin Cross static inline int cpu_cluster_pm_enter(void)
91ab10023eSColin Cross {
92ab10023eSColin Cross return 0;
93ab10023eSColin Cross }
94ab10023eSColin Cross
cpu_cluster_pm_exit(void)95ab10023eSColin Cross static inline int cpu_cluster_pm_exit(void)
96ab10023eSColin Cross {
97ab10023eSColin Cross return 0;
98ab10023eSColin Cross }
99ab10023eSColin Cross #endif
100ab10023eSColin Cross #endif
101