1 1.27 rjs /* $NetBSD: rk3399_cru.c,v 1.27 2025/06/03 19:34:47 rjs Exp $ */ 2 1.1 jmcneill 3 1.1 jmcneill /*- 4 1.1 jmcneill * Copyright (c) 2018 Jared McNeill <jmcneill (at) invisible.ca> 5 1.1 jmcneill * All rights reserved. 6 1.1 jmcneill * 7 1.1 jmcneill * Redistribution and use in source and binary forms, with or without 8 1.1 jmcneill * modification, are permitted provided that the following conditions 9 1.1 jmcneill * are met: 10 1.1 jmcneill * 1. Redistributions of source code must retain the above copyright 11 1.1 jmcneill * notice, this list of conditions and the following disclaimer. 12 1.1 jmcneill * 2. Redistributions in binary form must reproduce the above copyright 13 1.1 jmcneill * notice, this list of conditions and the following disclaimer in the 14 1.1 jmcneill * documentation and/or other materials provided with the distribution. 15 1.1 jmcneill * 16 1.1 jmcneill * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR 17 1.1 jmcneill * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES 18 1.1 jmcneill * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. 19 1.1 jmcneill * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, 20 1.1 jmcneill * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, 21 1.1 jmcneill * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; 22 1.1 jmcneill * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED 23 1.1 jmcneill * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, 24 1.1 jmcneill * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 25 1.1 jmcneill * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 26 1.1 jmcneill * SUCH DAMAGE. 27 1.1 jmcneill */ 28 1.1 jmcneill 29 1.1 jmcneill #include <sys/cdefs.h> 30 1.1 jmcneill 31 1.27 rjs __KERNEL_RCSID(1, "$NetBSD: rk3399_cru.c,v 1.27 2025/06/03 19:34:47 rjs Exp $"); 32 1.1 jmcneill 33 1.1 jmcneill #include <sys/param.h> 34 1.1 jmcneill #include <sys/bus.h> 35 1.1 jmcneill #include <sys/device.h> 36 1.1 jmcneill #include <sys/systm.h> 37 1.1 jmcneill 38 1.1 jmcneill #include <dev/fdt/fdtvar.h> 39 1.1 jmcneill 40 1.1 jmcneill #include <arm/rockchip/rk_cru.h> 41 1.1 jmcneill #include <arm/rockchip/rk3399_cru.h> 42 1.1 jmcneill 43 1.1 jmcneill #define PLL_CON(n) (0x0000 + (n) * 4) 44 1.1 jmcneill #define CLKSEL_CON(n) (0x0100 + (n) * 4) 45 1.1 jmcneill #define CLKGATE_CON(n) (0x0300 + (n) * 4) 46 1.1 jmcneill #define SOFTRST_CON(n) (0x0400 + (n) * 4) 47 1.1 jmcneill 48 1.1 jmcneill static int rk3399_cru_match(device_t, cfdata_t, void *); 49 1.1 jmcneill static void rk3399_cru_attach(device_t, device_t, void *); 50 1.1 jmcneill 51 1.21 thorpej static const struct device_compatible_entry compat_data[] = { 52 1.21 thorpej { .compat = "rockchip,rk3399-cru" }, 53 1.21 thorpej DEVICE_COMPAT_EOL 54 1.1 jmcneill }; 55 1.1 jmcneill 56 1.1 jmcneill CFATTACH_DECL_NEW(rk3399_cru, sizeof(struct rk_cru_softc), 57 1.1 jmcneill rk3399_cru_match, rk3399_cru_attach, NULL, NULL); 58 1.1 jmcneill 59 1.1 jmcneill static const struct rk_cru_pll_rate pll_rates[] = { 60 1.1 jmcneill RK_PLL_RATE(2208000000, 1, 92, 1, 1, 1, 0), 61 1.1 jmcneill RK_PLL_RATE(2184000000, 1, 91, 1, 1, 1, 0), 62 1.1 jmcneill RK_PLL_RATE(2160000000, 1, 90, 1, 1, 1, 0), 63 1.1 jmcneill RK_PLL_RATE(2136000000, 1, 89, 1, 1, 1, 0), 64 1.1 jmcneill RK_PLL_RATE(2112000000, 1, 88, 1, 1, 1, 0), 65 1.1 jmcneill RK_PLL_RATE(2088000000, 1, 87, 1, 1, 1, 0), 66 1.1 jmcneill RK_PLL_RATE(2064000000, 1, 86, 1, 1, 1, 0), 67 1.1 jmcneill RK_PLL_RATE(2040000000, 1, 85, 1, 1, 1, 0), 68 1.1 jmcneill RK_PLL_RATE(2016000000, 1, 84, 1, 1, 1, 0), 69 1.1 jmcneill RK_PLL_RATE(1992000000, 1, 83, 1, 1, 1, 0), 70 1.1 jmcneill RK_PLL_RATE(1968000000, 1, 82, 1, 1, 1, 0), 71 1.1 jmcneill RK_PLL_RATE(1944000000, 1, 81, 1, 1, 1, 0), 72 1.1 jmcneill RK_PLL_RATE(1920000000, 1, 80, 1, 1, 1, 0), 73 1.1 jmcneill RK_PLL_RATE(1896000000, 1, 79, 1, 1, 1, 0), 74 1.1 jmcneill RK_PLL_RATE(1872000000, 1, 78, 1, 1, 1, 0), 75 1.1 jmcneill RK_PLL_RATE(1848000000, 1, 77, 1, 1, 1, 0), 76 1.1 jmcneill RK_PLL_RATE(1824000000, 1, 76, 1, 1, 1, 0), 77 1.1 jmcneill RK_PLL_RATE(1800000000, 1, 75, 1, 1, 1, 0), 78 1.1 jmcneill RK_PLL_RATE(1776000000, 1, 74, 1, 1, 1, 0), 79 1.1 jmcneill RK_PLL_RATE(1752000000, 1, 73, 1, 1, 1, 0), 80 1.1 jmcneill RK_PLL_RATE(1728000000, 1, 72, 1, 1, 1, 0), 81 1.1 jmcneill RK_PLL_RATE(1704000000, 1, 71, 1, 1, 1, 0), 82 1.1 jmcneill RK_PLL_RATE(1680000000, 1, 70, 1, 1, 1, 0), 83 1.1 jmcneill RK_PLL_RATE(1656000000, 1, 69, 1, 1, 1, 0), 84 1.1 jmcneill RK_PLL_RATE(1632000000, 1, 68, 1, 1, 1, 0), 85 1.1 jmcneill RK_PLL_RATE(1608000000, 1, 67, 1, 1, 1, 0), 86 1.1 jmcneill RK_PLL_RATE(1600000000, 3, 200, 1, 1, 1, 0), 87 1.1 jmcneill RK_PLL_RATE(1584000000, 1, 66, 1, 1, 1, 0), 88 1.1 jmcneill RK_PLL_RATE(1560000000, 1, 65, 1, 1, 1, 0), 89 1.1 jmcneill RK_PLL_RATE(1536000000, 1, 64, 1, 1, 1, 0), 90 1.1 jmcneill RK_PLL_RATE(1512000000, 1, 63, 1, 1, 1, 0), 91 1.1 jmcneill RK_PLL_RATE(1488000000, 1, 62, 1, 1, 1, 0), 92 1.1 jmcneill RK_PLL_RATE(1464000000, 1, 61, 1, 1, 1, 0), 93 1.1 jmcneill RK_PLL_RATE(1440000000, 1, 60, 1, 1, 1, 0), 94 1.1 jmcneill RK_PLL_RATE(1416000000, 1, 59, 1, 1, 1, 0), 95 1.1 jmcneill RK_PLL_RATE(1392000000, 1, 58, 1, 1, 1, 0), 96 1.1 jmcneill RK_PLL_RATE(1368000000, 1, 57, 1, 1, 1, 0), 97 1.1 jmcneill RK_PLL_RATE(1344000000, 1, 56, 1, 1, 1, 0), 98 1.1 jmcneill RK_PLL_RATE(1320000000, 1, 55, 1, 1, 1, 0), 99 1.1 jmcneill RK_PLL_RATE(1296000000, 1, 54, 1, 1, 1, 0), 100 1.1 jmcneill RK_PLL_RATE(1272000000, 1, 53, 1, 1, 1, 0), 101 1.1 jmcneill RK_PLL_RATE(1248000000, 1, 52, 1, 1, 1, 0), 102 1.1 jmcneill RK_PLL_RATE(1200000000, 1, 50, 1, 1, 1, 0), 103 1.1 jmcneill RK_PLL_RATE(1188000000, 2, 99, 1, 1, 1, 0), 104 1.1 jmcneill RK_PLL_RATE(1104000000, 1, 46, 1, 1, 1, 0), 105 1.1 jmcneill RK_PLL_RATE(1100000000, 12, 550, 1, 1, 1, 0), 106 1.1 jmcneill RK_PLL_RATE(1008000000, 1, 84, 2, 1, 1, 0), 107 1.1 jmcneill RK_PLL_RATE(1000000000, 1, 125, 3, 1, 1, 0), 108 1.1 jmcneill RK_PLL_RATE( 984000000, 1, 82, 2, 1, 1, 0), 109 1.1 jmcneill RK_PLL_RATE( 960000000, 1, 80, 2, 1, 1, 0), 110 1.1 jmcneill RK_PLL_RATE( 936000000, 1, 78, 2, 1, 1, 0), 111 1.1 jmcneill RK_PLL_RATE( 912000000, 1, 76, 2, 1, 1, 0), 112 1.1 jmcneill RK_PLL_RATE( 900000000, 4, 300, 2, 1, 1, 0), 113 1.1 jmcneill RK_PLL_RATE( 888000000, 1, 74, 2, 1, 1, 0), 114 1.1 jmcneill RK_PLL_RATE( 864000000, 1, 72, 2, 1, 1, 0), 115 1.1 jmcneill RK_PLL_RATE( 840000000, 1, 70, 2, 1, 1, 0), 116 1.1 jmcneill RK_PLL_RATE( 816000000, 1, 68, 2, 1, 1, 0), 117 1.1 jmcneill RK_PLL_RATE( 800000000, 1, 100, 3, 1, 1, 0), 118 1.1 jmcneill RK_PLL_RATE( 700000000, 6, 350, 2, 1, 1, 0), 119 1.1 jmcneill RK_PLL_RATE( 696000000, 1, 58, 2, 1, 1, 0), 120 1.1 jmcneill RK_PLL_RATE( 676000000, 3, 169, 2, 1, 1, 0), 121 1.1 jmcneill RK_PLL_RATE( 600000000, 1, 75, 3, 1, 1, 0), 122 1.1 jmcneill RK_PLL_RATE( 594000000, 1, 99, 4, 1, 1, 0), 123 1.1 jmcneill RK_PLL_RATE( 533250000, 8, 711, 4, 1, 1, 0), 124 1.1 jmcneill RK_PLL_RATE( 504000000, 1, 63, 3, 1, 1, 0), 125 1.1 jmcneill RK_PLL_RATE( 500000000, 6, 250, 2, 1, 1, 0), 126 1.1 jmcneill RK_PLL_RATE( 408000000, 1, 68, 2, 2, 1, 0), 127 1.1 jmcneill RK_PLL_RATE( 312000000, 1, 52, 2, 2, 1, 0), 128 1.1 jmcneill RK_PLL_RATE( 297000000, 1, 99, 4, 2, 1, 0), 129 1.1 jmcneill RK_PLL_RATE( 216000000, 1, 72, 4, 2, 1, 0), 130 1.1 jmcneill RK_PLL_RATE( 148500000, 1, 99, 4, 4, 1, 0), 131 1.1 jmcneill RK_PLL_RATE( 106500000, 1, 71, 4, 4, 1, 0), 132 1.1 jmcneill RK_PLL_RATE( 96000000, 1, 64, 4, 4, 1, 0), 133 1.1 jmcneill RK_PLL_RATE( 74250000, 2, 99, 4, 4, 1, 0), 134 1.1 jmcneill RK_PLL_RATE( 65000000, 1, 65, 6, 4, 1, 0), 135 1.1 jmcneill RK_PLL_RATE( 54000000, 1, 54, 6, 4, 1, 0), 136 1.1 jmcneill RK_PLL_RATE( 27000000, 1, 27, 6, 4, 1, 0), 137 1.1 jmcneill }; 138 1.1 jmcneill 139 1.1 jmcneill static const struct rk_cru_pll_rate pll_norates[] = { 140 1.1 jmcneill }; 141 1.1 jmcneill 142 1.3 jmcneill #define RK3399_ACLKM_MASK __BITS(12,8) 143 1.3 jmcneill #define RK3399_ATCLK_MASK __BITS(4,0) 144 1.3 jmcneill #define RK3399_PDBG_MASK __BITS(12,8) 145 1.3 jmcneill 146 1.24 ryo #define RK3399_CPU_RATE(_rate, _reg0, _reg0_mask, _reg0_val, _reg1, _reg1_mask, _reg1_val)\ 147 1.24 ryo { \ 148 1.24 ryo .rate = (_rate), \ 149 1.24 ryo .divs[0] = { .reg = (_reg0), .mask = (_reg0_mask), .val = (_reg0_val) },\ 150 1.24 ryo .divs[1] = { .reg = (_reg1), .mask = (_reg1_mask), .val = (_reg1_val) },\ 151 1.24 ryo } 152 1.24 ryo 153 1.3 jmcneill #define RK3399_CPUL_RATE(_rate, _aclkm, _atclk, _pdbg) \ 154 1.24 ryo RK3399_CPU_RATE(_rate, \ 155 1.3 jmcneill CLKSEL_CON(0), RK3399_ACLKM_MASK, \ 156 1.3 jmcneill __SHIFTIN((_aclkm), RK3399_ACLKM_MASK), \ 157 1.3 jmcneill CLKSEL_CON(1), RK3399_ATCLK_MASK|RK3399_PDBG_MASK, \ 158 1.3 jmcneill __SHIFTIN((_atclk), RK3399_ATCLK_MASK)|__SHIFTIN((_pdbg), RK3399_PDBG_MASK)) 159 1.3 jmcneill 160 1.3 jmcneill #define RK3399_CPUB_RATE(_rate, _aclkm, _atclk, _pdbg) \ 161 1.24 ryo RK3399_CPU_RATE(_rate, \ 162 1.3 jmcneill CLKSEL_CON(2), RK3399_ACLKM_MASK, \ 163 1.3 jmcneill __SHIFTIN((_aclkm), RK3399_ACLKM_MASK), \ 164 1.3 jmcneill CLKSEL_CON(3), RK3399_ATCLK_MASK|RK3399_PDBG_MASK, \ 165 1.3 jmcneill __SHIFTIN((_atclk), RK3399_ATCLK_MASK)|__SHIFTIN((_pdbg), RK3399_PDBG_MASK)) 166 1.3 jmcneill 167 1.3 jmcneill static const struct rk_cru_cpu_rate armclkl_rates[] = { 168 1.3 jmcneill RK3399_CPUL_RATE(1800000000, 1, 8, 8), 169 1.3 jmcneill RK3399_CPUL_RATE(1704000000, 1, 8, 8), 170 1.3 jmcneill RK3399_CPUL_RATE(1608000000, 1, 7, 7), 171 1.3 jmcneill RK3399_CPUL_RATE(1512000000, 1, 7, 7), 172 1.3 jmcneill RK3399_CPUL_RATE(1488000000, 1, 6, 6), 173 1.3 jmcneill RK3399_CPUL_RATE(1416000000, 1, 6, 6), 174 1.3 jmcneill RK3399_CPUL_RATE(1200000000, 1, 5, 5), 175 1.8 jmcneill RK3399_CPUL_RATE(1008000000, 1, 5, 5), 176 1.8 jmcneill RK3399_CPUL_RATE( 816000000, 1, 4, 4), 177 1.3 jmcneill RK3399_CPUL_RATE( 696000000, 1, 3, 3), 178 1.8 jmcneill RK3399_CPUL_RATE( 600000000, 1, 3, 3), 179 1.8 jmcneill RK3399_CPUL_RATE( 408000000, 1, 2, 2), 180 1.3 jmcneill RK3399_CPUL_RATE( 312000000, 1, 1, 1), 181 1.3 jmcneill RK3399_CPUL_RATE( 216000000, 1, 1, 1), 182 1.3 jmcneill RK3399_CPUL_RATE( 96000000, 1, 1, 1), 183 1.3 jmcneill }; 184 1.3 jmcneill 185 1.3 jmcneill static const struct rk_cru_cpu_rate armclkb_rates[] = { 186 1.3 jmcneill RK3399_CPUB_RATE(2208000000, 1, 11, 11), 187 1.3 jmcneill RK3399_CPUB_RATE(2184000000, 1, 11, 11), 188 1.3 jmcneill RK3399_CPUB_RATE(2088000000, 1, 10, 10), 189 1.3 jmcneill RK3399_CPUB_RATE(2040000000, 1, 10, 10), 190 1.3 jmcneill RK3399_CPUB_RATE(2016000000, 1, 9, 9), 191 1.19 jmcneill RK3399_CPUB_RATE(2000000000, 1, 9, 9), 192 1.3 jmcneill RK3399_CPUB_RATE(1992000000, 1, 9, 9), 193 1.3 jmcneill RK3399_CPUB_RATE(1896000000, 1, 9, 9), 194 1.3 jmcneill RK3399_CPUB_RATE(1800000000, 1, 8, 8), 195 1.3 jmcneill RK3399_CPUB_RATE(1704000000, 1, 8, 8), 196 1.3 jmcneill RK3399_CPUB_RATE(1608000000, 1, 7, 7), 197 1.3 jmcneill RK3399_CPUB_RATE(1512000000, 1, 7, 7), 198 1.3 jmcneill RK3399_CPUB_RATE(1488000000, 1, 6, 6), 199 1.3 jmcneill RK3399_CPUB_RATE(1416000000, 1, 6, 6), 200 1.3 jmcneill RK3399_CPUB_RATE(1200000000, 1, 5, 5), 201 1.3 jmcneill RK3399_CPUB_RATE(1008000000, 1, 5, 5), 202 1.3 jmcneill RK3399_CPUB_RATE( 816000000, 1, 4, 4), 203 1.3 jmcneill RK3399_CPUB_RATE( 696000000, 1, 3, 3), 204 1.3 jmcneill RK3399_CPUB_RATE( 600000000, 1, 3, 3), 205 1.3 jmcneill RK3399_CPUB_RATE( 408000000, 1, 2, 2), 206 1.3 jmcneill RK3399_CPUB_RATE( 312000000, 1, 1, 1), 207 1.3 jmcneill RK3399_CPUB_RATE( 216000000, 1, 1, 1), 208 1.3 jmcneill RK3399_CPUB_RATE( 96000000, 1, 1, 1), 209 1.3 jmcneill }; 210 1.3 jmcneill 211 1.1 jmcneill #define PLL_CON0 0x00 212 1.1 jmcneill #define PLL_FBDIV __BITS(11,0) 213 1.1 jmcneill 214 1.1 jmcneill #define PLL_CON1 0x04 215 1.1 jmcneill #define PLL_POSTDIV2 __BITS(14,12) 216 1.1 jmcneill #define PLL_POSTDIV1 __BITS(10,8) 217 1.1 jmcneill #define PLL_REFDIV __BITS(5,0) 218 1.1 jmcneill 219 1.1 jmcneill #define PLL_CON2 0x08 220 1.1 jmcneill #define PLL_LOCK __BIT(31) 221 1.1 jmcneill #define PLL_FRACDIV __BITS(23,0) 222 1.1 jmcneill 223 1.1 jmcneill #define PLL_CON3 0x0c 224 1.1 jmcneill #define PLL_WORK_MODE __BITS(9,8) 225 1.1 jmcneill #define PLL_WORK_MODE_SLOW 0 226 1.1 jmcneill #define PLL_WORK_MODE_NORMAL 1 227 1.1 jmcneill #define PLL_WORK_MODE_DEEP_SLOW 2 228 1.1 jmcneill #define PLL_DSMPD __BIT(3) 229 1.1 jmcneill 230 1.1 jmcneill #define PLL_WRITE_MASK 0xffff0000 231 1.1 jmcneill 232 1.1 jmcneill static u_int 233 1.1 jmcneill rk3399_cru_pll_get_rate(struct rk_cru_softc *sc, 234 1.1 jmcneill struct rk_cru_clk *clk) 235 1.1 jmcneill { 236 1.1 jmcneill struct rk_cru_pll *pll = &clk->u.pll; 237 1.1 jmcneill struct clk *clkp, *clkp_parent; 238 1.1 jmcneill u_int foutvco, foutpostdiv; 239 1.1 jmcneill 240 1.1 jmcneill KASSERT(clk->type == RK_CRU_PLL); 241 1.1 jmcneill 242 1.1 jmcneill clkp = &clk->base; 243 1.1 jmcneill clkp_parent = clk_get_parent(clkp); 244 1.1 jmcneill if (clkp_parent == NULL) 245 1.1 jmcneill return 0; 246 1.1 jmcneill 247 1.1 jmcneill const u_int fref = clk_get_rate(clkp_parent); 248 1.1 jmcneill if (fref == 0) 249 1.1 jmcneill return 0; 250 1.1 jmcneill 251 1.1 jmcneill const uint32_t con0 = CRU_READ(sc, pll->con_base + PLL_CON0); 252 1.1 jmcneill const uint32_t con1 = CRU_READ(sc, pll->con_base + PLL_CON1); 253 1.1 jmcneill const uint32_t con2 = CRU_READ(sc, pll->con_base + PLL_CON2); 254 1.1 jmcneill const uint32_t con3 = CRU_READ(sc, pll->con_base + PLL_CON3); 255 1.1 jmcneill 256 1.1 jmcneill const u_int fbdiv = __SHIFTOUT(con0, PLL_FBDIV); 257 1.1 jmcneill const u_int postdiv2 = __SHIFTOUT(con1, PLL_POSTDIV2); 258 1.1 jmcneill const u_int postdiv1 = __SHIFTOUT(con1, PLL_POSTDIV1); 259 1.1 jmcneill const u_int refdiv = __SHIFTOUT(con1, PLL_REFDIV); 260 1.1 jmcneill const u_int fracdiv = __SHIFTOUT(con2, PLL_FRACDIV); 261 1.1 jmcneill const u_int dsmpd = __SHIFTOUT(con3, PLL_DSMPD); 262 1.1 jmcneill 263 1.1 jmcneill if (dsmpd == 1) { 264 1.1 jmcneill /* integer mode */ 265 1.1 jmcneill foutvco = fref / refdiv * fbdiv; 266 1.1 jmcneill } else { 267 1.1 jmcneill /* fractional mode */ 268 1.1 jmcneill foutvco = fref / refdiv * fbdiv + ((fref * fracdiv) >> 24); 269 1.1 jmcneill } 270 1.1 jmcneill foutpostdiv = foutvco / postdiv1 / postdiv2; 271 1.1 jmcneill 272 1.1 jmcneill return foutpostdiv; 273 1.1 jmcneill } 274 1.1 jmcneill 275 1.1 jmcneill static int 276 1.1 jmcneill rk3399_cru_pll_set_rate(struct rk_cru_softc *sc, 277 1.1 jmcneill struct rk_cru_clk *clk, u_int rate) 278 1.1 jmcneill { 279 1.1 jmcneill struct rk_cru_pll *pll = &clk->u.pll; 280 1.1 jmcneill const struct rk_cru_pll_rate *pll_rate = NULL; 281 1.1 jmcneill uint32_t val; 282 1.12 jmcneill int retry, best_diff; 283 1.1 jmcneill 284 1.1 jmcneill KASSERT(clk->type == RK_CRU_PLL); 285 1.1 jmcneill 286 1.1 jmcneill if (pll->rates == NULL || rate == 0) 287 1.1 jmcneill return EIO; 288 1.1 jmcneill 289 1.12 jmcneill best_diff = INT_MAX; 290 1.12 jmcneill for (int i = 0; i < pll->nrates; i++) { 291 1.22 msaitoh int diff; 292 1.22 msaitoh 293 1.22 msaitoh if (rate > pll->rates[i].rate) 294 1.22 msaitoh diff = rate - pll->rates[i].rate; 295 1.22 msaitoh else 296 1.22 msaitoh diff = pll->rates[i].rate - rate; 297 1.22 msaitoh if (diff < best_diff) { 298 1.1 jmcneill pll_rate = &pll->rates[i]; 299 1.22 msaitoh best_diff = diff; 300 1.1 jmcneill } 301 1.12 jmcneill } 302 1.1 jmcneill 303 1.1 jmcneill val = __SHIFTIN(PLL_WORK_MODE_SLOW, PLL_WORK_MODE) | (PLL_WORK_MODE << 16); 304 1.1 jmcneill CRU_WRITE(sc, pll->con_base + PLL_CON3, val); 305 1.1 jmcneill 306 1.1 jmcneill CRU_WRITE(sc, pll->con_base + PLL_CON0, 307 1.3 jmcneill __SHIFTIN(pll_rate->fbdiv, PLL_FBDIV) | (PLL_FBDIV << 16)); 308 1.1 jmcneill 309 1.1 jmcneill CRU_WRITE(sc, pll->con_base + PLL_CON1, 310 1.1 jmcneill __SHIFTIN(pll_rate->postdiv2, PLL_POSTDIV2) | 311 1.1 jmcneill __SHIFTIN(pll_rate->postdiv1, PLL_POSTDIV1) | 312 1.1 jmcneill __SHIFTIN(pll_rate->refdiv, PLL_REFDIV) | 313 1.3 jmcneill ((PLL_POSTDIV2 | PLL_POSTDIV1 | PLL_REFDIV) << 16)); 314 1.1 jmcneill 315 1.1 jmcneill val = CRU_READ(sc, pll->con_base + PLL_CON2); 316 1.1 jmcneill val &= ~PLL_FRACDIV; 317 1.1 jmcneill val |= __SHIFTIN(pll_rate->fracdiv, PLL_FRACDIV); 318 1.1 jmcneill CRU_WRITE(sc, pll->con_base + PLL_CON2, val); 319 1.1 jmcneill 320 1.1 jmcneill val = __SHIFTIN(pll_rate->dsmpd, PLL_DSMPD) | (PLL_DSMPD << 16); 321 1.1 jmcneill CRU_WRITE(sc, pll->con_base + PLL_CON3, val); 322 1.1 jmcneill 323 1.1 jmcneill for (retry = 1000; retry > 0; retry--) { 324 1.1 jmcneill if (CRU_READ(sc, pll->con_base + PLL_CON2) & pll->lock_mask) 325 1.1 jmcneill break; 326 1.1 jmcneill delay(1); 327 1.1 jmcneill } 328 1.1 jmcneill 329 1.1 jmcneill if (retry == 0) 330 1.1 jmcneill device_printf(sc->sc_dev, "WARNING: %s failed to lock\n", 331 1.1 jmcneill clk->base.name); 332 1.1 jmcneill 333 1.3 jmcneill /* Set PLL work mode to normal */ 334 1.1 jmcneill val = __SHIFTIN(PLL_WORK_MODE_NORMAL, PLL_WORK_MODE) | (PLL_WORK_MODE << 16); 335 1.1 jmcneill CRU_WRITE(sc, pll->con_base + PLL_CON3, val); 336 1.1 jmcneill 337 1.1 jmcneill return 0; 338 1.1 jmcneill } 339 1.1 jmcneill 340 1.1 jmcneill #define RK3399_PLL(_id, _name, _parents, _con_base, _mode_reg, _mode_mask, _lock_mask, _rates) \ 341 1.1 jmcneill { \ 342 1.1 jmcneill .id = (_id), \ 343 1.1 jmcneill .type = RK_CRU_PLL, \ 344 1.1 jmcneill .base.name = (_name), \ 345 1.1 jmcneill .base.flags = 0, \ 346 1.1 jmcneill .u.pll.parents = (_parents), \ 347 1.1 jmcneill .u.pll.nparents = __arraycount(_parents), \ 348 1.1 jmcneill .u.pll.con_base = (_con_base), \ 349 1.1 jmcneill .u.pll.mode_reg = (_mode_reg), \ 350 1.1 jmcneill .u.pll.mode_mask = (_mode_mask), \ 351 1.1 jmcneill .u.pll.lock_mask = (_lock_mask), \ 352 1.1 jmcneill .u.pll.rates = (_rates), \ 353 1.1 jmcneill .u.pll.nrates = __arraycount(_rates), \ 354 1.1 jmcneill .get_rate = rk3399_cru_pll_get_rate, \ 355 1.1 jmcneill .set_rate = rk3399_cru_pll_set_rate, \ 356 1.1 jmcneill .get_parent = rk_cru_pll_get_parent, \ 357 1.1 jmcneill } 358 1.1 jmcneill 359 1.1 jmcneill static const char * pll_parents[] = { "xin24m", "xin32k" }; 360 1.3 jmcneill 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" }; 361 1.3 jmcneill 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" }; 362 1.7 mrg static const char * mux_clk_tsadc_parents[] = { "xin24m", "xin32k" }; 363 1.1 jmcneill static const char * mux_pll_src_cpll_gpll_parents[] = { "cpll", "gpll" }; 364 1.1 jmcneill static const char * mux_pll_src_cpll_gpll_npll_parents[] = { "cpll", "gpll", "npll" }; 365 1.14 jakllsch static const char * mux_pll_src_cpll_gpll_ppll_parents[] = { "cpll", "gpll", "ppll" }; 366 1.1 jmcneill static const char * mux_pll_src_cpll_gpll_upll_parents[] = { "cpll", "gpll", "upll" }; 367 1.4 jakllsch static const char * mux_pll_src_cpll_gpll_npll_24m_parents[] = { "cpll", "gpll", "npll", "xin24m" }; 368 1.1 jmcneill static const char * mux_pll_src_cpll_gpll_npll_ppll_upll_24m_parents[] = { "cpll", "gpll", "npll", "ppll", "upll", "xin24m" }; 369 1.16 jakllsch static const char * mux_pll_src_npll_cpll_gpll_parents[] = { "npll", "cpll", "gpll" }; 370 1.11 jmcneill static const char * mux_pll_src_vpll_cpll_gpll_parents[] = { "vpll", "cpll", "gpll" }; 371 1.11 jmcneill static const char * mux_pll_src_vpll_cpll_gpll_npll_parents[] = { "vpll", "cpll", "gpll", "npll" }; 372 1.1 jmcneill static const char * mux_aclk_perilp0_parents[] = { "cpll_aclk_perilp0_src", "gpll_aclk_perilp0_src" }; 373 1.1 jmcneill static const char * mux_hclk_perilp1_parents[] = { "cpll_hclk_perilp1_src", "gpll_hclk_perilp1_src" }; 374 1.1 jmcneill static const char * mux_aclk_perihp_parents[] = { "cpll_aclk_perihp_src", "gpll_aclk_perihp_src" }; 375 1.1 jmcneill static const char * mux_aclk_cci_parents[] = { "cpll_aclk_cci_src", "gpll_aclk_cci_src", "npll_aclk_cci_src", "vpll_aclk_cci_src" }; 376 1.11 jmcneill static const char * mux_dclk_vop0_parents[] = { "dclk_vop0_div", "dclk_vop0_frac" }; 377 1.11 jmcneill static const char * mux_dclk_vop1_parents[] = { "dclk_vop1_div", "dclk_vop1_frac" }; 378 1.13 jmcneill static const char * mux_i2s0_parents[] = { "clk_i2s0_div", "clk_i2s0_frac", "clkin_i2s", "xin12m" }; 379 1.13 jmcneill static const char * mux_i2s1_parents[] = { "clk_i2s1_div", "clk_i2s1_frac", "clkin_i2s", "xin12m" }; 380 1.13 jmcneill static const char * mux_i2s2_parents[] = { "clk_i2s2_div", "clk_i2s2_frac", "clkin_i2s", "xin12m" }; 381 1.13 jmcneill static const char * mux_i2sch_parents[] = { "clk_i2s0", "clk_i2s1", "clk_i2s2" }; 382 1.13 jmcneill static const char * mux_i2sout_parents[] = { "clk_i2sout_src", "xin12m" }; 383 1.1 jmcneill static const char * mux_uart0_parents[] = { "clk_uart0_div", "clk_uart0_frac", "xin24m" }; 384 1.1 jmcneill static const char * mux_uart1_parents[] = { "clk_uart1_div", "clk_uart1_frac", "xin24m" }; 385 1.1 jmcneill static const char * mux_uart2_parents[] = { "clk_uart2_div", "clk_uart2_frac", "xin24m" }; 386 1.1 jmcneill static const char * mux_uart3_parents[] = { "clk_uart3_div", "clk_uart3_frac", "xin24m" }; 387 1.1 jmcneill static const char * mux_rmii_parents[] = { "clk_gmac", "clkin_gmac" }; 388 1.1 jmcneill static const char * mux_aclk_gmac_parents[] = { "cpll_aclk_gmac_src", "gpll_aclk_gmac_src" }; 389 1.5 jmcneill static const char * mux_aclk_emmc_parents[] = { "cpll_aclk_emmc_src", "gpll_aclk_emmc_src" }; 390 1.4 jakllsch static const char * mux_pll_src_24m_pciephy_parents[] = { "xin24m", "clk_pciephy_ref100m" }; 391 1.4 jakllsch static const char * mux_pciecore_cru_phy_parents[] = { "clk_pcie_core_cru", "clk_pcie_core_phy" }; 392 1.26 rjs static const char * mux_tcpd_parents[] = { "xin24m", "xin32k", "cpll", "gpll" }; 393 1.27 rjs static const char * mux_aclk_gpu_parents[] = { "ppll", "cpll", "gpll", "npll", "upll" }; 394 1.1 jmcneill 395 1.1 jmcneill static struct rk_cru_clk rk3399_cru_clks[] = { 396 1.1 jmcneill RK3399_PLL(RK3399_PLL_APLLL, "lpll", pll_parents, 397 1.1 jmcneill PLL_CON(0), /* con_base */ 398 1.1 jmcneill PLL_CON(3), /* mode_reg */ 399 1.1 jmcneill __BIT(8), /* mode_mask */ 400 1.1 jmcneill __BIT(31), /* lock_mask */ 401 1.1 jmcneill pll_rates), 402 1.1 jmcneill RK3399_PLL(RK3399_PLL_APLLB, "bpll", pll_parents, 403 1.1 jmcneill PLL_CON(8), /* con_base */ 404 1.1 jmcneill PLL_CON(11), /* mode_reg */ 405 1.1 jmcneill __BIT(8), /* mode_mask */ 406 1.1 jmcneill __BIT(31), /* lock_mask */ 407 1.1 jmcneill pll_rates), 408 1.1 jmcneill RK3399_PLL(RK3399_PLL_DPLL, "dpll", pll_parents, 409 1.1 jmcneill PLL_CON(16), /* con_base */ 410 1.1 jmcneill PLL_CON(19), /* mode_reg */ 411 1.1 jmcneill __BIT(8), /* mode_mask */ 412 1.1 jmcneill __BIT(31), /* lock_mask */ 413 1.1 jmcneill pll_norates), 414 1.1 jmcneill RK3399_PLL(RK3399_PLL_CPLL, "cpll", pll_parents, 415 1.1 jmcneill PLL_CON(24), /* con_base */ 416 1.1 jmcneill PLL_CON(27), /* mode_reg */ 417 1.1 jmcneill __BIT(8), /* mode_mask */ 418 1.1 jmcneill __BIT(31), /* lock_mask */ 419 1.1 jmcneill pll_rates), 420 1.1 jmcneill RK3399_PLL(RK3399_PLL_GPLL, "gpll", pll_parents, 421 1.1 jmcneill PLL_CON(32), /* con_base */ 422 1.1 jmcneill PLL_CON(35), /* mode_reg */ 423 1.1 jmcneill __BIT(8), /* mode_mask */ 424 1.1 jmcneill __BIT(31), /* lock_mask */ 425 1.1 jmcneill pll_rates), 426 1.1 jmcneill RK3399_PLL(RK3399_PLL_NPLL, "npll", pll_parents, 427 1.1 jmcneill PLL_CON(40), /* con_base */ 428 1.1 jmcneill PLL_CON(43), /* mode_reg */ 429 1.1 jmcneill __BIT(8), /* mode_mask */ 430 1.1 jmcneill __BIT(31), /* lock_mask */ 431 1.1 jmcneill pll_rates), 432 1.1 jmcneill RK3399_PLL(RK3399_PLL_VPLL, "vpll", pll_parents, 433 1.11 jmcneill PLL_CON(48), /* con_base */ 434 1.1 jmcneill PLL_CON(51), /* mode_reg */ 435 1.1 jmcneill __BIT(8), /* mode_mask */ 436 1.1 jmcneill __BIT(31), /* lock_mask */ 437 1.1 jmcneill pll_rates), 438 1.1 jmcneill 439 1.3 jmcneill RK_GATE(0, "clk_core_l_lpll_src", "lpll", CLKGATE_CON(0), 0), 440 1.3 jmcneill RK_GATE(0, "clk_core_l_bpll_src", "bpll", CLKGATE_CON(0), 1), 441 1.3 jmcneill RK_GATE(0, "clk_core_l_dpll_src", "dpll", CLKGATE_CON(0), 2), 442 1.3 jmcneill RK_GATE(0, "clk_core_l_gpll_src", "gpll", CLKGATE_CON(0), 3), 443 1.3 jmcneill 444 1.3 jmcneill RK_CPU(RK3399_ARMCLKL, "armclkl", armclkl_parents, 445 1.25 ryo CLKSEL_CON(0), /* mux_reg */ 446 1.3 jmcneill __BITS(7,6), 0, 3, /* mux_mask, mux_main, mux_alt */ 447 1.25 ryo CLKSEL_CON(0), /* div_reg */ 448 1.3 jmcneill __BITS(4,0), /* div_mask */ 449 1.3 jmcneill armclkl_rates), 450 1.3 jmcneill 451 1.3 jmcneill RK_GATE(0, "clk_core_b_lpll_src", "lpll", CLKGATE_CON(1), 0), 452 1.3 jmcneill RK_GATE(0, "clk_core_b_bpll_src", "bpll", CLKGATE_CON(1), 1), 453 1.3 jmcneill RK_GATE(0, "clk_core_b_dpll_src", "dpll", CLKGATE_CON(1), 2), 454 1.3 jmcneill RK_GATE(0, "clk_core_b_gpll_src", "gpll", CLKGATE_CON(1), 3), 455 1.3 jmcneill 456 1.3 jmcneill RK_CPU(RK3399_ARMCLKB, "armclkb", armclkb_parents, 457 1.25 ryo CLKSEL_CON(2), /* mux_reg */ 458 1.3 jmcneill __BITS(7,6), 1, 3, /* mux_mask, mux_main, mux_alt */ 459 1.25 ryo CLKSEL_CON(2), /* div_reg */ 460 1.3 jmcneill __BITS(4,0), /* div_mask */ 461 1.3 jmcneill armclkb_rates), 462 1.3 jmcneill 463 1.1 jmcneill /* 464 1.1 jmcneill * perilp0 465 1.1 jmcneill */ 466 1.1 jmcneill RK_GATE(0, "gpll_aclk_perilp0_src", "gpll", CLKGATE_CON(7), 0), 467 1.1 jmcneill RK_GATE(0, "cpll_aclk_perilp0_src", "cpll", CLKGATE_CON(7), 1), 468 1.1 jmcneill RK_COMPOSITE(RK3399_ACLK_PERILP0, "aclk_perilp0", mux_aclk_perilp0_parents, 469 1.1 jmcneill CLKSEL_CON(23), /* muxdiv_reg */ 470 1.1 jmcneill __BIT(7), /* mux_mask */ 471 1.1 jmcneill __BITS(4,0), /* div_mask */ 472 1.1 jmcneill CLKGATE_CON(7), /* gate_reg */ 473 1.1 jmcneill __BIT(2), /* gate_mask */ 474 1.1 jmcneill 0), 475 1.1 jmcneill RK_COMPOSITE_NOMUX(RK3399_HCLK_PERILP0, "hclk_perilp0", "aclk_perilp0", 476 1.1 jmcneill CLKSEL_CON(23), /* div_reg */ 477 1.1 jmcneill __BITS(10,8), /* div_mask */ 478 1.1 jmcneill CLKGATE_CON(7), /* gate_reg */ 479 1.1 jmcneill __BIT(3), /* gate_mask */ 480 1.1 jmcneill 0), 481 1.1 jmcneill RK_COMPOSITE_NOMUX(RK3399_PCLK_PERILP0, "pclk_perilp0", "aclk_perilp0", 482 1.1 jmcneill CLKSEL_CON(23), /* div_reg */ 483 1.1 jmcneill __BITS(14,12), /* div_mask */ 484 1.1 jmcneill CLKGATE_CON(7), /* gate_reg */ 485 1.1 jmcneill __BIT(4), /* gate_mask */ 486 1.1 jmcneill 0), 487 1.1 jmcneill 488 1.1 jmcneill /* 489 1.1 jmcneill * perilp1 490 1.1 jmcneill */ 491 1.1 jmcneill RK_GATE(0, "gpll_hclk_perilp1_src", "gpll", CLKGATE_CON(8), 0), 492 1.1 jmcneill RK_GATE(0, "cpll_hclk_perilp1_src", "cpll", CLKGATE_CON(8), 1), 493 1.1 jmcneill RK_COMPOSITE_NOGATE(RK3399_HCLK_PERILP1, "hclk_perilp1", mux_hclk_perilp1_parents, 494 1.1 jmcneill CLKSEL_CON(25), /* muxdiv_reg */ 495 1.1 jmcneill __BITS(10,8), /* mux_mask */ 496 1.1 jmcneill __BITS(4,0), /* div_mask */ 497 1.1 jmcneill 0), 498 1.1 jmcneill RK_COMPOSITE_NOMUX(RK3399_PCLK_PERILP1, "pclk_perilp1", "hclk_perilp1", 499 1.1 jmcneill CLKSEL_CON(25), /* div_reg */ 500 1.1 jmcneill __BITS(10,8), /* div_mask */ 501 1.1 jmcneill CLKGATE_CON(8), /* gate_reg */ 502 1.1 jmcneill __BIT(2), /* gate_mask */ 503 1.1 jmcneill 0), 504 1.1 jmcneill 505 1.1 jmcneill /* 506 1.1 jmcneill * perihp 507 1.1 jmcneill */ 508 1.1 jmcneill RK_GATE(0, "gpll_aclk_perihp_src", "gpll", CLKGATE_CON(5), 0), 509 1.1 jmcneill RK_GATE(0, "cpll_aclk_perihp_src", "cpll", CLKGATE_CON(5), 1), 510 1.1 jmcneill RK_COMPOSITE(RK3399_ACLK_PERIHP, "aclk_perihp", mux_aclk_perihp_parents, 511 1.1 jmcneill CLKSEL_CON(14), /* muxdiv_reg */ 512 1.1 jmcneill __BIT(7), /* mux_mask */ 513 1.1 jmcneill __BITS(4,0), /* div_mask */ 514 1.1 jmcneill CLKGATE_CON(5), /* gate_reg */ 515 1.1 jmcneill __BIT(2), /* gate_mask */ 516 1.1 jmcneill 0), 517 1.1 jmcneill RK_COMPOSITE_NOMUX(RK3399_HCLK_PERIHP, "hclk_perihp", "aclk_perihp", 518 1.1 jmcneill CLKSEL_CON(14), /* div_reg */ 519 1.1 jmcneill __BITS(10,8), /* div_mask */ 520 1.1 jmcneill CLKGATE_CON(5), /* gate_reg */ 521 1.1 jmcneill __BIT(3), /* gate_mask */ 522 1.1 jmcneill 0), 523 1.1 jmcneill RK_COMPOSITE_NOMUX(RK3399_PCLK_PERIHP, "pclk_perihp", "aclk_perihp", 524 1.1 jmcneill CLKSEL_CON(14), /* div_reg */ 525 1.1 jmcneill __BITS(14,12), /* div_mask */ 526 1.1 jmcneill CLKGATE_CON(5), /* gate_reg */ 527 1.1 jmcneill __BIT(4), /* gate_mask */ 528 1.1 jmcneill 0), 529 1.1 jmcneill 530 1.1 jmcneill /* 531 1.1 jmcneill * CCI 532 1.1 jmcneill */ 533 1.1 jmcneill RK_GATE(0, "cpll_aclk_cci_src", "cpll", CLKGATE_CON(2), 0), 534 1.1 jmcneill RK_GATE(0, "gpll_aclk_cci_src", "gpll", CLKGATE_CON(2), 1), 535 1.1 jmcneill RK_GATE(0, "npll_aclk_cci_src", "npll", CLKGATE_CON(2), 2), 536 1.1 jmcneill RK_GATE(0, "vpll_aclk_cci_src", "vpll", CLKGATE_CON(2), 3), 537 1.1 jmcneill RK_COMPOSITE(0, "aclk_cci_pre", mux_aclk_cci_parents, 538 1.1 jmcneill CLKSEL_CON(5), /* muxdiv_reg */ 539 1.1 jmcneill __BITS(7,6), /* mux_mask */ 540 1.1 jmcneill __BITS(4,0), /* div_mask */ 541 1.1 jmcneill CLKGATE_CON(2), /* gate_reg */ 542 1.1 jmcneill __BIT(4), /* gate_mask */ 543 1.1 jmcneill 0), 544 1.1 jmcneill RK_GATE(RK3399_ACLK_CCI, "aclk_cci", "aclk_cci_pre", CLKGATE_CON(15), 2), 545 1.1 jmcneill 546 1.1 jmcneill /* 547 1.1 jmcneill * GIC 548 1.1 jmcneill */ 549 1.1 jmcneill RK_COMPOSITE(RK3399_ACLK_GIC_PRE, "aclk_gic_pre", mux_pll_src_cpll_gpll_parents, 550 1.1 jmcneill CLKSEL_CON(56), /* muxdiv_reg */ 551 1.1 jmcneill __BIT(15), /* mux_mask */ 552 1.1 jmcneill __BITS(12,8), /* div_mask */ 553 1.1 jmcneill CLKGATE_CON(12), /* gate_reg */ 554 1.1 jmcneill __BIT(12), /* gate_mask */ 555 1.1 jmcneill 0), 556 1.1 jmcneill 557 1.1 jmcneill /* 558 1.1 jmcneill * DDR 559 1.1 jmcneill */ 560 1.1 jmcneill RK_COMPOSITE(RK3399_PCLK_DDR, "pclk_ddr", mux_pll_src_cpll_gpll_parents, 561 1.1 jmcneill CLKSEL_CON(6), /* muxdiv_reg */ 562 1.1 jmcneill __BIT(15), /* mux_mask */ 563 1.1 jmcneill __BITS(12,8), /* div_mask */ 564 1.1 jmcneill CLKGATE_CON(3), /* gate_reg */ 565 1.1 jmcneill __BIT(4), /* gate_mask */ 566 1.1 jmcneill 0), 567 1.1 jmcneill 568 1.1 jmcneill /* 569 1.1 jmcneill * alive 570 1.1 jmcneill */ 571 1.1 jmcneill RK_DIV(RK3399_PCLK_ALIVE, "pclk_alive", "gpll", CLKSEL_CON(57), __BITS(4,0), 0), 572 1.1 jmcneill 573 1.1 jmcneill /* 574 1.1 jmcneill * GPIO 575 1.1 jmcneill */ 576 1.1 jmcneill RK_GATE(RK3399_PCLK_GPIO2, "pclk_gpio2", "pclk_alive", CLKGATE_CON(31), 3), 577 1.1 jmcneill RK_GATE(RK3399_PCLK_GPIO3, "pclk_gpio3", "pclk_alive", CLKGATE_CON(31), 4), 578 1.1 jmcneill RK_GATE(RK3399_PCLK_GPIO4, "pclk_gpio4", "pclk_alive", CLKGATE_CON(31), 5), 579 1.1 jmcneill 580 1.1 jmcneill /* 581 1.1 jmcneill * UART 582 1.1 jmcneill */ 583 1.1 jmcneill RK_MUX(0, "clk_uart0_src", mux_pll_src_cpll_gpll_upll_parents, CLKSEL_CON(33), __BITS(13,12)), 584 1.1 jmcneill RK_MUX(0, "clk_uart_src", mux_pll_src_cpll_gpll_parents, CLKSEL_CON(33), __BIT(15)), 585 1.1 jmcneill RK_COMPOSITE_NOMUX(0, "clk_uart0_div", "clk_uart0_src", 586 1.1 jmcneill CLKSEL_CON(33), /* div_reg */ 587 1.1 jmcneill __BITS(6,0), /* div_mask */ 588 1.1 jmcneill CLKGATE_CON(9), /* gate_reg */ 589 1.1 jmcneill __BIT(0), /* gate_mask */ 590 1.1 jmcneill 0), 591 1.1 jmcneill RK_COMPOSITE_NOMUX(0, "clk_uart1_div", "clk_uart_src", 592 1.1 jmcneill CLKSEL_CON(34), /* div_reg */ 593 1.1 jmcneill __BITS(6,0), /* div_mask */ 594 1.1 jmcneill CLKGATE_CON(9), /* gate_reg */ 595 1.1 jmcneill __BIT(2), /* gate_mask */ 596 1.1 jmcneill 0), 597 1.1 jmcneill RK_COMPOSITE_NOMUX(0, "clk_uart2_div", "clk_uart_src", 598 1.1 jmcneill CLKSEL_CON(35), /* div_reg */ 599 1.1 jmcneill __BITS(6,0), /* div_mask */ 600 1.1 jmcneill CLKGATE_CON(9), /* gate_reg */ 601 1.1 jmcneill __BIT(4), /* gate_mask */ 602 1.1 jmcneill 0), 603 1.1 jmcneill RK_COMPOSITE_NOMUX(0, "clk_uart3_div", "clk_uart_src", 604 1.1 jmcneill CLKSEL_CON(36), /* div_reg */ 605 1.1 jmcneill __BITS(6,0), /* div_mask */ 606 1.1 jmcneill CLKGATE_CON(9), /* gate_reg */ 607 1.1 jmcneill __BIT(6), /* gate_mask */ 608 1.1 jmcneill 0), 609 1.1 jmcneill RK_MUX(RK3399_SCLK_UART0, "clk_uart0", mux_uart0_parents, CLKSEL_CON(33), __BITS(9,8)), 610 1.1 jmcneill RK_MUX(RK3399_SCLK_UART1, "clk_uart1", mux_uart1_parents, CLKSEL_CON(34), __BITS(9,8)), 611 1.1 jmcneill RK_MUX(RK3399_SCLK_UART2, "clk_uart2", mux_uart2_parents, CLKSEL_CON(35), __BITS(9,8)), 612 1.1 jmcneill RK_MUX(RK3399_SCLK_UART3, "clk_uart3", mux_uart3_parents, CLKSEL_CON(36), __BITS(9,8)), 613 1.1 jmcneill RK_GATE(RK3399_PCLK_UART0, "pclk_uart0", "pclk_perilp1", CLKGATE_CON(22), 0), 614 1.1 jmcneill RK_GATE(RK3399_PCLK_UART1, "pclk_uart1", "pclk_perilp1", CLKGATE_CON(22), 1), 615 1.1 jmcneill RK_GATE(RK3399_PCLK_UART2, "pclk_uart2", "pclk_perilp1", CLKGATE_CON(22), 2), 616 1.1 jmcneill RK_GATE(RK3399_PCLK_UART3, "pclk_uart3", "pclk_perilp1", CLKGATE_CON(22), 3), 617 1.1 jmcneill 618 1.1 jmcneill /* 619 1.1 jmcneill * SDMMC/SDIO 620 1.1 jmcneill */ 621 1.1 jmcneill RK_COMPOSITE(RK3399_HCLK_SD, "hclk_sd", mux_pll_src_cpll_gpll_parents, 622 1.1 jmcneill CLKSEL_CON(13), /* muxdiv_reg */ 623 1.1 jmcneill __BIT(15), /* mux_mask */ 624 1.1 jmcneill __BITS(12,8), /* div_mask */ 625 1.1 jmcneill CLKGATE_CON(12), /* gate_reg */ 626 1.1 jmcneill __BIT(13), /* gate_mask */ 627 1.6 jmcneill RK_COMPOSITE_ROUND_DOWN), 628 1.1 jmcneill RK_COMPOSITE(RK3399_SCLK_SDIO, "clk_sdio", mux_pll_src_cpll_gpll_npll_ppll_upll_24m_parents, 629 1.1 jmcneill CLKSEL_CON(15), /* muxdiv_reg */ 630 1.1 jmcneill __BITS(10,8), /* mux_mask */ 631 1.1 jmcneill __BITS(6,0), /* div_mask */ 632 1.1 jmcneill CLKGATE_CON(6), /* gate_reg */ 633 1.1 jmcneill __BIT(0), /* gate_mask */ 634 1.6 jmcneill RK_COMPOSITE_ROUND_DOWN), 635 1.1 jmcneill RK_COMPOSITE(RK3399_SCLK_SDMMC, "clk_sdmmc", mux_pll_src_cpll_gpll_npll_ppll_upll_24m_parents, 636 1.1 jmcneill CLKSEL_CON(16), /* muxdiv_reg */ 637 1.1 jmcneill __BITS(10,8), /* mux_mask */ 638 1.1 jmcneill __BITS(6,0), /* div_mask */ 639 1.1 jmcneill CLKGATE_CON(6), /* gate_reg */ 640 1.1 jmcneill __BIT(1), /* gate_mask */ 641 1.6 jmcneill RK_COMPOSITE_ROUND_DOWN), 642 1.1 jmcneill RK_GATE(RK3399_HCLK_SDMMC, "hclk_sdmmc", "hclk_sd", CLKGATE_CON(33), 8), 643 1.1 jmcneill RK_GATE(RK3399_HCLK_SDIO, "hclk_sdio", "pclk_perilp1", CLKGATE_CON(34), 4), 644 1.1 jmcneill 645 1.1 jmcneill /* 646 1.5 jmcneill * eMMC 647 1.5 jmcneill */ 648 1.5 jmcneill RK_COMPOSITE(RK3399_SCLK_EMMC, "clk_emmc", mux_pll_src_cpll_gpll_npll_ppll_upll_24m_parents, 649 1.5 jmcneill CLKSEL_CON(22), /* muxdiv_reg */ 650 1.5 jmcneill __BITS(10,8), /* mux_mask */ 651 1.5 jmcneill __BITS(6,0), /* div_mask */ 652 1.5 jmcneill CLKGATE_CON(6), /* gate_reg */ 653 1.5 jmcneill __BIT(14), /* gate_mask */ 654 1.6 jmcneill RK_COMPOSITE_ROUND_DOWN), 655 1.5 jmcneill RK_GATE(0, "cpll_aclk_emmc_src", "cpll", CLKGATE_CON(6), 13), 656 1.5 jmcneill RK_GATE(0, "gpll_aclk_emmc_src", "gpll", CLKGATE_CON(6), 12), 657 1.5 jmcneill RK_COMPOSITE_NOGATE(RK3399_ACLK_EMMC, "aclk_emmc", mux_aclk_emmc_parents, 658 1.6 jmcneill CLKSEL_CON(21), /* muxdiv_reg */ 659 1.5 jmcneill __BIT(7), /* mux_mask */ 660 1.5 jmcneill __BITS(4,0), /* div_mask */ 661 1.5 jmcneill 0), 662 1.6 jmcneill RK_GATE(RK3399_ACLK_EMMC_CORE, "aclk_emmccore", "aclk_emmc", CLKGATE_CON(32), 8), 663 1.6 jmcneill RK_GATE(RK3399_ACLK_EMMC_NOC, "aclk_emmc_noc", "aclk_emmc", CLKGATE_CON(32), 9), 664 1.6 jmcneill RK_GATE(RK3399_ACLK_EMMC_GRF, "aclk_emmcgrf", "aclk_emmc", CLKGATE_CON(32), 10), 665 1.5 jmcneill 666 1.5 jmcneill /* 667 1.1 jmcneill * GMAC 668 1.1 jmcneill */ 669 1.1 jmcneill RK_COMPOSITE(RK3399_SCLK_MAC, "clk_gmac", mux_pll_src_cpll_gpll_npll_parents, 670 1.1 jmcneill CLKSEL_CON(20), /* muxdiv_reg */ 671 1.1 jmcneill __BITS(15,14), /* mux_mask */ 672 1.1 jmcneill __BITS(12,8), /* div_mask */ 673 1.1 jmcneill CLKGATE_CON(5), /* gate_reg */ 674 1.1 jmcneill __BIT(5), /* gate_mask */ 675 1.1 jmcneill 0), 676 1.1 jmcneill RK_MUX(RK3399_SCLK_RMII_SRC, "clk_rmii_src", mux_rmii_parents, CLKSEL_CON(19), __BIT(4)), 677 1.1 jmcneill RK_GATE(RK3399_SCLK_MACREF_OUT, "clk_mac_refout", "clk_rmii_src", CLKGATE_CON(5), 6), 678 1.1 jmcneill RK_GATE(RK3399_SCLK_MACREF, "clk_mac_ref", "clk_rmii_src", CLKGATE_CON(5), 7), 679 1.1 jmcneill RK_GATE(RK3399_SCLK_MAC_RX, "clk_rmii_rx", "clk_rmii_src", CLKGATE_CON(5), 8), 680 1.1 jmcneill RK_GATE(RK3399_SCLK_MAC_TX, "clk_rmii_tx", "clk_rmii_src", CLKGATE_CON(5), 9), 681 1.1 jmcneill RK_GATE(0, "gpll_aclk_gmac_src", "gpll", CLKGATE_CON(6), 8), 682 1.1 jmcneill RK_GATE(0, "cpll_aclk_gmac_src", "cpll", CLKGATE_CON(6), 9), 683 1.1 jmcneill RK_COMPOSITE(0, "aclk_gmac_pre", mux_aclk_gmac_parents, 684 1.1 jmcneill CLKSEL_CON(20), /* muxdiv_reg */ 685 1.1 jmcneill __BIT(17), /* mux_mask */ 686 1.1 jmcneill __BITS(4,0), /* div_mask */ 687 1.1 jmcneill CLKGATE_CON(6), /* gate_reg */ 688 1.1 jmcneill __BIT(10), /* gate_mask */ 689 1.1 jmcneill 0), 690 1.1 jmcneill RK_GATE(RK3399_ACLK_GMAC, "aclk_gmac", "aclk_gmac_pre", CLKGATE_CON(32), 0), 691 1.1 jmcneill RK_COMPOSITE_NOMUX(0, "pclk_gmac_pre", "aclk_gmac_pre", 692 1.1 jmcneill CLKSEL_CON(19), /* div_reg */ 693 1.1 jmcneill __BITS(10,8), /* div_mask */ 694 1.1 jmcneill CLKGATE_CON(6), /* gate_reg */ 695 1.1 jmcneill __BIT(11), /* gate_mask */ 696 1.1 jmcneill 0), 697 1.1 jmcneill RK_GATE(RK3399_PCLK_GMAC, "pclk_gmac", "pclk_gmac_pre", CLKGATE_CON(32), 2), 698 1.1 jmcneill 699 1.1 jmcneill /* 700 1.1 jmcneill * USB2 701 1.1 jmcneill */ 702 1.1 jmcneill RK_GATE(RK3399_HCLK_HOST0, "hclk_host0", "hclk_perihp", CLKGATE_CON(20), 5), 703 1.1 jmcneill RK_GATE(RK3399_HCLK_HOST0_ARB, "hclk_host0_arb", "hclk_perihp", CLKGATE_CON(20), 6), 704 1.1 jmcneill RK_GATE(RK3399_HCLK_HOST1, "hclk_host1", "hclk_perihp", CLKGATE_CON(20), 7), 705 1.1 jmcneill RK_GATE(RK3399_HCLK_HOST1_ARB, "hclk_host1_arb", "hclk_perihp", CLKGATE_CON(20), 8), 706 1.1 jmcneill RK_GATE(RK3399_SCLK_USB2PHY0_REF, "clk_usb2phy0_ref", "xin24m", CLKGATE_CON(6), 5), 707 1.1 jmcneill RK_GATE(RK3399_SCLK_USB2PHY1_REF, "clk_usb2phy1_ref", "xin24m", CLKGATE_CON(6), 6), 708 1.1 jmcneill 709 1.1 jmcneill /* 710 1.1 jmcneill * USB3 711 1.1 jmcneill */ 712 1.1 jmcneill RK_GATE(RK3399_SCLK_USB3OTG0_REF, "clk_usb3otg0_ref", "xin24m", CLKGATE_CON(12), 1), 713 1.1 jmcneill RK_GATE(RK3399_SCLK_USB3OTG1_REF, "clk_usb3otg1_ref", "xin24m", CLKGATE_CON(12), 2), 714 1.1 jmcneill RK_COMPOSITE(RK3399_SCLK_USB3OTG0_SUSPEND, "clk_usb3otg0_suspend", pll_parents, 715 1.1 jmcneill CLKSEL_CON(40), /* muxdiv_reg */ 716 1.1 jmcneill __BIT(15), /* mux_mask */ 717 1.1 jmcneill __BITS(9,0), /* div_mask */ 718 1.1 jmcneill CLKGATE_CON(12), /* gate_reg */ 719 1.1 jmcneill __BIT(3), /* gate_mask */ 720 1.1 jmcneill 0), 721 1.1 jmcneill RK_COMPOSITE(RK3399_SCLK_USB3OTG1_SUSPEND, "clk_usb3otg1_suspend", pll_parents, 722 1.1 jmcneill CLKSEL_CON(41), /* muxdiv_reg */ 723 1.1 jmcneill __BIT(15), /* mux_mask */ 724 1.1 jmcneill __BITS(9,0), /* div_mask */ 725 1.1 jmcneill CLKGATE_CON(12), /* gate_reg */ 726 1.1 jmcneill __BIT(4), /* gate_mask */ 727 1.1 jmcneill 0), 728 1.1 jmcneill RK_COMPOSITE(RK3399_ACLK_USB3, "aclk_usb3", mux_pll_src_cpll_gpll_npll_parents, 729 1.1 jmcneill CLKSEL_CON(39), /* muxdiv_reg */ 730 1.1 jmcneill __BITS(7,6), /* mux_mask */ 731 1.1 jmcneill __BITS(4,0), /* div_mask */ 732 1.1 jmcneill CLKGATE_CON(12), /* gate_reg */ 733 1.1 jmcneill __BIT(0), /* gate_mask */ 734 1.1 jmcneill 0), 735 1.1 jmcneill RK_GATE(RK3399_ACLK_USB3OTG0, "aclk_usb3otg0", "aclk_usb3", CLKGATE_CON(30), 1), 736 1.1 jmcneill RK_GATE(RK3399_ACLK_USB3OTG1, "aclk_usb3otg1", "aclk_usb3", CLKGATE_CON(30), 2), 737 1.1 jmcneill RK_GATE(RK3399_ACLK_USB3_RKSOC_AXI_PERF, "aclk_usb3_rksoc_axi_perf", "aclk_usb3", CLKGATE_CON(30), 3), 738 1.1 jmcneill RK_GATE(RK3399_ACLK_USB3_GRF, "aclk_usb3_grf", "aclk_usb3", CLKGATE_CON(30), 4), 739 1.2 jmcneill 740 1.26 rjs /* TYPE-C PHY */ 741 1.26 rjs RK_COMPOSITE(RK3399_SCLK_UPHY0_TCPDPHY_REF, "clk_uphy0_tcpdphy_ref", pll_parents, 742 1.26 rjs CLKSEL_CON(64), /* muxdiv_reg */ 743 1.26 rjs __BIT(15), /* mux_mask */ 744 1.26 rjs __BITS(12,8), /* div_mask */ 745 1.26 rjs CLKGATE_CON(13), /* gate_reg */ 746 1.26 rjs __BIT(4), /* gate_mask */ 747 1.26 rjs 0), 748 1.26 rjs RK_COMPOSITE(RK3399_SCLK_UPHY0_TCPDCORE, "clk_uphy0_tcpdcore", mux_tcpd_parents, 749 1.26 rjs CLKSEL_CON(64), /* muxdiv_reg */ 750 1.26 rjs __BITS(7,6), /* mux_mask */ 751 1.26 rjs __BITS(4,0), /* div_mask */ 752 1.26 rjs CLKGATE_CON(13), /* gate_reg */ 753 1.26 rjs __BIT(5), /* gate_mask */ 754 1.26 rjs 0), 755 1.26 rjs RK_COMPOSITE(RK3399_SCLK_UPHY1_TCPDPHY_REF, "clk_uphy1_tcpdphy_ref", pll_parents, 756 1.26 rjs CLKSEL_CON(65), /* muxdiv_reg */ 757 1.26 rjs __BIT(15), /* mux_mask */ 758 1.26 rjs __BITS(12,8), /* div_mask */ 759 1.26 rjs CLKGATE_CON(13), /* gate_reg */ 760 1.26 rjs __BIT(6), /* gate_mask */ 761 1.26 rjs 0), 762 1.26 rjs RK_COMPOSITE(RK3399_SCLK_UPHY1_TCPDCORE, "clk_uphy1_tcpdcore", mux_tcpd_parents, 763 1.26 rjs CLKSEL_CON(65), /* muxdiv_reg */ 764 1.26 rjs __BITS(7,6), /* mux_mask */ 765 1.26 rjs __BITS(4,0), /* div_mask */ 766 1.26 rjs CLKGATE_CON(13), /* gate_reg */ 767 1.26 rjs __BIT(7), /* gate_mask */ 768 1.26 rjs 0), 769 1.26 rjs 770 1.2 jmcneill /* 771 1.2 jmcneill * I2C 772 1.2 jmcneill */ 773 1.2 jmcneill RK_COMPOSITE(RK3399_SCLK_I2C1, "clk_i2c1", mux_pll_src_cpll_gpll_parents, 774 1.2 jmcneill CLKSEL_CON(61), /* muxdiv_reg */ 775 1.2 jmcneill __BIT(7), /* mux_mask */ 776 1.2 jmcneill __BITS(6,0), /* div_mask */ 777 1.2 jmcneill CLKGATE_CON(10), /* gate_reg */ 778 1.2 jmcneill __BIT(0), /* gate_mask */ 779 1.2 jmcneill 0), 780 1.2 jmcneill RK_COMPOSITE(RK3399_SCLK_I2C2, "clk_i2c2", mux_pll_src_cpll_gpll_parents, 781 1.2 jmcneill CLKSEL_CON(62), /* muxdiv_reg */ 782 1.2 jmcneill __BIT(7), /* mux_mask */ 783 1.2 jmcneill __BITS(6,0), /* div_mask */ 784 1.2 jmcneill CLKGATE_CON(10), /* gate_reg */ 785 1.2 jmcneill __BIT(2), /* gate_mask */ 786 1.2 jmcneill 0), 787 1.2 jmcneill RK_COMPOSITE(RK3399_SCLK_I2C3, "clk_i2c3", mux_pll_src_cpll_gpll_parents, 788 1.2 jmcneill CLKSEL_CON(63), /* muxdiv_reg */ 789 1.2 jmcneill __BIT(7), /* mux_mask */ 790 1.2 jmcneill __BITS(6,0), /* div_mask */ 791 1.2 jmcneill CLKGATE_CON(10), /* gate_reg */ 792 1.2 jmcneill __BIT(4), /* gate_mask */ 793 1.2 jmcneill 0), 794 1.2 jmcneill RK_COMPOSITE(RK3399_SCLK_I2C5, "clk_i2c5", mux_pll_src_cpll_gpll_parents, 795 1.2 jmcneill CLKSEL_CON(61), /* muxdiv_reg */ 796 1.2 jmcneill __BIT(15), /* mux_mask */ 797 1.2 jmcneill __BITS(14,8), /* div_mask */ 798 1.2 jmcneill CLKGATE_CON(10), /* gate_reg */ 799 1.2 jmcneill __BIT(1), /* gate_mask */ 800 1.2 jmcneill 0), 801 1.2 jmcneill RK_COMPOSITE(RK3399_SCLK_I2C6, "clk_i2c6", mux_pll_src_cpll_gpll_parents, 802 1.2 jmcneill CLKSEL_CON(62), /* muxdiv_reg */ 803 1.2 jmcneill __BIT(15), /* mux_mask */ 804 1.2 jmcneill __BITS(14,8), /* div_mask */ 805 1.2 jmcneill CLKGATE_CON(10), /* gate_reg */ 806 1.2 jmcneill __BIT(3), /* gate_mask */ 807 1.2 jmcneill 0), 808 1.2 jmcneill RK_COMPOSITE(RK3399_SCLK_I2C7, "clk_i2c7", mux_pll_src_cpll_gpll_parents, 809 1.2 jmcneill CLKSEL_CON(63), /* muxdiv_reg */ 810 1.2 jmcneill __BIT(15), /* mux_mask */ 811 1.2 jmcneill __BITS(14,8), /* div_mask */ 812 1.2 jmcneill CLKGATE_CON(10), /* gate_reg */ 813 1.2 jmcneill __BIT(5), /* gate_mask */ 814 1.2 jmcneill 0), 815 1.2 jmcneill RK_GATE(RK3399_PCLK_I2C7, "pclk_rki2c7", "pclk_perilp1", CLKGATE_CON(22), 5), 816 1.2 jmcneill RK_GATE(RK3399_PCLK_I2C1, "pclk_rki2c1", "pclk_perilp1", CLKGATE_CON(22), 6), 817 1.2 jmcneill RK_GATE(RK3399_PCLK_I2C5, "pclk_rki2c5", "pclk_perilp1", CLKGATE_CON(22), 7), 818 1.2 jmcneill RK_GATE(RK3399_PCLK_I2C6, "pclk_rki2c6", "pclk_perilp1", CLKGATE_CON(22), 8), 819 1.2 jmcneill RK_GATE(RK3399_PCLK_I2C2, "pclk_rki2c2", "pclk_perilp1", CLKGATE_CON(22), 9), 820 1.2 jmcneill RK_GATE(RK3399_PCLK_I2C3, "pclk_rki2c3", "pclk_perilp1", CLKGATE_CON(22), 10), 821 1.4 jakllsch 822 1.9 tnn /* 823 1.9 tnn * SPI 824 1.9 tnn */ 825 1.9 tnn RK_COMPOSITE(RK3399_SCLK_SPI0, "clk_spi0", mux_pll_src_cpll_gpll_parents, 826 1.9 tnn CLKSEL_CON(59), /* muxdiv_reg */ 827 1.9 tnn __BIT(7), /* mux_mask */ 828 1.9 tnn __BITS(6,0), /* div_mask */ 829 1.9 tnn CLKGATE_CON(9), /* gate_reg */ 830 1.9 tnn __BIT(12), /* gate_mask */ 831 1.9 tnn 0), 832 1.9 tnn RK_COMPOSITE(RK3399_SCLK_SPI1, "clk_spi1", mux_pll_src_cpll_gpll_parents, 833 1.9 tnn CLKSEL_CON(59), /* muxdiv_reg */ 834 1.9 tnn __BIT(15), /* mux_mask */ 835 1.9 tnn __BITS(14,8), /* div_mask */ 836 1.9 tnn CLKGATE_CON(9), /* gate_reg */ 837 1.9 tnn __BIT(13), /* gate_mask */ 838 1.9 tnn 0), 839 1.9 tnn RK_COMPOSITE(RK3399_SCLK_SPI2, "clk_spi2", mux_pll_src_cpll_gpll_parents, 840 1.9 tnn CLKSEL_CON(60), /* muxdiv_reg */ 841 1.9 tnn __BIT(7), /* mux_mask */ 842 1.9 tnn __BITS(6,0), /* div_mask */ 843 1.9 tnn CLKGATE_CON(9), /* gate_reg */ 844 1.9 tnn __BIT(14), /* gate_mask */ 845 1.9 tnn 0), 846 1.9 tnn RK_COMPOSITE(RK3399_SCLK_SPI4, "clk_spi4", mux_pll_src_cpll_gpll_parents, 847 1.9 tnn CLKSEL_CON(60), /* muxdiv_reg */ 848 1.9 tnn __BIT(15), /* mux_mask */ 849 1.9 tnn __BITS(14,8), /* div_mask */ 850 1.9 tnn CLKGATE_CON(9), /* gate_reg */ 851 1.9 tnn __BIT(15), /* gate_mask */ 852 1.9 tnn 0), 853 1.9 tnn RK_COMPOSITE(RK3399_SCLK_SPI5, "clk_spi5", mux_pll_src_cpll_gpll_parents, 854 1.9 tnn CLKSEL_CON(58), /* muxdiv_reg */ 855 1.9 tnn __BIT(15), /* mux_mask */ 856 1.9 tnn __BITS(14,8), /* div_mask */ 857 1.9 tnn CLKGATE_CON(13), /* gate_reg */ 858 1.9 tnn __BIT(13), /* gate_mask */ 859 1.9 tnn 0), 860 1.9 tnn RK_GATE(RK3399_PCLK_SPI0, "pclk_rkspi0", "pclk_perilp1", CLKGATE_CON(23), 10), 861 1.9 tnn RK_GATE(RK3399_PCLK_SPI1, "pclk_rkspi1", "pclk_perilp1", CLKGATE_CON(23), 11), 862 1.9 tnn RK_GATE(RK3399_PCLK_SPI2, "pclk_rkspi2", "pclk_perilp1", CLKGATE_CON(23), 12), 863 1.9 tnn RK_GATE(RK3399_PCLK_SPI4, "pclk_rkspi4", "pclk_perilp1", CLKGATE_CON(23), 13), 864 1.9 tnn RK_GATE(RK3399_PCLK_SPI5, "pclk_rkspi5", "hclk_perilp1", CLKGATE_CON(34), 5), 865 1.9 tnn 866 1.10 tnn /* Watchdog */ 867 1.10 tnn RK_SECURE_GATE(RK3399_PCLK_WDT, "pclk_wdt", "pclk_alive" /*, SECURE_CLKGATE_CON(3), 8 */), 868 1.10 tnn 869 1.4 jakllsch /* PCIe */ 870 1.4 jakllsch RK_GATE(RK3399_ACLK_PERF_PCIE, "aclk_perf_pcie", "aclk_perihp", CLKGATE_CON(20), 2), 871 1.4 jakllsch RK_GATE(RK3399_ACLK_PCIE, "aclk_pcie", "aclk_perihp", CLKGATE_CON(20), 10), 872 1.4 jakllsch RK_GATE(RK3399_PCLK_PCIE, "pclk_pcie", "pclk_perihp", CLKGATE_CON(20), 11), 873 1.4 jakllsch RK_COMPOSITE(RK3399_SCLK_PCIE_PM, "clk_pcie_pm", mux_pll_src_cpll_gpll_npll_24m_parents, 874 1.4 jakllsch CLKSEL_CON(17), /* muxdiv_reg */ 875 1.4 jakllsch __BITS(10,8), /* mux_mask */ 876 1.4 jakllsch __BITS(6,0), /* div_mask */ 877 1.4 jakllsch CLKGATE_CON(6), /* gate_reg */ 878 1.4 jakllsch __BIT(2), /* gate_mask */ 879 1.4 jakllsch 0), 880 1.4 jakllsch RK_COMPOSITE_NOMUX(RK3399_SCLK_PCIEPHY_REF100M, "clk_pciephy_ref100m", "npll", 881 1.4 jakllsch CLKSEL_CON(18), /* div_reg */ 882 1.4 jakllsch __BITS(15,11), /* div_mask */ 883 1.4 jakllsch CLKGATE_CON(12), /* gate_reg */ 884 1.4 jakllsch __BIT(6), /* gate_mask */ 885 1.4 jakllsch 0), 886 1.4 jakllsch RK_MUX(RK3399_SCLK_PCIEPHY_REF, "clk_pciephy_ref", mux_pll_src_24m_pciephy_parents, CLKSEL_CON(18), __BIT(10)), 887 1.4 jakllsch RK_COMPOSITE(0, "clk_pcie_core_cru", mux_pll_src_cpll_gpll_npll_parents, 888 1.4 jakllsch CLKSEL_CON(18), /* muxdiv_reg */ 889 1.4 jakllsch __BITS(9,8), /* mux_mask */ 890 1.4 jakllsch __BITS(6,0), /* div_mask */ 891 1.4 jakllsch CLKGATE_CON(6), /* gate_reg */ 892 1.4 jakllsch __BIT(3), /* gate_mask */ 893 1.4 jakllsch 0), 894 1.4 jakllsch RK_MUX(RK3399_SCLK_PCIE_CORE, "clk_pcie_core", mux_pciecore_cru_phy_parents, CLKSEL_CON(18), __BIT(7)), 895 1.7 mrg 896 1.20 riastrad /* Crypto */ 897 1.20 riastrad RK_COMPOSITE(RK3399_SCLK_CRYPTO0, "clk_crypto0", mux_pll_src_cpll_gpll_ppll_parents, 898 1.20 riastrad CLKSEL_CON(24), /* muxdiv_reg */ 899 1.20 riastrad __BITS(7,6), /* mux_mask */ 900 1.20 riastrad __BITS(4,0), /* div_mask */ 901 1.20 riastrad CLKGATE_CON(7), /* gate_reg */ 902 1.20 riastrad __BIT(7), /* gate_mask */ 903 1.20 riastrad RK_COMPOSITE_ROUND_DOWN /*???*/), 904 1.20 riastrad RK_COMPOSITE(RK3399_SCLK_CRYPTO1, "clk_crypto1", mux_pll_src_cpll_gpll_ppll_parents, 905 1.20 riastrad CLKSEL_CON(26), /* muxdiv_reg */ 906 1.20 riastrad __BITS(7,6), /* mux_mask */ 907 1.20 riastrad __BITS(4,0), /* div_mask */ 908 1.20 riastrad CLKGATE_CON(8), /* gate_reg */ 909 1.20 riastrad __BIT(7), /* gate_mask */ 910 1.20 riastrad RK_COMPOSITE_ROUND_DOWN /*???*/), 911 1.20 riastrad RK_GATE(RK3399_HCLK_M_CRYPTO0, "hclk_m_crypto0", "pclk_perilp0", CLKGATE_CON(24), 5), 912 1.20 riastrad RK_GATE(RK3399_HCLK_S_CRYPTO0, "hclk_s_crypto0", "pclk_perilp0", CLKGATE_CON(24), 6), 913 1.20 riastrad RK_GATE(RK3399_HCLK_M_CRYPTO1, "hclk_m_crypto1", "pclk_perilp0", CLKGATE_CON(24), 14), 914 1.20 riastrad RK_GATE(RK3399_HCLK_S_CRYPTO1, "hclk_s_crypto1", "pclk_perilp0", CLKGATE_CON(24), 15), 915 1.20 riastrad RK_GATE(RK3399_ACLK_DMAC1_PERILP, "aclk_dmac1_perilp", "pclk_perilp", CLKGATE_CON(25), 6), 916 1.20 riastrad 917 1.7 mrg /* TSADC */ 918 1.7 mrg RK_COMPOSITE(RK3399_SCLK_TSADC, "clk_tsadc", mux_clk_tsadc_parents, 919 1.7 mrg CLKSEL_CON(27), /* muxdiv_reg */ 920 1.7 mrg __BIT(15), /* mux_mask */ 921 1.7 mrg __BITS(9,0), /* div_mask */ 922 1.7 mrg CLKGATE_CON(9), /* gate_reg */ 923 1.7 mrg __BIT(1), /* gate_mask */ 924 1.7 mrg RK_COMPOSITE_ROUND_DOWN), 925 1.7 mrg RK_GATE(RK3399_PCLK_TSADC, "pclk_tsadc", "pclk_perilp1", CLKGATE_CON(22), 13), 926 1.11 jmcneill 927 1.11 jmcneill /* VOP0 */ 928 1.11 jmcneill RK_COMPOSITE(RK3399_ACLK_VOP0_PRE, "aclk_vop0_pre", mux_pll_src_vpll_cpll_gpll_npll_parents, 929 1.11 jmcneill CLKSEL_CON(47), /* muxdiv_reg */ 930 1.11 jmcneill __BITS(7,6), /* mux_mask */ 931 1.11 jmcneill __BITS(4,0), /* div_mask */ 932 1.11 jmcneill CLKGATE_CON(10), /* gate_reg */ 933 1.11 jmcneill __BIT(8), /* gate_mask */ 934 1.11 jmcneill 0), 935 1.11 jmcneill RK_COMPOSITE_NOMUX(0, "hclk_vop0_pre", "aclk_vop0_pre", 936 1.11 jmcneill CLKSEL_CON(47), /* div_reg */ 937 1.11 jmcneill __BITS(12,8), /* div_mask */ 938 1.11 jmcneill CLKGATE_CON(10), /* gate_reg */ 939 1.11 jmcneill __BIT(9), /* gate_mask */ 940 1.11 jmcneill 0), 941 1.11 jmcneill RK_COMPOSITE(RK3399_DCLK_VOP0_DIV, "dclk_vop0_div", mux_pll_src_vpll_cpll_gpll_parents, 942 1.11 jmcneill CLKSEL_CON(49), /* muxdiv_reg */ 943 1.11 jmcneill __BITS(9,8), /* mux_mask */ 944 1.11 jmcneill __BITS(7,0), /* div_mask */ 945 1.11 jmcneill CLKGATE_CON(10), /* gate_reg */ 946 1.11 jmcneill __BIT(12), /* gate_mask */ 947 1.12 jmcneill RK_COMPOSITE_SET_RATE_PARENT), 948 1.11 jmcneill RK_GATE(RK3399_ACLK_VOP0, "aclk_vop0", "aclk_vop0_pre", CLKGATE_CON(28), 3), 949 1.11 jmcneill RK_GATE(RK3399_HCLK_VOP0, "hclk_vop0", "hclk_vop0_pre", CLKGATE_CON(28), 2), 950 1.17 jakllsch RK_COMPOSITE_FRAC(RK3399_DCLK_VOP0_FRAC, "dclk_vop0_frac", "dclk_vop0_div", 951 1.17 jakllsch CLKSEL_CON(106), /* frac_reg */ 952 1.17 jakllsch 0), 953 1.11 jmcneill RK_MUX(RK3399_DCLK_VOP0, "dclk_vop0", mux_dclk_vop0_parents, CLKSEL_CON(49), __BIT(11)), 954 1.11 jmcneill 955 1.11 jmcneill /* VOP1 */ 956 1.11 jmcneill RK_COMPOSITE(RK3399_ACLK_VOP1_PRE, "aclk_vop1_pre", mux_pll_src_vpll_cpll_gpll_npll_parents, 957 1.11 jmcneill CLKSEL_CON(48), /* muxdiv_reg */ 958 1.11 jmcneill __BITS(7,6), /* mux_mask */ 959 1.11 jmcneill __BITS(4,0), /* div_mask */ 960 1.11 jmcneill CLKGATE_CON(10), /* gate_reg */ 961 1.11 jmcneill __BIT(10), /* gate_mask */ 962 1.11 jmcneill 0), 963 1.11 jmcneill RK_COMPOSITE_NOMUX(0, "hclk_vop1_pre", "aclk_vop1_pre", 964 1.11 jmcneill CLKSEL_CON(48), /* div_reg */ 965 1.11 jmcneill __BITS(12,8), /* div_mask */ 966 1.11 jmcneill CLKGATE_CON(10), /* gate_reg */ 967 1.11 jmcneill __BIT(11), /* gate_mask */ 968 1.11 jmcneill 0), 969 1.11 jmcneill RK_COMPOSITE(RK3399_DCLK_VOP1_DIV, "dclk_vop1_div", mux_pll_src_vpll_cpll_gpll_parents, 970 1.11 jmcneill CLKSEL_CON(50), /* muxdiv_reg */ 971 1.11 jmcneill __BITS(9,8), /* mux_mask */ 972 1.11 jmcneill __BITS(7,0), /* div_mask */ 973 1.11 jmcneill CLKGATE_CON(10), /* gate_reg */ 974 1.11 jmcneill __BIT(13), /* gate_mask */ 975 1.12 jmcneill RK_COMPOSITE_SET_RATE_PARENT), 976 1.11 jmcneill RK_GATE(RK3399_ACLK_VOP1, "aclk_vop1", "aclk_vop1_pre", CLKGATE_CON(28), 7), 977 1.11 jmcneill RK_GATE(RK3399_HCLK_VOP1, "hclk_vop1", "hclk_vop1_pre", CLKGATE_CON(28), 6), 978 1.17 jakllsch RK_COMPOSITE_FRAC(RK3399_DCLK_VOP1_FRAC, "dclk_vop1_frac", "dclk_vop1_div", 979 1.17 jakllsch CLKSEL_CON(107), /* frac_reg */ 980 1.17 jakllsch 0), 981 1.11 jmcneill RK_MUX(RK3399_DCLK_VOP1, "dclk_vop1", mux_dclk_vop1_parents, CLKSEL_CON(50), __BIT(11)), 982 1.11 jmcneill 983 1.11 jmcneill /* VIO */ 984 1.11 jmcneill RK_COMPOSITE(RK3399_ACLK_VIO, "aclk_vio", mux_pll_src_cpll_gpll_ppll_parents, 985 1.11 jmcneill CLKSEL_CON(42), /* muxdiv_reg */ 986 1.11 jmcneill __BITS(7,6), /* mux_mask */ 987 1.11 jmcneill __BITS(4,0), /* div_mask */ 988 1.11 jmcneill CLKGATE_CON(11), /* gate_reg */ 989 1.11 jmcneill __BIT(0), /* gate_mask */ 990 1.11 jmcneill 0), 991 1.11 jmcneill RK_COMPOSITE_NOMUX(RK3399_PCLK_VIO, "pclk_vio", "aclk_vio", 992 1.11 jmcneill CLKSEL_CON(43), /* div_reg */ 993 1.11 jmcneill __BITS(4,0), /* div_mask */ 994 1.11 jmcneill CLKGATE_CON(11), /* gate_reg */ 995 1.11 jmcneill __BIT(1), /* gate_mask */ 996 1.11 jmcneill 0), 997 1.11 jmcneill RK_GATE(RK3399_PCLK_VIO_GRF, "pclk_vio_grf", "pclk_vio", CLKGATE_CON(29), 12), 998 1.11 jmcneill 999 1.11 jmcneill /* HDMI */ 1000 1.11 jmcneill RK_COMPOSITE(RK3399_ACLK_HDCP, "aclk_hdcp", mux_pll_src_cpll_gpll_ppll_parents, 1001 1.11 jmcneill CLKSEL_CON(42), /* muxdiv_reg */ 1002 1.11 jmcneill __BITS(15,14), /* mux_mask */ 1003 1.11 jmcneill __BITS(12,8), /* div_mask */ 1004 1.11 jmcneill CLKGATE_CON(11), /* gate_reg */ 1005 1.11 jmcneill __BIT(12), /* gate_mask */ 1006 1.11 jmcneill 0), 1007 1.11 jmcneill RK_COMPOSITE_NOMUX(RK3399_PCLK_HDCP, "pclk_hdcp", "aclk_hdcp", 1008 1.11 jmcneill CLKSEL_CON(43), /* div_reg */ 1009 1.11 jmcneill __BITS(14,10), /* div_mask */ 1010 1.11 jmcneill CLKGATE_CON(11), /* gate_reg */ 1011 1.11 jmcneill __BIT(10), /* gate_mask */ 1012 1.11 jmcneill 0), 1013 1.11 jmcneill RK_COMPOSITE(RK3399_SCLK_HDMI_CEC, "clk_hdmi_cec", pll_parents, 1014 1.11 jmcneill CLKSEL_CON(45), /* muxdiv_reg */ 1015 1.11 jmcneill __BIT(15), /* mux_mask */ 1016 1.11 jmcneill __BITS(9,0), /* div_mask */ 1017 1.11 jmcneill CLKGATE_CON(11), /* gate_reg */ 1018 1.11 jmcneill __BIT(7), /* gate_mask */ 1019 1.11 jmcneill 0), 1020 1.11 jmcneill RK_GATE(RK3399_PCLK_HDMI_CTRL, "pclk_hdmi_ctrl", "pclk_hdcp", CLKGATE_CON(29), 6), 1021 1.11 jmcneill RK_GATE(RK3399_SCLK_HDMI_SFR, "clk_hdmi_sfr", "xin24m", CLKGATE_CON(11), 6), 1022 1.13 jmcneill 1023 1.13 jmcneill /* I2S2 */ 1024 1.13 jmcneill RK_COMPOSITE(0, "clk_i2s0_div", mux_pll_src_cpll_gpll_parents, 1025 1.13 jmcneill CLKSEL_CON(28), /* muxdiv_reg */ 1026 1.13 jmcneill __BIT(7), /* mux_mask */ 1027 1.13 jmcneill __BITS(6,0), /* div_mask */ 1028 1.13 jmcneill CLKGATE_CON(8), /* gate_reg */ 1029 1.13 jmcneill __BIT(3), /* gate_mask */ 1030 1.13 jmcneill 0), 1031 1.13 jmcneill RK_COMPOSITE(0, "clk_i2s1_div", mux_pll_src_cpll_gpll_parents, 1032 1.13 jmcneill CLKSEL_CON(29), /* muxdiv_reg */ 1033 1.13 jmcneill __BIT(7), /* mux_mask */ 1034 1.13 jmcneill __BITS(6,0), /* div_mask */ 1035 1.13 jmcneill CLKGATE_CON(8), /* gate_reg */ 1036 1.13 jmcneill __BIT(6), /* gate_mask */ 1037 1.13 jmcneill 0), 1038 1.13 jmcneill RK_COMPOSITE(0, "clk_i2s2_div", mux_pll_src_cpll_gpll_parents, 1039 1.13 jmcneill CLKSEL_CON(30), /* muxdiv_reg */ 1040 1.13 jmcneill __BIT(7), /* mux_mask */ 1041 1.13 jmcneill __BITS(6,0), /* div_mask */ 1042 1.13 jmcneill CLKGATE_CON(8), /* gate_reg */ 1043 1.13 jmcneill __BIT(9), /* gate_mask */ 1044 1.13 jmcneill 0), 1045 1.13 jmcneill RK_COMPOSITE_FRAC(0, "clk_i2s0_frac", "clk_i2s0_div", 1046 1.13 jmcneill CLKSEL_CON(96), /* frac_reg */ 1047 1.13 jmcneill 0), 1048 1.13 jmcneill RK_COMPOSITE_FRAC(0, "clk_i2s1_frac", "clk_i2s1_div", 1049 1.13 jmcneill CLKSEL_CON(97), /* frac_reg */ 1050 1.13 jmcneill 0), 1051 1.13 jmcneill RK_COMPOSITE_FRAC(0, "clk_i2s2_frac", "clk_i2s2_div", 1052 1.13 jmcneill CLKSEL_CON(98), /* frac_reg */ 1053 1.13 jmcneill 0), 1054 1.13 jmcneill RK_MUX(0, "clk_i2s0_mux", mux_i2s0_parents, CLKSEL_CON(28), __BITS(9,8)), 1055 1.13 jmcneill RK_MUX(0, "clk_i2s1_mux", mux_i2s1_parents, CLKSEL_CON(29), __BITS(9,8)), 1056 1.13 jmcneill RK_MUX(0, "clk_i2s2_mux", mux_i2s2_parents, CLKSEL_CON(30), __BITS(9,8)), 1057 1.13 jmcneill RK_GATE(RK3399_SCLK_I2S0_8CH, "clk_i2s0", "clk_i2s0_mux", CLKGATE_CON(8), 5), 1058 1.13 jmcneill RK_GATE(RK3399_SCLK_I2S1_8CH, "clk_i2s1", "clk_i2s1_mux", CLKGATE_CON(8), 8), 1059 1.13 jmcneill RK_GATE(RK3399_SCLK_I2S2_8CH, "clk_i2s2", "clk_i2s2_mux", CLKGATE_CON(8), 11), 1060 1.13 jmcneill RK_GATE(RK3399_HCLK_I2S0_8CH, "hclk_i2s0", "hclk_perilp1", CLKGATE_CON(34), 0), 1061 1.13 jmcneill RK_GATE(RK3399_HCLK_I2S1_8CH, "hclk_i2s1", "hclk_perilp1", CLKGATE_CON(34), 1), 1062 1.13 jmcneill RK_GATE(RK3399_HCLK_I2S2_8CH, "hclk_i2s2", "hclk_perilp1", CLKGATE_CON(34), 2), 1063 1.13 jmcneill RK_MUX(0, "clk_i2sout_src", mux_i2sch_parents, CLKSEL_CON(31), __BITS(1,0)), 1064 1.13 jmcneill RK_COMPOSITE(RK3399_SCLK_I2S_8CH_OUT, "clk_i2sout", mux_i2sout_parents, 1065 1.13 jmcneill CLKSEL_CON(31), /* muxdiv_reg */ 1066 1.13 jmcneill __BIT(2), /* mux_mask */ 1067 1.13 jmcneill 0, /* div_mask */ 1068 1.13 jmcneill CLKGATE_CON(8), /* gate_reg */ 1069 1.13 jmcneill __BIT(12), /* gate_mask */ 1070 1.13 jmcneill RK_COMPOSITE_SET_RATE_PARENT), 1071 1.15 jakllsch 1072 1.15 jakllsch /* eDP */ 1073 1.15 jakllsch RK_COMPOSITE(RK3399_PCLK_EDP, "pclk_edp", mux_pll_src_cpll_gpll_parents, 1074 1.15 jakllsch CLKSEL_CON(44), /* muxdiv_reg */ 1075 1.15 jakllsch __BIT(15), /* mux_mask */ 1076 1.15 jakllsch __BITS(13,8), /* div_mask */ 1077 1.15 jakllsch CLKGATE_CON(11), /* gate_reg */ 1078 1.15 jakllsch __BIT(11), /* gate_mask */ 1079 1.15 jakllsch 0), 1080 1.15 jakllsch RK_GATE(RK3399_PCLK_EDP_NOC, "pclk_edp_noc", "pclk_edp", CLKGATE_CON(32), 12), 1081 1.15 jakllsch RK_GATE(RK3399_PCLK_EDP_CTRL, "pclk_edp_ctrl", "pclk_edp", CLKGATE_CON(32), 13), 1082 1.15 jakllsch 1083 1.16 jakllsch RK_COMPOSITE(RK3399_SCLK_DP_CORE, "clk_dp_core", mux_pll_src_npll_cpll_gpll_parents, 1084 1.16 jakllsch CLKSEL_CON(46), /* muxdiv_reg */ 1085 1.16 jakllsch __BITS(7,6), /* mux_mask */ 1086 1.16 jakllsch __BITS(4,0), /* div_mask */ 1087 1.16 jakllsch CLKGATE_CON(11), /* gate_reg */ 1088 1.16 jakllsch __BIT(8), /* gate_mask */ 1089 1.16 jakllsch 0), 1090 1.16 jakllsch RK_GATE(RK3399_PCLK_DP_CTRL, "pclk_dp_ctrl", "pclk_hdcp", CLKGATE_CON(29), 7), 1091 1.27 rjs /* GPU */ 1092 1.27 rjs RK_COMPOSITE(0, "aclk_gpu_pre", mux_aclk_gpu_parents, 1093 1.27 rjs CLKSEL_CON(13), /* muxdiv_reg */ 1094 1.27 rjs __BITS(7,5), /* mux_mask */ 1095 1.27 rjs __BITS(4,0), /* div_mask */ 1096 1.27 rjs CLKGATE_CON(13), /* gate_reg */ 1097 1.27 rjs __BIT(0), /* gate_mask */ 1098 1.27 rjs 0), 1099 1.27 rjs RK_GATE(RK3399_ACLK_GPU, "aclk_gpu", "aclk_gpu_pre", CLKGATE_CON(30), 8), 1100 1.27 rjs RK_GATE(RK3399_ACLK_PERF_GPU, "aclk_perf_gpu", "aclk_gpu_pre", CLKGATE_CON(30), 10), 1101 1.27 rjs RK_GATE(RK3399_ACLK_GPU_GRF, "aclk_gpu_grf", "aclk_gpu_pre", CLKGATE_CON(30), 11), 1102 1.27 rjs RK_GATE(RK3399_SCLK_PVTM_GPU, "clk_pvtm_gpu", "xin24m", CLKGATE_CON(13), 1), 1103 1.27 rjs RK_GATE(0, "aclk_gpu_pll_src", "xin24m", CLKGATE_CON(13), 0), 1104 1.16 jakllsch 1105 1.13 jmcneill }; 1106 1.13 jmcneill 1107 1.13 jmcneill static const struct rk3399_init_param { 1108 1.13 jmcneill const char *clk; 1109 1.13 jmcneill const char *parent; 1110 1.13 jmcneill } rk3399_init_params[] = { 1111 1.13 jmcneill { .clk = "clk_i2s0_mux", .parent = "clk_i2s0_frac" }, 1112 1.13 jmcneill { .clk = "clk_i2s1_mux", .parent = "clk_i2s1_frac" }, 1113 1.13 jmcneill { .clk = "clk_i2s2_mux", .parent = "clk_i2s2_frac" }, 1114 1.18 jakllsch { .clk = "dclk_vop0_div", .parent = "gpll" }, 1115 1.18 jakllsch { .clk = "dclk_vop1_div", .parent = "gpll" }, 1116 1.18 jakllsch { .clk = "dclk_vop0", .parent = "dclk_vop0_frac" }, 1117 1.18 jakllsch { .clk = "dclk_vop1", .parent = "dclk_vop1_frac" }, 1118 1.1 jmcneill }; 1119 1.1 jmcneill 1120 1.8 jmcneill static void 1121 1.8 jmcneill rk3399_cru_init(struct rk_cru_softc *sc) 1122 1.8 jmcneill { 1123 1.13 jmcneill struct rk_cru_clk *clk, *pclk; 1124 1.12 jmcneill uint32_t write_mask, write_val; 1125 1.13 jmcneill int error; 1126 1.13 jmcneill u_int n; 1127 1.8 jmcneill 1128 1.8 jmcneill /* 1129 1.8 jmcneill * Force an update of BPLL to bring it out of slow mode. 1130 1.8 jmcneill */ 1131 1.8 jmcneill clk = rk_cru_clock_find(sc, "armclkb"); 1132 1.8 jmcneill clk_set_rate(&clk->base, clk_get_rate(&clk->base)); 1133 1.12 jmcneill 1134 1.12 jmcneill /* 1135 1.12 jmcneill * Set DCLK_VOP0 and DCLK_VOP1 dividers to 1. 1136 1.12 jmcneill */ 1137 1.12 jmcneill write_mask = __BITS(7,0) << 16; 1138 1.12 jmcneill write_val = 0; 1139 1.12 jmcneill CRU_WRITE(sc, CLKSEL_CON(49), write_mask | write_val); 1140 1.12 jmcneill CRU_WRITE(sc, CLKSEL_CON(50), write_mask | write_val); 1141 1.13 jmcneill 1142 1.13 jmcneill /* 1143 1.13 jmcneill * Set defaults 1144 1.13 jmcneill */ 1145 1.13 jmcneill for (n = 0; n < __arraycount(rk3399_init_params); n++) { 1146 1.13 jmcneill const struct rk3399_init_param *param = &rk3399_init_params[n]; 1147 1.13 jmcneill clk = rk_cru_clock_find(sc, param->clk); 1148 1.13 jmcneill KASSERTMSG(clk != NULL, "couldn't find clock %s", param->clk); 1149 1.13 jmcneill if (param->parent != NULL) { 1150 1.13 jmcneill pclk = rk_cru_clock_find(sc, param->parent); 1151 1.13 jmcneill KASSERTMSG(pclk != NULL, "couldn't find clock %s", param->parent); 1152 1.13 jmcneill error = clk_set_parent(&clk->base, &pclk->base); 1153 1.13 jmcneill if (error != 0) { 1154 1.13 jmcneill aprint_error_dev(sc->sc_dev, "couldn't set %s parent to %s: %d\n", 1155 1.13 jmcneill param->clk, param->parent, error); 1156 1.13 jmcneill continue; 1157 1.13 jmcneill } 1158 1.13 jmcneill } 1159 1.13 jmcneill } 1160 1.8 jmcneill } 1161 1.8 jmcneill 1162 1.1 jmcneill static int 1163 1.1 jmcneill rk3399_cru_match(device_t parent, cfdata_t cf, void *aux) 1164 1.1 jmcneill { 1165 1.1 jmcneill struct fdt_attach_args * const faa = aux; 1166 1.1 jmcneill 1167 1.21 thorpej return of_compatible_match(faa->faa_phandle, compat_data); 1168 1.1 jmcneill } 1169 1.1 jmcneill 1170 1.1 jmcneill static void 1171 1.1 jmcneill rk3399_cru_attach(device_t parent, device_t self, void *aux) 1172 1.1 jmcneill { 1173 1.1 jmcneill struct rk_cru_softc * const sc = device_private(self); 1174 1.1 jmcneill struct fdt_attach_args * const faa = aux; 1175 1.1 jmcneill 1176 1.1 jmcneill sc->sc_dev = self; 1177 1.1 jmcneill sc->sc_phandle = faa->faa_phandle; 1178 1.1 jmcneill sc->sc_bst = faa->faa_bst; 1179 1.1 jmcneill 1180 1.1 jmcneill sc->sc_clks = rk3399_cru_clks; 1181 1.1 jmcneill sc->sc_nclks = __arraycount(rk3399_cru_clks); 1182 1.1 jmcneill 1183 1.23 jmcneill sc->sc_grf_soc_status = 0x0480; 1184 1.1 jmcneill sc->sc_softrst_base = SOFTRST_CON(0); 1185 1.1 jmcneill 1186 1.1 jmcneill if (rk_cru_attach(sc) != 0) 1187 1.1 jmcneill return; 1188 1.1 jmcneill 1189 1.1 jmcneill aprint_naive("\n"); 1190 1.1 jmcneill aprint_normal(": RK3399 CRU\n"); 1191 1.1 jmcneill 1192 1.8 jmcneill rk3399_cru_init(sc); 1193 1.8 jmcneill 1194 1.1 jmcneill rk_cru_print(sc); 1195 1.1 jmcneill } 1196