PCI: layerscape: Ignore PCIe controllers in Endpoint mode
authorMinghuan Lian <Minghuan.Lian@freescale.com>
Fri, 16 Oct 2015 07:19:16 +0000 (15:19 +0800)
committerBjorn Helgaas <bhelgaas@google.com>
Mon, 2 Nov 2015 21:38:38 +0000 (15:38 -0600)
Layerscape PCIe controller supports root complex (RC) and endpoint (EP)
modes, which can be set by RCW.

If not in RC mode, return -ENODEV without claiming the controller.

Signed-off-by: Minghuan Lian <Minghuan.Lian@freescale.com>
Signed-off-by: Bjorn Helgaas <bhelgaas@google.com>
drivers/pci/host/pci-layerscape.c

index 6dd44a07124021862c1704b138af6fc67421c871..5eabe9238f0ed87a87cd4a0b0ca2ab18853f3e7f 100644 (file)
@@ -47,6 +47,16 @@ struct ls_pcie {
 
 #define to_ls_pcie(x)  container_of(x, struct ls_pcie, pp)
 
+static bool ls_pcie_is_bridge(struct ls_pcie *pcie)
+{
+       u32 header_type;
+
+       header_type = ioread8(pcie->dbi + PCI_HEADER_TYPE);
+       header_type &= 0x7f;
+
+       return header_type == PCI_HEADER_TYPE_BRIDGE;
+}
+
 static int ls_pcie_link_up(struct pcie_port *pp)
 {
        u32 state;
@@ -135,6 +145,9 @@ static int __init ls_pcie_probe(struct platform_device *pdev)
                return ret;
        pcie->index = index[1];
 
+       if (!ls_pcie_is_bridge(pcie))
+               return -ENODEV;
+
        ret = ls_add_pcie_port(pcie);
        if (ret < 0)
                return ret;