diff --git a/drivers/amlogic/pci/pcie-amlogic-v2.c b/drivers/amlogic/pci/pcie-amlogic-v2.c index 530beabfa8e6..527ed2843b49 100644 --- a/drivers/amlogic/pci/pcie-amlogic-v2.c +++ b/drivers/amlogic/pci/pcie-amlogic-v2.c @@ -554,8 +554,16 @@ static int amlogic_pcie_link_up(struct pcie_port *pp) u32 speed_okay = 0; u32 current_data_rate; int cnt = 0; + u32 val = 0; + u32 linkup = 0; struct amlogic_pcie *amlogic_pcie = to_amlogic_pcie(pp); + val = readl(pp->dbi_base + PCIE_PHY_DEBUG_R1); + linkup = ((val & PCIE_PHY_DEBUG_R1_LINK_UP) && + (!(val & PCIE_PHY_DEBUG_R1_LINK_IN_TRAINING))); + if (linkup) + return linkup; + while (smlh_up == 0 || rdlh_up == 0 || ltssm_up == 0 || speed_okay == 0) { udelay(20); diff --git a/drivers/amlogic/pci/pcie-amlogic.c b/drivers/amlogic/pci/pcie-amlogic.c index 2ac3b05309f6..9a5362f2d5ea 100644 --- a/drivers/amlogic/pci/pcie-amlogic.c +++ b/drivers/amlogic/pci/pcie-amlogic.c @@ -514,8 +514,16 @@ int amlogic_pcie_link_up(struct pcie_port *pp) u32 speed_okay = 0; u32 current_data_rate; int cnt = 0; + u32 val = 0; + u32 linkup = 0; struct amlogic_pcie *amlogic_pcie = to_amlogic_pcie(pp); + val = readl(pp->dbi_base + PCIE_PHY_DEBUG_R1); + linkup = ((val & PCIE_PHY_DEBUG_R1_LINK_UP) && + (!(val & PCIE_PHY_DEBUG_R1_LINK_IN_TRAINING))); + if (linkup) + return linkup; + while (smlh_up == 0 || rdlh_up == 0 || ltssm_up == 0 || speed_okay == 0) { udelay(20); diff --git a/drivers/amlogic/pci/pcie-amlogic.h b/drivers/amlogic/pci/pcie-amlogic.h index af537f0aea33..d3fca8199e3a 100644 --- a/drivers/amlogic/pci/pcie-amlogic.h +++ b/drivers/amlogic/pci/pcie-amlogic.h @@ -33,6 +33,12 @@ #define PCIE_CFG_STATUS12 0x30 #define PCIE_CFG_STATUS17 0x44 +/* PCIe Port Logic registers */ +#define PLR_OFFSET 0x700 +#define PCIE_PHY_DEBUG_R1 (PLR_OFFSET + 0x2c) +#define PCIE_PHY_DEBUG_R1_LINK_UP (0x1 << 4) +#define PCIE_PHY_DEBUG_R1_LINK_IN_TRAINING (0x1 << 29) + #define WAIT_LINKUP_TIMEOUT 2000 enum pcie_data_rate {