/* allocate_resource - allocate empty slot in the resource tree given range & alignment @root: root resource descriptor @new: resource descriptor desired by caller @size: requested resource region size @min: minimum size to allocate @max: maximum size to allocate @align: alignment requested, in bytes @alignf: alignment function, optional, called if not NULL @alignf_data: arbitrary data to pass to the @alignf function  */
int allocate_resource(struct resource *root, struct resource *new, resource_size_t size, resource_size_t min, resource_size_t max, resource_size_t align, void(*alignf)(void *, struct resource *, resource_size_t, resource_size_t), void *alignf_data)
/* allocate_resource - allocate empty slot in the resource tree given range & alignment @root: root resource descriptor @new: resource descriptor desired by caller @size: requested resource region size @min: minimum size to allocate @max: maximum size to allocate @align: alignment requested, in bytes @alignf: alignment function, optional, called if not NULL @alignf_data: arbitrary data to pass to the @alignf function  */
int allocate_resource(struct resource *root, struct resource *new, resource_size_t size, resource_size_t min, resource_size_t max, resource_size_t align, void(*alignf)(void *, struct resource *, resource_size_t, resource_size_t), void *alignf_data)
{
	int err;
	write_lock(&resource_lock);
	err = find_resource(root, new, size, min, max, align, alignf, alignf_data);
	if (err >= 0 && __request_resource(root, new))
		err = -EBUSY;
	write_unlock(&resource_lock);
	return err;
}