1 /* SPDX-License-Identifier: GPL-2.0 */ 2 /* 3 * Copyright (c) 2025 Rockchip Electronics Co. Ltd. 4 * Author: Elaine Zhang <zhangqing@rock-chips.com> 5 */ 6 7 #ifndef _ASM_ARCH_CRU_RV1126B_H 8 #define _ASM_ARCH_CRU_RV1126B_H 9 10 #include <common.h> 11 12 #define MHz 1000000 13 #define KHz 1000 14 #define OSC_HZ (24 * MHz) 15 #define RC_OSC_HZ (125 * MHz) 16 17 #define GPLL_HZ (1188 * MHz) 18 #define AUPLL_HZ (983040000) 19 #define CPLL_HZ (1000 * MHz) 20 21 /* RV1126B pll id */ 22 enum rv1126b_pll_id { 23 GPLL, 24 AUPLL, 25 CPLL, 26 PLL_COUNT, 27 }; 28 29 struct rv1126b_clk_info { 30 unsigned long id; 31 char *name; 32 bool is_cru; 33 }; 34 35 struct rv1126b_clk_priv { 36 struct rv1126b_cru *cru; 37 struct rv1126b_grf *grf; 38 ulong gpll_hz; 39 ulong aupll_hz; 40 ulong cpll_hz; 41 ulong armclk_hz; 42 ulong armclk_enter_hz; 43 ulong armclk_init_hz; 44 bool sync_kernel; 45 bool set_armclk_rate; 46 }; 47 48 struct rv1126b_grf_clk_priv { 49 struct rv1126b_grf *grf; 50 }; 51 52 struct rv1126b_pll { 53 unsigned int con0; 54 unsigned int con1; 55 unsigned int con2; 56 unsigned int con3; 57 unsigned int con4; 58 unsigned int reserved0[3]; 59 }; 60 61 struct rv1126b_cru { 62 struct rv1126b_pll pll[2]; 63 unsigned int reserved0[176]; 64 unsigned int clksel_con[71]; 65 unsigned int reserved1[249]; 66 unsigned int clkgate_con[16]; 67 unsigned int reserved2[112]; 68 unsigned int softrst_con[16]; 69 unsigned int reserved3[112]; 70 unsigned int glb_cnt_th; 71 unsigned int glb_rst_st; 72 unsigned int glb_srst_fst; 73 unsigned int glb_srst_snd; 74 unsigned int glb_rst_con[3]; 75 unsigned int reserved4[41]; 76 unsigned int clk_cm_frac0_div_h; 77 unsigned int clk_cm_frac1_div_h; 78 unsigned int clk_cm_frac2_div_h; 79 unsigned int clk_uart_frac0_div_h; 80 unsigned int clk_uart_frac1_div_h; 81 unsigned int clk_audio_frac0_div_h; 82 unsigned int clk_audio_frac1_div_h; 83 unsigned int reserved5[15753]; 84 unsigned int bus_clksel_con[4]; 85 unsigned int reserved6[316]; 86 unsigned int bus_clkgate_con[7]; 87 unsigned int reserved7[121]; 88 unsigned int bus_softrst_con[8]; 89 unsigned int reserved8[15928]; 90 unsigned int peri_clksel_con[2]; 91 unsigned int reserved9[318]; 92 unsigned int peri_clkgate_con[2]; 93 unsigned int reserved10[126]; 94 unsigned int peri_softrst_con[2]; 95 unsigned int reserved11[15934]; 96 unsigned int core_clksel_con[3]; 97 unsigned int reserved12[317]; 98 unsigned int core_clkgate_con[2]; 99 unsigned int reserved13[126]; 100 unsigned int core_softrst_con[2]; 101 unsigned int reserved14[15934]; 102 unsigned int pmu_clksel_con[9]; 103 unsigned int reserved15[311]; 104 unsigned int pmu_clkgate_con[4]; 105 unsigned int reserved16[124]; 106 unsigned int pmu_softrst_con[4]; 107 unsigned int reserved17[15932]; 108 unsigned int pmu1_clksel_con[2]; 109 unsigned int reserved18[318]; 110 unsigned int pmu1_clkgate_con[2]; 111 unsigned int reserved19[126]; 112 unsigned int pmu1_softrst_con[2]; 113 unsigned int reserved20[32318]; 114 unsigned int vi_clksel_con[1]; 115 unsigned int reserved21[319]; 116 unsigned int vi_clkgate_con[5]; 117 unsigned int reserved22[123]; 118 unsigned int vi_softrst_con[4]; 119 }; 120 121 check_member(rv1126b_cru, clksel_con[0], 0x300); 122 check_member(rv1126b_cru, clkgate_con[0], 0x800); 123 check_member(rv1126b_cru, softrst_con[0], 0xa00); 124 check_member(rv1126b_cru, clk_cm_frac0_div_h, 0xcc0); 125 check_member(rv1126b_cru, bus_clksel_con[0], 0x10300); 126 check_member(rv1126b_cru, bus_clkgate_con[0], 0x10800); 127 check_member(rv1126b_cru, bus_softrst_con[0], 0x10a00); 128 check_member(rv1126b_cru, peri_clksel_con[0], 0x20300); 129 check_member(rv1126b_cru, peri_clkgate_con[0], 0x20800); 130 check_member(rv1126b_cru, peri_softrst_con[0], 0x20a00); 131 check_member(rv1126b_cru, core_clksel_con[0], 0x30300); 132 check_member(rv1126b_cru, core_clkgate_con[0], 0x30800); 133 check_member(rv1126b_cru, core_softrst_con[0], 0x30a00); 134 check_member(rv1126b_cru, pmu_clksel_con[0], 0x40300); 135 check_member(rv1126b_cru, pmu_clkgate_con[0], 0x40800); 136 check_member(rv1126b_cru, pmu_softrst_con[0], 0x40a00); 137 check_member(rv1126b_cru, pmu1_clksel_con[0], 0x50300); 138 check_member(rv1126b_cru, pmu1_clkgate_con[0], 0x50800); 139 check_member(rv1126b_cru, pmu1_softrst_con[0], 0x50a00); 140 check_member(rv1126b_cru, vi_clksel_con[0], 0x70300); 141 check_member(rv1126b_cru, vi_clkgate_con[0], 0x70800); 142 check_member(rv1126b_cru, vi_softrst_con[0], 0x70a00); 143 144 struct pll_rate_table { 145 unsigned long rate; 146 unsigned int fbdiv; 147 unsigned int postdiv1; 148 unsigned int refdiv; 149 unsigned int postdiv2; 150 unsigned int dsmpd; 151 unsigned int frac; 152 }; 153 154 #define RV1126B_CRU_BASE 0x20000000 155 #define RV1126B_TOPCRU_BASE 0x0 156 #define RV1126B_BUSCRU_BASE 0x10000 157 #define RV1126B_PERICRU_BASE 0x20000 158 #define RV1126B_CORECRU_BASE 0x30000 159 #define RV1126B_PMUCRU_BASE 0x40000 160 #define RV1126B_PMU1CRU_BASE 0x50000 161 #define RV1126B_DDRCRU_BASE 0x60000 162 #define RV1126B_SUBDDRCRU_BASE 0x68000 163 #define RV1126B_VICRU_BASE 0x70000 164 #define RV1126B_VEPUCRU_BASE 0x80000 165 #define RV1126B_NPUCRU_BASE 0x90000 166 #define RV1126B_VDOCRU_BASE 0xA0000 167 #define RV1126B_VCPCRU_BASE 0xB0000 168 169 #define RV1126B_PLL_CON(x) ((x) * 0x4 + RV1126B_TOPCRU_BASE) 170 #define RV1126B_MODE_CON (0x280 + RV1126B_TOPCRU_BASE) 171 #define RV1126B_CLKSEL_CON(x) ((x) * 0x4 + 0x300 + RV1126B_TOPCRU_BASE) 172 #define RV1126B_PERIPLL_CON(x) ((x) * 0x4 + RV1126B_PERICRU_BASE) 173 #define RV1126B_SUBDDRPLL_CON(x) ((x) * 0x4 + RV1126B_SUBDDRCRU_BASE) 174 175 enum { 176 /* CRU_CLK_SEL10_CON */ 177 CLK_AUDIO_FRAC1_SRC_SEL_SHIFT = 12, 178 CLK_AUDIO_FRAC1_SRC_SEL_MASK = 0x3 << CLK_AUDIO_FRAC1_SRC_SEL_SHIFT, 179 CLK_AUDIO_FRAC0_SRC_SEL_SHIFT = 10, 180 CLK_AUDIO_FRAC0_SRC_SEL_MASK = 0x3 << CLK_AUDIO_FRAC0_SRC_SEL_SHIFT, 181 CLK_UART_FRAC1_SRC_SEL_SHIFT = 8, 182 CLK_UART_FRAC1_SRC_SEL_MASK = 0x3 << CLK_UART_FRAC1_SRC_SEL_SHIFT, 183 CLK_UART_FRAC0_SRC_SEL_SHIFT = 6, 184 CLK_UART_FRAC0_SRC_SEL_MASK = 0x3 << CLK_UART_FRAC0_SRC_SEL_SHIFT, 185 CLK_CM_FRAC2_SRC_SEL_SHIFT = 4, 186 CLK_CM_FRAC2_SRC_SEL_MASK = 0x3 << CLK_CM_FRAC2_SRC_SEL_SHIFT, 187 CLK_CM_FRAC1_SRC_SEL_SHIFT = 2, 188 CLK_CM_FRAC1_SRC_SEL_MASK = 0x3 << CLK_CM_FRAC1_SRC_SEL_SHIFT, 189 CLK_CM_FRAC0_SRC_SEL_SHIFT = 0, 190 CLK_CM_FRAC0_SRC_SEL_MASK = 0x3 << CLK_CM_FRAC0_SRC_SEL_SHIFT, 191 CLK_FRAC_SRC_SEL_24M = 0, 192 CLK_FRAC_SRC_SEL_GPLL, 193 CLK_FRAC_SRC_SEL_AUPLL, 194 CLK_FRAC_SRC_SEL_CPLL, 195 196 /* CRU_CLK_SEL12_CON */ 197 SCLK_UART1_SEL_SHIFT = 13, 198 SCLK_UART1_SEL_MASK = 0x7 << SCLK_UART1_SEL_SHIFT, 199 SCLK_UART1_DIV_SHIFT = 8, 200 SCLK_UART1_DIV_MASK = 0x1f << SCLK_UART1_DIV_SHIFT, 201 SCLK_UART0_SRC_SEL_SHIFT = 5, 202 SCLK_UART0_SRC_SEL_MASK = 0x7 << SCLK_UART0_SRC_SEL_SHIFT, 203 SCLK_UART_SEL_OSC = 0, 204 SCLK_UART_SEL_CM_FRAC0, 205 SCLK_UART_SEL_CM_FRAC1, 206 SCLK_UART_SEL_CM_FRAC2, 207 SCLK_UART_SEL_UART_FRAC0, 208 SCLK_UART_SEL_UART_FRAC1, 209 SCLK_UART0_SRC_DIV_SHIFT = 0, 210 SCLK_UART0_SRC_DIV_MASK = 0x1f << SCLK_UART0_SRC_DIV_SHIFT, 211 212 /* CRU_CLK_SEL13_CON */ 213 SCLK_UART3_SEL_SHIFT = 13, 214 SCLK_UART3_SEL_MASK = 0x7 << SCLK_UART3_SEL_SHIFT, 215 SCLK_UART3_DIV_SHIFT = 8, 216 SCLK_UART3_DIV_MASK = 0x1f << SCLK_UART3_DIV_SHIFT, 217 SCLK_UART2_SEL_SHIFT = 5, 218 SCLK_UART2_SEL_MASK = 0x7 << SCLK_UART2_SEL_SHIFT, 219 SCLK_UART2_DIV_SHIFT = 0, 220 SCLK_UART2_DIV_MASK = 0x1f << SCLK_UART2_DIV_SHIFT, 221 222 /* CRU_CLK_SEL14_CON */ 223 SCLK_UART5_SEL_SHIFT = 13, 224 SCLK_UART5_SEL_MASK = 0x7 << SCLK_UART5_SEL_SHIFT, 225 SCLK_UART5_DIV_SHIFT = 8, 226 SCLK_UART5_DIV_MASK = 0x1f << SCLK_UART5_DIV_SHIFT, 227 SCLK_UART4_SEL_SHIFT = 5, 228 SCLK_UART4_SEL_MASK = 0x7 << SCLK_UART4_SEL_SHIFT, 229 SCLK_UART4_DIV_SHIFT = 0, 230 SCLK_UART4_DIV_MASK = 0x1f << SCLK_UART4_DIV_SHIFT, 231 232 /* CRU_CLK_SEL15_CON */ 233 SCLK_UART7_SEL_SHIFT = 13, 234 SCLK_UART7_SEL_MASK = 0x7 << SCLK_UART7_SEL_SHIFT, 235 SCLK_UART7_DIV_SHIFT = 8, 236 SCLK_UART7_DIV_MASK = 0x1f << SCLK_UART7_DIV_SHIFT, 237 SCLK_UART6_SEL_SHIFT = 5, 238 SCLK_UART6_SEL_MASK = 0x7 << SCLK_UART6_SEL_SHIFT, 239 SCLK_UART6_DIV_SHIFT = 0, 240 SCLK_UART6_DIV_MASK = 0x1f << SCLK_UART6_DIV_SHIFT, 241 242 /* CRU_CLK_SEL25_CON */ 243 CLK_FRAC_NUMERATOR_SHIFT = 16, 244 CLK_FRAC_NUMERATOR_MASK = 0xffff << 16, 245 CLK_FRAC_DENOMINATOR_SHIFT = 0, 246 CLK_FRAC_DENOMINATOR_MASK = 0xffff, 247 CLK_FRAC_H_NUMERATOR_SHIFT = 8, 248 CLK_FRAC_H_NUMERATOR_MASK = 0xff << 8, 249 CLK_FRAC_H_DENOMINATOR_SHIFT = 0, 250 CLK_FRAC_H_DENOMINATOR_MASK = 0xff, 251 252 /* CRU_CLK_SEL43_CON */ 253 DCLK_VOP_SEL_SHIFT = 8, 254 DCLK_VOP_SEL_MASK = 0x1 << DCLK_VOP_SEL_SHIFT, 255 DCLK_VOP_SEL_GPLL = 0, 256 DCLK_VOP_SEL_CPLL, 257 DCLK_VOP_DIV_SHIFT = 0, 258 DCLK_VOP_DIV_MASK = 0xff << DCLK_VOP_DIV_SHIFT, 259 260 /* CRU_CLK_SEL44_CON */ 261 HCLK_BUS_SEL_SHIFT = 10, 262 HCLK_BUS_SEL_MASK = 0x1 << HCLK_BUS_SEL_SHIFT, 263 HCLK_BUS_SEL_200M = 0, 264 HCLK_BUS_SEL_100M, 265 ACLK_BUS_SEL_SHIFT = 8, 266 ACLK_BUS_SEL_MASK = 0x3 << ACLK_BUS_SEL_SHIFT, 267 ACLK_BUS_SEL_400M = 0, 268 ACLK_BUS_SEL_300M, 269 ACLK_BUS_SEL_200M, 270 ACLK_TOP_SEL_SHIFT = 6, 271 ACLK_TOP_SEL_MASK = 0x3 << ACLK_TOP_SEL_SHIFT, 272 ACLK_TOP_SEL_600M = 0, 273 ACLK_TOP_SEL_400M, 274 ACLK_TOP_SEL_200M, 275 276 /* CRU_CLK_SEL45_CON */ 277 CLK_SDMMC_SEL_SHIFT = 8, 278 CLK_SDMMC_SEL_MASK = 0x3 << CLK_SDMMC_SEL_SHIFT, 279 CLK_SDMMC_SEL_GPLL = 0, 280 CLK_SDMMC_SEL_CPLL, 281 CLK_SDMMC_SEL_24M, 282 CLK_SDMMC_DIV_SHIFT = 0, 283 CLK_SDMMC_DIV_MASK = 0xff << CLK_SDMMC_DIV_SHIFT, 284 285 /* CRU_CLK_SEL46_CON */ 286 TCLK_WDT_HPMCU_SEL_SHIFT = 14, 287 TCLK_WDT_HPMCU_SEL_MASK = 0x1 << TCLK_WDT_HPMCU_SEL_SHIFT, 288 TCLK_WDT_S_SEL_SHIFT = 13, 289 TCLK_WDT_S_SEL_MASK = 0x1 << TCLK_WDT_S_SEL_SHIFT, 290 TCLK_WDT_NS_SEL_SHIFT = 12, 291 TCLK_WDT_NS_SEL_MASK = 0x1 << TCLK_WDT_NS_SEL_SHIFT, 292 TCLK_WDT_SEL_100M = 0, 293 TCLK_WDT_SEL_OSC, 294 295 /* CRU_CLK_SEL47_CON */ 296 ACLK_PERI_SEL_SHIFT = 13, 297 ACLK_PERI_SEL_MASK = 0x1 << ACLK_PERI_SEL_SHIFT, 298 ACLK_PERI_SEL_200M = 0, 299 ACLK_PERI_SEL_24M, 300 PCLK_PERI_SEL_SHIFT = 12, 301 PCLK_PERI_SEL_MASK = 0x1 << PCLK_PERI_SEL_SHIFT, 302 PCLK_PERI_SEL_100M = 0, 303 PCLK_PERI_SEL_24M, 304 305 /* CRU_CLK_SEL50_CON */ 306 ACLK_RKCE_SEL_SHIFT = 13, 307 ACLK_RKCE_SEL_MASK = 0x1 << ACLK_RKCE_SEL_SHIFT, 308 ACLK_RKCE_SEL_200M = 0, 309 ACLK_RKCE_SEL_24M, 310 CLK_PKA_RKCE_SEL_SHIFT = 12, 311 CLK_PKA_RKCE_SEL_MASK = 0x1 << CLK_PKA_RKCE_SEL_SHIFT, 312 CLK_PKA_RKCE_SEL_300M = 0, 313 CLK_PKA_RKCE_SEL_200M, 314 CLK_PWM3_SEL_SHIFT = 11, 315 CLK_PWM3_SEL_MASK = 0x1 << CLK_PWM3_SEL_SHIFT, 316 CLK_PWM2_SEL_SHIFT = 10, 317 CLK_PWM2_SEL_MASK = 0x1 << CLK_PWM2_SEL_SHIFT, 318 CLK_PWM0_SEL_SHIFT = 8, 319 CLK_PWM0_SEL_MASK = 0x1 << CLK_PWM0_SEL_SHIFT, 320 CLK_PWM_SEL_100M = 0, 321 CLK_PWM_SEL_24M, 322 CLK_SPI1_SEL_SHIFT = 4, 323 CLK_SPI1_SEL_MASK = 0x3 << CLK_SPI1_SEL_SHIFT, 324 CLK_SPI0_SEL_SHIFT = 2, 325 CLK_SPI0_SEL_MASK = 0x3 << CLK_SPI0_SEL_SHIFT, 326 CLK_SPI0_SEL_200M = 0, 327 CLK_SPI0_SEL_100M, 328 CLK_SPI0_SEL_50M, 329 CLK_SPI0_SEL_24M, 330 CLK_I2C_SEL_SHIFT = 1, 331 CLK_I2C_SEL_MASK = 0x1 << CLK_I2C_SEL_SHIFT, 332 CLK_I2C_SEL_200M = 0, 333 CLK_I2C_SEL_24M, 334 335 /* CRU_CLK_SEL63_CON */ 336 CLK_SARADC2_SEL_SHIFT = 14, 337 CLK_SARADC2_SEL_MASK = 0x1 << CLK_SARADC2_SEL_SHIFT, 338 CLK_SARADC1_SEL_SHIFT = 13, 339 CLK_SARADC1_SEL_MASK = 0x1 << CLK_SARADC1_SEL_SHIFT, 340 CLK_SARADC0_SEL_SHIFT = 12, 341 CLK_SARADC0_SEL_MASK = 0x1 << CLK_SARADC0_SEL_SHIFT, 342 CLK_SARADC_SEL_200M = 0, 343 CLK_SARADC_SEL_24M, 344 CLK_SARADC2_DIV_SHIFT = 8, 345 CLK_SARADC2_DIV_MASK = 0x7 << CLK_SARADC2_DIV_SHIFT, 346 CLK_SARADC1_DIV_SHIFT = 4, 347 CLK_SARADC1_DIV_MASK = 0x7 << CLK_SARADC1_DIV_SHIFT, 348 CLK_SARADC0_DIV_SHIFT = 0, 349 CLK_SARADC0_DIV_MASK = 0x7 << CLK_SARADC0_DIV_SHIFT, 350 351 /* PMUCRU_CLK_SEL2_CON */ 352 CLK_I2C2_SEL_SHIFT = 14, 353 CLK_I2C2_SEL_MASK = 0x3 << CLK_I2C2_SEL_SHIFT, 354 CLK_I2C2_SEL_24M = 0, 355 CLK_I2C2_SEL_RCOSC, 356 CLK_I2C2_SEL_100M, 357 CLK_PWM1_SEL_SHIFT = 8, 358 CLK_PWM1_SEL_MASK = 0x3 << CLK_PWM1_SEL_SHIFT, 359 CLK_PWM1_SEL_24M = 0, 360 CLK_PWM1_SEL_RCOSC, 361 CLK_PWM1_SEL_100M, 362 CLK_PWM1_DIV_SHIFT = 6, 363 CLK_PWM1_DIV_MASK = 0x3 << CLK_PWM1_DIV_SHIFT, 364 365 /* PMUCRU_CLK_SEL3_CON */ 366 TCLK_WDT_LPMCU_SEL_SHIFT = 6, 367 TCLK_WDT_LPMCU_SEL_MASK = 0x3 << TCLK_WDT_LPMCU_SEL_SHIFT, 368 TCLK_WDT_LPMCU_SEL_OSC = 0, 369 TCLK_WDT_LPMCU_SEL_RCOSC, 370 TCLK_WDT_LPMCU_SEL_100M, 371 TCLK_WDT_LPMCU_SEL_32K, 372 SCLK_UART0_SEL_SHIFT = 0, 373 SCLK_UART0_SEL_MASK = 0x3 << SCLK_UART0_SEL_SHIFT, 374 SCLK_UART0_SEL_UART0_SRC = 0, 375 SCLK_UART0_SEL_OSC, 376 SCLK_UART0_SEL_RCOSC, 377 378 /* PMU1CRU_CLK_SEL0_CON */ 379 SCLK_1X_FSPI1_DIV_SHIFT = 2, 380 SCLK_1X_FSPI1_DIV_MASK = 0x7 << SCLK_1X_FSPI1_DIV_SHIFT, 381 SCLK_1X_FSPI1_SEL_SHIFT = 0, 382 SCLK_1X_FSPI1_SEL_MASK = 0x3 << SCLK_1X_FSPI1_SEL_SHIFT, 383 SCLK_1X_FSPI1_SEL_24M = 0, 384 SCLK_1X_FSPI1_SEL_RCOSC, 385 SCLK_1X_FSPI1_SEL_100M, 386 }; 387 #endif 388