| /* | |
| * drivers/base/power/runtime.c - Handling dynamic device power management. | |
| * | |
| * Copyright (c) 2003 Patrick Mochel | |
| * Copyright (c) 2003 Open Source Development Lab | |
| * | |
| */ | |
| #include <linux/device.h> | |
| #include "power.h" | |
| static void runtime_resume(struct device * dev) | |
| { | |
| dev_dbg(dev, "resuming\n"); | |
| if (!dev->power.power_state.event) | |
| return; | |
| if (!resume_device(dev)) | |
| dev->power.power_state = PMSG_ON; | |
| } | |
| /** | |
| * dpm_runtime_resume - Power one device back on. | |
| * @dev: Device. | |
| * | |
| * Bring one device back to the on state by first powering it | |
| * on, then restoring state. We only operate on devices that aren't | |
| * already on. | |
| * FIXME: We need to handle devices that are in an unknown state. | |
| */ | |
| void dpm_runtime_resume(struct device * dev) | |
| { | |
| down(&dpm_sem); | |
| runtime_resume(dev); | |
| up(&dpm_sem); | |
| } | |
| EXPORT_SYMBOL(dpm_runtime_resume); | |
| /** | |
| * dpm_runtime_suspend - Put one device in low-power state. | |
| * @dev: Device. | |
| * @state: State to enter. | |
| */ | |
| int dpm_runtime_suspend(struct device * dev, pm_message_t state) | |
| { | |
| int error = 0; | |
| down(&dpm_sem); | |
| if (dev->power.power_state.event == state.event) | |
| goto Done; | |
| if (dev->power.power_state.event) | |
| runtime_resume(dev); | |
| if (!(error = suspend_device(dev, state))) | |
| dev->power.power_state = state; | |
| Done: | |
| up(&dpm_sem); | |
| return error; | |
| } | |
| EXPORT_SYMBOL(dpm_runtime_suspend); | |
| #if 0 | |
| /** | |
| * dpm_set_power_state - Update power_state field. | |
| * @dev: Device. | |
| * @state: Power state device is in. | |
| * | |
| * This is an update mechanism for drivers to notify the core | |
| * what power state a device is in. Device probing code may not | |
| * always be able to tell, but we need accurate information to | |
| * work reliably. | |
| */ | |
| void dpm_set_power_state(struct device * dev, pm_message_t state) | |
| { | |
| down(&dpm_sem); | |
| dev->power.power_state = state; | |
| up(&dpm_sem); | |
| } | |
| #endif /* 0 */ |