clk: exynos4: Add support for SoC-specific register save list
authorTomasz Figa <t.figa@samsung.com>
Thu, 4 Apr 2013 04:35:35 +0000 (13:35 +0900)
committerKukjin Kim <kgene.kim@samsung.com>
Thu, 4 Apr 2013 06:51:22 +0000 (15:51 +0900)
This patch extends suspend/resume support for SoC-specific registers to
handle differences in register sets on particular SoCs.

Signed-off-by: Tomasz Figa <t.figa@samsung.com>
Signed-off-by: Kyungmin Park <kyungmin.park@samsung.com>
Reviewed-by: Thomas Abraham <thomas.abraham@linaro.org>
Acked-by: Mike Turquette <mturquette@linaro.org>
Signed-off-by: Kukjin Kim <kgene.kim@samsung.com>
drivers/clk/samsung/clk-exynos4.c
drivers/clk/samsung/clk-exynos5250.c
drivers/clk/samsung/clk-exynos5440.c
drivers/clk/samsung/clk.c
drivers/clk/samsung/clk.h

index 23210006785b776ccd7586c02ceba2a865271f8f..17674da1c5f8f129142afa8076e3d17eefce83b2 100644 (file)
@@ -183,6 +183,26 @@ enum exynos4_clks {
  * list of controller registers to be saved and restored during a
  * suspend/resume cycle.
  */
+static __initdata unsigned long exynos4210_clk_save[] = {
+       E4210_SRC_IMAGE,
+       E4210_SRC_LCD1,
+       E4210_SRC_MASK_LCD1,
+       E4210_DIV_LCD1,
+       E4210_GATE_IP_IMAGE,
+       E4210_GATE_IP_LCD1,
+       E4210_GATE_IP_PERIR,
+       E4210_MPLL_CON0,
+};
+
+static __initdata unsigned long exynos4x12_clk_save[] = {
+       E4X12_GATE_IP_IMAGE,
+       E4X12_GATE_IP_PERIR,
+       E4X12_SRC_CAM1,
+       E4X12_DIV_ISP,
+       E4X12_DIV_CAM1,
+       E4X12_MPLL_CON0,
+};
+
 static __initdata unsigned long exynos4_clk_regs[] = {
        SRC_LEFTBUS,
        DIV_LEFTBUS,
@@ -986,8 +1006,14 @@ void __init exynos4_clk_init(struct device_node *np)
                        panic("%s: unable to determine soc\n", __func__);
        }
 
-       samsung_clk_init(np, reg_base, nr_clks,
-               exynos4_clk_regs, ARRAY_SIZE(exynos4_clk_regs));
+       if (exynos4_soc == EXYNOS4210)
+               samsung_clk_init(np, reg_base, nr_clks,
+                       exynos4_clk_regs, ARRAY_SIZE(exynos4_clk_regs),
+                       exynos4210_clk_save, ARRAY_SIZE(exynos4210_clk_save));
+       else
+               samsung_clk_init(np, reg_base, nr_clks,
+                       exynos4_clk_regs, ARRAY_SIZE(exynos4_clk_regs),
+                       exynos4x12_clk_save, ARRAY_SIZE(exynos4x12_clk_save));
 
        if (np)
                samsung_clk_of_register_fixed_ext(exynos4_fixed_rate_ext_clks,
index 115212525dd2231cc81758e6327b175ee79d4fda..5cd9a0c47bf214d7c7fe1b2d20e3ff5a6a149b40 100644 (file)
@@ -477,7 +477,8 @@ void __init exynos5250_clk_init(struct device_node *np)
        }
 
        samsung_clk_init(np, reg_base, nr_clks,
-                       exynos5250_clk_regs, ARRAY_SIZE(exynos5250_clk_regs));
+                       exynos5250_clk_regs, ARRAY_SIZE(exynos5250_clk_regs),
+                       NULL, 0);
        samsung_clk_of_register_fixed_ext(exynos5250_fixed_rate_ext_clks,
                        ARRAY_SIZE(exynos5250_fixed_rate_ext_clks),
                        ext_clk_match);
index d588e939c235bf5104632b3a54449bfde3197c8e..a0a094c06f19d27d24147a7bf3fd232330a0d444 100644 (file)
@@ -115,7 +115,7 @@ void __init exynos5440_clk_init(struct device_node *np)
                return;
        }
 
-       samsung_clk_init(np, reg_base, nr_clks, NULL, 0);
+       samsung_clk_init(np, reg_base, nr_clks, NULL, 0, NULL, 0);
        samsung_clk_of_register_fixed_ext(exynos5440_fixed_rate_ext_clks,
                ARRAY_SIZE(exynos5440_fixed_rate_ext_clks), ext_clk_match);
 
index 82f27f644dae584eeb51cddbebb2c224ff4bc288..3a50d4fe0be96d91561c41aaba7de916173fafad 100644 (file)
@@ -54,7 +54,8 @@ static struct syscore_ops samsung_clk_syscore_ops = {
 /* setup the essentials required to support clock lookup using ccf */
 void __init samsung_clk_init(struct device_node *np, void __iomem *base,
                unsigned long nr_clks, unsigned long *rdump,
-               unsigned long nr_rdump)
+               unsigned long nr_rdump, unsigned long *soc_rdump,
+               unsigned long nr_soc_rdump)
 {
        reg_base = base;
 
@@ -62,7 +63,7 @@ void __init samsung_clk_init(struct device_node *np, void __iomem *base,
        if (rdump && nr_rdump) {
                unsigned int idx;
                reg_dump = kzalloc(sizeof(struct samsung_clk_reg_dump)
-                                       * nr_rdump, GFP_KERNEL);
+                               * (nr_rdump + nr_soc_rdump), GFP_KERNEL);
                if (!reg_dump) {
                        pr_err("%s: memory alloc for register dump failed\n",
                                        __func__);
@@ -71,7 +72,9 @@ void __init samsung_clk_init(struct device_node *np, void __iomem *base,
 
                for (idx = 0; idx < nr_rdump; idx++)
                        reg_dump[idx].offset = rdump[idx];
-               nr_reg_dump = nr_rdump;
+               for (idx = 0; idx < nr_soc_rdump; idx++)
+                       reg_dump[nr_rdump + idx].offset = soc_rdump[idx];
+               nr_reg_dump = nr_rdump + nr_soc_rdump;
                register_syscore_ops(&samsung_clk_syscore_ops);
        }
 #endif
index 6bacd6fa0200752e6461998bb967122fef370dc6..10b2111f0c0f767e65839c938f9d9bc61e029c55 100644 (file)
@@ -262,7 +262,8 @@ struct samsung_clk_reg_dump {
 
 extern void __init samsung_clk_init(struct device_node *np, void __iomem *base,
                unsigned long nr_clks, unsigned long *rdump,
-               unsigned long nr_rdump);
+               unsigned long nr_rdump, unsigned long *soc_rdump,
+               unsigned long nr_soc_rdump);
 extern void __init samsung_clk_of_register_fixed_ext(
                struct samsung_fixed_rate_clock *fixed_rate_clk,
                unsigned int nr_fixed_rate_clk,