X-Git-Url: http://git.onelab.eu/?a=blobdiff_plain;f=kernel%2Fpower%2Fpm.c;h=33c508e857dd1a68607c553e30ddc7c3be3cd3ae;hb=987b0145d94eecf292d8b301228356f44611ab7c;hp=84063ac8fcfc95bd15d56dc6778ec45bb503aa43;hpb=f7ed79d23a47594e7834d66a8f14449796d4f3e6;p=linux-2.6.git diff --git a/kernel/power/pm.c b/kernel/power/pm.c index 84063ac8f..33c508e85 100644 --- a/kernel/power/pm.c +++ b/kernel/power/pm.c @@ -25,7 +25,6 @@ #include #include #include -#include int pm_active; @@ -41,7 +40,7 @@ int pm_active; * until a resume but that will be fine. */ -static DEFINE_MUTEX(pm_devs_lock); +static DECLARE_MUTEX(pm_devs_lock); static LIST_HEAD(pm_devs); /** @@ -68,13 +67,32 @@ struct pm_dev *pm_register(pm_dev_t type, dev->id = id; dev->callback = callback; - mutex_lock(&pm_devs_lock); + down(&pm_devs_lock); list_add(&dev->entry, &pm_devs); - mutex_unlock(&pm_devs_lock); + up(&pm_devs_lock); } return dev; } +/** + * pm_unregister - unregister a device with power management + * @dev: device to unregister + * + * Remove a device from the power management notification lists. The + * dev passed must be a handle previously returned by pm_register. + */ + +void pm_unregister(struct pm_dev *dev) +{ + if (dev) { + down(&pm_devs_lock); + list_del(&dev->entry); + up(&pm_devs_lock); + + kfree(dev); + } +} + static void __pm_unregister(struct pm_dev *dev) { if (dev) { @@ -100,7 +118,7 @@ void pm_unregister_all(pm_callback callback) if (!callback) return; - mutex_lock(&pm_devs_lock); + down(&pm_devs_lock); entry = pm_devs.next; while (entry != &pm_devs) { struct pm_dev *dev = list_entry(entry, struct pm_dev, entry); @@ -108,7 +126,7 @@ void pm_unregister_all(pm_callback callback) if (dev->callback == callback) __pm_unregister(dev); } - mutex_unlock(&pm_devs_lock); + up(&pm_devs_lock); } /** @@ -216,7 +234,7 @@ int pm_send_all(pm_request_t rqst, void *data) { struct list_head *entry; - mutex_lock(&pm_devs_lock); + down(&pm_devs_lock); entry = pm_devs.next; while (entry != &pm_devs) { struct pm_dev *dev = list_entry(entry, struct pm_dev, entry); @@ -228,17 +246,18 @@ int pm_send_all(pm_request_t rqst, void *data) */ if (rqst == PM_SUSPEND) pm_undo_all(dev); - mutex_unlock(&pm_devs_lock); + up(&pm_devs_lock); return status; } } entry = entry->next; } - mutex_unlock(&pm_devs_lock); + up(&pm_devs_lock); return 0; } EXPORT_SYMBOL(pm_register); +EXPORT_SYMBOL(pm_unregister); EXPORT_SYMBOL(pm_unregister_all); EXPORT_SYMBOL(pm_send_all); EXPORT_SYMBOL(pm_active);