1*4882a593Smuzhiyun /* 2*4882a593Smuzhiyun * (C) Copyright 2017 Rockchip Electronics Co., Ltd 3*4882a593Smuzhiyun * Author: Andy Yan <andy.yan@rock-chips.com> 4*4882a593Smuzhiyun * SPDX-License-Identifier: GPL-2.0+ 5*4882a593Smuzhiyun */ 6*4882a593Smuzhiyun #ifndef _ASM_ARCH_CRU_RK3368_H 7*4882a593Smuzhiyun #define _ASM_ARCH_CRU_RK3368_H 8*4882a593Smuzhiyun 9*4882a593Smuzhiyun #include <common.h> 10*4882a593Smuzhiyun 11*4882a593Smuzhiyun 12*4882a593Smuzhiyun /* RK3368 clock numbers */ 13*4882a593Smuzhiyun enum rk3368_pll_id { 14*4882a593Smuzhiyun APLLB, 15*4882a593Smuzhiyun APLLL, 16*4882a593Smuzhiyun DPLL, 17*4882a593Smuzhiyun CPLL, 18*4882a593Smuzhiyun GPLL, 19*4882a593Smuzhiyun NPLL, 20*4882a593Smuzhiyun PLL_COUNT, 21*4882a593Smuzhiyun }; 22*4882a593Smuzhiyun 23*4882a593Smuzhiyun struct rk3368_clk_info { 24*4882a593Smuzhiyun unsigned long id; 25*4882a593Smuzhiyun char *name; 26*4882a593Smuzhiyun bool is_cru; 27*4882a593Smuzhiyun }; 28*4882a593Smuzhiyun 29*4882a593Smuzhiyun struct rk3368_cru { 30*4882a593Smuzhiyun struct rk3368_pll { 31*4882a593Smuzhiyun unsigned int con0; 32*4882a593Smuzhiyun unsigned int con1; 33*4882a593Smuzhiyun unsigned int con2; 34*4882a593Smuzhiyun unsigned int con3; 35*4882a593Smuzhiyun } pll[6]; 36*4882a593Smuzhiyun unsigned int reserved[0x28]; 37*4882a593Smuzhiyun unsigned int clksel_con[56]; 38*4882a593Smuzhiyun unsigned int reserved1[8]; 39*4882a593Smuzhiyun unsigned int clkgate_con[25]; 40*4882a593Smuzhiyun unsigned int reserved2[7]; 41*4882a593Smuzhiyun unsigned int glb_srst_fst_val; 42*4882a593Smuzhiyun unsigned int glb_srst_snd_val; 43*4882a593Smuzhiyun unsigned int reserved3[0x1e]; 44*4882a593Smuzhiyun unsigned int softrst_con[15]; 45*4882a593Smuzhiyun unsigned int reserved4[0x11]; 46*4882a593Smuzhiyun unsigned int misc_con; 47*4882a593Smuzhiyun unsigned int glb_cnt_th; 48*4882a593Smuzhiyun unsigned int glb_rst_con; 49*4882a593Smuzhiyun unsigned int glb_rst_st; 50*4882a593Smuzhiyun unsigned int reserved5[0x1c]; 51*4882a593Smuzhiyun unsigned int sdmmc_con[2]; 52*4882a593Smuzhiyun unsigned int sdio0_con[2]; 53*4882a593Smuzhiyun unsigned int sdio1_con[2]; 54*4882a593Smuzhiyun unsigned int emmc_con[2]; 55*4882a593Smuzhiyun }; 56*4882a593Smuzhiyun check_member(rk3368_cru, emmc_con[1], 0x41c); 57*4882a593Smuzhiyun 58*4882a593Smuzhiyun struct rk3368_clk_priv { 59*4882a593Smuzhiyun struct rk3368_cru *cru; 60*4882a593Smuzhiyun ulong armlclk_hz; 61*4882a593Smuzhiyun ulong armlclk_enter_hz; 62*4882a593Smuzhiyun ulong armlclk_init_hz; 63*4882a593Smuzhiyun ulong armbclk_hz; 64*4882a593Smuzhiyun ulong armbclk_enter_hz; 65*4882a593Smuzhiyun ulong armbclk_init_hz; 66*4882a593Smuzhiyun bool sync_kernel; 67*4882a593Smuzhiyun bool set_armclk_rate; 68*4882a593Smuzhiyun }; 69*4882a593Smuzhiyun 70*4882a593Smuzhiyun enum { 71*4882a593Smuzhiyun /* PLL CON0 */ 72*4882a593Smuzhiyun PLL_NR_SHIFT = 8, 73*4882a593Smuzhiyun PLL_NR_MASK = GENMASK(13, 8), 74*4882a593Smuzhiyun PLL_OD_SHIFT = 0, 75*4882a593Smuzhiyun PLL_OD_MASK = GENMASK(3, 0), 76*4882a593Smuzhiyun 77*4882a593Smuzhiyun /* PLL CON1 */ 78*4882a593Smuzhiyun PLL_LOCK_STA = BIT(31), 79*4882a593Smuzhiyun PLL_NF_SHIFT = 0, 80*4882a593Smuzhiyun PLL_NF_MASK = GENMASK(12, 0), 81*4882a593Smuzhiyun 82*4882a593Smuzhiyun /* PLL CON2 */ 83*4882a593Smuzhiyun PLL_BWADJ_SHIFT = 0, 84*4882a593Smuzhiyun PLL_BWADJ_MASK = GENMASK(11, 0), 85*4882a593Smuzhiyun 86*4882a593Smuzhiyun /* PLL CON3 */ 87*4882a593Smuzhiyun PLL_MODE_SHIFT = 8, 88*4882a593Smuzhiyun PLL_MODE_MASK = GENMASK(9, 8), 89*4882a593Smuzhiyun PLL_MODE_SLOW = 0, 90*4882a593Smuzhiyun PLL_MODE_NORMAL = 1, 91*4882a593Smuzhiyun PLL_MODE_DEEP_SLOW = 3, 92*4882a593Smuzhiyun PLL_RESET_SHIFT = 5, 93*4882a593Smuzhiyun PLL_RESET = 1, 94*4882a593Smuzhiyun PLL_RESET_MASK = GENMASK(5, 5), 95*4882a593Smuzhiyun 96*4882a593Smuzhiyun /* CLKSEL1CON */ 97*4882a593Smuzhiyun CORE_ACLK_DIV_SHIFT = 0, 98*4882a593Smuzhiyun CORE_ACLK_DIV_MASK = 0x1f << CORE_ACLK_DIV_SHIFT, 99*4882a593Smuzhiyun CORE_DBG_DIV_SHIFT = 8, 100*4882a593Smuzhiyun CORE_DBG_DIV_MASK = 0x1f << CORE_DBG_DIV_SHIFT, 101*4882a593Smuzhiyun 102*4882a593Smuzhiyun CORE_CLK_PLL_SEL_SHIFT = 7, 103*4882a593Smuzhiyun CORE_CLK_PLL_SEL_MASK = 1 << CORE_CLK_PLL_SEL_SHIFT, 104*4882a593Smuzhiyun CORE_CLK_PLL_SEL_APLL = 0, 105*4882a593Smuzhiyun CORE_CLK_PLL_SEL_GPLL, 106*4882a593Smuzhiyun CORE_DIV_CON_SHIFT = 0, 107*4882a593Smuzhiyun CORE_DIV_CON_MASK = 0x1f << CORE_DIV_CON_SHIFT, 108*4882a593Smuzhiyun 109*4882a593Smuzhiyun /* CLKSEL8CON */ 110*4882a593Smuzhiyun PCLK_BUS_DIV_CON_SHIFT = 12, 111*4882a593Smuzhiyun PCLK_BUS_DIV_CON_MASK = 0x7 << PCLK_BUS_DIV_CON_SHIFT, 112*4882a593Smuzhiyun HCLK_BUS_DIV_CON_SHIFT = 8, 113*4882a593Smuzhiyun HCLK_BUS_DIV_CON_MASK = 0x3 << HCLK_BUS_DIV_CON_SHIFT, 114*4882a593Smuzhiyun CLK_BUS_PLL_SEL_CPLL = 0, 115*4882a593Smuzhiyun CLK_BUS_PLL_SEL_GPLL = 1, 116*4882a593Smuzhiyun CLK_BUS_PLL_SEL_SHIFT = 7, 117*4882a593Smuzhiyun CLK_BUS_PLL_SEL_MASK = 1 << CLK_BUS_PLL_SEL_SHIFT, 118*4882a593Smuzhiyun ACLK_BUS_DIV_CON_SHIFT = 0, 119*4882a593Smuzhiyun ACLK_BUS_DIV_CON_MASK = 0x1f << ACLK_BUS_DIV_CON_SHIFT, 120*4882a593Smuzhiyun 121*4882a593Smuzhiyun /* CLKSEL9CON */ 122*4882a593Smuzhiyun PCLK_PERI_DIV_CON_SHIFT = 12, 123*4882a593Smuzhiyun PCLK_PERI_DIV_CON_MASK = 0x3 << PCLK_PERI_DIV_CON_SHIFT, 124*4882a593Smuzhiyun HCLK_PERI_DIV_CON_SHIFT = 8, 125*4882a593Smuzhiyun HCLK_PERI_DIV_CON_MASK = 3 << HCLK_PERI_DIV_CON_SHIFT, 126*4882a593Smuzhiyun CLK_PERI_PLL_SEL_CPLL = 0, 127*4882a593Smuzhiyun CLK_PERI_PLL_SEL_GPLL, 128*4882a593Smuzhiyun CLK_PERI_PLL_SEL_SHIFT = 7, 129*4882a593Smuzhiyun CLK_PERI_PLL_SEL_MASK = 1 << CLK_PERI_PLL_SEL_SHIFT, 130*4882a593Smuzhiyun ACLK_PERI_DIV_CON_SHIFT = 0, 131*4882a593Smuzhiyun ACLK_PERI_DIV_CON_MASK = 0x1f, 132*4882a593Smuzhiyun 133*4882a593Smuzhiyun /* CLKSEL10CON */ 134*4882a593Smuzhiyun CLK_CRYPTO_DIV_CON_SHIFT = 14, 135*4882a593Smuzhiyun CLK_CRYPTO_DIV_CON_MASK = 0x3 << CLK_CRYPTO_DIV_CON_SHIFT, 136*4882a593Smuzhiyun PCLK_ALIVE_DIV_CON_SHIFT = 8, 137*4882a593Smuzhiyun PCLK_ALIVE_DIV_CON_MASK = 0x1f << PCLK_ALIVE_DIV_CON_SHIFT, 138*4882a593Smuzhiyun 139*4882a593Smuzhiyun /* CLKSEL12_CON */ 140*4882a593Smuzhiyun MCU_STCLK_DIV_SHIFT = 8, 141*4882a593Smuzhiyun MCU_STCLK_DIV_MASK = GENMASK(10, 8), 142*4882a593Smuzhiyun MCU_PLL_SEL_SHIFT = 7, 143*4882a593Smuzhiyun MCU_PLL_SEL_MASK = BIT(7), 144*4882a593Smuzhiyun MCU_PLL_SEL_CPLL = 0, 145*4882a593Smuzhiyun MCU_PLL_SEL_GPLL = 1, 146*4882a593Smuzhiyun MCU_CLK_DIV_SHIFT = 0, 147*4882a593Smuzhiyun MCU_CLK_DIV_MASK = GENMASK(4, 0), 148*4882a593Smuzhiyun 149*4882a593Smuzhiyun /* CLKSEL19_CON */ 150*4882a593Smuzhiyun ACLK_VOP_PLL_SEL_SHIFT = 6, 151*4882a593Smuzhiyun ACLK_VOP_PLL_SEL_MASK = GENMASK(7, 6), 152*4882a593Smuzhiyun ACLK_VOP_PLL_SEL_CPLL = 0, 153*4882a593Smuzhiyun ACLK_VOP_PLL_SEL_GPLL = 1, 154*4882a593Smuzhiyun ACLK_VOP_DIV_SHIFT = 0, 155*4882a593Smuzhiyun ACLK_VOP_DIV_MASK = GENMASK(4, 0), 156*4882a593Smuzhiyun 157*4882a593Smuzhiyun /* CLKSEL20_CON */ 158*4882a593Smuzhiyun DCLK_VOP_PLL_SEL_SHIFT = 8, 159*4882a593Smuzhiyun DCLK_VOP_PLL_SEL_MASK = GENMASK(9, 8), 160*4882a593Smuzhiyun DCLK_VOP_PLL_SEL_CPLL = 0, 161*4882a593Smuzhiyun DCLK_VOP_PLL_SEL_GPLL = 1, 162*4882a593Smuzhiyun DCLK_VOP_PLL_SEL_NPLL = 2, 163*4882a593Smuzhiyun DCLK_VOP_DIV_SHIFT = 0, 164*4882a593Smuzhiyun DCLK_VOP_DIV_MASK = GENMASK(7, 0), 165*4882a593Smuzhiyun 166*4882a593Smuzhiyun /* CLKSEL_CON25 */ 167*4882a593Smuzhiyun CLK_SARADC_DIV_CON_SHIFT = 8, 168*4882a593Smuzhiyun CLK_SARADC_DIV_CON_MASK = GENMASK(15, 8), 169*4882a593Smuzhiyun CLK_SARADC_DIV_CON_WIDTH = 8, 170*4882a593Smuzhiyun 171*4882a593Smuzhiyun /* CLKSEL43_CON */ 172*4882a593Smuzhiyun GMAC_DIV_CON_SHIFT = 0x0, 173*4882a593Smuzhiyun GMAC_DIV_CON_MASK = GENMASK(4, 0), 174*4882a593Smuzhiyun GMAC_PLL_SHIFT = 6, 175*4882a593Smuzhiyun GMAC_PLL_MASK = GENMASK(7, 6), 176*4882a593Smuzhiyun GMAC_PLL_SELECT_NEW = (0x0 << GMAC_PLL_SHIFT), 177*4882a593Smuzhiyun GMAC_PLL_SELECT_CODEC = (0x1 << GMAC_PLL_SHIFT), 178*4882a593Smuzhiyun GMAC_PLL_SELECT_GENERAL = (0x2 << GMAC_PLL_SHIFT), 179*4882a593Smuzhiyun GMAC_MUX_SEL_EXTCLK = BIT(8), 180*4882a593Smuzhiyun 181*4882a593Smuzhiyun /* CLKSEL51_CON */ 182*4882a593Smuzhiyun MMC_PLL_SEL_SHIFT = 8, 183*4882a593Smuzhiyun MMC_PLL_SEL_MASK = GENMASK(9, 8), 184*4882a593Smuzhiyun MMC_PLL_SEL_CPLL = (0 << MMC_PLL_SEL_SHIFT), 185*4882a593Smuzhiyun MMC_PLL_SEL_GPLL = (1 << MMC_PLL_SEL_SHIFT), 186*4882a593Smuzhiyun MMC_PLL_SEL_USBPHY_480M = (2 << MMC_PLL_SEL_SHIFT), 187*4882a593Smuzhiyun MMC_PLL_SEL_24M = (3 << MMC_PLL_SEL_SHIFT), 188*4882a593Smuzhiyun MMC_CLK_DIV_SHIFT = 0, 189*4882a593Smuzhiyun MMC_CLK_DIV_MASK = GENMASK(6, 0), 190*4882a593Smuzhiyun 191*4882a593Smuzhiyun /* SOFTRST1_CON */ 192*4882a593Smuzhiyun MCU_PO_SRST_MASK = BIT(13), 193*4882a593Smuzhiyun MCU_SYS_SRST_MASK = BIT(12), 194*4882a593Smuzhiyun DMA1_SRST_REQ = BIT(2), 195*4882a593Smuzhiyun 196*4882a593Smuzhiyun /* SOFTRST4_CON */ 197*4882a593Smuzhiyun DMA2_SRST_REQ = BIT(0), 198*4882a593Smuzhiyun 199*4882a593Smuzhiyun /* GLB_RST_CON */ 200*4882a593Smuzhiyun PMU_GLB_SRST_CTRL_SHIFT = 2, 201*4882a593Smuzhiyun PMU_GLB_SRST_CTRL_MASK = GENMASK(3, 2), 202*4882a593Smuzhiyun PMU_RST_BY_FST_GLB_SRST = 0, 203*4882a593Smuzhiyun PMU_RST_BY_SND_GLB_SRST = 1, 204*4882a593Smuzhiyun PMU_RST_DISABLE = 2, 205*4882a593Smuzhiyun WDT_GLB_SRST_CTRL_SHIFT = 1, 206*4882a593Smuzhiyun WDT_GLB_SRST_CTRL_MASK = BIT(1), 207*4882a593Smuzhiyun WDT_TRIGGER_SND_GLB_SRST = 0, 208*4882a593Smuzhiyun WDT_TRIGGER_FST_GLB_SRST = 1, 209*4882a593Smuzhiyun TSADC_GLB_SRST_CTRL_SHIFT = 0, 210*4882a593Smuzhiyun TSADC_GLB_SRST_CTRL_MASK = BIT(0), 211*4882a593Smuzhiyun TSADC_TRIGGER_SND_GLB_SRST = 0, 212*4882a593Smuzhiyun TSADC_TRIGGER_FST_GLB_SRST = 1, 213*4882a593Smuzhiyun 214*4882a593Smuzhiyun }; 215*4882a593Smuzhiyun #endif 216