|
@@ -188,6 +188,36 @@ static int __release_resource(struct resource *old)
|
|
|
return -EINVAL;
|
|
|
}
|
|
|
|
|
|
+static void __release_child_resources(struct resource *r)
|
|
|
+{
|
|
|
+ struct resource *tmp, *p;
|
|
|
+ resource_size_t size;
|
|
|
+
|
|
|
+ p = r->child;
|
|
|
+ r->child = NULL;
|
|
|
+ while (p) {
|
|
|
+ tmp = p;
|
|
|
+ p = p->sibling;
|
|
|
+
|
|
|
+ tmp->parent = NULL;
|
|
|
+ tmp->sibling = NULL;
|
|
|
+ __release_child_resources(tmp);
|
|
|
+
|
|
|
+ printk(KERN_DEBUG "release child resource %pR\n", tmp);
|
|
|
+ /* need to restore size, and keep flags */
|
|
|
+ size = resource_size(tmp);
|
|
|
+ tmp->start = 0;
|
|
|
+ tmp->end = size - 1;
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
+void release_child_resources(struct resource *r)
|
|
|
+{
|
|
|
+ write_lock(&resource_lock);
|
|
|
+ __release_child_resources(r);
|
|
|
+ write_unlock(&resource_lock);
|
|
|
+}
|
|
|
+
|
|
|
/**
|
|
|
* request_resource - request and reserve an I/O or memory resource
|
|
|
* @root: root resource descriptor
|