PCI: tegra: Disable LTSSM during L2 entry
PCIe cards like Marvell SATA controller and some of the Samsung NVMe drives don't support taking the link to L2 state. When the link doesn't go to L2 state, Tegra194 requires the LTSSM to be disabled to allow PHY to start the next link up process cleanly during suspend/resume sequence. Failing to disable LTSSM results in the PCIe link not coming up in the next resume cycle. Link: https://lore.kernel.org/r/20201203133451.17716-6-vidyas@nvidia.com Tested-by: Thierry Reding <treding@nvidia.com> Signed-off-by: Vidya Sagar <vidyas@nvidia.com> Signed-off-by: Lorenzo Pieralisi <lorenzo.pieralisi@arm.com> Acked-by: Thierry Reding <treding@nvidia.com>
This commit is contained in:
Родитель
3d710af75b
Коммит
cf68e3b7a6
|
@ -1506,6 +1506,14 @@ static void tegra_pcie_dw_pme_turnoff(struct tegra_pcie_dw *pcie)
|
||||||
data &= ~APPL_PINMUX_PEX_RST;
|
data &= ~APPL_PINMUX_PEX_RST;
|
||||||
appl_writel(pcie, data, APPL_PINMUX);
|
appl_writel(pcie, data, APPL_PINMUX);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Some cards do not go to detect state even after de-asserting
|
||||||
|
* PERST#. So, de-assert LTSSM to bring link to detect state.
|
||||||
|
*/
|
||||||
|
data = readl(pcie->appl_base + APPL_CTRL);
|
||||||
|
data &= ~APPL_CTRL_LTSSM_EN;
|
||||||
|
writel(data, pcie->appl_base + APPL_CTRL);
|
||||||
|
|
||||||
err = readl_poll_timeout_atomic(pcie->appl_base + APPL_DEBUG,
|
err = readl_poll_timeout_atomic(pcie->appl_base + APPL_DEBUG,
|
||||||
data,
|
data,
|
||||||
((data &
|
((data &
|
||||||
|
@ -1513,14 +1521,8 @@ static void tegra_pcie_dw_pme_turnoff(struct tegra_pcie_dw *pcie)
|
||||||
APPL_DEBUG_LTSSM_STATE_SHIFT) ==
|
APPL_DEBUG_LTSSM_STATE_SHIFT) ==
|
||||||
LTSSM_STATE_PRE_DETECT,
|
LTSSM_STATE_PRE_DETECT,
|
||||||
1, LTSSM_TIMEOUT);
|
1, LTSSM_TIMEOUT);
|
||||||
if (err) {
|
if (err)
|
||||||
dev_info(pcie->dev, "Link didn't go to detect state\n");
|
dev_info(pcie->dev, "Link didn't go to detect state\n");
|
||||||
} else {
|
|
||||||
/* Disable LTSSM after link is in detect state */
|
|
||||||
data = appl_readl(pcie, APPL_CTRL);
|
|
||||||
data &= ~APPL_CTRL_LTSSM_EN;
|
|
||||||
appl_writel(pcie, data, APPL_CTRL);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
/*
|
/*
|
||||||
* DBI registers may not be accessible after this as PLL-E would be
|
* DBI registers may not be accessible after this as PLL-E would be
|
||||||
|
|
Загрузка…
Ссылка в новой задаче