Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

clk: samsung: exynos4: Enable VPLL and EPLL clocks for suspend/resume cycle

Commit 6edfa11cb396 ("clk: samsung: Add enable/disable operation for
PLL36XX clocks") added enable/disable operations to PLL clocks. Prior that
VPLL and EPPL clocks were always enabled because the enable bit was never
touched. Those clocks have to be enabled during suspend/resume cycle,
because otherwise board fails to enter sleep mode. This patch enables them
unconditionally before entering system suspend state. System restore
function will set them to the previous state saved in the register cache
done before that unconditional enable.

Fixes: 6edfa11cb396 ("clk: samsung: Add enable/disable operation for PLL36XX clocks")
CC: stable@vger.kernel.org # v4.13
Signed-off-by: Marek Szyprowski <m.szyprowski@samsung.com>
Reviewed-by: Chanwoo Choi <cw00.choi@samsung.com>
Reviewed-by: Krzysztof Kozlowski <krzk@kernel.org>
Acked-by: Sylwester Nawrocki <s.nawrocki@samsung.com>
Signed-off-by: Stephen Boyd <sboyd@codeaurora.org>

authored by

Marek Szyprowski and committed by
Stephen Boyd
5dcbeca6 79765e9a

+15
+15
drivers/clk/samsung/clk-exynos4.c
··· 294 294 #define PLL_ENABLED (1 << 31) 295 295 #define PLL_LOCKED (1 << 29) 296 296 297 + static void exynos4_clk_enable_pll(u32 reg) 298 + { 299 + u32 pll_con = readl(reg_base + reg); 300 + pll_con |= PLL_ENABLED; 301 + writel(pll_con, reg_base + reg); 302 + 303 + while (!(pll_con & PLL_LOCKED)) { 304 + cpu_relax(); 305 + pll_con = readl(reg_base + reg); 306 + } 307 + } 308 + 297 309 static void exynos4_clk_wait_for_pll(u32 reg) 298 310 { 299 311 u32 pll_con; ··· 326 314 ARRAY_SIZE(exynos4_clk_regs)); 327 315 samsung_clk_save(reg_base, exynos4_save_pll, 328 316 ARRAY_SIZE(exynos4_clk_pll_regs)); 317 + 318 + exynos4_clk_enable_pll(EPLL_CON0); 319 + exynos4_clk_enable_pll(VPLL_CON0); 329 320 330 321 if (exynos4_soc == EXYNOS4210) { 331 322 samsung_clk_save(reg_base, exynos4_save_soc,