@@ -853,12 +853,14 @@ static void config_gen3_gen4_eq_presets(struct tegra_pcie_dw *pcie)
853853 dw_pcie_writel_dbi (pci , GEN3_RELATED_OFF , val );
854854}
855855
856- static void tegra_pcie_prepare_host (struct pcie_port * pp )
856+ static int tegra_pcie_dw_host_init (struct pcie_port * pp )
857857{
858858 struct dw_pcie * pci = to_dw_pcie_from_pp (pp );
859859 struct tegra_pcie_dw * pcie = to_tegra_pcie (pci );
860860 u32 val ;
861861
862+ pp -> bridge -> ops = & tegra_pci_ops ;
863+
862864 if (!pcie -> pcie_cap_base )
863865 pcie -> pcie_cap_base = dw_pcie_find_capability (& pcie -> pci ,
864866 PCI_CAP_ID_EXP );
@@ -907,10 +909,24 @@ static void tegra_pcie_prepare_host(struct pcie_port *pp)
907909 dw_pcie_writel_dbi (pci , CFG_TIMER_CTRL_MAX_FUNC_NUM_OFF , val );
908910 }
909911
910- dw_pcie_setup_rc (pp );
911-
912912 clk_set_rate (pcie -> core_clk , GEN4_CORE_CLK_FREQ );
913913
914+ return 0 ;
915+ }
916+
917+ static int tegra_pcie_dw_start_link (struct dw_pcie * pci )
918+ {
919+ u32 val , offset , speed , tmp ;
920+ struct tegra_pcie_dw * pcie = to_tegra_pcie (pci );
921+ struct pcie_port * pp = & pci -> pp ;
922+ bool retry = true;
923+
924+ if (pcie -> mode == DW_PCIE_EP_TYPE ) {
925+ enable_irq (pcie -> pex_rst_irq );
926+ return 0 ;
927+ }
928+
929+ retry_link :
914930 /* Assert RST */
915931 val = appl_readl (pcie , APPL_PINMUX );
916932 val &= ~APPL_PINMUX_PEX_RST ;
@@ -929,19 +945,10 @@ static void tegra_pcie_prepare_host(struct pcie_port *pp)
929945 appl_writel (pcie , val , APPL_PINMUX );
930946
931947 msleep (100 );
932- }
933-
934- static int tegra_pcie_dw_host_init (struct pcie_port * pp )
935- {
936- struct dw_pcie * pci = to_dw_pcie_from_pp (pp );
937- struct tegra_pcie_dw * pcie = to_tegra_pcie (pci );
938- u32 val , tmp , offset , speed ;
939-
940- pp -> bridge -> ops = & tegra_pci_ops ;
941-
942- tegra_pcie_prepare_host (pp );
943948
944949 if (dw_pcie_wait_for_link (pci )) {
950+ if (!retry )
951+ return 0 ;
945952 /*
946953 * There are some endpoints which can't get the link up if
947954 * root port has Data Link Feature (DLF) enabled.
@@ -975,10 +982,11 @@ static int tegra_pcie_dw_host_init(struct pcie_port *pp)
975982 val &= ~PCI_DLF_EXCHANGE_ENABLE ;
976983 dw_pcie_writel_dbi (pci , offset , val );
977984
978- tegra_pcie_prepare_host (pp );
985+ tegra_pcie_dw_host_init (pp );
986+ dw_pcie_setup_rc (pp );
979987
980- if ( dw_pcie_wait_for_link ( pci ))
981- return 0 ;
988+ retry = false;
989+ goto retry_link ;
982990 }
983991
984992 speed = dw_pcie_readw_dbi (pci , pcie -> pcie_cap_base + PCI_EXP_LNKSTA ) &
@@ -998,15 +1006,6 @@ static int tegra_pcie_dw_link_up(struct dw_pcie *pci)
9981006 return !!(val & PCI_EXP_LNKSTA_DLLLA );
9991007}
10001008
1001- static int tegra_pcie_dw_start_link (struct dw_pcie * pci )
1002- {
1003- struct tegra_pcie_dw * pcie = to_tegra_pcie (pci );
1004-
1005- enable_irq (pcie -> pex_rst_irq );
1006-
1007- return 0 ;
1008- }
1009-
10101009static void tegra_pcie_dw_stop_link (struct dw_pcie * pci )
10111010{
10121011 struct tegra_pcie_dw * pcie = to_tegra_pcie (pci );
@@ -2215,6 +2214,10 @@ static int tegra_pcie_dw_resume_noirq(struct device *dev)
22152214 goto fail_host_init ;
22162215 }
22172216
2217+ ret = tegra_pcie_dw_start_link (& pcie -> pci );
2218+ if (ret < 0 )
2219+ goto fail_host_init ;
2220+
22182221 /* Restore MSI interrupt vector */
22192222 dw_pcie_writel_dbi (& pcie -> pci , PORT_LOGIC_MSI_CTRL_INT_0_EN ,
22202223 pcie -> msi_ctrl_int );
0 commit comments