1*fb038ce4SYangtao Li // SPDX-License-Identifier: GPL-2.0 2*fb038ce4SYangtao Li /* 3*fb038ce4SYangtao Li * Copyright (c) 2020 Yangtao Li <frank@allwinnertech.com> 4*fb038ce4SYangtao Li */ 5*fb038ce4SYangtao Li 6*fb038ce4SYangtao Li #include <linux/clk-provider.h> 7*fb038ce4SYangtao Li #include <linux/io.h> 8*fb038ce4SYangtao Li #include <linux/module.h> 9*fb038ce4SYangtao Li #include <linux/of_address.h> 10*fb038ce4SYangtao Li #include <linux/platform_device.h> 11*fb038ce4SYangtao Li 12*fb038ce4SYangtao Li #include "ccu_common.h" 13*fb038ce4SYangtao Li #include "ccu_reset.h" 14*fb038ce4SYangtao Li 15*fb038ce4SYangtao Li #include "ccu_div.h" 16*fb038ce4SYangtao Li #include "ccu_gate.h" 17*fb038ce4SYangtao Li #include "ccu_mp.h" 18*fb038ce4SYangtao Li #include "ccu_mult.h" 19*fb038ce4SYangtao Li #include "ccu_nk.h" 20*fb038ce4SYangtao Li #include "ccu_nkm.h" 21*fb038ce4SYangtao Li #include "ccu_nkmp.h" 22*fb038ce4SYangtao Li #include "ccu_nm.h" 23*fb038ce4SYangtao Li 24*fb038ce4SYangtao Li #include "ccu-sun50i-a100.h" 25*fb038ce4SYangtao Li 26*fb038ce4SYangtao Li #define SUN50I_A100_PLL_SDM_ENABLE BIT(24) 27*fb038ce4SYangtao Li #define SUN50I_A100_PLL_OUTPUT_ENABLE BIT(27) 28*fb038ce4SYangtao Li #define SUN50I_A100_PLL_LOCK BIT(28) 29*fb038ce4SYangtao Li #define SUN50I_A100_PLL_LOCK_ENABLE BIT(29) 30*fb038ce4SYangtao Li #define SUN50I_A100_PLL_ENABLE BIT(31) 31*fb038ce4SYangtao Li 32*fb038ce4SYangtao Li #define SUN50I_A100_PLL_PERIPH1_PATTERN0 0xd1303333 33*fb038ce4SYangtao Li 34*fb038ce4SYangtao Li /* 35*fb038ce4SYangtao Li * The CPU PLL is actually NP clock, with P being /1, /2 or /4. However 36*fb038ce4SYangtao Li * P should only be used for output frequencies lower than 288 MHz. 37*fb038ce4SYangtao Li * 38*fb038ce4SYangtao Li * For now we can just model it as a multiplier clock, and force P to /1. 39*fb038ce4SYangtao Li * 40*fb038ce4SYangtao Li * The M factor is present in the register's description, but not in the 41*fb038ce4SYangtao Li * frequency formula, and it's documented as "M is only used for backdoor 42*fb038ce4SYangtao Li * testing", so it's not modelled and then force to 0. 43*fb038ce4SYangtao Li */ 44*fb038ce4SYangtao Li #define SUN50I_A100_PLL_CPUX_REG 0x000 45*fb038ce4SYangtao Li static struct ccu_mult pll_cpux_clk = { 46*fb038ce4SYangtao Li .enable = SUN50I_A100_PLL_OUTPUT_ENABLE, 47*fb038ce4SYangtao Li .lock = SUN50I_A100_PLL_LOCK, 48*fb038ce4SYangtao Li .mult = _SUNXI_CCU_MULT_MIN(8, 8, 12), 49*fb038ce4SYangtao Li .common = { 50*fb038ce4SYangtao Li .reg = 0x000, 51*fb038ce4SYangtao Li .hw.init = CLK_HW_INIT("pll-cpux", "dcxo24M", 52*fb038ce4SYangtao Li &ccu_mult_ops, 53*fb038ce4SYangtao Li CLK_SET_RATE_UNGATE), 54*fb038ce4SYangtao Li }, 55*fb038ce4SYangtao Li }; 56*fb038ce4SYangtao Li 57*fb038ce4SYangtao Li /* Some PLLs are input * N / div1 / P. Model them as NKMP with no K */ 58*fb038ce4SYangtao Li #define SUN50I_A100_PLL_DDR0_REG 0x010 59*fb038ce4SYangtao Li static struct ccu_nkmp pll_ddr0_clk = { 60*fb038ce4SYangtao Li .enable = SUN50I_A100_PLL_OUTPUT_ENABLE, 61*fb038ce4SYangtao Li .lock = SUN50I_A100_PLL_LOCK, 62*fb038ce4SYangtao Li .n = _SUNXI_CCU_MULT_MIN(8, 8, 12), 63*fb038ce4SYangtao Li .m = _SUNXI_CCU_DIV(1, 1), /* input divider */ 64*fb038ce4SYangtao Li .p = _SUNXI_CCU_DIV(0, 1), /* output divider */ 65*fb038ce4SYangtao Li .common = { 66*fb038ce4SYangtao Li .reg = 0x010, 67*fb038ce4SYangtao Li .hw.init = CLK_HW_INIT("pll-ddr0", "dcxo24M", 68*fb038ce4SYangtao Li &ccu_nkmp_ops, 69*fb038ce4SYangtao Li CLK_SET_RATE_UNGATE | 70*fb038ce4SYangtao Li CLK_IS_CRITICAL), 71*fb038ce4SYangtao Li }, 72*fb038ce4SYangtao Li }; 73*fb038ce4SYangtao Li 74*fb038ce4SYangtao Li #define SUN50I_A100_PLL_PERIPH0_REG 0x020 75*fb038ce4SYangtao Li static struct ccu_nkmp pll_periph0_clk = { 76*fb038ce4SYangtao Li .enable = SUN50I_A100_PLL_OUTPUT_ENABLE, 77*fb038ce4SYangtao Li .lock = SUN50I_A100_PLL_LOCK, 78*fb038ce4SYangtao Li .n = _SUNXI_CCU_MULT_MIN(8, 8, 12), 79*fb038ce4SYangtao Li .m = _SUNXI_CCU_DIV(1, 1), /* input divider */ 80*fb038ce4SYangtao Li .p = _SUNXI_CCU_DIV(0, 1), /* output divider */ 81*fb038ce4SYangtao Li .fixed_post_div = 2, 82*fb038ce4SYangtao Li .common = { 83*fb038ce4SYangtao Li .reg = 0x020, 84*fb038ce4SYangtao Li .features = CCU_FEATURE_FIXED_POSTDIV, 85*fb038ce4SYangtao Li .hw.init = CLK_HW_INIT("pll-periph0", "dcxo24M", 86*fb038ce4SYangtao Li &ccu_nkmp_ops, 87*fb038ce4SYangtao Li CLK_SET_RATE_UNGATE), 88*fb038ce4SYangtao Li }, 89*fb038ce4SYangtao Li }; 90*fb038ce4SYangtao Li 91*fb038ce4SYangtao Li #define SUN50I_A100_PLL_PERIPH1_REG 0x028 92*fb038ce4SYangtao Li static struct ccu_nkmp pll_periph1_clk = { 93*fb038ce4SYangtao Li .enable = SUN50I_A100_PLL_OUTPUT_ENABLE, 94*fb038ce4SYangtao Li .lock = SUN50I_A100_PLL_LOCK, 95*fb038ce4SYangtao Li .n = _SUNXI_CCU_MULT_MIN(8, 8, 12), 96*fb038ce4SYangtao Li .m = _SUNXI_CCU_DIV(1, 1), /* input divider */ 97*fb038ce4SYangtao Li .p = _SUNXI_CCU_DIV(0, 1), /* output divider */ 98*fb038ce4SYangtao Li .fixed_post_div = 2, 99*fb038ce4SYangtao Li .common = { 100*fb038ce4SYangtao Li .reg = 0x028, 101*fb038ce4SYangtao Li .features = CCU_FEATURE_FIXED_POSTDIV, 102*fb038ce4SYangtao Li .hw.init = CLK_HW_INIT("pll-periph1", "dcxo24M", 103*fb038ce4SYangtao Li &ccu_nkmp_ops, 104*fb038ce4SYangtao Li CLK_SET_RATE_UNGATE), 105*fb038ce4SYangtao Li }, 106*fb038ce4SYangtao Li }; 107*fb038ce4SYangtao Li #define SUN50I_A100_PLL_PERIPH1_PATTERN0_REG 0x128 108*fb038ce4SYangtao Li 109*fb038ce4SYangtao Li #define SUN50I_A100_PLL_GPU_REG 0x030 110*fb038ce4SYangtao Li static struct ccu_nkmp pll_gpu_clk = { 111*fb038ce4SYangtao Li .enable = SUN50I_A100_PLL_OUTPUT_ENABLE, 112*fb038ce4SYangtao Li .lock = SUN50I_A100_PLL_LOCK, 113*fb038ce4SYangtao Li .n = _SUNXI_CCU_MULT_MIN(8, 8, 12), 114*fb038ce4SYangtao Li .m = _SUNXI_CCU_DIV(1, 1), /* input divider */ 115*fb038ce4SYangtao Li .p = _SUNXI_CCU_DIV(0, 1), /* output divider */ 116*fb038ce4SYangtao Li .common = { 117*fb038ce4SYangtao Li .reg = 0x030, 118*fb038ce4SYangtao Li .hw.init = CLK_HW_INIT("pll-gpu", "dcxo24M", 119*fb038ce4SYangtao Li &ccu_nkmp_ops, 120*fb038ce4SYangtao Li CLK_SET_RATE_UNGATE), 121*fb038ce4SYangtao Li }, 122*fb038ce4SYangtao Li }; 123*fb038ce4SYangtao Li 124*fb038ce4SYangtao Li /* 125*fb038ce4SYangtao Li * For Video PLLs, the output divider is described as "used for testing" 126*fb038ce4SYangtao Li * in the user manual. So it's not modelled and forced to 0. 127*fb038ce4SYangtao Li */ 128*fb038ce4SYangtao Li #define SUN50I_A100_PLL_VIDEO0_REG 0x040 129*fb038ce4SYangtao Li static struct ccu_nm pll_video0_clk = { 130*fb038ce4SYangtao Li .enable = SUN50I_A100_PLL_OUTPUT_ENABLE, 131*fb038ce4SYangtao Li .lock = SUN50I_A100_PLL_LOCK, 132*fb038ce4SYangtao Li .n = _SUNXI_CCU_MULT_MIN(8, 8, 12), 133*fb038ce4SYangtao Li .m = _SUNXI_CCU_DIV(1, 1), /* input divider */ 134*fb038ce4SYangtao Li .fixed_post_div = 4, 135*fb038ce4SYangtao Li .common = { 136*fb038ce4SYangtao Li .reg = 0x040, 137*fb038ce4SYangtao Li .features = CCU_FEATURE_FIXED_POSTDIV, 138*fb038ce4SYangtao Li .hw.init = CLK_HW_INIT("pll-video0", "dcxo24M", 139*fb038ce4SYangtao Li &ccu_nm_ops, 140*fb038ce4SYangtao Li CLK_SET_RATE_UNGATE), 141*fb038ce4SYangtao Li }, 142*fb038ce4SYangtao Li }; 143*fb038ce4SYangtao Li 144*fb038ce4SYangtao Li #define SUN50I_A100_PLL_VIDEO1_REG 0x048 145*fb038ce4SYangtao Li static struct ccu_nm pll_video1_clk = { 146*fb038ce4SYangtao Li .enable = SUN50I_A100_PLL_OUTPUT_ENABLE, 147*fb038ce4SYangtao Li .lock = SUN50I_A100_PLL_LOCK, 148*fb038ce4SYangtao Li .n = _SUNXI_CCU_MULT_MIN(8, 8, 12), 149*fb038ce4SYangtao Li .m = _SUNXI_CCU_DIV(1, 1), /* input divider */ 150*fb038ce4SYangtao Li .fixed_post_div = 4, 151*fb038ce4SYangtao Li .common = { 152*fb038ce4SYangtao Li .reg = 0x048, 153*fb038ce4SYangtao Li .features = CCU_FEATURE_FIXED_POSTDIV, 154*fb038ce4SYangtao Li .hw.init = CLK_HW_INIT("pll-video1", "dcxo24M", 155*fb038ce4SYangtao Li &ccu_nm_ops, 156*fb038ce4SYangtao Li CLK_SET_RATE_UNGATE), 157*fb038ce4SYangtao Li }, 158*fb038ce4SYangtao Li }; 159*fb038ce4SYangtao Li 160*fb038ce4SYangtao Li #define SUN50I_A100_PLL_VIDEO2_REG 0x050 161*fb038ce4SYangtao Li static struct ccu_nm pll_video2_clk = { 162*fb038ce4SYangtao Li .enable = SUN50I_A100_PLL_OUTPUT_ENABLE, 163*fb038ce4SYangtao Li .lock = SUN50I_A100_PLL_LOCK, 164*fb038ce4SYangtao Li .n = _SUNXI_CCU_MULT_MIN(8, 8, 12), 165*fb038ce4SYangtao Li .m = _SUNXI_CCU_DIV(1, 1), /* input divider */ 166*fb038ce4SYangtao Li .fixed_post_div = 4, 167*fb038ce4SYangtao Li .common = { 168*fb038ce4SYangtao Li .reg = 0x050, 169*fb038ce4SYangtao Li .features = CCU_FEATURE_FIXED_POSTDIV, 170*fb038ce4SYangtao Li .hw.init = CLK_HW_INIT("pll-video2", "dcxo24M", 171*fb038ce4SYangtao Li &ccu_nm_ops, 172*fb038ce4SYangtao Li CLK_SET_RATE_UNGATE), 173*fb038ce4SYangtao Li }, 174*fb038ce4SYangtao Li }; 175*fb038ce4SYangtao Li 176*fb038ce4SYangtao Li #define SUN50I_A100_PLL_VE_REG 0x058 177*fb038ce4SYangtao Li static struct ccu_nkmp pll_ve_clk = { 178*fb038ce4SYangtao Li .enable = SUN50I_A100_PLL_OUTPUT_ENABLE, 179*fb038ce4SYangtao Li .lock = SUN50I_A100_PLL_LOCK, 180*fb038ce4SYangtao Li .n = _SUNXI_CCU_MULT_MIN(8, 8, 12), 181*fb038ce4SYangtao Li .m = _SUNXI_CCU_DIV(1, 1), /* input divider */ 182*fb038ce4SYangtao Li .p = _SUNXI_CCU_DIV(0, 1), /* output divider */ 183*fb038ce4SYangtao Li .common = { 184*fb038ce4SYangtao Li .reg = 0x058, 185*fb038ce4SYangtao Li .hw.init = CLK_HW_INIT("pll-ve", "dcxo24M", 186*fb038ce4SYangtao Li &ccu_nkmp_ops, 187*fb038ce4SYangtao Li CLK_SET_RATE_UNGATE), 188*fb038ce4SYangtao Li }, 189*fb038ce4SYangtao Li }; 190*fb038ce4SYangtao Li 191*fb038ce4SYangtao Li /* 192*fb038ce4SYangtao Li * The COM PLL has m0 dividers in addition to the usual N, M 193*fb038ce4SYangtao Li * factors. Since we only need 1 frequencies from this PLL: 45.1584 MHz, 194*fb038ce4SYangtao Li * ignore it for now. 195*fb038ce4SYangtao Li */ 196*fb038ce4SYangtao Li #define SUN50I_A100_PLL_COM_REG 0x060 197*fb038ce4SYangtao Li static struct ccu_sdm_setting pll_com_sdm_table[] = { 198*fb038ce4SYangtao Li { .rate = 451584000, .pattern = 0xc0014396, .m = 2, .n = 37 }, 199*fb038ce4SYangtao Li }; 200*fb038ce4SYangtao Li 201*fb038ce4SYangtao Li static struct ccu_nm pll_com_clk = { 202*fb038ce4SYangtao Li .enable = SUN50I_A100_PLL_OUTPUT_ENABLE, 203*fb038ce4SYangtao Li .lock = SUN50I_A100_PLL_LOCK, 204*fb038ce4SYangtao Li .n = _SUNXI_CCU_MULT_MIN(8, 8, 12), 205*fb038ce4SYangtao Li .m = _SUNXI_CCU_DIV(0, 1), 206*fb038ce4SYangtao Li .sdm = _SUNXI_CCU_SDM(pll_com_sdm_table, BIT(24), 207*fb038ce4SYangtao Li 0x160, BIT(31)), 208*fb038ce4SYangtao Li .common = { 209*fb038ce4SYangtao Li .reg = 0x060, 210*fb038ce4SYangtao Li .features = CCU_FEATURE_SIGMA_DELTA_MOD, 211*fb038ce4SYangtao Li .hw.init = CLK_HW_INIT("pll-com", "dcxo24M", 212*fb038ce4SYangtao Li &ccu_nm_ops, 213*fb038ce4SYangtao Li CLK_SET_RATE_UNGATE), 214*fb038ce4SYangtao Li }, 215*fb038ce4SYangtao Li }; 216*fb038ce4SYangtao Li 217*fb038ce4SYangtao Li #define SUN50I_A100_PLL_VIDEO3_REG 0x068 218*fb038ce4SYangtao Li static struct ccu_nm pll_video3_clk = { 219*fb038ce4SYangtao Li .enable = SUN50I_A100_PLL_OUTPUT_ENABLE, 220*fb038ce4SYangtao Li .lock = SUN50I_A100_PLL_LOCK, 221*fb038ce4SYangtao Li .n = _SUNXI_CCU_MULT_MIN(8, 8, 12), 222*fb038ce4SYangtao Li .m = _SUNXI_CCU_DIV(1, 1), /* input divider */ 223*fb038ce4SYangtao Li .fixed_post_div = 4, 224*fb038ce4SYangtao Li .common = { 225*fb038ce4SYangtao Li .reg = 0x068, 226*fb038ce4SYangtao Li .features = CCU_FEATURE_FIXED_POSTDIV, 227*fb038ce4SYangtao Li .hw.init = CLK_HW_INIT("pll-video3", "dcxo24M", 228*fb038ce4SYangtao Li &ccu_nm_ops, 229*fb038ce4SYangtao Li CLK_SET_RATE_UNGATE), 230*fb038ce4SYangtao Li }, 231*fb038ce4SYangtao Li }; 232*fb038ce4SYangtao Li 233*fb038ce4SYangtao Li /* 234*fb038ce4SYangtao Li * The Audio PLL has m0, m1 dividers in addition to the usual N, M 235*fb038ce4SYangtao Li * factors. Since we only need 4 frequencies from this PLL: 22.5792 MHz, 236*fb038ce4SYangtao Li * 24.576 MHz, 90.3168MHz and 98.304MHz ignore them for now. 237*fb038ce4SYangtao Li * Enforce the default for them, which is m0 = 1, m1 = 0. 238*fb038ce4SYangtao Li */ 239*fb038ce4SYangtao Li #define SUN50I_A100_PLL_AUDIO_REG 0x078 240*fb038ce4SYangtao Li static struct ccu_sdm_setting pll_audio_sdm_table[] = { 241*fb038ce4SYangtao Li { .rate = 45158400, .pattern = 0xc001bcd3, .m = 18, .n = 33 }, 242*fb038ce4SYangtao Li { .rate = 49152000, .pattern = 0xc001eb85, .m = 20, .n = 40 }, 243*fb038ce4SYangtao Li { .rate = 180633600, .pattern = 0xc001288d, .m = 3, .n = 22 }, 244*fb038ce4SYangtao Li { .rate = 196608000, .pattern = 0xc001eb85, .m = 5, .n = 40 }, 245*fb038ce4SYangtao Li }; 246*fb038ce4SYangtao Li 247*fb038ce4SYangtao Li static struct ccu_nm pll_audio_clk = { 248*fb038ce4SYangtao Li .enable = SUN50I_A100_PLL_OUTPUT_ENABLE, 249*fb038ce4SYangtao Li .lock = SUN50I_A100_PLL_LOCK, 250*fb038ce4SYangtao Li .n = _SUNXI_CCU_MULT_MIN(8, 8, 12), 251*fb038ce4SYangtao Li .m = _SUNXI_CCU_DIV(16, 6), 252*fb038ce4SYangtao Li .fixed_post_div = 2, 253*fb038ce4SYangtao Li .sdm = _SUNXI_CCU_SDM(pll_audio_sdm_table, BIT(24), 254*fb038ce4SYangtao Li 0x178, BIT(31)), 255*fb038ce4SYangtao Li .common = { 256*fb038ce4SYangtao Li .reg = 0x078, 257*fb038ce4SYangtao Li .features = CCU_FEATURE_FIXED_POSTDIV | 258*fb038ce4SYangtao Li CCU_FEATURE_SIGMA_DELTA_MOD, 259*fb038ce4SYangtao Li .hw.init = CLK_HW_INIT("pll-audio", "dcxo24M", 260*fb038ce4SYangtao Li &ccu_nm_ops, 261*fb038ce4SYangtao Li CLK_SET_RATE_UNGATE), 262*fb038ce4SYangtao Li }, 263*fb038ce4SYangtao Li }; 264*fb038ce4SYangtao Li 265*fb038ce4SYangtao Li static const char * const cpux_parents[] = { "dcxo24M", "osc32k", 266*fb038ce4SYangtao Li "iosc", "pll-cpux", 267*fb038ce4SYangtao Li "pll-periph0" }; 268*fb038ce4SYangtao Li static SUNXI_CCU_MUX(cpux_clk, "cpux", cpux_parents, 269*fb038ce4SYangtao Li 0x500, 24, 3, CLK_SET_RATE_PARENT | CLK_IS_CRITICAL); 270*fb038ce4SYangtao Li static SUNXI_CCU_M(axi_clk, "axi", "cpux", 0x500, 0, 2, 0); 271*fb038ce4SYangtao Li static SUNXI_CCU_M(cpux_apb_clk, "cpux-apb", "cpux", 0x500, 8, 2, 0); 272*fb038ce4SYangtao Li 273*fb038ce4SYangtao Li static const char * const psi_ahb1_ahb2_parents[] = { "dcxo24M", "osc32k", 274*fb038ce4SYangtao Li "iosc", "pll-periph0", 275*fb038ce4SYangtao Li "pll-periph0-2x" }; 276*fb038ce4SYangtao Li static SUNXI_CCU_MP_WITH_MUX(psi_ahb1_ahb2_clk, "psi-ahb1-ahb2", 277*fb038ce4SYangtao Li psi_ahb1_ahb2_parents, 0x510, 278*fb038ce4SYangtao Li 0, 2, /* M */ 279*fb038ce4SYangtao Li 8, 2, /* P */ 280*fb038ce4SYangtao Li 24, 3, /* mux */ 281*fb038ce4SYangtao Li 0); 282*fb038ce4SYangtao Li 283*fb038ce4SYangtao Li static const char * const ahb3_apb1_apb2_parents[] = { "dcxo24M", "osc32k", 284*fb038ce4SYangtao Li "psi-ahb1-ahb2", 285*fb038ce4SYangtao Li "pll-periph0", 286*fb038ce4SYangtao Li "pll-periph0-2x" }; 287*fb038ce4SYangtao Li static SUNXI_CCU_MP_WITH_MUX(ahb3_clk, "ahb3", ahb3_apb1_apb2_parents, 0x51c, 288*fb038ce4SYangtao Li 0, 2, /* M */ 289*fb038ce4SYangtao Li 8, 2, /* P */ 290*fb038ce4SYangtao Li 24, 3, /* mux */ 291*fb038ce4SYangtao Li 0); 292*fb038ce4SYangtao Li 293*fb038ce4SYangtao Li static SUNXI_CCU_MP_WITH_MUX(apb1_clk, "apb1", ahb3_apb1_apb2_parents, 0x520, 294*fb038ce4SYangtao Li 0, 2, /* M */ 295*fb038ce4SYangtao Li 8, 2, /* P */ 296*fb038ce4SYangtao Li 24, 3, /* mux */ 297*fb038ce4SYangtao Li 0); 298*fb038ce4SYangtao Li 299*fb038ce4SYangtao Li static SUNXI_CCU_MP_WITH_MUX(apb2_clk, "apb2", ahb3_apb1_apb2_parents, 0x524, 300*fb038ce4SYangtao Li 0, 2, /* M */ 301*fb038ce4SYangtao Li 8, 2, /* P */ 302*fb038ce4SYangtao Li 24, 3, /* mux */ 303*fb038ce4SYangtao Li 0); 304*fb038ce4SYangtao Li 305*fb038ce4SYangtao Li static const char * const mbus_parents[] = { "dcxo24M", "pll-ddr0", 306*fb038ce4SYangtao Li "pll-periph0", 307*fb038ce4SYangtao Li "pll-periph0-2x" }; 308*fb038ce4SYangtao Li static SUNXI_CCU_M_WITH_MUX_GATE(mbus_clk, "mbus", mbus_parents, 0x540, 309*fb038ce4SYangtao Li 0, 3, /* M */ 310*fb038ce4SYangtao Li 24, 2, /* mux */ 311*fb038ce4SYangtao Li BIT(31), /* gate */ 312*fb038ce4SYangtao Li CLK_IS_CRITICAL); 313*fb038ce4SYangtao Li 314*fb038ce4SYangtao Li static const char * const de_parents[] = { "pll-com", "pll-periph0-2x" }; 315*fb038ce4SYangtao Li static SUNXI_CCU_M_WITH_MUX_GATE(de_clk, "de0", de_parents, 0x600, 316*fb038ce4SYangtao Li 0, 4, /* M */ 317*fb038ce4SYangtao Li 24, 1, /* mux */ 318*fb038ce4SYangtao Li BIT(31), /* gate */ 319*fb038ce4SYangtao Li CLK_SET_RATE_PARENT); 320*fb038ce4SYangtao Li 321*fb038ce4SYangtao Li static SUNXI_CCU_GATE(bus_de_clk, "bus-de", "psi-ahb1-ahb2", 322*fb038ce4SYangtao Li 0x60c, BIT(0), 0); 323*fb038ce4SYangtao Li 324*fb038ce4SYangtao Li static const char * const g2d_parents[] = { "pll-com", "pll-periph0-2x", 325*fb038ce4SYangtao Li "pll-video0-2x", "pll-video1-2x", 326*fb038ce4SYangtao Li "pll-video2-2x"}; 327*fb038ce4SYangtao Li static SUNXI_CCU_M_WITH_MUX_GATE(g2d_clk, "g2d", 328*fb038ce4SYangtao Li g2d_parents, 329*fb038ce4SYangtao Li 0x630, 330*fb038ce4SYangtao Li 0, 4, /* M */ 331*fb038ce4SYangtao Li 24, 3, /* mux */ 332*fb038ce4SYangtao Li BIT(31), /* gate */ 333*fb038ce4SYangtao Li 0); 334*fb038ce4SYangtao Li 335*fb038ce4SYangtao Li static SUNXI_CCU_GATE(bus_g2d_clk, "bus-g2d", "psi-ahb1-ahb2", 336*fb038ce4SYangtao Li 0x63c, BIT(0), 0); 337*fb038ce4SYangtao Li 338*fb038ce4SYangtao Li static const char * const gpu_parents[] = { "pll-gpu" }; 339*fb038ce4SYangtao Li static SUNXI_CCU_M_WITH_MUX_GATE(gpu_clk, "gpu", gpu_parents, 0x670, 340*fb038ce4SYangtao Li 0, 2, /* M */ 341*fb038ce4SYangtao Li 24, 1, /* mux */ 342*fb038ce4SYangtao Li BIT(31), /* gate */ 343*fb038ce4SYangtao Li 0); 344*fb038ce4SYangtao Li 345*fb038ce4SYangtao Li static SUNXI_CCU_GATE(bus_gpu_clk, "bus-gpu", "psi-ahb1-ahb2", 346*fb038ce4SYangtao Li 0x67c, BIT(0), 0); 347*fb038ce4SYangtao Li 348*fb038ce4SYangtao Li static const char * const ce_parents[] = { "dcxo24M", "pll-periph0-2x" }; 349*fb038ce4SYangtao Li static SUNXI_CCU_MP_WITH_MUX_GATE(ce_clk, "ce", ce_parents, 0x680, 350*fb038ce4SYangtao Li 0, 4, /* M */ 351*fb038ce4SYangtao Li 8, 2, /* P */ 352*fb038ce4SYangtao Li 24, 1, /* mux */ 353*fb038ce4SYangtao Li BIT(31), /* gate */ 354*fb038ce4SYangtao Li 0); 355*fb038ce4SYangtao Li 356*fb038ce4SYangtao Li static SUNXI_CCU_GATE(bus_ce_clk, "bus-ce", "psi-ahb1-ahb2", 357*fb038ce4SYangtao Li 0x68c, BIT(0), 0); 358*fb038ce4SYangtao Li 359*fb038ce4SYangtao Li static const char * const ve_parents[] = { "pll-ve" }; 360*fb038ce4SYangtao Li static SUNXI_CCU_M_WITH_MUX_GATE(ve_clk, "ve", ve_parents, 0x690, 361*fb038ce4SYangtao Li 0, 3, /* M */ 362*fb038ce4SYangtao Li 24, 1, /* mux */ 363*fb038ce4SYangtao Li BIT(31), /* gate */ 364*fb038ce4SYangtao Li CLK_SET_RATE_PARENT); 365*fb038ce4SYangtao Li 366*fb038ce4SYangtao Li static SUNXI_CCU_GATE(bus_ve_clk, "bus-ve", "psi-ahb1-ahb2", 367*fb038ce4SYangtao Li 0x69c, BIT(0), 0); 368*fb038ce4SYangtao Li 369*fb038ce4SYangtao Li static SUNXI_CCU_GATE(bus_dma_clk, "bus-dma", "psi-ahb1-ahb2", 370*fb038ce4SYangtao Li 0x70c, BIT(0), 0); 371*fb038ce4SYangtao Li 372*fb038ce4SYangtao Li static SUNXI_CCU_GATE(bus_msgbox_clk, "bus-msgbox", "psi-ahb1-ahb2", 373*fb038ce4SYangtao Li 0x71c, BIT(0), 0); 374*fb038ce4SYangtao Li 375*fb038ce4SYangtao Li static SUNXI_CCU_GATE(bus_spinlock_clk, "bus-spinlock", "psi-ahb1-ahb2", 376*fb038ce4SYangtao Li 0x72c, BIT(0), 0); 377*fb038ce4SYangtao Li 378*fb038ce4SYangtao Li static SUNXI_CCU_GATE(bus_hstimer_clk, "bus-hstimer", "psi-ahb1-ahb2", 379*fb038ce4SYangtao Li 0x73c, BIT(0), 0); 380*fb038ce4SYangtao Li 381*fb038ce4SYangtao Li static SUNXI_CCU_GATE(avs_clk, "avs", "dcxo24M", 0x740, BIT(31), 0); 382*fb038ce4SYangtao Li 383*fb038ce4SYangtao Li static SUNXI_CCU_GATE(bus_dbg_clk, "bus-dbg", "psi-ahb1-ahb2", 384*fb038ce4SYangtao Li 0x78c, BIT(0), 0); 385*fb038ce4SYangtao Li 386*fb038ce4SYangtao Li static SUNXI_CCU_GATE(bus_psi_clk, "bus-psi", "psi-ahb1-ahb2", 387*fb038ce4SYangtao Li 0x79c, BIT(0), 0); 388*fb038ce4SYangtao Li 389*fb038ce4SYangtao Li static SUNXI_CCU_GATE(bus_pwm_clk, "bus-pwm", "apb1", 0x7ac, BIT(0), 0); 390*fb038ce4SYangtao Li 391*fb038ce4SYangtao Li static SUNXI_CCU_GATE(bus_iommu_clk, "bus-iommu", "apb1", 0x7bc, BIT(0), 0); 392*fb038ce4SYangtao Li 393*fb038ce4SYangtao Li static SUNXI_CCU_GATE(mbus_dma_clk, "mbus-dma", "mbus", 394*fb038ce4SYangtao Li 0x804, BIT(0), 0); 395*fb038ce4SYangtao Li static SUNXI_CCU_GATE(mbus_ve_clk, "mbus-ve", "mbus", 396*fb038ce4SYangtao Li 0x804, BIT(1), 0); 397*fb038ce4SYangtao Li static SUNXI_CCU_GATE(mbus_ce_clk, "mbus-ce", "mbus", 398*fb038ce4SYangtao Li 0x804, BIT(2), 0); 399*fb038ce4SYangtao Li static SUNXI_CCU_GATE(mbus_nand_clk, "mbus-nand", "mbus", 400*fb038ce4SYangtao Li 0x804, BIT(5), 0); 401*fb038ce4SYangtao Li static SUNXI_CCU_GATE(mbus_csi_clk, "mbus-csi", "mbus", 402*fb038ce4SYangtao Li 0x804, BIT(8), 0); 403*fb038ce4SYangtao Li static SUNXI_CCU_GATE(mbus_isp_clk, "mbus-isp", "mbus", 404*fb038ce4SYangtao Li 0x804, BIT(9), 0); 405*fb038ce4SYangtao Li static SUNXI_CCU_GATE(mbus_g2d_clk, "mbus-g2d", "mbus", 406*fb038ce4SYangtao Li 0x804, BIT(10), 0); 407*fb038ce4SYangtao Li 408*fb038ce4SYangtao Li static SUNXI_CCU_GATE(bus_dram_clk, "bus-dram", "psi-ahb1-ahb2", 409*fb038ce4SYangtao Li 0x80c, BIT(0), CLK_IS_CRITICAL); 410*fb038ce4SYangtao Li 411*fb038ce4SYangtao Li static const char * const nand_spi_parents[] = { "dcxo24M", 412*fb038ce4SYangtao Li "pll-periph0", 413*fb038ce4SYangtao Li "pll-periph1", 414*fb038ce4SYangtao Li "pll-periph0-2x", 415*fb038ce4SYangtao Li "pll-periph1-2x" }; 416*fb038ce4SYangtao Li static SUNXI_CCU_MP_WITH_MUX_GATE(nand0_clk, "nand0", nand_spi_parents, 0x810, 417*fb038ce4SYangtao Li 0, 4, /* M */ 418*fb038ce4SYangtao Li 8, 2, /* P */ 419*fb038ce4SYangtao Li 24, 3, /* mux */ 420*fb038ce4SYangtao Li BIT(31), /* gate */ 421*fb038ce4SYangtao Li 0); 422*fb038ce4SYangtao Li 423*fb038ce4SYangtao Li static SUNXI_CCU_MP_WITH_MUX_GATE(nand1_clk, "nand1", nand_spi_parents, 0x814, 424*fb038ce4SYangtao Li 0, 4, /* M */ 425*fb038ce4SYangtao Li 8, 2, /* P */ 426*fb038ce4SYangtao Li 24, 3, /* mux */ 427*fb038ce4SYangtao Li BIT(31), /* gate */ 428*fb038ce4SYangtao Li 0); 429*fb038ce4SYangtao Li 430*fb038ce4SYangtao Li static SUNXI_CCU_GATE(bus_nand_clk, "bus-nand", "ahb3", 0x82c, BIT(0), 0); 431*fb038ce4SYangtao Li 432*fb038ce4SYangtao Li static const char * const mmc_parents[] = { "dcxo24M", "pll-periph0-2x", 433*fb038ce4SYangtao Li "pll-periph1-2x" }; 434*fb038ce4SYangtao Li static SUNXI_CCU_MP_WITH_MUX_GATE_POSTDIV(mmc0_clk, "mmc0", mmc_parents, 0x830, 435*fb038ce4SYangtao Li 0, 4, /* M */ 436*fb038ce4SYangtao Li 8, 2, /* P */ 437*fb038ce4SYangtao Li 24, 2, /* mux */ 438*fb038ce4SYangtao Li BIT(31), /* gate */ 439*fb038ce4SYangtao Li 2, /* post-div */ 440*fb038ce4SYangtao Li CLK_SET_RATE_NO_REPARENT); 441*fb038ce4SYangtao Li 442*fb038ce4SYangtao Li static SUNXI_CCU_MP_WITH_MUX_GATE_POSTDIV(mmc1_clk, "mmc1", mmc_parents, 0x834, 443*fb038ce4SYangtao Li 0, 4, /* M */ 444*fb038ce4SYangtao Li 8, 2, /* P */ 445*fb038ce4SYangtao Li 24, 2, /* mux */ 446*fb038ce4SYangtao Li BIT(31), /* gate */ 447*fb038ce4SYangtao Li 2, /* post-div */ 448*fb038ce4SYangtao Li CLK_SET_RATE_NO_REPARENT); 449*fb038ce4SYangtao Li 450*fb038ce4SYangtao Li static SUNXI_CCU_MP_WITH_MUX_GATE_POSTDIV(mmc2_clk, "mmc2", mmc_parents, 0x838, 451*fb038ce4SYangtao Li 0, 4, /* M */ 452*fb038ce4SYangtao Li 8, 2, /* P */ 453*fb038ce4SYangtao Li 24, 2, /* mux */ 454*fb038ce4SYangtao Li BIT(31), /* gate */ 455*fb038ce4SYangtao Li 2, /* post-div */ 456*fb038ce4SYangtao Li CLK_SET_RATE_NO_REPARENT); 457*fb038ce4SYangtao Li 458*fb038ce4SYangtao Li static SUNXI_CCU_GATE(bus_mmc0_clk, "bus-mmc0", "ahb3", 0x84c, BIT(0), 0); 459*fb038ce4SYangtao Li static SUNXI_CCU_GATE(bus_mmc1_clk, "bus-mmc1", "ahb3", 0x84c, BIT(1), 0); 460*fb038ce4SYangtao Li static SUNXI_CCU_GATE(bus_mmc2_clk, "bus-mmc2", "ahb3", 0x84c, BIT(2), 0); 461*fb038ce4SYangtao Li 462*fb038ce4SYangtao Li static SUNXI_CCU_GATE(bus_uart0_clk, "bus-uart0", "apb2", 0x90c, BIT(0), 0); 463*fb038ce4SYangtao Li static SUNXI_CCU_GATE(bus_uart1_clk, "bus-uart1", "apb2", 0x90c, BIT(1), 0); 464*fb038ce4SYangtao Li static SUNXI_CCU_GATE(bus_uart2_clk, "bus-uart2", "apb2", 0x90c, BIT(2), 0); 465*fb038ce4SYangtao Li static SUNXI_CCU_GATE(bus_uart3_clk, "bus-uart3", "apb2", 0x90c, BIT(3), 0); 466*fb038ce4SYangtao Li static SUNXI_CCU_GATE(bus_uart4_clk, "bus-uart4", "apb2", 0x90c, BIT(4), 0); 467*fb038ce4SYangtao Li 468*fb038ce4SYangtao Li static SUNXI_CCU_GATE(bus_i2c0_clk, "bus-i2c0", "apb2", 0x91c, BIT(0), 0); 469*fb038ce4SYangtao Li static SUNXI_CCU_GATE(bus_i2c1_clk, "bus-i2c1", "apb2", 0x91c, BIT(1), 0); 470*fb038ce4SYangtao Li static SUNXI_CCU_GATE(bus_i2c2_clk, "bus-i2c2", "apb2", 0x91c, BIT(2), 0); 471*fb038ce4SYangtao Li static SUNXI_CCU_GATE(bus_i2c3_clk, "bus-i2c3", "apb2", 0x91c, BIT(3), 0); 472*fb038ce4SYangtao Li 473*fb038ce4SYangtao Li static SUNXI_CCU_MP_WITH_MUX_GATE(spi0_clk, "spi0", nand_spi_parents, 0x940, 474*fb038ce4SYangtao Li 0, 4, /* M */ 475*fb038ce4SYangtao Li 8, 2, /* P */ 476*fb038ce4SYangtao Li 24, 3, /* mux */ 477*fb038ce4SYangtao Li BIT(31), /* gate */ 478*fb038ce4SYangtao Li 0); 479*fb038ce4SYangtao Li 480*fb038ce4SYangtao Li static SUNXI_CCU_MP_WITH_MUX_GATE(spi1_clk, "spi1", nand_spi_parents, 0x944, 481*fb038ce4SYangtao Li 0, 4, /* M */ 482*fb038ce4SYangtao Li 8, 2, /* P */ 483*fb038ce4SYangtao Li 24, 3, /* mux */ 484*fb038ce4SYangtao Li BIT(31), /* gate */ 485*fb038ce4SYangtao Li 0); 486*fb038ce4SYangtao Li 487*fb038ce4SYangtao Li static SUNXI_CCU_MP_WITH_MUX_GATE(spi2_clk, "spi2", nand_spi_parents, 0x948, 488*fb038ce4SYangtao Li 0, 4, /* M */ 489*fb038ce4SYangtao Li 8, 2, /* P */ 490*fb038ce4SYangtao Li 24, 3, /* mux */ 491*fb038ce4SYangtao Li BIT(31), /* gate */ 492*fb038ce4SYangtao Li 0); 493*fb038ce4SYangtao Li 494*fb038ce4SYangtao Li static SUNXI_CCU_GATE(bus_spi0_clk, "bus-spi0", "ahb3", 0x96c, BIT(0), 0); 495*fb038ce4SYangtao Li static SUNXI_CCU_GATE(bus_spi1_clk, "bus-spi1", "ahb3", 0x96c, BIT(1), 0); 496*fb038ce4SYangtao Li static SUNXI_CCU_GATE(bus_spi2_clk, "bus-spi2", "ahb3", 0x96c, BIT(2), 0); 497*fb038ce4SYangtao Li 498*fb038ce4SYangtao Li static SUNXI_CCU_GATE(emac_25m_clk, "emac-25m", "ahb3", 0x970, 499*fb038ce4SYangtao Li BIT(31) | BIT(30), 0); 500*fb038ce4SYangtao Li 501*fb038ce4SYangtao Li static SUNXI_CCU_GATE(bus_emac_clk, "bus-emac", "ahb3", 0x97c, BIT(0), 0); 502*fb038ce4SYangtao Li 503*fb038ce4SYangtao Li static const char * const ir_parents[] = { "osc32k", "iosc", 504*fb038ce4SYangtao Li "pll-periph0", "pll-periph1" }; 505*fb038ce4SYangtao Li static SUNXI_CCU_MP_WITH_MUX_GATE(ir_rx_clk, "ir-rx", ir_parents, 0x990, 506*fb038ce4SYangtao Li 0, 4, /* M */ 507*fb038ce4SYangtao Li 8, 2, /* P */ 508*fb038ce4SYangtao Li 24, 3, /* mux */ 509*fb038ce4SYangtao Li BIT(31), /* gate */ 510*fb038ce4SYangtao Li 0); 511*fb038ce4SYangtao Li 512*fb038ce4SYangtao Li static SUNXI_CCU_GATE(bus_ir_rx_clk, "bus-ir-rx", "ahb3", 0x99c, BIT(0), 0); 513*fb038ce4SYangtao Li 514*fb038ce4SYangtao Li static SUNXI_CCU_MP_WITH_MUX_GATE(ir_tx_clk, "ir-tx", ir_parents, 0x9c0, 515*fb038ce4SYangtao Li 0, 4, /* M */ 516*fb038ce4SYangtao Li 8, 2, /* P */ 517*fb038ce4SYangtao Li 24, 3, /* mux */ 518*fb038ce4SYangtao Li BIT(31), /* gate */ 519*fb038ce4SYangtao Li 0); 520*fb038ce4SYangtao Li 521*fb038ce4SYangtao Li static SUNXI_CCU_GATE(bus_ir_tx_clk, "bus-ir-tx", "apb1", 0x9cc, BIT(0), 0); 522*fb038ce4SYangtao Li 523*fb038ce4SYangtao Li static SUNXI_CCU_GATE(bus_gpadc_clk, "bus-gpadc", "apb1", 0x9ec, BIT(0), 0); 524*fb038ce4SYangtao Li 525*fb038ce4SYangtao Li static SUNXI_CCU_GATE(bus_ths_clk, "bus-ths", "apb1", 0x9fc, BIT(0), 0); 526*fb038ce4SYangtao Li 527*fb038ce4SYangtao Li static const char * const audio_parents[] = { "pll-audio", "pll-com-audio" }; 528*fb038ce4SYangtao Li static struct ccu_div i2s0_clk = { 529*fb038ce4SYangtao Li .enable = BIT(31), 530*fb038ce4SYangtao Li .div = _SUNXI_CCU_DIV_FLAGS(8, 2, CLK_DIVIDER_POWER_OF_TWO), 531*fb038ce4SYangtao Li .mux = _SUNXI_CCU_MUX(24, 2), 532*fb038ce4SYangtao Li .common = { 533*fb038ce4SYangtao Li .reg = 0xa10, 534*fb038ce4SYangtao Li .hw.init = CLK_HW_INIT_PARENTS("i2s0", 535*fb038ce4SYangtao Li audio_parents, 536*fb038ce4SYangtao Li &ccu_div_ops, 537*fb038ce4SYangtao Li CLK_SET_RATE_PARENT), 538*fb038ce4SYangtao Li }, 539*fb038ce4SYangtao Li }; 540*fb038ce4SYangtao Li 541*fb038ce4SYangtao Li static struct ccu_div i2s1_clk = { 542*fb038ce4SYangtao Li .enable = BIT(31), 543*fb038ce4SYangtao Li .div = _SUNXI_CCU_DIV_FLAGS(8, 2, CLK_DIVIDER_POWER_OF_TWO), 544*fb038ce4SYangtao Li .mux = _SUNXI_CCU_MUX(24, 2), 545*fb038ce4SYangtao Li .common = { 546*fb038ce4SYangtao Li .reg = 0xa14, 547*fb038ce4SYangtao Li .hw.init = CLK_HW_INIT_PARENTS("i2s1", 548*fb038ce4SYangtao Li audio_parents, 549*fb038ce4SYangtao Li &ccu_div_ops, 550*fb038ce4SYangtao Li CLK_SET_RATE_PARENT), 551*fb038ce4SYangtao Li }, 552*fb038ce4SYangtao Li }; 553*fb038ce4SYangtao Li 554*fb038ce4SYangtao Li static struct ccu_div i2s2_clk = { 555*fb038ce4SYangtao Li .enable = BIT(31), 556*fb038ce4SYangtao Li .div = _SUNXI_CCU_DIV_FLAGS(8, 2, CLK_DIVIDER_POWER_OF_TWO), 557*fb038ce4SYangtao Li .mux = _SUNXI_CCU_MUX(24, 2), 558*fb038ce4SYangtao Li .common = { 559*fb038ce4SYangtao Li .reg = 0xa18, 560*fb038ce4SYangtao Li .hw.init = CLK_HW_INIT_PARENTS("i2s2", 561*fb038ce4SYangtao Li audio_parents, 562*fb038ce4SYangtao Li &ccu_div_ops, 563*fb038ce4SYangtao Li CLK_SET_RATE_PARENT), 564*fb038ce4SYangtao Li }, 565*fb038ce4SYangtao Li }; 566*fb038ce4SYangtao Li 567*fb038ce4SYangtao Li static struct ccu_div i2s3_clk = { 568*fb038ce4SYangtao Li .enable = BIT(31), 569*fb038ce4SYangtao Li .div = _SUNXI_CCU_DIV_FLAGS(8, 2, CLK_DIVIDER_POWER_OF_TWO), 570*fb038ce4SYangtao Li .mux = _SUNXI_CCU_MUX(24, 2), 571*fb038ce4SYangtao Li .common = { 572*fb038ce4SYangtao Li .reg = 0xa1c, 573*fb038ce4SYangtao Li .hw.init = CLK_HW_INIT_PARENTS("i2s3", 574*fb038ce4SYangtao Li audio_parents, 575*fb038ce4SYangtao Li &ccu_div_ops, 576*fb038ce4SYangtao Li CLK_SET_RATE_PARENT), 577*fb038ce4SYangtao Li }, 578*fb038ce4SYangtao Li }; 579*fb038ce4SYangtao Li 580*fb038ce4SYangtao Li static SUNXI_CCU_GATE(bus_i2s0_clk, "bus-i2s0", "apb1", 0xa20, BIT(0), 0); 581*fb038ce4SYangtao Li static SUNXI_CCU_GATE(bus_i2s1_clk, "bus-i2s1", "apb1", 0xa20, BIT(1), 0); 582*fb038ce4SYangtao Li static SUNXI_CCU_GATE(bus_i2s2_clk, "bus-i2s2", "apb1", 0xa20, BIT(2), 0); 583*fb038ce4SYangtao Li static SUNXI_CCU_GATE(bus_i2s3_clk, "bus-i2s3", "apb1", 0xa20, BIT(3), 0); 584*fb038ce4SYangtao Li 585*fb038ce4SYangtao Li static struct ccu_div spdif_clk = { 586*fb038ce4SYangtao Li .enable = BIT(31), 587*fb038ce4SYangtao Li .div = _SUNXI_CCU_DIV_FLAGS(8, 2, CLK_DIVIDER_POWER_OF_TWO), 588*fb038ce4SYangtao Li .mux = _SUNXI_CCU_MUX(24, 2), 589*fb038ce4SYangtao Li .common = { 590*fb038ce4SYangtao Li .reg = 0xa24, 591*fb038ce4SYangtao Li .hw.init = CLK_HW_INIT_PARENTS("spdif", 592*fb038ce4SYangtao Li audio_parents, 593*fb038ce4SYangtao Li &ccu_div_ops, 594*fb038ce4SYangtao Li 0), 595*fb038ce4SYangtao Li }, 596*fb038ce4SYangtao Li }; 597*fb038ce4SYangtao Li 598*fb038ce4SYangtao Li static SUNXI_CCU_GATE(bus_spdif_clk, "bus-spdif", "apb1", 0xa2c, BIT(0), 0); 599*fb038ce4SYangtao Li 600*fb038ce4SYangtao Li static struct ccu_div dmic_clk = { 601*fb038ce4SYangtao Li .enable = BIT(31), 602*fb038ce4SYangtao Li .div = _SUNXI_CCU_DIV_FLAGS(8, 2, CLK_DIVIDER_POWER_OF_TWO), 603*fb038ce4SYangtao Li .mux = _SUNXI_CCU_MUX(24, 2), 604*fb038ce4SYangtao Li .common = { 605*fb038ce4SYangtao Li .reg = 0xa40, 606*fb038ce4SYangtao Li .hw.init = CLK_HW_INIT_PARENTS("dmic", 607*fb038ce4SYangtao Li audio_parents, 608*fb038ce4SYangtao Li &ccu_div_ops, 609*fb038ce4SYangtao Li 0), 610*fb038ce4SYangtao Li }, 611*fb038ce4SYangtao Li }; 612*fb038ce4SYangtao Li 613*fb038ce4SYangtao Li static SUNXI_CCU_GATE(bus_dmic_clk, "bus-dmic", "apb1", 0xa4c, BIT(0), 0); 614*fb038ce4SYangtao Li 615*fb038ce4SYangtao Li static SUNXI_CCU_M_WITH_MUX_GATE(audio_codec_dac_clk, "audio-codec-dac", 616*fb038ce4SYangtao Li audio_parents, 0xa50, 617*fb038ce4SYangtao Li 0, 4, /* M */ 618*fb038ce4SYangtao Li 24, 2, /* mux */ 619*fb038ce4SYangtao Li BIT(31), /* gate */ 620*fb038ce4SYangtao Li 0); 621*fb038ce4SYangtao Li 622*fb038ce4SYangtao Li static SUNXI_CCU_M_WITH_MUX_GATE(audio_codec_adc_clk, "audio-codec-adc", 623*fb038ce4SYangtao Li audio_parents, 0xa54, 624*fb038ce4SYangtao Li 0, 4, /* M */ 625*fb038ce4SYangtao Li 24, 2, /* mux */ 626*fb038ce4SYangtao Li BIT(31), /* gate */ 627*fb038ce4SYangtao Li 0); 628*fb038ce4SYangtao Li 629*fb038ce4SYangtao Li static SUNXI_CCU_M_WITH_MUX_GATE(audio_codec_4x_clk, "audio-codec-4x", 630*fb038ce4SYangtao Li audio_parents, 0xa58, 631*fb038ce4SYangtao Li 0, 4, /* M */ 632*fb038ce4SYangtao Li 24, 2, /* mux */ 633*fb038ce4SYangtao Li BIT(31), /* gate */ 634*fb038ce4SYangtao Li 0); 635*fb038ce4SYangtao Li 636*fb038ce4SYangtao Li static SUNXI_CCU_GATE(bus_audio_codec_clk, "bus-audio-codec", "apb1", 0xa5c, 637*fb038ce4SYangtao Li BIT(0), 0); 638*fb038ce4SYangtao Li 639*fb038ce4SYangtao Li /* 640*fb038ce4SYangtao Li * There are OHCI 12M clock source selection bits for 2 USB 2.0 ports. 641*fb038ce4SYangtao Li * We will force them to 0 (12M divided from 48M). 642*fb038ce4SYangtao Li */ 643*fb038ce4SYangtao Li #define SUN50I_A100_USB0_CLK_REG 0xa70 644*fb038ce4SYangtao Li #define SUN50I_A100_USB1_CLK_REG 0xa74 645*fb038ce4SYangtao Li 646*fb038ce4SYangtao Li static SUNXI_CCU_GATE(usb_ohci0_clk, "usb-ohci0", "osc12M", 0xa70, BIT(31), 0); 647*fb038ce4SYangtao Li static SUNXI_CCU_GATE(usb_phy0_clk, "usb-phy0", "dcxo24M", 0xa70, BIT(29), 0); 648*fb038ce4SYangtao Li 649*fb038ce4SYangtao Li static SUNXI_CCU_GATE(usb_ohci1_clk, "usb-ohci1", "osc12M", 0xa74, BIT(31), 0); 650*fb038ce4SYangtao Li static SUNXI_CCU_GATE(usb_phy1_clk, "usb-phy1", "dcxo24M", 0xa74, BIT(29), 0); 651*fb038ce4SYangtao Li 652*fb038ce4SYangtao Li static SUNXI_CCU_GATE(bus_ohci0_clk, "bus-ohci0", "ahb3", 0xa8c, BIT(0), 0); 653*fb038ce4SYangtao Li static SUNXI_CCU_GATE(bus_ohci1_clk, "bus-ohci1", "ahb3", 0xa8c, BIT(1), 0); 654*fb038ce4SYangtao Li static SUNXI_CCU_GATE(bus_ehci0_clk, "bus-ehci0", "ahb3", 0xa8c, BIT(4), 0); 655*fb038ce4SYangtao Li static SUNXI_CCU_GATE(bus_ehci1_clk, "bus-ehci1", "ahb3", 0xa8c, BIT(5), 0); 656*fb038ce4SYangtao Li static SUNXI_CCU_GATE(bus_otg_clk, "bus-otg", "ahb3", 0xa8c, BIT(8), 0); 657*fb038ce4SYangtao Li 658*fb038ce4SYangtao Li static SUNXI_CCU_GATE(bus_lradc_clk, "bus-lradc", "ahb3", 0xa9c, BIT(0), 0); 659*fb038ce4SYangtao Li 660*fb038ce4SYangtao Li static SUNXI_CCU_GATE(bus_dpss_top0_clk, "bus-dpss-top0", "ahb3", 661*fb038ce4SYangtao Li 0xabc, BIT(0), 0); 662*fb038ce4SYangtao Li 663*fb038ce4SYangtao Li static SUNXI_CCU_GATE(bus_dpss_top1_clk, "bus-dpss-top1", "ahb3", 664*fb038ce4SYangtao Li 0xacc, BIT(0), 0); 665*fb038ce4SYangtao Li 666*fb038ce4SYangtao Li static const char * const mipi_dsi_parents[] = { "dcxo24M", "pll-periph0-2x", 667*fb038ce4SYangtao Li "pll-periph0" }; 668*fb038ce4SYangtao Li static SUNXI_CCU_M_WITH_MUX_GATE(mipi_dsi_clk, "mipi-dsi", 669*fb038ce4SYangtao Li mipi_dsi_parents, 670*fb038ce4SYangtao Li 0xb24, 671*fb038ce4SYangtao Li 0, 4, /* M */ 672*fb038ce4SYangtao Li 24, 2, /* mux */ 673*fb038ce4SYangtao Li BIT(31), /* gate */ 674*fb038ce4SYangtao Li 0); 675*fb038ce4SYangtao Li 676*fb038ce4SYangtao Li static SUNXI_CCU_GATE(bus_mipi_dsi_clk, "bus-mipi-dsi", "ahb3", 677*fb038ce4SYangtao Li 0xb4c, BIT(0), 0); 678*fb038ce4SYangtao Li 679*fb038ce4SYangtao Li static const char * const tcon_lcd_parents[] = { "pll-video0-4x", 680*fb038ce4SYangtao Li "pll-video1-4x", 681*fb038ce4SYangtao Li "pll-video2-4x", 682*fb038ce4SYangtao Li "pll-video3-4x", 683*fb038ce4SYangtao Li "pll-periph0-2x" }; 684*fb038ce4SYangtao Li static SUNXI_CCU_MP_WITH_MUX_GATE(tcon_lcd_clk, "tcon-lcd0", 685*fb038ce4SYangtao Li tcon_lcd_parents, 0xb60, 686*fb038ce4SYangtao Li 0, 4, /* M */ 687*fb038ce4SYangtao Li 8, 2, /* P */ 688*fb038ce4SYangtao Li 24, 3, /* mux */ 689*fb038ce4SYangtao Li BIT(31), /* gate */ 690*fb038ce4SYangtao Li 0); 691*fb038ce4SYangtao Li 692*fb038ce4SYangtao Li static SUNXI_CCU_GATE(bus_tcon_lcd_clk, "bus-tcon-lcd0", "ahb3", 693*fb038ce4SYangtao Li 0xb7c, BIT(0), 0); 694*fb038ce4SYangtao Li 695*fb038ce4SYangtao Li static const char * const ledc_parents[] = { "dcxo24M", 696*fb038ce4SYangtao Li "pll-periph0" }; 697*fb038ce4SYangtao Li static SUNXI_CCU_MP_WITH_MUX_GATE(ledc_clk, "ledc", 698*fb038ce4SYangtao Li ledc_parents, 0xbf0, 699*fb038ce4SYangtao Li 0, 4, /* M */ 700*fb038ce4SYangtao Li 8, 2, /* P */ 701*fb038ce4SYangtao Li 24, 3, /* mux */ 702*fb038ce4SYangtao Li BIT(31), /* gate */ 703*fb038ce4SYangtao Li 0); 704*fb038ce4SYangtao Li 705*fb038ce4SYangtao Li static SUNXI_CCU_GATE(bus_ledc_clk, "bus-ledc", "ahb3", 0xbfc, BIT(0), 0); 706*fb038ce4SYangtao Li 707*fb038ce4SYangtao Li static const char * const csi_top_parents[] = { "pll-periph0-2x", 708*fb038ce4SYangtao Li "pll-video0-2x", 709*fb038ce4SYangtao Li "pll-video1-2x", 710*fb038ce4SYangtao Li "pll-video2-2x", 711*fb038ce4SYangtao Li "pll-video3-2x" }; 712*fb038ce4SYangtao Li static SUNXI_CCU_M_WITH_MUX_GATE(csi_top_clk, "csi-top", 713*fb038ce4SYangtao Li csi_top_parents, 0xc04, 714*fb038ce4SYangtao Li 0, 4, /* M */ 715*fb038ce4SYangtao Li 24, 3, /* mux */ 716*fb038ce4SYangtao Li BIT(31), /* gate */ 717*fb038ce4SYangtao Li 0); 718*fb038ce4SYangtao Li 719*fb038ce4SYangtao Li static const char * const csi0_mclk_parents[] = { "dcxo24M", "pll-video2", 720*fb038ce4SYangtao Li "pll-video3", "pll-video0", 721*fb038ce4SYangtao Li "pll-video1" }; 722*fb038ce4SYangtao Li static SUNXI_CCU_M_WITH_MUX_GATE(csi0_mclk_clk, "csi0-mclk", 723*fb038ce4SYangtao Li csi0_mclk_parents, 0xc08, 724*fb038ce4SYangtao Li 0, 5, /* M */ 725*fb038ce4SYangtao Li 24, 3, /* mux */ 726*fb038ce4SYangtao Li BIT(31), /* gate */ 727*fb038ce4SYangtao Li 0); 728*fb038ce4SYangtao Li 729*fb038ce4SYangtao Li static const char * const csi1_mclk_parents[] = { "dcxo24M", "pll-video3", 730*fb038ce4SYangtao Li "pll-video0", "pll-video1", 731*fb038ce4SYangtao Li "pll-video2" }; 732*fb038ce4SYangtao Li static SUNXI_CCU_M_WITH_MUX_GATE(csi1_mclk_clk, "csi1-mclk", 733*fb038ce4SYangtao Li csi1_mclk_parents, 0xc0c, 734*fb038ce4SYangtao Li 0, 5, /* M */ 735*fb038ce4SYangtao Li 24, 3, /* mux */ 736*fb038ce4SYangtao Li BIT(31), /* gate */ 737*fb038ce4SYangtao Li 0); 738*fb038ce4SYangtao Li 739*fb038ce4SYangtao Li static SUNXI_CCU_GATE(bus_csi_clk, "bus-csi", "ahb3", 0xc1c, BIT(0), 0); 740*fb038ce4SYangtao Li 741*fb038ce4SYangtao Li static const char * const csi_isp_parents[] = { "pll-periph0-2x", 742*fb038ce4SYangtao Li "pll-video0-2x", 743*fb038ce4SYangtao Li "pll-video1-2x", 744*fb038ce4SYangtao Li "pll-video2-2x", 745*fb038ce4SYangtao Li "pll-video3-2x" }; 746*fb038ce4SYangtao Li static SUNXI_CCU_M_WITH_MUX_GATE(csi_isp_clk, "csi-isp", 747*fb038ce4SYangtao Li csi_isp_parents, 0xc20, 748*fb038ce4SYangtao Li 0, 5, /* M */ 749*fb038ce4SYangtao Li 24, 3, /* mux */ 750*fb038ce4SYangtao Li BIT(31), /* gate */ 751*fb038ce4SYangtao Li 0); 752*fb038ce4SYangtao Li 753*fb038ce4SYangtao Li /* Fixed factor clocks */ 754*fb038ce4SYangtao Li static CLK_FIXED_FACTOR_FW_NAME(osc12M_clk, "osc12M", "hosc", 2, 1, 0); 755*fb038ce4SYangtao Li 756*fb038ce4SYangtao Li static CLK_FIXED_FACTOR_HW(pll_com_audio_clk, "pll-com-audio", 757*fb038ce4SYangtao Li &pll_com_clk.common.hw, 758*fb038ce4SYangtao Li 5, 1, CLK_SET_RATE_PARENT); 759*fb038ce4SYangtao Li 760*fb038ce4SYangtao Li static CLK_FIXED_FACTOR_HW(pll_periph0_2x_clk, "pll-periph0-2x", 761*fb038ce4SYangtao Li &pll_periph0_clk.common.hw, 762*fb038ce4SYangtao Li 1, 2, 0); 763*fb038ce4SYangtao Li 764*fb038ce4SYangtao Li static CLK_FIXED_FACTOR_HW(pll_periph1_2x_clk, "pll-periph1-2x", 765*fb038ce4SYangtao Li &pll_periph1_clk.common.hw, 766*fb038ce4SYangtao Li 1, 2, 0); 767*fb038ce4SYangtao Li 768*fb038ce4SYangtao Li static const struct clk_hw *pll_video0_parents[] = { 769*fb038ce4SYangtao Li &pll_video0_clk.common.hw 770*fb038ce4SYangtao Li }; 771*fb038ce4SYangtao Li static CLK_FIXED_FACTOR_HWS(pll_video0_4x_clk, "pll-video0-4x", 772*fb038ce4SYangtao Li pll_video0_parents, 773*fb038ce4SYangtao Li 1, 4, CLK_SET_RATE_PARENT); 774*fb038ce4SYangtao Li static CLK_FIXED_FACTOR_HWS(pll_video0_2x_clk, "pll-video0-2x", 775*fb038ce4SYangtao Li pll_video0_parents, 776*fb038ce4SYangtao Li 1, 2, CLK_SET_RATE_PARENT); 777*fb038ce4SYangtao Li 778*fb038ce4SYangtao Li static const struct clk_hw *pll_video1_parents[] = { 779*fb038ce4SYangtao Li &pll_video1_clk.common.hw 780*fb038ce4SYangtao Li }; 781*fb038ce4SYangtao Li static CLK_FIXED_FACTOR_HWS(pll_video1_4x_clk, "pll-video1-4x", 782*fb038ce4SYangtao Li pll_video1_parents, 783*fb038ce4SYangtao Li 1, 4, CLK_SET_RATE_PARENT); 784*fb038ce4SYangtao Li static CLK_FIXED_FACTOR_HWS(pll_video1_2x_clk, "pll-video1-2x", 785*fb038ce4SYangtao Li pll_video1_parents, 786*fb038ce4SYangtao Li 1, 2, CLK_SET_RATE_PARENT); 787*fb038ce4SYangtao Li 788*fb038ce4SYangtao Li static const struct clk_hw *pll_video2_parents[] = { 789*fb038ce4SYangtao Li &pll_video2_clk.common.hw 790*fb038ce4SYangtao Li }; 791*fb038ce4SYangtao Li static CLK_FIXED_FACTOR_HWS(pll_video2_4x_clk, "pll-video2-4x", 792*fb038ce4SYangtao Li pll_video2_parents, 793*fb038ce4SYangtao Li 1, 4, CLK_SET_RATE_PARENT); 794*fb038ce4SYangtao Li static CLK_FIXED_FACTOR_HWS(pll_video2_2x_clk, "pll-video2-2x", 795*fb038ce4SYangtao Li pll_video2_parents, 796*fb038ce4SYangtao Li 1, 2, CLK_SET_RATE_PARENT); 797*fb038ce4SYangtao Li 798*fb038ce4SYangtao Li static const struct clk_hw *pll_video3_parents[] = { 799*fb038ce4SYangtao Li &pll_video3_clk.common.hw 800*fb038ce4SYangtao Li }; 801*fb038ce4SYangtao Li static CLK_FIXED_FACTOR_HWS(pll_video3_4x_clk, "pll-video3-4x", 802*fb038ce4SYangtao Li pll_video3_parents, 803*fb038ce4SYangtao Li 1, 4, CLK_SET_RATE_PARENT); 804*fb038ce4SYangtao Li static CLK_FIXED_FACTOR_HWS(pll_video3_2x_clk, "pll-video3-2x", 805*fb038ce4SYangtao Li pll_video3_parents, 806*fb038ce4SYangtao Li 1, 2, CLK_SET_RATE_PARENT); 807*fb038ce4SYangtao Li 808*fb038ce4SYangtao Li static struct ccu_common *sun50i_a100_ccu_clks[] = { 809*fb038ce4SYangtao Li &pll_cpux_clk.common, 810*fb038ce4SYangtao Li &pll_ddr0_clk.common, 811*fb038ce4SYangtao Li &pll_periph0_clk.common, 812*fb038ce4SYangtao Li &pll_periph1_clk.common, 813*fb038ce4SYangtao Li &pll_gpu_clk.common, 814*fb038ce4SYangtao Li &pll_video0_clk.common, 815*fb038ce4SYangtao Li &pll_video1_clk.common, 816*fb038ce4SYangtao Li &pll_video2_clk.common, 817*fb038ce4SYangtao Li &pll_video3_clk.common, 818*fb038ce4SYangtao Li &pll_ve_clk.common, 819*fb038ce4SYangtao Li &pll_com_clk.common, 820*fb038ce4SYangtao Li &pll_audio_clk.common, 821*fb038ce4SYangtao Li &cpux_clk.common, 822*fb038ce4SYangtao Li &axi_clk.common, 823*fb038ce4SYangtao Li &cpux_apb_clk.common, 824*fb038ce4SYangtao Li &psi_ahb1_ahb2_clk.common, 825*fb038ce4SYangtao Li &ahb3_clk.common, 826*fb038ce4SYangtao Li &apb1_clk.common, 827*fb038ce4SYangtao Li &apb2_clk.common, 828*fb038ce4SYangtao Li &mbus_clk.common, 829*fb038ce4SYangtao Li &de_clk.common, 830*fb038ce4SYangtao Li &bus_de_clk.common, 831*fb038ce4SYangtao Li &g2d_clk.common, 832*fb038ce4SYangtao Li &bus_g2d_clk.common, 833*fb038ce4SYangtao Li &gpu_clk.common, 834*fb038ce4SYangtao Li &bus_gpu_clk.common, 835*fb038ce4SYangtao Li &ce_clk.common, 836*fb038ce4SYangtao Li &bus_ce_clk.common, 837*fb038ce4SYangtao Li &ve_clk.common, 838*fb038ce4SYangtao Li &bus_ve_clk.common, 839*fb038ce4SYangtao Li &bus_dma_clk.common, 840*fb038ce4SYangtao Li &bus_msgbox_clk.common, 841*fb038ce4SYangtao Li &bus_spinlock_clk.common, 842*fb038ce4SYangtao Li &bus_hstimer_clk.common, 843*fb038ce4SYangtao Li &avs_clk.common, 844*fb038ce4SYangtao Li &bus_dbg_clk.common, 845*fb038ce4SYangtao Li &bus_psi_clk.common, 846*fb038ce4SYangtao Li &bus_pwm_clk.common, 847*fb038ce4SYangtao Li &bus_iommu_clk.common, 848*fb038ce4SYangtao Li &mbus_dma_clk.common, 849*fb038ce4SYangtao Li &mbus_ve_clk.common, 850*fb038ce4SYangtao Li &mbus_ce_clk.common, 851*fb038ce4SYangtao Li &mbus_nand_clk.common, 852*fb038ce4SYangtao Li &mbus_csi_clk.common, 853*fb038ce4SYangtao Li &mbus_isp_clk.common, 854*fb038ce4SYangtao Li &mbus_g2d_clk.common, 855*fb038ce4SYangtao Li &bus_dram_clk.common, 856*fb038ce4SYangtao Li &nand0_clk.common, 857*fb038ce4SYangtao Li &nand1_clk.common, 858*fb038ce4SYangtao Li &bus_nand_clk.common, 859*fb038ce4SYangtao Li &mmc0_clk.common, 860*fb038ce4SYangtao Li &mmc1_clk.common, 861*fb038ce4SYangtao Li &mmc2_clk.common, 862*fb038ce4SYangtao Li &bus_mmc0_clk.common, 863*fb038ce4SYangtao Li &bus_mmc1_clk.common, 864*fb038ce4SYangtao Li &bus_mmc2_clk.common, 865*fb038ce4SYangtao Li &bus_uart0_clk.common, 866*fb038ce4SYangtao Li &bus_uart1_clk.common, 867*fb038ce4SYangtao Li &bus_uart2_clk.common, 868*fb038ce4SYangtao Li &bus_uart3_clk.common, 869*fb038ce4SYangtao Li &bus_uart4_clk.common, 870*fb038ce4SYangtao Li &bus_i2c0_clk.common, 871*fb038ce4SYangtao Li &bus_i2c1_clk.common, 872*fb038ce4SYangtao Li &bus_i2c2_clk.common, 873*fb038ce4SYangtao Li &bus_i2c3_clk.common, 874*fb038ce4SYangtao Li &spi0_clk.common, 875*fb038ce4SYangtao Li &spi1_clk.common, 876*fb038ce4SYangtao Li &spi2_clk.common, 877*fb038ce4SYangtao Li &bus_spi0_clk.common, 878*fb038ce4SYangtao Li &bus_spi1_clk.common, 879*fb038ce4SYangtao Li &bus_spi2_clk.common, 880*fb038ce4SYangtao Li &emac_25m_clk.common, 881*fb038ce4SYangtao Li &bus_emac_clk.common, 882*fb038ce4SYangtao Li &ir_rx_clk.common, 883*fb038ce4SYangtao Li &bus_ir_rx_clk.common, 884*fb038ce4SYangtao Li &ir_tx_clk.common, 885*fb038ce4SYangtao Li &bus_ir_tx_clk.common, 886*fb038ce4SYangtao Li &bus_gpadc_clk.common, 887*fb038ce4SYangtao Li &bus_ths_clk.common, 888*fb038ce4SYangtao Li &i2s0_clk.common, 889*fb038ce4SYangtao Li &i2s1_clk.common, 890*fb038ce4SYangtao Li &i2s2_clk.common, 891*fb038ce4SYangtao Li &i2s3_clk.common, 892*fb038ce4SYangtao Li &bus_i2s0_clk.common, 893*fb038ce4SYangtao Li &bus_i2s1_clk.common, 894*fb038ce4SYangtao Li &bus_i2s2_clk.common, 895*fb038ce4SYangtao Li &bus_i2s3_clk.common, 896*fb038ce4SYangtao Li &spdif_clk.common, 897*fb038ce4SYangtao Li &bus_spdif_clk.common, 898*fb038ce4SYangtao Li &dmic_clk.common, 899*fb038ce4SYangtao Li &bus_dmic_clk.common, 900*fb038ce4SYangtao Li &audio_codec_dac_clk.common, 901*fb038ce4SYangtao Li &audio_codec_adc_clk.common, 902*fb038ce4SYangtao Li &audio_codec_4x_clk.common, 903*fb038ce4SYangtao Li &bus_audio_codec_clk.common, 904*fb038ce4SYangtao Li &usb_ohci0_clk.common, 905*fb038ce4SYangtao Li &usb_phy0_clk.common, 906*fb038ce4SYangtao Li &usb_ohci1_clk.common, 907*fb038ce4SYangtao Li &usb_phy1_clk.common, 908*fb038ce4SYangtao Li &bus_ohci0_clk.common, 909*fb038ce4SYangtao Li &bus_ohci1_clk.common, 910*fb038ce4SYangtao Li &bus_ehci0_clk.common, 911*fb038ce4SYangtao Li &bus_ehci1_clk.common, 912*fb038ce4SYangtao Li &bus_otg_clk.common, 913*fb038ce4SYangtao Li &bus_lradc_clk.common, 914*fb038ce4SYangtao Li &bus_dpss_top0_clk.common, 915*fb038ce4SYangtao Li &bus_dpss_top1_clk.common, 916*fb038ce4SYangtao Li &mipi_dsi_clk.common, 917*fb038ce4SYangtao Li &bus_mipi_dsi_clk.common, 918*fb038ce4SYangtao Li &tcon_lcd_clk.common, 919*fb038ce4SYangtao Li &bus_tcon_lcd_clk.common, 920*fb038ce4SYangtao Li &ledc_clk.common, 921*fb038ce4SYangtao Li &bus_ledc_clk.common, 922*fb038ce4SYangtao Li &csi_top_clk.common, 923*fb038ce4SYangtao Li &csi0_mclk_clk.common, 924*fb038ce4SYangtao Li &csi1_mclk_clk.common, 925*fb038ce4SYangtao Li &bus_csi_clk.common, 926*fb038ce4SYangtao Li &csi_isp_clk.common, 927*fb038ce4SYangtao Li }; 928*fb038ce4SYangtao Li 929*fb038ce4SYangtao Li static struct clk_hw_onecell_data sun50i_a100_hw_clks = { 930*fb038ce4SYangtao Li .hws = { 931*fb038ce4SYangtao Li [CLK_OSC12M] = &osc12M_clk.hw, 932*fb038ce4SYangtao Li [CLK_PLL_CPUX] = &pll_cpux_clk.common.hw, 933*fb038ce4SYangtao Li [CLK_PLL_DDR0] = &pll_ddr0_clk.common.hw, 934*fb038ce4SYangtao Li [CLK_PLL_PERIPH0] = &pll_periph0_clk.common.hw, 935*fb038ce4SYangtao Li [CLK_PLL_PERIPH0_2X] = &pll_periph0_2x_clk.hw, 936*fb038ce4SYangtao Li [CLK_PLL_PERIPH1] = &pll_periph1_clk.common.hw, 937*fb038ce4SYangtao Li [CLK_PLL_PERIPH1_2X] = &pll_periph1_2x_clk.hw, 938*fb038ce4SYangtao Li [CLK_PLL_GPU] = &pll_gpu_clk.common.hw, 939*fb038ce4SYangtao Li [CLK_PLL_VIDEO0] = &pll_video0_clk.common.hw, 940*fb038ce4SYangtao Li [CLK_PLL_VIDEO0_2X] = &pll_video0_2x_clk.hw, 941*fb038ce4SYangtao Li [CLK_PLL_VIDEO0_4X] = &pll_video0_4x_clk.hw, 942*fb038ce4SYangtao Li [CLK_PLL_VIDEO1] = &pll_video1_clk.common.hw, 943*fb038ce4SYangtao Li [CLK_PLL_VIDEO1_2X] = &pll_video1_2x_clk.hw, 944*fb038ce4SYangtao Li [CLK_PLL_VIDEO1_4X] = &pll_video1_4x_clk.hw, 945*fb038ce4SYangtao Li [CLK_PLL_VIDEO2] = &pll_video2_clk.common.hw, 946*fb038ce4SYangtao Li [CLK_PLL_VIDEO2_2X] = &pll_video2_2x_clk.hw, 947*fb038ce4SYangtao Li [CLK_PLL_VIDEO2_4X] = &pll_video2_4x_clk.hw, 948*fb038ce4SYangtao Li [CLK_PLL_VIDEO3] = &pll_video3_clk.common.hw, 949*fb038ce4SYangtao Li [CLK_PLL_VIDEO3_2X] = &pll_video3_2x_clk.hw, 950*fb038ce4SYangtao Li [CLK_PLL_VIDEO3_4X] = &pll_video3_4x_clk.hw, 951*fb038ce4SYangtao Li [CLK_PLL_VE] = &pll_ve_clk.common.hw, 952*fb038ce4SYangtao Li [CLK_PLL_COM] = &pll_com_clk.common.hw, 953*fb038ce4SYangtao Li [CLK_PLL_COM_AUDIO] = &pll_com_audio_clk.hw, 954*fb038ce4SYangtao Li [CLK_PLL_AUDIO] = &pll_audio_clk.common.hw, 955*fb038ce4SYangtao Li [CLK_CPUX] = &cpux_clk.common.hw, 956*fb038ce4SYangtao Li [CLK_AXI] = &axi_clk.common.hw, 957*fb038ce4SYangtao Li [CLK_CPUX_APB] = &cpux_apb_clk.common.hw, 958*fb038ce4SYangtao Li [CLK_PSI_AHB1_AHB2] = &psi_ahb1_ahb2_clk.common.hw, 959*fb038ce4SYangtao Li [CLK_AHB3] = &ahb3_clk.common.hw, 960*fb038ce4SYangtao Li [CLK_APB1] = &apb1_clk.common.hw, 961*fb038ce4SYangtao Li [CLK_APB2] = &apb2_clk.common.hw, 962*fb038ce4SYangtao Li [CLK_MBUS] = &mbus_clk.common.hw, 963*fb038ce4SYangtao Li [CLK_DE] = &de_clk.common.hw, 964*fb038ce4SYangtao Li [CLK_BUS_DE] = &bus_de_clk.common.hw, 965*fb038ce4SYangtao Li [CLK_G2D] = &g2d_clk.common.hw, 966*fb038ce4SYangtao Li [CLK_BUS_G2D] = &bus_g2d_clk.common.hw, 967*fb038ce4SYangtao Li [CLK_GPU] = &gpu_clk.common.hw, 968*fb038ce4SYangtao Li [CLK_BUS_GPU] = &bus_gpu_clk.common.hw, 969*fb038ce4SYangtao Li [CLK_CE] = &ce_clk.common.hw, 970*fb038ce4SYangtao Li [CLK_BUS_CE] = &bus_ce_clk.common.hw, 971*fb038ce4SYangtao Li [CLK_VE] = &ve_clk.common.hw, 972*fb038ce4SYangtao Li [CLK_BUS_VE] = &bus_ve_clk.common.hw, 973*fb038ce4SYangtao Li [CLK_BUS_DMA] = &bus_dma_clk.common.hw, 974*fb038ce4SYangtao Li [CLK_BUS_MSGBOX] = &bus_msgbox_clk.common.hw, 975*fb038ce4SYangtao Li [CLK_BUS_SPINLOCK] = &bus_spinlock_clk.common.hw, 976*fb038ce4SYangtao Li [CLK_BUS_HSTIMER] = &bus_hstimer_clk.common.hw, 977*fb038ce4SYangtao Li [CLK_AVS] = &avs_clk.common.hw, 978*fb038ce4SYangtao Li [CLK_BUS_DBG] = &bus_dbg_clk.common.hw, 979*fb038ce4SYangtao Li [CLK_BUS_PSI] = &bus_psi_clk.common.hw, 980*fb038ce4SYangtao Li [CLK_BUS_PWM] = &bus_pwm_clk.common.hw, 981*fb038ce4SYangtao Li [CLK_BUS_IOMMU] = &bus_iommu_clk.common.hw, 982*fb038ce4SYangtao Li [CLK_MBUS_DMA] = &mbus_dma_clk.common.hw, 983*fb038ce4SYangtao Li [CLK_MBUS_VE] = &mbus_ve_clk.common.hw, 984*fb038ce4SYangtao Li [CLK_MBUS_CE] = &mbus_ce_clk.common.hw, 985*fb038ce4SYangtao Li [CLK_MBUS_NAND] = &mbus_nand_clk.common.hw, 986*fb038ce4SYangtao Li [CLK_MBUS_CSI] = &mbus_csi_clk.common.hw, 987*fb038ce4SYangtao Li [CLK_MBUS_ISP] = &mbus_isp_clk.common.hw, 988*fb038ce4SYangtao Li [CLK_MBUS_G2D] = &mbus_g2d_clk.common.hw, 989*fb038ce4SYangtao Li [CLK_BUS_DRAM] = &bus_dram_clk.common.hw, 990*fb038ce4SYangtao Li [CLK_NAND0] = &nand0_clk.common.hw, 991*fb038ce4SYangtao Li [CLK_NAND1] = &nand1_clk.common.hw, 992*fb038ce4SYangtao Li [CLK_BUS_NAND] = &bus_nand_clk.common.hw, 993*fb038ce4SYangtao Li [CLK_MMC0] = &mmc0_clk.common.hw, 994*fb038ce4SYangtao Li [CLK_MMC1] = &mmc1_clk.common.hw, 995*fb038ce4SYangtao Li [CLK_MMC2] = &mmc2_clk.common.hw, 996*fb038ce4SYangtao Li [CLK_BUS_MMC0] = &bus_mmc0_clk.common.hw, 997*fb038ce4SYangtao Li [CLK_BUS_MMC1] = &bus_mmc1_clk.common.hw, 998*fb038ce4SYangtao Li [CLK_BUS_MMC2] = &bus_mmc2_clk.common.hw, 999*fb038ce4SYangtao Li [CLK_BUS_UART0] = &bus_uart0_clk.common.hw, 1000*fb038ce4SYangtao Li [CLK_BUS_UART1] = &bus_uart1_clk.common.hw, 1001*fb038ce4SYangtao Li [CLK_BUS_UART2] = &bus_uart2_clk.common.hw, 1002*fb038ce4SYangtao Li [CLK_BUS_UART3] = &bus_uart3_clk.common.hw, 1003*fb038ce4SYangtao Li [CLK_BUS_UART4] = &bus_uart4_clk.common.hw, 1004*fb038ce4SYangtao Li [CLK_BUS_I2C0] = &bus_i2c0_clk.common.hw, 1005*fb038ce4SYangtao Li [CLK_BUS_I2C1] = &bus_i2c1_clk.common.hw, 1006*fb038ce4SYangtao Li [CLK_BUS_I2C2] = &bus_i2c2_clk.common.hw, 1007*fb038ce4SYangtao Li [CLK_BUS_I2C3] = &bus_i2c3_clk.common.hw, 1008*fb038ce4SYangtao Li [CLK_SPI0] = &spi0_clk.common.hw, 1009*fb038ce4SYangtao Li [CLK_SPI1] = &spi1_clk.common.hw, 1010*fb038ce4SYangtao Li [CLK_SPI2] = &spi2_clk.common.hw, 1011*fb038ce4SYangtao Li [CLK_BUS_SPI0] = &bus_spi0_clk.common.hw, 1012*fb038ce4SYangtao Li [CLK_BUS_SPI1] = &bus_spi1_clk.common.hw, 1013*fb038ce4SYangtao Li [CLK_BUS_SPI2] = &bus_spi2_clk.common.hw, 1014*fb038ce4SYangtao Li [CLK_EMAC_25M] = &emac_25m_clk.common.hw, 1015*fb038ce4SYangtao Li [CLK_BUS_EMAC] = &bus_emac_clk.common.hw, 1016*fb038ce4SYangtao Li [CLK_IR_RX] = &ir_rx_clk.common.hw, 1017*fb038ce4SYangtao Li [CLK_BUS_IR_RX] = &bus_ir_rx_clk.common.hw, 1018*fb038ce4SYangtao Li [CLK_IR_TX] = &ir_tx_clk.common.hw, 1019*fb038ce4SYangtao Li [CLK_BUS_IR_TX] = &bus_ir_tx_clk.common.hw, 1020*fb038ce4SYangtao Li [CLK_BUS_GPADC] = &bus_gpadc_clk.common.hw, 1021*fb038ce4SYangtao Li [CLK_BUS_THS] = &bus_ths_clk.common.hw, 1022*fb038ce4SYangtao Li [CLK_I2S0] = &i2s0_clk.common.hw, 1023*fb038ce4SYangtao Li [CLK_I2S1] = &i2s1_clk.common.hw, 1024*fb038ce4SYangtao Li [CLK_I2S2] = &i2s2_clk.common.hw, 1025*fb038ce4SYangtao Li [CLK_I2S3] = &i2s3_clk.common.hw, 1026*fb038ce4SYangtao Li [CLK_BUS_I2S0] = &bus_i2s0_clk.common.hw, 1027*fb038ce4SYangtao Li [CLK_BUS_I2S1] = &bus_i2s1_clk.common.hw, 1028*fb038ce4SYangtao Li [CLK_BUS_I2S2] = &bus_i2s2_clk.common.hw, 1029*fb038ce4SYangtao Li [CLK_BUS_I2S3] = &bus_i2s3_clk.common.hw, 1030*fb038ce4SYangtao Li [CLK_SPDIF] = &spdif_clk.common.hw, 1031*fb038ce4SYangtao Li [CLK_BUS_SPDIF] = &bus_spdif_clk.common.hw, 1032*fb038ce4SYangtao Li [CLK_DMIC] = &dmic_clk.common.hw, 1033*fb038ce4SYangtao Li [CLK_BUS_DMIC] = &bus_dmic_clk.common.hw, 1034*fb038ce4SYangtao Li [CLK_AUDIO_DAC] = &audio_codec_dac_clk.common.hw, 1035*fb038ce4SYangtao Li [CLK_AUDIO_ADC] = &audio_codec_adc_clk.common.hw, 1036*fb038ce4SYangtao Li [CLK_AUDIO_4X] = &audio_codec_4x_clk.common.hw, 1037*fb038ce4SYangtao Li [CLK_BUS_AUDIO_CODEC] = &bus_audio_codec_clk.common.hw, 1038*fb038ce4SYangtao Li [CLK_USB_OHCI0] = &usb_ohci0_clk.common.hw, 1039*fb038ce4SYangtao Li [CLK_USB_PHY0] = &usb_phy0_clk.common.hw, 1040*fb038ce4SYangtao Li [CLK_USB_OHCI1] = &usb_ohci1_clk.common.hw, 1041*fb038ce4SYangtao Li [CLK_USB_PHY1] = &usb_phy1_clk.common.hw, 1042*fb038ce4SYangtao Li [CLK_BUS_OHCI0] = &bus_ohci0_clk.common.hw, 1043*fb038ce4SYangtao Li [CLK_BUS_OHCI1] = &bus_ohci1_clk.common.hw, 1044*fb038ce4SYangtao Li [CLK_BUS_EHCI0] = &bus_ehci0_clk.common.hw, 1045*fb038ce4SYangtao Li [CLK_BUS_EHCI1] = &bus_ehci1_clk.common.hw, 1046*fb038ce4SYangtao Li [CLK_BUS_OTG] = &bus_otg_clk.common.hw, 1047*fb038ce4SYangtao Li [CLK_BUS_LRADC] = &bus_lradc_clk.common.hw, 1048*fb038ce4SYangtao Li [CLK_BUS_DPSS_TOP0] = &bus_dpss_top0_clk.common.hw, 1049*fb038ce4SYangtao Li [CLK_BUS_DPSS_TOP1] = &bus_dpss_top1_clk.common.hw, 1050*fb038ce4SYangtao Li [CLK_MIPI_DSI] = &mipi_dsi_clk.common.hw, 1051*fb038ce4SYangtao Li [CLK_BUS_MIPI_DSI] = &bus_mipi_dsi_clk.common.hw, 1052*fb038ce4SYangtao Li [CLK_TCON_LCD] = &tcon_lcd_clk.common.hw, 1053*fb038ce4SYangtao Li [CLK_BUS_TCON_LCD] = &bus_tcon_lcd_clk.common.hw, 1054*fb038ce4SYangtao Li [CLK_LEDC] = &ledc_clk.common.hw, 1055*fb038ce4SYangtao Li [CLK_BUS_LEDC] = &bus_ledc_clk.common.hw, 1056*fb038ce4SYangtao Li [CLK_CSI_TOP] = &csi_top_clk.common.hw, 1057*fb038ce4SYangtao Li [CLK_CSI0_MCLK] = &csi0_mclk_clk.common.hw, 1058*fb038ce4SYangtao Li [CLK_CSI1_MCLK] = &csi1_mclk_clk.common.hw, 1059*fb038ce4SYangtao Li [CLK_BUS_CSI] = &bus_csi_clk.common.hw, 1060*fb038ce4SYangtao Li [CLK_CSI_ISP] = &csi_isp_clk.common.hw, 1061*fb038ce4SYangtao Li }, 1062*fb038ce4SYangtao Li .num = CLK_NUMBER, 1063*fb038ce4SYangtao Li }; 1064*fb038ce4SYangtao Li 1065*fb038ce4SYangtao Li static struct ccu_reset_map sun50i_a100_ccu_resets[] = { 1066*fb038ce4SYangtao Li [RST_MBUS] = { 0x540, BIT(30) }, 1067*fb038ce4SYangtao Li 1068*fb038ce4SYangtao Li [RST_BUS_DE] = { 0x60c, BIT(16) }, 1069*fb038ce4SYangtao Li [RST_BUS_G2D] = { 0x63c, BIT(16) }, 1070*fb038ce4SYangtao Li [RST_BUS_GPU] = { 0x67c, BIT(16) }, 1071*fb038ce4SYangtao Li [RST_BUS_CE] = { 0x68c, BIT(16) }, 1072*fb038ce4SYangtao Li [RST_BUS_VE] = { 0x69c, BIT(16) }, 1073*fb038ce4SYangtao Li [RST_BUS_DMA] = { 0x70c, BIT(16) }, 1074*fb038ce4SYangtao Li [RST_BUS_MSGBOX] = { 0x71c, BIT(16) }, 1075*fb038ce4SYangtao Li [RST_BUS_SPINLOCK] = { 0x72c, BIT(16) }, 1076*fb038ce4SYangtao Li [RST_BUS_HSTIMER] = { 0x73c, BIT(16) }, 1077*fb038ce4SYangtao Li [RST_BUS_DBG] = { 0x78c, BIT(16) }, 1078*fb038ce4SYangtao Li [RST_BUS_PSI] = { 0x79c, BIT(16) }, 1079*fb038ce4SYangtao Li [RST_BUS_PWM] = { 0x7ac, BIT(16) }, 1080*fb038ce4SYangtao Li [RST_BUS_DRAM] = { 0x80c, BIT(16) }, 1081*fb038ce4SYangtao Li [RST_BUS_NAND] = { 0x82c, BIT(16) }, 1082*fb038ce4SYangtao Li [RST_BUS_MMC0] = { 0x84c, BIT(16) }, 1083*fb038ce4SYangtao Li [RST_BUS_MMC1] = { 0x84c, BIT(17) }, 1084*fb038ce4SYangtao Li [RST_BUS_MMC2] = { 0x84c, BIT(18) }, 1085*fb038ce4SYangtao Li [RST_BUS_UART0] = { 0x90c, BIT(16) }, 1086*fb038ce4SYangtao Li [RST_BUS_UART1] = { 0x90c, BIT(17) }, 1087*fb038ce4SYangtao Li [RST_BUS_UART2] = { 0x90c, BIT(18) }, 1088*fb038ce4SYangtao Li [RST_BUS_UART3] = { 0x90c, BIT(19) }, 1089*fb038ce4SYangtao Li [RST_BUS_UART4] = { 0x90c, BIT(20) }, 1090*fb038ce4SYangtao Li [RST_BUS_I2C0] = { 0x91c, BIT(16) }, 1091*fb038ce4SYangtao Li [RST_BUS_I2C1] = { 0x91c, BIT(17) }, 1092*fb038ce4SYangtao Li [RST_BUS_I2C2] = { 0x91c, BIT(18) }, 1093*fb038ce4SYangtao Li [RST_BUS_I2C3] = { 0x91c, BIT(19) }, 1094*fb038ce4SYangtao Li [RST_BUS_SPI0] = { 0x96c, BIT(16) }, 1095*fb038ce4SYangtao Li [RST_BUS_SPI1] = { 0x96c, BIT(17) }, 1096*fb038ce4SYangtao Li [RST_BUS_SPI2] = { 0x96c, BIT(18) }, 1097*fb038ce4SYangtao Li [RST_BUS_EMAC] = { 0x97c, BIT(16) }, 1098*fb038ce4SYangtao Li [RST_BUS_IR_RX] = { 0x99c, BIT(16) }, 1099*fb038ce4SYangtao Li [RST_BUS_IR_TX] = { 0x9cc, BIT(16) }, 1100*fb038ce4SYangtao Li [RST_BUS_GPADC] = { 0x9ec, BIT(16) }, 1101*fb038ce4SYangtao Li [RST_BUS_THS] = { 0x9fc, BIT(16) }, 1102*fb038ce4SYangtao Li [RST_BUS_I2S0] = { 0xa20, BIT(16) }, 1103*fb038ce4SYangtao Li [RST_BUS_I2S1] = { 0xa20, BIT(17) }, 1104*fb038ce4SYangtao Li [RST_BUS_I2S2] = { 0xa20, BIT(18) }, 1105*fb038ce4SYangtao Li [RST_BUS_I2S3] = { 0xa20, BIT(19) }, 1106*fb038ce4SYangtao Li [RST_BUS_SPDIF] = { 0xa2c, BIT(16) }, 1107*fb038ce4SYangtao Li [RST_BUS_DMIC] = { 0xa4c, BIT(16) }, 1108*fb038ce4SYangtao Li [RST_BUS_AUDIO_CODEC] = { 0xa5c, BIT(16) }, 1109*fb038ce4SYangtao Li 1110*fb038ce4SYangtao Li [RST_USB_PHY0] = { 0xa70, BIT(30) }, 1111*fb038ce4SYangtao Li [RST_USB_PHY1] = { 0xa74, BIT(30) }, 1112*fb038ce4SYangtao Li 1113*fb038ce4SYangtao Li [RST_BUS_OHCI0] = { 0xa8c, BIT(16) }, 1114*fb038ce4SYangtao Li [RST_BUS_OHCI1] = { 0xa8c, BIT(17) }, 1115*fb038ce4SYangtao Li [RST_BUS_EHCI0] = { 0xa8c, BIT(20) }, 1116*fb038ce4SYangtao Li [RST_BUS_EHCI1] = { 0xa8c, BIT(21) }, 1117*fb038ce4SYangtao Li [RST_BUS_OTG] = { 0xa8c, BIT(24) }, 1118*fb038ce4SYangtao Li 1119*fb038ce4SYangtao Li [RST_BUS_LRADC] = { 0xa9c, BIT(16) }, 1120*fb038ce4SYangtao Li [RST_BUS_DPSS_TOP0] = { 0xabc, BIT(16) }, 1121*fb038ce4SYangtao Li [RST_BUS_DPSS_TOP1] = { 0xacc, BIT(16) }, 1122*fb038ce4SYangtao Li [RST_BUS_MIPI_DSI] = { 0xb4c, BIT(16) }, 1123*fb038ce4SYangtao Li [RST_BUS_TCON_LCD] = { 0xb7c, BIT(16) }, 1124*fb038ce4SYangtao Li [RST_BUS_LVDS] = { 0xbac, BIT(16) }, 1125*fb038ce4SYangtao Li [RST_BUS_LEDC] = { 0xbfc, BIT(16) }, 1126*fb038ce4SYangtao Li [RST_BUS_CSI] = { 0xc1c, BIT(16) }, 1127*fb038ce4SYangtao Li [RST_BUS_CSI_ISP] = { 0xc2c, BIT(16) }, 1128*fb038ce4SYangtao Li }; 1129*fb038ce4SYangtao Li 1130*fb038ce4SYangtao Li static const struct sunxi_ccu_desc sun50i_a100_ccu_desc = { 1131*fb038ce4SYangtao Li .ccu_clks = sun50i_a100_ccu_clks, 1132*fb038ce4SYangtao Li .num_ccu_clks = ARRAY_SIZE(sun50i_a100_ccu_clks), 1133*fb038ce4SYangtao Li 1134*fb038ce4SYangtao Li .hw_clks = &sun50i_a100_hw_clks, 1135*fb038ce4SYangtao Li 1136*fb038ce4SYangtao Li .resets = sun50i_a100_ccu_resets, 1137*fb038ce4SYangtao Li .num_resets = ARRAY_SIZE(sun50i_a100_ccu_resets), 1138*fb038ce4SYangtao Li }; 1139*fb038ce4SYangtao Li 1140*fb038ce4SYangtao Li static const u32 sun50i_a100_pll_regs[] = { 1141*fb038ce4SYangtao Li SUN50I_A100_PLL_CPUX_REG, 1142*fb038ce4SYangtao Li SUN50I_A100_PLL_DDR0_REG, 1143*fb038ce4SYangtao Li SUN50I_A100_PLL_PERIPH0_REG, 1144*fb038ce4SYangtao Li SUN50I_A100_PLL_PERIPH1_REG, 1145*fb038ce4SYangtao Li SUN50I_A100_PLL_GPU_REG, 1146*fb038ce4SYangtao Li SUN50I_A100_PLL_VIDEO0_REG, 1147*fb038ce4SYangtao Li SUN50I_A100_PLL_VIDEO1_REG, 1148*fb038ce4SYangtao Li SUN50I_A100_PLL_VIDEO2_REG, 1149*fb038ce4SYangtao Li SUN50I_A100_PLL_VIDEO3_REG, 1150*fb038ce4SYangtao Li SUN50I_A100_PLL_VE_REG, 1151*fb038ce4SYangtao Li SUN50I_A100_PLL_COM_REG, 1152*fb038ce4SYangtao Li SUN50I_A100_PLL_AUDIO_REG, 1153*fb038ce4SYangtao Li }; 1154*fb038ce4SYangtao Li 1155*fb038ce4SYangtao Li static const u32 sun50i_a100_pll_video_regs[] = { 1156*fb038ce4SYangtao Li SUN50I_A100_PLL_VIDEO0_REG, 1157*fb038ce4SYangtao Li SUN50I_A100_PLL_VIDEO1_REG, 1158*fb038ce4SYangtao Li SUN50I_A100_PLL_VIDEO2_REG, 1159*fb038ce4SYangtao Li SUN50I_A100_PLL_VIDEO3_REG, 1160*fb038ce4SYangtao Li }; 1161*fb038ce4SYangtao Li 1162*fb038ce4SYangtao Li static const u32 sun50i_a100_usb2_clk_regs[] = { 1163*fb038ce4SYangtao Li SUN50I_A100_USB0_CLK_REG, 1164*fb038ce4SYangtao Li SUN50I_A100_USB1_CLK_REG, 1165*fb038ce4SYangtao Li }; 1166*fb038ce4SYangtao Li 1167*fb038ce4SYangtao Li static struct ccu_pll_nb sun50i_a100_pll_cpu_nb = { 1168*fb038ce4SYangtao Li .common = &pll_cpux_clk.common, 1169*fb038ce4SYangtao Li /* copy from pll_cpux_clk */ 1170*fb038ce4SYangtao Li .enable = BIT(27), 1171*fb038ce4SYangtao Li .lock = BIT(28), 1172*fb038ce4SYangtao Li }; 1173*fb038ce4SYangtao Li 1174*fb038ce4SYangtao Li static struct ccu_mux_nb sun50i_a100_cpu_nb = { 1175*fb038ce4SYangtao Li .common = &cpux_clk.common, 1176*fb038ce4SYangtao Li .cm = &cpux_clk.mux, 1177*fb038ce4SYangtao Li .delay_us = 1, 1178*fb038ce4SYangtao Li .bypass_index = 4, /* index of pll periph0 */ 1179*fb038ce4SYangtao Li }; 1180*fb038ce4SYangtao Li 1181*fb038ce4SYangtao Li static int sun50i_a100_ccu_probe(struct platform_device *pdev) 1182*fb038ce4SYangtao Li { 1183*fb038ce4SYangtao Li void __iomem *reg; 1184*fb038ce4SYangtao Li u32 val; 1185*fb038ce4SYangtao Li int i, ret; 1186*fb038ce4SYangtao Li 1187*fb038ce4SYangtao Li reg = devm_platform_ioremap_resource(pdev, 0); 1188*fb038ce4SYangtao Li if (IS_ERR(reg)) 1189*fb038ce4SYangtao Li return PTR_ERR(reg); 1190*fb038ce4SYangtao Li 1191*fb038ce4SYangtao Li /* 1192*fb038ce4SYangtao Li * Enable lock and enable bits on all PLLs. 1193*fb038ce4SYangtao Li * 1194*fb038ce4SYangtao Li * Due to the current design, multiple PLLs share one power switch, 1195*fb038ce4SYangtao Li * so switching PLL is easy to cause stability problems. 1196*fb038ce4SYangtao Li * When initializing, we enable them by default. When disable, 1197*fb038ce4SYangtao Li * we only turn off the output of PLL. 1198*fb038ce4SYangtao Li */ 1199*fb038ce4SYangtao Li for (i = 0; i < ARRAY_SIZE(sun50i_a100_pll_regs); i++) { 1200*fb038ce4SYangtao Li val = readl(reg + sun50i_a100_pll_regs[i]); 1201*fb038ce4SYangtao Li val |= SUN50I_A100_PLL_LOCK_ENABLE | SUN50I_A100_PLL_ENABLE; 1202*fb038ce4SYangtao Li writel(val, reg + sun50i_a100_pll_regs[i]); 1203*fb038ce4SYangtao Li } 1204*fb038ce4SYangtao Li 1205*fb038ce4SYangtao Li /* 1206*fb038ce4SYangtao Li * In order to pass the EMI certification, the SDM function of 1207*fb038ce4SYangtao Li * the peripheral 1 bus is enabled, and the frequency is still 1208*fb038ce4SYangtao Li * calculated using the previous division factor. 1209*fb038ce4SYangtao Li */ 1210*fb038ce4SYangtao Li writel(SUN50I_A100_PLL_PERIPH1_PATTERN0, 1211*fb038ce4SYangtao Li reg + SUN50I_A100_PLL_PERIPH1_PATTERN0_REG); 1212*fb038ce4SYangtao Li 1213*fb038ce4SYangtao Li val = readl(reg + SUN50I_A100_PLL_PERIPH1_REG); 1214*fb038ce4SYangtao Li val |= SUN50I_A100_PLL_SDM_ENABLE; 1215*fb038ce4SYangtao Li writel(val, reg + SUN50I_A100_PLL_PERIPH1_REG); 1216*fb038ce4SYangtao Li 1217*fb038ce4SYangtao Li /* 1218*fb038ce4SYangtao Li * Force the output divider of video PLLs to 0. 1219*fb038ce4SYangtao Li * 1220*fb038ce4SYangtao Li * See the comment before pll-video0 definition for the reason. 1221*fb038ce4SYangtao Li */ 1222*fb038ce4SYangtao Li for (i = 0; i < ARRAY_SIZE(sun50i_a100_pll_video_regs); i++) { 1223*fb038ce4SYangtao Li val = readl(reg + sun50i_a100_pll_video_regs[i]); 1224*fb038ce4SYangtao Li val &= ~BIT(0); 1225*fb038ce4SYangtao Li writel(val, reg + sun50i_a100_pll_video_regs[i]); 1226*fb038ce4SYangtao Li } 1227*fb038ce4SYangtao Li 1228*fb038ce4SYangtao Li /* 1229*fb038ce4SYangtao Li * Enforce m1 = 0, m0 = 1 for Audio PLL 1230*fb038ce4SYangtao Li * 1231*fb038ce4SYangtao Li * See the comment before pll-audio definition for the reason. 1232*fb038ce4SYangtao Li */ 1233*fb038ce4SYangtao Li val = readl(reg + SUN50I_A100_PLL_AUDIO_REG); 1234*fb038ce4SYangtao Li val &= ~BIT(1); 1235*fb038ce4SYangtao Li val |= BIT(0); 1236*fb038ce4SYangtao Li writel(val, reg + SUN50I_A100_PLL_AUDIO_REG); 1237*fb038ce4SYangtao Li 1238*fb038ce4SYangtao Li /* 1239*fb038ce4SYangtao Li * Force OHCI 12M clock sources to 00 (12MHz divided from 48MHz) 1240*fb038ce4SYangtao Li * 1241*fb038ce4SYangtao Li * This clock mux is still mysterious, and the code just enforces 1242*fb038ce4SYangtao Li * it to have a valid clock parent. 1243*fb038ce4SYangtao Li */ 1244*fb038ce4SYangtao Li for (i = 0; i < ARRAY_SIZE(sun50i_a100_usb2_clk_regs); i++) { 1245*fb038ce4SYangtao Li val = readl(reg + sun50i_a100_usb2_clk_regs[i]); 1246*fb038ce4SYangtao Li val &= ~GENMASK(25, 24); 1247*fb038ce4SYangtao Li writel(val, reg + sun50i_a100_usb2_clk_regs[i]); 1248*fb038ce4SYangtao Li } 1249*fb038ce4SYangtao Li 1250*fb038ce4SYangtao Li ret = sunxi_ccu_probe(pdev->dev.of_node, reg, &sun50i_a100_ccu_desc); 1251*fb038ce4SYangtao Li if (ret) 1252*fb038ce4SYangtao Li return ret; 1253*fb038ce4SYangtao Li 1254*fb038ce4SYangtao Li /* Gate then ungate PLL CPU after any rate changes */ 1255*fb038ce4SYangtao Li ccu_pll_notifier_register(&sun50i_a100_pll_cpu_nb); 1256*fb038ce4SYangtao Li 1257*fb038ce4SYangtao Li /* Reparent CPU during PLL CPU rate changes */ 1258*fb038ce4SYangtao Li ccu_mux_notifier_register(pll_cpux_clk.common.hw.clk, 1259*fb038ce4SYangtao Li &sun50i_a100_cpu_nb); 1260*fb038ce4SYangtao Li 1261*fb038ce4SYangtao Li return 0; 1262*fb038ce4SYangtao Li } 1263*fb038ce4SYangtao Li 1264*fb038ce4SYangtao Li static const struct of_device_id sun50i_a100_ccu_ids[] = { 1265*fb038ce4SYangtao Li { .compatible = "allwinner,sun50i-a100-ccu" }, 1266*fb038ce4SYangtao Li { } 1267*fb038ce4SYangtao Li }; 1268*fb038ce4SYangtao Li 1269*fb038ce4SYangtao Li static struct platform_driver sun50i_a100_ccu_driver = { 1270*fb038ce4SYangtao Li .probe = sun50i_a100_ccu_probe, 1271*fb038ce4SYangtao Li .driver = { 1272*fb038ce4SYangtao Li .name = "sun50i-a100-ccu", 1273*fb038ce4SYangtao Li .of_match_table = sun50i_a100_ccu_ids, 1274*fb038ce4SYangtao Li }, 1275*fb038ce4SYangtao Li }; 1276*fb038ce4SYangtao Li module_platform_driver(sun50i_a100_ccu_driver); 1277