1*4882a593Smuzhiyun /* SPDX-License-Identifier: GPL-2.0 */ 2*4882a593Smuzhiyun /* 3*4882a593Smuzhiyun * Copyright (c) 2022 Rockchip Electronics Co. Ltd. 4*4882a593Smuzhiyun * Author: Elaine Zhang <zhangqing@rock-chips.com> 5*4882a593Smuzhiyun */ 6*4882a593Smuzhiyun 7*4882a593Smuzhiyun #ifndef _ASM_ARCH_CRU_RV1106_H 8*4882a593Smuzhiyun #define _ASM_ARCH_CRU_RV1106_H 9*4882a593Smuzhiyun 10*4882a593Smuzhiyun #include <common.h> 11*4882a593Smuzhiyun 12*4882a593Smuzhiyun #define MHz 1000000 13*4882a593Smuzhiyun #define KHz 1000 14*4882a593Smuzhiyun #define OSC_HZ (24 * MHz) 15*4882a593Smuzhiyun 16*4882a593Smuzhiyun #ifdef CONFIG_SPL_KERNEL_BOOT 17*4882a593Smuzhiyun #define APLL_HZ (1104 * MHz) 18*4882a593Smuzhiyun #else 19*4882a593Smuzhiyun #define APLL_HZ (816 * MHz) 20*4882a593Smuzhiyun #endif 21*4882a593Smuzhiyun #define GPLL_HZ (1188 * MHz) 22*4882a593Smuzhiyun #define CPLL_HZ (1000 * MHz) 23*4882a593Smuzhiyun 24*4882a593Smuzhiyun /* RV1106 pll id */ 25*4882a593Smuzhiyun enum rv1106_pll_id { 26*4882a593Smuzhiyun APLL, 27*4882a593Smuzhiyun DPLL, 28*4882a593Smuzhiyun CPLL, 29*4882a593Smuzhiyun GPLL, 30*4882a593Smuzhiyun PLL_COUNT, 31*4882a593Smuzhiyun }; 32*4882a593Smuzhiyun 33*4882a593Smuzhiyun struct rv1106_clk_info { 34*4882a593Smuzhiyun unsigned long id; 35*4882a593Smuzhiyun char *name; 36*4882a593Smuzhiyun bool is_cru; 37*4882a593Smuzhiyun }; 38*4882a593Smuzhiyun 39*4882a593Smuzhiyun struct rv1106_clk_priv { 40*4882a593Smuzhiyun struct rv1106_cru *cru; 41*4882a593Smuzhiyun struct rv1106_grf *grf; 42*4882a593Smuzhiyun ulong gpll_hz; 43*4882a593Smuzhiyun ulong cpll_hz; 44*4882a593Smuzhiyun ulong armclk_hz; 45*4882a593Smuzhiyun ulong armclk_enter_hz; 46*4882a593Smuzhiyun ulong armclk_init_hz; 47*4882a593Smuzhiyun bool sync_kernel; 48*4882a593Smuzhiyun bool set_armclk_rate; 49*4882a593Smuzhiyun }; 50*4882a593Smuzhiyun 51*4882a593Smuzhiyun struct rv1106_grf_clk_priv { 52*4882a593Smuzhiyun struct rv1106_grf *grf; 53*4882a593Smuzhiyun }; 54*4882a593Smuzhiyun 55*4882a593Smuzhiyun struct rv1106_pll { 56*4882a593Smuzhiyun unsigned int con0; 57*4882a593Smuzhiyun unsigned int con1; 58*4882a593Smuzhiyun unsigned int con2; 59*4882a593Smuzhiyun unsigned int con3; 60*4882a593Smuzhiyun unsigned int con4; 61*4882a593Smuzhiyun unsigned int reserved0[3]; 62*4882a593Smuzhiyun }; 63*4882a593Smuzhiyun 64*4882a593Smuzhiyun struct rv1106_cru { 65*4882a593Smuzhiyun unsigned int reserved0[192]; 66*4882a593Smuzhiyun unsigned int pmu_clksel_con[8]; 67*4882a593Smuzhiyun unsigned int reserved1[312]; 68*4882a593Smuzhiyun unsigned int pmu_clkgate_con[3]; 69*4882a593Smuzhiyun unsigned int reserved2[125]; 70*4882a593Smuzhiyun unsigned int pmu_softrst_con[3]; 71*4882a593Smuzhiyun unsigned int reserved3[15741]; 72*4882a593Smuzhiyun struct rv1106_pll pll[4]; 73*4882a593Smuzhiyun unsigned int reserved4[128]; 74*4882a593Smuzhiyun unsigned int mode; 75*4882a593Smuzhiyun unsigned int reserved5[31]; 76*4882a593Smuzhiyun unsigned int clksel_con[34]; 77*4882a593Smuzhiyun unsigned int reserved6[286]; 78*4882a593Smuzhiyun unsigned int clkgate_con[4]; 79*4882a593Smuzhiyun unsigned int reserved7[124]; 80*4882a593Smuzhiyun unsigned int softrst_con[3]; 81*4882a593Smuzhiyun unsigned int reserved8[125]; 82*4882a593Smuzhiyun unsigned int glb_cnt_th; 83*4882a593Smuzhiyun unsigned int glb_rst_st; 84*4882a593Smuzhiyun unsigned int glb_srst_fst; 85*4882a593Smuzhiyun unsigned int glb_srst_snd; 86*4882a593Smuzhiyun unsigned int glb_rst_con; 87*4882a593Smuzhiyun unsigned int con[2]; 88*4882a593Smuzhiyun unsigned int sdmmc_con[2]; 89*4882a593Smuzhiyun unsigned int emmc_con[2]; 90*4882a593Smuzhiyun unsigned int reserved9[1461]; 91*4882a593Smuzhiyun unsigned int peri_clksel_con[12]; 92*4882a593Smuzhiyun unsigned int reserved10[308]; 93*4882a593Smuzhiyun unsigned int peri_clkgate_con[8]; 94*4882a593Smuzhiyun unsigned int reserved11[120]; 95*4882a593Smuzhiyun unsigned int peri_softrst_con[8]; 96*4882a593Smuzhiyun unsigned int reserved12[1592]; 97*4882a593Smuzhiyun unsigned int vi_clksel_con[4]; 98*4882a593Smuzhiyun unsigned int reserved13[316]; 99*4882a593Smuzhiyun unsigned int vi_clkgate_con[3]; 100*4882a593Smuzhiyun unsigned int reserved14[125]; 101*4882a593Smuzhiyun unsigned int vi_softrst_con[3]; 102*4882a593Smuzhiyun unsigned int reserved15[3645]; 103*4882a593Smuzhiyun unsigned int core_clksel_con[5]; 104*4882a593Smuzhiyun unsigned int reserved16[2043]; 105*4882a593Smuzhiyun unsigned int vepu_clksel_con[2]; 106*4882a593Smuzhiyun unsigned int reserved17[318]; 107*4882a593Smuzhiyun unsigned int vepu_clkgate_con[3]; 108*4882a593Smuzhiyun unsigned int reserved18[125]; 109*4882a593Smuzhiyun unsigned int vepu_softrst_con[2]; 110*4882a593Smuzhiyun unsigned int reserved19[1598]; 111*4882a593Smuzhiyun unsigned int vo_clksel_con[4]; 112*4882a593Smuzhiyun unsigned int reserved20[316]; 113*4882a593Smuzhiyun unsigned int vo_clkgate_con[3]; 114*4882a593Smuzhiyun unsigned int reserved21[125]; 115*4882a593Smuzhiyun unsigned int vo_softrst_con[4]; 116*4882a593Smuzhiyun }; 117*4882a593Smuzhiyun check_member(rv1106_cru, vo_softrst_con[0], 0x1ca00); 118*4882a593Smuzhiyun 119*4882a593Smuzhiyun struct pll_rate_table { 120*4882a593Smuzhiyun unsigned long rate; 121*4882a593Smuzhiyun unsigned int fbdiv; 122*4882a593Smuzhiyun unsigned int postdiv1; 123*4882a593Smuzhiyun unsigned int refdiv; 124*4882a593Smuzhiyun unsigned int postdiv2; 125*4882a593Smuzhiyun unsigned int dsmpd; 126*4882a593Smuzhiyun unsigned int frac; 127*4882a593Smuzhiyun }; 128*4882a593Smuzhiyun 129*4882a593Smuzhiyun #define RV1106_TOPCRU_BASE 0x10000 130*4882a593Smuzhiyun #define RV1106_SUBDDRCRU_BASE 0x1F000 131*4882a593Smuzhiyun 132*4882a593Smuzhiyun #define RV1106_PLL_CON(x) ((x) * 0x4 + RV1106_TOPCRU_BASE) 133*4882a593Smuzhiyun #define RV1106_MODE_CON (0x280 + RV1106_TOPCRU_BASE) 134*4882a593Smuzhiyun #define RV1106_SUBDDRMODE_CON (0x280 + RV1106_SUBDDRCRU_BASE) 135*4882a593Smuzhiyun 136*4882a593Smuzhiyun enum { 137*4882a593Smuzhiyun /* CRU_PMU_CLK_SEL0_CON */ 138*4882a593Smuzhiyun CLK_I2C1_SEL_SHIFT = 6, 139*4882a593Smuzhiyun CLK_I2C1_SEL_MASK = 0x3 << CLK_I2C1_SEL_SHIFT, 140*4882a593Smuzhiyun CLK_I2C1_SEL_200M = 0, 141*4882a593Smuzhiyun CLK_I2C1_SEL_100M, 142*4882a593Smuzhiyun CLK_I2C1_SEL_24M, 143*4882a593Smuzhiyun CLK_I2C1_SEL_32K, 144*4882a593Smuzhiyun HCLK_PMU_SEL_SHIFT = 4, 145*4882a593Smuzhiyun HCLK_PMU_SEL_MASK = 0x3 << HCLK_PMU_SEL_SHIFT, 146*4882a593Smuzhiyun HCLK_PMU_SEL_200M = 0, 147*4882a593Smuzhiyun HCLK_PMU_SEL_100M, 148*4882a593Smuzhiyun HCLK_PMU_SEL_24M, 149*4882a593Smuzhiyun PCLK_PMU_SEL_SHIFT = 3, 150*4882a593Smuzhiyun PCLK_PMU_SEL_MASK = 0x1 << PCLK_PMU_SEL_SHIFT, 151*4882a593Smuzhiyun PCLK_PMU_SEL_100M = 0, 152*4882a593Smuzhiyun PCLK_PMU_SEL_24M, 153*4882a593Smuzhiyun 154*4882a593Smuzhiyun /* CRU_CLK_SEL5_CON */ 155*4882a593Smuzhiyun CLK_UART_SRC_SEL_SHIFT = 5, 156*4882a593Smuzhiyun CLK_UART_SRC_SEL_MASK = 0x1 << CLK_UART_SRC_SEL_SHIFT, 157*4882a593Smuzhiyun CLK_UART_SRC_SEL_GPLL = 0, 158*4882a593Smuzhiyun CLK_UART_SRC_SEL_CPLL, 159*4882a593Smuzhiyun CLK_UART_SRC_DIV_SHIFT = 0, 160*4882a593Smuzhiyun CLK_UART_SRC_DIV_MASK = 0x1f << CLK_UART_SRC_DIV_SHIFT, 161*4882a593Smuzhiyun 162*4882a593Smuzhiyun /* CRU_CLK_SEL6_CON */ 163*4882a593Smuzhiyun CLK_UART_FRAC_NUMERATOR_SHIFT = 16, 164*4882a593Smuzhiyun CLK_UART_FRAC_NUMERATOR_MASK = 0xffff << 16, 165*4882a593Smuzhiyun CLK_UART_FRAC_DENOMINATOR_SHIFT = 0, 166*4882a593Smuzhiyun CLK_UART_FRAC_DENOMINATOR_MASK = 0xffff, 167*4882a593Smuzhiyun 168*4882a593Smuzhiyun /* CRU_CLK_SEL7_CON */ 169*4882a593Smuzhiyun CLK_UART_SEL_SHIFT = 0, 170*4882a593Smuzhiyun CLK_UART_SEL_MASK = 0x3 << CLK_UART_SEL_SHIFT, 171*4882a593Smuzhiyun CLK_UART_SEL_SRC = 0, 172*4882a593Smuzhiyun CLK_UART_SEL_FRAC, 173*4882a593Smuzhiyun CLK_UART_SEL_XIN24M, 174*4882a593Smuzhiyun 175*4882a593Smuzhiyun /* CRU_CLK_SEL23_CON */ 176*4882a593Smuzhiyun DCLK_VOP_SEL_SHIFT = 8, 177*4882a593Smuzhiyun DCLK_VOP_SEL_MASK = 0x1 << DCLK_VOP_SEL_SHIFT, 178*4882a593Smuzhiyun DCLK_VOP_SEL_GPLL = 0, 179*4882a593Smuzhiyun DCLK_VOP_SEL_CPLL, 180*4882a593Smuzhiyun DCLK_VOP_DIV_SHIFT = 3, 181*4882a593Smuzhiyun DCLK_VOP_DIV_MASK = 0x1f << DCLK_VOP_DIV_SHIFT, 182*4882a593Smuzhiyun 183*4882a593Smuzhiyun /* CRU_CLK_SEL24_CON */ 184*4882a593Smuzhiyun PCLK_TOP_SEL_SHIFT = 5, 185*4882a593Smuzhiyun PCLK_TOP_SEL_MASK = 0x3 << PCLK_TOP_SEL_SHIFT, 186*4882a593Smuzhiyun PCLK_TOP_SEL_100M = 0, 187*4882a593Smuzhiyun PCLK_TOP_SEL_50M, 188*4882a593Smuzhiyun PCLK_TOP_SEL_24M, 189*4882a593Smuzhiyun 190*4882a593Smuzhiyun /* CRU_PERI_CLK_SEL1_CON */ 191*4882a593Smuzhiyun CLK_I2C3_SEL_SHIFT = 14, 192*4882a593Smuzhiyun CLK_I2C3_SEL_MASK = 0x3 << CLK_I2C3_SEL_SHIFT, 193*4882a593Smuzhiyun CLK_I2C2_SEL_SHIFT = 12, 194*4882a593Smuzhiyun CLK_I2C2_SEL_MASK = 0x3 << CLK_I2C2_SEL_SHIFT, 195*4882a593Smuzhiyun CLK_I2C0_SEL_SHIFT = 8, 196*4882a593Smuzhiyun CLK_I2C0_SEL_MASK = 0x3 << CLK_I2C0_SEL_SHIFT, 197*4882a593Smuzhiyun CLK_I2C0_SEL_200M = 0, 198*4882a593Smuzhiyun CLK_I2C0_SEL_100M, 199*4882a593Smuzhiyun CLK_I2C0_SEL_50M, 200*4882a593Smuzhiyun CLK_I2C0_SEL_24M, 201*4882a593Smuzhiyun HCLK_PERI_SEL_SHIFT = 4, 202*4882a593Smuzhiyun HCLK_PERI_SEL_MASK = 0x3 << HCLK_PERI_SEL_SHIFT, 203*4882a593Smuzhiyun HCLK_PERI_SEL_200M = 0, 204*4882a593Smuzhiyun HCLK_PERI_SEL_100M, 205*4882a593Smuzhiyun HCLK_PERI_SEL_50M, 206*4882a593Smuzhiyun HCLK_PERI_SEL_24M, 207*4882a593Smuzhiyun ACLK_PERI_SEL_SHIFT = 2, 208*4882a593Smuzhiyun ACLK_PERI_SEL_MASK = 0x3 << ACLK_PERI_SEL_SHIFT, 209*4882a593Smuzhiyun ACLK_PERI_SEL_400M = 0, 210*4882a593Smuzhiyun ACLK_PERI_SEL_200M, 211*4882a593Smuzhiyun ACLK_PERI_SEL_100M, 212*4882a593Smuzhiyun ACLK_PERI_SEL_24M, 213*4882a593Smuzhiyun PCLK_PERI_SEL_SHIFT = 0, 214*4882a593Smuzhiyun PCLK_PERI_SEL_MASK = 0x3 << PCLK_PERI_SEL_SHIFT, 215*4882a593Smuzhiyun PCLK_PERI_SEL_100M = 0, 216*4882a593Smuzhiyun PCLK_PERI_SEL_50M, 217*4882a593Smuzhiyun PCLK_PERI_SEL_24M, 218*4882a593Smuzhiyun 219*4882a593Smuzhiyun /* CRU_PERI_CLK_SEL2_CON */ 220*4882a593Smuzhiyun CLK_I2C4_SEL_SHIFT = 0, 221*4882a593Smuzhiyun CLK_I2C4_SEL_MASK = 0x3 << CLK_I2C4_SEL_SHIFT, 222*4882a593Smuzhiyun 223*4882a593Smuzhiyun /* CRU_PERI_CLK_SEL6_CON */ 224*4882a593Smuzhiyun CLK_PWM2_SEL_SHIFT = 11, 225*4882a593Smuzhiyun CLK_PWM2_SEL_MASK = 0x3 << CLK_PWM2_SEL_SHIFT, 226*4882a593Smuzhiyun CLK_PWM1_SEL_SHIFT = 9, 227*4882a593Smuzhiyun CLK_PWM1_SEL_MASK = 0x3 << CLK_PWM1_SEL_SHIFT, 228*4882a593Smuzhiyun CLK_PWM_SEL_100M = 0, 229*4882a593Smuzhiyun CLK_PWM_SEL_50M, 230*4882a593Smuzhiyun CLK_PWM_SEL_24M, 231*4882a593Smuzhiyun CLK_PKA_CRYPTO_SEL_SHIFT = 7, 232*4882a593Smuzhiyun CLK_PKA_CRYPTO_SEL_MASK = 0x3 << CLK_PKA_CRYPTO_SEL_SHIFT, 233*4882a593Smuzhiyun CLK_CORE_CRYPTO_SEL_SHIFT = 5, 234*4882a593Smuzhiyun CLK_CORE_CRYPTO_SEL_MASK = 0x3 << CLK_CORE_CRYPTO_SEL_SHIFT, 235*4882a593Smuzhiyun CLK_CRYPTO_SEL_300M = 0, 236*4882a593Smuzhiyun CLK_CRYPTO_SEL_200M, 237*4882a593Smuzhiyun CLK_CRYPTO_SEL_100M, 238*4882a593Smuzhiyun CLK_CRYPTO_SEL_24M, 239*4882a593Smuzhiyun CLK_SARADC_DIV_SHIFT = 0, 240*4882a593Smuzhiyun CLK_SARADC_DIV_MASK = 0x7 << CLK_SARADC_DIV_SHIFT, 241*4882a593Smuzhiyun CLK_SPI1_SEL_SHIFT = 3, 242*4882a593Smuzhiyun CLK_SPI1_SEL_MASK = 0x3 << CLK_SPI1_SEL_SHIFT, 243*4882a593Smuzhiyun 244*4882a593Smuzhiyun /* CRU_PERI_CLK_SEL7_CON */ 245*4882a593Smuzhiyun DCLK_DECOM_SEL_SHIFT = 14, 246*4882a593Smuzhiyun DCLK_DECOM_SEL_MASK = 0x3 << DCLK_DECOM_SEL_SHIFT, 247*4882a593Smuzhiyun DCLK_DECOM_SEL_400M = 0, 248*4882a593Smuzhiyun DCLK_DECOM_SEL_200M, 249*4882a593Smuzhiyun DCLK_DECOM_SEL_100M, 250*4882a593Smuzhiyun DCLK_DECOM_SEL_24M, 251*4882a593Smuzhiyun CLK_SFC_SEL_SHIFT = 12, 252*4882a593Smuzhiyun CLK_SFC_SEL_MASK = 0x3 << CLK_SFC_SEL_SHIFT, 253*4882a593Smuzhiyun CLK_SFC_SEL_500M = 0, 254*4882a593Smuzhiyun CLK_SFC_SEL_300M, 255*4882a593Smuzhiyun CLK_SFC_SEL_200M, 256*4882a593Smuzhiyun CLK_SFC_SEL_24M, 257*4882a593Smuzhiyun CLK_SFC_DIV_SHIFT = 7, 258*4882a593Smuzhiyun CLK_SFC_DIV_MASK = 0x1f << CLK_SFC_DIV_SHIFT, 259*4882a593Smuzhiyun CLK_EMMC_SEL_SHIFT = 6, 260*4882a593Smuzhiyun CLK_EMMC_SEL_MASK = 0x1 << CLK_EMMC_SEL_SHIFT, 261*4882a593Smuzhiyun CLK_MMC_SEL_400M = 0, 262*4882a593Smuzhiyun CLK_MMC_SEL_24M, 263*4882a593Smuzhiyun CLK_EMMC_DIV_SHIFT = 0, 264*4882a593Smuzhiyun CLK_EMMC_DIV_MASK = 0x3f << CLK_EMMC_DIV_SHIFT, 265*4882a593Smuzhiyun 266*4882a593Smuzhiyun /* CRU_PERI_CLK_SEL9_CON */ 267*4882a593Smuzhiyun ACLK_BUS_SEL_SHIFT = 0, 268*4882a593Smuzhiyun ACLK_BUS_SEL_MASK = 0x3 << ACLK_BUS_SEL_SHIFT, 269*4882a593Smuzhiyun ACLK_BUS_SEL_300M = 0, 270*4882a593Smuzhiyun ACLK_BUS_SEL_200M, 271*4882a593Smuzhiyun ACLK_BUS_SEL_100M, 272*4882a593Smuzhiyun ACLK_BUS_SEL_24M, 273*4882a593Smuzhiyun 274*4882a593Smuzhiyun /* CRU_PERI_CLK_SEL11_CON */ 275*4882a593Smuzhiyun CLK_PWM0_SEL_SHIFT = 0, 276*4882a593Smuzhiyun CLK_PWM0_SEL_MASK = 0x3 << CLK_PWM0_SEL_SHIFT, 277*4882a593Smuzhiyun 278*4882a593Smuzhiyun /* CRU_VEPU_CLK_SEL0_CON */ 279*4882a593Smuzhiyun CLK_SPI0_SEL_SHIFT = 12, 280*4882a593Smuzhiyun CLK_SPI0_SEL_MASK = 0x3 << CLK_SPI0_SEL_SHIFT, 281*4882a593Smuzhiyun CLK_SPI0_SEL_200M = 0, 282*4882a593Smuzhiyun CLK_SPI0_SEL_100M, 283*4882a593Smuzhiyun CLK_SPI0_SEL_50M, 284*4882a593Smuzhiyun CLK_SPI0_SEL_24M, 285*4882a593Smuzhiyun 286*4882a593Smuzhiyun /* CRU_CORE_CLK_SEL0_CON */ 287*4882a593Smuzhiyun CLK_CORE_DIV_SHIFT = 0, 288*4882a593Smuzhiyun CLK_CORE_DIV_MASK = 0x1f << CLK_CORE_DIV_SHIFT, 289*4882a593Smuzhiyun 290*4882a593Smuzhiyun /* CRU_VI_CLK_SEL1_CON */ 291*4882a593Smuzhiyun CLK_SDMMC_SEL_SHIFT = 14, 292*4882a593Smuzhiyun CLK_SDMMC_SEL_MASK = 0x1 << CLK_SDMMC_SEL_SHIFT, 293*4882a593Smuzhiyun CLK_SDMMC_DIV_SHIFT = 8, 294*4882a593Smuzhiyun CLK_SDMMC_DIV_MASK = 0x3f << CLK_SDMMC_DIV_SHIFT, 295*4882a593Smuzhiyun 296*4882a593Smuzhiyun /* CRU_VO_CLK_SEL1_CON */ 297*4882a593Smuzhiyun ACLK_VOP_SEL_SHIFT = 10, 298*4882a593Smuzhiyun ACLK_VOP_SEL_MASK = 0x3 << ACLK_VOP_SEL_SHIFT, 299*4882a593Smuzhiyun ACLK_VOP_SEL_300M = 0, 300*4882a593Smuzhiyun ACLK_VOP_SEL_200M, 301*4882a593Smuzhiyun ACLK_VOP_SEL_100M, 302*4882a593Smuzhiyun ACLK_VOP_SEL_24M, 303*4882a593Smuzhiyun 304*4882a593Smuzhiyun /* CRU_VO_CLK_SEL3_CON */ 305*4882a593Smuzhiyun CLK_TSADC_TSEN_DIV_SHIFT = 5, 306*4882a593Smuzhiyun CLK_TSADC_TSEN_DIV_MASK = 0x1F << CLK_TSADC_TSEN_DIV_SHIFT, 307*4882a593Smuzhiyun CLK_TSADC_DIV_SHIFT = 0, 308*4882a593Smuzhiyun CLK_TSADC_DIV_MASK = 0x1F << CLK_TSADC_DIV_SHIFT, 309*4882a593Smuzhiyun }; 310*4882a593Smuzhiyun #endif 311