1*4882a593Smuzhiyun /* 2*4882a593Smuzhiyun * (C) Copyright 2016 Heiko Stuebner <heiko@sntech.de> 3*4882a593Smuzhiyun * 4*4882a593Smuzhiyun * SPDX-License-Identifier: GPL-2.0+ 5*4882a593Smuzhiyun */ 6*4882a593Smuzhiyun #ifndef _ASM_ARCH_CRU_RK3066_H 7*4882a593Smuzhiyun #define _ASM_ARCH_CRU_RK3066_H 8*4882a593Smuzhiyun 9*4882a593Smuzhiyun #define OSC_HZ (24 * 1000 * 1000) 10*4882a593Smuzhiyun 11*4882a593Smuzhiyun #define APLL_HZ (1416 * 1000000) 12*4882a593Smuzhiyun #define APLL_SAFE_HZ (600 * 1000000) 13*4882a593Smuzhiyun #define GPLL_HZ (594 * 1000000) 14*4882a593Smuzhiyun #define CPLL_HZ (384 * 1000000) 15*4882a593Smuzhiyun 16*4882a593Smuzhiyun /* The SRAM is clocked off aclk_cpu, so we want to max it out for boot speed */ 17*4882a593Smuzhiyun #define CPU_ACLK_HZ 297000000 18*4882a593Smuzhiyun #define CPU_HCLK_HZ 148500000 19*4882a593Smuzhiyun #define CPU_PCLK_HZ 74250000 20*4882a593Smuzhiyun #define CPU_H2P_HZ 74250000 21*4882a593Smuzhiyun 22*4882a593Smuzhiyun #define PERI_ACLK_HZ 148500000 23*4882a593Smuzhiyun #define PERI_HCLK_HZ 148500000 24*4882a593Smuzhiyun #define PERI_PCLK_HZ 74250000 25*4882a593Smuzhiyun 26*4882a593Smuzhiyun /* Private data for the clock driver - used by rockchip_get_cru() */ 27*4882a593Smuzhiyun struct rk3066_clk_priv { 28*4882a593Smuzhiyun struct rk3066_grf *grf; 29*4882a593Smuzhiyun struct rk3066_cru *cru; 30*4882a593Smuzhiyun ulong rate; 31*4882a593Smuzhiyun bool has_bwadj; 32*4882a593Smuzhiyun ulong armclk_hz; 33*4882a593Smuzhiyun ulong armclk_enter_hz; 34*4882a593Smuzhiyun ulong armclk_init_hz; 35*4882a593Smuzhiyun bool sync_kernel; 36*4882a593Smuzhiyun bool set_armclk_rate; 37*4882a593Smuzhiyun }; 38*4882a593Smuzhiyun 39*4882a593Smuzhiyun struct rk3066_cru { 40*4882a593Smuzhiyun struct rk3066_pll { 41*4882a593Smuzhiyun u32 con0; 42*4882a593Smuzhiyun u32 con1; 43*4882a593Smuzhiyun u32 con2; 44*4882a593Smuzhiyun u32 con3; 45*4882a593Smuzhiyun } pll[4]; 46*4882a593Smuzhiyun u32 cru_mode_con; 47*4882a593Smuzhiyun u32 cru_clksel_con[35]; 48*4882a593Smuzhiyun u32 cru_clkgate_con[10]; 49*4882a593Smuzhiyun u32 reserved1[2]; 50*4882a593Smuzhiyun u32 cru_glb_srst_fst_value; 51*4882a593Smuzhiyun u32 cru_glb_srst_snd_value; 52*4882a593Smuzhiyun u32 reserved2[2]; 53*4882a593Smuzhiyun u32 cru_softrst_con[9]; 54*4882a593Smuzhiyun u32 cru_misc_con; 55*4882a593Smuzhiyun u32 reserved3[2]; 56*4882a593Smuzhiyun u32 cru_glb_cnt_th; 57*4882a593Smuzhiyun }; 58*4882a593Smuzhiyun check_member(rk3066_cru, cru_glb_cnt_th, 0x0140); 59*4882a593Smuzhiyun 60*4882a593Smuzhiyun struct rk3066_clk_info { 61*4882a593Smuzhiyun unsigned long id; 62*4882a593Smuzhiyun char *name; 63*4882a593Smuzhiyun bool is_cru; 64*4882a593Smuzhiyun }; 65*4882a593Smuzhiyun 66*4882a593Smuzhiyun /* CRU_CLKSEL0_CON */ 67*4882a593Smuzhiyun enum { 68*4882a593Smuzhiyun /* a9_core_div: core = core_src / (a9_core_div + 1) */ 69*4882a593Smuzhiyun A9_CORE_DIV_SHIFT = 9, 70*4882a593Smuzhiyun A9_CORE_DIV_MASK = 0x1f << A9_CORE_DIV_SHIFT, 71*4882a593Smuzhiyun CORE_PLL_SHIFT = 8, 72*4882a593Smuzhiyun CORE_PLL_MASK = 1 << CORE_PLL_SHIFT, 73*4882a593Smuzhiyun CORE_PLL_SELECT_APLL = 0, 74*4882a593Smuzhiyun CORE_PLL_SELECT_GPLL, 75*4882a593Smuzhiyun 76*4882a593Smuzhiyun /* core peri div: core:core_peri = 2:1, 4:1, 8:1 or 16:1 */ 77*4882a593Smuzhiyun CORE_PERI_DIV_SHIFT = 6, 78*4882a593Smuzhiyun CORE_PERI_DIV_MASK = 3 << CORE_PERI_DIV_SHIFT, 79*4882a593Smuzhiyun 80*4882a593Smuzhiyun /* aclk_cpu pll selection */ 81*4882a593Smuzhiyun CPU_ACLK_PLL_SHIFT = 5, 82*4882a593Smuzhiyun CPU_ACLK_PLL_MASK = 1 << CPU_ACLK_PLL_SHIFT, 83*4882a593Smuzhiyun CPU_ACLK_PLL_SELECT_APLL = 0, 84*4882a593Smuzhiyun CPU_ACLK_PLL_SELECT_GPLL, 85*4882a593Smuzhiyun 86*4882a593Smuzhiyun /* a9_cpu_div: aclk_cpu = cpu_src / (a9_cpu_div + 1) */ 87*4882a593Smuzhiyun A9_CPU_DIV_SHIFT = 0, 88*4882a593Smuzhiyun A9_CPU_DIV_MASK = 0x1f << A9_CPU_DIV_SHIFT, 89*4882a593Smuzhiyun }; 90*4882a593Smuzhiyun 91*4882a593Smuzhiyun /* CRU_CLKSEL1_CON */ 92*4882a593Smuzhiyun enum { 93*4882a593Smuzhiyun /* ahb2apb_pclk_div: hclk_cpu:pclk_cpu = 1:1, 2:1 or 4:1 */ 94*4882a593Smuzhiyun AHB2APB_DIV_SHIFT = 14, 95*4882a593Smuzhiyun AHB2APB_DIV_MASK = 3 << AHB2APB_DIV_SHIFT, 96*4882a593Smuzhiyun 97*4882a593Smuzhiyun /* cpu_pclk_div: aclk_cpu:pclk_cpu = 1:1, 2:1, 4:1 or 8:1 */ 98*4882a593Smuzhiyun CPU_PCLK_DIV_SHIFT = 12, 99*4882a593Smuzhiyun CPU_PCLK_DIV_MASK = 3 << CPU_PCLK_DIV_SHIFT, 100*4882a593Smuzhiyun 101*4882a593Smuzhiyun /* cpu_hclk_div: aclk_cpu:hclk_cpu = 1:1, 2:1 or 4:1 */ 102*4882a593Smuzhiyun CPU_HCLK_DIV_SHIFT = 8, 103*4882a593Smuzhiyun CPU_HCLK_DIV_MASK = 3 << CPU_HCLK_DIV_SHIFT, 104*4882a593Smuzhiyun 105*4882a593Smuzhiyun /* core_aclk_div: cire:aclk_core = 1:1, 2:1, 3:1, 4:1 or 8:1 */ 106*4882a593Smuzhiyun CORE_ACLK_DIV_SHIFT = 3, 107*4882a593Smuzhiyun CORE_ACLK_DIV_MASK = 7 << CORE_ACLK_DIV_SHIFT, 108*4882a593Smuzhiyun }; 109*4882a593Smuzhiyun 110*4882a593Smuzhiyun /* CRU_CLKSEL10_CON */ 111*4882a593Smuzhiyun enum { 112*4882a593Smuzhiyun PERI_SEL_PLL_SHIFT = 15, 113*4882a593Smuzhiyun PERI_SEL_PLL_MASK = 1 << PERI_SEL_PLL_SHIFT, 114*4882a593Smuzhiyun PERI_SEL_CPLL = 0, 115*4882a593Smuzhiyun PERI_SEL_GPLL, 116*4882a593Smuzhiyun 117*4882a593Smuzhiyun /* peri pclk div: aclk_bus:pclk_bus = 1:1, 2:1, 4:1 or 8:1 */ 118*4882a593Smuzhiyun PERI_PCLK_DIV_SHIFT = 12, 119*4882a593Smuzhiyun PERI_PCLK_DIV_MASK = 3 << PERI_PCLK_DIV_SHIFT, 120*4882a593Smuzhiyun 121*4882a593Smuzhiyun /* peripheral bus hclk div:aclk_bus: hclk_bus = 1:1, 2:1 or 4:1 */ 122*4882a593Smuzhiyun PERI_HCLK_DIV_SHIFT = 8, 123*4882a593Smuzhiyun PERI_HCLK_DIV_MASK = 3 << PERI_HCLK_DIV_SHIFT, 124*4882a593Smuzhiyun 125*4882a593Smuzhiyun /* peri aclk div: aclk_peri = periph_src / (peri_aclk_div + 1) */ 126*4882a593Smuzhiyun PERI_ACLK_DIV_SHIFT = 0, 127*4882a593Smuzhiyun PERI_ACLK_DIV_MASK = 0x1f << PERI_ACLK_DIV_SHIFT, 128*4882a593Smuzhiyun }; 129*4882a593Smuzhiyun /* CRU_CLKSEL11_CON */ 130*4882a593Smuzhiyun enum { 131*4882a593Smuzhiyun MMC0_DIV_SHIFT = 0, 132*4882a593Smuzhiyun MMC0_DIV_MASK = 0x3f << MMC0_DIV_SHIFT, 133*4882a593Smuzhiyun }; 134*4882a593Smuzhiyun 135*4882a593Smuzhiyun /* CRU_CLKSEL12_CON */ 136*4882a593Smuzhiyun enum { 137*4882a593Smuzhiyun UART_PLL_SHIFT = 15, 138*4882a593Smuzhiyun UART_PLL_MASK = 1 << UART_PLL_SHIFT, 139*4882a593Smuzhiyun UART_PLL_SELECT_GENERAL = 0, 140*4882a593Smuzhiyun UART_PLL_SELECT_CODEC, 141*4882a593Smuzhiyun 142*4882a593Smuzhiyun EMMC_DIV_SHIFT = 8, 143*4882a593Smuzhiyun EMMC_DIV_MASK = 0x3f << EMMC_DIV_SHIFT, 144*4882a593Smuzhiyun 145*4882a593Smuzhiyun SDIO_DIV_SHIFT = 0, 146*4882a593Smuzhiyun SDIO_DIV_MASK = 0x3f << SDIO_DIV_SHIFT, 147*4882a593Smuzhiyun }; 148*4882a593Smuzhiyun 149*4882a593Smuzhiyun /* CRU_CLKSEL25_CON */ 150*4882a593Smuzhiyun enum { 151*4882a593Smuzhiyun SPI1_DIV_SHIFT = 8, 152*4882a593Smuzhiyun SPI1_DIV_MASK = 0x7f << SPI1_DIV_SHIFT, 153*4882a593Smuzhiyun 154*4882a593Smuzhiyun SPI0_DIV_SHIFT = 0, 155*4882a593Smuzhiyun SPI0_DIV_MASK = 0x7f << SPI0_DIV_SHIFT, 156*4882a593Smuzhiyun }; 157*4882a593Smuzhiyun 158*4882a593Smuzhiyun /* CRU_MODE_CON */ 159*4882a593Smuzhiyun enum { 160*4882a593Smuzhiyun GPLL_MODE_SHIFT = 12, 161*4882a593Smuzhiyun GPLL_MODE_MASK = 3 << GPLL_MODE_SHIFT, 162*4882a593Smuzhiyun GPLL_MODE_SLOW = 0, 163*4882a593Smuzhiyun GPLL_MODE_NORMAL, 164*4882a593Smuzhiyun GPLL_MODE_DEEP, 165*4882a593Smuzhiyun 166*4882a593Smuzhiyun CPLL_MODE_SHIFT = 8, 167*4882a593Smuzhiyun CPLL_MODE_MASK = 3 << CPLL_MODE_SHIFT, 168*4882a593Smuzhiyun CPLL_MODE_SLOW = 0, 169*4882a593Smuzhiyun CPLL_MODE_NORMAL, 170*4882a593Smuzhiyun CPLL_MODE_DEEP, 171*4882a593Smuzhiyun 172*4882a593Smuzhiyun DPLL_MODE_SHIFT = 4, 173*4882a593Smuzhiyun DPLL_MODE_MASK = 3 << DPLL_MODE_SHIFT, 174*4882a593Smuzhiyun DPLL_MODE_SLOW = 0, 175*4882a593Smuzhiyun DPLL_MODE_NORMAL, 176*4882a593Smuzhiyun DPLL_MODE_DEEP, 177*4882a593Smuzhiyun 178*4882a593Smuzhiyun APLL_MODE_SHIFT = 0, 179*4882a593Smuzhiyun APLL_MODE_MASK = 3 << APLL_MODE_SHIFT, 180*4882a593Smuzhiyun APLL_MODE_SLOW = 0, 181*4882a593Smuzhiyun APLL_MODE_NORMAL, 182*4882a593Smuzhiyun APLL_MODE_DEEP, 183*4882a593Smuzhiyun }; 184*4882a593Smuzhiyun 185*4882a593Smuzhiyun /* CRU_APLL_CON0 */ 186*4882a593Smuzhiyun enum { 187*4882a593Smuzhiyun CLKR_SHIFT = 8, 188*4882a593Smuzhiyun CLKR_MASK = 0x3f << CLKR_SHIFT, 189*4882a593Smuzhiyun 190*4882a593Smuzhiyun CLKOD_SHIFT = 0, 191*4882a593Smuzhiyun CLKOD_MASK = 0x3f << CLKOD_SHIFT, 192*4882a593Smuzhiyun }; 193*4882a593Smuzhiyun 194*4882a593Smuzhiyun /* CRU_APLL_CON1 */ 195*4882a593Smuzhiyun enum { 196*4882a593Smuzhiyun CLKF_SHIFT = 0, 197*4882a593Smuzhiyun CLKF_MASK = 0x1fff << CLKF_SHIFT, 198*4882a593Smuzhiyun }; 199*4882a593Smuzhiyun 200*4882a593Smuzhiyun #endif 201