xref: /OK3568_Linux_fs/kernel/drivers/clk/samsung/clk-exynos7.c (revision 4882a59341e53eb6f0b4789bf948001014eff981)
1*4882a593Smuzhiyun // SPDX-License-Identifier: GPL-2.0-only
2*4882a593Smuzhiyun /*
3*4882a593Smuzhiyun  * Copyright (c) 2014 Samsung Electronics Co., Ltd.
4*4882a593Smuzhiyun  * Author: Naveen Krishna Ch <naveenkrishna.ch@gmail.com>
5*4882a593Smuzhiyun */
6*4882a593Smuzhiyun 
7*4882a593Smuzhiyun #include <linux/clk-provider.h>
8*4882a593Smuzhiyun #include <linux/of.h>
9*4882a593Smuzhiyun 
10*4882a593Smuzhiyun #include "clk.h"
11*4882a593Smuzhiyun #include <dt-bindings/clock/exynos7-clk.h>
12*4882a593Smuzhiyun 
13*4882a593Smuzhiyun /* Register Offset definitions for CMU_TOPC (0x10570000) */
14*4882a593Smuzhiyun #define CC_PLL_LOCK		0x0000
15*4882a593Smuzhiyun #define BUS0_PLL_LOCK		0x0004
16*4882a593Smuzhiyun #define BUS1_DPLL_LOCK		0x0008
17*4882a593Smuzhiyun #define MFC_PLL_LOCK		0x000C
18*4882a593Smuzhiyun #define AUD_PLL_LOCK		0x0010
19*4882a593Smuzhiyun #define CC_PLL_CON0		0x0100
20*4882a593Smuzhiyun #define BUS0_PLL_CON0		0x0110
21*4882a593Smuzhiyun #define BUS1_DPLL_CON0		0x0120
22*4882a593Smuzhiyun #define MFC_PLL_CON0		0x0130
23*4882a593Smuzhiyun #define AUD_PLL_CON0		0x0140
24*4882a593Smuzhiyun #define MUX_SEL_TOPC0		0x0200
25*4882a593Smuzhiyun #define MUX_SEL_TOPC1		0x0204
26*4882a593Smuzhiyun #define MUX_SEL_TOPC2		0x0208
27*4882a593Smuzhiyun #define MUX_SEL_TOPC3		0x020C
28*4882a593Smuzhiyun #define DIV_TOPC0		0x0600
29*4882a593Smuzhiyun #define DIV_TOPC1		0x0604
30*4882a593Smuzhiyun #define DIV_TOPC3		0x060C
31*4882a593Smuzhiyun #define ENABLE_ACLK_TOPC0	0x0800
32*4882a593Smuzhiyun #define ENABLE_ACLK_TOPC1	0x0804
33*4882a593Smuzhiyun #define ENABLE_SCLK_TOPC1	0x0A04
34*4882a593Smuzhiyun 
35*4882a593Smuzhiyun static const struct samsung_fixed_factor_clock topc_fixed_factor_clks[] __initconst = {
36*4882a593Smuzhiyun 	FFACTOR(0, "ffac_topc_bus0_pll_div2", "mout_topc_bus0_pll", 1, 2, 0),
37*4882a593Smuzhiyun 	FFACTOR(0, "ffac_topc_bus0_pll_div4",
38*4882a593Smuzhiyun 		"ffac_topc_bus0_pll_div2", 1, 2, 0),
39*4882a593Smuzhiyun 	FFACTOR(0, "ffac_topc_bus1_pll_div2", "mout_topc_bus1_pll", 1, 2, 0),
40*4882a593Smuzhiyun 	FFACTOR(0, "ffac_topc_cc_pll_div2", "mout_topc_cc_pll", 1, 2, 0),
41*4882a593Smuzhiyun 	FFACTOR(0, "ffac_topc_mfc_pll_div2", "mout_topc_mfc_pll", 1, 2, 0),
42*4882a593Smuzhiyun };
43*4882a593Smuzhiyun 
44*4882a593Smuzhiyun /* List of parent clocks for Muxes in CMU_TOPC */
45*4882a593Smuzhiyun PNAME(mout_topc_aud_pll_ctrl_p)	= { "fin_pll", "fout_aud_pll" };
46*4882a593Smuzhiyun PNAME(mout_topc_bus0_pll_ctrl_p)	= { "fin_pll", "fout_bus0_pll" };
47*4882a593Smuzhiyun PNAME(mout_topc_bus1_pll_ctrl_p)	= { "fin_pll", "fout_bus1_pll" };
48*4882a593Smuzhiyun PNAME(mout_topc_cc_pll_ctrl_p)	= { "fin_pll", "fout_cc_pll" };
49*4882a593Smuzhiyun PNAME(mout_topc_mfc_pll_ctrl_p)	= { "fin_pll", "fout_mfc_pll" };
50*4882a593Smuzhiyun 
51*4882a593Smuzhiyun PNAME(mout_topc_group2) = { "mout_topc_bus0_pll_half",
52*4882a593Smuzhiyun 	"mout_topc_bus1_pll_half", "mout_topc_cc_pll_half",
53*4882a593Smuzhiyun 	"mout_topc_mfc_pll_half" };
54*4882a593Smuzhiyun 
55*4882a593Smuzhiyun PNAME(mout_topc_bus0_pll_half_p) = { "mout_topc_bus0_pll",
56*4882a593Smuzhiyun 	"ffac_topc_bus0_pll_div2", "ffac_topc_bus0_pll_div4"};
57*4882a593Smuzhiyun PNAME(mout_topc_bus1_pll_half_p) = { "mout_topc_bus1_pll",
58*4882a593Smuzhiyun 	"ffac_topc_bus1_pll_div2"};
59*4882a593Smuzhiyun PNAME(mout_topc_cc_pll_half_p) = { "mout_topc_cc_pll",
60*4882a593Smuzhiyun 	"ffac_topc_cc_pll_div2"};
61*4882a593Smuzhiyun PNAME(mout_topc_mfc_pll_half_p) = { "mout_topc_mfc_pll",
62*4882a593Smuzhiyun 	"ffac_topc_mfc_pll_div2"};
63*4882a593Smuzhiyun 
64*4882a593Smuzhiyun 
65*4882a593Smuzhiyun PNAME(mout_topc_bus0_pll_out_p) = {"mout_topc_bus0_pll",
66*4882a593Smuzhiyun 	"ffac_topc_bus0_pll_div2"};
67*4882a593Smuzhiyun 
68*4882a593Smuzhiyun static const unsigned long topc_clk_regs[] __initconst = {
69*4882a593Smuzhiyun 	CC_PLL_LOCK,
70*4882a593Smuzhiyun 	BUS0_PLL_LOCK,
71*4882a593Smuzhiyun 	BUS1_DPLL_LOCK,
72*4882a593Smuzhiyun 	MFC_PLL_LOCK,
73*4882a593Smuzhiyun 	AUD_PLL_LOCK,
74*4882a593Smuzhiyun 	CC_PLL_CON0,
75*4882a593Smuzhiyun 	BUS0_PLL_CON0,
76*4882a593Smuzhiyun 	BUS1_DPLL_CON0,
77*4882a593Smuzhiyun 	MFC_PLL_CON0,
78*4882a593Smuzhiyun 	AUD_PLL_CON0,
79*4882a593Smuzhiyun 	MUX_SEL_TOPC0,
80*4882a593Smuzhiyun 	MUX_SEL_TOPC1,
81*4882a593Smuzhiyun 	MUX_SEL_TOPC2,
82*4882a593Smuzhiyun 	MUX_SEL_TOPC3,
83*4882a593Smuzhiyun 	DIV_TOPC0,
84*4882a593Smuzhiyun 	DIV_TOPC1,
85*4882a593Smuzhiyun 	DIV_TOPC3,
86*4882a593Smuzhiyun };
87*4882a593Smuzhiyun 
88*4882a593Smuzhiyun static const struct samsung_mux_clock topc_mux_clks[] __initconst = {
89*4882a593Smuzhiyun 	MUX(0, "mout_topc_bus0_pll", mout_topc_bus0_pll_ctrl_p,
90*4882a593Smuzhiyun 		MUX_SEL_TOPC0, 0, 1),
91*4882a593Smuzhiyun 	MUX(0, "mout_topc_bus1_pll", mout_topc_bus1_pll_ctrl_p,
92*4882a593Smuzhiyun 		MUX_SEL_TOPC0, 4, 1),
93*4882a593Smuzhiyun 	MUX(0, "mout_topc_cc_pll", mout_topc_cc_pll_ctrl_p,
94*4882a593Smuzhiyun 		MUX_SEL_TOPC0, 8, 1),
95*4882a593Smuzhiyun 	MUX(0, "mout_topc_mfc_pll", mout_topc_mfc_pll_ctrl_p,
96*4882a593Smuzhiyun 		MUX_SEL_TOPC0, 12, 1),
97*4882a593Smuzhiyun 	MUX(0, "mout_topc_bus0_pll_half", mout_topc_bus0_pll_half_p,
98*4882a593Smuzhiyun 		MUX_SEL_TOPC0, 16, 2),
99*4882a593Smuzhiyun 	MUX(0, "mout_topc_bus1_pll_half", mout_topc_bus1_pll_half_p,
100*4882a593Smuzhiyun 		MUX_SEL_TOPC0, 20, 1),
101*4882a593Smuzhiyun 	MUX(0, "mout_topc_cc_pll_half", mout_topc_cc_pll_half_p,
102*4882a593Smuzhiyun 		MUX_SEL_TOPC0, 24, 1),
103*4882a593Smuzhiyun 	MUX(0, "mout_topc_mfc_pll_half", mout_topc_mfc_pll_half_p,
104*4882a593Smuzhiyun 		MUX_SEL_TOPC0, 28, 1),
105*4882a593Smuzhiyun 
106*4882a593Smuzhiyun 	MUX(0, "mout_topc_aud_pll", mout_topc_aud_pll_ctrl_p,
107*4882a593Smuzhiyun 		MUX_SEL_TOPC1, 0, 1),
108*4882a593Smuzhiyun 	MUX(0, "mout_topc_bus0_pll_out", mout_topc_bus0_pll_out_p,
109*4882a593Smuzhiyun 		MUX_SEL_TOPC1, 16, 1),
110*4882a593Smuzhiyun 
111*4882a593Smuzhiyun 	MUX(0, "mout_aclk_ccore_133", mout_topc_group2,	MUX_SEL_TOPC2, 4, 2),
112*4882a593Smuzhiyun 
113*4882a593Smuzhiyun 	MUX(0, "mout_aclk_mscl_532", mout_topc_group2, MUX_SEL_TOPC3, 20, 2),
114*4882a593Smuzhiyun 	MUX(0, "mout_aclk_peris_66", mout_topc_group2, MUX_SEL_TOPC3, 24, 2),
115*4882a593Smuzhiyun };
116*4882a593Smuzhiyun 
117*4882a593Smuzhiyun static const struct samsung_div_clock topc_div_clks[] __initconst = {
118*4882a593Smuzhiyun 	DIV(DOUT_ACLK_CCORE_133, "dout_aclk_ccore_133", "mout_aclk_ccore_133",
119*4882a593Smuzhiyun 		DIV_TOPC0, 4, 4),
120*4882a593Smuzhiyun 
121*4882a593Smuzhiyun 	DIV(DOUT_ACLK_MSCL_532, "dout_aclk_mscl_532", "mout_aclk_mscl_532",
122*4882a593Smuzhiyun 		DIV_TOPC1, 20, 4),
123*4882a593Smuzhiyun 	DIV(DOUT_ACLK_PERIS, "dout_aclk_peris_66", "mout_aclk_peris_66",
124*4882a593Smuzhiyun 		DIV_TOPC1, 24, 4),
125*4882a593Smuzhiyun 
126*4882a593Smuzhiyun 	DIV(DOUT_SCLK_BUS0_PLL, "dout_sclk_bus0_pll", "mout_topc_bus0_pll_out",
127*4882a593Smuzhiyun 		DIV_TOPC3, 0, 4),
128*4882a593Smuzhiyun 	DIV(DOUT_SCLK_BUS1_PLL, "dout_sclk_bus1_pll", "mout_topc_bus1_pll",
129*4882a593Smuzhiyun 		DIV_TOPC3, 8, 4),
130*4882a593Smuzhiyun 	DIV(DOUT_SCLK_CC_PLL, "dout_sclk_cc_pll", "mout_topc_cc_pll",
131*4882a593Smuzhiyun 		DIV_TOPC3, 12, 4),
132*4882a593Smuzhiyun 	DIV(DOUT_SCLK_MFC_PLL, "dout_sclk_mfc_pll", "mout_topc_mfc_pll",
133*4882a593Smuzhiyun 		DIV_TOPC3, 16, 4),
134*4882a593Smuzhiyun 	DIV(DOUT_SCLK_AUD_PLL, "dout_sclk_aud_pll", "mout_topc_aud_pll",
135*4882a593Smuzhiyun 		DIV_TOPC3, 28, 4),
136*4882a593Smuzhiyun };
137*4882a593Smuzhiyun 
138*4882a593Smuzhiyun static const struct samsung_pll_rate_table pll1460x_24mhz_tbl[] __initconst = {
139*4882a593Smuzhiyun 	PLL_36XX_RATE(24 * MHZ, 491519897, 20, 1, 0, 31457),
140*4882a593Smuzhiyun 	{},
141*4882a593Smuzhiyun };
142*4882a593Smuzhiyun 
143*4882a593Smuzhiyun static const struct samsung_gate_clock topc_gate_clks[] __initconst = {
144*4882a593Smuzhiyun 	GATE(ACLK_CCORE_133, "aclk_ccore_133", "dout_aclk_ccore_133",
145*4882a593Smuzhiyun 		ENABLE_ACLK_TOPC0, 4, CLK_IS_CRITICAL, 0),
146*4882a593Smuzhiyun 
147*4882a593Smuzhiyun 	GATE(ACLK_MSCL_532, "aclk_mscl_532", "dout_aclk_mscl_532",
148*4882a593Smuzhiyun 		ENABLE_ACLK_TOPC1, 20, 0, 0),
149*4882a593Smuzhiyun 
150*4882a593Smuzhiyun 	GATE(ACLK_PERIS_66, "aclk_peris_66", "dout_aclk_peris_66",
151*4882a593Smuzhiyun 		ENABLE_ACLK_TOPC1, 24, 0, 0),
152*4882a593Smuzhiyun 
153*4882a593Smuzhiyun 	GATE(SCLK_AUD_PLL, "sclk_aud_pll", "dout_sclk_aud_pll",
154*4882a593Smuzhiyun 		ENABLE_SCLK_TOPC1, 20, 0, 0),
155*4882a593Smuzhiyun 	GATE(SCLK_MFC_PLL_B, "sclk_mfc_pll_b", "dout_sclk_mfc_pll",
156*4882a593Smuzhiyun 		ENABLE_SCLK_TOPC1, 17, 0, 0),
157*4882a593Smuzhiyun 	GATE(SCLK_MFC_PLL_A, "sclk_mfc_pll_a", "dout_sclk_mfc_pll",
158*4882a593Smuzhiyun 		ENABLE_SCLK_TOPC1, 16, 0, 0),
159*4882a593Smuzhiyun 	GATE(SCLK_BUS1_PLL_B, "sclk_bus1_pll_b", "dout_sclk_bus1_pll",
160*4882a593Smuzhiyun 		ENABLE_SCLK_TOPC1, 13, 0, 0),
161*4882a593Smuzhiyun 	GATE(SCLK_BUS1_PLL_A, "sclk_bus1_pll_a", "dout_sclk_bus1_pll",
162*4882a593Smuzhiyun 		ENABLE_SCLK_TOPC1, 12, 0, 0),
163*4882a593Smuzhiyun 	GATE(SCLK_BUS0_PLL_B, "sclk_bus0_pll_b", "dout_sclk_bus0_pll",
164*4882a593Smuzhiyun 		ENABLE_SCLK_TOPC1, 5, 0, 0),
165*4882a593Smuzhiyun 	GATE(SCLK_BUS0_PLL_A, "sclk_bus0_pll_a", "dout_sclk_bus0_pll",
166*4882a593Smuzhiyun 		ENABLE_SCLK_TOPC1, 4, 0, 0),
167*4882a593Smuzhiyun 	GATE(SCLK_CC_PLL_B, "sclk_cc_pll_b", "dout_sclk_cc_pll",
168*4882a593Smuzhiyun 		ENABLE_SCLK_TOPC1, 1, 0, 0),
169*4882a593Smuzhiyun 	GATE(SCLK_CC_PLL_A, "sclk_cc_pll_a", "dout_sclk_cc_pll",
170*4882a593Smuzhiyun 		ENABLE_SCLK_TOPC1, 0, 0, 0),
171*4882a593Smuzhiyun };
172*4882a593Smuzhiyun 
173*4882a593Smuzhiyun static const struct samsung_pll_clock topc_pll_clks[] __initconst = {
174*4882a593Smuzhiyun 	PLL(pll_1451x, 0, "fout_bus0_pll", "fin_pll", BUS0_PLL_LOCK,
175*4882a593Smuzhiyun 		BUS0_PLL_CON0, NULL),
176*4882a593Smuzhiyun 	PLL(pll_1452x, 0, "fout_cc_pll", "fin_pll", CC_PLL_LOCK,
177*4882a593Smuzhiyun 		CC_PLL_CON0, NULL),
178*4882a593Smuzhiyun 	PLL(pll_1452x, 0, "fout_bus1_pll", "fin_pll", BUS1_DPLL_LOCK,
179*4882a593Smuzhiyun 		BUS1_DPLL_CON0, NULL),
180*4882a593Smuzhiyun 	PLL(pll_1452x, 0, "fout_mfc_pll", "fin_pll", MFC_PLL_LOCK,
181*4882a593Smuzhiyun 		MFC_PLL_CON0, NULL),
182*4882a593Smuzhiyun 	PLL(pll_1460x, FOUT_AUD_PLL, "fout_aud_pll", "fin_pll", AUD_PLL_LOCK,
183*4882a593Smuzhiyun 		AUD_PLL_CON0, pll1460x_24mhz_tbl),
184*4882a593Smuzhiyun };
185*4882a593Smuzhiyun 
186*4882a593Smuzhiyun static const struct samsung_cmu_info topc_cmu_info __initconst = {
187*4882a593Smuzhiyun 	.pll_clks		= topc_pll_clks,
188*4882a593Smuzhiyun 	.nr_pll_clks		= ARRAY_SIZE(topc_pll_clks),
189*4882a593Smuzhiyun 	.mux_clks		= topc_mux_clks,
190*4882a593Smuzhiyun 	.nr_mux_clks		= ARRAY_SIZE(topc_mux_clks),
191*4882a593Smuzhiyun 	.div_clks		= topc_div_clks,
192*4882a593Smuzhiyun 	.nr_div_clks		= ARRAY_SIZE(topc_div_clks),
193*4882a593Smuzhiyun 	.gate_clks		= topc_gate_clks,
194*4882a593Smuzhiyun 	.nr_gate_clks		= ARRAY_SIZE(topc_gate_clks),
195*4882a593Smuzhiyun 	.fixed_factor_clks	= topc_fixed_factor_clks,
196*4882a593Smuzhiyun 	.nr_fixed_factor_clks	= ARRAY_SIZE(topc_fixed_factor_clks),
197*4882a593Smuzhiyun 	.nr_clk_ids		= TOPC_NR_CLK,
198*4882a593Smuzhiyun 	.clk_regs		= topc_clk_regs,
199*4882a593Smuzhiyun 	.nr_clk_regs		= ARRAY_SIZE(topc_clk_regs),
200*4882a593Smuzhiyun };
201*4882a593Smuzhiyun 
exynos7_clk_topc_init(struct device_node * np)202*4882a593Smuzhiyun static void __init exynos7_clk_topc_init(struct device_node *np)
203*4882a593Smuzhiyun {
204*4882a593Smuzhiyun 	samsung_cmu_register_one(np, &topc_cmu_info);
205*4882a593Smuzhiyun }
206*4882a593Smuzhiyun 
207*4882a593Smuzhiyun CLK_OF_DECLARE(exynos7_clk_topc, "samsung,exynos7-clock-topc",
208*4882a593Smuzhiyun 	exynos7_clk_topc_init);
209*4882a593Smuzhiyun 
210*4882a593Smuzhiyun /* Register Offset definitions for CMU_TOP0 (0x105D0000) */
211*4882a593Smuzhiyun #define MUX_SEL_TOP00			0x0200
212*4882a593Smuzhiyun #define MUX_SEL_TOP01			0x0204
213*4882a593Smuzhiyun #define MUX_SEL_TOP03			0x020C
214*4882a593Smuzhiyun #define MUX_SEL_TOP0_PERIC0		0x0230
215*4882a593Smuzhiyun #define MUX_SEL_TOP0_PERIC1		0x0234
216*4882a593Smuzhiyun #define MUX_SEL_TOP0_PERIC2		0x0238
217*4882a593Smuzhiyun #define MUX_SEL_TOP0_PERIC3		0x023C
218*4882a593Smuzhiyun #define DIV_TOP03			0x060C
219*4882a593Smuzhiyun #define DIV_TOP0_PERIC0			0x0630
220*4882a593Smuzhiyun #define DIV_TOP0_PERIC1			0x0634
221*4882a593Smuzhiyun #define DIV_TOP0_PERIC2			0x0638
222*4882a593Smuzhiyun #define DIV_TOP0_PERIC3			0x063C
223*4882a593Smuzhiyun #define ENABLE_ACLK_TOP03		0x080C
224*4882a593Smuzhiyun #define ENABLE_SCLK_TOP0_PERIC0		0x0A30
225*4882a593Smuzhiyun #define ENABLE_SCLK_TOP0_PERIC1		0x0A34
226*4882a593Smuzhiyun #define ENABLE_SCLK_TOP0_PERIC2		0x0A38
227*4882a593Smuzhiyun #define ENABLE_SCLK_TOP0_PERIC3		0x0A3C
228*4882a593Smuzhiyun 
229*4882a593Smuzhiyun /* List of parent clocks for Muxes in CMU_TOP0 */
230*4882a593Smuzhiyun PNAME(mout_top0_bus0_pll_user_p)	= { "fin_pll", "sclk_bus0_pll_a" };
231*4882a593Smuzhiyun PNAME(mout_top0_bus1_pll_user_p)	= { "fin_pll", "sclk_bus1_pll_a" };
232*4882a593Smuzhiyun PNAME(mout_top0_cc_pll_user_p)	= { "fin_pll", "sclk_cc_pll_a" };
233*4882a593Smuzhiyun PNAME(mout_top0_mfc_pll_user_p)	= { "fin_pll", "sclk_mfc_pll_a" };
234*4882a593Smuzhiyun PNAME(mout_top0_aud_pll_user_p)	= { "fin_pll", "sclk_aud_pll" };
235*4882a593Smuzhiyun 
236*4882a593Smuzhiyun PNAME(mout_top0_bus0_pll_half_p) = {"mout_top0_bus0_pll_user",
237*4882a593Smuzhiyun 	"ffac_top0_bus0_pll_div2"};
238*4882a593Smuzhiyun PNAME(mout_top0_bus1_pll_half_p) = {"mout_top0_bus1_pll_user",
239*4882a593Smuzhiyun 	"ffac_top0_bus1_pll_div2"};
240*4882a593Smuzhiyun PNAME(mout_top0_cc_pll_half_p) = {"mout_top0_cc_pll_user",
241*4882a593Smuzhiyun 	"ffac_top0_cc_pll_div2"};
242*4882a593Smuzhiyun PNAME(mout_top0_mfc_pll_half_p) = {"mout_top0_mfc_pll_user",
243*4882a593Smuzhiyun 	"ffac_top0_mfc_pll_div2"};
244*4882a593Smuzhiyun 
245*4882a593Smuzhiyun PNAME(mout_top0_group1) = {"mout_top0_bus0_pll_half",
246*4882a593Smuzhiyun 	"mout_top0_bus1_pll_half", "mout_top0_cc_pll_half",
247*4882a593Smuzhiyun 	"mout_top0_mfc_pll_half"};
248*4882a593Smuzhiyun PNAME(mout_top0_group3) = {"ioclk_audiocdclk0",
249*4882a593Smuzhiyun 	"ioclk_audiocdclk1", "ioclk_spdif_extclk",
250*4882a593Smuzhiyun 	"mout_top0_aud_pll_user", "mout_top0_bus0_pll_half",
251*4882a593Smuzhiyun 	"mout_top0_bus1_pll_half"};
252*4882a593Smuzhiyun PNAME(mout_top0_group4) = {"ioclk_audiocdclk1", "mout_top0_aud_pll_user",
253*4882a593Smuzhiyun 	"mout_top0_bus0_pll_half", "mout_top0_bus1_pll_half"};
254*4882a593Smuzhiyun 
255*4882a593Smuzhiyun static const unsigned long top0_clk_regs[] __initconst = {
256*4882a593Smuzhiyun 	MUX_SEL_TOP00,
257*4882a593Smuzhiyun 	MUX_SEL_TOP01,
258*4882a593Smuzhiyun 	MUX_SEL_TOP03,
259*4882a593Smuzhiyun 	MUX_SEL_TOP0_PERIC0,
260*4882a593Smuzhiyun 	MUX_SEL_TOP0_PERIC1,
261*4882a593Smuzhiyun 	MUX_SEL_TOP0_PERIC2,
262*4882a593Smuzhiyun 	MUX_SEL_TOP0_PERIC3,
263*4882a593Smuzhiyun 	DIV_TOP03,
264*4882a593Smuzhiyun 	DIV_TOP0_PERIC0,
265*4882a593Smuzhiyun 	DIV_TOP0_PERIC1,
266*4882a593Smuzhiyun 	DIV_TOP0_PERIC2,
267*4882a593Smuzhiyun 	DIV_TOP0_PERIC3,
268*4882a593Smuzhiyun 	ENABLE_SCLK_TOP0_PERIC0,
269*4882a593Smuzhiyun 	ENABLE_SCLK_TOP0_PERIC1,
270*4882a593Smuzhiyun 	ENABLE_SCLK_TOP0_PERIC2,
271*4882a593Smuzhiyun 	ENABLE_SCLK_TOP0_PERIC3,
272*4882a593Smuzhiyun };
273*4882a593Smuzhiyun 
274*4882a593Smuzhiyun static const struct samsung_mux_clock top0_mux_clks[] __initconst = {
275*4882a593Smuzhiyun 	MUX(0, "mout_top0_aud_pll_user", mout_top0_aud_pll_user_p,
276*4882a593Smuzhiyun 		MUX_SEL_TOP00, 0, 1),
277*4882a593Smuzhiyun 	MUX(0, "mout_top0_mfc_pll_user", mout_top0_mfc_pll_user_p,
278*4882a593Smuzhiyun 		MUX_SEL_TOP00, 4, 1),
279*4882a593Smuzhiyun 	MUX(0, "mout_top0_cc_pll_user", mout_top0_cc_pll_user_p,
280*4882a593Smuzhiyun 		MUX_SEL_TOP00, 8, 1),
281*4882a593Smuzhiyun 	MUX(0, "mout_top0_bus1_pll_user", mout_top0_bus1_pll_user_p,
282*4882a593Smuzhiyun 		MUX_SEL_TOP00, 12, 1),
283*4882a593Smuzhiyun 	MUX(0, "mout_top0_bus0_pll_user", mout_top0_bus0_pll_user_p,
284*4882a593Smuzhiyun 		MUX_SEL_TOP00, 16, 1),
285*4882a593Smuzhiyun 
286*4882a593Smuzhiyun 	MUX(0, "mout_top0_mfc_pll_half", mout_top0_mfc_pll_half_p,
287*4882a593Smuzhiyun 		MUX_SEL_TOP01, 4, 1),
288*4882a593Smuzhiyun 	MUX(0, "mout_top0_cc_pll_half", mout_top0_cc_pll_half_p,
289*4882a593Smuzhiyun 		MUX_SEL_TOP01, 8, 1),
290*4882a593Smuzhiyun 	MUX(0, "mout_top0_bus1_pll_half", mout_top0_bus1_pll_half_p,
291*4882a593Smuzhiyun 		MUX_SEL_TOP01, 12, 1),
292*4882a593Smuzhiyun 	MUX(0, "mout_top0_bus0_pll_half", mout_top0_bus0_pll_half_p,
293*4882a593Smuzhiyun 		MUX_SEL_TOP01, 16, 1),
294*4882a593Smuzhiyun 
295*4882a593Smuzhiyun 	MUX(0, "mout_aclk_peric1_66", mout_top0_group1, MUX_SEL_TOP03, 12, 2),
296*4882a593Smuzhiyun 	MUX(0, "mout_aclk_peric0_66", mout_top0_group1, MUX_SEL_TOP03, 20, 2),
297*4882a593Smuzhiyun 
298*4882a593Smuzhiyun 	MUX(0, "mout_sclk_spdif", mout_top0_group3, MUX_SEL_TOP0_PERIC0, 4, 3),
299*4882a593Smuzhiyun 	MUX(0, "mout_sclk_pcm1", mout_top0_group4, MUX_SEL_TOP0_PERIC0, 8, 2),
300*4882a593Smuzhiyun 	MUX(0, "mout_sclk_i2s1", mout_top0_group4, MUX_SEL_TOP0_PERIC0, 20, 2),
301*4882a593Smuzhiyun 
302*4882a593Smuzhiyun 	MUX(0, "mout_sclk_spi1", mout_top0_group1, MUX_SEL_TOP0_PERIC1, 8, 2),
303*4882a593Smuzhiyun 	MUX(0, "mout_sclk_spi0", mout_top0_group1, MUX_SEL_TOP0_PERIC1, 20, 2),
304*4882a593Smuzhiyun 
305*4882a593Smuzhiyun 	MUX(0, "mout_sclk_spi3", mout_top0_group1, MUX_SEL_TOP0_PERIC2, 8, 2),
306*4882a593Smuzhiyun 	MUX(0, "mout_sclk_spi2", mout_top0_group1, MUX_SEL_TOP0_PERIC2, 20, 2),
307*4882a593Smuzhiyun 	MUX(0, "mout_sclk_uart3", mout_top0_group1, MUX_SEL_TOP0_PERIC3, 4, 2),
308*4882a593Smuzhiyun 	MUX(0, "mout_sclk_uart2", mout_top0_group1, MUX_SEL_TOP0_PERIC3, 8, 2),
309*4882a593Smuzhiyun 	MUX(0, "mout_sclk_uart1", mout_top0_group1, MUX_SEL_TOP0_PERIC3, 12, 2),
310*4882a593Smuzhiyun 	MUX(0, "mout_sclk_uart0", mout_top0_group1, MUX_SEL_TOP0_PERIC3, 16, 2),
311*4882a593Smuzhiyun 	MUX(0, "mout_sclk_spi4", mout_top0_group1, MUX_SEL_TOP0_PERIC3, 20, 2),
312*4882a593Smuzhiyun };
313*4882a593Smuzhiyun 
314*4882a593Smuzhiyun static const struct samsung_div_clock top0_div_clks[] __initconst = {
315*4882a593Smuzhiyun 	DIV(DOUT_ACLK_PERIC1, "dout_aclk_peric1_66", "mout_aclk_peric1_66",
316*4882a593Smuzhiyun 		DIV_TOP03, 12, 6),
317*4882a593Smuzhiyun 	DIV(DOUT_ACLK_PERIC0, "dout_aclk_peric0_66", "mout_aclk_peric0_66",
318*4882a593Smuzhiyun 		DIV_TOP03, 20, 6),
319*4882a593Smuzhiyun 
320*4882a593Smuzhiyun 	DIV(0, "dout_sclk_spdif", "mout_sclk_spdif", DIV_TOP0_PERIC0, 4, 4),
321*4882a593Smuzhiyun 	DIV(0, "dout_sclk_pcm1", "mout_sclk_pcm1", DIV_TOP0_PERIC0, 8, 12),
322*4882a593Smuzhiyun 	DIV(0, "dout_sclk_i2s1", "mout_sclk_i2s1", DIV_TOP0_PERIC0, 20, 10),
323*4882a593Smuzhiyun 
324*4882a593Smuzhiyun 	DIV(0, "dout_sclk_spi1", "mout_sclk_spi1", DIV_TOP0_PERIC1, 8, 12),
325*4882a593Smuzhiyun 	DIV(0, "dout_sclk_spi0", "mout_sclk_spi0", DIV_TOP0_PERIC1, 20, 12),
326*4882a593Smuzhiyun 
327*4882a593Smuzhiyun 	DIV(0, "dout_sclk_spi3", "mout_sclk_spi3", DIV_TOP0_PERIC2, 8, 12),
328*4882a593Smuzhiyun 	DIV(0, "dout_sclk_spi2", "mout_sclk_spi2", DIV_TOP0_PERIC2, 20, 12),
329*4882a593Smuzhiyun 
330*4882a593Smuzhiyun 	DIV(0, "dout_sclk_uart3", "mout_sclk_uart3", DIV_TOP0_PERIC3, 4, 4),
331*4882a593Smuzhiyun 	DIV(0, "dout_sclk_uart2", "mout_sclk_uart2", DIV_TOP0_PERIC3, 8, 4),
332*4882a593Smuzhiyun 	DIV(0, "dout_sclk_uart1", "mout_sclk_uart1", DIV_TOP0_PERIC3, 12, 4),
333*4882a593Smuzhiyun 	DIV(0, "dout_sclk_uart0", "mout_sclk_uart0", DIV_TOP0_PERIC3, 16, 4),
334*4882a593Smuzhiyun 	DIV(0, "dout_sclk_spi4", "mout_sclk_spi4", DIV_TOP0_PERIC3, 20, 12),
335*4882a593Smuzhiyun };
336*4882a593Smuzhiyun 
337*4882a593Smuzhiyun static const struct samsung_gate_clock top0_gate_clks[] __initconst = {
338*4882a593Smuzhiyun 	GATE(CLK_ACLK_PERIC0_66, "aclk_peric0_66", "dout_aclk_peric0_66",
339*4882a593Smuzhiyun 		ENABLE_ACLK_TOP03, 20, CLK_SET_RATE_PARENT, 0),
340*4882a593Smuzhiyun 	GATE(CLK_ACLK_PERIC1_66, "aclk_peric1_66", "dout_aclk_peric1_66",
341*4882a593Smuzhiyun 		ENABLE_ACLK_TOP03, 12, CLK_SET_RATE_PARENT, 0),
342*4882a593Smuzhiyun 
343*4882a593Smuzhiyun 	GATE(CLK_SCLK_SPDIF, "sclk_spdif", "dout_sclk_spdif",
344*4882a593Smuzhiyun 		ENABLE_SCLK_TOP0_PERIC0, 4, CLK_SET_RATE_PARENT, 0),
345*4882a593Smuzhiyun 	GATE(CLK_SCLK_PCM1, "sclk_pcm1", "dout_sclk_pcm1",
346*4882a593Smuzhiyun 		ENABLE_SCLK_TOP0_PERIC0, 8, CLK_SET_RATE_PARENT, 0),
347*4882a593Smuzhiyun 	GATE(CLK_SCLK_I2S1, "sclk_i2s1", "dout_sclk_i2s1",
348*4882a593Smuzhiyun 		ENABLE_SCLK_TOP0_PERIC0, 20, CLK_SET_RATE_PARENT, 0),
349*4882a593Smuzhiyun 
350*4882a593Smuzhiyun 	GATE(CLK_SCLK_SPI1, "sclk_spi1", "dout_sclk_spi1",
351*4882a593Smuzhiyun 		ENABLE_SCLK_TOP0_PERIC1, 8, CLK_SET_RATE_PARENT, 0),
352*4882a593Smuzhiyun 	GATE(CLK_SCLK_SPI0, "sclk_spi0", "dout_sclk_spi0",
353*4882a593Smuzhiyun 		ENABLE_SCLK_TOP0_PERIC1, 20, CLK_SET_RATE_PARENT, 0),
354*4882a593Smuzhiyun 
355*4882a593Smuzhiyun 	GATE(CLK_SCLK_SPI3, "sclk_spi3", "dout_sclk_spi3",
356*4882a593Smuzhiyun 		ENABLE_SCLK_TOP0_PERIC2, 8, CLK_SET_RATE_PARENT, 0),
357*4882a593Smuzhiyun 	GATE(CLK_SCLK_SPI2, "sclk_spi2", "dout_sclk_spi2",
358*4882a593Smuzhiyun 		ENABLE_SCLK_TOP0_PERIC2, 20, CLK_SET_RATE_PARENT, 0),
359*4882a593Smuzhiyun 	GATE(CLK_SCLK_UART3, "sclk_uart3", "dout_sclk_uart3",
360*4882a593Smuzhiyun 		ENABLE_SCLK_TOP0_PERIC3, 4, 0, 0),
361*4882a593Smuzhiyun 	GATE(CLK_SCLK_UART2, "sclk_uart2", "dout_sclk_uart2",
362*4882a593Smuzhiyun 		ENABLE_SCLK_TOP0_PERIC3, 8, 0, 0),
363*4882a593Smuzhiyun 	GATE(CLK_SCLK_UART1, "sclk_uart1", "dout_sclk_uart1",
364*4882a593Smuzhiyun 		ENABLE_SCLK_TOP0_PERIC3, 12, 0, 0),
365*4882a593Smuzhiyun 	GATE(CLK_SCLK_UART0, "sclk_uart0", "dout_sclk_uart0",
366*4882a593Smuzhiyun 		ENABLE_SCLK_TOP0_PERIC3, 16, 0, 0),
367*4882a593Smuzhiyun 	GATE(CLK_SCLK_SPI4, "sclk_spi4", "dout_sclk_spi4",
368*4882a593Smuzhiyun 		ENABLE_SCLK_TOP0_PERIC3, 20, CLK_SET_RATE_PARENT, 0),
369*4882a593Smuzhiyun };
370*4882a593Smuzhiyun 
371*4882a593Smuzhiyun static const struct samsung_fixed_factor_clock top0_fixed_factor_clks[] __initconst = {
372*4882a593Smuzhiyun 	FFACTOR(0, "ffac_top0_bus0_pll_div2", "mout_top0_bus0_pll_user",
373*4882a593Smuzhiyun 		1, 2, 0),
374*4882a593Smuzhiyun 	FFACTOR(0, "ffac_top0_bus1_pll_div2", "mout_top0_bus1_pll_user",
375*4882a593Smuzhiyun 		1, 2, 0),
376*4882a593Smuzhiyun 	FFACTOR(0, "ffac_top0_cc_pll_div2", "mout_top0_cc_pll_user", 1, 2, 0),
377*4882a593Smuzhiyun 	FFACTOR(0, "ffac_top0_mfc_pll_div2", "mout_top0_mfc_pll_user", 1, 2, 0),
378*4882a593Smuzhiyun };
379*4882a593Smuzhiyun 
380*4882a593Smuzhiyun static const struct samsung_cmu_info top0_cmu_info __initconst = {
381*4882a593Smuzhiyun 	.mux_clks		= top0_mux_clks,
382*4882a593Smuzhiyun 	.nr_mux_clks		= ARRAY_SIZE(top0_mux_clks),
383*4882a593Smuzhiyun 	.div_clks		= top0_div_clks,
384*4882a593Smuzhiyun 	.nr_div_clks		= ARRAY_SIZE(top0_div_clks),
385*4882a593Smuzhiyun 	.gate_clks		= top0_gate_clks,
386*4882a593Smuzhiyun 	.nr_gate_clks		= ARRAY_SIZE(top0_gate_clks),
387*4882a593Smuzhiyun 	.fixed_factor_clks	= top0_fixed_factor_clks,
388*4882a593Smuzhiyun 	.nr_fixed_factor_clks	= ARRAY_SIZE(top0_fixed_factor_clks),
389*4882a593Smuzhiyun 	.nr_clk_ids		= TOP0_NR_CLK,
390*4882a593Smuzhiyun 	.clk_regs		= top0_clk_regs,
391*4882a593Smuzhiyun 	.nr_clk_regs		= ARRAY_SIZE(top0_clk_regs),
392*4882a593Smuzhiyun };
393*4882a593Smuzhiyun 
exynos7_clk_top0_init(struct device_node * np)394*4882a593Smuzhiyun static void __init exynos7_clk_top0_init(struct device_node *np)
395*4882a593Smuzhiyun {
396*4882a593Smuzhiyun 	samsung_cmu_register_one(np, &top0_cmu_info);
397*4882a593Smuzhiyun }
398*4882a593Smuzhiyun 
399*4882a593Smuzhiyun CLK_OF_DECLARE(exynos7_clk_top0, "samsung,exynos7-clock-top0",
400*4882a593Smuzhiyun 	exynos7_clk_top0_init);
401*4882a593Smuzhiyun 
402*4882a593Smuzhiyun /* Register Offset definitions for CMU_TOP1 (0x105E0000) */
403*4882a593Smuzhiyun #define MUX_SEL_TOP10			0x0200
404*4882a593Smuzhiyun #define MUX_SEL_TOP11			0x0204
405*4882a593Smuzhiyun #define MUX_SEL_TOP13			0x020C
406*4882a593Smuzhiyun #define MUX_SEL_TOP1_FSYS0		0x0224
407*4882a593Smuzhiyun #define MUX_SEL_TOP1_FSYS1		0x0228
408*4882a593Smuzhiyun #define MUX_SEL_TOP1_FSYS11		0x022C
409*4882a593Smuzhiyun #define DIV_TOP13			0x060C
410*4882a593Smuzhiyun #define DIV_TOP1_FSYS0			0x0624
411*4882a593Smuzhiyun #define DIV_TOP1_FSYS1			0x0628
412*4882a593Smuzhiyun #define DIV_TOP1_FSYS11			0x062C
413*4882a593Smuzhiyun #define ENABLE_ACLK_TOP13		0x080C
414*4882a593Smuzhiyun #define ENABLE_SCLK_TOP1_FSYS0		0x0A24
415*4882a593Smuzhiyun #define ENABLE_SCLK_TOP1_FSYS1		0x0A28
416*4882a593Smuzhiyun #define ENABLE_SCLK_TOP1_FSYS11		0x0A2C
417*4882a593Smuzhiyun 
418*4882a593Smuzhiyun /* List of parent clocks for Muxes in CMU_TOP1 */
419*4882a593Smuzhiyun PNAME(mout_top1_bus0_pll_user_p)	= { "fin_pll", "sclk_bus0_pll_b" };
420*4882a593Smuzhiyun PNAME(mout_top1_bus1_pll_user_p)	= { "fin_pll", "sclk_bus1_pll_b" };
421*4882a593Smuzhiyun PNAME(mout_top1_cc_pll_user_p)	= { "fin_pll", "sclk_cc_pll_b" };
422*4882a593Smuzhiyun PNAME(mout_top1_mfc_pll_user_p)	= { "fin_pll", "sclk_mfc_pll_b" };
423*4882a593Smuzhiyun 
424*4882a593Smuzhiyun PNAME(mout_top1_bus0_pll_half_p) = {"mout_top1_bus0_pll_user",
425*4882a593Smuzhiyun 	"ffac_top1_bus0_pll_div2"};
426*4882a593Smuzhiyun PNAME(mout_top1_bus1_pll_half_p) = {"mout_top1_bus1_pll_user",
427*4882a593Smuzhiyun 	"ffac_top1_bus1_pll_div2"};
428*4882a593Smuzhiyun PNAME(mout_top1_cc_pll_half_p) = {"mout_top1_cc_pll_user",
429*4882a593Smuzhiyun 	"ffac_top1_cc_pll_div2"};
430*4882a593Smuzhiyun PNAME(mout_top1_mfc_pll_half_p) = {"mout_top1_mfc_pll_user",
431*4882a593Smuzhiyun 	"ffac_top1_mfc_pll_div2"};
432*4882a593Smuzhiyun 
433*4882a593Smuzhiyun PNAME(mout_top1_group1) = {"mout_top1_bus0_pll_half",
434*4882a593Smuzhiyun 	"mout_top1_bus1_pll_half", "mout_top1_cc_pll_half",
435*4882a593Smuzhiyun 	"mout_top1_mfc_pll_half"};
436*4882a593Smuzhiyun 
437*4882a593Smuzhiyun static const unsigned long top1_clk_regs[] __initconst = {
438*4882a593Smuzhiyun 	MUX_SEL_TOP10,
439*4882a593Smuzhiyun 	MUX_SEL_TOP11,
440*4882a593Smuzhiyun 	MUX_SEL_TOP13,
441*4882a593Smuzhiyun 	MUX_SEL_TOP1_FSYS0,
442*4882a593Smuzhiyun 	MUX_SEL_TOP1_FSYS1,
443*4882a593Smuzhiyun 	MUX_SEL_TOP1_FSYS11,
444*4882a593Smuzhiyun 	DIV_TOP13,
445*4882a593Smuzhiyun 	DIV_TOP1_FSYS0,
446*4882a593Smuzhiyun 	DIV_TOP1_FSYS1,
447*4882a593Smuzhiyun 	DIV_TOP1_FSYS11,
448*4882a593Smuzhiyun 	ENABLE_ACLK_TOP13,
449*4882a593Smuzhiyun 	ENABLE_SCLK_TOP1_FSYS0,
450*4882a593Smuzhiyun 	ENABLE_SCLK_TOP1_FSYS1,
451*4882a593Smuzhiyun 	ENABLE_SCLK_TOP1_FSYS11,
452*4882a593Smuzhiyun };
453*4882a593Smuzhiyun 
454*4882a593Smuzhiyun static const struct samsung_mux_clock top1_mux_clks[] __initconst = {
455*4882a593Smuzhiyun 	MUX(0, "mout_top1_mfc_pll_user", mout_top1_mfc_pll_user_p,
456*4882a593Smuzhiyun 		MUX_SEL_TOP10, 4, 1),
457*4882a593Smuzhiyun 	MUX(0, "mout_top1_cc_pll_user", mout_top1_cc_pll_user_p,
458*4882a593Smuzhiyun 		MUX_SEL_TOP10, 8, 1),
459*4882a593Smuzhiyun 	MUX(0, "mout_top1_bus1_pll_user", mout_top1_bus1_pll_user_p,
460*4882a593Smuzhiyun 		MUX_SEL_TOP10, 12, 1),
461*4882a593Smuzhiyun 	MUX(0, "mout_top1_bus0_pll_user", mout_top1_bus0_pll_user_p,
462*4882a593Smuzhiyun 		MUX_SEL_TOP10, 16, 1),
463*4882a593Smuzhiyun 
464*4882a593Smuzhiyun 	MUX(0, "mout_top1_mfc_pll_half", mout_top1_mfc_pll_half_p,
465*4882a593Smuzhiyun 		MUX_SEL_TOP11, 4, 1),
466*4882a593Smuzhiyun 	MUX(0, "mout_top1_cc_pll_half", mout_top1_cc_pll_half_p,
467*4882a593Smuzhiyun 		MUX_SEL_TOP11, 8, 1),
468*4882a593Smuzhiyun 	MUX(0, "mout_top1_bus1_pll_half", mout_top1_bus1_pll_half_p,
469*4882a593Smuzhiyun 		MUX_SEL_TOP11, 12, 1),
470*4882a593Smuzhiyun 	MUX(0, "mout_top1_bus0_pll_half", mout_top1_bus0_pll_half_p,
471*4882a593Smuzhiyun 		MUX_SEL_TOP11, 16, 1),
472*4882a593Smuzhiyun 
473*4882a593Smuzhiyun 	MUX(0, "mout_aclk_fsys1_200", mout_top1_group1, MUX_SEL_TOP13, 24, 2),
474*4882a593Smuzhiyun 	MUX(0, "mout_aclk_fsys0_200", mout_top1_group1, MUX_SEL_TOP13, 28, 2),
475*4882a593Smuzhiyun 
476*4882a593Smuzhiyun 	MUX(0, "mout_sclk_phy_fsys0_26m", mout_top1_group1,
477*4882a593Smuzhiyun 		MUX_SEL_TOP1_FSYS0, 0, 2),
478*4882a593Smuzhiyun 	MUX(0, "mout_sclk_mmc2", mout_top1_group1, MUX_SEL_TOP1_FSYS0, 16, 2),
479*4882a593Smuzhiyun 	MUX(0, "mout_sclk_usbdrd300", mout_top1_group1,
480*4882a593Smuzhiyun 		MUX_SEL_TOP1_FSYS0, 28, 2),
481*4882a593Smuzhiyun 
482*4882a593Smuzhiyun 	MUX(0, "mout_sclk_phy_fsys1", mout_top1_group1,
483*4882a593Smuzhiyun 		MUX_SEL_TOP1_FSYS1, 0, 2),
484*4882a593Smuzhiyun 	MUX(0, "mout_sclk_ufsunipro20", mout_top1_group1,
485*4882a593Smuzhiyun 		MUX_SEL_TOP1_FSYS1, 16, 2),
486*4882a593Smuzhiyun 
487*4882a593Smuzhiyun 	MUX(0, "mout_sclk_mmc1", mout_top1_group1, MUX_SEL_TOP1_FSYS11, 0, 2),
488*4882a593Smuzhiyun 	MUX(0, "mout_sclk_mmc0", mout_top1_group1, MUX_SEL_TOP1_FSYS11, 12, 2),
489*4882a593Smuzhiyun 	MUX(0, "mout_sclk_phy_fsys1_26m", mout_top1_group1,
490*4882a593Smuzhiyun 		MUX_SEL_TOP1_FSYS11, 24, 2),
491*4882a593Smuzhiyun };
492*4882a593Smuzhiyun 
493*4882a593Smuzhiyun static const struct samsung_div_clock top1_div_clks[] __initconst = {
494*4882a593Smuzhiyun 	DIV(DOUT_ACLK_FSYS1_200, "dout_aclk_fsys1_200", "mout_aclk_fsys1_200",
495*4882a593Smuzhiyun 		DIV_TOP13, 24, 4),
496*4882a593Smuzhiyun 	DIV(DOUT_ACLK_FSYS0_200, "dout_aclk_fsys0_200", "mout_aclk_fsys0_200",
497*4882a593Smuzhiyun 		DIV_TOP13, 28, 4),
498*4882a593Smuzhiyun 
499*4882a593Smuzhiyun 	DIV(DOUT_SCLK_PHY_FSYS1, "dout_sclk_phy_fsys1",
500*4882a593Smuzhiyun 		"mout_sclk_phy_fsys1", DIV_TOP1_FSYS1, 0, 6),
501*4882a593Smuzhiyun 
502*4882a593Smuzhiyun 	DIV(DOUT_SCLK_UFSUNIPRO20, "dout_sclk_ufsunipro20",
503*4882a593Smuzhiyun 		"mout_sclk_ufsunipro20",
504*4882a593Smuzhiyun 		DIV_TOP1_FSYS1, 16, 6),
505*4882a593Smuzhiyun 
506*4882a593Smuzhiyun 	DIV(DOUT_SCLK_MMC2, "dout_sclk_mmc2", "mout_sclk_mmc2",
507*4882a593Smuzhiyun 		DIV_TOP1_FSYS0, 16, 10),
508*4882a593Smuzhiyun 	DIV(0, "dout_sclk_usbdrd300", "mout_sclk_usbdrd300",
509*4882a593Smuzhiyun 		DIV_TOP1_FSYS0, 28, 4),
510*4882a593Smuzhiyun 
511*4882a593Smuzhiyun 	DIV(DOUT_SCLK_MMC1, "dout_sclk_mmc1", "mout_sclk_mmc1",
512*4882a593Smuzhiyun 		DIV_TOP1_FSYS11, 0, 10),
513*4882a593Smuzhiyun 	DIV(DOUT_SCLK_MMC0, "dout_sclk_mmc0", "mout_sclk_mmc0",
514*4882a593Smuzhiyun 		DIV_TOP1_FSYS11, 12, 10),
515*4882a593Smuzhiyun 
516*4882a593Smuzhiyun 	DIV(DOUT_SCLK_PHY_FSYS1_26M, "dout_sclk_phy_fsys1_26m",
517*4882a593Smuzhiyun 		"mout_sclk_phy_fsys1_26m", DIV_TOP1_FSYS11, 24, 6),
518*4882a593Smuzhiyun };
519*4882a593Smuzhiyun 
520*4882a593Smuzhiyun static const struct samsung_gate_clock top1_gate_clks[] __initconst = {
521*4882a593Smuzhiyun 	GATE(CLK_SCLK_MMC2, "sclk_mmc2", "dout_sclk_mmc2",
522*4882a593Smuzhiyun 		ENABLE_SCLK_TOP1_FSYS0, 16, CLK_SET_RATE_PARENT, 0),
523*4882a593Smuzhiyun 	GATE(0, "sclk_usbdrd300", "dout_sclk_usbdrd300",
524*4882a593Smuzhiyun 		ENABLE_SCLK_TOP1_FSYS0, 28, 0, 0),
525*4882a593Smuzhiyun 
526*4882a593Smuzhiyun 	GATE(CLK_SCLK_PHY_FSYS1, "sclk_phy_fsys1", "dout_sclk_phy_fsys1",
527*4882a593Smuzhiyun 		ENABLE_SCLK_TOP1_FSYS1, 0, CLK_SET_RATE_PARENT, 0),
528*4882a593Smuzhiyun 
529*4882a593Smuzhiyun 	GATE(CLK_SCLK_UFSUNIPRO20, "sclk_ufsunipro20", "dout_sclk_ufsunipro20",
530*4882a593Smuzhiyun 		ENABLE_SCLK_TOP1_FSYS1, 16, CLK_SET_RATE_PARENT, 0),
531*4882a593Smuzhiyun 
532*4882a593Smuzhiyun 	GATE(CLK_SCLK_MMC1, "sclk_mmc1", "dout_sclk_mmc1",
533*4882a593Smuzhiyun 		ENABLE_SCLK_TOP1_FSYS11, 0, CLK_SET_RATE_PARENT, 0),
534*4882a593Smuzhiyun 	GATE(CLK_SCLK_MMC0, "sclk_mmc0", "dout_sclk_mmc0",
535*4882a593Smuzhiyun 		ENABLE_SCLK_TOP1_FSYS11, 12, CLK_SET_RATE_PARENT, 0),
536*4882a593Smuzhiyun 
537*4882a593Smuzhiyun 	GATE(CLK_ACLK_FSYS0_200, "aclk_fsys0_200", "dout_aclk_fsys0_200",
538*4882a593Smuzhiyun 		ENABLE_ACLK_TOP13, 28, CLK_SET_RATE_PARENT |
539*4882a593Smuzhiyun 		CLK_IS_CRITICAL, 0),
540*4882a593Smuzhiyun 	/*
541*4882a593Smuzhiyun 	 * This clock is required for the CMU_FSYS1 registers access, keep it
542*4882a593Smuzhiyun 	 * enabled permanently until proper runtime PM support is added.
543*4882a593Smuzhiyun 	 */
544*4882a593Smuzhiyun 	GATE(CLK_ACLK_FSYS1_200, "aclk_fsys1_200", "dout_aclk_fsys1_200",
545*4882a593Smuzhiyun 		ENABLE_ACLK_TOP13, 24, CLK_SET_RATE_PARENT |
546*4882a593Smuzhiyun 		CLK_IS_CRITICAL, 0),
547*4882a593Smuzhiyun 
548*4882a593Smuzhiyun 	GATE(CLK_SCLK_PHY_FSYS1_26M, "sclk_phy_fsys1_26m",
549*4882a593Smuzhiyun 		"dout_sclk_phy_fsys1_26m", ENABLE_SCLK_TOP1_FSYS11,
550*4882a593Smuzhiyun 		24, CLK_SET_RATE_PARENT, 0),
551*4882a593Smuzhiyun };
552*4882a593Smuzhiyun 
553*4882a593Smuzhiyun static const struct samsung_fixed_factor_clock top1_fixed_factor_clks[] __initconst = {
554*4882a593Smuzhiyun 	FFACTOR(0, "ffac_top1_bus0_pll_div2", "mout_top1_bus0_pll_user",
555*4882a593Smuzhiyun 		1, 2, 0),
556*4882a593Smuzhiyun 	FFACTOR(0, "ffac_top1_bus1_pll_div2", "mout_top1_bus1_pll_user",
557*4882a593Smuzhiyun 		1, 2, 0),
558*4882a593Smuzhiyun 	FFACTOR(0, "ffac_top1_cc_pll_div2", "mout_top1_cc_pll_user", 1, 2, 0),
559*4882a593Smuzhiyun 	FFACTOR(0, "ffac_top1_mfc_pll_div2", "mout_top1_mfc_pll_user", 1, 2, 0),
560*4882a593Smuzhiyun };
561*4882a593Smuzhiyun 
562*4882a593Smuzhiyun static const struct samsung_cmu_info top1_cmu_info __initconst = {
563*4882a593Smuzhiyun 	.mux_clks		= top1_mux_clks,
564*4882a593Smuzhiyun 	.nr_mux_clks		= ARRAY_SIZE(top1_mux_clks),
565*4882a593Smuzhiyun 	.div_clks		= top1_div_clks,
566*4882a593Smuzhiyun 	.nr_div_clks		= ARRAY_SIZE(top1_div_clks),
567*4882a593Smuzhiyun 	.gate_clks		= top1_gate_clks,
568*4882a593Smuzhiyun 	.nr_gate_clks		= ARRAY_SIZE(top1_gate_clks),
569*4882a593Smuzhiyun 	.fixed_factor_clks	= top1_fixed_factor_clks,
570*4882a593Smuzhiyun 	.nr_fixed_factor_clks	= ARRAY_SIZE(top1_fixed_factor_clks),
571*4882a593Smuzhiyun 	.nr_clk_ids		= TOP1_NR_CLK,
572*4882a593Smuzhiyun 	.clk_regs		= top1_clk_regs,
573*4882a593Smuzhiyun 	.nr_clk_regs		= ARRAY_SIZE(top1_clk_regs),
574*4882a593Smuzhiyun };
575*4882a593Smuzhiyun 
exynos7_clk_top1_init(struct device_node * np)576*4882a593Smuzhiyun static void __init exynos7_clk_top1_init(struct device_node *np)
577*4882a593Smuzhiyun {
578*4882a593Smuzhiyun 	samsung_cmu_register_one(np, &top1_cmu_info);
579*4882a593Smuzhiyun }
580*4882a593Smuzhiyun 
581*4882a593Smuzhiyun CLK_OF_DECLARE(exynos7_clk_top1, "samsung,exynos7-clock-top1",
582*4882a593Smuzhiyun 	exynos7_clk_top1_init);
583*4882a593Smuzhiyun 
584*4882a593Smuzhiyun /* Register Offset definitions for CMU_CCORE (0x105B0000) */
585*4882a593Smuzhiyun #define MUX_SEL_CCORE			0x0200
586*4882a593Smuzhiyun #define DIV_CCORE			0x0600
587*4882a593Smuzhiyun #define ENABLE_ACLK_CCORE0		0x0800
588*4882a593Smuzhiyun #define ENABLE_ACLK_CCORE1		0x0804
589*4882a593Smuzhiyun #define ENABLE_PCLK_CCORE		0x0900
590*4882a593Smuzhiyun 
591*4882a593Smuzhiyun /*
592*4882a593Smuzhiyun  * List of parent clocks for Muxes in CMU_CCORE
593*4882a593Smuzhiyun  */
594*4882a593Smuzhiyun PNAME(mout_aclk_ccore_133_user_p)	= { "fin_pll", "aclk_ccore_133" };
595*4882a593Smuzhiyun 
596*4882a593Smuzhiyun static const unsigned long ccore_clk_regs[] __initconst = {
597*4882a593Smuzhiyun 	MUX_SEL_CCORE,
598*4882a593Smuzhiyun 	ENABLE_PCLK_CCORE,
599*4882a593Smuzhiyun };
600*4882a593Smuzhiyun 
601*4882a593Smuzhiyun static const struct samsung_mux_clock ccore_mux_clks[] __initconst = {
602*4882a593Smuzhiyun 	MUX(0, "mout_aclk_ccore_133_user", mout_aclk_ccore_133_user_p,
603*4882a593Smuzhiyun 		MUX_SEL_CCORE, 1, 1),
604*4882a593Smuzhiyun };
605*4882a593Smuzhiyun 
606*4882a593Smuzhiyun static const struct samsung_gate_clock ccore_gate_clks[] __initconst = {
607*4882a593Smuzhiyun 	GATE(PCLK_RTC, "pclk_rtc", "mout_aclk_ccore_133_user",
608*4882a593Smuzhiyun 		ENABLE_PCLK_CCORE, 8, 0, 0),
609*4882a593Smuzhiyun };
610*4882a593Smuzhiyun 
611*4882a593Smuzhiyun static const struct samsung_cmu_info ccore_cmu_info __initconst = {
612*4882a593Smuzhiyun 	.mux_clks		= ccore_mux_clks,
613*4882a593Smuzhiyun 	.nr_mux_clks		= ARRAY_SIZE(ccore_mux_clks),
614*4882a593Smuzhiyun 	.gate_clks		= ccore_gate_clks,
615*4882a593Smuzhiyun 	.nr_gate_clks		= ARRAY_SIZE(ccore_gate_clks),
616*4882a593Smuzhiyun 	.nr_clk_ids		= CCORE_NR_CLK,
617*4882a593Smuzhiyun 	.clk_regs		= ccore_clk_regs,
618*4882a593Smuzhiyun 	.nr_clk_regs		= ARRAY_SIZE(ccore_clk_regs),
619*4882a593Smuzhiyun };
620*4882a593Smuzhiyun 
exynos7_clk_ccore_init(struct device_node * np)621*4882a593Smuzhiyun static void __init exynos7_clk_ccore_init(struct device_node *np)
622*4882a593Smuzhiyun {
623*4882a593Smuzhiyun 	samsung_cmu_register_one(np, &ccore_cmu_info);
624*4882a593Smuzhiyun }
625*4882a593Smuzhiyun 
626*4882a593Smuzhiyun CLK_OF_DECLARE(exynos7_clk_ccore, "samsung,exynos7-clock-ccore",
627*4882a593Smuzhiyun 	exynos7_clk_ccore_init);
628*4882a593Smuzhiyun 
629*4882a593Smuzhiyun /* Register Offset definitions for CMU_PERIC0 (0x13610000) */
630*4882a593Smuzhiyun #define MUX_SEL_PERIC0			0x0200
631*4882a593Smuzhiyun #define ENABLE_PCLK_PERIC0		0x0900
632*4882a593Smuzhiyun #define ENABLE_SCLK_PERIC0		0x0A00
633*4882a593Smuzhiyun 
634*4882a593Smuzhiyun /* List of parent clocks for Muxes in CMU_PERIC0 */
635*4882a593Smuzhiyun PNAME(mout_aclk_peric0_66_user_p)	= { "fin_pll", "aclk_peric0_66" };
636*4882a593Smuzhiyun PNAME(mout_sclk_uart0_user_p)	= { "fin_pll", "sclk_uart0" };
637*4882a593Smuzhiyun 
638*4882a593Smuzhiyun static const unsigned long peric0_clk_regs[] __initconst = {
639*4882a593Smuzhiyun 	MUX_SEL_PERIC0,
640*4882a593Smuzhiyun 	ENABLE_PCLK_PERIC0,
641*4882a593Smuzhiyun 	ENABLE_SCLK_PERIC0,
642*4882a593Smuzhiyun };
643*4882a593Smuzhiyun 
644*4882a593Smuzhiyun static const struct samsung_mux_clock peric0_mux_clks[] __initconst = {
645*4882a593Smuzhiyun 	MUX(0, "mout_aclk_peric0_66_user", mout_aclk_peric0_66_user_p,
646*4882a593Smuzhiyun 		MUX_SEL_PERIC0, 0, 1),
647*4882a593Smuzhiyun 	MUX(0, "mout_sclk_uart0_user", mout_sclk_uart0_user_p,
648*4882a593Smuzhiyun 		MUX_SEL_PERIC0, 16, 1),
649*4882a593Smuzhiyun };
650*4882a593Smuzhiyun 
651*4882a593Smuzhiyun static const struct samsung_gate_clock peric0_gate_clks[] __initconst = {
652*4882a593Smuzhiyun 	GATE(PCLK_HSI2C0, "pclk_hsi2c0", "mout_aclk_peric0_66_user",
653*4882a593Smuzhiyun 		ENABLE_PCLK_PERIC0, 8, 0, 0),
654*4882a593Smuzhiyun 	GATE(PCLK_HSI2C1, "pclk_hsi2c1", "mout_aclk_peric0_66_user",
655*4882a593Smuzhiyun 		ENABLE_PCLK_PERIC0, 9, 0, 0),
656*4882a593Smuzhiyun 	GATE(PCLK_HSI2C4, "pclk_hsi2c4", "mout_aclk_peric0_66_user",
657*4882a593Smuzhiyun 		ENABLE_PCLK_PERIC0, 10, 0, 0),
658*4882a593Smuzhiyun 	GATE(PCLK_HSI2C5, "pclk_hsi2c5", "mout_aclk_peric0_66_user",
659*4882a593Smuzhiyun 		ENABLE_PCLK_PERIC0, 11, 0, 0),
660*4882a593Smuzhiyun 	GATE(PCLK_HSI2C9, "pclk_hsi2c9", "mout_aclk_peric0_66_user",
661*4882a593Smuzhiyun 		ENABLE_PCLK_PERIC0, 12, 0, 0),
662*4882a593Smuzhiyun 	GATE(PCLK_HSI2C10, "pclk_hsi2c10", "mout_aclk_peric0_66_user",
663*4882a593Smuzhiyun 		ENABLE_PCLK_PERIC0, 13, 0, 0),
664*4882a593Smuzhiyun 	GATE(PCLK_HSI2C11, "pclk_hsi2c11", "mout_aclk_peric0_66_user",
665*4882a593Smuzhiyun 		ENABLE_PCLK_PERIC0, 14, 0, 0),
666*4882a593Smuzhiyun 	GATE(PCLK_UART0, "pclk_uart0", "mout_aclk_peric0_66_user",
667*4882a593Smuzhiyun 		ENABLE_PCLK_PERIC0, 16, 0, 0),
668*4882a593Smuzhiyun 	GATE(PCLK_ADCIF, "pclk_adcif", "mout_aclk_peric0_66_user",
669*4882a593Smuzhiyun 		ENABLE_PCLK_PERIC0, 20, 0, 0),
670*4882a593Smuzhiyun 	GATE(PCLK_PWM, "pclk_pwm", "mout_aclk_peric0_66_user",
671*4882a593Smuzhiyun 		ENABLE_PCLK_PERIC0, 21, 0, 0),
672*4882a593Smuzhiyun 
673*4882a593Smuzhiyun 	GATE(SCLK_UART0, "sclk_uart0_user", "mout_sclk_uart0_user",
674*4882a593Smuzhiyun 		ENABLE_SCLK_PERIC0, 16, 0, 0),
675*4882a593Smuzhiyun 	GATE(SCLK_PWM, "sclk_pwm", "fin_pll", ENABLE_SCLK_PERIC0, 21, 0, 0),
676*4882a593Smuzhiyun };
677*4882a593Smuzhiyun 
678*4882a593Smuzhiyun static const struct samsung_cmu_info peric0_cmu_info __initconst = {
679*4882a593Smuzhiyun 	.mux_clks		= peric0_mux_clks,
680*4882a593Smuzhiyun 	.nr_mux_clks		= ARRAY_SIZE(peric0_mux_clks),
681*4882a593Smuzhiyun 	.gate_clks		= peric0_gate_clks,
682*4882a593Smuzhiyun 	.nr_gate_clks		= ARRAY_SIZE(peric0_gate_clks),
683*4882a593Smuzhiyun 	.nr_clk_ids		= PERIC0_NR_CLK,
684*4882a593Smuzhiyun 	.clk_regs		= peric0_clk_regs,
685*4882a593Smuzhiyun 	.nr_clk_regs		= ARRAY_SIZE(peric0_clk_regs),
686*4882a593Smuzhiyun };
687*4882a593Smuzhiyun 
exynos7_clk_peric0_init(struct device_node * np)688*4882a593Smuzhiyun static void __init exynos7_clk_peric0_init(struct device_node *np)
689*4882a593Smuzhiyun {
690*4882a593Smuzhiyun 	samsung_cmu_register_one(np, &peric0_cmu_info);
691*4882a593Smuzhiyun }
692*4882a593Smuzhiyun 
693*4882a593Smuzhiyun /* Register Offset definitions for CMU_PERIC1 (0x14C80000) */
694*4882a593Smuzhiyun #define MUX_SEL_PERIC10			0x0200
695*4882a593Smuzhiyun #define MUX_SEL_PERIC11			0x0204
696*4882a593Smuzhiyun #define MUX_SEL_PERIC12			0x0208
697*4882a593Smuzhiyun #define ENABLE_PCLK_PERIC1		0x0900
698*4882a593Smuzhiyun #define ENABLE_SCLK_PERIC10		0x0A00
699*4882a593Smuzhiyun 
700*4882a593Smuzhiyun CLK_OF_DECLARE(exynos7_clk_peric0, "samsung,exynos7-clock-peric0",
701*4882a593Smuzhiyun 	exynos7_clk_peric0_init);
702*4882a593Smuzhiyun 
703*4882a593Smuzhiyun /* List of parent clocks for Muxes in CMU_PERIC1 */
704*4882a593Smuzhiyun PNAME(mout_aclk_peric1_66_user_p)	= { "fin_pll", "aclk_peric1_66" };
705*4882a593Smuzhiyun PNAME(mout_sclk_uart1_user_p)	= { "fin_pll", "sclk_uart1" };
706*4882a593Smuzhiyun PNAME(mout_sclk_uart2_user_p)	= { "fin_pll", "sclk_uart2" };
707*4882a593Smuzhiyun PNAME(mout_sclk_uart3_user_p)	= { "fin_pll", "sclk_uart3" };
708*4882a593Smuzhiyun PNAME(mout_sclk_spi0_user_p)		= { "fin_pll", "sclk_spi0" };
709*4882a593Smuzhiyun PNAME(mout_sclk_spi1_user_p)		= { "fin_pll", "sclk_spi1" };
710*4882a593Smuzhiyun PNAME(mout_sclk_spi2_user_p)		= { "fin_pll", "sclk_spi2" };
711*4882a593Smuzhiyun PNAME(mout_sclk_spi3_user_p)		= { "fin_pll", "sclk_spi3" };
712*4882a593Smuzhiyun PNAME(mout_sclk_spi4_user_p)		= { "fin_pll", "sclk_spi4" };
713*4882a593Smuzhiyun 
714*4882a593Smuzhiyun static const unsigned long peric1_clk_regs[] __initconst = {
715*4882a593Smuzhiyun 	MUX_SEL_PERIC10,
716*4882a593Smuzhiyun 	MUX_SEL_PERIC11,
717*4882a593Smuzhiyun 	MUX_SEL_PERIC12,
718*4882a593Smuzhiyun 	ENABLE_PCLK_PERIC1,
719*4882a593Smuzhiyun 	ENABLE_SCLK_PERIC10,
720*4882a593Smuzhiyun };
721*4882a593Smuzhiyun 
722*4882a593Smuzhiyun static const struct samsung_mux_clock peric1_mux_clks[] __initconst = {
723*4882a593Smuzhiyun 	MUX(0, "mout_aclk_peric1_66_user", mout_aclk_peric1_66_user_p,
724*4882a593Smuzhiyun 		MUX_SEL_PERIC10, 0, 1),
725*4882a593Smuzhiyun 
726*4882a593Smuzhiyun 	MUX_F(0, "mout_sclk_spi0_user", mout_sclk_spi0_user_p,
727*4882a593Smuzhiyun 		MUX_SEL_PERIC11, 0, 1, CLK_SET_RATE_PARENT, 0),
728*4882a593Smuzhiyun 	MUX_F(0, "mout_sclk_spi1_user", mout_sclk_spi1_user_p,
729*4882a593Smuzhiyun 		MUX_SEL_PERIC11, 4, 1, CLK_SET_RATE_PARENT, 0),
730*4882a593Smuzhiyun 	MUX_F(0, "mout_sclk_spi2_user", mout_sclk_spi2_user_p,
731*4882a593Smuzhiyun 		MUX_SEL_PERIC11, 8, 1, CLK_SET_RATE_PARENT, 0),
732*4882a593Smuzhiyun 	MUX_F(0, "mout_sclk_spi3_user", mout_sclk_spi3_user_p,
733*4882a593Smuzhiyun 		MUX_SEL_PERIC11, 12, 1, CLK_SET_RATE_PARENT, 0),
734*4882a593Smuzhiyun 	MUX_F(0, "mout_sclk_spi4_user", mout_sclk_spi4_user_p,
735*4882a593Smuzhiyun 		MUX_SEL_PERIC11, 16, 1, CLK_SET_RATE_PARENT, 0),
736*4882a593Smuzhiyun 	MUX(0, "mout_sclk_uart1_user", mout_sclk_uart1_user_p,
737*4882a593Smuzhiyun 		MUX_SEL_PERIC11, 20, 1),
738*4882a593Smuzhiyun 	MUX(0, "mout_sclk_uart2_user", mout_sclk_uart2_user_p,
739*4882a593Smuzhiyun 		MUX_SEL_PERIC11, 24, 1),
740*4882a593Smuzhiyun 	MUX(0, "mout_sclk_uart3_user", mout_sclk_uart3_user_p,
741*4882a593Smuzhiyun 		MUX_SEL_PERIC11, 28, 1),
742*4882a593Smuzhiyun };
743*4882a593Smuzhiyun 
744*4882a593Smuzhiyun static const struct samsung_gate_clock peric1_gate_clks[] __initconst = {
745*4882a593Smuzhiyun 	GATE(PCLK_HSI2C2, "pclk_hsi2c2", "mout_aclk_peric1_66_user",
746*4882a593Smuzhiyun 		ENABLE_PCLK_PERIC1, 4, 0, 0),
747*4882a593Smuzhiyun 	GATE(PCLK_HSI2C3, "pclk_hsi2c3", "mout_aclk_peric1_66_user",
748*4882a593Smuzhiyun 		ENABLE_PCLK_PERIC1, 5, 0, 0),
749*4882a593Smuzhiyun 	GATE(PCLK_HSI2C6, "pclk_hsi2c6", "mout_aclk_peric1_66_user",
750*4882a593Smuzhiyun 		ENABLE_PCLK_PERIC1, 6, 0, 0),
751*4882a593Smuzhiyun 	GATE(PCLK_HSI2C7, "pclk_hsi2c7", "mout_aclk_peric1_66_user",
752*4882a593Smuzhiyun 		ENABLE_PCLK_PERIC1, 7, 0, 0),
753*4882a593Smuzhiyun 	GATE(PCLK_HSI2C8, "pclk_hsi2c8", "mout_aclk_peric1_66_user",
754*4882a593Smuzhiyun 		ENABLE_PCLK_PERIC1, 8, 0, 0),
755*4882a593Smuzhiyun 	GATE(PCLK_UART1, "pclk_uart1", "mout_aclk_peric1_66_user",
756*4882a593Smuzhiyun 		ENABLE_PCLK_PERIC1, 9, 0, 0),
757*4882a593Smuzhiyun 	GATE(PCLK_UART2, "pclk_uart2", "mout_aclk_peric1_66_user",
758*4882a593Smuzhiyun 		ENABLE_PCLK_PERIC1, 10, 0, 0),
759*4882a593Smuzhiyun 	GATE(PCLK_UART3, "pclk_uart3", "mout_aclk_peric1_66_user",
760*4882a593Smuzhiyun 		ENABLE_PCLK_PERIC1, 11, 0, 0),
761*4882a593Smuzhiyun 	GATE(PCLK_SPI0, "pclk_spi0", "mout_aclk_peric1_66_user",
762*4882a593Smuzhiyun 		ENABLE_PCLK_PERIC1, 12, 0, 0),
763*4882a593Smuzhiyun 	GATE(PCLK_SPI1, "pclk_spi1", "mout_aclk_peric1_66_user",
764*4882a593Smuzhiyun 		ENABLE_PCLK_PERIC1, 13, 0, 0),
765*4882a593Smuzhiyun 	GATE(PCLK_SPI2, "pclk_spi2", "mout_aclk_peric1_66_user",
766*4882a593Smuzhiyun 		ENABLE_PCLK_PERIC1, 14, 0, 0),
767*4882a593Smuzhiyun 	GATE(PCLK_SPI3, "pclk_spi3", "mout_aclk_peric1_66_user",
768*4882a593Smuzhiyun 		ENABLE_PCLK_PERIC1, 15, 0, 0),
769*4882a593Smuzhiyun 	GATE(PCLK_SPI4, "pclk_spi4", "mout_aclk_peric1_66_user",
770*4882a593Smuzhiyun 		ENABLE_PCLK_PERIC1, 16, 0, 0),
771*4882a593Smuzhiyun 	GATE(PCLK_I2S1, "pclk_i2s1", "mout_aclk_peric1_66_user",
772*4882a593Smuzhiyun 		ENABLE_PCLK_PERIC1, 17, CLK_SET_RATE_PARENT, 0),
773*4882a593Smuzhiyun 	GATE(PCLK_PCM1, "pclk_pcm1", "mout_aclk_peric1_66_user",
774*4882a593Smuzhiyun 		ENABLE_PCLK_PERIC1, 18, 0, 0),
775*4882a593Smuzhiyun 	GATE(PCLK_SPDIF, "pclk_spdif", "mout_aclk_peric1_66_user",
776*4882a593Smuzhiyun 		ENABLE_PCLK_PERIC1, 19, 0, 0),
777*4882a593Smuzhiyun 
778*4882a593Smuzhiyun 	GATE(SCLK_UART1, "sclk_uart1_user", "mout_sclk_uart1_user",
779*4882a593Smuzhiyun 		ENABLE_SCLK_PERIC10, 9, 0, 0),
780*4882a593Smuzhiyun 	GATE(SCLK_UART2, "sclk_uart2_user", "mout_sclk_uart2_user",
781*4882a593Smuzhiyun 		ENABLE_SCLK_PERIC10, 10, 0, 0),
782*4882a593Smuzhiyun 	GATE(SCLK_UART3, "sclk_uart3_user", "mout_sclk_uart3_user",
783*4882a593Smuzhiyun 		ENABLE_SCLK_PERIC10, 11, 0, 0),
784*4882a593Smuzhiyun 	GATE(SCLK_SPI0, "sclk_spi0_user", "mout_sclk_spi0_user",
785*4882a593Smuzhiyun 		ENABLE_SCLK_PERIC10, 12, CLK_SET_RATE_PARENT, 0),
786*4882a593Smuzhiyun 	GATE(SCLK_SPI1, "sclk_spi1_user", "mout_sclk_spi1_user",
787*4882a593Smuzhiyun 		ENABLE_SCLK_PERIC10, 13, CLK_SET_RATE_PARENT, 0),
788*4882a593Smuzhiyun 	GATE(SCLK_SPI2, "sclk_spi2_user", "mout_sclk_spi2_user",
789*4882a593Smuzhiyun 		ENABLE_SCLK_PERIC10, 14, CLK_SET_RATE_PARENT, 0),
790*4882a593Smuzhiyun 	GATE(SCLK_SPI3, "sclk_spi3_user", "mout_sclk_spi3_user",
791*4882a593Smuzhiyun 		ENABLE_SCLK_PERIC10, 15, CLK_SET_RATE_PARENT, 0),
792*4882a593Smuzhiyun 	GATE(SCLK_SPI4, "sclk_spi4_user", "mout_sclk_spi4_user",
793*4882a593Smuzhiyun 		ENABLE_SCLK_PERIC10, 16, CLK_SET_RATE_PARENT, 0),
794*4882a593Smuzhiyun 	GATE(SCLK_I2S1, "sclk_i2s1_user", "sclk_i2s1",
795*4882a593Smuzhiyun 		ENABLE_SCLK_PERIC10, 17, CLK_SET_RATE_PARENT, 0),
796*4882a593Smuzhiyun 	GATE(SCLK_PCM1, "sclk_pcm1_user", "sclk_pcm1",
797*4882a593Smuzhiyun 		ENABLE_SCLK_PERIC10, 18, CLK_SET_RATE_PARENT, 0),
798*4882a593Smuzhiyun 	GATE(SCLK_SPDIF, "sclk_spdif_user", "sclk_spdif",
799*4882a593Smuzhiyun 		ENABLE_SCLK_PERIC10, 19, CLK_SET_RATE_PARENT, 0),
800*4882a593Smuzhiyun };
801*4882a593Smuzhiyun 
802*4882a593Smuzhiyun static const struct samsung_cmu_info peric1_cmu_info __initconst = {
803*4882a593Smuzhiyun 	.mux_clks		= peric1_mux_clks,
804*4882a593Smuzhiyun 	.nr_mux_clks		= ARRAY_SIZE(peric1_mux_clks),
805*4882a593Smuzhiyun 	.gate_clks		= peric1_gate_clks,
806*4882a593Smuzhiyun 	.nr_gate_clks		= ARRAY_SIZE(peric1_gate_clks),
807*4882a593Smuzhiyun 	.nr_clk_ids		= PERIC1_NR_CLK,
808*4882a593Smuzhiyun 	.clk_regs		= peric1_clk_regs,
809*4882a593Smuzhiyun 	.nr_clk_regs		= ARRAY_SIZE(peric1_clk_regs),
810*4882a593Smuzhiyun };
811*4882a593Smuzhiyun 
exynos7_clk_peric1_init(struct device_node * np)812*4882a593Smuzhiyun static void __init exynos7_clk_peric1_init(struct device_node *np)
813*4882a593Smuzhiyun {
814*4882a593Smuzhiyun 	samsung_cmu_register_one(np, &peric1_cmu_info);
815*4882a593Smuzhiyun }
816*4882a593Smuzhiyun 
817*4882a593Smuzhiyun CLK_OF_DECLARE(exynos7_clk_peric1, "samsung,exynos7-clock-peric1",
818*4882a593Smuzhiyun 	exynos7_clk_peric1_init);
819*4882a593Smuzhiyun 
820*4882a593Smuzhiyun /* Register Offset definitions for CMU_PERIS (0x10040000) */
821*4882a593Smuzhiyun #define MUX_SEL_PERIS			0x0200
822*4882a593Smuzhiyun #define ENABLE_PCLK_PERIS		0x0900
823*4882a593Smuzhiyun #define ENABLE_PCLK_PERIS_SECURE_CHIPID	0x0910
824*4882a593Smuzhiyun #define ENABLE_SCLK_PERIS		0x0A00
825*4882a593Smuzhiyun #define ENABLE_SCLK_PERIS_SECURE_CHIPID	0x0A10
826*4882a593Smuzhiyun 
827*4882a593Smuzhiyun /* List of parent clocks for Muxes in CMU_PERIS */
828*4882a593Smuzhiyun PNAME(mout_aclk_peris_66_user_p) = { "fin_pll", "aclk_peris_66" };
829*4882a593Smuzhiyun 
830*4882a593Smuzhiyun static const unsigned long peris_clk_regs[] __initconst = {
831*4882a593Smuzhiyun 	MUX_SEL_PERIS,
832*4882a593Smuzhiyun 	ENABLE_PCLK_PERIS,
833*4882a593Smuzhiyun 	ENABLE_PCLK_PERIS_SECURE_CHIPID,
834*4882a593Smuzhiyun 	ENABLE_SCLK_PERIS,
835*4882a593Smuzhiyun 	ENABLE_SCLK_PERIS_SECURE_CHIPID,
836*4882a593Smuzhiyun };
837*4882a593Smuzhiyun 
838*4882a593Smuzhiyun static const struct samsung_mux_clock peris_mux_clks[] __initconst = {
839*4882a593Smuzhiyun 	MUX(0, "mout_aclk_peris_66_user",
840*4882a593Smuzhiyun 		mout_aclk_peris_66_user_p, MUX_SEL_PERIS, 0, 1),
841*4882a593Smuzhiyun };
842*4882a593Smuzhiyun 
843*4882a593Smuzhiyun static const struct samsung_gate_clock peris_gate_clks[] __initconst = {
844*4882a593Smuzhiyun 	GATE(PCLK_WDT, "pclk_wdt", "mout_aclk_peris_66_user",
845*4882a593Smuzhiyun 		ENABLE_PCLK_PERIS, 6, 0, 0),
846*4882a593Smuzhiyun 	GATE(PCLK_TMU, "pclk_tmu_apbif", "mout_aclk_peris_66_user",
847*4882a593Smuzhiyun 		ENABLE_PCLK_PERIS, 10, 0, 0),
848*4882a593Smuzhiyun 
849*4882a593Smuzhiyun 	GATE(PCLK_CHIPID, "pclk_chipid", "mout_aclk_peris_66_user",
850*4882a593Smuzhiyun 		ENABLE_PCLK_PERIS_SECURE_CHIPID, 0, 0, 0),
851*4882a593Smuzhiyun 	GATE(SCLK_CHIPID, "sclk_chipid", "fin_pll",
852*4882a593Smuzhiyun 		ENABLE_SCLK_PERIS_SECURE_CHIPID, 0, 0, 0),
853*4882a593Smuzhiyun 
854*4882a593Smuzhiyun 	GATE(SCLK_TMU, "sclk_tmu", "fin_pll", ENABLE_SCLK_PERIS, 10, 0, 0),
855*4882a593Smuzhiyun };
856*4882a593Smuzhiyun 
857*4882a593Smuzhiyun static const struct samsung_cmu_info peris_cmu_info __initconst = {
858*4882a593Smuzhiyun 	.mux_clks		= peris_mux_clks,
859*4882a593Smuzhiyun 	.nr_mux_clks		= ARRAY_SIZE(peris_mux_clks),
860*4882a593Smuzhiyun 	.gate_clks		= peris_gate_clks,
861*4882a593Smuzhiyun 	.nr_gate_clks		= ARRAY_SIZE(peris_gate_clks),
862*4882a593Smuzhiyun 	.nr_clk_ids		= PERIS_NR_CLK,
863*4882a593Smuzhiyun 	.clk_regs		= peris_clk_regs,
864*4882a593Smuzhiyun 	.nr_clk_regs		= ARRAY_SIZE(peris_clk_regs),
865*4882a593Smuzhiyun };
866*4882a593Smuzhiyun 
exynos7_clk_peris_init(struct device_node * np)867*4882a593Smuzhiyun static void __init exynos7_clk_peris_init(struct device_node *np)
868*4882a593Smuzhiyun {
869*4882a593Smuzhiyun 	samsung_cmu_register_one(np, &peris_cmu_info);
870*4882a593Smuzhiyun }
871*4882a593Smuzhiyun 
872*4882a593Smuzhiyun CLK_OF_DECLARE(exynos7_clk_peris, "samsung,exynos7-clock-peris",
873*4882a593Smuzhiyun 	exynos7_clk_peris_init);
874*4882a593Smuzhiyun 
875*4882a593Smuzhiyun /* Register Offset definitions for CMU_FSYS0 (0x10E90000) */
876*4882a593Smuzhiyun #define MUX_SEL_FSYS00			0x0200
877*4882a593Smuzhiyun #define MUX_SEL_FSYS01			0x0204
878*4882a593Smuzhiyun #define MUX_SEL_FSYS02			0x0208
879*4882a593Smuzhiyun #define ENABLE_ACLK_FSYS00		0x0800
880*4882a593Smuzhiyun #define ENABLE_ACLK_FSYS01		0x0804
881*4882a593Smuzhiyun #define ENABLE_SCLK_FSYS01		0x0A04
882*4882a593Smuzhiyun #define ENABLE_SCLK_FSYS02		0x0A08
883*4882a593Smuzhiyun #define ENABLE_SCLK_FSYS04		0x0A10
884*4882a593Smuzhiyun 
885*4882a593Smuzhiyun /*
886*4882a593Smuzhiyun  * List of parent clocks for Muxes in CMU_FSYS0
887*4882a593Smuzhiyun  */
888*4882a593Smuzhiyun PNAME(mout_aclk_fsys0_200_user_p)	= { "fin_pll", "aclk_fsys0_200" };
889*4882a593Smuzhiyun PNAME(mout_sclk_mmc2_user_p)		= { "fin_pll", "sclk_mmc2" };
890*4882a593Smuzhiyun 
891*4882a593Smuzhiyun PNAME(mout_sclk_usbdrd300_user_p)	= { "fin_pll", "sclk_usbdrd300" };
892*4882a593Smuzhiyun PNAME(mout_phyclk_usbdrd300_udrd30_phyclk_user_p)	= { "fin_pll",
893*4882a593Smuzhiyun 				"phyclk_usbdrd300_udrd30_phyclock" };
894*4882a593Smuzhiyun PNAME(mout_phyclk_usbdrd300_udrd30_pipe_pclk_user_p)	= { "fin_pll",
895*4882a593Smuzhiyun 				"phyclk_usbdrd300_udrd30_pipe_pclk" };
896*4882a593Smuzhiyun 
897*4882a593Smuzhiyun /* fixed rate clocks used in the FSYS0 block */
898*4882a593Smuzhiyun static const struct samsung_fixed_rate_clock fixed_rate_clks_fsys0[] __initconst = {
899*4882a593Smuzhiyun 	FRATE(0, "phyclk_usbdrd300_udrd30_phyclock", NULL, 0, 60000000),
900*4882a593Smuzhiyun 	FRATE(0, "phyclk_usbdrd300_udrd30_pipe_pclk", NULL, 0, 125000000),
901*4882a593Smuzhiyun };
902*4882a593Smuzhiyun 
903*4882a593Smuzhiyun static const unsigned long fsys0_clk_regs[] __initconst = {
904*4882a593Smuzhiyun 	MUX_SEL_FSYS00,
905*4882a593Smuzhiyun 	MUX_SEL_FSYS01,
906*4882a593Smuzhiyun 	MUX_SEL_FSYS02,
907*4882a593Smuzhiyun 	ENABLE_ACLK_FSYS00,
908*4882a593Smuzhiyun 	ENABLE_ACLK_FSYS01,
909*4882a593Smuzhiyun 	ENABLE_SCLK_FSYS01,
910*4882a593Smuzhiyun 	ENABLE_SCLK_FSYS02,
911*4882a593Smuzhiyun 	ENABLE_SCLK_FSYS04,
912*4882a593Smuzhiyun };
913*4882a593Smuzhiyun 
914*4882a593Smuzhiyun static const struct samsung_mux_clock fsys0_mux_clks[] __initconst = {
915*4882a593Smuzhiyun 	MUX(0, "mout_aclk_fsys0_200_user", mout_aclk_fsys0_200_user_p,
916*4882a593Smuzhiyun 		MUX_SEL_FSYS00, 24, 1),
917*4882a593Smuzhiyun 
918*4882a593Smuzhiyun 	MUX(0, "mout_sclk_mmc2_user", mout_sclk_mmc2_user_p,
919*4882a593Smuzhiyun 		MUX_SEL_FSYS01, 24, 1),
920*4882a593Smuzhiyun 	MUX(0, "mout_sclk_usbdrd300_user", mout_sclk_usbdrd300_user_p,
921*4882a593Smuzhiyun 		MUX_SEL_FSYS01, 28, 1),
922*4882a593Smuzhiyun 
923*4882a593Smuzhiyun 	MUX(0, "mout_phyclk_usbdrd300_udrd30_pipe_pclk_user",
924*4882a593Smuzhiyun 		mout_phyclk_usbdrd300_udrd30_pipe_pclk_user_p,
925*4882a593Smuzhiyun 		MUX_SEL_FSYS02, 24, 1),
926*4882a593Smuzhiyun 	MUX(0, "mout_phyclk_usbdrd300_udrd30_phyclk_user",
927*4882a593Smuzhiyun 		mout_phyclk_usbdrd300_udrd30_phyclk_user_p,
928*4882a593Smuzhiyun 		MUX_SEL_FSYS02, 28, 1),
929*4882a593Smuzhiyun };
930*4882a593Smuzhiyun 
931*4882a593Smuzhiyun static const struct samsung_gate_clock fsys0_gate_clks[] __initconst = {
932*4882a593Smuzhiyun 	GATE(ACLK_PDMA1, "aclk_pdma1", "mout_aclk_fsys0_200_user",
933*4882a593Smuzhiyun 			ENABLE_ACLK_FSYS00, 3, 0, 0),
934*4882a593Smuzhiyun 	GATE(ACLK_PDMA0, "aclk_pdma0", "mout_aclk_fsys0_200_user",
935*4882a593Smuzhiyun 			ENABLE_ACLK_FSYS00, 4, 0, 0),
936*4882a593Smuzhiyun 	GATE(ACLK_AXIUS_USBDRD30X_FSYS0X, "aclk_axius_usbdrd30x_fsys0x",
937*4882a593Smuzhiyun 		"mout_aclk_fsys0_200_user",
938*4882a593Smuzhiyun 		ENABLE_ACLK_FSYS00, 19, 0, 0),
939*4882a593Smuzhiyun 
940*4882a593Smuzhiyun 	GATE(ACLK_USBDRD300, "aclk_usbdrd300", "mout_aclk_fsys0_200_user",
941*4882a593Smuzhiyun 		ENABLE_ACLK_FSYS01, 29, 0, 0),
942*4882a593Smuzhiyun 	GATE(ACLK_MMC2, "aclk_mmc2", "mout_aclk_fsys0_200_user",
943*4882a593Smuzhiyun 		ENABLE_ACLK_FSYS01, 31, 0, 0),
944*4882a593Smuzhiyun 
945*4882a593Smuzhiyun 	GATE(SCLK_USBDRD300_SUSPENDCLK, "sclk_usbdrd300_suspendclk",
946*4882a593Smuzhiyun 		"mout_sclk_usbdrd300_user",
947*4882a593Smuzhiyun 		ENABLE_SCLK_FSYS01, 4, 0, 0),
948*4882a593Smuzhiyun 	GATE(SCLK_USBDRD300_REFCLK, "sclk_usbdrd300_refclk", "fin_pll",
949*4882a593Smuzhiyun 		ENABLE_SCLK_FSYS01, 8, 0, 0),
950*4882a593Smuzhiyun 
951*4882a593Smuzhiyun 	GATE(PHYCLK_USBDRD300_UDRD30_PIPE_PCLK_USER,
952*4882a593Smuzhiyun 		"phyclk_usbdrd300_udrd30_pipe_pclk_user",
953*4882a593Smuzhiyun 		"mout_phyclk_usbdrd300_udrd30_pipe_pclk_user",
954*4882a593Smuzhiyun 		ENABLE_SCLK_FSYS02, 24, 0, 0),
955*4882a593Smuzhiyun 	GATE(PHYCLK_USBDRD300_UDRD30_PHYCLK_USER,
956*4882a593Smuzhiyun 		"phyclk_usbdrd300_udrd30_phyclk_user",
957*4882a593Smuzhiyun 		"mout_phyclk_usbdrd300_udrd30_phyclk_user",
958*4882a593Smuzhiyun 		ENABLE_SCLK_FSYS02, 28, 0, 0),
959*4882a593Smuzhiyun 
960*4882a593Smuzhiyun 	GATE(OSCCLK_PHY_CLKOUT_USB30_PHY, "oscclk_phy_clkout_usb30_phy",
961*4882a593Smuzhiyun 		"fin_pll",
962*4882a593Smuzhiyun 		ENABLE_SCLK_FSYS04, 28, 0, 0),
963*4882a593Smuzhiyun };
964*4882a593Smuzhiyun 
965*4882a593Smuzhiyun static const struct samsung_cmu_info fsys0_cmu_info __initconst = {
966*4882a593Smuzhiyun 	.fixed_clks		= fixed_rate_clks_fsys0,
967*4882a593Smuzhiyun 	.nr_fixed_clks		= ARRAY_SIZE(fixed_rate_clks_fsys0),
968*4882a593Smuzhiyun 	.mux_clks		= fsys0_mux_clks,
969*4882a593Smuzhiyun 	.nr_mux_clks		= ARRAY_SIZE(fsys0_mux_clks),
970*4882a593Smuzhiyun 	.gate_clks		= fsys0_gate_clks,
971*4882a593Smuzhiyun 	.nr_gate_clks		= ARRAY_SIZE(fsys0_gate_clks),
972*4882a593Smuzhiyun 	.nr_clk_ids		= FSYS0_NR_CLK,
973*4882a593Smuzhiyun 	.clk_regs		= fsys0_clk_regs,
974*4882a593Smuzhiyun 	.nr_clk_regs		= ARRAY_SIZE(fsys0_clk_regs),
975*4882a593Smuzhiyun };
976*4882a593Smuzhiyun 
exynos7_clk_fsys0_init(struct device_node * np)977*4882a593Smuzhiyun static void __init exynos7_clk_fsys0_init(struct device_node *np)
978*4882a593Smuzhiyun {
979*4882a593Smuzhiyun 	samsung_cmu_register_one(np, &fsys0_cmu_info);
980*4882a593Smuzhiyun }
981*4882a593Smuzhiyun 
982*4882a593Smuzhiyun CLK_OF_DECLARE(exynos7_clk_fsys0, "samsung,exynos7-clock-fsys0",
983*4882a593Smuzhiyun 	exynos7_clk_fsys0_init);
984*4882a593Smuzhiyun 
985*4882a593Smuzhiyun /* Register Offset definitions for CMU_FSYS1 (0x156E0000) */
986*4882a593Smuzhiyun #define MUX_SEL_FSYS10			0x0200
987*4882a593Smuzhiyun #define MUX_SEL_FSYS11			0x0204
988*4882a593Smuzhiyun #define MUX_SEL_FSYS12			0x0208
989*4882a593Smuzhiyun #define DIV_FSYS1			0x0600
990*4882a593Smuzhiyun #define ENABLE_ACLK_FSYS1		0x0800
991*4882a593Smuzhiyun #define ENABLE_PCLK_FSYS1               0x0900
992*4882a593Smuzhiyun #define ENABLE_SCLK_FSYS11              0x0A04
993*4882a593Smuzhiyun #define ENABLE_SCLK_FSYS12              0x0A08
994*4882a593Smuzhiyun #define ENABLE_SCLK_FSYS13              0x0A0C
995*4882a593Smuzhiyun 
996*4882a593Smuzhiyun /*
997*4882a593Smuzhiyun  * List of parent clocks for Muxes in CMU_FSYS1
998*4882a593Smuzhiyun  */
999*4882a593Smuzhiyun PNAME(mout_aclk_fsys1_200_user_p)	= { "fin_pll", "aclk_fsys1_200" };
1000*4882a593Smuzhiyun PNAME(mout_fsys1_group_p)	= { "fin_pll", "fin_pll_26m",
1001*4882a593Smuzhiyun 				"sclk_phy_fsys1_26m" };
1002*4882a593Smuzhiyun PNAME(mout_sclk_mmc0_user_p)		= { "fin_pll", "sclk_mmc0" };
1003*4882a593Smuzhiyun PNAME(mout_sclk_mmc1_user_p)		= { "fin_pll", "sclk_mmc1" };
1004*4882a593Smuzhiyun PNAME(mout_sclk_ufsunipro20_user_p)  = { "fin_pll", "sclk_ufsunipro20" };
1005*4882a593Smuzhiyun PNAME(mout_phyclk_ufs20_tx0_user_p) = { "fin_pll", "phyclk_ufs20_tx0_symbol" };
1006*4882a593Smuzhiyun PNAME(mout_phyclk_ufs20_rx0_user_p) = { "fin_pll", "phyclk_ufs20_rx0_symbol" };
1007*4882a593Smuzhiyun PNAME(mout_phyclk_ufs20_rx1_user_p) = { "fin_pll", "phyclk_ufs20_rx1_symbol" };
1008*4882a593Smuzhiyun 
1009*4882a593Smuzhiyun /* fixed rate clocks used in the FSYS1 block */
1010*4882a593Smuzhiyun static const struct samsung_fixed_rate_clock fixed_rate_clks_fsys1[] __initconst = {
1011*4882a593Smuzhiyun 	FRATE(PHYCLK_UFS20_TX0_SYMBOL, "phyclk_ufs20_tx0_symbol", NULL,
1012*4882a593Smuzhiyun 			0, 300000000),
1013*4882a593Smuzhiyun 	FRATE(PHYCLK_UFS20_RX0_SYMBOL, "phyclk_ufs20_rx0_symbol", NULL,
1014*4882a593Smuzhiyun 			0, 300000000),
1015*4882a593Smuzhiyun 	FRATE(PHYCLK_UFS20_RX1_SYMBOL, "phyclk_ufs20_rx1_symbol", NULL,
1016*4882a593Smuzhiyun 			0, 300000000),
1017*4882a593Smuzhiyun };
1018*4882a593Smuzhiyun 
1019*4882a593Smuzhiyun static const unsigned long fsys1_clk_regs[] __initconst = {
1020*4882a593Smuzhiyun 	MUX_SEL_FSYS10,
1021*4882a593Smuzhiyun 	MUX_SEL_FSYS11,
1022*4882a593Smuzhiyun 	MUX_SEL_FSYS12,
1023*4882a593Smuzhiyun 	DIV_FSYS1,
1024*4882a593Smuzhiyun 	ENABLE_ACLK_FSYS1,
1025*4882a593Smuzhiyun 	ENABLE_PCLK_FSYS1,
1026*4882a593Smuzhiyun 	ENABLE_SCLK_FSYS11,
1027*4882a593Smuzhiyun 	ENABLE_SCLK_FSYS12,
1028*4882a593Smuzhiyun 	ENABLE_SCLK_FSYS13,
1029*4882a593Smuzhiyun };
1030*4882a593Smuzhiyun 
1031*4882a593Smuzhiyun static const struct samsung_mux_clock fsys1_mux_clks[] __initconst = {
1032*4882a593Smuzhiyun 	MUX(MOUT_FSYS1_PHYCLK_SEL1, "mout_fsys1_phyclk_sel1",
1033*4882a593Smuzhiyun 		mout_fsys1_group_p, MUX_SEL_FSYS10, 16, 2),
1034*4882a593Smuzhiyun 	MUX(0, "mout_fsys1_phyclk_sel0", mout_fsys1_group_p,
1035*4882a593Smuzhiyun 		 MUX_SEL_FSYS10, 20, 2),
1036*4882a593Smuzhiyun 	MUX(0, "mout_aclk_fsys1_200_user", mout_aclk_fsys1_200_user_p,
1037*4882a593Smuzhiyun 		MUX_SEL_FSYS10, 28, 1),
1038*4882a593Smuzhiyun 
1039*4882a593Smuzhiyun 	MUX(0, "mout_sclk_mmc1_user", mout_sclk_mmc1_user_p,
1040*4882a593Smuzhiyun 		MUX_SEL_FSYS11, 24, 1),
1041*4882a593Smuzhiyun 	MUX(0, "mout_sclk_mmc0_user", mout_sclk_mmc0_user_p,
1042*4882a593Smuzhiyun 		MUX_SEL_FSYS11, 28, 1),
1043*4882a593Smuzhiyun 	MUX(0, "mout_sclk_ufsunipro20_user", mout_sclk_ufsunipro20_user_p,
1044*4882a593Smuzhiyun 		MUX_SEL_FSYS11, 20, 1),
1045*4882a593Smuzhiyun 
1046*4882a593Smuzhiyun 	MUX(0, "mout_phyclk_ufs20_rx1_symbol_user",
1047*4882a593Smuzhiyun 		mout_phyclk_ufs20_rx1_user_p, MUX_SEL_FSYS12, 16, 1),
1048*4882a593Smuzhiyun 	MUX(0, "mout_phyclk_ufs20_rx0_symbol_user",
1049*4882a593Smuzhiyun 		mout_phyclk_ufs20_rx0_user_p, MUX_SEL_FSYS12, 24, 1),
1050*4882a593Smuzhiyun 	MUX(0, "mout_phyclk_ufs20_tx0_symbol_user",
1051*4882a593Smuzhiyun 		mout_phyclk_ufs20_tx0_user_p, MUX_SEL_FSYS12, 28, 1),
1052*4882a593Smuzhiyun };
1053*4882a593Smuzhiyun 
1054*4882a593Smuzhiyun static const struct samsung_div_clock fsys1_div_clks[] __initconst = {
1055*4882a593Smuzhiyun 	DIV(DOUT_PCLK_FSYS1, "dout_pclk_fsys1", "mout_aclk_fsys1_200_user",
1056*4882a593Smuzhiyun 		DIV_FSYS1, 0, 2),
1057*4882a593Smuzhiyun };
1058*4882a593Smuzhiyun 
1059*4882a593Smuzhiyun static const struct samsung_gate_clock fsys1_gate_clks[] __initconst = {
1060*4882a593Smuzhiyun 	GATE(SCLK_UFSUNIPRO20_USER, "sclk_ufsunipro20_user",
1061*4882a593Smuzhiyun 		"mout_sclk_ufsunipro20_user",
1062*4882a593Smuzhiyun 		ENABLE_SCLK_FSYS11, 20, 0, 0),
1063*4882a593Smuzhiyun 
1064*4882a593Smuzhiyun 	GATE(ACLK_MMC1, "aclk_mmc1", "mout_aclk_fsys1_200_user",
1065*4882a593Smuzhiyun 		ENABLE_ACLK_FSYS1, 29, 0, 0),
1066*4882a593Smuzhiyun 	GATE(ACLK_MMC0, "aclk_mmc0", "mout_aclk_fsys1_200_user",
1067*4882a593Smuzhiyun 		ENABLE_ACLK_FSYS1, 30, 0, 0),
1068*4882a593Smuzhiyun 
1069*4882a593Smuzhiyun 	GATE(ACLK_UFS20_LINK, "aclk_ufs20_link", "dout_pclk_fsys1",
1070*4882a593Smuzhiyun 		ENABLE_ACLK_FSYS1, 31, 0, 0),
1071*4882a593Smuzhiyun 	GATE(PCLK_GPIO_FSYS1, "pclk_gpio_fsys1", "mout_aclk_fsys1_200_user",
1072*4882a593Smuzhiyun 		ENABLE_PCLK_FSYS1, 30, 0, 0),
1073*4882a593Smuzhiyun 
1074*4882a593Smuzhiyun 	GATE(PHYCLK_UFS20_RX1_SYMBOL_USER, "phyclk_ufs20_rx1_symbol_user",
1075*4882a593Smuzhiyun 		"mout_phyclk_ufs20_rx1_symbol_user",
1076*4882a593Smuzhiyun 		ENABLE_SCLK_FSYS12, 16, 0, 0),
1077*4882a593Smuzhiyun 	GATE(PHYCLK_UFS20_RX0_SYMBOL_USER, "phyclk_ufs20_rx0_symbol_user",
1078*4882a593Smuzhiyun 		"mout_phyclk_ufs20_rx0_symbol_user",
1079*4882a593Smuzhiyun 		ENABLE_SCLK_FSYS12, 24, 0, 0),
1080*4882a593Smuzhiyun 	GATE(PHYCLK_UFS20_TX0_SYMBOL_USER, "phyclk_ufs20_tx0_symbol_user",
1081*4882a593Smuzhiyun 		"mout_phyclk_ufs20_tx0_symbol_user",
1082*4882a593Smuzhiyun 		ENABLE_SCLK_FSYS12, 28, 0, 0),
1083*4882a593Smuzhiyun 
1084*4882a593Smuzhiyun 	GATE(OSCCLK_PHY_CLKOUT_EMBEDDED_COMBO_PHY,
1085*4882a593Smuzhiyun 		"oscclk_phy_clkout_embedded_combo_phy",
1086*4882a593Smuzhiyun 		"fin_pll",
1087*4882a593Smuzhiyun 		ENABLE_SCLK_FSYS12, 4, CLK_IGNORE_UNUSED, 0),
1088*4882a593Smuzhiyun 
1089*4882a593Smuzhiyun 	GATE(SCLK_COMBO_PHY_EMBEDDED_26M, "sclk_combo_phy_embedded_26m",
1090*4882a593Smuzhiyun 		"mout_fsys1_phyclk_sel1",
1091*4882a593Smuzhiyun 		ENABLE_SCLK_FSYS13, 24, CLK_IGNORE_UNUSED, 0),
1092*4882a593Smuzhiyun };
1093*4882a593Smuzhiyun 
1094*4882a593Smuzhiyun static const struct samsung_cmu_info fsys1_cmu_info __initconst = {
1095*4882a593Smuzhiyun 	.fixed_clks		= fixed_rate_clks_fsys1,
1096*4882a593Smuzhiyun 	.nr_fixed_clks		= ARRAY_SIZE(fixed_rate_clks_fsys1),
1097*4882a593Smuzhiyun 	.mux_clks		= fsys1_mux_clks,
1098*4882a593Smuzhiyun 	.nr_mux_clks		= ARRAY_SIZE(fsys1_mux_clks),
1099*4882a593Smuzhiyun 	.div_clks		= fsys1_div_clks,
1100*4882a593Smuzhiyun 	.nr_div_clks		= ARRAY_SIZE(fsys1_div_clks),
1101*4882a593Smuzhiyun 	.gate_clks		= fsys1_gate_clks,
1102*4882a593Smuzhiyun 	.nr_gate_clks		= ARRAY_SIZE(fsys1_gate_clks),
1103*4882a593Smuzhiyun 	.nr_clk_ids		= FSYS1_NR_CLK,
1104*4882a593Smuzhiyun 	.clk_regs		= fsys1_clk_regs,
1105*4882a593Smuzhiyun 	.nr_clk_regs		= ARRAY_SIZE(fsys1_clk_regs),
1106*4882a593Smuzhiyun };
1107*4882a593Smuzhiyun 
exynos7_clk_fsys1_init(struct device_node * np)1108*4882a593Smuzhiyun static void __init exynos7_clk_fsys1_init(struct device_node *np)
1109*4882a593Smuzhiyun {
1110*4882a593Smuzhiyun 	samsung_cmu_register_one(np, &fsys1_cmu_info);
1111*4882a593Smuzhiyun }
1112*4882a593Smuzhiyun 
1113*4882a593Smuzhiyun CLK_OF_DECLARE(exynos7_clk_fsys1, "samsung,exynos7-clock-fsys1",
1114*4882a593Smuzhiyun 	exynos7_clk_fsys1_init);
1115*4882a593Smuzhiyun 
1116*4882a593Smuzhiyun #define MUX_SEL_MSCL			0x0200
1117*4882a593Smuzhiyun #define DIV_MSCL			0x0600
1118*4882a593Smuzhiyun #define ENABLE_ACLK_MSCL		0x0800
1119*4882a593Smuzhiyun #define ENABLE_PCLK_MSCL		0x0900
1120*4882a593Smuzhiyun 
1121*4882a593Smuzhiyun /* List of parent clocks for Muxes in CMU_MSCL */
1122*4882a593Smuzhiyun PNAME(mout_aclk_mscl_532_user_p)	= { "fin_pll", "aclk_mscl_532" };
1123*4882a593Smuzhiyun 
1124*4882a593Smuzhiyun static const unsigned long mscl_clk_regs[] __initconst = {
1125*4882a593Smuzhiyun 	MUX_SEL_MSCL,
1126*4882a593Smuzhiyun 	DIV_MSCL,
1127*4882a593Smuzhiyun 	ENABLE_ACLK_MSCL,
1128*4882a593Smuzhiyun 	ENABLE_PCLK_MSCL,
1129*4882a593Smuzhiyun };
1130*4882a593Smuzhiyun 
1131*4882a593Smuzhiyun static const struct samsung_mux_clock mscl_mux_clks[] __initconst = {
1132*4882a593Smuzhiyun 	MUX(USERMUX_ACLK_MSCL_532, "usermux_aclk_mscl_532",
1133*4882a593Smuzhiyun 		mout_aclk_mscl_532_user_p, MUX_SEL_MSCL, 0, 1),
1134*4882a593Smuzhiyun };
1135*4882a593Smuzhiyun static const struct samsung_div_clock mscl_div_clks[] __initconst = {
1136*4882a593Smuzhiyun 	DIV(DOUT_PCLK_MSCL, "dout_pclk_mscl", "usermux_aclk_mscl_532",
1137*4882a593Smuzhiyun 			DIV_MSCL, 0, 3),
1138*4882a593Smuzhiyun };
1139*4882a593Smuzhiyun static const struct samsung_gate_clock mscl_gate_clks[] __initconst = {
1140*4882a593Smuzhiyun 
1141*4882a593Smuzhiyun 	GATE(ACLK_MSCL_0, "aclk_mscl_0", "usermux_aclk_mscl_532",
1142*4882a593Smuzhiyun 			ENABLE_ACLK_MSCL, 31, 0, 0),
1143*4882a593Smuzhiyun 	GATE(ACLK_MSCL_1, "aclk_mscl_1", "usermux_aclk_mscl_532",
1144*4882a593Smuzhiyun 			ENABLE_ACLK_MSCL, 30, 0, 0),
1145*4882a593Smuzhiyun 	GATE(ACLK_JPEG, "aclk_jpeg", "usermux_aclk_mscl_532",
1146*4882a593Smuzhiyun 			ENABLE_ACLK_MSCL, 29, 0, 0),
1147*4882a593Smuzhiyun 	GATE(ACLK_G2D, "aclk_g2d", "usermux_aclk_mscl_532",
1148*4882a593Smuzhiyun 			ENABLE_ACLK_MSCL, 28, 0, 0),
1149*4882a593Smuzhiyun 	GATE(ACLK_LH_ASYNC_SI_MSCL_0, "aclk_lh_async_si_mscl_0",
1150*4882a593Smuzhiyun 			"usermux_aclk_mscl_532",
1151*4882a593Smuzhiyun 			ENABLE_ACLK_MSCL, 27, 0, 0),
1152*4882a593Smuzhiyun 	GATE(ACLK_LH_ASYNC_SI_MSCL_1, "aclk_lh_async_si_mscl_1",
1153*4882a593Smuzhiyun 			"usermux_aclk_mscl_532",
1154*4882a593Smuzhiyun 			ENABLE_ACLK_MSCL, 26, 0, 0),
1155*4882a593Smuzhiyun 	GATE(ACLK_XIU_MSCLX_0, "aclk_xiu_msclx_0", "usermux_aclk_mscl_532",
1156*4882a593Smuzhiyun 			ENABLE_ACLK_MSCL, 25, 0, 0),
1157*4882a593Smuzhiyun 	GATE(ACLK_XIU_MSCLX_1, "aclk_xiu_msclx_1", "usermux_aclk_mscl_532",
1158*4882a593Smuzhiyun 			ENABLE_ACLK_MSCL, 24, 0, 0),
1159*4882a593Smuzhiyun 	GATE(ACLK_AXI2ACEL_BRIDGE, "aclk_axi2acel_bridge",
1160*4882a593Smuzhiyun 			"usermux_aclk_mscl_532",
1161*4882a593Smuzhiyun 			ENABLE_ACLK_MSCL, 23, 0, 0),
1162*4882a593Smuzhiyun 	GATE(ACLK_QE_MSCL_0, "aclk_qe_mscl_0", "usermux_aclk_mscl_532",
1163*4882a593Smuzhiyun 			ENABLE_ACLK_MSCL, 22, 0, 0),
1164*4882a593Smuzhiyun 	GATE(ACLK_QE_MSCL_1, "aclk_qe_mscl_1", "usermux_aclk_mscl_532",
1165*4882a593Smuzhiyun 			ENABLE_ACLK_MSCL, 21, 0, 0),
1166*4882a593Smuzhiyun 	GATE(ACLK_QE_JPEG, "aclk_qe_jpeg", "usermux_aclk_mscl_532",
1167*4882a593Smuzhiyun 			ENABLE_ACLK_MSCL, 20, 0, 0),
1168*4882a593Smuzhiyun 	GATE(ACLK_QE_G2D, "aclk_qe_g2d", "usermux_aclk_mscl_532",
1169*4882a593Smuzhiyun 			ENABLE_ACLK_MSCL, 19, 0, 0),
1170*4882a593Smuzhiyun 	GATE(ACLK_PPMU_MSCL_0, "aclk_ppmu_mscl_0", "usermux_aclk_mscl_532",
1171*4882a593Smuzhiyun 			ENABLE_ACLK_MSCL, 18, 0, 0),
1172*4882a593Smuzhiyun 	GATE(ACLK_PPMU_MSCL_1, "aclk_ppmu_mscl_1", "usermux_aclk_mscl_532",
1173*4882a593Smuzhiyun 			ENABLE_ACLK_MSCL, 17, 0, 0),
1174*4882a593Smuzhiyun 	GATE(ACLK_MSCLNP_133, "aclk_msclnp_133", "usermux_aclk_mscl_532",
1175*4882a593Smuzhiyun 			ENABLE_ACLK_MSCL, 16, 0, 0),
1176*4882a593Smuzhiyun 	GATE(ACLK_AHB2APB_MSCL0P, "aclk_ahb2apb_mscl0p",
1177*4882a593Smuzhiyun 			"usermux_aclk_mscl_532",
1178*4882a593Smuzhiyun 			ENABLE_ACLK_MSCL, 15, 0, 0),
1179*4882a593Smuzhiyun 	GATE(ACLK_AHB2APB_MSCL1P, "aclk_ahb2apb_mscl1p",
1180*4882a593Smuzhiyun 			"usermux_aclk_mscl_532",
1181*4882a593Smuzhiyun 			ENABLE_ACLK_MSCL, 14, 0, 0),
1182*4882a593Smuzhiyun 
1183*4882a593Smuzhiyun 	GATE(PCLK_MSCL_0, "pclk_mscl_0", "dout_pclk_mscl",
1184*4882a593Smuzhiyun 			ENABLE_PCLK_MSCL, 31, 0, 0),
1185*4882a593Smuzhiyun 	GATE(PCLK_MSCL_1, "pclk_mscl_1", "dout_pclk_mscl",
1186*4882a593Smuzhiyun 			ENABLE_PCLK_MSCL, 30, 0, 0),
1187*4882a593Smuzhiyun 	GATE(PCLK_JPEG, "pclk_jpeg", "dout_pclk_mscl",
1188*4882a593Smuzhiyun 			ENABLE_PCLK_MSCL, 29, 0, 0),
1189*4882a593Smuzhiyun 	GATE(PCLK_G2D, "pclk_g2d", "dout_pclk_mscl",
1190*4882a593Smuzhiyun 			ENABLE_PCLK_MSCL, 28, 0, 0),
1191*4882a593Smuzhiyun 	GATE(PCLK_QE_MSCL_0, "pclk_qe_mscl_0", "dout_pclk_mscl",
1192*4882a593Smuzhiyun 			ENABLE_PCLK_MSCL, 27, 0, 0),
1193*4882a593Smuzhiyun 	GATE(PCLK_QE_MSCL_1, "pclk_qe_mscl_1", "dout_pclk_mscl",
1194*4882a593Smuzhiyun 			ENABLE_PCLK_MSCL, 26, 0, 0),
1195*4882a593Smuzhiyun 	GATE(PCLK_QE_JPEG, "pclk_qe_jpeg", "dout_pclk_mscl",
1196*4882a593Smuzhiyun 			ENABLE_PCLK_MSCL, 25, 0, 0),
1197*4882a593Smuzhiyun 	GATE(PCLK_QE_G2D, "pclk_qe_g2d", "dout_pclk_mscl",
1198*4882a593Smuzhiyun 			ENABLE_PCLK_MSCL, 24, 0, 0),
1199*4882a593Smuzhiyun 	GATE(PCLK_PPMU_MSCL_0, "pclk_ppmu_mscl_0", "dout_pclk_mscl",
1200*4882a593Smuzhiyun 			ENABLE_PCLK_MSCL, 23, 0, 0),
1201*4882a593Smuzhiyun 	GATE(PCLK_PPMU_MSCL_1, "pclk_ppmu_mscl_1", "dout_pclk_mscl",
1202*4882a593Smuzhiyun 			ENABLE_PCLK_MSCL, 22, 0, 0),
1203*4882a593Smuzhiyun 	GATE(PCLK_AXI2ACEL_BRIDGE, "pclk_axi2acel_bridge", "dout_pclk_mscl",
1204*4882a593Smuzhiyun 			ENABLE_PCLK_MSCL, 21, 0, 0),
1205*4882a593Smuzhiyun 	GATE(PCLK_PMU_MSCL, "pclk_pmu_mscl", "dout_pclk_mscl",
1206*4882a593Smuzhiyun 			ENABLE_PCLK_MSCL, 20, 0, 0),
1207*4882a593Smuzhiyun };
1208*4882a593Smuzhiyun 
1209*4882a593Smuzhiyun static const struct samsung_cmu_info mscl_cmu_info __initconst = {
1210*4882a593Smuzhiyun 	.mux_clks		= mscl_mux_clks,
1211*4882a593Smuzhiyun 	.nr_mux_clks		= ARRAY_SIZE(mscl_mux_clks),
1212*4882a593Smuzhiyun 	.div_clks		= mscl_div_clks,
1213*4882a593Smuzhiyun 	.nr_div_clks		= ARRAY_SIZE(mscl_div_clks),
1214*4882a593Smuzhiyun 	.gate_clks		= mscl_gate_clks,
1215*4882a593Smuzhiyun 	.nr_gate_clks		= ARRAY_SIZE(mscl_gate_clks),
1216*4882a593Smuzhiyun 	.nr_clk_ids		= MSCL_NR_CLK,
1217*4882a593Smuzhiyun 	.clk_regs		= mscl_clk_regs,
1218*4882a593Smuzhiyun 	.nr_clk_regs		= ARRAY_SIZE(mscl_clk_regs),
1219*4882a593Smuzhiyun };
1220*4882a593Smuzhiyun 
exynos7_clk_mscl_init(struct device_node * np)1221*4882a593Smuzhiyun static void __init exynos7_clk_mscl_init(struct device_node *np)
1222*4882a593Smuzhiyun {
1223*4882a593Smuzhiyun 	samsung_cmu_register_one(np, &mscl_cmu_info);
1224*4882a593Smuzhiyun }
1225*4882a593Smuzhiyun 
1226*4882a593Smuzhiyun CLK_OF_DECLARE(exynos7_clk_mscl, "samsung,exynos7-clock-mscl",
1227*4882a593Smuzhiyun 		exynos7_clk_mscl_init);
1228*4882a593Smuzhiyun 
1229*4882a593Smuzhiyun /* Register Offset definitions for CMU_AUD (0x114C0000) */
1230*4882a593Smuzhiyun #define	MUX_SEL_AUD			0x0200
1231*4882a593Smuzhiyun #define	DIV_AUD0			0x0600
1232*4882a593Smuzhiyun #define	DIV_AUD1			0x0604
1233*4882a593Smuzhiyun #define	ENABLE_ACLK_AUD			0x0800
1234*4882a593Smuzhiyun #define	ENABLE_PCLK_AUD			0x0900
1235*4882a593Smuzhiyun #define	ENABLE_SCLK_AUD			0x0A00
1236*4882a593Smuzhiyun 
1237*4882a593Smuzhiyun /*
1238*4882a593Smuzhiyun  * List of parent clocks for Muxes in CMU_AUD
1239*4882a593Smuzhiyun  */
1240*4882a593Smuzhiyun PNAME(mout_aud_pll_user_p) = { "fin_pll", "fout_aud_pll" };
1241*4882a593Smuzhiyun PNAME(mout_aud_group_p) = { "dout_aud_cdclk", "ioclk_audiocdclk0" };
1242*4882a593Smuzhiyun 
1243*4882a593Smuzhiyun static const unsigned long aud_clk_regs[] __initconst = {
1244*4882a593Smuzhiyun 	MUX_SEL_AUD,
1245*4882a593Smuzhiyun 	DIV_AUD0,
1246*4882a593Smuzhiyun 	DIV_AUD1,
1247*4882a593Smuzhiyun 	ENABLE_ACLK_AUD,
1248*4882a593Smuzhiyun 	ENABLE_PCLK_AUD,
1249*4882a593Smuzhiyun 	ENABLE_SCLK_AUD,
1250*4882a593Smuzhiyun };
1251*4882a593Smuzhiyun 
1252*4882a593Smuzhiyun static const struct samsung_mux_clock aud_mux_clks[] __initconst = {
1253*4882a593Smuzhiyun 	MUX(0, "mout_sclk_i2s", mout_aud_group_p, MUX_SEL_AUD, 12, 1),
1254*4882a593Smuzhiyun 	MUX(0, "mout_sclk_pcm", mout_aud_group_p, MUX_SEL_AUD, 16, 1),
1255*4882a593Smuzhiyun 	MUX(0, "mout_aud_pll_user", mout_aud_pll_user_p, MUX_SEL_AUD, 20, 1),
1256*4882a593Smuzhiyun };
1257*4882a593Smuzhiyun 
1258*4882a593Smuzhiyun static const struct samsung_div_clock aud_div_clks[] __initconst = {
1259*4882a593Smuzhiyun 	DIV(0, "dout_aud_ca5", "mout_aud_pll_user", DIV_AUD0, 0, 4),
1260*4882a593Smuzhiyun 	DIV(0, "dout_aclk_aud", "dout_aud_ca5", DIV_AUD0, 4, 4),
1261*4882a593Smuzhiyun 	DIV(0, "dout_aud_pclk_dbg", "dout_aud_ca5", DIV_AUD0, 8, 4),
1262*4882a593Smuzhiyun 
1263*4882a593Smuzhiyun 	DIV(0, "dout_sclk_i2s", "mout_sclk_i2s", DIV_AUD1, 0, 4),
1264*4882a593Smuzhiyun 	DIV(0, "dout_sclk_pcm", "mout_sclk_pcm", DIV_AUD1, 4, 8),
1265*4882a593Smuzhiyun 	DIV(0, "dout_sclk_uart", "dout_aud_cdclk", DIV_AUD1, 12, 4),
1266*4882a593Smuzhiyun 	DIV(0, "dout_sclk_slimbus", "dout_aud_cdclk", DIV_AUD1, 16, 5),
1267*4882a593Smuzhiyun 	DIV(0, "dout_aud_cdclk", "mout_aud_pll_user", DIV_AUD1, 24, 4),
1268*4882a593Smuzhiyun };
1269*4882a593Smuzhiyun 
1270*4882a593Smuzhiyun static const struct samsung_gate_clock aud_gate_clks[] __initconst = {
1271*4882a593Smuzhiyun 	GATE(SCLK_PCM, "sclk_pcm", "dout_sclk_pcm",
1272*4882a593Smuzhiyun 			ENABLE_SCLK_AUD, 27, CLK_SET_RATE_PARENT, 0),
1273*4882a593Smuzhiyun 	GATE(SCLK_I2S, "sclk_i2s", "dout_sclk_i2s",
1274*4882a593Smuzhiyun 			ENABLE_SCLK_AUD, 28, CLK_SET_RATE_PARENT, 0),
1275*4882a593Smuzhiyun 	GATE(0, "sclk_uart", "dout_sclk_uart", ENABLE_SCLK_AUD, 29, 0, 0),
1276*4882a593Smuzhiyun 	GATE(0, "sclk_slimbus", "dout_sclk_slimbus",
1277*4882a593Smuzhiyun 			ENABLE_SCLK_AUD, 30, 0, 0),
1278*4882a593Smuzhiyun 
1279*4882a593Smuzhiyun 	GATE(0, "pclk_dbg_aud", "dout_aud_pclk_dbg", ENABLE_PCLK_AUD, 19, 0, 0),
1280*4882a593Smuzhiyun 	GATE(0, "pclk_gpio_aud", "dout_aclk_aud", ENABLE_PCLK_AUD, 20, 0, 0),
1281*4882a593Smuzhiyun 	GATE(0, "pclk_wdt1", "dout_aclk_aud", ENABLE_PCLK_AUD, 22, 0, 0),
1282*4882a593Smuzhiyun 	GATE(0, "pclk_wdt0", "dout_aclk_aud", ENABLE_PCLK_AUD, 23, 0, 0),
1283*4882a593Smuzhiyun 	GATE(0, "pclk_slimbus", "dout_aclk_aud", ENABLE_PCLK_AUD, 24, 0, 0),
1284*4882a593Smuzhiyun 	GATE(0, "pclk_uart", "dout_aclk_aud", ENABLE_PCLK_AUD, 25, 0, 0),
1285*4882a593Smuzhiyun 	GATE(PCLK_PCM, "pclk_pcm", "dout_aclk_aud",
1286*4882a593Smuzhiyun 			ENABLE_PCLK_AUD, 26, CLK_SET_RATE_PARENT, 0),
1287*4882a593Smuzhiyun 	GATE(PCLK_I2S, "pclk_i2s", "dout_aclk_aud",
1288*4882a593Smuzhiyun 			ENABLE_PCLK_AUD, 27, CLK_SET_RATE_PARENT, 0),
1289*4882a593Smuzhiyun 	GATE(0, "pclk_timer", "dout_aclk_aud", ENABLE_PCLK_AUD, 28, 0, 0),
1290*4882a593Smuzhiyun 	GATE(0, "pclk_smmu_aud", "dout_aclk_aud", ENABLE_PCLK_AUD, 31, 0, 0),
1291*4882a593Smuzhiyun 
1292*4882a593Smuzhiyun 	GATE(0, "aclk_smmu_aud", "dout_aclk_aud", ENABLE_ACLK_AUD, 27, 0, 0),
1293*4882a593Smuzhiyun 	GATE(0, "aclk_acel_lh_async_si_top", "dout_aclk_aud",
1294*4882a593Smuzhiyun 			 ENABLE_ACLK_AUD, 28, 0, 0),
1295*4882a593Smuzhiyun 	GATE(ACLK_ADMA, "aclk_dmac", "dout_aclk_aud", ENABLE_ACLK_AUD, 31, 0, 0),
1296*4882a593Smuzhiyun };
1297*4882a593Smuzhiyun 
1298*4882a593Smuzhiyun static const struct samsung_cmu_info aud_cmu_info __initconst = {
1299*4882a593Smuzhiyun 	.mux_clks		= aud_mux_clks,
1300*4882a593Smuzhiyun 	.nr_mux_clks		= ARRAY_SIZE(aud_mux_clks),
1301*4882a593Smuzhiyun 	.div_clks		= aud_div_clks,
1302*4882a593Smuzhiyun 	.nr_div_clks		= ARRAY_SIZE(aud_div_clks),
1303*4882a593Smuzhiyun 	.gate_clks		= aud_gate_clks,
1304*4882a593Smuzhiyun 	.nr_gate_clks		= ARRAY_SIZE(aud_gate_clks),
1305*4882a593Smuzhiyun 	.nr_clk_ids		= AUD_NR_CLK,
1306*4882a593Smuzhiyun 	.clk_regs		= aud_clk_regs,
1307*4882a593Smuzhiyun 	.nr_clk_regs		= ARRAY_SIZE(aud_clk_regs),
1308*4882a593Smuzhiyun };
1309*4882a593Smuzhiyun 
exynos7_clk_aud_init(struct device_node * np)1310*4882a593Smuzhiyun static void __init exynos7_clk_aud_init(struct device_node *np)
1311*4882a593Smuzhiyun {
1312*4882a593Smuzhiyun 	samsung_cmu_register_one(np, &aud_cmu_info);
1313*4882a593Smuzhiyun }
1314*4882a593Smuzhiyun 
1315*4882a593Smuzhiyun CLK_OF_DECLARE(exynos7_clk_aud, "samsung,exynos7-clock-aud",
1316*4882a593Smuzhiyun 		exynos7_clk_aud_init);
1317