| /* SPDX-License-Identifier: GPL-2.0+ */ |
| /* |
| * Copyright (C) 2015 Freescale Semiconductor, Inc. |
| * |
| * Author: |
| * Peng Fan <Peng.Fan@freescale.com> |
| */ |
| |
| #ifndef _ASM_ARCH_CLOCK_H |
| #define _ASM_ARCH_CLOCK_H |
| |
| #include <asm/arch/crm_regs.h> |
| |
| #ifdef CONFIG_SYS_MX7_HCLK |
| #define MXC_HCLK CONFIG_SYS_MX7_HCLK |
| #else |
| #define MXC_HCLK 24000000 |
| #endif |
| |
| #ifdef CONFIG_SYS_MX7_CLK32 |
| #define MXC_CLK32 CONFIG_SYS_MX7_CLK32 |
| #else |
| #define MXC_CLK32 32768 |
| #endif |
| |
| /* Mainly for compatible to imx common code. */ |
| enum mxc_clock { |
| MXC_ARM_CLK = 0, |
| MXC_AHB_CLK, |
| MXC_IPG_CLK, |
| MXC_UART_CLK, |
| MXC_CSPI_CLK, |
| MXC_AXI_CLK, |
| MXC_DDR_CLK, |
| MXC_ESDHC_CLK, |
| MXC_ESDHC2_CLK, |
| MXC_ESDHC3_CLK, |
| MXC_I2C_CLK, |
| }; |
| |
| /* PLL supported by i.mx7d */ |
| enum pll_clocks { |
| PLL_CORE, /* Core PLL */ |
| PLL_SYS, /* System PLL*/ |
| PLL_ENET, /* Enet PLL */ |
| PLL_AUDIO, /* Audio PLL */ |
| PLL_VIDEO, /* Video PLL*/ |
| PLL_DDR, /* Dram PLL */ |
| PLL_USB, /* USB PLL, fixed at 480MHZ */ |
| }; |
| |
| /* clk src for clock root gen */ |
| enum clk_root_src { |
| OSC_24M_CLK, |
| |
| PLL_ARM_MAIN_800M_CLK, |
| |
| PLL_SYS_MAIN_480M_CLK, |
| PLL_SYS_MAIN_240M_CLK, |
| PLL_SYS_MAIN_120M_CLK, |
| PLL_SYS_PFD0_392M_CLK, |
| PLL_SYS_PFD0_196M_CLK, |
| PLL_SYS_PFD1_332M_CLK, |
| PLL_SYS_PFD1_166M_CLK, |
| PLL_SYS_PFD2_270M_CLK, |
| PLL_SYS_PFD2_135M_CLK, |
| PLL_SYS_PFD3_CLK, |
| PLL_SYS_PFD4_CLK, |
| PLL_SYS_PFD5_CLK, |
| PLL_SYS_PFD6_CLK, |
| PLL_SYS_PFD7_CLK, |
| |
| PLL_ENET_MAIN_500M_CLK, |
| PLL_ENET_MAIN_250M_CLK, |
| PLL_ENET_MAIN_125M_CLK, |
| PLL_ENET_MAIN_100M_CLK, |
| PLL_ENET_MAIN_50M_CLK, |
| PLL_ENET_MAIN_40M_CLK, |
| PLL_ENET_MAIN_25M_CLK, |
| |
| PLL_DRAM_MAIN_1066M_CLK, |
| PLL_DRAM_MAIN_533M_CLK, |
| |
| PLL_AUDIO_MAIN_CLK, |
| PLL_VIDEO_MAIN_CLK, |
| |
| PLL_USB_MAIN_480M_CLK, /* fixed at 480MHZ */ |
| |
| EXT_CLK_1, |
| EXT_CLK_2, |
| EXT_CLK_3, |
| EXT_CLK_4, |
| |
| REF_1M_CLK, |
| OSC_32K_CLK, |
| }; |
| |
| /* |
| * Clock root index |
| */ |
| enum clk_root_index { |
| ARM_A7_CLK_ROOT = 0, |
| ARM_M4_CLK_ROOT = 1, |
| ARM_M0_CLK_ROOT = 2, |
| MAIN_AXI_CLK_ROOT = 16, |
| DISP_AXI_CLK_ROOT = 17, |
| ENET_AXI_CLK_ROOT = 18, |
| NAND_USDHC_BUS_CLK_ROOT = 19, |
| AHB_CLK_ROOT = 32, |
| DRAM_PHYM_CLK_ROOT = 48, |
| DRAM_CLK_ROOT = 49, |
| DRAM_PHYM_ALT_CLK_ROOT = 64, |
| DRAM_ALT_CLK_ROOT = 65, |
| USB_HSIC_CLK_ROOT = 66, |
| PCIE_CTRL_CLK_ROOT = 67, |
| PCIE_PHY_CLK_ROOT = 68, |
| EPDC_PIXEL_CLK_ROOT = 69, |
| LCDIF_PIXEL_CLK_ROOT = 70, |
| MIPI_DSI_EXTSER_CLK_ROOT = 71, |
| MIPI_CSI_WARP_CLK_ROOT = 72, |
| MIPI_DPHY_REF_CLK_ROOT = 73, |
| SAI1_CLK_ROOT = 74, |
| SAI2_CLK_ROOT = 75, |
| SAI3_CLK_ROOT = 76, |
| SPDIF_CLK_ROOT = 77, |
| ENET1_REF_CLK_ROOT = 78, |
| ENET1_TIME_CLK_ROOT = 79, |
| ENET2_REF_CLK_ROOT = 80, |
| ENET2_TIME_CLK_ROOT = 81, |
| ENET_PHY_REF_CLK_ROOT = 82, |
| EIM_CLK_ROOT = 83, |
| NAND_CLK_ROOT = 84, |
| QSPI_CLK_ROOT = 85, |
| USDHC1_CLK_ROOT = 86, |
| USDHC2_CLK_ROOT = 87, |
| USDHC3_CLK_ROOT = 88, |
| CAN1_CLK_ROOT = 89, |
| CAN2_CLK_ROOT = 90, |
| I2C1_CLK_ROOT = 91, |
| I2C2_CLK_ROOT = 92, |
| I2C3_CLK_ROOT = 93, |
| I2C4_CLK_ROOT = 94, |
| UART1_CLK_ROOT = 95, |
| UART2_CLK_ROOT = 96, |
| UART3_CLK_ROOT = 97, |
| UART4_CLK_ROOT = 98, |
| UART5_CLK_ROOT = 99, |
| UART6_CLK_ROOT = 100, |
| UART7_CLK_ROOT = 101, |
| ECSPI1_CLK_ROOT = 102, |
| ECSPI2_CLK_ROOT = 103, |
| ECSPI3_CLK_ROOT = 104, |
| ECSPI4_CLK_ROOT = 105, |
| PWM1_CLK_ROOT = 106, |
| PWM2_CLK_ROOT = 107, |
| PWM3_CLK_ROOT = 108, |
| PWM4_CLK_ROOT = 109, |
| FLEXTIMER1_CLK_ROOT = 110, |
| FLEXTIMER2_CLK_ROOT = 111, |
| SIM1_CLK_ROOT = 112, |
| SIM2_CLK_ROOT = 113, |
| GPT1_CLK_ROOT = 114, |
| GPT2_CLK_ROOT = 115, |
| GPT3_CLK_ROOT = 116, |
| GPT4_CLK_ROOT = 117, |
| TRACE_CLK_ROOT = 118, |
| WDOG_CLK_ROOT = 119, |
| CSI_MCLK_CLK_ROOT = 120, |
| AUDIO_MCLK_CLK_ROOT = 121, |
| WRCLK_CLK_ROOT = 122, |
| IPP_DO_CLKO1 = 123, |
| IPP_DO_CLKO2 = 124, |
| |
| CLK_ROOT_MAX, |
| }; |
| |
| #if (CONFIG_CONS_INDEX == 0) |
| #define UART_CLK_ROOT UART1_CLK_ROOT |
| #elif (CONFIG_CONS_INDEX == 1) |
| #define UART_CLK_ROOT UART2_CLK_ROOT |
| #elif (CONFIG_CONS_INDEX == 2) |
| #define UART_CLK_ROOT UART3_CLK_ROOT |
| #elif (CONFIG_CONS_INDEX == 3) |
| #define UART_CLK_ROOT UART4_CLK_ROOT |
| #elif (CONFIG_CONS_INDEX == 4) |
| #define UART_CLK_ROOT UART5_CLK_ROOT |
| #elif (CONFIG_CONS_INDEX == 5) |
| #define UART_CLK_ROOT UART6_CLK_ROOT |
| #elif (CONFIG_CONS_INDEX == 6) |
| #define UART_CLK_ROOT UART7_CLK_ROOT |
| #else |
| #error "Invalid IMX UART ID for serial console is defined" |
| #endif |
| |
| struct clk_root_setting { |
| enum clk_root_index root; |
| u32 setting; |
| }; |
| |
| /* |
| * CCGR mapping |
| */ |
| enum clk_ccgr_index { |
| CCGR_CPU = 0, |
| CCGR_M4 = 1, |
| CCGR_SIM_MAIN = 4, |
| CCGR_SIM_DISPLAY = 5, |
| CCGR_SIM_ENET = 6, |
| CCGR_SIM_M = 7, |
| CCGR_SIM_S = 8, |
| CCGR_SIM_WAKEUP = 9, |
| CCGR_IPMUX1 = 10, |
| CCGR_IPMUX2 = 11, |
| CCGR_IPMUX3 = 12, |
| CCGR_ROM = 16, |
| CCGR_OCRAM = 17, |
| CCGR_OCRAM_S = 18, |
| CCGR_DRAM = 19, |
| CCGR_RAWNAND = 20, |
| CCGR_QSPI = 21, |
| CCGR_WEIM = 22, |
| CCGR_ADC = 32, |
| CCGR_ANATOP = 33, |
| CCGR_SCTR = 34, |
| CCGR_OCOTP = 35, |
| CCGR_CAAM = 36, |
| CCGR_SNVS = 37, |
| CCGR_RDC = 38, |
| CCGR_MU = 39, |
| CCGR_HS = 40, |
| CCGR_DVFS = 41, |
| CCGR_QOS = 42, |
| CCGR_QOS_DISPMIX = 43, |
| CCGR_QOS_MEGAMIX = 44, |
| CCGR_CSU = 45, |
| CCGR_DBGMON = 46, |
| CCGR_DEBUG = 47, |
| CCGR_TRACE = 48, |
| CCGR_SEC_DEBUG = 49, |
| CCGR_SEMA1 = 64, |
| CCGR_SEMA2 = 65, |
| CCGR_PERFMON1 = 68, |
| CCGR_PERFMON2 = 69, |
| CCGR_SDMA = 72, |
| CCGR_CSI = 73, |
| CCGR_EPDC = 74, |
| CCGR_LCDIF = 75, |
| CCGR_PXP = 76, |
| CCGR_PCIE = 96, |
| CCGR_MIPI_CSI = 100, |
| CCGR_MIPI_DSI = 101, |
| CCGR_MIPI_MEM_PHY = 102, |
| CCGR_USB_CTRL = 104, |
| CCGR_USB_HSIC = 105, |
| CCGR_USB_PHY1 = 106, |
| CCGR_USB_PHY2 = 107, |
| CCGR_USDHC1 = 108, |
| CCGR_USDHC2 = 109, |
| CCGR_USDHC3 = 110, |
| CCGR_ENET1 = 112, |
| CCGR_ENET2 = 113, |
| CCGR_CAN1 = 116, |
| CCGR_CAN2 = 117, |
| CCGR_ECSPI1 = 120, |
| CCGR_ECSPI2 = 121, |
| CCGR_ECSPI3 = 122, |
| CCGR_ECSPI4 = 123, |
| CCGR_GPT1 = 124, |
| CCGR_GPT2 = 125, |
| CCGR_GPT3 = 126, |
| CCGR_GPT4 = 127, |
| CCGR_FTM1 = 128, |
| CCGR_FTM2 = 129, |
| CCGR_PWM1 = 132, |
| CCGR_PWM2 = 133, |
| CCGR_PWM3 = 134, |
| CCGR_PWM4 = 135, |
| CCGR_I2C1 = 136, |
| CCGR_I2C2 = 137, |
| CCGR_I2C3 = 138, |
| CCGR_I2C4 = 139, |
| CCGR_SAI1 = 140, |
| CCGR_SAI2 = 141, |
| CCGR_SAI3 = 142, |
| CCGR_SIM1 = 144, |
| CCGR_SIM2 = 145, |
| CCGR_UART1 = 148, |
| CCGR_UART2 = 149, |
| CCGR_UART3 = 150, |
| CCGR_UART4 = 151, |
| CCGR_UART5 = 152, |
| CCGR_UART6 = 153, |
| CCGR_UART7 = 154, |
| CCGR_WDOG1 = 156, |
| CCGR_WDOG2 = 157, |
| CCGR_WDOG3 = 158, |
| CCGR_WDOG4 = 159, |
| CCGR_GPIO1 = 160, |
| CCGR_GPIO2 = 161, |
| CCGR_GPIO3 = 162, |
| CCGR_GPIO4 = 163, |
| CCGR_GPIO5 = 164, |
| CCGR_GPIO6 = 165, |
| CCGR_GPIO7 = 166, |
| CCGR_IOMUX = 168, |
| CCGR_IOMUX_LPSR = 169, |
| CCGR_KPP = 170, |
| |
| CCGR_SKIP, |
| CCGR_MAX, |
| }; |
| |
| /* Clock root channel */ |
| enum clk_root_type { |
| CCM_CORE_CHANNEL, |
| CCM_BUS_CHANNEL, |
| CCM_AHB_CHANNEL, |
| CCM_DRAM_PHYM_CHANNEL, |
| CCM_DRAM_CHANNEL, |
| CCM_IP_CHANNEL, |
| }; |
| |
| #include <asm/arch/clock_slice.h> |
| |
| /* |
| * entry: the clock root index |
| * type: ccm channel |
| * src_mux: each entry corresponding to the clock src, detailed info in CCM RM |
| */ |
| struct clk_root_map { |
| enum clk_root_index entry; |
| enum clk_root_type type; |
| uint8_t src_mux[8]; |
| }; |
| |
| enum enet_freq { |
| ENET_25MHZ, |
| ENET_50MHZ, |
| ENET_125MHZ, |
| }; |
| |
| u32 get_root_clk(enum clk_root_index clock_id); |
| u32 mxc_get_clock(enum mxc_clock clk); |
| u32 imx_get_uartclk(void); |
| u32 imx_get_fecclk(void); |
| void clock_init(void); |
| #ifdef CONFIG_SYS_I2C_MXC |
| int enable_i2c_clk(unsigned char enable, unsigned i2c_num); |
| #endif |
| #ifdef CONFIG_FEC_MXC |
| int set_clk_enet(enum enet_freq type); |
| #endif |
| int set_clk_qspi(void); |
| int set_clk_nand(void); |
| #ifdef CONFIG_MXC_OCOTP |
| void enable_ocotp_clk(unsigned char enable); |
| #endif |
| void enable_usboh3_clk(unsigned char enable); |
| #ifdef CONFIG_IMX_HAB |
| void hab_caam_clock_enable(unsigned char enable); |
| #endif |
| void mxs_set_lcdclk(uint32_t base_addr, uint32_t freq); |
| void enable_thermal_clk(void); |
| #endif |