Merge branch 'remotes/lorenzo/pci/bridge-emul'
[linux-2.6-block.git] / drivers / pci / controller / pci-mvebu.c
index d7de48c10bdadbf5f32fc497f6405bb839693671..4f2508dc1ed2d5453f9d508ddbba96500a207f40 100644 (file)
@@ -723,6 +723,8 @@ static struct pci_bridge_emul_ops mvebu_pci_bridge_emul_ops = {
 static int mvebu_pci_bridge_emul_init(struct mvebu_pcie_port *port)
 {
        struct pci_bridge_emul *bridge = &port->bridge;
+       u32 pcie_cap = mvebu_readl(port, PCIE_CAP_PCIEXP);
+       u8 pcie_cap_ver = ((pcie_cap >> 16) & PCI_EXP_FLAGS_VERS);
 
        bridge->conf.vendor = PCI_VENDOR_ID_MARVELL;
        bridge->conf.device = mvebu_readl(port, PCIE_DEV_ID_OFF) >> 16;
@@ -735,6 +737,12 @@ static int mvebu_pci_bridge_emul_init(struct mvebu_pcie_port *port)
                bridge->conf.iolimit = PCI_IO_RANGE_TYPE_32;
        }
 
+       /*
+        * Older mvebu hardware provides PCIe Capability structure only in
+        * version 1. New hardware provides it in version 2.
+        */
+       bridge->pcie_conf.cap = cpu_to_le16(pcie_cap_ver);
+
        bridge->has_pcie = true;
        bridge->data = port;
        bridge->ops = &mvebu_pci_bridge_emul_ops;