1*4882a593Smuzhiyun /* 2*4882a593Smuzhiyun * Copyright (C) 2015 Freescale Semiconductor, Inc. 3*4882a593Smuzhiyun * 4*4882a593Smuzhiyun * Author: 5*4882a593Smuzhiyun * Peng Fan <Peng.Fan@freescale.com> 6*4882a593Smuzhiyun * 7*4882a593Smuzhiyun * SPDX-License-Identifier: GPL-2.0+ 8*4882a593Smuzhiyun */ 9*4882a593Smuzhiyun 10*4882a593Smuzhiyun #ifndef _ASM_ARCH_CLOCK_H 11*4882a593Smuzhiyun #define _ASM_ARCH_CLOCK_H 12*4882a593Smuzhiyun 13*4882a593Smuzhiyun #include <common.h> 14*4882a593Smuzhiyun #include <asm/arch/crm_regs.h> 15*4882a593Smuzhiyun 16*4882a593Smuzhiyun #ifdef CONFIG_SYS_MX7_HCLK 17*4882a593Smuzhiyun #define MXC_HCLK CONFIG_SYS_MX7_HCLK 18*4882a593Smuzhiyun #else 19*4882a593Smuzhiyun #define MXC_HCLK 24000000 20*4882a593Smuzhiyun #endif 21*4882a593Smuzhiyun 22*4882a593Smuzhiyun #ifdef CONFIG_SYS_MX7_CLK32 23*4882a593Smuzhiyun #define MXC_CLK32 CONFIG_SYS_MX7_CLK32 24*4882a593Smuzhiyun #else 25*4882a593Smuzhiyun #define MXC_CLK32 32768 26*4882a593Smuzhiyun #endif 27*4882a593Smuzhiyun 28*4882a593Smuzhiyun /* Mainly for compatible to imx common code. */ 29*4882a593Smuzhiyun enum mxc_clock { 30*4882a593Smuzhiyun MXC_ARM_CLK = 0, 31*4882a593Smuzhiyun MXC_AHB_CLK, 32*4882a593Smuzhiyun MXC_IPG_CLK, 33*4882a593Smuzhiyun MXC_UART_CLK, 34*4882a593Smuzhiyun MXC_CSPI_CLK, 35*4882a593Smuzhiyun MXC_AXI_CLK, 36*4882a593Smuzhiyun MXC_DDR_CLK, 37*4882a593Smuzhiyun MXC_ESDHC_CLK, 38*4882a593Smuzhiyun MXC_ESDHC2_CLK, 39*4882a593Smuzhiyun MXC_ESDHC3_CLK, 40*4882a593Smuzhiyun MXC_I2C_CLK, 41*4882a593Smuzhiyun }; 42*4882a593Smuzhiyun 43*4882a593Smuzhiyun /* PLL supported by i.mx7d */ 44*4882a593Smuzhiyun enum pll_clocks { 45*4882a593Smuzhiyun PLL_CORE, /* Core PLL */ 46*4882a593Smuzhiyun PLL_SYS, /* System PLL*/ 47*4882a593Smuzhiyun PLL_ENET, /* Enet PLL */ 48*4882a593Smuzhiyun PLL_AUDIO, /* Audio PLL */ 49*4882a593Smuzhiyun PLL_VIDEO, /* Video PLL*/ 50*4882a593Smuzhiyun PLL_DDR, /* Dram PLL */ 51*4882a593Smuzhiyun PLL_USB, /* USB PLL, fixed at 480MHZ */ 52*4882a593Smuzhiyun }; 53*4882a593Smuzhiyun 54*4882a593Smuzhiyun /* clk src for clock root gen */ 55*4882a593Smuzhiyun enum clk_root_src { 56*4882a593Smuzhiyun OSC_24M_CLK, 57*4882a593Smuzhiyun 58*4882a593Smuzhiyun PLL_ARM_MAIN_800M_CLK, 59*4882a593Smuzhiyun 60*4882a593Smuzhiyun PLL_SYS_MAIN_480M_CLK, 61*4882a593Smuzhiyun PLL_SYS_MAIN_240M_CLK, 62*4882a593Smuzhiyun PLL_SYS_MAIN_120M_CLK, 63*4882a593Smuzhiyun PLL_SYS_PFD0_392M_CLK, 64*4882a593Smuzhiyun PLL_SYS_PFD0_196M_CLK, 65*4882a593Smuzhiyun PLL_SYS_PFD1_332M_CLK, 66*4882a593Smuzhiyun PLL_SYS_PFD1_166M_CLK, 67*4882a593Smuzhiyun PLL_SYS_PFD2_270M_CLK, 68*4882a593Smuzhiyun PLL_SYS_PFD2_135M_CLK, 69*4882a593Smuzhiyun PLL_SYS_PFD3_CLK, 70*4882a593Smuzhiyun PLL_SYS_PFD4_CLK, 71*4882a593Smuzhiyun PLL_SYS_PFD5_CLK, 72*4882a593Smuzhiyun PLL_SYS_PFD6_CLK, 73*4882a593Smuzhiyun PLL_SYS_PFD7_CLK, 74*4882a593Smuzhiyun 75*4882a593Smuzhiyun PLL_ENET_MAIN_500M_CLK, 76*4882a593Smuzhiyun PLL_ENET_MAIN_250M_CLK, 77*4882a593Smuzhiyun PLL_ENET_MAIN_125M_CLK, 78*4882a593Smuzhiyun PLL_ENET_MAIN_100M_CLK, 79*4882a593Smuzhiyun PLL_ENET_MAIN_50M_CLK, 80*4882a593Smuzhiyun PLL_ENET_MAIN_40M_CLK, 81*4882a593Smuzhiyun PLL_ENET_MAIN_25M_CLK, 82*4882a593Smuzhiyun 83*4882a593Smuzhiyun PLL_DRAM_MAIN_1066M_CLK, 84*4882a593Smuzhiyun PLL_DRAM_MAIN_533M_CLK, 85*4882a593Smuzhiyun 86*4882a593Smuzhiyun PLL_AUDIO_MAIN_CLK, 87*4882a593Smuzhiyun PLL_VIDEO_MAIN_CLK, 88*4882a593Smuzhiyun 89*4882a593Smuzhiyun PLL_USB_MAIN_480M_CLK, /* fixed at 480MHZ */ 90*4882a593Smuzhiyun 91*4882a593Smuzhiyun EXT_CLK_1, 92*4882a593Smuzhiyun EXT_CLK_2, 93*4882a593Smuzhiyun EXT_CLK_3, 94*4882a593Smuzhiyun EXT_CLK_4, 95*4882a593Smuzhiyun 96*4882a593Smuzhiyun REF_1M_CLK, 97*4882a593Smuzhiyun OSC_32K_CLK, 98*4882a593Smuzhiyun }; 99*4882a593Smuzhiyun 100*4882a593Smuzhiyun /* 101*4882a593Smuzhiyun * Clock root index 102*4882a593Smuzhiyun */ 103*4882a593Smuzhiyun enum clk_root_index { 104*4882a593Smuzhiyun ARM_A7_CLK_ROOT = 0, 105*4882a593Smuzhiyun ARM_M4_CLK_ROOT = 1, 106*4882a593Smuzhiyun ARM_M0_CLK_ROOT = 2, 107*4882a593Smuzhiyun MAIN_AXI_CLK_ROOT = 16, 108*4882a593Smuzhiyun DISP_AXI_CLK_ROOT = 17, 109*4882a593Smuzhiyun ENET_AXI_CLK_ROOT = 18, 110*4882a593Smuzhiyun NAND_USDHC_BUS_CLK_ROOT = 19, 111*4882a593Smuzhiyun AHB_CLK_ROOT = 32, 112*4882a593Smuzhiyun DRAM_PHYM_CLK_ROOT = 48, 113*4882a593Smuzhiyun DRAM_CLK_ROOT = 49, 114*4882a593Smuzhiyun DRAM_PHYM_ALT_CLK_ROOT = 64, 115*4882a593Smuzhiyun DRAM_ALT_CLK_ROOT = 65, 116*4882a593Smuzhiyun USB_HSIC_CLK_ROOT = 66, 117*4882a593Smuzhiyun PCIE_CTRL_CLK_ROOT = 67, 118*4882a593Smuzhiyun PCIE_PHY_CLK_ROOT = 68, 119*4882a593Smuzhiyun EPDC_PIXEL_CLK_ROOT = 69, 120*4882a593Smuzhiyun LCDIF_PIXEL_CLK_ROOT = 70, 121*4882a593Smuzhiyun MIPI_DSI_EXTSER_CLK_ROOT = 71, 122*4882a593Smuzhiyun MIPI_CSI_WARP_CLK_ROOT = 72, 123*4882a593Smuzhiyun MIPI_DPHY_REF_CLK_ROOT = 73, 124*4882a593Smuzhiyun SAI1_CLK_ROOT = 74, 125*4882a593Smuzhiyun SAI2_CLK_ROOT = 75, 126*4882a593Smuzhiyun SAI3_CLK_ROOT = 76, 127*4882a593Smuzhiyun SPDIF_CLK_ROOT = 77, 128*4882a593Smuzhiyun ENET1_REF_CLK_ROOT = 78, 129*4882a593Smuzhiyun ENET1_TIME_CLK_ROOT = 79, 130*4882a593Smuzhiyun ENET2_REF_CLK_ROOT = 80, 131*4882a593Smuzhiyun ENET2_TIME_CLK_ROOT = 81, 132*4882a593Smuzhiyun ENET_PHY_REF_CLK_ROOT = 82, 133*4882a593Smuzhiyun EIM_CLK_ROOT = 83, 134*4882a593Smuzhiyun NAND_CLK_ROOT = 84, 135*4882a593Smuzhiyun QSPI_CLK_ROOT = 85, 136*4882a593Smuzhiyun USDHC1_CLK_ROOT = 86, 137*4882a593Smuzhiyun USDHC2_CLK_ROOT = 87, 138*4882a593Smuzhiyun USDHC3_CLK_ROOT = 88, 139*4882a593Smuzhiyun CAN1_CLK_ROOT = 89, 140*4882a593Smuzhiyun CAN2_CLK_ROOT = 90, 141*4882a593Smuzhiyun I2C1_CLK_ROOT = 91, 142*4882a593Smuzhiyun I2C2_CLK_ROOT = 92, 143*4882a593Smuzhiyun I2C3_CLK_ROOT = 93, 144*4882a593Smuzhiyun I2C4_CLK_ROOT = 94, 145*4882a593Smuzhiyun UART1_CLK_ROOT = 95, 146*4882a593Smuzhiyun UART2_CLK_ROOT = 96, 147*4882a593Smuzhiyun UART3_CLK_ROOT = 97, 148*4882a593Smuzhiyun UART4_CLK_ROOT = 98, 149*4882a593Smuzhiyun UART5_CLK_ROOT = 99, 150*4882a593Smuzhiyun UART6_CLK_ROOT = 100, 151*4882a593Smuzhiyun UART7_CLK_ROOT = 101, 152*4882a593Smuzhiyun ECSPI1_CLK_ROOT = 102, 153*4882a593Smuzhiyun ECSPI2_CLK_ROOT = 103, 154*4882a593Smuzhiyun ECSPI3_CLK_ROOT = 104, 155*4882a593Smuzhiyun ECSPI4_CLK_ROOT = 105, 156*4882a593Smuzhiyun PWM1_CLK_ROOT = 106, 157*4882a593Smuzhiyun PWM2_CLK_ROOT = 107, 158*4882a593Smuzhiyun PWM3_CLK_ROOT = 108, 159*4882a593Smuzhiyun PWM4_CLK_ROOT = 109, 160*4882a593Smuzhiyun FLEXTIMER1_CLK_ROOT = 110, 161*4882a593Smuzhiyun FLEXTIMER2_CLK_ROOT = 111, 162*4882a593Smuzhiyun SIM1_CLK_ROOT = 112, 163*4882a593Smuzhiyun SIM2_CLK_ROOT = 113, 164*4882a593Smuzhiyun GPT1_CLK_ROOT = 114, 165*4882a593Smuzhiyun GPT2_CLK_ROOT = 115, 166*4882a593Smuzhiyun GPT3_CLK_ROOT = 116, 167*4882a593Smuzhiyun GPT4_CLK_ROOT = 117, 168*4882a593Smuzhiyun TRACE_CLK_ROOT = 118, 169*4882a593Smuzhiyun WDOG_CLK_ROOT = 119, 170*4882a593Smuzhiyun CSI_MCLK_CLK_ROOT = 120, 171*4882a593Smuzhiyun AUDIO_MCLK_CLK_ROOT = 121, 172*4882a593Smuzhiyun WRCLK_CLK_ROOT = 122, 173*4882a593Smuzhiyun IPP_DO_CLKO1 = 123, 174*4882a593Smuzhiyun IPP_DO_CLKO2 = 124, 175*4882a593Smuzhiyun 176*4882a593Smuzhiyun CLK_ROOT_MAX, 177*4882a593Smuzhiyun }; 178*4882a593Smuzhiyun 179*4882a593Smuzhiyun struct clk_root_setting { 180*4882a593Smuzhiyun enum clk_root_index root; 181*4882a593Smuzhiyun u32 setting; 182*4882a593Smuzhiyun }; 183*4882a593Smuzhiyun 184*4882a593Smuzhiyun /* 185*4882a593Smuzhiyun * CCGR mapping 186*4882a593Smuzhiyun */ 187*4882a593Smuzhiyun enum clk_ccgr_index { 188*4882a593Smuzhiyun CCGR_CPU = 0, 189*4882a593Smuzhiyun CCGR_M4 = 1, 190*4882a593Smuzhiyun CCGR_SIM_MAIN = 4, 191*4882a593Smuzhiyun CCGR_SIM_DISPLAY = 5, 192*4882a593Smuzhiyun CCGR_SIM_ENET = 6, 193*4882a593Smuzhiyun CCGR_SIM_M = 7, 194*4882a593Smuzhiyun CCGR_SIM_S = 8, 195*4882a593Smuzhiyun CCGR_SIM_WAKEUP = 9, 196*4882a593Smuzhiyun CCGR_IPMUX1 = 10, 197*4882a593Smuzhiyun CCGR_IPMUX2 = 11, 198*4882a593Smuzhiyun CCGR_IPMUX3 = 12, 199*4882a593Smuzhiyun CCGR_ROM = 16, 200*4882a593Smuzhiyun CCGR_OCRAM = 17, 201*4882a593Smuzhiyun CCGR_OCRAM_S = 18, 202*4882a593Smuzhiyun CCGR_DRAM = 19, 203*4882a593Smuzhiyun CCGR_RAWNAND = 20, 204*4882a593Smuzhiyun CCGR_QSPI = 21, 205*4882a593Smuzhiyun CCGR_WEIM = 22, 206*4882a593Smuzhiyun CCGR_ADC = 32, 207*4882a593Smuzhiyun CCGR_ANATOP = 33, 208*4882a593Smuzhiyun CCGR_SCTR = 34, 209*4882a593Smuzhiyun CCGR_OCOTP = 35, 210*4882a593Smuzhiyun CCGR_CAAM = 36, 211*4882a593Smuzhiyun CCGR_SNVS = 37, 212*4882a593Smuzhiyun CCGR_RDC = 38, 213*4882a593Smuzhiyun CCGR_MU = 39, 214*4882a593Smuzhiyun CCGR_HS = 40, 215*4882a593Smuzhiyun CCGR_DVFS = 41, 216*4882a593Smuzhiyun CCGR_QOS = 42, 217*4882a593Smuzhiyun CCGR_QOS_DISPMIX = 43, 218*4882a593Smuzhiyun CCGR_QOS_MEGAMIX = 44, 219*4882a593Smuzhiyun CCGR_CSU = 45, 220*4882a593Smuzhiyun CCGR_DBGMON = 46, 221*4882a593Smuzhiyun CCGR_DEBUG = 47, 222*4882a593Smuzhiyun CCGR_TRACE = 48, 223*4882a593Smuzhiyun CCGR_SEC_DEBUG = 49, 224*4882a593Smuzhiyun CCGR_SEMA1 = 64, 225*4882a593Smuzhiyun CCGR_SEMA2 = 65, 226*4882a593Smuzhiyun CCGR_PERFMON1 = 68, 227*4882a593Smuzhiyun CCGR_PERFMON2 = 69, 228*4882a593Smuzhiyun CCGR_SDMA = 72, 229*4882a593Smuzhiyun CCGR_CSI = 73, 230*4882a593Smuzhiyun CCGR_EPDC = 74, 231*4882a593Smuzhiyun CCGR_LCDIF = 75, 232*4882a593Smuzhiyun CCGR_PXP = 76, 233*4882a593Smuzhiyun CCGR_PCIE = 96, 234*4882a593Smuzhiyun CCGR_MIPI_CSI = 100, 235*4882a593Smuzhiyun CCGR_MIPI_DSI = 101, 236*4882a593Smuzhiyun CCGR_MIPI_MEM_PHY = 102, 237*4882a593Smuzhiyun CCGR_USB_CTRL = 104, 238*4882a593Smuzhiyun CCGR_USB_HSIC = 105, 239*4882a593Smuzhiyun CCGR_USB_PHY1 = 106, 240*4882a593Smuzhiyun CCGR_USB_PHY2 = 107, 241*4882a593Smuzhiyun CCGR_USDHC1 = 108, 242*4882a593Smuzhiyun CCGR_USDHC2 = 109, 243*4882a593Smuzhiyun CCGR_USDHC3 = 110, 244*4882a593Smuzhiyun CCGR_ENET1 = 112, 245*4882a593Smuzhiyun CCGR_ENET2 = 113, 246*4882a593Smuzhiyun CCGR_CAN1 = 116, 247*4882a593Smuzhiyun CCGR_CAN2 = 117, 248*4882a593Smuzhiyun CCGR_ECSPI1 = 120, 249*4882a593Smuzhiyun CCGR_ECSPI2 = 121, 250*4882a593Smuzhiyun CCGR_ECSPI3 = 122, 251*4882a593Smuzhiyun CCGR_ECSPI4 = 123, 252*4882a593Smuzhiyun CCGR_GPT1 = 124, 253*4882a593Smuzhiyun CCGR_GPT2 = 125, 254*4882a593Smuzhiyun CCGR_GPT3 = 126, 255*4882a593Smuzhiyun CCGR_GPT4 = 127, 256*4882a593Smuzhiyun CCGR_FTM1 = 128, 257*4882a593Smuzhiyun CCGR_FTM2 = 129, 258*4882a593Smuzhiyun CCGR_PWM1 = 132, 259*4882a593Smuzhiyun CCGR_PWM2 = 133, 260*4882a593Smuzhiyun CCGR_PWM3 = 134, 261*4882a593Smuzhiyun CCGR_PWM4 = 135, 262*4882a593Smuzhiyun CCGR_I2C1 = 136, 263*4882a593Smuzhiyun CCGR_I2C2 = 137, 264*4882a593Smuzhiyun CCGR_I2C3 = 138, 265*4882a593Smuzhiyun CCGR_I2C4 = 139, 266*4882a593Smuzhiyun CCGR_SAI1 = 140, 267*4882a593Smuzhiyun CCGR_SAI2 = 141, 268*4882a593Smuzhiyun CCGR_SAI3 = 142, 269*4882a593Smuzhiyun CCGR_SIM1 = 144, 270*4882a593Smuzhiyun CCGR_SIM2 = 145, 271*4882a593Smuzhiyun CCGR_UART1 = 148, 272*4882a593Smuzhiyun CCGR_UART2 = 149, 273*4882a593Smuzhiyun CCGR_UART3 = 150, 274*4882a593Smuzhiyun CCGR_UART4 = 151, 275*4882a593Smuzhiyun CCGR_UART5 = 152, 276*4882a593Smuzhiyun CCGR_UART6 = 153, 277*4882a593Smuzhiyun CCGR_UART7 = 154, 278*4882a593Smuzhiyun CCGR_WDOG1 = 156, 279*4882a593Smuzhiyun CCGR_WDOG2 = 157, 280*4882a593Smuzhiyun CCGR_WDOG3 = 158, 281*4882a593Smuzhiyun CCGR_WDOG4 = 159, 282*4882a593Smuzhiyun CCGR_GPIO1 = 160, 283*4882a593Smuzhiyun CCGR_GPIO2 = 161, 284*4882a593Smuzhiyun CCGR_GPIO3 = 162, 285*4882a593Smuzhiyun CCGR_GPIO4 = 163, 286*4882a593Smuzhiyun CCGR_GPIO5 = 164, 287*4882a593Smuzhiyun CCGR_GPIO6 = 165, 288*4882a593Smuzhiyun CCGR_GPIO7 = 166, 289*4882a593Smuzhiyun CCGR_IOMUX = 168, 290*4882a593Smuzhiyun CCGR_IOMUX_LPSR = 169, 291*4882a593Smuzhiyun CCGR_KPP = 170, 292*4882a593Smuzhiyun 293*4882a593Smuzhiyun CCGR_SKIP, 294*4882a593Smuzhiyun CCGR_MAX, 295*4882a593Smuzhiyun }; 296*4882a593Smuzhiyun 297*4882a593Smuzhiyun /* Clock root channel */ 298*4882a593Smuzhiyun enum clk_root_type { 299*4882a593Smuzhiyun CCM_CORE_CHANNEL, 300*4882a593Smuzhiyun CCM_BUS_CHANNEL, 301*4882a593Smuzhiyun CCM_AHB_CHANNEL, 302*4882a593Smuzhiyun CCM_DRAM_PHYM_CHANNEL, 303*4882a593Smuzhiyun CCM_DRAM_CHANNEL, 304*4882a593Smuzhiyun CCM_IP_CHANNEL, 305*4882a593Smuzhiyun }; 306*4882a593Smuzhiyun 307*4882a593Smuzhiyun #include <asm/arch/clock_slice.h> 308*4882a593Smuzhiyun 309*4882a593Smuzhiyun /* 310*4882a593Smuzhiyun * entry: the clock root index 311*4882a593Smuzhiyun * type: ccm channel 312*4882a593Smuzhiyun * src_mux: each entry corresponding to the clock src, detailed info in CCM RM 313*4882a593Smuzhiyun */ 314*4882a593Smuzhiyun struct clk_root_map { 315*4882a593Smuzhiyun enum clk_root_index entry; 316*4882a593Smuzhiyun enum clk_root_type type; 317*4882a593Smuzhiyun uint8_t src_mux[8]; 318*4882a593Smuzhiyun }; 319*4882a593Smuzhiyun 320*4882a593Smuzhiyun enum enet_freq { 321*4882a593Smuzhiyun ENET_25MHz, 322*4882a593Smuzhiyun ENET_50MHz, 323*4882a593Smuzhiyun ENET_125MHz, 324*4882a593Smuzhiyun }; 325*4882a593Smuzhiyun 326*4882a593Smuzhiyun u32 get_root_clk(enum clk_root_index clock_id); 327*4882a593Smuzhiyun u32 mxc_get_clock(enum mxc_clock clk); 328*4882a593Smuzhiyun u32 imx_get_uartclk(void); 329*4882a593Smuzhiyun u32 imx_get_fecclk(void); 330*4882a593Smuzhiyun void clock_init(void); 331*4882a593Smuzhiyun #ifdef CONFIG_SYS_I2C_MXC 332*4882a593Smuzhiyun int enable_i2c_clk(unsigned char enable, unsigned i2c_num); 333*4882a593Smuzhiyun #endif 334*4882a593Smuzhiyun #ifdef CONFIG_FEC_MXC 335*4882a593Smuzhiyun int set_clk_enet(enum enet_freq type); 336*4882a593Smuzhiyun #endif 337*4882a593Smuzhiyun int set_clk_qspi(void); 338*4882a593Smuzhiyun int set_clk_nand(void); 339*4882a593Smuzhiyun #ifdef CONFIG_MXC_OCOTP 340*4882a593Smuzhiyun void enable_ocotp_clk(unsigned char enable); 341*4882a593Smuzhiyun #endif 342*4882a593Smuzhiyun void enable_usboh3_clk(unsigned char enable); 343*4882a593Smuzhiyun #ifdef CONFIG_SECURE_BOOT 344*4882a593Smuzhiyun void hab_caam_clock_enable(unsigned char enable); 345*4882a593Smuzhiyun #endif 346*4882a593Smuzhiyun void mxs_set_lcdclk(uint32_t base_addr, uint32_t freq); 347*4882a593Smuzhiyun void enable_thermal_clk(void); 348*4882a593Smuzhiyun #endif 349