blob: 4b0605f453985654012b73187463dd5cbbd1d96d [file] [log] [blame]
Sundarajan Srinivasan4bbce722013-07-03 11:13:31 -07001/*
Channagoud Kadabi5a83d2f2014-02-04 17:00:13 -08002 * Copyright (c) 2013-2014, The Linux Foundation. All rights reserved.
Sundarajan Srinivasan4bbce722013-07-03 11:13:31 -07003 *
4 * Redistribution and use in source and binary forms, with or without
5 * modification, are permitted provided that the following conditions are 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 copyright
9 * notice, this list of conditions and the following disclaimer in the
10 * documentation and/or other materials provided with the distribution.
11 * * Neither the name of Linux Foundation nor
12 * the names of its contributors may be used to endorse or promote
13 * products derived from this software without specific prior written
14 * permission.
15 *
16 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
17 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
18 * IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
19 * NON-INFRINGEMENT ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
20 * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
21 * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
22 * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
23 * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
24 * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
25 * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
26 * 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
Channagoud Kadabi5a83d2f2014-02-04 17:00:13 -080042#define usb30_pipe_source_val 2
Sundarajan Srinivasan4bbce722013-07-03 11:13:31 -070043
44struct clk_freq_tbl rcg_dummy_freq = F_END;
45
46
47/* Clock Operations */
48static struct clk_ops clk_ops_branch =
49{
50 .enable = clock_lib2_branch_clk_enable,
51 .disable = clock_lib2_branch_clk_disable,
52 .set_rate = clock_lib2_branch_set_rate,
53};
54
55static struct clk_ops clk_ops_rcg_mnd =
56{
57 .enable = clock_lib2_rcg_enable,
58 .set_rate = clock_lib2_rcg_set_rate,
59};
60
61static struct clk_ops clk_ops_rcg =
62{
63 .enable = clock_lib2_rcg_enable,
64 .set_rate = clock_lib2_rcg_set_rate,
65};
66
67static struct clk_ops clk_ops_cxo =
68{
69 .enable = cxo_clk_enable,
70 .disable = cxo_clk_disable,
71};
72
73static struct clk_ops clk_ops_pll_vote =
74{
75 .enable = pll_vote_clk_enable,
76 .disable = pll_vote_clk_disable,
77 .auto_off = pll_vote_clk_disable,
78 .is_enabled = pll_vote_clk_is_enabled,
79};
80
81static struct clk_ops clk_ops_vote =
82{
83 .enable = clock_lib2_vote_clk_enable,
84 .disable = clock_lib2_vote_clk_disable,
85};
86
87/* Clock Sources */
88static struct fixed_clk cxo_clk_src =
89{
90 .c = {
91 .rate = 19200000,
92 .dbg_name = "cxo_clk_src",
93 .ops = &clk_ops_cxo,
94 },
95};
96
97static struct pll_vote_clk gpll0_clk_src =
98{
99 .en_reg = (void *) APCS_GPLL_ENA_VOTE,
100 .en_mask = BIT(0),
101 .status_reg = (void *) GPLL0_STATUS,
Sundarajan Srinivasan7b390142013-10-29 12:32:50 -0700102 .status_mask = BIT(30),
Sundarajan Srinivasan4bbce722013-07-03 11:13:31 -0700103 .parent = &cxo_clk_src.c,
104
105 .c = {
106 .rate = 600000000,
107 .dbg_name = "gpll0_clk_src",
108 .ops = &clk_ops_pll_vote,
109 },
110};
111
112/* UART Clocks */
113
114static struct vote_clk gcc_blsp1_ahb_clk = {
115 .cbcr_reg = BLSP1_AHB_CBCR,
116 .vote_reg = APCS_CLOCK_BRANCH_ENA_VOTE,
117 .en_mask = BIT(17),
118
119 .c = {
120 .dbg_name = "gcc_blsp1_ahb_clk",
121 .ops = &clk_ops_vote,
122 },
123};
124
125static struct clk_freq_tbl ftbl_gcc_blsp1_2_uart1_6_apps_clk[] =
126{
127 F( 3686400, gpll0, 1, 96, 15625),
128 F( 7372800, gpll0, 1, 192, 15625),
129 F(14745600, gpll0, 1, 384, 15625),
130 F(16000000, gpll0, 5, 2, 15),
131 F(19200000, cxo, 1, 0, 0),
132 F(24000000, gpll0, 5, 1, 5),
133 F(32000000, gpll0, 1, 4, 75),
134 F(40000000, gpll0, 15, 0, 0),
135 F(46400000, gpll0, 1, 29, 375),
136 F(48000000, gpll0, 12.5, 0, 0),
137 F(51200000, gpll0, 1, 32, 375),
138 F(56000000, gpll0, 1, 7, 75),
139 F(58982400, gpll0, 1, 1536, 15625),
140 F(60000000, gpll0, 10, 0, 0),
141 F_END
142};
143
144static struct rcg_clk blsp1_uart1_apps_clk_src =
145{
146 .cmd_reg = (uint32_t *) BLSP1_UART1_APPS_CMD_RCGR,
147 .cfg_reg = (uint32_t *) BLSP1_UART1_APPS_CFG_RCGR,
148 .m_reg = (uint32_t *) BLSP1_UART1_APPS_M,
149 .n_reg = (uint32_t *) BLSP1_UART1_APPS_N,
150 .d_reg = (uint32_t *) BLSP1_UART1_APPS_D,
151
152 .set_rate = clock_lib2_rcg_set_rate_mnd,
153 .freq_tbl = ftbl_gcc_blsp1_2_uart1_6_apps_clk,
154 .current_freq = &rcg_dummy_freq,
155
156 .c = {
157 .dbg_name = "blsp1_uart1_apps_clk",
158 .ops = &clk_ops_rcg_mnd,
159 },
160};
161
162static 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
180static struct rcg_clk blsp1_uart3_apps_clk_src =
181{
182 .cmd_reg = (uint32_t *) BLSP1_UART3_APPS_CMD_RCGR,
183 .cfg_reg = (uint32_t *) BLSP1_UART3_APPS_CFG_RCGR,
184 .m_reg = (uint32_t *) BLSP1_UART3_APPS_M,
185 .n_reg = (uint32_t *) BLSP1_UART3_APPS_N,
186 .d_reg = (uint32_t *) BLSP1_UART3_APPS_D,
187
188 .set_rate = clock_lib2_rcg_set_rate_mnd,
189 .freq_tbl = ftbl_gcc_blsp1_2_uart1_6_apps_clk,
190 .current_freq = &rcg_dummy_freq,
191
192 .c = {
193 .dbg_name = "blsp1_uart3_apps_clk",
194 .ops = &clk_ops_rcg_mnd,
195 },
196};
197
198static struct branch_clk gcc_blsp1_uart1_apps_clk =
199{
200 .cbcr_reg = (uint32_t *) BLSP1_UART1_APPS_CBCR,
201 .parent = &blsp1_uart1_apps_clk_src.c,
202
203 .c = {
204 .dbg_name = "gcc_blsp1_uart1_apps_clk",
205 .ops = &clk_ops_branch,
206 },
207};
208
209static struct branch_clk gcc_blsp1_uart2_apps_clk =
210{
211 .cbcr_reg = (uint32_t *) BLSP1_UART2_APPS_CBCR,
212 .parent = &blsp1_uart2_apps_clk_src.c,
213
214 .c = {
215 .dbg_name = "gcc_blsp1_uart2_apps_clk",
216 .ops = &clk_ops_branch,
217 },
218};
219
220static struct branch_clk gcc_blsp1_uart3_apps_clk =
221{
222 .cbcr_reg = (uint32_t *) BLSP1_UART3_APPS_CBCR,
223 .parent = &blsp1_uart3_apps_clk_src.c,
224
225 .c = {
226 .dbg_name = "gcc_blsp1_uart3_apps_clk",
227 .ops = &clk_ops_branch,
228 },
229};
230
231/* USB Clocks */
232static struct clk_freq_tbl ftbl_gcc_usb_hs_system_clk[] =
233{
234 F(75000000, gpll0, 8, 0, 0),
235 F_END
236};
237
238static struct rcg_clk usb_hs_system_clk_src =
239{
240 .cmd_reg = (uint32_t *) USB_HS_SYSTEM_CMD_RCGR,
241 .cfg_reg = (uint32_t *) USB_HS_SYSTEM_CFG_RCGR,
242
243 .set_rate = clock_lib2_rcg_set_rate_hid,
244 .freq_tbl = ftbl_gcc_usb_hs_system_clk,
245 .current_freq = &rcg_dummy_freq,
246
247 .c = {
248 .dbg_name = "usb_hs_system_clk",
249 .ops = &clk_ops_rcg,
250 },
251};
252
253static struct branch_clk gcc_usb_hs_system_clk =
254{
255 .cbcr_reg = (uint32_t *) USB_HS_SYSTEM_CBCR,
256 .parent = &usb_hs_system_clk_src.c,
257
258 .c = {
259 .dbg_name = "gcc_usb_hs_system_clk",
260 .ops = &clk_ops_branch,
261 },
262};
263
264static struct branch_clk gcc_usb_hs_ahb_clk =
265{
266 .cbcr_reg = (uint32_t *) USB_HS_AHB_CBCR,
267 .has_sibling = 1,
268
269 .c = {
270 .dbg_name = "gcc_usb_hs_ahb_clk",
271 .ops = &clk_ops_branch,
272 },
273};
274
Channagoud Kadabi5a83d2f2014-02-04 17:00:13 -0800275static struct clk_freq_tbl ftbl_gcc_usb30_pipe_clk[] = {
276 F( 19200000, cxo, 1, 0, 0),
277 F_EXT_SRC( 125000000, usb30_pipe, 1, 0, 0),
278 F_END
279};
280
281static struct rcg_clk usb30_pipe_clk_src = {
282 .cmd_reg = (uint32_t *) USB3_PIPE_CMD_RCGR,
283 .cfg_reg = (uint32_t *) USB3_PIPE_CFG_RCGR,
284 .set_rate = clock_lib2_rcg_set_rate_hid,
285 .freq_tbl = ftbl_gcc_usb30_pipe_clk,
286 .current_freq = &rcg_dummy_freq,
287
288 .c = {
289 .dbg_name = "usb30_pipe_clk_src",
290 .ops = &clk_ops_rcg,
291 },
292};
293
294static struct branch_clk gcc_usb30_pipe_clk = {
295 .cbcr_reg = (uint32_t *) USB3_PIPE_CBCR,
296 .parent = &usb30_pipe_clk_src.c,
297 .has_sibling = 0,
298
299 .c = {
300 .dbg_name = "gcc_usb30_pipe_clk",
301 .ops = &clk_ops_branch,
302 },
303};
304
305static struct clk_freq_tbl ftbl_gcc_usb30_master_clk[] =
306{
307 F(125000000, gpll0, 1, 5, 24),
308 F_END
309};
310
311static struct rcg_clk usb30_master_clk_src =
312{
313 .cmd_reg = (uint32_t *) GCC_USB30_MASTER_CMD_RCGR,
314 .cfg_reg = (uint32_t *) GCC_USB30_MASTER_CFG_RCGR,
315 .m_reg = (uint32_t *) GCC_USB30_MASTER_M,
316 .n_reg = (uint32_t *) GCC_USB30_MASTER_N,
317 .d_reg = (uint32_t *) GCC_USB30_MASTER_D,
318
319 .set_rate = clock_lib2_rcg_set_rate_mnd,
320 .freq_tbl = ftbl_gcc_usb30_master_clk,
321 .current_freq = &rcg_dummy_freq,
322
323 .c = {
324 .dbg_name = "usb30_master_clk_src",
325 .ops = &clk_ops_rcg,
326 },
327};
328
329
330static struct branch_clk gcc_usb30_master_clk =
331{
332 .cbcr_reg = (uint32_t *) GCC_USB30_MASTER_CBCR,
333 .parent = &usb30_master_clk_src.c,
334
335 .c = {
336 .dbg_name = "gcc_usb30_master_clk",
337 .ops = &clk_ops_branch,
338 },
339};
340
341static struct clk_freq_tbl ftbl_gcc_usb30_aux_clk[] = {
342 F( 1000000, cxo, 1, 5, 96),
343 F_END
344};
345
346static struct rcg_clk usb30_aux_clk_src = {
347 .cmd_reg = (uint32_t *) USB3_AUX_CMD_RCGR,
348 .cfg_reg = (uint32_t *) USB3_AUX_CFG_RCGR,
349 .m_reg = (uint32_t *) USB3_AUX_M,
350 .n_reg = (uint32_t *) USB3_AUX_N,
351 .d_reg = (uint32_t *) USB3_AUX_D,
352
353 .set_rate = clock_lib2_rcg_set_rate_mnd,
354 .freq_tbl = ftbl_gcc_usb30_aux_clk,
355 .current_freq = &rcg_dummy_freq,
356
357 .c = {
358 .dbg_name = "usb30_aux_clk_src",
359 .ops = &clk_ops_rcg_mnd,
360 },
361};
362
363static struct branch_clk gcc_usb30_aux_clk = {
364 .cbcr_reg = (uint32_t *) USB3_AUX_CBCR,
365 .parent = &usb30_aux_clk_src.c,
366
367 .c = {
368 .dbg_name = "gcc_usb30_aux_clk",
369 .ops = &clk_ops_branch,
370 },
371};
372
373static struct branch_clk gcc_sys_noc_usb30_axi_clk =
374{
375 .cbcr_reg = (uint32_t *) SYS_NOC_USB3_AXI_CBCR,
376 .has_sibling = 1,
377
378 .c = {
379 .dbg_name = "gcc_sys_noc_usb3_axi_clk",
380 .ops = &clk_ops_branch,
381 },
382};
383
384static struct branch_clk gcc_usb_phy_cfg_ahb_clk = {
385 .cbcr_reg = (uint32_t *) USB_PHY_CFG_AHB_CBCR,
386 .has_sibling = 1,
387
388 .c = {
389 .dbg_name = "gcc_usb_phy_cfg_ahb_clk",
390 .ops = &clk_ops_branch,
391 },
392};
393
Sundarajan Srinivasan4bbce722013-07-03 11:13:31 -0700394/* Clock lookup table */
Channagoud Kadabi5a83d2f2014-02-04 17:00:13 -0800395static struct clk_lookup mdm_9635_clocks[] =
Sundarajan Srinivasan4bbce722013-07-03 11:13:31 -0700396{
397 CLK_LOOKUP("uart_iface_clk", gcc_blsp1_ahb_clk.c),
398 CLK_LOOKUP("uart1_core_clk", gcc_blsp1_uart1_apps_clk.c),
399 CLK_LOOKUP("uart2_core_clk", gcc_blsp1_uart2_apps_clk.c),
400 CLK_LOOKUP("uart3_core_clk", gcc_blsp1_uart3_apps_clk.c),
401
402 CLK_LOOKUP("usb_iface_clk", gcc_usb_hs_ahb_clk.c),
403 CLK_LOOKUP("usb_core_clk", gcc_usb_hs_system_clk.c),
Channagoud Kadabi5a83d2f2014-02-04 17:00:13 -0800404
405 CLK_LOOKUP("usb30_iface_clk", gcc_sys_noc_usb30_axi_clk.c),
406 CLK_LOOKUP("usb30_master_clk", gcc_usb30_master_clk.c),
407 CLK_LOOKUP("usb30_pipe_clk", gcc_usb30_pipe_clk.c),
408 CLK_LOOKUP("usb30_aux_clk", gcc_usb30_aux_clk.c),
409
410 CLK_LOOKUP("usb_phy_cfg_ahb_clk", gcc_usb_phy_cfg_ahb_clk.c),
Sundarajan Srinivasan4bbce722013-07-03 11:13:31 -0700411};
412
413
414void platform_clock_init(void)
415{
Channagoud Kadabi5a83d2f2014-02-04 17:00:13 -0800416 clk_init(mdm_9635_clocks, ARRAY_SIZE(mdm_9635_clocks));
Sundarajan Srinivasan4bbce722013-07-03 11:13:31 -0700417}