1*85cc5be6SGyoungBo Min // SPDX-License-Identifier: GPL-2.0-only 2*85cc5be6SGyoungBo Min /* 3*85cc5be6SGyoungBo Min * Copyright (c) 2025 Samsung Electronics Co., Ltd. 4*85cc5be6SGyoungBo Min * https://www.samsung.com 5*85cc5be6SGyoungBo Min * Copyright (c) 2025 Axis Communications AB. 6*85cc5be6SGyoungBo Min * https://www.axis.com 7*85cc5be6SGyoungBo Min * 8*85cc5be6SGyoungBo Min * Common Clock Framework support for ARTPEC-9 SoC. 9*85cc5be6SGyoungBo Min */ 10*85cc5be6SGyoungBo Min 11*85cc5be6SGyoungBo Min #include <linux/clk-provider.h> 12*85cc5be6SGyoungBo Min #include <linux/platform_device.h> 13*85cc5be6SGyoungBo Min #include <dt-bindings/clock/axis,artpec9-clk.h> 14*85cc5be6SGyoungBo Min 15*85cc5be6SGyoungBo Min #include "clk.h" 16*85cc5be6SGyoungBo Min #include "clk-exynos-arm64.h" 17*85cc5be6SGyoungBo Min 18*85cc5be6SGyoungBo Min /* NOTE: Must be equal to the last clock ID increased by one */ 19*85cc5be6SGyoungBo Min #define CMU_CMU_NR_CLK (CLK_DOUT_CMU_VIO_AUDIO + 1) 20*85cc5be6SGyoungBo Min #define CMU_BUS_NR_CLK (CLK_MOUT_BUS_ACLK_USER + 1) 21*85cc5be6SGyoungBo Min #define CMU_CORE_NR_CLK (CLK_MOUT_CORE_ACLK_USER + 1) 22*85cc5be6SGyoungBo Min #define CMU_CPUCL_NR_CLK (CLK_GOUT_CPUCL_CSSYS_IPCLKPORT_PCLKDBG + 1) 23*85cc5be6SGyoungBo Min #define CMU_FSYS0_NR_CLK (CLK_GOUT_FSYS0_PWM_IPCLKPORT_I_PCLK_S0 + 1) 24*85cc5be6SGyoungBo Min #define CMU_FSYS1_NR_CLK (CLK_GOUT_FSYS1_XHB_USB_IPCLKPORT_CLK + 1) 25*85cc5be6SGyoungBo Min #define CMU_IMEM_NR_CLK (CLK_GOUT_IMEM_PCLK_TMU0_APBIF + 1) 26*85cc5be6SGyoungBo Min #define CMU_PERI_NR_CLK (CLK_GOUT_PERI_UART2_SCLK_UART + 1) 27*85cc5be6SGyoungBo Min 28*85cc5be6SGyoungBo Min /* Register Offset definitions for CMU_CMU (0x12c00000) */ 29*85cc5be6SGyoungBo Min #define PLL_LOCKTIME_PLL_AUDIO 0x0000 30*85cc5be6SGyoungBo Min #define PLL_LOCKTIME_PLL_SHARED0 0x0004 31*85cc5be6SGyoungBo Min #define PLL_LOCKTIME_PLL_SHARED1 0x0008 32*85cc5be6SGyoungBo Min #define PLL_CON0_PLL_AUDIO 0x0100 33*85cc5be6SGyoungBo Min #define PLL_CON0_PLL_SHARED0 0x0120 34*85cc5be6SGyoungBo Min #define PLL_CON0_PLL_SHARED1 0x0140 35*85cc5be6SGyoungBo Min #define CLK_CON_MUX_CLKCMU_BUS 0x1000 36*85cc5be6SGyoungBo Min #define CLK_CON_MUX_CLKCMU_CDC_CORE 0x1004 37*85cc5be6SGyoungBo Min #define CLK_CON_MUX_CLKCMU_CORE_MAIN 0x1008 38*85cc5be6SGyoungBo Min #define CLK_CON_MUX_CLKCMU_CPUCL_SWITCH 0x100c 39*85cc5be6SGyoungBo Min #define CLK_CON_MUX_CLKCMU_VIO_AUDIO 0x1010 40*85cc5be6SGyoungBo Min #define CLK_CON_MUX_CLKCMU_DLP_CORE 0x1014 41*85cc5be6SGyoungBo Min #define CLK_CON_MUX_CLKCMU_FSYS0_BUS 0x1018 42*85cc5be6SGyoungBo Min #define CLK_CON_MUX_CLKCMU_FSYS0_IP 0x101c 43*85cc5be6SGyoungBo Min #define CLK_CON_MUX_CLKCMU_FSYS1_BUS 0x1020 44*85cc5be6SGyoungBo Min #define CLK_CON_MUX_CLKCMU_FSYS1_SCAN0 0x1024 45*85cc5be6SGyoungBo Min #define CLK_CON_MUX_CLKCMU_FSYS1_SCAN1 0x1028 46*85cc5be6SGyoungBo Min #define CLK_CON_MUX_CLKCMU_GPU_2D 0x102c 47*85cc5be6SGyoungBo Min #define CLK_CON_MUX_CLKCMU_GPU_3D 0x1030 48*85cc5be6SGyoungBo Min #define CLK_CON_MUX_CLKCMU_IMEM_ACLK 0x1034 49*85cc5be6SGyoungBo Min #define CLK_CON_MUX_CLKCMU_IMEM_CA5 0x1038 50*85cc5be6SGyoungBo Min #define CLK_CON_MUX_CLKCMU_IMEM_JPEG 0x103c 51*85cc5be6SGyoungBo Min #define CLK_CON_MUX_CLKCMU_IMEM_SSS 0x1040 52*85cc5be6SGyoungBo Min #define CLK_CON_MUX_CLKCMU_IPA_CORE 0x1044 53*85cc5be6SGyoungBo Min #define CLK_CON_MUX_CLKCMU_MIF_BUSP 0x1048 54*85cc5be6SGyoungBo Min #define CLK_CON_MUX_CLKCMU_MIF_SWITCH 0x104c 55*85cc5be6SGyoungBo Min #define CLK_CON_MUX_CLKCMU_PERI_DISP 0x1050 56*85cc5be6SGyoungBo Min #define CLK_CON_MUX_CLKCMU_PERI_IP 0x1054 57*85cc5be6SGyoungBo Min #define CLK_CON_MUX_CLKCMU_RSP_CORE 0x1058 58*85cc5be6SGyoungBo Min #define CLK_CON_MUX_CLKCMU_TRFM 0x105c 59*85cc5be6SGyoungBo Min #define CLK_CON_MUX_CLKCMU_VIO_CORE 0x1060 60*85cc5be6SGyoungBo Min #define CLK_CON_MUX_CLKCMU_VIO_CORE_L 0x1064 61*85cc5be6SGyoungBo Min #define CLK_CON_MUX_CLKCMU_VIP0 0x1068 62*85cc5be6SGyoungBo Min #define CLK_CON_MUX_CLKCMU_VIP1 0x106c 63*85cc5be6SGyoungBo Min #define CLK_CON_MUX_CLKCMU_VPP_CORE 0x1070 64*85cc5be6SGyoungBo Min #define CLK_CON_DIV_CLKCMU_ADD 0x1800 65*85cc5be6SGyoungBo Min #define CLK_CON_DIV_CLKCMU_BUS 0x1804 66*85cc5be6SGyoungBo Min #define CLK_CON_DIV_CLKCMU_CDC_CORE 0x1808 67*85cc5be6SGyoungBo Min #define CLK_CON_DIV_CLKCMU_CORE_MAIN 0x180c 68*85cc5be6SGyoungBo Min #define CLK_CON_DIV_CLKCMU_CPUCL_SWITCH 0x1810 69*85cc5be6SGyoungBo Min #define CLK_CON_DIV_CLKCMU_DLP_CORE 0x1814 70*85cc5be6SGyoungBo Min #define CLK_CON_DIV_CLKCMU_FSYS0_BUS 0x1818 71*85cc5be6SGyoungBo Min #define CLK_CON_DIV_CLKCMU_FSYS0_IP 0x181c 72*85cc5be6SGyoungBo Min #define CLK_CON_DIV_CLKCMU_FSYS1_BUS 0x1820 73*85cc5be6SGyoungBo Min #define CLK_CON_DIV_CLKCMU_FSYS1_SCAN0 0x1824 74*85cc5be6SGyoungBo Min #define CLK_CON_DIV_CLKCMU_FSYS1_SCAN1 0x1828 75*85cc5be6SGyoungBo Min #define CLK_CON_DIV_CLKCMU_GPU_2D 0x182c 76*85cc5be6SGyoungBo Min #define CLK_CON_DIV_CLKCMU_GPU_3D 0x1830 77*85cc5be6SGyoungBo Min #define CLK_CON_DIV_CLKCMU_IMEM_ACLK 0x1834 78*85cc5be6SGyoungBo Min #define CLK_CON_DIV_CLKCMU_IMEM_CA5 0x1838 79*85cc5be6SGyoungBo Min #define CLK_CON_DIV_CLKCMU_IMEM_JPEG 0x183c 80*85cc5be6SGyoungBo Min #define CLK_CON_DIV_CLKCMU_IMEM_SSS 0x1840 81*85cc5be6SGyoungBo Min #define CLK_CON_DIV_CLKCMU_IPA_CORE 0x1844 82*85cc5be6SGyoungBo Min #define CLK_CON_DIV_CLKCMU_LCPU 0x1848 83*85cc5be6SGyoungBo Min #define CLK_CON_DIV_CLKCMU_MIF_BUSP 0x184c 84*85cc5be6SGyoungBo Min #define CLK_CON_DIV_CLKCMU_MIF_SWITCH 0x1850 85*85cc5be6SGyoungBo Min #define CLK_CON_DIV_CLKCMU_PERI_DISP 0x1854 86*85cc5be6SGyoungBo Min #define CLK_CON_DIV_CLKCMU_PERI_IP 0x1858 87*85cc5be6SGyoungBo Min #define CLK_CON_DIV_CLKCMU_RSP_CORE 0x185c 88*85cc5be6SGyoungBo Min #define CLK_CON_DIV_CLKCMU_TRFM 0x1860 89*85cc5be6SGyoungBo Min #define CLK_CON_DIV_CLKCMU_VIO_AUDIO 0x1864 90*85cc5be6SGyoungBo Min #define CLK_CON_DIV_CLKCMU_VIO_CORE 0x1868 91*85cc5be6SGyoungBo Min #define CLK_CON_DIV_CLKCMU_VIO_CORE_L 0x186c 92*85cc5be6SGyoungBo Min #define CLK_CON_DIV_CLKCMU_VIP0 0x1870 93*85cc5be6SGyoungBo Min #define CLK_CON_DIV_CLKCMU_VIP1 0x1874 94*85cc5be6SGyoungBo Min #define CLK_CON_DIV_CLKCMU_VPP_CORE 0x1878 95*85cc5be6SGyoungBo Min #define CLK_CON_DIV_PLL_SHARED0_DIV2 0x187c 96*85cc5be6SGyoungBo Min #define CLK_CON_DIV_PLL_SHARED0_DIV3 0x1880 97*85cc5be6SGyoungBo Min #define CLK_CON_DIV_PLL_SHARED0_DIV4 0x1884 98*85cc5be6SGyoungBo Min #define CLK_CON_DIV_PLL_SHARED1_DIV2 0x1888 99*85cc5be6SGyoungBo Min #define CLK_CON_DIV_PLL_SHARED1_DIV3 0x188c 100*85cc5be6SGyoungBo Min #define CLK_CON_DIV_PLL_SHARED1_DIV4 0x1890 101*85cc5be6SGyoungBo Min 102*85cc5be6SGyoungBo Min static const unsigned long cmu_cmu_clk_regs[] __initconst = { 103*85cc5be6SGyoungBo Min PLL_LOCKTIME_PLL_AUDIO, 104*85cc5be6SGyoungBo Min PLL_LOCKTIME_PLL_SHARED0, 105*85cc5be6SGyoungBo Min PLL_LOCKTIME_PLL_SHARED1, 106*85cc5be6SGyoungBo Min PLL_CON0_PLL_AUDIO, 107*85cc5be6SGyoungBo Min PLL_CON0_PLL_SHARED0, 108*85cc5be6SGyoungBo Min PLL_CON0_PLL_SHARED1, 109*85cc5be6SGyoungBo Min CLK_CON_MUX_CLKCMU_BUS, 110*85cc5be6SGyoungBo Min CLK_CON_MUX_CLKCMU_CDC_CORE, 111*85cc5be6SGyoungBo Min CLK_CON_MUX_CLKCMU_CORE_MAIN, 112*85cc5be6SGyoungBo Min CLK_CON_MUX_CLKCMU_CPUCL_SWITCH, 113*85cc5be6SGyoungBo Min CLK_CON_MUX_CLKCMU_DLP_CORE, 114*85cc5be6SGyoungBo Min CLK_CON_MUX_CLKCMU_FSYS0_BUS, 115*85cc5be6SGyoungBo Min CLK_CON_MUX_CLKCMU_FSYS0_IP, 116*85cc5be6SGyoungBo Min CLK_CON_MUX_CLKCMU_FSYS1_BUS, 117*85cc5be6SGyoungBo Min CLK_CON_MUX_CLKCMU_FSYS1_SCAN0, 118*85cc5be6SGyoungBo Min CLK_CON_MUX_CLKCMU_FSYS1_SCAN1, 119*85cc5be6SGyoungBo Min CLK_CON_MUX_CLKCMU_GPU_2D, 120*85cc5be6SGyoungBo Min CLK_CON_MUX_CLKCMU_GPU_3D, 121*85cc5be6SGyoungBo Min CLK_CON_MUX_CLKCMU_IMEM_ACLK, 122*85cc5be6SGyoungBo Min CLK_CON_MUX_CLKCMU_IMEM_CA5, 123*85cc5be6SGyoungBo Min CLK_CON_MUX_CLKCMU_IMEM_JPEG, 124*85cc5be6SGyoungBo Min CLK_CON_MUX_CLKCMU_IMEM_SSS, 125*85cc5be6SGyoungBo Min CLK_CON_MUX_CLKCMU_IPA_CORE, 126*85cc5be6SGyoungBo Min CLK_CON_MUX_CLKCMU_MIF_BUSP, 127*85cc5be6SGyoungBo Min CLK_CON_MUX_CLKCMU_MIF_SWITCH, 128*85cc5be6SGyoungBo Min CLK_CON_MUX_CLKCMU_PERI_DISP, 129*85cc5be6SGyoungBo Min CLK_CON_MUX_CLKCMU_PERI_IP, 130*85cc5be6SGyoungBo Min CLK_CON_MUX_CLKCMU_RSP_CORE, 131*85cc5be6SGyoungBo Min CLK_CON_MUX_CLKCMU_TRFM, 132*85cc5be6SGyoungBo Min CLK_CON_MUX_CLKCMU_VIO_CORE, 133*85cc5be6SGyoungBo Min CLK_CON_MUX_CLKCMU_VIO_CORE_L, 134*85cc5be6SGyoungBo Min CLK_CON_MUX_CLKCMU_VIP0, 135*85cc5be6SGyoungBo Min CLK_CON_MUX_CLKCMU_VIP1, 136*85cc5be6SGyoungBo Min CLK_CON_MUX_CLKCMU_VPP_CORE, 137*85cc5be6SGyoungBo Min CLK_CON_DIV_CLKCMU_ADD, 138*85cc5be6SGyoungBo Min CLK_CON_DIV_CLKCMU_BUS, 139*85cc5be6SGyoungBo Min CLK_CON_DIV_CLKCMU_CDC_CORE, 140*85cc5be6SGyoungBo Min CLK_CON_DIV_CLKCMU_CORE_MAIN, 141*85cc5be6SGyoungBo Min CLK_CON_DIV_CLKCMU_CPUCL_SWITCH, 142*85cc5be6SGyoungBo Min CLK_CON_DIV_CLKCMU_VIO_AUDIO, 143*85cc5be6SGyoungBo Min CLK_CON_DIV_CLKCMU_DLP_CORE, 144*85cc5be6SGyoungBo Min CLK_CON_DIV_CLKCMU_FSYS0_BUS, 145*85cc5be6SGyoungBo Min CLK_CON_DIV_CLKCMU_FSYS0_IP, 146*85cc5be6SGyoungBo Min CLK_CON_DIV_CLKCMU_FSYS1_BUS, 147*85cc5be6SGyoungBo Min CLK_CON_DIV_CLKCMU_FSYS1_SCAN0, 148*85cc5be6SGyoungBo Min CLK_CON_DIV_CLKCMU_FSYS1_SCAN1, 149*85cc5be6SGyoungBo Min CLK_CON_DIV_CLKCMU_GPU_2D, 150*85cc5be6SGyoungBo Min CLK_CON_DIV_CLKCMU_GPU_3D, 151*85cc5be6SGyoungBo Min CLK_CON_DIV_CLKCMU_IMEM_ACLK, 152*85cc5be6SGyoungBo Min CLK_CON_DIV_CLKCMU_IMEM_CA5, 153*85cc5be6SGyoungBo Min CLK_CON_DIV_CLKCMU_IMEM_JPEG, 154*85cc5be6SGyoungBo Min CLK_CON_DIV_CLKCMU_IMEM_SSS, 155*85cc5be6SGyoungBo Min CLK_CON_DIV_CLKCMU_IPA_CORE, 156*85cc5be6SGyoungBo Min CLK_CON_DIV_CLKCMU_LCPU, 157*85cc5be6SGyoungBo Min CLK_CON_DIV_CLKCMU_MIF_BUSP, 158*85cc5be6SGyoungBo Min CLK_CON_DIV_CLKCMU_MIF_SWITCH, 159*85cc5be6SGyoungBo Min CLK_CON_DIV_CLKCMU_PERI_DISP, 160*85cc5be6SGyoungBo Min CLK_CON_DIV_CLKCMU_PERI_IP, 161*85cc5be6SGyoungBo Min CLK_CON_DIV_CLKCMU_RSP_CORE, 162*85cc5be6SGyoungBo Min CLK_CON_DIV_CLKCMU_TRFM, 163*85cc5be6SGyoungBo Min CLK_CON_DIV_CLKCMU_VIO_AUDIO, 164*85cc5be6SGyoungBo Min CLK_CON_DIV_CLKCMU_VIO_CORE, 165*85cc5be6SGyoungBo Min CLK_CON_DIV_CLKCMU_VIO_CORE_L, 166*85cc5be6SGyoungBo Min CLK_CON_DIV_CLKCMU_VIP0, 167*85cc5be6SGyoungBo Min CLK_CON_DIV_CLKCMU_VIP1, 168*85cc5be6SGyoungBo Min CLK_CON_DIV_CLKCMU_VPP_CORE, 169*85cc5be6SGyoungBo Min CLK_CON_DIV_PLL_SHARED0_DIV2, 170*85cc5be6SGyoungBo Min CLK_CON_DIV_PLL_SHARED0_DIV3, 171*85cc5be6SGyoungBo Min CLK_CON_DIV_PLL_SHARED0_DIV4, 172*85cc5be6SGyoungBo Min CLK_CON_DIV_PLL_SHARED1_DIV2, 173*85cc5be6SGyoungBo Min CLK_CON_DIV_PLL_SHARED1_DIV3, 174*85cc5be6SGyoungBo Min CLK_CON_DIV_PLL_SHARED1_DIV4, 175*85cc5be6SGyoungBo Min }; 176*85cc5be6SGyoungBo Min 177*85cc5be6SGyoungBo Min static const struct samsung_pll_rate_table artpec9_pll_audio_rates[] __initconst = { 178*85cc5be6SGyoungBo Min PLL_A9FRACO_RATE(25 * MHZ, 589824000U, 94, 1, 3, 6238440), 179*85cc5be6SGyoungBo Min }; 180*85cc5be6SGyoungBo Min 181*85cc5be6SGyoungBo Min static const struct samsung_pll_clock cmu_cmu_pll_clks[] __initconst = { 182*85cc5be6SGyoungBo Min PLL(pll_a9fracm, CLK_FOUT_SHARED0_PLL, "fout_pll_shared0", "fin_pll", 183*85cc5be6SGyoungBo Min PLL_LOCKTIME_PLL_SHARED0, PLL_CON0_PLL_SHARED0, NULL), 184*85cc5be6SGyoungBo Min PLL(pll_a9fracm, CLK_FOUT_SHARED1_PLL, "fout_pll_shared1", "fin_pll", 185*85cc5be6SGyoungBo Min PLL_LOCKTIME_PLL_SHARED1, PLL_CON0_PLL_SHARED1, NULL), 186*85cc5be6SGyoungBo Min PLL(pll_a9fraco, CLK_FOUT_AUDIO_PLL, "fout_pll_audio", "fin_pll", 187*85cc5be6SGyoungBo Min PLL_LOCKTIME_PLL_AUDIO, PLL_CON0_PLL_AUDIO, artpec9_pll_audio_rates), 188*85cc5be6SGyoungBo Min }; 189*85cc5be6SGyoungBo Min 190*85cc5be6SGyoungBo Min PNAME(mout_clkcmu_bus_bus_p) = { "dout_pll_shared0_div2", "dout_pll_shared1_div2", 191*85cc5be6SGyoungBo Min "dout_pll_shared1_div3", "dout_pll_shared1_div4" }; 192*85cc5be6SGyoungBo Min PNAME(mout_clkcmu_cdc_core_p) = { "dout_pll_shared0_div2", "dout_pll_shared1_div3", 193*85cc5be6SGyoungBo Min "dout_pll_shared1_div2", "mout_clk_pll_fsys1" }; 194*85cc5be6SGyoungBo Min PNAME(mout_clkcmu_core_main_p) = { "dout_pll_shared0_div2", "dout_pll_shared1_div2", 195*85cc5be6SGyoungBo Min "dout_pll_shared1_div3", "dout_pll_shared1_div4" }; 196*85cc5be6SGyoungBo Min PNAME(mout_clkcmu_cpucl_switch_p) = { "dout_pll_shared0_div2", "dout_pll_shared1_div2", 197*85cc5be6SGyoungBo Min "dout_pll_shared0_div3", "dout_pll_shared1_div3" }; 198*85cc5be6SGyoungBo Min PNAME(mout_clkcmu_dlp_core_p) = { "dout_pll_shared1_div3", "dout_pll_shared0_div2", 199*85cc5be6SGyoungBo Min "dout_pll_shared1_div2", "mout_clk_pll_fsys1" }; 200*85cc5be6SGyoungBo Min PNAME(mout_clkcmu_fsys0_bus_p) = { "dout_pll_shared1_div3", "dout_pll_shared0_div2", 201*85cc5be6SGyoungBo Min "dout_pll_shared1_div4", "dout_pll_shared1_div2" }; 202*85cc5be6SGyoungBo Min PNAME(mout_clkcmu_fsys0_ip_p) = { "dout_pll_shared0_div2", "dout_pll_shared1_div3", 203*85cc5be6SGyoungBo Min "dout_pll_shared1_div2", "dout_pll_shared0_div3" }; 204*85cc5be6SGyoungBo Min PNAME(mout_clkcmu_fsys1_bus_p) = { "dout_pll_shared1_div3", "dout_pll_shared0_div2", 205*85cc5be6SGyoungBo Min "dout_pll_shared1_div2", "dout_pll_shared0_div4" }; 206*85cc5be6SGyoungBo Min PNAME(mout_clkcmu_fsys1_scan0_p) = { "dout_pll_shared0_div2", "dout_pll_shared1_div4" }; 207*85cc5be6SGyoungBo Min PNAME(mout_clkcmu_fsys1_scan1_p) = { "dout_pll_shared1_div3", "dout_pll_shared1_div4" }; 208*85cc5be6SGyoungBo Min PNAME(mout_clkcmu_gpu_3d_p) = { "dout_pll_shared1_div3", "dout_pll_shared0_div2", 209*85cc5be6SGyoungBo Min "dout_pll_shared1_div2", "mout_clk_pll_fsys1" }; 210*85cc5be6SGyoungBo Min PNAME(mout_clkcmu_gpu_2d_p) = { "dout_pll_shared1_div3", "dout_pll_shared0_div2", 211*85cc5be6SGyoungBo Min "dout_pll_shared1_div2", "mout_clk_pll_fsys1" }; 212*85cc5be6SGyoungBo Min PNAME(mout_clkcmu_imem_aclk_p) = { "dout_pll_shared1_div3", "dout_pll_shared0_div2", 213*85cc5be6SGyoungBo Min "dout_pll_shared1_div4", "dout_pll_shared1_div2" }; 214*85cc5be6SGyoungBo Min PNAME(mout_clkcmu_imem_ca5_p) = { "dout_pll_shared0_div2", "dout_pll_shared1_div2", 215*85cc5be6SGyoungBo Min "dout_pll_shared1_div3", "mout_clk_pll_shared1" }; 216*85cc5be6SGyoungBo Min PNAME(mout_clkcmu_imem_jpeg_p) = { "dout_pll_shared0_div2", "dout_pll_shared0_div3", 217*85cc5be6SGyoungBo Min "dout_pll_shared1_div2", "dout_pll_shared1_div3" }; 218*85cc5be6SGyoungBo Min PNAME(mout_clkcmu_imem_sss_p) = { "dout_pll_shared0_div2", "dout_pll_shared1_div2" }; 219*85cc5be6SGyoungBo Min PNAME(mout_clkcmu_ipa_core_p) = { "dout_pll_shared1_div3", "dout_pll_shared0_div2", 220*85cc5be6SGyoungBo Min "dout_pll_shared1_div2", "mout_clk_pll_fsys1" }; 221*85cc5be6SGyoungBo Min PNAME(mout_clkcmu_mif_switch_p) = { "fout_pll_shared1", "mout_clkcmu_pll_shared0", 222*85cc5be6SGyoungBo Min "dout_pll_shared0_div2", "dout_pll_shared0_div3" }; 223*85cc5be6SGyoungBo Min PNAME(mout_clkcmu_mif_busp_p) = { "dout_pll_shared1_div3", "dout_pll_shared1_div4", 224*85cc5be6SGyoungBo Min "dout_pll_shared0_div4", "dout_pll_shared0_div2" }; 225*85cc5be6SGyoungBo Min PNAME(mout_clkcmu_peri_disp_p) = { "dout_pll_shared1_div3", "dout_pll_shared0_div2", 226*85cc5be6SGyoungBo Min "dout_pll_shared1_div4", "dout_pll_shared1_div2" }; 227*85cc5be6SGyoungBo Min PNAME(mout_clkcmu_peri_ip_p) = { "fout_pll_fsys1", "dout_pll_shared1_2", 228*85cc5be6SGyoungBo Min "dout_pll_shared1_div4", "dout_pll_shared0_div2" }; 229*85cc5be6SGyoungBo Min PNAME(mout_clkcmu_rsp_core_p) = { "dout_pll_shared1_div3", "dout_pll_shared0_div2", 230*85cc5be6SGyoungBo Min "dout_pll_shared1_div2", "mout_clk_pll_fsys1" }; 231*85cc5be6SGyoungBo Min PNAME(mout_clkcmu_trfm_p) = { "dout_pll_shared1_div3", "dout_pll_shared0_div2", 232*85cc5be6SGyoungBo Min "dout_pll_shared1_div2", "mout_clk_pll_fsys1" }; 233*85cc5be6SGyoungBo Min PNAME(mout_clkcmu_vio_core_l_p) = { "dout_pll_shared0_div2", "dout_pll_shared1_div3", 234*85cc5be6SGyoungBo Min "dout_pll_shared1_div2", "mout_clk_pll_fsys1" }; 235*85cc5be6SGyoungBo Min PNAME(mout_clkcmu_vio_core_p) = { "fout_pll_fsys1", "dout_pll_shared0_div2", 236*85cc5be6SGyoungBo Min "dout_pll_shared1_div3", "dout_pll_shared1_div2" }; 237*85cc5be6SGyoungBo Min PNAME(mout_clkcmu_vio_audio_p) = { "fout_pll_audio", "mout_clkcmu_pll_audio" }; 238*85cc5be6SGyoungBo Min PNAME(mout_clkcmu_vip0_p) = { "dout_pll_shared1_div3", "dout_pll_shared0_div2", 239*85cc5be6SGyoungBo Min "dout_pll_shared1_div2", "mout_clk_pll_fsys1" }; 240*85cc5be6SGyoungBo Min PNAME(mout_clkcmu_vip1_p) = { "dout_pll_shared1_div3", "dout_pll_shared0_div2", 241*85cc5be6SGyoungBo Min "dout_pll_shared1_div2", "mout_clk_pll_fsys1" }; 242*85cc5be6SGyoungBo Min PNAME(mout_clkcmu_vpp_core_p) = { "dout_pll_shared1_div3", "dout_pll_shared0_div2", 243*85cc5be6SGyoungBo Min "dout_pll_shared1_div2", "mout_clk_pll_fsys1" }; 244*85cc5be6SGyoungBo Min PNAME(mout_clkcmu_pll_shared0_p) = { "fin_pll", "fout_pll_shared0" }; 245*85cc5be6SGyoungBo Min PNAME(mout_clkcmu_pll_shared1_p) = { "fin_pll", "fout_pll_shared1" }; 246*85cc5be6SGyoungBo Min PNAME(mout_clkcmu_pll_audio_p) = { "fin_pll", "fout_pll_audio" }; 247*85cc5be6SGyoungBo Min 248*85cc5be6SGyoungBo Min static const struct samsung_mux_clock cmu_cmu_mux_clks[] __initconst = { 249*85cc5be6SGyoungBo Min MUX(0, "mout_clkcmu_pll_shared0", mout_clkcmu_pll_shared0_p, PLL_CON0_PLL_SHARED0, 4, 1), 250*85cc5be6SGyoungBo Min MUX(0, "mout_clkcmu_pll_shared1", mout_clkcmu_pll_shared1_p, PLL_CON0_PLL_SHARED1, 4, 1), 251*85cc5be6SGyoungBo Min MUX(0, "mout_clkcmu_pll_audio", mout_clkcmu_pll_audio_p, PLL_CON0_PLL_AUDIO, 4, 1), 252*85cc5be6SGyoungBo Min MUX(0, "mout_clkcmu_bus_bus", mout_clkcmu_bus_bus_p, CLK_CON_MUX_CLKCMU_BUS, 0, 2), 253*85cc5be6SGyoungBo Min nMUX(0, "mout_clkcmu_cdc_core", mout_clkcmu_cdc_core_p, CLK_CON_MUX_CLKCMU_CDC_CORE, 0, 2), 254*85cc5be6SGyoungBo Min MUX(0, "mout_clkcmu_core_main", mout_clkcmu_core_main_p, 255*85cc5be6SGyoungBo Min CLK_CON_MUX_CLKCMU_CORE_MAIN, 0, 2), 256*85cc5be6SGyoungBo Min MUX(0, "mout_clkcmu_cpucl_switch", mout_clkcmu_cpucl_switch_p, 257*85cc5be6SGyoungBo Min CLK_CON_MUX_CLKCMU_CPUCL_SWITCH, 0, 2), 258*85cc5be6SGyoungBo Min nMUX(0, "mout_clkcmu_dlp_core", mout_clkcmu_dlp_core_p, CLK_CON_MUX_CLKCMU_DLP_CORE, 0, 2), 259*85cc5be6SGyoungBo Min MUX(0, "mout_clkcmu_fsys0_bus", mout_clkcmu_fsys0_bus_p, 260*85cc5be6SGyoungBo Min CLK_CON_MUX_CLKCMU_FSYS0_BUS, 0, 2), 261*85cc5be6SGyoungBo Min MUX(0, "mout_clkcmu_fsys0_ip", mout_clkcmu_fsys0_ip_p, CLK_CON_MUX_CLKCMU_FSYS0_IP, 0, 2), 262*85cc5be6SGyoungBo Min MUX(0, "mout_clkcmu_fsys1_bus", mout_clkcmu_fsys1_bus_p, 263*85cc5be6SGyoungBo Min CLK_CON_MUX_CLKCMU_FSYS1_BUS, 0, 2), 264*85cc5be6SGyoungBo Min MUX(0, "mout_clkcmu_fsys1_scan0", mout_clkcmu_fsys1_scan0_p, 265*85cc5be6SGyoungBo Min CLK_CON_MUX_CLKCMU_FSYS1_SCAN0, 0, 1), 266*85cc5be6SGyoungBo Min MUX(0, "mout_clkcmu_fsys1_scan1", mout_clkcmu_fsys1_scan1_p, 267*85cc5be6SGyoungBo Min CLK_CON_MUX_CLKCMU_FSYS1_SCAN1, 0, 1), 268*85cc5be6SGyoungBo Min MUX(0, "mout_clkcmu_gpu_2d", mout_clkcmu_gpu_2d_p, CLK_CON_MUX_CLKCMU_GPU_2D, 0, 2), 269*85cc5be6SGyoungBo Min MUX(0, "mout_clkcmu_gpu_3d", mout_clkcmu_gpu_3d_p, CLK_CON_MUX_CLKCMU_GPU_3D, 0, 2), 270*85cc5be6SGyoungBo Min MUX(0, "mout_clkcmu_imem_aclk", mout_clkcmu_imem_aclk_p, 271*85cc5be6SGyoungBo Min CLK_CON_MUX_CLKCMU_IMEM_ACLK, 0, 2), 272*85cc5be6SGyoungBo Min MUX(0, "mout_clkcmu_imem_ca5", mout_clkcmu_imem_ca5_p, CLK_CON_MUX_CLKCMU_IMEM_CA5, 0, 2), 273*85cc5be6SGyoungBo Min MUX(0, "mout_clkcmu_imem_jpeg", mout_clkcmu_imem_jpeg_p, 274*85cc5be6SGyoungBo Min CLK_CON_MUX_CLKCMU_IMEM_JPEG, 0, 2), 275*85cc5be6SGyoungBo Min MUX(0, "mout_clkcmu_imem_sss", mout_clkcmu_imem_sss_p, CLK_CON_MUX_CLKCMU_IMEM_SSS, 0, 1), 276*85cc5be6SGyoungBo Min MUX(0, "mout_clkcmu_ipa_core", mout_clkcmu_ipa_core_p, CLK_CON_MUX_CLKCMU_IPA_CORE, 0, 2), 277*85cc5be6SGyoungBo Min MUX(0, "mout_clkcmu_mif_busp", mout_clkcmu_mif_busp_p, CLK_CON_MUX_CLKCMU_MIF_BUSP, 0, 2), 278*85cc5be6SGyoungBo Min MUX(0, "mout_clkcmu_mif_switch", mout_clkcmu_mif_switch_p, 279*85cc5be6SGyoungBo Min CLK_CON_MUX_CLKCMU_MIF_SWITCH, 0, 2), 280*85cc5be6SGyoungBo Min MUX(0, "mout_clkcmu_peri_disp", mout_clkcmu_peri_disp_p, 281*85cc5be6SGyoungBo Min CLK_CON_MUX_CLKCMU_PERI_DISP, 0, 2), 282*85cc5be6SGyoungBo Min MUX(0, "mout_clkcmu_peri_ip", mout_clkcmu_peri_ip_p, CLK_CON_MUX_CLKCMU_PERI_IP, 0, 2), 283*85cc5be6SGyoungBo Min MUX(0, "mout_clkcmu_rsp_core", mout_clkcmu_rsp_core_p, CLK_CON_MUX_CLKCMU_RSP_CORE, 0, 2), 284*85cc5be6SGyoungBo Min MUX(0, "mout_clkcmu_trfm", mout_clkcmu_trfm_p, CLK_CON_MUX_CLKCMU_TRFM, 0, 2), 285*85cc5be6SGyoungBo Min MUX(0, "mout_clkcmu_vio_core", mout_clkcmu_vio_core_p, CLK_CON_MUX_CLKCMU_VIO_CORE, 0, 2), 286*85cc5be6SGyoungBo Min MUX(0, "mout_clkcmu_vio_core_l", mout_clkcmu_vio_core_l_p, 287*85cc5be6SGyoungBo Min CLK_CON_MUX_CLKCMU_VIO_CORE_L, 0, 2), 288*85cc5be6SGyoungBo Min MUX(0, "mout_clkcmu_vio_audio", mout_clkcmu_vio_audio_p, 289*85cc5be6SGyoungBo Min CLK_CON_MUX_CLKCMU_VIO_AUDIO, 0, 1), 290*85cc5be6SGyoungBo Min MUX(0, "mout_clkcmu_vip0", mout_clkcmu_vip0_p, CLK_CON_MUX_CLKCMU_VIP0, 0, 2), 291*85cc5be6SGyoungBo Min MUX(0, "mout_clkcmu_vip1", mout_clkcmu_vip1_p, CLK_CON_MUX_CLKCMU_VIP1, 0, 2), 292*85cc5be6SGyoungBo Min MUX(0, "mout_clkcmu_vpp_core", mout_clkcmu_vpp_core_p, CLK_CON_MUX_CLKCMU_VPP_CORE, 0, 2), 293*85cc5be6SGyoungBo Min }; 294*85cc5be6SGyoungBo Min 295*85cc5be6SGyoungBo Min static const struct samsung_div_clock cmu_cmu_div_clks[] __initconst = { 296*85cc5be6SGyoungBo Min DIV(CLK_DOUT_CMU_ADD, "dout_clkcmu_add", "gate_clkcmu_add", CLK_CON_DIV_CLKCMU_ADD, 0, 8), 297*85cc5be6SGyoungBo Min DIV(CLK_DOUT_CMU_BUS, "dout_clkcmu_bus", 298*85cc5be6SGyoungBo Min "gate_clkcmu_bus_bus", CLK_CON_DIV_CLKCMU_BUS, 0, 4), 299*85cc5be6SGyoungBo Min DIV_F(CLK_DOUT_CMU_CDC_CORE, "dout_clkcmu_cdc_core", 300*85cc5be6SGyoungBo Min "gate_clkcmu_cdc_core", CLK_CON_DIV_CLKCMU_CDC_CORE, 0, 4, CLK_SET_RATE_PARENT, 0), 301*85cc5be6SGyoungBo Min DIV(CLK_DOUT_CMU_CORE_MAIN, "dout_clkcmu_core_main", 302*85cc5be6SGyoungBo Min "gate_clkcmu_core_main", CLK_CON_DIV_CLKCMU_CORE_MAIN, 0, 4), 303*85cc5be6SGyoungBo Min DIV(CLK_DOUT_CMU_CPUCL_SWITCH, "dout_clkcmu_cpucl_switch", 304*85cc5be6SGyoungBo Min "gate_clkcmu_cpucl_switch", CLK_CON_DIV_CLKCMU_CPUCL_SWITCH, 0, 3), 305*85cc5be6SGyoungBo Min DIV_F(CLK_DOUT_CMU_DLP_CORE, "dout_clkcmu_dlp_core", 306*85cc5be6SGyoungBo Min "gate_clkcmu_dlp_core", CLK_CON_DIV_CLKCMU_DLP_CORE, 0, 4, CLK_SET_RATE_PARENT, 0), 307*85cc5be6SGyoungBo Min DIV(CLK_DOUT_CMU_FSYS0_BUS, "dout_clkcmu_fsys0_bus", 308*85cc5be6SGyoungBo Min "gate_clkcmu_fsys0_bus", CLK_CON_DIV_CLKCMU_FSYS0_BUS, 0, 4), 309*85cc5be6SGyoungBo Min DIV(CLK_DOUT_CMU_FSYS0_IP, "dout_clkcmu_fsys0_ip", 310*85cc5be6SGyoungBo Min "gate_clkcmu_fsys0_ip", CLK_CON_DIV_CLKCMU_FSYS0_IP, 0, 9), 311*85cc5be6SGyoungBo Min DIV(CLK_DOUT_CMU_FSYS1_BUS, "dout_clkcmu_fsys1_bus", 312*85cc5be6SGyoungBo Min "gate_clkcmu_fsys1_bus", CLK_CON_DIV_CLKCMU_FSYS1_BUS, 0, 4), 313*85cc5be6SGyoungBo Min DIV(CLK_DOUT_CMU_FSYS1_SCAN0, "dout_clkcmu_fsys1_scan0", 314*85cc5be6SGyoungBo Min "gate_clkcmu_fsys1_scan0", CLK_CON_DIV_CLKCMU_FSYS1_SCAN0, 0, 4), 315*85cc5be6SGyoungBo Min DIV(CLK_DOUT_CMU_FSYS1_SCAN1, "dout_clkcmu_fsys1_scan1", 316*85cc5be6SGyoungBo Min "gate_clkcmu_fsys1_scan1", CLK_CON_DIV_CLKCMU_FSYS1_SCAN1, 0, 4), 317*85cc5be6SGyoungBo Min DIV(CLK_DOUT_CMU_GPU_2D, "dout_clkcmu_gpu_2d", 318*85cc5be6SGyoungBo Min "gate_clkcmu_gpu_2d", CLK_CON_DIV_CLKCMU_GPU_2D, 0, 4), 319*85cc5be6SGyoungBo Min DIV(CLK_DOUT_CMU_GPU_3D, "dout_clkcmu_gpu_3d", 320*85cc5be6SGyoungBo Min "gate_clkcmu_gpu_3d", CLK_CON_DIV_CLKCMU_GPU_3D, 0, 4), 321*85cc5be6SGyoungBo Min DIV(CLK_DOUT_CMU_IMEM_ACLK, "dout_clkcmu_imem_aclk", 322*85cc5be6SGyoungBo Min "gate_clkcmu_imem_aclk", CLK_CON_DIV_CLKCMU_IMEM_ACLK, 0, 4), 323*85cc5be6SGyoungBo Min DIV(CLK_DOUT_CMU_IMEM_CA5, "dout_clkcmu_imem_ca5", 324*85cc5be6SGyoungBo Min "gate_clkcmu_imem_ca5", CLK_CON_DIV_CLKCMU_IMEM_CA5, 0, 4), 325*85cc5be6SGyoungBo Min DIV(CLK_DOUT_CMU_IMEM_JPEG, "dout_clkcmu_imem_jpeg", 326*85cc5be6SGyoungBo Min "gate_clkcmu_imem_jpeg", CLK_CON_DIV_CLKCMU_IMEM_JPEG, 0, 4), 327*85cc5be6SGyoungBo Min DIV(CLK_DOUT_CMU_IMEM_SSS, "dout_clkcmu_imem_sss", 328*85cc5be6SGyoungBo Min "gate_clkcmu_imem_sss", CLK_CON_DIV_CLKCMU_IMEM_SSS, 0, 4), 329*85cc5be6SGyoungBo Min DIV(CLK_DOUT_CMU_IPA_CORE, "dout_clkcmu_ipa_core", 330*85cc5be6SGyoungBo Min "gate_clkcmu_ipa_core", CLK_CON_DIV_CLKCMU_IPA_CORE, 0, 4), 331*85cc5be6SGyoungBo Min DIV(CLK_DOUT_CMU_LCPU, "dout_clkcmu_lcpu", 332*85cc5be6SGyoungBo Min "gate_clkcmu_lcpu", CLK_CON_DIV_CLKCMU_LCPU, 0, 4), 333*85cc5be6SGyoungBo Min DIV(CLK_DOUT_CMU_MIF_BUSP, "dout_clkcmu_mif_busp", 334*85cc5be6SGyoungBo Min "gate_clkcmu_mif_busp", CLK_CON_DIV_CLKCMU_MIF_BUSP, 0, 3), 335*85cc5be6SGyoungBo Min DIV(CLK_DOUT_CMU_MIF_SWITCH, "dout_clkcmu_mif_switch", 336*85cc5be6SGyoungBo Min "gate_clkcmu_mif_switch", CLK_CON_DIV_CLKCMU_MIF_SWITCH, 0, 4), 337*85cc5be6SGyoungBo Min DIV(CLK_DOUT_CMU_PERI_DISP, "dout_clkcmu_peri_disp", 338*85cc5be6SGyoungBo Min "gate_clkcmu_peri_disp", CLK_CON_DIV_CLKCMU_PERI_DISP, 0, 4), 339*85cc5be6SGyoungBo Min DIV(CLK_DOUT_CMU_PERI_IP, "dout_clkcmu_peri_ip", 340*85cc5be6SGyoungBo Min "gate_clkcmu_peri_ip", CLK_CON_DIV_CLKCMU_PERI_IP, 0, 4), 341*85cc5be6SGyoungBo Min DIV(CLK_DOUT_CMU_RSP_CORE, "dout_clkcmu_rsp_core", 342*85cc5be6SGyoungBo Min "gate_clkcmu_rsp_core", CLK_CON_DIV_CLKCMU_RSP_CORE, 0, 4), 343*85cc5be6SGyoungBo Min DIV(CLK_DOUT_CMU_TRFM, "dout_clkcmu_trfm", 344*85cc5be6SGyoungBo Min "gate_clkcmu_trfm", CLK_CON_DIV_CLKCMU_TRFM, 0, 4), 345*85cc5be6SGyoungBo Min DIV(CLK_DOUT_CMU_VIO_CORE, "dout_clkcmu_vio_core", 346*85cc5be6SGyoungBo Min "gate_clkcmu_vio_core", CLK_CON_DIV_CLKCMU_VIO_CORE, 0, 4), 347*85cc5be6SGyoungBo Min DIV(CLK_DOUT_CMU_VIO_CORE_L, "dout_clkcmu_vio_core_l", 348*85cc5be6SGyoungBo Min "gate_clkcmu_vio_core_l", CLK_CON_DIV_CLKCMU_VIO_CORE_L, 0, 4), 349*85cc5be6SGyoungBo Min DIV(CLK_DOUT_CMU_VIO_AUDIO, "dout_clkcmu_vio_audio", 350*85cc5be6SGyoungBo Min "gate_clkcmu_vio_audio", CLK_CON_DIV_CLKCMU_VIO_AUDIO, 0, 4), 351*85cc5be6SGyoungBo Min DIV(CLK_DOUT_CMU_VIP0, "dout_clkcmu_vip0", 352*85cc5be6SGyoungBo Min "gate_clkcmu_vip0", CLK_CON_DIV_CLKCMU_VIP0, 0, 4), 353*85cc5be6SGyoungBo Min DIV(CLK_DOUT_CMU_VIP1, "dout_clkcmu_vip1", 354*85cc5be6SGyoungBo Min "gate_clkcmu_vip1", CLK_CON_DIV_CLKCMU_VIP1, 0, 4), 355*85cc5be6SGyoungBo Min DIV(CLK_DOUT_CMU_VPP_CORE, "dout_clkcmu_vpp_core", 356*85cc5be6SGyoungBo Min "gate_clkcmu_vpp_core", CLK_CON_DIV_CLKCMU_VPP_CORE, 0, 4), 357*85cc5be6SGyoungBo Min DIV(CLK_DOUT_SHARED0_DIV2, "dout_pll_shared0_div2", 358*85cc5be6SGyoungBo Min "mout_clkcmu_pll_shared0", CLK_CON_DIV_PLL_SHARED0_DIV2, 0, 1), 359*85cc5be6SGyoungBo Min DIV(CLK_DOUT_SHARED0_DIV3, "dout_pll_shared0_div3", 360*85cc5be6SGyoungBo Min "mout_clkcmu_pll_shared0", CLK_CON_DIV_PLL_SHARED0_DIV3, 0, 2), 361*85cc5be6SGyoungBo Min DIV(CLK_DOUT_SHARED0_DIV4, "dout_pll_shared0_div4", 362*85cc5be6SGyoungBo Min "dout_pll_shared0_div2", CLK_CON_DIV_PLL_SHARED0_DIV4, 0, 1), 363*85cc5be6SGyoungBo Min DIV(CLK_DOUT_SHARED1_DIV2, "dout_pll_shared1_div2", 364*85cc5be6SGyoungBo Min "mout_clkcmu_pll_shared1", CLK_CON_DIV_PLL_SHARED1_DIV2, 0, 1), 365*85cc5be6SGyoungBo Min DIV(CLK_DOUT_SHARED1_DIV3, "dout_pll_shared1_div3", 366*85cc5be6SGyoungBo Min "mout_clkcmu_pll_shared1", CLK_CON_DIV_PLL_SHARED1_DIV3, 0, 2), 367*85cc5be6SGyoungBo Min DIV(CLK_DOUT_SHARED1_DIV4, "dout_pll_shared1_div4", 368*85cc5be6SGyoungBo Min "dout_pll_shared1_div2", CLK_CON_DIV_PLL_SHARED1_DIV4, 0, 1), 369*85cc5be6SGyoungBo Min }; 370*85cc5be6SGyoungBo Min 371*85cc5be6SGyoungBo Min static const struct samsung_cmu_info cmu_cmu_info __initconst = { 372*85cc5be6SGyoungBo Min .pll_clks = cmu_cmu_pll_clks, 373*85cc5be6SGyoungBo Min .nr_pll_clks = ARRAY_SIZE(cmu_cmu_pll_clks), 374*85cc5be6SGyoungBo Min .mux_clks = cmu_cmu_mux_clks, 375*85cc5be6SGyoungBo Min .nr_mux_clks = ARRAY_SIZE(cmu_cmu_mux_clks), 376*85cc5be6SGyoungBo Min .div_clks = cmu_cmu_div_clks, 377*85cc5be6SGyoungBo Min .nr_div_clks = ARRAY_SIZE(cmu_cmu_div_clks), 378*85cc5be6SGyoungBo Min .nr_clk_ids = CMU_CMU_NR_CLK, 379*85cc5be6SGyoungBo Min .clk_regs = cmu_cmu_clk_regs, 380*85cc5be6SGyoungBo Min .nr_clk_regs = ARRAY_SIZE(cmu_cmu_clk_regs), 381*85cc5be6SGyoungBo Min }; 382*85cc5be6SGyoungBo Min 383*85cc5be6SGyoungBo Min /* Register Offset definitions for CMU_BUS (0x13410000) */ 384*85cc5be6SGyoungBo Min #define PLL_CON0_MUX_CLK_BUS_ACLK_USER 0x0100 385*85cc5be6SGyoungBo Min 386*85cc5be6SGyoungBo Min static const unsigned long cmu_bus_clk_regs[] __initconst = { 387*85cc5be6SGyoungBo Min PLL_CON0_MUX_CLK_BUS_ACLK_USER, 388*85cc5be6SGyoungBo Min }; 389*85cc5be6SGyoungBo Min 390*85cc5be6SGyoungBo Min PNAME(mout_clk_bus_aclk_user_p) = {"fin_pll", "dout_clkcmu_bus_bus",}; 391*85cc5be6SGyoungBo Min 392*85cc5be6SGyoungBo Min static const struct samsung_mux_clock cmu_bus_mux_clks[] __initconst = { 393*85cc5be6SGyoungBo Min MUX(CLK_MOUT_BUS_ACLK_USER, "mout_clk_bus_aclk_user", mout_clk_bus_aclk_user_p, 394*85cc5be6SGyoungBo Min PLL_CON0_MUX_CLK_BUS_ACLK_USER, 4, 1), 395*85cc5be6SGyoungBo Min }; 396*85cc5be6SGyoungBo Min 397*85cc5be6SGyoungBo Min static const struct samsung_cmu_info cmu_bus_info __initconst = { 398*85cc5be6SGyoungBo Min .mux_clks = cmu_bus_mux_clks, 399*85cc5be6SGyoungBo Min .nr_mux_clks = ARRAY_SIZE(cmu_bus_mux_clks), 400*85cc5be6SGyoungBo Min .nr_clk_ids = CMU_BUS_NR_CLK, 401*85cc5be6SGyoungBo Min .clk_regs = cmu_bus_clk_regs, 402*85cc5be6SGyoungBo Min .nr_clk_regs = ARRAY_SIZE(cmu_bus_clk_regs), 403*85cc5be6SGyoungBo Min }; 404*85cc5be6SGyoungBo Min 405*85cc5be6SGyoungBo Min /* Register Offset definitions for CMU_CORE (0x12c10000) */ 406*85cc5be6SGyoungBo Min #define PLL_CON0_MUX_CLK_CORE_ACLK_USER 0x0100 407*85cc5be6SGyoungBo Min 408*85cc5be6SGyoungBo Min static const unsigned long cmu_core_clk_regs[] __initconst = { 409*85cc5be6SGyoungBo Min PLL_CON0_MUX_CLK_CORE_ACLK_USER, 410*85cc5be6SGyoungBo Min }; 411*85cc5be6SGyoungBo Min 412*85cc5be6SGyoungBo Min PNAME(mout_clk_core_aclk_user_p) = {"fin_pll", "dout_clkcmu_core_main",}; 413*85cc5be6SGyoungBo Min 414*85cc5be6SGyoungBo Min static const struct samsung_mux_clock cmu_core_mux_clks[] __initconst = { 415*85cc5be6SGyoungBo Min MUX(CLK_MOUT_CORE_ACLK_USER, "mout_clk_core_aclk_user", mout_clk_core_aclk_user_p, 416*85cc5be6SGyoungBo Min PLL_CON0_MUX_CLK_CORE_ACLK_USER, 4, 1), 417*85cc5be6SGyoungBo Min }; 418*85cc5be6SGyoungBo Min 419*85cc5be6SGyoungBo Min static const struct samsung_cmu_info cmu_core_info __initconst = { 420*85cc5be6SGyoungBo Min .mux_clks = cmu_core_mux_clks, 421*85cc5be6SGyoungBo Min .nr_mux_clks = ARRAY_SIZE(cmu_core_mux_clks), 422*85cc5be6SGyoungBo Min .nr_clk_ids = CMU_CORE_NR_CLK, 423*85cc5be6SGyoungBo Min .clk_regs = cmu_core_clk_regs, 424*85cc5be6SGyoungBo Min .nr_clk_regs = ARRAY_SIZE(cmu_core_clk_regs), 425*85cc5be6SGyoungBo Min }; 426*85cc5be6SGyoungBo Min 427*85cc5be6SGyoungBo Min /* Register Offset definitions for CMU_CPUCL (0x12810000) */ 428*85cc5be6SGyoungBo Min #define PLL_LOCKTIME_PLL0_CPUCL 0x0000 429*85cc5be6SGyoungBo Min #define PLL_LOCKTIME_PLL1_CPUCL 0x0008 430*85cc5be6SGyoungBo Min #define PLL_CON0_MUX_CLKCMU_CPUCL_SWITCH_SCU_USER 0x0100 431*85cc5be6SGyoungBo Min #define PLL_CON0_MUX_CLKCMU_CPUCL_SWITCH_USER 0x0120 432*85cc5be6SGyoungBo Min #define PLL_CON0_PLL0_CPUCL 0x0140 433*85cc5be6SGyoungBo Min #define PLL_CON0_PLL1_CPUCL 0x0160 434*85cc5be6SGyoungBo Min #define CLK_CON_MUX_CLK_CPUCL_PLL 0x1000 435*85cc5be6SGyoungBo Min #define CLK_CON_MUX_CLK_CPUCL_PLL_SCU 0x1004 436*85cc5be6SGyoungBo Min #define CLK_CON_DIV_CLK_CPUCL_CLUSTER_PERIPHCLK 0x1800 437*85cc5be6SGyoungBo Min #define CLK_CON_DIV_CLK_CPUCL_CLUSTER_GICCLK 0x1804 438*85cc5be6SGyoungBo Min #define CLK_CON_DIV_CLK_CPUCL_CLUSTER_PCLK 0x1808 439*85cc5be6SGyoungBo Min #define CLK_CON_DIV_CLK_CPUCL_CMUREF 0x180c 440*85cc5be6SGyoungBo Min #define CLK_CON_DIV_CLK_CPUCL_CPU 0x1810 441*85cc5be6SGyoungBo Min #define CLK_CON_DIV_CLK_CPUCL_CLUSTER_ATCLK 0x1818 442*85cc5be6SGyoungBo Min #define CLK_CON_DIV_CLK_CPUCL_CLUSTER_SCU 0x181c 443*85cc5be6SGyoungBo Min #define CLK_CON_DIV_CLK_CPUCL_DBG 0x1820 444*85cc5be6SGyoungBo Min #define CLK_CON_GAT_CLK_CLUSTER_CPU 0x2008 445*85cc5be6SGyoungBo Min #define CLK_CON_GAT_CLK_CPUCL_SHORTSTOP 0x200c 446*85cc5be6SGyoungBo Min #define CSSYS_IPCLKPORT_ATCLK 0x2070 447*85cc5be6SGyoungBo Min #define CSSYS_IPCLKPORT_PCLKDBG 0x2074 448*85cc5be6SGyoungBo Min #define DMYQCH_CON_CSSYS_QCH 0x3000 449*85cc5be6SGyoungBo Min #define DMYQCH_CON_CLUSTER_QCH_CORECLK0 0x3104 450*85cc5be6SGyoungBo Min #define DMYQCH_CON_CLUSTER_QCH_CORECLK1 0x3108 451*85cc5be6SGyoungBo Min #define DMYQCH_CON_CLUSTER_QCH_CORECLK2 0x310c 452*85cc5be6SGyoungBo Min #define DMYQCH_CON_CLUSTER_QCH_CORECLK3 0x3110 453*85cc5be6SGyoungBo Min #define DMYQCH_CON_CLUSTER_QCH_CORECLK4 0x3114 454*85cc5be6SGyoungBo Min #define DMYQCH_CON_CLUSTER_QCH_CORECLK5 0x3118 455*85cc5be6SGyoungBo Min #define DMYQCH_CON_CLUSTER_QCH_PERIPHCLK 0x311c 456*85cc5be6SGyoungBo Min 457*85cc5be6SGyoungBo Min static const unsigned long cmu_cpucl_clk_regs[] __initconst = { 458*85cc5be6SGyoungBo Min PLL_LOCKTIME_PLL0_CPUCL, 459*85cc5be6SGyoungBo Min PLL_LOCKTIME_PLL1_CPUCL, 460*85cc5be6SGyoungBo Min PLL_CON0_MUX_CLKCMU_CPUCL_SWITCH_SCU_USER, 461*85cc5be6SGyoungBo Min PLL_CON0_MUX_CLKCMU_CPUCL_SWITCH_USER, 462*85cc5be6SGyoungBo Min PLL_CON0_PLL0_CPUCL, 463*85cc5be6SGyoungBo Min PLL_CON0_PLL1_CPUCL, 464*85cc5be6SGyoungBo Min CLK_CON_MUX_CLK_CPUCL_PLL, 465*85cc5be6SGyoungBo Min CLK_CON_MUX_CLK_CPUCL_PLL_SCU, 466*85cc5be6SGyoungBo Min CLK_CON_DIV_CLK_CPUCL_CLUSTER_PERIPHCLK, 467*85cc5be6SGyoungBo Min CLK_CON_DIV_CLK_CPUCL_CLUSTER_GICCLK, 468*85cc5be6SGyoungBo Min CLK_CON_DIV_CLK_CPUCL_CLUSTER_PCLK, 469*85cc5be6SGyoungBo Min CLK_CON_DIV_CLK_CPUCL_CMUREF, 470*85cc5be6SGyoungBo Min CLK_CON_DIV_CLK_CPUCL_CPU, 471*85cc5be6SGyoungBo Min CLK_CON_DIV_CLK_CPUCL_CLUSTER_ATCLK, 472*85cc5be6SGyoungBo Min CLK_CON_DIV_CLK_CPUCL_CLUSTER_SCU, 473*85cc5be6SGyoungBo Min CLK_CON_DIV_CLK_CPUCL_DBG, 474*85cc5be6SGyoungBo Min CLK_CON_GAT_CLK_CLUSTER_CPU, 475*85cc5be6SGyoungBo Min CLK_CON_GAT_CLK_CPUCL_SHORTSTOP, 476*85cc5be6SGyoungBo Min CSSYS_IPCLKPORT_ATCLK, 477*85cc5be6SGyoungBo Min CSSYS_IPCLKPORT_PCLKDBG, 478*85cc5be6SGyoungBo Min DMYQCH_CON_CSSYS_QCH, 479*85cc5be6SGyoungBo Min DMYQCH_CON_CLUSTER_QCH_CORECLK0, 480*85cc5be6SGyoungBo Min DMYQCH_CON_CLUSTER_QCH_CORECLK1, 481*85cc5be6SGyoungBo Min DMYQCH_CON_CLUSTER_QCH_CORECLK2, 482*85cc5be6SGyoungBo Min DMYQCH_CON_CLUSTER_QCH_CORECLK3, 483*85cc5be6SGyoungBo Min DMYQCH_CON_CLUSTER_QCH_CORECLK4, 484*85cc5be6SGyoungBo Min DMYQCH_CON_CLUSTER_QCH_CORECLK5, 485*85cc5be6SGyoungBo Min DMYQCH_CON_CLUSTER_QCH_PERIPHCLK, 486*85cc5be6SGyoungBo Min }; 487*85cc5be6SGyoungBo Min 488*85cc5be6SGyoungBo Min /* rate_table must be in descending order */ 489*85cc5be6SGyoungBo Min static const struct samsung_pll_rate_table artpec9_pll_cpucl_rates[] __initconst = { 490*85cc5be6SGyoungBo Min PLL_35XX_RATE(25 * MHZ, 1400000000U, 56, 1, 0), 491*85cc5be6SGyoungBo Min PLL_35XX_RATE(25 * MHZ, 1100000000U, 44, 1, 0), 492*85cc5be6SGyoungBo Min PLL_35XX_RATE(25 * MHZ, 850000000U, 34, 1, 0), 493*85cc5be6SGyoungBo Min }; 494*85cc5be6SGyoungBo Min 495*85cc5be6SGyoungBo Min static const struct samsung_pll_clock cmu_cpucl_pll_clks[] __initconst = { 496*85cc5be6SGyoungBo Min PLL(pll_a9fracm, CLK_FOUT_CPUCL_PLL0, "fout_pll0_cpucl", "fin_pll", 497*85cc5be6SGyoungBo Min PLL_LOCKTIME_PLL0_CPUCL, PLL_CON0_PLL0_CPUCL, artpec9_pll_cpucl_rates), 498*85cc5be6SGyoungBo Min PLL(pll_a9fracm, CLK_FOUT_CPUCL_PLL1, "fout_pll1_cpucl", "fin_pll", 499*85cc5be6SGyoungBo Min PLL_LOCKTIME_PLL1_CPUCL, PLL_CON0_PLL1_CPUCL, artpec9_pll_cpucl_rates), 500*85cc5be6SGyoungBo Min }; 501*85cc5be6SGyoungBo Min 502*85cc5be6SGyoungBo Min PNAME(mout_clkcmu_cpucl_switch_scu_user_p) = { "fin_pll", "dout_clkcmu_cpucl_switch" }; 503*85cc5be6SGyoungBo Min PNAME(mout_clkcmu_cpucl_switch_user_p) = { "fin_pll", "dout_clkcmu_cpucl_switch" }; 504*85cc5be6SGyoungBo Min PNAME(mout_pll0_cpucl_p) = { "fin_pll", "fout_pll0_cpucl" }; 505*85cc5be6SGyoungBo Min PNAME(mout_clk_cpucl_pll0_p) = { "mout_pll0_cpucl", "mout_clkcmu_cpucl_switch_user" }; 506*85cc5be6SGyoungBo Min PNAME(mout_pll1_cpucl_p) = { "fin_pll", "fout_pll1_cpucl" }; 507*85cc5be6SGyoungBo Min PNAME(mout_clk_cpucl_pll_scu_p) = { "mout_pll1_cpucl", "mout_clkcmu_cpucl_switch_scu_user" }; 508*85cc5be6SGyoungBo Min 509*85cc5be6SGyoungBo Min static const struct samsung_mux_clock cmu_cpucl_mux_clks[] __initconst = { 510*85cc5be6SGyoungBo Min MUX_F(0, "mout_pll0_cpucl", mout_pll0_cpucl_p, 511*85cc5be6SGyoungBo Min PLL_CON0_PLL0_CPUCL, 4, 1, CLK_SET_RATE_PARENT | CLK_RECALC_NEW_RATES, 0), 512*85cc5be6SGyoungBo Min MUX_F(0, "mout_pll1_cpucl", mout_pll1_cpucl_p, 513*85cc5be6SGyoungBo Min PLL_CON0_PLL1_CPUCL, 4, 1, CLK_SET_RATE_PARENT | CLK_RECALC_NEW_RATES, 0), 514*85cc5be6SGyoungBo Min MUX(CLK_MOUT_CPUCL_SWITCH_SCU_USER, "mout_clkcmu_cpucl_switch_scu_user", 515*85cc5be6SGyoungBo Min mout_clkcmu_cpucl_switch_scu_user_p, PLL_CON0_MUX_CLKCMU_CPUCL_SWITCH_SCU_USER, 4, 1), 516*85cc5be6SGyoungBo Min MUX(CLK_MOUT_CPUCL_SWITCH_USER, "mout_clkcmu_cpucl_switch_user", 517*85cc5be6SGyoungBo Min mout_clkcmu_cpucl_switch_user_p, PLL_CON0_MUX_CLKCMU_CPUCL_SWITCH_USER, 4, 1), 518*85cc5be6SGyoungBo Min MUX_F(CLK_MOUT_CPUCL_PLL0, "mout_clk_cpucl_pll0", 519*85cc5be6SGyoungBo Min mout_clk_cpucl_pll0_p, CLK_CON_MUX_CLK_CPUCL_PLL, 0, 1, CLK_SET_RATE_PARENT, 0), 520*85cc5be6SGyoungBo Min MUX_F(CLK_MOUT_CPUCL_PLL_SCU, "mout_clk_cpucl_pll_scu", mout_clk_cpucl_pll_scu_p, 521*85cc5be6SGyoungBo Min CLK_CON_MUX_CLK_CPUCL_PLL_SCU, 0, 1, CLK_SET_RATE_PARENT, 0), 522*85cc5be6SGyoungBo Min }; 523*85cc5be6SGyoungBo Min 524*85cc5be6SGyoungBo Min static const struct samsung_fixed_factor_clock cpucl_ffactor_clks[] __initconst = { 525*85cc5be6SGyoungBo Min FFACTOR(CLK_DOUT_CPUCL_CPU, "dout_clk_cpucl_cpu", 526*85cc5be6SGyoungBo Min "mout_clk_cpucl_pll0", 1, 1, CLK_SET_RATE_PARENT), 527*85cc5be6SGyoungBo Min }; 528*85cc5be6SGyoungBo Min 529*85cc5be6SGyoungBo Min static const struct samsung_div_clock cmu_cpucl_div_clks[] __initconst = { 530*85cc5be6SGyoungBo Min DIV(CLK_DOUT_CPUCL_CLUSTER_PERIPHCLK, "dout_clk_cluster_periphclk", 531*85cc5be6SGyoungBo Min "clk_con_gat_clk_cluster_cpu", CLK_CON_DIV_CLK_CPUCL_CLUSTER_PERIPHCLK, 0, 4), 532*85cc5be6SGyoungBo Min DIV(CLK_DOUT_CPUCL_CLUSTER_GICCLK, "dout_clk_cluster_gicclk", 533*85cc5be6SGyoungBo Min "clk_con_gat_clk_cluster_cpu", CLK_CON_DIV_CLK_CPUCL_CLUSTER_GICCLK, 0, 4), 534*85cc5be6SGyoungBo Min DIV(CLK_DOUT_CPUCL_CLUSTER_PCLK, "dout_clk_cluster_pclk", 535*85cc5be6SGyoungBo Min "clk_con_gat_clk_cluster_cpu", CLK_CON_DIV_CLK_CPUCL_CLUSTER_PCLK, 0, 4), 536*85cc5be6SGyoungBo Min DIV(CLK_DOUT_CPUCL_CMUREF, "dout_clk_cpucl_cmuref", 537*85cc5be6SGyoungBo Min "dout_clk_cpucl_cpu", CLK_CON_DIV_CLK_CPUCL_CMUREF, 0, 3), 538*85cc5be6SGyoungBo Min DIV(CLK_DOUT_CPUCL_CLUSTER_ATCLK, "dout_clk_cluster_atclk", 539*85cc5be6SGyoungBo Min "clk_con_gat_clk_cluster_cpu", CLK_CON_DIV_CLK_CPUCL_CLUSTER_ATCLK, 0, 4), 540*85cc5be6SGyoungBo Min DIV_F(CLK_DOUT_CPUCL_CLUSTER_SCU, "dout_clk_cluster_scu", "mout_clk_cpucl_pll_scu", 541*85cc5be6SGyoungBo Min CLK_CON_DIV_CLK_CPUCL_CLUSTER_SCU, 0, 4, CLK_SET_RATE_PARENT, 0), 542*85cc5be6SGyoungBo Min DIV(CLK_DOUT_CPUCL_DBG, "dout_clk_cpucl_dbg", 543*85cc5be6SGyoungBo Min "dout_clk_cpucl_cpu", CLK_CON_DIV_CLK_CPUCL_DBG, 0, 4), 544*85cc5be6SGyoungBo Min }; 545*85cc5be6SGyoungBo Min 546*85cc5be6SGyoungBo Min static const struct samsung_gate_clock cmu_cpucl_gate_clks[] __initconst = { 547*85cc5be6SGyoungBo Min GATE(CLK_GOUT_CPUCL_CLUSTER_CPU, "clk_con_gat_clk_cluster_cpu", 548*85cc5be6SGyoungBo Min "clk_con_gat_clk_cpucl_shortstop", CLK_CON_GAT_CLK_CLUSTER_CPU, 21, 549*85cc5be6SGyoungBo Min CLK_SET_RATE_PARENT | CLK_IS_CRITICAL, 0), 550*85cc5be6SGyoungBo Min GATE(CLK_GOUT_CPUCL_SHORTSTOP, "clk_con_gat_clk_cpucl_shortstop", "dout_clk_cpucl_cpu", 551*85cc5be6SGyoungBo Min CLK_CON_GAT_CLK_CPUCL_SHORTSTOP, 21, CLK_SET_RATE_PARENT | CLK_IS_CRITICAL, 0), 552*85cc5be6SGyoungBo Min GATE(CLK_GOUT_CPUCL_CSSYS_IPCLKPORT_ATCLK, "cssys_ipclkport_atclk", "dout_clk_cpucl_dbg", 553*85cc5be6SGyoungBo Min CSSYS_IPCLKPORT_ATCLK, 21, CLK_SET_RATE_PARENT | CLK_IS_CRITICAL, 0), 554*85cc5be6SGyoungBo Min GATE(CLK_GOUT_CPUCL_CSSYS_IPCLKPORT_PCLKDBG, "cssys_ipclkport_pclkdbg", 555*85cc5be6SGyoungBo Min "dout_clk_cpucl_dbg", CSSYS_IPCLKPORT_PCLKDBG, 21, 556*85cc5be6SGyoungBo Min CLK_SET_RATE_PARENT | CLK_IS_CRITICAL, 0), 557*85cc5be6SGyoungBo Min }; 558*85cc5be6SGyoungBo Min 559*85cc5be6SGyoungBo Min static const struct samsung_cmu_info cmu_cpucl_info __initconst = { 560*85cc5be6SGyoungBo Min .pll_clks = cmu_cpucl_pll_clks, 561*85cc5be6SGyoungBo Min .nr_pll_clks = ARRAY_SIZE(cmu_cpucl_pll_clks), 562*85cc5be6SGyoungBo Min .fixed_factor_clks = cpucl_ffactor_clks, 563*85cc5be6SGyoungBo Min .nr_fixed_factor_clks = ARRAY_SIZE(cpucl_ffactor_clks), 564*85cc5be6SGyoungBo Min .mux_clks = cmu_cpucl_mux_clks, 565*85cc5be6SGyoungBo Min .nr_mux_clks = ARRAY_SIZE(cmu_cpucl_mux_clks), 566*85cc5be6SGyoungBo Min .div_clks = cmu_cpucl_div_clks, 567*85cc5be6SGyoungBo Min .nr_div_clks = ARRAY_SIZE(cmu_cpucl_div_clks), 568*85cc5be6SGyoungBo Min .gate_clks = cmu_cpucl_gate_clks, 569*85cc5be6SGyoungBo Min .nr_gate_clks = ARRAY_SIZE(cmu_cpucl_gate_clks), 570*85cc5be6SGyoungBo Min .nr_clk_ids = CMU_CPUCL_NR_CLK, 571*85cc5be6SGyoungBo Min .clk_regs = cmu_cpucl_clk_regs, 572*85cc5be6SGyoungBo Min .nr_clk_regs = ARRAY_SIZE(cmu_cpucl_clk_regs), 573*85cc5be6SGyoungBo Min }; 574*85cc5be6SGyoungBo Min 575*85cc5be6SGyoungBo Min /* Register Offset definitions for CMU_FSYS0 (0x14410000) */ 576*85cc5be6SGyoungBo Min #define PLL_CON0_MUX_CLK_FSYS0_BUS_USER 0x0100 577*85cc5be6SGyoungBo Min #define PLL_CON0_MUX_CLK_FSYS0_IP_USER 0x0120 578*85cc5be6SGyoungBo Min #define PLL_CON0_MUX_CLK_FSYS0_MAIN_USER 0x0140 579*85cc5be6SGyoungBo Min #define CLK_CON_DIV_CLK_FSYS0_125 0x1800 580*85cc5be6SGyoungBo Min #define CLK_CON_DIV_CLK_FSYS0_ADC 0x1804 581*85cc5be6SGyoungBo Min #define CLK_CON_DIV_CLK_FSYS0_BUS_300 0x1808 582*85cc5be6SGyoungBo Min #define CLK_CON_DIV_CLK_FSYS0_EQOS0 0x1814 583*85cc5be6SGyoungBo Min #define CLK_CON_DIV_CLK_FSYS0_EQOS1 0x1818 584*85cc5be6SGyoungBo Min #define CLK_CON_DIV_CLK_FSYS0_EQOS_250 0x181C 585*85cc5be6SGyoungBo Min #define CLK_CON_DIV_CLK_FSYS0_MMC_CARD0 0x1820 586*85cc5be6SGyoungBo Min #define CLK_CON_DIV_CLK_FSYS0_MMC_CARD1 0x1824 587*85cc5be6SGyoungBo Min #define CLK_CON_DIV_CLK_FSYS0_MMC_CARD2 0x1828 588*85cc5be6SGyoungBo Min #define CLK_CON_DIV_CLK_FSYS0_QSPI 0x182c 589*85cc5be6SGyoungBo Min #define CLK_CON_DIV_CLK_FSYS0_SFMC_NAND 0x1830 590*85cc5be6SGyoungBo Min #define CLK_CON_FSYS0_I2C0_IPCLKPORT_I_PCLK 0x2040 591*85cc5be6SGyoungBo Min #define CLK_CON_FSYS0_I2C1_IPCLKPORT_I_PCLK 0x2044 592*85cc5be6SGyoungBo Min #define CLK_CON_MMC0_IPCLKPORT_I_ACLK 0x2078 593*85cc5be6SGyoungBo Min #define CLK_CON_MMC1_IPCLKPORT_I_ACLK 0x2080 594*85cc5be6SGyoungBo Min #define CLK_CON_MMC2_IPCLKPORT_I_ACLK 0x2088 595*85cc5be6SGyoungBo Min #define CLK_CON_PWM_IPCLKPORT_I_PCLK_S0 0x2090 596*85cc5be6SGyoungBo Min #define CLK_CON_DMYQCH_CON_ADC_WRAP_QCH 0x3000 597*85cc5be6SGyoungBo Min #define CLK_CON_DMYQCH_CON_EQOS_TOP0_QCH 0x3004 598*85cc5be6SGyoungBo Min #define CLK_CON_DMYQCH_CON_EQOS_TOP1_QCH 0x3008 599*85cc5be6SGyoungBo Min #define CLK_CON_DMYQCH_CON_FSYS0_I3C0_QCH 0x3010 600*85cc5be6SGyoungBo Min #define CLK_CON_DMYQCH_CON_FSYS0_I3C1_QCH 0x3014 601*85cc5be6SGyoungBo Min #define CLK_CON_DMYQCH_CON_MMC0_QCH 0x3018 602*85cc5be6SGyoungBo Min #define CLK_CON_DMYQCH_CON_MMC1_QCH 0x301c 603*85cc5be6SGyoungBo Min #define CLK_CON_DMYQCH_CON_MMC2_QCH 0x3020 604*85cc5be6SGyoungBo Min #define CLK_CON_DMYQCH_CON_QSPI_QCH 0x3024 605*85cc5be6SGyoungBo Min #define CLK_CON_DMYQCH_CON_SFMC_QCH 0x3028 606*85cc5be6SGyoungBo Min 607*85cc5be6SGyoungBo Min static const unsigned long cmu_fsys0_clk_regs[] __initconst = { 608*85cc5be6SGyoungBo Min PLL_CON0_MUX_CLK_FSYS0_BUS_USER, 609*85cc5be6SGyoungBo Min PLL_CON0_MUX_CLK_FSYS0_IP_USER, 610*85cc5be6SGyoungBo Min PLL_CON0_MUX_CLK_FSYS0_MAIN_USER, 611*85cc5be6SGyoungBo Min CLK_CON_DIV_CLK_FSYS0_125, 612*85cc5be6SGyoungBo Min CLK_CON_DIV_CLK_FSYS0_ADC, 613*85cc5be6SGyoungBo Min CLK_CON_DIV_CLK_FSYS0_BUS_300, 614*85cc5be6SGyoungBo Min CLK_CON_DIV_CLK_FSYS0_EQOS0, 615*85cc5be6SGyoungBo Min CLK_CON_DIV_CLK_FSYS0_EQOS1, 616*85cc5be6SGyoungBo Min CLK_CON_DIV_CLK_FSYS0_EQOS_250, 617*85cc5be6SGyoungBo Min CLK_CON_DIV_CLK_FSYS0_MMC_CARD0, 618*85cc5be6SGyoungBo Min CLK_CON_DIV_CLK_FSYS0_MMC_CARD1, 619*85cc5be6SGyoungBo Min CLK_CON_DIV_CLK_FSYS0_MMC_CARD2, 620*85cc5be6SGyoungBo Min CLK_CON_DIV_CLK_FSYS0_QSPI, 621*85cc5be6SGyoungBo Min CLK_CON_DIV_CLK_FSYS0_SFMC_NAND, 622*85cc5be6SGyoungBo Min CLK_CON_FSYS0_I2C0_IPCLKPORT_I_PCLK, 623*85cc5be6SGyoungBo Min CLK_CON_FSYS0_I2C1_IPCLKPORT_I_PCLK, 624*85cc5be6SGyoungBo Min CLK_CON_MMC0_IPCLKPORT_I_ACLK, 625*85cc5be6SGyoungBo Min CLK_CON_MMC1_IPCLKPORT_I_ACLK, 626*85cc5be6SGyoungBo Min CLK_CON_MMC2_IPCLKPORT_I_ACLK, 627*85cc5be6SGyoungBo Min CLK_CON_PWM_IPCLKPORT_I_PCLK_S0, 628*85cc5be6SGyoungBo Min CLK_CON_DMYQCH_CON_ADC_WRAP_QCH, 629*85cc5be6SGyoungBo Min CLK_CON_DMYQCH_CON_EQOS_TOP0_QCH, 630*85cc5be6SGyoungBo Min CLK_CON_DMYQCH_CON_EQOS_TOP1_QCH, 631*85cc5be6SGyoungBo Min CLK_CON_DMYQCH_CON_FSYS0_I3C0_QCH, 632*85cc5be6SGyoungBo Min CLK_CON_DMYQCH_CON_FSYS0_I3C1_QCH, 633*85cc5be6SGyoungBo Min CLK_CON_DMYQCH_CON_MMC0_QCH, 634*85cc5be6SGyoungBo Min CLK_CON_DMYQCH_CON_MMC1_QCH, 635*85cc5be6SGyoungBo Min CLK_CON_DMYQCH_CON_MMC2_QCH, 636*85cc5be6SGyoungBo Min CLK_CON_DMYQCH_CON_QSPI_QCH, 637*85cc5be6SGyoungBo Min CLK_CON_DMYQCH_CON_SFMC_QCH, 638*85cc5be6SGyoungBo Min }; 639*85cc5be6SGyoungBo Min 640*85cc5be6SGyoungBo Min PNAME(mout_fsys0_bus_user_p) = { "fin_pll", "dout_clkcmu_fsys0_bus" }; 641*85cc5be6SGyoungBo Min PNAME(mout_fsys0_ip_user_p) = { "fin_pll", "dout_clkcmu_fsys0_ip" }; 642*85cc5be6SGyoungBo Min PNAME(mout_fsys0_main_user_p) = { "fin_pll", "fout_pll_fsys1" }; 643*85cc5be6SGyoungBo Min 644*85cc5be6SGyoungBo Min static const struct samsung_mux_clock cmu_fsys0_mux_clks[] __initconst = { 645*85cc5be6SGyoungBo Min MUX(CLK_MOUT_FSYS0_BUS_USER, "mout_fsys0_bus_user", 646*85cc5be6SGyoungBo Min mout_fsys0_bus_user_p, PLL_CON0_MUX_CLK_FSYS0_BUS_USER, 4, 1), 647*85cc5be6SGyoungBo Min MUX(CLK_MOUT_FSYS0_IP_USER, "mout_fsys0_ip_user", 648*85cc5be6SGyoungBo Min mout_fsys0_ip_user_p, PLL_CON0_MUX_CLK_FSYS0_IP_USER, 4, 1), 649*85cc5be6SGyoungBo Min MUX(CLK_MOUT_FSYS0_MAIN_USER, "mout_fsys0_main_user", 650*85cc5be6SGyoungBo Min mout_fsys0_main_user_p, PLL_CON0_MUX_CLK_FSYS0_MAIN_USER, 4, 1), 651*85cc5be6SGyoungBo Min }; 652*85cc5be6SGyoungBo Min 653*85cc5be6SGyoungBo Min static const struct samsung_div_clock cmu_fsys0_div_clks[] __initconst = { 654*85cc5be6SGyoungBo Min DIV(CLK_DOUT_FSYS0_125, "dout_fsys0_125", "mout_fsys0_main_user", 655*85cc5be6SGyoungBo Min CLK_CON_DIV_CLK_FSYS0_125, 0, 5), 656*85cc5be6SGyoungBo Min DIV(CLK_DOUT_FSYS0_ADC, "dout_fsys0_adc", "mout_fsys0_main_user", 657*85cc5be6SGyoungBo Min CLK_CON_DIV_CLK_FSYS0_ADC, 0, 7), 658*85cc5be6SGyoungBo Min DIV(CLK_DOUT_FSYS0_BUS_300, "dout_fsys0_bus_300", "mout_fsys0_bus_user", 659*85cc5be6SGyoungBo Min CLK_CON_DIV_CLK_FSYS0_BUS_300, 0, 4), 660*85cc5be6SGyoungBo Min DIV(CLK_DOUT_FSYS0_EQOS0, "dout_fsys0_eqos0", "dout_fsys0_eqos_250", 661*85cc5be6SGyoungBo Min CLK_CON_DIV_CLK_FSYS0_EQOS0, 0, 7), 662*85cc5be6SGyoungBo Min DIV(CLK_DOUT_FSYS0_EQOS1, "dout_fsys0_eqos1", "dout_fsys0_eqos_250", 663*85cc5be6SGyoungBo Min CLK_CON_DIV_CLK_FSYS0_EQOS1, 0, 7), 664*85cc5be6SGyoungBo Min DIV(0, "dout_fsys0_eqos_250", "mout_fsys0_main_user", 665*85cc5be6SGyoungBo Min CLK_CON_DIV_CLK_FSYS0_EQOS_250, 0, 4), 666*85cc5be6SGyoungBo Min DIV(CLK_DOUT_FSYS0_MMC_CARD0, "dout_fsys0_mmc_card0", "mout_fsys0_ip_user", 667*85cc5be6SGyoungBo Min CLK_CON_DIV_CLK_FSYS0_MMC_CARD0, 0, 10), 668*85cc5be6SGyoungBo Min DIV(CLK_DOUT_FSYS0_MMC_CARD1, "dout_fsys0_mmc_card1", "mout_fsys0_ip_user", 669*85cc5be6SGyoungBo Min CLK_CON_DIV_CLK_FSYS0_MMC_CARD1, 0, 10), 670*85cc5be6SGyoungBo Min DIV(CLK_DOUT_FSYS0_MMC_CARD2, "dout_fsys0_mmc_card2", "mout_fsys0_ip_user", 671*85cc5be6SGyoungBo Min CLK_CON_DIV_CLK_FSYS0_MMC_CARD2, 0, 10), 672*85cc5be6SGyoungBo Min DIV(CLK_DOUT_FSYS0_QSPI, "dout_fsys0_qspi", "mout_fsys0_ip_user", 673*85cc5be6SGyoungBo Min CLK_CON_DIV_CLK_FSYS0_QSPI, 0, 4), 674*85cc5be6SGyoungBo Min DIV(CLK_DOUT_FSYS0_SFMC_NAND, "dout_fsys0_sfmc_nand", "mout_fsys0_ip_user", 675*85cc5be6SGyoungBo Min CLK_CON_DIV_CLK_FSYS0_SFMC_NAND, 0, 4), 676*85cc5be6SGyoungBo Min }; 677*85cc5be6SGyoungBo Min 678*85cc5be6SGyoungBo Min static const struct samsung_gate_clock cmu_fsys0_gate_clks[] __initconst = { 679*85cc5be6SGyoungBo Min GATE(0, "adc_wrap_ipclkport_clk", "dout_fsys0_adc", 680*85cc5be6SGyoungBo Min CLK_CON_DMYQCH_CON_ADC_WRAP_QCH, 1, CLK_SET_RATE_PARENT | CLK_IGNORE_UNUSED, 0), 681*85cc5be6SGyoungBo Min GATE(CLK_GOUT_FSYS0_EQOS_TOP0_IPCLKPORT_ACLK_I, "eqos_top0_ipclkport_aclk_i", 682*85cc5be6SGyoungBo Min "dout_fsys0_bus_300", CLK_CON_DMYQCH_CON_EQOS_TOP0_QCH, 1, CLK_SET_RATE_PARENT, 0), 683*85cc5be6SGyoungBo Min GATE(CLK_GOUT_FSYS0_EQOS_TOP0_IPCLKPORT_CLK_CSR_I, "eqos_top0_ipclkport_clk_csr_i", 684*85cc5be6SGyoungBo Min "dout_fsys0_bus_300", CLK_CON_DMYQCH_CON_EQOS_TOP0_QCH, 1, CLK_SET_RATE_PARENT, 0), 685*85cc5be6SGyoungBo Min GATE(CLK_GOUT_FSYS0_EQOS_TOP0_IPCLKPORT_I_RGMII_PHASE_CLK_250, 686*85cc5be6SGyoungBo Min "eqos_top0_ipclkport_i_rgmii_phase_clk_250", 687*85cc5be6SGyoungBo Min "dout_fsys0_eqos_250", CLK_CON_DMYQCH_CON_EQOS_TOP0_QCH, 1, CLK_SET_RATE_PARENT, 0), 688*85cc5be6SGyoungBo Min GATE(CLK_GOUT_FSYS0_EQOS_TOP0_IPCLKPORT_I_RGMII_TXCLK, "eqos_top0_ipclkport_i_rgmii_txclk", 689*85cc5be6SGyoungBo Min "dout_fsys0_eqos0", CLK_CON_DMYQCH_CON_EQOS_TOP0_QCH, 1, CLK_SET_RATE_PARENT, 0), 690*85cc5be6SGyoungBo Min GATE(CLK_GOUT_FSYS0_EQOS_TOP1_IPCLKPORT_I_RGMII_PHASE_CLK_250, 691*85cc5be6SGyoungBo Min "eqos_top1_ipclkport_i_rgmii_phase_clk_250", 692*85cc5be6SGyoungBo Min "dout_fsys0_eqos_250", CLK_CON_DMYQCH_CON_EQOS_TOP1_QCH, 1, CLK_SET_RATE_PARENT, 0), 693*85cc5be6SGyoungBo Min GATE(CLK_GOUT_FSYS0_EQOS_TOP1_IPCLKPORT_I_RGMII_TXCLK, "eqos_top1_ipclkport_i_rgmii_txclk", 694*85cc5be6SGyoungBo Min "dout_fsys0_eqos1", CLK_CON_DMYQCH_CON_EQOS_TOP1_QCH, 1, CLK_SET_RATE_PARENT, 0), 695*85cc5be6SGyoungBo Min GATE(CLK_GOUT_FSYS0_EQOS_TOP1_IPCLKPORT_ACLK_I, "eqos_top1_ipclkport_aclk_i", 696*85cc5be6SGyoungBo Min "dout_fsys0_bus_300", CLK_CON_DMYQCH_CON_EQOS_TOP1_QCH, 1, CLK_SET_RATE_PARENT, 0), 697*85cc5be6SGyoungBo Min GATE(CLK_GOUT_FSYS0_EQOS_TOP1_IPCLKPORT_CLK_CSR_I, "eqos_top1_ipclkport_clk_csr_i", 698*85cc5be6SGyoungBo Min "dout_fsys0_bus_300", CLK_CON_DMYQCH_CON_EQOS_TOP1_QCH, 1, CLK_SET_RATE_PARENT, 0), 699*85cc5be6SGyoungBo Min GATE(CLK_GOUT_FSYS0_I3C0_IPCLKPORT_I_APB_S_PCLK, "i3c0_ipclkport_i_apb_s_pclk", 700*85cc5be6SGyoungBo Min "dout_fsys0_bus_300", CLK_CON_DMYQCH_CON_FSYS0_I3C0_QCH, 1, 701*85cc5be6SGyoungBo Min CLK_SET_RATE_PARENT | CLK_IS_CRITICAL, 0), 702*85cc5be6SGyoungBo Min GATE(CLK_GOUT_FSYS0_I3C0_IPCLKPORT_I_CORE_CLK, "i3c0_ipclkport_i_core_clk", 703*85cc5be6SGyoungBo Min "dout_fsys0_125", CLK_CON_DMYQCH_CON_FSYS0_I3C0_QCH, 1, CLK_SET_RATE_PARENT, 0), 704*85cc5be6SGyoungBo Min GATE(CLK_GOUT_FSYS0_I3C0_IPCLKPORT_I_DMA_CLK, "i3c0_ipclkport_i_dma_clk", 705*85cc5be6SGyoungBo Min "dout_fsys0_bus_300", CLK_CON_DMYQCH_CON_FSYS0_I3C0_QCH, 706*85cc5be6SGyoungBo Min 1, CLK_SET_RATE_PARENT | CLK_IS_CRITICAL, 0), 707*85cc5be6SGyoungBo Min GATE(CLK_GOUT_FSYS0_I3C0_IPCLKPORT_I_HDR_TX_CLK, "i3c0_ipclkport_i_hdr_tx_clk", 708*85cc5be6SGyoungBo Min "dout_fsys0_bus_300", CLK_CON_DMYQCH_CON_FSYS0_I3C0_QCH, 709*85cc5be6SGyoungBo Min 1, CLK_SET_RATE_PARENT | CLK_IS_CRITICAL, 0), 710*85cc5be6SGyoungBo Min GATE(CLK_GOUT_FSYS0_I3C1_IPCLKPORT_I_APB_S_PCLK, "i3c1_ipclkport_i_apb_s_pclk", 711*85cc5be6SGyoungBo Min "dout_fsys0_bus_300", CLK_CON_DMYQCH_CON_FSYS0_I3C1_QCH, 712*85cc5be6SGyoungBo Min 1, CLK_SET_RATE_PARENT | CLK_IS_CRITICAL, 0), 713*85cc5be6SGyoungBo Min GATE(CLK_GOUT_FSYS0_I3C1_IPCLKPORT_I_CORE_CLK, "i3c1_ipclkport_i_core_clk", 714*85cc5be6SGyoungBo Min "dout_fsys0_125", CLK_CON_DMYQCH_CON_FSYS0_I3C1_QCH, 1, CLK_SET_RATE_PARENT, 0), 715*85cc5be6SGyoungBo Min GATE(CLK_GOUT_FSYS0_I3C1_IPCLKPORT_I_DMA_CLK, "i3c1_ipclkport_i_dma_clk", 716*85cc5be6SGyoungBo Min "dout_fsys0_bus_300", CLK_CON_DMYQCH_CON_FSYS0_I3C1_QCH, 717*85cc5be6SGyoungBo Min 1, CLK_SET_RATE_PARENT | CLK_IS_CRITICAL, 0), 718*85cc5be6SGyoungBo Min GATE(CLK_GOUT_FSYS0_I3C1_IPCLKPORT_I_HDR_TX_CLK, "i3c1_ipclkport_i_hdr_tx_clk", 719*85cc5be6SGyoungBo Min "dout_fsys0_bus_300", CLK_CON_DMYQCH_CON_FSYS0_I3C1_QCH, 720*85cc5be6SGyoungBo Min 1, CLK_SET_RATE_PARENT | CLK_IS_CRITICAL, 0), 721*85cc5be6SGyoungBo Min GATE(CLK_GOUT_FSYS0_MMC0_IPCLKPORT_SDCLKIN, "mmc0_ipclkport_sdclkin", 722*85cc5be6SGyoungBo Min "dout_fsys0_mmc_card0", CLK_CON_DMYQCH_CON_MMC0_QCH, 1, CLK_SET_RATE_PARENT, 0), 723*85cc5be6SGyoungBo Min GATE(CLK_GOUT_FSYS0_MMC1_IPCLKPORT_SDCLKIN, "mmc1_ipclkport_sdclkin", 724*85cc5be6SGyoungBo Min "dout_fsys0_mmc_card1", CLK_CON_DMYQCH_CON_MMC1_QCH, 1, CLK_SET_RATE_PARENT, 0), 725*85cc5be6SGyoungBo Min GATE(CLK_GOUT_FSYS0_MMC2_IPCLKPORT_SDCLKIN, "mmc2_ipclkport_sdclkin", 726*85cc5be6SGyoungBo Min "dout_fsys0_mmc_card2", CLK_CON_DMYQCH_CON_MMC2_QCH, 1, CLK_SET_RATE_PARENT, 0), 727*85cc5be6SGyoungBo Min GATE(CLK_GOUT_FSYS0_QSPI_IPCLKPORT_HCLK, "qspi_ipclkport_hclk", 728*85cc5be6SGyoungBo Min "dout_fsys0_bus_300", CLK_CON_DMYQCH_CON_QSPI_QCH, 1, CLK_SET_RATE_PARENT, 0), 729*85cc5be6SGyoungBo Min GATE(CLK_GOUT_FSYS0_QSPI_IPCLKPORT_SSI_CLK, "qspi_ipclkport_ssi_clk", "dout_fsys0_qspi", 730*85cc5be6SGyoungBo Min CLK_CON_DMYQCH_CON_QSPI_QCH, 1, CLK_SET_RATE_PARENT | CLK_IS_CRITICAL, 0), 731*85cc5be6SGyoungBo Min GATE(CLK_GOUT_FSYS0_SFMC_IPCLKPORT_I_ACLK_NAND, "sfmc_ipclkport_i_aclk_nand", 732*85cc5be6SGyoungBo Min "dout_fsys0_sfmc_nand", CLK_CON_DMYQCH_CON_SFMC_QCH, 1, CLK_SET_RATE_PARENT, 0), 733*85cc5be6SGyoungBo Min GATE(CLK_GOUT_FSYS0_I2C0_IPCLKPORT_I_PCLK, "i2c0_ipclkport_i_pclk", "dout_fsys0_bus_300", 734*85cc5be6SGyoungBo Min CLK_CON_FSYS0_I2C0_IPCLKPORT_I_PCLK, 21, CLK_SET_RATE_PARENT | CLK_IS_CRITICAL, 0), 735*85cc5be6SGyoungBo Min GATE(CLK_GOUT_FSYS0_I2C1_IPCLKPORT_I_PCLK, "i2c1_ipclkport_i_pclk", "dout_fsys0_bus_300", 736*85cc5be6SGyoungBo Min CLK_CON_FSYS0_I2C1_IPCLKPORT_I_PCLK, 21, CLK_SET_RATE_PARENT | CLK_IS_CRITICAL, 0), 737*85cc5be6SGyoungBo Min GATE(CLK_GOUT_FSYS0_MMC0_IPCLKPORT_I_ACLK, "mmc0_ipclkport_i_aclk", "dout_fsys0_bus_300", 738*85cc5be6SGyoungBo Min CLK_CON_MMC0_IPCLKPORT_I_ACLK, 21, CLK_SET_RATE_PARENT | CLK_IS_CRITICAL, 0), 739*85cc5be6SGyoungBo Min GATE(CLK_GOUT_FSYS0_MMC1_IPCLKPORT_I_ACLK, "mmc1_ipclkport_i_aclk", "dout_fsys0_bus_300", 740*85cc5be6SGyoungBo Min CLK_CON_MMC1_IPCLKPORT_I_ACLK, 21, CLK_SET_RATE_PARENT | CLK_IS_CRITICAL, 0), 741*85cc5be6SGyoungBo Min GATE(CLK_GOUT_FSYS0_MMC2_IPCLKPORT_I_ACLK, "mmc2_ipclkport_i_aclk", "dout_fsys0_bus_300", 742*85cc5be6SGyoungBo Min CLK_CON_MMC2_IPCLKPORT_I_ACLK, 21, CLK_SET_RATE_PARENT | CLK_IS_CRITICAL, 0), 743*85cc5be6SGyoungBo Min GATE(CLK_GOUT_FSYS0_PWM_IPCLKPORT_I_PCLK_S0, "pwm_ipclkport_i_pclk", "dout_fsys0_bus_300", 744*85cc5be6SGyoungBo Min CLK_CON_PWM_IPCLKPORT_I_PCLK_S0, 21, CLK_SET_RATE_PARENT | CLK_IS_CRITICAL, 0), 745*85cc5be6SGyoungBo Min }; 746*85cc5be6SGyoungBo Min 747*85cc5be6SGyoungBo Min static const struct samsung_cmu_info cmu_fsys0_info __initconst = { 748*85cc5be6SGyoungBo Min .mux_clks = cmu_fsys0_mux_clks, 749*85cc5be6SGyoungBo Min .nr_mux_clks = ARRAY_SIZE(cmu_fsys0_mux_clks), 750*85cc5be6SGyoungBo Min .div_clks = cmu_fsys0_div_clks, 751*85cc5be6SGyoungBo Min .nr_div_clks = ARRAY_SIZE(cmu_fsys0_div_clks), 752*85cc5be6SGyoungBo Min .gate_clks = cmu_fsys0_gate_clks, 753*85cc5be6SGyoungBo Min .nr_gate_clks = ARRAY_SIZE(cmu_fsys0_gate_clks), 754*85cc5be6SGyoungBo Min .nr_clk_ids = CMU_FSYS0_NR_CLK, 755*85cc5be6SGyoungBo Min .clk_regs = cmu_fsys0_clk_regs, 756*85cc5be6SGyoungBo Min .nr_clk_regs = ARRAY_SIZE(cmu_fsys0_clk_regs), 757*85cc5be6SGyoungBo Min }; 758*85cc5be6SGyoungBo Min 759*85cc5be6SGyoungBo Min /* Register Offset definitions for CMU_FSYS1 (0x14c10000) */ 760*85cc5be6SGyoungBo Min #define PLL_LOCKTIME_PLL_FSYS1 0x0000 761*85cc5be6SGyoungBo Min #define PLL_CON0_MUX_CLK_FSYS1_BUS_USER 0x0100 762*85cc5be6SGyoungBo Min #define PLL_CON0_MUX_CLK_FSYS1_SCAN0_USER 0x0120 763*85cc5be6SGyoungBo Min #define PLL_CON0_MUX_CLK_FSYS1_SCAN1_USER 0x0140 764*85cc5be6SGyoungBo Min #define PLL_CON0_PLL_FSYS1 0x0160 765*85cc5be6SGyoungBo Min #define CLK_CON_DIV_CLK_FSYS1_200 0x1808 766*85cc5be6SGyoungBo Min #define CLK_CON_DIV_CLK_FSYS1_BUS_300 0x1810 767*85cc5be6SGyoungBo Min #define CLK_CON_DIV_CLK_FSYS1_OTP_MEM 0x1814 768*85cc5be6SGyoungBo Min #define CLK_CON_DIV_CLK_FSYS1_PCIE_PHY_REFCLK_SYSPLL 0x1818 769*85cc5be6SGyoungBo Min #define CLK_CON_FSYS1_UART0_IPCLKPORT_I_PCLK 0x202c 770*85cc5be6SGyoungBo Min #define CLK_CON_FSYS1_UART0_IPCLKPORT_I_SCLK_UART 0x2030 771*85cc5be6SGyoungBo Min #define CLK_CON_PCIE_TOP_IPCLKPORT_PCIE_PHY_APB2CR_PCLK_300 0x205c 772*85cc5be6SGyoungBo Min #define CLK_CON_PCIE_TOP_IPCLKPORT_PCIE_SUB_CON_X1_DBI_ACLK_SOC 0x2068 773*85cc5be6SGyoungBo Min #define CLK_CON_PCIE_TOP_IPCLKPORT_PCIE_SUB_CON_X1_MSTR_ACLK_SOC 0x206c 774*85cc5be6SGyoungBo Min #define CLK_CON_PCIE_TOP_IPCLKPORT_PCIE_SUB_CON_X1_SLV_ACLK_SOC 0x2070 775*85cc5be6SGyoungBo Min #define CLK_CON_PCIE_TOP_IPCLKPORT_PCIE_SUB_CON_X2_DBI_ACLK_SOC 0x2078 776*85cc5be6SGyoungBo Min #define CLK_CON_PCIE_TOP_IPCLKPORT_PCIE_SUB_CON_X2_MSTR_ACLK_SOC 0x2080 777*85cc5be6SGyoungBo Min #define CLK_CON_PCIE_TOP_IPCLKPORT_PCIE_SUB_CON_X2_SLV_ACLK_SOC 0x2084 778*85cc5be6SGyoungBo Min #define CLK_CON_USB20DRD_IPCLKPORT_ACLK_PHYCTRL_20 0x209c 779*85cc5be6SGyoungBo Min #define CLK_CON_USB20DRD_IPCLKPORT_BUS_CLK_EARLY 0x20a0 780*85cc5be6SGyoungBo Min #define CLK_CON_XHB_AHBBR_FSYS1_IPCLKPORT_CLK 0x20a8 781*85cc5be6SGyoungBo Min #define CLK_CON_XHB_USB_IPCLKPORT_CLK 0x20ac 782*85cc5be6SGyoungBo Min #define CLK_CON_DMYQCH_CON_TZ400_QCH 0x3004 783*85cc5be6SGyoungBo Min #define CLK_CON_DMYQCH_CON_PCIE_TOP_QCH_PHY_100 0x309c 784*85cc5be6SGyoungBo Min #define CLK_CON_QCH_CON_MMU_FSYS1_QCH_U_TBU_0_0 0x3050 785*85cc5be6SGyoungBo Min #define CLK_CON_QCH_CON_MMU_FSYS1_QCH_U_TBU_1_0 0x3058 786*85cc5be6SGyoungBo Min 787*85cc5be6SGyoungBo Min static const unsigned long cmu_fsys1_clk_regs[] __initconst = { 788*85cc5be6SGyoungBo Min PLL_LOCKTIME_PLL_FSYS1, 789*85cc5be6SGyoungBo Min PLL_CON0_MUX_CLK_FSYS1_BUS_USER, 790*85cc5be6SGyoungBo Min PLL_CON0_MUX_CLK_FSYS1_SCAN0_USER, 791*85cc5be6SGyoungBo Min PLL_CON0_MUX_CLK_FSYS1_SCAN1_USER, 792*85cc5be6SGyoungBo Min PLL_CON0_PLL_FSYS1, 793*85cc5be6SGyoungBo Min CLK_CON_DIV_CLK_FSYS1_200, 794*85cc5be6SGyoungBo Min CLK_CON_DIV_CLK_FSYS1_BUS_300, 795*85cc5be6SGyoungBo Min CLK_CON_DIV_CLK_FSYS1_OTP_MEM, 796*85cc5be6SGyoungBo Min CLK_CON_DIV_CLK_FSYS1_PCIE_PHY_REFCLK_SYSPLL, 797*85cc5be6SGyoungBo Min CLK_CON_FSYS1_UART0_IPCLKPORT_I_PCLK, 798*85cc5be6SGyoungBo Min CLK_CON_FSYS1_UART0_IPCLKPORT_I_SCLK_UART, 799*85cc5be6SGyoungBo Min CLK_CON_PCIE_TOP_IPCLKPORT_PCIE_PHY_APB2CR_PCLK_300, 800*85cc5be6SGyoungBo Min CLK_CON_PCIE_TOP_IPCLKPORT_PCIE_SUB_CON_X1_DBI_ACLK_SOC, 801*85cc5be6SGyoungBo Min CLK_CON_PCIE_TOP_IPCLKPORT_PCIE_SUB_CON_X1_MSTR_ACLK_SOC, 802*85cc5be6SGyoungBo Min CLK_CON_PCIE_TOP_IPCLKPORT_PCIE_SUB_CON_X1_SLV_ACLK_SOC, 803*85cc5be6SGyoungBo Min CLK_CON_PCIE_TOP_IPCLKPORT_PCIE_SUB_CON_X2_DBI_ACLK_SOC, 804*85cc5be6SGyoungBo Min CLK_CON_PCIE_TOP_IPCLKPORT_PCIE_SUB_CON_X2_MSTR_ACLK_SOC, 805*85cc5be6SGyoungBo Min CLK_CON_PCIE_TOP_IPCLKPORT_PCIE_SUB_CON_X2_SLV_ACLK_SOC, 806*85cc5be6SGyoungBo Min CLK_CON_USB20DRD_IPCLKPORT_ACLK_PHYCTRL_20, 807*85cc5be6SGyoungBo Min CLK_CON_USB20DRD_IPCLKPORT_BUS_CLK_EARLY, 808*85cc5be6SGyoungBo Min CLK_CON_XHB_AHBBR_FSYS1_IPCLKPORT_CLK, 809*85cc5be6SGyoungBo Min CLK_CON_XHB_USB_IPCLKPORT_CLK, 810*85cc5be6SGyoungBo Min CLK_CON_DMYQCH_CON_TZ400_QCH, 811*85cc5be6SGyoungBo Min CLK_CON_DMYQCH_CON_PCIE_TOP_QCH_PHY_100, 812*85cc5be6SGyoungBo Min CLK_CON_QCH_CON_MMU_FSYS1_QCH_U_TBU_0_0, 813*85cc5be6SGyoungBo Min CLK_CON_QCH_CON_MMU_FSYS1_QCH_U_TBU_1_0 814*85cc5be6SGyoungBo Min }; 815*85cc5be6SGyoungBo Min 816*85cc5be6SGyoungBo Min static const struct samsung_pll_rate_table artpec9_pll_fsys1_rates[] __initconst = { 817*85cc5be6SGyoungBo Min PLL_35XX_RATE(25 * MHZ, 2000000000U, 80, 1, 0), 818*85cc5be6SGyoungBo Min }; 819*85cc5be6SGyoungBo Min 820*85cc5be6SGyoungBo Min static const struct samsung_pll_clock cmu_fsys1_pll_clks[] __initconst = { 821*85cc5be6SGyoungBo Min PLL(pll_a9fracm, CLK_FOUT_FSYS1_PLL, "fout_pll_fsys1", "fin_pll", 822*85cc5be6SGyoungBo Min PLL_LOCKTIME_PLL_FSYS1, PLL_CON0_PLL_FSYS1, artpec9_pll_fsys1_rates), 823*85cc5be6SGyoungBo Min }; 824*85cc5be6SGyoungBo Min 825*85cc5be6SGyoungBo Min PNAME(mout_fsys1_scan0_user_p) = { "fin_pll", "dout_clkcmu_fsys1_scan0" }; 826*85cc5be6SGyoungBo Min PNAME(mout_fsys1_scan1_user_p) = { "fin_pll", "dout_clkcmu_fsys1_scan1" }; 827*85cc5be6SGyoungBo Min PNAME(mout_fsys1_bus_user_p) = { "fin_pll", "dout_clkcmu_fsys1_bus" }; 828*85cc5be6SGyoungBo Min PNAME(mout_fsys_pll_fsys_p) = { "fin_pll", "fout_pll_fsys1" }; 829*85cc5be6SGyoungBo Min 830*85cc5be6SGyoungBo Min static const struct samsung_mux_clock cmu_fsys1_mux_clks[] __initconst = { 831*85cc5be6SGyoungBo Min MUX(0, "mout_clk_pll_fsys1", mout_fsys_pll_fsys_p, PLL_CON0_PLL_FSYS1, 4, 1), 832*85cc5be6SGyoungBo Min MUX(CLK_MOUT_FSYS1_SCAN0_USER, "mout_fsys1_scan0_user", 833*85cc5be6SGyoungBo Min mout_fsys1_scan0_user_p, PLL_CON0_MUX_CLK_FSYS1_SCAN0_USER, 4, 1), 834*85cc5be6SGyoungBo Min MUX(CLK_MOUT_FSYS1_SCAN1_USER, "mout_fsys1_scan1_user", 835*85cc5be6SGyoungBo Min mout_fsys1_scan1_user_p, PLL_CON0_MUX_CLK_FSYS1_SCAN1_USER, 4, 1), 836*85cc5be6SGyoungBo Min MUX(CLK_MOUT_FSYS1_BUS_USER, "mout_fsys1_bus_user", 837*85cc5be6SGyoungBo Min mout_fsys1_bus_user_p, PLL_CON0_MUX_CLK_FSYS1_BUS_USER, 4, 1), 838*85cc5be6SGyoungBo Min }; 839*85cc5be6SGyoungBo Min 840*85cc5be6SGyoungBo Min static const struct samsung_div_clock cmu_fsys1_div_clks[] __initconst = { 841*85cc5be6SGyoungBo Min DIV(CLK_DOUT_FSYS1_200, "dout_fsys1_200", "mout_clk_pll_fsys1", 842*85cc5be6SGyoungBo Min CLK_CON_DIV_CLK_FSYS1_200, 0, 4), 843*85cc5be6SGyoungBo Min DIV(CLK_DOUT_FSYS1_BUS_300, "dout_fsys1_bus_300", "mout_fsys1_bus_user", 844*85cc5be6SGyoungBo Min CLK_CON_DIV_CLK_FSYS1_BUS_300, 0, 4), 845*85cc5be6SGyoungBo Min DIV(CLK_DOUT_FSYS1_OTP_MEM, "dout_fsys1_otp_mem", "fin_pll", 846*85cc5be6SGyoungBo Min CLK_CON_DIV_CLK_FSYS1_OTP_MEM, 0, 4), 847*85cc5be6SGyoungBo Min DIV(CLK_DOUT_FSYS1_PCIE_PHY_REFCLK_SYSPLL, "dout_fsys1_pcie_phy_refclk_syspll", 848*85cc5be6SGyoungBo Min "mout_clk_pll_fsys1", CLK_CON_DIV_CLK_FSYS1_PCIE_PHY_REFCLK_SYSPLL, 0, 5), 849*85cc5be6SGyoungBo Min }; 850*85cc5be6SGyoungBo Min 851*85cc5be6SGyoungBo Min static const struct samsung_gate_clock cmu_fsys1_gate_clks[] __initconst = { 852*85cc5be6SGyoungBo Min GATE(CLK_GOUT_FSYS1_IPCLKPORT_PCIE_PHY_APB2CR_PCLK_100, 853*85cc5be6SGyoungBo Min "pcie_top_ipclkport_pcie_phy_apb2cr_pclk_100", "dout_fsys1_pcie_phy_refclk_syspll", 854*85cc5be6SGyoungBo Min CLK_CON_DMYQCH_CON_PCIE_TOP_QCH_PHY_100, 1, CLK_SET_RATE_PARENT, 0), 855*85cc5be6SGyoungBo Min GATE(0, "tzc400_ipclkport_aclk0", "mout_fsys1_bus_user", 856*85cc5be6SGyoungBo Min CLK_CON_DMYQCH_CON_TZ400_QCH, 1, CLK_SET_RATE_PARENT | CLK_IS_CRITICAL, 0), 857*85cc5be6SGyoungBo Min GATE(0, "tzc400_ipclkport_aclk1", "mout_fsys1_bus_user", 858*85cc5be6SGyoungBo Min CLK_CON_DMYQCH_CON_TZ400_QCH, 1, CLK_SET_RATE_PARENT | CLK_IS_CRITICAL, 0), 859*85cc5be6SGyoungBo Min GATE(0, "tzc400_ipclkport_pclk", "dout_fsys1_bus_300", 860*85cc5be6SGyoungBo Min CLK_CON_DMYQCH_CON_TZ400_QCH, 1, CLK_SET_RATE_PARENT | CLK_IS_CRITICAL, 0), 861*85cc5be6SGyoungBo Min GATE(CLK_GOUT_FSYS1_UART0_PCLK, "uart", "dout_fsys1_bus_300", 862*85cc5be6SGyoungBo Min CLK_CON_FSYS1_UART0_IPCLKPORT_I_PCLK, 21, CLK_SET_RATE_PARENT | CLK_IS_CRITICAL, 0), 863*85cc5be6SGyoungBo Min GATE(CLK_GOUT_FSYS1_UART0_SCLK_UART, "clk_uart_baud0", "dout_fsys1_200", 864*85cc5be6SGyoungBo Min CLK_CON_FSYS1_UART0_IPCLKPORT_I_SCLK_UART, 21, 865*85cc5be6SGyoungBo Min CLK_SET_RATE_PARENT | CLK_IS_CRITICAL, 0), 866*85cc5be6SGyoungBo Min GATE(CLK_GOUT_FSYS1_IPCLKPORT_PCIE_PHY_APB2CR_PCLK_300, 867*85cc5be6SGyoungBo Min "pcie_top_ipclkport_pcie_phy_apb2cr_pclk_300", "dout_fsys1_bus_300", 868*85cc5be6SGyoungBo Min CLK_CON_PCIE_TOP_IPCLKPORT_PCIE_PHY_APB2CR_PCLK_300, 21, 869*85cc5be6SGyoungBo Min CLK_SET_RATE_PARENT | CLK_IS_CRITICAL, 0), 870*85cc5be6SGyoungBo Min GATE(CLK_GOUT_FSYS1_IPCLKPORT_PCIE_SUB_CON_X1_DBI_ACLK_SOC, 871*85cc5be6SGyoungBo Min "pcie_top_ipclkport_pcie_sub_con_x1_dbi_aclk_soc", "dout_fsys1_bus_300", 872*85cc5be6SGyoungBo Min CLK_CON_PCIE_TOP_IPCLKPORT_PCIE_SUB_CON_X1_DBI_ACLK_SOC, 873*85cc5be6SGyoungBo Min 21, CLK_SET_RATE_PARENT | CLK_IS_CRITICAL, 0), 874*85cc5be6SGyoungBo Min GATE(CLK_GOUT_FSYS1_IPCLKPORT_PCIE_SUB_CON_X1_MSTR_ACLK_SOC, 875*85cc5be6SGyoungBo Min "pcie_top_ipclkport_pcie_sub_con_x1_mstr_aclk_soc", "mout_fsys1_bus_user", 876*85cc5be6SGyoungBo Min CLK_CON_PCIE_TOP_IPCLKPORT_PCIE_SUB_CON_X1_MSTR_ACLK_SOC, 877*85cc5be6SGyoungBo Min 21, CLK_SET_RATE_PARENT | CLK_IS_CRITICAL, 0), 878*85cc5be6SGyoungBo Min GATE(CLK_GOUT_FSYS1_IPCLKPORT_PCIE_SUB_CON_X1_SLV_ACLK_SOC, 879*85cc5be6SGyoungBo Min "pcie_top_ipclkport_pcie_sub_con_x1_slv_aclk_soc", "mout_fsys1_bus_user", 880*85cc5be6SGyoungBo Min CLK_CON_PCIE_TOP_IPCLKPORT_PCIE_SUB_CON_X1_SLV_ACLK_SOC, 881*85cc5be6SGyoungBo Min 21, CLK_SET_RATE_PARENT | CLK_IS_CRITICAL, 0), 882*85cc5be6SGyoungBo Min GATE(CLK_GOUT_FSYS1_IPCLKPORT_PCIE_SUB_CON_X2_DBI_ACLK_SOC, 883*85cc5be6SGyoungBo Min "pcie_top_ipclkport_pcie_sub_con_x2_dbi_aclk_soc", "dout_fsys1_bus_300", 884*85cc5be6SGyoungBo Min CLK_CON_PCIE_TOP_IPCLKPORT_PCIE_SUB_CON_X2_DBI_ACLK_SOC, 885*85cc5be6SGyoungBo Min 21, CLK_SET_RATE_PARENT | CLK_IS_CRITICAL, 0), 886*85cc5be6SGyoungBo Min GATE(CLK_GOUT_FSYS1_IPCLKPORT_PCIE_SUB_CON_X2_MSTR_ACLK_SOC, 887*85cc5be6SGyoungBo Min "pcie_top_ipclkport_pcie_sub_con_x2_mstr_aclk_soc", "mout_fsys1_bus_user", 888*85cc5be6SGyoungBo Min CLK_CON_PCIE_TOP_IPCLKPORT_PCIE_SUB_CON_X2_MSTR_ACLK_SOC, 889*85cc5be6SGyoungBo Min 21, CLK_SET_RATE_PARENT | CLK_IS_CRITICAL, 0), 890*85cc5be6SGyoungBo Min GATE(CLK_GOUT_FSYS1_IPCLKPORT_PCIE_SUB_CON_X2_SLV_ACLK_SOC, 891*85cc5be6SGyoungBo Min "pcie_top_ipclkport_pcie_sub_con_x2_slv_aclk_soc", "mout_fsys1_bus_user", 892*85cc5be6SGyoungBo Min CLK_CON_PCIE_TOP_IPCLKPORT_PCIE_SUB_CON_X2_SLV_ACLK_SOC, 893*85cc5be6SGyoungBo Min 21, CLK_SET_RATE_PARENT | CLK_IS_CRITICAL, 0), 894*85cc5be6SGyoungBo Min GATE(CLK_GOUT_FSYS1_USB20DRD_IPCLKPORT_ACLK_PHYCTRL_20, 895*85cc5be6SGyoungBo Min "usb20drd_ipclkport_aclk_phyctrl_20", "dout_fsys1_bus_300", 896*85cc5be6SGyoungBo Min CLK_CON_USB20DRD_IPCLKPORT_ACLK_PHYCTRL_20, 897*85cc5be6SGyoungBo Min 21, CLK_SET_RATE_PARENT | CLK_IS_CRITICAL, 0), 898*85cc5be6SGyoungBo Min GATE(CLK_GOUT_FSYS1_USB20DRD_IPCLKPORT_BUS_CLK_EARLY, "usb20drd_ipclkport_bus_clk_early", 899*85cc5be6SGyoungBo Min "dout_fsys1_bus_300", CLK_CON_USB20DRD_IPCLKPORT_BUS_CLK_EARLY, 900*85cc5be6SGyoungBo Min 21, CLK_SET_RATE_PARENT | CLK_IS_CRITICAL, 0), 901*85cc5be6SGyoungBo Min GATE(CLK_GOUT_FSYS1_XHB_AHBBR_FSYS1_IPCLKPORT_CLK, "xhb_ahbbr_fsys1_ipclkport_clk", 902*85cc5be6SGyoungBo Min "dout_fsys1_bus_300", CLK_CON_XHB_AHBBR_FSYS1_IPCLKPORT_CLK, 903*85cc5be6SGyoungBo Min 21, CLK_SET_RATE_PARENT | CLK_IS_CRITICAL, 0), 904*85cc5be6SGyoungBo Min GATE(CLK_GOUT_FSYS1_XHB_USB_IPCLKPORT_CLK, "xhb_usb_ipclkport_clk", "dout_fsys1_bus_300", 905*85cc5be6SGyoungBo Min CLK_CON_XHB_USB_IPCLKPORT_CLK, 21, CLK_SET_RATE_PARENT | CLK_IS_CRITICAL, 0), 906*85cc5be6SGyoungBo Min GATE(0, "qch_con_mmu_fsys1_qch_u_tbu_0_0", "mout_fsys1_bus_user", 907*85cc5be6SGyoungBo Min CLK_CON_QCH_CON_MMU_FSYS1_QCH_U_TBU_0_0, 1, CLK_SET_RATE_PARENT | CLK_IS_CRITICAL, 0), 908*85cc5be6SGyoungBo Min GATE(0, "qch_con_mmu_fsys1_qch_u_tbu_1_0", "mout_fsys1_bus_user", 909*85cc5be6SGyoungBo Min CLK_CON_QCH_CON_MMU_FSYS1_QCH_U_TBU_1_0, 1, CLK_SET_RATE_PARENT | CLK_IS_CRITICAL, 0), 910*85cc5be6SGyoungBo Min }; 911*85cc5be6SGyoungBo Min 912*85cc5be6SGyoungBo Min static const struct samsung_cmu_info cmu_fsys1_info __initconst = { 913*85cc5be6SGyoungBo Min .pll_clks = cmu_fsys1_pll_clks, 914*85cc5be6SGyoungBo Min .nr_pll_clks = ARRAY_SIZE(cmu_fsys1_pll_clks), 915*85cc5be6SGyoungBo Min .mux_clks = cmu_fsys1_mux_clks, 916*85cc5be6SGyoungBo Min .nr_mux_clks = ARRAY_SIZE(cmu_fsys1_mux_clks), 917*85cc5be6SGyoungBo Min .div_clks = cmu_fsys1_div_clks, 918*85cc5be6SGyoungBo Min .nr_div_clks = ARRAY_SIZE(cmu_fsys1_div_clks), 919*85cc5be6SGyoungBo Min .gate_clks = cmu_fsys1_gate_clks, 920*85cc5be6SGyoungBo Min .nr_gate_clks = ARRAY_SIZE(cmu_fsys1_gate_clks), 921*85cc5be6SGyoungBo Min .nr_clk_ids = CMU_FSYS1_NR_CLK, 922*85cc5be6SGyoungBo Min .clk_regs = cmu_fsys1_clk_regs, 923*85cc5be6SGyoungBo Min .nr_clk_regs = ARRAY_SIZE(cmu_fsys1_clk_regs), 924*85cc5be6SGyoungBo Min }; 925*85cc5be6SGyoungBo Min 926*85cc5be6SGyoungBo Min /* Register Offset definitions for CMU_IMEM (0x10010000) */ 927*85cc5be6SGyoungBo Min #define PLL_CON0_MUX_CLK_IMEM_ACLK_USER 0x0100 928*85cc5be6SGyoungBo Min #define PLL_CON0_MUX_CLK_IMEM_CA5_USER 0x0120 929*85cc5be6SGyoungBo Min #define PLL_CON0_MUX_CLK_IMEM_JPEG_USER 0x0140 930*85cc5be6SGyoungBo Min #define PLL_CON0_MUX_CLK_IMEM_SSS_USER 0x0160 931*85cc5be6SGyoungBo Min #define CLK_CON_MCT0_IPCLKPORT_PCLK 0x20b4 932*85cc5be6SGyoungBo Min #define CLK_CON_MCT1_IPCLKPORT_PCLK 0x20b8 933*85cc5be6SGyoungBo Min #define CLK_CON_MCT2_IPCLKPORT_PCLK 0x20bc 934*85cc5be6SGyoungBo Min #define CLK_CON_MCT3_IPCLKPORT_PCLK 0x20c0 935*85cc5be6SGyoungBo Min #define CLK_CON_TMU_APB_IPCLKPORT_PCLK 0x20d4 936*85cc5be6SGyoungBo Min #define CLK_CON_DMYQCH_CON_CA5_0_QCH 0x3008 937*85cc5be6SGyoungBo Min #define CLK_CON_DMYQCH_CON_CA5_1_QCH 0x3018 938*85cc5be6SGyoungBo Min #define CLK_CON_DMYQCH_CON_INTMEM_QCH 0x3020 939*85cc5be6SGyoungBo Min #define CLK_CON_QCH_CON_GIC_CA55_QCHANNEL_SLAVE_0 0x306c 940*85cc5be6SGyoungBo Min #define CLK_CON_QCH_CON_GIC_CA5_0_QCH 0x3078 941*85cc5be6SGyoungBo Min #define CLK_CON_QCH_CON_GIC_CA5_1_QCH 0x307c 942*85cc5be6SGyoungBo Min #define CLK_CON_QCH_CON_MMU_IMEM_QCH_U_TBU_0_0 0x30ac 943*85cc5be6SGyoungBo Min #define CLK_CON_QCH_CON_MMU_IMEM_QCH_U_TBU_1_0 0x30b4 944*85cc5be6SGyoungBo Min 945*85cc5be6SGyoungBo Min static const unsigned long cmu_imem_clk_regs[] __initconst = { 946*85cc5be6SGyoungBo Min PLL_CON0_MUX_CLK_IMEM_ACLK_USER, 947*85cc5be6SGyoungBo Min PLL_CON0_MUX_CLK_IMEM_CA5_USER, 948*85cc5be6SGyoungBo Min PLL_CON0_MUX_CLK_IMEM_JPEG_USER, 949*85cc5be6SGyoungBo Min PLL_CON0_MUX_CLK_IMEM_SSS_USER, 950*85cc5be6SGyoungBo Min CLK_CON_MCT0_IPCLKPORT_PCLK, 951*85cc5be6SGyoungBo Min CLK_CON_MCT1_IPCLKPORT_PCLK, 952*85cc5be6SGyoungBo Min CLK_CON_MCT2_IPCLKPORT_PCLK, 953*85cc5be6SGyoungBo Min CLK_CON_MCT3_IPCLKPORT_PCLK, 954*85cc5be6SGyoungBo Min CLK_CON_TMU_APB_IPCLKPORT_PCLK, 955*85cc5be6SGyoungBo Min CLK_CON_DMYQCH_CON_CA5_0_QCH, 956*85cc5be6SGyoungBo Min CLK_CON_DMYQCH_CON_CA5_1_QCH, 957*85cc5be6SGyoungBo Min CLK_CON_DMYQCH_CON_INTMEM_QCH, 958*85cc5be6SGyoungBo Min CLK_CON_QCH_CON_GIC_CA55_QCHANNEL_SLAVE_0, 959*85cc5be6SGyoungBo Min CLK_CON_QCH_CON_GIC_CA5_0_QCH, 960*85cc5be6SGyoungBo Min CLK_CON_QCH_CON_GIC_CA5_1_QCH, 961*85cc5be6SGyoungBo Min CLK_CON_QCH_CON_MMU_IMEM_QCH_U_TBU_0_0, 962*85cc5be6SGyoungBo Min CLK_CON_QCH_CON_MMU_IMEM_QCH_U_TBU_1_0 963*85cc5be6SGyoungBo Min }; 964*85cc5be6SGyoungBo Min 965*85cc5be6SGyoungBo Min PNAME(mout_imem_aclk_user_p) = { "fin_pll", "dout_clkcmu_imem_aclk" }; 966*85cc5be6SGyoungBo Min PNAME(mout_imem_ca5_user_p) = { "fin_pll", "dout_clkcmu_imem_ca5" }; 967*85cc5be6SGyoungBo Min PNAME(mout_imem_jpeg_user_p) = { "fin_pll", "dout_clkcmu_imem_jpeg" }; 968*85cc5be6SGyoungBo Min PNAME(mout_imem_sss_user_p) = { "fin_pll", "dout_clkcmu_imem_sss" }; 969*85cc5be6SGyoungBo Min 970*85cc5be6SGyoungBo Min static const struct samsung_mux_clock cmu_imem_mux_clks[] __initconst = { 971*85cc5be6SGyoungBo Min MUX(CLK_MOUT_IMEM_ACLK_USER, "mout_clk_imem_aclk_user", 972*85cc5be6SGyoungBo Min mout_imem_aclk_user_p, PLL_CON0_MUX_CLK_IMEM_ACLK_USER, 4, 1), 973*85cc5be6SGyoungBo Min MUX(CLK_MOUT_IMEM_CA5_USER, "mout_clk_imem_ca5_user", 974*85cc5be6SGyoungBo Min mout_imem_ca5_user_p, PLL_CON0_MUX_CLK_IMEM_CA5_USER, 4, 1), 975*85cc5be6SGyoungBo Min MUX(CLK_MOUT_IMEM_SSS_USER, "mout_clk_imem_sss_user", 976*85cc5be6SGyoungBo Min mout_imem_sss_user_p, PLL_CON0_MUX_CLK_IMEM_SSS_USER, 4, 1), 977*85cc5be6SGyoungBo Min MUX(CLK_MOUT_IMEM_JPEG_USER, "mout_clk_imem_jpeg_user", 978*85cc5be6SGyoungBo Min mout_imem_jpeg_user_p, PLL_CON0_MUX_CLK_IMEM_JPEG_USER, 4, 1), 979*85cc5be6SGyoungBo Min }; 980*85cc5be6SGyoungBo Min 981*85cc5be6SGyoungBo Min static const struct samsung_fixed_factor_clock imem_ffactor_clks[] __initconst = { 982*85cc5be6SGyoungBo Min FFACTOR(CLK_DOUT_IMEM_PCLK, "dout_clk_imem_pclk", "mout_clk_imem_aclk_user", 1, 2, 0), 983*85cc5be6SGyoungBo Min }; 984*85cc5be6SGyoungBo Min 985*85cc5be6SGyoungBo Min static const struct samsung_gate_clock cmu_imem_gate_clks[] __initconst = { 986*85cc5be6SGyoungBo Min GATE(CLK_GOUT_IMEM_CA5_0_IPCLKPORT_ATCLK, "ca5_0_ipclkport_atclk", 987*85cc5be6SGyoungBo Min "mout_clk_imem_ca5_user", CLK_CON_DMYQCH_CON_CA5_0_QCH, 1, CLK_SET_RATE_PARENT, 0), 988*85cc5be6SGyoungBo Min GATE(CLK_GOUT_IMEM_CA5_0_IPCLKPORT_CLKIN, "ca5_0_ipclkport_clkin", 989*85cc5be6SGyoungBo Min "mout_clk_imem_ca5_user", CLK_CON_DMYQCH_CON_CA5_0_QCH, 1, CLK_SET_RATE_PARENT, 0), 990*85cc5be6SGyoungBo Min GATE(CLK_GOUT_IMEM_CA5_0_IPCLKPORT_PCLK_DBG, "ca5_0_ipclkport_pclk_dbg", 991*85cc5be6SGyoungBo Min "mout_clk_imem_ca5_user", CLK_CON_DMYQCH_CON_CA5_0_QCH, 1, CLK_SET_RATE_PARENT, 0), 992*85cc5be6SGyoungBo Min GATE(CLK_GOUT_IMEM_CA5_1_IPCLKPORT_ATCLK, "ca5_1_ipclkport_atclk", 993*85cc5be6SGyoungBo Min "mout_clk_imem_ca5_user", CLK_CON_DMYQCH_CON_CA5_1_QCH, 1, CLK_SET_RATE_PARENT, 0), 994*85cc5be6SGyoungBo Min GATE(CLK_GOUT_IMEM_CA5_1_IPCLKPORT_CLKIN, "ca5_1_ipclkport_clkin", 995*85cc5be6SGyoungBo Min "mout_clk_imem_ca5_user", CLK_CON_DMYQCH_CON_CA5_1_QCH, 1, CLK_SET_RATE_PARENT, 0), 996*85cc5be6SGyoungBo Min GATE(CLK_GOUT_IMEM_CA5_1_IPCLKPORT_PCLK_DBG, "ca5_1_ipclkport_pclk_dbg", 997*85cc5be6SGyoungBo Min "mout_clk_imem_ca5_user", CLK_CON_DMYQCH_CON_CA5_1_QCH, 1, CLK_SET_RATE_PARENT, 0), 998*85cc5be6SGyoungBo Min GATE(0, "intmem_ipclkport_aclk", "mout_clk_imem_aclk_user", 999*85cc5be6SGyoungBo Min CLK_CON_DMYQCH_CON_INTMEM_QCH, 1, CLK_SET_RATE_PARENT | CLK_IGNORE_UNUSED, 0), 1000*85cc5be6SGyoungBo Min GATE(CLK_GOUT_IMEM_MCT0_PCLK, "mct0", "dout_clk_imem_pclk", 1001*85cc5be6SGyoungBo Min CLK_CON_MCT0_IPCLKPORT_PCLK, 21, CLK_SET_RATE_PARENT | CLK_IS_CRITICAL, 0), 1002*85cc5be6SGyoungBo Min GATE(CLK_GOUT_IMEM_MCT1_PCLK, "mct1", "dout_clk_imem_pclk", 1003*85cc5be6SGyoungBo Min CLK_CON_MCT1_IPCLKPORT_PCLK, 21, CLK_SET_RATE_PARENT | CLK_IS_CRITICAL, 0), 1004*85cc5be6SGyoungBo Min GATE(CLK_GOUT_IMEM_MCT2_PCLK, "mct2", "dout_clk_imem_pclk", 1005*85cc5be6SGyoungBo Min CLK_CON_MCT2_IPCLKPORT_PCLK, 21, CLK_SET_RATE_PARENT | CLK_IS_CRITICAL, 0), 1006*85cc5be6SGyoungBo Min GATE(CLK_GOUT_IMEM_MCT3_PCLK, "mct3", "dout_clk_imem_pclk", 1007*85cc5be6SGyoungBo Min CLK_CON_MCT3_IPCLKPORT_PCLK, 21, CLK_SET_RATE_PARENT | CLK_IS_CRITICAL, 0), 1008*85cc5be6SGyoungBo Min GATE(CLK_GOUT_IMEM_PCLK_TMU0_APBIF, "tmu_apb_ipclkport_pclk", "dout_clk_imem_pclk", 1009*85cc5be6SGyoungBo Min CLK_CON_TMU_APB_IPCLKPORT_PCLK, 21, CLK_SET_RATE_PARENT | CLK_IS_CRITICAL, 0), 1010*85cc5be6SGyoungBo Min GATE(0, "qch_con_gic_ca55_qchannel_slave_0", "dout_clk_imem_pclk", 1011*85cc5be6SGyoungBo Min CLK_CON_QCH_CON_GIC_CA55_QCHANNEL_SLAVE_0, 1, 1012*85cc5be6SGyoungBo Min CLK_SET_RATE_PARENT | CLK_IS_CRITICAL, 0), 1013*85cc5be6SGyoungBo Min GATE(0, "qch_con_gic_ca5_0_qch", "dout_clk_imem_pclk", 1014*85cc5be6SGyoungBo Min CLK_CON_QCH_CON_GIC_CA5_0_QCH, 1, CLK_SET_RATE_PARENT | CLK_IS_CRITICAL, 0), 1015*85cc5be6SGyoungBo Min GATE(0, "qch_con_gic_ca5_1_qch", "dout_clk_imem_pclk", 1016*85cc5be6SGyoungBo Min CLK_CON_QCH_CON_GIC_CA5_1_QCH, 1, CLK_SET_RATE_PARENT | CLK_IS_CRITICAL, 0), 1017*85cc5be6SGyoungBo Min GATE(0, "qch_con_mmu_imem_qch_u_tbu_0_0", "mout_clk_imem_ca5_user", 1018*85cc5be6SGyoungBo Min CLK_CON_QCH_CON_MMU_IMEM_QCH_U_TBU_0_0, 1, CLK_SET_RATE_PARENT | CLK_IS_CRITICAL, 0), 1019*85cc5be6SGyoungBo Min GATE(0, "qch_con_mmu_imem_qch_u_tbu_1_0", "mout_clk_imem_ca5_user", 1020*85cc5be6SGyoungBo Min CLK_CON_QCH_CON_MMU_IMEM_QCH_U_TBU_1_0, 1, CLK_SET_RATE_PARENT | CLK_IS_CRITICAL, 0), 1021*85cc5be6SGyoungBo Min }; 1022*85cc5be6SGyoungBo Min 1023*85cc5be6SGyoungBo Min static const struct samsung_cmu_info cmu_imem_info __initconst = { 1024*85cc5be6SGyoungBo Min .fixed_factor_clks = imem_ffactor_clks, 1025*85cc5be6SGyoungBo Min .nr_fixed_factor_clks = ARRAY_SIZE(imem_ffactor_clks), 1026*85cc5be6SGyoungBo Min .mux_clks = cmu_imem_mux_clks, 1027*85cc5be6SGyoungBo Min .nr_mux_clks = ARRAY_SIZE(cmu_imem_mux_clks), 1028*85cc5be6SGyoungBo Min .gate_clks = cmu_imem_gate_clks, 1029*85cc5be6SGyoungBo Min .nr_gate_clks = ARRAY_SIZE(cmu_imem_gate_clks), 1030*85cc5be6SGyoungBo Min .nr_clk_ids = CMU_IMEM_NR_CLK, 1031*85cc5be6SGyoungBo Min .clk_regs = cmu_imem_clk_regs, 1032*85cc5be6SGyoungBo Min .nr_clk_regs = ARRAY_SIZE(cmu_imem_clk_regs), 1033*85cc5be6SGyoungBo Min }; 1034*85cc5be6SGyoungBo Min 1035*85cc5be6SGyoungBo Min static void __init artpec9_cmu_imem_init(struct device_node *np) 1036*85cc5be6SGyoungBo Min { 1037*85cc5be6SGyoungBo Min exynos_arm64_register_cmu(NULL, np, &cmu_imem_info); 1038*85cc5be6SGyoungBo Min } 1039*85cc5be6SGyoungBo Min 1040*85cc5be6SGyoungBo Min CLK_OF_DECLARE(artpec9_cmu_imem, "axis,artpec9-cmu-imem", artpec9_cmu_imem_init); 1041*85cc5be6SGyoungBo Min 1042*85cc5be6SGyoungBo Min /* Register Offset definitions for CMU_PERI (0x14010000) */ 1043*85cc5be6SGyoungBo Min #define PLL_CON0_MUX_CLK_PERI_DISP_USER 0x0100 1044*85cc5be6SGyoungBo Min #define PLL_CON0_MUX_CLK_PERI_IP_USER 0x0120 1045*85cc5be6SGyoungBo Min #define CLK_CON_DIV_CLK_PERI_125 0x1800 1046*85cc5be6SGyoungBo Min #define CLK_CON_DIV_CLK_PERI_PCLK 0x180c 1047*85cc5be6SGyoungBo Min #define CLK_CON_DIV_CLK_PERI_SPI 0x1810 1048*85cc5be6SGyoungBo Min #define CLK_CON_DIV_CLK_PERI_UART1 0x1814 1049*85cc5be6SGyoungBo Min #define CLK_CON_DIV_CLK_PERI_UART2 0x1818 1050*85cc5be6SGyoungBo Min #define CLK_CON_APB_ASYNC_DSIM_IPCLKPORT_PCLKS 0x2000 1051*85cc5be6SGyoungBo Min #define CLK_CON_PERI_I2C2_IPCLKPORT_I_PCLK 0x202c 1052*85cc5be6SGyoungBo Min #define CLK_CON_PERI_I2C3_IPCLKPORT_I_PCLK 0x2030 1053*85cc5be6SGyoungBo Min #define CLK_CON_PERI_SPI0_IPCLKPORT_I_PCLK 0x2054 1054*85cc5be6SGyoungBo Min #define CLK_CON_PERI_SPI0_IPCLKPORT_I_SCLK_SPI 0x2058 1055*85cc5be6SGyoungBo Min #define CLK_CON_PERI_UART1_IPCLKPORT_I_PCLK 0x205c 1056*85cc5be6SGyoungBo Min #define CLK_CON_PERI_UART1_IPCLKPORT_I_SCLK_UART 0x2060 1057*85cc5be6SGyoungBo Min #define CLK_CON_PERI_UART2_IPCLKPORT_I_PCLK 0x2064 1058*85cc5be6SGyoungBo Min #define CLK_CON_PERI_UART2_IPCLKPORT_I_SCLK_UART 0x2068 1059*85cc5be6SGyoungBo Min #define CLK_CON_DMYQCH_CON_DMA4DSIM_QCH 0x3000 1060*85cc5be6SGyoungBo Min #define CLK_CON_DMYQCH_CON_PERI_I3C2_QCH 0x3004 1061*85cc5be6SGyoungBo Min #define CLK_CON_DMYQCH_CON_PERI_I3C3_QCH 0x3008 1062*85cc5be6SGyoungBo Min 1063*85cc5be6SGyoungBo Min static const unsigned long cmu_peri_clk_regs[] __initconst = { 1064*85cc5be6SGyoungBo Min PLL_CON0_MUX_CLK_PERI_DISP_USER, 1065*85cc5be6SGyoungBo Min PLL_CON0_MUX_CLK_PERI_IP_USER, 1066*85cc5be6SGyoungBo Min CLK_CON_DIV_CLK_PERI_125, 1067*85cc5be6SGyoungBo Min CLK_CON_DIV_CLK_PERI_PCLK, 1068*85cc5be6SGyoungBo Min CLK_CON_DIV_CLK_PERI_SPI, 1069*85cc5be6SGyoungBo Min CLK_CON_DIV_CLK_PERI_UART1, 1070*85cc5be6SGyoungBo Min CLK_CON_DIV_CLK_PERI_UART2, 1071*85cc5be6SGyoungBo Min CLK_CON_APB_ASYNC_DSIM_IPCLKPORT_PCLKS, 1072*85cc5be6SGyoungBo Min CLK_CON_PERI_I2C2_IPCLKPORT_I_PCLK, 1073*85cc5be6SGyoungBo Min CLK_CON_PERI_I2C3_IPCLKPORT_I_PCLK, 1074*85cc5be6SGyoungBo Min CLK_CON_PERI_SPI0_IPCLKPORT_I_PCLK, 1075*85cc5be6SGyoungBo Min CLK_CON_PERI_SPI0_IPCLKPORT_I_SCLK_SPI, 1076*85cc5be6SGyoungBo Min CLK_CON_PERI_UART1_IPCLKPORT_I_PCLK, 1077*85cc5be6SGyoungBo Min CLK_CON_PERI_UART1_IPCLKPORT_I_SCLK_UART, 1078*85cc5be6SGyoungBo Min CLK_CON_PERI_UART2_IPCLKPORT_I_PCLK, 1079*85cc5be6SGyoungBo Min CLK_CON_PERI_UART2_IPCLKPORT_I_SCLK_UART, 1080*85cc5be6SGyoungBo Min CLK_CON_DMYQCH_CON_DMA4DSIM_QCH, 1081*85cc5be6SGyoungBo Min CLK_CON_DMYQCH_CON_PERI_I3C2_QCH, 1082*85cc5be6SGyoungBo Min CLK_CON_DMYQCH_CON_PERI_I3C3_QCH, 1083*85cc5be6SGyoungBo Min }; 1084*85cc5be6SGyoungBo Min 1085*85cc5be6SGyoungBo Min PNAME(mout_peri_ip_user_p) = { "fin_pll", "dout_clkcmu_peri_ip" }; 1086*85cc5be6SGyoungBo Min PNAME(mout_peri_disp_user_p) = { "fin_pll", "dout_clkcmu_peri_disp" }; 1087*85cc5be6SGyoungBo Min 1088*85cc5be6SGyoungBo Min static const struct samsung_mux_clock cmu_peri_mux_clks[] __initconst = { 1089*85cc5be6SGyoungBo Min MUX(CLK_MOUT_PERI_IP_USER, "mout_peri_ip_user", mout_peri_ip_user_p, 1090*85cc5be6SGyoungBo Min PLL_CON0_MUX_CLK_PERI_IP_USER, 4, 1), 1091*85cc5be6SGyoungBo Min MUX(CLK_MOUT_PERI_DISP_USER, "mout_peri_disp_user", mout_peri_disp_user_p, 1092*85cc5be6SGyoungBo Min PLL_CON0_MUX_CLK_PERI_DISP_USER, 4, 1), 1093*85cc5be6SGyoungBo Min }; 1094*85cc5be6SGyoungBo Min 1095*85cc5be6SGyoungBo Min static const struct samsung_div_clock cmu_peri_div_clks[] __initconst = { 1096*85cc5be6SGyoungBo Min DIV(CLK_DOUT_PERI_125, "dout_peri_125", "mout_peri_ip_user", 1097*85cc5be6SGyoungBo Min CLK_CON_DIV_CLK_PERI_125, 0, 4), 1098*85cc5be6SGyoungBo Min DIV(CLK_DOUT_PERI_PCLK, "dout_peri_pclk", "mout_peri_ip_user", 1099*85cc5be6SGyoungBo Min CLK_CON_DIV_CLK_PERI_PCLK, 0, 4), 1100*85cc5be6SGyoungBo Min DIV(CLK_DOUT_PERI_SPI, "dout_peri_spi", "mout_peri_ip_user", 1101*85cc5be6SGyoungBo Min CLK_CON_DIV_CLK_PERI_SPI, 0, 13), 1102*85cc5be6SGyoungBo Min DIV(CLK_DOUT_PERI_UART1, "dout_peri_uart1", "mout_peri_ip_user", 1103*85cc5be6SGyoungBo Min CLK_CON_DIV_CLK_PERI_UART1, 0, 10), 1104*85cc5be6SGyoungBo Min DIV(CLK_DOUT_PERI_UART2, "dout_peri_uart2", "mout_peri_ip_user", 1105*85cc5be6SGyoungBo Min CLK_CON_DIV_CLK_PERI_UART2, 0, 10), 1106*85cc5be6SGyoungBo Min }; 1107*85cc5be6SGyoungBo Min 1108*85cc5be6SGyoungBo Min static const struct samsung_gate_clock cmu_peri_gate_clks[] __initconst = { 1109*85cc5be6SGyoungBo Min GATE(CLK_GOUT_PERI_DMA4DSIM_IPCLKPORT_CLK_APB_CLK, "dma4dsim_ipclkport_clk_apb_clk", 1110*85cc5be6SGyoungBo Min "dout_peri_pclk", CLK_CON_DMYQCH_CON_DMA4DSIM_QCH, 1, CLK_SET_RATE_PARENT, 0), 1111*85cc5be6SGyoungBo Min GATE(CLK_GOUT_PERI_DMA4DSIM_IPCLKPORT_CLK_AXI_CLK, "dma4dsim_ipclkport_clk_axi_clk", 1112*85cc5be6SGyoungBo Min "mout_peri_disp_user", CLK_CON_DMYQCH_CON_DMA4DSIM_QCH, 1, CLK_SET_RATE_PARENT, 0), 1113*85cc5be6SGyoungBo Min GATE(CLK_GOUT_PERI_I3C2_IPCLKPORT_I_APB_S_PCLK, "peri_i3c2_ipclkport_i_apb_s_pclk", 1114*85cc5be6SGyoungBo Min "dout_peri_pclk", CLK_CON_DMYQCH_CON_PERI_I3C2_QCH, 1, 1115*85cc5be6SGyoungBo Min CLK_SET_RATE_PARENT | CLK_IS_CRITICAL, 0), 1116*85cc5be6SGyoungBo Min GATE(CLK_GOUT_PERI_I3C2_IPCLKPORT_I_CORE_CLK, "peri_i3c2_ipclkport_i_core_clk", 1117*85cc5be6SGyoungBo Min "dout_peri_125", CLK_CON_DMYQCH_CON_PERI_I3C2_QCH, 1, CLK_SET_RATE_PARENT, 0), 1118*85cc5be6SGyoungBo Min GATE(CLK_GOUT_PERI_I3C2_IPCLKPORT_I_DMA_CLK, "peri_i3c2_ipclkport_i_dma_clk", 1119*85cc5be6SGyoungBo Min "dout_peri_pclk", CLK_CON_DMYQCH_CON_PERI_I3C2_QCH, 1, 1120*85cc5be6SGyoungBo Min CLK_SET_RATE_PARENT | CLK_IS_CRITICAL, 0), 1121*85cc5be6SGyoungBo Min GATE(CLK_GOUT_PERI_I3C2_IPCLKPORT_I_HDR_TX_CLK, "peri_i3c2_ipclkport_i_hdr_tx_clk", 1122*85cc5be6SGyoungBo Min "dout_peri_pclk", CLK_CON_DMYQCH_CON_PERI_I3C2_QCH, 1, 1123*85cc5be6SGyoungBo Min CLK_SET_RATE_PARENT | CLK_IS_CRITICAL, 0), 1124*85cc5be6SGyoungBo Min GATE(CLK_GOUT_PERI_I3C3_IPCLKPORT_I_APB_S_PCLK, "peri_i3c3_ipclkport_i_apb_s_pclk", 1125*85cc5be6SGyoungBo Min "dout_peri_pclk", CLK_CON_DMYQCH_CON_PERI_I3C3_QCH, 1, 1126*85cc5be6SGyoungBo Min CLK_SET_RATE_PARENT | CLK_IS_CRITICAL, 0), 1127*85cc5be6SGyoungBo Min GATE(CLK_GOUT_PERI_I3C3_IPCLKPORT_I_CORE_CLK, "peri_i3c3_ipclkport_i_core_clk", 1128*85cc5be6SGyoungBo Min "dout_peri_125", CLK_CON_DMYQCH_CON_PERI_I3C3_QCH, 1, CLK_SET_RATE_PARENT, 0), 1129*85cc5be6SGyoungBo Min GATE(CLK_GOUT_PERI_I3C3_IPCLKPORT_I_DMA_CLK, "peri_i3c3_ipclkport_i_dma_clk", 1130*85cc5be6SGyoungBo Min "dout_peri_pclk", CLK_CON_DMYQCH_CON_PERI_I3C3_QCH, 1, 1131*85cc5be6SGyoungBo Min CLK_SET_RATE_PARENT | CLK_IS_CRITICAL, 0), 1132*85cc5be6SGyoungBo Min GATE(CLK_GOUT_PERI_I3C3_IPCLKPORT_I_HDR_TX_CLK, "peri_i3c3_ipclkport_i_hdr_tx_clk", 1133*85cc5be6SGyoungBo Min "dout_peri_pclk", CLK_CON_DMYQCH_CON_PERI_I3C3_QCH, 1, 1134*85cc5be6SGyoungBo Min CLK_SET_RATE_PARENT | CLK_IS_CRITICAL, 0), 1135*85cc5be6SGyoungBo Min GATE(CLK_GOUT_PERI_APB_ASYNC_DSIM_IPCLKPORT_PCLKS, "apb_async_dsim_ipclkport_pclks", 1136*85cc5be6SGyoungBo Min "dout_peri_pclk", CLK_CON_APB_ASYNC_DSIM_IPCLKPORT_PCLKS, 21, 1137*85cc5be6SGyoungBo Min CLK_SET_RATE_PARENT | CLK_IS_CRITICAL, 0), 1138*85cc5be6SGyoungBo Min GATE(CLK_GOUT_PERI_I2C2_IPCLKPORT_I_PCLK, "peri_i2c2_ipclkport_i_pclk", 1139*85cc5be6SGyoungBo Min "dout_peri_pclk", CLK_CON_PERI_I2C2_IPCLKPORT_I_PCLK, 21, 1140*85cc5be6SGyoungBo Min CLK_SET_RATE_PARENT | CLK_IS_CRITICAL, 0), 1141*85cc5be6SGyoungBo Min GATE(CLK_GOUT_PERI_I2C3_IPCLKPORT_I_PCLK, "peri_i2c3_ipclkport_i_pclk", 1142*85cc5be6SGyoungBo Min "dout_peri_pclk", CLK_CON_PERI_I2C3_IPCLKPORT_I_PCLK, 21, 1143*85cc5be6SGyoungBo Min CLK_SET_RATE_PARENT | CLK_IS_CRITICAL, 0), 1144*85cc5be6SGyoungBo Min GATE(CLK_GOUT_PERI_SPI0_PCLK, "peri_spi0_ipclkport_i_pclk", 1145*85cc5be6SGyoungBo Min "dout_peri_pclk", CLK_CON_PERI_SPI0_IPCLKPORT_I_PCLK, 21, 1146*85cc5be6SGyoungBo Min CLK_SET_RATE_PARENT | CLK_IS_CRITICAL, 0), 1147*85cc5be6SGyoungBo Min GATE(CLK_GOUT_PERI_SPI0_SCLK_SPI, "peri_spi0_ipclkport_i_sclk_spi", 1148*85cc5be6SGyoungBo Min "dout_peri_spi", CLK_CON_PERI_SPI0_IPCLKPORT_I_SCLK_SPI, 21, 1149*85cc5be6SGyoungBo Min CLK_SET_RATE_PARENT | CLK_IS_CRITICAL, 0), 1150*85cc5be6SGyoungBo Min GATE(CLK_GOUT_PERI_UART1_PCLK, "uart1", "dout_peri_pclk", 1151*85cc5be6SGyoungBo Min CLK_CON_PERI_UART1_IPCLKPORT_I_PCLK, 21, CLK_SET_RATE_PARENT | CLK_IS_CRITICAL, 0), 1152*85cc5be6SGyoungBo Min GATE(CLK_GOUT_PERI_UART1_SCLK_UART, "clk_uart_baud1", "dout_peri_uart1", 1153*85cc5be6SGyoungBo Min CLK_CON_PERI_UART1_IPCLKPORT_I_SCLK_UART, 21, 1154*85cc5be6SGyoungBo Min CLK_SET_RATE_PARENT | CLK_IS_CRITICAL, 0), 1155*85cc5be6SGyoungBo Min GATE(CLK_GOUT_PERI_UART2_PCLK, "uart2", "dout_peri_pclk", 1156*85cc5be6SGyoungBo Min CLK_CON_PERI_UART2_IPCLKPORT_I_PCLK, 21, CLK_SET_RATE_PARENT | CLK_IS_CRITICAL, 0), 1157*85cc5be6SGyoungBo Min GATE(CLK_GOUT_PERI_UART2_SCLK_UART, "clk_uart_baud2", "dout_peri_uart2", 1158*85cc5be6SGyoungBo Min CLK_CON_PERI_UART2_IPCLKPORT_I_SCLK_UART, 1159*85cc5be6SGyoungBo Min 21, CLK_SET_RATE_PARENT | CLK_IS_CRITICAL, 0), 1160*85cc5be6SGyoungBo Min }; 1161*85cc5be6SGyoungBo Min 1162*85cc5be6SGyoungBo Min static const struct samsung_cmu_info cmu_peri_info __initconst = { 1163*85cc5be6SGyoungBo Min .mux_clks = cmu_peri_mux_clks, 1164*85cc5be6SGyoungBo Min .nr_mux_clks = ARRAY_SIZE(cmu_peri_mux_clks), 1165*85cc5be6SGyoungBo Min .div_clks = cmu_peri_div_clks, 1166*85cc5be6SGyoungBo Min .nr_div_clks = ARRAY_SIZE(cmu_peri_div_clks), 1167*85cc5be6SGyoungBo Min .gate_clks = cmu_peri_gate_clks, 1168*85cc5be6SGyoungBo Min .nr_gate_clks = ARRAY_SIZE(cmu_peri_gate_clks), 1169*85cc5be6SGyoungBo Min .nr_clk_ids = CMU_PERI_NR_CLK, 1170*85cc5be6SGyoungBo Min .clk_regs = cmu_peri_clk_regs, 1171*85cc5be6SGyoungBo Min .nr_clk_regs = ARRAY_SIZE(cmu_peri_clk_regs), 1172*85cc5be6SGyoungBo Min }; 1173*85cc5be6SGyoungBo Min 1174*85cc5be6SGyoungBo Min static int __init artpec9_cmu_probe(struct platform_device *pdev) 1175*85cc5be6SGyoungBo Min { 1176*85cc5be6SGyoungBo Min const struct samsung_cmu_info *info; 1177*85cc5be6SGyoungBo Min struct device *dev = &pdev->dev; 1178*85cc5be6SGyoungBo Min 1179*85cc5be6SGyoungBo Min info = of_device_get_match_data(dev); 1180*85cc5be6SGyoungBo Min exynos_arm64_register_cmu(dev, dev->of_node, info); 1181*85cc5be6SGyoungBo Min 1182*85cc5be6SGyoungBo Min return 0; 1183*85cc5be6SGyoungBo Min } 1184*85cc5be6SGyoungBo Min 1185*85cc5be6SGyoungBo Min static const struct of_device_id artpec9_cmu_of_match[] = { 1186*85cc5be6SGyoungBo Min { 1187*85cc5be6SGyoungBo Min .compatible = "axis,artpec9-cmu-cmu", 1188*85cc5be6SGyoungBo Min .data = &cmu_cmu_info, 1189*85cc5be6SGyoungBo Min }, { 1190*85cc5be6SGyoungBo Min .compatible = "axis,artpec9-cmu-bus", 1191*85cc5be6SGyoungBo Min .data = &cmu_bus_info, 1192*85cc5be6SGyoungBo Min }, { 1193*85cc5be6SGyoungBo Min .compatible = "axis,artpec9-cmu-core", 1194*85cc5be6SGyoungBo Min .data = &cmu_core_info, 1195*85cc5be6SGyoungBo Min }, { 1196*85cc5be6SGyoungBo Min .compatible = "axis,artpec9-cmu-cpucl", 1197*85cc5be6SGyoungBo Min .data = &cmu_cpucl_info, 1198*85cc5be6SGyoungBo Min }, { 1199*85cc5be6SGyoungBo Min .compatible = "axis,artpec9-cmu-fsys0", 1200*85cc5be6SGyoungBo Min .data = &cmu_fsys0_info, 1201*85cc5be6SGyoungBo Min }, { 1202*85cc5be6SGyoungBo Min .compatible = "axis,artpec9-cmu-fsys1", 1203*85cc5be6SGyoungBo Min .data = &cmu_fsys1_info, 1204*85cc5be6SGyoungBo Min }, { 1205*85cc5be6SGyoungBo Min .compatible = "axis,artpec9-cmu-peri", 1206*85cc5be6SGyoungBo Min .data = &cmu_peri_info, 1207*85cc5be6SGyoungBo Min }, { 1208*85cc5be6SGyoungBo Min }, 1209*85cc5be6SGyoungBo Min }; 1210*85cc5be6SGyoungBo Min 1211*85cc5be6SGyoungBo Min static struct platform_driver artpec9_cmu_driver __refdata = { 1212*85cc5be6SGyoungBo Min .driver = { 1213*85cc5be6SGyoungBo Min .name = "artpec9-cmu", 1214*85cc5be6SGyoungBo Min .of_match_table = artpec9_cmu_of_match, 1215*85cc5be6SGyoungBo Min .suppress_bind_attrs = true, 1216*85cc5be6SGyoungBo Min }, 1217*85cc5be6SGyoungBo Min .probe = artpec9_cmu_probe, 1218*85cc5be6SGyoungBo Min }; 1219*85cc5be6SGyoungBo Min 1220*85cc5be6SGyoungBo Min static int __init artpec9_cmu_init(void) 1221*85cc5be6SGyoungBo Min { 1222*85cc5be6SGyoungBo Min return platform_driver_register(&artpec9_cmu_driver); 1223*85cc5be6SGyoungBo Min } 1224*85cc5be6SGyoungBo Min core_initcall(artpec9_cmu_init); 1225