blob: a9955fc8a1468f479a07dcc12b4ecf29b8456e60 [file] [log] [blame]
V S Ramanjaneya Kumar T713be572013-08-02 11:00:10 +05301/* Copyright (c) 2013, The Linux Foundation. All rights reserved.
2 *
3 * Redistribution and use in source and binary forms, with or without
4 * modification, are permitted provided that the following conditions are
5 * met:
6 * * Redistributions of source code must retain the above copyright
7 * notice, this list of conditions and the following disclaimer.
8 * * Redistributions in binary form must reproduce the above
9 * copyright notice, this list of conditions and the following
10 * disclaimer in the documentation and/or other materials provided
11 * with the distribution.
12 * * Neither the name of The Linux Foundation nor the names of its
13 * contributors may be used to endorse or promote products derived
14 * from this software without specific prior written permission.
15 *
16 * THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED
17 * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
18 * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT
19 * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS
20 * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
21 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
22 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
23 * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
24 * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
25 * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
26 * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
27 */
28
29#include <assert.h>
30#include <reg.h>
31#include <err.h>
32#include <clock.h>
33#include <clock_pll.h>
34#include <clock_lib2.h>
35#include <platform/clock.h>
36#include <platform/iomap.h>
37
38
39/* Mux source select values */
40#define cxo_source_val 0
41#define gpll0_source_val 1
42#define cxo_mm_source_val 0
43#define mmpll0_mm_source_val 1
44#define mmpll1_mm_source_val 2
45#define mmpll3_mm_source_val 3
46#define gpll0_mm_source_val 5
47
48struct clk_freq_tbl rcg_dummy_freq = F_END;
49
50
51/* Clock Operations */
52static struct clk_ops clk_ops_branch =
53{
54 .enable = clock_lib2_branch_clk_enable,
55 .disable = clock_lib2_branch_clk_disable,
56 .set_rate = clock_lib2_branch_set_rate,
57};
58
59static struct clk_ops clk_ops_rcg_mnd =
60{
61 .enable = clock_lib2_rcg_enable,
62 .set_rate = clock_lib2_rcg_set_rate,
63};
64
65static struct clk_ops clk_ops_rcg =
66{
67 .enable = clock_lib2_rcg_enable,
68 .set_rate = clock_lib2_rcg_set_rate,
69};
70
71static struct clk_ops clk_ops_cxo =
72{
73 .enable = cxo_clk_enable,
74 .disable = cxo_clk_disable,
75};
76
77static struct clk_ops clk_ops_pll_vote =
78{
79 .enable = pll_vote_clk_enable,
80 .disable = pll_vote_clk_disable,
81 .auto_off = pll_vote_clk_disable,
82 .is_enabled = pll_vote_clk_is_enabled,
83};
84
85static struct clk_ops clk_ops_vote =
86{
87 .enable = clock_lib2_vote_clk_enable,
88 .disable = clock_lib2_vote_clk_disable,
89};
90
91/* Clock Sources */
92static struct fixed_clk cxo_clk_src =
93{
94 .c = {
95 .rate = 19200000,
96 .dbg_name = "cxo_clk_src",
97 .ops = &clk_ops_cxo,
98 },
99};
100
101static struct pll_vote_clk gpll0_clk_src =
102{
103 .en_reg = (void *) APCS_GPLL_ENA_VOTE,
104 .en_mask = BIT(0),
105 .status_reg = (void *) GPLL0_STATUS,
106 .status_mask = BIT(17),
107 .parent = &cxo_clk_src.c,
108
109 .c = {
110 .rate = 600000000,
111 .dbg_name = "gpll0_clk_src",
112 .ops = &clk_ops_pll_vote,
113 },
114};
115
116/* SDCC Clocks */
117static struct clk_freq_tbl ftbl_gcc_sdcc1_2_apps_clk[] =
118{
119 F( 144000, cxo, 16, 3, 25),
120 F( 400000, cxo, 12, 1, 4),
121 F( 20000000, gpll0, 15, 1, 2),
122 F( 25000000, gpll0, 12, 1, 2),
123 F( 50000000, gpll0, 12, 0, 0),
124 F(100000000, gpll0, 6, 0, 0),
125 F(200000000, gpll0, 3, 0, 0),
126 F_END
127};
128
129static struct rcg_clk sdcc1_apps_clk_src =
130{
131 .cmd_reg = (uint32_t *) SDCC1_CMD_RCGR,
132 .cfg_reg = (uint32_t *) SDCC1_CFG_RCGR,
133 .m_reg = (uint32_t *) SDCC1_M,
134 .n_reg = (uint32_t *) SDCC1_N,
135 .d_reg = (uint32_t *) SDCC1_D,
136
137 .set_rate = clock_lib2_rcg_set_rate_mnd,
138 .freq_tbl = ftbl_gcc_sdcc1_2_apps_clk,
139 .current_freq = &rcg_dummy_freq,
140
141 .c = {
142 .dbg_name = "sdc1_clk",
143 .ops = &clk_ops_rcg_mnd,
144 },
145};
146
147static struct branch_clk gcc_sdcc1_apps_clk =
148{
149 .cbcr_reg = (uint32_t *) SDCC1_APPS_CBCR,
150 .parent = &sdcc1_apps_clk_src.c,
151
152 .c = {
153 .dbg_name = "gcc_sdcc1_apps_clk",
154 .ops = &clk_ops_branch,
155 },
156};
157
158static struct branch_clk gcc_sdcc1_ahb_clk =
159{
160 .cbcr_reg = (uint32_t *) SDCC1_AHB_CBCR,
161 .has_sibling = 1,
162
163 .c = {
164 .dbg_name = "gcc_sdcc1_ahb_clk",
165 .ops = &clk_ops_branch,
166 },
167};
168
169static struct rcg_clk sdcc2_apps_clk_src =
170{
171 .cmd_reg = (uint32_t *) SDCC2_CMD_RCGR,
172 .cfg_reg = (uint32_t *) SDCC2_CFG_RCGR,
173 .m_reg = (uint32_t *) SDCC2_M,
174 .n_reg = (uint32_t *) SDCC2_N,
175 .d_reg = (uint32_t *) SDCC2_D,
176
177 .set_rate = clock_lib2_rcg_set_rate_mnd,
178 .freq_tbl = ftbl_gcc_sdcc1_2_apps_clk,
179 .current_freq = &rcg_dummy_freq,
180
181 .c = {
182 .dbg_name = "sdc2_clk",
183 .ops = &clk_ops_rcg_mnd,
184 },
185};
186
187static struct branch_clk gcc_sdcc2_apps_clk =
188{
189 .cbcr_reg = (uint32_t *) SDCC2_APPS_CBCR,
190 .parent = &sdcc2_apps_clk_src.c,
191
192 .c = {
193 .dbg_name = "gcc_sdcc2_apps_clk",
194 .ops = &clk_ops_branch,
195 },
196};
197
198static struct branch_clk gcc_sdcc2_ahb_clk =
199{
200 .cbcr_reg = (uint32_t *) SDCC2_AHB_CBCR,
201 .has_sibling = 1,
202
203 .c = {
204 .dbg_name = "gcc_sdcc2_ahb_clk",
205 .ops = &clk_ops_branch,
206 },
207};
208
209/* UART Clocks */
210static struct clk_freq_tbl ftbl_gcc_blsp1_2_uart1_6_apps_clk[] =
211{
212 F( 3686400, gpll0, 1, 96, 15625),
213 F( 7372800, gpll0, 1, 192, 15625),
214 F(14745600, gpll0, 1, 384, 15625),
215 F(16000000, gpll0, 5, 2, 15),
216 F(19200000, cxo, 1, 0, 0),
217 F(24000000, gpll0, 5, 1, 5),
218 F(32000000, gpll0, 1, 4, 75),
219 F(40000000, gpll0, 15, 0, 0),
220 F(46400000, gpll0, 1, 29, 375),
221 F(48000000, gpll0, 12.5, 0, 0),
222 F(51200000, gpll0, 1, 32, 375),
223 F(56000000, gpll0, 1, 7, 75),
224 F(58982400, gpll0, 1, 1536, 15625),
225 F(60000000, gpll0, 10, 0, 0),
226 F_END
227};
228
229static struct rcg_clk blsp1_uart0_apps_clk_src =
230{
231 .cmd_reg = (uint32_t *) BLSP1_UART0_APPS_CMD_RCGR,
232 .cfg_reg = (uint32_t *) BLSP1_UART0_APPS_CFG_RCGR,
233 .m_reg = (uint32_t *) BLSP1_UART0_APPS_M,
234 .n_reg = (uint32_t *) BLSP1_UART0_APPS_N,
235 .d_reg = (uint32_t *) BLSP1_UART0_APPS_D,
236
237 .set_rate = clock_lib2_rcg_set_rate_mnd,
238 .freq_tbl = ftbl_gcc_blsp1_2_uart1_6_apps_clk,
239 .current_freq = &rcg_dummy_freq,
240
241 .c = {
242 .dbg_name = "blsp1_uart0_apps_clk",
243 .ops = &clk_ops_rcg_mnd,
244 },
245};
246
247static struct branch_clk gcc_blsp1_uart0_apps_clk =
248{
249 .cbcr_reg = (uint32_t *) BLSP1_UART0_APPS_CBCR,
250 .parent = &blsp1_uart0_apps_clk_src.c,
251
252 .c = {
253 .dbg_name = "gcc_blsp1_uart0_apps_clk",
254 .ops = &clk_ops_branch,
255 },
256};
257
258static struct rcg_clk blsp1_uart1_apps_clk_src =
259{
260 .cmd_reg = (uint32_t *) BLSP1_UART1_APPS_CMD_RCGR,
261 .cfg_reg = (uint32_t *) BLSP1_UART1_APPS_CFG_RCGR,
262 .m_reg = (uint32_t *) BLSP1_UART1_APPS_M,
263 .n_reg = (uint32_t *) BLSP1_UART1_APPS_N,
264 .d_reg = (uint32_t *) BLSP1_UART1_APPS_D,
265
266 .set_rate = clock_lib2_rcg_set_rate_mnd,
267 .freq_tbl = ftbl_gcc_blsp1_2_uart1_6_apps_clk,
268 .current_freq = &rcg_dummy_freq,
269
270 .c = {
271 .dbg_name = "blsp1_uart1_apps_clk",
272 .ops = &clk_ops_rcg_mnd,
273 },
274};
275
276static struct branch_clk gcc_blsp1_uart1_apps_clk =
277{
278 .cbcr_reg = (uint32_t *) BLSP1_UART1_APPS_CBCR,
279 .parent = &blsp1_uart1_apps_clk_src.c,
280
281 .c = {
282 .dbg_name = "gcc_blsp1_uart1_apps_clk",
283 .ops = &clk_ops_branch,
284 },
285};
286
287static struct rcg_clk blsp1_uart2_apps_clk_src =
288{
289 .cmd_reg = (uint32_t *) BLSP1_UART2_APPS_CMD_RCGR,
290 .cfg_reg = (uint32_t *) BLSP1_UART2_APPS_CFG_RCGR,
291 .m_reg = (uint32_t *) BLSP1_UART2_APPS_M,
292 .n_reg = (uint32_t *) BLSP1_UART2_APPS_N,
293 .d_reg = (uint32_t *) BLSP1_UART2_APPS_D,
294
295 .set_rate = clock_lib2_rcg_set_rate_mnd,
296 .freq_tbl = ftbl_gcc_blsp1_2_uart1_6_apps_clk,
297 .current_freq = &rcg_dummy_freq,
298
299 .c = {
300 .dbg_name = "blsp1_uart2_apps_clk",
301 .ops = &clk_ops_rcg_mnd,
302 },
303};
304
305static struct branch_clk gcc_blsp1_uart2_apps_clk =
306{
307 .cbcr_reg = (uint32_t *) BLSP1_UART2_APPS_CBCR,
308 .parent = &blsp1_uart2_apps_clk_src.c,
309
310 .c = {
311 .dbg_name = "gcc_blsp1_uart2_apps_clk",
312 .ops = &clk_ops_branch,
313 },
314};
315
316static struct rcg_clk blsp1_uart3_apps_clk_src =
317{
318 .cmd_reg = (uint32_t *) BLSP1_UART3_APPS_CMD_RCGR,
319 .cfg_reg = (uint32_t *) BLSP1_UART3_APPS_CFG_RCGR,
320 .m_reg = (uint32_t *) BLSP1_UART3_APPS_M,
321 .n_reg = (uint32_t *) BLSP1_UART3_APPS_N,
322 .d_reg = (uint32_t *) BLSP1_UART3_APPS_D,
323
324 .set_rate = clock_lib2_rcg_set_rate_mnd,
325 .freq_tbl = ftbl_gcc_blsp1_2_uart1_6_apps_clk,
326 .current_freq = &rcg_dummy_freq,
327
328 .c = {
329 .dbg_name = "blsp1_uart3_apps_clk",
330 .ops = &clk_ops_rcg_mnd,
331 },
332};
333
334static struct branch_clk gcc_blsp1_uart3_apps_clk =
335{
336 .cbcr_reg = (uint32_t *) BLSP1_UART3_APPS_CBCR,
337 .parent = &blsp1_uart3_apps_clk_src.c,
338
339 .c = {
340 .dbg_name = "gcc_blsp1_uart3_apps_clk",
341 .ops = &clk_ops_branch,
342 },
343};
344
345static struct rcg_clk blsp1_uart4_apps_clk_src =
346{
347 .cmd_reg = (uint32_t *) BLSP1_UART4_APPS_CMD_RCGR,
348 .cfg_reg = (uint32_t *) BLSP1_UART4_APPS_CFG_RCGR,
349 .m_reg = (uint32_t *) BLSP1_UART4_APPS_M,
350 .n_reg = (uint32_t *) BLSP1_UART4_APPS_N,
351 .d_reg = (uint32_t *) BLSP1_UART4_APPS_D,
352
353 .set_rate = clock_lib2_rcg_set_rate_mnd,
354 .freq_tbl = ftbl_gcc_blsp1_2_uart1_6_apps_clk,
355 .current_freq = &rcg_dummy_freq,
356
357 .c = {
358 .dbg_name = "blsp1_uart4_apps_clk",
359 .ops = &clk_ops_rcg_mnd,
360 },
361};
362
363static struct branch_clk gcc_blsp1_uart4_apps_clk =
364{
365 .cbcr_reg = (uint32_t *) BLSP1_UART4_APPS_CBCR,
366 .parent = &blsp1_uart4_apps_clk_src.c,
367
368 .c = {
369 .dbg_name = "gcc_blsp1_uart4_apps_clk",
370 .ops = &clk_ops_branch,
371 },
372};
373
374static struct rcg_clk blsp1_uart5_apps_clk_src =
375{
376 .cmd_reg = (uint32_t *) BLSP1_UART5_APPS_CMD_RCGR,
377 .cfg_reg = (uint32_t *) BLSP1_UART5_APPS_CFG_RCGR,
378 .m_reg = (uint32_t *) BLSP1_UART5_APPS_M,
379 .n_reg = (uint32_t *) BLSP1_UART5_APPS_N,
380 .d_reg = (uint32_t *) BLSP1_UART5_APPS_D,
381
382 .set_rate = clock_lib2_rcg_set_rate_mnd,
383 .freq_tbl = ftbl_gcc_blsp1_2_uart1_6_apps_clk,
384 .current_freq = &rcg_dummy_freq,
385
386 .c = {
387 .dbg_name = "blsp1_uart5_apps_clk",
388 .ops = &clk_ops_rcg_mnd,
389 },
390};
391
392static struct branch_clk gcc_blsp1_uart5_apps_clk =
393{
394 .cbcr_reg = (uint32_t *) BLSP1_UART5_APPS_CBCR,
395 .parent = &blsp1_uart5_apps_clk_src.c,
396
397 .c = {
398 .dbg_name = "gcc_blsp1_uart5_apps_clk",
399 .ops = &clk_ops_branch,
400 },
401};
402
403static struct rcg_clk blsp2_uart0_apps_clk_src =
404{
405 .cmd_reg = (uint32_t *) BLSP2_UART0_APPS_CMD_RCGR,
406 .cfg_reg = (uint32_t *) BLSP2_UART0_APPS_CFG_RCGR,
407 .m_reg = (uint32_t *) BLSP2_UART0_APPS_M,
408 .n_reg = (uint32_t *) BLSP2_UART0_APPS_N,
409 .d_reg = (uint32_t *) BLSP2_UART0_APPS_D,
410
411 .set_rate = clock_lib2_rcg_set_rate_mnd,
412 .freq_tbl = ftbl_gcc_blsp1_2_uart1_6_apps_clk,
413 .current_freq = &rcg_dummy_freq,
414
415 .c = {
416 .dbg_name = "blsp2_uart0_apps_clk",
417 .ops = &clk_ops_rcg_mnd,
418 },
419};
420
421static struct branch_clk gcc_blsp2_uart0_apps_clk =
422{
423 .cbcr_reg = (uint32_t *) BLSP2_UART0_APPS_CBCR,
424 .parent = &blsp2_uart0_apps_clk_src.c,
425
426 .c = {
427 .dbg_name = "gcc_blsp2_uart0_apps_clk",
428 .ops = &clk_ops_branch,
429 },
430};
431
432static struct rcg_clk blsp2_uart1_apps_clk_src =
433{
434 .cmd_reg = (uint32_t *) BLSP2_UART1_APPS_CMD_RCGR,
435 .cfg_reg = (uint32_t *) BLSP2_UART1_APPS_CFG_RCGR,
436 .m_reg = (uint32_t *) BLSP2_UART1_APPS_M,
437 .n_reg = (uint32_t *) BLSP2_UART1_APPS_N,
438 .d_reg = (uint32_t *) BLSP2_UART1_APPS_D,
439
440 .set_rate = clock_lib2_rcg_set_rate_mnd,
441 .freq_tbl = ftbl_gcc_blsp1_2_uart1_6_apps_clk,
442 .current_freq = &rcg_dummy_freq,
443
444 .c = {
445 .dbg_name = "blsp2_uart1_apps_clk",
446 .ops = &clk_ops_rcg_mnd,
447 },
448};
449
450static struct branch_clk gcc_blsp2_uart1_apps_clk =
451{
452 .cbcr_reg = (uint32_t *) BLSP2_UART1_APPS_CBCR,
453 .parent = &blsp2_uart1_apps_clk_src.c,
454
455 .c = {
456 .dbg_name = "gcc_blsp2_uart1_apps_clk",
457 .ops = &clk_ops_branch,
458 },
459};
460
461static struct rcg_clk blsp2_uart2_apps_clk_src =
462{
463 .cmd_reg = (uint32_t *) BLSP2_UART2_APPS_CMD_RCGR,
464 .cfg_reg = (uint32_t *) BLSP2_UART2_APPS_CFG_RCGR,
465 .m_reg = (uint32_t *) BLSP2_UART2_APPS_M,
466 .n_reg = (uint32_t *) BLSP2_UART2_APPS_N,
467 .d_reg = (uint32_t *) BLSP2_UART2_APPS_D,
468
469 .set_rate = clock_lib2_rcg_set_rate_mnd,
470 .freq_tbl = ftbl_gcc_blsp1_2_uart1_6_apps_clk,
471 .current_freq = &rcg_dummy_freq,
472
473 .c = {
474 .dbg_name = "blsp2_uart2_apps_clk",
475 .ops = &clk_ops_rcg_mnd,
476 },
477};
478
479static struct branch_clk gcc_blsp2_uart2_apps_clk =
480{
481 .cbcr_reg = (uint32_t *) BLSP2_UART2_APPS_CBCR,
482 .parent = &blsp2_uart2_apps_clk_src.c,
483
484 .c = {
485 .dbg_name = "gcc_blsp2_uart2_apps_clk",
486 .ops = &clk_ops_branch,
487 },
488};
489
490static struct rcg_clk blsp2_uart3_apps_clk_src =
491{
492 .cmd_reg = (uint32_t *) BLSP2_UART3_APPS_CMD_RCGR,
493 .cfg_reg = (uint32_t *) BLSP2_UART3_APPS_CFG_RCGR,
494 .m_reg = (uint32_t *) BLSP2_UART3_APPS_M,
495 .n_reg = (uint32_t *) BLSP2_UART3_APPS_N,
496 .d_reg = (uint32_t *) BLSP2_UART3_APPS_D,
497
498 .set_rate = clock_lib2_rcg_set_rate_mnd,
499 .freq_tbl = ftbl_gcc_blsp1_2_uart1_6_apps_clk,
500 .current_freq = &rcg_dummy_freq,
501
502 .c = {
503 .dbg_name = "blsp2_uart3_apps_clk",
504 .ops = &clk_ops_rcg_mnd,
505 },
506};
507
508static struct branch_clk gcc_blsp2_uart3_apps_clk =
509{
510 .cbcr_reg = (uint32_t *) BLSP2_UART3_APPS_CBCR,
511 .parent = &blsp2_uart3_apps_clk_src.c,
512
513 .c = {
514 .dbg_name = "gcc_blsp2_uart3_apps_clk",
515 .ops = &clk_ops_branch,
516 },
517};
518
519static struct rcg_clk blsp2_uart4_apps_clk_src =
520{
521 .cmd_reg = (uint32_t *) BLSP2_UART4_APPS_CMD_RCGR,
522 .cfg_reg = (uint32_t *) BLSP2_UART4_APPS_CFG_RCGR,
523 .m_reg = (uint32_t *) BLSP2_UART4_APPS_M,
524 .n_reg = (uint32_t *) BLSP2_UART4_APPS_N,
525 .d_reg = (uint32_t *) BLSP2_UART4_APPS_D,
526
527 .set_rate = clock_lib2_rcg_set_rate_mnd,
528 .freq_tbl = ftbl_gcc_blsp1_2_uart1_6_apps_clk,
529 .current_freq = &rcg_dummy_freq,
530
531 .c = {
532 .dbg_name = "blsp2_uart4_apps_clk",
533 .ops = &clk_ops_rcg_mnd,
534 },
535};
536
537static struct branch_clk gcc_blsp2_uart4_apps_clk =
538{
539 .cbcr_reg = (uint32_t *) BLSP2_UART4_APPS_CBCR,
540 .parent = &blsp2_uart4_apps_clk_src.c,
541
542 .c = {
543 .dbg_name = "gcc_blsp2_uart4_apps_clk",
544 .ops = &clk_ops_branch,
545 },
546};
547
548static struct rcg_clk blsp2_uart5_apps_clk_src =
549{
550 .cmd_reg = (uint32_t *) BLSP2_UART5_APPS_CMD_RCGR,
551 .cfg_reg = (uint32_t *) BLSP2_UART5_APPS_CFG_RCGR,
552 .m_reg = (uint32_t *) BLSP2_UART5_APPS_M,
553 .n_reg = (uint32_t *) BLSP2_UART5_APPS_N,
554 .d_reg = (uint32_t *) BLSP2_UART5_APPS_D,
555
556 .set_rate = clock_lib2_rcg_set_rate_mnd,
557 .freq_tbl = ftbl_gcc_blsp1_2_uart1_6_apps_clk,
558 .current_freq = &rcg_dummy_freq,
559
560 .c = {
561 .dbg_name = "blsp2_uart5_apps_clk",
562 .ops = &clk_ops_rcg_mnd,
563 },
564};
565
566static struct branch_clk gcc_blsp2_uart5_apps_clk =
567{
568 .cbcr_reg = (uint32_t *) BLSP2_UART5_APPS_CBCR,
569 .parent = &blsp2_uart5_apps_clk_src.c,
570
571 .c = {
572 .dbg_name = "gcc_blsp2_uart5_apps_clk",
573 .ops = &clk_ops_branch,
574 },
575};
576
577static struct vote_clk gcc_blsp1_ahb_clk = {
578 .cbcr_reg = (uint32_t *) BLSP1_AHB_CBCR,
579 .vote_reg = (uint32_t *) APCS_CLOCK_BRANCH_ENA_VOTE,
580 .en_mask = BIT(17),
581
582 .c = {
583 .dbg_name = "gcc_blsp1_ahb_clk",
584 .ops = &clk_ops_vote,
585 },
586};
587
588static struct vote_clk gcc_blsp2_ahb_clk = {
589 .cbcr_reg = (uint32_t *) BLSP2_AHB_CBCR,
590 .vote_reg = (uint32_t *) APCS_CLOCK_BRANCH_ENA_VOTE,
591 .en_mask = BIT(15),
592
593 .c = {
594 .dbg_name = "gcc_blsp2_ahb_clk",
595 .ops = &clk_ops_vote,
596 },
597};
598
599/* USB Clocks */
600static struct clk_freq_tbl ftbl_gcc_usb_hs_system_clk[] =
601{
602 F(75000000, gpll0, 8, 0, 0),
603 F_END
604};
605
606static struct rcg_clk usb_hs_system_clk_src =
607{
608 .cmd_reg = (uint32_t *) USB_HS_SYSTEM_CMD_RCGR,
609 .cfg_reg = (uint32_t *) USB_HS_SYSTEM_CFG_RCGR,
610
611 .set_rate = clock_lib2_rcg_set_rate_hid,
612 .freq_tbl = ftbl_gcc_usb_hs_system_clk,
613 .current_freq = &rcg_dummy_freq,
614
615 .c = {
616 .dbg_name = "usb_hs_system_clk",
617 .ops = &clk_ops_rcg,
618 },
619};
620
621static struct branch_clk gcc_usb_hs_system_clk =
622{
623 .cbcr_reg = (uint32_t *) USB_HS_SYSTEM_CBCR,
624 .parent = &usb_hs_system_clk_src.c,
625
626 .c = {
627 .dbg_name = "gcc_usb_hs_system_clk",
628 .ops = &clk_ops_branch,
629 },
630};
631
632static struct branch_clk gcc_usb_hs_ahb_clk =
633{
634 .cbcr_reg = (uint32_t *) USB_HS_AHB_CBCR,
635 .has_sibling = 1,
636
637 .c = {
638 .dbg_name = "gcc_usb_hs_ahb_clk",
639 .ops = &clk_ops_branch,
640 },
641};
642
643/* CE Clocks */
644static struct clk_freq_tbl ftbl_gcc_ce2_clk[] = {
645 F( 50000000, gpll0, 12, 0, 0),
646 F(100000000, gpll0, 6, 0, 0),
647 F_END
648};
649
650static struct rcg_clk ce2_clk_src = {
651 .cmd_reg = (uint32_t *) GCC_CE2_CMD_RCGR,
652 .cfg_reg = (uint32_t *) GCC_CE2_CFG_RCGR,
653 .set_rate = clock_lib2_rcg_set_rate_hid,
654 .freq_tbl = ftbl_gcc_ce2_clk,
655 .current_freq = &rcg_dummy_freq,
656
657 .c = {
658 .dbg_name = "ce2_clk_src",
659 .ops = &clk_ops_rcg,
660 },
661};
662
663static struct vote_clk gcc_ce2_clk = {
664 .cbcr_reg = (uint32_t *) GCC_CE2_CBCR,
665 .vote_reg = (uint32_t *) APCS_CLOCK_BRANCH_ENA_VOTE,
666 .en_mask = BIT(2),
667
668 .c = {
669 .dbg_name = "gcc_ce2_clk",
670 .ops = &clk_ops_vote,
671 },
672};
673
674static struct vote_clk gcc_ce2_ahb_clk = {
675 .cbcr_reg = (uint32_t *) GCC_CE2_AHB_CBCR,
676 .vote_reg = (uint32_t *) APCS_CLOCK_BRANCH_ENA_VOTE,
677 .en_mask = BIT(0),
678
679 .c = {
680 .dbg_name = "gcc_ce2_ahb_clk",
681 .ops = &clk_ops_vote,
682 },
683};
684
685static struct vote_clk gcc_ce2_axi_clk = {
686 .cbcr_reg = (uint32_t *) GCC_CE2_AXI_CBCR,
687 .vote_reg = (uint32_t *) APCS_CLOCK_BRANCH_ENA_VOTE,
688 .en_mask = BIT(1),
689
690 .c = {
691 .dbg_name = "gcc_ce2_axi_clk",
692 .ops = &clk_ops_vote,
693 },
694};
695
696static struct clk_freq_tbl ftbl_gcc_ce1_clk[] = {
697 F( 50000000, gpll0, 12, 0, 0),
698 F(100000000, gpll0, 6, 0, 0),
699 F_END
700};
701
702static struct rcg_clk ce1_clk_src = {
703 .cmd_reg = (uint32_t *) GCC_CE1_CMD_RCGR,
704 .cfg_reg = (uint32_t *) GCC_CE1_CFG_RCGR,
705 .set_rate = clock_lib2_rcg_set_rate_hid,
706 .freq_tbl = ftbl_gcc_ce1_clk,
707 .current_freq = &rcg_dummy_freq,
708
709 .c = {
710 .dbg_name = "ce1_clk_src",
711 .ops = &clk_ops_rcg,
712 },
713};
714
715static struct vote_clk gcc_ce1_clk = {
716 .cbcr_reg = (uint32_t *) GCC_CE1_CBCR,
717 .vote_reg = (uint32_t *) APCS_CLOCK_BRANCH_ENA_VOTE,
718 .en_mask = BIT(5),
719
720 .c = {
721 .dbg_name = "gcc_ce1_clk",
722 .ops = &clk_ops_vote,
723 },
724};
725
726static struct vote_clk gcc_ce1_ahb_clk = {
727 .cbcr_reg = (uint32_t *) GCC_CE1_AHB_CBCR,
728 .vote_reg = (uint32_t *) APCS_CLOCK_BRANCH_ENA_VOTE,
729 .en_mask = BIT(3),
730
731 .c = {
732 .dbg_name = "gcc_ce1_ahb_clk",
733 .ops = &clk_ops_vote,
734 },
735};
736
737static struct vote_clk gcc_ce1_axi_clk = {
738 .cbcr_reg = (uint32_t *) GCC_CE1_AXI_CBCR,
739 .vote_reg = (uint32_t *) APCS_CLOCK_BRANCH_ENA_VOTE,
740 .en_mask = BIT(4),
741
742 .c = {
743 .dbg_name = "gcc_ce1_axi_clk",
744 .ops = &clk_ops_vote,
745 },
746};
747
748
749struct branch_clk gcc_blsp2_qup5_i2c_apps_clk = {
750 .cbcr_reg = BLSP2_QUP5_I2C_APPS_CBCR,
751 .parent = &cxo_clk_src.c,
752
753 .c = {
754 .dbg_name = "gcc_blsp2_qup5_i2c_apps_clk",
755 .ops = &clk_ops_branch,
756 },
757};
758
759/* Clock lookup table */
760static struct clk_lookup msm_clocks_fsm9900[] =
761{
762 CLK_LOOKUP("sdc1_iface_clk", gcc_sdcc1_ahb_clk.c),
763 CLK_LOOKUP("sdc1_core_clk", gcc_sdcc1_apps_clk.c),
764
765 CLK_LOOKUP("sdc2_iface_clk", gcc_sdcc2_ahb_clk.c),
766 CLK_LOOKUP("sdc2_core_clk", gcc_sdcc2_apps_clk.c),
767
768 CLK_LOOKUP("uart0_iface_clk", gcc_blsp1_ahb_clk.c),
769 CLK_LOOKUP("uart0_core_clk", gcc_blsp1_uart0_apps_clk.c),
770 CLK_LOOKUP("uart1_iface_clk", gcc_blsp1_ahb_clk.c),
771 CLK_LOOKUP("uart1_core_clk", gcc_blsp1_uart1_apps_clk.c),
772 CLK_LOOKUP("uart2_iface_clk", gcc_blsp1_ahb_clk.c),
773 CLK_LOOKUP("uart2_core_clk", gcc_blsp1_uart2_apps_clk.c),
774 CLK_LOOKUP("uart3_iface_clk", gcc_blsp1_ahb_clk.c),
775 CLK_LOOKUP("uart3_core_clk", gcc_blsp1_uart3_apps_clk.c),
776 CLK_LOOKUP("uart4_iface_clk", gcc_blsp1_ahb_clk.c),
777 CLK_LOOKUP("uart4_core_clk", gcc_blsp1_uart4_apps_clk.c),
778 CLK_LOOKUP("uart5_iface_clk", gcc_blsp1_ahb_clk.c),
779 CLK_LOOKUP("uart5_core_clk", gcc_blsp1_uart5_apps_clk.c),
780 CLK_LOOKUP("uart6_iface_clk", gcc_blsp2_ahb_clk.c),
781 CLK_LOOKUP("uart6_core_clk", gcc_blsp2_uart0_apps_clk.c),
782 CLK_LOOKUP("uart7_iface_clk", gcc_blsp2_ahb_clk.c),
783 CLK_LOOKUP("uart7_core_clk", gcc_blsp2_uart1_apps_clk.c),
784 CLK_LOOKUP("uart8_iface_clk", gcc_blsp2_ahb_clk.c),
785 CLK_LOOKUP("uart8_core_clk", gcc_blsp2_uart2_apps_clk.c),
786 CLK_LOOKUP("uart9_iface_clk", gcc_blsp2_ahb_clk.c),
787 CLK_LOOKUP("uart9_core_clk", gcc_blsp2_uart3_apps_clk.c),
788 CLK_LOOKUP("uart10_iface_clk", gcc_blsp2_ahb_clk.c),
789 CLK_LOOKUP("uart10_core_clk", gcc_blsp2_uart4_apps_clk.c),
790 CLK_LOOKUP("uart11_iface_clk", gcc_blsp2_ahb_clk.c),
791 CLK_LOOKUP("uart11_core_clk", gcc_blsp2_uart5_apps_clk.c),
792
793 CLK_LOOKUP("usb_iface_clk", gcc_usb_hs_ahb_clk.c),
794 CLK_LOOKUP("usb_core_clk", gcc_usb_hs_system_clk.c),
795
796 CLK_LOOKUP("ce2_ahb_clk", gcc_ce2_ahb_clk.c),
797 CLK_LOOKUP("ce2_axi_clk", gcc_ce2_axi_clk.c),
798 CLK_LOOKUP("ce2_core_clk", gcc_ce2_clk.c),
799 CLK_LOOKUP("ce2_src_clk", ce2_clk_src.c),
800
801 CLK_LOOKUP("ce1_ahb_clk", gcc_ce1_ahb_clk.c),
802 CLK_LOOKUP("ce1_axi_clk", gcc_ce1_axi_clk.c),
803 CLK_LOOKUP("ce1_core_clk", gcc_ce1_clk.c),
804 CLK_LOOKUP("ce1_src_clk", ce1_clk_src.c),
805
806
807 CLK_LOOKUP("blsp2_ahb_clk", gcc_blsp2_ahb_clk.c),
808 CLK_LOOKUP("blsp2_qup5_i2c_apps_clk", gcc_blsp2_qup5_i2c_apps_clk.c),
809};
810
811
812void platform_clock_init(void)
813{
814 clk_init(msm_clocks_fsm9900, ARRAY_SIZE(msm_clocks_fsm9900));
815}