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