clk: samsung: Add suspend/resume pm ops for audss clk controller
authorSylwester Nawrocki <s.nawrocki@samsung.com>
Wed, 2 Jul 2014 13:40:58 +0000 (15:40 +0200)
committerChanho Park <chanho61.park@samsung.com>
Tue, 18 Nov 2014 03:00:01 +0000 (12:00 +0900)
Ensure the Exynos audio subsystem clock controller registers are
preserved across suspend/resume.

Change-Id: I57f4dcbbc9d02f7dfa2cd68508a9cefba010b9e5
Signed-off-by: Sylwester Nawrocki <s.nawrocki@samsung.com>
drivers/clk/samsung/clk-exynos4-audss.c

index 4522d00..28c18d0 100644 (file)
@@ -51,22 +51,36 @@ static struct clk_onecell_data clk_data;
 static void __iomem *io_base;
 static struct clk *clks[AUDSS_CLK_MAX];
 
+#ifdef CONFIG_PM_SLEEP
+static unsigned long reg_save[][2] = {
+       { AUDSS_CLKSRC,  0 },
+       { AUDSS_CLKDIV,  0 },
+       { AUDSS_CLKGATE, 0 },
+};
+
 static int samsung_audss_clk_suspend(void)
 {
-       /* TODO: */
+       unsigned int i;
+
+       for (i = 0; i < ARRAY_SIZE(reg_save); i++)
+               reg_save[i][1] = readl(io_base + reg_save[i][0]);
+
        return 0;
 }
 
 static void samsung_audss_clk_resume(void)
 {
-       /* TODO: */
+       unsigned int i;
+
+       for (i = 0; i < ARRAY_SIZE(reg_save); i++)
+               writel(reg_save[i][1], io_base + reg_save[i][0]);
 }
 
 static struct syscore_ops samsung_audss_clk_syscore_ops = {
        .suspend = samsung_audss_clk_suspend,
        .resume  = samsung_audss_clk_resume,
 };
-
+#endif /* CONFIG_PM_SLEEP */
 
 #ifdef CONFIG_OF
 static struct of_device_id audss_of_match[] __initdata = {