Skip to content

Commit

Permalink
---
Browse files Browse the repository at this point in the history
yaml
---
r: 291863
b: refs/heads/master
c: 8671bbc
h: refs/heads/master
i:
  291861: 37c086f
  291859: 15345c3
  291855: bdd7a01
v: v3
  • Loading branch information
Rafael J. Wysocki committed Mar 4, 2012
1 parent 723da42 commit 48037c7
Show file tree
Hide file tree
Showing 3 changed files with 63 additions and 11 deletions.
2 changes: 1 addition & 1 deletion [refs]
Original file line number Diff line number Diff line change
@@ -1,2 +1,2 @@
---
refs/heads/master: 05b4877f6a4f1ba4952d1222213d262bf8c132b7
refs/heads/master: 8671bbc1bd0442ef0eab27f7d56216431c490820
50 changes: 41 additions & 9 deletions trunk/drivers/base/power/wakeup.c
Original file line number Diff line number Diff line change
Expand Up @@ -52,6 +52,23 @@ static void pm_wakeup_timer_fn(unsigned long data);

static LIST_HEAD(wakeup_sources);

/**
* wakeup_source_prepare - Prepare a new wakeup source for initialization.
* @ws: Wakeup source to prepare.
* @name: Pointer to the name of the new wakeup source.
*
* Callers must ensure that the @name string won't be freed when @ws is still in
* use.
*/
void wakeup_source_prepare(struct wakeup_source *ws, const char *name)
{
if (ws) {
memset(ws, 0, sizeof(*ws));
ws->name = name;
}
}
EXPORT_SYMBOL_GPL(wakeup_source_prepare);

/**
* wakeup_source_create - Create a struct wakeup_source object.
* @name: Name of the new wakeup source.
Expand All @@ -60,31 +77,44 @@ struct wakeup_source *wakeup_source_create(const char *name)
{
struct wakeup_source *ws;

ws = kzalloc(sizeof(*ws), GFP_KERNEL);
ws = kmalloc(sizeof(*ws), GFP_KERNEL);
if (!ws)
return NULL;

if (name)
ws->name = kstrdup(name, GFP_KERNEL);

wakeup_source_prepare(ws, name ? kstrdup(name, GFP_KERNEL) : NULL);
return ws;
}
EXPORT_SYMBOL_GPL(wakeup_source_create);

/**
* wakeup_source_destroy - Destroy a struct wakeup_source object.
* @ws: Wakeup source to destroy.
* wakeup_source_drop - Prepare a struct wakeup_source object for destruction.
* @ws: Wakeup source to prepare for destruction.
*
* Callers must ensure that __pm_stay_awake() or __pm_wakeup_event() will never
* be run in parallel with this function for the same wakeup source object.
*/
void wakeup_source_destroy(struct wakeup_source *ws)
void wakeup_source_drop(struct wakeup_source *ws)
{
if (!ws)
return;

del_timer_sync(&ws->timer);
__pm_relax(ws);
}
EXPORT_SYMBOL_GPL(wakeup_source_drop);

/**
* wakeup_source_destroy - Destroy a struct wakeup_source object.
* @ws: Wakeup source to destroy.
*
* Use only for wakeup source objects created with wakeup_source_create().
*/
void wakeup_source_destroy(struct wakeup_source *ws)
{
if (!ws)
return;

wakeup_source_drop(ws);
kfree(ws->name);
kfree(ws);
}
Expand Down Expand Up @@ -147,8 +177,10 @@ EXPORT_SYMBOL_GPL(wakeup_source_register);
*/
void wakeup_source_unregister(struct wakeup_source *ws)
{
wakeup_source_remove(ws);
wakeup_source_destroy(ws);
if (ws) {
wakeup_source_remove(ws);
wakeup_source_destroy(ws);
}
}
EXPORT_SYMBOL_GPL(wakeup_source_unregister);

Expand Down
22 changes: 21 additions & 1 deletion trunk/include/linux/pm_wakeup.h
Original file line number Diff line number Diff line change
Expand Up @@ -41,7 +41,7 @@
* @active: Status of the wakeup source.
*/
struct wakeup_source {
char *name;
const char *name;
struct list_head entry;
spinlock_t lock;
struct timer_list timer;
Expand Down Expand Up @@ -73,7 +73,9 @@ static inline bool device_may_wakeup(struct device *dev)
}

/* drivers/base/power/wakeup.c */
extern void wakeup_source_prepare(struct wakeup_source *ws, const char *name);
extern struct wakeup_source *wakeup_source_create(const char *name);
extern void wakeup_source_drop(struct wakeup_source *ws);
extern void wakeup_source_destroy(struct wakeup_source *ws);
extern void wakeup_source_add(struct wakeup_source *ws);
extern void wakeup_source_remove(struct wakeup_source *ws);
Expand Down Expand Up @@ -103,11 +105,16 @@ static inline bool device_can_wakeup(struct device *dev)
return dev->power.can_wakeup;
}

static inline void wakeup_source_prepare(struct wakeup_source *ws,
const char *name) {}

static inline struct wakeup_source *wakeup_source_create(const char *name)
{
return NULL;
}

static inline void wakeup_source_drop(struct wakeup_source *ws) {}

static inline void wakeup_source_destroy(struct wakeup_source *ws) {}

static inline void wakeup_source_add(struct wakeup_source *ws) {}
Expand Down Expand Up @@ -165,4 +172,17 @@ static inline void pm_wakeup_event(struct device *dev, unsigned int msec) {}

#endif /* !CONFIG_PM_SLEEP */

static inline void wakeup_source_init(struct wakeup_source *ws,
const char *name)
{
wakeup_source_prepare(ws, name);
wakeup_source_add(ws);
}

static inline void wakeup_source_trash(struct wakeup_source *ws)
{
wakeup_source_remove(ws);
wakeup_source_drop(ws);
}

#endif /* _LINUX_PM_WAKEUP_H */

0 comments on commit 48037c7

Please sign in to comment.