mesong12_clkc.c revision 1.2 1 1.2 thorpej /* $NetBSD: mesong12_clkc.c,v 1.2 2021/01/18 02:35:48 thorpej Exp $ */
2 1.1 ryo
3 1.1 ryo /*-
4 1.1 ryo * Copyright (c) 2019 Jared McNeill <jmcneill (at) invisible.ca>
5 1.1 ryo * All rights reserved.
6 1.1 ryo *
7 1.1 ryo * Redistribution and use in source and binary forms, with or without
8 1.1 ryo * modification, are permitted provided that the following conditions
9 1.1 ryo * are met:
10 1.1 ryo * 1. Redistributions of source code must retain the above copyright
11 1.1 ryo * notice, this list of conditions and the following disclaimer.
12 1.1 ryo * 2. Redistributions in binary form must reproduce the above copyright
13 1.1 ryo * notice, this list of conditions and the following disclaimer in the
14 1.1 ryo * documentation and/or other materials provided with the distribution.
15 1.1 ryo *
16 1.1 ryo * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
17 1.1 ryo * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
18 1.1 ryo * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
19 1.1 ryo * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
20 1.1 ryo * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
21 1.1 ryo * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
22 1.1 ryo * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
23 1.1 ryo * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
24 1.1 ryo * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
25 1.1 ryo * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
26 1.1 ryo * SUCH DAMAGE.
27 1.1 ryo */
28 1.1 ryo
29 1.1 ryo #include <sys/cdefs.h>
30 1.2 thorpej __KERNEL_RCSID(0, "$NetBSD: mesong12_clkc.c,v 1.2 2021/01/18 02:35:48 thorpej Exp $");
31 1.1 ryo
32 1.1 ryo #include <sys/param.h>
33 1.1 ryo #include <sys/types.h>
34 1.1 ryo #include <sys/bus.h>
35 1.1 ryo #include <sys/device.h>
36 1.1 ryo
37 1.1 ryo #include <dev/fdt/fdtvar.h>
38 1.1 ryo
39 1.1 ryo #include <arm/amlogic/meson_clk.h>
40 1.1 ryo #include <arm/amlogic/mesong12_clkc.h>
41 1.1 ryo
42 1.1 ryo #define CBUS_REG(x) ((x) << 2)
43 1.1 ryo
44 1.1 ryo #define HHI_GP0_PLL_CNTL0 CBUS_REG(0x10)
45 1.1 ryo #define HHI_GP0_PLL_CNTL1 CBUS_REG(0x11)
46 1.1 ryo #define HHI_GP0_PLL_CNTL2 CBUS_REG(0x12)
47 1.1 ryo #define HHI_GP0_PLL_CNTL3 CBUS_REG(0x13)
48 1.1 ryo #define HHI_GP0_PLL_CNTL4 CBUS_REG(0x14)
49 1.1 ryo #define HHI_GP0_PLL_CNTL5 CBUS_REG(0x15)
50 1.1 ryo #define HHI_GP0_PLL_CNTL6 CBUS_REG(0x16)
51 1.1 ryo #define HHI_GP1_PLL_CNTL0 CBUS_REG(0x18)
52 1.1 ryo #define HHI_GP1_PLL_CNTL1 CBUS_REG(0x19)
53 1.1 ryo #define HHI_PCIE_PLL_CNTL0 CBUS_REG(0x26)
54 1.1 ryo #define HHI_PCIE_PLL_CNTL0_PCIE_APLL_LOCK __BIT(31)
55 1.1 ryo #define HHI_PCIE_PLL_CNTL0_PCIE_HCSL_CAL_DONE __BIT(30)
56 1.1 ryo #define HHI_PCIE_PLL_CNTL0_PCIE_APLL_RESET __BIT(29)
57 1.1 ryo #define HHI_PCIE_PLL_CNTL0_PCIE_APLL_EN __BIT(28)
58 1.1 ryo #define HHI_PCIE_PLL_CNTL0_PCIE_APLL_VCO_DIV_SEL __BIT(27)
59 1.1 ryo #define HHI_PCIE_PLL_CNTL0_PCIE_APLL_AFC_START __BIT(26)
60 1.1 ryo #define HHI_PCIE_PLL_CNTL0_PCIE_APLL_OD __BITS(20,16)
61 1.1 ryo #define HHI_PCIE_PLL_CNTL0_PCIE_APLL_PREDIV_SEL __BITS(14,10)
62 1.1 ryo #define HHI_PCIE_PLL_CNTL0_PCIE_APLL_FBKDIV __BITS(7,0)
63 1.1 ryo #define HHI_PCIE_PLL_CNTL1 CBUS_REG(0x27)
64 1.1 ryo #define HHI_PCIE_PLL_CNTL1_PCIE_APLL_SDM_EN __BIT(12)
65 1.1 ryo #define HHI_PCIE_PLL_CNTL1_PCIE_APLL_SDM_FRAC __BITS(11,0)
66 1.1 ryo #define HHI_PCIE_PLL_CNTL2 CBUS_REG(0x28)
67 1.1 ryo #define HHI_PCIE_PLL_CNTL2_PCIE_APLL_SSC_DEP_SEL __BITS(31,28)
68 1.1 ryo #define HHI_PCIE_PLL_CNTL2_PCIE_APLL_SSC_FREF_SEL __BITS(25,24)
69 1.1 ryo #define HHI_PCIE_PLL_CNTL2_PCIE_APLL_SSC_MODE __BITS(23,22)
70 1.1 ryo #define HHI_PCIE_PLL_CNTL2_PCIE_APLL_SSC_OFFSET __BITS(21,20)
71 1.1 ryo #define HHI_PCIE_PLL_CNTL2_PCIE_APLL_STR_M __BITS(19,18)
72 1.1 ryo #define HHI_PCIE_PLL_CNTL2_PCIE_APLL_RESERVE __BITS(15,0)
73 1.1 ryo #define HHI_PCIE_PLL_CNTL3 CBUS_REG(0x29)
74 1.1 ryo #define HHI_PCIE_PLL_CNTL3_PCIE_APLL_AFC_BYPASS_EN __BIT(31)
75 1.1 ryo #define HHI_PCIE_PLL_CNTL3_PCIE_APLL_AFC_HOLD_T __BITS(29,28)
76 1.1 ryo #define HHI_PCIE_PLL_CNTL3_PCIE_APLL_AFC_IN __BITS(26,20)
77 1.1 ryo #define HHI_PCIE_PLL_CNTL3_PCIE_APLL_AFC_NT __BIT(19)
78 1.1 ryo #define HHI_PCIE_PLL_CNTL3_PCIE_APLL_AFC_DIV __BITS(18,17)
79 1.1 ryo #define HHI_PCIE_PLL_CNTL3_PCIE_APLL_BIAS_LPF_EN __BIT(16)
80 1.1 ryo #define HHI_PCIE_PLL_CNTL3_PCIE_APLL_CP_ICAP __BITS(15,12)
81 1.1 ryo #define HHI_PCIE_PLL_CNTL3_PCIE_APLL_CP_IRES __BITS(11,8)
82 1.1 ryo #define HHI_PCIE_PLL_CNTL3_PCIE_APLL_CPI __BITS(5,4)
83 1.1 ryo #define HHI_PCIE_PLL_CNTL4 CBUS_REG(0x2a)
84 1.1 ryo #define HHI_PCIE_PLL_CNTL4_PCIE_APLL_SHIFT_EN __BIT(31)
85 1.1 ryo #define HHI_PCIE_PLL_CNTL4_PCIE_APLL_SHIFT_T __BITS(27,26)
86 1.1 ryo #define HHI_PCIE_PLL_CNTL4_PCIE_APLL_SHIFT_V __BITS(25,24)
87 1.1 ryo #define HHI_PCIE_PLL_CNTL4_PCIE_APLL_VCTRL_MON_EN __BIT(23)
88 1.1 ryo #define HHI_PCIE_PLL_CNTL4_PCIE_APLL_LPF_CAP __BITS(21,20)
89 1.1 ryo #define HHI_PCIE_PLL_CNTL4_PCIE_APLL_LPF_CAPADJ __BITS(19,16)
90 1.1 ryo #define HHI_PCIE_PLL_CNTL4_PCIE_APLL_LPF_RES __BITS(13,12)
91 1.1 ryo #define HHI_PCIE_PLL_CNTL4_PCIE_APLL_LPF_SF __BIT(11)
92 1.1 ryo #define HHI_PCIE_PLL_CNTL4_PCIE_APLL_LVR_OD_EN __BIT(10)
93 1.1 ryo #define HHI_PCIE_PLL_CNTL4_PCIE_APLL_REFCLK_MON_EN __BIT(9)
94 1.1 ryo #define HHI_PCIE_PLL_CNTL4_PCIE_APLL_FBKCLK_MON_EN __BIT(8)
95 1.1 ryo #define HHI_PCIE_PLL_CNTL4_PCIE_APLL_LOAD __BIT(7)
96 1.1 ryo #define HHI_PCIE_PLL_CNTL4_PCIE_APLL_LOAD_EN __BIT(6)
97 1.1 ryo #define HHI_PCIE_PLL_CNTL5 CBUS_REG(0x2b)
98 1.1 ryo #define HHI_PCIE_PLL_CNTL5_PCIE_HCSL_ADJ_LDO __BITS(30,28)
99 1.1 ryo #define HHI_PCIE_PLL_CNTL5_PCIE_HCSL_BGP_EN __BIT(27)
100 1.1 ryo #define HHI_PCIE_PLL_CNTL5_PCIE_HCSL_BGR_ADJ __BITS(24,20)
101 1.1 ryo #define HHI_PCIE_PLL_CNTL5_PCIE_HCSL_BGR_START __BIT(19)
102 1.1 ryo #define HHI_PCIE_PLL_CNTL5_PCIE_HCSL_BGR_VREF __BITS(16,12)
103 1.1 ryo #define HHI_PCIE_PLL_CNTL5_PCIE_HCSL_BY_IMP_IN __BITS(11,8)
104 1.1 ryo #define HHI_PCIE_PLL_CNTL5_PCIE_HCSL_BY_IMP __BIT(7)
105 1.1 ryo #define HHI_PCIE_PLL_CNTL5_PCIE_HCSL_CAL_EN __BIT(6)
106 1.1 ryo #define HHI_PCIE_PLL_CNTL5_PCIE_HCSL_CAL_RSTN __BIT(5)
107 1.1 ryo #define HHI_PCIE_PLL_CNTL5_PCIE_HCSL_EDGEDRV_EN __BIT(4)
108 1.1 ryo #define HHI_PCIE_PLL_CNTL5_PCIE_HCSL_EN0 __BIT(3)
109 1.1 ryo #define HHI_PCIE_PLL_CNTL5_PCIE_HCSL_IN_EN __BIT(2)
110 1.1 ryo #define HHI_PCIE_PLL_CNTL5_PCIE_HCSL_SEL_PW __BIT(1)
111 1.1 ryo #define HHI_PCIE_PLL_CNTL5_PCIE_HCSL_SEL_STR __BIT(0)
112 1.1 ryo
113 1.1 ryo #define HHI_HIFI_PLL_CNTL0 CBUS_REG(0x36)
114 1.1 ryo #define HHI_HIFI_PLL_CNTL1 CBUS_REG(0x37)
115 1.1 ryo #define HHI_HIFI_PLL_CNTL2 CBUS_REG(0x38)
116 1.1 ryo #define HHI_HIFI_PLL_CNTL3 CBUS_REG(0x39)
117 1.1 ryo #define HHI_HIFI_PLL_CNTL4 CBUS_REG(0x3a)
118 1.1 ryo #define HHI_HIFI_PLL_CNTL5 CBUS_REG(0x3b)
119 1.1 ryo #define HHI_HIFI_PLL_CNTL6 CBUS_REG(0x3c)
120 1.1 ryo #define HHI_MEM_PD_REG0 CBUS_REG(0x40)
121 1.1 ryo #define HHI_GCLK_MPEG0 CBUS_REG(0x50)
122 1.1 ryo #define HHI_GCLK_MPEG1 CBUS_REG(0x51)
123 1.1 ryo #define HHI_GCLK_MPEG2 CBUS_REG(0x52)
124 1.1 ryo #define HHI_GCLK_OTHER CBUS_REG(0x54)
125 1.1 ryo #define HHI_GCLK_OTHER2 CBUS_REG(0x55)
126 1.1 ryo #define HHI_SYS_CPU_CLK_CNTL1 CBUS_REG(0x57)
127 1.1 ryo #define HHI_MPEG_CLK_CNTL CBUS_REG(0x5d)
128 1.1 ryo #define HHI_TS_CLK_CNTL CBUS_REG(0x64)
129 1.1 ryo #define HHI_SYS_CPU_CLK_CNTL0 CBUS_REG(0x67)
130 1.1 ryo #define HHI_VID_PLL_CLK_DIV CBUS_REG(0x68)
131 1.1 ryo #define HHI_SYS_CPUB_CLK_CNTL1 CBUS_REG(0x80)
132 1.1 ryo #define HHI_SYS_CPUB_CLK_CNTL CBUS_REG(0x82)
133 1.1 ryo #define HHI_NAND_CLK_CNTL CBUS_REG(0x97)
134 1.1 ryo #define HHI_SD_EMMC_CLK_CNTL CBUS_REG(0x99)
135 1.1 ryo #define HHI_MPLL_CNTL0 CBUS_REG(0x9e)
136 1.1 ryo #define HHI_MPLL_CNTL1 CBUS_REG(0x9f)
137 1.1 ryo #define HHI_MPLL_CNTL2 CBUS_REG(0xa0)
138 1.1 ryo #define HHI_MPLL_CNTL3 CBUS_REG(0xa1)
139 1.1 ryo #define HHI_MPLL_CNTL4 CBUS_REG(0xa2)
140 1.1 ryo #define HHI_MPLL_CNTL5 CBUS_REG(0xa3)
141 1.1 ryo #define HHI_MPLL_CNTL6 CBUS_REG(0xa4)
142 1.1 ryo #define HHI_MPLL_CNTL7 CBUS_REG(0xa5)
143 1.1 ryo #define HHI_MPLL_CNTL8 CBUS_REG(0xa6)
144 1.1 ryo #define HHI_FIX_PLL_CNTL0 CBUS_REG(0xa8)
145 1.1 ryo #define HHI_FIX_PLL_CNTL1 CBUS_REG(0xa9)
146 1.1 ryo #define HHI_FIX_PLL_CNTL2 CBUS_REG(0xaa)
147 1.1 ryo #define HHI_FIX_PLL_CNTL3 CBUS_REG(0xab)
148 1.1 ryo #define HHI_SYS_PLL_CNTL0 CBUS_REG(0xbd)
149 1.1 ryo #define HHI_SYS_PLL_CNTL1 CBUS_REG(0xbe)
150 1.1 ryo #define HHI_SYS_PLL_CNTL2 CBUS_REG(0xbf)
151 1.1 ryo #define HHI_SYS_PLL_CNTL3 CBUS_REG(0xc0)
152 1.1 ryo #define HHI_SYS_PLL_CNTL4 CBUS_REG(0xc1)
153 1.1 ryo #define HHI_SYS_PLL_CNTL5 CBUS_REG(0xc2)
154 1.1 ryo #define HHI_SYS_PLL_CNTL6 CBUS_REG(0xc3)
155 1.1 ryo #define HHI_HDMI_PLL_CNTL0 CBUS_REG(0xc8)
156 1.1 ryo #define HHI_HDMI_PLL_CNTL1 CBUS_REG(0xc9)
157 1.1 ryo #define HHI_SYS1_PLL_CNTL0 CBUS_REG(0xe0)
158 1.1 ryo #define HHI_SYS1_PLL_CNTL1 CBUS_REG(0xe1)
159 1.1 ryo #define HHI_SYS1_PLL_CNTL2 CBUS_REG(0xe2)
160 1.1 ryo #define HHI_SYS1_PLL_CNTL3 CBUS_REG(0xe3)
161 1.1 ryo #define HHI_SYS1_PLL_CNTL4 CBUS_REG(0xe4)
162 1.1 ryo #define HHI_SYS1_PLL_CNTL5 CBUS_REG(0xe5)
163 1.1 ryo #define HHI_SYS1_PLL_CNTL6 CBUS_REG(0xe6)
164 1.1 ryo
165 1.1 ryo static int mesong12_clkc_match(device_t, cfdata_t, void *);
166 1.1 ryo static void mesong12_clkc_attach(device_t, device_t, void *);
167 1.1 ryo
168 1.1 ryo static u_int mesong12_cpuclk_get_rate(struct meson_clk_softc *,
169 1.1 ryo struct meson_clk_clk *);
170 1.1 ryo static int mesong12_cpuclk_set_rate(struct meson_clk_softc *,
171 1.1 ryo struct meson_clk_clk *, u_int);
172 1.1 ryo static int mesong12_clk_pcie_pll_set_rate(struct meson_clk_softc *,
173 1.1 ryo struct meson_clk_clk *, u_int);
174 1.1 ryo
175 1.1 ryo struct mesong12_clkc_config {
176 1.1 ryo const char *name;
177 1.1 ryo struct meson_clk_clk *clks;
178 1.1 ryo int nclks;
179 1.1 ryo };
180 1.1 ryo
181 1.1 ryo #define PARENTS(args...) ((const char *[]){ args })
182 1.1 ryo
183 1.1 ryo /* fixed pll */
184 1.1 ryo #define G12_CLK_fixed_pll_dco \
185 1.1 ryo MESON_CLK_PLL(MESONG12_CLOCK_FIXED_PLL_DCO, "fixed_pll_dco", \
186 1.1 ryo "xtal", /* parent */ \
187 1.1 ryo MESON_CLK_PLL_REG(HHI_FIX_PLL_CNTL0, __BIT(28)), /* enable */ \
188 1.1 ryo MESON_CLK_PLL_REG(HHI_FIX_PLL_CNTL0, __BITS(7,0)), /* m */ \
189 1.1 ryo MESON_CLK_PLL_REG(HHI_FIX_PLL_CNTL0, __BITS(14,10)),/* n */ \
190 1.1 ryo MESON_CLK_PLL_REG(HHI_FIX_PLL_CNTL1, __BITS(16,0)), /* frac */ \
191 1.1 ryo MESON_CLK_PLL_REG(HHI_FIX_PLL_CNTL0, __BIT(31)), /* l */ \
192 1.1 ryo MESON_CLK_PLL_REG(HHI_FIX_PLL_CNTL0, __BIT(29)), /* reset */ \
193 1.1 ryo 0)
194 1.1 ryo #define G12_CLK_fixed_pll \
195 1.1 ryo MESON_CLK_DIV(MESONG12_CLOCK_FIXED_PLL, "fixed_pll", \
196 1.1 ryo "fixed_pll_dco", /* parent */ \
197 1.1 ryo HHI_FIX_PLL_CNTL0, /* reg */ \
198 1.1 ryo __BITS(17,16), /* div */ \
199 1.1 ryo MESON_CLK_DIV_POWER_OF_TWO)
200 1.1 ryo
201 1.1 ryo /* sys pll */
202 1.1 ryo #define G12_CLK_sys_pll_dco \
203 1.1 ryo MESON_CLK_PLL(MESONG12_CLOCK_SYS_PLL_DCO, "sys_pll_dco", \
204 1.1 ryo "xtal", /* parent */ \
205 1.1 ryo MESON_CLK_PLL_REG(HHI_SYS_PLL_CNTL0, __BIT(28)), /* enable */ \
206 1.1 ryo MESON_CLK_PLL_REG(HHI_SYS_PLL_CNTL0, __BITS(7,0)), /* m */ \
207 1.1 ryo MESON_CLK_PLL_REG(HHI_SYS_PLL_CNTL0, __BITS(14,10)),/* n */ \
208 1.1 ryo MESON_CLK_PLL_REG_INVALID, /* frac */ \
209 1.1 ryo MESON_CLK_PLL_REG(HHI_SYS_PLL_CNTL0, __BIT(31)), /* l */ \
210 1.1 ryo MESON_CLK_PLL_REG(HHI_SYS_PLL_CNTL0, __BIT(29)), /* reset */ \
211 1.1 ryo 0)
212 1.1 ryo #define G12_CLK_sys_pll \
213 1.1 ryo MESON_CLK_DIV(MESONG12_CLOCK_SYS_PLL, "sys_pll", \
214 1.1 ryo "sys_pll_dco", /* parent */ \
215 1.1 ryo HHI_SYS_PLL_CNTL0, /* reg */ \
216 1.1 ryo __BITS(18,16), /* div */ \
217 1.1 ryo MESON_CLK_DIV_POWER_OF_TWO | MESON_CLK_DIV_SET_RATE_PARENT)
218 1.1 ryo
219 1.1 ryo /* sys1 pll */
220 1.1 ryo #define G12B_CLK_sys1_pll_dco \
221 1.1 ryo MESON_CLK_PLL(MESONG12_CLOCK_SYS1_PLL_DCO, "sys1_pll_dco", \
222 1.1 ryo "xtal", /* parent */ \
223 1.1 ryo MESON_CLK_PLL_REG(HHI_SYS1_PLL_CNTL0, __BIT(28)), /* enable */ \
224 1.1 ryo MESON_CLK_PLL_REG(HHI_SYS1_PLL_CNTL0, __BITS(7,0)), /* m */ \
225 1.1 ryo MESON_CLK_PLL_REG(HHI_SYS1_PLL_CNTL0, __BITS(14,10)),/* n */ \
226 1.1 ryo MESON_CLK_PLL_REG_INVALID, /* frac */ \
227 1.1 ryo MESON_CLK_PLL_REG(HHI_SYS1_PLL_CNTL0, __BIT(31)), /* l */ \
228 1.1 ryo MESON_CLK_PLL_REG(HHI_SYS1_PLL_CNTL0, __BIT(29)), /* reset */ \
229 1.1 ryo 0)
230 1.1 ryo #define G12B_CLK_sys1_pll \
231 1.1 ryo MESON_CLK_DIV(MESONG12_CLOCK_SYS1_PLL, "sys1_pll", \
232 1.1 ryo "sys1_pll_dco", /* parent */ \
233 1.1 ryo HHI_SYS1_PLL_CNTL0, /* reg */ \
234 1.1 ryo __BITS(18,16), /* div */ \
235 1.1 ryo MESON_CLK_DIV_POWER_OF_TWO | MESON_CLK_DIV_SET_RATE_PARENT)
236 1.1 ryo
237 1.1 ryo /* fclk div */
238 1.1 ryo #define G12_CLK_fclk_div2_div \
239 1.1 ryo MESON_CLK_FIXED_FACTOR(MESONG12_CLOCK_FCLK_DIV2_DIV, "fclk_div2_div", \
240 1.1 ryo "fixed_pll", /* parent */ \
241 1.1 ryo 2, /* div */ \
242 1.1 ryo 1) /* mult */
243 1.1 ryo #define G12_CLK_fclk_div2 \
244 1.1 ryo MESON_CLK_GATE(MESONG12_CLOCK_FCLK_DIV2, "fclk_div2", \
245 1.1 ryo "fclk_div2_div", /* parent */ \
246 1.1 ryo HHI_FIX_PLL_CNTL1, /* reg */ \
247 1.1 ryo 24) /* bit */
248 1.1 ryo #define G12_CLK_fclk_div2p5_div \
249 1.1 ryo MESON_CLK_FIXED_FACTOR(MESONG12_CLOCK_FCLK_DIV2P5_DIV, \
250 1.1 ryo "fclk_div2p5_div", \
251 1.1 ryo "fixed_pll_dco", /* parent */ \
252 1.1 ryo 5, /* div */ \
253 1.1 ryo 1) /* mult */
254 1.1 ryo #define G12_CLK_fclk_div3_div \
255 1.1 ryo MESON_CLK_FIXED_FACTOR(MESONG12_CLOCK_FCLK_DIV3_DIV, \
256 1.1 ryo "fclk_div3_div", \
257 1.1 ryo "fixed_pll", /* parent */ \
258 1.1 ryo 3, /* div */ \
259 1.1 ryo 1) /* mult */
260 1.1 ryo #define G12_CLK_fclk_div3 \
261 1.1 ryo MESON_CLK_GATE(MESONG12_CLOCK_FCLK_DIV3, "fclk_div3", \
262 1.1 ryo "fclk_div3_div", /* parent */ \
263 1.1 ryo HHI_FIX_PLL_CNTL1, /* reg */ \
264 1.1 ryo 20) /* bit */
265 1.1 ryo #define G12_CLK_fclk_div4_div \
266 1.1 ryo MESON_CLK_FIXED_FACTOR(MESONG12_CLOCK_FCLK_DIV4_DIV, "fclk_div4_div", \
267 1.1 ryo "fixed_pll", /* parent */ \
268 1.1 ryo 4, /* div */ \
269 1.1 ryo 1) /* mult */
270 1.1 ryo #define G12_CLK_fclk_div4 \
271 1.1 ryo MESON_CLK_GATE(MESONG12_CLOCK_FCLK_DIV4, "fclk_div4", \
272 1.1 ryo "fclk_div4_div", /* parent */ \
273 1.1 ryo HHI_FIX_PLL_CNTL1, /* reg */ \
274 1.1 ryo 21) /* bit */
275 1.1 ryo #define G12_CLK_fclk_div5_div \
276 1.1 ryo MESON_CLK_FIXED_FACTOR(MESONG12_CLOCK_FCLK_DIV5_DIV, "fclk_div5_div", \
277 1.1 ryo "fixed_pll", /* parent */ \
278 1.1 ryo 5, /* div */ \
279 1.1 ryo 1) /* mult */
280 1.1 ryo #define G12_CLK_fclk_div5 \
281 1.1 ryo MESON_CLK_GATE(MESONG12_CLOCK_FCLK_DIV5, "fclk_div5", \
282 1.1 ryo "fclk_div5_div", /* parent */ \
283 1.1 ryo HHI_FIX_PLL_CNTL1, /* reg */ \
284 1.1 ryo 22) /* bit */
285 1.1 ryo #define G12_CLK_fclk_div7_div \
286 1.1 ryo MESON_CLK_FIXED_FACTOR(MESONG12_CLOCK_FCLK_DIV7_DIV, "fclk_div7_div", \
287 1.1 ryo "fixed_pll", /* parent */ \
288 1.1 ryo 7, /* div */ \
289 1.1 ryo 1) /* mult */
290 1.1 ryo #define G12_CLK_fclk_div7 \
291 1.1 ryo MESON_CLK_GATE(MESONG12_CLOCK_FCLK_DIV7, "fclk_div7", \
292 1.1 ryo "fclk_div7_div", /* parent */ \
293 1.1 ryo HHI_FIX_PLL_CNTL1, /* reg */ \
294 1.1 ryo 23) /* bit */
295 1.1 ryo
296 1.1 ryo /* mpll */
297 1.1 ryo #define G12_CLK_mpll_prediv \
298 1.1 ryo MESON_CLK_FIXED_FACTOR(MESONG12_CLOCK_MPLL_PREDIV, "mpll_prediv", \
299 1.1 ryo "fixed_pll_dco", /* parent */ \
300 1.1 ryo 2, /* div */ \
301 1.1 ryo 1) /* mult */
302 1.1 ryo #define G12_CLK_mpll0_div \
303 1.1 ryo MESON_CLK_MPLL(MESONG12_CLOCK_MPLL0_DIV, "mpll0_div", \
304 1.1 ryo "mpll_prediv", /* parent */ \
305 1.1 ryo MESON_CLK_PLL_REG(HHI_MPLL_CNTL1, __BITS(13,0)), /* sdm */ \
306 1.1 ryo MESON_CLK_PLL_REG(HHI_MPLL_CNTL1, __BIT(30)), /* sdm_enable */ \
307 1.1 ryo MESON_CLK_PLL_REG(HHI_MPLL_CNTL1, __BITS(28,20)), /* n2 */ \
308 1.1 ryo MESON_CLK_PLL_REG(HHI_MPLL_CNTL1, __BIT(29)), /* ssen */ \
309 1.1 ryo 0)
310 1.1 ryo #define G12_CLK_mpll1_div \
311 1.1 ryo MESON_CLK_MPLL(MESONG12_CLOCK_MPLL1_DIV, "mpll1_div", \
312 1.1 ryo "mpll_prediv", /* parent */ \
313 1.1 ryo MESON_CLK_PLL_REG(HHI_MPLL_CNTL3, __BITS(13,0)), /* sdm */ \
314 1.1 ryo MESON_CLK_PLL_REG(HHI_MPLL_CNTL3, __BIT(30)), /* sdm_enable */ \
315 1.1 ryo MESON_CLK_PLL_REG(HHI_MPLL_CNTL3, __BITS(28,20)), /* n2 */ \
316 1.1 ryo MESON_CLK_PLL_REG(HHI_MPLL_CNTL3, __BIT(29)), /* ssen */ \
317 1.1 ryo 0)
318 1.1 ryo #define G12_CLK_mpll2_div \
319 1.1 ryo MESON_CLK_MPLL(MESONG12_CLOCK_MPLL2_DIV, "mpll2_div", \
320 1.1 ryo "mpll_prediv", /* parent */ \
321 1.1 ryo MESON_CLK_PLL_REG(HHI_MPLL_CNTL5, __BITS(13,0)), /* sdm */ \
322 1.1 ryo MESON_CLK_PLL_REG(HHI_MPLL_CNTL5, __BIT(30)), /* sdm_enable */ \
323 1.1 ryo MESON_CLK_PLL_REG(HHI_MPLL_CNTL5, __BITS(28,20)), /* n2 */ \
324 1.1 ryo MESON_CLK_PLL_REG(HHI_MPLL_CNTL5, __BIT(29)), /* ssen */ \
325 1.1 ryo 0)
326 1.1 ryo #define G12_CLK_mpll0 \
327 1.1 ryo MESON_CLK_GATE(MESONG12_CLOCK_MPLL0, "mpll0", \
328 1.1 ryo "mpll0_div", /* parent */ \
329 1.1 ryo HHI_MPLL_CNTL1, /* reg */ \
330 1.1 ryo 31) /* bit */
331 1.1 ryo #define G12_CLK_mpll1 \
332 1.1 ryo MESON_CLK_GATE(MESONG12_CLOCK_MPLL1, "mpll1", \
333 1.1 ryo "mpll1_div", /* parent */ \
334 1.1 ryo HHI_MPLL_CNTL3, /* reg */ \
335 1.1 ryo 31) /* bit */
336 1.1 ryo #define G12_CLK_mpll2 \
337 1.1 ryo MESON_CLK_GATE(MESONG12_CLOCK_MPLL2, "mpll2", \
338 1.1 ryo "mpll2_div", /* parent */ \
339 1.1 ryo HHI_MPLL_CNTL5, /* reg */ \
340 1.1 ryo 31) /* bit */
341 1.1 ryo #define G12_CLK_mpll_50m_div \
342 1.1 ryo MESON_CLK_FIXED_FACTOR(MESONG12_CLOCK_MPLL_50M_DIV, "mpll_50m_div", \
343 1.1 ryo "fixed_pll_dco", /* parent */ \
344 1.1 ryo 80, /* div */ \
345 1.1 ryo 1) /* mult */
346 1.1 ryo #define G12_CLK_mpll_50m \
347 1.1 ryo MESON_CLK_MUX(MESONG12_CLOCK_MPLL_50M, "mpll_50m", \
348 1.1 ryo PARENTS("mpll_50m_div", "xtal"), \
349 1.1 ryo HHI_FIX_PLL_CNTL3, /* reg */ \
350 1.1 ryo __BIT(5), /* sel */ \
351 1.1 ryo 0)
352 1.1 ryo
353 1.1 ryo /* sd/emmc */
354 1.1 ryo #define G12_CLK_sd_emmc_a_clk0_sel \
355 1.1 ryo MESON_CLK_MUX(MESONG12_CLOCK_SD_EMMC_A_CLK0_SEL, "sd_emmc_a_clk0_sel", \
356 1.1 ryo PARENTS("xtal", "fclk_div2", "fclk_div3", \
357 1.1 ryo "fclk_div5", "fclk_div7"), \
358 1.1 ryo HHI_SD_EMMC_CLK_CNTL, /* reg */ \
359 1.1 ryo __BITS(11,9), /* sel */ \
360 1.1 ryo 0)
361 1.1 ryo #define G12_CLK_sd_emmc_b_clk0_sel \
362 1.1 ryo MESON_CLK_MUX(MESONG12_CLOCK_SD_EMMC_B_CLK0_SEL, "sd_emmc_b_clk0_sel", \
363 1.1 ryo PARENTS("xtal", "fclk_div2", "fclk_div3", \
364 1.1 ryo "fclk_div5", "fclk_div7"), \
365 1.1 ryo HHI_SD_EMMC_CLK_CNTL, /* reg */ \
366 1.1 ryo __BITS(27,25), /* sel */ \
367 1.1 ryo 0)
368 1.1 ryo #define G12_CLK_sd_emmc_c_clk0_sel \
369 1.1 ryo MESON_CLK_MUX(MESONG12_CLOCK_SD_EMMC_C_CLK0_SEL, "sd_emmc_c_clk0_sel", \
370 1.1 ryo PARENTS("xtal", "fclk_div2", "fclk_div3", \
371 1.1 ryo "fclk_div5", "fclk_div7"), \
372 1.1 ryo HHI_NAND_CLK_CNTL, /* reg */ \
373 1.1 ryo __BITS(11,9), /* sel */ \
374 1.1 ryo 0)
375 1.1 ryo #define G12_CLK_sd_emmc_a_clk0_div \
376 1.1 ryo MESON_CLK_DIV(MESONG12_CLOCK_SD_EMMC_A_CLK0_DIV, "sd_emmc_a_clk0_div", \
377 1.1 ryo "sd_emmc_a_clk0_sel", /* parent */ \
378 1.1 ryo HHI_SD_EMMC_CLK_CNTL, /* reg */ \
379 1.1 ryo __BITS(6,0), /* div */ \
380 1.1 ryo 0)
381 1.1 ryo #define G12_CLK_sd_emmc_b_clk0_div \
382 1.1 ryo MESON_CLK_DIV(MESONG12_CLOCK_SD_EMMC_B_CLK0_DIV, "sd_emmc_b_clk0_div", \
383 1.1 ryo "sd_emmc_b_clk0_sel", /* parent */ \
384 1.1 ryo HHI_SD_EMMC_CLK_CNTL, /* reg */ \
385 1.1 ryo __BITS(22,16), /* div */ \
386 1.1 ryo 0)
387 1.1 ryo #define G12_CLK_sd_emmc_c_clk0_div \
388 1.1 ryo MESON_CLK_DIV(MESONG12_CLOCK_SD_EMMC_C_CLK0_DIV, "sd_emmc_c_clk0_div", \
389 1.1 ryo "sd_emmc_c_clk0_sel", /* parent */ \
390 1.1 ryo HHI_NAND_CLK_CNTL, /* reg */ \
391 1.1 ryo __BITS(6,0), /* div */ \
392 1.1 ryo 0)
393 1.1 ryo #define G12_CLK_sd_emmc_a_clk0 \
394 1.1 ryo MESON_CLK_GATE(MESONG12_CLOCK_SD_EMMC_A_CLK0, "sd_emmc_a_clk0", \
395 1.1 ryo "sd_emmc_a_clk0_div", /* parent */ \
396 1.1 ryo HHI_SD_EMMC_CLK_CNTL, /* reg */ \
397 1.1 ryo 7) /* bit */
398 1.1 ryo #define G12_CLK_sd_emmc_b_clk0 \
399 1.1 ryo MESON_CLK_GATE(MESONG12_CLOCK_SD_EMMC_B_CLK0, "sd_emmc_b_clk0", \
400 1.1 ryo "sd_emmc_b_clk0_div", /* parent */ \
401 1.1 ryo HHI_SD_EMMC_CLK_CNTL, /* reg */ \
402 1.1 ryo 23) /* bit */
403 1.1 ryo #define G12_CLK_sd_emmc_c_clk0 \
404 1.1 ryo MESON_CLK_GATE(MESONG12_CLOCK_SD_EMMC_C_CLK0, "sd_emmc_c_clk0", \
405 1.1 ryo "sd_emmc_c_clk0_div", /* parent */ \
406 1.1 ryo HHI_NAND_CLK_CNTL, /* reg */ \
407 1.1 ryo 7) /* bit */
408 1.1 ryo
409 1.1 ryo /* source as mpeg_clk */
410 1.1 ryo #define G12_CLK_mpeg_sel \
411 1.1 ryo MESON_CLK_MUX(MESONG12_CLOCK_MPEG_SEL, "mpeg_sel", \
412 1.1 ryo PARENTS("xtal", NULL, "fclk_div7", "mpll1", \
413 1.1 ryo "mpll2", "fclk_div4", "fclk_div3", "fclk_div5"), \
414 1.1 ryo HHI_MPEG_CLK_CNTL, /* reg */ \
415 1.1 ryo __BITS(14,12), /* sel */ \
416 1.1 ryo 0)
417 1.1 ryo #define G12_CLK_mpeg_clk_div \
418 1.1 ryo MESON_CLK_DIV(MESONG12_CLOCK_MPEG_DIV, "mpeg_clk_div", \
419 1.1 ryo "mpeg_sel", /* parent */ \
420 1.1 ryo HHI_MPEG_CLK_CNTL, /* reg */ \
421 1.1 ryo __BITS(6,0), /* div */ \
422 1.1 ryo MESON_CLK_DIV_SET_RATE_PARENT)
423 1.1 ryo #define G12_CLK_clk81 \
424 1.1 ryo MESON_CLK_GATE(MESONG12_CLOCK_CLK81, "clk81", \
425 1.1 ryo "mpeg_clk_div", /* parent */ \
426 1.1 ryo HHI_MPEG_CLK_CNTL, /* reg */ \
427 1.1 ryo 7) /* bit */
428 1.1 ryo #define G12_CLK_ddr \
429 1.1 ryo MESON_CLK_GATE(MESONG12_CLOCK_DDR, "ddr", \
430 1.1 ryo "clk81", /* parent */ \
431 1.1 ryo HHI_GCLK_MPEG0, /* reg */ \
432 1.1 ryo 0) /* bit */
433 1.1 ryo #define G12_CLK_dos \
434 1.1 ryo MESON_CLK_GATE(MESONG12_CLOCK_DOS, "dos", \
435 1.1 ryo "clk81", /* parent */ \
436 1.1 ryo HHI_GCLK_MPEG0, /* reg */ \
437 1.1 ryo 1) /* bit */
438 1.1 ryo #define G12_CLK_audio_locker \
439 1.1 ryo MESON_CLK_GATE(MESONG12_CLOCK_AUDIO_LOCKER, "audio_locker", \
440 1.1 ryo "clk81", /* parent */ \
441 1.1 ryo HHI_GCLK_MPEG0, /* reg */ \
442 1.1 ryo 2) /* bit */
443 1.1 ryo #define G12_CLK_mipi_dsi_host \
444 1.1 ryo MESON_CLK_GATE(MESONG12_CLOCK_MIPI_DSI_HOST, "mipi_dsi_host", \
445 1.1 ryo "clk81", /* parent */ \
446 1.1 ryo HHI_GCLK_MPEG0, /* reg */ \
447 1.1 ryo 3) /* bit */
448 1.1 ryo #define G12_CLK_eth_phy \
449 1.1 ryo MESON_CLK_GATE(MESONG12_CLOCK_ETH_PHY, "eth_phy", \
450 1.1 ryo "clk81", /* parent */ \
451 1.1 ryo HHI_GCLK_MPEG0, /* reg */ \
452 1.1 ryo 4) /* bit */
453 1.1 ryo #define G12_CLK_isa \
454 1.1 ryo MESON_CLK_GATE(MESONG12_CLOCK_ISA, "isa", \
455 1.1 ryo "clk81", /* parent */ \
456 1.1 ryo HHI_GCLK_MPEG0, /* reg */ \
457 1.1 ryo 5) /* bit */
458 1.1 ryo #define G12_CLK_pl301 \
459 1.1 ryo MESON_CLK_GATE(MESONG12_CLOCK_PL301, "pl301", \
460 1.1 ryo "clk81", /* parent */ \
461 1.1 ryo HHI_GCLK_MPEG0, /* reg */ \
462 1.1 ryo 6) /* bit */
463 1.1 ryo #define G12_CLK_periphs \
464 1.1 ryo MESON_CLK_GATE(MESONG12_CLOCK_PERIPHS, "periphs", \
465 1.1 ryo "clk81", /* parent */ \
466 1.1 ryo HHI_GCLK_MPEG0, /* reg */ \
467 1.1 ryo 7) /* bit */
468 1.1 ryo #define G12_CLK_spicc0 \
469 1.1 ryo MESON_CLK_GATE(MESONG12_CLOCK_SPICC0, "spicc0", \
470 1.1 ryo "clk81", /* parent */ \
471 1.1 ryo HHI_GCLK_MPEG0, /* reg */ \
472 1.1 ryo 8) /* bit */
473 1.1 ryo #define G12_CLK_i2c \
474 1.1 ryo MESON_CLK_GATE(MESONG12_CLOCK_I2C, "i2c", \
475 1.1 ryo "clk81", /* parent */ \
476 1.1 ryo HHI_GCLK_MPEG0, /* reg */ \
477 1.1 ryo 9) /* bit */
478 1.1 ryo #define G12_CLK_sana \
479 1.1 ryo MESON_CLK_GATE(MESONG12_CLOCK_SANA, "sana", \
480 1.1 ryo "clk81", /* parent */ \
481 1.1 ryo HHI_GCLK_MPEG0, /* reg */ \
482 1.1 ryo 10) /* bit */
483 1.1 ryo #define G12_CLK_sd \
484 1.1 ryo MESON_CLK_GATE(MESONG12_CLOCK_SD, "sd", \
485 1.1 ryo "clk81", /* parent */ \
486 1.1 ryo HHI_GCLK_MPEG0, /* reg */ \
487 1.1 ryo 11) /* bit */
488 1.1 ryo #define G12_CLK_rng0 \
489 1.1 ryo MESON_CLK_GATE(MESONG12_CLOCK_RNG0, "rng0", \
490 1.1 ryo "clk81", /* parent */ \
491 1.1 ryo HHI_GCLK_MPEG0, /* reg */ \
492 1.1 ryo 12) /* bit */
493 1.1 ryo #define G12_CLK_uart0 \
494 1.1 ryo MESON_CLK_GATE(MESONG12_CLOCK_UART0, "uart0", \
495 1.1 ryo "clk81", /* parent */ \
496 1.1 ryo HHI_GCLK_MPEG0, /* reg */ \
497 1.1 ryo 13) /* bit */
498 1.1 ryo #define G12_CLK_spicc1 \
499 1.1 ryo MESON_CLK_GATE(MESONG12_CLOCK_SPICC1, "spicc1", \
500 1.1 ryo "clk81", /* parent */ \
501 1.1 ryo HHI_GCLK_MPEG0, /* reg */ \
502 1.1 ryo 14) /* bit */
503 1.1 ryo #define G12_CLK_hiu_iface \
504 1.1 ryo MESON_CLK_GATE(MESONG12_CLOCK_HIU_IFACE, "hiu_iface", \
505 1.1 ryo "clk81", /* parent */ \
506 1.1 ryo HHI_GCLK_MPEG0, /* reg */ \
507 1.1 ryo 19) /* bit */
508 1.1 ryo #define G12_CLK_mipi_dsi_phy \
509 1.1 ryo MESON_CLK_GATE(MESONG12_CLOCK_MIPI_DSI_PHY, "mipi_dsi_phy", \
510 1.1 ryo "clk81", /* parent */ \
511 1.1 ryo HHI_GCLK_MPEG0, /* reg */ \
512 1.1 ryo 20) /* bit */
513 1.1 ryo #define G12_CLK_assist_misc \
514 1.1 ryo MESON_CLK_GATE(MESONG12_CLOCK_ASSIST_MISC, "assist_misc", \
515 1.1 ryo "clk81", /* parent */ \
516 1.1 ryo HHI_GCLK_MPEG0, /* reg */ \
517 1.1 ryo 23) /* bit */
518 1.1 ryo #define G12_CLK_sd_emmc_a \
519 1.1 ryo MESON_CLK_GATE(MESONG12_CLOCK_SD_EMMC_A, "sd_emmc_a", \
520 1.1 ryo "clk81", /* parent */ \
521 1.1 ryo HHI_GCLK_MPEG0, /* reg */ \
522 1.1 ryo 4) /* bit */
523 1.1 ryo #define G12_CLK_sd_emmc_b \
524 1.1 ryo MESON_CLK_GATE(MESONG12_CLOCK_SD_EMMC_B, "sd_emmc_b", \
525 1.1 ryo "clk81", /* parent */ \
526 1.1 ryo HHI_GCLK_MPEG0, /* reg */ \
527 1.1 ryo 25) /* bit */
528 1.1 ryo #define G12_CLK_sd_emmc_c \
529 1.1 ryo MESON_CLK_GATE(MESONG12_CLOCK_SD_EMMC_C, "sd_emmc_c", \
530 1.1 ryo "clk81", /* parent */ \
531 1.1 ryo HHI_GCLK_MPEG0, /* reg */ \
532 1.1 ryo 26) /* bit */
533 1.1 ryo #define G12_CLK_audio_codec \
534 1.1 ryo MESON_CLK_GATE(MESONG12_CLOCK_AUDIO_CODEC, "audio_codec", \
535 1.1 ryo "clk81", /* parent */ \
536 1.1 ryo HHI_GCLK_MPEG0, /* reg */ \
537 1.1 ryo 28) /* bit */
538 1.1 ryo #define G12_CLK_audio \
539 1.1 ryo MESON_CLK_GATE(MESONG12_CLOCK_AUDIO, "audio", \
540 1.1 ryo "clk81", /* parent */ \
541 1.1 ryo HHI_GCLK_MPEG1, /* reg */ \
542 1.1 ryo 0) /* bit */
543 1.1 ryo #define G12_CLK_eth \
544 1.1 ryo MESON_CLK_GATE(MESONG12_CLOCK_ETH, "eth", \
545 1.1 ryo "clk81", /* parent */ \
546 1.1 ryo HHI_GCLK_MPEG1, /* reg */ \
547 1.1 ryo 3) /* bit */
548 1.1 ryo #define G12_CLK_demux \
549 1.1 ryo MESON_CLK_GATE(MESONG12_CLOCK_DEMUX, "demux", \
550 1.1 ryo "clk81", /* parent */ \
551 1.1 ryo HHI_GCLK_MPEG1, /* reg */ \
552 1.1 ryo 4) /* bit */
553 1.1 ryo #define G12_CLK_audio_ififo \
554 1.1 ryo MESON_CLK_GATE(MESONG12_CLOCK_AUDIO_IFIFO, "audio_ififo", \
555 1.1 ryo "clk81", /* parent */ \
556 1.1 ryo HHI_GCLK_MPEG1, /* reg */ \
557 1.1 ryo 11) /* bit */
558 1.1 ryo #define G12_CLK_adc \
559 1.1 ryo MESON_CLK_GATE(MESONG12_CLOCK_ADC, "adc", \
560 1.1 ryo "clk81", /* parent */ \
561 1.1 ryo HHI_GCLK_MPEG1, /* reg */ \
562 1.1 ryo 13) /* bit */
563 1.1 ryo #define G12_CLK_uart1 \
564 1.1 ryo MESON_CLK_GATE(MESONG12_CLOCK_UART1, "uart1", \
565 1.1 ryo "clk81", /* parent */ \
566 1.1 ryo HHI_GCLK_MPEG1, /* reg */ \
567 1.1 ryo 16) /* bit */
568 1.1 ryo #define G12_CLK_g2d \
569 1.1 ryo MESON_CLK_GATE(MESONG12_CLOCK_G2D, "g2d", \
570 1.1 ryo "clk81", /* parent */ \
571 1.1 ryo HHI_GCLK_MPEG1, /* reg */ \
572 1.1 ryo 20) /* bit */
573 1.1 ryo #define G12_CLK_reset \
574 1.1 ryo MESON_CLK_GATE(MESONG12_CLOCK_RESET, "reset", \
575 1.1 ryo "clk81", /* parent */ \
576 1.1 ryo HHI_GCLK_MPEG1, /* reg */ \
577 1.1 ryo 23) /* bit */
578 1.1 ryo #define G12_CLK_pcie_comb \
579 1.1 ryo MESON_CLK_GATE(MESONG12_CLOCK_PCIE_COMB, "pcie_comb", \
580 1.1 ryo "clk81", /* parent */ \
581 1.1 ryo HHI_GCLK_MPEG1, /* reg */ \
582 1.1 ryo 24) /* bit */
583 1.1 ryo #define G12_CLK_parser \
584 1.1 ryo MESON_CLK_GATE(MESONG12_CLOCK_PARSER, "parser", \
585 1.1 ryo "clk81", /* parent */ \
586 1.1 ryo HHI_GCLK_MPEG1, /* reg */ \
587 1.1 ryo 25) /* bit */
588 1.1 ryo #define G12_CLK_usb \
589 1.1 ryo MESON_CLK_GATE(MESONG12_CLOCK_USB, "usb", \
590 1.1 ryo "clk81", /* parent */ \
591 1.1 ryo HHI_GCLK_MPEG1, /* reg */ \
592 1.1 ryo 26) /* bit */
593 1.1 ryo #define G12_CLK_pcie_phy \
594 1.1 ryo MESON_CLK_GATE(MESONG12_CLOCK_PCIE_PHY, "pcie_phy", \
595 1.1 ryo "clk81", /* parent */ \
596 1.1 ryo HHI_GCLK_MPEG1, /* reg */ \
597 1.1 ryo 27) /* bit */
598 1.1 ryo #define G12_CLK_ahb_arb0 \
599 1.1 ryo MESON_CLK_GATE(MESONG12_CLOCK_AHB_ARB0, "ahb_arb0", \
600 1.1 ryo "clk81", /* parent */ \
601 1.1 ryo HHI_GCLK_MPEG1, /* reg */ \
602 1.1 ryo 29) /* bit */
603 1.1 ryo #define G12_CLK_ahb_data_bus \
604 1.1 ryo MESON_CLK_GATE(MESONG12_CLOCK_AHB_DATA_BUS, "ahb_data_bus", \
605 1.1 ryo "clk81", /* parent */ \
606 1.1 ryo HHI_GCLK_MPEG2, /* reg */ \
607 1.1 ryo 1) /* bit */
608 1.1 ryo #define G12_CLK_ahb_ctrl_bus \
609 1.1 ryo MESON_CLK_GATE(MESONG12_CLOCK_AHB_CTRL_BUS, "ahb_ctrl_bus", \
610 1.1 ryo "clk81", /* parent */ \
611 1.1 ryo HHI_GCLK_MPEG2, /* reg */ \
612 1.1 ryo 2) /* bit */
613 1.1 ryo #define G12_CLK_htx_hdcp22 \
614 1.1 ryo MESON_CLK_GATE(MESONG12_CLOCK_HTX_HDCP22, "htx_hdcp22", \
615 1.1 ryo "clk81", /* parent */ \
616 1.1 ryo HHI_GCLK_MPEG2, /* reg */ \
617 1.1 ryo 3) /* bit */
618 1.1 ryo #define G12_CLK_htx_pclk \
619 1.1 ryo MESON_CLK_GATE(MESONG12_CLOCK_HTX_PCLK, "htx_pclk", \
620 1.1 ryo "clk81", /* parent */ \
621 1.1 ryo HHI_GCLK_MPEG2, /* reg */ \
622 1.1 ryo 4) /* bit */
623 1.1 ryo #define G12_CLK_bt656 \
624 1.1 ryo MESON_CLK_GATE(MESONG12_CLOCK_BT656, "bt656", \
625 1.1 ryo "clk81", /* parent */ \
626 1.1 ryo HHI_GCLK_MPEG2, /* reg */ \
627 1.1 ryo 6) /* bit */
628 1.1 ryo #define G12_CLK_usb1_ddr_bridge \
629 1.1 ryo MESON_CLK_GATE(MESONG12_CLOCK_USB1_DDR_BRIDGE, "usb1_ddr_bridge", \
630 1.1 ryo "clk81", /* parent */ \
631 1.1 ryo HHI_GCLK_MPEG2, /* reg */ \
632 1.1 ryo 8) /* bit */
633 1.1 ryo #define G12_CLK_mmc_pclk \
634 1.1 ryo MESON_CLK_GATE(MESONG12_CLOCK_MMC_PCLK, "mmc_pclk", \
635 1.1 ryo "clk81", /* parent */ \
636 1.1 ryo HHI_GCLK_MPEG2, /* reg */ \
637 1.1 ryo 11) /* bit */
638 1.1 ryo #define G12_CLK_uart2 \
639 1.1 ryo MESON_CLK_GATE(MESONG12_CLOCK_UART2, "uart2", \
640 1.1 ryo "clk81", /* parent */ \
641 1.1 ryo HHI_GCLK_MPEG2, /* reg */ \
642 1.1 ryo 15) /* bit */
643 1.1 ryo #define G12_CLK_vpu_intr \
644 1.1 ryo MESON_CLK_GATE(MESONG12_CLOCK_VPU_INTR, "vpu_intr", \
645 1.1 ryo "clk81", /* parent */ \
646 1.1 ryo HHI_GCLK_MPEG2, /* reg */ \
647 1.1 ryo 25) /* bit */
648 1.1 ryo #define G12_CLK_gic \
649 1.1 ryo MESON_CLK_GATE(MESONG12_CLOCK_GIC, "gic", \
650 1.1 ryo "clk81", /* parent */ \
651 1.1 ryo HHI_GCLK_MPEG2, /* reg */ \
652 1.1 ryo 30) /* bit */
653 1.1 ryo #define G12_CLK_vclk2_venci0 \
654 1.1 ryo MESON_CLK_GATE(MESONG12_CLOCK_VCLK2_VENCI0, "vclk2_venci0", \
655 1.1 ryo "clk81", /* parent */ \
656 1.1 ryo HHI_GCLK_OTHER, /* reg */ \
657 1.1 ryo 1) /* bit */
658 1.1 ryo #define G12_CLK_vclk2_venci1 \
659 1.1 ryo MESON_CLK_GATE(MESONG12_CLOCK_VCLK2_VENCI1, "vclk2_venci1", \
660 1.1 ryo "clk81", /* parent */ \
661 1.1 ryo HHI_GCLK_OTHER, /* reg */ \
662 1.1 ryo 2) /* bit */
663 1.1 ryo #define G12_CLK_vclk2_vencp0 \
664 1.1 ryo MESON_CLK_GATE(MESONG12_CLOCK_VCLK2_VENCP0, "vclk2_vencp0", \
665 1.1 ryo "clk81", /* parent */ \
666 1.1 ryo HHI_GCLK_OTHER, /* reg */ \
667 1.1 ryo 3) /* bit */
668 1.1 ryo #define G12_CLK_vclk2_vencp1 \
669 1.1 ryo MESON_CLK_GATE(MESONG12_CLOCK_VCLK2_VENCP1, "vclk2_vencp1", \
670 1.1 ryo "clk81", /* parent */ \
671 1.1 ryo HHI_GCLK_OTHER, /* reg */ \
672 1.1 ryo 4) /* bit */
673 1.1 ryo #define G12_CLK_vclk2_venct0 \
674 1.1 ryo MESON_CLK_GATE(MESONG12_CLOCK_VCLK2_VENCT0, "vclk2_venct0", \
675 1.1 ryo "clk81", /* parent */ \
676 1.1 ryo HHI_GCLK_OTHER, /* reg */ \
677 1.1 ryo 5) /* bit */
678 1.1 ryo #define G12_CLK_vclk2_venct1 \
679 1.1 ryo MESON_CLK_GATE(MESONG12_CLOCK_VCLK2_VENCT1, "vclk2_venct1", \
680 1.1 ryo "clk81", /* parent */ \
681 1.1 ryo HHI_GCLK_OTHER, /* reg */ \
682 1.1 ryo 6) /* bit */
683 1.1 ryo #define G12_CLK_vclk2_other \
684 1.1 ryo MESON_CLK_GATE(MESONG12_CLOCK_VCLK2_OTHER, "vclk2_other", \
685 1.1 ryo "clk81", /* parent */ \
686 1.1 ryo HHI_GCLK_OTHER, /* reg */ \
687 1.1 ryo 7) /* bit */
688 1.1 ryo #define G12_CLK_vclk2_enci \
689 1.1 ryo MESON_CLK_GATE(MESONG12_CLOCK_VCLK2_ENCI, "vclk2_enci", \
690 1.1 ryo "clk81", /* parent */ \
691 1.1 ryo HHI_GCLK_OTHER, /* reg */ \
692 1.1 ryo 8) /* bit */
693 1.1 ryo #define G12_CLK_vclk2_encp \
694 1.1 ryo MESON_CLK_GATE(MESONG12_CLOCK_VCLK2_ENCP, "vclk2_encp", \
695 1.1 ryo "clk81", /* parent */ \
696 1.1 ryo HHI_GCLK_OTHER, /* reg */ \
697 1.1 ryo 9) /* bit */
698 1.1 ryo #define G12_CLK_dac_clk \
699 1.1 ryo MESON_CLK_GATE(MESONG12_CLOCK_DAC_CLK, "dac_clk", \
700 1.1 ryo "clk81", /* parent */ \
701 1.1 ryo HHI_GCLK_OTHER, /* reg */ \
702 1.1 ryo 10) /* bit */
703 1.1 ryo #define G12_CLK_aoclk \
704 1.1 ryo MESON_CLK_GATE(MESONG12_CLOCK_AOCLK, "aoclk", \
705 1.1 ryo "clk81", /* parent */ \
706 1.1 ryo HHI_GCLK_OTHER, /* reg */ \
707 1.1 ryo 14) /* bit */
708 1.1 ryo #define G12_CLK_iec958 \
709 1.1 ryo MESON_CLK_GATE(MESONG12_CLOCK_IEC958, "iec958", \
710 1.1 ryo "clk81", /* parent */ \
711 1.1 ryo HHI_GCLK_OTHER, /* reg */ \
712 1.1 ryo 16) /* bit */
713 1.1 ryo #define G12_CLK_enc480p \
714 1.1 ryo MESON_CLK_GATE(MESONG12_CLOCK_ENC480P, "enc480p", \
715 1.1 ryo "clk81", /* parent */ \
716 1.1 ryo HHI_GCLK_OTHER, /* reg */ \
717 1.1 ryo 20) /* bit */
718 1.1 ryo #define G12_CLK_rng1 \
719 1.1 ryo MESON_CLK_GATE(MESONG12_CLOCK_RNG1, "rng1", \
720 1.1 ryo "clk81", /* parent */ \
721 1.1 ryo HHI_GCLK_OTHER, /* reg */ \
722 1.1 ryo 21) /* bit */
723 1.1 ryo #define G12_CLK_vclk2_enct \
724 1.1 ryo MESON_CLK_GATE(MESONG12_CLOCK_VCLK2_ENCT, "vclk2_enct", \
725 1.1 ryo "clk81", /* parent */ \
726 1.1 ryo HHI_GCLK_OTHER, /* reg */ \
727 1.1 ryo 22) /* bit */
728 1.1 ryo #define G12_CLK_vclk2_encl \
729 1.1 ryo MESON_CLK_GATE(MESONG12_CLOCK_VCLK2_ENCL, "vclk2_encl", \
730 1.1 ryo "clk81", /* parent */ \
731 1.1 ryo HHI_GCLK_OTHER, /* reg */ \
732 1.1 ryo 23) /* bit */
733 1.1 ryo #define G12_CLK_vclk2_venclmmc \
734 1.1 ryo MESON_CLK_GATE(MESONG12_CLOCK_VCLK2_VENCLMMC, "vclk2_venclmmc", \
735 1.1 ryo "clk81", /* parent */ \
736 1.1 ryo HHI_GCLK_OTHER, /* reg */ \
737 1.1 ryo 24) /* bit */
738 1.1 ryo #define G12_CLK_vclk2_vencl \
739 1.1 ryo MESON_CLK_GATE(MESONG12_CLOCK_VCLK2_VENCL, "vclk2_vencl", \
740 1.1 ryo "clk81", /* parent */ \
741 1.1 ryo HHI_GCLK_OTHER, /* reg */ \
742 1.1 ryo 25) /* bit */
743 1.1 ryo #define G12_CLK_vclk2_other1 \
744 1.1 ryo MESON_CLK_GATE(MESONG12_CLOCK_VCLK2_OTHER1, "vclk2_other1", \
745 1.1 ryo "clk81", /* parent */ \
746 1.1 ryo HHI_GCLK_OTHER, /* reg */ \
747 1.1 ryo 26) /* bit */
748 1.1 ryo #define G12_CLK_dma \
749 1.1 ryo MESON_CLK_GATE(MESONG12_CLOCK_DMA, "dma", \
750 1.1 ryo "clk81", /* parent */ \
751 1.1 ryo HHI_GCLK_OTHER2, /* reg */ \
752 1.1 ryo 0) /* bit */
753 1.1 ryo #define G12_CLK_efuse \
754 1.1 ryo MESON_CLK_GATE(MESONG12_CLOCK_EFUSE, "efuse", \
755 1.1 ryo "clk81", /* parent */ \
756 1.1 ryo HHI_GCLK_OTHER2, /* reg */ \
757 1.1 ryo 1) /* bit */
758 1.1 ryo #define G12_CLK_rom_boot \
759 1.1 ryo MESON_CLK_GATE(MESONG12_CLOCK_ROM_BOOT, "rom_boot", \
760 1.1 ryo "clk81", /* parent */ \
761 1.1 ryo HHI_GCLK_OTHER2, /* reg */ \
762 1.1 ryo 2) /* bit */
763 1.1 ryo #define G12_CLK_reset_sec \
764 1.1 ryo MESON_CLK_GATE(MESONG12_CLOCK_RESET_SEC, "reset_sec", \
765 1.1 ryo "clk81", /* parent */ \
766 1.1 ryo HHI_GCLK_OTHER2, /* reg */ \
767 1.1 ryo 3) /* bit */
768 1.1 ryo #define G12_CLK_sec_ahb_apb3 \
769 1.1 ryo MESON_CLK_GATE(MESONG12_CLOCK_SEC_AHB_APB3, "sec_ahb_apb3", \
770 1.1 ryo "clk81", /* parent */ \
771 1.1 ryo HHI_GCLK_OTHER2, /* reg */ \
772 1.1 ryo 4) /* bit */
773 1.1 ryo
774 1.1 ryo /* little cpu cluster */
775 1.1 ryo #define G12_CLK_cpu_clk_dyn0_sel \
776 1.1 ryo MESON_CLK_MUX(MESONG12_CLOCK_CPU_CLK_DYN0_SEL, "cpu_clk_dyn0_sel", \
777 1.1 ryo PARENTS("fclk_div2", "fclk_div3", "xtal"), \
778 1.1 ryo HHI_SYS_CPU_CLK_CNTL0, /* reg */ \
779 1.1 ryo __BITS(1,0), /* sel */ \
780 1.1 ryo 0)
781 1.1 ryo #define G12_CLK_cpu_clk_dyn1_sel \
782 1.1 ryo MESON_CLK_MUX(MESONG12_CLOCK_CPU_CLK_DYN1_SEL, "cpu_clk_dyn1_sel", \
783 1.1 ryo PARENTS("fclk_div2", "fclk_div3", "xtal"), \
784 1.1 ryo HHI_SYS_CPU_CLK_CNTL0, /* reg */ \
785 1.1 ryo __BITS(17,16), /* sel */ \
786 1.1 ryo 0)
787 1.1 ryo #define G12_CLK_cpu_clk_dyn0_div \
788 1.1 ryo MESON_CLK_DIV(MESONG12_CLOCK_CPU_CLK_DYN0_DIV, "cpu_clk_dyn0_div", \
789 1.1 ryo "cpu_clk_dyn0_sel", /* parent */ \
790 1.1 ryo HHI_SYS_CPU_CLK_CNTL0, /* reg */ \
791 1.1 ryo __BIT(26), /* div */ \
792 1.1 ryo 0)
793 1.1 ryo #define G12_CLK_cpu_clk_dyn1_div \
794 1.1 ryo MESON_CLK_DIV(MESONG12_CLOCK_CPU_CLK_DYN1_DIV, "cpu_clk_dyn1_div", \
795 1.1 ryo "cpu_clk_dyn1_sel", /* parent */ \
796 1.1 ryo HHI_SYS_CPU_CLK_CNTL0, /* reg */ \
797 1.1 ryo __BITS(25,20), /* div */ \
798 1.1 ryo 0)
799 1.1 ryo #define G12_CLK_cpu_clk_dyn0 \
800 1.1 ryo MESON_CLK_MUX(MESONG12_CLOCK_CPU_CLK_DYN0, "cpu_clk_dyn0", \
801 1.1 ryo PARENTS("cpu_clk_dyn0_div", "cpu_clk_dyn0_sel"), \
802 1.1 ryo HHI_SYS_CPU_CLK_CNTL0, /* reg */ \
803 1.1 ryo __BIT(2), /* sel */ \
804 1.1 ryo 0)
805 1.1 ryo #define G12_CLK_cpu_clk_dyn1 \
806 1.1 ryo MESON_CLK_MUX(MESONG12_CLOCK_CPU_CLK_DYN1, "cpu_clk_dyn1", \
807 1.1 ryo PARENTS("cpu_clk_dyn1_div", "cpu_clk_dyn1_sel"), \
808 1.1 ryo HHI_SYS_CPU_CLK_CNTL0, /* reg */ \
809 1.1 ryo __BIT(18), /* sel */ \
810 1.1 ryo 0)
811 1.1 ryo #define G12_CLK_cpu_clk_dyn \
812 1.1 ryo MESON_CLK_MUX(MESONG12_CLOCK_CPU_CLK_DYN, "cpu_clk_dyn", \
813 1.1 ryo PARENTS("cpu_clk_dyn0", "cpu_clk_dyn1"), \
814 1.1 ryo HHI_SYS_CPU_CLK_CNTL0, /* reg */ \
815 1.1 ryo __BIT(10), /* sel */ \
816 1.1 ryo 0)
817 1.1 ryo #define G12A_CLK_cpu_clk \
818 1.1 ryo MESON_CLK_MUX_RATE(MESONG12_CLOCK_CPU_CLK, "cpu_clk", \
819 1.1 ryo PARENTS("cpu_clk_dyn", "sys_pll"), \
820 1.1 ryo HHI_SYS_CPU_CLK_CNTL0, /* reg */ \
821 1.1 ryo __BIT(11), /* sel */ \
822 1.1 ryo mesong12_cpuclk_get_rate, \
823 1.1 ryo mesong12_cpuclk_set_rate, \
824 1.1 ryo 0)
825 1.1 ryo #define G12B_CLK_cpu_clk \
826 1.1 ryo MESON_CLK_MUX_RATE(MESONG12_CLOCK_CPU_CLK, "cpu_clk", \
827 1.1 ryo PARENTS("cpu_clk_dyn", "sys1_pll"), \
828 1.1 ryo HHI_SYS_CPU_CLK_CNTL0, /* reg */ \
829 1.1 ryo __BIT(11), /* sel */ \
830 1.1 ryo mesong12_cpuclk_get_rate, \
831 1.1 ryo mesong12_cpuclk_set_rate, \
832 1.1 ryo 0)
833 1.1 ryo
834 1.1 ryo /* big cpu cluster */
835 1.1 ryo #define G12_CLK_cpub_clk_dyn0_sel \
836 1.1 ryo MESON_CLK_MUX(MESONG12_CLOCK_CPUB_CLK_DYN0_SEL, "cpub_clk_dyn0_sel", \
837 1.1 ryo PARENTS("fclk_div2", "fclk_div3", "xtal"), \
838 1.1 ryo HHI_SYS_CPUB_CLK_CNTL, /* reg */ \
839 1.1 ryo __BITS(1,0), /* sel */ \
840 1.1 ryo 0)
841 1.1 ryo #define G12_CLK_cpub_clk_dyn0_div \
842 1.1 ryo MESON_CLK_DIV(MESONG12_CLOCK_CPUB_CLK_DYN0_DIV, "cpub_clk_dyn0_div", \
843 1.1 ryo "cpub_clk_dyn0_sel", /* parent */ \
844 1.1 ryo HHI_SYS_CPUB_CLK_CNTL, /* reg */ \
845 1.1 ryo __BITS(9,4), /* div */ \
846 1.1 ryo 0)
847 1.1 ryo #define G12_CLK_cpub_clk_dyn0 \
848 1.1 ryo MESON_CLK_MUX(MESONG12_CLOCK_CPUB_CLK_DYN0, "cpub_clk_dyn0", \
849 1.1 ryo PARENTS("cpub_clk_dyn0_div", "cpub_clk_dyn0_sel"), \
850 1.1 ryo HHI_SYS_CPUB_CLK_CNTL, /* reg */ \
851 1.1 ryo __BIT(2), /* sel */ \
852 1.1 ryo 0)
853 1.1 ryo #define G12_CLK_cpub_clk_dyn1_sel \
854 1.1 ryo MESON_CLK_MUX(MESONG12_CLOCK_CPUB_CLK_DYN1_SEL, "cpub_clk_dyn1_sel", \
855 1.1 ryo PARENTS("fclk_div2", "fclk_div3", "xtal", "xtal"), \
856 1.1 ryo HHI_SYS_CPUB_CLK_CNTL, /* reg */ \
857 1.1 ryo __BITS(17,16), /* sel */ \
858 1.1 ryo 0)
859 1.1 ryo #define G12_CLK_cpub_clk_dyn1_div \
860 1.1 ryo MESON_CLK_DIV(MESONG12_CLOCK_CPUB_CLK_DYN1_DIV, "cpub_clk_dyn1_div", \
861 1.1 ryo "cpub_clk_dyn1_sel", /* parent */ \
862 1.1 ryo HHI_SYS_CPUB_CLK_CNTL, /* reg */ \
863 1.1 ryo __BITS(25,20), /* div */ \
864 1.1 ryo 0)
865 1.1 ryo #define G12_CLK_cpub_clk_dyn1 \
866 1.1 ryo MESON_CLK_MUX(MESONG12_CLOCK_CPUB_CLK_DYN1, "cpub_clk_dyn1", \
867 1.1 ryo PARENTS("cpub_clk_dyn1_div", "cpub_clk_dyn1_sel"), \
868 1.1 ryo HHI_SYS_CPUB_CLK_CNTL, /* reg */ \
869 1.1 ryo __BIT(18), /* sel */ \
870 1.1 ryo 0)
871 1.1 ryo #define G12_CLK_cpub_clk_dyn \
872 1.1 ryo MESON_CLK_MUX(MESONG12_CLOCK_CPUB_CLK_DYN, "cpub_clk_dyn", \
873 1.1 ryo PARENTS("cpub_clk_dyn0", "cpub_clk_dyn1"), \
874 1.1 ryo HHI_SYS_CPUB_CLK_CNTL, /* reg */ \
875 1.1 ryo __BIT(10), /* sel */ \
876 1.1 ryo 0)
877 1.1 ryo #define G12_CLK_cpub_clk \
878 1.1 ryo MESON_CLK_MUX_RATE(MESONG12_CLOCK_CPUB_CLK, "cpub_clk", \
879 1.1 ryo PARENTS("cpub_clk_dyn", "sys_pll"), \
880 1.1 ryo HHI_SYS_CPUB_CLK_CNTL, /* reg */ \
881 1.1 ryo __BIT(11), /* sel */ \
882 1.1 ryo mesong12_cpuclk_get_rate, \
883 1.1 ryo mesong12_cpuclk_set_rate, \
884 1.1 ryo 0)
885 1.1 ryo
886 1.1 ryo /* ts */
887 1.1 ryo #define G12_CLK_ts_div \
888 1.1 ryo MESON_CLK_DIV(MESONG12_CLOCK_TS_DIV, "ts_div", \
889 1.1 ryo "xtal", /* parent */ \
890 1.1 ryo HHI_TS_CLK_CNTL, /* reg */ \
891 1.1 ryo __BITS(7,0), /* div */ \
892 1.1 ryo 0)
893 1.1 ryo #define G12_CLK_ts \
894 1.1 ryo MESON_CLK_GATE(MESONG12_CLOCK_TS, "ts", \
895 1.1 ryo "ts_div", /* parent */ \
896 1.1 ryo HHI_TS_CLK_CNTL, /* ret */ \
897 1.1 ryo 8) /* bit */
898 1.1 ryo
899 1.1 ryo /* hdmi */
900 1.1 ryo #define G12_CLK_hdmi_pll_dco \
901 1.1 ryo MESON_CLK_PLL(MESONG12_CLOCK_HDMI_PLL_DCO, "hdmi_pll_dco", \
902 1.1 ryo "xtal", /* parent */ \
903 1.1 ryo MESON_CLK_PLL_REG(HHI_HDMI_PLL_CNTL0, __BIT(28)), /* enable */ \
904 1.1 ryo MESON_CLK_PLL_REG(HHI_HDMI_PLL_CNTL0, __BITS(7,0)), /* m */ \
905 1.1 ryo MESON_CLK_PLL_REG(HHI_HDMI_PLL_CNTL0, __BITS(14,10)),/* n */ \
906 1.1 ryo MESON_CLK_PLL_REG(HHI_HDMI_PLL_CNTL1, __BITS(15,0)),/* frac */ \
907 1.1 ryo MESON_CLK_PLL_REG(HHI_HDMI_PLL_CNTL0, __BIT(30)), /* l */ \
908 1.1 ryo MESON_CLK_PLL_REG(HHI_HDMI_PLL_CNTL0, __BIT(29)), /* reset */ \
909 1.1 ryo 0)
910 1.1 ryo #define G12_CLK_hdmi_pll_od \
911 1.1 ryo MESON_CLK_DIV(MESONG12_CLOCK_HDMI_PLL_OD, "hdmi_pll_od", \
912 1.1 ryo "hdmi_pll_dco", /* parent */ \
913 1.1 ryo HHI_HDMI_PLL_CNTL0, /* reg */ \
914 1.1 ryo __BITS(17,16), /* div */ \
915 1.1 ryo MESON_CLK_DIV_POWER_OF_TWO)
916 1.1 ryo #define G12_CLK_hdmi_pll_od2 \
917 1.1 ryo MESON_CLK_DIV(MESONG12_CLOCK_HDMI_PLL_OD2, "hdmi_pll_od2", \
918 1.1 ryo "hdmi_pll_od", /* parent */ \
919 1.1 ryo HHI_HDMI_PLL_CNTL0, /* reg */ \
920 1.1 ryo __BITS(19,18), /* div */ \
921 1.1 ryo MESON_CLK_DIV_POWER_OF_TWO)
922 1.1 ryo #define G12_CLK_hdmi_pll \
923 1.1 ryo MESON_CLK_DIV(MESONG12_CLOCK_HDMI_PLL, "hdmi_pll", \
924 1.1 ryo "hdmi_pll_od2", /* parent */ \
925 1.1 ryo HHI_HDMI_PLL_CNTL0, /* reg */ \
926 1.1 ryo __BITS(21,20), /* div */ \
927 1.1 ryo MESON_CLK_DIV_POWER_OF_TWO)
928 1.1 ryo
929 1.1 ryo #define G12_CLK_vid_pll_div \
930 1.1 ryo MESON_CLK_DIV(MESONG12_CLOCK_VID_PLL_DIV, "vid_pll_div", \
931 1.1 ryo "hdmi_pll", /* parent */ \
932 1.1 ryo HHI_FIX_PLL_CNTL0, /* reg */ \
933 1.1 ryo __BITS(17,16), /* div */ \
934 1.1 ryo 0)
935 1.1 ryo #define G12_CLK_vid_pll_sel \
936 1.1 ryo MESON_CLK_MUX(MESONG12_CLOCK_VID_PLL_SEL, "vid_pll_sel", \
937 1.1 ryo PARENTS("vid_pll_div", "hdmi_pll"), \
938 1.1 ryo HHI_VID_PLL_CLK_DIV, /* reg */ \
939 1.1 ryo __BIT(18), /* sel */ \
940 1.1 ryo 0)
941 1.1 ryo #define G12_CLK_vid_pll \
942 1.1 ryo MESON_CLK_GATE(MESONG12_CLOCK_VID_PLL_DIV, "vid_pll", \
943 1.1 ryo "vid_pll_sel", /* parent */ \
944 1.1 ryo HHI_VID_PLL_CLK_DIV, /* reg */ \
945 1.1 ryo 19) /* bit */
946 1.1 ryo
947 1.1 ryo /* USB3/PCIe */
948 1.1 ryo #define G12_CLK_pcie_pll_dco \
949 1.1 ryo MESON_CLK_PLL_RATE(MESONG12_CLOCK_PCIE_PLL_DCO, "pcie_pll_dco", \
950 1.1 ryo "xtal", /* parent */ \
951 1.1 ryo MESON_CLK_PLL_REG(HHI_PCIE_PLL_CNTL0, __BIT(28)), /* enable */ \
952 1.1 ryo MESON_CLK_PLL_REG(HHI_PCIE_PLL_CNTL0, __BITS(7,0)), /* m */ \
953 1.1 ryo MESON_CLK_PLL_REG(HHI_PCIE_PLL_CNTL0, __BITS(14,10)),/* n */ \
954 1.1 ryo MESON_CLK_PLL_REG(HHI_PCIE_PLL_CNTL1, __BITS(11,0)),/* frac */ \
955 1.1 ryo MESON_CLK_PLL_REG(HHI_PCIE_PLL_CNTL0, __BIT(31)), /* l */ \
956 1.1 ryo MESON_CLK_PLL_REG(HHI_PCIE_PLL_CNTL0, __BIT(29)), /* reset */ \
957 1.1 ryo mesong12_clk_pcie_pll_set_rate, \
958 1.1 ryo 0)
959 1.1 ryo #define G12_CLK_pcie_pll_dco_div2 \
960 1.1 ryo MESON_CLK_FIXED_FACTOR(MESONG12_CLOCK_PCIE_PLL_DCO_DIV2, \
961 1.1 ryo "pcie_pll_dco_div2", \
962 1.1 ryo "pcie_pll_dco", /* parent */ \
963 1.1 ryo 2, /* div */ \
964 1.1 ryo 1) /* mult */
965 1.1 ryo #define G12_CLK_pcie_pll_od \
966 1.1 ryo MESON_CLK_DIV(MESONG12_CLOCK_PCIE_PLL_OD, "pcie_pll_od", \
967 1.1 ryo "pcie_pll_dco_div2", /* parent */ \
968 1.1 ryo HHI_PCIE_PLL_CNTL0, /* reg */ \
969 1.1 ryo __BITS(20,16), /* div */ \
970 1.1 ryo MESON_CLK_DIV_SET_RATE_PARENT)
971 1.1 ryo #define G12_CLK_pcie_pll_pll \
972 1.1 ryo MESON_CLK_FIXED_FACTOR(MESONG12_CLOCK_PCIE_PLL, "pcie_pll_pll", \
973 1.1 ryo "pcie_pll_od", /* parent */ \
974 1.1 ryo 2, /* div */ \
975 1.1 ryo 1) /* mult */
976 1.1 ryo
977 1.1 ryo /* not all clocks are defined */
978 1.1 ryo static struct meson_clk_clk mesong12a_clkc_clks[] = {
979 1.1 ryo G12_CLK_fixed_pll_dco,
980 1.1 ryo G12_CLK_fixed_pll,
981 1.1 ryo G12_CLK_sys_pll_dco,
982 1.1 ryo G12_CLK_sys_pll,
983 1.1 ryo G12_CLK_fclk_div2_div,
984 1.1 ryo G12_CLK_fclk_div2,
985 1.1 ryo G12_CLK_fclk_div2p5_div,
986 1.1 ryo G12_CLK_fclk_div3_div,
987 1.1 ryo G12_CLK_fclk_div3,
988 1.1 ryo G12_CLK_fclk_div4_div,
989 1.1 ryo G12_CLK_fclk_div4,
990 1.1 ryo G12_CLK_fclk_div5_div,
991 1.1 ryo G12_CLK_fclk_div5,
992 1.1 ryo G12_CLK_fclk_div7_div,
993 1.1 ryo G12_CLK_fclk_div7,
994 1.1 ryo G12_CLK_mpll_prediv,
995 1.1 ryo G12_CLK_mpll0_div,
996 1.1 ryo G12_CLK_mpll1_div,
997 1.1 ryo G12_CLK_mpll2_div,
998 1.1 ryo G12_CLK_mpll0,
999 1.1 ryo G12_CLK_mpll1,
1000 1.1 ryo G12_CLK_mpll2,
1001 1.1 ryo G12_CLK_mpeg_sel,
1002 1.1 ryo G12_CLK_mpeg_clk_div,
1003 1.1 ryo G12_CLK_clk81,
1004 1.1 ryo G12_CLK_mpll_50m_div,
1005 1.1 ryo G12_CLK_mpll_50m,
1006 1.1 ryo G12_CLK_sd_emmc_a_clk0_sel,
1007 1.1 ryo G12_CLK_sd_emmc_b_clk0_sel,
1008 1.1 ryo G12_CLK_sd_emmc_c_clk0_sel,
1009 1.1 ryo G12_CLK_sd_emmc_a_clk0_div,
1010 1.1 ryo G12_CLK_sd_emmc_b_clk0_div,
1011 1.1 ryo G12_CLK_sd_emmc_c_clk0_div,
1012 1.1 ryo G12_CLK_sd_emmc_a_clk0,
1013 1.1 ryo G12_CLK_sd_emmc_b_clk0,
1014 1.1 ryo G12_CLK_sd_emmc_c_clk0,
1015 1.1 ryo G12_CLK_ddr,
1016 1.1 ryo G12_CLK_dos,
1017 1.1 ryo G12_CLK_audio_locker,
1018 1.1 ryo G12_CLK_mipi_dsi_host,
1019 1.1 ryo G12_CLK_eth_phy,
1020 1.1 ryo G12_CLK_isa,
1021 1.1 ryo G12_CLK_pl301,
1022 1.1 ryo G12_CLK_periphs,
1023 1.1 ryo G12_CLK_spicc0,
1024 1.1 ryo G12_CLK_i2c,
1025 1.1 ryo G12_CLK_sana,
1026 1.1 ryo G12_CLK_sd,
1027 1.1 ryo G12_CLK_rng0,
1028 1.1 ryo G12_CLK_uart0,
1029 1.1 ryo G12_CLK_spicc1,
1030 1.1 ryo G12_CLK_hiu_iface,
1031 1.1 ryo G12_CLK_mipi_dsi_phy,
1032 1.1 ryo G12_CLK_assist_misc,
1033 1.1 ryo G12_CLK_sd_emmc_a,
1034 1.1 ryo G12_CLK_sd_emmc_b,
1035 1.1 ryo G12_CLK_sd_emmc_c,
1036 1.1 ryo G12_CLK_audio_codec,
1037 1.1 ryo G12_CLK_audio,
1038 1.1 ryo G12_CLK_eth,
1039 1.1 ryo G12_CLK_demux,
1040 1.1 ryo G12_CLK_audio_ififo,
1041 1.1 ryo G12_CLK_adc,
1042 1.1 ryo G12_CLK_uart1,
1043 1.1 ryo G12_CLK_g2d,
1044 1.1 ryo G12_CLK_reset,
1045 1.1 ryo G12_CLK_pcie_comb,
1046 1.1 ryo G12_CLK_parser,
1047 1.1 ryo G12_CLK_usb,
1048 1.1 ryo G12_CLK_pcie_phy,
1049 1.1 ryo G12_CLK_ahb_arb0,
1050 1.1 ryo G12_CLK_ahb_data_bus,
1051 1.1 ryo G12_CLK_ahb_ctrl_bus,
1052 1.1 ryo G12_CLK_htx_hdcp22,
1053 1.1 ryo G12_CLK_htx_pclk,
1054 1.1 ryo G12_CLK_bt656,
1055 1.1 ryo G12_CLK_usb1_ddr_bridge,
1056 1.1 ryo G12_CLK_mmc_pclk,
1057 1.1 ryo G12_CLK_uart2,
1058 1.1 ryo G12_CLK_vpu_intr,
1059 1.1 ryo G12_CLK_gic,
1060 1.1 ryo G12_CLK_vclk2_venci0,
1061 1.1 ryo G12_CLK_vclk2_venci1,
1062 1.1 ryo G12_CLK_vclk2_vencp0,
1063 1.1 ryo G12_CLK_vclk2_vencp1,
1064 1.1 ryo G12_CLK_vclk2_venct0,
1065 1.1 ryo G12_CLK_vclk2_venct1,
1066 1.1 ryo G12_CLK_vclk2_other,
1067 1.1 ryo G12_CLK_vclk2_enci,
1068 1.1 ryo G12_CLK_vclk2_encp,
1069 1.1 ryo G12_CLK_dac_clk,
1070 1.1 ryo G12_CLK_aoclk,
1071 1.1 ryo G12_CLK_iec958,
1072 1.1 ryo G12_CLK_enc480p,
1073 1.1 ryo G12_CLK_rng1,
1074 1.1 ryo G12_CLK_vclk2_enct,
1075 1.1 ryo G12_CLK_vclk2_encl,
1076 1.1 ryo G12_CLK_vclk2_venclmmc,
1077 1.1 ryo G12_CLK_vclk2_vencl,
1078 1.1 ryo G12_CLK_vclk2_other1,
1079 1.1 ryo G12_CLK_dma,
1080 1.1 ryo G12_CLK_efuse,
1081 1.1 ryo G12_CLK_rom_boot,
1082 1.1 ryo G12_CLK_reset_sec,
1083 1.1 ryo G12_CLK_sec_ahb_apb3,
1084 1.1 ryo G12_CLK_cpu_clk_dyn0_sel,
1085 1.1 ryo G12_CLK_cpu_clk_dyn1_sel,
1086 1.1 ryo G12_CLK_cpu_clk_dyn0_div,
1087 1.1 ryo G12_CLK_cpu_clk_dyn1_div,
1088 1.1 ryo G12_CLK_cpu_clk_dyn0,
1089 1.1 ryo G12_CLK_cpu_clk_dyn1,
1090 1.1 ryo G12_CLK_cpu_clk_dyn,
1091 1.1 ryo G12A_CLK_cpu_clk,
1092 1.1 ryo G12_CLK_ts_div,
1093 1.1 ryo G12_CLK_ts,
1094 1.1 ryo G12_CLK_hdmi_pll_dco,
1095 1.1 ryo G12_CLK_hdmi_pll_od,
1096 1.1 ryo G12_CLK_hdmi_pll_od2,
1097 1.1 ryo G12_CLK_hdmi_pll,
1098 1.1 ryo G12_CLK_vid_pll_div,
1099 1.1 ryo G12_CLK_vid_pll_sel,
1100 1.1 ryo G12_CLK_vid_pll,
1101 1.1 ryo G12_CLK_pcie_pll_dco,
1102 1.1 ryo G12_CLK_pcie_pll_dco_div2,
1103 1.1 ryo G12_CLK_pcie_pll_od,
1104 1.1 ryo G12_CLK_pcie_pll_pll
1105 1.1 ryo };
1106 1.1 ryo
1107 1.1 ryo static struct meson_clk_clk mesong12b_clkc_clks[] = {
1108 1.1 ryo G12_CLK_fixed_pll_dco,
1109 1.1 ryo G12_CLK_fixed_pll,
1110 1.1 ryo G12_CLK_sys_pll_dco,
1111 1.1 ryo G12_CLK_sys_pll,
1112 1.1 ryo G12B_CLK_sys1_pll_dco,
1113 1.1 ryo G12B_CLK_sys1_pll,
1114 1.1 ryo G12_CLK_fclk_div2_div,
1115 1.1 ryo G12_CLK_fclk_div2,
1116 1.1 ryo G12_CLK_fclk_div2p5_div,
1117 1.1 ryo G12_CLK_fclk_div3_div,
1118 1.1 ryo G12_CLK_fclk_div3,
1119 1.1 ryo G12_CLK_fclk_div4_div,
1120 1.1 ryo G12_CLK_fclk_div4,
1121 1.1 ryo G12_CLK_fclk_div5_div,
1122 1.1 ryo G12_CLK_fclk_div5,
1123 1.1 ryo G12_CLK_fclk_div7_div,
1124 1.1 ryo G12_CLK_fclk_div7,
1125 1.1 ryo G12_CLK_mpll_prediv,
1126 1.1 ryo G12_CLK_mpll0_div,
1127 1.1 ryo G12_CLK_mpll1_div,
1128 1.1 ryo G12_CLK_mpll2_div,
1129 1.1 ryo G12_CLK_mpll0,
1130 1.1 ryo G12_CLK_mpll1,
1131 1.1 ryo G12_CLK_mpll2,
1132 1.1 ryo G12_CLK_mpeg_sel,
1133 1.1 ryo G12_CLK_mpeg_clk_div,
1134 1.1 ryo G12_CLK_clk81,
1135 1.1 ryo G12_CLK_mpll_50m_div,
1136 1.1 ryo G12_CLK_mpll_50m,
1137 1.1 ryo G12_CLK_sd_emmc_a_clk0_sel,
1138 1.1 ryo G12_CLK_sd_emmc_b_clk0_sel,
1139 1.1 ryo G12_CLK_sd_emmc_c_clk0_sel,
1140 1.1 ryo G12_CLK_sd_emmc_a_clk0_div,
1141 1.1 ryo G12_CLK_sd_emmc_b_clk0_div,
1142 1.1 ryo G12_CLK_sd_emmc_c_clk0_div,
1143 1.1 ryo G12_CLK_sd_emmc_a_clk0,
1144 1.1 ryo G12_CLK_sd_emmc_b_clk0,
1145 1.1 ryo G12_CLK_sd_emmc_c_clk0,
1146 1.1 ryo G12_CLK_ddr,
1147 1.1 ryo G12_CLK_dos,
1148 1.1 ryo G12_CLK_audio_locker,
1149 1.1 ryo G12_CLK_mipi_dsi_host,
1150 1.1 ryo G12_CLK_eth_phy,
1151 1.1 ryo G12_CLK_isa,
1152 1.1 ryo G12_CLK_pl301,
1153 1.1 ryo G12_CLK_periphs,
1154 1.1 ryo G12_CLK_spicc0,
1155 1.1 ryo G12_CLK_i2c,
1156 1.1 ryo G12_CLK_sana,
1157 1.1 ryo G12_CLK_sd,
1158 1.1 ryo G12_CLK_rng0,
1159 1.1 ryo G12_CLK_uart0,
1160 1.1 ryo G12_CLK_spicc1,
1161 1.1 ryo G12_CLK_hiu_iface,
1162 1.1 ryo G12_CLK_mipi_dsi_phy,
1163 1.1 ryo G12_CLK_assist_misc,
1164 1.1 ryo G12_CLK_sd_emmc_a,
1165 1.1 ryo G12_CLK_sd_emmc_b,
1166 1.1 ryo G12_CLK_sd_emmc_c,
1167 1.1 ryo G12_CLK_audio_codec,
1168 1.1 ryo G12_CLK_audio,
1169 1.1 ryo G12_CLK_eth,
1170 1.1 ryo G12_CLK_demux,
1171 1.1 ryo G12_CLK_audio_ififo,
1172 1.1 ryo G12_CLK_adc,
1173 1.1 ryo G12_CLK_uart1,
1174 1.1 ryo G12_CLK_g2d,
1175 1.1 ryo G12_CLK_reset,
1176 1.1 ryo G12_CLK_pcie_comb,
1177 1.1 ryo G12_CLK_parser,
1178 1.1 ryo G12_CLK_usb,
1179 1.1 ryo G12_CLK_pcie_phy,
1180 1.1 ryo G12_CLK_ahb_arb0,
1181 1.1 ryo G12_CLK_ahb_data_bus,
1182 1.1 ryo G12_CLK_ahb_ctrl_bus,
1183 1.1 ryo G12_CLK_htx_hdcp22,
1184 1.1 ryo G12_CLK_htx_pclk,
1185 1.1 ryo G12_CLK_bt656,
1186 1.1 ryo G12_CLK_usb1_ddr_bridge,
1187 1.1 ryo G12_CLK_mmc_pclk,
1188 1.1 ryo G12_CLK_uart2,
1189 1.1 ryo G12_CLK_vpu_intr,
1190 1.1 ryo G12_CLK_gic,
1191 1.1 ryo G12_CLK_vclk2_venci0,
1192 1.1 ryo G12_CLK_vclk2_venci1,
1193 1.1 ryo G12_CLK_vclk2_vencp0,
1194 1.1 ryo G12_CLK_vclk2_vencp1,
1195 1.1 ryo G12_CLK_vclk2_venct0,
1196 1.1 ryo G12_CLK_vclk2_venct1,
1197 1.1 ryo G12_CLK_vclk2_other,
1198 1.1 ryo G12_CLK_vclk2_enci,
1199 1.1 ryo G12_CLK_vclk2_encp,
1200 1.1 ryo G12_CLK_dac_clk,
1201 1.1 ryo G12_CLK_aoclk,
1202 1.1 ryo G12_CLK_iec958,
1203 1.1 ryo G12_CLK_enc480p,
1204 1.1 ryo G12_CLK_rng1,
1205 1.1 ryo G12_CLK_vclk2_enct,
1206 1.1 ryo G12_CLK_vclk2_encl,
1207 1.1 ryo G12_CLK_vclk2_venclmmc,
1208 1.1 ryo G12_CLK_vclk2_vencl,
1209 1.1 ryo G12_CLK_vclk2_other1,
1210 1.1 ryo G12_CLK_dma,
1211 1.1 ryo G12_CLK_efuse,
1212 1.1 ryo G12_CLK_rom_boot,
1213 1.1 ryo G12_CLK_reset_sec,
1214 1.1 ryo G12_CLK_sec_ahb_apb3,
1215 1.1 ryo G12_CLK_cpu_clk_dyn0_sel,
1216 1.1 ryo G12_CLK_cpu_clk_dyn1_sel,
1217 1.1 ryo G12_CLK_cpu_clk_dyn0_div,
1218 1.1 ryo G12_CLK_cpu_clk_dyn1_div,
1219 1.1 ryo G12_CLK_cpu_clk_dyn0,
1220 1.1 ryo G12_CLK_cpu_clk_dyn1,
1221 1.1 ryo G12_CLK_cpu_clk_dyn,
1222 1.1 ryo G12B_CLK_cpu_clk,
1223 1.1 ryo G12_CLK_cpub_clk_dyn0_sel,
1224 1.1 ryo G12_CLK_cpub_clk_dyn0_div,
1225 1.1 ryo G12_CLK_cpub_clk_dyn0,
1226 1.1 ryo G12_CLK_cpub_clk_dyn1_sel,
1227 1.1 ryo G12_CLK_cpub_clk_dyn1_div,
1228 1.1 ryo G12_CLK_cpub_clk_dyn1,
1229 1.1 ryo G12_CLK_cpub_clk_dyn,
1230 1.1 ryo G12_CLK_cpub_clk,
1231 1.1 ryo G12_CLK_ts_div,
1232 1.1 ryo G12_CLK_ts,
1233 1.1 ryo G12_CLK_hdmi_pll_dco,
1234 1.1 ryo G12_CLK_hdmi_pll_od,
1235 1.1 ryo G12_CLK_hdmi_pll_od2,
1236 1.1 ryo G12_CLK_hdmi_pll,
1237 1.1 ryo G12_CLK_vid_pll_div,
1238 1.1 ryo G12_CLK_vid_pll_sel,
1239 1.1 ryo G12_CLK_vid_pll,
1240 1.1 ryo G12_CLK_pcie_pll_dco,
1241 1.1 ryo G12_CLK_pcie_pll_dco_div2,
1242 1.1 ryo G12_CLK_pcie_pll_od,
1243 1.1 ryo G12_CLK_pcie_pll_pll
1244 1.1 ryo };
1245 1.1 ryo
1246 1.1 ryo /*
1247 1.1 ryo * XXX:
1248 1.1 ryo * mesong12_cpuclk_get_rate() is needed because the source clock exceeds 32bit
1249 1.1 ryo * and sys/dev/clk cannot handle it.
1250 1.1 ryo * By modifying sys/dev/clk to be able to handle 64-bit clocks, this function
1251 1.1 ryo * will no longer be needed.
1252 1.1 ryo */
1253 1.1 ryo static u_int
1254 1.1 ryo mesong12_cpuclk_get_rate(struct meson_clk_softc *sc, struct meson_clk_clk *clk)
1255 1.1 ryo {
1256 1.1 ryo bus_size_t reg_cntl0;
1257 1.1 ryo uint64_t freq;
1258 1.1 ryo uint32_t val, m, n, div_shift, div;
1259 1.1 ryo uint64_t xtal_clock = clk_get_rate(fdtbus_clock_byname("xtal"));
1260 1.1 ryo
1261 1.1 ryo KASSERT(clk->type == MESON_CLK_MUX);
1262 1.1 ryo if (sc->sc_clks == mesong12a_clkc_clks) {
1263 1.1 ryo reg_cntl0 = HHI_SYS_PLL_CNTL0;
1264 1.1 ryo } else {
1265 1.1 ryo switch (clk->u.mux.reg) {
1266 1.1 ryo case HHI_SYS_CPU_CLK_CNTL0:
1267 1.1 ryo reg_cntl0 = HHI_SYS1_PLL_CNTL0;
1268 1.1 ryo break;
1269 1.1 ryo case HHI_SYS_CPUB_CLK_CNTL:
1270 1.1 ryo reg_cntl0 = HHI_SYS_PLL_CNTL0;
1271 1.1 ryo break;
1272 1.1 ryo default:
1273 1.1 ryo panic("%s: illegal clk table\n", __func__);
1274 1.1 ryo }
1275 1.1 ryo }
1276 1.1 ryo CLK_LOCK(sc);
1277 1.1 ryo
1278 1.1 ryo if ((CLK_READ(sc, clk->u.mux.reg) & __BIT(11)) == 0) {
1279 1.1 ryo CLK_UNLOCK(sc);
1280 1.1 ryo
1281 1.1 ryo /* use dyn clock instead of sys1?_pll */
1282 1.1 ryo struct clk *clkp;
1283 1.1 ryo
1284 1.1 ryo switch (clk->u.mux.reg) {
1285 1.1 ryo case HHI_SYS_CPU_CLK_CNTL0:
1286 1.1 ryo clkp = (struct clk *)meson_clk_clock_find(sc,
1287 1.1 ryo "cpu_clk_dyn");
1288 1.1 ryo freq = clk_get_rate(clkp);
1289 1.1 ryo break;
1290 1.1 ryo case HHI_SYS_CPUB_CLK_CNTL:
1291 1.1 ryo clkp = (struct clk *)meson_clk_clock_find(sc,
1292 1.1 ryo "cpub_clk_dyn");
1293 1.1 ryo freq = clk_get_rate(clkp);
1294 1.1 ryo break;
1295 1.1 ryo default:
1296 1.1 ryo freq = 0;
1297 1.1 ryo break;
1298 1.1 ryo }
1299 1.1 ryo return freq;
1300 1.1 ryo }
1301 1.1 ryo val = CLK_READ(sc, reg_cntl0);
1302 1.1 ryo m = __SHIFTOUT(val, __BITS(7,0));
1303 1.1 ryo n = __SHIFTOUT(val, __BITS(14,10));
1304 1.1 ryo div_shift = __SHIFTOUT(val, __BITS(18,16));
1305 1.1 ryo div = 1 << div_shift;
1306 1.1 ryo CLK_UNLOCK(sc);
1307 1.1 ryo
1308 1.1 ryo freq = xtal_clock * m / n / div;
1309 1.1 ryo return freq;
1310 1.1 ryo }
1311 1.1 ryo
1312 1.1 ryo static int
1313 1.1 ryo mesong12_cpuclk_set_rate(struct meson_clk_softc *sc, struct meson_clk_clk *clk,
1314 1.1 ryo u_int rate)
1315 1.1 ryo {
1316 1.1 ryo bus_size_t reg_cntl0;
1317 1.1 ryo uint32_t val;
1318 1.1 ryo uint64_t xtal_clock = clk_get_rate(fdtbus_clock_byname("xtal"));
1319 1.1 ryo int new_m, new_n, new_div, i, error;
1320 1.1 ryo
1321 1.1 ryo KASSERT(clk->type == MESON_CLK_MUX);
1322 1.1 ryo if (sc->sc_clks == mesong12a_clkc_clks) {
1323 1.1 ryo reg_cntl0 = HHI_SYS_PLL_CNTL0;
1324 1.1 ryo } else {
1325 1.1 ryo switch (clk->u.mux.reg) {
1326 1.1 ryo case HHI_SYS_CPU_CLK_CNTL0:
1327 1.1 ryo reg_cntl0 = HHI_SYS1_PLL_CNTL0;
1328 1.1 ryo break;
1329 1.1 ryo case HHI_SYS_CPUB_CLK_CNTL:
1330 1.1 ryo reg_cntl0 = HHI_SYS_PLL_CNTL0;
1331 1.1 ryo break;
1332 1.1 ryo default:
1333 1.1 ryo panic("%s: illegal clk table\n", __func__);
1334 1.1 ryo }
1335 1.1 ryo }
1336 1.1 ryo
1337 1.1 ryo new_div = 7;
1338 1.1 ryo new_n = 1;
1339 1.1 ryo new_m = (uint64_t)rate * (1 << new_div) / xtal_clock;
1340 1.1 ryo while (new_m >= 250 && (new_div > 0)) {
1341 1.1 ryo new_div--;
1342 1.1 ryo new_m /= 2;
1343 1.1 ryo }
1344 1.1 ryo
1345 1.1 ryo if (new_m >= 256)
1346 1.1 ryo return EINVAL;
1347 1.1 ryo
1348 1.1 ryo CLK_LOCK(sc);
1349 1.1 ryo
1350 1.1 ryo /* use cpub?_clk_dyn temporary */
1351 1.1 ryo val = CLK_READ(sc, clk->u.mux.reg);
1352 1.1 ryo CLK_WRITE(sc, clk->u.mux.reg, val & ~__BIT(11));
1353 1.1 ryo DELAY(100);
1354 1.1 ryo
1355 1.1 ryo #define MESON_PLL_CNTL_REG_LOCK __BIT(31)
1356 1.1 ryo #define MESON_PLL_CNTL_REG_RST __BIT(29)
1357 1.1 ryo #define MESON_PLL_CNTL_REG_EN __BIT(28)
1358 1.1 ryo /* disable */
1359 1.1 ryo val = CLK_READ(sc, reg_cntl0);
1360 1.1 ryo CLK_WRITE(sc, reg_cntl0, val | MESON_PLL_CNTL_REG_RST);
1361 1.1 ryo val = CLK_READ(sc, reg_cntl0);
1362 1.1 ryo CLK_WRITE(sc, reg_cntl0, val & ~MESON_PLL_CNTL_REG_EN);
1363 1.1 ryo
1364 1.1 ryo /* HHI_SYS{,1}_PLL_CNTL{1,2,3,4,5} */
1365 1.1 ryo CLK_WRITE(sc, reg_cntl0 + CBUS_REG(1), 0x00000000);
1366 1.1 ryo CLK_WRITE(sc, reg_cntl0 + CBUS_REG(2), 0x00000000);
1367 1.1 ryo CLK_WRITE(sc, reg_cntl0 + CBUS_REG(3), 0x48681c00);
1368 1.1 ryo CLK_WRITE(sc, reg_cntl0 + CBUS_REG(4), 0x88770290);
1369 1.1 ryo CLK_WRITE(sc, reg_cntl0 + CBUS_REG(5), 0x39272000);
1370 1.1 ryo DELAY(100);
1371 1.1 ryo
1372 1.1 ryo /* write new M, N, and DIV */
1373 1.1 ryo val = CLK_READ(sc, reg_cntl0);
1374 1.1 ryo val &= ~__BITS(7,0);
1375 1.1 ryo val |= __SHIFTIN(new_m, __BITS(7,0));
1376 1.1 ryo val &= ~__BITS(14,10);
1377 1.1 ryo val |= __SHIFTIN(new_n, __BITS(14,10));
1378 1.1 ryo val &= ~__BITS(18,16);
1379 1.1 ryo val |= __SHIFTIN(new_div, __BITS(18,16));
1380 1.1 ryo CLK_WRITE(sc, reg_cntl0, val);
1381 1.1 ryo
1382 1.1 ryo /* enable */
1383 1.1 ryo val = CLK_READ(sc, reg_cntl0);
1384 1.1 ryo CLK_WRITE(sc, reg_cntl0, val | MESON_PLL_CNTL_REG_RST);
1385 1.1 ryo val = CLK_READ(sc, reg_cntl0);
1386 1.1 ryo CLK_WRITE(sc, reg_cntl0, val | MESON_PLL_CNTL_REG_EN);
1387 1.1 ryo DELAY(1000);
1388 1.1 ryo val = CLK_READ(sc, reg_cntl0);
1389 1.1 ryo CLK_WRITE(sc, reg_cntl0, val & ~MESON_PLL_CNTL_REG_RST);
1390 1.1 ryo
1391 1.1 ryo error = ETIMEDOUT;
1392 1.1 ryo for (i = 24000000; i > 0; i--) {
1393 1.1 ryo if ((CLK_READ(sc, reg_cntl0) & MESON_PLL_CNTL_REG_LOCK) != 0) {
1394 1.1 ryo error = 0;
1395 1.1 ryo break;
1396 1.1 ryo }
1397 1.1 ryo }
1398 1.1 ryo
1399 1.1 ryo /* XXX: always use sys1?_pll. cpub?_clk_dyn should be used for <1GHz */
1400 1.1 ryo val = CLK_READ(sc, clk->u.mux.reg);
1401 1.1 ryo CLK_WRITE(sc, clk->u.mux.reg, val | __BIT(11));
1402 1.1 ryo DELAY(100);
1403 1.1 ryo
1404 1.1 ryo CLK_UNLOCK(sc);
1405 1.1 ryo
1406 1.1 ryo return error;
1407 1.1 ryo }
1408 1.1 ryo
1409 1.1 ryo static int
1410 1.1 ryo mesong12_clk_pcie_pll_set_rate(struct meson_clk_softc *sc,
1411 1.1 ryo struct meson_clk_clk *clk, u_int new_rate)
1412 1.1 ryo {
1413 1.1 ryo struct meson_clk_pll *pll = &clk->u.pll;
1414 1.1 ryo
1415 1.1 ryo KASSERT(clk->type == MESON_CLK_PLL);
1416 1.1 ryo
1417 1.1 ryo /*
1418 1.1 ryo * A strict register sequence is required to set the PLL to the
1419 1.1 ryo * fine-tuned 100MHz for PCIe
1420 1.1 ryo */
1421 1.1 ryo if (new_rate == (100000000 * 2 * 2)) { /* "2*2" is fixed factor */
1422 1.1 ryo uint32_t cntl0, cntl4, cntl3, cntl5;
1423 1.1 ryo
1424 1.1 ryo cntl0 = __SHIFTIN(9, HHI_PCIE_PLL_CNTL0_PCIE_APLL_OD) |
1425 1.1 ryo __SHIFTIN(1, HHI_PCIE_PLL_CNTL0_PCIE_APLL_PREDIV_SEL) |
1426 1.1 ryo __SHIFTIN(150, HHI_PCIE_PLL_CNTL0_PCIE_APLL_FBKDIV);
1427 1.1 ryo cntl4 = __SHIFTIN(1, HHI_PCIE_PLL_CNTL4_PCIE_APLL_LPF_CAPADJ) |
1428 1.1 ryo HHI_PCIE_PLL_CNTL4_PCIE_APLL_LOAD |
1429 1.1 ryo HHI_PCIE_PLL_CNTL4_PCIE_APLL_LOAD_EN;
1430 1.1 ryo cntl3 = __SHIFTIN(1, HHI_PCIE_PLL_CNTL3_PCIE_APLL_AFC_HOLD_T) |
1431 1.1 ryo __SHIFTIN(2, HHI_PCIE_PLL_CNTL3_PCIE_APLL_AFC_DIV) |
1432 1.1 ryo HHI_PCIE_PLL_CNTL3_PCIE_APLL_BIAS_LPF_EN |
1433 1.1 ryo __SHIFTIN(8, HHI_PCIE_PLL_CNTL3_PCIE_APLL_CP_ICAP) |
1434 1.1 ryo __SHIFTIN(14, HHI_PCIE_PLL_CNTL3_PCIE_APLL_CP_IRES);
1435 1.1 ryo cntl5 = __SHIFTIN(6, HHI_PCIE_PLL_CNTL5_PCIE_HCSL_ADJ_LDO) |
1436 1.1 ryo HHI_PCIE_PLL_CNTL5_PCIE_HCSL_BGP_EN |
1437 1.1 ryo HHI_PCIE_PLL_CNTL5_PCIE_HCSL_CAL_EN |
1438 1.1 ryo HHI_PCIE_PLL_CNTL5_PCIE_HCSL_EN0;
1439 1.1 ryo
1440 1.1 ryo CLK_LOCK(sc);
1441 1.1 ryo CLK_WRITE_BITS(sc, pll->reset.reg, pll->reset.mask, 1);
1442 1.1 ryo CLK_WRITE(sc, HHI_PCIE_PLL_CNTL0, cntl0 |
1443 1.1 ryo HHI_PCIE_PLL_CNTL0_PCIE_APLL_RESET);
1444 1.1 ryo CLK_WRITE(sc, HHI_PCIE_PLL_CNTL0, cntl0 |
1445 1.1 ryo HHI_PCIE_PLL_CNTL0_PCIE_APLL_RESET |
1446 1.1 ryo HHI_PCIE_PLL_CNTL0_PCIE_APLL_EN);
1447 1.1 ryo CLK_WRITE(sc, HHI_PCIE_PLL_CNTL1, 0);
1448 1.1 ryo CLK_WRITE(sc, HHI_PCIE_PLL_CNTL2,
1449 1.1 ryo __SHIFTIN(0x1100, HHI_PCIE_PLL_CNTL2_PCIE_APLL_RESERVE));
1450 1.1 ryo CLK_WRITE(sc, HHI_PCIE_PLL_CNTL3, cntl3);
1451 1.1 ryo CLK_WRITE(sc, HHI_PCIE_PLL_CNTL4, cntl4);
1452 1.1 ryo delay(20);
1453 1.1 ryo CLK_WRITE(sc, HHI_PCIE_PLL_CNTL5, cntl5);
1454 1.1 ryo delay(10);
1455 1.1 ryo CLK_WRITE(sc, HHI_PCIE_PLL_CNTL5, cntl5 |
1456 1.1 ryo HHI_PCIE_PLL_CNTL5_PCIE_HCSL_CAL_RSTN);
1457 1.1 ryo CLK_WRITE(sc, HHI_PCIE_PLL_CNTL4, cntl4 |
1458 1.1 ryo HHI_PCIE_PLL_CNTL4_PCIE_APLL_VCTRL_MON_EN);
1459 1.1 ryo delay(10);
1460 1.1 ryo CLK_WRITE(sc, HHI_PCIE_PLL_CNTL0, cntl0 |
1461 1.1 ryo HHI_PCIE_PLL_CNTL0_PCIE_APLL_RESET |
1462 1.1 ryo HHI_PCIE_PLL_CNTL0_PCIE_APLL_EN |
1463 1.1 ryo HHI_PCIE_PLL_CNTL0_PCIE_APLL_AFC_START);
1464 1.1 ryo CLK_WRITE(sc, HHI_PCIE_PLL_CNTL0, cntl0 |
1465 1.1 ryo HHI_PCIE_PLL_CNTL0_PCIE_APLL_EN |
1466 1.1 ryo HHI_PCIE_PLL_CNTL0_PCIE_APLL_AFC_START);
1467 1.1 ryo CLK_WRITE(sc, HHI_PCIE_PLL_CNTL2,
1468 1.1 ryo __SHIFTIN(0x1000, HHI_PCIE_PLL_CNTL2_PCIE_APLL_RESERVE));
1469 1.1 ryo
1470 1.1 ryo CLK_WRITE_BITS(sc, pll->reset.reg, pll->reset.mask, 0);
1471 1.1 ryo /* XXX: pll_wait_lock() sometimes times out? but ignore it */
1472 1.1 ryo meson_clk_pll_wait_lock(sc, pll);
1473 1.1 ryo CLK_UNLOCK(sc);
1474 1.1 ryo return 0;
1475 1.1 ryo }
1476 1.1 ryo
1477 1.1 ryo return meson_clk_pll_set_rate(sc, clk, new_rate);
1478 1.1 ryo }
1479 1.1 ryo
1480 1.1 ryo static const struct mesong12_clkc_config g12a_config = {
1481 1.1 ryo .name = "Meson G12A",
1482 1.1 ryo .clks = mesong12a_clkc_clks,
1483 1.1 ryo .nclks = __arraycount(mesong12a_clkc_clks),
1484 1.1 ryo };
1485 1.1 ryo
1486 1.1 ryo static const struct mesong12_clkc_config g12b_config = {
1487 1.1 ryo .name = "Meson G12B",
1488 1.1 ryo .clks = mesong12b_clkc_clks,
1489 1.1 ryo .nclks = __arraycount(mesong12b_clkc_clks),
1490 1.1 ryo };
1491 1.1 ryo
1492 1.2 thorpej static const struct device_compatible_entry compat_data[] = {
1493 1.2 thorpej { .compat = "amlogic,g12a-clkc", .data = &g12a_config },
1494 1.2 thorpej { .compat = "amlogic,g12b-clkc", .data = &g12b_config },
1495 1.2 thorpej
1496 1.2 thorpej { 0 }
1497 1.1 ryo };
1498 1.1 ryo
1499 1.1 ryo CFATTACH_DECL_NEW(mesong12_clkc, sizeof(struct meson_clk_softc),
1500 1.1 ryo mesong12_clkc_match, mesong12_clkc_attach, NULL, NULL);
1501 1.1 ryo
1502 1.1 ryo static int
1503 1.1 ryo mesong12_clkc_match(device_t parent, cfdata_t cf, void *aux)
1504 1.1 ryo {
1505 1.1 ryo struct fdt_attach_args * const faa = aux;
1506 1.1 ryo
1507 1.1 ryo return of_match_compat_data(faa->faa_phandle, compat_data);
1508 1.1 ryo }
1509 1.1 ryo
1510 1.1 ryo static void
1511 1.1 ryo mesong12_clkc_attach(device_t parent, device_t self, void *aux)
1512 1.1 ryo {
1513 1.1 ryo struct meson_clk_softc * const sc = device_private(self);
1514 1.1 ryo struct fdt_attach_args * const faa = aux;
1515 1.1 ryo const struct mesong12_clkc_config *conf;
1516 1.1 ryo const int phandle = faa->faa_phandle;
1517 1.1 ryo
1518 1.1 ryo sc->sc_dev = self;
1519 1.1 ryo sc->sc_phandle = faa->faa_phandle;
1520 1.1 ryo sc->sc_syscon = fdtbus_syscon_lookup(OF_parent(sc->sc_phandle));
1521 1.1 ryo if (sc->sc_syscon == NULL) {
1522 1.1 ryo aprint_error(": couldn't get syscon registers\n");
1523 1.1 ryo return;
1524 1.1 ryo }
1525 1.1 ryo
1526 1.2 thorpej conf = of_search_compatible(phandle, compat_data)->data;
1527 1.1 ryo sc->sc_clks = conf->clks;
1528 1.1 ryo sc->sc_nclks = conf->nclks;
1529 1.1 ryo
1530 1.1 ryo aprint_naive("\n");
1531 1.1 ryo aprint_normal(": %s clock controller\n", conf->name);
1532 1.1 ryo
1533 1.1 ryo meson_clk_attach(sc);
1534 1.1 ryo meson_clk_print(sc);
1535 1.1 ryo }
1536