]> git.karo-electronics.de Git - karo-tx-linux.git/commitdiff
PCI: iproc: Add BCMA type
authorRay Jui <ray.jui@broadcom.com>
Tue, 1 Nov 2016 00:38:32 +0000 (17:38 -0700)
committerBjorn Helgaas <bhelgaas@google.com>
Mon, 14 Nov 2016 21:55:33 +0000 (15:55 -0600)
The iProc PCIe driver is currently using type IPROC_PCIE_PAXB for the
following SoCs: NS, NSP, Cygnus, NS2, and Pegasus.  In fact, the BCMA-based
NS uses a legacy PAXB controller that is slightly different from the PAXB
controller used in the rest of SoCs, e.g., some registers are missing and
it does not require software configuration of outbound/inbound address
mapping.

Add a new type, IPROC_PCIE_PAXB_BCMA, to allow us to properly support the
BCMA-based NS along with other iProc-based SoCs going forward.

Signed-off-by: Ray Jui <ray.jui@broadcom.com>
Signed-off-by: Bjorn Helgaas <bhelgaas@google.com>
Reviewed-by: Scott Branden <scott.branden@broadcom.com>
drivers/pci/host/pcie-iproc-bcma.c
drivers/pci/host/pcie-iproc-msi.c
drivers/pci/host/pcie-iproc.c
drivers/pci/host/pcie-iproc.h

index 8ce089043a27dcd05be911bd1cd953e4abe92af0..bd4c9ec25edc22531ae450b2bb08f1d2aecd7b62 100644 (file)
@@ -54,6 +54,7 @@ static int iproc_pcie_bcma_probe(struct bcma_device *bdev)
 
        pcie->dev = dev;
 
+       pcie->type = IPROC_PCIE_PAXB_BCMA;
        pcie->base = bdev->io_addr;
        if (!pcie->base) {
                dev_err(dev, "no controller registers\n");
index 9a2973bdc78a97deb148eed7635f72d49d0e5909..9fad7915f82aa4bbaf9c74e3e2ffa568e983e989 100644 (file)
@@ -563,6 +563,7 @@ int iproc_msi_init(struct iproc_pcie *pcie, struct device_node *node)
        }
 
        switch (pcie->type) {
+       case IPROC_PCIE_PAXB_BCMA:
        case IPROC_PCIE_PAXB:
                msi->reg_offsets = iproc_msi_reg_paxb;
                msi->nr_eq_region = 1;
index 93b4d619c0ed9d9f5a536dd6cb74bc1181139211..912a1cbe561e86b78698d82701545b26837f50ab 100644 (file)
@@ -100,6 +100,17 @@ enum iproc_pcie_reg {
        IPROC_PCIE_MAX_NUM_REG,
 };
 
+/* iProc PCIe PAXB BCMA registers */
+static const u16 iproc_pcie_reg_paxb_bcma[] = {
+       [IPROC_PCIE_CLK_CTRL]         = 0x000,
+       [IPROC_PCIE_CFG_IND_ADDR]     = 0x120,
+       [IPROC_PCIE_CFG_IND_DATA]     = 0x124,
+       [IPROC_PCIE_CFG_ADDR]         = 0x1f8,
+       [IPROC_PCIE_CFG_DATA]         = 0x1fc,
+       [IPROC_PCIE_INTX_EN]          = 0x330,
+       [IPROC_PCIE_LINK_STATUS]      = 0xf0c,
+};
+
 /* iProc PCIe PAXB registers */
 static const u16 iproc_pcie_reg_paxb[] = {
        [IPROC_PCIE_CLK_CTRL]     = 0x000,
@@ -469,6 +480,9 @@ static int iproc_pcie_rev_init(struct iproc_pcie *pcie)
        const u16 *regs;
 
        switch (pcie->type) {
+       case IPROC_PCIE_PAXB_BCMA:
+               regs = iproc_pcie_reg_paxb_bcma;
+               break;
        case IPROC_PCIE_PAXB:
                regs = iproc_pcie_reg_paxb;
                break;
index 83643d55383d4570f790b85588bd77697a278f8c..768be05cf4965361ebe9f571fefcf509aeb990d2 100644 (file)
@@ -24,7 +24,8 @@
  * endpoint devices.
  */
 enum iproc_pcie_type {
-       IPROC_PCIE_PAXB = 0,
+       IPROC_PCIE_PAXB_BCMA = 0,
+       IPROC_PCIE_PAXB,
        IPROC_PCIE_PAXC,
 };