Skip to content

Commit

Permalink
Power Management: use mutexes instead of semaphores
Browse files Browse the repository at this point in the history
The Power Management code uses semaphores as mutexes.  Use the mutex API
instead of the (binary) semaphores.

Signed-off-by: Matthias Kaehlcke <matthias.kaehlcke@gmail.com>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
  • Loading branch information
Matthias Kaehlcke authored and Greg Kroah-Hartman committed Jul 11, 2007
1 parent 9f3f776 commit 11048dc
Show file tree
Hide file tree
Showing 5 changed files with 29 additions and 27 deletions.
14 changes: 8 additions & 6 deletions drivers/base/power/main.c
Original file line number Diff line number Diff line change
Expand Up @@ -20,14 +20,16 @@
*/

#include <linux/device.h>
#include <linux/mutex.h>

#include "power.h"

LIST_HEAD(dpm_active);
LIST_HEAD(dpm_off);
LIST_HEAD(dpm_off_irq);

DECLARE_MUTEX(dpm_sem);
DECLARE_MUTEX(dpm_list_sem);
DEFINE_MUTEX(dpm_mtx);
DEFINE_MUTEX(dpm_list_mtx);

int (*platform_enable_wakeup)(struct device *dev, int is_on);

Expand Down Expand Up @@ -59,12 +61,12 @@ int device_pm_add(struct device * dev)
pr_debug("PM: Adding info for %s:%s\n",
dev->bus ? dev->bus->name : "No Bus",
kobject_name(&dev->kobj));
down(&dpm_list_sem);
mutex_lock(&dpm_list_mtx);
list_add_tail(&dev->power.entry, &dpm_active);
device_pm_set_parent(dev, dev->parent);
if ((error = dpm_sysfs_add(dev)))
list_del(&dev->power.entry);
up(&dpm_list_sem);
mutex_unlock(&dpm_list_mtx);
return error;
}

Expand All @@ -73,11 +75,11 @@ void device_pm_remove(struct device * dev)
pr_debug("PM: Removing info for %s:%s\n",
dev->bus ? dev->bus->name : "No Bus",
kobject_name(&dev->kobj));
down(&dpm_list_sem);
mutex_lock(&dpm_list_mtx);
dpm_sysfs_remove(dev);
put_device(dev->power.pm_parent);
list_del_init(&dev->power.entry);
up(&dpm_list_sem);
mutex_unlock(&dpm_list_mtx);
}


4 changes: 2 additions & 2 deletions drivers/base/power/power.h
Original file line number Diff line number Diff line change
Expand Up @@ -14,12 +14,12 @@ extern void device_shutdown(void);
/*
* Used to synchronize global power management operations.
*/
extern struct semaphore dpm_sem;
extern struct mutex dpm_mtx;

/*
* Used to serialize changes to the dpm_* lists.
*/
extern struct semaphore dpm_list_sem;
extern struct mutex dpm_list_mtx;

/*
* The PM lists.
Expand Down
12 changes: 6 additions & 6 deletions drivers/base/power/resume.c
Original file line number Diff line number Diff line change
Expand Up @@ -80,21 +80,21 @@ static int resume_device_early(struct device * dev)
*/
void dpm_resume(void)
{
down(&dpm_list_sem);
mutex_lock(&dpm_list_mtx);
while(!list_empty(&dpm_off)) {
struct list_head * entry = dpm_off.next;
struct device * dev = to_device(entry);

get_device(dev);
list_move_tail(entry, &dpm_active);

up(&dpm_list_sem);
mutex_unlock(&dpm_list_mtx);
if (!dev->power.prev_state.event)
resume_device(dev);
down(&dpm_list_sem);
mutex_lock(&dpm_list_mtx);
put_device(dev);
}
up(&dpm_list_sem);
mutex_unlock(&dpm_list_mtx);
}


Expand All @@ -108,9 +108,9 @@ void dpm_resume(void)
void device_resume(void)
{
might_sleep();
down(&dpm_sem);
mutex_lock(&dpm_mtx);
dpm_resume();
up(&dpm_sem);
mutex_unlock(&dpm_mtx);
}

EXPORT_SYMBOL_GPL(device_resume);
Expand Down
12 changes: 6 additions & 6 deletions drivers/base/power/runtime.c
Original file line number Diff line number Diff line change
Expand Up @@ -32,9 +32,9 @@ static void runtime_resume(struct device * dev)

void dpm_runtime_resume(struct device * dev)
{
down(&dpm_sem);
mutex_lock(&dpm_mtx);
runtime_resume(dev);
up(&dpm_sem);
mutex_unlock(&dpm_mtx);
}
EXPORT_SYMBOL(dpm_runtime_resume);

Expand All @@ -49,7 +49,7 @@ int dpm_runtime_suspend(struct device * dev, pm_message_t state)
{
int error = 0;

down(&dpm_sem);
mutex_lock(&dpm_mtx);
if (dev->power.power_state.event == state.event)
goto Done;

Expand All @@ -59,7 +59,7 @@ int dpm_runtime_suspend(struct device * dev, pm_message_t state)
if (!(error = suspend_device(dev, state)))
dev->power.power_state = state;
Done:
up(&dpm_sem);
mutex_unlock(&dpm_mtx);
return error;
}
EXPORT_SYMBOL(dpm_runtime_suspend);
Expand All @@ -78,8 +78,8 @@ EXPORT_SYMBOL(dpm_runtime_suspend);
*/
void dpm_set_power_state(struct device * dev, pm_message_t state)
{
down(&dpm_sem);
mutex_lock(&dpm_mtx);
dev->power.power_state = state;
up(&dpm_sem);
mutex_unlock(&dpm_mtx);
}
#endif /* 0 */
14 changes: 7 additions & 7 deletions drivers/base/power/suspend.c
Original file line number Diff line number Diff line change
Expand Up @@ -108,7 +108,7 @@ int suspend_device(struct device * dev, pm_message_t state)

/*
* This is called with interrupts off, only a single CPU
* running. We can't do down() on a semaphore (and we don't
* running. We can't acquire a mutex or semaphore (and we don't
* need the protection)
*/
static int suspend_device_late(struct device *dev, pm_message_t state)
Expand Down Expand Up @@ -153,18 +153,18 @@ int device_suspend(pm_message_t state)
int error = 0;

might_sleep();
down(&dpm_sem);
down(&dpm_list_sem);
mutex_lock(&dpm_mtx);
mutex_lock(&dpm_list_mtx);
while (!list_empty(&dpm_active) && error == 0) {
struct list_head * entry = dpm_active.prev;
struct device * dev = to_device(entry);

get_device(dev);
up(&dpm_list_sem);
mutex_unlock(&dpm_list_mtx);

error = suspend_device(dev, state);

down(&dpm_list_sem);
mutex_lock(&dpm_list_mtx);

/* Check if the device got removed */
if (!list_empty(&dev->power.entry)) {
Expand All @@ -179,11 +179,11 @@ int device_suspend(pm_message_t state)
error == -EAGAIN ? " (please convert to suspend_late)" : "");
put_device(dev);
}
up(&dpm_list_sem);
mutex_unlock(&dpm_list_mtx);
if (error)
dpm_resume();

up(&dpm_sem);
mutex_unlock(&dpm_mtx);
return error;
}

Expand Down

0 comments on commit 11048dc

Please sign in to comment.