| @@ -1,14 +1,14 @@ | | | @@ -1,14 +1,14 @@ |
1 | /* $NetBSD: rk3399_cru.c,v 1.2 2018/08/12 19:28:41 jmcneill Exp $ */ | | 1 | /* $NetBSD: rk3399_cru.c,v 1.3 2018/09/01 19:35:53 jmcneill Exp $ */ |
2 | | | 2 | |
3 | /*- | | 3 | /*- |
4 | * Copyright (c) 2018 Jared McNeill <jmcneill@invisible.ca> | | 4 | * Copyright (c) 2018 Jared McNeill <jmcneill@invisible.ca> |
5 | * All rights reserved. | | 5 | * All rights reserved. |
6 | * | | 6 | * |
7 | * Redistribution and use in source and binary forms, with or without | | 7 | * Redistribution and use in source and binary forms, with or without |
8 | * modification, are permitted provided that the following conditions | | 8 | * modification, are permitted provided that the following conditions |
9 | * are met: | | 9 | * are met: |
10 | * 1. Redistributions of source code must retain the above copyright | | 10 | * 1. Redistributions of source code must retain the above copyright |
11 | * notice, this list of conditions and the following disclaimer. | | 11 | * notice, this list of conditions and the following disclaimer. |
12 | * 2. Redistributions in binary form must reproduce the above copyright | | 12 | * 2. Redistributions in binary form must reproduce the above copyright |
13 | * notice, this list of conditions and the following disclaimer in the | | 13 | * notice, this list of conditions and the following disclaimer in the |
14 | * documentation and/or other materials provided with the distribution. | | 14 | * documentation and/or other materials provided with the distribution. |
| @@ -18,27 +18,27 @@ | | | @@ -18,27 +18,27 @@ |
18 | * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. | | 18 | * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
19 | * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, | | 19 | * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
20 | * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, | | 20 | * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, |
21 | * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; | | 21 | * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; |
22 | * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED | | 22 | * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED |
23 | * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, | | 23 | * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, |
24 | * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY | | 24 | * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY |
25 | * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF | | 25 | * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF |
26 | * SUCH DAMAGE. | | 26 | * SUCH DAMAGE. |
27 | */ | | 27 | */ |
28 | | | 28 | |
29 | #include <sys/cdefs.h> | | 29 | #include <sys/cdefs.h> |
30 | | | 30 | |
31 | __KERNEL_RCSID(1, "$NetBSD: rk3399_cru.c,v 1.2 2018/08/12 19:28:41 jmcneill Exp $"); | | 31 | __KERNEL_RCSID(1, "$NetBSD: rk3399_cru.c,v 1.3 2018/09/01 19:35:53 jmcneill Exp $"); |
32 | | | 32 | |
33 | #include <sys/param.h> | | 33 | #include <sys/param.h> |
34 | #include <sys/bus.h> | | 34 | #include <sys/bus.h> |
35 | #include <sys/device.h> | | 35 | #include <sys/device.h> |
36 | #include <sys/systm.h> | | 36 | #include <sys/systm.h> |
37 | | | 37 | |
38 | #include <dev/fdt/fdtvar.h> | | 38 | #include <dev/fdt/fdtvar.h> |
39 | | | 39 | |
40 | #include <arm/rockchip/rk_cru.h> | | 40 | #include <arm/rockchip/rk_cru.h> |
41 | #include <arm/rockchip/rk3399_cru.h> | | 41 | #include <arm/rockchip/rk3399_cru.h> |
42 | | | 42 | |
43 | #define PLL_CON(n) (0x0000 + (n) * 4) | | 43 | #define PLL_CON(n) (0x0000 + (n) * 4) |
44 | #define CLKSEL_CON(n) (0x0100 + (n) * 4) | | 44 | #define CLKSEL_CON(n) (0x0100 + (n) * 4) |
| @@ -129,26 +129,87 @@ static const struct rk_cru_pll_rate pll_ | | | @@ -129,26 +129,87 @@ static const struct rk_cru_pll_rate pll_ |
129 | RK_PLL_RATE( 216000000, 1, 72, 4, 2, 1, 0), | | 129 | RK_PLL_RATE( 216000000, 1, 72, 4, 2, 1, 0), |
130 | RK_PLL_RATE( 148500000, 1, 99, 4, 4, 1, 0), | | 130 | RK_PLL_RATE( 148500000, 1, 99, 4, 4, 1, 0), |
131 | RK_PLL_RATE( 106500000, 1, 71, 4, 4, 1, 0), | | 131 | RK_PLL_RATE( 106500000, 1, 71, 4, 4, 1, 0), |
132 | RK_PLL_RATE( 96000000, 1, 64, 4, 4, 1, 0), | | 132 | RK_PLL_RATE( 96000000, 1, 64, 4, 4, 1, 0), |
133 | RK_PLL_RATE( 74250000, 2, 99, 4, 4, 1, 0), | | 133 | RK_PLL_RATE( 74250000, 2, 99, 4, 4, 1, 0), |
134 | RK_PLL_RATE( 65000000, 1, 65, 6, 4, 1, 0), | | 134 | RK_PLL_RATE( 65000000, 1, 65, 6, 4, 1, 0), |
135 | RK_PLL_RATE( 54000000, 1, 54, 6, 4, 1, 0), | | 135 | RK_PLL_RATE( 54000000, 1, 54, 6, 4, 1, 0), |
136 | RK_PLL_RATE( 27000000, 1, 27, 6, 4, 1, 0), | | 136 | RK_PLL_RATE( 27000000, 1, 27, 6, 4, 1, 0), |
137 | }; | | 137 | }; |
138 | | | 138 | |
139 | static const struct rk_cru_pll_rate pll_norates[] = { | | 139 | static const struct rk_cru_pll_rate pll_norates[] = { |
140 | }; | | 140 | }; |
141 | | | 141 | |
| | | 142 | #define RK3399_ACLKM_MASK __BITS(12,8) |
| | | 143 | #define RK3399_ATCLK_MASK __BITS(4,0) |
| | | 144 | #define RK3399_PDBG_MASK __BITS(12,8) |
| | | 145 | |
| | | 146 | #define RK3399_CPUL_RATE(_rate, _aclkm, _atclk, _pdbg) \ |
| | | 147 | RK_CPU_RATE(_rate, \ |
| | | 148 | CLKSEL_CON(0), RK3399_ACLKM_MASK, \ |
| | | 149 | __SHIFTIN((_aclkm), RK3399_ACLKM_MASK), \ |
| | | 150 | CLKSEL_CON(1), RK3399_ATCLK_MASK|RK3399_PDBG_MASK, \ |
| | | 151 | __SHIFTIN((_atclk), RK3399_ATCLK_MASK)|__SHIFTIN((_pdbg), RK3399_PDBG_MASK)) |
| | | 152 | |
| | | 153 | #define RK3399_CPUB_RATE(_rate, _aclkm, _atclk, _pdbg) \ |
| | | 154 | RK_CPU_RATE(_rate, \ |
| | | 155 | CLKSEL_CON(2), RK3399_ACLKM_MASK, \ |
| | | 156 | __SHIFTIN((_aclkm), RK3399_ACLKM_MASK), \ |
| | | 157 | CLKSEL_CON(3), RK3399_ATCLK_MASK|RK3399_PDBG_MASK, \ |
| | | 158 | __SHIFTIN((_atclk), RK3399_ATCLK_MASK)|__SHIFTIN((_pdbg), RK3399_PDBG_MASK)) |
| | | 159 | |
| | | 160 | static const struct rk_cru_cpu_rate armclkl_rates[] = { |
| | | 161 | RK3399_CPUL_RATE(1800000000, 1, 8, 8), |
| | | 162 | RK3399_CPUL_RATE(1704000000, 1, 8, 8), |
| | | 163 | RK3399_CPUL_RATE(1608000000, 1, 7, 7), |
| | | 164 | RK3399_CPUL_RATE(1512000000, 1, 7, 7), |
| | | 165 | RK3399_CPUL_RATE(1488000000, 1, 6, 6), |
| | | 166 | RK3399_CPUL_RATE(1416000000, 1, 6, 6), |
| | | 167 | RK3399_CPUL_RATE(1200000000, 1, 5, 5), |
| | | 168 | RK3399_CPUL_RATE(1008000000, 1, 4, 4), |
| | | 169 | RK3399_CPUL_RATE( 816000000, 1, 3, 3), |
| | | 170 | RK3399_CPUL_RATE( 696000000, 1, 3, 3), |
| | | 171 | RK3399_CPUL_RATE( 600000000, 1, 2, 2), |
| | | 172 | RK3399_CPUL_RATE( 408000000, 1, 1, 1), |
| | | 173 | RK3399_CPUL_RATE( 312000000, 1, 1, 1), |
| | | 174 | RK3399_CPUL_RATE( 216000000, 1, 1, 1), |
| | | 175 | RK3399_CPUL_RATE( 96000000, 1, 1, 1), |
| | | 176 | }; |
| | | 177 | |
| | | 178 | static const struct rk_cru_cpu_rate armclkb_rates[] = { |
| | | 179 | RK3399_CPUB_RATE(2208000000, 1, 11, 11), |
| | | 180 | RK3399_CPUB_RATE(2184000000, 1, 11, 11), |
| | | 181 | RK3399_CPUB_RATE(2088000000, 1, 10, 10), |
| | | 182 | RK3399_CPUB_RATE(2040000000, 1, 10, 10), |
| | | 183 | RK3399_CPUB_RATE(2016000000, 1, 9, 9), |
| | | 184 | RK3399_CPUB_RATE(1992000000, 1, 9, 9), |
| | | 185 | RK3399_CPUB_RATE(1896000000, 1, 9, 9), |
| | | 186 | RK3399_CPUB_RATE(1800000000, 1, 8, 8), |
| | | 187 | RK3399_CPUB_RATE(1704000000, 1, 8, 8), |
| | | 188 | RK3399_CPUB_RATE(1608000000, 1, 7, 7), |
| | | 189 | RK3399_CPUB_RATE(1512000000, 1, 7, 7), |
| | | 190 | RK3399_CPUB_RATE(1488000000, 1, 6, 6), |
| | | 191 | RK3399_CPUB_RATE(1416000000, 1, 6, 6), |
| | | 192 | RK3399_CPUB_RATE(1200000000, 1, 5, 5), |
| | | 193 | RK3399_CPUB_RATE(1008000000, 1, 5, 5), |
| | | 194 | RK3399_CPUB_RATE( 816000000, 1, 4, 4), |
| | | 195 | RK3399_CPUB_RATE( 696000000, 1, 3, 3), |
| | | 196 | RK3399_CPUB_RATE( 600000000, 1, 3, 3), |
| | | 197 | RK3399_CPUB_RATE( 408000000, 1, 2, 2), |
| | | 198 | RK3399_CPUB_RATE( 312000000, 1, 1, 1), |
| | | 199 | RK3399_CPUB_RATE( 216000000, 1, 1, 1), |
| | | 200 | RK3399_CPUB_RATE( 96000000, 1, 1, 1), |
| | | 201 | }; |
| | | 202 | |
142 | #define PLL_CON0 0x00 | | 203 | #define PLL_CON0 0x00 |
143 | #define PLL_FBDIV __BITS(11,0) | | 204 | #define PLL_FBDIV __BITS(11,0) |
144 | | | 205 | |
145 | #define PLL_CON1 0x04 | | 206 | #define PLL_CON1 0x04 |
146 | #define PLL_POSTDIV2 __BITS(14,12) | | 207 | #define PLL_POSTDIV2 __BITS(14,12) |
147 | #define PLL_POSTDIV1 __BITS(10,8) | | 208 | #define PLL_POSTDIV1 __BITS(10,8) |
148 | #define PLL_REFDIV __BITS(5,0) | | 209 | #define PLL_REFDIV __BITS(5,0) |
149 | | | 210 | |
150 | #define PLL_CON2 0x08 | | 211 | #define PLL_CON2 0x08 |
151 | #define PLL_LOCK __BIT(31) | | 212 | #define PLL_LOCK __BIT(31) |
152 | #define PLL_FRACDIV __BITS(23,0) | | 213 | #define PLL_FRACDIV __BITS(23,0) |
153 | | | 214 | |
154 | #define PLL_CON3 0x0c | | 215 | #define PLL_CON3 0x0c |
| @@ -219,84 +280,81 @@ rk3399_cru_pll_set_rate(struct rk_cru_so | | | @@ -219,84 +280,81 @@ rk3399_cru_pll_set_rate(struct rk_cru_so |
219 | | | 280 | |
220 | for (int i = 0; i < pll->nrates; i++) | | 281 | for (int i = 0; i < pll->nrates; i++) |
221 | if (pll->rates[i].rate == rate) { | | 282 | if (pll->rates[i].rate == rate) { |
222 | pll_rate = &pll->rates[i]; | | 283 | pll_rate = &pll->rates[i]; |
223 | break; | | 284 | break; |
224 | } | | 285 | } |
225 | if (pll_rate == NULL) | | 286 | if (pll_rate == NULL) |
226 | return EINVAL; | | 287 | return EINVAL; |
227 | | | 288 | |
228 | val = __SHIFTIN(PLL_WORK_MODE_SLOW, PLL_WORK_MODE) | (PLL_WORK_MODE << 16); | | 289 | val = __SHIFTIN(PLL_WORK_MODE_SLOW, PLL_WORK_MODE) | (PLL_WORK_MODE << 16); |
229 | CRU_WRITE(sc, pll->con_base + PLL_CON3, val); | | 290 | CRU_WRITE(sc, pll->con_base + PLL_CON3, val); |
230 | | | 291 | |
231 | CRU_WRITE(sc, pll->con_base + PLL_CON0, | | 292 | CRU_WRITE(sc, pll->con_base + PLL_CON0, |
232 | __SHIFTIN(pll_rate->fbdiv, PLL_FBDIV) | | | 293 | __SHIFTIN(pll_rate->fbdiv, PLL_FBDIV) | (PLL_FBDIV << 16)); |
233 | PLL_WRITE_MASK); | | | |
234 | | | 294 | |
235 | CRU_WRITE(sc, pll->con_base + PLL_CON1, | | 295 | CRU_WRITE(sc, pll->con_base + PLL_CON1, |
236 | __SHIFTIN(pll_rate->postdiv2, PLL_POSTDIV2) | | | 296 | __SHIFTIN(pll_rate->postdiv2, PLL_POSTDIV2) | |
237 | __SHIFTIN(pll_rate->postdiv1, PLL_POSTDIV1) | | | 297 | __SHIFTIN(pll_rate->postdiv1, PLL_POSTDIV1) | |
238 | __SHIFTIN(pll_rate->refdiv, PLL_REFDIV) | | | 298 | __SHIFTIN(pll_rate->refdiv, PLL_REFDIV) | |
239 | PLL_WRITE_MASK); | | 299 | ((PLL_POSTDIV2 | PLL_POSTDIV1 | PLL_REFDIV) << 16)); |
240 | | | 300 | |
241 | val = CRU_READ(sc, pll->con_base + PLL_CON2); | | 301 | val = CRU_READ(sc, pll->con_base + PLL_CON2); |
242 | val &= ~PLL_FRACDIV; | | 302 | val &= ~PLL_FRACDIV; |
243 | val |= __SHIFTIN(pll_rate->fracdiv, PLL_FRACDIV); | | 303 | val |= __SHIFTIN(pll_rate->fracdiv, PLL_FRACDIV); |
244 | CRU_WRITE(sc, pll->con_base + PLL_CON2, val); | | 304 | CRU_WRITE(sc, pll->con_base + PLL_CON2, val); |
245 | | | 305 | |
246 | val = __SHIFTIN(pll_rate->dsmpd, PLL_DSMPD) | (PLL_DSMPD << 16); | | 306 | val = __SHIFTIN(pll_rate->dsmpd, PLL_DSMPD) | (PLL_DSMPD << 16); |
247 | CRU_WRITE(sc, pll->con_base + PLL_CON3, val); | | 307 | CRU_WRITE(sc, pll->con_base + PLL_CON3, val); |
248 | | | 308 | |
249 | /* Set PLL work mode to normal */ | | | |
250 | const uint32_t write_mask = pll->mode_mask << 16; | | | |
251 | const uint32_t write_val = pll->mode_mask; | | | |
252 | CRU_WRITE(sc, pll->mode_reg, write_mask | write_val); | | | |
253 | | | | |
254 | for (retry = 1000; retry > 0; retry--) { | | 309 | for (retry = 1000; retry > 0; retry--) { |
255 | if (CRU_READ(sc, pll->con_base + PLL_CON2) & pll->lock_mask) | | 310 | if (CRU_READ(sc, pll->con_base + PLL_CON2) & pll->lock_mask) |
256 | break; | | 311 | break; |
257 | delay(1); | | 312 | delay(1); |
258 | } | | 313 | } |
259 | | | 314 | |
260 | if (retry == 0) | | 315 | if (retry == 0) |
261 | device_printf(sc->sc_dev, "WARNING: %s failed to lock\n", | | 316 | device_printf(sc->sc_dev, "WARNING: %s failed to lock\n", |
262 | clk->base.name); | | 317 | clk->base.name); |
263 | | | 318 | |
| | | 319 | /* Set PLL work mode to normal */ |
264 | val = __SHIFTIN(PLL_WORK_MODE_NORMAL, PLL_WORK_MODE) | (PLL_WORK_MODE << 16); | | 320 | val = __SHIFTIN(PLL_WORK_MODE_NORMAL, PLL_WORK_MODE) | (PLL_WORK_MODE << 16); |
265 | CRU_WRITE(sc, pll->con_base + PLL_CON3, val); | | 321 | CRU_WRITE(sc, pll->con_base + PLL_CON3, val); |
266 | | | 322 | |
267 | return 0; | | 323 | return 0; |
268 | } | | 324 | } |
269 | | | 325 | |
270 | #define RK3399_PLL(_id, _name, _parents, _con_base, _mode_reg, _mode_mask, _lock_mask, _rates) \ | | 326 | #define RK3399_PLL(_id, _name, _parents, _con_base, _mode_reg, _mode_mask, _lock_mask, _rates) \ |
271 | { \ | | 327 | { \ |
272 | .id = (_id), \ | | 328 | .id = (_id), \ |
273 | .type = RK_CRU_PLL, \ | | 329 | .type = RK_CRU_PLL, \ |
274 | .base.name = (_name), \ | | 330 | .base.name = (_name), \ |
275 | .base.flags = 0, \ | | 331 | .base.flags = 0, \ |
276 | .u.pll.parents = (_parents), \ | | 332 | .u.pll.parents = (_parents), \ |
277 | .u.pll.nparents = __arraycount(_parents), \ | | 333 | .u.pll.nparents = __arraycount(_parents), \ |
278 | .u.pll.con_base = (_con_base), \ | | 334 | .u.pll.con_base = (_con_base), \ |
279 | .u.pll.mode_reg = (_mode_reg), \ | | 335 | .u.pll.mode_reg = (_mode_reg), \ |
280 | .u.pll.mode_mask = (_mode_mask), \ | | 336 | .u.pll.mode_mask = (_mode_mask), \ |
281 | .u.pll.lock_mask = (_lock_mask), \ | | 337 | .u.pll.lock_mask = (_lock_mask), \ |
282 | .u.pll.rates = (_rates), \ | | 338 | .u.pll.rates = (_rates), \ |
283 | .u.pll.nrates = __arraycount(_rates), \ | | 339 | .u.pll.nrates = __arraycount(_rates), \ |
284 | .get_rate = rk3399_cru_pll_get_rate, \ | | 340 | .get_rate = rk3399_cru_pll_get_rate, \ |
285 | .set_rate = rk3399_cru_pll_set_rate, \ | | 341 | .set_rate = rk3399_cru_pll_set_rate, \ |
286 | .get_parent = rk_cru_pll_get_parent, \ | | 342 | .get_parent = rk_cru_pll_get_parent, \ |
287 | } | | 343 | } |
288 | | | 344 | |
289 | static const char * pll_parents[] = { "xin24m", "xin32k" }; | | 345 | static const char * pll_parents[] = { "xin24m", "xin32k" }; |
| | | 346 | static const char * armclkl_parents[] = { "clk_core_l_lpll_src", "clk_core_l_bpll_src", "clk_core_l_dpll_src", "clk_core_l_gpll_src" }; |
| | | 347 | static const char * armclkb_parents[] = { "clk_core_b_lpll_src", "clk_core_b_bpll_src", "clk_core_b_dpll_src", "clk_core_b_gpll_src" }; |
290 | static const char * mux_pll_src_cpll_gpll_parents[] = { "cpll", "gpll" }; | | 348 | static const char * mux_pll_src_cpll_gpll_parents[] = { "cpll", "gpll" }; |
291 | static const char * mux_pll_src_cpll_gpll_npll_parents[] = { "cpll", "gpll", "npll" }; | | 349 | static const char * mux_pll_src_cpll_gpll_npll_parents[] = { "cpll", "gpll", "npll" }; |
292 | static const char * mux_pll_src_cpll_gpll_upll_parents[] = { "cpll", "gpll", "upll" }; | | 350 | static const char * mux_pll_src_cpll_gpll_upll_parents[] = { "cpll", "gpll", "upll" }; |
293 | static const char * mux_pll_src_cpll_gpll_npll_ppll_upll_24m_parents[] = { "cpll", "gpll", "npll", "ppll", "upll", "xin24m" }; | | 351 | static const char * mux_pll_src_cpll_gpll_npll_ppll_upll_24m_parents[] = { "cpll", "gpll", "npll", "ppll", "upll", "xin24m" }; |
294 | static const char * mux_aclk_perilp0_parents[] = { "cpll_aclk_perilp0_src", "gpll_aclk_perilp0_src" }; | | 352 | static const char * mux_aclk_perilp0_parents[] = { "cpll_aclk_perilp0_src", "gpll_aclk_perilp0_src" }; |
295 | static const char * mux_hclk_perilp1_parents[] = { "cpll_hclk_perilp1_src", "gpll_hclk_perilp1_src" }; | | 353 | static const char * mux_hclk_perilp1_parents[] = { "cpll_hclk_perilp1_src", "gpll_hclk_perilp1_src" }; |
296 | static const char * mux_aclk_perihp_parents[] = { "cpll_aclk_perihp_src", "gpll_aclk_perihp_src" }; | | 354 | static const char * mux_aclk_perihp_parents[] = { "cpll_aclk_perihp_src", "gpll_aclk_perihp_src" }; |
297 | static const char * mux_aclk_cci_parents[] = { "cpll_aclk_cci_src", "gpll_aclk_cci_src", "npll_aclk_cci_src", "vpll_aclk_cci_src" }; | | 355 | static const char * mux_aclk_cci_parents[] = { "cpll_aclk_cci_src", "gpll_aclk_cci_src", "npll_aclk_cci_src", "vpll_aclk_cci_src" }; |
298 | static const char * mux_uart0_parents[] = { "clk_uart0_div", "clk_uart0_frac", "xin24m" }; | | 356 | static const char * mux_uart0_parents[] = { "clk_uart0_div", "clk_uart0_frac", "xin24m" }; |
299 | static const char * mux_uart1_parents[] = { "clk_uart1_div", "clk_uart1_frac", "xin24m" }; | | 357 | static const char * mux_uart1_parents[] = { "clk_uart1_div", "clk_uart1_frac", "xin24m" }; |
300 | static const char * mux_uart2_parents[] = { "clk_uart2_div", "clk_uart2_frac", "xin24m" }; | | 358 | static const char * mux_uart2_parents[] = { "clk_uart2_div", "clk_uart2_frac", "xin24m" }; |
301 | static const char * mux_uart3_parents[] = { "clk_uart3_div", "clk_uart3_frac", "xin24m" }; | | 359 | static const char * mux_uart3_parents[] = { "clk_uart3_div", "clk_uart3_frac", "xin24m" }; |
302 | static const char * mux_rmii_parents[] = { "clk_gmac", "clkin_gmac" }; | | 360 | static const char * mux_rmii_parents[] = { "clk_gmac", "clkin_gmac" }; |
| @@ -336,26 +394,48 @@ static struct rk_cru_clk rk3399_cru_clks | | | @@ -336,26 +394,48 @@ static struct rk_cru_clk rk3399_cru_clks |
336 | RK3399_PLL(RK3399_PLL_NPLL, "npll", pll_parents, | | 394 | RK3399_PLL(RK3399_PLL_NPLL, "npll", pll_parents, |
337 | PLL_CON(40), /* con_base */ | | 395 | PLL_CON(40), /* con_base */ |
338 | PLL_CON(43), /* mode_reg */ | | 396 | PLL_CON(43), /* mode_reg */ |
339 | __BIT(8), /* mode_mask */ | | 397 | __BIT(8), /* mode_mask */ |
340 | __BIT(31), /* lock_mask */ | | 398 | __BIT(31), /* lock_mask */ |
341 | pll_rates), | | 399 | pll_rates), |
342 | RK3399_PLL(RK3399_PLL_VPLL, "vpll", pll_parents, | | 400 | RK3399_PLL(RK3399_PLL_VPLL, "vpll", pll_parents, |
343 | PLL_CON(43), /* con_base */ | | 401 | PLL_CON(43), /* con_base */ |
344 | PLL_CON(51), /* mode_reg */ | | 402 | PLL_CON(51), /* mode_reg */ |
345 | __BIT(8), /* mode_mask */ | | 403 | __BIT(8), /* mode_mask */ |
346 | __BIT(31), /* lock_mask */ | | 404 | __BIT(31), /* lock_mask */ |
347 | pll_rates), | | 405 | pll_rates), |
348 | | | 406 | |
| | | 407 | RK_GATE(0, "clk_core_l_lpll_src", "lpll", CLKGATE_CON(0), 0), |
| | | 408 | RK_GATE(0, "clk_core_l_bpll_src", "bpll", CLKGATE_CON(0), 1), |
| | | 409 | RK_GATE(0, "clk_core_l_dpll_src", "dpll", CLKGATE_CON(0), 2), |
| | | 410 | RK_GATE(0, "clk_core_l_gpll_src", "gpll", CLKGATE_CON(0), 3), |
| | | 411 | |
| | | 412 | RK_CPU(RK3399_ARMCLKL, "armclkl", armclkl_parents, |
| | | 413 | CLKSEL_CON(0), /* reg */ |
| | | 414 | __BITS(7,6), 0, 3, /* mux_mask, mux_main, mux_alt */ |
| | | 415 | __BITS(4,0), /* div_mask */ |
| | | 416 | armclkl_rates), |
| | | 417 | |
| | | 418 | RK_GATE(0, "clk_core_b_lpll_src", "lpll", CLKGATE_CON(1), 0), |
| | | 419 | RK_GATE(0, "clk_core_b_bpll_src", "bpll", CLKGATE_CON(1), 1), |
| | | 420 | RK_GATE(0, "clk_core_b_dpll_src", "dpll", CLKGATE_CON(1), 2), |
| | | 421 | RK_GATE(0, "clk_core_b_gpll_src", "gpll", CLKGATE_CON(1), 3), |
| | | 422 | |
| | | 423 | RK_CPU(RK3399_ARMCLKB, "armclkb", armclkb_parents, |
| | | 424 | CLKSEL_CON(2), /* reg */ |
| | | 425 | __BITS(7,6), 1, 3, /* mux_mask, mux_main, mux_alt */ |
| | | 426 | __BITS(4,0), /* div_mask */ |
| | | 427 | armclkb_rates), |
| | | 428 | |
349 | /* | | 429 | /* |
350 | * perilp0 | | 430 | * perilp0 |
351 | */ | | 431 | */ |
352 | RK_GATE(0, "gpll_aclk_perilp0_src", "gpll", CLKGATE_CON(7), 0), | | 432 | RK_GATE(0, "gpll_aclk_perilp0_src", "gpll", CLKGATE_CON(7), 0), |
353 | RK_GATE(0, "cpll_aclk_perilp0_src", "cpll", CLKGATE_CON(7), 1), | | 433 | RK_GATE(0, "cpll_aclk_perilp0_src", "cpll", CLKGATE_CON(7), 1), |
354 | RK_COMPOSITE(RK3399_ACLK_PERILP0, "aclk_perilp0", mux_aclk_perilp0_parents, | | 434 | RK_COMPOSITE(RK3399_ACLK_PERILP0, "aclk_perilp0", mux_aclk_perilp0_parents, |
355 | CLKSEL_CON(23), /* muxdiv_reg */ | | 435 | CLKSEL_CON(23), /* muxdiv_reg */ |
356 | __BIT(7), /* mux_mask */ | | 436 | __BIT(7), /* mux_mask */ |
357 | __BITS(4,0), /* div_mask */ | | 437 | __BITS(4,0), /* div_mask */ |
358 | CLKGATE_CON(7), /* gate_reg */ | | 438 | CLKGATE_CON(7), /* gate_reg */ |
359 | __BIT(2), /* gate_mask */ | | 439 | __BIT(2), /* gate_mask */ |
360 | 0), | | 440 | 0), |
361 | RK_COMPOSITE_NOMUX(RK3399_HCLK_PERILP0, "hclk_perilp0", "aclk_perilp0", | | 441 | RK_COMPOSITE_NOMUX(RK3399_HCLK_PERILP0, "hclk_perilp0", "aclk_perilp0", |