diff options
-rw-r--r-- | drivers/pci/host-bridge.c | 8 | ||||
-rw-r--r-- | drivers/pci/probe.c | 3 | ||||
-rw-r--r-- | include/linux/pci.h | 5 |
3 files changed, 15 insertions, 1 deletions
diff --git a/drivers/pci/host-bridge.c b/drivers/pci/host-bridge.c index 122df80592c3..a68dc613a5be 100644 --- a/drivers/pci/host-bridge.c +++ b/drivers/pci/host-bridge.c | |||
@@ -27,6 +27,14 @@ static struct pci_host_bridge *find_pci_host_bridge(struct pci_dev *dev) | |||
27 | return to_pci_host_bridge(bus->bridge); | 27 | return to_pci_host_bridge(bus->bridge); |
28 | } | 28 | } |
29 | 29 | ||
30 | void pci_set_host_bridge_release(struct pci_host_bridge *bridge, | ||
31 | void (*release_fn)(struct pci_host_bridge *), | ||
32 | void *release_data) | ||
33 | { | ||
34 | bridge->release_fn = release_fn; | ||
35 | bridge->release_data = release_data; | ||
36 | } | ||
37 | |||
30 | static bool resource_contains(struct resource *res1, struct resource *res2) | 38 | static bool resource_contains(struct resource *res1, struct resource *res2) |
31 | { | 39 | { |
32 | return res1->start <= res2->start && res1->end >= res2->end; | 40 | return res1->start <= res2->start && res1->end >= res2->end; |
diff --git a/drivers/pci/probe.c b/drivers/pci/probe.c index 8d291ee15257..4c2f22668ea7 100644 --- a/drivers/pci/probe.c +++ b/drivers/pci/probe.c | |||
@@ -1137,7 +1137,8 @@ static void pci_release_bus_bridge_dev(struct device *dev) | |||
1137 | { | 1137 | { |
1138 | struct pci_host_bridge *bridge = to_pci_host_bridge(dev); | 1138 | struct pci_host_bridge *bridge = to_pci_host_bridge(dev); |
1139 | 1139 | ||
1140 | /* TODO: need to free window->res */ | 1140 | if (bridge->release_fn) |
1141 | bridge->release_fn(bridge); | ||
1141 | 1142 | ||
1142 | pci_free_resource_list(&bridge->windows); | 1143 | pci_free_resource_list(&bridge->windows); |
1143 | 1144 | ||
diff --git a/include/linux/pci.h b/include/linux/pci.h index 8f4f29d2b606..17b7b5b01b4a 100644 --- a/include/linux/pci.h +++ b/include/linux/pci.h | |||
@@ -378,9 +378,14 @@ struct pci_host_bridge { | |||
378 | struct device dev; | 378 | struct device dev; |
379 | struct pci_bus *bus; /* root bus */ | 379 | struct pci_bus *bus; /* root bus */ |
380 | struct list_head windows; /* pci_host_bridge_windows */ | 380 | struct list_head windows; /* pci_host_bridge_windows */ |
381 | void (*release_fn)(struct pci_host_bridge *); | ||
382 | void *release_data; | ||
381 | }; | 383 | }; |
382 | 384 | ||
383 | #define to_pci_host_bridge(n) container_of(n, struct pci_host_bridge, dev) | 385 | #define to_pci_host_bridge(n) container_of(n, struct pci_host_bridge, dev) |
386 | void pci_set_host_bridge_release(struct pci_host_bridge *bridge, | ||
387 | void (*release_fn)(struct pci_host_bridge *), | ||
388 | void *release_data); | ||
384 | 389 | ||
385 | /* | 390 | /* |
386 | * The first PCI_BRIDGE_RESOURCE_NUM PCI bus resources (those that correspond | 391 | * The first PCI_BRIDGE_RESOURCE_NUM PCI bus resources (those that correspond |