mirror of
https://mirrors.bfsu.edu.cn/git/linux.git
synced 2024-11-11 21:38:32 +08:00
clk: tegra: Optimize PLLX restore on Tegra20/30
There is no need to re-configure PLLX if its configuration in unchanged on return from suspend / cpuidle, this saves 300us if PLLX is already enabled (common case for cpuidle). Signed-off-by: Dmitry Osipenko <digetx@gmail.com> Acked-by: Peter De Schrijver <pdeschrijver@nvidia.com> Signed-off-by: Thierry Reding <treding@nvidia.com>
This commit is contained in:
parent
535f296d47
commit
204ce75b89
@ -955,6 +955,7 @@ static void tegra20_cpu_clock_suspend(void)
|
||||
static void tegra20_cpu_clock_resume(void)
|
||||
{
|
||||
unsigned int reg, policy;
|
||||
u32 misc, base;
|
||||
|
||||
/* Is CPU complex already running on PLLX? */
|
||||
reg = readl(clk_base + CCLK_BURST_POLICY);
|
||||
@ -968,15 +969,21 @@ static void tegra20_cpu_clock_resume(void)
|
||||
BUG();
|
||||
|
||||
if (reg != CCLK_BURST_POLICY_PLLX) {
|
||||
/* restore PLLX settings if CPU is on different PLL */
|
||||
writel(tegra20_cpu_clk_sctx.pllx_misc,
|
||||
clk_base + PLLX_MISC);
|
||||
writel(tegra20_cpu_clk_sctx.pllx_base,
|
||||
clk_base + PLLX_BASE);
|
||||
misc = readl_relaxed(clk_base + PLLX_MISC);
|
||||
base = readl_relaxed(clk_base + PLLX_BASE);
|
||||
|
||||
/* wait for PLL stabilization if PLLX was enabled */
|
||||
if (tegra20_cpu_clk_sctx.pllx_base & (1 << 30))
|
||||
udelay(300);
|
||||
if (misc != tegra20_cpu_clk_sctx.pllx_misc ||
|
||||
base != tegra20_cpu_clk_sctx.pllx_base) {
|
||||
/* restore PLLX settings if CPU is on different PLL */
|
||||
writel(tegra20_cpu_clk_sctx.pllx_misc,
|
||||
clk_base + PLLX_MISC);
|
||||
writel(tegra20_cpu_clk_sctx.pllx_base,
|
||||
clk_base + PLLX_BASE);
|
||||
|
||||
/* wait for PLL stabilization if PLLX was enabled */
|
||||
if (tegra20_cpu_clk_sctx.pllx_base & (1 << 30))
|
||||
udelay(300);
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
|
@ -1163,6 +1163,7 @@ static void tegra30_cpu_clock_suspend(void)
|
||||
static void tegra30_cpu_clock_resume(void)
|
||||
{
|
||||
unsigned int reg, policy;
|
||||
u32 misc, base;
|
||||
|
||||
/* Is CPU complex already running on PLLX? */
|
||||
reg = readl(clk_base + CLK_RESET_CCLK_BURST);
|
||||
@ -1176,15 +1177,21 @@ static void tegra30_cpu_clock_resume(void)
|
||||
BUG();
|
||||
|
||||
if (reg != CLK_RESET_CCLK_BURST_POLICY_PLLX) {
|
||||
/* restore PLLX settings if CPU is on different PLL */
|
||||
writel(tegra30_cpu_clk_sctx.pllx_misc,
|
||||
clk_base + CLK_RESET_PLLX_MISC);
|
||||
writel(tegra30_cpu_clk_sctx.pllx_base,
|
||||
clk_base + CLK_RESET_PLLX_BASE);
|
||||
misc = readl_relaxed(clk_base + CLK_RESET_PLLX_MISC);
|
||||
base = readl_relaxed(clk_base + CLK_RESET_PLLX_BASE);
|
||||
|
||||
/* wait for PLL stabilization if PLLX was enabled */
|
||||
if (tegra30_cpu_clk_sctx.pllx_base & (1 << 30))
|
||||
udelay(300);
|
||||
if (misc != tegra30_cpu_clk_sctx.pllx_misc ||
|
||||
base != tegra30_cpu_clk_sctx.pllx_base) {
|
||||
/* restore PLLX settings if CPU is on different PLL */
|
||||
writel(tegra30_cpu_clk_sctx.pllx_misc,
|
||||
clk_base + CLK_RESET_PLLX_MISC);
|
||||
writel(tegra30_cpu_clk_sctx.pllx_base,
|
||||
clk_base + CLK_RESET_PLLX_BASE);
|
||||
|
||||
/* wait for PLL stabilization if PLLX was enabled */
|
||||
if (tegra30_cpu_clk_sctx.pllx_base & (1 << 30))
|
||||
udelay(300);
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
|
Loading…
Reference in New Issue
Block a user