blob: 6817c6c7efa1a1ed5d6f0cbc831eb3c0693a3ca7 [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,
Tianyi Gou389ba432012-10-01 13:58:38 -070036 APCS_BASE,
37 APCS_PLL_BASE,
38 N_BASES,
39};
40
41static void __iomem *virt_bases[N_BASES];
42
43#define GCC_REG_BASE(x) (void __iomem *)(virt_bases[GCC_BASE] + (x))
Tianyi Gou389ba432012-10-01 13:58:38 -070044#define APCS_REG_BASE(x) (void __iomem *)(virt_bases[APCS_BASE] + (x))
45#define APCS_PLL_REG_BASE(x) (void __iomem *)(virt_bases[APCS_PLL_BASE] + (x))
46
47/* GCC registers */
48#define GPLL0_MODE_REG 0x0000
49#define GPLL0_L_REG 0x0004
50#define GPLL0_M_REG 0x0008
51#define GPLL0_N_REG 0x000C
52#define GPLL0_USER_CTL_REG 0x0010
53#define GPLL0_CONFIG_CTL_REG 0x0014
54#define GPLL0_TEST_CTL_REG 0x0018
55#define GPLL0_STATUS_REG 0x001C
56
57#define GPLL1_MODE_REG 0x0040
58#define GPLL1_L_REG 0x0044
59#define GPLL1_M_REG 0x0048
60#define GPLL1_N_REG 0x004C
61#define GPLL1_USER_CTL_REG 0x0050
62#define GPLL1_CONFIG_CTL_REG 0x0054
63#define GPLL1_TEST_CTL_REG 0x0058
64#define GPLL1_STATUS_REG 0x005C
65
66#define GCC_DEBUG_CLK_CTL_REG 0x1880
67#define CLOCK_FRQ_MEASURE_CTL_REG 0x1884
68#define CLOCK_FRQ_MEASURE_STATUS_REG 0x1888
69#define GCC_PLLTEST_PAD_CFG_REG 0x188C
70#define GCC_XO_DIV4_CBCR_REG 0x10C8
71#define APCS_GPLL_ENA_VOTE_REG 0x1480
72#define APCS_CLOCK_BRANCH_ENA_VOTE 0x1484
73#define APCS_CLOCK_SLEEP_ENA_VOTE 0x1488
74
75#define APCS_CLK_DIAG_REG 0x001C
76
77#define APCS_CPU_PLL_MODE_REG 0x0000
78#define APCS_CPU_PLL_L_REG 0x0004
79#define APCS_CPU_PLL_M_REG 0x0008
80#define APCS_CPU_PLL_N_REG 0x000C
81#define APCS_CPU_PLL_USER_CTL_REG 0x0010
82#define APCS_CPU_PLL_CONFIG_CTL_REG 0x0014
83#define APCS_CPU_PLL_TEST_CTL_REG 0x0018
84#define APCS_CPU_PLL_STATUS_REG 0x001C
85
86#define USB_HSIC_SYSTEM_CMD_RCGR 0x041C
87#define USB_HSIC_XCVR_FS_CMD_RCGR 0x0424
88#define USB_HSIC_CMD_RCGR 0x0440
89#define USB_HSIC_IO_CAL_CMD_RCGR 0x0458
90#define USB_HS_SYSTEM_CMD_RCGR 0x0490
91#define SDCC2_APPS_CMD_RCGR 0x0510
92#define SDCC3_APPS_CMD_RCGR 0x0550
93#define BLSP1_QUP1_SPI_APPS_CMD_RCGR 0x064C
Tianyi Goub1d13972013-01-23 22:55:22 -080094#define BLSP1_QUP1_I2C_APPS_CMD_RCGR 0x0660
Tianyi Gou389ba432012-10-01 13:58:38 -070095#define BLSP1_UART1_APPS_CMD_RCGR 0x068C
96#define BLSP1_QUP2_SPI_APPS_CMD_RCGR 0x06CC
Tianyi Goub1d13972013-01-23 22:55:22 -080097#define BLSP1_QUP2_I2C_APPS_CMD_RCGR 0x06E0
Tianyi Gou389ba432012-10-01 13:58:38 -070098#define BLSP1_UART2_APPS_CMD_RCGR 0x070C
99#define BLSP1_QUP3_SPI_APPS_CMD_RCGR 0x074C
Tianyi Goub1d13972013-01-23 22:55:22 -0800100#define BLSP1_QUP3_I2C_APPS_CMD_RCGR 0x0760
Tianyi Gou389ba432012-10-01 13:58:38 -0700101#define BLSP1_UART3_APPS_CMD_RCGR 0x078C
102#define BLSP1_QUP4_SPI_APPS_CMD_RCGR 0x07CC
Tianyi Goub1d13972013-01-23 22:55:22 -0800103#define BLSP1_QUP4_I2C_APPS_CMD_RCGR 0x07E0
Tianyi Gou389ba432012-10-01 13:58:38 -0700104#define BLSP1_UART4_APPS_CMD_RCGR 0x080C
105#define BLSP1_QUP5_SPI_APPS_CMD_RCGR 0x084C
Tianyi Goub1d13972013-01-23 22:55:22 -0800106#define BLSP1_QUP5_I2C_APPS_CMD_RCGR 0x0860
Tianyi Gou389ba432012-10-01 13:58:38 -0700107#define BLSP1_UART5_APPS_CMD_RCGR 0x088C
108#define BLSP1_QUP6_SPI_APPS_CMD_RCGR 0x08CC
Tianyi Goub1d13972013-01-23 22:55:22 -0800109#define BLSP1_QUP6_I2C_APPS_CMD_RCGR 0x08E0
Tianyi Gou389ba432012-10-01 13:58:38 -0700110#define BLSP1_UART6_APPS_CMD_RCGR 0x090C
111#define PDM2_CMD_RCGR 0x0CD0
112#define CE1_CMD_RCGR 0x1050
113#define GP1_CMD_RCGR 0x1904
114#define GP2_CMD_RCGR 0x1944
115#define GP3_CMD_RCGR 0x1984
116#define QPIC_CMD_RCGR 0x1A50
117#define IPA_CMD_RCGR 0x1A90
118
119#define USB_HS_HSIC_BCR 0x0400
120#define USB_HS_BCR 0x0480
121#define SDCC2_BCR 0x0500
122#define SDCC3_BCR 0x0540
123#define BLSP1_BCR 0x05C0
124#define BLSP1_QUP1_BCR 0x0640
125#define BLSP1_UART1_BCR 0x0680
126#define BLSP1_QUP2_BCR 0x06C0
127#define BLSP1_UART2_BCR 0x0700
128#define BLSP1_QUP3_BCR 0x0740
129#define BLSP1_UART3_BCR 0x0780
130#define BLSP1_QUP4_BCR 0x07C0
131#define BLSP1_UART4_BCR 0x0800
132#define BLSP1_QUP5_BCR 0x0840
133#define BLSP1_UART5_BCR 0x0880
134#define BLSP1_QUP6_BCR 0x08C0
135#define BLSP1_UART6_BCR 0x0900
136#define PDM_BCR 0x0CC0
137#define PRNG_BCR 0x0D00
138#define BAM_DMA_BCR 0x0D40
139#define BOOT_ROM_BCR 0x0E00
140#define CE1_BCR 0x1040
141#define QPIC_BCR 0x1040
142#define IPA_BCR 0x1A80
143
144
145#define SYS_NOC_IPA_AXI_CBCR 0x0128
146#define USB_HSIC_AHB_CBCR 0x0408
147#define USB_HSIC_SYSTEM_CBCR 0x040C
148#define USB_HSIC_CBCR 0x0410
149#define USB_HSIC_IO_CAL_CBCR 0x0414
Tianyi Gou55b805b2013-02-28 21:46:03 -0800150#define USB_HSIC_IO_CAL_SLEEP_CBCR 0x0418
Tianyi Gou389ba432012-10-01 13:58:38 -0700151#define USB_HSIC_XCVR_FS_CBCR 0x042C
152#define USB_HS_SYSTEM_CBCR 0x0484
153#define USB_HS_AHB_CBCR 0x0488
154#define SDCC2_APPS_CBCR 0x0504
155#define SDCC2_AHB_CBCR 0x0508
156#define SDCC3_APPS_CBCR 0x0544
157#define SDCC3_AHB_CBCR 0x0548
158#define BLSP1_AHB_CBCR 0x05C4
159#define BLSP1_QUP1_SPI_APPS_CBCR 0x0644
160#define BLSP1_QUP1_I2C_APPS_CBCR 0x0648
161#define BLSP1_UART1_APPS_CBCR 0x0684
162#define BLSP1_UART1_SIM_CBCR 0x0688
163#define BLSP1_QUP2_SPI_APPS_CBCR 0x06C4
164#define BLSP1_QUP2_I2C_APPS_CBCR 0x06C8
165#define BLSP1_UART2_APPS_CBCR 0x0704
166#define BLSP1_UART2_SIM_CBCR 0x0708
167#define BLSP1_QUP3_SPI_APPS_CBCR 0x0744
168#define BLSP1_QUP3_I2C_APPS_CBCR 0x0748
169#define BLSP1_UART3_APPS_CBCR 0x0784
170#define BLSP1_UART3_SIM_CBCR 0x0788
171#define BLSP1_QUP4_SPI_APPS_CBCR 0x07C4
172#define BLSP1_QUP4_I2C_APPS_CBCR 0x07C8
173#define BLSP1_UART4_APPS_CBCR 0x0804
174#define BLSP1_UART4_SIM_CBCR 0x0808
175#define BLSP1_QUP5_SPI_APPS_CBCR 0x0844
176#define BLSP1_QUP5_I2C_APPS_CBCR 0x0848
177#define BLSP1_UART5_APPS_CBCR 0x0884
178#define BLSP1_UART5_SIM_CBCR 0x0888
179#define BLSP1_QUP6_SPI_APPS_CBCR 0x08C4
180#define BLSP1_QUP6_I2C_APPS_CBCR 0x08C8
181#define BLSP1_UART6_APPS_CBCR 0x0904
182#define BLSP1_UART6_SIM_CBCR 0x0908
183#define BOOT_ROM_AHB_CBCR 0x0E04
184#define PDM_AHB_CBCR 0x0CC4
185#define PDM_XO4_CBCR 0x0CC8
186#define PDM_AHB_CBCR 0x0CC4
187#define PDM_XO4_CBCR 0x0CC8
188#define PDM2_CBCR 0x0CCC
189#define PRNG_AHB_CBCR 0x0D04
190#define BAM_DMA_AHB_CBCR 0x0D44
Tianyi Gou55b805b2013-02-28 21:46:03 -0800191#define BAM_DMA_INACTIVITY_TIMERS_CBCR 0x0D48
Tianyi Gou389ba432012-10-01 13:58:38 -0700192#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
Tianyi Gou389ba432012-10-01 13:58:38 -0700206/* Mux source select values */
207#define cxo_source_val 0
208#define gpll0_source_val 1
209#define gpll1_hsic_source_val 4
210#define gnd_source_val 5
Tianyi Gou389ba432012-10-01 13:58:38 -0700211
Vikram Mulukutlad3dca652012-11-19 11:04:13 -0800212#define F_GCC_GND \
213 { \
214 .freq_hz = 0, \
215 .m_val = 0, \
216 .n_val = 0, \
217 .div_src_val = BVAL(4, 0, 1) | BVAL(10, 8, gnd_source_val), \
218 }
219
Tianyi Gou389ba432012-10-01 13:58:38 -0700220#define F(f, s, div, m, n) \
221 { \
222 .freq_hz = (f), \
223 .src_clk = &s##_clk_src.c, \
224 .m_val = (m), \
225 .n_val = ~((n)-(m)) * !!(n), \
226 .d_val = ~(n),\
227 .div_src_val = BVAL(4, 0, (int)(2*(div) - 1)) \
228 | BVAL(10, 8, s##_source_val), \
229 }
230
231#define F_HSIC(f, s, div, m, n) \
232 { \
233 .freq_hz = (f), \
234 .src_clk = &s##_clk_src.c, \
235 .m_val = (m), \
236 .n_val = ~((n)-(m)) * !!(n), \
237 .d_val = ~(n),\
238 .div_src_val = BVAL(4, 0, (int)(2*(div) - 1)) \
239 | BVAL(10, 8, s##_hsic_source_val), \
240 }
241
Tianyi Goua717ddd2012-10-05 17:06:24 -0700242#define F_APCS_PLL(f, l, m, n, pre_div, post_div, vco) \
243 { \
244 .freq_hz = (f), \
245 .l_val = (l), \
246 .m_val = (m), \
247 .n_val = (n), \
248 .pre_div_val = BVAL(14, 12, (pre_div)), \
249 .post_div_val = BVAL(9, 8, (post_div)), \
250 .vco_val = BVAL(21, 20, (vco)), \
251 }
Tianyi Gou389ba432012-10-01 13:58:38 -0700252
253#define VDD_DIG_FMAX_MAP1(l1, f1) \
Saravana Kannan55e959d2012-10-15 22:16:04 -0700254 .vdd_class = &vdd_dig, \
255 .fmax = (unsigned long[VDD_DIG_NUM]) { \
256 [VDD_DIG_##l1] = (f1), \
257 }, \
258 .num_fmax = VDD_DIG_NUM
Tianyi Gou389ba432012-10-01 13:58:38 -0700259#define VDD_DIG_FMAX_MAP2(l1, f1, l2, f2) \
Saravana Kannan55e959d2012-10-15 22:16:04 -0700260 .vdd_class = &vdd_dig, \
261 .fmax = (unsigned long[VDD_DIG_NUM]) { \
262 [VDD_DIG_##l1] = (f1), \
263 [VDD_DIG_##l2] = (f2), \
264 }, \
265 .num_fmax = VDD_DIG_NUM
Tianyi Gou389ba432012-10-01 13:58:38 -0700266#define VDD_DIG_FMAX_MAP3(l1, f1, l2, f2, l3, f3) \
Saravana Kannan55e959d2012-10-15 22:16:04 -0700267 .vdd_class = &vdd_dig, \
268 .fmax = (unsigned long[VDD_DIG_NUM]) { \
269 [VDD_DIG_##l1] = (f1), \
270 [VDD_DIG_##l2] = (f2), \
271 [VDD_DIG_##l3] = (f3), \
272 }, \
273 .num_fmax = VDD_DIG_NUM
Tianyi Gou389ba432012-10-01 13:58:38 -0700274
275enum vdd_dig_levels {
276 VDD_DIG_NONE,
277 VDD_DIG_LOW,
278 VDD_DIG_NOMINAL,
Saravana Kannan55e959d2012-10-15 22:16:04 -0700279 VDD_DIG_HIGH,
280 VDD_DIG_NUM
Tianyi Gou389ba432012-10-01 13:58:38 -0700281};
282
Patrick Dalyebc26bc2013-02-05 11:49:07 -0800283static const int *vdd_corner[] = {
284 [VDD_DIG_NONE] = VDD_UV(RPM_REGULATOR_CORNER_NONE),
285 [VDD_DIG_LOW] = VDD_UV(RPM_REGULATOR_CORNER_SVS_SOC),
286 [VDD_DIG_NOMINAL] = VDD_UV(RPM_REGULATOR_CORNER_NORMAL),
287 [VDD_DIG_HIGH] = VDD_UV(RPM_REGULATOR_CORNER_SUPER_TURBO),
Tianyi Gou389ba432012-10-01 13:58:38 -0700288};
289
Patrick Dalyebc26bc2013-02-05 11:49:07 -0800290static DEFINE_VDD_REGULATORS(vdd_dig, VDD_DIG_NUM, 1, vdd_corner);
Tianyi Gou389ba432012-10-01 13:58:38 -0700291
292/* TODO: Needs to confirm the below values */
293#define RPM_MISC_CLK_TYPE 0x306b6c63
294#define RPM_BUS_CLK_TYPE 0x316b6c63
295#define RPM_MEM_CLK_TYPE 0x326b6c63
296
297#define RPM_SMD_KEY_ENABLE 0x62616E45
298
299#define CXO_ID 0x0
300#define QDSS_ID 0x1
301
302#define PNOC_ID 0x0
303#define SNOC_ID 0x1
304#define CNOC_ID 0x2
305
306#define BIMC_ID 0x0
307
308#define D0_ID 1
309#define D1_ID 2
310#define A0_ID 3
311#define A1_ID 4
312#define A2_ID 5
313
314DEFINE_CLK_RPM_SMD_BRANCH(cxo_clk_src, cxo_a_clk_src,
315 RPM_MISC_CLK_TYPE, CXO_ID, 19200000);
316
317DEFINE_CLK_RPM_SMD(cnoc_clk, cnoc_a_clk, RPM_BUS_CLK_TYPE, CNOC_ID, NULL);
318DEFINE_CLK_RPM_SMD(pnoc_clk, pnoc_a_clk, RPM_BUS_CLK_TYPE, PNOC_ID, NULL);
319DEFINE_CLK_RPM_SMD(snoc_clk, snoc_a_clk, RPM_BUS_CLK_TYPE, SNOC_ID, NULL);
320
321DEFINE_CLK_RPM_SMD(bimc_clk, bimc_a_clk, RPM_MEM_CLK_TYPE, BIMC_ID, NULL);
322
323DEFINE_CLK_RPM_SMD_QDSS(qdss_clk, qdss_a_clk, RPM_MISC_CLK_TYPE, QDSS_ID);
324
325DEFINE_CLK_RPM_SMD_XO_BUFFER(cxo_d0, cxo_d0_a, D0_ID);
326DEFINE_CLK_RPM_SMD_XO_BUFFER(cxo_d1, cxo_d1_a, D1_ID);
327DEFINE_CLK_RPM_SMD_XO_BUFFER(cxo_a0, cxo_a0_a, A0_ID);
328DEFINE_CLK_RPM_SMD_XO_BUFFER(cxo_a1, cxo_a1_a, A1_ID);
329DEFINE_CLK_RPM_SMD_XO_BUFFER(cxo_a2, cxo_a2_a, A2_ID);
330
331DEFINE_CLK_RPM_SMD_XO_BUFFER_PINCTRL(cxo_d0_pin, cxo_d0_a_pin, D0_ID);
332DEFINE_CLK_RPM_SMD_XO_BUFFER_PINCTRL(cxo_d1_pin, cxo_d1_a_pin, D1_ID);
333DEFINE_CLK_RPM_SMD_XO_BUFFER_PINCTRL(cxo_a0_pin, cxo_a0_a_pin, A0_ID);
334DEFINE_CLK_RPM_SMD_XO_BUFFER_PINCTRL(cxo_a1_pin, cxo_a1_a_pin, A1_ID);
335DEFINE_CLK_RPM_SMD_XO_BUFFER_PINCTRL(cxo_a2_pin, cxo_a2_a_pin, A2_ID);
336
Tianyi Gou27df1bb2012-10-11 14:44:01 -0700337static unsigned int soft_vote_gpll0;
338
Tianyi Gou389ba432012-10-01 13:58:38 -0700339static struct pll_vote_clk gpll0_clk_src = {
340 .en_reg = (void __iomem *)APCS_GPLL_ENA_VOTE_REG,
Tianyi Gou2aee4652013-03-11 19:15:22 -0700341 .en_mask = BIT(0),
Tianyi Gou389ba432012-10-01 13:58:38 -0700342 .status_reg = (void __iomem *)GPLL0_STATUS_REG,
343 .status_mask = BIT(17),
Tianyi Gou27df1bb2012-10-11 14:44:01 -0700344 .soft_vote = &soft_vote_gpll0,
345 .soft_vote_mask = PLL_SOFT_VOTE_PRIMARY,
Tianyi Gou389ba432012-10-01 13:58:38 -0700346 .base = &virt_bases[GCC_BASE],
347 .c = {
Saravana Kannan7a6532e2012-10-18 20:51:13 -0700348 .parent = &cxo_clk_src.c,
Tianyi Gou389ba432012-10-01 13:58:38 -0700349 .rate = 600000000,
350 .dbg_name = "gpll0_clk_src",
Tianyi Gou27df1bb2012-10-11 14:44:01 -0700351 .ops = &clk_ops_pll_acpu_vote,
Tianyi Gou389ba432012-10-01 13:58:38 -0700352 CLK_INIT(gpll0_clk_src.c),
353 },
354};
355
Tianyi Gou27df1bb2012-10-11 14:44:01 -0700356static struct pll_vote_clk gpll0_activeonly_clk_src = {
357 .en_reg = (void __iomem *)APCS_GPLL_ENA_VOTE_REG,
Tianyi Gou2aee4652013-03-11 19:15:22 -0700358 .en_mask = BIT(0),
Tianyi Gou27df1bb2012-10-11 14:44:01 -0700359 .status_reg = (void __iomem *)GPLL0_STATUS_REG,
360 .status_mask = BIT(17),
361 .soft_vote = &soft_vote_gpll0,
362 .soft_vote_mask = PLL_SOFT_VOTE_ACPU,
363 .base = &virt_bases[GCC_BASE],
364 .c = {
365 .rate = 600000000,
366 .dbg_name = "gpll0_activeonly_clk_src",
367 .ops = &clk_ops_pll_acpu_vote,
368 CLK_INIT(gpll0_activeonly_clk_src.c),
369 },
370};
371
Tianyi Gou389ba432012-10-01 13:58:38 -0700372static struct pll_vote_clk gpll1_clk_src = {
373 .en_reg = (void __iomem *)APCS_GPLL_ENA_VOTE_REG,
374 .en_mask = BIT(1),
375 .status_reg = (void __iomem *)GPLL1_STATUS_REG,
376 .status_mask = BIT(17),
Tianyi Gou389ba432012-10-01 13:58:38 -0700377 .base = &virt_bases[GCC_BASE],
378 .c = {
Saravana Kannan7a6532e2012-10-18 20:51:13 -0700379 .parent = &cxo_clk_src.c,
Tianyi Gou389ba432012-10-01 13:58:38 -0700380 .rate = 480000000,
381 .dbg_name = "gpll1_clk_src",
382 .ops = &clk_ops_pll_vote,
383 CLK_INIT(gpll1_clk_src.c),
384 },
385};
386
Tianyi Goua717ddd2012-10-05 17:06:24 -0700387static struct pll_freq_tbl apcs_pll_freq[] = {
388 F_APCS_PLL(748800000, 0x27, 0x0, 0x1, 0x0, 0x0, 0x0),
389 F_APCS_PLL(998400000, 0x34, 0x0, 0x1, 0x0, 0x0, 0x0),
390 PLL_F_END
391};
392
Tianyi Gou389ba432012-10-01 13:58:38 -0700393/*
394 * Need to skip handoff of the acpu pll to avoid handoff code
395 * to turn off the pll when the acpu is running off this pll.
396 */
397static struct pll_clk apcspll_clk_src = {
398 .mode_reg = (void __iomem *)APCS_CPU_PLL_MODE_REG,
Tianyi Goua717ddd2012-10-05 17:06:24 -0700399 .l_reg = (void __iomem *)APCS_CPU_PLL_L_REG,
400 .m_reg = (void __iomem *)APCS_CPU_PLL_M_REG,
401 .n_reg = (void __iomem *)APCS_CPU_PLL_N_REG,
402 .config_reg = (void __iomem *)APCS_CPU_PLL_USER_CTL_REG,
Tianyi Gou389ba432012-10-01 13:58:38 -0700403 .status_reg = (void __iomem *)APCS_CPU_PLL_STATUS_REG,
Tianyi Goua717ddd2012-10-05 17:06:24 -0700404 .freq_tbl = apcs_pll_freq,
405 .masks = {
406 .vco_mask = BM(21, 20),
407 .pre_div_mask = BM(14, 12),
408 .post_div_mask = BM(9, 8),
409 .mn_en_mask = BIT(24),
410 .main_output_mask = BIT(0),
411 },
Tianyi Gou389ba432012-10-01 13:58:38 -0700412 .base = &virt_bases[APCS_PLL_BASE],
413 .c = {
Tianyi Gou389ba432012-10-01 13:58:38 -0700414 .dbg_name = "apcspll_clk_src",
415 .ops = &clk_ops_local_pll,
416 CLK_INIT(apcspll_clk_src.c),
417 .flags = CLKFLAG_SKIP_HANDOFF,
418 },
419};
420
421static DEFINE_CLK_VOTER(pnoc_msmbus_clk, &pnoc_clk.c, LONG_MAX);
422static DEFINE_CLK_VOTER(snoc_msmbus_clk, &snoc_clk.c, LONG_MAX);
423static DEFINE_CLK_VOTER(cnoc_msmbus_clk, &cnoc_clk.c, LONG_MAX);
424static DEFINE_CLK_VOTER(pnoc_msmbus_a_clk, &pnoc_a_clk.c, LONG_MAX);
425static DEFINE_CLK_VOTER(snoc_msmbus_a_clk, &snoc_a_clk.c, LONG_MAX);
426static DEFINE_CLK_VOTER(cnoc_msmbus_a_clk, &cnoc_a_clk.c, LONG_MAX);
427
428static DEFINE_CLK_VOTER(bimc_msmbus_clk, &bimc_clk.c, LONG_MAX);
429static DEFINE_CLK_VOTER(bimc_msmbus_a_clk, &bimc_a_clk.c, LONG_MAX);
430
431static DEFINE_CLK_VOTER(pnoc_sdcc2_clk, &pnoc_clk.c, LONG_MAX);
432static DEFINE_CLK_VOTER(pnoc_sdcc3_clk, &pnoc_clk.c, LONG_MAX);
433
434static DEFINE_CLK_VOTER(pnoc_sps_clk, &pnoc_clk.c, LONG_MAX);
435
436static struct clk_freq_tbl ftbl_gcc_ipa_clk[] = {
437 F( 50000000, gpll0, 12, 0, 0),
438 F( 92310000, gpll0, 6.5, 0, 0),
439 F(100000000, gpll0, 6, 0, 0),
440 F_END
441};
442
443static struct rcg_clk ipa_clk_src = {
444 .cmd_rcgr_reg = IPA_CMD_RCGR,
445 .set_rate = set_rate_mnd,
446 .freq_tbl = ftbl_gcc_ipa_clk,
447 .current_freq = &rcg_dummy_freq,
448 .base = &virt_bases[GCC_BASE],
449 .c = {
450 .dbg_name = "ipa_clk_src",
451 .ops = &clk_ops_rcg_mnd,
452 VDD_DIG_FMAX_MAP2(LOW, 50000000, NOMINAL, 100000000),
453 CLK_INIT(ipa_clk_src.c)
454 },
455};
456
Tianyi Goub1d13972013-01-23 22:55:22 -0800457static struct clk_freq_tbl ftbl_gcc_blsp1_qup1_6_i2c_apps_clk[] = {
458 F(19200000, cxo, 1, 0, 0),
459 F(50000000, gpll0, 12, 0, 0),
460 F_END
461};
462
463static struct rcg_clk blsp1_qup1_i2c_apps_clk_src = {
464 .cmd_rcgr_reg = BLSP1_QUP1_I2C_APPS_CMD_RCGR,
465 .set_rate = set_rate_hid,
466 .freq_tbl = ftbl_gcc_blsp1_qup1_6_i2c_apps_clk,
467 .current_freq = &rcg_dummy_freq,
468 .base = &virt_bases[GCC_BASE],
469 .c = {
470 .dbg_name = "blsp1_qup1_i2c_apps_clk_src",
471 .ops = &clk_ops_rcg,
472 VDD_DIG_FMAX_MAP1(LOW, 50000000),
473 CLK_INIT(blsp1_qup1_i2c_apps_clk_src.c),
474 },
475};
476
477static struct rcg_clk blsp1_qup2_i2c_apps_clk_src = {
478 .cmd_rcgr_reg = BLSP1_QUP2_I2C_APPS_CMD_RCGR,
479 .set_rate = set_rate_hid,
480 .freq_tbl = ftbl_gcc_blsp1_qup1_6_i2c_apps_clk,
481 .current_freq = &rcg_dummy_freq,
482 .base = &virt_bases[GCC_BASE],
483 .c = {
484 .dbg_name = "blsp1_qup2_i2c_apps_clk_src",
485 .ops = &clk_ops_rcg,
486 VDD_DIG_FMAX_MAP1(LOW, 50000000),
487 CLK_INIT(blsp1_qup2_i2c_apps_clk_src.c),
488 },
489};
490
491static struct rcg_clk blsp1_qup3_i2c_apps_clk_src = {
492 .cmd_rcgr_reg = BLSP1_QUP3_I2C_APPS_CMD_RCGR,
493 .set_rate = set_rate_hid,
494 .freq_tbl = ftbl_gcc_blsp1_qup1_6_i2c_apps_clk,
495 .current_freq = &rcg_dummy_freq,
496 .base = &virt_bases[GCC_BASE],
497 .c = {
498 .dbg_name = "blsp1_qup3_i2c_apps_clk_src",
499 .ops = &clk_ops_rcg,
500 VDD_DIG_FMAX_MAP1(LOW, 50000000),
501 CLK_INIT(blsp1_qup3_i2c_apps_clk_src.c),
502 },
503};
504
505static struct rcg_clk blsp1_qup4_i2c_apps_clk_src = {
506 .cmd_rcgr_reg = BLSP1_QUP4_I2C_APPS_CMD_RCGR,
507 .set_rate = set_rate_hid,
508 .freq_tbl = ftbl_gcc_blsp1_qup1_6_i2c_apps_clk,
509 .current_freq = &rcg_dummy_freq,
510 .base = &virt_bases[GCC_BASE],
511 .c = {
512 .dbg_name = "blsp1_qup4_i2c_apps_clk_src",
513 .ops = &clk_ops_rcg,
514 VDD_DIG_FMAX_MAP1(LOW, 50000000),
515 CLK_INIT(blsp1_qup4_i2c_apps_clk_src.c),
516 },
517};
518
519static struct rcg_clk blsp1_qup5_i2c_apps_clk_src = {
520 .cmd_rcgr_reg = BLSP1_QUP5_I2C_APPS_CMD_RCGR,
521 .set_rate = set_rate_hid,
522 .freq_tbl = ftbl_gcc_blsp1_qup1_6_i2c_apps_clk,
523 .current_freq = &rcg_dummy_freq,
524 .base = &virt_bases[GCC_BASE],
525 .c = {
526 .dbg_name = "blsp1_qup5_i2c_apps_clk_src",
527 .ops = &clk_ops_rcg,
528 VDD_DIG_FMAX_MAP1(LOW, 50000000),
529 CLK_INIT(blsp1_qup5_i2c_apps_clk_src.c),
530 },
531};
532
533static struct rcg_clk blsp1_qup6_i2c_apps_clk_src = {
534 .cmd_rcgr_reg = BLSP1_QUP6_I2C_APPS_CMD_RCGR,
535 .set_rate = set_rate_hid,
536 .freq_tbl = ftbl_gcc_blsp1_qup1_6_i2c_apps_clk,
537 .current_freq = &rcg_dummy_freq,
538 .base = &virt_bases[GCC_BASE],
539 .c = {
540 .dbg_name = "blsp1_qup6_i2c_apps_clk_src",
541 .ops = &clk_ops_rcg,
542 VDD_DIG_FMAX_MAP1(LOW, 50000000),
543 CLK_INIT(blsp1_qup6_i2c_apps_clk_src.c),
544 },
545};
546
Tianyi Gou389ba432012-10-01 13:58:38 -0700547static struct clk_freq_tbl ftbl_gcc_blsp1_qup1_6_spi_apps_clk[] = {
548 F( 960000, cxo, 10, 1, 2),
549 F( 4800000, cxo, 4, 0, 0),
550 F( 9600000, cxo, 2, 0, 0),
551 F(15000000, gpll0, 10, 1, 4),
552 F(19200000, cxo, 1, 0, 0),
553 F(25000000, gpll0, 12, 1, 2),
554 F(50000000, gpll0, 12, 0, 0),
555 F_END
556};
557
558static struct rcg_clk blsp1_qup1_spi_apps_clk_src = {
559 .cmd_rcgr_reg = BLSP1_QUP1_SPI_APPS_CMD_RCGR,
560 .set_rate = set_rate_mnd,
561 .freq_tbl = ftbl_gcc_blsp1_qup1_6_spi_apps_clk,
562 .current_freq = &rcg_dummy_freq,
563 .base = &virt_bases[GCC_BASE],
564 .c = {
565 .dbg_name = "blsp1_qup1_spi_apps_clk_src",
566 .ops = &clk_ops_rcg_mnd,
567 VDD_DIG_FMAX_MAP2(LOW, 25000000, NOMINAL, 50000000),
568 CLK_INIT(blsp1_qup1_spi_apps_clk_src.c)
569 },
570};
571
572static struct rcg_clk blsp1_qup2_spi_apps_clk_src = {
573 .cmd_rcgr_reg = BLSP1_QUP2_SPI_APPS_CMD_RCGR,
574 .set_rate = set_rate_mnd,
575 .freq_tbl = ftbl_gcc_blsp1_qup1_6_spi_apps_clk,
576 .current_freq = &rcg_dummy_freq,
577 .base = &virt_bases[GCC_BASE],
578 .c = {
579 .dbg_name = "blsp1_qup2_spi_apps_clk_src",
580 .ops = &clk_ops_rcg_mnd,
581 VDD_DIG_FMAX_MAP2(LOW, 25000000, NOMINAL, 50000000),
582 CLK_INIT(blsp1_qup2_spi_apps_clk_src.c)
583 },
584};
585
586static struct rcg_clk blsp1_qup3_spi_apps_clk_src = {
587 .cmd_rcgr_reg = BLSP1_QUP3_SPI_APPS_CMD_RCGR,
588 .set_rate = set_rate_mnd,
589 .freq_tbl = ftbl_gcc_blsp1_qup1_6_spi_apps_clk,
590 .current_freq = &rcg_dummy_freq,
591 .base = &virt_bases[GCC_BASE],
592 .c = {
593 .dbg_name = "blsp1_qup3_spi_apps_clk_src",
594 .ops = &clk_ops_rcg_mnd,
595 VDD_DIG_FMAX_MAP2(LOW, 25000000, NOMINAL, 50000000),
596 CLK_INIT(blsp1_qup3_spi_apps_clk_src.c)
597 },
598};
599
600static struct rcg_clk blsp1_qup4_spi_apps_clk_src = {
601 .cmd_rcgr_reg = BLSP1_QUP4_SPI_APPS_CMD_RCGR,
602 .set_rate = set_rate_mnd,
603 .freq_tbl = ftbl_gcc_blsp1_qup1_6_spi_apps_clk,
604 .current_freq = &rcg_dummy_freq,
605 .base = &virt_bases[GCC_BASE],
606 .c = {
607 .dbg_name = "blsp1_qup4_spi_apps_clk_src",
608 .ops = &clk_ops_rcg_mnd,
609 VDD_DIG_FMAX_MAP2(LOW, 25000000, NOMINAL, 50000000),
610 CLK_INIT(blsp1_qup4_spi_apps_clk_src.c)
611 },
612};
613
614static struct rcg_clk blsp1_qup5_spi_apps_clk_src = {
615 .cmd_rcgr_reg = BLSP1_QUP5_SPI_APPS_CMD_RCGR,
616 .set_rate = set_rate_mnd,
617 .freq_tbl = ftbl_gcc_blsp1_qup1_6_spi_apps_clk,
618 .current_freq = &rcg_dummy_freq,
619 .base = &virt_bases[GCC_BASE],
620 .c = {
621 .dbg_name = "blsp1_qup5_spi_apps_clk_src",
622 .ops = &clk_ops_rcg_mnd,
623 VDD_DIG_FMAX_MAP2(LOW, 25000000, NOMINAL, 50000000),
624 CLK_INIT(blsp1_qup5_spi_apps_clk_src.c)
625 },
626};
627
628static struct rcg_clk blsp1_qup6_spi_apps_clk_src = {
629 .cmd_rcgr_reg = BLSP1_QUP6_SPI_APPS_CMD_RCGR,
630 .set_rate = set_rate_mnd,
631 .freq_tbl = ftbl_gcc_blsp1_qup1_6_spi_apps_clk,
632 .current_freq = &rcg_dummy_freq,
633 .base = &virt_bases[GCC_BASE],
634 .c = {
635 .dbg_name = "blsp1_qup6_spi_apps_clk_src",
636 .ops = &clk_ops_rcg_mnd,
637 VDD_DIG_FMAX_MAP2(LOW, 25000000, NOMINAL, 50000000),
638 CLK_INIT(blsp1_qup6_spi_apps_clk_src.c)
639 },
640};
641
642static struct clk_freq_tbl ftbl_gcc_blsp1_uart1_6_apps_clk[] = {
Vikram Mulukutlad3dca652012-11-19 11:04:13 -0800643 F_GCC_GND,
Tianyi Gou389ba432012-10-01 13:58:38 -0700644 F( 3686400, gpll0, 1, 96, 15625),
645 F( 7372800, gpll0, 1, 192, 15625),
646 F(14745600, gpll0, 1, 384, 15625),
647 F(16000000, gpll0, 5, 2, 15),
648 F(19200000, cxo, 1, 0, 0),
649 F(24000000, gpll0, 5, 1, 5),
650 F(32000000, gpll0, 1, 4, 75),
651 F(40000000, gpll0, 15, 0, 0),
652 F(46400000, gpll0, 1, 29, 375),
653 F(48000000, gpll0, 12.5, 0, 0),
654 F(51200000, gpll0, 1, 32, 375),
655 F(56000000, gpll0, 1, 7, 75),
656 F(58982400, gpll0, 1, 1536, 15625),
657 F(60000000, gpll0, 10, 0, 0),
658 F_END
659};
660
661static struct rcg_clk blsp1_uart1_apps_clk_src = {
662 .cmd_rcgr_reg = BLSP1_UART1_APPS_CMD_RCGR,
663 .set_rate = set_rate_mnd,
664 .freq_tbl = ftbl_gcc_blsp1_uart1_6_apps_clk,
665 .current_freq = &rcg_dummy_freq,
666 .base = &virt_bases[GCC_BASE],
667 .c = {
668 .dbg_name = "blsp1_uart1_apps_clk_src",
669 .ops = &clk_ops_rcg_mnd,
670 VDD_DIG_FMAX_MAP2(LOW, 31580000, NOMINAL, 63160000),
671 CLK_INIT(blsp1_uart1_apps_clk_src.c)
672 },
673};
674
675static struct rcg_clk blsp1_uart2_apps_clk_src = {
676 .cmd_rcgr_reg = BLSP1_UART2_APPS_CMD_RCGR,
677 .set_rate = set_rate_mnd,
678 .freq_tbl = ftbl_gcc_blsp1_uart1_6_apps_clk,
679 .current_freq = &rcg_dummy_freq,
680 .base = &virt_bases[GCC_BASE],
681 .c = {
682 .dbg_name = "blsp1_uart2_apps_clk_src",
683 .ops = &clk_ops_rcg_mnd,
684 VDD_DIG_FMAX_MAP2(LOW, 31580000, NOMINAL, 63160000),
685 CLK_INIT(blsp1_uart2_apps_clk_src.c)
686 },
687};
688
689static struct rcg_clk blsp1_uart3_apps_clk_src = {
690 .cmd_rcgr_reg = BLSP1_UART3_APPS_CMD_RCGR,
691 .set_rate = set_rate_mnd,
692 .freq_tbl = ftbl_gcc_blsp1_uart1_6_apps_clk,
693 .current_freq = &rcg_dummy_freq,
694 .base = &virt_bases[GCC_BASE],
695 .c = {
696 .dbg_name = "blsp1_uart3_apps_clk_src",
697 .ops = &clk_ops_rcg_mnd,
698 VDD_DIG_FMAX_MAP2(LOW, 31580000, NOMINAL, 63160000),
699 CLK_INIT(blsp1_uart3_apps_clk_src.c)
700 },
701};
702
703static struct rcg_clk blsp1_uart4_apps_clk_src = {
704 .cmd_rcgr_reg = BLSP1_UART4_APPS_CMD_RCGR,
705 .set_rate = set_rate_mnd,
706 .freq_tbl = ftbl_gcc_blsp1_uart1_6_apps_clk,
707 .current_freq = &rcg_dummy_freq,
708 .base = &virt_bases[GCC_BASE],
709 .c = {
710 .dbg_name = "blsp1_uart4_apps_clk_src",
711 .ops = &clk_ops_rcg_mnd,
712 VDD_DIG_FMAX_MAP2(LOW, 31580000, NOMINAL, 63160000),
713 CLK_INIT(blsp1_uart4_apps_clk_src.c)
714 },
715};
716
717static struct rcg_clk blsp1_uart5_apps_clk_src = {
718 .cmd_rcgr_reg = BLSP1_UART5_APPS_CMD_RCGR,
719 .set_rate = set_rate_mnd,
720 .freq_tbl = ftbl_gcc_blsp1_uart1_6_apps_clk,
721 .current_freq = &rcg_dummy_freq,
722 .base = &virt_bases[GCC_BASE],
723 .c = {
724 .dbg_name = "blsp1_uart5_apps_clk_src",
725 .ops = &clk_ops_rcg_mnd,
726 VDD_DIG_FMAX_MAP2(LOW, 31580000, NOMINAL, 63160000),
727 CLK_INIT(blsp1_uart5_apps_clk_src.c)
728 },
729};
730
731static struct rcg_clk blsp1_uart6_apps_clk_src = {
732 .cmd_rcgr_reg = BLSP1_UART6_APPS_CMD_RCGR,
733 .set_rate = set_rate_mnd,
734 .freq_tbl = ftbl_gcc_blsp1_uart1_6_apps_clk,
735 .current_freq = &rcg_dummy_freq,
736 .base = &virt_bases[GCC_BASE],
737 .c = {
738 .dbg_name = "blsp1_uart6_apps_clk_src",
739 .ops = &clk_ops_rcg_mnd,
740 VDD_DIG_FMAX_MAP2(LOW, 31580000, NOMINAL, 63160000),
741 CLK_INIT(blsp1_uart6_apps_clk_src.c)
742 },
743};
744
745static struct clk_freq_tbl ftbl_gcc_ce1_clk[] = {
746 F( 50000000, gpll0, 12, 0, 0),
747 F(100000000, gpll0, 6, 0, 0),
748 F_END
749};
750
751static struct rcg_clk ce1_clk_src = {
752 .cmd_rcgr_reg = CE1_CMD_RCGR,
753 .set_rate = set_rate_hid,
754 .freq_tbl = ftbl_gcc_ce1_clk,
755 .current_freq = &rcg_dummy_freq,
756 .base = &virt_bases[GCC_BASE],
757 .c = {
758 .dbg_name = "ce1_clk_src",
759 .ops = &clk_ops_rcg,
760 VDD_DIG_FMAX_MAP2(LOW, 50000000, NOMINAL, 100000000),
761 CLK_INIT(ce1_clk_src.c),
762 },
763};
764
765static struct clk_freq_tbl ftbl_gcc_gp_clk[] = {
766 F(19200000, cxo, 1, 0, 0),
767 F_END
768};
769
770static struct rcg_clk gp1_clk_src = {
771 .cmd_rcgr_reg = GP1_CMD_RCGR,
772 .set_rate = set_rate_mnd,
773 .freq_tbl = ftbl_gcc_gp_clk,
774 .current_freq = &rcg_dummy_freq,
775 .base = &virt_bases[GCC_BASE],
776 .c = {
777 .dbg_name = "gp1_clk_src",
778 .ops = &clk_ops_rcg_mnd,
779 VDD_DIG_FMAX_MAP2(LOW, 100000000, NOMINAL, 200000000),
780 CLK_INIT(gp1_clk_src.c)
781 },
782};
783
784static struct rcg_clk gp2_clk_src = {
785 .cmd_rcgr_reg = GP2_CMD_RCGR,
786 .set_rate = set_rate_mnd,
787 .freq_tbl = ftbl_gcc_gp_clk,
788 .current_freq = &rcg_dummy_freq,
789 .base = &virt_bases[GCC_BASE],
790 .c = {
791 .dbg_name = "gp2_clk_src",
792 .ops = &clk_ops_rcg_mnd,
793 VDD_DIG_FMAX_MAP2(LOW, 100000000, NOMINAL, 200000000),
794 CLK_INIT(gp2_clk_src.c)
795 },
796};
797
798static struct rcg_clk gp3_clk_src = {
799 .cmd_rcgr_reg = GP3_CMD_RCGR,
800 .set_rate = set_rate_mnd,
801 .freq_tbl = ftbl_gcc_gp_clk,
802 .current_freq = &rcg_dummy_freq,
803 .base = &virt_bases[GCC_BASE],
804 .c = {
805 .dbg_name = "gp3_clk_src",
806 .ops = &clk_ops_rcg_mnd,
807 VDD_DIG_FMAX_MAP2(LOW, 100000000, NOMINAL, 200000000),
808 CLK_INIT(gp3_clk_src.c)
809 },
810};
811
812static struct clk_freq_tbl ftbl_gcc_pdm2_clk[] = {
813 F(60000000, gpll0, 10, 0, 0),
814 F_END
815};
816
817static struct rcg_clk pdm2_clk_src = {
818 .cmd_rcgr_reg = PDM2_CMD_RCGR,
819 .set_rate = set_rate_hid,
820 .freq_tbl = ftbl_gcc_pdm2_clk,
821 .current_freq = &rcg_dummy_freq,
822 .base = &virt_bases[GCC_BASE],
823 .c = {
824 .dbg_name = "pdm2_clk_src",
825 .ops = &clk_ops_rcg,
826 VDD_DIG_FMAX_MAP1(LOW, 60000000),
827 CLK_INIT(pdm2_clk_src.c),
828 },
829};
830
831static struct clk_freq_tbl ftbl_gcc_qpic_clk[] = {
832 F( 50000000, gpll0, 12, 0, 0),
833 F(100000000, gpll0, 6, 0, 0),
834 F_END
835};
836
837static struct rcg_clk qpic_clk_src = {
838 .cmd_rcgr_reg = QPIC_CMD_RCGR,
839 .set_rate = set_rate_mnd,
840 .freq_tbl = ftbl_gcc_qpic_clk,
841 .current_freq = &rcg_dummy_freq,
842 .base = &virt_bases[GCC_BASE],
843 .c = {
844 .dbg_name = "qpic_clk_src",
845 .ops = &clk_ops_rcg_mnd,
846 VDD_DIG_FMAX_MAP2(LOW, 50000000, NOMINAL, 100000000),
847 CLK_INIT(qpic_clk_src.c)
848 },
849};
850
851static struct clk_freq_tbl ftbl_gcc_sdcc2_apps_clk[] = {
852 F( 144000, cxo, 16, 3, 25),
853 F( 400000, cxo, 12, 1, 4),
854 F( 20000000, gpll0, 15, 1, 2),
855 F( 25000000, gpll0, 12, 1, 2),
856 F( 50000000, gpll0, 12, 0, 0),
857 F(100000000, gpll0, 6, 0, 0),
858 F(200000000, gpll0, 3, 0, 0),
859 F_END
860};
861
862static struct clk_freq_tbl ftbl_gcc_sdcc3_apps_clk[] = {
863 F( 144000, cxo, 16, 3, 25),
864 F( 400000, cxo, 12, 1, 4),
865 F( 20000000, gpll0, 15, 1, 2),
866 F( 25000000, gpll0, 12, 1, 2),
867 F( 50000000, gpll0, 12, 0, 0),
868 F(100000000, gpll0, 6, 0, 0),
869 F_END
870};
871
872static struct rcg_clk sdcc2_apps_clk_src = {
873 .cmd_rcgr_reg = SDCC2_APPS_CMD_RCGR,
874 .set_rate = set_rate_mnd,
875 .freq_tbl = ftbl_gcc_sdcc2_apps_clk,
876 .current_freq = &rcg_dummy_freq,
877 .base = &virt_bases[GCC_BASE],
878 .c = {
879 .dbg_name = "sdcc2_apps_clk_src",
880 .ops = &clk_ops_rcg_mnd,
881 VDD_DIG_FMAX_MAP2(LOW, 100000000, NOMINAL, 200000000),
882 CLK_INIT(sdcc2_apps_clk_src.c)
883 },
884};
885
886static struct rcg_clk sdcc3_apps_clk_src = {
887 .cmd_rcgr_reg = SDCC3_APPS_CMD_RCGR,
888 .set_rate = set_rate_mnd,
889 .freq_tbl = ftbl_gcc_sdcc3_apps_clk,
890 .current_freq = &rcg_dummy_freq,
891 .base = &virt_bases[GCC_BASE],
892 .c = {
893 .dbg_name = "sdcc3_apps_clk_src",
894 .ops = &clk_ops_rcg_mnd,
895 VDD_DIG_FMAX_MAP2(LOW, 50000000, NOMINAL, 100000000),
896 CLK_INIT(sdcc3_apps_clk_src.c)
897 },
898};
899
900static struct clk_freq_tbl ftbl_gcc_usb_hs_system_clk[] = {
901 F(75000000, gpll0, 8, 0, 0),
902 F_END
903};
904
905static struct rcg_clk usb_hs_system_clk_src = {
906 .cmd_rcgr_reg = USB_HS_SYSTEM_CMD_RCGR,
907 .set_rate = set_rate_hid,
908 .freq_tbl = ftbl_gcc_usb_hs_system_clk,
909 .current_freq = &rcg_dummy_freq,
910 .base = &virt_bases[GCC_BASE],
911 .c = {
912 .dbg_name = "usb_hs_system_clk_src",
913 .ops = &clk_ops_rcg,
914 VDD_DIG_FMAX_MAP2(LOW, 37500000, NOMINAL, 75000000),
915 CLK_INIT(usb_hs_system_clk_src.c),
916 },
917};
918
919static struct clk_freq_tbl ftbl_gcc_usb_hsic_clk[] = {
920 F_HSIC(480000000, gpll1, 1, 0, 0),
921 F_END
922};
923
924static struct rcg_clk usb_hsic_clk_src = {
925 .cmd_rcgr_reg = USB_HSIC_CMD_RCGR,
926 .set_rate = set_rate_hid,
927 .freq_tbl = ftbl_gcc_usb_hsic_clk,
928 .current_freq = &rcg_dummy_freq,
929 .base = &virt_bases[GCC_BASE],
930 .c = {
931 .dbg_name = "usb_hsic_clk_src",
932 .ops = &clk_ops_rcg,
933 VDD_DIG_FMAX_MAP1(LOW, 480000000),
934 CLK_INIT(usb_hsic_clk_src.c),
935 },
936};
937
938static struct clk_freq_tbl ftbl_gcc_usb_hsic_io_cal_clk[] = {
939 F(9600000, cxo, 2, 0, 0),
940 F_END
941};
942
943static struct rcg_clk usb_hsic_io_cal_clk_src = {
944 .cmd_rcgr_reg = USB_HSIC_IO_CAL_CMD_RCGR,
945 .set_rate = set_rate_hid,
946 .freq_tbl = ftbl_gcc_usb_hsic_io_cal_clk,
947 .current_freq = &rcg_dummy_freq,
948 .base = &virt_bases[GCC_BASE],
949 .c = {
950 .dbg_name = "usb_hsic_io_cal_clk_src",
951 .ops = &clk_ops_rcg,
952 VDD_DIG_FMAX_MAP1(LOW, 9600000),
953 CLK_INIT(usb_hsic_io_cal_clk_src.c),
954 },
955};
956
957static struct clk_freq_tbl ftbl_gcc_usb_hsic_system_clk[] = {
958 F(75000000, gpll0, 8, 0, 0),
959 F_END
960};
961
962static struct rcg_clk usb_hsic_system_clk_src = {
963 .cmd_rcgr_reg = USB_HSIC_SYSTEM_CMD_RCGR,
964 .set_rate = set_rate_hid,
965 .freq_tbl = ftbl_gcc_usb_hsic_system_clk,
966 .current_freq = &rcg_dummy_freq,
967 .base = &virt_bases[GCC_BASE],
968 .c = {
969 .dbg_name = "usb_hsic_system_clk_src",
970 .ops = &clk_ops_rcg,
971 VDD_DIG_FMAX_MAP2(LOW, 60000000, NOMINAL, 75000000),
972 CLK_INIT(usb_hsic_system_clk_src.c),
973 },
974};
975
976static struct clk_freq_tbl ftbl_gcc_usb_hsic_xcvr_fs_clk[] = {
977 F(60000000, gpll0, 10, 0, 0),
978 F_END
979};
980
981static struct rcg_clk usb_hsic_xcvr_fs_clk_src = {
982 .cmd_rcgr_reg = USB_HSIC_XCVR_FS_CMD_RCGR,
983 .set_rate = set_rate_hid,
984 .freq_tbl = ftbl_gcc_usb_hsic_xcvr_fs_clk,
985 .current_freq = &rcg_dummy_freq,
986 .base = &virt_bases[GCC_BASE],
987 .c = {
988 .dbg_name = "usb_hsic_xcvr_fs_clk_src",
989 .ops = &clk_ops_rcg,
990 VDD_DIG_FMAX_MAP1(LOW, 60000000),
991 CLK_INIT(usb_hsic_xcvr_fs_clk_src.c),
992 },
993};
994
995static struct local_vote_clk gcc_bam_dma_ahb_clk = {
996 .cbcr_reg = BAM_DMA_AHB_CBCR,
997 .vote_reg = APCS_CLOCK_BRANCH_ENA_VOTE,
998 .en_mask = BIT(12),
999 .base = &virt_bases[GCC_BASE],
1000 .c = {
1001 .dbg_name = "gcc_bam_dma_ahb_clk",
1002 .ops = &clk_ops_vote,
1003 CLK_INIT(gcc_bam_dma_ahb_clk.c),
1004 },
1005};
1006
Tianyi Gou55b805b2013-02-28 21:46:03 -08001007static struct local_vote_clk gcc_bam_dma_inactivity_timers_clk = {
1008 .cbcr_reg = BAM_DMA_INACTIVITY_TIMERS_CBCR,
1009 .vote_reg = APCS_CLOCK_BRANCH_ENA_VOTE,
1010 .en_mask = BIT(11),
1011 .base = &virt_bases[GCC_BASE],
1012 .c = {
1013 .dbg_name = "gcc_bam_dma_inactivity_timers_clk",
1014 .ops = &clk_ops_vote,
1015 CLK_INIT(gcc_bam_dma_inactivity_timers_clk.c),
1016 },
1017};
1018
Tianyi Gou389ba432012-10-01 13:58:38 -07001019static struct local_vote_clk gcc_blsp1_ahb_clk = {
1020 .cbcr_reg = BLSP1_AHB_CBCR,
1021 .vote_reg = APCS_CLOCK_BRANCH_ENA_VOTE,
1022 .en_mask = BIT(17),
1023 .base = &virt_bases[GCC_BASE],
1024 .c = {
1025 .dbg_name = "gcc_blsp1_ahb_clk",
1026 .ops = &clk_ops_vote,
1027 CLK_INIT(gcc_blsp1_ahb_clk.c),
1028 },
1029};
1030
1031static struct branch_clk gcc_blsp1_qup1_i2c_apps_clk = {
1032 .cbcr_reg = BLSP1_QUP1_I2C_APPS_CBCR,
Tianyi Gou389ba432012-10-01 13:58:38 -07001033 .base = &virt_bases[GCC_BASE],
1034 .c = {
Saravana Kannan7a6532e2012-10-18 20:51:13 -07001035 .parent = &cxo_clk_src.c,
Tianyi Gou389ba432012-10-01 13:58:38 -07001036 .dbg_name = "gcc_blsp1_qup1_i2c_apps_clk",
1037 .ops = &clk_ops_branch,
1038 CLK_INIT(gcc_blsp1_qup1_i2c_apps_clk.c),
1039 },
1040};
1041
1042static struct branch_clk gcc_blsp1_qup1_spi_apps_clk = {
1043 .cbcr_reg = BLSP1_QUP1_SPI_APPS_CBCR,
Tianyi Gou389ba432012-10-01 13:58:38 -07001044 .has_sibling = 0,
1045 .base = &virt_bases[GCC_BASE],
1046 .c = {
Saravana Kannan7a6532e2012-10-18 20:51:13 -07001047 .parent = &blsp1_qup1_spi_apps_clk_src.c,
Tianyi Gou389ba432012-10-01 13:58:38 -07001048 .dbg_name = "gcc_blsp1_qup1_spi_apps_clk",
1049 .ops = &clk_ops_branch,
1050 CLK_INIT(gcc_blsp1_qup1_spi_apps_clk.c),
1051 },
1052};
1053
1054static struct branch_clk gcc_blsp1_qup2_i2c_apps_clk = {
1055 .cbcr_reg = BLSP1_QUP2_I2C_APPS_CBCR,
Tianyi Gou389ba432012-10-01 13:58:38 -07001056 .base = &virt_bases[GCC_BASE],
1057 .c = {
Saravana Kannan7a6532e2012-10-18 20:51:13 -07001058 .parent = &cxo_clk_src.c,
Tianyi Gou389ba432012-10-01 13:58:38 -07001059 .dbg_name = "gcc_blsp1_qup2_i2c_apps_clk",
1060 .ops = &clk_ops_branch,
1061 CLK_INIT(gcc_blsp1_qup2_i2c_apps_clk.c),
1062 },
1063};
1064
1065static struct branch_clk gcc_blsp1_qup2_spi_apps_clk = {
1066 .cbcr_reg = BLSP1_QUP2_SPI_APPS_CBCR,
Tianyi Gou389ba432012-10-01 13:58:38 -07001067 .has_sibling = 0,
1068 .base = &virt_bases[GCC_BASE],
1069 .c = {
Saravana Kannan7a6532e2012-10-18 20:51:13 -07001070 .parent = &blsp1_qup2_spi_apps_clk_src.c,
Tianyi Gou389ba432012-10-01 13:58:38 -07001071 .dbg_name = "gcc_blsp1_qup2_spi_apps_clk",
1072 .ops = &clk_ops_branch,
1073 CLK_INIT(gcc_blsp1_qup2_spi_apps_clk.c),
1074 },
1075};
1076
1077static struct branch_clk gcc_blsp1_qup3_i2c_apps_clk = {
1078 .cbcr_reg = BLSP1_QUP3_I2C_APPS_CBCR,
Tianyi Gou389ba432012-10-01 13:58:38 -07001079 .base = &virt_bases[GCC_BASE],
1080 .c = {
Saravana Kannan7a6532e2012-10-18 20:51:13 -07001081 .parent = &cxo_clk_src.c,
Tianyi Gou389ba432012-10-01 13:58:38 -07001082 .dbg_name = "gcc_blsp1_qup3_i2c_apps_clk",
1083 .ops = &clk_ops_branch,
1084 CLK_INIT(gcc_blsp1_qup3_i2c_apps_clk.c),
1085 },
1086};
1087
1088static struct branch_clk gcc_blsp1_qup3_spi_apps_clk = {
1089 .cbcr_reg = BLSP1_QUP3_SPI_APPS_CBCR,
Tianyi Gou389ba432012-10-01 13:58:38 -07001090 .has_sibling = 0,
1091 .base = &virt_bases[GCC_BASE],
1092 .c = {
Saravana Kannan7a6532e2012-10-18 20:51:13 -07001093 .parent = &blsp1_qup3_spi_apps_clk_src.c,
Tianyi Gou389ba432012-10-01 13:58:38 -07001094 .dbg_name = "gcc_blsp1_qup3_spi_apps_clk",
1095 .ops = &clk_ops_branch,
1096 CLK_INIT(gcc_blsp1_qup3_spi_apps_clk.c),
1097 },
1098};
1099
1100static struct branch_clk gcc_blsp1_qup4_i2c_apps_clk = {
1101 .cbcr_reg = BLSP1_QUP4_I2C_APPS_CBCR,
Tianyi Gou389ba432012-10-01 13:58:38 -07001102 .base = &virt_bases[GCC_BASE],
1103 .c = {
Saravana Kannan7a6532e2012-10-18 20:51:13 -07001104 .parent = &cxo_clk_src.c,
Tianyi Gou389ba432012-10-01 13:58:38 -07001105 .dbg_name = "gcc_blsp1_qup4_i2c_apps_clk",
1106 .ops = &clk_ops_branch,
1107 CLK_INIT(gcc_blsp1_qup4_i2c_apps_clk.c),
1108 },
1109};
1110
1111static struct branch_clk gcc_blsp1_qup4_spi_apps_clk = {
1112 .cbcr_reg = BLSP1_QUP4_SPI_APPS_CBCR,
Tianyi Gou389ba432012-10-01 13:58:38 -07001113 .has_sibling = 0,
1114 .base = &virt_bases[GCC_BASE],
1115 .c = {
Saravana Kannan7a6532e2012-10-18 20:51:13 -07001116 .parent = &blsp1_qup4_spi_apps_clk_src.c,
Tianyi Gou389ba432012-10-01 13:58:38 -07001117 .dbg_name = "gcc_blsp1_qup4_spi_apps_clk",
1118 .ops = &clk_ops_branch,
1119 CLK_INIT(gcc_blsp1_qup4_spi_apps_clk.c),
1120 },
1121};
1122
1123static struct branch_clk gcc_blsp1_qup5_i2c_apps_clk = {
1124 .cbcr_reg = BLSP1_QUP5_I2C_APPS_CBCR,
Tianyi Gou389ba432012-10-01 13:58:38 -07001125 .base = &virt_bases[GCC_BASE],
1126 .c = {
Saravana Kannan7a6532e2012-10-18 20:51:13 -07001127 .parent = &cxo_clk_src.c,
Tianyi Gou389ba432012-10-01 13:58:38 -07001128 .dbg_name = "gcc_blsp1_qup5_i2c_apps_clk",
1129 .ops = &clk_ops_branch,
1130 CLK_INIT(gcc_blsp1_qup5_i2c_apps_clk.c),
1131 },
1132};
1133
1134static struct branch_clk gcc_blsp1_qup5_spi_apps_clk = {
1135 .cbcr_reg = BLSP1_QUP5_SPI_APPS_CBCR,
Tianyi Gou389ba432012-10-01 13:58:38 -07001136 .has_sibling = 0,
1137 .base = &virt_bases[GCC_BASE],
1138 .c = {
Saravana Kannan7a6532e2012-10-18 20:51:13 -07001139 .parent = &blsp1_qup5_spi_apps_clk_src.c,
Tianyi Gou389ba432012-10-01 13:58:38 -07001140 .dbg_name = "gcc_blsp1_qup5_spi_apps_clk",
1141 .ops = &clk_ops_branch,
1142 CLK_INIT(gcc_blsp1_qup5_spi_apps_clk.c),
1143 },
1144};
1145
1146static struct branch_clk gcc_blsp1_qup6_i2c_apps_clk = {
1147 .cbcr_reg = BLSP1_QUP6_I2C_APPS_CBCR,
Tianyi Gou389ba432012-10-01 13:58:38 -07001148 .base = &virt_bases[GCC_BASE],
1149 .c = {
Saravana Kannan7a6532e2012-10-18 20:51:13 -07001150 .parent = &cxo_clk_src.c,
Tianyi Gou389ba432012-10-01 13:58:38 -07001151 .dbg_name = "gcc_blsp1_qup6_i2c_apps_clk",
1152 .ops = &clk_ops_branch,
1153 CLK_INIT(gcc_blsp1_qup6_i2c_apps_clk.c),
1154 },
1155};
1156
1157static struct branch_clk gcc_blsp1_qup6_spi_apps_clk = {
1158 .cbcr_reg = BLSP1_QUP6_SPI_APPS_CBCR,
Tianyi Gou389ba432012-10-01 13:58:38 -07001159 .has_sibling = 0,
1160 .base = &virt_bases[GCC_BASE],
1161 .c = {
Saravana Kannan7a6532e2012-10-18 20:51:13 -07001162 .parent = &blsp1_qup6_spi_apps_clk_src.c,
Tianyi Gou389ba432012-10-01 13:58:38 -07001163 .dbg_name = "gcc_blsp1_qup6_spi_apps_clk",
1164 .ops = &clk_ops_branch,
1165 CLK_INIT(gcc_blsp1_qup6_spi_apps_clk.c),
1166 },
1167};
1168
1169static struct branch_clk gcc_blsp1_uart1_apps_clk = {
1170 .cbcr_reg = BLSP1_UART1_APPS_CBCR,
Tianyi Gou389ba432012-10-01 13:58:38 -07001171 .has_sibling = 0,
1172 .base = &virt_bases[GCC_BASE],
1173 .c = {
Saravana Kannan7a6532e2012-10-18 20:51:13 -07001174 .parent = &blsp1_uart1_apps_clk_src.c,
Tianyi Gou389ba432012-10-01 13:58:38 -07001175 .dbg_name = "gcc_blsp1_uart1_apps_clk",
1176 .ops = &clk_ops_branch,
1177 CLK_INIT(gcc_blsp1_uart1_apps_clk.c),
1178 },
1179};
1180
1181static struct branch_clk gcc_blsp1_uart2_apps_clk = {
1182 .cbcr_reg = BLSP1_UART2_APPS_CBCR,
Tianyi Gou389ba432012-10-01 13:58:38 -07001183 .has_sibling = 0,
1184 .base = &virt_bases[GCC_BASE],
1185 .c = {
Saravana Kannan7a6532e2012-10-18 20:51:13 -07001186 .parent = &blsp1_uart2_apps_clk_src.c,
Tianyi Gou389ba432012-10-01 13:58:38 -07001187 .dbg_name = "gcc_blsp1_uart2_apps_clk",
1188 .ops = &clk_ops_branch,
1189 CLK_INIT(gcc_blsp1_uart2_apps_clk.c),
1190 },
1191};
1192
1193static struct branch_clk gcc_blsp1_uart3_apps_clk = {
1194 .cbcr_reg = BLSP1_UART3_APPS_CBCR,
Tianyi Gou389ba432012-10-01 13:58:38 -07001195 .has_sibling = 0,
1196 .base = &virt_bases[GCC_BASE],
1197 .c = {
Saravana Kannan7a6532e2012-10-18 20:51:13 -07001198 .parent = &blsp1_uart3_apps_clk_src.c,
Tianyi Gou389ba432012-10-01 13:58:38 -07001199 .dbg_name = "gcc_blsp1_uart3_apps_clk",
1200 .ops = &clk_ops_branch,
1201 CLK_INIT(gcc_blsp1_uart3_apps_clk.c),
1202 },
1203};
1204
1205static struct branch_clk gcc_blsp1_uart4_apps_clk = {
1206 .cbcr_reg = BLSP1_UART4_APPS_CBCR,
Tianyi Gou389ba432012-10-01 13:58:38 -07001207 .has_sibling = 0,
1208 .base = &virt_bases[GCC_BASE],
1209 .c = {
Saravana Kannan7a6532e2012-10-18 20:51:13 -07001210 .parent = &blsp1_uart4_apps_clk_src.c,
Tianyi Gou389ba432012-10-01 13:58:38 -07001211 .dbg_name = "gcc_blsp1_uart4_apps_clk",
1212 .ops = &clk_ops_branch,
1213 CLK_INIT(gcc_blsp1_uart4_apps_clk.c),
1214 },
1215};
1216
1217static struct branch_clk gcc_blsp1_uart5_apps_clk = {
1218 .cbcr_reg = BLSP1_UART5_APPS_CBCR,
Tianyi Gou389ba432012-10-01 13:58:38 -07001219 .has_sibling = 0,
1220 .base = &virt_bases[GCC_BASE],
1221 .c = {
Saravana Kannan7a6532e2012-10-18 20:51:13 -07001222 .parent = &blsp1_uart5_apps_clk_src.c,
Tianyi Gou389ba432012-10-01 13:58:38 -07001223 .dbg_name = "gcc_blsp1_uart5_apps_clk",
1224 .ops = &clk_ops_branch,
1225 CLK_INIT(gcc_blsp1_uart5_apps_clk.c),
1226 },
1227};
1228
1229static struct branch_clk gcc_blsp1_uart6_apps_clk = {
1230 .cbcr_reg = BLSP1_UART6_APPS_CBCR,
Tianyi Gou389ba432012-10-01 13:58:38 -07001231 .has_sibling = 0,
1232 .base = &virt_bases[GCC_BASE],
1233 .c = {
Saravana Kannan7a6532e2012-10-18 20:51:13 -07001234 .parent = &blsp1_uart6_apps_clk_src.c,
Tianyi Gou389ba432012-10-01 13:58:38 -07001235 .dbg_name = "gcc_blsp1_uart6_apps_clk",
1236 .ops = &clk_ops_branch,
1237 CLK_INIT(gcc_blsp1_uart6_apps_clk.c),
1238 },
1239};
1240
1241static struct local_vote_clk gcc_boot_rom_ahb_clk = {
1242 .cbcr_reg = BOOT_ROM_AHB_CBCR,
1243 .vote_reg = APCS_CLOCK_BRANCH_ENA_VOTE,
1244 .en_mask = BIT(10),
1245 .base = &virt_bases[GCC_BASE],
1246 .c = {
1247 .dbg_name = "gcc_boot_rom_ahb_clk",
1248 .ops = &clk_ops_vote,
1249 CLK_INIT(gcc_boot_rom_ahb_clk.c),
1250 },
1251};
1252
1253static struct local_vote_clk gcc_ce1_ahb_clk = {
1254 .cbcr_reg = CE1_AHB_CBCR,
1255 .vote_reg = APCS_CLOCK_BRANCH_ENA_VOTE,
1256 .en_mask = BIT(3),
1257 .base = &virt_bases[GCC_BASE],
1258 .c = {
1259 .dbg_name = "gcc_ce1_ahb_clk",
1260 .ops = &clk_ops_vote,
1261 CLK_INIT(gcc_ce1_ahb_clk.c),
1262 },
1263};
1264
1265static struct local_vote_clk gcc_ce1_axi_clk = {
1266 .cbcr_reg = CE1_AXI_CBCR,
1267 .vote_reg = APCS_CLOCK_BRANCH_ENA_VOTE,
1268 .en_mask = BIT(4),
1269 .base = &virt_bases[GCC_BASE],
1270 .c = {
1271 .dbg_name = "gcc_ce1_axi_clk",
1272 .ops = &clk_ops_vote,
1273 CLK_INIT(gcc_ce1_axi_clk.c),
1274 },
1275};
1276
1277static struct local_vote_clk gcc_ce1_clk = {
1278 .cbcr_reg = CE1_CBCR,
1279 .vote_reg = APCS_CLOCK_BRANCH_ENA_VOTE,
1280 .en_mask = BIT(5),
1281 .base = &virt_bases[GCC_BASE],
1282 .c = {
1283 .dbg_name = "gcc_ce1_clk",
1284 .ops = &clk_ops_vote,
1285 CLK_INIT(gcc_ce1_clk.c),
1286 },
1287};
1288
1289static struct branch_clk gcc_gp1_clk = {
1290 .cbcr_reg = GP1_CBCR,
Tianyi Gou389ba432012-10-01 13:58:38 -07001291 .has_sibling = 0,
1292 .base = &virt_bases[GCC_BASE],
1293 .c = {
Saravana Kannan7a6532e2012-10-18 20:51:13 -07001294 .parent = &gp1_clk_src.c,
Tianyi Gou389ba432012-10-01 13:58:38 -07001295 .dbg_name = "gcc_gp1_clk",
1296 .ops = &clk_ops_branch,
1297 CLK_INIT(gcc_gp1_clk.c),
1298 },
1299};
1300
1301static struct branch_clk gcc_gp2_clk = {
1302 .cbcr_reg = GP2_CBCR,
Tianyi Gou389ba432012-10-01 13:58:38 -07001303 .has_sibling = 0,
1304 .base = &virt_bases[GCC_BASE],
1305 .c = {
Saravana Kannan7a6532e2012-10-18 20:51:13 -07001306 .parent = &gp2_clk_src.c,
Tianyi Gou389ba432012-10-01 13:58:38 -07001307 .dbg_name = "gcc_gp2_clk",
1308 .ops = &clk_ops_branch,
1309 CLK_INIT(gcc_gp2_clk.c),
1310 },
1311};
1312
1313static struct branch_clk gcc_gp3_clk = {
1314 .cbcr_reg = GP3_CBCR,
Tianyi Gou389ba432012-10-01 13:58:38 -07001315 .has_sibling = 0,
1316 .base = &virt_bases[GCC_BASE],
1317 .c = {
Saravana Kannan7a6532e2012-10-18 20:51:13 -07001318 .parent = &gp3_clk_src.c,
Tianyi Gou389ba432012-10-01 13:58:38 -07001319 .dbg_name = "gcc_gp3_clk",
1320 .ops = &clk_ops_branch,
1321 CLK_INIT(gcc_gp3_clk.c),
1322 },
1323};
1324
1325static struct branch_clk gcc_ipa_clk = {
1326 .cbcr_reg = IPA_CBCR,
Tianyi Gou389ba432012-10-01 13:58:38 -07001327 .has_sibling = 1,
1328 .base = &virt_bases[GCC_BASE],
1329 .c = {
Saravana Kannan7a6532e2012-10-18 20:51:13 -07001330 .parent = &ipa_clk_src.c,
Tianyi Gou389ba432012-10-01 13:58:38 -07001331 .dbg_name = "gcc_ipa_clk",
1332 .ops = &clk_ops_branch,
1333 CLK_INIT(gcc_ipa_clk.c),
1334 },
1335};
1336
1337static struct branch_clk gcc_ipa_cnoc_clk = {
1338 .cbcr_reg = IPA_CNOC_CBCR,
1339 .has_sibling = 1,
1340 .base = &virt_bases[GCC_BASE],
1341 .c = {
1342 .dbg_name = "gcc_ipa_cnoc_clk",
1343 .ops = &clk_ops_branch,
1344 CLK_INIT(gcc_ipa_cnoc_clk.c),
1345 },
1346};
1347
Tianyi Gou0e10e792012-11-29 18:28:32 -08001348static struct branch_clk gcc_ipa_sleep_clk = {
1349 .cbcr_reg = IPA_SLEEP_CBCR,
1350 .has_sibling = 1,
1351 .base = &virt_bases[GCC_BASE],
1352 .c = {
1353 .dbg_name = "gcc_ipa_sleep_clk",
1354 .ops = &clk_ops_branch,
1355 CLK_INIT(gcc_ipa_sleep_clk.c),
1356 },
1357};
1358
Tianyi Gou389ba432012-10-01 13:58:38 -07001359static struct branch_clk gcc_pdm2_clk = {
1360 .cbcr_reg = PDM2_CBCR,
Tianyi Gou389ba432012-10-01 13:58:38 -07001361 .has_sibling = 0,
1362 .base = &virt_bases[GCC_BASE],
1363 .c = {
Saravana Kannan7a6532e2012-10-18 20:51:13 -07001364 .parent = &pdm2_clk_src.c,
Tianyi Gou389ba432012-10-01 13:58:38 -07001365 .dbg_name = "gcc_pdm2_clk",
1366 .ops = &clk_ops_branch,
1367 CLK_INIT(gcc_pdm2_clk.c),
1368 },
1369};
1370
1371static struct branch_clk gcc_pdm_ahb_clk = {
1372 .cbcr_reg = PDM_AHB_CBCR,
1373 .has_sibling = 1,
1374 .base = &virt_bases[GCC_BASE],
1375 .c = {
1376 .dbg_name = "gcc_pdm_ahb_clk",
1377 .ops = &clk_ops_branch,
1378 CLK_INIT(gcc_pdm_ahb_clk.c),
1379 },
1380};
1381
1382static struct local_vote_clk gcc_prng_ahb_clk = {
1383 .cbcr_reg = PRNG_AHB_CBCR,
1384 .vote_reg = APCS_CLOCK_BRANCH_ENA_VOTE,
1385 .en_mask = BIT(13),
1386 .base = &virt_bases[GCC_BASE],
1387 .c = {
1388 .dbg_name = "gcc_prng_ahb_clk",
1389 .ops = &clk_ops_vote,
1390 CLK_INIT(gcc_prng_ahb_clk.c),
1391 },
1392};
1393
1394static struct branch_clk gcc_qpic_ahb_clk = {
1395 .cbcr_reg = QPIC_AHB_CBCR,
1396 .has_sibling = 1,
1397 .base = &virt_bases[GCC_BASE],
1398 .c = {
1399 .dbg_name = "gcc_qpic_ahb_clk",
1400 .ops = &clk_ops_branch,
1401 CLK_INIT(gcc_qpic_ahb_clk.c),
1402 },
1403};
1404
1405static struct branch_clk gcc_qpic_clk = {
1406 .cbcr_reg = QPIC_CBCR,
Tianyi Gou389ba432012-10-01 13:58:38 -07001407 .has_sibling = 0,
1408 .base = &virt_bases[GCC_BASE],
1409 .c = {
Saravana Kannan7a6532e2012-10-18 20:51:13 -07001410 .parent = &qpic_clk_src.c,
Tianyi Gou389ba432012-10-01 13:58:38 -07001411 .dbg_name = "gcc_qpic_clk",
1412 .ops = &clk_ops_branch,
1413 CLK_INIT(gcc_qpic_clk.c),
1414 },
1415};
1416
1417static struct branch_clk gcc_sdcc2_ahb_clk = {
1418 .cbcr_reg = SDCC2_AHB_CBCR,
1419 .has_sibling = 1,
1420 .base = &virt_bases[GCC_BASE],
1421 .c = {
1422 .dbg_name = "gcc_sdcc2_ahb_clk",
1423 .ops = &clk_ops_branch,
1424 CLK_INIT(gcc_sdcc2_ahb_clk.c),
1425 },
1426};
1427
1428static struct branch_clk gcc_sdcc2_apps_clk = {
1429 .cbcr_reg = SDCC2_APPS_CBCR,
Tianyi Gou389ba432012-10-01 13:58:38 -07001430 .has_sibling = 0,
1431 .base = &virt_bases[GCC_BASE],
1432 .c = {
Saravana Kannan7a6532e2012-10-18 20:51:13 -07001433 .parent = &sdcc2_apps_clk_src.c,
Tianyi Gou389ba432012-10-01 13:58:38 -07001434 .dbg_name = "gcc_sdcc2_apps_clk",
1435 .ops = &clk_ops_branch,
1436 CLK_INIT(gcc_sdcc2_apps_clk.c),
1437 },
1438};
1439
1440static struct branch_clk gcc_sdcc3_ahb_clk = {
1441 .cbcr_reg = SDCC3_AHB_CBCR,
1442 .has_sibling = 1,
1443 .base = &virt_bases[GCC_BASE],
1444 .c = {
1445 .dbg_name = "gcc_sdcc3_ahb_clk",
1446 .ops = &clk_ops_branch,
1447 CLK_INIT(gcc_sdcc3_ahb_clk.c),
1448 },
1449};
1450
1451static struct branch_clk gcc_sdcc3_apps_clk = {
1452 .cbcr_reg = SDCC3_APPS_CBCR,
Tianyi Gou389ba432012-10-01 13:58:38 -07001453 .has_sibling = 0,
1454 .base = &virt_bases[GCC_BASE],
1455 .c = {
Saravana Kannan7a6532e2012-10-18 20:51:13 -07001456 .parent = &sdcc3_apps_clk_src.c,
Tianyi Gou389ba432012-10-01 13:58:38 -07001457 .dbg_name = "gcc_sdcc3_apps_clk",
1458 .ops = &clk_ops_branch,
1459 CLK_INIT(gcc_sdcc3_apps_clk.c),
1460 },
1461};
1462
1463static struct branch_clk gcc_sys_noc_ipa_axi_clk = {
1464 .cbcr_reg = SYS_NOC_IPA_AXI_CBCR,
Tianyi Gou389ba432012-10-01 13:58:38 -07001465 .has_sibling = 1,
1466 .base = &virt_bases[GCC_BASE],
1467 .c = {
Saravana Kannan7a6532e2012-10-18 20:51:13 -07001468 .parent = &ipa_clk_src.c,
Tianyi Gou389ba432012-10-01 13:58:38 -07001469 .dbg_name = "gcc_sys_noc_ipa_axi_clk",
1470 .ops = &clk_ops_branch,
1471 CLK_INIT(gcc_sys_noc_ipa_axi_clk.c),
1472 },
1473};
1474
1475static struct branch_clk gcc_usb_hs_ahb_clk = {
1476 .cbcr_reg = USB_HS_AHB_CBCR,
1477 .has_sibling = 1,
1478 .base = &virt_bases[GCC_BASE],
1479 .c = {
1480 .dbg_name = "gcc_usb_hs_ahb_clk",
1481 .ops = &clk_ops_branch,
1482 CLK_INIT(gcc_usb_hs_ahb_clk.c),
1483 },
1484};
1485
1486static struct branch_clk gcc_usb_hs_system_clk = {
1487 .cbcr_reg = USB_HS_SYSTEM_CBCR,
1488 .bcr_reg = USB_HS_BCR,
Tianyi Gou389ba432012-10-01 13:58:38 -07001489 .has_sibling = 0,
1490 .base = &virt_bases[GCC_BASE],
1491 .c = {
Saravana Kannan7a6532e2012-10-18 20:51:13 -07001492 .parent = &usb_hs_system_clk_src.c,
Tianyi Gou389ba432012-10-01 13:58:38 -07001493 .dbg_name = "gcc_usb_hs_system_clk",
1494 .ops = &clk_ops_branch,
1495 CLK_INIT(gcc_usb_hs_system_clk.c),
1496 },
1497};
1498
1499static struct branch_clk gcc_usb_hsic_ahb_clk = {
1500 .cbcr_reg = USB_HSIC_AHB_CBCR,
1501 .has_sibling = 1,
1502 .base = &virt_bases[GCC_BASE],
1503 .c = {
1504 .dbg_name = "gcc_usb_hsic_ahb_clk",
1505 .ops = &clk_ops_branch,
1506 CLK_INIT(gcc_usb_hsic_ahb_clk.c),
1507 },
1508};
1509
1510static struct branch_clk gcc_usb_hsic_clk = {
1511 .cbcr_reg = USB_HSIC_CBCR,
Tianyi Gou389ba432012-10-01 13:58:38 -07001512 .has_sibling = 0,
1513 .base = &virt_bases[GCC_BASE],
1514 .c = {
Saravana Kannan7a6532e2012-10-18 20:51:13 -07001515 .parent = &usb_hsic_clk_src.c,
Tianyi Gou389ba432012-10-01 13:58:38 -07001516 .dbg_name = "gcc_usb_hsic_clk",
1517 .ops = &clk_ops_branch,
1518 CLK_INIT(gcc_usb_hsic_clk.c),
1519 },
1520};
1521
1522static struct branch_clk gcc_usb_hsic_io_cal_clk = {
1523 .cbcr_reg = USB_HSIC_IO_CAL_CBCR,
Tianyi Gou389ba432012-10-01 13:58:38 -07001524 .has_sibling = 0,
1525 .base = &virt_bases[GCC_BASE],
1526 .c = {
Saravana Kannan7a6532e2012-10-18 20:51:13 -07001527 .parent = &usb_hsic_io_cal_clk_src.c,
Tianyi Gou389ba432012-10-01 13:58:38 -07001528 .dbg_name = "gcc_usb_hsic_io_cal_clk",
1529 .ops = &clk_ops_branch,
1530 CLK_INIT(gcc_usb_hsic_io_cal_clk.c),
1531 },
1532};
1533
Tianyi Gou55b805b2013-02-28 21:46:03 -08001534static struct branch_clk gcc_usb_hsic_io_cal_sleep_clk = {
1535 .cbcr_reg = USB_HSIC_IO_CAL_SLEEP_CBCR,
1536 .has_sibling = 1,
1537 .base = &virt_bases[GCC_BASE],
1538 .c = {
1539 .dbg_name = "gcc_usb_hsic_io_cal_sleep_clk",
1540 .ops = &clk_ops_branch,
1541 CLK_INIT(gcc_usb_hsic_io_cal_sleep_clk.c),
1542 },
1543};
1544
Tianyi Gou389ba432012-10-01 13:58:38 -07001545static struct branch_clk gcc_usb_hsic_system_clk = {
1546 .cbcr_reg = USB_HSIC_SYSTEM_CBCR,
1547 .bcr_reg = USB_HS_HSIC_BCR,
Tianyi Gou389ba432012-10-01 13:58:38 -07001548 .has_sibling = 0,
1549 .base = &virt_bases[GCC_BASE],
1550 .c = {
Saravana Kannan7a6532e2012-10-18 20:51:13 -07001551 .parent = &usb_hsic_system_clk_src.c,
Tianyi Gou389ba432012-10-01 13:58:38 -07001552 .dbg_name = "gcc_usb_hsic_system_clk",
1553 .ops = &clk_ops_branch,
1554 CLK_INIT(gcc_usb_hsic_system_clk.c),
1555 },
1556};
1557
1558static struct branch_clk gcc_usb_hsic_xcvr_fs_clk = {
1559 .cbcr_reg = USB_HSIC_XCVR_FS_CBCR,
Tianyi Gou389ba432012-10-01 13:58:38 -07001560 .has_sibling = 0,
1561 .base = &virt_bases[GCC_BASE],
1562 .c = {
Saravana Kannan7a6532e2012-10-18 20:51:13 -07001563 .parent = &usb_hsic_xcvr_fs_clk_src.c,
Tianyi Gou389ba432012-10-01 13:58:38 -07001564 .dbg_name = "gcc_usb_hsic_xcvr_fs_clk",
1565 .ops = &clk_ops_branch,
1566 CLK_INIT(gcc_usb_hsic_xcvr_fs_clk.c),
1567 },
1568};
1569
Tianyi Gou389ba432012-10-01 13:58:38 -07001570static DEFINE_CLK_MEASURE(a5_m_clk);
1571
1572#ifdef CONFIG_DEBUG_FS
1573
1574struct measure_mux_entry {
1575 struct clk *c;
1576 int base;
1577 u32 debug_mux;
1578};
1579
Tianyi Gouabcddb72013-02-23 18:10:11 -08001580struct measure_mux_entry measure_mux_common[] __initdata = {
Tianyi Gou389ba432012-10-01 13:58:38 -07001581 {&gcc_pdm_ahb_clk.c, GCC_BASE, 0x00d0},
Tianyi Gou55b805b2013-02-28 21:46:03 -08001582 {&gcc_usb_hsic_io_cal_sleep_clk.c, GCC_BASE, 0x005c},
Tianyi Gou389ba432012-10-01 13:58:38 -07001583 {&gcc_usb_hsic_xcvr_fs_clk.c, GCC_BASE, 0x005d},
1584 {&gcc_usb_hsic_system_clk.c, GCC_BASE, 0x0059},
1585 {&gcc_usb_hsic_io_cal_clk.c, GCC_BASE, 0x005b},
1586 {&gcc_sdcc3_ahb_clk.c, GCC_BASE, 0x0079},
1587 {&gcc_blsp1_qup5_i2c_apps_clk.c, GCC_BASE, 0x009d},
1588 {&gcc_blsp1_qup1_spi_apps_clk.c, GCC_BASE, 0x008a},
1589 {&gcc_blsp1_uart2_apps_clk.c, GCC_BASE, 0x0091},
1590 {&gcc_blsp1_qup4_spi_apps_clk.c, GCC_BASE, 0x0098},
1591 {&gcc_blsp1_qup3_spi_apps_clk.c, GCC_BASE, 0x0093},
1592 {&gcc_blsp1_qup6_i2c_apps_clk.c, GCC_BASE, 0x00a2},
1593 {&gcc_bam_dma_ahb_clk.c, GCC_BASE, 0x00e0},
1594 {&gcc_sdcc3_apps_clk.c, GCC_BASE, 0x0078},
1595 {&gcc_usb_hs_system_clk.c, GCC_BASE, 0x0060},
1596 {&gcc_blsp1_ahb_clk.c, GCC_BASE, 0x0088},
1597 {&gcc_blsp1_uart4_apps_clk.c, GCC_BASE, 0x009a},
1598 {&gcc_blsp1_qup2_spi_apps_clk.c, GCC_BASE, 0x008e},
1599 {&gcc_usb_hsic_ahb_clk.c, GCC_BASE, 0x0058},
1600 {&gcc_blsp1_uart3_apps_clk.c, GCC_BASE, 0x0095},
1601 {&gcc_ce1_axi_clk.c, GCC_BASE, 0x0139},
1602 {&gcc_blsp1_qup5_spi_apps_clk.c, GCC_BASE, 0x009c},
1603 {&gcc_usb_hs_ahb_clk.c, GCC_BASE, 0x0061},
1604 {&gcc_blsp1_qup6_spi_apps_clk.c, GCC_BASE, 0x00a1},
1605 {&gcc_prng_ahb_clk.c, GCC_BASE, 0x00d8},
1606 {&gcc_blsp1_qup3_i2c_apps_clk.c, GCC_BASE, 0x0094},
1607 {&gcc_usb_hsic_clk.c, GCC_BASE, 0x005a},
1608 {&gcc_blsp1_uart6_apps_clk.c, GCC_BASE, 0x00a3},
1609 {&gcc_sdcc2_apps_clk.c, GCC_BASE, 0x0070},
1610 {&gcc_blsp1_uart1_apps_clk.c, GCC_BASE, 0x008c},
1611 {&gcc_blsp1_qup4_i2c_apps_clk.c, GCC_BASE, 0x0099},
Tianyi Gou55b805b2013-02-28 21:46:03 -08001612 {&gcc_bam_dma_inactivity_timers_clk.c, GCC_BASE, 0x00E1},
Tianyi Gou389ba432012-10-01 13:58:38 -07001613 {&gcc_boot_rom_ahb_clk.c, GCC_BASE, 0x00f8},
1614 {&gcc_ce1_ahb_clk.c, GCC_BASE, 0x013a},
1615 {&gcc_pdm2_clk.c, GCC_BASE, 0x00d2},
1616 {&gcc_blsp1_uart5_apps_clk.c, GCC_BASE, 0x009e},
1617 {&gcc_blsp1_qup2_i2c_apps_clk.c, GCC_BASE, 0x0090},
1618 {&gcc_blsp1_qup1_i2c_apps_clk.c, GCC_BASE, 0x008b},
1619 {&gcc_sdcc2_ahb_clk.c, GCC_BASE, 0x0071},
1620 {&gcc_ce1_clk.c, GCC_BASE, 0x0138},
1621 {&gcc_sys_noc_ipa_axi_clk.c, GCC_BASE, 0x0007},
Tianyi Gou8512ac42013-01-23 18:32:04 -08001622 {&gcc_ipa_clk.c, GCC_BASE, 0x01E0},
1623 {&gcc_ipa_cnoc_clk.c, GCC_BASE, 0x01E1},
1624 {&gcc_ipa_sleep_clk.c, GCC_BASE, 0x01E2},
1625 {&gcc_qpic_clk.c, GCC_BASE, 0x01D8},
1626 {&gcc_qpic_ahb_clk.c, GCC_BASE, 0x01D9},
Tianyi Gou389ba432012-10-01 13:58:38 -07001627
Tianyi Gou389ba432012-10-01 13:58:38 -07001628 {&a5_m_clk, APCS_BASE, 0x3},
1629
1630 {&dummy_clk, N_BASES, 0x0000},
1631};
1632
Tianyi Gouabcddb72013-02-23 18:10:11 -08001633struct measure_mux_entry measure_mux_v2_only[] __initdata = {
1634 {&gcc_ipa_clk.c, GCC_BASE, 0x01E0},
1635 {&gcc_ipa_cnoc_clk.c, GCC_BASE, 0x01E1},
1636 {&gcc_ipa_sleep_clk.c, GCC_BASE, 0x01E2},
1637 {&gcc_qpic_clk.c, GCC_BASE, 0x01D8},
1638 {&gcc_qpic_ahb_clk.c, GCC_BASE, 0x01D9},
1639};
1640
1641struct measure_mux_entry measure_mux[ARRAY_SIZE(measure_mux_common)
1642 + ARRAY_SIZE(measure_mux_v2_only)];
1643
Tianyi Gou389ba432012-10-01 13:58:38 -07001644static int measure_clk_set_parent(struct clk *c, struct clk *parent)
1645{
1646 struct measure_clk *clk = to_measure_clk(c);
1647 unsigned long flags;
1648 u32 regval, clk_sel, i;
1649
1650 if (!parent)
1651 return -EINVAL;
1652
1653 for (i = 0; i < (ARRAY_SIZE(measure_mux) - 1); i++)
1654 if (measure_mux[i].c == parent)
1655 break;
1656
1657 if (measure_mux[i].c == &dummy_clk)
1658 return -EINVAL;
1659
1660 spin_lock_irqsave(&local_clock_reg_lock, flags);
1661 /*
1662 * Program the test vector, measurement period (sample_ticks)
1663 * and scaling multiplier.
1664 */
1665 clk->sample_ticks = 0x10000;
1666 clk->multiplier = 1;
1667
Tianyi Gou389ba432012-10-01 13:58:38 -07001668 writel_relaxed(0, GCC_REG_BASE(GCC_DEBUG_CLK_CTL_REG));
1669
1670 switch (measure_mux[i].base) {
1671
1672 case GCC_BASE:
1673 clk_sel = measure_mux[i].debug_mux;
1674 break;
1675
Tianyi Gou389ba432012-10-01 13:58:38 -07001676 case APCS_BASE:
1677 clk_sel = 0x16A;
1678 regval = BVAL(5, 3, measure_mux[i].debug_mux);
1679 writel_relaxed(regval, APCS_REG_BASE(APCS_CLK_DIAG_REG));
1680
1681 /* Activate debug clock output */
1682 regval |= BIT(7);
1683 writel_relaxed(regval, APCS_REG_BASE(APCS_CLK_DIAG_REG));
1684 break;
1685
1686 default:
1687 return -EINVAL;
1688 }
1689
1690 /* Set debug mux clock index */
1691 regval = BVAL(8, 0, clk_sel);
1692 writel_relaxed(regval, GCC_REG_BASE(GCC_DEBUG_CLK_CTL_REG));
1693
1694 /* Activate debug clock output */
1695 regval |= BIT(16);
1696 writel_relaxed(regval, GCC_REG_BASE(GCC_DEBUG_CLK_CTL_REG));
1697
1698 /* Make sure test vector is set before starting measurements. */
1699 mb();
1700 spin_unlock_irqrestore(&local_clock_reg_lock, flags);
1701
1702 return 0;
1703}
1704
1705/* Sample clock for 'ticks' reference clock ticks. */
1706static u32 run_measurement(unsigned ticks)
1707{
1708 /* Stop counters and set the XO4 counter start value. */
1709 writel_relaxed(ticks, GCC_REG_BASE(CLOCK_FRQ_MEASURE_CTL_REG));
1710
1711 /* Wait for timer to become ready. */
1712 while ((readl_relaxed(GCC_REG_BASE(CLOCK_FRQ_MEASURE_STATUS_REG)) &
1713 BIT(25)) != 0)
1714 cpu_relax();
1715
1716 /* Run measurement and wait for completion. */
1717 writel_relaxed(BIT(20)|ticks, GCC_REG_BASE(CLOCK_FRQ_MEASURE_CTL_REG));
1718 while ((readl_relaxed(GCC_REG_BASE(CLOCK_FRQ_MEASURE_STATUS_REG)) &
1719 BIT(25)) == 0)
1720 cpu_relax();
1721
1722 /* Return measured ticks. */
1723 return readl_relaxed(GCC_REG_BASE(CLOCK_FRQ_MEASURE_STATUS_REG)) &
1724 BM(24, 0);
1725}
1726
1727/*
1728 * Perform a hardware rate measurement for a given clock.
1729 * FOR DEBUG USE ONLY: Measurements take ~15 ms!
1730 */
1731static unsigned long measure_clk_get_rate(struct clk *c)
1732{
1733 unsigned long flags;
1734 u32 gcc_xo4_reg_backup;
1735 u64 raw_count_short, raw_count_full;
1736 struct measure_clk *clk = to_measure_clk(c);
1737 unsigned ret;
1738
1739 ret = clk_prepare_enable(&cxo_clk_src.c);
1740 if (ret) {
1741 pr_warning("CXO clock failed to enable. Can't measure\n");
1742 return 0;
1743 }
1744
1745 spin_lock_irqsave(&local_clock_reg_lock, flags);
1746
1747 /* Enable CXO/4 and RINGOSC branch. */
1748 gcc_xo4_reg_backup = readl_relaxed(GCC_REG_BASE(GCC_XO_DIV4_CBCR_REG));
1749 writel_relaxed(0x1, GCC_REG_BASE(GCC_XO_DIV4_CBCR_REG));
1750
1751 /*
1752 * The ring oscillator counter will not reset if the measured clock
1753 * is not running. To detect this, run a short measurement before
1754 * the full measurement. If the raw results of the two are the same
1755 * then the clock must be off.
1756 */
1757
1758 /* Run a short measurement. (~1 ms) */
1759 raw_count_short = run_measurement(0x1000);
1760 /* Run a full measurement. (~14 ms) */
1761 raw_count_full = run_measurement(clk->sample_ticks);
1762
1763 writel_relaxed(gcc_xo4_reg_backup, GCC_REG_BASE(GCC_XO_DIV4_CBCR_REG));
1764
1765 /* Return 0 if the clock is off. */
1766 if (raw_count_full == raw_count_short) {
1767 ret = 0;
1768 } else {
1769 /* Compute rate in Hz. */
1770 raw_count_full = ((raw_count_full * 10) + 15) * 4800000;
1771 do_div(raw_count_full, ((clk->sample_ticks * 10) + 35));
1772 ret = (raw_count_full * clk->multiplier);
1773 }
1774
1775 writel_relaxed(0x51A00, GCC_REG_BASE(GCC_PLLTEST_PAD_CFG_REG));
1776 spin_unlock_irqrestore(&local_clock_reg_lock, flags);
1777
1778 clk_disable_unprepare(&cxo_clk_src.c);
1779
1780 return ret;
1781}
1782#else /* !CONFIG_DEBUG_FS */
1783static int measure_clk_set_parent(struct clk *clk, struct clk *parent)
1784{
1785 return -EINVAL;
1786}
1787
1788static unsigned long measure_clk_get_rate(struct clk *clk)
1789{
1790 return 0;
1791}
1792#endif /* CONFIG_DEBUG_FS */
1793
1794static struct clk_ops clk_ops_measure = {
1795 .set_parent = measure_clk_set_parent,
1796 .get_rate = measure_clk_get_rate,
1797};
1798
1799static struct measure_clk measure_clk = {
1800 .c = {
1801 .dbg_name = "measure_clk",
1802 .ops = &clk_ops_measure,
1803 CLK_INIT(measure_clk.c),
1804 },
1805 .multiplier = 1,
1806};
1807
1808static struct clk_lookup msm_clocks_9625[] = {
1809 CLK_LOOKUP("xo", cxo_clk_src.c, ""),
1810 CLK_LOOKUP("measure", measure_clk.c, "debug"),
1811
Tianyi Gou27df1bb2012-10-11 14:44:01 -07001812 CLK_LOOKUP("pll0", gpll0_activeonly_clk_src.c, "f9010008.qcom,acpuclk"),
1813 CLK_LOOKUP("pll14", apcspll_clk_src.c, "f9010008.qcom,acpuclk"),
Tianyi Gou389ba432012-10-01 13:58:38 -07001814
1815 CLK_LOOKUP("dma_bam_pclk", gcc_bam_dma_ahb_clk.c, "msm_sps"),
Tianyi Gou55b805b2013-02-28 21:46:03 -08001816 CLK_LOOKUP("inactivity_clk", gcc_bam_dma_inactivity_timers_clk.c,
1817 "msm_sps"),
Tianyi Gou389ba432012-10-01 13:58:38 -07001818 CLK_LOOKUP("iface_clk", gcc_blsp1_ahb_clk.c, "msm_serial_hsl.0"),
Gilad Avidov09c78ec2012-10-18 09:34:35 -06001819 CLK_LOOKUP("iface_clk", gcc_blsp1_ahb_clk.c, "f9924000.spi"),
Tianyi Gou389ba432012-10-01 13:58:38 -07001820 CLK_LOOKUP("iface_clk", gcc_blsp1_ahb_clk.c, "f9925000.i2c"),
Saket Saurabhd72ee922013-01-22 16:56:52 +05301821 CLK_LOOKUP("iface_clk", gcc_blsp1_ahb_clk.c, "f991d000.uart"),
Tianyi Gou389ba432012-10-01 13:58:38 -07001822 CLK_LOOKUP("core_clk", gcc_blsp1_qup1_i2c_apps_clk.c, ""),
Gilad Avidov09c78ec2012-10-18 09:34:35 -06001823 CLK_LOOKUP("core_clk", gcc_blsp1_qup1_spi_apps_clk.c, ""),
Tianyi Gou389ba432012-10-01 13:58:38 -07001824 CLK_LOOKUP("core_clk", gcc_blsp1_qup2_i2c_apps_clk.c, ""),
Gilad Avidov09c78ec2012-10-18 09:34:35 -06001825 CLK_LOOKUP("core_clk", gcc_blsp1_qup2_spi_apps_clk.c, "f9924000.spi"),
Tianyi Gou389ba432012-10-01 13:58:38 -07001826 CLK_LOOKUP("core_clk", gcc_blsp1_qup3_i2c_apps_clk.c, "f9925000.i2c"),
1827 CLK_LOOKUP("core_clk", gcc_blsp1_qup3_spi_apps_clk.c, ""),
1828 CLK_LOOKUP("core_clk", gcc_blsp1_qup4_i2c_apps_clk.c, ""),
1829 CLK_LOOKUP("core_clk", gcc_blsp1_qup4_spi_apps_clk.c, ""),
1830 CLK_LOOKUP("core_clk", gcc_blsp1_qup5_i2c_apps_clk.c, ""),
1831 CLK_LOOKUP("core_clk", gcc_blsp1_qup5_spi_apps_clk.c, ""),
1832 CLK_LOOKUP("core_clk", gcc_blsp1_qup6_i2c_apps_clk.c, ""),
1833 CLK_LOOKUP("core_clk", gcc_blsp1_qup6_spi_apps_clk.c, ""),
Saket Saurabhd72ee922013-01-22 16:56:52 +05301834 CLK_LOOKUP("core_clk", gcc_blsp1_uart1_apps_clk.c, "f991d000.uart"),
Tianyi Gou389ba432012-10-01 13:58:38 -07001835 CLK_LOOKUP("core_clk", gcc_blsp1_uart2_apps_clk.c, ""),
1836 CLK_LOOKUP("core_clk", gcc_blsp1_uart3_apps_clk.c, "msm_serial_hsl.0"),
1837 CLK_LOOKUP("core_clk", gcc_blsp1_uart4_apps_clk.c, ""),
1838 CLK_LOOKUP("core_clk", gcc_blsp1_uart5_apps_clk.c, ""),
1839 CLK_LOOKUP("core_clk", gcc_blsp1_uart6_apps_clk.c, ""),
1840
1841 CLK_LOOKUP("core_clk_src", ce1_clk_src.c, ""),
1842 CLK_LOOKUP("core_clk", gcc_ce1_clk.c, ""),
1843 CLK_LOOKUP("iface_clk", gcc_ce1_ahb_clk.c, ""),
1844 CLK_LOOKUP("bus_clk", gcc_ce1_axi_clk.c, ""),
1845
1846 CLK_LOOKUP("core_clk", gcc_gp1_clk.c, ""),
1847 CLK_LOOKUP("core_clk", gcc_gp2_clk.c, ""),
1848 CLK_LOOKUP("core_clk", gcc_gp3_clk.c, ""),
1849
Hariprasad Dhalinarasimha9abfe782012-11-07 19:40:14 -08001850 CLK_LOOKUP("iface_clk", gcc_prng_ahb_clk.c, "f9bff000.qcom,msm-rng"),
Tianyi Gou389ba432012-10-01 13:58:38 -07001851 CLK_LOOKUP("core_src_clk", ipa_clk_src.c, "fd4c0000.qcom,ipa"),
1852 CLK_LOOKUP("core_clk", gcc_ipa_clk.c, "fd4c0000.qcom,ipa"),
1853 CLK_LOOKUP("bus_clk", gcc_sys_noc_ipa_axi_clk.c, "fd4c0000.qcom,ipa"),
1854 CLK_LOOKUP("iface_clk", gcc_ipa_cnoc_clk.c, "fd4c0000.qcom,ipa"),
Tianyi Gou0e10e792012-11-29 18:28:32 -08001855 CLK_LOOKUP("inactivity_clk", gcc_ipa_sleep_clk.c, "fd4c0000.qcom,ipa"),
Tianyi Gou389ba432012-10-01 13:58:38 -07001856
1857 CLK_LOOKUP("core_clk", gcc_pdm2_clk.c, ""),
1858 CLK_LOOKUP("iface_clk", gcc_pdm_ahb_clk.c, ""),
1859
Oluwafemi Adeyemi61df1182012-10-12 18:51:11 -07001860 CLK_LOOKUP("iface_clk", gcc_sdcc2_ahb_clk.c, "msm_sdcc.2"),
1861 CLK_LOOKUP("core_clk", gcc_sdcc2_apps_clk.c, "msm_sdcc.2"),
1862 CLK_LOOKUP("bus_clk", pnoc_sdcc2_clk.c, "msm_sdcc.2"),
1863 CLK_LOOKUP("iface_clk", gcc_sdcc3_ahb_clk.c, "msm_sdcc.3"),
1864 CLK_LOOKUP("core_clk", gcc_sdcc3_apps_clk.c, "msm_sdcc.3"),
1865 CLK_LOOKUP("bus_clk", pnoc_sdcc3_clk.c, "msm_sdcc.3"),
Tianyi Gou389ba432012-10-01 13:58:38 -07001866
1867 CLK_LOOKUP("iface_clk", gcc_usb_hs_ahb_clk.c, "f9a55000.usb"),
1868 CLK_LOOKUP("core_clk", gcc_usb_hs_system_clk.c, "f9a55000.usb"),
Ido Shayevitzd2b722b2013-01-09 13:08:54 +02001869 CLK_LOOKUP("iface_clk", gcc_usb_hsic_ahb_clk.c, "msm_hsic_host"),
1870 CLK_LOOKUP("phy_clk", gcc_usb_hsic_clk.c, "msm_hsic_host"),
1871 CLK_LOOKUP("cal_clk", gcc_usb_hsic_io_cal_clk.c, "msm_hsic_host"),
1872 CLK_LOOKUP("core_clk", gcc_usb_hsic_system_clk.c, "msm_hsic_host"),
Ofir Cohenb512a5f2012-12-13 09:46:34 +02001873 CLK_LOOKUP("alt_core_clk", gcc_usb_hsic_xcvr_fs_clk.c, ""),
Tianyi Gou55b805b2013-02-28 21:46:03 -08001874 CLK_LOOKUP("inactivity_clk", gcc_usb_hsic_io_cal_sleep_clk.c,
1875 "msm_hsic_host"),
Tianyi Gou389ba432012-10-01 13:58:38 -07001876
Hariprasad Dhalinarasimha96252de2012-11-21 17:52:36 -08001877 CLK_LOOKUP("core_clk", gcc_ce1_clk.c, "fd400000.qcom,qcedev"),
1878 CLK_LOOKUP("iface_clk", gcc_ce1_ahb_clk.c, "fd400000.qcom,qcedev"),
1879 CLK_LOOKUP("bus_clk", gcc_ce1_axi_clk.c, "fd400000.qcom,qcedev"),
1880 CLK_LOOKUP("core_clk_src", ce1_clk_src.c, "fd400000.qcom,qcedev"),
1881
1882 CLK_LOOKUP("core_clk", gcc_ce1_clk.c, "fd400000.qcom,qcrypto"),
1883 CLK_LOOKUP("iface_clk", gcc_ce1_ahb_clk.c, "fd400000.qcom,qcrypto"),
1884 CLK_LOOKUP("bus_clk", gcc_ce1_axi_clk.c, "fd400000.qcom,qcrypto"),
1885 CLK_LOOKUP("core_clk_src", ce1_clk_src.c, "fd400000.qcom,qcrypto"),
1886
Tianyi Gou389ba432012-10-01 13:58:38 -07001887 /* RPM and voter clocks */
1888 CLK_LOOKUP("bus_clk", snoc_clk.c, ""),
1889 CLK_LOOKUP("bus_clk", pnoc_clk.c, ""),
1890 CLK_LOOKUP("bus_clk", cnoc_clk.c, ""),
1891 CLK_LOOKUP("mem_clk", bimc_clk.c, ""),
1892 CLK_LOOKUP("bus_clk", snoc_a_clk.c, ""),
1893 CLK_LOOKUP("bus_clk", pnoc_a_clk.c, ""),
1894 CLK_LOOKUP("bus_clk", cnoc_a_clk.c, ""),
1895 CLK_LOOKUP("mem_clk", bimc_a_clk.c, ""),
1896
1897 CLK_LOOKUP("bus_clk", cnoc_msmbus_clk.c, "msm_config_noc"),
1898 CLK_LOOKUP("bus_a_clk", cnoc_msmbus_a_clk.c, "msm_config_noc"),
1899 CLK_LOOKUP("bus_clk", snoc_msmbus_clk.c, "msm_sys_noc"),
1900 CLK_LOOKUP("bus_a_clk", snoc_msmbus_a_clk.c, "msm_sys_noc"),
1901 CLK_LOOKUP("bus_clk", pnoc_msmbus_clk.c, "msm_periph_noc"),
1902 CLK_LOOKUP("bus_a_clk", pnoc_msmbus_a_clk.c, "msm_periph_noc"),
1903 CLK_LOOKUP("mem_clk", bimc_msmbus_clk.c, "msm_bimc"),
1904 CLK_LOOKUP("mem_a_clk", bimc_msmbus_a_clk.c, "msm_bimc"),
1905
1906 CLK_LOOKUP("dfab_clk", pnoc_sps_clk.c, "msm_sps"),
1907
1908 CLK_LOOKUP("a5_m_clk", a5_m_clk, ""),
Pushkar Joshi4e483042012-10-29 18:10:08 -07001909
Pratik Patel2d15d562013-02-07 19:10:35 -08001910 /* CoreSight clocks */
Pushkar Joshi4e483042012-10-29 18:10:08 -07001911 CLK_LOOKUP("core_clk", qdss_clk.c, "fc322000.tmc"),
1912 CLK_LOOKUP("core_clk", qdss_clk.c, "fc318000.tpiu"),
1913 CLK_LOOKUP("core_clk", qdss_clk.c, "fc31c000.replicator"),
1914 CLK_LOOKUP("core_clk", qdss_clk.c, "fc307000.tmc"),
1915 CLK_LOOKUP("core_clk", qdss_clk.c, "fc31b000.funnel"),
1916 CLK_LOOKUP("core_clk", qdss_clk.c, "fc319000.funnel"),
1917 CLK_LOOKUP("core_clk", qdss_clk.c, "fc31a000.funnel"),
1918 CLK_LOOKUP("core_clk", qdss_clk.c, "fc321000.stm"),
Pushkar Joshi2a51a122012-12-06 10:49:07 -08001919 CLK_LOOKUP("core_clk", qdss_clk.c, "fc332000.etm"),
Pushkar Joshie0e8a7e2012-12-15 18:27:04 -08001920 CLK_LOOKUP("core_clk", qdss_clk.c, "fc332000.jtagmm"),
Pratik Patel9332c382013-02-08 11:54:28 -08001921 CLK_LOOKUP("core_clk", qdss_clk.c, "fc308000.cti"),
1922 CLK_LOOKUP("core_clk", qdss_clk.c, "fc309000.cti"),
1923 CLK_LOOKUP("core_clk", qdss_clk.c, "fc30a000.cti"),
1924 CLK_LOOKUP("core_clk", qdss_clk.c, "fc30b000.cti"),
1925 CLK_LOOKUP("core_clk", qdss_clk.c, "fc30c000.cti"),
1926 CLK_LOOKUP("core_clk", qdss_clk.c, "fc30d000.cti"),
1927 CLK_LOOKUP("core_clk", qdss_clk.c, "fc30e000.cti"),
1928 CLK_LOOKUP("core_clk", qdss_clk.c, "fc30f000.cti"),
1929 CLK_LOOKUP("core_clk", qdss_clk.c, "fc310000.cti"),
1930 CLK_LOOKUP("core_clk", qdss_clk.c, "fc333000.cti"),
Pushkar Joshi4e483042012-10-29 18:10:08 -07001931
Pratik Patel2d15d562013-02-07 19:10:35 -08001932 CLK_LOOKUP("core_a_clk", qdss_a_clk.c, "fc322000.tmc"),
1933 CLK_LOOKUP("core_a_clk", qdss_a_clk.c, "fc318000.tpiu"),
1934 CLK_LOOKUP("core_a_clk", qdss_a_clk.c, "fc31c000.replicator"),
1935 CLK_LOOKUP("core_a_clk", qdss_a_clk.c, "fc307000.tmc"),
1936 CLK_LOOKUP("core_a_clk", qdss_a_clk.c, "fc31b000.funnel"),
1937 CLK_LOOKUP("core_a_clk", qdss_a_clk.c, "fc319000.funnel"),
1938 CLK_LOOKUP("core_a_clk", qdss_a_clk.c, "fc31a000.funnel"),
1939 CLK_LOOKUP("core_a_clk", qdss_a_clk.c, "fc321000.stm"),
1940 CLK_LOOKUP("core_a_clk", qdss_a_clk.c, "fc332000.etm"),
1941 CLK_LOOKUP("core_a_clk", qdss_a_clk.c, "fc332000.jtagmm"),
Pratik Patel9332c382013-02-08 11:54:28 -08001942 CLK_LOOKUP("core_a_clk", qdss_a_clk.c, "fc308000.cti"),
1943 CLK_LOOKUP("core_a_clk", qdss_a_clk.c, "fc309000.cti"),
1944 CLK_LOOKUP("core_a_clk", qdss_a_clk.c, "fc30a000.cti"),
1945 CLK_LOOKUP("core_a_clk", qdss_a_clk.c, "fc30b000.cti"),
1946 CLK_LOOKUP("core_a_clk", qdss_a_clk.c, "fc30c000.cti"),
1947 CLK_LOOKUP("core_a_clk", qdss_a_clk.c, "fc30d000.cti"),
1948 CLK_LOOKUP("core_a_clk", qdss_a_clk.c, "fc30e000.cti"),
1949 CLK_LOOKUP("core_a_clk", qdss_a_clk.c, "fc30f000.cti"),
1950 CLK_LOOKUP("core_a_clk", qdss_a_clk.c, "fc310000.cti"),
1951 CLK_LOOKUP("core_a_clk", qdss_a_clk.c, "fc333000.cti"),
Pushkar Joshi4e483042012-10-29 18:10:08 -07001952
Tianyi Gou389ba432012-10-01 13:58:38 -07001953};
1954
Tianyi Gou389ba432012-10-01 13:58:38 -07001955#define PLL_AUX_OUTPUT_BIT 1
1956#define PLL_AUX2_OUTPUT_BIT 2
1957
1958/*
1959 * TODO: Need to remove this function when the v2 hardware
1960 * fix the broken lock status bit.
1961 */
1962#define PLL_OUTCTRL BIT(0)
1963#define PLL_BYPASSNL BIT(1)
1964#define PLL_RESET_N BIT(2)
1965
1966static DEFINE_SPINLOCK(sr_pll_reg_lock);
1967
1968static int sr_pll_clk_enable_9625(struct clk *c)
1969{
1970 unsigned long flags;
1971 struct pll_clk *pll = to_pll_clk(c);
1972 u32 mode;
1973 void __iomem *mode_reg = *pll->base + (u32)pll->mode_reg;
1974
1975 spin_lock_irqsave(&sr_pll_reg_lock, flags);
1976
1977 /* Disable PLL bypass mode and de-assert reset. */
1978 mode = readl_relaxed(mode_reg);
1979 mode |= PLL_BYPASSNL | PLL_RESET_N;
1980 writel_relaxed(mode, mode_reg);
1981
1982 /* Wait for pll to lock. */
1983 udelay(100);
1984
1985 /* Enable PLL output. */
1986 mode |= PLL_OUTCTRL;
1987 writel_relaxed(mode, mode_reg);
1988
1989 /* Ensure the write above goes through before returning. */
1990 mb();
1991
1992 spin_unlock_irqrestore(&sr_pll_reg_lock, flags);
1993 return 0;
1994}
1995
Tianyi Gou389ba432012-10-01 13:58:38 -07001996static void __init reg_init(void)
1997{
Tianyi Gou781ff672013-02-21 15:29:40 -08001998 u32 regval;
Tianyi Gou389ba432012-10-01 13:58:38 -07001999
Tianyi Gou389ba432012-10-01 13:58:38 -07002000 /* Vote for GPLL0 to turn on. Needed by acpuclock. */
2001 regval = readl_relaxed(GCC_REG_BASE(APCS_GPLL_ENA_VOTE_REG));
2002 regval |= BIT(0);
2003 writel_relaxed(regval, GCC_REG_BASE(APCS_GPLL_ENA_VOTE_REG));
2004
2005 /*
2006 * TODO: Confirm that no clocks need to be voted on in this sleep vote
2007 * register.
2008 */
2009 writel_relaxed(0x0, GCC_REG_BASE(APCS_CLOCK_SLEEP_ENA_VOTE));
Tianyi Gou389ba432012-10-01 13:58:38 -07002010}
2011
2012static void __init msm9625_clock_post_init(void)
2013{
2014 /*
2015 * Hold an active set vote for CXO; this is because CXO is expected
2016 * to remain on whenever CPUs aren't power collapsed.
2017 */
2018 clk_prepare_enable(&cxo_a_clk_src.c);
2019
2020 /*
2021 * TODO: This call is to prevent sending 0Hz to rpm to turn off pnoc.
2022 * Needs to remove this after vote of pnoc from sdcc driver is ready.
2023 */
2024 clk_prepare_enable(&pnoc_msmbus_a_clk.c);
2025
2026 /* Set rates for single-rate clocks. */
2027 clk_set_rate(&usb_hs_system_clk_src.c,
2028 usb_hs_system_clk_src.freq_tbl[0].freq_hz);
2029 clk_set_rate(&usb_hsic_clk_src.c,
2030 usb_hsic_clk_src.freq_tbl[0].freq_hz);
2031 clk_set_rate(&usb_hsic_io_cal_clk_src.c,
2032 usb_hsic_io_cal_clk_src.freq_tbl[0].freq_hz);
2033 clk_set_rate(&usb_hsic_system_clk_src.c,
2034 usb_hsic_system_clk_src.freq_tbl[0].freq_hz);
2035 clk_set_rate(&usb_hsic_xcvr_fs_clk_src.c,
2036 usb_hsic_xcvr_fs_clk_src.freq_tbl[0].freq_hz);
2037 clk_set_rate(&pdm2_clk_src.c, pdm2_clk_src.freq_tbl[0].freq_hz);
Tianyi Goub1d13972013-01-23 22:55:22 -08002038 /*
2039 * TODO: set rate on behalf of the i2c driver until the i2c driver
2040 * distinguish v1/v2 and call set rate accordingly.
2041 */
2042 if (SOCINFO_VERSION_MAJOR(socinfo_get_version()) == 2)
2043 clk_set_rate(&blsp1_qup3_i2c_apps_clk_src.c,
2044 blsp1_qup3_i2c_apps_clk_src.freq_tbl[0].freq_hz);
Tianyi Gou389ba432012-10-01 13:58:38 -07002045}
2046
2047#define GCC_CC_PHYS 0xFC400000
2048#define GCC_CC_SIZE SZ_16K
2049
Tianyi Gou389ba432012-10-01 13:58:38 -07002050#define APCS_GCC_CC_PHYS 0xF9011000
2051#define APCS_GCC_CC_SIZE SZ_4K
2052
2053#define APCS_PLL_PHYS 0xF9008018
2054#define APCS_PLL_SIZE 0x18
2055
Tianyi Goub1d13972013-01-23 22:55:22 -08002056static struct clk *i2c_apps_clks[][2] __initdata = {
2057 {&gcc_blsp1_qup1_i2c_apps_clk.c, &blsp1_qup1_i2c_apps_clk_src.c},
2058 {&gcc_blsp1_qup2_i2c_apps_clk.c, &blsp1_qup2_i2c_apps_clk_src.c},
2059 {&gcc_blsp1_qup3_i2c_apps_clk.c, &blsp1_qup3_i2c_apps_clk_src.c},
2060 {&gcc_blsp1_qup4_i2c_apps_clk.c, &blsp1_qup4_i2c_apps_clk_src.c},
2061 {&gcc_blsp1_qup5_i2c_apps_clk.c, &blsp1_qup5_i2c_apps_clk_src.c},
2062 {&gcc_blsp1_qup6_i2c_apps_clk.c, &blsp1_qup6_i2c_apps_clk_src.c},
2063};
2064
Tianyi Gou389ba432012-10-01 13:58:38 -07002065static void __init msm9625_clock_pre_init(void)
2066{
2067 virt_bases[GCC_BASE] = ioremap(GCC_CC_PHYS, GCC_CC_SIZE);
2068 if (!virt_bases[GCC_BASE])
2069 panic("clock-9625: Unable to ioremap GCC memory!");
2070
Tianyi Gou389ba432012-10-01 13:58:38 -07002071 virt_bases[APCS_BASE] = ioremap(APCS_GCC_CC_PHYS, APCS_GCC_CC_SIZE);
2072 if (!virt_bases[APCS_BASE])
2073 panic("clock-9625: Unable to ioremap APCS_GCC_CC memory!");
2074
2075 virt_bases[APCS_PLL_BASE] = ioremap(APCS_PLL_PHYS, APCS_PLL_SIZE);
2076 if (!virt_bases[APCS_PLL_BASE])
2077 panic("clock-9625: Unable to ioremap APCS_PLL memory!");
2078
Tianyi Goub1d13972013-01-23 22:55:22 -08002079 /* The parent of each of the QUP I2C APPS clocks is an RCG on v2 */
2080 if (SOCINFO_VERSION_MAJOR(socinfo_get_version()) == 2) {
2081 int i, num_cores = ARRAY_SIZE(i2c_apps_clks);
2082 for (i = 0; i < num_cores; i++)
2083 i2c_apps_clks[i][0]->parent = i2c_apps_clks[i][1];
2084 }
2085
Tianyi Gou389ba432012-10-01 13:58:38 -07002086 clk_ops_local_pll.enable = sr_pll_clk_enable_9625;
2087
Patrick Dalyebc26bc2013-02-05 11:49:07 -08002088 vdd_dig.regulator[0] = regulator_get(NULL, "vdd_dig");
2089 if (IS_ERR(vdd_dig.regulator[0]))
Tianyi Gou389ba432012-10-01 13:58:38 -07002090 panic("clock-9625: Unable to get the vdd_dig regulator!");
2091
2092 vote_vdd_level(&vdd_dig, VDD_DIG_HIGH);
Patrick Dalyebc26bc2013-02-05 11:49:07 -08002093 regulator_enable(vdd_dig.regulator[0]);
Tianyi Gou389ba432012-10-01 13:58:38 -07002094
2095 enable_rpm_scaling();
2096
2097 reg_init();
Tianyi Gouabcddb72013-02-23 18:10:11 -08002098
2099 /* Construct measurement mux array */
2100 if (SOCINFO_VERSION_MAJOR(socinfo_get_version()) == 2) {
2101 memcpy(measure_mux,
2102 measure_mux_v2_only, sizeof(measure_mux_v2_only));
2103 memcpy(measure_mux + ARRAY_SIZE(measure_mux_v2_only),
2104 measure_mux_common, sizeof(measure_mux_common));
2105 } else
2106 memcpy(measure_mux,
2107 measure_mux_common, sizeof(measure_mux_common));
Tianyi Gou389ba432012-10-01 13:58:38 -07002108}
2109
2110static int __init msm9625_clock_late_init(void)
2111{
2112 return unvote_vdd_level(&vdd_dig, VDD_DIG_HIGH);
2113}
2114
2115struct clock_init_data msm9625_clock_init_data __initdata = {
2116 .table = msm_clocks_9625,
2117 .size = ARRAY_SIZE(msm_clocks_9625),
2118 .pre_init = msm9625_clock_pre_init,
2119 .post_init = msm9625_clock_post_init,
2120 .late_init = msm9625_clock_late_init,
2121};