diff options
-rw-r--r-- | arch/arm/mach-tegra/tegra2_clocks.c | 30 |
1 files changed, 20 insertions, 10 deletions
diff --git a/arch/arm/mach-tegra/tegra2_clocks.c b/arch/arm/mach-tegra/tegra2_clocks.c index b85d2c75fb3c..260b77c41436 100644 --- a/arch/arm/mach-tegra/tegra2_clocks.c +++ b/arch/arm/mach-tegra/tegra2_clocks.c | |||
@@ -2236,7 +2236,7 @@ void __init tegra2_init_clocks(void) | |||
2236 | 2236 | ||
2237 | #ifdef CONFIG_PM | 2237 | #ifdef CONFIG_PM |
2238 | static u32 clk_rst_suspend[RST_DEVICES_NUM + CLK_OUT_ENB_NUM + | 2238 | static u32 clk_rst_suspend[RST_DEVICES_NUM + CLK_OUT_ENB_NUM + |
2239 | PERIPH_CLK_SOURCE_NUM + 19]; | 2239 | PERIPH_CLK_SOURCE_NUM + 22]; |
2240 | 2240 | ||
2241 | void tegra_clk_suspend(void) | 2241 | void tegra_clk_suspend(void) |
2242 | { | 2242 | { |
@@ -2244,16 +2244,18 @@ void tegra_clk_suspend(void) | |||
2244 | u32 *ctx = clk_rst_suspend; | 2244 | u32 *ctx = clk_rst_suspend; |
2245 | 2245 | ||
2246 | *ctx++ = clk_readl(OSC_CTRL) & OSC_CTRL_MASK; | 2246 | *ctx++ = clk_readl(OSC_CTRL) & OSC_CTRL_MASK; |
2247 | *ctx++ = clk_readl(tegra_pll_p.reg + PLL_BASE); | ||
2248 | *ctx++ = clk_readl(tegra_pll_p.reg + PLL_MISC(&tegra_pll_p)); | ||
2249 | *ctx++ = clk_readl(tegra_pll_c.reg + PLL_BASE); | 2247 | *ctx++ = clk_readl(tegra_pll_c.reg + PLL_BASE); |
2250 | *ctx++ = clk_readl(tegra_pll_c.reg + PLL_MISC(&tegra_pll_c)); | 2248 | *ctx++ = clk_readl(tegra_pll_c.reg + PLL_MISC(&tegra_pll_c)); |
2251 | *ctx++ = clk_readl(tegra_pll_a.reg + PLL_BASE); | 2249 | *ctx++ = clk_readl(tegra_pll_a.reg + PLL_BASE); |
2252 | *ctx++ = clk_readl(tegra_pll_a.reg + PLL_MISC(&tegra_pll_a)); | 2250 | *ctx++ = clk_readl(tegra_pll_a.reg + PLL_MISC(&tegra_pll_a)); |
2251 | *ctx++ = clk_readl(tegra_pll_s.reg + PLL_BASE); | ||
2252 | *ctx++ = clk_readl(tegra_pll_s.reg + PLL_MISC(&tegra_pll_s)); | ||
2253 | *ctx++ = clk_readl(tegra_pll_d.reg + PLL_BASE); | ||
2254 | *ctx++ = clk_readl(tegra_pll_d.reg + PLL_MISC(&tegra_pll_d)); | ||
2255 | *ctx++ = clk_readl(tegra_pll_u.reg + PLL_BASE); | ||
2256 | *ctx++ = clk_readl(tegra_pll_u.reg + PLL_MISC(&tegra_pll_u)); | ||
2253 | 2257 | ||
2254 | *ctx++ = clk_readl(tegra_pll_m_out1.reg); | 2258 | *ctx++ = clk_readl(tegra_pll_m_out1.reg); |
2255 | *ctx++ = clk_readl(tegra_pll_p_out1.reg); | ||
2256 | *ctx++ = clk_readl(tegra_pll_p_out3.reg); | ||
2257 | *ctx++ = clk_readl(tegra_pll_a_out0.reg); | 2259 | *ctx++ = clk_readl(tegra_pll_a_out0.reg); |
2258 | *ctx++ = clk_readl(tegra_pll_c_out1.reg); | 2260 | *ctx++ = clk_readl(tegra_pll_c_out1.reg); |
2259 | 2261 | ||
@@ -2264,6 +2266,8 @@ void tegra_clk_suspend(void) | |||
2264 | *ctx++ = clk_readl(tegra_clk_sclk.reg + SUPER_CLK_DIVIDER); | 2266 | *ctx++ = clk_readl(tegra_clk_sclk.reg + SUPER_CLK_DIVIDER); |
2265 | *ctx++ = clk_readl(tegra_clk_pclk.reg); | 2267 | *ctx++ = clk_readl(tegra_clk_pclk.reg); |
2266 | 2268 | ||
2269 | *ctx++ = clk_readl(tegra_clk_audio.reg); | ||
2270 | |||
2267 | for (off = PERIPH_CLK_SOURCE_I2S1; off <= PERIPH_CLK_SOURCE_OSC; | 2271 | for (off = PERIPH_CLK_SOURCE_I2S1; off <= PERIPH_CLK_SOURCE_OSC; |
2268 | off += 4) { | 2272 | off += 4) { |
2269 | if (off == PERIPH_CLK_SOURCE_EMC) | 2273 | if (off == PERIPH_CLK_SOURCE_EMC) |
@@ -2281,6 +2285,8 @@ void tegra_clk_suspend(void) | |||
2281 | 2285 | ||
2282 | *ctx++ = clk_readl(MISC_CLK_ENB); | 2286 | *ctx++ = clk_readl(MISC_CLK_ENB); |
2283 | *ctx++ = clk_readl(CLK_MASK_ARM); | 2287 | *ctx++ = clk_readl(CLK_MASK_ARM); |
2288 | |||
2289 | BUG_ON(ctx - clk_rst_suspend != ARRAY_SIZE(clk_rst_suspend)); | ||
2284 | } | 2290 | } |
2285 | 2291 | ||
2286 | void tegra_clk_resume(void) | 2292 | void tegra_clk_resume(void) |
@@ -2293,17 +2299,19 @@ void tegra_clk_resume(void) | |||
2293 | val |= *ctx++; | 2299 | val |= *ctx++; |
2294 | clk_writel(val, OSC_CTRL); | 2300 | clk_writel(val, OSC_CTRL); |
2295 | 2301 | ||
2296 | clk_writel(*ctx++, tegra_pll_p.reg + PLL_BASE); | ||
2297 | clk_writel(*ctx++, tegra_pll_p.reg + PLL_MISC(&tegra_pll_p)); | ||
2298 | clk_writel(*ctx++, tegra_pll_c.reg + PLL_BASE); | 2302 | clk_writel(*ctx++, tegra_pll_c.reg + PLL_BASE); |
2299 | clk_writel(*ctx++, tegra_pll_c.reg + PLL_MISC(&tegra_pll_c)); | 2303 | clk_writel(*ctx++, tegra_pll_c.reg + PLL_MISC(&tegra_pll_c)); |
2300 | clk_writel(*ctx++, tegra_pll_a.reg + PLL_BASE); | 2304 | clk_writel(*ctx++, tegra_pll_a.reg + PLL_BASE); |
2301 | clk_writel(*ctx++, tegra_pll_a.reg + PLL_MISC(&tegra_pll_a)); | 2305 | clk_writel(*ctx++, tegra_pll_a.reg + PLL_MISC(&tegra_pll_a)); |
2302 | udelay(300); | 2306 | clk_writel(*ctx++, tegra_pll_s.reg + PLL_BASE); |
2307 | clk_writel(*ctx++, tegra_pll_s.reg + PLL_MISC(&tegra_pll_s)); | ||
2308 | clk_writel(*ctx++, tegra_pll_d.reg + PLL_BASE); | ||
2309 | clk_writel(*ctx++, tegra_pll_d.reg + PLL_MISC(&tegra_pll_d)); | ||
2310 | clk_writel(*ctx++, tegra_pll_u.reg + PLL_BASE); | ||
2311 | clk_writel(*ctx++, tegra_pll_u.reg + PLL_MISC(&tegra_pll_u)); | ||
2312 | udelay(1000); | ||
2303 | 2313 | ||
2304 | clk_writel(*ctx++, tegra_pll_m_out1.reg); | 2314 | clk_writel(*ctx++, tegra_pll_m_out1.reg); |
2305 | clk_writel(*ctx++, tegra_pll_p_out1.reg); | ||
2306 | clk_writel(*ctx++, tegra_pll_p_out3.reg); | ||
2307 | clk_writel(*ctx++, tegra_pll_a_out0.reg); | 2315 | clk_writel(*ctx++, tegra_pll_a_out0.reg); |
2308 | clk_writel(*ctx++, tegra_pll_c_out1.reg); | 2316 | clk_writel(*ctx++, tegra_pll_c_out1.reg); |
2309 | 2317 | ||
@@ -2314,6 +2322,8 @@ void tegra_clk_resume(void) | |||
2314 | clk_writel(*ctx++, tegra_clk_sclk.reg + SUPER_CLK_DIVIDER); | 2322 | clk_writel(*ctx++, tegra_clk_sclk.reg + SUPER_CLK_DIVIDER); |
2315 | clk_writel(*ctx++, tegra_clk_pclk.reg); | 2323 | clk_writel(*ctx++, tegra_clk_pclk.reg); |
2316 | 2324 | ||
2325 | clk_writel(*ctx++, tegra_clk_audio.reg); | ||
2326 | |||
2317 | /* enable all clocks before configuring clock sources */ | 2327 | /* enable all clocks before configuring clock sources */ |
2318 | clk_writel(0xbffffff9ul, CLK_OUT_ENB); | 2328 | clk_writel(0xbffffff9ul, CLK_OUT_ENB); |
2319 | clk_writel(0xfefffff7ul, CLK_OUT_ENB + 4); | 2329 | clk_writel(0xfefffff7ul, CLK_OUT_ENB + 4); |