PCI: dwc/tegra: Use common Designware port logic register definitions
[linux-2.6-microblaze.git] / drivers / pci / controller / dwc / pcie-tegra194.c
index 7049868..f121ac2 100644 (file)
 #define EVENT_COUNTER_GROUP_SEL_SHIFT  24
 #define EVENT_COUNTER_GROUP_5          0x5
 
-#define PORT_LOGIC_ACK_F_ASPM_CTRL                     0x70C
-#define ENTER_ASPM                                     BIT(30)
-#define L0S_ENTRANCE_LAT_SHIFT                         24
-#define L0S_ENTRANCE_LAT_MASK                          GENMASK(26, 24)
-#define L1_ENTRANCE_LAT_SHIFT                          27
-#define L1_ENTRANCE_LAT_MASK                           GENMASK(29, 27)
-#define N_FTS_SHIFT                                    8
-#define N_FTS_MASK                                     GENMASK(7, 0)
 #define N_FTS_VAL                                      52
-
-#define PORT_LOGIC_GEN2_CTRL                           0x80C
-#define PORT_LOGIC_GEN2_CTRL_DIRECT_SPEED_CHANGE       BIT(17)
-#define FTS_MASK                                       GENMASK(7, 0)
 #define FTS_VAL                                                52
 
 #define PORT_LOGIC_MSI_CTRL_INT_0_EN           0x828
@@ -401,9 +389,9 @@ static irqreturn_t tegra_pcie_rp_irq_handler(int irq, void *arg)
                        val |= APPL_CAR_RESET_OVRD_CYA_OVERRIDE_CORE_RST_N;
                        appl_writel(pcie, val, APPL_CAR_RESET_OVRD);
 
-                       val = dw_pcie_readl_dbi(pci, PORT_LOGIC_GEN2_CTRL);
-                       val |= PORT_LOGIC_GEN2_CTRL_DIRECT_SPEED_CHANGE;
-                       dw_pcie_writel_dbi(pci, PORT_LOGIC_GEN2_CTRL, val);
+                       val = dw_pcie_readl_dbi(pci, PCIE_LINK_WIDTH_SPEED_CONTROL);
+                       val |= PORT_LOGIC_SPEED_CHANGE;
+                       dw_pcie_writel_dbi(pci, PCIE_LINK_WIDTH_SPEED_CONTROL, val);
                }
        }
 
@@ -568,42 +556,44 @@ static irqreturn_t tegra_pcie_ep_hard_irq(int irq, void *arg)
        return IRQ_HANDLED;
 }
 
-static int tegra_pcie_dw_rd_own_conf(struct pcie_port *pp, int where, int size,
-                                    u32 *val)
+static int tegra_pcie_dw_rd_own_conf(struct pci_bus *bus, u32 devfn, int where,
+                                    int size, u32 *val)
 {
-       struct dw_pcie *pci = to_dw_pcie_from_pp(pp);
-
        /*
         * This is an endpoint mode specific register happen to appear even
         * when controller is operating in root port mode and system hangs
         * when it is accessed with link being in ASPM-L1 state.
         * So skip accessing it altogether
         */
-       if (where == PORT_LOGIC_MSIX_DOORBELL) {
+       if (!PCI_SLOT(devfn) && where == PORT_LOGIC_MSIX_DOORBELL) {
                *val = 0x00000000;
                return PCIBIOS_SUCCESSFUL;
        }
 
-       return dw_pcie_read(pci->dbi_base + where, size, val);
+       return pci_generic_config_read(bus, devfn, where, size, val);
 }
 
-static int tegra_pcie_dw_wr_own_conf(struct pcie_port *pp, int where, int size,
-                                    u32 val)
+static int tegra_pcie_dw_wr_own_conf(struct pci_bus *bus, u32 devfn, int where,
+                                    int size, u32 val)
 {
-       struct dw_pcie *pci = to_dw_pcie_from_pp(pp);
-
        /*
         * This is an endpoint mode specific register happen to appear even
         * when controller is operating in root port mode and system hangs
         * when it is accessed with link being in ASPM-L1 state.
         * So skip accessing it altogether
         */
-       if (where == PORT_LOGIC_MSIX_DOORBELL)
+       if (!PCI_SLOT(devfn) && where == PORT_LOGIC_MSIX_DOORBELL)
                return PCIBIOS_SUCCESSFUL;
 
-       return dw_pcie_write(pci->dbi_base + where, size, val);
+       return pci_generic_config_write(bus, devfn, where, size, val);
 }
 
+static struct pci_ops tegra_pci_ops = {
+       .map_bus = dw_pcie_own_conf_map_bus,
+       .read = tegra_pcie_dw_rd_own_conf,
+       .write = tegra_pcie_dw_wr_own_conf,
+};
+
 #if defined(CONFIG_PCIEASPM)
 static void disable_aspm_l11(struct tegra_pcie_dw *pcie)
 {
@@ -692,11 +682,11 @@ static void init_host_aspm(struct tegra_pcie_dw *pcie)
        dw_pcie_writel_dbi(pci, pcie->cfg_link_cap_l1sub, val);
 
        /* Program L0s and L1 entrance latencies */
-       val = dw_pcie_readl_dbi(pci, PORT_LOGIC_ACK_F_ASPM_CTRL);
-       val &= ~L0S_ENTRANCE_LAT_MASK;
-       val |= (pcie->aspm_l0s_enter_lat << L0S_ENTRANCE_LAT_SHIFT);
-       val |= ENTER_ASPM;
-       dw_pcie_writel_dbi(pci, PORT_LOGIC_ACK_F_ASPM_CTRL, val);
+       val = dw_pcie_readl_dbi(pci, PCIE_PORT_AFR);
+       val &= ~PORT_AFR_L0S_ENTRANCE_LAT_MASK;
+       val |= (pcie->aspm_l0s_enter_lat << PORT_AFR_L0S_ENTRANCE_LAT_SHIFT);
+       val |= PORT_AFR_ENTER_ASPM;
+       dw_pcie_writel_dbi(pci, PCIE_PORT_AFR, val);
 }
 
 static int init_debugfs(struct tegra_pcie_dw *pcie)
@@ -893,15 +883,15 @@ static void tegra_pcie_prepare_host(struct pcie_port *pp)
        dw_pcie_writel_dbi(pci, PCI_BASE_ADDRESS_0, 0);
 
        /* Configure FTS */
-       val = dw_pcie_readl_dbi(pci, PORT_LOGIC_ACK_F_ASPM_CTRL);
-       val &= ~(N_FTS_MASK << N_FTS_SHIFT);
-       val |= N_FTS_VAL << N_FTS_SHIFT;
-       dw_pcie_writel_dbi(pci, PORT_LOGIC_ACK_F_ASPM_CTRL, val);
+       val = dw_pcie_readl_dbi(pci, PCIE_PORT_AFR);
+       val &= ~PORT_AFR_N_FTS_MASK;
+       val |= PORT_AFR_N_FTS(N_FTS_VAL);
+       dw_pcie_writel_dbi(pci, PCIE_PORT_AFR, val);
 
-       val = dw_pcie_readl_dbi(pci, PORT_LOGIC_GEN2_CTRL);
-       val &= ~FTS_MASK;
+       val = dw_pcie_readl_dbi(pci, PCIE_LINK_WIDTH_SPEED_CONTROL);
+       val &= ~PORT_LOGIC_N_FTS_MASK;
        val |= FTS_VAL;
-       dw_pcie_writel_dbi(pci, PORT_LOGIC_GEN2_CTRL, val);
+       dw_pcie_writel_dbi(pci, PCIE_LINK_WIDTH_SPEED_CONTROL, val);
 
        /* Enable as 0xFFFF0001 response for CRS */
        val = dw_pcie_readl_dbi(pci, PORT_LOGIC_AMBA_ERROR_RESPONSE_DEFAULT);
@@ -970,6 +960,8 @@ static int tegra_pcie_dw_host_init(struct pcie_port *pp)
        struct tegra_pcie_dw *pcie = to_tegra_pcie(pci);
        u32 val, tmp, offset, speed;
 
+       pp->bridge->ops = &tegra_pci_ops;
+
        tegra_pcie_prepare_host(pp);
 
        if (dw_pcie_wait_for_link(pci)) {
@@ -1057,8 +1049,6 @@ static const struct dw_pcie_ops tegra_dw_pcie_ops = {
 };
 
 static struct dw_pcie_host_ops tegra_pcie_dw_host_ops = {
-       .rd_own_conf = tegra_pcie_dw_rd_own_conf,
-       .wr_own_conf = tegra_pcie_dw_wr_own_conf,
        .host_init = tegra_pcie_dw_host_init,
        .set_num_vectors = tegra_pcie_set_msi_vec_num,
 };
@@ -1262,9 +1252,9 @@ static void tegra_pcie_downstream_dev_to_D0(struct tegra_pcie_dw *pcie)
         * 5.2 Link State Power Management (Page #428).
         */
 
-       list_for_each_entry(child, &pp->root_bus->children, node) {
+       list_for_each_entry(child, &pp->bridge->bus->children, node) {
                /* Bring downstream devices to D0 if they are not already in */
-               if (child->parent == pp->root_bus) {
+               if (child->parent == pp->bridge->bus) {
                        root_bus = child;
                        break;
                }
@@ -1818,15 +1808,15 @@ static void pex_ep_event_pex_rst_deassert(struct tegra_pcie_dw *pcie)
        dw_pcie_writel_dbi(pci, GEN3_RELATED_OFF, val);
 
        /* Configure N_FTS & FTS */
-       val = dw_pcie_readl_dbi(pci, PORT_LOGIC_ACK_F_ASPM_CTRL);
-       val &= ~(N_FTS_MASK << N_FTS_SHIFT);
-       val |= N_FTS_VAL << N_FTS_SHIFT;
-       dw_pcie_writel_dbi(pci, PORT_LOGIC_ACK_F_ASPM_CTRL, val);
+       val = dw_pcie_readl_dbi(pci, PCIE_PORT_AFR);
+       val &= ~PORT_AFR_N_FTS_MASK;
+       val |= PORT_AFR_N_FTS(FTS_VAL);
+       dw_pcie_writel_dbi(pci, PCIE_PORT_AFR, val);
 
-       val = dw_pcie_readl_dbi(pci, PORT_LOGIC_GEN2_CTRL);
-       val &= ~FTS_MASK;
+       val = dw_pcie_readl_dbi(pci, PCIE_LINK_WIDTH_SPEED_CONTROL);
+       val &= ~PORT_LOGIC_N_FTS_MASK;
        val |= FTS_VAL;
-       dw_pcie_writel_dbi(pci, PORT_LOGIC_GEN2_CTRL, val);
+       dw_pcie_writel_dbi(pci, PCIE_LINK_WIDTH_SPEED_CONTROL, val);
 
        /* Configure Max Speed from DT */
        if (pcie->max_speed && pcie->max_speed != -EINVAL) {