blob: 3cb3ea42ab6ca77295efc3457632af38a9b5165f [file] [log] [blame]
Syed Rameez Mustafa3971c142013-01-09 19:04:53 -08001/* Copyright (c) 2012-2013, The Linux Foundation. All rights reserved.
Vikram Mulukutlab13abe42012-10-03 11:38:48 -07002 *
3 * This program is free software; you can redistribute it and/or modify
4 * it under the terms of the GNU General Public License version 2 and
5 * only version 2 as published by the Free Software Foundation.
6 *
7 * This program is distributed in the hope that it will be useful,
8 * but WITHOUT ANY WARRANTY; without even the implied warranty of
9 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
10 * GNU General Public License for more details.
11 */
12
13#include <linux/kernel.h>
14#include <linux/init.h>
15#include <linux/err.h>
16#include <linux/ctype.h>
17#include <linux/io.h>
18#include <linux/spinlock.h>
19#include <linux/delay.h>
20#include <linux/clk.h>
21#include <linux/iopoll.h>
Vikram Mulukutlaf7c52d32013-01-31 11:39:58 -080022#include <linux/regulator/consumer.h>
Vikram Mulukutlab13abe42012-10-03 11:38:48 -070023
24#include <mach/rpm-regulator-smd.h>
25#include <mach/socinfo.h>
26#include <mach/rpm-smd.h>
27
28#include "clock-local2.h"
29#include "clock-pll.h"
30#include "clock-rpm.h"
31#include "clock-voter.h"
32#include "clock.h"
33
34enum {
35 GCC_BASE,
36 MMSS_BASE,
37 LPASS_BASE,
38 APCS_BASE,
Vikram Mulukutla4157cca2013-01-24 15:42:41 -080039 APCS_PLL_BASE,
Vikram Mulukutlab13abe42012-10-03 11:38:48 -070040 N_BASES,
41};
42
43static void __iomem *virt_bases[N_BASES];
44
45#define GCC_REG_BASE(x) (void __iomem *)(virt_bases[GCC_BASE] + (x))
46#define MMSS_REG_BASE(x) (void __iomem *)(virt_bases[MMSS_BASE] + (x))
47#define LPASS_REG_BASE(x) (void __iomem *)(virt_bases[LPASS_BASE] + (x))
48#define APCS_REG_BASE(x) (void __iomem *)(virt_bases[APCS_BASE] + (x))
49
50#define GPLL0_MODE 0x0000
51#define GPLL0_L_VAL 0x0004
52#define GPLL0_M_VAL 0x0008
53#define GPLL0_N_VAL 0x000C
54#define GPLL0_USER_CTL 0x0010
55#define GPLL0_STATUS 0x001C
56#define GPLL2_MODE 0x0080
57#define GPLL2_L_VAL 0x0084
58#define GPLL2_M_VAL 0x0088
59#define GPLL2_N_VAL 0x008C
60#define GPLL2_USER_CTL 0x0090
61#define GPLL2_STATUS 0x009C
62#define CONFIG_NOC_BCR 0x0140
63#define MMSS_BCR 0x0240
64#define MMSS_NOC_CFG_AHB_CBCR 0x024C
65#define MSS_CFG_AHB_CBCR 0x0280
66#define MSS_Q6_BIMC_AXI_CBCR 0x0284
67#define USB_HS_BCR 0x0480
68#define USB_HS_SYSTEM_CBCR 0x0484
69#define USB_HS_AHB_CBCR 0x0488
70#define USB_HS_SYSTEM_CMD_RCGR 0x0490
71#define USB2A_PHY_BCR 0x04A8
72#define USB2A_PHY_SLEEP_CBCR 0x04AC
73#define SDCC1_BCR 0x04C0
74#define SDCC1_APPS_CMD_RCGR 0x04D0
75#define SDCC1_APPS_CBCR 0x04C4
76#define SDCC1_AHB_CBCR 0x04C8
77#define SDCC2_BCR 0x0500
78#define SDCC2_APPS_CMD_RCGR 0x0510
79#define SDCC2_APPS_CBCR 0x0504
80#define SDCC2_AHB_CBCR 0x0508
81#define BLSP1_BCR 0x05C0
82#define BLSP1_AHB_CBCR 0x05C4
83#define BLSP1_QUP1_BCR 0x0640
84#define BLSP1_QUP1_SPI_APPS_CBCR 0x0644
85#define BLSP1_QUP1_I2C_APPS_CBCR 0x0648
86#define BLSP1_QUP1_SPI_APPS_CMD_RCGR 0x064C
87#define BLSP1_UART1_BCR 0x0680
88#define BLSP1_UART1_APPS_CBCR 0x0684
89#define BLSP1_UART1_SIM_CBCR 0x0688
90#define BLSP1_UART1_APPS_CMD_RCGR 0x068C
91#define BLSP1_QUP2_BCR 0x06C0
92#define BLSP1_QUP2_SPI_APPS_CBCR 0x06C4
93#define BLSP1_QUP2_I2C_APPS_CBCR 0x06C8
94#define BLSP1_QUP2_SPI_APPS_CMD_RCGR 0x06CC
95#define BLSP1_UART2_BCR 0x0700
96#define BLSP1_UART2_APPS_CBCR 0x0704
97#define BLSP1_UART2_SIM_CBCR 0x0708
98#define BLSP1_UART2_APPS_CMD_RCGR 0x070C
99#define BLSP1_QUP3_BCR 0x0740
100#define BLSP1_QUP3_SPI_APPS_CBCR 0x0744
101#define BLSP1_QUP3_I2C_APPS_CBCR 0x0748
102#define BLSP1_QUP3_SPI_APPS_CMD_RCGR 0x074C
103#define BLSP1_UART3_BCR 0x0780
104#define BLSP1_UART3_APPS_CBCR 0x0784
105#define BLSP1_UART3_SIM_CBCR 0x0788
106#define BLSP1_UART3_APPS_CMD_RCGR 0x078C
107#define BLSP1_QUP4_BCR 0x07C0
108#define BLSP1_QUP4_SPI_APPS_CBCR 0x07C4
109#define BLSP1_QUP4_I2C_APPS_CBCR 0x07C8
110#define BLSP1_QUP4_SPI_APPS_CMD_RCGR 0x07CC
111#define BLSP1_UART4_BCR 0x0800
112#define BLSP1_UART4_APPS_CBCR 0x0804
113#define BLSP1_UART4_SIM_CBCR 0x0808
114#define BLSP1_UART4_APPS_CMD_RCGR 0x080C
115#define BLSP1_QUP5_BCR 0x0840
116#define BLSP1_QUP5_SPI_APPS_CBCR 0x0844
117#define BLSP1_QUP5_I2C_APPS_CBCR 0x0848
118#define BLSP1_QUP5_SPI_APPS_CMD_RCGR 0x084C
119#define BLSP1_UART5_BCR 0x0880
120#define BLSP1_UART5_APPS_CBCR 0x0884
121#define BLSP1_UART5_SIM_CBCR 0x0888
122#define BLSP1_UART5_APPS_CMD_RCGR 0x088C
123#define BLSP1_QUP6_BCR 0x08C0
124#define BLSP1_QUP6_SPI_APPS_CBCR 0x08C4
125#define BLSP1_QUP6_I2C_APPS_CBCR 0x08C8
126#define BLSP1_QUP6_SPI_APPS_CMD_RCGR 0x08CC
127#define BLSP1_UART6_BCR 0x0900
128#define BLSP1_UART6_APPS_CBCR 0x0904
129#define BLSP1_UART6_SIM_CBCR 0x0908
130#define BLSP1_UART6_APPS_CMD_RCGR 0x090C
131#define PDM_BCR 0x0CC0
132#define PDM_AHB_CBCR 0x0CC4
133#define PDM2_CBCR 0x0CCC
134#define PDM2_CMD_RCGR 0x0CD0
135#define PRNG_BCR 0x0D00
136#define PRNG_AHB_CBCR 0x0D04
137#define BOOT_ROM_BCR 0x0E00
138#define BOOT_ROM_AHB_CBCR 0x0E04
139#define CE1_BCR 0x1040
140#define CE1_CMD_RCGR 0x1050
141#define CE1_CBCR 0x1044
142#define CE1_AXI_CBCR 0x1048
143#define CE1_AHB_CBCR 0x104C
144#define COPSS_SMMU_AHB_CBCR 0x015C
145#define LPSS_SMMU_AHB_CBCR 0x0158
Vikram Mulukutla55318acb2013-04-15 17:47:34 -0700146#define BIMC_SMMU_CBCR 0x1120
Vikram Mulukutlab13abe42012-10-03 11:38:48 -0700147#define LPASS_Q6_AXI_CBCR 0x11C0
148#define APCS_GPLL_ENA_VOTE 0x1480
149#define APCS_CLOCK_BRANCH_ENA_VOTE 0x1484
150#define APCS_CLOCK_SLEEP_ENA_VOTE 0x1488
151#define GP1_CBCR 0x1900
152#define GP1_CMD_RCGR 0x1904
153#define GP2_CBCR 0x1940
154#define GP2_CMD_RCGR 0x1944
155#define GP3_CBCR 0x1980
156#define GP3_CMD_RCGR 0x1984
157#define XO_CBCR 0x0034
158
159#define MMPLL0_PLL_MODE 0x0000
160#define MMPLL0_PLL_L_VAL 0x0004
161#define MMPLL0_PLL_M_VAL 0x0008
162#define MMPLL0_PLL_N_VAL 0x000C
163#define MMPLL0_PLL_USER_CTL 0x0010
164#define MMPLL0_PLL_STATUS 0x001C
165#define MMSS_PLL_VOTE_APCS_REG 0x0100
166#define MMPLL1_PLL_MODE 0x4100
167#define MMPLL1_PLL_L_VAL 0x4104
168#define MMPLL1_PLL_M_VAL 0x4108
169#define MMPLL1_PLL_N_VAL 0x410C
170#define MMPLL1_PLL_USER_CTL 0x4110
171#define MMPLL1_PLL_STATUS 0x411C
172#define DSI_PCLK_CMD_RCGR 0x2000
173#define DSI_CMD_RCGR 0x2020
174#define MDP_VSYNC_CMD_RCGR 0x2080
175#define DSI_BYTE_CMD_RCGR 0x2120
176#define DSI_ESC_CMD_RCGR 0x2160
177#define DSI_BCR 0x2200
178#define DSI_BYTE_BCR 0x2204
179#define DSI_ESC_BCR 0x2208
180#define DSI_AHB_BCR 0x220C
181#define DSI_PCLK_BCR 0x2214
182#define MDP_LCDC_BCR 0x2218
183#define MDP_DSI_BCR 0x221C
184#define MDP_VSYNC_BCR 0x2220
185#define MDP_AXI_BCR 0x2224
186#define MDP_AHB_BCR 0x2228
187#define MDP_AXI_CBCR 0x2314
188#define MDP_VSYNC_CBCR 0x231C
189#define MDP_AHB_CBCR 0x2318
190#define DSI_PCLK_CBCR 0x233C
191#define GMEM_GFX3D_CBCR 0x4038
192#define MDP_LCDC_CBCR 0x2340
193#define MDP_DSI_CBCR 0x2320
194#define DSI_CBCR 0x2324
195#define DSI_BYTE_CBCR 0x2328
196#define DSI_ESC_CBCR 0x232C
197#define DSI_AHB_CBCR 0x2330
198#define CSI0PHYTIMER_CMD_RCGR 0x3000
199#define CSI0PHYTIMER_BCR 0x3020
200#define CSI0PHYTIMER_CBCR 0x3024
201#define CSI1PHYTIMER_CMD_RCGR 0x3030
202#define CSI1PHYTIMER_BCR 0x3050
203#define CSI1PHYTIMER_CBCR 0x3054
204#define CSI0_CMD_RCGR 0x3090
205#define CSI0_BCR 0x30B0
206#define CSI0_CBCR 0x30B4
207#define CSI_AHB_BCR 0x30B8
208#define CSI_AHB_CBCR 0x30BC
209#define CSI0PHY_BCR 0x30C0
210#define CSI0PHY_CBCR 0x30C4
211#define CSI0RDI_BCR 0x30D0
212#define CSI0RDI_CBCR 0x30D4
213#define CSI0PIX_BCR 0x30E0
214#define CSI0PIX_CBCR 0x30E4
215#define CSI1_CMD_RCGR 0x3100
216#define CSI1_BCR 0x3120
217#define CSI1_CBCR 0x3124
218#define CSI1PHY_BCR 0x3130
219#define CSI1PHY_CBCR 0x3134
220#define CSI1RDI_BCR 0x3140
221#define CSI1RDI_CBCR 0x3144
222#define CSI1PIX_BCR 0x3150
223#define CSI1PIX_CBCR 0x3154
224#define MCLK0_CMD_RCGR 0x3360
225#define MCLK0_BCR 0x3380
226#define MCLK0_CBCR 0x3384
227#define MCLK1_CMD_RCGR 0x3390
228#define MCLK1_BCR 0x33B0
229#define MCLK1_CBCR 0x33B4
230#define VFE_CMD_RCGR 0x3600
231#define VFE_BCR 0x36A0
232#define VFE_AHB_BCR 0x36AC
233#define VFE_AXI_BCR 0x36B0
234#define VFE_CBCR 0x36A8
235#define VFE_AHB_CBCR 0x36B8
236#define VFE_AXI_CBCR 0x36BC
237#define CSI_VFE_BCR 0x3700
238#define CSI_VFE_CBCR 0x3704
239#define GFX3D_CMD_RCGR 0x4000
240#define OXILI_GFX3D_CBCR 0x4028
241#define OXILI_GFX3D_BCR 0x4030
242#define OXILI_AHB_BCR 0x4044
243#define OXILI_AHB_CBCR 0x403C
244#define AHB_CMD_RCGR 0x5000
245#define MMSSNOCAHB_BCR 0x5020
246#define MMSSNOCAHB_BTO_BCR 0x5030
247#define MMSS_MISC_AHB_BCR 0x5034
248#define MMSS_MMSSNOC_AHB_CBCR 0x5024
249#define MMSS_MMSSNOC_BTO_AHB_CBCR 0x5028
250#define MMSS_MISC_AHB_CBCR 0x502C
251#define AXI_CMD_RCGR 0x5040
252#define MMSSNOCAXI_BCR 0x5060
253#define MMSS_S0_AXI_BCR 0x5068
254#define MMSS_S0_AXI_CBCR 0x5064
255#define MMSS_MMSSNOC_AXI_CBCR 0x506C
256#define BIMC_GFX_BCR 0x5090
257#define BIMC_GFX_CBCR 0x5094
258
259#define AUDIO_CORE_GDSCR 0x7000
260#define SPDM_BCR 0x1000
261#define LPAAUDIO_PLL_MODE 0x0000
262#define LPAAUDIO_PLL_L_VAL 0x0004
263#define LPAAUDIO_PLL_M_VAL 0x0008
264#define LPAAUDIO_PLL_N_VAL 0x000C
265#define LPAAUDIO_PLL_USER_CTL 0x0010
266#define LPAAUDIO_PLL_STATUS 0x001C
267#define LPAQ6_PLL_MODE 0x1000
268#define LPAQ6_PLL_USER_CTL 0x1010
269#define LPAQ6_PLL_STATUS 0x101C
270#define LPA_PLL_VOTE_APPS 0x2000
271#define AUDIO_CORE_BCR_SLP_CBCR 0x4004
272#define Q6SS_BCR_SLP_CBCR 0x6004
273#define AUDIO_CORE_GDSC_XO_CBCR 0x7004
274#define AUDIO_CORE_LPAIF_DMA_CBCR 0x9000
275#define AUDIO_CORE_LPAIF_CSR_CBCR 0x9004
276#define LPAIF_SPKR_CMD_RCGR 0xA000
277#define AUDIO_CORE_LPAIF_CODEC_SPKR_OSR_CBCR 0xA014
278#define AUDIO_CORE_LPAIF_CODEC_SPKR_IBIT_CBCR 0xA018
279#define AUDIO_CORE_LPAIF_CODEC_SPKR_EBIT_CBCR 0xA01C
280#define LPAIF_PRI_CMD_RCGR 0xB000
281#define AUDIO_CORE_LPAIF_PRI_OSR_CBCR 0xB014
282#define AUDIO_CORE_LPAIF_PRI_IBIT_CBCR 0xB018
283#define AUDIO_CORE_LPAIF_PRI_EBIT_CBCR 0xB01C
284#define LPAIF_SEC_CMD_RCGR 0xC000
285#define AUDIO_CORE_LPAIF_SEC_OSR_CBCR 0xC014
286#define AUDIO_CORE_LPAIF_SEC_IBIT_CBCR 0xC018
287#define AUDIO_CORE_LPAIF_SEC_EBIT_CBCR 0xC01C
288#define LPAIF_TER_CMD_RCGR 0xD000
289#define AUDIO_CORE_LPAIF_TER_OSR_CBCR 0xD014
290#define AUDIO_CORE_LPAIF_TER_IBIT_CBCR 0xD018
291#define AUDIO_CORE_LPAIF_TER_EBIT_CBCR 0xD01C
292#define LPAIF_QUAD_CMD_RCGR 0xE000
293#define AUDIO_CORE_LPAIF_QUAD_OSR_CBCR 0xE014
294#define AUDIO_CORE_LPAIF_QUAD_IBIT_CBCR 0xE018
295#define AUDIO_CORE_LPAIF_QUAD_EBIT_CBCR 0xE01C
296#define LPAIF_PCM0_CMD_RCGR 0xF000
297#define AUDIO_CORE_LPAIF_PCM0_IBIT_CBCR 0xF014
298#define AUDIO_CORE_LPAIF_PCM0_EBIT_CBCR 0xF018
299#define LPAIF_PCM1_CMD_RCGR 0x10000
300#define AUDIO_CORE_LPAIF_PCM1_IBIT_CBCR 0x10014
301#define AUDIO_CORE_LPAIF_PCM1_EBIT_CBCR 0x10018
302#define SLIMBUS_CMD_RCGR 0x12000
303#define AUDIO_CORE_SLIMBUS_CORE_CBCR 0x12014
304#define LPAIF_PCMOE_CMD_RCGR 0x13000
305#define AUDIO_CORE_LPAIF_PCM_DATA_OE_CBCR 0x13014
306#define Q6CORE_CMD_RCGR 0x14000
307#define SLEEP_CMD_RCGR 0x15000
308#define SPDM_CMD_RCGR 0x16000
309#define AUDIO_WRAPPER_SPDM_CBCR 0x16014
310#define XO_CMD_RCGR 0x17000
311#define AHBFABRIC_CMD_RCGR 0x18000
312#define AUDIO_CORE_LPM_CBCR 0x19000
313#define AUDIO_CORE_AVSYNC_CSR_CBCR 0x1A000
314#define AUDIO_CORE_AVSYNC_XO_CBCR 0x1A004
315#define AUDIO_CORE_AVSYNC_BT_XO_CBCR 0x1A008
316#define AUDIO_CORE_AVSYNC_FM_XO_CBCR 0x1A00C
317#define AUDIO_CORE_IXFABRIC_CBCR 0x1B000
318#define AUDIO_WRAPPER_EFABRIC_CBCR 0x1B004
319#define AUDIO_CORE_TCM_SLAVE_CBCR 0x1C000
320#define AUDIO_CORE_CSR_CBCR 0x1D000
321#define AUDIO_CORE_DML_CBCR 0x1E000
322#define AUDIO_CORE_SYSNOC_CBCR 0x1F000
323#define AUDIO_WRAPPER_SYSNOC_SWAY_CBCR 0x1F004
324#define AUDIO_CORE_TIMEOUT_CBCR 0x20000
325#define AUDIO_WRAPPER_TIMEOUT_CBCR 0x20004
326#define AUDIO_CORE_SECURITY_CBCR 0x21000
327#define AUDIO_WRAPPER_SECURITY_CBCR 0x21004
328#define Q6SS_AHB_LFABIF_CBCR 0x22000
329#define Q6SS_AHBM_CBCR 0x22004
330#define AUDIO_WRAPPER_LCC_CSR_CBCR 0x23000
331#define AUDIO_WRAPPER_BR_CBCR 0x24000
332#define AUDIO_WRAPPER_SMEM_CBCR 0x25000
333#define Q6SS_XO_CBCR 0x26000
334#define Q6SS_SLP_CBCR 0x26004
335#define LPASS_Q6SS_BCR 0x6000
336#define AUDIO_WRAPPER_STM_XO_CBCR 0x27000
337#define AUDIO_CORE_IXFABRIC_SPDMTM_CSR_CBCR 0x28000
338#define AUDIO_WRAPPER_EFABRIC_SPDMTM_CSR_CBCR 0x28004
339
340/* Mux source select values */
341#define gcc_xo_source_val 0
342#define gpll0_source_val 1
343#define gnd_source_val 5
344#define mmpll0_mm_source_val 1
345#define mmpll1_mm_source_val 2
346#define gpll0_mm_source_val 5
347#define gcc_xo_mm_source_val 0
348#define mm_gnd_source_val 6
Vikram Mulukutlab13abe42012-10-03 11:38:48 -0700349#define dsipll_mm_source_val 1
350
351#define F(f, s, div, m, n) \
352 { \
353 .freq_hz = (f), \
354 .src_clk = &s##_clk_src.c, \
355 .m_val = (m), \
356 .n_val = ~((n)-(m)) * !!(n), \
357 .d_val = ~(n),\
358 .div_src_val = BVAL(4, 0, (int)(2*(div) - 1)) \
359 | BVAL(10, 8, s##_source_val), \
360 }
361
Vikram Mulukutla4157cca2013-01-24 15:42:41 -0800362#define F_APCS_PLL(f, l, m, n, pre_div, post_div, vco) \
363 { \
364 .freq_hz = (f), \
365 .l_val = (l), \
366 .m_val = (m), \
367 .n_val = (n), \
368 .pre_div_val = BVAL(12, 12, (pre_div)), \
369 .post_div_val = BVAL(9, 8, (post_div)), \
370 .vco_val = BVAL(29, 28, (vco)), \
371 }
372
Vikram Mulukutlab13abe42012-10-03 11:38:48 -0700373#define F_MM(f, s, div, m, n) \
374 { \
375 .freq_hz = (f), \
376 .src_clk = &s##_clk_src.c, \
377 .m_val = (m), \
378 .n_val = ~((n)-(m)) * !!(n), \
379 .d_val = ~(n),\
380 .div_src_val = BVAL(4, 0, (int)(2*(div) - 1)) \
381 | BVAL(10, 8, s##_mm_source_val), \
382 }
383
384#define F_HDMI(f, s, div, m, n) \
385 { \
386 .freq_hz = (f), \
387 .src_clk = &s##_clk_src, \
388 .m_val = (m), \
389 .n_val = ~((n)-(m)) * !!(n), \
390 .d_val = ~(n),\
391 .div_src_val = BVAL(4, 0, (int)(2*(div) - 1)) \
392 | BVAL(10, 8, s##_mm_source_val), \
393 }
394
395#define F_MDSS(f, s, div, m, n) \
396 { \
397 .freq_hz = (f), \
398 .m_val = (m), \
399 .n_val = ~((n)-(m)) * !!(n), \
400 .d_val = ~(n),\
401 .div_src_val = BVAL(4, 0, (int)(2*(div) - 1)) \
402 | BVAL(10, 8, s##_mm_source_val), \
403 }
404
Vikram Mulukutlab13abe42012-10-03 11:38:48 -0700405#define VDD_DIG_FMAX_MAP1(l1, f1) \
406 .vdd_class = &vdd_dig, \
407 .fmax = (unsigned long[VDD_DIG_NUM]) { \
408 [VDD_DIG_##l1] = (f1), \
409 }, \
410 .num_fmax = VDD_DIG_NUM
411#define VDD_DIG_FMAX_MAP2(l1, f1, l2, f2) \
412 .vdd_class = &vdd_dig, \
413 .fmax = (unsigned long[VDD_DIG_NUM]) { \
414 [VDD_DIG_##l1] = (f1), \
415 [VDD_DIG_##l2] = (f2), \
416 }, \
417 .num_fmax = VDD_DIG_NUM
418#define VDD_DIG_FMAX_MAP3(l1, f1, l2, f2, l3, f3) \
419 .vdd_class = &vdd_dig, \
420 .fmax = (unsigned long[VDD_DIG_NUM]) { \
421 [VDD_DIG_##l1] = (f1), \
422 [VDD_DIG_##l2] = (f2), \
423 [VDD_DIG_##l3] = (f3), \
424 }, \
425 .num_fmax = VDD_DIG_NUM
426
427enum vdd_dig_levels {
428 VDD_DIG_NONE,
429 VDD_DIG_LOW,
430 VDD_DIG_NOMINAL,
431 VDD_DIG_HIGH,
432 VDD_DIG_NUM
433};
434
Patrick Dalyebc26bc2013-02-05 11:49:07 -0800435static const int *vdd_corner[] = {
436 [VDD_DIG_NONE] = VDD_UV(RPM_REGULATOR_CORNER_NONE),
437 [VDD_DIG_LOW] = VDD_UV(RPM_REGULATOR_CORNER_SVS_SOC),
438 [VDD_DIG_NOMINAL] = VDD_UV(RPM_REGULATOR_CORNER_NORMAL),
439 [VDD_DIG_HIGH] = VDD_UV(RPM_REGULATOR_CORNER_SUPER_TURBO),
Vikram Mulukutlab13abe42012-10-03 11:38:48 -0700440};
441
Patrick Dalyebc26bc2013-02-05 11:49:07 -0800442static DEFINE_VDD_REGULATORS(vdd_dig, VDD_DIG_NUM, 1, vdd_corner);
Vikram Mulukutlab13abe42012-10-03 11:38:48 -0700443
444#define RPM_MISC_CLK_TYPE 0x306b6c63
445#define RPM_BUS_CLK_TYPE 0x316b6c63
446#define RPM_MEM_CLK_TYPE 0x326b6c63
447
448#define RPM_SMD_KEY_ENABLE 0x62616E45
449
450#define CXO_ID 0x0
451#define QDSS_ID 0x1
452#define RPM_SCALING_ENABLE_ID 0x2
453
454#define PNOC_ID 0x0
455#define SNOC_ID 0x1
456#define CNOC_ID 0x2
457#define MMSSNOC_AHB_ID 0x3
458
459#define BIMC_ID 0x0
460#define OXILI_ID 0x1
461#define OCMEM_ID 0x2
462
463#define D0_ID 1
464#define D1_ID 2
Vikram Mulukutla7e5b3112013-04-15 16:32:40 -0700465#define A0_ID 4
466#define A1_ID 5
467#define A2_ID 6
Vikram Mulukutlab13abe42012-10-03 11:38:48 -0700468#define DIFF_CLK_ID 7
469#define DIV_CLK_ID 11
470
471DEFINE_CLK_RPM_SMD(pnoc_clk, pnoc_a_clk, RPM_BUS_CLK_TYPE, PNOC_ID, NULL);
472DEFINE_CLK_RPM_SMD(snoc_clk, snoc_a_clk, RPM_BUS_CLK_TYPE, SNOC_ID, NULL);
473DEFINE_CLK_RPM_SMD(cnoc_clk, cnoc_a_clk, RPM_BUS_CLK_TYPE, CNOC_ID, NULL);
474DEFINE_CLK_RPM_SMD(mmssnoc_ahb_clk, mmssnoc_ahb_a_clk, RPM_BUS_CLK_TYPE,
475 MMSSNOC_AHB_ID, NULL);
476
477DEFINE_CLK_RPM_SMD(bimc_clk, bimc_a_clk, RPM_MEM_CLK_TYPE, BIMC_ID, NULL);
478
479DEFINE_CLK_RPM_SMD_BRANCH(gcc_xo_clk_src, gcc_xo_a_clk_src,
480 RPM_MISC_CLK_TYPE, CXO_ID, 19200000);
481DEFINE_CLK_RPM_SMD_QDSS(qdss_clk, qdss_a_clk, RPM_MISC_CLK_TYPE, QDSS_ID);
482
483DEFINE_CLK_RPM_SMD_XO_BUFFER(cxo_d0, cxo_d0_a, D0_ID);
484DEFINE_CLK_RPM_SMD_XO_BUFFER(cxo_d1, cxo_d1_a, D1_ID);
485DEFINE_CLK_RPM_SMD_XO_BUFFER(cxo_a0, cxo_a0_a, A0_ID);
486DEFINE_CLK_RPM_SMD_XO_BUFFER(cxo_a1, cxo_a1_a, A1_ID);
487DEFINE_CLK_RPM_SMD_XO_BUFFER(cxo_a2, cxo_a2_a, A2_ID);
488DEFINE_CLK_RPM_SMD_XO_BUFFER(div_clk, div_a_clk, DIV_CLK_ID);
489DEFINE_CLK_RPM_SMD_XO_BUFFER(diff_clk, diff_a_clk, DIFF_CLK_ID);
490
491DEFINE_CLK_RPM_SMD_XO_BUFFER_PINCTRL(cxo_d0_pin, cxo_d0_a_pin, D0_ID);
492DEFINE_CLK_RPM_SMD_XO_BUFFER_PINCTRL(cxo_d1_pin, cxo_d1_a_pin, D1_ID);
493DEFINE_CLK_RPM_SMD_XO_BUFFER_PINCTRL(cxo_a0_pin, cxo_a0_a_pin, A0_ID);
494DEFINE_CLK_RPM_SMD_XO_BUFFER_PINCTRL(cxo_a1_pin, cxo_a1_a_pin, A1_ID);
495DEFINE_CLK_RPM_SMD_XO_BUFFER_PINCTRL(cxo_a2_pin, cxo_a2_a_pin, A2_ID);
496
497static DEFINE_CLK_VOTER(pnoc_msmbus_clk, &pnoc_clk.c, LONG_MAX);
498static DEFINE_CLK_VOTER(snoc_msmbus_clk, &snoc_clk.c, LONG_MAX);
499static DEFINE_CLK_VOTER(cnoc_msmbus_clk, &cnoc_clk.c, LONG_MAX);
500static DEFINE_CLK_VOTER(pnoc_msmbus_a_clk, &pnoc_a_clk.c, LONG_MAX);
501static DEFINE_CLK_VOTER(snoc_msmbus_a_clk, &snoc_a_clk.c, LONG_MAX);
502static DEFINE_CLK_VOTER(cnoc_msmbus_a_clk, &cnoc_a_clk.c, LONG_MAX);
503
504static DEFINE_CLK_VOTER(bimc_msmbus_clk, &bimc_clk.c, LONG_MAX);
505static DEFINE_CLK_VOTER(bimc_msmbus_a_clk, &bimc_a_clk.c, LONG_MAX);
506static DEFINE_CLK_VOTER(bimc_acpu_a_clk, &bimc_a_clk.c, LONG_MAX);
507
508static DEFINE_CLK_VOTER(pnoc_sps_clk, &pnoc_clk.c, LONG_MAX);
509static DEFINE_CLK_VOTER(pnoc_iommu_clk, &pnoc_clk.c, LONG_MAX);
510static DEFINE_CLK_VOTER(pnoc_qseecom_clk, &pnoc_clk.c, LONG_MAX);
511
Vikram Mulukutla4157cca2013-01-24 15:42:41 -0800512static DEFINE_CLK_MEASURE(apc0_m_clk);
513static DEFINE_CLK_MEASURE(apc1_m_clk);
514static DEFINE_CLK_MEASURE(apc2_m_clk);
515static DEFINE_CLK_MEASURE(apc3_m_clk);
516static DEFINE_CLK_MEASURE(l2_m_clk);
517
518#define APCS_SH_PLL_MODE 0x000
519#define APCS_SH_PLL_L_VAL 0x004
520#define APCS_SH_PLL_M_VAL 0x008
521#define APCS_SH_PLL_N_VAL 0x00C
522#define APCS_SH_PLL_USER_CTL 0x010
523#define APCS_SH_PLL_CONFIG_CTL 0x014
524#define APCS_SH_PLL_STATUS 0x01C
525
526enum vdd_sr2_pll_levels {
527 VDD_SR2_PLL_OFF,
Patrick Daly6fb589a2013-03-29 17:55:55 -0700528 VDD_SR2_PLL_SVS,
529 VDD_SR2_PLL_NOM,
530 VDD_SR2_PLL_TUR,
Vikram Mulukutla4157cca2013-01-24 15:42:41 -0800531 VDD_SR2_PLL_NUM
532};
533
Patrick Daly6fb589a2013-03-29 17:55:55 -0700534static const int *vdd_sr2_levels[] = {
535 [VDD_SR2_PLL_OFF] = VDD_UV(0, RPM_REGULATOR_CORNER_NONE),
536 [VDD_SR2_PLL_SVS] = VDD_UV(1800000, RPM_REGULATOR_CORNER_SVS_SOC),
537 [VDD_SR2_PLL_NOM] = VDD_UV(1800000, RPM_REGULATOR_CORNER_NORMAL),
538 [VDD_SR2_PLL_TUR] = VDD_UV(1800000, RPM_REGULATOR_CORNER_SUPER_TURBO),
Patrick Dalyebc26bc2013-02-05 11:49:07 -0800539};
Vikram Mulukutla4157cca2013-01-24 15:42:41 -0800540
Patrick Daly6fb589a2013-03-29 17:55:55 -0700541static DEFINE_VDD_REGULATORS(vdd_sr2_pll, VDD_SR2_PLL_NUM, 2, vdd_sr2_levels);
Vikram Mulukutla4157cca2013-01-24 15:42:41 -0800542
543static struct pll_freq_tbl apcs_pll_freq[] = {
544 F_APCS_PLL( 384000000, 20, 0x0, 0x1, 0x0, 0x0, 0x0),
545 F_APCS_PLL( 787200000, 41, 0x0, 0x1, 0x0, 0x0, 0x0),
546 F_APCS_PLL( 998400000, 52, 0x0, 0x1, 0x0, 0x0, 0x0),
547 F_APCS_PLL(1190400000, 62, 0x0, 0x1, 0x0, 0x0, 0x0),
548 PLL_F_END
549};
550
551static struct pll_clk a7sspll = {
552 .mode_reg = (void __iomem *)APCS_SH_PLL_MODE,
553 .l_reg = (void __iomem *)APCS_SH_PLL_L_VAL,
554 .m_reg = (void __iomem *)APCS_SH_PLL_M_VAL,
555 .n_reg = (void __iomem *)APCS_SH_PLL_N_VAL,
556 .config_reg = (void __iomem *)APCS_SH_PLL_USER_CTL,
557 .status_reg = (void __iomem *)APCS_SH_PLL_STATUS,
558 .freq_tbl = apcs_pll_freq,
559 .masks = {
560 .vco_mask = BM(29, 28),
561 .pre_div_mask = BIT(12),
562 .post_div_mask = BM(9, 8),
563 .mn_en_mask = BIT(24),
564 .main_output_mask = BIT(0),
565 },
566 .base = &virt_bases[APCS_PLL_BASE],
567 .c = {
Patrick Daly9bdc8a52013-03-21 19:12:40 -0700568 .parent = &gcc_xo_a_clk_src.c,
Vikram Mulukutla4157cca2013-01-24 15:42:41 -0800569 .dbg_name = "a7sspll",
570 .ops = &clk_ops_sr2_pll,
571 .vdd_class = &vdd_sr2_pll,
572 .fmax = (unsigned long [VDD_SR2_PLL_NUM]) {
Patrick Daly6fb589a2013-03-29 17:55:55 -0700573 [VDD_SR2_PLL_SVS] = 1000000000,
574 [VDD_SR2_PLL_NOM] = 1900000000,
Vikram Mulukutla4157cca2013-01-24 15:42:41 -0800575 },
576 .num_fmax = VDD_SR2_PLL_NUM,
577 CLK_INIT(a7sspll.c),
578 /*
579 * Need to skip handoff of the acpu pll to avoid
580 * turning off the pll when the cpu is using it
581 */
582 .flags = CLKFLAG_SKIP_HANDOFF,
583 },
584};
585
586static unsigned int soft_vote_gpll0;
587
Vikram Mulukutlab13abe42012-10-03 11:38:48 -0700588static struct pll_vote_clk gpll0_clk_src = {
589 .en_reg = (void __iomem *)APCS_GPLL_ENA_VOTE,
590 .en_mask = BIT(0),
591 .status_reg = (void __iomem *)GPLL0_STATUS,
592 .status_mask = BIT(17),
Vikram Mulukutla4157cca2013-01-24 15:42:41 -0800593 .soft_vote = &soft_vote_gpll0,
594 .soft_vote_mask = PLL_SOFT_VOTE_PRIMARY,
Vikram Mulukutlab13abe42012-10-03 11:38:48 -0700595 .base = &virt_bases[GCC_BASE],
596 .c = {
597 .parent = &gcc_xo_clk_src.c,
598 .rate = 600000000,
599 .dbg_name = "gpll0_clk_src",
Vikram Mulukutla4157cca2013-01-24 15:42:41 -0800600 .ops = &clk_ops_pll_acpu_vote,
Vikram Mulukutlab13abe42012-10-03 11:38:48 -0700601 CLK_INIT(gpll0_clk_src.c),
602 },
603};
604
Vikram Mulukutla4157cca2013-01-24 15:42:41 -0800605static struct pll_vote_clk gpll0_ao_clk_src = {
606 .en_reg = (void __iomem *)APCS_GPLL_ENA_VOTE,
607 .en_mask = BIT(0),
608 .status_reg = (void __iomem *)GPLL0_STATUS,
609 .status_mask = BIT(17),
610 .soft_vote = &soft_vote_gpll0,
611 .soft_vote_mask = PLL_SOFT_VOTE_ACPU,
612 .base = &virt_bases[GCC_BASE],
613 .c = {
614 .rate = 600000000,
615 .dbg_name = "gpll0_ao_clk_src",
616 .ops = &clk_ops_pll_acpu_vote,
617 CLK_INIT(gpll0_ao_clk_src.c),
618 },
619};
620
Vikram Mulukutlab13abe42012-10-03 11:38:48 -0700621static struct pll_vote_clk mmpll0_clk_src = {
622 .en_reg = (void __iomem *)MMSS_PLL_VOTE_APCS_REG,
623 .en_mask = BIT(0),
624 .status_reg = (void __iomem *)MMPLL0_PLL_STATUS,
625 .status_mask = BIT(17),
626 .base = &virt_bases[MMSS_BASE],
627 .c = {
628 .parent = &gcc_xo_clk_src.c,
629 .dbg_name = "mmpll0_clk_src",
630 .rate = 800000000,
631 .ops = &clk_ops_pll_vote,
632 CLK_INIT(mmpll0_clk_src.c),
633 },
634};
635
636static struct pll_config_regs mmpll0_regs __initdata = {
637 .l_reg = (void __iomem *)MMPLL0_PLL_L_VAL,
638 .m_reg = (void __iomem *)MMPLL0_PLL_M_VAL,
639 .n_reg = (void __iomem *)MMPLL0_PLL_N_VAL,
640 .config_reg = (void __iomem *)MMPLL0_PLL_USER_CTL,
641 .mode_reg = (void __iomem *)MMPLL0_PLL_MODE,
642 .base = &virt_bases[MMSS_BASE],
643};
644
645static struct pll_clk mmpll1_clk_src = {
646 .mode_reg = (void __iomem *)MMPLL1_PLL_MODE,
647 .status_reg = (void __iomem *)MMPLL1_PLL_STATUS,
648 .base = &virt_bases[MMSS_BASE],
649 .c = {
650 .parent = &gcc_xo_clk_src.c,
651 .dbg_name = "mmpll1_clk_src",
652 .rate = 1200000000,
653 .ops = &clk_ops_local_pll,
654 CLK_INIT(mmpll1_clk_src.c),
655 },
656};
657
658static struct pll_config_regs mmpll1_regs __initdata = {
659 .l_reg = (void __iomem *)MMPLL1_PLL_L_VAL,
660 .m_reg = (void __iomem *)MMPLL1_PLL_M_VAL,
661 .n_reg = (void __iomem *)MMPLL1_PLL_N_VAL,
662 .config_reg = (void __iomem *)MMPLL1_PLL_USER_CTL,
663 .mode_reg = (void __iomem *)MMPLL1_PLL_MODE,
664 .base = &virt_bases[MMSS_BASE],
665};
666
Vikram Mulukutlab13abe42012-10-03 11:38:48 -0700667static struct clk_freq_tbl ftbl_gcc_blsp1_qup1_6_spi_apps_clk[] = {
668 F( 960000, gcc_xo, 10, 1, 2),
669 F( 4800000, gcc_xo, 4, 0, 0),
670 F( 9600000, gcc_xo, 2, 0, 0),
671 F(15000000, gpll0, 10, 1, 4),
672 F(19200000, gcc_xo, 1, 0, 0),
673 F(25000000, gpll0, 12, 1, 2),
674 F(50000000, gpll0, 12, 0, 0),
675 F_END,
676};
677
678static struct rcg_clk blsp1_qup1_spi_apps_clk_src = {
679 .cmd_rcgr_reg = BLSP1_QUP1_SPI_APPS_CMD_RCGR,
680 .set_rate = set_rate_mnd,
681 .freq_tbl = ftbl_gcc_blsp1_qup1_6_spi_apps_clk,
682 .current_freq = &rcg_dummy_freq,
683 .base = &virt_bases[GCC_BASE],
684 .c = {
685 .dbg_name = "blsp1_qup1_spi_apps_clk_src",
686 .ops = &clk_ops_rcg_mnd,
687 VDD_DIG_FMAX_MAP2(LOW, 25000000, NOMINAL, 50000000),
688 CLK_INIT(blsp1_qup1_spi_apps_clk_src.c),
689 },
690};
691
692static struct rcg_clk blsp1_qup2_spi_apps_clk_src = {
693 .cmd_rcgr_reg = BLSP1_QUP2_SPI_APPS_CMD_RCGR,
694 .set_rate = set_rate_mnd,
695 .freq_tbl = ftbl_gcc_blsp1_qup1_6_spi_apps_clk,
696 .current_freq = &rcg_dummy_freq,
697 .base = &virt_bases[GCC_BASE],
698 .c = {
699 .dbg_name = "blsp1_qup2_spi_apps_clk_src",
700 .ops = &clk_ops_rcg_mnd,
701 VDD_DIG_FMAX_MAP2(LOW, 25000000, NOMINAL, 50000000),
702 CLK_INIT(blsp1_qup2_spi_apps_clk_src.c),
703 },
704};
705
706static struct rcg_clk blsp1_qup3_spi_apps_clk_src = {
707 .cmd_rcgr_reg = BLSP1_QUP3_SPI_APPS_CMD_RCGR,
708 .set_rate = set_rate_mnd,
709 .freq_tbl = ftbl_gcc_blsp1_qup1_6_spi_apps_clk,
710 .current_freq = &rcg_dummy_freq,
711 .base = &virt_bases[GCC_BASE],
712 .c = {
713 .dbg_name = "blsp1_qup3_spi_apps_clk_src",
714 .ops = &clk_ops_rcg_mnd,
715 VDD_DIG_FMAX_MAP2(LOW, 25000000, NOMINAL, 50000000),
716 CLK_INIT(blsp1_qup3_spi_apps_clk_src.c),
717 },
718};
719
720static struct rcg_clk blsp1_qup4_spi_apps_clk_src = {
721 .cmd_rcgr_reg = BLSP1_QUP4_SPI_APPS_CMD_RCGR,
722 .set_rate = set_rate_mnd,
723 .freq_tbl = ftbl_gcc_blsp1_qup1_6_spi_apps_clk,
724 .current_freq = &rcg_dummy_freq,
725 .base = &virt_bases[GCC_BASE],
726 .c = {
727 .dbg_name = "blsp1_qup4_spi_apps_clk_src",
728 .ops = &clk_ops_rcg_mnd,
729 VDD_DIG_FMAX_MAP2(LOW, 25000000, NOMINAL, 50000000),
730 CLK_INIT(blsp1_qup4_spi_apps_clk_src.c),
731 },
732};
733
734static struct rcg_clk blsp1_qup5_spi_apps_clk_src = {
735 .cmd_rcgr_reg = BLSP1_QUP5_SPI_APPS_CMD_RCGR,
736 .set_rate = set_rate_mnd,
737 .freq_tbl = ftbl_gcc_blsp1_qup1_6_spi_apps_clk,
738 .current_freq = &rcg_dummy_freq,
739 .base = &virt_bases[GCC_BASE],
740 .c = {
741 .dbg_name = "blsp1_qup5_spi_apps_clk_src",
742 .ops = &clk_ops_rcg_mnd,
743 VDD_DIG_FMAX_MAP2(LOW, 25000000, NOMINAL, 50000000),
744 CLK_INIT(blsp1_qup5_spi_apps_clk_src.c),
745 },
746};
747
748static struct rcg_clk blsp1_qup6_spi_apps_clk_src = {
749 .cmd_rcgr_reg = BLSP1_QUP6_SPI_APPS_CMD_RCGR,
750 .set_rate = set_rate_mnd,
751 .freq_tbl = ftbl_gcc_blsp1_qup1_6_spi_apps_clk,
752 .current_freq = &rcg_dummy_freq,
753 .base = &virt_bases[GCC_BASE],
754 .c = {
755 .dbg_name = "blsp1_qup6_spi_apps_clk_src",
756 .ops = &clk_ops_rcg_mnd,
757 VDD_DIG_FMAX_MAP2(LOW, 25000000, NOMINAL, 50000000),
758 CLK_INIT(blsp1_qup6_spi_apps_clk_src.c),
759 },
760};
761
762static struct clk_freq_tbl ftbl_gcc_blsp1_uart1_6_apps_clk[] = {
763 F( 3686400, gpll0, 1, 96, 15625),
764 F( 7372800, gpll0, 1, 192, 15625),
765 F(14745600, gpll0, 1, 384, 15625),
766 F(16000000, gpll0, 5, 2, 15),
767 F(19200000, gcc_xo, 1, 0, 0),
768 F(24000000, gpll0, 5, 1, 5),
769 F(32000000, gpll0, 1, 4, 75),
770 F(40000000, gpll0, 15, 0, 0),
771 F(46400000, gpll0, 1, 29, 375),
772 F(48000000, gpll0, 12.5, 0, 0),
773 F(51200000, gpll0, 1, 32, 375),
774 F(56000000, gpll0, 1, 7, 75),
775 F(58982400, gpll0, 1, 1536, 15625),
776 F(60000000, gpll0, 10, 0, 0),
777 F_END,
778};
779
780static struct rcg_clk blsp1_uart1_apps_clk_src = {
781 .cmd_rcgr_reg = BLSP1_UART1_APPS_CMD_RCGR,
782 .set_rate = set_rate_mnd,
783 .freq_tbl = ftbl_gcc_blsp1_uart1_6_apps_clk,
784 .current_freq = &rcg_dummy_freq,
785 .base = &virt_bases[GCC_BASE],
786 .c = {
787 .dbg_name = "blsp1_uart1_apps_clk_src",
788 .ops = &clk_ops_rcg_mnd,
789 VDD_DIG_FMAX_MAP2(LOW, 31580000, NOMINAL, 63160000),
790 CLK_INIT(blsp1_uart1_apps_clk_src.c),
791 },
792};
793
794static struct rcg_clk blsp1_uart2_apps_clk_src = {
795 .cmd_rcgr_reg = BLSP1_UART2_APPS_CMD_RCGR,
796 .set_rate = set_rate_mnd,
797 .freq_tbl = ftbl_gcc_blsp1_uart1_6_apps_clk,
798 .current_freq = &rcg_dummy_freq,
799 .base = &virt_bases[GCC_BASE],
800 .c = {
801 .dbg_name = "blsp1_uart2_apps_clk_src",
802 .ops = &clk_ops_rcg_mnd,
803 VDD_DIG_FMAX_MAP2(LOW, 31580000, NOMINAL, 63160000),
804 CLK_INIT(blsp1_uart2_apps_clk_src.c),
805 },
806};
807
808static struct rcg_clk blsp1_uart3_apps_clk_src = {
809 .cmd_rcgr_reg = BLSP1_UART3_APPS_CMD_RCGR,
810 .set_rate = set_rate_mnd,
811 .freq_tbl = ftbl_gcc_blsp1_uart1_6_apps_clk,
812 .current_freq = &rcg_dummy_freq,
813 .base = &virt_bases[GCC_BASE],
814 .c = {
815 .dbg_name = "blsp1_uart3_apps_clk_src",
816 .ops = &clk_ops_rcg_mnd,
817 VDD_DIG_FMAX_MAP2(LOW, 31580000, NOMINAL, 63160000),
818 CLK_INIT(blsp1_uart3_apps_clk_src.c),
819 },
820};
821
822static struct rcg_clk blsp1_uart4_apps_clk_src = {
823 .cmd_rcgr_reg = BLSP1_UART4_APPS_CMD_RCGR,
824 .set_rate = set_rate_mnd,
825 .freq_tbl = ftbl_gcc_blsp1_uart1_6_apps_clk,
826 .current_freq = &rcg_dummy_freq,
827 .base = &virt_bases[GCC_BASE],
828 .c = {
829 .dbg_name = "blsp1_uart4_apps_clk_src",
830 .ops = &clk_ops_rcg_mnd,
831 VDD_DIG_FMAX_MAP2(LOW, 31580000, NOMINAL, 63160000),
832 CLK_INIT(blsp1_uart4_apps_clk_src.c),
833 },
834};
835
836static struct rcg_clk blsp1_uart5_apps_clk_src = {
837 .cmd_rcgr_reg = BLSP1_UART5_APPS_CMD_RCGR,
838 .set_rate = set_rate_mnd,
839 .freq_tbl = ftbl_gcc_blsp1_uart1_6_apps_clk,
840 .current_freq = &rcg_dummy_freq,
841 .base = &virt_bases[GCC_BASE],
842 .c = {
843 .dbg_name = "blsp1_uart5_apps_clk_src",
844 .ops = &clk_ops_rcg_mnd,
845 VDD_DIG_FMAX_MAP2(LOW, 31580000, NOMINAL, 63160000),
846 CLK_INIT(blsp1_uart5_apps_clk_src.c),
847 },
848};
849
850static struct rcg_clk blsp1_uart6_apps_clk_src = {
851 .cmd_rcgr_reg = BLSP1_UART6_APPS_CMD_RCGR,
852 .set_rate = set_rate_mnd,
853 .freq_tbl = ftbl_gcc_blsp1_uart1_6_apps_clk,
854 .current_freq = &rcg_dummy_freq,
855 .base = &virt_bases[GCC_BASE],
856 .c = {
857 .dbg_name = "blsp1_uart6_apps_clk_src",
858 .ops = &clk_ops_rcg_mnd,
859 VDD_DIG_FMAX_MAP2(LOW, 31580000, NOMINAL, 63160000),
860 CLK_INIT(blsp1_uart6_apps_clk_src.c),
861 },
862};
863
864static struct clk_freq_tbl ftbl_gcc_ce1_clk[] = {
865 F(50000000, gpll0, 12, 0, 0),
866 F(100000000, gpll0, 6, 0, 0),
867 F_END,
868};
869
870static struct rcg_clk ce1_clk_src = {
871 .cmd_rcgr_reg = CE1_CMD_RCGR,
872 .set_rate = set_rate_hid,
873 .freq_tbl = ftbl_gcc_ce1_clk,
874 .current_freq = &rcg_dummy_freq,
875 .base = &virt_bases[GCC_BASE],
876 .c = {
877 .dbg_name = "ce1_clk_src",
878 .ops = &clk_ops_rcg,
879 VDD_DIG_FMAX_MAP2(LOW, 50000000, NOMINAL, 100000000),
880 CLK_INIT(ce1_clk_src.c),
881 },
882};
883
884static struct clk_freq_tbl ftbl_gcc_gp1_3_clk[] = {
885 F(19200000, gcc_xo, 1, 0, 0),
886 F_END,
887};
888
889static struct rcg_clk gp1_clk_src = {
890 .cmd_rcgr_reg = GP1_CMD_RCGR,
891 .set_rate = set_rate_mnd,
892 .freq_tbl = ftbl_gcc_gp1_3_clk,
893 .current_freq = &rcg_dummy_freq,
894 .base = &virt_bases[GCC_BASE],
895 .c = {
896 .dbg_name = "gp1_clk_src",
897 .ops = &clk_ops_rcg_mnd,
898 VDD_DIG_FMAX_MAP2(LOW, 100000000, NOMINAL, 200000000),
899 CLK_INIT(gp1_clk_src.c),
900 },
901};
902
903static struct rcg_clk gp2_clk_src = {
904 .cmd_rcgr_reg = GP2_CMD_RCGR,
905 .set_rate = set_rate_mnd,
906 .freq_tbl = ftbl_gcc_gp1_3_clk,
907 .current_freq = &rcg_dummy_freq,
908 .base = &virt_bases[GCC_BASE],
909 .c = {
910 .dbg_name = "gp2_clk_src",
911 .ops = &clk_ops_rcg_mnd,
912 VDD_DIG_FMAX_MAP2(LOW, 100000000, NOMINAL, 200000000),
913 CLK_INIT(gp2_clk_src.c),
914 },
915};
916
917static struct rcg_clk gp3_clk_src = {
918 .cmd_rcgr_reg = GP3_CMD_RCGR,
919 .set_rate = set_rate_mnd,
920 .freq_tbl = ftbl_gcc_gp1_3_clk,
921 .current_freq = &rcg_dummy_freq,
922 .base = &virt_bases[GCC_BASE],
923 .c = {
924 .dbg_name = "gp3_clk_src",
925 .ops = &clk_ops_rcg_mnd,
926 VDD_DIG_FMAX_MAP2(LOW, 100000000, NOMINAL, 200000000),
927 CLK_INIT(gp3_clk_src.c),
928 },
929};
930
931static struct clk_freq_tbl ftbl_gcc_pdm2_clk[] = {
932 F(60000000, gpll0, 10, 0, 0),
933 F_END,
934};
935
936static struct rcg_clk pdm2_clk_src = {
937 .cmd_rcgr_reg = PDM2_CMD_RCGR,
938 .set_rate = set_rate_hid,
939 .freq_tbl = ftbl_gcc_pdm2_clk,
940 .current_freq = &rcg_dummy_freq,
941 .base = &virt_bases[GCC_BASE],
942 .c = {
943 .dbg_name = "pdm2_clk_src",
944 .ops = &clk_ops_rcg,
945 VDD_DIG_FMAX_MAP1(LOW, 120000000),
946 CLK_INIT(pdm2_clk_src.c),
947 },
948};
949
950static struct clk_freq_tbl ftbl_gcc_sdcc1_2_apps_clk[] = {
951 F( 144000, gcc_xo, 16, 3, 25),
952 F( 400000, gcc_xo, 12, 1, 4),
953 F( 20000000, gpll0, 15, 1, 2),
954 F( 25000000, gpll0, 12, 1, 2),
955 F( 50000000, gpll0, 12, 0, 0),
956 F(100000000, gpll0, 6, 0, 0),
957 F(200000000, gpll0, 3, 0, 0),
958 F_END,
959};
960
961static struct rcg_clk sdcc1_apps_clk_src = {
962 .cmd_rcgr_reg = SDCC1_APPS_CMD_RCGR,
963 .set_rate = set_rate_mnd,
964 .freq_tbl = ftbl_gcc_sdcc1_2_apps_clk,
965 .current_freq = &rcg_dummy_freq,
966 .base = &virt_bases[GCC_BASE],
967 .c = {
968 .dbg_name = "sdcc1_apps_clk_src",
969 .ops = &clk_ops_rcg_mnd,
970 VDD_DIG_FMAX_MAP2(LOW, 100000000, NOMINAL, 200000000),
971 CLK_INIT(sdcc1_apps_clk_src.c),
972 },
973};
974
975static struct rcg_clk sdcc2_apps_clk_src = {
976 .cmd_rcgr_reg = SDCC2_APPS_CMD_RCGR,
977 .set_rate = set_rate_mnd,
978 .freq_tbl = ftbl_gcc_sdcc1_2_apps_clk,
979 .current_freq = &rcg_dummy_freq,
980 .base = &virt_bases[GCC_BASE],
981 .c = {
982 .dbg_name = "sdcc2_apps_clk_src",
983 .ops = &clk_ops_rcg_mnd,
984 VDD_DIG_FMAX_MAP2(LOW, 100000000, NOMINAL, 200000000),
985 CLK_INIT(sdcc2_apps_clk_src.c),
986 },
987};
988
989static struct clk_freq_tbl ftbl_gcc_usb_hs_system_clk[] = {
990 F(75000000, gpll0, 8, 0, 0),
991 F_END,
992};
993
994static struct rcg_clk usb_hs_system_clk_src = {
995 .cmd_rcgr_reg = USB_HS_SYSTEM_CMD_RCGR,
996 .set_rate = set_rate_hid,
997 .freq_tbl = ftbl_gcc_usb_hs_system_clk,
998 .current_freq = &rcg_dummy_freq,
999 .base = &virt_bases[GCC_BASE],
1000 .c = {
1001 .dbg_name = "usb_hs_system_clk_src",
1002 .ops = &clk_ops_rcg,
1003 VDD_DIG_FMAX_MAP2(LOW, 60000000, NOMINAL, 100000000),
1004 CLK_INIT(usb_hs_system_clk_src.c),
1005 },
1006};
1007
1008static struct local_vote_clk gcc_blsp1_ahb_clk = {
1009 .cbcr_reg = BLSP1_AHB_CBCR,
1010 .vote_reg = APCS_CLOCK_BRANCH_ENA_VOTE,
1011 .en_mask = BIT(17),
1012 .base = &virt_bases[GCC_BASE],
1013 .c = {
1014 .dbg_name = "gcc_blsp1_ahb_clk",
1015 .ops = &clk_ops_vote,
1016 CLK_INIT(gcc_blsp1_ahb_clk.c),
1017 },
1018};
1019
1020static struct branch_clk gcc_blsp1_qup1_i2c_apps_clk = {
1021 .cbcr_reg = BLSP1_QUP1_I2C_APPS_CBCR,
1022 .has_sibling = 1,
1023 .base = &virt_bases[GCC_BASE],
1024 .c = {
1025 .parent = &gcc_xo_clk_src.c,
1026 .dbg_name = "gcc_blsp1_qup1_i2c_apps_clk",
1027 .ops = &clk_ops_branch,
1028 CLK_INIT(gcc_blsp1_qup1_i2c_apps_clk.c),
1029 },
1030};
1031
1032static struct branch_clk gcc_blsp1_qup1_spi_apps_clk = {
1033 .cbcr_reg = BLSP1_QUP1_SPI_APPS_CBCR,
1034 .has_sibling = 0,
1035 .base = &virt_bases[GCC_BASE],
1036 .c = {
1037 .parent = &blsp1_qup1_spi_apps_clk_src.c,
1038 .dbg_name = "gcc_blsp1_qup1_spi_apps_clk",
1039 .ops = &clk_ops_branch,
1040 CLK_INIT(gcc_blsp1_qup1_spi_apps_clk.c),
1041 },
1042};
1043
1044static struct branch_clk gcc_blsp1_qup2_i2c_apps_clk = {
1045 .cbcr_reg = BLSP1_QUP2_I2C_APPS_CBCR,
1046 .has_sibling = 1,
1047 .base = &virt_bases[GCC_BASE],
1048 .c = {
1049 .parent = &gcc_xo_clk_src.c,
1050 .dbg_name = "gcc_blsp1_qup2_i2c_apps_clk",
1051 .ops = &clk_ops_branch,
1052 CLK_INIT(gcc_blsp1_qup2_i2c_apps_clk.c),
1053 },
1054};
1055
1056static struct branch_clk gcc_blsp1_qup2_spi_apps_clk = {
1057 .cbcr_reg = BLSP1_QUP2_SPI_APPS_CBCR,
1058 .has_sibling = 0,
1059 .base = &virt_bases[GCC_BASE],
1060 .c = {
1061 .parent = &blsp1_qup2_spi_apps_clk_src.c,
1062 .dbg_name = "gcc_blsp1_qup2_spi_apps_clk",
1063 .ops = &clk_ops_branch,
1064 CLK_INIT(gcc_blsp1_qup2_spi_apps_clk.c),
1065 },
1066};
1067
1068static struct branch_clk gcc_blsp1_qup3_i2c_apps_clk = {
1069 .cbcr_reg = BLSP1_QUP3_I2C_APPS_CBCR,
1070 .has_sibling = 1,
1071 .base = &virt_bases[GCC_BASE],
1072 .c = {
1073 .parent = &gcc_xo_clk_src.c,
1074 .dbg_name = "gcc_blsp1_qup3_i2c_apps_clk",
1075 .ops = &clk_ops_branch,
1076 CLK_INIT(gcc_blsp1_qup3_i2c_apps_clk.c),
1077 },
1078};
1079
1080static struct branch_clk gcc_blsp1_qup3_spi_apps_clk = {
1081 .cbcr_reg = BLSP1_QUP3_SPI_APPS_CBCR,
1082 .has_sibling = 0,
1083 .base = &virt_bases[GCC_BASE],
1084 .c = {
1085 .parent = &blsp1_qup3_spi_apps_clk_src.c,
1086 .dbg_name = "gcc_blsp1_qup3_spi_apps_clk",
1087 .ops = &clk_ops_branch,
1088 CLK_INIT(gcc_blsp1_qup3_spi_apps_clk.c),
1089 },
1090};
1091
1092static struct branch_clk gcc_blsp1_qup4_i2c_apps_clk = {
1093 .cbcr_reg = BLSP1_QUP4_I2C_APPS_CBCR,
1094 .has_sibling = 1,
1095 .base = &virt_bases[GCC_BASE],
1096 .c = {
1097 .parent = &gcc_xo_clk_src.c,
1098 .dbg_name = "gcc_blsp1_qup4_i2c_apps_clk",
1099 .ops = &clk_ops_branch,
1100 CLK_INIT(gcc_blsp1_qup4_i2c_apps_clk.c),
1101 },
1102};
1103
1104static struct branch_clk gcc_blsp1_qup4_spi_apps_clk = {
1105 .cbcr_reg = BLSP1_QUP4_SPI_APPS_CBCR,
1106 .has_sibling = 0,
1107 .base = &virt_bases[GCC_BASE],
1108 .c = {
1109 .parent = &blsp1_qup4_spi_apps_clk_src.c,
1110 .dbg_name = "gcc_blsp1_qup4_spi_apps_clk",
1111 .ops = &clk_ops_branch,
1112 CLK_INIT(gcc_blsp1_qup4_spi_apps_clk.c),
1113 },
1114};
1115
1116static struct branch_clk gcc_blsp1_qup5_i2c_apps_clk = {
1117 .cbcr_reg = BLSP1_QUP5_I2C_APPS_CBCR,
1118 .has_sibling = 1,
1119 .base = &virt_bases[GCC_BASE],
1120 .c = {
1121 .parent = &gcc_xo_clk_src.c,
1122 .dbg_name = "gcc_blsp1_qup5_i2c_apps_clk",
1123 .ops = &clk_ops_branch,
1124 CLK_INIT(gcc_blsp1_qup5_i2c_apps_clk.c),
1125 },
1126};
1127
1128static struct branch_clk gcc_blsp1_qup5_spi_apps_clk = {
1129 .cbcr_reg = BLSP1_QUP5_SPI_APPS_CBCR,
1130 .has_sibling = 0,
1131 .base = &virt_bases[GCC_BASE],
1132 .c = {
1133 .parent = &blsp1_qup5_spi_apps_clk_src.c,
1134 .dbg_name = "gcc_blsp1_qup5_spi_apps_clk",
1135 .ops = &clk_ops_branch,
1136 CLK_INIT(gcc_blsp1_qup5_spi_apps_clk.c),
1137 },
1138};
1139
1140static struct branch_clk gcc_blsp1_qup6_i2c_apps_clk = {
1141 .cbcr_reg = BLSP1_QUP6_I2C_APPS_CBCR,
1142 .has_sibling = 1,
1143 .base = &virt_bases[GCC_BASE],
1144 .c = {
1145 .parent = &gcc_xo_clk_src.c,
1146 .dbg_name = "gcc_blsp1_qup6_i2c_apps_clk",
1147 .ops = &clk_ops_branch,
1148 CLK_INIT(gcc_blsp1_qup6_i2c_apps_clk.c),
1149 },
1150};
1151
1152static struct branch_clk gcc_blsp1_qup6_spi_apps_clk = {
1153 .cbcr_reg = BLSP1_QUP6_SPI_APPS_CBCR,
1154 .has_sibling = 0,
1155 .base = &virt_bases[GCC_BASE],
1156 .c = {
1157 .parent = &blsp1_qup6_spi_apps_clk_src.c,
1158 .dbg_name = "gcc_blsp1_qup6_spi_apps_clk",
1159 .ops = &clk_ops_branch,
1160 CLK_INIT(gcc_blsp1_qup6_spi_apps_clk.c),
1161 },
1162};
1163
1164static struct branch_clk gcc_blsp1_uart1_apps_clk = {
1165 .cbcr_reg = BLSP1_UART1_APPS_CBCR,
1166 .has_sibling = 0,
1167 .base = &virt_bases[GCC_BASE],
1168 .c = {
1169 .parent = &blsp1_uart1_apps_clk_src.c,
1170 .dbg_name = "gcc_blsp1_uart1_apps_clk",
1171 .ops = &clk_ops_branch,
1172 CLK_INIT(gcc_blsp1_uart1_apps_clk.c),
1173 },
1174};
1175
1176static struct branch_clk gcc_blsp1_uart2_apps_clk = {
1177 .cbcr_reg = BLSP1_UART2_APPS_CBCR,
1178 .has_sibling = 0,
1179 .base = &virt_bases[GCC_BASE],
1180 .c = {
1181 .parent = &blsp1_uart2_apps_clk_src.c,
1182 .dbg_name = "gcc_blsp1_uart2_apps_clk",
1183 .ops = &clk_ops_branch,
1184 CLK_INIT(gcc_blsp1_uart2_apps_clk.c),
1185 },
1186};
1187
1188static struct branch_clk gcc_blsp1_uart3_apps_clk = {
1189 .cbcr_reg = BLSP1_UART3_APPS_CBCR,
1190 .has_sibling = 0,
1191 .base = &virt_bases[GCC_BASE],
1192 .c = {
1193 .parent = &blsp1_uart3_apps_clk_src.c,
1194 .dbg_name = "gcc_blsp1_uart3_apps_clk",
1195 .ops = &clk_ops_branch,
1196 CLK_INIT(gcc_blsp1_uart3_apps_clk.c),
1197 },
1198};
1199
1200static struct branch_clk gcc_blsp1_uart4_apps_clk = {
1201 .cbcr_reg = BLSP1_UART4_APPS_CBCR,
1202 .has_sibling = 0,
1203 .base = &virt_bases[GCC_BASE],
1204 .c = {
1205 .parent = &blsp1_uart4_apps_clk_src.c,
1206 .dbg_name = "gcc_blsp1_uart4_apps_clk",
1207 .ops = &clk_ops_branch,
1208 CLK_INIT(gcc_blsp1_uart4_apps_clk.c),
1209 },
1210};
1211
1212static struct branch_clk gcc_blsp1_uart5_apps_clk = {
1213 .cbcr_reg = BLSP1_UART5_APPS_CBCR,
1214 .has_sibling = 0,
1215 .base = &virt_bases[GCC_BASE],
1216 .c = {
1217 .parent = &blsp1_uart5_apps_clk_src.c,
1218 .dbg_name = "gcc_blsp1_uart5_apps_clk",
1219 .ops = &clk_ops_branch,
1220 CLK_INIT(gcc_blsp1_uart5_apps_clk.c),
1221 },
1222};
1223
1224static struct branch_clk gcc_blsp1_uart6_apps_clk = {
1225 .cbcr_reg = BLSP1_UART6_APPS_CBCR,
1226 .has_sibling = 0,
1227 .base = &virt_bases[GCC_BASE],
1228 .c = {
1229 .parent = &blsp1_uart6_apps_clk_src.c,
1230 .dbg_name = "gcc_blsp1_uart6_apps_clk",
1231 .ops = &clk_ops_branch,
1232 CLK_INIT(gcc_blsp1_uart6_apps_clk.c),
1233 },
1234};
1235
1236static struct local_vote_clk gcc_boot_rom_ahb_clk = {
1237 .cbcr_reg = BOOT_ROM_AHB_CBCR,
1238 .vote_reg = APCS_CLOCK_BRANCH_ENA_VOTE,
1239 .en_mask = BIT(10),
1240 .base = &virt_bases[GCC_BASE],
1241 .c = {
1242 .dbg_name = "gcc_boot_rom_ahb_clk",
1243 .ops = &clk_ops_vote,
1244 CLK_INIT(gcc_boot_rom_ahb_clk.c),
1245 },
1246};
1247
1248static struct local_vote_clk gcc_ce1_ahb_clk = {
1249 .cbcr_reg = CE1_AHB_CBCR,
1250 .vote_reg = APCS_CLOCK_BRANCH_ENA_VOTE,
1251 .en_mask = BIT(3),
1252 .base = &virt_bases[GCC_BASE],
1253 .c = {
1254 .dbg_name = "gcc_ce1_ahb_clk",
1255 .ops = &clk_ops_vote,
1256 CLK_INIT(gcc_ce1_ahb_clk.c),
1257 },
1258};
1259
1260static struct local_vote_clk gcc_ce1_axi_clk = {
1261 .cbcr_reg = CE1_AXI_CBCR,
1262 .vote_reg = APCS_CLOCK_BRANCH_ENA_VOTE,
1263 .en_mask = BIT(4),
1264 .base = &virt_bases[GCC_BASE],
1265 .c = {
1266 .dbg_name = "gcc_ce1_axi_clk",
1267 .ops = &clk_ops_vote,
1268 CLK_INIT(gcc_ce1_axi_clk.c),
1269 },
1270};
1271
1272static struct local_vote_clk gcc_ce1_clk = {
1273 .cbcr_reg = CE1_CBCR,
1274 .vote_reg = APCS_CLOCK_BRANCH_ENA_VOTE,
1275 .en_mask = BIT(5),
1276 .base = &virt_bases[GCC_BASE],
1277 .c = {
1278 .dbg_name = "gcc_ce1_clk",
1279 .ops = &clk_ops_vote,
1280 CLK_INIT(gcc_ce1_clk.c),
1281 },
1282};
1283
1284static struct branch_clk gcc_copss_smmu_ahb_clk = {
1285 .cbcr_reg = COPSS_SMMU_AHB_CBCR,
1286 .has_sibling = 1,
1287 .base = &virt_bases[GCC_BASE],
1288 .c = {
1289 .dbg_name = "gcc_copss_smmu_ahb_clk",
1290 .ops = &clk_ops_branch,
1291 CLK_INIT(gcc_copss_smmu_ahb_clk.c),
1292 },
1293};
1294
1295static struct branch_clk gcc_lpss_smmu_ahb_clk = {
1296 .cbcr_reg = LPSS_SMMU_AHB_CBCR,
1297 .has_sibling = 1,
1298 .base = &virt_bases[GCC_BASE],
1299 .c = {
1300 .dbg_name = "gcc_lpss_smmu_ahb_clk",
1301 .ops = &clk_ops_branch,
1302 CLK_INIT(gcc_lpss_smmu_ahb_clk.c),
1303 },
1304};
1305
1306static struct branch_clk gcc_gp1_clk = {
1307 .cbcr_reg = GP1_CBCR,
1308 .has_sibling = 0,
1309 .base = &virt_bases[GCC_BASE],
1310 .c = {
1311 .parent = &gp1_clk_src.c,
1312 .dbg_name = "gcc_gp1_clk",
1313 .ops = &clk_ops_branch,
1314 CLK_INIT(gcc_gp1_clk.c),
1315 },
1316};
1317
1318static struct branch_clk gcc_gp2_clk = {
1319 .cbcr_reg = GP2_CBCR,
1320 .has_sibling = 0,
1321 .base = &virt_bases[GCC_BASE],
1322 .c = {
1323 .parent = &gp2_clk_src.c,
1324 .dbg_name = "gcc_gp2_clk",
1325 .ops = &clk_ops_branch,
1326 CLK_INIT(gcc_gp2_clk.c),
1327 },
1328};
1329
1330static struct branch_clk gcc_gp3_clk = {
1331 .cbcr_reg = GP3_CBCR,
1332 .has_sibling = 0,
1333 .base = &virt_bases[GCC_BASE],
1334 .c = {
1335 .parent = &gp3_clk_src.c,
1336 .dbg_name = "gcc_gp3_clk",
1337 .ops = &clk_ops_branch,
1338 CLK_INIT(gcc_gp3_clk.c),
1339 },
1340};
1341
1342static struct branch_clk gcc_lpass_q6_axi_clk = {
1343 .cbcr_reg = LPASS_Q6_AXI_CBCR,
1344 .has_sibling = 1,
1345 .base = &virt_bases[GCC_BASE],
Vikram Mulukutla2dfa8b12013-01-15 18:17:10 -08001346 /* FIXME: Remove this once simulation is fixed. */
1347 .halt_check = DELAY,
Vikram Mulukutlab13abe42012-10-03 11:38:48 -07001348 .c = {
1349 .dbg_name = "gcc_lpass_q6_axi_clk",
1350 .ops = &clk_ops_branch,
1351 CLK_INIT(gcc_lpass_q6_axi_clk.c),
1352 },
1353};
1354
1355static struct branch_clk gcc_mmss_noc_cfg_ahb_clk = {
1356 .cbcr_reg = MMSS_NOC_CFG_AHB_CBCR,
1357 .has_sibling = 1,
1358 .base = &virt_bases[GCC_BASE],
1359 .c = {
1360 .dbg_name = "gcc_mmss_noc_cfg_ahb_clk",
1361 .ops = &clk_ops_branch,
1362 CLK_INIT(gcc_mmss_noc_cfg_ahb_clk.c),
1363 },
1364};
1365
1366static struct branch_clk gcc_mss_cfg_ahb_clk = {
1367 .cbcr_reg = MSS_CFG_AHB_CBCR,
1368 .has_sibling = 1,
1369 .base = &virt_bases[GCC_BASE],
1370 .c = {
1371 .dbg_name = "gcc_mss_cfg_ahb_clk",
1372 .ops = &clk_ops_branch,
1373 CLK_INIT(gcc_mss_cfg_ahb_clk.c),
1374 },
1375};
1376
1377static struct branch_clk gcc_mss_q6_bimc_axi_clk = {
1378 .cbcr_reg = MSS_Q6_BIMC_AXI_CBCR,
1379 .has_sibling = 1,
1380 .base = &virt_bases[GCC_BASE],
1381 .c = {
1382 .dbg_name = "gcc_mss_q6_bimc_axi_clk",
1383 .ops = &clk_ops_branch,
1384 CLK_INIT(gcc_mss_q6_bimc_axi_clk.c),
1385 },
1386};
1387
1388static struct branch_clk gcc_pdm2_clk = {
1389 .cbcr_reg = PDM2_CBCR,
1390 .has_sibling = 0,
1391 .base = &virt_bases[GCC_BASE],
1392 .c = {
1393 .parent = &pdm2_clk_src.c,
1394 .dbg_name = "gcc_pdm2_clk",
1395 .ops = &clk_ops_branch,
1396 CLK_INIT(gcc_pdm2_clk.c),
1397 },
1398};
1399
1400static struct branch_clk gcc_pdm_ahb_clk = {
1401 .cbcr_reg = PDM_AHB_CBCR,
1402 .has_sibling = 1,
1403 .base = &virt_bases[GCC_BASE],
1404 .c = {
1405 .dbg_name = "gcc_pdm_ahb_clk",
1406 .ops = &clk_ops_branch,
1407 CLK_INIT(gcc_pdm_ahb_clk.c),
1408 },
1409};
1410
1411static struct local_vote_clk gcc_prng_ahb_clk = {
1412 .cbcr_reg = PRNG_AHB_CBCR,
1413 .vote_reg = APCS_CLOCK_BRANCH_ENA_VOTE,
1414 .en_mask = BIT(13),
1415 .base = &virt_bases[GCC_BASE],
1416 .c = {
1417 .dbg_name = "gcc_prng_ahb_clk",
1418 .ops = &clk_ops_vote,
1419 CLK_INIT(gcc_prng_ahb_clk.c),
1420 },
1421};
1422
1423static struct branch_clk gcc_sdcc1_ahb_clk = {
1424 .cbcr_reg = SDCC1_AHB_CBCR,
1425 .has_sibling = 1,
1426 .base = &virt_bases[GCC_BASE],
1427 .c = {
1428 .dbg_name = "gcc_sdcc1_ahb_clk",
1429 .ops = &clk_ops_branch,
1430 CLK_INIT(gcc_sdcc1_ahb_clk.c),
1431 },
1432};
1433
1434static struct branch_clk gcc_sdcc1_apps_clk = {
1435 .cbcr_reg = SDCC1_APPS_CBCR,
1436 .has_sibling = 0,
1437 .base = &virt_bases[GCC_BASE],
1438 .c = {
1439 .parent = &sdcc1_apps_clk_src.c,
1440 .dbg_name = "gcc_sdcc1_apps_clk",
1441 .ops = &clk_ops_branch,
1442 CLK_INIT(gcc_sdcc1_apps_clk.c),
1443 },
1444};
1445
1446static struct branch_clk gcc_sdcc2_ahb_clk = {
1447 .cbcr_reg = SDCC2_AHB_CBCR,
1448 .has_sibling = 1,
1449 .base = &virt_bases[GCC_BASE],
1450 .c = {
1451 .dbg_name = "gcc_sdcc2_ahb_clk",
1452 .ops = &clk_ops_branch,
1453 CLK_INIT(gcc_sdcc2_ahb_clk.c),
1454 },
1455};
1456
1457static struct branch_clk gcc_sdcc2_apps_clk = {
1458 .cbcr_reg = SDCC2_APPS_CBCR,
1459 .has_sibling = 0,
1460 .base = &virt_bases[GCC_BASE],
1461 .c = {
1462 .parent = &sdcc2_apps_clk_src.c,
1463 .dbg_name = "gcc_sdcc2_apps_clk",
1464 .ops = &clk_ops_branch,
1465 CLK_INIT(gcc_sdcc2_apps_clk.c),
1466 },
1467};
1468
1469static struct branch_clk gcc_usb2a_phy_sleep_clk = {
1470 .cbcr_reg = USB2A_PHY_SLEEP_CBCR,
1471 .has_sibling = 1,
1472 .base = &virt_bases[GCC_BASE],
1473 .c = {
1474 .dbg_name = "gcc_usb2a_phy_sleep_clk",
1475 .ops = &clk_ops_branch,
1476 CLK_INIT(gcc_usb2a_phy_sleep_clk.c),
1477 },
1478};
1479
1480static struct branch_clk gcc_usb_hs_ahb_clk = {
1481 .cbcr_reg = USB_HS_AHB_CBCR,
1482 .has_sibling = 1,
1483 .base = &virt_bases[GCC_BASE],
1484 .c = {
1485 .dbg_name = "gcc_usb_hs_ahb_clk",
1486 .ops = &clk_ops_branch,
1487 CLK_INIT(gcc_usb_hs_ahb_clk.c),
1488 },
1489};
1490
1491static struct branch_clk gcc_usb_hs_system_clk = {
1492 .cbcr_reg = USB_HS_SYSTEM_CBCR,
1493 .has_sibling = 0,
1494 .bcr_reg = USB_HS_BCR,
1495 .base = &virt_bases[GCC_BASE],
1496 .c = {
1497 .parent = &usb_hs_system_clk_src.c,
1498 .dbg_name = "gcc_usb_hs_system_clk",
1499 .ops = &clk_ops_branch,
1500 CLK_INIT(gcc_usb_hs_system_clk.c),
1501 },
1502};
1503
Vikram Mulukutla55318acb2013-04-15 17:47:34 -07001504static struct branch_clk gcc_bimc_smmu_clk = {
1505 .cbcr_reg = BIMC_SMMU_CBCR,
1506 .has_sibling = 0,
1507 .base = &virt_bases[GCC_BASE],
1508 .c = {
1509 .dbg_name = "gcc_bimc_smmu_clk",
1510 .ops = &clk_ops_branch,
1511 CLK_INIT(gcc_bimc_smmu_clk.c),
1512 },
1513};
1514
Vikram Mulukutlab13abe42012-10-03 11:38:48 -07001515static struct clk_freq_tbl ftbl_csi0_1_clk[] = {
1516 F_MM(100000000, gpll0, 6, 0, 0),
1517 F_MM(200000000, mmpll0, 4, 0, 0),
1518 F_END,
1519};
1520
1521static struct rcg_clk csi0_clk_src = {
1522 .cmd_rcgr_reg = CSI0_CMD_RCGR,
1523 .set_rate = set_rate_hid,
1524 .freq_tbl = ftbl_csi0_1_clk,
1525 .current_freq = &rcg_dummy_freq,
1526 .base = &virt_bases[MMSS_BASE],
1527 .c = {
1528 .dbg_name = "csi0_clk_src",
1529 .ops = &clk_ops_rcg,
1530 VDD_DIG_FMAX_MAP2(LOW, 100000000, NOMINAL, 200000000),
1531 CLK_INIT(csi0_clk_src.c),
1532 },
1533};
1534
Vikram Mulukutlab13abe42012-10-03 11:38:48 -07001535static struct clk_freq_tbl ftbl_mmss_mmssnoc_axi_clk[] = {
1536 F_MM( 19200000, gcc_xo, 1, 0, 0),
1537 F_MM( 37500000, gpll0, 16, 0, 0),
1538 F_MM( 50000000, gpll0, 12, 0, 0),
1539 F_MM( 75000000, gpll0, 8, 0, 0),
1540 F_MM(100000000, gpll0, 6, 0, 0),
1541 F_MM(150000000, gpll0, 4, 0, 0),
1542 F_MM(200000000, mmpll0, 4, 0, 0),
1543 F_END,
1544};
1545
1546static struct rcg_clk axi_clk_src = {
1547 .cmd_rcgr_reg = AXI_CMD_RCGR,
1548 .set_rate = set_rate_hid,
1549 .freq_tbl = ftbl_mmss_mmssnoc_axi_clk,
1550 .current_freq = &rcg_dummy_freq,
1551 .base = &virt_bases[MMSS_BASE],
1552 .c = {
1553 .dbg_name = "axi_clk_src",
1554 .ops = &clk_ops_rcg,
1555 VDD_DIG_FMAX_MAP2(LOW, 100000000, NOMINAL, 200000000),
1556 CLK_INIT(axi_clk_src.c),
1557 },
1558};
1559
Vikram Mulukutlae1e5c482013-01-28 14:43:20 -08001560static DEFINE_CLK_VOTER(mdp_axi_clk_src, &axi_clk_src.c, 200000000);
1561static DEFINE_CLK_VOTER(mmssnoc_axi_clk_src, &axi_clk_src.c, 200000000);
1562
Vikram Mulukutlab13abe42012-10-03 11:38:48 -07001563static struct clk_freq_tbl ftbl_dsi_pclk_clk[] = {
1564 F_MDSS( 50000000, dsipll, 10, 0, 0),
1565 F_MDSS(103330000, dsipll, 9, 0, 0),
1566 F_END,
1567};
1568
1569static struct rcg_clk dsi_pclk_clk_src = {
1570 .cmd_rcgr_reg = DSI_PCLK_CMD_RCGR,
1571 .set_rate = set_rate_mnd,
1572 .freq_tbl = ftbl_dsi_pclk_clk,
1573 .current_freq = &rcg_dummy_freq,
1574 .base = &virt_bases[MMSS_BASE],
1575 .c = {
1576 .dbg_name = "dsi_pclk_clk_src",
1577 .ops = &clk_ops_rcg_mnd,
1578 VDD_DIG_FMAX_MAP2(LOW, 50000000, NOMINAL, 103330000),
1579 CLK_INIT(dsi_pclk_clk_src.c),
1580 },
1581};
1582
1583static struct clk_freq_tbl ftbl_oxili_gfx3d_clk[] = {
1584 F_MM( 19200000, gcc_xo, 1, 0, 0),
1585 F_MM( 37500000, gpll0, 16, 0, 0),
1586 F_MM( 50000000, gpll0, 12, 0, 0),
1587 F_MM( 75000000, gpll0, 8, 0, 0),
1588 F_MM(100000000, gpll0, 6, 0, 0),
1589 F_MM(150000000, gpll0, 4, 0, 0),
1590 F_MM(200000000, gpll0, 3, 0, 0),
1591 F_MM(300000000, gpll0, 2, 0, 0),
1592 F_MM(400000000, mmpll1, 3, 0, 0),
1593 F_END,
1594};
1595
1596static struct rcg_clk gfx3d_clk_src = {
1597 .cmd_rcgr_reg = GFX3D_CMD_RCGR,
1598 .set_rate = set_rate_hid,
1599 .freq_tbl = ftbl_oxili_gfx3d_clk,
1600 .current_freq = &rcg_dummy_freq,
1601 .base = &virt_bases[MMSS_BASE],
1602 .c = {
1603 .dbg_name = "gfx3d_clk_src",
1604 .ops = &clk_ops_rcg,
1605 VDD_DIG_FMAX_MAP3(LOW, 150000000, NOMINAL, 300000000, HIGH,
1606 400000000),
1607 CLK_INIT(gfx3d_clk_src.c),
1608 },
1609};
1610
1611static struct clk_freq_tbl ftbl_vfe_clk[] = {
1612 F_MM( 37500000, gpll0, 16, 0, 0),
1613 F_MM( 50000000, gpll0, 12, 0, 0),
1614 F_MM( 60000000, gpll0, 10, 0, 0),
1615 F_MM( 80000000, gpll0, 7.5, 0, 0),
1616 F_MM(100000000, gpll0, 6, 0, 0),
1617 F_MM(109090000, gpll0, 5.5, 0, 0),
1618 F_MM(133330000, gpll0, 4.5, 0, 0),
1619 F_MM(200000000, gpll0, 3, 0, 0),
1620 F_MM(228570000, mmpll0, 3.5, 0, 0),
1621 F_MM(266670000, mmpll0, 3, 0, 0),
1622 F_MM(320000000, mmpll0, 2.5, 0, 0),
1623 F_END,
1624};
1625
1626static struct rcg_clk vfe_clk_src = {
1627 .cmd_rcgr_reg = VFE_CMD_RCGR,
1628 .set_rate = set_rate_hid,
1629 .freq_tbl = ftbl_vfe_clk,
1630 .current_freq = &rcg_dummy_freq,
1631 .base = &virt_bases[MMSS_BASE],
1632 .c = {
1633 .dbg_name = "vfe_clk_src",
1634 .ops = &clk_ops_rcg,
1635 VDD_DIG_FMAX_MAP3(LOW, 133330000, NOMINAL, 266670000, HIGH,
1636 320000000),
1637 CLK_INIT(vfe_clk_src.c),
1638 },
1639};
1640
1641static struct rcg_clk csi1_clk_src = {
1642 .cmd_rcgr_reg = CSI1_CMD_RCGR,
1643 .set_rate = set_rate_hid,
1644 .freq_tbl = ftbl_csi0_1_clk,
1645 .current_freq = &rcg_dummy_freq,
1646 .base = &virt_bases[MMSS_BASE],
1647 .c = {
1648 .dbg_name = "csi1_clk_src",
1649 .ops = &clk_ops_rcg,
1650 VDD_DIG_FMAX_MAP2(LOW, 100000000, NOMINAL, 200000000),
1651 CLK_INIT(csi1_clk_src.c),
1652 },
1653};
1654
1655static struct clk_freq_tbl ftbl_csi0_1phytimer_clk[] = {
1656 F_MM(100000000, gpll0, 6, 0, 0),
1657 F_MM(200000000, mmpll0, 4, 0, 0),
1658 F_END,
1659};
1660
1661static struct rcg_clk csi0phytimer_clk_src = {
1662 .cmd_rcgr_reg = CSI0PHYTIMER_CMD_RCGR,
1663 .set_rate = set_rate_hid,
1664 .freq_tbl = ftbl_csi0_1phytimer_clk,
1665 .current_freq = &rcg_dummy_freq,
1666 .base = &virt_bases[MMSS_BASE],
1667 .c = {
1668 .dbg_name = "csi0phytimer_clk_src",
1669 .ops = &clk_ops_rcg,
1670 VDD_DIG_FMAX_MAP2(LOW, 100000000, NOMINAL, 200000000),
1671 CLK_INIT(csi0phytimer_clk_src.c),
1672 },
1673};
1674
1675static struct rcg_clk csi1phytimer_clk_src = {
1676 .cmd_rcgr_reg = CSI1PHYTIMER_CMD_RCGR,
1677 .set_rate = set_rate_hid,
1678 .freq_tbl = ftbl_csi0_1phytimer_clk,
1679 .current_freq = &rcg_dummy_freq,
1680 .base = &virt_bases[MMSS_BASE],
1681 .c = {
1682 .dbg_name = "csi1phytimer_clk_src",
1683 .ops = &clk_ops_rcg,
1684 VDD_DIG_FMAX_MAP2(LOW, 100000000, NOMINAL, 200000000),
1685 CLK_INIT(csi1phytimer_clk_src.c),
1686 },
1687};
1688
1689static struct clk_freq_tbl ftbl_dsi_clk[] = {
1690 F_MDSS(155000000, dsipll, 6, 0, 0),
1691 F_MDSS(310000000, dsipll, 3, 0, 0),
1692 F_END,
1693};
1694
1695static struct rcg_clk dsi_clk_src = {
1696 .cmd_rcgr_reg = DSI_CMD_RCGR,
1697 .set_rate = set_rate_mnd,
1698 .freq_tbl = ftbl_dsi_clk,
1699 .current_freq = &rcg_dummy_freq,
1700 .base = &virt_bases[MMSS_BASE],
1701 .c = {
1702 .dbg_name = "dsi_clk_src",
1703 .ops = &clk_ops_rcg_mnd,
1704 VDD_DIG_FMAX_MAP2(LOW, 155000000, NOMINAL, 310000000),
1705 CLK_INIT(dsi_clk_src.c),
1706 },
1707};
1708
1709static struct clk_freq_tbl ftbl_dsi_byte_clk[] = {
1710 F_MDSS( 62500000, dsipll, 12, 0, 0),
1711 F_MDSS(125000000, dsipll, 6, 0, 0),
1712 F_END,
1713};
1714
1715static struct rcg_clk dsi_byte_clk_src = {
1716 .cmd_rcgr_reg = DSI_BYTE_CMD_RCGR,
1717 .set_rate = set_rate_hid,
1718 .freq_tbl = ftbl_dsi_byte_clk,
1719 .current_freq = &rcg_dummy_freq,
1720 .base = &virt_bases[MMSS_BASE],
1721 .c = {
1722 .dbg_name = "dsi_byte_clk_src",
1723 .ops = &clk_ops_rcg,
1724 VDD_DIG_FMAX_MAP2(LOW, 62500000, NOMINAL, 125000000),
1725 CLK_INIT(dsi_byte_clk_src.c),
1726 },
1727};
1728
1729static struct clk_freq_tbl ftbl_dsi_esc_clk[] = {
1730 F_MM(19200000, gcc_xo, 1, 0, 0),
1731 F_END,
1732};
1733
1734static struct rcg_clk dsi_esc_clk_src = {
1735 .cmd_rcgr_reg = DSI_ESC_CMD_RCGR,
1736 .set_rate = set_rate_hid,
1737 .freq_tbl = ftbl_dsi_esc_clk,
1738 .current_freq = &rcg_dummy_freq,
1739 .base = &virt_bases[MMSS_BASE],
1740 .c = {
1741 .dbg_name = "dsi_esc_clk_src",
1742 .ops = &clk_ops_rcg,
1743 VDD_DIG_FMAX_MAP1(LOW, 19200000),
1744 CLK_INIT(dsi_esc_clk_src.c),
1745 },
1746};
1747
1748static struct clk_freq_tbl ftbl_mclk0_1_clk[] = {
1749 F_MM(66670000, gpll0, 9, 0, 0),
1750 F_END,
1751};
1752
1753static struct rcg_clk mclk0_clk_src = {
1754 .cmd_rcgr_reg = MCLK0_CMD_RCGR,
1755 .set_rate = set_rate_mnd,
1756 .freq_tbl = ftbl_mclk0_1_clk,
1757 .current_freq = &rcg_dummy_freq,
1758 .base = &virt_bases[MMSS_BASE],
1759 .c = {
1760 .dbg_name = "mclk0_clk_src",
1761 .ops = &clk_ops_rcg_mnd,
1762 VDD_DIG_FMAX_MAP1(LOW, 66670000),
1763 CLK_INIT(mclk0_clk_src.c),
1764 },
1765};
1766
1767static struct rcg_clk mclk1_clk_src = {
1768 .cmd_rcgr_reg = MCLK1_CMD_RCGR,
1769 .set_rate = set_rate_mnd,
1770 .freq_tbl = ftbl_mclk0_1_clk,
1771 .current_freq = &rcg_dummy_freq,
1772 .base = &virt_bases[MMSS_BASE],
1773 .c = {
1774 .dbg_name = "mclk1_clk_src",
1775 .ops = &clk_ops_rcg_mnd,
1776 VDD_DIG_FMAX_MAP1(LOW, 66670000),
1777 CLK_INIT(mclk1_clk_src.c),
1778 },
1779};
1780
1781static struct clk_freq_tbl ftbl_mdp_vsync_clk[] = {
1782 F_MM(19200000, gcc_xo, 1, 0, 0),
1783 F_END,
1784};
1785
1786static struct rcg_clk mdp_vsync_clk_src = {
1787 .cmd_rcgr_reg = MDP_VSYNC_CMD_RCGR,
1788 .set_rate = set_rate_hid,
1789 .freq_tbl = ftbl_mdp_vsync_clk,
1790 .current_freq = &rcg_dummy_freq,
1791 .base = &virt_bases[MMSS_BASE],
1792 .c = {
1793 .dbg_name = "mdp_vsync_clk_src",
1794 .ops = &clk_ops_rcg,
1795 VDD_DIG_FMAX_MAP1(LOW, 19200000),
1796 CLK_INIT(mdp_vsync_clk_src.c),
1797 },
1798};
1799
1800static struct branch_clk bimc_gfx_clk = {
1801 .cbcr_reg = BIMC_GFX_CBCR,
1802 .has_sibling = 1,
1803 .base = &virt_bases[MMSS_BASE],
Vikram Mulukutla2dfa8b12013-01-15 18:17:10 -08001804 /* FIXME: Remove this once simulation is fixed. */
1805 .halt_check = DELAY,
Vikram Mulukutlab13abe42012-10-03 11:38:48 -07001806 .c = {
1807 .dbg_name = "bimc_gfx_clk",
1808 .ops = &clk_ops_branch,
1809 CLK_INIT(bimc_gfx_clk.c),
Vikram Mulukutla55318acb2013-04-15 17:47:34 -07001810 /* FIXME: Remove once kgsl votes on the depends clock. */
1811 .depends = &gcc_bimc_smmu_clk.c,
Vikram Mulukutlab13abe42012-10-03 11:38:48 -07001812 },
1813};
1814
1815static struct branch_clk csi0_clk = {
1816 .cbcr_reg = CSI0_CBCR,
1817 .has_sibling = 1,
1818 .base = &virt_bases[MMSS_BASE],
1819 .c = {
1820 .parent = &csi0_clk_src.c,
1821 .dbg_name = "csi0_clk",
1822 .ops = &clk_ops_branch,
1823 CLK_INIT(csi0_clk.c),
1824 },
1825};
1826
1827static struct branch_clk csi0phy_clk = {
1828 .cbcr_reg = CSI0PHY_CBCR,
1829 .has_sibling = 1,
1830 .base = &virt_bases[MMSS_BASE],
1831 .c = {
1832 .parent = &csi0_clk_src.c,
1833 .dbg_name = "csi0phy_clk",
1834 .ops = &clk_ops_branch,
1835 CLK_INIT(csi0phy_clk.c),
1836 },
1837};
1838
1839static struct branch_clk csi0phytimer_clk = {
1840 .cbcr_reg = CSI0PHYTIMER_CBCR,
1841 .has_sibling = 0,
1842 .base = &virt_bases[MMSS_BASE],
1843 .c = {
1844 .parent = &csi0phytimer_clk_src.c,
1845 .dbg_name = "csi0phytimer_clk",
1846 .ops = &clk_ops_branch,
1847 CLK_INIT(csi0phytimer_clk.c),
1848 },
1849};
1850
1851static struct branch_clk csi0pix_clk = {
1852 .cbcr_reg = CSI0PIX_CBCR,
1853 .has_sibling = 1,
1854 .base = &virt_bases[MMSS_BASE],
1855 .c = {
1856 .parent = &csi0_clk_src.c,
1857 .dbg_name = "csi0pix_clk",
1858 .ops = &clk_ops_branch,
1859 CLK_INIT(csi0pix_clk.c),
1860 },
1861};
1862
1863static struct branch_clk csi0rdi_clk = {
1864 .cbcr_reg = CSI0RDI_CBCR,
1865 .has_sibling = 1,
1866 .base = &virt_bases[MMSS_BASE],
1867 .c = {
1868 .parent = &csi0_clk_src.c,
1869 .dbg_name = "csi0rdi_clk",
1870 .ops = &clk_ops_branch,
1871 CLK_INIT(csi0rdi_clk.c),
1872 },
1873};
1874
1875static struct branch_clk csi1_clk = {
1876 .cbcr_reg = CSI1_CBCR,
1877 .has_sibling = 1,
1878 .base = &virt_bases[MMSS_BASE],
1879 .c = {
1880 .parent = &csi1_clk_src.c,
1881 .dbg_name = "csi1_clk",
1882 .ops = &clk_ops_branch,
1883 CLK_INIT(csi1_clk.c),
1884 },
1885};
1886
1887static struct branch_clk csi1phy_clk = {
1888 .cbcr_reg = CSI1PHY_CBCR,
1889 .has_sibling = 1,
1890 .base = &virt_bases[MMSS_BASE],
1891 .c = {
1892 .parent = &csi1_clk_src.c,
1893 .dbg_name = "csi1phy_clk",
1894 .ops = &clk_ops_branch,
1895 CLK_INIT(csi1phy_clk.c),
1896 },
1897};
1898
1899static struct branch_clk csi1phytimer_clk = {
1900 .cbcr_reg = CSI1PHYTIMER_CBCR,
1901 .has_sibling = 0,
1902 .base = &virt_bases[MMSS_BASE],
1903 .c = {
1904 .parent = &csi1phytimer_clk_src.c,
1905 .dbg_name = "csi1phytimer_clk",
1906 .ops = &clk_ops_branch,
1907 CLK_INIT(csi1phytimer_clk.c),
1908 },
1909};
1910
1911static struct branch_clk csi1pix_clk = {
1912 .cbcr_reg = CSI1PIX_CBCR,
1913 .has_sibling = 1,
1914 .base = &virt_bases[MMSS_BASE],
1915 .c = {
Vikram Mulukutlaa1d5c142013-01-16 10:30:12 -08001916 .parent = &csi1_clk_src.c,
Vikram Mulukutlab13abe42012-10-03 11:38:48 -07001917 .dbg_name = "csi1pix_clk",
1918 .ops = &clk_ops_branch,
1919 CLK_INIT(csi1pix_clk.c),
1920 },
1921};
1922
1923static struct branch_clk csi1rdi_clk = {
1924 .cbcr_reg = CSI1RDI_CBCR,
1925 .has_sibling = 1,
1926 .base = &virt_bases[MMSS_BASE],
1927 .c = {
Vikram Mulukutlaa1d5c142013-01-16 10:30:12 -08001928 .parent = &csi1_clk_src.c,
Vikram Mulukutlab13abe42012-10-03 11:38:48 -07001929 .dbg_name = "csi1rdi_clk",
1930 .ops = &clk_ops_branch,
1931 CLK_INIT(csi1rdi_clk.c),
1932 },
1933};
1934
1935static struct branch_clk csi_ahb_clk = {
1936 .cbcr_reg = CSI_AHB_CBCR,
1937 .has_sibling = 1,
1938 .base = &virt_bases[MMSS_BASE],
1939 .c = {
1940 .dbg_name = "csi_ahb_clk",
1941 .ops = &clk_ops_branch,
1942 CLK_INIT(csi_ahb_clk.c),
1943 },
1944};
1945
1946static struct branch_clk csi_vfe_clk = {
1947 .cbcr_reg = CSI_VFE_CBCR,
1948 .has_sibling = 1,
1949 .base = &virt_bases[MMSS_BASE],
1950 .c = {
1951 .parent = &vfe_clk_src.c,
1952 .dbg_name = "csi_vfe_clk",
1953 .ops = &clk_ops_branch,
1954 CLK_INIT(csi_vfe_clk.c),
1955 },
1956};
1957
1958static struct branch_clk dsi_clk = {
1959 .cbcr_reg = DSI_CBCR,
1960 .has_sibling = 0,
1961 .base = &virt_bases[MMSS_BASE],
1962 .c = {
1963 .parent = &dsi_clk_src.c,
1964 .dbg_name = "dsi_clk",
1965 .ops = &clk_ops_branch,
1966 CLK_INIT(dsi_clk.c),
1967 },
1968};
1969
1970static struct branch_clk dsi_ahb_clk = {
1971 .cbcr_reg = DSI_AHB_CBCR,
1972 .has_sibling = 1,
1973 .base = &virt_bases[MMSS_BASE],
1974 .c = {
1975 .dbg_name = "dsi_ahb_clk",
1976 .ops = &clk_ops_branch,
1977 CLK_INIT(dsi_ahb_clk.c),
1978 },
1979};
1980
1981static struct branch_clk dsi_byte_clk = {
1982 .cbcr_reg = DSI_BYTE_CBCR,
1983 .has_sibling = 0,
1984 .base = &virt_bases[MMSS_BASE],
1985 .c = {
1986 .parent = &dsi_byte_clk_src.c,
1987 .dbg_name = "dsi_byte_clk",
1988 .ops = &clk_ops_branch,
1989 CLK_INIT(dsi_byte_clk.c),
1990 },
1991};
1992
1993static struct branch_clk dsi_esc_clk = {
1994 .cbcr_reg = DSI_ESC_CBCR,
1995 .has_sibling = 0,
1996 .base = &virt_bases[MMSS_BASE],
1997 .c = {
1998 .parent = &dsi_esc_clk_src.c,
1999 .dbg_name = "dsi_esc_clk",
2000 .ops = &clk_ops_branch,
2001 CLK_INIT(dsi_esc_clk.c),
2002 },
2003};
2004
2005static struct branch_clk dsi_pclk_clk = {
2006 .cbcr_reg = DSI_PCLK_CBCR,
2007 .has_sibling = 1,
2008 .base = &virt_bases[MMSS_BASE],
2009 .c = {
2010 .parent = &dsi_pclk_clk_src.c,
2011 .dbg_name = "dsi_pclk_clk",
2012 .ops = &clk_ops_branch,
2013 CLK_INIT(dsi_pclk_clk.c),
2014 },
2015};
2016
2017static struct branch_clk gmem_gfx3d_clk = {
2018 .cbcr_reg = GMEM_GFX3D_CBCR,
2019 .has_sibling = 1,
2020 .base = &virt_bases[MMSS_BASE],
2021 .c = {
2022 .parent = &gfx3d_clk_src.c,
2023 .dbg_name = "gmem_gfx3d_clk",
2024 .ops = &clk_ops_branch,
2025 CLK_INIT(gmem_gfx3d_clk.c),
2026 },
2027};
2028
2029static struct branch_clk mclk0_clk = {
2030 .cbcr_reg = MCLK0_CBCR,
2031 .has_sibling = 0,
2032 .base = &virt_bases[MMSS_BASE],
2033 .c = {
2034 .parent = &mclk0_clk_src.c,
2035 .dbg_name = "mclk0_clk",
2036 .ops = &clk_ops_branch,
2037 CLK_INIT(mclk0_clk.c),
2038 },
2039};
2040
2041static struct branch_clk mclk1_clk = {
2042 .cbcr_reg = MCLK1_CBCR,
2043 .has_sibling = 0,
2044 .base = &virt_bases[MMSS_BASE],
2045 .c = {
2046 .parent = &mclk1_clk_src.c,
2047 .dbg_name = "mclk1_clk",
2048 .ops = &clk_ops_branch,
2049 CLK_INIT(mclk1_clk.c),
2050 },
2051};
2052
2053static struct branch_clk mdp_ahb_clk = {
2054 .cbcr_reg = MDP_AHB_CBCR,
2055 .has_sibling = 1,
2056 .base = &virt_bases[MMSS_BASE],
2057 .c = {
2058 .dbg_name = "mdp_ahb_clk",
2059 .ops = &clk_ops_branch,
2060 CLK_INIT(mdp_ahb_clk.c),
2061 },
2062};
2063
2064static struct branch_clk mdp_axi_clk = {
2065 .cbcr_reg = MDP_AXI_CBCR,
Vikram Mulukutlab13abe42012-10-03 11:38:48 -07002066 .base = &virt_bases[MMSS_BASE],
Vikram Mulukutla2dfa8b12013-01-15 18:17:10 -08002067 /* FIXME: Remove this once simulation is fixed. */
2068 .halt_check = DELAY,
Vikram Mulukutlab13abe42012-10-03 11:38:48 -07002069 .c = {
Vikram Mulukutlae1e5c482013-01-28 14:43:20 -08002070 .parent = &mdp_axi_clk_src.c,
Vikram Mulukutlab13abe42012-10-03 11:38:48 -07002071 .dbg_name = "mdp_axi_clk",
2072 .ops = &clk_ops_branch,
2073 CLK_INIT(mdp_axi_clk.c),
2074 },
2075};
2076
2077static struct branch_clk mdp_dsi_clk = {
2078 .cbcr_reg = MDP_DSI_CBCR,
2079 .has_sibling = 1,
2080 .base = &virt_bases[MMSS_BASE],
2081 .c = {
2082 .parent = &dsi_pclk_clk_src.c,
2083 .dbg_name = "mdp_dsi_clk",
2084 .ops = &clk_ops_branch,
2085 CLK_INIT(mdp_dsi_clk.c),
2086 },
2087};
2088
2089static struct branch_clk mdp_lcdc_clk = {
2090 .cbcr_reg = MDP_LCDC_CBCR,
2091 .has_sibling = 1,
2092 .base = &virt_bases[MMSS_BASE],
2093 .c = {
2094 .parent = &dsi_pclk_clk_src.c,
2095 .dbg_name = "mdp_lcdc_clk",
2096 .ops = &clk_ops_branch,
2097 CLK_INIT(mdp_lcdc_clk.c),
2098 },
2099};
2100
2101static struct branch_clk mdp_vsync_clk = {
2102 .cbcr_reg = MDP_VSYNC_CBCR,
2103 .has_sibling = 0,
2104 .base = &virt_bases[MMSS_BASE],
2105 .c = {
2106 .parent = &mdp_vsync_clk_src.c,
2107 .dbg_name = "mdp_vsync_clk",
2108 .ops = &clk_ops_branch,
2109 CLK_INIT(mdp_vsync_clk.c),
2110 },
2111};
2112
2113static struct branch_clk mmss_misc_ahb_clk = {
2114 .cbcr_reg = MMSS_MISC_AHB_CBCR,
2115 .has_sibling = 1,
2116 .base = &virt_bases[MMSS_BASE],
2117 .c = {
2118 .dbg_name = "mmss_misc_ahb_clk",
2119 .ops = &clk_ops_branch,
2120 CLK_INIT(mmss_misc_ahb_clk.c),
2121 },
2122};
2123
2124static struct branch_clk mmss_mmssnoc_axi_clk = {
2125 .cbcr_reg = MMSS_MMSSNOC_AXI_CBCR,
2126 .has_sibling = 1,
2127 .base = &virt_bases[MMSS_BASE],
2128 .c = {
2129 .parent = &axi_clk_src.c,
2130 .dbg_name = "mmss_mmssnoc_axi_clk",
2131 .ops = &clk_ops_branch,
2132 CLK_INIT(mmss_mmssnoc_axi_clk.c),
2133 },
2134};
2135
2136static struct branch_clk mmss_s0_axi_clk = {
2137 .cbcr_reg = MMSS_S0_AXI_CBCR,
2138 .has_sibling = 0,
2139 .base = &virt_bases[MMSS_BASE],
2140 .c = {
Vikram Mulukutlae1e5c482013-01-28 14:43:20 -08002141 .parent = &mmssnoc_axi_clk_src.c,
Vikram Mulukutlab13abe42012-10-03 11:38:48 -07002142 .dbg_name = "mmss_s0_axi_clk",
2143 .ops = &clk_ops_branch,
2144 CLK_INIT(mmss_s0_axi_clk.c),
2145 .depends = &mmss_mmssnoc_axi_clk.c,
2146 },
2147};
2148
Vikram Mulukutlab13abe42012-10-03 11:38:48 -07002149static struct branch_clk mmss_mmssnoc_bto_ahb_clk = {
2150 .cbcr_reg = MMSS_MMSSNOC_BTO_AHB_CBCR,
2151 .has_sibling = 1,
2152 .base = &virt_bases[MMSS_BASE],
2153 .c = {
2154 .dbg_name = "mmss_mmssnoc_bto_ahb_clk",
2155 .ops = &clk_ops_branch,
2156 CLK_INIT(mmss_mmssnoc_bto_ahb_clk.c),
2157 },
2158};
2159
2160static struct branch_clk oxili_ahb_clk = {
2161 .cbcr_reg = OXILI_AHB_CBCR,
2162 .has_sibling = 1,
2163 .base = &virt_bases[MMSS_BASE],
2164 .c = {
2165 .dbg_name = "oxili_ahb_clk",
2166 .ops = &clk_ops_branch,
2167 CLK_INIT(oxili_ahb_clk.c),
2168 },
2169};
2170
2171static struct branch_clk oxili_gfx3d_clk = {
2172 .cbcr_reg = OXILI_GFX3D_CBCR,
2173 .has_sibling = 0,
2174 .base = &virt_bases[MMSS_BASE],
2175 .c = {
2176 .parent = &gfx3d_clk_src.c,
2177 .dbg_name = "oxili_gfx3d_clk",
2178 .ops = &clk_ops_branch,
2179 CLK_INIT(oxili_gfx3d_clk.c),
2180 },
2181};
2182
2183static struct branch_clk vfe_clk = {
2184 .cbcr_reg = VFE_CBCR,
2185 .has_sibling = 1,
2186 .base = &virt_bases[MMSS_BASE],
2187 .c = {
2188 .parent = &vfe_clk_src.c,
2189 .dbg_name = "vfe_clk",
2190 .ops = &clk_ops_branch,
2191 CLK_INIT(vfe_clk.c),
2192 },
2193};
2194
2195static struct branch_clk vfe_ahb_clk = {
2196 .cbcr_reg = VFE_AHB_CBCR,
2197 .has_sibling = 1,
2198 .base = &virt_bases[MMSS_BASE],
2199 .c = {
2200 .dbg_name = "vfe_ahb_clk",
2201 .ops = &clk_ops_branch,
2202 CLK_INIT(vfe_ahb_clk.c),
2203 },
2204};
2205
2206static struct branch_clk vfe_axi_clk = {
2207 .cbcr_reg = VFE_AXI_CBCR,
2208 .has_sibling = 1,
2209 .base = &virt_bases[MMSS_BASE],
Vikram Mulukutla2dfa8b12013-01-15 18:17:10 -08002210 /* FIXME: Remove this once simulation is fixed. */
2211 .halt_check = DELAY,
Vikram Mulukutlab13abe42012-10-03 11:38:48 -07002212 .c = {
2213 .parent = &axi_clk_src.c,
2214 .dbg_name = "vfe_axi_clk",
2215 .ops = &clk_ops_branch,
2216 CLK_INIT(vfe_axi_clk.c),
2217 },
2218};
2219
Vikram Mulukutlab13abe42012-10-03 11:38:48 -07002220static struct branch_clk q6ss_ahb_lfabif_clk = {
2221 .cbcr_reg = Q6SS_AHB_LFABIF_CBCR,
2222 .has_sibling = 1,
2223 .base = &virt_bases[LPASS_BASE],
2224 .c = {
2225 .dbg_name = "q6ss_ahb_lfabif_clk",
2226 .ops = &clk_ops_branch,
2227 CLK_INIT(q6ss_ahb_lfabif_clk.c),
2228 },
2229};
2230
2231static struct branch_clk q6ss_ahbm_clk = {
2232 .cbcr_reg = Q6SS_AHBM_CBCR,
2233 .has_sibling = 1,
2234 .base = &virt_bases[LPASS_BASE],
2235 .c = {
2236 .dbg_name = "q6ss_ahbm_clk",
2237 .ops = &clk_ops_branch,
2238 CLK_INIT(q6ss_ahbm_clk.c),
2239 },
2240};
2241
2242static struct branch_clk q6ss_xo_clk = {
2243 .cbcr_reg = Q6SS_XO_CBCR,
2244 .has_sibling = 1,
2245 .bcr_reg = LPASS_Q6SS_BCR,
2246 .base = &virt_bases[LPASS_BASE],
2247 .c = {
Vikram Mulukutlab13abe42012-10-03 11:38:48 -07002248 .dbg_name = "q6ss_xo_clk",
2249 .ops = &clk_ops_branch,
2250 CLK_INIT(q6ss_xo_clk.c),
2251 },
2252};
2253
Vikram Mulukutlab13abe42012-10-03 11:38:48 -07002254#ifdef CONFIG_DEBUG_FS
2255
2256struct measure_mux_entry {
2257 struct clk *c;
2258 int base;
2259 u32 debug_mux;
2260};
2261
2262static struct measure_mux_entry measure_mux[] = {
2263 { &snoc_clk.c, GCC_BASE, 0x0000},
2264 { &cnoc_clk.c, GCC_BASE, 0x0008},
2265 { &gcc_copss_smmu_ahb_clk.c, GCC_BASE, 0x000c},
2266 { &gcc_lpss_smmu_ahb_clk.c, GCC_BASE, 0x000d},
2267 { &pnoc_clk.c, GCC_BASE, 0x0010},
2268 { &gcc_mmss_noc_cfg_ahb_clk.c, GCC_BASE, 0x002a},
2269 { &gcc_mss_cfg_ahb_clk.c, GCC_BASE, 0x0030},
2270 { &gcc_mss_q6_bimc_axi_clk.c, GCC_BASE, 0x0031},
2271 { &gcc_usb_hs_system_clk.c, GCC_BASE, 0x0060},
2272 { &gcc_usb_hs_ahb_clk.c, GCC_BASE, 0x0061},
2273 { &gcc_usb2a_phy_sleep_clk.c, GCC_BASE, 0x0063},
2274 { &gcc_sdcc1_apps_clk.c, GCC_BASE, 0x0068},
2275 { &gcc_sdcc1_ahb_clk.c, GCC_BASE, 0x0069},
2276 { &gcc_sdcc2_apps_clk.c, GCC_BASE, 0x0070},
2277 { &gcc_sdcc2_ahb_clk.c, GCC_BASE, 0x0071},
2278 { &gcc_blsp1_ahb_clk.c, GCC_BASE, 0x0088},
2279 {&gcc_blsp1_qup1_spi_apps_clk.c, GCC_BASE, 0x008a},
2280 {&gcc_blsp1_qup1_i2c_apps_clk.c, GCC_BASE, 0x008b},
2281 { &gcc_blsp1_uart1_apps_clk.c, GCC_BASE, 0x008c},
2282 {&gcc_blsp1_qup2_spi_apps_clk.c, GCC_BASE, 0x008e},
2283 {&gcc_blsp1_qup2_i2c_apps_clk.c, GCC_BASE, 0x0090},
2284 { &gcc_blsp1_uart2_apps_clk.c, GCC_BASE, 0x0091},
2285 {&gcc_blsp1_qup3_spi_apps_clk.c, GCC_BASE, 0x0093},
2286 {&gcc_blsp1_qup3_i2c_apps_clk.c, GCC_BASE, 0x0094},
2287 { &gcc_blsp1_uart3_apps_clk.c, GCC_BASE, 0x0095},
2288 {&gcc_blsp1_qup4_spi_apps_clk.c, GCC_BASE, 0x0098},
2289 {&gcc_blsp1_qup4_i2c_apps_clk.c, GCC_BASE, 0x0099},
2290 { &gcc_blsp1_uart4_apps_clk.c, GCC_BASE, 0x009a},
2291 {&gcc_blsp1_qup5_spi_apps_clk.c, GCC_BASE, 0x009c},
2292 {&gcc_blsp1_qup5_i2c_apps_clk.c, GCC_BASE, 0x009d},
2293 { &gcc_blsp1_uart5_apps_clk.c, GCC_BASE, 0x009e},
2294 {&gcc_blsp1_qup6_spi_apps_clk.c, GCC_BASE, 0x00a1},
2295 {&gcc_blsp1_qup6_i2c_apps_clk.c, GCC_BASE, 0x00a2},
2296 { &gcc_blsp1_uart6_apps_clk.c, GCC_BASE, 0x00a3},
2297 { &gcc_pdm_ahb_clk.c, GCC_BASE, 0x00d0},
2298 { &gcc_pdm2_clk.c, GCC_BASE, 0x00d2},
2299 { &gcc_prng_ahb_clk.c, GCC_BASE, 0x00d8},
2300 { &gcc_boot_rom_ahb_clk.c, GCC_BASE, 0x00f8},
2301 { &gcc_ce1_clk.c, GCC_BASE, 0x0138},
2302 { &gcc_ce1_axi_clk.c, GCC_BASE, 0x0139},
2303 { &gcc_ce1_ahb_clk.c, GCC_BASE, 0x013a},
2304 { &gcc_xo_clk_src.c, GCC_BASE, 0x0149},
2305 { &bimc_clk.c, GCC_BASE, 0x0154},
Vikram Mulukutla55318acb2013-04-15 17:47:34 -07002306 { &gcc_bimc_smmu_clk.c, GCC_BASE, 0x015e},
Vikram Mulukutlab13abe42012-10-03 11:38:48 -07002307 { &gcc_lpass_q6_axi_clk.c, GCC_BASE, 0x0160},
2308
Vikram Mulukutla82cb8442013-01-28 13:36:51 -08002309 { &mmssnoc_ahb_clk.c, MMSS_BASE, 0x0001},
Vikram Mulukutlab13abe42012-10-03 11:38:48 -07002310 { &mmss_misc_ahb_clk.c, MMSS_BASE, 0x0003},
2311 {&mmss_mmssnoc_axi_clk.c, MMSS_BASE, 0x0004},
2312 { &mmss_s0_axi_clk.c, MMSS_BASE, 0x0005},
2313 { &oxili_ahb_clk.c, MMSS_BASE, 0x0007},
2314 { &oxili_gfx3d_clk.c, MMSS_BASE, 0x0008},
2315 { &gmem_gfx3d_clk.c, MMSS_BASE, 0x0009},
2316 { &mdp_axi_clk.c, MMSS_BASE, 0x000a},
2317 { &mdp_vsync_clk.c, MMSS_BASE, 0x000b},
2318 { &mdp_ahb_clk.c, MMSS_BASE, 0x000c},
2319 { &dsi_pclk_clk.c, MMSS_BASE, 0x000d},
2320 { &mdp_dsi_clk.c, MMSS_BASE, 0x000e},
2321 { &mdp_lcdc_clk.c, MMSS_BASE, 0x000f},
2322 { &dsi_clk.c, MMSS_BASE, 0x0010},
2323 { &dsi_byte_clk.c, MMSS_BASE, 0x0011},
2324 { &dsi_esc_clk.c, MMSS_BASE, 0x0012},
2325 { &dsi_ahb_clk.c, MMSS_BASE, 0x0013},
2326 { &mclk0_clk.c, MMSS_BASE, 0x0015},
2327 { &mclk1_clk.c, MMSS_BASE, 0x0016},
2328 { &csi0phytimer_clk.c, MMSS_BASE, 0x0017},
2329 { &csi1phytimer_clk.c, MMSS_BASE, 0x0018},
2330 { &vfe_clk.c, MMSS_BASE, 0x0019},
2331 { &vfe_ahb_clk.c, MMSS_BASE, 0x001a},
2332 { &vfe_axi_clk.c, MMSS_BASE, 0x001b},
2333 { &csi_vfe_clk.c, MMSS_BASE, 0x001c},
2334 { &csi0_clk.c, MMSS_BASE, 0x001d},
2335 { &csi_ahb_clk.c, MMSS_BASE, 0x001e},
2336 { &csi0phy_clk.c, MMSS_BASE, 0x001f},
2337 { &csi0rdi_clk.c, MMSS_BASE, 0x0020},
2338 { &csi0pix_clk.c, MMSS_BASE, 0x0021},
2339 { &csi1_clk.c, MMSS_BASE, 0x0022},
2340 { &csi1phy_clk.c, MMSS_BASE, 0x0023},
2341 { &csi1rdi_clk.c, MMSS_BASE, 0x0024},
2342 { &csi1pix_clk.c, MMSS_BASE, 0x0025},
2343 { &bimc_gfx_clk.c, MMSS_BASE, 0x0032},
2344
Vikram Mulukutlab13abe42012-10-03 11:38:48 -07002345 { &q6ss_ahbm_clk.c, LPASS_BASE, 0x001d},
2346 { &q6ss_ahb_lfabif_clk.c, LPASS_BASE, 0x001e},
Vikram Mulukutlab13abe42012-10-03 11:38:48 -07002347 { &q6ss_xo_clk.c, LPASS_BASE, 0x002b},
Vikram Mulukutlab13abe42012-10-03 11:38:48 -07002348
Vikram Mulukutla4157cca2013-01-24 15:42:41 -08002349 {&apc0_m_clk, APCS_BASE, 0x10},
2350 {&apc1_m_clk, APCS_BASE, 0x11},
2351 {&apc2_m_clk, APCS_BASE, 0x12},
2352 {&apc3_m_clk, APCS_BASE, 0x13},
2353 {&l2_m_clk, APCS_BASE, 0x15},
2354
Vikram Mulukutlab13abe42012-10-03 11:38:48 -07002355 {&dummy_clk, N_BASES, 0x0000},
2356};
2357
2358#define GCC_DEBUG_CLK_CTL 0x1880
2359#define MMSS_DEBUG_CLK_CTL 0x0900
2360#define LPASS_DEBUG_CLK_CTL 0x29000
2361#define GLB_CLK_DIAG 0x001C
2362
2363static int measure_clk_set_parent(struct clk *c, struct clk *parent)
2364{
2365 struct measure_clk *clk = to_measure_clk(c);
2366 unsigned long flags;
2367 u32 regval, clk_sel, i;
2368
2369 if (!parent)
2370 return -EINVAL;
2371
2372 for (i = 0; i < (ARRAY_SIZE(measure_mux) - 1); i++)
2373 if (measure_mux[i].c == parent)
2374 break;
2375
2376 if (measure_mux[i].c == &dummy_clk)
2377 return -EINVAL;
2378
2379 spin_lock_irqsave(&local_clock_reg_lock, flags);
2380 /*
2381 * Program the test vector, measurement period (sample_ticks)
2382 * and scaling multiplier.
2383 */
2384 clk->sample_ticks = 0x10000;
2385 clk->multiplier = 1;
2386
2387 switch (measure_mux[i].base) {
2388
2389 case GCC_BASE:
2390 writel_relaxed(0, GCC_REG_BASE(GCC_DEBUG_CLK_CTL));
2391 clk_sel = measure_mux[i].debug_mux;
2392 break;
2393
2394 case MMSS_BASE:
2395 writel_relaxed(0, MMSS_REG_BASE(MMSS_DEBUG_CLK_CTL));
2396 clk_sel = 0x02C;
2397 regval = BVAL(11, 0, measure_mux[i].debug_mux);
2398 writel_relaxed(regval, MMSS_REG_BASE(MMSS_DEBUG_CLK_CTL));
2399
2400 /* Activate debug clock output */
2401 regval |= BIT(16);
2402 writel_relaxed(regval, MMSS_REG_BASE(MMSS_DEBUG_CLK_CTL));
2403 break;
2404
2405 case LPASS_BASE:
2406 writel_relaxed(0, LPASS_REG_BASE(LPASS_DEBUG_CLK_CTL));
2407 clk_sel = 0x161;
2408 regval = BVAL(11, 0, measure_mux[i].debug_mux);
2409 writel_relaxed(regval, LPASS_REG_BASE(LPASS_DEBUG_CLK_CTL));
2410
2411 /* Activate debug clock output */
2412 regval |= BIT(20);
2413 writel_relaxed(regval, LPASS_REG_BASE(LPASS_DEBUG_CLK_CTL));
2414 break;
2415
2416 case APCS_BASE:
2417 clk->multiplier = 4;
2418 clk_sel = 0x16A;
2419 regval = measure_mux[i].debug_mux;
2420 writel_relaxed(regval, APCS_REG_BASE(GLB_CLK_DIAG));
2421 break;
2422
2423 default:
2424 return -EINVAL;
2425 }
2426
2427 /* Set debug mux clock index */
2428 regval = BVAL(8, 0, clk_sel);
2429 writel_relaxed(regval, GCC_REG_BASE(GCC_DEBUG_CLK_CTL));
2430
2431 /* Activate debug clock output */
2432 regval |= BIT(16);
2433 writel_relaxed(regval, GCC_REG_BASE(GCC_DEBUG_CLK_CTL));
2434
2435 /* Make sure test vector is set before starting measurements. */
2436 mb();
2437 spin_unlock_irqrestore(&local_clock_reg_lock, flags);
2438
2439 return 0;
2440}
2441
2442#define CLOCK_FRQ_MEASURE_CTL 0x1884
2443#define CLOCK_FRQ_MEASURE_STATUS 0x1888
2444
2445/* Sample clock for 'ticks' reference clock ticks. */
2446static u32 run_measurement(unsigned ticks)
2447{
2448 /* Stop counters and set the XO4 counter start value. */
2449 writel_relaxed(ticks, GCC_REG_BASE(CLOCK_FRQ_MEASURE_CTL));
2450
2451 /* Wait for timer to become ready. */
2452 while ((readl_relaxed(GCC_REG_BASE(CLOCK_FRQ_MEASURE_STATUS)) &
2453 BIT(25)) != 0)
2454 cpu_relax();
2455
2456 /* Run measurement and wait for completion. */
2457 writel_relaxed(BIT(20)|ticks, GCC_REG_BASE(CLOCK_FRQ_MEASURE_CTL));
2458 while ((readl_relaxed(GCC_REG_BASE(CLOCK_FRQ_MEASURE_STATUS)) &
2459 BIT(25)) == 0)
2460 cpu_relax();
2461
2462 /* Return measured ticks. */
2463 return readl_relaxed(GCC_REG_BASE(CLOCK_FRQ_MEASURE_STATUS)) &
2464 BM(24, 0);
2465}
2466
2467#define GCC_XO_DIV4_CBCR 0x10C8
2468#define PLLTEST_PAD_CFG 0x188C
2469
2470/*
2471 * Perform a hardware rate measurement for a given clock.
2472 * FOR DEBUG USE ONLY: Measurements take ~15 ms!
2473 */
2474static unsigned long measure_clk_get_rate(struct clk *c)
2475{
2476 unsigned long flags;
2477 u32 gcc_xo4_reg_backup;
2478 u64 raw_count_short, raw_count_full;
2479 struct measure_clk *clk = to_measure_clk(c);
2480 unsigned ret;
2481
2482 ret = clk_prepare_enable(&gcc_xo_clk_src.c);
2483 if (ret) {
2484 pr_warning("CXO clock failed to enable. Can't measure\n");
2485 return 0;
2486 }
2487
2488 spin_lock_irqsave(&local_clock_reg_lock, flags);
2489
2490 /* Enable CXO/4 and RINGOSC branch. */
2491 gcc_xo4_reg_backup = readl_relaxed(GCC_REG_BASE(GCC_XO_DIV4_CBCR));
2492 writel_relaxed(0x1, GCC_REG_BASE(GCC_XO_DIV4_CBCR));
2493
2494 /*
2495 * The ring oscillator counter will not reset if the measured clock
2496 * is not running. To detect this, run a short measurement before
2497 * the full measurement. If the raw results of the two are the same
2498 * then the clock must be off.
2499 */
2500
2501 /* Run a short measurement. (~1 ms) */
2502 raw_count_short = run_measurement(0x1000);
2503 /* Run a full measurement. (~14 ms) */
2504 raw_count_full = run_measurement(clk->sample_ticks);
2505
2506 writel_relaxed(gcc_xo4_reg_backup, GCC_REG_BASE(GCC_XO_DIV4_CBCR));
2507
2508 /* Return 0 if the clock is off. */
2509 if (raw_count_full == raw_count_short) {
2510 ret = 0;
2511 } else {
2512 /* Compute rate in Hz. */
2513 raw_count_full = ((raw_count_full * 10) + 15) * 4800000;
2514 do_div(raw_count_full, ((clk->sample_ticks * 10) + 35));
2515 ret = (raw_count_full * clk->multiplier);
2516 }
2517
2518 writel_relaxed(0x51A00, GCC_REG_BASE(PLLTEST_PAD_CFG));
2519 spin_unlock_irqrestore(&local_clock_reg_lock, flags);
2520
2521 clk_disable_unprepare(&gcc_xo_clk_src.c);
2522
2523 return ret;
2524}
2525#else /* !CONFIG_DEBUG_FS */
2526static int measure_clk_set_parent(struct clk *clk, struct clk *parent)
2527{
2528 return -EINVAL;
2529}
2530
2531static unsigned long measure_clk_get_rate(struct clk *clk)
2532{
2533 return 0;
2534}
2535#endif /* CONFIG_DEBUG_FS */
2536
2537static struct clk_ops clk_ops_measure = {
2538 .set_parent = measure_clk_set_parent,
2539 .get_rate = measure_clk_get_rate,
2540};
2541
2542static struct measure_clk measure_clk = {
2543 .c = {
2544 .dbg_name = "measure_clk",
2545 .ops = &clk_ops_measure,
2546 CLK_INIT(measure_clk.c),
2547 },
2548 .multiplier = 1,
2549};
2550
Syed Rameez Mustafa3971c142013-01-09 19:04:53 -08002551static struct clk_lookup msm_clocks_8610[] = {
Vikram Mulukutlab13abe42012-10-03 11:38:48 -07002552 CLK_LOOKUP("xo", gcc_xo_clk_src.c, "msm_otg"),
2553 CLK_LOOKUP("xo", gcc_xo_clk_src.c, "fe200000.qcom,lpass"),
Vikram Mulukutlacee3bcf2013-03-13 15:55:45 -07002554
2555 CLK_LOOKUP("xo", gcc_xo_clk_src.c, "fc880000.qcom,mss"),
2556 CLK_LOOKUP("bus_clk", gcc_mss_q6_bimc_axi_clk.c, "fc880000.qcom,mss"),
2557 CLK_LOOKUP("iface_clk", gcc_mss_cfg_ahb_clk.c, "fc880000.qcom,mss"),
2558 CLK_LOOKUP("mem_clk", gcc_boot_rom_ahb_clk.c, "fc880000.qcom,mss"),
2559
Vikram Mulukutlab13abe42012-10-03 11:38:48 -07002560 CLK_LOOKUP("xo", gcc_xo_clk_src.c, "pil-mba"),
2561 CLK_LOOKUP("xo", gcc_xo_clk_src.c, "fb000000.qcom,wcnss-wlan"),
Vikram Mulukutla381df182013-01-28 11:39:51 -08002562 CLK_LOOKUP("xo", gcc_xo_clk_src.c, "fb21b000.qcom,pronto"),
Vikram Mulukutlab13abe42012-10-03 11:38:48 -07002563 CLK_LOOKUP("measure", measure_clk.c, "debug"),
2564
2565 CLK_LOOKUP("iface_clk", gcc_blsp1_ahb_clk.c, "f991f000.serial"),
2566 CLK_LOOKUP("core_clk", gcc_blsp1_uart3_apps_clk.c, "f991f000.serial"),
Hanumant Singhbbf01da2013-04-09 16:27:28 -07002567 CLK_LOOKUP("iface_clk", gcc_blsp1_ahb_clk.c, "f991e000.serial"),
2568 CLK_LOOKUP("core_clk", gcc_blsp1_uart2_apps_clk.c, "f991e000.serial"),
Vikram Mulukutlab13abe42012-10-03 11:38:48 -07002569
2570 CLK_LOOKUP("dfab_clk", pnoc_sps_clk.c, "msm_sps"),
2571 CLK_LOOKUP("bus_clk", pnoc_qseecom_clk.c, "qseecom"),
2572
2573 CLK_LOOKUP("bus_clk", snoc_clk.c, ""),
2574 CLK_LOOKUP("bus_clk", pnoc_clk.c, ""),
2575 CLK_LOOKUP("bus_clk", cnoc_clk.c, ""),
2576 CLK_LOOKUP("mem_clk", bimc_clk.c, ""),
2577 CLK_LOOKUP("bus_clk", snoc_a_clk.c, ""),
2578 CLK_LOOKUP("bus_clk", pnoc_a_clk.c, ""),
2579 CLK_LOOKUP("bus_clk", cnoc_a_clk.c, ""),
2580 CLK_LOOKUP("mem_clk", bimc_a_clk.c, ""),
2581
2582 CLK_LOOKUP("bus_clk", cnoc_msmbus_clk.c, "msm_config_noc"),
2583 CLK_LOOKUP("bus_a_clk", cnoc_msmbus_a_clk.c, "msm_config_noc"),
2584 CLK_LOOKUP("bus_clk", snoc_msmbus_clk.c, "msm_sys_noc"),
2585 CLK_LOOKUP("bus_a_clk", snoc_msmbus_a_clk.c, "msm_sys_noc"),
2586 CLK_LOOKUP("bus_clk", pnoc_msmbus_clk.c, "msm_periph_noc"),
2587 CLK_LOOKUP("bus_a_clk", pnoc_msmbus_a_clk.c, "msm_periph_noc"),
2588 CLK_LOOKUP("mem_clk", bimc_msmbus_clk.c, "msm_bimc"),
2589 CLK_LOOKUP("mem_a_clk", bimc_msmbus_a_clk.c, "msm_bimc"),
2590 CLK_LOOKUP("mem_clk", bimc_acpu_a_clk.c, ""),
Gagan Mac125029b2013-03-07 17:24:27 -07002591 CLK_LOOKUP("bus_clk", mmss_s0_axi_clk.c, "msm_mmss_noc"),
2592 CLK_LOOKUP("bus_a_clk", mmss_s0_axi_clk.c, "msm_mmss_noc"),
Vikram Mulukutlab13abe42012-10-03 11:38:48 -07002593
Aparna Das0f5a6ea2013-03-06 15:28:08 -08002594 /* CoreSight clocks */
2595 CLK_LOOKUP("core_clk", qdss_clk.c, "fc326000.tmc"),
2596 CLK_LOOKUP("core_clk", qdss_clk.c, "fc320000.tpiu"),
2597 CLK_LOOKUP("core_clk", qdss_clk.c, "fc324000.replicator"),
2598 CLK_LOOKUP("core_clk", qdss_clk.c, "fc325000.tmc"),
2599 CLK_LOOKUP("core_clk", qdss_clk.c, "fc323000.funnel"),
2600 CLK_LOOKUP("core_clk", qdss_clk.c, "fc321000.funnel"),
2601 CLK_LOOKUP("core_clk", qdss_clk.c, "fc322000.funnel"),
2602 CLK_LOOKUP("core_clk", qdss_clk.c, "fc355000.funnel"),
2603 CLK_LOOKUP("core_clk", qdss_clk.c, "fc302000.stm"),
2604 CLK_LOOKUP("core_clk", qdss_clk.c, "fc34c000.etm"),
2605 CLK_LOOKUP("core_clk", qdss_clk.c, "fc34d000.etm"),
2606 CLK_LOOKUP("core_clk", qdss_clk.c, "fc34e000.etm"),
2607 CLK_LOOKUP("core_clk", qdss_clk.c, "fc34f000.etm"),
2608 CLK_LOOKUP("core_clk", qdss_clk.c, "fc301000.csr"),
2609 CLK_LOOKUP("core_clk", qdss_clk.c, "fc310000.cti"),
2610 CLK_LOOKUP("core_clk", qdss_clk.c, "fc311000.cti"),
2611 CLK_LOOKUP("core_clk", qdss_clk.c, "fc312000.cti"),
2612 CLK_LOOKUP("core_clk", qdss_clk.c, "fc313000.cti"),
2613 CLK_LOOKUP("core_clk", qdss_clk.c, "fc314000.cti"),
2614 CLK_LOOKUP("core_clk", qdss_clk.c, "fc315000.cti"),
2615 CLK_LOOKUP("core_clk", qdss_clk.c, "fc316000.cti"),
2616 CLK_LOOKUP("core_clk", qdss_clk.c, "fc317000.cti"),
2617 CLK_LOOKUP("core_clk", qdss_clk.c, "fc318000.cti"),
2618 CLK_LOOKUP("core_clk", qdss_clk.c, "fc351000.cti"),
2619 CLK_LOOKUP("core_clk", qdss_clk.c, "fc352000.cti"),
2620 CLK_LOOKUP("core_clk", qdss_clk.c, "fc353000.cti"),
2621 CLK_LOOKUP("core_clk", qdss_clk.c, "fc354000.cti"),
Aparna Das29e23432013-04-16 16:37:39 -07002622 CLK_LOOKUP("core_clk", qdss_clk.c, "fc34c000.jtagmm"),
2623 CLK_LOOKUP("core_clk", qdss_clk.c, "fc34d000.jtagmm"),
2624 CLK_LOOKUP("core_clk", qdss_clk.c, "fc34e000.jtagmm"),
2625 CLK_LOOKUP("core_clk", qdss_clk.c, "fc34f000.jtagmm"),
Vikram Mulukutlab13abe42012-10-03 11:38:48 -07002626
Aparna Das0f5a6ea2013-03-06 15:28:08 -08002627
2628 CLK_LOOKUP("core_a_clk", qdss_a_clk.c, "fc326000.tmc"),
2629 CLK_LOOKUP("core_a_clk", qdss_a_clk.c, "fc320000.tpiu"),
2630 CLK_LOOKUP("core_a_clk", qdss_a_clk.c, "fc324000.replicator"),
2631 CLK_LOOKUP("core_a_clk", qdss_a_clk.c, "fc325000.tmc"),
2632 CLK_LOOKUP("core_a_clk", qdss_a_clk.c, "fc323000.funnel"),
2633 CLK_LOOKUP("core_a_clk", qdss_a_clk.c, "fc321000.funnel"),
2634 CLK_LOOKUP("core_a_clk", qdss_a_clk.c, "fc322000.funnel"),
2635 CLK_LOOKUP("core_a_clk", qdss_a_clk.c, "fc355000.funnel"),
2636 CLK_LOOKUP("core_a_clk", qdss_a_clk.c, "fc302000.stm"),
2637 CLK_LOOKUP("core_a_clk", qdss_a_clk.c, "fc34c000.etm"),
2638 CLK_LOOKUP("core_a_clk", qdss_a_clk.c, "fc34d000.etm"),
2639 CLK_LOOKUP("core_a_clk", qdss_a_clk.c, "fc34e000.etm"),
2640 CLK_LOOKUP("core_a_clk", qdss_a_clk.c, "fc34f000.etm"),
2641 CLK_LOOKUP("core_a_clk", qdss_a_clk.c, "fc301000.csr"),
2642 CLK_LOOKUP("core_a_clk", qdss_a_clk.c, "fc310000.cti"),
2643 CLK_LOOKUP("core_a_clk", qdss_a_clk.c, "fc311000.cti"),
2644 CLK_LOOKUP("core_a_clk", qdss_a_clk.c, "fc312000.cti"),
2645 CLK_LOOKUP("core_a_clk", qdss_a_clk.c, "fc313000.cti"),
2646 CLK_LOOKUP("core_a_clk", qdss_a_clk.c, "fc314000.cti"),
2647 CLK_LOOKUP("core_a_clk", qdss_a_clk.c, "fc315000.cti"),
2648 CLK_LOOKUP("core_a_clk", qdss_a_clk.c, "fc316000.cti"),
2649 CLK_LOOKUP("core_a_clk", qdss_a_clk.c, "fc317000.cti"),
2650 CLK_LOOKUP("core_a_clk", qdss_a_clk.c, "fc318000.cti"),
2651 CLK_LOOKUP("core_a_clk", qdss_a_clk.c, "fc351000.cti"),
2652 CLK_LOOKUP("core_a_clk", qdss_a_clk.c, "fc352000.cti"),
2653 CLK_LOOKUP("core_a_clk", qdss_a_clk.c, "fc353000.cti"),
2654 CLK_LOOKUP("core_a_clk", qdss_a_clk.c, "fc354000.cti"),
Aparna Das29e23432013-04-16 16:37:39 -07002655 CLK_LOOKUP("core_a_clk", qdss_a_clk.c, "fc34c000.jtagmm"),
2656 CLK_LOOKUP("core_a_clk", qdss_a_clk.c, "fc34d000.jtagmm"),
2657 CLK_LOOKUP("core_a_clk", qdss_a_clk.c, "fc34e000.jtagmm"),
2658 CLK_LOOKUP("core_a_clk", qdss_a_clk.c, "fc34f000.jtagmm"),
Aparna Das0f5a6ea2013-03-06 15:28:08 -08002659
2660
Vikram Mulukutlab13abe42012-10-03 11:38:48 -07002661
2662 CLK_LOOKUP("core_clk_src", blsp1_qup1_spi_apps_clk_src.c, ""),
2663 CLK_LOOKUP("core_clk_src", blsp1_qup2_spi_apps_clk_src.c, ""),
2664 CLK_LOOKUP("core_clk_src", blsp1_qup3_spi_apps_clk_src.c, ""),
2665 CLK_LOOKUP("core_clk_src", blsp1_qup4_spi_apps_clk_src.c, ""),
2666 CLK_LOOKUP("core_clk_src", blsp1_qup5_spi_apps_clk_src.c, ""),
2667 CLK_LOOKUP("core_clk_src", blsp1_qup6_spi_apps_clk_src.c, ""),
2668 CLK_LOOKUP("core_clk_src", blsp1_uart1_apps_clk_src.c, ""),
2669 CLK_LOOKUP("core_clk_src", blsp1_uart2_apps_clk_src.c, ""),
2670 CLK_LOOKUP("core_clk_src", blsp1_uart3_apps_clk_src.c, ""),
2671 CLK_LOOKUP("core_clk_src", blsp1_uart4_apps_clk_src.c, ""),
2672 CLK_LOOKUP("core_clk_src", blsp1_uart5_apps_clk_src.c, ""),
2673 CLK_LOOKUP("core_clk_src", blsp1_uart6_apps_clk_src.c, ""),
2674 CLK_LOOKUP("core_clk_src", ce1_clk_src.c, ""),
2675 CLK_LOOKUP("core_clk_src", gp1_clk_src.c, ""),
2676 CLK_LOOKUP("core_clk_src", gp2_clk_src.c, ""),
2677 CLK_LOOKUP("core_clk_src", gp3_clk_src.c, ""),
2678 CLK_LOOKUP("core_clk_src", pdm2_clk_src.c, ""),
2679 CLK_LOOKUP("core_clk_src", sdcc1_apps_clk_src.c, ""),
2680 CLK_LOOKUP("core_clk_src", sdcc2_apps_clk_src.c, ""),
2681 CLK_LOOKUP("core_clk_src", usb_hs_system_clk_src.c, ""),
Gilad Avidovf84f2792013-01-31 13:26:39 -07002682 CLK_LOOKUP("iface_clk", gcc_blsp1_ahb_clk.c, "f9925000.i2c"),
Gilad Avidovf58f1832013-01-09 17:31:28 -07002683 CLK_LOOKUP("iface_clk", gcc_blsp1_ahb_clk.c, "f9923000.spi"),
Vikram Mulukutlab13abe42012-10-03 11:38:48 -07002684 CLK_LOOKUP("core_clk", gcc_blsp1_qup1_i2c_apps_clk.c, ""),
Gilad Avidovf58f1832013-01-09 17:31:28 -07002685 CLK_LOOKUP("core_clk", gcc_blsp1_qup1_spi_apps_clk.c, "f9923000.spi"),
Vikram Mulukutlab13abe42012-10-03 11:38:48 -07002686 CLK_LOOKUP("core_clk", gcc_blsp1_qup2_i2c_apps_clk.c, ""),
2687 CLK_LOOKUP("core_clk", gcc_blsp1_qup2_spi_apps_clk.c, ""),
Gilad Avidovf84f2792013-01-31 13:26:39 -07002688 CLK_LOOKUP("core_clk", gcc_blsp1_qup3_i2c_apps_clk.c, "f9925000.i2c"),
Vikram Mulukutlab13abe42012-10-03 11:38:48 -07002689 CLK_LOOKUP("core_clk", gcc_blsp1_qup3_spi_apps_clk.c, ""),
2690 CLK_LOOKUP("core_clk", gcc_blsp1_qup4_i2c_apps_clk.c, ""),
2691 CLK_LOOKUP("core_clk", gcc_blsp1_qup4_spi_apps_clk.c, ""),
2692 CLK_LOOKUP("core_clk", gcc_blsp1_qup5_i2c_apps_clk.c, ""),
2693 CLK_LOOKUP("core_clk", gcc_blsp1_qup5_spi_apps_clk.c, ""),
2694 CLK_LOOKUP("core_clk", gcc_blsp1_qup6_i2c_apps_clk.c, ""),
2695 CLK_LOOKUP("core_clk", gcc_blsp1_qup6_spi_apps_clk.c, ""),
2696 CLK_LOOKUP("core_clk", gcc_blsp1_uart1_apps_clk.c, ""),
2697 CLK_LOOKUP("core_clk", gcc_blsp1_uart2_apps_clk.c, ""),
2698 CLK_LOOKUP("core_clk", gcc_blsp1_uart3_apps_clk.c, ""),
2699 CLK_LOOKUP("core_clk", gcc_blsp1_uart4_apps_clk.c, ""),
2700 CLK_LOOKUP("core_clk", gcc_blsp1_uart5_apps_clk.c, ""),
2701 CLK_LOOKUP("core_clk", gcc_blsp1_uart6_apps_clk.c, ""),
2702 CLK_LOOKUP("iface_clk", gcc_boot_rom_ahb_clk.c, ""),
2703 CLK_LOOKUP("iface_clk", gcc_ce1_ahb_clk.c, ""),
2704 CLK_LOOKUP("core_clk", gcc_ce1_axi_clk.c, ""),
2705 CLK_LOOKUP("core_clk", gcc_ce1_clk.c, ""),
2706 CLK_LOOKUP("iface_clk", gcc_copss_smmu_ahb_clk.c, ""),
2707 CLK_LOOKUP("iface_clk", gcc_lpss_smmu_ahb_clk.c, ""),
2708 CLK_LOOKUP("core_clk", gcc_gp1_clk.c, ""),
2709 CLK_LOOKUP("core_clk", gcc_gp2_clk.c, ""),
2710 CLK_LOOKUP("core_clk", gcc_gp3_clk.c, ""),
2711 CLK_LOOKUP("core_clk", gcc_lpass_q6_axi_clk.c, ""),
2712 CLK_LOOKUP("iface_clk", gcc_mss_cfg_ahb_clk.c, ""),
2713 CLK_LOOKUP("core_clk", gcc_mss_q6_bimc_axi_clk.c, ""),
2714 CLK_LOOKUP("core_clk", gcc_pdm2_clk.c, ""),
2715 CLK_LOOKUP("iface_clk", gcc_pdm_ahb_clk.c, ""),
Hariprasad Dhalinarasimha2cced7d2013-04-13 17:25:58 -07002716 CLK_LOOKUP("iface_clk", gcc_prng_ahb_clk.c, "f9bff000.qcom,msm-rng"),
Vikram Mulukutlab13abe42012-10-03 11:38:48 -07002717 CLK_LOOKUP("iface_clk", gcc_sdcc1_ahb_clk.c, "msm_sdcc.1"),
2718 CLK_LOOKUP("core_clk", gcc_sdcc1_apps_clk.c, "msm_sdcc.1"),
2719 CLK_LOOKUP("iface_clk", gcc_sdcc2_ahb_clk.c, "msm_sdcc.2"),
2720 CLK_LOOKUP("core_clk", gcc_sdcc2_apps_clk.c, "msm_sdcc.2"),
2721 CLK_LOOKUP("core_clk", gcc_usb2a_phy_sleep_clk.c, ""),
2722 CLK_LOOKUP("iface_clk", gcc_usb_hs_ahb_clk.c, "f9a55000.usb"),
2723 CLK_LOOKUP("core_clk", gcc_usb_hs_system_clk.c, "f9a55000.usb"),
2724
2725 CLK_LOOKUP("core_clk_src", csi0_clk_src.c, ""),
2726 CLK_LOOKUP("core_clk_src", axi_clk_src.c, ""),
Vikram Mulukutlae1e5c482013-01-28 14:43:20 -08002727 CLK_LOOKUP("", mdp_axi_clk_src.c, ""),
2728 CLK_LOOKUP("", mmssnoc_axi_clk_src.c, ""),
Vikram Mulukutlab13abe42012-10-03 11:38:48 -07002729 CLK_LOOKUP("core_clk_src", dsi_pclk_clk_src.c, ""),
2730 CLK_LOOKUP("core_clk_src", gfx3d_clk_src.c, ""),
2731 CLK_LOOKUP("core_clk_src", vfe_clk_src.c, ""),
2732 CLK_LOOKUP("core_clk_src", csi1_clk_src.c, ""),
2733 CLK_LOOKUP("core_clk_src", csi0phytimer_clk_src.c, ""),
2734 CLK_LOOKUP("core_clk_src", csi1phytimer_clk_src.c, ""),
2735 CLK_LOOKUP("core_clk_src", dsi_clk_src.c, ""),
2736 CLK_LOOKUP("core_clk_src", dsi_byte_clk_src.c, ""),
2737 CLK_LOOKUP("core_clk_src", dsi_esc_clk_src.c, ""),
2738 CLK_LOOKUP("core_clk_src", mclk0_clk_src.c, ""),
2739 CLK_LOOKUP("core_clk_src", mclk1_clk_src.c, ""),
2740 CLK_LOOKUP("core_clk_src", mdp_vsync_clk_src.c, ""),
2741
2742 CLK_LOOKUP("core_clk", bimc_gfx_clk.c, ""),
2743 CLK_LOOKUP("core_clk", csi0_clk.c, ""),
2744 CLK_LOOKUP("core_clk", csi0phy_clk.c, ""),
2745 CLK_LOOKUP("core_clk", csi0phytimer_clk.c, ""),
2746 CLK_LOOKUP("core_clk", csi0pix_clk.c, ""),
2747 CLK_LOOKUP("core_clk", csi0rdi_clk.c, ""),
2748 CLK_LOOKUP("core_clk", csi1_clk.c, ""),
2749 CLK_LOOKUP("core_clk", csi1phy_clk.c, ""),
2750 CLK_LOOKUP("core_clk", csi1phytimer_clk.c, ""),
2751 CLK_LOOKUP("core_clk", csi1pix_clk.c, ""),
2752 CLK_LOOKUP("core_clk", csi1rdi_clk.c, ""),
2753 CLK_LOOKUP("core_clk", csi_ahb_clk.c, ""),
2754 CLK_LOOKUP("core_clk", csi_vfe_clk.c, ""),
2755 CLK_LOOKUP("core_clk", dsi_clk.c, ""),
2756 CLK_LOOKUP("core_clk", dsi_ahb_clk.c, ""),
2757 CLK_LOOKUP("core_clk", dsi_byte_clk.c, ""),
2758 CLK_LOOKUP("core_clk", dsi_esc_clk.c, ""),
2759 CLK_LOOKUP("core_clk", dsi_pclk_clk.c, ""),
2760 CLK_LOOKUP("core_clk", gmem_gfx3d_clk.c, ""),
2761 CLK_LOOKUP("core_clk", mclk0_clk.c, ""),
2762 CLK_LOOKUP("core_clk", mclk1_clk.c, ""),
2763 CLK_LOOKUP("core_clk", mdp_ahb_clk.c, ""),
2764 CLK_LOOKUP("core_clk", mdp_axi_clk.c, ""),
2765 CLK_LOOKUP("core_clk", mdp_dsi_clk.c, ""),
2766 CLK_LOOKUP("core_clk", mdp_lcdc_clk.c, ""),
2767 CLK_LOOKUP("core_clk", mdp_vsync_clk.c, ""),
2768 CLK_LOOKUP("core_clk", mmss_misc_ahb_clk.c, ""),
2769 CLK_LOOKUP("core_clk", mmss_s0_axi_clk.c, ""),
Vikram Mulukutlab13abe42012-10-03 11:38:48 -07002770 CLK_LOOKUP("core_clk", mmss_mmssnoc_bto_ahb_clk.c, ""),
2771 CLK_LOOKUP("core_clk", mmss_mmssnoc_axi_clk.c, ""),
2772 CLK_LOOKUP("core_clk", vfe_clk.c, ""),
2773 CLK_LOOKUP("core_clk", vfe_ahb_clk.c, ""),
2774 CLK_LOOKUP("core_clk", vfe_axi_clk.c, ""),
2775
2776 CLK_LOOKUP("core_clk", oxili_gfx3d_clk.c, "fdc00000.qcom,kgsl-3d0"),
2777 CLK_LOOKUP("iface_clk", oxili_ahb_clk.c, "fdc00000.qcom,kgsl-3d0"),
2778 CLK_LOOKUP("mem_iface_clk", bimc_gfx_clk.c, "fdc00000.qcom,kgsl-3d0"),
2779 CLK_LOOKUP("mem_clk", gmem_gfx3d_clk.c, "fdc00000.qcom,kgsl-3d0"),
Vikram Mulukutla55318acb2013-04-15 17:47:34 -07002780 CLK_LOOKUP("alt_mem_iface_clk", gcc_bimc_smmu_clk.c,
2781 "fdc00000.qcom,kgsl-3d0"),
Vikram Mulukutlab13abe42012-10-03 11:38:48 -07002782
2783 CLK_LOOKUP("iface_clk", vfe_ahb_clk.c, "fd890000.qcom,iommu"),
2784 CLK_LOOKUP("core_clk", vfe_axi_clk.c, "fd890000.qcom,iommu"),
2785 CLK_LOOKUP("iface_clk", mdp_ahb_clk.c, "fd860000.qcom,iommu"),
2786 CLK_LOOKUP("core_clk", mdp_axi_clk.c, "fd860000.qcom,iommu"),
2787 CLK_LOOKUP("iface_clk", mdp_ahb_clk.c, "fd870000.qcom,iommu"),
2788 CLK_LOOKUP("core_clk", mdp_axi_clk.c, "fd870000.qcom,iommu"),
2789 CLK_LOOKUP("iface_clk", oxili_ahb_clk.c, "fd880000.qcom,iommu"),
2790 CLK_LOOKUP("core_clk", bimc_gfx_clk.c, "fd880000.qcom,iommu"),
Vikram Mulukutla55318acb2013-04-15 17:47:34 -07002791 CLK_LOOKUP("alt_core_clk", gcc_bimc_smmu_clk.c, "fd880000.qcom,iommu"),
Vikram Mulukutlab13abe42012-10-03 11:38:48 -07002792 CLK_LOOKUP("iface_clk", gcc_lpss_smmu_ahb_clk.c, "fd000000.qcom,iommu"),
2793 CLK_LOOKUP("core_clk", gcc_lpass_q6_axi_clk.c, "fd000000.qcom,iommu"),
2794 CLK_LOOKUP("iface_clk", gcc_copss_smmu_ahb_clk.c,
2795 "fd010000.qcom,iommu"),
2796 CLK_LOOKUP("core_clk", pnoc_iommu_clk.c, "fd010000.qcom,iommu"),
2797
Vikram Mulukutlab13abe42012-10-03 11:38:48 -07002798 CLK_LOOKUP("core_clk", q6ss_xo_clk.c, "fe200000.qcom,lpass"),
2799 CLK_LOOKUP("bus_clk", gcc_lpass_q6_axi_clk.c, "fe200000.qcom,lpass"),
2800 CLK_LOOKUP("iface_clk", q6ss_ahb_lfabif_clk.c, "fe200000.qcom,lpass"),
2801 CLK_LOOKUP("reg_clk", q6ss_ahbm_clk.c, "fe200000.qcom,lpass"),
Vikram Mulukutla4157cca2013-01-24 15:42:41 -08002802
2803 CLK_LOOKUP("xo", gcc_xo_a_clk_src.c, "f9011050.qcom,acpuclk"),
2804 CLK_LOOKUP("gpll0", gpll0_ao_clk_src.c, "f9011050.qcom,acpuclk"),
2805 CLK_LOOKUP("a7sspll", a7sspll.c, "f9011050.qcom,acpuclk"),
2806
2807 CLK_LOOKUP("measure_clk", apc0_m_clk, ""),
2808 CLK_LOOKUP("measure_clk", apc1_m_clk, ""),
2809 CLK_LOOKUP("measure_clk", apc2_m_clk, ""),
2810 CLK_LOOKUP("measure_clk", apc3_m_clk, ""),
2811 CLK_LOOKUP("measure_clk", l2_m_clk, ""),
Xiaoming Zhou8150acf2013-04-04 16:31:17 -04002812
Vikram Mulukutlaed078512013-04-09 14:15:33 -07002813 CLK_LOOKUP("xo", gcc_xo_clk_src.c, "fb000000.qcom,wcnss-wlan"),
Vikram Mulukutla7e5b3112013-04-15 16:32:40 -07002814 CLK_LOOKUP("rf_clk", cxo_a1.c, "fb000000.qcom,wcnss-wlan"),
Vikram Mulukutlaed078512013-04-09 14:15:33 -07002815
Xiaoming Zhou8150acf2013-04-04 16:31:17 -04002816 CLK_LOOKUP("iface_clk", mdp_ahb_clk.c, "fd900000.qcom,mdss_mdp"),
2817 CLK_LOOKUP("core_clk", mdp_axi_clk.c, "fd900000.qcom,mdss_mdp"),
2818 CLK_LOOKUP("lcdc_clk", mdp_lcdc_clk.c, "fd900000.qcom,mdss_mdp"),
2819 CLK_LOOKUP("vsync_clk", mdp_vsync_clk.c, "fd900000.qcom,mdss_mdp"),
Xiaoming Zhoud58589e2013-04-10 22:30:51 -04002820 CLK_LOOKUP("dsi_clk", mdp_dsi_clk.c, "fd900000.qcom,mdss_mdp"),
Xiaoming Zhou8150acf2013-04-04 16:31:17 -04002821 CLK_LOOKUP("iface_clk", dsi_ahb_clk.c, "fdd00000.qcom,mdss_dsi"),
Xiaoming Zhoud58589e2013-04-10 22:30:51 -04002822 CLK_LOOKUP("dsi_clk", dsi_clk.c, "fdd00000.qcom,mdss_dsi"),
Xiaoming Zhou8150acf2013-04-04 16:31:17 -04002823 CLK_LOOKUP("byte_clk", dsi_byte_clk.c, "fdd00000.qcom,mdss_dsi"),
2824 CLK_LOOKUP("esc_clk", dsi_esc_clk.c, "fdd00000.qcom,mdss_dsi"),
2825 CLK_LOOKUP("pixel_clk", dsi_pclk_clk.c, "fdd00000.qcom,mdss_dsi"),
Hariprasad Dhalinarasimhad9ede5a2013-04-14 16:30:09 -07002826
2827 /* QSEECOM Clocks */
2828 CLK_LOOKUP("core_clk", gcc_ce1_clk.c, "qseecom"),
2829 CLK_LOOKUP("iface_clk", gcc_ce1_ahb_clk.c, "qseecom"),
2830 CLK_LOOKUP("bus_clk", gcc_ce1_axi_clk.c, "qseecom"),
2831 CLK_LOOKUP("core_clk_src", ce1_clk_src.c, "qseecom"),
Vikram Mulukutlafd6833c2013-04-18 12:46:48 -07002832
2833 CLK_LOOKUP("core_clk", gcc_ce1_clk.c, "scm"),
2834 CLK_LOOKUP("iface_clk", gcc_ce1_ahb_clk.c, "scm"),
2835 CLK_LOOKUP("bus_clk", gcc_ce1_axi_clk.c, "scm"),
2836 CLK_LOOKUP("core_clk_src", ce1_clk_src.c, "scm"),
Vikram Mulukutlab13abe42012-10-03 11:38:48 -07002837};
2838
Syed Rameez Mustafa3971c142013-01-09 19:04:53 -08002839static struct clk_lookup msm_clocks_8610_rumi[] = {
Vikram Mulukutlab13abe42012-10-03 11:38:48 -07002840 CLK_DUMMY("core_clk", BLSP1_UART_CLK, "f991f000.serial", OFF),
2841 CLK_DUMMY("iface_clk", BLSP1_UART_CLK, "f991f000.serial", OFF),
2842 CLK_DUMMY("iface_clk", HSUSB_IFACE_CLK, "f9a55000.usb", OFF),
2843 CLK_DUMMY("core_clk", HSUSB_CORE_CLK, "f9a55000.usb", OFF),
2844 CLK_DUMMY("iface_clk", NULL, "msm_sdcc.1", OFF),
2845 CLK_DUMMY("core_clk", NULL, "msm_sdcc.1", OFF),
2846 CLK_DUMMY("bus_clk", NULL, "msm_sdcc.1", OFF),
2847 CLK_DUMMY("iface_clk", NULL, "msm_sdcc.2", OFF),
2848 CLK_DUMMY("core_clk", NULL, "msm_sdcc.2", OFF),
2849 CLK_DUMMY("bus_clk", NULL, "msm_sdcc.2", OFF),
2850 CLK_DUMMY("dfab_clk", DFAB_CLK, "msm_sps", OFF),
2851 CLK_DUMMY("iface_clk", NULL, "fd890000.qcom,iommu", OFF),
2852 CLK_DUMMY("core_clk", NULL, "fd890000.qcom,iommu", OFF),
2853 CLK_DUMMY("iface_clk", NULL, "fd860000.qcom,iommu", OFF),
2854 CLK_DUMMY("core_clk", NULL, "fd860000.qcom,iommu", OFF),
2855 CLK_DUMMY("iface_clk", NULL, "fd870000.qcom,iommu", OFF),
2856 CLK_DUMMY("core_clk", NULL, "fd870000.qcom,iommu", OFF),
2857 CLK_DUMMY("iface_clk", NULL, "fd880000.qcom,iommu", OFF),
2858 CLK_DUMMY("core_clk", NULL, "fd880000.qcom,iommu", OFF),
2859 CLK_DUMMY("iface_clk", NULL, "fd000000.qcom,iommu", OFF),
2860 CLK_DUMMY("core_clk", NULL, "fd000000.qcom,iommu", OFF),
2861 CLK_DUMMY("iface_clk", NULL, "fd010000.qcom,iommu", OFF),
2862 CLK_DUMMY("core_clk", NULL, "fd010000.qcom,iommu", OFF),
Vikram Mulukutla4157cca2013-01-24 15:42:41 -08002863 CLK_DUMMY("xo", NULL, "f9011050.qcom,acpuclk", OFF),
2864 CLK_DUMMY("gpll0", NULL, "f9011050.qcom,acpuclk", OFF),
2865 CLK_DUMMY("a7sspll", NULL, "f9011050.qcom,acpuclk", OFF),
Vikram Mulukutlab13abe42012-10-03 11:38:48 -07002866};
2867
Syed Rameez Mustafa3971c142013-01-09 19:04:53 -08002868struct clock_init_data msm8610_rumi_clock_init_data __initdata = {
2869 .table = msm_clocks_8610_rumi,
2870 .size = ARRAY_SIZE(msm_clocks_8610_rumi),
Vikram Mulukutlab13abe42012-10-03 11:38:48 -07002871};
2872
Vikram Mulukutlab13abe42012-10-03 11:38:48 -07002873/* MMPLL0 at 800 MHz, main output enabled. */
2874static struct pll_config mmpll0_config __initdata = {
2875 .l = 0x29,
2876 .m = 0x2,
2877 .n = 0x3,
2878 .vco_val = 0x0,
2879 .vco_mask = BM(21, 20),
2880 .pre_div_val = 0x0,
2881 .pre_div_mask = BM(14, 12),
2882 .post_div_val = 0x0,
2883 .post_div_mask = BM(9, 8),
2884 .mn_ena_val = BIT(24),
2885 .mn_ena_mask = BIT(24),
2886 .main_output_val = BIT(0),
2887 .main_output_mask = BIT(0),
2888};
2889
2890/* MMPLL1 at 1200 MHz, main output enabled. */
2891static struct pll_config mmpll1_config __initdata = {
2892 .l = 0x3E,
2893 .m = 0x1,
2894 .n = 0x2,
2895 .vco_val = 0x0,
2896 .vco_mask = BM(21, 20),
2897 .pre_div_val = 0x0,
2898 .pre_div_mask = BM(14, 12),
2899 .post_div_val = 0x0,
2900 .post_div_mask = BM(9, 8),
2901 .mn_ena_val = BIT(24),
2902 .mn_ena_mask = BIT(24),
2903 .main_output_val = BIT(0),
2904 .main_output_mask = BIT(0),
2905};
2906
Vikram Mulukutlab13abe42012-10-03 11:38:48 -07002907#define PLL_AUX_OUTPUT_BIT 1
2908#define PLL_AUX2_OUTPUT_BIT 2
2909
2910#define PWR_ON_MASK BIT(31)
2911#define EN_REST_WAIT_MASK (0xF << 20)
2912#define EN_FEW_WAIT_MASK (0xF << 16)
2913#define CLK_DIS_WAIT_MASK (0xF << 12)
2914#define SW_OVERRIDE_MASK BIT(2)
2915#define HW_CONTROL_MASK BIT(1)
2916#define SW_COLLAPSE_MASK BIT(0)
2917
2918/* Wait 2^n CXO cycles between all states. Here, n=2 (4 cycles). */
2919#define EN_REST_WAIT_VAL (0x2 << 20)
2920#define EN_FEW_WAIT_VAL (0x2 << 16)
2921#define CLK_DIS_WAIT_VAL (0x2 << 12)
2922#define GDSC_TIMEOUT_US 50000
2923
2924static void __init reg_init(void)
2925{
Vikram Mulukutla81577ab2013-03-25 10:55:36 -07002926 u32 regval;
Vikram Mulukutlab13abe42012-10-03 11:38:48 -07002927
Vikram Mulukutlab13abe42012-10-03 11:38:48 -07002928 configure_sr_hpm_lp_pll(&mmpll0_config, &mmpll0_regs, 1);
2929 configure_sr_hpm_lp_pll(&mmpll1_config, &mmpll1_regs, 1);
Vikram Mulukutlab13abe42012-10-03 11:38:48 -07002930
Vikram Mulukutlab13abe42012-10-03 11:38:48 -07002931 /* Vote for GPLL0 to turn on. Needed by acpuclock. */
2932 regval = readl_relaxed(GCC_REG_BASE(APCS_GPLL_ENA_VOTE));
2933 regval |= BIT(0);
2934 writel_relaxed(regval, GCC_REG_BASE(APCS_GPLL_ENA_VOTE));
2935
2936 /*
2937 * TODO: Confirm that no clocks need to be voted on in this sleep vote
2938 * register.
2939 */
2940 writel_relaxed(0x0, GCC_REG_BASE(APCS_CLOCK_SLEEP_ENA_VOTE));
Vikram Mulukutlab13abe42012-10-03 11:38:48 -07002941}
2942
Syed Rameez Mustafa3971c142013-01-09 19:04:53 -08002943static void __init msm8610_clock_post_init(void)
Vikram Mulukutlab13abe42012-10-03 11:38:48 -07002944{
2945 /*
2946 * Hold an active set vote for CXO; this is because CXO is expected
2947 * to remain on whenever CPUs aren't power collapsed.
2948 */
2949 clk_prepare_enable(&gcc_xo_a_clk_src.c);
2950
2951
2952 /* Set rates for single-rate clocks. */
2953 clk_set_rate(&usb_hs_system_clk_src.c,
2954 usb_hs_system_clk_src.freq_tbl[0].freq_hz);
2955 clk_set_rate(&pdm2_clk_src.c, pdm2_clk_src.freq_tbl[0].freq_hz);
2956 clk_set_rate(&mclk0_clk_src.c, mclk0_clk_src.freq_tbl[0].freq_hz);
2957 clk_set_rate(&mclk1_clk_src.c, mclk1_clk_src.freq_tbl[0].freq_hz);
Vikram Mulukutlab13abe42012-10-03 11:38:48 -07002958}
2959
2960#define GCC_CC_PHYS 0xFC400000
2961#define GCC_CC_SIZE SZ_16K
2962
2963#define MMSS_CC_PHYS 0xFD8C0000
2964#define MMSS_CC_SIZE SZ_256K
2965
2966#define LPASS_CC_PHYS 0xFE000000
2967#define LPASS_CC_SIZE SZ_256K
2968
2969#define APCS_GCC_CC_PHYS 0xF9011000
2970#define APCS_GCC_CC_SIZE SZ_4K
2971
Vikram Mulukutla4157cca2013-01-24 15:42:41 -08002972#define APCS_KPSS_SH_PLL_PHYS 0xF9016000
2973#define APCS_KPSS_SH_PLL_SIZE SZ_64
2974
Syed Rameez Mustafa3971c142013-01-09 19:04:53 -08002975static void __init msm8610_clock_pre_init(void)
Vikram Mulukutlab13abe42012-10-03 11:38:48 -07002976{
2977 virt_bases[GCC_BASE] = ioremap(GCC_CC_PHYS, GCC_CC_SIZE);
2978 if (!virt_bases[GCC_BASE])
Syed Rameez Mustafa3971c142013-01-09 19:04:53 -08002979 panic("clock-8610: Unable to ioremap GCC memory!");
Vikram Mulukutlab13abe42012-10-03 11:38:48 -07002980
2981 virt_bases[MMSS_BASE] = ioremap(MMSS_CC_PHYS, MMSS_CC_SIZE);
2982 if (!virt_bases[MMSS_BASE])
Syed Rameez Mustafa3971c142013-01-09 19:04:53 -08002983 panic("clock-8610: Unable to ioremap MMSS_CC memory!");
Vikram Mulukutlab13abe42012-10-03 11:38:48 -07002984
2985 virt_bases[LPASS_BASE] = ioremap(LPASS_CC_PHYS, LPASS_CC_SIZE);
2986 if (!virt_bases[LPASS_BASE])
Syed Rameez Mustafa3971c142013-01-09 19:04:53 -08002987 panic("clock-8610: Unable to ioremap LPASS_CC memory!");
Vikram Mulukutlab13abe42012-10-03 11:38:48 -07002988
2989 virt_bases[APCS_BASE] = ioremap(APCS_GCC_CC_PHYS, APCS_GCC_CC_SIZE);
2990 if (!virt_bases[APCS_BASE])
Syed Rameez Mustafa3971c142013-01-09 19:04:53 -08002991 panic("clock-8610: Unable to ioremap APCS_GCC_CC memory!");
Vikram Mulukutlab13abe42012-10-03 11:38:48 -07002992
Vikram Mulukutla4157cca2013-01-24 15:42:41 -08002993 virt_bases[APCS_PLL_BASE] = ioremap(APCS_KPSS_SH_PLL_PHYS,
2994 APCS_KPSS_SH_PLL_SIZE);
2995 if (!virt_bases[APCS_PLL_BASE])
2996 panic("clock-8610: Unable to ioremap APCS_GCC_CC memory!");
2997
Vikram Mulukutlab13abe42012-10-03 11:38:48 -07002998 clk_ops_local_pll.enable = sr_hpm_lp_pll_clk_enable;
2999
Patrick Dalyebc26bc2013-02-05 11:49:07 -08003000 vdd_dig.regulator[0] = regulator_get(NULL, "vdd_dig");
3001 if (IS_ERR(vdd_dig.regulator[0]))
Syed Rameez Mustafa3971c142013-01-09 19:04:53 -08003002 panic("clock-8610: Unable to get the vdd_dig regulator!");
Vikram Mulukutlab13abe42012-10-03 11:38:48 -07003003
Patrick Dalyebc26bc2013-02-05 11:49:07 -08003004 vdd_sr2_pll.regulator[0] = regulator_get(NULL, "vdd_sr2_pll");
3005 if (IS_ERR(vdd_sr2_pll.regulator[0]))
Vikram Mulukutla4157cca2013-01-24 15:42:41 -08003006 panic("clock-8610: Unable to get the vdd_sr2_pll regulator!");
3007
Patrick Daly6fb589a2013-03-29 17:55:55 -07003008 vdd_sr2_pll.regulator[1] = regulator_get(NULL, "vdd_sr2_dig");
3009 if (IS_ERR(vdd_sr2_pll.regulator[1]))
3010 panic("clock-8610: Unable to get the vdd_sr2_dig regulator!");
3011
Vikram Mulukutlab13abe42012-10-03 11:38:48 -07003012 enable_rpm_scaling();
3013
3014 /* Enable a clock to allow access to MMSS clock registers */
3015 clk_prepare_enable(&gcc_mmss_noc_cfg_ahb_clk.c),
3016
3017 reg_init();
3018
Vikram Mulukutla82cb8442013-01-28 13:36:51 -08003019 /* Maintain the max nominal frequency on the MMSSNOC AHB bus. */
3020 clk_set_rate(&mmssnoc_ahb_a_clk.c, 40000000);
3021 clk_prepare_enable(&mmssnoc_ahb_a_clk.c);
3022
Vikram Mulukutlab13abe42012-10-03 11:38:48 -07003023 /* TODO: Remove this once the bus driver is in place */
Vikram Mulukutlab13abe42012-10-03 11:38:48 -07003024 clk_set_rate(&axi_clk_src.c, 200000000);
Vikram Mulukutlab13abe42012-10-03 11:38:48 -07003025 clk_prepare_enable(&mmss_s0_axi_clk.c);
Vikram Mulukutlab13abe42012-10-03 11:38:48 -07003026}
3027
Syed Rameez Mustafa3971c142013-01-09 19:04:53 -08003028struct clock_init_data msm8610_clock_init_data __initdata = {
3029 .table = msm_clocks_8610,
3030 .size = ARRAY_SIZE(msm_clocks_8610),
3031 .pre_init = msm8610_clock_pre_init,
3032 .post_init = msm8610_clock_post_init,
Vikram Mulukutlab13abe42012-10-03 11:38:48 -07003033};