162306a36Sopenharmony_ci// SPDX-License-Identifier: GPL-2.0-or-later
262306a36Sopenharmony_ci/*
362306a36Sopenharmony_ci * Ingenic JZ4780 SoC CGU driver
462306a36Sopenharmony_ci *
562306a36Sopenharmony_ci * Copyright (c) 2013-2015 Imagination Technologies
662306a36Sopenharmony_ci * Author: Paul Burton <paul.burton@mips.com>
762306a36Sopenharmony_ci * Copyright (c) 2020 周琰杰 (Zhou Yanjie) <zhouyanjie@wanyeetech.com>
862306a36Sopenharmony_ci */
962306a36Sopenharmony_ci
1062306a36Sopenharmony_ci#include <linux/clk-provider.h>
1162306a36Sopenharmony_ci#include <linux/delay.h>
1262306a36Sopenharmony_ci#include <linux/io.h>
1362306a36Sopenharmony_ci#include <linux/iopoll.h>
1462306a36Sopenharmony_ci#include <linux/of.h>
1562306a36Sopenharmony_ci
1662306a36Sopenharmony_ci#include <dt-bindings/clock/ingenic,jz4780-cgu.h>
1762306a36Sopenharmony_ci
1862306a36Sopenharmony_ci#include "cgu.h"
1962306a36Sopenharmony_ci#include "pm.h"
2062306a36Sopenharmony_ci
2162306a36Sopenharmony_ci/* CGU register offsets */
2262306a36Sopenharmony_ci#define CGU_REG_CLOCKCONTROL	0x00
2362306a36Sopenharmony_ci#define CGU_REG_LCR				0x04
2462306a36Sopenharmony_ci#define CGU_REG_APLL			0x10
2562306a36Sopenharmony_ci#define CGU_REG_MPLL			0x14
2662306a36Sopenharmony_ci#define CGU_REG_EPLL			0x18
2762306a36Sopenharmony_ci#define CGU_REG_VPLL			0x1c
2862306a36Sopenharmony_ci#define CGU_REG_CLKGR0			0x20
2962306a36Sopenharmony_ci#define CGU_REG_OPCR			0x24
3062306a36Sopenharmony_ci#define CGU_REG_CLKGR1			0x28
3162306a36Sopenharmony_ci#define CGU_REG_DDRCDR			0x2c
3262306a36Sopenharmony_ci#define CGU_REG_VPUCDR			0x30
3362306a36Sopenharmony_ci#define CGU_REG_USBPCR			0x3c
3462306a36Sopenharmony_ci#define CGU_REG_USBRDT			0x40
3562306a36Sopenharmony_ci#define CGU_REG_USBVBFIL		0x44
3662306a36Sopenharmony_ci#define CGU_REG_USBPCR1			0x48
3762306a36Sopenharmony_ci#define CGU_REG_LP0CDR			0x54
3862306a36Sopenharmony_ci#define CGU_REG_I2SCDR			0x60
3962306a36Sopenharmony_ci#define CGU_REG_LP1CDR			0x64
4062306a36Sopenharmony_ci#define CGU_REG_MSC0CDR			0x68
4162306a36Sopenharmony_ci#define CGU_REG_UHCCDR			0x6c
4262306a36Sopenharmony_ci#define CGU_REG_SSICDR			0x74
4362306a36Sopenharmony_ci#define CGU_REG_CIMCDR			0x7c
4462306a36Sopenharmony_ci#define CGU_REG_PCMCDR			0x84
4562306a36Sopenharmony_ci#define CGU_REG_GPUCDR			0x88
4662306a36Sopenharmony_ci#define CGU_REG_HDMICDR			0x8c
4762306a36Sopenharmony_ci#define CGU_REG_MSC1CDR			0xa4
4862306a36Sopenharmony_ci#define CGU_REG_MSC2CDR			0xa8
4962306a36Sopenharmony_ci#define CGU_REG_BCHCDR			0xac
5062306a36Sopenharmony_ci#define CGU_REG_CLOCKSTATUS		0xd4
5162306a36Sopenharmony_ci
5262306a36Sopenharmony_ci/* bits within the OPCR register */
5362306a36Sopenharmony_ci#define OPCR_SPENDN0			BIT(7)
5462306a36Sopenharmony_ci#define OPCR_SPENDN1			BIT(6)
5562306a36Sopenharmony_ci
5662306a36Sopenharmony_ci/* bits within the USBPCR register */
5762306a36Sopenharmony_ci#define USBPCR_USB_MODE			BIT(31)
5862306a36Sopenharmony_ci#define USBPCR_IDPULLUP_MASK	(0x3 << 28)
5962306a36Sopenharmony_ci#define USBPCR_COMMONONN		BIT(25)
6062306a36Sopenharmony_ci#define USBPCR_VBUSVLDEXT		BIT(24)
6162306a36Sopenharmony_ci#define USBPCR_VBUSVLDEXTSEL	BIT(23)
6262306a36Sopenharmony_ci#define USBPCR_POR				BIT(22)
6362306a36Sopenharmony_ci#define USBPCR_SIDDQ			BIT(21)
6462306a36Sopenharmony_ci#define USBPCR_OTG_DISABLE		BIT(20)
6562306a36Sopenharmony_ci#define USBPCR_COMPDISTUNE_MASK	(0x7 << 17)
6662306a36Sopenharmony_ci#define USBPCR_OTGTUNE_MASK		(0x7 << 14)
6762306a36Sopenharmony_ci#define USBPCR_SQRXTUNE_MASK	(0x7 << 11)
6862306a36Sopenharmony_ci#define USBPCR_TXFSLSTUNE_MASK	(0xf << 7)
6962306a36Sopenharmony_ci#define USBPCR_TXPREEMPHTUNE	BIT(6)
7062306a36Sopenharmony_ci#define USBPCR_TXHSXVTUNE_MASK	(0x3 << 4)
7162306a36Sopenharmony_ci#define USBPCR_TXVREFTUNE_MASK	0xf
7262306a36Sopenharmony_ci
7362306a36Sopenharmony_ci/* bits within the USBPCR1 register */
7462306a36Sopenharmony_ci#define USBPCR1_REFCLKSEL_SHIFT	26
7562306a36Sopenharmony_ci#define USBPCR1_REFCLKSEL_MASK	(0x3 << USBPCR1_REFCLKSEL_SHIFT)
7662306a36Sopenharmony_ci#define USBPCR1_REFCLKSEL_CORE	(0x2 << USBPCR1_REFCLKSEL_SHIFT)
7762306a36Sopenharmony_ci#define USBPCR1_REFCLKDIV_SHIFT	24
7862306a36Sopenharmony_ci#define USBPCR1_REFCLKDIV_MASK	(0x3 << USBPCR1_REFCLKDIV_SHIFT)
7962306a36Sopenharmony_ci#define USBPCR1_REFCLKDIV_19_2	(0x3 << USBPCR1_REFCLKDIV_SHIFT)
8062306a36Sopenharmony_ci#define USBPCR1_REFCLKDIV_48	(0x2 << USBPCR1_REFCLKDIV_SHIFT)
8162306a36Sopenharmony_ci#define USBPCR1_REFCLKDIV_24	(0x1 << USBPCR1_REFCLKDIV_SHIFT)
8262306a36Sopenharmony_ci#define USBPCR1_REFCLKDIV_12	(0x0 << USBPCR1_REFCLKDIV_SHIFT)
8362306a36Sopenharmony_ci#define USBPCR1_USB_SEL			BIT(28)
8462306a36Sopenharmony_ci#define USBPCR1_WORD_IF0		BIT(19)
8562306a36Sopenharmony_ci#define USBPCR1_WORD_IF1		BIT(18)
8662306a36Sopenharmony_ci
8762306a36Sopenharmony_ci/* bits within the USBRDT register */
8862306a36Sopenharmony_ci#define USBRDT_VBFIL_LD_EN		BIT(25)
8962306a36Sopenharmony_ci#define USBRDT_USBRDT_MASK		0x7fffff
9062306a36Sopenharmony_ci
9162306a36Sopenharmony_ci/* bits within the USBVBFIL register */
9262306a36Sopenharmony_ci#define USBVBFIL_IDDIGFIL_SHIFT	16
9362306a36Sopenharmony_ci#define USBVBFIL_IDDIGFIL_MASK	(0xffff << USBVBFIL_IDDIGFIL_SHIFT)
9462306a36Sopenharmony_ci#define USBVBFIL_USBVBFIL_MASK	(0xffff)
9562306a36Sopenharmony_ci
9662306a36Sopenharmony_ci/* bits within the LCR register */
9762306a36Sopenharmony_ci#define LCR_PD_SCPU				BIT(31)
9862306a36Sopenharmony_ci#define LCR_SCPUS				BIT(27)
9962306a36Sopenharmony_ci
10062306a36Sopenharmony_ci/* bits within the CLKGR1 register */
10162306a36Sopenharmony_ci#define CLKGR1_CORE1			BIT(15)
10262306a36Sopenharmony_ci
10362306a36Sopenharmony_cistatic struct ingenic_cgu *cgu;
10462306a36Sopenharmony_ci
10562306a36Sopenharmony_cistatic unsigned long jz4780_otg_phy_recalc_rate(struct clk_hw *hw,
10662306a36Sopenharmony_ci						unsigned long parent_rate)
10762306a36Sopenharmony_ci{
10862306a36Sopenharmony_ci	u32 usbpcr1;
10962306a36Sopenharmony_ci	unsigned refclk_div;
11062306a36Sopenharmony_ci
11162306a36Sopenharmony_ci	usbpcr1 = readl(cgu->base + CGU_REG_USBPCR1);
11262306a36Sopenharmony_ci	refclk_div = usbpcr1 & USBPCR1_REFCLKDIV_MASK;
11362306a36Sopenharmony_ci
11462306a36Sopenharmony_ci	switch (refclk_div) {
11562306a36Sopenharmony_ci	case USBPCR1_REFCLKDIV_12:
11662306a36Sopenharmony_ci		return 12000000;
11762306a36Sopenharmony_ci
11862306a36Sopenharmony_ci	case USBPCR1_REFCLKDIV_24:
11962306a36Sopenharmony_ci		return 24000000;
12062306a36Sopenharmony_ci
12162306a36Sopenharmony_ci	case USBPCR1_REFCLKDIV_48:
12262306a36Sopenharmony_ci		return 48000000;
12362306a36Sopenharmony_ci
12462306a36Sopenharmony_ci	case USBPCR1_REFCLKDIV_19_2:
12562306a36Sopenharmony_ci		return 19200000;
12662306a36Sopenharmony_ci	}
12762306a36Sopenharmony_ci
12862306a36Sopenharmony_ci	return parent_rate;
12962306a36Sopenharmony_ci}
13062306a36Sopenharmony_ci
13162306a36Sopenharmony_cistatic long jz4780_otg_phy_round_rate(struct clk_hw *hw, unsigned long req_rate,
13262306a36Sopenharmony_ci				      unsigned long *parent_rate)
13362306a36Sopenharmony_ci{
13462306a36Sopenharmony_ci	if (req_rate < 15600000)
13562306a36Sopenharmony_ci		return 12000000;
13662306a36Sopenharmony_ci
13762306a36Sopenharmony_ci	if (req_rate < 21600000)
13862306a36Sopenharmony_ci		return 19200000;
13962306a36Sopenharmony_ci
14062306a36Sopenharmony_ci	if (req_rate < 36000000)
14162306a36Sopenharmony_ci		return 24000000;
14262306a36Sopenharmony_ci
14362306a36Sopenharmony_ci	return 48000000;
14462306a36Sopenharmony_ci}
14562306a36Sopenharmony_ci
14662306a36Sopenharmony_cistatic int jz4780_otg_phy_set_rate(struct clk_hw *hw, unsigned long req_rate,
14762306a36Sopenharmony_ci				   unsigned long parent_rate)
14862306a36Sopenharmony_ci{
14962306a36Sopenharmony_ci	unsigned long flags;
15062306a36Sopenharmony_ci	u32 usbpcr1, div_bits;
15162306a36Sopenharmony_ci
15262306a36Sopenharmony_ci	switch (req_rate) {
15362306a36Sopenharmony_ci	case 12000000:
15462306a36Sopenharmony_ci		div_bits = USBPCR1_REFCLKDIV_12;
15562306a36Sopenharmony_ci		break;
15662306a36Sopenharmony_ci
15762306a36Sopenharmony_ci	case 19200000:
15862306a36Sopenharmony_ci		div_bits = USBPCR1_REFCLKDIV_19_2;
15962306a36Sopenharmony_ci		break;
16062306a36Sopenharmony_ci
16162306a36Sopenharmony_ci	case 24000000:
16262306a36Sopenharmony_ci		div_bits = USBPCR1_REFCLKDIV_24;
16362306a36Sopenharmony_ci		break;
16462306a36Sopenharmony_ci
16562306a36Sopenharmony_ci	case 48000000:
16662306a36Sopenharmony_ci		div_bits = USBPCR1_REFCLKDIV_48;
16762306a36Sopenharmony_ci		break;
16862306a36Sopenharmony_ci
16962306a36Sopenharmony_ci	default:
17062306a36Sopenharmony_ci		return -EINVAL;
17162306a36Sopenharmony_ci	}
17262306a36Sopenharmony_ci
17362306a36Sopenharmony_ci	spin_lock_irqsave(&cgu->lock, flags);
17462306a36Sopenharmony_ci
17562306a36Sopenharmony_ci	usbpcr1 = readl(cgu->base + CGU_REG_USBPCR1);
17662306a36Sopenharmony_ci	usbpcr1 &= ~USBPCR1_REFCLKDIV_MASK;
17762306a36Sopenharmony_ci	usbpcr1 |= div_bits;
17862306a36Sopenharmony_ci	writel(usbpcr1, cgu->base + CGU_REG_USBPCR1);
17962306a36Sopenharmony_ci
18062306a36Sopenharmony_ci	spin_unlock_irqrestore(&cgu->lock, flags);
18162306a36Sopenharmony_ci	return 0;
18262306a36Sopenharmony_ci}
18362306a36Sopenharmony_ci
18462306a36Sopenharmony_cistatic int jz4780_otg_phy_enable(struct clk_hw *hw)
18562306a36Sopenharmony_ci{
18662306a36Sopenharmony_ci	void __iomem *reg_opcr		= cgu->base + CGU_REG_OPCR;
18762306a36Sopenharmony_ci	void __iomem *reg_usbpcr	= cgu->base + CGU_REG_USBPCR;
18862306a36Sopenharmony_ci
18962306a36Sopenharmony_ci	writel(readl(reg_opcr) | OPCR_SPENDN0, reg_opcr);
19062306a36Sopenharmony_ci	writel(readl(reg_usbpcr) & ~USBPCR_OTG_DISABLE & ~USBPCR_SIDDQ, reg_usbpcr);
19162306a36Sopenharmony_ci	return 0;
19262306a36Sopenharmony_ci}
19362306a36Sopenharmony_ci
19462306a36Sopenharmony_cistatic void jz4780_otg_phy_disable(struct clk_hw *hw)
19562306a36Sopenharmony_ci{
19662306a36Sopenharmony_ci	void __iomem *reg_opcr		= cgu->base + CGU_REG_OPCR;
19762306a36Sopenharmony_ci	void __iomem *reg_usbpcr	= cgu->base + CGU_REG_USBPCR;
19862306a36Sopenharmony_ci
19962306a36Sopenharmony_ci	writel(readl(reg_opcr) & ~OPCR_SPENDN0, reg_opcr);
20062306a36Sopenharmony_ci	writel(readl(reg_usbpcr) | USBPCR_OTG_DISABLE | USBPCR_SIDDQ, reg_usbpcr);
20162306a36Sopenharmony_ci}
20262306a36Sopenharmony_ci
20362306a36Sopenharmony_cistatic int jz4780_otg_phy_is_enabled(struct clk_hw *hw)
20462306a36Sopenharmony_ci{
20562306a36Sopenharmony_ci	void __iomem *reg_opcr		= cgu->base + CGU_REG_OPCR;
20662306a36Sopenharmony_ci	void __iomem *reg_usbpcr	= cgu->base + CGU_REG_USBPCR;
20762306a36Sopenharmony_ci
20862306a36Sopenharmony_ci	return (readl(reg_opcr) & OPCR_SPENDN0) &&
20962306a36Sopenharmony_ci		!(readl(reg_usbpcr) & USBPCR_SIDDQ) &&
21062306a36Sopenharmony_ci		!(readl(reg_usbpcr) & USBPCR_OTG_DISABLE);
21162306a36Sopenharmony_ci}
21262306a36Sopenharmony_ci
21362306a36Sopenharmony_cistatic const struct clk_ops jz4780_otg_phy_ops = {
21462306a36Sopenharmony_ci	.recalc_rate = jz4780_otg_phy_recalc_rate,
21562306a36Sopenharmony_ci	.round_rate = jz4780_otg_phy_round_rate,
21662306a36Sopenharmony_ci	.set_rate = jz4780_otg_phy_set_rate,
21762306a36Sopenharmony_ci
21862306a36Sopenharmony_ci	.enable		= jz4780_otg_phy_enable,
21962306a36Sopenharmony_ci	.disable	= jz4780_otg_phy_disable,
22062306a36Sopenharmony_ci	.is_enabled	= jz4780_otg_phy_is_enabled,
22162306a36Sopenharmony_ci};
22262306a36Sopenharmony_ci
22362306a36Sopenharmony_cistatic int jz4780_core1_enable(struct clk_hw *hw)
22462306a36Sopenharmony_ci{
22562306a36Sopenharmony_ci	struct ingenic_clk *ingenic_clk = to_ingenic_clk(hw);
22662306a36Sopenharmony_ci	struct ingenic_cgu *cgu = ingenic_clk->cgu;
22762306a36Sopenharmony_ci	const unsigned int timeout = 5000;
22862306a36Sopenharmony_ci	unsigned long flags;
22962306a36Sopenharmony_ci	int retval;
23062306a36Sopenharmony_ci	u32 lcr, clkgr1;
23162306a36Sopenharmony_ci
23262306a36Sopenharmony_ci	spin_lock_irqsave(&cgu->lock, flags);
23362306a36Sopenharmony_ci
23462306a36Sopenharmony_ci	lcr = readl(cgu->base + CGU_REG_LCR);
23562306a36Sopenharmony_ci	lcr &= ~LCR_PD_SCPU;
23662306a36Sopenharmony_ci	writel(lcr, cgu->base + CGU_REG_LCR);
23762306a36Sopenharmony_ci
23862306a36Sopenharmony_ci	clkgr1 = readl(cgu->base + CGU_REG_CLKGR1);
23962306a36Sopenharmony_ci	clkgr1 &= ~CLKGR1_CORE1;
24062306a36Sopenharmony_ci	writel(clkgr1, cgu->base + CGU_REG_CLKGR1);
24162306a36Sopenharmony_ci
24262306a36Sopenharmony_ci	spin_unlock_irqrestore(&cgu->lock, flags);
24362306a36Sopenharmony_ci
24462306a36Sopenharmony_ci	/* wait for the CPU to be powered up */
24562306a36Sopenharmony_ci	retval = readl_poll_timeout(cgu->base + CGU_REG_LCR, lcr,
24662306a36Sopenharmony_ci				 !(lcr & LCR_SCPUS), 10, timeout);
24762306a36Sopenharmony_ci	if (retval == -ETIMEDOUT) {
24862306a36Sopenharmony_ci		pr_err("%s: Wait for power up core1 timeout\n", __func__);
24962306a36Sopenharmony_ci		return retval;
25062306a36Sopenharmony_ci	}
25162306a36Sopenharmony_ci
25262306a36Sopenharmony_ci	return 0;
25362306a36Sopenharmony_ci}
25462306a36Sopenharmony_ci
25562306a36Sopenharmony_cistatic const struct clk_ops jz4780_core1_ops = {
25662306a36Sopenharmony_ci	.enable = jz4780_core1_enable,
25762306a36Sopenharmony_ci};
25862306a36Sopenharmony_ci
25962306a36Sopenharmony_cistatic const s8 pll_od_encoding[16] = {
26062306a36Sopenharmony_ci	0x0, 0x1, 0x2, 0x3, 0x4, 0x5, 0x6, 0x7,
26162306a36Sopenharmony_ci	0x8, 0x9, 0xa, 0xb, 0xc, 0xd, 0xe, 0xf,
26262306a36Sopenharmony_ci};
26362306a36Sopenharmony_ci
26462306a36Sopenharmony_cistatic const struct ingenic_cgu_clk_info jz4780_cgu_clocks[] = {
26562306a36Sopenharmony_ci
26662306a36Sopenharmony_ci	/* External clocks */
26762306a36Sopenharmony_ci
26862306a36Sopenharmony_ci	[JZ4780_CLK_EXCLK] = { "ext", CGU_CLK_EXT },
26962306a36Sopenharmony_ci	[JZ4780_CLK_RTCLK] = { "rtc", CGU_CLK_EXT },
27062306a36Sopenharmony_ci
27162306a36Sopenharmony_ci	/* PLLs */
27262306a36Sopenharmony_ci
27362306a36Sopenharmony_ci#define DEF_PLL(name) { \
27462306a36Sopenharmony_ci	.reg = CGU_REG_ ## name, \
27562306a36Sopenharmony_ci	.rate_multiplier = 1, \
27662306a36Sopenharmony_ci	.m_shift = 19, \
27762306a36Sopenharmony_ci	.m_bits = 13, \
27862306a36Sopenharmony_ci	.m_offset = 1, \
27962306a36Sopenharmony_ci	.n_shift = 13, \
28062306a36Sopenharmony_ci	.n_bits = 6, \
28162306a36Sopenharmony_ci	.n_offset = 1, \
28262306a36Sopenharmony_ci	.od_shift = 9, \
28362306a36Sopenharmony_ci	.od_bits = 4, \
28462306a36Sopenharmony_ci	.od_max = 16, \
28562306a36Sopenharmony_ci	.od_encoding = pll_od_encoding, \
28662306a36Sopenharmony_ci	.stable_bit = 6, \
28762306a36Sopenharmony_ci	.bypass_reg = CGU_REG_ ## name, \
28862306a36Sopenharmony_ci	.bypass_bit = 1, \
28962306a36Sopenharmony_ci	.enable_bit = 0, \
29062306a36Sopenharmony_ci}
29162306a36Sopenharmony_ci
29262306a36Sopenharmony_ci	[JZ4780_CLK_APLL] = {
29362306a36Sopenharmony_ci		"apll", CGU_CLK_PLL,
29462306a36Sopenharmony_ci		.parents = { JZ4780_CLK_EXCLK, -1, -1, -1 },
29562306a36Sopenharmony_ci		.pll = DEF_PLL(APLL),
29662306a36Sopenharmony_ci	},
29762306a36Sopenharmony_ci
29862306a36Sopenharmony_ci	[JZ4780_CLK_MPLL] = {
29962306a36Sopenharmony_ci		"mpll", CGU_CLK_PLL,
30062306a36Sopenharmony_ci		.parents = { JZ4780_CLK_EXCLK, -1, -1, -1 },
30162306a36Sopenharmony_ci		.pll = DEF_PLL(MPLL),
30262306a36Sopenharmony_ci	},
30362306a36Sopenharmony_ci
30462306a36Sopenharmony_ci	[JZ4780_CLK_EPLL] = {
30562306a36Sopenharmony_ci		"epll", CGU_CLK_PLL,
30662306a36Sopenharmony_ci		.parents = { JZ4780_CLK_EXCLK, -1, -1, -1 },
30762306a36Sopenharmony_ci		.pll = DEF_PLL(EPLL),
30862306a36Sopenharmony_ci	},
30962306a36Sopenharmony_ci
31062306a36Sopenharmony_ci	[JZ4780_CLK_VPLL] = {
31162306a36Sopenharmony_ci		"vpll", CGU_CLK_PLL,
31262306a36Sopenharmony_ci		.parents = { JZ4780_CLK_EXCLK, -1, -1, -1 },
31362306a36Sopenharmony_ci		.pll = DEF_PLL(VPLL),
31462306a36Sopenharmony_ci	},
31562306a36Sopenharmony_ci
31662306a36Sopenharmony_ci#undef DEF_PLL
31762306a36Sopenharmony_ci
31862306a36Sopenharmony_ci	/* Custom (SoC-specific) OTG PHY */
31962306a36Sopenharmony_ci
32062306a36Sopenharmony_ci	[JZ4780_CLK_OTGPHY] = {
32162306a36Sopenharmony_ci		"otg_phy", CGU_CLK_CUSTOM,
32262306a36Sopenharmony_ci		.parents = { -1, -1, JZ4780_CLK_EXCLK, -1 },
32362306a36Sopenharmony_ci		.custom = { &jz4780_otg_phy_ops },
32462306a36Sopenharmony_ci	},
32562306a36Sopenharmony_ci
32662306a36Sopenharmony_ci	/* Muxes & dividers */
32762306a36Sopenharmony_ci
32862306a36Sopenharmony_ci	[JZ4780_CLK_SCLKA] = {
32962306a36Sopenharmony_ci		"sclk_a", CGU_CLK_MUX,
33062306a36Sopenharmony_ci		.parents = { -1, JZ4780_CLK_APLL, JZ4780_CLK_EXCLK,
33162306a36Sopenharmony_ci			     JZ4780_CLK_RTCLK },
33262306a36Sopenharmony_ci		.mux = { CGU_REG_CLOCKCONTROL, 30, 2 },
33362306a36Sopenharmony_ci	},
33462306a36Sopenharmony_ci
33562306a36Sopenharmony_ci	[JZ4780_CLK_CPUMUX] = {
33662306a36Sopenharmony_ci		"cpumux", CGU_CLK_MUX,
33762306a36Sopenharmony_ci		.parents = { -1, JZ4780_CLK_SCLKA, JZ4780_CLK_MPLL,
33862306a36Sopenharmony_ci			     JZ4780_CLK_EPLL },
33962306a36Sopenharmony_ci		.mux = { CGU_REG_CLOCKCONTROL, 28, 2 },
34062306a36Sopenharmony_ci	},
34162306a36Sopenharmony_ci
34262306a36Sopenharmony_ci	[JZ4780_CLK_CPU] = {
34362306a36Sopenharmony_ci		"cpu", CGU_CLK_DIV,
34462306a36Sopenharmony_ci		/*
34562306a36Sopenharmony_ci		 * Disabling the CPU clock or any parent clocks will hang the
34662306a36Sopenharmony_ci		 * system; mark it critical.
34762306a36Sopenharmony_ci		 */
34862306a36Sopenharmony_ci		.flags = CLK_IS_CRITICAL,
34962306a36Sopenharmony_ci		.parents = { JZ4780_CLK_CPUMUX, -1, -1, -1 },
35062306a36Sopenharmony_ci		.div = { CGU_REG_CLOCKCONTROL, 0, 1, 4, 22, -1, -1 },
35162306a36Sopenharmony_ci	},
35262306a36Sopenharmony_ci
35362306a36Sopenharmony_ci	[JZ4780_CLK_L2CACHE] = {
35462306a36Sopenharmony_ci		"l2cache", CGU_CLK_DIV,
35562306a36Sopenharmony_ci		/*
35662306a36Sopenharmony_ci		 * The L2 cache clock is critical if caches are enabled and
35762306a36Sopenharmony_ci		 * disabling it or any parent clocks will hang the system.
35862306a36Sopenharmony_ci		 */
35962306a36Sopenharmony_ci		.flags = CLK_IS_CRITICAL,
36062306a36Sopenharmony_ci		.parents = { JZ4780_CLK_CPUMUX, -1, -1, -1 },
36162306a36Sopenharmony_ci		.div = { CGU_REG_CLOCKCONTROL, 4, 1, 4, -1, -1, -1 },
36262306a36Sopenharmony_ci	},
36362306a36Sopenharmony_ci
36462306a36Sopenharmony_ci	[JZ4780_CLK_AHB0] = {
36562306a36Sopenharmony_ci		"ahb0", CGU_CLK_MUX | CGU_CLK_DIV,
36662306a36Sopenharmony_ci		.parents = { -1, JZ4780_CLK_SCLKA, JZ4780_CLK_MPLL,
36762306a36Sopenharmony_ci			     JZ4780_CLK_EPLL },
36862306a36Sopenharmony_ci		.mux = { CGU_REG_CLOCKCONTROL, 26, 2 },
36962306a36Sopenharmony_ci		.div = { CGU_REG_CLOCKCONTROL, 8, 1, 4, 21, -1, -1 },
37062306a36Sopenharmony_ci	},
37162306a36Sopenharmony_ci
37262306a36Sopenharmony_ci	[JZ4780_CLK_AHB2PMUX] = {
37362306a36Sopenharmony_ci		"ahb2_apb_mux", CGU_CLK_MUX,
37462306a36Sopenharmony_ci		.parents = { -1, JZ4780_CLK_SCLKA, JZ4780_CLK_MPLL,
37562306a36Sopenharmony_ci			     JZ4780_CLK_RTCLK },
37662306a36Sopenharmony_ci		.mux = { CGU_REG_CLOCKCONTROL, 24, 2 },
37762306a36Sopenharmony_ci	},
37862306a36Sopenharmony_ci
37962306a36Sopenharmony_ci	[JZ4780_CLK_AHB2] = {
38062306a36Sopenharmony_ci		"ahb2", CGU_CLK_DIV,
38162306a36Sopenharmony_ci		.parents = { JZ4780_CLK_AHB2PMUX, -1, -1, -1 },
38262306a36Sopenharmony_ci		.div = { CGU_REG_CLOCKCONTROL, 12, 1, 4, 20, -1, -1 },
38362306a36Sopenharmony_ci	},
38462306a36Sopenharmony_ci
38562306a36Sopenharmony_ci	[JZ4780_CLK_PCLK] = {
38662306a36Sopenharmony_ci		"pclk", CGU_CLK_DIV,
38762306a36Sopenharmony_ci		.parents = { JZ4780_CLK_AHB2PMUX, -1, -1, -1 },
38862306a36Sopenharmony_ci		.div = { CGU_REG_CLOCKCONTROL, 16, 1, 4, 20, -1, -1 },
38962306a36Sopenharmony_ci	},
39062306a36Sopenharmony_ci
39162306a36Sopenharmony_ci	[JZ4780_CLK_DDR] = {
39262306a36Sopenharmony_ci		"ddr", CGU_CLK_MUX | CGU_CLK_DIV,
39362306a36Sopenharmony_ci		/*
39462306a36Sopenharmony_ci		 * Disabling DDR clock or its parents will render DRAM
39562306a36Sopenharmony_ci		 * inaccessible; mark it critical.
39662306a36Sopenharmony_ci		 */
39762306a36Sopenharmony_ci		.flags = CLK_IS_CRITICAL,
39862306a36Sopenharmony_ci		.parents = { -1, JZ4780_CLK_SCLKA, JZ4780_CLK_MPLL, -1 },
39962306a36Sopenharmony_ci		.mux = { CGU_REG_DDRCDR, 30, 2 },
40062306a36Sopenharmony_ci		.div = { CGU_REG_DDRCDR, 0, 1, 4, 29, 28, 27 },
40162306a36Sopenharmony_ci	},
40262306a36Sopenharmony_ci
40362306a36Sopenharmony_ci	[JZ4780_CLK_VPU] = {
40462306a36Sopenharmony_ci		"vpu", CGU_CLK_MUX | CGU_CLK_DIV | CGU_CLK_GATE,
40562306a36Sopenharmony_ci		.parents = { JZ4780_CLK_SCLKA, JZ4780_CLK_MPLL,
40662306a36Sopenharmony_ci			     JZ4780_CLK_EPLL, -1 },
40762306a36Sopenharmony_ci		.mux = { CGU_REG_VPUCDR, 30, 2 },
40862306a36Sopenharmony_ci		.div = { CGU_REG_VPUCDR, 0, 1, 4, 29, 28, 27 },
40962306a36Sopenharmony_ci		.gate = { CGU_REG_CLKGR1, 2 },
41062306a36Sopenharmony_ci	},
41162306a36Sopenharmony_ci
41262306a36Sopenharmony_ci	[JZ4780_CLK_I2SPLL] = {
41362306a36Sopenharmony_ci		"i2s_pll", CGU_CLK_MUX | CGU_CLK_DIV,
41462306a36Sopenharmony_ci		.parents = { JZ4780_CLK_SCLKA, JZ4780_CLK_EPLL, -1, -1 },
41562306a36Sopenharmony_ci		.mux = { CGU_REG_I2SCDR, 30, 1 },
41662306a36Sopenharmony_ci		.div = { CGU_REG_I2SCDR, 0, 1, 8, 29, 28, 27 },
41762306a36Sopenharmony_ci	},
41862306a36Sopenharmony_ci
41962306a36Sopenharmony_ci	[JZ4780_CLK_I2S] = {
42062306a36Sopenharmony_ci		"i2s", CGU_CLK_MUX,
42162306a36Sopenharmony_ci		.parents = { JZ4780_CLK_EXCLK, JZ4780_CLK_I2SPLL, -1, -1 },
42262306a36Sopenharmony_ci		.mux = { CGU_REG_I2SCDR, 31, 1 },
42362306a36Sopenharmony_ci	},
42462306a36Sopenharmony_ci
42562306a36Sopenharmony_ci	[JZ4780_CLK_LCD0PIXCLK] = {
42662306a36Sopenharmony_ci		"lcd0pixclk", CGU_CLK_MUX | CGU_CLK_DIV,
42762306a36Sopenharmony_ci		.parents = { JZ4780_CLK_SCLKA, JZ4780_CLK_MPLL,
42862306a36Sopenharmony_ci			     JZ4780_CLK_VPLL, -1 },
42962306a36Sopenharmony_ci		.mux = { CGU_REG_LP0CDR, 30, 2 },
43062306a36Sopenharmony_ci		.div = { CGU_REG_LP0CDR, 0, 1, 8, 28, 27, 26 },
43162306a36Sopenharmony_ci	},
43262306a36Sopenharmony_ci
43362306a36Sopenharmony_ci	[JZ4780_CLK_LCD1PIXCLK] = {
43462306a36Sopenharmony_ci		"lcd1pixclk", CGU_CLK_MUX | CGU_CLK_DIV,
43562306a36Sopenharmony_ci		.parents = { JZ4780_CLK_SCLKA, JZ4780_CLK_MPLL,
43662306a36Sopenharmony_ci			     JZ4780_CLK_VPLL, -1 },
43762306a36Sopenharmony_ci		.mux = { CGU_REG_LP1CDR, 30, 2 },
43862306a36Sopenharmony_ci		.div = { CGU_REG_LP1CDR, 0, 1, 8, 28, 27, 26 },
43962306a36Sopenharmony_ci	},
44062306a36Sopenharmony_ci
44162306a36Sopenharmony_ci	[JZ4780_CLK_MSCMUX] = {
44262306a36Sopenharmony_ci		"msc_mux", CGU_CLK_MUX,
44362306a36Sopenharmony_ci		.parents = { -1, JZ4780_CLK_SCLKA, JZ4780_CLK_MPLL, -1 },
44462306a36Sopenharmony_ci		.mux = { CGU_REG_MSC0CDR, 30, 2 },
44562306a36Sopenharmony_ci	},
44662306a36Sopenharmony_ci
44762306a36Sopenharmony_ci	[JZ4780_CLK_MSC0] = {
44862306a36Sopenharmony_ci		"msc0", CGU_CLK_DIV | CGU_CLK_GATE,
44962306a36Sopenharmony_ci		.parents = { JZ4780_CLK_MSCMUX, -1, -1, -1 },
45062306a36Sopenharmony_ci		.div = { CGU_REG_MSC0CDR, 0, 2, 8, 29, 28, 27 },
45162306a36Sopenharmony_ci		.gate = { CGU_REG_CLKGR0, 3 },
45262306a36Sopenharmony_ci	},
45362306a36Sopenharmony_ci
45462306a36Sopenharmony_ci	[JZ4780_CLK_MSC1] = {
45562306a36Sopenharmony_ci		"msc1", CGU_CLK_DIV | CGU_CLK_GATE,
45662306a36Sopenharmony_ci		.parents = { JZ4780_CLK_MSCMUX, -1, -1, -1 },
45762306a36Sopenharmony_ci		.div = { CGU_REG_MSC1CDR, 0, 2, 8, 29, 28, 27 },
45862306a36Sopenharmony_ci		.gate = { CGU_REG_CLKGR0, 11 },
45962306a36Sopenharmony_ci	},
46062306a36Sopenharmony_ci
46162306a36Sopenharmony_ci	[JZ4780_CLK_MSC2] = {
46262306a36Sopenharmony_ci		"msc2", CGU_CLK_DIV | CGU_CLK_GATE,
46362306a36Sopenharmony_ci		.parents = { JZ4780_CLK_MSCMUX, -1, -1, -1 },
46462306a36Sopenharmony_ci		.div = { CGU_REG_MSC2CDR, 0, 2, 8, 29, 28, 27 },
46562306a36Sopenharmony_ci		.gate = { CGU_REG_CLKGR0, 12 },
46662306a36Sopenharmony_ci	},
46762306a36Sopenharmony_ci
46862306a36Sopenharmony_ci	[JZ4780_CLK_UHC] = {
46962306a36Sopenharmony_ci		"uhc", CGU_CLK_MUX | CGU_CLK_DIV | CGU_CLK_GATE,
47062306a36Sopenharmony_ci		.parents = { JZ4780_CLK_SCLKA, JZ4780_CLK_MPLL,
47162306a36Sopenharmony_ci			     JZ4780_CLK_EPLL, JZ4780_CLK_OTGPHY },
47262306a36Sopenharmony_ci		.mux = { CGU_REG_UHCCDR, 30, 2 },
47362306a36Sopenharmony_ci		.div = { CGU_REG_UHCCDR, 0, 1, 8, 29, 28, 27 },
47462306a36Sopenharmony_ci		.gate = { CGU_REG_CLKGR0, 24 },
47562306a36Sopenharmony_ci	},
47662306a36Sopenharmony_ci
47762306a36Sopenharmony_ci	[JZ4780_CLK_SSIPLL] = {
47862306a36Sopenharmony_ci		"ssi_pll", CGU_CLK_MUX | CGU_CLK_DIV,
47962306a36Sopenharmony_ci		.parents = { JZ4780_CLK_SCLKA, JZ4780_CLK_MPLL, -1, -1 },
48062306a36Sopenharmony_ci		.mux = { CGU_REG_SSICDR, 30, 1 },
48162306a36Sopenharmony_ci		.div = { CGU_REG_SSICDR, 0, 1, 8, 29, 28, 27 },
48262306a36Sopenharmony_ci	},
48362306a36Sopenharmony_ci
48462306a36Sopenharmony_ci	[JZ4780_CLK_SSI] = {
48562306a36Sopenharmony_ci		"ssi", CGU_CLK_MUX,
48662306a36Sopenharmony_ci		.parents = { JZ4780_CLK_EXCLK, JZ4780_CLK_SSIPLL, -1, -1 },
48762306a36Sopenharmony_ci		.mux = { CGU_REG_SSICDR, 31, 1 },
48862306a36Sopenharmony_ci	},
48962306a36Sopenharmony_ci
49062306a36Sopenharmony_ci	[JZ4780_CLK_CIMMCLK] = {
49162306a36Sopenharmony_ci		"cim_mclk", CGU_CLK_MUX | CGU_CLK_DIV,
49262306a36Sopenharmony_ci		.parents = { JZ4780_CLK_SCLKA, JZ4780_CLK_MPLL, -1, -1 },
49362306a36Sopenharmony_ci		.mux = { CGU_REG_CIMCDR, 31, 1 },
49462306a36Sopenharmony_ci		.div = { CGU_REG_CIMCDR, 0, 1, 8, 30, 29, 28 },
49562306a36Sopenharmony_ci	},
49662306a36Sopenharmony_ci
49762306a36Sopenharmony_ci	[JZ4780_CLK_PCMPLL] = {
49862306a36Sopenharmony_ci		"pcm_pll", CGU_CLK_MUX | CGU_CLK_DIV,
49962306a36Sopenharmony_ci		.parents = { JZ4780_CLK_SCLKA, JZ4780_CLK_MPLL,
50062306a36Sopenharmony_ci			     JZ4780_CLK_EPLL, JZ4780_CLK_VPLL },
50162306a36Sopenharmony_ci		.mux = { CGU_REG_PCMCDR, 29, 2 },
50262306a36Sopenharmony_ci		.div = { CGU_REG_PCMCDR, 0, 1, 8, 28, 27, 26 },
50362306a36Sopenharmony_ci	},
50462306a36Sopenharmony_ci
50562306a36Sopenharmony_ci	[JZ4780_CLK_PCM] = {
50662306a36Sopenharmony_ci		"pcm", CGU_CLK_MUX | CGU_CLK_GATE,
50762306a36Sopenharmony_ci		.parents = { JZ4780_CLK_EXCLK, JZ4780_CLK_PCMPLL, -1, -1 },
50862306a36Sopenharmony_ci		.mux = { CGU_REG_PCMCDR, 31, 1 },
50962306a36Sopenharmony_ci		.gate = { CGU_REG_CLKGR1, 3 },
51062306a36Sopenharmony_ci	},
51162306a36Sopenharmony_ci
51262306a36Sopenharmony_ci	[JZ4780_CLK_GPU] = {
51362306a36Sopenharmony_ci		"gpu", CGU_CLK_MUX | CGU_CLK_DIV | CGU_CLK_GATE,
51462306a36Sopenharmony_ci		.parents = { -1, JZ4780_CLK_SCLKA, JZ4780_CLK_MPLL,
51562306a36Sopenharmony_ci			     JZ4780_CLK_EPLL },
51662306a36Sopenharmony_ci		.mux = { CGU_REG_GPUCDR, 30, 2 },
51762306a36Sopenharmony_ci		.div = { CGU_REG_GPUCDR, 0, 1, 4, 29, 28, 27 },
51862306a36Sopenharmony_ci		.gate = { CGU_REG_CLKGR1, 4 },
51962306a36Sopenharmony_ci	},
52062306a36Sopenharmony_ci
52162306a36Sopenharmony_ci	[JZ4780_CLK_HDMI] = {
52262306a36Sopenharmony_ci		"hdmi", CGU_CLK_MUX | CGU_CLK_DIV | CGU_CLK_GATE,
52362306a36Sopenharmony_ci		.parents = { JZ4780_CLK_SCLKA, JZ4780_CLK_MPLL,
52462306a36Sopenharmony_ci			     JZ4780_CLK_VPLL, -1 },
52562306a36Sopenharmony_ci		.mux = { CGU_REG_HDMICDR, 30, 2 },
52662306a36Sopenharmony_ci		.div = { CGU_REG_HDMICDR, 0, 1, 8, 29, 28, 26 },
52762306a36Sopenharmony_ci		.gate = { CGU_REG_CLKGR1, 9 },
52862306a36Sopenharmony_ci	},
52962306a36Sopenharmony_ci
53062306a36Sopenharmony_ci	[JZ4780_CLK_BCH] = {
53162306a36Sopenharmony_ci		"bch", CGU_CLK_MUX | CGU_CLK_DIV | CGU_CLK_GATE,
53262306a36Sopenharmony_ci		.parents = { -1, JZ4780_CLK_SCLKA, JZ4780_CLK_MPLL,
53362306a36Sopenharmony_ci			     JZ4780_CLK_EPLL },
53462306a36Sopenharmony_ci		.mux = { CGU_REG_BCHCDR, 30, 2 },
53562306a36Sopenharmony_ci		.div = { CGU_REG_BCHCDR, 0, 1, 4, 29, 28, 27 },
53662306a36Sopenharmony_ci		.gate = { CGU_REG_CLKGR0, 1 },
53762306a36Sopenharmony_ci	},
53862306a36Sopenharmony_ci
53962306a36Sopenharmony_ci	[JZ4780_CLK_EXCLK_DIV512] = {
54062306a36Sopenharmony_ci		"exclk_div512", CGU_CLK_FIXDIV,
54162306a36Sopenharmony_ci		.parents = { JZ4780_CLK_EXCLK },
54262306a36Sopenharmony_ci		.fixdiv = { 512 },
54362306a36Sopenharmony_ci	},
54462306a36Sopenharmony_ci
54562306a36Sopenharmony_ci	[JZ4780_CLK_RTC] = {
54662306a36Sopenharmony_ci		"rtc_ercs", CGU_CLK_MUX | CGU_CLK_GATE,
54762306a36Sopenharmony_ci		.parents = { JZ4780_CLK_EXCLK_DIV512, JZ4780_CLK_RTCLK },
54862306a36Sopenharmony_ci		.mux = { CGU_REG_OPCR, 2, 1},
54962306a36Sopenharmony_ci	},
55062306a36Sopenharmony_ci
55162306a36Sopenharmony_ci	/* Gate-only clocks */
55262306a36Sopenharmony_ci
55362306a36Sopenharmony_ci	[JZ4780_CLK_NEMC] = {
55462306a36Sopenharmony_ci		"nemc", CGU_CLK_GATE,
55562306a36Sopenharmony_ci		.parents = { JZ4780_CLK_AHB2, -1, -1, -1 },
55662306a36Sopenharmony_ci		.gate = { CGU_REG_CLKGR0, 0 },
55762306a36Sopenharmony_ci	},
55862306a36Sopenharmony_ci
55962306a36Sopenharmony_ci	[JZ4780_CLK_OTG0] = {
56062306a36Sopenharmony_ci		"otg0", CGU_CLK_GATE,
56162306a36Sopenharmony_ci		.parents = { JZ4780_CLK_EXCLK, -1, -1, -1 },
56262306a36Sopenharmony_ci		.gate = { CGU_REG_CLKGR0, 2 },
56362306a36Sopenharmony_ci	},
56462306a36Sopenharmony_ci
56562306a36Sopenharmony_ci	[JZ4780_CLK_SSI0] = {
56662306a36Sopenharmony_ci		"ssi0", CGU_CLK_GATE,
56762306a36Sopenharmony_ci		.parents = { JZ4780_CLK_SSI, -1, -1, -1 },
56862306a36Sopenharmony_ci		.gate = { CGU_REG_CLKGR0, 4 },
56962306a36Sopenharmony_ci	},
57062306a36Sopenharmony_ci
57162306a36Sopenharmony_ci	[JZ4780_CLK_SMB0] = {
57262306a36Sopenharmony_ci		"smb0", CGU_CLK_GATE,
57362306a36Sopenharmony_ci		.parents = { JZ4780_CLK_PCLK, -1, -1, -1 },
57462306a36Sopenharmony_ci		.gate = { CGU_REG_CLKGR0, 5 },
57562306a36Sopenharmony_ci	},
57662306a36Sopenharmony_ci
57762306a36Sopenharmony_ci	[JZ4780_CLK_SMB1] = {
57862306a36Sopenharmony_ci		"smb1", CGU_CLK_GATE,
57962306a36Sopenharmony_ci		.parents = { JZ4780_CLK_PCLK, -1, -1, -1 },
58062306a36Sopenharmony_ci		.gate = { CGU_REG_CLKGR0, 6 },
58162306a36Sopenharmony_ci	},
58262306a36Sopenharmony_ci
58362306a36Sopenharmony_ci	[JZ4780_CLK_SCC] = {
58462306a36Sopenharmony_ci		"scc", CGU_CLK_GATE,
58562306a36Sopenharmony_ci		.parents = { JZ4780_CLK_EXCLK, -1, -1, -1 },
58662306a36Sopenharmony_ci		.gate = { CGU_REG_CLKGR0, 7 },
58762306a36Sopenharmony_ci	},
58862306a36Sopenharmony_ci
58962306a36Sopenharmony_ci	[JZ4780_CLK_AIC] = {
59062306a36Sopenharmony_ci		"aic", CGU_CLK_GATE,
59162306a36Sopenharmony_ci		.parents = { JZ4780_CLK_EXCLK, -1, -1, -1 },
59262306a36Sopenharmony_ci		.gate = { CGU_REG_CLKGR0, 8 },
59362306a36Sopenharmony_ci	},
59462306a36Sopenharmony_ci
59562306a36Sopenharmony_ci	[JZ4780_CLK_TSSI0] = {
59662306a36Sopenharmony_ci		"tssi0", CGU_CLK_GATE,
59762306a36Sopenharmony_ci		.parents = { JZ4780_CLK_EXCLK, -1, -1, -1 },
59862306a36Sopenharmony_ci		.gate = { CGU_REG_CLKGR0, 9 },
59962306a36Sopenharmony_ci	},
60062306a36Sopenharmony_ci
60162306a36Sopenharmony_ci	[JZ4780_CLK_OWI] = {
60262306a36Sopenharmony_ci		"owi", CGU_CLK_GATE,
60362306a36Sopenharmony_ci		.parents = { JZ4780_CLK_EXCLK, -1, -1, -1 },
60462306a36Sopenharmony_ci		.gate = { CGU_REG_CLKGR0, 10 },
60562306a36Sopenharmony_ci	},
60662306a36Sopenharmony_ci
60762306a36Sopenharmony_ci	[JZ4780_CLK_KBC] = {
60862306a36Sopenharmony_ci		"kbc", CGU_CLK_GATE,
60962306a36Sopenharmony_ci		.parents = { JZ4780_CLK_EXCLK, -1, -1, -1 },
61062306a36Sopenharmony_ci		.gate = { CGU_REG_CLKGR0, 13 },
61162306a36Sopenharmony_ci	},
61262306a36Sopenharmony_ci
61362306a36Sopenharmony_ci	[JZ4780_CLK_SADC] = {
61462306a36Sopenharmony_ci		"sadc", CGU_CLK_GATE,
61562306a36Sopenharmony_ci		.parents = { JZ4780_CLK_EXCLK, -1, -1, -1 },
61662306a36Sopenharmony_ci		.gate = { CGU_REG_CLKGR0, 14 },
61762306a36Sopenharmony_ci	},
61862306a36Sopenharmony_ci
61962306a36Sopenharmony_ci	[JZ4780_CLK_UART0] = {
62062306a36Sopenharmony_ci		"uart0", CGU_CLK_GATE,
62162306a36Sopenharmony_ci		.parents = { JZ4780_CLK_EXCLK, -1, -1, -1 },
62262306a36Sopenharmony_ci		.gate = { CGU_REG_CLKGR0, 15 },
62362306a36Sopenharmony_ci	},
62462306a36Sopenharmony_ci
62562306a36Sopenharmony_ci	[JZ4780_CLK_UART1] = {
62662306a36Sopenharmony_ci		"uart1", CGU_CLK_GATE,
62762306a36Sopenharmony_ci		.parents = { JZ4780_CLK_EXCLK, -1, -1, -1 },
62862306a36Sopenharmony_ci		.gate = { CGU_REG_CLKGR0, 16 },
62962306a36Sopenharmony_ci	},
63062306a36Sopenharmony_ci
63162306a36Sopenharmony_ci	[JZ4780_CLK_UART2] = {
63262306a36Sopenharmony_ci		"uart2", CGU_CLK_GATE,
63362306a36Sopenharmony_ci		.parents = { JZ4780_CLK_EXCLK, -1, -1, -1 },
63462306a36Sopenharmony_ci		.gate = { CGU_REG_CLKGR0, 17 },
63562306a36Sopenharmony_ci	},
63662306a36Sopenharmony_ci
63762306a36Sopenharmony_ci	[JZ4780_CLK_UART3] = {
63862306a36Sopenharmony_ci		"uart3", CGU_CLK_GATE,
63962306a36Sopenharmony_ci		.parents = { JZ4780_CLK_EXCLK, -1, -1, -1 },
64062306a36Sopenharmony_ci		.gate = { CGU_REG_CLKGR0, 18 },
64162306a36Sopenharmony_ci	},
64262306a36Sopenharmony_ci
64362306a36Sopenharmony_ci	[JZ4780_CLK_SSI1] = {
64462306a36Sopenharmony_ci		"ssi1", CGU_CLK_GATE,
64562306a36Sopenharmony_ci		.parents = { JZ4780_CLK_SSI, -1, -1, -1 },
64662306a36Sopenharmony_ci		.gate = { CGU_REG_CLKGR0, 19 },
64762306a36Sopenharmony_ci	},
64862306a36Sopenharmony_ci
64962306a36Sopenharmony_ci	[JZ4780_CLK_SSI2] = {
65062306a36Sopenharmony_ci		"ssi2", CGU_CLK_GATE,
65162306a36Sopenharmony_ci		.parents = { JZ4780_CLK_SSI, -1, -1, -1 },
65262306a36Sopenharmony_ci		.gate = { CGU_REG_CLKGR0, 20 },
65362306a36Sopenharmony_ci	},
65462306a36Sopenharmony_ci
65562306a36Sopenharmony_ci	[JZ4780_CLK_PDMA] = {
65662306a36Sopenharmony_ci		"pdma", CGU_CLK_GATE,
65762306a36Sopenharmony_ci		.parents = { JZ4780_CLK_EXCLK, -1, -1, -1 },
65862306a36Sopenharmony_ci		.gate = { CGU_REG_CLKGR0, 21 },
65962306a36Sopenharmony_ci	},
66062306a36Sopenharmony_ci
66162306a36Sopenharmony_ci	[JZ4780_CLK_GPS] = {
66262306a36Sopenharmony_ci		"gps", CGU_CLK_GATE,
66362306a36Sopenharmony_ci		.parents = { JZ4780_CLK_EXCLK, -1, -1, -1 },
66462306a36Sopenharmony_ci		.gate = { CGU_REG_CLKGR0, 22 },
66562306a36Sopenharmony_ci	},
66662306a36Sopenharmony_ci
66762306a36Sopenharmony_ci	[JZ4780_CLK_MAC] = {
66862306a36Sopenharmony_ci		"mac", CGU_CLK_GATE,
66962306a36Sopenharmony_ci		.parents = { JZ4780_CLK_EXCLK, -1, -1, -1 },
67062306a36Sopenharmony_ci		.gate = { CGU_REG_CLKGR0, 23 },
67162306a36Sopenharmony_ci	},
67262306a36Sopenharmony_ci
67362306a36Sopenharmony_ci	[JZ4780_CLK_SMB2] = {
67462306a36Sopenharmony_ci		"smb2", CGU_CLK_GATE,
67562306a36Sopenharmony_ci		.parents = { JZ4780_CLK_PCLK, -1, -1, -1 },
67662306a36Sopenharmony_ci		.gate = { CGU_REG_CLKGR0, 24 },
67762306a36Sopenharmony_ci	},
67862306a36Sopenharmony_ci
67962306a36Sopenharmony_ci	[JZ4780_CLK_CIM] = {
68062306a36Sopenharmony_ci		"cim", CGU_CLK_GATE,
68162306a36Sopenharmony_ci		.parents = { JZ4780_CLK_EXCLK, -1, -1, -1 },
68262306a36Sopenharmony_ci		.gate = { CGU_REG_CLKGR0, 26 },
68362306a36Sopenharmony_ci	},
68462306a36Sopenharmony_ci
68562306a36Sopenharmony_ci	[JZ4780_CLK_LCD] = {
68662306a36Sopenharmony_ci		"lcd", CGU_CLK_GATE,
68762306a36Sopenharmony_ci		.parents = { JZ4780_CLK_EXCLK, -1, -1, -1 },
68862306a36Sopenharmony_ci		.gate = { CGU_REG_CLKGR0, 28 },
68962306a36Sopenharmony_ci	},
69062306a36Sopenharmony_ci
69162306a36Sopenharmony_ci	[JZ4780_CLK_TVE] = {
69262306a36Sopenharmony_ci		"tve", CGU_CLK_GATE,
69362306a36Sopenharmony_ci		.parents = { JZ4780_CLK_LCD, -1, -1, -1 },
69462306a36Sopenharmony_ci		.gate = { CGU_REG_CLKGR0, 27 },
69562306a36Sopenharmony_ci	},
69662306a36Sopenharmony_ci
69762306a36Sopenharmony_ci	[JZ4780_CLK_IPU] = {
69862306a36Sopenharmony_ci		"ipu", CGU_CLK_GATE,
69962306a36Sopenharmony_ci		.parents = { JZ4780_CLK_EXCLK, -1, -1, -1 },
70062306a36Sopenharmony_ci		.gate = { CGU_REG_CLKGR0, 29 },
70162306a36Sopenharmony_ci	},
70262306a36Sopenharmony_ci
70362306a36Sopenharmony_ci	[JZ4780_CLK_DDR0] = {
70462306a36Sopenharmony_ci		"ddr0", CGU_CLK_GATE,
70562306a36Sopenharmony_ci		.parents = { JZ4780_CLK_DDR, -1, -1, -1 },
70662306a36Sopenharmony_ci		.gate = { CGU_REG_CLKGR0, 30 },
70762306a36Sopenharmony_ci	},
70862306a36Sopenharmony_ci
70962306a36Sopenharmony_ci	[JZ4780_CLK_DDR1] = {
71062306a36Sopenharmony_ci		"ddr1", CGU_CLK_GATE,
71162306a36Sopenharmony_ci		.parents = { JZ4780_CLK_DDR, -1, -1, -1 },
71262306a36Sopenharmony_ci		.gate = { CGU_REG_CLKGR0, 31 },
71362306a36Sopenharmony_ci	},
71462306a36Sopenharmony_ci
71562306a36Sopenharmony_ci	[JZ4780_CLK_SMB3] = {
71662306a36Sopenharmony_ci		"smb3", CGU_CLK_GATE,
71762306a36Sopenharmony_ci		.parents = { JZ4780_CLK_PCLK, -1, -1, -1 },
71862306a36Sopenharmony_ci		.gate = { CGU_REG_CLKGR1, 0 },
71962306a36Sopenharmony_ci	},
72062306a36Sopenharmony_ci
72162306a36Sopenharmony_ci	[JZ4780_CLK_TSSI1] = {
72262306a36Sopenharmony_ci		"tssi1", CGU_CLK_GATE,
72362306a36Sopenharmony_ci		.parents = { JZ4780_CLK_EXCLK, -1, -1, -1 },
72462306a36Sopenharmony_ci		.gate = { CGU_REG_CLKGR1, 1 },
72562306a36Sopenharmony_ci	},
72662306a36Sopenharmony_ci
72762306a36Sopenharmony_ci	[JZ4780_CLK_COMPRESS] = {
72862306a36Sopenharmony_ci		"compress", CGU_CLK_GATE,
72962306a36Sopenharmony_ci		.parents = { JZ4780_CLK_EXCLK, -1, -1, -1 },
73062306a36Sopenharmony_ci		.gate = { CGU_REG_CLKGR1, 5 },
73162306a36Sopenharmony_ci	},
73262306a36Sopenharmony_ci
73362306a36Sopenharmony_ci	[JZ4780_CLK_AIC1] = {
73462306a36Sopenharmony_ci		"aic1", CGU_CLK_GATE,
73562306a36Sopenharmony_ci		.parents = { JZ4780_CLK_EXCLK, -1, -1, -1 },
73662306a36Sopenharmony_ci		.gate = { CGU_REG_CLKGR1, 6 },
73762306a36Sopenharmony_ci	},
73862306a36Sopenharmony_ci
73962306a36Sopenharmony_ci	[JZ4780_CLK_GPVLC] = {
74062306a36Sopenharmony_ci		"gpvlc", CGU_CLK_GATE,
74162306a36Sopenharmony_ci		.parents = { JZ4780_CLK_EXCLK, -1, -1, -1 },
74262306a36Sopenharmony_ci		.gate = { CGU_REG_CLKGR1, 7 },
74362306a36Sopenharmony_ci	},
74462306a36Sopenharmony_ci
74562306a36Sopenharmony_ci	[JZ4780_CLK_OTG1] = {
74662306a36Sopenharmony_ci		"otg1", CGU_CLK_GATE,
74762306a36Sopenharmony_ci		.parents = { JZ4780_CLK_EXCLK, -1, -1, -1 },
74862306a36Sopenharmony_ci		.gate = { CGU_REG_CLKGR1, 8 },
74962306a36Sopenharmony_ci	},
75062306a36Sopenharmony_ci
75162306a36Sopenharmony_ci	[JZ4780_CLK_UART4] = {
75262306a36Sopenharmony_ci		"uart4", CGU_CLK_GATE,
75362306a36Sopenharmony_ci		.parents = { JZ4780_CLK_EXCLK, -1, -1, -1 },
75462306a36Sopenharmony_ci		.gate = { CGU_REG_CLKGR1, 10 },
75562306a36Sopenharmony_ci	},
75662306a36Sopenharmony_ci
75762306a36Sopenharmony_ci	[JZ4780_CLK_AHBMON] = {
75862306a36Sopenharmony_ci		"ahb_mon", CGU_CLK_GATE,
75962306a36Sopenharmony_ci		.parents = { JZ4780_CLK_EXCLK, -1, -1, -1 },
76062306a36Sopenharmony_ci		.gate = { CGU_REG_CLKGR1, 11 },
76162306a36Sopenharmony_ci	},
76262306a36Sopenharmony_ci
76362306a36Sopenharmony_ci	[JZ4780_CLK_SMB4] = {
76462306a36Sopenharmony_ci		"smb4", CGU_CLK_GATE,
76562306a36Sopenharmony_ci		.parents = { JZ4780_CLK_PCLK, -1, -1, -1 },
76662306a36Sopenharmony_ci		.gate = { CGU_REG_CLKGR1, 12 },
76762306a36Sopenharmony_ci	},
76862306a36Sopenharmony_ci
76962306a36Sopenharmony_ci	[JZ4780_CLK_DES] = {
77062306a36Sopenharmony_ci		"des", CGU_CLK_GATE,
77162306a36Sopenharmony_ci		.parents = { JZ4780_CLK_EXCLK, -1, -1, -1 },
77262306a36Sopenharmony_ci		.gate = { CGU_REG_CLKGR1, 13 },
77362306a36Sopenharmony_ci	},
77462306a36Sopenharmony_ci
77562306a36Sopenharmony_ci	[JZ4780_CLK_X2D] = {
77662306a36Sopenharmony_ci		"x2d", CGU_CLK_GATE,
77762306a36Sopenharmony_ci		.parents = { JZ4780_CLK_EXCLK, -1, -1, -1 },
77862306a36Sopenharmony_ci		.gate = { CGU_REG_CLKGR1, 14 },
77962306a36Sopenharmony_ci	},
78062306a36Sopenharmony_ci
78162306a36Sopenharmony_ci	[JZ4780_CLK_CORE1] = {
78262306a36Sopenharmony_ci		"core1", CGU_CLK_CUSTOM,
78362306a36Sopenharmony_ci		.parents = { JZ4780_CLK_CPU, -1, -1, -1 },
78462306a36Sopenharmony_ci		.custom = { &jz4780_core1_ops },
78562306a36Sopenharmony_ci	},
78662306a36Sopenharmony_ci
78762306a36Sopenharmony_ci};
78862306a36Sopenharmony_ci
78962306a36Sopenharmony_cistatic void __init jz4780_cgu_init(struct device_node *np)
79062306a36Sopenharmony_ci{
79162306a36Sopenharmony_ci	int retval;
79262306a36Sopenharmony_ci
79362306a36Sopenharmony_ci	cgu = ingenic_cgu_new(jz4780_cgu_clocks,
79462306a36Sopenharmony_ci			      ARRAY_SIZE(jz4780_cgu_clocks), np);
79562306a36Sopenharmony_ci	if (!cgu) {
79662306a36Sopenharmony_ci		pr_err("%s: failed to initialise CGU\n", __func__);
79762306a36Sopenharmony_ci		return;
79862306a36Sopenharmony_ci	}
79962306a36Sopenharmony_ci
80062306a36Sopenharmony_ci	retval = ingenic_cgu_register_clocks(cgu);
80162306a36Sopenharmony_ci	if (retval) {
80262306a36Sopenharmony_ci		pr_err("%s: failed to register CGU Clocks\n", __func__);
80362306a36Sopenharmony_ci		return;
80462306a36Sopenharmony_ci	}
80562306a36Sopenharmony_ci
80662306a36Sopenharmony_ci	ingenic_cgu_register_syscore_ops(cgu);
80762306a36Sopenharmony_ci}
80862306a36Sopenharmony_ciCLK_OF_DECLARE_DRIVER(jz4780_cgu, "ingenic,jz4780-cgu", jz4780_cgu_init);
809