xref: /linux-6.15/include/linux/pm.h (revision 43f5b308)
1 /*
2  *  pm.h - Power management interface
3  *
4  *  Copyright (C) 2000 Andrew Henroid
5  *
6  *  This program is free software; you can redistribute it and/or modify
7  *  it under the terms of the GNU General Public License as published by
8  *  the Free Software Foundation; either version 2 of the License, or
9  *  (at your option) any later version.
10  *
11  *  This program is distributed in the hope that it will be useful,
12  *  but WITHOUT ANY WARRANTY; without even the implied warranty of
13  *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14  *  GNU General Public License for more details.
15  *
16  *  You should have received a copy of the GNU General Public License
17  *  along with this program; if not, write to the Free Software
18  *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
19  */
20 
21 #ifndef _LINUX_PM_H
22 #define _LINUX_PM_H
23 
24 #include <linux/list.h>
25 #include <asm/atomic.h>
26 #include <asm/errno.h>
27 
28 /*
29  * Power management requests... these are passed to pm_send_all() and friends.
30  *
31  * these functions are old and deprecated, see below.
32  */
33 typedef int __bitwise pm_request_t;
34 
35 #define PM_SUSPEND	((__force pm_request_t) 1)	/* enter D1-D3 */
36 #define PM_RESUME	((__force pm_request_t) 2)	/* enter D0 */
37 
38 
39 /*
40  * Device types... these are passed to pm_register
41  */
42 typedef int __bitwise pm_dev_t;
43 
44 #define PM_UNKNOWN_DEV	((__force pm_dev_t) 0)	/* generic */
45 #define PM_SYS_DEV	((__force pm_dev_t) 1)	/* system device (fan, KB controller, ...) */
46 #define PM_PCI_DEV	((__force pm_dev_t) 2)	/* PCI device */
47 #define PM_USB_DEV	((__force pm_dev_t) 3)	/* USB device */
48 #define PM_SCSI_DEV	((__force pm_dev_t) 4)	/* SCSI device */
49 #define PM_ISA_DEV	((__force pm_dev_t) 5)	/* ISA device */
50 #define	PM_MTD_DEV	((__force pm_dev_t) 6)	/* Memory Technology Device */
51 
52 /*
53  * System device hardware ID (PnP) values
54  */
55 enum
56 {
57 	PM_SYS_UNKNOWN = 0x00000000, /* generic */
58 	PM_SYS_KBC =	 0x41d00303, /* keyboard controller */
59 	PM_SYS_COM =	 0x41d00500, /* serial port */
60 	PM_SYS_IRDA =	 0x41d00510, /* IRDA controller */
61 	PM_SYS_FDC =	 0x41d00700, /* floppy controller */
62 	PM_SYS_VGA =	 0x41d00900, /* VGA controller */
63 	PM_SYS_PCMCIA =	 0x41d00e00, /* PCMCIA controller */
64 };
65 
66 /*
67  * Device identifier
68  */
69 #define PM_PCI_ID(dev) ((dev)->bus->number << 16 | (dev)->devfn)
70 
71 /*
72  * Request handler callback
73  */
74 struct pm_dev;
75 
76 typedef int (*pm_callback)(struct pm_dev *dev, pm_request_t rqst, void *data);
77 
78 /*
79  * Dynamic device information
80  */
81 struct pm_dev
82 {
83 	pm_dev_t	 type;
84 	unsigned long	 id;
85 	pm_callback	 callback;
86 	void		*data;
87 
88 	unsigned long	 flags;
89 	unsigned long	 state;
90 	unsigned long	 prev_state;
91 
92 	struct list_head entry;
93 };
94 
95 /* Functions above this comment are list-based old-style power
96  * management. Please avoid using them.  */
97 
98 /*
99  * Callbacks for platform drivers to implement.
100  */
101 extern void (*pm_idle)(void);
102 extern void (*pm_power_off)(void);
103 extern void (*pm_power_off_prepare)(void);
104 
105 /*
106  * Device power management
107  */
108 
109 struct device;
110 
111 typedef struct pm_message {
112 	int event;
113 } pm_message_t;
114 
115 /*
116  * Several driver power state transitions are externally visible, affecting
117  * the state of pending I/O queues and (for drivers that touch hardware)
118  * interrupts, wakeups, DMA, and other hardware state.  There may also be
119  * internal transitions to various low power modes, which are transparent
120  * to the rest of the driver stack (such as a driver that's ON gating off
121  * clocks which are not in active use).
122  *
123  * One transition is triggered by resume(), after a suspend() call; the
124  * message is implicit:
125  *
126  * ON		Driver starts working again, responding to hardware events
127  * 		and software requests.  The hardware may have gone through
128  * 		a power-off reset, or it may have maintained state from the
129  * 		previous suspend() which the driver will rely on while
130  * 		resuming.  On most platforms, there are no restrictions on
131  * 		availability of resources like clocks during resume().
132  *
133  * Other transitions are triggered by messages sent using suspend().  All
134  * these transitions quiesce the driver, so that I/O queues are inactive.
135  * That commonly entails turning off IRQs and DMA; there may be rules
136  * about how to quiesce that are specific to the bus or the device's type.
137  * (For example, network drivers mark the link state.)  Other details may
138  * differ according to the message:
139  *
140  * SUSPEND	Quiesce, enter a low power device state appropriate for
141  * 		the upcoming system state (such as PCI_D3hot), and enable
142  * 		wakeup events as appropriate.
143  *
144  * HIBERNATE	Enter a low power device state appropriate for the hibernation
145  * 		state (eg. ACPI S4) and enable wakeup events as appropriate.
146  *
147  * FREEZE	Quiesce operations so that a consistent image can be saved;
148  * 		but do NOT otherwise enter a low power device state, and do
149  * 		NOT emit system wakeup events.
150  *
151  * PRETHAW	Quiesce as if for FREEZE; additionally, prepare for restoring
152  * 		the system from a snapshot taken after an earlier FREEZE.
153  * 		Some drivers will need to reset their hardware state instead
154  * 		of preserving it, to ensure that it's never mistaken for the
155  * 		state which that earlier snapshot had set up.
156  *
157  * A minimally power-aware driver treats all messages as SUSPEND, fully
158  * reinitializes its device during resume() -- whether or not it was reset
159  * during the suspend/resume cycle -- and can't issue wakeup events.
160  *
161  * More power-aware drivers may also use low power states at runtime as
162  * well as during system sleep states like PM_SUSPEND_STANDBY.  They may
163  * be able to use wakeup events to exit from runtime low-power states,
164  * or from system low-power states such as standby or suspend-to-RAM.
165  */
166 
167 #define PM_EVENT_ON 0
168 #define PM_EVENT_FREEZE 1
169 #define PM_EVENT_SUSPEND 2
170 #define PM_EVENT_HIBERNATE 4
171 #define PM_EVENT_PRETHAW 8
172 
173 #define PM_EVENT_SLEEP	(PM_EVENT_SUSPEND | PM_EVENT_HIBERNATE)
174 
175 #define PMSG_FREEZE	((struct pm_message){ .event = PM_EVENT_FREEZE, })
176 #define PMSG_PRETHAW	((struct pm_message){ .event = PM_EVENT_PRETHAW, })
177 #define PMSG_SUSPEND	((struct pm_message){ .event = PM_EVENT_SUSPEND, })
178 #define PMSG_HIBERNATE	((struct pm_message){ .event = PM_EVENT_HIBERNATE, })
179 #define PMSG_ON		((struct pm_message){ .event = PM_EVENT_ON, })
180 
181 struct dev_pm_info {
182 	pm_message_t		power_state;
183 	unsigned		can_wakeup:1;
184 	unsigned		should_wakeup:1;
185 	bool			sleeping:1;	/* Owned by the PM core */
186 #ifdef	CONFIG_PM_SLEEP
187 	struct list_head	entry;
188 #endif
189 };
190 
191 extern int device_power_down(pm_message_t state);
192 extern void device_power_up(void);
193 extern void device_resume(void);
194 
195 #ifdef CONFIG_PM_SLEEP
196 extern int device_suspend(pm_message_t state);
197 extern int device_prepare_suspend(pm_message_t state);
198 
199 extern void __suspend_report_result(const char *function, void *fn, int ret);
200 
201 #define suspend_report_result(fn, ret)					\
202 	do {								\
203 		__suspend_report_result(__FUNCTION__, fn, ret);		\
204 	} while (0)
205 
206 #else /* !CONFIG_PM_SLEEP */
207 
208 static inline int device_suspend(pm_message_t state)
209 {
210 	return 0;
211 }
212 
213 #define suspend_report_result(fn, ret)		do {} while (0)
214 
215 #endif /* !CONFIG_PM_SLEEP */
216 
217 /*
218  * Global Power Management flags
219  * Used to keep APM and ACPI from both being active
220  */
221 extern unsigned int	pm_flags;
222 
223 #define PM_APM	1
224 #define PM_ACPI	2
225 
226 #endif /* _LINUX_PM_H */
227