diff options
author | Bjorn Helgaas <bhelgaas@google.com> | 2013-12-18 16:03:38 -0500 |
---|---|---|
committer | Bjorn Helgaas <bhelgaas@google.com> | 2013-12-18 16:03:38 -0500 |
commit | 330ebfe36e3dc21f656dfa59d69895e21bf6e9da (patch) | |
tree | 7eb064b76d37df212c27506798e7269acd14c327 | |
parent | d9cdfb8705b5b40087a437c3a58cf9dff59a0a46 (diff) | |
parent | ef83b0781a73f9efcb1228256bfdfb97fc9533a8 (diff) |
Merge branch 'pci/deletion' into next
* pci/deletion:
PCI: Remove from bus_list and release resources in pci_release_dev()
PCI: Move pci_proc_attach_device() to pci_bus_add_device()
PCI: Use device_release_driver() in pci_stop_root_bus()
PCI: Move device_del() from pci_stop_dev() to pci_destroy_dev()
Conflicts:
drivers/pci/remove.c
-rw-r--r-- | drivers/pci/bus.c | 1 | ||||
-rw-r--r-- | drivers/pci/probe.c | 23 | ||||
-rw-r--r-- | drivers/pci/remove.c | 23 |
3 files changed, 22 insertions, 25 deletions
diff --git a/drivers/pci/bus.c b/drivers/pci/bus.c index fc1b74013743..a037d81f21ed 100644 --- a/drivers/pci/bus.c +++ b/drivers/pci/bus.c | |||
@@ -176,6 +176,7 @@ int pci_bus_add_device(struct pci_dev *dev) | |||
176 | */ | 176 | */ |
177 | pci_fixup_device(pci_fixup_final, dev); | 177 | pci_fixup_device(pci_fixup_final, dev); |
178 | pci_create_sysfs_dev_files(dev); | 178 | pci_create_sysfs_dev_files(dev); |
179 | pci_proc_attach_device(dev); | ||
179 | 180 | ||
180 | dev->match_driver = true; | 181 | dev->match_driver = true; |
181 | retval = device_attach(&dev->dev); | 182 | retval = device_attach(&dev->dev); |
diff --git a/drivers/pci/probe.c b/drivers/pci/probe.c index 38e403dddf6e..12ec56c9a913 100644 --- a/drivers/pci/probe.c +++ b/drivers/pci/probe.c | |||
@@ -1154,6 +1154,18 @@ static void pci_release_capabilities(struct pci_dev *dev) | |||
1154 | pci_free_cap_save_buffers(dev); | 1154 | pci_free_cap_save_buffers(dev); |
1155 | } | 1155 | } |
1156 | 1156 | ||
1157 | static void pci_free_resources(struct pci_dev *dev) | ||
1158 | { | ||
1159 | int i; | ||
1160 | |||
1161 | pci_cleanup_rom(dev); | ||
1162 | for (i = 0; i < PCI_NUM_RESOURCES; i++) { | ||
1163 | struct resource *res = dev->resource + i; | ||
1164 | if (res->parent) | ||
1165 | release_resource(res); | ||
1166 | } | ||
1167 | } | ||
1168 | |||
1157 | /** | 1169 | /** |
1158 | * pci_release_dev - free a pci device structure when all users of it are finished. | 1170 | * pci_release_dev - free a pci device structure when all users of it are finished. |
1159 | * @dev: device that's been disconnected | 1171 | * @dev: device that's been disconnected |
@@ -1163,9 +1175,14 @@ static void pci_release_capabilities(struct pci_dev *dev) | |||
1163 | */ | 1175 | */ |
1164 | static void pci_release_dev(struct device *dev) | 1176 | static void pci_release_dev(struct device *dev) |
1165 | { | 1177 | { |
1166 | struct pci_dev *pci_dev; | 1178 | struct pci_dev *pci_dev = to_pci_dev(dev); |
1179 | |||
1180 | down_write(&pci_bus_sem); | ||
1181 | list_del(&pci_dev->bus_list); | ||
1182 | up_write(&pci_bus_sem); | ||
1183 | |||
1184 | pci_free_resources(pci_dev); | ||
1167 | 1185 | ||
1168 | pci_dev = to_pci_dev(dev); | ||
1169 | pci_release_capabilities(pci_dev); | 1186 | pci_release_capabilities(pci_dev); |
1170 | pci_release_of_node(pci_dev); | 1187 | pci_release_of_node(pci_dev); |
1171 | pcibios_release_device(pci_dev); | 1188 | pcibios_release_device(pci_dev); |
@@ -1381,8 +1398,6 @@ void pci_device_add(struct pci_dev *dev, struct pci_bus *bus) | |||
1381 | dev->match_driver = false; | 1398 | dev->match_driver = false; |
1382 | ret = device_add(&dev->dev); | 1399 | ret = device_add(&dev->dev); |
1383 | WARN_ON(ret < 0); | 1400 | WARN_ON(ret < 0); |
1384 | |||
1385 | pci_proc_attach_device(dev); | ||
1386 | } | 1401 | } |
1387 | 1402 | ||
1388 | struct pci_dev *__ref pci_scan_single_device(struct pci_bus *bus, int devfn) | 1403 | struct pci_dev *__ref pci_scan_single_device(struct pci_bus *bus, int devfn) |
diff --git a/drivers/pci/remove.c b/drivers/pci/remove.c index cc9337a71529..f452148e6d55 100644 --- a/drivers/pci/remove.c +++ b/drivers/pci/remove.c | |||
@@ -3,20 +3,6 @@ | |||
3 | #include <linux/pci-aspm.h> | 3 | #include <linux/pci-aspm.h> |
4 | #include "pci.h" | 4 | #include "pci.h" |
5 | 5 | ||
6 | static void pci_free_resources(struct pci_dev *dev) | ||
7 | { | ||
8 | int i; | ||
9 | |||
10 | msi_remove_pci_irq_vectors(dev); | ||
11 | |||
12 | pci_cleanup_rom(dev); | ||
13 | for (i = 0; i < PCI_NUM_RESOURCES; i++) { | ||
14 | struct resource *res = dev->resource + i; | ||
15 | if (res->parent) | ||
16 | release_resource(res); | ||
17 | } | ||
18 | } | ||
19 | |||
20 | static void pci_stop_dev(struct pci_dev *dev) | 6 | static void pci_stop_dev(struct pci_dev *dev) |
21 | { | 7 | { |
22 | pci_pme_active(dev, false); | 8 | pci_pme_active(dev, false); |
@@ -36,11 +22,6 @@ static void pci_destroy_dev(struct pci_dev *dev) | |||
36 | { | 22 | { |
37 | device_del(&dev->dev); | 23 | device_del(&dev->dev); |
38 | 24 | ||
39 | down_write(&pci_bus_sem); | ||
40 | list_del(&dev->bus_list); | ||
41 | up_write(&pci_bus_sem); | ||
42 | |||
43 | pci_free_resources(dev); | ||
44 | put_device(&dev->dev); | 25 | put_device(&dev->dev); |
45 | } | 26 | } |
46 | 27 | ||
@@ -128,7 +109,7 @@ void pci_stop_root_bus(struct pci_bus *bus) | |||
128 | pci_stop_bus_device(child); | 109 | pci_stop_bus_device(child); |
129 | 110 | ||
130 | /* stop the host bridge */ | 111 | /* stop the host bridge */ |
131 | device_del(&host_bridge->dev); | 112 | device_release_driver(&host_bridge->dev); |
132 | } | 113 | } |
133 | 114 | ||
134 | void pci_remove_root_bus(struct pci_bus *bus) | 115 | void pci_remove_root_bus(struct pci_bus *bus) |
@@ -147,5 +128,5 @@ void pci_remove_root_bus(struct pci_bus *bus) | |||
147 | host_bridge->bus = NULL; | 128 | host_bridge->bus = NULL; |
148 | 129 | ||
149 | /* remove the host bridge */ | 130 | /* remove the host bridge */ |
150 | put_device(&host_bridge->dev); | 131 | device_unregister(&host_bridge->dev); |
151 | } | 132 | } |