blob: d63d72283dd93ecc1fcc2863927c4220ce674f11 [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,
Patrick Daly6fb589a2013-03-29 17:55:55 -0700527 VDD_SR2_PLL_SVS,
528 VDD_SR2_PLL_NOM,
529 VDD_SR2_PLL_TUR,
Vikram Mulukutla4157cca2013-01-24 15:42:41 -0800530 VDD_SR2_PLL_NUM
531};
532
Patrick Daly6fb589a2013-03-29 17:55:55 -0700533static const int *vdd_sr2_levels[] = {
534 [VDD_SR2_PLL_OFF] = VDD_UV(0, RPM_REGULATOR_CORNER_NONE),
535 [VDD_SR2_PLL_SVS] = VDD_UV(1800000, RPM_REGULATOR_CORNER_SVS_SOC),
536 [VDD_SR2_PLL_NOM] = VDD_UV(1800000, RPM_REGULATOR_CORNER_NORMAL),
537 [VDD_SR2_PLL_TUR] = VDD_UV(1800000, RPM_REGULATOR_CORNER_SUPER_TURBO),
Patrick Dalyebc26bc2013-02-05 11:49:07 -0800538};
Vikram Mulukutla4157cca2013-01-24 15:42:41 -0800539
Patrick Daly6fb589a2013-03-29 17:55:55 -0700540static DEFINE_VDD_REGULATORS(vdd_sr2_pll, VDD_SR2_PLL_NUM, 2, vdd_sr2_levels);
Vikram Mulukutla4157cca2013-01-24 15:42:41 -0800541
542static struct pll_freq_tbl apcs_pll_freq[] = {
543 F_APCS_PLL( 384000000, 20, 0x0, 0x1, 0x0, 0x0, 0x0),
544 F_APCS_PLL( 787200000, 41, 0x0, 0x1, 0x0, 0x0, 0x0),
545 F_APCS_PLL( 998400000, 52, 0x0, 0x1, 0x0, 0x0, 0x0),
546 F_APCS_PLL(1190400000, 62, 0x0, 0x1, 0x0, 0x0, 0x0),
547 PLL_F_END
548};
549
550static struct pll_clk a7sspll = {
551 .mode_reg = (void __iomem *)APCS_SH_PLL_MODE,
552 .l_reg = (void __iomem *)APCS_SH_PLL_L_VAL,
553 .m_reg = (void __iomem *)APCS_SH_PLL_M_VAL,
554 .n_reg = (void __iomem *)APCS_SH_PLL_N_VAL,
555 .config_reg = (void __iomem *)APCS_SH_PLL_USER_CTL,
556 .status_reg = (void __iomem *)APCS_SH_PLL_STATUS,
557 .freq_tbl = apcs_pll_freq,
558 .masks = {
559 .vco_mask = BM(29, 28),
560 .pre_div_mask = BIT(12),
561 .post_div_mask = BM(9, 8),
562 .mn_en_mask = BIT(24),
563 .main_output_mask = BIT(0),
564 },
565 .base = &virt_bases[APCS_PLL_BASE],
566 .c = {
567 .dbg_name = "a7sspll",
568 .ops = &clk_ops_sr2_pll,
569 .vdd_class = &vdd_sr2_pll,
570 .fmax = (unsigned long [VDD_SR2_PLL_NUM]) {
Patrick Daly6fb589a2013-03-29 17:55:55 -0700571 [VDD_SR2_PLL_SVS] = 1000000000,
572 [VDD_SR2_PLL_NOM] = 1900000000,
Vikram Mulukutla4157cca2013-01-24 15:42:41 -0800573 },
574 .num_fmax = VDD_SR2_PLL_NUM,
575 CLK_INIT(a7sspll.c),
576 /*
577 * Need to skip handoff of the acpu pll to avoid
578 * turning off the pll when the cpu is using it
579 */
580 .flags = CLKFLAG_SKIP_HANDOFF,
581 },
582};
583
584static unsigned int soft_vote_gpll0;
585
Vikram Mulukutlab13abe42012-10-03 11:38:48 -0700586static struct pll_vote_clk gpll0_clk_src = {
587 .en_reg = (void __iomem *)APCS_GPLL_ENA_VOTE,
588 .en_mask = BIT(0),
589 .status_reg = (void __iomem *)GPLL0_STATUS,
590 .status_mask = BIT(17),
Vikram Mulukutla4157cca2013-01-24 15:42:41 -0800591 .soft_vote = &soft_vote_gpll0,
592 .soft_vote_mask = PLL_SOFT_VOTE_PRIMARY,
Vikram Mulukutlab13abe42012-10-03 11:38:48 -0700593 .base = &virt_bases[GCC_BASE],
594 .c = {
595 .parent = &gcc_xo_clk_src.c,
596 .rate = 600000000,
597 .dbg_name = "gpll0_clk_src",
Vikram Mulukutla4157cca2013-01-24 15:42:41 -0800598 .ops = &clk_ops_pll_acpu_vote,
Vikram Mulukutlab13abe42012-10-03 11:38:48 -0700599 CLK_INIT(gpll0_clk_src.c),
600 },
601};
602
Vikram Mulukutla4157cca2013-01-24 15:42:41 -0800603static struct pll_vote_clk gpll0_ao_clk_src = {
604 .en_reg = (void __iomem *)APCS_GPLL_ENA_VOTE,
605 .en_mask = BIT(0),
606 .status_reg = (void __iomem *)GPLL0_STATUS,
607 .status_mask = BIT(17),
608 .soft_vote = &soft_vote_gpll0,
609 .soft_vote_mask = PLL_SOFT_VOTE_ACPU,
610 .base = &virt_bases[GCC_BASE],
611 .c = {
612 .rate = 600000000,
613 .dbg_name = "gpll0_ao_clk_src",
614 .ops = &clk_ops_pll_acpu_vote,
615 CLK_INIT(gpll0_ao_clk_src.c),
616 },
617};
618
Vikram Mulukutlab13abe42012-10-03 11:38:48 -0700619static struct pll_vote_clk mmpll0_clk_src = {
620 .en_reg = (void __iomem *)MMSS_PLL_VOTE_APCS_REG,
621 .en_mask = BIT(0),
622 .status_reg = (void __iomem *)MMPLL0_PLL_STATUS,
623 .status_mask = BIT(17),
624 .base = &virt_bases[MMSS_BASE],
625 .c = {
626 .parent = &gcc_xo_clk_src.c,
627 .dbg_name = "mmpll0_clk_src",
628 .rate = 800000000,
629 .ops = &clk_ops_pll_vote,
630 CLK_INIT(mmpll0_clk_src.c),
631 },
632};
633
634static struct pll_config_regs mmpll0_regs __initdata = {
635 .l_reg = (void __iomem *)MMPLL0_PLL_L_VAL,
636 .m_reg = (void __iomem *)MMPLL0_PLL_M_VAL,
637 .n_reg = (void __iomem *)MMPLL0_PLL_N_VAL,
638 .config_reg = (void __iomem *)MMPLL0_PLL_USER_CTL,
639 .mode_reg = (void __iomem *)MMPLL0_PLL_MODE,
640 .base = &virt_bases[MMSS_BASE],
641};
642
643static struct pll_clk mmpll1_clk_src = {
644 .mode_reg = (void __iomem *)MMPLL1_PLL_MODE,
645 .status_reg = (void __iomem *)MMPLL1_PLL_STATUS,
646 .base = &virt_bases[MMSS_BASE],
647 .c = {
648 .parent = &gcc_xo_clk_src.c,
649 .dbg_name = "mmpll1_clk_src",
650 .rate = 1200000000,
651 .ops = &clk_ops_local_pll,
652 CLK_INIT(mmpll1_clk_src.c),
653 },
654};
655
656static struct pll_config_regs mmpll1_regs __initdata = {
657 .l_reg = (void __iomem *)MMPLL1_PLL_L_VAL,
658 .m_reg = (void __iomem *)MMPLL1_PLL_M_VAL,
659 .n_reg = (void __iomem *)MMPLL1_PLL_N_VAL,
660 .config_reg = (void __iomem *)MMPLL1_PLL_USER_CTL,
661 .mode_reg = (void __iomem *)MMPLL1_PLL_MODE,
662 .base = &virt_bases[MMSS_BASE],
663};
664
Vikram Mulukutlab13abe42012-10-03 11:38:48 -0700665static struct clk_freq_tbl ftbl_gcc_blsp1_qup1_6_spi_apps_clk[] = {
666 F( 960000, gcc_xo, 10, 1, 2),
667 F( 4800000, gcc_xo, 4, 0, 0),
668 F( 9600000, gcc_xo, 2, 0, 0),
669 F(15000000, gpll0, 10, 1, 4),
670 F(19200000, gcc_xo, 1, 0, 0),
671 F(25000000, gpll0, 12, 1, 2),
672 F(50000000, gpll0, 12, 0, 0),
673 F_END,
674};
675
676static struct rcg_clk blsp1_qup1_spi_apps_clk_src = {
677 .cmd_rcgr_reg = BLSP1_QUP1_SPI_APPS_CMD_RCGR,
678 .set_rate = set_rate_mnd,
679 .freq_tbl = ftbl_gcc_blsp1_qup1_6_spi_apps_clk,
680 .current_freq = &rcg_dummy_freq,
681 .base = &virt_bases[GCC_BASE],
682 .c = {
683 .dbg_name = "blsp1_qup1_spi_apps_clk_src",
684 .ops = &clk_ops_rcg_mnd,
685 VDD_DIG_FMAX_MAP2(LOW, 25000000, NOMINAL, 50000000),
686 CLK_INIT(blsp1_qup1_spi_apps_clk_src.c),
687 },
688};
689
690static struct rcg_clk blsp1_qup2_spi_apps_clk_src = {
691 .cmd_rcgr_reg = BLSP1_QUP2_SPI_APPS_CMD_RCGR,
692 .set_rate = set_rate_mnd,
693 .freq_tbl = ftbl_gcc_blsp1_qup1_6_spi_apps_clk,
694 .current_freq = &rcg_dummy_freq,
695 .base = &virt_bases[GCC_BASE],
696 .c = {
697 .dbg_name = "blsp1_qup2_spi_apps_clk_src",
698 .ops = &clk_ops_rcg_mnd,
699 VDD_DIG_FMAX_MAP2(LOW, 25000000, NOMINAL, 50000000),
700 CLK_INIT(blsp1_qup2_spi_apps_clk_src.c),
701 },
702};
703
704static struct rcg_clk blsp1_qup3_spi_apps_clk_src = {
705 .cmd_rcgr_reg = BLSP1_QUP3_SPI_APPS_CMD_RCGR,
706 .set_rate = set_rate_mnd,
707 .freq_tbl = ftbl_gcc_blsp1_qup1_6_spi_apps_clk,
708 .current_freq = &rcg_dummy_freq,
709 .base = &virt_bases[GCC_BASE],
710 .c = {
711 .dbg_name = "blsp1_qup3_spi_apps_clk_src",
712 .ops = &clk_ops_rcg_mnd,
713 VDD_DIG_FMAX_MAP2(LOW, 25000000, NOMINAL, 50000000),
714 CLK_INIT(blsp1_qup3_spi_apps_clk_src.c),
715 },
716};
717
718static struct rcg_clk blsp1_qup4_spi_apps_clk_src = {
719 .cmd_rcgr_reg = BLSP1_QUP4_SPI_APPS_CMD_RCGR,
720 .set_rate = set_rate_mnd,
721 .freq_tbl = ftbl_gcc_blsp1_qup1_6_spi_apps_clk,
722 .current_freq = &rcg_dummy_freq,
723 .base = &virt_bases[GCC_BASE],
724 .c = {
725 .dbg_name = "blsp1_qup4_spi_apps_clk_src",
726 .ops = &clk_ops_rcg_mnd,
727 VDD_DIG_FMAX_MAP2(LOW, 25000000, NOMINAL, 50000000),
728 CLK_INIT(blsp1_qup4_spi_apps_clk_src.c),
729 },
730};
731
732static struct rcg_clk blsp1_qup5_spi_apps_clk_src = {
733 .cmd_rcgr_reg = BLSP1_QUP5_SPI_APPS_CMD_RCGR,
734 .set_rate = set_rate_mnd,
735 .freq_tbl = ftbl_gcc_blsp1_qup1_6_spi_apps_clk,
736 .current_freq = &rcg_dummy_freq,
737 .base = &virt_bases[GCC_BASE],
738 .c = {
739 .dbg_name = "blsp1_qup5_spi_apps_clk_src",
740 .ops = &clk_ops_rcg_mnd,
741 VDD_DIG_FMAX_MAP2(LOW, 25000000, NOMINAL, 50000000),
742 CLK_INIT(blsp1_qup5_spi_apps_clk_src.c),
743 },
744};
745
746static struct rcg_clk blsp1_qup6_spi_apps_clk_src = {
747 .cmd_rcgr_reg = BLSP1_QUP6_SPI_APPS_CMD_RCGR,
748 .set_rate = set_rate_mnd,
749 .freq_tbl = ftbl_gcc_blsp1_qup1_6_spi_apps_clk,
750 .current_freq = &rcg_dummy_freq,
751 .base = &virt_bases[GCC_BASE],
752 .c = {
753 .dbg_name = "blsp1_qup6_spi_apps_clk_src",
754 .ops = &clk_ops_rcg_mnd,
755 VDD_DIG_FMAX_MAP2(LOW, 25000000, NOMINAL, 50000000),
756 CLK_INIT(blsp1_qup6_spi_apps_clk_src.c),
757 },
758};
759
760static struct clk_freq_tbl ftbl_gcc_blsp1_uart1_6_apps_clk[] = {
761 F( 3686400, gpll0, 1, 96, 15625),
762 F( 7372800, gpll0, 1, 192, 15625),
763 F(14745600, gpll0, 1, 384, 15625),
764 F(16000000, gpll0, 5, 2, 15),
765 F(19200000, gcc_xo, 1, 0, 0),
766 F(24000000, gpll0, 5, 1, 5),
767 F(32000000, gpll0, 1, 4, 75),
768 F(40000000, gpll0, 15, 0, 0),
769 F(46400000, gpll0, 1, 29, 375),
770 F(48000000, gpll0, 12.5, 0, 0),
771 F(51200000, gpll0, 1, 32, 375),
772 F(56000000, gpll0, 1, 7, 75),
773 F(58982400, gpll0, 1, 1536, 15625),
774 F(60000000, gpll0, 10, 0, 0),
775 F_END,
776};
777
778static struct rcg_clk blsp1_uart1_apps_clk_src = {
779 .cmd_rcgr_reg = BLSP1_UART1_APPS_CMD_RCGR,
780 .set_rate = set_rate_mnd,
781 .freq_tbl = ftbl_gcc_blsp1_uart1_6_apps_clk,
782 .current_freq = &rcg_dummy_freq,
783 .base = &virt_bases[GCC_BASE],
784 .c = {
785 .dbg_name = "blsp1_uart1_apps_clk_src",
786 .ops = &clk_ops_rcg_mnd,
787 VDD_DIG_FMAX_MAP2(LOW, 31580000, NOMINAL, 63160000),
788 CLK_INIT(blsp1_uart1_apps_clk_src.c),
789 },
790};
791
792static struct rcg_clk blsp1_uart2_apps_clk_src = {
793 .cmd_rcgr_reg = BLSP1_UART2_APPS_CMD_RCGR,
794 .set_rate = set_rate_mnd,
795 .freq_tbl = ftbl_gcc_blsp1_uart1_6_apps_clk,
796 .current_freq = &rcg_dummy_freq,
797 .base = &virt_bases[GCC_BASE],
798 .c = {
799 .dbg_name = "blsp1_uart2_apps_clk_src",
800 .ops = &clk_ops_rcg_mnd,
801 VDD_DIG_FMAX_MAP2(LOW, 31580000, NOMINAL, 63160000),
802 CLK_INIT(blsp1_uart2_apps_clk_src.c),
803 },
804};
805
806static struct rcg_clk blsp1_uart3_apps_clk_src = {
807 .cmd_rcgr_reg = BLSP1_UART3_APPS_CMD_RCGR,
808 .set_rate = set_rate_mnd,
809 .freq_tbl = ftbl_gcc_blsp1_uart1_6_apps_clk,
810 .current_freq = &rcg_dummy_freq,
811 .base = &virt_bases[GCC_BASE],
812 .c = {
813 .dbg_name = "blsp1_uart3_apps_clk_src",
814 .ops = &clk_ops_rcg_mnd,
815 VDD_DIG_FMAX_MAP2(LOW, 31580000, NOMINAL, 63160000),
816 CLK_INIT(blsp1_uart3_apps_clk_src.c),
817 },
818};
819
820static struct rcg_clk blsp1_uart4_apps_clk_src = {
821 .cmd_rcgr_reg = BLSP1_UART4_APPS_CMD_RCGR,
822 .set_rate = set_rate_mnd,
823 .freq_tbl = ftbl_gcc_blsp1_uart1_6_apps_clk,
824 .current_freq = &rcg_dummy_freq,
825 .base = &virt_bases[GCC_BASE],
826 .c = {
827 .dbg_name = "blsp1_uart4_apps_clk_src",
828 .ops = &clk_ops_rcg_mnd,
829 VDD_DIG_FMAX_MAP2(LOW, 31580000, NOMINAL, 63160000),
830 CLK_INIT(blsp1_uart4_apps_clk_src.c),
831 },
832};
833
834static struct rcg_clk blsp1_uart5_apps_clk_src = {
835 .cmd_rcgr_reg = BLSP1_UART5_APPS_CMD_RCGR,
836 .set_rate = set_rate_mnd,
837 .freq_tbl = ftbl_gcc_blsp1_uart1_6_apps_clk,
838 .current_freq = &rcg_dummy_freq,
839 .base = &virt_bases[GCC_BASE],
840 .c = {
841 .dbg_name = "blsp1_uart5_apps_clk_src",
842 .ops = &clk_ops_rcg_mnd,
843 VDD_DIG_FMAX_MAP2(LOW, 31580000, NOMINAL, 63160000),
844 CLK_INIT(blsp1_uart5_apps_clk_src.c),
845 },
846};
847
848static struct rcg_clk blsp1_uart6_apps_clk_src = {
849 .cmd_rcgr_reg = BLSP1_UART6_APPS_CMD_RCGR,
850 .set_rate = set_rate_mnd,
851 .freq_tbl = ftbl_gcc_blsp1_uart1_6_apps_clk,
852 .current_freq = &rcg_dummy_freq,
853 .base = &virt_bases[GCC_BASE],
854 .c = {
855 .dbg_name = "blsp1_uart6_apps_clk_src",
856 .ops = &clk_ops_rcg_mnd,
857 VDD_DIG_FMAX_MAP2(LOW, 31580000, NOMINAL, 63160000),
858 CLK_INIT(blsp1_uart6_apps_clk_src.c),
859 },
860};
861
862static struct clk_freq_tbl ftbl_gcc_ce1_clk[] = {
863 F(50000000, gpll0, 12, 0, 0),
864 F(100000000, gpll0, 6, 0, 0),
865 F_END,
866};
867
868static struct rcg_clk ce1_clk_src = {
869 .cmd_rcgr_reg = CE1_CMD_RCGR,
870 .set_rate = set_rate_hid,
871 .freq_tbl = ftbl_gcc_ce1_clk,
872 .current_freq = &rcg_dummy_freq,
873 .base = &virt_bases[GCC_BASE],
874 .c = {
875 .dbg_name = "ce1_clk_src",
876 .ops = &clk_ops_rcg,
877 VDD_DIG_FMAX_MAP2(LOW, 50000000, NOMINAL, 100000000),
878 CLK_INIT(ce1_clk_src.c),
879 },
880};
881
882static struct clk_freq_tbl ftbl_gcc_gp1_3_clk[] = {
883 F(19200000, gcc_xo, 1, 0, 0),
884 F_END,
885};
886
887static struct rcg_clk gp1_clk_src = {
888 .cmd_rcgr_reg = GP1_CMD_RCGR,
889 .set_rate = set_rate_mnd,
890 .freq_tbl = ftbl_gcc_gp1_3_clk,
891 .current_freq = &rcg_dummy_freq,
892 .base = &virt_bases[GCC_BASE],
893 .c = {
894 .dbg_name = "gp1_clk_src",
895 .ops = &clk_ops_rcg_mnd,
896 VDD_DIG_FMAX_MAP2(LOW, 100000000, NOMINAL, 200000000),
897 CLK_INIT(gp1_clk_src.c),
898 },
899};
900
901static struct rcg_clk gp2_clk_src = {
902 .cmd_rcgr_reg = GP2_CMD_RCGR,
903 .set_rate = set_rate_mnd,
904 .freq_tbl = ftbl_gcc_gp1_3_clk,
905 .current_freq = &rcg_dummy_freq,
906 .base = &virt_bases[GCC_BASE],
907 .c = {
908 .dbg_name = "gp2_clk_src",
909 .ops = &clk_ops_rcg_mnd,
910 VDD_DIG_FMAX_MAP2(LOW, 100000000, NOMINAL, 200000000),
911 CLK_INIT(gp2_clk_src.c),
912 },
913};
914
915static struct rcg_clk gp3_clk_src = {
916 .cmd_rcgr_reg = GP3_CMD_RCGR,
917 .set_rate = set_rate_mnd,
918 .freq_tbl = ftbl_gcc_gp1_3_clk,
919 .current_freq = &rcg_dummy_freq,
920 .base = &virt_bases[GCC_BASE],
921 .c = {
922 .dbg_name = "gp3_clk_src",
923 .ops = &clk_ops_rcg_mnd,
924 VDD_DIG_FMAX_MAP2(LOW, 100000000, NOMINAL, 200000000),
925 CLK_INIT(gp3_clk_src.c),
926 },
927};
928
929static struct clk_freq_tbl ftbl_gcc_pdm2_clk[] = {
930 F(60000000, gpll0, 10, 0, 0),
931 F_END,
932};
933
934static struct rcg_clk pdm2_clk_src = {
935 .cmd_rcgr_reg = PDM2_CMD_RCGR,
936 .set_rate = set_rate_hid,
937 .freq_tbl = ftbl_gcc_pdm2_clk,
938 .current_freq = &rcg_dummy_freq,
939 .base = &virt_bases[GCC_BASE],
940 .c = {
941 .dbg_name = "pdm2_clk_src",
942 .ops = &clk_ops_rcg,
943 VDD_DIG_FMAX_MAP1(LOW, 120000000),
944 CLK_INIT(pdm2_clk_src.c),
945 },
946};
947
948static struct clk_freq_tbl ftbl_gcc_sdcc1_2_apps_clk[] = {
949 F( 144000, gcc_xo, 16, 3, 25),
950 F( 400000, gcc_xo, 12, 1, 4),
951 F( 20000000, gpll0, 15, 1, 2),
952 F( 25000000, gpll0, 12, 1, 2),
953 F( 50000000, gpll0, 12, 0, 0),
954 F(100000000, gpll0, 6, 0, 0),
955 F(200000000, gpll0, 3, 0, 0),
956 F_END,
957};
958
959static struct rcg_clk sdcc1_apps_clk_src = {
960 .cmd_rcgr_reg = SDCC1_APPS_CMD_RCGR,
961 .set_rate = set_rate_mnd,
962 .freq_tbl = ftbl_gcc_sdcc1_2_apps_clk,
963 .current_freq = &rcg_dummy_freq,
964 .base = &virt_bases[GCC_BASE],
965 .c = {
966 .dbg_name = "sdcc1_apps_clk_src",
967 .ops = &clk_ops_rcg_mnd,
968 VDD_DIG_FMAX_MAP2(LOW, 100000000, NOMINAL, 200000000),
969 CLK_INIT(sdcc1_apps_clk_src.c),
970 },
971};
972
973static struct rcg_clk sdcc2_apps_clk_src = {
974 .cmd_rcgr_reg = SDCC2_APPS_CMD_RCGR,
975 .set_rate = set_rate_mnd,
976 .freq_tbl = ftbl_gcc_sdcc1_2_apps_clk,
977 .current_freq = &rcg_dummy_freq,
978 .base = &virt_bases[GCC_BASE],
979 .c = {
980 .dbg_name = "sdcc2_apps_clk_src",
981 .ops = &clk_ops_rcg_mnd,
982 VDD_DIG_FMAX_MAP2(LOW, 100000000, NOMINAL, 200000000),
983 CLK_INIT(sdcc2_apps_clk_src.c),
984 },
985};
986
987static struct clk_freq_tbl ftbl_gcc_usb_hs_system_clk[] = {
988 F(75000000, gpll0, 8, 0, 0),
989 F_END,
990};
991
992static struct rcg_clk usb_hs_system_clk_src = {
993 .cmd_rcgr_reg = USB_HS_SYSTEM_CMD_RCGR,
994 .set_rate = set_rate_hid,
995 .freq_tbl = ftbl_gcc_usb_hs_system_clk,
996 .current_freq = &rcg_dummy_freq,
997 .base = &virt_bases[GCC_BASE],
998 .c = {
999 .dbg_name = "usb_hs_system_clk_src",
1000 .ops = &clk_ops_rcg,
1001 VDD_DIG_FMAX_MAP2(LOW, 60000000, NOMINAL, 100000000),
1002 CLK_INIT(usb_hs_system_clk_src.c),
1003 },
1004};
1005
1006static struct local_vote_clk gcc_blsp1_ahb_clk = {
1007 .cbcr_reg = BLSP1_AHB_CBCR,
1008 .vote_reg = APCS_CLOCK_BRANCH_ENA_VOTE,
1009 .en_mask = BIT(17),
1010 .base = &virt_bases[GCC_BASE],
1011 .c = {
1012 .dbg_name = "gcc_blsp1_ahb_clk",
1013 .ops = &clk_ops_vote,
1014 CLK_INIT(gcc_blsp1_ahb_clk.c),
1015 },
1016};
1017
1018static struct branch_clk gcc_blsp1_qup1_i2c_apps_clk = {
1019 .cbcr_reg = BLSP1_QUP1_I2C_APPS_CBCR,
1020 .has_sibling = 1,
1021 .base = &virt_bases[GCC_BASE],
1022 .c = {
1023 .parent = &gcc_xo_clk_src.c,
1024 .dbg_name = "gcc_blsp1_qup1_i2c_apps_clk",
1025 .ops = &clk_ops_branch,
1026 CLK_INIT(gcc_blsp1_qup1_i2c_apps_clk.c),
1027 },
1028};
1029
1030static struct branch_clk gcc_blsp1_qup1_spi_apps_clk = {
1031 .cbcr_reg = BLSP1_QUP1_SPI_APPS_CBCR,
1032 .has_sibling = 0,
1033 .base = &virt_bases[GCC_BASE],
1034 .c = {
1035 .parent = &blsp1_qup1_spi_apps_clk_src.c,
1036 .dbg_name = "gcc_blsp1_qup1_spi_apps_clk",
1037 .ops = &clk_ops_branch,
1038 CLK_INIT(gcc_blsp1_qup1_spi_apps_clk.c),
1039 },
1040};
1041
1042static struct branch_clk gcc_blsp1_qup2_i2c_apps_clk = {
1043 .cbcr_reg = BLSP1_QUP2_I2C_APPS_CBCR,
1044 .has_sibling = 1,
1045 .base = &virt_bases[GCC_BASE],
1046 .c = {
1047 .parent = &gcc_xo_clk_src.c,
1048 .dbg_name = "gcc_blsp1_qup2_i2c_apps_clk",
1049 .ops = &clk_ops_branch,
1050 CLK_INIT(gcc_blsp1_qup2_i2c_apps_clk.c),
1051 },
1052};
1053
1054static struct branch_clk gcc_blsp1_qup2_spi_apps_clk = {
1055 .cbcr_reg = BLSP1_QUP2_SPI_APPS_CBCR,
1056 .has_sibling = 0,
1057 .base = &virt_bases[GCC_BASE],
1058 .c = {
1059 .parent = &blsp1_qup2_spi_apps_clk_src.c,
1060 .dbg_name = "gcc_blsp1_qup2_spi_apps_clk",
1061 .ops = &clk_ops_branch,
1062 CLK_INIT(gcc_blsp1_qup2_spi_apps_clk.c),
1063 },
1064};
1065
1066static struct branch_clk gcc_blsp1_qup3_i2c_apps_clk = {
1067 .cbcr_reg = BLSP1_QUP3_I2C_APPS_CBCR,
1068 .has_sibling = 1,
1069 .base = &virt_bases[GCC_BASE],
1070 .c = {
1071 .parent = &gcc_xo_clk_src.c,
1072 .dbg_name = "gcc_blsp1_qup3_i2c_apps_clk",
1073 .ops = &clk_ops_branch,
1074 CLK_INIT(gcc_blsp1_qup3_i2c_apps_clk.c),
1075 },
1076};
1077
1078static struct branch_clk gcc_blsp1_qup3_spi_apps_clk = {
1079 .cbcr_reg = BLSP1_QUP3_SPI_APPS_CBCR,
1080 .has_sibling = 0,
1081 .base = &virt_bases[GCC_BASE],
1082 .c = {
1083 .parent = &blsp1_qup3_spi_apps_clk_src.c,
1084 .dbg_name = "gcc_blsp1_qup3_spi_apps_clk",
1085 .ops = &clk_ops_branch,
1086 CLK_INIT(gcc_blsp1_qup3_spi_apps_clk.c),
1087 },
1088};
1089
1090static struct branch_clk gcc_blsp1_qup4_i2c_apps_clk = {
1091 .cbcr_reg = BLSP1_QUP4_I2C_APPS_CBCR,
1092 .has_sibling = 1,
1093 .base = &virt_bases[GCC_BASE],
1094 .c = {
1095 .parent = &gcc_xo_clk_src.c,
1096 .dbg_name = "gcc_blsp1_qup4_i2c_apps_clk",
1097 .ops = &clk_ops_branch,
1098 CLK_INIT(gcc_blsp1_qup4_i2c_apps_clk.c),
1099 },
1100};
1101
1102static struct branch_clk gcc_blsp1_qup4_spi_apps_clk = {
1103 .cbcr_reg = BLSP1_QUP4_SPI_APPS_CBCR,
1104 .has_sibling = 0,
1105 .base = &virt_bases[GCC_BASE],
1106 .c = {
1107 .parent = &blsp1_qup4_spi_apps_clk_src.c,
1108 .dbg_name = "gcc_blsp1_qup4_spi_apps_clk",
1109 .ops = &clk_ops_branch,
1110 CLK_INIT(gcc_blsp1_qup4_spi_apps_clk.c),
1111 },
1112};
1113
1114static struct branch_clk gcc_blsp1_qup5_i2c_apps_clk = {
1115 .cbcr_reg = BLSP1_QUP5_I2C_APPS_CBCR,
1116 .has_sibling = 1,
1117 .base = &virt_bases[GCC_BASE],
1118 .c = {
1119 .parent = &gcc_xo_clk_src.c,
1120 .dbg_name = "gcc_blsp1_qup5_i2c_apps_clk",
1121 .ops = &clk_ops_branch,
1122 CLK_INIT(gcc_blsp1_qup5_i2c_apps_clk.c),
1123 },
1124};
1125
1126static struct branch_clk gcc_blsp1_qup5_spi_apps_clk = {
1127 .cbcr_reg = BLSP1_QUP5_SPI_APPS_CBCR,
1128 .has_sibling = 0,
1129 .base = &virt_bases[GCC_BASE],
1130 .c = {
1131 .parent = &blsp1_qup5_spi_apps_clk_src.c,
1132 .dbg_name = "gcc_blsp1_qup5_spi_apps_clk",
1133 .ops = &clk_ops_branch,
1134 CLK_INIT(gcc_blsp1_qup5_spi_apps_clk.c),
1135 },
1136};
1137
1138static struct branch_clk gcc_blsp1_qup6_i2c_apps_clk = {
1139 .cbcr_reg = BLSP1_QUP6_I2C_APPS_CBCR,
1140 .has_sibling = 1,
1141 .base = &virt_bases[GCC_BASE],
1142 .c = {
1143 .parent = &gcc_xo_clk_src.c,
1144 .dbg_name = "gcc_blsp1_qup6_i2c_apps_clk",
1145 .ops = &clk_ops_branch,
1146 CLK_INIT(gcc_blsp1_qup6_i2c_apps_clk.c),
1147 },
1148};
1149
1150static struct branch_clk gcc_blsp1_qup6_spi_apps_clk = {
1151 .cbcr_reg = BLSP1_QUP6_SPI_APPS_CBCR,
1152 .has_sibling = 0,
1153 .base = &virt_bases[GCC_BASE],
1154 .c = {
1155 .parent = &blsp1_qup6_spi_apps_clk_src.c,
1156 .dbg_name = "gcc_blsp1_qup6_spi_apps_clk",
1157 .ops = &clk_ops_branch,
1158 CLK_INIT(gcc_blsp1_qup6_spi_apps_clk.c),
1159 },
1160};
1161
1162static struct branch_clk gcc_blsp1_uart1_apps_clk = {
1163 .cbcr_reg = BLSP1_UART1_APPS_CBCR,
1164 .has_sibling = 0,
1165 .base = &virt_bases[GCC_BASE],
1166 .c = {
1167 .parent = &blsp1_uart1_apps_clk_src.c,
1168 .dbg_name = "gcc_blsp1_uart1_apps_clk",
1169 .ops = &clk_ops_branch,
1170 CLK_INIT(gcc_blsp1_uart1_apps_clk.c),
1171 },
1172};
1173
1174static struct branch_clk gcc_blsp1_uart2_apps_clk = {
1175 .cbcr_reg = BLSP1_UART2_APPS_CBCR,
1176 .has_sibling = 0,
1177 .base = &virt_bases[GCC_BASE],
1178 .c = {
1179 .parent = &blsp1_uart2_apps_clk_src.c,
1180 .dbg_name = "gcc_blsp1_uart2_apps_clk",
1181 .ops = &clk_ops_branch,
1182 CLK_INIT(gcc_blsp1_uart2_apps_clk.c),
1183 },
1184};
1185
1186static struct branch_clk gcc_blsp1_uart3_apps_clk = {
1187 .cbcr_reg = BLSP1_UART3_APPS_CBCR,
1188 .has_sibling = 0,
1189 .base = &virt_bases[GCC_BASE],
1190 .c = {
1191 .parent = &blsp1_uart3_apps_clk_src.c,
1192 .dbg_name = "gcc_blsp1_uart3_apps_clk",
1193 .ops = &clk_ops_branch,
1194 CLK_INIT(gcc_blsp1_uart3_apps_clk.c),
1195 },
1196};
1197
1198static struct branch_clk gcc_blsp1_uart4_apps_clk = {
1199 .cbcr_reg = BLSP1_UART4_APPS_CBCR,
1200 .has_sibling = 0,
1201 .base = &virt_bases[GCC_BASE],
1202 .c = {
1203 .parent = &blsp1_uart4_apps_clk_src.c,
1204 .dbg_name = "gcc_blsp1_uart4_apps_clk",
1205 .ops = &clk_ops_branch,
1206 CLK_INIT(gcc_blsp1_uart4_apps_clk.c),
1207 },
1208};
1209
1210static struct branch_clk gcc_blsp1_uart5_apps_clk = {
1211 .cbcr_reg = BLSP1_UART5_APPS_CBCR,
1212 .has_sibling = 0,
1213 .base = &virt_bases[GCC_BASE],
1214 .c = {
1215 .parent = &blsp1_uart5_apps_clk_src.c,
1216 .dbg_name = "gcc_blsp1_uart5_apps_clk",
1217 .ops = &clk_ops_branch,
1218 CLK_INIT(gcc_blsp1_uart5_apps_clk.c),
1219 },
1220};
1221
1222static struct branch_clk gcc_blsp1_uart6_apps_clk = {
1223 .cbcr_reg = BLSP1_UART6_APPS_CBCR,
1224 .has_sibling = 0,
1225 .base = &virt_bases[GCC_BASE],
1226 .c = {
1227 .parent = &blsp1_uart6_apps_clk_src.c,
1228 .dbg_name = "gcc_blsp1_uart6_apps_clk",
1229 .ops = &clk_ops_branch,
1230 CLK_INIT(gcc_blsp1_uart6_apps_clk.c),
1231 },
1232};
1233
1234static struct local_vote_clk gcc_boot_rom_ahb_clk = {
1235 .cbcr_reg = BOOT_ROM_AHB_CBCR,
1236 .vote_reg = APCS_CLOCK_BRANCH_ENA_VOTE,
1237 .en_mask = BIT(10),
1238 .base = &virt_bases[GCC_BASE],
1239 .c = {
1240 .dbg_name = "gcc_boot_rom_ahb_clk",
1241 .ops = &clk_ops_vote,
1242 CLK_INIT(gcc_boot_rom_ahb_clk.c),
1243 },
1244};
1245
1246static struct local_vote_clk gcc_ce1_ahb_clk = {
1247 .cbcr_reg = CE1_AHB_CBCR,
1248 .vote_reg = APCS_CLOCK_BRANCH_ENA_VOTE,
1249 .en_mask = BIT(3),
1250 .base = &virt_bases[GCC_BASE],
1251 .c = {
1252 .dbg_name = "gcc_ce1_ahb_clk",
1253 .ops = &clk_ops_vote,
1254 CLK_INIT(gcc_ce1_ahb_clk.c),
1255 },
1256};
1257
1258static struct local_vote_clk gcc_ce1_axi_clk = {
1259 .cbcr_reg = CE1_AXI_CBCR,
1260 .vote_reg = APCS_CLOCK_BRANCH_ENA_VOTE,
1261 .en_mask = BIT(4),
1262 .base = &virt_bases[GCC_BASE],
1263 .c = {
1264 .dbg_name = "gcc_ce1_axi_clk",
1265 .ops = &clk_ops_vote,
1266 CLK_INIT(gcc_ce1_axi_clk.c),
1267 },
1268};
1269
1270static struct local_vote_clk gcc_ce1_clk = {
1271 .cbcr_reg = CE1_CBCR,
1272 .vote_reg = APCS_CLOCK_BRANCH_ENA_VOTE,
1273 .en_mask = BIT(5),
1274 .base = &virt_bases[GCC_BASE],
1275 .c = {
1276 .dbg_name = "gcc_ce1_clk",
1277 .ops = &clk_ops_vote,
1278 CLK_INIT(gcc_ce1_clk.c),
1279 },
1280};
1281
1282static struct branch_clk gcc_copss_smmu_ahb_clk = {
1283 .cbcr_reg = COPSS_SMMU_AHB_CBCR,
1284 .has_sibling = 1,
1285 .base = &virt_bases[GCC_BASE],
1286 .c = {
1287 .dbg_name = "gcc_copss_smmu_ahb_clk",
1288 .ops = &clk_ops_branch,
1289 CLK_INIT(gcc_copss_smmu_ahb_clk.c),
1290 },
1291};
1292
1293static struct branch_clk gcc_lpss_smmu_ahb_clk = {
1294 .cbcr_reg = LPSS_SMMU_AHB_CBCR,
1295 .has_sibling = 1,
1296 .base = &virt_bases[GCC_BASE],
1297 .c = {
1298 .dbg_name = "gcc_lpss_smmu_ahb_clk",
1299 .ops = &clk_ops_branch,
1300 CLK_INIT(gcc_lpss_smmu_ahb_clk.c),
1301 },
1302};
1303
1304static struct branch_clk gcc_gp1_clk = {
1305 .cbcr_reg = GP1_CBCR,
1306 .has_sibling = 0,
1307 .base = &virt_bases[GCC_BASE],
1308 .c = {
1309 .parent = &gp1_clk_src.c,
1310 .dbg_name = "gcc_gp1_clk",
1311 .ops = &clk_ops_branch,
1312 CLK_INIT(gcc_gp1_clk.c),
1313 },
1314};
1315
1316static struct branch_clk gcc_gp2_clk = {
1317 .cbcr_reg = GP2_CBCR,
1318 .has_sibling = 0,
1319 .base = &virt_bases[GCC_BASE],
1320 .c = {
1321 .parent = &gp2_clk_src.c,
1322 .dbg_name = "gcc_gp2_clk",
1323 .ops = &clk_ops_branch,
1324 CLK_INIT(gcc_gp2_clk.c),
1325 },
1326};
1327
1328static struct branch_clk gcc_gp3_clk = {
1329 .cbcr_reg = GP3_CBCR,
1330 .has_sibling = 0,
1331 .base = &virt_bases[GCC_BASE],
1332 .c = {
1333 .parent = &gp3_clk_src.c,
1334 .dbg_name = "gcc_gp3_clk",
1335 .ops = &clk_ops_branch,
1336 CLK_INIT(gcc_gp3_clk.c),
1337 },
1338};
1339
1340static struct branch_clk gcc_lpass_q6_axi_clk = {
1341 .cbcr_reg = LPASS_Q6_AXI_CBCR,
1342 .has_sibling = 1,
1343 .base = &virt_bases[GCC_BASE],
Vikram Mulukutla2dfa8b12013-01-15 18:17:10 -08001344 /* FIXME: Remove this once simulation is fixed. */
1345 .halt_check = DELAY,
Vikram Mulukutlab13abe42012-10-03 11:38:48 -07001346 .c = {
1347 .dbg_name = "gcc_lpass_q6_axi_clk",
1348 .ops = &clk_ops_branch,
1349 CLK_INIT(gcc_lpass_q6_axi_clk.c),
1350 },
1351};
1352
1353static struct branch_clk gcc_mmss_noc_cfg_ahb_clk = {
1354 .cbcr_reg = MMSS_NOC_CFG_AHB_CBCR,
1355 .has_sibling = 1,
1356 .base = &virt_bases[GCC_BASE],
1357 .c = {
1358 .dbg_name = "gcc_mmss_noc_cfg_ahb_clk",
1359 .ops = &clk_ops_branch,
1360 CLK_INIT(gcc_mmss_noc_cfg_ahb_clk.c),
1361 },
1362};
1363
1364static struct branch_clk gcc_mss_cfg_ahb_clk = {
1365 .cbcr_reg = MSS_CFG_AHB_CBCR,
1366 .has_sibling = 1,
1367 .base = &virt_bases[GCC_BASE],
1368 .c = {
1369 .dbg_name = "gcc_mss_cfg_ahb_clk",
1370 .ops = &clk_ops_branch,
1371 CLK_INIT(gcc_mss_cfg_ahb_clk.c),
1372 },
1373};
1374
1375static struct branch_clk gcc_mss_q6_bimc_axi_clk = {
1376 .cbcr_reg = MSS_Q6_BIMC_AXI_CBCR,
1377 .has_sibling = 1,
1378 .base = &virt_bases[GCC_BASE],
1379 .c = {
1380 .dbg_name = "gcc_mss_q6_bimc_axi_clk",
1381 .ops = &clk_ops_branch,
1382 CLK_INIT(gcc_mss_q6_bimc_axi_clk.c),
1383 },
1384};
1385
1386static struct branch_clk gcc_pdm2_clk = {
1387 .cbcr_reg = PDM2_CBCR,
1388 .has_sibling = 0,
1389 .base = &virt_bases[GCC_BASE],
1390 .c = {
1391 .parent = &pdm2_clk_src.c,
1392 .dbg_name = "gcc_pdm2_clk",
1393 .ops = &clk_ops_branch,
1394 CLK_INIT(gcc_pdm2_clk.c),
1395 },
1396};
1397
1398static struct branch_clk gcc_pdm_ahb_clk = {
1399 .cbcr_reg = PDM_AHB_CBCR,
1400 .has_sibling = 1,
1401 .base = &virt_bases[GCC_BASE],
1402 .c = {
1403 .dbg_name = "gcc_pdm_ahb_clk",
1404 .ops = &clk_ops_branch,
1405 CLK_INIT(gcc_pdm_ahb_clk.c),
1406 },
1407};
1408
1409static struct local_vote_clk gcc_prng_ahb_clk = {
1410 .cbcr_reg = PRNG_AHB_CBCR,
1411 .vote_reg = APCS_CLOCK_BRANCH_ENA_VOTE,
1412 .en_mask = BIT(13),
1413 .base = &virt_bases[GCC_BASE],
1414 .c = {
1415 .dbg_name = "gcc_prng_ahb_clk",
1416 .ops = &clk_ops_vote,
1417 CLK_INIT(gcc_prng_ahb_clk.c),
1418 },
1419};
1420
1421static struct branch_clk gcc_sdcc1_ahb_clk = {
1422 .cbcr_reg = SDCC1_AHB_CBCR,
1423 .has_sibling = 1,
1424 .base = &virt_bases[GCC_BASE],
1425 .c = {
1426 .dbg_name = "gcc_sdcc1_ahb_clk",
1427 .ops = &clk_ops_branch,
1428 CLK_INIT(gcc_sdcc1_ahb_clk.c),
1429 },
1430};
1431
1432static struct branch_clk gcc_sdcc1_apps_clk = {
1433 .cbcr_reg = SDCC1_APPS_CBCR,
1434 .has_sibling = 0,
1435 .base = &virt_bases[GCC_BASE],
1436 .c = {
1437 .parent = &sdcc1_apps_clk_src.c,
1438 .dbg_name = "gcc_sdcc1_apps_clk",
1439 .ops = &clk_ops_branch,
1440 CLK_INIT(gcc_sdcc1_apps_clk.c),
1441 },
1442};
1443
1444static struct branch_clk gcc_sdcc2_ahb_clk = {
1445 .cbcr_reg = SDCC2_AHB_CBCR,
1446 .has_sibling = 1,
1447 .base = &virt_bases[GCC_BASE],
1448 .c = {
1449 .dbg_name = "gcc_sdcc2_ahb_clk",
1450 .ops = &clk_ops_branch,
1451 CLK_INIT(gcc_sdcc2_ahb_clk.c),
1452 },
1453};
1454
1455static struct branch_clk gcc_sdcc2_apps_clk = {
1456 .cbcr_reg = SDCC2_APPS_CBCR,
1457 .has_sibling = 0,
1458 .base = &virt_bases[GCC_BASE],
1459 .c = {
1460 .parent = &sdcc2_apps_clk_src.c,
1461 .dbg_name = "gcc_sdcc2_apps_clk",
1462 .ops = &clk_ops_branch,
1463 CLK_INIT(gcc_sdcc2_apps_clk.c),
1464 },
1465};
1466
1467static struct branch_clk gcc_usb2a_phy_sleep_clk = {
1468 .cbcr_reg = USB2A_PHY_SLEEP_CBCR,
1469 .has_sibling = 1,
1470 .base = &virt_bases[GCC_BASE],
1471 .c = {
1472 .dbg_name = "gcc_usb2a_phy_sleep_clk",
1473 .ops = &clk_ops_branch,
1474 CLK_INIT(gcc_usb2a_phy_sleep_clk.c),
1475 },
1476};
1477
1478static struct branch_clk gcc_usb_hs_ahb_clk = {
1479 .cbcr_reg = USB_HS_AHB_CBCR,
1480 .has_sibling = 1,
1481 .base = &virt_bases[GCC_BASE],
1482 .c = {
1483 .dbg_name = "gcc_usb_hs_ahb_clk",
1484 .ops = &clk_ops_branch,
1485 CLK_INIT(gcc_usb_hs_ahb_clk.c),
1486 },
1487};
1488
1489static struct branch_clk gcc_usb_hs_system_clk = {
1490 .cbcr_reg = USB_HS_SYSTEM_CBCR,
1491 .has_sibling = 0,
1492 .bcr_reg = USB_HS_BCR,
1493 .base = &virt_bases[GCC_BASE],
1494 .c = {
1495 .parent = &usb_hs_system_clk_src.c,
1496 .dbg_name = "gcc_usb_hs_system_clk",
1497 .ops = &clk_ops_branch,
1498 CLK_INIT(gcc_usb_hs_system_clk.c),
1499 },
1500};
1501
1502static struct clk_freq_tbl ftbl_csi0_1_clk[] = {
1503 F_MM(100000000, gpll0, 6, 0, 0),
1504 F_MM(200000000, mmpll0, 4, 0, 0),
1505 F_END,
1506};
1507
1508static struct rcg_clk csi0_clk_src = {
1509 .cmd_rcgr_reg = CSI0_CMD_RCGR,
1510 .set_rate = set_rate_hid,
1511 .freq_tbl = ftbl_csi0_1_clk,
1512 .current_freq = &rcg_dummy_freq,
1513 .base = &virt_bases[MMSS_BASE],
1514 .c = {
1515 .dbg_name = "csi0_clk_src",
1516 .ops = &clk_ops_rcg,
1517 VDD_DIG_FMAX_MAP2(LOW, 100000000, NOMINAL, 200000000),
1518 CLK_INIT(csi0_clk_src.c),
1519 },
1520};
1521
Vikram Mulukutlab13abe42012-10-03 11:38:48 -07001522static struct clk_freq_tbl ftbl_mmss_mmssnoc_axi_clk[] = {
1523 F_MM( 19200000, gcc_xo, 1, 0, 0),
1524 F_MM( 37500000, gpll0, 16, 0, 0),
1525 F_MM( 50000000, gpll0, 12, 0, 0),
1526 F_MM( 75000000, gpll0, 8, 0, 0),
1527 F_MM(100000000, gpll0, 6, 0, 0),
1528 F_MM(150000000, gpll0, 4, 0, 0),
1529 F_MM(200000000, mmpll0, 4, 0, 0),
1530 F_END,
1531};
1532
1533static struct rcg_clk axi_clk_src = {
1534 .cmd_rcgr_reg = AXI_CMD_RCGR,
1535 .set_rate = set_rate_hid,
1536 .freq_tbl = ftbl_mmss_mmssnoc_axi_clk,
1537 .current_freq = &rcg_dummy_freq,
1538 .base = &virt_bases[MMSS_BASE],
1539 .c = {
1540 .dbg_name = "axi_clk_src",
1541 .ops = &clk_ops_rcg,
1542 VDD_DIG_FMAX_MAP2(LOW, 100000000, NOMINAL, 200000000),
1543 CLK_INIT(axi_clk_src.c),
1544 },
1545};
1546
Vikram Mulukutlae1e5c482013-01-28 14:43:20 -08001547static DEFINE_CLK_VOTER(mdp_axi_clk_src, &axi_clk_src.c, 200000000);
1548static DEFINE_CLK_VOTER(mmssnoc_axi_clk_src, &axi_clk_src.c, 200000000);
1549
Vikram Mulukutlab13abe42012-10-03 11:38:48 -07001550static struct clk_freq_tbl ftbl_dsi_pclk_clk[] = {
1551 F_MDSS( 50000000, dsipll, 10, 0, 0),
1552 F_MDSS(103330000, dsipll, 9, 0, 0),
1553 F_END,
1554};
1555
1556static struct rcg_clk dsi_pclk_clk_src = {
1557 .cmd_rcgr_reg = DSI_PCLK_CMD_RCGR,
1558 .set_rate = set_rate_mnd,
1559 .freq_tbl = ftbl_dsi_pclk_clk,
1560 .current_freq = &rcg_dummy_freq,
1561 .base = &virt_bases[MMSS_BASE],
1562 .c = {
1563 .dbg_name = "dsi_pclk_clk_src",
1564 .ops = &clk_ops_rcg_mnd,
1565 VDD_DIG_FMAX_MAP2(LOW, 50000000, NOMINAL, 103330000),
1566 CLK_INIT(dsi_pclk_clk_src.c),
1567 },
1568};
1569
1570static struct clk_freq_tbl ftbl_oxili_gfx3d_clk[] = {
1571 F_MM( 19200000, gcc_xo, 1, 0, 0),
1572 F_MM( 37500000, gpll0, 16, 0, 0),
1573 F_MM( 50000000, gpll0, 12, 0, 0),
1574 F_MM( 75000000, gpll0, 8, 0, 0),
1575 F_MM(100000000, gpll0, 6, 0, 0),
1576 F_MM(150000000, gpll0, 4, 0, 0),
1577 F_MM(200000000, gpll0, 3, 0, 0),
1578 F_MM(300000000, gpll0, 2, 0, 0),
1579 F_MM(400000000, mmpll1, 3, 0, 0),
1580 F_END,
1581};
1582
1583static struct rcg_clk gfx3d_clk_src = {
1584 .cmd_rcgr_reg = GFX3D_CMD_RCGR,
1585 .set_rate = set_rate_hid,
1586 .freq_tbl = ftbl_oxili_gfx3d_clk,
1587 .current_freq = &rcg_dummy_freq,
1588 .base = &virt_bases[MMSS_BASE],
1589 .c = {
1590 .dbg_name = "gfx3d_clk_src",
1591 .ops = &clk_ops_rcg,
1592 VDD_DIG_FMAX_MAP3(LOW, 150000000, NOMINAL, 300000000, HIGH,
1593 400000000),
1594 CLK_INIT(gfx3d_clk_src.c),
1595 },
1596};
1597
1598static struct clk_freq_tbl ftbl_vfe_clk[] = {
1599 F_MM( 37500000, gpll0, 16, 0, 0),
1600 F_MM( 50000000, gpll0, 12, 0, 0),
1601 F_MM( 60000000, gpll0, 10, 0, 0),
1602 F_MM( 80000000, gpll0, 7.5, 0, 0),
1603 F_MM(100000000, gpll0, 6, 0, 0),
1604 F_MM(109090000, gpll0, 5.5, 0, 0),
1605 F_MM(133330000, gpll0, 4.5, 0, 0),
1606 F_MM(200000000, gpll0, 3, 0, 0),
1607 F_MM(228570000, mmpll0, 3.5, 0, 0),
1608 F_MM(266670000, mmpll0, 3, 0, 0),
1609 F_MM(320000000, mmpll0, 2.5, 0, 0),
1610 F_END,
1611};
1612
1613static struct rcg_clk vfe_clk_src = {
1614 .cmd_rcgr_reg = VFE_CMD_RCGR,
1615 .set_rate = set_rate_hid,
1616 .freq_tbl = ftbl_vfe_clk,
1617 .current_freq = &rcg_dummy_freq,
1618 .base = &virt_bases[MMSS_BASE],
1619 .c = {
1620 .dbg_name = "vfe_clk_src",
1621 .ops = &clk_ops_rcg,
1622 VDD_DIG_FMAX_MAP3(LOW, 133330000, NOMINAL, 266670000, HIGH,
1623 320000000),
1624 CLK_INIT(vfe_clk_src.c),
1625 },
1626};
1627
1628static struct rcg_clk csi1_clk_src = {
1629 .cmd_rcgr_reg = CSI1_CMD_RCGR,
1630 .set_rate = set_rate_hid,
1631 .freq_tbl = ftbl_csi0_1_clk,
1632 .current_freq = &rcg_dummy_freq,
1633 .base = &virt_bases[MMSS_BASE],
1634 .c = {
1635 .dbg_name = "csi1_clk_src",
1636 .ops = &clk_ops_rcg,
1637 VDD_DIG_FMAX_MAP2(LOW, 100000000, NOMINAL, 200000000),
1638 CLK_INIT(csi1_clk_src.c),
1639 },
1640};
1641
1642static struct clk_freq_tbl ftbl_csi0_1phytimer_clk[] = {
1643 F_MM(100000000, gpll0, 6, 0, 0),
1644 F_MM(200000000, mmpll0, 4, 0, 0),
1645 F_END,
1646};
1647
1648static struct rcg_clk csi0phytimer_clk_src = {
1649 .cmd_rcgr_reg = CSI0PHYTIMER_CMD_RCGR,
1650 .set_rate = set_rate_hid,
1651 .freq_tbl = ftbl_csi0_1phytimer_clk,
1652 .current_freq = &rcg_dummy_freq,
1653 .base = &virt_bases[MMSS_BASE],
1654 .c = {
1655 .dbg_name = "csi0phytimer_clk_src",
1656 .ops = &clk_ops_rcg,
1657 VDD_DIG_FMAX_MAP2(LOW, 100000000, NOMINAL, 200000000),
1658 CLK_INIT(csi0phytimer_clk_src.c),
1659 },
1660};
1661
1662static struct rcg_clk csi1phytimer_clk_src = {
1663 .cmd_rcgr_reg = CSI1PHYTIMER_CMD_RCGR,
1664 .set_rate = set_rate_hid,
1665 .freq_tbl = ftbl_csi0_1phytimer_clk,
1666 .current_freq = &rcg_dummy_freq,
1667 .base = &virt_bases[MMSS_BASE],
1668 .c = {
1669 .dbg_name = "csi1phytimer_clk_src",
1670 .ops = &clk_ops_rcg,
1671 VDD_DIG_FMAX_MAP2(LOW, 100000000, NOMINAL, 200000000),
1672 CLK_INIT(csi1phytimer_clk_src.c),
1673 },
1674};
1675
1676static struct clk_freq_tbl ftbl_dsi_clk[] = {
1677 F_MDSS(155000000, dsipll, 6, 0, 0),
1678 F_MDSS(310000000, dsipll, 3, 0, 0),
1679 F_END,
1680};
1681
1682static struct rcg_clk dsi_clk_src = {
1683 .cmd_rcgr_reg = DSI_CMD_RCGR,
1684 .set_rate = set_rate_mnd,
1685 .freq_tbl = ftbl_dsi_clk,
1686 .current_freq = &rcg_dummy_freq,
1687 .base = &virt_bases[MMSS_BASE],
1688 .c = {
1689 .dbg_name = "dsi_clk_src",
1690 .ops = &clk_ops_rcg_mnd,
1691 VDD_DIG_FMAX_MAP2(LOW, 155000000, NOMINAL, 310000000),
1692 CLK_INIT(dsi_clk_src.c),
1693 },
1694};
1695
1696static struct clk_freq_tbl ftbl_dsi_byte_clk[] = {
1697 F_MDSS( 62500000, dsipll, 12, 0, 0),
1698 F_MDSS(125000000, dsipll, 6, 0, 0),
1699 F_END,
1700};
1701
1702static struct rcg_clk dsi_byte_clk_src = {
1703 .cmd_rcgr_reg = DSI_BYTE_CMD_RCGR,
1704 .set_rate = set_rate_hid,
1705 .freq_tbl = ftbl_dsi_byte_clk,
1706 .current_freq = &rcg_dummy_freq,
1707 .base = &virt_bases[MMSS_BASE],
1708 .c = {
1709 .dbg_name = "dsi_byte_clk_src",
1710 .ops = &clk_ops_rcg,
1711 VDD_DIG_FMAX_MAP2(LOW, 62500000, NOMINAL, 125000000),
1712 CLK_INIT(dsi_byte_clk_src.c),
1713 },
1714};
1715
1716static struct clk_freq_tbl ftbl_dsi_esc_clk[] = {
1717 F_MM(19200000, gcc_xo, 1, 0, 0),
1718 F_END,
1719};
1720
1721static struct rcg_clk dsi_esc_clk_src = {
1722 .cmd_rcgr_reg = DSI_ESC_CMD_RCGR,
1723 .set_rate = set_rate_hid,
1724 .freq_tbl = ftbl_dsi_esc_clk,
1725 .current_freq = &rcg_dummy_freq,
1726 .base = &virt_bases[MMSS_BASE],
1727 .c = {
1728 .dbg_name = "dsi_esc_clk_src",
1729 .ops = &clk_ops_rcg,
1730 VDD_DIG_FMAX_MAP1(LOW, 19200000),
1731 CLK_INIT(dsi_esc_clk_src.c),
1732 },
1733};
1734
1735static struct clk_freq_tbl ftbl_mclk0_1_clk[] = {
1736 F_MM(66670000, gpll0, 9, 0, 0),
1737 F_END,
1738};
1739
1740static struct rcg_clk mclk0_clk_src = {
1741 .cmd_rcgr_reg = MCLK0_CMD_RCGR,
1742 .set_rate = set_rate_mnd,
1743 .freq_tbl = ftbl_mclk0_1_clk,
1744 .current_freq = &rcg_dummy_freq,
1745 .base = &virt_bases[MMSS_BASE],
1746 .c = {
1747 .dbg_name = "mclk0_clk_src",
1748 .ops = &clk_ops_rcg_mnd,
1749 VDD_DIG_FMAX_MAP1(LOW, 66670000),
1750 CLK_INIT(mclk0_clk_src.c),
1751 },
1752};
1753
1754static struct rcg_clk mclk1_clk_src = {
1755 .cmd_rcgr_reg = MCLK1_CMD_RCGR,
1756 .set_rate = set_rate_mnd,
1757 .freq_tbl = ftbl_mclk0_1_clk,
1758 .current_freq = &rcg_dummy_freq,
1759 .base = &virt_bases[MMSS_BASE],
1760 .c = {
1761 .dbg_name = "mclk1_clk_src",
1762 .ops = &clk_ops_rcg_mnd,
1763 VDD_DIG_FMAX_MAP1(LOW, 66670000),
1764 CLK_INIT(mclk1_clk_src.c),
1765 },
1766};
1767
1768static struct clk_freq_tbl ftbl_mdp_vsync_clk[] = {
1769 F_MM(19200000, gcc_xo, 1, 0, 0),
1770 F_END,
1771};
1772
1773static struct rcg_clk mdp_vsync_clk_src = {
1774 .cmd_rcgr_reg = MDP_VSYNC_CMD_RCGR,
1775 .set_rate = set_rate_hid,
1776 .freq_tbl = ftbl_mdp_vsync_clk,
1777 .current_freq = &rcg_dummy_freq,
1778 .base = &virt_bases[MMSS_BASE],
1779 .c = {
1780 .dbg_name = "mdp_vsync_clk_src",
1781 .ops = &clk_ops_rcg,
1782 VDD_DIG_FMAX_MAP1(LOW, 19200000),
1783 CLK_INIT(mdp_vsync_clk_src.c),
1784 },
1785};
1786
1787static struct branch_clk bimc_gfx_clk = {
1788 .cbcr_reg = BIMC_GFX_CBCR,
1789 .has_sibling = 1,
1790 .base = &virt_bases[MMSS_BASE],
Vikram Mulukutla2dfa8b12013-01-15 18:17:10 -08001791 /* FIXME: Remove this once simulation is fixed. */
1792 .halt_check = DELAY,
Vikram Mulukutlab13abe42012-10-03 11:38:48 -07001793 .c = {
1794 .dbg_name = "bimc_gfx_clk",
1795 .ops = &clk_ops_branch,
1796 CLK_INIT(bimc_gfx_clk.c),
1797 },
1798};
1799
1800static struct branch_clk csi0_clk = {
1801 .cbcr_reg = CSI0_CBCR,
1802 .has_sibling = 1,
1803 .base = &virt_bases[MMSS_BASE],
1804 .c = {
1805 .parent = &csi0_clk_src.c,
1806 .dbg_name = "csi0_clk",
1807 .ops = &clk_ops_branch,
1808 CLK_INIT(csi0_clk.c),
1809 },
1810};
1811
1812static struct branch_clk csi0phy_clk = {
1813 .cbcr_reg = CSI0PHY_CBCR,
1814 .has_sibling = 1,
1815 .base = &virt_bases[MMSS_BASE],
1816 .c = {
1817 .parent = &csi0_clk_src.c,
1818 .dbg_name = "csi0phy_clk",
1819 .ops = &clk_ops_branch,
1820 CLK_INIT(csi0phy_clk.c),
1821 },
1822};
1823
1824static struct branch_clk csi0phytimer_clk = {
1825 .cbcr_reg = CSI0PHYTIMER_CBCR,
1826 .has_sibling = 0,
1827 .base = &virt_bases[MMSS_BASE],
1828 .c = {
1829 .parent = &csi0phytimer_clk_src.c,
1830 .dbg_name = "csi0phytimer_clk",
1831 .ops = &clk_ops_branch,
1832 CLK_INIT(csi0phytimer_clk.c),
1833 },
1834};
1835
1836static struct branch_clk csi0pix_clk = {
1837 .cbcr_reg = CSI0PIX_CBCR,
1838 .has_sibling = 1,
1839 .base = &virt_bases[MMSS_BASE],
1840 .c = {
1841 .parent = &csi0_clk_src.c,
1842 .dbg_name = "csi0pix_clk",
1843 .ops = &clk_ops_branch,
1844 CLK_INIT(csi0pix_clk.c),
1845 },
1846};
1847
1848static struct branch_clk csi0rdi_clk = {
1849 .cbcr_reg = CSI0RDI_CBCR,
1850 .has_sibling = 1,
1851 .base = &virt_bases[MMSS_BASE],
1852 .c = {
1853 .parent = &csi0_clk_src.c,
1854 .dbg_name = "csi0rdi_clk",
1855 .ops = &clk_ops_branch,
1856 CLK_INIT(csi0rdi_clk.c),
1857 },
1858};
1859
1860static struct branch_clk csi1_clk = {
1861 .cbcr_reg = CSI1_CBCR,
1862 .has_sibling = 1,
1863 .base = &virt_bases[MMSS_BASE],
1864 .c = {
1865 .parent = &csi1_clk_src.c,
1866 .dbg_name = "csi1_clk",
1867 .ops = &clk_ops_branch,
1868 CLK_INIT(csi1_clk.c),
1869 },
1870};
1871
1872static struct branch_clk csi1phy_clk = {
1873 .cbcr_reg = CSI1PHY_CBCR,
1874 .has_sibling = 1,
1875 .base = &virt_bases[MMSS_BASE],
1876 .c = {
1877 .parent = &csi1_clk_src.c,
1878 .dbg_name = "csi1phy_clk",
1879 .ops = &clk_ops_branch,
1880 CLK_INIT(csi1phy_clk.c),
1881 },
1882};
1883
1884static struct branch_clk csi1phytimer_clk = {
1885 .cbcr_reg = CSI1PHYTIMER_CBCR,
1886 .has_sibling = 0,
1887 .base = &virt_bases[MMSS_BASE],
1888 .c = {
1889 .parent = &csi1phytimer_clk_src.c,
1890 .dbg_name = "csi1phytimer_clk",
1891 .ops = &clk_ops_branch,
1892 CLK_INIT(csi1phytimer_clk.c),
1893 },
1894};
1895
1896static struct branch_clk csi1pix_clk = {
1897 .cbcr_reg = CSI1PIX_CBCR,
1898 .has_sibling = 1,
1899 .base = &virt_bases[MMSS_BASE],
1900 .c = {
Vikram Mulukutlaa1d5c142013-01-16 10:30:12 -08001901 .parent = &csi1_clk_src.c,
Vikram Mulukutlab13abe42012-10-03 11:38:48 -07001902 .dbg_name = "csi1pix_clk",
1903 .ops = &clk_ops_branch,
1904 CLK_INIT(csi1pix_clk.c),
1905 },
1906};
1907
1908static struct branch_clk csi1rdi_clk = {
1909 .cbcr_reg = CSI1RDI_CBCR,
1910 .has_sibling = 1,
1911 .base = &virt_bases[MMSS_BASE],
1912 .c = {
Vikram Mulukutlaa1d5c142013-01-16 10:30:12 -08001913 .parent = &csi1_clk_src.c,
Vikram Mulukutlab13abe42012-10-03 11:38:48 -07001914 .dbg_name = "csi1rdi_clk",
1915 .ops = &clk_ops_branch,
1916 CLK_INIT(csi1rdi_clk.c),
1917 },
1918};
1919
1920static struct branch_clk csi_ahb_clk = {
1921 .cbcr_reg = CSI_AHB_CBCR,
1922 .has_sibling = 1,
1923 .base = &virt_bases[MMSS_BASE],
1924 .c = {
1925 .dbg_name = "csi_ahb_clk",
1926 .ops = &clk_ops_branch,
1927 CLK_INIT(csi_ahb_clk.c),
1928 },
1929};
1930
1931static struct branch_clk csi_vfe_clk = {
1932 .cbcr_reg = CSI_VFE_CBCR,
1933 .has_sibling = 1,
1934 .base = &virt_bases[MMSS_BASE],
1935 .c = {
1936 .parent = &vfe_clk_src.c,
1937 .dbg_name = "csi_vfe_clk",
1938 .ops = &clk_ops_branch,
1939 CLK_INIT(csi_vfe_clk.c),
1940 },
1941};
1942
1943static struct branch_clk dsi_clk = {
1944 .cbcr_reg = DSI_CBCR,
1945 .has_sibling = 0,
1946 .base = &virt_bases[MMSS_BASE],
1947 .c = {
1948 .parent = &dsi_clk_src.c,
1949 .dbg_name = "dsi_clk",
1950 .ops = &clk_ops_branch,
1951 CLK_INIT(dsi_clk.c),
1952 },
1953};
1954
1955static struct branch_clk dsi_ahb_clk = {
1956 .cbcr_reg = DSI_AHB_CBCR,
1957 .has_sibling = 1,
1958 .base = &virt_bases[MMSS_BASE],
1959 .c = {
1960 .dbg_name = "dsi_ahb_clk",
1961 .ops = &clk_ops_branch,
1962 CLK_INIT(dsi_ahb_clk.c),
1963 },
1964};
1965
1966static struct branch_clk dsi_byte_clk = {
1967 .cbcr_reg = DSI_BYTE_CBCR,
1968 .has_sibling = 0,
1969 .base = &virt_bases[MMSS_BASE],
1970 .c = {
1971 .parent = &dsi_byte_clk_src.c,
1972 .dbg_name = "dsi_byte_clk",
1973 .ops = &clk_ops_branch,
1974 CLK_INIT(dsi_byte_clk.c),
1975 },
1976};
1977
1978static struct branch_clk dsi_esc_clk = {
1979 .cbcr_reg = DSI_ESC_CBCR,
1980 .has_sibling = 0,
1981 .base = &virt_bases[MMSS_BASE],
1982 .c = {
1983 .parent = &dsi_esc_clk_src.c,
1984 .dbg_name = "dsi_esc_clk",
1985 .ops = &clk_ops_branch,
1986 CLK_INIT(dsi_esc_clk.c),
1987 },
1988};
1989
1990static struct branch_clk dsi_pclk_clk = {
1991 .cbcr_reg = DSI_PCLK_CBCR,
1992 .has_sibling = 1,
1993 .base = &virt_bases[MMSS_BASE],
1994 .c = {
1995 .parent = &dsi_pclk_clk_src.c,
1996 .dbg_name = "dsi_pclk_clk",
1997 .ops = &clk_ops_branch,
1998 CLK_INIT(dsi_pclk_clk.c),
1999 },
2000};
2001
2002static struct branch_clk gmem_gfx3d_clk = {
2003 .cbcr_reg = GMEM_GFX3D_CBCR,
2004 .has_sibling = 1,
2005 .base = &virt_bases[MMSS_BASE],
2006 .c = {
2007 .parent = &gfx3d_clk_src.c,
2008 .dbg_name = "gmem_gfx3d_clk",
2009 .ops = &clk_ops_branch,
2010 CLK_INIT(gmem_gfx3d_clk.c),
2011 },
2012};
2013
2014static struct branch_clk mclk0_clk = {
2015 .cbcr_reg = MCLK0_CBCR,
2016 .has_sibling = 0,
2017 .base = &virt_bases[MMSS_BASE],
2018 .c = {
2019 .parent = &mclk0_clk_src.c,
2020 .dbg_name = "mclk0_clk",
2021 .ops = &clk_ops_branch,
2022 CLK_INIT(mclk0_clk.c),
2023 },
2024};
2025
2026static struct branch_clk mclk1_clk = {
2027 .cbcr_reg = MCLK1_CBCR,
2028 .has_sibling = 0,
2029 .base = &virt_bases[MMSS_BASE],
2030 .c = {
2031 .parent = &mclk1_clk_src.c,
2032 .dbg_name = "mclk1_clk",
2033 .ops = &clk_ops_branch,
2034 CLK_INIT(mclk1_clk.c),
2035 },
2036};
2037
2038static struct branch_clk mdp_ahb_clk = {
2039 .cbcr_reg = MDP_AHB_CBCR,
2040 .has_sibling = 1,
2041 .base = &virt_bases[MMSS_BASE],
2042 .c = {
2043 .dbg_name = "mdp_ahb_clk",
2044 .ops = &clk_ops_branch,
2045 CLK_INIT(mdp_ahb_clk.c),
2046 },
2047};
2048
2049static struct branch_clk mdp_axi_clk = {
2050 .cbcr_reg = MDP_AXI_CBCR,
Vikram Mulukutlab13abe42012-10-03 11:38:48 -07002051 .base = &virt_bases[MMSS_BASE],
Vikram Mulukutla2dfa8b12013-01-15 18:17:10 -08002052 /* FIXME: Remove this once simulation is fixed. */
2053 .halt_check = DELAY,
Vikram Mulukutlab13abe42012-10-03 11:38:48 -07002054 .c = {
Vikram Mulukutlae1e5c482013-01-28 14:43:20 -08002055 .parent = &mdp_axi_clk_src.c,
Vikram Mulukutlab13abe42012-10-03 11:38:48 -07002056 .dbg_name = "mdp_axi_clk",
2057 .ops = &clk_ops_branch,
2058 CLK_INIT(mdp_axi_clk.c),
2059 },
2060};
2061
2062static struct branch_clk mdp_dsi_clk = {
2063 .cbcr_reg = MDP_DSI_CBCR,
2064 .has_sibling = 1,
2065 .base = &virt_bases[MMSS_BASE],
2066 .c = {
2067 .parent = &dsi_pclk_clk_src.c,
2068 .dbg_name = "mdp_dsi_clk",
2069 .ops = &clk_ops_branch,
2070 CLK_INIT(mdp_dsi_clk.c),
2071 },
2072};
2073
2074static struct branch_clk mdp_lcdc_clk = {
2075 .cbcr_reg = MDP_LCDC_CBCR,
2076 .has_sibling = 1,
2077 .base = &virt_bases[MMSS_BASE],
2078 .c = {
2079 .parent = &dsi_pclk_clk_src.c,
2080 .dbg_name = "mdp_lcdc_clk",
2081 .ops = &clk_ops_branch,
2082 CLK_INIT(mdp_lcdc_clk.c),
2083 },
2084};
2085
2086static struct branch_clk mdp_vsync_clk = {
2087 .cbcr_reg = MDP_VSYNC_CBCR,
2088 .has_sibling = 0,
2089 .base = &virt_bases[MMSS_BASE],
2090 .c = {
2091 .parent = &mdp_vsync_clk_src.c,
2092 .dbg_name = "mdp_vsync_clk",
2093 .ops = &clk_ops_branch,
2094 CLK_INIT(mdp_vsync_clk.c),
2095 },
2096};
2097
2098static struct branch_clk mmss_misc_ahb_clk = {
2099 .cbcr_reg = MMSS_MISC_AHB_CBCR,
2100 .has_sibling = 1,
2101 .base = &virt_bases[MMSS_BASE],
2102 .c = {
2103 .dbg_name = "mmss_misc_ahb_clk",
2104 .ops = &clk_ops_branch,
2105 CLK_INIT(mmss_misc_ahb_clk.c),
2106 },
2107};
2108
2109static struct branch_clk mmss_mmssnoc_axi_clk = {
2110 .cbcr_reg = MMSS_MMSSNOC_AXI_CBCR,
2111 .has_sibling = 1,
2112 .base = &virt_bases[MMSS_BASE],
2113 .c = {
2114 .parent = &axi_clk_src.c,
2115 .dbg_name = "mmss_mmssnoc_axi_clk",
2116 .ops = &clk_ops_branch,
2117 CLK_INIT(mmss_mmssnoc_axi_clk.c),
2118 },
2119};
2120
2121static struct branch_clk mmss_s0_axi_clk = {
2122 .cbcr_reg = MMSS_S0_AXI_CBCR,
2123 .has_sibling = 0,
2124 .base = &virt_bases[MMSS_BASE],
2125 .c = {
Vikram Mulukutlae1e5c482013-01-28 14:43:20 -08002126 .parent = &mmssnoc_axi_clk_src.c,
Vikram Mulukutlab13abe42012-10-03 11:38:48 -07002127 .dbg_name = "mmss_s0_axi_clk",
2128 .ops = &clk_ops_branch,
2129 CLK_INIT(mmss_s0_axi_clk.c),
2130 .depends = &mmss_mmssnoc_axi_clk.c,
2131 },
2132};
2133
Vikram Mulukutlab13abe42012-10-03 11:38:48 -07002134static struct branch_clk mmss_mmssnoc_bto_ahb_clk = {
2135 .cbcr_reg = MMSS_MMSSNOC_BTO_AHB_CBCR,
2136 .has_sibling = 1,
2137 .base = &virt_bases[MMSS_BASE],
2138 .c = {
2139 .dbg_name = "mmss_mmssnoc_bto_ahb_clk",
2140 .ops = &clk_ops_branch,
2141 CLK_INIT(mmss_mmssnoc_bto_ahb_clk.c),
2142 },
2143};
2144
2145static struct branch_clk oxili_ahb_clk = {
2146 .cbcr_reg = OXILI_AHB_CBCR,
2147 .has_sibling = 1,
2148 .base = &virt_bases[MMSS_BASE],
2149 .c = {
2150 .dbg_name = "oxili_ahb_clk",
2151 .ops = &clk_ops_branch,
2152 CLK_INIT(oxili_ahb_clk.c),
2153 },
2154};
2155
2156static struct branch_clk oxili_gfx3d_clk = {
2157 .cbcr_reg = OXILI_GFX3D_CBCR,
2158 .has_sibling = 0,
2159 .base = &virt_bases[MMSS_BASE],
2160 .c = {
2161 .parent = &gfx3d_clk_src.c,
2162 .dbg_name = "oxili_gfx3d_clk",
2163 .ops = &clk_ops_branch,
2164 CLK_INIT(oxili_gfx3d_clk.c),
2165 },
2166};
2167
2168static struct branch_clk vfe_clk = {
2169 .cbcr_reg = VFE_CBCR,
2170 .has_sibling = 1,
2171 .base = &virt_bases[MMSS_BASE],
2172 .c = {
2173 .parent = &vfe_clk_src.c,
2174 .dbg_name = "vfe_clk",
2175 .ops = &clk_ops_branch,
2176 CLK_INIT(vfe_clk.c),
2177 },
2178};
2179
2180static struct branch_clk vfe_ahb_clk = {
2181 .cbcr_reg = VFE_AHB_CBCR,
2182 .has_sibling = 1,
2183 .base = &virt_bases[MMSS_BASE],
2184 .c = {
2185 .dbg_name = "vfe_ahb_clk",
2186 .ops = &clk_ops_branch,
2187 CLK_INIT(vfe_ahb_clk.c),
2188 },
2189};
2190
2191static struct branch_clk vfe_axi_clk = {
2192 .cbcr_reg = VFE_AXI_CBCR,
2193 .has_sibling = 1,
2194 .base = &virt_bases[MMSS_BASE],
Vikram Mulukutla2dfa8b12013-01-15 18:17:10 -08002195 /* FIXME: Remove this once simulation is fixed. */
2196 .halt_check = DELAY,
Vikram Mulukutlab13abe42012-10-03 11:38:48 -07002197 .c = {
2198 .parent = &axi_clk_src.c,
2199 .dbg_name = "vfe_axi_clk",
2200 .ops = &clk_ops_branch,
2201 CLK_INIT(vfe_axi_clk.c),
2202 },
2203};
2204
Vikram Mulukutlab13abe42012-10-03 11:38:48 -07002205static struct branch_clk q6ss_ahb_lfabif_clk = {
2206 .cbcr_reg = Q6SS_AHB_LFABIF_CBCR,
2207 .has_sibling = 1,
2208 .base = &virt_bases[LPASS_BASE],
2209 .c = {
2210 .dbg_name = "q6ss_ahb_lfabif_clk",
2211 .ops = &clk_ops_branch,
2212 CLK_INIT(q6ss_ahb_lfabif_clk.c),
2213 },
2214};
2215
2216static struct branch_clk q6ss_ahbm_clk = {
2217 .cbcr_reg = Q6SS_AHBM_CBCR,
2218 .has_sibling = 1,
2219 .base = &virt_bases[LPASS_BASE],
2220 .c = {
2221 .dbg_name = "q6ss_ahbm_clk",
2222 .ops = &clk_ops_branch,
2223 CLK_INIT(q6ss_ahbm_clk.c),
2224 },
2225};
2226
2227static struct branch_clk q6ss_xo_clk = {
2228 .cbcr_reg = Q6SS_XO_CBCR,
2229 .has_sibling = 1,
2230 .bcr_reg = LPASS_Q6SS_BCR,
2231 .base = &virt_bases[LPASS_BASE],
2232 .c = {
2233 .parent = &gcc_xo_clk_src.c,
2234 .dbg_name = "q6ss_xo_clk",
2235 .ops = &clk_ops_branch,
2236 CLK_INIT(q6ss_xo_clk.c),
2237 },
2238};
2239
Vikram Mulukutlab13abe42012-10-03 11:38:48 -07002240#ifdef CONFIG_DEBUG_FS
2241
2242struct measure_mux_entry {
2243 struct clk *c;
2244 int base;
2245 u32 debug_mux;
2246};
2247
2248static struct measure_mux_entry measure_mux[] = {
2249 { &snoc_clk.c, GCC_BASE, 0x0000},
2250 { &cnoc_clk.c, GCC_BASE, 0x0008},
2251 { &gcc_copss_smmu_ahb_clk.c, GCC_BASE, 0x000c},
2252 { &gcc_lpss_smmu_ahb_clk.c, GCC_BASE, 0x000d},
2253 { &pnoc_clk.c, GCC_BASE, 0x0010},
2254 { &gcc_mmss_noc_cfg_ahb_clk.c, GCC_BASE, 0x002a},
2255 { &gcc_mss_cfg_ahb_clk.c, GCC_BASE, 0x0030},
2256 { &gcc_mss_q6_bimc_axi_clk.c, GCC_BASE, 0x0031},
2257 { &gcc_usb_hs_system_clk.c, GCC_BASE, 0x0060},
2258 { &gcc_usb_hs_ahb_clk.c, GCC_BASE, 0x0061},
2259 { &gcc_usb2a_phy_sleep_clk.c, GCC_BASE, 0x0063},
2260 { &gcc_sdcc1_apps_clk.c, GCC_BASE, 0x0068},
2261 { &gcc_sdcc1_ahb_clk.c, GCC_BASE, 0x0069},
2262 { &gcc_sdcc2_apps_clk.c, GCC_BASE, 0x0070},
2263 { &gcc_sdcc2_ahb_clk.c, GCC_BASE, 0x0071},
2264 { &gcc_blsp1_ahb_clk.c, GCC_BASE, 0x0088},
2265 {&gcc_blsp1_qup1_spi_apps_clk.c, GCC_BASE, 0x008a},
2266 {&gcc_blsp1_qup1_i2c_apps_clk.c, GCC_BASE, 0x008b},
2267 { &gcc_blsp1_uart1_apps_clk.c, GCC_BASE, 0x008c},
2268 {&gcc_blsp1_qup2_spi_apps_clk.c, GCC_BASE, 0x008e},
2269 {&gcc_blsp1_qup2_i2c_apps_clk.c, GCC_BASE, 0x0090},
2270 { &gcc_blsp1_uart2_apps_clk.c, GCC_BASE, 0x0091},
2271 {&gcc_blsp1_qup3_spi_apps_clk.c, GCC_BASE, 0x0093},
2272 {&gcc_blsp1_qup3_i2c_apps_clk.c, GCC_BASE, 0x0094},
2273 { &gcc_blsp1_uart3_apps_clk.c, GCC_BASE, 0x0095},
2274 {&gcc_blsp1_qup4_spi_apps_clk.c, GCC_BASE, 0x0098},
2275 {&gcc_blsp1_qup4_i2c_apps_clk.c, GCC_BASE, 0x0099},
2276 { &gcc_blsp1_uart4_apps_clk.c, GCC_BASE, 0x009a},
2277 {&gcc_blsp1_qup5_spi_apps_clk.c, GCC_BASE, 0x009c},
2278 {&gcc_blsp1_qup5_i2c_apps_clk.c, GCC_BASE, 0x009d},
2279 { &gcc_blsp1_uart5_apps_clk.c, GCC_BASE, 0x009e},
2280 {&gcc_blsp1_qup6_spi_apps_clk.c, GCC_BASE, 0x00a1},
2281 {&gcc_blsp1_qup6_i2c_apps_clk.c, GCC_BASE, 0x00a2},
2282 { &gcc_blsp1_uart6_apps_clk.c, GCC_BASE, 0x00a3},
2283 { &gcc_pdm_ahb_clk.c, GCC_BASE, 0x00d0},
2284 { &gcc_pdm2_clk.c, GCC_BASE, 0x00d2},
2285 { &gcc_prng_ahb_clk.c, GCC_BASE, 0x00d8},
2286 { &gcc_boot_rom_ahb_clk.c, GCC_BASE, 0x00f8},
2287 { &gcc_ce1_clk.c, GCC_BASE, 0x0138},
2288 { &gcc_ce1_axi_clk.c, GCC_BASE, 0x0139},
2289 { &gcc_ce1_ahb_clk.c, GCC_BASE, 0x013a},
2290 { &gcc_xo_clk_src.c, GCC_BASE, 0x0149},
2291 { &bimc_clk.c, GCC_BASE, 0x0154},
2292 { &gcc_lpass_q6_axi_clk.c, GCC_BASE, 0x0160},
2293
Vikram Mulukutla82cb8442013-01-28 13:36:51 -08002294 { &mmssnoc_ahb_clk.c, MMSS_BASE, 0x0001},
Vikram Mulukutlab13abe42012-10-03 11:38:48 -07002295 { &mmss_misc_ahb_clk.c, MMSS_BASE, 0x0003},
2296 {&mmss_mmssnoc_axi_clk.c, MMSS_BASE, 0x0004},
2297 { &mmss_s0_axi_clk.c, MMSS_BASE, 0x0005},
2298 { &oxili_ahb_clk.c, MMSS_BASE, 0x0007},
2299 { &oxili_gfx3d_clk.c, MMSS_BASE, 0x0008},
2300 { &gmem_gfx3d_clk.c, MMSS_BASE, 0x0009},
2301 { &mdp_axi_clk.c, MMSS_BASE, 0x000a},
2302 { &mdp_vsync_clk.c, MMSS_BASE, 0x000b},
2303 { &mdp_ahb_clk.c, MMSS_BASE, 0x000c},
2304 { &dsi_pclk_clk.c, MMSS_BASE, 0x000d},
2305 { &mdp_dsi_clk.c, MMSS_BASE, 0x000e},
2306 { &mdp_lcdc_clk.c, MMSS_BASE, 0x000f},
2307 { &dsi_clk.c, MMSS_BASE, 0x0010},
2308 { &dsi_byte_clk.c, MMSS_BASE, 0x0011},
2309 { &dsi_esc_clk.c, MMSS_BASE, 0x0012},
2310 { &dsi_ahb_clk.c, MMSS_BASE, 0x0013},
2311 { &mclk0_clk.c, MMSS_BASE, 0x0015},
2312 { &mclk1_clk.c, MMSS_BASE, 0x0016},
2313 { &csi0phytimer_clk.c, MMSS_BASE, 0x0017},
2314 { &csi1phytimer_clk.c, MMSS_BASE, 0x0018},
2315 { &vfe_clk.c, MMSS_BASE, 0x0019},
2316 { &vfe_ahb_clk.c, MMSS_BASE, 0x001a},
2317 { &vfe_axi_clk.c, MMSS_BASE, 0x001b},
2318 { &csi_vfe_clk.c, MMSS_BASE, 0x001c},
2319 { &csi0_clk.c, MMSS_BASE, 0x001d},
2320 { &csi_ahb_clk.c, MMSS_BASE, 0x001e},
2321 { &csi0phy_clk.c, MMSS_BASE, 0x001f},
2322 { &csi0rdi_clk.c, MMSS_BASE, 0x0020},
2323 { &csi0pix_clk.c, MMSS_BASE, 0x0021},
2324 { &csi1_clk.c, MMSS_BASE, 0x0022},
2325 { &csi1phy_clk.c, MMSS_BASE, 0x0023},
2326 { &csi1rdi_clk.c, MMSS_BASE, 0x0024},
2327 { &csi1pix_clk.c, MMSS_BASE, 0x0025},
2328 { &bimc_gfx_clk.c, MMSS_BASE, 0x0032},
2329
Vikram Mulukutlab13abe42012-10-03 11:38:48 -07002330 { &q6ss_ahbm_clk.c, LPASS_BASE, 0x001d},
2331 { &q6ss_ahb_lfabif_clk.c, LPASS_BASE, 0x001e},
Vikram Mulukutlab13abe42012-10-03 11:38:48 -07002332 { &q6ss_xo_clk.c, LPASS_BASE, 0x002b},
Vikram Mulukutlab13abe42012-10-03 11:38:48 -07002333
Vikram Mulukutla4157cca2013-01-24 15:42:41 -08002334 {&apc0_m_clk, APCS_BASE, 0x10},
2335 {&apc1_m_clk, APCS_BASE, 0x11},
2336 {&apc2_m_clk, APCS_BASE, 0x12},
2337 {&apc3_m_clk, APCS_BASE, 0x13},
2338 {&l2_m_clk, APCS_BASE, 0x15},
2339
Vikram Mulukutlab13abe42012-10-03 11:38:48 -07002340 {&dummy_clk, N_BASES, 0x0000},
2341};
2342
2343#define GCC_DEBUG_CLK_CTL 0x1880
2344#define MMSS_DEBUG_CLK_CTL 0x0900
2345#define LPASS_DEBUG_CLK_CTL 0x29000
2346#define GLB_CLK_DIAG 0x001C
2347
2348static int measure_clk_set_parent(struct clk *c, struct clk *parent)
2349{
2350 struct measure_clk *clk = to_measure_clk(c);
2351 unsigned long flags;
2352 u32 regval, clk_sel, i;
2353
2354 if (!parent)
2355 return -EINVAL;
2356
2357 for (i = 0; i < (ARRAY_SIZE(measure_mux) - 1); i++)
2358 if (measure_mux[i].c == parent)
2359 break;
2360
2361 if (measure_mux[i].c == &dummy_clk)
2362 return -EINVAL;
2363
2364 spin_lock_irqsave(&local_clock_reg_lock, flags);
2365 /*
2366 * Program the test vector, measurement period (sample_ticks)
2367 * and scaling multiplier.
2368 */
2369 clk->sample_ticks = 0x10000;
2370 clk->multiplier = 1;
2371
2372 switch (measure_mux[i].base) {
2373
2374 case GCC_BASE:
2375 writel_relaxed(0, GCC_REG_BASE(GCC_DEBUG_CLK_CTL));
2376 clk_sel = measure_mux[i].debug_mux;
2377 break;
2378
2379 case MMSS_BASE:
2380 writel_relaxed(0, MMSS_REG_BASE(MMSS_DEBUG_CLK_CTL));
2381 clk_sel = 0x02C;
2382 regval = BVAL(11, 0, measure_mux[i].debug_mux);
2383 writel_relaxed(regval, MMSS_REG_BASE(MMSS_DEBUG_CLK_CTL));
2384
2385 /* Activate debug clock output */
2386 regval |= BIT(16);
2387 writel_relaxed(regval, MMSS_REG_BASE(MMSS_DEBUG_CLK_CTL));
2388 break;
2389
2390 case LPASS_BASE:
2391 writel_relaxed(0, LPASS_REG_BASE(LPASS_DEBUG_CLK_CTL));
2392 clk_sel = 0x161;
2393 regval = BVAL(11, 0, measure_mux[i].debug_mux);
2394 writel_relaxed(regval, LPASS_REG_BASE(LPASS_DEBUG_CLK_CTL));
2395
2396 /* Activate debug clock output */
2397 regval |= BIT(20);
2398 writel_relaxed(regval, LPASS_REG_BASE(LPASS_DEBUG_CLK_CTL));
2399 break;
2400
2401 case APCS_BASE:
2402 clk->multiplier = 4;
2403 clk_sel = 0x16A;
2404 regval = measure_mux[i].debug_mux;
2405 writel_relaxed(regval, APCS_REG_BASE(GLB_CLK_DIAG));
2406 break;
2407
2408 default:
2409 return -EINVAL;
2410 }
2411
2412 /* Set debug mux clock index */
2413 regval = BVAL(8, 0, clk_sel);
2414 writel_relaxed(regval, GCC_REG_BASE(GCC_DEBUG_CLK_CTL));
2415
2416 /* Activate debug clock output */
2417 regval |= BIT(16);
2418 writel_relaxed(regval, GCC_REG_BASE(GCC_DEBUG_CLK_CTL));
2419
2420 /* Make sure test vector is set before starting measurements. */
2421 mb();
2422 spin_unlock_irqrestore(&local_clock_reg_lock, flags);
2423
2424 return 0;
2425}
2426
2427#define CLOCK_FRQ_MEASURE_CTL 0x1884
2428#define CLOCK_FRQ_MEASURE_STATUS 0x1888
2429
2430/* Sample clock for 'ticks' reference clock ticks. */
2431static u32 run_measurement(unsigned ticks)
2432{
2433 /* Stop counters and set the XO4 counter start value. */
2434 writel_relaxed(ticks, GCC_REG_BASE(CLOCK_FRQ_MEASURE_CTL));
2435
2436 /* Wait for timer to become ready. */
2437 while ((readl_relaxed(GCC_REG_BASE(CLOCK_FRQ_MEASURE_STATUS)) &
2438 BIT(25)) != 0)
2439 cpu_relax();
2440
2441 /* Run measurement and wait for completion. */
2442 writel_relaxed(BIT(20)|ticks, GCC_REG_BASE(CLOCK_FRQ_MEASURE_CTL));
2443 while ((readl_relaxed(GCC_REG_BASE(CLOCK_FRQ_MEASURE_STATUS)) &
2444 BIT(25)) == 0)
2445 cpu_relax();
2446
2447 /* Return measured ticks. */
2448 return readl_relaxed(GCC_REG_BASE(CLOCK_FRQ_MEASURE_STATUS)) &
2449 BM(24, 0);
2450}
2451
2452#define GCC_XO_DIV4_CBCR 0x10C8
2453#define PLLTEST_PAD_CFG 0x188C
2454
2455/*
2456 * Perform a hardware rate measurement for a given clock.
2457 * FOR DEBUG USE ONLY: Measurements take ~15 ms!
2458 */
2459static unsigned long measure_clk_get_rate(struct clk *c)
2460{
2461 unsigned long flags;
2462 u32 gcc_xo4_reg_backup;
2463 u64 raw_count_short, raw_count_full;
2464 struct measure_clk *clk = to_measure_clk(c);
2465 unsigned ret;
2466
2467 ret = clk_prepare_enable(&gcc_xo_clk_src.c);
2468 if (ret) {
2469 pr_warning("CXO clock failed to enable. Can't measure\n");
2470 return 0;
2471 }
2472
2473 spin_lock_irqsave(&local_clock_reg_lock, flags);
2474
2475 /* Enable CXO/4 and RINGOSC branch. */
2476 gcc_xo4_reg_backup = readl_relaxed(GCC_REG_BASE(GCC_XO_DIV4_CBCR));
2477 writel_relaxed(0x1, GCC_REG_BASE(GCC_XO_DIV4_CBCR));
2478
2479 /*
2480 * The ring oscillator counter will not reset if the measured clock
2481 * is not running. To detect this, run a short measurement before
2482 * the full measurement. If the raw results of the two are the same
2483 * then the clock must be off.
2484 */
2485
2486 /* Run a short measurement. (~1 ms) */
2487 raw_count_short = run_measurement(0x1000);
2488 /* Run a full measurement. (~14 ms) */
2489 raw_count_full = run_measurement(clk->sample_ticks);
2490
2491 writel_relaxed(gcc_xo4_reg_backup, GCC_REG_BASE(GCC_XO_DIV4_CBCR));
2492
2493 /* Return 0 if the clock is off. */
2494 if (raw_count_full == raw_count_short) {
2495 ret = 0;
2496 } else {
2497 /* Compute rate in Hz. */
2498 raw_count_full = ((raw_count_full * 10) + 15) * 4800000;
2499 do_div(raw_count_full, ((clk->sample_ticks * 10) + 35));
2500 ret = (raw_count_full * clk->multiplier);
2501 }
2502
2503 writel_relaxed(0x51A00, GCC_REG_BASE(PLLTEST_PAD_CFG));
2504 spin_unlock_irqrestore(&local_clock_reg_lock, flags);
2505
2506 clk_disable_unprepare(&gcc_xo_clk_src.c);
2507
2508 return ret;
2509}
2510#else /* !CONFIG_DEBUG_FS */
2511static int measure_clk_set_parent(struct clk *clk, struct clk *parent)
2512{
2513 return -EINVAL;
2514}
2515
2516static unsigned long measure_clk_get_rate(struct clk *clk)
2517{
2518 return 0;
2519}
2520#endif /* CONFIG_DEBUG_FS */
2521
2522static struct clk_ops clk_ops_measure = {
2523 .set_parent = measure_clk_set_parent,
2524 .get_rate = measure_clk_get_rate,
2525};
2526
2527static struct measure_clk measure_clk = {
2528 .c = {
2529 .dbg_name = "measure_clk",
2530 .ops = &clk_ops_measure,
2531 CLK_INIT(measure_clk.c),
2532 },
2533 .multiplier = 1,
2534};
2535
Syed Rameez Mustafa3971c142013-01-09 19:04:53 -08002536static struct clk_lookup msm_clocks_8610[] = {
Vikram Mulukutlab13abe42012-10-03 11:38:48 -07002537 CLK_LOOKUP("xo", gcc_xo_clk_src.c, "msm_otg"),
2538 CLK_LOOKUP("xo", gcc_xo_clk_src.c, "fe200000.qcom,lpass"),
Vikram Mulukutlacee3bcf2013-03-13 15:55:45 -07002539
2540 CLK_LOOKUP("xo", gcc_xo_clk_src.c, "fc880000.qcom,mss"),
2541 CLK_LOOKUP("bus_clk", gcc_mss_q6_bimc_axi_clk.c, "fc880000.qcom,mss"),
2542 CLK_LOOKUP("iface_clk", gcc_mss_cfg_ahb_clk.c, "fc880000.qcom,mss"),
2543 CLK_LOOKUP("mem_clk", gcc_boot_rom_ahb_clk.c, "fc880000.qcom,mss"),
2544
Vikram Mulukutlab13abe42012-10-03 11:38:48 -07002545 CLK_LOOKUP("xo", gcc_xo_clk_src.c, "pil-mba"),
2546 CLK_LOOKUP("xo", gcc_xo_clk_src.c, "fb000000.qcom,wcnss-wlan"),
Vikram Mulukutla381df182013-01-28 11:39:51 -08002547 CLK_LOOKUP("xo", gcc_xo_clk_src.c, "fb21b000.qcom,pronto"),
Vikram Mulukutlab13abe42012-10-03 11:38:48 -07002548 CLK_LOOKUP("measure", measure_clk.c, "debug"),
2549
2550 CLK_LOOKUP("iface_clk", gcc_blsp1_ahb_clk.c, "f991f000.serial"),
2551 CLK_LOOKUP("core_clk", gcc_blsp1_uart3_apps_clk.c, "f991f000.serial"),
2552
2553 CLK_LOOKUP("dfab_clk", pnoc_sps_clk.c, "msm_sps"),
2554 CLK_LOOKUP("bus_clk", pnoc_qseecom_clk.c, "qseecom"),
2555
2556 CLK_LOOKUP("bus_clk", snoc_clk.c, ""),
2557 CLK_LOOKUP("bus_clk", pnoc_clk.c, ""),
2558 CLK_LOOKUP("bus_clk", cnoc_clk.c, ""),
2559 CLK_LOOKUP("mem_clk", bimc_clk.c, ""),
2560 CLK_LOOKUP("bus_clk", snoc_a_clk.c, ""),
2561 CLK_LOOKUP("bus_clk", pnoc_a_clk.c, ""),
2562 CLK_LOOKUP("bus_clk", cnoc_a_clk.c, ""),
2563 CLK_LOOKUP("mem_clk", bimc_a_clk.c, ""),
2564
2565 CLK_LOOKUP("bus_clk", cnoc_msmbus_clk.c, "msm_config_noc"),
2566 CLK_LOOKUP("bus_a_clk", cnoc_msmbus_a_clk.c, "msm_config_noc"),
2567 CLK_LOOKUP("bus_clk", snoc_msmbus_clk.c, "msm_sys_noc"),
2568 CLK_LOOKUP("bus_a_clk", snoc_msmbus_a_clk.c, "msm_sys_noc"),
2569 CLK_LOOKUP("bus_clk", pnoc_msmbus_clk.c, "msm_periph_noc"),
2570 CLK_LOOKUP("bus_a_clk", pnoc_msmbus_a_clk.c, "msm_periph_noc"),
2571 CLK_LOOKUP("mem_clk", bimc_msmbus_clk.c, "msm_bimc"),
2572 CLK_LOOKUP("mem_a_clk", bimc_msmbus_a_clk.c, "msm_bimc"),
2573 CLK_LOOKUP("mem_clk", bimc_acpu_a_clk.c, ""),
Gagan Mac125029b2013-03-07 17:24:27 -07002574 CLK_LOOKUP("bus_clk", mmss_s0_axi_clk.c, "msm_mmss_noc"),
2575 CLK_LOOKUP("bus_a_clk", mmss_s0_axi_clk.c, "msm_mmss_noc"),
Vikram Mulukutlab13abe42012-10-03 11:38:48 -07002576
Aparna Das0f5a6ea2013-03-06 15:28:08 -08002577 /* CoreSight clocks */
2578 CLK_LOOKUP("core_clk", qdss_clk.c, "fc326000.tmc"),
2579 CLK_LOOKUP("core_clk", qdss_clk.c, "fc320000.tpiu"),
2580 CLK_LOOKUP("core_clk", qdss_clk.c, "fc324000.replicator"),
2581 CLK_LOOKUP("core_clk", qdss_clk.c, "fc325000.tmc"),
2582 CLK_LOOKUP("core_clk", qdss_clk.c, "fc323000.funnel"),
2583 CLK_LOOKUP("core_clk", qdss_clk.c, "fc321000.funnel"),
2584 CLK_LOOKUP("core_clk", qdss_clk.c, "fc322000.funnel"),
2585 CLK_LOOKUP("core_clk", qdss_clk.c, "fc355000.funnel"),
2586 CLK_LOOKUP("core_clk", qdss_clk.c, "fc302000.stm"),
2587 CLK_LOOKUP("core_clk", qdss_clk.c, "fc34c000.etm"),
2588 CLK_LOOKUP("core_clk", qdss_clk.c, "fc34d000.etm"),
2589 CLK_LOOKUP("core_clk", qdss_clk.c, "fc34e000.etm"),
2590 CLK_LOOKUP("core_clk", qdss_clk.c, "fc34f000.etm"),
2591 CLK_LOOKUP("core_clk", qdss_clk.c, "fc301000.csr"),
2592 CLK_LOOKUP("core_clk", qdss_clk.c, "fc310000.cti"),
2593 CLK_LOOKUP("core_clk", qdss_clk.c, "fc311000.cti"),
2594 CLK_LOOKUP("core_clk", qdss_clk.c, "fc312000.cti"),
2595 CLK_LOOKUP("core_clk", qdss_clk.c, "fc313000.cti"),
2596 CLK_LOOKUP("core_clk", qdss_clk.c, "fc314000.cti"),
2597 CLK_LOOKUP("core_clk", qdss_clk.c, "fc315000.cti"),
2598 CLK_LOOKUP("core_clk", qdss_clk.c, "fc316000.cti"),
2599 CLK_LOOKUP("core_clk", qdss_clk.c, "fc317000.cti"),
2600 CLK_LOOKUP("core_clk", qdss_clk.c, "fc318000.cti"),
2601 CLK_LOOKUP("core_clk", qdss_clk.c, "fc351000.cti"),
2602 CLK_LOOKUP("core_clk", qdss_clk.c, "fc352000.cti"),
2603 CLK_LOOKUP("core_clk", qdss_clk.c, "fc353000.cti"),
2604 CLK_LOOKUP("core_clk", qdss_clk.c, "fc354000.cti"),
Vikram Mulukutlab13abe42012-10-03 11:38:48 -07002605
Aparna Das0f5a6ea2013-03-06 15:28:08 -08002606
2607 CLK_LOOKUP("core_a_clk", qdss_a_clk.c, "fc326000.tmc"),
2608 CLK_LOOKUP("core_a_clk", qdss_a_clk.c, "fc320000.tpiu"),
2609 CLK_LOOKUP("core_a_clk", qdss_a_clk.c, "fc324000.replicator"),
2610 CLK_LOOKUP("core_a_clk", qdss_a_clk.c, "fc325000.tmc"),
2611 CLK_LOOKUP("core_a_clk", qdss_a_clk.c, "fc323000.funnel"),
2612 CLK_LOOKUP("core_a_clk", qdss_a_clk.c, "fc321000.funnel"),
2613 CLK_LOOKUP("core_a_clk", qdss_a_clk.c, "fc322000.funnel"),
2614 CLK_LOOKUP("core_a_clk", qdss_a_clk.c, "fc355000.funnel"),
2615 CLK_LOOKUP("core_a_clk", qdss_a_clk.c, "fc302000.stm"),
2616 CLK_LOOKUP("core_a_clk", qdss_a_clk.c, "fc34c000.etm"),
2617 CLK_LOOKUP("core_a_clk", qdss_a_clk.c, "fc34d000.etm"),
2618 CLK_LOOKUP("core_a_clk", qdss_a_clk.c, "fc34e000.etm"),
2619 CLK_LOOKUP("core_a_clk", qdss_a_clk.c, "fc34f000.etm"),
2620 CLK_LOOKUP("core_a_clk", qdss_a_clk.c, "fc301000.csr"),
2621 CLK_LOOKUP("core_a_clk", qdss_a_clk.c, "fc310000.cti"),
2622 CLK_LOOKUP("core_a_clk", qdss_a_clk.c, "fc311000.cti"),
2623 CLK_LOOKUP("core_a_clk", qdss_a_clk.c, "fc312000.cti"),
2624 CLK_LOOKUP("core_a_clk", qdss_a_clk.c, "fc313000.cti"),
2625 CLK_LOOKUP("core_a_clk", qdss_a_clk.c, "fc314000.cti"),
2626 CLK_LOOKUP("core_a_clk", qdss_a_clk.c, "fc315000.cti"),
2627 CLK_LOOKUP("core_a_clk", qdss_a_clk.c, "fc316000.cti"),
2628 CLK_LOOKUP("core_a_clk", qdss_a_clk.c, "fc317000.cti"),
2629 CLK_LOOKUP("core_a_clk", qdss_a_clk.c, "fc318000.cti"),
2630 CLK_LOOKUP("core_a_clk", qdss_a_clk.c, "fc351000.cti"),
2631 CLK_LOOKUP("core_a_clk", qdss_a_clk.c, "fc352000.cti"),
2632 CLK_LOOKUP("core_a_clk", qdss_a_clk.c, "fc353000.cti"),
2633 CLK_LOOKUP("core_a_clk", qdss_a_clk.c, "fc354000.cti"),
2634
2635
Vikram Mulukutlab13abe42012-10-03 11:38:48 -07002636
2637 CLK_LOOKUP("core_clk_src", blsp1_qup1_spi_apps_clk_src.c, ""),
2638 CLK_LOOKUP("core_clk_src", blsp1_qup2_spi_apps_clk_src.c, ""),
2639 CLK_LOOKUP("core_clk_src", blsp1_qup3_spi_apps_clk_src.c, ""),
2640 CLK_LOOKUP("core_clk_src", blsp1_qup4_spi_apps_clk_src.c, ""),
2641 CLK_LOOKUP("core_clk_src", blsp1_qup5_spi_apps_clk_src.c, ""),
2642 CLK_LOOKUP("core_clk_src", blsp1_qup6_spi_apps_clk_src.c, ""),
2643 CLK_LOOKUP("core_clk_src", blsp1_uart1_apps_clk_src.c, ""),
2644 CLK_LOOKUP("core_clk_src", blsp1_uart2_apps_clk_src.c, ""),
2645 CLK_LOOKUP("core_clk_src", blsp1_uart3_apps_clk_src.c, ""),
2646 CLK_LOOKUP("core_clk_src", blsp1_uart4_apps_clk_src.c, ""),
2647 CLK_LOOKUP("core_clk_src", blsp1_uart5_apps_clk_src.c, ""),
2648 CLK_LOOKUP("core_clk_src", blsp1_uart6_apps_clk_src.c, ""),
2649 CLK_LOOKUP("core_clk_src", ce1_clk_src.c, ""),
2650 CLK_LOOKUP("core_clk_src", gp1_clk_src.c, ""),
2651 CLK_LOOKUP("core_clk_src", gp2_clk_src.c, ""),
2652 CLK_LOOKUP("core_clk_src", gp3_clk_src.c, ""),
2653 CLK_LOOKUP("core_clk_src", pdm2_clk_src.c, ""),
2654 CLK_LOOKUP("core_clk_src", sdcc1_apps_clk_src.c, ""),
2655 CLK_LOOKUP("core_clk_src", sdcc2_apps_clk_src.c, ""),
2656 CLK_LOOKUP("core_clk_src", usb_hs_system_clk_src.c, ""),
Gilad Avidovf84f2792013-01-31 13:26:39 -07002657 CLK_LOOKUP("iface_clk", gcc_blsp1_ahb_clk.c, "f9925000.i2c"),
Gilad Avidovf58f1832013-01-09 17:31:28 -07002658 CLK_LOOKUP("iface_clk", gcc_blsp1_ahb_clk.c, "f9923000.spi"),
Vikram Mulukutlab13abe42012-10-03 11:38:48 -07002659 CLK_LOOKUP("core_clk", gcc_blsp1_qup1_i2c_apps_clk.c, ""),
Gilad Avidovf58f1832013-01-09 17:31:28 -07002660 CLK_LOOKUP("core_clk", gcc_blsp1_qup1_spi_apps_clk.c, "f9923000.spi"),
Vikram Mulukutlab13abe42012-10-03 11:38:48 -07002661 CLK_LOOKUP("core_clk", gcc_blsp1_qup2_i2c_apps_clk.c, ""),
2662 CLK_LOOKUP("core_clk", gcc_blsp1_qup2_spi_apps_clk.c, ""),
Gilad Avidovf84f2792013-01-31 13:26:39 -07002663 CLK_LOOKUP("core_clk", gcc_blsp1_qup3_i2c_apps_clk.c, "f9925000.i2c"),
Vikram Mulukutlab13abe42012-10-03 11:38:48 -07002664 CLK_LOOKUP("core_clk", gcc_blsp1_qup3_spi_apps_clk.c, ""),
2665 CLK_LOOKUP("core_clk", gcc_blsp1_qup4_i2c_apps_clk.c, ""),
2666 CLK_LOOKUP("core_clk", gcc_blsp1_qup4_spi_apps_clk.c, ""),
2667 CLK_LOOKUP("core_clk", gcc_blsp1_qup5_i2c_apps_clk.c, ""),
2668 CLK_LOOKUP("core_clk", gcc_blsp1_qup5_spi_apps_clk.c, ""),
2669 CLK_LOOKUP("core_clk", gcc_blsp1_qup6_i2c_apps_clk.c, ""),
2670 CLK_LOOKUP("core_clk", gcc_blsp1_qup6_spi_apps_clk.c, ""),
2671 CLK_LOOKUP("core_clk", gcc_blsp1_uart1_apps_clk.c, ""),
2672 CLK_LOOKUP("core_clk", gcc_blsp1_uart2_apps_clk.c, ""),
2673 CLK_LOOKUP("core_clk", gcc_blsp1_uart3_apps_clk.c, ""),
2674 CLK_LOOKUP("core_clk", gcc_blsp1_uart4_apps_clk.c, ""),
2675 CLK_LOOKUP("core_clk", gcc_blsp1_uart5_apps_clk.c, ""),
2676 CLK_LOOKUP("core_clk", gcc_blsp1_uart6_apps_clk.c, ""),
2677 CLK_LOOKUP("iface_clk", gcc_boot_rom_ahb_clk.c, ""),
2678 CLK_LOOKUP("iface_clk", gcc_ce1_ahb_clk.c, ""),
2679 CLK_LOOKUP("core_clk", gcc_ce1_axi_clk.c, ""),
2680 CLK_LOOKUP("core_clk", gcc_ce1_clk.c, ""),
2681 CLK_LOOKUP("iface_clk", gcc_copss_smmu_ahb_clk.c, ""),
2682 CLK_LOOKUP("iface_clk", gcc_lpss_smmu_ahb_clk.c, ""),
2683 CLK_LOOKUP("core_clk", gcc_gp1_clk.c, ""),
2684 CLK_LOOKUP("core_clk", gcc_gp2_clk.c, ""),
2685 CLK_LOOKUP("core_clk", gcc_gp3_clk.c, ""),
2686 CLK_LOOKUP("core_clk", gcc_lpass_q6_axi_clk.c, ""),
2687 CLK_LOOKUP("iface_clk", gcc_mss_cfg_ahb_clk.c, ""),
2688 CLK_LOOKUP("core_clk", gcc_mss_q6_bimc_axi_clk.c, ""),
2689 CLK_LOOKUP("core_clk", gcc_pdm2_clk.c, ""),
2690 CLK_LOOKUP("iface_clk", gcc_pdm_ahb_clk.c, ""),
2691 CLK_LOOKUP("iface_clk", gcc_prng_ahb_clk.c, ""),
2692 CLK_LOOKUP("iface_clk", gcc_sdcc1_ahb_clk.c, "msm_sdcc.1"),
2693 CLK_LOOKUP("core_clk", gcc_sdcc1_apps_clk.c, "msm_sdcc.1"),
2694 CLK_LOOKUP("iface_clk", gcc_sdcc2_ahb_clk.c, "msm_sdcc.2"),
2695 CLK_LOOKUP("core_clk", gcc_sdcc2_apps_clk.c, "msm_sdcc.2"),
2696 CLK_LOOKUP("core_clk", gcc_usb2a_phy_sleep_clk.c, ""),
2697 CLK_LOOKUP("iface_clk", gcc_usb_hs_ahb_clk.c, "f9a55000.usb"),
2698 CLK_LOOKUP("core_clk", gcc_usb_hs_system_clk.c, "f9a55000.usb"),
2699
2700 CLK_LOOKUP("core_clk_src", csi0_clk_src.c, ""),
2701 CLK_LOOKUP("core_clk_src", axi_clk_src.c, ""),
Vikram Mulukutlae1e5c482013-01-28 14:43:20 -08002702 CLK_LOOKUP("", mdp_axi_clk_src.c, ""),
2703 CLK_LOOKUP("", mmssnoc_axi_clk_src.c, ""),
Vikram Mulukutlab13abe42012-10-03 11:38:48 -07002704 CLK_LOOKUP("core_clk_src", dsi_pclk_clk_src.c, ""),
2705 CLK_LOOKUP("core_clk_src", gfx3d_clk_src.c, ""),
2706 CLK_LOOKUP("core_clk_src", vfe_clk_src.c, ""),
2707 CLK_LOOKUP("core_clk_src", csi1_clk_src.c, ""),
2708 CLK_LOOKUP("core_clk_src", csi0phytimer_clk_src.c, ""),
2709 CLK_LOOKUP("core_clk_src", csi1phytimer_clk_src.c, ""),
2710 CLK_LOOKUP("core_clk_src", dsi_clk_src.c, ""),
2711 CLK_LOOKUP("core_clk_src", dsi_byte_clk_src.c, ""),
2712 CLK_LOOKUP("core_clk_src", dsi_esc_clk_src.c, ""),
2713 CLK_LOOKUP("core_clk_src", mclk0_clk_src.c, ""),
2714 CLK_LOOKUP("core_clk_src", mclk1_clk_src.c, ""),
2715 CLK_LOOKUP("core_clk_src", mdp_vsync_clk_src.c, ""),
2716
2717 CLK_LOOKUP("core_clk", bimc_gfx_clk.c, ""),
2718 CLK_LOOKUP("core_clk", csi0_clk.c, ""),
2719 CLK_LOOKUP("core_clk", csi0phy_clk.c, ""),
2720 CLK_LOOKUP("core_clk", csi0phytimer_clk.c, ""),
2721 CLK_LOOKUP("core_clk", csi0pix_clk.c, ""),
2722 CLK_LOOKUP("core_clk", csi0rdi_clk.c, ""),
2723 CLK_LOOKUP("core_clk", csi1_clk.c, ""),
2724 CLK_LOOKUP("core_clk", csi1phy_clk.c, ""),
2725 CLK_LOOKUP("core_clk", csi1phytimer_clk.c, ""),
2726 CLK_LOOKUP("core_clk", csi1pix_clk.c, ""),
2727 CLK_LOOKUP("core_clk", csi1rdi_clk.c, ""),
2728 CLK_LOOKUP("core_clk", csi_ahb_clk.c, ""),
2729 CLK_LOOKUP("core_clk", csi_vfe_clk.c, ""),
2730 CLK_LOOKUP("core_clk", dsi_clk.c, ""),
2731 CLK_LOOKUP("core_clk", dsi_ahb_clk.c, ""),
2732 CLK_LOOKUP("core_clk", dsi_byte_clk.c, ""),
2733 CLK_LOOKUP("core_clk", dsi_esc_clk.c, ""),
2734 CLK_LOOKUP("core_clk", dsi_pclk_clk.c, ""),
2735 CLK_LOOKUP("core_clk", gmem_gfx3d_clk.c, ""),
2736 CLK_LOOKUP("core_clk", mclk0_clk.c, ""),
2737 CLK_LOOKUP("core_clk", mclk1_clk.c, ""),
2738 CLK_LOOKUP("core_clk", mdp_ahb_clk.c, ""),
2739 CLK_LOOKUP("core_clk", mdp_axi_clk.c, ""),
2740 CLK_LOOKUP("core_clk", mdp_dsi_clk.c, ""),
2741 CLK_LOOKUP("core_clk", mdp_lcdc_clk.c, ""),
2742 CLK_LOOKUP("core_clk", mdp_vsync_clk.c, ""),
2743 CLK_LOOKUP("core_clk", mmss_misc_ahb_clk.c, ""),
2744 CLK_LOOKUP("core_clk", mmss_s0_axi_clk.c, ""),
Vikram Mulukutlab13abe42012-10-03 11:38:48 -07002745 CLK_LOOKUP("core_clk", mmss_mmssnoc_bto_ahb_clk.c, ""),
2746 CLK_LOOKUP("core_clk", mmss_mmssnoc_axi_clk.c, ""),
2747 CLK_LOOKUP("core_clk", vfe_clk.c, ""),
2748 CLK_LOOKUP("core_clk", vfe_ahb_clk.c, ""),
2749 CLK_LOOKUP("core_clk", vfe_axi_clk.c, ""),
2750
2751 CLK_LOOKUP("core_clk", oxili_gfx3d_clk.c, "fdc00000.qcom,kgsl-3d0"),
2752 CLK_LOOKUP("iface_clk", oxili_ahb_clk.c, "fdc00000.qcom,kgsl-3d0"),
2753 CLK_LOOKUP("mem_iface_clk", bimc_gfx_clk.c, "fdc00000.qcom,kgsl-3d0"),
2754 CLK_LOOKUP("mem_clk", gmem_gfx3d_clk.c, "fdc00000.qcom,kgsl-3d0"),
2755
2756 CLK_LOOKUP("iface_clk", vfe_ahb_clk.c, "fd890000.qcom,iommu"),
2757 CLK_LOOKUP("core_clk", vfe_axi_clk.c, "fd890000.qcom,iommu"),
2758 CLK_LOOKUP("iface_clk", mdp_ahb_clk.c, "fd860000.qcom,iommu"),
2759 CLK_LOOKUP("core_clk", mdp_axi_clk.c, "fd860000.qcom,iommu"),
2760 CLK_LOOKUP("iface_clk", mdp_ahb_clk.c, "fd870000.qcom,iommu"),
2761 CLK_LOOKUP("core_clk", mdp_axi_clk.c, "fd870000.qcom,iommu"),
2762 CLK_LOOKUP("iface_clk", oxili_ahb_clk.c, "fd880000.qcom,iommu"),
2763 CLK_LOOKUP("core_clk", bimc_gfx_clk.c, "fd880000.qcom,iommu"),
2764 CLK_LOOKUP("iface_clk", gcc_lpss_smmu_ahb_clk.c, "fd000000.qcom,iommu"),
2765 CLK_LOOKUP("core_clk", gcc_lpass_q6_axi_clk.c, "fd000000.qcom,iommu"),
2766 CLK_LOOKUP("iface_clk", gcc_copss_smmu_ahb_clk.c,
2767 "fd010000.qcom,iommu"),
2768 CLK_LOOKUP("core_clk", pnoc_iommu_clk.c, "fd010000.qcom,iommu"),
2769
Vikram Mulukutlab13abe42012-10-03 11:38:48 -07002770 CLK_LOOKUP("core_clk", q6ss_xo_clk.c, "fe200000.qcom,lpass"),
2771 CLK_LOOKUP("bus_clk", gcc_lpass_q6_axi_clk.c, "fe200000.qcom,lpass"),
2772 CLK_LOOKUP("iface_clk", q6ss_ahb_lfabif_clk.c, "fe200000.qcom,lpass"),
2773 CLK_LOOKUP("reg_clk", q6ss_ahbm_clk.c, "fe200000.qcom,lpass"),
Vikram Mulukutla4157cca2013-01-24 15:42:41 -08002774
2775 CLK_LOOKUP("xo", gcc_xo_a_clk_src.c, "f9011050.qcom,acpuclk"),
2776 CLK_LOOKUP("gpll0", gpll0_ao_clk_src.c, "f9011050.qcom,acpuclk"),
2777 CLK_LOOKUP("a7sspll", a7sspll.c, "f9011050.qcom,acpuclk"),
2778
2779 CLK_LOOKUP("measure_clk", apc0_m_clk, ""),
2780 CLK_LOOKUP("measure_clk", apc1_m_clk, ""),
2781 CLK_LOOKUP("measure_clk", apc2_m_clk, ""),
2782 CLK_LOOKUP("measure_clk", apc3_m_clk, ""),
2783 CLK_LOOKUP("measure_clk", l2_m_clk, ""),
Vikram Mulukutlab13abe42012-10-03 11:38:48 -07002784};
2785
Syed Rameez Mustafa3971c142013-01-09 19:04:53 -08002786static struct clk_lookup msm_clocks_8610_rumi[] = {
Vikram Mulukutlab13abe42012-10-03 11:38:48 -07002787 CLK_DUMMY("core_clk", BLSP1_UART_CLK, "f991f000.serial", OFF),
2788 CLK_DUMMY("iface_clk", BLSP1_UART_CLK, "f991f000.serial", OFF),
2789 CLK_DUMMY("iface_clk", HSUSB_IFACE_CLK, "f9a55000.usb", OFF),
2790 CLK_DUMMY("core_clk", HSUSB_CORE_CLK, "f9a55000.usb", OFF),
2791 CLK_DUMMY("iface_clk", NULL, "msm_sdcc.1", OFF),
2792 CLK_DUMMY("core_clk", NULL, "msm_sdcc.1", OFF),
2793 CLK_DUMMY("bus_clk", NULL, "msm_sdcc.1", OFF),
2794 CLK_DUMMY("iface_clk", NULL, "msm_sdcc.2", OFF),
2795 CLK_DUMMY("core_clk", NULL, "msm_sdcc.2", OFF),
2796 CLK_DUMMY("bus_clk", NULL, "msm_sdcc.2", OFF),
2797 CLK_DUMMY("dfab_clk", DFAB_CLK, "msm_sps", OFF),
2798 CLK_DUMMY("iface_clk", NULL, "fd890000.qcom,iommu", OFF),
2799 CLK_DUMMY("core_clk", NULL, "fd890000.qcom,iommu", OFF),
2800 CLK_DUMMY("iface_clk", NULL, "fd860000.qcom,iommu", OFF),
2801 CLK_DUMMY("core_clk", NULL, "fd860000.qcom,iommu", OFF),
2802 CLK_DUMMY("iface_clk", NULL, "fd870000.qcom,iommu", OFF),
2803 CLK_DUMMY("core_clk", NULL, "fd870000.qcom,iommu", OFF),
2804 CLK_DUMMY("iface_clk", NULL, "fd880000.qcom,iommu", OFF),
2805 CLK_DUMMY("core_clk", NULL, "fd880000.qcom,iommu", OFF),
2806 CLK_DUMMY("iface_clk", NULL, "fd000000.qcom,iommu", OFF),
2807 CLK_DUMMY("core_clk", NULL, "fd000000.qcom,iommu", OFF),
2808 CLK_DUMMY("iface_clk", NULL, "fd010000.qcom,iommu", OFF),
2809 CLK_DUMMY("core_clk", NULL, "fd010000.qcom,iommu", OFF),
Vikram Mulukutla4157cca2013-01-24 15:42:41 -08002810 CLK_DUMMY("xo", NULL, "f9011050.qcom,acpuclk", OFF),
2811 CLK_DUMMY("gpll0", NULL, "f9011050.qcom,acpuclk", OFF),
2812 CLK_DUMMY("a7sspll", NULL, "f9011050.qcom,acpuclk", OFF),
Vikram Mulukutlab13abe42012-10-03 11:38:48 -07002813};
2814
Syed Rameez Mustafa3971c142013-01-09 19:04:53 -08002815struct clock_init_data msm8610_rumi_clock_init_data __initdata = {
2816 .table = msm_clocks_8610_rumi,
2817 .size = ARRAY_SIZE(msm_clocks_8610_rumi),
Vikram Mulukutlab13abe42012-10-03 11:38:48 -07002818};
2819
Vikram Mulukutlab13abe42012-10-03 11:38:48 -07002820/* MMPLL0 at 800 MHz, main output enabled. */
2821static struct pll_config mmpll0_config __initdata = {
2822 .l = 0x29,
2823 .m = 0x2,
2824 .n = 0x3,
2825 .vco_val = 0x0,
2826 .vco_mask = BM(21, 20),
2827 .pre_div_val = 0x0,
2828 .pre_div_mask = BM(14, 12),
2829 .post_div_val = 0x0,
2830 .post_div_mask = BM(9, 8),
2831 .mn_ena_val = BIT(24),
2832 .mn_ena_mask = BIT(24),
2833 .main_output_val = BIT(0),
2834 .main_output_mask = BIT(0),
2835};
2836
2837/* MMPLL1 at 1200 MHz, main output enabled. */
2838static struct pll_config mmpll1_config __initdata = {
2839 .l = 0x3E,
2840 .m = 0x1,
2841 .n = 0x2,
2842 .vco_val = 0x0,
2843 .vco_mask = BM(21, 20),
2844 .pre_div_val = 0x0,
2845 .pre_div_mask = BM(14, 12),
2846 .post_div_val = 0x0,
2847 .post_div_mask = BM(9, 8),
2848 .mn_ena_val = BIT(24),
2849 .mn_ena_mask = BIT(24),
2850 .main_output_val = BIT(0),
2851 .main_output_mask = BIT(0),
2852};
2853
Vikram Mulukutlab13abe42012-10-03 11:38:48 -07002854#define PLL_AUX_OUTPUT_BIT 1
2855#define PLL_AUX2_OUTPUT_BIT 2
2856
2857#define PWR_ON_MASK BIT(31)
2858#define EN_REST_WAIT_MASK (0xF << 20)
2859#define EN_FEW_WAIT_MASK (0xF << 16)
2860#define CLK_DIS_WAIT_MASK (0xF << 12)
2861#define SW_OVERRIDE_MASK BIT(2)
2862#define HW_CONTROL_MASK BIT(1)
2863#define SW_COLLAPSE_MASK BIT(0)
2864
2865/* Wait 2^n CXO cycles between all states. Here, n=2 (4 cycles). */
2866#define EN_REST_WAIT_VAL (0x2 << 20)
2867#define EN_FEW_WAIT_VAL (0x2 << 16)
2868#define CLK_DIS_WAIT_VAL (0x2 << 12)
2869#define GDSC_TIMEOUT_US 50000
2870
2871static void __init reg_init(void)
2872{
Vikram Mulukutla81577ab2013-03-25 10:55:36 -07002873 u32 regval;
Vikram Mulukutlab13abe42012-10-03 11:38:48 -07002874
Vikram Mulukutlab13abe42012-10-03 11:38:48 -07002875 configure_sr_hpm_lp_pll(&mmpll0_config, &mmpll0_regs, 1);
2876 configure_sr_hpm_lp_pll(&mmpll1_config, &mmpll1_regs, 1);
Vikram Mulukutlab13abe42012-10-03 11:38:48 -07002877
Vikram Mulukutlab13abe42012-10-03 11:38:48 -07002878 /* Vote for GPLL0 to turn on. Needed by acpuclock. */
2879 regval = readl_relaxed(GCC_REG_BASE(APCS_GPLL_ENA_VOTE));
2880 regval |= BIT(0);
2881 writel_relaxed(regval, GCC_REG_BASE(APCS_GPLL_ENA_VOTE));
2882
2883 /*
2884 * TODO: Confirm that no clocks need to be voted on in this sleep vote
2885 * register.
2886 */
2887 writel_relaxed(0x0, GCC_REG_BASE(APCS_CLOCK_SLEEP_ENA_VOTE));
Vikram Mulukutlab13abe42012-10-03 11:38:48 -07002888}
2889
Syed Rameez Mustafa3971c142013-01-09 19:04:53 -08002890static void __init msm8610_clock_post_init(void)
Vikram Mulukutlab13abe42012-10-03 11:38:48 -07002891{
2892 /*
2893 * Hold an active set vote for CXO; this is because CXO is expected
2894 * to remain on whenever CPUs aren't power collapsed.
2895 */
2896 clk_prepare_enable(&gcc_xo_a_clk_src.c);
2897
2898
2899 /* Set rates for single-rate clocks. */
2900 clk_set_rate(&usb_hs_system_clk_src.c,
2901 usb_hs_system_clk_src.freq_tbl[0].freq_hz);
2902 clk_set_rate(&pdm2_clk_src.c, pdm2_clk_src.freq_tbl[0].freq_hz);
2903 clk_set_rate(&mclk0_clk_src.c, mclk0_clk_src.freq_tbl[0].freq_hz);
2904 clk_set_rate(&mclk1_clk_src.c, mclk1_clk_src.freq_tbl[0].freq_hz);
Vikram Mulukutlab13abe42012-10-03 11:38:48 -07002905}
2906
2907#define GCC_CC_PHYS 0xFC400000
2908#define GCC_CC_SIZE SZ_16K
2909
2910#define MMSS_CC_PHYS 0xFD8C0000
2911#define MMSS_CC_SIZE SZ_256K
2912
2913#define LPASS_CC_PHYS 0xFE000000
2914#define LPASS_CC_SIZE SZ_256K
2915
2916#define APCS_GCC_CC_PHYS 0xF9011000
2917#define APCS_GCC_CC_SIZE SZ_4K
2918
Vikram Mulukutla4157cca2013-01-24 15:42:41 -08002919#define APCS_KPSS_SH_PLL_PHYS 0xF9016000
2920#define APCS_KPSS_SH_PLL_SIZE SZ_64
2921
Syed Rameez Mustafa3971c142013-01-09 19:04:53 -08002922static void __init msm8610_clock_pre_init(void)
Vikram Mulukutlab13abe42012-10-03 11:38:48 -07002923{
2924 virt_bases[GCC_BASE] = ioremap(GCC_CC_PHYS, GCC_CC_SIZE);
2925 if (!virt_bases[GCC_BASE])
Syed Rameez Mustafa3971c142013-01-09 19:04:53 -08002926 panic("clock-8610: Unable to ioremap GCC memory!");
Vikram Mulukutlab13abe42012-10-03 11:38:48 -07002927
2928 virt_bases[MMSS_BASE] = ioremap(MMSS_CC_PHYS, MMSS_CC_SIZE);
2929 if (!virt_bases[MMSS_BASE])
Syed Rameez Mustafa3971c142013-01-09 19:04:53 -08002930 panic("clock-8610: Unable to ioremap MMSS_CC memory!");
Vikram Mulukutlab13abe42012-10-03 11:38:48 -07002931
2932 virt_bases[LPASS_BASE] = ioremap(LPASS_CC_PHYS, LPASS_CC_SIZE);
2933 if (!virt_bases[LPASS_BASE])
Syed Rameez Mustafa3971c142013-01-09 19:04:53 -08002934 panic("clock-8610: Unable to ioremap LPASS_CC memory!");
Vikram Mulukutlab13abe42012-10-03 11:38:48 -07002935
2936 virt_bases[APCS_BASE] = ioremap(APCS_GCC_CC_PHYS, APCS_GCC_CC_SIZE);
2937 if (!virt_bases[APCS_BASE])
Syed Rameez Mustafa3971c142013-01-09 19:04:53 -08002938 panic("clock-8610: Unable to ioremap APCS_GCC_CC memory!");
Vikram Mulukutlab13abe42012-10-03 11:38:48 -07002939
Vikram Mulukutla4157cca2013-01-24 15:42:41 -08002940 virt_bases[APCS_PLL_BASE] = ioremap(APCS_KPSS_SH_PLL_PHYS,
2941 APCS_KPSS_SH_PLL_SIZE);
2942 if (!virt_bases[APCS_PLL_BASE])
2943 panic("clock-8610: Unable to ioremap APCS_GCC_CC memory!");
2944
Vikram Mulukutlab13abe42012-10-03 11:38:48 -07002945 clk_ops_local_pll.enable = sr_hpm_lp_pll_clk_enable;
2946
Patrick Dalyebc26bc2013-02-05 11:49:07 -08002947 vdd_dig.regulator[0] = regulator_get(NULL, "vdd_dig");
2948 if (IS_ERR(vdd_dig.regulator[0]))
Syed Rameez Mustafa3971c142013-01-09 19:04:53 -08002949 panic("clock-8610: Unable to get the vdd_dig regulator!");
Vikram Mulukutlab13abe42012-10-03 11:38:48 -07002950
Patrick Dalyebc26bc2013-02-05 11:49:07 -08002951 vdd_sr2_pll.regulator[0] = regulator_get(NULL, "vdd_sr2_pll");
2952 if (IS_ERR(vdd_sr2_pll.regulator[0]))
Vikram Mulukutla4157cca2013-01-24 15:42:41 -08002953 panic("clock-8610: Unable to get the vdd_sr2_pll regulator!");
2954
Patrick Daly6fb589a2013-03-29 17:55:55 -07002955 vdd_sr2_pll.regulator[1] = regulator_get(NULL, "vdd_sr2_dig");
2956 if (IS_ERR(vdd_sr2_pll.regulator[1]))
2957 panic("clock-8610: Unable to get the vdd_sr2_dig regulator!");
2958
2959 vote_vdd_level(&vdd_sr2_pll, VDD_SR2_PLL_TUR);
Patrick Dalyebc26bc2013-02-05 11:49:07 -08002960 regulator_enable(vdd_sr2_pll.regulator[0]);
Patrick Daly6fb589a2013-03-29 17:55:55 -07002961 regulator_enable(vdd_sr2_pll.regulator[1]);
Vikram Mulukutla4157cca2013-01-24 15:42:41 -08002962
Vikram Mulukutlab13abe42012-10-03 11:38:48 -07002963 /*
2964 * TODO: Set a voltage and enable vdd_dig, leaving the voltage high
2965 * until late_init. This may not be necessary with clock handoff;
2966 * Investigate this code on a real non-simulator target to determine
2967 * its necessity.
2968 */
2969 vote_vdd_level(&vdd_dig, VDD_DIG_HIGH);
Patrick Dalyebc26bc2013-02-05 11:49:07 -08002970 regulator_enable(vdd_dig.regulator[0]);
Vikram Mulukutlab13abe42012-10-03 11:38:48 -07002971
2972 enable_rpm_scaling();
2973
2974 /* Enable a clock to allow access to MMSS clock registers */
2975 clk_prepare_enable(&gcc_mmss_noc_cfg_ahb_clk.c),
2976
2977 reg_init();
2978
Vikram Mulukutla82cb8442013-01-28 13:36:51 -08002979 /* Maintain the max nominal frequency on the MMSSNOC AHB bus. */
2980 clk_set_rate(&mmssnoc_ahb_a_clk.c, 40000000);
2981 clk_prepare_enable(&mmssnoc_ahb_a_clk.c);
2982
Vikram Mulukutlab13abe42012-10-03 11:38:48 -07002983 /* TODO: Remove this once the bus driver is in place */
Vikram Mulukutlab13abe42012-10-03 11:38:48 -07002984 clk_set_rate(&axi_clk_src.c, 200000000);
Vikram Mulukutlab13abe42012-10-03 11:38:48 -07002985 clk_prepare_enable(&mmss_s0_axi_clk.c);
Vikram Mulukutlab13abe42012-10-03 11:38:48 -07002986}
2987
Syed Rameez Mustafa3971c142013-01-09 19:04:53 -08002988static int __init msm8610_clock_late_init(void)
Vikram Mulukutlab13abe42012-10-03 11:38:48 -07002989{
Patrick Daly6fb589a2013-03-29 17:55:55 -07002990 unvote_vdd_level(&vdd_dig, VDD_DIG_HIGH);
2991 unvote_vdd_level(&vdd_sr2_pll, VDD_SR2_PLL_TUR);
2992 return 0;
Vikram Mulukutlab13abe42012-10-03 11:38:48 -07002993}
2994
Syed Rameez Mustafa3971c142013-01-09 19:04:53 -08002995struct clock_init_data msm8610_clock_init_data __initdata = {
2996 .table = msm_clocks_8610,
2997 .size = ARRAY_SIZE(msm_clocks_8610),
2998 .pre_init = msm8610_clock_pre_init,
2999 .post_init = msm8610_clock_post_init,
3000 .late_init = msm8610_clock_late_init,
Vikram Mulukutlab13abe42012-10-03 11:38:48 -07003001};