struct gpio_desc *pex_refclk_sel_gpiod;
        unsigned int pex_rst_irq;
        int ep_state;
+       long link_status;
 };
 
 static inline struct tegra_pcie_dw *to_tegra_pcie(struct dw_pcie *pci)
 static irqreturn_t tegra_pcie_ep_irq_thread(int irq, void *arg)
 {
        struct tegra_pcie_dw *pcie = arg;
+       struct dw_pcie_ep *ep = &pcie->pci.ep;
        struct dw_pcie *pci = &pcie->pci;
        u32 val, speed;
 
+       if (test_and_clear_bit(0, &pcie->link_status))
+               dw_pcie_ep_linkup(ep);
+
        speed = dw_pcie_readw_dbi(pci, pcie->pcie_cap_base + PCI_EXP_LNKSTA) &
                PCI_EXP_LNKSTA_CLS;
        clk_set_rate(pcie->core_clk, pcie_gen_freq[speed - 1]);
 static irqreturn_t tegra_pcie_ep_hard_irq(int irq, void *arg)
 {
        struct tegra_pcie_dw *pcie = arg;
-       struct dw_pcie_ep *ep = &pcie->pci.ep;
        int spurious = 1;
        u32 status_l0, status_l1, link_status;
 
                        link_status = appl_readl(pcie, APPL_LINK_STATUS);
                        if (link_status & APPL_LINK_STATUS_RDLH_LINK_UP) {
                                dev_dbg(pcie->dev, "Link is up with Host\n");
-                               dw_pcie_ep_linkup(ep);
+                               set_bit(0, &pcie->link_status);
+                               return IRQ_WAKE_THREAD;
                        }
                }