Skip to content

Commit

Permalink
clk: rockchip: rk3288: add suspend and resume
Browse files Browse the repository at this point in the history
save and restore some clks, which might be changed in suspend.

Signed-off-by: Tony Xie <xxx@rock-chips.com>
Signed-off-by: Chris Zhong <zyw@rock-chips.com>
Reviewed-by: Doug Anderson <dianders@chromium.org>
Tested-by: Doug Anderson <dianders@chromium.org>
Signed-off-by: Heiko Stuebner <heiko@sntech.de>
  • Loading branch information
Chris Zhong authored and Heiko Stuebner committed Nov 10, 2014
1 parent d1f931b commit 33aa59c
Showing 1 changed file with 60 additions and 0 deletions.
60 changes: 60 additions & 0 deletions drivers/clk/rockchip/clk-rk3288.c
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,7 @@
#include <linux/clk-provider.h>
#include <linux/of.h>
#include <linux/of_address.h>
#include <linux/syscore_ops.h>
#include <dt-bindings/clock/rk3288-cru.h>
#include "clk.h"

Expand Down Expand Up @@ -764,6 +765,64 @@ static const char *rk3288_critical_clocks[] __initconst = {
"hclk_peri",
};

#ifdef CONFIG_PM_SLEEP
static void __iomem *rk3288_cru_base;

/* Some CRU registers will be reset in maskrom when the system
* wakes up from fastboot.
* So save them before suspend, restore them after resume.
*/
static const int rk3288_saved_cru_reg_ids[] = {
RK3288_MODE_CON,
RK3288_CLKSEL_CON(0),
RK3288_CLKSEL_CON(1),
RK3288_CLKSEL_CON(10),
RK3288_CLKSEL_CON(33),
RK3288_CLKSEL_CON(37),
};

static u32 rk3288_saved_cru_regs[ARRAY_SIZE(rk3288_saved_cru_reg_ids)];

static int rk3288_clk_suspend(void)
{
int i, reg_id;

for (i = 0; i < ARRAY_SIZE(rk3288_saved_cru_reg_ids); i++) {
reg_id = rk3288_saved_cru_reg_ids[i];

rk3288_saved_cru_regs[i] =
readl_relaxed(rk3288_cru_base + reg_id);
}
return 0;
}

static void rk3288_clk_resume(void)
{
int i, reg_id;

for (i = ARRAY_SIZE(rk3288_saved_cru_reg_ids) - 1; i >= 0; i--) {
reg_id = rk3288_saved_cru_reg_ids[i];

writel_relaxed(rk3288_saved_cru_regs[i] | 0xffff0000,
rk3288_cru_base + reg_id);
}
}

static struct syscore_ops rk3288_clk_syscore_ops = {
.suspend = rk3288_clk_suspend,
.resume = rk3288_clk_resume,
};

static void rk3288_clk_sleep_init(void __iomem *reg_base)
{
rk3288_cru_base = reg_base;
register_syscore_ops(&rk3288_clk_syscore_ops);
}

#else /* CONFIG_PM_SLEEP */
static void rk3288_clk_sleep_init(void __iomem *reg_base) {}
#endif

static void __init rk3288_clk_init(struct device_node *np)
{
void __iomem *reg_base;
Expand Down Expand Up @@ -812,5 +871,6 @@ static void __init rk3288_clk_init(struct device_node *np)
ROCKCHIP_SOFTRST_HIWORD_MASK);

rockchip_register_restart_notifier(RK3288_GLB_SRST_FST);
rk3288_clk_sleep_init(reg_base);
}
CLK_OF_DECLARE(rk3288_cru, "rockchip,rk3288-cru", rk3288_clk_init);

0 comments on commit 33aa59c

Please sign in to comment.