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