diff options
Diffstat (limited to 'drivers/base/power/resume.c')
-rw-r--r-- | drivers/base/power/resume.c | 112 |
1 files changed, 112 insertions, 0 deletions
diff --git a/drivers/base/power/resume.c b/drivers/base/power/resume.c new file mode 100644 index 00000000000..f8f5055754d --- /dev/null +++ b/drivers/base/power/resume.c @@ -0,0 +1,112 @@ +/* + * resume.c - Functions for waking devices up. + * + * Copyright (c) 2003 Patrick Mochel + * Copyright (c) 2003 Open Source Development Labs + * + * This file is released under the GPLv2 + * + */ + +#include <linux/device.h> +#include "power.h" + +extern int sysdev_resume(void); + + +/** + * resume_device - Restore state for one device. + * @dev: Device. + * + */ + +int resume_device(struct device * dev) +{ + if (dev->bus && dev->bus->resume) + return dev->bus->resume(dev); + return 0; +} + + + +void dpm_resume(void) +{ + down(&dpm_list_sem); + while(!list_empty(&dpm_off)) { + struct list_head * entry = dpm_off.next; + struct device * dev = to_device(entry); + + get_device(dev); + list_del_init(entry); + list_add_tail(entry, &dpm_active); + + up(&dpm_list_sem); + if (!dev->power.prev_state) + resume_device(dev); + down(&dpm_list_sem); + put_device(dev); + } + up(&dpm_list_sem); +} + + +/** + * device_resume - Restore state of each device in system. + * + * Walk the dpm_off list, remove each entry, resume the device, + * then add it to the dpm_active list. + */ + +void device_resume(void) +{ + down(&dpm_sem); + dpm_resume(); + up(&dpm_sem); +} + +EXPORT_SYMBOL_GPL(device_resume); + + +/** + * device_power_up_irq - Power on some devices. + * + * Walk the dpm_off_irq list and power each device up. This + * is used for devices that required they be powered down with + * interrupts disabled. As devices are powered on, they are moved to + * the dpm_suspended list. + * + * Interrupts must be disabled when calling this. + */ + +void dpm_power_up(void) +{ + while(!list_empty(&dpm_off_irq)) { + struct list_head * entry = dpm_off_irq.next; + struct device * dev = to_device(entry); + + get_device(dev); + list_del_init(entry); + list_add_tail(entry, &dpm_active); + resume_device(dev); + put_device(dev); + } +} + + +/** + * device_pm_power_up - Turn on all devices that need special attention. + * + * Power on system devices then devices that required we shut them down + * with interrupts disabled. + * Called with interrupts disabled. + */ + +void device_power_up(void) +{ + sysdev_resume(); + dpm_power_up(); +} + +EXPORT_SYMBOL_GPL(device_power_up); + + |