PCI/portdrv: Remove pcie_port_bus_type link order dependency
[muen/linux.git] / drivers / pci / pci-driver.c
index 646da0d2d7a8f585affb1ff02a994da1a5bc3a1f..21eb2f7ad95dddd372478af170a4cd49cd43b273 100644 (file)
@@ -19,6 +19,7 @@
 #include <linux/suspend.h>
 #include <linux/kexec.h>
 #include "pci.h"
+#include "pcie/portdrv.h"
 
 struct pci_dynid {
        struct list_head node;
@@ -1552,8 +1553,49 @@ struct bus_type pci_bus_type = {
 };
 EXPORT_SYMBOL(pci_bus_type);
 
+#ifdef CONFIG_PCIEPORTBUS
+static int pcie_port_bus_match(struct device *dev, struct device_driver *drv)
+{
+       struct pcie_device *pciedev;
+       struct pcie_port_service_driver *driver;
+
+       if (drv->bus != &pcie_port_bus_type || dev->bus != &pcie_port_bus_type)
+               return 0;
+
+       pciedev = to_pcie_device(dev);
+       driver = to_service_driver(drv);
+
+       if (driver->service != pciedev->service)
+               return 0;
+
+       if (driver->port_type != PCIE_ANY_PORT &&
+           driver->port_type != pci_pcie_type(pciedev->port))
+               return 0;
+
+       return 1;
+}
+
+struct bus_type pcie_port_bus_type = {
+       .name           = "pci_express",
+       .match          = pcie_port_bus_match,
+};
+EXPORT_SYMBOL_GPL(pcie_port_bus_type);
+#endif
+
 static int __init pci_driver_init(void)
 {
-       return bus_register(&pci_bus_type);
+       int ret;
+
+       ret = bus_register(&pci_bus_type);
+       if (ret)
+               return ret;
+
+#ifdef CONFIG_PCIEPORTBUS
+       ret = bus_register(&pcie_port_bus_type);
+       if (ret)
+               return ret;
+#endif
+
+       return 0;
 }
 postcore_initcall(pci_driver_init);