aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/base
diff options
context:
space:
mode:
authorRafael J. Wysocki <rjw@sisk.pl>2012-02-21 17:47:56 -0500
committerRafael J. Wysocki <rjw@sisk.pl>2012-03-04 17:08:46 -0500
commit8671bbc1bd0442ef0eab27f7d56216431c490820 (patch)
tree23bc127d43be672ab82b9602e21825522d62a28a /drivers/base
parent05b4877f6a4f1ba4952d1222213d262bf8c132b7 (diff)
PM / Sleep: Add more wakeup source initialization routines
The existing wakeup source initialization routines are not particularly useful for wakeup sources that aren't created by wakeup_source_create(), because their users have to open code filling the objects with zeros and setting their names. For this reason, introduce routines that can be used for initializing, for example, static wakeup source objects. Requested-by: Arve Hjønnevåg <arve@android.com> Signed-off-by: Rafael J. Wysocki <rjw@sisk.pl>
Diffstat (limited to 'drivers/base')
-rw-r--r--drivers/base/power/wakeup.c50
1 files changed, 41 insertions, 9 deletions
diff --git a/drivers/base/power/wakeup.c b/drivers/base/power/wakeup.c
index 7c5ab70b9ef3..2a3e581b8dcd 100644
--- a/drivers/base/power/wakeup.c
+++ b/drivers/base/power/wakeup.c
@@ -53,6 +53,23 @@ static void pm_wakeup_timer_fn(unsigned long data);
53static LIST_HEAD(wakeup_sources); 53static LIST_HEAD(wakeup_sources);
54 54
55/** 55/**
56 * wakeup_source_prepare - Prepare a new wakeup source for initialization.
57 * @ws: Wakeup source to prepare.
58 * @name: Pointer to the name of the new wakeup source.
59 *
60 * Callers must ensure that the @name string won't be freed when @ws is still in
61 * use.
62 */
63void wakeup_source_prepare(struct wakeup_source *ws, const char *name)
64{
65 if (ws) {
66 memset(ws, 0, sizeof(*ws));
67 ws->name = name;
68 }
69}
70EXPORT_SYMBOL_GPL(wakeup_source_prepare);
71
72/**
56 * wakeup_source_create - Create a struct wakeup_source object. 73 * wakeup_source_create - Create a struct wakeup_source object.
57 * @name: Name of the new wakeup source. 74 * @name: Name of the new wakeup source.
58 */ 75 */
@@ -60,31 +77,44 @@ struct wakeup_source *wakeup_source_create(const char *name)
60{ 77{
61 struct wakeup_source *ws; 78 struct wakeup_source *ws;
62 79
63 ws = kzalloc(sizeof(*ws), GFP_KERNEL); 80 ws = kmalloc(sizeof(*ws), GFP_KERNEL);
64 if (!ws) 81 if (!ws)
65 return NULL; 82 return NULL;
66 83
67 if (name) 84 wakeup_source_prepare(ws, name ? kstrdup(name, GFP_KERNEL) : NULL);
68 ws->name = kstrdup(name, GFP_KERNEL);
69
70 return ws; 85 return ws;
71} 86}
72EXPORT_SYMBOL_GPL(wakeup_source_create); 87EXPORT_SYMBOL_GPL(wakeup_source_create);
73 88
74/** 89/**
75 * wakeup_source_destroy - Destroy a struct wakeup_source object. 90 * wakeup_source_drop - Prepare a struct wakeup_source object for destruction.
76 * @ws: Wakeup source to destroy. 91 * @ws: Wakeup source to prepare for destruction.
77 * 92 *
78 * Callers must ensure that __pm_stay_awake() or __pm_wakeup_event() will never 93 * Callers must ensure that __pm_stay_awake() or __pm_wakeup_event() will never
79 * be run in parallel with this function for the same wakeup source object. 94 * be run in parallel with this function for the same wakeup source object.
80 */ 95 */
81void wakeup_source_destroy(struct wakeup_source *ws) 96void wakeup_source_drop(struct wakeup_source *ws)
82{ 97{
83 if (!ws) 98 if (!ws)
84 return; 99 return;
85 100
86 del_timer_sync(&ws->timer); 101 del_timer_sync(&ws->timer);
87 __pm_relax(ws); 102 __pm_relax(ws);
103}
104EXPORT_SYMBOL_GPL(wakeup_source_drop);
105
106/**
107 * wakeup_source_destroy - Destroy a struct wakeup_source object.
108 * @ws: Wakeup source to destroy.
109 *
110 * Use only for wakeup source objects created with wakeup_source_create().
111 */
112void wakeup_source_destroy(struct wakeup_source *ws)
113{
114 if (!ws)
115 return;
116
117 wakeup_source_drop(ws);
88 kfree(ws->name); 118 kfree(ws->name);
89 kfree(ws); 119 kfree(ws);
90} 120}
@@ -147,8 +177,10 @@ EXPORT_SYMBOL_GPL(wakeup_source_register);
147 */ 177 */
148void wakeup_source_unregister(struct wakeup_source *ws) 178void wakeup_source_unregister(struct wakeup_source *ws)
149{ 179{
150 wakeup_source_remove(ws); 180 if (ws) {
151 wakeup_source_destroy(ws); 181 wakeup_source_remove(ws);
182 wakeup_source_destroy(ws);
183 }
152} 184}
153EXPORT_SYMBOL_GPL(wakeup_source_unregister); 185EXPORT_SYMBOL_GPL(wakeup_source_unregister);
154 186