xref: /openbmc/linux/drivers/base/power/runtime.c (revision 64c70b1c)
1 /*
2  * drivers/base/power/runtime.c - Handling dynamic device power management.
3  *
4  * Copyright (c) 2003 Patrick Mochel
5  * Copyright (c) 2003 Open Source Development Lab
6  *
7  */
8 
9 #include <linux/device.h>
10 #include "power.h"
11 
12 
13 static void runtime_resume(struct device * dev)
14 {
15 	dev_dbg(dev, "resuming\n");
16 	if (!dev->power.power_state.event)
17 		return;
18 	if (!resume_device(dev))
19 		dev->power.power_state = PMSG_ON;
20 }
21 
22 
23 /**
24  *	dpm_runtime_resume - Power one device back on.
25  *	@dev:	Device.
26  *
27  *	Bring one device back to the on state by first powering it
28  *	on, then restoring state. We only operate on devices that aren't
29  *	already on.
30  *	FIXME: We need to handle devices that are in an unknown state.
31  */
32 
33 void dpm_runtime_resume(struct device * dev)
34 {
35 	down(&dpm_sem);
36 	runtime_resume(dev);
37 	up(&dpm_sem);
38 }
39 EXPORT_SYMBOL(dpm_runtime_resume);
40 
41 
42 /**
43  *	dpm_runtime_suspend - Put one device in low-power state.
44  *	@dev:	Device.
45  *	@state:	State to enter.
46  */
47 
48 int dpm_runtime_suspend(struct device * dev, pm_message_t state)
49 {
50 	int error = 0;
51 
52 	down(&dpm_sem);
53 	if (dev->power.power_state.event == state.event)
54 		goto Done;
55 
56 	if (dev->power.power_state.event)
57 		runtime_resume(dev);
58 
59 	if (!(error = suspend_device(dev, state)))
60 		dev->power.power_state = state;
61  Done:
62 	up(&dpm_sem);
63 	return error;
64 }
65 EXPORT_SYMBOL(dpm_runtime_suspend);
66 
67 
68 #if 0
69 /**
70  *	dpm_set_power_state - Update power_state field.
71  *	@dev:	Device.
72  *	@state:	Power state device is in.
73  *
74  *	This is an update mechanism for drivers to notify the core
75  *	what power state a device is in. Device probing code may not
76  *	always be able to tell, but we need accurate information to
77  *	work reliably.
78  */
79 void dpm_set_power_state(struct device * dev, pm_message_t state)
80 {
81 	down(&dpm_sem);
82 	dev->power.power_state = state;
83 	up(&dpm_sem);
84 }
85 #endif  /*  0  */
86