Merge branch 'for_linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tytso/ext4
[linux-2.6] / include / linux / pm.h
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 */