blob: d8e4ed5f597532bfca5c697e3753cd375b0ffa04 [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
Patrick Dalyebc26bc2013-02-05 11:49:07 -0800281static const int *vdd_corner[] = {
282 [VDD_DIG_NONE] = VDD_UV(RPM_REGULATOR_CORNER_NONE),
283 [VDD_DIG_LOW] = VDD_UV(RPM_REGULATOR_CORNER_SVS_SOC),
284 [VDD_DIG_NOMINAL] = VDD_UV(RPM_REGULATOR_CORNER_NORMAL),
285 [VDD_DIG_HIGH] = VDD_UV(RPM_REGULATOR_CORNER_SUPER_TURBO),
Tianyi Gou389ba432012-10-01 13:58:38 -0700286};
287
Patrick Dalyebc26bc2013-02-05 11:49:07 -0800288static DEFINE_VDD_REGULATORS(vdd_dig, VDD_DIG_NUM, 1, vdd_corner);
Tianyi Gou389ba432012-10-01 13:58:38 -0700289
290/* TODO: Needs to confirm the below values */
291#define RPM_MISC_CLK_TYPE 0x306b6c63
292#define RPM_BUS_CLK_TYPE 0x316b6c63
293#define RPM_MEM_CLK_TYPE 0x326b6c63
294
295#define RPM_SMD_KEY_ENABLE 0x62616E45
296
297#define CXO_ID 0x0
298#define QDSS_ID 0x1
299
300#define PNOC_ID 0x0
301#define SNOC_ID 0x1
302#define CNOC_ID 0x2
303
304#define BIMC_ID 0x0
305
306#define D0_ID 1
307#define D1_ID 2
308#define A0_ID 3
309#define A1_ID 4
310#define A2_ID 5
311
312DEFINE_CLK_RPM_SMD_BRANCH(cxo_clk_src, cxo_a_clk_src,
313 RPM_MISC_CLK_TYPE, CXO_ID, 19200000);
314
315DEFINE_CLK_RPM_SMD(cnoc_clk, cnoc_a_clk, RPM_BUS_CLK_TYPE, CNOC_ID, NULL);
316DEFINE_CLK_RPM_SMD(pnoc_clk, pnoc_a_clk, RPM_BUS_CLK_TYPE, PNOC_ID, NULL);
317DEFINE_CLK_RPM_SMD(snoc_clk, snoc_a_clk, RPM_BUS_CLK_TYPE, SNOC_ID, NULL);
318
319DEFINE_CLK_RPM_SMD(bimc_clk, bimc_a_clk, RPM_MEM_CLK_TYPE, BIMC_ID, NULL);
320
321DEFINE_CLK_RPM_SMD_QDSS(qdss_clk, qdss_a_clk, RPM_MISC_CLK_TYPE, QDSS_ID);
322
323DEFINE_CLK_RPM_SMD_XO_BUFFER(cxo_d0, cxo_d0_a, D0_ID);
324DEFINE_CLK_RPM_SMD_XO_BUFFER(cxo_d1, cxo_d1_a, D1_ID);
325DEFINE_CLK_RPM_SMD_XO_BUFFER(cxo_a0, cxo_a0_a, A0_ID);
326DEFINE_CLK_RPM_SMD_XO_BUFFER(cxo_a1, cxo_a1_a, A1_ID);
327DEFINE_CLK_RPM_SMD_XO_BUFFER(cxo_a2, cxo_a2_a, A2_ID);
328
329DEFINE_CLK_RPM_SMD_XO_BUFFER_PINCTRL(cxo_d0_pin, cxo_d0_a_pin, D0_ID);
330DEFINE_CLK_RPM_SMD_XO_BUFFER_PINCTRL(cxo_d1_pin, cxo_d1_a_pin, D1_ID);
331DEFINE_CLK_RPM_SMD_XO_BUFFER_PINCTRL(cxo_a0_pin, cxo_a0_a_pin, A0_ID);
332DEFINE_CLK_RPM_SMD_XO_BUFFER_PINCTRL(cxo_a1_pin, cxo_a1_a_pin, A1_ID);
333DEFINE_CLK_RPM_SMD_XO_BUFFER_PINCTRL(cxo_a2_pin, cxo_a2_a_pin, A2_ID);
334
Tianyi Gou27df1bb2012-10-11 14:44:01 -0700335static unsigned int soft_vote_gpll0;
336
Tianyi Gou389ba432012-10-01 13:58:38 -0700337static struct pll_vote_clk gpll0_clk_src = {
338 .en_reg = (void __iomem *)APCS_GPLL_ENA_VOTE_REG,
Tianyi Gou2aee4652013-03-11 19:15:22 -0700339 .en_mask = BIT(0),
Tianyi Gou389ba432012-10-01 13:58:38 -0700340 .status_reg = (void __iomem *)GPLL0_STATUS_REG,
341 .status_mask = BIT(17),
Tianyi Gou27df1bb2012-10-11 14:44:01 -0700342 .soft_vote = &soft_vote_gpll0,
343 .soft_vote_mask = PLL_SOFT_VOTE_PRIMARY,
Tianyi Gou389ba432012-10-01 13:58:38 -0700344 .base = &virt_bases[GCC_BASE],
345 .c = {
Saravana Kannan7a6532e2012-10-18 20:51:13 -0700346 .parent = &cxo_clk_src.c,
Tianyi Gou389ba432012-10-01 13:58:38 -0700347 .rate = 600000000,
348 .dbg_name = "gpll0_clk_src",
Tianyi Gou27df1bb2012-10-11 14:44:01 -0700349 .ops = &clk_ops_pll_acpu_vote,
Tianyi Gou389ba432012-10-01 13:58:38 -0700350 CLK_INIT(gpll0_clk_src.c),
351 },
352};
353
Tianyi Gou27df1bb2012-10-11 14:44:01 -0700354static struct pll_vote_clk gpll0_activeonly_clk_src = {
355 .en_reg = (void __iomem *)APCS_GPLL_ENA_VOTE_REG,
Tianyi Gou2aee4652013-03-11 19:15:22 -0700356 .en_mask = BIT(0),
Tianyi Gou27df1bb2012-10-11 14:44:01 -0700357 .status_reg = (void __iomem *)GPLL0_STATUS_REG,
358 .status_mask = BIT(17),
359 .soft_vote = &soft_vote_gpll0,
360 .soft_vote_mask = PLL_SOFT_VOTE_ACPU,
361 .base = &virt_bases[GCC_BASE],
362 .c = {
363 .rate = 600000000,
364 .dbg_name = "gpll0_activeonly_clk_src",
365 .ops = &clk_ops_pll_acpu_vote,
366 CLK_INIT(gpll0_activeonly_clk_src.c),
367 },
368};
369
Tianyi Gou389ba432012-10-01 13:58:38 -0700370static struct pll_vote_clk gpll1_clk_src = {
371 .en_reg = (void __iomem *)APCS_GPLL_ENA_VOTE_REG,
372 .en_mask = BIT(1),
373 .status_reg = (void __iomem *)GPLL1_STATUS_REG,
374 .status_mask = BIT(17),
Tianyi Gou389ba432012-10-01 13:58:38 -0700375 .base = &virt_bases[GCC_BASE],
376 .c = {
Saravana Kannan7a6532e2012-10-18 20:51:13 -0700377 .parent = &cxo_clk_src.c,
Tianyi Gou389ba432012-10-01 13:58:38 -0700378 .rate = 480000000,
379 .dbg_name = "gpll1_clk_src",
380 .ops = &clk_ops_pll_vote,
381 CLK_INIT(gpll1_clk_src.c),
382 },
383};
384
Tianyi Goua717ddd2012-10-05 17:06:24 -0700385static struct pll_freq_tbl apcs_pll_freq[] = {
386 F_APCS_PLL(748800000, 0x27, 0x0, 0x1, 0x0, 0x0, 0x0),
387 F_APCS_PLL(998400000, 0x34, 0x0, 0x1, 0x0, 0x0, 0x0),
388 PLL_F_END
389};
390
Tianyi Gou389ba432012-10-01 13:58:38 -0700391/*
392 * Need to skip handoff of the acpu pll to avoid handoff code
393 * to turn off the pll when the acpu is running off this pll.
394 */
395static struct pll_clk apcspll_clk_src = {
396 .mode_reg = (void __iomem *)APCS_CPU_PLL_MODE_REG,
Tianyi Goua717ddd2012-10-05 17:06:24 -0700397 .l_reg = (void __iomem *)APCS_CPU_PLL_L_REG,
398 .m_reg = (void __iomem *)APCS_CPU_PLL_M_REG,
399 .n_reg = (void __iomem *)APCS_CPU_PLL_N_REG,
400 .config_reg = (void __iomem *)APCS_CPU_PLL_USER_CTL_REG,
Tianyi Gou389ba432012-10-01 13:58:38 -0700401 .status_reg = (void __iomem *)APCS_CPU_PLL_STATUS_REG,
Tianyi Goua717ddd2012-10-05 17:06:24 -0700402 .freq_tbl = apcs_pll_freq,
403 .masks = {
404 .vco_mask = BM(21, 20),
405 .pre_div_mask = BM(14, 12),
406 .post_div_mask = BM(9, 8),
407 .mn_en_mask = BIT(24),
408 .main_output_mask = BIT(0),
409 },
Tianyi Gou389ba432012-10-01 13:58:38 -0700410 .base = &virt_bases[APCS_PLL_BASE],
411 .c = {
Tianyi Gou389ba432012-10-01 13:58:38 -0700412 .dbg_name = "apcspll_clk_src",
413 .ops = &clk_ops_local_pll,
414 CLK_INIT(apcspll_clk_src.c),
415 .flags = CLKFLAG_SKIP_HANDOFF,
416 },
417};
418
419static DEFINE_CLK_VOTER(pnoc_msmbus_clk, &pnoc_clk.c, LONG_MAX);
420static DEFINE_CLK_VOTER(snoc_msmbus_clk, &snoc_clk.c, LONG_MAX);
421static DEFINE_CLK_VOTER(cnoc_msmbus_clk, &cnoc_clk.c, LONG_MAX);
422static DEFINE_CLK_VOTER(pnoc_msmbus_a_clk, &pnoc_a_clk.c, LONG_MAX);
423static DEFINE_CLK_VOTER(snoc_msmbus_a_clk, &snoc_a_clk.c, LONG_MAX);
424static DEFINE_CLK_VOTER(cnoc_msmbus_a_clk, &cnoc_a_clk.c, LONG_MAX);
425
426static DEFINE_CLK_VOTER(bimc_msmbus_clk, &bimc_clk.c, LONG_MAX);
427static DEFINE_CLK_VOTER(bimc_msmbus_a_clk, &bimc_a_clk.c, LONG_MAX);
428
429static DEFINE_CLK_VOTER(pnoc_sdcc2_clk, &pnoc_clk.c, LONG_MAX);
430static DEFINE_CLK_VOTER(pnoc_sdcc3_clk, &pnoc_clk.c, LONG_MAX);
431
432static DEFINE_CLK_VOTER(pnoc_sps_clk, &pnoc_clk.c, LONG_MAX);
433
434static struct clk_freq_tbl ftbl_gcc_ipa_clk[] = {
435 F( 50000000, gpll0, 12, 0, 0),
436 F( 92310000, gpll0, 6.5, 0, 0),
437 F(100000000, gpll0, 6, 0, 0),
438 F_END
439};
440
441static struct rcg_clk ipa_clk_src = {
442 .cmd_rcgr_reg = IPA_CMD_RCGR,
443 .set_rate = set_rate_mnd,
444 .freq_tbl = ftbl_gcc_ipa_clk,
445 .current_freq = &rcg_dummy_freq,
446 .base = &virt_bases[GCC_BASE],
447 .c = {
448 .dbg_name = "ipa_clk_src",
449 .ops = &clk_ops_rcg_mnd,
450 VDD_DIG_FMAX_MAP2(LOW, 50000000, NOMINAL, 100000000),
451 CLK_INIT(ipa_clk_src.c)
452 },
453};
454
Tianyi Goub1d13972013-01-23 22:55:22 -0800455static struct clk_freq_tbl ftbl_gcc_blsp1_qup1_6_i2c_apps_clk[] = {
456 F(19200000, cxo, 1, 0, 0),
457 F(50000000, gpll0, 12, 0, 0),
458 F_END
459};
460
461static struct rcg_clk blsp1_qup1_i2c_apps_clk_src = {
462 .cmd_rcgr_reg = BLSP1_QUP1_I2C_APPS_CMD_RCGR,
463 .set_rate = set_rate_hid,
464 .freq_tbl = ftbl_gcc_blsp1_qup1_6_i2c_apps_clk,
465 .current_freq = &rcg_dummy_freq,
466 .base = &virt_bases[GCC_BASE],
467 .c = {
468 .dbg_name = "blsp1_qup1_i2c_apps_clk_src",
469 .ops = &clk_ops_rcg,
470 VDD_DIG_FMAX_MAP1(LOW, 50000000),
471 CLK_INIT(blsp1_qup1_i2c_apps_clk_src.c),
472 },
473};
474
475static struct rcg_clk blsp1_qup2_i2c_apps_clk_src = {
476 .cmd_rcgr_reg = BLSP1_QUP2_I2C_APPS_CMD_RCGR,
477 .set_rate = set_rate_hid,
478 .freq_tbl = ftbl_gcc_blsp1_qup1_6_i2c_apps_clk,
479 .current_freq = &rcg_dummy_freq,
480 .base = &virt_bases[GCC_BASE],
481 .c = {
482 .dbg_name = "blsp1_qup2_i2c_apps_clk_src",
483 .ops = &clk_ops_rcg,
484 VDD_DIG_FMAX_MAP1(LOW, 50000000),
485 CLK_INIT(blsp1_qup2_i2c_apps_clk_src.c),
486 },
487};
488
489static struct rcg_clk blsp1_qup3_i2c_apps_clk_src = {
490 .cmd_rcgr_reg = BLSP1_QUP3_I2C_APPS_CMD_RCGR,
491 .set_rate = set_rate_hid,
492 .freq_tbl = ftbl_gcc_blsp1_qup1_6_i2c_apps_clk,
493 .current_freq = &rcg_dummy_freq,
494 .base = &virt_bases[GCC_BASE],
495 .c = {
496 .dbg_name = "blsp1_qup3_i2c_apps_clk_src",
497 .ops = &clk_ops_rcg,
498 VDD_DIG_FMAX_MAP1(LOW, 50000000),
499 CLK_INIT(blsp1_qup3_i2c_apps_clk_src.c),
500 },
501};
502
503static struct rcg_clk blsp1_qup4_i2c_apps_clk_src = {
504 .cmd_rcgr_reg = BLSP1_QUP4_I2C_APPS_CMD_RCGR,
505 .set_rate = set_rate_hid,
506 .freq_tbl = ftbl_gcc_blsp1_qup1_6_i2c_apps_clk,
507 .current_freq = &rcg_dummy_freq,
508 .base = &virt_bases[GCC_BASE],
509 .c = {
510 .dbg_name = "blsp1_qup4_i2c_apps_clk_src",
511 .ops = &clk_ops_rcg,
512 VDD_DIG_FMAX_MAP1(LOW, 50000000),
513 CLK_INIT(blsp1_qup4_i2c_apps_clk_src.c),
514 },
515};
516
517static struct rcg_clk blsp1_qup5_i2c_apps_clk_src = {
518 .cmd_rcgr_reg = BLSP1_QUP5_I2C_APPS_CMD_RCGR,
519 .set_rate = set_rate_hid,
520 .freq_tbl = ftbl_gcc_blsp1_qup1_6_i2c_apps_clk,
521 .current_freq = &rcg_dummy_freq,
522 .base = &virt_bases[GCC_BASE],
523 .c = {
524 .dbg_name = "blsp1_qup5_i2c_apps_clk_src",
525 .ops = &clk_ops_rcg,
526 VDD_DIG_FMAX_MAP1(LOW, 50000000),
527 CLK_INIT(blsp1_qup5_i2c_apps_clk_src.c),
528 },
529};
530
531static struct rcg_clk blsp1_qup6_i2c_apps_clk_src = {
532 .cmd_rcgr_reg = BLSP1_QUP6_I2C_APPS_CMD_RCGR,
533 .set_rate = set_rate_hid,
534 .freq_tbl = ftbl_gcc_blsp1_qup1_6_i2c_apps_clk,
535 .current_freq = &rcg_dummy_freq,
536 .base = &virt_bases[GCC_BASE],
537 .c = {
538 .dbg_name = "blsp1_qup6_i2c_apps_clk_src",
539 .ops = &clk_ops_rcg,
540 VDD_DIG_FMAX_MAP1(LOW, 50000000),
541 CLK_INIT(blsp1_qup6_i2c_apps_clk_src.c),
542 },
543};
544
Tianyi Gou389ba432012-10-01 13:58:38 -0700545static struct clk_freq_tbl ftbl_gcc_blsp1_qup1_6_spi_apps_clk[] = {
546 F( 960000, cxo, 10, 1, 2),
547 F( 4800000, cxo, 4, 0, 0),
548 F( 9600000, cxo, 2, 0, 0),
549 F(15000000, gpll0, 10, 1, 4),
550 F(19200000, cxo, 1, 0, 0),
551 F(25000000, gpll0, 12, 1, 2),
552 F(50000000, gpll0, 12, 0, 0),
553 F_END
554};
555
556static struct rcg_clk blsp1_qup1_spi_apps_clk_src = {
557 .cmd_rcgr_reg = BLSP1_QUP1_SPI_APPS_CMD_RCGR,
558 .set_rate = set_rate_mnd,
559 .freq_tbl = ftbl_gcc_blsp1_qup1_6_spi_apps_clk,
560 .current_freq = &rcg_dummy_freq,
561 .base = &virt_bases[GCC_BASE],
562 .c = {
563 .dbg_name = "blsp1_qup1_spi_apps_clk_src",
564 .ops = &clk_ops_rcg_mnd,
565 VDD_DIG_FMAX_MAP2(LOW, 25000000, NOMINAL, 50000000),
566 CLK_INIT(blsp1_qup1_spi_apps_clk_src.c)
567 },
568};
569
570static struct rcg_clk blsp1_qup2_spi_apps_clk_src = {
571 .cmd_rcgr_reg = BLSP1_QUP2_SPI_APPS_CMD_RCGR,
572 .set_rate = set_rate_mnd,
573 .freq_tbl = ftbl_gcc_blsp1_qup1_6_spi_apps_clk,
574 .current_freq = &rcg_dummy_freq,
575 .base = &virt_bases[GCC_BASE],
576 .c = {
577 .dbg_name = "blsp1_qup2_spi_apps_clk_src",
578 .ops = &clk_ops_rcg_mnd,
579 VDD_DIG_FMAX_MAP2(LOW, 25000000, NOMINAL, 50000000),
580 CLK_INIT(blsp1_qup2_spi_apps_clk_src.c)
581 },
582};
583
584static struct rcg_clk blsp1_qup3_spi_apps_clk_src = {
585 .cmd_rcgr_reg = BLSP1_QUP3_SPI_APPS_CMD_RCGR,
586 .set_rate = set_rate_mnd,
587 .freq_tbl = ftbl_gcc_blsp1_qup1_6_spi_apps_clk,
588 .current_freq = &rcg_dummy_freq,
589 .base = &virt_bases[GCC_BASE],
590 .c = {
591 .dbg_name = "blsp1_qup3_spi_apps_clk_src",
592 .ops = &clk_ops_rcg_mnd,
593 VDD_DIG_FMAX_MAP2(LOW, 25000000, NOMINAL, 50000000),
594 CLK_INIT(blsp1_qup3_spi_apps_clk_src.c)
595 },
596};
597
598static struct rcg_clk blsp1_qup4_spi_apps_clk_src = {
599 .cmd_rcgr_reg = BLSP1_QUP4_SPI_APPS_CMD_RCGR,
600 .set_rate = set_rate_mnd,
601 .freq_tbl = ftbl_gcc_blsp1_qup1_6_spi_apps_clk,
602 .current_freq = &rcg_dummy_freq,
603 .base = &virt_bases[GCC_BASE],
604 .c = {
605 .dbg_name = "blsp1_qup4_spi_apps_clk_src",
606 .ops = &clk_ops_rcg_mnd,
607 VDD_DIG_FMAX_MAP2(LOW, 25000000, NOMINAL, 50000000),
608 CLK_INIT(blsp1_qup4_spi_apps_clk_src.c)
609 },
610};
611
612static struct rcg_clk blsp1_qup5_spi_apps_clk_src = {
613 .cmd_rcgr_reg = BLSP1_QUP5_SPI_APPS_CMD_RCGR,
614 .set_rate = set_rate_mnd,
615 .freq_tbl = ftbl_gcc_blsp1_qup1_6_spi_apps_clk,
616 .current_freq = &rcg_dummy_freq,
617 .base = &virt_bases[GCC_BASE],
618 .c = {
619 .dbg_name = "blsp1_qup5_spi_apps_clk_src",
620 .ops = &clk_ops_rcg_mnd,
621 VDD_DIG_FMAX_MAP2(LOW, 25000000, NOMINAL, 50000000),
622 CLK_INIT(blsp1_qup5_spi_apps_clk_src.c)
623 },
624};
625
626static struct rcg_clk blsp1_qup6_spi_apps_clk_src = {
627 .cmd_rcgr_reg = BLSP1_QUP6_SPI_APPS_CMD_RCGR,
628 .set_rate = set_rate_mnd,
629 .freq_tbl = ftbl_gcc_blsp1_qup1_6_spi_apps_clk,
630 .current_freq = &rcg_dummy_freq,
631 .base = &virt_bases[GCC_BASE],
632 .c = {
633 .dbg_name = "blsp1_qup6_spi_apps_clk_src",
634 .ops = &clk_ops_rcg_mnd,
635 VDD_DIG_FMAX_MAP2(LOW, 25000000, NOMINAL, 50000000),
636 CLK_INIT(blsp1_qup6_spi_apps_clk_src.c)
637 },
638};
639
640static struct clk_freq_tbl ftbl_gcc_blsp1_uart1_6_apps_clk[] = {
Vikram Mulukutlad3dca652012-11-19 11:04:13 -0800641 F_GCC_GND,
Tianyi Gou389ba432012-10-01 13:58:38 -0700642 F( 3686400, gpll0, 1, 96, 15625),
643 F( 7372800, gpll0, 1, 192, 15625),
644 F(14745600, gpll0, 1, 384, 15625),
645 F(16000000, gpll0, 5, 2, 15),
646 F(19200000, cxo, 1, 0, 0),
647 F(24000000, gpll0, 5, 1, 5),
648 F(32000000, gpll0, 1, 4, 75),
649 F(40000000, gpll0, 15, 0, 0),
650 F(46400000, gpll0, 1, 29, 375),
651 F(48000000, gpll0, 12.5, 0, 0),
652 F(51200000, gpll0, 1, 32, 375),
653 F(56000000, gpll0, 1, 7, 75),
654 F(58982400, gpll0, 1, 1536, 15625),
655 F(60000000, gpll0, 10, 0, 0),
656 F_END
657};
658
659static struct rcg_clk blsp1_uart1_apps_clk_src = {
660 .cmd_rcgr_reg = BLSP1_UART1_APPS_CMD_RCGR,
661 .set_rate = set_rate_mnd,
662 .freq_tbl = ftbl_gcc_blsp1_uart1_6_apps_clk,
663 .current_freq = &rcg_dummy_freq,
664 .base = &virt_bases[GCC_BASE],
665 .c = {
666 .dbg_name = "blsp1_uart1_apps_clk_src",
667 .ops = &clk_ops_rcg_mnd,
668 VDD_DIG_FMAX_MAP2(LOW, 31580000, NOMINAL, 63160000),
669 CLK_INIT(blsp1_uart1_apps_clk_src.c)
670 },
671};
672
673static struct rcg_clk blsp1_uart2_apps_clk_src = {
674 .cmd_rcgr_reg = BLSP1_UART2_APPS_CMD_RCGR,
675 .set_rate = set_rate_mnd,
676 .freq_tbl = ftbl_gcc_blsp1_uart1_6_apps_clk,
677 .current_freq = &rcg_dummy_freq,
678 .base = &virt_bases[GCC_BASE],
679 .c = {
680 .dbg_name = "blsp1_uart2_apps_clk_src",
681 .ops = &clk_ops_rcg_mnd,
682 VDD_DIG_FMAX_MAP2(LOW, 31580000, NOMINAL, 63160000),
683 CLK_INIT(blsp1_uart2_apps_clk_src.c)
684 },
685};
686
687static struct rcg_clk blsp1_uart3_apps_clk_src = {
688 .cmd_rcgr_reg = BLSP1_UART3_APPS_CMD_RCGR,
689 .set_rate = set_rate_mnd,
690 .freq_tbl = ftbl_gcc_blsp1_uart1_6_apps_clk,
691 .current_freq = &rcg_dummy_freq,
692 .base = &virt_bases[GCC_BASE],
693 .c = {
694 .dbg_name = "blsp1_uart3_apps_clk_src",
695 .ops = &clk_ops_rcg_mnd,
696 VDD_DIG_FMAX_MAP2(LOW, 31580000, NOMINAL, 63160000),
697 CLK_INIT(blsp1_uart3_apps_clk_src.c)
698 },
699};
700
701static struct rcg_clk blsp1_uart4_apps_clk_src = {
702 .cmd_rcgr_reg = BLSP1_UART4_APPS_CMD_RCGR,
703 .set_rate = set_rate_mnd,
704 .freq_tbl = ftbl_gcc_blsp1_uart1_6_apps_clk,
705 .current_freq = &rcg_dummy_freq,
706 .base = &virt_bases[GCC_BASE],
707 .c = {
708 .dbg_name = "blsp1_uart4_apps_clk_src",
709 .ops = &clk_ops_rcg_mnd,
710 VDD_DIG_FMAX_MAP2(LOW, 31580000, NOMINAL, 63160000),
711 CLK_INIT(blsp1_uart4_apps_clk_src.c)
712 },
713};
714
715static struct rcg_clk blsp1_uart5_apps_clk_src = {
716 .cmd_rcgr_reg = BLSP1_UART5_APPS_CMD_RCGR,
717 .set_rate = set_rate_mnd,
718 .freq_tbl = ftbl_gcc_blsp1_uart1_6_apps_clk,
719 .current_freq = &rcg_dummy_freq,
720 .base = &virt_bases[GCC_BASE],
721 .c = {
722 .dbg_name = "blsp1_uart5_apps_clk_src",
723 .ops = &clk_ops_rcg_mnd,
724 VDD_DIG_FMAX_MAP2(LOW, 31580000, NOMINAL, 63160000),
725 CLK_INIT(blsp1_uart5_apps_clk_src.c)
726 },
727};
728
729static struct rcg_clk blsp1_uart6_apps_clk_src = {
730 .cmd_rcgr_reg = BLSP1_UART6_APPS_CMD_RCGR,
731 .set_rate = set_rate_mnd,
732 .freq_tbl = ftbl_gcc_blsp1_uart1_6_apps_clk,
733 .current_freq = &rcg_dummy_freq,
734 .base = &virt_bases[GCC_BASE],
735 .c = {
736 .dbg_name = "blsp1_uart6_apps_clk_src",
737 .ops = &clk_ops_rcg_mnd,
738 VDD_DIG_FMAX_MAP2(LOW, 31580000, NOMINAL, 63160000),
739 CLK_INIT(blsp1_uart6_apps_clk_src.c)
740 },
741};
742
743static struct clk_freq_tbl ftbl_gcc_ce1_clk[] = {
744 F( 50000000, gpll0, 12, 0, 0),
745 F(100000000, gpll0, 6, 0, 0),
746 F_END
747};
748
749static struct rcg_clk ce1_clk_src = {
750 .cmd_rcgr_reg = CE1_CMD_RCGR,
751 .set_rate = set_rate_hid,
752 .freq_tbl = ftbl_gcc_ce1_clk,
753 .current_freq = &rcg_dummy_freq,
754 .base = &virt_bases[GCC_BASE],
755 .c = {
756 .dbg_name = "ce1_clk_src",
757 .ops = &clk_ops_rcg,
758 VDD_DIG_FMAX_MAP2(LOW, 50000000, NOMINAL, 100000000),
759 CLK_INIT(ce1_clk_src.c),
760 },
761};
762
763static struct clk_freq_tbl ftbl_gcc_gp_clk[] = {
764 F(19200000, cxo, 1, 0, 0),
765 F_END
766};
767
768static struct rcg_clk gp1_clk_src = {
769 .cmd_rcgr_reg = GP1_CMD_RCGR,
770 .set_rate = set_rate_mnd,
771 .freq_tbl = ftbl_gcc_gp_clk,
772 .current_freq = &rcg_dummy_freq,
773 .base = &virt_bases[GCC_BASE],
774 .c = {
775 .dbg_name = "gp1_clk_src",
776 .ops = &clk_ops_rcg_mnd,
777 VDD_DIG_FMAX_MAP2(LOW, 100000000, NOMINAL, 200000000),
778 CLK_INIT(gp1_clk_src.c)
779 },
780};
781
782static struct rcg_clk gp2_clk_src = {
783 .cmd_rcgr_reg = GP2_CMD_RCGR,
784 .set_rate = set_rate_mnd,
785 .freq_tbl = ftbl_gcc_gp_clk,
786 .current_freq = &rcg_dummy_freq,
787 .base = &virt_bases[GCC_BASE],
788 .c = {
789 .dbg_name = "gp2_clk_src",
790 .ops = &clk_ops_rcg_mnd,
791 VDD_DIG_FMAX_MAP2(LOW, 100000000, NOMINAL, 200000000),
792 CLK_INIT(gp2_clk_src.c)
793 },
794};
795
796static struct rcg_clk gp3_clk_src = {
797 .cmd_rcgr_reg = GP3_CMD_RCGR,
798 .set_rate = set_rate_mnd,
799 .freq_tbl = ftbl_gcc_gp_clk,
800 .current_freq = &rcg_dummy_freq,
801 .base = &virt_bases[GCC_BASE],
802 .c = {
803 .dbg_name = "gp3_clk_src",
804 .ops = &clk_ops_rcg_mnd,
805 VDD_DIG_FMAX_MAP2(LOW, 100000000, NOMINAL, 200000000),
806 CLK_INIT(gp3_clk_src.c)
807 },
808};
809
810static struct clk_freq_tbl ftbl_gcc_pdm2_clk[] = {
811 F(60000000, gpll0, 10, 0, 0),
812 F_END
813};
814
815static struct rcg_clk pdm2_clk_src = {
816 .cmd_rcgr_reg = PDM2_CMD_RCGR,
817 .set_rate = set_rate_hid,
818 .freq_tbl = ftbl_gcc_pdm2_clk,
819 .current_freq = &rcg_dummy_freq,
820 .base = &virt_bases[GCC_BASE],
821 .c = {
822 .dbg_name = "pdm2_clk_src",
823 .ops = &clk_ops_rcg,
824 VDD_DIG_FMAX_MAP1(LOW, 60000000),
825 CLK_INIT(pdm2_clk_src.c),
826 },
827};
828
829static struct clk_freq_tbl ftbl_gcc_qpic_clk[] = {
830 F( 50000000, gpll0, 12, 0, 0),
831 F(100000000, gpll0, 6, 0, 0),
832 F_END
833};
834
835static struct rcg_clk qpic_clk_src = {
836 .cmd_rcgr_reg = QPIC_CMD_RCGR,
837 .set_rate = set_rate_mnd,
838 .freq_tbl = ftbl_gcc_qpic_clk,
839 .current_freq = &rcg_dummy_freq,
840 .base = &virt_bases[GCC_BASE],
841 .c = {
842 .dbg_name = "qpic_clk_src",
843 .ops = &clk_ops_rcg_mnd,
844 VDD_DIG_FMAX_MAP2(LOW, 50000000, NOMINAL, 100000000),
845 CLK_INIT(qpic_clk_src.c)
846 },
847};
848
849static struct clk_freq_tbl ftbl_gcc_sdcc2_apps_clk[] = {
850 F( 144000, cxo, 16, 3, 25),
851 F( 400000, cxo, 12, 1, 4),
852 F( 20000000, gpll0, 15, 1, 2),
853 F( 25000000, gpll0, 12, 1, 2),
854 F( 50000000, gpll0, 12, 0, 0),
855 F(100000000, gpll0, 6, 0, 0),
856 F(200000000, gpll0, 3, 0, 0),
857 F_END
858};
859
860static struct clk_freq_tbl ftbl_gcc_sdcc3_apps_clk[] = {
861 F( 144000, cxo, 16, 3, 25),
862 F( 400000, cxo, 12, 1, 4),
863 F( 20000000, gpll0, 15, 1, 2),
864 F( 25000000, gpll0, 12, 1, 2),
865 F( 50000000, gpll0, 12, 0, 0),
866 F(100000000, gpll0, 6, 0, 0),
867 F_END
868};
869
870static struct rcg_clk sdcc2_apps_clk_src = {
871 .cmd_rcgr_reg = SDCC2_APPS_CMD_RCGR,
872 .set_rate = set_rate_mnd,
873 .freq_tbl = ftbl_gcc_sdcc2_apps_clk,
874 .current_freq = &rcg_dummy_freq,
875 .base = &virt_bases[GCC_BASE],
876 .c = {
877 .dbg_name = "sdcc2_apps_clk_src",
878 .ops = &clk_ops_rcg_mnd,
879 VDD_DIG_FMAX_MAP2(LOW, 100000000, NOMINAL, 200000000),
880 CLK_INIT(sdcc2_apps_clk_src.c)
881 },
882};
883
884static struct rcg_clk sdcc3_apps_clk_src = {
885 .cmd_rcgr_reg = SDCC3_APPS_CMD_RCGR,
886 .set_rate = set_rate_mnd,
887 .freq_tbl = ftbl_gcc_sdcc3_apps_clk,
888 .current_freq = &rcg_dummy_freq,
889 .base = &virt_bases[GCC_BASE],
890 .c = {
891 .dbg_name = "sdcc3_apps_clk_src",
892 .ops = &clk_ops_rcg_mnd,
893 VDD_DIG_FMAX_MAP2(LOW, 50000000, NOMINAL, 100000000),
894 CLK_INIT(sdcc3_apps_clk_src.c)
895 },
896};
897
898static struct clk_freq_tbl ftbl_gcc_usb_hs_system_clk[] = {
899 F(75000000, gpll0, 8, 0, 0),
900 F_END
901};
902
903static struct rcg_clk usb_hs_system_clk_src = {
904 .cmd_rcgr_reg = USB_HS_SYSTEM_CMD_RCGR,
905 .set_rate = set_rate_hid,
906 .freq_tbl = ftbl_gcc_usb_hs_system_clk,
907 .current_freq = &rcg_dummy_freq,
908 .base = &virt_bases[GCC_BASE],
909 .c = {
910 .dbg_name = "usb_hs_system_clk_src",
911 .ops = &clk_ops_rcg,
912 VDD_DIG_FMAX_MAP2(LOW, 37500000, NOMINAL, 75000000),
913 CLK_INIT(usb_hs_system_clk_src.c),
914 },
915};
916
917static struct clk_freq_tbl ftbl_gcc_usb_hsic_clk[] = {
918 F_HSIC(480000000, gpll1, 1, 0, 0),
919 F_END
920};
921
922static struct rcg_clk usb_hsic_clk_src = {
923 .cmd_rcgr_reg = USB_HSIC_CMD_RCGR,
924 .set_rate = set_rate_hid,
925 .freq_tbl = ftbl_gcc_usb_hsic_clk,
926 .current_freq = &rcg_dummy_freq,
927 .base = &virt_bases[GCC_BASE],
928 .c = {
929 .dbg_name = "usb_hsic_clk_src",
930 .ops = &clk_ops_rcg,
931 VDD_DIG_FMAX_MAP1(LOW, 480000000),
932 CLK_INIT(usb_hsic_clk_src.c),
933 },
934};
935
936static struct clk_freq_tbl ftbl_gcc_usb_hsic_io_cal_clk[] = {
937 F(9600000, cxo, 2, 0, 0),
938 F_END
939};
940
941static struct rcg_clk usb_hsic_io_cal_clk_src = {
942 .cmd_rcgr_reg = USB_HSIC_IO_CAL_CMD_RCGR,
943 .set_rate = set_rate_hid,
944 .freq_tbl = ftbl_gcc_usb_hsic_io_cal_clk,
945 .current_freq = &rcg_dummy_freq,
946 .base = &virt_bases[GCC_BASE],
947 .c = {
948 .dbg_name = "usb_hsic_io_cal_clk_src",
949 .ops = &clk_ops_rcg,
950 VDD_DIG_FMAX_MAP1(LOW, 9600000),
951 CLK_INIT(usb_hsic_io_cal_clk_src.c),
952 },
953};
954
955static struct clk_freq_tbl ftbl_gcc_usb_hsic_system_clk[] = {
956 F(75000000, gpll0, 8, 0, 0),
957 F_END
958};
959
960static struct rcg_clk usb_hsic_system_clk_src = {
961 .cmd_rcgr_reg = USB_HSIC_SYSTEM_CMD_RCGR,
962 .set_rate = set_rate_hid,
963 .freq_tbl = ftbl_gcc_usb_hsic_system_clk,
964 .current_freq = &rcg_dummy_freq,
965 .base = &virt_bases[GCC_BASE],
966 .c = {
967 .dbg_name = "usb_hsic_system_clk_src",
968 .ops = &clk_ops_rcg,
969 VDD_DIG_FMAX_MAP2(LOW, 60000000, NOMINAL, 75000000),
970 CLK_INIT(usb_hsic_system_clk_src.c),
971 },
972};
973
974static struct clk_freq_tbl ftbl_gcc_usb_hsic_xcvr_fs_clk[] = {
975 F(60000000, gpll0, 10, 0, 0),
976 F_END
977};
978
979static struct rcg_clk usb_hsic_xcvr_fs_clk_src = {
980 .cmd_rcgr_reg = USB_HSIC_XCVR_FS_CMD_RCGR,
981 .set_rate = set_rate_hid,
982 .freq_tbl = ftbl_gcc_usb_hsic_xcvr_fs_clk,
983 .current_freq = &rcg_dummy_freq,
984 .base = &virt_bases[GCC_BASE],
985 .c = {
986 .dbg_name = "usb_hsic_xcvr_fs_clk_src",
987 .ops = &clk_ops_rcg,
988 VDD_DIG_FMAX_MAP1(LOW, 60000000),
989 CLK_INIT(usb_hsic_xcvr_fs_clk_src.c),
990 },
991};
992
993static struct local_vote_clk gcc_bam_dma_ahb_clk = {
994 .cbcr_reg = BAM_DMA_AHB_CBCR,
995 .vote_reg = APCS_CLOCK_BRANCH_ENA_VOTE,
996 .en_mask = BIT(12),
997 .base = &virt_bases[GCC_BASE],
998 .c = {
999 .dbg_name = "gcc_bam_dma_ahb_clk",
1000 .ops = &clk_ops_vote,
1001 CLK_INIT(gcc_bam_dma_ahb_clk.c),
1002 },
1003};
1004
1005static struct local_vote_clk gcc_blsp1_ahb_clk = {
1006 .cbcr_reg = BLSP1_AHB_CBCR,
1007 .vote_reg = APCS_CLOCK_BRANCH_ENA_VOTE,
1008 .en_mask = BIT(17),
1009 .base = &virt_bases[GCC_BASE],
1010 .c = {
1011 .dbg_name = "gcc_blsp1_ahb_clk",
1012 .ops = &clk_ops_vote,
1013 CLK_INIT(gcc_blsp1_ahb_clk.c),
1014 },
1015};
1016
1017static struct branch_clk gcc_blsp1_qup1_i2c_apps_clk = {
1018 .cbcr_reg = BLSP1_QUP1_I2C_APPS_CBCR,
Tianyi Gou389ba432012-10-01 13:58:38 -07001019 .base = &virt_bases[GCC_BASE],
1020 .c = {
Saravana Kannan7a6532e2012-10-18 20:51:13 -07001021 .parent = &cxo_clk_src.c,
Tianyi Gou389ba432012-10-01 13:58:38 -07001022 .dbg_name = "gcc_blsp1_qup1_i2c_apps_clk",
1023 .ops = &clk_ops_branch,
1024 CLK_INIT(gcc_blsp1_qup1_i2c_apps_clk.c),
1025 },
1026};
1027
1028static struct branch_clk gcc_blsp1_qup1_spi_apps_clk = {
1029 .cbcr_reg = BLSP1_QUP1_SPI_APPS_CBCR,
Tianyi Gou389ba432012-10-01 13:58:38 -07001030 .has_sibling = 0,
1031 .base = &virt_bases[GCC_BASE],
1032 .c = {
Saravana Kannan7a6532e2012-10-18 20:51:13 -07001033 .parent = &blsp1_qup1_spi_apps_clk_src.c,
Tianyi Gou389ba432012-10-01 13:58:38 -07001034 .dbg_name = "gcc_blsp1_qup1_spi_apps_clk",
1035 .ops = &clk_ops_branch,
1036 CLK_INIT(gcc_blsp1_qup1_spi_apps_clk.c),
1037 },
1038};
1039
1040static struct branch_clk gcc_blsp1_qup2_i2c_apps_clk = {
1041 .cbcr_reg = BLSP1_QUP2_I2C_APPS_CBCR,
Tianyi Gou389ba432012-10-01 13:58:38 -07001042 .base = &virt_bases[GCC_BASE],
1043 .c = {
Saravana Kannan7a6532e2012-10-18 20:51:13 -07001044 .parent = &cxo_clk_src.c,
Tianyi Gou389ba432012-10-01 13:58:38 -07001045 .dbg_name = "gcc_blsp1_qup2_i2c_apps_clk",
1046 .ops = &clk_ops_branch,
1047 CLK_INIT(gcc_blsp1_qup2_i2c_apps_clk.c),
1048 },
1049};
1050
1051static struct branch_clk gcc_blsp1_qup2_spi_apps_clk = {
1052 .cbcr_reg = BLSP1_QUP2_SPI_APPS_CBCR,
Tianyi Gou389ba432012-10-01 13:58:38 -07001053 .has_sibling = 0,
1054 .base = &virt_bases[GCC_BASE],
1055 .c = {
Saravana Kannan7a6532e2012-10-18 20:51:13 -07001056 .parent = &blsp1_qup2_spi_apps_clk_src.c,
Tianyi Gou389ba432012-10-01 13:58:38 -07001057 .dbg_name = "gcc_blsp1_qup2_spi_apps_clk",
1058 .ops = &clk_ops_branch,
1059 CLK_INIT(gcc_blsp1_qup2_spi_apps_clk.c),
1060 },
1061};
1062
1063static struct branch_clk gcc_blsp1_qup3_i2c_apps_clk = {
1064 .cbcr_reg = BLSP1_QUP3_I2C_APPS_CBCR,
Tianyi Gou389ba432012-10-01 13:58:38 -07001065 .base = &virt_bases[GCC_BASE],
1066 .c = {
Saravana Kannan7a6532e2012-10-18 20:51:13 -07001067 .parent = &cxo_clk_src.c,
Tianyi Gou389ba432012-10-01 13:58:38 -07001068 .dbg_name = "gcc_blsp1_qup3_i2c_apps_clk",
1069 .ops = &clk_ops_branch,
1070 CLK_INIT(gcc_blsp1_qup3_i2c_apps_clk.c),
1071 },
1072};
1073
1074static struct branch_clk gcc_blsp1_qup3_spi_apps_clk = {
1075 .cbcr_reg = BLSP1_QUP3_SPI_APPS_CBCR,
Tianyi Gou389ba432012-10-01 13:58:38 -07001076 .has_sibling = 0,
1077 .base = &virt_bases[GCC_BASE],
1078 .c = {
Saravana Kannan7a6532e2012-10-18 20:51:13 -07001079 .parent = &blsp1_qup3_spi_apps_clk_src.c,
Tianyi Gou389ba432012-10-01 13:58:38 -07001080 .dbg_name = "gcc_blsp1_qup3_spi_apps_clk",
1081 .ops = &clk_ops_branch,
1082 CLK_INIT(gcc_blsp1_qup3_spi_apps_clk.c),
1083 },
1084};
1085
1086static struct branch_clk gcc_blsp1_qup4_i2c_apps_clk = {
1087 .cbcr_reg = BLSP1_QUP4_I2C_APPS_CBCR,
Tianyi Gou389ba432012-10-01 13:58:38 -07001088 .base = &virt_bases[GCC_BASE],
1089 .c = {
Saravana Kannan7a6532e2012-10-18 20:51:13 -07001090 .parent = &cxo_clk_src.c,
Tianyi Gou389ba432012-10-01 13:58:38 -07001091 .dbg_name = "gcc_blsp1_qup4_i2c_apps_clk",
1092 .ops = &clk_ops_branch,
1093 CLK_INIT(gcc_blsp1_qup4_i2c_apps_clk.c),
1094 },
1095};
1096
1097static struct branch_clk gcc_blsp1_qup4_spi_apps_clk = {
1098 .cbcr_reg = BLSP1_QUP4_SPI_APPS_CBCR,
Tianyi Gou389ba432012-10-01 13:58:38 -07001099 .has_sibling = 0,
1100 .base = &virt_bases[GCC_BASE],
1101 .c = {
Saravana Kannan7a6532e2012-10-18 20:51:13 -07001102 .parent = &blsp1_qup4_spi_apps_clk_src.c,
Tianyi Gou389ba432012-10-01 13:58:38 -07001103 .dbg_name = "gcc_blsp1_qup4_spi_apps_clk",
1104 .ops = &clk_ops_branch,
1105 CLK_INIT(gcc_blsp1_qup4_spi_apps_clk.c),
1106 },
1107};
1108
1109static struct branch_clk gcc_blsp1_qup5_i2c_apps_clk = {
1110 .cbcr_reg = BLSP1_QUP5_I2C_APPS_CBCR,
Tianyi Gou389ba432012-10-01 13:58:38 -07001111 .base = &virt_bases[GCC_BASE],
1112 .c = {
Saravana Kannan7a6532e2012-10-18 20:51:13 -07001113 .parent = &cxo_clk_src.c,
Tianyi Gou389ba432012-10-01 13:58:38 -07001114 .dbg_name = "gcc_blsp1_qup5_i2c_apps_clk",
1115 .ops = &clk_ops_branch,
1116 CLK_INIT(gcc_blsp1_qup5_i2c_apps_clk.c),
1117 },
1118};
1119
1120static struct branch_clk gcc_blsp1_qup5_spi_apps_clk = {
1121 .cbcr_reg = BLSP1_QUP5_SPI_APPS_CBCR,
Tianyi Gou389ba432012-10-01 13:58:38 -07001122 .has_sibling = 0,
1123 .base = &virt_bases[GCC_BASE],
1124 .c = {
Saravana Kannan7a6532e2012-10-18 20:51:13 -07001125 .parent = &blsp1_qup5_spi_apps_clk_src.c,
Tianyi Gou389ba432012-10-01 13:58:38 -07001126 .dbg_name = "gcc_blsp1_qup5_spi_apps_clk",
1127 .ops = &clk_ops_branch,
1128 CLK_INIT(gcc_blsp1_qup5_spi_apps_clk.c),
1129 },
1130};
1131
1132static struct branch_clk gcc_blsp1_qup6_i2c_apps_clk = {
1133 .cbcr_reg = BLSP1_QUP6_I2C_APPS_CBCR,
Tianyi Gou389ba432012-10-01 13:58:38 -07001134 .base = &virt_bases[GCC_BASE],
1135 .c = {
Saravana Kannan7a6532e2012-10-18 20:51:13 -07001136 .parent = &cxo_clk_src.c,
Tianyi Gou389ba432012-10-01 13:58:38 -07001137 .dbg_name = "gcc_blsp1_qup6_i2c_apps_clk",
1138 .ops = &clk_ops_branch,
1139 CLK_INIT(gcc_blsp1_qup6_i2c_apps_clk.c),
1140 },
1141};
1142
1143static struct branch_clk gcc_blsp1_qup6_spi_apps_clk = {
1144 .cbcr_reg = BLSP1_QUP6_SPI_APPS_CBCR,
Tianyi Gou389ba432012-10-01 13:58:38 -07001145 .has_sibling = 0,
1146 .base = &virt_bases[GCC_BASE],
1147 .c = {
Saravana Kannan7a6532e2012-10-18 20:51:13 -07001148 .parent = &blsp1_qup6_spi_apps_clk_src.c,
Tianyi Gou389ba432012-10-01 13:58:38 -07001149 .dbg_name = "gcc_blsp1_qup6_spi_apps_clk",
1150 .ops = &clk_ops_branch,
1151 CLK_INIT(gcc_blsp1_qup6_spi_apps_clk.c),
1152 },
1153};
1154
1155static struct branch_clk gcc_blsp1_uart1_apps_clk = {
1156 .cbcr_reg = BLSP1_UART1_APPS_CBCR,
Tianyi Gou389ba432012-10-01 13:58:38 -07001157 .has_sibling = 0,
1158 .base = &virt_bases[GCC_BASE],
1159 .c = {
Saravana Kannan7a6532e2012-10-18 20:51:13 -07001160 .parent = &blsp1_uart1_apps_clk_src.c,
Tianyi Gou389ba432012-10-01 13:58:38 -07001161 .dbg_name = "gcc_blsp1_uart1_apps_clk",
1162 .ops = &clk_ops_branch,
1163 CLK_INIT(gcc_blsp1_uart1_apps_clk.c),
1164 },
1165};
1166
1167static struct branch_clk gcc_blsp1_uart2_apps_clk = {
1168 .cbcr_reg = BLSP1_UART2_APPS_CBCR,
Tianyi Gou389ba432012-10-01 13:58:38 -07001169 .has_sibling = 0,
1170 .base = &virt_bases[GCC_BASE],
1171 .c = {
Saravana Kannan7a6532e2012-10-18 20:51:13 -07001172 .parent = &blsp1_uart2_apps_clk_src.c,
Tianyi Gou389ba432012-10-01 13:58:38 -07001173 .dbg_name = "gcc_blsp1_uart2_apps_clk",
1174 .ops = &clk_ops_branch,
1175 CLK_INIT(gcc_blsp1_uart2_apps_clk.c),
1176 },
1177};
1178
1179static struct branch_clk gcc_blsp1_uart3_apps_clk = {
1180 .cbcr_reg = BLSP1_UART3_APPS_CBCR,
Tianyi Gou389ba432012-10-01 13:58:38 -07001181 .has_sibling = 0,
1182 .base = &virt_bases[GCC_BASE],
1183 .c = {
Saravana Kannan7a6532e2012-10-18 20:51:13 -07001184 .parent = &blsp1_uart3_apps_clk_src.c,
Tianyi Gou389ba432012-10-01 13:58:38 -07001185 .dbg_name = "gcc_blsp1_uart3_apps_clk",
1186 .ops = &clk_ops_branch,
1187 CLK_INIT(gcc_blsp1_uart3_apps_clk.c),
1188 },
1189};
1190
1191static struct branch_clk gcc_blsp1_uart4_apps_clk = {
1192 .cbcr_reg = BLSP1_UART4_APPS_CBCR,
Tianyi Gou389ba432012-10-01 13:58:38 -07001193 .has_sibling = 0,
1194 .base = &virt_bases[GCC_BASE],
1195 .c = {
Saravana Kannan7a6532e2012-10-18 20:51:13 -07001196 .parent = &blsp1_uart4_apps_clk_src.c,
Tianyi Gou389ba432012-10-01 13:58:38 -07001197 .dbg_name = "gcc_blsp1_uart4_apps_clk",
1198 .ops = &clk_ops_branch,
1199 CLK_INIT(gcc_blsp1_uart4_apps_clk.c),
1200 },
1201};
1202
1203static struct branch_clk gcc_blsp1_uart5_apps_clk = {
1204 .cbcr_reg = BLSP1_UART5_APPS_CBCR,
Tianyi Gou389ba432012-10-01 13:58:38 -07001205 .has_sibling = 0,
1206 .base = &virt_bases[GCC_BASE],
1207 .c = {
Saravana Kannan7a6532e2012-10-18 20:51:13 -07001208 .parent = &blsp1_uart5_apps_clk_src.c,
Tianyi Gou389ba432012-10-01 13:58:38 -07001209 .dbg_name = "gcc_blsp1_uart5_apps_clk",
1210 .ops = &clk_ops_branch,
1211 CLK_INIT(gcc_blsp1_uart5_apps_clk.c),
1212 },
1213};
1214
1215static struct branch_clk gcc_blsp1_uart6_apps_clk = {
1216 .cbcr_reg = BLSP1_UART6_APPS_CBCR,
Tianyi Gou389ba432012-10-01 13:58:38 -07001217 .has_sibling = 0,
1218 .base = &virt_bases[GCC_BASE],
1219 .c = {
Saravana Kannan7a6532e2012-10-18 20:51:13 -07001220 .parent = &blsp1_uart6_apps_clk_src.c,
Tianyi Gou389ba432012-10-01 13:58:38 -07001221 .dbg_name = "gcc_blsp1_uart6_apps_clk",
1222 .ops = &clk_ops_branch,
1223 CLK_INIT(gcc_blsp1_uart6_apps_clk.c),
1224 },
1225};
1226
1227static struct local_vote_clk gcc_boot_rom_ahb_clk = {
1228 .cbcr_reg = BOOT_ROM_AHB_CBCR,
1229 .vote_reg = APCS_CLOCK_BRANCH_ENA_VOTE,
1230 .en_mask = BIT(10),
1231 .base = &virt_bases[GCC_BASE],
1232 .c = {
1233 .dbg_name = "gcc_boot_rom_ahb_clk",
1234 .ops = &clk_ops_vote,
1235 CLK_INIT(gcc_boot_rom_ahb_clk.c),
1236 },
1237};
1238
1239static struct local_vote_clk gcc_ce1_ahb_clk = {
1240 .cbcr_reg = CE1_AHB_CBCR,
1241 .vote_reg = APCS_CLOCK_BRANCH_ENA_VOTE,
1242 .en_mask = BIT(3),
1243 .base = &virt_bases[GCC_BASE],
1244 .c = {
1245 .dbg_name = "gcc_ce1_ahb_clk",
1246 .ops = &clk_ops_vote,
1247 CLK_INIT(gcc_ce1_ahb_clk.c),
1248 },
1249};
1250
1251static struct local_vote_clk gcc_ce1_axi_clk = {
1252 .cbcr_reg = CE1_AXI_CBCR,
1253 .vote_reg = APCS_CLOCK_BRANCH_ENA_VOTE,
1254 .en_mask = BIT(4),
1255 .base = &virt_bases[GCC_BASE],
1256 .c = {
1257 .dbg_name = "gcc_ce1_axi_clk",
1258 .ops = &clk_ops_vote,
1259 CLK_INIT(gcc_ce1_axi_clk.c),
1260 },
1261};
1262
1263static struct local_vote_clk gcc_ce1_clk = {
1264 .cbcr_reg = CE1_CBCR,
1265 .vote_reg = APCS_CLOCK_BRANCH_ENA_VOTE,
1266 .en_mask = BIT(5),
1267 .base = &virt_bases[GCC_BASE],
1268 .c = {
1269 .dbg_name = "gcc_ce1_clk",
1270 .ops = &clk_ops_vote,
1271 CLK_INIT(gcc_ce1_clk.c),
1272 },
1273};
1274
1275static struct branch_clk gcc_gp1_clk = {
1276 .cbcr_reg = GP1_CBCR,
Tianyi Gou389ba432012-10-01 13:58:38 -07001277 .has_sibling = 0,
1278 .base = &virt_bases[GCC_BASE],
1279 .c = {
Saravana Kannan7a6532e2012-10-18 20:51:13 -07001280 .parent = &gp1_clk_src.c,
Tianyi Gou389ba432012-10-01 13:58:38 -07001281 .dbg_name = "gcc_gp1_clk",
1282 .ops = &clk_ops_branch,
1283 CLK_INIT(gcc_gp1_clk.c),
1284 },
1285};
1286
1287static struct branch_clk gcc_gp2_clk = {
1288 .cbcr_reg = GP2_CBCR,
Tianyi Gou389ba432012-10-01 13:58:38 -07001289 .has_sibling = 0,
1290 .base = &virt_bases[GCC_BASE],
1291 .c = {
Saravana Kannan7a6532e2012-10-18 20:51:13 -07001292 .parent = &gp2_clk_src.c,
Tianyi Gou389ba432012-10-01 13:58:38 -07001293 .dbg_name = "gcc_gp2_clk",
1294 .ops = &clk_ops_branch,
1295 CLK_INIT(gcc_gp2_clk.c),
1296 },
1297};
1298
1299static struct branch_clk gcc_gp3_clk = {
1300 .cbcr_reg = GP3_CBCR,
Tianyi Gou389ba432012-10-01 13:58:38 -07001301 .has_sibling = 0,
1302 .base = &virt_bases[GCC_BASE],
1303 .c = {
Saravana Kannan7a6532e2012-10-18 20:51:13 -07001304 .parent = &gp3_clk_src.c,
Tianyi Gou389ba432012-10-01 13:58:38 -07001305 .dbg_name = "gcc_gp3_clk",
1306 .ops = &clk_ops_branch,
1307 CLK_INIT(gcc_gp3_clk.c),
1308 },
1309};
1310
1311static struct branch_clk gcc_ipa_clk = {
1312 .cbcr_reg = IPA_CBCR,
Tianyi Gou389ba432012-10-01 13:58:38 -07001313 .has_sibling = 1,
1314 .base = &virt_bases[GCC_BASE],
1315 .c = {
Saravana Kannan7a6532e2012-10-18 20:51:13 -07001316 .parent = &ipa_clk_src.c,
Tianyi Gou389ba432012-10-01 13:58:38 -07001317 .dbg_name = "gcc_ipa_clk",
1318 .ops = &clk_ops_branch,
1319 CLK_INIT(gcc_ipa_clk.c),
1320 },
1321};
1322
1323static struct branch_clk gcc_ipa_cnoc_clk = {
1324 .cbcr_reg = IPA_CNOC_CBCR,
1325 .has_sibling = 1,
1326 .base = &virt_bases[GCC_BASE],
1327 .c = {
1328 .dbg_name = "gcc_ipa_cnoc_clk",
1329 .ops = &clk_ops_branch,
1330 CLK_INIT(gcc_ipa_cnoc_clk.c),
1331 },
1332};
1333
Tianyi Gou0e10e792012-11-29 18:28:32 -08001334static struct branch_clk gcc_ipa_sleep_clk = {
1335 .cbcr_reg = IPA_SLEEP_CBCR,
1336 .has_sibling = 1,
1337 .base = &virt_bases[GCC_BASE],
1338 .c = {
1339 .dbg_name = "gcc_ipa_sleep_clk",
1340 .ops = &clk_ops_branch,
1341 CLK_INIT(gcc_ipa_sleep_clk.c),
1342 },
1343};
1344
Tianyi Gou389ba432012-10-01 13:58:38 -07001345static struct branch_clk gcc_pdm2_clk = {
1346 .cbcr_reg = PDM2_CBCR,
Tianyi Gou389ba432012-10-01 13:58:38 -07001347 .has_sibling = 0,
1348 .base = &virt_bases[GCC_BASE],
1349 .c = {
Saravana Kannan7a6532e2012-10-18 20:51:13 -07001350 .parent = &pdm2_clk_src.c,
Tianyi Gou389ba432012-10-01 13:58:38 -07001351 .dbg_name = "gcc_pdm2_clk",
1352 .ops = &clk_ops_branch,
1353 CLK_INIT(gcc_pdm2_clk.c),
1354 },
1355};
1356
1357static struct branch_clk gcc_pdm_ahb_clk = {
1358 .cbcr_reg = PDM_AHB_CBCR,
1359 .has_sibling = 1,
1360 .base = &virt_bases[GCC_BASE],
1361 .c = {
1362 .dbg_name = "gcc_pdm_ahb_clk",
1363 .ops = &clk_ops_branch,
1364 CLK_INIT(gcc_pdm_ahb_clk.c),
1365 },
1366};
1367
1368static struct local_vote_clk gcc_prng_ahb_clk = {
1369 .cbcr_reg = PRNG_AHB_CBCR,
1370 .vote_reg = APCS_CLOCK_BRANCH_ENA_VOTE,
1371 .en_mask = BIT(13),
1372 .base = &virt_bases[GCC_BASE],
1373 .c = {
1374 .dbg_name = "gcc_prng_ahb_clk",
1375 .ops = &clk_ops_vote,
1376 CLK_INIT(gcc_prng_ahb_clk.c),
1377 },
1378};
1379
1380static struct branch_clk gcc_qpic_ahb_clk = {
1381 .cbcr_reg = QPIC_AHB_CBCR,
1382 .has_sibling = 1,
1383 .base = &virt_bases[GCC_BASE],
1384 .c = {
1385 .dbg_name = "gcc_qpic_ahb_clk",
1386 .ops = &clk_ops_branch,
1387 CLK_INIT(gcc_qpic_ahb_clk.c),
1388 },
1389};
1390
1391static struct branch_clk gcc_qpic_clk = {
1392 .cbcr_reg = QPIC_CBCR,
Tianyi Gou389ba432012-10-01 13:58:38 -07001393 .has_sibling = 0,
1394 .base = &virt_bases[GCC_BASE],
1395 .c = {
Saravana Kannan7a6532e2012-10-18 20:51:13 -07001396 .parent = &qpic_clk_src.c,
Tianyi Gou389ba432012-10-01 13:58:38 -07001397 .dbg_name = "gcc_qpic_clk",
1398 .ops = &clk_ops_branch,
1399 CLK_INIT(gcc_qpic_clk.c),
1400 },
1401};
1402
1403static struct branch_clk gcc_sdcc2_ahb_clk = {
1404 .cbcr_reg = SDCC2_AHB_CBCR,
1405 .has_sibling = 1,
1406 .base = &virt_bases[GCC_BASE],
1407 .c = {
1408 .dbg_name = "gcc_sdcc2_ahb_clk",
1409 .ops = &clk_ops_branch,
1410 CLK_INIT(gcc_sdcc2_ahb_clk.c),
1411 },
1412};
1413
1414static struct branch_clk gcc_sdcc2_apps_clk = {
1415 .cbcr_reg = SDCC2_APPS_CBCR,
Tianyi Gou389ba432012-10-01 13:58:38 -07001416 .has_sibling = 0,
1417 .base = &virt_bases[GCC_BASE],
1418 .c = {
Saravana Kannan7a6532e2012-10-18 20:51:13 -07001419 .parent = &sdcc2_apps_clk_src.c,
Tianyi Gou389ba432012-10-01 13:58:38 -07001420 .dbg_name = "gcc_sdcc2_apps_clk",
1421 .ops = &clk_ops_branch,
1422 CLK_INIT(gcc_sdcc2_apps_clk.c),
1423 },
1424};
1425
1426static struct branch_clk gcc_sdcc3_ahb_clk = {
1427 .cbcr_reg = SDCC3_AHB_CBCR,
1428 .has_sibling = 1,
1429 .base = &virt_bases[GCC_BASE],
1430 .c = {
1431 .dbg_name = "gcc_sdcc3_ahb_clk",
1432 .ops = &clk_ops_branch,
1433 CLK_INIT(gcc_sdcc3_ahb_clk.c),
1434 },
1435};
1436
1437static struct branch_clk gcc_sdcc3_apps_clk = {
1438 .cbcr_reg = SDCC3_APPS_CBCR,
Tianyi Gou389ba432012-10-01 13:58:38 -07001439 .has_sibling = 0,
1440 .base = &virt_bases[GCC_BASE],
1441 .c = {
Saravana Kannan7a6532e2012-10-18 20:51:13 -07001442 .parent = &sdcc3_apps_clk_src.c,
Tianyi Gou389ba432012-10-01 13:58:38 -07001443 .dbg_name = "gcc_sdcc3_apps_clk",
1444 .ops = &clk_ops_branch,
1445 CLK_INIT(gcc_sdcc3_apps_clk.c),
1446 },
1447};
1448
1449static struct branch_clk gcc_sys_noc_ipa_axi_clk = {
1450 .cbcr_reg = SYS_NOC_IPA_AXI_CBCR,
Tianyi Gou389ba432012-10-01 13:58:38 -07001451 .has_sibling = 1,
1452 .base = &virt_bases[GCC_BASE],
1453 .c = {
Saravana Kannan7a6532e2012-10-18 20:51:13 -07001454 .parent = &ipa_clk_src.c,
Tianyi Gou389ba432012-10-01 13:58:38 -07001455 .dbg_name = "gcc_sys_noc_ipa_axi_clk",
1456 .ops = &clk_ops_branch,
1457 CLK_INIT(gcc_sys_noc_ipa_axi_clk.c),
1458 },
1459};
1460
1461static struct branch_clk gcc_usb_hs_ahb_clk = {
1462 .cbcr_reg = USB_HS_AHB_CBCR,
1463 .has_sibling = 1,
1464 .base = &virt_bases[GCC_BASE],
1465 .c = {
1466 .dbg_name = "gcc_usb_hs_ahb_clk",
1467 .ops = &clk_ops_branch,
1468 CLK_INIT(gcc_usb_hs_ahb_clk.c),
1469 },
1470};
1471
1472static struct branch_clk gcc_usb_hs_system_clk = {
1473 .cbcr_reg = USB_HS_SYSTEM_CBCR,
1474 .bcr_reg = USB_HS_BCR,
Tianyi Gou389ba432012-10-01 13:58:38 -07001475 .has_sibling = 0,
1476 .base = &virt_bases[GCC_BASE],
1477 .c = {
Saravana Kannan7a6532e2012-10-18 20:51:13 -07001478 .parent = &usb_hs_system_clk_src.c,
Tianyi Gou389ba432012-10-01 13:58:38 -07001479 .dbg_name = "gcc_usb_hs_system_clk",
1480 .ops = &clk_ops_branch,
1481 CLK_INIT(gcc_usb_hs_system_clk.c),
1482 },
1483};
1484
1485static struct branch_clk gcc_usb_hsic_ahb_clk = {
1486 .cbcr_reg = USB_HSIC_AHB_CBCR,
1487 .has_sibling = 1,
1488 .base = &virt_bases[GCC_BASE],
1489 .c = {
1490 .dbg_name = "gcc_usb_hsic_ahb_clk",
1491 .ops = &clk_ops_branch,
1492 CLK_INIT(gcc_usb_hsic_ahb_clk.c),
1493 },
1494};
1495
1496static struct branch_clk gcc_usb_hsic_clk = {
1497 .cbcr_reg = USB_HSIC_CBCR,
Tianyi Gou389ba432012-10-01 13:58:38 -07001498 .has_sibling = 0,
1499 .base = &virt_bases[GCC_BASE],
1500 .c = {
Saravana Kannan7a6532e2012-10-18 20:51:13 -07001501 .parent = &usb_hsic_clk_src.c,
Tianyi Gou389ba432012-10-01 13:58:38 -07001502 .dbg_name = "gcc_usb_hsic_clk",
1503 .ops = &clk_ops_branch,
1504 CLK_INIT(gcc_usb_hsic_clk.c),
1505 },
1506};
1507
1508static struct branch_clk gcc_usb_hsic_io_cal_clk = {
1509 .cbcr_reg = USB_HSIC_IO_CAL_CBCR,
Tianyi Gou389ba432012-10-01 13:58:38 -07001510 .has_sibling = 0,
1511 .base = &virt_bases[GCC_BASE],
1512 .c = {
Saravana Kannan7a6532e2012-10-18 20:51:13 -07001513 .parent = &usb_hsic_io_cal_clk_src.c,
Tianyi Gou389ba432012-10-01 13:58:38 -07001514 .dbg_name = "gcc_usb_hsic_io_cal_clk",
1515 .ops = &clk_ops_branch,
1516 CLK_INIT(gcc_usb_hsic_io_cal_clk.c),
1517 },
1518};
1519
1520static struct branch_clk gcc_usb_hsic_system_clk = {
1521 .cbcr_reg = USB_HSIC_SYSTEM_CBCR,
1522 .bcr_reg = USB_HS_HSIC_BCR,
Tianyi Gou389ba432012-10-01 13:58:38 -07001523 .has_sibling = 0,
1524 .base = &virt_bases[GCC_BASE],
1525 .c = {
Saravana Kannan7a6532e2012-10-18 20:51:13 -07001526 .parent = &usb_hsic_system_clk_src.c,
Tianyi Gou389ba432012-10-01 13:58:38 -07001527 .dbg_name = "gcc_usb_hsic_system_clk",
1528 .ops = &clk_ops_branch,
1529 CLK_INIT(gcc_usb_hsic_system_clk.c),
1530 },
1531};
1532
1533static struct branch_clk gcc_usb_hsic_xcvr_fs_clk = {
1534 .cbcr_reg = USB_HSIC_XCVR_FS_CBCR,
Tianyi Gou389ba432012-10-01 13:58:38 -07001535 .has_sibling = 0,
1536 .base = &virt_bases[GCC_BASE],
1537 .c = {
Saravana Kannan7a6532e2012-10-18 20:51:13 -07001538 .parent = &usb_hsic_xcvr_fs_clk_src.c,
Tianyi Gou389ba432012-10-01 13:58:38 -07001539 .dbg_name = "gcc_usb_hsic_xcvr_fs_clk",
1540 .ops = &clk_ops_branch,
1541 CLK_INIT(gcc_usb_hsic_xcvr_fs_clk.c),
1542 },
1543};
1544
Tianyi Gou389ba432012-10-01 13:58:38 -07001545static DEFINE_CLK_MEASURE(a5_m_clk);
1546
1547#ifdef CONFIG_DEBUG_FS
1548
1549struct measure_mux_entry {
1550 struct clk *c;
1551 int base;
1552 u32 debug_mux;
1553};
1554
Tianyi Gouabcddb72013-02-23 18:10:11 -08001555struct measure_mux_entry measure_mux_common[] __initdata = {
Tianyi Gou389ba432012-10-01 13:58:38 -07001556 {&gcc_pdm_ahb_clk.c, GCC_BASE, 0x00d0},
1557 {&gcc_usb_hsic_xcvr_fs_clk.c, GCC_BASE, 0x005d},
1558 {&gcc_usb_hsic_system_clk.c, GCC_BASE, 0x0059},
1559 {&gcc_usb_hsic_io_cal_clk.c, GCC_BASE, 0x005b},
1560 {&gcc_sdcc3_ahb_clk.c, GCC_BASE, 0x0079},
1561 {&gcc_blsp1_qup5_i2c_apps_clk.c, GCC_BASE, 0x009d},
1562 {&gcc_blsp1_qup1_spi_apps_clk.c, GCC_BASE, 0x008a},
1563 {&gcc_blsp1_uart2_apps_clk.c, GCC_BASE, 0x0091},
1564 {&gcc_blsp1_qup4_spi_apps_clk.c, GCC_BASE, 0x0098},
1565 {&gcc_blsp1_qup3_spi_apps_clk.c, GCC_BASE, 0x0093},
1566 {&gcc_blsp1_qup6_i2c_apps_clk.c, GCC_BASE, 0x00a2},
1567 {&gcc_bam_dma_ahb_clk.c, GCC_BASE, 0x00e0},
1568 {&gcc_sdcc3_apps_clk.c, GCC_BASE, 0x0078},
1569 {&gcc_usb_hs_system_clk.c, GCC_BASE, 0x0060},
1570 {&gcc_blsp1_ahb_clk.c, GCC_BASE, 0x0088},
1571 {&gcc_blsp1_uart4_apps_clk.c, GCC_BASE, 0x009a},
1572 {&gcc_blsp1_qup2_spi_apps_clk.c, GCC_BASE, 0x008e},
1573 {&gcc_usb_hsic_ahb_clk.c, GCC_BASE, 0x0058},
1574 {&gcc_blsp1_uart3_apps_clk.c, GCC_BASE, 0x0095},
1575 {&gcc_ce1_axi_clk.c, GCC_BASE, 0x0139},
1576 {&gcc_blsp1_qup5_spi_apps_clk.c, GCC_BASE, 0x009c},
1577 {&gcc_usb_hs_ahb_clk.c, GCC_BASE, 0x0061},
1578 {&gcc_blsp1_qup6_spi_apps_clk.c, GCC_BASE, 0x00a1},
1579 {&gcc_prng_ahb_clk.c, GCC_BASE, 0x00d8},
1580 {&gcc_blsp1_qup3_i2c_apps_clk.c, GCC_BASE, 0x0094},
1581 {&gcc_usb_hsic_clk.c, GCC_BASE, 0x005a},
1582 {&gcc_blsp1_uart6_apps_clk.c, GCC_BASE, 0x00a3},
1583 {&gcc_sdcc2_apps_clk.c, GCC_BASE, 0x0070},
1584 {&gcc_blsp1_uart1_apps_clk.c, GCC_BASE, 0x008c},
1585 {&gcc_blsp1_qup4_i2c_apps_clk.c, GCC_BASE, 0x0099},
1586 {&gcc_boot_rom_ahb_clk.c, GCC_BASE, 0x00f8},
1587 {&gcc_ce1_ahb_clk.c, GCC_BASE, 0x013a},
1588 {&gcc_pdm2_clk.c, GCC_BASE, 0x00d2},
1589 {&gcc_blsp1_uart5_apps_clk.c, GCC_BASE, 0x009e},
1590 {&gcc_blsp1_qup2_i2c_apps_clk.c, GCC_BASE, 0x0090},
1591 {&gcc_blsp1_qup1_i2c_apps_clk.c, GCC_BASE, 0x008b},
1592 {&gcc_sdcc2_ahb_clk.c, GCC_BASE, 0x0071},
1593 {&gcc_ce1_clk.c, GCC_BASE, 0x0138},
1594 {&gcc_sys_noc_ipa_axi_clk.c, GCC_BASE, 0x0007},
Tianyi Gou8512ac42013-01-23 18:32:04 -08001595 {&gcc_ipa_clk.c, GCC_BASE, 0x01E0},
1596 {&gcc_ipa_cnoc_clk.c, GCC_BASE, 0x01E1},
1597 {&gcc_ipa_sleep_clk.c, GCC_BASE, 0x01E2},
1598 {&gcc_qpic_clk.c, GCC_BASE, 0x01D8},
1599 {&gcc_qpic_ahb_clk.c, GCC_BASE, 0x01D9},
Tianyi Gou389ba432012-10-01 13:58:38 -07001600
Tianyi Gou389ba432012-10-01 13:58:38 -07001601 {&a5_m_clk, APCS_BASE, 0x3},
1602
1603 {&dummy_clk, N_BASES, 0x0000},
1604};
1605
Tianyi Gouabcddb72013-02-23 18:10:11 -08001606struct measure_mux_entry measure_mux_v2_only[] __initdata = {
1607 {&gcc_ipa_clk.c, GCC_BASE, 0x01E0},
1608 {&gcc_ipa_cnoc_clk.c, GCC_BASE, 0x01E1},
1609 {&gcc_ipa_sleep_clk.c, GCC_BASE, 0x01E2},
1610 {&gcc_qpic_clk.c, GCC_BASE, 0x01D8},
1611 {&gcc_qpic_ahb_clk.c, GCC_BASE, 0x01D9},
1612};
1613
1614struct measure_mux_entry measure_mux[ARRAY_SIZE(measure_mux_common)
1615 + ARRAY_SIZE(measure_mux_v2_only)];
1616
Tianyi Gou389ba432012-10-01 13:58:38 -07001617static int measure_clk_set_parent(struct clk *c, struct clk *parent)
1618{
1619 struct measure_clk *clk = to_measure_clk(c);
1620 unsigned long flags;
1621 u32 regval, clk_sel, i;
1622
1623 if (!parent)
1624 return -EINVAL;
1625
1626 for (i = 0; i < (ARRAY_SIZE(measure_mux) - 1); i++)
1627 if (measure_mux[i].c == parent)
1628 break;
1629
1630 if (measure_mux[i].c == &dummy_clk)
1631 return -EINVAL;
1632
1633 spin_lock_irqsave(&local_clock_reg_lock, flags);
1634 /*
1635 * Program the test vector, measurement period (sample_ticks)
1636 * and scaling multiplier.
1637 */
1638 clk->sample_ticks = 0x10000;
1639 clk->multiplier = 1;
1640
Tianyi Gou389ba432012-10-01 13:58:38 -07001641 writel_relaxed(0, GCC_REG_BASE(GCC_DEBUG_CLK_CTL_REG));
1642
1643 switch (measure_mux[i].base) {
1644
1645 case GCC_BASE:
1646 clk_sel = measure_mux[i].debug_mux;
1647 break;
1648
Tianyi Gou389ba432012-10-01 13:58:38 -07001649 case APCS_BASE:
1650 clk_sel = 0x16A;
1651 regval = BVAL(5, 3, measure_mux[i].debug_mux);
1652 writel_relaxed(regval, APCS_REG_BASE(APCS_CLK_DIAG_REG));
1653
1654 /* Activate debug clock output */
1655 regval |= BIT(7);
1656 writel_relaxed(regval, APCS_REG_BASE(APCS_CLK_DIAG_REG));
1657 break;
1658
1659 default:
1660 return -EINVAL;
1661 }
1662
1663 /* Set debug mux clock index */
1664 regval = BVAL(8, 0, clk_sel);
1665 writel_relaxed(regval, GCC_REG_BASE(GCC_DEBUG_CLK_CTL_REG));
1666
1667 /* Activate debug clock output */
1668 regval |= BIT(16);
1669 writel_relaxed(regval, GCC_REG_BASE(GCC_DEBUG_CLK_CTL_REG));
1670
1671 /* Make sure test vector is set before starting measurements. */
1672 mb();
1673 spin_unlock_irqrestore(&local_clock_reg_lock, flags);
1674
1675 return 0;
1676}
1677
1678/* Sample clock for 'ticks' reference clock ticks. */
1679static u32 run_measurement(unsigned ticks)
1680{
1681 /* Stop counters and set the XO4 counter start value. */
1682 writel_relaxed(ticks, GCC_REG_BASE(CLOCK_FRQ_MEASURE_CTL_REG));
1683
1684 /* Wait for timer to become ready. */
1685 while ((readl_relaxed(GCC_REG_BASE(CLOCK_FRQ_MEASURE_STATUS_REG)) &
1686 BIT(25)) != 0)
1687 cpu_relax();
1688
1689 /* Run measurement and wait for completion. */
1690 writel_relaxed(BIT(20)|ticks, GCC_REG_BASE(CLOCK_FRQ_MEASURE_CTL_REG));
1691 while ((readl_relaxed(GCC_REG_BASE(CLOCK_FRQ_MEASURE_STATUS_REG)) &
1692 BIT(25)) == 0)
1693 cpu_relax();
1694
1695 /* Return measured ticks. */
1696 return readl_relaxed(GCC_REG_BASE(CLOCK_FRQ_MEASURE_STATUS_REG)) &
1697 BM(24, 0);
1698}
1699
1700/*
1701 * Perform a hardware rate measurement for a given clock.
1702 * FOR DEBUG USE ONLY: Measurements take ~15 ms!
1703 */
1704static unsigned long measure_clk_get_rate(struct clk *c)
1705{
1706 unsigned long flags;
1707 u32 gcc_xo4_reg_backup;
1708 u64 raw_count_short, raw_count_full;
1709 struct measure_clk *clk = to_measure_clk(c);
1710 unsigned ret;
1711
1712 ret = clk_prepare_enable(&cxo_clk_src.c);
1713 if (ret) {
1714 pr_warning("CXO clock failed to enable. Can't measure\n");
1715 return 0;
1716 }
1717
1718 spin_lock_irqsave(&local_clock_reg_lock, flags);
1719
1720 /* Enable CXO/4 and RINGOSC branch. */
1721 gcc_xo4_reg_backup = readl_relaxed(GCC_REG_BASE(GCC_XO_DIV4_CBCR_REG));
1722 writel_relaxed(0x1, GCC_REG_BASE(GCC_XO_DIV4_CBCR_REG));
1723
1724 /*
1725 * The ring oscillator counter will not reset if the measured clock
1726 * is not running. To detect this, run a short measurement before
1727 * the full measurement. If the raw results of the two are the same
1728 * then the clock must be off.
1729 */
1730
1731 /* Run a short measurement. (~1 ms) */
1732 raw_count_short = run_measurement(0x1000);
1733 /* Run a full measurement. (~14 ms) */
1734 raw_count_full = run_measurement(clk->sample_ticks);
1735
1736 writel_relaxed(gcc_xo4_reg_backup, GCC_REG_BASE(GCC_XO_DIV4_CBCR_REG));
1737
1738 /* Return 0 if the clock is off. */
1739 if (raw_count_full == raw_count_short) {
1740 ret = 0;
1741 } else {
1742 /* Compute rate in Hz. */
1743 raw_count_full = ((raw_count_full * 10) + 15) * 4800000;
1744 do_div(raw_count_full, ((clk->sample_ticks * 10) + 35));
1745 ret = (raw_count_full * clk->multiplier);
1746 }
1747
1748 writel_relaxed(0x51A00, GCC_REG_BASE(GCC_PLLTEST_PAD_CFG_REG));
1749 spin_unlock_irqrestore(&local_clock_reg_lock, flags);
1750
1751 clk_disable_unprepare(&cxo_clk_src.c);
1752
1753 return ret;
1754}
1755#else /* !CONFIG_DEBUG_FS */
1756static int measure_clk_set_parent(struct clk *clk, struct clk *parent)
1757{
1758 return -EINVAL;
1759}
1760
1761static unsigned long measure_clk_get_rate(struct clk *clk)
1762{
1763 return 0;
1764}
1765#endif /* CONFIG_DEBUG_FS */
1766
1767static struct clk_ops clk_ops_measure = {
1768 .set_parent = measure_clk_set_parent,
1769 .get_rate = measure_clk_get_rate,
1770};
1771
1772static struct measure_clk measure_clk = {
1773 .c = {
1774 .dbg_name = "measure_clk",
1775 .ops = &clk_ops_measure,
1776 CLK_INIT(measure_clk.c),
1777 },
1778 .multiplier = 1,
1779};
1780
1781static struct clk_lookup msm_clocks_9625[] = {
1782 CLK_LOOKUP("xo", cxo_clk_src.c, ""),
1783 CLK_LOOKUP("measure", measure_clk.c, "debug"),
1784
Tianyi Gou27df1bb2012-10-11 14:44:01 -07001785 CLK_LOOKUP("pll0", gpll0_activeonly_clk_src.c, "f9010008.qcom,acpuclk"),
1786 CLK_LOOKUP("pll14", apcspll_clk_src.c, "f9010008.qcom,acpuclk"),
Tianyi Gou389ba432012-10-01 13:58:38 -07001787
1788 CLK_LOOKUP("dma_bam_pclk", gcc_bam_dma_ahb_clk.c, "msm_sps"),
1789 CLK_LOOKUP("iface_clk", gcc_blsp1_ahb_clk.c, "msm_serial_hsl.0"),
Gilad Avidov09c78ec2012-10-18 09:34:35 -06001790 CLK_LOOKUP("iface_clk", gcc_blsp1_ahb_clk.c, "f9924000.spi"),
Tianyi Gou389ba432012-10-01 13:58:38 -07001791 CLK_LOOKUP("iface_clk", gcc_blsp1_ahb_clk.c, "f9925000.i2c"),
Saket Saurabhd72ee922013-01-22 16:56:52 +05301792 CLK_LOOKUP("iface_clk", gcc_blsp1_ahb_clk.c, "f991d000.uart"),
Tianyi Gou389ba432012-10-01 13:58:38 -07001793 CLK_LOOKUP("core_clk", gcc_blsp1_qup1_i2c_apps_clk.c, ""),
Gilad Avidov09c78ec2012-10-18 09:34:35 -06001794 CLK_LOOKUP("core_clk", gcc_blsp1_qup1_spi_apps_clk.c, ""),
Tianyi Gou389ba432012-10-01 13:58:38 -07001795 CLK_LOOKUP("core_clk", gcc_blsp1_qup2_i2c_apps_clk.c, ""),
Gilad Avidov09c78ec2012-10-18 09:34:35 -06001796 CLK_LOOKUP("core_clk", gcc_blsp1_qup2_spi_apps_clk.c, "f9924000.spi"),
Tianyi Gou389ba432012-10-01 13:58:38 -07001797 CLK_LOOKUP("core_clk", gcc_blsp1_qup3_i2c_apps_clk.c, "f9925000.i2c"),
1798 CLK_LOOKUP("core_clk", gcc_blsp1_qup3_spi_apps_clk.c, ""),
1799 CLK_LOOKUP("core_clk", gcc_blsp1_qup4_i2c_apps_clk.c, ""),
1800 CLK_LOOKUP("core_clk", gcc_blsp1_qup4_spi_apps_clk.c, ""),
1801 CLK_LOOKUP("core_clk", gcc_blsp1_qup5_i2c_apps_clk.c, ""),
1802 CLK_LOOKUP("core_clk", gcc_blsp1_qup5_spi_apps_clk.c, ""),
1803 CLK_LOOKUP("core_clk", gcc_blsp1_qup6_i2c_apps_clk.c, ""),
1804 CLK_LOOKUP("core_clk", gcc_blsp1_qup6_spi_apps_clk.c, ""),
Saket Saurabhd72ee922013-01-22 16:56:52 +05301805 CLK_LOOKUP("core_clk", gcc_blsp1_uart1_apps_clk.c, "f991d000.uart"),
Tianyi Gou389ba432012-10-01 13:58:38 -07001806 CLK_LOOKUP("core_clk", gcc_blsp1_uart2_apps_clk.c, ""),
1807 CLK_LOOKUP("core_clk", gcc_blsp1_uart3_apps_clk.c, "msm_serial_hsl.0"),
1808 CLK_LOOKUP("core_clk", gcc_blsp1_uart4_apps_clk.c, ""),
1809 CLK_LOOKUP("core_clk", gcc_blsp1_uart5_apps_clk.c, ""),
1810 CLK_LOOKUP("core_clk", gcc_blsp1_uart6_apps_clk.c, ""),
1811
1812 CLK_LOOKUP("core_clk_src", ce1_clk_src.c, ""),
1813 CLK_LOOKUP("core_clk", gcc_ce1_clk.c, ""),
1814 CLK_LOOKUP("iface_clk", gcc_ce1_ahb_clk.c, ""),
1815 CLK_LOOKUP("bus_clk", gcc_ce1_axi_clk.c, ""),
1816
1817 CLK_LOOKUP("core_clk", gcc_gp1_clk.c, ""),
1818 CLK_LOOKUP("core_clk", gcc_gp2_clk.c, ""),
1819 CLK_LOOKUP("core_clk", gcc_gp3_clk.c, ""),
1820
Hariprasad Dhalinarasimha9abfe782012-11-07 19:40:14 -08001821 CLK_LOOKUP("iface_clk", gcc_prng_ahb_clk.c, "f9bff000.qcom,msm-rng"),
Tianyi Gou389ba432012-10-01 13:58:38 -07001822 CLK_LOOKUP("core_src_clk", ipa_clk_src.c, "fd4c0000.qcom,ipa"),
1823 CLK_LOOKUP("core_clk", gcc_ipa_clk.c, "fd4c0000.qcom,ipa"),
1824 CLK_LOOKUP("bus_clk", gcc_sys_noc_ipa_axi_clk.c, "fd4c0000.qcom,ipa"),
1825 CLK_LOOKUP("iface_clk", gcc_ipa_cnoc_clk.c, "fd4c0000.qcom,ipa"),
Tianyi Gou0e10e792012-11-29 18:28:32 -08001826 CLK_LOOKUP("inactivity_clk", gcc_ipa_sleep_clk.c, "fd4c0000.qcom,ipa"),
Tianyi Gou389ba432012-10-01 13:58:38 -07001827
1828 CLK_LOOKUP("core_clk", gcc_pdm2_clk.c, ""),
1829 CLK_LOOKUP("iface_clk", gcc_pdm_ahb_clk.c, ""),
1830
Oluwafemi Adeyemi61df1182012-10-12 18:51:11 -07001831 CLK_LOOKUP("iface_clk", gcc_sdcc2_ahb_clk.c, "msm_sdcc.2"),
1832 CLK_LOOKUP("core_clk", gcc_sdcc2_apps_clk.c, "msm_sdcc.2"),
1833 CLK_LOOKUP("bus_clk", pnoc_sdcc2_clk.c, "msm_sdcc.2"),
1834 CLK_LOOKUP("iface_clk", gcc_sdcc3_ahb_clk.c, "msm_sdcc.3"),
1835 CLK_LOOKUP("core_clk", gcc_sdcc3_apps_clk.c, "msm_sdcc.3"),
1836 CLK_LOOKUP("bus_clk", pnoc_sdcc3_clk.c, "msm_sdcc.3"),
Tianyi Gou389ba432012-10-01 13:58:38 -07001837
1838 CLK_LOOKUP("iface_clk", gcc_usb_hs_ahb_clk.c, "f9a55000.usb"),
1839 CLK_LOOKUP("core_clk", gcc_usb_hs_system_clk.c, "f9a55000.usb"),
Ido Shayevitzd2b722b2013-01-09 13:08:54 +02001840 CLK_LOOKUP("iface_clk", gcc_usb_hsic_ahb_clk.c, "msm_hsic_host"),
1841 CLK_LOOKUP("phy_clk", gcc_usb_hsic_clk.c, "msm_hsic_host"),
1842 CLK_LOOKUP("cal_clk", gcc_usb_hsic_io_cal_clk.c, "msm_hsic_host"),
1843 CLK_LOOKUP("core_clk", gcc_usb_hsic_system_clk.c, "msm_hsic_host"),
Ofir Cohenb512a5f2012-12-13 09:46:34 +02001844 CLK_LOOKUP("alt_core_clk", gcc_usb_hsic_xcvr_fs_clk.c, ""),
Tianyi Gou389ba432012-10-01 13:58:38 -07001845
Hariprasad Dhalinarasimha96252de2012-11-21 17:52:36 -08001846 CLK_LOOKUP("core_clk", gcc_ce1_clk.c, "fd400000.qcom,qcedev"),
1847 CLK_LOOKUP("iface_clk", gcc_ce1_ahb_clk.c, "fd400000.qcom,qcedev"),
1848 CLK_LOOKUP("bus_clk", gcc_ce1_axi_clk.c, "fd400000.qcom,qcedev"),
1849 CLK_LOOKUP("core_clk_src", ce1_clk_src.c, "fd400000.qcom,qcedev"),
1850
1851 CLK_LOOKUP("core_clk", gcc_ce1_clk.c, "fd400000.qcom,qcrypto"),
1852 CLK_LOOKUP("iface_clk", gcc_ce1_ahb_clk.c, "fd400000.qcom,qcrypto"),
1853 CLK_LOOKUP("bus_clk", gcc_ce1_axi_clk.c, "fd400000.qcom,qcrypto"),
1854 CLK_LOOKUP("core_clk_src", ce1_clk_src.c, "fd400000.qcom,qcrypto"),
1855
Tianyi Gou389ba432012-10-01 13:58:38 -07001856 /* RPM and voter clocks */
1857 CLK_LOOKUP("bus_clk", snoc_clk.c, ""),
1858 CLK_LOOKUP("bus_clk", pnoc_clk.c, ""),
1859 CLK_LOOKUP("bus_clk", cnoc_clk.c, ""),
1860 CLK_LOOKUP("mem_clk", bimc_clk.c, ""),
1861 CLK_LOOKUP("bus_clk", snoc_a_clk.c, ""),
1862 CLK_LOOKUP("bus_clk", pnoc_a_clk.c, ""),
1863 CLK_LOOKUP("bus_clk", cnoc_a_clk.c, ""),
1864 CLK_LOOKUP("mem_clk", bimc_a_clk.c, ""),
1865
1866 CLK_LOOKUP("bus_clk", cnoc_msmbus_clk.c, "msm_config_noc"),
1867 CLK_LOOKUP("bus_a_clk", cnoc_msmbus_a_clk.c, "msm_config_noc"),
1868 CLK_LOOKUP("bus_clk", snoc_msmbus_clk.c, "msm_sys_noc"),
1869 CLK_LOOKUP("bus_a_clk", snoc_msmbus_a_clk.c, "msm_sys_noc"),
1870 CLK_LOOKUP("bus_clk", pnoc_msmbus_clk.c, "msm_periph_noc"),
1871 CLK_LOOKUP("bus_a_clk", pnoc_msmbus_a_clk.c, "msm_periph_noc"),
1872 CLK_LOOKUP("mem_clk", bimc_msmbus_clk.c, "msm_bimc"),
1873 CLK_LOOKUP("mem_a_clk", bimc_msmbus_a_clk.c, "msm_bimc"),
1874
1875 CLK_LOOKUP("dfab_clk", pnoc_sps_clk.c, "msm_sps"),
1876
1877 CLK_LOOKUP("a5_m_clk", a5_m_clk, ""),
Pushkar Joshi4e483042012-10-29 18:10:08 -07001878
Pratik Patel2d15d562013-02-07 19:10:35 -08001879 /* CoreSight clocks */
Pushkar Joshi4e483042012-10-29 18:10:08 -07001880 CLK_LOOKUP("core_clk", qdss_clk.c, "fc322000.tmc"),
1881 CLK_LOOKUP("core_clk", qdss_clk.c, "fc318000.tpiu"),
1882 CLK_LOOKUP("core_clk", qdss_clk.c, "fc31c000.replicator"),
1883 CLK_LOOKUP("core_clk", qdss_clk.c, "fc307000.tmc"),
1884 CLK_LOOKUP("core_clk", qdss_clk.c, "fc31b000.funnel"),
1885 CLK_LOOKUP("core_clk", qdss_clk.c, "fc319000.funnel"),
1886 CLK_LOOKUP("core_clk", qdss_clk.c, "fc31a000.funnel"),
1887 CLK_LOOKUP("core_clk", qdss_clk.c, "fc321000.stm"),
Pushkar Joshi2a51a122012-12-06 10:49:07 -08001888 CLK_LOOKUP("core_clk", qdss_clk.c, "fc332000.etm"),
Pushkar Joshie0e8a7e2012-12-15 18:27:04 -08001889 CLK_LOOKUP("core_clk", qdss_clk.c, "fc332000.jtagmm"),
Pratik Patel9332c382013-02-08 11:54:28 -08001890 CLK_LOOKUP("core_clk", qdss_clk.c, "fc308000.cti"),
1891 CLK_LOOKUP("core_clk", qdss_clk.c, "fc309000.cti"),
1892 CLK_LOOKUP("core_clk", qdss_clk.c, "fc30a000.cti"),
1893 CLK_LOOKUP("core_clk", qdss_clk.c, "fc30b000.cti"),
1894 CLK_LOOKUP("core_clk", qdss_clk.c, "fc30c000.cti"),
1895 CLK_LOOKUP("core_clk", qdss_clk.c, "fc30d000.cti"),
1896 CLK_LOOKUP("core_clk", qdss_clk.c, "fc30e000.cti"),
1897 CLK_LOOKUP("core_clk", qdss_clk.c, "fc30f000.cti"),
1898 CLK_LOOKUP("core_clk", qdss_clk.c, "fc310000.cti"),
1899 CLK_LOOKUP("core_clk", qdss_clk.c, "fc333000.cti"),
Pushkar Joshi4e483042012-10-29 18:10:08 -07001900
Pratik Patel2d15d562013-02-07 19:10:35 -08001901 CLK_LOOKUP("core_a_clk", qdss_a_clk.c, "fc322000.tmc"),
1902 CLK_LOOKUP("core_a_clk", qdss_a_clk.c, "fc318000.tpiu"),
1903 CLK_LOOKUP("core_a_clk", qdss_a_clk.c, "fc31c000.replicator"),
1904 CLK_LOOKUP("core_a_clk", qdss_a_clk.c, "fc307000.tmc"),
1905 CLK_LOOKUP("core_a_clk", qdss_a_clk.c, "fc31b000.funnel"),
1906 CLK_LOOKUP("core_a_clk", qdss_a_clk.c, "fc319000.funnel"),
1907 CLK_LOOKUP("core_a_clk", qdss_a_clk.c, "fc31a000.funnel"),
1908 CLK_LOOKUP("core_a_clk", qdss_a_clk.c, "fc321000.stm"),
1909 CLK_LOOKUP("core_a_clk", qdss_a_clk.c, "fc332000.etm"),
1910 CLK_LOOKUP("core_a_clk", qdss_a_clk.c, "fc332000.jtagmm"),
Pratik Patel9332c382013-02-08 11:54:28 -08001911 CLK_LOOKUP("core_a_clk", qdss_a_clk.c, "fc308000.cti"),
1912 CLK_LOOKUP("core_a_clk", qdss_a_clk.c, "fc309000.cti"),
1913 CLK_LOOKUP("core_a_clk", qdss_a_clk.c, "fc30a000.cti"),
1914 CLK_LOOKUP("core_a_clk", qdss_a_clk.c, "fc30b000.cti"),
1915 CLK_LOOKUP("core_a_clk", qdss_a_clk.c, "fc30c000.cti"),
1916 CLK_LOOKUP("core_a_clk", qdss_a_clk.c, "fc30d000.cti"),
1917 CLK_LOOKUP("core_a_clk", qdss_a_clk.c, "fc30e000.cti"),
1918 CLK_LOOKUP("core_a_clk", qdss_a_clk.c, "fc30f000.cti"),
1919 CLK_LOOKUP("core_a_clk", qdss_a_clk.c, "fc310000.cti"),
1920 CLK_LOOKUP("core_a_clk", qdss_a_clk.c, "fc333000.cti"),
Pushkar Joshi4e483042012-10-29 18:10:08 -07001921
Tianyi Gou389ba432012-10-01 13:58:38 -07001922};
1923
Tianyi Gou389ba432012-10-01 13:58:38 -07001924#define PLL_AUX_OUTPUT_BIT 1
1925#define PLL_AUX2_OUTPUT_BIT 2
1926
1927/*
1928 * TODO: Need to remove this function when the v2 hardware
1929 * fix the broken lock status bit.
1930 */
1931#define PLL_OUTCTRL BIT(0)
1932#define PLL_BYPASSNL BIT(1)
1933#define PLL_RESET_N BIT(2)
1934
1935static DEFINE_SPINLOCK(sr_pll_reg_lock);
1936
1937static int sr_pll_clk_enable_9625(struct clk *c)
1938{
1939 unsigned long flags;
1940 struct pll_clk *pll = to_pll_clk(c);
1941 u32 mode;
1942 void __iomem *mode_reg = *pll->base + (u32)pll->mode_reg;
1943
1944 spin_lock_irqsave(&sr_pll_reg_lock, flags);
1945
1946 /* Disable PLL bypass mode and de-assert reset. */
1947 mode = readl_relaxed(mode_reg);
1948 mode |= PLL_BYPASSNL | PLL_RESET_N;
1949 writel_relaxed(mode, mode_reg);
1950
1951 /* Wait for pll to lock. */
1952 udelay(100);
1953
1954 /* Enable PLL output. */
1955 mode |= PLL_OUTCTRL;
1956 writel_relaxed(mode, mode_reg);
1957
1958 /* Ensure the write above goes through before returning. */
1959 mb();
1960
1961 spin_unlock_irqrestore(&sr_pll_reg_lock, flags);
1962 return 0;
1963}
1964
Tianyi Gou389ba432012-10-01 13:58:38 -07001965static void __init reg_init(void)
1966{
Tianyi Gou781ff672013-02-21 15:29:40 -08001967 u32 regval;
Tianyi Gou389ba432012-10-01 13:58:38 -07001968
Tianyi Gou389ba432012-10-01 13:58:38 -07001969 /* Vote for GPLL0 to turn on. Needed by acpuclock. */
1970 regval = readl_relaxed(GCC_REG_BASE(APCS_GPLL_ENA_VOTE_REG));
1971 regval |= BIT(0);
1972 writel_relaxed(regval, GCC_REG_BASE(APCS_GPLL_ENA_VOTE_REG));
1973
1974 /*
1975 * TODO: Confirm that no clocks need to be voted on in this sleep vote
1976 * register.
1977 */
1978 writel_relaxed(0x0, GCC_REG_BASE(APCS_CLOCK_SLEEP_ENA_VOTE));
Tianyi Gou389ba432012-10-01 13:58:38 -07001979}
1980
1981static void __init msm9625_clock_post_init(void)
1982{
1983 /*
1984 * Hold an active set vote for CXO; this is because CXO is expected
1985 * to remain on whenever CPUs aren't power collapsed.
1986 */
1987 clk_prepare_enable(&cxo_a_clk_src.c);
1988
1989 /*
1990 * TODO: This call is to prevent sending 0Hz to rpm to turn off pnoc.
1991 * Needs to remove this after vote of pnoc from sdcc driver is ready.
1992 */
1993 clk_prepare_enable(&pnoc_msmbus_a_clk.c);
1994
1995 /* Set rates for single-rate clocks. */
1996 clk_set_rate(&usb_hs_system_clk_src.c,
1997 usb_hs_system_clk_src.freq_tbl[0].freq_hz);
1998 clk_set_rate(&usb_hsic_clk_src.c,
1999 usb_hsic_clk_src.freq_tbl[0].freq_hz);
2000 clk_set_rate(&usb_hsic_io_cal_clk_src.c,
2001 usb_hsic_io_cal_clk_src.freq_tbl[0].freq_hz);
2002 clk_set_rate(&usb_hsic_system_clk_src.c,
2003 usb_hsic_system_clk_src.freq_tbl[0].freq_hz);
2004 clk_set_rate(&usb_hsic_xcvr_fs_clk_src.c,
2005 usb_hsic_xcvr_fs_clk_src.freq_tbl[0].freq_hz);
2006 clk_set_rate(&pdm2_clk_src.c, pdm2_clk_src.freq_tbl[0].freq_hz);
Tianyi Goub1d13972013-01-23 22:55:22 -08002007 /*
2008 * TODO: set rate on behalf of the i2c driver until the i2c driver
2009 * distinguish v1/v2 and call set rate accordingly.
2010 */
2011 if (SOCINFO_VERSION_MAJOR(socinfo_get_version()) == 2)
2012 clk_set_rate(&blsp1_qup3_i2c_apps_clk_src.c,
2013 blsp1_qup3_i2c_apps_clk_src.freq_tbl[0].freq_hz);
Tianyi Gou389ba432012-10-01 13:58:38 -07002014}
2015
2016#define GCC_CC_PHYS 0xFC400000
2017#define GCC_CC_SIZE SZ_16K
2018
Tianyi Gou389ba432012-10-01 13:58:38 -07002019#define APCS_GCC_CC_PHYS 0xF9011000
2020#define APCS_GCC_CC_SIZE SZ_4K
2021
2022#define APCS_PLL_PHYS 0xF9008018
2023#define APCS_PLL_SIZE 0x18
2024
Tianyi Goub1d13972013-01-23 22:55:22 -08002025static struct clk *i2c_apps_clks[][2] __initdata = {
2026 {&gcc_blsp1_qup1_i2c_apps_clk.c, &blsp1_qup1_i2c_apps_clk_src.c},
2027 {&gcc_blsp1_qup2_i2c_apps_clk.c, &blsp1_qup2_i2c_apps_clk_src.c},
2028 {&gcc_blsp1_qup3_i2c_apps_clk.c, &blsp1_qup3_i2c_apps_clk_src.c},
2029 {&gcc_blsp1_qup4_i2c_apps_clk.c, &blsp1_qup4_i2c_apps_clk_src.c},
2030 {&gcc_blsp1_qup5_i2c_apps_clk.c, &blsp1_qup5_i2c_apps_clk_src.c},
2031 {&gcc_blsp1_qup6_i2c_apps_clk.c, &blsp1_qup6_i2c_apps_clk_src.c},
2032};
2033
Tianyi Gou389ba432012-10-01 13:58:38 -07002034static void __init msm9625_clock_pre_init(void)
2035{
2036 virt_bases[GCC_BASE] = ioremap(GCC_CC_PHYS, GCC_CC_SIZE);
2037 if (!virt_bases[GCC_BASE])
2038 panic("clock-9625: Unable to ioremap GCC memory!");
2039
Tianyi Gou389ba432012-10-01 13:58:38 -07002040 virt_bases[APCS_BASE] = ioremap(APCS_GCC_CC_PHYS, APCS_GCC_CC_SIZE);
2041 if (!virt_bases[APCS_BASE])
2042 panic("clock-9625: Unable to ioremap APCS_GCC_CC memory!");
2043
2044 virt_bases[APCS_PLL_BASE] = ioremap(APCS_PLL_PHYS, APCS_PLL_SIZE);
2045 if (!virt_bases[APCS_PLL_BASE])
2046 panic("clock-9625: Unable to ioremap APCS_PLL memory!");
2047
Tianyi Goub1d13972013-01-23 22:55:22 -08002048 /* The parent of each of the QUP I2C APPS clocks is an RCG on v2 */
2049 if (SOCINFO_VERSION_MAJOR(socinfo_get_version()) == 2) {
2050 int i, num_cores = ARRAY_SIZE(i2c_apps_clks);
2051 for (i = 0; i < num_cores; i++)
2052 i2c_apps_clks[i][0]->parent = i2c_apps_clks[i][1];
2053 }
2054
Tianyi Gou389ba432012-10-01 13:58:38 -07002055 clk_ops_local_pll.enable = sr_pll_clk_enable_9625;
2056
Patrick Dalyebc26bc2013-02-05 11:49:07 -08002057 vdd_dig.regulator[0] = regulator_get(NULL, "vdd_dig");
2058 if (IS_ERR(vdd_dig.regulator[0]))
Tianyi Gou389ba432012-10-01 13:58:38 -07002059 panic("clock-9625: Unable to get the vdd_dig regulator!");
2060
2061 vote_vdd_level(&vdd_dig, VDD_DIG_HIGH);
Patrick Dalyebc26bc2013-02-05 11:49:07 -08002062 regulator_enable(vdd_dig.regulator[0]);
Tianyi Gou389ba432012-10-01 13:58:38 -07002063
2064 enable_rpm_scaling();
2065
2066 reg_init();
Tianyi Gouabcddb72013-02-23 18:10:11 -08002067
2068 /* Construct measurement mux array */
2069 if (SOCINFO_VERSION_MAJOR(socinfo_get_version()) == 2) {
2070 memcpy(measure_mux,
2071 measure_mux_v2_only, sizeof(measure_mux_v2_only));
2072 memcpy(measure_mux + ARRAY_SIZE(measure_mux_v2_only),
2073 measure_mux_common, sizeof(measure_mux_common));
2074 } else
2075 memcpy(measure_mux,
2076 measure_mux_common, sizeof(measure_mux_common));
Tianyi Gou389ba432012-10-01 13:58:38 -07002077}
2078
2079static int __init msm9625_clock_late_init(void)
2080{
2081 return unvote_vdd_level(&vdd_dig, VDD_DIG_HIGH);
2082}
2083
2084struct clock_init_data msm9625_clock_init_data __initdata = {
2085 .table = msm_clocks_9625,
2086 .size = ARRAY_SIZE(msm_clocks_9625),
2087 .pre_init = msm9625_clock_pre_init,
2088 .post_init = msm9625_clock_post_init,
2089 .late_init = msm9625_clock_late_init,
2090};