xref: /linux/drivers/clk/mediatek/clk-mt8196-vlpckgen.c (revision 522ba450b56fff29f868b1552bdc2965f55de7ed)
1*2f8b3ae6SLaura Nao // SPDX-License-Identifier: GPL-2.0-only
2*2f8b3ae6SLaura Nao /*
3*2f8b3ae6SLaura Nao  * Copyright (c) 2025 MediaTek Inc.
4*2f8b3ae6SLaura Nao  *                    Guangjie Song <guangjie.song@mediatek.com>
5*2f8b3ae6SLaura Nao  * Copyright (c) 2025 Collabora Ltd.
6*2f8b3ae6SLaura Nao  *                    Laura Nao <laura.nao@collabora.com>
7*2f8b3ae6SLaura Nao  */
8*2f8b3ae6SLaura Nao #include <dt-bindings/clock/mediatek,mt8196-clock.h>
9*2f8b3ae6SLaura Nao 
10*2f8b3ae6SLaura Nao #include <linux/clk.h>
11*2f8b3ae6SLaura Nao #include <linux/module.h>
12*2f8b3ae6SLaura Nao #include <linux/of.h>
13*2f8b3ae6SLaura Nao #include <linux/of_address.h>
14*2f8b3ae6SLaura Nao #include <linux/of_device.h>
15*2f8b3ae6SLaura Nao #include <linux/platform_device.h>
16*2f8b3ae6SLaura Nao #include <linux/regmap.h>
17*2f8b3ae6SLaura Nao 
18*2f8b3ae6SLaura Nao #include "clk-mtk.h"
19*2f8b3ae6SLaura Nao #include "clk-mux.h"
20*2f8b3ae6SLaura Nao #include "clk-pll.h"
21*2f8b3ae6SLaura Nao 
22*2f8b3ae6SLaura Nao /* MUX SEL REG */
23*2f8b3ae6SLaura Nao #define VLP_CLK_CFG_UPDATE		0x0004
24*2f8b3ae6SLaura Nao #define VLP_CLK_CFG_UPDATE1		0x0008
25*2f8b3ae6SLaura Nao #define VLP_CLK_CFG_0			0x0010
26*2f8b3ae6SLaura Nao #define VLP_CLK_CFG_0_SET		0x0014
27*2f8b3ae6SLaura Nao #define VLP_CLK_CFG_0_CLR		0x0018
28*2f8b3ae6SLaura Nao #define VLP_CLK_CFG_1			0x0020
29*2f8b3ae6SLaura Nao #define VLP_CLK_CFG_1_SET		0x0024
30*2f8b3ae6SLaura Nao #define VLP_CLK_CFG_1_CLR		0x0028
31*2f8b3ae6SLaura Nao #define VLP_CLK_CFG_2			0x0030
32*2f8b3ae6SLaura Nao #define VLP_CLK_CFG_2_SET		0x0034
33*2f8b3ae6SLaura Nao #define VLP_CLK_CFG_2_CLR		0x0038
34*2f8b3ae6SLaura Nao #define VLP_CLK_CFG_3			0x0040
35*2f8b3ae6SLaura Nao #define VLP_CLK_CFG_3_SET		0x0044
36*2f8b3ae6SLaura Nao #define VLP_CLK_CFG_3_CLR		0x0048
37*2f8b3ae6SLaura Nao #define VLP_CLK_CFG_4			0x0050
38*2f8b3ae6SLaura Nao #define VLP_CLK_CFG_4_SET		0x0054
39*2f8b3ae6SLaura Nao #define VLP_CLK_CFG_4_CLR		0x0058
40*2f8b3ae6SLaura Nao #define VLP_CLK_CFG_5			0x0060
41*2f8b3ae6SLaura Nao #define VLP_CLK_CFG_5_SET		0x0064
42*2f8b3ae6SLaura Nao #define VLP_CLK_CFG_5_CLR		0x0068
43*2f8b3ae6SLaura Nao #define VLP_CLK_CFG_6			0x0070
44*2f8b3ae6SLaura Nao #define VLP_CLK_CFG_6_SET		0x0074
45*2f8b3ae6SLaura Nao #define VLP_CLK_CFG_6_CLR		0x0078
46*2f8b3ae6SLaura Nao #define VLP_CLK_CFG_7			0x0080
47*2f8b3ae6SLaura Nao #define VLP_CLK_CFG_7_SET		0x0084
48*2f8b3ae6SLaura Nao #define VLP_CLK_CFG_7_CLR		0x0088
49*2f8b3ae6SLaura Nao #define VLP_CLK_CFG_8			0x0090
50*2f8b3ae6SLaura Nao #define VLP_CLK_CFG_8_SET		0x0094
51*2f8b3ae6SLaura Nao #define VLP_CLK_CFG_8_CLR		0x0098
52*2f8b3ae6SLaura Nao #define VLP_CLK_CFG_9			0x00a0
53*2f8b3ae6SLaura Nao #define VLP_CLK_CFG_9_SET		0x00a4
54*2f8b3ae6SLaura Nao #define VLP_CLK_CFG_9_CLR		0x00a8
55*2f8b3ae6SLaura Nao #define VLP_CLK_CFG_10			0x00b0
56*2f8b3ae6SLaura Nao #define VLP_CLK_CFG_10_SET		0x00b4
57*2f8b3ae6SLaura Nao #define VLP_CLK_CFG_10_CLR		0x00b8
58*2f8b3ae6SLaura Nao #define VLP_OCIC_FENC_STATUS_MON_0	0x039c
59*2f8b3ae6SLaura Nao #define VLP_OCIC_FENC_STATUS_MON_1	0x03a0
60*2f8b3ae6SLaura Nao 
61*2f8b3ae6SLaura Nao /* MUX SHIFT */
62*2f8b3ae6SLaura Nao #define TOP_MUX_SCP_SHIFT			0
63*2f8b3ae6SLaura Nao #define TOP_MUX_SCP_SPI_SHIFT			1
64*2f8b3ae6SLaura Nao #define TOP_MUX_SCP_IIC_SHIFT			2
65*2f8b3ae6SLaura Nao #define TOP_MUX_SCP_IIC_HS_SHIFT		3
66*2f8b3ae6SLaura Nao #define TOP_MUX_PWRAP_ULPOSC_SHIFT		4
67*2f8b3ae6SLaura Nao #define TOP_MUX_SPMI_M_TIA_32K_SHIFT		5
68*2f8b3ae6SLaura Nao #define TOP_MUX_APXGPT_26M_B_SHIFT		6
69*2f8b3ae6SLaura Nao #define TOP_MUX_DPSW_SHIFT			7
70*2f8b3ae6SLaura Nao #define TOP_MUX_DPSW_CENTRAL_SHIFT		8
71*2f8b3ae6SLaura Nao #define TOP_MUX_SPMI_M_MST_SHIFT		9
72*2f8b3ae6SLaura Nao #define TOP_MUX_DVFSRC_SHIFT			10
73*2f8b3ae6SLaura Nao #define TOP_MUX_PWM_VLP_SHIFT			11
74*2f8b3ae6SLaura Nao #define TOP_MUX_AXI_VLP_SHIFT			12
75*2f8b3ae6SLaura Nao #define TOP_MUX_SYSTIMER_26M_SHIFT		13
76*2f8b3ae6SLaura Nao #define TOP_MUX_SSPM_SHIFT			14
77*2f8b3ae6SLaura Nao #define TOP_MUX_SRCK_SHIFT			15
78*2f8b3ae6SLaura Nao #define TOP_MUX_CAMTG0_SHIFT			16
79*2f8b3ae6SLaura Nao #define TOP_MUX_CAMTG1_SHIFT			17
80*2f8b3ae6SLaura Nao #define TOP_MUX_CAMTG2_SHIFT			18
81*2f8b3ae6SLaura Nao #define TOP_MUX_CAMTG3_SHIFT			19
82*2f8b3ae6SLaura Nao #define TOP_MUX_CAMTG4_SHIFT			20
83*2f8b3ae6SLaura Nao #define TOP_MUX_CAMTG5_SHIFT			21
84*2f8b3ae6SLaura Nao #define TOP_MUX_CAMTG6_SHIFT			22
85*2f8b3ae6SLaura Nao #define TOP_MUX_CAMTG7_SHIFT			23
86*2f8b3ae6SLaura Nao #define TOP_MUX_SSPM_26M_SHIFT			25
87*2f8b3ae6SLaura Nao #define TOP_MUX_ULPOSC_SSPM_SHIFT		26
88*2f8b3ae6SLaura Nao #define TOP_MUX_VLP_PBUS_26M_SHIFT		27
89*2f8b3ae6SLaura Nao #define TOP_MUX_DEBUG_ERR_FLAG_VLP_26M_SHIFT	28
90*2f8b3ae6SLaura Nao #define TOP_MUX_DPMSRDMA_SHIFT			29
91*2f8b3ae6SLaura Nao #define TOP_MUX_VLP_PBUS_156M_SHIFT		30
92*2f8b3ae6SLaura Nao #define TOP_MUX_SPM_SHIFT			0
93*2f8b3ae6SLaura Nao #define TOP_MUX_MMINFRA_VLP_SHIFT		1
94*2f8b3ae6SLaura Nao #define TOP_MUX_USB_TOP_SHIFT			2
95*2f8b3ae6SLaura Nao #define TOP_MUX_SSUSB_XHCI_SHIFT		3
96*2f8b3ae6SLaura Nao #define TOP_MUX_NOC_VLP_SHIFT			4
97*2f8b3ae6SLaura Nao #define TOP_MUX_AUDIO_H_SHIFT			5
98*2f8b3ae6SLaura Nao #define TOP_MUX_AUD_ENGEN1_SHIFT		6
99*2f8b3ae6SLaura Nao #define TOP_MUX_AUD_ENGEN2_SHIFT		7
100*2f8b3ae6SLaura Nao #define TOP_MUX_AUD_INTBUS_SHIFT		8
101*2f8b3ae6SLaura Nao #define TOP_MUX_SPU_VLP_26M_SHIFT		9
102*2f8b3ae6SLaura Nao #define TOP_MUX_SPU0_VLP_SHIFT			10
103*2f8b3ae6SLaura Nao #define TOP_MUX_SPU1_VLP_SHIFT			11
104*2f8b3ae6SLaura Nao 
105*2f8b3ae6SLaura Nao /* CKSTA REG */
106*2f8b3ae6SLaura Nao #define VLP_CKSTA_REG0			0x0250
107*2f8b3ae6SLaura Nao #define VLP_CKSTA_REG1			0x0254
108*2f8b3ae6SLaura Nao 
109*2f8b3ae6SLaura Nao /* HW Voter REG */
110*2f8b3ae6SLaura Nao #define HWV_CG_9_SET	0x0048
111*2f8b3ae6SLaura Nao #define HWV_CG_9_CLR	0x004c
112*2f8b3ae6SLaura Nao #define HWV_CG_9_DONE	0x2c24
113*2f8b3ae6SLaura Nao #define HWV_CG_10_SET	0x0050
114*2f8b3ae6SLaura Nao #define HWV_CG_10_CLR	0x0054
115*2f8b3ae6SLaura Nao #define HWV_CG_10_DONE	0x2c28
116*2f8b3ae6SLaura Nao 
117*2f8b3ae6SLaura Nao /* PLL REG */
118*2f8b3ae6SLaura Nao #define VLP_AP_PLL_CON3		0x264
119*2f8b3ae6SLaura Nao #define VLP_APLL1_TUNER_CON0	0x2a4
120*2f8b3ae6SLaura Nao #define VLP_APLL2_TUNER_CON0	0x2a8
121*2f8b3ae6SLaura Nao #define VLP_APLL1_CON0		0x274
122*2f8b3ae6SLaura Nao #define VLP_APLL1_CON1		0x278
123*2f8b3ae6SLaura Nao #define VLP_APLL1_CON2		0x27c
124*2f8b3ae6SLaura Nao #define VLP_APLL1_CON3		0x280
125*2f8b3ae6SLaura Nao #define VLP_APLL2_CON0		0x28c
126*2f8b3ae6SLaura Nao #define VLP_APLL2_CON1		0x290
127*2f8b3ae6SLaura Nao #define VLP_APLL2_CON2		0x294
128*2f8b3ae6SLaura Nao #define VLP_APLL2_CON3		0x298
129*2f8b3ae6SLaura Nao 
130*2f8b3ae6SLaura Nao /* vlp apll1 tuner default value*/
131*2f8b3ae6SLaura Nao #define VLP_APLL1_TUNER_CON0_VALUE 0x6f28bd4d
132*2f8b3ae6SLaura Nao /* vlp apll2 tuner default value + 1*/
133*2f8b3ae6SLaura Nao #define VLP_APLL2_TUNER_CON0_VALUE 0x78fd5265
134*2f8b3ae6SLaura Nao 
135*2f8b3ae6SLaura Nao #define VLP_PLLEN_ALL		0x080
136*2f8b3ae6SLaura Nao #define VLP_PLLEN_ALL_SET	0x084
137*2f8b3ae6SLaura Nao #define VLP_PLLEN_ALL_CLR	0x088
138*2f8b3ae6SLaura Nao 
139*2f8b3ae6SLaura Nao #define MT8196_PLL_FMAX		(3800UL * MHZ)
140*2f8b3ae6SLaura Nao #define MT8196_PLL_FMIN		(1500UL * MHZ)
141*2f8b3ae6SLaura Nao #define MT8196_INTEGER_BITS	8
142*2f8b3ae6SLaura Nao 
143*2f8b3ae6SLaura Nao #define PLL_FENC(_id, _name, _reg, _fenc_sta_ofs, _fenc_sta_bit,\
144*2f8b3ae6SLaura Nao 			_flags, _pd_reg, _pd_shift,			\
145*2f8b3ae6SLaura Nao 			_pcw_reg, _pcw_shift, _pcwbits,		\
146*2f8b3ae6SLaura Nao 			_pll_en_bit) {					\
147*2f8b3ae6SLaura Nao 		.id = _id,					\
148*2f8b3ae6SLaura Nao 		.name = _name,					\
149*2f8b3ae6SLaura Nao 		.reg = _reg,					\
150*2f8b3ae6SLaura Nao 		.fenc_sta_ofs = _fenc_sta_ofs,			\
151*2f8b3ae6SLaura Nao 		.fenc_sta_bit = _fenc_sta_bit,			\
152*2f8b3ae6SLaura Nao 		.flags = _flags,				\
153*2f8b3ae6SLaura Nao 		.fmax = MT8196_PLL_FMAX,			\
154*2f8b3ae6SLaura Nao 		.fmin = MT8196_PLL_FMIN,			\
155*2f8b3ae6SLaura Nao 		.pd_reg = _pd_reg,				\
156*2f8b3ae6SLaura Nao 		.pd_shift = _pd_shift,				\
157*2f8b3ae6SLaura Nao 		.pcw_reg = _pcw_reg,				\
158*2f8b3ae6SLaura Nao 		.pcw_shift = _pcw_shift,			\
159*2f8b3ae6SLaura Nao 		.pcwbits = _pcwbits,				\
160*2f8b3ae6SLaura Nao 		.pcwibits = MT8196_INTEGER_BITS,		\
161*2f8b3ae6SLaura Nao 		.en_reg = VLP_PLLEN_ALL,			\
162*2f8b3ae6SLaura Nao 		.en_set_reg = VLP_PLLEN_ALL_SET,		\
163*2f8b3ae6SLaura Nao 		.en_clr_reg = VLP_PLLEN_ALL_CLR,		\
164*2f8b3ae6SLaura Nao 		.pll_en_bit = _pll_en_bit,			\
165*2f8b3ae6SLaura Nao 		.ops = &mtk_pll_fenc_clr_set_ops,		\
166*2f8b3ae6SLaura Nao }
167*2f8b3ae6SLaura Nao 
168*2f8b3ae6SLaura Nao static DEFINE_SPINLOCK(mt8196_clk_vlp_lock);
169*2f8b3ae6SLaura Nao 
170*2f8b3ae6SLaura Nao static const struct mtk_fixed_factor vlp_divs[] = {
171*2f8b3ae6SLaura Nao 	FACTOR(CLK_VLP_CLK26M, "vlp_clk26m", "clk26m", 1, 1),
172*2f8b3ae6SLaura Nao 	FACTOR(CLK_VLP_APLL1_D4, "apll1_d4", "vlp_apll1", 1, 4),
173*2f8b3ae6SLaura Nao 	FACTOR(CLK_VLP_APLL1_D8, "apll1_d8", "vlp_apll1", 1, 8),
174*2f8b3ae6SLaura Nao 	FACTOR(CLK_VLP_APLL2_D4, "apll2_d4", "vlp_apll2", 1, 4),
175*2f8b3ae6SLaura Nao 	FACTOR(CLK_VLP_APLL2_D8, "apll2_d8", "vlp_apll2", 1, 8),
176*2f8b3ae6SLaura Nao };
177*2f8b3ae6SLaura Nao 
178*2f8b3ae6SLaura Nao static const char * const vlp_scp_parents[] = {
179*2f8b3ae6SLaura Nao 	"clk26m",
180*2f8b3ae6SLaura Nao 	"osc_d20",
181*2f8b3ae6SLaura Nao 	"mainpll_d6",
182*2f8b3ae6SLaura Nao 	"mainpll_d4",
183*2f8b3ae6SLaura Nao 	"mainpll_d3",
184*2f8b3ae6SLaura Nao 	"vlp_apll1"
185*2f8b3ae6SLaura Nao };
186*2f8b3ae6SLaura Nao 
187*2f8b3ae6SLaura Nao static const char * const vlp_scp_spi_parents[] = {
188*2f8b3ae6SLaura Nao 	"clk26m",
189*2f8b3ae6SLaura Nao 	"osc_d20",
190*2f8b3ae6SLaura Nao 	"mainpll_d7_d2",
191*2f8b3ae6SLaura Nao 	"mainpll_d5_d2"
192*2f8b3ae6SLaura Nao };
193*2f8b3ae6SLaura Nao 
194*2f8b3ae6SLaura Nao static const char * const vlp_scp_iic_parents[] = {
195*2f8b3ae6SLaura Nao 	"clk26m",
196*2f8b3ae6SLaura Nao 	"osc_d20",
197*2f8b3ae6SLaura Nao 	"mainpll_d5_d4",
198*2f8b3ae6SLaura Nao 	"mainpll_d7_d2"
199*2f8b3ae6SLaura Nao };
200*2f8b3ae6SLaura Nao 
201*2f8b3ae6SLaura Nao static const char * const vlp_scp_iic_hs_parents[] = {
202*2f8b3ae6SLaura Nao 	"clk26m",
203*2f8b3ae6SLaura Nao 	"osc_d20",
204*2f8b3ae6SLaura Nao 	"mainpll_d5_d4",
205*2f8b3ae6SLaura Nao 	"mainpll_d7_d2",
206*2f8b3ae6SLaura Nao 	"mainpll_d7"
207*2f8b3ae6SLaura Nao };
208*2f8b3ae6SLaura Nao 
209*2f8b3ae6SLaura Nao static const char * const vlp_pwrap_ulposc_parents[] = {
210*2f8b3ae6SLaura Nao 	"clk26m",
211*2f8b3ae6SLaura Nao 	"osc_d20",
212*2f8b3ae6SLaura Nao 	"osc_d14",
213*2f8b3ae6SLaura Nao 	"osc_d10"
214*2f8b3ae6SLaura Nao };
215*2f8b3ae6SLaura Nao 
216*2f8b3ae6SLaura Nao static const char * const vlp_spmi_32k_parents[] = {
217*2f8b3ae6SLaura Nao 	"clk26m",
218*2f8b3ae6SLaura Nao 	"clk32k",
219*2f8b3ae6SLaura Nao 	"osc_d20",
220*2f8b3ae6SLaura Nao 	"osc_d14",
221*2f8b3ae6SLaura Nao 	"osc_d10"
222*2f8b3ae6SLaura Nao };
223*2f8b3ae6SLaura Nao 
224*2f8b3ae6SLaura Nao static const char * const vlp_apxgpt_26m_b_parents[] = {
225*2f8b3ae6SLaura Nao 	"clk26m",
226*2f8b3ae6SLaura Nao 	"osc_d20"
227*2f8b3ae6SLaura Nao };
228*2f8b3ae6SLaura Nao 
229*2f8b3ae6SLaura Nao static const char * const vlp_dpsw_parents[] = {
230*2f8b3ae6SLaura Nao 	"clk26m",
231*2f8b3ae6SLaura Nao 	"osc_d10",
232*2f8b3ae6SLaura Nao 	"osc_d7",
233*2f8b3ae6SLaura Nao 	"mainpll_d7_d4"
234*2f8b3ae6SLaura Nao };
235*2f8b3ae6SLaura Nao 
236*2f8b3ae6SLaura Nao static const char * const vlp_dpsw_central_parents[] = {
237*2f8b3ae6SLaura Nao 	"clk26m",
238*2f8b3ae6SLaura Nao 	"osc_d10",
239*2f8b3ae6SLaura Nao 	"osc_d7",
240*2f8b3ae6SLaura Nao 	"mainpll_d7_d4"
241*2f8b3ae6SLaura Nao };
242*2f8b3ae6SLaura Nao 
243*2f8b3ae6SLaura Nao static const char * const vlp_spmi_m_parents[] = {
244*2f8b3ae6SLaura Nao 	"clk26m",
245*2f8b3ae6SLaura Nao 	"osc_d20",
246*2f8b3ae6SLaura Nao 	"osc_d14",
247*2f8b3ae6SLaura Nao 	"osc_d10"
248*2f8b3ae6SLaura Nao };
249*2f8b3ae6SLaura Nao 
250*2f8b3ae6SLaura Nao static const char * const vlp_dvfsrc_parents[] = {
251*2f8b3ae6SLaura Nao 	"clk26m",
252*2f8b3ae6SLaura Nao 	"osc_d20"
253*2f8b3ae6SLaura Nao };
254*2f8b3ae6SLaura Nao 
255*2f8b3ae6SLaura Nao static const char * const vlp_pwm_vlp_parents[] = {
256*2f8b3ae6SLaura Nao 	"clk26m",
257*2f8b3ae6SLaura Nao 	"clk32k",
258*2f8b3ae6SLaura Nao 	"osc_d20",
259*2f8b3ae6SLaura Nao 	"osc_d8",
260*2f8b3ae6SLaura Nao 	"mainpll_d4_d8"
261*2f8b3ae6SLaura Nao };
262*2f8b3ae6SLaura Nao 
263*2f8b3ae6SLaura Nao static const char * const vlp_axi_vlp_parents[] = {
264*2f8b3ae6SLaura Nao 	"clk26m",
265*2f8b3ae6SLaura Nao 	"osc_d20",
266*2f8b3ae6SLaura Nao 	"mainpll_d7_d4",
267*2f8b3ae6SLaura Nao 	"osc_d4",
268*2f8b3ae6SLaura Nao 	"mainpll_d7_d2"
269*2f8b3ae6SLaura Nao };
270*2f8b3ae6SLaura Nao 
271*2f8b3ae6SLaura Nao static const char * const vlp_systimer_26m_parents[] = {
272*2f8b3ae6SLaura Nao 	"clk26m",
273*2f8b3ae6SLaura Nao 	"osc_d20"
274*2f8b3ae6SLaura Nao };
275*2f8b3ae6SLaura Nao 
276*2f8b3ae6SLaura Nao static const char * const vlp_sspm_parents[] = {
277*2f8b3ae6SLaura Nao 	"clk26m",
278*2f8b3ae6SLaura Nao 	"osc_d20",
279*2f8b3ae6SLaura Nao 	"mainpll_d5_d2",
280*2f8b3ae6SLaura Nao 	"osc_d2",
281*2f8b3ae6SLaura Nao 	"mainpll_d6"
282*2f8b3ae6SLaura Nao };
283*2f8b3ae6SLaura Nao 
284*2f8b3ae6SLaura Nao static const char * const vlp_srck_parents[] = {
285*2f8b3ae6SLaura Nao 	"clk26m",
286*2f8b3ae6SLaura Nao 	"osc_d20"
287*2f8b3ae6SLaura Nao };
288*2f8b3ae6SLaura Nao 
289*2f8b3ae6SLaura Nao static const char * const vlp_camtg0_1_parents[] = {
290*2f8b3ae6SLaura Nao 	"clk26m",
291*2f8b3ae6SLaura Nao 	"univpll_192m_d32",
292*2f8b3ae6SLaura Nao 	"univpll_192m_d16",
293*2f8b3ae6SLaura Nao 	"clk13m",
294*2f8b3ae6SLaura Nao 	"osc_d40",
295*2f8b3ae6SLaura Nao 	"osc_d32",
296*2f8b3ae6SLaura Nao 	"univpll_192m_d10",
297*2f8b3ae6SLaura Nao 	"univpll_192m_d8",
298*2f8b3ae6SLaura Nao 	"univpll_d6_d16",
299*2f8b3ae6SLaura Nao 	"ulposc3",
300*2f8b3ae6SLaura Nao 	"osc_d20",
301*2f8b3ae6SLaura Nao 	"ck2_tvdpll1_d16",
302*2f8b3ae6SLaura Nao 	"univpll_d6_d8"
303*2f8b3ae6SLaura Nao };
304*2f8b3ae6SLaura Nao 
305*2f8b3ae6SLaura Nao static const char * const vlp_camtg2_7_parents[] = {
306*2f8b3ae6SLaura Nao 	"clk26m",
307*2f8b3ae6SLaura Nao 	"univpll_192m_d32",
308*2f8b3ae6SLaura Nao 	"univpll_192m_d16",
309*2f8b3ae6SLaura Nao 	"clk13m",
310*2f8b3ae6SLaura Nao 	"osc_d40",
311*2f8b3ae6SLaura Nao 	"osc_d32",
312*2f8b3ae6SLaura Nao 	"univpll_192m_d10",
313*2f8b3ae6SLaura Nao 	"univpll_192m_d8",
314*2f8b3ae6SLaura Nao 	"univpll_d6_d16",
315*2f8b3ae6SLaura Nao 	"osc_d20",
316*2f8b3ae6SLaura Nao 	"ck2_tvdpll1_d16",
317*2f8b3ae6SLaura Nao 	"univpll_d6_d8"
318*2f8b3ae6SLaura Nao };
319*2f8b3ae6SLaura Nao 
320*2f8b3ae6SLaura Nao static const char * const vlp_sspm_26m_parents[] = {
321*2f8b3ae6SLaura Nao 	"clk26m",
322*2f8b3ae6SLaura Nao 	"osc_d20"
323*2f8b3ae6SLaura Nao };
324*2f8b3ae6SLaura Nao 
325*2f8b3ae6SLaura Nao static const char * const vlp_ulposc_sspm_parents[] = {
326*2f8b3ae6SLaura Nao 	"clk26m",
327*2f8b3ae6SLaura Nao 	"osc_d2",
328*2f8b3ae6SLaura Nao 	"mainpll_d4_d2"
329*2f8b3ae6SLaura Nao };
330*2f8b3ae6SLaura Nao 
331*2f8b3ae6SLaura Nao static const char * const vlp_vlp_pbus_26m_parents[] = {
332*2f8b3ae6SLaura Nao 	"clk26m",
333*2f8b3ae6SLaura Nao 	"osc_d20"
334*2f8b3ae6SLaura Nao };
335*2f8b3ae6SLaura Nao 
336*2f8b3ae6SLaura Nao static const char * const vlp_debug_err_flag_parents[] = {
337*2f8b3ae6SLaura Nao 	"clk26m",
338*2f8b3ae6SLaura Nao 	"osc_d20"
339*2f8b3ae6SLaura Nao };
340*2f8b3ae6SLaura Nao 
341*2f8b3ae6SLaura Nao static const char * const vlp_dpmsrdma_parents[] = {
342*2f8b3ae6SLaura Nao 	"clk26m",
343*2f8b3ae6SLaura Nao 	"mainpll_d7_d2"
344*2f8b3ae6SLaura Nao };
345*2f8b3ae6SLaura Nao 
346*2f8b3ae6SLaura Nao static const char * const vlp_vlp_pbus_156m_parents[] = {
347*2f8b3ae6SLaura Nao 	"clk26m",
348*2f8b3ae6SLaura Nao 	"osc_d2",
349*2f8b3ae6SLaura Nao 	"mainpll_d7_d2",
350*2f8b3ae6SLaura Nao 	"mainpll_d7"
351*2f8b3ae6SLaura Nao };
352*2f8b3ae6SLaura Nao 
353*2f8b3ae6SLaura Nao static const char * const vlp_spm_parents[] = {
354*2f8b3ae6SLaura Nao 	"clk26m",
355*2f8b3ae6SLaura Nao 	"mainpll_d7_d4"
356*2f8b3ae6SLaura Nao };
357*2f8b3ae6SLaura Nao 
358*2f8b3ae6SLaura Nao static const char * const vlp_mminfra_parents[] = {
359*2f8b3ae6SLaura Nao 	"clk26m",
360*2f8b3ae6SLaura Nao 	"osc_d4",
361*2f8b3ae6SLaura Nao 	"mainpll_d3"
362*2f8b3ae6SLaura Nao };
363*2f8b3ae6SLaura Nao 
364*2f8b3ae6SLaura Nao static const char * const vlp_usb_parents[] = {
365*2f8b3ae6SLaura Nao 	"clk26m",
366*2f8b3ae6SLaura Nao 	"mainpll_d9"
367*2f8b3ae6SLaura Nao };
368*2f8b3ae6SLaura Nao 
369*2f8b3ae6SLaura Nao static const char * const vlp_noc_vlp_parents[] = {
370*2f8b3ae6SLaura Nao 	"clk26m",
371*2f8b3ae6SLaura Nao 	"osc_d20",
372*2f8b3ae6SLaura Nao 	"mainpll_d9"
373*2f8b3ae6SLaura Nao };
374*2f8b3ae6SLaura Nao 
375*2f8b3ae6SLaura Nao static const char * const vlp_audio_h_parents[] = {
376*2f8b3ae6SLaura Nao 	"vlp_clk26m",
377*2f8b3ae6SLaura Nao 	"vlp_apll1",
378*2f8b3ae6SLaura Nao 	"vlp_apll2"
379*2f8b3ae6SLaura Nao };
380*2f8b3ae6SLaura Nao 
381*2f8b3ae6SLaura Nao static const char * const vlp_aud_engen1_parents[] = {
382*2f8b3ae6SLaura Nao 	"vlp_clk26m",
383*2f8b3ae6SLaura Nao 	"apll1_d8",
384*2f8b3ae6SLaura Nao 	"apll1_d4"
385*2f8b3ae6SLaura Nao };
386*2f8b3ae6SLaura Nao 
387*2f8b3ae6SLaura Nao static const char * const vlp_aud_engen2_parents[] = {
388*2f8b3ae6SLaura Nao 	"vlp_clk26m",
389*2f8b3ae6SLaura Nao 	"apll2_d8",
390*2f8b3ae6SLaura Nao 	"apll2_d4"
391*2f8b3ae6SLaura Nao };
392*2f8b3ae6SLaura Nao 
393*2f8b3ae6SLaura Nao static const char * const vlp_aud_intbus_parents[] = {
394*2f8b3ae6SLaura Nao 	"vlp_clk26m",
395*2f8b3ae6SLaura Nao 	"mainpll_d7_d4",
396*2f8b3ae6SLaura Nao 	"mainpll_d4_d4"
397*2f8b3ae6SLaura Nao };
398*2f8b3ae6SLaura Nao 
399*2f8b3ae6SLaura Nao static const u8 vlp_aud_parent_index[] = { 1, 2, 3 };
400*2f8b3ae6SLaura Nao 
401*2f8b3ae6SLaura Nao static const char * const vlp_spvlp_26m_parents[] = {
402*2f8b3ae6SLaura Nao 	"clk26m",
403*2f8b3ae6SLaura Nao 	"osc_d20"
404*2f8b3ae6SLaura Nao };
405*2f8b3ae6SLaura Nao 
406*2f8b3ae6SLaura Nao static const char * const vlp_spu0_vlp_parents[] = {
407*2f8b3ae6SLaura Nao 	"clk26m",
408*2f8b3ae6SLaura Nao 	"osc_d20",
409*2f8b3ae6SLaura Nao 	"mainpll_d4_d4",
410*2f8b3ae6SLaura Nao 	"mainpll_d4_d2",
411*2f8b3ae6SLaura Nao 	"mainpll_d7",
412*2f8b3ae6SLaura Nao 	"mainpll_d6",
413*2f8b3ae6SLaura Nao 	"mainpll_d5"
414*2f8b3ae6SLaura Nao };
415*2f8b3ae6SLaura Nao 
416*2f8b3ae6SLaura Nao static const char * const vlp_spu1_vlp_parents[] = {
417*2f8b3ae6SLaura Nao 	"clk26m",
418*2f8b3ae6SLaura Nao 	"osc_d20",
419*2f8b3ae6SLaura Nao 	"mainpll_d4_d4",
420*2f8b3ae6SLaura Nao 	"mainpll_d4_d2",
421*2f8b3ae6SLaura Nao 	"mainpll_d7",
422*2f8b3ae6SLaura Nao 	"mainpll_d6",
423*2f8b3ae6SLaura Nao 	"mainpll_d5"
424*2f8b3ae6SLaura Nao };
425*2f8b3ae6SLaura Nao 
426*2f8b3ae6SLaura Nao static const struct mtk_mux vlp_muxes[] = {
427*2f8b3ae6SLaura Nao 	/* VLP_CLK_CFG_0 */
428*2f8b3ae6SLaura Nao 	MUX_GATE_FENC_CLR_SET_UPD(CLK_VLP_SCP, "vlp_scp", vlp_scp_parents,
429*2f8b3ae6SLaura Nao 		VLP_CLK_CFG_0, VLP_CLK_CFG_0_SET, VLP_CLK_CFG_0_CLR,
430*2f8b3ae6SLaura Nao 		0, 3, 7, VLP_CLK_CFG_UPDATE, TOP_MUX_SCP_SHIFT,
431*2f8b3ae6SLaura Nao 		VLP_OCIC_FENC_STATUS_MON_0, 31),
432*2f8b3ae6SLaura Nao 	MUX_CLR_SET_UPD(CLK_VLP_SCP_SPI, "vlp_scp_spi",
433*2f8b3ae6SLaura Nao 		vlp_scp_spi_parents, VLP_CLK_CFG_0, VLP_CLK_CFG_0_SET,
434*2f8b3ae6SLaura Nao 		VLP_CLK_CFG_0_CLR, 8, 2,
435*2f8b3ae6SLaura Nao 		VLP_CLK_CFG_UPDATE, TOP_MUX_SCP_SPI_SHIFT),
436*2f8b3ae6SLaura Nao 	MUX_CLR_SET_UPD(CLK_VLP_SCP_IIC, "vlp_scp_iic",
437*2f8b3ae6SLaura Nao 		vlp_scp_iic_parents, VLP_CLK_CFG_0, VLP_CLK_CFG_0_SET,
438*2f8b3ae6SLaura Nao 		VLP_CLK_CFG_0_CLR, 16, 2,
439*2f8b3ae6SLaura Nao 		VLP_CLK_CFG_UPDATE, TOP_MUX_SCP_IIC_SHIFT),
440*2f8b3ae6SLaura Nao 	MUX_CLR_SET_UPD(CLK_VLP_SCP_IIC_HS, "vlp_scp_iic_hs",
441*2f8b3ae6SLaura Nao 		vlp_scp_iic_hs_parents, VLP_CLK_CFG_0, VLP_CLK_CFG_0_SET,
442*2f8b3ae6SLaura Nao 		VLP_CLK_CFG_0_CLR, 24, 3,
443*2f8b3ae6SLaura Nao 		VLP_CLK_CFG_UPDATE, TOP_MUX_SCP_IIC_HS_SHIFT),
444*2f8b3ae6SLaura Nao 	/* VLP_CLK_CFG_1 */
445*2f8b3ae6SLaura Nao 	MUX_CLR_SET_UPD(CLK_VLP_PWRAP_ULPOSC, "vlp_pwrap_ulposc",
446*2f8b3ae6SLaura Nao 		vlp_pwrap_ulposc_parents, VLP_CLK_CFG_1, VLP_CLK_CFG_1_SET,
447*2f8b3ae6SLaura Nao 		VLP_CLK_CFG_1_CLR, 0, 2,
448*2f8b3ae6SLaura Nao 		VLP_CLK_CFG_UPDATE, TOP_MUX_PWRAP_ULPOSC_SHIFT),
449*2f8b3ae6SLaura Nao 	MUX_CLR_SET_UPD(CLK_VLP_SPMI_M_TIA_32K, "vlp_spmi_32k",
450*2f8b3ae6SLaura Nao 		vlp_spmi_32k_parents, VLP_CLK_CFG_1, VLP_CLK_CFG_1_SET,
451*2f8b3ae6SLaura Nao 		VLP_CLK_CFG_1_CLR, 8, 3,
452*2f8b3ae6SLaura Nao 		VLP_CLK_CFG_UPDATE, TOP_MUX_SPMI_M_TIA_32K_SHIFT),
453*2f8b3ae6SLaura Nao 	MUX_CLR_SET_UPD(CLK_VLP_APXGPT_26M_B, "vlp_apxgpt_26m_b",
454*2f8b3ae6SLaura Nao 		vlp_apxgpt_26m_b_parents, VLP_CLK_CFG_1, VLP_CLK_CFG_1_SET,
455*2f8b3ae6SLaura Nao 		VLP_CLK_CFG_1_CLR, 16, 1,
456*2f8b3ae6SLaura Nao 		VLP_CLK_CFG_UPDATE, TOP_MUX_APXGPT_26M_B_SHIFT),
457*2f8b3ae6SLaura Nao 	MUX_CLR_SET_UPD(CLK_VLP_DPSW, "vlp_dpsw",
458*2f8b3ae6SLaura Nao 		vlp_dpsw_parents, VLP_CLK_CFG_1, VLP_CLK_CFG_1_SET,
459*2f8b3ae6SLaura Nao 		VLP_CLK_CFG_1_CLR, 24, 2,
460*2f8b3ae6SLaura Nao 		VLP_CLK_CFG_UPDATE, TOP_MUX_DPSW_SHIFT),
461*2f8b3ae6SLaura Nao 	/* VLP_CLK_CFG_2 */
462*2f8b3ae6SLaura Nao 	MUX_CLR_SET_UPD(CLK_VLP_DPSW_CENTRAL, "vlp_dpsw_central",
463*2f8b3ae6SLaura Nao 		vlp_dpsw_central_parents, VLP_CLK_CFG_2, VLP_CLK_CFG_2_SET,
464*2f8b3ae6SLaura Nao 		VLP_CLK_CFG_2_CLR, 0, 2,
465*2f8b3ae6SLaura Nao 		VLP_CLK_CFG_UPDATE, TOP_MUX_DPSW_CENTRAL_SHIFT),
466*2f8b3ae6SLaura Nao 	MUX_CLR_SET_UPD(CLK_VLP_SPMI_M_MST, "vlp_spmi_m",
467*2f8b3ae6SLaura Nao 		vlp_spmi_m_parents, VLP_CLK_CFG_2, VLP_CLK_CFG_2_SET,
468*2f8b3ae6SLaura Nao 		VLP_CLK_CFG_2_CLR, 8, 2,
469*2f8b3ae6SLaura Nao 		VLP_CLK_CFG_UPDATE, TOP_MUX_SPMI_M_MST_SHIFT),
470*2f8b3ae6SLaura Nao 	MUX_CLR_SET_UPD(CLK_VLP_DVFSRC, "vlp_dvfsrc",
471*2f8b3ae6SLaura Nao 		vlp_dvfsrc_parents, VLP_CLK_CFG_2, VLP_CLK_CFG_2_SET,
472*2f8b3ae6SLaura Nao 		VLP_CLK_CFG_2_CLR, 16, 1,
473*2f8b3ae6SLaura Nao 		VLP_CLK_CFG_UPDATE, TOP_MUX_DVFSRC_SHIFT),
474*2f8b3ae6SLaura Nao 	MUX_GATE_FENC_CLR_SET_UPD(CLK_VLP_PWM_VLP, "vlp_pwm_vlp", vlp_pwm_vlp_parents,
475*2f8b3ae6SLaura Nao 		VLP_CLK_CFG_2, VLP_CLK_CFG_2_SET, VLP_CLK_CFG_2_CLR,
476*2f8b3ae6SLaura Nao 		24, 3, 31, VLP_CLK_CFG_UPDATE, TOP_MUX_PWM_VLP_SHIFT,
477*2f8b3ae6SLaura Nao 		VLP_OCIC_FENC_STATUS_MON_0, 20),
478*2f8b3ae6SLaura Nao 	/* VLP_CLK_CFG_3 */
479*2f8b3ae6SLaura Nao 	MUX_CLR_SET_UPD(CLK_VLP_AXI_VLP, "vlp_axi_vlp",
480*2f8b3ae6SLaura Nao 		vlp_axi_vlp_parents, VLP_CLK_CFG_3, VLP_CLK_CFG_3_SET,
481*2f8b3ae6SLaura Nao 		VLP_CLK_CFG_3_CLR, 0, 3,
482*2f8b3ae6SLaura Nao 		VLP_CLK_CFG_UPDATE, TOP_MUX_AXI_VLP_SHIFT),
483*2f8b3ae6SLaura Nao 	MUX_CLR_SET_UPD(CLK_VLP_SYSTIMER_26M, "vlp_systimer_26m",
484*2f8b3ae6SLaura Nao 		vlp_systimer_26m_parents, VLP_CLK_CFG_3, VLP_CLK_CFG_3_SET,
485*2f8b3ae6SLaura Nao 		VLP_CLK_CFG_3_CLR, 8, 1,
486*2f8b3ae6SLaura Nao 		VLP_CLK_CFG_UPDATE, TOP_MUX_SYSTIMER_26M_SHIFT),
487*2f8b3ae6SLaura Nao 	MUX_CLR_SET_UPD(CLK_VLP_SSPM, "vlp_sspm",
488*2f8b3ae6SLaura Nao 		vlp_sspm_parents, VLP_CLK_CFG_3, VLP_CLK_CFG_3_SET,
489*2f8b3ae6SLaura Nao 		VLP_CLK_CFG_3_CLR, 16, 3,
490*2f8b3ae6SLaura Nao 		VLP_CLK_CFG_UPDATE, TOP_MUX_SSPM_SHIFT),
491*2f8b3ae6SLaura Nao 	MUX_CLR_SET_UPD(CLK_VLP_SRCK, "vlp_srck",
492*2f8b3ae6SLaura Nao 		vlp_srck_parents, VLP_CLK_CFG_3, VLP_CLK_CFG_3_SET,
493*2f8b3ae6SLaura Nao 		VLP_CLK_CFG_3_CLR, 24, 1,
494*2f8b3ae6SLaura Nao 		VLP_CLK_CFG_UPDATE, TOP_MUX_SRCK_SHIFT),
495*2f8b3ae6SLaura Nao 	/* VLP_CLK_CFG_4 */
496*2f8b3ae6SLaura Nao 	MUX_GATE_HWV_FENC_CLR_SET_UPD(CLK_VLP_CAMTG0, "vlp_camtg0", vlp_camtg0_1_parents,
497*2f8b3ae6SLaura Nao 		VLP_CLK_CFG_4, VLP_CLK_CFG_4_SET, VLP_CLK_CFG_4_CLR,
498*2f8b3ae6SLaura Nao 		HWV_CG_9_DONE, HWV_CG_9_SET, HWV_CG_9_CLR,
499*2f8b3ae6SLaura Nao 		0, 4, 7, VLP_CLK_CFG_UPDATE, TOP_MUX_CAMTG0_SHIFT,
500*2f8b3ae6SLaura Nao 		VLP_OCIC_FENC_STATUS_MON_0, 15),
501*2f8b3ae6SLaura Nao 	MUX_GATE_HWV_FENC_CLR_SET_UPD(CLK_VLP_CAMTG1, "vlp_camtg1", vlp_camtg0_1_parents,
502*2f8b3ae6SLaura Nao 		VLP_CLK_CFG_4, VLP_CLK_CFG_4_SET, VLP_CLK_CFG_4_CLR,
503*2f8b3ae6SLaura Nao 		HWV_CG_9_DONE, HWV_CG_9_SET, HWV_CG_9_CLR,
504*2f8b3ae6SLaura Nao 		8, 4, 15, VLP_CLK_CFG_UPDATE, TOP_MUX_CAMTG1_SHIFT,
505*2f8b3ae6SLaura Nao 		VLP_OCIC_FENC_STATUS_MON_0, 14),
506*2f8b3ae6SLaura Nao 	MUX_GATE_HWV_FENC_CLR_SET_UPD(CLK_VLP_CAMTG2, "vlp_camtg2", vlp_camtg2_7_parents,
507*2f8b3ae6SLaura Nao 		VLP_CLK_CFG_4, VLP_CLK_CFG_4_SET, VLP_CLK_CFG_4_CLR,
508*2f8b3ae6SLaura Nao 		HWV_CG_9_DONE, HWV_CG_9_SET, HWV_CG_9_CLR,
509*2f8b3ae6SLaura Nao 		16, 4, 23, VLP_CLK_CFG_UPDATE, TOP_MUX_CAMTG2_SHIFT,
510*2f8b3ae6SLaura Nao 		VLP_OCIC_FENC_STATUS_MON_0, 13),
511*2f8b3ae6SLaura Nao 	MUX_GATE_HWV_FENC_CLR_SET_UPD(CLK_VLP_CAMTG3, "vlp_camtg3", vlp_camtg2_7_parents,
512*2f8b3ae6SLaura Nao 		VLP_CLK_CFG_4, VLP_CLK_CFG_4_SET, VLP_CLK_CFG_4_CLR,
513*2f8b3ae6SLaura Nao 		HWV_CG_9_DONE, HWV_CG_9_SET, HWV_CG_9_CLR,
514*2f8b3ae6SLaura Nao 		24, 4, 31, VLP_CLK_CFG_UPDATE, TOP_MUX_CAMTG3_SHIFT,
515*2f8b3ae6SLaura Nao 		VLP_OCIC_FENC_STATUS_MON_0, 12),
516*2f8b3ae6SLaura Nao 	/* VLP_CLK_CFG_5 */
517*2f8b3ae6SLaura Nao 	MUX_GATE_HWV_FENC_CLR_SET_UPD(CLK_VLP_CAMTG4, "vlp_camtg4", vlp_camtg2_7_parents,
518*2f8b3ae6SLaura Nao 		VLP_CLK_CFG_5, VLP_CLK_CFG_5_SET, VLP_CLK_CFG_5_CLR,
519*2f8b3ae6SLaura Nao 		HWV_CG_10_DONE, HWV_CG_10_SET, HWV_CG_10_CLR,
520*2f8b3ae6SLaura Nao 		0, 4, 7, VLP_CLK_CFG_UPDATE, TOP_MUX_CAMTG4_SHIFT,
521*2f8b3ae6SLaura Nao 		VLP_OCIC_FENC_STATUS_MON_0, 11),
522*2f8b3ae6SLaura Nao 	MUX_GATE_HWV_FENC_CLR_SET_UPD(CLK_VLP_CAMTG5, "vlp_camtg5", vlp_camtg2_7_parents,
523*2f8b3ae6SLaura Nao 		VLP_CLK_CFG_5, VLP_CLK_CFG_5_SET, VLP_CLK_CFG_5_CLR,
524*2f8b3ae6SLaura Nao 		HWV_CG_10_DONE, HWV_CG_10_SET, HWV_CG_10_CLR,
525*2f8b3ae6SLaura Nao 		8, 4, 15, VLP_CLK_CFG_UPDATE, TOP_MUX_CAMTG5_SHIFT,
526*2f8b3ae6SLaura Nao 		VLP_OCIC_FENC_STATUS_MON_0, 10),
527*2f8b3ae6SLaura Nao 	MUX_GATE_HWV_FENC_CLR_SET_UPD(CLK_VLP_CAMTG6, "vlp_camtg6", vlp_camtg2_7_parents,
528*2f8b3ae6SLaura Nao 		VLP_CLK_CFG_5, VLP_CLK_CFG_5_SET, VLP_CLK_CFG_5_CLR,
529*2f8b3ae6SLaura Nao 		HWV_CG_10_DONE, HWV_CG_10_SET, HWV_CG_10_CLR,
530*2f8b3ae6SLaura Nao 		16, 4, 23, VLP_CLK_CFG_UPDATE, TOP_MUX_CAMTG6_SHIFT,
531*2f8b3ae6SLaura Nao 		VLP_OCIC_FENC_STATUS_MON_0, 9),
532*2f8b3ae6SLaura Nao 	MUX_GATE_HWV_FENC_CLR_SET_UPD(CLK_VLP_CAMTG7, "vlp_camtg7", vlp_camtg2_7_parents,
533*2f8b3ae6SLaura Nao 		VLP_CLK_CFG_5, VLP_CLK_CFG_5_SET, VLP_CLK_CFG_5_CLR,
534*2f8b3ae6SLaura Nao 		HWV_CG_10_DONE, HWV_CG_10_SET, HWV_CG_10_CLR,
535*2f8b3ae6SLaura Nao 		24, 4, 31, VLP_CLK_CFG_UPDATE, TOP_MUX_CAMTG7_SHIFT,
536*2f8b3ae6SLaura Nao 		VLP_OCIC_FENC_STATUS_MON_0, 8),
537*2f8b3ae6SLaura Nao 	/* VLP_CLK_CFG_6 */
538*2f8b3ae6SLaura Nao 	MUX_CLR_SET_UPD(CLK_VLP_SSPM_26M, "vlp_sspm_26m",
539*2f8b3ae6SLaura Nao 		vlp_sspm_26m_parents, VLP_CLK_CFG_6, VLP_CLK_CFG_6_SET,
540*2f8b3ae6SLaura Nao 		VLP_CLK_CFG_6_CLR, 8, 1,
541*2f8b3ae6SLaura Nao 		VLP_CLK_CFG_UPDATE, TOP_MUX_SSPM_26M_SHIFT),
542*2f8b3ae6SLaura Nao 	MUX_CLR_SET_UPD(CLK_VLP_ULPOSC_SSPM, "vlp_ulposc_sspm",
543*2f8b3ae6SLaura Nao 		vlp_ulposc_sspm_parents, VLP_CLK_CFG_6, VLP_CLK_CFG_6_SET,
544*2f8b3ae6SLaura Nao 		VLP_CLK_CFG_6_CLR, 16, 2,
545*2f8b3ae6SLaura Nao 		VLP_CLK_CFG_UPDATE, TOP_MUX_ULPOSC_SSPM_SHIFT),
546*2f8b3ae6SLaura Nao 	MUX_CLR_SET_UPD(CLK_VLP_VLP_PBUS_26M, "vlp_vlp_pbus_26m",
547*2f8b3ae6SLaura Nao 		vlp_vlp_pbus_26m_parents, VLP_CLK_CFG_6, VLP_CLK_CFG_6_SET,
548*2f8b3ae6SLaura Nao 		VLP_CLK_CFG_6_CLR, 24, 1,
549*2f8b3ae6SLaura Nao 		VLP_CLK_CFG_UPDATE, TOP_MUX_VLP_PBUS_26M_SHIFT),
550*2f8b3ae6SLaura Nao 	/* VLP_CLK_CFG_7 */
551*2f8b3ae6SLaura Nao 	MUX_CLR_SET_UPD(CLK_VLP_DEBUG_ERR_FLAG, "vlp_debug_err_flag",
552*2f8b3ae6SLaura Nao 		vlp_debug_err_flag_parents, VLP_CLK_CFG_7, VLP_CLK_CFG_7_SET,
553*2f8b3ae6SLaura Nao 		VLP_CLK_CFG_7_CLR, 0, 1,
554*2f8b3ae6SLaura Nao 		VLP_CLK_CFG_UPDATE, TOP_MUX_DEBUG_ERR_FLAG_VLP_26M_SHIFT),
555*2f8b3ae6SLaura Nao 	MUX_CLR_SET_UPD(CLK_VLP_DPMSRDMA, "vlp_dpmsrdma",
556*2f8b3ae6SLaura Nao 		vlp_dpmsrdma_parents, VLP_CLK_CFG_7, VLP_CLK_CFG_7_SET,
557*2f8b3ae6SLaura Nao 		VLP_CLK_CFG_7_CLR, 8, 1,
558*2f8b3ae6SLaura Nao 		VLP_CLK_CFG_UPDATE, TOP_MUX_DPMSRDMA_SHIFT),
559*2f8b3ae6SLaura Nao 	MUX_CLR_SET_UPD(CLK_VLP_VLP_PBUS_156M, "vlp_vlp_pbus_156m",
560*2f8b3ae6SLaura Nao 		vlp_vlp_pbus_156m_parents, VLP_CLK_CFG_7, VLP_CLK_CFG_7_SET,
561*2f8b3ae6SLaura Nao 		VLP_CLK_CFG_7_CLR, 16, 2,
562*2f8b3ae6SLaura Nao 		VLP_CLK_CFG_UPDATE, TOP_MUX_VLP_PBUS_156M_SHIFT),
563*2f8b3ae6SLaura Nao 	MUX_CLR_SET_UPD(CLK_VLP_SPM, "vlp_spm",
564*2f8b3ae6SLaura Nao 		vlp_spm_parents, VLP_CLK_CFG_7, VLP_CLK_CFG_7_SET,
565*2f8b3ae6SLaura Nao 		VLP_CLK_CFG_7_CLR, 24, 1,
566*2f8b3ae6SLaura Nao 		VLP_CLK_CFG_UPDATE1, TOP_MUX_SPM_SHIFT),
567*2f8b3ae6SLaura Nao 	/* VLP_CLK_CFG_8 */
568*2f8b3ae6SLaura Nao 	MUX_GATE_FENC_CLR_SET_UPD(CLK_VLP_MMINFRA, "vlp_mminfra", vlp_mminfra_parents,
569*2f8b3ae6SLaura Nao 		VLP_CLK_CFG_8, VLP_CLK_CFG_8_SET, VLP_CLK_CFG_8_CLR,
570*2f8b3ae6SLaura Nao 		0, 2, 7, VLP_CLK_CFG_UPDATE1, TOP_MUX_MMINFRA_VLP_SHIFT,
571*2f8b3ae6SLaura Nao 		VLP_OCIC_FENC_STATUS_MON_1, 31),
572*2f8b3ae6SLaura Nao 	MUX_GATE_FENC_CLR_SET_UPD(CLK_VLP_USB_TOP, "vlp_usb", vlp_usb_parents,
573*2f8b3ae6SLaura Nao 		VLP_CLK_CFG_8, VLP_CLK_CFG_8_SET, VLP_CLK_CFG_8_CLR,
574*2f8b3ae6SLaura Nao 		8, 1, 15, VLP_CLK_CFG_UPDATE1, TOP_MUX_USB_TOP_SHIFT,
575*2f8b3ae6SLaura Nao 		VLP_OCIC_FENC_STATUS_MON_1, 30),
576*2f8b3ae6SLaura Nao 	MUX_GATE_FENC_CLR_SET_UPD(CLK_VLP_USB_XHCI, "vlp_usb_xhci", vlp_usb_parents,
577*2f8b3ae6SLaura Nao 		VLP_CLK_CFG_8, VLP_CLK_CFG_8_SET, VLP_CLK_CFG_8_CLR,
578*2f8b3ae6SLaura Nao 		16, 1, 23, VLP_CLK_CFG_UPDATE1, TOP_MUX_SSUSB_XHCI_SHIFT,
579*2f8b3ae6SLaura Nao 		VLP_OCIC_FENC_STATUS_MON_1, 29),
580*2f8b3ae6SLaura Nao 	MUX_CLR_SET_UPD(CLK_VLP_NOC_VLP, "vlp_noc_vlp",
581*2f8b3ae6SLaura Nao 		vlp_noc_vlp_parents, VLP_CLK_CFG_8, VLP_CLK_CFG_8_SET,
582*2f8b3ae6SLaura Nao 		VLP_CLK_CFG_8_CLR, 24, 2,
583*2f8b3ae6SLaura Nao 		VLP_CLK_CFG_UPDATE1, TOP_MUX_NOC_VLP_SHIFT),
584*2f8b3ae6SLaura Nao 	/* VLP_CLK_CFG_9 */
585*2f8b3ae6SLaura Nao 	MUX_GATE_FENC_CLR_SET_UPD_INDEXED(CLK_VLP_AUDIO_H, "vlp_audio_h",
586*2f8b3ae6SLaura Nao 		vlp_audio_h_parents, vlp_aud_parent_index,
587*2f8b3ae6SLaura Nao 		VLP_CLK_CFG_9, VLP_CLK_CFG_9_SET, VLP_CLK_CFG_9_CLR,
588*2f8b3ae6SLaura Nao 		0, 2, 7, VLP_CLK_CFG_UPDATE1, TOP_MUX_AUDIO_H_SHIFT,
589*2f8b3ae6SLaura Nao 		VLP_OCIC_FENC_STATUS_MON_1, 27),
590*2f8b3ae6SLaura Nao 	MUX_GATE_FENC_CLR_SET_UPD_INDEXED(CLK_VLP_AUD_ENGEN1, "vlp_aud_engen1",
591*2f8b3ae6SLaura Nao 		vlp_aud_engen1_parents, vlp_aud_parent_index,
592*2f8b3ae6SLaura Nao 		VLP_CLK_CFG_9, VLP_CLK_CFG_9_SET, VLP_CLK_CFG_9_CLR,
593*2f8b3ae6SLaura Nao 		8, 2, 15, VLP_CLK_CFG_UPDATE1, TOP_MUX_AUD_ENGEN1_SHIFT,
594*2f8b3ae6SLaura Nao 		VLP_OCIC_FENC_STATUS_MON_1, 26),
595*2f8b3ae6SLaura Nao 	MUX_GATE_FENC_CLR_SET_UPD_INDEXED(CLK_VLP_AUD_ENGEN2, "vlp_aud_engen2",
596*2f8b3ae6SLaura Nao 		vlp_aud_engen2_parents, vlp_aud_parent_index,
597*2f8b3ae6SLaura Nao 		VLP_CLK_CFG_9, VLP_CLK_CFG_9_SET, VLP_CLK_CFG_9_CLR,
598*2f8b3ae6SLaura Nao 		16, 2, 23, VLP_CLK_CFG_UPDATE1, TOP_MUX_AUD_ENGEN2_SHIFT,
599*2f8b3ae6SLaura Nao 		VLP_OCIC_FENC_STATUS_MON_1, 25),
600*2f8b3ae6SLaura Nao 	MUX_GATE_FENC_CLR_SET_UPD_INDEXED(CLK_VLP_AUD_INTBUS, "vlp_aud_intbus",
601*2f8b3ae6SLaura Nao 		vlp_aud_intbus_parents, vlp_aud_parent_index,
602*2f8b3ae6SLaura Nao 		VLP_CLK_CFG_9, VLP_CLK_CFG_9_SET, VLP_CLK_CFG_9_CLR,
603*2f8b3ae6SLaura Nao 		24, 2, 31, VLP_CLK_CFG_UPDATE1, TOP_MUX_AUD_INTBUS_SHIFT,
604*2f8b3ae6SLaura Nao 		VLP_OCIC_FENC_STATUS_MON_1, 24),
605*2f8b3ae6SLaura Nao 	/* VLP_CLK_CFG_10 */
606*2f8b3ae6SLaura Nao 	MUX_CLR_SET_UPD(CLK_VLP_SPVLP_26M, "vlp_spvlp_26m",
607*2f8b3ae6SLaura Nao 		vlp_spvlp_26m_parents, VLP_CLK_CFG_10, VLP_CLK_CFG_10_SET,
608*2f8b3ae6SLaura Nao 		VLP_CLK_CFG_10_CLR, 0, 1,
609*2f8b3ae6SLaura Nao 		VLP_CLK_CFG_UPDATE1, TOP_MUX_SPU_VLP_26M_SHIFT),
610*2f8b3ae6SLaura Nao 	MUX_CLR_SET_UPD(CLK_VLP_SPU0_VLP, "vlp_spu0_vlp",
611*2f8b3ae6SLaura Nao 		vlp_spu0_vlp_parents, VLP_CLK_CFG_10, VLP_CLK_CFG_10_SET,
612*2f8b3ae6SLaura Nao 		VLP_CLK_CFG_10_CLR, 8, 3,
613*2f8b3ae6SLaura Nao 		VLP_CLK_CFG_UPDATE1, TOP_MUX_SPU0_VLP_SHIFT),
614*2f8b3ae6SLaura Nao 	MUX_CLR_SET_UPD(CLK_VLP_SPU1_VLP, "vlp_spu1_vlp",
615*2f8b3ae6SLaura Nao 		vlp_spu1_vlp_parents, VLP_CLK_CFG_10, VLP_CLK_CFG_10_SET,
616*2f8b3ae6SLaura Nao 		VLP_CLK_CFG_10_CLR, 16, 3,
617*2f8b3ae6SLaura Nao 		VLP_CLK_CFG_UPDATE1, TOP_MUX_SPU1_VLP_SHIFT),
618*2f8b3ae6SLaura Nao };
619*2f8b3ae6SLaura Nao 
620*2f8b3ae6SLaura Nao static const struct mtk_pll_data vlp_plls[] = {
621*2f8b3ae6SLaura Nao 	PLL_FENC(CLK_VLP_APLL1, "vlp_apll1", VLP_APLL1_CON0, 0x0358, 1, 0,
622*2f8b3ae6SLaura Nao 		 VLP_APLL1_CON1, 24, VLP_APLL1_CON2, 0, 32, 0),
623*2f8b3ae6SLaura Nao 	PLL_FENC(CLK_VLP_APLL2, "vlp_apll2", VLP_APLL2_CON0, 0x0358, 0, 0,
624*2f8b3ae6SLaura Nao 		 VLP_APLL2_CON1, 24, VLP_APLL2_CON2, 0, 32, 1),
625*2f8b3ae6SLaura Nao };
626*2f8b3ae6SLaura Nao 
627*2f8b3ae6SLaura Nao static const struct regmap_config vlpckgen_regmap_config = {
628*2f8b3ae6SLaura Nao 	.reg_bits = 32,
629*2f8b3ae6SLaura Nao 	.val_bits = 32,
630*2f8b3ae6SLaura Nao 	.reg_stride = 4,
631*2f8b3ae6SLaura Nao 	.max_register = 0x1000,
632*2f8b3ae6SLaura Nao 	.fast_io = true,
633*2f8b3ae6SLaura Nao };
634*2f8b3ae6SLaura Nao 
clk_mt8196_vlp_probe(struct platform_device * pdev)635*2f8b3ae6SLaura Nao static int clk_mt8196_vlp_probe(struct platform_device *pdev)
636*2f8b3ae6SLaura Nao {
637*2f8b3ae6SLaura Nao 	static void __iomem *base;
638*2f8b3ae6SLaura Nao 	struct clk_hw_onecell_data *clk_data;
639*2f8b3ae6SLaura Nao 	int r;
640*2f8b3ae6SLaura Nao 	struct device_node *node = pdev->dev.of_node;
641*2f8b3ae6SLaura Nao 	struct device *dev = &pdev->dev;
642*2f8b3ae6SLaura Nao 	struct regmap *regmap;
643*2f8b3ae6SLaura Nao 
644*2f8b3ae6SLaura Nao 	clk_data = mtk_alloc_clk_data(ARRAY_SIZE(vlp_muxes) +
645*2f8b3ae6SLaura Nao 				      ARRAY_SIZE(vlp_plls) +
646*2f8b3ae6SLaura Nao 				      ARRAY_SIZE(vlp_divs));
647*2f8b3ae6SLaura Nao 	if (!clk_data)
648*2f8b3ae6SLaura Nao 		return -ENOMEM;
649*2f8b3ae6SLaura Nao 
650*2f8b3ae6SLaura Nao 	base = devm_platform_ioremap_resource(pdev, 0);
651*2f8b3ae6SLaura Nao 	if (IS_ERR(base))
652*2f8b3ae6SLaura Nao 		return PTR_ERR(base);
653*2f8b3ae6SLaura Nao 
654*2f8b3ae6SLaura Nao 	regmap = devm_regmap_init_mmio(dev, base, &vlpckgen_regmap_config);
655*2f8b3ae6SLaura Nao 	if (IS_ERR(regmap))
656*2f8b3ae6SLaura Nao 		return PTR_ERR(regmap);
657*2f8b3ae6SLaura Nao 
658*2f8b3ae6SLaura Nao 	r = mtk_clk_register_factors(vlp_divs, ARRAY_SIZE(vlp_divs), clk_data);
659*2f8b3ae6SLaura Nao 	if (r)
660*2f8b3ae6SLaura Nao 		goto free_clk_data;
661*2f8b3ae6SLaura Nao 
662*2f8b3ae6SLaura Nao 	r = mtk_clk_register_muxes(&pdev->dev, vlp_muxes, ARRAY_SIZE(vlp_muxes),
663*2f8b3ae6SLaura Nao 				   node, &mt8196_clk_vlp_lock, clk_data);
664*2f8b3ae6SLaura Nao 	if (r)
665*2f8b3ae6SLaura Nao 		goto unregister_factors;
666*2f8b3ae6SLaura Nao 
667*2f8b3ae6SLaura Nao 	r = mtk_clk_register_plls(node, vlp_plls, ARRAY_SIZE(vlp_plls),
668*2f8b3ae6SLaura Nao 				  clk_data);
669*2f8b3ae6SLaura Nao 	if (r)
670*2f8b3ae6SLaura Nao 		goto unregister_muxes;
671*2f8b3ae6SLaura Nao 
672*2f8b3ae6SLaura Nao 	r = of_clk_add_hw_provider(node, of_clk_hw_onecell_get, clk_data);
673*2f8b3ae6SLaura Nao 	if (r)
674*2f8b3ae6SLaura Nao 		goto unregister_plls;
675*2f8b3ae6SLaura Nao 
676*2f8b3ae6SLaura Nao 	platform_set_drvdata(pdev, clk_data);
677*2f8b3ae6SLaura Nao 
678*2f8b3ae6SLaura Nao 	/* Initialize APLL tuner registers */
679*2f8b3ae6SLaura Nao 	regmap_write(regmap, VLP_APLL1_TUNER_CON0, VLP_APLL1_TUNER_CON0_VALUE);
680*2f8b3ae6SLaura Nao 	regmap_write(regmap, VLP_APLL2_TUNER_CON0, VLP_APLL2_TUNER_CON0_VALUE);
681*2f8b3ae6SLaura Nao 
682*2f8b3ae6SLaura Nao 	return r;
683*2f8b3ae6SLaura Nao 
684*2f8b3ae6SLaura Nao unregister_plls:
685*2f8b3ae6SLaura Nao 	mtk_clk_unregister_plls(vlp_plls, ARRAY_SIZE(vlp_plls), clk_data);
686*2f8b3ae6SLaura Nao unregister_muxes:
687*2f8b3ae6SLaura Nao 	mtk_clk_unregister_muxes(vlp_muxes, ARRAY_SIZE(vlp_muxes), clk_data);
688*2f8b3ae6SLaura Nao unregister_factors:
689*2f8b3ae6SLaura Nao 	mtk_clk_unregister_factors(vlp_divs, ARRAY_SIZE(vlp_divs), clk_data);
690*2f8b3ae6SLaura Nao free_clk_data:
691*2f8b3ae6SLaura Nao 	mtk_free_clk_data(clk_data);
692*2f8b3ae6SLaura Nao 
693*2f8b3ae6SLaura Nao 	return r;
694*2f8b3ae6SLaura Nao }
695*2f8b3ae6SLaura Nao 
clk_mt8196_vlp_remove(struct platform_device * pdev)696*2f8b3ae6SLaura Nao static void clk_mt8196_vlp_remove(struct platform_device *pdev)
697*2f8b3ae6SLaura Nao {
698*2f8b3ae6SLaura Nao 	struct clk_hw_onecell_data *clk_data = platform_get_drvdata(pdev);
699*2f8b3ae6SLaura Nao 	struct device_node *node = pdev->dev.of_node;
700*2f8b3ae6SLaura Nao 
701*2f8b3ae6SLaura Nao 	of_clk_del_provider(node);
702*2f8b3ae6SLaura Nao 	mtk_clk_unregister_plls(vlp_plls, ARRAY_SIZE(vlp_plls), clk_data);
703*2f8b3ae6SLaura Nao 	mtk_clk_unregister_muxes(vlp_muxes, ARRAY_SIZE(vlp_muxes), clk_data);
704*2f8b3ae6SLaura Nao 	mtk_clk_unregister_factors(vlp_divs, ARRAY_SIZE(vlp_divs), clk_data);
705*2f8b3ae6SLaura Nao 	mtk_free_clk_data(clk_data);
706*2f8b3ae6SLaura Nao }
707*2f8b3ae6SLaura Nao 
708*2f8b3ae6SLaura Nao static const struct of_device_id of_match_clk_mt8196_vlp_ck[] = {
709*2f8b3ae6SLaura Nao 	{ .compatible = "mediatek,mt8196-vlpckgen" },
710*2f8b3ae6SLaura Nao 	{ /* sentinel */ }
711*2f8b3ae6SLaura Nao };
712*2f8b3ae6SLaura Nao MODULE_DEVICE_TABLE(of, of_match_clk_mt8196_vlp_ck);
713*2f8b3ae6SLaura Nao 
714*2f8b3ae6SLaura Nao static struct platform_driver clk_mt8196_vlp_drv = {
715*2f8b3ae6SLaura Nao 	.probe = clk_mt8196_vlp_probe,
716*2f8b3ae6SLaura Nao 	.remove = clk_mt8196_vlp_remove,
717*2f8b3ae6SLaura Nao 	.driver = {
718*2f8b3ae6SLaura Nao 		.name = "clk-mt8196-vlpck",
719*2f8b3ae6SLaura Nao 		.of_match_table = of_match_clk_mt8196_vlp_ck,
720*2f8b3ae6SLaura Nao 	},
721*2f8b3ae6SLaura Nao };
722*2f8b3ae6SLaura Nao 
723*2f8b3ae6SLaura Nao MODULE_DESCRIPTION("MediaTek MT8196 VLP clock generator driver");
724*2f8b3ae6SLaura Nao module_platform_driver(clk_mt8196_vlp_drv);
725*2f8b3ae6SLaura Nao MODULE_LICENSE("GPL");
726