blob: 5ee2d5cc4a5fdb382cf1d56f83ecf16d4d05de6f [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),
Siddhartha Agrawale24a18a2014-10-13 17:07:43 -0700557 F_MM(300000000, gpll0, 2, 0, 0),
Channagoud Kadabib4c64b82014-07-24 17:18:46 -0700558 F_END
559};
560
561static struct clk_freq_tbl ftbl_mdp_clk[] = {
562 F_MM( 75000000, gpll0, 8, 0, 0),
563 F_MM( 240000000, gpll0, 2.5, 0, 0),
Siddhartha Agrawale24a18a2014-10-13 17:07:43 -0700564 F_MM(300000000, gpll0, 2, 0, 0),
Channagoud Kadabib4c64b82014-07-24 17:18:46 -0700565 F_END
566};
567
568static struct rcg_clk dsi_esc0_clk_src = {
569 .cmd_reg = (uint32_t *) DSI_ESC0_CMD_RCGR,
570 .cfg_reg = (uint32_t *) DSI_ESC0_CFG_RCGR,
571 .set_rate = clock_lib2_rcg_set_rate_hid,
572 .freq_tbl = ftbl_mdss_esc0_1_clk,
573
574 .c = {
575 .dbg_name = "dsi_esc0_clk_src",
576 .ops = &clk_ops_rcg,
577 },
578};
579
580static struct rcg_clk dsi_esc1_clk_src = {
581 .cmd_reg = (uint32_t *) DSI_ESC1_CMD_RCGR,
582 .cfg_reg = (uint32_t *) DSI_ESC1_CFG_RCGR,
583 .set_rate = clock_lib2_rcg_set_rate_hid,
584 .freq_tbl = ftbl_mdss_esc1_1_clk,
585
586 .c = {
587 .dbg_name = "dsi_esc1_clk_src",
588 .ops = &clk_ops_rcg,
589 },
590};
591
592static struct clk_freq_tbl ftbl_mdss_vsync_clk[] = {
593 F_MM(19200000, cxo, 1, 0, 0),
594 F_END
595};
596
597static struct rcg_clk vsync_clk_src = {
598 .cmd_reg = (uint32_t *) VSYNC_CMD_RCGR,
599 .cfg_reg = (uint32_t *) VSYNC_CFG_RCGR,
600 .set_rate = clock_lib2_rcg_set_rate_hid,
601 .freq_tbl = ftbl_mdss_vsync_clk,
602
603 .c = {
604 .dbg_name = "vsync_clk_src",
605 .ops = &clk_ops_rcg,
606 },
607};
608
609static struct rcg_clk mdp_axi_clk_src = {
610 .cmd_reg = (uint32_t *) MDP_AXI_CMD_RCGR,
611 .cfg_reg = (uint32_t *) MDP_AXI_CFG_RCGR,
612 .set_rate = clock_lib2_rcg_set_rate_hid,
613 .freq_tbl = ftbl_mmss_axi_clk,
614
615 .c = {
616 .dbg_name = "mdp_axi_clk_src",
617 .ops = &clk_ops_rcg,
618 },
619};
620
621static struct branch_clk mdss_esc0_clk = {
622 .cbcr_reg = (uint32_t *) DSI_ESC0_CBCR,
623 .parent = &dsi_esc0_clk_src.c,
624 .has_sibling = 0,
625
626 .c = {
627 .dbg_name = "mdss_esc0_clk",
628 .ops = &clk_ops_branch,
629 },
630};
631
632static struct branch_clk mdss_esc1_clk = {
633 .cbcr_reg = (uint32_t *) DSI_ESC1_CBCR,
634 .parent = &dsi_esc1_clk_src.c,
635 .has_sibling = 0,
636
637 .c = {
638 .dbg_name = "mdss_esc1_clk",
639 .ops = &clk_ops_branch,
640 },
641};
642
643static struct branch_clk mdss_axi_clk = {
644 .cbcr_reg = (uint32_t *) MDP_AXI_CBCR,
645 .parent = &mdp_axi_clk_src.c,
646 .has_sibling = 0,
647
648 .c = {
649 .dbg_name = "mdss_axi_clk",
650 .ops = &clk_ops_branch,
651 },
652};
653
654static struct branch_clk mmss_mmssnoc_axi_clk = {
655 .cbcr_reg = (uint32_t *) MMSS_MMSSNOC_AXI_CBCR,
656 .parent = &mdp_axi_clk_src.c,
657 .has_sibling = 0,
658
659 .c = {
660 .dbg_name = "mmss_mmssnoc_axi_clk",
661 .ops = &clk_ops_branch,
662 },
663};
664
665static struct branch_clk mmss_s0_axi_clk = {
666 .cbcr_reg = (uint32_t *) MMSS_S0_AXI_CBCR,
667 .parent = &mdp_axi_clk_src.c,
668 .has_sibling = 0,
669
670 .c = {
671 .dbg_name = "mmss_s0_axi_clk",
672 .ops = &clk_ops_branch,
673 },
674};
675
676static struct branch_clk mdp_ahb_clk = {
677 .cbcr_reg = (uint32_t *) MDP_AHB_CBCR,
678 .has_sibling = 1,
679
680 .c = {
681 .dbg_name = "mdp_ahb_clk",
682 .ops = &clk_ops_branch,
683 },
684};
685
686static struct rcg_clk mdss_mdp_clk_src = {
687 .cmd_reg = (uint32_t *) MDP_CMD_RCGR,
688 .cfg_reg = (uint32_t *) MDP_CFG_RCGR,
689 .set_rate = clock_lib2_rcg_set_rate_hid,
690 .freq_tbl = ftbl_mdp_clk,
691 .current_freq = &rcg_dummy_freq,
692
693 .c = {
694 .dbg_name = "mdss_mdp_clk_src",
695 .ops = &clk_ops_rcg,
696 },
697};
698
699static struct branch_clk mdss_mdp_clk = {
700 .cbcr_reg = (uint32_t *) MDP_CBCR,
701 .parent = &mdss_mdp_clk_src.c,
702 .has_sibling = 1,
703
704 .c = {
705 .dbg_name = "mdss_mdp_clk",
706 .ops = &clk_ops_branch,
707 },
708};
709
710static struct branch_clk mdss_mdp_lut_clk = {
711 .cbcr_reg = MDP_LUT_CBCR,
712 .parent = &mdss_mdp_clk_src.c,
713 .has_sibling = 1,
714
715 .c = {
716 .dbg_name = "mdss_mdp_lut_clk",
717 .ops = &clk_ops_branch,
718 },
719};
720
721static struct branch_clk mdss_vsync_clk = {
722 .cbcr_reg = MDSS_VSYNC_CBCR,
723 .parent = &vsync_clk_src.c,
724 .has_sibling = 0,
725
726 .c = {
727 .dbg_name = "mdss_vsync_clk",
728 .ops = &clk_ops_branch,
729 },
730};
731
732static struct clk_freq_tbl ftbl_mdss_edpaux_clk[] = {
733 F_MM(19200000, cxo, 1, 0, 0),
734 F_END
735};
736
737static struct rcg_clk edpaux_clk_src = {
738 .cmd_reg = (uint32_t *) EDPAUX_CMD_RCGR,
739 .set_rate = clock_lib2_rcg_set_rate_hid,
740 .freq_tbl = ftbl_mdss_edpaux_clk,
741
742 .c = {
743 .dbg_name = "edpaux_clk_src",
744 .ops = &clk_ops_rcg,
745 },
746};
747
748static struct branch_clk mdss_edpaux_clk = {
749 .cbcr_reg = MDSS_EDPAUX_CBCR,
750 .parent = &edpaux_clk_src.c,
751 .has_sibling = 0,
752
753 .c = {
754 .dbg_name = "mdss_edpaux_clk",
755 .ops = &clk_ops_branch,
756 },
757};
758
759static struct clk_freq_tbl ftbl_mdss_edplink_clk[] = {
760 F_MDSS(162000000, edppll_270, 2, 0, 0),
761 F_MDSS(270000000, edppll_270, 11, 0, 0),
762 F_END
763};
764
765static struct rcg_clk edplink_clk_src = {
766 .cmd_reg = (uint32_t *)EDPLINK_CMD_RCGR,
767 .set_rate = clock_lib2_rcg_set_rate_hid,
768 .freq_tbl = ftbl_mdss_edplink_clk,
769 .current_freq = &rcg_dummy_freq,
770 .c = {
771 .dbg_name = "edplink_clk_src",
772 .ops = &clk_ops_rcg,
773 },
774};
775
776static struct clk_freq_tbl ftbl_mdss_edppixel_clk[] = {
777 F_MDSS(138500000, edppll_350, 2, 0, 0),
778 F_MDSS(350000000, edppll_350, 11, 0, 0),
779 F_END
780};
781
782static struct rcg_clk edppixel_clk_src = {
783 .cmd_reg = (uint32_t *)EDPPIXEL_CMD_RCGR,
784 .set_rate = clock_lib2_rcg_set_rate_mnd,
785 .freq_tbl = ftbl_mdss_edppixel_clk,
786 .current_freq = &rcg_dummy_freq,
787 .c = {
788 .dbg_name = "edppixel_clk_src",
789 .ops = &clk_ops_rcg_mnd,
790 },
791};
792
793static struct branch_clk mdss_edplink_clk = {
794 .cbcr_reg = (uint32_t *)MDSS_EDPLINK_CBCR,
795 .has_sibling = 0,
796 .parent = &edplink_clk_src.c,
797 .c = {
798 .dbg_name = "mdss_edplink_clk",
799 .ops = &clk_ops_branch,
800 },
801};
802
803static struct branch_clk mdss_edppixel_clk = {
804 .cbcr_reg = (uint32_t *)MDSS_EDPPIXEL_CBCR,
805 .has_sibling = 0,
806 .parent = &edppixel_clk_src.c,
807 .c = {
808 .dbg_name = "mdss_edppixel_clk",
809 .ops = &clk_ops_branch,
810 },
811};
Channagoud Kadabi3c2be1c2014-06-01 18:59:21 -0700812
Channagoud Kadabi5f42b272014-08-21 18:40:39 -0700813static struct branch_clk mmss_misc_ahb_clk = {
814 .cbcr_reg = MMSS_MISC_AHB_CBCR,
815 .has_sibling = 1,
816
817 .c = {
818 .dbg_name = "mmss_misc_ahb_clk",
819 .ops = &clk_ops_branch,
820 },
821};
822
Channagoud Kadabi123c9722014-02-06 13:22:50 -0800823/* Clock lookup table */
Channagoud Kadabi608b6a72014-04-14 13:58:03 -0700824static struct clk_lookup msm_8994_clocks[] =
Channagoud Kadabi123c9722014-02-06 13:22:50 -0800825{
826 CLK_LOOKUP("sdc1_iface_clk", gcc_sdcc1_ahb_clk.c),
827 CLK_LOOKUP("sdc1_core_clk", gcc_sdcc1_apps_clk.c),
828
Channagoud Kadabie804d642014-08-20 17:43:57 -0700829 CLK_LOOKUP("sdc2_iface_clk", gcc_sdcc2_ahb_clk.c),
830 CLK_LOOKUP("sdc2_core_clk", gcc_sdcc2_apps_clk.c),
831
Channagoud Kadabi123c9722014-02-06 13:22:50 -0800832 CLK_LOOKUP("uart2_iface_clk", gcc_blsp1_ahb_clk.c),
833 CLK_LOOKUP("uart2_core_clk", gcc_blsp1_uart2_apps_clk.c),
834
835 CLK_LOOKUP("usb_iface_clk", gcc_usb_hs_ahb_clk.c),
836 CLK_LOOKUP("usb_core_clk", gcc_usb_hs_system_clk.c),
Channagoud Kadabi3dcc4ed2014-04-10 14:59:41 -0700837
838 /* USB30 clocks */
839 CLK_LOOKUP("usb2b_phy_sleep_clk", gcc_usb2b_phy_sleep_clk.c),
840 CLK_LOOKUP("usb30_master_clk", gcc_usb30_master_clk.c),
Channagoud Kadabi3c2be1c2014-06-01 18:59:21 -0700841 CLK_LOOKUP("usb30_iface_clk", gcc_sys_noc_usb30_axi_clk.c),
Channagoud Kadabi3dcc4ed2014-04-10 14:59:41 -0700842 CLK_LOOKUP("usb30_mock_utmi_clk", gcc_usb30_mock_utmi_clk.c),
843 CLK_LOOKUP("usb30_sleep_clk", gcc_usb30_sleep_clk.c),
844 CLK_LOOKUP("usb30_phy_aux_clk", gcc_usb30_phy_aux_clk.c),
845 CLK_LOOKUP("usb30_pipe_clk", gcc_usb30_pipe_clk.c),
846 CLK_LOOKUP("usb30_phy_reset", gcc_usb30_phy_reset.c),
Channagoud Kadabi3c2be1c2014-06-01 18:59:21 -0700847
848 CLK_LOOKUP("usb_phy_cfg_ahb2phy_clk", gcc_usb_phy_cfg_ahb2phy_clk.c),
Channagoud Kadabib4c64b82014-07-24 17:18:46 -0700849
850 /* mdss clocks */
851 CLK_LOOKUP("mdp_ahb_clk", mdp_ahb_clk.c),
852 CLK_LOOKUP("mdss_esc0_clk", mdss_esc0_clk.c),
853 CLK_LOOKUP("mdss_esc1_clk", mdss_esc1_clk.c),
854 CLK_LOOKUP("mdss_axi_clk", mdss_axi_clk.c),
855 CLK_LOOKUP("mmss_mmssnoc_axi_clk", mmss_mmssnoc_axi_clk.c),
856 CLK_LOOKUP("mmss_s0_axi_clk", mmss_s0_axi_clk.c),
857 CLK_LOOKUP("mdss_vsync_clk", mdss_vsync_clk.c),
858 CLK_LOOKUP("mdss_mdp_clk_src", mdss_mdp_clk_src.c),
859 CLK_LOOKUP("mdss_mdp_clk", mdss_mdp_clk.c),
860 CLK_LOOKUP("mdss_mdp_lut_clk", mdss_mdp_lut_clk.c),
Channagoud Kadabi5f42b272014-08-21 18:40:39 -0700861 CLK_LOOKUP("mmss_misc_ahb_clk", mmss_misc_ahb_clk.c),
Channagoud Kadabib4c64b82014-07-24 17:18:46 -0700862
863 CLK_LOOKUP("edp_pixel_clk", mdss_edppixel_clk.c),
864 CLK_LOOKUP("edp_link_clk", mdss_edplink_clk.c),
865 CLK_LOOKUP("edp_aux_clk", mdss_edpaux_clk.c),
Channagoud Kadabi123c9722014-02-06 13:22:50 -0800866};
867
868void platform_clock_init(void)
869{
Channagoud Kadabi608b6a72014-04-14 13:58:03 -0700870 clk_init(msm_8994_clocks, ARRAY_SIZE(msm_8994_clocks));
Channagoud Kadabi123c9722014-02-06 13:22:50 -0800871}