xref: /OK3568_Linux_fs/kernel/drivers/clk/spear/spear1340_clock.c (revision 4882a59341e53eb6f0b4789bf948001014eff981)
1*4882a593Smuzhiyun /*
2*4882a593Smuzhiyun  * arch/arm/mach-spear13xx/spear1340_clock.c
3*4882a593Smuzhiyun  *
4*4882a593Smuzhiyun  * SPEAr1340 machine clock framework source file
5*4882a593Smuzhiyun  *
6*4882a593Smuzhiyun  * Copyright (C) 2012 ST Microelectronics
7*4882a593Smuzhiyun  * Viresh Kumar <vireshk@kernel.org>
8*4882a593Smuzhiyun  *
9*4882a593Smuzhiyun  * This file is licensed under the terms of the GNU General Public
10*4882a593Smuzhiyun  * License version 2. This program is licensed "as is" without any
11*4882a593Smuzhiyun  * warranty of any kind, whether express or implied.
12*4882a593Smuzhiyun  */
13*4882a593Smuzhiyun 
14*4882a593Smuzhiyun #include <linux/clkdev.h>
15*4882a593Smuzhiyun #include <linux/err.h>
16*4882a593Smuzhiyun #include <linux/io.h>
17*4882a593Smuzhiyun #include <linux/of_platform.h>
18*4882a593Smuzhiyun #include <linux/spinlock_types.h>
19*4882a593Smuzhiyun #include "clk.h"
20*4882a593Smuzhiyun 
21*4882a593Smuzhiyun /* Clock Configuration Registers */
22*4882a593Smuzhiyun #define SPEAR1340_SYS_CLK_CTRL			(misc_base + 0x200)
23*4882a593Smuzhiyun 	#define SPEAR1340_HCLK_SRC_SEL_SHIFT	27
24*4882a593Smuzhiyun 	#define SPEAR1340_HCLK_SRC_SEL_MASK	1
25*4882a593Smuzhiyun 	#define SPEAR1340_SCLK_SRC_SEL_SHIFT	23
26*4882a593Smuzhiyun 	#define SPEAR1340_SCLK_SRC_SEL_MASK	3
27*4882a593Smuzhiyun 
28*4882a593Smuzhiyun /* PLL related registers and bit values */
29*4882a593Smuzhiyun #define SPEAR1340_PLL_CFG			(misc_base + 0x210)
30*4882a593Smuzhiyun 	/* PLL_CFG bit values */
31*4882a593Smuzhiyun 	#define SPEAR1340_CLCD_SYNT_CLK_MASK		1
32*4882a593Smuzhiyun 	#define SPEAR1340_CLCD_SYNT_CLK_SHIFT		31
33*4882a593Smuzhiyun 	#define SPEAR1340_GEN_SYNT2_3_CLK_SHIFT		29
34*4882a593Smuzhiyun 	#define SPEAR1340_GEN_SYNT_CLK_MASK		2
35*4882a593Smuzhiyun 	#define SPEAR1340_GEN_SYNT0_1_CLK_SHIFT		27
36*4882a593Smuzhiyun 	#define SPEAR1340_PLL_CLK_MASK			2
37*4882a593Smuzhiyun 	#define SPEAR1340_PLL3_CLK_SHIFT		24
38*4882a593Smuzhiyun 	#define SPEAR1340_PLL2_CLK_SHIFT		22
39*4882a593Smuzhiyun 	#define SPEAR1340_PLL1_CLK_SHIFT		20
40*4882a593Smuzhiyun 
41*4882a593Smuzhiyun #define SPEAR1340_PLL1_CTR			(misc_base + 0x214)
42*4882a593Smuzhiyun #define SPEAR1340_PLL1_FRQ			(misc_base + 0x218)
43*4882a593Smuzhiyun #define SPEAR1340_PLL2_CTR			(misc_base + 0x220)
44*4882a593Smuzhiyun #define SPEAR1340_PLL2_FRQ			(misc_base + 0x224)
45*4882a593Smuzhiyun #define SPEAR1340_PLL3_CTR			(misc_base + 0x22C)
46*4882a593Smuzhiyun #define SPEAR1340_PLL3_FRQ			(misc_base + 0x230)
47*4882a593Smuzhiyun #define SPEAR1340_PLL4_CTR			(misc_base + 0x238)
48*4882a593Smuzhiyun #define SPEAR1340_PLL4_FRQ			(misc_base + 0x23C)
49*4882a593Smuzhiyun #define SPEAR1340_PERIP_CLK_CFG			(misc_base + 0x244)
50*4882a593Smuzhiyun 	/* PERIP_CLK_CFG bit values */
51*4882a593Smuzhiyun 	#define SPEAR1340_SPDIF_CLK_MASK		1
52*4882a593Smuzhiyun 	#define SPEAR1340_SPDIF_OUT_CLK_SHIFT		15
53*4882a593Smuzhiyun 	#define SPEAR1340_SPDIF_IN_CLK_SHIFT		14
54*4882a593Smuzhiyun 	#define SPEAR1340_GPT3_CLK_SHIFT		13
55*4882a593Smuzhiyun 	#define SPEAR1340_GPT2_CLK_SHIFT		12
56*4882a593Smuzhiyun 	#define SPEAR1340_GPT_CLK_MASK			1
57*4882a593Smuzhiyun 	#define SPEAR1340_GPT1_CLK_SHIFT		9
58*4882a593Smuzhiyun 	#define SPEAR1340_GPT0_CLK_SHIFT		8
59*4882a593Smuzhiyun 	#define SPEAR1340_UART_CLK_MASK			2
60*4882a593Smuzhiyun 	#define SPEAR1340_UART1_CLK_SHIFT		6
61*4882a593Smuzhiyun 	#define SPEAR1340_UART0_CLK_SHIFT		4
62*4882a593Smuzhiyun 	#define SPEAR1340_CLCD_CLK_MASK			2
63*4882a593Smuzhiyun 	#define SPEAR1340_CLCD_CLK_SHIFT		2
64*4882a593Smuzhiyun 	#define SPEAR1340_C3_CLK_MASK			1
65*4882a593Smuzhiyun 	#define SPEAR1340_C3_CLK_SHIFT			1
66*4882a593Smuzhiyun 
67*4882a593Smuzhiyun #define SPEAR1340_GMAC_CLK_CFG			(misc_base + 0x248)
68*4882a593Smuzhiyun 	#define SPEAR1340_GMAC_PHY_CLK_MASK		1
69*4882a593Smuzhiyun 	#define SPEAR1340_GMAC_PHY_CLK_SHIFT		2
70*4882a593Smuzhiyun 	#define SPEAR1340_GMAC_PHY_INPUT_CLK_MASK	2
71*4882a593Smuzhiyun 	#define SPEAR1340_GMAC_PHY_INPUT_CLK_SHIFT	0
72*4882a593Smuzhiyun 
73*4882a593Smuzhiyun #define SPEAR1340_I2S_CLK_CFG			(misc_base + 0x24C)
74*4882a593Smuzhiyun 	/* I2S_CLK_CFG register mask */
75*4882a593Smuzhiyun 	#define SPEAR1340_I2S_SCLK_X_MASK		0x1F
76*4882a593Smuzhiyun 	#define SPEAR1340_I2S_SCLK_X_SHIFT		27
77*4882a593Smuzhiyun 	#define SPEAR1340_I2S_SCLK_Y_MASK		0x1F
78*4882a593Smuzhiyun 	#define SPEAR1340_I2S_SCLK_Y_SHIFT		22
79*4882a593Smuzhiyun 	#define SPEAR1340_I2S_SCLK_EQ_SEL_SHIFT		21
80*4882a593Smuzhiyun 	#define SPEAR1340_I2S_SCLK_SYNTH_ENB		20
81*4882a593Smuzhiyun 	#define SPEAR1340_I2S_PRS1_CLK_X_MASK		0xFF
82*4882a593Smuzhiyun 	#define SPEAR1340_I2S_PRS1_CLK_X_SHIFT		12
83*4882a593Smuzhiyun 	#define SPEAR1340_I2S_PRS1_CLK_Y_MASK		0xFF
84*4882a593Smuzhiyun 	#define SPEAR1340_I2S_PRS1_CLK_Y_SHIFT		4
85*4882a593Smuzhiyun 	#define SPEAR1340_I2S_PRS1_EQ_SEL_SHIFT		3
86*4882a593Smuzhiyun 	#define SPEAR1340_I2S_REF_SEL_MASK		1
87*4882a593Smuzhiyun 	#define SPEAR1340_I2S_REF_SHIFT			2
88*4882a593Smuzhiyun 	#define SPEAR1340_I2S_SRC_CLK_MASK		2
89*4882a593Smuzhiyun 	#define SPEAR1340_I2S_SRC_CLK_SHIFT		0
90*4882a593Smuzhiyun 
91*4882a593Smuzhiyun #define SPEAR1340_C3_CLK_SYNT			(misc_base + 0x250)
92*4882a593Smuzhiyun #define SPEAR1340_UART0_CLK_SYNT		(misc_base + 0x254)
93*4882a593Smuzhiyun #define SPEAR1340_UART1_CLK_SYNT		(misc_base + 0x258)
94*4882a593Smuzhiyun #define SPEAR1340_GMAC_CLK_SYNT			(misc_base + 0x25C)
95*4882a593Smuzhiyun #define SPEAR1340_SDHCI_CLK_SYNT		(misc_base + 0x260)
96*4882a593Smuzhiyun #define SPEAR1340_CFXD_CLK_SYNT			(misc_base + 0x264)
97*4882a593Smuzhiyun #define SPEAR1340_ADC_CLK_SYNT			(misc_base + 0x270)
98*4882a593Smuzhiyun #define SPEAR1340_AMBA_CLK_SYNT			(misc_base + 0x274)
99*4882a593Smuzhiyun #define SPEAR1340_CLCD_CLK_SYNT			(misc_base + 0x27C)
100*4882a593Smuzhiyun #define SPEAR1340_SYS_CLK_SYNT			(misc_base + 0x284)
101*4882a593Smuzhiyun #define SPEAR1340_GEN_CLK_SYNT0			(misc_base + 0x28C)
102*4882a593Smuzhiyun #define SPEAR1340_GEN_CLK_SYNT1			(misc_base + 0x294)
103*4882a593Smuzhiyun #define SPEAR1340_GEN_CLK_SYNT2			(misc_base + 0x29C)
104*4882a593Smuzhiyun #define SPEAR1340_GEN_CLK_SYNT3			(misc_base + 0x304)
105*4882a593Smuzhiyun #define SPEAR1340_PERIP1_CLK_ENB		(misc_base + 0x30C)
106*4882a593Smuzhiyun 	#define SPEAR1340_RTC_CLK_ENB			31
107*4882a593Smuzhiyun 	#define SPEAR1340_ADC_CLK_ENB			30
108*4882a593Smuzhiyun 	#define SPEAR1340_C3_CLK_ENB			29
109*4882a593Smuzhiyun 	#define SPEAR1340_CLCD_CLK_ENB			27
110*4882a593Smuzhiyun 	#define SPEAR1340_DMA_CLK_ENB			25
111*4882a593Smuzhiyun 	#define SPEAR1340_GPIO1_CLK_ENB			24
112*4882a593Smuzhiyun 	#define SPEAR1340_GPIO0_CLK_ENB			23
113*4882a593Smuzhiyun 	#define SPEAR1340_GPT1_CLK_ENB			22
114*4882a593Smuzhiyun 	#define SPEAR1340_GPT0_CLK_ENB			21
115*4882a593Smuzhiyun 	#define SPEAR1340_I2S_PLAY_CLK_ENB		20
116*4882a593Smuzhiyun 	#define SPEAR1340_I2S_REC_CLK_ENB		19
117*4882a593Smuzhiyun 	#define SPEAR1340_I2C0_CLK_ENB			18
118*4882a593Smuzhiyun 	#define SPEAR1340_SSP_CLK_ENB			17
119*4882a593Smuzhiyun 	#define SPEAR1340_UART0_CLK_ENB			15
120*4882a593Smuzhiyun 	#define SPEAR1340_PCIE_SATA_CLK_ENB		12
121*4882a593Smuzhiyun 	#define SPEAR1340_UOC_CLK_ENB			11
122*4882a593Smuzhiyun 	#define SPEAR1340_UHC1_CLK_ENB			10
123*4882a593Smuzhiyun 	#define SPEAR1340_UHC0_CLK_ENB			9
124*4882a593Smuzhiyun 	#define SPEAR1340_GMAC_CLK_ENB			8
125*4882a593Smuzhiyun 	#define SPEAR1340_CFXD_CLK_ENB			7
126*4882a593Smuzhiyun 	#define SPEAR1340_SDHCI_CLK_ENB			6
127*4882a593Smuzhiyun 	#define SPEAR1340_SMI_CLK_ENB			5
128*4882a593Smuzhiyun 	#define SPEAR1340_FSMC_CLK_ENB			4
129*4882a593Smuzhiyun 	#define SPEAR1340_SYSRAM0_CLK_ENB		3
130*4882a593Smuzhiyun 	#define SPEAR1340_SYSRAM1_CLK_ENB		2
131*4882a593Smuzhiyun 	#define SPEAR1340_SYSROM_CLK_ENB		1
132*4882a593Smuzhiyun 	#define SPEAR1340_BUS_CLK_ENB			0
133*4882a593Smuzhiyun 
134*4882a593Smuzhiyun #define SPEAR1340_PERIP2_CLK_ENB		(misc_base + 0x310)
135*4882a593Smuzhiyun 	#define SPEAR1340_THSENS_CLK_ENB		8
136*4882a593Smuzhiyun 	#define SPEAR1340_I2S_REF_PAD_CLK_ENB		7
137*4882a593Smuzhiyun 	#define SPEAR1340_ACP_CLK_ENB			6
138*4882a593Smuzhiyun 	#define SPEAR1340_GPT3_CLK_ENB			5
139*4882a593Smuzhiyun 	#define SPEAR1340_GPT2_CLK_ENB			4
140*4882a593Smuzhiyun 	#define SPEAR1340_KBD_CLK_ENB			3
141*4882a593Smuzhiyun 	#define SPEAR1340_CPU_DBG_CLK_ENB		2
142*4882a593Smuzhiyun 	#define SPEAR1340_DDR_CORE_CLK_ENB		1
143*4882a593Smuzhiyun 	#define SPEAR1340_DDR_CTRL_CLK_ENB		0
144*4882a593Smuzhiyun 
145*4882a593Smuzhiyun #define SPEAR1340_PERIP3_CLK_ENB		(misc_base + 0x314)
146*4882a593Smuzhiyun 	#define SPEAR1340_PLGPIO_CLK_ENB		18
147*4882a593Smuzhiyun 	#define SPEAR1340_VIDEO_DEC_CLK_ENB		16
148*4882a593Smuzhiyun 	#define SPEAR1340_VIDEO_ENC_CLK_ENB		15
149*4882a593Smuzhiyun 	#define SPEAR1340_SPDIF_OUT_CLK_ENB		13
150*4882a593Smuzhiyun 	#define SPEAR1340_SPDIF_IN_CLK_ENB		12
151*4882a593Smuzhiyun 	#define SPEAR1340_VIDEO_IN_CLK_ENB		11
152*4882a593Smuzhiyun 	#define SPEAR1340_CAM0_CLK_ENB			10
153*4882a593Smuzhiyun 	#define SPEAR1340_CAM1_CLK_ENB			9
154*4882a593Smuzhiyun 	#define SPEAR1340_CAM2_CLK_ENB			8
155*4882a593Smuzhiyun 	#define SPEAR1340_CAM3_CLK_ENB			7
156*4882a593Smuzhiyun 	#define SPEAR1340_MALI_CLK_ENB			6
157*4882a593Smuzhiyun 	#define SPEAR1340_CEC0_CLK_ENB			5
158*4882a593Smuzhiyun 	#define SPEAR1340_CEC1_CLK_ENB			4
159*4882a593Smuzhiyun 	#define SPEAR1340_PWM_CLK_ENB			3
160*4882a593Smuzhiyun 	#define SPEAR1340_I2C1_CLK_ENB			2
161*4882a593Smuzhiyun 	#define SPEAR1340_UART1_CLK_ENB			1
162*4882a593Smuzhiyun 
163*4882a593Smuzhiyun static DEFINE_SPINLOCK(_lock);
164*4882a593Smuzhiyun 
165*4882a593Smuzhiyun /* pll rate configuration table, in ascending order of rates */
166*4882a593Smuzhiyun static struct pll_rate_tbl pll_rtbl[] = {
167*4882a593Smuzhiyun 	/* PCLK 24MHz */
168*4882a593Smuzhiyun 	{.mode = 0, .m = 0x83, .n = 0x04, .p = 0x5}, /* vco 1572, pll 49.125 MHz */
169*4882a593Smuzhiyun 	{.mode = 0, .m = 0x7D, .n = 0x06, .p = 0x3}, /* vco 1000, pll 125 MHz */
170*4882a593Smuzhiyun 	{.mode = 0, .m = 0x64, .n = 0x06, .p = 0x1}, /* vco 800, pll 400 MHz */
171*4882a593Smuzhiyun 	{.mode = 0, .m = 0x7D, .n = 0x06, .p = 0x1}, /* vco 1000, pll 500 MHz */
172*4882a593Smuzhiyun 	{.mode = 0, .m = 0xA6, .n = 0x06, .p = 0x1}, /* vco 1328, pll 664 MHz */
173*4882a593Smuzhiyun 	{.mode = 0, .m = 0xC8, .n = 0x06, .p = 0x1}, /* vco 1600, pll 800 MHz */
174*4882a593Smuzhiyun 	{.mode = 0, .m = 0x7D, .n = 0x06, .p = 0x0}, /* vco 1, pll 1 GHz */
175*4882a593Smuzhiyun 	{.mode = 0, .m = 0x96, .n = 0x06, .p = 0x0}, /* vco 1200, pll 1200 MHz */
176*4882a593Smuzhiyun };
177*4882a593Smuzhiyun 
178*4882a593Smuzhiyun /* vco-pll4 rate configuration table, in ascending order of rates */
179*4882a593Smuzhiyun static struct pll_rate_tbl pll4_rtbl[] = {
180*4882a593Smuzhiyun 	{.mode = 0, .m = 0x7D, .n = 0x06, .p = 0x2}, /* vco 1000, pll 250 MHz */
181*4882a593Smuzhiyun 	{.mode = 0, .m = 0xA6, .n = 0x06, .p = 0x2}, /* vco 1328, pll 332 MHz */
182*4882a593Smuzhiyun 	{.mode = 0, .m = 0xC8, .n = 0x06, .p = 0x2}, /* vco 1600, pll 400 MHz */
183*4882a593Smuzhiyun 	{.mode = 0, .m = 0x7D, .n = 0x06, .p = 0x0}, /* vco 1, pll 1 GHz */
184*4882a593Smuzhiyun };
185*4882a593Smuzhiyun 
186*4882a593Smuzhiyun /*
187*4882a593Smuzhiyun  * All below entries generate 166 MHz for
188*4882a593Smuzhiyun  * different values of vco1div2
189*4882a593Smuzhiyun  */
190*4882a593Smuzhiyun static struct frac_rate_tbl amba_synth_rtbl[] = {
191*4882a593Smuzhiyun 	{.div = 0x073A8}, /* for vco1div2 = 600 MHz */
192*4882a593Smuzhiyun 	{.div = 0x06062}, /* for vco1div2 = 500 MHz */
193*4882a593Smuzhiyun 	{.div = 0x04D1B}, /* for vco1div2 = 400 MHz */
194*4882a593Smuzhiyun 	{.div = 0x04000}, /* for vco1div2 = 332 MHz */
195*4882a593Smuzhiyun 	{.div = 0x03031}, /* for vco1div2 = 250 MHz */
196*4882a593Smuzhiyun 	{.div = 0x0268D}, /* for vco1div2 = 200 MHz */
197*4882a593Smuzhiyun };
198*4882a593Smuzhiyun 
199*4882a593Smuzhiyun /*
200*4882a593Smuzhiyun  * Synthesizer Clock derived from vcodiv2. This clock is one of the
201*4882a593Smuzhiyun  * possible clocks to feed cpu directly.
202*4882a593Smuzhiyun  * We can program this synthesizer to make cpu run on different clock
203*4882a593Smuzhiyun  * frequencies.
204*4882a593Smuzhiyun  * Following table provides configuration values to let cpu run on 200,
205*4882a593Smuzhiyun  * 250, 332, 400 or 500 MHz considering different possibilites of input
206*4882a593Smuzhiyun  * (vco1div2) clock.
207*4882a593Smuzhiyun  *
208*4882a593Smuzhiyun  * --------------------------------------------------------------------
209*4882a593Smuzhiyun  * vco1div2(Mhz)	fout(Mhz)	cpuclk = fout/2		div
210*4882a593Smuzhiyun  * --------------------------------------------------------------------
211*4882a593Smuzhiyun  * 400			200		100			0x04000
212*4882a593Smuzhiyun  * 400			250		125			0x03333
213*4882a593Smuzhiyun  * 400			332		166			0x0268D
214*4882a593Smuzhiyun  * 400			400		200			0x02000
215*4882a593Smuzhiyun  * --------------------------------------------------------------------
216*4882a593Smuzhiyun  * 500			200		100			0x05000
217*4882a593Smuzhiyun  * 500			250		125			0x04000
218*4882a593Smuzhiyun  * 500			332		166			0x03031
219*4882a593Smuzhiyun  * 500			400		200			0x02800
220*4882a593Smuzhiyun  * 500			500		250			0x02000
221*4882a593Smuzhiyun  * --------------------------------------------------------------------
222*4882a593Smuzhiyun  * 600			200		100			0x06000
223*4882a593Smuzhiyun  * 600			250		125			0x04CCE
224*4882a593Smuzhiyun  * 600			332		166			0x039D5
225*4882a593Smuzhiyun  * 600			400		200			0x03000
226*4882a593Smuzhiyun  * 600			500		250			0x02666
227*4882a593Smuzhiyun  * --------------------------------------------------------------------
228*4882a593Smuzhiyun  * 664			200		100			0x06a38
229*4882a593Smuzhiyun  * 664			250		125			0x054FD
230*4882a593Smuzhiyun  * 664			332		166			0x04000
231*4882a593Smuzhiyun  * 664			400		200			0x0351E
232*4882a593Smuzhiyun  * 664			500		250			0x02A7E
233*4882a593Smuzhiyun  * --------------------------------------------------------------------
234*4882a593Smuzhiyun  * 800			200		100			0x08000
235*4882a593Smuzhiyun  * 800			250		125			0x06666
236*4882a593Smuzhiyun  * 800			332		166			0x04D18
237*4882a593Smuzhiyun  * 800			400		200			0x04000
238*4882a593Smuzhiyun  * 800			500		250			0x03333
239*4882a593Smuzhiyun  * --------------------------------------------------------------------
240*4882a593Smuzhiyun  * sys rate configuration table is in descending order of divisor.
241*4882a593Smuzhiyun  */
242*4882a593Smuzhiyun static struct frac_rate_tbl sys_synth_rtbl[] = {
243*4882a593Smuzhiyun 	{.div = 0x08000},
244*4882a593Smuzhiyun 	{.div = 0x06a38},
245*4882a593Smuzhiyun 	{.div = 0x06666},
246*4882a593Smuzhiyun 	{.div = 0x06000},
247*4882a593Smuzhiyun 	{.div = 0x054FD},
248*4882a593Smuzhiyun 	{.div = 0x05000},
249*4882a593Smuzhiyun 	{.div = 0x04D18},
250*4882a593Smuzhiyun 	{.div = 0x04CCE},
251*4882a593Smuzhiyun 	{.div = 0x04000},
252*4882a593Smuzhiyun 	{.div = 0x039D5},
253*4882a593Smuzhiyun 	{.div = 0x0351E},
254*4882a593Smuzhiyun 	{.div = 0x03333},
255*4882a593Smuzhiyun 	{.div = 0x03031},
256*4882a593Smuzhiyun 	{.div = 0x03000},
257*4882a593Smuzhiyun 	{.div = 0x02A7E},
258*4882a593Smuzhiyun 	{.div = 0x02800},
259*4882a593Smuzhiyun 	{.div = 0x0268D},
260*4882a593Smuzhiyun 	{.div = 0x02666},
261*4882a593Smuzhiyun 	{.div = 0x02000},
262*4882a593Smuzhiyun };
263*4882a593Smuzhiyun 
264*4882a593Smuzhiyun /* aux rate configuration table, in ascending order of rates */
265*4882a593Smuzhiyun static struct aux_rate_tbl aux_rtbl[] = {
266*4882a593Smuzhiyun 	/* 12.29MHz for vic1div2=600MHz and 10.24MHz for VCO1div2=500MHz */
267*4882a593Smuzhiyun 	{.xscale = 5, .yscale = 122, .eq = 0},
268*4882a593Smuzhiyun 	/* 14.70MHz for vic1div2=600MHz and 12.29MHz for VCO1div2=500MHz */
269*4882a593Smuzhiyun 	{.xscale = 10, .yscale = 204, .eq = 0},
270*4882a593Smuzhiyun 	/* 48MHz for vic1div2=600MHz and 40 MHz for VCO1div2=500MHz */
271*4882a593Smuzhiyun 	{.xscale = 4, .yscale = 25, .eq = 0},
272*4882a593Smuzhiyun 	/* 57.14MHz for vic1div2=600MHz and 48 MHz for VCO1div2=500MHz */
273*4882a593Smuzhiyun 	{.xscale = 4, .yscale = 21, .eq = 0},
274*4882a593Smuzhiyun 	/* 83.33MHz for vic1div2=600MHz and 69.44MHz for VCO1div2=500MHz */
275*4882a593Smuzhiyun 	{.xscale = 5, .yscale = 18, .eq = 0},
276*4882a593Smuzhiyun 	/* 100MHz for vic1div2=600MHz and 83.33 MHz for VCO1div2=500MHz */
277*4882a593Smuzhiyun 	{.xscale = 2, .yscale = 6, .eq = 0},
278*4882a593Smuzhiyun 	/* 125MHz for vic1div2=600MHz and 104.1MHz for VCO1div2=500MHz */
279*4882a593Smuzhiyun 	{.xscale = 5, .yscale = 12, .eq = 0},
280*4882a593Smuzhiyun 	/* 150MHz for vic1div2=600MHz and 125MHz for VCO1div2=500MHz */
281*4882a593Smuzhiyun 	{.xscale = 2, .yscale = 4, .eq = 0},
282*4882a593Smuzhiyun 	/* 166MHz for vic1div2=600MHz and 138.88MHz for VCO1div2=500MHz */
283*4882a593Smuzhiyun 	{.xscale = 5, .yscale = 18, .eq = 1},
284*4882a593Smuzhiyun 	/* 200MHz for vic1div2=600MHz and 166MHz for VCO1div2=500MHz */
285*4882a593Smuzhiyun 	{.xscale = 1, .yscale = 3, .eq = 1},
286*4882a593Smuzhiyun 	/* 250MHz for vic1div2=600MHz and 208.33MHz for VCO1div2=500MHz */
287*4882a593Smuzhiyun 	{.xscale = 5, .yscale = 12, .eq = 1},
288*4882a593Smuzhiyun 	/* 300MHz for vic1div2=600MHz and 250MHz for VCO1div2=500MHz */
289*4882a593Smuzhiyun 	{.xscale = 1, .yscale = 2, .eq = 1},
290*4882a593Smuzhiyun };
291*4882a593Smuzhiyun 
292*4882a593Smuzhiyun /* gmac rate configuration table, in ascending order of rates */
293*4882a593Smuzhiyun static struct aux_rate_tbl gmac_rtbl[] = {
294*4882a593Smuzhiyun 	/* For gmac phy input clk */
295*4882a593Smuzhiyun 	{.xscale = 2, .yscale = 6, .eq = 0}, /* divided by 6 */
296*4882a593Smuzhiyun 	{.xscale = 2, .yscale = 4, .eq = 0}, /* divided by 4 */
297*4882a593Smuzhiyun 	{.xscale = 1, .yscale = 3, .eq = 1}, /* divided by 3 */
298*4882a593Smuzhiyun 	{.xscale = 1, .yscale = 2, .eq = 1}, /* divided by 2 */
299*4882a593Smuzhiyun };
300*4882a593Smuzhiyun 
301*4882a593Smuzhiyun /* clcd rate configuration table, in ascending order of rates */
302*4882a593Smuzhiyun static struct frac_rate_tbl clcd_rtbl[] = {
303*4882a593Smuzhiyun 	{.div = 0x18000}, /* 25 Mhz , for vc01div4 = 300 MHz*/
304*4882a593Smuzhiyun 	{.div = 0x1638E}, /* 27 Mhz , for vc01div4 = 300 MHz*/
305*4882a593Smuzhiyun 	{.div = 0x14000}, /* 25 Mhz , for vc01div4 = 250 MHz*/
306*4882a593Smuzhiyun 	{.div = 0x1284B}, /* 27 Mhz , for vc01div4 = 250 MHz*/
307*4882a593Smuzhiyun 	{.div = 0x0D8D3}, /* 58 Mhz , for vco1div4 = 393 MHz */
308*4882a593Smuzhiyun 	{.div = 0x0B72C}, /* 58 Mhz , for vco1div4 = 332 MHz */
309*4882a593Smuzhiyun 	{.div = 0x0A584}, /* 58 Mhz , for vco1div4 = 300 MHz */
310*4882a593Smuzhiyun 	{.div = 0x093B1}, /* 65 Mhz , for vc01div4 = 300 MHz*/
311*4882a593Smuzhiyun 	{.div = 0x089EE}, /* 58 Mhz , for vc01div4 = 250 MHz*/
312*4882a593Smuzhiyun 	{.div = 0x081BA}, /* 74 Mhz , for vc01div4 = 300 MHz*/
313*4882a593Smuzhiyun 	{.div = 0x07BA0}, /* 65 Mhz , for vc01div4 = 250 MHz*/
314*4882a593Smuzhiyun 	{.div = 0x06f1C}, /* 72 Mhz , for vc01div4 = 250 MHz*/
315*4882a593Smuzhiyun 	{.div = 0x06E58}, /* 58 Mhz , for vco1div4 = 200 MHz */
316*4882a593Smuzhiyun 	{.div = 0x06c1B}, /* 74 Mhz , for vc01div4 = 250 MHz*/
317*4882a593Smuzhiyun 	{.div = 0x058E3}, /* 108 Mhz , for vc01div4 = 300 MHz*/
318*4882a593Smuzhiyun 	{.div = 0x04A12}, /* 108 Mhz , for vc01div4 = 250 MHz*/
319*4882a593Smuzhiyun 	{.div = 0x040A5}, /* 148.5 Mhz , for vc01div4 = 300 MHz*/
320*4882a593Smuzhiyun 	{.div = 0x0378E}, /* 144 Mhz , for vc01div4 = 250 MHz*/
321*4882a593Smuzhiyun 	{.div = 0x0360D}, /* 148 Mhz , for vc01div4 = 250 MHz*/
322*4882a593Smuzhiyun 	{.div = 0x035E0}, /* 148.5 MHz, for vc01div4 = 250 MHz*/
323*4882a593Smuzhiyun };
324*4882a593Smuzhiyun 
325*4882a593Smuzhiyun /* i2s prescaler1 masks */
326*4882a593Smuzhiyun static const struct aux_clk_masks i2s_prs1_masks = {
327*4882a593Smuzhiyun 	.eq_sel_mask = AUX_EQ_SEL_MASK,
328*4882a593Smuzhiyun 	.eq_sel_shift = SPEAR1340_I2S_PRS1_EQ_SEL_SHIFT,
329*4882a593Smuzhiyun 	.eq1_mask = AUX_EQ1_SEL,
330*4882a593Smuzhiyun 	.eq2_mask = AUX_EQ2_SEL,
331*4882a593Smuzhiyun 	.xscale_sel_mask = SPEAR1340_I2S_PRS1_CLK_X_MASK,
332*4882a593Smuzhiyun 	.xscale_sel_shift = SPEAR1340_I2S_PRS1_CLK_X_SHIFT,
333*4882a593Smuzhiyun 	.yscale_sel_mask = SPEAR1340_I2S_PRS1_CLK_Y_MASK,
334*4882a593Smuzhiyun 	.yscale_sel_shift = SPEAR1340_I2S_PRS1_CLK_Y_SHIFT,
335*4882a593Smuzhiyun };
336*4882a593Smuzhiyun 
337*4882a593Smuzhiyun /* i2s sclk (bit clock) syynthesizers masks */
338*4882a593Smuzhiyun static const struct aux_clk_masks i2s_sclk_masks = {
339*4882a593Smuzhiyun 	.eq_sel_mask = AUX_EQ_SEL_MASK,
340*4882a593Smuzhiyun 	.eq_sel_shift = SPEAR1340_I2S_SCLK_EQ_SEL_SHIFT,
341*4882a593Smuzhiyun 	.eq1_mask = AUX_EQ1_SEL,
342*4882a593Smuzhiyun 	.eq2_mask = AUX_EQ2_SEL,
343*4882a593Smuzhiyun 	.xscale_sel_mask = SPEAR1340_I2S_SCLK_X_MASK,
344*4882a593Smuzhiyun 	.xscale_sel_shift = SPEAR1340_I2S_SCLK_X_SHIFT,
345*4882a593Smuzhiyun 	.yscale_sel_mask = SPEAR1340_I2S_SCLK_Y_MASK,
346*4882a593Smuzhiyun 	.yscale_sel_shift = SPEAR1340_I2S_SCLK_Y_SHIFT,
347*4882a593Smuzhiyun 	.enable_bit = SPEAR1340_I2S_SCLK_SYNTH_ENB,
348*4882a593Smuzhiyun };
349*4882a593Smuzhiyun 
350*4882a593Smuzhiyun /* i2s prs1 aux rate configuration table, in ascending order of rates */
351*4882a593Smuzhiyun static struct aux_rate_tbl i2s_prs1_rtbl[] = {
352*4882a593Smuzhiyun 	/* For parent clk = 49.152 MHz */
353*4882a593Smuzhiyun 	{.xscale = 1, .yscale = 12, .eq = 0}, /* 2.048 MHz, smp freq = 8Khz */
354*4882a593Smuzhiyun 	{.xscale = 11, .yscale = 96, .eq = 0}, /* 2.816 MHz, smp freq = 11Khz */
355*4882a593Smuzhiyun 	{.xscale = 1, .yscale = 6, .eq = 0}, /* 4.096 MHz, smp freq = 16Khz */
356*4882a593Smuzhiyun 	{.xscale = 11, .yscale = 48, .eq = 0}, /* 5.632 MHz, smp freq = 22Khz */
357*4882a593Smuzhiyun 
358*4882a593Smuzhiyun 	/*
359*4882a593Smuzhiyun 	 * with parent clk = 49.152, freq gen is 8.192 MHz, smp freq = 32Khz
360*4882a593Smuzhiyun 	 * with parent clk = 12.288, freq gen is 2.048 MHz, smp freq = 8Khz
361*4882a593Smuzhiyun 	 */
362*4882a593Smuzhiyun 	{.xscale = 1, .yscale = 3, .eq = 0},
363*4882a593Smuzhiyun 
364*4882a593Smuzhiyun 	/* For parent clk = 49.152 MHz */
365*4882a593Smuzhiyun 	{.xscale = 17, .yscale = 37, .eq = 0}, /* 11.289 MHz, smp freq = 44Khz*/
366*4882a593Smuzhiyun 	{.xscale = 1, .yscale = 2, .eq = 0}, /* 12.288 MHz, smp freq = 48Khz*/
367*4882a593Smuzhiyun };
368*4882a593Smuzhiyun 
369*4882a593Smuzhiyun /* i2s sclk aux rate configuration table, in ascending order of rates */
370*4882a593Smuzhiyun static struct aux_rate_tbl i2s_sclk_rtbl[] = {
371*4882a593Smuzhiyun 	/* For sclk = ref_clk * x/2/y */
372*4882a593Smuzhiyun 	{.xscale = 1, .yscale = 4, .eq = 0},
373*4882a593Smuzhiyun 	{.xscale = 1, .yscale = 2, .eq = 0},
374*4882a593Smuzhiyun };
375*4882a593Smuzhiyun 
376*4882a593Smuzhiyun /* adc rate configuration table, in ascending order of rates */
377*4882a593Smuzhiyun /* possible adc range is 2.5 MHz to 20 MHz. */
378*4882a593Smuzhiyun static struct aux_rate_tbl adc_rtbl[] = {
379*4882a593Smuzhiyun 	/* For ahb = 166.67 MHz */
380*4882a593Smuzhiyun 	{.xscale = 1, .yscale = 31, .eq = 0}, /* 2.68 MHz */
381*4882a593Smuzhiyun 	{.xscale = 2, .yscale = 21, .eq = 0}, /* 7.94 MHz */
382*4882a593Smuzhiyun 	{.xscale = 4, .yscale = 21, .eq = 0}, /* 15.87 MHz */
383*4882a593Smuzhiyun 	{.xscale = 10, .yscale = 42, .eq = 0}, /* 19.84 MHz */
384*4882a593Smuzhiyun };
385*4882a593Smuzhiyun 
386*4882a593Smuzhiyun /* General synth rate configuration table, in ascending order of rates */
387*4882a593Smuzhiyun static struct frac_rate_tbl gen_rtbl[] = {
388*4882a593Smuzhiyun 	{.div = 0x1A92B}, /* 22.5792 MHz for vco1div4=300 MHz*/
389*4882a593Smuzhiyun 	{.div = 0x186A0}, /* 24.576 MHz for vco1div4=300 MHz*/
390*4882a593Smuzhiyun 	{.div = 0x18000}, /* 25 MHz for vco1div4=300 MHz*/
391*4882a593Smuzhiyun 	{.div = 0x1624E}, /* 22.5792 MHz for vco1div4=250 MHz*/
392*4882a593Smuzhiyun 	{.div = 0x14585}, /* 24.576 MHz for vco1div4=250 MHz*/
393*4882a593Smuzhiyun 	{.div = 0x14000}, /* 25 MHz for vco1div4=250 MHz*/
394*4882a593Smuzhiyun 	{.div = 0x0D495}, /* 45.1584 MHz for vco1div4=300 MHz*/
395*4882a593Smuzhiyun 	{.div = 0x0C000}, /* 50 MHz for vco1div4=300 MHz*/
396*4882a593Smuzhiyun 	{.div = 0x0B127}, /* 45.1584 MHz for vco1div4=250 MHz*/
397*4882a593Smuzhiyun 	{.div = 0x0A000}, /* 50 MHz for vco1div4=250 MHz*/
398*4882a593Smuzhiyun 	{.div = 0x07530}, /* 81.92 MHz for vco1div4=300 MHz*/
399*4882a593Smuzhiyun 	{.div = 0x061A8}, /* 81.92 MHz for vco1div4=250 MHz*/
400*4882a593Smuzhiyun 	{.div = 0x06000}, /* 100 MHz for vco1div4=300 MHz*/
401*4882a593Smuzhiyun 	{.div = 0x05000}, /* 100 MHz for vco1div4=250 MHz*/
402*4882a593Smuzhiyun 	{.div = 0x03000}, /* 200 MHz for vco1div4=300 MHz*/
403*4882a593Smuzhiyun 	{.div = 0x02DB6}, /* 210 MHz for vco1div4=300 MHz*/
404*4882a593Smuzhiyun 	{.div = 0x02BA2}, /* 220 MHz for vco1div4=300 MHz*/
405*4882a593Smuzhiyun 	{.div = 0x029BD}, /* 230 MHz for vco1div4=300 MHz*/
406*4882a593Smuzhiyun 	{.div = 0x02800}, /* 200 MHz for vco1div4=250 MHz*/
407*4882a593Smuzhiyun 	{.div = 0x02666}, /* 250 MHz for vco1div4=300 MHz*/
408*4882a593Smuzhiyun 	{.div = 0x02620}, /* 210 MHz for vco1div4=250 MHz*/
409*4882a593Smuzhiyun 	{.div = 0x02460}, /* 220 MHz for vco1div4=250 MHz*/
410*4882a593Smuzhiyun 	{.div = 0x022C0}, /* 230 MHz for vco1div4=250 MHz*/
411*4882a593Smuzhiyun 	{.div = 0x02160}, /* 240 MHz for vco1div4=250 MHz*/
412*4882a593Smuzhiyun 	{.div = 0x02000}, /* 250 MHz for vco1div4=250 MHz*/
413*4882a593Smuzhiyun };
414*4882a593Smuzhiyun 
415*4882a593Smuzhiyun /* clock parents */
416*4882a593Smuzhiyun static const char *vco_parents[] = { "osc_24m_clk", "osc_25m_clk", };
417*4882a593Smuzhiyun static const char *sys_parents[] = { "pll1_clk", "pll1_clk", "pll1_clk",
418*4882a593Smuzhiyun 	"pll1_clk", "sys_syn_clk", "sys_syn_clk", "pll2_clk", "pll3_clk", };
419*4882a593Smuzhiyun static const char *ahb_parents[] = { "cpu_div3_clk", "amba_syn_clk", };
420*4882a593Smuzhiyun static const char *gpt_parents[] = { "osc_24m_clk", "apb_clk", };
421*4882a593Smuzhiyun static const char *uart0_parents[] = { "pll5_clk", "osc_24m_clk",
422*4882a593Smuzhiyun 	"uart0_syn_gclk", };
423*4882a593Smuzhiyun static const char *uart1_parents[] = { "pll5_clk", "osc_24m_clk",
424*4882a593Smuzhiyun 	"uart1_syn_gclk", };
425*4882a593Smuzhiyun static const char *c3_parents[] = { "pll5_clk", "c3_syn_gclk", };
426*4882a593Smuzhiyun static const char *gmac_phy_input_parents[] = { "gmii_pad_clk", "pll2_clk",
427*4882a593Smuzhiyun 	"osc_25m_clk", };
428*4882a593Smuzhiyun static const char *gmac_phy_parents[] = { "phy_input_mclk", "phy_syn_gclk", };
429*4882a593Smuzhiyun static const char *clcd_synth_parents[] = { "vco1div4_clk", "pll2_clk", };
430*4882a593Smuzhiyun static const char *clcd_pixel_parents[] = { "pll5_clk", "clcd_syn_clk", };
431*4882a593Smuzhiyun static const char *i2s_src_parents[] = { "vco1div2_clk", "pll2_clk", "pll3_clk",
432*4882a593Smuzhiyun 	"i2s_src_pad_clk", };
433*4882a593Smuzhiyun static const char *i2s_ref_parents[] = { "i2s_src_mclk", "i2s_prs1_clk", };
434*4882a593Smuzhiyun static const char *spdif_out_parents[] = { "i2s_src_pad_clk", "gen_syn2_clk", };
435*4882a593Smuzhiyun static const char *spdif_in_parents[] = { "pll2_clk", "gen_syn3_clk", };
436*4882a593Smuzhiyun 
437*4882a593Smuzhiyun static const char *gen_synth0_1_parents[] = { "vco1div4_clk", "vco3div2_clk",
438*4882a593Smuzhiyun 	"pll3_clk", };
439*4882a593Smuzhiyun static const char *gen_synth2_3_parents[] = { "vco1div4_clk", "vco2div2_clk",
440*4882a593Smuzhiyun 	"pll2_clk", };
441*4882a593Smuzhiyun 
spear1340_clk_init(void __iomem * misc_base)442*4882a593Smuzhiyun void __init spear1340_clk_init(void __iomem *misc_base)
443*4882a593Smuzhiyun {
444*4882a593Smuzhiyun 	struct clk *clk, *clk1;
445*4882a593Smuzhiyun 
446*4882a593Smuzhiyun 	clk = clk_register_fixed_rate(NULL, "osc_32k_clk", NULL, 0, 32000);
447*4882a593Smuzhiyun 	clk_register_clkdev(clk, "osc_32k_clk", NULL);
448*4882a593Smuzhiyun 
449*4882a593Smuzhiyun 	clk = clk_register_fixed_rate(NULL, "osc_24m_clk", NULL, 0, 24000000);
450*4882a593Smuzhiyun 	clk_register_clkdev(clk, "osc_24m_clk", NULL);
451*4882a593Smuzhiyun 
452*4882a593Smuzhiyun 	clk = clk_register_fixed_rate(NULL, "osc_25m_clk", NULL, 0, 25000000);
453*4882a593Smuzhiyun 	clk_register_clkdev(clk, "osc_25m_clk", NULL);
454*4882a593Smuzhiyun 
455*4882a593Smuzhiyun 	clk = clk_register_fixed_rate(NULL, "gmii_pad_clk", NULL, 0, 125000000);
456*4882a593Smuzhiyun 	clk_register_clkdev(clk, "gmii_pad_clk", NULL);
457*4882a593Smuzhiyun 
458*4882a593Smuzhiyun 	clk = clk_register_fixed_rate(NULL, "i2s_src_pad_clk", NULL, 0,
459*4882a593Smuzhiyun 				      12288000);
460*4882a593Smuzhiyun 	clk_register_clkdev(clk, "i2s_src_pad_clk", NULL);
461*4882a593Smuzhiyun 
462*4882a593Smuzhiyun 	/* clock derived from 32 KHz osc clk */
463*4882a593Smuzhiyun 	clk = clk_register_gate(NULL, "rtc-spear", "osc_32k_clk", 0,
464*4882a593Smuzhiyun 			SPEAR1340_PERIP1_CLK_ENB, SPEAR1340_RTC_CLK_ENB, 0,
465*4882a593Smuzhiyun 			&_lock);
466*4882a593Smuzhiyun 	clk_register_clkdev(clk, NULL, "e0580000.rtc");
467*4882a593Smuzhiyun 
468*4882a593Smuzhiyun 	/* clock derived from 24 or 25 MHz osc clk */
469*4882a593Smuzhiyun 	/* vco-pll */
470*4882a593Smuzhiyun 	clk = clk_register_mux(NULL, "vco1_mclk", vco_parents,
471*4882a593Smuzhiyun 			ARRAY_SIZE(vco_parents), CLK_SET_RATE_NO_REPARENT,
472*4882a593Smuzhiyun 			SPEAR1340_PLL_CFG, SPEAR1340_PLL1_CLK_SHIFT,
473*4882a593Smuzhiyun 			SPEAR1340_PLL_CLK_MASK, 0, &_lock);
474*4882a593Smuzhiyun 	clk_register_clkdev(clk, "vco1_mclk", NULL);
475*4882a593Smuzhiyun 	clk = clk_register_vco_pll("vco1_clk", "pll1_clk", NULL, "vco1_mclk", 0,
476*4882a593Smuzhiyun 			SPEAR1340_PLL1_CTR, SPEAR1340_PLL1_FRQ, pll_rtbl,
477*4882a593Smuzhiyun 			ARRAY_SIZE(pll_rtbl), &_lock, &clk1, NULL);
478*4882a593Smuzhiyun 	clk_register_clkdev(clk, "vco1_clk", NULL);
479*4882a593Smuzhiyun 	clk_register_clkdev(clk1, "pll1_clk", NULL);
480*4882a593Smuzhiyun 
481*4882a593Smuzhiyun 	clk = clk_register_mux(NULL, "vco2_mclk", vco_parents,
482*4882a593Smuzhiyun 			ARRAY_SIZE(vco_parents), CLK_SET_RATE_NO_REPARENT,
483*4882a593Smuzhiyun 			SPEAR1340_PLL_CFG, SPEAR1340_PLL2_CLK_SHIFT,
484*4882a593Smuzhiyun 			SPEAR1340_PLL_CLK_MASK, 0, &_lock);
485*4882a593Smuzhiyun 	clk_register_clkdev(clk, "vco2_mclk", NULL);
486*4882a593Smuzhiyun 	clk = clk_register_vco_pll("vco2_clk", "pll2_clk", NULL, "vco2_mclk", 0,
487*4882a593Smuzhiyun 			SPEAR1340_PLL2_CTR, SPEAR1340_PLL2_FRQ, pll_rtbl,
488*4882a593Smuzhiyun 			ARRAY_SIZE(pll_rtbl), &_lock, &clk1, NULL);
489*4882a593Smuzhiyun 	clk_register_clkdev(clk, "vco2_clk", NULL);
490*4882a593Smuzhiyun 	clk_register_clkdev(clk1, "pll2_clk", NULL);
491*4882a593Smuzhiyun 
492*4882a593Smuzhiyun 	clk = clk_register_mux(NULL, "vco3_mclk", vco_parents,
493*4882a593Smuzhiyun 			ARRAY_SIZE(vco_parents), CLK_SET_RATE_NO_REPARENT,
494*4882a593Smuzhiyun 			SPEAR1340_PLL_CFG, SPEAR1340_PLL3_CLK_SHIFT,
495*4882a593Smuzhiyun 			SPEAR1340_PLL_CLK_MASK, 0, &_lock);
496*4882a593Smuzhiyun 	clk_register_clkdev(clk, "vco3_mclk", NULL);
497*4882a593Smuzhiyun 	clk = clk_register_vco_pll("vco3_clk", "pll3_clk", NULL, "vco3_mclk", 0,
498*4882a593Smuzhiyun 			SPEAR1340_PLL3_CTR, SPEAR1340_PLL3_FRQ, pll_rtbl,
499*4882a593Smuzhiyun 			ARRAY_SIZE(pll_rtbl), &_lock, &clk1, NULL);
500*4882a593Smuzhiyun 	clk_register_clkdev(clk, "vco3_clk", NULL);
501*4882a593Smuzhiyun 	clk_register_clkdev(clk1, "pll3_clk", NULL);
502*4882a593Smuzhiyun 
503*4882a593Smuzhiyun 	clk = clk_register_vco_pll("vco4_clk", "pll4_clk", NULL, "osc_24m_clk",
504*4882a593Smuzhiyun 			0, SPEAR1340_PLL4_CTR, SPEAR1340_PLL4_FRQ, pll4_rtbl,
505*4882a593Smuzhiyun 			ARRAY_SIZE(pll4_rtbl), &_lock, &clk1, NULL);
506*4882a593Smuzhiyun 	clk_register_clkdev(clk, "vco4_clk", NULL);
507*4882a593Smuzhiyun 	clk_register_clkdev(clk1, "pll4_clk", NULL);
508*4882a593Smuzhiyun 
509*4882a593Smuzhiyun 	clk = clk_register_fixed_rate(NULL, "pll5_clk", "osc_24m_clk", 0,
510*4882a593Smuzhiyun 			48000000);
511*4882a593Smuzhiyun 	clk_register_clkdev(clk, "pll5_clk", NULL);
512*4882a593Smuzhiyun 
513*4882a593Smuzhiyun 	clk = clk_register_fixed_rate(NULL, "pll6_clk", "osc_25m_clk", 0,
514*4882a593Smuzhiyun 			25000000);
515*4882a593Smuzhiyun 	clk_register_clkdev(clk, "pll6_clk", NULL);
516*4882a593Smuzhiyun 
517*4882a593Smuzhiyun 	/* vco div n clocks */
518*4882a593Smuzhiyun 	clk = clk_register_fixed_factor(NULL, "vco1div2_clk", "vco1_clk", 0, 1,
519*4882a593Smuzhiyun 			2);
520*4882a593Smuzhiyun 	clk_register_clkdev(clk, "vco1div2_clk", NULL);
521*4882a593Smuzhiyun 
522*4882a593Smuzhiyun 	clk = clk_register_fixed_factor(NULL, "vco1div4_clk", "vco1_clk", 0, 1,
523*4882a593Smuzhiyun 			4);
524*4882a593Smuzhiyun 	clk_register_clkdev(clk, "vco1div4_clk", NULL);
525*4882a593Smuzhiyun 
526*4882a593Smuzhiyun 	clk = clk_register_fixed_factor(NULL, "vco2div2_clk", "vco2_clk", 0, 1,
527*4882a593Smuzhiyun 			2);
528*4882a593Smuzhiyun 	clk_register_clkdev(clk, "vco2div2_clk", NULL);
529*4882a593Smuzhiyun 
530*4882a593Smuzhiyun 	clk = clk_register_fixed_factor(NULL, "vco3div2_clk", "vco3_clk", 0, 1,
531*4882a593Smuzhiyun 			2);
532*4882a593Smuzhiyun 	clk_register_clkdev(clk, "vco3div2_clk", NULL);
533*4882a593Smuzhiyun 
534*4882a593Smuzhiyun 	/* peripherals */
535*4882a593Smuzhiyun 	clk_register_fixed_factor(NULL, "thermal_clk", "osc_24m_clk", 0, 1,
536*4882a593Smuzhiyun 			128);
537*4882a593Smuzhiyun 	clk = clk_register_gate(NULL, "thermal_gclk", "thermal_clk", 0,
538*4882a593Smuzhiyun 			SPEAR1340_PERIP2_CLK_ENB, SPEAR1340_THSENS_CLK_ENB, 0,
539*4882a593Smuzhiyun 			&_lock);
540*4882a593Smuzhiyun 	clk_register_clkdev(clk, NULL, "e07008c4.thermal");
541*4882a593Smuzhiyun 
542*4882a593Smuzhiyun 	/* clock derived from pll4 clk */
543*4882a593Smuzhiyun 	clk = clk_register_fixed_factor(NULL, "ddr_clk", "pll4_clk", 0, 1,
544*4882a593Smuzhiyun 			1);
545*4882a593Smuzhiyun 	clk_register_clkdev(clk, "ddr_clk", NULL);
546*4882a593Smuzhiyun 
547*4882a593Smuzhiyun 	/* clock derived from pll1 clk */
548*4882a593Smuzhiyun 	clk = clk_register_frac("sys_syn_clk", "vco1div2_clk", 0,
549*4882a593Smuzhiyun 			SPEAR1340_SYS_CLK_SYNT, sys_synth_rtbl,
550*4882a593Smuzhiyun 			ARRAY_SIZE(sys_synth_rtbl), &_lock);
551*4882a593Smuzhiyun 	clk_register_clkdev(clk, "sys_syn_clk", NULL);
552*4882a593Smuzhiyun 
553*4882a593Smuzhiyun 	clk = clk_register_frac("amba_syn_clk", "vco1div2_clk", 0,
554*4882a593Smuzhiyun 			SPEAR1340_AMBA_CLK_SYNT, amba_synth_rtbl,
555*4882a593Smuzhiyun 			ARRAY_SIZE(amba_synth_rtbl), &_lock);
556*4882a593Smuzhiyun 	clk_register_clkdev(clk, "amba_syn_clk", NULL);
557*4882a593Smuzhiyun 
558*4882a593Smuzhiyun 	clk = clk_register_mux(NULL, "sys_mclk", sys_parents,
559*4882a593Smuzhiyun 			ARRAY_SIZE(sys_parents), CLK_SET_RATE_NO_REPARENT,
560*4882a593Smuzhiyun 			SPEAR1340_SYS_CLK_CTRL, SPEAR1340_SCLK_SRC_SEL_SHIFT,
561*4882a593Smuzhiyun 			SPEAR1340_SCLK_SRC_SEL_MASK, 0, &_lock);
562*4882a593Smuzhiyun 	clk_register_clkdev(clk, "sys_mclk", NULL);
563*4882a593Smuzhiyun 
564*4882a593Smuzhiyun 	clk = clk_register_fixed_factor(NULL, "cpu_clk", "sys_mclk", 0, 1,
565*4882a593Smuzhiyun 			2);
566*4882a593Smuzhiyun 	clk_register_clkdev(clk, "cpu_clk", NULL);
567*4882a593Smuzhiyun 
568*4882a593Smuzhiyun 	clk = clk_register_fixed_factor(NULL, "cpu_div3_clk", "cpu_clk", 0, 1,
569*4882a593Smuzhiyun 			3);
570*4882a593Smuzhiyun 	clk_register_clkdev(clk, "cpu_div3_clk", NULL);
571*4882a593Smuzhiyun 
572*4882a593Smuzhiyun 	clk = clk_register_fixed_factor(NULL, "wdt_clk", "cpu_clk", 0, 1,
573*4882a593Smuzhiyun 			2);
574*4882a593Smuzhiyun 	clk_register_clkdev(clk, NULL, "ec800620.wdt");
575*4882a593Smuzhiyun 
576*4882a593Smuzhiyun 	clk = clk_register_fixed_factor(NULL, "smp_twd_clk", "cpu_clk", 0, 1,
577*4882a593Smuzhiyun 			2);
578*4882a593Smuzhiyun 	clk_register_clkdev(clk, NULL, "smp_twd");
579*4882a593Smuzhiyun 
580*4882a593Smuzhiyun 	clk = clk_register_mux(NULL, "ahb_clk", ahb_parents,
581*4882a593Smuzhiyun 			ARRAY_SIZE(ahb_parents), CLK_SET_RATE_NO_REPARENT,
582*4882a593Smuzhiyun 			SPEAR1340_SYS_CLK_CTRL, SPEAR1340_HCLK_SRC_SEL_SHIFT,
583*4882a593Smuzhiyun 			SPEAR1340_HCLK_SRC_SEL_MASK, 0, &_lock);
584*4882a593Smuzhiyun 	clk_register_clkdev(clk, "ahb_clk", NULL);
585*4882a593Smuzhiyun 
586*4882a593Smuzhiyun 	clk = clk_register_fixed_factor(NULL, "apb_clk", "ahb_clk", 0, 1,
587*4882a593Smuzhiyun 			2);
588*4882a593Smuzhiyun 	clk_register_clkdev(clk, "apb_clk", NULL);
589*4882a593Smuzhiyun 
590*4882a593Smuzhiyun 	/* gpt clocks */
591*4882a593Smuzhiyun 	clk = clk_register_mux(NULL, "gpt0_mclk", gpt_parents,
592*4882a593Smuzhiyun 			ARRAY_SIZE(gpt_parents), CLK_SET_RATE_NO_REPARENT,
593*4882a593Smuzhiyun 			SPEAR1340_PERIP_CLK_CFG, SPEAR1340_GPT0_CLK_SHIFT,
594*4882a593Smuzhiyun 			SPEAR1340_GPT_CLK_MASK, 0, &_lock);
595*4882a593Smuzhiyun 	clk_register_clkdev(clk, "gpt0_mclk", NULL);
596*4882a593Smuzhiyun 	clk = clk_register_gate(NULL, "gpt0_clk", "gpt0_mclk", 0,
597*4882a593Smuzhiyun 			SPEAR1340_PERIP1_CLK_ENB, SPEAR1340_GPT0_CLK_ENB, 0,
598*4882a593Smuzhiyun 			&_lock);
599*4882a593Smuzhiyun 	clk_register_clkdev(clk, NULL, "gpt0");
600*4882a593Smuzhiyun 
601*4882a593Smuzhiyun 	clk = clk_register_mux(NULL, "gpt1_mclk", gpt_parents,
602*4882a593Smuzhiyun 			ARRAY_SIZE(gpt_parents), CLK_SET_RATE_NO_REPARENT,
603*4882a593Smuzhiyun 			SPEAR1340_PERIP_CLK_CFG, SPEAR1340_GPT1_CLK_SHIFT,
604*4882a593Smuzhiyun 			SPEAR1340_GPT_CLK_MASK, 0, &_lock);
605*4882a593Smuzhiyun 	clk_register_clkdev(clk, "gpt1_mclk", NULL);
606*4882a593Smuzhiyun 	clk = clk_register_gate(NULL, "gpt1_clk", "gpt1_mclk", 0,
607*4882a593Smuzhiyun 			SPEAR1340_PERIP1_CLK_ENB, SPEAR1340_GPT1_CLK_ENB, 0,
608*4882a593Smuzhiyun 			&_lock);
609*4882a593Smuzhiyun 	clk_register_clkdev(clk, NULL, "gpt1");
610*4882a593Smuzhiyun 
611*4882a593Smuzhiyun 	clk = clk_register_mux(NULL, "gpt2_mclk", gpt_parents,
612*4882a593Smuzhiyun 			ARRAY_SIZE(gpt_parents), CLK_SET_RATE_NO_REPARENT,
613*4882a593Smuzhiyun 			SPEAR1340_PERIP_CLK_CFG, SPEAR1340_GPT2_CLK_SHIFT,
614*4882a593Smuzhiyun 			SPEAR1340_GPT_CLK_MASK, 0, &_lock);
615*4882a593Smuzhiyun 	clk_register_clkdev(clk, "gpt2_mclk", NULL);
616*4882a593Smuzhiyun 	clk = clk_register_gate(NULL, "gpt2_clk", "gpt2_mclk", 0,
617*4882a593Smuzhiyun 			SPEAR1340_PERIP2_CLK_ENB, SPEAR1340_GPT2_CLK_ENB, 0,
618*4882a593Smuzhiyun 			&_lock);
619*4882a593Smuzhiyun 	clk_register_clkdev(clk, NULL, "gpt2");
620*4882a593Smuzhiyun 
621*4882a593Smuzhiyun 	clk = clk_register_mux(NULL, "gpt3_mclk", gpt_parents,
622*4882a593Smuzhiyun 			ARRAY_SIZE(gpt_parents), CLK_SET_RATE_NO_REPARENT,
623*4882a593Smuzhiyun 			SPEAR1340_PERIP_CLK_CFG, SPEAR1340_GPT3_CLK_SHIFT,
624*4882a593Smuzhiyun 			SPEAR1340_GPT_CLK_MASK, 0, &_lock);
625*4882a593Smuzhiyun 	clk_register_clkdev(clk, "gpt3_mclk", NULL);
626*4882a593Smuzhiyun 	clk = clk_register_gate(NULL, "gpt3_clk", "gpt3_mclk", 0,
627*4882a593Smuzhiyun 			SPEAR1340_PERIP2_CLK_ENB, SPEAR1340_GPT3_CLK_ENB, 0,
628*4882a593Smuzhiyun 			&_lock);
629*4882a593Smuzhiyun 	clk_register_clkdev(clk, NULL, "gpt3");
630*4882a593Smuzhiyun 
631*4882a593Smuzhiyun 	/* others */
632*4882a593Smuzhiyun 	clk = clk_register_aux("uart0_syn_clk", "uart0_syn_gclk",
633*4882a593Smuzhiyun 			"vco1div2_clk", 0, SPEAR1340_UART0_CLK_SYNT, NULL,
634*4882a593Smuzhiyun 			aux_rtbl, ARRAY_SIZE(aux_rtbl), &_lock, &clk1);
635*4882a593Smuzhiyun 	clk_register_clkdev(clk, "uart0_syn_clk", NULL);
636*4882a593Smuzhiyun 	clk_register_clkdev(clk1, "uart0_syn_gclk", NULL);
637*4882a593Smuzhiyun 
638*4882a593Smuzhiyun 	clk = clk_register_mux(NULL, "uart0_mclk", uart0_parents,
639*4882a593Smuzhiyun 			ARRAY_SIZE(uart0_parents),
640*4882a593Smuzhiyun 			CLK_SET_RATE_PARENT | CLK_SET_RATE_NO_REPARENT,
641*4882a593Smuzhiyun 			SPEAR1340_PERIP_CLK_CFG, SPEAR1340_UART0_CLK_SHIFT,
642*4882a593Smuzhiyun 			SPEAR1340_UART_CLK_MASK, 0, &_lock);
643*4882a593Smuzhiyun 	clk_register_clkdev(clk, "uart0_mclk", NULL);
644*4882a593Smuzhiyun 
645*4882a593Smuzhiyun 	clk = clk_register_gate(NULL, "uart0_clk", "uart0_mclk",
646*4882a593Smuzhiyun 			CLK_SET_RATE_PARENT, SPEAR1340_PERIP1_CLK_ENB,
647*4882a593Smuzhiyun 			SPEAR1340_UART0_CLK_ENB, 0, &_lock);
648*4882a593Smuzhiyun 	clk_register_clkdev(clk, NULL, "e0000000.serial");
649*4882a593Smuzhiyun 
650*4882a593Smuzhiyun 	clk = clk_register_aux("uart1_syn_clk", "uart1_syn_gclk",
651*4882a593Smuzhiyun 			"vco1div2_clk", 0, SPEAR1340_UART1_CLK_SYNT, NULL,
652*4882a593Smuzhiyun 			aux_rtbl, ARRAY_SIZE(aux_rtbl), &_lock, &clk1);
653*4882a593Smuzhiyun 	clk_register_clkdev(clk, "uart1_syn_clk", NULL);
654*4882a593Smuzhiyun 	clk_register_clkdev(clk1, "uart1_syn_gclk", NULL);
655*4882a593Smuzhiyun 
656*4882a593Smuzhiyun 	clk = clk_register_mux(NULL, "uart1_mclk", uart1_parents,
657*4882a593Smuzhiyun 			ARRAY_SIZE(uart1_parents), CLK_SET_RATE_NO_REPARENT,
658*4882a593Smuzhiyun 			SPEAR1340_PERIP_CLK_CFG, SPEAR1340_UART1_CLK_SHIFT,
659*4882a593Smuzhiyun 			SPEAR1340_UART_CLK_MASK, 0, &_lock);
660*4882a593Smuzhiyun 	clk_register_clkdev(clk, "uart1_mclk", NULL);
661*4882a593Smuzhiyun 
662*4882a593Smuzhiyun 	clk = clk_register_gate(NULL, "uart1_clk", "uart1_mclk", 0,
663*4882a593Smuzhiyun 			SPEAR1340_PERIP3_CLK_ENB, SPEAR1340_UART1_CLK_ENB, 0,
664*4882a593Smuzhiyun 			&_lock);
665*4882a593Smuzhiyun 	clk_register_clkdev(clk, NULL, "b4100000.serial");
666*4882a593Smuzhiyun 
667*4882a593Smuzhiyun 	clk = clk_register_aux("sdhci_syn_clk", "sdhci_syn_gclk",
668*4882a593Smuzhiyun 			"vco1div2_clk", 0, SPEAR1340_SDHCI_CLK_SYNT, NULL,
669*4882a593Smuzhiyun 			aux_rtbl, ARRAY_SIZE(aux_rtbl), &_lock, &clk1);
670*4882a593Smuzhiyun 	clk_register_clkdev(clk, "sdhci_syn_clk", NULL);
671*4882a593Smuzhiyun 	clk_register_clkdev(clk1, "sdhci_syn_gclk", NULL);
672*4882a593Smuzhiyun 
673*4882a593Smuzhiyun 	clk = clk_register_gate(NULL, "sdhci_clk", "sdhci_syn_gclk",
674*4882a593Smuzhiyun 			CLK_SET_RATE_PARENT, SPEAR1340_PERIP1_CLK_ENB,
675*4882a593Smuzhiyun 			SPEAR1340_SDHCI_CLK_ENB, 0, &_lock);
676*4882a593Smuzhiyun 	clk_register_clkdev(clk, NULL, "b3000000.sdhci");
677*4882a593Smuzhiyun 
678*4882a593Smuzhiyun 	clk = clk_register_aux("cfxd_syn_clk", "cfxd_syn_gclk", "vco1div2_clk",
679*4882a593Smuzhiyun 			0, SPEAR1340_CFXD_CLK_SYNT, NULL, aux_rtbl,
680*4882a593Smuzhiyun 			ARRAY_SIZE(aux_rtbl), &_lock, &clk1);
681*4882a593Smuzhiyun 	clk_register_clkdev(clk, "cfxd_syn_clk", NULL);
682*4882a593Smuzhiyun 	clk_register_clkdev(clk1, "cfxd_syn_gclk", NULL);
683*4882a593Smuzhiyun 
684*4882a593Smuzhiyun 	clk = clk_register_gate(NULL, "cfxd_clk", "cfxd_syn_gclk",
685*4882a593Smuzhiyun 			CLK_SET_RATE_PARENT, SPEAR1340_PERIP1_CLK_ENB,
686*4882a593Smuzhiyun 			SPEAR1340_CFXD_CLK_ENB, 0, &_lock);
687*4882a593Smuzhiyun 	clk_register_clkdev(clk, NULL, "b2800000.cf");
688*4882a593Smuzhiyun 	clk_register_clkdev(clk, NULL, "arasan_xd");
689*4882a593Smuzhiyun 
690*4882a593Smuzhiyun 	clk = clk_register_aux("c3_syn_clk", "c3_syn_gclk", "vco1div2_clk", 0,
691*4882a593Smuzhiyun 			SPEAR1340_C3_CLK_SYNT, NULL, aux_rtbl,
692*4882a593Smuzhiyun 			ARRAY_SIZE(aux_rtbl), &_lock, &clk1);
693*4882a593Smuzhiyun 	clk_register_clkdev(clk, "c3_syn_clk", NULL);
694*4882a593Smuzhiyun 	clk_register_clkdev(clk1, "c3_syn_gclk", NULL);
695*4882a593Smuzhiyun 
696*4882a593Smuzhiyun 	clk = clk_register_mux(NULL, "c3_mclk", c3_parents,
697*4882a593Smuzhiyun 			ARRAY_SIZE(c3_parents),
698*4882a593Smuzhiyun 			CLK_SET_RATE_PARENT | CLK_SET_RATE_NO_REPARENT,
699*4882a593Smuzhiyun 			SPEAR1340_PERIP_CLK_CFG, SPEAR1340_C3_CLK_SHIFT,
700*4882a593Smuzhiyun 			SPEAR1340_C3_CLK_MASK, 0, &_lock);
701*4882a593Smuzhiyun 	clk_register_clkdev(clk, "c3_mclk", NULL);
702*4882a593Smuzhiyun 
703*4882a593Smuzhiyun 	clk = clk_register_gate(NULL, "c3_clk", "c3_mclk", CLK_SET_RATE_PARENT,
704*4882a593Smuzhiyun 			SPEAR1340_PERIP1_CLK_ENB, SPEAR1340_C3_CLK_ENB, 0,
705*4882a593Smuzhiyun 			&_lock);
706*4882a593Smuzhiyun 	clk_register_clkdev(clk, NULL, "e1800000.c3");
707*4882a593Smuzhiyun 
708*4882a593Smuzhiyun 	/* gmac */
709*4882a593Smuzhiyun 	clk = clk_register_mux(NULL, "phy_input_mclk", gmac_phy_input_parents,
710*4882a593Smuzhiyun 			ARRAY_SIZE(gmac_phy_input_parents),
711*4882a593Smuzhiyun 			CLK_SET_RATE_NO_REPARENT, SPEAR1340_GMAC_CLK_CFG,
712*4882a593Smuzhiyun 			SPEAR1340_GMAC_PHY_INPUT_CLK_SHIFT,
713*4882a593Smuzhiyun 			SPEAR1340_GMAC_PHY_INPUT_CLK_MASK, 0, &_lock);
714*4882a593Smuzhiyun 	clk_register_clkdev(clk, "phy_input_mclk", NULL);
715*4882a593Smuzhiyun 
716*4882a593Smuzhiyun 	clk = clk_register_aux("phy_syn_clk", "phy_syn_gclk", "phy_input_mclk",
717*4882a593Smuzhiyun 			0, SPEAR1340_GMAC_CLK_SYNT, NULL, gmac_rtbl,
718*4882a593Smuzhiyun 			ARRAY_SIZE(gmac_rtbl), &_lock, &clk1);
719*4882a593Smuzhiyun 	clk_register_clkdev(clk, "phy_syn_clk", NULL);
720*4882a593Smuzhiyun 	clk_register_clkdev(clk1, "phy_syn_gclk", NULL);
721*4882a593Smuzhiyun 
722*4882a593Smuzhiyun 	clk = clk_register_mux(NULL, "phy_mclk", gmac_phy_parents,
723*4882a593Smuzhiyun 			ARRAY_SIZE(gmac_phy_parents), CLK_SET_RATE_NO_REPARENT,
724*4882a593Smuzhiyun 			SPEAR1340_PERIP_CLK_CFG, SPEAR1340_GMAC_PHY_CLK_SHIFT,
725*4882a593Smuzhiyun 			SPEAR1340_GMAC_PHY_CLK_MASK, 0, &_lock);
726*4882a593Smuzhiyun 	clk_register_clkdev(clk, "stmmacphy.0", NULL);
727*4882a593Smuzhiyun 
728*4882a593Smuzhiyun 	/* clcd */
729*4882a593Smuzhiyun 	clk = clk_register_mux(NULL, "clcd_syn_mclk", clcd_synth_parents,
730*4882a593Smuzhiyun 			ARRAY_SIZE(clcd_synth_parents),
731*4882a593Smuzhiyun 			CLK_SET_RATE_NO_REPARENT, SPEAR1340_CLCD_CLK_SYNT,
732*4882a593Smuzhiyun 			SPEAR1340_CLCD_SYNT_CLK_SHIFT,
733*4882a593Smuzhiyun 			SPEAR1340_CLCD_SYNT_CLK_MASK, 0, &_lock);
734*4882a593Smuzhiyun 	clk_register_clkdev(clk, "clcd_syn_mclk", NULL);
735*4882a593Smuzhiyun 
736*4882a593Smuzhiyun 	clk = clk_register_frac("clcd_syn_clk", "clcd_syn_mclk", 0,
737*4882a593Smuzhiyun 			SPEAR1340_CLCD_CLK_SYNT, clcd_rtbl,
738*4882a593Smuzhiyun 			ARRAY_SIZE(clcd_rtbl), &_lock);
739*4882a593Smuzhiyun 	clk_register_clkdev(clk, "clcd_syn_clk", NULL);
740*4882a593Smuzhiyun 
741*4882a593Smuzhiyun 	clk = clk_register_mux(NULL, "clcd_pixel_mclk", clcd_pixel_parents,
742*4882a593Smuzhiyun 			ARRAY_SIZE(clcd_pixel_parents),
743*4882a593Smuzhiyun 			CLK_SET_RATE_PARENT | CLK_SET_RATE_NO_REPARENT,
744*4882a593Smuzhiyun 			SPEAR1340_PERIP_CLK_CFG, SPEAR1340_CLCD_CLK_SHIFT,
745*4882a593Smuzhiyun 			SPEAR1340_CLCD_CLK_MASK, 0, &_lock);
746*4882a593Smuzhiyun 	clk_register_clkdev(clk, "clcd_pixel_mclk", NULL);
747*4882a593Smuzhiyun 
748*4882a593Smuzhiyun 	clk = clk_register_gate(NULL, "clcd_clk", "clcd_pixel_mclk", 0,
749*4882a593Smuzhiyun 			SPEAR1340_PERIP1_CLK_ENB, SPEAR1340_CLCD_CLK_ENB, 0,
750*4882a593Smuzhiyun 			&_lock);
751*4882a593Smuzhiyun 	clk_register_clkdev(clk, NULL, "e1000000.clcd");
752*4882a593Smuzhiyun 
753*4882a593Smuzhiyun 	/* i2s */
754*4882a593Smuzhiyun 	clk = clk_register_mux(NULL, "i2s_src_mclk", i2s_src_parents,
755*4882a593Smuzhiyun 			ARRAY_SIZE(i2s_src_parents), CLK_SET_RATE_NO_REPARENT,
756*4882a593Smuzhiyun 			SPEAR1340_I2S_CLK_CFG, SPEAR1340_I2S_SRC_CLK_SHIFT,
757*4882a593Smuzhiyun 			SPEAR1340_I2S_SRC_CLK_MASK, 0, &_lock);
758*4882a593Smuzhiyun 	clk_register_clkdev(clk, "i2s_src_mclk", NULL);
759*4882a593Smuzhiyun 
760*4882a593Smuzhiyun 	clk = clk_register_aux("i2s_prs1_clk", NULL, "i2s_src_mclk",
761*4882a593Smuzhiyun 			CLK_SET_RATE_PARENT, SPEAR1340_I2S_CLK_CFG,
762*4882a593Smuzhiyun 			&i2s_prs1_masks, i2s_prs1_rtbl,
763*4882a593Smuzhiyun 			ARRAY_SIZE(i2s_prs1_rtbl), &_lock, NULL);
764*4882a593Smuzhiyun 	clk_register_clkdev(clk, "i2s_prs1_clk", NULL);
765*4882a593Smuzhiyun 
766*4882a593Smuzhiyun 	clk = clk_register_mux(NULL, "i2s_ref_mclk", i2s_ref_parents,
767*4882a593Smuzhiyun 			ARRAY_SIZE(i2s_ref_parents),
768*4882a593Smuzhiyun 			CLK_SET_RATE_PARENT | CLK_SET_RATE_NO_REPARENT,
769*4882a593Smuzhiyun 			SPEAR1340_I2S_CLK_CFG, SPEAR1340_I2S_REF_SHIFT,
770*4882a593Smuzhiyun 			SPEAR1340_I2S_REF_SEL_MASK, 0, &_lock);
771*4882a593Smuzhiyun 	clk_register_clkdev(clk, "i2s_ref_mclk", NULL);
772*4882a593Smuzhiyun 
773*4882a593Smuzhiyun 	clk = clk_register_gate(NULL, "i2s_ref_pad_clk", "i2s_ref_mclk", 0,
774*4882a593Smuzhiyun 			SPEAR1340_PERIP2_CLK_ENB, SPEAR1340_I2S_REF_PAD_CLK_ENB,
775*4882a593Smuzhiyun 			0, &_lock);
776*4882a593Smuzhiyun 	clk_register_clkdev(clk, "i2s_ref_pad_clk", NULL);
777*4882a593Smuzhiyun 
778*4882a593Smuzhiyun 	clk = clk_register_aux("i2s_sclk_clk", "i2s_sclk_gclk", "i2s_ref_mclk",
779*4882a593Smuzhiyun 			0, SPEAR1340_I2S_CLK_CFG, &i2s_sclk_masks,
780*4882a593Smuzhiyun 			i2s_sclk_rtbl, ARRAY_SIZE(i2s_sclk_rtbl), &_lock,
781*4882a593Smuzhiyun 			&clk1);
782*4882a593Smuzhiyun 	clk_register_clkdev(clk, "i2s_sclk_clk", NULL);
783*4882a593Smuzhiyun 	clk_register_clkdev(clk1, "i2s_sclk_gclk", NULL);
784*4882a593Smuzhiyun 
785*4882a593Smuzhiyun 	/* clock derived from ahb clk */
786*4882a593Smuzhiyun 	clk = clk_register_gate(NULL, "i2c0_clk", "ahb_clk", 0,
787*4882a593Smuzhiyun 			SPEAR1340_PERIP1_CLK_ENB, SPEAR1340_I2C0_CLK_ENB, 0,
788*4882a593Smuzhiyun 			&_lock);
789*4882a593Smuzhiyun 	clk_register_clkdev(clk, NULL, "e0280000.i2c");
790*4882a593Smuzhiyun 
791*4882a593Smuzhiyun 	clk = clk_register_gate(NULL, "i2c1_clk", "ahb_clk", 0,
792*4882a593Smuzhiyun 			SPEAR1340_PERIP3_CLK_ENB, SPEAR1340_I2C1_CLK_ENB, 0,
793*4882a593Smuzhiyun 			&_lock);
794*4882a593Smuzhiyun 	clk_register_clkdev(clk, NULL, "b4000000.i2c");
795*4882a593Smuzhiyun 
796*4882a593Smuzhiyun 	clk = clk_register_gate(NULL, "dma_clk", "ahb_clk", 0,
797*4882a593Smuzhiyun 			SPEAR1340_PERIP1_CLK_ENB, SPEAR1340_DMA_CLK_ENB, 0,
798*4882a593Smuzhiyun 			&_lock);
799*4882a593Smuzhiyun 	clk_register_clkdev(clk, NULL, "ea800000.dma");
800*4882a593Smuzhiyun 	clk_register_clkdev(clk, NULL, "eb000000.dma");
801*4882a593Smuzhiyun 
802*4882a593Smuzhiyun 	clk = clk_register_gate(NULL, "gmac_clk", "ahb_clk", 0,
803*4882a593Smuzhiyun 			SPEAR1340_PERIP1_CLK_ENB, SPEAR1340_GMAC_CLK_ENB, 0,
804*4882a593Smuzhiyun 			&_lock);
805*4882a593Smuzhiyun 	clk_register_clkdev(clk, NULL, "e2000000.eth");
806*4882a593Smuzhiyun 
807*4882a593Smuzhiyun 	clk = clk_register_gate(NULL, "fsmc_clk", "ahb_clk", 0,
808*4882a593Smuzhiyun 			SPEAR1340_PERIP1_CLK_ENB, SPEAR1340_FSMC_CLK_ENB, 0,
809*4882a593Smuzhiyun 			&_lock);
810*4882a593Smuzhiyun 	clk_register_clkdev(clk, NULL, "b0000000.flash");
811*4882a593Smuzhiyun 
812*4882a593Smuzhiyun 	clk = clk_register_gate(NULL, "smi_clk", "ahb_clk", 0,
813*4882a593Smuzhiyun 			SPEAR1340_PERIP1_CLK_ENB, SPEAR1340_SMI_CLK_ENB, 0,
814*4882a593Smuzhiyun 			&_lock);
815*4882a593Smuzhiyun 	clk_register_clkdev(clk, NULL, "ea000000.flash");
816*4882a593Smuzhiyun 
817*4882a593Smuzhiyun 	clk = clk_register_gate(NULL, "usbh0_clk", "ahb_clk", 0,
818*4882a593Smuzhiyun 			SPEAR1340_PERIP1_CLK_ENB, SPEAR1340_UHC0_CLK_ENB, 0,
819*4882a593Smuzhiyun 			&_lock);
820*4882a593Smuzhiyun 	clk_register_clkdev(clk, NULL, "e4000000.ohci");
821*4882a593Smuzhiyun 	clk_register_clkdev(clk, NULL, "e4800000.ehci");
822*4882a593Smuzhiyun 
823*4882a593Smuzhiyun 	clk = clk_register_gate(NULL, "usbh1_clk", "ahb_clk", 0,
824*4882a593Smuzhiyun 			SPEAR1340_PERIP1_CLK_ENB, SPEAR1340_UHC1_CLK_ENB, 0,
825*4882a593Smuzhiyun 			&_lock);
826*4882a593Smuzhiyun 	clk_register_clkdev(clk, NULL, "e5000000.ohci");
827*4882a593Smuzhiyun 	clk_register_clkdev(clk, NULL, "e5800000.ehci");
828*4882a593Smuzhiyun 
829*4882a593Smuzhiyun 	clk = clk_register_gate(NULL, "uoc_clk", "ahb_clk", 0,
830*4882a593Smuzhiyun 			SPEAR1340_PERIP1_CLK_ENB, SPEAR1340_UOC_CLK_ENB, 0,
831*4882a593Smuzhiyun 			&_lock);
832*4882a593Smuzhiyun 	clk_register_clkdev(clk, NULL, "e3800000.otg");
833*4882a593Smuzhiyun 
834*4882a593Smuzhiyun 	clk = clk_register_gate(NULL, "pcie_sata_clk", "ahb_clk", 0,
835*4882a593Smuzhiyun 			SPEAR1340_PERIP1_CLK_ENB, SPEAR1340_PCIE_SATA_CLK_ENB,
836*4882a593Smuzhiyun 			0, &_lock);
837*4882a593Smuzhiyun 	clk_register_clkdev(clk, NULL, "b1000000.pcie");
838*4882a593Smuzhiyun 	clk_register_clkdev(clk, NULL, "b1000000.ahci");
839*4882a593Smuzhiyun 
840*4882a593Smuzhiyun 	clk = clk_register_gate(NULL, "sysram0_clk", "ahb_clk", 0,
841*4882a593Smuzhiyun 			SPEAR1340_PERIP1_CLK_ENB, SPEAR1340_SYSRAM0_CLK_ENB, 0,
842*4882a593Smuzhiyun 			&_lock);
843*4882a593Smuzhiyun 	clk_register_clkdev(clk, "sysram0_clk", NULL);
844*4882a593Smuzhiyun 
845*4882a593Smuzhiyun 	clk = clk_register_gate(NULL, "sysram1_clk", "ahb_clk", 0,
846*4882a593Smuzhiyun 			SPEAR1340_PERIP1_CLK_ENB, SPEAR1340_SYSRAM1_CLK_ENB, 0,
847*4882a593Smuzhiyun 			&_lock);
848*4882a593Smuzhiyun 	clk_register_clkdev(clk, "sysram1_clk", NULL);
849*4882a593Smuzhiyun 
850*4882a593Smuzhiyun 	clk = clk_register_aux("adc_syn_clk", "adc_syn_gclk", "ahb_clk",
851*4882a593Smuzhiyun 			0, SPEAR1340_ADC_CLK_SYNT, NULL, adc_rtbl,
852*4882a593Smuzhiyun 			ARRAY_SIZE(adc_rtbl), &_lock, &clk1);
853*4882a593Smuzhiyun 	clk_register_clkdev(clk, "adc_syn_clk", NULL);
854*4882a593Smuzhiyun 	clk_register_clkdev(clk1, "adc_syn_gclk", NULL);
855*4882a593Smuzhiyun 
856*4882a593Smuzhiyun 	clk = clk_register_gate(NULL, "adc_clk", "adc_syn_gclk",
857*4882a593Smuzhiyun 			CLK_SET_RATE_PARENT, SPEAR1340_PERIP1_CLK_ENB,
858*4882a593Smuzhiyun 			SPEAR1340_ADC_CLK_ENB, 0, &_lock);
859*4882a593Smuzhiyun 	clk_register_clkdev(clk, NULL, "e0080000.adc");
860*4882a593Smuzhiyun 
861*4882a593Smuzhiyun 	/* clock derived from apb clk */
862*4882a593Smuzhiyun 	clk = clk_register_gate(NULL, "ssp_clk", "apb_clk", 0,
863*4882a593Smuzhiyun 			SPEAR1340_PERIP1_CLK_ENB, SPEAR1340_SSP_CLK_ENB, 0,
864*4882a593Smuzhiyun 			&_lock);
865*4882a593Smuzhiyun 	clk_register_clkdev(clk, NULL, "e0100000.spi");
866*4882a593Smuzhiyun 
867*4882a593Smuzhiyun 	clk = clk_register_gate(NULL, "gpio0_clk", "apb_clk", 0,
868*4882a593Smuzhiyun 			SPEAR1340_PERIP1_CLK_ENB, SPEAR1340_GPIO0_CLK_ENB, 0,
869*4882a593Smuzhiyun 			&_lock);
870*4882a593Smuzhiyun 	clk_register_clkdev(clk, NULL, "e0600000.gpio");
871*4882a593Smuzhiyun 
872*4882a593Smuzhiyun 	clk = clk_register_gate(NULL, "gpio1_clk", "apb_clk", 0,
873*4882a593Smuzhiyun 			SPEAR1340_PERIP1_CLK_ENB, SPEAR1340_GPIO1_CLK_ENB, 0,
874*4882a593Smuzhiyun 			&_lock);
875*4882a593Smuzhiyun 	clk_register_clkdev(clk, NULL, "e0680000.gpio");
876*4882a593Smuzhiyun 
877*4882a593Smuzhiyun 	clk = clk_register_gate(NULL, "i2s_play_clk", "apb_clk", 0,
878*4882a593Smuzhiyun 			SPEAR1340_PERIP1_CLK_ENB, SPEAR1340_I2S_PLAY_CLK_ENB, 0,
879*4882a593Smuzhiyun 			&_lock);
880*4882a593Smuzhiyun 	clk_register_clkdev(clk, NULL, "b2400000.i2s-play");
881*4882a593Smuzhiyun 
882*4882a593Smuzhiyun 	clk = clk_register_gate(NULL, "i2s_rec_clk", "apb_clk", 0,
883*4882a593Smuzhiyun 			SPEAR1340_PERIP1_CLK_ENB, SPEAR1340_I2S_REC_CLK_ENB, 0,
884*4882a593Smuzhiyun 			&_lock);
885*4882a593Smuzhiyun 	clk_register_clkdev(clk, NULL, "b2000000.i2s-rec");
886*4882a593Smuzhiyun 
887*4882a593Smuzhiyun 	clk = clk_register_gate(NULL, "kbd_clk", "apb_clk", 0,
888*4882a593Smuzhiyun 			SPEAR1340_PERIP2_CLK_ENB, SPEAR1340_KBD_CLK_ENB, 0,
889*4882a593Smuzhiyun 			&_lock);
890*4882a593Smuzhiyun 	clk_register_clkdev(clk, NULL, "e0300000.kbd");
891*4882a593Smuzhiyun 
892*4882a593Smuzhiyun 	/* RAS clks */
893*4882a593Smuzhiyun 	clk = clk_register_mux(NULL, "gen_syn0_1_mclk", gen_synth0_1_parents,
894*4882a593Smuzhiyun 			ARRAY_SIZE(gen_synth0_1_parents),
895*4882a593Smuzhiyun 			CLK_SET_RATE_NO_REPARENT, SPEAR1340_PLL_CFG,
896*4882a593Smuzhiyun 			SPEAR1340_GEN_SYNT0_1_CLK_SHIFT,
897*4882a593Smuzhiyun 			SPEAR1340_GEN_SYNT_CLK_MASK, 0, &_lock);
898*4882a593Smuzhiyun 	clk_register_clkdev(clk, "gen_syn0_1_mclk", NULL);
899*4882a593Smuzhiyun 
900*4882a593Smuzhiyun 	clk = clk_register_mux(NULL, "gen_syn2_3_mclk", gen_synth2_3_parents,
901*4882a593Smuzhiyun 			ARRAY_SIZE(gen_synth2_3_parents),
902*4882a593Smuzhiyun 			CLK_SET_RATE_NO_REPARENT, SPEAR1340_PLL_CFG,
903*4882a593Smuzhiyun 			SPEAR1340_GEN_SYNT2_3_CLK_SHIFT,
904*4882a593Smuzhiyun 			SPEAR1340_GEN_SYNT_CLK_MASK, 0, &_lock);
905*4882a593Smuzhiyun 	clk_register_clkdev(clk, "gen_syn2_3_mclk", NULL);
906*4882a593Smuzhiyun 
907*4882a593Smuzhiyun 	clk = clk_register_frac("gen_syn0_clk", "gen_syn0_1_mclk", 0,
908*4882a593Smuzhiyun 			SPEAR1340_GEN_CLK_SYNT0, gen_rtbl, ARRAY_SIZE(gen_rtbl),
909*4882a593Smuzhiyun 			&_lock);
910*4882a593Smuzhiyun 	clk_register_clkdev(clk, "gen_syn0_clk", NULL);
911*4882a593Smuzhiyun 
912*4882a593Smuzhiyun 	clk = clk_register_frac("gen_syn1_clk", "gen_syn0_1_mclk", 0,
913*4882a593Smuzhiyun 			SPEAR1340_GEN_CLK_SYNT1, gen_rtbl, ARRAY_SIZE(gen_rtbl),
914*4882a593Smuzhiyun 			&_lock);
915*4882a593Smuzhiyun 	clk_register_clkdev(clk, "gen_syn1_clk", NULL);
916*4882a593Smuzhiyun 
917*4882a593Smuzhiyun 	clk = clk_register_frac("gen_syn2_clk", "gen_syn2_3_mclk", 0,
918*4882a593Smuzhiyun 			SPEAR1340_GEN_CLK_SYNT2, gen_rtbl, ARRAY_SIZE(gen_rtbl),
919*4882a593Smuzhiyun 			&_lock);
920*4882a593Smuzhiyun 	clk_register_clkdev(clk, "gen_syn2_clk", NULL);
921*4882a593Smuzhiyun 
922*4882a593Smuzhiyun 	clk = clk_register_frac("gen_syn3_clk", "gen_syn2_3_mclk", 0,
923*4882a593Smuzhiyun 			SPEAR1340_GEN_CLK_SYNT3, gen_rtbl, ARRAY_SIZE(gen_rtbl),
924*4882a593Smuzhiyun 			&_lock);
925*4882a593Smuzhiyun 	clk_register_clkdev(clk, "gen_syn3_clk", NULL);
926*4882a593Smuzhiyun 
927*4882a593Smuzhiyun 	clk = clk_register_gate(NULL, "mali_clk", "gen_syn3_clk",
928*4882a593Smuzhiyun 			CLK_SET_RATE_PARENT, SPEAR1340_PERIP3_CLK_ENB,
929*4882a593Smuzhiyun 			SPEAR1340_MALI_CLK_ENB, 0, &_lock);
930*4882a593Smuzhiyun 	clk_register_clkdev(clk, NULL, "mali");
931*4882a593Smuzhiyun 
932*4882a593Smuzhiyun 	clk = clk_register_gate(NULL, "cec0_clk", "ahb_clk", 0,
933*4882a593Smuzhiyun 			SPEAR1340_PERIP3_CLK_ENB, SPEAR1340_CEC0_CLK_ENB, 0,
934*4882a593Smuzhiyun 			&_lock);
935*4882a593Smuzhiyun 	clk_register_clkdev(clk, NULL, "spear_cec.0");
936*4882a593Smuzhiyun 
937*4882a593Smuzhiyun 	clk = clk_register_gate(NULL, "cec1_clk", "ahb_clk", 0,
938*4882a593Smuzhiyun 			SPEAR1340_PERIP3_CLK_ENB, SPEAR1340_CEC1_CLK_ENB, 0,
939*4882a593Smuzhiyun 			&_lock);
940*4882a593Smuzhiyun 	clk_register_clkdev(clk, NULL, "spear_cec.1");
941*4882a593Smuzhiyun 
942*4882a593Smuzhiyun 	clk = clk_register_mux(NULL, "spdif_out_mclk", spdif_out_parents,
943*4882a593Smuzhiyun 			ARRAY_SIZE(spdif_out_parents),
944*4882a593Smuzhiyun 			CLK_SET_RATE_PARENT | CLK_SET_RATE_NO_REPARENT,
945*4882a593Smuzhiyun 			SPEAR1340_PERIP_CLK_CFG, SPEAR1340_SPDIF_OUT_CLK_SHIFT,
946*4882a593Smuzhiyun 			SPEAR1340_SPDIF_CLK_MASK, 0, &_lock);
947*4882a593Smuzhiyun 	clk_register_clkdev(clk, "spdif_out_mclk", NULL);
948*4882a593Smuzhiyun 
949*4882a593Smuzhiyun 	clk = clk_register_gate(NULL, "spdif_out_clk", "spdif_out_mclk",
950*4882a593Smuzhiyun 			CLK_SET_RATE_PARENT, SPEAR1340_PERIP3_CLK_ENB,
951*4882a593Smuzhiyun 			SPEAR1340_SPDIF_OUT_CLK_ENB, 0, &_lock);
952*4882a593Smuzhiyun 	clk_register_clkdev(clk, NULL, "d0000000.spdif-out");
953*4882a593Smuzhiyun 
954*4882a593Smuzhiyun 	clk = clk_register_mux(NULL, "spdif_in_mclk", spdif_in_parents,
955*4882a593Smuzhiyun 			ARRAY_SIZE(spdif_in_parents),
956*4882a593Smuzhiyun 			CLK_SET_RATE_PARENT | CLK_SET_RATE_NO_REPARENT,
957*4882a593Smuzhiyun 			SPEAR1340_PERIP_CLK_CFG, SPEAR1340_SPDIF_IN_CLK_SHIFT,
958*4882a593Smuzhiyun 			SPEAR1340_SPDIF_CLK_MASK, 0, &_lock);
959*4882a593Smuzhiyun 	clk_register_clkdev(clk, "spdif_in_mclk", NULL);
960*4882a593Smuzhiyun 
961*4882a593Smuzhiyun 	clk = clk_register_gate(NULL, "spdif_in_clk", "spdif_in_mclk",
962*4882a593Smuzhiyun 			CLK_SET_RATE_PARENT, SPEAR1340_PERIP3_CLK_ENB,
963*4882a593Smuzhiyun 			SPEAR1340_SPDIF_IN_CLK_ENB, 0, &_lock);
964*4882a593Smuzhiyun 	clk_register_clkdev(clk, NULL, "d0100000.spdif-in");
965*4882a593Smuzhiyun 
966*4882a593Smuzhiyun 	clk = clk_register_gate(NULL, "acp_clk", "ahb_clk", 0,
967*4882a593Smuzhiyun 			SPEAR1340_PERIP2_CLK_ENB, SPEAR1340_ACP_CLK_ENB, 0,
968*4882a593Smuzhiyun 			&_lock);
969*4882a593Smuzhiyun 	clk_register_clkdev(clk, NULL, "acp_clk");
970*4882a593Smuzhiyun 
971*4882a593Smuzhiyun 	clk = clk_register_gate(NULL, "plgpio_clk", "ahb_clk", 0,
972*4882a593Smuzhiyun 			SPEAR1340_PERIP3_CLK_ENB, SPEAR1340_PLGPIO_CLK_ENB, 0,
973*4882a593Smuzhiyun 			&_lock);
974*4882a593Smuzhiyun 	clk_register_clkdev(clk, NULL, "e2800000.gpio");
975*4882a593Smuzhiyun 
976*4882a593Smuzhiyun 	clk = clk_register_gate(NULL, "video_dec_clk", "ahb_clk", 0,
977*4882a593Smuzhiyun 			SPEAR1340_PERIP3_CLK_ENB, SPEAR1340_VIDEO_DEC_CLK_ENB,
978*4882a593Smuzhiyun 			0, &_lock);
979*4882a593Smuzhiyun 	clk_register_clkdev(clk, NULL, "video_dec");
980*4882a593Smuzhiyun 
981*4882a593Smuzhiyun 	clk = clk_register_gate(NULL, "video_enc_clk", "ahb_clk", 0,
982*4882a593Smuzhiyun 			SPEAR1340_PERIP3_CLK_ENB, SPEAR1340_VIDEO_ENC_CLK_ENB,
983*4882a593Smuzhiyun 			0, &_lock);
984*4882a593Smuzhiyun 	clk_register_clkdev(clk, NULL, "video_enc");
985*4882a593Smuzhiyun 
986*4882a593Smuzhiyun 	clk = clk_register_gate(NULL, "video_in_clk", "ahb_clk", 0,
987*4882a593Smuzhiyun 			SPEAR1340_PERIP3_CLK_ENB, SPEAR1340_VIDEO_IN_CLK_ENB, 0,
988*4882a593Smuzhiyun 			&_lock);
989*4882a593Smuzhiyun 	clk_register_clkdev(clk, NULL, "spear_vip");
990*4882a593Smuzhiyun 
991*4882a593Smuzhiyun 	clk = clk_register_gate(NULL, "cam0_clk", "ahb_clk", 0,
992*4882a593Smuzhiyun 			SPEAR1340_PERIP3_CLK_ENB, SPEAR1340_CAM0_CLK_ENB, 0,
993*4882a593Smuzhiyun 			&_lock);
994*4882a593Smuzhiyun 	clk_register_clkdev(clk, NULL, "d0200000.cam0");
995*4882a593Smuzhiyun 
996*4882a593Smuzhiyun 	clk = clk_register_gate(NULL, "cam1_clk", "ahb_clk", 0,
997*4882a593Smuzhiyun 			SPEAR1340_PERIP3_CLK_ENB, SPEAR1340_CAM1_CLK_ENB, 0,
998*4882a593Smuzhiyun 			&_lock);
999*4882a593Smuzhiyun 	clk_register_clkdev(clk, NULL, "d0300000.cam1");
1000*4882a593Smuzhiyun 
1001*4882a593Smuzhiyun 	clk = clk_register_gate(NULL, "cam2_clk", "ahb_clk", 0,
1002*4882a593Smuzhiyun 			SPEAR1340_PERIP3_CLK_ENB, SPEAR1340_CAM2_CLK_ENB, 0,
1003*4882a593Smuzhiyun 			&_lock);
1004*4882a593Smuzhiyun 	clk_register_clkdev(clk, NULL, "d0400000.cam2");
1005*4882a593Smuzhiyun 
1006*4882a593Smuzhiyun 	clk = clk_register_gate(NULL, "cam3_clk", "ahb_clk", 0,
1007*4882a593Smuzhiyun 			SPEAR1340_PERIP3_CLK_ENB, SPEAR1340_CAM3_CLK_ENB, 0,
1008*4882a593Smuzhiyun 			&_lock);
1009*4882a593Smuzhiyun 	clk_register_clkdev(clk, NULL, "d0500000.cam3");
1010*4882a593Smuzhiyun 
1011*4882a593Smuzhiyun 	clk = clk_register_gate(NULL, "pwm_clk", "ahb_clk", 0,
1012*4882a593Smuzhiyun 			SPEAR1340_PERIP3_CLK_ENB, SPEAR1340_PWM_CLK_ENB, 0,
1013*4882a593Smuzhiyun 			&_lock);
1014*4882a593Smuzhiyun 	clk_register_clkdev(clk, NULL, "e0180000.pwm");
1015*4882a593Smuzhiyun }
1016