diff --git a/include/linux/ioport.h b/include/linux/ioport.h index e885ba23de7..34ae6e6c65e 100644 --- a/include/linux/ioport.h +++ b/include/linux/ioport.h @@ -139,6 +139,8 @@ extern struct resource iomem_resource; extern struct resource *request_resource_conflict(struct resource *root, struct resource *new); extern int request_resource(struct resource *root, struct resource *new); +extern struct resource *locate_resource(struct resource *root, + struct resource *search); extern int release_resource(struct resource *new); void release_child_resources(struct resource *new); extern void reserve_region_with_split(struct resource *root, diff --git a/kernel/resource.c b/kernel/resource.c index 7e8ea66a8c0..5118711c033 100644 --- a/kernel/resource.c +++ b/kernel/resource.c @@ -261,6 +261,24 @@ int request_resource(struct resource *root, struct resource *new) EXPORT_SYMBOL(request_resource); +/** + * locate_resource - locate an already reserved I/O or memory resource + * @root: root resource descriptor + * @search: resource descriptor to be located + * + * Returns pointer to desired resource or NULL if not found. + */ +struct resource *locate_resource(struct resource *root, struct resource *search) +{ + struct resource *found; + + write_lock(&resource_lock); + found = __request_resource(root, search); + write_unlock(&resource_lock); + return found; +} +EXPORT_SYMBOL(locate_resource); + /** * release_resource - release a previously reserved resource * @old: resource pointer