diff options
author | Heiko Stuebner <heiko@sntech.de> | 2014-09-05 05:25:03 -0400 |
---|---|---|
committer | Heiko Stuebner <heiko@sntech.de> | 2014-09-27 11:57:46 -0400 |
commit | 0e5bdb3f9fa5c2bd4452c258de78122ef15f62d6 (patch) | |
tree | a5c4b8a755fc6e5206a6e0c41afbbf4a8b5a3a52 | |
parent | f6fba5f6967dbc062a7c138d67e2314220f5dd04 (diff) |
clk: rockchip: switch to using the new cpuclk type for armclk
This adds the necessary soc-specific divider values and switches the armclk
to use the newly introduced cpuclk type.
Signed-off-by: Heiko Stuebner <heiko@sntech.de>
Reviewed-by: Doug Anderson <dianders@chromium.org>
Tested-by: Doug Anderson <dianders@chromium.org>
-rw-r--r-- | drivers/clk/rockchip/clk-rk3188.c | 104 | ||||
-rw-r--r-- | drivers/clk/rockchip/clk-rk3288.c | 71 |
2 files changed, 169 insertions, 6 deletions
diff --git a/drivers/clk/rockchip/clk-rk3188.c b/drivers/clk/rockchip/clk-rk3188.c index adfbfefeddf3..ceabce595498 100644 --- a/drivers/clk/rockchip/clk-rk3188.c +++ b/drivers/clk/rockchip/clk-rk3188.c | |||
@@ -101,6 +101,98 @@ struct rockchip_pll_rate_table rk3188_pll_rates[] = { | |||
101 | { /* sentinel */ }, | 101 | { /* sentinel */ }, |
102 | }; | 102 | }; |
103 | 103 | ||
104 | #define RK3066_DIV_CORE_PERIPH_MASK 0x3 | ||
105 | #define RK3066_DIV_CORE_PERIPH_SHIFT 6 | ||
106 | #define RK3066_DIV_ACLK_CORE_MASK 0x7 | ||
107 | #define RK3066_DIV_ACLK_CORE_SHIFT 0 | ||
108 | #define RK3066_DIV_ACLK_HCLK_MASK 0x3 | ||
109 | #define RK3066_DIV_ACLK_HCLK_SHIFT 8 | ||
110 | #define RK3066_DIV_ACLK_PCLK_MASK 0x3 | ||
111 | #define RK3066_DIV_ACLK_PCLK_SHIFT 12 | ||
112 | #define RK3066_DIV_AHB2APB_MASK 0x3 | ||
113 | #define RK3066_DIV_AHB2APB_SHIFT 14 | ||
114 | |||
115 | #define RK3066_CLKSEL0(_core_peri) \ | ||
116 | { \ | ||
117 | .reg = RK2928_CLKSEL_CON(0), \ | ||
118 | .val = HIWORD_UPDATE(_core_peri, RK3066_DIV_CORE_PERIPH_MASK, \ | ||
119 | RK3066_DIV_CORE_PERIPH_SHIFT) \ | ||
120 | } | ||
121 | #define RK3066_CLKSEL1(_aclk_core, _aclk_hclk, _aclk_pclk, _ahb2apb) \ | ||
122 | { \ | ||
123 | .reg = RK2928_CLKSEL_CON(1), \ | ||
124 | .val = HIWORD_UPDATE(_aclk_core, RK3066_DIV_ACLK_CORE_MASK, \ | ||
125 | RK3066_DIV_ACLK_CORE_SHIFT) | \ | ||
126 | HIWORD_UPDATE(_aclk_hclk, RK3066_DIV_ACLK_HCLK_MASK, \ | ||
127 | RK3066_DIV_ACLK_HCLK_SHIFT) | \ | ||
128 | HIWORD_UPDATE(_aclk_pclk, RK3066_DIV_ACLK_PCLK_MASK, \ | ||
129 | RK3066_DIV_ACLK_PCLK_SHIFT) | \ | ||
130 | HIWORD_UPDATE(_ahb2apb, RK3066_DIV_AHB2APB_MASK, \ | ||
131 | RK3066_DIV_AHB2APB_SHIFT), \ | ||
132 | } | ||
133 | |||
134 | #define RK3066_CPUCLK_RATE(_prate, _core_peri, _acore, _ahclk, _apclk, _h2p) \ | ||
135 | { \ | ||
136 | .prate = _prate, \ | ||
137 | .divs = { \ | ||
138 | RK3066_CLKSEL0(_core_peri), \ | ||
139 | RK3066_CLKSEL1(_acore, _ahclk, _apclk, _h2p), \ | ||
140 | }, \ | ||
141 | } | ||
142 | |||
143 | static struct rockchip_cpuclk_rate_table rk3066_cpuclk_rates[] __initdata = { | ||
144 | RK3066_CPUCLK_RATE(1416000000, 2, 3, 1, 2, 1), | ||
145 | RK3066_CPUCLK_RATE(1200000000, 2, 3, 1, 2, 1), | ||
146 | RK3066_CPUCLK_RATE(1008000000, 2, 2, 1, 2, 1), | ||
147 | RK3066_CPUCLK_RATE( 816000000, 2, 2, 1, 2, 1), | ||
148 | RK3066_CPUCLK_RATE( 600000000, 1, 2, 1, 2, 1), | ||
149 | RK3066_CPUCLK_RATE( 504000000, 1, 1, 1, 2, 1), | ||
150 | RK3066_CPUCLK_RATE( 312000000, 0, 1, 1, 1, 0), | ||
151 | }; | ||
152 | |||
153 | static const struct rockchip_cpuclk_reg_data rk3066_cpuclk_data = { | ||
154 | .core_reg = RK2928_CLKSEL_CON(0), | ||
155 | .div_core_shift = 0, | ||
156 | .div_core_mask = 0x1f, | ||
157 | .mux_core_shift = 8, | ||
158 | }; | ||
159 | |||
160 | #define RK3188_DIV_ACLK_CORE_MASK 0x7 | ||
161 | #define RK3188_DIV_ACLK_CORE_SHIFT 3 | ||
162 | |||
163 | #define RK3188_CLKSEL1(_aclk_core) \ | ||
164 | { \ | ||
165 | .reg = RK2928_CLKSEL_CON(1), \ | ||
166 | .val = HIWORD_UPDATE(_aclk_core, RK3188_DIV_ACLK_CORE_MASK,\ | ||
167 | RK3188_DIV_ACLK_CORE_SHIFT) \ | ||
168 | } | ||
169 | #define RK3188_CPUCLK_RATE(_prate, _core_peri, _aclk_core) \ | ||
170 | { \ | ||
171 | .prate = _prate, \ | ||
172 | .divs = { \ | ||
173 | RK3066_CLKSEL0(_core_peri), \ | ||
174 | RK3188_CLKSEL1(_aclk_core), \ | ||
175 | }, \ | ||
176 | } | ||
177 | |||
178 | static struct rockchip_cpuclk_rate_table rk3188_cpuclk_rates[] __initdata = { | ||
179 | RK3188_CPUCLK_RATE(1608000000, 2, 3), | ||
180 | RK3188_CPUCLK_RATE(1416000000, 2, 3), | ||
181 | RK3188_CPUCLK_RATE(1200000000, 2, 3), | ||
182 | RK3188_CPUCLK_RATE(1008000000, 2, 3), | ||
183 | RK3188_CPUCLK_RATE( 816000000, 2, 3), | ||
184 | RK3188_CPUCLK_RATE( 600000000, 1, 3), | ||
185 | RK3188_CPUCLK_RATE( 504000000, 1, 3), | ||
186 | RK3188_CPUCLK_RATE( 312000000, 0, 1), | ||
187 | }; | ||
188 | |||
189 | static const struct rockchip_cpuclk_reg_data rk3188_cpuclk_data = { | ||
190 | .core_reg = RK2928_CLKSEL_CON(0), | ||
191 | .div_core_shift = 9, | ||
192 | .div_core_mask = 0x1f, | ||
193 | .mux_core_shift = 8, | ||
194 | }; | ||
195 | |||
104 | PNAME(mux_pll_p) = { "xin24m", "xin32k" }; | 196 | PNAME(mux_pll_p) = { "xin24m", "xin32k" }; |
105 | PNAME(mux_armclk_p) = { "apll", "gpll_armclk" }; | 197 | PNAME(mux_armclk_p) = { "apll", "gpll_armclk" }; |
106 | PNAME(mux_ddrphy_p) = { "dpll", "gpll_ddr" }; | 198 | PNAME(mux_ddrphy_p) = { "dpll", "gpll_ddr" }; |
@@ -406,8 +498,6 @@ static struct clk_div_table div_aclk_cpu_t[] = { | |||
406 | }; | 498 | }; |
407 | 499 | ||
408 | static struct rockchip_clk_branch rk3066a_clk_branches[] __initdata = { | 500 | static struct rockchip_clk_branch rk3066a_clk_branches[] __initdata = { |
409 | COMPOSITE_NOGATE(0, "armclk", mux_armclk_p, 0, | ||
410 | RK2928_CLKSEL_CON(0), 8, 1, MFLAGS, 0, 5, DFLAGS), | ||
411 | DIVTBL(0, "aclk_cpu_pre", "armclk", 0, | 501 | DIVTBL(0, "aclk_cpu_pre", "armclk", 0, |
412 | RK2928_CLKSEL_CON(1), 0, 3, DFLAGS | CLK_DIVIDER_READ_ONLY, div_aclk_cpu_t), | 502 | RK2928_CLKSEL_CON(1), 0, 3, DFLAGS | CLK_DIVIDER_READ_ONLY, div_aclk_cpu_t), |
413 | DIV(0, "pclk_cpu_pre", "aclk_cpu_pre", 0, | 503 | DIV(0, "pclk_cpu_pre", "aclk_cpu_pre", 0, |
@@ -528,8 +618,6 @@ PNAME(mux_hsicphy_p) = { "sclk_otgphy0", "sclk_otgphy1", | |||
528 | "gpll", "cpll" }; | 618 | "gpll", "cpll" }; |
529 | 619 | ||
530 | static struct rockchip_clk_branch rk3188_clk_branches[] __initdata = { | 620 | static struct rockchip_clk_branch rk3188_clk_branches[] __initdata = { |
531 | COMPOSITE_NOGATE(0, "armclk", mux_armclk_p, 0, | ||
532 | RK2928_CLKSEL_CON(0), 8, 1, MFLAGS, 9, 5, DFLAGS), | ||
533 | COMPOSITE_NOMUX_DIVTBL(0, "aclk_core", "armclk", 0, | 621 | COMPOSITE_NOMUX_DIVTBL(0, "aclk_core", "armclk", 0, |
534 | RK2928_CLKSEL_CON(1), 3, 3, DFLAGS | CLK_DIVIDER_READ_ONLY, | 622 | RK2928_CLKSEL_CON(1), 3, 3, DFLAGS | CLK_DIVIDER_READ_ONLY, |
535 | div_rk3188_aclk_core_t, RK2928_CLKGATE_CON(0), 7, GFLAGS), | 623 | div_rk3188_aclk_core_t, RK2928_CLKGATE_CON(0), 7, GFLAGS), |
@@ -657,6 +745,10 @@ static void __init rk3066a_clk_init(struct device_node *np) | |||
657 | RK3066_GRF_SOC_STATUS); | 745 | RK3066_GRF_SOC_STATUS); |
658 | rockchip_clk_register_branches(rk3066a_clk_branches, | 746 | rockchip_clk_register_branches(rk3066a_clk_branches, |
659 | ARRAY_SIZE(rk3066a_clk_branches)); | 747 | ARRAY_SIZE(rk3066a_clk_branches)); |
748 | rockchip_clk_register_armclk(ARMCLK, "armclk", | ||
749 | mux_armclk_p, ARRAY_SIZE(mux_armclk_p), | ||
750 | &rk3066_cpuclk_data, rk3066_cpuclk_rates, | ||
751 | ARRAY_SIZE(rk3066_cpuclk_rates)); | ||
660 | } | 752 | } |
661 | CLK_OF_DECLARE(rk3066a_cru, "rockchip,rk3066a-cru", rk3066a_clk_init); | 753 | CLK_OF_DECLARE(rk3066a_cru, "rockchip,rk3066a-cru", rk3066a_clk_init); |
662 | 754 | ||
@@ -672,6 +764,10 @@ static void __init rk3188a_clk_init(struct device_node *np) | |||
672 | RK3188_GRF_SOC_STATUS); | 764 | RK3188_GRF_SOC_STATUS); |
673 | rockchip_clk_register_branches(rk3188_clk_branches, | 765 | rockchip_clk_register_branches(rk3188_clk_branches, |
674 | ARRAY_SIZE(rk3188_clk_branches)); | 766 | ARRAY_SIZE(rk3188_clk_branches)); |
767 | rockchip_clk_register_armclk(ARMCLK, "armclk", | ||
768 | mux_armclk_p, ARRAY_SIZE(mux_armclk_p), | ||
769 | &rk3188_cpuclk_data, rk3188_cpuclk_rates, | ||
770 | ARRAY_SIZE(rk3188_cpuclk_rates)); | ||
675 | 771 | ||
676 | /* reparent aclk_cpu_pre from apll */ | 772 | /* reparent aclk_cpu_pre from apll */ |
677 | clk1 = __clk_lookup("aclk_cpu_pre"); | 773 | clk1 = __clk_lookup("aclk_cpu_pre"); |
diff --git a/drivers/clk/rockchip/clk-rk3288.c b/drivers/clk/rockchip/clk-rk3288.c index f6f278b005b9..d053529113f8 100644 --- a/drivers/clk/rockchip/clk-rk3288.c +++ b/drivers/clk/rockchip/clk-rk3288.c | |||
@@ -101,6 +101,70 @@ struct rockchip_pll_rate_table rk3288_pll_rates[] = { | |||
101 | { /* sentinel */ }, | 101 | { /* sentinel */ }, |
102 | }; | 102 | }; |
103 | 103 | ||
104 | #define RK3288_DIV_ACLK_CORE_M0_MASK 0xf | ||
105 | #define RK3288_DIV_ACLK_CORE_M0_SHIFT 0 | ||
106 | #define RK3288_DIV_ACLK_CORE_MP_MASK 0xf | ||
107 | #define RK3288_DIV_ACLK_CORE_MP_SHIFT 4 | ||
108 | #define RK3288_DIV_L2RAM_MASK 0x7 | ||
109 | #define RK3288_DIV_L2RAM_SHIFT 0 | ||
110 | #define RK3288_DIV_ATCLK_MASK 0x1f | ||
111 | #define RK3288_DIV_ATCLK_SHIFT 4 | ||
112 | #define RK3288_DIV_PCLK_DBGPRE_MASK 0x1f | ||
113 | #define RK3288_DIV_PCLK_DBGPRE_SHIFT 9 | ||
114 | |||
115 | #define RK3288_CLKSEL0(_core_m0, _core_mp) \ | ||
116 | { \ | ||
117 | .reg = RK3288_CLKSEL_CON(0), \ | ||
118 | .val = HIWORD_UPDATE(_core_m0, RK3288_DIV_ACLK_CORE_M0_MASK, \ | ||
119 | RK3288_DIV_ACLK_CORE_M0_SHIFT) | \ | ||
120 | HIWORD_UPDATE(_core_mp, RK3288_DIV_ACLK_CORE_MP_MASK, \ | ||
121 | RK3288_DIV_ACLK_CORE_MP_SHIFT), \ | ||
122 | } | ||
123 | #define RK3288_CLKSEL37(_l2ram, _atclk, _pclk_dbg_pre) \ | ||
124 | { \ | ||
125 | .reg = RK3288_CLKSEL_CON(37), \ | ||
126 | .val = HIWORD_UPDATE(_l2ram, RK3288_DIV_L2RAM_MASK, \ | ||
127 | RK3288_DIV_L2RAM_SHIFT) | \ | ||
128 | HIWORD_UPDATE(_atclk, RK3288_DIV_ATCLK_MASK, \ | ||
129 | RK3288_DIV_ATCLK_SHIFT) | \ | ||
130 | HIWORD_UPDATE(_pclk_dbg_pre, \ | ||
131 | RK3288_DIV_PCLK_DBGPRE_MASK, \ | ||
132 | RK3288_DIV_PCLK_DBGPRE_SHIFT), \ | ||
133 | } | ||
134 | |||
135 | #define RK3288_CPUCLK_RATE(_prate, _core_m0, _core_mp, _l2ram, _atclk, _pdbg) \ | ||
136 | { \ | ||
137 | .prate = _prate, \ | ||
138 | .divs = { \ | ||
139 | RK3288_CLKSEL0(_core_m0, _core_mp), \ | ||
140 | RK3288_CLKSEL37(_l2ram, _atclk, _pdbg), \ | ||
141 | }, \ | ||
142 | } | ||
143 | |||
144 | static struct rockchip_cpuclk_rate_table rk3288_cpuclk_rates[] __initdata = { | ||
145 | RK3288_CPUCLK_RATE(1800000000, 2, 4, 2, 4, 4), | ||
146 | RK3288_CPUCLK_RATE(1704000000, 2, 4, 2, 4, 4), | ||
147 | RK3288_CPUCLK_RATE(1608000000, 2, 4, 2, 4, 4), | ||
148 | RK3288_CPUCLK_RATE(1512000000, 2, 4, 2, 4, 4), | ||
149 | RK3288_CPUCLK_RATE(1416000000, 2, 4, 2, 4, 4), | ||
150 | RK3288_CPUCLK_RATE(1200000000, 2, 4, 2, 4, 4), | ||
151 | RK3288_CPUCLK_RATE(1008000000, 2, 4, 2, 4, 4), | ||
152 | RK3288_CPUCLK_RATE( 816000000, 2, 4, 2, 4, 4), | ||
153 | RK3288_CPUCLK_RATE( 696000000, 2, 4, 2, 4, 4), | ||
154 | RK3288_CPUCLK_RATE( 600000000, 2, 4, 2, 4, 4), | ||
155 | RK3288_CPUCLK_RATE( 408000000, 2, 4, 2, 4, 4), | ||
156 | RK3288_CPUCLK_RATE( 312000000, 2, 4, 2, 4, 4), | ||
157 | RK3288_CPUCLK_RATE( 216000000, 2, 4, 2, 4, 4), | ||
158 | RK3288_CPUCLK_RATE( 126000000, 2, 4, 2, 4, 4), | ||
159 | }; | ||
160 | |||
161 | static const struct rockchip_cpuclk_reg_data rk3288_cpuclk_data = { | ||
162 | .core_reg = RK3288_CLKSEL_CON(0), | ||
163 | .div_core_shift = 8, | ||
164 | .div_core_mask = 0x1f, | ||
165 | .mux_core_shift = 15, | ||
166 | }; | ||
167 | |||
104 | PNAME(mux_pll_p) = { "xin24m", "xin32k" }; | 168 | PNAME(mux_pll_p) = { "xin24m", "xin32k" }; |
105 | PNAME(mux_armclk_p) = { "apll_core", "gpll_core" }; | 169 | PNAME(mux_armclk_p) = { "apll_core", "gpll_core" }; |
106 | PNAME(mux_ddrphy_p) = { "dpll_ddr", "gpll_ddr" }; | 170 | PNAME(mux_ddrphy_p) = { "dpll_ddr", "gpll_ddr" }; |
@@ -166,8 +230,6 @@ static struct rockchip_clk_branch rk3288_clk_branches[] __initdata = { | |||
166 | RK3288_CLKGATE_CON(0), 1, GFLAGS), | 230 | RK3288_CLKGATE_CON(0), 1, GFLAGS), |
167 | GATE(0, "gpll_core", "gpll", 0, | 231 | GATE(0, "gpll_core", "gpll", 0, |
168 | RK3288_CLKGATE_CON(0), 2, GFLAGS), | 232 | RK3288_CLKGATE_CON(0), 2, GFLAGS), |
169 | COMPOSITE_NOGATE(0, "armclk", mux_armclk_p, 0, | ||
170 | RK3288_CLKSEL_CON(0), 15, 1, MFLAGS, 8, 5, DFLAGS), | ||
171 | 233 | ||
172 | COMPOSITE_NOMUX(0, "armcore0", "armclk", 0, | 234 | COMPOSITE_NOMUX(0, "armcore0", "armclk", 0, |
173 | RK3288_CLKSEL_CON(36), 0, 3, DFLAGS | CLK_DIVIDER_READ_ONLY, | 235 | RK3288_CLKSEL_CON(36), 0, 3, DFLAGS | CLK_DIVIDER_READ_ONLY, |
@@ -739,6 +801,11 @@ static void __init rk3288_clk_init(struct device_node *np) | |||
739 | rockchip_clk_protect_critical(rk3288_critical_clocks, | 801 | rockchip_clk_protect_critical(rk3288_critical_clocks, |
740 | ARRAY_SIZE(rk3288_critical_clocks)); | 802 | ARRAY_SIZE(rk3288_critical_clocks)); |
741 | 803 | ||
804 | rockchip_clk_register_armclk(ARMCLK, "armclk", | ||
805 | mux_armclk_p, ARRAY_SIZE(mux_armclk_p), | ||
806 | &rk3288_cpuclk_data, rk3288_cpuclk_rates, | ||
807 | ARRAY_SIZE(rk3288_cpuclk_rates)); | ||
808 | |||
742 | rockchip_register_softrst(np, 12, reg_base + RK3288_SOFTRST_CON(0), | 809 | rockchip_register_softrst(np, 12, reg_base + RK3288_SOFTRST_CON(0), |
743 | ROCKCHIP_SOFTRST_HIWORD_MASK); | 810 | ROCKCHIP_SOFTRST_HIWORD_MASK); |
744 | } | 811 | } |