1 /* SPDX-License-Identifier: GPL-2.0-only */ 2 /* 3 * Copyright (C) 2011 Google, Inc. 4 * 5 * Author: 6 * Colin Cross <ccross@android.com> 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 cpu_pm_register_notifier(struct notifier_block * nb)70 static inline int cpu_pm_register_notifier(struct notifier_block *nb) 71 { 72 return 0; 73 } 74 cpu_pm_unregister_notifier(struct notifier_block * nb)75 static inline int cpu_pm_unregister_notifier(struct notifier_block *nb) 76 { 77 return 0; 78 } 79 cpu_pm_enter(void)80 static inline int cpu_pm_enter(void) 81 { 82 return 0; 83 } 84 cpu_pm_exit(void)85 static inline int cpu_pm_exit(void) 86 { 87 return 0; 88 } 89 cpu_cluster_pm_enter(void)90 static inline int cpu_cluster_pm_enter(void) 91 { 92 return 0; 93 } 94 cpu_cluster_pm_exit(void)95 static inline int cpu_cluster_pm_exit(void) 96 { 97 return 0; 98 } 99 #endif 100 #endif 101