diff options
author | phk <phk@FreeBSD.org> | 2005-09-24 19:31:10 +0000 |
---|---|---|
committer | phk <phk@FreeBSD.org> | 2005-09-24 19:31:10 +0000 |
commit | 538e3ae81de8e4fe6309c209a04c7d4ec476af05 (patch) | |
tree | 5047301813f00a3e55ef4b7ae370fb910aa7f2d8 /sys/kern/subr_bus.c | |
parent | c5182c8c5e1c2a2cb2ff0730db77198b5c832ebc (diff) | |
download | FreeBSD-src-538e3ae81de8e4fe6309c209a04c7d4ec476af05.zip FreeBSD-src-538e3ae81de8e4fe6309c209a04c7d4ec476af05.tar.gz |
Add two convenience functions for device drivers: bus_alloc_resources()
and bus_free_resources(). These functions take a list of resources
and handle them all in one go. A flag makes it possible to mark
a resource as optional.
A typical device driver can save 10-30 lines of code by using these.
Usage examples will follow RSN.
MFC: A good idea, eventually.
Diffstat (limited to 'sys/kern/subr_bus.c')
-rw-r--r-- | sys/kern/subr_bus.c | 31 |
1 files changed, 31 insertions, 0 deletions
diff --git a/sys/kern/subr_bus.c b/sys/kern/subr_bus.c index 2bfa275..b475257 100644 --- a/sys/kern/subr_bus.c +++ b/sys/kern/subr_bus.c @@ -3321,6 +3321,37 @@ bus_generic_child_present(device_t dev, device_t child) * to maintain some sort of a list of resources allocated by each device. */ +int +bus_alloc_resources(device_t dev, struct resource_spec *rs, + struct resource **res) +{ + int i; + + for (i = 0; rs[i].type != -1; i++) + res[i] = NULL; + for (i = 0; rs[i].type != -1; i++) { + res[i] = bus_alloc_resource_any(dev, + rs[i].type, &rs[i].rid, rs[i].flags); + if (res[i] == NULL && !(rs[i].flags & RF_OPTIONAL)) { + bus_release_resources(dev, rs, res); + return (ENXIO); + } + } + return (0); +} + +void +bus_release_resources(device_t dev, struct resource_spec *rs, + struct resource **res) +{ + int i; + + for (i = 0; rs[i].type != -1; i++) + if (res[i] != NULL) + bus_release_resource( + dev, rs[i].type, rs[i].rid, res[i]); +} + /** * @brief Wrapper function for BUS_ALLOC_RESOURCE(). * |