1 // SPDX-License-Identifier: GPL-2.0-or-later
3 * Ingenic JZ4780 SoC CGU driver
5 * Copyright (c) 2013-2015 Imagination Technologies
6 * Author: Paul Burton <paul.burton@mips.com>
9 #include <linux/clk-provider.h>
10 #include <linux/delay.h>
12 #include <linux/iopoll.h>
15 #include <dt-bindings/clock/jz4780-cgu.h>
20 /* CGU register offsets */
21 #define CGU_REG_CLOCKCONTROL 0x00
22 #define CGU_REG_LCR 0x04
23 #define CGU_REG_APLL 0x10
24 #define CGU_REG_MPLL 0x14
25 #define CGU_REG_EPLL 0x18
26 #define CGU_REG_VPLL 0x1c
27 #define CGU_REG_CLKGR0 0x20
28 #define CGU_REG_OPCR 0x24
29 #define CGU_REG_CLKGR1 0x28
30 #define CGU_REG_DDRCDR 0x2c
31 #define CGU_REG_VPUCDR 0x30
32 #define CGU_REG_USBPCR 0x3c
33 #define CGU_REG_USBRDT 0x40
34 #define CGU_REG_USBVBFIL 0x44
35 #define CGU_REG_USBPCR1 0x48
36 #define CGU_REG_LP0CDR 0x54
37 #define CGU_REG_I2SCDR 0x60
38 #define CGU_REG_LP1CDR 0x64
39 #define CGU_REG_MSC0CDR 0x68
40 #define CGU_REG_UHCCDR 0x6c
41 #define CGU_REG_SSICDR 0x74
42 #define CGU_REG_CIMCDR 0x7c
43 #define CGU_REG_PCMCDR 0x84
44 #define CGU_REG_GPUCDR 0x88
45 #define CGU_REG_HDMICDR 0x8c
46 #define CGU_REG_MSC1CDR 0xa4
47 #define CGU_REG_MSC2CDR 0xa8
48 #define CGU_REG_BCHCDR 0xac
49 #define CGU_REG_CLOCKSTATUS 0xd4
51 /* bits within the OPCR register */
52 #define OPCR_SPENDN0 BIT(7)
53 #define OPCR_SPENDN1 BIT(6)
55 /* bits within the USBPCR register */
56 #define USBPCR_USB_MODE BIT(31)
57 #define USBPCR_IDPULLUP_MASK (0x3 << 28)
58 #define USBPCR_COMMONONN BIT(25)
59 #define USBPCR_VBUSVLDEXT BIT(24)
60 #define USBPCR_VBUSVLDEXTSEL BIT(23)
61 #define USBPCR_POR BIT(22)
62 #define USBPCR_OTG_DISABLE BIT(20)
63 #define USBPCR_COMPDISTUNE_MASK (0x7 << 17)
64 #define USBPCR_OTGTUNE_MASK (0x7 << 14)
65 #define USBPCR_SQRXTUNE_MASK (0x7 << 11)
66 #define USBPCR_TXFSLSTUNE_MASK (0xf << 7)
67 #define USBPCR_TXPREEMPHTUNE BIT(6)
68 #define USBPCR_TXHSXVTUNE_MASK (0x3 << 4)
69 #define USBPCR_TXVREFTUNE_MASK 0xf
71 /* bits within the USBPCR1 register */
72 #define USBPCR1_REFCLKSEL_SHIFT 26
73 #define USBPCR1_REFCLKSEL_MASK (0x3 << USBPCR1_REFCLKSEL_SHIFT)
74 #define USBPCR1_REFCLKSEL_CORE (0x2 << USBPCR1_REFCLKSEL_SHIFT)
75 #define USBPCR1_REFCLKDIV_SHIFT 24
76 #define USBPCR1_REFCLKDIV_MASK (0x3 << USBPCR1_REFCLKDIV_SHIFT)
77 #define USBPCR1_REFCLKDIV_19_2 (0x3 << USBPCR1_REFCLKDIV_SHIFT)
78 #define USBPCR1_REFCLKDIV_48 (0x2 << USBPCR1_REFCLKDIV_SHIFT)
79 #define USBPCR1_REFCLKDIV_24 (0x1 << USBPCR1_REFCLKDIV_SHIFT)
80 #define USBPCR1_REFCLKDIV_12 (0x0 << USBPCR1_REFCLKDIV_SHIFT)
81 #define USBPCR1_USB_SEL BIT(28)
82 #define USBPCR1_WORD_IF0 BIT(19)
83 #define USBPCR1_WORD_IF1 BIT(18)
85 /* bits within the USBRDT register */
86 #define USBRDT_VBFIL_LD_EN BIT(25)
87 #define USBRDT_USBRDT_MASK 0x7fffff
89 /* bits within the USBVBFIL register */
90 #define USBVBFIL_IDDIGFIL_SHIFT 16
91 #define USBVBFIL_IDDIGFIL_MASK (0xffff << USBVBFIL_IDDIGFIL_SHIFT)
92 #define USBVBFIL_USBVBFIL_MASK (0xffff)
94 /* bits within the LCR register */
95 #define LCR_PD_SCPU BIT(31)
96 #define LCR_SCPUS BIT(27)
98 /* bits within the CLKGR1 register */
99 #define CLKGR1_CORE1 BIT(15)
101 static struct ingenic_cgu
*cgu
;
103 static u8
jz4780_otg_phy_get_parent(struct clk_hw
*hw
)
105 /* we only use CLKCORE, revisit if that ever changes */
109 static int jz4780_otg_phy_set_parent(struct clk_hw
*hw
, u8 idx
)
117 spin_lock_irqsave(&cgu
->lock
, flags
);
119 usbpcr1
= readl(cgu
->base
+ CGU_REG_USBPCR1
);
120 usbpcr1
&= ~USBPCR1_REFCLKSEL_MASK
;
121 /* we only use CLKCORE */
122 usbpcr1
|= USBPCR1_REFCLKSEL_CORE
;
123 writel(usbpcr1
, cgu
->base
+ CGU_REG_USBPCR1
);
125 spin_unlock_irqrestore(&cgu
->lock
, flags
);
129 static unsigned long jz4780_otg_phy_recalc_rate(struct clk_hw
*hw
,
130 unsigned long parent_rate
)
135 usbpcr1
= readl(cgu
->base
+ CGU_REG_USBPCR1
);
136 refclk_div
= usbpcr1
& USBPCR1_REFCLKDIV_MASK
;
138 switch (refclk_div
) {
139 case USBPCR1_REFCLKDIV_12
:
142 case USBPCR1_REFCLKDIV_24
:
145 case USBPCR1_REFCLKDIV_48
:
148 case USBPCR1_REFCLKDIV_19_2
:
156 static long jz4780_otg_phy_round_rate(struct clk_hw
*hw
, unsigned long req_rate
,
157 unsigned long *parent_rate
)
159 if (req_rate
< 15600000)
162 if (req_rate
< 21600000)
165 if (req_rate
< 36000000)
171 static int jz4780_otg_phy_set_rate(struct clk_hw
*hw
, unsigned long req_rate
,
172 unsigned long parent_rate
)
175 u32 usbpcr1
, div_bits
;
179 div_bits
= USBPCR1_REFCLKDIV_12
;
183 div_bits
= USBPCR1_REFCLKDIV_19_2
;
187 div_bits
= USBPCR1_REFCLKDIV_24
;
191 div_bits
= USBPCR1_REFCLKDIV_48
;
198 spin_lock_irqsave(&cgu
->lock
, flags
);
200 usbpcr1
= readl(cgu
->base
+ CGU_REG_USBPCR1
);
201 usbpcr1
&= ~USBPCR1_REFCLKDIV_MASK
;
203 writel(usbpcr1
, cgu
->base
+ CGU_REG_USBPCR1
);
205 spin_unlock_irqrestore(&cgu
->lock
, flags
);
209 static const struct clk_ops jz4780_otg_phy_ops
= {
210 .get_parent
= jz4780_otg_phy_get_parent
,
211 .set_parent
= jz4780_otg_phy_set_parent
,
213 .recalc_rate
= jz4780_otg_phy_recalc_rate
,
214 .round_rate
= jz4780_otg_phy_round_rate
,
215 .set_rate
= jz4780_otg_phy_set_rate
,
218 static int jz4780_core1_enable(struct clk_hw
*hw
)
220 struct ingenic_clk
*ingenic_clk
= to_ingenic_clk(hw
);
221 struct ingenic_cgu
*cgu
= ingenic_clk
->cgu
;
222 const unsigned int timeout
= 5000;
227 spin_lock_irqsave(&cgu
->lock
, flags
);
229 lcr
= readl(cgu
->base
+ CGU_REG_LCR
);
231 writel(lcr
, cgu
->base
+ CGU_REG_LCR
);
233 clkgr1
= readl(cgu
->base
+ CGU_REG_CLKGR1
);
234 clkgr1
&= ~CLKGR1_CORE1
;
235 writel(clkgr1
, cgu
->base
+ CGU_REG_CLKGR1
);
237 spin_unlock_irqrestore(&cgu
->lock
, flags
);
239 /* wait for the CPU to be powered up */
240 retval
= readl_poll_timeout(cgu
->base
+ CGU_REG_LCR
, lcr
,
241 !(lcr
& LCR_SCPUS
), 10, timeout
);
242 if (retval
== -ETIMEDOUT
) {
243 pr_err("%s: Wait for power up core1 timeout\n", __func__
);
250 static const struct clk_ops jz4780_core1_ops
= {
251 .enable
= jz4780_core1_enable
,
254 static const s8 pll_od_encoding
[16] = {
255 0x0, 0x1, 0x2, 0x3, 0x4, 0x5, 0x6, 0x7,
256 0x8, 0x9, 0xa, 0xb, 0xc, 0xd, 0xe, 0xf,
259 static const struct ingenic_cgu_clk_info jz4780_cgu_clocks
[] = {
261 /* External clocks */
263 [JZ4780_CLK_EXCLK
] = { "ext", CGU_CLK_EXT
},
264 [JZ4780_CLK_RTCLK
] = { "rtc", CGU_CLK_EXT
},
268 #define DEF_PLL(name) { \
269 .reg = CGU_REG_ ## name, \
270 .rate_multiplier = 1, \
280 .od_encoding = pll_od_encoding, \
282 .bypass_reg = CGU_REG_ ## name, \
287 [JZ4780_CLK_APLL
] = {
289 .parents
= { JZ4780_CLK_EXCLK
, -1, -1, -1 },
290 .pll
= DEF_PLL(APLL
),
293 [JZ4780_CLK_MPLL
] = {
295 .parents
= { JZ4780_CLK_EXCLK
, -1, -1, -1 },
296 .pll
= DEF_PLL(MPLL
),
299 [JZ4780_CLK_EPLL
] = {
301 .parents
= { JZ4780_CLK_EXCLK
, -1, -1, -1 },
302 .pll
= DEF_PLL(EPLL
),
305 [JZ4780_CLK_VPLL
] = {
307 .parents
= { JZ4780_CLK_EXCLK
, -1, -1, -1 },
308 .pll
= DEF_PLL(VPLL
),
313 /* Custom (SoC-specific) OTG PHY */
315 [JZ4780_CLK_OTGPHY
] = {
316 "otg_phy", CGU_CLK_CUSTOM
,
317 .parents
= { -1, -1, JZ4780_CLK_EXCLK
, -1 },
318 .custom
= { &jz4780_otg_phy_ops
},
321 /* Muxes & dividers */
323 [JZ4780_CLK_SCLKA
] = {
324 "sclk_a", CGU_CLK_MUX
,
325 .parents
= { -1, JZ4780_CLK_APLL
, JZ4780_CLK_EXCLK
,
327 .mux
= { CGU_REG_CLOCKCONTROL
, 30, 2 },
330 [JZ4780_CLK_CPUMUX
] = {
331 "cpumux", CGU_CLK_MUX
,
332 .parents
= { -1, JZ4780_CLK_SCLKA
, JZ4780_CLK_MPLL
,
334 .mux
= { CGU_REG_CLOCKCONTROL
, 28, 2 },
339 .parents
= { JZ4780_CLK_CPUMUX
, -1, -1, -1 },
340 .div
= { CGU_REG_CLOCKCONTROL
, 0, 1, 4, 22, -1, -1 },
343 [JZ4780_CLK_L2CACHE
] = {
344 "l2cache", CGU_CLK_DIV
,
345 .parents
= { JZ4780_CLK_CPUMUX
, -1, -1, -1 },
346 .div
= { CGU_REG_CLOCKCONTROL
, 4, 1, 4, -1, -1, -1 },
349 [JZ4780_CLK_AHB0
] = {
350 "ahb0", CGU_CLK_MUX
| CGU_CLK_DIV
,
351 .parents
= { -1, JZ4780_CLK_SCLKA
, JZ4780_CLK_MPLL
,
353 .mux
= { CGU_REG_CLOCKCONTROL
, 26, 2 },
354 .div
= { CGU_REG_CLOCKCONTROL
, 8, 1, 4, 21, -1, -1 },
357 [JZ4780_CLK_AHB2PMUX
] = {
358 "ahb2_apb_mux", CGU_CLK_MUX
,
359 .parents
= { -1, JZ4780_CLK_SCLKA
, JZ4780_CLK_MPLL
,
361 .mux
= { CGU_REG_CLOCKCONTROL
, 24, 2 },
364 [JZ4780_CLK_AHB2
] = {
366 .parents
= { JZ4780_CLK_AHB2PMUX
, -1, -1, -1 },
367 .div
= { CGU_REG_CLOCKCONTROL
, 12, 1, 4, 20, -1, -1 },
370 [JZ4780_CLK_PCLK
] = {
372 .parents
= { JZ4780_CLK_AHB2PMUX
, -1, -1, -1 },
373 .div
= { CGU_REG_CLOCKCONTROL
, 16, 1, 4, 20, -1, -1 },
377 "ddr", CGU_CLK_MUX
| CGU_CLK_DIV
,
378 .parents
= { -1, JZ4780_CLK_SCLKA
, JZ4780_CLK_MPLL
, -1 },
379 .mux
= { CGU_REG_DDRCDR
, 30, 2 },
380 .div
= { CGU_REG_DDRCDR
, 0, 1, 4, 29, 28, 27 },
384 "vpu", CGU_CLK_MUX
| CGU_CLK_DIV
| CGU_CLK_GATE
,
385 .parents
= { JZ4780_CLK_SCLKA
, JZ4780_CLK_MPLL
,
386 JZ4780_CLK_EPLL
, -1 },
387 .mux
= { CGU_REG_VPUCDR
, 30, 2 },
388 .div
= { CGU_REG_VPUCDR
, 0, 1, 4, 29, 28, 27 },
389 .gate
= { CGU_REG_CLKGR1
, 2 },
392 [JZ4780_CLK_I2SPLL
] = {
393 "i2s_pll", CGU_CLK_MUX
| CGU_CLK_DIV
,
394 .parents
= { JZ4780_CLK_SCLKA
, JZ4780_CLK_EPLL
, -1, -1 },
395 .mux
= { CGU_REG_I2SCDR
, 30, 1 },
396 .div
= { CGU_REG_I2SCDR
, 0, 1, 8, 29, 28, 27 },
401 .parents
= { JZ4780_CLK_EXCLK
, JZ4780_CLK_I2SPLL
, -1, -1 },
402 .mux
= { CGU_REG_I2SCDR
, 31, 1 },
405 [JZ4780_CLK_LCD0PIXCLK
] = {
406 "lcd0pixclk", CGU_CLK_MUX
| CGU_CLK_DIV
,
407 .parents
= { JZ4780_CLK_SCLKA
, JZ4780_CLK_MPLL
,
408 JZ4780_CLK_VPLL
, -1 },
409 .mux
= { CGU_REG_LP0CDR
, 30, 2 },
410 .div
= { CGU_REG_LP0CDR
, 0, 1, 8, 28, 27, 26 },
413 [JZ4780_CLK_LCD1PIXCLK
] = {
414 "lcd1pixclk", CGU_CLK_MUX
| CGU_CLK_DIV
,
415 .parents
= { JZ4780_CLK_SCLKA
, JZ4780_CLK_MPLL
,
416 JZ4780_CLK_VPLL
, -1 },
417 .mux
= { CGU_REG_LP1CDR
, 30, 2 },
418 .div
= { CGU_REG_LP1CDR
, 0, 1, 8, 28, 27, 26 },
421 [JZ4780_CLK_MSCMUX
] = {
422 "msc_mux", CGU_CLK_MUX
,
423 .parents
= { -1, JZ4780_CLK_SCLKA
, JZ4780_CLK_MPLL
, -1 },
424 .mux
= { CGU_REG_MSC0CDR
, 30, 2 },
427 [JZ4780_CLK_MSC0
] = {
428 "msc0", CGU_CLK_DIV
| CGU_CLK_GATE
,
429 .parents
= { JZ4780_CLK_MSCMUX
, -1, -1, -1 },
430 .div
= { CGU_REG_MSC0CDR
, 0, 2, 8, 29, 28, 27 },
431 .gate
= { CGU_REG_CLKGR0
, 3 },
434 [JZ4780_CLK_MSC1
] = {
435 "msc1", CGU_CLK_DIV
| CGU_CLK_GATE
,
436 .parents
= { JZ4780_CLK_MSCMUX
, -1, -1, -1 },
437 .div
= { CGU_REG_MSC1CDR
, 0, 2, 8, 29, 28, 27 },
438 .gate
= { CGU_REG_CLKGR0
, 11 },
441 [JZ4780_CLK_MSC2
] = {
442 "msc2", CGU_CLK_DIV
| CGU_CLK_GATE
,
443 .parents
= { JZ4780_CLK_MSCMUX
, -1, -1, -1 },
444 .div
= { CGU_REG_MSC2CDR
, 0, 2, 8, 29, 28, 27 },
445 .gate
= { CGU_REG_CLKGR0
, 12 },
449 "uhc", CGU_CLK_MUX
| CGU_CLK_DIV
| CGU_CLK_GATE
,
450 .parents
= { JZ4780_CLK_SCLKA
, JZ4780_CLK_MPLL
,
451 JZ4780_CLK_EPLL
, JZ4780_CLK_OTGPHY
},
452 .mux
= { CGU_REG_UHCCDR
, 30, 2 },
453 .div
= { CGU_REG_UHCCDR
, 0, 1, 8, 29, 28, 27 },
454 .gate
= { CGU_REG_CLKGR0
, 24 },
457 [JZ4780_CLK_SSIPLL
] = {
458 "ssi_pll", CGU_CLK_MUX
| CGU_CLK_DIV
,
459 .parents
= { JZ4780_CLK_SCLKA
, JZ4780_CLK_MPLL
, -1, -1 },
460 .mux
= { CGU_REG_SSICDR
, 30, 1 },
461 .div
= { CGU_REG_SSICDR
, 0, 1, 8, 29, 28, 27 },
466 .parents
= { JZ4780_CLK_EXCLK
, JZ4780_CLK_SSIPLL
, -1, -1 },
467 .mux
= { CGU_REG_SSICDR
, 31, 1 },
470 [JZ4780_CLK_CIMMCLK
] = {
471 "cim_mclk", CGU_CLK_MUX
| CGU_CLK_DIV
,
472 .parents
= { JZ4780_CLK_SCLKA
, JZ4780_CLK_MPLL
, -1, -1 },
473 .mux
= { CGU_REG_CIMCDR
, 31, 1 },
474 .div
= { CGU_REG_CIMCDR
, 0, 1, 8, 30, 29, 28 },
477 [JZ4780_CLK_PCMPLL
] = {
478 "pcm_pll", CGU_CLK_MUX
| CGU_CLK_DIV
,
479 .parents
= { JZ4780_CLK_SCLKA
, JZ4780_CLK_MPLL
,
480 JZ4780_CLK_EPLL
, JZ4780_CLK_VPLL
},
481 .mux
= { CGU_REG_PCMCDR
, 29, 2 },
482 .div
= { CGU_REG_PCMCDR
, 0, 1, 8, 28, 27, 26 },
486 "pcm", CGU_CLK_MUX
| CGU_CLK_GATE
,
487 .parents
= { JZ4780_CLK_EXCLK
, JZ4780_CLK_PCMPLL
, -1, -1 },
488 .mux
= { CGU_REG_PCMCDR
, 31, 1 },
489 .gate
= { CGU_REG_CLKGR1
, 3 },
493 "gpu", CGU_CLK_MUX
| CGU_CLK_DIV
| CGU_CLK_GATE
,
494 .parents
= { -1, JZ4780_CLK_SCLKA
, JZ4780_CLK_MPLL
,
496 .mux
= { CGU_REG_GPUCDR
, 30, 2 },
497 .div
= { CGU_REG_GPUCDR
, 0, 1, 4, 29, 28, 27 },
498 .gate
= { CGU_REG_CLKGR1
, 4 },
501 [JZ4780_CLK_HDMI
] = {
502 "hdmi", CGU_CLK_MUX
| CGU_CLK_DIV
| CGU_CLK_GATE
,
503 .parents
= { JZ4780_CLK_SCLKA
, JZ4780_CLK_MPLL
,
504 JZ4780_CLK_VPLL
, -1 },
505 .mux
= { CGU_REG_HDMICDR
, 30, 2 },
506 .div
= { CGU_REG_HDMICDR
, 0, 1, 8, 29, 28, 26 },
507 .gate
= { CGU_REG_CLKGR1
, 9 },
511 "bch", CGU_CLK_MUX
| CGU_CLK_DIV
| CGU_CLK_GATE
,
512 .parents
= { -1, JZ4780_CLK_SCLKA
, JZ4780_CLK_MPLL
,
514 .mux
= { CGU_REG_BCHCDR
, 30, 2 },
515 .div
= { CGU_REG_BCHCDR
, 0, 1, 4, 29, 28, 27 },
516 .gate
= { CGU_REG_CLKGR0
, 1 },
519 /* Gate-only clocks */
521 [JZ4780_CLK_NEMC
] = {
522 "nemc", CGU_CLK_GATE
,
523 .parents
= { JZ4780_CLK_AHB2
, -1, -1, -1 },
524 .gate
= { CGU_REG_CLKGR0
, 0 },
527 [JZ4780_CLK_OTG0
] = {
528 "otg0", CGU_CLK_GATE
,
529 .parents
= { JZ4780_CLK_EXCLK
, -1, -1, -1 },
530 .gate
= { CGU_REG_CLKGR0
, 2 },
533 [JZ4780_CLK_SSI0
] = {
534 "ssi0", CGU_CLK_GATE
,
535 .parents
= { JZ4780_CLK_SSI
, -1, -1, -1 },
536 .gate
= { CGU_REG_CLKGR0
, 4 },
539 [JZ4780_CLK_SMB0
] = {
540 "smb0", CGU_CLK_GATE
,
541 .parents
= { JZ4780_CLK_PCLK
, -1, -1, -1 },
542 .gate
= { CGU_REG_CLKGR0
, 5 },
545 [JZ4780_CLK_SMB1
] = {
546 "smb1", CGU_CLK_GATE
,
547 .parents
= { JZ4780_CLK_PCLK
, -1, -1, -1 },
548 .gate
= { CGU_REG_CLKGR0
, 6 },
553 .parents
= { JZ4780_CLK_EXCLK
, -1, -1, -1 },
554 .gate
= { CGU_REG_CLKGR0
, 7 },
559 .parents
= { JZ4780_CLK_EXCLK
, -1, -1, -1 },
560 .gate
= { CGU_REG_CLKGR0
, 8 },
563 [JZ4780_CLK_TSSI0
] = {
564 "tssi0", CGU_CLK_GATE
,
565 .parents
= { JZ4780_CLK_EXCLK
, -1, -1, -1 },
566 .gate
= { CGU_REG_CLKGR0
, 9 },
571 .parents
= { JZ4780_CLK_EXCLK
, -1, -1, -1 },
572 .gate
= { CGU_REG_CLKGR0
, 10 },
577 .parents
= { JZ4780_CLK_EXCLK
, -1, -1, -1 },
578 .gate
= { CGU_REG_CLKGR0
, 13 },
581 [JZ4780_CLK_SADC
] = {
582 "sadc", CGU_CLK_GATE
,
583 .parents
= { JZ4780_CLK_EXCLK
, -1, -1, -1 },
584 .gate
= { CGU_REG_CLKGR0
, 14 },
587 [JZ4780_CLK_UART0
] = {
588 "uart0", CGU_CLK_GATE
,
589 .parents
= { JZ4780_CLK_EXCLK
, -1, -1, -1 },
590 .gate
= { CGU_REG_CLKGR0
, 15 },
593 [JZ4780_CLK_UART1
] = {
594 "uart1", CGU_CLK_GATE
,
595 .parents
= { JZ4780_CLK_EXCLK
, -1, -1, -1 },
596 .gate
= { CGU_REG_CLKGR0
, 16 },
599 [JZ4780_CLK_UART2
] = {
600 "uart2", CGU_CLK_GATE
,
601 .parents
= { JZ4780_CLK_EXCLK
, -1, -1, -1 },
602 .gate
= { CGU_REG_CLKGR0
, 17 },
605 [JZ4780_CLK_UART3
] = {
606 "uart3", CGU_CLK_GATE
,
607 .parents
= { JZ4780_CLK_EXCLK
, -1, -1, -1 },
608 .gate
= { CGU_REG_CLKGR0
, 18 },
611 [JZ4780_CLK_SSI1
] = {
612 "ssi1", CGU_CLK_GATE
,
613 .parents
= { JZ4780_CLK_SSI
, -1, -1, -1 },
614 .gate
= { CGU_REG_CLKGR0
, 19 },
617 [JZ4780_CLK_SSI2
] = {
618 "ssi2", CGU_CLK_GATE
,
619 .parents
= { JZ4780_CLK_SSI
, -1, -1, -1 },
620 .gate
= { CGU_REG_CLKGR0
, 20 },
623 [JZ4780_CLK_PDMA
] = {
624 "pdma", CGU_CLK_GATE
,
625 .parents
= { JZ4780_CLK_EXCLK
, -1, -1, -1 },
626 .gate
= { CGU_REG_CLKGR0
, 21 },
631 .parents
= { JZ4780_CLK_EXCLK
, -1, -1, -1 },
632 .gate
= { CGU_REG_CLKGR0
, 22 },
637 .parents
= { JZ4780_CLK_EXCLK
, -1, -1, -1 },
638 .gate
= { CGU_REG_CLKGR0
, 23 },
641 [JZ4780_CLK_SMB2
] = {
642 "smb2", CGU_CLK_GATE
,
643 .parents
= { JZ4780_CLK_PCLK
, -1, -1, -1 },
644 .gate
= { CGU_REG_CLKGR0
, 24 },
649 .parents
= { JZ4780_CLK_EXCLK
, -1, -1, -1 },
650 .gate
= { CGU_REG_CLKGR0
, 26 },
655 .parents
= { JZ4780_CLK_EXCLK
, -1, -1, -1 },
656 .gate
= { CGU_REG_CLKGR0
, 28 },
661 .parents
= { JZ4780_CLK_LCD
, -1, -1, -1 },
662 .gate
= { CGU_REG_CLKGR0
, 27 },
667 .parents
= { JZ4780_CLK_EXCLK
, -1, -1, -1 },
668 .gate
= { CGU_REG_CLKGR0
, 29 },
671 [JZ4780_CLK_DDR0
] = {
672 "ddr0", CGU_CLK_GATE
,
673 .parents
= { JZ4780_CLK_DDR
, -1, -1, -1 },
674 .gate
= { CGU_REG_CLKGR0
, 30 },
677 [JZ4780_CLK_DDR1
] = {
678 "ddr1", CGU_CLK_GATE
,
679 .parents
= { JZ4780_CLK_DDR
, -1, -1, -1 },
680 .gate
= { CGU_REG_CLKGR0
, 31 },
683 [JZ4780_CLK_SMB3
] = {
684 "smb3", CGU_CLK_GATE
,
685 .parents
= { JZ4780_CLK_PCLK
, -1, -1, -1 },
686 .gate
= { CGU_REG_CLKGR1
, 0 },
689 [JZ4780_CLK_TSSI1
] = {
690 "tssi1", CGU_CLK_GATE
,
691 .parents
= { JZ4780_CLK_EXCLK
, -1, -1, -1 },
692 .gate
= { CGU_REG_CLKGR1
, 1 },
695 [JZ4780_CLK_COMPRESS
] = {
696 "compress", CGU_CLK_GATE
,
697 .parents
= { JZ4780_CLK_EXCLK
, -1, -1, -1 },
698 .gate
= { CGU_REG_CLKGR1
, 5 },
701 [JZ4780_CLK_AIC1
] = {
702 "aic1", CGU_CLK_GATE
,
703 .parents
= { JZ4780_CLK_EXCLK
, -1, -1, -1 },
704 .gate
= { CGU_REG_CLKGR1
, 6 },
707 [JZ4780_CLK_GPVLC
] = {
708 "gpvlc", CGU_CLK_GATE
,
709 .parents
= { JZ4780_CLK_EXCLK
, -1, -1, -1 },
710 .gate
= { CGU_REG_CLKGR1
, 7 },
713 [JZ4780_CLK_OTG1
] = {
714 "otg1", CGU_CLK_GATE
,
715 .parents
= { JZ4780_CLK_EXCLK
, -1, -1, -1 },
716 .gate
= { CGU_REG_CLKGR1
, 8 },
719 [JZ4780_CLK_UART4
] = {
720 "uart4", CGU_CLK_GATE
,
721 .parents
= { JZ4780_CLK_EXCLK
, -1, -1, -1 },
722 .gate
= { CGU_REG_CLKGR1
, 10 },
725 [JZ4780_CLK_AHBMON
] = {
726 "ahb_mon", CGU_CLK_GATE
,
727 .parents
= { JZ4780_CLK_EXCLK
, -1, -1, -1 },
728 .gate
= { CGU_REG_CLKGR1
, 11 },
731 [JZ4780_CLK_SMB4
] = {
732 "smb4", CGU_CLK_GATE
,
733 .parents
= { JZ4780_CLK_PCLK
, -1, -1, -1 },
734 .gate
= { CGU_REG_CLKGR1
, 12 },
739 .parents
= { JZ4780_CLK_EXCLK
, -1, -1, -1 },
740 .gate
= { CGU_REG_CLKGR1
, 13 },
745 .parents
= { JZ4780_CLK_EXCLK
, -1, -1, -1 },
746 .gate
= { CGU_REG_CLKGR1
, 14 },
749 [JZ4780_CLK_CORE1
] = {
750 "core1", CGU_CLK_CUSTOM
,
751 .parents
= { JZ4780_CLK_CPU
, -1, -1, -1 },
752 .custom
= { &jz4780_core1_ops
},
757 static void __init
jz4780_cgu_init(struct device_node
*np
)
761 cgu
= ingenic_cgu_new(jz4780_cgu_clocks
,
762 ARRAY_SIZE(jz4780_cgu_clocks
), np
);
764 pr_err("%s: failed to initialise CGU\n", __func__
);
768 retval
= ingenic_cgu_register_clocks(cgu
);
770 pr_err("%s: failed to register CGU Clocks\n", __func__
);
774 ingenic_cgu_register_syscore_ops(cgu
);
776 CLK_OF_DECLARE_DRIVER(jz4780_cgu
, "ingenic,jz4780-cgu", jz4780_cgu_init
);