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