blob: 930f9e386b8e15684e8c7d61e3a4ba8d307b81dc [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
348#define cxo_lpass_source_val 0
349#define lpapll0_lpass_source_val 1
350#define gpll0_lpass_source_val 5
351#define dsipll_mm_source_val 1
352
353#define F(f, s, div, m, n) \
354 { \
355 .freq_hz = (f), \
356 .src_clk = &s##_clk_src.c, \
357 .m_val = (m), \
358 .n_val = ~((n)-(m)) * !!(n), \
359 .d_val = ~(n),\
360 .div_src_val = BVAL(4, 0, (int)(2*(div) - 1)) \
361 | BVAL(10, 8, s##_source_val), \
362 }
363
Vikram Mulukutla4157cca2013-01-24 15:42:41 -0800364#define F_APCS_PLL(f, l, m, n, pre_div, post_div, vco) \
365 { \
366 .freq_hz = (f), \
367 .l_val = (l), \
368 .m_val = (m), \
369 .n_val = (n), \
370 .pre_div_val = BVAL(12, 12, (pre_div)), \
371 .post_div_val = BVAL(9, 8, (post_div)), \
372 .vco_val = BVAL(29, 28, (vco)), \
373 }
374
Vikram Mulukutlab13abe42012-10-03 11:38:48 -0700375#define F_MM(f, s, div, m, n) \
376 { \
377 .freq_hz = (f), \
378 .src_clk = &s##_clk_src.c, \
379 .m_val = (m), \
380 .n_val = ~((n)-(m)) * !!(n), \
381 .d_val = ~(n),\
382 .div_src_val = BVAL(4, 0, (int)(2*(div) - 1)) \
383 | BVAL(10, 8, s##_mm_source_val), \
384 }
385
386#define F_HDMI(f, s, div, m, n) \
387 { \
388 .freq_hz = (f), \
389 .src_clk = &s##_clk_src, \
390 .m_val = (m), \
391 .n_val = ~((n)-(m)) * !!(n), \
392 .d_val = ~(n),\
393 .div_src_val = BVAL(4, 0, (int)(2*(div) - 1)) \
394 | BVAL(10, 8, s##_mm_source_val), \
395 }
396
397#define F_MDSS(f, s, div, m, n) \
398 { \
399 .freq_hz = (f), \
400 .m_val = (m), \
401 .n_val = ~((n)-(m)) * !!(n), \
402 .d_val = ~(n),\
403 .div_src_val = BVAL(4, 0, (int)(2*(div) - 1)) \
404 | BVAL(10, 8, s##_mm_source_val), \
405 }
406
407#define F_LPASS(f, s, div, m, n) \
408 { \
409 .freq_hz = (f), \
410 .src_clk = &s##_clk_src.c, \
411 .m_val = (m), \
412 .n_val = ~((n)-(m)) * !!(n), \
413 .d_val = ~(n),\
414 .div_src_val = BVAL(4, 0, (int)(2*(div) - 1)) \
415 | BVAL(10, 8, s##_lpass_source_val), \
416 }
417
418#define VDD_DIG_FMAX_MAP1(l1, f1) \
419 .vdd_class = &vdd_dig, \
420 .fmax = (unsigned long[VDD_DIG_NUM]) { \
421 [VDD_DIG_##l1] = (f1), \
422 }, \
423 .num_fmax = VDD_DIG_NUM
424#define VDD_DIG_FMAX_MAP2(l1, f1, l2, f2) \
425 .vdd_class = &vdd_dig, \
426 .fmax = (unsigned long[VDD_DIG_NUM]) { \
427 [VDD_DIG_##l1] = (f1), \
428 [VDD_DIG_##l2] = (f2), \
429 }, \
430 .num_fmax = VDD_DIG_NUM
431#define VDD_DIG_FMAX_MAP3(l1, f1, l2, f2, l3, f3) \
432 .vdd_class = &vdd_dig, \
433 .fmax = (unsigned long[VDD_DIG_NUM]) { \
434 [VDD_DIG_##l1] = (f1), \
435 [VDD_DIG_##l2] = (f2), \
436 [VDD_DIG_##l3] = (f3), \
437 }, \
438 .num_fmax = VDD_DIG_NUM
439
440enum vdd_dig_levels {
441 VDD_DIG_NONE,
442 VDD_DIG_LOW,
443 VDD_DIG_NOMINAL,
444 VDD_DIG_HIGH,
445 VDD_DIG_NUM
446};
447
Patrick Dalyebc26bc2013-02-05 11:49:07 -0800448static const int *vdd_corner[] = {
449 [VDD_DIG_NONE] = VDD_UV(RPM_REGULATOR_CORNER_NONE),
450 [VDD_DIG_LOW] = VDD_UV(RPM_REGULATOR_CORNER_SVS_SOC),
451 [VDD_DIG_NOMINAL] = VDD_UV(RPM_REGULATOR_CORNER_NORMAL),
452 [VDD_DIG_HIGH] = VDD_UV(RPM_REGULATOR_CORNER_SUPER_TURBO),
Vikram Mulukutlab13abe42012-10-03 11:38:48 -0700453};
454
Patrick Dalyebc26bc2013-02-05 11:49:07 -0800455static DEFINE_VDD_REGULATORS(vdd_dig, VDD_DIG_NUM, 1, vdd_corner);
Vikram Mulukutlab13abe42012-10-03 11:38:48 -0700456
457#define RPM_MISC_CLK_TYPE 0x306b6c63
458#define RPM_BUS_CLK_TYPE 0x316b6c63
459#define RPM_MEM_CLK_TYPE 0x326b6c63
460
461#define RPM_SMD_KEY_ENABLE 0x62616E45
462
463#define CXO_ID 0x0
464#define QDSS_ID 0x1
465#define RPM_SCALING_ENABLE_ID 0x2
466
467#define PNOC_ID 0x0
468#define SNOC_ID 0x1
469#define CNOC_ID 0x2
470#define MMSSNOC_AHB_ID 0x3
471
472#define BIMC_ID 0x0
473#define OXILI_ID 0x1
474#define OCMEM_ID 0x2
475
476#define D0_ID 1
477#define D1_ID 2
478#define A0_ID 3
479#define A1_ID 4
480#define A2_ID 5
481#define DIFF_CLK_ID 7
482#define DIV_CLK_ID 11
483
484DEFINE_CLK_RPM_SMD(pnoc_clk, pnoc_a_clk, RPM_BUS_CLK_TYPE, PNOC_ID, NULL);
485DEFINE_CLK_RPM_SMD(snoc_clk, snoc_a_clk, RPM_BUS_CLK_TYPE, SNOC_ID, NULL);
486DEFINE_CLK_RPM_SMD(cnoc_clk, cnoc_a_clk, RPM_BUS_CLK_TYPE, CNOC_ID, NULL);
487DEFINE_CLK_RPM_SMD(mmssnoc_ahb_clk, mmssnoc_ahb_a_clk, RPM_BUS_CLK_TYPE,
488 MMSSNOC_AHB_ID, NULL);
489
490DEFINE_CLK_RPM_SMD(bimc_clk, bimc_a_clk, RPM_MEM_CLK_TYPE, BIMC_ID, NULL);
491
492DEFINE_CLK_RPM_SMD_BRANCH(gcc_xo_clk_src, gcc_xo_a_clk_src,
493 RPM_MISC_CLK_TYPE, CXO_ID, 19200000);
494DEFINE_CLK_RPM_SMD_QDSS(qdss_clk, qdss_a_clk, RPM_MISC_CLK_TYPE, QDSS_ID);
495
496DEFINE_CLK_RPM_SMD_XO_BUFFER(cxo_d0, cxo_d0_a, D0_ID);
497DEFINE_CLK_RPM_SMD_XO_BUFFER(cxo_d1, cxo_d1_a, D1_ID);
498DEFINE_CLK_RPM_SMD_XO_BUFFER(cxo_a0, cxo_a0_a, A0_ID);
499DEFINE_CLK_RPM_SMD_XO_BUFFER(cxo_a1, cxo_a1_a, A1_ID);
500DEFINE_CLK_RPM_SMD_XO_BUFFER(cxo_a2, cxo_a2_a, A2_ID);
501DEFINE_CLK_RPM_SMD_XO_BUFFER(div_clk, div_a_clk, DIV_CLK_ID);
502DEFINE_CLK_RPM_SMD_XO_BUFFER(diff_clk, diff_a_clk, DIFF_CLK_ID);
503
504DEFINE_CLK_RPM_SMD_XO_BUFFER_PINCTRL(cxo_d0_pin, cxo_d0_a_pin, D0_ID);
505DEFINE_CLK_RPM_SMD_XO_BUFFER_PINCTRL(cxo_d1_pin, cxo_d1_a_pin, D1_ID);
506DEFINE_CLK_RPM_SMD_XO_BUFFER_PINCTRL(cxo_a0_pin, cxo_a0_a_pin, A0_ID);
507DEFINE_CLK_RPM_SMD_XO_BUFFER_PINCTRL(cxo_a1_pin, cxo_a1_a_pin, A1_ID);
508DEFINE_CLK_RPM_SMD_XO_BUFFER_PINCTRL(cxo_a2_pin, cxo_a2_a_pin, A2_ID);
509
510static DEFINE_CLK_VOTER(pnoc_msmbus_clk, &pnoc_clk.c, LONG_MAX);
511static DEFINE_CLK_VOTER(snoc_msmbus_clk, &snoc_clk.c, LONG_MAX);
512static DEFINE_CLK_VOTER(cnoc_msmbus_clk, &cnoc_clk.c, LONG_MAX);
513static DEFINE_CLK_VOTER(pnoc_msmbus_a_clk, &pnoc_a_clk.c, LONG_MAX);
514static DEFINE_CLK_VOTER(snoc_msmbus_a_clk, &snoc_a_clk.c, LONG_MAX);
515static DEFINE_CLK_VOTER(cnoc_msmbus_a_clk, &cnoc_a_clk.c, LONG_MAX);
516
517static DEFINE_CLK_VOTER(bimc_msmbus_clk, &bimc_clk.c, LONG_MAX);
518static DEFINE_CLK_VOTER(bimc_msmbus_a_clk, &bimc_a_clk.c, LONG_MAX);
519static DEFINE_CLK_VOTER(bimc_acpu_a_clk, &bimc_a_clk.c, LONG_MAX);
520
521static DEFINE_CLK_VOTER(pnoc_sps_clk, &pnoc_clk.c, LONG_MAX);
522static DEFINE_CLK_VOTER(pnoc_iommu_clk, &pnoc_clk.c, LONG_MAX);
523static DEFINE_CLK_VOTER(pnoc_qseecom_clk, &pnoc_clk.c, LONG_MAX);
524
Vikram Mulukutla4157cca2013-01-24 15:42:41 -0800525static DEFINE_CLK_MEASURE(apc0_m_clk);
526static DEFINE_CLK_MEASURE(apc1_m_clk);
527static DEFINE_CLK_MEASURE(apc2_m_clk);
528static DEFINE_CLK_MEASURE(apc3_m_clk);
529static DEFINE_CLK_MEASURE(l2_m_clk);
530
531#define APCS_SH_PLL_MODE 0x000
532#define APCS_SH_PLL_L_VAL 0x004
533#define APCS_SH_PLL_M_VAL 0x008
534#define APCS_SH_PLL_N_VAL 0x00C
535#define APCS_SH_PLL_USER_CTL 0x010
536#define APCS_SH_PLL_CONFIG_CTL 0x014
537#define APCS_SH_PLL_STATUS 0x01C
538
539enum vdd_sr2_pll_levels {
540 VDD_SR2_PLL_OFF,
541 VDD_SR2_PLL_ON,
542 VDD_SR2_PLL_NUM
543};
544
Patrick Dalyebc26bc2013-02-05 11:49:07 -0800545static const int *vdd_sr2_pll_levels[] = {
546 [VDD_SR2_PLL_OFF] = VDD_UV(0),
547 [VDD_SR2_PLL_ON] = VDD_UV(1800000),
548};
Vikram Mulukutla4157cca2013-01-24 15:42:41 -0800549
Patrick Dalyebc26bc2013-02-05 11:49:07 -0800550static DEFINE_VDD_REGULATORS(vdd_sr2_pll, VDD_SR2_PLL_NUM, 1,
551 vdd_sr2_pll_levels);
Vikram Mulukutla4157cca2013-01-24 15:42:41 -0800552
553static struct pll_freq_tbl apcs_pll_freq[] = {
554 F_APCS_PLL( 384000000, 20, 0x0, 0x1, 0x0, 0x0, 0x0),
555 F_APCS_PLL( 787200000, 41, 0x0, 0x1, 0x0, 0x0, 0x0),
556 F_APCS_PLL( 998400000, 52, 0x0, 0x1, 0x0, 0x0, 0x0),
557 F_APCS_PLL(1190400000, 62, 0x0, 0x1, 0x0, 0x0, 0x0),
558 PLL_F_END
559};
560
561static struct pll_clk a7sspll = {
562 .mode_reg = (void __iomem *)APCS_SH_PLL_MODE,
563 .l_reg = (void __iomem *)APCS_SH_PLL_L_VAL,
564 .m_reg = (void __iomem *)APCS_SH_PLL_M_VAL,
565 .n_reg = (void __iomem *)APCS_SH_PLL_N_VAL,
566 .config_reg = (void __iomem *)APCS_SH_PLL_USER_CTL,
567 .status_reg = (void __iomem *)APCS_SH_PLL_STATUS,
568 .freq_tbl = apcs_pll_freq,
569 .masks = {
570 .vco_mask = BM(29, 28),
571 .pre_div_mask = BIT(12),
572 .post_div_mask = BM(9, 8),
573 .mn_en_mask = BIT(24),
574 .main_output_mask = BIT(0),
575 },
576 .base = &virt_bases[APCS_PLL_BASE],
577 .c = {
578 .dbg_name = "a7sspll",
579 .ops = &clk_ops_sr2_pll,
580 .vdd_class = &vdd_sr2_pll,
581 .fmax = (unsigned long [VDD_SR2_PLL_NUM]) {
582 [VDD_SR2_PLL_ON] = ULONG_MAX,
583 },
584 .num_fmax = VDD_SR2_PLL_NUM,
585 CLK_INIT(a7sspll.c),
586 /*
587 * Need to skip handoff of the acpu pll to avoid
588 * turning off the pll when the cpu is using it
589 */
590 .flags = CLKFLAG_SKIP_HANDOFF,
591 },
592};
593
594static unsigned int soft_vote_gpll0;
595
Vikram Mulukutlab13abe42012-10-03 11:38:48 -0700596static struct pll_vote_clk gpll0_clk_src = {
597 .en_reg = (void __iomem *)APCS_GPLL_ENA_VOTE,
598 .en_mask = BIT(0),
599 .status_reg = (void __iomem *)GPLL0_STATUS,
600 .status_mask = BIT(17),
Vikram Mulukutla4157cca2013-01-24 15:42:41 -0800601 .soft_vote = &soft_vote_gpll0,
602 .soft_vote_mask = PLL_SOFT_VOTE_PRIMARY,
Vikram Mulukutlab13abe42012-10-03 11:38:48 -0700603 .base = &virt_bases[GCC_BASE],
604 .c = {
605 .parent = &gcc_xo_clk_src.c,
606 .rate = 600000000,
607 .dbg_name = "gpll0_clk_src",
Vikram Mulukutla4157cca2013-01-24 15:42:41 -0800608 .ops = &clk_ops_pll_acpu_vote,
Vikram Mulukutlab13abe42012-10-03 11:38:48 -0700609 CLK_INIT(gpll0_clk_src.c),
610 },
611};
612
Vikram Mulukutla4157cca2013-01-24 15:42:41 -0800613static struct pll_vote_clk gpll0_ao_clk_src = {
614 .en_reg = (void __iomem *)APCS_GPLL_ENA_VOTE,
615 .en_mask = BIT(0),
616 .status_reg = (void __iomem *)GPLL0_STATUS,
617 .status_mask = BIT(17),
618 .soft_vote = &soft_vote_gpll0,
619 .soft_vote_mask = PLL_SOFT_VOTE_ACPU,
620 .base = &virt_bases[GCC_BASE],
621 .c = {
622 .rate = 600000000,
623 .dbg_name = "gpll0_ao_clk_src",
624 .ops = &clk_ops_pll_acpu_vote,
625 CLK_INIT(gpll0_ao_clk_src.c),
626 },
627};
628
Vikram Mulukutlab13abe42012-10-03 11:38:48 -0700629static struct pll_vote_clk mmpll0_clk_src = {
630 .en_reg = (void __iomem *)MMSS_PLL_VOTE_APCS_REG,
631 .en_mask = BIT(0),
632 .status_reg = (void __iomem *)MMPLL0_PLL_STATUS,
633 .status_mask = BIT(17),
634 .base = &virt_bases[MMSS_BASE],
635 .c = {
636 .parent = &gcc_xo_clk_src.c,
637 .dbg_name = "mmpll0_clk_src",
638 .rate = 800000000,
639 .ops = &clk_ops_pll_vote,
640 CLK_INIT(mmpll0_clk_src.c),
641 },
642};
643
644static struct pll_config_regs mmpll0_regs __initdata = {
645 .l_reg = (void __iomem *)MMPLL0_PLL_L_VAL,
646 .m_reg = (void __iomem *)MMPLL0_PLL_M_VAL,
647 .n_reg = (void __iomem *)MMPLL0_PLL_N_VAL,
648 .config_reg = (void __iomem *)MMPLL0_PLL_USER_CTL,
649 .mode_reg = (void __iomem *)MMPLL0_PLL_MODE,
650 .base = &virt_bases[MMSS_BASE],
651};
652
653static struct pll_clk mmpll1_clk_src = {
654 .mode_reg = (void __iomem *)MMPLL1_PLL_MODE,
655 .status_reg = (void __iomem *)MMPLL1_PLL_STATUS,
656 .base = &virt_bases[MMSS_BASE],
657 .c = {
658 .parent = &gcc_xo_clk_src.c,
659 .dbg_name = "mmpll1_clk_src",
660 .rate = 1200000000,
661 .ops = &clk_ops_local_pll,
662 CLK_INIT(mmpll1_clk_src.c),
663 },
664};
665
666static struct pll_config_regs mmpll1_regs __initdata = {
667 .l_reg = (void __iomem *)MMPLL1_PLL_L_VAL,
668 .m_reg = (void __iomem *)MMPLL1_PLL_M_VAL,
669 .n_reg = (void __iomem *)MMPLL1_PLL_N_VAL,
670 .config_reg = (void __iomem *)MMPLL1_PLL_USER_CTL,
671 .mode_reg = (void __iomem *)MMPLL1_PLL_MODE,
672 .base = &virt_bases[MMSS_BASE],
673};
674
675static struct pll_vote_clk lpapll0_clk_src = {
676 .en_reg = (void __iomem *)LPA_PLL_VOTE_APPS,
677 .en_mask = BIT(0),
678 .status_reg = (void __iomem *)LPAAUDIO_PLL_STATUS,
679 .status_mask = BIT(17),
680 .base = &virt_bases[LPASS_BASE],
681 .c = {
682 .parent = &gcc_xo_clk_src.c,
683 .rate = 491520000,
684 .dbg_name = "lpapll0_clk_src",
685 .ops = &clk_ops_pll_vote,
686 CLK_INIT(lpapll0_clk_src.c),
687 },
688};
689
690static struct clk_freq_tbl ftbl_gcc_blsp1_qup1_6_spi_apps_clk[] = {
691 F( 960000, gcc_xo, 10, 1, 2),
692 F( 4800000, gcc_xo, 4, 0, 0),
693 F( 9600000, gcc_xo, 2, 0, 0),
694 F(15000000, gpll0, 10, 1, 4),
695 F(19200000, gcc_xo, 1, 0, 0),
696 F(25000000, gpll0, 12, 1, 2),
697 F(50000000, gpll0, 12, 0, 0),
698 F_END,
699};
700
701static struct rcg_clk blsp1_qup1_spi_apps_clk_src = {
702 .cmd_rcgr_reg = BLSP1_QUP1_SPI_APPS_CMD_RCGR,
703 .set_rate = set_rate_mnd,
704 .freq_tbl = ftbl_gcc_blsp1_qup1_6_spi_apps_clk,
705 .current_freq = &rcg_dummy_freq,
706 .base = &virt_bases[GCC_BASE],
707 .c = {
708 .dbg_name = "blsp1_qup1_spi_apps_clk_src",
709 .ops = &clk_ops_rcg_mnd,
710 VDD_DIG_FMAX_MAP2(LOW, 25000000, NOMINAL, 50000000),
711 CLK_INIT(blsp1_qup1_spi_apps_clk_src.c),
712 },
713};
714
715static struct rcg_clk blsp1_qup2_spi_apps_clk_src = {
716 .cmd_rcgr_reg = BLSP1_QUP2_SPI_APPS_CMD_RCGR,
717 .set_rate = set_rate_mnd,
718 .freq_tbl = ftbl_gcc_blsp1_qup1_6_spi_apps_clk,
719 .current_freq = &rcg_dummy_freq,
720 .base = &virt_bases[GCC_BASE],
721 .c = {
722 .dbg_name = "blsp1_qup2_spi_apps_clk_src",
723 .ops = &clk_ops_rcg_mnd,
724 VDD_DIG_FMAX_MAP2(LOW, 25000000, NOMINAL, 50000000),
725 CLK_INIT(blsp1_qup2_spi_apps_clk_src.c),
726 },
727};
728
729static struct rcg_clk blsp1_qup3_spi_apps_clk_src = {
730 .cmd_rcgr_reg = BLSP1_QUP3_SPI_APPS_CMD_RCGR,
731 .set_rate = set_rate_mnd,
732 .freq_tbl = ftbl_gcc_blsp1_qup1_6_spi_apps_clk,
733 .current_freq = &rcg_dummy_freq,
734 .base = &virt_bases[GCC_BASE],
735 .c = {
736 .dbg_name = "blsp1_qup3_spi_apps_clk_src",
737 .ops = &clk_ops_rcg_mnd,
738 VDD_DIG_FMAX_MAP2(LOW, 25000000, NOMINAL, 50000000),
739 CLK_INIT(blsp1_qup3_spi_apps_clk_src.c),
740 },
741};
742
743static struct rcg_clk blsp1_qup4_spi_apps_clk_src = {
744 .cmd_rcgr_reg = BLSP1_QUP4_SPI_APPS_CMD_RCGR,
745 .set_rate = set_rate_mnd,
746 .freq_tbl = ftbl_gcc_blsp1_qup1_6_spi_apps_clk,
747 .current_freq = &rcg_dummy_freq,
748 .base = &virt_bases[GCC_BASE],
749 .c = {
750 .dbg_name = "blsp1_qup4_spi_apps_clk_src",
751 .ops = &clk_ops_rcg_mnd,
752 VDD_DIG_FMAX_MAP2(LOW, 25000000, NOMINAL, 50000000),
753 CLK_INIT(blsp1_qup4_spi_apps_clk_src.c),
754 },
755};
756
757static struct rcg_clk blsp1_qup5_spi_apps_clk_src = {
758 .cmd_rcgr_reg = BLSP1_QUP5_SPI_APPS_CMD_RCGR,
759 .set_rate = set_rate_mnd,
760 .freq_tbl = ftbl_gcc_blsp1_qup1_6_spi_apps_clk,
761 .current_freq = &rcg_dummy_freq,
762 .base = &virt_bases[GCC_BASE],
763 .c = {
764 .dbg_name = "blsp1_qup5_spi_apps_clk_src",
765 .ops = &clk_ops_rcg_mnd,
766 VDD_DIG_FMAX_MAP2(LOW, 25000000, NOMINAL, 50000000),
767 CLK_INIT(blsp1_qup5_spi_apps_clk_src.c),
768 },
769};
770
771static struct rcg_clk blsp1_qup6_spi_apps_clk_src = {
772 .cmd_rcgr_reg = BLSP1_QUP6_SPI_APPS_CMD_RCGR,
773 .set_rate = set_rate_mnd,
774 .freq_tbl = ftbl_gcc_blsp1_qup1_6_spi_apps_clk,
775 .current_freq = &rcg_dummy_freq,
776 .base = &virt_bases[GCC_BASE],
777 .c = {
778 .dbg_name = "blsp1_qup6_spi_apps_clk_src",
779 .ops = &clk_ops_rcg_mnd,
780 VDD_DIG_FMAX_MAP2(LOW, 25000000, NOMINAL, 50000000),
781 CLK_INIT(blsp1_qup6_spi_apps_clk_src.c),
782 },
783};
784
785static struct clk_freq_tbl ftbl_gcc_blsp1_uart1_6_apps_clk[] = {
786 F( 3686400, gpll0, 1, 96, 15625),
787 F( 7372800, gpll0, 1, 192, 15625),
788 F(14745600, gpll0, 1, 384, 15625),
789 F(16000000, gpll0, 5, 2, 15),
790 F(19200000, gcc_xo, 1, 0, 0),
791 F(24000000, gpll0, 5, 1, 5),
792 F(32000000, gpll0, 1, 4, 75),
793 F(40000000, gpll0, 15, 0, 0),
794 F(46400000, gpll0, 1, 29, 375),
795 F(48000000, gpll0, 12.5, 0, 0),
796 F(51200000, gpll0, 1, 32, 375),
797 F(56000000, gpll0, 1, 7, 75),
798 F(58982400, gpll0, 1, 1536, 15625),
799 F(60000000, gpll0, 10, 0, 0),
800 F_END,
801};
802
803static struct rcg_clk blsp1_uart1_apps_clk_src = {
804 .cmd_rcgr_reg = BLSP1_UART1_APPS_CMD_RCGR,
805 .set_rate = set_rate_mnd,
806 .freq_tbl = ftbl_gcc_blsp1_uart1_6_apps_clk,
807 .current_freq = &rcg_dummy_freq,
808 .base = &virt_bases[GCC_BASE],
809 .c = {
810 .dbg_name = "blsp1_uart1_apps_clk_src",
811 .ops = &clk_ops_rcg_mnd,
812 VDD_DIG_FMAX_MAP2(LOW, 31580000, NOMINAL, 63160000),
813 CLK_INIT(blsp1_uart1_apps_clk_src.c),
814 },
815};
816
817static struct rcg_clk blsp1_uart2_apps_clk_src = {
818 .cmd_rcgr_reg = BLSP1_UART2_APPS_CMD_RCGR,
819 .set_rate = set_rate_mnd,
820 .freq_tbl = ftbl_gcc_blsp1_uart1_6_apps_clk,
821 .current_freq = &rcg_dummy_freq,
822 .base = &virt_bases[GCC_BASE],
823 .c = {
824 .dbg_name = "blsp1_uart2_apps_clk_src",
825 .ops = &clk_ops_rcg_mnd,
826 VDD_DIG_FMAX_MAP2(LOW, 31580000, NOMINAL, 63160000),
827 CLK_INIT(blsp1_uart2_apps_clk_src.c),
828 },
829};
830
831static struct rcg_clk blsp1_uart3_apps_clk_src = {
832 .cmd_rcgr_reg = BLSP1_UART3_APPS_CMD_RCGR,
833 .set_rate = set_rate_mnd,
834 .freq_tbl = ftbl_gcc_blsp1_uart1_6_apps_clk,
835 .current_freq = &rcg_dummy_freq,
836 .base = &virt_bases[GCC_BASE],
837 .c = {
838 .dbg_name = "blsp1_uart3_apps_clk_src",
839 .ops = &clk_ops_rcg_mnd,
840 VDD_DIG_FMAX_MAP2(LOW, 31580000, NOMINAL, 63160000),
841 CLK_INIT(blsp1_uart3_apps_clk_src.c),
842 },
843};
844
845static struct rcg_clk blsp1_uart4_apps_clk_src = {
846 .cmd_rcgr_reg = BLSP1_UART4_APPS_CMD_RCGR,
847 .set_rate = set_rate_mnd,
848 .freq_tbl = ftbl_gcc_blsp1_uart1_6_apps_clk,
849 .current_freq = &rcg_dummy_freq,
850 .base = &virt_bases[GCC_BASE],
851 .c = {
852 .dbg_name = "blsp1_uart4_apps_clk_src",
853 .ops = &clk_ops_rcg_mnd,
854 VDD_DIG_FMAX_MAP2(LOW, 31580000, NOMINAL, 63160000),
855 CLK_INIT(blsp1_uart4_apps_clk_src.c),
856 },
857};
858
859static struct rcg_clk blsp1_uart5_apps_clk_src = {
860 .cmd_rcgr_reg = BLSP1_UART5_APPS_CMD_RCGR,
861 .set_rate = set_rate_mnd,
862 .freq_tbl = ftbl_gcc_blsp1_uart1_6_apps_clk,
863 .current_freq = &rcg_dummy_freq,
864 .base = &virt_bases[GCC_BASE],
865 .c = {
866 .dbg_name = "blsp1_uart5_apps_clk_src",
867 .ops = &clk_ops_rcg_mnd,
868 VDD_DIG_FMAX_MAP2(LOW, 31580000, NOMINAL, 63160000),
869 CLK_INIT(blsp1_uart5_apps_clk_src.c),
870 },
871};
872
873static struct rcg_clk blsp1_uart6_apps_clk_src = {
874 .cmd_rcgr_reg = BLSP1_UART6_APPS_CMD_RCGR,
875 .set_rate = set_rate_mnd,
876 .freq_tbl = ftbl_gcc_blsp1_uart1_6_apps_clk,
877 .current_freq = &rcg_dummy_freq,
878 .base = &virt_bases[GCC_BASE],
879 .c = {
880 .dbg_name = "blsp1_uart6_apps_clk_src",
881 .ops = &clk_ops_rcg_mnd,
882 VDD_DIG_FMAX_MAP2(LOW, 31580000, NOMINAL, 63160000),
883 CLK_INIT(blsp1_uart6_apps_clk_src.c),
884 },
885};
886
887static struct clk_freq_tbl ftbl_gcc_ce1_clk[] = {
888 F(50000000, gpll0, 12, 0, 0),
889 F(100000000, gpll0, 6, 0, 0),
890 F_END,
891};
892
893static struct rcg_clk ce1_clk_src = {
894 .cmd_rcgr_reg = CE1_CMD_RCGR,
895 .set_rate = set_rate_hid,
896 .freq_tbl = ftbl_gcc_ce1_clk,
897 .current_freq = &rcg_dummy_freq,
898 .base = &virt_bases[GCC_BASE],
899 .c = {
900 .dbg_name = "ce1_clk_src",
901 .ops = &clk_ops_rcg,
902 VDD_DIG_FMAX_MAP2(LOW, 50000000, NOMINAL, 100000000),
903 CLK_INIT(ce1_clk_src.c),
904 },
905};
906
907static struct clk_freq_tbl ftbl_gcc_gp1_3_clk[] = {
908 F(19200000, gcc_xo, 1, 0, 0),
909 F_END,
910};
911
912static struct rcg_clk gp1_clk_src = {
913 .cmd_rcgr_reg = GP1_CMD_RCGR,
914 .set_rate = set_rate_mnd,
915 .freq_tbl = ftbl_gcc_gp1_3_clk,
916 .current_freq = &rcg_dummy_freq,
917 .base = &virt_bases[GCC_BASE],
918 .c = {
919 .dbg_name = "gp1_clk_src",
920 .ops = &clk_ops_rcg_mnd,
921 VDD_DIG_FMAX_MAP2(LOW, 100000000, NOMINAL, 200000000),
922 CLK_INIT(gp1_clk_src.c),
923 },
924};
925
926static struct rcg_clk gp2_clk_src = {
927 .cmd_rcgr_reg = GP2_CMD_RCGR,
928 .set_rate = set_rate_mnd,
929 .freq_tbl = ftbl_gcc_gp1_3_clk,
930 .current_freq = &rcg_dummy_freq,
931 .base = &virt_bases[GCC_BASE],
932 .c = {
933 .dbg_name = "gp2_clk_src",
934 .ops = &clk_ops_rcg_mnd,
935 VDD_DIG_FMAX_MAP2(LOW, 100000000, NOMINAL, 200000000),
936 CLK_INIT(gp2_clk_src.c),
937 },
938};
939
940static struct rcg_clk gp3_clk_src = {
941 .cmd_rcgr_reg = GP3_CMD_RCGR,
942 .set_rate = set_rate_mnd,
943 .freq_tbl = ftbl_gcc_gp1_3_clk,
944 .current_freq = &rcg_dummy_freq,
945 .base = &virt_bases[GCC_BASE],
946 .c = {
947 .dbg_name = "gp3_clk_src",
948 .ops = &clk_ops_rcg_mnd,
949 VDD_DIG_FMAX_MAP2(LOW, 100000000, NOMINAL, 200000000),
950 CLK_INIT(gp3_clk_src.c),
951 },
952};
953
954static struct clk_freq_tbl ftbl_gcc_pdm2_clk[] = {
955 F(60000000, gpll0, 10, 0, 0),
956 F_END,
957};
958
959static struct rcg_clk pdm2_clk_src = {
960 .cmd_rcgr_reg = PDM2_CMD_RCGR,
961 .set_rate = set_rate_hid,
962 .freq_tbl = ftbl_gcc_pdm2_clk,
963 .current_freq = &rcg_dummy_freq,
964 .base = &virt_bases[GCC_BASE],
965 .c = {
966 .dbg_name = "pdm2_clk_src",
967 .ops = &clk_ops_rcg,
968 VDD_DIG_FMAX_MAP1(LOW, 120000000),
969 CLK_INIT(pdm2_clk_src.c),
970 },
971};
972
973static struct clk_freq_tbl ftbl_gcc_sdcc1_2_apps_clk[] = {
974 F( 144000, gcc_xo, 16, 3, 25),
975 F( 400000, gcc_xo, 12, 1, 4),
976 F( 20000000, gpll0, 15, 1, 2),
977 F( 25000000, gpll0, 12, 1, 2),
978 F( 50000000, gpll0, 12, 0, 0),
979 F(100000000, gpll0, 6, 0, 0),
980 F(200000000, gpll0, 3, 0, 0),
981 F_END,
982};
983
984static struct rcg_clk sdcc1_apps_clk_src = {
985 .cmd_rcgr_reg = SDCC1_APPS_CMD_RCGR,
986 .set_rate = set_rate_mnd,
987 .freq_tbl = ftbl_gcc_sdcc1_2_apps_clk,
988 .current_freq = &rcg_dummy_freq,
989 .base = &virt_bases[GCC_BASE],
990 .c = {
991 .dbg_name = "sdcc1_apps_clk_src",
992 .ops = &clk_ops_rcg_mnd,
993 VDD_DIG_FMAX_MAP2(LOW, 100000000, NOMINAL, 200000000),
994 CLK_INIT(sdcc1_apps_clk_src.c),
995 },
996};
997
998static struct rcg_clk sdcc2_apps_clk_src = {
999 .cmd_rcgr_reg = SDCC2_APPS_CMD_RCGR,
1000 .set_rate = set_rate_mnd,
1001 .freq_tbl = ftbl_gcc_sdcc1_2_apps_clk,
1002 .current_freq = &rcg_dummy_freq,
1003 .base = &virt_bases[GCC_BASE],
1004 .c = {
1005 .dbg_name = "sdcc2_apps_clk_src",
1006 .ops = &clk_ops_rcg_mnd,
1007 VDD_DIG_FMAX_MAP2(LOW, 100000000, NOMINAL, 200000000),
1008 CLK_INIT(sdcc2_apps_clk_src.c),
1009 },
1010};
1011
1012static struct clk_freq_tbl ftbl_gcc_usb_hs_system_clk[] = {
1013 F(75000000, gpll0, 8, 0, 0),
1014 F_END,
1015};
1016
1017static struct rcg_clk usb_hs_system_clk_src = {
1018 .cmd_rcgr_reg = USB_HS_SYSTEM_CMD_RCGR,
1019 .set_rate = set_rate_hid,
1020 .freq_tbl = ftbl_gcc_usb_hs_system_clk,
1021 .current_freq = &rcg_dummy_freq,
1022 .base = &virt_bases[GCC_BASE],
1023 .c = {
1024 .dbg_name = "usb_hs_system_clk_src",
1025 .ops = &clk_ops_rcg,
1026 VDD_DIG_FMAX_MAP2(LOW, 60000000, NOMINAL, 100000000),
1027 CLK_INIT(usb_hs_system_clk_src.c),
1028 },
1029};
1030
1031static struct local_vote_clk gcc_blsp1_ahb_clk = {
1032 .cbcr_reg = BLSP1_AHB_CBCR,
1033 .vote_reg = APCS_CLOCK_BRANCH_ENA_VOTE,
1034 .en_mask = BIT(17),
1035 .base = &virt_bases[GCC_BASE],
1036 .c = {
1037 .dbg_name = "gcc_blsp1_ahb_clk",
1038 .ops = &clk_ops_vote,
1039 CLK_INIT(gcc_blsp1_ahb_clk.c),
1040 },
1041};
1042
1043static struct branch_clk gcc_blsp1_qup1_i2c_apps_clk = {
1044 .cbcr_reg = BLSP1_QUP1_I2C_APPS_CBCR,
1045 .has_sibling = 1,
1046 .base = &virt_bases[GCC_BASE],
1047 .c = {
1048 .parent = &gcc_xo_clk_src.c,
1049 .dbg_name = "gcc_blsp1_qup1_i2c_apps_clk",
1050 .ops = &clk_ops_branch,
1051 CLK_INIT(gcc_blsp1_qup1_i2c_apps_clk.c),
1052 },
1053};
1054
1055static struct branch_clk gcc_blsp1_qup1_spi_apps_clk = {
1056 .cbcr_reg = BLSP1_QUP1_SPI_APPS_CBCR,
1057 .has_sibling = 0,
1058 .base = &virt_bases[GCC_BASE],
1059 .c = {
1060 .parent = &blsp1_qup1_spi_apps_clk_src.c,
1061 .dbg_name = "gcc_blsp1_qup1_spi_apps_clk",
1062 .ops = &clk_ops_branch,
1063 CLK_INIT(gcc_blsp1_qup1_spi_apps_clk.c),
1064 },
1065};
1066
1067static struct branch_clk gcc_blsp1_qup2_i2c_apps_clk = {
1068 .cbcr_reg = BLSP1_QUP2_I2C_APPS_CBCR,
1069 .has_sibling = 1,
1070 .base = &virt_bases[GCC_BASE],
1071 .c = {
1072 .parent = &gcc_xo_clk_src.c,
1073 .dbg_name = "gcc_blsp1_qup2_i2c_apps_clk",
1074 .ops = &clk_ops_branch,
1075 CLK_INIT(gcc_blsp1_qup2_i2c_apps_clk.c),
1076 },
1077};
1078
1079static struct branch_clk gcc_blsp1_qup2_spi_apps_clk = {
1080 .cbcr_reg = BLSP1_QUP2_SPI_APPS_CBCR,
1081 .has_sibling = 0,
1082 .base = &virt_bases[GCC_BASE],
1083 .c = {
1084 .parent = &blsp1_qup2_spi_apps_clk_src.c,
1085 .dbg_name = "gcc_blsp1_qup2_spi_apps_clk",
1086 .ops = &clk_ops_branch,
1087 CLK_INIT(gcc_blsp1_qup2_spi_apps_clk.c),
1088 },
1089};
1090
1091static struct branch_clk gcc_blsp1_qup3_i2c_apps_clk = {
1092 .cbcr_reg = BLSP1_QUP3_I2C_APPS_CBCR,
1093 .has_sibling = 1,
1094 .base = &virt_bases[GCC_BASE],
1095 .c = {
1096 .parent = &gcc_xo_clk_src.c,
1097 .dbg_name = "gcc_blsp1_qup3_i2c_apps_clk",
1098 .ops = &clk_ops_branch,
1099 CLK_INIT(gcc_blsp1_qup3_i2c_apps_clk.c),
1100 },
1101};
1102
1103static struct branch_clk gcc_blsp1_qup3_spi_apps_clk = {
1104 .cbcr_reg = BLSP1_QUP3_SPI_APPS_CBCR,
1105 .has_sibling = 0,
1106 .base = &virt_bases[GCC_BASE],
1107 .c = {
1108 .parent = &blsp1_qup3_spi_apps_clk_src.c,
1109 .dbg_name = "gcc_blsp1_qup3_spi_apps_clk",
1110 .ops = &clk_ops_branch,
1111 CLK_INIT(gcc_blsp1_qup3_spi_apps_clk.c),
1112 },
1113};
1114
1115static struct branch_clk gcc_blsp1_qup4_i2c_apps_clk = {
1116 .cbcr_reg = BLSP1_QUP4_I2C_APPS_CBCR,
1117 .has_sibling = 1,
1118 .base = &virt_bases[GCC_BASE],
1119 .c = {
1120 .parent = &gcc_xo_clk_src.c,
1121 .dbg_name = "gcc_blsp1_qup4_i2c_apps_clk",
1122 .ops = &clk_ops_branch,
1123 CLK_INIT(gcc_blsp1_qup4_i2c_apps_clk.c),
1124 },
1125};
1126
1127static struct branch_clk gcc_blsp1_qup4_spi_apps_clk = {
1128 .cbcr_reg = BLSP1_QUP4_SPI_APPS_CBCR,
1129 .has_sibling = 0,
1130 .base = &virt_bases[GCC_BASE],
1131 .c = {
1132 .parent = &blsp1_qup4_spi_apps_clk_src.c,
1133 .dbg_name = "gcc_blsp1_qup4_spi_apps_clk",
1134 .ops = &clk_ops_branch,
1135 CLK_INIT(gcc_blsp1_qup4_spi_apps_clk.c),
1136 },
1137};
1138
1139static struct branch_clk gcc_blsp1_qup5_i2c_apps_clk = {
1140 .cbcr_reg = BLSP1_QUP5_I2C_APPS_CBCR,
1141 .has_sibling = 1,
1142 .base = &virt_bases[GCC_BASE],
1143 .c = {
1144 .parent = &gcc_xo_clk_src.c,
1145 .dbg_name = "gcc_blsp1_qup5_i2c_apps_clk",
1146 .ops = &clk_ops_branch,
1147 CLK_INIT(gcc_blsp1_qup5_i2c_apps_clk.c),
1148 },
1149};
1150
1151static struct branch_clk gcc_blsp1_qup5_spi_apps_clk = {
1152 .cbcr_reg = BLSP1_QUP5_SPI_APPS_CBCR,
1153 .has_sibling = 0,
1154 .base = &virt_bases[GCC_BASE],
1155 .c = {
1156 .parent = &blsp1_qup5_spi_apps_clk_src.c,
1157 .dbg_name = "gcc_blsp1_qup5_spi_apps_clk",
1158 .ops = &clk_ops_branch,
1159 CLK_INIT(gcc_blsp1_qup5_spi_apps_clk.c),
1160 },
1161};
1162
1163static struct branch_clk gcc_blsp1_qup6_i2c_apps_clk = {
1164 .cbcr_reg = BLSP1_QUP6_I2C_APPS_CBCR,
1165 .has_sibling = 1,
1166 .base = &virt_bases[GCC_BASE],
1167 .c = {
1168 .parent = &gcc_xo_clk_src.c,
1169 .dbg_name = "gcc_blsp1_qup6_i2c_apps_clk",
1170 .ops = &clk_ops_branch,
1171 CLK_INIT(gcc_blsp1_qup6_i2c_apps_clk.c),
1172 },
1173};
1174
1175static struct branch_clk gcc_blsp1_qup6_spi_apps_clk = {
1176 .cbcr_reg = BLSP1_QUP6_SPI_APPS_CBCR,
1177 .has_sibling = 0,
1178 .base = &virt_bases[GCC_BASE],
1179 .c = {
1180 .parent = &blsp1_qup6_spi_apps_clk_src.c,
1181 .dbg_name = "gcc_blsp1_qup6_spi_apps_clk",
1182 .ops = &clk_ops_branch,
1183 CLK_INIT(gcc_blsp1_qup6_spi_apps_clk.c),
1184 },
1185};
1186
1187static struct branch_clk gcc_blsp1_uart1_apps_clk = {
1188 .cbcr_reg = BLSP1_UART1_APPS_CBCR,
1189 .has_sibling = 0,
1190 .base = &virt_bases[GCC_BASE],
1191 .c = {
1192 .parent = &blsp1_uart1_apps_clk_src.c,
1193 .dbg_name = "gcc_blsp1_uart1_apps_clk",
1194 .ops = &clk_ops_branch,
1195 CLK_INIT(gcc_blsp1_uart1_apps_clk.c),
1196 },
1197};
1198
1199static struct branch_clk gcc_blsp1_uart2_apps_clk = {
1200 .cbcr_reg = BLSP1_UART2_APPS_CBCR,
1201 .has_sibling = 0,
1202 .base = &virt_bases[GCC_BASE],
1203 .c = {
1204 .parent = &blsp1_uart2_apps_clk_src.c,
1205 .dbg_name = "gcc_blsp1_uart2_apps_clk",
1206 .ops = &clk_ops_branch,
1207 CLK_INIT(gcc_blsp1_uart2_apps_clk.c),
1208 },
1209};
1210
1211static struct branch_clk gcc_blsp1_uart3_apps_clk = {
1212 .cbcr_reg = BLSP1_UART3_APPS_CBCR,
1213 .has_sibling = 0,
1214 .base = &virt_bases[GCC_BASE],
1215 .c = {
1216 .parent = &blsp1_uart3_apps_clk_src.c,
1217 .dbg_name = "gcc_blsp1_uart3_apps_clk",
1218 .ops = &clk_ops_branch,
1219 CLK_INIT(gcc_blsp1_uart3_apps_clk.c),
1220 },
1221};
1222
1223static struct branch_clk gcc_blsp1_uart4_apps_clk = {
1224 .cbcr_reg = BLSP1_UART4_APPS_CBCR,
1225 .has_sibling = 0,
1226 .base = &virt_bases[GCC_BASE],
1227 .c = {
1228 .parent = &blsp1_uart4_apps_clk_src.c,
1229 .dbg_name = "gcc_blsp1_uart4_apps_clk",
1230 .ops = &clk_ops_branch,
1231 CLK_INIT(gcc_blsp1_uart4_apps_clk.c),
1232 },
1233};
1234
1235static struct branch_clk gcc_blsp1_uart5_apps_clk = {
1236 .cbcr_reg = BLSP1_UART5_APPS_CBCR,
1237 .has_sibling = 0,
1238 .base = &virt_bases[GCC_BASE],
1239 .c = {
1240 .parent = &blsp1_uart5_apps_clk_src.c,
1241 .dbg_name = "gcc_blsp1_uart5_apps_clk",
1242 .ops = &clk_ops_branch,
1243 CLK_INIT(gcc_blsp1_uart5_apps_clk.c),
1244 },
1245};
1246
1247static struct branch_clk gcc_blsp1_uart6_apps_clk = {
1248 .cbcr_reg = BLSP1_UART6_APPS_CBCR,
1249 .has_sibling = 0,
1250 .base = &virt_bases[GCC_BASE],
1251 .c = {
1252 .parent = &blsp1_uart6_apps_clk_src.c,
1253 .dbg_name = "gcc_blsp1_uart6_apps_clk",
1254 .ops = &clk_ops_branch,
1255 CLK_INIT(gcc_blsp1_uart6_apps_clk.c),
1256 },
1257};
1258
1259static struct local_vote_clk gcc_boot_rom_ahb_clk = {
1260 .cbcr_reg = BOOT_ROM_AHB_CBCR,
1261 .vote_reg = APCS_CLOCK_BRANCH_ENA_VOTE,
1262 .en_mask = BIT(10),
1263 .base = &virt_bases[GCC_BASE],
1264 .c = {
1265 .dbg_name = "gcc_boot_rom_ahb_clk",
1266 .ops = &clk_ops_vote,
1267 CLK_INIT(gcc_boot_rom_ahb_clk.c),
1268 },
1269};
1270
1271static struct local_vote_clk gcc_ce1_ahb_clk = {
1272 .cbcr_reg = CE1_AHB_CBCR,
1273 .vote_reg = APCS_CLOCK_BRANCH_ENA_VOTE,
1274 .en_mask = BIT(3),
1275 .base = &virt_bases[GCC_BASE],
1276 .c = {
1277 .dbg_name = "gcc_ce1_ahb_clk",
1278 .ops = &clk_ops_vote,
1279 CLK_INIT(gcc_ce1_ahb_clk.c),
1280 },
1281};
1282
1283static struct local_vote_clk gcc_ce1_axi_clk = {
1284 .cbcr_reg = CE1_AXI_CBCR,
1285 .vote_reg = APCS_CLOCK_BRANCH_ENA_VOTE,
1286 .en_mask = BIT(4),
1287 .base = &virt_bases[GCC_BASE],
1288 .c = {
1289 .dbg_name = "gcc_ce1_axi_clk",
1290 .ops = &clk_ops_vote,
1291 CLK_INIT(gcc_ce1_axi_clk.c),
1292 },
1293};
1294
1295static struct local_vote_clk gcc_ce1_clk = {
1296 .cbcr_reg = CE1_CBCR,
1297 .vote_reg = APCS_CLOCK_BRANCH_ENA_VOTE,
1298 .en_mask = BIT(5),
1299 .base = &virt_bases[GCC_BASE],
1300 .c = {
1301 .dbg_name = "gcc_ce1_clk",
1302 .ops = &clk_ops_vote,
1303 CLK_INIT(gcc_ce1_clk.c),
1304 },
1305};
1306
1307static struct branch_clk gcc_copss_smmu_ahb_clk = {
1308 .cbcr_reg = COPSS_SMMU_AHB_CBCR,
1309 .has_sibling = 1,
1310 .base = &virt_bases[GCC_BASE],
1311 .c = {
1312 .dbg_name = "gcc_copss_smmu_ahb_clk",
1313 .ops = &clk_ops_branch,
1314 CLK_INIT(gcc_copss_smmu_ahb_clk.c),
1315 },
1316};
1317
1318static struct branch_clk gcc_lpss_smmu_ahb_clk = {
1319 .cbcr_reg = LPSS_SMMU_AHB_CBCR,
1320 .has_sibling = 1,
1321 .base = &virt_bases[GCC_BASE],
1322 .c = {
1323 .dbg_name = "gcc_lpss_smmu_ahb_clk",
1324 .ops = &clk_ops_branch,
1325 CLK_INIT(gcc_lpss_smmu_ahb_clk.c),
1326 },
1327};
1328
1329static struct branch_clk gcc_gp1_clk = {
1330 .cbcr_reg = GP1_CBCR,
1331 .has_sibling = 0,
1332 .base = &virt_bases[GCC_BASE],
1333 .c = {
1334 .parent = &gp1_clk_src.c,
1335 .dbg_name = "gcc_gp1_clk",
1336 .ops = &clk_ops_branch,
1337 CLK_INIT(gcc_gp1_clk.c),
1338 },
1339};
1340
1341static struct branch_clk gcc_gp2_clk = {
1342 .cbcr_reg = GP2_CBCR,
1343 .has_sibling = 0,
1344 .base = &virt_bases[GCC_BASE],
1345 .c = {
1346 .parent = &gp2_clk_src.c,
1347 .dbg_name = "gcc_gp2_clk",
1348 .ops = &clk_ops_branch,
1349 CLK_INIT(gcc_gp2_clk.c),
1350 },
1351};
1352
1353static struct branch_clk gcc_gp3_clk = {
1354 .cbcr_reg = GP3_CBCR,
1355 .has_sibling = 0,
1356 .base = &virt_bases[GCC_BASE],
1357 .c = {
1358 .parent = &gp3_clk_src.c,
1359 .dbg_name = "gcc_gp3_clk",
1360 .ops = &clk_ops_branch,
1361 CLK_INIT(gcc_gp3_clk.c),
1362 },
1363};
1364
1365static struct branch_clk gcc_lpass_q6_axi_clk = {
1366 .cbcr_reg = LPASS_Q6_AXI_CBCR,
1367 .has_sibling = 1,
1368 .base = &virt_bases[GCC_BASE],
Vikram Mulukutla2dfa8b12013-01-15 18:17:10 -08001369 /* FIXME: Remove this once simulation is fixed. */
1370 .halt_check = DELAY,
Vikram Mulukutlab13abe42012-10-03 11:38:48 -07001371 .c = {
1372 .dbg_name = "gcc_lpass_q6_axi_clk",
1373 .ops = &clk_ops_branch,
1374 CLK_INIT(gcc_lpass_q6_axi_clk.c),
1375 },
1376};
1377
1378static struct branch_clk gcc_mmss_noc_cfg_ahb_clk = {
1379 .cbcr_reg = MMSS_NOC_CFG_AHB_CBCR,
1380 .has_sibling = 1,
1381 .base = &virt_bases[GCC_BASE],
1382 .c = {
1383 .dbg_name = "gcc_mmss_noc_cfg_ahb_clk",
1384 .ops = &clk_ops_branch,
1385 CLK_INIT(gcc_mmss_noc_cfg_ahb_clk.c),
1386 },
1387};
1388
1389static struct branch_clk gcc_mss_cfg_ahb_clk = {
1390 .cbcr_reg = MSS_CFG_AHB_CBCR,
1391 .has_sibling = 1,
1392 .base = &virt_bases[GCC_BASE],
1393 .c = {
1394 .dbg_name = "gcc_mss_cfg_ahb_clk",
1395 .ops = &clk_ops_branch,
1396 CLK_INIT(gcc_mss_cfg_ahb_clk.c),
1397 },
1398};
1399
1400static struct branch_clk gcc_mss_q6_bimc_axi_clk = {
1401 .cbcr_reg = MSS_Q6_BIMC_AXI_CBCR,
1402 .has_sibling = 1,
1403 .base = &virt_bases[GCC_BASE],
1404 .c = {
1405 .dbg_name = "gcc_mss_q6_bimc_axi_clk",
1406 .ops = &clk_ops_branch,
1407 CLK_INIT(gcc_mss_q6_bimc_axi_clk.c),
1408 },
1409};
1410
1411static struct branch_clk gcc_pdm2_clk = {
1412 .cbcr_reg = PDM2_CBCR,
1413 .has_sibling = 0,
1414 .base = &virt_bases[GCC_BASE],
1415 .c = {
1416 .parent = &pdm2_clk_src.c,
1417 .dbg_name = "gcc_pdm2_clk",
1418 .ops = &clk_ops_branch,
1419 CLK_INIT(gcc_pdm2_clk.c),
1420 },
1421};
1422
1423static struct branch_clk gcc_pdm_ahb_clk = {
1424 .cbcr_reg = PDM_AHB_CBCR,
1425 .has_sibling = 1,
1426 .base = &virt_bases[GCC_BASE],
1427 .c = {
1428 .dbg_name = "gcc_pdm_ahb_clk",
1429 .ops = &clk_ops_branch,
1430 CLK_INIT(gcc_pdm_ahb_clk.c),
1431 },
1432};
1433
1434static struct local_vote_clk gcc_prng_ahb_clk = {
1435 .cbcr_reg = PRNG_AHB_CBCR,
1436 .vote_reg = APCS_CLOCK_BRANCH_ENA_VOTE,
1437 .en_mask = BIT(13),
1438 .base = &virt_bases[GCC_BASE],
1439 .c = {
1440 .dbg_name = "gcc_prng_ahb_clk",
1441 .ops = &clk_ops_vote,
1442 CLK_INIT(gcc_prng_ahb_clk.c),
1443 },
1444};
1445
1446static struct branch_clk gcc_sdcc1_ahb_clk = {
1447 .cbcr_reg = SDCC1_AHB_CBCR,
1448 .has_sibling = 1,
1449 .base = &virt_bases[GCC_BASE],
1450 .c = {
1451 .dbg_name = "gcc_sdcc1_ahb_clk",
1452 .ops = &clk_ops_branch,
1453 CLK_INIT(gcc_sdcc1_ahb_clk.c),
1454 },
1455};
1456
1457static struct branch_clk gcc_sdcc1_apps_clk = {
1458 .cbcr_reg = SDCC1_APPS_CBCR,
1459 .has_sibling = 0,
1460 .base = &virt_bases[GCC_BASE],
1461 .c = {
1462 .parent = &sdcc1_apps_clk_src.c,
1463 .dbg_name = "gcc_sdcc1_apps_clk",
1464 .ops = &clk_ops_branch,
1465 CLK_INIT(gcc_sdcc1_apps_clk.c),
1466 },
1467};
1468
1469static struct branch_clk gcc_sdcc2_ahb_clk = {
1470 .cbcr_reg = SDCC2_AHB_CBCR,
1471 .has_sibling = 1,
1472 .base = &virt_bases[GCC_BASE],
1473 .c = {
1474 .dbg_name = "gcc_sdcc2_ahb_clk",
1475 .ops = &clk_ops_branch,
1476 CLK_INIT(gcc_sdcc2_ahb_clk.c),
1477 },
1478};
1479
1480static struct branch_clk gcc_sdcc2_apps_clk = {
1481 .cbcr_reg = SDCC2_APPS_CBCR,
1482 .has_sibling = 0,
1483 .base = &virt_bases[GCC_BASE],
1484 .c = {
1485 .parent = &sdcc2_apps_clk_src.c,
1486 .dbg_name = "gcc_sdcc2_apps_clk",
1487 .ops = &clk_ops_branch,
1488 CLK_INIT(gcc_sdcc2_apps_clk.c),
1489 },
1490};
1491
1492static struct branch_clk gcc_usb2a_phy_sleep_clk = {
1493 .cbcr_reg = USB2A_PHY_SLEEP_CBCR,
1494 .has_sibling = 1,
1495 .base = &virt_bases[GCC_BASE],
1496 .c = {
1497 .dbg_name = "gcc_usb2a_phy_sleep_clk",
1498 .ops = &clk_ops_branch,
1499 CLK_INIT(gcc_usb2a_phy_sleep_clk.c),
1500 },
1501};
1502
1503static struct branch_clk gcc_usb_hs_ahb_clk = {
1504 .cbcr_reg = USB_HS_AHB_CBCR,
1505 .has_sibling = 1,
1506 .base = &virt_bases[GCC_BASE],
1507 .c = {
1508 .dbg_name = "gcc_usb_hs_ahb_clk",
1509 .ops = &clk_ops_branch,
1510 CLK_INIT(gcc_usb_hs_ahb_clk.c),
1511 },
1512};
1513
1514static struct branch_clk gcc_usb_hs_system_clk = {
1515 .cbcr_reg = USB_HS_SYSTEM_CBCR,
1516 .has_sibling = 0,
1517 .bcr_reg = USB_HS_BCR,
1518 .base = &virt_bases[GCC_BASE],
1519 .c = {
1520 .parent = &usb_hs_system_clk_src.c,
1521 .dbg_name = "gcc_usb_hs_system_clk",
1522 .ops = &clk_ops_branch,
1523 CLK_INIT(gcc_usb_hs_system_clk.c),
1524 },
1525};
1526
1527static struct clk_freq_tbl ftbl_csi0_1_clk[] = {
1528 F_MM(100000000, gpll0, 6, 0, 0),
1529 F_MM(200000000, mmpll0, 4, 0, 0),
1530 F_END,
1531};
1532
1533static struct rcg_clk csi0_clk_src = {
1534 .cmd_rcgr_reg = CSI0_CMD_RCGR,
1535 .set_rate = set_rate_hid,
1536 .freq_tbl = ftbl_csi0_1_clk,
1537 .current_freq = &rcg_dummy_freq,
1538 .base = &virt_bases[MMSS_BASE],
1539 .c = {
1540 .dbg_name = "csi0_clk_src",
1541 .ops = &clk_ops_rcg,
1542 VDD_DIG_FMAX_MAP2(LOW, 100000000, NOMINAL, 200000000),
1543 CLK_INIT(csi0_clk_src.c),
1544 },
1545};
1546
Vikram Mulukutlab13abe42012-10-03 11:38:48 -07001547static struct clk_freq_tbl ftbl_mmss_mmssnoc_axi_clk[] = {
1548 F_MM( 19200000, gcc_xo, 1, 0, 0),
1549 F_MM( 37500000, gpll0, 16, 0, 0),
1550 F_MM( 50000000, gpll0, 12, 0, 0),
1551 F_MM( 75000000, gpll0, 8, 0, 0),
1552 F_MM(100000000, gpll0, 6, 0, 0),
1553 F_MM(150000000, gpll0, 4, 0, 0),
1554 F_MM(200000000, mmpll0, 4, 0, 0),
1555 F_END,
1556};
1557
1558static struct rcg_clk axi_clk_src = {
1559 .cmd_rcgr_reg = AXI_CMD_RCGR,
1560 .set_rate = set_rate_hid,
1561 .freq_tbl = ftbl_mmss_mmssnoc_axi_clk,
1562 .current_freq = &rcg_dummy_freq,
1563 .base = &virt_bases[MMSS_BASE],
1564 .c = {
1565 .dbg_name = "axi_clk_src",
1566 .ops = &clk_ops_rcg,
1567 VDD_DIG_FMAX_MAP2(LOW, 100000000, NOMINAL, 200000000),
1568 CLK_INIT(axi_clk_src.c),
1569 },
1570};
1571
Vikram Mulukutlae1e5c482013-01-28 14:43:20 -08001572static DEFINE_CLK_VOTER(mdp_axi_clk_src, &axi_clk_src.c, 200000000);
1573static DEFINE_CLK_VOTER(mmssnoc_axi_clk_src, &axi_clk_src.c, 200000000);
1574
Vikram Mulukutlab13abe42012-10-03 11:38:48 -07001575static struct clk_freq_tbl ftbl_dsi_pclk_clk[] = {
1576 F_MDSS( 50000000, dsipll, 10, 0, 0),
1577 F_MDSS(103330000, dsipll, 9, 0, 0),
1578 F_END,
1579};
1580
1581static struct rcg_clk dsi_pclk_clk_src = {
1582 .cmd_rcgr_reg = DSI_PCLK_CMD_RCGR,
1583 .set_rate = set_rate_mnd,
1584 .freq_tbl = ftbl_dsi_pclk_clk,
1585 .current_freq = &rcg_dummy_freq,
1586 .base = &virt_bases[MMSS_BASE],
1587 .c = {
1588 .dbg_name = "dsi_pclk_clk_src",
1589 .ops = &clk_ops_rcg_mnd,
1590 VDD_DIG_FMAX_MAP2(LOW, 50000000, NOMINAL, 103330000),
1591 CLK_INIT(dsi_pclk_clk_src.c),
1592 },
1593};
1594
1595static struct clk_freq_tbl ftbl_oxili_gfx3d_clk[] = {
1596 F_MM( 19200000, gcc_xo, 1, 0, 0),
1597 F_MM( 37500000, gpll0, 16, 0, 0),
1598 F_MM( 50000000, gpll0, 12, 0, 0),
1599 F_MM( 75000000, gpll0, 8, 0, 0),
1600 F_MM(100000000, gpll0, 6, 0, 0),
1601 F_MM(150000000, gpll0, 4, 0, 0),
1602 F_MM(200000000, gpll0, 3, 0, 0),
1603 F_MM(300000000, gpll0, 2, 0, 0),
1604 F_MM(400000000, mmpll1, 3, 0, 0),
1605 F_END,
1606};
1607
1608static struct rcg_clk gfx3d_clk_src = {
1609 .cmd_rcgr_reg = GFX3D_CMD_RCGR,
1610 .set_rate = set_rate_hid,
1611 .freq_tbl = ftbl_oxili_gfx3d_clk,
1612 .current_freq = &rcg_dummy_freq,
1613 .base = &virt_bases[MMSS_BASE],
1614 .c = {
1615 .dbg_name = "gfx3d_clk_src",
1616 .ops = &clk_ops_rcg,
1617 VDD_DIG_FMAX_MAP3(LOW, 150000000, NOMINAL, 300000000, HIGH,
1618 400000000),
1619 CLK_INIT(gfx3d_clk_src.c),
1620 },
1621};
1622
1623static struct clk_freq_tbl ftbl_vfe_clk[] = {
1624 F_MM( 37500000, gpll0, 16, 0, 0),
1625 F_MM( 50000000, gpll0, 12, 0, 0),
1626 F_MM( 60000000, gpll0, 10, 0, 0),
1627 F_MM( 80000000, gpll0, 7.5, 0, 0),
1628 F_MM(100000000, gpll0, 6, 0, 0),
1629 F_MM(109090000, gpll0, 5.5, 0, 0),
1630 F_MM(133330000, gpll0, 4.5, 0, 0),
1631 F_MM(200000000, gpll0, 3, 0, 0),
1632 F_MM(228570000, mmpll0, 3.5, 0, 0),
1633 F_MM(266670000, mmpll0, 3, 0, 0),
1634 F_MM(320000000, mmpll0, 2.5, 0, 0),
1635 F_END,
1636};
1637
1638static struct rcg_clk vfe_clk_src = {
1639 .cmd_rcgr_reg = VFE_CMD_RCGR,
1640 .set_rate = set_rate_hid,
1641 .freq_tbl = ftbl_vfe_clk,
1642 .current_freq = &rcg_dummy_freq,
1643 .base = &virt_bases[MMSS_BASE],
1644 .c = {
1645 .dbg_name = "vfe_clk_src",
1646 .ops = &clk_ops_rcg,
1647 VDD_DIG_FMAX_MAP3(LOW, 133330000, NOMINAL, 266670000, HIGH,
1648 320000000),
1649 CLK_INIT(vfe_clk_src.c),
1650 },
1651};
1652
1653static struct rcg_clk csi1_clk_src = {
1654 .cmd_rcgr_reg = CSI1_CMD_RCGR,
1655 .set_rate = set_rate_hid,
1656 .freq_tbl = ftbl_csi0_1_clk,
1657 .current_freq = &rcg_dummy_freq,
1658 .base = &virt_bases[MMSS_BASE],
1659 .c = {
1660 .dbg_name = "csi1_clk_src",
1661 .ops = &clk_ops_rcg,
1662 VDD_DIG_FMAX_MAP2(LOW, 100000000, NOMINAL, 200000000),
1663 CLK_INIT(csi1_clk_src.c),
1664 },
1665};
1666
1667static struct clk_freq_tbl ftbl_csi0_1phytimer_clk[] = {
1668 F_MM(100000000, gpll0, 6, 0, 0),
1669 F_MM(200000000, mmpll0, 4, 0, 0),
1670 F_END,
1671};
1672
1673static struct rcg_clk csi0phytimer_clk_src = {
1674 .cmd_rcgr_reg = CSI0PHYTIMER_CMD_RCGR,
1675 .set_rate = set_rate_hid,
1676 .freq_tbl = ftbl_csi0_1phytimer_clk,
1677 .current_freq = &rcg_dummy_freq,
1678 .base = &virt_bases[MMSS_BASE],
1679 .c = {
1680 .dbg_name = "csi0phytimer_clk_src",
1681 .ops = &clk_ops_rcg,
1682 VDD_DIG_FMAX_MAP2(LOW, 100000000, NOMINAL, 200000000),
1683 CLK_INIT(csi0phytimer_clk_src.c),
1684 },
1685};
1686
1687static struct rcg_clk csi1phytimer_clk_src = {
1688 .cmd_rcgr_reg = CSI1PHYTIMER_CMD_RCGR,
1689 .set_rate = set_rate_hid,
1690 .freq_tbl = ftbl_csi0_1phytimer_clk,
1691 .current_freq = &rcg_dummy_freq,
1692 .base = &virt_bases[MMSS_BASE],
1693 .c = {
1694 .dbg_name = "csi1phytimer_clk_src",
1695 .ops = &clk_ops_rcg,
1696 VDD_DIG_FMAX_MAP2(LOW, 100000000, NOMINAL, 200000000),
1697 CLK_INIT(csi1phytimer_clk_src.c),
1698 },
1699};
1700
1701static struct clk_freq_tbl ftbl_dsi_clk[] = {
1702 F_MDSS(155000000, dsipll, 6, 0, 0),
1703 F_MDSS(310000000, dsipll, 3, 0, 0),
1704 F_END,
1705};
1706
1707static struct rcg_clk dsi_clk_src = {
1708 .cmd_rcgr_reg = DSI_CMD_RCGR,
1709 .set_rate = set_rate_mnd,
1710 .freq_tbl = ftbl_dsi_clk,
1711 .current_freq = &rcg_dummy_freq,
1712 .base = &virt_bases[MMSS_BASE],
1713 .c = {
1714 .dbg_name = "dsi_clk_src",
1715 .ops = &clk_ops_rcg_mnd,
1716 VDD_DIG_FMAX_MAP2(LOW, 155000000, NOMINAL, 310000000),
1717 CLK_INIT(dsi_clk_src.c),
1718 },
1719};
1720
1721static struct clk_freq_tbl ftbl_dsi_byte_clk[] = {
1722 F_MDSS( 62500000, dsipll, 12, 0, 0),
1723 F_MDSS(125000000, dsipll, 6, 0, 0),
1724 F_END,
1725};
1726
1727static struct rcg_clk dsi_byte_clk_src = {
1728 .cmd_rcgr_reg = DSI_BYTE_CMD_RCGR,
1729 .set_rate = set_rate_hid,
1730 .freq_tbl = ftbl_dsi_byte_clk,
1731 .current_freq = &rcg_dummy_freq,
1732 .base = &virt_bases[MMSS_BASE],
1733 .c = {
1734 .dbg_name = "dsi_byte_clk_src",
1735 .ops = &clk_ops_rcg,
1736 VDD_DIG_FMAX_MAP2(LOW, 62500000, NOMINAL, 125000000),
1737 CLK_INIT(dsi_byte_clk_src.c),
1738 },
1739};
1740
1741static struct clk_freq_tbl ftbl_dsi_esc_clk[] = {
1742 F_MM(19200000, gcc_xo, 1, 0, 0),
1743 F_END,
1744};
1745
1746static struct rcg_clk dsi_esc_clk_src = {
1747 .cmd_rcgr_reg = DSI_ESC_CMD_RCGR,
1748 .set_rate = set_rate_hid,
1749 .freq_tbl = ftbl_dsi_esc_clk,
1750 .current_freq = &rcg_dummy_freq,
1751 .base = &virt_bases[MMSS_BASE],
1752 .c = {
1753 .dbg_name = "dsi_esc_clk_src",
1754 .ops = &clk_ops_rcg,
1755 VDD_DIG_FMAX_MAP1(LOW, 19200000),
1756 CLK_INIT(dsi_esc_clk_src.c),
1757 },
1758};
1759
1760static struct clk_freq_tbl ftbl_mclk0_1_clk[] = {
1761 F_MM(66670000, gpll0, 9, 0, 0),
1762 F_END,
1763};
1764
1765static struct rcg_clk mclk0_clk_src = {
1766 .cmd_rcgr_reg = MCLK0_CMD_RCGR,
1767 .set_rate = set_rate_mnd,
1768 .freq_tbl = ftbl_mclk0_1_clk,
1769 .current_freq = &rcg_dummy_freq,
1770 .base = &virt_bases[MMSS_BASE],
1771 .c = {
1772 .dbg_name = "mclk0_clk_src",
1773 .ops = &clk_ops_rcg_mnd,
1774 VDD_DIG_FMAX_MAP1(LOW, 66670000),
1775 CLK_INIT(mclk0_clk_src.c),
1776 },
1777};
1778
1779static struct rcg_clk mclk1_clk_src = {
1780 .cmd_rcgr_reg = MCLK1_CMD_RCGR,
1781 .set_rate = set_rate_mnd,
1782 .freq_tbl = ftbl_mclk0_1_clk,
1783 .current_freq = &rcg_dummy_freq,
1784 .base = &virt_bases[MMSS_BASE],
1785 .c = {
1786 .dbg_name = "mclk1_clk_src",
1787 .ops = &clk_ops_rcg_mnd,
1788 VDD_DIG_FMAX_MAP1(LOW, 66670000),
1789 CLK_INIT(mclk1_clk_src.c),
1790 },
1791};
1792
1793static struct clk_freq_tbl ftbl_mdp_vsync_clk[] = {
1794 F_MM(19200000, gcc_xo, 1, 0, 0),
1795 F_END,
1796};
1797
1798static struct rcg_clk mdp_vsync_clk_src = {
1799 .cmd_rcgr_reg = MDP_VSYNC_CMD_RCGR,
1800 .set_rate = set_rate_hid,
1801 .freq_tbl = ftbl_mdp_vsync_clk,
1802 .current_freq = &rcg_dummy_freq,
1803 .base = &virt_bases[MMSS_BASE],
1804 .c = {
1805 .dbg_name = "mdp_vsync_clk_src",
1806 .ops = &clk_ops_rcg,
1807 VDD_DIG_FMAX_MAP1(LOW, 19200000),
1808 CLK_INIT(mdp_vsync_clk_src.c),
1809 },
1810};
1811
1812static struct branch_clk bimc_gfx_clk = {
1813 .cbcr_reg = BIMC_GFX_CBCR,
1814 .has_sibling = 1,
1815 .base = &virt_bases[MMSS_BASE],
Vikram Mulukutla2dfa8b12013-01-15 18:17:10 -08001816 /* FIXME: Remove this once simulation is fixed. */
1817 .halt_check = DELAY,
Vikram Mulukutlab13abe42012-10-03 11:38:48 -07001818 .c = {
1819 .dbg_name = "bimc_gfx_clk",
1820 .ops = &clk_ops_branch,
1821 CLK_INIT(bimc_gfx_clk.c),
1822 },
1823};
1824
1825static struct branch_clk csi0_clk = {
1826 .cbcr_reg = CSI0_CBCR,
1827 .has_sibling = 1,
1828 .base = &virt_bases[MMSS_BASE],
1829 .c = {
1830 .parent = &csi0_clk_src.c,
1831 .dbg_name = "csi0_clk",
1832 .ops = &clk_ops_branch,
1833 CLK_INIT(csi0_clk.c),
1834 },
1835};
1836
1837static struct branch_clk csi0phy_clk = {
1838 .cbcr_reg = CSI0PHY_CBCR,
1839 .has_sibling = 1,
1840 .base = &virt_bases[MMSS_BASE],
1841 .c = {
1842 .parent = &csi0_clk_src.c,
1843 .dbg_name = "csi0phy_clk",
1844 .ops = &clk_ops_branch,
1845 CLK_INIT(csi0phy_clk.c),
1846 },
1847};
1848
1849static struct branch_clk csi0phytimer_clk = {
1850 .cbcr_reg = CSI0PHYTIMER_CBCR,
1851 .has_sibling = 0,
1852 .base = &virt_bases[MMSS_BASE],
1853 .c = {
1854 .parent = &csi0phytimer_clk_src.c,
1855 .dbg_name = "csi0phytimer_clk",
1856 .ops = &clk_ops_branch,
1857 CLK_INIT(csi0phytimer_clk.c),
1858 },
1859};
1860
1861static struct branch_clk csi0pix_clk = {
1862 .cbcr_reg = CSI0PIX_CBCR,
1863 .has_sibling = 1,
1864 .base = &virt_bases[MMSS_BASE],
1865 .c = {
1866 .parent = &csi0_clk_src.c,
1867 .dbg_name = "csi0pix_clk",
1868 .ops = &clk_ops_branch,
1869 CLK_INIT(csi0pix_clk.c),
1870 },
1871};
1872
1873static struct branch_clk csi0rdi_clk = {
1874 .cbcr_reg = CSI0RDI_CBCR,
1875 .has_sibling = 1,
1876 .base = &virt_bases[MMSS_BASE],
1877 .c = {
1878 .parent = &csi0_clk_src.c,
1879 .dbg_name = "csi0rdi_clk",
1880 .ops = &clk_ops_branch,
1881 CLK_INIT(csi0rdi_clk.c),
1882 },
1883};
1884
1885static struct branch_clk csi1_clk = {
1886 .cbcr_reg = CSI1_CBCR,
1887 .has_sibling = 1,
1888 .base = &virt_bases[MMSS_BASE],
1889 .c = {
1890 .parent = &csi1_clk_src.c,
1891 .dbg_name = "csi1_clk",
1892 .ops = &clk_ops_branch,
1893 CLK_INIT(csi1_clk.c),
1894 },
1895};
1896
1897static struct branch_clk csi1phy_clk = {
1898 .cbcr_reg = CSI1PHY_CBCR,
1899 .has_sibling = 1,
1900 .base = &virt_bases[MMSS_BASE],
1901 .c = {
1902 .parent = &csi1_clk_src.c,
1903 .dbg_name = "csi1phy_clk",
1904 .ops = &clk_ops_branch,
1905 CLK_INIT(csi1phy_clk.c),
1906 },
1907};
1908
1909static struct branch_clk csi1phytimer_clk = {
1910 .cbcr_reg = CSI1PHYTIMER_CBCR,
1911 .has_sibling = 0,
1912 .base = &virt_bases[MMSS_BASE],
1913 .c = {
1914 .parent = &csi1phytimer_clk_src.c,
1915 .dbg_name = "csi1phytimer_clk",
1916 .ops = &clk_ops_branch,
1917 CLK_INIT(csi1phytimer_clk.c),
1918 },
1919};
1920
1921static struct branch_clk csi1pix_clk = {
1922 .cbcr_reg = CSI1PIX_CBCR,
1923 .has_sibling = 1,
1924 .base = &virt_bases[MMSS_BASE],
1925 .c = {
Vikram Mulukutlaa1d5c142013-01-16 10:30:12 -08001926 .parent = &csi1_clk_src.c,
Vikram Mulukutlab13abe42012-10-03 11:38:48 -07001927 .dbg_name = "csi1pix_clk",
1928 .ops = &clk_ops_branch,
1929 CLK_INIT(csi1pix_clk.c),
1930 },
1931};
1932
1933static struct branch_clk csi1rdi_clk = {
1934 .cbcr_reg = CSI1RDI_CBCR,
1935 .has_sibling = 1,
1936 .base = &virt_bases[MMSS_BASE],
1937 .c = {
Vikram Mulukutlaa1d5c142013-01-16 10:30:12 -08001938 .parent = &csi1_clk_src.c,
Vikram Mulukutlab13abe42012-10-03 11:38:48 -07001939 .dbg_name = "csi1rdi_clk",
1940 .ops = &clk_ops_branch,
1941 CLK_INIT(csi1rdi_clk.c),
1942 },
1943};
1944
1945static struct branch_clk csi_ahb_clk = {
1946 .cbcr_reg = CSI_AHB_CBCR,
1947 .has_sibling = 1,
1948 .base = &virt_bases[MMSS_BASE],
1949 .c = {
1950 .dbg_name = "csi_ahb_clk",
1951 .ops = &clk_ops_branch,
1952 CLK_INIT(csi_ahb_clk.c),
1953 },
1954};
1955
1956static struct branch_clk csi_vfe_clk = {
1957 .cbcr_reg = CSI_VFE_CBCR,
1958 .has_sibling = 1,
1959 .base = &virt_bases[MMSS_BASE],
1960 .c = {
1961 .parent = &vfe_clk_src.c,
1962 .dbg_name = "csi_vfe_clk",
1963 .ops = &clk_ops_branch,
1964 CLK_INIT(csi_vfe_clk.c),
1965 },
1966};
1967
1968static struct branch_clk dsi_clk = {
1969 .cbcr_reg = DSI_CBCR,
1970 .has_sibling = 0,
1971 .base = &virt_bases[MMSS_BASE],
1972 .c = {
1973 .parent = &dsi_clk_src.c,
1974 .dbg_name = "dsi_clk",
1975 .ops = &clk_ops_branch,
1976 CLK_INIT(dsi_clk.c),
1977 },
1978};
1979
1980static struct branch_clk dsi_ahb_clk = {
1981 .cbcr_reg = DSI_AHB_CBCR,
1982 .has_sibling = 1,
1983 .base = &virt_bases[MMSS_BASE],
1984 .c = {
1985 .dbg_name = "dsi_ahb_clk",
1986 .ops = &clk_ops_branch,
1987 CLK_INIT(dsi_ahb_clk.c),
1988 },
1989};
1990
1991static struct branch_clk dsi_byte_clk = {
1992 .cbcr_reg = DSI_BYTE_CBCR,
1993 .has_sibling = 0,
1994 .base = &virt_bases[MMSS_BASE],
1995 .c = {
1996 .parent = &dsi_byte_clk_src.c,
1997 .dbg_name = "dsi_byte_clk",
1998 .ops = &clk_ops_branch,
1999 CLK_INIT(dsi_byte_clk.c),
2000 },
2001};
2002
2003static struct branch_clk dsi_esc_clk = {
2004 .cbcr_reg = DSI_ESC_CBCR,
2005 .has_sibling = 0,
2006 .base = &virt_bases[MMSS_BASE],
2007 .c = {
2008 .parent = &dsi_esc_clk_src.c,
2009 .dbg_name = "dsi_esc_clk",
2010 .ops = &clk_ops_branch,
2011 CLK_INIT(dsi_esc_clk.c),
2012 },
2013};
2014
2015static struct branch_clk dsi_pclk_clk = {
2016 .cbcr_reg = DSI_PCLK_CBCR,
2017 .has_sibling = 1,
2018 .base = &virt_bases[MMSS_BASE],
2019 .c = {
2020 .parent = &dsi_pclk_clk_src.c,
2021 .dbg_name = "dsi_pclk_clk",
2022 .ops = &clk_ops_branch,
2023 CLK_INIT(dsi_pclk_clk.c),
2024 },
2025};
2026
2027static struct branch_clk gmem_gfx3d_clk = {
2028 .cbcr_reg = GMEM_GFX3D_CBCR,
2029 .has_sibling = 1,
2030 .base = &virt_bases[MMSS_BASE],
2031 .c = {
2032 .parent = &gfx3d_clk_src.c,
2033 .dbg_name = "gmem_gfx3d_clk",
2034 .ops = &clk_ops_branch,
2035 CLK_INIT(gmem_gfx3d_clk.c),
2036 },
2037};
2038
2039static struct branch_clk mclk0_clk = {
2040 .cbcr_reg = MCLK0_CBCR,
2041 .has_sibling = 0,
2042 .base = &virt_bases[MMSS_BASE],
2043 .c = {
2044 .parent = &mclk0_clk_src.c,
2045 .dbg_name = "mclk0_clk",
2046 .ops = &clk_ops_branch,
2047 CLK_INIT(mclk0_clk.c),
2048 },
2049};
2050
2051static struct branch_clk mclk1_clk = {
2052 .cbcr_reg = MCLK1_CBCR,
2053 .has_sibling = 0,
2054 .base = &virt_bases[MMSS_BASE],
2055 .c = {
2056 .parent = &mclk1_clk_src.c,
2057 .dbg_name = "mclk1_clk",
2058 .ops = &clk_ops_branch,
2059 CLK_INIT(mclk1_clk.c),
2060 },
2061};
2062
2063static struct branch_clk mdp_ahb_clk = {
2064 .cbcr_reg = MDP_AHB_CBCR,
2065 .has_sibling = 1,
2066 .base = &virt_bases[MMSS_BASE],
2067 .c = {
2068 .dbg_name = "mdp_ahb_clk",
2069 .ops = &clk_ops_branch,
2070 CLK_INIT(mdp_ahb_clk.c),
2071 },
2072};
2073
2074static struct branch_clk mdp_axi_clk = {
2075 .cbcr_reg = MDP_AXI_CBCR,
Vikram Mulukutlab13abe42012-10-03 11:38:48 -07002076 .base = &virt_bases[MMSS_BASE],
Vikram Mulukutla2dfa8b12013-01-15 18:17:10 -08002077 /* FIXME: Remove this once simulation is fixed. */
2078 .halt_check = DELAY,
Vikram Mulukutlab13abe42012-10-03 11:38:48 -07002079 .c = {
Vikram Mulukutlae1e5c482013-01-28 14:43:20 -08002080 .parent = &mdp_axi_clk_src.c,
Vikram Mulukutlab13abe42012-10-03 11:38:48 -07002081 .dbg_name = "mdp_axi_clk",
2082 .ops = &clk_ops_branch,
2083 CLK_INIT(mdp_axi_clk.c),
2084 },
2085};
2086
2087static struct branch_clk mdp_dsi_clk = {
2088 .cbcr_reg = MDP_DSI_CBCR,
2089 .has_sibling = 1,
2090 .base = &virt_bases[MMSS_BASE],
2091 .c = {
2092 .parent = &dsi_pclk_clk_src.c,
2093 .dbg_name = "mdp_dsi_clk",
2094 .ops = &clk_ops_branch,
2095 CLK_INIT(mdp_dsi_clk.c),
2096 },
2097};
2098
2099static struct branch_clk mdp_lcdc_clk = {
2100 .cbcr_reg = MDP_LCDC_CBCR,
2101 .has_sibling = 1,
2102 .base = &virt_bases[MMSS_BASE],
2103 .c = {
2104 .parent = &dsi_pclk_clk_src.c,
2105 .dbg_name = "mdp_lcdc_clk",
2106 .ops = &clk_ops_branch,
2107 CLK_INIT(mdp_lcdc_clk.c),
2108 },
2109};
2110
2111static struct branch_clk mdp_vsync_clk = {
2112 .cbcr_reg = MDP_VSYNC_CBCR,
2113 .has_sibling = 0,
2114 .base = &virt_bases[MMSS_BASE],
2115 .c = {
2116 .parent = &mdp_vsync_clk_src.c,
2117 .dbg_name = "mdp_vsync_clk",
2118 .ops = &clk_ops_branch,
2119 CLK_INIT(mdp_vsync_clk.c),
2120 },
2121};
2122
2123static struct branch_clk mmss_misc_ahb_clk = {
2124 .cbcr_reg = MMSS_MISC_AHB_CBCR,
2125 .has_sibling = 1,
2126 .base = &virt_bases[MMSS_BASE],
2127 .c = {
2128 .dbg_name = "mmss_misc_ahb_clk",
2129 .ops = &clk_ops_branch,
2130 CLK_INIT(mmss_misc_ahb_clk.c),
2131 },
2132};
2133
2134static struct branch_clk mmss_mmssnoc_axi_clk = {
2135 .cbcr_reg = MMSS_MMSSNOC_AXI_CBCR,
2136 .has_sibling = 1,
2137 .base = &virt_bases[MMSS_BASE],
2138 .c = {
2139 .parent = &axi_clk_src.c,
2140 .dbg_name = "mmss_mmssnoc_axi_clk",
2141 .ops = &clk_ops_branch,
2142 CLK_INIT(mmss_mmssnoc_axi_clk.c),
2143 },
2144};
2145
2146static struct branch_clk mmss_s0_axi_clk = {
2147 .cbcr_reg = MMSS_S0_AXI_CBCR,
2148 .has_sibling = 0,
2149 .base = &virt_bases[MMSS_BASE],
2150 .c = {
Vikram Mulukutlae1e5c482013-01-28 14:43:20 -08002151 .parent = &mmssnoc_axi_clk_src.c,
Vikram Mulukutlab13abe42012-10-03 11:38:48 -07002152 .dbg_name = "mmss_s0_axi_clk",
2153 .ops = &clk_ops_branch,
2154 CLK_INIT(mmss_s0_axi_clk.c),
2155 .depends = &mmss_mmssnoc_axi_clk.c,
2156 },
2157};
2158
Vikram Mulukutlab13abe42012-10-03 11:38:48 -07002159static struct branch_clk mmss_mmssnoc_bto_ahb_clk = {
2160 .cbcr_reg = MMSS_MMSSNOC_BTO_AHB_CBCR,
2161 .has_sibling = 1,
2162 .base = &virt_bases[MMSS_BASE],
2163 .c = {
2164 .dbg_name = "mmss_mmssnoc_bto_ahb_clk",
2165 .ops = &clk_ops_branch,
2166 CLK_INIT(mmss_mmssnoc_bto_ahb_clk.c),
2167 },
2168};
2169
2170static struct branch_clk oxili_ahb_clk = {
2171 .cbcr_reg = OXILI_AHB_CBCR,
2172 .has_sibling = 1,
2173 .base = &virt_bases[MMSS_BASE],
2174 .c = {
2175 .dbg_name = "oxili_ahb_clk",
2176 .ops = &clk_ops_branch,
2177 CLK_INIT(oxili_ahb_clk.c),
2178 },
2179};
2180
2181static struct branch_clk oxili_gfx3d_clk = {
2182 .cbcr_reg = OXILI_GFX3D_CBCR,
2183 .has_sibling = 0,
2184 .base = &virt_bases[MMSS_BASE],
2185 .c = {
2186 .parent = &gfx3d_clk_src.c,
2187 .dbg_name = "oxili_gfx3d_clk",
2188 .ops = &clk_ops_branch,
2189 CLK_INIT(oxili_gfx3d_clk.c),
2190 },
2191};
2192
2193static struct branch_clk vfe_clk = {
2194 .cbcr_reg = VFE_CBCR,
2195 .has_sibling = 1,
2196 .base = &virt_bases[MMSS_BASE],
2197 .c = {
2198 .parent = &vfe_clk_src.c,
2199 .dbg_name = "vfe_clk",
2200 .ops = &clk_ops_branch,
2201 CLK_INIT(vfe_clk.c),
2202 },
2203};
2204
2205static struct branch_clk vfe_ahb_clk = {
2206 .cbcr_reg = VFE_AHB_CBCR,
2207 .has_sibling = 1,
2208 .base = &virt_bases[MMSS_BASE],
2209 .c = {
2210 .dbg_name = "vfe_ahb_clk",
2211 .ops = &clk_ops_branch,
2212 CLK_INIT(vfe_ahb_clk.c),
2213 },
2214};
2215
2216static struct branch_clk vfe_axi_clk = {
2217 .cbcr_reg = VFE_AXI_CBCR,
2218 .has_sibling = 1,
2219 .base = &virt_bases[MMSS_BASE],
Vikram Mulukutla2dfa8b12013-01-15 18:17:10 -08002220 /* FIXME: Remove this once simulation is fixed. */
2221 .halt_check = DELAY,
Vikram Mulukutlab13abe42012-10-03 11:38:48 -07002222 .c = {
2223 .parent = &axi_clk_src.c,
2224 .dbg_name = "vfe_axi_clk",
2225 .ops = &clk_ops_branch,
2226 CLK_INIT(vfe_axi_clk.c),
2227 },
2228};
2229
2230static struct clk_freq_tbl ftbl_audio_core_lpaif_clk[] = {
2231 F_LPASS( 512000, lpapll0, 16, 1, 60),
2232 F_LPASS( 768000, lpapll0, 16, 1, 40),
2233 F_LPASS( 1024000, lpapll0, 16, 1, 30),
2234 F_LPASS( 1536000, lpapll0, 16, 1, 20),
2235 F_LPASS( 2048000, lpapll0, 16, 1, 15),
2236 F_LPASS( 3072000, lpapll0, 16, 1, 10),
2237 F_LPASS( 4096000, lpapll0, 15, 1, 8),
2238 F_LPASS( 6144000, lpapll0, 10, 1, 8),
2239 F_LPASS( 8192000, lpapll0, 15, 1, 4),
2240 F_LPASS(12288000, lpapll0, 10, 1, 4),
2241 F_END,
2242};
2243
2244static struct rcg_clk lpaif_pri_clk_src = {
2245 .cmd_rcgr_reg = LPAIF_PRI_CMD_RCGR,
2246 .set_rate = set_rate_mnd,
2247 .freq_tbl = ftbl_audio_core_lpaif_clk,
2248 .current_freq = &rcg_dummy_freq,
2249 .base = &virt_bases[LPASS_BASE],
2250 .c = {
2251 .dbg_name = "lpaif_pri_clk_src",
2252 .ops = &clk_ops_rcg_mnd,
2253 VDD_DIG_FMAX_MAP2(LOW, 12290000, NOMINAL, 24580000),
2254 CLK_INIT(lpaif_pri_clk_src.c),
2255 },
2256};
2257
2258static struct rcg_clk lpaif_quad_clk_src = {
2259 .cmd_rcgr_reg = LPAIF_QUAD_CMD_RCGR,
2260 .set_rate = set_rate_mnd,
2261 .freq_tbl = ftbl_audio_core_lpaif_clk,
2262 .current_freq = &rcg_dummy_freq,
2263 .base = &virt_bases[LPASS_BASE],
2264 .c = {
2265 .dbg_name = "lpaif_quad_clk_src",
2266 .ops = &clk_ops_rcg_mnd,
2267 VDD_DIG_FMAX_MAP2(LOW, 12290000, NOMINAL, 24580000),
2268 CLK_INIT(lpaif_quad_clk_src.c),
2269 },
2270};
2271
2272static struct rcg_clk lpaif_sec_clk_src = {
2273 .cmd_rcgr_reg = LPAIF_SEC_CMD_RCGR,
2274 .set_rate = set_rate_mnd,
2275 .freq_tbl = ftbl_audio_core_lpaif_clk,
2276 .current_freq = &rcg_dummy_freq,
2277 .base = &virt_bases[LPASS_BASE],
2278 .c = {
2279 .dbg_name = "lpaif_sec_clk_src",
2280 .ops = &clk_ops_rcg_mnd,
2281 VDD_DIG_FMAX_MAP2(LOW, 12290000, NOMINAL, 24580000),
2282 CLK_INIT(lpaif_sec_clk_src.c),
2283 },
2284};
2285
2286static struct rcg_clk lpaif_spkr_clk_src = {
2287 .cmd_rcgr_reg = LPAIF_SPKR_CMD_RCGR,
2288 .set_rate = set_rate_mnd,
2289 .freq_tbl = ftbl_audio_core_lpaif_clk,
2290 .current_freq = &rcg_dummy_freq,
2291 .base = &virt_bases[LPASS_BASE],
2292 .c = {
2293 .dbg_name = "lpaif_spkr_clk_src",
2294 .ops = &clk_ops_rcg_mnd,
2295 VDD_DIG_FMAX_MAP2(LOW, 12290000, NOMINAL, 24580000),
2296 CLK_INIT(lpaif_spkr_clk_src.c),
2297 },
2298};
2299
2300static struct rcg_clk lpaif_ter_clk_src = {
2301 .cmd_rcgr_reg = LPAIF_TER_CMD_RCGR,
2302 .set_rate = set_rate_mnd,
2303 .freq_tbl = ftbl_audio_core_lpaif_clk,
2304 .current_freq = &rcg_dummy_freq,
2305 .base = &virt_bases[LPASS_BASE],
2306 .c = {
2307 .dbg_name = "lpaif_ter_clk_src",
2308 .ops = &clk_ops_rcg_mnd,
2309 VDD_DIG_FMAX_MAP2(LOW, 12290000, NOMINAL, 24580000),
2310 CLK_INIT(lpaif_ter_clk_src.c),
2311 },
2312};
2313
2314static struct clk_freq_tbl ftbl_audio_core_lpaif_pcm0_1_clk[] = {
2315 F_LPASS( 512000, lpapll0, 16, 1, 60),
2316 F_LPASS( 768000, lpapll0, 16, 1, 40),
2317 F_LPASS(1024000, lpapll0, 16, 1, 30),
2318 F_LPASS(1536000, lpapll0, 16, 1, 20),
2319 F_LPASS(2048000, lpapll0, 16, 1, 15),
2320 F_LPASS(3072000, lpapll0, 16, 1, 10),
2321 F_LPASS(4096000, lpapll0, 15, 1, 8),
2322 F_LPASS(6144000, lpapll0, 10, 1, 8),
2323 F_LPASS(8192000, lpapll0, 15, 1, 4),
2324 F_END,
2325};
2326
2327static struct rcg_clk lpaif_pcm0_clk_src = {
2328 .cmd_rcgr_reg = LPAIF_PCM0_CMD_RCGR,
2329 .set_rate = set_rate_mnd,
2330 .freq_tbl = ftbl_audio_core_lpaif_pcm0_1_clk,
2331 .current_freq = &rcg_dummy_freq,
2332 .base = &virt_bases[LPASS_BASE],
2333 .c = {
2334 .dbg_name = "lpaif_pcm0_clk_src",
2335 .ops = &clk_ops_rcg_mnd,
2336 VDD_DIG_FMAX_MAP2(LOW, 4100000, NOMINAL, 8192000),
2337 CLK_INIT(lpaif_pcm0_clk_src.c),
2338 },
2339};
2340
2341static struct rcg_clk lpaif_pcm1_clk_src = {
2342 .cmd_rcgr_reg = LPAIF_PCM1_CMD_RCGR,
2343 .set_rate = set_rate_mnd,
2344 .freq_tbl = ftbl_audio_core_lpaif_pcm0_1_clk,
2345 .current_freq = &rcg_dummy_freq,
2346 .base = &virt_bases[LPASS_BASE],
2347 .c = {
2348 .dbg_name = "lpaif_pcm1_clk_src",
2349 .ops = &clk_ops_rcg_mnd,
2350 VDD_DIG_FMAX_MAP2(LOW, 4100000, NOMINAL, 8192000),
2351 CLK_INIT(lpaif_pcm1_clk_src.c),
2352 },
2353};
2354
2355static struct rcg_clk lpaif_pcmoe_clk_src = {
2356 .cmd_rcgr_reg = LPAIF_PCMOE_CMD_RCGR,
2357 .set_rate = set_rate_mnd,
2358 .freq_tbl = ftbl_audio_core_lpaif_pcm0_1_clk,
2359 .current_freq = &rcg_dummy_freq,
2360 .base = &virt_bases[LPASS_BASE],
2361 .c = {
2362 .dbg_name = "lpaif_pcmoe_clk_src",
2363 .ops = &clk_ops_rcg_mnd,
2364 VDD_DIG_FMAX_MAP2(LOW, 6140000, NOMINAL, 12290000),
2365 CLK_INIT(lpaif_pcmoe_clk_src.c),
2366 },
2367};
2368
2369static struct clk_freq_tbl ftbl_audio_core_slimbus_core_clock[] = {
2370 F_LPASS(24576000, lpapll0, 4, 1, 5),
2371 F_END
2372};
2373
2374static struct rcg_clk audio_core_slimbus_core_clk_src = {
2375 .cmd_rcgr_reg = SLIMBUS_CMD_RCGR,
2376 .set_rate = set_rate_mnd,
2377 .freq_tbl = ftbl_audio_core_slimbus_core_clock,
2378 .current_freq = &rcg_dummy_freq,
2379 .base = &virt_bases[LPASS_BASE],
2380 .c = {
2381 .dbg_name = "audio_core_slimbus_core_clk_src",
2382 .ops = &clk_ops_rcg_mnd,
2383 VDD_DIG_FMAX_MAP2(LOW, 12935000, NOMINAL, 25869000),
2384 CLK_INIT(audio_core_slimbus_core_clk_src.c),
2385 },
2386};
2387
2388static struct branch_clk audio_core_slimbus_core_clk = {
2389 .cbcr_reg = AUDIO_CORE_SLIMBUS_CORE_CBCR,
2390 .base = &virt_bases[LPASS_BASE],
2391 .c = {
2392 .parent = &audio_core_slimbus_core_clk_src.c,
2393 .dbg_name = "audio_core_slimbus_core_clk",
2394 .ops = &clk_ops_branch,
2395 CLK_INIT(audio_core_slimbus_core_clk.c),
2396 },
2397};
2398
2399static struct branch_clk audio_core_ixfabric_clk = {
2400 .cbcr_reg = AUDIO_CORE_IXFABRIC_CBCR,
2401 .has_sibling = 1,
2402 .base = &virt_bases[LPASS_BASE],
2403 .c = {
2404 .dbg_name = "audio_core_ixfabric_clk",
2405 .ops = &clk_ops_branch,
2406 CLK_INIT(audio_core_ixfabric_clk.c),
2407 },
2408};
2409
2410static struct branch_clk audio_wrapper_br_clk = {
2411 .cbcr_reg = AUDIO_WRAPPER_BR_CBCR,
2412 .has_sibling = 1,
2413 .base = &virt_bases[LPASS_BASE],
2414 .c = {
2415 .dbg_name = "audio_wrapper_br_clk",
2416 .ops = &clk_ops_branch,
2417 CLK_INIT(audio_wrapper_br_clk.c),
2418 },
2419};
2420
2421static struct branch_clk q6ss_ahb_lfabif_clk = {
2422 .cbcr_reg = Q6SS_AHB_LFABIF_CBCR,
2423 .has_sibling = 1,
2424 .base = &virt_bases[LPASS_BASE],
2425 .c = {
2426 .dbg_name = "q6ss_ahb_lfabif_clk",
2427 .ops = &clk_ops_branch,
2428 CLK_INIT(q6ss_ahb_lfabif_clk.c),
2429 },
2430};
2431
2432static struct branch_clk q6ss_ahbm_clk = {
2433 .cbcr_reg = Q6SS_AHBM_CBCR,
2434 .has_sibling = 1,
2435 .base = &virt_bases[LPASS_BASE],
2436 .c = {
2437 .dbg_name = "q6ss_ahbm_clk",
2438 .ops = &clk_ops_branch,
2439 CLK_INIT(q6ss_ahbm_clk.c),
2440 },
2441};
2442
2443static struct branch_clk q6ss_xo_clk = {
2444 .cbcr_reg = Q6SS_XO_CBCR,
2445 .has_sibling = 1,
2446 .bcr_reg = LPASS_Q6SS_BCR,
2447 .base = &virt_bases[LPASS_BASE],
2448 .c = {
2449 .parent = &gcc_xo_clk_src.c,
2450 .dbg_name = "q6ss_xo_clk",
2451 .ops = &clk_ops_branch,
2452 CLK_INIT(q6ss_xo_clk.c),
2453 },
2454};
2455
2456static struct branch_clk audio_core_lpaif_pcm_data_oe_clk = {
2457 .cbcr_reg = AUDIO_CORE_LPAIF_PCM_DATA_OE_CBCR,
2458 .has_sibling = 0,
2459 .base = &virt_bases[LPASS_BASE],
2460 .c = {
2461 .parent = &lpaif_pcmoe_clk_src.c,
2462 .dbg_name = "audio_core_lpaif_pcm_data_oe_clk",
2463 .ops = &clk_ops_branch,
2464 CLK_INIT(audio_core_lpaif_pcm_data_oe_clk.c),
2465 },
2466};
2467
2468static struct branch_clk audio_core_lpaif_pri_ebit_clk = {
2469 .cbcr_reg = AUDIO_CORE_LPAIF_PRI_EBIT_CBCR,
2470 .has_sibling = 0,
2471 .base = &virt_bases[LPASS_BASE],
2472 .c = {
2473 .dbg_name = "audio_core_lpaif_pri_ebit_clk",
2474 .ops = &clk_ops_branch,
2475 CLK_INIT(audio_core_lpaif_pri_ebit_clk.c),
2476 },
2477};
2478
2479static struct branch_clk audio_core_lpaif_pri_ibit_clk = {
2480 .cbcr_reg = AUDIO_CORE_LPAIF_PRI_IBIT_CBCR,
2481 .has_sibling = 0,
2482 .max_div = 511,
2483 .base = &virt_bases[LPASS_BASE],
2484 .c = {
2485 .parent = &lpaif_pri_clk_src.c,
2486 .dbg_name = "audio_core_lpaif_pri_ibit_clk",
2487 .ops = &clk_ops_branch,
2488 CLK_INIT(audio_core_lpaif_pri_ibit_clk.c),
2489 },
2490};
2491
2492static struct branch_clk audio_core_lpaif_pri_osr_clk = {
2493 .cbcr_reg = AUDIO_CORE_LPAIF_PRI_OSR_CBCR,
2494 .has_sibling = 0,
2495 .base = &virt_bases[LPASS_BASE],
2496 .c = {
2497 .parent = &lpaif_pri_clk_src.c,
2498 .dbg_name = "audio_core_lpaif_pri_osr_clk",
2499 .ops = &clk_ops_branch,
2500 CLK_INIT(audio_core_lpaif_pri_osr_clk.c),
2501 },
2502};
2503
2504static struct branch_clk audio_core_lpaif_pcm0_ebit_clk = {
2505 .cbcr_reg = AUDIO_CORE_LPAIF_PCM0_EBIT_CBCR,
2506 .has_sibling = 0,
2507 .base = &virt_bases[LPASS_BASE],
2508 .c = {
2509 .dbg_name = "audio_core_lpaif_pcm0_ebit_clk",
2510 .ops = &clk_ops_branch,
2511 CLK_INIT(audio_core_lpaif_pcm0_ebit_clk.c),
2512 },
2513};
2514
2515static struct branch_clk audio_core_lpaif_pcm0_ibit_clk = {
2516 .cbcr_reg = AUDIO_CORE_LPAIF_PCM0_IBIT_CBCR,
2517 .has_sibling = 0,
2518 .base = &virt_bases[LPASS_BASE],
2519 .c = {
2520 .parent = &lpaif_pcm0_clk_src.c,
2521 .dbg_name = "audio_core_lpaif_pcm0_ibit_clk",
2522 .ops = &clk_ops_branch,
2523 CLK_INIT(audio_core_lpaif_pcm0_ibit_clk.c),
2524 },
2525};
2526
2527static struct branch_clk audio_core_lpaif_quad_ebit_clk = {
2528 .cbcr_reg = AUDIO_CORE_LPAIF_QUAD_EBIT_CBCR,
2529 .has_sibling = 0,
2530 .base = &virt_bases[LPASS_BASE],
2531 .c = {
2532 .dbg_name = "audio_core_lpaif_quad_ebit_clk",
2533 .ops = &clk_ops_branch,
2534 CLK_INIT(audio_core_lpaif_quad_ebit_clk.c),
2535 },
2536};
2537
2538static struct branch_clk audio_core_lpaif_quad_ibit_clk = {
2539 .cbcr_reg = AUDIO_CORE_LPAIF_QUAD_IBIT_CBCR,
2540 .has_sibling = 0,
2541 .max_div = 511,
2542 .base = &virt_bases[LPASS_BASE],
2543 .c = {
2544 .parent = &lpaif_quad_clk_src.c,
2545 .dbg_name = "audio_core_lpaif_quad_ibit_clk",
2546 .ops = &clk_ops_branch,
2547 CLK_INIT(audio_core_lpaif_quad_ibit_clk.c),
2548 },
2549};
2550
2551static struct branch_clk audio_core_lpaif_quad_osr_clk = {
2552 .cbcr_reg = AUDIO_CORE_LPAIF_QUAD_OSR_CBCR,
2553 .has_sibling = 0,
2554 .base = &virt_bases[LPASS_BASE],
2555 .c = {
2556 .parent = &lpaif_quad_clk_src.c,
2557 .dbg_name = "audio_core_lpaif_quad_osr_clk",
2558 .ops = &clk_ops_branch,
2559 CLK_INIT(audio_core_lpaif_quad_osr_clk.c),
2560 },
2561};
2562
2563static struct branch_clk audio_core_lpaif_sec_ebit_clk = {
2564 .cbcr_reg = AUDIO_CORE_LPAIF_SEC_EBIT_CBCR,
2565 .has_sibling = 0,
2566 .base = &virt_bases[LPASS_BASE],
2567 .c = {
2568 .dbg_name = "audio_core_lpaif_sec_ebit_clk",
2569 .ops = &clk_ops_branch,
2570 CLK_INIT(audio_core_lpaif_sec_ebit_clk.c),
2571 },
2572};
2573
2574static struct branch_clk audio_core_lpaif_sec_ibit_clk = {
2575 .cbcr_reg = AUDIO_CORE_LPAIF_SEC_IBIT_CBCR,
2576 .has_sibling = 0,
2577 .max_div = 511,
2578 .base = &virt_bases[LPASS_BASE],
2579 .c = {
2580 .parent = &lpaif_sec_clk_src.c,
2581 .dbg_name = "audio_core_lpaif_sec_ibit_clk",
2582 .ops = &clk_ops_branch,
2583 CLK_INIT(audio_core_lpaif_sec_ibit_clk.c),
2584 },
2585};
2586
2587static struct branch_clk audio_core_lpaif_sec_osr_clk = {
2588 .cbcr_reg = AUDIO_CORE_LPAIF_SEC_OSR_CBCR,
2589 .has_sibling = 0,
2590 .base = &virt_bases[LPASS_BASE],
2591 .c = {
2592 .parent = &lpaif_sec_clk_src.c,
2593 .dbg_name = "audio_core_lpaif_sec_osr_clk",
2594 .ops = &clk_ops_branch,
2595 CLK_INIT(audio_core_lpaif_sec_osr_clk.c),
2596 },
2597};
2598
2599static struct branch_clk audio_core_lpaif_pcm1_ebit_clk = {
2600 .cbcr_reg = AUDIO_CORE_LPAIF_PCM1_EBIT_CBCR,
2601 .has_sibling = 0,
2602 .base = &virt_bases[LPASS_BASE],
2603 .c = {
2604 .dbg_name = "audio_core_lpaif_pcm1_ebit_clk",
2605 .ops = &clk_ops_branch,
2606 CLK_INIT(audio_core_lpaif_pcm1_ebit_clk.c),
2607 },
2608};
2609
2610static struct branch_clk audio_core_lpaif_pcm1_ibit_clk = {
2611 .cbcr_reg = AUDIO_CORE_LPAIF_PCM1_IBIT_CBCR,
2612 .has_sibling = 0,
2613 .base = &virt_bases[LPASS_BASE],
2614 .c = {
2615 .parent = &lpaif_pcm1_clk_src.c,
2616 .dbg_name = "audio_core_lpaif_pcm1_ibit_clk",
2617 .ops = &clk_ops_branch,
2618 CLK_INIT(audio_core_lpaif_pcm1_ibit_clk.c),
2619 },
2620};
2621
2622static struct branch_clk audio_core_lpaif_codec_spkr_ebit_clk = {
2623 .cbcr_reg = AUDIO_CORE_LPAIF_CODEC_SPKR_EBIT_CBCR,
2624 .has_sibling = 0,
2625 .base = &virt_bases[LPASS_BASE],
2626 .c = {
2627 .dbg_name = "audio_core_lpaif_codec_spkr_ebit_clk",
2628 .ops = &clk_ops_branch,
2629 CLK_INIT(audio_core_lpaif_codec_spkr_ebit_clk.c),
2630 },
2631};
2632
2633static struct branch_clk audio_core_lpaif_codec_spkr_ibit_clk = {
2634 .cbcr_reg = AUDIO_CORE_LPAIF_CODEC_SPKR_IBIT_CBCR,
2635 .has_sibling = 1,
2636 .max_div = 511,
2637 .base = &virt_bases[LPASS_BASE],
2638 .c = {
2639 .parent = &lpaif_spkr_clk_src.c,
2640 .dbg_name = "audio_core_lpaif_codec_spkr_ibit_clk",
2641 .ops = &clk_ops_branch,
2642 CLK_INIT(audio_core_lpaif_codec_spkr_ibit_clk.c),
2643 },
2644};
2645
2646static struct branch_clk audio_core_lpaif_codec_spkr_osr_clk = {
2647 .cbcr_reg = AUDIO_CORE_LPAIF_CODEC_SPKR_OSR_CBCR,
2648 .has_sibling = 1,
2649 .base = &virt_bases[LPASS_BASE],
2650 .c = {
2651 .parent = &lpaif_spkr_clk_src.c,
2652 .dbg_name = "audio_core_lpaif_codec_spkr_osr_clk",
2653 .ops = &clk_ops_branch,
2654 CLK_INIT(audio_core_lpaif_codec_spkr_osr_clk.c),
2655 },
2656};
2657
2658static struct branch_clk audio_core_lpaif_ter_ebit_clk = {
2659 .cbcr_reg = AUDIO_CORE_LPAIF_TER_EBIT_CBCR,
2660 .has_sibling = 0,
2661 .base = &virt_bases[LPASS_BASE],
2662 .c = {
2663 .dbg_name = "audio_core_lpaif_ter_ebit_clk",
2664 .ops = &clk_ops_branch,
2665 CLK_INIT(audio_core_lpaif_ter_ebit_clk.c),
2666 },
2667};
2668
2669static struct branch_clk audio_core_lpaif_ter_ibit_clk = {
2670 .cbcr_reg = AUDIO_CORE_LPAIF_TER_IBIT_CBCR,
2671 .has_sibling = 0,
2672 .max_div = 511,
2673 .base = &virt_bases[LPASS_BASE],
2674 .c = {
2675 .parent = &lpaif_ter_clk_src.c,
2676 .dbg_name = "audio_core_lpaif_ter_ibit_clk",
2677 .ops = &clk_ops_branch,
2678 CLK_INIT(audio_core_lpaif_ter_ibit_clk.c),
2679 },
2680};
2681
2682static struct branch_clk audio_core_lpaif_ter_osr_clk = {
2683 .cbcr_reg = AUDIO_CORE_LPAIF_TER_OSR_CBCR,
2684 .has_sibling = 0,
2685 .base = &virt_bases[LPASS_BASE],
2686 .c = {
2687 .parent = &lpaif_ter_clk_src.c,
2688 .dbg_name = "audio_core_lpaif_ter_osr_clk",
2689 .ops = &clk_ops_branch,
2690 CLK_INIT(audio_core_lpaif_ter_osr_clk.c),
2691 },
2692};
2693
2694#ifdef CONFIG_DEBUG_FS
2695
2696struct measure_mux_entry {
2697 struct clk *c;
2698 int base;
2699 u32 debug_mux;
2700};
2701
2702static struct measure_mux_entry measure_mux[] = {
2703 { &snoc_clk.c, GCC_BASE, 0x0000},
2704 { &cnoc_clk.c, GCC_BASE, 0x0008},
2705 { &gcc_copss_smmu_ahb_clk.c, GCC_BASE, 0x000c},
2706 { &gcc_lpss_smmu_ahb_clk.c, GCC_BASE, 0x000d},
2707 { &pnoc_clk.c, GCC_BASE, 0x0010},
2708 { &gcc_mmss_noc_cfg_ahb_clk.c, GCC_BASE, 0x002a},
2709 { &gcc_mss_cfg_ahb_clk.c, GCC_BASE, 0x0030},
2710 { &gcc_mss_q6_bimc_axi_clk.c, GCC_BASE, 0x0031},
2711 { &gcc_usb_hs_system_clk.c, GCC_BASE, 0x0060},
2712 { &gcc_usb_hs_ahb_clk.c, GCC_BASE, 0x0061},
2713 { &gcc_usb2a_phy_sleep_clk.c, GCC_BASE, 0x0063},
2714 { &gcc_sdcc1_apps_clk.c, GCC_BASE, 0x0068},
2715 { &gcc_sdcc1_ahb_clk.c, GCC_BASE, 0x0069},
2716 { &gcc_sdcc2_apps_clk.c, GCC_BASE, 0x0070},
2717 { &gcc_sdcc2_ahb_clk.c, GCC_BASE, 0x0071},
2718 { &gcc_blsp1_ahb_clk.c, GCC_BASE, 0x0088},
2719 {&gcc_blsp1_qup1_spi_apps_clk.c, GCC_BASE, 0x008a},
2720 {&gcc_blsp1_qup1_i2c_apps_clk.c, GCC_BASE, 0x008b},
2721 { &gcc_blsp1_uart1_apps_clk.c, GCC_BASE, 0x008c},
2722 {&gcc_blsp1_qup2_spi_apps_clk.c, GCC_BASE, 0x008e},
2723 {&gcc_blsp1_qup2_i2c_apps_clk.c, GCC_BASE, 0x0090},
2724 { &gcc_blsp1_uart2_apps_clk.c, GCC_BASE, 0x0091},
2725 {&gcc_blsp1_qup3_spi_apps_clk.c, GCC_BASE, 0x0093},
2726 {&gcc_blsp1_qup3_i2c_apps_clk.c, GCC_BASE, 0x0094},
2727 { &gcc_blsp1_uart3_apps_clk.c, GCC_BASE, 0x0095},
2728 {&gcc_blsp1_qup4_spi_apps_clk.c, GCC_BASE, 0x0098},
2729 {&gcc_blsp1_qup4_i2c_apps_clk.c, GCC_BASE, 0x0099},
2730 { &gcc_blsp1_uart4_apps_clk.c, GCC_BASE, 0x009a},
2731 {&gcc_blsp1_qup5_spi_apps_clk.c, GCC_BASE, 0x009c},
2732 {&gcc_blsp1_qup5_i2c_apps_clk.c, GCC_BASE, 0x009d},
2733 { &gcc_blsp1_uart5_apps_clk.c, GCC_BASE, 0x009e},
2734 {&gcc_blsp1_qup6_spi_apps_clk.c, GCC_BASE, 0x00a1},
2735 {&gcc_blsp1_qup6_i2c_apps_clk.c, GCC_BASE, 0x00a2},
2736 { &gcc_blsp1_uart6_apps_clk.c, GCC_BASE, 0x00a3},
2737 { &gcc_pdm_ahb_clk.c, GCC_BASE, 0x00d0},
2738 { &gcc_pdm2_clk.c, GCC_BASE, 0x00d2},
2739 { &gcc_prng_ahb_clk.c, GCC_BASE, 0x00d8},
2740 { &gcc_boot_rom_ahb_clk.c, GCC_BASE, 0x00f8},
2741 { &gcc_ce1_clk.c, GCC_BASE, 0x0138},
2742 { &gcc_ce1_axi_clk.c, GCC_BASE, 0x0139},
2743 { &gcc_ce1_ahb_clk.c, GCC_BASE, 0x013a},
2744 { &gcc_xo_clk_src.c, GCC_BASE, 0x0149},
2745 { &bimc_clk.c, GCC_BASE, 0x0154},
2746 { &gcc_lpass_q6_axi_clk.c, GCC_BASE, 0x0160},
2747
Vikram Mulukutla82cb8442013-01-28 13:36:51 -08002748 { &mmssnoc_ahb_clk.c, MMSS_BASE, 0x0001},
Vikram Mulukutlab13abe42012-10-03 11:38:48 -07002749 { &mmss_misc_ahb_clk.c, MMSS_BASE, 0x0003},
2750 {&mmss_mmssnoc_axi_clk.c, MMSS_BASE, 0x0004},
2751 { &mmss_s0_axi_clk.c, MMSS_BASE, 0x0005},
2752 { &oxili_ahb_clk.c, MMSS_BASE, 0x0007},
2753 { &oxili_gfx3d_clk.c, MMSS_BASE, 0x0008},
2754 { &gmem_gfx3d_clk.c, MMSS_BASE, 0x0009},
2755 { &mdp_axi_clk.c, MMSS_BASE, 0x000a},
2756 { &mdp_vsync_clk.c, MMSS_BASE, 0x000b},
2757 { &mdp_ahb_clk.c, MMSS_BASE, 0x000c},
2758 { &dsi_pclk_clk.c, MMSS_BASE, 0x000d},
2759 { &mdp_dsi_clk.c, MMSS_BASE, 0x000e},
2760 { &mdp_lcdc_clk.c, MMSS_BASE, 0x000f},
2761 { &dsi_clk.c, MMSS_BASE, 0x0010},
2762 { &dsi_byte_clk.c, MMSS_BASE, 0x0011},
2763 { &dsi_esc_clk.c, MMSS_BASE, 0x0012},
2764 { &dsi_ahb_clk.c, MMSS_BASE, 0x0013},
2765 { &mclk0_clk.c, MMSS_BASE, 0x0015},
2766 { &mclk1_clk.c, MMSS_BASE, 0x0016},
2767 { &csi0phytimer_clk.c, MMSS_BASE, 0x0017},
2768 { &csi1phytimer_clk.c, MMSS_BASE, 0x0018},
2769 { &vfe_clk.c, MMSS_BASE, 0x0019},
2770 { &vfe_ahb_clk.c, MMSS_BASE, 0x001a},
2771 { &vfe_axi_clk.c, MMSS_BASE, 0x001b},
2772 { &csi_vfe_clk.c, MMSS_BASE, 0x001c},
2773 { &csi0_clk.c, MMSS_BASE, 0x001d},
2774 { &csi_ahb_clk.c, MMSS_BASE, 0x001e},
2775 { &csi0phy_clk.c, MMSS_BASE, 0x001f},
2776 { &csi0rdi_clk.c, MMSS_BASE, 0x0020},
2777 { &csi0pix_clk.c, MMSS_BASE, 0x0021},
2778 { &csi1_clk.c, MMSS_BASE, 0x0022},
2779 { &csi1phy_clk.c, MMSS_BASE, 0x0023},
2780 { &csi1rdi_clk.c, MMSS_BASE, 0x0024},
2781 { &csi1pix_clk.c, MMSS_BASE, 0x0025},
2782 { &bimc_gfx_clk.c, MMSS_BASE, 0x0032},
2783
2784 { &lpaif_pcmoe_clk_src.c, LPASS_BASE, 0x000f},
2785 { &lpaif_pcm1_clk_src.c, LPASS_BASE, 0x0012},
2786 { &lpaif_pcm0_clk_src.c, LPASS_BASE, 0x0013},
2787 { &lpaif_quad_clk_src.c, LPASS_BASE, 0x0014},
2788 { &lpaif_ter_clk_src.c, LPASS_BASE, 0x0015},
2789 { &lpaif_sec_clk_src.c, LPASS_BASE, 0x0016},
2790 { &lpaif_pri_clk_src.c, LPASS_BASE, 0x0017},
2791 { &lpaif_spkr_clk_src.c, LPASS_BASE, 0x0018},
2792 { &q6ss_ahbm_clk.c, LPASS_BASE, 0x001d},
2793 { &q6ss_ahb_lfabif_clk.c, LPASS_BASE, 0x001e},
2794 { &audio_wrapper_br_clk.c, LPASS_BASE, 0x0022},
2795 { &q6ss_xo_clk.c, LPASS_BASE, 0x002b},
2796 {&audio_core_lpaif_pcm_data_oe_clk.c, LPASS_BASE, 0x0030},
2797 { &audio_core_ixfabric_clk.c, LPASS_BASE, 0x0059},
2798
Vikram Mulukutla4157cca2013-01-24 15:42:41 -08002799 {&apc0_m_clk, APCS_BASE, 0x10},
2800 {&apc1_m_clk, APCS_BASE, 0x11},
2801 {&apc2_m_clk, APCS_BASE, 0x12},
2802 {&apc3_m_clk, APCS_BASE, 0x13},
2803 {&l2_m_clk, APCS_BASE, 0x15},
2804
Vikram Mulukutlab13abe42012-10-03 11:38:48 -07002805 {&dummy_clk, N_BASES, 0x0000},
2806};
2807
2808#define GCC_DEBUG_CLK_CTL 0x1880
2809#define MMSS_DEBUG_CLK_CTL 0x0900
2810#define LPASS_DEBUG_CLK_CTL 0x29000
2811#define GLB_CLK_DIAG 0x001C
2812
2813static int measure_clk_set_parent(struct clk *c, struct clk *parent)
2814{
2815 struct measure_clk *clk = to_measure_clk(c);
2816 unsigned long flags;
2817 u32 regval, clk_sel, i;
2818
2819 if (!parent)
2820 return -EINVAL;
2821
2822 for (i = 0; i < (ARRAY_SIZE(measure_mux) - 1); i++)
2823 if (measure_mux[i].c == parent)
2824 break;
2825
2826 if (measure_mux[i].c == &dummy_clk)
2827 return -EINVAL;
2828
2829 spin_lock_irqsave(&local_clock_reg_lock, flags);
2830 /*
2831 * Program the test vector, measurement period (sample_ticks)
2832 * and scaling multiplier.
2833 */
2834 clk->sample_ticks = 0x10000;
2835 clk->multiplier = 1;
2836
2837 switch (measure_mux[i].base) {
2838
2839 case GCC_BASE:
2840 writel_relaxed(0, GCC_REG_BASE(GCC_DEBUG_CLK_CTL));
2841 clk_sel = measure_mux[i].debug_mux;
2842 break;
2843
2844 case MMSS_BASE:
2845 writel_relaxed(0, MMSS_REG_BASE(MMSS_DEBUG_CLK_CTL));
2846 clk_sel = 0x02C;
2847 regval = BVAL(11, 0, measure_mux[i].debug_mux);
2848 writel_relaxed(regval, MMSS_REG_BASE(MMSS_DEBUG_CLK_CTL));
2849
2850 /* Activate debug clock output */
2851 regval |= BIT(16);
2852 writel_relaxed(regval, MMSS_REG_BASE(MMSS_DEBUG_CLK_CTL));
2853 break;
2854
2855 case LPASS_BASE:
2856 writel_relaxed(0, LPASS_REG_BASE(LPASS_DEBUG_CLK_CTL));
2857 clk_sel = 0x161;
2858 regval = BVAL(11, 0, measure_mux[i].debug_mux);
2859 writel_relaxed(regval, LPASS_REG_BASE(LPASS_DEBUG_CLK_CTL));
2860
2861 /* Activate debug clock output */
2862 regval |= BIT(20);
2863 writel_relaxed(regval, LPASS_REG_BASE(LPASS_DEBUG_CLK_CTL));
2864 break;
2865
2866 case APCS_BASE:
2867 clk->multiplier = 4;
2868 clk_sel = 0x16A;
2869 regval = measure_mux[i].debug_mux;
2870 writel_relaxed(regval, APCS_REG_BASE(GLB_CLK_DIAG));
2871 break;
2872
2873 default:
2874 return -EINVAL;
2875 }
2876
2877 /* Set debug mux clock index */
2878 regval = BVAL(8, 0, clk_sel);
2879 writel_relaxed(regval, GCC_REG_BASE(GCC_DEBUG_CLK_CTL));
2880
2881 /* Activate debug clock output */
2882 regval |= BIT(16);
2883 writel_relaxed(regval, GCC_REG_BASE(GCC_DEBUG_CLK_CTL));
2884
2885 /* Make sure test vector is set before starting measurements. */
2886 mb();
2887 spin_unlock_irqrestore(&local_clock_reg_lock, flags);
2888
2889 return 0;
2890}
2891
2892#define CLOCK_FRQ_MEASURE_CTL 0x1884
2893#define CLOCK_FRQ_MEASURE_STATUS 0x1888
2894
2895/* Sample clock for 'ticks' reference clock ticks. */
2896static u32 run_measurement(unsigned ticks)
2897{
2898 /* Stop counters and set the XO4 counter start value. */
2899 writel_relaxed(ticks, GCC_REG_BASE(CLOCK_FRQ_MEASURE_CTL));
2900
2901 /* Wait for timer to become ready. */
2902 while ((readl_relaxed(GCC_REG_BASE(CLOCK_FRQ_MEASURE_STATUS)) &
2903 BIT(25)) != 0)
2904 cpu_relax();
2905
2906 /* Run measurement and wait for completion. */
2907 writel_relaxed(BIT(20)|ticks, GCC_REG_BASE(CLOCK_FRQ_MEASURE_CTL));
2908 while ((readl_relaxed(GCC_REG_BASE(CLOCK_FRQ_MEASURE_STATUS)) &
2909 BIT(25)) == 0)
2910 cpu_relax();
2911
2912 /* Return measured ticks. */
2913 return readl_relaxed(GCC_REG_BASE(CLOCK_FRQ_MEASURE_STATUS)) &
2914 BM(24, 0);
2915}
2916
2917#define GCC_XO_DIV4_CBCR 0x10C8
2918#define PLLTEST_PAD_CFG 0x188C
2919
2920/*
2921 * Perform a hardware rate measurement for a given clock.
2922 * FOR DEBUG USE ONLY: Measurements take ~15 ms!
2923 */
2924static unsigned long measure_clk_get_rate(struct clk *c)
2925{
2926 unsigned long flags;
2927 u32 gcc_xo4_reg_backup;
2928 u64 raw_count_short, raw_count_full;
2929 struct measure_clk *clk = to_measure_clk(c);
2930 unsigned ret;
2931
2932 ret = clk_prepare_enable(&gcc_xo_clk_src.c);
2933 if (ret) {
2934 pr_warning("CXO clock failed to enable. Can't measure\n");
2935 return 0;
2936 }
2937
2938 spin_lock_irqsave(&local_clock_reg_lock, flags);
2939
2940 /* Enable CXO/4 and RINGOSC branch. */
2941 gcc_xo4_reg_backup = readl_relaxed(GCC_REG_BASE(GCC_XO_DIV4_CBCR));
2942 writel_relaxed(0x1, GCC_REG_BASE(GCC_XO_DIV4_CBCR));
2943
2944 /*
2945 * The ring oscillator counter will not reset if the measured clock
2946 * is not running. To detect this, run a short measurement before
2947 * the full measurement. If the raw results of the two are the same
2948 * then the clock must be off.
2949 */
2950
2951 /* Run a short measurement. (~1 ms) */
2952 raw_count_short = run_measurement(0x1000);
2953 /* Run a full measurement. (~14 ms) */
2954 raw_count_full = run_measurement(clk->sample_ticks);
2955
2956 writel_relaxed(gcc_xo4_reg_backup, GCC_REG_BASE(GCC_XO_DIV4_CBCR));
2957
2958 /* Return 0 if the clock is off. */
2959 if (raw_count_full == raw_count_short) {
2960 ret = 0;
2961 } else {
2962 /* Compute rate in Hz. */
2963 raw_count_full = ((raw_count_full * 10) + 15) * 4800000;
2964 do_div(raw_count_full, ((clk->sample_ticks * 10) + 35));
2965 ret = (raw_count_full * clk->multiplier);
2966 }
2967
2968 writel_relaxed(0x51A00, GCC_REG_BASE(PLLTEST_PAD_CFG));
2969 spin_unlock_irqrestore(&local_clock_reg_lock, flags);
2970
2971 clk_disable_unprepare(&gcc_xo_clk_src.c);
2972
2973 return ret;
2974}
2975#else /* !CONFIG_DEBUG_FS */
2976static int measure_clk_set_parent(struct clk *clk, struct clk *parent)
2977{
2978 return -EINVAL;
2979}
2980
2981static unsigned long measure_clk_get_rate(struct clk *clk)
2982{
2983 return 0;
2984}
2985#endif /* CONFIG_DEBUG_FS */
2986
2987static struct clk_ops clk_ops_measure = {
2988 .set_parent = measure_clk_set_parent,
2989 .get_rate = measure_clk_get_rate,
2990};
2991
2992static struct measure_clk measure_clk = {
2993 .c = {
2994 .dbg_name = "measure_clk",
2995 .ops = &clk_ops_measure,
2996 CLK_INIT(measure_clk.c),
2997 },
2998 .multiplier = 1,
2999};
3000
Syed Rameez Mustafa3971c142013-01-09 19:04:53 -08003001static struct clk_lookup msm_clocks_8610[] = {
Vikram Mulukutlab13abe42012-10-03 11:38:48 -07003002 CLK_LOOKUP("xo", gcc_xo_clk_src.c, "msm_otg"),
3003 CLK_LOOKUP("xo", gcc_xo_clk_src.c, "fe200000.qcom,lpass"),
Vikram Mulukutlacee3bcf2013-03-13 15:55:45 -07003004
3005 CLK_LOOKUP("xo", gcc_xo_clk_src.c, "fc880000.qcom,mss"),
3006 CLK_LOOKUP("bus_clk", gcc_mss_q6_bimc_axi_clk.c, "fc880000.qcom,mss"),
3007 CLK_LOOKUP("iface_clk", gcc_mss_cfg_ahb_clk.c, "fc880000.qcom,mss"),
3008 CLK_LOOKUP("mem_clk", gcc_boot_rom_ahb_clk.c, "fc880000.qcom,mss"),
3009
Vikram Mulukutlab13abe42012-10-03 11:38:48 -07003010 CLK_LOOKUP("xo", gcc_xo_clk_src.c, "pil-mba"),
3011 CLK_LOOKUP("xo", gcc_xo_clk_src.c, "fb000000.qcom,wcnss-wlan"),
Vikram Mulukutla381df182013-01-28 11:39:51 -08003012 CLK_LOOKUP("xo", gcc_xo_clk_src.c, "fb21b000.qcom,pronto"),
Vikram Mulukutlab13abe42012-10-03 11:38:48 -07003013 CLK_LOOKUP("measure", measure_clk.c, "debug"),
3014
3015 CLK_LOOKUP("iface_clk", gcc_blsp1_ahb_clk.c, "f991f000.serial"),
3016 CLK_LOOKUP("core_clk", gcc_blsp1_uart3_apps_clk.c, "f991f000.serial"),
3017
3018 CLK_LOOKUP("dfab_clk", pnoc_sps_clk.c, "msm_sps"),
3019 CLK_LOOKUP("bus_clk", pnoc_qseecom_clk.c, "qseecom"),
3020
3021 CLK_LOOKUP("bus_clk", snoc_clk.c, ""),
3022 CLK_LOOKUP("bus_clk", pnoc_clk.c, ""),
3023 CLK_LOOKUP("bus_clk", cnoc_clk.c, ""),
3024 CLK_LOOKUP("mem_clk", bimc_clk.c, ""),
3025 CLK_LOOKUP("bus_clk", snoc_a_clk.c, ""),
3026 CLK_LOOKUP("bus_clk", pnoc_a_clk.c, ""),
3027 CLK_LOOKUP("bus_clk", cnoc_a_clk.c, ""),
3028 CLK_LOOKUP("mem_clk", bimc_a_clk.c, ""),
3029
3030 CLK_LOOKUP("bus_clk", cnoc_msmbus_clk.c, "msm_config_noc"),
3031 CLK_LOOKUP("bus_a_clk", cnoc_msmbus_a_clk.c, "msm_config_noc"),
3032 CLK_LOOKUP("bus_clk", snoc_msmbus_clk.c, "msm_sys_noc"),
3033 CLK_LOOKUP("bus_a_clk", snoc_msmbus_a_clk.c, "msm_sys_noc"),
3034 CLK_LOOKUP("bus_clk", pnoc_msmbus_clk.c, "msm_periph_noc"),
3035 CLK_LOOKUP("bus_a_clk", pnoc_msmbus_a_clk.c, "msm_periph_noc"),
3036 CLK_LOOKUP("mem_clk", bimc_msmbus_clk.c, "msm_bimc"),
3037 CLK_LOOKUP("mem_a_clk", bimc_msmbus_a_clk.c, "msm_bimc"),
3038 CLK_LOOKUP("mem_clk", bimc_acpu_a_clk.c, ""),
3039
Aparna Das0f5a6ea2013-03-06 15:28:08 -08003040 /* CoreSight clocks */
3041 CLK_LOOKUP("core_clk", qdss_clk.c, "fc326000.tmc"),
3042 CLK_LOOKUP("core_clk", qdss_clk.c, "fc320000.tpiu"),
3043 CLK_LOOKUP("core_clk", qdss_clk.c, "fc324000.replicator"),
3044 CLK_LOOKUP("core_clk", qdss_clk.c, "fc325000.tmc"),
3045 CLK_LOOKUP("core_clk", qdss_clk.c, "fc323000.funnel"),
3046 CLK_LOOKUP("core_clk", qdss_clk.c, "fc321000.funnel"),
3047 CLK_LOOKUP("core_clk", qdss_clk.c, "fc322000.funnel"),
3048 CLK_LOOKUP("core_clk", qdss_clk.c, "fc355000.funnel"),
3049 CLK_LOOKUP("core_clk", qdss_clk.c, "fc302000.stm"),
3050 CLK_LOOKUP("core_clk", qdss_clk.c, "fc34c000.etm"),
3051 CLK_LOOKUP("core_clk", qdss_clk.c, "fc34d000.etm"),
3052 CLK_LOOKUP("core_clk", qdss_clk.c, "fc34e000.etm"),
3053 CLK_LOOKUP("core_clk", qdss_clk.c, "fc34f000.etm"),
3054 CLK_LOOKUP("core_clk", qdss_clk.c, "fc301000.csr"),
3055 CLK_LOOKUP("core_clk", qdss_clk.c, "fc310000.cti"),
3056 CLK_LOOKUP("core_clk", qdss_clk.c, "fc311000.cti"),
3057 CLK_LOOKUP("core_clk", qdss_clk.c, "fc312000.cti"),
3058 CLK_LOOKUP("core_clk", qdss_clk.c, "fc313000.cti"),
3059 CLK_LOOKUP("core_clk", qdss_clk.c, "fc314000.cti"),
3060 CLK_LOOKUP("core_clk", qdss_clk.c, "fc315000.cti"),
3061 CLK_LOOKUP("core_clk", qdss_clk.c, "fc316000.cti"),
3062 CLK_LOOKUP("core_clk", qdss_clk.c, "fc317000.cti"),
3063 CLK_LOOKUP("core_clk", qdss_clk.c, "fc318000.cti"),
3064 CLK_LOOKUP("core_clk", qdss_clk.c, "fc351000.cti"),
3065 CLK_LOOKUP("core_clk", qdss_clk.c, "fc352000.cti"),
3066 CLK_LOOKUP("core_clk", qdss_clk.c, "fc353000.cti"),
3067 CLK_LOOKUP("core_clk", qdss_clk.c, "fc354000.cti"),
Vikram Mulukutlab13abe42012-10-03 11:38:48 -07003068
Aparna Das0f5a6ea2013-03-06 15:28:08 -08003069
3070 CLK_LOOKUP("core_a_clk", qdss_a_clk.c, "fc326000.tmc"),
3071 CLK_LOOKUP("core_a_clk", qdss_a_clk.c, "fc320000.tpiu"),
3072 CLK_LOOKUP("core_a_clk", qdss_a_clk.c, "fc324000.replicator"),
3073 CLK_LOOKUP("core_a_clk", qdss_a_clk.c, "fc325000.tmc"),
3074 CLK_LOOKUP("core_a_clk", qdss_a_clk.c, "fc323000.funnel"),
3075 CLK_LOOKUP("core_a_clk", qdss_a_clk.c, "fc321000.funnel"),
3076 CLK_LOOKUP("core_a_clk", qdss_a_clk.c, "fc322000.funnel"),
3077 CLK_LOOKUP("core_a_clk", qdss_a_clk.c, "fc355000.funnel"),
3078 CLK_LOOKUP("core_a_clk", qdss_a_clk.c, "fc302000.stm"),
3079 CLK_LOOKUP("core_a_clk", qdss_a_clk.c, "fc34c000.etm"),
3080 CLK_LOOKUP("core_a_clk", qdss_a_clk.c, "fc34d000.etm"),
3081 CLK_LOOKUP("core_a_clk", qdss_a_clk.c, "fc34e000.etm"),
3082 CLK_LOOKUP("core_a_clk", qdss_a_clk.c, "fc34f000.etm"),
3083 CLK_LOOKUP("core_a_clk", qdss_a_clk.c, "fc301000.csr"),
3084 CLK_LOOKUP("core_a_clk", qdss_a_clk.c, "fc310000.cti"),
3085 CLK_LOOKUP("core_a_clk", qdss_a_clk.c, "fc311000.cti"),
3086 CLK_LOOKUP("core_a_clk", qdss_a_clk.c, "fc312000.cti"),
3087 CLK_LOOKUP("core_a_clk", qdss_a_clk.c, "fc313000.cti"),
3088 CLK_LOOKUP("core_a_clk", qdss_a_clk.c, "fc314000.cti"),
3089 CLK_LOOKUP("core_a_clk", qdss_a_clk.c, "fc315000.cti"),
3090 CLK_LOOKUP("core_a_clk", qdss_a_clk.c, "fc316000.cti"),
3091 CLK_LOOKUP("core_a_clk", qdss_a_clk.c, "fc317000.cti"),
3092 CLK_LOOKUP("core_a_clk", qdss_a_clk.c, "fc318000.cti"),
3093 CLK_LOOKUP("core_a_clk", qdss_a_clk.c, "fc351000.cti"),
3094 CLK_LOOKUP("core_a_clk", qdss_a_clk.c, "fc352000.cti"),
3095 CLK_LOOKUP("core_a_clk", qdss_a_clk.c, "fc353000.cti"),
3096 CLK_LOOKUP("core_a_clk", qdss_a_clk.c, "fc354000.cti"),
3097
3098
Vikram Mulukutlab13abe42012-10-03 11:38:48 -07003099
3100 CLK_LOOKUP("core_clk_src", blsp1_qup1_spi_apps_clk_src.c, ""),
3101 CLK_LOOKUP("core_clk_src", blsp1_qup2_spi_apps_clk_src.c, ""),
3102 CLK_LOOKUP("core_clk_src", blsp1_qup3_spi_apps_clk_src.c, ""),
3103 CLK_LOOKUP("core_clk_src", blsp1_qup4_spi_apps_clk_src.c, ""),
3104 CLK_LOOKUP("core_clk_src", blsp1_qup5_spi_apps_clk_src.c, ""),
3105 CLK_LOOKUP("core_clk_src", blsp1_qup6_spi_apps_clk_src.c, ""),
3106 CLK_LOOKUP("core_clk_src", blsp1_uart1_apps_clk_src.c, ""),
3107 CLK_LOOKUP("core_clk_src", blsp1_uart2_apps_clk_src.c, ""),
3108 CLK_LOOKUP("core_clk_src", blsp1_uart3_apps_clk_src.c, ""),
3109 CLK_LOOKUP("core_clk_src", blsp1_uart4_apps_clk_src.c, ""),
3110 CLK_LOOKUP("core_clk_src", blsp1_uart5_apps_clk_src.c, ""),
3111 CLK_LOOKUP("core_clk_src", blsp1_uart6_apps_clk_src.c, ""),
3112 CLK_LOOKUP("core_clk_src", ce1_clk_src.c, ""),
3113 CLK_LOOKUP("core_clk_src", gp1_clk_src.c, ""),
3114 CLK_LOOKUP("core_clk_src", gp2_clk_src.c, ""),
3115 CLK_LOOKUP("core_clk_src", gp3_clk_src.c, ""),
3116 CLK_LOOKUP("core_clk_src", pdm2_clk_src.c, ""),
3117 CLK_LOOKUP("core_clk_src", sdcc1_apps_clk_src.c, ""),
3118 CLK_LOOKUP("core_clk_src", sdcc2_apps_clk_src.c, ""),
3119 CLK_LOOKUP("core_clk_src", usb_hs_system_clk_src.c, ""),
Gilad Avidovf84f2792013-01-31 13:26:39 -07003120 CLK_LOOKUP("iface_clk", gcc_blsp1_ahb_clk.c, "f9925000.i2c"),
Gilad Avidovf58f1832013-01-09 17:31:28 -07003121 CLK_LOOKUP("iface_clk", gcc_blsp1_ahb_clk.c, "f9923000.spi"),
Vikram Mulukutlab13abe42012-10-03 11:38:48 -07003122 CLK_LOOKUP("core_clk", gcc_blsp1_qup1_i2c_apps_clk.c, ""),
Gilad Avidovf58f1832013-01-09 17:31:28 -07003123 CLK_LOOKUP("core_clk", gcc_blsp1_qup1_spi_apps_clk.c, "f9923000.spi"),
Vikram Mulukutlab13abe42012-10-03 11:38:48 -07003124 CLK_LOOKUP("core_clk", gcc_blsp1_qup2_i2c_apps_clk.c, ""),
3125 CLK_LOOKUP("core_clk", gcc_blsp1_qup2_spi_apps_clk.c, ""),
Gilad Avidovf84f2792013-01-31 13:26:39 -07003126 CLK_LOOKUP("core_clk", gcc_blsp1_qup3_i2c_apps_clk.c, "f9925000.i2c"),
Vikram Mulukutlab13abe42012-10-03 11:38:48 -07003127 CLK_LOOKUP("core_clk", gcc_blsp1_qup3_spi_apps_clk.c, ""),
3128 CLK_LOOKUP("core_clk", gcc_blsp1_qup4_i2c_apps_clk.c, ""),
3129 CLK_LOOKUP("core_clk", gcc_blsp1_qup4_spi_apps_clk.c, ""),
3130 CLK_LOOKUP("core_clk", gcc_blsp1_qup5_i2c_apps_clk.c, ""),
3131 CLK_LOOKUP("core_clk", gcc_blsp1_qup5_spi_apps_clk.c, ""),
3132 CLK_LOOKUP("core_clk", gcc_blsp1_qup6_i2c_apps_clk.c, ""),
3133 CLK_LOOKUP("core_clk", gcc_blsp1_qup6_spi_apps_clk.c, ""),
3134 CLK_LOOKUP("core_clk", gcc_blsp1_uart1_apps_clk.c, ""),
3135 CLK_LOOKUP("core_clk", gcc_blsp1_uart2_apps_clk.c, ""),
3136 CLK_LOOKUP("core_clk", gcc_blsp1_uart3_apps_clk.c, ""),
3137 CLK_LOOKUP("core_clk", gcc_blsp1_uart4_apps_clk.c, ""),
3138 CLK_LOOKUP("core_clk", gcc_blsp1_uart5_apps_clk.c, ""),
3139 CLK_LOOKUP("core_clk", gcc_blsp1_uart6_apps_clk.c, ""),
3140 CLK_LOOKUP("iface_clk", gcc_boot_rom_ahb_clk.c, ""),
3141 CLK_LOOKUP("iface_clk", gcc_ce1_ahb_clk.c, ""),
3142 CLK_LOOKUP("core_clk", gcc_ce1_axi_clk.c, ""),
3143 CLK_LOOKUP("core_clk", gcc_ce1_clk.c, ""),
3144 CLK_LOOKUP("iface_clk", gcc_copss_smmu_ahb_clk.c, ""),
3145 CLK_LOOKUP("iface_clk", gcc_lpss_smmu_ahb_clk.c, ""),
3146 CLK_LOOKUP("core_clk", gcc_gp1_clk.c, ""),
3147 CLK_LOOKUP("core_clk", gcc_gp2_clk.c, ""),
3148 CLK_LOOKUP("core_clk", gcc_gp3_clk.c, ""),
3149 CLK_LOOKUP("core_clk", gcc_lpass_q6_axi_clk.c, ""),
3150 CLK_LOOKUP("iface_clk", gcc_mss_cfg_ahb_clk.c, ""),
3151 CLK_LOOKUP("core_clk", gcc_mss_q6_bimc_axi_clk.c, ""),
3152 CLK_LOOKUP("core_clk", gcc_pdm2_clk.c, ""),
3153 CLK_LOOKUP("iface_clk", gcc_pdm_ahb_clk.c, ""),
3154 CLK_LOOKUP("iface_clk", gcc_prng_ahb_clk.c, ""),
3155 CLK_LOOKUP("iface_clk", gcc_sdcc1_ahb_clk.c, "msm_sdcc.1"),
3156 CLK_LOOKUP("core_clk", gcc_sdcc1_apps_clk.c, "msm_sdcc.1"),
3157 CLK_LOOKUP("iface_clk", gcc_sdcc2_ahb_clk.c, "msm_sdcc.2"),
3158 CLK_LOOKUP("core_clk", gcc_sdcc2_apps_clk.c, "msm_sdcc.2"),
3159 CLK_LOOKUP("core_clk", gcc_usb2a_phy_sleep_clk.c, ""),
3160 CLK_LOOKUP("iface_clk", gcc_usb_hs_ahb_clk.c, "f9a55000.usb"),
3161 CLK_LOOKUP("core_clk", gcc_usb_hs_system_clk.c, "f9a55000.usb"),
3162
3163 CLK_LOOKUP("core_clk_src", csi0_clk_src.c, ""),
3164 CLK_LOOKUP("core_clk_src", axi_clk_src.c, ""),
Vikram Mulukutlae1e5c482013-01-28 14:43:20 -08003165 CLK_LOOKUP("", mdp_axi_clk_src.c, ""),
3166 CLK_LOOKUP("", mmssnoc_axi_clk_src.c, ""),
Vikram Mulukutlab13abe42012-10-03 11:38:48 -07003167 CLK_LOOKUP("core_clk_src", dsi_pclk_clk_src.c, ""),
3168 CLK_LOOKUP("core_clk_src", gfx3d_clk_src.c, ""),
3169 CLK_LOOKUP("core_clk_src", vfe_clk_src.c, ""),
3170 CLK_LOOKUP("core_clk_src", csi1_clk_src.c, ""),
3171 CLK_LOOKUP("core_clk_src", csi0phytimer_clk_src.c, ""),
3172 CLK_LOOKUP("core_clk_src", csi1phytimer_clk_src.c, ""),
3173 CLK_LOOKUP("core_clk_src", dsi_clk_src.c, ""),
3174 CLK_LOOKUP("core_clk_src", dsi_byte_clk_src.c, ""),
3175 CLK_LOOKUP("core_clk_src", dsi_esc_clk_src.c, ""),
3176 CLK_LOOKUP("core_clk_src", mclk0_clk_src.c, ""),
3177 CLK_LOOKUP("core_clk_src", mclk1_clk_src.c, ""),
3178 CLK_LOOKUP("core_clk_src", mdp_vsync_clk_src.c, ""),
3179
3180 CLK_LOOKUP("core_clk", bimc_gfx_clk.c, ""),
3181 CLK_LOOKUP("core_clk", csi0_clk.c, ""),
3182 CLK_LOOKUP("core_clk", csi0phy_clk.c, ""),
3183 CLK_LOOKUP("core_clk", csi0phytimer_clk.c, ""),
3184 CLK_LOOKUP("core_clk", csi0pix_clk.c, ""),
3185 CLK_LOOKUP("core_clk", csi0rdi_clk.c, ""),
3186 CLK_LOOKUP("core_clk", csi1_clk.c, ""),
3187 CLK_LOOKUP("core_clk", csi1phy_clk.c, ""),
3188 CLK_LOOKUP("core_clk", csi1phytimer_clk.c, ""),
3189 CLK_LOOKUP("core_clk", csi1pix_clk.c, ""),
3190 CLK_LOOKUP("core_clk", csi1rdi_clk.c, ""),
3191 CLK_LOOKUP("core_clk", csi_ahb_clk.c, ""),
3192 CLK_LOOKUP("core_clk", csi_vfe_clk.c, ""),
3193 CLK_LOOKUP("core_clk", dsi_clk.c, ""),
3194 CLK_LOOKUP("core_clk", dsi_ahb_clk.c, ""),
3195 CLK_LOOKUP("core_clk", dsi_byte_clk.c, ""),
3196 CLK_LOOKUP("core_clk", dsi_esc_clk.c, ""),
3197 CLK_LOOKUP("core_clk", dsi_pclk_clk.c, ""),
3198 CLK_LOOKUP("core_clk", gmem_gfx3d_clk.c, ""),
3199 CLK_LOOKUP("core_clk", mclk0_clk.c, ""),
3200 CLK_LOOKUP("core_clk", mclk1_clk.c, ""),
3201 CLK_LOOKUP("core_clk", mdp_ahb_clk.c, ""),
3202 CLK_LOOKUP("core_clk", mdp_axi_clk.c, ""),
3203 CLK_LOOKUP("core_clk", mdp_dsi_clk.c, ""),
3204 CLK_LOOKUP("core_clk", mdp_lcdc_clk.c, ""),
3205 CLK_LOOKUP("core_clk", mdp_vsync_clk.c, ""),
3206 CLK_LOOKUP("core_clk", mmss_misc_ahb_clk.c, ""),
3207 CLK_LOOKUP("core_clk", mmss_s0_axi_clk.c, ""),
Vikram Mulukutlab13abe42012-10-03 11:38:48 -07003208 CLK_LOOKUP("core_clk", mmss_mmssnoc_bto_ahb_clk.c, ""),
3209 CLK_LOOKUP("core_clk", mmss_mmssnoc_axi_clk.c, ""),
3210 CLK_LOOKUP("core_clk", vfe_clk.c, ""),
3211 CLK_LOOKUP("core_clk", vfe_ahb_clk.c, ""),
3212 CLK_LOOKUP("core_clk", vfe_axi_clk.c, ""),
3213
3214 CLK_LOOKUP("core_clk", oxili_gfx3d_clk.c, "fdc00000.qcom,kgsl-3d0"),
3215 CLK_LOOKUP("iface_clk", oxili_ahb_clk.c, "fdc00000.qcom,kgsl-3d0"),
3216 CLK_LOOKUP("mem_iface_clk", bimc_gfx_clk.c, "fdc00000.qcom,kgsl-3d0"),
3217 CLK_LOOKUP("mem_clk", gmem_gfx3d_clk.c, "fdc00000.qcom,kgsl-3d0"),
3218
3219 CLK_LOOKUP("iface_clk", vfe_ahb_clk.c, "fd890000.qcom,iommu"),
3220 CLK_LOOKUP("core_clk", vfe_axi_clk.c, "fd890000.qcom,iommu"),
3221 CLK_LOOKUP("iface_clk", mdp_ahb_clk.c, "fd860000.qcom,iommu"),
3222 CLK_LOOKUP("core_clk", mdp_axi_clk.c, "fd860000.qcom,iommu"),
3223 CLK_LOOKUP("iface_clk", mdp_ahb_clk.c, "fd870000.qcom,iommu"),
3224 CLK_LOOKUP("core_clk", mdp_axi_clk.c, "fd870000.qcom,iommu"),
3225 CLK_LOOKUP("iface_clk", oxili_ahb_clk.c, "fd880000.qcom,iommu"),
3226 CLK_LOOKUP("core_clk", bimc_gfx_clk.c, "fd880000.qcom,iommu"),
3227 CLK_LOOKUP("iface_clk", gcc_lpss_smmu_ahb_clk.c, "fd000000.qcom,iommu"),
3228 CLK_LOOKUP("core_clk", gcc_lpass_q6_axi_clk.c, "fd000000.qcom,iommu"),
3229 CLK_LOOKUP("iface_clk", gcc_copss_smmu_ahb_clk.c,
3230 "fd010000.qcom,iommu"),
3231 CLK_LOOKUP("core_clk", pnoc_iommu_clk.c, "fd010000.qcom,iommu"),
3232
3233 CLK_LOOKUP("core_clk_src", lpaif_pri_clk_src.c, ""),
3234 CLK_LOOKUP("core_clk_src", lpaif_quad_clk_src.c, ""),
3235 CLK_LOOKUP("core_clk_src", lpaif_sec_clk_src.c, ""),
3236 CLK_LOOKUP("core_clk_src", lpaif_spkr_clk_src.c, ""),
3237 CLK_LOOKUP("core_clk_src", lpaif_ter_clk_src.c, ""),
3238 CLK_LOOKUP("core_clk_src", lpaif_pcm0_clk_src.c, ""),
3239 CLK_LOOKUP("core_clk_src", lpaif_pcm1_clk_src.c, ""),
3240 CLK_LOOKUP("core_clk_src", lpaif_pcmoe_clk_src.c, ""),
3241 CLK_LOOKUP("core_clk", audio_core_ixfabric_clk.c, ""),
3242 CLK_LOOKUP("core_clk", audio_wrapper_br_clk.c, ""),
3243 CLK_LOOKUP("core_clk", q6ss_ahb_lfabif_clk.c, ""),
3244 CLK_LOOKUP("core_clk", q6ss_ahbm_clk.c, ""),
3245 CLK_LOOKUP("core_clk", q6ss_xo_clk.c, ""),
3246 CLK_LOOKUP("core_clk", audio_core_lpaif_pcm_data_oe_clk.c, ""),
3247 CLK_LOOKUP("core_clk", audio_core_lpaif_pri_ebit_clk.c, ""),
3248 CLK_LOOKUP("core_clk", audio_core_lpaif_pri_ibit_clk.c, ""),
3249 CLK_LOOKUP("core_clk", audio_core_lpaif_pri_osr_clk.c, ""),
3250 CLK_LOOKUP("core_clk", audio_core_lpaif_pcm0_ebit_clk.c, ""),
3251 CLK_LOOKUP("core_clk", audio_core_lpaif_pcm0_ibit_clk.c, ""),
3252 CLK_LOOKUP("core_clk", audio_core_lpaif_quad_ebit_clk.c, ""),
3253 CLK_LOOKUP("core_clk", audio_core_lpaif_quad_ibit_clk.c, ""),
3254 CLK_LOOKUP("core_clk", audio_core_lpaif_quad_osr_clk.c, ""),
3255 CLK_LOOKUP("core_clk", audio_core_lpaif_sec_ebit_clk.c, ""),
3256 CLK_LOOKUP("core_clk", audio_core_lpaif_sec_ibit_clk.c, ""),
3257 CLK_LOOKUP("core_clk", audio_core_lpaif_sec_osr_clk.c, ""),
3258 CLK_LOOKUP("core_clk", audio_core_lpaif_pcm1_ebit_clk.c, ""),
3259 CLK_LOOKUP("core_clk", audio_core_lpaif_pcm1_ibit_clk.c, ""),
3260 CLK_LOOKUP("core_clk", audio_core_lpaif_codec_spkr_ebit_clk.c, ""),
3261 CLK_LOOKUP("core_clk", audio_core_lpaif_codec_spkr_ibit_clk.c, ""),
3262 CLK_LOOKUP("core_clk", audio_core_lpaif_codec_spkr_osr_clk.c, ""),
3263 CLK_LOOKUP("core_clk", audio_core_lpaif_ter_ebit_clk.c, ""),
3264 CLK_LOOKUP("core_clk", audio_core_lpaif_ter_ibit_clk.c, ""),
3265 CLK_LOOKUP("core_clk", audio_core_lpaif_ter_osr_clk.c, ""),
3266
3267 CLK_LOOKUP("core_clk", q6ss_xo_clk.c, "fe200000.qcom,lpass"),
3268 CLK_LOOKUP("bus_clk", gcc_lpass_q6_axi_clk.c, "fe200000.qcom,lpass"),
3269 CLK_LOOKUP("iface_clk", q6ss_ahb_lfabif_clk.c, "fe200000.qcom,lpass"),
3270 CLK_LOOKUP("reg_clk", q6ss_ahbm_clk.c, "fe200000.qcom,lpass"),
Vikram Mulukutla4157cca2013-01-24 15:42:41 -08003271
3272 CLK_LOOKUP("xo", gcc_xo_a_clk_src.c, "f9011050.qcom,acpuclk"),
3273 CLK_LOOKUP("gpll0", gpll0_ao_clk_src.c, "f9011050.qcom,acpuclk"),
3274 CLK_LOOKUP("a7sspll", a7sspll.c, "f9011050.qcom,acpuclk"),
3275
3276 CLK_LOOKUP("measure_clk", apc0_m_clk, ""),
3277 CLK_LOOKUP("measure_clk", apc1_m_clk, ""),
3278 CLK_LOOKUP("measure_clk", apc2_m_clk, ""),
3279 CLK_LOOKUP("measure_clk", apc3_m_clk, ""),
3280 CLK_LOOKUP("measure_clk", l2_m_clk, ""),
Vikram Mulukutlab13abe42012-10-03 11:38:48 -07003281};
3282
Syed Rameez Mustafa3971c142013-01-09 19:04:53 -08003283static struct clk_lookup msm_clocks_8610_rumi[] = {
Vikram Mulukutlab13abe42012-10-03 11:38:48 -07003284 CLK_DUMMY("core_clk", BLSP1_UART_CLK, "f991f000.serial", OFF),
3285 CLK_DUMMY("iface_clk", BLSP1_UART_CLK, "f991f000.serial", OFF),
3286 CLK_DUMMY("iface_clk", HSUSB_IFACE_CLK, "f9a55000.usb", OFF),
3287 CLK_DUMMY("core_clk", HSUSB_CORE_CLK, "f9a55000.usb", OFF),
3288 CLK_DUMMY("iface_clk", NULL, "msm_sdcc.1", OFF),
3289 CLK_DUMMY("core_clk", NULL, "msm_sdcc.1", OFF),
3290 CLK_DUMMY("bus_clk", NULL, "msm_sdcc.1", OFF),
3291 CLK_DUMMY("iface_clk", NULL, "msm_sdcc.2", OFF),
3292 CLK_DUMMY("core_clk", NULL, "msm_sdcc.2", OFF),
3293 CLK_DUMMY("bus_clk", NULL, "msm_sdcc.2", OFF),
3294 CLK_DUMMY("dfab_clk", DFAB_CLK, "msm_sps", OFF),
3295 CLK_DUMMY("iface_clk", NULL, "fd890000.qcom,iommu", OFF),
3296 CLK_DUMMY("core_clk", NULL, "fd890000.qcom,iommu", OFF),
3297 CLK_DUMMY("iface_clk", NULL, "fd860000.qcom,iommu", OFF),
3298 CLK_DUMMY("core_clk", NULL, "fd860000.qcom,iommu", OFF),
3299 CLK_DUMMY("iface_clk", NULL, "fd870000.qcom,iommu", OFF),
3300 CLK_DUMMY("core_clk", NULL, "fd870000.qcom,iommu", OFF),
3301 CLK_DUMMY("iface_clk", NULL, "fd880000.qcom,iommu", OFF),
3302 CLK_DUMMY("core_clk", NULL, "fd880000.qcom,iommu", OFF),
3303 CLK_DUMMY("iface_clk", NULL, "fd000000.qcom,iommu", OFF),
3304 CLK_DUMMY("core_clk", NULL, "fd000000.qcom,iommu", OFF),
3305 CLK_DUMMY("iface_clk", NULL, "fd010000.qcom,iommu", OFF),
3306 CLK_DUMMY("core_clk", NULL, "fd010000.qcom,iommu", OFF),
Vikram Mulukutla4157cca2013-01-24 15:42:41 -08003307 CLK_DUMMY("xo", NULL, "f9011050.qcom,acpuclk", OFF),
3308 CLK_DUMMY("gpll0", NULL, "f9011050.qcom,acpuclk", OFF),
3309 CLK_DUMMY("a7sspll", NULL, "f9011050.qcom,acpuclk", OFF),
Vikram Mulukutlab13abe42012-10-03 11:38:48 -07003310};
3311
Syed Rameez Mustafa3971c142013-01-09 19:04:53 -08003312struct clock_init_data msm8610_rumi_clock_init_data __initdata = {
3313 .table = msm_clocks_8610_rumi,
3314 .size = ARRAY_SIZE(msm_clocks_8610_rumi),
Vikram Mulukutlab13abe42012-10-03 11:38:48 -07003315};
3316
3317static struct pll_config_regs gpll0_regs __initdata = {
3318 .l_reg = (void __iomem *)GPLL0_L_VAL,
3319 .m_reg = (void __iomem *)GPLL0_M_VAL,
3320 .n_reg = (void __iomem *)GPLL0_N_VAL,
3321 .config_reg = (void __iomem *)GPLL0_USER_CTL,
3322 .mode_reg = (void __iomem *)GPLL0_MODE,
3323 .base = &virt_bases[GCC_BASE],
3324};
3325
3326/* GPLL0 at 600 MHz, main output enabled. */
3327static struct pll_config gpll0_config __initdata = {
3328 .l = 0x1f,
3329 .m = 0x1,
3330 .n = 0x4,
3331 .vco_val = 0x0,
3332 .vco_mask = BM(21, 20),
3333 .pre_div_val = 0x0,
3334 .pre_div_mask = BM(14, 12),
3335 .post_div_val = 0x0,
3336 .post_div_mask = BM(9, 8),
3337 .mn_ena_val = BIT(24),
3338 .mn_ena_mask = BIT(24),
3339 .main_output_val = BIT(0),
3340 .main_output_mask = BIT(0),
3341};
3342
3343/* MMPLL0 at 800 MHz, main output enabled. */
3344static struct pll_config mmpll0_config __initdata = {
3345 .l = 0x29,
3346 .m = 0x2,
3347 .n = 0x3,
3348 .vco_val = 0x0,
3349 .vco_mask = BM(21, 20),
3350 .pre_div_val = 0x0,
3351 .pre_div_mask = BM(14, 12),
3352 .post_div_val = 0x0,
3353 .post_div_mask = BM(9, 8),
3354 .mn_ena_val = BIT(24),
3355 .mn_ena_mask = BIT(24),
3356 .main_output_val = BIT(0),
3357 .main_output_mask = BIT(0),
3358};
3359
3360/* MMPLL1 at 1200 MHz, main output enabled. */
3361static struct pll_config mmpll1_config __initdata = {
3362 .l = 0x3E,
3363 .m = 0x1,
3364 .n = 0x2,
3365 .vco_val = 0x0,
3366 .vco_mask = BM(21, 20),
3367 .pre_div_val = 0x0,
3368 .pre_div_mask = BM(14, 12),
3369 .post_div_val = 0x0,
3370 .post_div_mask = BM(9, 8),
3371 .mn_ena_val = BIT(24),
3372 .mn_ena_mask = BIT(24),
3373 .main_output_val = BIT(0),
3374 .main_output_mask = BIT(0),
3375};
3376
3377static struct pll_config_regs lpapll0_regs __initdata = {
3378 .l_reg = (void __iomem *)LPAAUDIO_PLL_L_VAL,
3379 .m_reg = (void __iomem *)LPAAUDIO_PLL_M_VAL,
3380 .n_reg = (void __iomem *)LPAAUDIO_PLL_N_VAL,
3381 .config_reg = (void __iomem *)LPAAUDIO_PLL_USER_CTL,
3382 .mode_reg = (void __iomem *)LPAAUDIO_PLL_MODE,
3383 .base = &virt_bases[LPASS_BASE],
3384};
3385
3386/* LPAPLL0 at 491.52 MHz, main output enabled. */
3387static struct pll_config lpapll0_config __initdata = {
3388 .l = 0x33,
3389 .m = 0x1,
3390 .n = 0x5,
3391 .vco_val = 0x0,
3392 .vco_mask = BM(21, 20),
3393 .pre_div_val = BVAL(14, 12, 0x1),
3394 .pre_div_mask = BM(14, 12),
3395 .post_div_val = 0x0,
3396 .post_div_mask = BM(9, 8),
3397 .mn_ena_val = BIT(24),
3398 .mn_ena_mask = BIT(24),
3399 .main_output_val = BIT(0),
3400 .main_output_mask = BIT(0),
3401};
3402
3403#define PLL_AUX_OUTPUT_BIT 1
3404#define PLL_AUX2_OUTPUT_BIT 2
3405
3406#define PWR_ON_MASK BIT(31)
3407#define EN_REST_WAIT_MASK (0xF << 20)
3408#define EN_FEW_WAIT_MASK (0xF << 16)
3409#define CLK_DIS_WAIT_MASK (0xF << 12)
3410#define SW_OVERRIDE_MASK BIT(2)
3411#define HW_CONTROL_MASK BIT(1)
3412#define SW_COLLAPSE_MASK BIT(0)
3413
3414/* Wait 2^n CXO cycles between all states. Here, n=2 (4 cycles). */
3415#define EN_REST_WAIT_VAL (0x2 << 20)
3416#define EN_FEW_WAIT_VAL (0x2 << 16)
3417#define CLK_DIS_WAIT_VAL (0x2 << 12)
3418#define GDSC_TIMEOUT_US 50000
3419
3420static void __init reg_init(void)
3421{
3422 u32 regval, status;
3423 int ret;
3424
3425 if (!(readl_relaxed(GCC_REG_BASE(GPLL0_STATUS))
3426 & gpll0_clk_src.status_mask))
3427 configure_sr_hpm_lp_pll(&gpll0_config, &gpll0_regs, 1);
3428
3429 configure_sr_hpm_lp_pll(&mmpll0_config, &mmpll0_regs, 1);
3430 configure_sr_hpm_lp_pll(&mmpll1_config, &mmpll1_regs, 1);
3431 configure_sr_hpm_lp_pll(&lpapll0_config, &lpapll0_regs, 1);
3432
3433 /* Enable GPLL0's aux outputs. */
3434 regval = readl_relaxed(GCC_REG_BASE(GPLL0_USER_CTL));
3435 regval |= BIT(PLL_AUX_OUTPUT_BIT) | BIT(PLL_AUX2_OUTPUT_BIT);
3436 writel_relaxed(regval, GCC_REG_BASE(GPLL0_USER_CTL));
3437
3438 /* Vote for GPLL0 to turn on. Needed by acpuclock. */
3439 regval = readl_relaxed(GCC_REG_BASE(APCS_GPLL_ENA_VOTE));
3440 regval |= BIT(0);
3441 writel_relaxed(regval, GCC_REG_BASE(APCS_GPLL_ENA_VOTE));
3442
3443 /*
3444 * TODO: Confirm that no clocks need to be voted on in this sleep vote
3445 * register.
3446 */
3447 writel_relaxed(0x0, GCC_REG_BASE(APCS_CLOCK_SLEEP_ENA_VOTE));
3448
3449 /*
3450 * TODO: The following sequence enables the LPASS audio core GDSC.
3451 * Remove when this becomes unnecessary.
3452 */
3453
3454 /*
3455 * Disable HW trigger: collapse/restore occur based on registers writes.
3456 * Disable SW override: Use hardware state-machine for sequencing.
3457 */
3458 regval = readl_relaxed(LPASS_REG_BASE(AUDIO_CORE_GDSCR));
3459 regval &= ~(HW_CONTROL_MASK | SW_OVERRIDE_MASK);
3460
3461 /* Configure wait time between states. */
3462 regval &= ~(EN_REST_WAIT_MASK | EN_FEW_WAIT_MASK | CLK_DIS_WAIT_MASK);
3463 regval |= EN_REST_WAIT_VAL | EN_FEW_WAIT_VAL | CLK_DIS_WAIT_VAL;
3464 writel_relaxed(regval, LPASS_REG_BASE(AUDIO_CORE_GDSCR));
3465
3466 regval = readl_relaxed(LPASS_REG_BASE(AUDIO_CORE_GDSCR));
3467 regval &= ~BIT(0);
3468 writel_relaxed(regval, LPASS_REG_BASE(AUDIO_CORE_GDSCR));
3469
3470 ret = readl_poll_timeout(LPASS_REG_BASE(AUDIO_CORE_GDSCR), status,
3471 status & PWR_ON_MASK, 50, GDSC_TIMEOUT_US);
3472 WARN(ret, "LPASS Audio Core GDSC did not power on.\n");
3473}
3474
Syed Rameez Mustafa3971c142013-01-09 19:04:53 -08003475static void __init msm8610_clock_post_init(void)
Vikram Mulukutlab13abe42012-10-03 11:38:48 -07003476{
3477 /*
3478 * Hold an active set vote for CXO; this is because CXO is expected
3479 * to remain on whenever CPUs aren't power collapsed.
3480 */
3481 clk_prepare_enable(&gcc_xo_a_clk_src.c);
3482
3483
3484 /* Set rates for single-rate clocks. */
3485 clk_set_rate(&usb_hs_system_clk_src.c,
3486 usb_hs_system_clk_src.freq_tbl[0].freq_hz);
3487 clk_set_rate(&pdm2_clk_src.c, pdm2_clk_src.freq_tbl[0].freq_hz);
3488 clk_set_rate(&mclk0_clk_src.c, mclk0_clk_src.freq_tbl[0].freq_hz);
3489 clk_set_rate(&mclk1_clk_src.c, mclk1_clk_src.freq_tbl[0].freq_hz);
3490 clk_set_rate(&audio_core_slimbus_core_clk_src.c,
3491 audio_core_slimbus_core_clk_src.freq_tbl[0].freq_hz);
3492}
3493
3494#define GCC_CC_PHYS 0xFC400000
3495#define GCC_CC_SIZE SZ_16K
3496
3497#define MMSS_CC_PHYS 0xFD8C0000
3498#define MMSS_CC_SIZE SZ_256K
3499
3500#define LPASS_CC_PHYS 0xFE000000
3501#define LPASS_CC_SIZE SZ_256K
3502
3503#define APCS_GCC_CC_PHYS 0xF9011000
3504#define APCS_GCC_CC_SIZE SZ_4K
3505
Vikram Mulukutla4157cca2013-01-24 15:42:41 -08003506#define APCS_KPSS_SH_PLL_PHYS 0xF9016000
3507#define APCS_KPSS_SH_PLL_SIZE SZ_64
3508
Syed Rameez Mustafa3971c142013-01-09 19:04:53 -08003509static void __init msm8610_clock_pre_init(void)
Vikram Mulukutlab13abe42012-10-03 11:38:48 -07003510{
3511 virt_bases[GCC_BASE] = ioremap(GCC_CC_PHYS, GCC_CC_SIZE);
3512 if (!virt_bases[GCC_BASE])
Syed Rameez Mustafa3971c142013-01-09 19:04:53 -08003513 panic("clock-8610: Unable to ioremap GCC memory!");
Vikram Mulukutlab13abe42012-10-03 11:38:48 -07003514
3515 virt_bases[MMSS_BASE] = ioremap(MMSS_CC_PHYS, MMSS_CC_SIZE);
3516 if (!virt_bases[MMSS_BASE])
Syed Rameez Mustafa3971c142013-01-09 19:04:53 -08003517 panic("clock-8610: Unable to ioremap MMSS_CC memory!");
Vikram Mulukutlab13abe42012-10-03 11:38:48 -07003518
3519 virt_bases[LPASS_BASE] = ioremap(LPASS_CC_PHYS, LPASS_CC_SIZE);
3520 if (!virt_bases[LPASS_BASE])
Syed Rameez Mustafa3971c142013-01-09 19:04:53 -08003521 panic("clock-8610: Unable to ioremap LPASS_CC memory!");
Vikram Mulukutlab13abe42012-10-03 11:38:48 -07003522
3523 virt_bases[APCS_BASE] = ioremap(APCS_GCC_CC_PHYS, APCS_GCC_CC_SIZE);
3524 if (!virt_bases[APCS_BASE])
Syed Rameez Mustafa3971c142013-01-09 19:04:53 -08003525 panic("clock-8610: Unable to ioremap APCS_GCC_CC memory!");
Vikram Mulukutlab13abe42012-10-03 11:38:48 -07003526
Vikram Mulukutla4157cca2013-01-24 15:42:41 -08003527 virt_bases[APCS_PLL_BASE] = ioremap(APCS_KPSS_SH_PLL_PHYS,
3528 APCS_KPSS_SH_PLL_SIZE);
3529 if (!virt_bases[APCS_PLL_BASE])
3530 panic("clock-8610: Unable to ioremap APCS_GCC_CC memory!");
3531
Vikram Mulukutlab13abe42012-10-03 11:38:48 -07003532 clk_ops_local_pll.enable = sr_hpm_lp_pll_clk_enable;
3533
Patrick Dalyebc26bc2013-02-05 11:49:07 -08003534 vdd_dig.regulator[0] = regulator_get(NULL, "vdd_dig");
3535 if (IS_ERR(vdd_dig.regulator[0]))
Syed Rameez Mustafa3971c142013-01-09 19:04:53 -08003536 panic("clock-8610: Unable to get the vdd_dig regulator!");
Vikram Mulukutlab13abe42012-10-03 11:38:48 -07003537
Patrick Dalyebc26bc2013-02-05 11:49:07 -08003538 vdd_sr2_pll.regulator[0] = regulator_get(NULL, "vdd_sr2_pll");
3539 if (IS_ERR(vdd_sr2_pll.regulator[0]))
Vikram Mulukutla4157cca2013-01-24 15:42:41 -08003540 panic("clock-8610: Unable to get the vdd_sr2_pll regulator!");
3541
Patrick Dalyebc26bc2013-02-05 11:49:07 -08003542 regulator_set_voltage(vdd_sr2_pll.regulator[0], 1800000, 1800000);
3543 regulator_enable(vdd_sr2_pll.regulator[0]);
Vikram Mulukutla4157cca2013-01-24 15:42:41 -08003544
Vikram Mulukutlab13abe42012-10-03 11:38:48 -07003545 /*
3546 * TODO: Set a voltage and enable vdd_dig, leaving the voltage high
3547 * until late_init. This may not be necessary with clock handoff;
3548 * Investigate this code on a real non-simulator target to determine
3549 * its necessity.
3550 */
3551 vote_vdd_level(&vdd_dig, VDD_DIG_HIGH);
Patrick Dalyebc26bc2013-02-05 11:49:07 -08003552 regulator_enable(vdd_dig.regulator[0]);
Vikram Mulukutlab13abe42012-10-03 11:38:48 -07003553
3554 enable_rpm_scaling();
3555
3556 /* Enable a clock to allow access to MMSS clock registers */
3557 clk_prepare_enable(&gcc_mmss_noc_cfg_ahb_clk.c),
3558
3559 reg_init();
3560
Vikram Mulukutla82cb8442013-01-28 13:36:51 -08003561 /* Maintain the max nominal frequency on the MMSSNOC AHB bus. */
3562 clk_set_rate(&mmssnoc_ahb_a_clk.c, 40000000);
3563 clk_prepare_enable(&mmssnoc_ahb_a_clk.c);
3564
Vikram Mulukutlab13abe42012-10-03 11:38:48 -07003565 /* TODO: Remove this once the bus driver is in place */
Vikram Mulukutlab13abe42012-10-03 11:38:48 -07003566 clk_set_rate(&axi_clk_src.c, 200000000);
Vikram Mulukutlab13abe42012-10-03 11:38:48 -07003567 clk_prepare_enable(&mmss_s0_axi_clk.c);
3568
3569 /* TODO: Temporarily enable a clock to allow access to LPASS core
3570 * registers.
3571 */
3572 clk_prepare_enable(&audio_core_ixfabric_clk.c);
3573}
3574
Syed Rameez Mustafa3971c142013-01-09 19:04:53 -08003575static int __init msm8610_clock_late_init(void)
Vikram Mulukutlab13abe42012-10-03 11:38:48 -07003576{
3577 return unvote_vdd_level(&vdd_dig, VDD_DIG_HIGH);
3578}
3579
Syed Rameez Mustafa3971c142013-01-09 19:04:53 -08003580struct clock_init_data msm8610_clock_init_data __initdata = {
3581 .table = msm_clocks_8610,
3582 .size = ARRAY_SIZE(msm_clocks_8610),
3583 .pre_init = msm8610_clock_pre_init,
3584 .post_init = msm8610_clock_post_init,
3585 .late_init = msm8610_clock_late_init,
Vikram Mulukutlab13abe42012-10-03 11:38:48 -07003586};