X-Git-Url: http://git.onelab.eu/?a=blobdiff_plain;f=kernel%2Fpower%2Fpm.c;h=84063ac8fcfc95bd15d56dc6778ec45bb503aa43;hb=9464c7cf61b9433057924c36e6e02f303a00e768;hp=c50d15266c1096d42d61e296ea4da13d34cb57ec;hpb=41689045f6a3cbe0550e1d34e9cc20d2e8c432ba;p=linux-2.6.git diff --git a/kernel/power/pm.c b/kernel/power/pm.c index c50d15266..84063ac8f 100644 --- a/kernel/power/pm.c +++ b/kernel/power/pm.c @@ -75,6 +75,42 @@ struct pm_dev *pm_register(pm_dev_t type, return dev; } +static void __pm_unregister(struct pm_dev *dev) +{ + if (dev) { + list_del(&dev->entry); + kfree(dev); + } +} + +/** + * pm_unregister_all - unregister all devices with matching callback + * @callback: callback function pointer + * + * Unregister every device that would call the callback passed. This + * is primarily meant as a helper function for loadable modules. It + * enables a module to give up all its managed devices without keeping + * its own private list. + */ + +void pm_unregister_all(pm_callback callback) +{ + struct list_head *entry; + + if (!callback) + return; + + mutex_lock(&pm_devs_lock); + entry = pm_devs.next; + while (entry != &pm_devs) { + struct pm_dev *dev = list_entry(entry, struct pm_dev, entry); + entry = entry->next; + if (dev->callback == callback) + __pm_unregister(dev); + } + mutex_unlock(&pm_devs_lock); +} + /** * pm_send - send request to a single device * @dev: device to send to @@ -203,6 +239,7 @@ int pm_send_all(pm_request_t rqst, void *data) } EXPORT_SYMBOL(pm_register); +EXPORT_SYMBOL(pm_unregister_all); EXPORT_SYMBOL(pm_send_all); EXPORT_SYMBOL(pm_active);