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