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