xref: /linux/drivers/clk/meson/a9-peripherals.c (revision 502d45774af09f1c681c754c4b7cdfb5d7f72fd9)
1*6f809ca8SJian Hu // SPDX-License-Identifier: (GPL-2.0-only OR MIT)
2*6f809ca8SJian Hu /*
3*6f809ca8SJian Hu  * Copyright (C) 2026 Amlogic, Inc. All rights reserved
4*6f809ca8SJian Hu  */
5*6f809ca8SJian Hu 
6*6f809ca8SJian Hu #include <dt-bindings/clock/amlogic,a9-peripherals-clkc.h>
7*6f809ca8SJian Hu #include <linux/clk-provider.h>
8*6f809ca8SJian Hu #include <linux/module.h>
9*6f809ca8SJian Hu #include <linux/platform_device.h>
10*6f809ca8SJian Hu #include "clk-regmap.h"
11*6f809ca8SJian Hu #include "clk-dualdiv.h"
12*6f809ca8SJian Hu #include "meson-clkc-utils.h"
13*6f809ca8SJian Hu #include "vid-pll-div.h"
14*6f809ca8SJian Hu 
15*6f809ca8SJian Hu #define SYS_CLK_EN0_REG0			0x30
16*6f809ca8SJian Hu #define SYS_CLK_EN0_REG1			0x34
17*6f809ca8SJian Hu #define SYS_CLK_EN0_REG2			0x38
18*6f809ca8SJian Hu #define SYS_CLK_EN0_REG3			0x3c
19*6f809ca8SJian Hu #define SD_EMMC_CLK_CTRL0			0x90
20*6f809ca8SJian Hu #define SD_EMMC_CLK_CTRL1			0x94
21*6f809ca8SJian Hu #define PWM_CLK_H_CTRL				0xbc
22*6f809ca8SJian Hu #define PWM_CLK_I_CTRL				0xc0
23*6f809ca8SJian Hu #define PWM_CLK_J_CTRL				0xc4
24*6f809ca8SJian Hu #define PWM_CLK_K_CTRL				0xc8
25*6f809ca8SJian Hu #define PWM_CLK_L_CTRL				0xcc
26*6f809ca8SJian Hu #define PWM_CLK_M_CTRL				0xd0
27*6f809ca8SJian Hu #define PWM_CLK_N_CTRL				0xd4
28*6f809ca8SJian Hu #define SPISG_CLK_CTRL				0x100
29*6f809ca8SJian Hu #define SPISG_CLK_CTRL1				0x104
30*6f809ca8SJian Hu #define SAR_CLK_CTRL				0x150
31*6f809ca8SJian Hu #define AMFC_CLK_CTRL				0x154
32*6f809ca8SJian Hu #define NNA_CLK_CTRL				0x15c
33*6f809ca8SJian Hu #define USB_CLK_CTRL				0x160
34*6f809ca8SJian Hu #define PCIE_TL_CLK_CTRL			0x164
35*6f809ca8SJian Hu #define CMPR_CLK_CTRL				0x168
36*6f809ca8SJian Hu #define DEWARP_CLK_CTRL				0x16c
37*6f809ca8SJian Hu #define SC_CLK_CTRL				0x170
38*6f809ca8SJian Hu #define DPTX_CLK_CTRL				0x178
39*6f809ca8SJian Hu #define ISP_CLK_CTRL				0x17c
40*6f809ca8SJian Hu #define CVE_CLK_CTRL				0x180
41*6f809ca8SJian Hu #define PP_CLK_CTRL				0x184
42*6f809ca8SJian Hu #define GLB_CLK_CTRL				0x188
43*6f809ca8SJian Hu #define USB_CLK_CTRL0				0x18c
44*6f809ca8SJian Hu #define USB_CLK_CTRL1				0x190
45*6f809ca8SJian Hu #define CAN_CLK_CTRL				0x194
46*6f809ca8SJian Hu #define CAN_CLK_CTRL1				0x198
47*6f809ca8SJian Hu #define I3C_CLK_CTRL				0x19c
48*6f809ca8SJian Hu #define TS_CLK_CTRL				0x1a0
49*6f809ca8SJian Hu #define ETH_CLK_CTRL				0x1a4
50*6f809ca8SJian Hu #define GEN_CLK_CTRL				0x1a8
51*6f809ca8SJian Hu #define CLK12_24_CTRL				0x1ac
52*6f809ca8SJian Hu #define MALI_CLK_CTRL				0x200
53*6f809ca8SJian Hu #define MALI_STACK_CLK_CTRL			0x204
54*6f809ca8SJian Hu #define DSPA_CLK_CTRL				0x220
55*6f809ca8SJian Hu #define HEVCF_CLK_CTRL				0x240
56*6f809ca8SJian Hu #define HCODEC_CLK_CTRL				0x244
57*6f809ca8SJian Hu #define VPU_CLK_CTRL				0x260
58*6f809ca8SJian Hu #define VAPB_CLK_CTRL				0x268
59*6f809ca8SJian Hu #define VPU_CLKB_CTRL				0x280
60*6f809ca8SJian Hu #define HDMI_CLK_CTRL				0x284
61*6f809ca8SJian Hu #define HTX_CLK_CTRL				0x28c
62*6f809ca8SJian Hu #define HTX_CLK_CTRL1				0x290
63*6f809ca8SJian Hu #define HRX_CLK_CTRL				0x294
64*6f809ca8SJian Hu #define HRX_CLK_CTRL1				0x298
65*6f809ca8SJian Hu #define HRX_CLK_CTRL2				0x29c
66*6f809ca8SJian Hu #define HRX_CLK_CTRL3				0x2a0
67*6f809ca8SJian Hu #define VID_LOCK_CLK_CTRL			0x2a4
68*6f809ca8SJian Hu #define VDIN_MEAS_CLK_CTRL			0x2a8
69*6f809ca8SJian Hu #define VID_PLL_CLK_DIV				0x2b0
70*6f809ca8SJian Hu #define VID_CLK_CTRL				0x2c0
71*6f809ca8SJian Hu #define VID_CLK_CTRL2				0x2c4
72*6f809ca8SJian Hu #define VID_CLK_DIV				0x2c8
73*6f809ca8SJian Hu #define VIID_CLK_DIV				0x2cc
74*6f809ca8SJian Hu #define VIID_CLK_CTRL				0x2d0
75*6f809ca8SJian Hu #define MIPI_CSI_PHY_CLK_CTRL			0x2e0
76*6f809ca8SJian Hu #define DSI_MEAS_CLK_CTRL			0x2f4
77*6f809ca8SJian Hu 
78*6f809ca8SJian Hu #define A9_COMP_SEL(_name, _reg, _shift, _mask, _pdata, _table) \
79*6f809ca8SJian Hu 	MESON_COMP_SEL(a9_, _name, _reg, _shift, _mask, _pdata, _table, 0, 0)
80*6f809ca8SJian Hu 
81*6f809ca8SJian Hu #define A9_COMP_DIV(_name, _reg, _shift, _width) \
82*6f809ca8SJian Hu 	MESON_COMP_DIV(a9_, _name, _reg, _shift, _width, 0, CLK_SET_RATE_PARENT)
83*6f809ca8SJian Hu 
84*6f809ca8SJian Hu #define A9_COMP_GATE(_name, _reg, _bit, _iflags) \
85*6f809ca8SJian Hu 	MESON_COMP_GATE(a9_, _name, _reg, _bit, CLK_SET_RATE_PARENT | (_iflags))
86*6f809ca8SJian Hu 
87*6f809ca8SJian Hu static const struct clk_parent_data a9_sys_pclk_parents = { .fw_name = "sys" };
88*6f809ca8SJian Hu 
89*6f809ca8SJian Hu #define A9_SYS_PCLK(_name, _reg, _bit) \
90*6f809ca8SJian Hu 	MESON_PCLK(a9_##_name, _reg, _bit, &a9_sys_pclk_parents, 0)
91*6f809ca8SJian Hu 
92*6f809ca8SJian Hu static A9_SYS_PCLK(sys_am_axi,		SYS_CLK_EN0_REG0, 0);
93*6f809ca8SJian Hu static A9_SYS_PCLK(sys_dos,		SYS_CLK_EN0_REG0, 1);
94*6f809ca8SJian Hu static A9_SYS_PCLK(sys_mipi_dsi0,	SYS_CLK_EN0_REG0, 3);
95*6f809ca8SJian Hu static A9_SYS_PCLK(sys_eth_phy,		SYS_CLK_EN0_REG0, 4);
96*6f809ca8SJian Hu static A9_SYS_PCLK(sys_amfc,		SYS_CLK_EN0_REG0, 5);
97*6f809ca8SJian Hu static A9_SYS_PCLK(sys_mali,		SYS_CLK_EN0_REG0, 6);
98*6f809ca8SJian Hu static A9_SYS_PCLK(sys_nna,		SYS_CLK_EN0_REG0, 7);
99*6f809ca8SJian Hu static A9_SYS_PCLK(sys_eth_axi,		SYS_CLK_EN0_REG0, 8);
100*6f809ca8SJian Hu static A9_SYS_PCLK(sys_dp_apb,		SYS_CLK_EN0_REG0, 9);
101*6f809ca8SJian Hu static A9_SYS_PCLK(sys_edptx_apb,	SYS_CLK_EN0_REG0, 10);
102*6f809ca8SJian Hu static A9_SYS_PCLK(sys_u3hsg,		SYS_CLK_EN0_REG0, 11);
103*6f809ca8SJian Hu static A9_SYS_PCLK(sys_aucpu,		SYS_CLK_EN0_REG0, 14);
104*6f809ca8SJian Hu static A9_SYS_PCLK(sys_glb,		SYS_CLK_EN0_REG0, 15);
105*6f809ca8SJian Hu static A9_SYS_PCLK(sys_combo_dphy_apb,	SYS_CLK_EN0_REG0, 17);
106*6f809ca8SJian Hu static A9_SYS_PCLK(sys_hdmirx_apb,	SYS_CLK_EN0_REG0, 18);
107*6f809ca8SJian Hu static A9_SYS_PCLK(sys_hdmirx_pclk,	SYS_CLK_EN0_REG0, 19);
108*6f809ca8SJian Hu static A9_SYS_PCLK(sys_mipi_dsi0_phy,	SYS_CLK_EN0_REG0, 20);
109*6f809ca8SJian Hu static A9_SYS_PCLK(sys_can0,		SYS_CLK_EN0_REG0, 21);
110*6f809ca8SJian Hu static A9_SYS_PCLK(sys_can1,		SYS_CLK_EN0_REG0, 22);
111*6f809ca8SJian Hu static A9_SYS_PCLK(sys_sd_emmc_a,	SYS_CLK_EN0_REG0, 24);
112*6f809ca8SJian Hu static A9_SYS_PCLK(sys_sd_emmc_b,	SYS_CLK_EN0_REG0, 25);
113*6f809ca8SJian Hu static A9_SYS_PCLK(sys_sd_emmc_c,	SYS_CLK_EN0_REG0, 26);
114*6f809ca8SJian Hu static A9_SYS_PCLK(sys_sc,		SYS_CLK_EN0_REG0, 27);
115*6f809ca8SJian Hu static A9_SYS_PCLK(sys_acodec,		SYS_CLK_EN0_REG0, 28);
116*6f809ca8SJian Hu static A9_SYS_PCLK(sys_mipi_isp,	SYS_CLK_EN0_REG0, 29);
117*6f809ca8SJian Hu static A9_SYS_PCLK(sys_msr,		SYS_CLK_EN0_REG0, 30);
118*6f809ca8SJian Hu static A9_SYS_PCLK(sys_audio,		SYS_CLK_EN0_REG1, 0);
119*6f809ca8SJian Hu static A9_SYS_PCLK(sys_mipi_dsi1,	SYS_CLK_EN0_REG1, 1);
120*6f809ca8SJian Hu static A9_SYS_PCLK(sys_mipi_dsi1_phy,	SYS_CLK_EN0_REG1, 2);
121*6f809ca8SJian Hu static A9_SYS_PCLK(sys_eth,		SYS_CLK_EN0_REG1, 3);
122*6f809ca8SJian Hu static A9_SYS_PCLK(sys_eth_1g_mac,	SYS_CLK_EN0_REG1, 4);
123*6f809ca8SJian Hu static A9_SYS_PCLK(sys_uart_a,		SYS_CLK_EN0_REG1, 5);
124*6f809ca8SJian Hu static A9_SYS_PCLK(sys_uart_f,		SYS_CLK_EN0_REG1, 10);
125*6f809ca8SJian Hu static A9_SYS_PCLK(sys_ts_a55,		SYS_CLK_EN0_REG1, 11);
126*6f809ca8SJian Hu static A9_SYS_PCLK(sys_eth_1g_axi,	SYS_CLK_EN0_REG1, 12);
127*6f809ca8SJian Hu static A9_SYS_PCLK(sys_ts_dos,		SYS_CLK_EN0_REG1, 13);
128*6f809ca8SJian Hu static A9_SYS_PCLK(sys_u3drd_b,		SYS_CLK_EN0_REG1, 14);
129*6f809ca8SJian Hu static A9_SYS_PCLK(sys_ts_core,		SYS_CLK_EN0_REG1, 15);
130*6f809ca8SJian Hu static A9_SYS_PCLK(sys_ts_pll,		SYS_CLK_EN0_REG1, 16);
131*6f809ca8SJian Hu static A9_SYS_PCLK(sys_csi_dig_clkin,	SYS_CLK_EN0_REG1, 18);
132*6f809ca8SJian Hu static A9_SYS_PCLK(sys_cve,		SYS_CLK_EN0_REG1, 19);
133*6f809ca8SJian Hu static A9_SYS_PCLK(sys_ge2d,		SYS_CLK_EN0_REG1, 20);
134*6f809ca8SJian Hu static A9_SYS_PCLK(sys_spisg,		SYS_CLK_EN0_REG1, 21);
135*6f809ca8SJian Hu static A9_SYS_PCLK(sys_u2h,		SYS_CLK_EN0_REG1, 23);
136*6f809ca8SJian Hu static A9_SYS_PCLK(sys_pcie_mac_a,	SYS_CLK_EN0_REG1, 24);
137*6f809ca8SJian Hu static A9_SYS_PCLK(sys_u3drd_a,		SYS_CLK_EN0_REG1, 25);
138*6f809ca8SJian Hu static A9_SYS_PCLK(sys_u2drd,		SYS_CLK_EN0_REG1, 26);
139*6f809ca8SJian Hu static A9_SYS_PCLK(sys_pcie_phy,	SYS_CLK_EN0_REG1, 27);
140*6f809ca8SJian Hu static A9_SYS_PCLK(sys_pcie_mac_b,	SYS_CLK_EN0_REG1, 28);
141*6f809ca8SJian Hu static A9_SYS_PCLK(sys_periph,		SYS_CLK_EN0_REG1, 29);
142*6f809ca8SJian Hu static A9_SYS_PCLK(sys_pio,		SYS_CLK_EN0_REG2, 0);
143*6f809ca8SJian Hu static A9_SYS_PCLK(sys_i3c,		SYS_CLK_EN0_REG2, 1);
144*6f809ca8SJian Hu static A9_SYS_PCLK(sys_i2c_m_e,		SYS_CLK_EN0_REG2, 2);
145*6f809ca8SJian Hu static A9_SYS_PCLK(sys_i2c_m_f,		SYS_CLK_EN0_REG2, 3);
146*6f809ca8SJian Hu static A9_SYS_PCLK(sys_hdmitx_apb,	SYS_CLK_EN0_REG2, 4);
147*6f809ca8SJian Hu static A9_SYS_PCLK(sys_i2c_m_i,		SYS_CLK_EN0_REG2, 5);
148*6f809ca8SJian Hu static A9_SYS_PCLK(sys_i2c_m_g,		SYS_CLK_EN0_REG2, 6);
149*6f809ca8SJian Hu static A9_SYS_PCLK(sys_i2c_m_h,		SYS_CLK_EN0_REG2, 7);
150*6f809ca8SJian Hu static A9_SYS_PCLK(sys_hdmi20_aes,	SYS_CLK_EN0_REG2, 9);
151*6f809ca8SJian Hu static A9_SYS_PCLK(sys_csi2_host,	SYS_CLK_EN0_REG2, 16);
152*6f809ca8SJian Hu static A9_SYS_PCLK(sys_csi2_adapt,	SYS_CLK_EN0_REG2, 17);
153*6f809ca8SJian Hu static A9_SYS_PCLK(sys_dspa,		SYS_CLK_EN0_REG2, 21);
154*6f809ca8SJian Hu static A9_SYS_PCLK(sys_pp_dma,		SYS_CLK_EN0_REG2, 22);
155*6f809ca8SJian Hu static A9_SYS_PCLK(sys_pp_wrapper,	SYS_CLK_EN0_REG2, 23);
156*6f809ca8SJian Hu static A9_SYS_PCLK(sys_vpu_intr,	SYS_CLK_EN0_REG2, 25);
157*6f809ca8SJian Hu static A9_SYS_PCLK(sys_csi2_phy,	SYS_CLK_EN0_REG2, 27);
158*6f809ca8SJian Hu static A9_SYS_PCLK(sys_saradc,		SYS_CLK_EN0_REG2, 28);
159*6f809ca8SJian Hu static A9_SYS_PCLK(sys_pwm_j,		SYS_CLK_EN0_REG2, 30);
160*6f809ca8SJian Hu static A9_SYS_PCLK(sys_pwm_i,		SYS_CLK_EN0_REG2, 31);
161*6f809ca8SJian Hu static A9_SYS_PCLK(sys_pwm_h,		SYS_CLK_EN0_REG3, 0);
162*6f809ca8SJian Hu static A9_SYS_PCLK(sys_pwm_n,		SYS_CLK_EN0_REG3, 8);
163*6f809ca8SJian Hu static A9_SYS_PCLK(sys_pwm_m,		SYS_CLK_EN0_REG3, 9);
164*6f809ca8SJian Hu static A9_SYS_PCLK(sys_pwm_l,		SYS_CLK_EN0_REG3, 10);
165*6f809ca8SJian Hu static A9_SYS_PCLK(sys_pwm_k,		SYS_CLK_EN0_REG3, 11);
166*6f809ca8SJian Hu 
167*6f809ca8SJian Hu /* Channel 5 is unconnected. */
168*6f809ca8SJian Hu static u32 a9_sd_emmc_parents_val_table[] = { 0, 1, 2, 3, 4, 6, 7 };
169*6f809ca8SJian Hu static const struct clk_parent_data a9_sd_emmc_parents[] = {
170*6f809ca8SJian Hu 	{ .fw_name = "xtal", },
171*6f809ca8SJian Hu 	{ .fw_name = "fdiv2", },
172*6f809ca8SJian Hu 	{ .fw_name = "fdiv3", },
173*6f809ca8SJian Hu 	{ .fw_name = "hifi0", },
174*6f809ca8SJian Hu 	{ .fw_name = "fdiv2p5", },
175*6f809ca8SJian Hu 	{ .fw_name = "gp1", },
176*6f809ca8SJian Hu 	{ .fw_name = "gp0", }
177*6f809ca8SJian Hu };
178*6f809ca8SJian Hu 
179*6f809ca8SJian Hu static A9_COMP_SEL(sd_emmc_a, SD_EMMC_CLK_CTRL0, 9, 0x7, a9_sd_emmc_parents,
180*6f809ca8SJian Hu 		   a9_sd_emmc_parents_val_table);
181*6f809ca8SJian Hu static A9_COMP_DIV(sd_emmc_a, SD_EMMC_CLK_CTRL0, 0, 7);
182*6f809ca8SJian Hu static A9_COMP_GATE(sd_emmc_a, SD_EMMC_CLK_CTRL0, 8, 0);
183*6f809ca8SJian Hu 
184*6f809ca8SJian Hu static A9_COMP_SEL(sd_emmc_b, SD_EMMC_CLK_CTRL0, 25, 0x7, a9_sd_emmc_parents,
185*6f809ca8SJian Hu 		   a9_sd_emmc_parents_val_table);
186*6f809ca8SJian Hu static A9_COMP_DIV(sd_emmc_b, SD_EMMC_CLK_CTRL0, 16, 7);
187*6f809ca8SJian Hu static A9_COMP_GATE(sd_emmc_b, SD_EMMC_CLK_CTRL0, 24, 0);
188*6f809ca8SJian Hu 
189*6f809ca8SJian Hu static A9_COMP_SEL(sd_emmc_c, SD_EMMC_CLK_CTRL1, 9, 0x7, a9_sd_emmc_parents,
190*6f809ca8SJian Hu 		   a9_sd_emmc_parents_val_table);
191*6f809ca8SJian Hu static A9_COMP_DIV(sd_emmc_c, SD_EMMC_CLK_CTRL1, 0, 7);
192*6f809ca8SJian Hu static A9_COMP_GATE(sd_emmc_c, SD_EMMC_CLK_CTRL1, 8, 0);
193*6f809ca8SJian Hu 
194*6f809ca8SJian Hu static const struct clk_parent_data a9_pwm_parents[] = {
195*6f809ca8SJian Hu 	{ .fw_name = "xtal", },
196*6f809ca8SJian Hu 	{ .fw_name = "fdiv5", },
197*6f809ca8SJian Hu 	{ .fw_name = "fdiv4", },
198*6f809ca8SJian Hu 	{ .fw_name = "fdiv3", }
199*6f809ca8SJian Hu };
200*6f809ca8SJian Hu 
201*6f809ca8SJian Hu static A9_COMP_SEL(pwm_h, PWM_CLK_H_CTRL, 9, 0x7, a9_pwm_parents, NULL);
202*6f809ca8SJian Hu static A9_COMP_DIV(pwm_h, PWM_CLK_H_CTRL, 0, 8);
203*6f809ca8SJian Hu static A9_COMP_GATE(pwm_h, PWM_CLK_H_CTRL, 8, 0);
204*6f809ca8SJian Hu 
205*6f809ca8SJian Hu static A9_COMP_SEL(pwm_i, PWM_CLK_I_CTRL, 9, 0x7, a9_pwm_parents, NULL);
206*6f809ca8SJian Hu static A9_COMP_DIV(pwm_i, PWM_CLK_I_CTRL, 0, 8);
207*6f809ca8SJian Hu static A9_COMP_GATE(pwm_i, PWM_CLK_I_CTRL, 8, 0);
208*6f809ca8SJian Hu 
209*6f809ca8SJian Hu static A9_COMP_SEL(pwm_j, PWM_CLK_J_CTRL, 9, 0x7, a9_pwm_parents, NULL);
210*6f809ca8SJian Hu static A9_COMP_DIV(pwm_j, PWM_CLK_J_CTRL, 0, 8);
211*6f809ca8SJian Hu static A9_COMP_GATE(pwm_j, PWM_CLK_J_CTRL, 8, 0);
212*6f809ca8SJian Hu 
213*6f809ca8SJian Hu static A9_COMP_SEL(pwm_k, PWM_CLK_K_CTRL, 9, 0x7, a9_pwm_parents, NULL);
214*6f809ca8SJian Hu static A9_COMP_DIV(pwm_k, PWM_CLK_K_CTRL, 0, 8);
215*6f809ca8SJian Hu static A9_COMP_GATE(pwm_k, PWM_CLK_K_CTRL, 8, 0);
216*6f809ca8SJian Hu 
217*6f809ca8SJian Hu static A9_COMP_SEL(pwm_l, PWM_CLK_L_CTRL, 9, 0x7, a9_pwm_parents, NULL);
218*6f809ca8SJian Hu static A9_COMP_DIV(pwm_l, PWM_CLK_L_CTRL, 0, 8);
219*6f809ca8SJian Hu static A9_COMP_GATE(pwm_l, PWM_CLK_L_CTRL, 8, 0);
220*6f809ca8SJian Hu 
221*6f809ca8SJian Hu static A9_COMP_SEL(pwm_m, PWM_CLK_M_CTRL, 9, 0x7, a9_pwm_parents, NULL);
222*6f809ca8SJian Hu static A9_COMP_DIV(pwm_m, PWM_CLK_M_CTRL, 0, 8);
223*6f809ca8SJian Hu static A9_COMP_GATE(pwm_m, PWM_CLK_M_CTRL, 8, 0);
224*6f809ca8SJian Hu 
225*6f809ca8SJian Hu static A9_COMP_SEL(pwm_n, PWM_CLK_N_CTRL, 9, 0x7, a9_pwm_parents, NULL);
226*6f809ca8SJian Hu static A9_COMP_DIV(pwm_n, PWM_CLK_N_CTRL, 0, 8);
227*6f809ca8SJian Hu static A9_COMP_GATE(pwm_n, PWM_CLK_N_CTRL, 8, 0);
228*6f809ca8SJian Hu 
229*6f809ca8SJian Hu static const struct clk_parent_data a9_spisg_parents[] = {
230*6f809ca8SJian Hu 	{ .fw_name = "xtal", },
231*6f809ca8SJian Hu 	{ .fw_name = "sys", },
232*6f809ca8SJian Hu 	{ .fw_name = "fdiv4", },
233*6f809ca8SJian Hu 	{ .fw_name = "fdiv3", },
234*6f809ca8SJian Hu 	{ .fw_name = "fdiv2", },
235*6f809ca8SJian Hu 	{ .fw_name = "fdiv5", },
236*6f809ca8SJian Hu 	{ .fw_name = "fdiv7", },
237*6f809ca8SJian Hu 	{ .fw_name = "gp0", }
238*6f809ca8SJian Hu };
239*6f809ca8SJian Hu 
240*6f809ca8SJian Hu static A9_COMP_SEL(spisg0, SPISG_CLK_CTRL, 9, 0x7, a9_spisg_parents, NULL);
241*6f809ca8SJian Hu static A9_COMP_DIV(spisg0, SPISG_CLK_CTRL, 0, 6);
242*6f809ca8SJian Hu static A9_COMP_GATE(spisg0, SPISG_CLK_CTRL, 8, 0);
243*6f809ca8SJian Hu 
244*6f809ca8SJian Hu static A9_COMP_SEL(spisg1, SPISG_CLK_CTRL, 25, 0x7, a9_spisg_parents, NULL);
245*6f809ca8SJian Hu static A9_COMP_DIV(spisg1, SPISG_CLK_CTRL, 16, 6);
246*6f809ca8SJian Hu static A9_COMP_GATE(spisg1, SPISG_CLK_CTRL, 24, 0);
247*6f809ca8SJian Hu 
248*6f809ca8SJian Hu static A9_COMP_SEL(spisg2, SPISG_CLK_CTRL1, 9, 0x7, a9_spisg_parents, NULL);
249*6f809ca8SJian Hu static A9_COMP_DIV(spisg2, SPISG_CLK_CTRL1, 0, 6);
250*6f809ca8SJian Hu static A9_COMP_GATE(spisg2, SPISG_CLK_CTRL1, 8, 0);
251*6f809ca8SJian Hu 
252*6f809ca8SJian Hu static const struct clk_parent_data a9_saradc_parents[] = {
253*6f809ca8SJian Hu 	{ .fw_name = "xtal", },
254*6f809ca8SJian Hu 	{ .fw_name = "sys", }
255*6f809ca8SJian Hu };
256*6f809ca8SJian Hu 
257*6f809ca8SJian Hu static A9_COMP_SEL(saradc, SAR_CLK_CTRL, 9, 0x7, a9_saradc_parents, NULL);
258*6f809ca8SJian Hu static A9_COMP_DIV(saradc, SAR_CLK_CTRL, 0, 8);
259*6f809ca8SJian Hu static A9_COMP_GATE(saradc, SAR_CLK_CTRL, 8, 0);
260*6f809ca8SJian Hu 
261*6f809ca8SJian Hu static const struct clk_parent_data a9_amfc_parents[] = {
262*6f809ca8SJian Hu 	{ .fw_name = "xtal", },
263*6f809ca8SJian Hu 	{ .fw_name = "sys", },
264*6f809ca8SJian Hu 	{ .fw_name = "fdiv2", },
265*6f809ca8SJian Hu 	{ .fw_name = "fdiv2p5", },
266*6f809ca8SJian Hu 	{ .fw_name = "fdiv3", },
267*6f809ca8SJian Hu 	{ .fw_name = "fdiv4", },
268*6f809ca8SJian Hu 	{ .fw_name = "fdiv5", },
269*6f809ca8SJian Hu 	{ .fw_name = "fdiv7", }
270*6f809ca8SJian Hu };
271*6f809ca8SJian Hu 
272*6f809ca8SJian Hu static A9_COMP_SEL(amfc, AMFC_CLK_CTRL, 9, 0x7, a9_amfc_parents, NULL);
273*6f809ca8SJian Hu static A9_COMP_DIV(amfc, AMFC_CLK_CTRL, 0, 6);
274*6f809ca8SJian Hu static A9_COMP_GATE(amfc, AMFC_CLK_CTRL, 8, 0);
275*6f809ca8SJian Hu 
276*6f809ca8SJian Hu static const struct clk_parent_data a9_nna_parents[] = {
277*6f809ca8SJian Hu 	{ .fw_name = "xtal", },
278*6f809ca8SJian Hu 	{ .fw_name = "fdiv2p5", },
279*6f809ca8SJian Hu 	{ .fw_name = "fdiv4", },
280*6f809ca8SJian Hu 	{ .fw_name = "fdiv3", },
281*6f809ca8SJian Hu 	{ .fw_name = "fdiv5", },
282*6f809ca8SJian Hu 	{ .fw_name = "fdiv2", },
283*6f809ca8SJian Hu 	{ .fw_name = "gp2", },
284*6f809ca8SJian Hu 	{ .fw_name = "hifi0", }
285*6f809ca8SJian Hu };
286*6f809ca8SJian Hu 
287*6f809ca8SJian Hu static A9_COMP_SEL(nna, NNA_CLK_CTRL, 9, 0x7, a9_nna_parents, NULL);
288*6f809ca8SJian Hu static A9_COMP_DIV(nna, NNA_CLK_CTRL, 0, 7);
289*6f809ca8SJian Hu static A9_COMP_GATE(nna, NNA_CLK_CTRL, 8, 0);
290*6f809ca8SJian Hu 
291*6f809ca8SJian Hu /* Channel 5 and 6 are unconnected. */
292*6f809ca8SJian Hu static u32 a9_usb_250m_parents_val_table[] = { 0, 1, 2, 3, 4, 7 };
293*6f809ca8SJian Hu static const struct clk_parent_data a9_usb_250m_parents[] = {
294*6f809ca8SJian Hu 	{ .fw_name = "fdiv4", },
295*6f809ca8SJian Hu 	{ .fw_name = "fdiv3", },
296*6f809ca8SJian Hu 	{ .fw_name = "fdiv5", },
297*6f809ca8SJian Hu 	{ .fw_name = "fdiv2", },
298*6f809ca8SJian Hu 	{ .fw_name = "fdiv7", },
299*6f809ca8SJian Hu 	{ .fw_name = "fdiv2p5", }
300*6f809ca8SJian Hu };
301*6f809ca8SJian Hu 
302*6f809ca8SJian Hu static A9_COMP_SEL(usb_250m, USB_CLK_CTRL, 9, 0x7, a9_usb_250m_parents,
303*6f809ca8SJian Hu 		   a9_usb_250m_parents_val_table);
304*6f809ca8SJian Hu static A9_COMP_DIV(usb_250m, USB_CLK_CTRL, 0, 7);
305*6f809ca8SJian Hu static A9_COMP_GATE(usb_250m, USB_CLK_CTRL, 8, 0);
306*6f809ca8SJian Hu 
307*6f809ca8SJian Hu static const struct clk_parent_data a9_usb_48m_pre_parents[] = {
308*6f809ca8SJian Hu 	{ .fw_name = "gp0", },
309*6f809ca8SJian Hu 	{ .fw_name = "gp1", },
310*6f809ca8SJian Hu 	{ .fw_name = "gp2", },
311*6f809ca8SJian Hu 	{ .fw_name = "fdiv2", }
312*6f809ca8SJian Hu };
313*6f809ca8SJian Hu 
314*6f809ca8SJian Hu static A9_COMP_SEL(usb_48m_pre, USB_CLK_CTRL, 25, 0x3, a9_usb_48m_pre_parents, NULL);
315*6f809ca8SJian Hu static A9_COMP_DIV(usb_48m_pre, USB_CLK_CTRL, 16, 7);
316*6f809ca8SJian Hu static A9_COMP_GATE(usb_48m_pre, USB_CLK_CTRL, 24, 0);
317*6f809ca8SJian Hu 
318*6f809ca8SJian Hu static const struct clk_parent_data a9_pcie_tl_parents[] = {
319*6f809ca8SJian Hu 	{ .fw_name = "fdiv4", },
320*6f809ca8SJian Hu 	{ .fw_name = "fdiv3", },
321*6f809ca8SJian Hu 	{ .fw_name = "fdiv5", },
322*6f809ca8SJian Hu 	{ .fw_name = "fdiv2", },
323*6f809ca8SJian Hu 	{ .fw_name = "fdiv2p5", },
324*6f809ca8SJian Hu 	{ .fw_name = "gp0", },
325*6f809ca8SJian Hu 	{ .fw_name = "sys", },
326*6f809ca8SJian Hu 	{ .fw_name = "xtal", }
327*6f809ca8SJian Hu };
328*6f809ca8SJian Hu 
329*6f809ca8SJian Hu static A9_COMP_SEL(pcie0_tl, PCIE_TL_CLK_CTRL, 9, 0x7, a9_pcie_tl_parents, NULL);
330*6f809ca8SJian Hu static A9_COMP_DIV(pcie0_tl, PCIE_TL_CLK_CTRL, 0, 7);
331*6f809ca8SJian Hu static A9_COMP_GATE(pcie0_tl, PCIE_TL_CLK_CTRL, 8, 0);
332*6f809ca8SJian Hu 
333*6f809ca8SJian Hu static A9_COMP_SEL(pcie1_tl, PCIE_TL_CLK_CTRL, 25, 0x7, a9_pcie_tl_parents, NULL);
334*6f809ca8SJian Hu static A9_COMP_DIV(pcie1_tl, PCIE_TL_CLK_CTRL, 16, 7);
335*6f809ca8SJian Hu static A9_COMP_GATE(pcie1_tl, PCIE_TL_CLK_CTRL, 24, 0);
336*6f809ca8SJian Hu 
337*6f809ca8SJian Hu static const struct clk_parent_data a9_cmpr_parents[] = {
338*6f809ca8SJian Hu 	{ .fw_name = "xtal", },
339*6f809ca8SJian Hu 	{ .fw_name = "fdiv2p5", },
340*6f809ca8SJian Hu 	{ .fw_name = "fdiv3", },
341*6f809ca8SJian Hu 	{ .fw_name = "fdiv4", },
342*6f809ca8SJian Hu 	{ .fw_name = "fdiv5", },
343*6f809ca8SJian Hu 	{ .fw_name = "fdiv7", },
344*6f809ca8SJian Hu 	{ .fw_name = "hifi0", },
345*6f809ca8SJian Hu 	{ .fw_name = "gp1", }
346*6f809ca8SJian Hu };
347*6f809ca8SJian Hu 
348*6f809ca8SJian Hu static A9_COMP_SEL(cmpr, CMPR_CLK_CTRL, 25, 0x7, a9_cmpr_parents, NULL);
349*6f809ca8SJian Hu static A9_COMP_DIV(cmpr, CMPR_CLK_CTRL, 16, 7);
350*6f809ca8SJian Hu static A9_COMP_GATE(cmpr, CMPR_CLK_CTRL, 24, 0);
351*6f809ca8SJian Hu 
352*6f809ca8SJian Hu static const struct clk_parent_data a9_dewarpa_parents[] = {
353*6f809ca8SJian Hu 	{ .fw_name = "fdiv2p5", },
354*6f809ca8SJian Hu 	{ .fw_name = "fdiv3", },
355*6f809ca8SJian Hu 	{ .fw_name = "fdiv4", },
356*6f809ca8SJian Hu 	{ .fw_name = "fdiv5", },
357*6f809ca8SJian Hu 	{ .fw_name = "fdiv7", },
358*6f809ca8SJian Hu 	{ .fw_name = "gp0", },
359*6f809ca8SJian Hu 	{ .fw_name = "hifi0", },
360*6f809ca8SJian Hu 	{ .fw_name = "gp1", }
361*6f809ca8SJian Hu };
362*6f809ca8SJian Hu 
363*6f809ca8SJian Hu static A9_COMP_SEL(dewarpa, DEWARP_CLK_CTRL, 9, 0x7, a9_dewarpa_parents, NULL);
364*6f809ca8SJian Hu static A9_COMP_DIV(dewarpa, DEWARP_CLK_CTRL, 0, 7);
365*6f809ca8SJian Hu static A9_COMP_GATE(dewarpa, DEWARP_CLK_CTRL, 8, 0);
366*6f809ca8SJian Hu 
367*6f809ca8SJian Hu static const struct clk_parent_data a9_sc_parents[] = {
368*6f809ca8SJian Hu 	{ .fw_name = "fdiv2", },
369*6f809ca8SJian Hu 	{ .fw_name = "fdiv3", },
370*6f809ca8SJian Hu 	{ .fw_name = "fdiv5", },
371*6f809ca8SJian Hu 	{ .fw_name = "xtal", }
372*6f809ca8SJian Hu };
373*6f809ca8SJian Hu 
374*6f809ca8SJian Hu static A9_COMP_SEL(sc_pre, SC_CLK_CTRL, 9, 0x7, a9_sc_parents, NULL);
375*6f809ca8SJian Hu static A9_COMP_DIV(sc_pre, SC_CLK_CTRL, 0, 8);
376*6f809ca8SJian Hu static A9_COMP_GATE(sc_pre, SC_CLK_CTRL, 8, 0);
377*6f809ca8SJian Hu 
378*6f809ca8SJian Hu static struct clk_regmap a9_sc = {
379*6f809ca8SJian Hu 	.data = &(struct clk_regmap_div_data) {
380*6f809ca8SJian Hu 		.offset = SC_CLK_CTRL,
381*6f809ca8SJian Hu 		.shift = 16,
382*6f809ca8SJian Hu 		.width = 4,
383*6f809ca8SJian Hu 	},
384*6f809ca8SJian Hu 	.hw.init = &(struct clk_init_data) {
385*6f809ca8SJian Hu 		.name = "sc",
386*6f809ca8SJian Hu 		.ops = &clk_regmap_divider_ops,
387*6f809ca8SJian Hu 		.parent_hws = (const struct clk_hw *[]) {
388*6f809ca8SJian Hu 			&a9_sc_pre.hw
389*6f809ca8SJian Hu 		},
390*6f809ca8SJian Hu 		.num_parents = 1,
391*6f809ca8SJian Hu 		.flags = CLK_SET_RATE_PARENT,
392*6f809ca8SJian Hu 	},
393*6f809ca8SJian Hu };
394*6f809ca8SJian Hu 
395*6f809ca8SJian Hu static const struct clk_parent_data a9_dptx_apb2_parents[] = {
396*6f809ca8SJian Hu 	{ .fw_name = "xtal", },
397*6f809ca8SJian Hu 	{ .fw_name = "sys", },
398*6f809ca8SJian Hu 	{ .fw_name = "fdiv4", },
399*6f809ca8SJian Hu 	{ .fw_name = "fdiv5", }
400*6f809ca8SJian Hu };
401*6f809ca8SJian Hu 
402*6f809ca8SJian Hu static A9_COMP_SEL(dptx_apb2, DPTX_CLK_CTRL, 9, 0x7, a9_dptx_apb2_parents, NULL);
403*6f809ca8SJian Hu static A9_COMP_DIV(dptx_apb2, DPTX_CLK_CTRL, 0, 7);
404*6f809ca8SJian Hu static A9_COMP_GATE(dptx_apb2, DPTX_CLK_CTRL, 8, 0);
405*6f809ca8SJian Hu 
406*6f809ca8SJian Hu static const struct clk_parent_data a9_dptx_aud_parents[] = {
407*6f809ca8SJian Hu 	{ .fw_name = "xtal", },
408*6f809ca8SJian Hu 	{ .fw_name = "sys", },
409*6f809ca8SJian Hu 	{ .fw_name = "fdiv3", },
410*6f809ca8SJian Hu 	{ .fw_name = "fdiv4", }
411*6f809ca8SJian Hu };
412*6f809ca8SJian Hu 
413*6f809ca8SJian Hu static A9_COMP_SEL(dptx_aud, DPTX_CLK_CTRL, 25, 0x7, a9_dptx_aud_parents, NULL);
414*6f809ca8SJian Hu static A9_COMP_DIV(dptx_aud, DPTX_CLK_CTRL, 16, 7);
415*6f809ca8SJian Hu static A9_COMP_GATE(dptx_aud, DPTX_CLK_CTRL, 24, 0);
416*6f809ca8SJian Hu 
417*6f809ca8SJian Hu static const struct clk_parent_data a9_isp_parents[] = {
418*6f809ca8SJian Hu 	{ .fw_name = "fdiv2p5", },
419*6f809ca8SJian Hu 	{ .fw_name = "fdiv3", },
420*6f809ca8SJian Hu 	{ .fw_name = "fdiv4", },
421*6f809ca8SJian Hu 	{ .fw_name = "fdiv5", },
422*6f809ca8SJian Hu 	{ .fw_name = "gp0", },
423*6f809ca8SJian Hu 	{ .fw_name = "hifi0", },
424*6f809ca8SJian Hu 	{ .fw_name = "fdiv2", },
425*6f809ca8SJian Hu 	{ .fw_name = "xtal", }
426*6f809ca8SJian Hu };
427*6f809ca8SJian Hu 
428*6f809ca8SJian Hu static A9_COMP_SEL(isp, ISP_CLK_CTRL, 9, 0x7, a9_isp_parents, NULL);
429*6f809ca8SJian Hu static A9_COMP_DIV(isp, ISP_CLK_CTRL, 0, 7);
430*6f809ca8SJian Hu static A9_COMP_GATE(isp, ISP_CLK_CTRL, 8, 0);
431*6f809ca8SJian Hu 
432*6f809ca8SJian Hu static const struct clk_parent_data a9_cve_vge_parents[] = {
433*6f809ca8SJian Hu 	{ .fw_name = "xtal", },
434*6f809ca8SJian Hu 	{ .fw_name = "fdiv2p5", },
435*6f809ca8SJian Hu 	{ .fw_name = "fdiv3", },
436*6f809ca8SJian Hu 	{ .fw_name = "fdiv4", },
437*6f809ca8SJian Hu 	{ .fw_name = "hifi0", },
438*6f809ca8SJian Hu 	{ .fw_name = "fdiv5", },
439*6f809ca8SJian Hu 	{ .fw_name = "gp0", },
440*6f809ca8SJian Hu 	{ .fw_name = "rtc", }
441*6f809ca8SJian Hu };
442*6f809ca8SJian Hu 
443*6f809ca8SJian Hu static A9_COMP_SEL(cve, CVE_CLK_CTRL, 9, 0x7, a9_cve_vge_parents, NULL);
444*6f809ca8SJian Hu static A9_COMP_DIV(cve, CVE_CLK_CTRL, 0, 7);
445*6f809ca8SJian Hu static A9_COMP_GATE(cve, CVE_CLK_CTRL, 8, 0);
446*6f809ca8SJian Hu 
447*6f809ca8SJian Hu static A9_COMP_SEL(vge, CVE_CLK_CTRL, 25, 0x7, a9_cve_vge_parents, NULL);
448*6f809ca8SJian Hu static A9_COMP_DIV(vge, CVE_CLK_CTRL, 16, 7);
449*6f809ca8SJian Hu static A9_COMP_GATE(vge, CVE_CLK_CTRL, 24, 0);
450*6f809ca8SJian Hu 
451*6f809ca8SJian Hu static const struct clk_parent_data a9_pp_parents[] = {
452*6f809ca8SJian Hu 	{ .fw_name = "fdiv4", },
453*6f809ca8SJian Hu 	{ .fw_name = "fdiv3", },
454*6f809ca8SJian Hu 	{ .fw_name = "fdiv5", },
455*6f809ca8SJian Hu 	{ .fw_name = "fdiv2", },
456*6f809ca8SJian Hu 	{ .fw_name = "fdiv2p5", },
457*6f809ca8SJian Hu 	{ .fw_name = "gp0", },
458*6f809ca8SJian Hu 	{ .fw_name = "sys", },
459*6f809ca8SJian Hu 	{ .fw_name = "xtal", }
460*6f809ca8SJian Hu };
461*6f809ca8SJian Hu 
462*6f809ca8SJian Hu static A9_COMP_SEL(pp, PP_CLK_CTRL, 9, 0x7, a9_pp_parents, NULL);
463*6f809ca8SJian Hu static A9_COMP_DIV(pp, PP_CLK_CTRL, 0, 6);
464*6f809ca8SJian Hu static A9_COMP_GATE(pp, PP_CLK_CTRL, 8, 0);
465*6f809ca8SJian Hu 
466*6f809ca8SJian Hu static const struct clk_parent_data a9_dspa_parents[] = {
467*6f809ca8SJian Hu 	{ .fw_name = "xtal", },
468*6f809ca8SJian Hu 	{ .fw_name = "fdiv2p5", },
469*6f809ca8SJian Hu 	{ .fw_name = "fdiv3", },
470*6f809ca8SJian Hu 	{ .fw_name = "fdiv5", },
471*6f809ca8SJian Hu 	{ .fw_name = "gp2", },
472*6f809ca8SJian Hu 	{ .fw_name = "fdiv4", },
473*6f809ca8SJian Hu 	{ .fw_name = "hifi0", },
474*6f809ca8SJian Hu 	{ .fw_name = "rtc", }
475*6f809ca8SJian Hu };
476*6f809ca8SJian Hu 
477*6f809ca8SJian Hu static A9_COMP_SEL(dspa_0, DSPA_CLK_CTRL, 9, 0x7, a9_dspa_parents, NULL);
478*6f809ca8SJian Hu static A9_COMP_DIV(dspa_0, DSPA_CLK_CTRL, 0, 7);
479*6f809ca8SJian Hu static A9_COMP_GATE(dspa_0, DSPA_CLK_CTRL, 8, CLK_SET_RATE_GATE);
480*6f809ca8SJian Hu 
481*6f809ca8SJian Hu static A9_COMP_SEL(dspa_1, DSPA_CLK_CTRL, 25, 0x7, a9_dspa_parents, NULL);
482*6f809ca8SJian Hu static A9_COMP_DIV(dspa_1, DSPA_CLK_CTRL, 16, 7);
483*6f809ca8SJian Hu static A9_COMP_GATE(dspa_1, DSPA_CLK_CTRL, 24, CLK_SET_RATE_GATE);
484*6f809ca8SJian Hu 
485*6f809ca8SJian Hu static struct clk_regmap a9_dspa = {
486*6f809ca8SJian Hu 	.data = &(struct clk_regmap_mux_data){
487*6f809ca8SJian Hu 		.offset = DSPA_CLK_CTRL,
488*6f809ca8SJian Hu 		.mask = 0x1,
489*6f809ca8SJian Hu 		.shift = 31,
490*6f809ca8SJian Hu 	},
491*6f809ca8SJian Hu 	.hw.init = &(struct clk_init_data){
492*6f809ca8SJian Hu 		.name = "dspa",
493*6f809ca8SJian Hu 		.ops = &clk_regmap_mux_ops,
494*6f809ca8SJian Hu 		.parent_hws = (const struct clk_hw *[]) {
495*6f809ca8SJian Hu 			&a9_dspa_0.hw,
496*6f809ca8SJian Hu 			&a9_dspa_1.hw
497*6f809ca8SJian Hu 		},
498*6f809ca8SJian Hu 		.num_parents = 2,
499*6f809ca8SJian Hu 		.flags = CLK_SET_RATE_PARENT,
500*6f809ca8SJian Hu 	},
501*6f809ca8SJian Hu };
502*6f809ca8SJian Hu 
503*6f809ca8SJian Hu /* Channel 6 is unconnected. */
504*6f809ca8SJian Hu static u32 a9_glb_parents_val_table[] = { 0, 1, 2, 3, 4, 5, 7 };
505*6f809ca8SJian Hu static const struct clk_parent_data a9_glb_parents[] = {
506*6f809ca8SJian Hu 	{ .fw_name = "xtal", },
507*6f809ca8SJian Hu 	{ .hw = &a9_dspa.hw },
508*6f809ca8SJian Hu 	{ .fw_name = "fdiv3", },
509*6f809ca8SJian Hu 	{ .fw_name = "fdiv4", },
510*6f809ca8SJian Hu 	{ .fw_name = "fdiv5", },
511*6f809ca8SJian Hu 	{ .hw = &a9_isp.hw },
512*6f809ca8SJian Hu 	{ .fw_name = "rtc", }
513*6f809ca8SJian Hu };
514*6f809ca8SJian Hu 
515*6f809ca8SJian Hu static A9_COMP_SEL(glb, GLB_CLK_CTRL, 9, 0x7, a9_glb_parents, a9_glb_parents_val_table);
516*6f809ca8SJian Hu static A9_COMP_DIV(glb, GLB_CLK_CTRL, 0, 7);
517*6f809ca8SJian Hu static A9_COMP_GATE(glb, GLB_CLK_CTRL, 8, 0);
518*6f809ca8SJian Hu 
519*6f809ca8SJian Hu static struct clk_regmap a9_usb_48m_dualdiv_in = {
520*6f809ca8SJian Hu 	.data = &(struct clk_regmap_gate_data) {
521*6f809ca8SJian Hu 		.offset = USB_CLK_CTRL,
522*6f809ca8SJian Hu 		.bit_idx = 31,
523*6f809ca8SJian Hu 	},
524*6f809ca8SJian Hu 	.hw.init = &(struct clk_init_data) {
525*6f809ca8SJian Hu 		.name = "usb_48m_dualdiv_in",
526*6f809ca8SJian Hu 		.ops = &clk_regmap_gate_ops,
527*6f809ca8SJian Hu 		.parent_hws = (const struct clk_hw *[]) {
528*6f809ca8SJian Hu 			&a9_usb_48m_pre.hw
529*6f809ca8SJian Hu 		},
530*6f809ca8SJian Hu 		.num_parents = 1,
531*6f809ca8SJian Hu 	},
532*6f809ca8SJian Hu };
533*6f809ca8SJian Hu 
534*6f809ca8SJian Hu static const struct meson_clk_dualdiv_param a9_usb_48m_dualdiv_div_table[] = {
535*6f809ca8SJian Hu 	{ 733, 732, 8, 11, 1 },
536*6f809ca8SJian Hu 	{ /* sentinel */ }
537*6f809ca8SJian Hu };
538*6f809ca8SJian Hu 
539*6f809ca8SJian Hu static struct clk_regmap a9_usb_48m_dualdiv_div = {
540*6f809ca8SJian Hu 	.data = &(struct meson_clk_dualdiv_data) {
541*6f809ca8SJian Hu 		.n1 = {
542*6f809ca8SJian Hu 			.reg_off = USB_CLK_CTRL0,
543*6f809ca8SJian Hu 			.shift   = 0,
544*6f809ca8SJian Hu 			.width   = 12,
545*6f809ca8SJian Hu 		},
546*6f809ca8SJian Hu 		.n2 = {
547*6f809ca8SJian Hu 			.reg_off = USB_CLK_CTRL0,
548*6f809ca8SJian Hu 			.shift   = 12,
549*6f809ca8SJian Hu 			.width   = 12,
550*6f809ca8SJian Hu 		},
551*6f809ca8SJian Hu 		.m1 = {
552*6f809ca8SJian Hu 			.reg_off = USB_CLK_CTRL1,
553*6f809ca8SJian Hu 			.shift   = 0,
554*6f809ca8SJian Hu 			.width   = 12,
555*6f809ca8SJian Hu 		},
556*6f809ca8SJian Hu 		.m2 = {
557*6f809ca8SJian Hu 			.reg_off = USB_CLK_CTRL1,
558*6f809ca8SJian Hu 			.shift   = 12,
559*6f809ca8SJian Hu 			.width   = 12,
560*6f809ca8SJian Hu 		},
561*6f809ca8SJian Hu 		.dual = {
562*6f809ca8SJian Hu 			.reg_off = USB_CLK_CTRL0,
563*6f809ca8SJian Hu 			.shift   = 28,
564*6f809ca8SJian Hu 			.width   = 1,
565*6f809ca8SJian Hu 		},
566*6f809ca8SJian Hu 		.table = a9_usb_48m_dualdiv_div_table,
567*6f809ca8SJian Hu 	},
568*6f809ca8SJian Hu 	.hw.init = &(struct clk_init_data) {
569*6f809ca8SJian Hu 		.name = "usb_48m_dualdiv_div",
570*6f809ca8SJian Hu 		.ops = &meson_clk_dualdiv_ops,
571*6f809ca8SJian Hu 		.parent_hws = (const struct clk_hw *[]) {
572*6f809ca8SJian Hu 			&a9_usb_48m_dualdiv_in.hw
573*6f809ca8SJian Hu 		},
574*6f809ca8SJian Hu 		.num_parents = 1,
575*6f809ca8SJian Hu 	},
576*6f809ca8SJian Hu };
577*6f809ca8SJian Hu 
578*6f809ca8SJian Hu static struct clk_regmap a9_usb_48m_dualdiv_sel = {
579*6f809ca8SJian Hu 	.data = &(struct clk_regmap_mux_data) {
580*6f809ca8SJian Hu 		.offset = USB_CLK_CTRL1,
581*6f809ca8SJian Hu 		.mask = 0x1,
582*6f809ca8SJian Hu 		.shift = 24,
583*6f809ca8SJian Hu 	},
584*6f809ca8SJian Hu 	.hw.init = &(struct clk_init_data) {
585*6f809ca8SJian Hu 		.name = "usb_48m_dualdiv_sel",
586*6f809ca8SJian Hu 		.ops = &clk_regmap_mux_ops,
587*6f809ca8SJian Hu 		.parent_hws = (const struct clk_hw *[]) {
588*6f809ca8SJian Hu 			&a9_usb_48m_dualdiv_in.hw,
589*6f809ca8SJian Hu 			&a9_usb_48m_dualdiv_div.hw,
590*6f809ca8SJian Hu 		},
591*6f809ca8SJian Hu 		.num_parents = 2,
592*6f809ca8SJian Hu 		.flags = CLK_SET_RATE_PARENT,
593*6f809ca8SJian Hu 	},
594*6f809ca8SJian Hu };
595*6f809ca8SJian Hu 
596*6f809ca8SJian Hu static struct clk_regmap a9_usb_48m_dualdiv = {
597*6f809ca8SJian Hu 	.data = &(struct clk_regmap_gate_data) {
598*6f809ca8SJian Hu 		.offset = USB_CLK_CTRL0,
599*6f809ca8SJian Hu 		.bit_idx = 30,
600*6f809ca8SJian Hu 	},
601*6f809ca8SJian Hu 	.hw.init = &(struct clk_init_data) {
602*6f809ca8SJian Hu 		.name = "usb_48m_dualdiv",
603*6f809ca8SJian Hu 		.ops = &clk_regmap_gate_ops,
604*6f809ca8SJian Hu 		.parent_hws = (const struct clk_hw *[]) {
605*6f809ca8SJian Hu 			&a9_usb_48m_dualdiv_sel.hw
606*6f809ca8SJian Hu 		},
607*6f809ca8SJian Hu 		.num_parents = 1,
608*6f809ca8SJian Hu 		.flags = CLK_SET_RATE_PARENT,
609*6f809ca8SJian Hu 	},
610*6f809ca8SJian Hu };
611*6f809ca8SJian Hu 
612*6f809ca8SJian Hu static struct clk_regmap a9_usb_48m = {
613*6f809ca8SJian Hu 	.data = &(struct clk_regmap_mux_data) {
614*6f809ca8SJian Hu 		.offset = USB_CLK_CTRL1,
615*6f809ca8SJian Hu 		.mask = 0x3,
616*6f809ca8SJian Hu 		.shift = 30,
617*6f809ca8SJian Hu 	},
618*6f809ca8SJian Hu 	.hw.init = &(struct clk_init_data) {
619*6f809ca8SJian Hu 		.name = "usb_48m",
620*6f809ca8SJian Hu 		.ops = &clk_regmap_mux_ops,
621*6f809ca8SJian Hu 		.parent_hws = (const struct clk_hw *[]) {
622*6f809ca8SJian Hu 			&a9_usb_48m_pre.hw,
623*6f809ca8SJian Hu 			&a9_usb_48m_dualdiv.hw,
624*6f809ca8SJian Hu 		},
625*6f809ca8SJian Hu 		.num_parents = 2,
626*6f809ca8SJian Hu 		.flags = CLK_SET_RATE_PARENT,
627*6f809ca8SJian Hu 	},
628*6f809ca8SJian Hu };
629*6f809ca8SJian Hu 
630*6f809ca8SJian Hu /* Channel 2 is unconnected. */
631*6f809ca8SJian Hu static u32 a9_can_pe_parents_val_table[] = { 0, 1, 3 };
632*6f809ca8SJian Hu static const struct clk_parent_data a9_can_pe_parents[] = {
633*6f809ca8SJian Hu 	{ .fw_name = "sys", },
634*6f809ca8SJian Hu 	{ .fw_name = "xtal", },
635*6f809ca8SJian Hu 	{ .fw_name = "fdiv5", }
636*6f809ca8SJian Hu };
637*6f809ca8SJian Hu 
638*6f809ca8SJian Hu static A9_COMP_SEL(can0_pe, CAN_CLK_CTRL, 9, 0x7, a9_can_pe_parents, a9_can_pe_parents_val_table);
639*6f809ca8SJian Hu static A9_COMP_DIV(can0_pe, CAN_CLK_CTRL, 0, 7);
640*6f809ca8SJian Hu static A9_COMP_GATE(can0_pe, CAN_CLK_CTRL, 8, 0);
641*6f809ca8SJian Hu 
642*6f809ca8SJian Hu static A9_COMP_SEL(can1_pe, CAN_CLK_CTRL, 25, 0x7, a9_can_pe_parents, a9_can_pe_parents_val_table);
643*6f809ca8SJian Hu static A9_COMP_DIV(can1_pe, CAN_CLK_CTRL, 16, 7);
644*6f809ca8SJian Hu static A9_COMP_GATE(can1_pe, CAN_CLK_CTRL, 24, 0);
645*6f809ca8SJian Hu 
646*6f809ca8SJian Hu static const struct clk_parent_data a9_can_filter_parents[] = {
647*6f809ca8SJian Hu 	{ .fw_name = "sys", },
648*6f809ca8SJian Hu 	{ .fw_name = "xtal", },
649*6f809ca8SJian Hu 	{ .fw_name = "fdiv4", },
650*6f809ca8SJian Hu 	{ .fw_name = "fdiv5", }
651*6f809ca8SJian Hu };
652*6f809ca8SJian Hu 
653*6f809ca8SJian Hu static A9_COMP_SEL(can0_filter, CAN_CLK_CTRL1, 9, 0x7, a9_can_filter_parents, NULL);
654*6f809ca8SJian Hu static A9_COMP_DIV(can0_filter, CAN_CLK_CTRL1, 0, 7);
655*6f809ca8SJian Hu static A9_COMP_GATE(can0_filter, CAN_CLK_CTRL1, 8, 0);
656*6f809ca8SJian Hu 
657*6f809ca8SJian Hu static A9_COMP_SEL(can1_filter, CAN_CLK_CTRL1, 25, 0x7, a9_can_filter_parents, NULL);
658*6f809ca8SJian Hu static A9_COMP_DIV(can1_filter, CAN_CLK_CTRL1, 16, 7);
659*6f809ca8SJian Hu static A9_COMP_GATE(can1_filter, CAN_CLK_CTRL1, 24, 0);
660*6f809ca8SJian Hu 
661*6f809ca8SJian Hu static const struct clk_parent_data a9_i3c_parents[] = {
662*6f809ca8SJian Hu 	{ .fw_name = "sys", },
663*6f809ca8SJian Hu 	{ .fw_name = "xtal", },
664*6f809ca8SJian Hu 	{ .fw_name = "fdiv5", }
665*6f809ca8SJian Hu };
666*6f809ca8SJian Hu 
667*6f809ca8SJian Hu static A9_COMP_SEL(i3c, I3C_CLK_CTRL, 9, 0x7, a9_i3c_parents, NULL);
668*6f809ca8SJian Hu static A9_COMP_DIV(i3c, I3C_CLK_CTRL, 0, 8);
669*6f809ca8SJian Hu static A9_COMP_GATE(i3c, I3C_CLK_CTRL, 8, 0);
670*6f809ca8SJian Hu 
671*6f809ca8SJian Hu static struct clk_regmap a9_ts_div = {
672*6f809ca8SJian Hu 	.data = &(struct clk_regmap_div_data) {
673*6f809ca8SJian Hu 		.offset = TS_CLK_CTRL,
674*6f809ca8SJian Hu 		.shift = 0,
675*6f809ca8SJian Hu 		.width = 8,
676*6f809ca8SJian Hu 	},
677*6f809ca8SJian Hu 	.hw.init = &(struct clk_init_data) {
678*6f809ca8SJian Hu 		.name = "ts_div",
679*6f809ca8SJian Hu 		.ops = &clk_regmap_divider_ops,
680*6f809ca8SJian Hu 		.parent_data = &(const struct clk_parent_data) {
681*6f809ca8SJian Hu 			.fw_name = "xtal",
682*6f809ca8SJian Hu 		},
683*6f809ca8SJian Hu 		.num_parents = 1,
684*6f809ca8SJian Hu 	},
685*6f809ca8SJian Hu };
686*6f809ca8SJian Hu 
687*6f809ca8SJian Hu static struct clk_regmap a9_ts = {
688*6f809ca8SJian Hu 	.data = &(struct clk_regmap_gate_data) {
689*6f809ca8SJian Hu 		.offset = TS_CLK_CTRL,
690*6f809ca8SJian Hu 		.bit_idx = 8,
691*6f809ca8SJian Hu 	},
692*6f809ca8SJian Hu 	.hw.init = &(struct clk_init_data) {
693*6f809ca8SJian Hu 		.name = "ts",
694*6f809ca8SJian Hu 		.ops = &clk_regmap_gate_ops,
695*6f809ca8SJian Hu 		.parent_hws = (const struct clk_hw *[]) {
696*6f809ca8SJian Hu 			&a9_ts_div.hw
697*6f809ca8SJian Hu 		},
698*6f809ca8SJian Hu 		.num_parents = 1,
699*6f809ca8SJian Hu 		.flags = CLK_SET_RATE_PARENT,
700*6f809ca8SJian Hu 	},
701*6f809ca8SJian Hu };
702*6f809ca8SJian Hu 
703*6f809ca8SJian Hu static struct clk_fixed_factor a9_eth_125m_div = {
704*6f809ca8SJian Hu 	.mult = 1,
705*6f809ca8SJian Hu 	.div = 8,
706*6f809ca8SJian Hu 	.hw.init = &(struct clk_init_data) {
707*6f809ca8SJian Hu 		.name = "eth_125m_div",
708*6f809ca8SJian Hu 		.ops = &clk_fixed_factor_ops,
709*6f809ca8SJian Hu 		.parent_data = &(const struct clk_parent_data) {
710*6f809ca8SJian Hu 			.fw_name = "fdiv2",
711*6f809ca8SJian Hu 		},
712*6f809ca8SJian Hu 		.num_parents = 1,
713*6f809ca8SJian Hu 	},
714*6f809ca8SJian Hu };
715*6f809ca8SJian Hu 
716*6f809ca8SJian Hu static struct clk_regmap a9_eth_125m = {
717*6f809ca8SJian Hu 	.data = &(struct clk_regmap_gate_data) {
718*6f809ca8SJian Hu 		.offset = ETH_CLK_CTRL,
719*6f809ca8SJian Hu 		.bit_idx = 7,
720*6f809ca8SJian Hu 	},
721*6f809ca8SJian Hu 	.hw.init = &(struct clk_init_data) {
722*6f809ca8SJian Hu 		.name = "eth_125m",
723*6f809ca8SJian Hu 		.ops = &clk_regmap_gate_ops,
724*6f809ca8SJian Hu 		.parent_hws = (const struct clk_hw *[]) {
725*6f809ca8SJian Hu 			&a9_eth_125m_div.hw
726*6f809ca8SJian Hu 		},
727*6f809ca8SJian Hu 		.num_parents = 1,
728*6f809ca8SJian Hu 		.flags = CLK_SET_RATE_PARENT,
729*6f809ca8SJian Hu 	},
730*6f809ca8SJian Hu };
731*6f809ca8SJian Hu 
732*6f809ca8SJian Hu /*
733*6f809ca8SJian Hu  * Channel 1, 2, 3, 4, 5 and 6 are unconnected,
734*6f809ca8SJian Hu  * Channel 7(ext_rmii) connects external PAD. Do not automatically reparent.
735*6f809ca8SJian Hu  */
736*6f809ca8SJian Hu static u32 a9_eth_rmii_parents_val_table[] = { 0, 7 };
737*6f809ca8SJian Hu static const struct clk_parent_data a9_eth_rmii_parents[] = {
738*6f809ca8SJian Hu 	{ .fw_name = "fdiv2", },
739*6f809ca8SJian Hu 	{ .fw_name = "ext_rmii", }
740*6f809ca8SJian Hu };
741*6f809ca8SJian Hu 
742*6f809ca8SJian Hu static struct clk_regmap a9_eth_rmii_sel = {
743*6f809ca8SJian Hu 	.data = &(struct clk_regmap_mux_data) {
744*6f809ca8SJian Hu 		.offset = ETH_CLK_CTRL,
745*6f809ca8SJian Hu 		.mask = 0x7,
746*6f809ca8SJian Hu 		.shift = 9,
747*6f809ca8SJian Hu 		.table = a9_eth_rmii_parents_val_table,
748*6f809ca8SJian Hu 	},
749*6f809ca8SJian Hu 	.hw.init = &(struct clk_init_data){
750*6f809ca8SJian Hu 		.name = "eth_rmii_sel",
751*6f809ca8SJian Hu 		.ops = &clk_regmap_mux_ops,
752*6f809ca8SJian Hu 		.parent_data = a9_eth_rmii_parents,
753*6f809ca8SJian Hu 		.num_parents = ARRAY_SIZE(a9_eth_rmii_parents),
754*6f809ca8SJian Hu 		.flags = CLK_SET_RATE_NO_REPARENT,
755*6f809ca8SJian Hu 	},
756*6f809ca8SJian Hu };
757*6f809ca8SJian Hu 
758*6f809ca8SJian Hu static struct clk_regmap a9_eth_rmii_div = {
759*6f809ca8SJian Hu 	.data = &(struct clk_regmap_div_data) {
760*6f809ca8SJian Hu 		.offset = ETH_CLK_CTRL,
761*6f809ca8SJian Hu 		.shift = 0,
762*6f809ca8SJian Hu 		.width = 7,
763*6f809ca8SJian Hu 	},
764*6f809ca8SJian Hu 	.hw.init = &(struct clk_init_data){
765*6f809ca8SJian Hu 		.name = "eth_rmii_div",
766*6f809ca8SJian Hu 		.ops = &clk_regmap_divider_ops,
767*6f809ca8SJian Hu 		.parent_hws = (const struct clk_hw *[]) {
768*6f809ca8SJian Hu 			&a9_eth_rmii_sel.hw
769*6f809ca8SJian Hu 		},
770*6f809ca8SJian Hu 		.num_parents = 1,
771*6f809ca8SJian Hu 		.flags = CLK_SET_RATE_PARENT,
772*6f809ca8SJian Hu 	},
773*6f809ca8SJian Hu };
774*6f809ca8SJian Hu 
775*6f809ca8SJian Hu static struct clk_regmap a9_eth_rmii = {
776*6f809ca8SJian Hu 	.data = &(struct clk_regmap_gate_data) {
777*6f809ca8SJian Hu 		.offset = ETH_CLK_CTRL,
778*6f809ca8SJian Hu 		.bit_idx = 8,
779*6f809ca8SJian Hu 	},
780*6f809ca8SJian Hu 	.hw.init = &(struct clk_init_data){
781*6f809ca8SJian Hu 		.name = "eth_rmii",
782*6f809ca8SJian Hu 		.ops = &clk_regmap_gate_ops,
783*6f809ca8SJian Hu 		.parent_hws = (const struct clk_hw *[]) {
784*6f809ca8SJian Hu 			&a9_eth_rmii_div.hw
785*6f809ca8SJian Hu 		},
786*6f809ca8SJian Hu 		.num_parents = 1,
787*6f809ca8SJian Hu 		.flags = CLK_SET_RATE_PARENT,
788*6f809ca8SJian Hu 	},
789*6f809ca8SJian Hu };
790*6f809ca8SJian Hu 
791*6f809ca8SJian Hu static struct clk_regmap a9_vid_pll_div = {
792*6f809ca8SJian Hu 	.data = &(struct meson_vid_pll_div_data){
793*6f809ca8SJian Hu 		.val = {
794*6f809ca8SJian Hu 			.reg_off = VID_PLL_CLK_DIV,
795*6f809ca8SJian Hu 			.shift   = 0,
796*6f809ca8SJian Hu 			.width   = 15,
797*6f809ca8SJian Hu 		},
798*6f809ca8SJian Hu 		.sel = {
799*6f809ca8SJian Hu 			.reg_off = VID_PLL_CLK_DIV,
800*6f809ca8SJian Hu 			.shift   = 16,
801*6f809ca8SJian Hu 			.width   = 2,
802*6f809ca8SJian Hu 		},
803*6f809ca8SJian Hu 	},
804*6f809ca8SJian Hu 	.hw.init = &(struct clk_init_data) {
805*6f809ca8SJian Hu 		.name = "vid_pll_div",
806*6f809ca8SJian Hu 		.ops = &meson_vid_pll_div_ro_ops,
807*6f809ca8SJian Hu 		.parent_data = (const struct clk_parent_data []) {
808*6f809ca8SJian Hu 			{ .fw_name = "hdmiout2", }
809*6f809ca8SJian Hu 		},
810*6f809ca8SJian Hu 		.num_parents = 1,
811*6f809ca8SJian Hu 	},
812*6f809ca8SJian Hu };
813*6f809ca8SJian Hu 
814*6f809ca8SJian Hu static struct clk_regmap a9_vid_pll_sel = {
815*6f809ca8SJian Hu 	.data = &(struct clk_regmap_mux_data){
816*6f809ca8SJian Hu 		.offset = VID_PLL_CLK_DIV,
817*6f809ca8SJian Hu 		.mask = 0x1,
818*6f809ca8SJian Hu 		.shift = 18,
819*6f809ca8SJian Hu 	},
820*6f809ca8SJian Hu 	.hw.init = &(struct clk_init_data){
821*6f809ca8SJian Hu 		.name = "vid_pll_sel",
822*6f809ca8SJian Hu 		.ops = &clk_regmap_mux_ops,
823*6f809ca8SJian Hu 		.parent_data = (const struct clk_parent_data []) {
824*6f809ca8SJian Hu 			{ .hw = &a9_vid_pll_div.hw },
825*6f809ca8SJian Hu 			{ .fw_name = "hdmiout2", }
826*6f809ca8SJian Hu 		},
827*6f809ca8SJian Hu 		.num_parents = 2,
828*6f809ca8SJian Hu 		.flags = CLK_SET_RATE_PARENT,
829*6f809ca8SJian Hu 	},
830*6f809ca8SJian Hu };
831*6f809ca8SJian Hu 
832*6f809ca8SJian Hu static struct clk_regmap a9_vid_pll = {
833*6f809ca8SJian Hu 	.data = &(struct clk_regmap_gate_data){
834*6f809ca8SJian Hu 		.offset = VID_PLL_CLK_DIV,
835*6f809ca8SJian Hu 		.bit_idx = 19,
836*6f809ca8SJian Hu 	},
837*6f809ca8SJian Hu 	.hw.init = &(struct clk_init_data) {
838*6f809ca8SJian Hu 		.name = "vid_pll",
839*6f809ca8SJian Hu 		.ops = &clk_regmap_gate_ops,
840*6f809ca8SJian Hu 		.parent_hws = (const struct clk_hw *[]) {
841*6f809ca8SJian Hu 			&a9_vid_pll_sel.hw
842*6f809ca8SJian Hu 		},
843*6f809ca8SJian Hu 		.num_parents = 1,
844*6f809ca8SJian Hu 		.flags = CLK_SET_RATE_PARENT,
845*6f809ca8SJian Hu 	},
846*6f809ca8SJian Hu };
847*6f809ca8SJian Hu 
848*6f809ca8SJian Hu /*
849*6f809ca8SJian Hu  * Channel 12 (msr_clk) is managed by the clock measurement module and is not part of the clock
850*6f809ca8SJian Hu  * tree. It depends on the measurement source selected through the measurement control registers.
851*6f809ca8SJian Hu  *
852*6f809ca8SJian Hu  * Channel 10, 11, 13, 14 and 16 are unconnected.
853*6f809ca8SJian Hu  */
854*6f809ca8SJian Hu static u32 a9_gen_parents_val_table[] = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 15, 17, 18,
855*6f809ca8SJian Hu 					  19, 20, 21, 22, 23, 24, 25, 26};
856*6f809ca8SJian Hu static const struct clk_parent_data a9_gen_parents[] = {
857*6f809ca8SJian Hu 	{ .fw_name = "xtal" },
858*6f809ca8SJian Hu 	{ .fw_name = "rtc" },
859*6f809ca8SJian Hu 	{ .fw_name = "sysplldiv16" },
860*6f809ca8SJian Hu 	{ .fw_name = "ddr_test" },
861*6f809ca8SJian Hu 	{ .hw = &a9_vid_pll.hw },
862*6f809ca8SJian Hu 	{ .fw_name = "gp0" },
863*6f809ca8SJian Hu 	{ .fw_name = "hifi1" },
864*6f809ca8SJian Hu 	{ .fw_name = "hifi0" },
865*6f809ca8SJian Hu 	{ .fw_name = "gp1" },
866*6f809ca8SJian Hu 	{ .fw_name = "gp2" },
867*6f809ca8SJian Hu 	{ .fw_name = "dsudiv16" },
868*6f809ca8SJian Hu 	{ .fw_name = "cpudiv16" },
869*6f809ca8SJian Hu 	{ .fw_name = "a78div16" },
870*6f809ca8SJian Hu 	{ .fw_name = "fdiv2" },
871*6f809ca8SJian Hu 	{ .fw_name = "fdiv2p5" },
872*6f809ca8SJian Hu 	{ .fw_name = "fdiv3" },
873*6f809ca8SJian Hu 	{ .fw_name = "fdiv4" },
874*6f809ca8SJian Hu 	{ .fw_name = "fdiv5" },
875*6f809ca8SJian Hu 	{ .fw_name = "fdiv7" },
876*6f809ca8SJian Hu 	{ .fw_name = "mclk0" },
877*6f809ca8SJian Hu 	{ .fw_name = "mclk1" }
878*6f809ca8SJian Hu };
879*6f809ca8SJian Hu 
880*6f809ca8SJian Hu static A9_COMP_SEL(gen, GEN_CLK_CTRL, 12, 0x1f, a9_gen_parents, a9_gen_parents_val_table);
881*6f809ca8SJian Hu static A9_COMP_DIV(gen, GEN_CLK_CTRL, 0, 11);
882*6f809ca8SJian Hu static A9_COMP_GATE(gen, GEN_CLK_CTRL, 11, 0);
883*6f809ca8SJian Hu 
884*6f809ca8SJian Hu static struct clk_regmap a9_24m_in = {
885*6f809ca8SJian Hu 	.data = &(struct clk_regmap_gate_data) {
886*6f809ca8SJian Hu 		.offset = CLK12_24_CTRL,
887*6f809ca8SJian Hu 		.bit_idx = 11,
888*6f809ca8SJian Hu 	},
889*6f809ca8SJian Hu 	.hw.init = &(struct clk_init_data) {
890*6f809ca8SJian Hu 		.name = "24m_in",
891*6f809ca8SJian Hu 		.ops = &clk_regmap_gate_ops,
892*6f809ca8SJian Hu 		.parent_data = &(const struct clk_parent_data) {
893*6f809ca8SJian Hu 			.fw_name = "xtal",
894*6f809ca8SJian Hu 		},
895*6f809ca8SJian Hu 		.num_parents = 1,
896*6f809ca8SJian Hu 	},
897*6f809ca8SJian Hu };
898*6f809ca8SJian Hu 
899*6f809ca8SJian Hu static struct clk_regmap a9_12_24m = {
900*6f809ca8SJian Hu 	.data = &(struct clk_regmap_div_data) {
901*6f809ca8SJian Hu 		.offset = CLK12_24_CTRL,
902*6f809ca8SJian Hu 		.shift = 10,
903*6f809ca8SJian Hu 		.width = 1,
904*6f809ca8SJian Hu 	},
905*6f809ca8SJian Hu 	.hw.init = &(struct clk_init_data) {
906*6f809ca8SJian Hu 		.name = "12_24m",
907*6f809ca8SJian Hu 		.ops = &clk_regmap_divider_ops,
908*6f809ca8SJian Hu 		.parent_hws = (const struct clk_hw *[]) {
909*6f809ca8SJian Hu 			&a9_24m_in.hw
910*6f809ca8SJian Hu 		},
911*6f809ca8SJian Hu 		.num_parents = 1,
912*6f809ca8SJian Hu 	},
913*6f809ca8SJian Hu };
914*6f809ca8SJian Hu 
915*6f809ca8SJian Hu static const struct clk_parent_data a9_mali_parents[] = {
916*6f809ca8SJian Hu 	{ .fw_name = "xtal", },
917*6f809ca8SJian Hu 	{ .fw_name = "gp1", },
918*6f809ca8SJian Hu 	{ .fw_name = "fdiv2", },
919*6f809ca8SJian Hu 	{ .fw_name = "fdiv2p5", },
920*6f809ca8SJian Hu 	{ .fw_name = "fdiv3", },
921*6f809ca8SJian Hu 	{ .fw_name = "fdiv4", },
922*6f809ca8SJian Hu 	{ .fw_name = "fdiv5", },
923*6f809ca8SJian Hu 	{ .fw_name = "fdiv7", }
924*6f809ca8SJian Hu };
925*6f809ca8SJian Hu 
926*6f809ca8SJian Hu static A9_COMP_SEL(mali_0, MALI_CLK_CTRL, 9, 0x7, a9_mali_parents, NULL);
927*6f809ca8SJian Hu static A9_COMP_DIV(mali_0, MALI_CLK_CTRL, 0, 7);
928*6f809ca8SJian Hu static A9_COMP_GATE(mali_0, MALI_CLK_CTRL, 8, CLK_SET_RATE_GATE);
929*6f809ca8SJian Hu 
930*6f809ca8SJian Hu static A9_COMP_SEL(mali_1, MALI_CLK_CTRL, 25, 0x7, a9_mali_parents, NULL);
931*6f809ca8SJian Hu static A9_COMP_DIV(mali_1, MALI_CLK_CTRL, 16, 7);
932*6f809ca8SJian Hu static A9_COMP_GATE(mali_1, MALI_CLK_CTRL, 24, CLK_SET_RATE_GATE);
933*6f809ca8SJian Hu 
934*6f809ca8SJian Hu static struct clk_regmap a9_mali = {
935*6f809ca8SJian Hu 	.data = &(struct clk_regmap_mux_data){
936*6f809ca8SJian Hu 		.offset = MALI_CLK_CTRL,
937*6f809ca8SJian Hu 		.mask = 0x1,
938*6f809ca8SJian Hu 		.shift = 31,
939*6f809ca8SJian Hu 	},
940*6f809ca8SJian Hu 	.hw.init = &(struct clk_init_data){
941*6f809ca8SJian Hu 		.name = "mali",
942*6f809ca8SJian Hu 		.ops = &clk_regmap_mux_ops,
943*6f809ca8SJian Hu 		.parent_hws = (const struct clk_hw *[]) {
944*6f809ca8SJian Hu 			&a9_mali_0.hw,
945*6f809ca8SJian Hu 			&a9_mali_1.hw
946*6f809ca8SJian Hu 		},
947*6f809ca8SJian Hu 		.num_parents = 2,
948*6f809ca8SJian Hu 		.flags = CLK_SET_RATE_PARENT,
949*6f809ca8SJian Hu 	},
950*6f809ca8SJian Hu };
951*6f809ca8SJian Hu 
952*6f809ca8SJian Hu static A9_COMP_SEL(mali_stack_0, MALI_STACK_CLK_CTRL, 9, 0x7, a9_mali_parents, NULL);
953*6f809ca8SJian Hu static A9_COMP_DIV(mali_stack_0, MALI_STACK_CLK_CTRL, 0, 7);
954*6f809ca8SJian Hu static A9_COMP_GATE(mali_stack_0, MALI_STACK_CLK_CTRL, 8, CLK_SET_RATE_GATE);
955*6f809ca8SJian Hu 
956*6f809ca8SJian Hu static A9_COMP_SEL(mali_stack_1, MALI_STACK_CLK_CTRL, 25, 0x7, a9_mali_parents, NULL);
957*6f809ca8SJian Hu static A9_COMP_DIV(mali_stack_1, MALI_STACK_CLK_CTRL, 16, 7);
958*6f809ca8SJian Hu static A9_COMP_GATE(mali_stack_1, MALI_STACK_CLK_CTRL, 24, CLK_SET_RATE_GATE);
959*6f809ca8SJian Hu 
960*6f809ca8SJian Hu static struct clk_regmap a9_mali_stack = {
961*6f809ca8SJian Hu 	.data = &(struct clk_regmap_mux_data){
962*6f809ca8SJian Hu 		.offset = MALI_STACK_CLK_CTRL,
963*6f809ca8SJian Hu 		.mask = 0x1,
964*6f809ca8SJian Hu 		.shift = 31,
965*6f809ca8SJian Hu 	},
966*6f809ca8SJian Hu 	.hw.init = &(struct clk_init_data){
967*6f809ca8SJian Hu 		.name = "mali_stack",
968*6f809ca8SJian Hu 		.ops = &clk_regmap_mux_ops,
969*6f809ca8SJian Hu 		.parent_hws = (const struct clk_hw *[]) {
970*6f809ca8SJian Hu 			&a9_mali_stack_0.hw,
971*6f809ca8SJian Hu 			&a9_mali_stack_1.hw
972*6f809ca8SJian Hu 		},
973*6f809ca8SJian Hu 		.num_parents = 2,
974*6f809ca8SJian Hu 		.flags = CLK_SET_RATE_PARENT,
975*6f809ca8SJian Hu 	},
976*6f809ca8SJian Hu };
977*6f809ca8SJian Hu 
978*6f809ca8SJian Hu static const struct clk_parent_data a9_hevcf_parents[] = {
979*6f809ca8SJian Hu 	{ .fw_name = "fdiv2p5", },
980*6f809ca8SJian Hu 	{ .fw_name = "fdiv3", },
981*6f809ca8SJian Hu 	{ .fw_name = "fdiv4", },
982*6f809ca8SJian Hu 	{ .fw_name = "fdiv5", },
983*6f809ca8SJian Hu 	{ .fw_name = "fdiv7", },
984*6f809ca8SJian Hu 	{ .fw_name = "hifi0", },
985*6f809ca8SJian Hu 	{ .fw_name = "gp1", },
986*6f809ca8SJian Hu 	{ .fw_name = "xtal", }
987*6f809ca8SJian Hu };
988*6f809ca8SJian Hu 
989*6f809ca8SJian Hu static A9_COMP_SEL(hevcf_0, HEVCF_CLK_CTRL, 9, 0x7, a9_hevcf_parents, NULL);
990*6f809ca8SJian Hu static A9_COMP_DIV(hevcf_0, HEVCF_CLK_CTRL, 0, 7);
991*6f809ca8SJian Hu static A9_COMP_GATE(hevcf_0, HEVCF_CLK_CTRL, 8, CLK_SET_RATE_GATE);
992*6f809ca8SJian Hu 
993*6f809ca8SJian Hu static A9_COMP_SEL(hevcf_1, HEVCF_CLK_CTRL, 25, 0x7, a9_hevcf_parents, NULL);
994*6f809ca8SJian Hu static A9_COMP_DIV(hevcf_1, HEVCF_CLK_CTRL, 16, 7);
995*6f809ca8SJian Hu static A9_COMP_GATE(hevcf_1, HEVCF_CLK_CTRL, 24, CLK_SET_RATE_GATE);
996*6f809ca8SJian Hu 
997*6f809ca8SJian Hu static struct clk_regmap a9_hevcf = {
998*6f809ca8SJian Hu 	.data = &(struct clk_regmap_mux_data){
999*6f809ca8SJian Hu 		.offset = HEVCF_CLK_CTRL,
1000*6f809ca8SJian Hu 		.mask = 0x1,
1001*6f809ca8SJian Hu 		.shift = 31,
1002*6f809ca8SJian Hu 	},
1003*6f809ca8SJian Hu 	.hw.init = &(struct clk_init_data){
1004*6f809ca8SJian Hu 		.name = "hevcf",
1005*6f809ca8SJian Hu 		.ops = &clk_regmap_mux_ops,
1006*6f809ca8SJian Hu 		.parent_hws = (const struct clk_hw *[]) {
1007*6f809ca8SJian Hu 			&a9_hevcf_0.hw,
1008*6f809ca8SJian Hu 			&a9_hevcf_1.hw
1009*6f809ca8SJian Hu 		},
1010*6f809ca8SJian Hu 		.num_parents = 2,
1011*6f809ca8SJian Hu 		.flags = CLK_SET_RATE_PARENT,
1012*6f809ca8SJian Hu 	},
1013*6f809ca8SJian Hu };
1014*6f809ca8SJian Hu 
1015*6f809ca8SJian Hu static const struct clk_parent_data a9_hcodec_parents[] = {
1016*6f809ca8SJian Hu 	{ .fw_name = "fdiv2p5", },
1017*6f809ca8SJian Hu 	{ .fw_name = "fdiv3", },
1018*6f809ca8SJian Hu 	{ .fw_name = "fdiv4", },
1019*6f809ca8SJian Hu 	{ .fw_name = "fdiv5", },
1020*6f809ca8SJian Hu 	{ .fw_name = "fdiv7", },
1021*6f809ca8SJian Hu 	{ .fw_name = "hifi0", },
1022*6f809ca8SJian Hu 	{ .fw_name = "gp0", },
1023*6f809ca8SJian Hu 	{ .fw_name = "xtal", }
1024*6f809ca8SJian Hu };
1025*6f809ca8SJian Hu 
1026*6f809ca8SJian Hu static A9_COMP_SEL(hcodec_0, HCODEC_CLK_CTRL, 9, 0x7, a9_hcodec_parents, NULL);
1027*6f809ca8SJian Hu static A9_COMP_DIV(hcodec_0, HCODEC_CLK_CTRL, 0, 7);
1028*6f809ca8SJian Hu static A9_COMP_GATE(hcodec_0, HCODEC_CLK_CTRL, 8, CLK_SET_RATE_GATE);
1029*6f809ca8SJian Hu 
1030*6f809ca8SJian Hu static A9_COMP_SEL(hcodec_1, HCODEC_CLK_CTRL, 25, 0x7, a9_hcodec_parents, NULL);
1031*6f809ca8SJian Hu static A9_COMP_DIV(hcodec_1, HCODEC_CLK_CTRL, 16, 7);
1032*6f809ca8SJian Hu static A9_COMP_GATE(hcodec_1, HCODEC_CLK_CTRL, 24, CLK_SET_RATE_GATE);
1033*6f809ca8SJian Hu 
1034*6f809ca8SJian Hu static struct clk_regmap a9_hcodec = {
1035*6f809ca8SJian Hu 	.data = &(struct clk_regmap_mux_data){
1036*6f809ca8SJian Hu 		.offset = HCODEC_CLK_CTRL,
1037*6f809ca8SJian Hu 		.mask = 0x1,
1038*6f809ca8SJian Hu 		.shift = 31,
1039*6f809ca8SJian Hu 	},
1040*6f809ca8SJian Hu 	.hw.init = &(struct clk_init_data){
1041*6f809ca8SJian Hu 		.name = "hcodec",
1042*6f809ca8SJian Hu 		.ops = &clk_regmap_mux_ops,
1043*6f809ca8SJian Hu 		.parent_hws = (const struct clk_hw *[]) {
1044*6f809ca8SJian Hu 			&a9_hcodec_0.hw,
1045*6f809ca8SJian Hu 			&a9_hcodec_1.hw
1046*6f809ca8SJian Hu 		},
1047*6f809ca8SJian Hu 		.num_parents = 2,
1048*6f809ca8SJian Hu 		.flags = CLK_SET_RATE_PARENT,
1049*6f809ca8SJian Hu 	},
1050*6f809ca8SJian Hu };
1051*6f809ca8SJian Hu 
1052*6f809ca8SJian Hu static const struct clk_parent_data a9_vpu_parents[] = {
1053*6f809ca8SJian Hu 	{ .fw_name = "fdiv3", },
1054*6f809ca8SJian Hu 	{ .fw_name = "fdiv4", },
1055*6f809ca8SJian Hu 	{ .fw_name = "fdiv5", },
1056*6f809ca8SJian Hu 	{ .fw_name = "vid1", },
1057*6f809ca8SJian Hu 	{ .fw_name = "fdiv2", },
1058*6f809ca8SJian Hu 	{ .hw = &a9_vid_pll.hw },
1059*6f809ca8SJian Hu 	{ .fw_name = "vid2", },
1060*6f809ca8SJian Hu 	{ .fw_name = "gp1", }
1061*6f809ca8SJian Hu };
1062*6f809ca8SJian Hu 
1063*6f809ca8SJian Hu static A9_COMP_SEL(vpu_0, VPU_CLK_CTRL, 9, 0x7, a9_vpu_parents, NULL);
1064*6f809ca8SJian Hu static A9_COMP_DIV(vpu_0, VPU_CLK_CTRL, 0, 7);
1065*6f809ca8SJian Hu static A9_COMP_GATE(vpu_0, VPU_CLK_CTRL, 8, CLK_SET_RATE_GATE);
1066*6f809ca8SJian Hu 
1067*6f809ca8SJian Hu static A9_COMP_SEL(vpu_1, VPU_CLK_CTRL, 25, 0x7, a9_vpu_parents, NULL);
1068*6f809ca8SJian Hu static A9_COMP_DIV(vpu_1, VPU_CLK_CTRL, 16, 7);
1069*6f809ca8SJian Hu static A9_COMP_GATE(vpu_1, VPU_CLK_CTRL, 24, CLK_SET_RATE_GATE);
1070*6f809ca8SJian Hu 
1071*6f809ca8SJian Hu static struct clk_regmap a9_vpu = {
1072*6f809ca8SJian Hu 	.data = &(struct clk_regmap_mux_data){
1073*6f809ca8SJian Hu 		.offset = VPU_CLK_CTRL,
1074*6f809ca8SJian Hu 		.mask = 0x1,
1075*6f809ca8SJian Hu 		.shift = 31,
1076*6f809ca8SJian Hu 	},
1077*6f809ca8SJian Hu 	.hw.init = &(struct clk_init_data){
1078*6f809ca8SJian Hu 		.name = "vpu",
1079*6f809ca8SJian Hu 		.ops = &clk_regmap_mux_ops,
1080*6f809ca8SJian Hu 		.parent_hws = (const struct clk_hw *[]) {
1081*6f809ca8SJian Hu 			&a9_vpu_0.hw,
1082*6f809ca8SJian Hu 			&a9_vpu_1.hw
1083*6f809ca8SJian Hu 		},
1084*6f809ca8SJian Hu 		.num_parents = 2,
1085*6f809ca8SJian Hu 		.flags = CLK_SET_RATE_PARENT,
1086*6f809ca8SJian Hu 	},
1087*6f809ca8SJian Hu };
1088*6f809ca8SJian Hu 
1089*6f809ca8SJian Hu static const struct clk_parent_data a9_vapb_parents[] = {
1090*6f809ca8SJian Hu 	{ .fw_name = "fdiv4", },
1091*6f809ca8SJian Hu 	{ .fw_name = "fdiv3", },
1092*6f809ca8SJian Hu 	{ .fw_name = "fdiv5", },
1093*6f809ca8SJian Hu 	{ .fw_name = "fdiv7", },
1094*6f809ca8SJian Hu 	{ .fw_name = "fdiv2", },
1095*6f809ca8SJian Hu 	{ .hw = &a9_vid_pll.hw },
1096*6f809ca8SJian Hu 	{ .fw_name = "hifi0", },
1097*6f809ca8SJian Hu 	{ .fw_name = "fdiv2p5", }
1098*6f809ca8SJian Hu };
1099*6f809ca8SJian Hu 
1100*6f809ca8SJian Hu static A9_COMP_SEL(vapb_0, VAPB_CLK_CTRL, 9, 0x7, a9_vapb_parents, NULL);
1101*6f809ca8SJian Hu static A9_COMP_DIV(vapb_0, VAPB_CLK_CTRL, 0, 7);
1102*6f809ca8SJian Hu static A9_COMP_GATE(vapb_0, VAPB_CLK_CTRL, 8, CLK_SET_RATE_GATE);
1103*6f809ca8SJian Hu 
1104*6f809ca8SJian Hu static A9_COMP_SEL(vapb_1, VAPB_CLK_CTRL, 25, 0x7, a9_vapb_parents, NULL);
1105*6f809ca8SJian Hu static A9_COMP_DIV(vapb_1, VAPB_CLK_CTRL, 16, 7);
1106*6f809ca8SJian Hu static A9_COMP_GATE(vapb_1, VAPB_CLK_CTRL, 24, CLK_SET_RATE_GATE);
1107*6f809ca8SJian Hu 
1108*6f809ca8SJian Hu static struct clk_regmap a9_vapb = {
1109*6f809ca8SJian Hu 	.data = &(struct clk_regmap_mux_data){
1110*6f809ca8SJian Hu 		.offset = VAPB_CLK_CTRL,
1111*6f809ca8SJian Hu 		.mask = 0x1,
1112*6f809ca8SJian Hu 		.shift = 31,
1113*6f809ca8SJian Hu 	},
1114*6f809ca8SJian Hu 	.hw.init = &(struct clk_init_data){
1115*6f809ca8SJian Hu 		.name = "vapb",
1116*6f809ca8SJian Hu 		.ops = &clk_regmap_mux_ops,
1117*6f809ca8SJian Hu 		.parent_hws = (const struct clk_hw *[]) {
1118*6f809ca8SJian Hu 			&a9_vapb_0.hw,
1119*6f809ca8SJian Hu 			&a9_vapb_1.hw
1120*6f809ca8SJian Hu 		},
1121*6f809ca8SJian Hu 		.num_parents = 2,
1122*6f809ca8SJian Hu 		.flags = CLK_SET_RATE_PARENT,
1123*6f809ca8SJian Hu 	},
1124*6f809ca8SJian Hu };
1125*6f809ca8SJian Hu 
1126*6f809ca8SJian Hu static struct clk_regmap a9_ge2d = {
1127*6f809ca8SJian Hu 	.data = &(struct clk_regmap_gate_data) {
1128*6f809ca8SJian Hu 		.offset = VAPB_CLK_CTRL,
1129*6f809ca8SJian Hu 		.bit_idx = 30,
1130*6f809ca8SJian Hu 	},
1131*6f809ca8SJian Hu 	.hw.init = &(struct clk_init_data) {
1132*6f809ca8SJian Hu 		.name = "ge2d",
1133*6f809ca8SJian Hu 		.ops = &clk_regmap_gate_ops,
1134*6f809ca8SJian Hu 		.parent_hws = (const struct clk_hw *[]) {
1135*6f809ca8SJian Hu 			&a9_vapb.hw,
1136*6f809ca8SJian Hu 		},
1137*6f809ca8SJian Hu 		.num_parents = 1,
1138*6f809ca8SJian Hu 	},
1139*6f809ca8SJian Hu };
1140*6f809ca8SJian Hu 
1141*6f809ca8SJian Hu static const struct clk_parent_data a9_vpu_clkb_tmp_parents[] = {
1142*6f809ca8SJian Hu 	{ .hw = &a9_vpu.hw },
1143*6f809ca8SJian Hu 	{ .fw_name = "fdiv4", },
1144*6f809ca8SJian Hu 	{ .fw_name = "fdiv5", },
1145*6f809ca8SJian Hu 	{ .fw_name = "fdiv7", }
1146*6f809ca8SJian Hu };
1147*6f809ca8SJian Hu 
1148*6f809ca8SJian Hu static A9_COMP_SEL(vpu_clkb_tmp, VPU_CLKB_CTRL, 25, 0x7, a9_vpu_clkb_tmp_parents, NULL);
1149*6f809ca8SJian Hu static A9_COMP_DIV(vpu_clkb_tmp, VPU_CLKB_CTRL, 16, 4);
1150*6f809ca8SJian Hu static A9_COMP_GATE(vpu_clkb_tmp, VPU_CLKB_CTRL, 24, 0);
1151*6f809ca8SJian Hu 
1152*6f809ca8SJian Hu static struct clk_regmap a9_vpu_clkb_div = {
1153*6f809ca8SJian Hu 	.data = &(struct clk_regmap_div_data) {
1154*6f809ca8SJian Hu 		.offset = VPU_CLKB_CTRL,
1155*6f809ca8SJian Hu 		.shift = 0,
1156*6f809ca8SJian Hu 		.width = 8,
1157*6f809ca8SJian Hu 	},
1158*6f809ca8SJian Hu 	.hw.init = &(struct clk_init_data) {
1159*6f809ca8SJian Hu 		.name = "vpu_clkb_div",
1160*6f809ca8SJian Hu 		.ops = &clk_regmap_divider_ops,
1161*6f809ca8SJian Hu 		.parent_hws = (const struct clk_hw *[]) {
1162*6f809ca8SJian Hu 			&a9_vpu_clkb_tmp.hw,
1163*6f809ca8SJian Hu 		},
1164*6f809ca8SJian Hu 		.num_parents = 1,
1165*6f809ca8SJian Hu 	},
1166*6f809ca8SJian Hu };
1167*6f809ca8SJian Hu 
1168*6f809ca8SJian Hu static struct clk_regmap a9_vpu_clkb = {
1169*6f809ca8SJian Hu 	.data = &(struct clk_regmap_gate_data) {
1170*6f809ca8SJian Hu 		.offset = VPU_CLKB_CTRL,
1171*6f809ca8SJian Hu 		.bit_idx = 8,
1172*6f809ca8SJian Hu 	},
1173*6f809ca8SJian Hu 	.hw.init = &(struct clk_init_data) {
1174*6f809ca8SJian Hu 		.name = "vpu_clkb",
1175*6f809ca8SJian Hu 		.ops = &clk_regmap_gate_ops,
1176*6f809ca8SJian Hu 		.parent_hws = (const struct clk_hw *[]) {
1177*6f809ca8SJian Hu 			&a9_vpu_clkb_div.hw
1178*6f809ca8SJian Hu 		},
1179*6f809ca8SJian Hu 		.num_parents = 1,
1180*6f809ca8SJian Hu 		.flags = CLK_SET_RATE_PARENT,
1181*6f809ca8SJian Hu 	},
1182*6f809ca8SJian Hu };
1183*6f809ca8SJian Hu 
1184*6f809ca8SJian Hu static const struct clk_parent_data a9_hdmi_parents[] = {
1185*6f809ca8SJian Hu 	{ .fw_name = "xtal", },
1186*6f809ca8SJian Hu 	{ .fw_name = "fdiv4", },
1187*6f809ca8SJian Hu 	{ .fw_name = "fdiv3", },
1188*6f809ca8SJian Hu 	{ .fw_name = "fdiv5", }
1189*6f809ca8SJian Hu };
1190*6f809ca8SJian Hu 
1191*6f809ca8SJian Hu static A9_COMP_SEL(hdmitx_sys, HDMI_CLK_CTRL, 9, 0x7, a9_hdmi_parents, NULL);
1192*6f809ca8SJian Hu static A9_COMP_DIV(hdmitx_sys, HDMI_CLK_CTRL, 0, 7);
1193*6f809ca8SJian Hu static A9_COMP_GATE(hdmitx_sys, HDMI_CLK_CTRL, 8, 0);
1194*6f809ca8SJian Hu 
1195*6f809ca8SJian Hu static A9_COMP_SEL(hdmitx_prif, HTX_CLK_CTRL, 9, 0x7, a9_hdmi_parents, NULL);
1196*6f809ca8SJian Hu static A9_COMP_DIV(hdmitx_prif, HTX_CLK_CTRL, 0, 7);
1197*6f809ca8SJian Hu static A9_COMP_GATE(hdmitx_prif, HTX_CLK_CTRL, 8, 0);
1198*6f809ca8SJian Hu 
1199*6f809ca8SJian Hu static A9_COMP_SEL(hdmitx_200m, HTX_CLK_CTRL, 25, 0x7, a9_hdmi_parents, NULL);
1200*6f809ca8SJian Hu static A9_COMP_DIV(hdmitx_200m, HTX_CLK_CTRL, 16, 7);
1201*6f809ca8SJian Hu static A9_COMP_GATE(hdmitx_200m, HTX_CLK_CTRL, 24, 0);
1202*6f809ca8SJian Hu 
1203*6f809ca8SJian Hu static A9_COMP_SEL(hdmitx_aud, HTX_CLK_CTRL1, 9, 0x7, a9_hdmi_parents, NULL);
1204*6f809ca8SJian Hu static A9_COMP_DIV(hdmitx_aud, HTX_CLK_CTRL1, 0, 7);
1205*6f809ca8SJian Hu static A9_COMP_GATE(hdmitx_aud, HTX_CLK_CTRL1, 8, 0);
1206*6f809ca8SJian Hu 
1207*6f809ca8SJian Hu static A9_COMP_SEL(hdmirx_5m, HRX_CLK_CTRL, 9, 0x7, a9_hdmi_parents, NULL);
1208*6f809ca8SJian Hu static A9_COMP_DIV(hdmirx_5m, HRX_CLK_CTRL, 0, 7);
1209*6f809ca8SJian Hu static A9_COMP_GATE(hdmirx_5m, HRX_CLK_CTRL, 8, 0);
1210*6f809ca8SJian Hu 
1211*6f809ca8SJian Hu static A9_COMP_SEL(hdmirx_2m, HRX_CLK_CTRL, 25, 0x7, a9_hdmi_parents, NULL);
1212*6f809ca8SJian Hu static A9_COMP_DIV(hdmirx_2m, HRX_CLK_CTRL, 16, 7);
1213*6f809ca8SJian Hu static A9_COMP_GATE(hdmirx_2m, HRX_CLK_CTRL, 24, 0);
1214*6f809ca8SJian Hu 
1215*6f809ca8SJian Hu static A9_COMP_SEL(hdmirx_cfg, HRX_CLK_CTRL1, 9, 0x7, a9_hdmi_parents, NULL);
1216*6f809ca8SJian Hu static A9_COMP_DIV(hdmirx_cfg, HRX_CLK_CTRL1, 0, 7);
1217*6f809ca8SJian Hu static A9_COMP_GATE(hdmirx_cfg, HRX_CLK_CTRL1, 8, 0);
1218*6f809ca8SJian Hu 
1219*6f809ca8SJian Hu static A9_COMP_SEL(hdmirx_hdcp2x, HRX_CLK_CTRL1, 25, 0x7, a9_hdmi_parents, NULL);
1220*6f809ca8SJian Hu static A9_COMP_DIV(hdmirx_hdcp2x, HRX_CLK_CTRL1, 16, 7);
1221*6f809ca8SJian Hu static A9_COMP_GATE(hdmirx_hdcp2x, HRX_CLK_CTRL1, 24, 0);
1222*6f809ca8SJian Hu 
1223*6f809ca8SJian Hu static A9_COMP_SEL(hdmirx_acr_ref, HRX_CLK_CTRL2, 25, 0x7, a9_hdmi_parents, NULL);
1224*6f809ca8SJian Hu static A9_COMP_DIV(hdmirx_acr_ref, HRX_CLK_CTRL2, 16, 7);
1225*6f809ca8SJian Hu static A9_COMP_GATE(hdmirx_acr_ref, HRX_CLK_CTRL2, 24, 0);
1226*6f809ca8SJian Hu 
1227*6f809ca8SJian Hu static A9_COMP_SEL(hdmirx_meter, HRX_CLK_CTRL3, 9, 0x7, a9_hdmi_parents, NULL);
1228*6f809ca8SJian Hu static A9_COMP_DIV(hdmirx_meter, HRX_CLK_CTRL3, 0, 7);
1229*6f809ca8SJian Hu static A9_COMP_GATE(hdmirx_meter, HRX_CLK_CTRL3, 8, 0);
1230*6f809ca8SJian Hu 
1231*6f809ca8SJian Hu static struct clk_regmap a9_vid_pll_vclk = {
1232*6f809ca8SJian Hu 	.data = &(struct clk_regmap_mux_data){
1233*6f809ca8SJian Hu 		.offset = HDMI_CLK_CTRL,
1234*6f809ca8SJian Hu 		.mask = 0x1,
1235*6f809ca8SJian Hu 		.shift = 15,
1236*6f809ca8SJian Hu 	},
1237*6f809ca8SJian Hu 	.hw.init = &(struct clk_init_data){
1238*6f809ca8SJian Hu 		.name = "vid_pll_vclk",
1239*6f809ca8SJian Hu 		.ops = &clk_regmap_mux_ops,
1240*6f809ca8SJian Hu 		.parent_data = (const struct clk_parent_data []) {
1241*6f809ca8SJian Hu 			{ .hw = &a9_vid_pll.hw },
1242*6f809ca8SJian Hu 			{ .fw_name = "hdmipix", }
1243*6f809ca8SJian Hu 		},
1244*6f809ca8SJian Hu 		.num_parents = 2,
1245*6f809ca8SJian Hu 	},
1246*6f809ca8SJian Hu };
1247*6f809ca8SJian Hu 
1248*6f809ca8SJian Hu static const struct clk_parent_data a9_vclk_parents[] = {
1249*6f809ca8SJian Hu 	{ .hw = &a9_vid_pll_vclk.hw },
1250*6f809ca8SJian Hu 	{ .fw_name = "pix0", },
1251*6f809ca8SJian Hu 	{ .fw_name = "vid1", },
1252*6f809ca8SJian Hu 	{ .fw_name = "pix1", },
1253*6f809ca8SJian Hu 	{ .fw_name = "fdiv3", },
1254*6f809ca8SJian Hu 	{ .fw_name = "fdiv4", },
1255*6f809ca8SJian Hu 	{ .fw_name = "fdiv5", },
1256*6f809ca8SJian Hu 	{ .fw_name = "vid2", }
1257*6f809ca8SJian Hu };
1258*6f809ca8SJian Hu 
1259*6f809ca8SJian Hu static struct clk_regmap a9_vclk0_sel = {
1260*6f809ca8SJian Hu 	.data = &(struct clk_regmap_mux_data){
1261*6f809ca8SJian Hu 		.offset = VID_CLK_CTRL,
1262*6f809ca8SJian Hu 		.mask = 0x7,
1263*6f809ca8SJian Hu 		.shift = 16,
1264*6f809ca8SJian Hu 	},
1265*6f809ca8SJian Hu 	.hw.init = &(struct clk_init_data){
1266*6f809ca8SJian Hu 		.name = "vclk0_sel",
1267*6f809ca8SJian Hu 		.ops = &clk_regmap_mux_ops,
1268*6f809ca8SJian Hu 		.parent_data = a9_vclk_parents,
1269*6f809ca8SJian Hu 		.num_parents = ARRAY_SIZE(a9_vclk_parents),
1270*6f809ca8SJian Hu 	},
1271*6f809ca8SJian Hu };
1272*6f809ca8SJian Hu 
1273*6f809ca8SJian Hu static struct clk_regmap a9_vclk0_in = {
1274*6f809ca8SJian Hu 	.data = &(struct clk_regmap_gate_data){
1275*6f809ca8SJian Hu 		.offset = VID_CLK_DIV,
1276*6f809ca8SJian Hu 		.bit_idx = 16,
1277*6f809ca8SJian Hu 	},
1278*6f809ca8SJian Hu 	.hw.init = &(struct clk_init_data) {
1279*6f809ca8SJian Hu 		.name = "vclk0_in",
1280*6f809ca8SJian Hu 		.ops = &clk_regmap_gate_ops,
1281*6f809ca8SJian Hu 		.parent_hws = (const struct clk_hw *[]) { &a9_vclk0_sel.hw },
1282*6f809ca8SJian Hu 		.num_parents = 1,
1283*6f809ca8SJian Hu 		.flags = CLK_SET_RATE_PARENT,
1284*6f809ca8SJian Hu 	},
1285*6f809ca8SJian Hu };
1286*6f809ca8SJian Hu 
1287*6f809ca8SJian Hu static struct clk_regmap a9_vclk0_div = {
1288*6f809ca8SJian Hu 	.data = &(struct clk_regmap_div_data){
1289*6f809ca8SJian Hu 		.offset = VID_CLK_DIV,
1290*6f809ca8SJian Hu 		.shift = 0,
1291*6f809ca8SJian Hu 		.width = 8,
1292*6f809ca8SJian Hu 	},
1293*6f809ca8SJian Hu 	.hw.init = &(struct clk_init_data){
1294*6f809ca8SJian Hu 		.name = "vclk0_div",
1295*6f809ca8SJian Hu 		.ops = &clk_regmap_divider_ops,
1296*6f809ca8SJian Hu 		.parent_hws = (const struct clk_hw *[]) {
1297*6f809ca8SJian Hu 			&a9_vclk0_in.hw
1298*6f809ca8SJian Hu 		},
1299*6f809ca8SJian Hu 		.num_parents = 1,
1300*6f809ca8SJian Hu 		.flags = CLK_SET_RATE_PARENT,
1301*6f809ca8SJian Hu 	},
1302*6f809ca8SJian Hu };
1303*6f809ca8SJian Hu 
1304*6f809ca8SJian Hu static struct clk_regmap a9_vclk0 = {
1305*6f809ca8SJian Hu 	.data = &(struct clk_regmap_gate_data){
1306*6f809ca8SJian Hu 		.offset = VID_CLK_CTRL,
1307*6f809ca8SJian Hu 		.bit_idx = 19,
1308*6f809ca8SJian Hu 	},
1309*6f809ca8SJian Hu 	.hw.init = &(struct clk_init_data) {
1310*6f809ca8SJian Hu 		.name = "vclk0",
1311*6f809ca8SJian Hu 		.ops = &clk_regmap_gate_ops,
1312*6f809ca8SJian Hu 		.parent_hws = (const struct clk_hw *[]) { &a9_vclk0_div.hw },
1313*6f809ca8SJian Hu 		.num_parents = 1,
1314*6f809ca8SJian Hu 		.flags = CLK_SET_RATE_PARENT,
1315*6f809ca8SJian Hu 	},
1316*6f809ca8SJian Hu };
1317*6f809ca8SJian Hu 
1318*6f809ca8SJian Hu #define A9_VCLK_GATE(_name, _reg, _bit,  _parent)			\
1319*6f809ca8SJian Hu struct clk_regmap a9_##_name##_en = {					\
1320*6f809ca8SJian Hu 	.data = &(struct clk_regmap_gate_data) {			\
1321*6f809ca8SJian Hu 		.offset = (_reg),					\
1322*6f809ca8SJian Hu 		.bit_idx = (_bit),					\
1323*6f809ca8SJian Hu 	},								\
1324*6f809ca8SJian Hu 	.hw.init = &(struct clk_init_data) {				\
1325*6f809ca8SJian Hu 		.name = #_name "_en",					\
1326*6f809ca8SJian Hu 		.ops = &clk_regmap_gate_ops,				\
1327*6f809ca8SJian Hu 		.parent_hws = (const struct clk_hw *[]) {		\
1328*6f809ca8SJian Hu 			&(_parent).hw					\
1329*6f809ca8SJian Hu 		},							\
1330*6f809ca8SJian Hu 		.num_parents = 1,					\
1331*6f809ca8SJian Hu 		.flags = CLK_SET_RATE_PARENT,				\
1332*6f809ca8SJian Hu 	},								\
1333*6f809ca8SJian Hu }
1334*6f809ca8SJian Hu 
1335*6f809ca8SJian Hu #define A9_VCLK_DIV(_name, _div)					\
1336*6f809ca8SJian Hu struct clk_fixed_factor a9_##_name = {					\
1337*6f809ca8SJian Hu 	.mult = 1,							\
1338*6f809ca8SJian Hu 	.div = (_div),							\
1339*6f809ca8SJian Hu 	.hw.init = &(struct clk_init_data) {				\
1340*6f809ca8SJian Hu 		.name = #_name,						\
1341*6f809ca8SJian Hu 		.ops = &clk_fixed_factor_ops,				\
1342*6f809ca8SJian Hu 		.parent_hws = (const struct clk_hw *[]) {		\
1343*6f809ca8SJian Hu 			&a9_##_name##_en.hw				\
1344*6f809ca8SJian Hu 		},							\
1345*6f809ca8SJian Hu 		.num_parents = 1,					\
1346*6f809ca8SJian Hu 		.flags = CLK_SET_RATE_PARENT,				\
1347*6f809ca8SJian Hu 	},								\
1348*6f809ca8SJian Hu }
1349*6f809ca8SJian Hu 
1350*6f809ca8SJian Hu static A9_VCLK_GATE(vclk0_div1, VID_CLK_CTRL, 0, a9_vclk0);
1351*6f809ca8SJian Hu static A9_VCLK_GATE(vclk0_div2, VID_CLK_CTRL, 1, a9_vclk0);
1352*6f809ca8SJian Hu static A9_VCLK_DIV(vclk0_div2, 2);
1353*6f809ca8SJian Hu static A9_VCLK_GATE(vclk0_div4, VID_CLK_CTRL, 2, a9_vclk0);
1354*6f809ca8SJian Hu static A9_VCLK_DIV(vclk0_div4, 4);
1355*6f809ca8SJian Hu static A9_VCLK_GATE(vclk0_div6, VID_CLK_CTRL, 3, a9_vclk0);
1356*6f809ca8SJian Hu static A9_VCLK_DIV(vclk0_div6, 6);
1357*6f809ca8SJian Hu static A9_VCLK_GATE(vclk0_div12, VID_CLK_CTRL, 4, a9_vclk0);
1358*6f809ca8SJian Hu static A9_VCLK_DIV(vclk0_div12, 12);
1359*6f809ca8SJian Hu 
1360*6f809ca8SJian Hu static struct clk_regmap a9_vclk1_sel = {
1361*6f809ca8SJian Hu 	.data = &(struct clk_regmap_mux_data){
1362*6f809ca8SJian Hu 		.offset = VIID_CLK_CTRL,
1363*6f809ca8SJian Hu 		.mask = 0x7,
1364*6f809ca8SJian Hu 		.shift = 16,
1365*6f809ca8SJian Hu 	},
1366*6f809ca8SJian Hu 	.hw.init = &(struct clk_init_data){
1367*6f809ca8SJian Hu 		.name = "vclk1_sel",
1368*6f809ca8SJian Hu 		.ops = &clk_regmap_mux_ops,
1369*6f809ca8SJian Hu 		.parent_data = a9_vclk_parents,
1370*6f809ca8SJian Hu 		.num_parents = ARRAY_SIZE(a9_vclk_parents),
1371*6f809ca8SJian Hu 	},
1372*6f809ca8SJian Hu };
1373*6f809ca8SJian Hu 
1374*6f809ca8SJian Hu static struct clk_regmap a9_vclk1_in = {
1375*6f809ca8SJian Hu 	.data = &(struct clk_regmap_gate_data){
1376*6f809ca8SJian Hu 		.offset = VIID_CLK_DIV,
1377*6f809ca8SJian Hu 		.bit_idx = 16,
1378*6f809ca8SJian Hu 	},
1379*6f809ca8SJian Hu 	.hw.init = &(struct clk_init_data) {
1380*6f809ca8SJian Hu 		.name = "vclk1_in",
1381*6f809ca8SJian Hu 		.ops = &clk_regmap_gate_ops,
1382*6f809ca8SJian Hu 		.parent_hws = (const struct clk_hw *[]) { &a9_vclk1_sel.hw },
1383*6f809ca8SJian Hu 		.num_parents = 1,
1384*6f809ca8SJian Hu 		.flags = CLK_SET_RATE_PARENT,
1385*6f809ca8SJian Hu 	},
1386*6f809ca8SJian Hu };
1387*6f809ca8SJian Hu 
1388*6f809ca8SJian Hu static struct clk_regmap a9_vclk1_div = {
1389*6f809ca8SJian Hu 	.data = &(struct clk_regmap_div_data){
1390*6f809ca8SJian Hu 		.offset = VIID_CLK_DIV,
1391*6f809ca8SJian Hu 		.shift = 0,
1392*6f809ca8SJian Hu 		.width = 8,
1393*6f809ca8SJian Hu 	},
1394*6f809ca8SJian Hu 	.hw.init = &(struct clk_init_data){
1395*6f809ca8SJian Hu 		.name = "vclk1_div",
1396*6f809ca8SJian Hu 		.ops = &clk_regmap_divider_ops,
1397*6f809ca8SJian Hu 		.parent_hws = (const struct clk_hw *[]) {
1398*6f809ca8SJian Hu 			&a9_vclk1_in.hw
1399*6f809ca8SJian Hu 		},
1400*6f809ca8SJian Hu 		.num_parents = 1,
1401*6f809ca8SJian Hu 		.flags = CLK_SET_RATE_PARENT,
1402*6f809ca8SJian Hu 	},
1403*6f809ca8SJian Hu };
1404*6f809ca8SJian Hu 
1405*6f809ca8SJian Hu static struct clk_regmap a9_vclk1 = {
1406*6f809ca8SJian Hu 	.data = &(struct clk_regmap_gate_data){
1407*6f809ca8SJian Hu 		.offset = VIID_CLK_CTRL,
1408*6f809ca8SJian Hu 		.bit_idx = 19,
1409*6f809ca8SJian Hu 	},
1410*6f809ca8SJian Hu 	.hw.init = &(struct clk_init_data) {
1411*6f809ca8SJian Hu 		.name = "vclk1",
1412*6f809ca8SJian Hu 		.ops = &clk_regmap_gate_ops,
1413*6f809ca8SJian Hu 		.parent_hws = (const struct clk_hw *[]) { &a9_vclk1_div.hw },
1414*6f809ca8SJian Hu 		.num_parents = 1,
1415*6f809ca8SJian Hu 		.flags = CLK_SET_RATE_PARENT,
1416*6f809ca8SJian Hu 	},
1417*6f809ca8SJian Hu };
1418*6f809ca8SJian Hu 
1419*6f809ca8SJian Hu static A9_VCLK_GATE(vclk1_div1, VIID_CLK_CTRL, 0, a9_vclk1);
1420*6f809ca8SJian Hu static A9_VCLK_GATE(vclk1_div2, VIID_CLK_CTRL, 1, a9_vclk1);
1421*6f809ca8SJian Hu static A9_VCLK_DIV(vclk1_div2, 2);
1422*6f809ca8SJian Hu static A9_VCLK_GATE(vclk1_div4, VIID_CLK_CTRL, 2, a9_vclk1);
1423*6f809ca8SJian Hu static A9_VCLK_DIV(vclk1_div4, 4);
1424*6f809ca8SJian Hu static A9_VCLK_GATE(vclk1_div6, VIID_CLK_CTRL, 3, a9_vclk1);
1425*6f809ca8SJian Hu static A9_VCLK_DIV(vclk1_div6, 6);
1426*6f809ca8SJian Hu static A9_VCLK_GATE(vclk1_div12, VIID_CLK_CTRL, 4, a9_vclk1);
1427*6f809ca8SJian Hu static A9_VCLK_DIV(vclk1_div12, 12);
1428*6f809ca8SJian Hu 
1429*6f809ca8SJian Hu /* Channel 5, 6 and 7 are unconnected */
1430*6f809ca8SJian Hu static u32 a9_vid_parents_val_table[] = { 0, 1, 2, 3, 4, 8, 9, 10, 11, 12 };
1431*6f809ca8SJian Hu static const struct clk_hw *a9_vid_parents[] = {
1432*6f809ca8SJian Hu 	&a9_vclk0_div1_en.hw,
1433*6f809ca8SJian Hu 	&a9_vclk0_div2.hw,
1434*6f809ca8SJian Hu 	&a9_vclk0_div4.hw,
1435*6f809ca8SJian Hu 	&a9_vclk0_div6.hw,
1436*6f809ca8SJian Hu 	&a9_vclk0_div12.hw,
1437*6f809ca8SJian Hu 	&a9_vclk1_div1_en.hw,
1438*6f809ca8SJian Hu 	&a9_vclk1_div2.hw,
1439*6f809ca8SJian Hu 	&a9_vclk1_div4.hw,
1440*6f809ca8SJian Hu 	&a9_vclk1_div6.hw,
1441*6f809ca8SJian Hu 	&a9_vclk1_div12.hw
1442*6f809ca8SJian Hu };
1443*6f809ca8SJian Hu 
1444*6f809ca8SJian Hu static struct clk_regmap a9_encoder0_sel = {
1445*6f809ca8SJian Hu 	.data = &(struct clk_regmap_mux_data){
1446*6f809ca8SJian Hu 		.offset = VIID_CLK_DIV,
1447*6f809ca8SJian Hu 		.mask = 0xf,
1448*6f809ca8SJian Hu 		.shift = 12,
1449*6f809ca8SJian Hu 		.table = a9_vid_parents_val_table,
1450*6f809ca8SJian Hu 	},
1451*6f809ca8SJian Hu 	.hw.init = &(struct clk_init_data){
1452*6f809ca8SJian Hu 		.name = "encoder0_sel",
1453*6f809ca8SJian Hu 		.ops = &clk_regmap_mux_ops,
1454*6f809ca8SJian Hu 		.parent_hws = a9_vid_parents,
1455*6f809ca8SJian Hu 		.num_parents = ARRAY_SIZE(a9_vid_parents),
1456*6f809ca8SJian Hu 	},
1457*6f809ca8SJian Hu };
1458*6f809ca8SJian Hu 
1459*6f809ca8SJian Hu static struct clk_regmap a9_encoder0 = {
1460*6f809ca8SJian Hu 	.data = &(struct clk_regmap_gate_data){
1461*6f809ca8SJian Hu 		.offset = VID_CLK_CTRL2,
1462*6f809ca8SJian Hu 		.bit_idx = 10,
1463*6f809ca8SJian Hu 	},
1464*6f809ca8SJian Hu 	.hw.init = &(struct clk_init_data) {
1465*6f809ca8SJian Hu 		.name = "encoder0",
1466*6f809ca8SJian Hu 		.ops = &clk_regmap_gate_ops,
1467*6f809ca8SJian Hu 		.parent_hws = (const struct clk_hw *[]) {
1468*6f809ca8SJian Hu 			&a9_encoder0_sel.hw
1469*6f809ca8SJian Hu 		},
1470*6f809ca8SJian Hu 		.num_parents = 1,
1471*6f809ca8SJian Hu 		.flags = CLK_SET_RATE_PARENT,
1472*6f809ca8SJian Hu 	},
1473*6f809ca8SJian Hu };
1474*6f809ca8SJian Hu 
1475*6f809ca8SJian Hu static struct clk_regmap a9_encoder1_sel = {
1476*6f809ca8SJian Hu 	.data = &(struct clk_regmap_mux_data){
1477*6f809ca8SJian Hu 		.offset = VIID_CLK_DIV,
1478*6f809ca8SJian Hu 		.mask = 0xf,
1479*6f809ca8SJian Hu 		.shift = 8,
1480*6f809ca8SJian Hu 		.table = a9_vid_parents_val_table,
1481*6f809ca8SJian Hu 	},
1482*6f809ca8SJian Hu 	.hw.init = &(struct clk_init_data){
1483*6f809ca8SJian Hu 		.name = "encoder1_sel",
1484*6f809ca8SJian Hu 		.ops = &clk_regmap_mux_ops,
1485*6f809ca8SJian Hu 		.parent_hws = a9_vid_parents,
1486*6f809ca8SJian Hu 		.num_parents = ARRAY_SIZE(a9_vid_parents),
1487*6f809ca8SJian Hu 	},
1488*6f809ca8SJian Hu };
1489*6f809ca8SJian Hu 
1490*6f809ca8SJian Hu static struct clk_regmap a9_encoder1 = {
1491*6f809ca8SJian Hu 	.data = &(struct clk_regmap_gate_data){
1492*6f809ca8SJian Hu 		.offset = VID_CLK_CTRL2,
1493*6f809ca8SJian Hu 		.bit_idx = 11,
1494*6f809ca8SJian Hu 	},
1495*6f809ca8SJian Hu 	.hw.init = &(struct clk_init_data) {
1496*6f809ca8SJian Hu 		.name = "encoder1",
1497*6f809ca8SJian Hu 		.ops = &clk_regmap_gate_ops,
1498*6f809ca8SJian Hu 		.parent_hws = (const struct clk_hw *[]) {
1499*6f809ca8SJian Hu 			&a9_encoder1_sel.hw
1500*6f809ca8SJian Hu 		},
1501*6f809ca8SJian Hu 		.num_parents = 1,
1502*6f809ca8SJian Hu 		.flags = CLK_SET_RATE_PARENT,
1503*6f809ca8SJian Hu 	},
1504*6f809ca8SJian Hu };
1505*6f809ca8SJian Hu 
1506*6f809ca8SJian Hu static const struct clk_parent_data a9_vid_lock_parents[] = {
1507*6f809ca8SJian Hu 	{ .fw_name = "xtal", },
1508*6f809ca8SJian Hu 	{ .hw = &a9_encoder0.hw },
1509*6f809ca8SJian Hu 	{ .hw = &a9_encoder1.hw }
1510*6f809ca8SJian Hu };
1511*6f809ca8SJian Hu 
1512*6f809ca8SJian Hu static A9_COMP_SEL(vid_lock, VID_LOCK_CLK_CTRL, 9, 0x7, a9_vid_lock_parents, NULL);
1513*6f809ca8SJian Hu static A9_COMP_DIV(vid_lock, VID_LOCK_CLK_CTRL, 0, 7);
1514*6f809ca8SJian Hu static A9_COMP_GATE(vid_lock, VID_LOCK_CLK_CTRL, 8, 0);
1515*6f809ca8SJian Hu 
1516*6f809ca8SJian Hu static const struct clk_parent_data a9_vdin_meas_parents[] = {
1517*6f809ca8SJian Hu 	{ .fw_name = "xtal", },
1518*6f809ca8SJian Hu 	{ .fw_name = "fdiv4", },
1519*6f809ca8SJian Hu 	{ .fw_name = "fdiv3", },
1520*6f809ca8SJian Hu 	{ .fw_name = "fdiv5", }
1521*6f809ca8SJian Hu };
1522*6f809ca8SJian Hu 
1523*6f809ca8SJian Hu static A9_COMP_SEL(vdin_meas, VDIN_MEAS_CLK_CTRL, 9, 0x7, a9_vdin_meas_parents, NULL);
1524*6f809ca8SJian Hu static A9_COMP_DIV(vdin_meas, VDIN_MEAS_CLK_CTRL, 0, 7);
1525*6f809ca8SJian Hu static A9_COMP_GATE(vdin_meas, VDIN_MEAS_CLK_CTRL, 8, 0);
1526*6f809ca8SJian Hu 
1527*6f809ca8SJian Hu static struct clk_regmap a9_vdac_sel = {
1528*6f809ca8SJian Hu 	.data = &(struct clk_regmap_mux_data){
1529*6f809ca8SJian Hu 		.offset = VIID_CLK_DIV,
1530*6f809ca8SJian Hu 		.mask = 0xf,
1531*6f809ca8SJian Hu 		.shift = 28,
1532*6f809ca8SJian Hu 		.table = a9_vid_parents_val_table,
1533*6f809ca8SJian Hu 	},
1534*6f809ca8SJian Hu 	.hw.init = &(struct clk_init_data){
1535*6f809ca8SJian Hu 		.name = "vdac_sel",
1536*6f809ca8SJian Hu 		.ops = &clk_regmap_mux_ops,
1537*6f809ca8SJian Hu 		.parent_hws = a9_vid_parents,
1538*6f809ca8SJian Hu 		.num_parents = ARRAY_SIZE(a9_vid_parents),
1539*6f809ca8SJian Hu 	},
1540*6f809ca8SJian Hu };
1541*6f809ca8SJian Hu 
1542*6f809ca8SJian Hu static struct clk_regmap a9_vdac = {
1543*6f809ca8SJian Hu 	.data = &(struct clk_regmap_gate_data){
1544*6f809ca8SJian Hu 		.offset = VID_CLK_CTRL2,
1545*6f809ca8SJian Hu 		.bit_idx = 4,
1546*6f809ca8SJian Hu 	},
1547*6f809ca8SJian Hu 	.hw.init = &(struct clk_init_data) {
1548*6f809ca8SJian Hu 		.name = "vdac",
1549*6f809ca8SJian Hu 		.ops = &clk_regmap_gate_ops,
1550*6f809ca8SJian Hu 		.parent_hws = (const struct clk_hw *[]) {
1551*6f809ca8SJian Hu 			&a9_vdac_sel.hw
1552*6f809ca8SJian Hu 		},
1553*6f809ca8SJian Hu 		.num_parents = 1,
1554*6f809ca8SJian Hu 		.flags = CLK_SET_RATE_PARENT,
1555*6f809ca8SJian Hu 	},
1556*6f809ca8SJian Hu };
1557*6f809ca8SJian Hu 
1558*6f809ca8SJian Hu static struct clk_regmap a9_hdmitx0_pixel_sel = {
1559*6f809ca8SJian Hu 	.data = &(struct clk_regmap_mux_data){
1560*6f809ca8SJian Hu 		.offset = HDMI_CLK_CTRL,
1561*6f809ca8SJian Hu 		.mask = 0xf,
1562*6f809ca8SJian Hu 		.shift = 16,
1563*6f809ca8SJian Hu 		.table = a9_vid_parents_val_table,
1564*6f809ca8SJian Hu 	},
1565*6f809ca8SJian Hu 	.hw.init = &(struct clk_init_data){
1566*6f809ca8SJian Hu 		.name = "hdmitx0_pixel_sel",
1567*6f809ca8SJian Hu 		.ops = &clk_regmap_mux_ops,
1568*6f809ca8SJian Hu 		.parent_hws = a9_vid_parents,
1569*6f809ca8SJian Hu 		.num_parents = ARRAY_SIZE(a9_vid_parents),
1570*6f809ca8SJian Hu 	},
1571*6f809ca8SJian Hu };
1572*6f809ca8SJian Hu 
1573*6f809ca8SJian Hu static struct clk_regmap a9_hdmitx0_pixel = {
1574*6f809ca8SJian Hu 	.data = &(struct clk_regmap_gate_data){
1575*6f809ca8SJian Hu 		.offset = VID_CLK_CTRL2,
1576*6f809ca8SJian Hu 		.bit_idx = 5,
1577*6f809ca8SJian Hu 	},
1578*6f809ca8SJian Hu 	.hw.init = &(struct clk_init_data) {
1579*6f809ca8SJian Hu 		.name = "hdmitx0_pixel",
1580*6f809ca8SJian Hu 		.ops = &clk_regmap_gate_ops,
1581*6f809ca8SJian Hu 		.parent_hws = (const struct clk_hw *[]) {
1582*6f809ca8SJian Hu 			&a9_hdmitx0_pixel_sel.hw
1583*6f809ca8SJian Hu 		},
1584*6f809ca8SJian Hu 		.num_parents = 1,
1585*6f809ca8SJian Hu 		.flags = CLK_SET_RATE_PARENT,
1586*6f809ca8SJian Hu 	},
1587*6f809ca8SJian Hu };
1588*6f809ca8SJian Hu 
1589*6f809ca8SJian Hu static struct clk_regmap a9_hdmitx0_fe_sel = {
1590*6f809ca8SJian Hu 	.data = &(struct clk_regmap_mux_data){
1591*6f809ca8SJian Hu 		.offset = HDMI_CLK_CTRL,
1592*6f809ca8SJian Hu 		.mask = 0xf,
1593*6f809ca8SJian Hu 		.shift = 20,
1594*6f809ca8SJian Hu 		.table = a9_vid_parents_val_table,
1595*6f809ca8SJian Hu 	},
1596*6f809ca8SJian Hu 	.hw.init = &(struct clk_init_data){
1597*6f809ca8SJian Hu 		.name = "hdmitx0_fe_sel",
1598*6f809ca8SJian Hu 		.ops = &clk_regmap_mux_ops,
1599*6f809ca8SJian Hu 		.parent_hws = a9_vid_parents,
1600*6f809ca8SJian Hu 		.num_parents = ARRAY_SIZE(a9_vid_parents),
1601*6f809ca8SJian Hu 	},
1602*6f809ca8SJian Hu };
1603*6f809ca8SJian Hu 
1604*6f809ca8SJian Hu static struct clk_regmap a9_hdmitx0_fe = {
1605*6f809ca8SJian Hu 	.data = &(struct clk_regmap_gate_data){
1606*6f809ca8SJian Hu 		.offset = VID_CLK_CTRL2,
1607*6f809ca8SJian Hu 		.bit_idx = 9,
1608*6f809ca8SJian Hu 	},
1609*6f809ca8SJian Hu 	.hw.init = &(struct clk_init_data) {
1610*6f809ca8SJian Hu 		.name = "hdmitx0_fe",
1611*6f809ca8SJian Hu 		.ops = &clk_regmap_gate_ops,
1612*6f809ca8SJian Hu 		.parent_hws = (const struct clk_hw *[]) {
1613*6f809ca8SJian Hu 			&a9_hdmitx0_fe_sel.hw
1614*6f809ca8SJian Hu 		},
1615*6f809ca8SJian Hu 		.num_parents = 1,
1616*6f809ca8SJian Hu 		.flags = CLK_SET_RATE_PARENT,
1617*6f809ca8SJian Hu 	},
1618*6f809ca8SJian Hu };
1619*6f809ca8SJian Hu 
1620*6f809ca8SJian Hu static struct clk_regmap a9_hdmitx1_pixel_sel = {
1621*6f809ca8SJian Hu 	.data = &(struct clk_regmap_mux_data){
1622*6f809ca8SJian Hu 		.offset = HDMI_CLK_CTRL,
1623*6f809ca8SJian Hu 		.mask = 0xf,
1624*6f809ca8SJian Hu 		.shift = 24,
1625*6f809ca8SJian Hu 		.table = a9_vid_parents_val_table,
1626*6f809ca8SJian Hu 	},
1627*6f809ca8SJian Hu 	.hw.init = &(struct clk_init_data){
1628*6f809ca8SJian Hu 		.name = "hdmitx1_pixel_sel",
1629*6f809ca8SJian Hu 		.ops = &clk_regmap_mux_ops,
1630*6f809ca8SJian Hu 		.parent_hws = a9_vid_parents,
1631*6f809ca8SJian Hu 		.num_parents = ARRAY_SIZE(a9_vid_parents),
1632*6f809ca8SJian Hu 	},
1633*6f809ca8SJian Hu };
1634*6f809ca8SJian Hu 
1635*6f809ca8SJian Hu static struct clk_regmap a9_hdmitx1_pixel = {
1636*6f809ca8SJian Hu 	.data = &(struct clk_regmap_gate_data){
1637*6f809ca8SJian Hu 		.offset = VID_CLK_CTRL2,
1638*6f809ca8SJian Hu 		.bit_idx = 12,
1639*6f809ca8SJian Hu 	},
1640*6f809ca8SJian Hu 	.hw.init = &(struct clk_init_data) {
1641*6f809ca8SJian Hu 		.name = "hdmitx1_pixel",
1642*6f809ca8SJian Hu 		.ops = &clk_regmap_gate_ops,
1643*6f809ca8SJian Hu 		.parent_hws = (const struct clk_hw *[]) {
1644*6f809ca8SJian Hu 			&a9_hdmitx1_pixel_sel.hw
1645*6f809ca8SJian Hu 		},
1646*6f809ca8SJian Hu 		.num_parents = 1,
1647*6f809ca8SJian Hu 		.flags = CLK_SET_RATE_PARENT,
1648*6f809ca8SJian Hu 	},
1649*6f809ca8SJian Hu };
1650*6f809ca8SJian Hu 
1651*6f809ca8SJian Hu static struct clk_regmap a9_hdmitx1_fe_sel = {
1652*6f809ca8SJian Hu 	.data = &(struct clk_regmap_mux_data){
1653*6f809ca8SJian Hu 		.offset = HDMI_CLK_CTRL,
1654*6f809ca8SJian Hu 		.mask = 0xf,
1655*6f809ca8SJian Hu 		.shift = 28,
1656*6f809ca8SJian Hu 		.table = a9_vid_parents_val_table,
1657*6f809ca8SJian Hu 	},
1658*6f809ca8SJian Hu 	.hw.init = &(struct clk_init_data){
1659*6f809ca8SJian Hu 		.name = "hdmitx1_fe_sel",
1660*6f809ca8SJian Hu 		.ops = &clk_regmap_mux_ops,
1661*6f809ca8SJian Hu 		.parent_hws = a9_vid_parents,
1662*6f809ca8SJian Hu 		.num_parents = ARRAY_SIZE(a9_vid_parents),
1663*6f809ca8SJian Hu 	},
1664*6f809ca8SJian Hu };
1665*6f809ca8SJian Hu 
1666*6f809ca8SJian Hu static struct clk_regmap a9_hdmitx1_fe = {
1667*6f809ca8SJian Hu 	.data = &(struct clk_regmap_gate_data){
1668*6f809ca8SJian Hu 		.offset = VID_CLK_CTRL2,
1669*6f809ca8SJian Hu 		.bit_idx = 13,
1670*6f809ca8SJian Hu 	},
1671*6f809ca8SJian Hu 	.hw.init = &(struct clk_init_data) {
1672*6f809ca8SJian Hu 		.name = "hdmitx1_fe",
1673*6f809ca8SJian Hu 		.ops = &clk_regmap_gate_ops,
1674*6f809ca8SJian Hu 		.parent_hws = (const struct clk_hw *[]) {
1675*6f809ca8SJian Hu 			&a9_hdmitx1_fe_sel.hw
1676*6f809ca8SJian Hu 		},
1677*6f809ca8SJian Hu 		.num_parents = 1,
1678*6f809ca8SJian Hu 		.flags = CLK_SET_RATE_PARENT,
1679*6f809ca8SJian Hu 	},
1680*6f809ca8SJian Hu };
1681*6f809ca8SJian Hu 
1682*6f809ca8SJian Hu static const struct clk_parent_data a9_csi_phy_parents[] = {
1683*6f809ca8SJian Hu 	{ .fw_name = "fdiv2p5", },
1684*6f809ca8SJian Hu 	{ .fw_name = "fdiv3", },
1685*6f809ca8SJian Hu 	{ .fw_name = "fdiv4", },
1686*6f809ca8SJian Hu 	{ .fw_name = "fdiv5", },
1687*6f809ca8SJian Hu 	{ .fw_name = "gp0", },
1688*6f809ca8SJian Hu 	{ .fw_name = "hifi0", },
1689*6f809ca8SJian Hu 	{ .fw_name = "fdiv2", },
1690*6f809ca8SJian Hu 	{ .fw_name = "xtal", }
1691*6f809ca8SJian Hu };
1692*6f809ca8SJian Hu 
1693*6f809ca8SJian Hu static A9_COMP_SEL(csi_phy, MIPI_CSI_PHY_CLK_CTRL, 9, 0x7, a9_csi_phy_parents, NULL);
1694*6f809ca8SJian Hu static A9_COMP_DIV(csi_phy, MIPI_CSI_PHY_CLK_CTRL, 0, 7);
1695*6f809ca8SJian Hu static A9_COMP_GATE(csi_phy, MIPI_CSI_PHY_CLK_CTRL, 8, 0);
1696*6f809ca8SJian Hu 
1697*6f809ca8SJian Hu static const struct clk_parent_data a9_dsi_meas_parents[] = {
1698*6f809ca8SJian Hu 	{ .fw_name = "xtal", },
1699*6f809ca8SJian Hu 	{ .fw_name = "fdiv4", },
1700*6f809ca8SJian Hu 	{ .fw_name = "fdiv3", },
1701*6f809ca8SJian Hu 	{ .fw_name = "fdiv5", },
1702*6f809ca8SJian Hu 	{ .hw = &a9_vid_pll.hw },
1703*6f809ca8SJian Hu 	{ .fw_name = "gp0", },
1704*6f809ca8SJian Hu 	{ .fw_name = "vid1", },
1705*6f809ca8SJian Hu 	{ .fw_name = "vid2", }
1706*6f809ca8SJian Hu };
1707*6f809ca8SJian Hu 
1708*6f809ca8SJian Hu static A9_COMP_SEL(dsi0_meas, DSI_MEAS_CLK_CTRL, 9, 0x7, a9_dsi_meas_parents, NULL);
1709*6f809ca8SJian Hu static A9_COMP_DIV(dsi0_meas, DSI_MEAS_CLK_CTRL, 0, 7);
1710*6f809ca8SJian Hu static A9_COMP_GATE(dsi0_meas, DSI_MEAS_CLK_CTRL, 8, 0);
1711*6f809ca8SJian Hu 
1712*6f809ca8SJian Hu static A9_COMP_SEL(dsi1_meas, DSI_MEAS_CLK_CTRL, 25, 0x7, a9_dsi_meas_parents, NULL);
1713*6f809ca8SJian Hu static A9_COMP_DIV(dsi1_meas, DSI_MEAS_CLK_CTRL, 16, 7);
1714*6f809ca8SJian Hu static A9_COMP_GATE(dsi1_meas, DSI_MEAS_CLK_CTRL, 24, 0);
1715*6f809ca8SJian Hu 
1716*6f809ca8SJian Hu static struct clk_hw *a9_peripherals_hw_clks[] = {
1717*6f809ca8SJian Hu 	[CLKID_SYS_AM_AXI]		= &a9_sys_am_axi.hw,
1718*6f809ca8SJian Hu 	[CLKID_SYS_DOS]			= &a9_sys_dos.hw,
1719*6f809ca8SJian Hu 	[CLKID_SYS_MIPI_DSI0]		= &a9_sys_mipi_dsi0.hw,
1720*6f809ca8SJian Hu 	[CLKID_SYS_ETH_PHY]		= &a9_sys_eth_phy.hw,
1721*6f809ca8SJian Hu 	[CLKID_SYS_AMFC]		= &a9_sys_amfc.hw,
1722*6f809ca8SJian Hu 	[CLKID_SYS_MALI]		= &a9_sys_mali.hw,
1723*6f809ca8SJian Hu 	[CLKID_SYS_NNA]			= &a9_sys_nna.hw,
1724*6f809ca8SJian Hu 	[CLKID_SYS_ETH_AXI]		= &a9_sys_eth_axi.hw,
1725*6f809ca8SJian Hu 	[CLKID_SYS_DP_APB]		= &a9_sys_dp_apb.hw,
1726*6f809ca8SJian Hu 	[CLKID_SYS_EDPTX_APB]		= &a9_sys_edptx_apb.hw,
1727*6f809ca8SJian Hu 	[CLKID_SYS_U3HSG]		= &a9_sys_u3hsg.hw,
1728*6f809ca8SJian Hu 	[CLKID_SYS_AUCPU]		= &a9_sys_aucpu.hw,
1729*6f809ca8SJian Hu 	[CLKID_SYS_GLB]			= &a9_sys_glb.hw,
1730*6f809ca8SJian Hu 	[CLKID_SYS_COMBO_DPHY_APB]	= &a9_sys_combo_dphy_apb.hw,
1731*6f809ca8SJian Hu 	[CLKID_SYS_HDMIRX_APB]		= &a9_sys_hdmirx_apb.hw,
1732*6f809ca8SJian Hu 	[CLKID_SYS_HDMIRX_PCLK]		= &a9_sys_hdmirx_pclk.hw,
1733*6f809ca8SJian Hu 	[CLKID_SYS_MIPI_DSI0_PHY]	= &a9_sys_mipi_dsi0_phy.hw,
1734*6f809ca8SJian Hu 	[CLKID_SYS_CAN0]		= &a9_sys_can0.hw,
1735*6f809ca8SJian Hu 	[CLKID_SYS_CAN1]		= &a9_sys_can1.hw,
1736*6f809ca8SJian Hu 	[CLKID_SYS_SD_EMMC_A]		= &a9_sys_sd_emmc_a.hw,
1737*6f809ca8SJian Hu 	[CLKID_SYS_SD_EMMC_B]		= &a9_sys_sd_emmc_b.hw,
1738*6f809ca8SJian Hu 	[CLKID_SYS_SD_EMMC_C]		= &a9_sys_sd_emmc_c.hw,
1739*6f809ca8SJian Hu 	[CLKID_SYS_SC]			= &a9_sys_sc.hw,
1740*6f809ca8SJian Hu 	[CLKID_SYS_ACODEC]		= &a9_sys_acodec.hw,
1741*6f809ca8SJian Hu 	[CLKID_SYS_MIPI_ISP]		= &a9_sys_mipi_isp.hw,
1742*6f809ca8SJian Hu 	[CLKID_SYS_MSR]			= &a9_sys_msr.hw,
1743*6f809ca8SJian Hu 	[CLKID_SYS_AUDIO]		= &a9_sys_audio.hw,
1744*6f809ca8SJian Hu 	[CLKID_SYS_MIPI_DSI1]		= &a9_sys_mipi_dsi1.hw,
1745*6f809ca8SJian Hu 	[CLKID_SYS_MIPI_DSI1_PHY]	= &a9_sys_mipi_dsi1_phy.hw,
1746*6f809ca8SJian Hu 	[CLKID_SYS_ETH]			= &a9_sys_eth.hw,
1747*6f809ca8SJian Hu 	[CLKID_SYS_ETH_1G_MAC]		= &a9_sys_eth_1g_mac.hw,
1748*6f809ca8SJian Hu 	[CLKID_SYS_UART_A]		= &a9_sys_uart_a.hw,
1749*6f809ca8SJian Hu 	[CLKID_SYS_UART_F]		= &a9_sys_uart_f.hw,
1750*6f809ca8SJian Hu 	[CLKID_SYS_TS_A55]		= &a9_sys_ts_a55.hw,
1751*6f809ca8SJian Hu 	[CLKID_SYS_ETH_1G_AXI]		= &a9_sys_eth_1g_axi.hw,
1752*6f809ca8SJian Hu 	[CLKID_SYS_TS_DOS]		= &a9_sys_ts_dos.hw,
1753*6f809ca8SJian Hu 	[CLKID_SYS_U3DRD_B]		= &a9_sys_u3drd_b.hw,
1754*6f809ca8SJian Hu 	[CLKID_SYS_TS_CORE]		= &a9_sys_ts_core.hw,
1755*6f809ca8SJian Hu 	[CLKID_SYS_TS_PLL]		= &a9_sys_ts_pll.hw,
1756*6f809ca8SJian Hu 	[CLKID_SYS_CSI_DIG_CLKIN]	= &a9_sys_csi_dig_clkin.hw,
1757*6f809ca8SJian Hu 	[CLKID_SYS_CVE]			= &a9_sys_cve.hw,
1758*6f809ca8SJian Hu 	[CLKID_SYS_GE2D]		= &a9_sys_ge2d.hw,
1759*6f809ca8SJian Hu 	[CLKID_SYS_SPISG]		= &a9_sys_spisg.hw,
1760*6f809ca8SJian Hu 	[CLKID_SYS_U2H]			= &a9_sys_u2h.hw,
1761*6f809ca8SJian Hu 	[CLKID_SYS_PCIE_MAC_A]		= &a9_sys_pcie_mac_a.hw,
1762*6f809ca8SJian Hu 	[CLKID_SYS_U3DRD_A]		= &a9_sys_u3drd_a.hw,
1763*6f809ca8SJian Hu 	[CLKID_SYS_U2DRD]		= &a9_sys_u2drd.hw,
1764*6f809ca8SJian Hu 	[CLKID_SYS_PCIE_PHY]		= &a9_sys_pcie_phy.hw,
1765*6f809ca8SJian Hu 	[CLKID_SYS_PCIE_MAC_B]		= &a9_sys_pcie_mac_b.hw,
1766*6f809ca8SJian Hu 	[CLKID_SYS_PERIPH]		= &a9_sys_periph.hw,
1767*6f809ca8SJian Hu 	[CLKID_SYS_PIO]			= &a9_sys_pio.hw,
1768*6f809ca8SJian Hu 	[CLKID_SYS_I3C]			= &a9_sys_i3c.hw,
1769*6f809ca8SJian Hu 	[CLKID_SYS_I2C_M_E]		= &a9_sys_i2c_m_e.hw,
1770*6f809ca8SJian Hu 	[CLKID_SYS_I2C_M_F]		= &a9_sys_i2c_m_f.hw,
1771*6f809ca8SJian Hu 	[CLKID_SYS_HDMITX_APB]		= &a9_sys_hdmitx_apb.hw,
1772*6f809ca8SJian Hu 	[CLKID_SYS_I2C_M_I]		= &a9_sys_i2c_m_i.hw,
1773*6f809ca8SJian Hu 	[CLKID_SYS_I2C_M_G]		= &a9_sys_i2c_m_g.hw,
1774*6f809ca8SJian Hu 	[CLKID_SYS_I2C_M_H]		= &a9_sys_i2c_m_h.hw,
1775*6f809ca8SJian Hu 	[CLKID_SYS_HDMI20_AES]		= &a9_sys_hdmi20_aes.hw,
1776*6f809ca8SJian Hu 	[CLKID_SYS_CSI2_HOST]		= &a9_sys_csi2_host.hw,
1777*6f809ca8SJian Hu 	[CLKID_SYS_CSI2_ADAPT]		= &a9_sys_csi2_adapt.hw,
1778*6f809ca8SJian Hu 	[CLKID_SYS_DSPA]		= &a9_sys_dspa.hw,
1779*6f809ca8SJian Hu 	[CLKID_SYS_PP_DMA]		= &a9_sys_pp_dma.hw,
1780*6f809ca8SJian Hu 	[CLKID_SYS_PP_WRAPPER]		= &a9_sys_pp_wrapper.hw,
1781*6f809ca8SJian Hu 	[CLKID_SYS_VPU_INTR]		= &a9_sys_vpu_intr.hw,
1782*6f809ca8SJian Hu 	[CLKID_SYS_CSI2_PHY]		= &a9_sys_csi2_phy.hw,
1783*6f809ca8SJian Hu 	[CLKID_SYS_SARADC]		= &a9_sys_saradc.hw,
1784*6f809ca8SJian Hu 	[CLKID_SYS_PWM_J]		= &a9_sys_pwm_j.hw,
1785*6f809ca8SJian Hu 	[CLKID_SYS_PWM_I]		= &a9_sys_pwm_i.hw,
1786*6f809ca8SJian Hu 	[CLKID_SYS_PWM_H]		= &a9_sys_pwm_h.hw,
1787*6f809ca8SJian Hu 	[CLKID_SYS_PWM_N]		= &a9_sys_pwm_n.hw,
1788*6f809ca8SJian Hu 	[CLKID_SYS_PWM_M]		= &a9_sys_pwm_m.hw,
1789*6f809ca8SJian Hu 	[CLKID_SYS_PWM_L]		= &a9_sys_pwm_l.hw,
1790*6f809ca8SJian Hu 	[CLKID_SYS_PWM_K]		= &a9_sys_pwm_k.hw,
1791*6f809ca8SJian Hu 	[CLKID_SD_EMMC_A_SEL]		= &a9_sd_emmc_a_sel.hw,
1792*6f809ca8SJian Hu 	[CLKID_SD_EMMC_A_DIV]		= &a9_sd_emmc_a_div.hw,
1793*6f809ca8SJian Hu 	[CLKID_SD_EMMC_A]		= &a9_sd_emmc_a.hw,
1794*6f809ca8SJian Hu 	[CLKID_SD_EMMC_B_SEL]		= &a9_sd_emmc_b_sel.hw,
1795*6f809ca8SJian Hu 	[CLKID_SD_EMMC_B_DIV]		= &a9_sd_emmc_b_div.hw,
1796*6f809ca8SJian Hu 	[CLKID_SD_EMMC_B]		= &a9_sd_emmc_b.hw,
1797*6f809ca8SJian Hu 	[CLKID_SD_EMMC_C_SEL]		= &a9_sd_emmc_c_sel.hw,
1798*6f809ca8SJian Hu 	[CLKID_SD_EMMC_C_DIV]		= &a9_sd_emmc_c_div.hw,
1799*6f809ca8SJian Hu 	[CLKID_SD_EMMC_C]		= &a9_sd_emmc_c.hw,
1800*6f809ca8SJian Hu 	[CLKID_PWM_H_SEL]		= &a9_pwm_h_sel.hw,
1801*6f809ca8SJian Hu 	[CLKID_PWM_H_DIV]		= &a9_pwm_h_div.hw,
1802*6f809ca8SJian Hu 	[CLKID_PWM_H]			= &a9_pwm_h.hw,
1803*6f809ca8SJian Hu 	[CLKID_PWM_I_SEL]		= &a9_pwm_i_sel.hw,
1804*6f809ca8SJian Hu 	[CLKID_PWM_I_DIV]		= &a9_pwm_i_div.hw,
1805*6f809ca8SJian Hu 	[CLKID_PWM_I]			= &a9_pwm_i.hw,
1806*6f809ca8SJian Hu 	[CLKID_PWM_J_SEL]		= &a9_pwm_j_sel.hw,
1807*6f809ca8SJian Hu 	[CLKID_PWM_J_DIV]		= &a9_pwm_j_div.hw,
1808*6f809ca8SJian Hu 	[CLKID_PWM_J]			= &a9_pwm_j.hw,
1809*6f809ca8SJian Hu 	[CLKID_PWM_K_SEL]		= &a9_pwm_k_sel.hw,
1810*6f809ca8SJian Hu 	[CLKID_PWM_K_DIV]		= &a9_pwm_k_div.hw,
1811*6f809ca8SJian Hu 	[CLKID_PWM_K]			= &a9_pwm_k.hw,
1812*6f809ca8SJian Hu 	[CLKID_PWM_L_SEL]		= &a9_pwm_l_sel.hw,
1813*6f809ca8SJian Hu 	[CLKID_PWM_L_DIV]		= &a9_pwm_l_div.hw,
1814*6f809ca8SJian Hu 	[CLKID_PWM_L]			= &a9_pwm_l.hw,
1815*6f809ca8SJian Hu 	[CLKID_PWM_M_SEL]		= &a9_pwm_m_sel.hw,
1816*6f809ca8SJian Hu 	[CLKID_PWM_M_DIV]		= &a9_pwm_m_div.hw,
1817*6f809ca8SJian Hu 	[CLKID_PWM_M]			= &a9_pwm_m.hw,
1818*6f809ca8SJian Hu 	[CLKID_PWM_N_SEL]		= &a9_pwm_n_sel.hw,
1819*6f809ca8SJian Hu 	[CLKID_PWM_N_DIV]		= &a9_pwm_n_div.hw,
1820*6f809ca8SJian Hu 	[CLKID_PWM_N]			= &a9_pwm_n.hw,
1821*6f809ca8SJian Hu 	[CLKID_SPISG0_SEL]		= &a9_spisg0_sel.hw,
1822*6f809ca8SJian Hu 	[CLKID_SPISG0_DIV]		= &a9_spisg0_div.hw,
1823*6f809ca8SJian Hu 	[CLKID_SPISG0]			= &a9_spisg0.hw,
1824*6f809ca8SJian Hu 	[CLKID_SPISG1_SEL]		= &a9_spisg1_sel.hw,
1825*6f809ca8SJian Hu 	[CLKID_SPISG1_DIV]		= &a9_spisg1_div.hw,
1826*6f809ca8SJian Hu 	[CLKID_SPISG1]			= &a9_spisg1.hw,
1827*6f809ca8SJian Hu 	[CLKID_SPISG2_SEL]		= &a9_spisg2_sel.hw,
1828*6f809ca8SJian Hu 	[CLKID_SPISG2_DIV]		= &a9_spisg2_div.hw,
1829*6f809ca8SJian Hu 	[CLKID_SPISG2]			= &a9_spisg2.hw,
1830*6f809ca8SJian Hu 	[CLKID_SARADC_SEL]		= &a9_saradc_sel.hw,
1831*6f809ca8SJian Hu 	[CLKID_SARADC_DIV]		= &a9_saradc_div.hw,
1832*6f809ca8SJian Hu 	[CLKID_SARADC]			= &a9_saradc.hw,
1833*6f809ca8SJian Hu 	[CLKID_AMFC_SEL]		= &a9_amfc_sel.hw,
1834*6f809ca8SJian Hu 	[CLKID_AMFC_DIV]		= &a9_amfc_div.hw,
1835*6f809ca8SJian Hu 	[CLKID_AMFC]			= &a9_amfc.hw,
1836*6f809ca8SJian Hu 	[CLKID_NNA_SEL]			= &a9_nna_sel.hw,
1837*6f809ca8SJian Hu 	[CLKID_NNA_DIV]			= &a9_nna_div.hw,
1838*6f809ca8SJian Hu 	[CLKID_NNA]			= &a9_nna.hw,
1839*6f809ca8SJian Hu 	[CLKID_USB_250M_SEL]		= &a9_usb_250m_sel.hw,
1840*6f809ca8SJian Hu 	[CLKID_USB_250M_DIV]		= &a9_usb_250m_div.hw,
1841*6f809ca8SJian Hu 	[CLKID_USB_250M]		= &a9_usb_250m.hw,
1842*6f809ca8SJian Hu 	[CLKID_USB_48M_PRE_SEL]		= &a9_usb_48m_pre_sel.hw,
1843*6f809ca8SJian Hu 	[CLKID_USB_48M_PRE_DIV]		= &a9_usb_48m_pre_div.hw,
1844*6f809ca8SJian Hu 	[CLKID_USB_48M_PRE]		= &a9_usb_48m_pre.hw,
1845*6f809ca8SJian Hu 	[CLKID_PCIE0_TL_SEL]		= &a9_pcie0_tl_sel.hw,
1846*6f809ca8SJian Hu 	[CLKID_PCIE0_TL_DIV]		= &a9_pcie0_tl_div.hw,
1847*6f809ca8SJian Hu 	[CLKID_PCIE0_TL]		= &a9_pcie0_tl.hw,
1848*6f809ca8SJian Hu 	[CLKID_PCIE1_TL_SEL]		= &a9_pcie1_tl_sel.hw,
1849*6f809ca8SJian Hu 	[CLKID_PCIE1_TL_DIV]		= &a9_pcie1_tl_div.hw,
1850*6f809ca8SJian Hu 	[CLKID_PCIE1_TL]		= &a9_pcie1_tl.hw,
1851*6f809ca8SJian Hu 	[CLKID_CMPR_SEL]		= &a9_cmpr_sel.hw,
1852*6f809ca8SJian Hu 	[CLKID_CMPR_DIV]		= &a9_cmpr_div.hw,
1853*6f809ca8SJian Hu 	[CLKID_CMPR]			= &a9_cmpr.hw,
1854*6f809ca8SJian Hu 	[CLKID_DEWARPA_SEL]		= &a9_dewarpa_sel.hw,
1855*6f809ca8SJian Hu 	[CLKID_DEWARPA_DIV]		= &a9_dewarpa_div.hw,
1856*6f809ca8SJian Hu 	[CLKID_DEWARPA]			= &a9_dewarpa.hw,
1857*6f809ca8SJian Hu 	[CLKID_SC_PRE_SEL]		= &a9_sc_pre_sel.hw,
1858*6f809ca8SJian Hu 	[CLKID_SC_PRE_DIV]		= &a9_sc_pre_div.hw,
1859*6f809ca8SJian Hu 	[CLKID_SC_PRE]			= &a9_sc_pre.hw,
1860*6f809ca8SJian Hu 	[CLKID_SC]			= &a9_sc.hw,
1861*6f809ca8SJian Hu 	[CLKID_DPTX_APB2_SEL]		= &a9_dptx_apb2_sel.hw,
1862*6f809ca8SJian Hu 	[CLKID_DPTX_APB2_DIV]		= &a9_dptx_apb2_div.hw,
1863*6f809ca8SJian Hu 	[CLKID_DPTX_APB2]		= &a9_dptx_apb2.hw,
1864*6f809ca8SJian Hu 	[CLKID_DPTX_AUD_SEL]		= &a9_dptx_aud_sel.hw,
1865*6f809ca8SJian Hu 	[CLKID_DPTX_AUD_DIV]		= &a9_dptx_aud_div.hw,
1866*6f809ca8SJian Hu 	[CLKID_DPTX_AUD]		= &a9_dptx_aud.hw,
1867*6f809ca8SJian Hu 	[CLKID_ISP_SEL]			= &a9_isp_sel.hw,
1868*6f809ca8SJian Hu 	[CLKID_ISP_DIV]			= &a9_isp_div.hw,
1869*6f809ca8SJian Hu 	[CLKID_ISP]			= &a9_isp.hw,
1870*6f809ca8SJian Hu 	[CLKID_CVE_SEL]			= &a9_cve_sel.hw,
1871*6f809ca8SJian Hu 	[CLKID_CVE_DIV]			= &a9_cve_div.hw,
1872*6f809ca8SJian Hu 	[CLKID_CVE]			= &a9_cve.hw,
1873*6f809ca8SJian Hu 	[CLKID_VGE_SEL]			= &a9_vge_sel.hw,
1874*6f809ca8SJian Hu 	[CLKID_VGE_DIV]			= &a9_vge_div.hw,
1875*6f809ca8SJian Hu 	[CLKID_VGE]			= &a9_vge.hw,
1876*6f809ca8SJian Hu 	[CLKID_PP_SEL]			= &a9_pp_sel.hw,
1877*6f809ca8SJian Hu 	[CLKID_PP_DIV]			= &a9_pp_div.hw,
1878*6f809ca8SJian Hu 	[CLKID_PP]			= &a9_pp.hw,
1879*6f809ca8SJian Hu 	[CLKID_GLB_SEL]			= &a9_glb_sel.hw,
1880*6f809ca8SJian Hu 	[CLKID_GLB_DIV]			= &a9_glb_div.hw,
1881*6f809ca8SJian Hu 	[CLKID_GLB]			= &a9_glb.hw,
1882*6f809ca8SJian Hu 	[CLKID_USB_48M_DUALDIV_IN]	= &a9_usb_48m_dualdiv_in.hw,
1883*6f809ca8SJian Hu 	[CLKID_USB_48M_DUALDIV_DIV]	= &a9_usb_48m_dualdiv_div.hw,
1884*6f809ca8SJian Hu 	[CLKID_USB_48M_DUALDIV_SEL]	= &a9_usb_48m_dualdiv_sel.hw,
1885*6f809ca8SJian Hu 	[CLKID_USB_48M_DUALDIV]		= &a9_usb_48m_dualdiv.hw,
1886*6f809ca8SJian Hu 	[CLKID_USB_48M]			= &a9_usb_48m.hw,
1887*6f809ca8SJian Hu 	[CLKID_CAN0_PE_SEL]		= &a9_can0_pe_sel.hw,
1888*6f809ca8SJian Hu 	[CLKID_CAN0_PE_DIV]		= &a9_can0_pe_div.hw,
1889*6f809ca8SJian Hu 	[CLKID_CAN0_PE]			= &a9_can0_pe.hw,
1890*6f809ca8SJian Hu 	[CLKID_CAN1_PE_SEL]		= &a9_can1_pe_sel.hw,
1891*6f809ca8SJian Hu 	[CLKID_CAN1_PE_DIV]		= &a9_can1_pe_div.hw,
1892*6f809ca8SJian Hu 	[CLKID_CAN1_PE]			= &a9_can1_pe.hw,
1893*6f809ca8SJian Hu 	[CLKID_CAN0_FILTER_SEL]		= &a9_can0_filter_sel.hw,
1894*6f809ca8SJian Hu 	[CLKID_CAN0_FILTER_DIV]		= &a9_can0_filter_div.hw,
1895*6f809ca8SJian Hu 	[CLKID_CAN0_FILTER]		= &a9_can0_filter.hw,
1896*6f809ca8SJian Hu 	[CLKID_CAN1_FILTER_SEL]		= &a9_can1_filter_sel.hw,
1897*6f809ca8SJian Hu 	[CLKID_CAN1_FILTER_DIV]		= &a9_can1_filter_div.hw,
1898*6f809ca8SJian Hu 	[CLKID_CAN1_FILTER]		= &a9_can1_filter.hw,
1899*6f809ca8SJian Hu 	[CLKID_I3C_SEL]			= &a9_i3c_sel.hw,
1900*6f809ca8SJian Hu 	[CLKID_I3C_DIV]			= &a9_i3c_div.hw,
1901*6f809ca8SJian Hu 	[CLKID_I3C]			= &a9_i3c.hw,
1902*6f809ca8SJian Hu 	[CLKID_TS_DIV]			= &a9_ts_div.hw,
1903*6f809ca8SJian Hu 	[CLKID_TS]			= &a9_ts.hw,
1904*6f809ca8SJian Hu 	[CLKID_ETH_125M_DIV]		= &a9_eth_125m_div.hw,
1905*6f809ca8SJian Hu 	[CLKID_ETH_125M]		= &a9_eth_125m.hw,
1906*6f809ca8SJian Hu 	[CLKID_ETH_RMII_SEL]		= &a9_eth_rmii_sel.hw,
1907*6f809ca8SJian Hu 	[CLKID_ETH_RMII_DIV]		= &a9_eth_rmii_div.hw,
1908*6f809ca8SJian Hu 	[CLKID_ETH_RMII]		= &a9_eth_rmii.hw,
1909*6f809ca8SJian Hu 	[CLKID_GEN_SEL]			= &a9_gen_sel.hw,
1910*6f809ca8SJian Hu 	[CLKID_GEN_DIV]			= &a9_gen_div.hw,
1911*6f809ca8SJian Hu 	[CLKID_GEN]			= &a9_gen.hw,
1912*6f809ca8SJian Hu 	[CLKID_CLK24M_IN]		= &a9_24m_in.hw,
1913*6f809ca8SJian Hu 	[CLKID_CLK12_24M]		= &a9_12_24m.hw,
1914*6f809ca8SJian Hu 	[CLKID_MALI_0_SEL]		= &a9_mali_0_sel.hw,
1915*6f809ca8SJian Hu 	[CLKID_MALI_0_DIV]		= &a9_mali_0_div.hw,
1916*6f809ca8SJian Hu 	[CLKID_MALI_0]			= &a9_mali_0.hw,
1917*6f809ca8SJian Hu 	[CLKID_MALI_1_SEL]		= &a9_mali_1_sel.hw,
1918*6f809ca8SJian Hu 	[CLKID_MALI_1_DIV]		= &a9_mali_1_div.hw,
1919*6f809ca8SJian Hu 	[CLKID_MALI_1]			= &a9_mali_1.hw,
1920*6f809ca8SJian Hu 	[CLKID_MALI]			= &a9_mali.hw,
1921*6f809ca8SJian Hu 	[CLKID_MALI_STACK_0_SEL]	= &a9_mali_stack_0_sel.hw,
1922*6f809ca8SJian Hu 	[CLKID_MALI_STACK_0_DIV]	= &a9_mali_stack_0_div.hw,
1923*6f809ca8SJian Hu 	[CLKID_MALI_STACK_0]		= &a9_mali_stack_0.hw,
1924*6f809ca8SJian Hu 	[CLKID_MALI_STACK_1_SEL]	= &a9_mali_stack_1_sel.hw,
1925*6f809ca8SJian Hu 	[CLKID_MALI_STACK_1_DIV]	= &a9_mali_stack_1_div.hw,
1926*6f809ca8SJian Hu 	[CLKID_MALI_STACK_1]		= &a9_mali_stack_1.hw,
1927*6f809ca8SJian Hu 	[CLKID_MALI_STACK]		= &a9_mali_stack.hw,
1928*6f809ca8SJian Hu 	[CLKID_DSPA_0_SEL]		= &a9_dspa_0_sel.hw,
1929*6f809ca8SJian Hu 	[CLKID_DSPA_0_DIV]		= &a9_dspa_0_div.hw,
1930*6f809ca8SJian Hu 	[CLKID_DSPA_0]			= &a9_dspa_0.hw,
1931*6f809ca8SJian Hu 	[CLKID_DSPA_1_SEL]		= &a9_dspa_1_sel.hw,
1932*6f809ca8SJian Hu 	[CLKID_DSPA_1_DIV]		= &a9_dspa_1_div.hw,
1933*6f809ca8SJian Hu 	[CLKID_DSPA_1]			= &a9_dspa_1.hw,
1934*6f809ca8SJian Hu 	[CLKID_DSPA]			= &a9_dspa.hw,
1935*6f809ca8SJian Hu 	[CLKID_HEVCF_0_SEL]		= &a9_hevcf_0_sel.hw,
1936*6f809ca8SJian Hu 	[CLKID_HEVCF_0_DIV]		= &a9_hevcf_0_div.hw,
1937*6f809ca8SJian Hu 	[CLKID_HEVCF_0]			= &a9_hevcf_0.hw,
1938*6f809ca8SJian Hu 	[CLKID_HEVCF_1_SEL]		= &a9_hevcf_1_sel.hw,
1939*6f809ca8SJian Hu 	[CLKID_HEVCF_1_DIV]		= &a9_hevcf_1_div.hw,
1940*6f809ca8SJian Hu 	[CLKID_HEVCF_1]			= &a9_hevcf_1.hw,
1941*6f809ca8SJian Hu 	[CLKID_HEVCF]			= &a9_hevcf.hw,
1942*6f809ca8SJian Hu 	[CLKID_HCODEC_0_SEL]		= &a9_hcodec_0_sel.hw,
1943*6f809ca8SJian Hu 	[CLKID_HCODEC_0_DIV]		= &a9_hcodec_0_div.hw,
1944*6f809ca8SJian Hu 	[CLKID_HCODEC_0]		= &a9_hcodec_0.hw,
1945*6f809ca8SJian Hu 	[CLKID_HCODEC_1_SEL]		= &a9_hcodec_1_sel.hw,
1946*6f809ca8SJian Hu 	[CLKID_HCODEC_1_DIV]		= &a9_hcodec_1_div.hw,
1947*6f809ca8SJian Hu 	[CLKID_HCODEC_1]		= &a9_hcodec_1.hw,
1948*6f809ca8SJian Hu 	[CLKID_HCODEC]			= &a9_hcodec.hw,
1949*6f809ca8SJian Hu 	[CLKID_VPU_0_SEL]		= &a9_vpu_0_sel.hw,
1950*6f809ca8SJian Hu 	[CLKID_VPU_0_DIV]		= &a9_vpu_0_div.hw,
1951*6f809ca8SJian Hu 	[CLKID_VPU_0]			= &a9_vpu_0.hw,
1952*6f809ca8SJian Hu 	[CLKID_VPU_1_SEL]		= &a9_vpu_1_sel.hw,
1953*6f809ca8SJian Hu 	[CLKID_VPU_1_DIV]		= &a9_vpu_1_div.hw,
1954*6f809ca8SJian Hu 	[CLKID_VPU_1]			= &a9_vpu_1.hw,
1955*6f809ca8SJian Hu 	[CLKID_VPU]			= &a9_vpu.hw,
1956*6f809ca8SJian Hu 	[CLKID_VAPB_0_SEL]		= &a9_vapb_0_sel.hw,
1957*6f809ca8SJian Hu 	[CLKID_VAPB_0_DIV]		= &a9_vapb_0_div.hw,
1958*6f809ca8SJian Hu 	[CLKID_VAPB_0]			= &a9_vapb_0.hw,
1959*6f809ca8SJian Hu 	[CLKID_VAPB_1_SEL]		= &a9_vapb_1_sel.hw,
1960*6f809ca8SJian Hu 	[CLKID_VAPB_1_DIV]		= &a9_vapb_1_div.hw,
1961*6f809ca8SJian Hu 	[CLKID_VAPB_1]			= &a9_vapb_1.hw,
1962*6f809ca8SJian Hu 	[CLKID_VAPB]			= &a9_vapb.hw,
1963*6f809ca8SJian Hu 	[CLKID_GE2D]			= &a9_ge2d.hw,
1964*6f809ca8SJian Hu 	[CLKID_VPU_CLKB_TMP_SEL]	= &a9_vpu_clkb_tmp_sel.hw,
1965*6f809ca8SJian Hu 	[CLKID_VPU_CLKB_TMP_DIV]	= &a9_vpu_clkb_tmp_div.hw,
1966*6f809ca8SJian Hu 	[CLKID_VPU_CLKB_TMP]		= &a9_vpu_clkb_tmp.hw,
1967*6f809ca8SJian Hu 	[CLKID_VPU_CLKB_DIV]		= &a9_vpu_clkb_div.hw,
1968*6f809ca8SJian Hu 	[CLKID_VPU_CLKB]		= &a9_vpu_clkb.hw,
1969*6f809ca8SJian Hu 	[CLKID_HDMITX_SYS_SEL]		= &a9_hdmitx_sys_sel.hw,
1970*6f809ca8SJian Hu 	[CLKID_HDMITX_SYS_DIV]		= &a9_hdmitx_sys_div.hw,
1971*6f809ca8SJian Hu 	[CLKID_HDMITX_SYS]		= &a9_hdmitx_sys.hw,
1972*6f809ca8SJian Hu 	[CLKID_HDMITX_PRIF_SEL]		= &a9_hdmitx_prif_sel.hw,
1973*6f809ca8SJian Hu 	[CLKID_HDMITX_PRIF_DIV]		= &a9_hdmitx_prif_div.hw,
1974*6f809ca8SJian Hu 	[CLKID_HDMITX_PRIF]		= &a9_hdmitx_prif.hw,
1975*6f809ca8SJian Hu 	[CLKID_HDMITX_200M_SEL]		= &a9_hdmitx_200m_sel.hw,
1976*6f809ca8SJian Hu 	[CLKID_HDMITX_200M_DIV]		= &a9_hdmitx_200m_div.hw,
1977*6f809ca8SJian Hu 	[CLKID_HDMITX_200M]		= &a9_hdmitx_200m.hw,
1978*6f809ca8SJian Hu 	[CLKID_HDMITX_AUD_SEL]		= &a9_hdmitx_aud_sel.hw,
1979*6f809ca8SJian Hu 	[CLKID_HDMITX_AUD_DIV]		= &a9_hdmitx_aud_div.hw,
1980*6f809ca8SJian Hu 	[CLKID_HDMITX_AUD]		= &a9_hdmitx_aud.hw,
1981*6f809ca8SJian Hu 	[CLKID_HDMIRX_5M_SEL]		= &a9_hdmirx_5m_sel.hw,
1982*6f809ca8SJian Hu 	[CLKID_HDMIRX_5M_DIV]		= &a9_hdmirx_5m_div.hw,
1983*6f809ca8SJian Hu 	[CLKID_HDMIRX_5M]		= &a9_hdmirx_5m.hw,
1984*6f809ca8SJian Hu 	[CLKID_HDMIRX_2M_SEL]		= &a9_hdmirx_2m_sel.hw,
1985*6f809ca8SJian Hu 	[CLKID_HDMIRX_2M_DIV]		= &a9_hdmirx_2m_div.hw,
1986*6f809ca8SJian Hu 	[CLKID_HDMIRX_2M]		= &a9_hdmirx_2m.hw,
1987*6f809ca8SJian Hu 	[CLKID_HDMIRX_CFG_SEL]		= &a9_hdmirx_cfg_sel.hw,
1988*6f809ca8SJian Hu 	[CLKID_HDMIRX_CFG_DIV]		= &a9_hdmirx_cfg_div.hw,
1989*6f809ca8SJian Hu 	[CLKID_HDMIRX_CFG]		= &a9_hdmirx_cfg.hw,
1990*6f809ca8SJian Hu 	[CLKID_HDMIRX_HDCP2X_SEL]	= &a9_hdmirx_hdcp2x_sel.hw,
1991*6f809ca8SJian Hu 	[CLKID_HDMIRX_HDCP2X_DIV]	= &a9_hdmirx_hdcp2x_div.hw,
1992*6f809ca8SJian Hu 	[CLKID_HDMIRX_HDCP2X]		= &a9_hdmirx_hdcp2x.hw,
1993*6f809ca8SJian Hu 	[CLKID_HDMIRX_ACR_REF_SEL]	= &a9_hdmirx_acr_ref_sel.hw,
1994*6f809ca8SJian Hu 	[CLKID_HDMIRX_ACR_REF_DIV]	= &a9_hdmirx_acr_ref_div.hw,
1995*6f809ca8SJian Hu 	[CLKID_HDMIRX_ACR_REF]		= &a9_hdmirx_acr_ref.hw,
1996*6f809ca8SJian Hu 	[CLKID_HDMIRX_METER_SEL]	= &a9_hdmirx_meter_sel.hw,
1997*6f809ca8SJian Hu 	[CLKID_HDMIRX_METER_DIV]	= &a9_hdmirx_meter_div.hw,
1998*6f809ca8SJian Hu 	[CLKID_HDMIRX_METER]		= &a9_hdmirx_meter.hw,
1999*6f809ca8SJian Hu 	[CLKID_VID_LOCK_SEL]		= &a9_vid_lock_sel.hw,
2000*6f809ca8SJian Hu 	[CLKID_VID_LOCK_DIV]		= &a9_vid_lock_div.hw,
2001*6f809ca8SJian Hu 	[CLKID_VID_LOCK]		= &a9_vid_lock.hw,
2002*6f809ca8SJian Hu 	[CLKID_VDIN_MEAS_SEL]		= &a9_vdin_meas_sel.hw,
2003*6f809ca8SJian Hu 	[CLKID_VDIN_MEAS_DIV]		= &a9_vdin_meas_div.hw,
2004*6f809ca8SJian Hu 	[CLKID_VDIN_MEAS]		= &a9_vdin_meas.hw,
2005*6f809ca8SJian Hu 	[CLKID_VID_PLL_DIV]		= &a9_vid_pll_div.hw,
2006*6f809ca8SJian Hu 	[CLKID_VID_PLL_SEL]		= &a9_vid_pll_sel.hw,
2007*6f809ca8SJian Hu 	[CLKID_VID_PLL]			= &a9_vid_pll.hw,
2008*6f809ca8SJian Hu 	[CLKID_VID_PLL_VCLK]		= &a9_vid_pll_vclk.hw,
2009*6f809ca8SJian Hu 	[CLKID_VCLK0_SEL]		= &a9_vclk0_sel.hw,
2010*6f809ca8SJian Hu 	[CLKID_VCLK0_IN]		= &a9_vclk0_in.hw,
2011*6f809ca8SJian Hu 	[CLKID_VCLK0_DIV]		= &a9_vclk0_div.hw,
2012*6f809ca8SJian Hu 	[CLKID_VCLK0]			= &a9_vclk0.hw,
2013*6f809ca8SJian Hu 	[CLKID_VCLK0_DIV1_EN]		= &a9_vclk0_div1_en.hw,
2014*6f809ca8SJian Hu 	[CLKID_VCLK0_DIV2_EN]		= &a9_vclk0_div2_en.hw,
2015*6f809ca8SJian Hu 	[CLKID_VCLK0_DIV2]		= &a9_vclk0_div2.hw,
2016*6f809ca8SJian Hu 	[CLKID_VCLK0_DIV4_EN]		= &a9_vclk0_div4_en.hw,
2017*6f809ca8SJian Hu 	[CLKID_VCLK0_DIV4]		= &a9_vclk0_div4.hw,
2018*6f809ca8SJian Hu 	[CLKID_VCLK0_DIV6_EN]		= &a9_vclk0_div6_en.hw,
2019*6f809ca8SJian Hu 	[CLKID_VCLK0_DIV6]		= &a9_vclk0_div6.hw,
2020*6f809ca8SJian Hu 	[CLKID_VCLK0_DIV12_EN]		= &a9_vclk0_div12_en.hw,
2021*6f809ca8SJian Hu 	[CLKID_VCLK0_DIV12]		= &a9_vclk0_div12.hw,
2022*6f809ca8SJian Hu 	[CLKID_VCLK1_SEL]		= &a9_vclk1_sel.hw,
2023*6f809ca8SJian Hu 	[CLKID_VCLK1_IN]		= &a9_vclk1_in.hw,
2024*6f809ca8SJian Hu 	[CLKID_VCLK1_DIV]		= &a9_vclk1_div.hw,
2025*6f809ca8SJian Hu 	[CLKID_VCLK1]			= &a9_vclk1.hw,
2026*6f809ca8SJian Hu 	[CLKID_VCLK1_DIV1_EN]		= &a9_vclk1_div1_en.hw,
2027*6f809ca8SJian Hu 	[CLKID_VCLK1_DIV2_EN]		= &a9_vclk1_div2_en.hw,
2028*6f809ca8SJian Hu 	[CLKID_VCLK1_DIV2]		= &a9_vclk1_div2.hw,
2029*6f809ca8SJian Hu 	[CLKID_VCLK1_DIV4_EN]		= &a9_vclk1_div4_en.hw,
2030*6f809ca8SJian Hu 	[CLKID_VCLK1_DIV4]		= &a9_vclk1_div4.hw,
2031*6f809ca8SJian Hu 	[CLKID_VCLK1_DIV6_EN]		= &a9_vclk1_div6_en.hw,
2032*6f809ca8SJian Hu 	[CLKID_VCLK1_DIV6]		= &a9_vclk1_div6.hw,
2033*6f809ca8SJian Hu 	[CLKID_VCLK1_DIV12_EN]		= &a9_vclk1_div12_en.hw,
2034*6f809ca8SJian Hu 	[CLKID_VCLK1_DIV12]		= &a9_vclk1_div12.hw,
2035*6f809ca8SJian Hu 	[CLKID_VDAC_SEL]		= &a9_vdac_sel.hw,
2036*6f809ca8SJian Hu 	[CLKID_VDAC]			= &a9_vdac.hw,
2037*6f809ca8SJian Hu 	[CLKID_ENCODER0_SEL]		= &a9_encoder0_sel.hw,
2038*6f809ca8SJian Hu 	[CLKID_ENCODER0]		= &a9_encoder0.hw,
2039*6f809ca8SJian Hu 	[CLKID_ENCODER1_SEL]		= &a9_encoder1_sel.hw,
2040*6f809ca8SJian Hu 	[CLKID_ENCODER1]		= &a9_encoder1.hw,
2041*6f809ca8SJian Hu 	[CLKID_HDMITX0_PIXEL_SEL]	= &a9_hdmitx0_pixel_sel.hw,
2042*6f809ca8SJian Hu 	[CLKID_HDMITX0_PIXEL]		= &a9_hdmitx0_pixel.hw,
2043*6f809ca8SJian Hu 	[CLKID_HDMITX0_FE_SEL]		= &a9_hdmitx0_fe_sel.hw,
2044*6f809ca8SJian Hu 	[CLKID_HDMITX0_FE]		= &a9_hdmitx0_fe.hw,
2045*6f809ca8SJian Hu 	[CLKID_HDMITX1_PIXEL_SEL]	= &a9_hdmitx1_pixel_sel.hw,
2046*6f809ca8SJian Hu 	[CLKID_HDMITX1_PIXEL]		= &a9_hdmitx1_pixel.hw,
2047*6f809ca8SJian Hu 	[CLKID_HDMITX1_FE_SEL]		= &a9_hdmitx1_fe_sel.hw,
2048*6f809ca8SJian Hu 	[CLKID_HDMITX1_FE]		= &a9_hdmitx1_fe.hw,
2049*6f809ca8SJian Hu 	[CLKID_CSI_PHY_SEL]		= &a9_csi_phy_sel.hw,
2050*6f809ca8SJian Hu 	[CLKID_CSI_PHY_DIV]		= &a9_csi_phy_div.hw,
2051*6f809ca8SJian Hu 	[CLKID_CSI_PHY]			= &a9_csi_phy.hw,
2052*6f809ca8SJian Hu 	[CLKID_DSI0_MEAS_SEL]		= &a9_dsi0_meas_sel.hw,
2053*6f809ca8SJian Hu 	[CLKID_DSI0_MEAS_DIV]		= &a9_dsi0_meas_div.hw,
2054*6f809ca8SJian Hu 	[CLKID_DSI0_MEAS]		= &a9_dsi0_meas.hw,
2055*6f809ca8SJian Hu 	[CLKID_DSI1_MEAS_SEL]		= &a9_dsi1_meas_sel.hw,
2056*6f809ca8SJian Hu 	[CLKID_DSI1_MEAS_DIV]		= &a9_dsi1_meas_div.hw,
2057*6f809ca8SJian Hu 	[CLKID_DSI1_MEAS]		= &a9_dsi1_meas.hw,
2058*6f809ca8SJian Hu };
2059*6f809ca8SJian Hu 
2060*6f809ca8SJian Hu static const struct meson_clkc_data a9_peripherals_clkc_data = {
2061*6f809ca8SJian Hu 	.hw_clks = {
2062*6f809ca8SJian Hu 		.hws = a9_peripherals_hw_clks,
2063*6f809ca8SJian Hu 		.num = ARRAY_SIZE(a9_peripherals_hw_clks),
2064*6f809ca8SJian Hu 	},
2065*6f809ca8SJian Hu };
2066*6f809ca8SJian Hu 
2067*6f809ca8SJian Hu static const struct of_device_id a9_peripherals_clkc_match_table[] = {
2068*6f809ca8SJian Hu 	{
2069*6f809ca8SJian Hu 		.compatible = "amlogic,a9-peripherals-clkc",
2070*6f809ca8SJian Hu 		.data = &a9_peripherals_clkc_data,
2071*6f809ca8SJian Hu 	},
2072*6f809ca8SJian Hu 	{ /* sentinel */ }
2073*6f809ca8SJian Hu };
2074*6f809ca8SJian Hu 
2075*6f809ca8SJian Hu MODULE_DEVICE_TABLE(of, a9_peripherals_clkc_match_table);
2076*6f809ca8SJian Hu 
2077*6f809ca8SJian Hu static struct platform_driver a9_peripherals_clkc_driver = {
2078*6f809ca8SJian Hu 	.probe		= meson_clkc_mmio_probe,
2079*6f809ca8SJian Hu 	.driver		= {
2080*6f809ca8SJian Hu 		.name	= "a9-peripherals-clkc",
2081*6f809ca8SJian Hu 		.of_match_table = a9_peripherals_clkc_match_table,
2082*6f809ca8SJian Hu 	},
2083*6f809ca8SJian Hu };
2084*6f809ca8SJian Hu module_platform_driver(a9_peripherals_clkc_driver);
2085*6f809ca8SJian Hu 
2086*6f809ca8SJian Hu MODULE_DESCRIPTION("Amlogic A9 Peripherals Clock Controller driver");
2087*6f809ca8SJian Hu MODULE_AUTHOR("Jian Hu <jian.hu@amlogic.com>");
2088*6f809ca8SJian Hu MODULE_LICENSE("GPL");
2089*6f809ca8SJian Hu MODULE_IMPORT_NS("CLK_MESON");
2090