blob: b5f5a4e8cd4e5cce9b464dd6645815b883b453eb [file] [log] [blame]
Pushkar Joshie0e8a7e2012-12-15 18:27:04 -08001/* Copyright (c) 2012-2013, The Linux Foundation. All rights reserved.
Tianyi Gou389ba432012-10-01 13:58:38 -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/regulator/consumer.h>
22#include <linux/iopoll.h>
23
24#include <mach/clk.h>
25#include <mach/rpm-regulator-smd.h>
26#include <mach/socinfo.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 LPASS_BASE,
37 APCS_BASE,
38 APCS_PLL_BASE,
39 N_BASES,
40};
41
42static void __iomem *virt_bases[N_BASES];
43
44#define GCC_REG_BASE(x) (void __iomem *)(virt_bases[GCC_BASE] + (x))
45#define LPASS_REG_BASE(x) (void __iomem *)(virt_bases[LPASS_BASE] + (x))
46#define APCS_REG_BASE(x) (void __iomem *)(virt_bases[APCS_BASE] + (x))
47#define APCS_PLL_REG_BASE(x) (void __iomem *)(virt_bases[APCS_PLL_BASE] + (x))
48
49/* GCC registers */
50#define GPLL0_MODE_REG 0x0000
51#define GPLL0_L_REG 0x0004
52#define GPLL0_M_REG 0x0008
53#define GPLL0_N_REG 0x000C
54#define GPLL0_USER_CTL_REG 0x0010
55#define GPLL0_CONFIG_CTL_REG 0x0014
56#define GPLL0_TEST_CTL_REG 0x0018
57#define GPLL0_STATUS_REG 0x001C
58
59#define GPLL1_MODE_REG 0x0040
60#define GPLL1_L_REG 0x0044
61#define GPLL1_M_REG 0x0048
62#define GPLL1_N_REG 0x004C
63#define GPLL1_USER_CTL_REG 0x0050
64#define GPLL1_CONFIG_CTL_REG 0x0054
65#define GPLL1_TEST_CTL_REG 0x0058
66#define GPLL1_STATUS_REG 0x005C
67
68#define GCC_DEBUG_CLK_CTL_REG 0x1880
69#define CLOCK_FRQ_MEASURE_CTL_REG 0x1884
70#define CLOCK_FRQ_MEASURE_STATUS_REG 0x1888
71#define GCC_PLLTEST_PAD_CFG_REG 0x188C
72#define GCC_XO_DIV4_CBCR_REG 0x10C8
73#define APCS_GPLL_ENA_VOTE_REG 0x1480
74#define APCS_CLOCK_BRANCH_ENA_VOTE 0x1484
75#define APCS_CLOCK_SLEEP_ENA_VOTE 0x1488
76
77#define APCS_CLK_DIAG_REG 0x001C
78
79#define APCS_CPU_PLL_MODE_REG 0x0000
80#define APCS_CPU_PLL_L_REG 0x0004
81#define APCS_CPU_PLL_M_REG 0x0008
82#define APCS_CPU_PLL_N_REG 0x000C
83#define APCS_CPU_PLL_USER_CTL_REG 0x0010
84#define APCS_CPU_PLL_CONFIG_CTL_REG 0x0014
85#define APCS_CPU_PLL_TEST_CTL_REG 0x0018
86#define APCS_CPU_PLL_STATUS_REG 0x001C
87
88#define USB_HSIC_SYSTEM_CMD_RCGR 0x041C
89#define USB_HSIC_XCVR_FS_CMD_RCGR 0x0424
90#define USB_HSIC_CMD_RCGR 0x0440
91#define USB_HSIC_IO_CAL_CMD_RCGR 0x0458
92#define USB_HS_SYSTEM_CMD_RCGR 0x0490
93#define SDCC2_APPS_CMD_RCGR 0x0510
94#define SDCC3_APPS_CMD_RCGR 0x0550
95#define BLSP1_QUP1_SPI_APPS_CMD_RCGR 0x064C
Tianyi Goub1d13972013-01-23 22:55:22 -080096#define BLSP1_QUP1_I2C_APPS_CMD_RCGR 0x0660
Tianyi Gou389ba432012-10-01 13:58:38 -070097#define BLSP1_UART1_APPS_CMD_RCGR 0x068C
98#define BLSP1_QUP2_SPI_APPS_CMD_RCGR 0x06CC
Tianyi Goub1d13972013-01-23 22:55:22 -080099#define BLSP1_QUP2_I2C_APPS_CMD_RCGR 0x06E0
Tianyi Gou389ba432012-10-01 13:58:38 -0700100#define BLSP1_UART2_APPS_CMD_RCGR 0x070C
101#define BLSP1_QUP3_SPI_APPS_CMD_RCGR 0x074C
Tianyi Goub1d13972013-01-23 22:55:22 -0800102#define BLSP1_QUP3_I2C_APPS_CMD_RCGR 0x0760
Tianyi Gou389ba432012-10-01 13:58:38 -0700103#define BLSP1_UART3_APPS_CMD_RCGR 0x078C
104#define BLSP1_QUP4_SPI_APPS_CMD_RCGR 0x07CC
Tianyi Goub1d13972013-01-23 22:55:22 -0800105#define BLSP1_QUP4_I2C_APPS_CMD_RCGR 0x07E0
Tianyi Gou389ba432012-10-01 13:58:38 -0700106#define BLSP1_UART4_APPS_CMD_RCGR 0x080C
107#define BLSP1_QUP5_SPI_APPS_CMD_RCGR 0x084C
Tianyi Goub1d13972013-01-23 22:55:22 -0800108#define BLSP1_QUP5_I2C_APPS_CMD_RCGR 0x0860
Tianyi Gou389ba432012-10-01 13:58:38 -0700109#define BLSP1_UART5_APPS_CMD_RCGR 0x088C
110#define BLSP1_QUP6_SPI_APPS_CMD_RCGR 0x08CC
Tianyi Goub1d13972013-01-23 22:55:22 -0800111#define BLSP1_QUP6_I2C_APPS_CMD_RCGR 0x08E0
Tianyi Gou389ba432012-10-01 13:58:38 -0700112#define BLSP1_UART6_APPS_CMD_RCGR 0x090C
113#define PDM2_CMD_RCGR 0x0CD0
114#define CE1_CMD_RCGR 0x1050
115#define GP1_CMD_RCGR 0x1904
116#define GP2_CMD_RCGR 0x1944
117#define GP3_CMD_RCGR 0x1984
118#define QPIC_CMD_RCGR 0x1A50
119#define IPA_CMD_RCGR 0x1A90
120
121#define USB_HS_HSIC_BCR 0x0400
122#define USB_HS_BCR 0x0480
123#define SDCC2_BCR 0x0500
124#define SDCC3_BCR 0x0540
125#define BLSP1_BCR 0x05C0
126#define BLSP1_QUP1_BCR 0x0640
127#define BLSP1_UART1_BCR 0x0680
128#define BLSP1_QUP2_BCR 0x06C0
129#define BLSP1_UART2_BCR 0x0700
130#define BLSP1_QUP3_BCR 0x0740
131#define BLSP1_UART3_BCR 0x0780
132#define BLSP1_QUP4_BCR 0x07C0
133#define BLSP1_UART4_BCR 0x0800
134#define BLSP1_QUP5_BCR 0x0840
135#define BLSP1_UART5_BCR 0x0880
136#define BLSP1_QUP6_BCR 0x08C0
137#define BLSP1_UART6_BCR 0x0900
138#define PDM_BCR 0x0CC0
139#define PRNG_BCR 0x0D00
140#define BAM_DMA_BCR 0x0D40
141#define BOOT_ROM_BCR 0x0E00
142#define CE1_BCR 0x1040
143#define QPIC_BCR 0x1040
144#define IPA_BCR 0x1A80
145
146
147#define SYS_NOC_IPA_AXI_CBCR 0x0128
148#define USB_HSIC_AHB_CBCR 0x0408
149#define USB_HSIC_SYSTEM_CBCR 0x040C
150#define USB_HSIC_CBCR 0x0410
151#define USB_HSIC_IO_CAL_CBCR 0x0414
152#define USB_HSIC_XCVR_FS_CBCR 0x042C
153#define USB_HS_SYSTEM_CBCR 0x0484
154#define USB_HS_AHB_CBCR 0x0488
155#define SDCC2_APPS_CBCR 0x0504
156#define SDCC2_AHB_CBCR 0x0508
157#define SDCC3_APPS_CBCR 0x0544
158#define SDCC3_AHB_CBCR 0x0548
159#define BLSP1_AHB_CBCR 0x05C4
160#define BLSP1_QUP1_SPI_APPS_CBCR 0x0644
161#define BLSP1_QUP1_I2C_APPS_CBCR 0x0648
162#define BLSP1_UART1_APPS_CBCR 0x0684
163#define BLSP1_UART1_SIM_CBCR 0x0688
164#define BLSP1_QUP2_SPI_APPS_CBCR 0x06C4
165#define BLSP1_QUP2_I2C_APPS_CBCR 0x06C8
166#define BLSP1_UART2_APPS_CBCR 0x0704
167#define BLSP1_UART2_SIM_CBCR 0x0708
168#define BLSP1_QUP3_SPI_APPS_CBCR 0x0744
169#define BLSP1_QUP3_I2C_APPS_CBCR 0x0748
170#define BLSP1_UART3_APPS_CBCR 0x0784
171#define BLSP1_UART3_SIM_CBCR 0x0788
172#define BLSP1_QUP4_SPI_APPS_CBCR 0x07C4
173#define BLSP1_QUP4_I2C_APPS_CBCR 0x07C8
174#define BLSP1_UART4_APPS_CBCR 0x0804
175#define BLSP1_UART4_SIM_CBCR 0x0808
176#define BLSP1_QUP5_SPI_APPS_CBCR 0x0844
177#define BLSP1_QUP5_I2C_APPS_CBCR 0x0848
178#define BLSP1_UART5_APPS_CBCR 0x0884
179#define BLSP1_UART5_SIM_CBCR 0x0888
180#define BLSP1_QUP6_SPI_APPS_CBCR 0x08C4
181#define BLSP1_QUP6_I2C_APPS_CBCR 0x08C8
182#define BLSP1_UART6_APPS_CBCR 0x0904
183#define BLSP1_UART6_SIM_CBCR 0x0908
184#define BOOT_ROM_AHB_CBCR 0x0E04
185#define PDM_AHB_CBCR 0x0CC4
186#define PDM_XO4_CBCR 0x0CC8
187#define PDM_AHB_CBCR 0x0CC4
188#define PDM_XO4_CBCR 0x0CC8
189#define PDM2_CBCR 0x0CCC
190#define PRNG_AHB_CBCR 0x0D04
191#define BAM_DMA_AHB_CBCR 0x0D44
192#define MSG_RAM_AHB_CBCR 0x0E44
193#define CE1_CBCR 0x1044
194#define CE1_AXI_CBCR 0x1048
195#define CE1_AHB_CBCR 0x104C
196#define GCC_AHB_CBCR 0x10C0
197#define GP1_CBCR 0x1900
198#define GP2_CBCR 0x1940
199#define GP3_CBCR 0x1980
200#define QPIC_CBCR 0x1A44
201#define QPIC_AHB_CBCR 0x1A48
202#define IPA_CBCR 0x1A84
203#define IPA_CNOC_CBCR 0x1A88
204#define IPA_SLEEP_CBCR 0x1A8C
205
206/* LPASS registers */
207/* TODO: Needs to double check lpass regiserts after get the SWI for hw */
208#define LPAPLL_MODE_REG 0x0000
209#define LPAPLL_L_REG 0x0004
210#define LPAPLL_M_REG 0x0008
211#define LPAPLL_N_REG 0x000C
212#define LPAPLL_USER_CTL_REG 0x0010
213#define LPAPLL_CONFIG_CTL_REG 0x0014
214#define LPAPLL_TEST_CTL_REG 0x0018
215#define LPAPLL_STATUS_REG 0x001C
216
217#define LPASS_DEBUG_CLK_CTL_REG 0x29000
218#define LPASS_LPA_PLL_VOTE_APPS_REG 0x2000
219
220#define LPAIF_PRI_CMD_RCGR 0xB000
221#define LPAIF_SEC_CMD_RCGR 0xC000
222#define LPAIF_PCM0_CMD_RCGR 0xF000
223#define LPAIF_PCM1_CMD_RCGR 0x10000
224#define SLIMBUS_CMD_RCGR 0x12000
225#define LPAIF_PCMOE_CMD_RCGR 0x13000
226
227#define AUDIO_CORE_BCR 0x4000
228
229#define AUDIO_CORE_GDSCR 0x7000
230#define AUDIO_CORE_LPAIF_PRI_OSR_CBCR 0xB014
231#define AUDIO_CORE_LPAIF_PRI_IBIT_CBCR 0xB018
232#define AUDIO_CORE_LPAIF_PRI_EBIT_CBCR 0xB01C
233#define AUDIO_CORE_LPAIF_SEC_OSR_CBCR 0xC014
234#define AUDIO_CORE_LPAIF_SEC_IBIT_CBCR 0xC018
235#define AUDIO_CORE_LPAIF_SEC_EBIT_CBCR 0xC01C
236#define AUDIO_CORE_LPAIF_PCM0_IBIT_CBCR 0xF014
237#define AUDIO_CORE_LPAIF_PCM0_EBIT_CBCR 0xF018
238#define AUDIO_CORE_LPAIF_PCM1_IBIT_CBCR 0x10014
239#define AUDIO_CORE_LPAIF_PCM1_EBIT_CBCR 0x10018
240#define AUDIO_CORE_RESAMPLER_CORE_CBCR 0x11014
241#define AUDIO_CORE_RESAMPLER_LFABIF_CBCR 0x11018
242#define AUDIO_CORE_SLIMBUS_CORE_CBCR 0x12014
243#define AUDIO_CORE_SLIMBUS_LFABIF_CBCR 0x12018
244#define AUDIO_CORE_LPAIF_PCM_DATA_OE_CBCR 0x13014
245
246/* Mux source select values */
247#define cxo_source_val 0
248#define gpll0_source_val 1
249#define gpll1_hsic_source_val 4
250#define gnd_source_val 5
251#define cxo_lpass_source_val 0
252#define lpapll0_lpass_source_val 1
253#define gpll0_lpass_source_val 5
254
Vikram Mulukutlad3dca652012-11-19 11:04:13 -0800255#define F_GCC_GND \
256 { \
257 .freq_hz = 0, \
258 .m_val = 0, \
259 .n_val = 0, \
260 .div_src_val = BVAL(4, 0, 1) | BVAL(10, 8, gnd_source_val), \
261 }
262
Tianyi Gou389ba432012-10-01 13:58:38 -0700263#define F(f, s, div, m, n) \
264 { \
265 .freq_hz = (f), \
266 .src_clk = &s##_clk_src.c, \
267 .m_val = (m), \
268 .n_val = ~((n)-(m)) * !!(n), \
269 .d_val = ~(n),\
270 .div_src_val = BVAL(4, 0, (int)(2*(div) - 1)) \
271 | BVAL(10, 8, s##_source_val), \
272 }
273
274#define F_HSIC(f, s, div, m, n) \
275 { \
276 .freq_hz = (f), \
277 .src_clk = &s##_clk_src.c, \
278 .m_val = (m), \
279 .n_val = ~((n)-(m)) * !!(n), \
280 .d_val = ~(n),\
281 .div_src_val = BVAL(4, 0, (int)(2*(div) - 1)) \
282 | BVAL(10, 8, s##_hsic_source_val), \
283 }
284
285#define F_LPASS(f, s, div, m, n) \
286 { \
287 .freq_hz = (f), \
288 .src_clk = &s##_clk_src.c, \
289 .m_val = (m), \
290 .n_val = ~((n)-(m)) * !!(n), \
291 .d_val = ~(n),\
292 .div_src_val = BVAL(4, 0, (int)(2*(div) - 1)) \
293 | BVAL(10, 8, s##_lpass_source_val), \
294 }
295
Tianyi Goua717ddd2012-10-05 17:06:24 -0700296#define F_APCS_PLL(f, l, m, n, pre_div, post_div, vco) \
297 { \
298 .freq_hz = (f), \
299 .l_val = (l), \
300 .m_val = (m), \
301 .n_val = (n), \
302 .pre_div_val = BVAL(14, 12, (pre_div)), \
303 .post_div_val = BVAL(9, 8, (post_div)), \
304 .vco_val = BVAL(21, 20, (vco)), \
305 }
Tianyi Gou389ba432012-10-01 13:58:38 -0700306
307#define VDD_DIG_FMAX_MAP1(l1, f1) \
Saravana Kannan55e959d2012-10-15 22:16:04 -0700308 .vdd_class = &vdd_dig, \
309 .fmax = (unsigned long[VDD_DIG_NUM]) { \
310 [VDD_DIG_##l1] = (f1), \
311 }, \
312 .num_fmax = VDD_DIG_NUM
Tianyi Gou389ba432012-10-01 13:58:38 -0700313#define VDD_DIG_FMAX_MAP2(l1, f1, l2, f2) \
Saravana Kannan55e959d2012-10-15 22:16:04 -0700314 .vdd_class = &vdd_dig, \
315 .fmax = (unsigned long[VDD_DIG_NUM]) { \
316 [VDD_DIG_##l1] = (f1), \
317 [VDD_DIG_##l2] = (f2), \
318 }, \
319 .num_fmax = VDD_DIG_NUM
Tianyi Gou389ba432012-10-01 13:58:38 -0700320#define VDD_DIG_FMAX_MAP3(l1, f1, l2, f2, l3, f3) \
Saravana Kannan55e959d2012-10-15 22:16:04 -0700321 .vdd_class = &vdd_dig, \
322 .fmax = (unsigned long[VDD_DIG_NUM]) { \
323 [VDD_DIG_##l1] = (f1), \
324 [VDD_DIG_##l2] = (f2), \
325 [VDD_DIG_##l3] = (f3), \
326 }, \
327 .num_fmax = VDD_DIG_NUM
Tianyi Gou389ba432012-10-01 13:58:38 -0700328
329enum vdd_dig_levels {
330 VDD_DIG_NONE,
331 VDD_DIG_LOW,
332 VDD_DIG_NOMINAL,
Saravana Kannan55e959d2012-10-15 22:16:04 -0700333 VDD_DIG_HIGH,
334 VDD_DIG_NUM
Tianyi Gou389ba432012-10-01 13:58:38 -0700335};
336
337static const int vdd_corner[] = {
338 [VDD_DIG_NONE] = RPM_REGULATOR_CORNER_NONE,
339 [VDD_DIG_LOW] = RPM_REGULATOR_CORNER_SVS_SOC,
340 [VDD_DIG_NOMINAL] = RPM_REGULATOR_CORNER_NORMAL,
341 [VDD_DIG_HIGH] = RPM_REGULATOR_CORNER_SUPER_TURBO,
342};
343
344static struct regulator *vdd_dig_reg;
345
346int set_vdd_dig(struct clk_vdd_class *vdd_class, int level)
347{
348 return regulator_set_voltage(vdd_dig_reg, vdd_corner[level],
349 RPM_REGULATOR_CORNER_SUPER_TURBO);
350}
351
Saravana Kannan55e959d2012-10-15 22:16:04 -0700352static DEFINE_VDD_CLASS(vdd_dig, set_vdd_dig, VDD_DIG_NUM);
Tianyi Gou389ba432012-10-01 13:58:38 -0700353
354/* TODO: Needs to confirm the below values */
355#define RPM_MISC_CLK_TYPE 0x306b6c63
356#define RPM_BUS_CLK_TYPE 0x316b6c63
357#define RPM_MEM_CLK_TYPE 0x326b6c63
358
359#define RPM_SMD_KEY_ENABLE 0x62616E45
360
361#define CXO_ID 0x0
362#define QDSS_ID 0x1
363
364#define PNOC_ID 0x0
365#define SNOC_ID 0x1
366#define CNOC_ID 0x2
367
368#define BIMC_ID 0x0
369
370#define D0_ID 1
371#define D1_ID 2
372#define A0_ID 3
373#define A1_ID 4
374#define A2_ID 5
375
376DEFINE_CLK_RPM_SMD_BRANCH(cxo_clk_src, cxo_a_clk_src,
377 RPM_MISC_CLK_TYPE, CXO_ID, 19200000);
378
379DEFINE_CLK_RPM_SMD(cnoc_clk, cnoc_a_clk, RPM_BUS_CLK_TYPE, CNOC_ID, NULL);
380DEFINE_CLK_RPM_SMD(pnoc_clk, pnoc_a_clk, RPM_BUS_CLK_TYPE, PNOC_ID, NULL);
381DEFINE_CLK_RPM_SMD(snoc_clk, snoc_a_clk, RPM_BUS_CLK_TYPE, SNOC_ID, NULL);
382
383DEFINE_CLK_RPM_SMD(bimc_clk, bimc_a_clk, RPM_MEM_CLK_TYPE, BIMC_ID, NULL);
384
385DEFINE_CLK_RPM_SMD_QDSS(qdss_clk, qdss_a_clk, RPM_MISC_CLK_TYPE, QDSS_ID);
386
387DEFINE_CLK_RPM_SMD_XO_BUFFER(cxo_d0, cxo_d0_a, D0_ID);
388DEFINE_CLK_RPM_SMD_XO_BUFFER(cxo_d1, cxo_d1_a, D1_ID);
389DEFINE_CLK_RPM_SMD_XO_BUFFER(cxo_a0, cxo_a0_a, A0_ID);
390DEFINE_CLK_RPM_SMD_XO_BUFFER(cxo_a1, cxo_a1_a, A1_ID);
391DEFINE_CLK_RPM_SMD_XO_BUFFER(cxo_a2, cxo_a2_a, A2_ID);
392
393DEFINE_CLK_RPM_SMD_XO_BUFFER_PINCTRL(cxo_d0_pin, cxo_d0_a_pin, D0_ID);
394DEFINE_CLK_RPM_SMD_XO_BUFFER_PINCTRL(cxo_d1_pin, cxo_d1_a_pin, D1_ID);
395DEFINE_CLK_RPM_SMD_XO_BUFFER_PINCTRL(cxo_a0_pin, cxo_a0_a_pin, A0_ID);
396DEFINE_CLK_RPM_SMD_XO_BUFFER_PINCTRL(cxo_a1_pin, cxo_a1_a_pin, A1_ID);
397DEFINE_CLK_RPM_SMD_XO_BUFFER_PINCTRL(cxo_a2_pin, cxo_a2_a_pin, A2_ID);
398
Tianyi Gou27df1bb2012-10-11 14:44:01 -0700399static unsigned int soft_vote_gpll0;
400
Tianyi Gou389ba432012-10-01 13:58:38 -0700401static struct pll_vote_clk gpll0_clk_src = {
402 .en_reg = (void __iomem *)APCS_GPLL_ENA_VOTE_REG,
403 .status_reg = (void __iomem *)GPLL0_STATUS_REG,
404 .status_mask = BIT(17),
Tianyi Gou27df1bb2012-10-11 14:44:01 -0700405 .soft_vote = &soft_vote_gpll0,
406 .soft_vote_mask = PLL_SOFT_VOTE_PRIMARY,
Tianyi Gou389ba432012-10-01 13:58:38 -0700407 .base = &virt_bases[GCC_BASE],
408 .c = {
Saravana Kannan7a6532e2012-10-18 20:51:13 -0700409 .parent = &cxo_clk_src.c,
Tianyi Gou389ba432012-10-01 13:58:38 -0700410 .rate = 600000000,
411 .dbg_name = "gpll0_clk_src",
Tianyi Gou27df1bb2012-10-11 14:44:01 -0700412 .ops = &clk_ops_pll_acpu_vote,
Tianyi Gou389ba432012-10-01 13:58:38 -0700413 CLK_INIT(gpll0_clk_src.c),
414 },
415};
416
Tianyi Gou27df1bb2012-10-11 14:44:01 -0700417static struct pll_vote_clk gpll0_activeonly_clk_src = {
418 .en_reg = (void __iomem *)APCS_GPLL_ENA_VOTE_REG,
419 .status_reg = (void __iomem *)GPLL0_STATUS_REG,
420 .status_mask = BIT(17),
421 .soft_vote = &soft_vote_gpll0,
422 .soft_vote_mask = PLL_SOFT_VOTE_ACPU,
423 .base = &virt_bases[GCC_BASE],
424 .c = {
425 .rate = 600000000,
426 .dbg_name = "gpll0_activeonly_clk_src",
427 .ops = &clk_ops_pll_acpu_vote,
428 CLK_INIT(gpll0_activeonly_clk_src.c),
429 },
430};
431
Tianyi Gou389ba432012-10-01 13:58:38 -0700432static struct pll_vote_clk lpapll0_clk_src = {
433 .en_reg = (void __iomem *)LPASS_LPA_PLL_VOTE_APPS_REG,
434 .en_mask = BIT(0),
435 .status_reg = (void __iomem *)LPAPLL_STATUS_REG,
436 .status_mask = BIT(17),
Tianyi Gou389ba432012-10-01 13:58:38 -0700437 .base = &virt_bases[LPASS_BASE],
438 .c = {
Saravana Kannan7a6532e2012-10-18 20:51:13 -0700439 .parent = &cxo_clk_src.c,
Tianyi Gou389ba432012-10-01 13:58:38 -0700440 .rate = 393216000,
441 .dbg_name = "lpapll0_clk_src",
442 .ops = &clk_ops_pll_vote,
443 CLK_INIT(lpapll0_clk_src.c),
444 },
445};
446
447static struct pll_vote_clk gpll1_clk_src = {
448 .en_reg = (void __iomem *)APCS_GPLL_ENA_VOTE_REG,
449 .en_mask = BIT(1),
450 .status_reg = (void __iomem *)GPLL1_STATUS_REG,
451 .status_mask = BIT(17),
Tianyi Gou389ba432012-10-01 13:58:38 -0700452 .base = &virt_bases[GCC_BASE],
453 .c = {
Saravana Kannan7a6532e2012-10-18 20:51:13 -0700454 .parent = &cxo_clk_src.c,
Tianyi Gou389ba432012-10-01 13:58:38 -0700455 .rate = 480000000,
456 .dbg_name = "gpll1_clk_src",
457 .ops = &clk_ops_pll_vote,
458 CLK_INIT(gpll1_clk_src.c),
459 },
460};
461
Tianyi Goua717ddd2012-10-05 17:06:24 -0700462static struct pll_freq_tbl apcs_pll_freq[] = {
463 F_APCS_PLL(748800000, 0x27, 0x0, 0x1, 0x0, 0x0, 0x0),
464 F_APCS_PLL(998400000, 0x34, 0x0, 0x1, 0x0, 0x0, 0x0),
465 PLL_F_END
466};
467
Tianyi Gou389ba432012-10-01 13:58:38 -0700468/*
469 * Need to skip handoff of the acpu pll to avoid handoff code
470 * to turn off the pll when the acpu is running off this pll.
471 */
472static struct pll_clk apcspll_clk_src = {
473 .mode_reg = (void __iomem *)APCS_CPU_PLL_MODE_REG,
Tianyi Goua717ddd2012-10-05 17:06:24 -0700474 .l_reg = (void __iomem *)APCS_CPU_PLL_L_REG,
475 .m_reg = (void __iomem *)APCS_CPU_PLL_M_REG,
476 .n_reg = (void __iomem *)APCS_CPU_PLL_N_REG,
477 .config_reg = (void __iomem *)APCS_CPU_PLL_USER_CTL_REG,
Tianyi Gou389ba432012-10-01 13:58:38 -0700478 .status_reg = (void __iomem *)APCS_CPU_PLL_STATUS_REG,
Tianyi Goua717ddd2012-10-05 17:06:24 -0700479 .freq_tbl = apcs_pll_freq,
480 .masks = {
481 .vco_mask = BM(21, 20),
482 .pre_div_mask = BM(14, 12),
483 .post_div_mask = BM(9, 8),
484 .mn_en_mask = BIT(24),
485 .main_output_mask = BIT(0),
486 },
Tianyi Gou389ba432012-10-01 13:58:38 -0700487 .base = &virt_bases[APCS_PLL_BASE],
488 .c = {
Tianyi Gou389ba432012-10-01 13:58:38 -0700489 .dbg_name = "apcspll_clk_src",
490 .ops = &clk_ops_local_pll,
491 CLK_INIT(apcspll_clk_src.c),
492 .flags = CLKFLAG_SKIP_HANDOFF,
493 },
494};
495
496static DEFINE_CLK_VOTER(pnoc_msmbus_clk, &pnoc_clk.c, LONG_MAX);
497static DEFINE_CLK_VOTER(snoc_msmbus_clk, &snoc_clk.c, LONG_MAX);
498static DEFINE_CLK_VOTER(cnoc_msmbus_clk, &cnoc_clk.c, LONG_MAX);
499static DEFINE_CLK_VOTER(pnoc_msmbus_a_clk, &pnoc_a_clk.c, LONG_MAX);
500static DEFINE_CLK_VOTER(snoc_msmbus_a_clk, &snoc_a_clk.c, LONG_MAX);
501static DEFINE_CLK_VOTER(cnoc_msmbus_a_clk, &cnoc_a_clk.c, LONG_MAX);
502
503static DEFINE_CLK_VOTER(bimc_msmbus_clk, &bimc_clk.c, LONG_MAX);
504static DEFINE_CLK_VOTER(bimc_msmbus_a_clk, &bimc_a_clk.c, LONG_MAX);
505
506static DEFINE_CLK_VOTER(pnoc_sdcc2_clk, &pnoc_clk.c, LONG_MAX);
507static DEFINE_CLK_VOTER(pnoc_sdcc3_clk, &pnoc_clk.c, LONG_MAX);
508
509static DEFINE_CLK_VOTER(pnoc_sps_clk, &pnoc_clk.c, LONG_MAX);
510
511static struct clk_freq_tbl ftbl_gcc_ipa_clk[] = {
512 F( 50000000, gpll0, 12, 0, 0),
513 F( 92310000, gpll0, 6.5, 0, 0),
514 F(100000000, gpll0, 6, 0, 0),
515 F_END
516};
517
518static struct rcg_clk ipa_clk_src = {
519 .cmd_rcgr_reg = IPA_CMD_RCGR,
520 .set_rate = set_rate_mnd,
521 .freq_tbl = ftbl_gcc_ipa_clk,
522 .current_freq = &rcg_dummy_freq,
523 .base = &virt_bases[GCC_BASE],
524 .c = {
525 .dbg_name = "ipa_clk_src",
526 .ops = &clk_ops_rcg_mnd,
527 VDD_DIG_FMAX_MAP2(LOW, 50000000, NOMINAL, 100000000),
528 CLK_INIT(ipa_clk_src.c)
529 },
530};
531
Tianyi Goub1d13972013-01-23 22:55:22 -0800532static struct clk_freq_tbl ftbl_gcc_blsp1_qup1_6_i2c_apps_clk[] = {
533 F(19200000, cxo, 1, 0, 0),
534 F(50000000, gpll0, 12, 0, 0),
535 F_END
536};
537
538static struct rcg_clk blsp1_qup1_i2c_apps_clk_src = {
539 .cmd_rcgr_reg = BLSP1_QUP1_I2C_APPS_CMD_RCGR,
540 .set_rate = set_rate_hid,
541 .freq_tbl = ftbl_gcc_blsp1_qup1_6_i2c_apps_clk,
542 .current_freq = &rcg_dummy_freq,
543 .base = &virt_bases[GCC_BASE],
544 .c = {
545 .dbg_name = "blsp1_qup1_i2c_apps_clk_src",
546 .ops = &clk_ops_rcg,
547 VDD_DIG_FMAX_MAP1(LOW, 50000000),
548 CLK_INIT(blsp1_qup1_i2c_apps_clk_src.c),
549 },
550};
551
552static struct rcg_clk blsp1_qup2_i2c_apps_clk_src = {
553 .cmd_rcgr_reg = BLSP1_QUP2_I2C_APPS_CMD_RCGR,
554 .set_rate = set_rate_hid,
555 .freq_tbl = ftbl_gcc_blsp1_qup1_6_i2c_apps_clk,
556 .current_freq = &rcg_dummy_freq,
557 .base = &virt_bases[GCC_BASE],
558 .c = {
559 .dbg_name = "blsp1_qup2_i2c_apps_clk_src",
560 .ops = &clk_ops_rcg,
561 VDD_DIG_FMAX_MAP1(LOW, 50000000),
562 CLK_INIT(blsp1_qup2_i2c_apps_clk_src.c),
563 },
564};
565
566static struct rcg_clk blsp1_qup3_i2c_apps_clk_src = {
567 .cmd_rcgr_reg = BLSP1_QUP3_I2C_APPS_CMD_RCGR,
568 .set_rate = set_rate_hid,
569 .freq_tbl = ftbl_gcc_blsp1_qup1_6_i2c_apps_clk,
570 .current_freq = &rcg_dummy_freq,
571 .base = &virt_bases[GCC_BASE],
572 .c = {
573 .dbg_name = "blsp1_qup3_i2c_apps_clk_src",
574 .ops = &clk_ops_rcg,
575 VDD_DIG_FMAX_MAP1(LOW, 50000000),
576 CLK_INIT(blsp1_qup3_i2c_apps_clk_src.c),
577 },
578};
579
580static struct rcg_clk blsp1_qup4_i2c_apps_clk_src = {
581 .cmd_rcgr_reg = BLSP1_QUP4_I2C_APPS_CMD_RCGR,
582 .set_rate = set_rate_hid,
583 .freq_tbl = ftbl_gcc_blsp1_qup1_6_i2c_apps_clk,
584 .current_freq = &rcg_dummy_freq,
585 .base = &virt_bases[GCC_BASE],
586 .c = {
587 .dbg_name = "blsp1_qup4_i2c_apps_clk_src",
588 .ops = &clk_ops_rcg,
589 VDD_DIG_FMAX_MAP1(LOW, 50000000),
590 CLK_INIT(blsp1_qup4_i2c_apps_clk_src.c),
591 },
592};
593
594static struct rcg_clk blsp1_qup5_i2c_apps_clk_src = {
595 .cmd_rcgr_reg = BLSP1_QUP5_I2C_APPS_CMD_RCGR,
596 .set_rate = set_rate_hid,
597 .freq_tbl = ftbl_gcc_blsp1_qup1_6_i2c_apps_clk,
598 .current_freq = &rcg_dummy_freq,
599 .base = &virt_bases[GCC_BASE],
600 .c = {
601 .dbg_name = "blsp1_qup5_i2c_apps_clk_src",
602 .ops = &clk_ops_rcg,
603 VDD_DIG_FMAX_MAP1(LOW, 50000000),
604 CLK_INIT(blsp1_qup5_i2c_apps_clk_src.c),
605 },
606};
607
608static struct rcg_clk blsp1_qup6_i2c_apps_clk_src = {
609 .cmd_rcgr_reg = BLSP1_QUP6_I2C_APPS_CMD_RCGR,
610 .set_rate = set_rate_hid,
611 .freq_tbl = ftbl_gcc_blsp1_qup1_6_i2c_apps_clk,
612 .current_freq = &rcg_dummy_freq,
613 .base = &virt_bases[GCC_BASE],
614 .c = {
615 .dbg_name = "blsp1_qup6_i2c_apps_clk_src",
616 .ops = &clk_ops_rcg,
617 VDD_DIG_FMAX_MAP1(LOW, 50000000),
618 CLK_INIT(blsp1_qup6_i2c_apps_clk_src.c),
619 },
620};
621
Tianyi Gou389ba432012-10-01 13:58:38 -0700622static struct clk_freq_tbl ftbl_gcc_blsp1_qup1_6_spi_apps_clk[] = {
623 F( 960000, cxo, 10, 1, 2),
624 F( 4800000, cxo, 4, 0, 0),
625 F( 9600000, cxo, 2, 0, 0),
626 F(15000000, gpll0, 10, 1, 4),
627 F(19200000, cxo, 1, 0, 0),
628 F(25000000, gpll0, 12, 1, 2),
629 F(50000000, gpll0, 12, 0, 0),
630 F_END
631};
632
633static struct rcg_clk blsp1_qup1_spi_apps_clk_src = {
634 .cmd_rcgr_reg = BLSP1_QUP1_SPI_APPS_CMD_RCGR,
635 .set_rate = set_rate_mnd,
636 .freq_tbl = ftbl_gcc_blsp1_qup1_6_spi_apps_clk,
637 .current_freq = &rcg_dummy_freq,
638 .base = &virt_bases[GCC_BASE],
639 .c = {
640 .dbg_name = "blsp1_qup1_spi_apps_clk_src",
641 .ops = &clk_ops_rcg_mnd,
642 VDD_DIG_FMAX_MAP2(LOW, 25000000, NOMINAL, 50000000),
643 CLK_INIT(blsp1_qup1_spi_apps_clk_src.c)
644 },
645};
646
647static struct rcg_clk blsp1_qup2_spi_apps_clk_src = {
648 .cmd_rcgr_reg = BLSP1_QUP2_SPI_APPS_CMD_RCGR,
649 .set_rate = set_rate_mnd,
650 .freq_tbl = ftbl_gcc_blsp1_qup1_6_spi_apps_clk,
651 .current_freq = &rcg_dummy_freq,
652 .base = &virt_bases[GCC_BASE],
653 .c = {
654 .dbg_name = "blsp1_qup2_spi_apps_clk_src",
655 .ops = &clk_ops_rcg_mnd,
656 VDD_DIG_FMAX_MAP2(LOW, 25000000, NOMINAL, 50000000),
657 CLK_INIT(blsp1_qup2_spi_apps_clk_src.c)
658 },
659};
660
661static struct rcg_clk blsp1_qup3_spi_apps_clk_src = {
662 .cmd_rcgr_reg = BLSP1_QUP3_SPI_APPS_CMD_RCGR,
663 .set_rate = set_rate_mnd,
664 .freq_tbl = ftbl_gcc_blsp1_qup1_6_spi_apps_clk,
665 .current_freq = &rcg_dummy_freq,
666 .base = &virt_bases[GCC_BASE],
667 .c = {
668 .dbg_name = "blsp1_qup3_spi_apps_clk_src",
669 .ops = &clk_ops_rcg_mnd,
670 VDD_DIG_FMAX_MAP2(LOW, 25000000, NOMINAL, 50000000),
671 CLK_INIT(blsp1_qup3_spi_apps_clk_src.c)
672 },
673};
674
675static struct rcg_clk blsp1_qup4_spi_apps_clk_src = {
676 .cmd_rcgr_reg = BLSP1_QUP4_SPI_APPS_CMD_RCGR,
677 .set_rate = set_rate_mnd,
678 .freq_tbl = ftbl_gcc_blsp1_qup1_6_spi_apps_clk,
679 .current_freq = &rcg_dummy_freq,
680 .base = &virt_bases[GCC_BASE],
681 .c = {
682 .dbg_name = "blsp1_qup4_spi_apps_clk_src",
683 .ops = &clk_ops_rcg_mnd,
684 VDD_DIG_FMAX_MAP2(LOW, 25000000, NOMINAL, 50000000),
685 CLK_INIT(blsp1_qup4_spi_apps_clk_src.c)
686 },
687};
688
689static struct rcg_clk blsp1_qup5_spi_apps_clk_src = {
690 .cmd_rcgr_reg = BLSP1_QUP5_SPI_APPS_CMD_RCGR,
691 .set_rate = set_rate_mnd,
692 .freq_tbl = ftbl_gcc_blsp1_qup1_6_spi_apps_clk,
693 .current_freq = &rcg_dummy_freq,
694 .base = &virt_bases[GCC_BASE],
695 .c = {
696 .dbg_name = "blsp1_qup5_spi_apps_clk_src",
697 .ops = &clk_ops_rcg_mnd,
698 VDD_DIG_FMAX_MAP2(LOW, 25000000, NOMINAL, 50000000),
699 CLK_INIT(blsp1_qup5_spi_apps_clk_src.c)
700 },
701};
702
703static struct rcg_clk blsp1_qup6_spi_apps_clk_src = {
704 .cmd_rcgr_reg = BLSP1_QUP6_SPI_APPS_CMD_RCGR,
705 .set_rate = set_rate_mnd,
706 .freq_tbl = ftbl_gcc_blsp1_qup1_6_spi_apps_clk,
707 .current_freq = &rcg_dummy_freq,
708 .base = &virt_bases[GCC_BASE],
709 .c = {
710 .dbg_name = "blsp1_qup6_spi_apps_clk_src",
711 .ops = &clk_ops_rcg_mnd,
712 VDD_DIG_FMAX_MAP2(LOW, 25000000, NOMINAL, 50000000),
713 CLK_INIT(blsp1_qup6_spi_apps_clk_src.c)
714 },
715};
716
717static struct clk_freq_tbl ftbl_gcc_blsp1_uart1_6_apps_clk[] = {
Vikram Mulukutlad3dca652012-11-19 11:04:13 -0800718 F_GCC_GND,
Tianyi Gou389ba432012-10-01 13:58:38 -0700719 F( 3686400, gpll0, 1, 96, 15625),
720 F( 7372800, gpll0, 1, 192, 15625),
721 F(14745600, gpll0, 1, 384, 15625),
722 F(16000000, gpll0, 5, 2, 15),
723 F(19200000, cxo, 1, 0, 0),
724 F(24000000, gpll0, 5, 1, 5),
725 F(32000000, gpll0, 1, 4, 75),
726 F(40000000, gpll0, 15, 0, 0),
727 F(46400000, gpll0, 1, 29, 375),
728 F(48000000, gpll0, 12.5, 0, 0),
729 F(51200000, gpll0, 1, 32, 375),
730 F(56000000, gpll0, 1, 7, 75),
731 F(58982400, gpll0, 1, 1536, 15625),
732 F(60000000, gpll0, 10, 0, 0),
733 F_END
734};
735
736static struct rcg_clk blsp1_uart1_apps_clk_src = {
737 .cmd_rcgr_reg = BLSP1_UART1_APPS_CMD_RCGR,
738 .set_rate = set_rate_mnd,
739 .freq_tbl = ftbl_gcc_blsp1_uart1_6_apps_clk,
740 .current_freq = &rcg_dummy_freq,
741 .base = &virt_bases[GCC_BASE],
742 .c = {
743 .dbg_name = "blsp1_uart1_apps_clk_src",
744 .ops = &clk_ops_rcg_mnd,
745 VDD_DIG_FMAX_MAP2(LOW, 31580000, NOMINAL, 63160000),
746 CLK_INIT(blsp1_uart1_apps_clk_src.c)
747 },
748};
749
750static struct rcg_clk blsp1_uart2_apps_clk_src = {
751 .cmd_rcgr_reg = BLSP1_UART2_APPS_CMD_RCGR,
752 .set_rate = set_rate_mnd,
753 .freq_tbl = ftbl_gcc_blsp1_uart1_6_apps_clk,
754 .current_freq = &rcg_dummy_freq,
755 .base = &virt_bases[GCC_BASE],
756 .c = {
757 .dbg_name = "blsp1_uart2_apps_clk_src",
758 .ops = &clk_ops_rcg_mnd,
759 VDD_DIG_FMAX_MAP2(LOW, 31580000, NOMINAL, 63160000),
760 CLK_INIT(blsp1_uart2_apps_clk_src.c)
761 },
762};
763
764static struct rcg_clk blsp1_uart3_apps_clk_src = {
765 .cmd_rcgr_reg = BLSP1_UART3_APPS_CMD_RCGR,
766 .set_rate = set_rate_mnd,
767 .freq_tbl = ftbl_gcc_blsp1_uart1_6_apps_clk,
768 .current_freq = &rcg_dummy_freq,
769 .base = &virt_bases[GCC_BASE],
770 .c = {
771 .dbg_name = "blsp1_uart3_apps_clk_src",
772 .ops = &clk_ops_rcg_mnd,
773 VDD_DIG_FMAX_MAP2(LOW, 31580000, NOMINAL, 63160000),
774 CLK_INIT(blsp1_uart3_apps_clk_src.c)
775 },
776};
777
778static struct rcg_clk blsp1_uart4_apps_clk_src = {
779 .cmd_rcgr_reg = BLSP1_UART4_APPS_CMD_RCGR,
780 .set_rate = set_rate_mnd,
781 .freq_tbl = ftbl_gcc_blsp1_uart1_6_apps_clk,
782 .current_freq = &rcg_dummy_freq,
783 .base = &virt_bases[GCC_BASE],
784 .c = {
785 .dbg_name = "blsp1_uart4_apps_clk_src",
786 .ops = &clk_ops_rcg_mnd,
787 VDD_DIG_FMAX_MAP2(LOW, 31580000, NOMINAL, 63160000),
788 CLK_INIT(blsp1_uart4_apps_clk_src.c)
789 },
790};
791
792static struct rcg_clk blsp1_uart5_apps_clk_src = {
793 .cmd_rcgr_reg = BLSP1_UART5_APPS_CMD_RCGR,
794 .set_rate = set_rate_mnd,
795 .freq_tbl = ftbl_gcc_blsp1_uart1_6_apps_clk,
796 .current_freq = &rcg_dummy_freq,
797 .base = &virt_bases[GCC_BASE],
798 .c = {
799 .dbg_name = "blsp1_uart5_apps_clk_src",
800 .ops = &clk_ops_rcg_mnd,
801 VDD_DIG_FMAX_MAP2(LOW, 31580000, NOMINAL, 63160000),
802 CLK_INIT(blsp1_uart5_apps_clk_src.c)
803 },
804};
805
806static struct rcg_clk blsp1_uart6_apps_clk_src = {
807 .cmd_rcgr_reg = BLSP1_UART6_APPS_CMD_RCGR,
808 .set_rate = set_rate_mnd,
809 .freq_tbl = ftbl_gcc_blsp1_uart1_6_apps_clk,
810 .current_freq = &rcg_dummy_freq,
811 .base = &virt_bases[GCC_BASE],
812 .c = {
813 .dbg_name = "blsp1_uart6_apps_clk_src",
814 .ops = &clk_ops_rcg_mnd,
815 VDD_DIG_FMAX_MAP2(LOW, 31580000, NOMINAL, 63160000),
816 CLK_INIT(blsp1_uart6_apps_clk_src.c)
817 },
818};
819
820static struct clk_freq_tbl ftbl_gcc_ce1_clk[] = {
821 F( 50000000, gpll0, 12, 0, 0),
822 F(100000000, gpll0, 6, 0, 0),
823 F_END
824};
825
826static struct rcg_clk ce1_clk_src = {
827 .cmd_rcgr_reg = CE1_CMD_RCGR,
828 .set_rate = set_rate_hid,
829 .freq_tbl = ftbl_gcc_ce1_clk,
830 .current_freq = &rcg_dummy_freq,
831 .base = &virt_bases[GCC_BASE],
832 .c = {
833 .dbg_name = "ce1_clk_src",
834 .ops = &clk_ops_rcg,
835 VDD_DIG_FMAX_MAP2(LOW, 50000000, NOMINAL, 100000000),
836 CLK_INIT(ce1_clk_src.c),
837 },
838};
839
840static struct clk_freq_tbl ftbl_gcc_gp_clk[] = {
841 F(19200000, cxo, 1, 0, 0),
842 F_END
843};
844
845static struct rcg_clk gp1_clk_src = {
846 .cmd_rcgr_reg = GP1_CMD_RCGR,
847 .set_rate = set_rate_mnd,
848 .freq_tbl = ftbl_gcc_gp_clk,
849 .current_freq = &rcg_dummy_freq,
850 .base = &virt_bases[GCC_BASE],
851 .c = {
852 .dbg_name = "gp1_clk_src",
853 .ops = &clk_ops_rcg_mnd,
854 VDD_DIG_FMAX_MAP2(LOW, 100000000, NOMINAL, 200000000),
855 CLK_INIT(gp1_clk_src.c)
856 },
857};
858
859static struct rcg_clk gp2_clk_src = {
860 .cmd_rcgr_reg = GP2_CMD_RCGR,
861 .set_rate = set_rate_mnd,
862 .freq_tbl = ftbl_gcc_gp_clk,
863 .current_freq = &rcg_dummy_freq,
864 .base = &virt_bases[GCC_BASE],
865 .c = {
866 .dbg_name = "gp2_clk_src",
867 .ops = &clk_ops_rcg_mnd,
868 VDD_DIG_FMAX_MAP2(LOW, 100000000, NOMINAL, 200000000),
869 CLK_INIT(gp2_clk_src.c)
870 },
871};
872
873static struct rcg_clk gp3_clk_src = {
874 .cmd_rcgr_reg = GP3_CMD_RCGR,
875 .set_rate = set_rate_mnd,
876 .freq_tbl = ftbl_gcc_gp_clk,
877 .current_freq = &rcg_dummy_freq,
878 .base = &virt_bases[GCC_BASE],
879 .c = {
880 .dbg_name = "gp3_clk_src",
881 .ops = &clk_ops_rcg_mnd,
882 VDD_DIG_FMAX_MAP2(LOW, 100000000, NOMINAL, 200000000),
883 CLK_INIT(gp3_clk_src.c)
884 },
885};
886
887static struct clk_freq_tbl ftbl_gcc_pdm2_clk[] = {
888 F(60000000, gpll0, 10, 0, 0),
889 F_END
890};
891
892static struct rcg_clk pdm2_clk_src = {
893 .cmd_rcgr_reg = PDM2_CMD_RCGR,
894 .set_rate = set_rate_hid,
895 .freq_tbl = ftbl_gcc_pdm2_clk,
896 .current_freq = &rcg_dummy_freq,
897 .base = &virt_bases[GCC_BASE],
898 .c = {
899 .dbg_name = "pdm2_clk_src",
900 .ops = &clk_ops_rcg,
901 VDD_DIG_FMAX_MAP1(LOW, 60000000),
902 CLK_INIT(pdm2_clk_src.c),
903 },
904};
905
906static struct clk_freq_tbl ftbl_gcc_qpic_clk[] = {
907 F( 50000000, gpll0, 12, 0, 0),
908 F(100000000, gpll0, 6, 0, 0),
909 F_END
910};
911
912static struct rcg_clk qpic_clk_src = {
913 .cmd_rcgr_reg = QPIC_CMD_RCGR,
914 .set_rate = set_rate_mnd,
915 .freq_tbl = ftbl_gcc_qpic_clk,
916 .current_freq = &rcg_dummy_freq,
917 .base = &virt_bases[GCC_BASE],
918 .c = {
919 .dbg_name = "qpic_clk_src",
920 .ops = &clk_ops_rcg_mnd,
921 VDD_DIG_FMAX_MAP2(LOW, 50000000, NOMINAL, 100000000),
922 CLK_INIT(qpic_clk_src.c)
923 },
924};
925
926static struct clk_freq_tbl ftbl_gcc_sdcc2_apps_clk[] = {
927 F( 144000, cxo, 16, 3, 25),
928 F( 400000, cxo, 12, 1, 4),
929 F( 20000000, gpll0, 15, 1, 2),
930 F( 25000000, gpll0, 12, 1, 2),
931 F( 50000000, gpll0, 12, 0, 0),
932 F(100000000, gpll0, 6, 0, 0),
933 F(200000000, gpll0, 3, 0, 0),
934 F_END
935};
936
937static struct clk_freq_tbl ftbl_gcc_sdcc3_apps_clk[] = {
938 F( 144000, cxo, 16, 3, 25),
939 F( 400000, cxo, 12, 1, 4),
940 F( 20000000, gpll0, 15, 1, 2),
941 F( 25000000, gpll0, 12, 1, 2),
942 F( 50000000, gpll0, 12, 0, 0),
943 F(100000000, gpll0, 6, 0, 0),
944 F_END
945};
946
947static struct rcg_clk sdcc2_apps_clk_src = {
948 .cmd_rcgr_reg = SDCC2_APPS_CMD_RCGR,
949 .set_rate = set_rate_mnd,
950 .freq_tbl = ftbl_gcc_sdcc2_apps_clk,
951 .current_freq = &rcg_dummy_freq,
952 .base = &virt_bases[GCC_BASE],
953 .c = {
954 .dbg_name = "sdcc2_apps_clk_src",
955 .ops = &clk_ops_rcg_mnd,
956 VDD_DIG_FMAX_MAP2(LOW, 100000000, NOMINAL, 200000000),
957 CLK_INIT(sdcc2_apps_clk_src.c)
958 },
959};
960
961static struct rcg_clk sdcc3_apps_clk_src = {
962 .cmd_rcgr_reg = SDCC3_APPS_CMD_RCGR,
963 .set_rate = set_rate_mnd,
964 .freq_tbl = ftbl_gcc_sdcc3_apps_clk,
965 .current_freq = &rcg_dummy_freq,
966 .base = &virt_bases[GCC_BASE],
967 .c = {
968 .dbg_name = "sdcc3_apps_clk_src",
969 .ops = &clk_ops_rcg_mnd,
970 VDD_DIG_FMAX_MAP2(LOW, 50000000, NOMINAL, 100000000),
971 CLK_INIT(sdcc3_apps_clk_src.c)
972 },
973};
974
975static struct clk_freq_tbl ftbl_gcc_usb_hs_system_clk[] = {
976 F(75000000, gpll0, 8, 0, 0),
977 F_END
978};
979
980static struct rcg_clk usb_hs_system_clk_src = {
981 .cmd_rcgr_reg = USB_HS_SYSTEM_CMD_RCGR,
982 .set_rate = set_rate_hid,
983 .freq_tbl = ftbl_gcc_usb_hs_system_clk,
984 .current_freq = &rcg_dummy_freq,
985 .base = &virt_bases[GCC_BASE],
986 .c = {
987 .dbg_name = "usb_hs_system_clk_src",
988 .ops = &clk_ops_rcg,
989 VDD_DIG_FMAX_MAP2(LOW, 37500000, NOMINAL, 75000000),
990 CLK_INIT(usb_hs_system_clk_src.c),
991 },
992};
993
994static struct clk_freq_tbl ftbl_gcc_usb_hsic_clk[] = {
995 F_HSIC(480000000, gpll1, 1, 0, 0),
996 F_END
997};
998
999static struct rcg_clk usb_hsic_clk_src = {
1000 .cmd_rcgr_reg = USB_HSIC_CMD_RCGR,
1001 .set_rate = set_rate_hid,
1002 .freq_tbl = ftbl_gcc_usb_hsic_clk,
1003 .current_freq = &rcg_dummy_freq,
1004 .base = &virt_bases[GCC_BASE],
1005 .c = {
1006 .dbg_name = "usb_hsic_clk_src",
1007 .ops = &clk_ops_rcg,
1008 VDD_DIG_FMAX_MAP1(LOW, 480000000),
1009 CLK_INIT(usb_hsic_clk_src.c),
1010 },
1011};
1012
1013static struct clk_freq_tbl ftbl_gcc_usb_hsic_io_cal_clk[] = {
1014 F(9600000, cxo, 2, 0, 0),
1015 F_END
1016};
1017
1018static struct rcg_clk usb_hsic_io_cal_clk_src = {
1019 .cmd_rcgr_reg = USB_HSIC_IO_CAL_CMD_RCGR,
1020 .set_rate = set_rate_hid,
1021 .freq_tbl = ftbl_gcc_usb_hsic_io_cal_clk,
1022 .current_freq = &rcg_dummy_freq,
1023 .base = &virt_bases[GCC_BASE],
1024 .c = {
1025 .dbg_name = "usb_hsic_io_cal_clk_src",
1026 .ops = &clk_ops_rcg,
1027 VDD_DIG_FMAX_MAP1(LOW, 9600000),
1028 CLK_INIT(usb_hsic_io_cal_clk_src.c),
1029 },
1030};
1031
1032static struct clk_freq_tbl ftbl_gcc_usb_hsic_system_clk[] = {
1033 F(75000000, gpll0, 8, 0, 0),
1034 F_END
1035};
1036
1037static struct rcg_clk usb_hsic_system_clk_src = {
1038 .cmd_rcgr_reg = USB_HSIC_SYSTEM_CMD_RCGR,
1039 .set_rate = set_rate_hid,
1040 .freq_tbl = ftbl_gcc_usb_hsic_system_clk,
1041 .current_freq = &rcg_dummy_freq,
1042 .base = &virt_bases[GCC_BASE],
1043 .c = {
1044 .dbg_name = "usb_hsic_system_clk_src",
1045 .ops = &clk_ops_rcg,
1046 VDD_DIG_FMAX_MAP2(LOW, 60000000, NOMINAL, 75000000),
1047 CLK_INIT(usb_hsic_system_clk_src.c),
1048 },
1049};
1050
1051static struct clk_freq_tbl ftbl_gcc_usb_hsic_xcvr_fs_clk[] = {
1052 F(60000000, gpll0, 10, 0, 0),
1053 F_END
1054};
1055
1056static struct rcg_clk usb_hsic_xcvr_fs_clk_src = {
1057 .cmd_rcgr_reg = USB_HSIC_XCVR_FS_CMD_RCGR,
1058 .set_rate = set_rate_hid,
1059 .freq_tbl = ftbl_gcc_usb_hsic_xcvr_fs_clk,
1060 .current_freq = &rcg_dummy_freq,
1061 .base = &virt_bases[GCC_BASE],
1062 .c = {
1063 .dbg_name = "usb_hsic_xcvr_fs_clk_src",
1064 .ops = &clk_ops_rcg,
1065 VDD_DIG_FMAX_MAP1(LOW, 60000000),
1066 CLK_INIT(usb_hsic_xcvr_fs_clk_src.c),
1067 },
1068};
1069
1070static struct local_vote_clk gcc_bam_dma_ahb_clk = {
1071 .cbcr_reg = BAM_DMA_AHB_CBCR,
1072 .vote_reg = APCS_CLOCK_BRANCH_ENA_VOTE,
1073 .en_mask = BIT(12),
1074 .base = &virt_bases[GCC_BASE],
1075 .c = {
1076 .dbg_name = "gcc_bam_dma_ahb_clk",
1077 .ops = &clk_ops_vote,
1078 CLK_INIT(gcc_bam_dma_ahb_clk.c),
1079 },
1080};
1081
1082static struct local_vote_clk gcc_blsp1_ahb_clk = {
1083 .cbcr_reg = BLSP1_AHB_CBCR,
1084 .vote_reg = APCS_CLOCK_BRANCH_ENA_VOTE,
1085 .en_mask = BIT(17),
1086 .base = &virt_bases[GCC_BASE],
1087 .c = {
1088 .dbg_name = "gcc_blsp1_ahb_clk",
1089 .ops = &clk_ops_vote,
1090 CLK_INIT(gcc_blsp1_ahb_clk.c),
1091 },
1092};
1093
1094static struct branch_clk gcc_blsp1_qup1_i2c_apps_clk = {
1095 .cbcr_reg = BLSP1_QUP1_I2C_APPS_CBCR,
Tianyi Gou389ba432012-10-01 13:58:38 -07001096 .base = &virt_bases[GCC_BASE],
1097 .c = {
Saravana Kannan7a6532e2012-10-18 20:51:13 -07001098 .parent = &cxo_clk_src.c,
Tianyi Gou389ba432012-10-01 13:58:38 -07001099 .dbg_name = "gcc_blsp1_qup1_i2c_apps_clk",
1100 .ops = &clk_ops_branch,
1101 CLK_INIT(gcc_blsp1_qup1_i2c_apps_clk.c),
1102 },
1103};
1104
1105static struct branch_clk gcc_blsp1_qup1_spi_apps_clk = {
1106 .cbcr_reg = BLSP1_QUP1_SPI_APPS_CBCR,
Tianyi Gou389ba432012-10-01 13:58:38 -07001107 .has_sibling = 0,
1108 .base = &virt_bases[GCC_BASE],
1109 .c = {
Saravana Kannan7a6532e2012-10-18 20:51:13 -07001110 .parent = &blsp1_qup1_spi_apps_clk_src.c,
Tianyi Gou389ba432012-10-01 13:58:38 -07001111 .dbg_name = "gcc_blsp1_qup1_spi_apps_clk",
1112 .ops = &clk_ops_branch,
1113 CLK_INIT(gcc_blsp1_qup1_spi_apps_clk.c),
1114 },
1115};
1116
1117static struct branch_clk gcc_blsp1_qup2_i2c_apps_clk = {
1118 .cbcr_reg = BLSP1_QUP2_I2C_APPS_CBCR,
Tianyi Gou389ba432012-10-01 13:58:38 -07001119 .base = &virt_bases[GCC_BASE],
1120 .c = {
Saravana Kannan7a6532e2012-10-18 20:51:13 -07001121 .parent = &cxo_clk_src.c,
Tianyi Gou389ba432012-10-01 13:58:38 -07001122 .dbg_name = "gcc_blsp1_qup2_i2c_apps_clk",
1123 .ops = &clk_ops_branch,
1124 CLK_INIT(gcc_blsp1_qup2_i2c_apps_clk.c),
1125 },
1126};
1127
1128static struct branch_clk gcc_blsp1_qup2_spi_apps_clk = {
1129 .cbcr_reg = BLSP1_QUP2_SPI_APPS_CBCR,
Tianyi Gou389ba432012-10-01 13:58:38 -07001130 .has_sibling = 0,
1131 .base = &virt_bases[GCC_BASE],
1132 .c = {
Saravana Kannan7a6532e2012-10-18 20:51:13 -07001133 .parent = &blsp1_qup2_spi_apps_clk_src.c,
Tianyi Gou389ba432012-10-01 13:58:38 -07001134 .dbg_name = "gcc_blsp1_qup2_spi_apps_clk",
1135 .ops = &clk_ops_branch,
1136 CLK_INIT(gcc_blsp1_qup2_spi_apps_clk.c),
1137 },
1138};
1139
1140static struct branch_clk gcc_blsp1_qup3_i2c_apps_clk = {
1141 .cbcr_reg = BLSP1_QUP3_I2C_APPS_CBCR,
Tianyi Gou389ba432012-10-01 13:58:38 -07001142 .base = &virt_bases[GCC_BASE],
1143 .c = {
Saravana Kannan7a6532e2012-10-18 20:51:13 -07001144 .parent = &cxo_clk_src.c,
Tianyi Gou389ba432012-10-01 13:58:38 -07001145 .dbg_name = "gcc_blsp1_qup3_i2c_apps_clk",
1146 .ops = &clk_ops_branch,
1147 CLK_INIT(gcc_blsp1_qup3_i2c_apps_clk.c),
1148 },
1149};
1150
1151static struct branch_clk gcc_blsp1_qup3_spi_apps_clk = {
1152 .cbcr_reg = BLSP1_QUP3_SPI_APPS_CBCR,
Tianyi Gou389ba432012-10-01 13:58:38 -07001153 .has_sibling = 0,
1154 .base = &virt_bases[GCC_BASE],
1155 .c = {
Saravana Kannan7a6532e2012-10-18 20:51:13 -07001156 .parent = &blsp1_qup3_spi_apps_clk_src.c,
Tianyi Gou389ba432012-10-01 13:58:38 -07001157 .dbg_name = "gcc_blsp1_qup3_spi_apps_clk",
1158 .ops = &clk_ops_branch,
1159 CLK_INIT(gcc_blsp1_qup3_spi_apps_clk.c),
1160 },
1161};
1162
1163static struct branch_clk gcc_blsp1_qup4_i2c_apps_clk = {
1164 .cbcr_reg = BLSP1_QUP4_I2C_APPS_CBCR,
Tianyi Gou389ba432012-10-01 13:58:38 -07001165 .base = &virt_bases[GCC_BASE],
1166 .c = {
Saravana Kannan7a6532e2012-10-18 20:51:13 -07001167 .parent = &cxo_clk_src.c,
Tianyi Gou389ba432012-10-01 13:58:38 -07001168 .dbg_name = "gcc_blsp1_qup4_i2c_apps_clk",
1169 .ops = &clk_ops_branch,
1170 CLK_INIT(gcc_blsp1_qup4_i2c_apps_clk.c),
1171 },
1172};
1173
1174static struct branch_clk gcc_blsp1_qup4_spi_apps_clk = {
1175 .cbcr_reg = BLSP1_QUP4_SPI_APPS_CBCR,
Tianyi Gou389ba432012-10-01 13:58:38 -07001176 .has_sibling = 0,
1177 .base = &virt_bases[GCC_BASE],
1178 .c = {
Saravana Kannan7a6532e2012-10-18 20:51:13 -07001179 .parent = &blsp1_qup4_spi_apps_clk_src.c,
Tianyi Gou389ba432012-10-01 13:58:38 -07001180 .dbg_name = "gcc_blsp1_qup4_spi_apps_clk",
1181 .ops = &clk_ops_branch,
1182 CLK_INIT(gcc_blsp1_qup4_spi_apps_clk.c),
1183 },
1184};
1185
1186static struct branch_clk gcc_blsp1_qup5_i2c_apps_clk = {
1187 .cbcr_reg = BLSP1_QUP5_I2C_APPS_CBCR,
Tianyi Gou389ba432012-10-01 13:58:38 -07001188 .base = &virt_bases[GCC_BASE],
1189 .c = {
Saravana Kannan7a6532e2012-10-18 20:51:13 -07001190 .parent = &cxo_clk_src.c,
Tianyi Gou389ba432012-10-01 13:58:38 -07001191 .dbg_name = "gcc_blsp1_qup5_i2c_apps_clk",
1192 .ops = &clk_ops_branch,
1193 CLK_INIT(gcc_blsp1_qup5_i2c_apps_clk.c),
1194 },
1195};
1196
1197static struct branch_clk gcc_blsp1_qup5_spi_apps_clk = {
1198 .cbcr_reg = BLSP1_QUP5_SPI_APPS_CBCR,
Tianyi Gou389ba432012-10-01 13:58:38 -07001199 .has_sibling = 0,
1200 .base = &virt_bases[GCC_BASE],
1201 .c = {
Saravana Kannan7a6532e2012-10-18 20:51:13 -07001202 .parent = &blsp1_qup5_spi_apps_clk_src.c,
Tianyi Gou389ba432012-10-01 13:58:38 -07001203 .dbg_name = "gcc_blsp1_qup5_spi_apps_clk",
1204 .ops = &clk_ops_branch,
1205 CLK_INIT(gcc_blsp1_qup5_spi_apps_clk.c),
1206 },
1207};
1208
1209static struct branch_clk gcc_blsp1_qup6_i2c_apps_clk = {
1210 .cbcr_reg = BLSP1_QUP6_I2C_APPS_CBCR,
Tianyi Gou389ba432012-10-01 13:58:38 -07001211 .base = &virt_bases[GCC_BASE],
1212 .c = {
Saravana Kannan7a6532e2012-10-18 20:51:13 -07001213 .parent = &cxo_clk_src.c,
Tianyi Gou389ba432012-10-01 13:58:38 -07001214 .dbg_name = "gcc_blsp1_qup6_i2c_apps_clk",
1215 .ops = &clk_ops_branch,
1216 CLK_INIT(gcc_blsp1_qup6_i2c_apps_clk.c),
1217 },
1218};
1219
1220static struct branch_clk gcc_blsp1_qup6_spi_apps_clk = {
1221 .cbcr_reg = BLSP1_QUP6_SPI_APPS_CBCR,
Tianyi Gou389ba432012-10-01 13:58:38 -07001222 .has_sibling = 0,
1223 .base = &virt_bases[GCC_BASE],
1224 .c = {
Saravana Kannan7a6532e2012-10-18 20:51:13 -07001225 .parent = &blsp1_qup6_spi_apps_clk_src.c,
Tianyi Gou389ba432012-10-01 13:58:38 -07001226 .dbg_name = "gcc_blsp1_qup6_spi_apps_clk",
1227 .ops = &clk_ops_branch,
1228 CLK_INIT(gcc_blsp1_qup6_spi_apps_clk.c),
1229 },
1230};
1231
1232static struct branch_clk gcc_blsp1_uart1_apps_clk = {
1233 .cbcr_reg = BLSP1_UART1_APPS_CBCR,
Tianyi Gou389ba432012-10-01 13:58:38 -07001234 .has_sibling = 0,
1235 .base = &virt_bases[GCC_BASE],
1236 .c = {
Saravana Kannan7a6532e2012-10-18 20:51:13 -07001237 .parent = &blsp1_uart1_apps_clk_src.c,
Tianyi Gou389ba432012-10-01 13:58:38 -07001238 .dbg_name = "gcc_blsp1_uart1_apps_clk",
1239 .ops = &clk_ops_branch,
1240 CLK_INIT(gcc_blsp1_uart1_apps_clk.c),
1241 },
1242};
1243
1244static struct branch_clk gcc_blsp1_uart2_apps_clk = {
1245 .cbcr_reg = BLSP1_UART2_APPS_CBCR,
Tianyi Gou389ba432012-10-01 13:58:38 -07001246 .has_sibling = 0,
1247 .base = &virt_bases[GCC_BASE],
1248 .c = {
Saravana Kannan7a6532e2012-10-18 20:51:13 -07001249 .parent = &blsp1_uart2_apps_clk_src.c,
Tianyi Gou389ba432012-10-01 13:58:38 -07001250 .dbg_name = "gcc_blsp1_uart2_apps_clk",
1251 .ops = &clk_ops_branch,
1252 CLK_INIT(gcc_blsp1_uart2_apps_clk.c),
1253 },
1254};
1255
1256static struct branch_clk gcc_blsp1_uart3_apps_clk = {
1257 .cbcr_reg = BLSP1_UART3_APPS_CBCR,
Tianyi Gou389ba432012-10-01 13:58:38 -07001258 .has_sibling = 0,
1259 .base = &virt_bases[GCC_BASE],
1260 .c = {
Saravana Kannan7a6532e2012-10-18 20:51:13 -07001261 .parent = &blsp1_uart3_apps_clk_src.c,
Tianyi Gou389ba432012-10-01 13:58:38 -07001262 .dbg_name = "gcc_blsp1_uart3_apps_clk",
1263 .ops = &clk_ops_branch,
1264 CLK_INIT(gcc_blsp1_uart3_apps_clk.c),
1265 },
1266};
1267
1268static struct branch_clk gcc_blsp1_uart4_apps_clk = {
1269 .cbcr_reg = BLSP1_UART4_APPS_CBCR,
Tianyi Gou389ba432012-10-01 13:58:38 -07001270 .has_sibling = 0,
1271 .base = &virt_bases[GCC_BASE],
1272 .c = {
Saravana Kannan7a6532e2012-10-18 20:51:13 -07001273 .parent = &blsp1_uart4_apps_clk_src.c,
Tianyi Gou389ba432012-10-01 13:58:38 -07001274 .dbg_name = "gcc_blsp1_uart4_apps_clk",
1275 .ops = &clk_ops_branch,
1276 CLK_INIT(gcc_blsp1_uart4_apps_clk.c),
1277 },
1278};
1279
1280static struct branch_clk gcc_blsp1_uart5_apps_clk = {
1281 .cbcr_reg = BLSP1_UART5_APPS_CBCR,
Tianyi Gou389ba432012-10-01 13:58:38 -07001282 .has_sibling = 0,
1283 .base = &virt_bases[GCC_BASE],
1284 .c = {
Saravana Kannan7a6532e2012-10-18 20:51:13 -07001285 .parent = &blsp1_uart5_apps_clk_src.c,
Tianyi Gou389ba432012-10-01 13:58:38 -07001286 .dbg_name = "gcc_blsp1_uart5_apps_clk",
1287 .ops = &clk_ops_branch,
1288 CLK_INIT(gcc_blsp1_uart5_apps_clk.c),
1289 },
1290};
1291
1292static struct branch_clk gcc_blsp1_uart6_apps_clk = {
1293 .cbcr_reg = BLSP1_UART6_APPS_CBCR,
Tianyi Gou389ba432012-10-01 13:58:38 -07001294 .has_sibling = 0,
1295 .base = &virt_bases[GCC_BASE],
1296 .c = {
Saravana Kannan7a6532e2012-10-18 20:51:13 -07001297 .parent = &blsp1_uart6_apps_clk_src.c,
Tianyi Gou389ba432012-10-01 13:58:38 -07001298 .dbg_name = "gcc_blsp1_uart6_apps_clk",
1299 .ops = &clk_ops_branch,
1300 CLK_INIT(gcc_blsp1_uart6_apps_clk.c),
1301 },
1302};
1303
1304static struct local_vote_clk gcc_boot_rom_ahb_clk = {
1305 .cbcr_reg = BOOT_ROM_AHB_CBCR,
1306 .vote_reg = APCS_CLOCK_BRANCH_ENA_VOTE,
1307 .en_mask = BIT(10),
1308 .base = &virt_bases[GCC_BASE],
1309 .c = {
1310 .dbg_name = "gcc_boot_rom_ahb_clk",
1311 .ops = &clk_ops_vote,
1312 CLK_INIT(gcc_boot_rom_ahb_clk.c),
1313 },
1314};
1315
1316static struct local_vote_clk gcc_ce1_ahb_clk = {
1317 .cbcr_reg = CE1_AHB_CBCR,
1318 .vote_reg = APCS_CLOCK_BRANCH_ENA_VOTE,
1319 .en_mask = BIT(3),
1320 .base = &virt_bases[GCC_BASE],
1321 .c = {
1322 .dbg_name = "gcc_ce1_ahb_clk",
1323 .ops = &clk_ops_vote,
1324 CLK_INIT(gcc_ce1_ahb_clk.c),
1325 },
1326};
1327
1328static struct local_vote_clk gcc_ce1_axi_clk = {
1329 .cbcr_reg = CE1_AXI_CBCR,
1330 .vote_reg = APCS_CLOCK_BRANCH_ENA_VOTE,
1331 .en_mask = BIT(4),
1332 .base = &virt_bases[GCC_BASE],
1333 .c = {
1334 .dbg_name = "gcc_ce1_axi_clk",
1335 .ops = &clk_ops_vote,
1336 CLK_INIT(gcc_ce1_axi_clk.c),
1337 },
1338};
1339
1340static struct local_vote_clk gcc_ce1_clk = {
1341 .cbcr_reg = CE1_CBCR,
1342 .vote_reg = APCS_CLOCK_BRANCH_ENA_VOTE,
1343 .en_mask = BIT(5),
1344 .base = &virt_bases[GCC_BASE],
1345 .c = {
1346 .dbg_name = "gcc_ce1_clk",
1347 .ops = &clk_ops_vote,
1348 CLK_INIT(gcc_ce1_clk.c),
1349 },
1350};
1351
1352static struct branch_clk gcc_gp1_clk = {
1353 .cbcr_reg = GP1_CBCR,
Tianyi Gou389ba432012-10-01 13:58:38 -07001354 .has_sibling = 0,
1355 .base = &virt_bases[GCC_BASE],
1356 .c = {
Saravana Kannan7a6532e2012-10-18 20:51:13 -07001357 .parent = &gp1_clk_src.c,
Tianyi Gou389ba432012-10-01 13:58:38 -07001358 .dbg_name = "gcc_gp1_clk",
1359 .ops = &clk_ops_branch,
1360 CLK_INIT(gcc_gp1_clk.c),
1361 },
1362};
1363
1364static struct branch_clk gcc_gp2_clk = {
1365 .cbcr_reg = GP2_CBCR,
Tianyi Gou389ba432012-10-01 13:58:38 -07001366 .has_sibling = 0,
1367 .base = &virt_bases[GCC_BASE],
1368 .c = {
Saravana Kannan7a6532e2012-10-18 20:51:13 -07001369 .parent = &gp2_clk_src.c,
Tianyi Gou389ba432012-10-01 13:58:38 -07001370 .dbg_name = "gcc_gp2_clk",
1371 .ops = &clk_ops_branch,
1372 CLK_INIT(gcc_gp2_clk.c),
1373 },
1374};
1375
1376static struct branch_clk gcc_gp3_clk = {
1377 .cbcr_reg = GP3_CBCR,
Tianyi Gou389ba432012-10-01 13:58:38 -07001378 .has_sibling = 0,
1379 .base = &virt_bases[GCC_BASE],
1380 .c = {
Saravana Kannan7a6532e2012-10-18 20:51:13 -07001381 .parent = &gp3_clk_src.c,
Tianyi Gou389ba432012-10-01 13:58:38 -07001382 .dbg_name = "gcc_gp3_clk",
1383 .ops = &clk_ops_branch,
1384 CLK_INIT(gcc_gp3_clk.c),
1385 },
1386};
1387
1388static struct branch_clk gcc_ipa_clk = {
1389 .cbcr_reg = IPA_CBCR,
Tianyi Gou389ba432012-10-01 13:58:38 -07001390 .has_sibling = 1,
1391 .base = &virt_bases[GCC_BASE],
1392 .c = {
Saravana Kannan7a6532e2012-10-18 20:51:13 -07001393 .parent = &ipa_clk_src.c,
Tianyi Gou389ba432012-10-01 13:58:38 -07001394 .dbg_name = "gcc_ipa_clk",
1395 .ops = &clk_ops_branch,
1396 CLK_INIT(gcc_ipa_clk.c),
1397 },
1398};
1399
1400static struct branch_clk gcc_ipa_cnoc_clk = {
1401 .cbcr_reg = IPA_CNOC_CBCR,
1402 .has_sibling = 1,
1403 .base = &virt_bases[GCC_BASE],
1404 .c = {
1405 .dbg_name = "gcc_ipa_cnoc_clk",
1406 .ops = &clk_ops_branch,
1407 CLK_INIT(gcc_ipa_cnoc_clk.c),
1408 },
1409};
1410
Tianyi Gou0e10e792012-11-29 18:28:32 -08001411static struct branch_clk gcc_ipa_sleep_clk = {
1412 .cbcr_reg = IPA_SLEEP_CBCR,
1413 .has_sibling = 1,
1414 .base = &virt_bases[GCC_BASE],
1415 .c = {
1416 .dbg_name = "gcc_ipa_sleep_clk",
1417 .ops = &clk_ops_branch,
1418 CLK_INIT(gcc_ipa_sleep_clk.c),
1419 },
1420};
1421
Tianyi Gou389ba432012-10-01 13:58:38 -07001422static struct branch_clk gcc_pdm2_clk = {
1423 .cbcr_reg = PDM2_CBCR,
Tianyi Gou389ba432012-10-01 13:58:38 -07001424 .has_sibling = 0,
1425 .base = &virt_bases[GCC_BASE],
1426 .c = {
Saravana Kannan7a6532e2012-10-18 20:51:13 -07001427 .parent = &pdm2_clk_src.c,
Tianyi Gou389ba432012-10-01 13:58:38 -07001428 .dbg_name = "gcc_pdm2_clk",
1429 .ops = &clk_ops_branch,
1430 CLK_INIT(gcc_pdm2_clk.c),
1431 },
1432};
1433
1434static struct branch_clk gcc_pdm_ahb_clk = {
1435 .cbcr_reg = PDM_AHB_CBCR,
1436 .has_sibling = 1,
1437 .base = &virt_bases[GCC_BASE],
1438 .c = {
1439 .dbg_name = "gcc_pdm_ahb_clk",
1440 .ops = &clk_ops_branch,
1441 CLK_INIT(gcc_pdm_ahb_clk.c),
1442 },
1443};
1444
1445static struct local_vote_clk gcc_prng_ahb_clk = {
1446 .cbcr_reg = PRNG_AHB_CBCR,
1447 .vote_reg = APCS_CLOCK_BRANCH_ENA_VOTE,
1448 .en_mask = BIT(13),
1449 .base = &virt_bases[GCC_BASE],
1450 .c = {
1451 .dbg_name = "gcc_prng_ahb_clk",
1452 .ops = &clk_ops_vote,
1453 CLK_INIT(gcc_prng_ahb_clk.c),
1454 },
1455};
1456
1457static struct branch_clk gcc_qpic_ahb_clk = {
1458 .cbcr_reg = QPIC_AHB_CBCR,
1459 .has_sibling = 1,
1460 .base = &virt_bases[GCC_BASE],
1461 .c = {
1462 .dbg_name = "gcc_qpic_ahb_clk",
1463 .ops = &clk_ops_branch,
1464 CLK_INIT(gcc_qpic_ahb_clk.c),
1465 },
1466};
1467
1468static struct branch_clk gcc_qpic_clk = {
1469 .cbcr_reg = QPIC_CBCR,
Tianyi Gou389ba432012-10-01 13:58:38 -07001470 .has_sibling = 0,
1471 .base = &virt_bases[GCC_BASE],
1472 .c = {
Saravana Kannan7a6532e2012-10-18 20:51:13 -07001473 .parent = &qpic_clk_src.c,
Tianyi Gou389ba432012-10-01 13:58:38 -07001474 .dbg_name = "gcc_qpic_clk",
1475 .ops = &clk_ops_branch,
1476 CLK_INIT(gcc_qpic_clk.c),
1477 },
1478};
1479
1480static struct branch_clk gcc_sdcc2_ahb_clk = {
1481 .cbcr_reg = SDCC2_AHB_CBCR,
1482 .has_sibling = 1,
1483 .base = &virt_bases[GCC_BASE],
1484 .c = {
1485 .dbg_name = "gcc_sdcc2_ahb_clk",
1486 .ops = &clk_ops_branch,
1487 CLK_INIT(gcc_sdcc2_ahb_clk.c),
1488 },
1489};
1490
1491static struct branch_clk gcc_sdcc2_apps_clk = {
1492 .cbcr_reg = SDCC2_APPS_CBCR,
Tianyi Gou389ba432012-10-01 13:58:38 -07001493 .has_sibling = 0,
1494 .base = &virt_bases[GCC_BASE],
1495 .c = {
Saravana Kannan7a6532e2012-10-18 20:51:13 -07001496 .parent = &sdcc2_apps_clk_src.c,
Tianyi Gou389ba432012-10-01 13:58:38 -07001497 .dbg_name = "gcc_sdcc2_apps_clk",
1498 .ops = &clk_ops_branch,
1499 CLK_INIT(gcc_sdcc2_apps_clk.c),
1500 },
1501};
1502
1503static struct branch_clk gcc_sdcc3_ahb_clk = {
1504 .cbcr_reg = SDCC3_AHB_CBCR,
1505 .has_sibling = 1,
1506 .base = &virt_bases[GCC_BASE],
1507 .c = {
1508 .dbg_name = "gcc_sdcc3_ahb_clk",
1509 .ops = &clk_ops_branch,
1510 CLK_INIT(gcc_sdcc3_ahb_clk.c),
1511 },
1512};
1513
1514static struct branch_clk gcc_sdcc3_apps_clk = {
1515 .cbcr_reg = SDCC3_APPS_CBCR,
Tianyi Gou389ba432012-10-01 13:58:38 -07001516 .has_sibling = 0,
1517 .base = &virt_bases[GCC_BASE],
1518 .c = {
Saravana Kannan7a6532e2012-10-18 20:51:13 -07001519 .parent = &sdcc3_apps_clk_src.c,
Tianyi Gou389ba432012-10-01 13:58:38 -07001520 .dbg_name = "gcc_sdcc3_apps_clk",
1521 .ops = &clk_ops_branch,
1522 CLK_INIT(gcc_sdcc3_apps_clk.c),
1523 },
1524};
1525
1526static struct branch_clk gcc_sys_noc_ipa_axi_clk = {
1527 .cbcr_reg = SYS_NOC_IPA_AXI_CBCR,
Tianyi Gou389ba432012-10-01 13:58:38 -07001528 .has_sibling = 1,
1529 .base = &virt_bases[GCC_BASE],
1530 .c = {
Saravana Kannan7a6532e2012-10-18 20:51:13 -07001531 .parent = &ipa_clk_src.c,
Tianyi Gou389ba432012-10-01 13:58:38 -07001532 .dbg_name = "gcc_sys_noc_ipa_axi_clk",
1533 .ops = &clk_ops_branch,
1534 CLK_INIT(gcc_sys_noc_ipa_axi_clk.c),
1535 },
1536};
1537
1538static struct branch_clk gcc_usb_hs_ahb_clk = {
1539 .cbcr_reg = USB_HS_AHB_CBCR,
1540 .has_sibling = 1,
1541 .base = &virt_bases[GCC_BASE],
1542 .c = {
1543 .dbg_name = "gcc_usb_hs_ahb_clk",
1544 .ops = &clk_ops_branch,
1545 CLK_INIT(gcc_usb_hs_ahb_clk.c),
1546 },
1547};
1548
1549static struct branch_clk gcc_usb_hs_system_clk = {
1550 .cbcr_reg = USB_HS_SYSTEM_CBCR,
1551 .bcr_reg = USB_HS_BCR,
Tianyi Gou389ba432012-10-01 13:58:38 -07001552 .has_sibling = 0,
1553 .base = &virt_bases[GCC_BASE],
1554 .c = {
Saravana Kannan7a6532e2012-10-18 20:51:13 -07001555 .parent = &usb_hs_system_clk_src.c,
Tianyi Gou389ba432012-10-01 13:58:38 -07001556 .dbg_name = "gcc_usb_hs_system_clk",
1557 .ops = &clk_ops_branch,
1558 CLK_INIT(gcc_usb_hs_system_clk.c),
1559 },
1560};
1561
1562static struct branch_clk gcc_usb_hsic_ahb_clk = {
1563 .cbcr_reg = USB_HSIC_AHB_CBCR,
1564 .has_sibling = 1,
1565 .base = &virt_bases[GCC_BASE],
1566 .c = {
1567 .dbg_name = "gcc_usb_hsic_ahb_clk",
1568 .ops = &clk_ops_branch,
1569 CLK_INIT(gcc_usb_hsic_ahb_clk.c),
1570 },
1571};
1572
1573static struct branch_clk gcc_usb_hsic_clk = {
1574 .cbcr_reg = USB_HSIC_CBCR,
Tianyi Gou389ba432012-10-01 13:58:38 -07001575 .has_sibling = 0,
1576 .base = &virt_bases[GCC_BASE],
1577 .c = {
Saravana Kannan7a6532e2012-10-18 20:51:13 -07001578 .parent = &usb_hsic_clk_src.c,
Tianyi Gou389ba432012-10-01 13:58:38 -07001579 .dbg_name = "gcc_usb_hsic_clk",
1580 .ops = &clk_ops_branch,
1581 CLK_INIT(gcc_usb_hsic_clk.c),
1582 },
1583};
1584
1585static struct branch_clk gcc_usb_hsic_io_cal_clk = {
1586 .cbcr_reg = USB_HSIC_IO_CAL_CBCR,
Tianyi Gou389ba432012-10-01 13:58:38 -07001587 .has_sibling = 0,
1588 .base = &virt_bases[GCC_BASE],
1589 .c = {
Saravana Kannan7a6532e2012-10-18 20:51:13 -07001590 .parent = &usb_hsic_io_cal_clk_src.c,
Tianyi Gou389ba432012-10-01 13:58:38 -07001591 .dbg_name = "gcc_usb_hsic_io_cal_clk",
1592 .ops = &clk_ops_branch,
1593 CLK_INIT(gcc_usb_hsic_io_cal_clk.c),
1594 },
1595};
1596
1597static struct branch_clk gcc_usb_hsic_system_clk = {
1598 .cbcr_reg = USB_HSIC_SYSTEM_CBCR,
1599 .bcr_reg = USB_HS_HSIC_BCR,
Tianyi Gou389ba432012-10-01 13:58:38 -07001600 .has_sibling = 0,
1601 .base = &virt_bases[GCC_BASE],
1602 .c = {
Saravana Kannan7a6532e2012-10-18 20:51:13 -07001603 .parent = &usb_hsic_system_clk_src.c,
Tianyi Gou389ba432012-10-01 13:58:38 -07001604 .dbg_name = "gcc_usb_hsic_system_clk",
1605 .ops = &clk_ops_branch,
1606 CLK_INIT(gcc_usb_hsic_system_clk.c),
1607 },
1608};
1609
1610static struct branch_clk gcc_usb_hsic_xcvr_fs_clk = {
1611 .cbcr_reg = USB_HSIC_XCVR_FS_CBCR,
Tianyi Gou389ba432012-10-01 13:58:38 -07001612 .has_sibling = 0,
1613 .base = &virt_bases[GCC_BASE],
1614 .c = {
Saravana Kannan7a6532e2012-10-18 20:51:13 -07001615 .parent = &usb_hsic_xcvr_fs_clk_src.c,
Tianyi Gou389ba432012-10-01 13:58:38 -07001616 .dbg_name = "gcc_usb_hsic_xcvr_fs_clk",
1617 .ops = &clk_ops_branch,
1618 CLK_INIT(gcc_usb_hsic_xcvr_fs_clk.c),
1619 },
1620};
1621
1622/* LPASS clock data */
1623static struct clk_freq_tbl ftbl_audio_core_lpaif_clock[] = {
1624 F_LPASS( 512000, lpapll0, 16, 1, 48),
1625 F_LPASS( 768000, lpapll0, 16, 1, 32),
1626 F_LPASS( 1024000, lpapll0, 16, 1, 24),
1627 F_LPASS( 1536000, lpapll0, 16, 1, 16),
1628 F_LPASS( 2048000, lpapll0, 16, 1, 12),
1629 F_LPASS( 3072000, lpapll0, 16, 1, 8),
1630 F_LPASS( 4096000, lpapll0, 16, 1, 6),
1631 F_LPASS( 6144000, lpapll0, 16, 1, 4),
1632 F_LPASS( 8192000, lpapll0, 16, 1, 3),
1633 F_LPASS(12288000, lpapll0, 16, 1, 2),
1634 F_END
1635};
1636
1637static struct clk_freq_tbl ftbl_audio_core_lpaif_pcm_clock[] = {
1638 F_LPASS( 512000, lpapll0, 16, 1, 48),
1639 F_LPASS( 768000, lpapll0, 16, 1, 32),
1640 F_LPASS( 1024000, lpapll0, 16, 1, 24),
1641 F_LPASS( 1536000, lpapll0, 16, 1, 16),
1642 F_LPASS( 2048000, lpapll0, 16, 1, 12),
1643 F_LPASS( 3072000, lpapll0, 16, 1, 8),
1644 F_LPASS( 4096000, lpapll0, 16, 1, 6),
1645 F_LPASS( 6144000, lpapll0, 16, 1, 4),
1646 F_LPASS( 8192000, lpapll0, 16, 1, 3),
1647 F_END
1648};
1649
1650static struct rcg_clk audio_core_lpaif_pcmoe_clk_src = {
1651 .cmd_rcgr_reg = LPAIF_PCMOE_CMD_RCGR,
1652 .set_rate = set_rate_mnd,
1653 .freq_tbl = ftbl_audio_core_lpaif_clock,
1654 .current_freq = &rcg_dummy_freq,
1655 .base = &virt_bases[LPASS_BASE],
1656 .c = {
1657 .dbg_name = "audio_core_lpaif_pcmoe_clk_src",
1658 .ops = &clk_ops_rcg_mnd,
1659 VDD_DIG_FMAX_MAP1(LOW, 12288000),
1660 CLK_INIT(audio_core_lpaif_pcmoe_clk_src.c)
1661 },
1662};
1663
1664static struct rcg_clk audio_core_lpaif_pri_clk_src = {
1665 .cmd_rcgr_reg = LPAIF_PRI_CMD_RCGR,
1666 .set_rate = set_rate_mnd,
1667 .freq_tbl = ftbl_audio_core_lpaif_clock,
1668 .current_freq = &rcg_dummy_freq,
1669 .base = &virt_bases[LPASS_BASE],
1670 .c = {
1671 .dbg_name = "audio_core_lpaif_pri_clk_src",
1672 .ops = &clk_ops_rcg_mnd,
1673 VDD_DIG_FMAX_MAP2(LOW, 12288000, NOMINAL, 24576000),
1674 CLK_INIT(audio_core_lpaif_pri_clk_src.c)
1675 },
1676};
1677
1678static struct rcg_clk audio_core_lpaif_sec_clk_src = {
1679 .cmd_rcgr_reg = LPAIF_SEC_CMD_RCGR,
1680 .set_rate = set_rate_mnd,
1681 .freq_tbl = ftbl_audio_core_lpaif_clock,
1682 .current_freq = &rcg_dummy_freq,
1683 .base = &virt_bases[LPASS_BASE],
1684 .c = {
1685 .dbg_name = "audio_core_lpaif_sec_clk_src",
1686 .ops = &clk_ops_rcg_mnd,
1687 VDD_DIG_FMAX_MAP2(LOW, 12288000, NOMINAL, 24576000),
1688 CLK_INIT(audio_core_lpaif_sec_clk_src.c)
1689 },
1690};
1691
1692static struct clk_freq_tbl ftbl_audio_core_slimbus_core_clock[] = {
1693 F_LPASS(26041000, lpapll0, 1, 10, 151),
1694 F_END
1695};
1696
1697static struct rcg_clk audio_core_slimbus_core_clk_src = {
1698 .cmd_rcgr_reg = SLIMBUS_CMD_RCGR,
1699 .set_rate = set_rate_mnd,
1700 .freq_tbl = ftbl_audio_core_slimbus_core_clock,
1701 .current_freq = &rcg_dummy_freq,
1702 .base = &virt_bases[LPASS_BASE],
1703 .c = {
1704 .dbg_name = "audio_core_slimbus_core_clk_src",
1705 .ops = &clk_ops_rcg_mnd,
1706 VDD_DIG_FMAX_MAP2(LOW, 13107000, NOMINAL, 26214000),
1707 CLK_INIT(audio_core_slimbus_core_clk_src.c)
1708 },
1709};
1710
1711static struct rcg_clk audio_core_lpaif_pcm0_clk_src = {
1712 .cmd_rcgr_reg = LPAIF_PCM0_CMD_RCGR,
1713 .set_rate = set_rate_mnd,
1714 .freq_tbl = ftbl_audio_core_lpaif_pcm_clock,
1715 .current_freq = &rcg_dummy_freq,
1716 .base = &virt_bases[LPASS_BASE],
1717 .c = {
1718 .dbg_name = "audio_core_lpaif_pcm0_clk_src",
1719 .ops = &clk_ops_rcg_mnd,
1720 VDD_DIG_FMAX_MAP2(LOW, 4096000, NOMINAL, 8192000),
1721 CLK_INIT(audio_core_lpaif_pcm0_clk_src.c)
1722 },
1723};
1724
1725static struct rcg_clk audio_core_lpaif_pcm1_clk_src = {
1726 .cmd_rcgr_reg = LPAIF_PCM1_CMD_RCGR,
1727 .set_rate = set_rate_mnd,
1728 .freq_tbl = ftbl_audio_core_lpaif_pcm_clock,
1729 .current_freq = &rcg_dummy_freq,
1730 .base = &virt_bases[LPASS_BASE],
1731 .c = {
1732 .dbg_name = "audio_core_lpaif_pcm1_clk_src",
1733 .ops = &clk_ops_rcg_mnd,
1734 VDD_DIG_FMAX_MAP2(LOW, 4096000, NOMINAL, 8192000),
1735 CLK_INIT(audio_core_lpaif_pcm1_clk_src.c)
1736 },
1737};
1738
1739static struct branch_clk audio_core_slimbus_lfabif_clk = {
1740 .cbcr_reg = AUDIO_CORE_SLIMBUS_LFABIF_CBCR,
1741 .has_sibling = 1,
1742 .base = &virt_bases[LPASS_BASE],
1743 .c = {
1744 .dbg_name = "audio_core_slimbus_lfabif_clk",
1745 .ops = &clk_ops_branch,
1746 CLK_INIT(audio_core_slimbus_lfabif_clk.c),
1747 },
1748};
1749
1750static struct branch_clk audio_core_lpaif_pcm_data_oe_clk = {
1751 .cbcr_reg = AUDIO_CORE_LPAIF_PCM_DATA_OE_CBCR,
Tianyi Gou389ba432012-10-01 13:58:38 -07001752 .base = &virt_bases[LPASS_BASE],
1753 .c = {
Saravana Kannan7a6532e2012-10-18 20:51:13 -07001754 .parent = &audio_core_lpaif_pcmoe_clk_src.c,
Tianyi Gou389ba432012-10-01 13:58:38 -07001755 .dbg_name = "audio_core_lpaif_pcm_data_oe_clk",
1756 .ops = &clk_ops_branch,
1757 CLK_INIT(audio_core_lpaif_pcm_data_oe_clk.c),
1758 },
1759};
1760
1761static struct branch_clk audio_core_slimbus_core_clk = {
1762 .cbcr_reg = AUDIO_CORE_SLIMBUS_CORE_CBCR,
Tianyi Gou389ba432012-10-01 13:58:38 -07001763 .base = &virt_bases[LPASS_BASE],
1764 .c = {
Saravana Kannan7a6532e2012-10-18 20:51:13 -07001765 .parent = &audio_core_slimbus_core_clk_src.c,
Tianyi Gou389ba432012-10-01 13:58:38 -07001766 .dbg_name = "audio_core_slimbus_core_clk",
1767 .ops = &clk_ops_branch,
1768 CLK_INIT(audio_core_slimbus_core_clk.c),
1769 },
1770};
1771
1772static struct branch_clk audio_core_lpaif_pri_ebit_clk = {
1773 .cbcr_reg = AUDIO_CORE_LPAIF_PRI_EBIT_CBCR,
1774 .has_sibling = 0,
1775 .base = &virt_bases[LPASS_BASE],
1776 .c = {
1777 .dbg_name = "audio_core_lpaif_pri_ebit_clk",
1778 .ops = &clk_ops_branch,
1779 CLK_INIT(audio_core_lpaif_pri_ebit_clk.c),
1780 },
1781};
1782
1783static struct branch_clk audio_core_lpaif_pri_ibit_clk = {
1784 .cbcr_reg = AUDIO_CORE_LPAIF_PRI_IBIT_CBCR,
Tianyi Gou389ba432012-10-01 13:58:38 -07001785 .has_sibling = 1,
1786 .max_div = 15,
1787 .base = &virt_bases[LPASS_BASE],
1788 .c = {
Saravana Kannan7a6532e2012-10-18 20:51:13 -07001789 .parent = &audio_core_lpaif_pri_clk_src.c,
Tianyi Gou389ba432012-10-01 13:58:38 -07001790 .dbg_name = "audio_core_lpaif_pri_ibit_clk",
1791 .ops = &clk_ops_branch,
1792 CLK_INIT(audio_core_lpaif_pri_ibit_clk.c),
1793 },
1794};
1795
1796static struct branch_clk audio_core_lpaif_pri_osr_clk = {
1797 .cbcr_reg = AUDIO_CORE_LPAIF_PRI_OSR_CBCR,
Tianyi Gou389ba432012-10-01 13:58:38 -07001798 .has_sibling = 1,
1799 .base = &virt_bases[LPASS_BASE],
1800 .c = {
Saravana Kannan7a6532e2012-10-18 20:51:13 -07001801 .parent = &audio_core_lpaif_pri_clk_src.c,
Tianyi Gou389ba432012-10-01 13:58:38 -07001802 .dbg_name = "audio_core_lpaif_pri_osr_clk",
1803 .ops = &clk_ops_branch,
1804 CLK_INIT(audio_core_lpaif_pri_osr_clk.c),
1805 },
1806};
1807
1808static struct branch_clk audio_core_lpaif_pcm0_ebit_clk = {
1809 .cbcr_reg = AUDIO_CORE_LPAIF_PCM0_EBIT_CBCR,
1810 .has_sibling = 0,
1811 .base = &virt_bases[LPASS_BASE],
1812 .c = {
1813 .dbg_name = "audio_core_lpaif_pcm0_ebit_clk",
1814 .ops = &clk_ops_branch,
1815 CLK_INIT(audio_core_lpaif_pcm0_ebit_clk.c),
1816 },
1817};
1818
1819static struct branch_clk audio_core_lpaif_pcm0_ibit_clk = {
1820 .cbcr_reg = AUDIO_CORE_LPAIF_PCM0_IBIT_CBCR,
Tianyi Gou389ba432012-10-01 13:58:38 -07001821 .has_sibling = 0,
1822 .base = &virt_bases[LPASS_BASE],
1823 .c = {
Saravana Kannan7a6532e2012-10-18 20:51:13 -07001824 .parent = &audio_core_lpaif_pcm0_clk_src.c,
Tianyi Gou389ba432012-10-01 13:58:38 -07001825 .dbg_name = "audio_core_lpaif_pcm0_ibit_clk",
1826 .ops = &clk_ops_branch,
1827 CLK_INIT(audio_core_lpaif_pcm0_ibit_clk.c),
1828 },
1829};
1830
1831static struct branch_clk audio_core_lpaif_sec_ebit_clk = {
1832 .cbcr_reg = AUDIO_CORE_LPAIF_SEC_EBIT_CBCR,
1833 .has_sibling = 0,
1834 .base = &virt_bases[LPASS_BASE],
1835 .c = {
1836 .dbg_name = "audio_core_lpaif_sec_ebit_clk",
1837 .ops = &clk_ops_branch,
1838 CLK_INIT(audio_core_lpaif_sec_ebit_clk.c),
1839 },
1840};
1841
1842static struct branch_clk audio_core_lpaif_sec_ibit_clk = {
1843 .cbcr_reg = AUDIO_CORE_LPAIF_SEC_IBIT_CBCR,
Tianyi Gou389ba432012-10-01 13:58:38 -07001844 .has_sibling = 1,
1845 .max_div = 15,
1846 .base = &virt_bases[LPASS_BASE],
1847 .c = {
Saravana Kannan7a6532e2012-10-18 20:51:13 -07001848 .parent = &audio_core_lpaif_sec_clk_src.c,
Tianyi Gou389ba432012-10-01 13:58:38 -07001849 .dbg_name = "audio_core_lpaif_sec_ibit_clk",
1850 .ops = &clk_ops_branch,
1851 CLK_INIT(audio_core_lpaif_sec_ibit_clk.c),
1852 },
1853};
1854
1855static struct branch_clk audio_core_lpaif_sec_osr_clk = {
1856 .cbcr_reg = AUDIO_CORE_LPAIF_SEC_OSR_CBCR,
Tianyi Gou389ba432012-10-01 13:58:38 -07001857 .has_sibling = 1,
1858 .base = &virt_bases[LPASS_BASE],
1859 .c = {
Saravana Kannan7a6532e2012-10-18 20:51:13 -07001860 .parent = &audio_core_lpaif_sec_clk_src.c,
Tianyi Gou389ba432012-10-01 13:58:38 -07001861 .dbg_name = "audio_core_lpaif_sec_osr_clk",
1862 .ops = &clk_ops_branch,
1863 CLK_INIT(audio_core_lpaif_sec_osr_clk.c),
1864 },
1865};
1866
1867static struct branch_clk audio_core_lpaif_pcm1_ebit_clk = {
1868 .cbcr_reg = AUDIO_CORE_LPAIF_PCM1_EBIT_CBCR,
1869 .has_sibling = 0,
1870 .base = &virt_bases[LPASS_BASE],
1871 .c = {
1872 .dbg_name = "audio_core_lpaif_pcm1_ebit_clk",
1873 .ops = &clk_ops_branch,
1874 CLK_INIT(audio_core_lpaif_pcm1_ebit_clk.c),
1875 },
1876};
1877
1878static struct branch_clk audio_core_lpaif_pcm1_ibit_clk = {
1879 .cbcr_reg = AUDIO_CORE_LPAIF_PCM1_IBIT_CBCR,
Tianyi Gou389ba432012-10-01 13:58:38 -07001880 .has_sibling = 0,
1881 .base = &virt_bases[LPASS_BASE],
1882 .c = {
Saravana Kannan7a6532e2012-10-18 20:51:13 -07001883 .parent = &audio_core_lpaif_pcm1_clk_src.c,
Tianyi Gou389ba432012-10-01 13:58:38 -07001884 .dbg_name = "audio_core_lpaif_pcm1_ibit_clk",
1885 .ops = &clk_ops_branch,
1886 CLK_INIT(audio_core_lpaif_pcm1_ibit_clk.c),
1887 },
1888};
1889
1890static DEFINE_CLK_MEASURE(a5_m_clk);
1891
1892#ifdef CONFIG_DEBUG_FS
1893
1894struct measure_mux_entry {
1895 struct clk *c;
1896 int base;
1897 u32 debug_mux;
1898};
1899
1900struct measure_mux_entry measure_mux[] = {
1901 {&gcc_pdm_ahb_clk.c, GCC_BASE, 0x00d0},
1902 {&gcc_usb_hsic_xcvr_fs_clk.c, GCC_BASE, 0x005d},
1903 {&gcc_usb_hsic_system_clk.c, GCC_BASE, 0x0059},
1904 {&gcc_usb_hsic_io_cal_clk.c, GCC_BASE, 0x005b},
1905 {&gcc_sdcc3_ahb_clk.c, GCC_BASE, 0x0079},
1906 {&gcc_blsp1_qup5_i2c_apps_clk.c, GCC_BASE, 0x009d},
1907 {&gcc_blsp1_qup1_spi_apps_clk.c, GCC_BASE, 0x008a},
1908 {&gcc_blsp1_uart2_apps_clk.c, GCC_BASE, 0x0091},
1909 {&gcc_blsp1_qup4_spi_apps_clk.c, GCC_BASE, 0x0098},
1910 {&gcc_blsp1_qup3_spi_apps_clk.c, GCC_BASE, 0x0093},
1911 {&gcc_blsp1_qup6_i2c_apps_clk.c, GCC_BASE, 0x00a2},
1912 {&gcc_bam_dma_ahb_clk.c, GCC_BASE, 0x00e0},
1913 {&gcc_sdcc3_apps_clk.c, GCC_BASE, 0x0078},
1914 {&gcc_usb_hs_system_clk.c, GCC_BASE, 0x0060},
1915 {&gcc_blsp1_ahb_clk.c, GCC_BASE, 0x0088},
1916 {&gcc_blsp1_uart4_apps_clk.c, GCC_BASE, 0x009a},
1917 {&gcc_blsp1_qup2_spi_apps_clk.c, GCC_BASE, 0x008e},
1918 {&gcc_usb_hsic_ahb_clk.c, GCC_BASE, 0x0058},
1919 {&gcc_blsp1_uart3_apps_clk.c, GCC_BASE, 0x0095},
1920 {&gcc_ce1_axi_clk.c, GCC_BASE, 0x0139},
1921 {&gcc_blsp1_qup5_spi_apps_clk.c, GCC_BASE, 0x009c},
1922 {&gcc_usb_hs_ahb_clk.c, GCC_BASE, 0x0061},
1923 {&gcc_blsp1_qup6_spi_apps_clk.c, GCC_BASE, 0x00a1},
1924 {&gcc_prng_ahb_clk.c, GCC_BASE, 0x00d8},
1925 {&gcc_blsp1_qup3_i2c_apps_clk.c, GCC_BASE, 0x0094},
1926 {&gcc_usb_hsic_clk.c, GCC_BASE, 0x005a},
1927 {&gcc_blsp1_uart6_apps_clk.c, GCC_BASE, 0x00a3},
1928 {&gcc_sdcc2_apps_clk.c, GCC_BASE, 0x0070},
1929 {&gcc_blsp1_uart1_apps_clk.c, GCC_BASE, 0x008c},
1930 {&gcc_blsp1_qup4_i2c_apps_clk.c, GCC_BASE, 0x0099},
1931 {&gcc_boot_rom_ahb_clk.c, GCC_BASE, 0x00f8},
1932 {&gcc_ce1_ahb_clk.c, GCC_BASE, 0x013a},
1933 {&gcc_pdm2_clk.c, GCC_BASE, 0x00d2},
1934 {&gcc_blsp1_uart5_apps_clk.c, GCC_BASE, 0x009e},
1935 {&gcc_blsp1_qup2_i2c_apps_clk.c, GCC_BASE, 0x0090},
1936 {&gcc_blsp1_qup1_i2c_apps_clk.c, GCC_BASE, 0x008b},
1937 {&gcc_sdcc2_ahb_clk.c, GCC_BASE, 0x0071},
1938 {&gcc_ce1_clk.c, GCC_BASE, 0x0138},
1939 {&gcc_sys_noc_ipa_axi_clk.c, GCC_BASE, 0x0007},
Tianyi Gou8512ac42013-01-23 18:32:04 -08001940 {&gcc_ipa_clk.c, GCC_BASE, 0x01E0},
1941 {&gcc_ipa_cnoc_clk.c, GCC_BASE, 0x01E1},
1942 {&gcc_ipa_sleep_clk.c, GCC_BASE, 0x01E2},
1943 {&gcc_qpic_clk.c, GCC_BASE, 0x01D8},
1944 {&gcc_qpic_ahb_clk.c, GCC_BASE, 0x01D9},
Tianyi Gou389ba432012-10-01 13:58:38 -07001945
1946 {&audio_core_lpaif_pcm_data_oe_clk.c, LPASS_BASE, 0x0030},
1947 {&audio_core_slimbus_core_clk.c, LPASS_BASE, 0x003d},
1948 {&audio_core_lpaif_pri_clk_src.c, LPASS_BASE, 0x0017},
1949 {&audio_core_lpaif_sec_clk_src.c, LPASS_BASE, 0x0016},
1950 {&audio_core_slimbus_core_clk_src.c, LPASS_BASE, 0x0011},
1951 {&audio_core_lpaif_pcm1_clk_src.c, LPASS_BASE, 0x0012},
1952 {&audio_core_lpaif_pcm0_clk_src.c, LPASS_BASE, 0x0013},
1953 {&audio_core_lpaif_pcmoe_clk_src.c, LPASS_BASE, 0x000f},
1954 {&audio_core_slimbus_lfabif_clk.c, LPASS_BASE, 0x003e},
1955
1956 {&a5_m_clk, APCS_BASE, 0x3},
1957
1958 {&dummy_clk, N_BASES, 0x0000},
1959};
1960
1961static int measure_clk_set_parent(struct clk *c, struct clk *parent)
1962{
1963 struct measure_clk *clk = to_measure_clk(c);
1964 unsigned long flags;
1965 u32 regval, clk_sel, i;
1966
1967 if (!parent)
1968 return -EINVAL;
1969
1970 for (i = 0; i < (ARRAY_SIZE(measure_mux) - 1); i++)
1971 if (measure_mux[i].c == parent)
1972 break;
1973
1974 if (measure_mux[i].c == &dummy_clk)
1975 return -EINVAL;
1976
1977 spin_lock_irqsave(&local_clock_reg_lock, flags);
1978 /*
1979 * Program the test vector, measurement period (sample_ticks)
1980 * and scaling multiplier.
1981 */
1982 clk->sample_ticks = 0x10000;
1983 clk->multiplier = 1;
1984
1985 writel_relaxed(0, LPASS_REG_BASE(LPASS_DEBUG_CLK_CTL_REG));
1986 writel_relaxed(0, GCC_REG_BASE(GCC_DEBUG_CLK_CTL_REG));
1987
1988 switch (measure_mux[i].base) {
1989
1990 case GCC_BASE:
1991 clk_sel = measure_mux[i].debug_mux;
1992 break;
1993
1994 case LPASS_BASE:
1995 clk_sel = 0x161;
1996 regval = BVAL(15, 0, measure_mux[i].debug_mux);
1997 writel_relaxed(regval, LPASS_REG_BASE(LPASS_DEBUG_CLK_CTL_REG));
1998
1999 /* Activate debug clock output */
2000 regval |= BIT(20);
2001 writel_relaxed(regval, LPASS_REG_BASE(LPASS_DEBUG_CLK_CTL_REG));
2002 break;
2003
2004 case APCS_BASE:
2005 clk_sel = 0x16A;
2006 regval = BVAL(5, 3, measure_mux[i].debug_mux);
2007 writel_relaxed(regval, APCS_REG_BASE(APCS_CLK_DIAG_REG));
2008
2009 /* Activate debug clock output */
2010 regval |= BIT(7);
2011 writel_relaxed(regval, APCS_REG_BASE(APCS_CLK_DIAG_REG));
2012 break;
2013
2014 default:
2015 return -EINVAL;
2016 }
2017
2018 /* Set debug mux clock index */
2019 regval = BVAL(8, 0, clk_sel);
2020 writel_relaxed(regval, GCC_REG_BASE(GCC_DEBUG_CLK_CTL_REG));
2021
2022 /* Activate debug clock output */
2023 regval |= BIT(16);
2024 writel_relaxed(regval, GCC_REG_BASE(GCC_DEBUG_CLK_CTL_REG));
2025
2026 /* Make sure test vector is set before starting measurements. */
2027 mb();
2028 spin_unlock_irqrestore(&local_clock_reg_lock, flags);
2029
2030 return 0;
2031}
2032
2033/* Sample clock for 'ticks' reference clock ticks. */
2034static u32 run_measurement(unsigned ticks)
2035{
2036 /* Stop counters and set the XO4 counter start value. */
2037 writel_relaxed(ticks, GCC_REG_BASE(CLOCK_FRQ_MEASURE_CTL_REG));
2038
2039 /* Wait for timer to become ready. */
2040 while ((readl_relaxed(GCC_REG_BASE(CLOCK_FRQ_MEASURE_STATUS_REG)) &
2041 BIT(25)) != 0)
2042 cpu_relax();
2043
2044 /* Run measurement and wait for completion. */
2045 writel_relaxed(BIT(20)|ticks, GCC_REG_BASE(CLOCK_FRQ_MEASURE_CTL_REG));
2046 while ((readl_relaxed(GCC_REG_BASE(CLOCK_FRQ_MEASURE_STATUS_REG)) &
2047 BIT(25)) == 0)
2048 cpu_relax();
2049
2050 /* Return measured ticks. */
2051 return readl_relaxed(GCC_REG_BASE(CLOCK_FRQ_MEASURE_STATUS_REG)) &
2052 BM(24, 0);
2053}
2054
2055/*
2056 * Perform a hardware rate measurement for a given clock.
2057 * FOR DEBUG USE ONLY: Measurements take ~15 ms!
2058 */
2059static unsigned long measure_clk_get_rate(struct clk *c)
2060{
2061 unsigned long flags;
2062 u32 gcc_xo4_reg_backup;
2063 u64 raw_count_short, raw_count_full;
2064 struct measure_clk *clk = to_measure_clk(c);
2065 unsigned ret;
2066
2067 ret = clk_prepare_enable(&cxo_clk_src.c);
2068 if (ret) {
2069 pr_warning("CXO clock failed to enable. Can't measure\n");
2070 return 0;
2071 }
2072
2073 spin_lock_irqsave(&local_clock_reg_lock, flags);
2074
2075 /* Enable CXO/4 and RINGOSC branch. */
2076 gcc_xo4_reg_backup = readl_relaxed(GCC_REG_BASE(GCC_XO_DIV4_CBCR_REG));
2077 writel_relaxed(0x1, GCC_REG_BASE(GCC_XO_DIV4_CBCR_REG));
2078
2079 /*
2080 * The ring oscillator counter will not reset if the measured clock
2081 * is not running. To detect this, run a short measurement before
2082 * the full measurement. If the raw results of the two are the same
2083 * then the clock must be off.
2084 */
2085
2086 /* Run a short measurement. (~1 ms) */
2087 raw_count_short = run_measurement(0x1000);
2088 /* Run a full measurement. (~14 ms) */
2089 raw_count_full = run_measurement(clk->sample_ticks);
2090
2091 writel_relaxed(gcc_xo4_reg_backup, GCC_REG_BASE(GCC_XO_DIV4_CBCR_REG));
2092
2093 /* Return 0 if the clock is off. */
2094 if (raw_count_full == raw_count_short) {
2095 ret = 0;
2096 } else {
2097 /* Compute rate in Hz. */
2098 raw_count_full = ((raw_count_full * 10) + 15) * 4800000;
2099 do_div(raw_count_full, ((clk->sample_ticks * 10) + 35));
2100 ret = (raw_count_full * clk->multiplier);
2101 }
2102
2103 writel_relaxed(0x51A00, GCC_REG_BASE(GCC_PLLTEST_PAD_CFG_REG));
2104 spin_unlock_irqrestore(&local_clock_reg_lock, flags);
2105
2106 clk_disable_unprepare(&cxo_clk_src.c);
2107
2108 return ret;
2109}
2110#else /* !CONFIG_DEBUG_FS */
2111static int measure_clk_set_parent(struct clk *clk, struct clk *parent)
2112{
2113 return -EINVAL;
2114}
2115
2116static unsigned long measure_clk_get_rate(struct clk *clk)
2117{
2118 return 0;
2119}
2120#endif /* CONFIG_DEBUG_FS */
2121
2122static struct clk_ops clk_ops_measure = {
2123 .set_parent = measure_clk_set_parent,
2124 .get_rate = measure_clk_get_rate,
2125};
2126
2127static struct measure_clk measure_clk = {
2128 .c = {
2129 .dbg_name = "measure_clk",
2130 .ops = &clk_ops_measure,
2131 CLK_INIT(measure_clk.c),
2132 },
2133 .multiplier = 1,
2134};
2135
2136static struct clk_lookup msm_clocks_9625[] = {
2137 CLK_LOOKUP("xo", cxo_clk_src.c, ""),
2138 CLK_LOOKUP("measure", measure_clk.c, "debug"),
2139
Tianyi Gou27df1bb2012-10-11 14:44:01 -07002140 CLK_LOOKUP("pll0", gpll0_activeonly_clk_src.c, "f9010008.qcom,acpuclk"),
2141 CLK_LOOKUP("pll14", apcspll_clk_src.c, "f9010008.qcom,acpuclk"),
Tianyi Gou389ba432012-10-01 13:58:38 -07002142
2143 CLK_LOOKUP("dma_bam_pclk", gcc_bam_dma_ahb_clk.c, "msm_sps"),
2144 CLK_LOOKUP("iface_clk", gcc_blsp1_ahb_clk.c, "msm_serial_hsl.0"),
Gilad Avidov09c78ec2012-10-18 09:34:35 -06002145 CLK_LOOKUP("iface_clk", gcc_blsp1_ahb_clk.c, "f9924000.spi"),
Tianyi Gou389ba432012-10-01 13:58:38 -07002146 CLK_LOOKUP("iface_clk", gcc_blsp1_ahb_clk.c, "f9925000.i2c"),
Saket Saurabhd72ee922013-01-22 16:56:52 +05302147 CLK_LOOKUP("iface_clk", gcc_blsp1_ahb_clk.c, "f991d000.uart"),
Tianyi Gou389ba432012-10-01 13:58:38 -07002148 CLK_LOOKUP("core_clk", gcc_blsp1_qup1_i2c_apps_clk.c, ""),
Gilad Avidov09c78ec2012-10-18 09:34:35 -06002149 CLK_LOOKUP("core_clk", gcc_blsp1_qup1_spi_apps_clk.c, ""),
Tianyi Gou389ba432012-10-01 13:58:38 -07002150 CLK_LOOKUP("core_clk", gcc_blsp1_qup2_i2c_apps_clk.c, ""),
Gilad Avidov09c78ec2012-10-18 09:34:35 -06002151 CLK_LOOKUP("core_clk", gcc_blsp1_qup2_spi_apps_clk.c, "f9924000.spi"),
Tianyi Gou389ba432012-10-01 13:58:38 -07002152 CLK_LOOKUP("core_clk", gcc_blsp1_qup3_i2c_apps_clk.c, "f9925000.i2c"),
2153 CLK_LOOKUP("core_clk", gcc_blsp1_qup3_spi_apps_clk.c, ""),
2154 CLK_LOOKUP("core_clk", gcc_blsp1_qup4_i2c_apps_clk.c, ""),
2155 CLK_LOOKUP("core_clk", gcc_blsp1_qup4_spi_apps_clk.c, ""),
2156 CLK_LOOKUP("core_clk", gcc_blsp1_qup5_i2c_apps_clk.c, ""),
2157 CLK_LOOKUP("core_clk", gcc_blsp1_qup5_spi_apps_clk.c, ""),
2158 CLK_LOOKUP("core_clk", gcc_blsp1_qup6_i2c_apps_clk.c, ""),
2159 CLK_LOOKUP("core_clk", gcc_blsp1_qup6_spi_apps_clk.c, ""),
Saket Saurabhd72ee922013-01-22 16:56:52 +05302160 CLK_LOOKUP("core_clk", gcc_blsp1_uart1_apps_clk.c, "f991d000.uart"),
Tianyi Gou389ba432012-10-01 13:58:38 -07002161 CLK_LOOKUP("core_clk", gcc_blsp1_uart2_apps_clk.c, ""),
2162 CLK_LOOKUP("core_clk", gcc_blsp1_uart3_apps_clk.c, "msm_serial_hsl.0"),
2163 CLK_LOOKUP("core_clk", gcc_blsp1_uart4_apps_clk.c, ""),
2164 CLK_LOOKUP("core_clk", gcc_blsp1_uart5_apps_clk.c, ""),
2165 CLK_LOOKUP("core_clk", gcc_blsp1_uart6_apps_clk.c, ""),
2166
2167 CLK_LOOKUP("core_clk_src", ce1_clk_src.c, ""),
2168 CLK_LOOKUP("core_clk", gcc_ce1_clk.c, ""),
2169 CLK_LOOKUP("iface_clk", gcc_ce1_ahb_clk.c, ""),
2170 CLK_LOOKUP("bus_clk", gcc_ce1_axi_clk.c, ""),
2171
2172 CLK_LOOKUP("core_clk", gcc_gp1_clk.c, ""),
2173 CLK_LOOKUP("core_clk", gcc_gp2_clk.c, ""),
2174 CLK_LOOKUP("core_clk", gcc_gp3_clk.c, ""),
2175
Hariprasad Dhalinarasimha9abfe782012-11-07 19:40:14 -08002176 CLK_LOOKUP("iface_clk", gcc_prng_ahb_clk.c, "f9bff000.qcom,msm-rng"),
Tianyi Gou389ba432012-10-01 13:58:38 -07002177 CLK_LOOKUP("core_src_clk", ipa_clk_src.c, "fd4c0000.qcom,ipa"),
2178 CLK_LOOKUP("core_clk", gcc_ipa_clk.c, "fd4c0000.qcom,ipa"),
2179 CLK_LOOKUP("bus_clk", gcc_sys_noc_ipa_axi_clk.c, "fd4c0000.qcom,ipa"),
2180 CLK_LOOKUP("iface_clk", gcc_ipa_cnoc_clk.c, "fd4c0000.qcom,ipa"),
Tianyi Gou0e10e792012-11-29 18:28:32 -08002181 CLK_LOOKUP("inactivity_clk", gcc_ipa_sleep_clk.c, "fd4c0000.qcom,ipa"),
Tianyi Gou389ba432012-10-01 13:58:38 -07002182
2183 CLK_LOOKUP("core_clk", gcc_pdm2_clk.c, ""),
2184 CLK_LOOKUP("iface_clk", gcc_pdm_ahb_clk.c, ""),
2185
Oluwafemi Adeyemi61df1182012-10-12 18:51:11 -07002186 CLK_LOOKUP("iface_clk", gcc_sdcc2_ahb_clk.c, "msm_sdcc.2"),
2187 CLK_LOOKUP("core_clk", gcc_sdcc2_apps_clk.c, "msm_sdcc.2"),
2188 CLK_LOOKUP("bus_clk", pnoc_sdcc2_clk.c, "msm_sdcc.2"),
2189 CLK_LOOKUP("iface_clk", gcc_sdcc3_ahb_clk.c, "msm_sdcc.3"),
2190 CLK_LOOKUP("core_clk", gcc_sdcc3_apps_clk.c, "msm_sdcc.3"),
2191 CLK_LOOKUP("bus_clk", pnoc_sdcc3_clk.c, "msm_sdcc.3"),
Tianyi Gou389ba432012-10-01 13:58:38 -07002192
2193 CLK_LOOKUP("iface_clk", gcc_usb_hs_ahb_clk.c, "f9a55000.usb"),
2194 CLK_LOOKUP("core_clk", gcc_usb_hs_system_clk.c, "f9a55000.usb"),
Ido Shayevitzd2b722b2013-01-09 13:08:54 +02002195 CLK_LOOKUP("iface_clk", gcc_usb_hsic_ahb_clk.c, "msm_hsic_host"),
2196 CLK_LOOKUP("phy_clk", gcc_usb_hsic_clk.c, "msm_hsic_host"),
2197 CLK_LOOKUP("cal_clk", gcc_usb_hsic_io_cal_clk.c, "msm_hsic_host"),
2198 CLK_LOOKUP("core_clk", gcc_usb_hsic_system_clk.c, "msm_hsic_host"),
Ofir Cohenb512a5f2012-12-13 09:46:34 +02002199 CLK_LOOKUP("alt_core_clk", gcc_usb_hsic_xcvr_fs_clk.c, ""),
Tianyi Gou389ba432012-10-01 13:58:38 -07002200
Hariprasad Dhalinarasimha96252de2012-11-21 17:52:36 -08002201 CLK_LOOKUP("core_clk", gcc_ce1_clk.c, "fd400000.qcom,qcedev"),
2202 CLK_LOOKUP("iface_clk", gcc_ce1_ahb_clk.c, "fd400000.qcom,qcedev"),
2203 CLK_LOOKUP("bus_clk", gcc_ce1_axi_clk.c, "fd400000.qcom,qcedev"),
2204 CLK_LOOKUP("core_clk_src", ce1_clk_src.c, "fd400000.qcom,qcedev"),
2205
2206 CLK_LOOKUP("core_clk", gcc_ce1_clk.c, "fd400000.qcom,qcrypto"),
2207 CLK_LOOKUP("iface_clk", gcc_ce1_ahb_clk.c, "fd400000.qcom,qcrypto"),
2208 CLK_LOOKUP("bus_clk", gcc_ce1_axi_clk.c, "fd400000.qcom,qcrypto"),
2209 CLK_LOOKUP("core_clk_src", ce1_clk_src.c, "fd400000.qcom,qcrypto"),
2210
Tianyi Gou389ba432012-10-01 13:58:38 -07002211 /* LPASS clocks */
2212 CLK_LOOKUP("core_clk", audio_core_slimbus_core_clk.c, "fe12f000.slim"),
2213 CLK_LOOKUP("iface_clk", audio_core_slimbus_lfabif_clk.c, ""),
Venkat Sudhir694a9222012-10-23 15:36:40 -07002214
2215 CLK_LOOKUP("core_clk", audio_core_lpaif_pri_clk_src.c,
2216 "msm-dai-q6-mi2s.0"),
2217 CLK_LOOKUP("osr_clk", audio_core_lpaif_pri_osr_clk.c,
2218 "msm-dai-q6-mi2s.0"),
2219 CLK_LOOKUP("ebit_clk", audio_core_lpaif_pri_ebit_clk.c,
2220 "msm-dai-q6-mi2s.0"),
2221 CLK_LOOKUP("ibit_clk", audio_core_lpaif_pri_ibit_clk.c,
2222 "msm-dai-q6-mi2s.0"),
Venkat Sudhir994193b2012-12-17 17:30:51 -08002223 CLK_LOOKUP("core_clk", audio_core_lpaif_sec_clk_src.c,
2224 "msm-dai-q6-mi2s.1"),
2225 CLK_LOOKUP("osr_clk", audio_core_lpaif_sec_osr_clk.c,
2226 "msm-dai-q6-mi2s.1"),
2227 CLK_LOOKUP("ebit_clk", audio_core_lpaif_sec_ebit_clk.c,
2228 "msm-dai-q6-mi2s.1"),
2229 CLK_LOOKUP("ibit_clk", audio_core_lpaif_sec_ibit_clk.c,
2230 "msm-dai-q6-mi2s.1"),
Tianyi Gou389ba432012-10-01 13:58:38 -07002231 CLK_LOOKUP("core_clk", audio_core_lpaif_pcm0_clk_src.c, ""),
2232 CLK_LOOKUP("ebit_clk", audio_core_lpaif_pcm0_ebit_clk.c, ""),
2233 CLK_LOOKUP("ibit_clk", audio_core_lpaif_pcm0_ibit_clk.c, ""),
2234 CLK_LOOKUP("core_clk", audio_core_lpaif_pcm1_clk_src.c, ""),
2235 CLK_LOOKUP("ebit_clk", audio_core_lpaif_pcm1_ebit_clk.c, ""),
2236 CLK_LOOKUP("ibit_clk", audio_core_lpaif_pcm1_ibit_clk.c, ""),
2237 CLK_LOOKUP("core_oe_src_clk", audio_core_lpaif_pcmoe_clk_src.c, ""),
2238 CLK_LOOKUP("core_oe_clk", audio_core_lpaif_pcm_data_oe_clk.c, ""),
2239
2240 /* RPM and voter clocks */
2241 CLK_LOOKUP("bus_clk", snoc_clk.c, ""),
2242 CLK_LOOKUP("bus_clk", pnoc_clk.c, ""),
2243 CLK_LOOKUP("bus_clk", cnoc_clk.c, ""),
2244 CLK_LOOKUP("mem_clk", bimc_clk.c, ""),
2245 CLK_LOOKUP("bus_clk", snoc_a_clk.c, ""),
2246 CLK_LOOKUP("bus_clk", pnoc_a_clk.c, ""),
2247 CLK_LOOKUP("bus_clk", cnoc_a_clk.c, ""),
2248 CLK_LOOKUP("mem_clk", bimc_a_clk.c, ""),
2249
2250 CLK_LOOKUP("bus_clk", cnoc_msmbus_clk.c, "msm_config_noc"),
2251 CLK_LOOKUP("bus_a_clk", cnoc_msmbus_a_clk.c, "msm_config_noc"),
2252 CLK_LOOKUP("bus_clk", snoc_msmbus_clk.c, "msm_sys_noc"),
2253 CLK_LOOKUP("bus_a_clk", snoc_msmbus_a_clk.c, "msm_sys_noc"),
2254 CLK_LOOKUP("bus_clk", pnoc_msmbus_clk.c, "msm_periph_noc"),
2255 CLK_LOOKUP("bus_a_clk", pnoc_msmbus_a_clk.c, "msm_periph_noc"),
2256 CLK_LOOKUP("mem_clk", bimc_msmbus_clk.c, "msm_bimc"),
2257 CLK_LOOKUP("mem_a_clk", bimc_msmbus_a_clk.c, "msm_bimc"),
2258
2259 CLK_LOOKUP("dfab_clk", pnoc_sps_clk.c, "msm_sps"),
2260
2261 CLK_LOOKUP("a5_m_clk", a5_m_clk, ""),
Pushkar Joshi4e483042012-10-29 18:10:08 -07002262
2263 /* Coresight QDSS clocks */
2264 CLK_LOOKUP("core_clk", qdss_clk.c, "fc322000.tmc"),
2265 CLK_LOOKUP("core_clk", qdss_clk.c, "fc318000.tpiu"),
2266 CLK_LOOKUP("core_clk", qdss_clk.c, "fc31c000.replicator"),
2267 CLK_LOOKUP("core_clk", qdss_clk.c, "fc307000.tmc"),
2268 CLK_LOOKUP("core_clk", qdss_clk.c, "fc31b000.funnel"),
2269 CLK_LOOKUP("core_clk", qdss_clk.c, "fc319000.funnel"),
2270 CLK_LOOKUP("core_clk", qdss_clk.c, "fc31a000.funnel"),
2271 CLK_LOOKUP("core_clk", qdss_clk.c, "fc321000.stm"),
Pushkar Joshi2a51a122012-12-06 10:49:07 -08002272 CLK_LOOKUP("core_clk", qdss_clk.c, "fc332000.etm"),
Pushkar Joshie0e8a7e2012-12-15 18:27:04 -08002273 CLK_LOOKUP("core_clk", qdss_clk.c, "fc332000.jtagmm"),
Pushkar Joshi4e483042012-10-29 18:10:08 -07002274
2275 CLK_LOOKUP("core_a_clk", qdss_clk.c, "fc322000.tmc"),
2276 CLK_LOOKUP("core_a_clk", qdss_clk.c, "fc318000.tpiu"),
2277 CLK_LOOKUP("core_a_clk", qdss_clk.c, "fc31c000.replicator"),
2278 CLK_LOOKUP("core_a_clk", qdss_clk.c, "fc307000.tmc"),
2279 CLK_LOOKUP("core_a_clk", qdss_clk.c, "fc31b000.funnel"),
2280 CLK_LOOKUP("core_a_clk", qdss_clk.c, "fc319000.funnel"),
2281 CLK_LOOKUP("core_a_clk", qdss_clk.c, "fc31a000.funnel"),
2282 CLK_LOOKUP("core_a_clk", qdss_clk.c, "fc321000.stm"),
Pushkar Joshi2a51a122012-12-06 10:49:07 -08002283 CLK_LOOKUP("core_a_clk", qdss_clk.c, "fc332000.etm"),
Pushkar Joshie0e8a7e2012-12-15 18:27:04 -08002284 CLK_LOOKUP("core_a_clk", qdss_clk.c, "fc332000.jtagmm"),
Pushkar Joshi4e483042012-10-29 18:10:08 -07002285
Tianyi Gou389ba432012-10-01 13:58:38 -07002286};
2287
2288static struct pll_config_regs gpll0_regs __initdata = {
2289 .l_reg = (void __iomem *)GPLL0_L_REG,
2290 .m_reg = (void __iomem *)GPLL0_M_REG,
2291 .n_reg = (void __iomem *)GPLL0_N_REG,
2292 .config_reg = (void __iomem *)GPLL0_USER_CTL_REG,
2293 .mode_reg = (void __iomem *)GPLL0_MODE_REG,
2294 .base = &virt_bases[GCC_BASE],
2295};
2296
2297/* GPLL0 at 600 MHz, main output enabled. */
2298static struct pll_config gpll0_config __initdata = {
2299 .l = 0x1f,
2300 .m = 0x1,
2301 .n = 0x4,
2302 .vco_val = 0x0,
2303 .vco_mask = BM(21, 20),
2304 .pre_div_val = 0x0,
2305 .pre_div_mask = BM(14, 12),
2306 .post_div_val = 0x0,
2307 .post_div_mask = BM(9, 8),
2308 .mn_ena_val = BIT(24),
2309 .mn_ena_mask = BIT(24),
2310 .main_output_val = BIT(0),
2311 .main_output_mask = BIT(0),
2312};
2313
2314static struct pll_config_regs gpll1_regs __initdata = {
2315 .l_reg = (void __iomem *)GPLL1_L_REG,
2316 .m_reg = (void __iomem *)GPLL1_M_REG,
2317 .n_reg = (void __iomem *)GPLL1_N_REG,
2318 .config_reg = (void __iomem *)GPLL1_USER_CTL_REG,
2319 .mode_reg = (void __iomem *)GPLL1_MODE_REG,
2320 .base = &virt_bases[GCC_BASE],
2321};
2322
2323/* GPLL1 at 480 MHz, main output enabled. */
2324static struct pll_config gpll1_config __initdata = {
2325 .l = 0x19,
2326 .m = 0x0,
2327 .n = 0x1,
2328 .vco_val = 0x0,
2329 .vco_mask = BM(21, 20),
2330 .pre_div_val = 0x0,
2331 .pre_div_mask = BM(14, 12),
2332 .post_div_val = 0x0,
2333 .post_div_mask = BM(9, 8),
2334 .main_output_val = BIT(0),
2335 .main_output_mask = BIT(0),
2336};
2337
2338static struct pll_config_regs lpapll0_regs __initdata = {
2339 .l_reg = (void __iomem *)LPAPLL_L_REG,
2340 .m_reg = (void __iomem *)LPAPLL_M_REG,
2341 .n_reg = (void __iomem *)LPAPLL_N_REG,
2342 .config_reg = (void __iomem *)LPAPLL_USER_CTL_REG,
2343 .mode_reg = (void __iomem *)LPAPLL_MODE_REG,
2344 .base = &virt_bases[LPASS_BASE],
2345};
2346
2347/* LPAPLL0 at 393.216 MHz, main output enabled. */
2348static struct pll_config lpapll0_config __initdata = {
2349 .l = 0x28,
2350 .m = 0x18,
2351 .n = 0x19,
2352 .vco_val = 0x0,
2353 .vco_mask = BM(21, 20),
2354 .pre_div_val = 0x0,
2355 .pre_div_mask = BM(14, 12),
2356 .post_div_val = BVAL(9, 8, 0x1),
2357 .post_div_mask = BM(9, 8),
2358 .mn_ena_val = BIT(24),
2359 .mn_ena_mask = BIT(24),
2360 .main_output_val = BIT(0),
2361 .main_output_mask = BIT(0),
2362};
2363
Tianyi Gou389ba432012-10-01 13:58:38 -07002364#define PLL_AUX_OUTPUT_BIT 1
2365#define PLL_AUX2_OUTPUT_BIT 2
2366
2367/*
2368 * TODO: Need to remove this function when the v2 hardware
2369 * fix the broken lock status bit.
2370 */
2371#define PLL_OUTCTRL BIT(0)
2372#define PLL_BYPASSNL BIT(1)
2373#define PLL_RESET_N BIT(2)
2374
2375static DEFINE_SPINLOCK(sr_pll_reg_lock);
2376
2377static int sr_pll_clk_enable_9625(struct clk *c)
2378{
2379 unsigned long flags;
2380 struct pll_clk *pll = to_pll_clk(c);
2381 u32 mode;
2382 void __iomem *mode_reg = *pll->base + (u32)pll->mode_reg;
2383
2384 spin_lock_irqsave(&sr_pll_reg_lock, flags);
2385
2386 /* Disable PLL bypass mode and de-assert reset. */
2387 mode = readl_relaxed(mode_reg);
2388 mode |= PLL_BYPASSNL | PLL_RESET_N;
2389 writel_relaxed(mode, mode_reg);
2390
2391 /* Wait for pll to lock. */
2392 udelay(100);
2393
2394 /* Enable PLL output. */
2395 mode |= PLL_OUTCTRL;
2396 writel_relaxed(mode, mode_reg);
2397
2398 /* Ensure the write above goes through before returning. */
2399 mb();
2400
2401 spin_unlock_irqrestore(&sr_pll_reg_lock, flags);
2402 return 0;
2403}
2404
2405static void __init configure_apcs_pll(void)
2406{
2407 u32 regval;
2408
Tianyi Goua717ddd2012-10-05 17:06:24 -07002409 clk_set_rate(&apcspll_clk_src.c, 998400000);
2410
Tianyi Gou389ba432012-10-01 13:58:38 -07002411 writel_relaxed(0x00141200,
2412 APCS_PLL_REG_BASE(APCS_CPU_PLL_CONFIG_CTL_REG));
Tianyi Goua717ddd2012-10-05 17:06:24 -07002413
2414 /* Enable AUX and AUX2 output */
Tianyi Gou389ba432012-10-01 13:58:38 -07002415 regval = readl_relaxed(APCS_PLL_REG_BASE(APCS_CPU_PLL_USER_CTL_REG));
2416 regval |= BIT(PLL_AUX_OUTPUT_BIT) | BIT(PLL_AUX2_OUTPUT_BIT);
2417 writel_relaxed(regval, APCS_PLL_REG_BASE(APCS_CPU_PLL_USER_CTL_REG));
2418}
2419
2420#define PWR_ON_MASK BIT(31)
2421#define EN_REST_WAIT_MASK (0xF << 20)
2422#define EN_FEW_WAIT_MASK (0xF << 16)
2423#define CLK_DIS_WAIT_MASK (0xF << 12)
2424#define SW_OVERRIDE_MASK BIT(2)
2425#define HW_CONTROL_MASK BIT(1)
2426#define SW_COLLAPSE_MASK BIT(0)
2427
2428/* Wait 2^n CXO cycles between all states. Here, n=2 (4 cycles). */
2429#define EN_REST_WAIT_VAL (0x2 << 20)
2430#define EN_FEW_WAIT_VAL (0x2 << 16)
2431#define CLK_DIS_WAIT_VAL (0x2 << 12)
2432#define GDSC_TIMEOUT_US 50000
2433
2434static void __init reg_init(void)
2435{
2436 u32 regval, status;
2437 int ret;
2438
2439 if (!(readl_relaxed(GCC_REG_BASE(GPLL0_STATUS_REG))
2440 & gpll0_clk_src.status_mask))
2441 configure_sr_hpm_lp_pll(&gpll0_config, &gpll0_regs, 1);
2442
2443 if (!(readl_relaxed(GCC_REG_BASE(GPLL1_STATUS_REG))
2444 & gpll1_clk_src.status_mask))
2445 configure_sr_hpm_lp_pll(&gpll1_config, &gpll1_regs, 1);
2446
2447 configure_sr_hpm_lp_pll(&lpapll0_config, &lpapll0_regs, 1);
2448
2449 /* TODO: Remove A5 pll configuration once the bootloader is avaiable */
2450 regval = readl_relaxed(APCS_PLL_REG_BASE(APCS_CPU_PLL_MODE_REG));
2451 if ((regval & BM(2, 0)) != 0x7)
2452 configure_apcs_pll();
2453
2454 /* TODO:
2455 * 1) do we need to turn on AUX2 output too?
2456 * 2) if need to vote off all sleep clocks
2457 */
2458
2459 /* Enable GPLL0's aux outputs. */
2460 regval = readl_relaxed(GCC_REG_BASE(GPLL0_USER_CTL_REG));
2461 regval |= BIT(PLL_AUX_OUTPUT_BIT) | BIT(PLL_AUX2_OUTPUT_BIT);
2462 writel_relaxed(regval, GCC_REG_BASE(GPLL0_USER_CTL_REG));
2463
2464 /* Vote for GPLL0 to turn on. Needed by acpuclock. */
2465 regval = readl_relaxed(GCC_REG_BASE(APCS_GPLL_ENA_VOTE_REG));
2466 regval |= BIT(0);
2467 writel_relaxed(regval, GCC_REG_BASE(APCS_GPLL_ENA_VOTE_REG));
2468
2469 /*
2470 * TODO: Confirm that no clocks need to be voted on in this sleep vote
2471 * register.
2472 */
2473 writel_relaxed(0x0, GCC_REG_BASE(APCS_CLOCK_SLEEP_ENA_VOTE));
2474
2475 /*
2476 * TODO: The following sequence enables the LPASS audio core GDSC.
2477 * Remove when this becomes unnecessary.
2478 */
2479
2480 /*
2481 * Disable HW trigger: collapse/restore occur based on registers writes.
2482 * Disable SW override: Use hardware state-machine for sequencing.
2483 */
2484 regval = readl_relaxed(LPASS_REG_BASE(AUDIO_CORE_GDSCR));
2485 regval &= ~(HW_CONTROL_MASK | SW_OVERRIDE_MASK);
2486
2487 /* Configure wait time between states. */
2488 regval &= ~(EN_REST_WAIT_MASK | EN_FEW_WAIT_MASK | CLK_DIS_WAIT_MASK);
2489 regval |= EN_REST_WAIT_VAL | EN_FEW_WAIT_VAL | CLK_DIS_WAIT_VAL;
2490 writel_relaxed(regval, LPASS_REG_BASE(AUDIO_CORE_GDSCR));
2491
2492 regval = readl_relaxed(LPASS_REG_BASE(AUDIO_CORE_GDSCR));
2493 regval &= ~BIT(0);
2494 writel_relaxed(regval, LPASS_REG_BASE(AUDIO_CORE_GDSCR));
2495
2496 ret = readl_poll_timeout(LPASS_REG_BASE(AUDIO_CORE_GDSCR), status,
2497 status & PWR_ON_MASK, 50, GDSC_TIMEOUT_US);
2498 WARN(ret, "LPASS Audio Core GDSC did not power on.\n");
2499}
2500
2501static void __init msm9625_clock_post_init(void)
2502{
2503 /*
2504 * Hold an active set vote for CXO; this is because CXO is expected
2505 * to remain on whenever CPUs aren't power collapsed.
2506 */
2507 clk_prepare_enable(&cxo_a_clk_src.c);
2508
2509 /*
2510 * TODO: This call is to prevent sending 0Hz to rpm to turn off pnoc.
2511 * Needs to remove this after vote of pnoc from sdcc driver is ready.
2512 */
2513 clk_prepare_enable(&pnoc_msmbus_a_clk.c);
2514
2515 /* Set rates for single-rate clocks. */
2516 clk_set_rate(&usb_hs_system_clk_src.c,
2517 usb_hs_system_clk_src.freq_tbl[0].freq_hz);
2518 clk_set_rate(&usb_hsic_clk_src.c,
2519 usb_hsic_clk_src.freq_tbl[0].freq_hz);
2520 clk_set_rate(&usb_hsic_io_cal_clk_src.c,
2521 usb_hsic_io_cal_clk_src.freq_tbl[0].freq_hz);
2522 clk_set_rate(&usb_hsic_system_clk_src.c,
2523 usb_hsic_system_clk_src.freq_tbl[0].freq_hz);
2524 clk_set_rate(&usb_hsic_xcvr_fs_clk_src.c,
2525 usb_hsic_xcvr_fs_clk_src.freq_tbl[0].freq_hz);
2526 clk_set_rate(&pdm2_clk_src.c, pdm2_clk_src.freq_tbl[0].freq_hz);
2527 clk_set_rate(&audio_core_slimbus_core_clk_src.c,
2528 audio_core_slimbus_core_clk_src.freq_tbl[0].freq_hz);
Tianyi Goub1d13972013-01-23 22:55:22 -08002529 /*
2530 * TODO: set rate on behalf of the i2c driver until the i2c driver
2531 * distinguish v1/v2 and call set rate accordingly.
2532 */
2533 if (SOCINFO_VERSION_MAJOR(socinfo_get_version()) == 2)
2534 clk_set_rate(&blsp1_qup3_i2c_apps_clk_src.c,
2535 blsp1_qup3_i2c_apps_clk_src.freq_tbl[0].freq_hz);
Tianyi Gou389ba432012-10-01 13:58:38 -07002536}
2537
2538#define GCC_CC_PHYS 0xFC400000
2539#define GCC_CC_SIZE SZ_16K
2540
2541#define LPASS_CC_PHYS 0xFE000000
2542#define LPASS_CC_SIZE SZ_256K
2543
2544#define APCS_GCC_CC_PHYS 0xF9011000
2545#define APCS_GCC_CC_SIZE SZ_4K
2546
2547#define APCS_PLL_PHYS 0xF9008018
2548#define APCS_PLL_SIZE 0x18
2549
Tianyi Goub1d13972013-01-23 22:55:22 -08002550static struct clk *i2c_apps_clks[][2] __initdata = {
2551 {&gcc_blsp1_qup1_i2c_apps_clk.c, &blsp1_qup1_i2c_apps_clk_src.c},
2552 {&gcc_blsp1_qup2_i2c_apps_clk.c, &blsp1_qup2_i2c_apps_clk_src.c},
2553 {&gcc_blsp1_qup3_i2c_apps_clk.c, &blsp1_qup3_i2c_apps_clk_src.c},
2554 {&gcc_blsp1_qup4_i2c_apps_clk.c, &blsp1_qup4_i2c_apps_clk_src.c},
2555 {&gcc_blsp1_qup5_i2c_apps_clk.c, &blsp1_qup5_i2c_apps_clk_src.c},
2556 {&gcc_blsp1_qup6_i2c_apps_clk.c, &blsp1_qup6_i2c_apps_clk_src.c},
2557};
2558
Tianyi Gou389ba432012-10-01 13:58:38 -07002559static void __init msm9625_clock_pre_init(void)
2560{
2561 virt_bases[GCC_BASE] = ioremap(GCC_CC_PHYS, GCC_CC_SIZE);
2562 if (!virt_bases[GCC_BASE])
2563 panic("clock-9625: Unable to ioremap GCC memory!");
2564
2565 virt_bases[LPASS_BASE] = ioremap(LPASS_CC_PHYS, LPASS_CC_SIZE);
2566 if (!virt_bases[LPASS_BASE])
2567 panic("clock-9625: Unable to ioremap LPASS_CC memory!");
2568
2569 virt_bases[APCS_BASE] = ioremap(APCS_GCC_CC_PHYS, APCS_GCC_CC_SIZE);
2570 if (!virt_bases[APCS_BASE])
2571 panic("clock-9625: Unable to ioremap APCS_GCC_CC memory!");
2572
2573 virt_bases[APCS_PLL_BASE] = ioremap(APCS_PLL_PHYS, APCS_PLL_SIZE);
2574 if (!virt_bases[APCS_PLL_BASE])
2575 panic("clock-9625: Unable to ioremap APCS_PLL memory!");
2576
Tianyi Goub1d13972013-01-23 22:55:22 -08002577 /* The parent of each of the QUP I2C APPS clocks is an RCG on v2 */
2578 if (SOCINFO_VERSION_MAJOR(socinfo_get_version()) == 2) {
2579 int i, num_cores = ARRAY_SIZE(i2c_apps_clks);
2580 for (i = 0; i < num_cores; i++)
2581 i2c_apps_clks[i][0]->parent = i2c_apps_clks[i][1];
2582 }
2583
Tianyi Gou389ba432012-10-01 13:58:38 -07002584 clk_ops_local_pll.enable = sr_pll_clk_enable_9625;
2585
2586 vdd_dig_reg = regulator_get(NULL, "vdd_dig");
2587 if (IS_ERR(vdd_dig_reg))
2588 panic("clock-9625: Unable to get the vdd_dig regulator!");
2589
2590 vote_vdd_level(&vdd_dig, VDD_DIG_HIGH);
2591 regulator_enable(vdd_dig_reg);
2592
2593 enable_rpm_scaling();
2594
2595 reg_init();
2596}
2597
2598static int __init msm9625_clock_late_init(void)
2599{
2600 return unvote_vdd_level(&vdd_dig, VDD_DIG_HIGH);
2601}
2602
2603struct clock_init_data msm9625_clock_init_data __initdata = {
2604 .table = msm_clocks_9625,
2605 .size = ARRAY_SIZE(msm_clocks_9625),
2606 .pre_init = msm9625_clock_pre_init,
2607 .post_init = msm9625_clock_post_init,
2608 .late_init = msm9625_clock_late_init,
2609};