Skip to content

Commit

Permalink
arm/tegra: add timeout to PCIe PLL lock detection loop
Browse files Browse the repository at this point in the history
Tegra PCIe driver waits for PLL to lock using busy loop.
If PLL fails to lock for some reason, this leads to silent lockup
while booting (as PCIe code is not modular).

Fix by adding timeout, so if PLL doesn't lock in a couple
of seconds, just PCIe driver fails and machine continues to boot.

Signed-off-by: Dmitry Artamonow <mad_soft@inbox.ru>
Acked-by: Stephen Warren <swarren@wwwdotorg.org>
Signed-off-by: Olof Johansson <olof@lixom.net>
  • Loading branch information
Dmitry Artamonow authored and Olof Johansson committed Mar 7, 2012
1 parent 448b980 commit 795d5fd
Showing 1 changed file with 11 additions and 3 deletions.
14 changes: 11 additions & 3 deletions arch/arm/mach-tegra/pcie.c
Original file line number Diff line number Diff line change
Expand Up @@ -585,10 +585,10 @@ static void tegra_pcie_setup_translations(void)
afi_writel(0, AFI_MSI_BAR_SZ);
}

static void tegra_pcie_enable_controller(void)
static int tegra_pcie_enable_controller(void)
{
u32 val, reg;
int i;
int i, timeout;

/* Enable slot clock and pulse the reset signals */
for (i = 0, reg = AFI_PEX0_CTRL; i < 2; i++, reg += 0x8) {
Expand Down Expand Up @@ -639,8 +639,14 @@ static void tegra_pcie_enable_controller(void)
pads_writel(0xfa5cfa5c, 0xc8);

/* Wait for the PLL to lock */
timeout = 2000;
do {
val = pads_readl(PADS_PLL_CTL);
mdelay(1);
if (--timeout == 0) {
pr_err("Tegra PCIe error: timeout waiting for PLL\n");
return -EBUSY;
}
} while (!(val & PADS_PLL_CTL_LOCKDET));

/* turn off IDDQ override */
Expand Down Expand Up @@ -921,7 +927,9 @@ int __init tegra_pcie_init(bool init_port0, bool init_port1)
if (err)
return err;

tegra_pcie_enable_controller();
err = tegra_pcie_enable_controller();
if (err)
return err;

/* setup the AFI address translations */
tegra_pcie_setup_translations();
Expand Down

0 comments on commit 795d5fd

Please sign in to comment.