linux/include/linux/pm.h
<<
>>
Prefs
   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 */
  35typedef 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 */
  44typedef 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 */
  57enum
  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 */
  76struct pm_dev;
  77
  78typedef int (*pm_callback)(struct pm_dev *dev, pm_request_t rqst, void *data);
  79
  80/*
  81 * Dynamic device information
  82 */
  83struct 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
  99extern int pm_active;
 100
 101#define PM_IS_ACTIVE() (pm_active != 0)
 102
 103/*
 104 * Register a device with power management
 105 */
 106struct 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 */
 111void __deprecated pm_unregister(struct pm_dev *dev);
 112
 113/*
 114 * Unregister all devices with matching callback
 115 */
 116void __deprecated pm_unregister_all(pm_callback callback);
 117
 118/*
 119 * Send a request to a single device
 120 */
 121int __deprecated pm_send(struct pm_dev *dev, pm_request_t rqst, void *data);
 122
 123/*
 124 * Send a request to all devices
 125 */
 126int __deprecated pm_send_all(pm_request_t rqst, void *data);
 127
 128#else /* CONFIG_PM */
 129
 130#define PM_IS_ACTIVE() 0
 131
 132static inline struct pm_dev *pm_register(pm_dev_t type,
 133                                         unsigned long id,
 134                                         pm_callback callback)
 135{
 136        return NULL;
 137}
 138
 139static inline void pm_unregister(struct pm_dev *dev) {}
 140
 141static inline void pm_unregister_all(pm_callback callback) {}
 142
 143static inline int pm_send(struct pm_dev *dev, pm_request_t rqst, void *data)
 144{
 145        return 0;
 146}
 147
 148static 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 */
 161extern void (*pm_idle)(void);
 162extern void (*pm_power_off)(void);
 163
 164typedef 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
 172typedef 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
 180struct 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
 187extern void pm_set_ops(struct pm_ops *);
 188
 189extern int pm_suspend(suspend_state_t state);
 190
 191
 192/*
 193 * Device power management
 194 */
 195
 196struct device;
 197
 198typedef 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
 222struct 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
 233extern void device_pm_set_parent(struct device * dev, struct device * parent);
 234
 235extern int device_suspend(pm_message_t state);
 236extern int device_power_down(pm_message_t state);
 237extern void device_power_up(void);
 238extern void device_resume(void);
 239
 240
 241#endif /* __KERNEL__ */
 242
 243#endif /* _LINUX_PM_H */
 244
lxr.linux.no kindly hosted by Redpill Linpro AS, provider of Linux consulting and operations services since 1995.