blob: 2c42f41ec0a21d9753213910156d28010c26f3c4 [file] [log] [blame]
Channagoud Kadabi123c9722014-02-06 13:22:50 -08001/* Copyright (c) 2013-2014, 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 gpll4_source_val 5
43#define cxo_mm_source_val 0
44#define mmpll0_mm_source_val 1
45#define mmpll1_mm_source_val 2
46#define mmpll3_mm_source_val 3
47#define gpll0_mm_source_val 5
Channagoud Kadabib4c64b82014-07-24 17:18:46 -070048#define edppll_270_mm_source_val 4
49#define edppll_350_mm_source_val 4
Channagoud Kadabi123c9722014-02-06 13:22:50 -080050
51struct clk_freq_tbl rcg_dummy_freq = F_END;
52
53
54/* Clock Operations */
Channagoud Kadabi3dcc4ed2014-04-10 14:59:41 -070055static struct clk_ops clk_ops_rst =
56{
57 .reset = clock_lib2_reset_clk_reset,
58};
59
Channagoud Kadabi123c9722014-02-06 13:22:50 -080060static struct clk_ops clk_ops_branch =
61{
62 .enable = clock_lib2_branch_clk_enable,
63 .disable = clock_lib2_branch_clk_disable,
64 .set_rate = clock_lib2_branch_set_rate,
Channagoud Kadabi3dcc4ed2014-04-10 14:59:41 -070065 .reset = clock_lib2_branch_clk_reset,
Channagoud Kadabi123c9722014-02-06 13:22:50 -080066};
67
68static struct clk_ops clk_ops_rcg_mnd =
69{
70 .enable = clock_lib2_rcg_enable,
71 .set_rate = clock_lib2_rcg_set_rate,
72};
73
74static struct clk_ops clk_ops_rcg =
75{
76 .enable = clock_lib2_rcg_enable,
77 .set_rate = clock_lib2_rcg_set_rate,
78};
79
80static struct clk_ops clk_ops_cxo =
81{
82 .enable = cxo_clk_enable,
83 .disable = cxo_clk_disable,
84};
85
86static struct clk_ops clk_ops_pll_vote =
87{
88 .enable = pll_vote_clk_enable,
89 .disable = pll_vote_clk_disable,
90 .auto_off = pll_vote_clk_disable,
91 .is_enabled = pll_vote_clk_is_enabled,
92};
93
94static struct clk_ops clk_ops_vote =
95{
96 .enable = clock_lib2_vote_clk_enable,
97 .disable = clock_lib2_vote_clk_disable,
98};
99
100/* Clock Sources */
101static struct fixed_clk cxo_clk_src =
102{
103 .c = {
104 .rate = 19200000,
105 .dbg_name = "cxo_clk_src",
106 .ops = &clk_ops_cxo,
107 },
108};
109
110static struct pll_vote_clk gpll0_clk_src =
111{
112 .en_reg = (void *) APCS_GPLL_ENA_VOTE,
113 .en_mask = BIT(0),
114 .status_reg = (void *) GPLL0_MODE,
115 .status_mask = BIT(30),
116 .parent = &cxo_clk_src.c,
117
118 .c = {
119 .rate = 600000000,
120 .dbg_name = "gpll0_clk_src",
121 .ops = &clk_ops_pll_vote,
122 },
123};
124
125static struct pll_vote_clk gpll4_clk_src =
126{
127 .en_reg = (void *) APCS_GPLL_ENA_VOTE,
128 .en_mask = BIT(4),
129 .status_reg = (void *) GPLL4_MODE,
130 .status_mask = BIT(30),
131 .parent = &cxo_clk_src.c,
132
133 .c = {
134 .rate = 1600000000,
135 .dbg_name = "gpll4_clk_src",
136 .ops = &clk_ops_pll_vote,
137 },
138};
139
140/* UART Clocks */
141static struct clk_freq_tbl ftbl_gcc_blsp1_2_uart1_6_apps_clk[] =
142{
143 F( 3686400, gpll0, 1, 96, 15625),
144 F( 7372800, gpll0, 1, 192, 15625),
145 F(14745600, gpll0, 1, 384, 15625),
146 F(16000000, gpll0, 5, 2, 15),
147 F(19200000, cxo, 1, 0, 0),
148 F(24000000, gpll0, 5, 1, 5),
149 F(32000000, gpll0, 1, 4, 75),
150 F(40000000, gpll0, 15, 0, 0),
151 F(46400000, gpll0, 1, 29, 375),
152 F(48000000, gpll0, 12.5, 0, 0),
153 F(51200000, gpll0, 1, 32, 375),
154 F(56000000, gpll0, 1, 7, 75),
155 F(58982400, gpll0, 1, 1536, 15625),
156 F(60000000, gpll0, 10, 0, 0),
Channagoud Kadabia66a6f22014-05-28 17:19:44 -0700157 F(63160000, gpll0, 9.5, 0, 0),
Channagoud Kadabi123c9722014-02-06 13:22:50 -0800158 F_END
159};
160
161static struct rcg_clk blsp2_uart2_apps_clk_src =
162{
163 .cmd_reg = (uint32_t *) BLSP2_UART2_APPS_CMD_RCGR,
164 .cfg_reg = (uint32_t *) BLSP2_UART2_APPS_CFG_RCGR,
165 .m_reg = (uint32_t *) BLSP2_UART2_APPS_M,
166 .n_reg = (uint32_t *) BLSP2_UART2_APPS_N,
167 .d_reg = (uint32_t *) BLSP2_UART2_APPS_D,
168
169 .set_rate = clock_lib2_rcg_set_rate_mnd,
170 .freq_tbl = ftbl_gcc_blsp1_2_uart1_6_apps_clk,
171 .current_freq = &rcg_dummy_freq,
172
173 .c = {
174 .dbg_name = "blsp1_uart2_apps_clk",
175 .ops = &clk_ops_rcg_mnd,
176 },
177};
178
179static struct rcg_clk blsp1_uart2_apps_clk_src =
180{
181 .cmd_reg = (uint32_t *) BLSP1_UART2_APPS_CMD_RCGR,
182 .cfg_reg = (uint32_t *) BLSP1_UART2_APPS_CFG_RCGR,
183 .m_reg = (uint32_t *) BLSP1_UART2_APPS_M,
184 .n_reg = (uint32_t *) BLSP1_UART2_APPS_N,
185 .d_reg = (uint32_t *) BLSP1_UART2_APPS_D,
186
187 .set_rate = clock_lib2_rcg_set_rate_mnd,
188 .freq_tbl = ftbl_gcc_blsp1_2_uart1_6_apps_clk,
189 .current_freq = &rcg_dummy_freq,
190
191 .c = {
192 .dbg_name = "blsp1_uart2_apps_clk",
193 .ops = &clk_ops_rcg_mnd,
194 },
195};
196
197static struct branch_clk gcc_blsp2_uart2_apps_clk =
198{
199 .cbcr_reg = (uint32_t *) BLSP2_UART2_APPS_CBCR,
200 .parent = &blsp2_uart2_apps_clk_src.c,
201
202 .c = {
203 .dbg_name = "gcc_blsp2_uart2_apps_clk",
204 .ops = &clk_ops_branch,
205 },
206};
207
208static struct branch_clk gcc_blsp1_uart2_apps_clk =
209{
210 .cbcr_reg = (uint32_t *) BLSP1_UART2_APPS_CBCR,
211 .parent = &blsp1_uart2_apps_clk_src.c,
212
213 .c = {
214 .dbg_name = "gcc_blsp1_uart2_apps_clk",
215 .ops = &clk_ops_branch,
216 },
217};
218
219static struct vote_clk gcc_blsp1_ahb_clk = {
220 .cbcr_reg = (uint32_t *) BLSP1_AHB_CBCR,
221 .vote_reg = (uint32_t *) APCS_CLOCK_BRANCH_ENA_VOTE,
222 .en_mask = BIT(17),
223
224 .c = {
225 .dbg_name = "gcc_blsp1_ahb_clk",
226 .ops = &clk_ops_vote,
227 },
228};
229
230static struct vote_clk gcc_blsp2_ahb_clk = {
231 .cbcr_reg = (uint32_t *) BLSP2_AHB_CBCR,
232 .vote_reg = (uint32_t *) APCS_CLOCK_BRANCH_ENA_VOTE,
233 .en_mask = BIT(15),
234
235 .c = {
236 .dbg_name = "gcc_blsp2_ahb_clk",
237 .ops = &clk_ops_vote,
238 },
239};
240
241/* USB Clocks */
242static struct clk_freq_tbl ftbl_gcc_usb_hs_system_clk[] =
243{
244 F(75000000, gpll0, 8, 0, 0),
245 F_END
246};
247
248static struct rcg_clk usb_hs_system_clk_src =
249{
250 .cmd_reg = (uint32_t *) USB_HS_SYSTEM_CMD_RCGR,
251 .cfg_reg = (uint32_t *) USB_HS_SYSTEM_CFG_RCGR,
252
253 .set_rate = clock_lib2_rcg_set_rate_hid,
254 .freq_tbl = ftbl_gcc_usb_hs_system_clk,
255 .current_freq = &rcg_dummy_freq,
256
257 .c = {
258 .dbg_name = "usb_hs_system_clk",
259 .ops = &clk_ops_rcg,
260 },
261};
262
263static struct branch_clk gcc_usb_hs_system_clk =
264{
265 .cbcr_reg = (uint32_t *) USB_HS_SYSTEM_CBCR,
266 .parent = &usb_hs_system_clk_src.c,
267
268 .c = {
269 .dbg_name = "gcc_usb_hs_system_clk",
270 .ops = &clk_ops_branch,
271 },
272};
273
274static struct branch_clk gcc_usb_hs_ahb_clk =
275{
276 .cbcr_reg = (uint32_t *) USB_HS_AHB_CBCR,
277 .has_sibling = 1,
278
279 .c = {
280 .dbg_name = "gcc_usb_hs_ahb_clk",
281 .ops = &clk_ops_branch,
282 },
283};
284
285/* SDCC Clocks */
Channagoud Kadabie804d642014-08-20 17:43:57 -0700286static struct clk_freq_tbl ftbl_gcc_sdcc1_apps_clk[] =
Channagoud Kadabi123c9722014-02-06 13:22:50 -0800287{
288 F( 144000, cxo, 16, 3, 25),
289 F( 400000, cxo, 12, 1, 4),
290 F( 20000000, gpll0, 15, 1, 2),
291 F( 25000000, gpll0, 12, 1, 2),
292 F( 50000000, gpll0, 12, 0, 0),
Channagoud Kadabia66a6f22014-05-28 17:19:44 -0700293 F( 96000000, gpll4, 6, 0, 0),
294 F(192000000, gpll4, 2, 0, 0),
295 F(384000000, gpll4, 1, 0, 0),
Channagoud Kadabi123c9722014-02-06 13:22:50 -0800296 F_END
297};
298
Channagoud Kadabie804d642014-08-20 17:43:57 -0700299static struct clk_freq_tbl ftbl_gcc_sdcc2_4_apps_clk[] =
300{
301 F( 144000, cxo, 16, 3, 25),
302 F( 400000, cxo, 12, 1, 4),
303 F( 20000000, gpll0, 15, 1, 2),
304 F( 25000000, gpll0, 12, 1, 2),
305 F( 50000000, gpll0, 12, 0, 0),
306 F(100000000, gpll0, 6, 0, 0),
307 F(200000000, gpll0, 3, 0, 0),
308 F_END
309};
310
Channagoud Kadabi123c9722014-02-06 13:22:50 -0800311static struct rcg_clk sdcc1_apps_clk_src =
312{
313 .cmd_reg = (uint32_t *) SDCC1_CMD_RCGR,
314 .cfg_reg = (uint32_t *) SDCC1_CFG_RCGR,
315 .m_reg = (uint32_t *) SDCC1_M,
316 .n_reg = (uint32_t *) SDCC1_N,
317 .d_reg = (uint32_t *) SDCC1_D,
318
319 .set_rate = clock_lib2_rcg_set_rate_mnd,
Channagoud Kadabie804d642014-08-20 17:43:57 -0700320 .freq_tbl = ftbl_gcc_sdcc1_apps_clk,
Channagoud Kadabi123c9722014-02-06 13:22:50 -0800321 .current_freq = &rcg_dummy_freq,
322
323 .c = {
324 .dbg_name = "sdc1_clk",
325 .ops = &clk_ops_rcg_mnd,
326 },
327};
328
329static struct branch_clk gcc_sdcc1_apps_clk =
330{
331 .cbcr_reg = (uint32_t *) SDCC1_APPS_CBCR,
332 .parent = &sdcc1_apps_clk_src.c,
333
334 .c = {
335 .dbg_name = "gcc_sdcc1_apps_clk",
336 .ops = &clk_ops_branch,
337 },
338};
339
340static struct branch_clk gcc_sdcc1_ahb_clk =
341{
342 .cbcr_reg = (uint32_t *) SDCC1_AHB_CBCR,
343 .has_sibling = 1,
344
345 .c = {
346 .dbg_name = "gcc_sdcc1_ahb_clk",
347 .ops = &clk_ops_branch,
348 },
349};
350
Channagoud Kadabie804d642014-08-20 17:43:57 -0700351static struct rcg_clk sdcc2_apps_clk_src =
352{
353 .cmd_reg = (uint32_t *) SDCC2_CMD_RCGR,
354 .cfg_reg = (uint32_t *) SDCC2_CFG_RCGR,
355 .m_reg = (uint32_t *) SDCC2_M,
356 .n_reg = (uint32_t *) SDCC2_N,
357 .d_reg = (uint32_t *) SDCC2_D,
358
359 .set_rate = clock_lib2_rcg_set_rate_mnd,
360 .freq_tbl = ftbl_gcc_sdcc2_4_apps_clk,
361 .current_freq = &rcg_dummy_freq,
362
363 .c = {
364 .dbg_name = "sdc2_clk",
365 .ops = &clk_ops_rcg_mnd,
366 },
367};
368
369static struct branch_clk gcc_sdcc2_apps_clk =
370{
371 .cbcr_reg = (uint32_t *) SDCC2_APPS_CBCR,
372 .parent = &sdcc2_apps_clk_src.c,
373
374 .c = {
375 .dbg_name = "gcc_sdcc2_apps_clk",
376 .ops = &clk_ops_branch,
377 },
378};
379
380static struct branch_clk gcc_sdcc2_ahb_clk =
381{
382 .cbcr_reg = (uint32_t *) SDCC2_AHB_CBCR,
383 .has_sibling = 1,
384
385 .c = {
386 .dbg_name = "gcc_sdcc2_ahb_clk",
387 .ops = &clk_ops_branch,
388 },
389};
390
Channagoud Kadabi3dcc4ed2014-04-10 14:59:41 -0700391static struct branch_clk gcc_sys_noc_usb30_axi_clk = {
392 .cbcr_reg = (uint32_t *) SYS_NOC_USB3_AXI_CBCR,
393 .has_sibling = 1,
394
395 .c = {
396 .dbg_name = "sys_noc_usb30_axi_clk",
397 .ops = &clk_ops_branch,
398 },
399};
400
401static struct branch_clk gcc_usb2b_phy_sleep_clk = {
402 .cbcr_reg = (uint32_t *) USB2B_PHY_SLEEP_CBCR,
403 .bcr_reg = (uint32_t *) USB2B_PHY_BCR,
404 .has_sibling = 1,
405
406 .c = {
407 .dbg_name = "usb2b_phy_sleep_clk",
408 .ops = &clk_ops_branch,
409 },
410};
411
412static struct clk_freq_tbl ftbl_gcc_usb30_master_clk[] = {
413 F( 125000000, gpll0, 1, 5, 24),
414 F_END
415};
416
417static struct rcg_clk usb30_master_clk_src = {
418 .cmd_reg = (uint32_t *) USB30_MASTER_CMD_RCGR,
419 .cfg_reg = (uint32_t *) USB30_MASTER_CFG_RCGR,
420 .m_reg = (uint32_t *) USB30_MASTER_M,
421 .n_reg = (uint32_t *) USB30_MASTER_N,
422 .d_reg = (uint32_t *) USB30_MASTER_D,
423
424 .set_rate = clock_lib2_rcg_set_rate_mnd,
425 .freq_tbl = ftbl_gcc_usb30_master_clk,
426 .current_freq = &rcg_dummy_freq,
427
428 .c = {
429 .dbg_name = "usb30_master_clk_src",
430 .ops = &clk_ops_rcg,
431 },
432};
433
434static struct branch_clk gcc_usb30_master_clk = {
435 .cbcr_reg = (uint32_t *) USB30_MASTER_CBCR,
436 .bcr_reg = (uint32_t *) USB_30_BCR,
437 .parent = &usb30_master_clk_src.c,
438
439 .c = {
440 .dbg_name = "usb30_master_clk",
441 .ops = &clk_ops_branch,
442 },
443};
444
445static struct clk_freq_tbl ftbl_gcc_usb30_mock_utmi_clk_src[] = {
446 F( 60000000, gpll0, 10, 0, 0),
447 F_END
448};
449
450static struct rcg_clk usb30_mock_utmi_clk_src = {
451 .cmd_reg = (uint32_t *) USB30_MOCK_UTMI_CMD_RCGR,
452 .cfg_reg = (uint32_t *) USB30_MOCK_UTMI_CFG_RCGR,
453 .set_rate = clock_lib2_rcg_set_rate_hid,
454 .freq_tbl = ftbl_gcc_usb30_mock_utmi_clk_src,
455 .current_freq = &rcg_dummy_freq,
456
457 .c = {
458 .dbg_name = "usb30_mock_utmi_clk_src",
459 .ops = &clk_ops_rcg,
460 },
461};
462
463static struct branch_clk gcc_usb30_mock_utmi_clk = {
464 .cbcr_reg = (uint32_t *) USB30_MOCK_UTMI_CBCR,
465 .has_sibling = 0,
466 .parent = &usb30_mock_utmi_clk_src.c,
467
468 .c = {
469 .dbg_name = "usb30_mock_utmi_clk",
470 .ops = &clk_ops_branch,
471 },
472};
473
474static struct branch_clk gcc_usb30_sleep_clk = {
475 .cbcr_reg = (uint32_t *) USB30_SLEEP_CBCR,
476 .has_sibling = 1,
477
478 .c = {
479 .dbg_name = "usb30_sleep_clk",
480 .ops = &clk_ops_branch,
481 },
482};
483
484static struct clk_freq_tbl ftbl_gcc_usb30_phy_aux_clk_src[] = {
485 F( 1200000, cxo, 16, 0, 0),
486 F_END
487};
488
489static struct rcg_clk usb30_phy_aux_clk_src = {
490 .cmd_reg = (uint32_t *) USB30_PHY_AUX_CMD_RCGR,
491 .cfg_reg = (uint32_t *) USB30_PHY_AUX_CFG_RCGR,
492 .set_rate = clock_lib2_rcg_set_rate_hid,
493 .freq_tbl = ftbl_gcc_usb30_phy_aux_clk_src,
494 .current_freq = &rcg_dummy_freq,
495
496 .c = {
497 .dbg_name = "usb30_phy_aux_clk_src",
498 .ops = &clk_ops_rcg,
499 },
500};
501
502static struct branch_clk gcc_usb30_phy_aux_clk = {
503 .cbcr_reg = (uint32_t *)USB30_PHY_AUX_CBCR,
504 .has_sibling = 0,
505 .parent = &usb30_phy_aux_clk_src.c,
506
507 .c = {
508 .dbg_name = "usb30_phy_aux_clk",
509 .ops = &clk_ops_branch,
510 },
511};
512
513static struct branch_clk gcc_usb30_pipe_clk = {
514 .bcr_reg = (uint32_t *) USB30PHY_PHY_BCR,
515 .cbcr_reg = (uint32_t *) USB30_PHY_PIPE_CBCR,
516 .has_sibling = 1,
517
518 .c = {
519 .dbg_name = "usb30_pipe_clk",
520 .ops = &clk_ops_branch,
521 },
522};
523
524static struct reset_clk gcc_usb30_phy_reset = {
Channagoud Kadabi3c2be1c2014-06-01 18:59:21 -0700525 .bcr_reg = (uint32_t )USB30_PHY_BCR,
Channagoud Kadabi3dcc4ed2014-04-10 14:59:41 -0700526
527 .c = {
528 .dbg_name = "usb30_phy_reset",
529 .ops = &clk_ops_rst,
530 },
531};
532
Channagoud Kadabi3c2be1c2014-06-01 18:59:21 -0700533static struct branch_clk gcc_usb_phy_cfg_ahb2phy_clk = {
534 .cbcr_reg = (uint32_t *)USB_PHY_CFG_AHB2PHY_CBCR,
535 .has_sibling = 1,
536
537 .c = {
538 .dbg_name = "usb_phy_cfg_ahb2phy_clk",
539 .ops = &clk_ops_branch,
540 },
541};
542
Channagoud Kadabib4c64b82014-07-24 17:18:46 -0700543/* Display clocks */
544static struct clk_freq_tbl ftbl_mdss_esc0_1_clk[] = {
545 F_MM(19200000, cxo, 1, 0, 0),
546 F_END
547};
548
549static struct clk_freq_tbl ftbl_mdss_esc1_1_clk[] = {
550 F_MM(19200000, cxo, 1, 0, 0),
551 F_END
552};
553
554static struct clk_freq_tbl ftbl_mmss_axi_clk[] = {
555 F_MM(19200000, cxo, 1, 0, 0),
556 F_MM(100000000, gpll0, 6, 0, 0),
557 F_END
558};
559
560static struct clk_freq_tbl ftbl_mdp_clk[] = {
561 F_MM( 75000000, gpll0, 8, 0, 0),
562 F_MM( 240000000, gpll0, 2.5, 0, 0),
563 F_END
564};
565
566static struct rcg_clk dsi_esc0_clk_src = {
567 .cmd_reg = (uint32_t *) DSI_ESC0_CMD_RCGR,
568 .cfg_reg = (uint32_t *) DSI_ESC0_CFG_RCGR,
569 .set_rate = clock_lib2_rcg_set_rate_hid,
570 .freq_tbl = ftbl_mdss_esc0_1_clk,
571
572 .c = {
573 .dbg_name = "dsi_esc0_clk_src",
574 .ops = &clk_ops_rcg,
575 },
576};
577
578static struct rcg_clk dsi_esc1_clk_src = {
579 .cmd_reg = (uint32_t *) DSI_ESC1_CMD_RCGR,
580 .cfg_reg = (uint32_t *) DSI_ESC1_CFG_RCGR,
581 .set_rate = clock_lib2_rcg_set_rate_hid,
582 .freq_tbl = ftbl_mdss_esc1_1_clk,
583
584 .c = {
585 .dbg_name = "dsi_esc1_clk_src",
586 .ops = &clk_ops_rcg,
587 },
588};
589
590static struct clk_freq_tbl ftbl_mdss_vsync_clk[] = {
591 F_MM(19200000, cxo, 1, 0, 0),
592 F_END
593};
594
595static struct rcg_clk vsync_clk_src = {
596 .cmd_reg = (uint32_t *) VSYNC_CMD_RCGR,
597 .cfg_reg = (uint32_t *) VSYNC_CFG_RCGR,
598 .set_rate = clock_lib2_rcg_set_rate_hid,
599 .freq_tbl = ftbl_mdss_vsync_clk,
600
601 .c = {
602 .dbg_name = "vsync_clk_src",
603 .ops = &clk_ops_rcg,
604 },
605};
606
607static struct rcg_clk mdp_axi_clk_src = {
608 .cmd_reg = (uint32_t *) MDP_AXI_CMD_RCGR,
609 .cfg_reg = (uint32_t *) MDP_AXI_CFG_RCGR,
610 .set_rate = clock_lib2_rcg_set_rate_hid,
611 .freq_tbl = ftbl_mmss_axi_clk,
612
613 .c = {
614 .dbg_name = "mdp_axi_clk_src",
615 .ops = &clk_ops_rcg,
616 },
617};
618
619static struct branch_clk mdss_esc0_clk = {
620 .cbcr_reg = (uint32_t *) DSI_ESC0_CBCR,
621 .parent = &dsi_esc0_clk_src.c,
622 .has_sibling = 0,
623
624 .c = {
625 .dbg_name = "mdss_esc0_clk",
626 .ops = &clk_ops_branch,
627 },
628};
629
630static struct branch_clk mdss_esc1_clk = {
631 .cbcr_reg = (uint32_t *) DSI_ESC1_CBCR,
632 .parent = &dsi_esc1_clk_src.c,
633 .has_sibling = 0,
634
635 .c = {
636 .dbg_name = "mdss_esc1_clk",
637 .ops = &clk_ops_branch,
638 },
639};
640
641static struct branch_clk mdss_axi_clk = {
642 .cbcr_reg = (uint32_t *) MDP_AXI_CBCR,
643 .parent = &mdp_axi_clk_src.c,
644 .has_sibling = 0,
645
646 .c = {
647 .dbg_name = "mdss_axi_clk",
648 .ops = &clk_ops_branch,
649 },
650};
651
652static struct branch_clk mmss_mmssnoc_axi_clk = {
653 .cbcr_reg = (uint32_t *) MMSS_MMSSNOC_AXI_CBCR,
654 .parent = &mdp_axi_clk_src.c,
655 .has_sibling = 0,
656
657 .c = {
658 .dbg_name = "mmss_mmssnoc_axi_clk",
659 .ops = &clk_ops_branch,
660 },
661};
662
663static struct branch_clk mmss_s0_axi_clk = {
664 .cbcr_reg = (uint32_t *) MMSS_S0_AXI_CBCR,
665 .parent = &mdp_axi_clk_src.c,
666 .has_sibling = 0,
667
668 .c = {
669 .dbg_name = "mmss_s0_axi_clk",
670 .ops = &clk_ops_branch,
671 },
672};
673
674static struct branch_clk mdp_ahb_clk = {
675 .cbcr_reg = (uint32_t *) MDP_AHB_CBCR,
676 .has_sibling = 1,
677
678 .c = {
679 .dbg_name = "mdp_ahb_clk",
680 .ops = &clk_ops_branch,
681 },
682};
683
684static struct rcg_clk mdss_mdp_clk_src = {
685 .cmd_reg = (uint32_t *) MDP_CMD_RCGR,
686 .cfg_reg = (uint32_t *) MDP_CFG_RCGR,
687 .set_rate = clock_lib2_rcg_set_rate_hid,
688 .freq_tbl = ftbl_mdp_clk,
689 .current_freq = &rcg_dummy_freq,
690
691 .c = {
692 .dbg_name = "mdss_mdp_clk_src",
693 .ops = &clk_ops_rcg,
694 },
695};
696
697static struct branch_clk mdss_mdp_clk = {
698 .cbcr_reg = (uint32_t *) MDP_CBCR,
699 .parent = &mdss_mdp_clk_src.c,
700 .has_sibling = 1,
701
702 .c = {
703 .dbg_name = "mdss_mdp_clk",
704 .ops = &clk_ops_branch,
705 },
706};
707
708static struct branch_clk mdss_mdp_lut_clk = {
709 .cbcr_reg = MDP_LUT_CBCR,
710 .parent = &mdss_mdp_clk_src.c,
711 .has_sibling = 1,
712
713 .c = {
714 .dbg_name = "mdss_mdp_lut_clk",
715 .ops = &clk_ops_branch,
716 },
717};
718
719static struct branch_clk mdss_vsync_clk = {
720 .cbcr_reg = MDSS_VSYNC_CBCR,
721 .parent = &vsync_clk_src.c,
722 .has_sibling = 0,
723
724 .c = {
725 .dbg_name = "mdss_vsync_clk",
726 .ops = &clk_ops_branch,
727 },
728};
729
730static struct clk_freq_tbl ftbl_mdss_edpaux_clk[] = {
731 F_MM(19200000, cxo, 1, 0, 0),
732 F_END
733};
734
735static struct rcg_clk edpaux_clk_src = {
736 .cmd_reg = (uint32_t *) EDPAUX_CMD_RCGR,
737 .set_rate = clock_lib2_rcg_set_rate_hid,
738 .freq_tbl = ftbl_mdss_edpaux_clk,
739
740 .c = {
741 .dbg_name = "edpaux_clk_src",
742 .ops = &clk_ops_rcg,
743 },
744};
745
746static struct branch_clk mdss_edpaux_clk = {
747 .cbcr_reg = MDSS_EDPAUX_CBCR,
748 .parent = &edpaux_clk_src.c,
749 .has_sibling = 0,
750
751 .c = {
752 .dbg_name = "mdss_edpaux_clk",
753 .ops = &clk_ops_branch,
754 },
755};
756
757static struct clk_freq_tbl ftbl_mdss_edplink_clk[] = {
758 F_MDSS(162000000, edppll_270, 2, 0, 0),
759 F_MDSS(270000000, edppll_270, 11, 0, 0),
760 F_END
761};
762
763static struct rcg_clk edplink_clk_src = {
764 .cmd_reg = (uint32_t *)EDPLINK_CMD_RCGR,
765 .set_rate = clock_lib2_rcg_set_rate_hid,
766 .freq_tbl = ftbl_mdss_edplink_clk,
767 .current_freq = &rcg_dummy_freq,
768 .c = {
769 .dbg_name = "edplink_clk_src",
770 .ops = &clk_ops_rcg,
771 },
772};
773
774static struct clk_freq_tbl ftbl_mdss_edppixel_clk[] = {
775 F_MDSS(138500000, edppll_350, 2, 0, 0),
776 F_MDSS(350000000, edppll_350, 11, 0, 0),
777 F_END
778};
779
780static struct rcg_clk edppixel_clk_src = {
781 .cmd_reg = (uint32_t *)EDPPIXEL_CMD_RCGR,
782 .set_rate = clock_lib2_rcg_set_rate_mnd,
783 .freq_tbl = ftbl_mdss_edppixel_clk,
784 .current_freq = &rcg_dummy_freq,
785 .c = {
786 .dbg_name = "edppixel_clk_src",
787 .ops = &clk_ops_rcg_mnd,
788 },
789};
790
791static struct branch_clk mdss_edplink_clk = {
792 .cbcr_reg = (uint32_t *)MDSS_EDPLINK_CBCR,
793 .has_sibling = 0,
794 .parent = &edplink_clk_src.c,
795 .c = {
796 .dbg_name = "mdss_edplink_clk",
797 .ops = &clk_ops_branch,
798 },
799};
800
801static struct branch_clk mdss_edppixel_clk = {
802 .cbcr_reg = (uint32_t *)MDSS_EDPPIXEL_CBCR,
803 .has_sibling = 0,
804 .parent = &edppixel_clk_src.c,
805 .c = {
806 .dbg_name = "mdss_edppixel_clk",
807 .ops = &clk_ops_branch,
808 },
809};
Channagoud Kadabi3c2be1c2014-06-01 18:59:21 -0700810
Channagoud Kadabi123c9722014-02-06 13:22:50 -0800811/* Clock lookup table */
Channagoud Kadabi608b6a72014-04-14 13:58:03 -0700812static struct clk_lookup msm_8994_clocks[] =
Channagoud Kadabi123c9722014-02-06 13:22:50 -0800813{
814 CLK_LOOKUP("sdc1_iface_clk", gcc_sdcc1_ahb_clk.c),
815 CLK_LOOKUP("sdc1_core_clk", gcc_sdcc1_apps_clk.c),
816
Channagoud Kadabie804d642014-08-20 17:43:57 -0700817 CLK_LOOKUP("sdc2_iface_clk", gcc_sdcc2_ahb_clk.c),
818 CLK_LOOKUP("sdc2_core_clk", gcc_sdcc2_apps_clk.c),
819
Channagoud Kadabi123c9722014-02-06 13:22:50 -0800820 CLK_LOOKUP("uart2_iface_clk", gcc_blsp1_ahb_clk.c),
821 CLK_LOOKUP("uart2_core_clk", gcc_blsp1_uart2_apps_clk.c),
822
823 CLK_LOOKUP("usb_iface_clk", gcc_usb_hs_ahb_clk.c),
824 CLK_LOOKUP("usb_core_clk", gcc_usb_hs_system_clk.c),
Channagoud Kadabi3dcc4ed2014-04-10 14:59:41 -0700825
826 /* USB30 clocks */
827 CLK_LOOKUP("usb2b_phy_sleep_clk", gcc_usb2b_phy_sleep_clk.c),
828 CLK_LOOKUP("usb30_master_clk", gcc_usb30_master_clk.c),
Channagoud Kadabi3c2be1c2014-06-01 18:59:21 -0700829 CLK_LOOKUP("usb30_iface_clk", gcc_sys_noc_usb30_axi_clk.c),
Channagoud Kadabi3dcc4ed2014-04-10 14:59:41 -0700830 CLK_LOOKUP("usb30_mock_utmi_clk", gcc_usb30_mock_utmi_clk.c),
831 CLK_LOOKUP("usb30_sleep_clk", gcc_usb30_sleep_clk.c),
832 CLK_LOOKUP("usb30_phy_aux_clk", gcc_usb30_phy_aux_clk.c),
833 CLK_LOOKUP("usb30_pipe_clk", gcc_usb30_pipe_clk.c),
834 CLK_LOOKUP("usb30_phy_reset", gcc_usb30_phy_reset.c),
Channagoud Kadabi3c2be1c2014-06-01 18:59:21 -0700835
836 CLK_LOOKUP("usb_phy_cfg_ahb2phy_clk", gcc_usb_phy_cfg_ahb2phy_clk.c),
Channagoud Kadabib4c64b82014-07-24 17:18:46 -0700837
838 /* mdss clocks */
839 CLK_LOOKUP("mdp_ahb_clk", mdp_ahb_clk.c),
840 CLK_LOOKUP("mdss_esc0_clk", mdss_esc0_clk.c),
841 CLK_LOOKUP("mdss_esc1_clk", mdss_esc1_clk.c),
842 CLK_LOOKUP("mdss_axi_clk", mdss_axi_clk.c),
843 CLK_LOOKUP("mmss_mmssnoc_axi_clk", mmss_mmssnoc_axi_clk.c),
844 CLK_LOOKUP("mmss_s0_axi_clk", mmss_s0_axi_clk.c),
845 CLK_LOOKUP("mdss_vsync_clk", mdss_vsync_clk.c),
846 CLK_LOOKUP("mdss_mdp_clk_src", mdss_mdp_clk_src.c),
847 CLK_LOOKUP("mdss_mdp_clk", mdss_mdp_clk.c),
848 CLK_LOOKUP("mdss_mdp_lut_clk", mdss_mdp_lut_clk.c),
849
850 CLK_LOOKUP("edp_pixel_clk", mdss_edppixel_clk.c),
851 CLK_LOOKUP("edp_link_clk", mdss_edplink_clk.c),
852 CLK_LOOKUP("edp_aux_clk", mdss_edpaux_clk.c),
Channagoud Kadabi123c9722014-02-06 13:22:50 -0800853};
854
855void platform_clock_init(void)
856{
Channagoud Kadabi608b6a72014-04-14 13:58:03 -0700857 clk_init(msm_8994_clocks, ARRAY_SIZE(msm_8994_clocks));
Channagoud Kadabi123c9722014-02-06 13:22:50 -0800858}