blob: 964832087a20439d4040cf74aa6a13a630c8a38a [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
150#define USB_HSIC_XCVR_FS_CBCR 0x042C
151#define USB_HS_SYSTEM_CBCR 0x0484
152#define USB_HS_AHB_CBCR 0x0488
153#define SDCC2_APPS_CBCR 0x0504
154#define SDCC2_AHB_CBCR 0x0508
155#define SDCC3_APPS_CBCR 0x0544
156#define SDCC3_AHB_CBCR 0x0548
157#define BLSP1_AHB_CBCR 0x05C4
158#define BLSP1_QUP1_SPI_APPS_CBCR 0x0644
159#define BLSP1_QUP1_I2C_APPS_CBCR 0x0648
160#define BLSP1_UART1_APPS_CBCR 0x0684
161#define BLSP1_UART1_SIM_CBCR 0x0688
162#define BLSP1_QUP2_SPI_APPS_CBCR 0x06C4
163#define BLSP1_QUP2_I2C_APPS_CBCR 0x06C8
164#define BLSP1_UART2_APPS_CBCR 0x0704
165#define BLSP1_UART2_SIM_CBCR 0x0708
166#define BLSP1_QUP3_SPI_APPS_CBCR 0x0744
167#define BLSP1_QUP3_I2C_APPS_CBCR 0x0748
168#define BLSP1_UART3_APPS_CBCR 0x0784
169#define BLSP1_UART3_SIM_CBCR 0x0788
170#define BLSP1_QUP4_SPI_APPS_CBCR 0x07C4
171#define BLSP1_QUP4_I2C_APPS_CBCR 0x07C8
172#define BLSP1_UART4_APPS_CBCR 0x0804
173#define BLSP1_UART4_SIM_CBCR 0x0808
174#define BLSP1_QUP5_SPI_APPS_CBCR 0x0844
175#define BLSP1_QUP5_I2C_APPS_CBCR 0x0848
176#define BLSP1_UART5_APPS_CBCR 0x0884
177#define BLSP1_UART5_SIM_CBCR 0x0888
178#define BLSP1_QUP6_SPI_APPS_CBCR 0x08C4
179#define BLSP1_QUP6_I2C_APPS_CBCR 0x08C8
180#define BLSP1_UART6_APPS_CBCR 0x0904
181#define BLSP1_UART6_SIM_CBCR 0x0908
182#define BOOT_ROM_AHB_CBCR 0x0E04
183#define PDM_AHB_CBCR 0x0CC4
184#define PDM_XO4_CBCR 0x0CC8
185#define PDM_AHB_CBCR 0x0CC4
186#define PDM_XO4_CBCR 0x0CC8
187#define PDM2_CBCR 0x0CCC
188#define PRNG_AHB_CBCR 0x0D04
189#define BAM_DMA_AHB_CBCR 0x0D44
190#define MSG_RAM_AHB_CBCR 0x0E44
191#define CE1_CBCR 0x1044
192#define CE1_AXI_CBCR 0x1048
193#define CE1_AHB_CBCR 0x104C
194#define GCC_AHB_CBCR 0x10C0
195#define GP1_CBCR 0x1900
196#define GP2_CBCR 0x1940
197#define GP3_CBCR 0x1980
198#define QPIC_CBCR 0x1A44
199#define QPIC_AHB_CBCR 0x1A48
200#define IPA_CBCR 0x1A84
201#define IPA_CNOC_CBCR 0x1A88
202#define IPA_SLEEP_CBCR 0x1A8C
203
Tianyi Gou389ba432012-10-01 13:58:38 -0700204/* Mux source select values */
205#define cxo_source_val 0
206#define gpll0_source_val 1
207#define gpll1_hsic_source_val 4
208#define gnd_source_val 5
Tianyi Gou389ba432012-10-01 13:58:38 -0700209
Vikram Mulukutlad3dca652012-11-19 11:04:13 -0800210#define F_GCC_GND \
211 { \
212 .freq_hz = 0, \
213 .m_val = 0, \
214 .n_val = 0, \
215 .div_src_val = BVAL(4, 0, 1) | BVAL(10, 8, gnd_source_val), \
216 }
217
Tianyi Gou389ba432012-10-01 13:58:38 -0700218#define F(f, s, div, m, n) \
219 { \
220 .freq_hz = (f), \
221 .src_clk = &s##_clk_src.c, \
222 .m_val = (m), \
223 .n_val = ~((n)-(m)) * !!(n), \
224 .d_val = ~(n),\
225 .div_src_val = BVAL(4, 0, (int)(2*(div) - 1)) \
226 | BVAL(10, 8, s##_source_val), \
227 }
228
229#define F_HSIC(f, s, div, m, n) \
230 { \
231 .freq_hz = (f), \
232 .src_clk = &s##_clk_src.c, \
233 .m_val = (m), \
234 .n_val = ~((n)-(m)) * !!(n), \
235 .d_val = ~(n),\
236 .div_src_val = BVAL(4, 0, (int)(2*(div) - 1)) \
237 | BVAL(10, 8, s##_hsic_source_val), \
238 }
239
Tianyi Goua717ddd2012-10-05 17:06:24 -0700240#define F_APCS_PLL(f, l, m, n, pre_div, post_div, vco) \
241 { \
242 .freq_hz = (f), \
243 .l_val = (l), \
244 .m_val = (m), \
245 .n_val = (n), \
246 .pre_div_val = BVAL(14, 12, (pre_div)), \
247 .post_div_val = BVAL(9, 8, (post_div)), \
248 .vco_val = BVAL(21, 20, (vco)), \
249 }
Tianyi Gou389ba432012-10-01 13:58:38 -0700250
251#define VDD_DIG_FMAX_MAP1(l1, f1) \
Saravana Kannan55e959d2012-10-15 22:16:04 -0700252 .vdd_class = &vdd_dig, \
253 .fmax = (unsigned long[VDD_DIG_NUM]) { \
254 [VDD_DIG_##l1] = (f1), \
255 }, \
256 .num_fmax = VDD_DIG_NUM
Tianyi Gou389ba432012-10-01 13:58:38 -0700257#define VDD_DIG_FMAX_MAP2(l1, f1, l2, f2) \
Saravana Kannan55e959d2012-10-15 22:16:04 -0700258 .vdd_class = &vdd_dig, \
259 .fmax = (unsigned long[VDD_DIG_NUM]) { \
260 [VDD_DIG_##l1] = (f1), \
261 [VDD_DIG_##l2] = (f2), \
262 }, \
263 .num_fmax = VDD_DIG_NUM
Tianyi Gou389ba432012-10-01 13:58:38 -0700264#define VDD_DIG_FMAX_MAP3(l1, f1, l2, f2, l3, f3) \
Saravana Kannan55e959d2012-10-15 22:16:04 -0700265 .vdd_class = &vdd_dig, \
266 .fmax = (unsigned long[VDD_DIG_NUM]) { \
267 [VDD_DIG_##l1] = (f1), \
268 [VDD_DIG_##l2] = (f2), \
269 [VDD_DIG_##l3] = (f3), \
270 }, \
271 .num_fmax = VDD_DIG_NUM
Tianyi Gou389ba432012-10-01 13:58:38 -0700272
273enum vdd_dig_levels {
274 VDD_DIG_NONE,
275 VDD_DIG_LOW,
276 VDD_DIG_NOMINAL,
Saravana Kannan55e959d2012-10-15 22:16:04 -0700277 VDD_DIG_HIGH,
278 VDD_DIG_NUM
Tianyi Gou389ba432012-10-01 13:58:38 -0700279};
280
281static const int vdd_corner[] = {
282 [VDD_DIG_NONE] = RPM_REGULATOR_CORNER_NONE,
283 [VDD_DIG_LOW] = RPM_REGULATOR_CORNER_SVS_SOC,
284 [VDD_DIG_NOMINAL] = RPM_REGULATOR_CORNER_NORMAL,
285 [VDD_DIG_HIGH] = RPM_REGULATOR_CORNER_SUPER_TURBO,
286};
287
288static struct regulator *vdd_dig_reg;
289
290int set_vdd_dig(struct clk_vdd_class *vdd_class, int level)
291{
292 return regulator_set_voltage(vdd_dig_reg, vdd_corner[level],
293 RPM_REGULATOR_CORNER_SUPER_TURBO);
294}
295
Saravana Kannan55e959d2012-10-15 22:16:04 -0700296static DEFINE_VDD_CLASS(vdd_dig, set_vdd_dig, VDD_DIG_NUM);
Tianyi Gou389ba432012-10-01 13:58:38 -0700297
298/* TODO: Needs to confirm the below values */
299#define RPM_MISC_CLK_TYPE 0x306b6c63
300#define RPM_BUS_CLK_TYPE 0x316b6c63
301#define RPM_MEM_CLK_TYPE 0x326b6c63
302
303#define RPM_SMD_KEY_ENABLE 0x62616E45
304
305#define CXO_ID 0x0
306#define QDSS_ID 0x1
307
308#define PNOC_ID 0x0
309#define SNOC_ID 0x1
310#define CNOC_ID 0x2
311
312#define BIMC_ID 0x0
313
314#define D0_ID 1
315#define D1_ID 2
316#define A0_ID 3
317#define A1_ID 4
318#define A2_ID 5
319
320DEFINE_CLK_RPM_SMD_BRANCH(cxo_clk_src, cxo_a_clk_src,
321 RPM_MISC_CLK_TYPE, CXO_ID, 19200000);
322
323DEFINE_CLK_RPM_SMD(cnoc_clk, cnoc_a_clk, RPM_BUS_CLK_TYPE, CNOC_ID, NULL);
324DEFINE_CLK_RPM_SMD(pnoc_clk, pnoc_a_clk, RPM_BUS_CLK_TYPE, PNOC_ID, NULL);
325DEFINE_CLK_RPM_SMD(snoc_clk, snoc_a_clk, RPM_BUS_CLK_TYPE, SNOC_ID, NULL);
326
327DEFINE_CLK_RPM_SMD(bimc_clk, bimc_a_clk, RPM_MEM_CLK_TYPE, BIMC_ID, NULL);
328
329DEFINE_CLK_RPM_SMD_QDSS(qdss_clk, qdss_a_clk, RPM_MISC_CLK_TYPE, QDSS_ID);
330
331DEFINE_CLK_RPM_SMD_XO_BUFFER(cxo_d0, cxo_d0_a, D0_ID);
332DEFINE_CLK_RPM_SMD_XO_BUFFER(cxo_d1, cxo_d1_a, D1_ID);
333DEFINE_CLK_RPM_SMD_XO_BUFFER(cxo_a0, cxo_a0_a, A0_ID);
334DEFINE_CLK_RPM_SMD_XO_BUFFER(cxo_a1, cxo_a1_a, A1_ID);
335DEFINE_CLK_RPM_SMD_XO_BUFFER(cxo_a2, cxo_a2_a, A2_ID);
336
337DEFINE_CLK_RPM_SMD_XO_BUFFER_PINCTRL(cxo_d0_pin, cxo_d0_a_pin, D0_ID);
338DEFINE_CLK_RPM_SMD_XO_BUFFER_PINCTRL(cxo_d1_pin, cxo_d1_a_pin, D1_ID);
339DEFINE_CLK_RPM_SMD_XO_BUFFER_PINCTRL(cxo_a0_pin, cxo_a0_a_pin, A0_ID);
340DEFINE_CLK_RPM_SMD_XO_BUFFER_PINCTRL(cxo_a1_pin, cxo_a1_a_pin, A1_ID);
341DEFINE_CLK_RPM_SMD_XO_BUFFER_PINCTRL(cxo_a2_pin, cxo_a2_a_pin, A2_ID);
342
Tianyi Gou27df1bb2012-10-11 14:44:01 -0700343static unsigned int soft_vote_gpll0;
344
Tianyi Gou389ba432012-10-01 13:58:38 -0700345static struct pll_vote_clk gpll0_clk_src = {
346 .en_reg = (void __iomem *)APCS_GPLL_ENA_VOTE_REG,
347 .status_reg = (void __iomem *)GPLL0_STATUS_REG,
348 .status_mask = BIT(17),
Tianyi Gou27df1bb2012-10-11 14:44:01 -0700349 .soft_vote = &soft_vote_gpll0,
350 .soft_vote_mask = PLL_SOFT_VOTE_PRIMARY,
Tianyi Gou389ba432012-10-01 13:58:38 -0700351 .base = &virt_bases[GCC_BASE],
352 .c = {
Saravana Kannan7a6532e2012-10-18 20:51:13 -0700353 .parent = &cxo_clk_src.c,
Tianyi Gou389ba432012-10-01 13:58:38 -0700354 .rate = 600000000,
355 .dbg_name = "gpll0_clk_src",
Tianyi Gou27df1bb2012-10-11 14:44:01 -0700356 .ops = &clk_ops_pll_acpu_vote,
Tianyi Gou389ba432012-10-01 13:58:38 -0700357 CLK_INIT(gpll0_clk_src.c),
358 },
359};
360
Tianyi Gou27df1bb2012-10-11 14:44:01 -0700361static struct pll_vote_clk gpll0_activeonly_clk_src = {
362 .en_reg = (void __iomem *)APCS_GPLL_ENA_VOTE_REG,
363 .status_reg = (void __iomem *)GPLL0_STATUS_REG,
364 .status_mask = BIT(17),
365 .soft_vote = &soft_vote_gpll0,
366 .soft_vote_mask = PLL_SOFT_VOTE_ACPU,
367 .base = &virt_bases[GCC_BASE],
368 .c = {
369 .rate = 600000000,
370 .dbg_name = "gpll0_activeonly_clk_src",
371 .ops = &clk_ops_pll_acpu_vote,
372 CLK_INIT(gpll0_activeonly_clk_src.c),
373 },
374};
375
Tianyi Gou389ba432012-10-01 13:58:38 -0700376static struct pll_vote_clk gpll1_clk_src = {
377 .en_reg = (void __iomem *)APCS_GPLL_ENA_VOTE_REG,
378 .en_mask = BIT(1),
379 .status_reg = (void __iomem *)GPLL1_STATUS_REG,
380 .status_mask = BIT(17),
Tianyi Gou389ba432012-10-01 13:58:38 -0700381 .base = &virt_bases[GCC_BASE],
382 .c = {
Saravana Kannan7a6532e2012-10-18 20:51:13 -0700383 .parent = &cxo_clk_src.c,
Tianyi Gou389ba432012-10-01 13:58:38 -0700384 .rate = 480000000,
385 .dbg_name = "gpll1_clk_src",
386 .ops = &clk_ops_pll_vote,
387 CLK_INIT(gpll1_clk_src.c),
388 },
389};
390
Tianyi Goua717ddd2012-10-05 17:06:24 -0700391static struct pll_freq_tbl apcs_pll_freq[] = {
392 F_APCS_PLL(748800000, 0x27, 0x0, 0x1, 0x0, 0x0, 0x0),
393 F_APCS_PLL(998400000, 0x34, 0x0, 0x1, 0x0, 0x0, 0x0),
394 PLL_F_END
395};
396
Tianyi Gou389ba432012-10-01 13:58:38 -0700397/*
398 * Need to skip handoff of the acpu pll to avoid handoff code
399 * to turn off the pll when the acpu is running off this pll.
400 */
401static struct pll_clk apcspll_clk_src = {
402 .mode_reg = (void __iomem *)APCS_CPU_PLL_MODE_REG,
Tianyi Goua717ddd2012-10-05 17:06:24 -0700403 .l_reg = (void __iomem *)APCS_CPU_PLL_L_REG,
404 .m_reg = (void __iomem *)APCS_CPU_PLL_M_REG,
405 .n_reg = (void __iomem *)APCS_CPU_PLL_N_REG,
406 .config_reg = (void __iomem *)APCS_CPU_PLL_USER_CTL_REG,
Tianyi Gou389ba432012-10-01 13:58:38 -0700407 .status_reg = (void __iomem *)APCS_CPU_PLL_STATUS_REG,
Tianyi Goua717ddd2012-10-05 17:06:24 -0700408 .freq_tbl = apcs_pll_freq,
409 .masks = {
410 .vco_mask = BM(21, 20),
411 .pre_div_mask = BM(14, 12),
412 .post_div_mask = BM(9, 8),
413 .mn_en_mask = BIT(24),
414 .main_output_mask = BIT(0),
415 },
Tianyi Gou389ba432012-10-01 13:58:38 -0700416 .base = &virt_bases[APCS_PLL_BASE],
417 .c = {
Tianyi Gou389ba432012-10-01 13:58:38 -0700418 .dbg_name = "apcspll_clk_src",
419 .ops = &clk_ops_local_pll,
420 CLK_INIT(apcspll_clk_src.c),
421 .flags = CLKFLAG_SKIP_HANDOFF,
422 },
423};
424
425static DEFINE_CLK_VOTER(pnoc_msmbus_clk, &pnoc_clk.c, LONG_MAX);
426static DEFINE_CLK_VOTER(snoc_msmbus_clk, &snoc_clk.c, LONG_MAX);
427static DEFINE_CLK_VOTER(cnoc_msmbus_clk, &cnoc_clk.c, LONG_MAX);
428static DEFINE_CLK_VOTER(pnoc_msmbus_a_clk, &pnoc_a_clk.c, LONG_MAX);
429static DEFINE_CLK_VOTER(snoc_msmbus_a_clk, &snoc_a_clk.c, LONG_MAX);
430static DEFINE_CLK_VOTER(cnoc_msmbus_a_clk, &cnoc_a_clk.c, LONG_MAX);
431
432static DEFINE_CLK_VOTER(bimc_msmbus_clk, &bimc_clk.c, LONG_MAX);
433static DEFINE_CLK_VOTER(bimc_msmbus_a_clk, &bimc_a_clk.c, LONG_MAX);
434
435static DEFINE_CLK_VOTER(pnoc_sdcc2_clk, &pnoc_clk.c, LONG_MAX);
436static DEFINE_CLK_VOTER(pnoc_sdcc3_clk, &pnoc_clk.c, LONG_MAX);
437
438static DEFINE_CLK_VOTER(pnoc_sps_clk, &pnoc_clk.c, LONG_MAX);
439
440static struct clk_freq_tbl ftbl_gcc_ipa_clk[] = {
441 F( 50000000, gpll0, 12, 0, 0),
442 F( 92310000, gpll0, 6.5, 0, 0),
443 F(100000000, gpll0, 6, 0, 0),
444 F_END
445};
446
447static struct rcg_clk ipa_clk_src = {
448 .cmd_rcgr_reg = IPA_CMD_RCGR,
449 .set_rate = set_rate_mnd,
450 .freq_tbl = ftbl_gcc_ipa_clk,
451 .current_freq = &rcg_dummy_freq,
452 .base = &virt_bases[GCC_BASE],
453 .c = {
454 .dbg_name = "ipa_clk_src",
455 .ops = &clk_ops_rcg_mnd,
456 VDD_DIG_FMAX_MAP2(LOW, 50000000, NOMINAL, 100000000),
457 CLK_INIT(ipa_clk_src.c)
458 },
459};
460
Tianyi Goub1d13972013-01-23 22:55:22 -0800461static struct clk_freq_tbl ftbl_gcc_blsp1_qup1_6_i2c_apps_clk[] = {
462 F(19200000, cxo, 1, 0, 0),
463 F(50000000, gpll0, 12, 0, 0),
464 F_END
465};
466
467static struct rcg_clk blsp1_qup1_i2c_apps_clk_src = {
468 .cmd_rcgr_reg = BLSP1_QUP1_I2C_APPS_CMD_RCGR,
469 .set_rate = set_rate_hid,
470 .freq_tbl = ftbl_gcc_blsp1_qup1_6_i2c_apps_clk,
471 .current_freq = &rcg_dummy_freq,
472 .base = &virt_bases[GCC_BASE],
473 .c = {
474 .dbg_name = "blsp1_qup1_i2c_apps_clk_src",
475 .ops = &clk_ops_rcg,
476 VDD_DIG_FMAX_MAP1(LOW, 50000000),
477 CLK_INIT(blsp1_qup1_i2c_apps_clk_src.c),
478 },
479};
480
481static struct rcg_clk blsp1_qup2_i2c_apps_clk_src = {
482 .cmd_rcgr_reg = BLSP1_QUP2_I2C_APPS_CMD_RCGR,
483 .set_rate = set_rate_hid,
484 .freq_tbl = ftbl_gcc_blsp1_qup1_6_i2c_apps_clk,
485 .current_freq = &rcg_dummy_freq,
486 .base = &virt_bases[GCC_BASE],
487 .c = {
488 .dbg_name = "blsp1_qup2_i2c_apps_clk_src",
489 .ops = &clk_ops_rcg,
490 VDD_DIG_FMAX_MAP1(LOW, 50000000),
491 CLK_INIT(blsp1_qup2_i2c_apps_clk_src.c),
492 },
493};
494
495static struct rcg_clk blsp1_qup3_i2c_apps_clk_src = {
496 .cmd_rcgr_reg = BLSP1_QUP3_I2C_APPS_CMD_RCGR,
497 .set_rate = set_rate_hid,
498 .freq_tbl = ftbl_gcc_blsp1_qup1_6_i2c_apps_clk,
499 .current_freq = &rcg_dummy_freq,
500 .base = &virt_bases[GCC_BASE],
501 .c = {
502 .dbg_name = "blsp1_qup3_i2c_apps_clk_src",
503 .ops = &clk_ops_rcg,
504 VDD_DIG_FMAX_MAP1(LOW, 50000000),
505 CLK_INIT(blsp1_qup3_i2c_apps_clk_src.c),
506 },
507};
508
509static struct rcg_clk blsp1_qup4_i2c_apps_clk_src = {
510 .cmd_rcgr_reg = BLSP1_QUP4_I2C_APPS_CMD_RCGR,
511 .set_rate = set_rate_hid,
512 .freq_tbl = ftbl_gcc_blsp1_qup1_6_i2c_apps_clk,
513 .current_freq = &rcg_dummy_freq,
514 .base = &virt_bases[GCC_BASE],
515 .c = {
516 .dbg_name = "blsp1_qup4_i2c_apps_clk_src",
517 .ops = &clk_ops_rcg,
518 VDD_DIG_FMAX_MAP1(LOW, 50000000),
519 CLK_INIT(blsp1_qup4_i2c_apps_clk_src.c),
520 },
521};
522
523static struct rcg_clk blsp1_qup5_i2c_apps_clk_src = {
524 .cmd_rcgr_reg = BLSP1_QUP5_I2C_APPS_CMD_RCGR,
525 .set_rate = set_rate_hid,
526 .freq_tbl = ftbl_gcc_blsp1_qup1_6_i2c_apps_clk,
527 .current_freq = &rcg_dummy_freq,
528 .base = &virt_bases[GCC_BASE],
529 .c = {
530 .dbg_name = "blsp1_qup5_i2c_apps_clk_src",
531 .ops = &clk_ops_rcg,
532 VDD_DIG_FMAX_MAP1(LOW, 50000000),
533 CLK_INIT(blsp1_qup5_i2c_apps_clk_src.c),
534 },
535};
536
537static struct rcg_clk blsp1_qup6_i2c_apps_clk_src = {
538 .cmd_rcgr_reg = BLSP1_QUP6_I2C_APPS_CMD_RCGR,
539 .set_rate = set_rate_hid,
540 .freq_tbl = ftbl_gcc_blsp1_qup1_6_i2c_apps_clk,
541 .current_freq = &rcg_dummy_freq,
542 .base = &virt_bases[GCC_BASE],
543 .c = {
544 .dbg_name = "blsp1_qup6_i2c_apps_clk_src",
545 .ops = &clk_ops_rcg,
546 VDD_DIG_FMAX_MAP1(LOW, 50000000),
547 CLK_INIT(blsp1_qup6_i2c_apps_clk_src.c),
548 },
549};
550
Tianyi Gou389ba432012-10-01 13:58:38 -0700551static struct clk_freq_tbl ftbl_gcc_blsp1_qup1_6_spi_apps_clk[] = {
552 F( 960000, cxo, 10, 1, 2),
553 F( 4800000, cxo, 4, 0, 0),
554 F( 9600000, cxo, 2, 0, 0),
555 F(15000000, gpll0, 10, 1, 4),
556 F(19200000, cxo, 1, 0, 0),
557 F(25000000, gpll0, 12, 1, 2),
558 F(50000000, gpll0, 12, 0, 0),
559 F_END
560};
561
562static struct rcg_clk blsp1_qup1_spi_apps_clk_src = {
563 .cmd_rcgr_reg = BLSP1_QUP1_SPI_APPS_CMD_RCGR,
564 .set_rate = set_rate_mnd,
565 .freq_tbl = ftbl_gcc_blsp1_qup1_6_spi_apps_clk,
566 .current_freq = &rcg_dummy_freq,
567 .base = &virt_bases[GCC_BASE],
568 .c = {
569 .dbg_name = "blsp1_qup1_spi_apps_clk_src",
570 .ops = &clk_ops_rcg_mnd,
571 VDD_DIG_FMAX_MAP2(LOW, 25000000, NOMINAL, 50000000),
572 CLK_INIT(blsp1_qup1_spi_apps_clk_src.c)
573 },
574};
575
576static struct rcg_clk blsp1_qup2_spi_apps_clk_src = {
577 .cmd_rcgr_reg = BLSP1_QUP2_SPI_APPS_CMD_RCGR,
578 .set_rate = set_rate_mnd,
579 .freq_tbl = ftbl_gcc_blsp1_qup1_6_spi_apps_clk,
580 .current_freq = &rcg_dummy_freq,
581 .base = &virt_bases[GCC_BASE],
582 .c = {
583 .dbg_name = "blsp1_qup2_spi_apps_clk_src",
584 .ops = &clk_ops_rcg_mnd,
585 VDD_DIG_FMAX_MAP2(LOW, 25000000, NOMINAL, 50000000),
586 CLK_INIT(blsp1_qup2_spi_apps_clk_src.c)
587 },
588};
589
590static struct rcg_clk blsp1_qup3_spi_apps_clk_src = {
591 .cmd_rcgr_reg = BLSP1_QUP3_SPI_APPS_CMD_RCGR,
592 .set_rate = set_rate_mnd,
593 .freq_tbl = ftbl_gcc_blsp1_qup1_6_spi_apps_clk,
594 .current_freq = &rcg_dummy_freq,
595 .base = &virt_bases[GCC_BASE],
596 .c = {
597 .dbg_name = "blsp1_qup3_spi_apps_clk_src",
598 .ops = &clk_ops_rcg_mnd,
599 VDD_DIG_FMAX_MAP2(LOW, 25000000, NOMINAL, 50000000),
600 CLK_INIT(blsp1_qup3_spi_apps_clk_src.c)
601 },
602};
603
604static struct rcg_clk blsp1_qup4_spi_apps_clk_src = {
605 .cmd_rcgr_reg = BLSP1_QUP4_SPI_APPS_CMD_RCGR,
606 .set_rate = set_rate_mnd,
607 .freq_tbl = ftbl_gcc_blsp1_qup1_6_spi_apps_clk,
608 .current_freq = &rcg_dummy_freq,
609 .base = &virt_bases[GCC_BASE],
610 .c = {
611 .dbg_name = "blsp1_qup4_spi_apps_clk_src",
612 .ops = &clk_ops_rcg_mnd,
613 VDD_DIG_FMAX_MAP2(LOW, 25000000, NOMINAL, 50000000),
614 CLK_INIT(blsp1_qup4_spi_apps_clk_src.c)
615 },
616};
617
618static struct rcg_clk blsp1_qup5_spi_apps_clk_src = {
619 .cmd_rcgr_reg = BLSP1_QUP5_SPI_APPS_CMD_RCGR,
620 .set_rate = set_rate_mnd,
621 .freq_tbl = ftbl_gcc_blsp1_qup1_6_spi_apps_clk,
622 .current_freq = &rcg_dummy_freq,
623 .base = &virt_bases[GCC_BASE],
624 .c = {
625 .dbg_name = "blsp1_qup5_spi_apps_clk_src",
626 .ops = &clk_ops_rcg_mnd,
627 VDD_DIG_FMAX_MAP2(LOW, 25000000, NOMINAL, 50000000),
628 CLK_INIT(blsp1_qup5_spi_apps_clk_src.c)
629 },
630};
631
632static struct rcg_clk blsp1_qup6_spi_apps_clk_src = {
633 .cmd_rcgr_reg = BLSP1_QUP6_SPI_APPS_CMD_RCGR,
634 .set_rate = set_rate_mnd,
635 .freq_tbl = ftbl_gcc_blsp1_qup1_6_spi_apps_clk,
636 .current_freq = &rcg_dummy_freq,
637 .base = &virt_bases[GCC_BASE],
638 .c = {
639 .dbg_name = "blsp1_qup6_spi_apps_clk_src",
640 .ops = &clk_ops_rcg_mnd,
641 VDD_DIG_FMAX_MAP2(LOW, 25000000, NOMINAL, 50000000),
642 CLK_INIT(blsp1_qup6_spi_apps_clk_src.c)
643 },
644};
645
646static struct clk_freq_tbl ftbl_gcc_blsp1_uart1_6_apps_clk[] = {
Vikram Mulukutlad3dca652012-11-19 11:04:13 -0800647 F_GCC_GND,
Tianyi Gou389ba432012-10-01 13:58:38 -0700648 F( 3686400, gpll0, 1, 96, 15625),
649 F( 7372800, gpll0, 1, 192, 15625),
650 F(14745600, gpll0, 1, 384, 15625),
651 F(16000000, gpll0, 5, 2, 15),
652 F(19200000, cxo, 1, 0, 0),
653 F(24000000, gpll0, 5, 1, 5),
654 F(32000000, gpll0, 1, 4, 75),
655 F(40000000, gpll0, 15, 0, 0),
656 F(46400000, gpll0, 1, 29, 375),
657 F(48000000, gpll0, 12.5, 0, 0),
658 F(51200000, gpll0, 1, 32, 375),
659 F(56000000, gpll0, 1, 7, 75),
660 F(58982400, gpll0, 1, 1536, 15625),
661 F(60000000, gpll0, 10, 0, 0),
662 F_END
663};
664
665static struct rcg_clk blsp1_uart1_apps_clk_src = {
666 .cmd_rcgr_reg = BLSP1_UART1_APPS_CMD_RCGR,
667 .set_rate = set_rate_mnd,
668 .freq_tbl = ftbl_gcc_blsp1_uart1_6_apps_clk,
669 .current_freq = &rcg_dummy_freq,
670 .base = &virt_bases[GCC_BASE],
671 .c = {
672 .dbg_name = "blsp1_uart1_apps_clk_src",
673 .ops = &clk_ops_rcg_mnd,
674 VDD_DIG_FMAX_MAP2(LOW, 31580000, NOMINAL, 63160000),
675 CLK_INIT(blsp1_uart1_apps_clk_src.c)
676 },
677};
678
679static struct rcg_clk blsp1_uart2_apps_clk_src = {
680 .cmd_rcgr_reg = BLSP1_UART2_APPS_CMD_RCGR,
681 .set_rate = set_rate_mnd,
682 .freq_tbl = ftbl_gcc_blsp1_uart1_6_apps_clk,
683 .current_freq = &rcg_dummy_freq,
684 .base = &virt_bases[GCC_BASE],
685 .c = {
686 .dbg_name = "blsp1_uart2_apps_clk_src",
687 .ops = &clk_ops_rcg_mnd,
688 VDD_DIG_FMAX_MAP2(LOW, 31580000, NOMINAL, 63160000),
689 CLK_INIT(blsp1_uart2_apps_clk_src.c)
690 },
691};
692
693static struct rcg_clk blsp1_uart3_apps_clk_src = {
694 .cmd_rcgr_reg = BLSP1_UART3_APPS_CMD_RCGR,
695 .set_rate = set_rate_mnd,
696 .freq_tbl = ftbl_gcc_blsp1_uart1_6_apps_clk,
697 .current_freq = &rcg_dummy_freq,
698 .base = &virt_bases[GCC_BASE],
699 .c = {
700 .dbg_name = "blsp1_uart3_apps_clk_src",
701 .ops = &clk_ops_rcg_mnd,
702 VDD_DIG_FMAX_MAP2(LOW, 31580000, NOMINAL, 63160000),
703 CLK_INIT(blsp1_uart3_apps_clk_src.c)
704 },
705};
706
707static struct rcg_clk blsp1_uart4_apps_clk_src = {
708 .cmd_rcgr_reg = BLSP1_UART4_APPS_CMD_RCGR,
709 .set_rate = set_rate_mnd,
710 .freq_tbl = ftbl_gcc_blsp1_uart1_6_apps_clk,
711 .current_freq = &rcg_dummy_freq,
712 .base = &virt_bases[GCC_BASE],
713 .c = {
714 .dbg_name = "blsp1_uart4_apps_clk_src",
715 .ops = &clk_ops_rcg_mnd,
716 VDD_DIG_FMAX_MAP2(LOW, 31580000, NOMINAL, 63160000),
717 CLK_INIT(blsp1_uart4_apps_clk_src.c)
718 },
719};
720
721static struct rcg_clk blsp1_uart5_apps_clk_src = {
722 .cmd_rcgr_reg = BLSP1_UART5_APPS_CMD_RCGR,
723 .set_rate = set_rate_mnd,
724 .freq_tbl = ftbl_gcc_blsp1_uart1_6_apps_clk,
725 .current_freq = &rcg_dummy_freq,
726 .base = &virt_bases[GCC_BASE],
727 .c = {
728 .dbg_name = "blsp1_uart5_apps_clk_src",
729 .ops = &clk_ops_rcg_mnd,
730 VDD_DIG_FMAX_MAP2(LOW, 31580000, NOMINAL, 63160000),
731 CLK_INIT(blsp1_uart5_apps_clk_src.c)
732 },
733};
734
735static struct rcg_clk blsp1_uart6_apps_clk_src = {
736 .cmd_rcgr_reg = BLSP1_UART6_APPS_CMD_RCGR,
737 .set_rate = set_rate_mnd,
738 .freq_tbl = ftbl_gcc_blsp1_uart1_6_apps_clk,
739 .current_freq = &rcg_dummy_freq,
740 .base = &virt_bases[GCC_BASE],
741 .c = {
742 .dbg_name = "blsp1_uart6_apps_clk_src",
743 .ops = &clk_ops_rcg_mnd,
744 VDD_DIG_FMAX_MAP2(LOW, 31580000, NOMINAL, 63160000),
745 CLK_INIT(blsp1_uart6_apps_clk_src.c)
746 },
747};
748
749static struct clk_freq_tbl ftbl_gcc_ce1_clk[] = {
750 F( 50000000, gpll0, 12, 0, 0),
751 F(100000000, gpll0, 6, 0, 0),
752 F_END
753};
754
755static struct rcg_clk ce1_clk_src = {
756 .cmd_rcgr_reg = CE1_CMD_RCGR,
757 .set_rate = set_rate_hid,
758 .freq_tbl = ftbl_gcc_ce1_clk,
759 .current_freq = &rcg_dummy_freq,
760 .base = &virt_bases[GCC_BASE],
761 .c = {
762 .dbg_name = "ce1_clk_src",
763 .ops = &clk_ops_rcg,
764 VDD_DIG_FMAX_MAP2(LOW, 50000000, NOMINAL, 100000000),
765 CLK_INIT(ce1_clk_src.c),
766 },
767};
768
769static struct clk_freq_tbl ftbl_gcc_gp_clk[] = {
770 F(19200000, cxo, 1, 0, 0),
771 F_END
772};
773
774static struct rcg_clk gp1_clk_src = {
775 .cmd_rcgr_reg = GP1_CMD_RCGR,
776 .set_rate = set_rate_mnd,
777 .freq_tbl = ftbl_gcc_gp_clk,
778 .current_freq = &rcg_dummy_freq,
779 .base = &virt_bases[GCC_BASE],
780 .c = {
781 .dbg_name = "gp1_clk_src",
782 .ops = &clk_ops_rcg_mnd,
783 VDD_DIG_FMAX_MAP2(LOW, 100000000, NOMINAL, 200000000),
784 CLK_INIT(gp1_clk_src.c)
785 },
786};
787
788static struct rcg_clk gp2_clk_src = {
789 .cmd_rcgr_reg = GP2_CMD_RCGR,
790 .set_rate = set_rate_mnd,
791 .freq_tbl = ftbl_gcc_gp_clk,
792 .current_freq = &rcg_dummy_freq,
793 .base = &virt_bases[GCC_BASE],
794 .c = {
795 .dbg_name = "gp2_clk_src",
796 .ops = &clk_ops_rcg_mnd,
797 VDD_DIG_FMAX_MAP2(LOW, 100000000, NOMINAL, 200000000),
798 CLK_INIT(gp2_clk_src.c)
799 },
800};
801
802static struct rcg_clk gp3_clk_src = {
803 .cmd_rcgr_reg = GP3_CMD_RCGR,
804 .set_rate = set_rate_mnd,
805 .freq_tbl = ftbl_gcc_gp_clk,
806 .current_freq = &rcg_dummy_freq,
807 .base = &virt_bases[GCC_BASE],
808 .c = {
809 .dbg_name = "gp3_clk_src",
810 .ops = &clk_ops_rcg_mnd,
811 VDD_DIG_FMAX_MAP2(LOW, 100000000, NOMINAL, 200000000),
812 CLK_INIT(gp3_clk_src.c)
813 },
814};
815
816static struct clk_freq_tbl ftbl_gcc_pdm2_clk[] = {
817 F(60000000, gpll0, 10, 0, 0),
818 F_END
819};
820
821static struct rcg_clk pdm2_clk_src = {
822 .cmd_rcgr_reg = PDM2_CMD_RCGR,
823 .set_rate = set_rate_hid,
824 .freq_tbl = ftbl_gcc_pdm2_clk,
825 .current_freq = &rcg_dummy_freq,
826 .base = &virt_bases[GCC_BASE],
827 .c = {
828 .dbg_name = "pdm2_clk_src",
829 .ops = &clk_ops_rcg,
830 VDD_DIG_FMAX_MAP1(LOW, 60000000),
831 CLK_INIT(pdm2_clk_src.c),
832 },
833};
834
835static struct clk_freq_tbl ftbl_gcc_qpic_clk[] = {
836 F( 50000000, gpll0, 12, 0, 0),
837 F(100000000, gpll0, 6, 0, 0),
838 F_END
839};
840
841static struct rcg_clk qpic_clk_src = {
842 .cmd_rcgr_reg = QPIC_CMD_RCGR,
843 .set_rate = set_rate_mnd,
844 .freq_tbl = ftbl_gcc_qpic_clk,
845 .current_freq = &rcg_dummy_freq,
846 .base = &virt_bases[GCC_BASE],
847 .c = {
848 .dbg_name = "qpic_clk_src",
849 .ops = &clk_ops_rcg_mnd,
850 VDD_DIG_FMAX_MAP2(LOW, 50000000, NOMINAL, 100000000),
851 CLK_INIT(qpic_clk_src.c)
852 },
853};
854
855static struct clk_freq_tbl ftbl_gcc_sdcc2_apps_clk[] = {
856 F( 144000, cxo, 16, 3, 25),
857 F( 400000, cxo, 12, 1, 4),
858 F( 20000000, gpll0, 15, 1, 2),
859 F( 25000000, gpll0, 12, 1, 2),
860 F( 50000000, gpll0, 12, 0, 0),
861 F(100000000, gpll0, 6, 0, 0),
862 F(200000000, gpll0, 3, 0, 0),
863 F_END
864};
865
866static struct clk_freq_tbl ftbl_gcc_sdcc3_apps_clk[] = {
867 F( 144000, cxo, 16, 3, 25),
868 F( 400000, cxo, 12, 1, 4),
869 F( 20000000, gpll0, 15, 1, 2),
870 F( 25000000, gpll0, 12, 1, 2),
871 F( 50000000, gpll0, 12, 0, 0),
872 F(100000000, gpll0, 6, 0, 0),
873 F_END
874};
875
876static struct rcg_clk sdcc2_apps_clk_src = {
877 .cmd_rcgr_reg = SDCC2_APPS_CMD_RCGR,
878 .set_rate = set_rate_mnd,
879 .freq_tbl = ftbl_gcc_sdcc2_apps_clk,
880 .current_freq = &rcg_dummy_freq,
881 .base = &virt_bases[GCC_BASE],
882 .c = {
883 .dbg_name = "sdcc2_apps_clk_src",
884 .ops = &clk_ops_rcg_mnd,
885 VDD_DIG_FMAX_MAP2(LOW, 100000000, NOMINAL, 200000000),
886 CLK_INIT(sdcc2_apps_clk_src.c)
887 },
888};
889
890static struct rcg_clk sdcc3_apps_clk_src = {
891 .cmd_rcgr_reg = SDCC3_APPS_CMD_RCGR,
892 .set_rate = set_rate_mnd,
893 .freq_tbl = ftbl_gcc_sdcc3_apps_clk,
894 .current_freq = &rcg_dummy_freq,
895 .base = &virt_bases[GCC_BASE],
896 .c = {
897 .dbg_name = "sdcc3_apps_clk_src",
898 .ops = &clk_ops_rcg_mnd,
899 VDD_DIG_FMAX_MAP2(LOW, 50000000, NOMINAL, 100000000),
900 CLK_INIT(sdcc3_apps_clk_src.c)
901 },
902};
903
904static struct clk_freq_tbl ftbl_gcc_usb_hs_system_clk[] = {
905 F(75000000, gpll0, 8, 0, 0),
906 F_END
907};
908
909static struct rcg_clk usb_hs_system_clk_src = {
910 .cmd_rcgr_reg = USB_HS_SYSTEM_CMD_RCGR,
911 .set_rate = set_rate_hid,
912 .freq_tbl = ftbl_gcc_usb_hs_system_clk,
913 .current_freq = &rcg_dummy_freq,
914 .base = &virt_bases[GCC_BASE],
915 .c = {
916 .dbg_name = "usb_hs_system_clk_src",
917 .ops = &clk_ops_rcg,
918 VDD_DIG_FMAX_MAP2(LOW, 37500000, NOMINAL, 75000000),
919 CLK_INIT(usb_hs_system_clk_src.c),
920 },
921};
922
923static struct clk_freq_tbl ftbl_gcc_usb_hsic_clk[] = {
924 F_HSIC(480000000, gpll1, 1, 0, 0),
925 F_END
926};
927
928static struct rcg_clk usb_hsic_clk_src = {
929 .cmd_rcgr_reg = USB_HSIC_CMD_RCGR,
930 .set_rate = set_rate_hid,
931 .freq_tbl = ftbl_gcc_usb_hsic_clk,
932 .current_freq = &rcg_dummy_freq,
933 .base = &virt_bases[GCC_BASE],
934 .c = {
935 .dbg_name = "usb_hsic_clk_src",
936 .ops = &clk_ops_rcg,
937 VDD_DIG_FMAX_MAP1(LOW, 480000000),
938 CLK_INIT(usb_hsic_clk_src.c),
939 },
940};
941
942static struct clk_freq_tbl ftbl_gcc_usb_hsic_io_cal_clk[] = {
943 F(9600000, cxo, 2, 0, 0),
944 F_END
945};
946
947static struct rcg_clk usb_hsic_io_cal_clk_src = {
948 .cmd_rcgr_reg = USB_HSIC_IO_CAL_CMD_RCGR,
949 .set_rate = set_rate_hid,
950 .freq_tbl = ftbl_gcc_usb_hsic_io_cal_clk,
951 .current_freq = &rcg_dummy_freq,
952 .base = &virt_bases[GCC_BASE],
953 .c = {
954 .dbg_name = "usb_hsic_io_cal_clk_src",
955 .ops = &clk_ops_rcg,
956 VDD_DIG_FMAX_MAP1(LOW, 9600000),
957 CLK_INIT(usb_hsic_io_cal_clk_src.c),
958 },
959};
960
961static struct clk_freq_tbl ftbl_gcc_usb_hsic_system_clk[] = {
962 F(75000000, gpll0, 8, 0, 0),
963 F_END
964};
965
966static struct rcg_clk usb_hsic_system_clk_src = {
967 .cmd_rcgr_reg = USB_HSIC_SYSTEM_CMD_RCGR,
968 .set_rate = set_rate_hid,
969 .freq_tbl = ftbl_gcc_usb_hsic_system_clk,
970 .current_freq = &rcg_dummy_freq,
971 .base = &virt_bases[GCC_BASE],
972 .c = {
973 .dbg_name = "usb_hsic_system_clk_src",
974 .ops = &clk_ops_rcg,
975 VDD_DIG_FMAX_MAP2(LOW, 60000000, NOMINAL, 75000000),
976 CLK_INIT(usb_hsic_system_clk_src.c),
977 },
978};
979
980static struct clk_freq_tbl ftbl_gcc_usb_hsic_xcvr_fs_clk[] = {
981 F(60000000, gpll0, 10, 0, 0),
982 F_END
983};
984
985static struct rcg_clk usb_hsic_xcvr_fs_clk_src = {
986 .cmd_rcgr_reg = USB_HSIC_XCVR_FS_CMD_RCGR,
987 .set_rate = set_rate_hid,
988 .freq_tbl = ftbl_gcc_usb_hsic_xcvr_fs_clk,
989 .current_freq = &rcg_dummy_freq,
990 .base = &virt_bases[GCC_BASE],
991 .c = {
992 .dbg_name = "usb_hsic_xcvr_fs_clk_src",
993 .ops = &clk_ops_rcg,
994 VDD_DIG_FMAX_MAP1(LOW, 60000000),
995 CLK_INIT(usb_hsic_xcvr_fs_clk_src.c),
996 },
997};
998
999static struct local_vote_clk gcc_bam_dma_ahb_clk = {
1000 .cbcr_reg = BAM_DMA_AHB_CBCR,
1001 .vote_reg = APCS_CLOCK_BRANCH_ENA_VOTE,
1002 .en_mask = BIT(12),
1003 .base = &virt_bases[GCC_BASE],
1004 .c = {
1005 .dbg_name = "gcc_bam_dma_ahb_clk",
1006 .ops = &clk_ops_vote,
1007 CLK_INIT(gcc_bam_dma_ahb_clk.c),
1008 },
1009};
1010
1011static struct local_vote_clk gcc_blsp1_ahb_clk = {
1012 .cbcr_reg = BLSP1_AHB_CBCR,
1013 .vote_reg = APCS_CLOCK_BRANCH_ENA_VOTE,
1014 .en_mask = BIT(17),
1015 .base = &virt_bases[GCC_BASE],
1016 .c = {
1017 .dbg_name = "gcc_blsp1_ahb_clk",
1018 .ops = &clk_ops_vote,
1019 CLK_INIT(gcc_blsp1_ahb_clk.c),
1020 },
1021};
1022
1023static struct branch_clk gcc_blsp1_qup1_i2c_apps_clk = {
1024 .cbcr_reg = BLSP1_QUP1_I2C_APPS_CBCR,
Tianyi Gou389ba432012-10-01 13:58:38 -07001025 .base = &virt_bases[GCC_BASE],
1026 .c = {
Saravana Kannan7a6532e2012-10-18 20:51:13 -07001027 .parent = &cxo_clk_src.c,
Tianyi Gou389ba432012-10-01 13:58:38 -07001028 .dbg_name = "gcc_blsp1_qup1_i2c_apps_clk",
1029 .ops = &clk_ops_branch,
1030 CLK_INIT(gcc_blsp1_qup1_i2c_apps_clk.c),
1031 },
1032};
1033
1034static struct branch_clk gcc_blsp1_qup1_spi_apps_clk = {
1035 .cbcr_reg = BLSP1_QUP1_SPI_APPS_CBCR,
Tianyi Gou389ba432012-10-01 13:58:38 -07001036 .has_sibling = 0,
1037 .base = &virt_bases[GCC_BASE],
1038 .c = {
Saravana Kannan7a6532e2012-10-18 20:51:13 -07001039 .parent = &blsp1_qup1_spi_apps_clk_src.c,
Tianyi Gou389ba432012-10-01 13:58:38 -07001040 .dbg_name = "gcc_blsp1_qup1_spi_apps_clk",
1041 .ops = &clk_ops_branch,
1042 CLK_INIT(gcc_blsp1_qup1_spi_apps_clk.c),
1043 },
1044};
1045
1046static struct branch_clk gcc_blsp1_qup2_i2c_apps_clk = {
1047 .cbcr_reg = BLSP1_QUP2_I2C_APPS_CBCR,
Tianyi Gou389ba432012-10-01 13:58:38 -07001048 .base = &virt_bases[GCC_BASE],
1049 .c = {
Saravana Kannan7a6532e2012-10-18 20:51:13 -07001050 .parent = &cxo_clk_src.c,
Tianyi Gou389ba432012-10-01 13:58:38 -07001051 .dbg_name = "gcc_blsp1_qup2_i2c_apps_clk",
1052 .ops = &clk_ops_branch,
1053 CLK_INIT(gcc_blsp1_qup2_i2c_apps_clk.c),
1054 },
1055};
1056
1057static struct branch_clk gcc_blsp1_qup2_spi_apps_clk = {
1058 .cbcr_reg = BLSP1_QUP2_SPI_APPS_CBCR,
Tianyi Gou389ba432012-10-01 13:58:38 -07001059 .has_sibling = 0,
1060 .base = &virt_bases[GCC_BASE],
1061 .c = {
Saravana Kannan7a6532e2012-10-18 20:51:13 -07001062 .parent = &blsp1_qup2_spi_apps_clk_src.c,
Tianyi Gou389ba432012-10-01 13:58:38 -07001063 .dbg_name = "gcc_blsp1_qup2_spi_apps_clk",
1064 .ops = &clk_ops_branch,
1065 CLK_INIT(gcc_blsp1_qup2_spi_apps_clk.c),
1066 },
1067};
1068
1069static struct branch_clk gcc_blsp1_qup3_i2c_apps_clk = {
1070 .cbcr_reg = BLSP1_QUP3_I2C_APPS_CBCR,
Tianyi Gou389ba432012-10-01 13:58:38 -07001071 .base = &virt_bases[GCC_BASE],
1072 .c = {
Saravana Kannan7a6532e2012-10-18 20:51:13 -07001073 .parent = &cxo_clk_src.c,
Tianyi Gou389ba432012-10-01 13:58:38 -07001074 .dbg_name = "gcc_blsp1_qup3_i2c_apps_clk",
1075 .ops = &clk_ops_branch,
1076 CLK_INIT(gcc_blsp1_qup3_i2c_apps_clk.c),
1077 },
1078};
1079
1080static struct branch_clk gcc_blsp1_qup3_spi_apps_clk = {
1081 .cbcr_reg = BLSP1_QUP3_SPI_APPS_CBCR,
Tianyi Gou389ba432012-10-01 13:58:38 -07001082 .has_sibling = 0,
1083 .base = &virt_bases[GCC_BASE],
1084 .c = {
Saravana Kannan7a6532e2012-10-18 20:51:13 -07001085 .parent = &blsp1_qup3_spi_apps_clk_src.c,
Tianyi Gou389ba432012-10-01 13:58:38 -07001086 .dbg_name = "gcc_blsp1_qup3_spi_apps_clk",
1087 .ops = &clk_ops_branch,
1088 CLK_INIT(gcc_blsp1_qup3_spi_apps_clk.c),
1089 },
1090};
1091
1092static struct branch_clk gcc_blsp1_qup4_i2c_apps_clk = {
1093 .cbcr_reg = BLSP1_QUP4_I2C_APPS_CBCR,
Tianyi Gou389ba432012-10-01 13:58:38 -07001094 .base = &virt_bases[GCC_BASE],
1095 .c = {
Saravana Kannan7a6532e2012-10-18 20:51:13 -07001096 .parent = &cxo_clk_src.c,
Tianyi Gou389ba432012-10-01 13:58:38 -07001097 .dbg_name = "gcc_blsp1_qup4_i2c_apps_clk",
1098 .ops = &clk_ops_branch,
1099 CLK_INIT(gcc_blsp1_qup4_i2c_apps_clk.c),
1100 },
1101};
1102
1103static struct branch_clk gcc_blsp1_qup4_spi_apps_clk = {
1104 .cbcr_reg = BLSP1_QUP4_SPI_APPS_CBCR,
Tianyi Gou389ba432012-10-01 13:58:38 -07001105 .has_sibling = 0,
1106 .base = &virt_bases[GCC_BASE],
1107 .c = {
Saravana Kannan7a6532e2012-10-18 20:51:13 -07001108 .parent = &blsp1_qup4_spi_apps_clk_src.c,
Tianyi Gou389ba432012-10-01 13:58:38 -07001109 .dbg_name = "gcc_blsp1_qup4_spi_apps_clk",
1110 .ops = &clk_ops_branch,
1111 CLK_INIT(gcc_blsp1_qup4_spi_apps_clk.c),
1112 },
1113};
1114
1115static struct branch_clk gcc_blsp1_qup5_i2c_apps_clk = {
1116 .cbcr_reg = BLSP1_QUP5_I2C_APPS_CBCR,
Tianyi Gou389ba432012-10-01 13:58:38 -07001117 .base = &virt_bases[GCC_BASE],
1118 .c = {
Saravana Kannan7a6532e2012-10-18 20:51:13 -07001119 .parent = &cxo_clk_src.c,
Tianyi Gou389ba432012-10-01 13:58:38 -07001120 .dbg_name = "gcc_blsp1_qup5_i2c_apps_clk",
1121 .ops = &clk_ops_branch,
1122 CLK_INIT(gcc_blsp1_qup5_i2c_apps_clk.c),
1123 },
1124};
1125
1126static struct branch_clk gcc_blsp1_qup5_spi_apps_clk = {
1127 .cbcr_reg = BLSP1_QUP5_SPI_APPS_CBCR,
Tianyi Gou389ba432012-10-01 13:58:38 -07001128 .has_sibling = 0,
1129 .base = &virt_bases[GCC_BASE],
1130 .c = {
Saravana Kannan7a6532e2012-10-18 20:51:13 -07001131 .parent = &blsp1_qup5_spi_apps_clk_src.c,
Tianyi Gou389ba432012-10-01 13:58:38 -07001132 .dbg_name = "gcc_blsp1_qup5_spi_apps_clk",
1133 .ops = &clk_ops_branch,
1134 CLK_INIT(gcc_blsp1_qup5_spi_apps_clk.c),
1135 },
1136};
1137
1138static struct branch_clk gcc_blsp1_qup6_i2c_apps_clk = {
1139 .cbcr_reg = BLSP1_QUP6_I2C_APPS_CBCR,
Tianyi Gou389ba432012-10-01 13:58:38 -07001140 .base = &virt_bases[GCC_BASE],
1141 .c = {
Saravana Kannan7a6532e2012-10-18 20:51:13 -07001142 .parent = &cxo_clk_src.c,
Tianyi Gou389ba432012-10-01 13:58:38 -07001143 .dbg_name = "gcc_blsp1_qup6_i2c_apps_clk",
1144 .ops = &clk_ops_branch,
1145 CLK_INIT(gcc_blsp1_qup6_i2c_apps_clk.c),
1146 },
1147};
1148
1149static struct branch_clk gcc_blsp1_qup6_spi_apps_clk = {
1150 .cbcr_reg = BLSP1_QUP6_SPI_APPS_CBCR,
Tianyi Gou389ba432012-10-01 13:58:38 -07001151 .has_sibling = 0,
1152 .base = &virt_bases[GCC_BASE],
1153 .c = {
Saravana Kannan7a6532e2012-10-18 20:51:13 -07001154 .parent = &blsp1_qup6_spi_apps_clk_src.c,
Tianyi Gou389ba432012-10-01 13:58:38 -07001155 .dbg_name = "gcc_blsp1_qup6_spi_apps_clk",
1156 .ops = &clk_ops_branch,
1157 CLK_INIT(gcc_blsp1_qup6_spi_apps_clk.c),
1158 },
1159};
1160
1161static struct branch_clk gcc_blsp1_uart1_apps_clk = {
1162 .cbcr_reg = BLSP1_UART1_APPS_CBCR,
Tianyi Gou389ba432012-10-01 13:58:38 -07001163 .has_sibling = 0,
1164 .base = &virt_bases[GCC_BASE],
1165 .c = {
Saravana Kannan7a6532e2012-10-18 20:51:13 -07001166 .parent = &blsp1_uart1_apps_clk_src.c,
Tianyi Gou389ba432012-10-01 13:58:38 -07001167 .dbg_name = "gcc_blsp1_uart1_apps_clk",
1168 .ops = &clk_ops_branch,
1169 CLK_INIT(gcc_blsp1_uart1_apps_clk.c),
1170 },
1171};
1172
1173static struct branch_clk gcc_blsp1_uart2_apps_clk = {
1174 .cbcr_reg = BLSP1_UART2_APPS_CBCR,
Tianyi Gou389ba432012-10-01 13:58:38 -07001175 .has_sibling = 0,
1176 .base = &virt_bases[GCC_BASE],
1177 .c = {
Saravana Kannan7a6532e2012-10-18 20:51:13 -07001178 .parent = &blsp1_uart2_apps_clk_src.c,
Tianyi Gou389ba432012-10-01 13:58:38 -07001179 .dbg_name = "gcc_blsp1_uart2_apps_clk",
1180 .ops = &clk_ops_branch,
1181 CLK_INIT(gcc_blsp1_uart2_apps_clk.c),
1182 },
1183};
1184
1185static struct branch_clk gcc_blsp1_uart3_apps_clk = {
1186 .cbcr_reg = BLSP1_UART3_APPS_CBCR,
Tianyi Gou389ba432012-10-01 13:58:38 -07001187 .has_sibling = 0,
1188 .base = &virt_bases[GCC_BASE],
1189 .c = {
Saravana Kannan7a6532e2012-10-18 20:51:13 -07001190 .parent = &blsp1_uart3_apps_clk_src.c,
Tianyi Gou389ba432012-10-01 13:58:38 -07001191 .dbg_name = "gcc_blsp1_uart3_apps_clk",
1192 .ops = &clk_ops_branch,
1193 CLK_INIT(gcc_blsp1_uart3_apps_clk.c),
1194 },
1195};
1196
1197static struct branch_clk gcc_blsp1_uart4_apps_clk = {
1198 .cbcr_reg = BLSP1_UART4_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_uart4_apps_clk_src.c,
Tianyi Gou389ba432012-10-01 13:58:38 -07001203 .dbg_name = "gcc_blsp1_uart4_apps_clk",
1204 .ops = &clk_ops_branch,
1205 CLK_INIT(gcc_blsp1_uart4_apps_clk.c),
1206 },
1207};
1208
1209static struct branch_clk gcc_blsp1_uart5_apps_clk = {
1210 .cbcr_reg = BLSP1_UART5_APPS_CBCR,
Tianyi Gou389ba432012-10-01 13:58:38 -07001211 .has_sibling = 0,
1212 .base = &virt_bases[GCC_BASE],
1213 .c = {
Saravana Kannan7a6532e2012-10-18 20:51:13 -07001214 .parent = &blsp1_uart5_apps_clk_src.c,
Tianyi Gou389ba432012-10-01 13:58:38 -07001215 .dbg_name = "gcc_blsp1_uart5_apps_clk",
1216 .ops = &clk_ops_branch,
1217 CLK_INIT(gcc_blsp1_uart5_apps_clk.c),
1218 },
1219};
1220
1221static struct branch_clk gcc_blsp1_uart6_apps_clk = {
1222 .cbcr_reg = BLSP1_UART6_APPS_CBCR,
Tianyi Gou389ba432012-10-01 13:58:38 -07001223 .has_sibling = 0,
1224 .base = &virt_bases[GCC_BASE],
1225 .c = {
Saravana Kannan7a6532e2012-10-18 20:51:13 -07001226 .parent = &blsp1_uart6_apps_clk_src.c,
Tianyi Gou389ba432012-10-01 13:58:38 -07001227 .dbg_name = "gcc_blsp1_uart6_apps_clk",
1228 .ops = &clk_ops_branch,
1229 CLK_INIT(gcc_blsp1_uart6_apps_clk.c),
1230 },
1231};
1232
1233static struct local_vote_clk gcc_boot_rom_ahb_clk = {
1234 .cbcr_reg = BOOT_ROM_AHB_CBCR,
1235 .vote_reg = APCS_CLOCK_BRANCH_ENA_VOTE,
1236 .en_mask = BIT(10),
1237 .base = &virt_bases[GCC_BASE],
1238 .c = {
1239 .dbg_name = "gcc_boot_rom_ahb_clk",
1240 .ops = &clk_ops_vote,
1241 CLK_INIT(gcc_boot_rom_ahb_clk.c),
1242 },
1243};
1244
1245static struct local_vote_clk gcc_ce1_ahb_clk = {
1246 .cbcr_reg = CE1_AHB_CBCR,
1247 .vote_reg = APCS_CLOCK_BRANCH_ENA_VOTE,
1248 .en_mask = BIT(3),
1249 .base = &virt_bases[GCC_BASE],
1250 .c = {
1251 .dbg_name = "gcc_ce1_ahb_clk",
1252 .ops = &clk_ops_vote,
1253 CLK_INIT(gcc_ce1_ahb_clk.c),
1254 },
1255};
1256
1257static struct local_vote_clk gcc_ce1_axi_clk = {
1258 .cbcr_reg = CE1_AXI_CBCR,
1259 .vote_reg = APCS_CLOCK_BRANCH_ENA_VOTE,
1260 .en_mask = BIT(4),
1261 .base = &virt_bases[GCC_BASE],
1262 .c = {
1263 .dbg_name = "gcc_ce1_axi_clk",
1264 .ops = &clk_ops_vote,
1265 CLK_INIT(gcc_ce1_axi_clk.c),
1266 },
1267};
1268
1269static struct local_vote_clk gcc_ce1_clk = {
1270 .cbcr_reg = CE1_CBCR,
1271 .vote_reg = APCS_CLOCK_BRANCH_ENA_VOTE,
1272 .en_mask = BIT(5),
1273 .base = &virt_bases[GCC_BASE],
1274 .c = {
1275 .dbg_name = "gcc_ce1_clk",
1276 .ops = &clk_ops_vote,
1277 CLK_INIT(gcc_ce1_clk.c),
1278 },
1279};
1280
1281static struct branch_clk gcc_gp1_clk = {
1282 .cbcr_reg = GP1_CBCR,
Tianyi Gou389ba432012-10-01 13:58:38 -07001283 .has_sibling = 0,
1284 .base = &virt_bases[GCC_BASE],
1285 .c = {
Saravana Kannan7a6532e2012-10-18 20:51:13 -07001286 .parent = &gp1_clk_src.c,
Tianyi Gou389ba432012-10-01 13:58:38 -07001287 .dbg_name = "gcc_gp1_clk",
1288 .ops = &clk_ops_branch,
1289 CLK_INIT(gcc_gp1_clk.c),
1290 },
1291};
1292
1293static struct branch_clk gcc_gp2_clk = {
1294 .cbcr_reg = GP2_CBCR,
Tianyi Gou389ba432012-10-01 13:58:38 -07001295 .has_sibling = 0,
1296 .base = &virt_bases[GCC_BASE],
1297 .c = {
Saravana Kannan7a6532e2012-10-18 20:51:13 -07001298 .parent = &gp2_clk_src.c,
Tianyi Gou389ba432012-10-01 13:58:38 -07001299 .dbg_name = "gcc_gp2_clk",
1300 .ops = &clk_ops_branch,
1301 CLK_INIT(gcc_gp2_clk.c),
1302 },
1303};
1304
1305static struct branch_clk gcc_gp3_clk = {
1306 .cbcr_reg = GP3_CBCR,
Tianyi Gou389ba432012-10-01 13:58:38 -07001307 .has_sibling = 0,
1308 .base = &virt_bases[GCC_BASE],
1309 .c = {
Saravana Kannan7a6532e2012-10-18 20:51:13 -07001310 .parent = &gp3_clk_src.c,
Tianyi Gou389ba432012-10-01 13:58:38 -07001311 .dbg_name = "gcc_gp3_clk",
1312 .ops = &clk_ops_branch,
1313 CLK_INIT(gcc_gp3_clk.c),
1314 },
1315};
1316
1317static struct branch_clk gcc_ipa_clk = {
1318 .cbcr_reg = IPA_CBCR,
Tianyi Gou389ba432012-10-01 13:58:38 -07001319 .has_sibling = 1,
1320 .base = &virt_bases[GCC_BASE],
1321 .c = {
Saravana Kannan7a6532e2012-10-18 20:51:13 -07001322 .parent = &ipa_clk_src.c,
Tianyi Gou389ba432012-10-01 13:58:38 -07001323 .dbg_name = "gcc_ipa_clk",
1324 .ops = &clk_ops_branch,
1325 CLK_INIT(gcc_ipa_clk.c),
1326 },
1327};
1328
1329static struct branch_clk gcc_ipa_cnoc_clk = {
1330 .cbcr_reg = IPA_CNOC_CBCR,
1331 .has_sibling = 1,
1332 .base = &virt_bases[GCC_BASE],
1333 .c = {
1334 .dbg_name = "gcc_ipa_cnoc_clk",
1335 .ops = &clk_ops_branch,
1336 CLK_INIT(gcc_ipa_cnoc_clk.c),
1337 },
1338};
1339
Tianyi Gou0e10e792012-11-29 18:28:32 -08001340static struct branch_clk gcc_ipa_sleep_clk = {
1341 .cbcr_reg = IPA_SLEEP_CBCR,
1342 .has_sibling = 1,
1343 .base = &virt_bases[GCC_BASE],
1344 .c = {
1345 .dbg_name = "gcc_ipa_sleep_clk",
1346 .ops = &clk_ops_branch,
1347 CLK_INIT(gcc_ipa_sleep_clk.c),
1348 },
1349};
1350
Tianyi Gou389ba432012-10-01 13:58:38 -07001351static struct branch_clk gcc_pdm2_clk = {
1352 .cbcr_reg = PDM2_CBCR,
Tianyi Gou389ba432012-10-01 13:58:38 -07001353 .has_sibling = 0,
1354 .base = &virt_bases[GCC_BASE],
1355 .c = {
Saravana Kannan7a6532e2012-10-18 20:51:13 -07001356 .parent = &pdm2_clk_src.c,
Tianyi Gou389ba432012-10-01 13:58:38 -07001357 .dbg_name = "gcc_pdm2_clk",
1358 .ops = &clk_ops_branch,
1359 CLK_INIT(gcc_pdm2_clk.c),
1360 },
1361};
1362
1363static struct branch_clk gcc_pdm_ahb_clk = {
1364 .cbcr_reg = PDM_AHB_CBCR,
1365 .has_sibling = 1,
1366 .base = &virt_bases[GCC_BASE],
1367 .c = {
1368 .dbg_name = "gcc_pdm_ahb_clk",
1369 .ops = &clk_ops_branch,
1370 CLK_INIT(gcc_pdm_ahb_clk.c),
1371 },
1372};
1373
1374static struct local_vote_clk gcc_prng_ahb_clk = {
1375 .cbcr_reg = PRNG_AHB_CBCR,
1376 .vote_reg = APCS_CLOCK_BRANCH_ENA_VOTE,
1377 .en_mask = BIT(13),
1378 .base = &virt_bases[GCC_BASE],
1379 .c = {
1380 .dbg_name = "gcc_prng_ahb_clk",
1381 .ops = &clk_ops_vote,
1382 CLK_INIT(gcc_prng_ahb_clk.c),
1383 },
1384};
1385
1386static struct branch_clk gcc_qpic_ahb_clk = {
1387 .cbcr_reg = QPIC_AHB_CBCR,
1388 .has_sibling = 1,
1389 .base = &virt_bases[GCC_BASE],
1390 .c = {
1391 .dbg_name = "gcc_qpic_ahb_clk",
1392 .ops = &clk_ops_branch,
1393 CLK_INIT(gcc_qpic_ahb_clk.c),
1394 },
1395};
1396
1397static struct branch_clk gcc_qpic_clk = {
1398 .cbcr_reg = QPIC_CBCR,
Tianyi Gou389ba432012-10-01 13:58:38 -07001399 .has_sibling = 0,
1400 .base = &virt_bases[GCC_BASE],
1401 .c = {
Saravana Kannan7a6532e2012-10-18 20:51:13 -07001402 .parent = &qpic_clk_src.c,
Tianyi Gou389ba432012-10-01 13:58:38 -07001403 .dbg_name = "gcc_qpic_clk",
1404 .ops = &clk_ops_branch,
1405 CLK_INIT(gcc_qpic_clk.c),
1406 },
1407};
1408
1409static struct branch_clk gcc_sdcc2_ahb_clk = {
1410 .cbcr_reg = SDCC2_AHB_CBCR,
1411 .has_sibling = 1,
1412 .base = &virt_bases[GCC_BASE],
1413 .c = {
1414 .dbg_name = "gcc_sdcc2_ahb_clk",
1415 .ops = &clk_ops_branch,
1416 CLK_INIT(gcc_sdcc2_ahb_clk.c),
1417 },
1418};
1419
1420static struct branch_clk gcc_sdcc2_apps_clk = {
1421 .cbcr_reg = SDCC2_APPS_CBCR,
Tianyi Gou389ba432012-10-01 13:58:38 -07001422 .has_sibling = 0,
1423 .base = &virt_bases[GCC_BASE],
1424 .c = {
Saravana Kannan7a6532e2012-10-18 20:51:13 -07001425 .parent = &sdcc2_apps_clk_src.c,
Tianyi Gou389ba432012-10-01 13:58:38 -07001426 .dbg_name = "gcc_sdcc2_apps_clk",
1427 .ops = &clk_ops_branch,
1428 CLK_INIT(gcc_sdcc2_apps_clk.c),
1429 },
1430};
1431
1432static struct branch_clk gcc_sdcc3_ahb_clk = {
1433 .cbcr_reg = SDCC3_AHB_CBCR,
1434 .has_sibling = 1,
1435 .base = &virt_bases[GCC_BASE],
1436 .c = {
1437 .dbg_name = "gcc_sdcc3_ahb_clk",
1438 .ops = &clk_ops_branch,
1439 CLK_INIT(gcc_sdcc3_ahb_clk.c),
1440 },
1441};
1442
1443static struct branch_clk gcc_sdcc3_apps_clk = {
1444 .cbcr_reg = SDCC3_APPS_CBCR,
Tianyi Gou389ba432012-10-01 13:58:38 -07001445 .has_sibling = 0,
1446 .base = &virt_bases[GCC_BASE],
1447 .c = {
Saravana Kannan7a6532e2012-10-18 20:51:13 -07001448 .parent = &sdcc3_apps_clk_src.c,
Tianyi Gou389ba432012-10-01 13:58:38 -07001449 .dbg_name = "gcc_sdcc3_apps_clk",
1450 .ops = &clk_ops_branch,
1451 CLK_INIT(gcc_sdcc3_apps_clk.c),
1452 },
1453};
1454
1455static struct branch_clk gcc_sys_noc_ipa_axi_clk = {
1456 .cbcr_reg = SYS_NOC_IPA_AXI_CBCR,
Tianyi Gou389ba432012-10-01 13:58:38 -07001457 .has_sibling = 1,
1458 .base = &virt_bases[GCC_BASE],
1459 .c = {
Saravana Kannan7a6532e2012-10-18 20:51:13 -07001460 .parent = &ipa_clk_src.c,
Tianyi Gou389ba432012-10-01 13:58:38 -07001461 .dbg_name = "gcc_sys_noc_ipa_axi_clk",
1462 .ops = &clk_ops_branch,
1463 CLK_INIT(gcc_sys_noc_ipa_axi_clk.c),
1464 },
1465};
1466
1467static struct branch_clk gcc_usb_hs_ahb_clk = {
1468 .cbcr_reg = USB_HS_AHB_CBCR,
1469 .has_sibling = 1,
1470 .base = &virt_bases[GCC_BASE],
1471 .c = {
1472 .dbg_name = "gcc_usb_hs_ahb_clk",
1473 .ops = &clk_ops_branch,
1474 CLK_INIT(gcc_usb_hs_ahb_clk.c),
1475 },
1476};
1477
1478static struct branch_clk gcc_usb_hs_system_clk = {
1479 .cbcr_reg = USB_HS_SYSTEM_CBCR,
1480 .bcr_reg = USB_HS_BCR,
Tianyi Gou389ba432012-10-01 13:58:38 -07001481 .has_sibling = 0,
1482 .base = &virt_bases[GCC_BASE],
1483 .c = {
Saravana Kannan7a6532e2012-10-18 20:51:13 -07001484 .parent = &usb_hs_system_clk_src.c,
Tianyi Gou389ba432012-10-01 13:58:38 -07001485 .dbg_name = "gcc_usb_hs_system_clk",
1486 .ops = &clk_ops_branch,
1487 CLK_INIT(gcc_usb_hs_system_clk.c),
1488 },
1489};
1490
1491static struct branch_clk gcc_usb_hsic_ahb_clk = {
1492 .cbcr_reg = USB_HSIC_AHB_CBCR,
1493 .has_sibling = 1,
1494 .base = &virt_bases[GCC_BASE],
1495 .c = {
1496 .dbg_name = "gcc_usb_hsic_ahb_clk",
1497 .ops = &clk_ops_branch,
1498 CLK_INIT(gcc_usb_hsic_ahb_clk.c),
1499 },
1500};
1501
1502static struct branch_clk gcc_usb_hsic_clk = {
1503 .cbcr_reg = USB_HSIC_CBCR,
Tianyi Gou389ba432012-10-01 13:58:38 -07001504 .has_sibling = 0,
1505 .base = &virt_bases[GCC_BASE],
1506 .c = {
Saravana Kannan7a6532e2012-10-18 20:51:13 -07001507 .parent = &usb_hsic_clk_src.c,
Tianyi Gou389ba432012-10-01 13:58:38 -07001508 .dbg_name = "gcc_usb_hsic_clk",
1509 .ops = &clk_ops_branch,
1510 CLK_INIT(gcc_usb_hsic_clk.c),
1511 },
1512};
1513
1514static struct branch_clk gcc_usb_hsic_io_cal_clk = {
1515 .cbcr_reg = USB_HSIC_IO_CAL_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 = &usb_hsic_io_cal_clk_src.c,
Tianyi Gou389ba432012-10-01 13:58:38 -07001520 .dbg_name = "gcc_usb_hsic_io_cal_clk",
1521 .ops = &clk_ops_branch,
1522 CLK_INIT(gcc_usb_hsic_io_cal_clk.c),
1523 },
1524};
1525
1526static struct branch_clk gcc_usb_hsic_system_clk = {
1527 .cbcr_reg = USB_HSIC_SYSTEM_CBCR,
1528 .bcr_reg = USB_HS_HSIC_BCR,
Tianyi Gou389ba432012-10-01 13:58:38 -07001529 .has_sibling = 0,
1530 .base = &virt_bases[GCC_BASE],
1531 .c = {
Saravana Kannan7a6532e2012-10-18 20:51:13 -07001532 .parent = &usb_hsic_system_clk_src.c,
Tianyi Gou389ba432012-10-01 13:58:38 -07001533 .dbg_name = "gcc_usb_hsic_system_clk",
1534 .ops = &clk_ops_branch,
1535 CLK_INIT(gcc_usb_hsic_system_clk.c),
1536 },
1537};
1538
1539static struct branch_clk gcc_usb_hsic_xcvr_fs_clk = {
1540 .cbcr_reg = USB_HSIC_XCVR_FS_CBCR,
Tianyi Gou389ba432012-10-01 13:58:38 -07001541 .has_sibling = 0,
1542 .base = &virt_bases[GCC_BASE],
1543 .c = {
Saravana Kannan7a6532e2012-10-18 20:51:13 -07001544 .parent = &usb_hsic_xcvr_fs_clk_src.c,
Tianyi Gou389ba432012-10-01 13:58:38 -07001545 .dbg_name = "gcc_usb_hsic_xcvr_fs_clk",
1546 .ops = &clk_ops_branch,
1547 CLK_INIT(gcc_usb_hsic_xcvr_fs_clk.c),
1548 },
1549};
1550
Tianyi Gou389ba432012-10-01 13:58:38 -07001551static DEFINE_CLK_MEASURE(a5_m_clk);
1552
1553#ifdef CONFIG_DEBUG_FS
1554
1555struct measure_mux_entry {
1556 struct clk *c;
1557 int base;
1558 u32 debug_mux;
1559};
1560
Tianyi Gouabcddb72013-02-23 18:10:11 -08001561struct measure_mux_entry measure_mux_common[] __initdata = {
Tianyi Gou389ba432012-10-01 13:58:38 -07001562 {&gcc_pdm_ahb_clk.c, GCC_BASE, 0x00d0},
1563 {&gcc_usb_hsic_xcvr_fs_clk.c, GCC_BASE, 0x005d},
1564 {&gcc_usb_hsic_system_clk.c, GCC_BASE, 0x0059},
1565 {&gcc_usb_hsic_io_cal_clk.c, GCC_BASE, 0x005b},
1566 {&gcc_sdcc3_ahb_clk.c, GCC_BASE, 0x0079},
1567 {&gcc_blsp1_qup5_i2c_apps_clk.c, GCC_BASE, 0x009d},
1568 {&gcc_blsp1_qup1_spi_apps_clk.c, GCC_BASE, 0x008a},
1569 {&gcc_blsp1_uart2_apps_clk.c, GCC_BASE, 0x0091},
1570 {&gcc_blsp1_qup4_spi_apps_clk.c, GCC_BASE, 0x0098},
1571 {&gcc_blsp1_qup3_spi_apps_clk.c, GCC_BASE, 0x0093},
1572 {&gcc_blsp1_qup6_i2c_apps_clk.c, GCC_BASE, 0x00a2},
1573 {&gcc_bam_dma_ahb_clk.c, GCC_BASE, 0x00e0},
1574 {&gcc_sdcc3_apps_clk.c, GCC_BASE, 0x0078},
1575 {&gcc_usb_hs_system_clk.c, GCC_BASE, 0x0060},
1576 {&gcc_blsp1_ahb_clk.c, GCC_BASE, 0x0088},
1577 {&gcc_blsp1_uart4_apps_clk.c, GCC_BASE, 0x009a},
1578 {&gcc_blsp1_qup2_spi_apps_clk.c, GCC_BASE, 0x008e},
1579 {&gcc_usb_hsic_ahb_clk.c, GCC_BASE, 0x0058},
1580 {&gcc_blsp1_uart3_apps_clk.c, GCC_BASE, 0x0095},
1581 {&gcc_ce1_axi_clk.c, GCC_BASE, 0x0139},
1582 {&gcc_blsp1_qup5_spi_apps_clk.c, GCC_BASE, 0x009c},
1583 {&gcc_usb_hs_ahb_clk.c, GCC_BASE, 0x0061},
1584 {&gcc_blsp1_qup6_spi_apps_clk.c, GCC_BASE, 0x00a1},
1585 {&gcc_prng_ahb_clk.c, GCC_BASE, 0x00d8},
1586 {&gcc_blsp1_qup3_i2c_apps_clk.c, GCC_BASE, 0x0094},
1587 {&gcc_usb_hsic_clk.c, GCC_BASE, 0x005a},
1588 {&gcc_blsp1_uart6_apps_clk.c, GCC_BASE, 0x00a3},
1589 {&gcc_sdcc2_apps_clk.c, GCC_BASE, 0x0070},
1590 {&gcc_blsp1_uart1_apps_clk.c, GCC_BASE, 0x008c},
1591 {&gcc_blsp1_qup4_i2c_apps_clk.c, GCC_BASE, 0x0099},
1592 {&gcc_boot_rom_ahb_clk.c, GCC_BASE, 0x00f8},
1593 {&gcc_ce1_ahb_clk.c, GCC_BASE, 0x013a},
1594 {&gcc_pdm2_clk.c, GCC_BASE, 0x00d2},
1595 {&gcc_blsp1_uart5_apps_clk.c, GCC_BASE, 0x009e},
1596 {&gcc_blsp1_qup2_i2c_apps_clk.c, GCC_BASE, 0x0090},
1597 {&gcc_blsp1_qup1_i2c_apps_clk.c, GCC_BASE, 0x008b},
1598 {&gcc_sdcc2_ahb_clk.c, GCC_BASE, 0x0071},
1599 {&gcc_ce1_clk.c, GCC_BASE, 0x0138},
1600 {&gcc_sys_noc_ipa_axi_clk.c, GCC_BASE, 0x0007},
Tianyi Gou8512ac42013-01-23 18:32:04 -08001601 {&gcc_ipa_clk.c, GCC_BASE, 0x01E0},
1602 {&gcc_ipa_cnoc_clk.c, GCC_BASE, 0x01E1},
1603 {&gcc_ipa_sleep_clk.c, GCC_BASE, 0x01E2},
1604 {&gcc_qpic_clk.c, GCC_BASE, 0x01D8},
1605 {&gcc_qpic_ahb_clk.c, GCC_BASE, 0x01D9},
Tianyi Gou389ba432012-10-01 13:58:38 -07001606
Tianyi Gou389ba432012-10-01 13:58:38 -07001607 {&a5_m_clk, APCS_BASE, 0x3},
1608
1609 {&dummy_clk, N_BASES, 0x0000},
1610};
1611
Tianyi Gouabcddb72013-02-23 18:10:11 -08001612struct measure_mux_entry measure_mux_v2_only[] __initdata = {
1613 {&gcc_ipa_clk.c, GCC_BASE, 0x01E0},
1614 {&gcc_ipa_cnoc_clk.c, GCC_BASE, 0x01E1},
1615 {&gcc_ipa_sleep_clk.c, GCC_BASE, 0x01E2},
1616 {&gcc_qpic_clk.c, GCC_BASE, 0x01D8},
1617 {&gcc_qpic_ahb_clk.c, GCC_BASE, 0x01D9},
1618};
1619
1620struct measure_mux_entry measure_mux[ARRAY_SIZE(measure_mux_common)
1621 + ARRAY_SIZE(measure_mux_v2_only)];
1622
Tianyi Gou389ba432012-10-01 13:58:38 -07001623static int measure_clk_set_parent(struct clk *c, struct clk *parent)
1624{
1625 struct measure_clk *clk = to_measure_clk(c);
1626 unsigned long flags;
1627 u32 regval, clk_sel, i;
1628
1629 if (!parent)
1630 return -EINVAL;
1631
1632 for (i = 0; i < (ARRAY_SIZE(measure_mux) - 1); i++)
1633 if (measure_mux[i].c == parent)
1634 break;
1635
1636 if (measure_mux[i].c == &dummy_clk)
1637 return -EINVAL;
1638
1639 spin_lock_irqsave(&local_clock_reg_lock, flags);
1640 /*
1641 * Program the test vector, measurement period (sample_ticks)
1642 * and scaling multiplier.
1643 */
1644 clk->sample_ticks = 0x10000;
1645 clk->multiplier = 1;
1646
Tianyi Gou389ba432012-10-01 13:58:38 -07001647 writel_relaxed(0, GCC_REG_BASE(GCC_DEBUG_CLK_CTL_REG));
1648
1649 switch (measure_mux[i].base) {
1650
1651 case GCC_BASE:
1652 clk_sel = measure_mux[i].debug_mux;
1653 break;
1654
Tianyi Gou389ba432012-10-01 13:58:38 -07001655 case APCS_BASE:
1656 clk_sel = 0x16A;
1657 regval = BVAL(5, 3, measure_mux[i].debug_mux);
1658 writel_relaxed(regval, APCS_REG_BASE(APCS_CLK_DIAG_REG));
1659
1660 /* Activate debug clock output */
1661 regval |= BIT(7);
1662 writel_relaxed(regval, APCS_REG_BASE(APCS_CLK_DIAG_REG));
1663 break;
1664
1665 default:
1666 return -EINVAL;
1667 }
1668
1669 /* Set debug mux clock index */
1670 regval = BVAL(8, 0, clk_sel);
1671 writel_relaxed(regval, GCC_REG_BASE(GCC_DEBUG_CLK_CTL_REG));
1672
1673 /* Activate debug clock output */
1674 regval |= BIT(16);
1675 writel_relaxed(regval, GCC_REG_BASE(GCC_DEBUG_CLK_CTL_REG));
1676
1677 /* Make sure test vector is set before starting measurements. */
1678 mb();
1679 spin_unlock_irqrestore(&local_clock_reg_lock, flags);
1680
1681 return 0;
1682}
1683
1684/* Sample clock for 'ticks' reference clock ticks. */
1685static u32 run_measurement(unsigned ticks)
1686{
1687 /* Stop counters and set the XO4 counter start value. */
1688 writel_relaxed(ticks, GCC_REG_BASE(CLOCK_FRQ_MEASURE_CTL_REG));
1689
1690 /* Wait for timer to become ready. */
1691 while ((readl_relaxed(GCC_REG_BASE(CLOCK_FRQ_MEASURE_STATUS_REG)) &
1692 BIT(25)) != 0)
1693 cpu_relax();
1694
1695 /* Run measurement and wait for completion. */
1696 writel_relaxed(BIT(20)|ticks, GCC_REG_BASE(CLOCK_FRQ_MEASURE_CTL_REG));
1697 while ((readl_relaxed(GCC_REG_BASE(CLOCK_FRQ_MEASURE_STATUS_REG)) &
1698 BIT(25)) == 0)
1699 cpu_relax();
1700
1701 /* Return measured ticks. */
1702 return readl_relaxed(GCC_REG_BASE(CLOCK_FRQ_MEASURE_STATUS_REG)) &
1703 BM(24, 0);
1704}
1705
1706/*
1707 * Perform a hardware rate measurement for a given clock.
1708 * FOR DEBUG USE ONLY: Measurements take ~15 ms!
1709 */
1710static unsigned long measure_clk_get_rate(struct clk *c)
1711{
1712 unsigned long flags;
1713 u32 gcc_xo4_reg_backup;
1714 u64 raw_count_short, raw_count_full;
1715 struct measure_clk *clk = to_measure_clk(c);
1716 unsigned ret;
1717
1718 ret = clk_prepare_enable(&cxo_clk_src.c);
1719 if (ret) {
1720 pr_warning("CXO clock failed to enable. Can't measure\n");
1721 return 0;
1722 }
1723
1724 spin_lock_irqsave(&local_clock_reg_lock, flags);
1725
1726 /* Enable CXO/4 and RINGOSC branch. */
1727 gcc_xo4_reg_backup = readl_relaxed(GCC_REG_BASE(GCC_XO_DIV4_CBCR_REG));
1728 writel_relaxed(0x1, GCC_REG_BASE(GCC_XO_DIV4_CBCR_REG));
1729
1730 /*
1731 * The ring oscillator counter will not reset if the measured clock
1732 * is not running. To detect this, run a short measurement before
1733 * the full measurement. If the raw results of the two are the same
1734 * then the clock must be off.
1735 */
1736
1737 /* Run a short measurement. (~1 ms) */
1738 raw_count_short = run_measurement(0x1000);
1739 /* Run a full measurement. (~14 ms) */
1740 raw_count_full = run_measurement(clk->sample_ticks);
1741
1742 writel_relaxed(gcc_xo4_reg_backup, GCC_REG_BASE(GCC_XO_DIV4_CBCR_REG));
1743
1744 /* Return 0 if the clock is off. */
1745 if (raw_count_full == raw_count_short) {
1746 ret = 0;
1747 } else {
1748 /* Compute rate in Hz. */
1749 raw_count_full = ((raw_count_full * 10) + 15) * 4800000;
1750 do_div(raw_count_full, ((clk->sample_ticks * 10) + 35));
1751 ret = (raw_count_full * clk->multiplier);
1752 }
1753
1754 writel_relaxed(0x51A00, GCC_REG_BASE(GCC_PLLTEST_PAD_CFG_REG));
1755 spin_unlock_irqrestore(&local_clock_reg_lock, flags);
1756
1757 clk_disable_unprepare(&cxo_clk_src.c);
1758
1759 return ret;
1760}
1761#else /* !CONFIG_DEBUG_FS */
1762static int measure_clk_set_parent(struct clk *clk, struct clk *parent)
1763{
1764 return -EINVAL;
1765}
1766
1767static unsigned long measure_clk_get_rate(struct clk *clk)
1768{
1769 return 0;
1770}
1771#endif /* CONFIG_DEBUG_FS */
1772
1773static struct clk_ops clk_ops_measure = {
1774 .set_parent = measure_clk_set_parent,
1775 .get_rate = measure_clk_get_rate,
1776};
1777
1778static struct measure_clk measure_clk = {
1779 .c = {
1780 .dbg_name = "measure_clk",
1781 .ops = &clk_ops_measure,
1782 CLK_INIT(measure_clk.c),
1783 },
1784 .multiplier = 1,
1785};
1786
1787static struct clk_lookup msm_clocks_9625[] = {
1788 CLK_LOOKUP("xo", cxo_clk_src.c, ""),
1789 CLK_LOOKUP("measure", measure_clk.c, "debug"),
1790
Tianyi Gou27df1bb2012-10-11 14:44:01 -07001791 CLK_LOOKUP("pll0", gpll0_activeonly_clk_src.c, "f9010008.qcom,acpuclk"),
1792 CLK_LOOKUP("pll14", apcspll_clk_src.c, "f9010008.qcom,acpuclk"),
Tianyi Gou389ba432012-10-01 13:58:38 -07001793
1794 CLK_LOOKUP("dma_bam_pclk", gcc_bam_dma_ahb_clk.c, "msm_sps"),
1795 CLK_LOOKUP("iface_clk", gcc_blsp1_ahb_clk.c, "msm_serial_hsl.0"),
Gilad Avidov09c78ec2012-10-18 09:34:35 -06001796 CLK_LOOKUP("iface_clk", gcc_blsp1_ahb_clk.c, "f9924000.spi"),
Tianyi Gou389ba432012-10-01 13:58:38 -07001797 CLK_LOOKUP("iface_clk", gcc_blsp1_ahb_clk.c, "f9925000.i2c"),
Saket Saurabhd72ee922013-01-22 16:56:52 +05301798 CLK_LOOKUP("iface_clk", gcc_blsp1_ahb_clk.c, "f991d000.uart"),
Tianyi Gou389ba432012-10-01 13:58:38 -07001799 CLK_LOOKUP("core_clk", gcc_blsp1_qup1_i2c_apps_clk.c, ""),
Gilad Avidov09c78ec2012-10-18 09:34:35 -06001800 CLK_LOOKUP("core_clk", gcc_blsp1_qup1_spi_apps_clk.c, ""),
Tianyi Gou389ba432012-10-01 13:58:38 -07001801 CLK_LOOKUP("core_clk", gcc_blsp1_qup2_i2c_apps_clk.c, ""),
Gilad Avidov09c78ec2012-10-18 09:34:35 -06001802 CLK_LOOKUP("core_clk", gcc_blsp1_qup2_spi_apps_clk.c, "f9924000.spi"),
Tianyi Gou389ba432012-10-01 13:58:38 -07001803 CLK_LOOKUP("core_clk", gcc_blsp1_qup3_i2c_apps_clk.c, "f9925000.i2c"),
1804 CLK_LOOKUP("core_clk", gcc_blsp1_qup3_spi_apps_clk.c, ""),
1805 CLK_LOOKUP("core_clk", gcc_blsp1_qup4_i2c_apps_clk.c, ""),
1806 CLK_LOOKUP("core_clk", gcc_blsp1_qup4_spi_apps_clk.c, ""),
1807 CLK_LOOKUP("core_clk", gcc_blsp1_qup5_i2c_apps_clk.c, ""),
1808 CLK_LOOKUP("core_clk", gcc_blsp1_qup5_spi_apps_clk.c, ""),
1809 CLK_LOOKUP("core_clk", gcc_blsp1_qup6_i2c_apps_clk.c, ""),
1810 CLK_LOOKUP("core_clk", gcc_blsp1_qup6_spi_apps_clk.c, ""),
Saket Saurabhd72ee922013-01-22 16:56:52 +05301811 CLK_LOOKUP("core_clk", gcc_blsp1_uart1_apps_clk.c, "f991d000.uart"),
Tianyi Gou389ba432012-10-01 13:58:38 -07001812 CLK_LOOKUP("core_clk", gcc_blsp1_uart2_apps_clk.c, ""),
1813 CLK_LOOKUP("core_clk", gcc_blsp1_uart3_apps_clk.c, "msm_serial_hsl.0"),
1814 CLK_LOOKUP("core_clk", gcc_blsp1_uart4_apps_clk.c, ""),
1815 CLK_LOOKUP("core_clk", gcc_blsp1_uart5_apps_clk.c, ""),
1816 CLK_LOOKUP("core_clk", gcc_blsp1_uart6_apps_clk.c, ""),
1817
1818 CLK_LOOKUP("core_clk_src", ce1_clk_src.c, ""),
1819 CLK_LOOKUP("core_clk", gcc_ce1_clk.c, ""),
1820 CLK_LOOKUP("iface_clk", gcc_ce1_ahb_clk.c, ""),
1821 CLK_LOOKUP("bus_clk", gcc_ce1_axi_clk.c, ""),
1822
1823 CLK_LOOKUP("core_clk", gcc_gp1_clk.c, ""),
1824 CLK_LOOKUP("core_clk", gcc_gp2_clk.c, ""),
1825 CLK_LOOKUP("core_clk", gcc_gp3_clk.c, ""),
1826
Hariprasad Dhalinarasimha9abfe782012-11-07 19:40:14 -08001827 CLK_LOOKUP("iface_clk", gcc_prng_ahb_clk.c, "f9bff000.qcom,msm-rng"),
Tianyi Gou389ba432012-10-01 13:58:38 -07001828 CLK_LOOKUP("core_src_clk", ipa_clk_src.c, "fd4c0000.qcom,ipa"),
1829 CLK_LOOKUP("core_clk", gcc_ipa_clk.c, "fd4c0000.qcom,ipa"),
1830 CLK_LOOKUP("bus_clk", gcc_sys_noc_ipa_axi_clk.c, "fd4c0000.qcom,ipa"),
1831 CLK_LOOKUP("iface_clk", gcc_ipa_cnoc_clk.c, "fd4c0000.qcom,ipa"),
Tianyi Gou0e10e792012-11-29 18:28:32 -08001832 CLK_LOOKUP("inactivity_clk", gcc_ipa_sleep_clk.c, "fd4c0000.qcom,ipa"),
Tianyi Gou389ba432012-10-01 13:58:38 -07001833
1834 CLK_LOOKUP("core_clk", gcc_pdm2_clk.c, ""),
1835 CLK_LOOKUP("iface_clk", gcc_pdm_ahb_clk.c, ""),
1836
Oluwafemi Adeyemi61df1182012-10-12 18:51:11 -07001837 CLK_LOOKUP("iface_clk", gcc_sdcc2_ahb_clk.c, "msm_sdcc.2"),
1838 CLK_LOOKUP("core_clk", gcc_sdcc2_apps_clk.c, "msm_sdcc.2"),
1839 CLK_LOOKUP("bus_clk", pnoc_sdcc2_clk.c, "msm_sdcc.2"),
1840 CLK_LOOKUP("iface_clk", gcc_sdcc3_ahb_clk.c, "msm_sdcc.3"),
1841 CLK_LOOKUP("core_clk", gcc_sdcc3_apps_clk.c, "msm_sdcc.3"),
1842 CLK_LOOKUP("bus_clk", pnoc_sdcc3_clk.c, "msm_sdcc.3"),
Tianyi Gou389ba432012-10-01 13:58:38 -07001843
1844 CLK_LOOKUP("iface_clk", gcc_usb_hs_ahb_clk.c, "f9a55000.usb"),
1845 CLK_LOOKUP("core_clk", gcc_usb_hs_system_clk.c, "f9a55000.usb"),
Ido Shayevitzd2b722b2013-01-09 13:08:54 +02001846 CLK_LOOKUP("iface_clk", gcc_usb_hsic_ahb_clk.c, "msm_hsic_host"),
1847 CLK_LOOKUP("phy_clk", gcc_usb_hsic_clk.c, "msm_hsic_host"),
1848 CLK_LOOKUP("cal_clk", gcc_usb_hsic_io_cal_clk.c, "msm_hsic_host"),
1849 CLK_LOOKUP("core_clk", gcc_usb_hsic_system_clk.c, "msm_hsic_host"),
Ofir Cohenb512a5f2012-12-13 09:46:34 +02001850 CLK_LOOKUP("alt_core_clk", gcc_usb_hsic_xcvr_fs_clk.c, ""),
Tianyi Gou389ba432012-10-01 13:58:38 -07001851
Hariprasad Dhalinarasimha96252de2012-11-21 17:52:36 -08001852 CLK_LOOKUP("core_clk", gcc_ce1_clk.c, "fd400000.qcom,qcedev"),
1853 CLK_LOOKUP("iface_clk", gcc_ce1_ahb_clk.c, "fd400000.qcom,qcedev"),
1854 CLK_LOOKUP("bus_clk", gcc_ce1_axi_clk.c, "fd400000.qcom,qcedev"),
1855 CLK_LOOKUP("core_clk_src", ce1_clk_src.c, "fd400000.qcom,qcedev"),
1856
1857 CLK_LOOKUP("core_clk", gcc_ce1_clk.c, "fd400000.qcom,qcrypto"),
1858 CLK_LOOKUP("iface_clk", gcc_ce1_ahb_clk.c, "fd400000.qcom,qcrypto"),
1859 CLK_LOOKUP("bus_clk", gcc_ce1_axi_clk.c, "fd400000.qcom,qcrypto"),
1860 CLK_LOOKUP("core_clk_src", ce1_clk_src.c, "fd400000.qcom,qcrypto"),
1861
Tianyi Gou389ba432012-10-01 13:58:38 -07001862 /* RPM and voter clocks */
1863 CLK_LOOKUP("bus_clk", snoc_clk.c, ""),
1864 CLK_LOOKUP("bus_clk", pnoc_clk.c, ""),
1865 CLK_LOOKUP("bus_clk", cnoc_clk.c, ""),
1866 CLK_LOOKUP("mem_clk", bimc_clk.c, ""),
1867 CLK_LOOKUP("bus_clk", snoc_a_clk.c, ""),
1868 CLK_LOOKUP("bus_clk", pnoc_a_clk.c, ""),
1869 CLK_LOOKUP("bus_clk", cnoc_a_clk.c, ""),
1870 CLK_LOOKUP("mem_clk", bimc_a_clk.c, ""),
1871
1872 CLK_LOOKUP("bus_clk", cnoc_msmbus_clk.c, "msm_config_noc"),
1873 CLK_LOOKUP("bus_a_clk", cnoc_msmbus_a_clk.c, "msm_config_noc"),
1874 CLK_LOOKUP("bus_clk", snoc_msmbus_clk.c, "msm_sys_noc"),
1875 CLK_LOOKUP("bus_a_clk", snoc_msmbus_a_clk.c, "msm_sys_noc"),
1876 CLK_LOOKUP("bus_clk", pnoc_msmbus_clk.c, "msm_periph_noc"),
1877 CLK_LOOKUP("bus_a_clk", pnoc_msmbus_a_clk.c, "msm_periph_noc"),
1878 CLK_LOOKUP("mem_clk", bimc_msmbus_clk.c, "msm_bimc"),
1879 CLK_LOOKUP("mem_a_clk", bimc_msmbus_a_clk.c, "msm_bimc"),
1880
1881 CLK_LOOKUP("dfab_clk", pnoc_sps_clk.c, "msm_sps"),
1882
1883 CLK_LOOKUP("a5_m_clk", a5_m_clk, ""),
Pushkar Joshi4e483042012-10-29 18:10:08 -07001884
Pratik Patel2d15d562013-02-07 19:10:35 -08001885 /* CoreSight clocks */
Pushkar Joshi4e483042012-10-29 18:10:08 -07001886 CLK_LOOKUP("core_clk", qdss_clk.c, "fc322000.tmc"),
1887 CLK_LOOKUP("core_clk", qdss_clk.c, "fc318000.tpiu"),
1888 CLK_LOOKUP("core_clk", qdss_clk.c, "fc31c000.replicator"),
1889 CLK_LOOKUP("core_clk", qdss_clk.c, "fc307000.tmc"),
1890 CLK_LOOKUP("core_clk", qdss_clk.c, "fc31b000.funnel"),
1891 CLK_LOOKUP("core_clk", qdss_clk.c, "fc319000.funnel"),
1892 CLK_LOOKUP("core_clk", qdss_clk.c, "fc31a000.funnel"),
1893 CLK_LOOKUP("core_clk", qdss_clk.c, "fc321000.stm"),
Pushkar Joshi2a51a122012-12-06 10:49:07 -08001894 CLK_LOOKUP("core_clk", qdss_clk.c, "fc332000.etm"),
Pushkar Joshie0e8a7e2012-12-15 18:27:04 -08001895 CLK_LOOKUP("core_clk", qdss_clk.c, "fc332000.jtagmm"),
Pratik Patel9332c382013-02-08 11:54:28 -08001896 CLK_LOOKUP("core_clk", qdss_clk.c, "fc308000.cti"),
1897 CLK_LOOKUP("core_clk", qdss_clk.c, "fc309000.cti"),
1898 CLK_LOOKUP("core_clk", qdss_clk.c, "fc30a000.cti"),
1899 CLK_LOOKUP("core_clk", qdss_clk.c, "fc30b000.cti"),
1900 CLK_LOOKUP("core_clk", qdss_clk.c, "fc30c000.cti"),
1901 CLK_LOOKUP("core_clk", qdss_clk.c, "fc30d000.cti"),
1902 CLK_LOOKUP("core_clk", qdss_clk.c, "fc30e000.cti"),
1903 CLK_LOOKUP("core_clk", qdss_clk.c, "fc30f000.cti"),
1904 CLK_LOOKUP("core_clk", qdss_clk.c, "fc310000.cti"),
1905 CLK_LOOKUP("core_clk", qdss_clk.c, "fc333000.cti"),
Pushkar Joshi4e483042012-10-29 18:10:08 -07001906
Pratik Patel2d15d562013-02-07 19:10:35 -08001907 CLK_LOOKUP("core_a_clk", qdss_a_clk.c, "fc322000.tmc"),
1908 CLK_LOOKUP("core_a_clk", qdss_a_clk.c, "fc318000.tpiu"),
1909 CLK_LOOKUP("core_a_clk", qdss_a_clk.c, "fc31c000.replicator"),
1910 CLK_LOOKUP("core_a_clk", qdss_a_clk.c, "fc307000.tmc"),
1911 CLK_LOOKUP("core_a_clk", qdss_a_clk.c, "fc31b000.funnel"),
1912 CLK_LOOKUP("core_a_clk", qdss_a_clk.c, "fc319000.funnel"),
1913 CLK_LOOKUP("core_a_clk", qdss_a_clk.c, "fc31a000.funnel"),
1914 CLK_LOOKUP("core_a_clk", qdss_a_clk.c, "fc321000.stm"),
1915 CLK_LOOKUP("core_a_clk", qdss_a_clk.c, "fc332000.etm"),
1916 CLK_LOOKUP("core_a_clk", qdss_a_clk.c, "fc332000.jtagmm"),
Pratik Patel9332c382013-02-08 11:54:28 -08001917 CLK_LOOKUP("core_a_clk", qdss_a_clk.c, "fc308000.cti"),
1918 CLK_LOOKUP("core_a_clk", qdss_a_clk.c, "fc309000.cti"),
1919 CLK_LOOKUP("core_a_clk", qdss_a_clk.c, "fc30a000.cti"),
1920 CLK_LOOKUP("core_a_clk", qdss_a_clk.c, "fc30b000.cti"),
1921 CLK_LOOKUP("core_a_clk", qdss_a_clk.c, "fc30c000.cti"),
1922 CLK_LOOKUP("core_a_clk", qdss_a_clk.c, "fc30d000.cti"),
1923 CLK_LOOKUP("core_a_clk", qdss_a_clk.c, "fc30e000.cti"),
1924 CLK_LOOKUP("core_a_clk", qdss_a_clk.c, "fc30f000.cti"),
1925 CLK_LOOKUP("core_a_clk", qdss_a_clk.c, "fc310000.cti"),
1926 CLK_LOOKUP("core_a_clk", qdss_a_clk.c, "fc333000.cti"),
Pushkar Joshi4e483042012-10-29 18:10:08 -07001927
Tianyi Gou389ba432012-10-01 13:58:38 -07001928};
1929
Tianyi Gou389ba432012-10-01 13:58:38 -07001930#define PLL_AUX_OUTPUT_BIT 1
1931#define PLL_AUX2_OUTPUT_BIT 2
1932
1933/*
1934 * TODO: Need to remove this function when the v2 hardware
1935 * fix the broken lock status bit.
1936 */
1937#define PLL_OUTCTRL BIT(0)
1938#define PLL_BYPASSNL BIT(1)
1939#define PLL_RESET_N BIT(2)
1940
1941static DEFINE_SPINLOCK(sr_pll_reg_lock);
1942
1943static int sr_pll_clk_enable_9625(struct clk *c)
1944{
1945 unsigned long flags;
1946 struct pll_clk *pll = to_pll_clk(c);
1947 u32 mode;
1948 void __iomem *mode_reg = *pll->base + (u32)pll->mode_reg;
1949
1950 spin_lock_irqsave(&sr_pll_reg_lock, flags);
1951
1952 /* Disable PLL bypass mode and de-assert reset. */
1953 mode = readl_relaxed(mode_reg);
1954 mode |= PLL_BYPASSNL | PLL_RESET_N;
1955 writel_relaxed(mode, mode_reg);
1956
1957 /* Wait for pll to lock. */
1958 udelay(100);
1959
1960 /* Enable PLL output. */
1961 mode |= PLL_OUTCTRL;
1962 writel_relaxed(mode, mode_reg);
1963
1964 /* Ensure the write above goes through before returning. */
1965 mb();
1966
1967 spin_unlock_irqrestore(&sr_pll_reg_lock, flags);
1968 return 0;
1969}
1970
Tianyi Gou389ba432012-10-01 13:58:38 -07001971static void __init reg_init(void)
1972{
Tianyi Gou781ff672013-02-21 15:29:40 -08001973 u32 regval;
Tianyi Gou389ba432012-10-01 13:58:38 -07001974
Tianyi Gou389ba432012-10-01 13:58:38 -07001975 /* Vote for GPLL0 to turn on. Needed by acpuclock. */
1976 regval = readl_relaxed(GCC_REG_BASE(APCS_GPLL_ENA_VOTE_REG));
1977 regval |= BIT(0);
1978 writel_relaxed(regval, GCC_REG_BASE(APCS_GPLL_ENA_VOTE_REG));
1979
1980 /*
1981 * TODO: Confirm that no clocks need to be voted on in this sleep vote
1982 * register.
1983 */
1984 writel_relaxed(0x0, GCC_REG_BASE(APCS_CLOCK_SLEEP_ENA_VOTE));
Tianyi Gou389ba432012-10-01 13:58:38 -07001985}
1986
1987static void __init msm9625_clock_post_init(void)
1988{
1989 /*
1990 * Hold an active set vote for CXO; this is because CXO is expected
1991 * to remain on whenever CPUs aren't power collapsed.
1992 */
1993 clk_prepare_enable(&cxo_a_clk_src.c);
1994
1995 /*
1996 * TODO: This call is to prevent sending 0Hz to rpm to turn off pnoc.
1997 * Needs to remove this after vote of pnoc from sdcc driver is ready.
1998 */
1999 clk_prepare_enable(&pnoc_msmbus_a_clk.c);
2000
2001 /* Set rates for single-rate clocks. */
2002 clk_set_rate(&usb_hs_system_clk_src.c,
2003 usb_hs_system_clk_src.freq_tbl[0].freq_hz);
2004 clk_set_rate(&usb_hsic_clk_src.c,
2005 usb_hsic_clk_src.freq_tbl[0].freq_hz);
2006 clk_set_rate(&usb_hsic_io_cal_clk_src.c,
2007 usb_hsic_io_cal_clk_src.freq_tbl[0].freq_hz);
2008 clk_set_rate(&usb_hsic_system_clk_src.c,
2009 usb_hsic_system_clk_src.freq_tbl[0].freq_hz);
2010 clk_set_rate(&usb_hsic_xcvr_fs_clk_src.c,
2011 usb_hsic_xcvr_fs_clk_src.freq_tbl[0].freq_hz);
2012 clk_set_rate(&pdm2_clk_src.c, pdm2_clk_src.freq_tbl[0].freq_hz);
Tianyi Goub1d13972013-01-23 22:55:22 -08002013 /*
2014 * TODO: set rate on behalf of the i2c driver until the i2c driver
2015 * distinguish v1/v2 and call set rate accordingly.
2016 */
2017 if (SOCINFO_VERSION_MAJOR(socinfo_get_version()) == 2)
2018 clk_set_rate(&blsp1_qup3_i2c_apps_clk_src.c,
2019 blsp1_qup3_i2c_apps_clk_src.freq_tbl[0].freq_hz);
Tianyi Gou389ba432012-10-01 13:58:38 -07002020}
2021
2022#define GCC_CC_PHYS 0xFC400000
2023#define GCC_CC_SIZE SZ_16K
2024
Tianyi Gou389ba432012-10-01 13:58:38 -07002025#define APCS_GCC_CC_PHYS 0xF9011000
2026#define APCS_GCC_CC_SIZE SZ_4K
2027
2028#define APCS_PLL_PHYS 0xF9008018
2029#define APCS_PLL_SIZE 0x18
2030
Tianyi Goub1d13972013-01-23 22:55:22 -08002031static struct clk *i2c_apps_clks[][2] __initdata = {
2032 {&gcc_blsp1_qup1_i2c_apps_clk.c, &blsp1_qup1_i2c_apps_clk_src.c},
2033 {&gcc_blsp1_qup2_i2c_apps_clk.c, &blsp1_qup2_i2c_apps_clk_src.c},
2034 {&gcc_blsp1_qup3_i2c_apps_clk.c, &blsp1_qup3_i2c_apps_clk_src.c},
2035 {&gcc_blsp1_qup4_i2c_apps_clk.c, &blsp1_qup4_i2c_apps_clk_src.c},
2036 {&gcc_blsp1_qup5_i2c_apps_clk.c, &blsp1_qup5_i2c_apps_clk_src.c},
2037 {&gcc_blsp1_qup6_i2c_apps_clk.c, &blsp1_qup6_i2c_apps_clk_src.c},
2038};
2039
Tianyi Gou389ba432012-10-01 13:58:38 -07002040static void __init msm9625_clock_pre_init(void)
2041{
2042 virt_bases[GCC_BASE] = ioremap(GCC_CC_PHYS, GCC_CC_SIZE);
2043 if (!virt_bases[GCC_BASE])
2044 panic("clock-9625: Unable to ioremap GCC memory!");
2045
Tianyi Gou389ba432012-10-01 13:58:38 -07002046 virt_bases[APCS_BASE] = ioremap(APCS_GCC_CC_PHYS, APCS_GCC_CC_SIZE);
2047 if (!virt_bases[APCS_BASE])
2048 panic("clock-9625: Unable to ioremap APCS_GCC_CC memory!");
2049
2050 virt_bases[APCS_PLL_BASE] = ioremap(APCS_PLL_PHYS, APCS_PLL_SIZE);
2051 if (!virt_bases[APCS_PLL_BASE])
2052 panic("clock-9625: Unable to ioremap APCS_PLL memory!");
2053
Tianyi Goub1d13972013-01-23 22:55:22 -08002054 /* The parent of each of the QUP I2C APPS clocks is an RCG on v2 */
2055 if (SOCINFO_VERSION_MAJOR(socinfo_get_version()) == 2) {
2056 int i, num_cores = ARRAY_SIZE(i2c_apps_clks);
2057 for (i = 0; i < num_cores; i++)
2058 i2c_apps_clks[i][0]->parent = i2c_apps_clks[i][1];
2059 }
2060
Tianyi Gou389ba432012-10-01 13:58:38 -07002061 clk_ops_local_pll.enable = sr_pll_clk_enable_9625;
2062
2063 vdd_dig_reg = regulator_get(NULL, "vdd_dig");
2064 if (IS_ERR(vdd_dig_reg))
2065 panic("clock-9625: Unable to get the vdd_dig regulator!");
2066
2067 vote_vdd_level(&vdd_dig, VDD_DIG_HIGH);
2068 regulator_enable(vdd_dig_reg);
2069
2070 enable_rpm_scaling();
2071
2072 reg_init();
Tianyi Gouabcddb72013-02-23 18:10:11 -08002073
2074 /* Construct measurement mux array */
2075 if (SOCINFO_VERSION_MAJOR(socinfo_get_version()) == 2) {
2076 memcpy(measure_mux,
2077 measure_mux_v2_only, sizeof(measure_mux_v2_only));
2078 memcpy(measure_mux + ARRAY_SIZE(measure_mux_v2_only),
2079 measure_mux_common, sizeof(measure_mux_common));
2080 } else
2081 memcpy(measure_mux,
2082 measure_mux_common, sizeof(measure_mux_common));
Tianyi Gou389ba432012-10-01 13:58:38 -07002083}
2084
2085static int __init msm9625_clock_late_init(void)
2086{
2087 return unvote_vdd_level(&vdd_dig, VDD_DIG_HIGH);
2088}
2089
2090struct clock_init_data msm9625_clock_init_data __initdata = {
2091 .table = msm_clocks_9625,
2092 .size = ARRAY_SIZE(msm_clocks_9625),
2093 .pre_init = msm9625_clock_pre_init,
2094 .post_init = msm9625_clock_post_init,
2095 .late_init = msm9625_clock_late_init,
2096};