xref: /netbsd-src/sys/arch/arm/amlogic/mesong12_clkc.c (revision 32a2c5d54343337fb84875c915b3a51e278a194c)
1*32a2c5d5Sjoerg /* $NetBSD: mesong12_clkc.c,v 1.6 2021/02/04 22:55:36 joerg Exp $ */
28afae5d5Sryo 
38afae5d5Sryo /*-
48afae5d5Sryo  * Copyright (c) 2019 Jared McNeill <jmcneill@invisible.ca>
58afae5d5Sryo  * All rights reserved.
68afae5d5Sryo  *
78afae5d5Sryo  * Redistribution and use in source and binary forms, with or without
88afae5d5Sryo  * modification, are permitted provided that the following conditions
98afae5d5Sryo  * are met:
108afae5d5Sryo  * 1. Redistributions of source code must retain the above copyright
118afae5d5Sryo  *    notice, this list of conditions and the following disclaimer.
128afae5d5Sryo  * 2. Redistributions in binary form must reproduce the above copyright
138afae5d5Sryo  *    notice, this list of conditions and the following disclaimer in the
148afae5d5Sryo  *    documentation and/or other materials provided with the distribution.
158afae5d5Sryo  *
168afae5d5Sryo  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
178afae5d5Sryo  * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
188afae5d5Sryo  * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
198afae5d5Sryo  * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
208afae5d5Sryo  * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
218afae5d5Sryo  * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
228afae5d5Sryo  * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
238afae5d5Sryo  * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
248afae5d5Sryo  * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
258afae5d5Sryo  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
268afae5d5Sryo  * SUCH DAMAGE.
278afae5d5Sryo  */
288afae5d5Sryo 
298afae5d5Sryo #include <sys/cdefs.h>
30*32a2c5d5Sjoerg __KERNEL_RCSID(0, "$NetBSD: mesong12_clkc.c,v 1.6 2021/02/04 22:55:36 joerg Exp $");
318afae5d5Sryo 
328afae5d5Sryo #include <sys/param.h>
338afae5d5Sryo #include <sys/types.h>
348afae5d5Sryo #include <sys/bus.h>
358afae5d5Sryo #include <sys/device.h>
368afae5d5Sryo 
378afae5d5Sryo #include <dev/fdt/fdtvar.h>
388afae5d5Sryo 
398afae5d5Sryo #include <arm/amlogic/meson_clk.h>
408afae5d5Sryo #include <arm/amlogic/mesong12_clkc.h>
418afae5d5Sryo 
428afae5d5Sryo #define	CBUS_REG(x)		((x) << 2)
438afae5d5Sryo 
448afae5d5Sryo #define HHI_GP0_PLL_CNTL0	CBUS_REG(0x10)
458afae5d5Sryo #define HHI_GP0_PLL_CNTL1	CBUS_REG(0x11)
468afae5d5Sryo #define HHI_GP0_PLL_CNTL2	CBUS_REG(0x12)
478afae5d5Sryo #define HHI_GP0_PLL_CNTL3	CBUS_REG(0x13)
488afae5d5Sryo #define HHI_GP0_PLL_CNTL4	CBUS_REG(0x14)
498afae5d5Sryo #define HHI_GP0_PLL_CNTL5	CBUS_REG(0x15)
508afae5d5Sryo #define HHI_GP0_PLL_CNTL6	CBUS_REG(0x16)
518afae5d5Sryo #define HHI_GP1_PLL_CNTL0	CBUS_REG(0x18)
528afae5d5Sryo #define HHI_GP1_PLL_CNTL1	CBUS_REG(0x19)
538afae5d5Sryo #define HHI_PCIE_PLL_CNTL0	CBUS_REG(0x26)
548afae5d5Sryo #define  HHI_PCIE_PLL_CNTL0_PCIE_APLL_LOCK		__BIT(31)
558afae5d5Sryo #define  HHI_PCIE_PLL_CNTL0_PCIE_HCSL_CAL_DONE		__BIT(30)
568afae5d5Sryo #define  HHI_PCIE_PLL_CNTL0_PCIE_APLL_RESET		__BIT(29)
578afae5d5Sryo #define  HHI_PCIE_PLL_CNTL0_PCIE_APLL_EN		__BIT(28)
588afae5d5Sryo #define  HHI_PCIE_PLL_CNTL0_PCIE_APLL_VCO_DIV_SEL	__BIT(27)
598afae5d5Sryo #define  HHI_PCIE_PLL_CNTL0_PCIE_APLL_AFC_START		__BIT(26)
608afae5d5Sryo #define  HHI_PCIE_PLL_CNTL0_PCIE_APLL_OD		__BITS(20,16)
618afae5d5Sryo #define  HHI_PCIE_PLL_CNTL0_PCIE_APLL_PREDIV_SEL	__BITS(14,10)
628afae5d5Sryo #define  HHI_PCIE_PLL_CNTL0_PCIE_APLL_FBKDIV		__BITS(7,0)
638afae5d5Sryo #define HHI_PCIE_PLL_CNTL1	CBUS_REG(0x27)
648afae5d5Sryo #define  HHI_PCIE_PLL_CNTL1_PCIE_APLL_SDM_EN		__BIT(12)
658afae5d5Sryo #define  HHI_PCIE_PLL_CNTL1_PCIE_APLL_SDM_FRAC		__BITS(11,0)
668afae5d5Sryo #define HHI_PCIE_PLL_CNTL2	CBUS_REG(0x28)
678afae5d5Sryo #define  HHI_PCIE_PLL_CNTL2_PCIE_APLL_SSC_DEP_SEL	__BITS(31,28)
688afae5d5Sryo #define  HHI_PCIE_PLL_CNTL2_PCIE_APLL_SSC_FREF_SEL	__BITS(25,24)
698afae5d5Sryo #define  HHI_PCIE_PLL_CNTL2_PCIE_APLL_SSC_MODE		__BITS(23,22)
708afae5d5Sryo #define  HHI_PCIE_PLL_CNTL2_PCIE_APLL_SSC_OFFSET	__BITS(21,20)
718afae5d5Sryo #define  HHI_PCIE_PLL_CNTL2_PCIE_APLL_STR_M		__BITS(19,18)
728afae5d5Sryo #define  HHI_PCIE_PLL_CNTL2_PCIE_APLL_RESERVE		__BITS(15,0)
738afae5d5Sryo #define HHI_PCIE_PLL_CNTL3	CBUS_REG(0x29)
748afae5d5Sryo #define  HHI_PCIE_PLL_CNTL3_PCIE_APLL_AFC_BYPASS_EN	__BIT(31)
758afae5d5Sryo #define  HHI_PCIE_PLL_CNTL3_PCIE_APLL_AFC_HOLD_T	__BITS(29,28)
768afae5d5Sryo #define  HHI_PCIE_PLL_CNTL3_PCIE_APLL_AFC_IN		__BITS(26,20)
778afae5d5Sryo #define  HHI_PCIE_PLL_CNTL3_PCIE_APLL_AFC_NT		__BIT(19)
788afae5d5Sryo #define  HHI_PCIE_PLL_CNTL3_PCIE_APLL_AFC_DIV		__BITS(18,17)
798afae5d5Sryo #define  HHI_PCIE_PLL_CNTL3_PCIE_APLL_BIAS_LPF_EN	__BIT(16)
808afae5d5Sryo #define  HHI_PCIE_PLL_CNTL3_PCIE_APLL_CP_ICAP		__BITS(15,12)
818afae5d5Sryo #define  HHI_PCIE_PLL_CNTL3_PCIE_APLL_CP_IRES		__BITS(11,8)
828afae5d5Sryo #define  HHI_PCIE_PLL_CNTL3_PCIE_APLL_CPI		__BITS(5,4)
838afae5d5Sryo #define HHI_PCIE_PLL_CNTL4	CBUS_REG(0x2a)
848afae5d5Sryo #define  HHI_PCIE_PLL_CNTL4_PCIE_APLL_SHIFT_EN		__BIT(31)
858afae5d5Sryo #define  HHI_PCIE_PLL_CNTL4_PCIE_APLL_SHIFT_T		__BITS(27,26)
868afae5d5Sryo #define  HHI_PCIE_PLL_CNTL4_PCIE_APLL_SHIFT_V		__BITS(25,24)
878afae5d5Sryo #define  HHI_PCIE_PLL_CNTL4_PCIE_APLL_VCTRL_MON_EN	__BIT(23)
888afae5d5Sryo #define  HHI_PCIE_PLL_CNTL4_PCIE_APLL_LPF_CAP		__BITS(21,20)
898afae5d5Sryo #define  HHI_PCIE_PLL_CNTL4_PCIE_APLL_LPF_CAPADJ	__BITS(19,16)
908afae5d5Sryo #define  HHI_PCIE_PLL_CNTL4_PCIE_APLL_LPF_RES		__BITS(13,12)
918afae5d5Sryo #define  HHI_PCIE_PLL_CNTL4_PCIE_APLL_LPF_SF		__BIT(11)
928afae5d5Sryo #define  HHI_PCIE_PLL_CNTL4_PCIE_APLL_LVR_OD_EN		__BIT(10)
938afae5d5Sryo #define  HHI_PCIE_PLL_CNTL4_PCIE_APLL_REFCLK_MON_EN	__BIT(9)
948afae5d5Sryo #define  HHI_PCIE_PLL_CNTL4_PCIE_APLL_FBKCLK_MON_EN	__BIT(8)
958afae5d5Sryo #define  HHI_PCIE_PLL_CNTL4_PCIE_APLL_LOAD		__BIT(7)
968afae5d5Sryo #define  HHI_PCIE_PLL_CNTL4_PCIE_APLL_LOAD_EN		__BIT(6)
978afae5d5Sryo #define HHI_PCIE_PLL_CNTL5	CBUS_REG(0x2b)
988afae5d5Sryo #define  HHI_PCIE_PLL_CNTL5_PCIE_HCSL_ADJ_LDO		__BITS(30,28)
998afae5d5Sryo #define  HHI_PCIE_PLL_CNTL5_PCIE_HCSL_BGP_EN		__BIT(27)
1008afae5d5Sryo #define  HHI_PCIE_PLL_CNTL5_PCIE_HCSL_BGR_ADJ		__BITS(24,20)
1018afae5d5Sryo #define  HHI_PCIE_PLL_CNTL5_PCIE_HCSL_BGR_START		__BIT(19)
1028afae5d5Sryo #define  HHI_PCIE_PLL_CNTL5_PCIE_HCSL_BGR_VREF		__BITS(16,12)
1038afae5d5Sryo #define  HHI_PCIE_PLL_CNTL5_PCIE_HCSL_BY_IMP_IN		__BITS(11,8)
1048afae5d5Sryo #define  HHI_PCIE_PLL_CNTL5_PCIE_HCSL_BY_IMP		__BIT(7)
1058afae5d5Sryo #define  HHI_PCIE_PLL_CNTL5_PCIE_HCSL_CAL_EN		__BIT(6)
1068afae5d5Sryo #define  HHI_PCIE_PLL_CNTL5_PCIE_HCSL_CAL_RSTN		__BIT(5)
1078afae5d5Sryo #define  HHI_PCIE_PLL_CNTL5_PCIE_HCSL_EDGEDRV_EN	__BIT(4)
1088afae5d5Sryo #define  HHI_PCIE_PLL_CNTL5_PCIE_HCSL_EN0		__BIT(3)
1098afae5d5Sryo #define  HHI_PCIE_PLL_CNTL5_PCIE_HCSL_IN_EN		__BIT(2)
1108afae5d5Sryo #define  HHI_PCIE_PLL_CNTL5_PCIE_HCSL_SEL_PW		__BIT(1)
1118afae5d5Sryo #define  HHI_PCIE_PLL_CNTL5_PCIE_HCSL_SEL_STR		__BIT(0)
1128afae5d5Sryo 
1138afae5d5Sryo #define HHI_HIFI_PLL_CNTL0	CBUS_REG(0x36)
1148afae5d5Sryo #define HHI_HIFI_PLL_CNTL1	CBUS_REG(0x37)
1158afae5d5Sryo #define HHI_HIFI_PLL_CNTL2	CBUS_REG(0x38)
1168afae5d5Sryo #define HHI_HIFI_PLL_CNTL3	CBUS_REG(0x39)
1178afae5d5Sryo #define HHI_HIFI_PLL_CNTL4	CBUS_REG(0x3a)
1188afae5d5Sryo #define HHI_HIFI_PLL_CNTL5	CBUS_REG(0x3b)
1198afae5d5Sryo #define HHI_HIFI_PLL_CNTL6	CBUS_REG(0x3c)
1208afae5d5Sryo #define HHI_MEM_PD_REG0		CBUS_REG(0x40)
1218afae5d5Sryo #define HHI_GCLK_MPEG0		CBUS_REG(0x50)
1228afae5d5Sryo #define HHI_GCLK_MPEG1		CBUS_REG(0x51)
1238afae5d5Sryo #define HHI_GCLK_MPEG2		CBUS_REG(0x52)
1248afae5d5Sryo #define HHI_GCLK_OTHER		CBUS_REG(0x54)
1258afae5d5Sryo #define HHI_GCLK_OTHER2		CBUS_REG(0x55)
1268afae5d5Sryo #define HHI_SYS_CPU_CLK_CNTL1	CBUS_REG(0x57)
1278afae5d5Sryo #define HHI_MPEG_CLK_CNTL	CBUS_REG(0x5d)
1288afae5d5Sryo #define HHI_TS_CLK_CNTL		CBUS_REG(0x64)
1298afae5d5Sryo #define HHI_SYS_CPU_CLK_CNTL0	CBUS_REG(0x67)
1308afae5d5Sryo #define HHI_VID_PLL_CLK_DIV	CBUS_REG(0x68)
1318afae5d5Sryo #define HHI_SYS_CPUB_CLK_CNTL1	CBUS_REG(0x80)
1328afae5d5Sryo #define HHI_SYS_CPUB_CLK_CNTL	CBUS_REG(0x82)
1338afae5d5Sryo #define HHI_NAND_CLK_CNTL	CBUS_REG(0x97)
1348afae5d5Sryo #define HHI_SD_EMMC_CLK_CNTL	CBUS_REG(0x99)
1358afae5d5Sryo #define HHI_MPLL_CNTL0		CBUS_REG(0x9e)
1368afae5d5Sryo #define HHI_MPLL_CNTL1		CBUS_REG(0x9f)
1378afae5d5Sryo #define HHI_MPLL_CNTL2		CBUS_REG(0xa0)
1388afae5d5Sryo #define HHI_MPLL_CNTL3		CBUS_REG(0xa1)
1398afae5d5Sryo #define HHI_MPLL_CNTL4		CBUS_REG(0xa2)
1408afae5d5Sryo #define HHI_MPLL_CNTL5		CBUS_REG(0xa3)
1418afae5d5Sryo #define HHI_MPLL_CNTL6		CBUS_REG(0xa4)
1428afae5d5Sryo #define HHI_MPLL_CNTL7		CBUS_REG(0xa5)
1438afae5d5Sryo #define HHI_MPLL_CNTL8		CBUS_REG(0xa6)
1448afae5d5Sryo #define HHI_FIX_PLL_CNTL0	CBUS_REG(0xa8)
1458afae5d5Sryo #define HHI_FIX_PLL_CNTL1	CBUS_REG(0xa9)
1468afae5d5Sryo #define HHI_FIX_PLL_CNTL2	CBUS_REG(0xaa)
1478afae5d5Sryo #define HHI_FIX_PLL_CNTL3	CBUS_REG(0xab)
1488afae5d5Sryo #define HHI_SYS_PLL_CNTL0	CBUS_REG(0xbd)
1498afae5d5Sryo #define HHI_SYS_PLL_CNTL1	CBUS_REG(0xbe)
1508afae5d5Sryo #define HHI_SYS_PLL_CNTL2	CBUS_REG(0xbf)
1518afae5d5Sryo #define HHI_SYS_PLL_CNTL3	CBUS_REG(0xc0)
1528afae5d5Sryo #define HHI_SYS_PLL_CNTL4	CBUS_REG(0xc1)
1538afae5d5Sryo #define HHI_SYS_PLL_CNTL5	CBUS_REG(0xc2)
1548afae5d5Sryo #define HHI_SYS_PLL_CNTL6	CBUS_REG(0xc3)
1558afae5d5Sryo #define HHI_HDMI_PLL_CNTL0	CBUS_REG(0xc8)
1568afae5d5Sryo #define HHI_HDMI_PLL_CNTL1	CBUS_REG(0xc9)
1578afae5d5Sryo #define HHI_SYS1_PLL_CNTL0	CBUS_REG(0xe0)
1588afae5d5Sryo #define HHI_SYS1_PLL_CNTL1	CBUS_REG(0xe1)
1598afae5d5Sryo #define HHI_SYS1_PLL_CNTL2	CBUS_REG(0xe2)
1608afae5d5Sryo #define HHI_SYS1_PLL_CNTL3	CBUS_REG(0xe3)
1618afae5d5Sryo #define HHI_SYS1_PLL_CNTL4	CBUS_REG(0xe4)
1628afae5d5Sryo #define HHI_SYS1_PLL_CNTL5	CBUS_REG(0xe5)
1638afae5d5Sryo #define HHI_SYS1_PLL_CNTL6	CBUS_REG(0xe6)
1648afae5d5Sryo 
1658afae5d5Sryo static int mesong12_clkc_match(device_t, cfdata_t, void *);
1668afae5d5Sryo static void mesong12_clkc_attach(device_t, device_t, void *);
1678afae5d5Sryo 
1688afae5d5Sryo static u_int mesong12_cpuclk_get_rate(struct meson_clk_softc *,
1698afae5d5Sryo     struct meson_clk_clk *);
1708afae5d5Sryo static int mesong12_cpuclk_set_rate(struct meson_clk_softc *,
1718afae5d5Sryo     struct meson_clk_clk *, u_int);
1728afae5d5Sryo static int mesong12_clk_pcie_pll_set_rate(struct meson_clk_softc *,
1738afae5d5Sryo     struct meson_clk_clk *, u_int);
1748afae5d5Sryo 
1758afae5d5Sryo struct mesong12_clkc_config {
1768afae5d5Sryo 	const char *name;
1778afae5d5Sryo 	struct meson_clk_clk *clks;
1788afae5d5Sryo 	int nclks;
1798afae5d5Sryo };
1808afae5d5Sryo 
1818afae5d5Sryo #define PARENTS(args...)	((const char *[]){ args })
1828afae5d5Sryo 
1838afae5d5Sryo /* fixed pll */
1848afae5d5Sryo #define G12_CLK_fixed_pll_dco						\
1858afae5d5Sryo 	MESON_CLK_PLL(MESONG12_CLOCK_FIXED_PLL_DCO, "fixed_pll_dco",	\
1868afae5d5Sryo 	    "xtal",						/* parent */ \
1878afae5d5Sryo 	    MESON_CLK_PLL_REG(HHI_FIX_PLL_CNTL0, __BIT(28)),	/* enable */ \
1888afae5d5Sryo 	    MESON_CLK_PLL_REG(HHI_FIX_PLL_CNTL0, __BITS(7,0)),	/* m */ \
1898afae5d5Sryo 	    MESON_CLK_PLL_REG(HHI_FIX_PLL_CNTL0, __BITS(14,10)),/* n */ \
1908afae5d5Sryo 	    MESON_CLK_PLL_REG(HHI_FIX_PLL_CNTL1, __BITS(16,0)),	/* frac */ \
1918afae5d5Sryo 	    MESON_CLK_PLL_REG(HHI_FIX_PLL_CNTL0, __BIT(31)),	/* l */ \
1928afae5d5Sryo 	    MESON_CLK_PLL_REG(HHI_FIX_PLL_CNTL0, __BIT(29)),	/* reset */ \
1938afae5d5Sryo 	    0)
1948afae5d5Sryo #define G12_CLK_fixed_pll						\
1958afae5d5Sryo 	MESON_CLK_DIV(MESONG12_CLOCK_FIXED_PLL, "fixed_pll",		\
1968afae5d5Sryo 	    "fixed_pll_dco",		/* parent */			\
1978afae5d5Sryo 	    HHI_FIX_PLL_CNTL0,		/* reg */			\
1988afae5d5Sryo 	    __BITS(17,16),		/* div */			\
1998afae5d5Sryo 	    MESON_CLK_DIV_POWER_OF_TWO)
2008afae5d5Sryo 
2018afae5d5Sryo /* sys pll */
2028afae5d5Sryo #define G12_CLK_sys_pll_dco						\
2038afae5d5Sryo 	MESON_CLK_PLL(MESONG12_CLOCK_SYS_PLL_DCO, "sys_pll_dco",	\
2048afae5d5Sryo 	    "xtal",						/* parent */ \
2058afae5d5Sryo 	    MESON_CLK_PLL_REG(HHI_SYS_PLL_CNTL0, __BIT(28)),	/* enable */ \
2068afae5d5Sryo 	    MESON_CLK_PLL_REG(HHI_SYS_PLL_CNTL0, __BITS(7,0)),	/* m */	\
2078afae5d5Sryo 	    MESON_CLK_PLL_REG(HHI_SYS_PLL_CNTL0, __BITS(14,10)),/* n */	\
2088afae5d5Sryo 	    MESON_CLK_PLL_REG_INVALID,				/* frac */ \
2098afae5d5Sryo 	    MESON_CLK_PLL_REG(HHI_SYS_PLL_CNTL0, __BIT(31)),	/* l */	\
2108afae5d5Sryo 	    MESON_CLK_PLL_REG(HHI_SYS_PLL_CNTL0, __BIT(29)),	/* reset */ \
2118afae5d5Sryo 	    0)
2128afae5d5Sryo #define G12_CLK_sys_pll							\
2138afae5d5Sryo 	MESON_CLK_DIV(MESONG12_CLOCK_SYS_PLL, "sys_pll",		\
2148afae5d5Sryo 	    "sys_pll_dco",		/* parent */			\
2158afae5d5Sryo 	    HHI_SYS_PLL_CNTL0,		/* reg */			\
2168afae5d5Sryo 	    __BITS(18,16),		/* div */			\
2178afae5d5Sryo 	    MESON_CLK_DIV_POWER_OF_TWO | MESON_CLK_DIV_SET_RATE_PARENT)
2188afae5d5Sryo 
2198afae5d5Sryo /* sys1 pll */
2208afae5d5Sryo #define G12B_CLK_sys1_pll_dco						\
2218afae5d5Sryo 	MESON_CLK_PLL(MESONG12_CLOCK_SYS1_PLL_DCO, "sys1_pll_dco",	\
2228afae5d5Sryo 	    "xtal",						/* parent */ \
2238afae5d5Sryo 	    MESON_CLK_PLL_REG(HHI_SYS1_PLL_CNTL0, __BIT(28)),	/* enable */ \
2248afae5d5Sryo 	    MESON_CLK_PLL_REG(HHI_SYS1_PLL_CNTL0, __BITS(7,0)),	/* m */ \
2258afae5d5Sryo 	    MESON_CLK_PLL_REG(HHI_SYS1_PLL_CNTL0, __BITS(14,10)),/* n */ \
2268afae5d5Sryo 	    MESON_CLK_PLL_REG_INVALID,				/* frac */ \
2278afae5d5Sryo 	    MESON_CLK_PLL_REG(HHI_SYS1_PLL_CNTL0, __BIT(31)),	/* l */ \
2288afae5d5Sryo 	    MESON_CLK_PLL_REG(HHI_SYS1_PLL_CNTL0, __BIT(29)),	/* reset */ \
2298afae5d5Sryo 	    0)
2308afae5d5Sryo #define G12B_CLK_sys1_pll						\
2318afae5d5Sryo 	MESON_CLK_DIV(MESONG12_CLOCK_SYS1_PLL, "sys1_pll",		\
2328afae5d5Sryo 	    "sys1_pll_dco",		/* parent */			\
2338afae5d5Sryo 	    HHI_SYS1_PLL_CNTL0,		/* reg */			\
2348afae5d5Sryo 	    __BITS(18,16),		/* div */			\
2358afae5d5Sryo 	    MESON_CLK_DIV_POWER_OF_TWO | MESON_CLK_DIV_SET_RATE_PARENT)
2368afae5d5Sryo 
2378afae5d5Sryo /* fclk div */
2388afae5d5Sryo #define G12_CLK_fclk_div2_div						\
2398afae5d5Sryo 	MESON_CLK_FIXED_FACTOR(MESONG12_CLOCK_FCLK_DIV2_DIV, "fclk_div2_div", \
2408afae5d5Sryo 	    "fixed_pll",		/* parent */			\
2418afae5d5Sryo 	    2,				/* div */			\
2428afae5d5Sryo 	    1)				/* mult */
2438afae5d5Sryo #define G12_CLK_fclk_div2						\
2448afae5d5Sryo 	MESON_CLK_GATE(MESONG12_CLOCK_FCLK_DIV2, "fclk_div2",		\
2458afae5d5Sryo 	    "fclk_div2_div",		/* parent */			\
2468afae5d5Sryo 	    HHI_FIX_PLL_CNTL1,		/* reg */			\
2478afae5d5Sryo 	    24)				/* bit */
2488afae5d5Sryo #define G12_CLK_fclk_div2p5_div						\
2498afae5d5Sryo 	MESON_CLK_FIXED_FACTOR(MESONG12_CLOCK_FCLK_DIV2P5_DIV,		\
2508afae5d5Sryo 	    "fclk_div2p5_div",						\
2518afae5d5Sryo 	    "fixed_pll_dco",		/* parent */			\
2528afae5d5Sryo 	    5,				/* div */			\
2538afae5d5Sryo 	    1)				/* mult */
2548afae5d5Sryo #define G12_CLK_fclk_div3_div						\
2558afae5d5Sryo 	MESON_CLK_FIXED_FACTOR(MESONG12_CLOCK_FCLK_DIV3_DIV,		\
2568afae5d5Sryo 	    "fclk_div3_div",						\
2578afae5d5Sryo 	    "fixed_pll",		/* parent */			\
2588afae5d5Sryo 	    3,				/* div */			\
2598afae5d5Sryo 	    1)				/* mult */
2608afae5d5Sryo #define G12_CLK_fclk_div3						\
2618afae5d5Sryo 	MESON_CLK_GATE(MESONG12_CLOCK_FCLK_DIV3, "fclk_div3",		\
2628afae5d5Sryo 	    "fclk_div3_div",		/* parent */			\
2638afae5d5Sryo 	    HHI_FIX_PLL_CNTL1,		/* reg */			\
2648afae5d5Sryo 	    20)				/* bit */
2658afae5d5Sryo #define G12_CLK_fclk_div4_div						\
2668afae5d5Sryo 	MESON_CLK_FIXED_FACTOR(MESONG12_CLOCK_FCLK_DIV4_DIV, "fclk_div4_div", \
2678afae5d5Sryo 	    "fixed_pll",		/* parent */			\
2688afae5d5Sryo 	    4,				/* div */			\
2698afae5d5Sryo 	    1)				/* mult */
2708afae5d5Sryo #define G12_CLK_fclk_div4						\
2718afae5d5Sryo 	MESON_CLK_GATE(MESONG12_CLOCK_FCLK_DIV4, "fclk_div4",		\
2728afae5d5Sryo 	    "fclk_div4_div",		/* parent */			\
2738afae5d5Sryo 	    HHI_FIX_PLL_CNTL1,		/* reg */			\
2748afae5d5Sryo 	    21)				/* bit */
2758afae5d5Sryo #define G12_CLK_fclk_div5_div						\
2768afae5d5Sryo 	MESON_CLK_FIXED_FACTOR(MESONG12_CLOCK_FCLK_DIV5_DIV, "fclk_div5_div", \
2778afae5d5Sryo 	    "fixed_pll",		/* parent */			\
2788afae5d5Sryo 	    5,				/* div */			\
2798afae5d5Sryo 	    1)				/* mult */
2808afae5d5Sryo #define G12_CLK_fclk_div5						\
2818afae5d5Sryo 	MESON_CLK_GATE(MESONG12_CLOCK_FCLK_DIV5, "fclk_div5",		\
2828afae5d5Sryo 	    "fclk_div5_div",		/* parent */			\
2838afae5d5Sryo 	    HHI_FIX_PLL_CNTL1,		/* reg */			\
2848afae5d5Sryo 	    22)				/* bit */
2858afae5d5Sryo #define G12_CLK_fclk_div7_div						\
2868afae5d5Sryo 	MESON_CLK_FIXED_FACTOR(MESONG12_CLOCK_FCLK_DIV7_DIV, "fclk_div7_div", \
2878afae5d5Sryo 	    "fixed_pll",		/* parent */			\
2888afae5d5Sryo 	    7,				/* div */			\
2898afae5d5Sryo 	    1)				/* mult */
2908afae5d5Sryo #define G12_CLK_fclk_div7						\
2918afae5d5Sryo 	MESON_CLK_GATE(MESONG12_CLOCK_FCLK_DIV7, "fclk_div7",		\
2928afae5d5Sryo 	    "fclk_div7_div",		/* parent */			\
2938afae5d5Sryo 	    HHI_FIX_PLL_CNTL1,		/* reg */			\
2948afae5d5Sryo 	    23)				/* bit */
2958afae5d5Sryo 
2968afae5d5Sryo /* mpll */
2978afae5d5Sryo #define G12_CLK_mpll_prediv						\
2988afae5d5Sryo 	MESON_CLK_FIXED_FACTOR(MESONG12_CLOCK_MPLL_PREDIV, "mpll_prediv", \
2998afae5d5Sryo 	    "fixed_pll_dco",		/* parent */			\
3008afae5d5Sryo 	    2,				/* div */			\
3018afae5d5Sryo 	    1)				/* mult */
3028afae5d5Sryo #define G12_CLK_mpll0_div						\
3038afae5d5Sryo 	MESON_CLK_MPLL(MESONG12_CLOCK_MPLL0_DIV, "mpll0_div",		\
3048afae5d5Sryo 	    "mpll_prediv",					/* parent */ \
3058afae5d5Sryo 	    MESON_CLK_PLL_REG(HHI_MPLL_CNTL1, __BITS(13,0)),	/* sdm */ \
3068afae5d5Sryo 	    MESON_CLK_PLL_REG(HHI_MPLL_CNTL1, __BIT(30)), /* sdm_enable */ \
3078afae5d5Sryo 	    MESON_CLK_PLL_REG(HHI_MPLL_CNTL1, __BITS(28,20)),	/* n2 */ \
3088afae5d5Sryo 	    MESON_CLK_PLL_REG(HHI_MPLL_CNTL1, __BIT(29)),	/* ssen */ \
3098afae5d5Sryo 	    0)
3108afae5d5Sryo #define G12_CLK_mpll1_div						\
3118afae5d5Sryo 	MESON_CLK_MPLL(MESONG12_CLOCK_MPLL1_DIV, "mpll1_div",		\
3128afae5d5Sryo 	    "mpll_prediv",					/* parent */ \
3138afae5d5Sryo 	    MESON_CLK_PLL_REG(HHI_MPLL_CNTL3, __BITS(13,0)),	/* sdm */ \
3148afae5d5Sryo 	    MESON_CLK_PLL_REG(HHI_MPLL_CNTL3, __BIT(30)), /* sdm_enable */ \
3158afae5d5Sryo 	    MESON_CLK_PLL_REG(HHI_MPLL_CNTL3, __BITS(28,20)),	/* n2 */ \
3168afae5d5Sryo 	    MESON_CLK_PLL_REG(HHI_MPLL_CNTL3, __BIT(29)),	/* ssen */ \
3178afae5d5Sryo 	    0)
3188afae5d5Sryo #define G12_CLK_mpll2_div						\
3198afae5d5Sryo 	MESON_CLK_MPLL(MESONG12_CLOCK_MPLL2_DIV, "mpll2_div",		\
3208afae5d5Sryo 	    "mpll_prediv",					/* parent */ \
3218afae5d5Sryo 	    MESON_CLK_PLL_REG(HHI_MPLL_CNTL5, __BITS(13,0)),	/* sdm */ \
3228afae5d5Sryo 	    MESON_CLK_PLL_REG(HHI_MPLL_CNTL5, __BIT(30)), /* sdm_enable */ \
3238afae5d5Sryo 	    MESON_CLK_PLL_REG(HHI_MPLL_CNTL5, __BITS(28,20)),	/* n2 */ \
3248afae5d5Sryo 	    MESON_CLK_PLL_REG(HHI_MPLL_CNTL5, __BIT(29)),	/* ssen */ \
3258afae5d5Sryo 	    0)
3268afae5d5Sryo #define G12_CLK_mpll0							\
3278afae5d5Sryo 	MESON_CLK_GATE(MESONG12_CLOCK_MPLL0, "mpll0",			\
3288afae5d5Sryo 	    "mpll0_div",		/* parent */			\
3298afae5d5Sryo 	    HHI_MPLL_CNTL1,		/* reg */			\
3308afae5d5Sryo 	    31)				/* bit */
3318afae5d5Sryo #define G12_CLK_mpll1							\
3328afae5d5Sryo 	MESON_CLK_GATE(MESONG12_CLOCK_MPLL1, "mpll1",			\
3338afae5d5Sryo 	    "mpll1_div",		/* parent */			\
3348afae5d5Sryo 	    HHI_MPLL_CNTL3,		/* reg */			\
3358afae5d5Sryo 	    31)				/* bit */
3368afae5d5Sryo #define G12_CLK_mpll2							\
3378afae5d5Sryo 	MESON_CLK_GATE(MESONG12_CLOCK_MPLL2, "mpll2",			\
3388afae5d5Sryo 	    "mpll2_div",		/* parent */			\
3398afae5d5Sryo 	    HHI_MPLL_CNTL5,		/* reg */			\
3408afae5d5Sryo 	    31)				/* bit */
3418afae5d5Sryo #define G12_CLK_mpll_50m_div						\
3428afae5d5Sryo 	MESON_CLK_FIXED_FACTOR(MESONG12_CLOCK_MPLL_50M_DIV, "mpll_50m_div", \
3438afae5d5Sryo 	    "fixed_pll_dco",		/* parent */			\
3448afae5d5Sryo 	    80,				/* div */			\
3458afae5d5Sryo 	    1)				/* mult */
3468afae5d5Sryo #define G12_CLK_mpll_50m						\
3478afae5d5Sryo 	MESON_CLK_MUX(MESONG12_CLOCK_MPLL_50M, "mpll_50m",		\
3488afae5d5Sryo 	    PARENTS("mpll_50m_div", "xtal"),				\
3498afae5d5Sryo 	    HHI_FIX_PLL_CNTL3,		/* reg */			\
3508afae5d5Sryo 	    __BIT(5),			/* sel */			\
3518afae5d5Sryo 	    0)
3528afae5d5Sryo 
3538afae5d5Sryo /* sd/emmc */
3548afae5d5Sryo #define G12_CLK_sd_emmc_a_clk0_sel					\
3558afae5d5Sryo 	MESON_CLK_MUX(MESONG12_CLOCK_SD_EMMC_A_CLK0_SEL, "sd_emmc_a_clk0_sel", \
3568afae5d5Sryo 	    PARENTS("xtal", "fclk_div2", "fclk_div3",			\
3578afae5d5Sryo 	    "fclk_div5", "fclk_div7"),					\
3588afae5d5Sryo 	    HHI_SD_EMMC_CLK_CNTL,	/* reg */			\
3598afae5d5Sryo 	    __BITS(11,9),		/* sel */			\
3608afae5d5Sryo 	    0)
3618afae5d5Sryo #define G12_CLK_sd_emmc_b_clk0_sel					\
3628afae5d5Sryo 	MESON_CLK_MUX(MESONG12_CLOCK_SD_EMMC_B_CLK0_SEL, "sd_emmc_b_clk0_sel", \
3638afae5d5Sryo 	    PARENTS("xtal", "fclk_div2", "fclk_div3",			\
3648afae5d5Sryo 	    "fclk_div5", "fclk_div7"),					\
3658afae5d5Sryo 	    HHI_SD_EMMC_CLK_CNTL,	/* reg */			\
3668afae5d5Sryo 	    __BITS(27,25),		/* sel */			\
3678afae5d5Sryo 	    0)
3688afae5d5Sryo #define G12_CLK_sd_emmc_c_clk0_sel					\
3698afae5d5Sryo 	MESON_CLK_MUX(MESONG12_CLOCK_SD_EMMC_C_CLK0_SEL, "sd_emmc_c_clk0_sel", \
3708afae5d5Sryo 	    PARENTS("xtal", "fclk_div2", "fclk_div3",			\
3718afae5d5Sryo 	    "fclk_div5", "fclk_div7"),					\
3728afae5d5Sryo 	    HHI_NAND_CLK_CNTL,		/* reg */			\
3738afae5d5Sryo 	    __BITS(11,9),		/* sel */			\
3748afae5d5Sryo 	    0)
3758afae5d5Sryo #define G12_CLK_sd_emmc_a_clk0_div					\
3768afae5d5Sryo 	MESON_CLK_DIV(MESONG12_CLOCK_SD_EMMC_A_CLK0_DIV, "sd_emmc_a_clk0_div", \
3778afae5d5Sryo 	    "sd_emmc_a_clk0_sel",	/* parent */			\
3788afae5d5Sryo 	    HHI_SD_EMMC_CLK_CNTL,	/* reg */			\
3798afae5d5Sryo 	    __BITS(6,0),		/* div */			\
3808afae5d5Sryo 	    0)
3818afae5d5Sryo #define G12_CLK_sd_emmc_b_clk0_div					\
3828afae5d5Sryo 	MESON_CLK_DIV(MESONG12_CLOCK_SD_EMMC_B_CLK0_DIV, "sd_emmc_b_clk0_div", \
3838afae5d5Sryo 	    "sd_emmc_b_clk0_sel",	/* parent */			\
3848afae5d5Sryo 	    HHI_SD_EMMC_CLK_CNTL,	/* reg */			\
3858afae5d5Sryo 	    __BITS(22,16),		/* div */			\
3868afae5d5Sryo 	    0)
3878afae5d5Sryo #define G12_CLK_sd_emmc_c_clk0_div					\
3888afae5d5Sryo 	MESON_CLK_DIV(MESONG12_CLOCK_SD_EMMC_C_CLK0_DIV, "sd_emmc_c_clk0_div", \
3898afae5d5Sryo 	    "sd_emmc_c_clk0_sel",	/* parent */			\
3908afae5d5Sryo 	    HHI_NAND_CLK_CNTL,		/* reg */			\
3918afae5d5Sryo 	    __BITS(6,0),		/* div */			\
3928afae5d5Sryo 	    0)
3938afae5d5Sryo #define G12_CLK_sd_emmc_a_clk0						\
3948afae5d5Sryo 	MESON_CLK_GATE(MESONG12_CLOCK_SD_EMMC_A_CLK0, "sd_emmc_a_clk0",	\
3958afae5d5Sryo 	    "sd_emmc_a_clk0_div",	/* parent */			\
3968afae5d5Sryo 	    HHI_SD_EMMC_CLK_CNTL,	/* reg */			\
3978afae5d5Sryo 	    7)				/* bit */
3988afae5d5Sryo #define G12_CLK_sd_emmc_b_clk0						\
3998afae5d5Sryo 	MESON_CLK_GATE(MESONG12_CLOCK_SD_EMMC_B_CLK0, "sd_emmc_b_clk0", \
4008afae5d5Sryo 	    "sd_emmc_b_clk0_div",	/* parent */			\
4018afae5d5Sryo 	    HHI_SD_EMMC_CLK_CNTL,	/* reg */			\
4028afae5d5Sryo 	    23)				/* bit */
4038afae5d5Sryo #define G12_CLK_sd_emmc_c_clk0						\
4048afae5d5Sryo 	MESON_CLK_GATE(MESONG12_CLOCK_SD_EMMC_C_CLK0, "sd_emmc_c_clk0",	\
4058afae5d5Sryo 	    "sd_emmc_c_clk0_div",	/* parent */			\
4068afae5d5Sryo 	    HHI_NAND_CLK_CNTL,		/* reg */			\
4078afae5d5Sryo 	    7)				/* bit */
4088afae5d5Sryo 
4098afae5d5Sryo /* source as mpeg_clk */
4108afae5d5Sryo #define G12_CLK_mpeg_sel						\
4118afae5d5Sryo 	MESON_CLK_MUX(MESONG12_CLOCK_MPEG_SEL, "mpeg_sel",		\
4128afae5d5Sryo 	    PARENTS("xtal", NULL, "fclk_div7", "mpll1",			\
4138afae5d5Sryo 	    "mpll2", "fclk_div4", "fclk_div3", "fclk_div5"),		\
4148afae5d5Sryo 	    HHI_MPEG_CLK_CNTL,		/* reg */			\
4158afae5d5Sryo 	    __BITS(14,12),		/* sel */			\
4168afae5d5Sryo 	    0)
4178afae5d5Sryo #define G12_CLK_mpeg_clk_div						\
4188afae5d5Sryo 	MESON_CLK_DIV(MESONG12_CLOCK_MPEG_DIV, "mpeg_clk_div",		\
4198afae5d5Sryo 	    "mpeg_sel",			/* parent */			\
4208afae5d5Sryo 	    HHI_MPEG_CLK_CNTL,		/* reg */			\
4218afae5d5Sryo 	    __BITS(6,0),		/* div */			\
4228afae5d5Sryo 	    MESON_CLK_DIV_SET_RATE_PARENT)
4238afae5d5Sryo #define G12_CLK_clk81							\
4248afae5d5Sryo 	MESON_CLK_GATE(MESONG12_CLOCK_CLK81, "clk81",			\
4258afae5d5Sryo 	    "mpeg_clk_div",		/* parent */			\
4268afae5d5Sryo 	    HHI_MPEG_CLK_CNTL,		/* reg */			\
4278afae5d5Sryo 	    7)				/* bit */
4288afae5d5Sryo #define G12_CLK_ddr							\
4298afae5d5Sryo 	MESON_CLK_GATE(MESONG12_CLOCK_DDR, "ddr",			\
4308afae5d5Sryo 	    "clk81",			/* parent */			\
4318afae5d5Sryo 	    HHI_GCLK_MPEG0,		/* reg */			\
4328afae5d5Sryo 	    0)				/* bit */
4338afae5d5Sryo #define G12_CLK_dos							\
4348afae5d5Sryo 	MESON_CLK_GATE(MESONG12_CLOCK_DOS, "dos",			\
4358afae5d5Sryo 	    "clk81",			/* parent */			\
4368afae5d5Sryo 	    HHI_GCLK_MPEG0,		/* reg */			\
4378afae5d5Sryo 	    1)				/* bit */
4388afae5d5Sryo #define G12_CLK_audio_locker						\
4398afae5d5Sryo 	MESON_CLK_GATE(MESONG12_CLOCK_AUDIO_LOCKER, "audio_locker",	\
4408afae5d5Sryo 	    "clk81",			/* parent */			\
4418afae5d5Sryo 	    HHI_GCLK_MPEG0,		/* reg */			\
4428afae5d5Sryo 	    2)				/* bit */
4438afae5d5Sryo #define G12_CLK_mipi_dsi_host						\
4448afae5d5Sryo 	MESON_CLK_GATE(MESONG12_CLOCK_MIPI_DSI_HOST, "mipi_dsi_host",	\
4458afae5d5Sryo 	   "clk81",			/* parent */			\
4468afae5d5Sryo 	    HHI_GCLK_MPEG0,		/* reg */			\
4478afae5d5Sryo 	    3)				/* bit */
4488afae5d5Sryo #define G12_CLK_eth_phy							\
4498afae5d5Sryo 	MESON_CLK_GATE(MESONG12_CLOCK_ETH_PHY, "eth_phy",		\
4508afae5d5Sryo 	    "clk81",			/* parent */			\
4518afae5d5Sryo 	    HHI_GCLK_MPEG0,		/* reg */			\
4528afae5d5Sryo 	    4)				/* bit */
4538afae5d5Sryo #define G12_CLK_isa							\
4548afae5d5Sryo 	MESON_CLK_GATE(MESONG12_CLOCK_ISA, "isa",			\
4558afae5d5Sryo 	    "clk81",			/* parent */			\
4568afae5d5Sryo 	    HHI_GCLK_MPEG0,		/* reg */			\
4578afae5d5Sryo 	    5)				/* bit */
4588afae5d5Sryo #define G12_CLK_pl301							\
4598afae5d5Sryo 	MESON_CLK_GATE(MESONG12_CLOCK_PL301, "pl301",			\
4608afae5d5Sryo 	    "clk81",			/* parent */			\
4618afae5d5Sryo 	    HHI_GCLK_MPEG0,		/* reg */			\
4628afae5d5Sryo 	    6)				/* bit */
4638afae5d5Sryo #define G12_CLK_periphs							\
4648afae5d5Sryo 	MESON_CLK_GATE(MESONG12_CLOCK_PERIPHS, "periphs",		\
4658afae5d5Sryo 	    "clk81",			/* parent */			\
4668afae5d5Sryo 	    HHI_GCLK_MPEG0,		/* reg */			\
4678afae5d5Sryo 	    7)				/* bit */
4688afae5d5Sryo #define G12_CLK_spicc0							\
4698afae5d5Sryo 	MESON_CLK_GATE(MESONG12_CLOCK_SPICC0, "spicc0",			\
4708afae5d5Sryo 	    "clk81",			/* parent */			\
4718afae5d5Sryo 	    HHI_GCLK_MPEG0,		/* reg */			\
4728afae5d5Sryo 	    8)				/* bit */
4738afae5d5Sryo #define G12_CLK_i2c							\
4748afae5d5Sryo 	MESON_CLK_GATE(MESONG12_CLOCK_I2C, "i2c",			\
4758afae5d5Sryo 	    "clk81",			/* parent */			\
4768afae5d5Sryo 	    HHI_GCLK_MPEG0,		/* reg */			\
4778afae5d5Sryo 	    9)				/* bit */
4788afae5d5Sryo #define G12_CLK_sana							\
4798afae5d5Sryo 	MESON_CLK_GATE(MESONG12_CLOCK_SANA, "sana",			\
4808afae5d5Sryo 	    "clk81",			/* parent */			\
4818afae5d5Sryo 	    HHI_GCLK_MPEG0,		/* reg */			\
4828afae5d5Sryo 	    10)				/* bit */
4838afae5d5Sryo #define G12_CLK_sd							\
4848afae5d5Sryo 	MESON_CLK_GATE(MESONG12_CLOCK_SD, "sd",				\
4858afae5d5Sryo 	    "clk81",			/* parent */			\
4868afae5d5Sryo 	    HHI_GCLK_MPEG0,		/* reg */			\
4878afae5d5Sryo 	    11)				/* bit */
4888afae5d5Sryo #define G12_CLK_rng0							\
4898afae5d5Sryo 	MESON_CLK_GATE(MESONG12_CLOCK_RNG0, "rng0",			\
4908afae5d5Sryo 	    "clk81",			/* parent */			\
4918afae5d5Sryo 	    HHI_GCLK_MPEG0,		/* reg */			\
4928afae5d5Sryo 	    12)				/* bit */
4938afae5d5Sryo #define G12_CLK_uart0							\
4948afae5d5Sryo 	MESON_CLK_GATE(MESONG12_CLOCK_UART0, "uart0",			\
4958afae5d5Sryo 	    "clk81",			/* parent */			\
4968afae5d5Sryo 	    HHI_GCLK_MPEG0,		/* reg */			\
4978afae5d5Sryo 	    13)				/* bit */
4988afae5d5Sryo #define G12_CLK_spicc1							\
4998afae5d5Sryo 	MESON_CLK_GATE(MESONG12_CLOCK_SPICC1, "spicc1",			\
5008afae5d5Sryo 	    "clk81",			/* parent */			\
5018afae5d5Sryo 	    HHI_GCLK_MPEG0,		/* reg */			\
5028afae5d5Sryo 	    14)				/* bit */
5038afae5d5Sryo #define G12_CLK_hiu_iface						\
5048afae5d5Sryo 	MESON_CLK_GATE(MESONG12_CLOCK_HIU_IFACE, "hiu_iface",		\
5058afae5d5Sryo 	    "clk81",			/* parent */			\
5068afae5d5Sryo 	    HHI_GCLK_MPEG0,		/* reg */			\
5078afae5d5Sryo 	    19)				/* bit */
5088afae5d5Sryo #define G12_CLK_mipi_dsi_phy						\
5098afae5d5Sryo 	MESON_CLK_GATE(MESONG12_CLOCK_MIPI_DSI_PHY, "mipi_dsi_phy",	\
5108afae5d5Sryo 	    "clk81",			/* parent */			\
5118afae5d5Sryo 	    HHI_GCLK_MPEG0,		/* reg */			\
5128afae5d5Sryo 	    20)				/* bit */
5138afae5d5Sryo #define G12_CLK_assist_misc						\
5148afae5d5Sryo 	MESON_CLK_GATE(MESONG12_CLOCK_ASSIST_MISC, "assist_misc",	\
5158afae5d5Sryo 	    "clk81",			/* parent */			\
5168afae5d5Sryo 	    HHI_GCLK_MPEG0,		/* reg */			\
5178afae5d5Sryo 	    23)				/* bit */
5188afae5d5Sryo #define G12_CLK_sd_emmc_a						\
5198afae5d5Sryo 	MESON_CLK_GATE(MESONG12_CLOCK_SD_EMMC_A, "sd_emmc_a",		\
5208afae5d5Sryo 	    "clk81",			/* parent */			\
5218afae5d5Sryo 	    HHI_GCLK_MPEG0,		/* reg */			\
5228afae5d5Sryo 	    4)				/* bit */
5238afae5d5Sryo #define G12_CLK_sd_emmc_b						\
5248afae5d5Sryo 	MESON_CLK_GATE(MESONG12_CLOCK_SD_EMMC_B, "sd_emmc_b",		\
5258afae5d5Sryo 	    "clk81",			/* parent */			\
5268afae5d5Sryo 	    HHI_GCLK_MPEG0,		/* reg */			\
5278afae5d5Sryo 	    25)				/* bit */
5288afae5d5Sryo #define G12_CLK_sd_emmc_c						\
5298afae5d5Sryo 	MESON_CLK_GATE(MESONG12_CLOCK_SD_EMMC_C, "sd_emmc_c",		\
5308afae5d5Sryo 	    "clk81",			/* parent */			\
5318afae5d5Sryo 	    HHI_GCLK_MPEG0,		/* reg */			\
5328afae5d5Sryo 	    26)				/* bit */
5338afae5d5Sryo #define G12_CLK_audio_codec						\
5348afae5d5Sryo 	MESON_CLK_GATE(MESONG12_CLOCK_AUDIO_CODEC, "audio_codec",	\
5358afae5d5Sryo 	    "clk81",			/* parent */			\
5368afae5d5Sryo 	    HHI_GCLK_MPEG0,		/* reg */			\
5378afae5d5Sryo 	    28)				/* bit */
5388afae5d5Sryo #define G12_CLK_audio							\
5398afae5d5Sryo 	MESON_CLK_GATE(MESONG12_CLOCK_AUDIO, "audio",			\
5408afae5d5Sryo 	    "clk81",			/* parent */			\
5418afae5d5Sryo 	    HHI_GCLK_MPEG1,		/* reg */			\
5428afae5d5Sryo 	    0)				/* bit */
5438afae5d5Sryo #define G12_CLK_eth							\
5448afae5d5Sryo 	MESON_CLK_GATE(MESONG12_CLOCK_ETH, "eth",			\
5458afae5d5Sryo 	    "clk81",			/* parent */			\
5468afae5d5Sryo 	    HHI_GCLK_MPEG1,		/* reg */			\
5478afae5d5Sryo 	    3)				/* bit */
5488afae5d5Sryo #define G12_CLK_demux							\
5498afae5d5Sryo 	MESON_CLK_GATE(MESONG12_CLOCK_DEMUX, "demux",			\
5508afae5d5Sryo 	    "clk81",			/* parent */			\
5518afae5d5Sryo 	    HHI_GCLK_MPEG1,		/* reg */			\
5528afae5d5Sryo 	    4)				/* bit */
5538afae5d5Sryo #define G12_CLK_audio_ififo						\
5548afae5d5Sryo 	MESON_CLK_GATE(MESONG12_CLOCK_AUDIO_IFIFO, "audio_ififo",	\
5558afae5d5Sryo 	    "clk81",			/* parent */			\
5568afae5d5Sryo 	    HHI_GCLK_MPEG1,		/* reg */			\
5578afae5d5Sryo 	    11)				/* bit */
5588afae5d5Sryo #define G12_CLK_adc							\
5598afae5d5Sryo 	MESON_CLK_GATE(MESONG12_CLOCK_ADC, "adc",			\
5608afae5d5Sryo 	    "clk81",			/* parent */			\
5618afae5d5Sryo 	    HHI_GCLK_MPEG1,		/* reg */			\
5628afae5d5Sryo 	    13)				/* bit */
5638afae5d5Sryo #define G12_CLK_uart1							\
5648afae5d5Sryo 	MESON_CLK_GATE(MESONG12_CLOCK_UART1, "uart1",			\
5658afae5d5Sryo 	    "clk81",			/* parent */			\
5668afae5d5Sryo 	    HHI_GCLK_MPEG1,		/* reg */			\
5678afae5d5Sryo 	    16)				/* bit */
5688afae5d5Sryo #define G12_CLK_g2d							\
5698afae5d5Sryo 	MESON_CLK_GATE(MESONG12_CLOCK_G2D, "g2d",			\
5708afae5d5Sryo 	    "clk81",			/* parent */			\
5718afae5d5Sryo 	    HHI_GCLK_MPEG1,		/* reg */			\
5728afae5d5Sryo 	    20)				/* bit */
5738afae5d5Sryo #define G12_CLK_reset							\
5748afae5d5Sryo 	MESON_CLK_GATE(MESONG12_CLOCK_RESET, "reset",			\
5758afae5d5Sryo 	    "clk81",			/* parent */			\
5768afae5d5Sryo 	    HHI_GCLK_MPEG1,		/* reg */			\
5778afae5d5Sryo 	    23)				/* bit */
5788afae5d5Sryo #define G12_CLK_pcie_comb						\
5798afae5d5Sryo 	MESON_CLK_GATE(MESONG12_CLOCK_PCIE_COMB, "pcie_comb",		\
5808afae5d5Sryo 	    "clk81",			/* parent */			\
5818afae5d5Sryo 	    HHI_GCLK_MPEG1,		/* reg */			\
5828afae5d5Sryo 	    24)				/* bit */
5838afae5d5Sryo #define G12_CLK_parser							\
5848afae5d5Sryo 	MESON_CLK_GATE(MESONG12_CLOCK_PARSER, "parser",			\
5858afae5d5Sryo 	    "clk81",			/* parent */			\
5868afae5d5Sryo 	    HHI_GCLK_MPEG1,		/* reg */			\
5878afae5d5Sryo 	    25)				/* bit */
5888afae5d5Sryo #define G12_CLK_usb							\
5898afae5d5Sryo 	MESON_CLK_GATE(MESONG12_CLOCK_USB, "usb",			\
5908afae5d5Sryo 	    "clk81",			/* parent */			\
5918afae5d5Sryo 	    HHI_GCLK_MPEG1,		/* reg */			\
5928afae5d5Sryo 	    26)				/* bit */
5938afae5d5Sryo #define G12_CLK_pcie_phy						\
5948afae5d5Sryo 	MESON_CLK_GATE(MESONG12_CLOCK_PCIE_PHY, "pcie_phy",		\
5958afae5d5Sryo 	    "clk81",			/* parent */			\
5968afae5d5Sryo 	    HHI_GCLK_MPEG1,		/* reg */			\
5978afae5d5Sryo 	    27)				/* bit */
5988afae5d5Sryo #define G12_CLK_ahb_arb0						\
5998afae5d5Sryo 	MESON_CLK_GATE(MESONG12_CLOCK_AHB_ARB0, "ahb_arb0",		\
6008afae5d5Sryo 	    "clk81",			/* parent */			\
6018afae5d5Sryo 	    HHI_GCLK_MPEG1,		/* reg */			\
6028afae5d5Sryo 	    29)				/* bit */
6038afae5d5Sryo #define G12_CLK_ahb_data_bus						\
6048afae5d5Sryo 	MESON_CLK_GATE(MESONG12_CLOCK_AHB_DATA_BUS, "ahb_data_bus",	\
6058afae5d5Sryo 	    "clk81",			/* parent */			\
6068afae5d5Sryo 	    HHI_GCLK_MPEG2,		/* reg */			\
6078afae5d5Sryo 	    1)				/* bit */
6088afae5d5Sryo #define G12_CLK_ahb_ctrl_bus						\
6098afae5d5Sryo 	MESON_CLK_GATE(MESONG12_CLOCK_AHB_CTRL_BUS, "ahb_ctrl_bus",	\
6108afae5d5Sryo 	    "clk81",			/* parent */			\
6118afae5d5Sryo 	    HHI_GCLK_MPEG2,		/* reg */			\
6128afae5d5Sryo 	    2)				/* bit */
6138afae5d5Sryo #define G12_CLK_htx_hdcp22						\
6148afae5d5Sryo 	MESON_CLK_GATE(MESONG12_CLOCK_HTX_HDCP22, "htx_hdcp22",		\
6158afae5d5Sryo 	    "clk81",			/* parent */			\
6168afae5d5Sryo 	    HHI_GCLK_MPEG2,		/* reg */			\
6178afae5d5Sryo 	    3)				/* bit */
6188afae5d5Sryo #define G12_CLK_htx_pclk						\
6198afae5d5Sryo 	MESON_CLK_GATE(MESONG12_CLOCK_HTX_PCLK, "htx_pclk",		\
6208afae5d5Sryo 	    "clk81",			/* parent */			\
6218afae5d5Sryo 	    HHI_GCLK_MPEG2,		/* reg */			\
6228afae5d5Sryo 	    4)				/* bit */
6238afae5d5Sryo #define G12_CLK_bt656							\
6248afae5d5Sryo 	MESON_CLK_GATE(MESONG12_CLOCK_BT656, "bt656",			\
6258afae5d5Sryo 	    "clk81",			/* parent */			\
6268afae5d5Sryo 	    HHI_GCLK_MPEG2,		/* reg */			\
6278afae5d5Sryo 	    6)				/* bit */
6288afae5d5Sryo #define G12_CLK_usb1_ddr_bridge						\
6298afae5d5Sryo 	MESON_CLK_GATE(MESONG12_CLOCK_USB1_DDR_BRIDGE, "usb1_ddr_bridge", \
6308afae5d5Sryo 	    "clk81",			/* parent */			\
6318afae5d5Sryo 	    HHI_GCLK_MPEG2,		/* reg */			\
6328afae5d5Sryo 	    8)				/* bit */
6338afae5d5Sryo #define G12_CLK_mmc_pclk						\
6348afae5d5Sryo 	MESON_CLK_GATE(MESONG12_CLOCK_MMC_PCLK, "mmc_pclk",		\
6358afae5d5Sryo 	    "clk81",			/* parent */			\
6368afae5d5Sryo 	    HHI_GCLK_MPEG2,		/* reg */			\
6378afae5d5Sryo 	    11)				/* bit */
6388afae5d5Sryo #define G12_CLK_uart2							\
6398afae5d5Sryo 	MESON_CLK_GATE(MESONG12_CLOCK_UART2, "uart2",			\
6408afae5d5Sryo 	    "clk81",			/* parent */			\
6418afae5d5Sryo 	    HHI_GCLK_MPEG2,		/* reg */			\
6428afae5d5Sryo 	    15)				/* bit */
6438afae5d5Sryo #define G12_CLK_vpu_intr						\
6448afae5d5Sryo 	MESON_CLK_GATE(MESONG12_CLOCK_VPU_INTR, "vpu_intr",		\
6458afae5d5Sryo 	    "clk81",			/* parent */			\
6468afae5d5Sryo 	    HHI_GCLK_MPEG2,		/* reg */			\
6478afae5d5Sryo 	    25)				/* bit */
6488afae5d5Sryo #define G12_CLK_gic							\
6498afae5d5Sryo 	MESON_CLK_GATE(MESONG12_CLOCK_GIC, "gic",			\
6508afae5d5Sryo 	    "clk81",			/* parent */			\
6518afae5d5Sryo 	    HHI_GCLK_MPEG2,		/* reg */			\
6528afae5d5Sryo 	    30)				/* bit */
6538afae5d5Sryo #define G12_CLK_vclk2_venci0						\
6548afae5d5Sryo 	MESON_CLK_GATE(MESONG12_CLOCK_VCLK2_VENCI0, "vclk2_venci0",	\
6558afae5d5Sryo 	    "clk81",			/* parent */			\
6568afae5d5Sryo 	    HHI_GCLK_OTHER,		/* reg */			\
6578afae5d5Sryo 	    1)				/* bit */
6588afae5d5Sryo #define G12_CLK_vclk2_venci1						\
6598afae5d5Sryo 	MESON_CLK_GATE(MESONG12_CLOCK_VCLK2_VENCI1, "vclk2_venci1",	\
6608afae5d5Sryo 	    "clk81",			/* parent */			\
6618afae5d5Sryo 	    HHI_GCLK_OTHER,		/* reg */			\
6628afae5d5Sryo 	    2)				/* bit */
6638afae5d5Sryo #define G12_CLK_vclk2_vencp0						\
6648afae5d5Sryo 	MESON_CLK_GATE(MESONG12_CLOCK_VCLK2_VENCP0, "vclk2_vencp0",	\
6658afae5d5Sryo 	    "clk81",			/* parent */			\
6668afae5d5Sryo 	    HHI_GCLK_OTHER,		/* reg */			\
6678afae5d5Sryo 	    3)				/* bit */
6688afae5d5Sryo #define G12_CLK_vclk2_vencp1						\
6698afae5d5Sryo 	MESON_CLK_GATE(MESONG12_CLOCK_VCLK2_VENCP1, "vclk2_vencp1",	\
6708afae5d5Sryo 	    "clk81",			/* parent */			\
6718afae5d5Sryo 	    HHI_GCLK_OTHER,		/* reg */			\
6728afae5d5Sryo 	    4)				/* bit */
6738afae5d5Sryo #define G12_CLK_vclk2_venct0						\
6748afae5d5Sryo 	MESON_CLK_GATE(MESONG12_CLOCK_VCLK2_VENCT0, "vclk2_venct0",	\
6758afae5d5Sryo 	    "clk81",			/* parent */			\
6768afae5d5Sryo 	    HHI_GCLK_OTHER,		/* reg */			\
6778afae5d5Sryo 	    5)				/* bit */
6788afae5d5Sryo #define G12_CLK_vclk2_venct1						\
6798afae5d5Sryo 	MESON_CLK_GATE(MESONG12_CLOCK_VCLK2_VENCT1, "vclk2_venct1",	\
6808afae5d5Sryo 	    "clk81",			/* parent */			\
6818afae5d5Sryo 	    HHI_GCLK_OTHER,		/* reg */			\
6828afae5d5Sryo 	    6)				/* bit */
6838afae5d5Sryo #define G12_CLK_vclk2_other						\
6848afae5d5Sryo 	MESON_CLK_GATE(MESONG12_CLOCK_VCLK2_OTHER, "vclk2_other",	\
6858afae5d5Sryo 	    "clk81",			/* parent */			\
6868afae5d5Sryo 	    HHI_GCLK_OTHER,		/* reg */			\
6878afae5d5Sryo 	    7)				/* bit */
6888afae5d5Sryo #define G12_CLK_vclk2_enci						\
6898afae5d5Sryo 	MESON_CLK_GATE(MESONG12_CLOCK_VCLK2_ENCI, "vclk2_enci",		\
6908afae5d5Sryo 	    "clk81",			/* parent */			\
6918afae5d5Sryo 	    HHI_GCLK_OTHER,		/* reg */			\
6928afae5d5Sryo 	    8)				/* bit */
6938afae5d5Sryo #define G12_CLK_vclk2_encp						\
6948afae5d5Sryo 	MESON_CLK_GATE(MESONG12_CLOCK_VCLK2_ENCP, "vclk2_encp",		\
6958afae5d5Sryo 	    "clk81",			/* parent */			\
6968afae5d5Sryo 	    HHI_GCLK_OTHER,		/* reg */			\
6978afae5d5Sryo 	    9)				/* bit */
6988afae5d5Sryo #define G12_CLK_dac_clk							\
6998afae5d5Sryo 	MESON_CLK_GATE(MESONG12_CLOCK_DAC_CLK, "dac_clk",		\
7008afae5d5Sryo 	    "clk81",			/* parent */			\
7018afae5d5Sryo 	    HHI_GCLK_OTHER,		/* reg */			\
7028afae5d5Sryo 	    10)				/* bit */
7038afae5d5Sryo #define G12_CLK_aoclk							\
7048afae5d5Sryo 	MESON_CLK_GATE(MESONG12_CLOCK_AOCLK, "aoclk",			\
7058afae5d5Sryo 	    "clk81",			/* parent */			\
7068afae5d5Sryo 	    HHI_GCLK_OTHER,		/* reg */			\
7078afae5d5Sryo 	    14)				/* bit */
7088afae5d5Sryo #define G12_CLK_iec958							\
7098afae5d5Sryo 	MESON_CLK_GATE(MESONG12_CLOCK_IEC958, "iec958",			\
7108afae5d5Sryo 	    "clk81",			/* parent */			\
7118afae5d5Sryo 	    HHI_GCLK_OTHER,		/* reg */			\
7128afae5d5Sryo 	    16)				/* bit */
7138afae5d5Sryo #define G12_CLK_enc480p							\
7148afae5d5Sryo 	MESON_CLK_GATE(MESONG12_CLOCK_ENC480P, "enc480p",		\
7158afae5d5Sryo 	    "clk81",			/* parent */			\
7168afae5d5Sryo 	    HHI_GCLK_OTHER,		/* reg */			\
7178afae5d5Sryo 	    20)				/* bit */
7188afae5d5Sryo #define G12_CLK_rng1							\
7198afae5d5Sryo 	MESON_CLK_GATE(MESONG12_CLOCK_RNG1, "rng1",			\
7208afae5d5Sryo 	    "clk81",			/* parent */			\
7218afae5d5Sryo 	    HHI_GCLK_OTHER,		/* reg */			\
7228afae5d5Sryo 	    21)				/* bit */
7238afae5d5Sryo #define G12_CLK_vclk2_enct						\
7248afae5d5Sryo 	MESON_CLK_GATE(MESONG12_CLOCK_VCLK2_ENCT, "vclk2_enct",		\
7258afae5d5Sryo 	    "clk81",			/* parent */			\
7268afae5d5Sryo 	    HHI_GCLK_OTHER,		/* reg */			\
7278afae5d5Sryo 	    22)				/* bit */
7288afae5d5Sryo #define G12_CLK_vclk2_encl						\
7298afae5d5Sryo 	MESON_CLK_GATE(MESONG12_CLOCK_VCLK2_ENCL, "vclk2_encl",		\
7308afae5d5Sryo 	    "clk81",			/* parent */			\
7318afae5d5Sryo 	    HHI_GCLK_OTHER,		/* reg */			\
7328afae5d5Sryo 	    23)				/* bit */
7338afae5d5Sryo #define G12_CLK_vclk2_venclmmc						\
7348afae5d5Sryo 	MESON_CLK_GATE(MESONG12_CLOCK_VCLK2_VENCLMMC, "vclk2_venclmmc",	\
7358afae5d5Sryo 	    "clk81",			/* parent */			\
7368afae5d5Sryo 	    HHI_GCLK_OTHER,		/* reg */			\
7378afae5d5Sryo 	    24)				/* bit */
7388afae5d5Sryo #define G12_CLK_vclk2_vencl						\
7398afae5d5Sryo 	MESON_CLK_GATE(MESONG12_CLOCK_VCLK2_VENCL, "vclk2_vencl",	\
7408afae5d5Sryo 	    "clk81",			/* parent */			\
7418afae5d5Sryo 	    HHI_GCLK_OTHER,		/* reg */			\
7428afae5d5Sryo 	    25)				/* bit */
7438afae5d5Sryo #define G12_CLK_vclk2_other1						\
7448afae5d5Sryo 	MESON_CLK_GATE(MESONG12_CLOCK_VCLK2_OTHER1, "vclk2_other1",	\
7458afae5d5Sryo 	    "clk81",			/* parent */			\
7468afae5d5Sryo 	    HHI_GCLK_OTHER,		/* reg */			\
7478afae5d5Sryo 	    26)				/* bit */
7488afae5d5Sryo #define G12_CLK_dma							\
7498afae5d5Sryo 	MESON_CLK_GATE(MESONG12_CLOCK_DMA, "dma",			\
7508afae5d5Sryo 	    "clk81",			/* parent */			\
7518afae5d5Sryo 	    HHI_GCLK_OTHER2,		/* reg */			\
7528afae5d5Sryo 	    0)				/* bit */
7538afae5d5Sryo #define G12_CLK_efuse							\
7548afae5d5Sryo 	MESON_CLK_GATE(MESONG12_CLOCK_EFUSE, "efuse",			\
7558afae5d5Sryo 	    "clk81",			/* parent */			\
7568afae5d5Sryo 	    HHI_GCLK_OTHER2,		/* reg */			\
7578afae5d5Sryo 	    1)				/* bit */
7588afae5d5Sryo #define G12_CLK_rom_boot						\
7598afae5d5Sryo 	MESON_CLK_GATE(MESONG12_CLOCK_ROM_BOOT, "rom_boot",		\
7608afae5d5Sryo 	    "clk81",			/* parent */			\
7618afae5d5Sryo 	    HHI_GCLK_OTHER2,		/* reg */			\
7628afae5d5Sryo 	    2)				/* bit */
7638afae5d5Sryo #define G12_CLK_reset_sec						\
7648afae5d5Sryo 	MESON_CLK_GATE(MESONG12_CLOCK_RESET_SEC, "reset_sec",		\
7658afae5d5Sryo 	    "clk81",			/* parent */			\
7668afae5d5Sryo 	    HHI_GCLK_OTHER2,		/* reg */			\
7678afae5d5Sryo 	    3)				/* bit */
7688afae5d5Sryo #define G12_CLK_sec_ahb_apb3						\
7698afae5d5Sryo 	MESON_CLK_GATE(MESONG12_CLOCK_SEC_AHB_APB3, "sec_ahb_apb3",	\
7708afae5d5Sryo 	    "clk81",			/* parent */			\
7718afae5d5Sryo 	    HHI_GCLK_OTHER2,		/* reg */			\
7728afae5d5Sryo 	    4)				/* bit */
7738afae5d5Sryo 
7748afae5d5Sryo /* little cpu cluster */
7758afae5d5Sryo #define G12_CLK_cpu_clk_dyn0_sel					\
7768afae5d5Sryo 	MESON_CLK_MUX(MESONG12_CLOCK_CPU_CLK_DYN0_SEL, "cpu_clk_dyn0_sel", \
7778afae5d5Sryo 	    PARENTS("fclk_div2", "fclk_div3", "xtal"),			\
7788afae5d5Sryo 	    HHI_SYS_CPU_CLK_CNTL0,	/* reg */			\
7798afae5d5Sryo 	    __BITS(1,0),		/* sel */			\
7808afae5d5Sryo 	    0)
7818afae5d5Sryo #define G12_CLK_cpu_clk_dyn1_sel					\
7828afae5d5Sryo 	MESON_CLK_MUX(MESONG12_CLOCK_CPU_CLK_DYN1_SEL, "cpu_clk_dyn1_sel", \
7838afae5d5Sryo 	    PARENTS("fclk_div2", "fclk_div3", "xtal"),			\
7848afae5d5Sryo 	    HHI_SYS_CPU_CLK_CNTL0,	/* reg */			\
7858afae5d5Sryo 	    __BITS(17,16),		/* sel */			\
7868afae5d5Sryo 	    0)
7878afae5d5Sryo #define G12_CLK_cpu_clk_dyn0_div					\
7888afae5d5Sryo 	MESON_CLK_DIV(MESONG12_CLOCK_CPU_CLK_DYN0_DIV, "cpu_clk_dyn0_div", \
7898afae5d5Sryo 	    "cpu_clk_dyn0_sel",		/* parent */			\
7908afae5d5Sryo 	    HHI_SYS_CPU_CLK_CNTL0,	/* reg */			\
7918afae5d5Sryo 	    __BIT(26),			/* div */			\
7928afae5d5Sryo 	    0)
7938afae5d5Sryo #define G12_CLK_cpu_clk_dyn1_div					\
7948afae5d5Sryo 	MESON_CLK_DIV(MESONG12_CLOCK_CPU_CLK_DYN1_DIV, "cpu_clk_dyn1_div", \
7958afae5d5Sryo 	    "cpu_clk_dyn1_sel",		/* parent */			\
7968afae5d5Sryo 	    HHI_SYS_CPU_CLK_CNTL0,	/* reg */			\
7978afae5d5Sryo 	    __BITS(25,20),		/* div */			\
7988afae5d5Sryo 	    0)
7998afae5d5Sryo #define G12_CLK_cpu_clk_dyn0						\
8008afae5d5Sryo 	MESON_CLK_MUX(MESONG12_CLOCK_CPU_CLK_DYN0, "cpu_clk_dyn0",	\
8018afae5d5Sryo 	    PARENTS("cpu_clk_dyn0_div", "cpu_clk_dyn0_sel"),		\
8028afae5d5Sryo 	    HHI_SYS_CPU_CLK_CNTL0,	/* reg */			\
8038afae5d5Sryo 	    __BIT(2),			/* sel */			\
8048afae5d5Sryo 	    0)
8058afae5d5Sryo #define G12_CLK_cpu_clk_dyn1						\
8068afae5d5Sryo 	MESON_CLK_MUX(MESONG12_CLOCK_CPU_CLK_DYN1, "cpu_clk_dyn1",	\
8078afae5d5Sryo 	    PARENTS("cpu_clk_dyn1_div", "cpu_clk_dyn1_sel"),		\
8088afae5d5Sryo 	    HHI_SYS_CPU_CLK_CNTL0,	/* reg */			\
8098afae5d5Sryo 	    __BIT(18),			/* sel */			\
8108afae5d5Sryo 	    0)
8118afae5d5Sryo #define G12_CLK_cpu_clk_dyn						\
8128afae5d5Sryo 	MESON_CLK_MUX(MESONG12_CLOCK_CPU_CLK_DYN, "cpu_clk_dyn",	\
8138afae5d5Sryo 	    PARENTS("cpu_clk_dyn0", "cpu_clk_dyn1"),			\
8148afae5d5Sryo 	    HHI_SYS_CPU_CLK_CNTL0,	/* reg */			\
8158afae5d5Sryo 	    __BIT(10),			/* sel */			\
8168afae5d5Sryo 	    0)
8178afae5d5Sryo #define G12A_CLK_cpu_clk						\
8188afae5d5Sryo 	MESON_CLK_MUX_RATE(MESONG12_CLOCK_CPU_CLK, "cpu_clk",		\
8198afae5d5Sryo 	    PARENTS("cpu_clk_dyn", "sys_pll"),				\
8208afae5d5Sryo 	    HHI_SYS_CPU_CLK_CNTL0,	/* reg */			\
8218afae5d5Sryo 	    __BIT(11),			/* sel */			\
8228afae5d5Sryo 	    mesong12_cpuclk_get_rate,					\
8238afae5d5Sryo 	    mesong12_cpuclk_set_rate,					\
8248afae5d5Sryo 	    0)
8258afae5d5Sryo #define G12B_CLK_cpu_clk						\
8268afae5d5Sryo 	MESON_CLK_MUX_RATE(MESONG12_CLOCK_CPU_CLK, "cpu_clk",		\
8278afae5d5Sryo 	    PARENTS("cpu_clk_dyn", "sys1_pll"),				\
8288afae5d5Sryo 	    HHI_SYS_CPU_CLK_CNTL0,	/* reg */			\
8298afae5d5Sryo 	    __BIT(11),			/* sel */			\
8308afae5d5Sryo 	    mesong12_cpuclk_get_rate,					\
8318afae5d5Sryo 	    mesong12_cpuclk_set_rate,					\
8328afae5d5Sryo 	    0)
8338afae5d5Sryo 
8348afae5d5Sryo /* big cpu cluster */
8358afae5d5Sryo #define G12_CLK_cpub_clk_dyn0_sel					\
8368afae5d5Sryo 	MESON_CLK_MUX(MESONG12_CLOCK_CPUB_CLK_DYN0_SEL, "cpub_clk_dyn0_sel", \
8378afae5d5Sryo 	    PARENTS("fclk_div2", "fclk_div3", "xtal"),			\
8388afae5d5Sryo 	    HHI_SYS_CPUB_CLK_CNTL,	/* reg */			\
8398afae5d5Sryo 	    __BITS(1,0),		/* sel */			\
8408afae5d5Sryo 	    0)
8418afae5d5Sryo #define G12_CLK_cpub_clk_dyn0_div					\
8428afae5d5Sryo 	MESON_CLK_DIV(MESONG12_CLOCK_CPUB_CLK_DYN0_DIV, "cpub_clk_dyn0_div", \
8438afae5d5Sryo 	    "cpub_clk_dyn0_sel",	/* parent */			\
8448afae5d5Sryo 	    HHI_SYS_CPUB_CLK_CNTL,	/* reg */			\
8458afae5d5Sryo 	    __BITS(9,4),		/* div */			\
8468afae5d5Sryo 	    0)
8478afae5d5Sryo #define G12_CLK_cpub_clk_dyn0						\
8488afae5d5Sryo 	MESON_CLK_MUX(MESONG12_CLOCK_CPUB_CLK_DYN0, "cpub_clk_dyn0",	\
8498afae5d5Sryo 	    PARENTS("cpub_clk_dyn0_div", "cpub_clk_dyn0_sel"),		\
8508afae5d5Sryo 	    HHI_SYS_CPUB_CLK_CNTL,	/* reg */			\
8518afae5d5Sryo 	    __BIT(2),			/* sel */			\
8528afae5d5Sryo 	    0)
8538afae5d5Sryo #define G12_CLK_cpub_clk_dyn1_sel					\
8548afae5d5Sryo 	MESON_CLK_MUX(MESONG12_CLOCK_CPUB_CLK_DYN1_SEL, "cpub_clk_dyn1_sel", \
8558afae5d5Sryo 	    PARENTS("fclk_div2", "fclk_div3", "xtal", "xtal"),		\
8568afae5d5Sryo 	    HHI_SYS_CPUB_CLK_CNTL,	/* reg */			\
8578afae5d5Sryo 	    __BITS(17,16),		/* sel */			\
8588afae5d5Sryo 	    0)
8598afae5d5Sryo #define G12_CLK_cpub_clk_dyn1_div					\
8608afae5d5Sryo 	MESON_CLK_DIV(MESONG12_CLOCK_CPUB_CLK_DYN1_DIV, "cpub_clk_dyn1_div", \
8618afae5d5Sryo 	    "cpub_clk_dyn1_sel",	/* parent */			\
8628afae5d5Sryo 	    HHI_SYS_CPUB_CLK_CNTL,	/* reg */			\
8638afae5d5Sryo 	    __BITS(25,20),		/* div */			\
8648afae5d5Sryo 	    0)
8658afae5d5Sryo #define G12_CLK_cpub_clk_dyn1						\
8668afae5d5Sryo 	MESON_CLK_MUX(MESONG12_CLOCK_CPUB_CLK_DYN1, "cpub_clk_dyn1",	\
8678afae5d5Sryo 	    PARENTS("cpub_clk_dyn1_div", "cpub_clk_dyn1_sel"),		\
8688afae5d5Sryo 	    HHI_SYS_CPUB_CLK_CNTL,	/* reg */			\
8698afae5d5Sryo 	    __BIT(18),			/* sel */			\
8708afae5d5Sryo 	    0)
8718afae5d5Sryo #define G12_CLK_cpub_clk_dyn						\
8728afae5d5Sryo 	MESON_CLK_MUX(MESONG12_CLOCK_CPUB_CLK_DYN, "cpub_clk_dyn",	\
8738afae5d5Sryo 	    PARENTS("cpub_clk_dyn0", "cpub_clk_dyn1"),			\
8748afae5d5Sryo 	    HHI_SYS_CPUB_CLK_CNTL,	/* reg */			\
8758afae5d5Sryo 	    __BIT(10),			/* sel */			\
8768afae5d5Sryo 	    0)
8778afae5d5Sryo #define G12_CLK_cpub_clk						\
8788afae5d5Sryo 	MESON_CLK_MUX_RATE(MESONG12_CLOCK_CPUB_CLK, "cpub_clk",		\
8798afae5d5Sryo 	    PARENTS("cpub_clk_dyn", "sys_pll"),				\
8808afae5d5Sryo 	    HHI_SYS_CPUB_CLK_CNTL,	/* reg */			\
8818afae5d5Sryo 	    __BIT(11),			/* sel */			\
8828afae5d5Sryo 	    mesong12_cpuclk_get_rate,					\
8838afae5d5Sryo 	    mesong12_cpuclk_set_rate,					\
8848afae5d5Sryo 	    0)
8858afae5d5Sryo 
8868afae5d5Sryo /* ts */
8878afae5d5Sryo #define G12_CLK_ts_div							\
8888afae5d5Sryo 	MESON_CLK_DIV(MESONG12_CLOCK_TS_DIV, "ts_div",			\
8898afae5d5Sryo 	    "xtal",			/* parent */			\
8908afae5d5Sryo 	    HHI_TS_CLK_CNTL,		/* reg */			\
8918afae5d5Sryo 	    __BITS(7,0),		/* div */			\
8928afae5d5Sryo 	    0)
8938afae5d5Sryo #define G12_CLK_ts							\
8948afae5d5Sryo 	MESON_CLK_GATE(MESONG12_CLOCK_TS, "ts",				\
8958afae5d5Sryo 	    "ts_div",			/* parent */			\
8968afae5d5Sryo 	    HHI_TS_CLK_CNTL,		/* ret */			\
8978afae5d5Sryo 	    8)				/* bit */
8988afae5d5Sryo 
8998afae5d5Sryo /* hdmi */
9008afae5d5Sryo #define G12_CLK_hdmi_pll_dco						\
9018afae5d5Sryo 	MESON_CLK_PLL(MESONG12_CLOCK_HDMI_PLL_DCO, "hdmi_pll_dco",	\
9028afae5d5Sryo 	    "xtal",						/* parent */ \
9038afae5d5Sryo 	    MESON_CLK_PLL_REG(HHI_HDMI_PLL_CNTL0, __BIT(28)),	/* enable */ \
9048afae5d5Sryo 	    MESON_CLK_PLL_REG(HHI_HDMI_PLL_CNTL0, __BITS(7,0)),	/* m */ \
9058afae5d5Sryo 	    MESON_CLK_PLL_REG(HHI_HDMI_PLL_CNTL0, __BITS(14,10)),/* n */ \
9068afae5d5Sryo 	    MESON_CLK_PLL_REG(HHI_HDMI_PLL_CNTL1, __BITS(15,0)),/* frac */ \
9078afae5d5Sryo 	    MESON_CLK_PLL_REG(HHI_HDMI_PLL_CNTL0, __BIT(30)),	/* l */ \
9088afae5d5Sryo 	    MESON_CLK_PLL_REG(HHI_HDMI_PLL_CNTL0, __BIT(29)),	/* reset */ \
9098afae5d5Sryo 	    0)
9108afae5d5Sryo #define G12_CLK_hdmi_pll_od						\
9118afae5d5Sryo 	MESON_CLK_DIV(MESONG12_CLOCK_HDMI_PLL_OD, "hdmi_pll_od",	\
9128afae5d5Sryo 	    "hdmi_pll_dco",		/* parent */			\
9138afae5d5Sryo 	    HHI_HDMI_PLL_CNTL0,		/* reg */			\
9148afae5d5Sryo 	    __BITS(17,16),		/* div */			\
9158afae5d5Sryo 	    MESON_CLK_DIV_POWER_OF_TWO)
9168afae5d5Sryo #define G12_CLK_hdmi_pll_od2						\
9178afae5d5Sryo 	MESON_CLK_DIV(MESONG12_CLOCK_HDMI_PLL_OD2, "hdmi_pll_od2",	\
9188afae5d5Sryo 	    "hdmi_pll_od",		/* parent */			\
9198afae5d5Sryo 	    HHI_HDMI_PLL_CNTL0,		/* reg */			\
9208afae5d5Sryo 	    __BITS(19,18),		/* div */			\
9218afae5d5Sryo 	    MESON_CLK_DIV_POWER_OF_TWO)
9228afae5d5Sryo #define G12_CLK_hdmi_pll						\
9238afae5d5Sryo 	MESON_CLK_DIV(MESONG12_CLOCK_HDMI_PLL, "hdmi_pll",		\
9248afae5d5Sryo 	    "hdmi_pll_od2",		/* parent */			\
9258afae5d5Sryo 	    HHI_HDMI_PLL_CNTL0,		/* reg */			\
9268afae5d5Sryo 	    __BITS(21,20),		/* div */			\
9278afae5d5Sryo 	    MESON_CLK_DIV_POWER_OF_TWO)
9288afae5d5Sryo 
9298afae5d5Sryo #define G12_CLK_vid_pll_div						\
9308afae5d5Sryo 	MESON_CLK_DIV(MESONG12_CLOCK_VID_PLL_DIV, "vid_pll_div",	\
9318afae5d5Sryo 	    "hdmi_pll",			/* parent */			\
9328afae5d5Sryo 	    HHI_FIX_PLL_CNTL0,		/* reg */			\
9338afae5d5Sryo 	    __BITS(17,16),		/* div */			\
9348afae5d5Sryo 	    0)
9358afae5d5Sryo #define G12_CLK_vid_pll_sel						\
9368afae5d5Sryo 	MESON_CLK_MUX(MESONG12_CLOCK_VID_PLL_SEL, "vid_pll_sel",	\
9378afae5d5Sryo 	    PARENTS("vid_pll_div", "hdmi_pll"),				\
9388afae5d5Sryo 	    HHI_VID_PLL_CLK_DIV,	/* reg */			\
9398afae5d5Sryo 	    __BIT(18),			/* sel */			\
9408afae5d5Sryo 	    0)
9418afae5d5Sryo #define G12_CLK_vid_pll							\
942*32a2c5d5Sjoerg 	MESON_CLK_GATE(MESONG12_CLOCK_VID_PLL, "vid_pll",		\
9438afae5d5Sryo 	    "vid_pll_sel",		/* parent */			\
9448afae5d5Sryo 	    HHI_VID_PLL_CLK_DIV,	/* reg */			\
9458afae5d5Sryo 	    19)				/* bit */
9468afae5d5Sryo 
9478afae5d5Sryo /* USB3/PCIe */
9488afae5d5Sryo #define G12_CLK_pcie_pll_dco						\
9498afae5d5Sryo 	MESON_CLK_PLL_RATE(MESONG12_CLOCK_PCIE_PLL_DCO, "pcie_pll_dco",	\
9508afae5d5Sryo 	    "xtal",						/* parent */ \
9518afae5d5Sryo 	    MESON_CLK_PLL_REG(HHI_PCIE_PLL_CNTL0, __BIT(28)),	/* enable */ \
9528afae5d5Sryo 	    MESON_CLK_PLL_REG(HHI_PCIE_PLL_CNTL0, __BITS(7,0)),	/* m */ \
9538afae5d5Sryo 	    MESON_CLK_PLL_REG(HHI_PCIE_PLL_CNTL0, __BITS(14,10)),/* n */ \
9548afae5d5Sryo 	    MESON_CLK_PLL_REG(HHI_PCIE_PLL_CNTL1, __BITS(11,0)),/* frac */ \
9558afae5d5Sryo 	    MESON_CLK_PLL_REG(HHI_PCIE_PLL_CNTL0, __BIT(31)),	/* l */ \
9568afae5d5Sryo 	    MESON_CLK_PLL_REG(HHI_PCIE_PLL_CNTL0, __BIT(29)),	/* reset */ \
9578afae5d5Sryo 	    mesong12_clk_pcie_pll_set_rate,				\
9588afae5d5Sryo 	    0)
9598afae5d5Sryo #define G12_CLK_pcie_pll_dco_div2					\
9608afae5d5Sryo 	MESON_CLK_FIXED_FACTOR(MESONG12_CLOCK_PCIE_PLL_DCO_DIV2,	\
9618afae5d5Sryo 	    "pcie_pll_dco_div2",					\
9628afae5d5Sryo 	    "pcie_pll_dco",		/* parent */			\
9638afae5d5Sryo 	    2,				/* div */			\
9648afae5d5Sryo 	    1)				/* mult */
9658afae5d5Sryo #define G12_CLK_pcie_pll_od						\
9668afae5d5Sryo 	MESON_CLK_DIV(MESONG12_CLOCK_PCIE_PLL_OD, "pcie_pll_od",	\
9678afae5d5Sryo 	    "pcie_pll_dco_div2",	/* parent */			\
9688afae5d5Sryo 	    HHI_PCIE_PLL_CNTL0,		/* reg */			\
9698afae5d5Sryo 	    __BITS(20,16),		/* div */			\
9708afae5d5Sryo 	    MESON_CLK_DIV_SET_RATE_PARENT)
9718afae5d5Sryo #define G12_CLK_pcie_pll_pll						\
9728afae5d5Sryo 	MESON_CLK_FIXED_FACTOR(MESONG12_CLOCK_PCIE_PLL, "pcie_pll_pll",	\
9738afae5d5Sryo 	    "pcie_pll_od",		/* parent */			\
9748afae5d5Sryo 	    2,				/* div */			\
9758afae5d5Sryo 	    1)				/* mult */
9768afae5d5Sryo 
9778afae5d5Sryo /* not all clocks are defined */
9788afae5d5Sryo static struct meson_clk_clk mesong12a_clkc_clks[] = {
9798afae5d5Sryo 	G12_CLK_fixed_pll_dco,
9808afae5d5Sryo 	G12_CLK_fixed_pll,
9818afae5d5Sryo 	G12_CLK_sys_pll_dco,
9828afae5d5Sryo 	G12_CLK_sys_pll,
9838afae5d5Sryo 	G12_CLK_fclk_div2_div,
9848afae5d5Sryo 	G12_CLK_fclk_div2,
9858afae5d5Sryo 	G12_CLK_fclk_div2p5_div,
9868afae5d5Sryo 	G12_CLK_fclk_div3_div,
9878afae5d5Sryo 	G12_CLK_fclk_div3,
9888afae5d5Sryo 	G12_CLK_fclk_div4_div,
9898afae5d5Sryo 	G12_CLK_fclk_div4,
9908afae5d5Sryo 	G12_CLK_fclk_div5_div,
9918afae5d5Sryo 	G12_CLK_fclk_div5,
9928afae5d5Sryo 	G12_CLK_fclk_div7_div,
9938afae5d5Sryo 	G12_CLK_fclk_div7,
9948afae5d5Sryo 	G12_CLK_mpll_prediv,
9958afae5d5Sryo 	G12_CLK_mpll0_div,
9968afae5d5Sryo 	G12_CLK_mpll1_div,
9978afae5d5Sryo 	G12_CLK_mpll2_div,
9988afae5d5Sryo 	G12_CLK_mpll0,
9998afae5d5Sryo 	G12_CLK_mpll1,
10008afae5d5Sryo 	G12_CLK_mpll2,
10018afae5d5Sryo 	G12_CLK_mpeg_sel,
10028afae5d5Sryo 	G12_CLK_mpeg_clk_div,
10038afae5d5Sryo 	G12_CLK_clk81,
10048afae5d5Sryo 	G12_CLK_mpll_50m_div,
10058afae5d5Sryo 	G12_CLK_mpll_50m,
10068afae5d5Sryo 	G12_CLK_sd_emmc_a_clk0_sel,
10078afae5d5Sryo 	G12_CLK_sd_emmc_b_clk0_sel,
10088afae5d5Sryo 	G12_CLK_sd_emmc_c_clk0_sel,
10098afae5d5Sryo 	G12_CLK_sd_emmc_a_clk0_div,
10108afae5d5Sryo 	G12_CLK_sd_emmc_b_clk0_div,
10118afae5d5Sryo 	G12_CLK_sd_emmc_c_clk0_div,
10128afae5d5Sryo 	G12_CLK_sd_emmc_a_clk0,
10138afae5d5Sryo 	G12_CLK_sd_emmc_b_clk0,
10148afae5d5Sryo 	G12_CLK_sd_emmc_c_clk0,
10158afae5d5Sryo 	G12_CLK_ddr,
10168afae5d5Sryo 	G12_CLK_dos,
10178afae5d5Sryo 	G12_CLK_audio_locker,
10188afae5d5Sryo 	G12_CLK_mipi_dsi_host,
10198afae5d5Sryo 	G12_CLK_eth_phy,
10208afae5d5Sryo 	G12_CLK_isa,
10218afae5d5Sryo 	G12_CLK_pl301,
10228afae5d5Sryo 	G12_CLK_periphs,
10238afae5d5Sryo 	G12_CLK_spicc0,
10248afae5d5Sryo 	G12_CLK_i2c,
10258afae5d5Sryo 	G12_CLK_sana,
10268afae5d5Sryo 	G12_CLK_sd,
10278afae5d5Sryo 	G12_CLK_rng0,
10288afae5d5Sryo 	G12_CLK_uart0,
10298afae5d5Sryo 	G12_CLK_spicc1,
10308afae5d5Sryo 	G12_CLK_hiu_iface,
10318afae5d5Sryo 	G12_CLK_mipi_dsi_phy,
10328afae5d5Sryo 	G12_CLK_assist_misc,
10338afae5d5Sryo 	G12_CLK_sd_emmc_a,
10348afae5d5Sryo 	G12_CLK_sd_emmc_b,
10358afae5d5Sryo 	G12_CLK_sd_emmc_c,
10368afae5d5Sryo 	G12_CLK_audio_codec,
10378afae5d5Sryo 	G12_CLK_audio,
10388afae5d5Sryo 	G12_CLK_eth,
10398afae5d5Sryo 	G12_CLK_demux,
10408afae5d5Sryo 	G12_CLK_audio_ififo,
10418afae5d5Sryo 	G12_CLK_adc,
10428afae5d5Sryo 	G12_CLK_uart1,
10438afae5d5Sryo 	G12_CLK_g2d,
10448afae5d5Sryo 	G12_CLK_reset,
10458afae5d5Sryo 	G12_CLK_pcie_comb,
10468afae5d5Sryo 	G12_CLK_parser,
10478afae5d5Sryo 	G12_CLK_usb,
10488afae5d5Sryo 	G12_CLK_pcie_phy,
10498afae5d5Sryo 	G12_CLK_ahb_arb0,
10508afae5d5Sryo 	G12_CLK_ahb_data_bus,
10518afae5d5Sryo 	G12_CLK_ahb_ctrl_bus,
10528afae5d5Sryo 	G12_CLK_htx_hdcp22,
10538afae5d5Sryo 	G12_CLK_htx_pclk,
10548afae5d5Sryo 	G12_CLK_bt656,
10558afae5d5Sryo 	G12_CLK_usb1_ddr_bridge,
10568afae5d5Sryo 	G12_CLK_mmc_pclk,
10578afae5d5Sryo 	G12_CLK_uart2,
10588afae5d5Sryo 	G12_CLK_vpu_intr,
10598afae5d5Sryo 	G12_CLK_gic,
10608afae5d5Sryo 	G12_CLK_vclk2_venci0,
10618afae5d5Sryo 	G12_CLK_vclk2_venci1,
10628afae5d5Sryo 	G12_CLK_vclk2_vencp0,
10638afae5d5Sryo 	G12_CLK_vclk2_vencp1,
10648afae5d5Sryo 	G12_CLK_vclk2_venct0,
10658afae5d5Sryo 	G12_CLK_vclk2_venct1,
10668afae5d5Sryo 	G12_CLK_vclk2_other,
10678afae5d5Sryo 	G12_CLK_vclk2_enci,
10688afae5d5Sryo 	G12_CLK_vclk2_encp,
10698afae5d5Sryo 	G12_CLK_dac_clk,
10708afae5d5Sryo 	G12_CLK_aoclk,
10718afae5d5Sryo 	G12_CLK_iec958,
10728afae5d5Sryo 	G12_CLK_enc480p,
10738afae5d5Sryo 	G12_CLK_rng1,
10748afae5d5Sryo 	G12_CLK_vclk2_enct,
10758afae5d5Sryo 	G12_CLK_vclk2_encl,
10768afae5d5Sryo 	G12_CLK_vclk2_venclmmc,
10778afae5d5Sryo 	G12_CLK_vclk2_vencl,
10788afae5d5Sryo 	G12_CLK_vclk2_other1,
10798afae5d5Sryo 	G12_CLK_dma,
10808afae5d5Sryo 	G12_CLK_efuse,
10818afae5d5Sryo 	G12_CLK_rom_boot,
10828afae5d5Sryo 	G12_CLK_reset_sec,
10838afae5d5Sryo 	G12_CLK_sec_ahb_apb3,
10848afae5d5Sryo 	G12_CLK_cpu_clk_dyn0_sel,
10858afae5d5Sryo 	G12_CLK_cpu_clk_dyn1_sel,
10868afae5d5Sryo 	G12_CLK_cpu_clk_dyn0_div,
10878afae5d5Sryo 	G12_CLK_cpu_clk_dyn1_div,
10888afae5d5Sryo 	G12_CLK_cpu_clk_dyn0,
10898afae5d5Sryo 	G12_CLK_cpu_clk_dyn1,
10908afae5d5Sryo 	G12_CLK_cpu_clk_dyn,
10918afae5d5Sryo 	G12A_CLK_cpu_clk,
10928afae5d5Sryo 	G12_CLK_ts_div,
10938afae5d5Sryo 	G12_CLK_ts,
10948afae5d5Sryo 	G12_CLK_hdmi_pll_dco,
10958afae5d5Sryo 	G12_CLK_hdmi_pll_od,
10968afae5d5Sryo 	G12_CLK_hdmi_pll_od2,
10978afae5d5Sryo 	G12_CLK_hdmi_pll,
10988afae5d5Sryo 	G12_CLK_vid_pll_div,
10998afae5d5Sryo 	G12_CLK_vid_pll_sel,
11008afae5d5Sryo 	G12_CLK_vid_pll,
11018afae5d5Sryo 	G12_CLK_pcie_pll_dco,
11028afae5d5Sryo 	G12_CLK_pcie_pll_dco_div2,
11038afae5d5Sryo 	G12_CLK_pcie_pll_od,
11048afae5d5Sryo 	G12_CLK_pcie_pll_pll
11058afae5d5Sryo };
11068afae5d5Sryo 
11078afae5d5Sryo static struct meson_clk_clk mesong12b_clkc_clks[] = {
11088afae5d5Sryo 	G12_CLK_fixed_pll_dco,
11098afae5d5Sryo 	G12_CLK_fixed_pll,
11108afae5d5Sryo 	G12_CLK_sys_pll_dco,
11118afae5d5Sryo 	G12_CLK_sys_pll,
11128afae5d5Sryo 	G12B_CLK_sys1_pll_dco,
11138afae5d5Sryo 	G12B_CLK_sys1_pll,
11148afae5d5Sryo 	G12_CLK_fclk_div2_div,
11158afae5d5Sryo 	G12_CLK_fclk_div2,
11168afae5d5Sryo 	G12_CLK_fclk_div2p5_div,
11178afae5d5Sryo 	G12_CLK_fclk_div3_div,
11188afae5d5Sryo 	G12_CLK_fclk_div3,
11198afae5d5Sryo 	G12_CLK_fclk_div4_div,
11208afae5d5Sryo 	G12_CLK_fclk_div4,
11218afae5d5Sryo 	G12_CLK_fclk_div5_div,
11228afae5d5Sryo 	G12_CLK_fclk_div5,
11238afae5d5Sryo 	G12_CLK_fclk_div7_div,
11248afae5d5Sryo 	G12_CLK_fclk_div7,
11258afae5d5Sryo 	G12_CLK_mpll_prediv,
11268afae5d5Sryo 	G12_CLK_mpll0_div,
11278afae5d5Sryo 	G12_CLK_mpll1_div,
11288afae5d5Sryo 	G12_CLK_mpll2_div,
11298afae5d5Sryo 	G12_CLK_mpll0,
11308afae5d5Sryo 	G12_CLK_mpll1,
11318afae5d5Sryo 	G12_CLK_mpll2,
11328afae5d5Sryo 	G12_CLK_mpeg_sel,
11338afae5d5Sryo 	G12_CLK_mpeg_clk_div,
11348afae5d5Sryo 	G12_CLK_clk81,
11358afae5d5Sryo 	G12_CLK_mpll_50m_div,
11368afae5d5Sryo 	G12_CLK_mpll_50m,
11378afae5d5Sryo 	G12_CLK_sd_emmc_a_clk0_sel,
11388afae5d5Sryo 	G12_CLK_sd_emmc_b_clk0_sel,
11398afae5d5Sryo 	G12_CLK_sd_emmc_c_clk0_sel,
11408afae5d5Sryo 	G12_CLK_sd_emmc_a_clk0_div,
11418afae5d5Sryo 	G12_CLK_sd_emmc_b_clk0_div,
11428afae5d5Sryo 	G12_CLK_sd_emmc_c_clk0_div,
11438afae5d5Sryo 	G12_CLK_sd_emmc_a_clk0,
11448afae5d5Sryo 	G12_CLK_sd_emmc_b_clk0,
11458afae5d5Sryo 	G12_CLK_sd_emmc_c_clk0,
11468afae5d5Sryo 	G12_CLK_ddr,
11478afae5d5Sryo 	G12_CLK_dos,
11488afae5d5Sryo 	G12_CLK_audio_locker,
11498afae5d5Sryo 	G12_CLK_mipi_dsi_host,
11508afae5d5Sryo 	G12_CLK_eth_phy,
11518afae5d5Sryo 	G12_CLK_isa,
11528afae5d5Sryo 	G12_CLK_pl301,
11538afae5d5Sryo 	G12_CLK_periphs,
11548afae5d5Sryo 	G12_CLK_spicc0,
11558afae5d5Sryo 	G12_CLK_i2c,
11568afae5d5Sryo 	G12_CLK_sana,
11578afae5d5Sryo 	G12_CLK_sd,
11588afae5d5Sryo 	G12_CLK_rng0,
11598afae5d5Sryo 	G12_CLK_uart0,
11608afae5d5Sryo 	G12_CLK_spicc1,
11618afae5d5Sryo 	G12_CLK_hiu_iface,
11628afae5d5Sryo 	G12_CLK_mipi_dsi_phy,
11638afae5d5Sryo 	G12_CLK_assist_misc,
11648afae5d5Sryo 	G12_CLK_sd_emmc_a,
11658afae5d5Sryo 	G12_CLK_sd_emmc_b,
11668afae5d5Sryo 	G12_CLK_sd_emmc_c,
11678afae5d5Sryo 	G12_CLK_audio_codec,
11688afae5d5Sryo 	G12_CLK_audio,
11698afae5d5Sryo 	G12_CLK_eth,
11708afae5d5Sryo 	G12_CLK_demux,
11718afae5d5Sryo 	G12_CLK_audio_ififo,
11728afae5d5Sryo 	G12_CLK_adc,
11738afae5d5Sryo 	G12_CLK_uart1,
11748afae5d5Sryo 	G12_CLK_g2d,
11758afae5d5Sryo 	G12_CLK_reset,
11768afae5d5Sryo 	G12_CLK_pcie_comb,
11778afae5d5Sryo 	G12_CLK_parser,
11788afae5d5Sryo 	G12_CLK_usb,
11798afae5d5Sryo 	G12_CLK_pcie_phy,
11808afae5d5Sryo 	G12_CLK_ahb_arb0,
11818afae5d5Sryo 	G12_CLK_ahb_data_bus,
11828afae5d5Sryo 	G12_CLK_ahb_ctrl_bus,
11838afae5d5Sryo 	G12_CLK_htx_hdcp22,
11848afae5d5Sryo 	G12_CLK_htx_pclk,
11858afae5d5Sryo 	G12_CLK_bt656,
11868afae5d5Sryo 	G12_CLK_usb1_ddr_bridge,
11878afae5d5Sryo 	G12_CLK_mmc_pclk,
11888afae5d5Sryo 	G12_CLK_uart2,
11898afae5d5Sryo 	G12_CLK_vpu_intr,
11908afae5d5Sryo 	G12_CLK_gic,
11918afae5d5Sryo 	G12_CLK_vclk2_venci0,
11928afae5d5Sryo 	G12_CLK_vclk2_venci1,
11938afae5d5Sryo 	G12_CLK_vclk2_vencp0,
11948afae5d5Sryo 	G12_CLK_vclk2_vencp1,
11958afae5d5Sryo 	G12_CLK_vclk2_venct0,
11968afae5d5Sryo 	G12_CLK_vclk2_venct1,
11978afae5d5Sryo 	G12_CLK_vclk2_other,
11988afae5d5Sryo 	G12_CLK_vclk2_enci,
11998afae5d5Sryo 	G12_CLK_vclk2_encp,
12008afae5d5Sryo 	G12_CLK_dac_clk,
12018afae5d5Sryo 	G12_CLK_aoclk,
12028afae5d5Sryo 	G12_CLK_iec958,
12038afae5d5Sryo 	G12_CLK_enc480p,
12048afae5d5Sryo 	G12_CLK_rng1,
12058afae5d5Sryo 	G12_CLK_vclk2_enct,
12068afae5d5Sryo 	G12_CLK_vclk2_encl,
12078afae5d5Sryo 	G12_CLK_vclk2_venclmmc,
12088afae5d5Sryo 	G12_CLK_vclk2_vencl,
12098afae5d5Sryo 	G12_CLK_vclk2_other1,
12108afae5d5Sryo 	G12_CLK_dma,
12118afae5d5Sryo 	G12_CLK_efuse,
12128afae5d5Sryo 	G12_CLK_rom_boot,
12138afae5d5Sryo 	G12_CLK_reset_sec,
12148afae5d5Sryo 	G12_CLK_sec_ahb_apb3,
12158afae5d5Sryo 	G12_CLK_cpu_clk_dyn0_sel,
12168afae5d5Sryo 	G12_CLK_cpu_clk_dyn1_sel,
12178afae5d5Sryo 	G12_CLK_cpu_clk_dyn0_div,
12188afae5d5Sryo 	G12_CLK_cpu_clk_dyn1_div,
12198afae5d5Sryo 	G12_CLK_cpu_clk_dyn0,
12208afae5d5Sryo 	G12_CLK_cpu_clk_dyn1,
12218afae5d5Sryo 	G12_CLK_cpu_clk_dyn,
12228afae5d5Sryo 	G12B_CLK_cpu_clk,
12238afae5d5Sryo 	G12_CLK_cpub_clk_dyn0_sel,
12248afae5d5Sryo 	G12_CLK_cpub_clk_dyn0_div,
12258afae5d5Sryo 	G12_CLK_cpub_clk_dyn0,
12268afae5d5Sryo 	G12_CLK_cpub_clk_dyn1_sel,
12278afae5d5Sryo 	G12_CLK_cpub_clk_dyn1_div,
12288afae5d5Sryo 	G12_CLK_cpub_clk_dyn1,
12298afae5d5Sryo 	G12_CLK_cpub_clk_dyn,
12308afae5d5Sryo 	G12_CLK_cpub_clk,
12318afae5d5Sryo 	G12_CLK_ts_div,
12328afae5d5Sryo 	G12_CLK_ts,
12338afae5d5Sryo 	G12_CLK_hdmi_pll_dco,
12348afae5d5Sryo 	G12_CLK_hdmi_pll_od,
12358afae5d5Sryo 	G12_CLK_hdmi_pll_od2,
12368afae5d5Sryo 	G12_CLK_hdmi_pll,
12378afae5d5Sryo 	G12_CLK_vid_pll_div,
12388afae5d5Sryo 	G12_CLK_vid_pll_sel,
12398afae5d5Sryo 	G12_CLK_vid_pll,
12408afae5d5Sryo 	G12_CLK_pcie_pll_dco,
12418afae5d5Sryo 	G12_CLK_pcie_pll_dco_div2,
12428afae5d5Sryo 	G12_CLK_pcie_pll_od,
12438afae5d5Sryo 	G12_CLK_pcie_pll_pll
12448afae5d5Sryo };
12458afae5d5Sryo 
12468afae5d5Sryo /*
12478afae5d5Sryo  * XXX:
12488afae5d5Sryo  * mesong12_cpuclk_get_rate() is needed because the source clock exceeds 32bit
12498afae5d5Sryo  * and sys/dev/clk cannot handle it.
12508afae5d5Sryo  * By modifying sys/dev/clk to be able to handle 64-bit clocks, this function
12518afae5d5Sryo  * will no longer be needed.
12528afae5d5Sryo  */
12538afae5d5Sryo static u_int
mesong12_cpuclk_get_rate(struct meson_clk_softc * sc,struct meson_clk_clk * clk)12548afae5d5Sryo mesong12_cpuclk_get_rate(struct meson_clk_softc *sc, struct meson_clk_clk *clk)
12558afae5d5Sryo {
12568afae5d5Sryo 	bus_size_t reg_cntl0;
12578afae5d5Sryo 	uint64_t freq;
12588afae5d5Sryo 	uint32_t val, m, n, div_shift, div;
12598afae5d5Sryo 	uint64_t xtal_clock = clk_get_rate(fdtbus_clock_byname("xtal"));
12608afae5d5Sryo 
12618afae5d5Sryo 	KASSERT(clk->type == MESON_CLK_MUX);
12628afae5d5Sryo 	if (sc->sc_clks == mesong12a_clkc_clks) {
12638afae5d5Sryo 		reg_cntl0 = HHI_SYS_PLL_CNTL0;
12648afae5d5Sryo 	} else {
12658afae5d5Sryo 		switch (clk->u.mux.reg) {
12668afae5d5Sryo 		case HHI_SYS_CPU_CLK_CNTL0:
12678afae5d5Sryo 			reg_cntl0 = HHI_SYS1_PLL_CNTL0;
12688afae5d5Sryo 			break;
12698afae5d5Sryo 		case HHI_SYS_CPUB_CLK_CNTL:
12708afae5d5Sryo 			reg_cntl0 = HHI_SYS_PLL_CNTL0;
12718afae5d5Sryo 			break;
12728afae5d5Sryo 		default:
12738afae5d5Sryo 			panic("%s: illegal clk table\n", __func__);
12748afae5d5Sryo 		}
12758afae5d5Sryo 	}
12768afae5d5Sryo 	CLK_LOCK(sc);
12778afae5d5Sryo 
12788afae5d5Sryo 	if ((CLK_READ(sc, clk->u.mux.reg) & __BIT(11)) == 0) {
12798afae5d5Sryo 		CLK_UNLOCK(sc);
12808afae5d5Sryo 
12818afae5d5Sryo 		/* use dyn clock instead of sys1?_pll */
12828afae5d5Sryo 		struct clk *clkp;
12838afae5d5Sryo 
12848afae5d5Sryo 		switch (clk->u.mux.reg) {
12858afae5d5Sryo 		case HHI_SYS_CPU_CLK_CNTL0:
12868afae5d5Sryo 			clkp = (struct clk *)meson_clk_clock_find(sc,
12878afae5d5Sryo 			    "cpu_clk_dyn");
12888afae5d5Sryo 			freq = clk_get_rate(clkp);
12898afae5d5Sryo 			break;
12908afae5d5Sryo 		case HHI_SYS_CPUB_CLK_CNTL:
12918afae5d5Sryo 			clkp = (struct clk *)meson_clk_clock_find(sc,
12928afae5d5Sryo 			    "cpub_clk_dyn");
12938afae5d5Sryo 			freq = clk_get_rate(clkp);
12948afae5d5Sryo 			break;
12958afae5d5Sryo 		default:
12968afae5d5Sryo 			freq = 0;
12978afae5d5Sryo 			break;
12988afae5d5Sryo 		}
12998afae5d5Sryo 		return freq;
13008afae5d5Sryo 	}
13018afae5d5Sryo 	val = CLK_READ(sc, reg_cntl0);
13028afae5d5Sryo 	m = __SHIFTOUT(val, __BITS(7,0));
13038afae5d5Sryo 	n = __SHIFTOUT(val, __BITS(14,10));
13048afae5d5Sryo 	div_shift = __SHIFTOUT(val, __BITS(18,16));
13058afae5d5Sryo 	div = 1 << div_shift;
13068afae5d5Sryo 	CLK_UNLOCK(sc);
13078afae5d5Sryo 
13088afae5d5Sryo 	freq = xtal_clock * m / n / div;
13098afae5d5Sryo 	return freq;
13108afae5d5Sryo }
13118afae5d5Sryo 
13128afae5d5Sryo static int
mesong12_cpuclk_set_rate(struct meson_clk_softc * sc,struct meson_clk_clk * clk,u_int rate)13138afae5d5Sryo mesong12_cpuclk_set_rate(struct meson_clk_softc *sc, struct meson_clk_clk *clk,
13148afae5d5Sryo     u_int rate)
13158afae5d5Sryo {
13168afae5d5Sryo 	bus_size_t reg_cntl0;
13178afae5d5Sryo 	uint32_t val;
13188afae5d5Sryo 	uint64_t xtal_clock = clk_get_rate(fdtbus_clock_byname("xtal"));
13198afae5d5Sryo 	int new_m, new_n, new_div, i, error;
13208afae5d5Sryo 
13218afae5d5Sryo 	KASSERT(clk->type == MESON_CLK_MUX);
13228afae5d5Sryo 	if (sc->sc_clks == mesong12a_clkc_clks) {
13238afae5d5Sryo 		reg_cntl0 = HHI_SYS_PLL_CNTL0;
13248afae5d5Sryo 	} else {
13258afae5d5Sryo 		switch (clk->u.mux.reg) {
13268afae5d5Sryo 		case HHI_SYS_CPU_CLK_CNTL0:
13278afae5d5Sryo 			reg_cntl0 = HHI_SYS1_PLL_CNTL0;
13288afae5d5Sryo 			break;
13298afae5d5Sryo 		case HHI_SYS_CPUB_CLK_CNTL:
13308afae5d5Sryo 			reg_cntl0 = HHI_SYS_PLL_CNTL0;
13318afae5d5Sryo 			break;
13328afae5d5Sryo 		default:
13338afae5d5Sryo 			panic("%s: illegal clk table\n", __func__);
13348afae5d5Sryo 		}
13358afae5d5Sryo 	}
13368afae5d5Sryo 
13378afae5d5Sryo 	new_div = 7;
13388afae5d5Sryo 	new_n = 1;
13398afae5d5Sryo 	new_m = (uint64_t)rate * (1 << new_div) / xtal_clock;
13408afae5d5Sryo 	while (new_m >= 250 && (new_div > 0)) {
13418afae5d5Sryo 		new_div--;
13428afae5d5Sryo 		new_m /= 2;
13438afae5d5Sryo 	}
13448afae5d5Sryo 
13458afae5d5Sryo 	if (new_m >= 256)
13468afae5d5Sryo 		return EINVAL;
13478afae5d5Sryo 
13488afae5d5Sryo 	CLK_LOCK(sc);
13498afae5d5Sryo 
13508afae5d5Sryo 	/* use cpub?_clk_dyn temporary */
13518afae5d5Sryo 	val = CLK_READ(sc, clk->u.mux.reg);
13528afae5d5Sryo 	CLK_WRITE(sc, clk->u.mux.reg, val & ~__BIT(11));
13538afae5d5Sryo 	DELAY(100);
13548afae5d5Sryo 
13558afae5d5Sryo #define MESON_PLL_CNTL_REG_LOCK	__BIT(31)
13568afae5d5Sryo #define MESON_PLL_CNTL_REG_RST	__BIT(29)
13578afae5d5Sryo #define MESON_PLL_CNTL_REG_EN	__BIT(28)
13588afae5d5Sryo 	/* disable */
13598afae5d5Sryo 	val = CLK_READ(sc, reg_cntl0);
13608afae5d5Sryo 	CLK_WRITE(sc, reg_cntl0, val | MESON_PLL_CNTL_REG_RST);
13618afae5d5Sryo 	val = CLK_READ(sc, reg_cntl0);
13628afae5d5Sryo 	CLK_WRITE(sc, reg_cntl0, val & ~MESON_PLL_CNTL_REG_EN);
13638afae5d5Sryo 
13648afae5d5Sryo 	/* HHI_SYS{,1}_PLL_CNTL{1,2,3,4,5} */
13658afae5d5Sryo 	CLK_WRITE(sc, reg_cntl0 + CBUS_REG(1), 0x00000000);
13668afae5d5Sryo 	CLK_WRITE(sc, reg_cntl0 + CBUS_REG(2), 0x00000000);
13678afae5d5Sryo 	CLK_WRITE(sc, reg_cntl0 + CBUS_REG(3), 0x48681c00);
13688afae5d5Sryo 	CLK_WRITE(sc, reg_cntl0 + CBUS_REG(4), 0x88770290);
13698afae5d5Sryo 	CLK_WRITE(sc, reg_cntl0 + CBUS_REG(5), 0x39272000);
13708afae5d5Sryo 	DELAY(100);
13718afae5d5Sryo 
13728afae5d5Sryo 	/* write new M, N, and DIV */
13738afae5d5Sryo 	val = CLK_READ(sc, reg_cntl0);
13748afae5d5Sryo 	val &= ~__BITS(7,0);
13758afae5d5Sryo 	val |= __SHIFTIN(new_m, __BITS(7,0));
13768afae5d5Sryo 	val &= ~__BITS(14,10);
13778afae5d5Sryo 	val |= __SHIFTIN(new_n, __BITS(14,10));
13788afae5d5Sryo 	val &= ~__BITS(18,16);
13798afae5d5Sryo 	val |= __SHIFTIN(new_div, __BITS(18,16));
13808afae5d5Sryo 	CLK_WRITE(sc, reg_cntl0, val);
13818afae5d5Sryo 
13828afae5d5Sryo 	/* enable */
13838afae5d5Sryo 	val = CLK_READ(sc, reg_cntl0);
13848afae5d5Sryo 	CLK_WRITE(sc, reg_cntl0, val | MESON_PLL_CNTL_REG_RST);
13858afae5d5Sryo 	val = CLK_READ(sc, reg_cntl0);
13868afae5d5Sryo 	CLK_WRITE(sc, reg_cntl0, val | MESON_PLL_CNTL_REG_EN);
13878afae5d5Sryo 	DELAY(1000);
13888afae5d5Sryo 	val = CLK_READ(sc, reg_cntl0);
13898afae5d5Sryo 	CLK_WRITE(sc, reg_cntl0, val & ~MESON_PLL_CNTL_REG_RST);
13908afae5d5Sryo 
13918afae5d5Sryo 	error = ETIMEDOUT;
13928afae5d5Sryo 	for (i = 24000000; i > 0; i--) {
13938afae5d5Sryo 		if ((CLK_READ(sc, reg_cntl0) & MESON_PLL_CNTL_REG_LOCK) != 0) {
13948afae5d5Sryo 			error = 0;
13958afae5d5Sryo 			break;
13968afae5d5Sryo 		}
13978afae5d5Sryo 	}
13988afae5d5Sryo 
13998afae5d5Sryo 	/* XXX: always use sys1?_pll. cpub?_clk_dyn should be used for <1GHz */
14008afae5d5Sryo 	val = CLK_READ(sc, clk->u.mux.reg);
14018afae5d5Sryo 	CLK_WRITE(sc, clk->u.mux.reg, val | __BIT(11));
14028afae5d5Sryo 	DELAY(100);
14038afae5d5Sryo 
14048afae5d5Sryo 	CLK_UNLOCK(sc);
14058afae5d5Sryo 
14068afae5d5Sryo 	return error;
14078afae5d5Sryo }
14088afae5d5Sryo 
14098afae5d5Sryo static int
mesong12_clk_pcie_pll_set_rate(struct meson_clk_softc * sc,struct meson_clk_clk * clk,u_int new_rate)14108afae5d5Sryo mesong12_clk_pcie_pll_set_rate(struct meson_clk_softc *sc,
14118afae5d5Sryo     struct meson_clk_clk *clk, u_int new_rate)
14128afae5d5Sryo {
14138afae5d5Sryo 	struct meson_clk_pll *pll = &clk->u.pll;
14148afae5d5Sryo 
14158afae5d5Sryo 	KASSERT(clk->type == MESON_CLK_PLL);
14168afae5d5Sryo 
14178afae5d5Sryo 	/*
14188afae5d5Sryo 	 * A strict register sequence is required to set the PLL to the
14198afae5d5Sryo 	 * fine-tuned 100MHz for PCIe
14208afae5d5Sryo 	 */
14218afae5d5Sryo 	if (new_rate == (100000000 * 2 * 2)) { /* "2*2" is fixed factor */
14228afae5d5Sryo 		uint32_t cntl0, cntl4, cntl3, cntl5;
14238afae5d5Sryo 
14248afae5d5Sryo 		cntl0 = __SHIFTIN(9, HHI_PCIE_PLL_CNTL0_PCIE_APLL_OD) |
14258afae5d5Sryo 		    __SHIFTIN(1, HHI_PCIE_PLL_CNTL0_PCIE_APLL_PREDIV_SEL) |
14268afae5d5Sryo 		    __SHIFTIN(150, HHI_PCIE_PLL_CNTL0_PCIE_APLL_FBKDIV);
14278afae5d5Sryo 		cntl4 =  __SHIFTIN(1, HHI_PCIE_PLL_CNTL4_PCIE_APLL_LPF_CAPADJ) |
14288afae5d5Sryo 		    HHI_PCIE_PLL_CNTL4_PCIE_APLL_LOAD |
14298afae5d5Sryo 		    HHI_PCIE_PLL_CNTL4_PCIE_APLL_LOAD_EN;
14308afae5d5Sryo 		cntl3 = __SHIFTIN(1, HHI_PCIE_PLL_CNTL3_PCIE_APLL_AFC_HOLD_T) |
14318afae5d5Sryo 		    __SHIFTIN(2, HHI_PCIE_PLL_CNTL3_PCIE_APLL_AFC_DIV) |
14328afae5d5Sryo 		    HHI_PCIE_PLL_CNTL3_PCIE_APLL_BIAS_LPF_EN |
14338afae5d5Sryo 		    __SHIFTIN(8, HHI_PCIE_PLL_CNTL3_PCIE_APLL_CP_ICAP) |
14348afae5d5Sryo 		    __SHIFTIN(14, HHI_PCIE_PLL_CNTL3_PCIE_APLL_CP_IRES);
14358afae5d5Sryo 		cntl5 = __SHIFTIN(6, HHI_PCIE_PLL_CNTL5_PCIE_HCSL_ADJ_LDO) |
14368afae5d5Sryo 		    HHI_PCIE_PLL_CNTL5_PCIE_HCSL_BGP_EN |
14378afae5d5Sryo 		    HHI_PCIE_PLL_CNTL5_PCIE_HCSL_CAL_EN |
14388afae5d5Sryo 		    HHI_PCIE_PLL_CNTL5_PCIE_HCSL_EN0;
14398afae5d5Sryo 
14408afae5d5Sryo 		CLK_LOCK(sc);
14418afae5d5Sryo 		CLK_WRITE_BITS(sc, pll->reset.reg, pll->reset.mask, 1);
14428afae5d5Sryo 		CLK_WRITE(sc, HHI_PCIE_PLL_CNTL0, cntl0 |
14438afae5d5Sryo 		    HHI_PCIE_PLL_CNTL0_PCIE_APLL_RESET);
14448afae5d5Sryo 		CLK_WRITE(sc, HHI_PCIE_PLL_CNTL0, cntl0 |
14458afae5d5Sryo 		    HHI_PCIE_PLL_CNTL0_PCIE_APLL_RESET |
14468afae5d5Sryo 		    HHI_PCIE_PLL_CNTL0_PCIE_APLL_EN);
14478afae5d5Sryo 		CLK_WRITE(sc, HHI_PCIE_PLL_CNTL1, 0);
14488afae5d5Sryo 		CLK_WRITE(sc, HHI_PCIE_PLL_CNTL2,
14498afae5d5Sryo 		    __SHIFTIN(0x1100, HHI_PCIE_PLL_CNTL2_PCIE_APLL_RESERVE));
14508afae5d5Sryo 		CLK_WRITE(sc, HHI_PCIE_PLL_CNTL3, cntl3);
14518afae5d5Sryo 		CLK_WRITE(sc, HHI_PCIE_PLL_CNTL4, cntl4);
14528afae5d5Sryo 		delay(20);
14538afae5d5Sryo 		CLK_WRITE(sc, HHI_PCIE_PLL_CNTL5, cntl5);
14548afae5d5Sryo 		delay(10);
14558afae5d5Sryo 		CLK_WRITE(sc, HHI_PCIE_PLL_CNTL5, cntl5 |
14568afae5d5Sryo 		    HHI_PCIE_PLL_CNTL5_PCIE_HCSL_CAL_RSTN);
14578afae5d5Sryo 		CLK_WRITE(sc, HHI_PCIE_PLL_CNTL4, cntl4 |
14588afae5d5Sryo 		    HHI_PCIE_PLL_CNTL4_PCIE_APLL_VCTRL_MON_EN);
14598afae5d5Sryo 		delay(10);
14608afae5d5Sryo 		CLK_WRITE(sc, HHI_PCIE_PLL_CNTL0, cntl0 |
14618afae5d5Sryo 		    HHI_PCIE_PLL_CNTL0_PCIE_APLL_RESET |
14628afae5d5Sryo 		    HHI_PCIE_PLL_CNTL0_PCIE_APLL_EN |
14638afae5d5Sryo 		    HHI_PCIE_PLL_CNTL0_PCIE_APLL_AFC_START);
14648afae5d5Sryo 		CLK_WRITE(sc, HHI_PCIE_PLL_CNTL0, cntl0 |
14658afae5d5Sryo 		    HHI_PCIE_PLL_CNTL0_PCIE_APLL_EN |
14668afae5d5Sryo 		    HHI_PCIE_PLL_CNTL0_PCIE_APLL_AFC_START);
14678afae5d5Sryo 		CLK_WRITE(sc, HHI_PCIE_PLL_CNTL2,
14688afae5d5Sryo 		    __SHIFTIN(0x1000, HHI_PCIE_PLL_CNTL2_PCIE_APLL_RESERVE));
14698afae5d5Sryo 
14708afae5d5Sryo 		CLK_WRITE_BITS(sc, pll->reset.reg, pll->reset.mask, 0);
14718afae5d5Sryo 		/* XXX: pll_wait_lock() sometimes times out? but ignore it */
14728afae5d5Sryo 		meson_clk_pll_wait_lock(sc, pll);
14738afae5d5Sryo 		CLK_UNLOCK(sc);
14748afae5d5Sryo 		return 0;
14758afae5d5Sryo 	}
14768afae5d5Sryo 
14778afae5d5Sryo 	return meson_clk_pll_set_rate(sc, clk, new_rate);
14788afae5d5Sryo }
14798afae5d5Sryo 
14808afae5d5Sryo static const struct mesong12_clkc_config g12a_config = {
14818afae5d5Sryo 	.name = "Meson G12A",
14828afae5d5Sryo 	.clks = mesong12a_clkc_clks,
14838afae5d5Sryo 	.nclks = __arraycount(mesong12a_clkc_clks),
14848afae5d5Sryo };
14858afae5d5Sryo 
14868afae5d5Sryo static const struct mesong12_clkc_config g12b_config = {
14878afae5d5Sryo 	.name = "Meson G12B",
14888afae5d5Sryo 	.clks = mesong12b_clkc_clks,
14898afae5d5Sryo 	.nclks = __arraycount(mesong12b_clkc_clks),
14908afae5d5Sryo };
14918afae5d5Sryo 
1492646c0f59Sthorpej static const struct device_compatible_entry compat_data[] = {
1493646c0f59Sthorpej 	{ .compat = "amlogic,g12a-clkc",	.data = &g12a_config },
1494646c0f59Sthorpej 	{ .compat = "amlogic,g12b-clkc",	.data = &g12b_config },
14952dcdd1cdSthorpej 	DEVICE_COMPAT_EOL
14968afae5d5Sryo };
14978afae5d5Sryo 
14988afae5d5Sryo CFATTACH_DECL_NEW(mesong12_clkc, sizeof(struct meson_clk_softc),
14998afae5d5Sryo     mesong12_clkc_match, mesong12_clkc_attach, NULL, NULL);
15008afae5d5Sryo 
15018afae5d5Sryo static int
mesong12_clkc_match(device_t parent,cfdata_t cf,void * aux)15028afae5d5Sryo mesong12_clkc_match(device_t parent, cfdata_t cf, void *aux)
15038afae5d5Sryo {
15048afae5d5Sryo 	struct fdt_attach_args * const faa = aux;
15058afae5d5Sryo 
15066e54367aSthorpej 	return of_compatible_match(faa->faa_phandle, compat_data);
15078afae5d5Sryo }
15088afae5d5Sryo 
15098afae5d5Sryo static void
mesong12_clkc_attach(device_t parent,device_t self,void * aux)15108afae5d5Sryo mesong12_clkc_attach(device_t parent, device_t self, void *aux)
15118afae5d5Sryo {
15128afae5d5Sryo 	struct meson_clk_softc * const sc = device_private(self);
15138afae5d5Sryo 	struct fdt_attach_args * const faa = aux;
15148afae5d5Sryo 	const struct mesong12_clkc_config *conf;
15158afae5d5Sryo 	const int phandle = faa->faa_phandle;
15168afae5d5Sryo 
15178afae5d5Sryo 	sc->sc_dev = self;
15188afae5d5Sryo 	sc->sc_phandle = faa->faa_phandle;
15198afae5d5Sryo 	sc->sc_syscon = fdtbus_syscon_lookup(OF_parent(sc->sc_phandle));
15208afae5d5Sryo 	if (sc->sc_syscon == NULL) {
15218afae5d5Sryo 		aprint_error(": couldn't get syscon registers\n");
15228afae5d5Sryo 		return;
15238afae5d5Sryo 	}
15248afae5d5Sryo 
15256e54367aSthorpej 	conf = of_compatible_lookup(phandle, compat_data)->data;
15268afae5d5Sryo 	sc->sc_clks = conf->clks;
15278afae5d5Sryo 	sc->sc_nclks = conf->nclks;
15288afae5d5Sryo 
15298afae5d5Sryo 	aprint_naive("\n");
15308afae5d5Sryo 	aprint_normal(": %s clock controller\n", conf->name);
15318afae5d5Sryo 
15328afae5d5Sryo 	meson_clk_attach(sc);
15338afae5d5Sryo 	meson_clk_print(sc);
15348afae5d5Sryo }
1535