diff --git a/drivers/base/base.h b/drivers/base/base.h index 23828bd920db..c9812f0a56b0 100644 --- a/drivers/base/base.h +++ b/drivers/base/base.h @@ -231,6 +231,7 @@ struct devres_node { void devres_node_init(struct devres_node *node, dr_node_release_t release, dr_node_free_t free_node); void devres_node_add(struct device *dev, struct devres_node *node); +bool devres_node_remove(struct device *dev, struct devres_node *node); void devres_for_each_res(struct device *dev, dr_release_t release, dr_match_t match, void *match_data, void (*fn)(struct device *, void *, void *), diff --git a/drivers/base/devres.c b/drivers/base/devres.c index 22d10b30774f..6c7854d4e4a8 100644 --- a/drivers/base/devres.c +++ b/drivers/base/devres.c @@ -365,6 +365,22 @@ void *devres_get(struct device *dev, void *new_res, } EXPORT_SYMBOL_GPL(devres_get); +bool devres_node_remove(struct device *dev, struct devres_node *node) +{ + struct devres_node *__node; + + guard(spinlock_irqsave)(&dev->devres_lock); + list_for_each_entry_reverse(__node, &dev->devres_head, entry) { + if (__node == node) { + list_del_init(&node->entry); + devres_log(dev, node, "REM"); + return true; + } + } + + return false; +} + /** * devres_remove - Find a device resource and remove it * @dev: Device to find resource from