Linux kernel & device driver programming

Cross-Referenced Linux and Device Driver Code

[ source navigation ] [ diff markup ] [ identifier search ] [ freetext search ] [ file search ]
Version: [ 2.6.11.8 ] [ 2.6.25 ] [ 2.6.25.8 ] [ 2.6.31.13 ] Architecture: [ i386 ]
  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 #ifdef __KERNEL__
 25 
 26 #include <linux/config.h>
 27 #include <linux/list.h>
 28 #include <asm/atomic.h>
 29 
 30 /*
 31  * Power management requests... these are passed to pm_send_all() and friends.
 32  *
 33  * these functions are old and deprecated, see below.
 34  */
 35 typedef int __bitwise pm_request_t;
 36 
 37 #define PM_SUSPEND      ((__force pm_request_t) 1)      /* enter D1-D3 */
 38 #define PM_RESUME       ((__force pm_request_t) 2)      /* enter D0 */
 39 
 40 
 41 /*
 42  * Device types... these are passed to pm_register
 43  */
 44 typedef int __bitwise pm_dev_t;
 45 
 46 #define PM_UNKNOWN_DEV  ((__force pm_dev_t) 0)  /* generic */
 47 #define PM_SYS_DEV      ((__force pm_dev_t) 1)  /* system device (fan, KB controller, ...) */
 48 #define PM_PCI_DEV      ((__force pm_dev_t) 2)  /* PCI device */
 49 #define PM_USB_DEV      ((__force pm_dev_t) 3)  /* USB device */
 50 #define PM_SCSI_DEV     ((__force pm_dev_t) 4)  /* SCSI device */
 51 #define PM_ISA_DEV      ((__force pm_dev_t) 5)  /* ISA device */
 52 #define PM_MTD_DEV      ((__force pm_dev_t) 6)  /* Memory Technology Device */
 53 
 54 /*
 55  * System device hardware ID (PnP) values
 56  */
 57 enum
 58 {
 59         PM_SYS_UNKNOWN = 0x00000000, /* generic */
 60         PM_SYS_KBC =     0x41d00303, /* keyboard controller */
 61         PM_SYS_COM =     0x41d00500, /* serial port */
 62         PM_SYS_IRDA =    0x41d00510, /* IRDA controller */
 63         PM_SYS_FDC =     0x41d00700, /* floppy controller */
 64         PM_SYS_VGA =     0x41d00900, /* VGA controller */
 65         PM_SYS_PCMCIA =  0x41d00e00, /* PCMCIA controller */
 66 };
 67 
 68 /*
 69  * Device identifier
 70  */
 71 #define PM_PCI_ID(dev) ((dev)->bus->number << 16 | (dev)->devfn)
 72 
 73 /*
 74  * Request handler callback
 75  */
 76 struct pm_dev;
 77 
 78 typedef int (*pm_callback)(struct pm_dev *dev, pm_request_t rqst, void *data);
 79 
 80 /*
 81  * Dynamic device information
 82  */
 83 struct pm_dev
 84 {
 85         pm_dev_t         type;
 86         unsigned long    id;
 87         pm_callback      callback;
 88         void            *data;
 89 
 90         unsigned long    flags;
 91         unsigned long    state;
 92         unsigned long    prev_state;
 93 
 94         struct list_head entry;
 95 };
 96 
 97 #ifdef CONFIG_PM
 98 
 99 extern int pm_active;
100 
101 #define PM_IS_ACTIVE() (pm_active != 0)
102 
103 /*
104  * Register a device with power management
105  */
106 struct pm_dev __deprecated *pm_register(pm_dev_t type, unsigned long id, pm_callback callback);
107 
108 /*
109  * Unregister a device with power management
110  */
111 void __deprecated pm_unregister(struct pm_dev *dev);
112 
113 /*
114  * Unregister all devices with matching callback
115  */
116 void __deprecated pm_unregister_all(pm_callback callback);
117 
118 /*
119  * Send a request to a single device
120  */
121 int __deprecated pm_send(struct pm_dev *dev, pm_request_t rqst, void *data);
122 
123 /*
124  * Send a request to all devices
125  */
126 int __deprecated pm_send_all(pm_request_t rqst, void *data);
127 
128 #else /* CONFIG_PM */
129 
130 #define PM_IS_ACTIVE() 0
131 
132 static inline struct pm_dev *pm_register(pm_dev_t type,
133                                          unsigned long id,
134                                          pm_callback callback)
135 {
136         return NULL;
137 }
138 
139 static inline void pm_unregister(struct pm_dev *dev) {}
140 
141 static inline void pm_unregister_all(pm_callback callback) {}
142 
143 static inline int pm_send(struct pm_dev *dev, pm_request_t rqst, void *data)
144 {
145         return 0;
146 }
147 
148 static inline int pm_send_all(pm_request_t rqst, void *data)
149 {
150         return 0;
151 }
152 
153 #endif /* CONFIG_PM */
154 
155 /* Functions above this comment are list-based old-style power
156  * managment. Please avoid using them.  */
157 
158 /*
159  * Callbacks for platform drivers to implement.
160  */
161 extern void (*pm_idle)(void);
162 extern void (*pm_power_off)(void);
163 
164 typedef int __bitwise suspend_state_t;
165 
166 #define PM_SUSPEND_ON           ((__force suspend_state_t) 0)
167 #define PM_SUSPEND_STANDBY      ((__force suspend_state_t) 1)
168 #define PM_SUSPEND_MEM          ((__force suspend_state_t) 3)
169 #define PM_SUSPEND_DISK         ((__force suspend_state_t) 4)
170 #define PM_SUSPEND_MAX          ((__force suspend_state_t) 5)
171 
172 typedef int __bitwise suspend_disk_method_t;
173 
174 #define PM_DISK_FIRMWARE        ((__force suspend_disk_method_t) 1)
175 #define PM_DISK_PLATFORM        ((__force suspend_disk_method_t) 2)
176 #define PM_DISK_SHUTDOWN        ((__force suspend_disk_method_t) 3)
177 #define PM_DISK_REBOOT          ((__force suspend_disk_method_t) 4)
178 #define PM_DISK_MAX             ((__force suspend_disk_method_t) 5)
179 
180 struct pm_ops {
181         suspend_disk_method_t pm_disk_mode;
182         int (*prepare)(suspend_state_t state);
183         int (*enter)(suspend_state_t state);
184         int (*finish)(suspend_state_t state);
185 };
186 
187 extern void pm_set_ops(struct pm_ops *);
188 
189 extern int pm_suspend(suspend_state_t state);
190 
191 
192 /*
193  * Device power management
194  */
195 
196 struct device;
197 
198 typedef u32 __bitwise pm_message_t;
199 
200 /*
201  * There are 4 important states driver can be in:
202  * ON     -- driver is working
203  * FREEZE -- stop operations and apply whatever policy is applicable to a suspended driver
204  *           of that class, freeze queues for block like IDE does, drop packets for
205  *           ethernet, etc... stop DMA engine too etc... so a consistent image can be
206  *           saved; but do not power any hardware down.
207  * SUSPEND - like FREEZE, but hardware is doing as much powersaving as possible. Roughly
208  *           pci D3.
209  *
210  * Unfortunately, current drivers only recognize numeric values 0 (ON) and 3 (SUSPEND).
211  * We'll need to fix the drivers. So yes, putting 3 to all diferent defines is intentional,
212  * and will go away as soon as drivers are fixed. Also note that typedef is neccessary,
213  * we'll probably want to switch to
214  *   typedef struct pm_message_t { int event; int flags; } pm_message_t
215  * or something similar soon.
216  */
217 
218 #define PMSG_FREEZE     ((__force pm_message_t) 3)
219 #define PMSG_SUSPEND    ((__force pm_message_t) 3)
220 #define PMSG_ON         ((__force pm_message_t) 0)
221 
222 struct dev_pm_info {
223         pm_message_t            power_state;
224 #ifdef  CONFIG_PM
225         pm_message_t            prev_state;
226         void                    * saved_state;
227         atomic_t                pm_users;
228         struct device           * pm_parent;
229         struct list_head        entry;
230 #endif
231 };
232 
233 extern void device_pm_set_parent(struct device * dev, struct device * parent);
234 
235 extern int device_suspend(pm_message_t state);
236 extern int device_power_down(pm_message_t state);
237 extern void device_power_up(void);
238 extern void device_resume(void);
239 
240 
241 #endif /* __KERNEL__ */
242 
243 #endif /* _LINUX_PM_H */
244 
  This page was automatically generated by the LXR engine.