blob: 31aa04775acbf1531999b0dcd9096711f8b5074d [file] [log] [blame]
Ajay Singh Parmard4760c12015-02-13 17:13:38 -08001/* Copyright (c) 2014-2016, The Linux Foundation. All rights reserved.
Channagoud Kadabied60a8b2014-06-27 15:35:09 -07002 *
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>
Channagoud Kadabidd7cb382015-03-23 23:30:25 -070034#include <clock_alpha_pll.h>
Channagoud Kadabied60a8b2014-06-27 15:35:09 -070035#include <clock_lib2.h>
36#include <platform/clock.h>
37#include <platform/iomap.h>
38
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
Tatenda Chipeperekwa8366d9e2015-12-04 15:45:23 -080049#define hdmipll_mm_source_val 1
Channagoud Kadabied60a8b2014-06-27 15:35:09 -070050
51struct clk_freq_tbl rcg_dummy_freq = F_END;
52
53
54/* Clock Operations */
55static struct clk_ops clk_ops_rst =
56{
57 .reset = clock_lib2_reset_clk_reset,
58};
59
60static 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,
65 .reset = clock_lib2_branch_clk_reset,
66};
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
Channagoud Kadabidd7cb382015-03-23 23:30:25 -0700100static struct clk_ops clk_ops_fixed_alpha_pll =
101{
102 .enable = alpha_pll_enable,
103 .disable = alpha_pll_disable,
104};
105
Channagoud Kadabied60a8b2014-06-27 15:35:09 -0700106/* Clock Sources */
107static struct fixed_clk cxo_clk_src =
108{
109 .c = {
110 .rate = 19200000,
111 .dbg_name = "cxo_clk_src",
112 .ops = &clk_ops_cxo,
113 },
114};
115
116static struct pll_vote_clk gpll0_clk_src =
117{
118 .en_reg = (void *) APCS_GPLL_ENA_VOTE,
119 .en_mask = BIT(0),
120 .status_reg = (void *) GPLL0_MODE,
121 .status_mask = BIT(30),
122 .parent = &cxo_clk_src.c,
123
124 .c = {
125 .rate = 600000000,
126 .dbg_name = "gpll0_clk_src",
127 .ops = &clk_ops_pll_vote,
128 },
129};
130
131static struct pll_vote_clk gpll4_clk_src =
132{
133 .en_reg = (void *) APCS_GPLL_ENA_VOTE,
134 .en_mask = BIT(4),
135 .status_reg = (void *) GPLL4_MODE,
136 .status_mask = BIT(30),
137 .parent = &cxo_clk_src.c,
138
139 .c = {
140 .rate = 1600000000,
141 .dbg_name = "gpll4_clk_src",
142 .ops = &clk_ops_pll_vote,
143 },
144};
145
Dhaval Patel0f3cbeb2015-03-17 11:52:12 -0700146static struct alpha_pll_masks pll_masks_p = {
147 .lock_mask = BIT(31),
148 .active_mask = BIT(30),
149 .vco_mask = BM(21, 20) >> 20,
150 .vco_shift = 20,
151 .alpha_en_mask = BIT(24),
152 .output_mask = 0xf,
153};
154
155static struct alpha_pll_vco_tbl mmpll_p_vco[] = {
156 VCO(3, 250000000, 500000000),
157 VCO(2, 500000000, 1000000000),
158 VCO(1, 1000000000, 1500000000),
159 VCO(0, 1500000000, 2000000000),
160};
161
162static struct alpha_pll_clk mmpll0_clk_src = {
163 .masks = &pll_masks_p,
164 .base = (uint32_t )MSM_MMSS_CLK_CTL_BASE,
165 .offset = 0x0,
166 .vco_tbl = mmpll_p_vco,
167 .vco_num = ARRAY_SIZE(mmpll_p_vco),
168 .fsm_reg_offset = 0x0100,
169 .fsm_en_mask = BIT(0),
170 .enable_config = 0x1,
171 .parent = &cxo_clk_src.c,
172 .inited = false,
173 .c = {
174 .rate = 800000000,
175 .dbg_name = "mmpll0_clk_src",
176 .ops = &clk_ops_fixed_alpha_pll,
177 },
178};
179
Channagoud Kadabied60a8b2014-06-27 15:35:09 -0700180/* UART Clocks */
181static struct clk_freq_tbl ftbl_gcc_blsp1_2_uart1_6_apps_clk[] =
182{
183 F( 3686400, gpll0, 1, 96, 15625),
184 F( 7372800, gpll0, 1, 192, 15625),
185 F(14745600, gpll0, 1, 384, 15625),
186 F(16000000, gpll0, 5, 2, 15),
187 F(19200000, cxo, 1, 0, 0),
188 F(24000000, gpll0, 5, 1, 5),
189 F(32000000, gpll0, 1, 4, 75),
190 F(40000000, gpll0, 15, 0, 0),
191 F(46400000, gpll0, 1, 29, 375),
192 F(48000000, gpll0, 12.5, 0, 0),
193 F(51200000, gpll0, 1, 32, 375),
194 F(56000000, gpll0, 1, 7, 75),
195 F(58982400, gpll0, 1, 1536, 15625),
196 F(60000000, gpll0, 10, 0, 0),
197 F(63160000, gpll0, 9.5, 0, 0),
198 F_END
199};
200
Channagoud Kadabi35503c42014-11-14 16:22:43 -0800201static struct rcg_clk blsp2_uart2_apps_clk_src =
Channagoud Kadabied60a8b2014-06-27 15:35:09 -0700202{
Channagoud Kadabi35503c42014-11-14 16:22:43 -0800203 .cmd_reg = (uint32_t *) BLSP2_UART2_APPS_CMD_RCGR,
204 .cfg_reg = (uint32_t *) BLSP2_UART2_APPS_CFG_RCGR,
205 .m_reg = (uint32_t *) BLSP2_UART2_APPS_M,
206 .n_reg = (uint32_t *) BLSP2_UART2_APPS_N,
207 .d_reg = (uint32_t *) BLSP2_UART2_APPS_D,
Channagoud Kadabied60a8b2014-06-27 15:35:09 -0700208
209 .set_rate = clock_lib2_rcg_set_rate_mnd,
210 .freq_tbl = ftbl_gcc_blsp1_2_uart1_6_apps_clk,
211 .current_freq = &rcg_dummy_freq,
212
213 .c = {
Channagoud Kadabi35503c42014-11-14 16:22:43 -0800214 .dbg_name = "blsp2_uart2_apps_clk",
Channagoud Kadabied60a8b2014-06-27 15:35:09 -0700215 .ops = &clk_ops_rcg_mnd,
216 },
217};
218
Channagoud Kadabi35503c42014-11-14 16:22:43 -0800219static struct branch_clk gcc_blsp2_uart2_apps_clk =
Channagoud Kadabied60a8b2014-06-27 15:35:09 -0700220{
Channagoud Kadabi35503c42014-11-14 16:22:43 -0800221 .cbcr_reg = (uint32_t *) BLSP2_UART2_APPS_CBCR,
222 .parent = &blsp2_uart2_apps_clk_src.c,
Channagoud Kadabied60a8b2014-06-27 15:35:09 -0700223
224 .c = {
Channagoud Kadabi35503c42014-11-14 16:22:43 -0800225 .dbg_name = "gcc_blsp2_uart2_apps_clk",
Channagoud Kadabied60a8b2014-06-27 15:35:09 -0700226 .ops = &clk_ops_branch,
227 },
228};
229
Channagoud Kadabi99d23702015-02-02 20:52:17 -0800230static struct vote_clk gcc_blsp2_ahb_clk = {
231 .cbcr_reg = (uint32_t *) BLSP2_AHB_CBCR,
Channagoud Kadabied60a8b2014-06-27 15:35:09 -0700232 .vote_reg = (uint32_t *) APCS_CLOCK_BRANCH_ENA_VOTE,
Channagoud Kadabi99d23702015-02-02 20:52:17 -0800233 .en_mask = BIT(15),
Channagoud Kadabied60a8b2014-06-27 15:35:09 -0700234
235 .c = {
Channagoud Kadabi99d23702015-02-02 20:52:17 -0800236 .dbg_name = "gcc_blsp2_ahb_clk",
Channagoud Kadabied60a8b2014-06-27 15:35:09 -0700237 .ops = &clk_ops_vote,
238 },
239};
240
Siddharth Zaveri1cf08b92015-12-02 17:09:14 -0500241static struct clk_freq_tbl ftbl_gcc_blsp1_qup2_i2c_apps_clk_src[] = {
242 F( 96000, cxo, 10, 1, 2),
243 F( 4800000, cxo, 4, 0, 0),
244 F( 9600000, cxo, 2, 0, 0),
245 F( 16000000, gpll0, 10, 1, 5),
246 F( 19200000, gpll0, 1, 0, 0),
247 F( 25000000, gpll0, 16, 1, 2),
248 F( 50000000, gpll0, 16, 0, 0),
249 F_END
250};
251
252static struct rcg_clk gcc_blsp2_qup2_i2c_apps_clk_src = {
253 .cmd_reg = (uint32_t *) GCC_BLSP2_QUP2_CMD_RCGR,
254 .cfg_reg = (uint32_t *) GCC_BLSP2_QUP2_CFG_RCGR,
255 .set_rate = clock_lib2_rcg_set_rate_hid,
256 .freq_tbl = ftbl_gcc_blsp1_qup2_i2c_apps_clk_src,
257 .current_freq = &rcg_dummy_freq,
258
259 .c = {
260 .dbg_name = "gcc_blsp2_qup2_i2c_apps_clk_src",
261 .ops = &clk_ops_rcg,
262 },
263};
264
265static struct branch_clk gcc_blsp2_qup2_i2c_apps_clk = {
266 .cbcr_reg = (uint32_t *) GCC_BLSP2_QUP2_APPS_CBCR,
267 .parent = &gcc_blsp2_qup2_i2c_apps_clk_src.c,
268
269 .c = {
270 .dbg_name = "gcc_blsp2_qup2_i2c_apps_clk",
271 .ops = &clk_ops_branch,
272 },
273};
274
Channagoud Kadabied60a8b2014-06-27 15:35:09 -0700275/* SDCC Clocks */
276static struct clk_freq_tbl ftbl_gcc_sdcc1_4_apps_clk[] =
277{
278 F( 144000, cxo, 16, 3, 25),
279 F( 400000, cxo, 12, 1, 4),
280 F( 20000000, gpll0, 15, 1, 2),
281 F( 25000000, gpll0, 12, 1, 2),
282 F( 50000000, gpll0, 12, 0, 0),
Channagoud Kadabi99d23702015-02-02 20:52:17 -0800283 F( 96000000, gpll4, 4, 0, 0),
284 F(192000000, gpll4, 2, 0, 0),
285 F(384000000, gpll4, 1, 0, 0),
Channagoud Kadabied60a8b2014-06-27 15:35:09 -0700286 F_END
287};
288
Tanya Finkel619fc2a2016-08-16 14:11:26 +0300289static struct clk_freq_tbl ftbl_gcc_sdcc2_4_apps_clk[] =
290{
291 F( 144000, cxo, 16, 3, 25),
292 F( 400000, cxo, 12, 1, 4),
293 F( 20000000, gpll0, 15, 1, 2),
294 F( 25000000, gpll0, 12, 1, 2),
295 F( 50000000, gpll0, 12, 0, 0),
296 F(100000000, gpll0, 6, 0, 0),
297 F(200000000, gpll0, 3, 0, 0),
298 F_END
299};
300
301
Channagoud Kadabied60a8b2014-06-27 15:35:09 -0700302static struct rcg_clk sdcc1_apps_clk_src =
303{
304 .cmd_reg = (uint32_t *) SDCC1_CMD_RCGR,
305 .cfg_reg = (uint32_t *) SDCC1_CFG_RCGR,
306 .m_reg = (uint32_t *) SDCC1_M,
307 .n_reg = (uint32_t *) SDCC1_N,
308 .d_reg = (uint32_t *) SDCC1_D,
309
310 .set_rate = clock_lib2_rcg_set_rate_mnd,
311 .freq_tbl = ftbl_gcc_sdcc1_4_apps_clk,
312 .current_freq = &rcg_dummy_freq,
313
314 .c = {
315 .dbg_name = "sdc1_clk",
316 .ops = &clk_ops_rcg_mnd,
317 },
318};
319
320static struct branch_clk gcc_sdcc1_apps_clk =
321{
322 .cbcr_reg = (uint32_t *) SDCC1_APPS_CBCR,
323 .parent = &sdcc1_apps_clk_src.c,
324
325 .c = {
326 .dbg_name = "gcc_sdcc1_apps_clk",
327 .ops = &clk_ops_branch,
328 },
329};
330
331static struct branch_clk gcc_sdcc1_ahb_clk =
332{
333 .cbcr_reg = (uint32_t *) SDCC1_AHB_CBCR,
334 .has_sibling = 1,
335
336 .c = {
337 .dbg_name = "gcc_sdcc1_ahb_clk",
338 .ops = &clk_ops_branch,
339 },
340};
341
Tanya Finkel619fc2a2016-08-16 14:11:26 +0300342static struct rcg_clk sdcc2_apps_clk_src =
343{
344 .cmd_reg = (uint32_t *) SDCC2_CMD_RCGR,
345 .cfg_reg = (uint32_t *) SDCC2_CFG_RCGR,
346 .m_reg = (uint32_t *) SDCC2_M,
347 .n_reg = (uint32_t *) SDCC2_N,
348 .d_reg = (uint32_t *) SDCC2_D,
349
350 .set_rate = clock_lib2_rcg_set_rate_mnd,
351 .freq_tbl = ftbl_gcc_sdcc2_4_apps_clk,
352 .current_freq = &rcg_dummy_freq,
353
354 .c = {
355 .dbg_name = "sdc2_clk",
356 .ops = &clk_ops_rcg_mnd,
357 },
358};
359
360static struct branch_clk gcc_sdcc2_apps_clk =
361{
362 .cbcr_reg = (uint32_t *) SDCC2_APPS_CBCR,
363 .parent = &sdcc2_apps_clk_src.c,
364
365 .c = {
366 .dbg_name = "gcc_sdcc2_apps_clk",
367 .ops = &clk_ops_branch,
368 },
369};
370
371static struct branch_clk gcc_sdcc2_ahb_clk =
372{
373 .cbcr_reg = (uint32_t *) SDCC2_AHB_CBCR,
374 .has_sibling = 1,
375
376 .c = {
377 .dbg_name = "gcc_sdcc2_ahb_clk",
378 .ops = &clk_ops_branch,
379 },
380};
381
382
Channagoud Kadabied60a8b2014-06-27 15:35:09 -0700383static struct branch_clk gcc_sys_noc_usb30_axi_clk = {
384 .cbcr_reg = (uint32_t *) SYS_NOC_USB3_AXI_CBCR,
385 .has_sibling = 1,
386
387 .c = {
388 .dbg_name = "sys_noc_usb30_axi_clk",
389 .ops = &clk_ops_branch,
390 },
391};
392
Tanya Finkel0df43632016-05-31 13:02:35 +0300393static struct branch_clk gcc_periph_noc_usb20_ahb_clk = {
394 .cbcr_reg = (uint32_t *) PERIPH_NOC_USB20_AHB_CBCR,
395 .has_sibling = 1,
396
397 .c = {
398 .dbg_name = "periph_noc_usb20_ahb_clk",
399 .ops = &clk_ops_branch,
400 },
401};
402
Channagoud Kadabied60a8b2014-06-27 15:35:09 -0700403static struct clk_freq_tbl ftbl_gcc_usb30_master_clk[] = {
Channagoud Kadabidf233d22015-02-11 11:56:48 -0800404 F( 19200000, cxo, 1, 0, 0),
405 F( 120000000, gpll0, 5, 0, 0),
Channagoud Kadabi99d23702015-02-02 20:52:17 -0800406 F( 150000000, gpll0, 4, 0, 0),
Channagoud Kadabied60a8b2014-06-27 15:35:09 -0700407 F_END
408};
409
Tanya Finkel0df43632016-05-31 13:02:35 +0300410static struct clk_freq_tbl ftbl_gcc_usb20_master_clk[] = {
411 F( 19200000, cxo, 1, 0, 0),
412 F( 120000000, gpll0, 5, 0, 0),
413 F( 150000000, gpll0, 4, 0, 0),
414 F_END
415};
416
Channagoud Kadabied60a8b2014-06-27 15:35:09 -0700417static 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
Tanya Finkel0df43632016-05-31 13:02:35 +0300434static struct rcg_clk usb20_master_clk_src = {
435 .cmd_reg = (uint32_t *) USB20_MASTER_CMD_RCGR,
436 .cfg_reg = (uint32_t *) USB20_MASTER_CFG_RCGR,
437 .m_reg = (uint32_t *) USB20_MASTER_M,
438 .n_reg = (uint32_t *) USB20_MASTER_N,
439 .d_reg = (uint32_t *) USB20_MASTER_D,
440
441 .set_rate = clock_lib2_rcg_set_rate_mnd,
442 .freq_tbl = ftbl_gcc_usb20_master_clk,
443 .current_freq = &rcg_dummy_freq,
444
445 .c = {
446 .dbg_name = "usb20_master_clk_src",
447 .ops = &clk_ops_rcg,
448 },
449};
450
Channagoud Kadabied60a8b2014-06-27 15:35:09 -0700451static struct branch_clk gcc_usb30_master_clk = {
452 .cbcr_reg = (uint32_t *) USB30_MASTER_CBCR,
453 .bcr_reg = (uint32_t *) USB_30_BCR,
454 .parent = &usb30_master_clk_src.c,
455
456 .c = {
457 .dbg_name = "usb30_master_clk",
458 .ops = &clk_ops_branch,
459 },
460};
461
Tanya Finkel0df43632016-05-31 13:02:35 +0300462static struct branch_clk gcc_usb20_master_clk = {
463 .cbcr_reg = (uint32_t *) USB20_MASTER_CBCR,
464 .bcr_reg = (uint32_t *) USB_20_BCR,
465 .parent = &usb20_master_clk_src.c,
466
467 .c = {
468 .dbg_name = "usb20_master_clk",
469 .ops = &clk_ops_branch,
470 },
471};
472
Channagoud Kadabidf233d22015-02-11 11:56:48 -0800473static struct branch_clk gcc_aggre2_usb3_axi_clk = {
474 .cbcr_reg = (uint32_t *) GCC_AGGRE2_USB3_AXI_CBCR,
475 .parent = &usb30_master_clk_src.c,
476
477 .c = {
478 .dbg_name = "gcc_aggre2_usb3_axi_clk",
479 .ops = &clk_ops_branch,
480 },
481};
482
Channagoud Kadabied60a8b2014-06-27 15:35:09 -0700483static struct clk_freq_tbl ftbl_gcc_usb30_mock_utmi_clk_src[] = {
484 F( 60000000, gpll0, 10, 0, 0),
485 F_END
486};
487
Tanya Finkel0df43632016-05-31 13:02:35 +0300488static struct clk_freq_tbl ftbl_gcc_usb20_mock_utmi_clk_src[] = {
489 F( 60000000, gpll0, 10, 0, 0),
490 F_END
491};
492
Channagoud Kadabied60a8b2014-06-27 15:35:09 -0700493static struct rcg_clk usb30_mock_utmi_clk_src = {
494 .cmd_reg = (uint32_t *) USB30_MOCK_UTMI_CMD_RCGR,
495 .cfg_reg = (uint32_t *) USB30_MOCK_UTMI_CFG_RCGR,
496 .set_rate = clock_lib2_rcg_set_rate_hid,
497 .freq_tbl = ftbl_gcc_usb30_mock_utmi_clk_src,
498 .current_freq = &rcg_dummy_freq,
499
500 .c = {
501 .dbg_name = "usb30_mock_utmi_clk_src",
502 .ops = &clk_ops_rcg,
503 },
504};
505
Tanya Finkel0df43632016-05-31 13:02:35 +0300506static struct rcg_clk usb20_mock_utmi_clk_src = {
507 .cmd_reg = (uint32_t *) USB20_MOCK_UTMI_CMD_RCGR,
508 .cfg_reg = (uint32_t *) USB20_MOCK_UTMI_CFG_RCGR,
509 .set_rate = clock_lib2_rcg_set_rate_hid,
510 .freq_tbl = ftbl_gcc_usb20_mock_utmi_clk_src,
511 .current_freq = &rcg_dummy_freq,
512
513 .c = {
514 .dbg_name = "usb20_mock_utmi_clk_src",
515 .ops = &clk_ops_rcg,
516 },
517};
518
Channagoud Kadabied60a8b2014-06-27 15:35:09 -0700519static struct branch_clk gcc_usb30_mock_utmi_clk = {
520 .cbcr_reg = (uint32_t *) USB30_MOCK_UTMI_CBCR,
521 .has_sibling = 0,
522 .parent = &usb30_mock_utmi_clk_src.c,
523
524 .c = {
525 .dbg_name = "usb30_mock_utmi_clk",
526 .ops = &clk_ops_branch,
527 },
528};
529
Tanya Finkel0df43632016-05-31 13:02:35 +0300530static struct branch_clk gcc_usb20_mock_utmi_clk = {
531 .cbcr_reg = (uint32_t *) USB20_MOCK_UTMI_CBCR,
532 .has_sibling = 0,
533 .parent = &usb20_mock_utmi_clk_src.c,
534
535 .c = {
536 .dbg_name = "usb20_mock_utmi_clk",
537 .ops = &clk_ops_branch,
538 },
539};
540
541
Channagoud Kadabied60a8b2014-06-27 15:35:09 -0700542static struct branch_clk gcc_usb30_sleep_clk = {
543 .cbcr_reg = (uint32_t *) USB30_SLEEP_CBCR,
544 .has_sibling = 1,
545
546 .c = {
547 .dbg_name = "usb30_sleep_clk",
548 .ops = &clk_ops_branch,
549 },
550};
551
Tanya Finkel0df43632016-05-31 13:02:35 +0300552static struct branch_clk gcc_usb20_sleep_clk = {
553 .cbcr_reg = (uint32_t *) USB20_SLEEP_CBCR,
554 .has_sibling = 1,
555
556 .c = {
557 .dbg_name = "usb20_sleep_clk",
558 .ops = &clk_ops_branch,
559 },
560};
561
Channagoud Kadabied60a8b2014-06-27 15:35:09 -0700562static struct clk_freq_tbl ftbl_gcc_usb30_phy_aux_clk_src[] = {
563 F( 1200000, cxo, 16, 0, 0),
564 F_END
565};
566
567static struct rcg_clk usb30_phy_aux_clk_src = {
568 .cmd_reg = (uint32_t *) USB30_PHY_AUX_CMD_RCGR,
569 .cfg_reg = (uint32_t *) USB30_PHY_AUX_CFG_RCGR,
570 .set_rate = clock_lib2_rcg_set_rate_hid,
571 .freq_tbl = ftbl_gcc_usb30_phy_aux_clk_src,
572 .current_freq = &rcg_dummy_freq,
573
574 .c = {
575 .dbg_name = "usb30_phy_aux_clk_src",
576 .ops = &clk_ops_rcg,
577 },
578};
579
580static struct branch_clk gcc_usb30_phy_aux_clk = {
581 .cbcr_reg = (uint32_t *)USB30_PHY_AUX_CBCR,
582 .has_sibling = 0,
583 .parent = &usb30_phy_aux_clk_src.c,
584
585 .c = {
586 .dbg_name = "usb30_phy_aux_clk",
587 .ops = &clk_ops_branch,
588 },
589};
590
591static struct branch_clk gcc_usb30_pipe_clk = {
592 .bcr_reg = (uint32_t *) USB30PHY_PHY_BCR,
593 .cbcr_reg = (uint32_t *) USB30_PHY_PIPE_CBCR,
594 .has_sibling = 1,
595
596 .c = {
597 .dbg_name = "usb30_pipe_clk",
598 .ops = &clk_ops_branch,
599 },
600};
601
602static struct reset_clk gcc_usb30_phy_reset = {
603 .bcr_reg = (uint32_t )USB30_PHY_BCR,
604
605 .c = {
606 .dbg_name = "usb30_phy_reset",
607 .ops = &clk_ops_rst,
608 },
609};
610
611static struct branch_clk gcc_usb_phy_cfg_ahb2phy_clk = {
612 .cbcr_reg = (uint32_t *)USB_PHY_CFG_AHB2PHY_CBCR,
613 .has_sibling = 1,
614
615 .c = {
616 .dbg_name = "usb_phy_cfg_ahb2phy_clk",
617 .ops = &clk_ops_branch,
618 },
619};
620
Dhaval Patel0f3cbeb2015-03-17 11:52:12 -0700621/* Display clocks */
622static struct clk_freq_tbl ftbl_mdss_esc0_1_clk[] = {
623 F_MM(19200000, cxo, 1, 0, 0),
624 F_END
625};
626
627static struct clk_freq_tbl ftbl_mdss_esc1_1_clk[] = {
628 F_MM(19200000, cxo, 1, 0, 0),
629 F_END
630};
631
632static struct clk_freq_tbl ftbl_axi_clk_src[] = {
633 F_MM( 171430000, gpll0, 3.5, 0, 0),
634 F_MM( 200000000, gpll0, 3, 0, 0),
635 F_MM( 320000000, mmpll0, 2.5, 0, 0),
636 F_END
637};
638
639static struct clk_freq_tbl ftbl_mdp_clk_src[] = {
640 F_MM( 85714286, gpll0, 7, 0, 0),
641 F_MM( 100000000, gpll0, 6, 0, 0),
642 F_MM( 150000000, gpll0, 4, 0, 0),
643 F_MM( 171428571, gpll0, 3.5, 0, 0),
644 F_MM( 320000000, mmpll0, 2.5, 0, 0),
645 F_END
646};
647
648static struct clk_freq_tbl ftbl_ahb_clk_src[] = {
649 F_MM( 19200000, cxo, 1, 0, 0),
650 F_END
651};
652
653static struct rcg_clk ahb_clk_src = {
654 .cmd_reg = (uint32_t *)MMSS_AHB_CMD_RCGR,
655 .cfg_reg = (uint32_t *)MMSS_AHB_CFG_RCGR,
656 .set_rate = clock_lib2_rcg_set_rate_hid,
657 .freq_tbl = ftbl_ahb_clk_src,
658 .c = {
659 .dbg_name = "ahb_clk_src",
660 .ops = &clk_ops_rcg,
661 },
662};
663
664static struct rcg_clk dsi_esc0_clk_src = {
665 .cmd_reg = (uint32_t *) DSI_ESC0_CMD_RCGR,
666 .cfg_reg = (uint32_t *) DSI_ESC0_CFG_RCGR,
667 .set_rate = clock_lib2_rcg_set_rate_hid,
668 .freq_tbl = ftbl_mdss_esc0_1_clk,
669
670 .c = {
671 .dbg_name = "dsi_esc0_clk_src",
672 .ops = &clk_ops_rcg,
673 },
674};
675
676static struct rcg_clk dsi_esc1_clk_src = {
677 .cmd_reg = (uint32_t *) DSI_ESC1_CMD_RCGR,
678 .cfg_reg = (uint32_t *) DSI_ESC1_CFG_RCGR,
679 .set_rate = clock_lib2_rcg_set_rate_hid,
680 .freq_tbl = ftbl_mdss_esc1_1_clk,
681
682 .c = {
683 .dbg_name = "dsi_esc1_clk_src",
684 .ops = &clk_ops_rcg,
685 },
686};
687
688static struct clk_freq_tbl ftbl_mdss_vsync_clk[] = {
689 F_MM(19200000, cxo, 1, 0, 0),
690 F_END
691};
692
693static struct rcg_clk vsync_clk_src = {
694 .cmd_reg = (uint32_t *) VSYNC_CMD_RCGR,
695 .cfg_reg = (uint32_t *) VSYNC_CFG_RCGR,
696 .set_rate = clock_lib2_rcg_set_rate_hid,
697 .freq_tbl = ftbl_mdss_vsync_clk,
698
699 .c = {
700 .dbg_name = "vsync_clk_src",
701 .ops = &clk_ops_rcg,
702 },
703};
704
705static struct rcg_clk axi_clk_src = {
706 .cmd_reg = (uint32_t *) AXI_CMD_RCGR,
707 .cfg_reg = (uint32_t *) AXI_CFG_RCGR,
708 .set_rate = clock_lib2_rcg_set_rate_hid,
709 .freq_tbl = ftbl_axi_clk_src,
710
711 .c = {
712 .dbg_name = "axi_clk_src",
713 .ops = &clk_ops_rcg,
714 },
715};
716
717static struct branch_clk mdss_esc0_clk = {
718 .cbcr_reg = (uint32_t *) DSI_ESC0_CBCR,
719 .parent = &dsi_esc0_clk_src.c,
720 .has_sibling = 0,
721
722 .c = {
723 .dbg_name = "mdss_esc0_clk",
724 .ops = &clk_ops_branch,
725 },
726};
727
728static struct branch_clk mdss_esc1_clk = {
729 .cbcr_reg = (uint32_t *) DSI_ESC1_CBCR,
730 .parent = &dsi_esc1_clk_src.c,
731 .has_sibling = 0,
732
733 .c = {
734 .dbg_name = "mdss_esc1_clk",
735 .ops = &clk_ops_branch,
736 },
737};
738
739static struct branch_clk mdss_axi_clk = {
740 .cbcr_reg = (uint32_t *) MDSS_AXI_CBCR,
741 .parent = &axi_clk_src.c,
742 .has_sibling = 0,
743
744 .c = {
745 .dbg_name = "mdss_axi_clk",
746 .ops = &clk_ops_branch,
747 },
748};
749
750static struct branch_clk smmu_mdp_axi_clk = {
751 .cbcr_reg = (uint32_t *) SMMU_MDP_AXI_CBCR,
752 .parent = &axi_clk_src.c,
753 .has_sibling = 0,
754
755 .c = {
756 .dbg_name = "smmu_mdp_axi_clk",
757 .ops = &clk_ops_branch,
758 },
759};
760
761static struct branch_clk mmss_mmagic_axi_clk = {
762 .cbcr_reg = (uint32_t *) MMSS_MMAGIC_AXI_CBCR,
763 .parent = &axi_clk_src.c,
764 .has_sibling = 0,
765 .c = {
766 .dbg_name = "mmss_mmagic_axi_clk",
767 .ops = &clk_ops_branch,
768 },
769};
770
771static struct branch_clk mmagic_mdss_axi_clk = {
772 .cbcr_reg = (uint32_t *) MMAGIC_MDSS_AXI_CBCR,
773 .parent = &axi_clk_src.c,
774 .has_sibling = 0,
775 .c = {
776 .dbg_name = "mmagic_mdss_axi_clk",
777 .ops = &clk_ops_branch,
778 },
779};
780
781static struct branch_clk mmagic_bimc_axi_clk = {
782 .cbcr_reg = (uint32_t *) MMAGIC_BIMC_AXI_CBCR,
783 .parent = &axi_clk_src.c,
784 .has_sibling = 0,
785 .c = {
786 .dbg_name = "mmagic_bimc_axi_clk",
787 .ops = &clk_ops_branch,
788 },
789};
790
791static struct branch_clk mmss_s0_axi_clk = {
792 .cbcr_reg = (uint32_t *) MMSS_S0_AXI_CBCR,
793 .parent = &axi_clk_src.c,
794 .has_sibling = 0,
795
796 .c = {
797 .dbg_name = "mmss_s0_axi_clk",
798 .ops = &clk_ops_branch,
799 },
800};
801
802static struct branch_clk mdp_ahb_clk = {
803 .cbcr_reg = (uint32_t *) MDSS_AHB_CBCR,
804 .has_sibling = 1,
805 .parent = &ahb_clk_src.c,
806
807 .c = {
808 .dbg_name = "mdp_ahb_clk",
809 .ops = &clk_ops_branch,
810 },
811};
812
813static struct branch_clk mmss_mmagic_ahb_clk = {
814 .cbcr_reg = (uint32_t *) MMSS_MMAGIC_AHB_CBCR,
815 .has_sibling = 0,
816 .parent = &ahb_clk_src.c,
817 .no_halt_check_on_disable = true,
818
819 .c = {
820 .dbg_name = "mmss_mmagic_ahb_clk",
821 .ops = &clk_ops_branch,
822 },
823};
824
825static struct branch_clk smmu_mdp_ahb_clk = {
826 .cbcr_reg = (uint32_t *) SMMU_MDP_AHB_CBCR,
827 .has_sibling = 1,
828 .parent = &ahb_clk_src.c,
829
830 .c = {
831 .dbg_name = "smmu_mdp_ahb_clk",
832 .ops = &clk_ops_branch,
833 },
834};
835
836static struct rcg_clk mdss_mdp_clk_src = {
837 .cmd_reg = (uint32_t *) MDP_CMD_RCGR,
838 .cfg_reg = (uint32_t *) MDP_CFG_RCGR,
839 .set_rate = clock_lib2_rcg_set_rate_hid,
840 .freq_tbl = ftbl_mdp_clk_src,
841 .current_freq = &rcg_dummy_freq,
842
843 .c = {
844 .dbg_name = "mdss_mdp_clk_src",
845 .ops = &clk_ops_rcg,
846 },
847};
848
849static struct branch_clk mdss_mdp_clk = {
850 .cbcr_reg = (uint32_t *) MDP_CBCR,
851 .parent = &mdss_mdp_clk_src.c,
852 .has_sibling = 0,
853
854 .c = {
855 .dbg_name = "mdss_mdp_clk",
856 .ops = &clk_ops_branch,
857 },
858};
859
860static struct branch_clk mdss_vsync_clk = {
861 .cbcr_reg = (uint32_t *) MDSS_VSYNC_CBCR,
862 .parent = &vsync_clk_src.c,
863 .has_sibling = 0,
864
865 .c = {
866 .dbg_name = "mdss_vsync_clk",
867 .ops = &clk_ops_branch,
868 },
869};
870
Ajay Singh Parmard4760c12015-02-13 17:13:38 -0800871static struct branch_clk mdss_hdmi_ahb_clk = {
872 .cbcr_reg = (uint32_t *) MDSS_HDMI_AHB_CBCR,
873 .has_sibling = 1,
874 .c = {
875 .dbg_name = "mdss_hdmi_ahb_clk",
876 .ops = &clk_ops_branch,
877 },
878};
879
880static struct clk_freq_tbl ftbl_mdss_hdmi_clk[] = {
881 F_MM( 19200000, cxo, 1, 0, 0),
882 F_END
883};
884
885static struct rcg_clk hdmi_clk_src = {
886 .cmd_reg = (uint32_t *) HDMI_CMD_RCGR,
887 .cfg_reg = (uint32_t *) HDMI_CFG_RCGR,
888 .set_rate = clock_lib2_rcg_set_rate_hid,
889 .freq_tbl = ftbl_mdss_hdmi_clk,
890 .current_freq = &rcg_dummy_freq,
891 .c = {
892 .dbg_name = "hdmi_clk_src",
893 .ops = &clk_ops_rcg,
894 },
895};
896
897static struct branch_clk mdss_hdmi_clk = {
898 .cbcr_reg = (uint32_t *) MDSS_HDMI_CBCR,
899 .has_sibling = 0,
900 .parent = &hdmi_clk_src.c,
901 .c = {
902 .dbg_name = "mdss_hdmi_clk",
903 .ops = &clk_ops_branch,
904 },
905};
906
907static struct clk_freq_tbl ftbl_mdss_extpclk_clk[] = {
908 F_MDSS( 74250000, hdmipll, 1, 0, 0),
909 F_MDSS( 25200000, hdmipll, 1, 0, 0),
910 F_MDSS( 27000000, hdmipll, 1, 0, 0),
911 F_MDSS( 27030000, hdmipll, 1, 0, 0),
912 F_MDSS( 27070000, hdmipll, 1, 0, 0),
913 F_MDSS( 65000000, hdmipll, 1, 0, 0),
914 F_MDSS(108000000, hdmipll, 1, 0, 0),
915 F_MDSS(148500000, hdmipll, 1, 0, 0),
916 F_MDSS(268500000, hdmipll, 1, 0, 0),
917 F_MDSS(297000000, hdmipll, 1, 0, 0),
Tatenda Chipeperekwabeccad92016-03-15 09:56:53 -0700918 F_MDSS(594000000, hdmipll, 1, 0, 0),
Ajay Singh Parmard4760c12015-02-13 17:13:38 -0800919 F_END
920};
921
922static struct rcg_clk extpclk_clk_src = {
923 .cmd_reg = (uint32_t *) EXTPCLK_CMD_RCGR,
924 .cfg_reg = (uint32_t *) EXTPCLK_CFG_RCGR,
925 .set_rate = clock_lib2_rcg_set_rate_hid,
926 .freq_tbl = ftbl_mdss_extpclk_clk,
927 .current_freq = &rcg_dummy_freq,
928 .c = {
929 .dbg_name = "extpclk_clk_src",
930 .ops = &clk_ops_rcg,
931 },
932};
933
934static struct branch_clk mdss_extpclk_clk = {
935 .cbcr_reg = (uint32_t *) MDSS_EXTPCLK_CBCR,
936 .has_sibling = 0,
937 .parent = &extpclk_clk_src.c,
938 .c = {
939 .dbg_name = "mdss_extpclk_clk",
940 .ops = &clk_ops_branch,
941 },
942};
Channagoud Kadabied60a8b2014-06-27 15:35:09 -0700943
944/* Clock lookup table */
Channagoud Kadabi0ffa7862015-03-19 11:58:28 -0700945static struct clk_lookup msm_msm8996_clocks[] =
Channagoud Kadabied60a8b2014-06-27 15:35:09 -0700946{
947 CLK_LOOKUP("sdc1_iface_clk", gcc_sdcc1_ahb_clk.c),
948 CLK_LOOKUP("sdc1_core_clk", gcc_sdcc1_apps_clk.c),
949
Tanya Finkel619fc2a2016-08-16 14:11:26 +0300950 CLK_LOOKUP("sdc2_iface_clk", gcc_sdcc2_ahb_clk.c),
951 CLK_LOOKUP("sdc2_core_clk", gcc_sdcc2_apps_clk.c),
952
Channagoud Kadabi99d23702015-02-02 20:52:17 -0800953 CLK_LOOKUP("uart8_iface_clk", gcc_blsp2_ahb_clk.c),
Channagoud Kadabi35503c42014-11-14 16:22:43 -0800954 CLK_LOOKUP("uart8_core_clk", gcc_blsp2_uart2_apps_clk.c),
Channagoud Kadabied60a8b2014-06-27 15:35:09 -0700955
956 /* USB30 clocks */
957 CLK_LOOKUP("usb30_master_clk", gcc_usb30_master_clk.c),
Channagoud Kadabidf233d22015-02-11 11:56:48 -0800958 CLK_LOOKUP("gcc_aggre2_usb3_axi_clk", gcc_aggre2_usb3_axi_clk.c),
Channagoud Kadabied60a8b2014-06-27 15:35:09 -0700959 CLK_LOOKUP("usb30_iface_clk", gcc_sys_noc_usb30_axi_clk.c),
960 CLK_LOOKUP("usb30_mock_utmi_clk", gcc_usb30_mock_utmi_clk.c),
961 CLK_LOOKUP("usb30_sleep_clk", gcc_usb30_sleep_clk.c),
962 CLK_LOOKUP("usb30_phy_aux_clk", gcc_usb30_phy_aux_clk.c),
963 CLK_LOOKUP("usb30_pipe_clk", gcc_usb30_pipe_clk.c),
964 CLK_LOOKUP("usb30_phy_reset", gcc_usb30_phy_reset.c),
965
966 CLK_LOOKUP("usb_phy_cfg_ahb2phy_clk", gcc_usb_phy_cfg_ahb2phy_clk.c),
Dhaval Patel0f3cbeb2015-03-17 11:52:12 -0700967
Tanya Finkel0df43632016-05-31 13:02:35 +0300968 /* USB20 clocks */
969 CLK_LOOKUP("usb20_noc_usb20_clk", gcc_periph_noc_usb20_ahb_clk.c),
970 CLK_LOOKUP("usb20_master_clk", gcc_usb20_master_clk.c),
971 CLK_LOOKUP("usb20_mock_utmi_clk", gcc_usb20_mock_utmi_clk.c),
972 CLK_LOOKUP("usb20_sleep_clk", gcc_usb20_sleep_clk.c),
973
Dhaval Patel0f3cbeb2015-03-17 11:52:12 -0700974 /* mdss clocks */
975 CLK_LOOKUP("mdss_mdp_clk", mdss_mdp_clk.c),
976 CLK_LOOKUP("mdss_vsync_clk", mdss_vsync_clk.c),
977 CLK_LOOKUP("mdss_mdp_clk", mdss_mdp_clk.c),
978 CLK_LOOKUP("mdss_esc0_clk", mdss_esc0_clk.c),
979 CLK_LOOKUP("mdss_esc1_clk", mdss_esc1_clk.c),
980 CLK_LOOKUP("mmss_s0_axi_clk", mmss_s0_axi_clk.c),
981 CLK_LOOKUP("mmss_mmagic_axi_clk", mmss_mmagic_axi_clk.c),
982 CLK_LOOKUP("mmagic_mdss_axi_clk", mmagic_mdss_axi_clk.c),
983 CLK_LOOKUP("mmagic_bimc_axi_clk", mmagic_bimc_axi_clk.c),
984 CLK_LOOKUP("smmu_mdp_axi_clk", smmu_mdp_axi_clk.c),
985 CLK_LOOKUP("mdss_axi_clk", mdss_axi_clk.c),
986 CLK_LOOKUP("mmss_mmagic_ahb_clk", mmss_mmagic_ahb_clk.c),
987 CLK_LOOKUP("smmu_mdp_ahb_clk", smmu_mdp_ahb_clk.c),
988 CLK_LOOKUP("mdp_ahb_clk", mdp_ahb_clk.c),
Siddharth Zaveri1cf08b92015-12-02 17:09:14 -0500989
990 /* BLSP CLOCKS */
991 CLK_LOOKUP("blsp2_qup2_ahb_iface_clk", gcc_blsp2_ahb_clk.c),
992 CLK_LOOKUP("gcc_blsp2_qup2_i2c_apps_clk_src",
993 gcc_blsp2_qup2_i2c_apps_clk_src.c),
994 CLK_LOOKUP("gcc_blsp2_qup2_i2c_apps_clk",
995 gcc_blsp2_qup2_i2c_apps_clk.c),
Ajay Singh Parmard4760c12015-02-13 17:13:38 -0800996
997 /* HDMI clocks*/
998 CLK_LOOKUP("hdmi_ahb_clk", mdss_hdmi_ahb_clk.c),
999 CLK_LOOKUP("hdmi_core_clk", mdss_hdmi_clk.c),
1000 CLK_LOOKUP("hdmi_extp_clk", mdss_extpclk_clk.c),
Channagoud Kadabied60a8b2014-06-27 15:35:09 -07001001};
1002
1003void platform_clock_init(void)
1004{
Channagoud Kadabi0ffa7862015-03-19 11:58:28 -07001005 clk_init(msm_msm8996_clocks, ARRAY_SIZE(msm_msm8996_clocks));
Channagoud Kadabied60a8b2014-06-27 15:35:09 -07001006}