diff options
author | Tomasz Figa <t.figa@samsung.com> | 2014-02-13 18:16:00 -0500 |
---|---|---|
committer | Kukjin Kim <kgene.kim@samsung.com> | 2014-02-13 18:16:00 -0500 |
commit | 3ccefbd2291d6ee59f242c05266e241c5e33667e (patch) | |
tree | 7f28cf471e3e3d7920222223f6d85fee4cf1bc83 | |
parent | 442f4948e5b0b2bc6e77811a5e46fcd13f0870a6 (diff) |
clk: samsung: Provide common helpers for register save/restore
As suspend/resume handlers are being moved to SoC specific code, due to
differencies in suspend/resume handling of particular SoCs, to minimize
code duplication this patch provides common register save/restore
helpers that save/restore given list of registers of clock controller.
Signed-off-by: Tomasz Figa <t.figa@samsung.com>
Acked-by: Kyungmin Park <kyungmin.park@samsung.com>
Acked-by: Heiko Stuebner <heiko@sntech.de>
Reviewed-by: Thomas Abraham <thomas.ab@samsung.com>
Reviewed-by: Sylwester Nawrocki <s.nawrocki@samsung.com>
Signed-off-by: Kukjin Kim <kgene.kim@samsung.com>
-rw-r--r-- | drivers/clk/samsung/clk.c | 32 | ||||
-rw-r--r-- | drivers/clk/samsung/clk.h | 10 |
2 files changed, 42 insertions, 0 deletions
diff --git a/drivers/clk/samsung/clk.c b/drivers/clk/samsung/clk.c index f503f32e2f80..c0a716b94a66 100644 --- a/drivers/clk/samsung/clk.c +++ b/drivers/clk/samsung/clk.c | |||
@@ -22,6 +22,38 @@ static struct clk_onecell_data clk_data; | |||
22 | #endif | 22 | #endif |
23 | 23 | ||
24 | #ifdef CONFIG_PM_SLEEP | 24 | #ifdef CONFIG_PM_SLEEP |
25 | void samsung_clk_save(void __iomem *base, | ||
26 | struct samsung_clk_reg_dump *rd, | ||
27 | unsigned int num_regs) | ||
28 | { | ||
29 | for (; num_regs > 0; --num_regs, ++rd) | ||
30 | rd->value = readl(base + rd->offset); | ||
31 | } | ||
32 | |||
33 | void samsung_clk_restore(void __iomem *base, | ||
34 | const struct samsung_clk_reg_dump *rd, | ||
35 | unsigned int num_regs) | ||
36 | { | ||
37 | for (; num_regs > 0; --num_regs, ++rd) | ||
38 | writel(rd->value, base + rd->offset); | ||
39 | } | ||
40 | |||
41 | struct samsung_clk_reg_dump *samsung_clk_alloc_reg_dump(unsigned long *rdump, | ||
42 | unsigned long nr_rdump) | ||
43 | { | ||
44 | struct samsung_clk_reg_dump *rd; | ||
45 | unsigned int i; | ||
46 | |||
47 | rd = kcalloc(nr_rdump, sizeof(*rd), GFP_KERNEL); | ||
48 | if (!rd) | ||
49 | return NULL; | ||
50 | |||
51 | for (i = 0; i < nr_rdump; ++i) | ||
52 | rd[i].offset = rdump[i]; | ||
53 | |||
54 | return rd; | ||
55 | } | ||
56 | |||
25 | static struct samsung_clk_reg_dump *reg_dump; | 57 | static struct samsung_clk_reg_dump *reg_dump; |
26 | static unsigned long nr_reg_dump; | 58 | static unsigned long nr_reg_dump; |
27 | 59 | ||
diff --git a/drivers/clk/samsung/clk.h b/drivers/clk/samsung/clk.h index 31b4174e7a5b..ec8d46ba8178 100644 --- a/drivers/clk/samsung/clk.h +++ b/drivers/clk/samsung/clk.h | |||
@@ -340,4 +340,14 @@ extern void __init samsung_clk_register_pll(struct samsung_pll_clock *pll_list, | |||
340 | 340 | ||
341 | extern unsigned long _get_rate(const char *clk_name); | 341 | extern unsigned long _get_rate(const char *clk_name); |
342 | 342 | ||
343 | extern void samsung_clk_save(void __iomem *base, | ||
344 | struct samsung_clk_reg_dump *rd, | ||
345 | unsigned int num_regs); | ||
346 | extern void samsung_clk_restore(void __iomem *base, | ||
347 | const struct samsung_clk_reg_dump *rd, | ||
348 | unsigned int num_regs); | ||
349 | extern struct samsung_clk_reg_dump *samsung_clk_alloc_reg_dump( | ||
350 | unsigned long *rdump, | ||
351 | unsigned long nr_rdump); | ||
352 | |||
343 | #endif /* __SAMSUNG_CLK_H */ | 353 | #endif /* __SAMSUNG_CLK_H */ |