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