Home | History | Annotate | Line # | Download | only in amlogic
mesong12_clkc.c revision 1.2
      1  1.2  thorpej /* $NetBSD: mesong12_clkc.c,v 1.2 2021/01/18 02:35:48 thorpej Exp $ */
      2  1.1      ryo 
      3  1.1      ryo /*-
      4  1.1      ryo  * Copyright (c) 2019 Jared McNeill <jmcneill (at) invisible.ca>
      5  1.1      ryo  * All rights reserved.
      6  1.1      ryo  *
      7  1.1      ryo  * Redistribution and use in source and binary forms, with or without
      8  1.1      ryo  * modification, are permitted provided that the following conditions
      9  1.1      ryo  * are met:
     10  1.1      ryo  * 1. Redistributions of source code must retain the above copyright
     11  1.1      ryo  *    notice, this list of conditions and the following disclaimer.
     12  1.1      ryo  * 2. Redistributions in binary form must reproduce the above copyright
     13  1.1      ryo  *    notice, this list of conditions and the following disclaimer in the
     14  1.1      ryo  *    documentation and/or other materials provided with the distribution.
     15  1.1      ryo  *
     16  1.1      ryo  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
     17  1.1      ryo  * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
     18  1.1      ryo  * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
     19  1.1      ryo  * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
     20  1.1      ryo  * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
     21  1.1      ryo  * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
     22  1.1      ryo  * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
     23  1.1      ryo  * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
     24  1.1      ryo  * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
     25  1.1      ryo  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
     26  1.1      ryo  * SUCH DAMAGE.
     27  1.1      ryo  */
     28  1.1      ryo 
     29  1.1      ryo #include <sys/cdefs.h>
     30  1.2  thorpej __KERNEL_RCSID(0, "$NetBSD: mesong12_clkc.c,v 1.2 2021/01/18 02:35:48 thorpej Exp $");
     31  1.1      ryo 
     32  1.1      ryo #include <sys/param.h>
     33  1.1      ryo #include <sys/types.h>
     34  1.1      ryo #include <sys/bus.h>
     35  1.1      ryo #include <sys/device.h>
     36  1.1      ryo 
     37  1.1      ryo #include <dev/fdt/fdtvar.h>
     38  1.1      ryo 
     39  1.1      ryo #include <arm/amlogic/meson_clk.h>
     40  1.1      ryo #include <arm/amlogic/mesong12_clkc.h>
     41  1.1      ryo 
     42  1.1      ryo #define	CBUS_REG(x)		((x) << 2)
     43  1.1      ryo 
     44  1.1      ryo #define HHI_GP0_PLL_CNTL0	CBUS_REG(0x10)
     45  1.1      ryo #define HHI_GP0_PLL_CNTL1	CBUS_REG(0x11)
     46  1.1      ryo #define HHI_GP0_PLL_CNTL2	CBUS_REG(0x12)
     47  1.1      ryo #define HHI_GP0_PLL_CNTL3	CBUS_REG(0x13)
     48  1.1      ryo #define HHI_GP0_PLL_CNTL4	CBUS_REG(0x14)
     49  1.1      ryo #define HHI_GP0_PLL_CNTL5	CBUS_REG(0x15)
     50  1.1      ryo #define HHI_GP0_PLL_CNTL6	CBUS_REG(0x16)
     51  1.1      ryo #define HHI_GP1_PLL_CNTL0	CBUS_REG(0x18)
     52  1.1      ryo #define HHI_GP1_PLL_CNTL1	CBUS_REG(0x19)
     53  1.1      ryo #define HHI_PCIE_PLL_CNTL0	CBUS_REG(0x26)
     54  1.1      ryo #define  HHI_PCIE_PLL_CNTL0_PCIE_APLL_LOCK		__BIT(31)
     55  1.1      ryo #define  HHI_PCIE_PLL_CNTL0_PCIE_HCSL_CAL_DONE		__BIT(30)
     56  1.1      ryo #define  HHI_PCIE_PLL_CNTL0_PCIE_APLL_RESET		__BIT(29)
     57  1.1      ryo #define  HHI_PCIE_PLL_CNTL0_PCIE_APLL_EN		__BIT(28)
     58  1.1      ryo #define  HHI_PCIE_PLL_CNTL0_PCIE_APLL_VCO_DIV_SEL	__BIT(27)
     59  1.1      ryo #define  HHI_PCIE_PLL_CNTL0_PCIE_APLL_AFC_START		__BIT(26)
     60  1.1      ryo #define  HHI_PCIE_PLL_CNTL0_PCIE_APLL_OD		__BITS(20,16)
     61  1.1      ryo #define  HHI_PCIE_PLL_CNTL0_PCIE_APLL_PREDIV_SEL	__BITS(14,10)
     62  1.1      ryo #define  HHI_PCIE_PLL_CNTL0_PCIE_APLL_FBKDIV		__BITS(7,0)
     63  1.1      ryo #define HHI_PCIE_PLL_CNTL1	CBUS_REG(0x27)
     64  1.1      ryo #define  HHI_PCIE_PLL_CNTL1_PCIE_APLL_SDM_EN		__BIT(12)
     65  1.1      ryo #define  HHI_PCIE_PLL_CNTL1_PCIE_APLL_SDM_FRAC		__BITS(11,0)
     66  1.1      ryo #define HHI_PCIE_PLL_CNTL2	CBUS_REG(0x28)
     67  1.1      ryo #define  HHI_PCIE_PLL_CNTL2_PCIE_APLL_SSC_DEP_SEL	__BITS(31,28)
     68  1.1      ryo #define  HHI_PCIE_PLL_CNTL2_PCIE_APLL_SSC_FREF_SEL	__BITS(25,24)
     69  1.1      ryo #define  HHI_PCIE_PLL_CNTL2_PCIE_APLL_SSC_MODE		__BITS(23,22)
     70  1.1      ryo #define  HHI_PCIE_PLL_CNTL2_PCIE_APLL_SSC_OFFSET	__BITS(21,20)
     71  1.1      ryo #define  HHI_PCIE_PLL_CNTL2_PCIE_APLL_STR_M		__BITS(19,18)
     72  1.1      ryo #define  HHI_PCIE_PLL_CNTL2_PCIE_APLL_RESERVE		__BITS(15,0)
     73  1.1      ryo #define HHI_PCIE_PLL_CNTL3	CBUS_REG(0x29)
     74  1.1      ryo #define  HHI_PCIE_PLL_CNTL3_PCIE_APLL_AFC_BYPASS_EN	__BIT(31)
     75  1.1      ryo #define  HHI_PCIE_PLL_CNTL3_PCIE_APLL_AFC_HOLD_T	__BITS(29,28)
     76  1.1      ryo #define  HHI_PCIE_PLL_CNTL3_PCIE_APLL_AFC_IN		__BITS(26,20)
     77  1.1      ryo #define  HHI_PCIE_PLL_CNTL3_PCIE_APLL_AFC_NT		__BIT(19)
     78  1.1      ryo #define  HHI_PCIE_PLL_CNTL3_PCIE_APLL_AFC_DIV		__BITS(18,17)
     79  1.1      ryo #define  HHI_PCIE_PLL_CNTL3_PCIE_APLL_BIAS_LPF_EN	__BIT(16)
     80  1.1      ryo #define  HHI_PCIE_PLL_CNTL3_PCIE_APLL_CP_ICAP		__BITS(15,12)
     81  1.1      ryo #define  HHI_PCIE_PLL_CNTL3_PCIE_APLL_CP_IRES		__BITS(11,8)
     82  1.1      ryo #define  HHI_PCIE_PLL_CNTL3_PCIE_APLL_CPI		__BITS(5,4)
     83  1.1      ryo #define HHI_PCIE_PLL_CNTL4	CBUS_REG(0x2a)
     84  1.1      ryo #define  HHI_PCIE_PLL_CNTL4_PCIE_APLL_SHIFT_EN		__BIT(31)
     85  1.1      ryo #define  HHI_PCIE_PLL_CNTL4_PCIE_APLL_SHIFT_T		__BITS(27,26)
     86  1.1      ryo #define  HHI_PCIE_PLL_CNTL4_PCIE_APLL_SHIFT_V		__BITS(25,24)
     87  1.1      ryo #define  HHI_PCIE_PLL_CNTL4_PCIE_APLL_VCTRL_MON_EN	__BIT(23)
     88  1.1      ryo #define  HHI_PCIE_PLL_CNTL4_PCIE_APLL_LPF_CAP		__BITS(21,20)
     89  1.1      ryo #define  HHI_PCIE_PLL_CNTL4_PCIE_APLL_LPF_CAPADJ	__BITS(19,16)
     90  1.1      ryo #define  HHI_PCIE_PLL_CNTL4_PCIE_APLL_LPF_RES		__BITS(13,12)
     91  1.1      ryo #define  HHI_PCIE_PLL_CNTL4_PCIE_APLL_LPF_SF		__BIT(11)
     92  1.1      ryo #define  HHI_PCIE_PLL_CNTL4_PCIE_APLL_LVR_OD_EN		__BIT(10)
     93  1.1      ryo #define  HHI_PCIE_PLL_CNTL4_PCIE_APLL_REFCLK_MON_EN	__BIT(9)
     94  1.1      ryo #define  HHI_PCIE_PLL_CNTL4_PCIE_APLL_FBKCLK_MON_EN	__BIT(8)
     95  1.1      ryo #define  HHI_PCIE_PLL_CNTL4_PCIE_APLL_LOAD		__BIT(7)
     96  1.1      ryo #define  HHI_PCIE_PLL_CNTL4_PCIE_APLL_LOAD_EN		__BIT(6)
     97  1.1      ryo #define HHI_PCIE_PLL_CNTL5	CBUS_REG(0x2b)
     98  1.1      ryo #define  HHI_PCIE_PLL_CNTL5_PCIE_HCSL_ADJ_LDO		__BITS(30,28)
     99  1.1      ryo #define  HHI_PCIE_PLL_CNTL5_PCIE_HCSL_BGP_EN		__BIT(27)
    100  1.1      ryo #define  HHI_PCIE_PLL_CNTL5_PCIE_HCSL_BGR_ADJ		__BITS(24,20)
    101  1.1      ryo #define  HHI_PCIE_PLL_CNTL5_PCIE_HCSL_BGR_START		__BIT(19)
    102  1.1      ryo #define  HHI_PCIE_PLL_CNTL5_PCIE_HCSL_BGR_VREF		__BITS(16,12)
    103  1.1      ryo #define  HHI_PCIE_PLL_CNTL5_PCIE_HCSL_BY_IMP_IN		__BITS(11,8)
    104  1.1      ryo #define  HHI_PCIE_PLL_CNTL5_PCIE_HCSL_BY_IMP		__BIT(7)
    105  1.1      ryo #define  HHI_PCIE_PLL_CNTL5_PCIE_HCSL_CAL_EN		__BIT(6)
    106  1.1      ryo #define  HHI_PCIE_PLL_CNTL5_PCIE_HCSL_CAL_RSTN		__BIT(5)
    107  1.1      ryo #define  HHI_PCIE_PLL_CNTL5_PCIE_HCSL_EDGEDRV_EN	__BIT(4)
    108  1.1      ryo #define  HHI_PCIE_PLL_CNTL5_PCIE_HCSL_EN0		__BIT(3)
    109  1.1      ryo #define  HHI_PCIE_PLL_CNTL5_PCIE_HCSL_IN_EN		__BIT(2)
    110  1.1      ryo #define  HHI_PCIE_PLL_CNTL5_PCIE_HCSL_SEL_PW		__BIT(1)
    111  1.1      ryo #define  HHI_PCIE_PLL_CNTL5_PCIE_HCSL_SEL_STR		__BIT(0)
    112  1.1      ryo 
    113  1.1      ryo #define HHI_HIFI_PLL_CNTL0	CBUS_REG(0x36)
    114  1.1      ryo #define HHI_HIFI_PLL_CNTL1	CBUS_REG(0x37)
    115  1.1      ryo #define HHI_HIFI_PLL_CNTL2	CBUS_REG(0x38)
    116  1.1      ryo #define HHI_HIFI_PLL_CNTL3	CBUS_REG(0x39)
    117  1.1      ryo #define HHI_HIFI_PLL_CNTL4	CBUS_REG(0x3a)
    118  1.1      ryo #define HHI_HIFI_PLL_CNTL5	CBUS_REG(0x3b)
    119  1.1      ryo #define HHI_HIFI_PLL_CNTL6	CBUS_REG(0x3c)
    120  1.1      ryo #define HHI_MEM_PD_REG0		CBUS_REG(0x40)
    121  1.1      ryo #define HHI_GCLK_MPEG0		CBUS_REG(0x50)
    122  1.1      ryo #define HHI_GCLK_MPEG1		CBUS_REG(0x51)
    123  1.1      ryo #define HHI_GCLK_MPEG2		CBUS_REG(0x52)
    124  1.1      ryo #define HHI_GCLK_OTHER		CBUS_REG(0x54)
    125  1.1      ryo #define HHI_GCLK_OTHER2		CBUS_REG(0x55)
    126  1.1      ryo #define HHI_SYS_CPU_CLK_CNTL1	CBUS_REG(0x57)
    127  1.1      ryo #define HHI_MPEG_CLK_CNTL	CBUS_REG(0x5d)
    128  1.1      ryo #define HHI_TS_CLK_CNTL		CBUS_REG(0x64)
    129  1.1      ryo #define HHI_SYS_CPU_CLK_CNTL0	CBUS_REG(0x67)
    130  1.1      ryo #define HHI_VID_PLL_CLK_DIV	CBUS_REG(0x68)
    131  1.1      ryo #define HHI_SYS_CPUB_CLK_CNTL1	CBUS_REG(0x80)
    132  1.1      ryo #define HHI_SYS_CPUB_CLK_CNTL	CBUS_REG(0x82)
    133  1.1      ryo #define HHI_NAND_CLK_CNTL	CBUS_REG(0x97)
    134  1.1      ryo #define HHI_SD_EMMC_CLK_CNTL	CBUS_REG(0x99)
    135  1.1      ryo #define HHI_MPLL_CNTL0		CBUS_REG(0x9e)
    136  1.1      ryo #define HHI_MPLL_CNTL1		CBUS_REG(0x9f)
    137  1.1      ryo #define HHI_MPLL_CNTL2		CBUS_REG(0xa0)
    138  1.1      ryo #define HHI_MPLL_CNTL3		CBUS_REG(0xa1)
    139  1.1      ryo #define HHI_MPLL_CNTL4		CBUS_REG(0xa2)
    140  1.1      ryo #define HHI_MPLL_CNTL5		CBUS_REG(0xa3)
    141  1.1      ryo #define HHI_MPLL_CNTL6		CBUS_REG(0xa4)
    142  1.1      ryo #define HHI_MPLL_CNTL7		CBUS_REG(0xa5)
    143  1.1      ryo #define HHI_MPLL_CNTL8		CBUS_REG(0xa6)
    144  1.1      ryo #define HHI_FIX_PLL_CNTL0	CBUS_REG(0xa8)
    145  1.1      ryo #define HHI_FIX_PLL_CNTL1	CBUS_REG(0xa9)
    146  1.1      ryo #define HHI_FIX_PLL_CNTL2	CBUS_REG(0xaa)
    147  1.1      ryo #define HHI_FIX_PLL_CNTL3	CBUS_REG(0xab)
    148  1.1      ryo #define HHI_SYS_PLL_CNTL0	CBUS_REG(0xbd)
    149  1.1      ryo #define HHI_SYS_PLL_CNTL1	CBUS_REG(0xbe)
    150  1.1      ryo #define HHI_SYS_PLL_CNTL2	CBUS_REG(0xbf)
    151  1.1      ryo #define HHI_SYS_PLL_CNTL3	CBUS_REG(0xc0)
    152  1.1      ryo #define HHI_SYS_PLL_CNTL4	CBUS_REG(0xc1)
    153  1.1      ryo #define HHI_SYS_PLL_CNTL5	CBUS_REG(0xc2)
    154  1.1      ryo #define HHI_SYS_PLL_CNTL6	CBUS_REG(0xc3)
    155  1.1      ryo #define HHI_HDMI_PLL_CNTL0	CBUS_REG(0xc8)
    156  1.1      ryo #define HHI_HDMI_PLL_CNTL1	CBUS_REG(0xc9)
    157  1.1      ryo #define HHI_SYS1_PLL_CNTL0	CBUS_REG(0xe0)
    158  1.1      ryo #define HHI_SYS1_PLL_CNTL1	CBUS_REG(0xe1)
    159  1.1      ryo #define HHI_SYS1_PLL_CNTL2	CBUS_REG(0xe2)
    160  1.1      ryo #define HHI_SYS1_PLL_CNTL3	CBUS_REG(0xe3)
    161  1.1      ryo #define HHI_SYS1_PLL_CNTL4	CBUS_REG(0xe4)
    162  1.1      ryo #define HHI_SYS1_PLL_CNTL5	CBUS_REG(0xe5)
    163  1.1      ryo #define HHI_SYS1_PLL_CNTL6	CBUS_REG(0xe6)
    164  1.1      ryo 
    165  1.1      ryo static int mesong12_clkc_match(device_t, cfdata_t, void *);
    166  1.1      ryo static void mesong12_clkc_attach(device_t, device_t, void *);
    167  1.1      ryo 
    168  1.1      ryo static u_int mesong12_cpuclk_get_rate(struct meson_clk_softc *,
    169  1.1      ryo     struct meson_clk_clk *);
    170  1.1      ryo static int mesong12_cpuclk_set_rate(struct meson_clk_softc *,
    171  1.1      ryo     struct meson_clk_clk *, u_int);
    172  1.1      ryo static int mesong12_clk_pcie_pll_set_rate(struct meson_clk_softc *,
    173  1.1      ryo     struct meson_clk_clk *, u_int);
    174  1.1      ryo 
    175  1.1      ryo struct mesong12_clkc_config {
    176  1.1      ryo 	const char *name;
    177  1.1      ryo 	struct meson_clk_clk *clks;
    178  1.1      ryo 	int nclks;
    179  1.1      ryo };
    180  1.1      ryo 
    181  1.1      ryo #define PARENTS(args...)	((const char *[]){ args })
    182  1.1      ryo 
    183  1.1      ryo /* fixed pll */
    184  1.1      ryo #define G12_CLK_fixed_pll_dco						\
    185  1.1      ryo 	MESON_CLK_PLL(MESONG12_CLOCK_FIXED_PLL_DCO, "fixed_pll_dco",	\
    186  1.1      ryo 	    "xtal",						/* parent */ \
    187  1.1      ryo 	    MESON_CLK_PLL_REG(HHI_FIX_PLL_CNTL0, __BIT(28)),	/* enable */ \
    188  1.1      ryo 	    MESON_CLK_PLL_REG(HHI_FIX_PLL_CNTL0, __BITS(7,0)),	/* m */ \
    189  1.1      ryo 	    MESON_CLK_PLL_REG(HHI_FIX_PLL_CNTL0, __BITS(14,10)),/* n */ \
    190  1.1      ryo 	    MESON_CLK_PLL_REG(HHI_FIX_PLL_CNTL1, __BITS(16,0)),	/* frac */ \
    191  1.1      ryo 	    MESON_CLK_PLL_REG(HHI_FIX_PLL_CNTL0, __BIT(31)),	/* l */ \
    192  1.1      ryo 	    MESON_CLK_PLL_REG(HHI_FIX_PLL_CNTL0, __BIT(29)),	/* reset */ \
    193  1.1      ryo 	    0)
    194  1.1      ryo #define G12_CLK_fixed_pll						\
    195  1.1      ryo 	MESON_CLK_DIV(MESONG12_CLOCK_FIXED_PLL, "fixed_pll",		\
    196  1.1      ryo 	    "fixed_pll_dco",		/* parent */			\
    197  1.1      ryo 	    HHI_FIX_PLL_CNTL0,		/* reg */			\
    198  1.1      ryo 	    __BITS(17,16),		/* div */			\
    199  1.1      ryo 	    MESON_CLK_DIV_POWER_OF_TWO)
    200  1.1      ryo 
    201  1.1      ryo /* sys pll */
    202  1.1      ryo #define G12_CLK_sys_pll_dco						\
    203  1.1      ryo 	MESON_CLK_PLL(MESONG12_CLOCK_SYS_PLL_DCO, "sys_pll_dco",	\
    204  1.1      ryo 	    "xtal",						/* parent */ \
    205  1.1      ryo 	    MESON_CLK_PLL_REG(HHI_SYS_PLL_CNTL0, __BIT(28)),	/* enable */ \
    206  1.1      ryo 	    MESON_CLK_PLL_REG(HHI_SYS_PLL_CNTL0, __BITS(7,0)),	/* m */	\
    207  1.1      ryo 	    MESON_CLK_PLL_REG(HHI_SYS_PLL_CNTL0, __BITS(14,10)),/* n */	\
    208  1.1      ryo 	    MESON_CLK_PLL_REG_INVALID,				/* frac */ \
    209  1.1      ryo 	    MESON_CLK_PLL_REG(HHI_SYS_PLL_CNTL0, __BIT(31)),	/* l */	\
    210  1.1      ryo 	    MESON_CLK_PLL_REG(HHI_SYS_PLL_CNTL0, __BIT(29)),	/* reset */ \
    211  1.1      ryo 	    0)
    212  1.1      ryo #define G12_CLK_sys_pll							\
    213  1.1      ryo 	MESON_CLK_DIV(MESONG12_CLOCK_SYS_PLL, "sys_pll",		\
    214  1.1      ryo 	    "sys_pll_dco",		/* parent */			\
    215  1.1      ryo 	    HHI_SYS_PLL_CNTL0,		/* reg */			\
    216  1.1      ryo 	    __BITS(18,16),		/* div */			\
    217  1.1      ryo 	    MESON_CLK_DIV_POWER_OF_TWO | MESON_CLK_DIV_SET_RATE_PARENT)
    218  1.1      ryo 
    219  1.1      ryo /* sys1 pll */
    220  1.1      ryo #define G12B_CLK_sys1_pll_dco						\
    221  1.1      ryo 	MESON_CLK_PLL(MESONG12_CLOCK_SYS1_PLL_DCO, "sys1_pll_dco",	\
    222  1.1      ryo 	    "xtal",						/* parent */ \
    223  1.1      ryo 	    MESON_CLK_PLL_REG(HHI_SYS1_PLL_CNTL0, __BIT(28)),	/* enable */ \
    224  1.1      ryo 	    MESON_CLK_PLL_REG(HHI_SYS1_PLL_CNTL0, __BITS(7,0)),	/* m */ \
    225  1.1      ryo 	    MESON_CLK_PLL_REG(HHI_SYS1_PLL_CNTL0, __BITS(14,10)),/* n */ \
    226  1.1      ryo 	    MESON_CLK_PLL_REG_INVALID,				/* frac */ \
    227  1.1      ryo 	    MESON_CLK_PLL_REG(HHI_SYS1_PLL_CNTL0, __BIT(31)),	/* l */ \
    228  1.1      ryo 	    MESON_CLK_PLL_REG(HHI_SYS1_PLL_CNTL0, __BIT(29)),	/* reset */ \
    229  1.1      ryo 	    0)
    230  1.1      ryo #define G12B_CLK_sys1_pll						\
    231  1.1      ryo 	MESON_CLK_DIV(MESONG12_CLOCK_SYS1_PLL, "sys1_pll",		\
    232  1.1      ryo 	    "sys1_pll_dco",		/* parent */			\
    233  1.1      ryo 	    HHI_SYS1_PLL_CNTL0,		/* reg */			\
    234  1.1      ryo 	    __BITS(18,16),		/* div */			\
    235  1.1      ryo 	    MESON_CLK_DIV_POWER_OF_TWO | MESON_CLK_DIV_SET_RATE_PARENT)
    236  1.1      ryo 
    237  1.1      ryo /* fclk div */
    238  1.1      ryo #define G12_CLK_fclk_div2_div						\
    239  1.1      ryo 	MESON_CLK_FIXED_FACTOR(MESONG12_CLOCK_FCLK_DIV2_DIV, "fclk_div2_div", \
    240  1.1      ryo 	    "fixed_pll",		/* parent */			\
    241  1.1      ryo 	    2,				/* div */			\
    242  1.1      ryo 	    1)				/* mult */
    243  1.1      ryo #define G12_CLK_fclk_div2						\
    244  1.1      ryo 	MESON_CLK_GATE(MESONG12_CLOCK_FCLK_DIV2, "fclk_div2",		\
    245  1.1      ryo 	    "fclk_div2_div",		/* parent */			\
    246  1.1      ryo 	    HHI_FIX_PLL_CNTL1,		/* reg */			\
    247  1.1      ryo 	    24)				/* bit */
    248  1.1      ryo #define G12_CLK_fclk_div2p5_div						\
    249  1.1      ryo 	MESON_CLK_FIXED_FACTOR(MESONG12_CLOCK_FCLK_DIV2P5_DIV,		\
    250  1.1      ryo 	    "fclk_div2p5_div",						\
    251  1.1      ryo 	    "fixed_pll_dco",		/* parent */			\
    252  1.1      ryo 	    5,				/* div */			\
    253  1.1      ryo 	    1)				/* mult */
    254  1.1      ryo #define G12_CLK_fclk_div3_div						\
    255  1.1      ryo 	MESON_CLK_FIXED_FACTOR(MESONG12_CLOCK_FCLK_DIV3_DIV,		\
    256  1.1      ryo 	    "fclk_div3_div",						\
    257  1.1      ryo 	    "fixed_pll",		/* parent */			\
    258  1.1      ryo 	    3,				/* div */			\
    259  1.1      ryo 	    1)				/* mult */
    260  1.1      ryo #define G12_CLK_fclk_div3						\
    261  1.1      ryo 	MESON_CLK_GATE(MESONG12_CLOCK_FCLK_DIV3, "fclk_div3",		\
    262  1.1      ryo 	    "fclk_div3_div",		/* parent */			\
    263  1.1      ryo 	    HHI_FIX_PLL_CNTL1,		/* reg */			\
    264  1.1      ryo 	    20)				/* bit */
    265  1.1      ryo #define G12_CLK_fclk_div4_div						\
    266  1.1      ryo 	MESON_CLK_FIXED_FACTOR(MESONG12_CLOCK_FCLK_DIV4_DIV, "fclk_div4_div", \
    267  1.1      ryo 	    "fixed_pll",		/* parent */			\
    268  1.1      ryo 	    4,				/* div */			\
    269  1.1      ryo 	    1)				/* mult */
    270  1.1      ryo #define G12_CLK_fclk_div4						\
    271  1.1      ryo 	MESON_CLK_GATE(MESONG12_CLOCK_FCLK_DIV4, "fclk_div4",		\
    272  1.1      ryo 	    "fclk_div4_div",		/* parent */			\
    273  1.1      ryo 	    HHI_FIX_PLL_CNTL1,		/* reg */			\
    274  1.1      ryo 	    21)				/* bit */
    275  1.1      ryo #define G12_CLK_fclk_div5_div						\
    276  1.1      ryo 	MESON_CLK_FIXED_FACTOR(MESONG12_CLOCK_FCLK_DIV5_DIV, "fclk_div5_div", \
    277  1.1      ryo 	    "fixed_pll",		/* parent */			\
    278  1.1      ryo 	    5,				/* div */			\
    279  1.1      ryo 	    1)				/* mult */
    280  1.1      ryo #define G12_CLK_fclk_div5						\
    281  1.1      ryo 	MESON_CLK_GATE(MESONG12_CLOCK_FCLK_DIV5, "fclk_div5",		\
    282  1.1      ryo 	    "fclk_div5_div",		/* parent */			\
    283  1.1      ryo 	    HHI_FIX_PLL_CNTL1,		/* reg */			\
    284  1.1      ryo 	    22)				/* bit */
    285  1.1      ryo #define G12_CLK_fclk_div7_div						\
    286  1.1      ryo 	MESON_CLK_FIXED_FACTOR(MESONG12_CLOCK_FCLK_DIV7_DIV, "fclk_div7_div", \
    287  1.1      ryo 	    "fixed_pll",		/* parent */			\
    288  1.1      ryo 	    7,				/* div */			\
    289  1.1      ryo 	    1)				/* mult */
    290  1.1      ryo #define G12_CLK_fclk_div7						\
    291  1.1      ryo 	MESON_CLK_GATE(MESONG12_CLOCK_FCLK_DIV7, "fclk_div7",		\
    292  1.1      ryo 	    "fclk_div7_div",		/* parent */			\
    293  1.1      ryo 	    HHI_FIX_PLL_CNTL1,		/* reg */			\
    294  1.1      ryo 	    23)				/* bit */
    295  1.1      ryo 
    296  1.1      ryo /* mpll */
    297  1.1      ryo #define G12_CLK_mpll_prediv						\
    298  1.1      ryo 	MESON_CLK_FIXED_FACTOR(MESONG12_CLOCK_MPLL_PREDIV, "mpll_prediv", \
    299  1.1      ryo 	    "fixed_pll_dco",		/* parent */			\
    300  1.1      ryo 	    2,				/* div */			\
    301  1.1      ryo 	    1)				/* mult */
    302  1.1      ryo #define G12_CLK_mpll0_div						\
    303  1.1      ryo 	MESON_CLK_MPLL(MESONG12_CLOCK_MPLL0_DIV, "mpll0_div",		\
    304  1.1      ryo 	    "mpll_prediv",					/* parent */ \
    305  1.1      ryo 	    MESON_CLK_PLL_REG(HHI_MPLL_CNTL1, __BITS(13,0)),	/* sdm */ \
    306  1.1      ryo 	    MESON_CLK_PLL_REG(HHI_MPLL_CNTL1, __BIT(30)), /* sdm_enable */ \
    307  1.1      ryo 	    MESON_CLK_PLL_REG(HHI_MPLL_CNTL1, __BITS(28,20)),	/* n2 */ \
    308  1.1      ryo 	    MESON_CLK_PLL_REG(HHI_MPLL_CNTL1, __BIT(29)),	/* ssen */ \
    309  1.1      ryo 	    0)
    310  1.1      ryo #define G12_CLK_mpll1_div						\
    311  1.1      ryo 	MESON_CLK_MPLL(MESONG12_CLOCK_MPLL1_DIV, "mpll1_div",		\
    312  1.1      ryo 	    "mpll_prediv",					/* parent */ \
    313  1.1      ryo 	    MESON_CLK_PLL_REG(HHI_MPLL_CNTL3, __BITS(13,0)),	/* sdm */ \
    314  1.1      ryo 	    MESON_CLK_PLL_REG(HHI_MPLL_CNTL3, __BIT(30)), /* sdm_enable */ \
    315  1.1      ryo 	    MESON_CLK_PLL_REG(HHI_MPLL_CNTL3, __BITS(28,20)),	/* n2 */ \
    316  1.1      ryo 	    MESON_CLK_PLL_REG(HHI_MPLL_CNTL3, __BIT(29)),	/* ssen */ \
    317  1.1      ryo 	    0)
    318  1.1      ryo #define G12_CLK_mpll2_div						\
    319  1.1      ryo 	MESON_CLK_MPLL(MESONG12_CLOCK_MPLL2_DIV, "mpll2_div",		\
    320  1.1      ryo 	    "mpll_prediv",					/* parent */ \
    321  1.1      ryo 	    MESON_CLK_PLL_REG(HHI_MPLL_CNTL5, __BITS(13,0)),	/* sdm */ \
    322  1.1      ryo 	    MESON_CLK_PLL_REG(HHI_MPLL_CNTL5, __BIT(30)), /* sdm_enable */ \
    323  1.1      ryo 	    MESON_CLK_PLL_REG(HHI_MPLL_CNTL5, __BITS(28,20)),	/* n2 */ \
    324  1.1      ryo 	    MESON_CLK_PLL_REG(HHI_MPLL_CNTL5, __BIT(29)),	/* ssen */ \
    325  1.1      ryo 	    0)
    326  1.1      ryo #define G12_CLK_mpll0							\
    327  1.1      ryo 	MESON_CLK_GATE(MESONG12_CLOCK_MPLL0, "mpll0",			\
    328  1.1      ryo 	    "mpll0_div",		/* parent */			\
    329  1.1      ryo 	    HHI_MPLL_CNTL1,		/* reg */			\
    330  1.1      ryo 	    31)				/* bit */
    331  1.1      ryo #define G12_CLK_mpll1							\
    332  1.1      ryo 	MESON_CLK_GATE(MESONG12_CLOCK_MPLL1, "mpll1",			\
    333  1.1      ryo 	    "mpll1_div",		/* parent */			\
    334  1.1      ryo 	    HHI_MPLL_CNTL3,		/* reg */			\
    335  1.1      ryo 	    31)				/* bit */
    336  1.1      ryo #define G12_CLK_mpll2							\
    337  1.1      ryo 	MESON_CLK_GATE(MESONG12_CLOCK_MPLL2, "mpll2",			\
    338  1.1      ryo 	    "mpll2_div",		/* parent */			\
    339  1.1      ryo 	    HHI_MPLL_CNTL5,		/* reg */			\
    340  1.1      ryo 	    31)				/* bit */
    341  1.1      ryo #define G12_CLK_mpll_50m_div						\
    342  1.1      ryo 	MESON_CLK_FIXED_FACTOR(MESONG12_CLOCK_MPLL_50M_DIV, "mpll_50m_div", \
    343  1.1      ryo 	    "fixed_pll_dco",		/* parent */			\
    344  1.1      ryo 	    80,				/* div */			\
    345  1.1      ryo 	    1)				/* mult */
    346  1.1      ryo #define G12_CLK_mpll_50m						\
    347  1.1      ryo 	MESON_CLK_MUX(MESONG12_CLOCK_MPLL_50M, "mpll_50m",		\
    348  1.1      ryo 	    PARENTS("mpll_50m_div", "xtal"),				\
    349  1.1      ryo 	    HHI_FIX_PLL_CNTL3,		/* reg */			\
    350  1.1      ryo 	    __BIT(5),			/* sel */			\
    351  1.1      ryo 	    0)
    352  1.1      ryo 
    353  1.1      ryo /* sd/emmc */
    354  1.1      ryo #define G12_CLK_sd_emmc_a_clk0_sel					\
    355  1.1      ryo 	MESON_CLK_MUX(MESONG12_CLOCK_SD_EMMC_A_CLK0_SEL, "sd_emmc_a_clk0_sel", \
    356  1.1      ryo 	    PARENTS("xtal", "fclk_div2", "fclk_div3",			\
    357  1.1      ryo 	    "fclk_div5", "fclk_div7"),					\
    358  1.1      ryo 	    HHI_SD_EMMC_CLK_CNTL,	/* reg */			\
    359  1.1      ryo 	    __BITS(11,9),		/* sel */			\
    360  1.1      ryo 	    0)
    361  1.1      ryo #define G12_CLK_sd_emmc_b_clk0_sel					\
    362  1.1      ryo 	MESON_CLK_MUX(MESONG12_CLOCK_SD_EMMC_B_CLK0_SEL, "sd_emmc_b_clk0_sel", \
    363  1.1      ryo 	    PARENTS("xtal", "fclk_div2", "fclk_div3",			\
    364  1.1      ryo 	    "fclk_div5", "fclk_div7"),					\
    365  1.1      ryo 	    HHI_SD_EMMC_CLK_CNTL,	/* reg */			\
    366  1.1      ryo 	    __BITS(27,25),		/* sel */			\
    367  1.1      ryo 	    0)
    368  1.1      ryo #define G12_CLK_sd_emmc_c_clk0_sel					\
    369  1.1      ryo 	MESON_CLK_MUX(MESONG12_CLOCK_SD_EMMC_C_CLK0_SEL, "sd_emmc_c_clk0_sel", \
    370  1.1      ryo 	    PARENTS("xtal", "fclk_div2", "fclk_div3",			\
    371  1.1      ryo 	    "fclk_div5", "fclk_div7"),					\
    372  1.1      ryo 	    HHI_NAND_CLK_CNTL,		/* reg */			\
    373  1.1      ryo 	    __BITS(11,9),		/* sel */			\
    374  1.1      ryo 	    0)
    375  1.1      ryo #define G12_CLK_sd_emmc_a_clk0_div					\
    376  1.1      ryo 	MESON_CLK_DIV(MESONG12_CLOCK_SD_EMMC_A_CLK0_DIV, "sd_emmc_a_clk0_div", \
    377  1.1      ryo 	    "sd_emmc_a_clk0_sel",	/* parent */			\
    378  1.1      ryo 	    HHI_SD_EMMC_CLK_CNTL,	/* reg */			\
    379  1.1      ryo 	    __BITS(6,0),		/* div */			\
    380  1.1      ryo 	    0)
    381  1.1      ryo #define G12_CLK_sd_emmc_b_clk0_div					\
    382  1.1      ryo 	MESON_CLK_DIV(MESONG12_CLOCK_SD_EMMC_B_CLK0_DIV, "sd_emmc_b_clk0_div", \
    383  1.1      ryo 	    "sd_emmc_b_clk0_sel",	/* parent */			\
    384  1.1      ryo 	    HHI_SD_EMMC_CLK_CNTL,	/* reg */			\
    385  1.1      ryo 	    __BITS(22,16),		/* div */			\
    386  1.1      ryo 	    0)
    387  1.1      ryo #define G12_CLK_sd_emmc_c_clk0_div					\
    388  1.1      ryo 	MESON_CLK_DIV(MESONG12_CLOCK_SD_EMMC_C_CLK0_DIV, "sd_emmc_c_clk0_div", \
    389  1.1      ryo 	    "sd_emmc_c_clk0_sel",	/* parent */			\
    390  1.1      ryo 	    HHI_NAND_CLK_CNTL,		/* reg */			\
    391  1.1      ryo 	    __BITS(6,0),		/* div */			\
    392  1.1      ryo 	    0)
    393  1.1      ryo #define G12_CLK_sd_emmc_a_clk0						\
    394  1.1      ryo 	MESON_CLK_GATE(MESONG12_CLOCK_SD_EMMC_A_CLK0, "sd_emmc_a_clk0",	\
    395  1.1      ryo 	    "sd_emmc_a_clk0_div",	/* parent */			\
    396  1.1      ryo 	    HHI_SD_EMMC_CLK_CNTL,	/* reg */			\
    397  1.1      ryo 	    7)				/* bit */
    398  1.1      ryo #define G12_CLK_sd_emmc_b_clk0						\
    399  1.1      ryo 	MESON_CLK_GATE(MESONG12_CLOCK_SD_EMMC_B_CLK0, "sd_emmc_b_clk0", \
    400  1.1      ryo 	    "sd_emmc_b_clk0_div",	/* parent */			\
    401  1.1      ryo 	    HHI_SD_EMMC_CLK_CNTL,	/* reg */			\
    402  1.1      ryo 	    23)				/* bit */
    403  1.1      ryo #define G12_CLK_sd_emmc_c_clk0						\
    404  1.1      ryo 	MESON_CLK_GATE(MESONG12_CLOCK_SD_EMMC_C_CLK0, "sd_emmc_c_clk0",	\
    405  1.1      ryo 	    "sd_emmc_c_clk0_div",	/* parent */			\
    406  1.1      ryo 	    HHI_NAND_CLK_CNTL,		/* reg */			\
    407  1.1      ryo 	    7)				/* bit */
    408  1.1      ryo 
    409  1.1      ryo /* source as mpeg_clk */
    410  1.1      ryo #define G12_CLK_mpeg_sel						\
    411  1.1      ryo 	MESON_CLK_MUX(MESONG12_CLOCK_MPEG_SEL, "mpeg_sel",		\
    412  1.1      ryo 	    PARENTS("xtal", NULL, "fclk_div7", "mpll1",			\
    413  1.1      ryo 	    "mpll2", "fclk_div4", "fclk_div3", "fclk_div5"),		\
    414  1.1      ryo 	    HHI_MPEG_CLK_CNTL,		/* reg */			\
    415  1.1      ryo 	    __BITS(14,12),		/* sel */			\
    416  1.1      ryo 	    0)
    417  1.1      ryo #define G12_CLK_mpeg_clk_div						\
    418  1.1      ryo 	MESON_CLK_DIV(MESONG12_CLOCK_MPEG_DIV, "mpeg_clk_div",		\
    419  1.1      ryo 	    "mpeg_sel",			/* parent */			\
    420  1.1      ryo 	    HHI_MPEG_CLK_CNTL,		/* reg */			\
    421  1.1      ryo 	    __BITS(6,0),		/* div */			\
    422  1.1      ryo 	    MESON_CLK_DIV_SET_RATE_PARENT)
    423  1.1      ryo #define G12_CLK_clk81							\
    424  1.1      ryo 	MESON_CLK_GATE(MESONG12_CLOCK_CLK81, "clk81",			\
    425  1.1      ryo 	    "mpeg_clk_div",		/* parent */			\
    426  1.1      ryo 	    HHI_MPEG_CLK_CNTL,		/* reg */			\
    427  1.1      ryo 	    7)				/* bit */
    428  1.1      ryo #define G12_CLK_ddr							\
    429  1.1      ryo 	MESON_CLK_GATE(MESONG12_CLOCK_DDR, "ddr",			\
    430  1.1      ryo 	    "clk81",			/* parent */			\
    431  1.1      ryo 	    HHI_GCLK_MPEG0,		/* reg */			\
    432  1.1      ryo 	    0)				/* bit */
    433  1.1      ryo #define G12_CLK_dos							\
    434  1.1      ryo 	MESON_CLK_GATE(MESONG12_CLOCK_DOS, "dos",			\
    435  1.1      ryo 	    "clk81",			/* parent */			\
    436  1.1      ryo 	    HHI_GCLK_MPEG0,		/* reg */			\
    437  1.1      ryo 	    1)				/* bit */
    438  1.1      ryo #define G12_CLK_audio_locker						\
    439  1.1      ryo 	MESON_CLK_GATE(MESONG12_CLOCK_AUDIO_LOCKER, "audio_locker",	\
    440  1.1      ryo 	    "clk81",			/* parent */			\
    441  1.1      ryo 	    HHI_GCLK_MPEG0,		/* reg */			\
    442  1.1      ryo 	    2)				/* bit */
    443  1.1      ryo #define G12_CLK_mipi_dsi_host						\
    444  1.1      ryo 	MESON_CLK_GATE(MESONG12_CLOCK_MIPI_DSI_HOST, "mipi_dsi_host",	\
    445  1.1      ryo 	   "clk81",			/* parent */			\
    446  1.1      ryo 	    HHI_GCLK_MPEG0,		/* reg */			\
    447  1.1      ryo 	    3)				/* bit */
    448  1.1      ryo #define G12_CLK_eth_phy							\
    449  1.1      ryo 	MESON_CLK_GATE(MESONG12_CLOCK_ETH_PHY, "eth_phy",		\
    450  1.1      ryo 	    "clk81",			/* parent */			\
    451  1.1      ryo 	    HHI_GCLK_MPEG0,		/* reg */			\
    452  1.1      ryo 	    4)				/* bit */
    453  1.1      ryo #define G12_CLK_isa							\
    454  1.1      ryo 	MESON_CLK_GATE(MESONG12_CLOCK_ISA, "isa",			\
    455  1.1      ryo 	    "clk81",			/* parent */			\
    456  1.1      ryo 	    HHI_GCLK_MPEG0,		/* reg */			\
    457  1.1      ryo 	    5)				/* bit */
    458  1.1      ryo #define G12_CLK_pl301							\
    459  1.1      ryo 	MESON_CLK_GATE(MESONG12_CLOCK_PL301, "pl301",			\
    460  1.1      ryo 	    "clk81",			/* parent */			\
    461  1.1      ryo 	    HHI_GCLK_MPEG0,		/* reg */			\
    462  1.1      ryo 	    6)				/* bit */
    463  1.1      ryo #define G12_CLK_periphs							\
    464  1.1      ryo 	MESON_CLK_GATE(MESONG12_CLOCK_PERIPHS, "periphs",		\
    465  1.1      ryo 	    "clk81",			/* parent */			\
    466  1.1      ryo 	    HHI_GCLK_MPEG0,		/* reg */			\
    467  1.1      ryo 	    7)				/* bit */
    468  1.1      ryo #define G12_CLK_spicc0							\
    469  1.1      ryo 	MESON_CLK_GATE(MESONG12_CLOCK_SPICC0, "spicc0",			\
    470  1.1      ryo 	    "clk81",			/* parent */			\
    471  1.1      ryo 	    HHI_GCLK_MPEG0,		/* reg */			\
    472  1.1      ryo 	    8)				/* bit */
    473  1.1      ryo #define G12_CLK_i2c							\
    474  1.1      ryo 	MESON_CLK_GATE(MESONG12_CLOCK_I2C, "i2c",			\
    475  1.1      ryo 	    "clk81",			/* parent */			\
    476  1.1      ryo 	    HHI_GCLK_MPEG0,		/* reg */			\
    477  1.1      ryo 	    9)				/* bit */
    478  1.1      ryo #define G12_CLK_sana							\
    479  1.1      ryo 	MESON_CLK_GATE(MESONG12_CLOCK_SANA, "sana",			\
    480  1.1      ryo 	    "clk81",			/* parent */			\
    481  1.1      ryo 	    HHI_GCLK_MPEG0,		/* reg */			\
    482  1.1      ryo 	    10)				/* bit */
    483  1.1      ryo #define G12_CLK_sd							\
    484  1.1      ryo 	MESON_CLK_GATE(MESONG12_CLOCK_SD, "sd",				\
    485  1.1      ryo 	    "clk81",			/* parent */			\
    486  1.1      ryo 	    HHI_GCLK_MPEG0,		/* reg */			\
    487  1.1      ryo 	    11)				/* bit */
    488  1.1      ryo #define G12_CLK_rng0							\
    489  1.1      ryo 	MESON_CLK_GATE(MESONG12_CLOCK_RNG0, "rng0",			\
    490  1.1      ryo 	    "clk81",			/* parent */			\
    491  1.1      ryo 	    HHI_GCLK_MPEG0,		/* reg */			\
    492  1.1      ryo 	    12)				/* bit */
    493  1.1      ryo #define G12_CLK_uart0							\
    494  1.1      ryo 	MESON_CLK_GATE(MESONG12_CLOCK_UART0, "uart0",			\
    495  1.1      ryo 	    "clk81",			/* parent */			\
    496  1.1      ryo 	    HHI_GCLK_MPEG0,		/* reg */			\
    497  1.1      ryo 	    13)				/* bit */
    498  1.1      ryo #define G12_CLK_spicc1							\
    499  1.1      ryo 	MESON_CLK_GATE(MESONG12_CLOCK_SPICC1, "spicc1",			\
    500  1.1      ryo 	    "clk81",			/* parent */			\
    501  1.1      ryo 	    HHI_GCLK_MPEG0,		/* reg */			\
    502  1.1      ryo 	    14)				/* bit */
    503  1.1      ryo #define G12_CLK_hiu_iface						\
    504  1.1      ryo 	MESON_CLK_GATE(MESONG12_CLOCK_HIU_IFACE, "hiu_iface",		\
    505  1.1      ryo 	    "clk81",			/* parent */			\
    506  1.1      ryo 	    HHI_GCLK_MPEG0,		/* reg */			\
    507  1.1      ryo 	    19)				/* bit */
    508  1.1      ryo #define G12_CLK_mipi_dsi_phy						\
    509  1.1      ryo 	MESON_CLK_GATE(MESONG12_CLOCK_MIPI_DSI_PHY, "mipi_dsi_phy",	\
    510  1.1      ryo 	    "clk81",			/* parent */			\
    511  1.1      ryo 	    HHI_GCLK_MPEG0,		/* reg */			\
    512  1.1      ryo 	    20)				/* bit */
    513  1.1      ryo #define G12_CLK_assist_misc						\
    514  1.1      ryo 	MESON_CLK_GATE(MESONG12_CLOCK_ASSIST_MISC, "assist_misc",	\
    515  1.1      ryo 	    "clk81",			/* parent */			\
    516  1.1      ryo 	    HHI_GCLK_MPEG0,		/* reg */			\
    517  1.1      ryo 	    23)				/* bit */
    518  1.1      ryo #define G12_CLK_sd_emmc_a						\
    519  1.1      ryo 	MESON_CLK_GATE(MESONG12_CLOCK_SD_EMMC_A, "sd_emmc_a",		\
    520  1.1      ryo 	    "clk81",			/* parent */			\
    521  1.1      ryo 	    HHI_GCLK_MPEG0,		/* reg */			\
    522  1.1      ryo 	    4)				/* bit */
    523  1.1      ryo #define G12_CLK_sd_emmc_b						\
    524  1.1      ryo 	MESON_CLK_GATE(MESONG12_CLOCK_SD_EMMC_B, "sd_emmc_b",		\
    525  1.1      ryo 	    "clk81",			/* parent */			\
    526  1.1      ryo 	    HHI_GCLK_MPEG0,		/* reg */			\
    527  1.1      ryo 	    25)				/* bit */
    528  1.1      ryo #define G12_CLK_sd_emmc_c						\
    529  1.1      ryo 	MESON_CLK_GATE(MESONG12_CLOCK_SD_EMMC_C, "sd_emmc_c",		\
    530  1.1      ryo 	    "clk81",			/* parent */			\
    531  1.1      ryo 	    HHI_GCLK_MPEG0,		/* reg */			\
    532  1.1      ryo 	    26)				/* bit */
    533  1.1      ryo #define G12_CLK_audio_codec						\
    534  1.1      ryo 	MESON_CLK_GATE(MESONG12_CLOCK_AUDIO_CODEC, "audio_codec",	\
    535  1.1      ryo 	    "clk81",			/* parent */			\
    536  1.1      ryo 	    HHI_GCLK_MPEG0,		/* reg */			\
    537  1.1      ryo 	    28)				/* bit */
    538  1.1      ryo #define G12_CLK_audio							\
    539  1.1      ryo 	MESON_CLK_GATE(MESONG12_CLOCK_AUDIO, "audio",			\
    540  1.1      ryo 	    "clk81",			/* parent */			\
    541  1.1      ryo 	    HHI_GCLK_MPEG1,		/* reg */			\
    542  1.1      ryo 	    0)				/* bit */
    543  1.1      ryo #define G12_CLK_eth							\
    544  1.1      ryo 	MESON_CLK_GATE(MESONG12_CLOCK_ETH, "eth",			\
    545  1.1      ryo 	    "clk81",			/* parent */			\
    546  1.1      ryo 	    HHI_GCLK_MPEG1,		/* reg */			\
    547  1.1      ryo 	    3)				/* bit */
    548  1.1      ryo #define G12_CLK_demux							\
    549  1.1      ryo 	MESON_CLK_GATE(MESONG12_CLOCK_DEMUX, "demux",			\
    550  1.1      ryo 	    "clk81",			/* parent */			\
    551  1.1      ryo 	    HHI_GCLK_MPEG1,		/* reg */			\
    552  1.1      ryo 	    4)				/* bit */
    553  1.1      ryo #define G12_CLK_audio_ififo						\
    554  1.1      ryo 	MESON_CLK_GATE(MESONG12_CLOCK_AUDIO_IFIFO, "audio_ififo",	\
    555  1.1      ryo 	    "clk81",			/* parent */			\
    556  1.1      ryo 	    HHI_GCLK_MPEG1,		/* reg */			\
    557  1.1      ryo 	    11)				/* bit */
    558  1.1      ryo #define G12_CLK_adc							\
    559  1.1      ryo 	MESON_CLK_GATE(MESONG12_CLOCK_ADC, "adc",			\
    560  1.1      ryo 	    "clk81",			/* parent */			\
    561  1.1      ryo 	    HHI_GCLK_MPEG1,		/* reg */			\
    562  1.1      ryo 	    13)				/* bit */
    563  1.1      ryo #define G12_CLK_uart1							\
    564  1.1      ryo 	MESON_CLK_GATE(MESONG12_CLOCK_UART1, "uart1",			\
    565  1.1      ryo 	    "clk81",			/* parent */			\
    566  1.1      ryo 	    HHI_GCLK_MPEG1,		/* reg */			\
    567  1.1      ryo 	    16)				/* bit */
    568  1.1      ryo #define G12_CLK_g2d							\
    569  1.1      ryo 	MESON_CLK_GATE(MESONG12_CLOCK_G2D, "g2d",			\
    570  1.1      ryo 	    "clk81",			/* parent */			\
    571  1.1      ryo 	    HHI_GCLK_MPEG1,		/* reg */			\
    572  1.1      ryo 	    20)				/* bit */
    573  1.1      ryo #define G12_CLK_reset							\
    574  1.1      ryo 	MESON_CLK_GATE(MESONG12_CLOCK_RESET, "reset",			\
    575  1.1      ryo 	    "clk81",			/* parent */			\
    576  1.1      ryo 	    HHI_GCLK_MPEG1,		/* reg */			\
    577  1.1      ryo 	    23)				/* bit */
    578  1.1      ryo #define G12_CLK_pcie_comb						\
    579  1.1      ryo 	MESON_CLK_GATE(MESONG12_CLOCK_PCIE_COMB, "pcie_comb",		\
    580  1.1      ryo 	    "clk81",			/* parent */			\
    581  1.1      ryo 	    HHI_GCLK_MPEG1,		/* reg */			\
    582  1.1      ryo 	    24)				/* bit */
    583  1.1      ryo #define G12_CLK_parser							\
    584  1.1      ryo 	MESON_CLK_GATE(MESONG12_CLOCK_PARSER, "parser",			\
    585  1.1      ryo 	    "clk81",			/* parent */			\
    586  1.1      ryo 	    HHI_GCLK_MPEG1,		/* reg */			\
    587  1.1      ryo 	    25)				/* bit */
    588  1.1      ryo #define G12_CLK_usb							\
    589  1.1      ryo 	MESON_CLK_GATE(MESONG12_CLOCK_USB, "usb",			\
    590  1.1      ryo 	    "clk81",			/* parent */			\
    591  1.1      ryo 	    HHI_GCLK_MPEG1,		/* reg */			\
    592  1.1      ryo 	    26)				/* bit */
    593  1.1      ryo #define G12_CLK_pcie_phy						\
    594  1.1      ryo 	MESON_CLK_GATE(MESONG12_CLOCK_PCIE_PHY, "pcie_phy",		\
    595  1.1      ryo 	    "clk81",			/* parent */			\
    596  1.1      ryo 	    HHI_GCLK_MPEG1,		/* reg */			\
    597  1.1      ryo 	    27)				/* bit */
    598  1.1      ryo #define G12_CLK_ahb_arb0						\
    599  1.1      ryo 	MESON_CLK_GATE(MESONG12_CLOCK_AHB_ARB0, "ahb_arb0",		\
    600  1.1      ryo 	    "clk81",			/* parent */			\
    601  1.1      ryo 	    HHI_GCLK_MPEG1,		/* reg */			\
    602  1.1      ryo 	    29)				/* bit */
    603  1.1      ryo #define G12_CLK_ahb_data_bus						\
    604  1.1      ryo 	MESON_CLK_GATE(MESONG12_CLOCK_AHB_DATA_BUS, "ahb_data_bus",	\
    605  1.1      ryo 	    "clk81",			/* parent */			\
    606  1.1      ryo 	    HHI_GCLK_MPEG2,		/* reg */			\
    607  1.1      ryo 	    1)				/* bit */
    608  1.1      ryo #define G12_CLK_ahb_ctrl_bus						\
    609  1.1      ryo 	MESON_CLK_GATE(MESONG12_CLOCK_AHB_CTRL_BUS, "ahb_ctrl_bus",	\
    610  1.1      ryo 	    "clk81",			/* parent */			\
    611  1.1      ryo 	    HHI_GCLK_MPEG2,		/* reg */			\
    612  1.1      ryo 	    2)				/* bit */
    613  1.1      ryo #define G12_CLK_htx_hdcp22						\
    614  1.1      ryo 	MESON_CLK_GATE(MESONG12_CLOCK_HTX_HDCP22, "htx_hdcp22",		\
    615  1.1      ryo 	    "clk81",			/* parent */			\
    616  1.1      ryo 	    HHI_GCLK_MPEG2,		/* reg */			\
    617  1.1      ryo 	    3)				/* bit */
    618  1.1      ryo #define G12_CLK_htx_pclk						\
    619  1.1      ryo 	MESON_CLK_GATE(MESONG12_CLOCK_HTX_PCLK, "htx_pclk",		\
    620  1.1      ryo 	    "clk81",			/* parent */			\
    621  1.1      ryo 	    HHI_GCLK_MPEG2,		/* reg */			\
    622  1.1      ryo 	    4)				/* bit */
    623  1.1      ryo #define G12_CLK_bt656							\
    624  1.1      ryo 	MESON_CLK_GATE(MESONG12_CLOCK_BT656, "bt656",			\
    625  1.1      ryo 	    "clk81",			/* parent */			\
    626  1.1      ryo 	    HHI_GCLK_MPEG2,		/* reg */			\
    627  1.1      ryo 	    6)				/* bit */
    628  1.1      ryo #define G12_CLK_usb1_ddr_bridge						\
    629  1.1      ryo 	MESON_CLK_GATE(MESONG12_CLOCK_USB1_DDR_BRIDGE, "usb1_ddr_bridge", \
    630  1.1      ryo 	    "clk81",			/* parent */			\
    631  1.1      ryo 	    HHI_GCLK_MPEG2,		/* reg */			\
    632  1.1      ryo 	    8)				/* bit */
    633  1.1      ryo #define G12_CLK_mmc_pclk						\
    634  1.1      ryo 	MESON_CLK_GATE(MESONG12_CLOCK_MMC_PCLK, "mmc_pclk",		\
    635  1.1      ryo 	    "clk81",			/* parent */			\
    636  1.1      ryo 	    HHI_GCLK_MPEG2,		/* reg */			\
    637  1.1      ryo 	    11)				/* bit */
    638  1.1      ryo #define G12_CLK_uart2							\
    639  1.1      ryo 	MESON_CLK_GATE(MESONG12_CLOCK_UART2, "uart2",			\
    640  1.1      ryo 	    "clk81",			/* parent */			\
    641  1.1      ryo 	    HHI_GCLK_MPEG2,		/* reg */			\
    642  1.1      ryo 	    15)				/* bit */
    643  1.1      ryo #define G12_CLK_vpu_intr						\
    644  1.1      ryo 	MESON_CLK_GATE(MESONG12_CLOCK_VPU_INTR, "vpu_intr",		\
    645  1.1      ryo 	    "clk81",			/* parent */			\
    646  1.1      ryo 	    HHI_GCLK_MPEG2,		/* reg */			\
    647  1.1      ryo 	    25)				/* bit */
    648  1.1      ryo #define G12_CLK_gic							\
    649  1.1      ryo 	MESON_CLK_GATE(MESONG12_CLOCK_GIC, "gic",			\
    650  1.1      ryo 	    "clk81",			/* parent */			\
    651  1.1      ryo 	    HHI_GCLK_MPEG2,		/* reg */			\
    652  1.1      ryo 	    30)				/* bit */
    653  1.1      ryo #define G12_CLK_vclk2_venci0						\
    654  1.1      ryo 	MESON_CLK_GATE(MESONG12_CLOCK_VCLK2_VENCI0, "vclk2_venci0",	\
    655  1.1      ryo 	    "clk81",			/* parent */			\
    656  1.1      ryo 	    HHI_GCLK_OTHER,		/* reg */			\
    657  1.1      ryo 	    1)				/* bit */
    658  1.1      ryo #define G12_CLK_vclk2_venci1						\
    659  1.1      ryo 	MESON_CLK_GATE(MESONG12_CLOCK_VCLK2_VENCI1, "vclk2_venci1",	\
    660  1.1      ryo 	    "clk81",			/* parent */			\
    661  1.1      ryo 	    HHI_GCLK_OTHER,		/* reg */			\
    662  1.1      ryo 	    2)				/* bit */
    663  1.1      ryo #define G12_CLK_vclk2_vencp0						\
    664  1.1      ryo 	MESON_CLK_GATE(MESONG12_CLOCK_VCLK2_VENCP0, "vclk2_vencp0",	\
    665  1.1      ryo 	    "clk81",			/* parent */			\
    666  1.1      ryo 	    HHI_GCLK_OTHER,		/* reg */			\
    667  1.1      ryo 	    3)				/* bit */
    668  1.1      ryo #define G12_CLK_vclk2_vencp1						\
    669  1.1      ryo 	MESON_CLK_GATE(MESONG12_CLOCK_VCLK2_VENCP1, "vclk2_vencp1",	\
    670  1.1      ryo 	    "clk81",			/* parent */			\
    671  1.1      ryo 	    HHI_GCLK_OTHER,		/* reg */			\
    672  1.1      ryo 	    4)				/* bit */
    673  1.1      ryo #define G12_CLK_vclk2_venct0						\
    674  1.1      ryo 	MESON_CLK_GATE(MESONG12_CLOCK_VCLK2_VENCT0, "vclk2_venct0",	\
    675  1.1      ryo 	    "clk81",			/* parent */			\
    676  1.1      ryo 	    HHI_GCLK_OTHER,		/* reg */			\
    677  1.1      ryo 	    5)				/* bit */
    678  1.1      ryo #define G12_CLK_vclk2_venct1						\
    679  1.1      ryo 	MESON_CLK_GATE(MESONG12_CLOCK_VCLK2_VENCT1, "vclk2_venct1",	\
    680  1.1      ryo 	    "clk81",			/* parent */			\
    681  1.1      ryo 	    HHI_GCLK_OTHER,		/* reg */			\
    682  1.1      ryo 	    6)				/* bit */
    683  1.1      ryo #define G12_CLK_vclk2_other						\
    684  1.1      ryo 	MESON_CLK_GATE(MESONG12_CLOCK_VCLK2_OTHER, "vclk2_other",	\
    685  1.1      ryo 	    "clk81",			/* parent */			\
    686  1.1      ryo 	    HHI_GCLK_OTHER,		/* reg */			\
    687  1.1      ryo 	    7)				/* bit */
    688  1.1      ryo #define G12_CLK_vclk2_enci						\
    689  1.1      ryo 	MESON_CLK_GATE(MESONG12_CLOCK_VCLK2_ENCI, "vclk2_enci",		\
    690  1.1      ryo 	    "clk81",			/* parent */			\
    691  1.1      ryo 	    HHI_GCLK_OTHER,		/* reg */			\
    692  1.1      ryo 	    8)				/* bit */
    693  1.1      ryo #define G12_CLK_vclk2_encp						\
    694  1.1      ryo 	MESON_CLK_GATE(MESONG12_CLOCK_VCLK2_ENCP, "vclk2_encp",		\
    695  1.1      ryo 	    "clk81",			/* parent */			\
    696  1.1      ryo 	    HHI_GCLK_OTHER,		/* reg */			\
    697  1.1      ryo 	    9)				/* bit */
    698  1.1      ryo #define G12_CLK_dac_clk							\
    699  1.1      ryo 	MESON_CLK_GATE(MESONG12_CLOCK_DAC_CLK, "dac_clk",		\
    700  1.1      ryo 	    "clk81",			/* parent */			\
    701  1.1      ryo 	    HHI_GCLK_OTHER,		/* reg */			\
    702  1.1      ryo 	    10)				/* bit */
    703  1.1      ryo #define G12_CLK_aoclk							\
    704  1.1      ryo 	MESON_CLK_GATE(MESONG12_CLOCK_AOCLK, "aoclk",			\
    705  1.1      ryo 	    "clk81",			/* parent */			\
    706  1.1      ryo 	    HHI_GCLK_OTHER,		/* reg */			\
    707  1.1      ryo 	    14)				/* bit */
    708  1.1      ryo #define G12_CLK_iec958							\
    709  1.1      ryo 	MESON_CLK_GATE(MESONG12_CLOCK_IEC958, "iec958",			\
    710  1.1      ryo 	    "clk81",			/* parent */			\
    711  1.1      ryo 	    HHI_GCLK_OTHER,		/* reg */			\
    712  1.1      ryo 	    16)				/* bit */
    713  1.1      ryo #define G12_CLK_enc480p							\
    714  1.1      ryo 	MESON_CLK_GATE(MESONG12_CLOCK_ENC480P, "enc480p",		\
    715  1.1      ryo 	    "clk81",			/* parent */			\
    716  1.1      ryo 	    HHI_GCLK_OTHER,		/* reg */			\
    717  1.1      ryo 	    20)				/* bit */
    718  1.1      ryo #define G12_CLK_rng1							\
    719  1.1      ryo 	MESON_CLK_GATE(MESONG12_CLOCK_RNG1, "rng1",			\
    720  1.1      ryo 	    "clk81",			/* parent */			\
    721  1.1      ryo 	    HHI_GCLK_OTHER,		/* reg */			\
    722  1.1      ryo 	    21)				/* bit */
    723  1.1      ryo #define G12_CLK_vclk2_enct						\
    724  1.1      ryo 	MESON_CLK_GATE(MESONG12_CLOCK_VCLK2_ENCT, "vclk2_enct",		\
    725  1.1      ryo 	    "clk81",			/* parent */			\
    726  1.1      ryo 	    HHI_GCLK_OTHER,		/* reg */			\
    727  1.1      ryo 	    22)				/* bit */
    728  1.1      ryo #define G12_CLK_vclk2_encl						\
    729  1.1      ryo 	MESON_CLK_GATE(MESONG12_CLOCK_VCLK2_ENCL, "vclk2_encl",		\
    730  1.1      ryo 	    "clk81",			/* parent */			\
    731  1.1      ryo 	    HHI_GCLK_OTHER,		/* reg */			\
    732  1.1      ryo 	    23)				/* bit */
    733  1.1      ryo #define G12_CLK_vclk2_venclmmc						\
    734  1.1      ryo 	MESON_CLK_GATE(MESONG12_CLOCK_VCLK2_VENCLMMC, "vclk2_venclmmc",	\
    735  1.1      ryo 	    "clk81",			/* parent */			\
    736  1.1      ryo 	    HHI_GCLK_OTHER,		/* reg */			\
    737  1.1      ryo 	    24)				/* bit */
    738  1.1      ryo #define G12_CLK_vclk2_vencl						\
    739  1.1      ryo 	MESON_CLK_GATE(MESONG12_CLOCK_VCLK2_VENCL, "vclk2_vencl",	\
    740  1.1      ryo 	    "clk81",			/* parent */			\
    741  1.1      ryo 	    HHI_GCLK_OTHER,		/* reg */			\
    742  1.1      ryo 	    25)				/* bit */
    743  1.1      ryo #define G12_CLK_vclk2_other1						\
    744  1.1      ryo 	MESON_CLK_GATE(MESONG12_CLOCK_VCLK2_OTHER1, "vclk2_other1",	\
    745  1.1      ryo 	    "clk81",			/* parent */			\
    746  1.1      ryo 	    HHI_GCLK_OTHER,		/* reg */			\
    747  1.1      ryo 	    26)				/* bit */
    748  1.1      ryo #define G12_CLK_dma							\
    749  1.1      ryo 	MESON_CLK_GATE(MESONG12_CLOCK_DMA, "dma",			\
    750  1.1      ryo 	    "clk81",			/* parent */			\
    751  1.1      ryo 	    HHI_GCLK_OTHER2,		/* reg */			\
    752  1.1      ryo 	    0)				/* bit */
    753  1.1      ryo #define G12_CLK_efuse							\
    754  1.1      ryo 	MESON_CLK_GATE(MESONG12_CLOCK_EFUSE, "efuse",			\
    755  1.1      ryo 	    "clk81",			/* parent */			\
    756  1.1      ryo 	    HHI_GCLK_OTHER2,		/* reg */			\
    757  1.1      ryo 	    1)				/* bit */
    758  1.1      ryo #define G12_CLK_rom_boot						\
    759  1.1      ryo 	MESON_CLK_GATE(MESONG12_CLOCK_ROM_BOOT, "rom_boot",		\
    760  1.1      ryo 	    "clk81",			/* parent */			\
    761  1.1      ryo 	    HHI_GCLK_OTHER2,		/* reg */			\
    762  1.1      ryo 	    2)				/* bit */
    763  1.1      ryo #define G12_CLK_reset_sec						\
    764  1.1      ryo 	MESON_CLK_GATE(MESONG12_CLOCK_RESET_SEC, "reset_sec",		\
    765  1.1      ryo 	    "clk81",			/* parent */			\
    766  1.1      ryo 	    HHI_GCLK_OTHER2,		/* reg */			\
    767  1.1      ryo 	    3)				/* bit */
    768  1.1      ryo #define G12_CLK_sec_ahb_apb3						\
    769  1.1      ryo 	MESON_CLK_GATE(MESONG12_CLOCK_SEC_AHB_APB3, "sec_ahb_apb3",	\
    770  1.1      ryo 	    "clk81",			/* parent */			\
    771  1.1      ryo 	    HHI_GCLK_OTHER2,		/* reg */			\
    772  1.1      ryo 	    4)				/* bit */
    773  1.1      ryo 
    774  1.1      ryo /* little cpu cluster */
    775  1.1      ryo #define G12_CLK_cpu_clk_dyn0_sel					\
    776  1.1      ryo 	MESON_CLK_MUX(MESONG12_CLOCK_CPU_CLK_DYN0_SEL, "cpu_clk_dyn0_sel", \
    777  1.1      ryo 	    PARENTS("fclk_div2", "fclk_div3", "xtal"),			\
    778  1.1      ryo 	    HHI_SYS_CPU_CLK_CNTL0,	/* reg */			\
    779  1.1      ryo 	    __BITS(1,0),		/* sel */			\
    780  1.1      ryo 	    0)
    781  1.1      ryo #define G12_CLK_cpu_clk_dyn1_sel					\
    782  1.1      ryo 	MESON_CLK_MUX(MESONG12_CLOCK_CPU_CLK_DYN1_SEL, "cpu_clk_dyn1_sel", \
    783  1.1      ryo 	    PARENTS("fclk_div2", "fclk_div3", "xtal"),			\
    784  1.1      ryo 	    HHI_SYS_CPU_CLK_CNTL0,	/* reg */			\
    785  1.1      ryo 	    __BITS(17,16),		/* sel */			\
    786  1.1      ryo 	    0)
    787  1.1      ryo #define G12_CLK_cpu_clk_dyn0_div					\
    788  1.1      ryo 	MESON_CLK_DIV(MESONG12_CLOCK_CPU_CLK_DYN0_DIV, "cpu_clk_dyn0_div", \
    789  1.1      ryo 	    "cpu_clk_dyn0_sel",		/* parent */			\
    790  1.1      ryo 	    HHI_SYS_CPU_CLK_CNTL0,	/* reg */			\
    791  1.1      ryo 	    __BIT(26),			/* div */			\
    792  1.1      ryo 	    0)
    793  1.1      ryo #define G12_CLK_cpu_clk_dyn1_div					\
    794  1.1      ryo 	MESON_CLK_DIV(MESONG12_CLOCK_CPU_CLK_DYN1_DIV, "cpu_clk_dyn1_div", \
    795  1.1      ryo 	    "cpu_clk_dyn1_sel",		/* parent */			\
    796  1.1      ryo 	    HHI_SYS_CPU_CLK_CNTL0,	/* reg */			\
    797  1.1      ryo 	    __BITS(25,20),		/* div */			\
    798  1.1      ryo 	    0)
    799  1.1      ryo #define G12_CLK_cpu_clk_dyn0						\
    800  1.1      ryo 	MESON_CLK_MUX(MESONG12_CLOCK_CPU_CLK_DYN0, "cpu_clk_dyn0",	\
    801  1.1      ryo 	    PARENTS("cpu_clk_dyn0_div", "cpu_clk_dyn0_sel"),		\
    802  1.1      ryo 	    HHI_SYS_CPU_CLK_CNTL0,	/* reg */			\
    803  1.1      ryo 	    __BIT(2),			/* sel */			\
    804  1.1      ryo 	    0)
    805  1.1      ryo #define G12_CLK_cpu_clk_dyn1						\
    806  1.1      ryo 	MESON_CLK_MUX(MESONG12_CLOCK_CPU_CLK_DYN1, "cpu_clk_dyn1",	\
    807  1.1      ryo 	    PARENTS("cpu_clk_dyn1_div", "cpu_clk_dyn1_sel"),		\
    808  1.1      ryo 	    HHI_SYS_CPU_CLK_CNTL0,	/* reg */			\
    809  1.1      ryo 	    __BIT(18),			/* sel */			\
    810  1.1      ryo 	    0)
    811  1.1      ryo #define G12_CLK_cpu_clk_dyn						\
    812  1.1      ryo 	MESON_CLK_MUX(MESONG12_CLOCK_CPU_CLK_DYN, "cpu_clk_dyn",	\
    813  1.1      ryo 	    PARENTS("cpu_clk_dyn0", "cpu_clk_dyn1"),			\
    814  1.1      ryo 	    HHI_SYS_CPU_CLK_CNTL0,	/* reg */			\
    815  1.1      ryo 	    __BIT(10),			/* sel */			\
    816  1.1      ryo 	    0)
    817  1.1      ryo #define G12A_CLK_cpu_clk						\
    818  1.1      ryo 	MESON_CLK_MUX_RATE(MESONG12_CLOCK_CPU_CLK, "cpu_clk",		\
    819  1.1      ryo 	    PARENTS("cpu_clk_dyn", "sys_pll"),				\
    820  1.1      ryo 	    HHI_SYS_CPU_CLK_CNTL0,	/* reg */			\
    821  1.1      ryo 	    __BIT(11),			/* sel */			\
    822  1.1      ryo 	    mesong12_cpuclk_get_rate,					\
    823  1.1      ryo 	    mesong12_cpuclk_set_rate,					\
    824  1.1      ryo 	    0)
    825  1.1      ryo #define G12B_CLK_cpu_clk						\
    826  1.1      ryo 	MESON_CLK_MUX_RATE(MESONG12_CLOCK_CPU_CLK, "cpu_clk",		\
    827  1.1      ryo 	    PARENTS("cpu_clk_dyn", "sys1_pll"),				\
    828  1.1      ryo 	    HHI_SYS_CPU_CLK_CNTL0,	/* reg */			\
    829  1.1      ryo 	    __BIT(11),			/* sel */			\
    830  1.1      ryo 	    mesong12_cpuclk_get_rate,					\
    831  1.1      ryo 	    mesong12_cpuclk_set_rate,					\
    832  1.1      ryo 	    0)
    833  1.1      ryo 
    834  1.1      ryo /* big cpu cluster */
    835  1.1      ryo #define G12_CLK_cpub_clk_dyn0_sel					\
    836  1.1      ryo 	MESON_CLK_MUX(MESONG12_CLOCK_CPUB_CLK_DYN0_SEL, "cpub_clk_dyn0_sel", \
    837  1.1      ryo 	    PARENTS("fclk_div2", "fclk_div3", "xtal"),			\
    838  1.1      ryo 	    HHI_SYS_CPUB_CLK_CNTL,	/* reg */			\
    839  1.1      ryo 	    __BITS(1,0),		/* sel */			\
    840  1.1      ryo 	    0)
    841  1.1      ryo #define G12_CLK_cpub_clk_dyn0_div					\
    842  1.1      ryo 	MESON_CLK_DIV(MESONG12_CLOCK_CPUB_CLK_DYN0_DIV, "cpub_clk_dyn0_div", \
    843  1.1      ryo 	    "cpub_clk_dyn0_sel",	/* parent */			\
    844  1.1      ryo 	    HHI_SYS_CPUB_CLK_CNTL,	/* reg */			\
    845  1.1      ryo 	    __BITS(9,4),		/* div */			\
    846  1.1      ryo 	    0)
    847  1.1      ryo #define G12_CLK_cpub_clk_dyn0						\
    848  1.1      ryo 	MESON_CLK_MUX(MESONG12_CLOCK_CPUB_CLK_DYN0, "cpub_clk_dyn0",	\
    849  1.1      ryo 	    PARENTS("cpub_clk_dyn0_div", "cpub_clk_dyn0_sel"),		\
    850  1.1      ryo 	    HHI_SYS_CPUB_CLK_CNTL,	/* reg */			\
    851  1.1      ryo 	    __BIT(2),			/* sel */			\
    852  1.1      ryo 	    0)
    853  1.1      ryo #define G12_CLK_cpub_clk_dyn1_sel					\
    854  1.1      ryo 	MESON_CLK_MUX(MESONG12_CLOCK_CPUB_CLK_DYN1_SEL, "cpub_clk_dyn1_sel", \
    855  1.1      ryo 	    PARENTS("fclk_div2", "fclk_div3", "xtal", "xtal"),		\
    856  1.1      ryo 	    HHI_SYS_CPUB_CLK_CNTL,	/* reg */			\
    857  1.1      ryo 	    __BITS(17,16),		/* sel */			\
    858  1.1      ryo 	    0)
    859  1.1      ryo #define G12_CLK_cpub_clk_dyn1_div					\
    860  1.1      ryo 	MESON_CLK_DIV(MESONG12_CLOCK_CPUB_CLK_DYN1_DIV, "cpub_clk_dyn1_div", \
    861  1.1      ryo 	    "cpub_clk_dyn1_sel",	/* parent */			\
    862  1.1      ryo 	    HHI_SYS_CPUB_CLK_CNTL,	/* reg */			\
    863  1.1      ryo 	    __BITS(25,20),		/* div */			\
    864  1.1      ryo 	    0)
    865  1.1      ryo #define G12_CLK_cpub_clk_dyn1						\
    866  1.1      ryo 	MESON_CLK_MUX(MESONG12_CLOCK_CPUB_CLK_DYN1, "cpub_clk_dyn1",	\
    867  1.1      ryo 	    PARENTS("cpub_clk_dyn1_div", "cpub_clk_dyn1_sel"),		\
    868  1.1      ryo 	    HHI_SYS_CPUB_CLK_CNTL,	/* reg */			\
    869  1.1      ryo 	    __BIT(18),			/* sel */			\
    870  1.1      ryo 	    0)
    871  1.1      ryo #define G12_CLK_cpub_clk_dyn						\
    872  1.1      ryo 	MESON_CLK_MUX(MESONG12_CLOCK_CPUB_CLK_DYN, "cpub_clk_dyn",	\
    873  1.1      ryo 	    PARENTS("cpub_clk_dyn0", "cpub_clk_dyn1"),			\
    874  1.1      ryo 	    HHI_SYS_CPUB_CLK_CNTL,	/* reg */			\
    875  1.1      ryo 	    __BIT(10),			/* sel */			\
    876  1.1      ryo 	    0)
    877  1.1      ryo #define G12_CLK_cpub_clk						\
    878  1.1      ryo 	MESON_CLK_MUX_RATE(MESONG12_CLOCK_CPUB_CLK, "cpub_clk",		\
    879  1.1      ryo 	    PARENTS("cpub_clk_dyn", "sys_pll"),				\
    880  1.1      ryo 	    HHI_SYS_CPUB_CLK_CNTL,	/* reg */			\
    881  1.1      ryo 	    __BIT(11),			/* sel */			\
    882  1.1      ryo 	    mesong12_cpuclk_get_rate,					\
    883  1.1      ryo 	    mesong12_cpuclk_set_rate,					\
    884  1.1      ryo 	    0)
    885  1.1      ryo 
    886  1.1      ryo /* ts */
    887  1.1      ryo #define G12_CLK_ts_div							\
    888  1.1      ryo 	MESON_CLK_DIV(MESONG12_CLOCK_TS_DIV, "ts_div",			\
    889  1.1      ryo 	    "xtal",			/* parent */			\
    890  1.1      ryo 	    HHI_TS_CLK_CNTL,		/* reg */			\
    891  1.1      ryo 	    __BITS(7,0),		/* div */			\
    892  1.1      ryo 	    0)
    893  1.1      ryo #define G12_CLK_ts							\
    894  1.1      ryo 	MESON_CLK_GATE(MESONG12_CLOCK_TS, "ts",				\
    895  1.1      ryo 	    "ts_div",			/* parent */			\
    896  1.1      ryo 	    HHI_TS_CLK_CNTL,		/* ret */			\
    897  1.1      ryo 	    8)				/* bit */
    898  1.1      ryo 
    899  1.1      ryo /* hdmi */
    900  1.1      ryo #define G12_CLK_hdmi_pll_dco						\
    901  1.1      ryo 	MESON_CLK_PLL(MESONG12_CLOCK_HDMI_PLL_DCO, "hdmi_pll_dco",	\
    902  1.1      ryo 	    "xtal",						/* parent */ \
    903  1.1      ryo 	    MESON_CLK_PLL_REG(HHI_HDMI_PLL_CNTL0, __BIT(28)),	/* enable */ \
    904  1.1      ryo 	    MESON_CLK_PLL_REG(HHI_HDMI_PLL_CNTL0, __BITS(7,0)),	/* m */ \
    905  1.1      ryo 	    MESON_CLK_PLL_REG(HHI_HDMI_PLL_CNTL0, __BITS(14,10)),/* n */ \
    906  1.1      ryo 	    MESON_CLK_PLL_REG(HHI_HDMI_PLL_CNTL1, __BITS(15,0)),/* frac */ \
    907  1.1      ryo 	    MESON_CLK_PLL_REG(HHI_HDMI_PLL_CNTL0, __BIT(30)),	/* l */ \
    908  1.1      ryo 	    MESON_CLK_PLL_REG(HHI_HDMI_PLL_CNTL0, __BIT(29)),	/* reset */ \
    909  1.1      ryo 	    0)
    910  1.1      ryo #define G12_CLK_hdmi_pll_od						\
    911  1.1      ryo 	MESON_CLK_DIV(MESONG12_CLOCK_HDMI_PLL_OD, "hdmi_pll_od",	\
    912  1.1      ryo 	    "hdmi_pll_dco",		/* parent */			\
    913  1.1      ryo 	    HHI_HDMI_PLL_CNTL0,		/* reg */			\
    914  1.1      ryo 	    __BITS(17,16),		/* div */			\
    915  1.1      ryo 	    MESON_CLK_DIV_POWER_OF_TWO)
    916  1.1      ryo #define G12_CLK_hdmi_pll_od2						\
    917  1.1      ryo 	MESON_CLK_DIV(MESONG12_CLOCK_HDMI_PLL_OD2, "hdmi_pll_od2",	\
    918  1.1      ryo 	    "hdmi_pll_od",		/* parent */			\
    919  1.1      ryo 	    HHI_HDMI_PLL_CNTL0,		/* reg */			\
    920  1.1      ryo 	    __BITS(19,18),		/* div */			\
    921  1.1      ryo 	    MESON_CLK_DIV_POWER_OF_TWO)
    922  1.1      ryo #define G12_CLK_hdmi_pll						\
    923  1.1      ryo 	MESON_CLK_DIV(MESONG12_CLOCK_HDMI_PLL, "hdmi_pll",		\
    924  1.1      ryo 	    "hdmi_pll_od2",		/* parent */			\
    925  1.1      ryo 	    HHI_HDMI_PLL_CNTL0,		/* reg */			\
    926  1.1      ryo 	    __BITS(21,20),		/* div */			\
    927  1.1      ryo 	    MESON_CLK_DIV_POWER_OF_TWO)
    928  1.1      ryo 
    929  1.1      ryo #define G12_CLK_vid_pll_div						\
    930  1.1      ryo 	MESON_CLK_DIV(MESONG12_CLOCK_VID_PLL_DIV, "vid_pll_div",	\
    931  1.1      ryo 	    "hdmi_pll",			/* parent */			\
    932  1.1      ryo 	    HHI_FIX_PLL_CNTL0,		/* reg */			\
    933  1.1      ryo 	    __BITS(17,16),		/* div */			\
    934  1.1      ryo 	    0)
    935  1.1      ryo #define G12_CLK_vid_pll_sel						\
    936  1.1      ryo 	MESON_CLK_MUX(MESONG12_CLOCK_VID_PLL_SEL, "vid_pll_sel",	\
    937  1.1      ryo 	    PARENTS("vid_pll_div", "hdmi_pll"),				\
    938  1.1      ryo 	    HHI_VID_PLL_CLK_DIV,	/* reg */			\
    939  1.1      ryo 	    __BIT(18),			/* sel */			\
    940  1.1      ryo 	    0)
    941  1.1      ryo #define G12_CLK_vid_pll							\
    942  1.1      ryo 	MESON_CLK_GATE(MESONG12_CLOCK_VID_PLL_DIV, "vid_pll",		\
    943  1.1      ryo 	    "vid_pll_sel",		/* parent */			\
    944  1.1      ryo 	    HHI_VID_PLL_CLK_DIV,	/* reg */			\
    945  1.1      ryo 	    19)				/* bit */
    946  1.1      ryo 
    947  1.1      ryo /* USB3/PCIe */
    948  1.1      ryo #define G12_CLK_pcie_pll_dco						\
    949  1.1      ryo 	MESON_CLK_PLL_RATE(MESONG12_CLOCK_PCIE_PLL_DCO, "pcie_pll_dco",	\
    950  1.1      ryo 	    "xtal",						/* parent */ \
    951  1.1      ryo 	    MESON_CLK_PLL_REG(HHI_PCIE_PLL_CNTL0, __BIT(28)),	/* enable */ \
    952  1.1      ryo 	    MESON_CLK_PLL_REG(HHI_PCIE_PLL_CNTL0, __BITS(7,0)),	/* m */ \
    953  1.1      ryo 	    MESON_CLK_PLL_REG(HHI_PCIE_PLL_CNTL0, __BITS(14,10)),/* n */ \
    954  1.1      ryo 	    MESON_CLK_PLL_REG(HHI_PCIE_PLL_CNTL1, __BITS(11,0)),/* frac */ \
    955  1.1      ryo 	    MESON_CLK_PLL_REG(HHI_PCIE_PLL_CNTL0, __BIT(31)),	/* l */ \
    956  1.1      ryo 	    MESON_CLK_PLL_REG(HHI_PCIE_PLL_CNTL0, __BIT(29)),	/* reset */ \
    957  1.1      ryo 	    mesong12_clk_pcie_pll_set_rate,				\
    958  1.1      ryo 	    0)
    959  1.1      ryo #define G12_CLK_pcie_pll_dco_div2					\
    960  1.1      ryo 	MESON_CLK_FIXED_FACTOR(MESONG12_CLOCK_PCIE_PLL_DCO_DIV2,	\
    961  1.1      ryo 	    "pcie_pll_dco_div2",					\
    962  1.1      ryo 	    "pcie_pll_dco",		/* parent */			\
    963  1.1      ryo 	    2,				/* div */			\
    964  1.1      ryo 	    1)				/* mult */
    965  1.1      ryo #define G12_CLK_pcie_pll_od						\
    966  1.1      ryo 	MESON_CLK_DIV(MESONG12_CLOCK_PCIE_PLL_OD, "pcie_pll_od",	\
    967  1.1      ryo 	    "pcie_pll_dco_div2",	/* parent */			\
    968  1.1      ryo 	    HHI_PCIE_PLL_CNTL0,		/* reg */			\
    969  1.1      ryo 	    __BITS(20,16),		/* div */			\
    970  1.1      ryo 	    MESON_CLK_DIV_SET_RATE_PARENT)
    971  1.1      ryo #define G12_CLK_pcie_pll_pll						\
    972  1.1      ryo 	MESON_CLK_FIXED_FACTOR(MESONG12_CLOCK_PCIE_PLL, "pcie_pll_pll",	\
    973  1.1      ryo 	    "pcie_pll_od",		/* parent */			\
    974  1.1      ryo 	    2,				/* div */			\
    975  1.1      ryo 	    1)				/* mult */
    976  1.1      ryo 
    977  1.1      ryo /* not all clocks are defined */
    978  1.1      ryo static struct meson_clk_clk mesong12a_clkc_clks[] = {
    979  1.1      ryo 	G12_CLK_fixed_pll_dco,
    980  1.1      ryo 	G12_CLK_fixed_pll,
    981  1.1      ryo 	G12_CLK_sys_pll_dco,
    982  1.1      ryo 	G12_CLK_sys_pll,
    983  1.1      ryo 	G12_CLK_fclk_div2_div,
    984  1.1      ryo 	G12_CLK_fclk_div2,
    985  1.1      ryo 	G12_CLK_fclk_div2p5_div,
    986  1.1      ryo 	G12_CLK_fclk_div3_div,
    987  1.1      ryo 	G12_CLK_fclk_div3,
    988  1.1      ryo 	G12_CLK_fclk_div4_div,
    989  1.1      ryo 	G12_CLK_fclk_div4,
    990  1.1      ryo 	G12_CLK_fclk_div5_div,
    991  1.1      ryo 	G12_CLK_fclk_div5,
    992  1.1      ryo 	G12_CLK_fclk_div7_div,
    993  1.1      ryo 	G12_CLK_fclk_div7,
    994  1.1      ryo 	G12_CLK_mpll_prediv,
    995  1.1      ryo 	G12_CLK_mpll0_div,
    996  1.1      ryo 	G12_CLK_mpll1_div,
    997  1.1      ryo 	G12_CLK_mpll2_div,
    998  1.1      ryo 	G12_CLK_mpll0,
    999  1.1      ryo 	G12_CLK_mpll1,
   1000  1.1      ryo 	G12_CLK_mpll2,
   1001  1.1      ryo 	G12_CLK_mpeg_sel,
   1002  1.1      ryo 	G12_CLK_mpeg_clk_div,
   1003  1.1      ryo 	G12_CLK_clk81,
   1004  1.1      ryo 	G12_CLK_mpll_50m_div,
   1005  1.1      ryo 	G12_CLK_mpll_50m,
   1006  1.1      ryo 	G12_CLK_sd_emmc_a_clk0_sel,
   1007  1.1      ryo 	G12_CLK_sd_emmc_b_clk0_sel,
   1008  1.1      ryo 	G12_CLK_sd_emmc_c_clk0_sel,
   1009  1.1      ryo 	G12_CLK_sd_emmc_a_clk0_div,
   1010  1.1      ryo 	G12_CLK_sd_emmc_b_clk0_div,
   1011  1.1      ryo 	G12_CLK_sd_emmc_c_clk0_div,
   1012  1.1      ryo 	G12_CLK_sd_emmc_a_clk0,
   1013  1.1      ryo 	G12_CLK_sd_emmc_b_clk0,
   1014  1.1      ryo 	G12_CLK_sd_emmc_c_clk0,
   1015  1.1      ryo 	G12_CLK_ddr,
   1016  1.1      ryo 	G12_CLK_dos,
   1017  1.1      ryo 	G12_CLK_audio_locker,
   1018  1.1      ryo 	G12_CLK_mipi_dsi_host,
   1019  1.1      ryo 	G12_CLK_eth_phy,
   1020  1.1      ryo 	G12_CLK_isa,
   1021  1.1      ryo 	G12_CLK_pl301,
   1022  1.1      ryo 	G12_CLK_periphs,
   1023  1.1      ryo 	G12_CLK_spicc0,
   1024  1.1      ryo 	G12_CLK_i2c,
   1025  1.1      ryo 	G12_CLK_sana,
   1026  1.1      ryo 	G12_CLK_sd,
   1027  1.1      ryo 	G12_CLK_rng0,
   1028  1.1      ryo 	G12_CLK_uart0,
   1029  1.1      ryo 	G12_CLK_spicc1,
   1030  1.1      ryo 	G12_CLK_hiu_iface,
   1031  1.1      ryo 	G12_CLK_mipi_dsi_phy,
   1032  1.1      ryo 	G12_CLK_assist_misc,
   1033  1.1      ryo 	G12_CLK_sd_emmc_a,
   1034  1.1      ryo 	G12_CLK_sd_emmc_b,
   1035  1.1      ryo 	G12_CLK_sd_emmc_c,
   1036  1.1      ryo 	G12_CLK_audio_codec,
   1037  1.1      ryo 	G12_CLK_audio,
   1038  1.1      ryo 	G12_CLK_eth,
   1039  1.1      ryo 	G12_CLK_demux,
   1040  1.1      ryo 	G12_CLK_audio_ififo,
   1041  1.1      ryo 	G12_CLK_adc,
   1042  1.1      ryo 	G12_CLK_uart1,
   1043  1.1      ryo 	G12_CLK_g2d,
   1044  1.1      ryo 	G12_CLK_reset,
   1045  1.1      ryo 	G12_CLK_pcie_comb,
   1046  1.1      ryo 	G12_CLK_parser,
   1047  1.1      ryo 	G12_CLK_usb,
   1048  1.1      ryo 	G12_CLK_pcie_phy,
   1049  1.1      ryo 	G12_CLK_ahb_arb0,
   1050  1.1      ryo 	G12_CLK_ahb_data_bus,
   1051  1.1      ryo 	G12_CLK_ahb_ctrl_bus,
   1052  1.1      ryo 	G12_CLK_htx_hdcp22,
   1053  1.1      ryo 	G12_CLK_htx_pclk,
   1054  1.1      ryo 	G12_CLK_bt656,
   1055  1.1      ryo 	G12_CLK_usb1_ddr_bridge,
   1056  1.1      ryo 	G12_CLK_mmc_pclk,
   1057  1.1      ryo 	G12_CLK_uart2,
   1058  1.1      ryo 	G12_CLK_vpu_intr,
   1059  1.1      ryo 	G12_CLK_gic,
   1060  1.1      ryo 	G12_CLK_vclk2_venci0,
   1061  1.1      ryo 	G12_CLK_vclk2_venci1,
   1062  1.1      ryo 	G12_CLK_vclk2_vencp0,
   1063  1.1      ryo 	G12_CLK_vclk2_vencp1,
   1064  1.1      ryo 	G12_CLK_vclk2_venct0,
   1065  1.1      ryo 	G12_CLK_vclk2_venct1,
   1066  1.1      ryo 	G12_CLK_vclk2_other,
   1067  1.1      ryo 	G12_CLK_vclk2_enci,
   1068  1.1      ryo 	G12_CLK_vclk2_encp,
   1069  1.1      ryo 	G12_CLK_dac_clk,
   1070  1.1      ryo 	G12_CLK_aoclk,
   1071  1.1      ryo 	G12_CLK_iec958,
   1072  1.1      ryo 	G12_CLK_enc480p,
   1073  1.1      ryo 	G12_CLK_rng1,
   1074  1.1      ryo 	G12_CLK_vclk2_enct,
   1075  1.1      ryo 	G12_CLK_vclk2_encl,
   1076  1.1      ryo 	G12_CLK_vclk2_venclmmc,
   1077  1.1      ryo 	G12_CLK_vclk2_vencl,
   1078  1.1      ryo 	G12_CLK_vclk2_other1,
   1079  1.1      ryo 	G12_CLK_dma,
   1080  1.1      ryo 	G12_CLK_efuse,
   1081  1.1      ryo 	G12_CLK_rom_boot,
   1082  1.1      ryo 	G12_CLK_reset_sec,
   1083  1.1      ryo 	G12_CLK_sec_ahb_apb3,
   1084  1.1      ryo 	G12_CLK_cpu_clk_dyn0_sel,
   1085  1.1      ryo 	G12_CLK_cpu_clk_dyn1_sel,
   1086  1.1      ryo 	G12_CLK_cpu_clk_dyn0_div,
   1087  1.1      ryo 	G12_CLK_cpu_clk_dyn1_div,
   1088  1.1      ryo 	G12_CLK_cpu_clk_dyn0,
   1089  1.1      ryo 	G12_CLK_cpu_clk_dyn1,
   1090  1.1      ryo 	G12_CLK_cpu_clk_dyn,
   1091  1.1      ryo 	G12A_CLK_cpu_clk,
   1092  1.1      ryo 	G12_CLK_ts_div,
   1093  1.1      ryo 	G12_CLK_ts,
   1094  1.1      ryo 	G12_CLK_hdmi_pll_dco,
   1095  1.1      ryo 	G12_CLK_hdmi_pll_od,
   1096  1.1      ryo 	G12_CLK_hdmi_pll_od2,
   1097  1.1      ryo 	G12_CLK_hdmi_pll,
   1098  1.1      ryo 	G12_CLK_vid_pll_div,
   1099  1.1      ryo 	G12_CLK_vid_pll_sel,
   1100  1.1      ryo 	G12_CLK_vid_pll,
   1101  1.1      ryo 	G12_CLK_pcie_pll_dco,
   1102  1.1      ryo 	G12_CLK_pcie_pll_dco_div2,
   1103  1.1      ryo 	G12_CLK_pcie_pll_od,
   1104  1.1      ryo 	G12_CLK_pcie_pll_pll
   1105  1.1      ryo };
   1106  1.1      ryo 
   1107  1.1      ryo static struct meson_clk_clk mesong12b_clkc_clks[] = {
   1108  1.1      ryo 	G12_CLK_fixed_pll_dco,
   1109  1.1      ryo 	G12_CLK_fixed_pll,
   1110  1.1      ryo 	G12_CLK_sys_pll_dco,
   1111  1.1      ryo 	G12_CLK_sys_pll,
   1112  1.1      ryo 	G12B_CLK_sys1_pll_dco,
   1113  1.1      ryo 	G12B_CLK_sys1_pll,
   1114  1.1      ryo 	G12_CLK_fclk_div2_div,
   1115  1.1      ryo 	G12_CLK_fclk_div2,
   1116  1.1      ryo 	G12_CLK_fclk_div2p5_div,
   1117  1.1      ryo 	G12_CLK_fclk_div3_div,
   1118  1.1      ryo 	G12_CLK_fclk_div3,
   1119  1.1      ryo 	G12_CLK_fclk_div4_div,
   1120  1.1      ryo 	G12_CLK_fclk_div4,
   1121  1.1      ryo 	G12_CLK_fclk_div5_div,
   1122  1.1      ryo 	G12_CLK_fclk_div5,
   1123  1.1      ryo 	G12_CLK_fclk_div7_div,
   1124  1.1      ryo 	G12_CLK_fclk_div7,
   1125  1.1      ryo 	G12_CLK_mpll_prediv,
   1126  1.1      ryo 	G12_CLK_mpll0_div,
   1127  1.1      ryo 	G12_CLK_mpll1_div,
   1128  1.1      ryo 	G12_CLK_mpll2_div,
   1129  1.1      ryo 	G12_CLK_mpll0,
   1130  1.1      ryo 	G12_CLK_mpll1,
   1131  1.1      ryo 	G12_CLK_mpll2,
   1132  1.1      ryo 	G12_CLK_mpeg_sel,
   1133  1.1      ryo 	G12_CLK_mpeg_clk_div,
   1134  1.1      ryo 	G12_CLK_clk81,
   1135  1.1      ryo 	G12_CLK_mpll_50m_div,
   1136  1.1      ryo 	G12_CLK_mpll_50m,
   1137  1.1      ryo 	G12_CLK_sd_emmc_a_clk0_sel,
   1138  1.1      ryo 	G12_CLK_sd_emmc_b_clk0_sel,
   1139  1.1      ryo 	G12_CLK_sd_emmc_c_clk0_sel,
   1140  1.1      ryo 	G12_CLK_sd_emmc_a_clk0_div,
   1141  1.1      ryo 	G12_CLK_sd_emmc_b_clk0_div,
   1142  1.1      ryo 	G12_CLK_sd_emmc_c_clk0_div,
   1143  1.1      ryo 	G12_CLK_sd_emmc_a_clk0,
   1144  1.1      ryo 	G12_CLK_sd_emmc_b_clk0,
   1145  1.1      ryo 	G12_CLK_sd_emmc_c_clk0,
   1146  1.1      ryo 	G12_CLK_ddr,
   1147  1.1      ryo 	G12_CLK_dos,
   1148  1.1      ryo 	G12_CLK_audio_locker,
   1149  1.1      ryo 	G12_CLK_mipi_dsi_host,
   1150  1.1      ryo 	G12_CLK_eth_phy,
   1151  1.1      ryo 	G12_CLK_isa,
   1152  1.1      ryo 	G12_CLK_pl301,
   1153  1.1      ryo 	G12_CLK_periphs,
   1154  1.1      ryo 	G12_CLK_spicc0,
   1155  1.1      ryo 	G12_CLK_i2c,
   1156  1.1      ryo 	G12_CLK_sana,
   1157  1.1      ryo 	G12_CLK_sd,
   1158  1.1      ryo 	G12_CLK_rng0,
   1159  1.1      ryo 	G12_CLK_uart0,
   1160  1.1      ryo 	G12_CLK_spicc1,
   1161  1.1      ryo 	G12_CLK_hiu_iface,
   1162  1.1      ryo 	G12_CLK_mipi_dsi_phy,
   1163  1.1      ryo 	G12_CLK_assist_misc,
   1164  1.1      ryo 	G12_CLK_sd_emmc_a,
   1165  1.1      ryo 	G12_CLK_sd_emmc_b,
   1166  1.1      ryo 	G12_CLK_sd_emmc_c,
   1167  1.1      ryo 	G12_CLK_audio_codec,
   1168  1.1      ryo 	G12_CLK_audio,
   1169  1.1      ryo 	G12_CLK_eth,
   1170  1.1      ryo 	G12_CLK_demux,
   1171  1.1      ryo 	G12_CLK_audio_ififo,
   1172  1.1      ryo 	G12_CLK_adc,
   1173  1.1      ryo 	G12_CLK_uart1,
   1174  1.1      ryo 	G12_CLK_g2d,
   1175  1.1      ryo 	G12_CLK_reset,
   1176  1.1      ryo 	G12_CLK_pcie_comb,
   1177  1.1      ryo 	G12_CLK_parser,
   1178  1.1      ryo 	G12_CLK_usb,
   1179  1.1      ryo 	G12_CLK_pcie_phy,
   1180  1.1      ryo 	G12_CLK_ahb_arb0,
   1181  1.1      ryo 	G12_CLK_ahb_data_bus,
   1182  1.1      ryo 	G12_CLK_ahb_ctrl_bus,
   1183  1.1      ryo 	G12_CLK_htx_hdcp22,
   1184  1.1      ryo 	G12_CLK_htx_pclk,
   1185  1.1      ryo 	G12_CLK_bt656,
   1186  1.1      ryo 	G12_CLK_usb1_ddr_bridge,
   1187  1.1      ryo 	G12_CLK_mmc_pclk,
   1188  1.1      ryo 	G12_CLK_uart2,
   1189  1.1      ryo 	G12_CLK_vpu_intr,
   1190  1.1      ryo 	G12_CLK_gic,
   1191  1.1      ryo 	G12_CLK_vclk2_venci0,
   1192  1.1      ryo 	G12_CLK_vclk2_venci1,
   1193  1.1      ryo 	G12_CLK_vclk2_vencp0,
   1194  1.1      ryo 	G12_CLK_vclk2_vencp1,
   1195  1.1      ryo 	G12_CLK_vclk2_venct0,
   1196  1.1      ryo 	G12_CLK_vclk2_venct1,
   1197  1.1      ryo 	G12_CLK_vclk2_other,
   1198  1.1      ryo 	G12_CLK_vclk2_enci,
   1199  1.1      ryo 	G12_CLK_vclk2_encp,
   1200  1.1      ryo 	G12_CLK_dac_clk,
   1201  1.1      ryo 	G12_CLK_aoclk,
   1202  1.1      ryo 	G12_CLK_iec958,
   1203  1.1      ryo 	G12_CLK_enc480p,
   1204  1.1      ryo 	G12_CLK_rng1,
   1205  1.1      ryo 	G12_CLK_vclk2_enct,
   1206  1.1      ryo 	G12_CLK_vclk2_encl,
   1207  1.1      ryo 	G12_CLK_vclk2_venclmmc,
   1208  1.1      ryo 	G12_CLK_vclk2_vencl,
   1209  1.1      ryo 	G12_CLK_vclk2_other1,
   1210  1.1      ryo 	G12_CLK_dma,
   1211  1.1      ryo 	G12_CLK_efuse,
   1212  1.1      ryo 	G12_CLK_rom_boot,
   1213  1.1      ryo 	G12_CLK_reset_sec,
   1214  1.1      ryo 	G12_CLK_sec_ahb_apb3,
   1215  1.1      ryo 	G12_CLK_cpu_clk_dyn0_sel,
   1216  1.1      ryo 	G12_CLK_cpu_clk_dyn1_sel,
   1217  1.1      ryo 	G12_CLK_cpu_clk_dyn0_div,
   1218  1.1      ryo 	G12_CLK_cpu_clk_dyn1_div,
   1219  1.1      ryo 	G12_CLK_cpu_clk_dyn0,
   1220  1.1      ryo 	G12_CLK_cpu_clk_dyn1,
   1221  1.1      ryo 	G12_CLK_cpu_clk_dyn,
   1222  1.1      ryo 	G12B_CLK_cpu_clk,
   1223  1.1      ryo 	G12_CLK_cpub_clk_dyn0_sel,
   1224  1.1      ryo 	G12_CLK_cpub_clk_dyn0_div,
   1225  1.1      ryo 	G12_CLK_cpub_clk_dyn0,
   1226  1.1      ryo 	G12_CLK_cpub_clk_dyn1_sel,
   1227  1.1      ryo 	G12_CLK_cpub_clk_dyn1_div,
   1228  1.1      ryo 	G12_CLK_cpub_clk_dyn1,
   1229  1.1      ryo 	G12_CLK_cpub_clk_dyn,
   1230  1.1      ryo 	G12_CLK_cpub_clk,
   1231  1.1      ryo 	G12_CLK_ts_div,
   1232  1.1      ryo 	G12_CLK_ts,
   1233  1.1      ryo 	G12_CLK_hdmi_pll_dco,
   1234  1.1      ryo 	G12_CLK_hdmi_pll_od,
   1235  1.1      ryo 	G12_CLK_hdmi_pll_od2,
   1236  1.1      ryo 	G12_CLK_hdmi_pll,
   1237  1.1      ryo 	G12_CLK_vid_pll_div,
   1238  1.1      ryo 	G12_CLK_vid_pll_sel,
   1239  1.1      ryo 	G12_CLK_vid_pll,
   1240  1.1      ryo 	G12_CLK_pcie_pll_dco,
   1241  1.1      ryo 	G12_CLK_pcie_pll_dco_div2,
   1242  1.1      ryo 	G12_CLK_pcie_pll_od,
   1243  1.1      ryo 	G12_CLK_pcie_pll_pll
   1244  1.1      ryo };
   1245  1.1      ryo 
   1246  1.1      ryo /*
   1247  1.1      ryo  * XXX:
   1248  1.1      ryo  * mesong12_cpuclk_get_rate() is needed because the source clock exceeds 32bit
   1249  1.1      ryo  * and sys/dev/clk cannot handle it.
   1250  1.1      ryo  * By modifying sys/dev/clk to be able to handle 64-bit clocks, this function
   1251  1.1      ryo  * will no longer be needed.
   1252  1.1      ryo  */
   1253  1.1      ryo static u_int
   1254  1.1      ryo mesong12_cpuclk_get_rate(struct meson_clk_softc *sc, struct meson_clk_clk *clk)
   1255  1.1      ryo {
   1256  1.1      ryo 	bus_size_t reg_cntl0;
   1257  1.1      ryo 	uint64_t freq;
   1258  1.1      ryo 	uint32_t val, m, n, div_shift, div;
   1259  1.1      ryo 	uint64_t xtal_clock = clk_get_rate(fdtbus_clock_byname("xtal"));
   1260  1.1      ryo 
   1261  1.1      ryo 	KASSERT(clk->type == MESON_CLK_MUX);
   1262  1.1      ryo 	if (sc->sc_clks == mesong12a_clkc_clks) {
   1263  1.1      ryo 		reg_cntl0 = HHI_SYS_PLL_CNTL0;
   1264  1.1      ryo 	} else {
   1265  1.1      ryo 		switch (clk->u.mux.reg) {
   1266  1.1      ryo 		case HHI_SYS_CPU_CLK_CNTL0:
   1267  1.1      ryo 			reg_cntl0 = HHI_SYS1_PLL_CNTL0;
   1268  1.1      ryo 			break;
   1269  1.1      ryo 		case HHI_SYS_CPUB_CLK_CNTL:
   1270  1.1      ryo 			reg_cntl0 = HHI_SYS_PLL_CNTL0;
   1271  1.1      ryo 			break;
   1272  1.1      ryo 		default:
   1273  1.1      ryo 			panic("%s: illegal clk table\n", __func__);
   1274  1.1      ryo 		}
   1275  1.1      ryo 	}
   1276  1.1      ryo 	CLK_LOCK(sc);
   1277  1.1      ryo 
   1278  1.1      ryo 	if ((CLK_READ(sc, clk->u.mux.reg) & __BIT(11)) == 0) {
   1279  1.1      ryo 		CLK_UNLOCK(sc);
   1280  1.1      ryo 
   1281  1.1      ryo 		/* use dyn clock instead of sys1?_pll */
   1282  1.1      ryo 		struct clk *clkp;
   1283  1.1      ryo 
   1284  1.1      ryo 		switch (clk->u.mux.reg) {
   1285  1.1      ryo 		case HHI_SYS_CPU_CLK_CNTL0:
   1286  1.1      ryo 			clkp = (struct clk *)meson_clk_clock_find(sc,
   1287  1.1      ryo 			    "cpu_clk_dyn");
   1288  1.1      ryo 			freq = clk_get_rate(clkp);
   1289  1.1      ryo 			break;
   1290  1.1      ryo 		case HHI_SYS_CPUB_CLK_CNTL:
   1291  1.1      ryo 			clkp = (struct clk *)meson_clk_clock_find(sc,
   1292  1.1      ryo 			    "cpub_clk_dyn");
   1293  1.1      ryo 			freq = clk_get_rate(clkp);
   1294  1.1      ryo 			break;
   1295  1.1      ryo 		default:
   1296  1.1      ryo 			freq = 0;
   1297  1.1      ryo 			break;
   1298  1.1      ryo 		}
   1299  1.1      ryo 		return freq;
   1300  1.1      ryo 	}
   1301  1.1      ryo 	val = CLK_READ(sc, reg_cntl0);
   1302  1.1      ryo 	m = __SHIFTOUT(val, __BITS(7,0));
   1303  1.1      ryo 	n = __SHIFTOUT(val, __BITS(14,10));
   1304  1.1      ryo 	div_shift = __SHIFTOUT(val, __BITS(18,16));
   1305  1.1      ryo 	div = 1 << div_shift;
   1306  1.1      ryo 	CLK_UNLOCK(sc);
   1307  1.1      ryo 
   1308  1.1      ryo 	freq = xtal_clock * m / n / div;
   1309  1.1      ryo 	return freq;
   1310  1.1      ryo }
   1311  1.1      ryo 
   1312  1.1      ryo static int
   1313  1.1      ryo mesong12_cpuclk_set_rate(struct meson_clk_softc *sc, struct meson_clk_clk *clk,
   1314  1.1      ryo     u_int rate)
   1315  1.1      ryo {
   1316  1.1      ryo 	bus_size_t reg_cntl0;
   1317  1.1      ryo 	uint32_t val;
   1318  1.1      ryo 	uint64_t xtal_clock = clk_get_rate(fdtbus_clock_byname("xtal"));
   1319  1.1      ryo 	int new_m, new_n, new_div, i, error;
   1320  1.1      ryo 
   1321  1.1      ryo 	KASSERT(clk->type == MESON_CLK_MUX);
   1322  1.1      ryo 	if (sc->sc_clks == mesong12a_clkc_clks) {
   1323  1.1      ryo 		reg_cntl0 = HHI_SYS_PLL_CNTL0;
   1324  1.1      ryo 	} else {
   1325  1.1      ryo 		switch (clk->u.mux.reg) {
   1326  1.1      ryo 		case HHI_SYS_CPU_CLK_CNTL0:
   1327  1.1      ryo 			reg_cntl0 = HHI_SYS1_PLL_CNTL0;
   1328  1.1      ryo 			break;
   1329  1.1      ryo 		case HHI_SYS_CPUB_CLK_CNTL:
   1330  1.1      ryo 			reg_cntl0 = HHI_SYS_PLL_CNTL0;
   1331  1.1      ryo 			break;
   1332  1.1      ryo 		default:
   1333  1.1      ryo 			panic("%s: illegal clk table\n", __func__);
   1334  1.1      ryo 		}
   1335  1.1      ryo 	}
   1336  1.1      ryo 
   1337  1.1      ryo 	new_div = 7;
   1338  1.1      ryo 	new_n = 1;
   1339  1.1      ryo 	new_m = (uint64_t)rate * (1 << new_div) / xtal_clock;
   1340  1.1      ryo 	while (new_m >= 250 && (new_div > 0)) {
   1341  1.1      ryo 		new_div--;
   1342  1.1      ryo 		new_m /= 2;
   1343  1.1      ryo 	}
   1344  1.1      ryo 
   1345  1.1      ryo 	if (new_m >= 256)
   1346  1.1      ryo 		return EINVAL;
   1347  1.1      ryo 
   1348  1.1      ryo 	CLK_LOCK(sc);
   1349  1.1      ryo 
   1350  1.1      ryo 	/* use cpub?_clk_dyn temporary */
   1351  1.1      ryo 	val = CLK_READ(sc, clk->u.mux.reg);
   1352  1.1      ryo 	CLK_WRITE(sc, clk->u.mux.reg, val & ~__BIT(11));
   1353  1.1      ryo 	DELAY(100);
   1354  1.1      ryo 
   1355  1.1      ryo #define MESON_PLL_CNTL_REG_LOCK	__BIT(31)
   1356  1.1      ryo #define MESON_PLL_CNTL_REG_RST	__BIT(29)
   1357  1.1      ryo #define MESON_PLL_CNTL_REG_EN	__BIT(28)
   1358  1.1      ryo 	/* disable */
   1359  1.1      ryo 	val = CLK_READ(sc, reg_cntl0);
   1360  1.1      ryo 	CLK_WRITE(sc, reg_cntl0, val | MESON_PLL_CNTL_REG_RST);
   1361  1.1      ryo 	val = CLK_READ(sc, reg_cntl0);
   1362  1.1      ryo 	CLK_WRITE(sc, reg_cntl0, val & ~MESON_PLL_CNTL_REG_EN);
   1363  1.1      ryo 
   1364  1.1      ryo 	/* HHI_SYS{,1}_PLL_CNTL{1,2,3,4,5} */
   1365  1.1      ryo 	CLK_WRITE(sc, reg_cntl0 + CBUS_REG(1), 0x00000000);
   1366  1.1      ryo 	CLK_WRITE(sc, reg_cntl0 + CBUS_REG(2), 0x00000000);
   1367  1.1      ryo 	CLK_WRITE(sc, reg_cntl0 + CBUS_REG(3), 0x48681c00);
   1368  1.1      ryo 	CLK_WRITE(sc, reg_cntl0 + CBUS_REG(4), 0x88770290);
   1369  1.1      ryo 	CLK_WRITE(sc, reg_cntl0 + CBUS_REG(5), 0x39272000);
   1370  1.1      ryo 	DELAY(100);
   1371  1.1      ryo 
   1372  1.1      ryo 	/* write new M, N, and DIV */
   1373  1.1      ryo 	val = CLK_READ(sc, reg_cntl0);
   1374  1.1      ryo 	val &= ~__BITS(7,0);
   1375  1.1      ryo 	val |= __SHIFTIN(new_m, __BITS(7,0));
   1376  1.1      ryo 	val &= ~__BITS(14,10);
   1377  1.1      ryo 	val |= __SHIFTIN(new_n, __BITS(14,10));
   1378  1.1      ryo 	val &= ~__BITS(18,16);
   1379  1.1      ryo 	val |= __SHIFTIN(new_div, __BITS(18,16));
   1380  1.1      ryo 	CLK_WRITE(sc, reg_cntl0, val);
   1381  1.1      ryo 
   1382  1.1      ryo 	/* enable */
   1383  1.1      ryo 	val = CLK_READ(sc, reg_cntl0);
   1384  1.1      ryo 	CLK_WRITE(sc, reg_cntl0, val | MESON_PLL_CNTL_REG_RST);
   1385  1.1      ryo 	val = CLK_READ(sc, reg_cntl0);
   1386  1.1      ryo 	CLK_WRITE(sc, reg_cntl0, val | MESON_PLL_CNTL_REG_EN);
   1387  1.1      ryo 	DELAY(1000);
   1388  1.1      ryo 	val = CLK_READ(sc, reg_cntl0);
   1389  1.1      ryo 	CLK_WRITE(sc, reg_cntl0, val & ~MESON_PLL_CNTL_REG_RST);
   1390  1.1      ryo 
   1391  1.1      ryo 	error = ETIMEDOUT;
   1392  1.1      ryo 	for (i = 24000000; i > 0; i--) {
   1393  1.1      ryo 		if ((CLK_READ(sc, reg_cntl0) & MESON_PLL_CNTL_REG_LOCK) != 0) {
   1394  1.1      ryo 			error = 0;
   1395  1.1      ryo 			break;
   1396  1.1      ryo 		}
   1397  1.1      ryo 	}
   1398  1.1      ryo 
   1399  1.1      ryo 	/* XXX: always use sys1?_pll. cpub?_clk_dyn should be used for <1GHz */
   1400  1.1      ryo 	val = CLK_READ(sc, clk->u.mux.reg);
   1401  1.1      ryo 	CLK_WRITE(sc, clk->u.mux.reg, val | __BIT(11));
   1402  1.1      ryo 	DELAY(100);
   1403  1.1      ryo 
   1404  1.1      ryo 	CLK_UNLOCK(sc);
   1405  1.1      ryo 
   1406  1.1      ryo 	return error;
   1407  1.1      ryo }
   1408  1.1      ryo 
   1409  1.1      ryo static int
   1410  1.1      ryo mesong12_clk_pcie_pll_set_rate(struct meson_clk_softc *sc,
   1411  1.1      ryo     struct meson_clk_clk *clk, u_int new_rate)
   1412  1.1      ryo {
   1413  1.1      ryo 	struct meson_clk_pll *pll = &clk->u.pll;
   1414  1.1      ryo 
   1415  1.1      ryo 	KASSERT(clk->type == MESON_CLK_PLL);
   1416  1.1      ryo 
   1417  1.1      ryo 	/*
   1418  1.1      ryo 	 * A strict register sequence is required to set the PLL to the
   1419  1.1      ryo 	 * fine-tuned 100MHz for PCIe
   1420  1.1      ryo 	 */
   1421  1.1      ryo 	if (new_rate == (100000000 * 2 * 2)) { /* "2*2" is fixed factor */
   1422  1.1      ryo 		uint32_t cntl0, cntl4, cntl3, cntl5;
   1423  1.1      ryo 
   1424  1.1      ryo 		cntl0 = __SHIFTIN(9, HHI_PCIE_PLL_CNTL0_PCIE_APLL_OD) |
   1425  1.1      ryo 		    __SHIFTIN(1, HHI_PCIE_PLL_CNTL0_PCIE_APLL_PREDIV_SEL) |
   1426  1.1      ryo 		    __SHIFTIN(150, HHI_PCIE_PLL_CNTL0_PCIE_APLL_FBKDIV);
   1427  1.1      ryo 		cntl4 =  __SHIFTIN(1, HHI_PCIE_PLL_CNTL4_PCIE_APLL_LPF_CAPADJ) |
   1428  1.1      ryo 		    HHI_PCIE_PLL_CNTL4_PCIE_APLL_LOAD |
   1429  1.1      ryo 		    HHI_PCIE_PLL_CNTL4_PCIE_APLL_LOAD_EN;
   1430  1.1      ryo 		cntl3 = __SHIFTIN(1, HHI_PCIE_PLL_CNTL3_PCIE_APLL_AFC_HOLD_T) |
   1431  1.1      ryo 		    __SHIFTIN(2, HHI_PCIE_PLL_CNTL3_PCIE_APLL_AFC_DIV) |
   1432  1.1      ryo 		    HHI_PCIE_PLL_CNTL3_PCIE_APLL_BIAS_LPF_EN |
   1433  1.1      ryo 		    __SHIFTIN(8, HHI_PCIE_PLL_CNTL3_PCIE_APLL_CP_ICAP) |
   1434  1.1      ryo 		    __SHIFTIN(14, HHI_PCIE_PLL_CNTL3_PCIE_APLL_CP_IRES);
   1435  1.1      ryo 		cntl5 = __SHIFTIN(6, HHI_PCIE_PLL_CNTL5_PCIE_HCSL_ADJ_LDO) |
   1436  1.1      ryo 		    HHI_PCIE_PLL_CNTL5_PCIE_HCSL_BGP_EN |
   1437  1.1      ryo 		    HHI_PCIE_PLL_CNTL5_PCIE_HCSL_CAL_EN |
   1438  1.1      ryo 		    HHI_PCIE_PLL_CNTL5_PCIE_HCSL_EN0;
   1439  1.1      ryo 
   1440  1.1      ryo 		CLK_LOCK(sc);
   1441  1.1      ryo 		CLK_WRITE_BITS(sc, pll->reset.reg, pll->reset.mask, 1);
   1442  1.1      ryo 		CLK_WRITE(sc, HHI_PCIE_PLL_CNTL0, cntl0 |
   1443  1.1      ryo 		    HHI_PCIE_PLL_CNTL0_PCIE_APLL_RESET);
   1444  1.1      ryo 		CLK_WRITE(sc, HHI_PCIE_PLL_CNTL0, cntl0 |
   1445  1.1      ryo 		    HHI_PCIE_PLL_CNTL0_PCIE_APLL_RESET |
   1446  1.1      ryo 		    HHI_PCIE_PLL_CNTL0_PCIE_APLL_EN);
   1447  1.1      ryo 		CLK_WRITE(sc, HHI_PCIE_PLL_CNTL1, 0);
   1448  1.1      ryo 		CLK_WRITE(sc, HHI_PCIE_PLL_CNTL2,
   1449  1.1      ryo 		    __SHIFTIN(0x1100, HHI_PCIE_PLL_CNTL2_PCIE_APLL_RESERVE));
   1450  1.1      ryo 		CLK_WRITE(sc, HHI_PCIE_PLL_CNTL3, cntl3);
   1451  1.1      ryo 		CLK_WRITE(sc, HHI_PCIE_PLL_CNTL4, cntl4);
   1452  1.1      ryo 		delay(20);
   1453  1.1      ryo 		CLK_WRITE(sc, HHI_PCIE_PLL_CNTL5, cntl5);
   1454  1.1      ryo 		delay(10);
   1455  1.1      ryo 		CLK_WRITE(sc, HHI_PCIE_PLL_CNTL5, cntl5 |
   1456  1.1      ryo 		    HHI_PCIE_PLL_CNTL5_PCIE_HCSL_CAL_RSTN);
   1457  1.1      ryo 		CLK_WRITE(sc, HHI_PCIE_PLL_CNTL4, cntl4 |
   1458  1.1      ryo 		    HHI_PCIE_PLL_CNTL4_PCIE_APLL_VCTRL_MON_EN);
   1459  1.1      ryo 		delay(10);
   1460  1.1      ryo 		CLK_WRITE(sc, HHI_PCIE_PLL_CNTL0, cntl0 |
   1461  1.1      ryo 		    HHI_PCIE_PLL_CNTL0_PCIE_APLL_RESET |
   1462  1.1      ryo 		    HHI_PCIE_PLL_CNTL0_PCIE_APLL_EN |
   1463  1.1      ryo 		    HHI_PCIE_PLL_CNTL0_PCIE_APLL_AFC_START);
   1464  1.1      ryo 		CLK_WRITE(sc, HHI_PCIE_PLL_CNTL0, cntl0 |
   1465  1.1      ryo 		    HHI_PCIE_PLL_CNTL0_PCIE_APLL_EN |
   1466  1.1      ryo 		    HHI_PCIE_PLL_CNTL0_PCIE_APLL_AFC_START);
   1467  1.1      ryo 		CLK_WRITE(sc, HHI_PCIE_PLL_CNTL2,
   1468  1.1      ryo 		    __SHIFTIN(0x1000, HHI_PCIE_PLL_CNTL2_PCIE_APLL_RESERVE));
   1469  1.1      ryo 
   1470  1.1      ryo 		CLK_WRITE_BITS(sc, pll->reset.reg, pll->reset.mask, 0);
   1471  1.1      ryo 		/* XXX: pll_wait_lock() sometimes times out? but ignore it */
   1472  1.1      ryo 		meson_clk_pll_wait_lock(sc, pll);
   1473  1.1      ryo 		CLK_UNLOCK(sc);
   1474  1.1      ryo 		return 0;
   1475  1.1      ryo 	}
   1476  1.1      ryo 
   1477  1.1      ryo 	return meson_clk_pll_set_rate(sc, clk, new_rate);
   1478  1.1      ryo }
   1479  1.1      ryo 
   1480  1.1      ryo static const struct mesong12_clkc_config g12a_config = {
   1481  1.1      ryo 	.name = "Meson G12A",
   1482  1.1      ryo 	.clks = mesong12a_clkc_clks,
   1483  1.1      ryo 	.nclks = __arraycount(mesong12a_clkc_clks),
   1484  1.1      ryo };
   1485  1.1      ryo 
   1486  1.1      ryo static const struct mesong12_clkc_config g12b_config = {
   1487  1.1      ryo 	.name = "Meson G12B",
   1488  1.1      ryo 	.clks = mesong12b_clkc_clks,
   1489  1.1      ryo 	.nclks = __arraycount(mesong12b_clkc_clks),
   1490  1.1      ryo };
   1491  1.1      ryo 
   1492  1.2  thorpej static const struct device_compatible_entry compat_data[] = {
   1493  1.2  thorpej 	{ .compat = "amlogic,g12a-clkc",	.data = &g12a_config },
   1494  1.2  thorpej 	{ .compat = "amlogic,g12b-clkc",	.data = &g12b_config },
   1495  1.2  thorpej 
   1496  1.2  thorpej 	{ 0 }
   1497  1.1      ryo };
   1498  1.1      ryo 
   1499  1.1      ryo CFATTACH_DECL_NEW(mesong12_clkc, sizeof(struct meson_clk_softc),
   1500  1.1      ryo     mesong12_clkc_match, mesong12_clkc_attach, NULL, NULL);
   1501  1.1      ryo 
   1502  1.1      ryo static int
   1503  1.1      ryo mesong12_clkc_match(device_t parent, cfdata_t cf, void *aux)
   1504  1.1      ryo {
   1505  1.1      ryo 	struct fdt_attach_args * const faa = aux;
   1506  1.1      ryo 
   1507  1.1      ryo 	return of_match_compat_data(faa->faa_phandle, compat_data);
   1508  1.1      ryo }
   1509  1.1      ryo 
   1510  1.1      ryo static void
   1511  1.1      ryo mesong12_clkc_attach(device_t parent, device_t self, void *aux)
   1512  1.1      ryo {
   1513  1.1      ryo 	struct meson_clk_softc * const sc = device_private(self);
   1514  1.1      ryo 	struct fdt_attach_args * const faa = aux;
   1515  1.1      ryo 	const struct mesong12_clkc_config *conf;
   1516  1.1      ryo 	const int phandle = faa->faa_phandle;
   1517  1.1      ryo 
   1518  1.1      ryo 	sc->sc_dev = self;
   1519  1.1      ryo 	sc->sc_phandle = faa->faa_phandle;
   1520  1.1      ryo 	sc->sc_syscon = fdtbus_syscon_lookup(OF_parent(sc->sc_phandle));
   1521  1.1      ryo 	if (sc->sc_syscon == NULL) {
   1522  1.1      ryo 		aprint_error(": couldn't get syscon registers\n");
   1523  1.1      ryo 		return;
   1524  1.1      ryo 	}
   1525  1.1      ryo 
   1526  1.2  thorpej 	conf = of_search_compatible(phandle, compat_data)->data;
   1527  1.1      ryo 	sc->sc_clks = conf->clks;
   1528  1.1      ryo 	sc->sc_nclks = conf->nclks;
   1529  1.1      ryo 
   1530  1.1      ryo 	aprint_naive("\n");
   1531  1.1      ryo 	aprint_normal(": %s clock controller\n", conf->name);
   1532  1.1      ryo 
   1533  1.1      ryo 	meson_clk_attach(sc);
   1534  1.1      ryo 	meson_clk_print(sc);
   1535  1.1      ryo }
   1536