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