aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMarek Szyprowski <m.szyprowski@samsung.com>2018-03-06 09:33:10 -0500
committerSylwester Nawrocki <s.nawrocki@samsung.com>2018-03-06 11:39:40 -0500
commitedcefb96fb07f6742fd47ac60915e76c1b77768e (patch)
treec488981f64d8f3ad239df3098254b08b5d9f1716
parentec4016ff6e60fffab2e34fe87578c6362147cb98 (diff)
clk: samsung: exynos5250: Move PD-dependent clocks to Exynos5 sub-CMU
Clocks related to DISP1 block require special handling for power domain turn on/off sequences. Till now this was handled by Exynos power domain driver, but that approach was limited only to some special cases. This patch moves handling of those operations to clock controller driver. This gives more flexibility and allows fine tune values of some clock-specific registers. This patch moves handling of those mentioned clocks to Exynos5 sub-CMU driver instantiated from Exynos5250 driver. Signed-off-by: Marek Szyprowski <m.szyprowski@samsung.com> Acked-by: Krzysztof Kozlowski <krzk@kernel.org> Signed-off-by: Sylwester Nawrocki <s.nawrocki@samsung.com>
-rw-r--r--drivers/clk/samsung/Makefile1
-rw-r--r--drivers/clk/samsung/clk-exynos5-subcmu.c1
-rw-r--r--drivers/clk/samsung/clk-exynos5250.c51
-rw-r--r--drivers/soc/samsung/pm_domains.c1
4 files changed, 38 insertions, 16 deletions
diff --git a/drivers/clk/samsung/Makefile b/drivers/clk/samsung/Makefile
index b23d6cfac723..513826393158 100644
--- a/drivers/clk/samsung/Makefile
+++ b/drivers/clk/samsung/Makefile
@@ -8,6 +8,7 @@ obj-$(CONFIG_SOC_EXYNOS3250) += clk-exynos3250.o
8obj-$(CONFIG_ARCH_EXYNOS4) += clk-exynos4.o 8obj-$(CONFIG_ARCH_EXYNOS4) += clk-exynos4.o
9obj-$(CONFIG_ARCH_EXYNOS4) += clk-exynos4412-isp.o 9obj-$(CONFIG_ARCH_EXYNOS4) += clk-exynos4412-isp.o
10obj-$(CONFIG_SOC_EXYNOS5250) += clk-exynos5250.o 10obj-$(CONFIG_SOC_EXYNOS5250) += clk-exynos5250.o
11obj-$(CONFIG_SOC_EXYNOS5250) += clk-exynos5-subcmu.o
11obj-$(CONFIG_SOC_EXYNOS5260) += clk-exynos5260.o 12obj-$(CONFIG_SOC_EXYNOS5260) += clk-exynos5260.o
12obj-$(CONFIG_SOC_EXYNOS5410) += clk-exynos5410.o 13obj-$(CONFIG_SOC_EXYNOS5410) += clk-exynos5410.o
13obj-$(CONFIG_SOC_EXYNOS5420) += clk-exynos5420.o 14obj-$(CONFIG_SOC_EXYNOS5420) += clk-exynos5420.o
diff --git a/drivers/clk/samsung/clk-exynos5-subcmu.c b/drivers/clk/samsung/clk-exynos5-subcmu.c
index bea10f4b3ee2..93306283d764 100644
--- a/drivers/clk/samsung/clk-exynos5-subcmu.c
+++ b/drivers/clk/samsung/clk-exynos5-subcmu.c
@@ -165,6 +165,7 @@ static int __init exynos5_clk_probe(struct platform_device *pdev)
165} 165}
166 166
167static const struct of_device_id exynos5_clk_of_match[] = { 167static const struct of_device_id exynos5_clk_of_match[] = {
168 { .compatible = "samsung,exynos5250-clock", },
168 { .compatible = "samsung,exynos5420-clock", }, 169 { .compatible = "samsung,exynos5420-clock", },
169 { .compatible = "samsung,exynos5800-clock", }, 170 { .compatible = "samsung,exynos5800-clock", },
170 { }, 171 { },
diff --git a/drivers/clk/samsung/clk-exynos5250.c b/drivers/clk/samsung/clk-exynos5250.c
index 1b3a8f9cd519..06e5ddcb30db 100644
--- a/drivers/clk/samsung/clk-exynos5250.c
+++ b/drivers/clk/samsung/clk-exynos5250.c
@@ -18,6 +18,7 @@
18 18
19#include "clk.h" 19#include "clk.h"
20#include "clk-cpu.h" 20#include "clk-cpu.h"
21#include "clk-exynos5-subcmu.h"
21 22
22#define APLL_LOCK 0x0 23#define APLL_LOCK 0x0
23#define APLL_CON0 0x100 24#define APLL_CON0 0x100
@@ -571,17 +572,6 @@ static const struct samsung_gate_clock exynos5250_gate_clks[] __initconst = {
571 GATE(CLK_SMMU_GSCL3, "smmu_gscl3", "mout_aclk266_gscl_sub", 572 GATE(CLK_SMMU_GSCL3, "smmu_gscl3", "mout_aclk266_gscl_sub",
572 GATE_IP_GSCL, 10, 0, 0), 573 GATE_IP_GSCL, 10, 0, 0),
573 574
574 GATE(CLK_FIMD1, "fimd1", "mout_aclk200_disp1_sub", GATE_IP_DISP1, 0, 0,
575 0),
576 GATE(CLK_MIE1, "mie1", "mout_aclk200_disp1_sub", GATE_IP_DISP1, 1, 0,
577 0),
578 GATE(CLK_DSIM0, "dsim0", "mout_aclk200_disp1_sub", GATE_IP_DISP1, 3, 0,
579 0),
580 GATE(CLK_DP, "dp", "mout_aclk200_disp1_sub", GATE_IP_DISP1, 4, 0, 0),
581 GATE(CLK_MIXER, "mixer", "mout_aclk200_disp1_sub", GATE_IP_DISP1, 5, 0,
582 0),
583 GATE(CLK_HDMI, "hdmi", "mout_aclk200_disp1_sub", GATE_IP_DISP1, 6, 0,
584 0),
585 575
586 GATE(CLK_MFC, "mfc", "mout_aclk333_sub", GATE_IP_MFC, 0, 0, 0), 576 GATE(CLK_MFC, "mfc", "mout_aclk333_sub", GATE_IP_MFC, 0, 0, 0),
587 GATE(CLK_SMMU_MFCR, "smmu_mfcr", "mout_aclk333_sub", GATE_IP_MFC, 1, 0, 577 GATE(CLK_SMMU_MFCR, "smmu_mfcr", "mout_aclk333_sub", GATE_IP_MFC, 1, 0,
@@ -671,10 +661,6 @@ static const struct samsung_gate_clock exynos5250_gate_clks[] __initconst = {
671 GATE(CLK_WDT, "wdt", "div_aclk66", GATE_IP_PERIS, 19, 0, 0), 661 GATE(CLK_WDT, "wdt", "div_aclk66", GATE_IP_PERIS, 19, 0, 0),
672 GATE(CLK_RTC, "rtc", "div_aclk66", GATE_IP_PERIS, 20, 0, 0), 662 GATE(CLK_RTC, "rtc", "div_aclk66", GATE_IP_PERIS, 20, 0, 0),
673 GATE(CLK_TMU, "tmu", "div_aclk66", GATE_IP_PERIS, 21, 0, 0), 663 GATE(CLK_TMU, "tmu", "div_aclk66", GATE_IP_PERIS, 21, 0, 0),
674 GATE(CLK_SMMU_TV, "smmu_tv", "mout_aclk200_disp1_sub",
675 GATE_IP_DISP1, 9, 0, 0),
676 GATE(CLK_SMMU_FIMD1, "smmu_fimd1", "mout_aclk200_disp1_sub",
677 GATE_IP_DISP1, 8, 0, 0),
678 GATE(CLK_SMMU_2D, "smmu_2d", "div_aclk200", GATE_IP_ACP, 7, 0, 0), 664 GATE(CLK_SMMU_2D, "smmu_2d", "div_aclk200", GATE_IP_ACP, 7, 0, 0),
679 GATE(CLK_SMMU_FIMC_ISP, "smmu_fimc_isp", "mout_aclk_266_isp_sub", 665 GATE(CLK_SMMU_FIMC_ISP, "smmu_fimc_isp", "mout_aclk_266_isp_sub",
680 GATE_IP_ISP0, 8, 0, 0), 666 GATE_IP_ISP0, 8, 0, 0),
@@ -698,6 +684,38 @@ static const struct samsung_gate_clock exynos5250_gate_clks[] __initconst = {
698 GATE_IP_ISP1, 7, 0, 0), 684 GATE_IP_ISP1, 7, 0, 0),
699}; 685};
700 686
687static const struct samsung_gate_clock exynos5250_disp_gate_clks[] __initconst = {
688 GATE(CLK_FIMD1, "fimd1", "mout_aclk200_disp1_sub", GATE_IP_DISP1, 0, 0,
689 0),
690 GATE(CLK_MIE1, "mie1", "mout_aclk200_disp1_sub", GATE_IP_DISP1, 1, 0,
691 0),
692 GATE(CLK_DSIM0, "dsim0", "mout_aclk200_disp1_sub", GATE_IP_DISP1, 3, 0,
693 0),
694 GATE(CLK_DP, "dp", "mout_aclk200_disp1_sub", GATE_IP_DISP1, 4, 0, 0),
695 GATE(CLK_MIXER, "mixer", "mout_aclk200_disp1_sub", GATE_IP_DISP1, 5, 0,
696 0),
697 GATE(CLK_HDMI, "hdmi", "mout_aclk200_disp1_sub", GATE_IP_DISP1, 6, 0,
698 0),
699 GATE(CLK_SMMU_TV, "smmu_tv", "mout_aclk200_disp1_sub",
700 GATE_IP_DISP1, 9, 0, 0),
701 GATE(CLK_SMMU_FIMD1, "smmu_fimd1", "mout_aclk200_disp1_sub",
702 GATE_IP_DISP1, 8, 0, 0),
703};
704
705static struct exynos5_subcmu_reg_dump exynos5250_disp_suspend_regs[] = {
706 { GATE_IP_DISP1, 0xffffffff, 0xffffffff }, /* DISP1 gates */
707 { SRC_TOP3, 0, BIT(4) }, /* MUX mout_aclk200_disp1_sub */
708 { SRC_TOP3, 0, BIT(6) }, /* MUX mout_aclk300_disp1_sub */
709};
710
711static const struct exynos5_subcmu_info exynos5250_disp_subcmu = {
712 .gate_clks = exynos5250_disp_gate_clks,
713 .nr_gate_clks = ARRAY_SIZE(exynos5250_disp_gate_clks),
714 .suspend_regs = exynos5250_disp_suspend_regs,
715 .nr_suspend_regs = ARRAY_SIZE(exynos5250_disp_suspend_regs),
716 .pd_name = "DISP1",
717};
718
701static const struct samsung_pll_rate_table vpll_24mhz_tbl[] __initconst = { 719static const struct samsung_pll_rate_table vpll_24mhz_tbl[] __initconst = {
702 /* sorted in descending order */ 720 /* sorted in descending order */
703 /* PLL_36XX_RATE(rate, m, p, s, k) */ 721 /* PLL_36XX_RATE(rate, m, p, s, k) */
@@ -859,10 +877,11 @@ static void __init exynos5250_clk_init(struct device_node *np)
859 __raw_writel(tmp, reg_base + PWR_CTRL2); 877 __raw_writel(tmp, reg_base + PWR_CTRL2);
860 878
861 exynos5250_clk_sleep_init(); 879 exynos5250_clk_sleep_init();
880 exynos5_subcmus_init(ctx, 1, &exynos5250_disp_subcmu);
862 881
863 samsung_clk_of_add_provider(np, ctx); 882 samsung_clk_of_add_provider(np, ctx);
864 883
865 pr_info("Exynos5250: clock setup completed, armclk=%ld\n", 884 pr_info("Exynos5250: clock setup completed, armclk=%ld\n",
866 _get_rate("div_arm2")); 885 _get_rate("div_arm2"));
867} 886}
868CLK_OF_DECLARE(exynos5250_clk, "samsung,exynos5250-clock", exynos5250_clk_init); 887CLK_OF_DECLARE_DRIVER(exynos5250_clk, "samsung,exynos5250-clock", exynos5250_clk_init);
diff --git a/drivers/soc/samsung/pm_domains.c b/drivers/soc/samsung/pm_domains.c
index f2d6d7a09c16..caf45cf7aa8e 100644
--- a/drivers/soc/samsung/pm_domains.c
+++ b/drivers/soc/samsung/pm_domains.c
@@ -148,6 +148,7 @@ static __init const char *exynos_get_domain_name(struct device_node *node)
148} 148}
149 149
150static const char *soc_force_no_clk[] = { 150static const char *soc_force_no_clk[] = {
151 "samsung,exynos5250-clock",
151 "samsung,exynos5420-clock", 152 "samsung,exynos5420-clock",
152 "samsung,exynos5800-clock", 153 "samsung,exynos5800-clock",
153}; 154};