diff options
author | Heiko Stübner <heiko@sntech.de> | 2014-08-14 17:00:26 -0400 |
---|---|---|
committer | Mike Turquette <mturquette@linaro.org> | 2014-09-02 18:03:18 -0400 |
commit | fe94f974e9c8b820640a5873d81589ab67380516 (patch) | |
tree | ff4719b1c22c714be7734b914e5b264df4c7b768 | |
parent | 1a4b1819950a278e44dd2e28c5cdb7d8b804dd73 (diff) |
clk: rockchip: protect critical clocks from getting disabled
The clock-tree contains clocks that should never get disabled automatically.
One example are the base ACLKs, the base supplies for all peripherals.
Therefore add a structure similar to the sunxi clock-tree to protect these
special clocks from being disabled.
Signed-off-by: Heiko Stuebner <heiko@sntech.de>
Tested-by: Doug Anderson <dianders@chromium.org>
Tested-by: Kever Yang <kever.yang@rock-chips.com>
Signed-off-by: Mike Turquette <mturquette@linaro.org>
-rw-r--r-- | drivers/clk/rockchip/clk-rk3188.c | 7 | ||||
-rw-r--r-- | drivers/clk/rockchip/clk-rk3288.c | 7 | ||||
-rw-r--r-- | drivers/clk/rockchip/clk.c | 13 | ||||
-rw-r--r-- | drivers/clk/rockchip/clk.h | 1 |
4 files changed, 28 insertions, 0 deletions
diff --git a/drivers/clk/rockchip/clk-rk3188.c b/drivers/clk/rockchip/clk-rk3188.c index a83a6d8d0fb6..732118ed55a5 100644 --- a/drivers/clk/rockchip/clk-rk3188.c +++ b/drivers/clk/rockchip/clk-rk3188.c | |||
@@ -599,6 +599,11 @@ static struct rockchip_clk_branch rk3188_clk_branches[] __initdata = { | |||
599 | GATE(ACLK_GPS, "aclk_gps", "aclk_peri", 0, RK2928_CLKGATE_CON(8), 13, GFLAGS), | 599 | GATE(ACLK_GPS, "aclk_gps", "aclk_peri", 0, RK2928_CLKGATE_CON(8), 13, GFLAGS), |
600 | }; | 600 | }; |
601 | 601 | ||
602 | static const char *rk3188_critical_clocks[] __initconst = { | ||
603 | "aclk_cpu", | ||
604 | "aclk_peri", | ||
605 | }; | ||
606 | |||
602 | static void __init rk3188_common_clk_init(struct device_node *np) | 607 | static void __init rk3188_common_clk_init(struct device_node *np) |
603 | { | 608 | { |
604 | void __iomem *reg_base; | 609 | void __iomem *reg_base; |
@@ -628,6 +633,8 @@ static void __init rk3188_common_clk_init(struct device_node *np) | |||
628 | RK3188_GRF_SOC_STATUS); | 633 | RK3188_GRF_SOC_STATUS); |
629 | rockchip_clk_register_branches(common_clk_branches, | 634 | rockchip_clk_register_branches(common_clk_branches, |
630 | ARRAY_SIZE(common_clk_branches)); | 635 | ARRAY_SIZE(common_clk_branches)); |
636 | rockchip_clk_protect_critical(rk3188_critical_clocks, | ||
637 | ARRAY_SIZE(rk3188_critical_clocks)); | ||
631 | 638 | ||
632 | rockchip_register_softrst(np, 9, reg_base + RK2928_SOFTRST_CON(0), | 639 | rockchip_register_softrst(np, 9, reg_base + RK2928_SOFTRST_CON(0), |
633 | ROCKCHIP_SOFTRST_HIWORD_MASK); | 640 | ROCKCHIP_SOFTRST_HIWORD_MASK); |
diff --git a/drivers/clk/rockchip/clk-rk3288.c b/drivers/clk/rockchip/clk-rk3288.c index 0d8c6c59a75e..038b1aaf8c56 100644 --- a/drivers/clk/rockchip/clk-rk3288.c +++ b/drivers/clk/rockchip/clk-rk3288.c | |||
@@ -680,6 +680,11 @@ static struct rockchip_clk_branch rk3288_clk_branches[] __initdata = { | |||
680 | GATE(0, "pclk_isp_in", "ext_isp", 0, RK3288_CLKGATE_CON(16), 3, GFLAGS), | 680 | GATE(0, "pclk_isp_in", "ext_isp", 0, RK3288_CLKGATE_CON(16), 3, GFLAGS), |
681 | }; | 681 | }; |
682 | 682 | ||
683 | static const char *rk3288_critical_clocks[] __initconst = { | ||
684 | "aclk_cpu", | ||
685 | "aclk_peri", | ||
686 | }; | ||
687 | |||
683 | static void __init rk3288_clk_init(struct device_node *np) | 688 | static void __init rk3288_clk_init(struct device_node *np) |
684 | { | 689 | { |
685 | void __iomem *reg_base; | 690 | void __iomem *reg_base; |
@@ -710,6 +715,8 @@ static void __init rk3288_clk_init(struct device_node *np) | |||
710 | RK3288_GRF_SOC_STATUS); | 715 | RK3288_GRF_SOC_STATUS); |
711 | rockchip_clk_register_branches(rk3288_clk_branches, | 716 | rockchip_clk_register_branches(rk3288_clk_branches, |
712 | ARRAY_SIZE(rk3288_clk_branches)); | 717 | ARRAY_SIZE(rk3288_clk_branches)); |
718 | rockchip_clk_protect_critical(rk3288_critical_clocks, | ||
719 | ARRAY_SIZE(rk3288_critical_clocks)); | ||
713 | 720 | ||
714 | rockchip_register_softrst(np, 9, reg_base + RK3288_SOFTRST_CON(0), | 721 | rockchip_register_softrst(np, 9, reg_base + RK3288_SOFTRST_CON(0), |
715 | ROCKCHIP_SOFTRST_HIWORD_MASK); | 722 | ROCKCHIP_SOFTRST_HIWORD_MASK); |
diff --git a/drivers/clk/rockchip/clk.c b/drivers/clk/rockchip/clk.c index 5c9abd7bdc6a..d9c6db2151ba 100644 --- a/drivers/clk/rockchip/clk.c +++ b/drivers/clk/rockchip/clk.c | |||
@@ -296,3 +296,16 @@ void __init rockchip_clk_register_branches( | |||
296 | rockchip_clk_add_lookup(clk, list->id); | 296 | rockchip_clk_add_lookup(clk, list->id); |
297 | } | 297 | } |
298 | } | 298 | } |
299 | |||
300 | void __init rockchip_clk_protect_critical(const char *clocks[], int nclocks) | ||
301 | { | ||
302 | int i; | ||
303 | |||
304 | /* Protect the clocks that needs to stay on */ | ||
305 | for (i = 0; i < nclocks; i++) { | ||
306 | struct clk *clk = __clk_lookup(clocks[i]); | ||
307 | |||
308 | if (clk) | ||
309 | clk_prepare_enable(clk); | ||
310 | } | ||
311 | } | ||
diff --git a/drivers/clk/rockchip/clk.h b/drivers/clk/rockchip/clk.h index 887cbdeca2aa..2b0bca19db47 100644 --- a/drivers/clk/rockchip/clk.h +++ b/drivers/clk/rockchip/clk.h | |||
@@ -329,6 +329,7 @@ void rockchip_clk_register_branches(struct rockchip_clk_branch *clk_list, | |||
329 | unsigned int nr_clk); | 329 | unsigned int nr_clk); |
330 | void rockchip_clk_register_plls(struct rockchip_pll_clock *pll_list, | 330 | void rockchip_clk_register_plls(struct rockchip_pll_clock *pll_list, |
331 | unsigned int nr_pll, int grf_lock_offset); | 331 | unsigned int nr_pll, int grf_lock_offset); |
332 | void rockchip_clk_protect_critical(const char *clocks[], int nclocks); | ||
332 | 333 | ||
333 | #define ROCKCHIP_SOFTRST_HIWORD_MASK BIT(0) | 334 | #define ROCKCHIP_SOFTRST_HIWORD_MASK BIT(0) |
334 | 335 | ||