diff options
author | Jonghwa Lee <jonghwa3.lee@samsung.com> | 2015-04-03 14:16:51 +0900 |
---|---|---|
committer | Seung-Woo Kim <sw0312.kim@samsung.com> | 2016-12-14 13:43:12 +0900 |
commit | 14f96e5e9a0fb4b6078970c0e9d6c41b861d1588 (patch) | |
tree | 5d2742533ff301a19d758254b66fe4660fbd00e1 /drivers/clk | |
parent | 3ce5e6cbbee8eba889767bfe7a7555d2eb2f91dd (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.c | 30 | ||||
-rw-r--r-- | drivers/clk/samsung/clk.h | 7 |
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 */ |