static const struct of_device_id artpec6_pcie_of_match[];
 
-/* PCIe Port Logic registers (memory-mapped) */
-#define PL_OFFSET                      0x700
-
-#define ACK_F_ASPM_CTRL_OFF            (PL_OFFSET + 0xc)
-#define ACK_N_FTS_MASK                 GENMASK(15, 8)
-#define ACK_N_FTS(x)                   (((x) << 8) & ACK_N_FTS_MASK)
-
 /* ARTPEC-6 specific registers */
 #define PCIECFG                                0x18
 #define  PCIECFG_DBG_OEN               BIT(24)
        }
 }
 
-static void artpec6_pcie_set_nfts(struct artpec6_pcie *artpec6_pcie)
-{
-       struct dw_pcie *pci = artpec6_pcie->pci;
-       u32 val;
-
-       if (artpec6_pcie->variant != ARTPEC7)
-               return;
-
-       /*
-        * Increase the N_FTS (Number of Fast Training Sequences)
-        * to be transmitted when transitioning from L0s to L0.
-        */
-       val = dw_pcie_readl_dbi(pci, ACK_F_ASPM_CTRL_OFF);
-       val &= ~ACK_N_FTS_MASK;
-       val |= ACK_N_FTS(180);
-       dw_pcie_writel_dbi(pci, ACK_F_ASPM_CTRL_OFF, val);
-
-       /*
-        * Set the Number of Fast Training Sequences that the core
-        * advertises as its N_FTS during Gen2 or Gen3 link training.
-        */
-       dw_pcie_link_set_n_fts(pci, 180);
-}
-
 static void artpec6_pcie_assert_core_reset(struct artpec6_pcie *artpec6_pcie)
 {
        u32 val;
        struct dw_pcie *pci = to_dw_pcie_from_pp(pp);
        struct artpec6_pcie *artpec6_pcie = to_artpec6_pcie(pci);
 
+       if (artpec6_pcie->variant == ARTPEC7) {
+               pci->n_fts[0] = 180;
+               pci->n_fts[1] = 180;
+       }
        artpec6_pcie_assert_core_reset(artpec6_pcie);
        artpec6_pcie_init_phy(artpec6_pcie);
        artpec6_pcie_deassert_core_reset(artpec6_pcie);
        artpec6_pcie_wait_for_phy(artpec6_pcie);
-       artpec6_pcie_set_nfts(artpec6_pcie);
        dw_pcie_setup_rc(pp);
        artpec6_pcie_establish_link(pci);
        dw_pcie_wait_for_link(pci);
        artpec6_pcie_init_phy(artpec6_pcie);
        artpec6_pcie_deassert_core_reset(artpec6_pcie);
        artpec6_pcie_wait_for_phy(artpec6_pcie);
-       artpec6_pcie_set_nfts(artpec6_pcie);
 
        for (bar = 0; bar < PCI_STD_NUM_BARS; bar++)
                dw_pcie_ep_reset_bar(pci, bar);
 
 
 }
 
-void dw_pcie_link_set_n_fts(struct dw_pcie *pci, u32 n_fts)
-{
-       u32 val;
-
-       val = dw_pcie_readl_dbi(pci, PCIE_LINK_WIDTH_SPEED_CONTROL);
-       val &= ~PORT_LOGIC_N_FTS_MASK;
-       val |= n_fts & PORT_LOGIC_N_FTS_MASK;
-       dw_pcie_writel_dbi(pci, PCIE_LINK_WIDTH_SPEED_CONTROL, val);
-}
-EXPORT_SYMBOL_GPL(dw_pcie_link_set_n_fts);
-
 static u8 dw_pcie_iatu_unroll_enabled(struct dw_pcie *pci)
 {
        u32 val;
        if (pci->link_gen > 0)
                dw_pcie_link_set_max_speed(pci, pci->link_gen);
 
+       /* Configure Gen1 N_FTS */
+       if (pci->n_fts[0]) {
+               val = dw_pcie_readl_dbi(pci, PCIE_PORT_AFR);
+               val &= ~(PORT_AFR_N_FTS_MASK | PORT_AFR_CC_N_FTS_MASK);
+               val |= PORT_AFR_N_FTS(pci->n_fts[0]);
+               val |= PORT_AFR_CC_N_FTS(pci->n_fts[0]);
+               dw_pcie_writel_dbi(pci, PCIE_PORT_AFR, val);
+       }
+
+       /* Configure Gen2+ N_FTS */
+       if (pci->n_fts[1]) {
+               val = dw_pcie_readl_dbi(pci, PCIE_LINK_WIDTH_SPEED_CONTROL);
+               val &= ~PORT_LOGIC_N_FTS_MASK;
+               val |= pci->n_fts[pci->link_gen - 1];
+               dw_pcie_writel_dbi(pci, PCIE_LINK_WIDTH_SPEED_CONTROL, val);
+       }
+
        val = dw_pcie_readl_dbi(pci, PCIE_PORT_LINK_CONTROL);
        val &= ~PORT_LINK_FAST_LINK_MODE;
        val |= PORT_LINK_DLL_LINK_EN;
 
 #define PORT_AFR_N_FTS_MASK            GENMASK(15, 8)
 #define PORT_AFR_N_FTS(n)              FIELD_PREP(PORT_AFR_N_FTS_MASK, n)
 #define PORT_AFR_CC_N_FTS_MASK         GENMASK(23, 16)
+#define PORT_AFR_CC_N_FTS(n)           FIELD_PREP(PORT_AFR_CC_N_FTS_MASK, n)
 #define PORT_AFR_ENTER_ASPM            BIT(30)
 #define PORT_AFR_L0S_ENTRANCE_LAT_SHIFT        24
 #define PORT_AFR_L0S_ENTRANCE_LAT_MASK GENMASK(26, 24)
        unsigned int            version;
        int                     num_lanes;
        int                     link_gen;
+       u8                      n_fts[2];
 };
 
 #define to_dw_pcie_from_pp(port) container_of((port), struct dw_pcie, pp)
 void dw_pcie_write_dbi2(struct dw_pcie *pci, u32 reg, size_t size, u32 val);
 int dw_pcie_link_up(struct dw_pcie *pci);
 void dw_pcie_upconfig_setup(struct dw_pcie *pci);
-void dw_pcie_link_set_n_fts(struct dw_pcie *pci, u32 n_fts);
 int dw_pcie_wait_for_link(struct dw_pcie *pci);
 void dw_pcie_prog_outbound_atu(struct dw_pcie *pci, int index,
                               int type, u64 cpu_addr, u64 pci_addr,
 
        void __iomem            *app_base;
        struct gpio_desc        *reset_gpio;
        u32                     rst_intrvl;
-       u32                     n_fts;
        struct clk              *core_clk;
        struct reset_control    *core_rst;
        struct phy              *phy;
        pcie_rc_cfg_wr(lpp, offset + PCI_EXP_LNKCTL, val);
 }
 
-static void intel_pcie_port_logic_setup(struct intel_pcie_port *lpp)
+static void intel_pcie_init_n_fts(struct dw_pcie *pci)
 {
-       u32 val, mask;
-       struct dw_pcie *pci = &lpp->pci;
-
-       switch (pcie_link_speed[pci->link_gen]) {
-       case PCIE_SPEED_8_0GT:
-               lpp->n_fts = PORT_AFR_N_FTS_GEN3;
+       switch (pci->link_gen) {
+       case 3:
+               pci->n_fts[1] = PORT_AFR_N_FTS_GEN3;
                break;
-       case PCIE_SPEED_16_0GT:
-               lpp->n_fts = PORT_AFR_N_FTS_GEN4;
+       case 4:
+               pci->n_fts[1] = PORT_AFR_N_FTS_GEN4;
                break;
        default:
-               lpp->n_fts = PORT_AFR_N_FTS_GEN12_DFT;
+               pci->n_fts[1] = PORT_AFR_N_FTS_GEN12_DFT;
                break;
        }
-
-       mask = PORT_AFR_N_FTS_MASK | PORT_AFR_CC_N_FTS_MASK;
-       val = FIELD_PREP(PORT_AFR_N_FTS_MASK, lpp->n_fts) |
-              FIELD_PREP(PORT_AFR_CC_N_FTS_MASK, lpp->n_fts);
-       pcie_rc_cfg_wr_mask(lpp, PCIE_PORT_AFR, mask, val);
+       pci->n_fts[0] = PORT_AFR_N_FTS_GEN12_DFT;
 }
 
 static void intel_pcie_rc_setup(struct intel_pcie_port *lpp)
 {
        intel_pcie_ltssm_disable(lpp);
        intel_pcie_link_setup(lpp);
+       intel_pcie_init_n_fts(&lpp->pci);
        dw_pcie_setup_rc(&lpp->pci.pp);
        dw_pcie_upconfig_setup(&lpp->pci);
-       intel_pcie_port_logic_setup(lpp);
-       dw_pcie_link_set_n_fts(&lpp->pci, lpp->n_fts);
 }
 
 static int intel_pcie_ep_rst_init(struct intel_pcie_port *lpp)
 
 
        dw_pcie_writel_dbi(pci, PCI_BASE_ADDRESS_0, 0);
 
-       /* Configure FTS */
-       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, PCIE_LINK_WIDTH_SPEED_CONTROL);
-       val &= ~PORT_LOGIC_N_FTS_MASK;
-       val |= FTS_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);
        val &= ~(AMBA_ERROR_RESPONSE_CRS_MASK << AMBA_ERROR_RESPONSE_CRS_SHIFT);
        val &= ~GEN3_RELATED_OFF_GEN3_ZRXDC_NONCOMPL;
        dw_pcie_writel_dbi(pci, GEN3_RELATED_OFF, val);
 
-       /* Configure N_FTS & FTS */
-       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, PCIE_LINK_WIDTH_SPEED_CONTROL);
-       val &= ~PORT_LOGIC_N_FTS_MASK;
-       val |= FTS_VAL;
-       dw_pcie_writel_dbi(pci, PCIE_LINK_WIDTH_SPEED_CONTROL, val);
-
        pcie->pcie_cap_base = dw_pcie_find_capability(&pcie->pci,
                                                      PCI_CAP_ID_EXP);
        clk_set_rate(pcie->core_clk, GEN4_CORE_CLK_FREQ);
        pci = &pcie->pci;
        pci->dev = &pdev->dev;
        pci->ops = &tegra_dw_pcie_ops;
+       pci->n_fts[0] = N_FTS_VAL;
+       pci->n_fts[1] = FTS_VAL;
+
        pp = &pci->pp;
        pcie->dev = &pdev->dev;
        pcie->mode = (enum dw_pcie_device_mode)data->mode;