summaryrefslogtreecommitdiff
path: root/drivers/clk
diff options
context:
space:
mode:
authorJonghwa Lee <jonghwa3.lee@samsung.com>2015-04-03 14:16:51 +0900
committerSeung-Woo Kim <sw0312.kim@samsung.com>2016-12-14 13:43:12 +0900
commit14f96e5e9a0fb4b6078970c0e9d6c41b861d1588 (patch)
tree5d2742533ff301a19d758254b66fe4660fbd00e1 /drivers/clk
parent3ce5e6cbbee8eba889767bfe7a7555d2eb2f91dd (diff)
clk: samsung: Introduce supend_prepare/unprepare callback.
To manage the chip dependent clock control for suspend, this patch introduce additional suspend callback at the level of entering suspend. Signed-off-by: Jonghwa Lee <jonghwa3.lee@samsung.com>
Diffstat (limited to 'drivers/clk')
-rw-r--r--drivers/clk/samsung/clk.c30
-rw-r--r--drivers/clk/samsung/clk.h7
2 files changed, 37 insertions, 0 deletions
diff --git a/drivers/clk/samsung/clk.c b/drivers/clk/samsung/clk.c
index 9e1f88c04fd4..12940a37e7ac 100644
--- a/drivers/clk/samsung/clk.c
+++ b/drivers/clk/samsung/clk.c
@@ -18,6 +18,29 @@
static LIST_HEAD(clock_reg_cache_list);
+static struct samsung_clk_suspend_ops *suspend_ops;
+
+int samsung_clk_register_suspend_ops(
+ struct samsung_clk_suspend_ops *ops)
+{
+ suspend_ops = ops;
+ return 0;
+}
+
+static int samsung_clk_suspend_prepare(void)
+{
+ if (suspend_ops && suspend_ops->suspend_prepare)
+ return suspend_ops->suspend_prepare();
+ return 0;
+}
+
+static int samsung_clk_suspend_unprepare(void)
+{
+ if (suspend_ops && suspend_ops->suspend_unprepare)
+ return suspend_ops->suspend_unprepare();
+ return 0;
+}
+
void samsung_clk_save(void __iomem *base,
struct samsung_clk_reg_dump *rd,
unsigned int num_regs)
@@ -320,6 +343,11 @@ unsigned long _get_rate(const char *clk_name)
static int samsung_clk_suspend(void)
{
struct samsung_clock_reg_cache *reg_cache;
+ int ret;
+
+ ret = samsung_clk_suspend_prepare();
+ if (ret)
+ return ret;
list_for_each_entry(reg_cache, &clock_reg_cache_list, node)
samsung_clk_save(reg_cache->reg_base, reg_cache->rdump,
@@ -334,6 +362,8 @@ static void samsung_clk_resume(void)
list_for_each_entry(reg_cache, &clock_reg_cache_list, node)
samsung_clk_restore(reg_cache->reg_base, reg_cache->rdump,
reg_cache->rd_num);
+
+ samsung_clk_suspend_unprepare();
}
static struct syscore_ops samsung_clk_syscore_ops = {
diff --git a/drivers/clk/samsung/clk.h b/drivers/clk/samsung/clk.h
index e4c75383cea7..2ff4adc61417 100644
--- a/drivers/clk/samsung/clk.h
+++ b/drivers/clk/samsung/clk.h
@@ -408,4 +408,11 @@ extern struct samsung_clk_reg_dump *samsung_clk_alloc_reg_dump(
const unsigned long *rdump,
unsigned long nr_rdump);
+struct samsung_clk_suspend_ops {
+ int (*suspend_prepare)(void);
+ int (*suspend_unprepare)(void);
+};
+
+extern int samsung_clk_register_suspend_ops(
+ struct samsung_clk_suspend_ops *ops);
#endif /* __SAMSUNG_CLK_H */