xref: /linux/drivers/clk/qcom/dispcc-milos.c (revision 8d2b0853add1d7534dc0794e3c8e0b9e8c4ec640)
1*f40b5217SLuca Weiss // SPDX-License-Identifier: GPL-2.0-only
2*f40b5217SLuca Weiss /*
3*f40b5217SLuca Weiss  * Copyright (c) 2024, Qualcomm Innovation Center, Inc. All rights reserved.
4*f40b5217SLuca Weiss  * Copyright (c) 2025, Luca Weiss <luca.weiss@fairphone.com>
5*f40b5217SLuca Weiss  */
6*f40b5217SLuca Weiss 
7*f40b5217SLuca Weiss #include <linux/clk.h>
8*f40b5217SLuca Weiss #include <linux/clk-provider.h>
9*f40b5217SLuca Weiss #include <linux/err.h>
10*f40b5217SLuca Weiss #include <linux/kernel.h>
11*f40b5217SLuca Weiss #include <linux/module.h>
12*f40b5217SLuca Weiss #include <linux/of.h>
13*f40b5217SLuca Weiss #include <linux/platform_device.h>
14*f40b5217SLuca Weiss #include <linux/regmap.h>
15*f40b5217SLuca Weiss 
16*f40b5217SLuca Weiss #include <dt-bindings/clock/qcom,milos-dispcc.h>
17*f40b5217SLuca Weiss 
18*f40b5217SLuca Weiss #include "common.h"
19*f40b5217SLuca Weiss #include "clk-alpha-pll.h"
20*f40b5217SLuca Weiss #include "clk-branch.h"
21*f40b5217SLuca Weiss #include "clk-pll.h"
22*f40b5217SLuca Weiss #include "clk-rcg.h"
23*f40b5217SLuca Weiss #include "clk-regmap.h"
24*f40b5217SLuca Weiss #include "clk-regmap-divider.h"
25*f40b5217SLuca Weiss #include "clk-regmap-mux.h"
26*f40b5217SLuca Weiss #include "reset.h"
27*f40b5217SLuca Weiss #include "gdsc.h"
28*f40b5217SLuca Weiss 
29*f40b5217SLuca Weiss /* Need to match the order of clocks in DT binding */
30*f40b5217SLuca Weiss enum {
31*f40b5217SLuca Weiss 	DT_BI_TCXO,
32*f40b5217SLuca Weiss 	DT_SLEEP_CLK,
33*f40b5217SLuca Weiss 	DT_AHB_CLK,
34*f40b5217SLuca Weiss 	DT_GCC_DISP_GPLL0_CLK,
35*f40b5217SLuca Weiss 	DT_DSI0_PHY_PLL_OUT_BYTECLK,
36*f40b5217SLuca Weiss 	DT_DSI0_PHY_PLL_OUT_DSICLK,
37*f40b5217SLuca Weiss 	DT_DP0_PHY_PLL_LINK_CLK,
38*f40b5217SLuca Weiss 	DT_DP0_PHY_PLL_VCO_DIV_CLK,
39*f40b5217SLuca Weiss };
40*f40b5217SLuca Weiss 
41*f40b5217SLuca Weiss #define DISP_CC_MISC_CMD	0xF000
42*f40b5217SLuca Weiss 
43*f40b5217SLuca Weiss enum {
44*f40b5217SLuca Weiss 	P_BI_TCXO,
45*f40b5217SLuca Weiss 	P_DISP_CC_PLL0_OUT_EVEN,
46*f40b5217SLuca Weiss 	P_DISP_CC_PLL0_OUT_MAIN,
47*f40b5217SLuca Weiss 	P_DP0_PHY_PLL_LINK_CLK,
48*f40b5217SLuca Weiss 	P_DP0_PHY_PLL_VCO_DIV_CLK,
49*f40b5217SLuca Weiss 	P_DSI0_PHY_PLL_OUT_BYTECLK,
50*f40b5217SLuca Weiss 	P_DSI0_PHY_PLL_OUT_DSICLK,
51*f40b5217SLuca Weiss 	P_GCC_DISP_GPLL0_CLK,
52*f40b5217SLuca Weiss 	P_SLEEP_CLK,
53*f40b5217SLuca Weiss };
54*f40b5217SLuca Weiss 
55*f40b5217SLuca Weiss static const struct pll_vco lucid_ole_vco[] = {
56*f40b5217SLuca Weiss 	{ 249600000, 2300000000, 0 },
57*f40b5217SLuca Weiss };
58*f40b5217SLuca Weiss 
59*f40b5217SLuca Weiss /* 257.142858 MHz Configuration */
60*f40b5217SLuca Weiss static const struct alpha_pll_config disp_cc_pll0_config = {
61*f40b5217SLuca Weiss 	.l = 0xd,
62*f40b5217SLuca Weiss 	.alpha = 0x6492,
63*f40b5217SLuca Weiss 	.config_ctl_val = 0x20485699,
64*f40b5217SLuca Weiss 	.config_ctl_hi_val = 0x00182261,
65*f40b5217SLuca Weiss 	.config_ctl_hi1_val = 0x82aa299c,
66*f40b5217SLuca Weiss 	.test_ctl_val = 0x00000000,
67*f40b5217SLuca Weiss 	.test_ctl_hi_val = 0x00000003,
68*f40b5217SLuca Weiss 	.test_ctl_hi1_val = 0x00009000,
69*f40b5217SLuca Weiss 	.test_ctl_hi2_val = 0x00000034,
70*f40b5217SLuca Weiss 	.user_ctl_val = 0x00000000,
71*f40b5217SLuca Weiss 	.user_ctl_hi_val = 0x00000005,
72*f40b5217SLuca Weiss };
73*f40b5217SLuca Weiss 
74*f40b5217SLuca Weiss static struct clk_alpha_pll disp_cc_pll0 = {
75*f40b5217SLuca Weiss 	.offset = 0x0,
76*f40b5217SLuca Weiss 	.config = &disp_cc_pll0_config,
77*f40b5217SLuca Weiss 	.vco_table = lucid_ole_vco,
78*f40b5217SLuca Weiss 	.num_vco = ARRAY_SIZE(lucid_ole_vco),
79*f40b5217SLuca Weiss 	.regs = clk_alpha_pll_regs[CLK_ALPHA_PLL_TYPE_LUCID_OLE],
80*f40b5217SLuca Weiss 	.clkr = {
81*f40b5217SLuca Weiss 		.hw.init = &(const struct clk_init_data) {
82*f40b5217SLuca Weiss 			.name = "disp_cc_pll0",
83*f40b5217SLuca Weiss 			.parent_data = &(const struct clk_parent_data) {
84*f40b5217SLuca Weiss 				.index = DT_BI_TCXO,
85*f40b5217SLuca Weiss 			},
86*f40b5217SLuca Weiss 			.num_parents = 1,
87*f40b5217SLuca Weiss 			.ops = &clk_alpha_pll_lucid_evo_ops,
88*f40b5217SLuca Weiss 		},
89*f40b5217SLuca Weiss 	},
90*f40b5217SLuca Weiss };
91*f40b5217SLuca Weiss 
92*f40b5217SLuca Weiss static const struct parent_map disp_cc_parent_map_0[] = {
93*f40b5217SLuca Weiss 	{ P_BI_TCXO, 0 },
94*f40b5217SLuca Weiss };
95*f40b5217SLuca Weiss 
96*f40b5217SLuca Weiss static const struct clk_parent_data disp_cc_parent_data_0[] = {
97*f40b5217SLuca Weiss 	{ .index = DT_BI_TCXO },
98*f40b5217SLuca Weiss };
99*f40b5217SLuca Weiss 
100*f40b5217SLuca Weiss static const struct parent_map disp_cc_parent_map_1[] = {
101*f40b5217SLuca Weiss 	{ P_BI_TCXO, 0 },
102*f40b5217SLuca Weiss 	{ P_DSI0_PHY_PLL_OUT_DSICLK, 1 },
103*f40b5217SLuca Weiss 	{ P_DSI0_PHY_PLL_OUT_BYTECLK, 2 },
104*f40b5217SLuca Weiss };
105*f40b5217SLuca Weiss 
106*f40b5217SLuca Weiss static const struct clk_parent_data disp_cc_parent_data_1[] = {
107*f40b5217SLuca Weiss 	{ .index = DT_BI_TCXO },
108*f40b5217SLuca Weiss 	{ .index = DT_DSI0_PHY_PLL_OUT_DSICLK },
109*f40b5217SLuca Weiss 	{ .index = DT_DSI0_PHY_PLL_OUT_BYTECLK },
110*f40b5217SLuca Weiss };
111*f40b5217SLuca Weiss 
112*f40b5217SLuca Weiss static const struct parent_map disp_cc_parent_map_2[] = {
113*f40b5217SLuca Weiss 	{ P_BI_TCXO, 0 },
114*f40b5217SLuca Weiss 	{ P_DP0_PHY_PLL_LINK_CLK, 1 },
115*f40b5217SLuca Weiss 	{ P_DP0_PHY_PLL_VCO_DIV_CLK, 2 },
116*f40b5217SLuca Weiss };
117*f40b5217SLuca Weiss 
118*f40b5217SLuca Weiss static const struct clk_parent_data disp_cc_parent_data_2[] = {
119*f40b5217SLuca Weiss 	{ .index = DT_BI_TCXO },
120*f40b5217SLuca Weiss 	{ .index = DT_DP0_PHY_PLL_LINK_CLK },
121*f40b5217SLuca Weiss 	{ .index = DT_DP0_PHY_PLL_VCO_DIV_CLK },
122*f40b5217SLuca Weiss };
123*f40b5217SLuca Weiss 
124*f40b5217SLuca Weiss static const struct parent_map disp_cc_parent_map_3[] = {
125*f40b5217SLuca Weiss 	{ P_BI_TCXO, 0 },
126*f40b5217SLuca Weiss 	{ P_GCC_DISP_GPLL0_CLK, 4 },
127*f40b5217SLuca Weiss };
128*f40b5217SLuca Weiss 
129*f40b5217SLuca Weiss static const struct clk_parent_data disp_cc_parent_data_3[] = {
130*f40b5217SLuca Weiss 	{ .index = DT_BI_TCXO },
131*f40b5217SLuca Weiss 	{ .index = DT_GCC_DISP_GPLL0_CLK },
132*f40b5217SLuca Weiss };
133*f40b5217SLuca Weiss 
134*f40b5217SLuca Weiss static const struct parent_map disp_cc_parent_map_4[] = {
135*f40b5217SLuca Weiss 	{ P_BI_TCXO, 0 },
136*f40b5217SLuca Weiss 	{ P_DP0_PHY_PLL_LINK_CLK, 1 },
137*f40b5217SLuca Weiss };
138*f40b5217SLuca Weiss 
139*f40b5217SLuca Weiss static const struct clk_parent_data disp_cc_parent_data_4[] = {
140*f40b5217SLuca Weiss 	{ .index = DT_BI_TCXO },
141*f40b5217SLuca Weiss 	{ .index = DT_DP0_PHY_PLL_LINK_CLK },
142*f40b5217SLuca Weiss };
143*f40b5217SLuca Weiss 
144*f40b5217SLuca Weiss static const struct parent_map disp_cc_parent_map_5[] = {
145*f40b5217SLuca Weiss 	{ P_BI_TCXO, 0 },
146*f40b5217SLuca Weiss 	{ P_DSI0_PHY_PLL_OUT_BYTECLK, 2 },
147*f40b5217SLuca Weiss };
148*f40b5217SLuca Weiss 
149*f40b5217SLuca Weiss static const struct clk_parent_data disp_cc_parent_data_5[] = {
150*f40b5217SLuca Weiss 	{ .index = DT_BI_TCXO },
151*f40b5217SLuca Weiss 	{ .index = DT_DSI0_PHY_PLL_OUT_BYTECLK },
152*f40b5217SLuca Weiss };
153*f40b5217SLuca Weiss 
154*f40b5217SLuca Weiss static const struct parent_map disp_cc_parent_map_6[] = {
155*f40b5217SLuca Weiss 	{ P_BI_TCXO, 0 },
156*f40b5217SLuca Weiss 	{ P_DISP_CC_PLL0_OUT_MAIN, 1 },
157*f40b5217SLuca Weiss 	{ P_GCC_DISP_GPLL0_CLK, 4 },
158*f40b5217SLuca Weiss 	{ P_DISP_CC_PLL0_OUT_EVEN, 6 },
159*f40b5217SLuca Weiss };
160*f40b5217SLuca Weiss 
161*f40b5217SLuca Weiss static const struct clk_parent_data disp_cc_parent_data_6[] = {
162*f40b5217SLuca Weiss 	{ .index = DT_BI_TCXO },
163*f40b5217SLuca Weiss 	{ .hw = &disp_cc_pll0.clkr.hw },
164*f40b5217SLuca Weiss 	{ .index = DT_GCC_DISP_GPLL0_CLK },
165*f40b5217SLuca Weiss 	{ .hw = &disp_cc_pll0.clkr.hw },
166*f40b5217SLuca Weiss };
167*f40b5217SLuca Weiss 
168*f40b5217SLuca Weiss static const struct parent_map disp_cc_parent_map_7[] = {
169*f40b5217SLuca Weiss 	{ P_SLEEP_CLK, 0 },
170*f40b5217SLuca Weiss };
171*f40b5217SLuca Weiss 
172*f40b5217SLuca Weiss static const struct clk_parent_data disp_cc_parent_data_7_ao[] = {
173*f40b5217SLuca Weiss 	{ .index = DT_SLEEP_CLK },
174*f40b5217SLuca Weiss };
175*f40b5217SLuca Weiss 
176*f40b5217SLuca Weiss static const struct freq_tbl ftbl_disp_cc_mdss_ahb_clk_src[] = {
177*f40b5217SLuca Weiss 	F(19200000, P_BI_TCXO, 1, 0, 0),
178*f40b5217SLuca Weiss 	F(37500000, P_GCC_DISP_GPLL0_CLK, 8, 0, 0),
179*f40b5217SLuca Weiss 	F(75000000, P_GCC_DISP_GPLL0_CLK, 4, 0, 0),
180*f40b5217SLuca Weiss 	{ }
181*f40b5217SLuca Weiss };
182*f40b5217SLuca Weiss 
183*f40b5217SLuca Weiss static struct clk_rcg2 disp_cc_mdss_ahb_clk_src = {
184*f40b5217SLuca Weiss 	.cmd_rcgr = 0x8130,
185*f40b5217SLuca Weiss 	.mnd_width = 0,
186*f40b5217SLuca Weiss 	.hid_width = 5,
187*f40b5217SLuca Weiss 	.parent_map = disp_cc_parent_map_3,
188*f40b5217SLuca Weiss 	.freq_tbl = ftbl_disp_cc_mdss_ahb_clk_src,
189*f40b5217SLuca Weiss 	.clkr.hw.init = &(const struct clk_init_data) {
190*f40b5217SLuca Weiss 		.name = "disp_cc_mdss_ahb_clk_src",
191*f40b5217SLuca Weiss 		.parent_data = disp_cc_parent_data_3,
192*f40b5217SLuca Weiss 		.num_parents = ARRAY_SIZE(disp_cc_parent_data_3),
193*f40b5217SLuca Weiss 		.flags = CLK_SET_RATE_PARENT,
194*f40b5217SLuca Weiss 		.ops = &clk_rcg2_shared_ops,
195*f40b5217SLuca Weiss 	},
196*f40b5217SLuca Weiss };
197*f40b5217SLuca Weiss 
198*f40b5217SLuca Weiss static struct clk_rcg2 disp_cc_mdss_byte0_clk_src = {
199*f40b5217SLuca Weiss 	.cmd_rcgr = 0x8098,
200*f40b5217SLuca Weiss 	.mnd_width = 0,
201*f40b5217SLuca Weiss 	.hid_width = 5,
202*f40b5217SLuca Weiss 	.parent_map = disp_cc_parent_map_1,
203*f40b5217SLuca Weiss 	.clkr.hw.init = &(const struct clk_init_data) {
204*f40b5217SLuca Weiss 		.name = "disp_cc_mdss_byte0_clk_src",
205*f40b5217SLuca Weiss 		.parent_data = disp_cc_parent_data_1,
206*f40b5217SLuca Weiss 		.num_parents = ARRAY_SIZE(disp_cc_parent_data_1),
207*f40b5217SLuca Weiss 		.flags = CLK_SET_RATE_PARENT,
208*f40b5217SLuca Weiss 		.ops = &clk_byte2_ops,
209*f40b5217SLuca Weiss 	},
210*f40b5217SLuca Weiss };
211*f40b5217SLuca Weiss 
212*f40b5217SLuca Weiss static const struct freq_tbl ftbl_disp_cc_mdss_dptx0_aux_clk_src[] = {
213*f40b5217SLuca Weiss 	F(19200000, P_BI_TCXO, 1, 0, 0),
214*f40b5217SLuca Weiss 	{ }
215*f40b5217SLuca Weiss };
216*f40b5217SLuca Weiss 
217*f40b5217SLuca Weiss static struct clk_rcg2 disp_cc_mdss_dptx0_aux_clk_src = {
218*f40b5217SLuca Weiss 	.cmd_rcgr = 0x8118,
219*f40b5217SLuca Weiss 	.mnd_width = 0,
220*f40b5217SLuca Weiss 	.hid_width = 5,
221*f40b5217SLuca Weiss 	.parent_map = disp_cc_parent_map_0,
222*f40b5217SLuca Weiss 	.freq_tbl = ftbl_disp_cc_mdss_dptx0_aux_clk_src,
223*f40b5217SLuca Weiss 	.clkr.hw.init = &(const struct clk_init_data) {
224*f40b5217SLuca Weiss 		.name = "disp_cc_mdss_dptx0_aux_clk_src",
225*f40b5217SLuca Weiss 		.parent_data = disp_cc_parent_data_0,
226*f40b5217SLuca Weiss 		.num_parents = ARRAY_SIZE(disp_cc_parent_data_0),
227*f40b5217SLuca Weiss 		.flags = CLK_SET_RATE_PARENT,
228*f40b5217SLuca Weiss 		.ops = &clk_rcg2_ops,
229*f40b5217SLuca Weiss 	},
230*f40b5217SLuca Weiss };
231*f40b5217SLuca Weiss 
232*f40b5217SLuca Weiss static struct clk_rcg2 disp_cc_mdss_dptx0_link_clk_src = {
233*f40b5217SLuca Weiss 	.cmd_rcgr = 0x80cc,
234*f40b5217SLuca Weiss 	.mnd_width = 0,
235*f40b5217SLuca Weiss 	.hid_width = 5,
236*f40b5217SLuca Weiss 	.parent_map = disp_cc_parent_map_4,
237*f40b5217SLuca Weiss 	.clkr.hw.init = &(const struct clk_init_data) {
238*f40b5217SLuca Weiss 		.name = "disp_cc_mdss_dptx0_link_clk_src",
239*f40b5217SLuca Weiss 		.parent_data = disp_cc_parent_data_4,
240*f40b5217SLuca Weiss 		.num_parents = ARRAY_SIZE(disp_cc_parent_data_4),
241*f40b5217SLuca Weiss 		.flags = CLK_SET_RATE_PARENT,
242*f40b5217SLuca Weiss 		.ops = &clk_byte2_ops,
243*f40b5217SLuca Weiss 	},
244*f40b5217SLuca Weiss };
245*f40b5217SLuca Weiss 
246*f40b5217SLuca Weiss static struct clk_rcg2 disp_cc_mdss_dptx0_pixel0_clk_src = {
247*f40b5217SLuca Weiss 	.cmd_rcgr = 0x80e8,
248*f40b5217SLuca Weiss 	.mnd_width = 16,
249*f40b5217SLuca Weiss 	.hid_width = 5,
250*f40b5217SLuca Weiss 	.parent_map = disp_cc_parent_map_2,
251*f40b5217SLuca Weiss 	.clkr.hw.init = &(const struct clk_init_data) {
252*f40b5217SLuca Weiss 		.name = "disp_cc_mdss_dptx0_pixel0_clk_src",
253*f40b5217SLuca Weiss 		.parent_data = disp_cc_parent_data_2,
254*f40b5217SLuca Weiss 		.num_parents = ARRAY_SIZE(disp_cc_parent_data_2),
255*f40b5217SLuca Weiss 		.flags = CLK_SET_RATE_PARENT,
256*f40b5217SLuca Weiss 		.ops = &clk_dp_ops,
257*f40b5217SLuca Weiss 	},
258*f40b5217SLuca Weiss };
259*f40b5217SLuca Weiss 
260*f40b5217SLuca Weiss static struct clk_rcg2 disp_cc_mdss_dptx0_pixel1_clk_src = {
261*f40b5217SLuca Weiss 	.cmd_rcgr = 0x8100,
262*f40b5217SLuca Weiss 	.mnd_width = 16,
263*f40b5217SLuca Weiss 	.hid_width = 5,
264*f40b5217SLuca Weiss 	.parent_map = disp_cc_parent_map_2,
265*f40b5217SLuca Weiss 	.clkr.hw.init = &(const struct clk_init_data) {
266*f40b5217SLuca Weiss 		.name = "disp_cc_mdss_dptx0_pixel1_clk_src",
267*f40b5217SLuca Weiss 		.parent_data = disp_cc_parent_data_2,
268*f40b5217SLuca Weiss 		.num_parents = ARRAY_SIZE(disp_cc_parent_data_2),
269*f40b5217SLuca Weiss 		.flags = CLK_SET_RATE_PARENT,
270*f40b5217SLuca Weiss 		.ops = &clk_dp_ops,
271*f40b5217SLuca Weiss 	},
272*f40b5217SLuca Weiss };
273*f40b5217SLuca Weiss 
274*f40b5217SLuca Weiss static const struct freq_tbl ftbl_disp_cc_mdss_esc0_clk_src[] = {
275*f40b5217SLuca Weiss 	F(9600000, P_BI_TCXO, 2, 0, 0),
276*f40b5217SLuca Weiss 	F(12800000, P_BI_TCXO, 1.5, 0, 0),
277*f40b5217SLuca Weiss 	F(19200000, P_BI_TCXO, 1, 0, 0),
278*f40b5217SLuca Weiss 	{ }
279*f40b5217SLuca Weiss };
280*f40b5217SLuca Weiss static struct clk_rcg2 disp_cc_mdss_esc0_clk_src = {
281*f40b5217SLuca Weiss 	.cmd_rcgr = 0x80b4,
282*f40b5217SLuca Weiss 	.mnd_width = 0,
283*f40b5217SLuca Weiss 	.hid_width = 5,
284*f40b5217SLuca Weiss 	.parent_map = disp_cc_parent_map_5,
285*f40b5217SLuca Weiss 	.freq_tbl = ftbl_disp_cc_mdss_esc0_clk_src,
286*f40b5217SLuca Weiss 	.clkr.hw.init = &(const struct clk_init_data) {
287*f40b5217SLuca Weiss 		.name = "disp_cc_mdss_esc0_clk_src",
288*f40b5217SLuca Weiss 		.parent_data = disp_cc_parent_data_5,
289*f40b5217SLuca Weiss 		.num_parents = ARRAY_SIZE(disp_cc_parent_data_5),
290*f40b5217SLuca Weiss 		.flags = CLK_SET_RATE_PARENT,
291*f40b5217SLuca Weiss 		.ops = &clk_rcg2_ops,
292*f40b5217SLuca Weiss 	},
293*f40b5217SLuca Weiss };
294*f40b5217SLuca Weiss 
295*f40b5217SLuca Weiss static const struct freq_tbl ftbl_disp_cc_mdss_mdp_clk_src[] = {
296*f40b5217SLuca Weiss 	F(19200000, P_BI_TCXO, 1, 0, 0),
297*f40b5217SLuca Weiss 	F(85714286, P_DISP_CC_PLL0_OUT_MAIN, 3, 0, 0),
298*f40b5217SLuca Weiss 	F(100000000, P_DISP_CC_PLL0_OUT_MAIN, 3, 0, 0),
299*f40b5217SLuca Weiss 	F(200000000, P_DISP_CC_PLL0_OUT_MAIN, 3, 0, 0),
300*f40b5217SLuca Weiss 	F(342000000, P_DISP_CC_PLL0_OUT_MAIN, 3, 0, 0),
301*f40b5217SLuca Weiss 	F(402000000, P_DISP_CC_PLL0_OUT_MAIN, 3, 0, 0),
302*f40b5217SLuca Weiss 	F(535000000, P_DISP_CC_PLL0_OUT_MAIN, 3, 0, 0),
303*f40b5217SLuca Weiss 	F(600000000, P_DISP_CC_PLL0_OUT_MAIN, 3, 0, 0),
304*f40b5217SLuca Weiss 	F(630000000, P_DISP_CC_PLL0_OUT_MAIN, 3, 0, 0),
305*f40b5217SLuca Weiss 	{ }
306*f40b5217SLuca Weiss };
307*f40b5217SLuca Weiss 
308*f40b5217SLuca Weiss static struct clk_rcg2 disp_cc_mdss_mdp_clk_src = {
309*f40b5217SLuca Weiss 	.cmd_rcgr = 0x8068,
310*f40b5217SLuca Weiss 	.mnd_width = 0,
311*f40b5217SLuca Weiss 	.hid_width = 5,
312*f40b5217SLuca Weiss 	.parent_map = disp_cc_parent_map_6,
313*f40b5217SLuca Weiss 	.freq_tbl = ftbl_disp_cc_mdss_mdp_clk_src,
314*f40b5217SLuca Weiss 	.clkr.hw.init = &(const struct clk_init_data) {
315*f40b5217SLuca Weiss 		.name = "disp_cc_mdss_mdp_clk_src",
316*f40b5217SLuca Weiss 		.parent_data = disp_cc_parent_data_6,
317*f40b5217SLuca Weiss 		.num_parents = ARRAY_SIZE(disp_cc_parent_data_6),
318*f40b5217SLuca Weiss 		.flags = CLK_SET_RATE_PARENT,
319*f40b5217SLuca Weiss 		.ops = &clk_rcg2_shared_ops,
320*f40b5217SLuca Weiss 	},
321*f40b5217SLuca Weiss };
322*f40b5217SLuca Weiss 
323*f40b5217SLuca Weiss static struct clk_rcg2 disp_cc_mdss_pclk0_clk_src = {
324*f40b5217SLuca Weiss 	.cmd_rcgr = 0x8050,
325*f40b5217SLuca Weiss 	.mnd_width = 8,
326*f40b5217SLuca Weiss 	.hid_width = 5,
327*f40b5217SLuca Weiss 	.parent_map = disp_cc_parent_map_1,
328*f40b5217SLuca Weiss 	.clkr.hw.init = &(const struct clk_init_data) {
329*f40b5217SLuca Weiss 		.name = "disp_cc_mdss_pclk0_clk_src",
330*f40b5217SLuca Weiss 		.parent_data = disp_cc_parent_data_1,
331*f40b5217SLuca Weiss 		.num_parents = ARRAY_SIZE(disp_cc_parent_data_1),
332*f40b5217SLuca Weiss 		.flags = CLK_SET_RATE_PARENT,
333*f40b5217SLuca Weiss 		.ops = &clk_pixel_ops,
334*f40b5217SLuca Weiss 	},
335*f40b5217SLuca Weiss };
336*f40b5217SLuca Weiss 
337*f40b5217SLuca Weiss static struct clk_rcg2 disp_cc_mdss_vsync_clk_src = {
338*f40b5217SLuca Weiss 	.cmd_rcgr = 0x8080,
339*f40b5217SLuca Weiss 	.mnd_width = 0,
340*f40b5217SLuca Weiss 	.hid_width = 5,
341*f40b5217SLuca Weiss 	.parent_map = disp_cc_parent_map_0,
342*f40b5217SLuca Weiss 	.freq_tbl = ftbl_disp_cc_mdss_dptx0_aux_clk_src,
343*f40b5217SLuca Weiss 	.clkr.hw.init = &(const struct clk_init_data) {
344*f40b5217SLuca Weiss 		.name = "disp_cc_mdss_vsync_clk_src",
345*f40b5217SLuca Weiss 		.parent_data = disp_cc_parent_data_0,
346*f40b5217SLuca Weiss 		.num_parents = ARRAY_SIZE(disp_cc_parent_data_0),
347*f40b5217SLuca Weiss 		.flags = CLK_SET_RATE_PARENT,
348*f40b5217SLuca Weiss 		.ops = &clk_rcg2_ops,
349*f40b5217SLuca Weiss 	},
350*f40b5217SLuca Weiss };
351*f40b5217SLuca Weiss 
352*f40b5217SLuca Weiss static const struct freq_tbl ftbl_disp_cc_sleep_clk_src[] = {
353*f40b5217SLuca Weiss 	F(32000, P_SLEEP_CLK, 1, 0, 0),
354*f40b5217SLuca Weiss 	{ }
355*f40b5217SLuca Weiss };
356*f40b5217SLuca Weiss 
357*f40b5217SLuca Weiss static struct clk_rcg2 disp_cc_sleep_clk_src = {
358*f40b5217SLuca Weiss 	.cmd_rcgr = 0xe054,
359*f40b5217SLuca Weiss 	.mnd_width = 0,
360*f40b5217SLuca Weiss 	.hid_width = 5,
361*f40b5217SLuca Weiss 	.parent_map = disp_cc_parent_map_7,
362*f40b5217SLuca Weiss 	.freq_tbl = ftbl_disp_cc_sleep_clk_src,
363*f40b5217SLuca Weiss 	.clkr.hw.init = &(const struct clk_init_data) {
364*f40b5217SLuca Weiss 		.name = "disp_cc_sleep_clk_src",
365*f40b5217SLuca Weiss 		.parent_data = disp_cc_parent_data_7_ao,
366*f40b5217SLuca Weiss 		.num_parents = ARRAY_SIZE(disp_cc_parent_data_7_ao),
367*f40b5217SLuca Weiss 		.flags = CLK_SET_RATE_PARENT,
368*f40b5217SLuca Weiss 		.ops = &clk_rcg2_ops,
369*f40b5217SLuca Weiss 	},
370*f40b5217SLuca Weiss };
371*f40b5217SLuca Weiss 
372*f40b5217SLuca Weiss static struct clk_rcg2 disp_cc_xo_clk_src = {
373*f40b5217SLuca Weiss 	.cmd_rcgr = 0xe034,
374*f40b5217SLuca Weiss 	.mnd_width = 0,
375*f40b5217SLuca Weiss 	.hid_width = 5,
376*f40b5217SLuca Weiss 	.parent_map = disp_cc_parent_map_0,
377*f40b5217SLuca Weiss 	.freq_tbl = ftbl_disp_cc_mdss_dptx0_aux_clk_src,
378*f40b5217SLuca Weiss 	.clkr.hw.init = &(const struct clk_init_data) {
379*f40b5217SLuca Weiss 		.name = "disp_cc_xo_clk_src",
380*f40b5217SLuca Weiss 		.parent_data = disp_cc_parent_data_0,
381*f40b5217SLuca Weiss 		.num_parents = ARRAY_SIZE(disp_cc_parent_data_0),
382*f40b5217SLuca Weiss 		.flags = CLK_SET_RATE_PARENT,
383*f40b5217SLuca Weiss 		.ops = &clk_rcg2_ops,
384*f40b5217SLuca Weiss 	},
385*f40b5217SLuca Weiss };
386*f40b5217SLuca Weiss 
387*f40b5217SLuca Weiss static struct clk_regmap_div disp_cc_mdss_byte0_div_clk_src = {
388*f40b5217SLuca Weiss 	.reg = 0x80b0,
389*f40b5217SLuca Weiss 	.shift = 0,
390*f40b5217SLuca Weiss 	.width = 4,
391*f40b5217SLuca Weiss 	.clkr.hw.init = &(const struct clk_init_data) {
392*f40b5217SLuca Weiss 		.name = "disp_cc_mdss_byte0_div_clk_src",
393*f40b5217SLuca Weiss 		.parent_hws = (const struct clk_hw*[]) {
394*f40b5217SLuca Weiss 			&disp_cc_mdss_byte0_clk_src.clkr.hw,
395*f40b5217SLuca Weiss 		},
396*f40b5217SLuca Weiss 		.num_parents = 1,
397*f40b5217SLuca Weiss 		.flags = CLK_SET_RATE_PARENT,
398*f40b5217SLuca Weiss 		.ops = &clk_regmap_div_ops,
399*f40b5217SLuca Weiss 	},
400*f40b5217SLuca Weiss };
401*f40b5217SLuca Weiss 
402*f40b5217SLuca Weiss static struct clk_regmap_div disp_cc_mdss_dptx0_link_div_clk_src = {
403*f40b5217SLuca Weiss 	.reg = 0x80e4,
404*f40b5217SLuca Weiss 	.shift = 0,
405*f40b5217SLuca Weiss 	.width = 4,
406*f40b5217SLuca Weiss 	.clkr.hw.init = &(const struct clk_init_data) {
407*f40b5217SLuca Weiss 		.name = "disp_cc_mdss_dptx0_link_div_clk_src",
408*f40b5217SLuca Weiss 		.parent_hws = (const struct clk_hw*[]) {
409*f40b5217SLuca Weiss 			&disp_cc_mdss_dptx0_link_clk_src.clkr.hw,
410*f40b5217SLuca Weiss 		},
411*f40b5217SLuca Weiss 		.num_parents = 1,
412*f40b5217SLuca Weiss 		.flags = CLK_SET_RATE_PARENT,
413*f40b5217SLuca Weiss 		.ops = &clk_regmap_div_ro_ops,
414*f40b5217SLuca Weiss 	},
415*f40b5217SLuca Weiss };
416*f40b5217SLuca Weiss 
417*f40b5217SLuca Weiss static struct clk_branch disp_cc_mdss_accu_clk = {
418*f40b5217SLuca Weiss 	.halt_reg = 0xe050,
419*f40b5217SLuca Weiss 	.halt_check = BRANCH_HALT_VOTED,
420*f40b5217SLuca Weiss 	.clkr = {
421*f40b5217SLuca Weiss 		.enable_reg = 0xe050,
422*f40b5217SLuca Weiss 		.enable_mask = BIT(0),
423*f40b5217SLuca Weiss 		.hw.init = &(const struct clk_init_data) {
424*f40b5217SLuca Weiss 			.name = "disp_cc_mdss_accu_clk",
425*f40b5217SLuca Weiss 			.parent_hws = (const struct clk_hw*[]) {
426*f40b5217SLuca Weiss 				&disp_cc_xo_clk_src.clkr.hw,
427*f40b5217SLuca Weiss 			},
428*f40b5217SLuca Weiss 			.num_parents = 1,
429*f40b5217SLuca Weiss 			.flags = CLK_SET_RATE_PARENT,
430*f40b5217SLuca Weiss 			.ops = &clk_branch2_ops,
431*f40b5217SLuca Weiss 		},
432*f40b5217SLuca Weiss 	},
433*f40b5217SLuca Weiss };
434*f40b5217SLuca Weiss 
435*f40b5217SLuca Weiss static struct clk_branch disp_cc_mdss_ahb1_clk = {
436*f40b5217SLuca Weiss 	.halt_reg = 0xa020,
437*f40b5217SLuca Weiss 	.halt_check = BRANCH_HALT,
438*f40b5217SLuca Weiss 	.clkr = {
439*f40b5217SLuca Weiss 		.enable_reg = 0xa020,
440*f40b5217SLuca Weiss 		.enable_mask = BIT(0),
441*f40b5217SLuca Weiss 		.hw.init = &(const struct clk_init_data) {
442*f40b5217SLuca Weiss 			.name = "disp_cc_mdss_ahb1_clk",
443*f40b5217SLuca Weiss 			.parent_hws = (const struct clk_hw*[]) {
444*f40b5217SLuca Weiss 				&disp_cc_mdss_ahb_clk_src.clkr.hw,
445*f40b5217SLuca Weiss 			},
446*f40b5217SLuca Weiss 			.num_parents = 1,
447*f40b5217SLuca Weiss 			.flags = CLK_SET_RATE_PARENT,
448*f40b5217SLuca Weiss 			.ops = &clk_branch2_ops,
449*f40b5217SLuca Weiss 		},
450*f40b5217SLuca Weiss 	},
451*f40b5217SLuca Weiss };
452*f40b5217SLuca Weiss 
453*f40b5217SLuca Weiss static struct clk_branch disp_cc_mdss_ahb_clk = {
454*f40b5217SLuca Weiss 	.halt_reg = 0x804c,
455*f40b5217SLuca Weiss 	.halt_check = BRANCH_HALT,
456*f40b5217SLuca Weiss 	.clkr = {
457*f40b5217SLuca Weiss 		.enable_reg = 0x804c,
458*f40b5217SLuca Weiss 		.enable_mask = BIT(0),
459*f40b5217SLuca Weiss 		.hw.init = &(const struct clk_init_data) {
460*f40b5217SLuca Weiss 			.name = "disp_cc_mdss_ahb_clk",
461*f40b5217SLuca Weiss 			.parent_hws = (const struct clk_hw*[]) {
462*f40b5217SLuca Weiss 				&disp_cc_mdss_ahb_clk_src.clkr.hw,
463*f40b5217SLuca Weiss 			},
464*f40b5217SLuca Weiss 			.num_parents = 1,
465*f40b5217SLuca Weiss 			.flags = CLK_SET_RATE_PARENT,
466*f40b5217SLuca Weiss 			.ops = &clk_branch2_ops,
467*f40b5217SLuca Weiss 		},
468*f40b5217SLuca Weiss 	},
469*f40b5217SLuca Weiss };
470*f40b5217SLuca Weiss 
471*f40b5217SLuca Weiss static struct clk_branch disp_cc_mdss_byte0_clk = {
472*f40b5217SLuca Weiss 	.halt_reg = 0x8024,
473*f40b5217SLuca Weiss 	.halt_check = BRANCH_HALT,
474*f40b5217SLuca Weiss 	.clkr = {
475*f40b5217SLuca Weiss 		.enable_reg = 0x8024,
476*f40b5217SLuca Weiss 		.enable_mask = BIT(0),
477*f40b5217SLuca Weiss 		.hw.init = &(const struct clk_init_data) {
478*f40b5217SLuca Weiss 			.name = "disp_cc_mdss_byte0_clk",
479*f40b5217SLuca Weiss 			.parent_hws = (const struct clk_hw*[]) {
480*f40b5217SLuca Weiss 				&disp_cc_mdss_byte0_clk_src.clkr.hw,
481*f40b5217SLuca Weiss 			},
482*f40b5217SLuca Weiss 			.num_parents = 1,
483*f40b5217SLuca Weiss 			.flags = CLK_SET_RATE_PARENT,
484*f40b5217SLuca Weiss 			.ops = &clk_branch2_ops,
485*f40b5217SLuca Weiss 		},
486*f40b5217SLuca Weiss 	},
487*f40b5217SLuca Weiss };
488*f40b5217SLuca Weiss 
489*f40b5217SLuca Weiss static struct clk_branch disp_cc_mdss_byte0_intf_clk = {
490*f40b5217SLuca Weiss 	.halt_reg = 0x8028,
491*f40b5217SLuca Weiss 	.halt_check = BRANCH_HALT,
492*f40b5217SLuca Weiss 	.clkr = {
493*f40b5217SLuca Weiss 		.enable_reg = 0x8028,
494*f40b5217SLuca Weiss 		.enable_mask = BIT(0),
495*f40b5217SLuca Weiss 		.hw.init = &(const struct clk_init_data) {
496*f40b5217SLuca Weiss 			.name = "disp_cc_mdss_byte0_intf_clk",
497*f40b5217SLuca Weiss 			.parent_hws = (const struct clk_hw*[]) {
498*f40b5217SLuca Weiss 				&disp_cc_mdss_byte0_div_clk_src.clkr.hw,
499*f40b5217SLuca Weiss 			},
500*f40b5217SLuca Weiss 			.num_parents = 1,
501*f40b5217SLuca Weiss 			.flags = CLK_SET_RATE_PARENT,
502*f40b5217SLuca Weiss 			.ops = &clk_branch2_ops,
503*f40b5217SLuca Weiss 		},
504*f40b5217SLuca Weiss 	},
505*f40b5217SLuca Weiss };
506*f40b5217SLuca Weiss 
507*f40b5217SLuca Weiss static struct clk_branch disp_cc_mdss_dptx0_aux_clk = {
508*f40b5217SLuca Weiss 	.halt_reg = 0x8048,
509*f40b5217SLuca Weiss 	.halt_check = BRANCH_HALT,
510*f40b5217SLuca Weiss 	.clkr = {
511*f40b5217SLuca Weiss 		.enable_reg = 0x8048,
512*f40b5217SLuca Weiss 		.enable_mask = BIT(0),
513*f40b5217SLuca Weiss 		.hw.init = &(const struct clk_init_data) {
514*f40b5217SLuca Weiss 			.name = "disp_cc_mdss_dptx0_aux_clk",
515*f40b5217SLuca Weiss 			.parent_hws = (const struct clk_hw*[]) {
516*f40b5217SLuca Weiss 				&disp_cc_mdss_dptx0_aux_clk_src.clkr.hw,
517*f40b5217SLuca Weiss 			},
518*f40b5217SLuca Weiss 			.num_parents = 1,
519*f40b5217SLuca Weiss 			.flags = CLK_SET_RATE_PARENT,
520*f40b5217SLuca Weiss 			.ops = &clk_branch2_ops,
521*f40b5217SLuca Weiss 		},
522*f40b5217SLuca Weiss 	},
523*f40b5217SLuca Weiss };
524*f40b5217SLuca Weiss 
525*f40b5217SLuca Weiss static struct clk_branch disp_cc_mdss_dptx0_crypto_clk = {
526*f40b5217SLuca Weiss 	.halt_reg = 0x803c,
527*f40b5217SLuca Weiss 	.halt_check = BRANCH_HALT,
528*f40b5217SLuca Weiss 	.clkr = {
529*f40b5217SLuca Weiss 		.enable_reg = 0x803c,
530*f40b5217SLuca Weiss 		.enable_mask = BIT(0),
531*f40b5217SLuca Weiss 		.hw.init = &(const struct clk_init_data) {
532*f40b5217SLuca Weiss 			.name = "disp_cc_mdss_dptx0_crypto_clk",
533*f40b5217SLuca Weiss 			.parent_hws = (const struct clk_hw*[]) {
534*f40b5217SLuca Weiss 				&disp_cc_mdss_dptx0_link_clk_src.clkr.hw,
535*f40b5217SLuca Weiss 			},
536*f40b5217SLuca Weiss 			.num_parents = 1,
537*f40b5217SLuca Weiss 			.flags = CLK_SET_RATE_PARENT,
538*f40b5217SLuca Weiss 			.ops = &clk_branch2_ops,
539*f40b5217SLuca Weiss 		},
540*f40b5217SLuca Weiss 	},
541*f40b5217SLuca Weiss };
542*f40b5217SLuca Weiss 
543*f40b5217SLuca Weiss static struct clk_branch disp_cc_mdss_dptx0_link_clk = {
544*f40b5217SLuca Weiss 	.halt_reg = 0x8030,
545*f40b5217SLuca Weiss 	.halt_check = BRANCH_HALT,
546*f40b5217SLuca Weiss 	.clkr = {
547*f40b5217SLuca Weiss 		.enable_reg = 0x8030,
548*f40b5217SLuca Weiss 		.enable_mask = BIT(0),
549*f40b5217SLuca Weiss 		.hw.init = &(const struct clk_init_data) {
550*f40b5217SLuca Weiss 			.name = "disp_cc_mdss_dptx0_link_clk",
551*f40b5217SLuca Weiss 			.parent_hws = (const struct clk_hw*[]) {
552*f40b5217SLuca Weiss 				&disp_cc_mdss_dptx0_link_clk_src.clkr.hw,
553*f40b5217SLuca Weiss 			},
554*f40b5217SLuca Weiss 			.num_parents = 1,
555*f40b5217SLuca Weiss 			.flags = CLK_SET_RATE_PARENT,
556*f40b5217SLuca Weiss 			.ops = &clk_branch2_ops,
557*f40b5217SLuca Weiss 		},
558*f40b5217SLuca Weiss 	},
559*f40b5217SLuca Weiss };
560*f40b5217SLuca Weiss 
561*f40b5217SLuca Weiss static struct clk_branch disp_cc_mdss_dptx0_link_intf_clk = {
562*f40b5217SLuca Weiss 	.halt_reg = 0x8038,
563*f40b5217SLuca Weiss 	.halt_check = BRANCH_HALT,
564*f40b5217SLuca Weiss 	.clkr = {
565*f40b5217SLuca Weiss 		.enable_reg = 0x8038,
566*f40b5217SLuca Weiss 		.enable_mask = BIT(0),
567*f40b5217SLuca Weiss 		.hw.init = &(const struct clk_init_data) {
568*f40b5217SLuca Weiss 			.name = "disp_cc_mdss_dptx0_link_intf_clk",
569*f40b5217SLuca Weiss 			.parent_hws = (const struct clk_hw*[]) {
570*f40b5217SLuca Weiss 				&disp_cc_mdss_dptx0_link_div_clk_src.clkr.hw,
571*f40b5217SLuca Weiss 			},
572*f40b5217SLuca Weiss 			.num_parents = 1,
573*f40b5217SLuca Weiss 			.flags = CLK_SET_RATE_PARENT,
574*f40b5217SLuca Weiss 			.ops = &clk_branch2_ops,
575*f40b5217SLuca Weiss 		},
576*f40b5217SLuca Weiss 	},
577*f40b5217SLuca Weiss };
578*f40b5217SLuca Weiss 
579*f40b5217SLuca Weiss static struct clk_branch disp_cc_mdss_dptx0_pixel0_clk = {
580*f40b5217SLuca Weiss 	.halt_reg = 0x8040,
581*f40b5217SLuca Weiss 	.halt_check = BRANCH_HALT,
582*f40b5217SLuca Weiss 	.clkr = {
583*f40b5217SLuca Weiss 		.enable_reg = 0x8040,
584*f40b5217SLuca Weiss 		.enable_mask = BIT(0),
585*f40b5217SLuca Weiss 		.hw.init = &(const struct clk_init_data) {
586*f40b5217SLuca Weiss 			.name = "disp_cc_mdss_dptx0_pixel0_clk",
587*f40b5217SLuca Weiss 			.parent_hws = (const struct clk_hw*[]) {
588*f40b5217SLuca Weiss 				&disp_cc_mdss_dptx0_pixel0_clk_src.clkr.hw,
589*f40b5217SLuca Weiss 			},
590*f40b5217SLuca Weiss 			.num_parents = 1,
591*f40b5217SLuca Weiss 			.flags = CLK_SET_RATE_PARENT,
592*f40b5217SLuca Weiss 			.ops = &clk_branch2_ops,
593*f40b5217SLuca Weiss 		},
594*f40b5217SLuca Weiss 	},
595*f40b5217SLuca Weiss };
596*f40b5217SLuca Weiss 
597*f40b5217SLuca Weiss static struct clk_branch disp_cc_mdss_dptx0_pixel1_clk = {
598*f40b5217SLuca Weiss 	.halt_reg = 0x8044,
599*f40b5217SLuca Weiss 	.halt_check = BRANCH_HALT,
600*f40b5217SLuca Weiss 	.clkr = {
601*f40b5217SLuca Weiss 		.enable_reg = 0x8044,
602*f40b5217SLuca Weiss 		.enable_mask = BIT(0),
603*f40b5217SLuca Weiss 		.hw.init = &(const struct clk_init_data) {
604*f40b5217SLuca Weiss 			.name = "disp_cc_mdss_dptx0_pixel1_clk",
605*f40b5217SLuca Weiss 			.parent_hws = (const struct clk_hw*[]) {
606*f40b5217SLuca Weiss 				&disp_cc_mdss_dptx0_pixel1_clk_src.clkr.hw,
607*f40b5217SLuca Weiss 			},
608*f40b5217SLuca Weiss 			.num_parents = 1,
609*f40b5217SLuca Weiss 			.flags = CLK_SET_RATE_PARENT,
610*f40b5217SLuca Weiss 			.ops = &clk_branch2_ops,
611*f40b5217SLuca Weiss 		},
612*f40b5217SLuca Weiss 	},
613*f40b5217SLuca Weiss };
614*f40b5217SLuca Weiss 
615*f40b5217SLuca Weiss static struct clk_branch disp_cc_mdss_dptx0_usb_router_link_intf_clk = {
616*f40b5217SLuca Weiss 	.halt_reg = 0x8034,
617*f40b5217SLuca Weiss 	.halt_check = BRANCH_HALT,
618*f40b5217SLuca Weiss 	.clkr = {
619*f40b5217SLuca Weiss 		.enable_reg = 0x8034,
620*f40b5217SLuca Weiss 		.enable_mask = BIT(0),
621*f40b5217SLuca Weiss 		.hw.init = &(const struct clk_init_data) {
622*f40b5217SLuca Weiss 			.name = "disp_cc_mdss_dptx0_usb_router_link_intf_clk",
623*f40b5217SLuca Weiss 			.parent_hws = (const struct clk_hw*[]) {
624*f40b5217SLuca Weiss 				&disp_cc_mdss_dptx0_link_div_clk_src.clkr.hw,
625*f40b5217SLuca Weiss 			},
626*f40b5217SLuca Weiss 			.num_parents = 1,
627*f40b5217SLuca Weiss 			.flags = CLK_SET_RATE_PARENT,
628*f40b5217SLuca Weiss 			.ops = &clk_branch2_ops,
629*f40b5217SLuca Weiss 		},
630*f40b5217SLuca Weiss 	},
631*f40b5217SLuca Weiss };
632*f40b5217SLuca Weiss 
633*f40b5217SLuca Weiss static struct clk_branch disp_cc_mdss_esc0_clk = {
634*f40b5217SLuca Weiss 	.halt_reg = 0x802c,
635*f40b5217SLuca Weiss 	.halt_check = BRANCH_HALT,
636*f40b5217SLuca Weiss 	.clkr = {
637*f40b5217SLuca Weiss 		.enable_reg = 0x802c,
638*f40b5217SLuca Weiss 		.enable_mask = BIT(0),
639*f40b5217SLuca Weiss 		.hw.init = &(const struct clk_init_data) {
640*f40b5217SLuca Weiss 			.name = "disp_cc_mdss_esc0_clk",
641*f40b5217SLuca Weiss 			.parent_hws = (const struct clk_hw*[]) {
642*f40b5217SLuca Weiss 				&disp_cc_mdss_esc0_clk_src.clkr.hw,
643*f40b5217SLuca Weiss 			},
644*f40b5217SLuca Weiss 			.num_parents = 1,
645*f40b5217SLuca Weiss 			.flags = CLK_SET_RATE_PARENT,
646*f40b5217SLuca Weiss 			.ops = &clk_branch2_ops,
647*f40b5217SLuca Weiss 		},
648*f40b5217SLuca Weiss 	},
649*f40b5217SLuca Weiss };
650*f40b5217SLuca Weiss 
651*f40b5217SLuca Weiss static struct clk_branch disp_cc_mdss_mdp1_clk = {
652*f40b5217SLuca Weiss 	.halt_reg = 0xa004,
653*f40b5217SLuca Weiss 	.halt_check = BRANCH_HALT,
654*f40b5217SLuca Weiss 	.clkr = {
655*f40b5217SLuca Weiss 		.enable_reg = 0xa004,
656*f40b5217SLuca Weiss 		.enable_mask = BIT(0),
657*f40b5217SLuca Weiss 		.hw.init = &(const struct clk_init_data) {
658*f40b5217SLuca Weiss 			.name = "disp_cc_mdss_mdp1_clk",
659*f40b5217SLuca Weiss 			.parent_hws = (const struct clk_hw*[]) {
660*f40b5217SLuca Weiss 				&disp_cc_mdss_mdp_clk_src.clkr.hw,
661*f40b5217SLuca Weiss 			},
662*f40b5217SLuca Weiss 			.num_parents = 1,
663*f40b5217SLuca Weiss 			.flags = CLK_SET_RATE_PARENT,
664*f40b5217SLuca Weiss 			.ops = &clk_branch2_ops,
665*f40b5217SLuca Weiss 		},
666*f40b5217SLuca Weiss 	},
667*f40b5217SLuca Weiss };
668*f40b5217SLuca Weiss 
669*f40b5217SLuca Weiss static struct clk_branch disp_cc_mdss_mdp_clk = {
670*f40b5217SLuca Weiss 	.halt_reg = 0x8008,
671*f40b5217SLuca Weiss 	.halt_check = BRANCH_HALT,
672*f40b5217SLuca Weiss 	.clkr = {
673*f40b5217SLuca Weiss 		.enable_reg = 0x8008,
674*f40b5217SLuca Weiss 		.enable_mask = BIT(0),
675*f40b5217SLuca Weiss 		.hw.init = &(const struct clk_init_data) {
676*f40b5217SLuca Weiss 			.name = "disp_cc_mdss_mdp_clk",
677*f40b5217SLuca Weiss 			.parent_hws = (const struct clk_hw*[]) {
678*f40b5217SLuca Weiss 				&disp_cc_mdss_mdp_clk_src.clkr.hw,
679*f40b5217SLuca Weiss 			},
680*f40b5217SLuca Weiss 			.num_parents = 1,
681*f40b5217SLuca Weiss 			.flags = CLK_SET_RATE_PARENT,
682*f40b5217SLuca Weiss 			.ops = &clk_branch2_ops,
683*f40b5217SLuca Weiss 		},
684*f40b5217SLuca Weiss 	},
685*f40b5217SLuca Weiss };
686*f40b5217SLuca Weiss 
687*f40b5217SLuca Weiss static struct clk_branch disp_cc_mdss_mdp_lut1_clk = {
688*f40b5217SLuca Weiss 	.halt_reg = 0xa010,
689*f40b5217SLuca Weiss 	.halt_check = BRANCH_HALT,
690*f40b5217SLuca Weiss 	.clkr = {
691*f40b5217SLuca Weiss 		.enable_reg = 0xa010,
692*f40b5217SLuca Weiss 		.enable_mask = BIT(0),
693*f40b5217SLuca Weiss 		.hw.init = &(const struct clk_init_data) {
694*f40b5217SLuca Weiss 			.name = "disp_cc_mdss_mdp_lut1_clk",
695*f40b5217SLuca Weiss 			.parent_hws = (const struct clk_hw*[]) {
696*f40b5217SLuca Weiss 				&disp_cc_mdss_mdp_clk_src.clkr.hw,
697*f40b5217SLuca Weiss 			},
698*f40b5217SLuca Weiss 			.num_parents = 1,
699*f40b5217SLuca Weiss 			.flags = CLK_SET_RATE_PARENT,
700*f40b5217SLuca Weiss 			.ops = &clk_branch2_ops,
701*f40b5217SLuca Weiss 		},
702*f40b5217SLuca Weiss 	},
703*f40b5217SLuca Weiss };
704*f40b5217SLuca Weiss 
705*f40b5217SLuca Weiss static struct clk_branch disp_cc_mdss_mdp_lut_clk = {
706*f40b5217SLuca Weiss 	.halt_reg = 0x8014,
707*f40b5217SLuca Weiss 	.halt_check = BRANCH_HALT_VOTED,
708*f40b5217SLuca Weiss 	.clkr = {
709*f40b5217SLuca Weiss 		.enable_reg = 0x8014,
710*f40b5217SLuca Weiss 		.enable_mask = BIT(0),
711*f40b5217SLuca Weiss 		.hw.init = &(const struct clk_init_data) {
712*f40b5217SLuca Weiss 			.name = "disp_cc_mdss_mdp_lut_clk",
713*f40b5217SLuca Weiss 			.parent_hws = (const struct clk_hw*[]) {
714*f40b5217SLuca Weiss 				&disp_cc_mdss_mdp_clk_src.clkr.hw,
715*f40b5217SLuca Weiss 			},
716*f40b5217SLuca Weiss 			.num_parents = 1,
717*f40b5217SLuca Weiss 			.flags = CLK_SET_RATE_PARENT,
718*f40b5217SLuca Weiss 			.ops = &clk_branch2_ops,
719*f40b5217SLuca Weiss 		},
720*f40b5217SLuca Weiss 	},
721*f40b5217SLuca Weiss };
722*f40b5217SLuca Weiss 
723*f40b5217SLuca Weiss static struct clk_branch disp_cc_mdss_non_gdsc_ahb_clk = {
724*f40b5217SLuca Weiss 	.halt_reg = 0xc004,
725*f40b5217SLuca Weiss 	.halt_check = BRANCH_HALT_VOTED,
726*f40b5217SLuca Weiss 	.clkr = {
727*f40b5217SLuca Weiss 		.enable_reg = 0xc004,
728*f40b5217SLuca Weiss 		.enable_mask = BIT(0),
729*f40b5217SLuca Weiss 		.hw.init = &(const struct clk_init_data) {
730*f40b5217SLuca Weiss 			.name = "disp_cc_mdss_non_gdsc_ahb_clk",
731*f40b5217SLuca Weiss 			.parent_hws = (const struct clk_hw*[]) {
732*f40b5217SLuca Weiss 				&disp_cc_mdss_ahb_clk_src.clkr.hw,
733*f40b5217SLuca Weiss 			},
734*f40b5217SLuca Weiss 			.num_parents = 1,
735*f40b5217SLuca Weiss 			.flags = CLK_SET_RATE_PARENT,
736*f40b5217SLuca Weiss 			.ops = &clk_branch2_ops,
737*f40b5217SLuca Weiss 		},
738*f40b5217SLuca Weiss 	},
739*f40b5217SLuca Weiss };
740*f40b5217SLuca Weiss 
741*f40b5217SLuca Weiss static struct clk_branch disp_cc_mdss_pclk0_clk = {
742*f40b5217SLuca Weiss 	.halt_reg = 0x8004,
743*f40b5217SLuca Weiss 	.halt_check = BRANCH_HALT,
744*f40b5217SLuca Weiss 	.clkr = {
745*f40b5217SLuca Weiss 		.enable_reg = 0x8004,
746*f40b5217SLuca Weiss 		.enable_mask = BIT(0),
747*f40b5217SLuca Weiss 		.hw.init = &(const struct clk_init_data) {
748*f40b5217SLuca Weiss 			.name = "disp_cc_mdss_pclk0_clk",
749*f40b5217SLuca Weiss 			.parent_hws = (const struct clk_hw*[]) {
750*f40b5217SLuca Weiss 				&disp_cc_mdss_pclk0_clk_src.clkr.hw,
751*f40b5217SLuca Weiss 			},
752*f40b5217SLuca Weiss 			.num_parents = 1,
753*f40b5217SLuca Weiss 			.flags = CLK_SET_RATE_PARENT,
754*f40b5217SLuca Weiss 			.ops = &clk_branch2_ops,
755*f40b5217SLuca Weiss 		},
756*f40b5217SLuca Weiss 	},
757*f40b5217SLuca Weiss };
758*f40b5217SLuca Weiss 
759*f40b5217SLuca Weiss static struct clk_branch disp_cc_mdss_rscc_ahb_clk = {
760*f40b5217SLuca Weiss 	.halt_reg = 0xc00c,
761*f40b5217SLuca Weiss 	.halt_check = BRANCH_HALT,
762*f40b5217SLuca Weiss 	.clkr = {
763*f40b5217SLuca Weiss 		.enable_reg = 0xc00c,
764*f40b5217SLuca Weiss 		.enable_mask = BIT(0),
765*f40b5217SLuca Weiss 		.hw.init = &(const struct clk_init_data) {
766*f40b5217SLuca Weiss 			.name = "disp_cc_mdss_rscc_ahb_clk",
767*f40b5217SLuca Weiss 			.parent_hws = (const struct clk_hw*[]) {
768*f40b5217SLuca Weiss 				&disp_cc_mdss_ahb_clk_src.clkr.hw,
769*f40b5217SLuca Weiss 			},
770*f40b5217SLuca Weiss 			.num_parents = 1,
771*f40b5217SLuca Weiss 			.flags = CLK_SET_RATE_PARENT,
772*f40b5217SLuca Weiss 			.ops = &clk_branch2_ops,
773*f40b5217SLuca Weiss 		},
774*f40b5217SLuca Weiss 	},
775*f40b5217SLuca Weiss };
776*f40b5217SLuca Weiss 
777*f40b5217SLuca Weiss static struct clk_branch disp_cc_mdss_rscc_vsync_clk = {
778*f40b5217SLuca Weiss 	.halt_reg = 0xc008,
779*f40b5217SLuca Weiss 	.halt_check = BRANCH_HALT,
780*f40b5217SLuca Weiss 	.clkr = {
781*f40b5217SLuca Weiss 		.enable_reg = 0xc008,
782*f40b5217SLuca Weiss 		.enable_mask = BIT(0),
783*f40b5217SLuca Weiss 		.hw.init = &(const struct clk_init_data) {
784*f40b5217SLuca Weiss 			.name = "disp_cc_mdss_rscc_vsync_clk",
785*f40b5217SLuca Weiss 			.parent_hws = (const struct clk_hw*[]) {
786*f40b5217SLuca Weiss 				&disp_cc_mdss_vsync_clk_src.clkr.hw,
787*f40b5217SLuca Weiss 			},
788*f40b5217SLuca Weiss 			.num_parents = 1,
789*f40b5217SLuca Weiss 			.flags = CLK_SET_RATE_PARENT,
790*f40b5217SLuca Weiss 			.ops = &clk_branch2_ops,
791*f40b5217SLuca Weiss 		},
792*f40b5217SLuca Weiss 	},
793*f40b5217SLuca Weiss };
794*f40b5217SLuca Weiss 
795*f40b5217SLuca Weiss static struct clk_branch disp_cc_mdss_vsync1_clk = {
796*f40b5217SLuca Weiss 	.halt_reg = 0xa01c,
797*f40b5217SLuca Weiss 	.halt_check = BRANCH_HALT,
798*f40b5217SLuca Weiss 	.clkr = {
799*f40b5217SLuca Weiss 		.enable_reg = 0xa01c,
800*f40b5217SLuca Weiss 		.enable_mask = BIT(0),
801*f40b5217SLuca Weiss 		.hw.init = &(const struct clk_init_data) {
802*f40b5217SLuca Weiss 			.name = "disp_cc_mdss_vsync1_clk",
803*f40b5217SLuca Weiss 			.parent_hws = (const struct clk_hw*[]) {
804*f40b5217SLuca Weiss 				&disp_cc_mdss_vsync_clk_src.clkr.hw,
805*f40b5217SLuca Weiss 			},
806*f40b5217SLuca Weiss 			.num_parents = 1,
807*f40b5217SLuca Weiss 			.flags = CLK_SET_RATE_PARENT,
808*f40b5217SLuca Weiss 			.ops = &clk_branch2_ops,
809*f40b5217SLuca Weiss 		},
810*f40b5217SLuca Weiss 	},
811*f40b5217SLuca Weiss };
812*f40b5217SLuca Weiss 
813*f40b5217SLuca Weiss static struct clk_branch disp_cc_mdss_vsync_clk = {
814*f40b5217SLuca Weiss 	.halt_reg = 0x8020,
815*f40b5217SLuca Weiss 	.halt_check = BRANCH_HALT,
816*f40b5217SLuca Weiss 	.clkr = {
817*f40b5217SLuca Weiss 		.enable_reg = 0x8020,
818*f40b5217SLuca Weiss 		.enable_mask = BIT(0),
819*f40b5217SLuca Weiss 		.hw.init = &(const struct clk_init_data) {
820*f40b5217SLuca Weiss 			.name = "disp_cc_mdss_vsync_clk",
821*f40b5217SLuca Weiss 			.parent_hws = (const struct clk_hw*[]) {
822*f40b5217SLuca Weiss 				&disp_cc_mdss_vsync_clk_src.clkr.hw,
823*f40b5217SLuca Weiss 			},
824*f40b5217SLuca Weiss 			.num_parents = 1,
825*f40b5217SLuca Weiss 			.flags = CLK_SET_RATE_PARENT,
826*f40b5217SLuca Weiss 			.ops = &clk_branch2_ops,
827*f40b5217SLuca Weiss 		},
828*f40b5217SLuca Weiss 	},
829*f40b5217SLuca Weiss };
830*f40b5217SLuca Weiss 
831*f40b5217SLuca Weiss static struct gdsc disp_cc_mdss_core_gdsc = {
832*f40b5217SLuca Weiss 	.gdscr = 0x9000,
833*f40b5217SLuca Weiss 	.en_rest_wait_val = 0x2,
834*f40b5217SLuca Weiss 	.en_few_wait_val = 0x2,
835*f40b5217SLuca Weiss 	.clk_dis_wait_val = 0xf,
836*f40b5217SLuca Weiss 	.pd = {
837*f40b5217SLuca Weiss 		.name = "disp_cc_mdss_core_gdsc",
838*f40b5217SLuca Weiss 	},
839*f40b5217SLuca Weiss 	.pwrsts = PWRSTS_OFF_ON,
840*f40b5217SLuca Weiss 	.flags = POLL_CFG_GDSCR | HW_CTRL | RETAIN_FF_ENABLE,
841*f40b5217SLuca Weiss };
842*f40b5217SLuca Weiss 
843*f40b5217SLuca Weiss static struct gdsc disp_cc_mdss_core_int2_gdsc = {
844*f40b5217SLuca Weiss 	.gdscr = 0xb000,
845*f40b5217SLuca Weiss 	.en_rest_wait_val = 0x2,
846*f40b5217SLuca Weiss 	.en_few_wait_val = 0x2,
847*f40b5217SLuca Weiss 	.clk_dis_wait_val = 0xf,
848*f40b5217SLuca Weiss 	.pd = {
849*f40b5217SLuca Weiss 		.name = "disp_cc_mdss_core_int2_gdsc",
850*f40b5217SLuca Weiss 	},
851*f40b5217SLuca Weiss 	.pwrsts = PWRSTS_OFF_ON,
852*f40b5217SLuca Weiss 	.flags = POLL_CFG_GDSCR | HW_CTRL | RETAIN_FF_ENABLE,
853*f40b5217SLuca Weiss };
854*f40b5217SLuca Weiss 
855*f40b5217SLuca Weiss static struct clk_regmap *disp_cc_milos_clocks[] = {
856*f40b5217SLuca Weiss 	[DISP_CC_MDSS_ACCU_CLK] = &disp_cc_mdss_accu_clk.clkr,
857*f40b5217SLuca Weiss 	[DISP_CC_MDSS_AHB1_CLK] = &disp_cc_mdss_ahb1_clk.clkr,
858*f40b5217SLuca Weiss 	[DISP_CC_MDSS_AHB_CLK] = &disp_cc_mdss_ahb_clk.clkr,
859*f40b5217SLuca Weiss 	[DISP_CC_MDSS_AHB_CLK_SRC] = &disp_cc_mdss_ahb_clk_src.clkr,
860*f40b5217SLuca Weiss 	[DISP_CC_MDSS_BYTE0_CLK] = &disp_cc_mdss_byte0_clk.clkr,
861*f40b5217SLuca Weiss 	[DISP_CC_MDSS_BYTE0_CLK_SRC] = &disp_cc_mdss_byte0_clk_src.clkr,
862*f40b5217SLuca Weiss 	[DISP_CC_MDSS_BYTE0_DIV_CLK_SRC] = &disp_cc_mdss_byte0_div_clk_src.clkr,
863*f40b5217SLuca Weiss 	[DISP_CC_MDSS_BYTE0_INTF_CLK] = &disp_cc_mdss_byte0_intf_clk.clkr,
864*f40b5217SLuca Weiss 	[DISP_CC_MDSS_DPTX0_AUX_CLK] = &disp_cc_mdss_dptx0_aux_clk.clkr,
865*f40b5217SLuca Weiss 	[DISP_CC_MDSS_DPTX0_AUX_CLK_SRC] = &disp_cc_mdss_dptx0_aux_clk_src.clkr,
866*f40b5217SLuca Weiss 	[DISP_CC_MDSS_DPTX0_CRYPTO_CLK] = &disp_cc_mdss_dptx0_crypto_clk.clkr,
867*f40b5217SLuca Weiss 	[DISP_CC_MDSS_DPTX0_LINK_CLK] = &disp_cc_mdss_dptx0_link_clk.clkr,
868*f40b5217SLuca Weiss 	[DISP_CC_MDSS_DPTX0_LINK_CLK_SRC] = &disp_cc_mdss_dptx0_link_clk_src.clkr,
869*f40b5217SLuca Weiss 	[DISP_CC_MDSS_DPTX0_LINK_DIV_CLK_SRC] = &disp_cc_mdss_dptx0_link_div_clk_src.clkr,
870*f40b5217SLuca Weiss 	[DISP_CC_MDSS_DPTX0_LINK_INTF_CLK] = &disp_cc_mdss_dptx0_link_intf_clk.clkr,
871*f40b5217SLuca Weiss 	[DISP_CC_MDSS_DPTX0_PIXEL0_CLK] = &disp_cc_mdss_dptx0_pixel0_clk.clkr,
872*f40b5217SLuca Weiss 	[DISP_CC_MDSS_DPTX0_PIXEL0_CLK_SRC] = &disp_cc_mdss_dptx0_pixel0_clk_src.clkr,
873*f40b5217SLuca Weiss 	[DISP_CC_MDSS_DPTX0_PIXEL1_CLK] = &disp_cc_mdss_dptx0_pixel1_clk.clkr,
874*f40b5217SLuca Weiss 	[DISP_CC_MDSS_DPTX0_PIXEL1_CLK_SRC] = &disp_cc_mdss_dptx0_pixel1_clk_src.clkr,
875*f40b5217SLuca Weiss 	[DISP_CC_MDSS_DPTX0_USB_ROUTER_LINK_INTF_CLK] =
876*f40b5217SLuca Weiss 		&disp_cc_mdss_dptx0_usb_router_link_intf_clk.clkr,
877*f40b5217SLuca Weiss 	[DISP_CC_MDSS_ESC0_CLK] = &disp_cc_mdss_esc0_clk.clkr,
878*f40b5217SLuca Weiss 	[DISP_CC_MDSS_ESC0_CLK_SRC] = &disp_cc_mdss_esc0_clk_src.clkr,
879*f40b5217SLuca Weiss 	[DISP_CC_MDSS_MDP1_CLK] = &disp_cc_mdss_mdp1_clk.clkr,
880*f40b5217SLuca Weiss 	[DISP_CC_MDSS_MDP_CLK] = &disp_cc_mdss_mdp_clk.clkr,
881*f40b5217SLuca Weiss 	[DISP_CC_MDSS_MDP_CLK_SRC] = &disp_cc_mdss_mdp_clk_src.clkr,
882*f40b5217SLuca Weiss 	[DISP_CC_MDSS_MDP_LUT1_CLK] = &disp_cc_mdss_mdp_lut1_clk.clkr,
883*f40b5217SLuca Weiss 	[DISP_CC_MDSS_MDP_LUT_CLK] = &disp_cc_mdss_mdp_lut_clk.clkr,
884*f40b5217SLuca Weiss 	[DISP_CC_MDSS_NON_GDSC_AHB_CLK] = &disp_cc_mdss_non_gdsc_ahb_clk.clkr,
885*f40b5217SLuca Weiss 	[DISP_CC_MDSS_PCLK0_CLK] = &disp_cc_mdss_pclk0_clk.clkr,
886*f40b5217SLuca Weiss 	[DISP_CC_MDSS_PCLK0_CLK_SRC] = &disp_cc_mdss_pclk0_clk_src.clkr,
887*f40b5217SLuca Weiss 	[DISP_CC_MDSS_RSCC_AHB_CLK] = &disp_cc_mdss_rscc_ahb_clk.clkr,
888*f40b5217SLuca Weiss 	[DISP_CC_MDSS_RSCC_VSYNC_CLK] = &disp_cc_mdss_rscc_vsync_clk.clkr,
889*f40b5217SLuca Weiss 	[DISP_CC_MDSS_VSYNC1_CLK] = &disp_cc_mdss_vsync1_clk.clkr,
890*f40b5217SLuca Weiss 	[DISP_CC_MDSS_VSYNC_CLK] = &disp_cc_mdss_vsync_clk.clkr,
891*f40b5217SLuca Weiss 	[DISP_CC_MDSS_VSYNC_CLK_SRC] = &disp_cc_mdss_vsync_clk_src.clkr,
892*f40b5217SLuca Weiss 	[DISP_CC_PLL0] = &disp_cc_pll0.clkr,
893*f40b5217SLuca Weiss 	[DISP_CC_SLEEP_CLK_SRC] = &disp_cc_sleep_clk_src.clkr,
894*f40b5217SLuca Weiss 	[DISP_CC_XO_CLK_SRC] = &disp_cc_xo_clk_src.clkr,
895*f40b5217SLuca Weiss };
896*f40b5217SLuca Weiss 
897*f40b5217SLuca Weiss static const struct qcom_reset_map disp_cc_milos_resets[] = {
898*f40b5217SLuca Weiss 	[DISP_CC_MDSS_CORE_BCR] = { 0x8000 },
899*f40b5217SLuca Weiss 	[DISP_CC_MDSS_CORE_INT2_BCR] = { 0xa000 },
900*f40b5217SLuca Weiss 	[DISP_CC_MDSS_RSCC_BCR] = { 0xc000 },
901*f40b5217SLuca Weiss };
902*f40b5217SLuca Weiss 
903*f40b5217SLuca Weiss static struct gdsc *disp_cc_milos_gdscs[] = {
904*f40b5217SLuca Weiss 	[DISP_CC_MDSS_CORE_GDSC] = &disp_cc_mdss_core_gdsc,
905*f40b5217SLuca Weiss 	[DISP_CC_MDSS_CORE_INT2_GDSC] = &disp_cc_mdss_core_int2_gdsc,
906*f40b5217SLuca Weiss };
907*f40b5217SLuca Weiss 
908*f40b5217SLuca Weiss static struct clk_alpha_pll *disp_cc_milos_plls[] = {
909*f40b5217SLuca Weiss 	&disp_cc_pll0,
910*f40b5217SLuca Weiss };
911*f40b5217SLuca Weiss 
912*f40b5217SLuca Weiss static u32 disp_cc_milos_critical_cbcrs[] = {
913*f40b5217SLuca Weiss 	0xe06c, /* DISP_CC_SLEEP_CLK */
914*f40b5217SLuca Weiss 	0xe04c, /* DISP_CC_XO_CLK */
915*f40b5217SLuca Weiss };
916*f40b5217SLuca Weiss 
917*f40b5217SLuca Weiss static const struct regmap_config disp_cc_milos_regmap_config = {
918*f40b5217SLuca Weiss 	.reg_bits = 32,
919*f40b5217SLuca Weiss 	.reg_stride = 4,
920*f40b5217SLuca Weiss 	.val_bits = 32,
921*f40b5217SLuca Weiss 	.max_register = 0x11008,
922*f40b5217SLuca Weiss 	.fast_io = true,
923*f40b5217SLuca Weiss };
924*f40b5217SLuca Weiss 
925*f40b5217SLuca Weiss static void disp_cc_milos_clk_regs_configure(struct device *dev, struct regmap *regmap)
926*f40b5217SLuca Weiss {
927*f40b5217SLuca Weiss 	/* Enable clock gating for MDP clocks */
928*f40b5217SLuca Weiss 	regmap_update_bits(regmap, DISP_CC_MISC_CMD, 0x10, 0x10);
929*f40b5217SLuca Weiss }
930*f40b5217SLuca Weiss 
931*f40b5217SLuca Weiss 
932*f40b5217SLuca Weiss static struct qcom_cc_driver_data disp_cc_milos_driver_data = {
933*f40b5217SLuca Weiss 	.alpha_plls = disp_cc_milos_plls,
934*f40b5217SLuca Weiss 	.num_alpha_plls = ARRAY_SIZE(disp_cc_milos_plls),
935*f40b5217SLuca Weiss 	.clk_cbcrs = disp_cc_milos_critical_cbcrs,
936*f40b5217SLuca Weiss 	.num_clk_cbcrs = ARRAY_SIZE(disp_cc_milos_critical_cbcrs),
937*f40b5217SLuca Weiss 	.clk_regs_configure = disp_cc_milos_clk_regs_configure,
938*f40b5217SLuca Weiss };
939*f40b5217SLuca Weiss 
940*f40b5217SLuca Weiss static struct qcom_cc_desc disp_cc_milos_desc = {
941*f40b5217SLuca Weiss 	.config = &disp_cc_milos_regmap_config,
942*f40b5217SLuca Weiss 	.clks = disp_cc_milos_clocks,
943*f40b5217SLuca Weiss 	.num_clks = ARRAY_SIZE(disp_cc_milos_clocks),
944*f40b5217SLuca Weiss 	.resets = disp_cc_milos_resets,
945*f40b5217SLuca Weiss 	.num_resets = ARRAY_SIZE(disp_cc_milos_resets),
946*f40b5217SLuca Weiss 	.gdscs = disp_cc_milos_gdscs,
947*f40b5217SLuca Weiss 	.num_gdscs = ARRAY_SIZE(disp_cc_milos_gdscs),
948*f40b5217SLuca Weiss 	.use_rpm = true,
949*f40b5217SLuca Weiss 	.driver_data = &disp_cc_milos_driver_data,
950*f40b5217SLuca Weiss };
951*f40b5217SLuca Weiss 
952*f40b5217SLuca Weiss static const struct of_device_id disp_cc_milos_match_table[] = {
953*f40b5217SLuca Weiss 	{ .compatible = "qcom,milos-dispcc" },
954*f40b5217SLuca Weiss 	{ }
955*f40b5217SLuca Weiss };
956*f40b5217SLuca Weiss MODULE_DEVICE_TABLE(of, disp_cc_milos_match_table);
957*f40b5217SLuca Weiss 
958*f40b5217SLuca Weiss static int disp_cc_milos_probe(struct platform_device *pdev)
959*f40b5217SLuca Weiss {
960*f40b5217SLuca Weiss 	return qcom_cc_probe(pdev, &disp_cc_milos_desc);
961*f40b5217SLuca Weiss }
962*f40b5217SLuca Weiss 
963*f40b5217SLuca Weiss static struct platform_driver disp_cc_milos_driver = {
964*f40b5217SLuca Weiss 	.probe = disp_cc_milos_probe,
965*f40b5217SLuca Weiss 	.driver = {
966*f40b5217SLuca Weiss 		.name = "disp_cc-milos",
967*f40b5217SLuca Weiss 		.of_match_table = disp_cc_milos_match_table,
968*f40b5217SLuca Weiss 	},
969*f40b5217SLuca Weiss };
970*f40b5217SLuca Weiss 
971*f40b5217SLuca Weiss module_platform_driver(disp_cc_milos_driver);
972*f40b5217SLuca Weiss 
973*f40b5217SLuca Weiss MODULE_DESCRIPTION("QTI DISP_CC Milos Driver");
974*f40b5217SLuca Weiss MODULE_LICENSE("GPL");
975