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