xref: /OK3568_Linux_fs/kernel/drivers/clk/ingenic/jz4780-cgu.c (revision 4882a59341e53eb6f0b4789bf948001014eff981)
1*4882a593Smuzhiyun // SPDX-License-Identifier: GPL-2.0-or-later
2*4882a593Smuzhiyun /*
3*4882a593Smuzhiyun  * Ingenic JZ4780 SoC CGU driver
4*4882a593Smuzhiyun  *
5*4882a593Smuzhiyun  * Copyright (c) 2013-2015 Imagination Technologies
6*4882a593Smuzhiyun  * Author: Paul Burton <paul.burton@mips.com>
7*4882a593Smuzhiyun  * Copyright (c) 2020 周琰杰 (Zhou Yanjie) <zhouyanjie@wanyeetech.com>
8*4882a593Smuzhiyun  */
9*4882a593Smuzhiyun 
10*4882a593Smuzhiyun #include <linux/clk-provider.h>
11*4882a593Smuzhiyun #include <linux/delay.h>
12*4882a593Smuzhiyun #include <linux/io.h>
13*4882a593Smuzhiyun #include <linux/iopoll.h>
14*4882a593Smuzhiyun #include <linux/of.h>
15*4882a593Smuzhiyun 
16*4882a593Smuzhiyun #include <dt-bindings/clock/jz4780-cgu.h>
17*4882a593Smuzhiyun 
18*4882a593Smuzhiyun #include "cgu.h"
19*4882a593Smuzhiyun #include "pm.h"
20*4882a593Smuzhiyun 
21*4882a593Smuzhiyun /* CGU register offsets */
22*4882a593Smuzhiyun #define CGU_REG_CLOCKCONTROL	0x00
23*4882a593Smuzhiyun #define CGU_REG_LCR				0x04
24*4882a593Smuzhiyun #define CGU_REG_APLL			0x10
25*4882a593Smuzhiyun #define CGU_REG_MPLL			0x14
26*4882a593Smuzhiyun #define CGU_REG_EPLL			0x18
27*4882a593Smuzhiyun #define CGU_REG_VPLL			0x1c
28*4882a593Smuzhiyun #define CGU_REG_CLKGR0			0x20
29*4882a593Smuzhiyun #define CGU_REG_OPCR			0x24
30*4882a593Smuzhiyun #define CGU_REG_CLKGR1			0x28
31*4882a593Smuzhiyun #define CGU_REG_DDRCDR			0x2c
32*4882a593Smuzhiyun #define CGU_REG_VPUCDR			0x30
33*4882a593Smuzhiyun #define CGU_REG_USBPCR			0x3c
34*4882a593Smuzhiyun #define CGU_REG_USBRDT			0x40
35*4882a593Smuzhiyun #define CGU_REG_USBVBFIL		0x44
36*4882a593Smuzhiyun #define CGU_REG_USBPCR1			0x48
37*4882a593Smuzhiyun #define CGU_REG_LP0CDR			0x54
38*4882a593Smuzhiyun #define CGU_REG_I2SCDR			0x60
39*4882a593Smuzhiyun #define CGU_REG_LP1CDR			0x64
40*4882a593Smuzhiyun #define CGU_REG_MSC0CDR			0x68
41*4882a593Smuzhiyun #define CGU_REG_UHCCDR			0x6c
42*4882a593Smuzhiyun #define CGU_REG_SSICDR			0x74
43*4882a593Smuzhiyun #define CGU_REG_CIMCDR			0x7c
44*4882a593Smuzhiyun #define CGU_REG_PCMCDR			0x84
45*4882a593Smuzhiyun #define CGU_REG_GPUCDR			0x88
46*4882a593Smuzhiyun #define CGU_REG_HDMICDR			0x8c
47*4882a593Smuzhiyun #define CGU_REG_MSC1CDR			0xa4
48*4882a593Smuzhiyun #define CGU_REG_MSC2CDR			0xa8
49*4882a593Smuzhiyun #define CGU_REG_BCHCDR			0xac
50*4882a593Smuzhiyun #define CGU_REG_CLOCKSTATUS		0xd4
51*4882a593Smuzhiyun 
52*4882a593Smuzhiyun /* bits within the OPCR register */
53*4882a593Smuzhiyun #define OPCR_SPENDN0			BIT(7)
54*4882a593Smuzhiyun #define OPCR_SPENDN1			BIT(6)
55*4882a593Smuzhiyun 
56*4882a593Smuzhiyun /* bits within the USBPCR register */
57*4882a593Smuzhiyun #define USBPCR_USB_MODE			BIT(31)
58*4882a593Smuzhiyun #define USBPCR_IDPULLUP_MASK	(0x3 << 28)
59*4882a593Smuzhiyun #define USBPCR_COMMONONN		BIT(25)
60*4882a593Smuzhiyun #define USBPCR_VBUSVLDEXT		BIT(24)
61*4882a593Smuzhiyun #define USBPCR_VBUSVLDEXTSEL	BIT(23)
62*4882a593Smuzhiyun #define USBPCR_POR				BIT(22)
63*4882a593Smuzhiyun #define USBPCR_SIDDQ			BIT(21)
64*4882a593Smuzhiyun #define USBPCR_OTG_DISABLE		BIT(20)
65*4882a593Smuzhiyun #define USBPCR_COMPDISTUNE_MASK	(0x7 << 17)
66*4882a593Smuzhiyun #define USBPCR_OTGTUNE_MASK		(0x7 << 14)
67*4882a593Smuzhiyun #define USBPCR_SQRXTUNE_MASK	(0x7 << 11)
68*4882a593Smuzhiyun #define USBPCR_TXFSLSTUNE_MASK	(0xf << 7)
69*4882a593Smuzhiyun #define USBPCR_TXPREEMPHTUNE	BIT(6)
70*4882a593Smuzhiyun #define USBPCR_TXHSXVTUNE_MASK	(0x3 << 4)
71*4882a593Smuzhiyun #define USBPCR_TXVREFTUNE_MASK	0xf
72*4882a593Smuzhiyun 
73*4882a593Smuzhiyun /* bits within the USBPCR1 register */
74*4882a593Smuzhiyun #define USBPCR1_REFCLKSEL_SHIFT	26
75*4882a593Smuzhiyun #define USBPCR1_REFCLKSEL_MASK	(0x3 << USBPCR1_REFCLKSEL_SHIFT)
76*4882a593Smuzhiyun #define USBPCR1_REFCLKSEL_CORE	(0x2 << USBPCR1_REFCLKSEL_SHIFT)
77*4882a593Smuzhiyun #define USBPCR1_REFCLKDIV_SHIFT	24
78*4882a593Smuzhiyun #define USBPCR1_REFCLKDIV_MASK	(0x3 << USBPCR1_REFCLKDIV_SHIFT)
79*4882a593Smuzhiyun #define USBPCR1_REFCLKDIV_19_2	(0x3 << USBPCR1_REFCLKDIV_SHIFT)
80*4882a593Smuzhiyun #define USBPCR1_REFCLKDIV_48	(0x2 << USBPCR1_REFCLKDIV_SHIFT)
81*4882a593Smuzhiyun #define USBPCR1_REFCLKDIV_24	(0x1 << USBPCR1_REFCLKDIV_SHIFT)
82*4882a593Smuzhiyun #define USBPCR1_REFCLKDIV_12	(0x0 << USBPCR1_REFCLKDIV_SHIFT)
83*4882a593Smuzhiyun #define USBPCR1_USB_SEL			BIT(28)
84*4882a593Smuzhiyun #define USBPCR1_WORD_IF0		BIT(19)
85*4882a593Smuzhiyun #define USBPCR1_WORD_IF1		BIT(18)
86*4882a593Smuzhiyun 
87*4882a593Smuzhiyun /* bits within the USBRDT register */
88*4882a593Smuzhiyun #define USBRDT_VBFIL_LD_EN		BIT(25)
89*4882a593Smuzhiyun #define USBRDT_USBRDT_MASK		0x7fffff
90*4882a593Smuzhiyun 
91*4882a593Smuzhiyun /* bits within the USBVBFIL register */
92*4882a593Smuzhiyun #define USBVBFIL_IDDIGFIL_SHIFT	16
93*4882a593Smuzhiyun #define USBVBFIL_IDDIGFIL_MASK	(0xffff << USBVBFIL_IDDIGFIL_SHIFT)
94*4882a593Smuzhiyun #define USBVBFIL_USBVBFIL_MASK	(0xffff)
95*4882a593Smuzhiyun 
96*4882a593Smuzhiyun /* bits within the LCR register */
97*4882a593Smuzhiyun #define LCR_PD_SCPU				BIT(31)
98*4882a593Smuzhiyun #define LCR_SCPUS				BIT(27)
99*4882a593Smuzhiyun 
100*4882a593Smuzhiyun /* bits within the CLKGR1 register */
101*4882a593Smuzhiyun #define CLKGR1_CORE1			BIT(15)
102*4882a593Smuzhiyun 
103*4882a593Smuzhiyun static struct ingenic_cgu *cgu;
104*4882a593Smuzhiyun 
jz4780_otg_phy_recalc_rate(struct clk_hw * hw,unsigned long parent_rate)105*4882a593Smuzhiyun static unsigned long jz4780_otg_phy_recalc_rate(struct clk_hw *hw,
106*4882a593Smuzhiyun 						unsigned long parent_rate)
107*4882a593Smuzhiyun {
108*4882a593Smuzhiyun 	u32 usbpcr1;
109*4882a593Smuzhiyun 	unsigned refclk_div;
110*4882a593Smuzhiyun 
111*4882a593Smuzhiyun 	usbpcr1 = readl(cgu->base + CGU_REG_USBPCR1);
112*4882a593Smuzhiyun 	refclk_div = usbpcr1 & USBPCR1_REFCLKDIV_MASK;
113*4882a593Smuzhiyun 
114*4882a593Smuzhiyun 	switch (refclk_div) {
115*4882a593Smuzhiyun 	case USBPCR1_REFCLKDIV_12:
116*4882a593Smuzhiyun 		return 12000000;
117*4882a593Smuzhiyun 
118*4882a593Smuzhiyun 	case USBPCR1_REFCLKDIV_24:
119*4882a593Smuzhiyun 		return 24000000;
120*4882a593Smuzhiyun 
121*4882a593Smuzhiyun 	case USBPCR1_REFCLKDIV_48:
122*4882a593Smuzhiyun 		return 48000000;
123*4882a593Smuzhiyun 
124*4882a593Smuzhiyun 	case USBPCR1_REFCLKDIV_19_2:
125*4882a593Smuzhiyun 		return 19200000;
126*4882a593Smuzhiyun 	}
127*4882a593Smuzhiyun 
128*4882a593Smuzhiyun 	return parent_rate;
129*4882a593Smuzhiyun }
130*4882a593Smuzhiyun 
jz4780_otg_phy_round_rate(struct clk_hw * hw,unsigned long req_rate,unsigned long * parent_rate)131*4882a593Smuzhiyun static long jz4780_otg_phy_round_rate(struct clk_hw *hw, unsigned long req_rate,
132*4882a593Smuzhiyun 				      unsigned long *parent_rate)
133*4882a593Smuzhiyun {
134*4882a593Smuzhiyun 	if (req_rate < 15600000)
135*4882a593Smuzhiyun 		return 12000000;
136*4882a593Smuzhiyun 
137*4882a593Smuzhiyun 	if (req_rate < 21600000)
138*4882a593Smuzhiyun 		return 19200000;
139*4882a593Smuzhiyun 
140*4882a593Smuzhiyun 	if (req_rate < 36000000)
141*4882a593Smuzhiyun 		return 24000000;
142*4882a593Smuzhiyun 
143*4882a593Smuzhiyun 	return 48000000;
144*4882a593Smuzhiyun }
145*4882a593Smuzhiyun 
jz4780_otg_phy_set_rate(struct clk_hw * hw,unsigned long req_rate,unsigned long parent_rate)146*4882a593Smuzhiyun static int jz4780_otg_phy_set_rate(struct clk_hw *hw, unsigned long req_rate,
147*4882a593Smuzhiyun 				   unsigned long parent_rate)
148*4882a593Smuzhiyun {
149*4882a593Smuzhiyun 	unsigned long flags;
150*4882a593Smuzhiyun 	u32 usbpcr1, div_bits;
151*4882a593Smuzhiyun 
152*4882a593Smuzhiyun 	switch (req_rate) {
153*4882a593Smuzhiyun 	case 12000000:
154*4882a593Smuzhiyun 		div_bits = USBPCR1_REFCLKDIV_12;
155*4882a593Smuzhiyun 		break;
156*4882a593Smuzhiyun 
157*4882a593Smuzhiyun 	case 19200000:
158*4882a593Smuzhiyun 		div_bits = USBPCR1_REFCLKDIV_19_2;
159*4882a593Smuzhiyun 		break;
160*4882a593Smuzhiyun 
161*4882a593Smuzhiyun 	case 24000000:
162*4882a593Smuzhiyun 		div_bits = USBPCR1_REFCLKDIV_24;
163*4882a593Smuzhiyun 		break;
164*4882a593Smuzhiyun 
165*4882a593Smuzhiyun 	case 48000000:
166*4882a593Smuzhiyun 		div_bits = USBPCR1_REFCLKDIV_48;
167*4882a593Smuzhiyun 		break;
168*4882a593Smuzhiyun 
169*4882a593Smuzhiyun 	default:
170*4882a593Smuzhiyun 		return -EINVAL;
171*4882a593Smuzhiyun 	}
172*4882a593Smuzhiyun 
173*4882a593Smuzhiyun 	spin_lock_irqsave(&cgu->lock, flags);
174*4882a593Smuzhiyun 
175*4882a593Smuzhiyun 	usbpcr1 = readl(cgu->base + CGU_REG_USBPCR1);
176*4882a593Smuzhiyun 	usbpcr1 &= ~USBPCR1_REFCLKDIV_MASK;
177*4882a593Smuzhiyun 	usbpcr1 |= div_bits;
178*4882a593Smuzhiyun 	writel(usbpcr1, cgu->base + CGU_REG_USBPCR1);
179*4882a593Smuzhiyun 
180*4882a593Smuzhiyun 	spin_unlock_irqrestore(&cgu->lock, flags);
181*4882a593Smuzhiyun 	return 0;
182*4882a593Smuzhiyun }
183*4882a593Smuzhiyun 
jz4780_otg_phy_enable(struct clk_hw * hw)184*4882a593Smuzhiyun static int jz4780_otg_phy_enable(struct clk_hw *hw)
185*4882a593Smuzhiyun {
186*4882a593Smuzhiyun 	void __iomem *reg_opcr		= cgu->base + CGU_REG_OPCR;
187*4882a593Smuzhiyun 	void __iomem *reg_usbpcr	= cgu->base + CGU_REG_USBPCR;
188*4882a593Smuzhiyun 
189*4882a593Smuzhiyun 	writel(readl(reg_opcr) | OPCR_SPENDN0, reg_opcr);
190*4882a593Smuzhiyun 	writel(readl(reg_usbpcr) & ~USBPCR_OTG_DISABLE & ~USBPCR_SIDDQ, reg_usbpcr);
191*4882a593Smuzhiyun 	return 0;
192*4882a593Smuzhiyun }
193*4882a593Smuzhiyun 
jz4780_otg_phy_disable(struct clk_hw * hw)194*4882a593Smuzhiyun static void jz4780_otg_phy_disable(struct clk_hw *hw)
195*4882a593Smuzhiyun {
196*4882a593Smuzhiyun 	void __iomem *reg_opcr		= cgu->base + CGU_REG_OPCR;
197*4882a593Smuzhiyun 	void __iomem *reg_usbpcr	= cgu->base + CGU_REG_USBPCR;
198*4882a593Smuzhiyun 
199*4882a593Smuzhiyun 	writel(readl(reg_opcr) & ~OPCR_SPENDN0, reg_opcr);
200*4882a593Smuzhiyun 	writel(readl(reg_usbpcr) | USBPCR_OTG_DISABLE | USBPCR_SIDDQ, reg_usbpcr);
201*4882a593Smuzhiyun }
202*4882a593Smuzhiyun 
jz4780_otg_phy_is_enabled(struct clk_hw * hw)203*4882a593Smuzhiyun static int jz4780_otg_phy_is_enabled(struct clk_hw *hw)
204*4882a593Smuzhiyun {
205*4882a593Smuzhiyun 	void __iomem *reg_opcr		= cgu->base + CGU_REG_OPCR;
206*4882a593Smuzhiyun 	void __iomem *reg_usbpcr	= cgu->base + CGU_REG_USBPCR;
207*4882a593Smuzhiyun 
208*4882a593Smuzhiyun 	return (readl(reg_opcr) & OPCR_SPENDN0) &&
209*4882a593Smuzhiyun 		!(readl(reg_usbpcr) & USBPCR_SIDDQ) &&
210*4882a593Smuzhiyun 		!(readl(reg_usbpcr) & USBPCR_OTG_DISABLE);
211*4882a593Smuzhiyun }
212*4882a593Smuzhiyun 
213*4882a593Smuzhiyun static const struct clk_ops jz4780_otg_phy_ops = {
214*4882a593Smuzhiyun 	.recalc_rate = jz4780_otg_phy_recalc_rate,
215*4882a593Smuzhiyun 	.round_rate = jz4780_otg_phy_round_rate,
216*4882a593Smuzhiyun 	.set_rate = jz4780_otg_phy_set_rate,
217*4882a593Smuzhiyun 
218*4882a593Smuzhiyun 	.enable		= jz4780_otg_phy_enable,
219*4882a593Smuzhiyun 	.disable	= jz4780_otg_phy_disable,
220*4882a593Smuzhiyun 	.is_enabled	= jz4780_otg_phy_is_enabled,
221*4882a593Smuzhiyun };
222*4882a593Smuzhiyun 
jz4780_core1_enable(struct clk_hw * hw)223*4882a593Smuzhiyun static int jz4780_core1_enable(struct clk_hw *hw)
224*4882a593Smuzhiyun {
225*4882a593Smuzhiyun 	struct ingenic_clk *ingenic_clk = to_ingenic_clk(hw);
226*4882a593Smuzhiyun 	struct ingenic_cgu *cgu = ingenic_clk->cgu;
227*4882a593Smuzhiyun 	const unsigned int timeout = 5000;
228*4882a593Smuzhiyun 	unsigned long flags;
229*4882a593Smuzhiyun 	int retval;
230*4882a593Smuzhiyun 	u32 lcr, clkgr1;
231*4882a593Smuzhiyun 
232*4882a593Smuzhiyun 	spin_lock_irqsave(&cgu->lock, flags);
233*4882a593Smuzhiyun 
234*4882a593Smuzhiyun 	lcr = readl(cgu->base + CGU_REG_LCR);
235*4882a593Smuzhiyun 	lcr &= ~LCR_PD_SCPU;
236*4882a593Smuzhiyun 	writel(lcr, cgu->base + CGU_REG_LCR);
237*4882a593Smuzhiyun 
238*4882a593Smuzhiyun 	clkgr1 = readl(cgu->base + CGU_REG_CLKGR1);
239*4882a593Smuzhiyun 	clkgr1 &= ~CLKGR1_CORE1;
240*4882a593Smuzhiyun 	writel(clkgr1, cgu->base + CGU_REG_CLKGR1);
241*4882a593Smuzhiyun 
242*4882a593Smuzhiyun 	spin_unlock_irqrestore(&cgu->lock, flags);
243*4882a593Smuzhiyun 
244*4882a593Smuzhiyun 	/* wait for the CPU to be powered up */
245*4882a593Smuzhiyun 	retval = readl_poll_timeout(cgu->base + CGU_REG_LCR, lcr,
246*4882a593Smuzhiyun 				 !(lcr & LCR_SCPUS), 10, timeout);
247*4882a593Smuzhiyun 	if (retval == -ETIMEDOUT) {
248*4882a593Smuzhiyun 		pr_err("%s: Wait for power up core1 timeout\n", __func__);
249*4882a593Smuzhiyun 		return retval;
250*4882a593Smuzhiyun 	}
251*4882a593Smuzhiyun 
252*4882a593Smuzhiyun 	return 0;
253*4882a593Smuzhiyun }
254*4882a593Smuzhiyun 
255*4882a593Smuzhiyun static const struct clk_ops jz4780_core1_ops = {
256*4882a593Smuzhiyun 	.enable = jz4780_core1_enable,
257*4882a593Smuzhiyun };
258*4882a593Smuzhiyun 
259*4882a593Smuzhiyun static const s8 pll_od_encoding[16] = {
260*4882a593Smuzhiyun 	0x0, 0x1, 0x2, 0x3, 0x4, 0x5, 0x6, 0x7,
261*4882a593Smuzhiyun 	0x8, 0x9, 0xa, 0xb, 0xc, 0xd, 0xe, 0xf,
262*4882a593Smuzhiyun };
263*4882a593Smuzhiyun 
264*4882a593Smuzhiyun static const struct ingenic_cgu_clk_info jz4780_cgu_clocks[] = {
265*4882a593Smuzhiyun 
266*4882a593Smuzhiyun 	/* External clocks */
267*4882a593Smuzhiyun 
268*4882a593Smuzhiyun 	[JZ4780_CLK_EXCLK] = { "ext", CGU_CLK_EXT },
269*4882a593Smuzhiyun 	[JZ4780_CLK_RTCLK] = { "rtc", CGU_CLK_EXT },
270*4882a593Smuzhiyun 
271*4882a593Smuzhiyun 	/* PLLs */
272*4882a593Smuzhiyun 
273*4882a593Smuzhiyun #define DEF_PLL(name) { \
274*4882a593Smuzhiyun 	.reg = CGU_REG_ ## name, \
275*4882a593Smuzhiyun 	.rate_multiplier = 1, \
276*4882a593Smuzhiyun 	.m_shift = 19, \
277*4882a593Smuzhiyun 	.m_bits = 13, \
278*4882a593Smuzhiyun 	.m_offset = 1, \
279*4882a593Smuzhiyun 	.n_shift = 13, \
280*4882a593Smuzhiyun 	.n_bits = 6, \
281*4882a593Smuzhiyun 	.n_offset = 1, \
282*4882a593Smuzhiyun 	.od_shift = 9, \
283*4882a593Smuzhiyun 	.od_bits = 4, \
284*4882a593Smuzhiyun 	.od_max = 16, \
285*4882a593Smuzhiyun 	.od_encoding = pll_od_encoding, \
286*4882a593Smuzhiyun 	.stable_bit = 6, \
287*4882a593Smuzhiyun 	.bypass_reg = CGU_REG_ ## name, \
288*4882a593Smuzhiyun 	.bypass_bit = 1, \
289*4882a593Smuzhiyun 	.enable_bit = 0, \
290*4882a593Smuzhiyun }
291*4882a593Smuzhiyun 
292*4882a593Smuzhiyun 	[JZ4780_CLK_APLL] = {
293*4882a593Smuzhiyun 		"apll", CGU_CLK_PLL,
294*4882a593Smuzhiyun 		.parents = { JZ4780_CLK_EXCLK, -1, -1, -1 },
295*4882a593Smuzhiyun 		.pll = DEF_PLL(APLL),
296*4882a593Smuzhiyun 	},
297*4882a593Smuzhiyun 
298*4882a593Smuzhiyun 	[JZ4780_CLK_MPLL] = {
299*4882a593Smuzhiyun 		"mpll", CGU_CLK_PLL,
300*4882a593Smuzhiyun 		.parents = { JZ4780_CLK_EXCLK, -1, -1, -1 },
301*4882a593Smuzhiyun 		.pll = DEF_PLL(MPLL),
302*4882a593Smuzhiyun 	},
303*4882a593Smuzhiyun 
304*4882a593Smuzhiyun 	[JZ4780_CLK_EPLL] = {
305*4882a593Smuzhiyun 		"epll", CGU_CLK_PLL,
306*4882a593Smuzhiyun 		.parents = { JZ4780_CLK_EXCLK, -1, -1, -1 },
307*4882a593Smuzhiyun 		.pll = DEF_PLL(EPLL),
308*4882a593Smuzhiyun 	},
309*4882a593Smuzhiyun 
310*4882a593Smuzhiyun 	[JZ4780_CLK_VPLL] = {
311*4882a593Smuzhiyun 		"vpll", CGU_CLK_PLL,
312*4882a593Smuzhiyun 		.parents = { JZ4780_CLK_EXCLK, -1, -1, -1 },
313*4882a593Smuzhiyun 		.pll = DEF_PLL(VPLL),
314*4882a593Smuzhiyun 	},
315*4882a593Smuzhiyun 
316*4882a593Smuzhiyun #undef DEF_PLL
317*4882a593Smuzhiyun 
318*4882a593Smuzhiyun 	/* Custom (SoC-specific) OTG PHY */
319*4882a593Smuzhiyun 
320*4882a593Smuzhiyun 	[JZ4780_CLK_OTGPHY] = {
321*4882a593Smuzhiyun 		"otg_phy", CGU_CLK_CUSTOM,
322*4882a593Smuzhiyun 		.parents = { -1, -1, JZ4780_CLK_EXCLK, -1 },
323*4882a593Smuzhiyun 		.custom = { &jz4780_otg_phy_ops },
324*4882a593Smuzhiyun 	},
325*4882a593Smuzhiyun 
326*4882a593Smuzhiyun 	/* Muxes & dividers */
327*4882a593Smuzhiyun 
328*4882a593Smuzhiyun 	[JZ4780_CLK_SCLKA] = {
329*4882a593Smuzhiyun 		"sclk_a", CGU_CLK_MUX,
330*4882a593Smuzhiyun 		.parents = { -1, JZ4780_CLK_APLL, JZ4780_CLK_EXCLK,
331*4882a593Smuzhiyun 			     JZ4780_CLK_RTCLK },
332*4882a593Smuzhiyun 		.mux = { CGU_REG_CLOCKCONTROL, 30, 2 },
333*4882a593Smuzhiyun 	},
334*4882a593Smuzhiyun 
335*4882a593Smuzhiyun 	[JZ4780_CLK_CPUMUX] = {
336*4882a593Smuzhiyun 		"cpumux", CGU_CLK_MUX,
337*4882a593Smuzhiyun 		.parents = { -1, JZ4780_CLK_SCLKA, JZ4780_CLK_MPLL,
338*4882a593Smuzhiyun 			     JZ4780_CLK_EPLL },
339*4882a593Smuzhiyun 		.mux = { CGU_REG_CLOCKCONTROL, 28, 2 },
340*4882a593Smuzhiyun 	},
341*4882a593Smuzhiyun 
342*4882a593Smuzhiyun 	[JZ4780_CLK_CPU] = {
343*4882a593Smuzhiyun 		"cpu", CGU_CLK_DIV,
344*4882a593Smuzhiyun 		.parents = { JZ4780_CLK_CPUMUX, -1, -1, -1 },
345*4882a593Smuzhiyun 		.div = { CGU_REG_CLOCKCONTROL, 0, 1, 4, 22, -1, -1 },
346*4882a593Smuzhiyun 	},
347*4882a593Smuzhiyun 
348*4882a593Smuzhiyun 	[JZ4780_CLK_L2CACHE] = {
349*4882a593Smuzhiyun 		"l2cache", CGU_CLK_DIV,
350*4882a593Smuzhiyun 		.parents = { JZ4780_CLK_CPUMUX, -1, -1, -1 },
351*4882a593Smuzhiyun 		.div = { CGU_REG_CLOCKCONTROL, 4, 1, 4, -1, -1, -1 },
352*4882a593Smuzhiyun 	},
353*4882a593Smuzhiyun 
354*4882a593Smuzhiyun 	[JZ4780_CLK_AHB0] = {
355*4882a593Smuzhiyun 		"ahb0", CGU_CLK_MUX | CGU_CLK_DIV,
356*4882a593Smuzhiyun 		.parents = { -1, JZ4780_CLK_SCLKA, JZ4780_CLK_MPLL,
357*4882a593Smuzhiyun 			     JZ4780_CLK_EPLL },
358*4882a593Smuzhiyun 		.mux = { CGU_REG_CLOCKCONTROL, 26, 2 },
359*4882a593Smuzhiyun 		.div = { CGU_REG_CLOCKCONTROL, 8, 1, 4, 21, -1, -1 },
360*4882a593Smuzhiyun 	},
361*4882a593Smuzhiyun 
362*4882a593Smuzhiyun 	[JZ4780_CLK_AHB2PMUX] = {
363*4882a593Smuzhiyun 		"ahb2_apb_mux", CGU_CLK_MUX,
364*4882a593Smuzhiyun 		.parents = { -1, JZ4780_CLK_SCLKA, JZ4780_CLK_MPLL,
365*4882a593Smuzhiyun 			     JZ4780_CLK_RTCLK },
366*4882a593Smuzhiyun 		.mux = { CGU_REG_CLOCKCONTROL, 24, 2 },
367*4882a593Smuzhiyun 	},
368*4882a593Smuzhiyun 
369*4882a593Smuzhiyun 	[JZ4780_CLK_AHB2] = {
370*4882a593Smuzhiyun 		"ahb2", CGU_CLK_DIV,
371*4882a593Smuzhiyun 		.parents = { JZ4780_CLK_AHB2PMUX, -1, -1, -1 },
372*4882a593Smuzhiyun 		.div = { CGU_REG_CLOCKCONTROL, 12, 1, 4, 20, -1, -1 },
373*4882a593Smuzhiyun 	},
374*4882a593Smuzhiyun 
375*4882a593Smuzhiyun 	[JZ4780_CLK_PCLK] = {
376*4882a593Smuzhiyun 		"pclk", CGU_CLK_DIV,
377*4882a593Smuzhiyun 		.parents = { JZ4780_CLK_AHB2PMUX, -1, -1, -1 },
378*4882a593Smuzhiyun 		.div = { CGU_REG_CLOCKCONTROL, 16, 1, 4, 20, -1, -1 },
379*4882a593Smuzhiyun 	},
380*4882a593Smuzhiyun 
381*4882a593Smuzhiyun 	[JZ4780_CLK_DDR] = {
382*4882a593Smuzhiyun 		"ddr", CGU_CLK_MUX | CGU_CLK_DIV,
383*4882a593Smuzhiyun 		.parents = { -1, JZ4780_CLK_SCLKA, JZ4780_CLK_MPLL, -1 },
384*4882a593Smuzhiyun 		.mux = { CGU_REG_DDRCDR, 30, 2 },
385*4882a593Smuzhiyun 		.div = { CGU_REG_DDRCDR, 0, 1, 4, 29, 28, 27 },
386*4882a593Smuzhiyun 	},
387*4882a593Smuzhiyun 
388*4882a593Smuzhiyun 	[JZ4780_CLK_VPU] = {
389*4882a593Smuzhiyun 		"vpu", CGU_CLK_MUX | CGU_CLK_DIV | CGU_CLK_GATE,
390*4882a593Smuzhiyun 		.parents = { JZ4780_CLK_SCLKA, JZ4780_CLK_MPLL,
391*4882a593Smuzhiyun 			     JZ4780_CLK_EPLL, -1 },
392*4882a593Smuzhiyun 		.mux = { CGU_REG_VPUCDR, 30, 2 },
393*4882a593Smuzhiyun 		.div = { CGU_REG_VPUCDR, 0, 1, 4, 29, 28, 27 },
394*4882a593Smuzhiyun 		.gate = { CGU_REG_CLKGR1, 2 },
395*4882a593Smuzhiyun 	},
396*4882a593Smuzhiyun 
397*4882a593Smuzhiyun 	[JZ4780_CLK_I2SPLL] = {
398*4882a593Smuzhiyun 		"i2s_pll", CGU_CLK_MUX | CGU_CLK_DIV,
399*4882a593Smuzhiyun 		.parents = { JZ4780_CLK_SCLKA, JZ4780_CLK_EPLL, -1, -1 },
400*4882a593Smuzhiyun 		.mux = { CGU_REG_I2SCDR, 30, 1 },
401*4882a593Smuzhiyun 		.div = { CGU_REG_I2SCDR, 0, 1, 8, 29, 28, 27 },
402*4882a593Smuzhiyun 	},
403*4882a593Smuzhiyun 
404*4882a593Smuzhiyun 	[JZ4780_CLK_I2S] = {
405*4882a593Smuzhiyun 		"i2s", CGU_CLK_MUX,
406*4882a593Smuzhiyun 		.parents = { JZ4780_CLK_EXCLK, JZ4780_CLK_I2SPLL, -1, -1 },
407*4882a593Smuzhiyun 		.mux = { CGU_REG_I2SCDR, 31, 1 },
408*4882a593Smuzhiyun 	},
409*4882a593Smuzhiyun 
410*4882a593Smuzhiyun 	[JZ4780_CLK_LCD0PIXCLK] = {
411*4882a593Smuzhiyun 		"lcd0pixclk", CGU_CLK_MUX | CGU_CLK_DIV,
412*4882a593Smuzhiyun 		.parents = { JZ4780_CLK_SCLKA, JZ4780_CLK_MPLL,
413*4882a593Smuzhiyun 			     JZ4780_CLK_VPLL, -1 },
414*4882a593Smuzhiyun 		.mux = { CGU_REG_LP0CDR, 30, 2 },
415*4882a593Smuzhiyun 		.div = { CGU_REG_LP0CDR, 0, 1, 8, 28, 27, 26 },
416*4882a593Smuzhiyun 	},
417*4882a593Smuzhiyun 
418*4882a593Smuzhiyun 	[JZ4780_CLK_LCD1PIXCLK] = {
419*4882a593Smuzhiyun 		"lcd1pixclk", CGU_CLK_MUX | CGU_CLK_DIV,
420*4882a593Smuzhiyun 		.parents = { JZ4780_CLK_SCLKA, JZ4780_CLK_MPLL,
421*4882a593Smuzhiyun 			     JZ4780_CLK_VPLL, -1 },
422*4882a593Smuzhiyun 		.mux = { CGU_REG_LP1CDR, 30, 2 },
423*4882a593Smuzhiyun 		.div = { CGU_REG_LP1CDR, 0, 1, 8, 28, 27, 26 },
424*4882a593Smuzhiyun 	},
425*4882a593Smuzhiyun 
426*4882a593Smuzhiyun 	[JZ4780_CLK_MSCMUX] = {
427*4882a593Smuzhiyun 		"msc_mux", CGU_CLK_MUX,
428*4882a593Smuzhiyun 		.parents = { -1, JZ4780_CLK_SCLKA, JZ4780_CLK_MPLL, -1 },
429*4882a593Smuzhiyun 		.mux = { CGU_REG_MSC0CDR, 30, 2 },
430*4882a593Smuzhiyun 	},
431*4882a593Smuzhiyun 
432*4882a593Smuzhiyun 	[JZ4780_CLK_MSC0] = {
433*4882a593Smuzhiyun 		"msc0", CGU_CLK_DIV | CGU_CLK_GATE,
434*4882a593Smuzhiyun 		.parents = { JZ4780_CLK_MSCMUX, -1, -1, -1 },
435*4882a593Smuzhiyun 		.div = { CGU_REG_MSC0CDR, 0, 2, 8, 29, 28, 27 },
436*4882a593Smuzhiyun 		.gate = { CGU_REG_CLKGR0, 3 },
437*4882a593Smuzhiyun 	},
438*4882a593Smuzhiyun 
439*4882a593Smuzhiyun 	[JZ4780_CLK_MSC1] = {
440*4882a593Smuzhiyun 		"msc1", CGU_CLK_DIV | CGU_CLK_GATE,
441*4882a593Smuzhiyun 		.parents = { JZ4780_CLK_MSCMUX, -1, -1, -1 },
442*4882a593Smuzhiyun 		.div = { CGU_REG_MSC1CDR, 0, 2, 8, 29, 28, 27 },
443*4882a593Smuzhiyun 		.gate = { CGU_REG_CLKGR0, 11 },
444*4882a593Smuzhiyun 	},
445*4882a593Smuzhiyun 
446*4882a593Smuzhiyun 	[JZ4780_CLK_MSC2] = {
447*4882a593Smuzhiyun 		"msc2", CGU_CLK_DIV | CGU_CLK_GATE,
448*4882a593Smuzhiyun 		.parents = { JZ4780_CLK_MSCMUX, -1, -1, -1 },
449*4882a593Smuzhiyun 		.div = { CGU_REG_MSC2CDR, 0, 2, 8, 29, 28, 27 },
450*4882a593Smuzhiyun 		.gate = { CGU_REG_CLKGR0, 12 },
451*4882a593Smuzhiyun 	},
452*4882a593Smuzhiyun 
453*4882a593Smuzhiyun 	[JZ4780_CLK_UHC] = {
454*4882a593Smuzhiyun 		"uhc", CGU_CLK_MUX | CGU_CLK_DIV | CGU_CLK_GATE,
455*4882a593Smuzhiyun 		.parents = { JZ4780_CLK_SCLKA, JZ4780_CLK_MPLL,
456*4882a593Smuzhiyun 			     JZ4780_CLK_EPLL, JZ4780_CLK_OTGPHY },
457*4882a593Smuzhiyun 		.mux = { CGU_REG_UHCCDR, 30, 2 },
458*4882a593Smuzhiyun 		.div = { CGU_REG_UHCCDR, 0, 1, 8, 29, 28, 27 },
459*4882a593Smuzhiyun 		.gate = { CGU_REG_CLKGR0, 24 },
460*4882a593Smuzhiyun 	},
461*4882a593Smuzhiyun 
462*4882a593Smuzhiyun 	[JZ4780_CLK_SSIPLL] = {
463*4882a593Smuzhiyun 		"ssi_pll", CGU_CLK_MUX | CGU_CLK_DIV,
464*4882a593Smuzhiyun 		.parents = { JZ4780_CLK_SCLKA, JZ4780_CLK_MPLL, -1, -1 },
465*4882a593Smuzhiyun 		.mux = { CGU_REG_SSICDR, 30, 1 },
466*4882a593Smuzhiyun 		.div = { CGU_REG_SSICDR, 0, 1, 8, 29, 28, 27 },
467*4882a593Smuzhiyun 	},
468*4882a593Smuzhiyun 
469*4882a593Smuzhiyun 	[JZ4780_CLK_SSI] = {
470*4882a593Smuzhiyun 		"ssi", CGU_CLK_MUX,
471*4882a593Smuzhiyun 		.parents = { JZ4780_CLK_EXCLK, JZ4780_CLK_SSIPLL, -1, -1 },
472*4882a593Smuzhiyun 		.mux = { CGU_REG_SSICDR, 31, 1 },
473*4882a593Smuzhiyun 	},
474*4882a593Smuzhiyun 
475*4882a593Smuzhiyun 	[JZ4780_CLK_CIMMCLK] = {
476*4882a593Smuzhiyun 		"cim_mclk", CGU_CLK_MUX | CGU_CLK_DIV,
477*4882a593Smuzhiyun 		.parents = { JZ4780_CLK_SCLKA, JZ4780_CLK_MPLL, -1, -1 },
478*4882a593Smuzhiyun 		.mux = { CGU_REG_CIMCDR, 31, 1 },
479*4882a593Smuzhiyun 		.div = { CGU_REG_CIMCDR, 0, 1, 8, 30, 29, 28 },
480*4882a593Smuzhiyun 	},
481*4882a593Smuzhiyun 
482*4882a593Smuzhiyun 	[JZ4780_CLK_PCMPLL] = {
483*4882a593Smuzhiyun 		"pcm_pll", CGU_CLK_MUX | CGU_CLK_DIV,
484*4882a593Smuzhiyun 		.parents = { JZ4780_CLK_SCLKA, JZ4780_CLK_MPLL,
485*4882a593Smuzhiyun 			     JZ4780_CLK_EPLL, JZ4780_CLK_VPLL },
486*4882a593Smuzhiyun 		.mux = { CGU_REG_PCMCDR, 29, 2 },
487*4882a593Smuzhiyun 		.div = { CGU_REG_PCMCDR, 0, 1, 8, 28, 27, 26 },
488*4882a593Smuzhiyun 	},
489*4882a593Smuzhiyun 
490*4882a593Smuzhiyun 	[JZ4780_CLK_PCM] = {
491*4882a593Smuzhiyun 		"pcm", CGU_CLK_MUX | CGU_CLK_GATE,
492*4882a593Smuzhiyun 		.parents = { JZ4780_CLK_EXCLK, JZ4780_CLK_PCMPLL, -1, -1 },
493*4882a593Smuzhiyun 		.mux = { CGU_REG_PCMCDR, 31, 1 },
494*4882a593Smuzhiyun 		.gate = { CGU_REG_CLKGR1, 3 },
495*4882a593Smuzhiyun 	},
496*4882a593Smuzhiyun 
497*4882a593Smuzhiyun 	[JZ4780_CLK_GPU] = {
498*4882a593Smuzhiyun 		"gpu", CGU_CLK_MUX | CGU_CLK_DIV | CGU_CLK_GATE,
499*4882a593Smuzhiyun 		.parents = { -1, JZ4780_CLK_SCLKA, JZ4780_CLK_MPLL,
500*4882a593Smuzhiyun 			     JZ4780_CLK_EPLL },
501*4882a593Smuzhiyun 		.mux = { CGU_REG_GPUCDR, 30, 2 },
502*4882a593Smuzhiyun 		.div = { CGU_REG_GPUCDR, 0, 1, 4, 29, 28, 27 },
503*4882a593Smuzhiyun 		.gate = { CGU_REG_CLKGR1, 4 },
504*4882a593Smuzhiyun 	},
505*4882a593Smuzhiyun 
506*4882a593Smuzhiyun 	[JZ4780_CLK_HDMI] = {
507*4882a593Smuzhiyun 		"hdmi", CGU_CLK_MUX | CGU_CLK_DIV | CGU_CLK_GATE,
508*4882a593Smuzhiyun 		.parents = { JZ4780_CLK_SCLKA, JZ4780_CLK_MPLL,
509*4882a593Smuzhiyun 			     JZ4780_CLK_VPLL, -1 },
510*4882a593Smuzhiyun 		.mux = { CGU_REG_HDMICDR, 30, 2 },
511*4882a593Smuzhiyun 		.div = { CGU_REG_HDMICDR, 0, 1, 8, 29, 28, 26 },
512*4882a593Smuzhiyun 		.gate = { CGU_REG_CLKGR1, 9 },
513*4882a593Smuzhiyun 	},
514*4882a593Smuzhiyun 
515*4882a593Smuzhiyun 	[JZ4780_CLK_BCH] = {
516*4882a593Smuzhiyun 		"bch", CGU_CLK_MUX | CGU_CLK_DIV | CGU_CLK_GATE,
517*4882a593Smuzhiyun 		.parents = { -1, JZ4780_CLK_SCLKA, JZ4780_CLK_MPLL,
518*4882a593Smuzhiyun 			     JZ4780_CLK_EPLL },
519*4882a593Smuzhiyun 		.mux = { CGU_REG_BCHCDR, 30, 2 },
520*4882a593Smuzhiyun 		.div = { CGU_REG_BCHCDR, 0, 1, 4, 29, 28, 27 },
521*4882a593Smuzhiyun 		.gate = { CGU_REG_CLKGR0, 1 },
522*4882a593Smuzhiyun 	},
523*4882a593Smuzhiyun 
524*4882a593Smuzhiyun 	[JZ4780_CLK_EXCLK_DIV512] = {
525*4882a593Smuzhiyun 		"exclk_div512", CGU_CLK_FIXDIV,
526*4882a593Smuzhiyun 		.parents = { JZ4780_CLK_EXCLK },
527*4882a593Smuzhiyun 		.fixdiv = { 512 },
528*4882a593Smuzhiyun 	},
529*4882a593Smuzhiyun 
530*4882a593Smuzhiyun 	[JZ4780_CLK_RTC] = {
531*4882a593Smuzhiyun 		"rtc_ercs", CGU_CLK_MUX | CGU_CLK_GATE,
532*4882a593Smuzhiyun 		.parents = { JZ4780_CLK_EXCLK_DIV512, JZ4780_CLK_RTCLK },
533*4882a593Smuzhiyun 		.mux = { CGU_REG_OPCR, 2, 1},
534*4882a593Smuzhiyun 	},
535*4882a593Smuzhiyun 
536*4882a593Smuzhiyun 	/* Gate-only clocks */
537*4882a593Smuzhiyun 
538*4882a593Smuzhiyun 	[JZ4780_CLK_NEMC] = {
539*4882a593Smuzhiyun 		"nemc", CGU_CLK_GATE,
540*4882a593Smuzhiyun 		.parents = { JZ4780_CLK_AHB2, -1, -1, -1 },
541*4882a593Smuzhiyun 		.gate = { CGU_REG_CLKGR0, 0 },
542*4882a593Smuzhiyun 	},
543*4882a593Smuzhiyun 
544*4882a593Smuzhiyun 	[JZ4780_CLK_OTG0] = {
545*4882a593Smuzhiyun 		"otg0", CGU_CLK_GATE,
546*4882a593Smuzhiyun 		.parents = { JZ4780_CLK_EXCLK, -1, -1, -1 },
547*4882a593Smuzhiyun 		.gate = { CGU_REG_CLKGR0, 2 },
548*4882a593Smuzhiyun 	},
549*4882a593Smuzhiyun 
550*4882a593Smuzhiyun 	[JZ4780_CLK_SSI0] = {
551*4882a593Smuzhiyun 		"ssi0", CGU_CLK_GATE,
552*4882a593Smuzhiyun 		.parents = { JZ4780_CLK_SSI, -1, -1, -1 },
553*4882a593Smuzhiyun 		.gate = { CGU_REG_CLKGR0, 4 },
554*4882a593Smuzhiyun 	},
555*4882a593Smuzhiyun 
556*4882a593Smuzhiyun 	[JZ4780_CLK_SMB0] = {
557*4882a593Smuzhiyun 		"smb0", CGU_CLK_GATE,
558*4882a593Smuzhiyun 		.parents = { JZ4780_CLK_PCLK, -1, -1, -1 },
559*4882a593Smuzhiyun 		.gate = { CGU_REG_CLKGR0, 5 },
560*4882a593Smuzhiyun 	},
561*4882a593Smuzhiyun 
562*4882a593Smuzhiyun 	[JZ4780_CLK_SMB1] = {
563*4882a593Smuzhiyun 		"smb1", CGU_CLK_GATE,
564*4882a593Smuzhiyun 		.parents = { JZ4780_CLK_PCLK, -1, -1, -1 },
565*4882a593Smuzhiyun 		.gate = { CGU_REG_CLKGR0, 6 },
566*4882a593Smuzhiyun 	},
567*4882a593Smuzhiyun 
568*4882a593Smuzhiyun 	[JZ4780_CLK_SCC] = {
569*4882a593Smuzhiyun 		"scc", CGU_CLK_GATE,
570*4882a593Smuzhiyun 		.parents = { JZ4780_CLK_EXCLK, -1, -1, -1 },
571*4882a593Smuzhiyun 		.gate = { CGU_REG_CLKGR0, 7 },
572*4882a593Smuzhiyun 	},
573*4882a593Smuzhiyun 
574*4882a593Smuzhiyun 	[JZ4780_CLK_AIC] = {
575*4882a593Smuzhiyun 		"aic", CGU_CLK_GATE,
576*4882a593Smuzhiyun 		.parents = { JZ4780_CLK_EXCLK, -1, -1, -1 },
577*4882a593Smuzhiyun 		.gate = { CGU_REG_CLKGR0, 8 },
578*4882a593Smuzhiyun 	},
579*4882a593Smuzhiyun 
580*4882a593Smuzhiyun 	[JZ4780_CLK_TSSI0] = {
581*4882a593Smuzhiyun 		"tssi0", CGU_CLK_GATE,
582*4882a593Smuzhiyun 		.parents = { JZ4780_CLK_EXCLK, -1, -1, -1 },
583*4882a593Smuzhiyun 		.gate = { CGU_REG_CLKGR0, 9 },
584*4882a593Smuzhiyun 	},
585*4882a593Smuzhiyun 
586*4882a593Smuzhiyun 	[JZ4780_CLK_OWI] = {
587*4882a593Smuzhiyun 		"owi", CGU_CLK_GATE,
588*4882a593Smuzhiyun 		.parents = { JZ4780_CLK_EXCLK, -1, -1, -1 },
589*4882a593Smuzhiyun 		.gate = { CGU_REG_CLKGR0, 10 },
590*4882a593Smuzhiyun 	},
591*4882a593Smuzhiyun 
592*4882a593Smuzhiyun 	[JZ4780_CLK_KBC] = {
593*4882a593Smuzhiyun 		"kbc", CGU_CLK_GATE,
594*4882a593Smuzhiyun 		.parents = { JZ4780_CLK_EXCLK, -1, -1, -1 },
595*4882a593Smuzhiyun 		.gate = { CGU_REG_CLKGR0, 13 },
596*4882a593Smuzhiyun 	},
597*4882a593Smuzhiyun 
598*4882a593Smuzhiyun 	[JZ4780_CLK_SADC] = {
599*4882a593Smuzhiyun 		"sadc", CGU_CLK_GATE,
600*4882a593Smuzhiyun 		.parents = { JZ4780_CLK_EXCLK, -1, -1, -1 },
601*4882a593Smuzhiyun 		.gate = { CGU_REG_CLKGR0, 14 },
602*4882a593Smuzhiyun 	},
603*4882a593Smuzhiyun 
604*4882a593Smuzhiyun 	[JZ4780_CLK_UART0] = {
605*4882a593Smuzhiyun 		"uart0", CGU_CLK_GATE,
606*4882a593Smuzhiyun 		.parents = { JZ4780_CLK_EXCLK, -1, -1, -1 },
607*4882a593Smuzhiyun 		.gate = { CGU_REG_CLKGR0, 15 },
608*4882a593Smuzhiyun 	},
609*4882a593Smuzhiyun 
610*4882a593Smuzhiyun 	[JZ4780_CLK_UART1] = {
611*4882a593Smuzhiyun 		"uart1", CGU_CLK_GATE,
612*4882a593Smuzhiyun 		.parents = { JZ4780_CLK_EXCLK, -1, -1, -1 },
613*4882a593Smuzhiyun 		.gate = { CGU_REG_CLKGR0, 16 },
614*4882a593Smuzhiyun 	},
615*4882a593Smuzhiyun 
616*4882a593Smuzhiyun 	[JZ4780_CLK_UART2] = {
617*4882a593Smuzhiyun 		"uart2", CGU_CLK_GATE,
618*4882a593Smuzhiyun 		.parents = { JZ4780_CLK_EXCLK, -1, -1, -1 },
619*4882a593Smuzhiyun 		.gate = { CGU_REG_CLKGR0, 17 },
620*4882a593Smuzhiyun 	},
621*4882a593Smuzhiyun 
622*4882a593Smuzhiyun 	[JZ4780_CLK_UART3] = {
623*4882a593Smuzhiyun 		"uart3", CGU_CLK_GATE,
624*4882a593Smuzhiyun 		.parents = { JZ4780_CLK_EXCLK, -1, -1, -1 },
625*4882a593Smuzhiyun 		.gate = { CGU_REG_CLKGR0, 18 },
626*4882a593Smuzhiyun 	},
627*4882a593Smuzhiyun 
628*4882a593Smuzhiyun 	[JZ4780_CLK_SSI1] = {
629*4882a593Smuzhiyun 		"ssi1", CGU_CLK_GATE,
630*4882a593Smuzhiyun 		.parents = { JZ4780_CLK_SSI, -1, -1, -1 },
631*4882a593Smuzhiyun 		.gate = { CGU_REG_CLKGR0, 19 },
632*4882a593Smuzhiyun 	},
633*4882a593Smuzhiyun 
634*4882a593Smuzhiyun 	[JZ4780_CLK_SSI2] = {
635*4882a593Smuzhiyun 		"ssi2", CGU_CLK_GATE,
636*4882a593Smuzhiyun 		.parents = { JZ4780_CLK_SSI, -1, -1, -1 },
637*4882a593Smuzhiyun 		.gate = { CGU_REG_CLKGR0, 20 },
638*4882a593Smuzhiyun 	},
639*4882a593Smuzhiyun 
640*4882a593Smuzhiyun 	[JZ4780_CLK_PDMA] = {
641*4882a593Smuzhiyun 		"pdma", CGU_CLK_GATE,
642*4882a593Smuzhiyun 		.parents = { JZ4780_CLK_EXCLK, -1, -1, -1 },
643*4882a593Smuzhiyun 		.gate = { CGU_REG_CLKGR0, 21 },
644*4882a593Smuzhiyun 	},
645*4882a593Smuzhiyun 
646*4882a593Smuzhiyun 	[JZ4780_CLK_GPS] = {
647*4882a593Smuzhiyun 		"gps", CGU_CLK_GATE,
648*4882a593Smuzhiyun 		.parents = { JZ4780_CLK_EXCLK, -1, -1, -1 },
649*4882a593Smuzhiyun 		.gate = { CGU_REG_CLKGR0, 22 },
650*4882a593Smuzhiyun 	},
651*4882a593Smuzhiyun 
652*4882a593Smuzhiyun 	[JZ4780_CLK_MAC] = {
653*4882a593Smuzhiyun 		"mac", CGU_CLK_GATE,
654*4882a593Smuzhiyun 		.parents = { JZ4780_CLK_EXCLK, -1, -1, -1 },
655*4882a593Smuzhiyun 		.gate = { CGU_REG_CLKGR0, 23 },
656*4882a593Smuzhiyun 	},
657*4882a593Smuzhiyun 
658*4882a593Smuzhiyun 	[JZ4780_CLK_SMB2] = {
659*4882a593Smuzhiyun 		"smb2", CGU_CLK_GATE,
660*4882a593Smuzhiyun 		.parents = { JZ4780_CLK_PCLK, -1, -1, -1 },
661*4882a593Smuzhiyun 		.gate = { CGU_REG_CLKGR0, 24 },
662*4882a593Smuzhiyun 	},
663*4882a593Smuzhiyun 
664*4882a593Smuzhiyun 	[JZ4780_CLK_CIM] = {
665*4882a593Smuzhiyun 		"cim", CGU_CLK_GATE,
666*4882a593Smuzhiyun 		.parents = { JZ4780_CLK_EXCLK, -1, -1, -1 },
667*4882a593Smuzhiyun 		.gate = { CGU_REG_CLKGR0, 26 },
668*4882a593Smuzhiyun 	},
669*4882a593Smuzhiyun 
670*4882a593Smuzhiyun 	[JZ4780_CLK_LCD] = {
671*4882a593Smuzhiyun 		"lcd", CGU_CLK_GATE,
672*4882a593Smuzhiyun 		.parents = { JZ4780_CLK_EXCLK, -1, -1, -1 },
673*4882a593Smuzhiyun 		.gate = { CGU_REG_CLKGR0, 28 },
674*4882a593Smuzhiyun 	},
675*4882a593Smuzhiyun 
676*4882a593Smuzhiyun 	[JZ4780_CLK_TVE] = {
677*4882a593Smuzhiyun 		"tve", CGU_CLK_GATE,
678*4882a593Smuzhiyun 		.parents = { JZ4780_CLK_LCD, -1, -1, -1 },
679*4882a593Smuzhiyun 		.gate = { CGU_REG_CLKGR0, 27 },
680*4882a593Smuzhiyun 	},
681*4882a593Smuzhiyun 
682*4882a593Smuzhiyun 	[JZ4780_CLK_IPU] = {
683*4882a593Smuzhiyun 		"ipu", CGU_CLK_GATE,
684*4882a593Smuzhiyun 		.parents = { JZ4780_CLK_EXCLK, -1, -1, -1 },
685*4882a593Smuzhiyun 		.gate = { CGU_REG_CLKGR0, 29 },
686*4882a593Smuzhiyun 	},
687*4882a593Smuzhiyun 
688*4882a593Smuzhiyun 	[JZ4780_CLK_DDR0] = {
689*4882a593Smuzhiyun 		"ddr0", CGU_CLK_GATE,
690*4882a593Smuzhiyun 		.parents = { JZ4780_CLK_DDR, -1, -1, -1 },
691*4882a593Smuzhiyun 		.gate = { CGU_REG_CLKGR0, 30 },
692*4882a593Smuzhiyun 	},
693*4882a593Smuzhiyun 
694*4882a593Smuzhiyun 	[JZ4780_CLK_DDR1] = {
695*4882a593Smuzhiyun 		"ddr1", CGU_CLK_GATE,
696*4882a593Smuzhiyun 		.parents = { JZ4780_CLK_DDR, -1, -1, -1 },
697*4882a593Smuzhiyun 		.gate = { CGU_REG_CLKGR0, 31 },
698*4882a593Smuzhiyun 	},
699*4882a593Smuzhiyun 
700*4882a593Smuzhiyun 	[JZ4780_CLK_SMB3] = {
701*4882a593Smuzhiyun 		"smb3", CGU_CLK_GATE,
702*4882a593Smuzhiyun 		.parents = { JZ4780_CLK_PCLK, -1, -1, -1 },
703*4882a593Smuzhiyun 		.gate = { CGU_REG_CLKGR1, 0 },
704*4882a593Smuzhiyun 	},
705*4882a593Smuzhiyun 
706*4882a593Smuzhiyun 	[JZ4780_CLK_TSSI1] = {
707*4882a593Smuzhiyun 		"tssi1", CGU_CLK_GATE,
708*4882a593Smuzhiyun 		.parents = { JZ4780_CLK_EXCLK, -1, -1, -1 },
709*4882a593Smuzhiyun 		.gate = { CGU_REG_CLKGR1, 1 },
710*4882a593Smuzhiyun 	},
711*4882a593Smuzhiyun 
712*4882a593Smuzhiyun 	[JZ4780_CLK_COMPRESS] = {
713*4882a593Smuzhiyun 		"compress", CGU_CLK_GATE,
714*4882a593Smuzhiyun 		.parents = { JZ4780_CLK_EXCLK, -1, -1, -1 },
715*4882a593Smuzhiyun 		.gate = { CGU_REG_CLKGR1, 5 },
716*4882a593Smuzhiyun 	},
717*4882a593Smuzhiyun 
718*4882a593Smuzhiyun 	[JZ4780_CLK_AIC1] = {
719*4882a593Smuzhiyun 		"aic1", CGU_CLK_GATE,
720*4882a593Smuzhiyun 		.parents = { JZ4780_CLK_EXCLK, -1, -1, -1 },
721*4882a593Smuzhiyun 		.gate = { CGU_REG_CLKGR1, 6 },
722*4882a593Smuzhiyun 	},
723*4882a593Smuzhiyun 
724*4882a593Smuzhiyun 	[JZ4780_CLK_GPVLC] = {
725*4882a593Smuzhiyun 		"gpvlc", CGU_CLK_GATE,
726*4882a593Smuzhiyun 		.parents = { JZ4780_CLK_EXCLK, -1, -1, -1 },
727*4882a593Smuzhiyun 		.gate = { CGU_REG_CLKGR1, 7 },
728*4882a593Smuzhiyun 	},
729*4882a593Smuzhiyun 
730*4882a593Smuzhiyun 	[JZ4780_CLK_OTG1] = {
731*4882a593Smuzhiyun 		"otg1", CGU_CLK_GATE,
732*4882a593Smuzhiyun 		.parents = { JZ4780_CLK_EXCLK, -1, -1, -1 },
733*4882a593Smuzhiyun 		.gate = { CGU_REG_CLKGR1, 8 },
734*4882a593Smuzhiyun 	},
735*4882a593Smuzhiyun 
736*4882a593Smuzhiyun 	[JZ4780_CLK_UART4] = {
737*4882a593Smuzhiyun 		"uart4", CGU_CLK_GATE,
738*4882a593Smuzhiyun 		.parents = { JZ4780_CLK_EXCLK, -1, -1, -1 },
739*4882a593Smuzhiyun 		.gate = { CGU_REG_CLKGR1, 10 },
740*4882a593Smuzhiyun 	},
741*4882a593Smuzhiyun 
742*4882a593Smuzhiyun 	[JZ4780_CLK_AHBMON] = {
743*4882a593Smuzhiyun 		"ahb_mon", CGU_CLK_GATE,
744*4882a593Smuzhiyun 		.parents = { JZ4780_CLK_EXCLK, -1, -1, -1 },
745*4882a593Smuzhiyun 		.gate = { CGU_REG_CLKGR1, 11 },
746*4882a593Smuzhiyun 	},
747*4882a593Smuzhiyun 
748*4882a593Smuzhiyun 	[JZ4780_CLK_SMB4] = {
749*4882a593Smuzhiyun 		"smb4", CGU_CLK_GATE,
750*4882a593Smuzhiyun 		.parents = { JZ4780_CLK_PCLK, -1, -1, -1 },
751*4882a593Smuzhiyun 		.gate = { CGU_REG_CLKGR1, 12 },
752*4882a593Smuzhiyun 	},
753*4882a593Smuzhiyun 
754*4882a593Smuzhiyun 	[JZ4780_CLK_DES] = {
755*4882a593Smuzhiyun 		"des", CGU_CLK_GATE,
756*4882a593Smuzhiyun 		.parents = { JZ4780_CLK_EXCLK, -1, -1, -1 },
757*4882a593Smuzhiyun 		.gate = { CGU_REG_CLKGR1, 13 },
758*4882a593Smuzhiyun 	},
759*4882a593Smuzhiyun 
760*4882a593Smuzhiyun 	[JZ4780_CLK_X2D] = {
761*4882a593Smuzhiyun 		"x2d", CGU_CLK_GATE,
762*4882a593Smuzhiyun 		.parents = { JZ4780_CLK_EXCLK, -1, -1, -1 },
763*4882a593Smuzhiyun 		.gate = { CGU_REG_CLKGR1, 14 },
764*4882a593Smuzhiyun 	},
765*4882a593Smuzhiyun 
766*4882a593Smuzhiyun 	[JZ4780_CLK_CORE1] = {
767*4882a593Smuzhiyun 		"core1", CGU_CLK_CUSTOM,
768*4882a593Smuzhiyun 		.parents = { JZ4780_CLK_CPU, -1, -1, -1 },
769*4882a593Smuzhiyun 		.custom = { &jz4780_core1_ops },
770*4882a593Smuzhiyun 	},
771*4882a593Smuzhiyun 
772*4882a593Smuzhiyun };
773*4882a593Smuzhiyun 
jz4780_cgu_init(struct device_node * np)774*4882a593Smuzhiyun static void __init jz4780_cgu_init(struct device_node *np)
775*4882a593Smuzhiyun {
776*4882a593Smuzhiyun 	int retval;
777*4882a593Smuzhiyun 
778*4882a593Smuzhiyun 	cgu = ingenic_cgu_new(jz4780_cgu_clocks,
779*4882a593Smuzhiyun 			      ARRAY_SIZE(jz4780_cgu_clocks), np);
780*4882a593Smuzhiyun 	if (!cgu) {
781*4882a593Smuzhiyun 		pr_err("%s: failed to initialise CGU\n", __func__);
782*4882a593Smuzhiyun 		return;
783*4882a593Smuzhiyun 	}
784*4882a593Smuzhiyun 
785*4882a593Smuzhiyun 	retval = ingenic_cgu_register_clocks(cgu);
786*4882a593Smuzhiyun 	if (retval) {
787*4882a593Smuzhiyun 		pr_err("%s: failed to register CGU Clocks\n", __func__);
788*4882a593Smuzhiyun 		return;
789*4882a593Smuzhiyun 	}
790*4882a593Smuzhiyun 
791*4882a593Smuzhiyun 	ingenic_cgu_register_syscore_ops(cgu);
792*4882a593Smuzhiyun }
793*4882a593Smuzhiyun CLK_OF_DECLARE_DRIVER(jz4780_cgu, "ingenic,jz4780-cgu", jz4780_cgu_init);
794