1*4882a593Smuzhiyun // SPDX-License-Identifier: GPL-2.0-only
2*4882a593Smuzhiyun /*
3*4882a593Smuzhiyun * Copyright (c) 2016 Maxime Ripard. All rights reserved.
4*4882a593Smuzhiyun */
5*4882a593Smuzhiyun
6*4882a593Smuzhiyun #include <linux/clk-provider.h>
7*4882a593Smuzhiyun #include <linux/io.h>
8*4882a593Smuzhiyun #include <linux/of_address.h>
9*4882a593Smuzhiyun
10*4882a593Smuzhiyun #include "ccu_common.h"
11*4882a593Smuzhiyun #include "ccu_reset.h"
12*4882a593Smuzhiyun
13*4882a593Smuzhiyun #include "ccu_div.h"
14*4882a593Smuzhiyun #include "ccu_gate.h"
15*4882a593Smuzhiyun #include "ccu_mp.h"
16*4882a593Smuzhiyun #include "ccu_mult.h"
17*4882a593Smuzhiyun #include "ccu_nk.h"
18*4882a593Smuzhiyun #include "ccu_nkm.h"
19*4882a593Smuzhiyun #include "ccu_nkmp.h"
20*4882a593Smuzhiyun #include "ccu_nm.h"
21*4882a593Smuzhiyun #include "ccu_phase.h"
22*4882a593Smuzhiyun #include "ccu_sdm.h"
23*4882a593Smuzhiyun
24*4882a593Smuzhiyun #include "ccu-sun8i-h3.h"
25*4882a593Smuzhiyun
26*4882a593Smuzhiyun static SUNXI_CCU_NKMP_WITH_GATE_LOCK(pll_cpux_clk, "pll-cpux",
27*4882a593Smuzhiyun "osc24M", 0x000,
28*4882a593Smuzhiyun 8, 5, /* N */
29*4882a593Smuzhiyun 4, 2, /* K */
30*4882a593Smuzhiyun 0, 2, /* M */
31*4882a593Smuzhiyun 16, 2, /* P */
32*4882a593Smuzhiyun BIT(31), /* gate */
33*4882a593Smuzhiyun BIT(28), /* lock */
34*4882a593Smuzhiyun CLK_SET_RATE_UNGATE);
35*4882a593Smuzhiyun
36*4882a593Smuzhiyun /*
37*4882a593Smuzhiyun * The Audio PLL is supposed to have 4 outputs: 3 fixed factors from
38*4882a593Smuzhiyun * the base (2x, 4x and 8x), and one variable divider (the one true
39*4882a593Smuzhiyun * pll audio).
40*4882a593Smuzhiyun *
41*4882a593Smuzhiyun * With sigma-delta modulation for fractional-N on the audio PLL,
42*4882a593Smuzhiyun * we have to use specific dividers. This means the variable divider
43*4882a593Smuzhiyun * can no longer be used, as the audio codec requests the exact clock
44*4882a593Smuzhiyun * rates we support through this mechanism. So we now hard code the
45*4882a593Smuzhiyun * variable divider to 1. This means the clock rates will no longer
46*4882a593Smuzhiyun * match the clock names.
47*4882a593Smuzhiyun */
48*4882a593Smuzhiyun #define SUN8I_H3_PLL_AUDIO_REG 0x008
49*4882a593Smuzhiyun
50*4882a593Smuzhiyun static struct ccu_sdm_setting pll_audio_sdm_table[] = {
51*4882a593Smuzhiyun { .rate = 22579200, .pattern = 0xc0010d84, .m = 8, .n = 7 },
52*4882a593Smuzhiyun { .rate = 24576000, .pattern = 0xc000ac02, .m = 14, .n = 14 },
53*4882a593Smuzhiyun };
54*4882a593Smuzhiyun
55*4882a593Smuzhiyun static SUNXI_CCU_NM_WITH_SDM_GATE_LOCK(pll_audio_base_clk, "pll-audio-base",
56*4882a593Smuzhiyun "osc24M", 0x008,
57*4882a593Smuzhiyun 8, 7, /* N */
58*4882a593Smuzhiyun 0, 5, /* M */
59*4882a593Smuzhiyun pll_audio_sdm_table, BIT(24),
60*4882a593Smuzhiyun 0x284, BIT(31),
61*4882a593Smuzhiyun BIT(31), /* gate */
62*4882a593Smuzhiyun BIT(28), /* lock */
63*4882a593Smuzhiyun CLK_SET_RATE_UNGATE);
64*4882a593Smuzhiyun
65*4882a593Smuzhiyun static SUNXI_CCU_NM_WITH_FRAC_GATE_LOCK_MIN_MAX(pll_video_clk, "pll-video",
66*4882a593Smuzhiyun "osc24M", 0x0010,
67*4882a593Smuzhiyun 192000000, /* Minimum rate */
68*4882a593Smuzhiyun 912000000, /* Maximum rate */
69*4882a593Smuzhiyun 8, 7, /* N */
70*4882a593Smuzhiyun 0, 4, /* M */
71*4882a593Smuzhiyun BIT(24), /* frac enable */
72*4882a593Smuzhiyun BIT(25), /* frac select */
73*4882a593Smuzhiyun 270000000, /* frac rate 0 */
74*4882a593Smuzhiyun 297000000, /* frac rate 1 */
75*4882a593Smuzhiyun BIT(31), /* gate */
76*4882a593Smuzhiyun BIT(28), /* lock */
77*4882a593Smuzhiyun CLK_SET_RATE_UNGATE);
78*4882a593Smuzhiyun
79*4882a593Smuzhiyun static SUNXI_CCU_NM_WITH_FRAC_GATE_LOCK(pll_ve_clk, "pll-ve",
80*4882a593Smuzhiyun "osc24M", 0x0018,
81*4882a593Smuzhiyun 8, 7, /* N */
82*4882a593Smuzhiyun 0, 4, /* M */
83*4882a593Smuzhiyun BIT(24), /* frac enable */
84*4882a593Smuzhiyun BIT(25), /* frac select */
85*4882a593Smuzhiyun 270000000, /* frac rate 0 */
86*4882a593Smuzhiyun 297000000, /* frac rate 1 */
87*4882a593Smuzhiyun BIT(31), /* gate */
88*4882a593Smuzhiyun BIT(28), /* lock */
89*4882a593Smuzhiyun CLK_SET_RATE_UNGATE);
90*4882a593Smuzhiyun
91*4882a593Smuzhiyun static SUNXI_CCU_NKM_WITH_GATE_LOCK(pll_ddr_clk, "pll-ddr",
92*4882a593Smuzhiyun "osc24M", 0x020,
93*4882a593Smuzhiyun 8, 5, /* N */
94*4882a593Smuzhiyun 4, 2, /* K */
95*4882a593Smuzhiyun 0, 2, /* M */
96*4882a593Smuzhiyun BIT(31), /* gate */
97*4882a593Smuzhiyun BIT(28), /* lock */
98*4882a593Smuzhiyun CLK_SET_RATE_UNGATE);
99*4882a593Smuzhiyun
100*4882a593Smuzhiyun static SUNXI_CCU_NK_WITH_GATE_LOCK_POSTDIV(pll_periph0_clk, "pll-periph0",
101*4882a593Smuzhiyun "osc24M", 0x028,
102*4882a593Smuzhiyun 8, 5, /* N */
103*4882a593Smuzhiyun 4, 2, /* K */
104*4882a593Smuzhiyun BIT(31), /* gate */
105*4882a593Smuzhiyun BIT(28), /* lock */
106*4882a593Smuzhiyun 2, /* post-div */
107*4882a593Smuzhiyun CLK_SET_RATE_UNGATE);
108*4882a593Smuzhiyun
109*4882a593Smuzhiyun static SUNXI_CCU_NM_WITH_FRAC_GATE_LOCK(pll_gpu_clk, "pll-gpu",
110*4882a593Smuzhiyun "osc24M", 0x0038,
111*4882a593Smuzhiyun 8, 7, /* N */
112*4882a593Smuzhiyun 0, 4, /* M */
113*4882a593Smuzhiyun BIT(24), /* frac enable */
114*4882a593Smuzhiyun BIT(25), /* frac select */
115*4882a593Smuzhiyun 270000000, /* frac rate 0 */
116*4882a593Smuzhiyun 297000000, /* frac rate 1 */
117*4882a593Smuzhiyun BIT(31), /* gate */
118*4882a593Smuzhiyun BIT(28), /* lock */
119*4882a593Smuzhiyun CLK_SET_RATE_UNGATE);
120*4882a593Smuzhiyun
121*4882a593Smuzhiyun static SUNXI_CCU_NK_WITH_GATE_LOCK_POSTDIV(pll_periph1_clk, "pll-periph1",
122*4882a593Smuzhiyun "osc24M", 0x044,
123*4882a593Smuzhiyun 8, 5, /* N */
124*4882a593Smuzhiyun 4, 2, /* K */
125*4882a593Smuzhiyun BIT(31), /* gate */
126*4882a593Smuzhiyun BIT(28), /* lock */
127*4882a593Smuzhiyun 2, /* post-div */
128*4882a593Smuzhiyun CLK_SET_RATE_UNGATE);
129*4882a593Smuzhiyun
130*4882a593Smuzhiyun static SUNXI_CCU_NM_WITH_FRAC_GATE_LOCK(pll_de_clk, "pll-de",
131*4882a593Smuzhiyun "osc24M", 0x0048,
132*4882a593Smuzhiyun 8, 7, /* N */
133*4882a593Smuzhiyun 0, 4, /* M */
134*4882a593Smuzhiyun BIT(24), /* frac enable */
135*4882a593Smuzhiyun BIT(25), /* frac select */
136*4882a593Smuzhiyun 270000000, /* frac rate 0 */
137*4882a593Smuzhiyun 297000000, /* frac rate 1 */
138*4882a593Smuzhiyun BIT(31), /* gate */
139*4882a593Smuzhiyun BIT(28), /* lock */
140*4882a593Smuzhiyun CLK_SET_RATE_UNGATE);
141*4882a593Smuzhiyun
142*4882a593Smuzhiyun static const char * const cpux_parents[] = { "osc32k", "osc24M",
143*4882a593Smuzhiyun "pll-cpux" , "pll-cpux" };
144*4882a593Smuzhiyun static SUNXI_CCU_MUX(cpux_clk, "cpux", cpux_parents,
145*4882a593Smuzhiyun 0x050, 16, 2, CLK_IS_CRITICAL | CLK_SET_RATE_PARENT);
146*4882a593Smuzhiyun
147*4882a593Smuzhiyun static SUNXI_CCU_M(axi_clk, "axi", "cpux", 0x050, 0, 2, 0);
148*4882a593Smuzhiyun
149*4882a593Smuzhiyun static const char * const ahb1_parents[] = { "osc32k", "osc24M",
150*4882a593Smuzhiyun "axi" , "pll-periph0" };
151*4882a593Smuzhiyun static const struct ccu_mux_var_prediv ahb1_predivs[] = {
152*4882a593Smuzhiyun { .index = 3, .shift = 6, .width = 2 },
153*4882a593Smuzhiyun };
154*4882a593Smuzhiyun static struct ccu_div ahb1_clk = {
155*4882a593Smuzhiyun .div = _SUNXI_CCU_DIV_FLAGS(4, 2, CLK_DIVIDER_POWER_OF_TWO),
156*4882a593Smuzhiyun
157*4882a593Smuzhiyun .mux = {
158*4882a593Smuzhiyun .shift = 12,
159*4882a593Smuzhiyun .width = 2,
160*4882a593Smuzhiyun
161*4882a593Smuzhiyun .var_predivs = ahb1_predivs,
162*4882a593Smuzhiyun .n_var_predivs = ARRAY_SIZE(ahb1_predivs),
163*4882a593Smuzhiyun },
164*4882a593Smuzhiyun
165*4882a593Smuzhiyun .common = {
166*4882a593Smuzhiyun .reg = 0x054,
167*4882a593Smuzhiyun .features = CCU_FEATURE_VARIABLE_PREDIV,
168*4882a593Smuzhiyun .hw.init = CLK_HW_INIT_PARENTS("ahb1",
169*4882a593Smuzhiyun ahb1_parents,
170*4882a593Smuzhiyun &ccu_div_ops,
171*4882a593Smuzhiyun 0),
172*4882a593Smuzhiyun },
173*4882a593Smuzhiyun };
174*4882a593Smuzhiyun
175*4882a593Smuzhiyun static struct clk_div_table apb1_div_table[] = {
176*4882a593Smuzhiyun { .val = 0, .div = 2 },
177*4882a593Smuzhiyun { .val = 1, .div = 2 },
178*4882a593Smuzhiyun { .val = 2, .div = 4 },
179*4882a593Smuzhiyun { .val = 3, .div = 8 },
180*4882a593Smuzhiyun { /* Sentinel */ },
181*4882a593Smuzhiyun };
182*4882a593Smuzhiyun static SUNXI_CCU_DIV_TABLE(apb1_clk, "apb1", "ahb1",
183*4882a593Smuzhiyun 0x054, 8, 2, apb1_div_table, 0);
184*4882a593Smuzhiyun
185*4882a593Smuzhiyun static const char * const apb2_parents[] = { "osc32k", "osc24M",
186*4882a593Smuzhiyun "pll-periph0" , "pll-periph0" };
187*4882a593Smuzhiyun static SUNXI_CCU_MP_WITH_MUX(apb2_clk, "apb2", apb2_parents, 0x058,
188*4882a593Smuzhiyun 0, 5, /* M */
189*4882a593Smuzhiyun 16, 2, /* P */
190*4882a593Smuzhiyun 24, 2, /* mux */
191*4882a593Smuzhiyun 0);
192*4882a593Smuzhiyun
193*4882a593Smuzhiyun static const char * const ahb2_parents[] = { "ahb1" , "pll-periph0" };
194*4882a593Smuzhiyun static const struct ccu_mux_fixed_prediv ahb2_fixed_predivs[] = {
195*4882a593Smuzhiyun { .index = 1, .div = 2 },
196*4882a593Smuzhiyun };
197*4882a593Smuzhiyun static struct ccu_mux ahb2_clk = {
198*4882a593Smuzhiyun .mux = {
199*4882a593Smuzhiyun .shift = 0,
200*4882a593Smuzhiyun .width = 1,
201*4882a593Smuzhiyun .fixed_predivs = ahb2_fixed_predivs,
202*4882a593Smuzhiyun .n_predivs = ARRAY_SIZE(ahb2_fixed_predivs),
203*4882a593Smuzhiyun },
204*4882a593Smuzhiyun
205*4882a593Smuzhiyun .common = {
206*4882a593Smuzhiyun .reg = 0x05c,
207*4882a593Smuzhiyun .features = CCU_FEATURE_FIXED_PREDIV,
208*4882a593Smuzhiyun .hw.init = CLK_HW_INIT_PARENTS("ahb2",
209*4882a593Smuzhiyun ahb2_parents,
210*4882a593Smuzhiyun &ccu_mux_ops,
211*4882a593Smuzhiyun 0),
212*4882a593Smuzhiyun },
213*4882a593Smuzhiyun };
214*4882a593Smuzhiyun
215*4882a593Smuzhiyun static SUNXI_CCU_GATE(bus_ce_clk, "bus-ce", "ahb1",
216*4882a593Smuzhiyun 0x060, BIT(5), 0);
217*4882a593Smuzhiyun static SUNXI_CCU_GATE(bus_dma_clk, "bus-dma", "ahb1",
218*4882a593Smuzhiyun 0x060, BIT(6), 0);
219*4882a593Smuzhiyun static SUNXI_CCU_GATE(bus_mmc0_clk, "bus-mmc0", "ahb1",
220*4882a593Smuzhiyun 0x060, BIT(8), 0);
221*4882a593Smuzhiyun static SUNXI_CCU_GATE(bus_mmc1_clk, "bus-mmc1", "ahb1",
222*4882a593Smuzhiyun 0x060, BIT(9), 0);
223*4882a593Smuzhiyun static SUNXI_CCU_GATE(bus_mmc2_clk, "bus-mmc2", "ahb1",
224*4882a593Smuzhiyun 0x060, BIT(10), 0);
225*4882a593Smuzhiyun static SUNXI_CCU_GATE(bus_nand_clk, "bus-nand", "ahb1",
226*4882a593Smuzhiyun 0x060, BIT(13), 0);
227*4882a593Smuzhiyun static SUNXI_CCU_GATE(bus_dram_clk, "bus-dram", "ahb1",
228*4882a593Smuzhiyun 0x060, BIT(14), 0);
229*4882a593Smuzhiyun static SUNXI_CCU_GATE(bus_emac_clk, "bus-emac", "ahb2",
230*4882a593Smuzhiyun 0x060, BIT(17), 0);
231*4882a593Smuzhiyun static SUNXI_CCU_GATE(bus_ts_clk, "bus-ts", "ahb1",
232*4882a593Smuzhiyun 0x060, BIT(18), 0);
233*4882a593Smuzhiyun static SUNXI_CCU_GATE(bus_hstimer_clk, "bus-hstimer", "ahb1",
234*4882a593Smuzhiyun 0x060, BIT(19), 0);
235*4882a593Smuzhiyun static SUNXI_CCU_GATE(bus_spi0_clk, "bus-spi0", "ahb1",
236*4882a593Smuzhiyun 0x060, BIT(20), 0);
237*4882a593Smuzhiyun static SUNXI_CCU_GATE(bus_spi1_clk, "bus-spi1", "ahb1",
238*4882a593Smuzhiyun 0x060, BIT(21), 0);
239*4882a593Smuzhiyun static SUNXI_CCU_GATE(bus_otg_clk, "bus-otg", "ahb1",
240*4882a593Smuzhiyun 0x060, BIT(23), 0);
241*4882a593Smuzhiyun static SUNXI_CCU_GATE(bus_ehci0_clk, "bus-ehci0", "ahb1",
242*4882a593Smuzhiyun 0x060, BIT(24), 0);
243*4882a593Smuzhiyun static SUNXI_CCU_GATE(bus_ehci1_clk, "bus-ehci1", "ahb2",
244*4882a593Smuzhiyun 0x060, BIT(25), 0);
245*4882a593Smuzhiyun static SUNXI_CCU_GATE(bus_ehci2_clk, "bus-ehci2", "ahb2",
246*4882a593Smuzhiyun 0x060, BIT(26), 0);
247*4882a593Smuzhiyun static SUNXI_CCU_GATE(bus_ehci3_clk, "bus-ehci3", "ahb2",
248*4882a593Smuzhiyun 0x060, BIT(27), 0);
249*4882a593Smuzhiyun static SUNXI_CCU_GATE(bus_ohci0_clk, "bus-ohci0", "ahb1",
250*4882a593Smuzhiyun 0x060, BIT(28), 0);
251*4882a593Smuzhiyun static SUNXI_CCU_GATE(bus_ohci1_clk, "bus-ohci1", "ahb2",
252*4882a593Smuzhiyun 0x060, BIT(29), 0);
253*4882a593Smuzhiyun static SUNXI_CCU_GATE(bus_ohci2_clk, "bus-ohci2", "ahb2",
254*4882a593Smuzhiyun 0x060, BIT(30), 0);
255*4882a593Smuzhiyun static SUNXI_CCU_GATE(bus_ohci3_clk, "bus-ohci3", "ahb2",
256*4882a593Smuzhiyun 0x060, BIT(31), 0);
257*4882a593Smuzhiyun
258*4882a593Smuzhiyun static SUNXI_CCU_GATE(bus_ve_clk, "bus-ve", "ahb1",
259*4882a593Smuzhiyun 0x064, BIT(0), 0);
260*4882a593Smuzhiyun static SUNXI_CCU_GATE(bus_tcon0_clk, "bus-tcon0", "ahb1",
261*4882a593Smuzhiyun 0x064, BIT(3), 0);
262*4882a593Smuzhiyun static SUNXI_CCU_GATE(bus_tcon1_clk, "bus-tcon1", "ahb1",
263*4882a593Smuzhiyun 0x064, BIT(4), 0);
264*4882a593Smuzhiyun static SUNXI_CCU_GATE(bus_deinterlace_clk, "bus-deinterlace", "ahb1",
265*4882a593Smuzhiyun 0x064, BIT(5), 0);
266*4882a593Smuzhiyun static SUNXI_CCU_GATE(bus_csi_clk, "bus-csi", "ahb1",
267*4882a593Smuzhiyun 0x064, BIT(8), 0);
268*4882a593Smuzhiyun static SUNXI_CCU_GATE(bus_tve_clk, "bus-tve", "ahb1",
269*4882a593Smuzhiyun 0x064, BIT(9), 0);
270*4882a593Smuzhiyun static SUNXI_CCU_GATE(bus_hdmi_clk, "bus-hdmi", "ahb1",
271*4882a593Smuzhiyun 0x064, BIT(11), 0);
272*4882a593Smuzhiyun static SUNXI_CCU_GATE(bus_de_clk, "bus-de", "ahb1",
273*4882a593Smuzhiyun 0x064, BIT(12), 0);
274*4882a593Smuzhiyun static SUNXI_CCU_GATE(bus_gpu_clk, "bus-gpu", "ahb1",
275*4882a593Smuzhiyun 0x064, BIT(20), 0);
276*4882a593Smuzhiyun static SUNXI_CCU_GATE(bus_msgbox_clk, "bus-msgbox", "ahb1",
277*4882a593Smuzhiyun 0x064, BIT(21), 0);
278*4882a593Smuzhiyun static SUNXI_CCU_GATE(bus_spinlock_clk, "bus-spinlock", "ahb1",
279*4882a593Smuzhiyun 0x064, BIT(22), 0);
280*4882a593Smuzhiyun
281*4882a593Smuzhiyun static SUNXI_CCU_GATE(bus_codec_clk, "bus-codec", "apb1",
282*4882a593Smuzhiyun 0x068, BIT(0), 0);
283*4882a593Smuzhiyun static SUNXI_CCU_GATE(bus_spdif_clk, "bus-spdif", "apb1",
284*4882a593Smuzhiyun 0x068, BIT(1), 0);
285*4882a593Smuzhiyun static SUNXI_CCU_GATE(bus_pio_clk, "bus-pio", "apb1",
286*4882a593Smuzhiyun 0x068, BIT(5), 0);
287*4882a593Smuzhiyun static SUNXI_CCU_GATE(bus_ths_clk, "bus-ths", "apb1",
288*4882a593Smuzhiyun 0x068, BIT(8), 0);
289*4882a593Smuzhiyun static SUNXI_CCU_GATE(bus_i2s0_clk, "bus-i2s0", "apb1",
290*4882a593Smuzhiyun 0x068, BIT(12), 0);
291*4882a593Smuzhiyun static SUNXI_CCU_GATE(bus_i2s1_clk, "bus-i2s1", "apb1",
292*4882a593Smuzhiyun 0x068, BIT(13), 0);
293*4882a593Smuzhiyun static SUNXI_CCU_GATE(bus_i2s2_clk, "bus-i2s2", "apb1",
294*4882a593Smuzhiyun 0x068, BIT(14), 0);
295*4882a593Smuzhiyun
296*4882a593Smuzhiyun static SUNXI_CCU_GATE(bus_i2c0_clk, "bus-i2c0", "apb2",
297*4882a593Smuzhiyun 0x06c, BIT(0), 0);
298*4882a593Smuzhiyun static SUNXI_CCU_GATE(bus_i2c1_clk, "bus-i2c1", "apb2",
299*4882a593Smuzhiyun 0x06c, BIT(1), 0);
300*4882a593Smuzhiyun static SUNXI_CCU_GATE(bus_i2c2_clk, "bus-i2c2", "apb2",
301*4882a593Smuzhiyun 0x06c, BIT(2), 0);
302*4882a593Smuzhiyun static SUNXI_CCU_GATE(bus_uart0_clk, "bus-uart0", "apb2",
303*4882a593Smuzhiyun 0x06c, BIT(16), 0);
304*4882a593Smuzhiyun static SUNXI_CCU_GATE(bus_uart1_clk, "bus-uart1", "apb2",
305*4882a593Smuzhiyun 0x06c, BIT(17), 0);
306*4882a593Smuzhiyun static SUNXI_CCU_GATE(bus_uart2_clk, "bus-uart2", "apb2",
307*4882a593Smuzhiyun 0x06c, BIT(18), 0);
308*4882a593Smuzhiyun static SUNXI_CCU_GATE(bus_uart3_clk, "bus-uart3", "apb2",
309*4882a593Smuzhiyun 0x06c, BIT(19), 0);
310*4882a593Smuzhiyun static SUNXI_CCU_GATE(bus_scr0_clk, "bus-scr0", "apb2",
311*4882a593Smuzhiyun 0x06c, BIT(20), 0);
312*4882a593Smuzhiyun static SUNXI_CCU_GATE(bus_scr1_clk, "bus-scr1", "apb2",
313*4882a593Smuzhiyun 0x06c, BIT(21), 0);
314*4882a593Smuzhiyun
315*4882a593Smuzhiyun static SUNXI_CCU_GATE(bus_ephy_clk, "bus-ephy", "ahb1",
316*4882a593Smuzhiyun 0x070, BIT(0), 0);
317*4882a593Smuzhiyun static SUNXI_CCU_GATE(bus_dbg_clk, "bus-dbg", "ahb1",
318*4882a593Smuzhiyun 0x070, BIT(7), 0);
319*4882a593Smuzhiyun
320*4882a593Smuzhiyun static struct clk_div_table ths_div_table[] = {
321*4882a593Smuzhiyun { .val = 0, .div = 1 },
322*4882a593Smuzhiyun { .val = 1, .div = 2 },
323*4882a593Smuzhiyun { .val = 2, .div = 4 },
324*4882a593Smuzhiyun { .val = 3, .div = 6 },
325*4882a593Smuzhiyun { /* Sentinel */ },
326*4882a593Smuzhiyun };
327*4882a593Smuzhiyun static SUNXI_CCU_DIV_TABLE_WITH_GATE(ths_clk, "ths", "osc24M",
328*4882a593Smuzhiyun 0x074, 0, 2, ths_div_table, BIT(31), 0);
329*4882a593Smuzhiyun
330*4882a593Smuzhiyun static const char * const mod0_default_parents[] = { "osc24M", "pll-periph0",
331*4882a593Smuzhiyun "pll-periph1" };
332*4882a593Smuzhiyun static SUNXI_CCU_MP_WITH_MUX_GATE(nand_clk, "nand", mod0_default_parents, 0x080,
333*4882a593Smuzhiyun 0, 4, /* M */
334*4882a593Smuzhiyun 16, 2, /* P */
335*4882a593Smuzhiyun 24, 2, /* mux */
336*4882a593Smuzhiyun BIT(31), /* gate */
337*4882a593Smuzhiyun 0);
338*4882a593Smuzhiyun
339*4882a593Smuzhiyun static SUNXI_CCU_MP_WITH_MUX_GATE(mmc0_clk, "mmc0", mod0_default_parents, 0x088,
340*4882a593Smuzhiyun 0, 4, /* M */
341*4882a593Smuzhiyun 16, 2, /* P */
342*4882a593Smuzhiyun 24, 2, /* mux */
343*4882a593Smuzhiyun BIT(31), /* gate */
344*4882a593Smuzhiyun 0);
345*4882a593Smuzhiyun
346*4882a593Smuzhiyun static SUNXI_CCU_PHASE(mmc0_sample_clk, "mmc0_sample", "mmc0",
347*4882a593Smuzhiyun 0x088, 20, 3, 0);
348*4882a593Smuzhiyun static SUNXI_CCU_PHASE(mmc0_output_clk, "mmc0_output", "mmc0",
349*4882a593Smuzhiyun 0x088, 8, 3, 0);
350*4882a593Smuzhiyun
351*4882a593Smuzhiyun static SUNXI_CCU_MP_WITH_MUX_GATE(mmc1_clk, "mmc1", mod0_default_parents, 0x08c,
352*4882a593Smuzhiyun 0, 4, /* M */
353*4882a593Smuzhiyun 16, 2, /* P */
354*4882a593Smuzhiyun 24, 2, /* mux */
355*4882a593Smuzhiyun BIT(31), /* gate */
356*4882a593Smuzhiyun 0);
357*4882a593Smuzhiyun
358*4882a593Smuzhiyun static SUNXI_CCU_PHASE(mmc1_sample_clk, "mmc1_sample", "mmc1",
359*4882a593Smuzhiyun 0x08c, 20, 3, 0);
360*4882a593Smuzhiyun static SUNXI_CCU_PHASE(mmc1_output_clk, "mmc1_output", "mmc1",
361*4882a593Smuzhiyun 0x08c, 8, 3, 0);
362*4882a593Smuzhiyun
363*4882a593Smuzhiyun static SUNXI_CCU_MP_WITH_MUX_GATE(mmc2_clk, "mmc2", mod0_default_parents, 0x090,
364*4882a593Smuzhiyun 0, 4, /* M */
365*4882a593Smuzhiyun 16, 2, /* P */
366*4882a593Smuzhiyun 24, 2, /* mux */
367*4882a593Smuzhiyun BIT(31), /* gate */
368*4882a593Smuzhiyun 0);
369*4882a593Smuzhiyun
370*4882a593Smuzhiyun static SUNXI_CCU_PHASE(mmc2_sample_clk, "mmc2_sample", "mmc2",
371*4882a593Smuzhiyun 0x090, 20, 3, 0);
372*4882a593Smuzhiyun static SUNXI_CCU_PHASE(mmc2_output_clk, "mmc2_output", "mmc2",
373*4882a593Smuzhiyun 0x090, 8, 3, 0);
374*4882a593Smuzhiyun
375*4882a593Smuzhiyun static const char * const ts_parents[] = { "osc24M", "pll-periph0", };
376*4882a593Smuzhiyun static SUNXI_CCU_MP_WITH_MUX_GATE(ts_clk, "ts", ts_parents, 0x098,
377*4882a593Smuzhiyun 0, 4, /* M */
378*4882a593Smuzhiyun 16, 2, /* P */
379*4882a593Smuzhiyun 24, 2, /* mux */
380*4882a593Smuzhiyun BIT(31), /* gate */
381*4882a593Smuzhiyun 0);
382*4882a593Smuzhiyun
383*4882a593Smuzhiyun static SUNXI_CCU_MP_WITH_MUX_GATE(ce_clk, "ce", mod0_default_parents, 0x09c,
384*4882a593Smuzhiyun 0, 4, /* M */
385*4882a593Smuzhiyun 16, 2, /* P */
386*4882a593Smuzhiyun 24, 2, /* mux */
387*4882a593Smuzhiyun BIT(31), /* gate */
388*4882a593Smuzhiyun 0);
389*4882a593Smuzhiyun
390*4882a593Smuzhiyun static SUNXI_CCU_MP_WITH_MUX_GATE(spi0_clk, "spi0", mod0_default_parents, 0x0a0,
391*4882a593Smuzhiyun 0, 4, /* M */
392*4882a593Smuzhiyun 16, 2, /* P */
393*4882a593Smuzhiyun 24, 2, /* mux */
394*4882a593Smuzhiyun BIT(31), /* gate */
395*4882a593Smuzhiyun 0);
396*4882a593Smuzhiyun
397*4882a593Smuzhiyun static SUNXI_CCU_MP_WITH_MUX_GATE(spi1_clk, "spi1", mod0_default_parents, 0x0a4,
398*4882a593Smuzhiyun 0, 4, /* M */
399*4882a593Smuzhiyun 16, 2, /* P */
400*4882a593Smuzhiyun 24, 2, /* mux */
401*4882a593Smuzhiyun BIT(31), /* gate */
402*4882a593Smuzhiyun 0);
403*4882a593Smuzhiyun
404*4882a593Smuzhiyun static const char * const i2s_parents[] = { "pll-audio-8x", "pll-audio-4x",
405*4882a593Smuzhiyun "pll-audio-2x", "pll-audio" };
406*4882a593Smuzhiyun static SUNXI_CCU_MUX_WITH_GATE(i2s0_clk, "i2s0", i2s_parents,
407*4882a593Smuzhiyun 0x0b0, 16, 2, BIT(31), CLK_SET_RATE_PARENT);
408*4882a593Smuzhiyun
409*4882a593Smuzhiyun static SUNXI_CCU_MUX_WITH_GATE(i2s1_clk, "i2s1", i2s_parents,
410*4882a593Smuzhiyun 0x0b4, 16, 2, BIT(31), CLK_SET_RATE_PARENT);
411*4882a593Smuzhiyun
412*4882a593Smuzhiyun static SUNXI_CCU_MUX_WITH_GATE(i2s2_clk, "i2s2", i2s_parents,
413*4882a593Smuzhiyun 0x0b8, 16, 2, BIT(31), CLK_SET_RATE_PARENT);
414*4882a593Smuzhiyun
415*4882a593Smuzhiyun static SUNXI_CCU_M_WITH_GATE(spdif_clk, "spdif", "pll-audio",
416*4882a593Smuzhiyun 0x0c0, 0, 4, BIT(31), CLK_SET_RATE_PARENT);
417*4882a593Smuzhiyun
418*4882a593Smuzhiyun static SUNXI_CCU_GATE(usb_phy0_clk, "usb-phy0", "osc24M",
419*4882a593Smuzhiyun 0x0cc, BIT(8), 0);
420*4882a593Smuzhiyun static SUNXI_CCU_GATE(usb_phy1_clk, "usb-phy1", "osc24M",
421*4882a593Smuzhiyun 0x0cc, BIT(9), 0);
422*4882a593Smuzhiyun static SUNXI_CCU_GATE(usb_phy2_clk, "usb-phy2", "osc24M",
423*4882a593Smuzhiyun 0x0cc, BIT(10), 0);
424*4882a593Smuzhiyun static SUNXI_CCU_GATE(usb_phy3_clk, "usb-phy3", "osc24M",
425*4882a593Smuzhiyun 0x0cc, BIT(11), 0);
426*4882a593Smuzhiyun static SUNXI_CCU_GATE(usb_ohci0_clk, "usb-ohci0", "osc24M",
427*4882a593Smuzhiyun 0x0cc, BIT(16), 0);
428*4882a593Smuzhiyun static SUNXI_CCU_GATE(usb_ohci1_clk, "usb-ohci1", "osc24M",
429*4882a593Smuzhiyun 0x0cc, BIT(17), 0);
430*4882a593Smuzhiyun static SUNXI_CCU_GATE(usb_ohci2_clk, "usb-ohci2", "osc24M",
431*4882a593Smuzhiyun 0x0cc, BIT(18), 0);
432*4882a593Smuzhiyun static SUNXI_CCU_GATE(usb_ohci3_clk, "usb-ohci3", "osc24M",
433*4882a593Smuzhiyun 0x0cc, BIT(19), 0);
434*4882a593Smuzhiyun
435*4882a593Smuzhiyun static const char * const dram_parents[] = { "pll-ddr", "pll-periph0-2x" };
436*4882a593Smuzhiyun static SUNXI_CCU_M_WITH_MUX(dram_clk, "dram", dram_parents,
437*4882a593Smuzhiyun 0x0f4, 0, 4, 20, 2, CLK_IS_CRITICAL);
438*4882a593Smuzhiyun
439*4882a593Smuzhiyun static SUNXI_CCU_GATE(dram_ve_clk, "dram-ve", "dram",
440*4882a593Smuzhiyun 0x100, BIT(0), 0);
441*4882a593Smuzhiyun static SUNXI_CCU_GATE(dram_csi_clk, "dram-csi", "dram",
442*4882a593Smuzhiyun 0x100, BIT(1), 0);
443*4882a593Smuzhiyun static SUNXI_CCU_GATE(dram_deinterlace_clk, "dram-deinterlace", "dram",
444*4882a593Smuzhiyun 0x100, BIT(2), 0);
445*4882a593Smuzhiyun static SUNXI_CCU_GATE(dram_ts_clk, "dram-ts", "dram",
446*4882a593Smuzhiyun 0x100, BIT(3), 0);
447*4882a593Smuzhiyun
448*4882a593Smuzhiyun static const char * const de_parents[] = { "pll-periph0-2x", "pll-de" };
449*4882a593Smuzhiyun static SUNXI_CCU_M_WITH_MUX_GATE(de_clk, "de", de_parents,
450*4882a593Smuzhiyun 0x104, 0, 4, 24, 3, BIT(31),
451*4882a593Smuzhiyun CLK_SET_RATE_PARENT);
452*4882a593Smuzhiyun
453*4882a593Smuzhiyun static const char * const tcon_parents[] = { "pll-video" };
454*4882a593Smuzhiyun static SUNXI_CCU_M_WITH_MUX_GATE(tcon_clk, "tcon", tcon_parents,
455*4882a593Smuzhiyun 0x118, 0, 4, 24, 3, BIT(31),
456*4882a593Smuzhiyun CLK_SET_RATE_PARENT);
457*4882a593Smuzhiyun
458*4882a593Smuzhiyun static const char * const tve_parents[] = { "pll-de", "pll-periph1" };
459*4882a593Smuzhiyun static SUNXI_CCU_M_WITH_MUX_GATE(tve_clk, "tve", tve_parents,
460*4882a593Smuzhiyun 0x120, 0, 4, 24, 3, BIT(31), 0);
461*4882a593Smuzhiyun
462*4882a593Smuzhiyun static const char * const deinterlace_parents[] = { "pll-periph0", "pll-periph1" };
463*4882a593Smuzhiyun static SUNXI_CCU_M_WITH_MUX_GATE(deinterlace_clk, "deinterlace", deinterlace_parents,
464*4882a593Smuzhiyun 0x124, 0, 4, 24, 3, BIT(31), 0);
465*4882a593Smuzhiyun
466*4882a593Smuzhiyun static SUNXI_CCU_GATE(csi_misc_clk, "csi-misc", "osc24M",
467*4882a593Smuzhiyun 0x130, BIT(31), 0);
468*4882a593Smuzhiyun
469*4882a593Smuzhiyun static const char * const csi_sclk_parents[] = { "pll-periph0", "pll-periph1" };
470*4882a593Smuzhiyun static SUNXI_CCU_M_WITH_MUX_GATE(csi_sclk_clk, "csi-sclk", csi_sclk_parents,
471*4882a593Smuzhiyun 0x134, 16, 4, 24, 3, BIT(31), 0);
472*4882a593Smuzhiyun
473*4882a593Smuzhiyun static const char * const csi_mclk_parents[] = { "osc24M", "pll-video", "pll-periph1" };
474*4882a593Smuzhiyun static SUNXI_CCU_M_WITH_MUX_GATE(csi_mclk_clk, "csi-mclk", csi_mclk_parents,
475*4882a593Smuzhiyun 0x134, 0, 5, 8, 3, BIT(15), 0);
476*4882a593Smuzhiyun
477*4882a593Smuzhiyun static SUNXI_CCU_M_WITH_GATE(ve_clk, "ve", "pll-ve",
478*4882a593Smuzhiyun 0x13c, 16, 3, BIT(31), CLK_SET_RATE_PARENT);
479*4882a593Smuzhiyun
480*4882a593Smuzhiyun static SUNXI_CCU_GATE(ac_dig_clk, "ac-dig", "pll-audio",
481*4882a593Smuzhiyun 0x140, BIT(31), CLK_SET_RATE_PARENT);
482*4882a593Smuzhiyun static SUNXI_CCU_GATE(avs_clk, "avs", "osc24M",
483*4882a593Smuzhiyun 0x144, BIT(31), 0);
484*4882a593Smuzhiyun
485*4882a593Smuzhiyun static const char * const hdmi_parents[] = { "pll-video" };
486*4882a593Smuzhiyun static SUNXI_CCU_M_WITH_MUX_GATE(hdmi_clk, "hdmi", hdmi_parents,
487*4882a593Smuzhiyun 0x150, 0, 4, 24, 2, BIT(31),
488*4882a593Smuzhiyun CLK_SET_RATE_PARENT);
489*4882a593Smuzhiyun
490*4882a593Smuzhiyun static SUNXI_CCU_GATE(hdmi_ddc_clk, "hdmi-ddc", "osc24M",
491*4882a593Smuzhiyun 0x154, BIT(31), 0);
492*4882a593Smuzhiyun
493*4882a593Smuzhiyun static const char * const mbus_parents[] = { "osc24M", "pll-periph0-2x", "pll-ddr" };
494*4882a593Smuzhiyun static SUNXI_CCU_M_WITH_MUX_GATE(mbus_clk, "mbus", mbus_parents,
495*4882a593Smuzhiyun 0x15c, 0, 3, 24, 2, BIT(31), CLK_IS_CRITICAL);
496*4882a593Smuzhiyun
497*4882a593Smuzhiyun static SUNXI_CCU_M_WITH_GATE(gpu_clk, "gpu", "pll-gpu",
498*4882a593Smuzhiyun 0x1a0, 0, 3, BIT(31), CLK_SET_RATE_PARENT);
499*4882a593Smuzhiyun
500*4882a593Smuzhiyun static struct ccu_common *sun8i_h3_ccu_clks[] = {
501*4882a593Smuzhiyun &pll_cpux_clk.common,
502*4882a593Smuzhiyun &pll_audio_base_clk.common,
503*4882a593Smuzhiyun &pll_video_clk.common,
504*4882a593Smuzhiyun &pll_ve_clk.common,
505*4882a593Smuzhiyun &pll_ddr_clk.common,
506*4882a593Smuzhiyun &pll_periph0_clk.common,
507*4882a593Smuzhiyun &pll_gpu_clk.common,
508*4882a593Smuzhiyun &pll_periph1_clk.common,
509*4882a593Smuzhiyun &pll_de_clk.common,
510*4882a593Smuzhiyun &cpux_clk.common,
511*4882a593Smuzhiyun &axi_clk.common,
512*4882a593Smuzhiyun &ahb1_clk.common,
513*4882a593Smuzhiyun &apb1_clk.common,
514*4882a593Smuzhiyun &apb2_clk.common,
515*4882a593Smuzhiyun &ahb2_clk.common,
516*4882a593Smuzhiyun &bus_ce_clk.common,
517*4882a593Smuzhiyun &bus_dma_clk.common,
518*4882a593Smuzhiyun &bus_mmc0_clk.common,
519*4882a593Smuzhiyun &bus_mmc1_clk.common,
520*4882a593Smuzhiyun &bus_mmc2_clk.common,
521*4882a593Smuzhiyun &bus_nand_clk.common,
522*4882a593Smuzhiyun &bus_dram_clk.common,
523*4882a593Smuzhiyun &bus_emac_clk.common,
524*4882a593Smuzhiyun &bus_ts_clk.common,
525*4882a593Smuzhiyun &bus_hstimer_clk.common,
526*4882a593Smuzhiyun &bus_spi0_clk.common,
527*4882a593Smuzhiyun &bus_spi1_clk.common,
528*4882a593Smuzhiyun &bus_otg_clk.common,
529*4882a593Smuzhiyun &bus_ehci0_clk.common,
530*4882a593Smuzhiyun &bus_ehci1_clk.common,
531*4882a593Smuzhiyun &bus_ehci2_clk.common,
532*4882a593Smuzhiyun &bus_ehci3_clk.common,
533*4882a593Smuzhiyun &bus_ohci0_clk.common,
534*4882a593Smuzhiyun &bus_ohci1_clk.common,
535*4882a593Smuzhiyun &bus_ohci2_clk.common,
536*4882a593Smuzhiyun &bus_ohci3_clk.common,
537*4882a593Smuzhiyun &bus_ve_clk.common,
538*4882a593Smuzhiyun &bus_tcon0_clk.common,
539*4882a593Smuzhiyun &bus_tcon1_clk.common,
540*4882a593Smuzhiyun &bus_deinterlace_clk.common,
541*4882a593Smuzhiyun &bus_csi_clk.common,
542*4882a593Smuzhiyun &bus_tve_clk.common,
543*4882a593Smuzhiyun &bus_hdmi_clk.common,
544*4882a593Smuzhiyun &bus_de_clk.common,
545*4882a593Smuzhiyun &bus_gpu_clk.common,
546*4882a593Smuzhiyun &bus_msgbox_clk.common,
547*4882a593Smuzhiyun &bus_spinlock_clk.common,
548*4882a593Smuzhiyun &bus_codec_clk.common,
549*4882a593Smuzhiyun &bus_spdif_clk.common,
550*4882a593Smuzhiyun &bus_pio_clk.common,
551*4882a593Smuzhiyun &bus_ths_clk.common,
552*4882a593Smuzhiyun &bus_i2s0_clk.common,
553*4882a593Smuzhiyun &bus_i2s1_clk.common,
554*4882a593Smuzhiyun &bus_i2s2_clk.common,
555*4882a593Smuzhiyun &bus_i2c0_clk.common,
556*4882a593Smuzhiyun &bus_i2c1_clk.common,
557*4882a593Smuzhiyun &bus_i2c2_clk.common,
558*4882a593Smuzhiyun &bus_uart0_clk.common,
559*4882a593Smuzhiyun &bus_uart1_clk.common,
560*4882a593Smuzhiyun &bus_uart2_clk.common,
561*4882a593Smuzhiyun &bus_uart3_clk.common,
562*4882a593Smuzhiyun &bus_scr0_clk.common,
563*4882a593Smuzhiyun &bus_ephy_clk.common,
564*4882a593Smuzhiyun &bus_dbg_clk.common,
565*4882a593Smuzhiyun &ths_clk.common,
566*4882a593Smuzhiyun &nand_clk.common,
567*4882a593Smuzhiyun &mmc0_clk.common,
568*4882a593Smuzhiyun &mmc0_sample_clk.common,
569*4882a593Smuzhiyun &mmc0_output_clk.common,
570*4882a593Smuzhiyun &mmc1_clk.common,
571*4882a593Smuzhiyun &mmc1_sample_clk.common,
572*4882a593Smuzhiyun &mmc1_output_clk.common,
573*4882a593Smuzhiyun &mmc2_clk.common,
574*4882a593Smuzhiyun &mmc2_sample_clk.common,
575*4882a593Smuzhiyun &mmc2_output_clk.common,
576*4882a593Smuzhiyun &ts_clk.common,
577*4882a593Smuzhiyun &ce_clk.common,
578*4882a593Smuzhiyun &spi0_clk.common,
579*4882a593Smuzhiyun &spi1_clk.common,
580*4882a593Smuzhiyun &i2s0_clk.common,
581*4882a593Smuzhiyun &i2s1_clk.common,
582*4882a593Smuzhiyun &i2s2_clk.common,
583*4882a593Smuzhiyun &spdif_clk.common,
584*4882a593Smuzhiyun &usb_phy0_clk.common,
585*4882a593Smuzhiyun &usb_phy1_clk.common,
586*4882a593Smuzhiyun &usb_phy2_clk.common,
587*4882a593Smuzhiyun &usb_phy3_clk.common,
588*4882a593Smuzhiyun &usb_ohci0_clk.common,
589*4882a593Smuzhiyun &usb_ohci1_clk.common,
590*4882a593Smuzhiyun &usb_ohci2_clk.common,
591*4882a593Smuzhiyun &usb_ohci3_clk.common,
592*4882a593Smuzhiyun &dram_clk.common,
593*4882a593Smuzhiyun &dram_ve_clk.common,
594*4882a593Smuzhiyun &dram_csi_clk.common,
595*4882a593Smuzhiyun &dram_deinterlace_clk.common,
596*4882a593Smuzhiyun &dram_ts_clk.common,
597*4882a593Smuzhiyun &de_clk.common,
598*4882a593Smuzhiyun &tcon_clk.common,
599*4882a593Smuzhiyun &tve_clk.common,
600*4882a593Smuzhiyun &deinterlace_clk.common,
601*4882a593Smuzhiyun &csi_misc_clk.common,
602*4882a593Smuzhiyun &csi_sclk_clk.common,
603*4882a593Smuzhiyun &csi_mclk_clk.common,
604*4882a593Smuzhiyun &ve_clk.common,
605*4882a593Smuzhiyun &ac_dig_clk.common,
606*4882a593Smuzhiyun &avs_clk.common,
607*4882a593Smuzhiyun &hdmi_clk.common,
608*4882a593Smuzhiyun &hdmi_ddc_clk.common,
609*4882a593Smuzhiyun &mbus_clk.common,
610*4882a593Smuzhiyun &gpu_clk.common,
611*4882a593Smuzhiyun };
612*4882a593Smuzhiyun
613*4882a593Smuzhiyun static struct ccu_common *sun50i_h5_ccu_clks[] = {
614*4882a593Smuzhiyun &pll_cpux_clk.common,
615*4882a593Smuzhiyun &pll_audio_base_clk.common,
616*4882a593Smuzhiyun &pll_video_clk.common,
617*4882a593Smuzhiyun &pll_ve_clk.common,
618*4882a593Smuzhiyun &pll_ddr_clk.common,
619*4882a593Smuzhiyun &pll_periph0_clk.common,
620*4882a593Smuzhiyun &pll_gpu_clk.common,
621*4882a593Smuzhiyun &pll_periph1_clk.common,
622*4882a593Smuzhiyun &pll_de_clk.common,
623*4882a593Smuzhiyun &cpux_clk.common,
624*4882a593Smuzhiyun &axi_clk.common,
625*4882a593Smuzhiyun &ahb1_clk.common,
626*4882a593Smuzhiyun &apb1_clk.common,
627*4882a593Smuzhiyun &apb2_clk.common,
628*4882a593Smuzhiyun &ahb2_clk.common,
629*4882a593Smuzhiyun &bus_ce_clk.common,
630*4882a593Smuzhiyun &bus_dma_clk.common,
631*4882a593Smuzhiyun &bus_mmc0_clk.common,
632*4882a593Smuzhiyun &bus_mmc1_clk.common,
633*4882a593Smuzhiyun &bus_mmc2_clk.common,
634*4882a593Smuzhiyun &bus_nand_clk.common,
635*4882a593Smuzhiyun &bus_dram_clk.common,
636*4882a593Smuzhiyun &bus_emac_clk.common,
637*4882a593Smuzhiyun &bus_ts_clk.common,
638*4882a593Smuzhiyun &bus_hstimer_clk.common,
639*4882a593Smuzhiyun &bus_spi0_clk.common,
640*4882a593Smuzhiyun &bus_spi1_clk.common,
641*4882a593Smuzhiyun &bus_otg_clk.common,
642*4882a593Smuzhiyun &bus_ehci0_clk.common,
643*4882a593Smuzhiyun &bus_ehci1_clk.common,
644*4882a593Smuzhiyun &bus_ehci2_clk.common,
645*4882a593Smuzhiyun &bus_ehci3_clk.common,
646*4882a593Smuzhiyun &bus_ohci0_clk.common,
647*4882a593Smuzhiyun &bus_ohci1_clk.common,
648*4882a593Smuzhiyun &bus_ohci2_clk.common,
649*4882a593Smuzhiyun &bus_ohci3_clk.common,
650*4882a593Smuzhiyun &bus_ve_clk.common,
651*4882a593Smuzhiyun &bus_tcon0_clk.common,
652*4882a593Smuzhiyun &bus_tcon1_clk.common,
653*4882a593Smuzhiyun &bus_deinterlace_clk.common,
654*4882a593Smuzhiyun &bus_csi_clk.common,
655*4882a593Smuzhiyun &bus_tve_clk.common,
656*4882a593Smuzhiyun &bus_hdmi_clk.common,
657*4882a593Smuzhiyun &bus_de_clk.common,
658*4882a593Smuzhiyun &bus_gpu_clk.common,
659*4882a593Smuzhiyun &bus_msgbox_clk.common,
660*4882a593Smuzhiyun &bus_spinlock_clk.common,
661*4882a593Smuzhiyun &bus_codec_clk.common,
662*4882a593Smuzhiyun &bus_spdif_clk.common,
663*4882a593Smuzhiyun &bus_pio_clk.common,
664*4882a593Smuzhiyun &bus_ths_clk.common,
665*4882a593Smuzhiyun &bus_i2s0_clk.common,
666*4882a593Smuzhiyun &bus_i2s1_clk.common,
667*4882a593Smuzhiyun &bus_i2s2_clk.common,
668*4882a593Smuzhiyun &bus_i2c0_clk.common,
669*4882a593Smuzhiyun &bus_i2c1_clk.common,
670*4882a593Smuzhiyun &bus_i2c2_clk.common,
671*4882a593Smuzhiyun &bus_uart0_clk.common,
672*4882a593Smuzhiyun &bus_uart1_clk.common,
673*4882a593Smuzhiyun &bus_uart2_clk.common,
674*4882a593Smuzhiyun &bus_uart3_clk.common,
675*4882a593Smuzhiyun &bus_scr0_clk.common,
676*4882a593Smuzhiyun &bus_scr1_clk.common,
677*4882a593Smuzhiyun &bus_ephy_clk.common,
678*4882a593Smuzhiyun &bus_dbg_clk.common,
679*4882a593Smuzhiyun &ths_clk.common,
680*4882a593Smuzhiyun &nand_clk.common,
681*4882a593Smuzhiyun &mmc0_clk.common,
682*4882a593Smuzhiyun &mmc1_clk.common,
683*4882a593Smuzhiyun &mmc2_clk.common,
684*4882a593Smuzhiyun &ts_clk.common,
685*4882a593Smuzhiyun &ce_clk.common,
686*4882a593Smuzhiyun &spi0_clk.common,
687*4882a593Smuzhiyun &spi1_clk.common,
688*4882a593Smuzhiyun &i2s0_clk.common,
689*4882a593Smuzhiyun &i2s1_clk.common,
690*4882a593Smuzhiyun &i2s2_clk.common,
691*4882a593Smuzhiyun &spdif_clk.common,
692*4882a593Smuzhiyun &usb_phy0_clk.common,
693*4882a593Smuzhiyun &usb_phy1_clk.common,
694*4882a593Smuzhiyun &usb_phy2_clk.common,
695*4882a593Smuzhiyun &usb_phy3_clk.common,
696*4882a593Smuzhiyun &usb_ohci0_clk.common,
697*4882a593Smuzhiyun &usb_ohci1_clk.common,
698*4882a593Smuzhiyun &usb_ohci2_clk.common,
699*4882a593Smuzhiyun &usb_ohci3_clk.common,
700*4882a593Smuzhiyun &dram_clk.common,
701*4882a593Smuzhiyun &dram_ve_clk.common,
702*4882a593Smuzhiyun &dram_csi_clk.common,
703*4882a593Smuzhiyun &dram_deinterlace_clk.common,
704*4882a593Smuzhiyun &dram_ts_clk.common,
705*4882a593Smuzhiyun &de_clk.common,
706*4882a593Smuzhiyun &tcon_clk.common,
707*4882a593Smuzhiyun &tve_clk.common,
708*4882a593Smuzhiyun &deinterlace_clk.common,
709*4882a593Smuzhiyun &csi_misc_clk.common,
710*4882a593Smuzhiyun &csi_sclk_clk.common,
711*4882a593Smuzhiyun &csi_mclk_clk.common,
712*4882a593Smuzhiyun &ve_clk.common,
713*4882a593Smuzhiyun &ac_dig_clk.common,
714*4882a593Smuzhiyun &avs_clk.common,
715*4882a593Smuzhiyun &hdmi_clk.common,
716*4882a593Smuzhiyun &hdmi_ddc_clk.common,
717*4882a593Smuzhiyun &mbus_clk.common,
718*4882a593Smuzhiyun &gpu_clk.common,
719*4882a593Smuzhiyun };
720*4882a593Smuzhiyun
721*4882a593Smuzhiyun static const struct clk_hw *clk_parent_pll_audio[] = {
722*4882a593Smuzhiyun &pll_audio_base_clk.common.hw
723*4882a593Smuzhiyun };
724*4882a593Smuzhiyun
725*4882a593Smuzhiyun /* We hardcode the divider to 1 for now */
726*4882a593Smuzhiyun static CLK_FIXED_FACTOR_HWS(pll_audio_clk, "pll-audio",
727*4882a593Smuzhiyun clk_parent_pll_audio,
728*4882a593Smuzhiyun 1, 1, CLK_SET_RATE_PARENT);
729*4882a593Smuzhiyun static CLK_FIXED_FACTOR_HWS(pll_audio_2x_clk, "pll-audio-2x",
730*4882a593Smuzhiyun clk_parent_pll_audio,
731*4882a593Smuzhiyun 2, 1, CLK_SET_RATE_PARENT);
732*4882a593Smuzhiyun static CLK_FIXED_FACTOR_HWS(pll_audio_4x_clk, "pll-audio-4x",
733*4882a593Smuzhiyun clk_parent_pll_audio,
734*4882a593Smuzhiyun 1, 1, CLK_SET_RATE_PARENT);
735*4882a593Smuzhiyun static CLK_FIXED_FACTOR_HWS(pll_audio_8x_clk, "pll-audio-8x",
736*4882a593Smuzhiyun clk_parent_pll_audio,
737*4882a593Smuzhiyun 1, 2, CLK_SET_RATE_PARENT);
738*4882a593Smuzhiyun static CLK_FIXED_FACTOR_HW(pll_periph0_2x_clk, "pll-periph0-2x",
739*4882a593Smuzhiyun &pll_periph0_clk.common.hw,
740*4882a593Smuzhiyun 1, 2, 0);
741*4882a593Smuzhiyun
742*4882a593Smuzhiyun static struct clk_hw_onecell_data sun8i_h3_hw_clks = {
743*4882a593Smuzhiyun .hws = {
744*4882a593Smuzhiyun [CLK_PLL_CPUX] = &pll_cpux_clk.common.hw,
745*4882a593Smuzhiyun [CLK_PLL_AUDIO_BASE] = &pll_audio_base_clk.common.hw,
746*4882a593Smuzhiyun [CLK_PLL_AUDIO] = &pll_audio_clk.hw,
747*4882a593Smuzhiyun [CLK_PLL_AUDIO_2X] = &pll_audio_2x_clk.hw,
748*4882a593Smuzhiyun [CLK_PLL_AUDIO_4X] = &pll_audio_4x_clk.hw,
749*4882a593Smuzhiyun [CLK_PLL_AUDIO_8X] = &pll_audio_8x_clk.hw,
750*4882a593Smuzhiyun [CLK_PLL_VIDEO] = &pll_video_clk.common.hw,
751*4882a593Smuzhiyun [CLK_PLL_VE] = &pll_ve_clk.common.hw,
752*4882a593Smuzhiyun [CLK_PLL_DDR] = &pll_ddr_clk.common.hw,
753*4882a593Smuzhiyun [CLK_PLL_PERIPH0] = &pll_periph0_clk.common.hw,
754*4882a593Smuzhiyun [CLK_PLL_PERIPH0_2X] = &pll_periph0_2x_clk.hw,
755*4882a593Smuzhiyun [CLK_PLL_GPU] = &pll_gpu_clk.common.hw,
756*4882a593Smuzhiyun [CLK_PLL_PERIPH1] = &pll_periph1_clk.common.hw,
757*4882a593Smuzhiyun [CLK_PLL_DE] = &pll_de_clk.common.hw,
758*4882a593Smuzhiyun [CLK_CPUX] = &cpux_clk.common.hw,
759*4882a593Smuzhiyun [CLK_AXI] = &axi_clk.common.hw,
760*4882a593Smuzhiyun [CLK_AHB1] = &ahb1_clk.common.hw,
761*4882a593Smuzhiyun [CLK_APB1] = &apb1_clk.common.hw,
762*4882a593Smuzhiyun [CLK_APB2] = &apb2_clk.common.hw,
763*4882a593Smuzhiyun [CLK_AHB2] = &ahb2_clk.common.hw,
764*4882a593Smuzhiyun [CLK_BUS_CE] = &bus_ce_clk.common.hw,
765*4882a593Smuzhiyun [CLK_BUS_DMA] = &bus_dma_clk.common.hw,
766*4882a593Smuzhiyun [CLK_BUS_MMC0] = &bus_mmc0_clk.common.hw,
767*4882a593Smuzhiyun [CLK_BUS_MMC1] = &bus_mmc1_clk.common.hw,
768*4882a593Smuzhiyun [CLK_BUS_MMC2] = &bus_mmc2_clk.common.hw,
769*4882a593Smuzhiyun [CLK_BUS_NAND] = &bus_nand_clk.common.hw,
770*4882a593Smuzhiyun [CLK_BUS_DRAM] = &bus_dram_clk.common.hw,
771*4882a593Smuzhiyun [CLK_BUS_EMAC] = &bus_emac_clk.common.hw,
772*4882a593Smuzhiyun [CLK_BUS_TS] = &bus_ts_clk.common.hw,
773*4882a593Smuzhiyun [CLK_BUS_HSTIMER] = &bus_hstimer_clk.common.hw,
774*4882a593Smuzhiyun [CLK_BUS_SPI0] = &bus_spi0_clk.common.hw,
775*4882a593Smuzhiyun [CLK_BUS_SPI1] = &bus_spi1_clk.common.hw,
776*4882a593Smuzhiyun [CLK_BUS_OTG] = &bus_otg_clk.common.hw,
777*4882a593Smuzhiyun [CLK_BUS_EHCI0] = &bus_ehci0_clk.common.hw,
778*4882a593Smuzhiyun [CLK_BUS_EHCI1] = &bus_ehci1_clk.common.hw,
779*4882a593Smuzhiyun [CLK_BUS_EHCI2] = &bus_ehci2_clk.common.hw,
780*4882a593Smuzhiyun [CLK_BUS_EHCI3] = &bus_ehci3_clk.common.hw,
781*4882a593Smuzhiyun [CLK_BUS_OHCI0] = &bus_ohci0_clk.common.hw,
782*4882a593Smuzhiyun [CLK_BUS_OHCI1] = &bus_ohci1_clk.common.hw,
783*4882a593Smuzhiyun [CLK_BUS_OHCI2] = &bus_ohci2_clk.common.hw,
784*4882a593Smuzhiyun [CLK_BUS_OHCI3] = &bus_ohci3_clk.common.hw,
785*4882a593Smuzhiyun [CLK_BUS_VE] = &bus_ve_clk.common.hw,
786*4882a593Smuzhiyun [CLK_BUS_TCON0] = &bus_tcon0_clk.common.hw,
787*4882a593Smuzhiyun [CLK_BUS_TCON1] = &bus_tcon1_clk.common.hw,
788*4882a593Smuzhiyun [CLK_BUS_DEINTERLACE] = &bus_deinterlace_clk.common.hw,
789*4882a593Smuzhiyun [CLK_BUS_CSI] = &bus_csi_clk.common.hw,
790*4882a593Smuzhiyun [CLK_BUS_TVE] = &bus_tve_clk.common.hw,
791*4882a593Smuzhiyun [CLK_BUS_HDMI] = &bus_hdmi_clk.common.hw,
792*4882a593Smuzhiyun [CLK_BUS_DE] = &bus_de_clk.common.hw,
793*4882a593Smuzhiyun [CLK_BUS_GPU] = &bus_gpu_clk.common.hw,
794*4882a593Smuzhiyun [CLK_BUS_MSGBOX] = &bus_msgbox_clk.common.hw,
795*4882a593Smuzhiyun [CLK_BUS_SPINLOCK] = &bus_spinlock_clk.common.hw,
796*4882a593Smuzhiyun [CLK_BUS_CODEC] = &bus_codec_clk.common.hw,
797*4882a593Smuzhiyun [CLK_BUS_SPDIF] = &bus_spdif_clk.common.hw,
798*4882a593Smuzhiyun [CLK_BUS_PIO] = &bus_pio_clk.common.hw,
799*4882a593Smuzhiyun [CLK_BUS_THS] = &bus_ths_clk.common.hw,
800*4882a593Smuzhiyun [CLK_BUS_I2S0] = &bus_i2s0_clk.common.hw,
801*4882a593Smuzhiyun [CLK_BUS_I2S1] = &bus_i2s1_clk.common.hw,
802*4882a593Smuzhiyun [CLK_BUS_I2S2] = &bus_i2s2_clk.common.hw,
803*4882a593Smuzhiyun [CLK_BUS_I2C0] = &bus_i2c0_clk.common.hw,
804*4882a593Smuzhiyun [CLK_BUS_I2C1] = &bus_i2c1_clk.common.hw,
805*4882a593Smuzhiyun [CLK_BUS_I2C2] = &bus_i2c2_clk.common.hw,
806*4882a593Smuzhiyun [CLK_BUS_UART0] = &bus_uart0_clk.common.hw,
807*4882a593Smuzhiyun [CLK_BUS_UART1] = &bus_uart1_clk.common.hw,
808*4882a593Smuzhiyun [CLK_BUS_UART2] = &bus_uart2_clk.common.hw,
809*4882a593Smuzhiyun [CLK_BUS_UART3] = &bus_uart3_clk.common.hw,
810*4882a593Smuzhiyun [CLK_BUS_SCR0] = &bus_scr0_clk.common.hw,
811*4882a593Smuzhiyun [CLK_BUS_EPHY] = &bus_ephy_clk.common.hw,
812*4882a593Smuzhiyun [CLK_BUS_DBG] = &bus_dbg_clk.common.hw,
813*4882a593Smuzhiyun [CLK_THS] = &ths_clk.common.hw,
814*4882a593Smuzhiyun [CLK_NAND] = &nand_clk.common.hw,
815*4882a593Smuzhiyun [CLK_MMC0] = &mmc0_clk.common.hw,
816*4882a593Smuzhiyun [CLK_MMC0_SAMPLE] = &mmc0_sample_clk.common.hw,
817*4882a593Smuzhiyun [CLK_MMC0_OUTPUT] = &mmc0_output_clk.common.hw,
818*4882a593Smuzhiyun [CLK_MMC1] = &mmc1_clk.common.hw,
819*4882a593Smuzhiyun [CLK_MMC1_SAMPLE] = &mmc1_sample_clk.common.hw,
820*4882a593Smuzhiyun [CLK_MMC1_OUTPUT] = &mmc1_output_clk.common.hw,
821*4882a593Smuzhiyun [CLK_MMC2] = &mmc2_clk.common.hw,
822*4882a593Smuzhiyun [CLK_MMC2_SAMPLE] = &mmc2_sample_clk.common.hw,
823*4882a593Smuzhiyun [CLK_MMC2_OUTPUT] = &mmc2_output_clk.common.hw,
824*4882a593Smuzhiyun [CLK_TS] = &ts_clk.common.hw,
825*4882a593Smuzhiyun [CLK_CE] = &ce_clk.common.hw,
826*4882a593Smuzhiyun [CLK_SPI0] = &spi0_clk.common.hw,
827*4882a593Smuzhiyun [CLK_SPI1] = &spi1_clk.common.hw,
828*4882a593Smuzhiyun [CLK_I2S0] = &i2s0_clk.common.hw,
829*4882a593Smuzhiyun [CLK_I2S1] = &i2s1_clk.common.hw,
830*4882a593Smuzhiyun [CLK_I2S2] = &i2s2_clk.common.hw,
831*4882a593Smuzhiyun [CLK_SPDIF] = &spdif_clk.common.hw,
832*4882a593Smuzhiyun [CLK_USB_PHY0] = &usb_phy0_clk.common.hw,
833*4882a593Smuzhiyun [CLK_USB_PHY1] = &usb_phy1_clk.common.hw,
834*4882a593Smuzhiyun [CLK_USB_PHY2] = &usb_phy2_clk.common.hw,
835*4882a593Smuzhiyun [CLK_USB_PHY3] = &usb_phy3_clk.common.hw,
836*4882a593Smuzhiyun [CLK_USB_OHCI0] = &usb_ohci0_clk.common.hw,
837*4882a593Smuzhiyun [CLK_USB_OHCI1] = &usb_ohci1_clk.common.hw,
838*4882a593Smuzhiyun [CLK_USB_OHCI2] = &usb_ohci2_clk.common.hw,
839*4882a593Smuzhiyun [CLK_USB_OHCI3] = &usb_ohci3_clk.common.hw,
840*4882a593Smuzhiyun [CLK_DRAM] = &dram_clk.common.hw,
841*4882a593Smuzhiyun [CLK_DRAM_VE] = &dram_ve_clk.common.hw,
842*4882a593Smuzhiyun [CLK_DRAM_CSI] = &dram_csi_clk.common.hw,
843*4882a593Smuzhiyun [CLK_DRAM_DEINTERLACE] = &dram_deinterlace_clk.common.hw,
844*4882a593Smuzhiyun [CLK_DRAM_TS] = &dram_ts_clk.common.hw,
845*4882a593Smuzhiyun [CLK_DE] = &de_clk.common.hw,
846*4882a593Smuzhiyun [CLK_TCON0] = &tcon_clk.common.hw,
847*4882a593Smuzhiyun [CLK_TVE] = &tve_clk.common.hw,
848*4882a593Smuzhiyun [CLK_DEINTERLACE] = &deinterlace_clk.common.hw,
849*4882a593Smuzhiyun [CLK_CSI_MISC] = &csi_misc_clk.common.hw,
850*4882a593Smuzhiyun [CLK_CSI_SCLK] = &csi_sclk_clk.common.hw,
851*4882a593Smuzhiyun [CLK_CSI_MCLK] = &csi_mclk_clk.common.hw,
852*4882a593Smuzhiyun [CLK_VE] = &ve_clk.common.hw,
853*4882a593Smuzhiyun [CLK_AC_DIG] = &ac_dig_clk.common.hw,
854*4882a593Smuzhiyun [CLK_AVS] = &avs_clk.common.hw,
855*4882a593Smuzhiyun [CLK_HDMI] = &hdmi_clk.common.hw,
856*4882a593Smuzhiyun [CLK_HDMI_DDC] = &hdmi_ddc_clk.common.hw,
857*4882a593Smuzhiyun [CLK_MBUS] = &mbus_clk.common.hw,
858*4882a593Smuzhiyun [CLK_GPU] = &gpu_clk.common.hw,
859*4882a593Smuzhiyun },
860*4882a593Smuzhiyun .num = CLK_NUMBER_H3,
861*4882a593Smuzhiyun };
862*4882a593Smuzhiyun
863*4882a593Smuzhiyun static struct clk_hw_onecell_data sun50i_h5_hw_clks = {
864*4882a593Smuzhiyun .hws = {
865*4882a593Smuzhiyun [CLK_PLL_CPUX] = &pll_cpux_clk.common.hw,
866*4882a593Smuzhiyun [CLK_PLL_AUDIO_BASE] = &pll_audio_base_clk.common.hw,
867*4882a593Smuzhiyun [CLK_PLL_AUDIO] = &pll_audio_clk.hw,
868*4882a593Smuzhiyun [CLK_PLL_AUDIO_2X] = &pll_audio_2x_clk.hw,
869*4882a593Smuzhiyun [CLK_PLL_AUDIO_4X] = &pll_audio_4x_clk.hw,
870*4882a593Smuzhiyun [CLK_PLL_AUDIO_8X] = &pll_audio_8x_clk.hw,
871*4882a593Smuzhiyun [CLK_PLL_VIDEO] = &pll_video_clk.common.hw,
872*4882a593Smuzhiyun [CLK_PLL_VE] = &pll_ve_clk.common.hw,
873*4882a593Smuzhiyun [CLK_PLL_DDR] = &pll_ddr_clk.common.hw,
874*4882a593Smuzhiyun [CLK_PLL_PERIPH0] = &pll_periph0_clk.common.hw,
875*4882a593Smuzhiyun [CLK_PLL_PERIPH0_2X] = &pll_periph0_2x_clk.hw,
876*4882a593Smuzhiyun [CLK_PLL_GPU] = &pll_gpu_clk.common.hw,
877*4882a593Smuzhiyun [CLK_PLL_PERIPH1] = &pll_periph1_clk.common.hw,
878*4882a593Smuzhiyun [CLK_PLL_DE] = &pll_de_clk.common.hw,
879*4882a593Smuzhiyun [CLK_CPUX] = &cpux_clk.common.hw,
880*4882a593Smuzhiyun [CLK_AXI] = &axi_clk.common.hw,
881*4882a593Smuzhiyun [CLK_AHB1] = &ahb1_clk.common.hw,
882*4882a593Smuzhiyun [CLK_APB1] = &apb1_clk.common.hw,
883*4882a593Smuzhiyun [CLK_APB2] = &apb2_clk.common.hw,
884*4882a593Smuzhiyun [CLK_AHB2] = &ahb2_clk.common.hw,
885*4882a593Smuzhiyun [CLK_BUS_CE] = &bus_ce_clk.common.hw,
886*4882a593Smuzhiyun [CLK_BUS_DMA] = &bus_dma_clk.common.hw,
887*4882a593Smuzhiyun [CLK_BUS_MMC0] = &bus_mmc0_clk.common.hw,
888*4882a593Smuzhiyun [CLK_BUS_MMC1] = &bus_mmc1_clk.common.hw,
889*4882a593Smuzhiyun [CLK_BUS_MMC2] = &bus_mmc2_clk.common.hw,
890*4882a593Smuzhiyun [CLK_BUS_NAND] = &bus_nand_clk.common.hw,
891*4882a593Smuzhiyun [CLK_BUS_DRAM] = &bus_dram_clk.common.hw,
892*4882a593Smuzhiyun [CLK_BUS_EMAC] = &bus_emac_clk.common.hw,
893*4882a593Smuzhiyun [CLK_BUS_TS] = &bus_ts_clk.common.hw,
894*4882a593Smuzhiyun [CLK_BUS_HSTIMER] = &bus_hstimer_clk.common.hw,
895*4882a593Smuzhiyun [CLK_BUS_SPI0] = &bus_spi0_clk.common.hw,
896*4882a593Smuzhiyun [CLK_BUS_SPI1] = &bus_spi1_clk.common.hw,
897*4882a593Smuzhiyun [CLK_BUS_OTG] = &bus_otg_clk.common.hw,
898*4882a593Smuzhiyun [CLK_BUS_EHCI0] = &bus_ehci0_clk.common.hw,
899*4882a593Smuzhiyun [CLK_BUS_EHCI1] = &bus_ehci1_clk.common.hw,
900*4882a593Smuzhiyun [CLK_BUS_EHCI2] = &bus_ehci2_clk.common.hw,
901*4882a593Smuzhiyun [CLK_BUS_EHCI3] = &bus_ehci3_clk.common.hw,
902*4882a593Smuzhiyun [CLK_BUS_OHCI0] = &bus_ohci0_clk.common.hw,
903*4882a593Smuzhiyun [CLK_BUS_OHCI1] = &bus_ohci1_clk.common.hw,
904*4882a593Smuzhiyun [CLK_BUS_OHCI2] = &bus_ohci2_clk.common.hw,
905*4882a593Smuzhiyun [CLK_BUS_OHCI3] = &bus_ohci3_clk.common.hw,
906*4882a593Smuzhiyun [CLK_BUS_VE] = &bus_ve_clk.common.hw,
907*4882a593Smuzhiyun [CLK_BUS_TCON0] = &bus_tcon0_clk.common.hw,
908*4882a593Smuzhiyun [CLK_BUS_TCON1] = &bus_tcon1_clk.common.hw,
909*4882a593Smuzhiyun [CLK_BUS_DEINTERLACE] = &bus_deinterlace_clk.common.hw,
910*4882a593Smuzhiyun [CLK_BUS_CSI] = &bus_csi_clk.common.hw,
911*4882a593Smuzhiyun [CLK_BUS_TVE] = &bus_tve_clk.common.hw,
912*4882a593Smuzhiyun [CLK_BUS_HDMI] = &bus_hdmi_clk.common.hw,
913*4882a593Smuzhiyun [CLK_BUS_DE] = &bus_de_clk.common.hw,
914*4882a593Smuzhiyun [CLK_BUS_GPU] = &bus_gpu_clk.common.hw,
915*4882a593Smuzhiyun [CLK_BUS_MSGBOX] = &bus_msgbox_clk.common.hw,
916*4882a593Smuzhiyun [CLK_BUS_SPINLOCK] = &bus_spinlock_clk.common.hw,
917*4882a593Smuzhiyun [CLK_BUS_CODEC] = &bus_codec_clk.common.hw,
918*4882a593Smuzhiyun [CLK_BUS_SPDIF] = &bus_spdif_clk.common.hw,
919*4882a593Smuzhiyun [CLK_BUS_PIO] = &bus_pio_clk.common.hw,
920*4882a593Smuzhiyun [CLK_BUS_THS] = &bus_ths_clk.common.hw,
921*4882a593Smuzhiyun [CLK_BUS_I2S0] = &bus_i2s0_clk.common.hw,
922*4882a593Smuzhiyun [CLK_BUS_I2S1] = &bus_i2s1_clk.common.hw,
923*4882a593Smuzhiyun [CLK_BUS_I2S2] = &bus_i2s2_clk.common.hw,
924*4882a593Smuzhiyun [CLK_BUS_I2C0] = &bus_i2c0_clk.common.hw,
925*4882a593Smuzhiyun [CLK_BUS_I2C1] = &bus_i2c1_clk.common.hw,
926*4882a593Smuzhiyun [CLK_BUS_I2C2] = &bus_i2c2_clk.common.hw,
927*4882a593Smuzhiyun [CLK_BUS_UART0] = &bus_uart0_clk.common.hw,
928*4882a593Smuzhiyun [CLK_BUS_UART1] = &bus_uart1_clk.common.hw,
929*4882a593Smuzhiyun [CLK_BUS_UART2] = &bus_uart2_clk.common.hw,
930*4882a593Smuzhiyun [CLK_BUS_UART3] = &bus_uart3_clk.common.hw,
931*4882a593Smuzhiyun [CLK_BUS_SCR0] = &bus_scr0_clk.common.hw,
932*4882a593Smuzhiyun [CLK_BUS_SCR1] = &bus_scr1_clk.common.hw,
933*4882a593Smuzhiyun [CLK_BUS_EPHY] = &bus_ephy_clk.common.hw,
934*4882a593Smuzhiyun [CLK_BUS_DBG] = &bus_dbg_clk.common.hw,
935*4882a593Smuzhiyun [CLK_THS] = &ths_clk.common.hw,
936*4882a593Smuzhiyun [CLK_NAND] = &nand_clk.common.hw,
937*4882a593Smuzhiyun [CLK_MMC0] = &mmc0_clk.common.hw,
938*4882a593Smuzhiyun [CLK_MMC1] = &mmc1_clk.common.hw,
939*4882a593Smuzhiyun [CLK_MMC2] = &mmc2_clk.common.hw,
940*4882a593Smuzhiyun [CLK_TS] = &ts_clk.common.hw,
941*4882a593Smuzhiyun [CLK_CE] = &ce_clk.common.hw,
942*4882a593Smuzhiyun [CLK_SPI0] = &spi0_clk.common.hw,
943*4882a593Smuzhiyun [CLK_SPI1] = &spi1_clk.common.hw,
944*4882a593Smuzhiyun [CLK_I2S0] = &i2s0_clk.common.hw,
945*4882a593Smuzhiyun [CLK_I2S1] = &i2s1_clk.common.hw,
946*4882a593Smuzhiyun [CLK_I2S2] = &i2s2_clk.common.hw,
947*4882a593Smuzhiyun [CLK_SPDIF] = &spdif_clk.common.hw,
948*4882a593Smuzhiyun [CLK_USB_PHY0] = &usb_phy0_clk.common.hw,
949*4882a593Smuzhiyun [CLK_USB_PHY1] = &usb_phy1_clk.common.hw,
950*4882a593Smuzhiyun [CLK_USB_PHY2] = &usb_phy2_clk.common.hw,
951*4882a593Smuzhiyun [CLK_USB_PHY3] = &usb_phy3_clk.common.hw,
952*4882a593Smuzhiyun [CLK_USB_OHCI0] = &usb_ohci0_clk.common.hw,
953*4882a593Smuzhiyun [CLK_USB_OHCI1] = &usb_ohci1_clk.common.hw,
954*4882a593Smuzhiyun [CLK_USB_OHCI2] = &usb_ohci2_clk.common.hw,
955*4882a593Smuzhiyun [CLK_USB_OHCI3] = &usb_ohci3_clk.common.hw,
956*4882a593Smuzhiyun [CLK_DRAM] = &dram_clk.common.hw,
957*4882a593Smuzhiyun [CLK_DRAM_VE] = &dram_ve_clk.common.hw,
958*4882a593Smuzhiyun [CLK_DRAM_CSI] = &dram_csi_clk.common.hw,
959*4882a593Smuzhiyun [CLK_DRAM_DEINTERLACE] = &dram_deinterlace_clk.common.hw,
960*4882a593Smuzhiyun [CLK_DRAM_TS] = &dram_ts_clk.common.hw,
961*4882a593Smuzhiyun [CLK_DE] = &de_clk.common.hw,
962*4882a593Smuzhiyun [CLK_TCON0] = &tcon_clk.common.hw,
963*4882a593Smuzhiyun [CLK_TVE] = &tve_clk.common.hw,
964*4882a593Smuzhiyun [CLK_DEINTERLACE] = &deinterlace_clk.common.hw,
965*4882a593Smuzhiyun [CLK_CSI_MISC] = &csi_misc_clk.common.hw,
966*4882a593Smuzhiyun [CLK_CSI_SCLK] = &csi_sclk_clk.common.hw,
967*4882a593Smuzhiyun [CLK_CSI_MCLK] = &csi_mclk_clk.common.hw,
968*4882a593Smuzhiyun [CLK_VE] = &ve_clk.common.hw,
969*4882a593Smuzhiyun [CLK_AC_DIG] = &ac_dig_clk.common.hw,
970*4882a593Smuzhiyun [CLK_AVS] = &avs_clk.common.hw,
971*4882a593Smuzhiyun [CLK_HDMI] = &hdmi_clk.common.hw,
972*4882a593Smuzhiyun [CLK_HDMI_DDC] = &hdmi_ddc_clk.common.hw,
973*4882a593Smuzhiyun [CLK_MBUS] = &mbus_clk.common.hw,
974*4882a593Smuzhiyun [CLK_GPU] = &gpu_clk.common.hw,
975*4882a593Smuzhiyun },
976*4882a593Smuzhiyun .num = CLK_NUMBER_H5,
977*4882a593Smuzhiyun };
978*4882a593Smuzhiyun
979*4882a593Smuzhiyun static struct ccu_reset_map sun8i_h3_ccu_resets[] = {
980*4882a593Smuzhiyun [RST_USB_PHY0] = { 0x0cc, BIT(0) },
981*4882a593Smuzhiyun [RST_USB_PHY1] = { 0x0cc, BIT(1) },
982*4882a593Smuzhiyun [RST_USB_PHY2] = { 0x0cc, BIT(2) },
983*4882a593Smuzhiyun [RST_USB_PHY3] = { 0x0cc, BIT(3) },
984*4882a593Smuzhiyun
985*4882a593Smuzhiyun [RST_MBUS] = { 0x0fc, BIT(31) },
986*4882a593Smuzhiyun
987*4882a593Smuzhiyun [RST_BUS_CE] = { 0x2c0, BIT(5) },
988*4882a593Smuzhiyun [RST_BUS_DMA] = { 0x2c0, BIT(6) },
989*4882a593Smuzhiyun [RST_BUS_MMC0] = { 0x2c0, BIT(8) },
990*4882a593Smuzhiyun [RST_BUS_MMC1] = { 0x2c0, BIT(9) },
991*4882a593Smuzhiyun [RST_BUS_MMC2] = { 0x2c0, BIT(10) },
992*4882a593Smuzhiyun [RST_BUS_NAND] = { 0x2c0, BIT(13) },
993*4882a593Smuzhiyun [RST_BUS_DRAM] = { 0x2c0, BIT(14) },
994*4882a593Smuzhiyun [RST_BUS_EMAC] = { 0x2c0, BIT(17) },
995*4882a593Smuzhiyun [RST_BUS_TS] = { 0x2c0, BIT(18) },
996*4882a593Smuzhiyun [RST_BUS_HSTIMER] = { 0x2c0, BIT(19) },
997*4882a593Smuzhiyun [RST_BUS_SPI0] = { 0x2c0, BIT(20) },
998*4882a593Smuzhiyun [RST_BUS_SPI1] = { 0x2c0, BIT(21) },
999*4882a593Smuzhiyun [RST_BUS_OTG] = { 0x2c0, BIT(23) },
1000*4882a593Smuzhiyun [RST_BUS_EHCI0] = { 0x2c0, BIT(24) },
1001*4882a593Smuzhiyun [RST_BUS_EHCI1] = { 0x2c0, BIT(25) },
1002*4882a593Smuzhiyun [RST_BUS_EHCI2] = { 0x2c0, BIT(26) },
1003*4882a593Smuzhiyun [RST_BUS_EHCI3] = { 0x2c0, BIT(27) },
1004*4882a593Smuzhiyun [RST_BUS_OHCI0] = { 0x2c0, BIT(28) },
1005*4882a593Smuzhiyun [RST_BUS_OHCI1] = { 0x2c0, BIT(29) },
1006*4882a593Smuzhiyun [RST_BUS_OHCI2] = { 0x2c0, BIT(30) },
1007*4882a593Smuzhiyun [RST_BUS_OHCI3] = { 0x2c0, BIT(31) },
1008*4882a593Smuzhiyun
1009*4882a593Smuzhiyun [RST_BUS_VE] = { 0x2c4, BIT(0) },
1010*4882a593Smuzhiyun [RST_BUS_TCON0] = { 0x2c4, BIT(3) },
1011*4882a593Smuzhiyun [RST_BUS_TCON1] = { 0x2c4, BIT(4) },
1012*4882a593Smuzhiyun [RST_BUS_DEINTERLACE] = { 0x2c4, BIT(5) },
1013*4882a593Smuzhiyun [RST_BUS_CSI] = { 0x2c4, BIT(8) },
1014*4882a593Smuzhiyun [RST_BUS_TVE] = { 0x2c4, BIT(9) },
1015*4882a593Smuzhiyun [RST_BUS_HDMI0] = { 0x2c4, BIT(10) },
1016*4882a593Smuzhiyun [RST_BUS_HDMI1] = { 0x2c4, BIT(11) },
1017*4882a593Smuzhiyun [RST_BUS_DE] = { 0x2c4, BIT(12) },
1018*4882a593Smuzhiyun [RST_BUS_GPU] = { 0x2c4, BIT(20) },
1019*4882a593Smuzhiyun [RST_BUS_MSGBOX] = { 0x2c4, BIT(21) },
1020*4882a593Smuzhiyun [RST_BUS_SPINLOCK] = { 0x2c4, BIT(22) },
1021*4882a593Smuzhiyun [RST_BUS_DBG] = { 0x2c4, BIT(31) },
1022*4882a593Smuzhiyun
1023*4882a593Smuzhiyun [RST_BUS_EPHY] = { 0x2c8, BIT(2) },
1024*4882a593Smuzhiyun
1025*4882a593Smuzhiyun [RST_BUS_CODEC] = { 0x2d0, BIT(0) },
1026*4882a593Smuzhiyun [RST_BUS_SPDIF] = { 0x2d0, BIT(1) },
1027*4882a593Smuzhiyun [RST_BUS_THS] = { 0x2d0, BIT(8) },
1028*4882a593Smuzhiyun [RST_BUS_I2S0] = { 0x2d0, BIT(12) },
1029*4882a593Smuzhiyun [RST_BUS_I2S1] = { 0x2d0, BIT(13) },
1030*4882a593Smuzhiyun [RST_BUS_I2S2] = { 0x2d0, BIT(14) },
1031*4882a593Smuzhiyun
1032*4882a593Smuzhiyun [RST_BUS_I2C0] = { 0x2d8, BIT(0) },
1033*4882a593Smuzhiyun [RST_BUS_I2C1] = { 0x2d8, BIT(1) },
1034*4882a593Smuzhiyun [RST_BUS_I2C2] = { 0x2d8, BIT(2) },
1035*4882a593Smuzhiyun [RST_BUS_UART0] = { 0x2d8, BIT(16) },
1036*4882a593Smuzhiyun [RST_BUS_UART1] = { 0x2d8, BIT(17) },
1037*4882a593Smuzhiyun [RST_BUS_UART2] = { 0x2d8, BIT(18) },
1038*4882a593Smuzhiyun [RST_BUS_UART3] = { 0x2d8, BIT(19) },
1039*4882a593Smuzhiyun [RST_BUS_SCR0] = { 0x2d8, BIT(20) },
1040*4882a593Smuzhiyun };
1041*4882a593Smuzhiyun
1042*4882a593Smuzhiyun static struct ccu_reset_map sun50i_h5_ccu_resets[] = {
1043*4882a593Smuzhiyun [RST_USB_PHY0] = { 0x0cc, BIT(0) },
1044*4882a593Smuzhiyun [RST_USB_PHY1] = { 0x0cc, BIT(1) },
1045*4882a593Smuzhiyun [RST_USB_PHY2] = { 0x0cc, BIT(2) },
1046*4882a593Smuzhiyun [RST_USB_PHY3] = { 0x0cc, BIT(3) },
1047*4882a593Smuzhiyun
1048*4882a593Smuzhiyun [RST_MBUS] = { 0x0fc, BIT(31) },
1049*4882a593Smuzhiyun
1050*4882a593Smuzhiyun [RST_BUS_CE] = { 0x2c0, BIT(5) },
1051*4882a593Smuzhiyun [RST_BUS_DMA] = { 0x2c0, BIT(6) },
1052*4882a593Smuzhiyun [RST_BUS_MMC0] = { 0x2c0, BIT(8) },
1053*4882a593Smuzhiyun [RST_BUS_MMC1] = { 0x2c0, BIT(9) },
1054*4882a593Smuzhiyun [RST_BUS_MMC2] = { 0x2c0, BIT(10) },
1055*4882a593Smuzhiyun [RST_BUS_NAND] = { 0x2c0, BIT(13) },
1056*4882a593Smuzhiyun [RST_BUS_DRAM] = { 0x2c0, BIT(14) },
1057*4882a593Smuzhiyun [RST_BUS_EMAC] = { 0x2c0, BIT(17) },
1058*4882a593Smuzhiyun [RST_BUS_TS] = { 0x2c0, BIT(18) },
1059*4882a593Smuzhiyun [RST_BUS_HSTIMER] = { 0x2c0, BIT(19) },
1060*4882a593Smuzhiyun [RST_BUS_SPI0] = { 0x2c0, BIT(20) },
1061*4882a593Smuzhiyun [RST_BUS_SPI1] = { 0x2c0, BIT(21) },
1062*4882a593Smuzhiyun [RST_BUS_OTG] = { 0x2c0, BIT(23) },
1063*4882a593Smuzhiyun [RST_BUS_EHCI0] = { 0x2c0, BIT(24) },
1064*4882a593Smuzhiyun [RST_BUS_EHCI1] = { 0x2c0, BIT(25) },
1065*4882a593Smuzhiyun [RST_BUS_EHCI2] = { 0x2c0, BIT(26) },
1066*4882a593Smuzhiyun [RST_BUS_EHCI3] = { 0x2c0, BIT(27) },
1067*4882a593Smuzhiyun [RST_BUS_OHCI0] = { 0x2c0, BIT(28) },
1068*4882a593Smuzhiyun [RST_BUS_OHCI1] = { 0x2c0, BIT(29) },
1069*4882a593Smuzhiyun [RST_BUS_OHCI2] = { 0x2c0, BIT(30) },
1070*4882a593Smuzhiyun [RST_BUS_OHCI3] = { 0x2c0, BIT(31) },
1071*4882a593Smuzhiyun
1072*4882a593Smuzhiyun [RST_BUS_VE] = { 0x2c4, BIT(0) },
1073*4882a593Smuzhiyun [RST_BUS_TCON0] = { 0x2c4, BIT(3) },
1074*4882a593Smuzhiyun [RST_BUS_TCON1] = { 0x2c4, BIT(4) },
1075*4882a593Smuzhiyun [RST_BUS_DEINTERLACE] = { 0x2c4, BIT(5) },
1076*4882a593Smuzhiyun [RST_BUS_CSI] = { 0x2c4, BIT(8) },
1077*4882a593Smuzhiyun [RST_BUS_TVE] = { 0x2c4, BIT(9) },
1078*4882a593Smuzhiyun [RST_BUS_HDMI0] = { 0x2c4, BIT(10) },
1079*4882a593Smuzhiyun [RST_BUS_HDMI1] = { 0x2c4, BIT(11) },
1080*4882a593Smuzhiyun [RST_BUS_DE] = { 0x2c4, BIT(12) },
1081*4882a593Smuzhiyun [RST_BUS_GPU] = { 0x2c4, BIT(20) },
1082*4882a593Smuzhiyun [RST_BUS_MSGBOX] = { 0x2c4, BIT(21) },
1083*4882a593Smuzhiyun [RST_BUS_SPINLOCK] = { 0x2c4, BIT(22) },
1084*4882a593Smuzhiyun [RST_BUS_DBG] = { 0x2c4, BIT(31) },
1085*4882a593Smuzhiyun
1086*4882a593Smuzhiyun [RST_BUS_EPHY] = { 0x2c8, BIT(2) },
1087*4882a593Smuzhiyun
1088*4882a593Smuzhiyun [RST_BUS_CODEC] = { 0x2d0, BIT(0) },
1089*4882a593Smuzhiyun [RST_BUS_SPDIF] = { 0x2d0, BIT(1) },
1090*4882a593Smuzhiyun [RST_BUS_THS] = { 0x2d0, BIT(8) },
1091*4882a593Smuzhiyun [RST_BUS_I2S0] = { 0x2d0, BIT(12) },
1092*4882a593Smuzhiyun [RST_BUS_I2S1] = { 0x2d0, BIT(13) },
1093*4882a593Smuzhiyun [RST_BUS_I2S2] = { 0x2d0, BIT(14) },
1094*4882a593Smuzhiyun
1095*4882a593Smuzhiyun [RST_BUS_I2C0] = { 0x2d8, BIT(0) },
1096*4882a593Smuzhiyun [RST_BUS_I2C1] = { 0x2d8, BIT(1) },
1097*4882a593Smuzhiyun [RST_BUS_I2C2] = { 0x2d8, BIT(2) },
1098*4882a593Smuzhiyun [RST_BUS_UART0] = { 0x2d8, BIT(16) },
1099*4882a593Smuzhiyun [RST_BUS_UART1] = { 0x2d8, BIT(17) },
1100*4882a593Smuzhiyun [RST_BUS_UART2] = { 0x2d8, BIT(18) },
1101*4882a593Smuzhiyun [RST_BUS_UART3] = { 0x2d8, BIT(19) },
1102*4882a593Smuzhiyun [RST_BUS_SCR0] = { 0x2d8, BIT(20) },
1103*4882a593Smuzhiyun [RST_BUS_SCR1] = { 0x2d8, BIT(20) },
1104*4882a593Smuzhiyun };
1105*4882a593Smuzhiyun
1106*4882a593Smuzhiyun static const struct sunxi_ccu_desc sun8i_h3_ccu_desc = {
1107*4882a593Smuzhiyun .ccu_clks = sun8i_h3_ccu_clks,
1108*4882a593Smuzhiyun .num_ccu_clks = ARRAY_SIZE(sun8i_h3_ccu_clks),
1109*4882a593Smuzhiyun
1110*4882a593Smuzhiyun .hw_clks = &sun8i_h3_hw_clks,
1111*4882a593Smuzhiyun
1112*4882a593Smuzhiyun .resets = sun8i_h3_ccu_resets,
1113*4882a593Smuzhiyun .num_resets = ARRAY_SIZE(sun8i_h3_ccu_resets),
1114*4882a593Smuzhiyun };
1115*4882a593Smuzhiyun
1116*4882a593Smuzhiyun static const struct sunxi_ccu_desc sun50i_h5_ccu_desc = {
1117*4882a593Smuzhiyun .ccu_clks = sun50i_h5_ccu_clks,
1118*4882a593Smuzhiyun .num_ccu_clks = ARRAY_SIZE(sun50i_h5_ccu_clks),
1119*4882a593Smuzhiyun
1120*4882a593Smuzhiyun .hw_clks = &sun50i_h5_hw_clks,
1121*4882a593Smuzhiyun
1122*4882a593Smuzhiyun .resets = sun50i_h5_ccu_resets,
1123*4882a593Smuzhiyun .num_resets = ARRAY_SIZE(sun50i_h5_ccu_resets),
1124*4882a593Smuzhiyun };
1125*4882a593Smuzhiyun
1126*4882a593Smuzhiyun static struct ccu_pll_nb sun8i_h3_pll_cpu_nb = {
1127*4882a593Smuzhiyun .common = &pll_cpux_clk.common,
1128*4882a593Smuzhiyun /* copy from pll_cpux_clk */
1129*4882a593Smuzhiyun .enable = BIT(31),
1130*4882a593Smuzhiyun .lock = BIT(28),
1131*4882a593Smuzhiyun };
1132*4882a593Smuzhiyun
1133*4882a593Smuzhiyun static struct ccu_mux_nb sun8i_h3_cpu_nb = {
1134*4882a593Smuzhiyun .common = &cpux_clk.common,
1135*4882a593Smuzhiyun .cm = &cpux_clk.mux,
1136*4882a593Smuzhiyun .delay_us = 1, /* > 8 clock cycles at 24 MHz */
1137*4882a593Smuzhiyun .bypass_index = 1, /* index of 24 MHz oscillator */
1138*4882a593Smuzhiyun };
1139*4882a593Smuzhiyun
sunxi_h3_h5_ccu_init(struct device_node * node,const struct sunxi_ccu_desc * desc)1140*4882a593Smuzhiyun static void __init sunxi_h3_h5_ccu_init(struct device_node *node,
1141*4882a593Smuzhiyun const struct sunxi_ccu_desc *desc)
1142*4882a593Smuzhiyun {
1143*4882a593Smuzhiyun void __iomem *reg;
1144*4882a593Smuzhiyun u32 val;
1145*4882a593Smuzhiyun
1146*4882a593Smuzhiyun reg = of_io_request_and_map(node, 0, of_node_full_name(node));
1147*4882a593Smuzhiyun if (IS_ERR(reg)) {
1148*4882a593Smuzhiyun pr_err("%pOF: Could not map the clock registers\n", node);
1149*4882a593Smuzhiyun return;
1150*4882a593Smuzhiyun }
1151*4882a593Smuzhiyun
1152*4882a593Smuzhiyun /* Force the PLL-Audio-1x divider to 1 */
1153*4882a593Smuzhiyun val = readl(reg + SUN8I_H3_PLL_AUDIO_REG);
1154*4882a593Smuzhiyun val &= ~GENMASK(19, 16);
1155*4882a593Smuzhiyun writel(val | (0 << 16), reg + SUN8I_H3_PLL_AUDIO_REG);
1156*4882a593Smuzhiyun
1157*4882a593Smuzhiyun sunxi_ccu_probe(node, reg, desc);
1158*4882a593Smuzhiyun
1159*4882a593Smuzhiyun /* Gate then ungate PLL CPU after any rate changes */
1160*4882a593Smuzhiyun ccu_pll_notifier_register(&sun8i_h3_pll_cpu_nb);
1161*4882a593Smuzhiyun
1162*4882a593Smuzhiyun /* Reparent CPU during PLL CPU rate changes */
1163*4882a593Smuzhiyun ccu_mux_notifier_register(pll_cpux_clk.common.hw.clk,
1164*4882a593Smuzhiyun &sun8i_h3_cpu_nb);
1165*4882a593Smuzhiyun }
1166*4882a593Smuzhiyun
sun8i_h3_ccu_setup(struct device_node * node)1167*4882a593Smuzhiyun static void __init sun8i_h3_ccu_setup(struct device_node *node)
1168*4882a593Smuzhiyun {
1169*4882a593Smuzhiyun sunxi_h3_h5_ccu_init(node, &sun8i_h3_ccu_desc);
1170*4882a593Smuzhiyun }
1171*4882a593Smuzhiyun CLK_OF_DECLARE(sun8i_h3_ccu, "allwinner,sun8i-h3-ccu",
1172*4882a593Smuzhiyun sun8i_h3_ccu_setup);
1173*4882a593Smuzhiyun
sun50i_h5_ccu_setup(struct device_node * node)1174*4882a593Smuzhiyun static void __init sun50i_h5_ccu_setup(struct device_node *node)
1175*4882a593Smuzhiyun {
1176*4882a593Smuzhiyun sunxi_h3_h5_ccu_init(node, &sun50i_h5_ccu_desc);
1177*4882a593Smuzhiyun }
1178*4882a593Smuzhiyun CLK_OF_DECLARE(sun50i_h5_ccu, "allwinner,sun50i-h5-ccu",
1179*4882a593Smuzhiyun sun50i_h5_ccu_setup);
1180