|
14 | 14 | #include <linux/irq.h>
|
15 | 15 | #include <linux/irqdomain.h>
|
16 | 16 | #include <linux/kernel.h>
|
| 17 | +#include <linux/module.h> |
17 | 18 | #include <linux/pci.h>
|
18 | 19 | #include <linux/init.h>
|
19 | 20 | #include <linux/phy/phy.h>
|
@@ -1121,6 +1122,7 @@ static int advk_pcie_probe(struct platform_device *pdev)
|
1121 | 1122 |
|
1122 | 1123 | pcie = pci_host_bridge_priv(bridge);
|
1123 | 1124 | pcie->pdev = pdev;
|
| 1125 | + platform_set_drvdata(pdev, pcie); |
1124 | 1126 |
|
1125 | 1127 | pcie->base = devm_platform_ioremap_resource(pdev, 0);
|
1126 | 1128 | if (IS_ERR(pcie->base))
|
@@ -1198,18 +1200,37 @@ static int advk_pcie_probe(struct platform_device *pdev)
|
1198 | 1200 | return 0;
|
1199 | 1201 | }
|
1200 | 1202 |
|
| 1203 | +static int advk_pcie_remove(struct platform_device *pdev) |
| 1204 | +{ |
| 1205 | + struct advk_pcie *pcie = platform_get_drvdata(pdev); |
| 1206 | + struct pci_host_bridge *bridge = pci_host_bridge_from_priv(pcie); |
| 1207 | + |
| 1208 | + pci_lock_rescan_remove(); |
| 1209 | + pci_stop_root_bus(bridge->bus); |
| 1210 | + pci_remove_root_bus(bridge->bus); |
| 1211 | + pci_unlock_rescan_remove(); |
| 1212 | + |
| 1213 | + advk_pcie_remove_msi_irq_domain(pcie); |
| 1214 | + advk_pcie_remove_irq_domain(pcie); |
| 1215 | + |
| 1216 | + return 0; |
| 1217 | +} |
| 1218 | + |
1201 | 1219 | static const struct of_device_id advk_pcie_of_match_table[] = {
|
1202 | 1220 | { .compatible = "marvell,armada-3700-pcie", },
|
1203 | 1221 | {},
|
1204 | 1222 | };
|
| 1223 | +MODULE_DEVICE_TABLE(of, advk_pcie_of_match_table); |
1205 | 1224 |
|
1206 | 1225 | static struct platform_driver advk_pcie_driver = {
|
1207 | 1226 | .driver = {
|
1208 | 1227 | .name = "advk-pcie",
|
1209 | 1228 | .of_match_table = advk_pcie_of_match_table,
|
1210 |
| - /* Driver unloading/unbinding currently not supported */ |
1211 |
| - .suppress_bind_attrs = true, |
1212 | 1229 | },
|
1213 | 1230 | .probe = advk_pcie_probe,
|
| 1231 | + .remove = advk_pcie_remove, |
1214 | 1232 | };
|
1215 |
| -builtin_platform_driver(advk_pcie_driver); |
| 1233 | +module_platform_driver(advk_pcie_driver); |
| 1234 | + |
| 1235 | +MODULE_DESCRIPTION("Aardvark PCIe controller"); |
| 1236 | +MODULE_LICENSE("GPL v2"); |
0 commit comments