Loading...
#ifndef __LINUX_PM_H
#define __LINUX_PM_H
typedef int pm_request_t;
struct pm_dev {
void *data;
struct pm_dev *next;
int (*event)(struct pm_dev *, pm_request_t, void *);
};
#define PM_SUSPEND 1
#define PM_RESUME 2
#ifdef CONFIG_APM
#include <linux/apm_bios.h>
#define PM_PCI_DEV 0
#define PM_PCI_ID(a) a
static struct pm_dev *pm_dev = NULL;
static int handle_apm_event(apm_event_t apm_event)
{
struct pm_dev *list = pm_dev;
pm_request_t action;
switch (apm_event) {
case APM_SYS_SUSPEND:
case APM_CRITICAL_SUSPEND:
case APM_USER_SUSPEND:
action = PM_SUSPEND;
break;
case APM_NORMAL_RESUME:
case APM_CRITICAL_RESUME:
case APM_STANDBY_RESUME:
action = PM_RESUME;
break;
default:
return 0;
}
while (list) {
list->event(list, action, list->data);
list = list->next;
}
return 0;
}
static struct pm_dev *pm_register(int a, void *b, int (*event)(struct pm_dev *, pm_request_t, void *))
{
struct pm_dev *list;
list = kmalloc(sizeof(struct pm_dev), GFP_KERNEL);
list->event = event;
list->next = pm_dev;
pm_dev = list;
apm_register_callback(handle_apm_event);
return list;
}
static void pm_unregister_all(int (*event)(struct pm_dev *, pm_request_t, void *))
{
struct pm_dev *list;
while (pm_dev) {
list = pm_dev;
pm_dev = pm_dev->next;
kfree(list);
}
apm_unregister_callback(handle_apm_event);
}
#else
#define pm_register(a,b,c) 0
#define pm_unregister_all(a) do {} while (0)
#endif
#endif
|