summaryrefslogtreecommitdiffstats
path: root/sys/kern/subr_bus.c
diff options
context:
space:
mode:
authorphk <phk@FreeBSD.org>2005-09-24 19:31:10 +0000
committerphk <phk@FreeBSD.org>2005-09-24 19:31:10 +0000
commit538e3ae81de8e4fe6309c209a04c7d4ec476af05 (patch)
tree5047301813f00a3e55ef4b7ae370fb910aa7f2d8 /sys/kern/subr_bus.c
parentc5182c8c5e1c2a2cb2ff0730db77198b5c832ebc (diff)
downloadFreeBSD-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.c31
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().
*
OpenPOWER on IntegriCloud