blob: e20936f5522e412cbe30d0603a41e5f7aeadb396 [file] [log] [blame]
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07001/* Copyright (c) 2009-2011, Code Aurora Forum. All rights reserved.
2 *
3 * This program is free software; you can redistribute it and/or modify
4 * it under the terms of the GNU General Public License version 2 and
5 * only version 2 as published by the Free Software Foundation.
6 *
7 * This program is distributed in the hope that it will be useful,
8 * but WITHOUT ANY WARRANTY; without even the implied warranty of
9 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
10 * GNU General Public License for more details.
11 *
12 */
13
14#include <linux/kernel.h>
15#include <linux/init.h>
16#include <linux/err.h>
17#include <linux/ctype.h>
18#include <linux/bitops.h>
19#include <linux/io.h>
20#include <linux/spinlock.h>
21#include <linux/delay.h>
22#include <linux/clk.h>
23#include <linux/clkdev.h>
24#include <linux/string.h>
25
26#include <mach/msm_iomap.h>
27#include <mach/clk.h>
28
29#include "clock.h"
30#include "clock-local.h"
31#include "clock-pcom.h"
32#include "clock-voter.h"
33#include "proc_comm.h"
34
35#define REG_BASE(off) (MSM_CLK_CTL_BASE + (off))
36#define REG(off) (MSM_CLK_CTL_SH2_BASE + (off))
37
38/* Shadow-region 2 (SH2) registers. */
39#define QUP_I2C_NS_REG REG(0x04F0)
40#define CAM_NS_REG REG(0x0374)
41#define CAM_VFE_NS_REG REG(0x0044)
42#define CLK_HALT_STATEA_REG REG(0x0108)
43#define CLK_HALT_STATEB_REG REG(0x010C)
44#define CLK_HALT_STATEC_REG REG(0x02D4)
45#define CSI_NS_REG REG(0x0174)
46#define EMDH_NS_REG REG(0x0050)
47#define GLBL_CLK_ENA_2_SC_REG REG(0x03C0)
48#define GLBL_CLK_ENA_SC_REG REG(0x03BC)
49#define GLBL_CLK_STATE_2_REG REG(0x037C)
50#define GLBL_CLK_STATE_REG REG(0x0004)
51#define GRP_2D_NS_REG REG(0x0034)
52#define GRP_NS_REG REG(0x0084)
53#define HDMI_NS_REG REG(0x0484)
54#define I2C_2_NS_REG REG(0x02D8)
55#define I2C_NS_REG REG(0x0068)
56#define JPEG_NS_REG REG(0x0164)
57#define LPA_CORE_CLK_MA0_REG REG(0x04F4)
58#define LPA_CORE_CLK_MA2_REG REG(0x04FC)
59#define LPA_NS_REG REG(0x02E8)
60#define MDC_NS_REG REG(0x007C)
61#define MDP_LCDC_NS_REG REG(0x0390)
62#define MDP_NS_REG REG(0x014C)
63#define MDP_VSYNC_REG REG(0x0460)
64#define MFC_NS_REG REG(0x0154)
65#define MI2S_CODEC_RX_DIV_REG REG(0x02EC)
66#define MI2S_CODEC_TX_DIV_REG REG(0x02F0)
67#define MI2S_DIV_REG REG(0x02E4)
68#define MI2S_NS_REG REG(0x02E0)
69#define MI2S_RX_NS_REG REG(0x0070)
70#define MI2S_TX_NS_REG REG(0x0078)
71#define MIDI_NS_REG REG(0x02D0)
72#define PLL_ENA_REG REG(0x0264)
73#define PMDH_NS_REG REG(0x008C)
74#define SDAC_NS_REG REG(0x009C)
75#define SDCn_NS_REG(n) REG(0x00A4+(0x8*((n)-1)))
76#define SPI_NS_REG REG(0x02C8)
77#define TSIF_NS_REG REG(0x00C4)
78#define TV_NS_REG REG(0x00CC)
79#define UART1DM_NS_REG REG(0x00D4)
80#define UART2DM_NS_REG REG(0x00DC)
81#define UART2_NS_REG REG(0x0464)
82#define UART_NS_REG REG(0x00E0)
83#define USBH2_NS_REG REG(0x046C)
84#define USBH3_NS_REG REG(0x0470)
85#define USBH_MD_REG REG(0x02BC)
86#define USBH_NS_REG REG(0x02C0)
87#define VPE_NS_REG REG(0x015C)
88
89/* Registers in the base (non-shadow) region. */
90#define CLK_TEST_BASE_REG REG_BASE(0x011C)
91#define CLK_TEST_2_BASE_REG REG_BASE(0x0384)
92#define MISC_CLK_CTL_BASE_REG REG_BASE(0x0110)
93#define PRPH_WEB_NS_BASE_REG REG_BASE(0x0080)
94#define PLL0_STATUS_BASE_REG REG_BASE(0x0318)
95#define PLL1_STATUS_BASE_REG REG_BASE(0x0334)
96#define PLL2_STATUS_BASE_REG REG_BASE(0x0350)
97#define PLL3_STATUS_BASE_REG REG_BASE(0x036C)
98#define PLL4_STATUS_BASE_REG REG_BASE(0x0254)
99#define PLL5_STATUS_BASE_REG REG_BASE(0x0258)
100#define PLL6_STATUS_BASE_REG REG_BASE(0x04EC)
101#define RINGOSC_CNT_BASE_REG REG_BASE(0x00FC)
102#define SH2_OWN_APPS1_BASE_REG REG_BASE(0x040C)
103#define SH2_OWN_APPS2_BASE_REG REG_BASE(0x0414)
104#define SH2_OWN_APPS3_BASE_REG REG_BASE(0x0444)
105#define SH2_OWN_GLBL_BASE_REG REG_BASE(0x0404)
106#define SH2_OWN_ROW1_BASE_REG REG_BASE(0x041C)
107#define SH2_OWN_ROW2_BASE_REG REG_BASE(0x0424)
108#define TCXO_CNT_BASE_REG REG_BASE(0x00F8)
109#define TCXO_CNT_DONE_BASE_REG REG_BASE(0x00F8)
110
111
112/* MUX source input identifiers. */
113#define SRC_SEL_pll0 4 /* Modem PLL */
114#define SRC_SEL_pll1 1 /* Global PLL */
115#define SRC_SEL_pll3 3 /* Multimedia/Peripheral PLL or Backup PLL1 */
116#define SRC_SEL_pll4 2 /* Display PLL */
117#define SRC_SEL_SDAC_lpxo 5 /* Low-power XO for SDAC */
118#define SRC_SEL_lpxo 6 /* Low-power XO */
119#define SRC_SEL_tcxo 0 /* Used for rates from TCXO */
120#define SRC_SEL_axi 0 /* Used for rates that sync to AXI */
121#define SRC_SEL_gnd 7 /* No clock */
122
123/* Clock declaration macros. */
124#define MN_MODE_DUAL_EDGE 0x2
125#define MD8(m, n) (BVAL(15, 8, m) | BVAL(7, 0, ~(n)))
126#define N8(msb, lsb, m, n) (BVAL(msb, lsb, ~(n-m)) | BVAL(6, 5, \
127 (MN_MODE_DUAL_EDGE * !!(n))))
128#define MD16(m, n) (BVAL(31, 16, m) | BVAL(15, 0, ~(n)))
129#define N16(m, n) (BVAL(31, 16, ~(n-m)) | BVAL(6, 5, \
130 (MN_MODE_DUAL_EDGE * !!(n))))
131#define SPDIV(s, d) (BVAL(4, 3, d-1) | BVAL(2, 0, s))
132#define SDIV(s, d) (BVAL(6, 3, d-1) | BVAL(2, 0, s))
133#define F_MASK_BASIC (BM(6, 3)|BM(2, 0))
134#define F_MASK_MND16 (BM(31, 16)|BM(6, 5)|BM(4, 3)|BM(2, 0))
135#define F_MASK_MND8(m, l) (BM(m, l)|BM(6, 5)|BM(4, 3)|BM(2, 0))
136
137/*
138 * Clock frequency definitions and macros
139 */
140#define F_BASIC(f, s, div, v) \
141 { \
142 .freq_hz = f, \
143 .src_clk = &s##_clk.c, \
144 .ns_val = SDIV(SRC_SEL_##s, div), \
145 .sys_vdd = v, \
146 }
147
148#define F_MND16(f, s, div, m, n, v) \
149 { \
150 .freq_hz = f, \
151 .src_clk = &s##_clk.c, \
152 .md_val = MD16(m, n), \
153 .ns_val = N16(m, n) | SPDIV(SRC_SEL_##s, div), \
154 .mnd_en_mask = BIT(8) * !!(n), \
155 .sys_vdd = v, \
156 }
157
158#define F_MND8(f, nmsb, nlsb, s, div, m, n, v) \
159 { \
160 .freq_hz = f, \
161 .src_clk = &s##_clk.c, \
162 .md_val = MD8(m, n), \
163 .ns_val = N8(nmsb, nlsb, m, n) | SPDIV(SRC_SEL_##s, div), \
164 .mnd_en_mask = BIT(8) * !!(n), \
165 .sys_vdd = v, \
166 }
167
Matt Wagantall84f43fd2011-08-16 23:28:38 -0700168static struct clk_ops clk_ops_rcg_7x30;
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700169
170#define PCOM_XO_DISABLE 0
171#define PCOM_XO_ENABLE 1
172#define PCOM_XO_TCXO 0
173#define PCOM_XO_LPXO 1
174
175static bool pcom_is_local(struct clk *clk)
176{
177 return false;
178}
179
180static int pcom_xo_enable(unsigned pcom_id, unsigned enable)
181{
182 /* TODO: Check return code in pcom_id */
183 return msm_proc_comm(PCOM_CLKCTL_RPC_SRC_REQUEST, &pcom_id, &enable);
184}
185
186static int tcxo_clk_enable(struct clk *clk)
187{
188 return pcom_xo_enable(PCOM_XO_TCXO, PCOM_XO_ENABLE);
189}
190
191static void tcxo_clk_disable(struct clk *clk)
192{
193 pcom_xo_enable(PCOM_XO_TCXO, PCOM_XO_DISABLE);
194}
195
196static struct clk_ops clk_ops_tcxo = {
197 .enable = tcxo_clk_enable,
198 .disable = tcxo_clk_disable,
199 .get_rate = fixed_clk_get_rate,
200 .is_local = pcom_is_local,
201};
202
203static struct fixed_clk tcxo_clk = {
204 .rate = 19200000,
205 .c = {
206 .dbg_name = "tcxo_clk",
207 .ops = &clk_ops_tcxo,
208 CLK_INIT(tcxo_clk.c),
209 },
210};
211
212static int lpxo_clk_enable(struct clk *clk)
213{
214 return pcom_xo_enable(PCOM_XO_LPXO, PCOM_XO_ENABLE);
215}
216
217static void lpxo_clk_disable(struct clk *clk)
218{
219 pcom_xo_enable(PCOM_XO_LPXO, PCOM_XO_DISABLE);
220}
221
222static struct clk_ops clk_ops_lpxo = {
223 .enable = lpxo_clk_enable,
224 .disable = lpxo_clk_disable,
225 .get_rate = fixed_clk_get_rate,
226 .is_local = pcom_is_local,
227};
228
229static struct fixed_clk lpxo_clk = {
230 .rate = 24576000,
231 .c = {
232 .dbg_name = "lpxo_clk",
233 .ops = &clk_ops_lpxo,
234 CLK_INIT(lpxo_clk.c),
235 },
236};
237
238static struct pll_vote_clk pll1_clk = {
239 .rate = 768000000,
240 .en_reg = PLL_ENA_REG,
241 .en_mask = BIT(1),
242 .status_reg = PLL1_STATUS_BASE_REG,
243 .parent = &tcxo_clk.c,
244 .c = {
245 .dbg_name = "pll1_clk",
246 .ops = &clk_ops_pll_vote,
247 CLK_INIT(pll1_clk.c),
248 },
249};
250
251static struct pll_vote_clk pll2_clk = {
252 .rate = 806400000, /* TODO: Support scaling */
253 .en_reg = PLL_ENA_REG,
254 .en_mask = BIT(2),
255 .status_reg = PLL2_STATUS_BASE_REG,
256 .parent = &tcxo_clk.c,
257 .c = {
258 .dbg_name = "pll2_clk",
259 .ops = &clk_ops_pll_vote,
260 CLK_INIT(pll2_clk.c),
261 },
262};
263
264static struct pll_vote_clk pll3_clk = {
265 .rate = 737280000,
266 .en_reg = PLL_ENA_REG,
267 .en_mask = BIT(3),
268 .status_reg = PLL3_STATUS_BASE_REG,
269 .parent = &lpxo_clk.c,
270 .c = {
271 .dbg_name = "pll3_clk",
272 .ops = &clk_ops_pll_vote,
273 CLK_INIT(pll3_clk.c),
274 },
275};
276
277static struct pll_vote_clk pll4_clk = {
278 .rate = 891000000,
279 .en_reg = PLL_ENA_REG,
280 .en_mask = BIT(4),
281 .status_reg = PLL4_STATUS_BASE_REG,
282 .parent = &lpxo_clk.c,
283 .c = {
284 .dbg_name = "pll4_clk",
285 .ops = &clk_ops_pll_vote,
286 CLK_INIT(pll4_clk.c),
287 },
288};
289
290static struct clk_ops clk_ops_branch;
291
292static struct clk_freq_tbl clk_tbl_axi[] = {
293 F_RAW(1, &lpxo_clk.c, 0, 0, 0, 0, NOMINAL, NULL),
294 F_END,
295};
296
297/* For global clocks to be on we must have GLBL_ROOT_ENA set */
298static struct rcg_clk glbl_root_clk = {
299 .b = {
300 .ctl_reg = GLBL_CLK_ENA_SC_REG,
301 .en_mask = BIT(29),
302 .halt_check = NOCHECK,
303 },
304 .freq_tbl = clk_tbl_axi,
305 .set_rate = set_rate_nop,
Matt Wagantall84f43fd2011-08-16 23:28:38 -0700306 .current_freq = &rcg_dummy_freq,
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700307 .set_rate = set_rate_nop,
308 .c = {
309 .dbg_name = "glbl_root_clk",
Matt Wagantall84f43fd2011-08-16 23:28:38 -0700310 .ops = &clk_ops_rcg_7x30,
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700311 CLK_INIT(glbl_root_clk.c),
312 },
313};
314
315/* AXI bridge clocks. */
316static struct branch_clk axi_li_apps_clk = {
317 .b = {
318 .ctl_reg = GLBL_CLK_ENA_SC_REG,
319 .en_mask = BIT(2),
320 .halt_reg = GLBL_CLK_STATE_REG,
321 .halt_check = HALT_VOTED,
322 .halt_bit = 2,
323 },
324 .parent = &glbl_root_clk.c,
325 .c = {
326 .dbg_name = "axi_li_apps_clk",
327 .ops = &clk_ops_branch,
328 CLK_INIT(axi_li_apps_clk.c),
329 },
330};
331
332static struct branch_clk axi_li_adsp_a_clk = {
333 .b = {
334 .ctl_reg = GLBL_CLK_ENA_2_SC_REG,
335 .en_mask = BIT(14),
336 .halt_reg = GLBL_CLK_STATE_2_REG,
337 .halt_check = HALT_VOTED,
338 .halt_bit = 14,
339 },
340 .parent = &axi_li_apps_clk.c,
341 .c = {
342 .dbg_name = "axi_li_adsp_a_clk",
343 .ops = &clk_ops_branch,
344 CLK_INIT(axi_li_adsp_a_clk.c),
345 },
346};
347
348static struct branch_clk axi_li_jpeg_clk = {
349 .b = {
350 .ctl_reg = GLBL_CLK_ENA_2_SC_REG,
351 .en_mask = BIT(19),
352 .halt_reg = GLBL_CLK_STATE_2_REG,
353 .halt_check = HALT_VOTED,
354 .halt_bit = 19,
355 },
356 .parent = &axi_li_apps_clk.c,
357 .c = {
358 .dbg_name = "axi_li_jpeg_clk",
359 .ops = &clk_ops_branch,
360 CLK_INIT(axi_li_jpeg_clk.c),
361 },
362};
363
364static struct branch_clk axi_li_vfe_clk = {
365 .b = {
366 .ctl_reg = GLBL_CLK_ENA_SC_REG,
367 .en_mask = BIT(23),
368 .halt_reg = GLBL_CLK_STATE_REG,
369 .halt_check = HALT_VOTED,
370 .halt_bit = 23,
371 },
372 .parent = &axi_li_apps_clk.c,
373 .c = {
374 .dbg_name = "axi_li_vfe_clk",
375 .ops = &clk_ops_branch,
376 CLK_INIT(axi_li_vfe_clk.c),
377 },
378};
379
380static struct branch_clk axi_mdp_clk = {
381 .b = {
382 .ctl_reg = GLBL_CLK_ENA_2_SC_REG,
383 .en_mask = BIT(29),
384 .halt_reg = GLBL_CLK_STATE_2_REG,
385 .halt_check = HALT_VOTED,
386 .halt_bit = 29,
387 },
388 .parent = &axi_li_apps_clk.c,
389 .c = {
390 .dbg_name = "axi_mdp_clk",
391 .ops = &clk_ops_branch,
392 CLK_INIT(axi_mdp_clk.c),
393 },
394};
395
396static struct branch_clk axi_li_vg_clk = {
397 .b = {
398 .ctl_reg = GLBL_CLK_ENA_SC_REG,
399 .en_mask = BIT(3),
400 .halt_reg = GLBL_CLK_STATE_REG,
401 .halt_check = HALT_VOTED,
402 .halt_bit = 3,
403 },
404 .parent = &glbl_root_clk.c,
405 .c = {
406 .dbg_name = "axi_li_vg_clk",
407 .ops = &clk_ops_branch,
408 CLK_INIT(axi_li_vg_clk.c),
409 },
410};
411
412static struct branch_clk axi_grp_2d_clk = {
413 .b = {
414 .ctl_reg = GLBL_CLK_ENA_SC_REG,
415 .en_mask = BIT(21),
416 .halt_reg = GLBL_CLK_STATE_REG,
417 .halt_check = HALT_VOTED,
418 .halt_bit = 21,
419 },
420 .parent = &axi_li_vg_clk.c,
421 .c = {
422 .dbg_name = "axi_grp_2d_clk",
423 .ops = &clk_ops_branch,
424 CLK_INIT(axi_grp_2d_clk.c),
425 },
426};
427
428static struct branch_clk axi_li_grp_clk = {
429 .b = {
430 .ctl_reg = GLBL_CLK_ENA_SC_REG,
431 .en_mask = BIT(22),
432 .halt_reg = GLBL_CLK_STATE_REG,
433 .halt_check = HALT_VOTED,
434 .halt_bit = 22,
435 },
436 .parent = &axi_li_vg_clk.c,
437 .c = {
438 .dbg_name = "axi_li_grp_clk",
439 .ops = &clk_ops_branch,
440 CLK_INIT(axi_li_grp_clk.c),
441 },
442};
443
444static struct branch_clk axi_mfc_clk = {
445 .b = {
446 .ctl_reg = GLBL_CLK_ENA_2_SC_REG,
447 .en_mask = BIT(20),
448 .halt_reg = GLBL_CLK_STATE_2_REG,
449 .halt_check = HALT_VOTED,
450 .halt_bit = 20,
451 },
452 .parent = &axi_li_vg_clk.c,
453 .c = {
454 .dbg_name = "axi_mfc_clk",
455 .ops = &clk_ops_branch,
456 CLK_INIT(axi_mfc_clk.c),
457 },
458};
459
460static struct branch_clk axi_rotator_clk = {
461 .b = {
462 .ctl_reg = GLBL_CLK_ENA_2_SC_REG,
463 .en_mask = BIT(22),
464 .halt_reg = GLBL_CLK_STATE_2_REG,
465 .halt_check = HALT_VOTED,
466 .halt_bit = 22,
467 .reset_mask = P_AXI_ROTATOR_CLK,
468 },
469 .parent = &axi_li_vg_clk.c,
470 .c = {
471 .dbg_name = "axi_rotator_clk",
472 .ops = &clk_ops_branch,
473 CLK_INIT(axi_rotator_clk.c),
474 },
475};
476
477static struct branch_clk axi_vpe_clk = {
478 .b = {
479 .ctl_reg = GLBL_CLK_ENA_2_SC_REG,
480 .en_mask = BIT(21),
481 .halt_reg = GLBL_CLK_STATE_2_REG,
482 .halt_check = HALT_VOTED,
483 .halt_bit = 21,
484 },
485 .parent = &axi_li_vg_clk.c,
486 .c = {
487 .dbg_name = "axi_vpe_clk",
488 .ops = &clk_ops_branch,
489 CLK_INIT(axi_vpe_clk.c),
490 },
491};
492
493/* Peripheral bus clocks. */
494static struct branch_clk adm_clk = {
495 .b = {
496 .ctl_reg = GLBL_CLK_ENA_SC_REG,
497 .en_mask = BIT(5),
498 .halt_reg = GLBL_CLK_STATE_REG,
499 .halt_check = HALT_VOTED,
500 .halt_bit = 5,
501 .reset_mask = P_ADM_CLK,
502 },
503 .parent = &axi_li_apps_clk.c,
504 .c = {
505 .dbg_name = "adm_clk",
506 .ops = &clk_ops_branch,
507 CLK_INIT(adm_clk.c),
508 },
509};
510
511static struct branch_clk adm_p_clk = {
512 .b = {
513 .ctl_reg = GLBL_CLK_ENA_2_SC_REG,
514 .en_mask = BIT(15),
515 .halt_reg = GLBL_CLK_STATE_2_REG,
516 .halt_check = HALT_VOTED,
517 .halt_bit = 15,
518 },
519 .parent = &glbl_root_clk.c,
520 .c = {
521 .dbg_name = "adm_p_clk",
522 .ops = &clk_ops_branch,
523 CLK_INIT(adm_p_clk.c),
524 },
525};
526
527static struct branch_clk ce_clk = {
528 .b = {
529 .ctl_reg = GLBL_CLK_ENA_SC_REG,
530 .en_mask = BIT(6),
531 .halt_reg = GLBL_CLK_STATE_REG,
532 .halt_check = HALT_VOTED,
533 .halt_bit = 6,
534 .reset_mask = P_CE_CLK,
535 },
536 .parent = &glbl_root_clk.c,
537 .c = {
538 .dbg_name = "ce_clk",
539 .ops = &clk_ops_branch,
540 CLK_INIT(ce_clk.c),
541 },
542};
543
544static struct branch_clk camif_pad_p_clk = {
545 .b = {
546 .ctl_reg = GLBL_CLK_ENA_SC_REG,
547 .en_mask = BIT(9),
548 .halt_reg = GLBL_CLK_STATE_REG,
549 .halt_check = HALT_VOTED,
550 .halt_bit = 9,
551 .reset_mask = P_CAMIF_PAD_P_CLK,
552 },
553 .parent = &glbl_root_clk.c,
554 .c = {
555 .dbg_name = "camif_pad_p_clk",
556 .ops = &clk_ops_branch,
557 CLK_INIT(camif_pad_p_clk.c),
558 },
559};
560
561static struct branch_clk csi0_p_clk = {
562 .b = {
563 .ctl_reg = GLBL_CLK_ENA_SC_REG,
564 .en_mask = BIT(30),
565 .halt_reg = GLBL_CLK_STATE_REG,
566 .halt_check = HALT_VOTED,
567 .halt_bit = 30,
568 .reset_mask = P_CSI0_P_CLK,
569 },
570 .parent = &glbl_root_clk.c,
571 .c = {
572 .dbg_name = "csi0_p_clk",
573 .ops = &clk_ops_branch,
574 CLK_INIT(csi0_p_clk.c),
575 },
576};
577
578static struct branch_clk emdh_p_clk = {
579 .b = {
580 .ctl_reg = GLBL_CLK_ENA_2_SC_REG,
581 .en_mask = BIT(3),
582 .halt_reg = GLBL_CLK_STATE_2_REG,
583 .halt_check = HALT_VOTED,
584 .halt_bit = 3,
585 .reset_mask = P_EMDH_P_CLK,
586 },
587 .parent = &glbl_root_clk.c,
588 .c = {
589 .dbg_name = "emdh_p_clk",
590 .ops = &clk_ops_branch,
591 CLK_INIT(emdh_p_clk.c),
592 },
593};
594
595static struct branch_clk grp_2d_p_clk = {
596 .b = {
597 .ctl_reg = GLBL_CLK_ENA_SC_REG,
598 .en_mask = BIT(24),
599 .halt_reg = GLBL_CLK_STATE_REG,
600 .halt_check = HALT_VOTED,
601 .halt_bit = 24,
602 .reset_mask = P_GRP_2D_P_CLK,
603 },
604 .parent = &glbl_root_clk.c,
605 .c = {
606 .dbg_name = "grp_2d_p_clk",
607 .ops = &clk_ops_branch,
608 CLK_INIT(grp_2d_p_clk.c),
609 },
610};
611
612static struct branch_clk grp_3d_p_clk = {
613 .b = {
614 .ctl_reg = GLBL_CLK_ENA_2_SC_REG,
615 .en_mask = BIT(17),
616 .halt_reg = GLBL_CLK_STATE_2_REG,
617 .halt_check = HALT_VOTED,
618 .halt_bit = 17,
619 .reset_mask = P_GRP_3D_P_CLK,
620 },
621 .parent = &glbl_root_clk.c,
622 .c = {
623 .dbg_name = "grp_3d_p_clk",
624 .ops = &clk_ops_branch,
625 CLK_INIT(grp_3d_p_clk.c),
626 },
627};
628
629static struct branch_clk jpeg_p_clk = {
630 .b = {
631 .ctl_reg = GLBL_CLK_ENA_2_SC_REG,
632 .en_mask = BIT(24),
633 .halt_reg = GLBL_CLK_STATE_2_REG,
634 .halt_check = HALT_VOTED,
635 .halt_bit = 24,
636 .reset_mask = P_JPEG_P_CLK,
637 },
638 .parent = &glbl_root_clk.c,
639 .c = {
640 .dbg_name = "jpeg_p_clk",
641 .ops = &clk_ops_branch,
642 CLK_INIT(jpeg_p_clk.c),
643 },
644};
645
646static struct branch_clk lpa_p_clk = {
647 .b = {
648 .ctl_reg = GLBL_CLK_ENA_2_SC_REG,
649 .en_mask = BIT(7),
650 .halt_reg = GLBL_CLK_STATE_2_REG,
651 .halt_check = HALT_VOTED,
652 .halt_bit = 7,
653 .reset_mask = P_LPA_P_CLK,
654 },
655 .parent = &glbl_root_clk.c,
656 .c = {
657 .dbg_name = "lpa_p_clk",
658 .ops = &clk_ops_branch,
659 CLK_INIT(lpa_p_clk.c),
660 },
661};
662
663static struct branch_clk mdp_p_clk = {
664 .b = {
665 .ctl_reg = GLBL_CLK_ENA_2_SC_REG,
666 .en_mask = BIT(6),
667 .halt_reg = GLBL_CLK_STATE_2_REG,
668 .halt_check = HALT_VOTED,
669 .halt_bit = 6,
670 .reset_mask = P_MDP_P_CLK,
671 },
672 .parent = &glbl_root_clk.c,
673 .c = {
674 .dbg_name = "mdp_p_clk",
675 .ops = &clk_ops_branch,
676 CLK_INIT(mdp_p_clk.c),
677 },
678};
679
680static struct branch_clk mfc_p_clk = {
681 .b = {
682 .ctl_reg = GLBL_CLK_ENA_2_SC_REG,
683 .en_mask = BIT(26),
684 .halt_reg = GLBL_CLK_STATE_2_REG,
685 .halt_check = HALT_VOTED,
686 .halt_bit = 26,
687 .reset_mask = P_MFC_P_CLK,
688 },
689 .parent = &glbl_root_clk.c,
690 .c = {
691 .dbg_name = "mfc_p_clk",
692 .ops = &clk_ops_branch,
693 CLK_INIT(mfc_p_clk.c),
694 },
695};
696
697static struct branch_clk pmdh_p_clk = {
698 .b = {
699 .ctl_reg = GLBL_CLK_ENA_2_SC_REG,
700 .en_mask = BIT(4),
701 .halt_reg = GLBL_CLK_STATE_2_REG,
702 .halt_check = HALT_VOTED,
703 .halt_bit = 4,
704 .reset_mask = P_PMDH_P_CLK,
705 },
706 .parent = &glbl_root_clk.c,
707 .c = {
708 .dbg_name = "pmdh_p_clk",
709 .ops = &clk_ops_branch,
710 CLK_INIT(pmdh_p_clk.c),
711 },
712};
713
714static struct branch_clk rotator_imem_clk = {
715 .b = {
716 .ctl_reg = GLBL_CLK_ENA_2_SC_REG,
717 .en_mask = BIT(23),
718 .halt_reg = GLBL_CLK_STATE_2_REG,
719 .halt_check = HALT_VOTED,
720 .halt_bit = 23,
721 .reset_mask = P_ROTATOR_IMEM_CLK,
722 },
723 .parent = &glbl_root_clk.c,
724 .c = {
725 .dbg_name = "rotator_imem_clk",
726 .ops = &clk_ops_branch,
727 CLK_INIT(rotator_imem_clk.c),
728 },
729};
730
731static struct branch_clk rotator_p_clk = {
732 .b = {
733 .ctl_reg = GLBL_CLK_ENA_2_SC_REG,
734 .en_mask = BIT(25),
735 .halt_reg = GLBL_CLK_STATE_2_REG,
736 .halt_check = HALT_VOTED,
737 .halt_bit = 25,
738 .reset_mask = P_ROTATOR_P_CLK,
739 },
740 .parent = &glbl_root_clk.c,
741 .c = {
742 .dbg_name = "rotator_p_clk",
743 .ops = &clk_ops_branch,
744 CLK_INIT(rotator_p_clk.c),
745 },
746};
747
748static struct branch_clk sdc1_p_clk = {
749 .b = {
750 .ctl_reg = GLBL_CLK_ENA_SC_REG,
751 .en_mask = BIT(7),
752 .halt_reg = GLBL_CLK_STATE_REG,
753 .halt_check = HALT_VOTED,
754 .halt_bit = 7,
755 .reset_mask = P_SDC1_P_CLK,
756 },
757 .parent = &glbl_root_clk.c,
758 .c = {
759 .dbg_name = "sdc1_p_clk",
760 .ops = &clk_ops_branch,
761 CLK_INIT(sdc1_p_clk.c),
762 },
763};
764
765static struct branch_clk sdc2_p_clk = {
766 .b = {
767 .ctl_reg = GLBL_CLK_ENA_SC_REG,
768 .en_mask = BIT(8),
769 .halt_reg = GLBL_CLK_STATE_REG,
770 .halt_check = HALT_VOTED,
771 .halt_bit = 8,
772 .reset_mask = P_SDC2_P_CLK,
773 },
774 .parent = &glbl_root_clk.c,
775 .c = {
776 .dbg_name = "sdc2_p_clk",
777 .ops = &clk_ops_branch,
778 CLK_INIT(sdc2_p_clk.c),
779 },
780};
781
782static struct branch_clk sdc3_p_clk = {
783 .b = {
784 .ctl_reg = GLBL_CLK_ENA_SC_REG,
785 .en_mask = BIT(27),
786 .halt_reg = GLBL_CLK_STATE_REG,
787 .halt_check = HALT_VOTED,
788 .halt_bit = 27,
789 .reset_mask = P_SDC3_P_CLK,
790 },
791 .parent = &glbl_root_clk.c,
792 .c = {
793 .dbg_name = "sdc3_p_clk",
794 .ops = &clk_ops_branch,
795 CLK_INIT(sdc3_p_clk.c),
796 },
797};
798
799static struct branch_clk sdc4_p_clk = {
800 .b = {
801 .ctl_reg = GLBL_CLK_ENA_SC_REG,
802 .en_mask = BIT(28),
803 .halt_reg = GLBL_CLK_STATE_REG,
804 .halt_check = HALT_VOTED,
805 .halt_bit = 28,
806 .reset_mask = P_SDC4_P_CLK,
807 },
808 .parent = &glbl_root_clk.c,
809 .c = {
810 .dbg_name = "sdc4_p_clk",
811 .ops = &clk_ops_branch,
812 CLK_INIT(sdc4_p_clk.c),
813 },
814};
815
816static struct branch_clk spi_p_clk = {
817 .b = {
818 .ctl_reg = GLBL_CLK_ENA_2_SC_REG,
819 .en_mask = BIT(10),
820 .halt_reg = GLBL_CLK_STATE_2_REG,
821 .halt_check = HALT_VOTED,
822 .halt_bit = 10,
823 .reset_mask = P_SPI_P_CLK,
824 },
825 .parent = &glbl_root_clk.c,
826 .c = {
827 .dbg_name = "spi_p_clk",
828 .ops = &clk_ops_branch,
829 CLK_INIT(spi_p_clk.c),
830 },
831};
832
833static struct branch_clk tsif_p_clk = {
834 .b = {
835 .ctl_reg = GLBL_CLK_ENA_SC_REG,
836 .en_mask = BIT(18),
837 .halt_reg = GLBL_CLK_STATE_REG,
838 .halt_check = HALT_VOTED,
839 .halt_bit = 18,
840 .reset_mask = P_TSIF_P_CLK,
841 },
842 .parent = &glbl_root_clk.c,
843 .c = {
844 .dbg_name = "tsif_p_clk",
845 .ops = &clk_ops_branch,
846 CLK_INIT(tsif_p_clk.c),
847 },
848};
849
850static struct branch_clk uart1dm_p_clk = {
851 .b = {
852 .ctl_reg = GLBL_CLK_ENA_SC_REG,
853 .en_mask = BIT(17),
854 .halt_reg = GLBL_CLK_STATE_REG,
855 .halt_check = HALT_VOTED,
856 .halt_bit = 17,
857 },
858 .parent = &glbl_root_clk.c,
859 .c = {
860 .dbg_name = "uart1dm_p_clk",
861 .ops = &clk_ops_branch,
862 CLK_INIT(uart1dm_p_clk.c),
863 },
864};
865
866static struct branch_clk uart2dm_p_clk = {
867 .b = {
868 .ctl_reg = GLBL_CLK_ENA_SC_REG,
869 .en_mask = BIT(26),
870 .halt_reg = GLBL_CLK_STATE_REG,
871 .halt_check = HALT_VOTED,
872 .halt_bit = 26,
873 },
874 .parent = &glbl_root_clk.c,
875 .c = {
876 .dbg_name = "uart2dm_p_clk",
877 .ops = &clk_ops_branch,
878 CLK_INIT(uart2dm_p_clk.c),
879 },
880};
881
882static struct branch_clk usb_hs2_p_clk = {
883 .b = {
884 .ctl_reg = GLBL_CLK_ENA_2_SC_REG,
885 .en_mask = BIT(8),
886 .halt_reg = GLBL_CLK_STATE_2_REG,
887 .halt_check = HALT_VOTED,
888 .halt_bit = 8,
889 .reset_mask = P_USB_HS2_P_CLK,
890 },
891 .parent = &glbl_root_clk.c,
892 .c = {
893 .dbg_name = "usb_hs2_p_clk",
894 .ops = &clk_ops_branch,
895 CLK_INIT(usb_hs2_p_clk.c),
896 },
897};
898
899static struct branch_clk usb_hs3_p_clk = {
900 .b = {
901 .ctl_reg = GLBL_CLK_ENA_2_SC_REG,
902 .en_mask = BIT(9),
903 .halt_reg = GLBL_CLK_STATE_2_REG,
904 .halt_check = HALT_VOTED,
905 .halt_bit = 9,
906 .reset_mask = P_USB_HS3_P_CLK,
907 },
908 .parent = &glbl_root_clk.c,
909 .c = {
910 .dbg_name = "usb_hs3_p_clk",
911 .ops = &clk_ops_branch,
912 CLK_INIT(usb_hs3_p_clk.c),
913 },
914};
915
916static struct branch_clk usb_hs_p_clk = {
917 .b = {
918 .ctl_reg = GLBL_CLK_ENA_SC_REG,
919 .en_mask = BIT(25),
920 .halt_reg = GLBL_CLK_STATE_REG,
921 .halt_check = HALT_VOTED,
922 .halt_bit = 25,
923 .reset_mask = P_USB_HS_P_CLK,
924 },
925 .parent = &glbl_root_clk.c,
926 .c = {
927 .dbg_name = "usb_hs_p_clk",
928 .ops = &clk_ops_branch,
929 CLK_INIT(usb_hs_p_clk.c),
930 },
931};
932
933static struct branch_clk vfe_p_clk = {
934 .b = {
935 .ctl_reg = GLBL_CLK_ENA_2_SC_REG,
936 .en_mask = BIT(27),
937 .halt_reg = GLBL_CLK_STATE_2_REG,
938 .halt_check = HALT_VOTED,
939 .halt_bit = 27,
940 .reset_mask = P_VFE_P_CLK,
941 },
942 .parent = &glbl_root_clk.c,
943 .c = {
944 .dbg_name = "vfe_p_clk",
945 .ops = &clk_ops_branch,
946 CLK_INIT(vfe_p_clk.c),
947 },
948};
949
950static struct clk_freq_tbl clk_tbl_csi[] = {
951 F_MND8( 0, 0, 0, gnd, 1, 0, 0, NONE),
952 F_MND8(153600000, 24, 17, pll1, 2, 2, 5, NOMINAL),
953 F_MND8(192000000, 24, 17, pll1, 4, 0, 0, NOMINAL),
954 F_MND8(384000000, 24, 17, pll1, 2, 0, 0, NOMINAL),
955 F_END,
956};
957
958static struct rcg_clk csi0_clk = {
959 .b = {
960 .ctl_reg = CSI_NS_REG,
961 .en_mask = BIT(9),
962 .halt_reg = CLK_HALT_STATEC_REG,
963 .halt_bit = 17,
964 .reset_mask = P_CSI0_CLK,
965 },
966 .ns_reg = CSI_NS_REG,
967 .md_reg = CSI_NS_REG - 4,
968 .ns_mask = F_MASK_MND8(24, 17),
969 .root_en_mask = BIT(11),
970 .freq_tbl = clk_tbl_csi,
Matt Wagantall84f43fd2011-08-16 23:28:38 -0700971 .current_freq = &rcg_dummy_freq,
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700972 .set_rate = set_rate_mnd,
973 .c = {
974 .dbg_name = "csi0_clk",
Matt Wagantall84f43fd2011-08-16 23:28:38 -0700975 .ops = &clk_ops_rcg_7x30,
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700976 CLK_INIT(csi0_clk.c),
977 },
978};
979
980static struct clk_freq_tbl clk_tbl_tcxo[] = {
981 F_RAW(19200000, &tcxo_clk.c, 0, 0, 0, 0, NOMINAL, NULL),
982 F_END,
983};
984
985static struct rcg_clk i2c_clk = {
986 .b = {
987 .ctl_reg = I2C_NS_REG,
988 .en_mask = BIT(9),
989 .halt_reg = CLK_HALT_STATEA_REG,
990 .halt_bit = 15,
991 .reset_mask = P_I2C_CLK,
992 },
993 .set_rate = set_rate_nop,
994 .freq_tbl = clk_tbl_tcxo,
995 .root_en_mask = BIT(11),
Matt Wagantall84f43fd2011-08-16 23:28:38 -0700996 .current_freq = &rcg_dummy_freq,
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700997 .c = {
998 .dbg_name = "i2c_clk",
Matt Wagantall84f43fd2011-08-16 23:28:38 -0700999 .ops = &clk_ops_rcg_7x30,
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07001000 CLK_INIT(i2c_clk.c),
1001 },
1002};
1003
1004static struct rcg_clk i2c_2_clk = {
1005 .b = {
1006 .ctl_reg = I2C_2_NS_REG,
1007 .en_mask = BIT(0),
1008 .halt_reg = CLK_HALT_STATEC_REG,
1009 .halt_bit = 2,
1010 .reset_mask = P_I2C_2_CLK,
1011 },
1012 .root_en_mask = BIT(2),
1013 .freq_tbl = clk_tbl_tcxo,
1014 .set_rate = set_rate_nop,
Matt Wagantall84f43fd2011-08-16 23:28:38 -07001015 .current_freq = &rcg_dummy_freq,
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07001016 .c = {
1017 .dbg_name = "i2c_2_clk",
Matt Wagantall84f43fd2011-08-16 23:28:38 -07001018 .ops = &clk_ops_rcg_7x30,
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07001019 CLK_INIT(i2c_2_clk.c),
1020 },
1021};
1022
1023static struct rcg_clk qup_i2c_clk = {
1024 .b = {
1025 .ctl_reg = QUP_I2C_NS_REG,
1026 .en_mask = BIT(0),
1027 .halt_reg = CLK_HALT_STATEB_REG,
1028 .halt_bit = 31,
1029 .reset_mask = P_QUP_I2C_CLK,
1030 },
1031 .root_en_mask = BIT(2),
1032 .freq_tbl = clk_tbl_tcxo,
1033 .set_rate = set_rate_nop,
Matt Wagantall84f43fd2011-08-16 23:28:38 -07001034 .current_freq = &rcg_dummy_freq,
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07001035 .c = {
1036 .dbg_name = "qup_i2c_clk",
Matt Wagantall84f43fd2011-08-16 23:28:38 -07001037 .ops = &clk_ops_rcg_7x30,
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07001038 CLK_INIT(qup_i2c_clk.c),
1039 },
1040};
1041
1042static struct rcg_clk uart1_clk = {
1043 .b = {
1044 .ctl_reg = UART_NS_REG,
1045 .en_mask = BIT(5),
1046 .halt_reg = CLK_HALT_STATEB_REG,
1047 .halt_bit = 7,
1048 .reset_mask = P_UART1_CLK,
1049 },
1050 .root_en_mask = BIT(4),
1051 .freq_tbl = clk_tbl_tcxo,
1052 .set_rate = set_rate_nop,
Matt Wagantall84f43fd2011-08-16 23:28:38 -07001053 .current_freq = &rcg_dummy_freq,
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07001054 .c = {
1055 .dbg_name = "uart1_clk",
Matt Wagantall84f43fd2011-08-16 23:28:38 -07001056 .ops = &clk_ops_rcg_7x30,
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07001057 CLK_INIT(uart1_clk.c),
1058 },
1059};
1060
1061static struct rcg_clk uart2_clk = {
1062 .b = {
1063 .ctl_reg = UART2_NS_REG,
1064 .en_mask = BIT(5),
1065 .halt_reg = CLK_HALT_STATEB_REG,
1066 .halt_bit = 5,
1067 .reset_mask = P_UART2_CLK,
1068 },
1069 .root_en_mask = BIT(4),
1070 .freq_tbl = clk_tbl_tcxo,
1071 .set_rate = set_rate_nop,
Matt Wagantall84f43fd2011-08-16 23:28:38 -07001072 .current_freq = &rcg_dummy_freq,
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07001073 .c = {
1074 .dbg_name = "uart2_clk",
Matt Wagantall84f43fd2011-08-16 23:28:38 -07001075 .ops = &clk_ops_rcg_7x30,
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07001076 CLK_INIT(uart2_clk.c),
1077 },
1078};
1079
1080static struct clk_freq_tbl clk_tbl_uartdm[] = {
1081 F_MND16( 0, gnd, 1, 0, 0, NONE),
1082 F_MND16( 3686400, pll3, 3, 3, 200, NOMINAL),
1083 F_MND16( 7372800, pll3, 3, 3, 100, NOMINAL),
1084 F_MND16(14745600, pll3, 3, 3, 50, NOMINAL),
1085 F_MND16(32000000, pll3, 3, 25, 192, NOMINAL),
1086 F_MND16(40000000, pll3, 3, 125, 768, NOMINAL),
1087 F_MND16(46400000, pll3, 3, 145, 768, NOMINAL),
1088 F_MND16(48000000, pll3, 3, 25, 128, NOMINAL),
1089 F_MND16(51200000, pll3, 3, 5, 24, NOMINAL),
1090 F_MND16(56000000, pll3, 3, 175, 768, NOMINAL),
1091 F_MND16(58982400, pll3, 3, 6, 25, NOMINAL),
1092 F_MND16(64000000, pll1, 4, 1, 3, NOMINAL),
1093 F_END,
1094};
1095
1096static struct rcg_clk uart1dm_clk = {
1097 .b = {
1098 .ctl_reg = UART1DM_NS_REG,
1099 .en_mask = BIT(9),
1100 .halt_reg = CLK_HALT_STATEB_REG,
1101 .halt_bit = 6,
1102 .reset_mask = P_UART1DM_CLK,
1103 },
1104 .ns_reg = UART1DM_NS_REG,
1105 .md_reg = UART1DM_NS_REG - 4,
1106 .root_en_mask = BIT(11),
1107 .freq_tbl = clk_tbl_uartdm,
1108 .ns_mask = F_MASK_MND16,
Matt Wagantall84f43fd2011-08-16 23:28:38 -07001109 .current_freq = &rcg_dummy_freq,
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07001110 .set_rate = set_rate_mnd,
1111 .c = {
1112 .dbg_name = "uart1dm_clk",
Matt Wagantall84f43fd2011-08-16 23:28:38 -07001113 .ops = &clk_ops_rcg_7x30,
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07001114 CLK_INIT(uart1dm_clk.c),
1115 },
1116};
1117
1118static struct rcg_clk uart2dm_clk = {
1119 .b = {
1120 .ctl_reg = UART2DM_NS_REG,
1121 .en_mask = BIT(9),
1122 .halt_reg = CLK_HALT_STATEB_REG,
1123 .halt_bit = 23,
1124 .reset_mask = P_UART2DM_CLK,
1125 },
1126 .ns_reg = UART2DM_NS_REG,
1127 .md_reg = UART2DM_NS_REG - 4,
1128 .root_en_mask = BIT(11),
1129 .freq_tbl = clk_tbl_uartdm,
1130 .ns_mask = F_MASK_MND16,
1131 .set_rate = set_rate_mnd,
Matt Wagantall84f43fd2011-08-16 23:28:38 -07001132 .current_freq = &rcg_dummy_freq,
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07001133 .c = {
1134 .dbg_name = "uart2dm_clk",
Matt Wagantall84f43fd2011-08-16 23:28:38 -07001135 .ops = &clk_ops_rcg_7x30,
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07001136 CLK_INIT(uart2dm_clk.c),
1137 },
1138};
1139
1140static struct clk_freq_tbl clk_tbl_mdh[] = {
1141 F_BASIC( 0, gnd, 1, NONE),
1142 F_BASIC( 49150000, pll3, 15, NOMINAL),
1143 F_BASIC( 92160000, pll3, 8, NOMINAL),
1144 F_BASIC(122880000, pll3, 6, NOMINAL),
1145 F_BASIC(184320000, pll3, 4, NOMINAL),
1146 F_BASIC(245760000, pll3, 3, NOMINAL),
1147 F_BASIC(368640000, pll3, 2, NOMINAL),
1148 F_BASIC(384000000, pll1, 2, NOMINAL),
1149 F_BASIC(445500000, pll4, 2, NOMINAL),
1150 F_END,
1151};
1152
1153static struct rcg_clk emdh_clk = {
1154 .b = {
1155 .ctl_reg = EMDH_NS_REG,
1156 .halt_check = DELAY,
1157 .reset_mask = P_EMDH_CLK,
1158 },
1159 .root_en_mask = BIT(11),
1160 .ns_reg = EMDH_NS_REG,
1161 .ns_mask = F_MASK_BASIC,
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07001162 .set_rate = set_rate_nop,
1163 .freq_tbl = clk_tbl_mdh,
Matt Wagantall84f43fd2011-08-16 23:28:38 -07001164 .current_freq = &rcg_dummy_freq,
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07001165 .c = {
1166 .dbg_name = "emdh_clk",
1167 .flags = CLKFLAG_MIN | CLKFLAG_MAX,
Matt Wagantall84f43fd2011-08-16 23:28:38 -07001168 .ops = &clk_ops_rcg_7x30,
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07001169 CLK_INIT(emdh_clk.c),
Stephen Boyd7fa26742011-08-11 23:22:29 -07001170 .depends = &axi_li_adsp_a_clk.c,
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07001171 },
1172};
1173
1174static struct rcg_clk pmdh_clk = {
1175 .b = {
1176 .ctl_reg = PMDH_NS_REG,
1177 .halt_check = DELAY,
1178 .reset_mask = P_PMDH_CLK,
1179 },
1180 .root_en_mask = BIT(11),
1181 .ns_reg = PMDH_NS_REG,
1182 .ns_mask = F_MASK_BASIC,
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07001183 .set_rate = set_rate_nop,
1184 .freq_tbl = clk_tbl_mdh,
Matt Wagantall84f43fd2011-08-16 23:28:38 -07001185 .current_freq = &rcg_dummy_freq,
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07001186 .c = {
1187 .dbg_name = "pmdh_clk",
1188 .flags = CLKFLAG_MIN | CLKFLAG_MAX,
Matt Wagantall84f43fd2011-08-16 23:28:38 -07001189 .ops = &clk_ops_rcg_7x30,
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07001190 CLK_INIT(pmdh_clk.c),
Stephen Boyd7fa26742011-08-11 23:22:29 -07001191 .depends = &axi_li_adsp_a_clk.c,
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07001192 },
1193};
1194
1195static struct clk_freq_tbl clk_tbl_grp[] = {
1196 F_BASIC( 24576000, lpxo, 1, NOMINAL),
1197 F_BASIC( 46080000, pll3, 16, NOMINAL),
1198 F_BASIC( 49152000, pll3, 15, NOMINAL),
1199 F_BASIC( 52662875, pll3, 14, NOMINAL),
1200 F_BASIC( 56713846, pll3, 13, NOMINAL),
1201 F_BASIC( 61440000, pll3, 12, NOMINAL),
1202 F_BASIC( 67025454, pll3, 11, NOMINAL),
1203 F_BASIC( 73728000, pll3, 10, NOMINAL),
1204 F_BASIC( 81920000, pll3, 9, NOMINAL),
1205 F_BASIC( 92160000, pll3, 8, NOMINAL),
1206 F_BASIC(105325714, pll3, 7, NOMINAL),
1207 F_BASIC(122880000, pll3, 6, NOMINAL),
1208 F_BASIC(147456000, pll3, 5, NOMINAL),
1209 F_BASIC(184320000, pll3, 4, NOMINAL),
1210 F_BASIC(192000000, pll1, 4, NOMINAL),
1211 F_BASIC(245760000, pll3, 3, HIGH),
1212 /* Sync to AXI. Hence this "rate" is not fixed. */
1213 F_RAW(1, &lpxo_clk.c, 0, BIT(14), 0, 0, NOMINAL, NULL),
1214 F_END,
1215};
1216
1217static struct rcg_clk grp_2d_clk = {
1218 .b = {
1219 .ctl_reg = GRP_2D_NS_REG,
1220 .en_mask = BIT(7),
1221 .halt_reg = CLK_HALT_STATEA_REG,
1222 .halt_bit = 31,
1223 .reset_mask = P_GRP_2D_CLK,
1224 },
1225 .ns_reg = GRP_2D_NS_REG,
1226 .root_en_mask = BIT(11),
1227 .ns_mask = F_MASK_BASIC | (7 << 12),
1228 .set_rate = set_rate_nop,
1229 .freq_tbl = clk_tbl_grp,
Matt Wagantall84f43fd2011-08-16 23:28:38 -07001230 .current_freq = &rcg_dummy_freq,
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07001231 .c = {
1232 .dbg_name = "grp_2d_clk",
Matt Wagantall84f43fd2011-08-16 23:28:38 -07001233 .ops = &clk_ops_rcg_7x30,
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07001234 CLK_INIT(grp_2d_clk.c),
Stephen Boyd7fa26742011-08-11 23:22:29 -07001235 .depends = &axi_grp_2d_clk.c,
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07001236 },
1237};
1238
1239static struct rcg_clk grp_3d_src_clk = {
1240 .ns_reg = GRP_NS_REG,
1241 .b = {
1242 .ctl_reg = GRP_NS_REG,
1243 .halt_check = NOCHECK,
1244 },
1245 .root_en_mask = BIT(11),
1246 .ns_mask = F_MASK_BASIC | (7 << 12),
1247 .set_rate = set_rate_nop,
1248 .freq_tbl = clk_tbl_grp,
Matt Wagantall84f43fd2011-08-16 23:28:38 -07001249 .current_freq = &rcg_dummy_freq,
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07001250 .c = {
1251 .dbg_name = "grp_3d_src_clk",
Matt Wagantall84f43fd2011-08-16 23:28:38 -07001252 .ops = &clk_ops_rcg_7x30,
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07001253 CLK_INIT(grp_3d_src_clk.c),
Stephen Boyd7fa26742011-08-11 23:22:29 -07001254 .depends = &axi_li_grp_clk.c,
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07001255 },
1256};
1257
1258static struct branch_clk grp_3d_clk = {
1259 .b = {
1260 .ctl_reg = GRP_NS_REG,
1261 .en_mask = BIT(7),
1262 .halt_reg = CLK_HALT_STATEB_REG,
1263 .halt_bit = 18,
1264 .reset_mask = P_GRP_3D_CLK,
1265 },
1266 .parent = &grp_3d_src_clk.c,
1267 .c = {
1268 .dbg_name = "grp_3d_clk",
1269 .ops = &clk_ops_branch,
1270 CLK_INIT(grp_3d_clk.c),
1271 },
1272};
1273
1274static struct branch_clk imem_clk = {
1275 .b = {
1276 .ctl_reg = GRP_NS_REG,
1277 .en_mask = BIT(9),
1278 .halt_reg = CLK_HALT_STATEB_REG,
1279 .halt_bit = 19,
1280 .reset_mask = P_IMEM_CLK,
1281 },
1282 .parent = &grp_3d_src_clk.c,
1283 .c = {
1284 .dbg_name = "imem_clk",
1285 .ops = &clk_ops_branch,
1286 CLK_INIT(imem_clk.c),
1287 },
1288};
1289
1290static struct clk_freq_tbl clk_tbl_sdc1_3[] = {
1291 F_MND8( 0, 0, 0, gnd, 1, 0, 0, NONE),
1292 F_MND8( 144000, 19, 12, lpxo, 1, 1, 171, NOMINAL),
1293 F_MND8( 400000, 19, 12, lpxo, 1, 2, 123, NOMINAL),
1294 F_MND8(16027000, 19, 12, pll3, 3, 14, 215, NOMINAL),
1295 F_MND8(17000000, 19, 12, pll3, 4, 19, 206, NOMINAL),
1296 F_MND8(20480000, 19, 12, pll3, 4, 23, 212, NOMINAL),
1297 F_MND8(24576000, 19, 12, lpxo, 1, 0, 0, NOMINAL),
1298 F_MND8(49152000, 19, 12, pll3, 3, 1, 5, NOMINAL),
1299 F_END,
1300};
1301
1302static struct rcg_clk sdc1_clk = {
1303 .b = {
1304 .ctl_reg = SDCn_NS_REG(1),
1305 .en_mask = BIT(9),
1306 .halt_reg = CLK_HALT_STATEA_REG,
1307 .halt_bit = 1,
1308 .reset_mask = P_SDC1_CLK,
1309 },
1310 .ns_reg = SDCn_NS_REG(1),
1311 .md_reg = SDCn_NS_REG(1) - 4,
1312 .ns_mask = F_MASK_MND8(19, 12),
1313 .root_en_mask = BIT(11),
1314 .freq_tbl = clk_tbl_sdc1_3,
Matt Wagantall84f43fd2011-08-16 23:28:38 -07001315 .current_freq = &rcg_dummy_freq,
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07001316 .set_rate = set_rate_mnd,
1317 .c = {
1318 .dbg_name = "sdc1_clk",
Matt Wagantall84f43fd2011-08-16 23:28:38 -07001319 .ops = &clk_ops_rcg_7x30,
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07001320 CLK_INIT(sdc1_clk.c),
1321 },
1322};
1323
1324static struct rcg_clk sdc3_clk = {
1325 .b = {
1326 .ctl_reg = SDCn_NS_REG(3),
1327 .en_mask = BIT(9),
1328 .halt_reg = CLK_HALT_STATEB_REG,
1329 .halt_bit = 24,
1330 .reset_mask = P_SDC3_CLK,
1331 },
1332 .ns_reg = SDCn_NS_REG(3),
1333 .md_reg = SDCn_NS_REG(3) - 4,
1334 .ns_mask = F_MASK_MND8(19, 12),
1335 .root_en_mask = BIT(11),
1336 .freq_tbl = clk_tbl_sdc1_3,
Matt Wagantall84f43fd2011-08-16 23:28:38 -07001337 .current_freq = &rcg_dummy_freq,
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07001338 .set_rate = set_rate_mnd,
1339 .c = {
1340 .dbg_name = "sdc3_clk",
Matt Wagantall84f43fd2011-08-16 23:28:38 -07001341 .ops = &clk_ops_rcg_7x30,
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07001342 CLK_INIT(sdc3_clk.c),
1343 },
1344};
1345
1346static struct clk_freq_tbl clk_tbl_sdc2_4[] = {
1347 F_MND8( 0, 0, 0, gnd, 1, 0, 0, NONE),
1348 F_MND8( 144000, 20, 13, lpxo, 1, 1, 171, NOMINAL),
1349 F_MND8( 400000, 20, 13, lpxo, 1, 2, 123, NOMINAL),
1350 F_MND8(16027000, 20, 13, pll3, 3, 14, 215, NOMINAL),
1351 F_MND8(17000000, 20, 13, pll3, 4, 19, 206, NOMINAL),
1352 F_MND8(20480000, 20, 13, pll3, 4, 23, 212, NOMINAL),
1353 F_MND8(24576000, 20, 13, lpxo, 1, 0, 0, NOMINAL),
1354 F_MND8(49152000, 20, 13, pll3, 3, 1, 5, NOMINAL),
1355 F_END,
1356};
1357
1358static struct rcg_clk sdc2_clk = {
1359 .b = {
1360 .ctl_reg = SDCn_NS_REG(2),
1361 .en_mask = BIT(9),
1362 .halt_reg = CLK_HALT_STATEA_REG,
1363 .halt_bit = 0,
1364 .reset_mask = P_SDC2_CLK,
1365 },
1366 .ns_reg = SDCn_NS_REG(2),
1367 .md_reg = SDCn_NS_REG(2) - 4,
1368 .ns_mask = F_MASK_MND8(20, 13),
1369 .root_en_mask = BIT(11),
1370 .freq_tbl = clk_tbl_sdc2_4,
Matt Wagantall84f43fd2011-08-16 23:28:38 -07001371 .current_freq = &rcg_dummy_freq,
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07001372 .set_rate = set_rate_mnd,
1373 .c = {
1374 .dbg_name = "sdc2_clk",
Matt Wagantall84f43fd2011-08-16 23:28:38 -07001375 .ops = &clk_ops_rcg_7x30,
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07001376 CLK_INIT(sdc2_clk.c),
1377 },
1378};
1379
1380static struct rcg_clk sdc4_clk = {
1381 .b = {
1382 .ctl_reg = SDCn_NS_REG(4),
1383 .en_mask = BIT(9),
1384 .halt_reg = CLK_HALT_STATEB_REG,
1385 .halt_bit = 25,
1386 .reset_mask = P_SDC4_CLK,
1387 },
1388 .ns_reg = SDCn_NS_REG(4),
1389 .md_reg = SDCn_NS_REG(4) - 4,
1390 .ns_mask = F_MASK_MND8(20, 13),
1391 .root_en_mask = BIT(11),
1392 .freq_tbl = clk_tbl_sdc2_4,
Matt Wagantall84f43fd2011-08-16 23:28:38 -07001393 .current_freq = &rcg_dummy_freq,
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07001394 .set_rate = set_rate_mnd,
1395 .c = {
1396 .dbg_name = "sdc4_clk",
Matt Wagantall84f43fd2011-08-16 23:28:38 -07001397 .ops = &clk_ops_rcg_7x30,
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07001398 CLK_INIT(sdc4_clk.c),
1399 },
1400};
1401
1402static struct clk_freq_tbl clk_tbl_mdp_core[] = {
1403 F_BASIC( 24576000, lpxo, 1, NOMINAL),
1404 F_BASIC( 46080000, pll3, 16, NOMINAL),
1405 F_BASIC( 49152000, pll3, 15, NOMINAL),
1406 F_BASIC( 52663000, pll3, 14, NOMINAL),
1407 F_BASIC( 92160000, pll3, 8, NOMINAL),
1408 F_BASIC(122880000, pll3, 6, NOMINAL),
1409 F_BASIC(147456000, pll3, 5, NOMINAL),
1410 F_BASIC(153600000, pll1, 5, NOMINAL),
1411 F_BASIC(192000000, pll1, 4, HIGH),
1412 F_END,
1413};
1414
1415static struct rcg_clk mdp_clk = {
1416 .b = {
1417 .ctl_reg = MDP_NS_REG,
1418 .en_mask = BIT(9),
1419 .halt_reg = CLK_HALT_STATEB_REG,
1420 .halt_bit = 16,
1421 .reset_mask = P_MDP_CLK,
1422 },
1423 .ns_reg = MDP_NS_REG,
1424 .root_en_mask = BIT(11),
1425 .ns_mask = F_MASK_BASIC,
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07001426 .set_rate = set_rate_nop,
1427 .freq_tbl = clk_tbl_mdp_core,
Matt Wagantall84f43fd2011-08-16 23:28:38 -07001428 .current_freq = &rcg_dummy_freq,
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07001429 .c = {
1430 .dbg_name = "mdp_clk",
Matt Wagantall84f43fd2011-08-16 23:28:38 -07001431 .ops = &clk_ops_rcg_7x30,
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07001432 CLK_INIT(mdp_clk.c),
Stephen Boyd7fa26742011-08-11 23:22:29 -07001433 .depends = &axi_mdp_clk.c,
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07001434 },
1435};
1436
1437static struct clk_freq_tbl clk_tbl_mdp_lcdc[] = {
1438 F_MND16( 0, gnd, 1, 0, 0, NONE),
1439 F_MND16(24576000, lpxo, 1, 0, 0, NOMINAL),
1440 F_MND16(30720000, pll3, 4, 1, 6, NOMINAL),
1441 F_MND16(32768000, pll3, 3, 2, 15, NOMINAL),
1442 F_MND16(40960000, pll3, 2, 1, 9, NOMINAL),
1443 F_MND16(73728000, pll3, 2, 1, 5, NOMINAL),
1444 F_END,
1445};
1446
1447static struct rcg_clk mdp_lcdc_pclk_clk = {
1448 .b = {
1449 .ctl_reg = MDP_LCDC_NS_REG,
1450 .en_mask = BIT(9),
1451 .halt_reg = CLK_HALT_STATEB_REG,
1452 .halt_bit = 28,
1453 .reset_mask = P_MDP_LCDC_PCLK_CLK,
1454 },
1455 .ns_reg = MDP_LCDC_NS_REG,
1456 .md_reg = MDP_LCDC_NS_REG - 4,
1457 .root_en_mask = BIT(11),
1458 .ns_mask = F_MASK_MND16,
1459 .set_rate = set_rate_mnd,
1460 .freq_tbl = clk_tbl_mdp_lcdc,
Matt Wagantall84f43fd2011-08-16 23:28:38 -07001461 .current_freq = &rcg_dummy_freq,
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07001462 .c = {
1463 .dbg_name = "mdp_lcdc_pclk_clk",
Matt Wagantall84f43fd2011-08-16 23:28:38 -07001464 .ops = &clk_ops_rcg_7x30,
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07001465 CLK_INIT(mdp_lcdc_pclk_clk.c),
1466 },
1467};
1468
1469static struct branch_clk mdp_lcdc_pad_pclk_clk = {
1470 .b = {
1471 .ctl_reg = MDP_LCDC_NS_REG,
1472 .en_mask = BIT(12),
1473 .halt_reg = CLK_HALT_STATEB_REG,
1474 .halt_bit = 29,
1475 .reset_mask = P_MDP_LCDC_PAD_PCLK_CLK,
1476 },
1477 .parent = &mdp_lcdc_pclk_clk.c,
1478 .c = {
1479 .dbg_name = "mdp_lcdc_pad_pclk_clk",
1480 .ops = &clk_ops_branch,
1481 CLK_INIT(mdp_lcdc_pad_pclk_clk.c),
1482 },
1483};
1484
1485static struct clk_freq_tbl clk_tbl_mdp_vsync[] = {
1486 F_RAW( 0, &gnd_clk.c, 0, (0x3<<2), 0, 0, NONE, NULL),
1487 F_RAW(24576000, &lpxo_clk.c, 0, (0x1<<2), 0, 0, NOMINAL, NULL),
1488 F_END,
1489};
1490
1491static struct rcg_clk mdp_vsync_clk = {
1492 .b = {
1493 .ctl_reg = MDP_VSYNC_REG,
1494 .en_mask = BIT(0),
1495 .halt_reg = CLK_HALT_STATEB_REG,
1496 .halt_bit = 30,
1497 .reset_mask = P_MDP_VSYNC_CLK,
1498 },
1499 .ns_reg = MDP_VSYNC_REG,
1500 .ns_mask = BM(3, 2),
1501 .freq_tbl = clk_tbl_mdp_vsync,
1502 .set_rate = set_rate_nop,
Matt Wagantall84f43fd2011-08-16 23:28:38 -07001503 .current_freq = &rcg_dummy_freq,
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07001504 .c = {
1505 .dbg_name = "mdp_vsync_clk",
Matt Wagantall84f43fd2011-08-16 23:28:38 -07001506 .ops = &clk_ops_rcg_7x30,
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07001507 CLK_INIT(mdp_vsync_clk.c),
1508 },
1509};
1510
1511static struct clk_freq_tbl clk_tbl_mi2s_codec[] = {
1512 F_MND16( 0, gnd, 1, 0, 0, NONE),
1513 F_MND16( 2048000, lpxo, 4, 1, 3, NOMINAL),
1514 F_MND16(12288000, lpxo, 2, 0, 0, NOMINAL),
1515 F_END,
1516};
1517
1518static struct rcg_clk mi2s_codec_rx_m_clk = {
1519 .b = {
1520 .ctl_reg = MI2S_RX_NS_REG,
1521 .en_mask = BIT(12),
1522 .halt_reg = CLK_HALT_STATEA_REG,
1523 .halt_bit = 12,
1524 .reset_mask = P_MI2S_CODEC_RX_M_CLK,
1525 },
1526 .ns_reg = MI2S_RX_NS_REG,
1527 .md_reg = MI2S_RX_NS_REG - 4,
1528 .root_en_mask = BIT(11),
1529 .ns_mask = F_MASK_MND16,
1530 .set_rate = set_rate_mnd,
1531 .freq_tbl = clk_tbl_mi2s_codec,
Matt Wagantall84f43fd2011-08-16 23:28:38 -07001532 .current_freq = &rcg_dummy_freq,
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07001533 .c = {
1534 .dbg_name = "mi2s_codec_rx_m_clk",
Matt Wagantall84f43fd2011-08-16 23:28:38 -07001535 .ops = &clk_ops_rcg_7x30,
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07001536 CLK_INIT(mi2s_codec_rx_m_clk.c),
1537 },
1538};
1539
1540static struct branch_clk mi2s_codec_rx_s_clk = {
1541 .b = {
1542 .ctl_reg = MI2S_RX_NS_REG,
1543 .en_mask = BIT(9),
1544 .halt_reg = CLK_HALT_STATEA_REG,
1545 .halt_bit = 13,
1546 .reset_mask = P_MI2S_CODEC_RX_S_CLK,
1547 },
1548 .parent = &mi2s_codec_rx_m_clk.c,
1549 .c = {
1550 .dbg_name = "mi2s_codec_rx_s_clk",
1551 .ops = &clk_ops_branch,
1552 CLK_INIT(mi2s_codec_rx_s_clk.c),
1553 },
1554};
1555
1556static struct rcg_clk mi2s_codec_tx_m_clk = {
1557 .b = {
1558 .ctl_reg = MI2S_TX_NS_REG,
1559 .en_mask = BIT(12),
1560 .halt_reg = CLK_HALT_STATEC_REG,
1561 .halt_bit = 8,
1562 .reset_mask = P_MI2S_CODEC_TX_M_CLK,
1563 },
1564 .ns_reg = MI2S_TX_NS_REG,
1565 .md_reg = MI2S_TX_NS_REG - 4,
1566 .root_en_mask = BIT(11),
1567 .ns_mask = F_MASK_MND16,
1568 .set_rate = set_rate_mnd,
1569 .freq_tbl = clk_tbl_mi2s_codec,
Matt Wagantall84f43fd2011-08-16 23:28:38 -07001570 .current_freq = &rcg_dummy_freq,
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07001571 .c = {
1572 .dbg_name = "mi2s_codec_tx_m_clk",
Matt Wagantall84f43fd2011-08-16 23:28:38 -07001573 .ops = &clk_ops_rcg_7x30,
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07001574 CLK_INIT(mi2s_codec_tx_m_clk.c),
1575 },
1576};
1577
1578static struct branch_clk mi2s_codec_tx_s_clk = {
1579 .b = {
1580 .ctl_reg = MI2S_TX_NS_REG,
1581 .en_mask = BIT(9),
1582 .halt_reg = CLK_HALT_STATEA_REG,
1583 .halt_bit = 11,
1584 .reset_mask = P_MI2S_CODEC_TX_S_CLK,
1585 },
1586 .parent = &mi2s_codec_tx_m_clk.c,
1587 .c = {
1588 .dbg_name = "mi2s_codec_tx_s_clk",
1589 .ops = &clk_ops_branch,
1590 CLK_INIT(mi2s_codec_tx_s_clk.c),
1591 },
1592};
1593
1594static struct clk_freq_tbl clk_tbl_mi2s[] = {
1595 F_MND16( 0, gnd, 1, 0, 0, NONE),
1596 F_MND16(12288000, lpxo, 2, 0, 0, NOMINAL),
1597 F_END,
1598};
1599
1600static struct rcg_clk mi2s_m_clk = {
1601 .b = {
1602 .ctl_reg = MI2S_NS_REG,
1603 .en_mask = BIT(12),
1604 .halt_reg = CLK_HALT_STATEC_REG,
1605 .halt_bit = 4,
1606 .reset_mask = P_MI2S_M_CLK,
1607 },
1608 .ns_reg = MI2S_NS_REG,
1609 .md_reg = MI2S_NS_REG - 4,
1610 .root_en_mask = BIT(11),
1611 .ns_mask = F_MASK_MND16,
1612 .set_rate = set_rate_mnd,
1613 .freq_tbl = clk_tbl_mi2s,
Matt Wagantall84f43fd2011-08-16 23:28:38 -07001614 .current_freq = &rcg_dummy_freq,
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07001615 .c = {
1616 .dbg_name = "mi2s_m_clk",
Matt Wagantall84f43fd2011-08-16 23:28:38 -07001617 .ops = &clk_ops_rcg_7x30,
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07001618 CLK_INIT(mi2s_m_clk.c),
1619 },
1620};
1621
1622static struct branch_clk mi2s_s_clk = {
1623 .b = {
1624 .ctl_reg = MI2S_NS_REG,
1625 .en_mask = BIT(9),
1626 .halt_reg = CLK_HALT_STATEC_REG,
1627 .halt_bit = 3,
1628 .reset_mask = P_MI2S_S_CLK,
1629 },
1630 .parent = &mi2s_m_clk.c,
1631 .c = {
1632 .dbg_name = "mi2s_s_clk",
1633 .ops = &clk_ops_branch,
1634 CLK_INIT(mi2s_s_clk.c),
1635 },
1636};
1637
1638static struct clk_freq_tbl clk_tbl_midi[] = {
1639 F_MND8( 0, 0, 0, gnd, 1, 0, 0, NONE),
1640 F_MND8(98304000, 19, 12, pll3, 3, 2, 5, NOMINAL),
1641 F_END,
1642};
1643
1644static struct rcg_clk midi_clk = {
1645 .b = {
1646 .ctl_reg = MIDI_NS_REG,
1647 .en_mask = BIT(9),
1648 .halt_reg = CLK_HALT_STATEC_REG,
1649 .halt_bit = 1,
1650 },
1651 .ns_reg = MIDI_NS_REG,
1652 .md_reg = MIDI_NS_REG - 4,
1653 .ns_mask = F_MASK_MND8(19, 12),
1654 .root_en_mask = BIT(11),
1655 .freq_tbl = clk_tbl_midi,
Matt Wagantall84f43fd2011-08-16 23:28:38 -07001656 .current_freq = &rcg_dummy_freq,
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07001657 .set_rate = set_rate_mnd,
1658 .c = {
1659 .dbg_name = "midi_clk",
Matt Wagantall84f43fd2011-08-16 23:28:38 -07001660 .ops = &clk_ops_rcg_7x30,
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07001661 CLK_INIT(midi_clk.c),
1662 },
1663};
1664
1665#define F_SDAC(f, s, div, m, n, v) \
1666 { \
1667 .freq_hz = f, \
1668 .md_val = MD16(m, n), \
1669 .ns_val = N16(m, n) | SPDIV(SRC_SEL_SDAC_##s, div), \
1670 .mnd_en_mask = BIT(8) * !!(n), \
1671 .sys_vdd = v, \
1672 .src_clk = &s##_clk.c, \
1673 }
1674
1675static struct clk_freq_tbl clk_tbl_sdac[] = {
1676 F_SDAC( 256000, lpxo, 4, 1, 24, NOMINAL),
1677 F_SDAC( 352800, lpxo, 1, 147, 10240, NOMINAL),
1678 F_SDAC( 384000, lpxo, 4, 1, 16, NOMINAL),
1679 F_SDAC( 512000, lpxo, 4, 1, 12, NOMINAL),
1680 F_SDAC( 705600, lpxo, 1, 147, 5120, NOMINAL),
1681 F_SDAC( 768000, lpxo, 4, 1, 8, NOMINAL),
1682 F_SDAC(1024000, lpxo, 4, 1, 6, NOMINAL),
1683 F_SDAC(1411200, lpxo, 1, 147, 2560, NOMINAL),
1684 F_SDAC(1536000, lpxo, 4, 1, 4, NOMINAL),
1685 F_END,
1686};
1687
1688static struct rcg_clk sdac_clk = {
1689 .b = {
1690 .ctl_reg = SDAC_NS_REG,
1691 .en_mask = BIT(9),
1692 .halt_reg = CLK_HALT_STATEA_REG,
1693 .halt_bit = 2,
1694 .reset_mask = P_SDAC_CLK,
1695 },
1696 .ns_reg = SDAC_NS_REG,
1697 .md_reg = SDAC_NS_REG - 4,
1698 .root_en_mask = BIT(11),
1699 .freq_tbl = clk_tbl_sdac,
1700 .ns_mask = F_MASK_MND16,
1701 .set_rate = set_rate_mnd,
Matt Wagantall84f43fd2011-08-16 23:28:38 -07001702 .current_freq = &rcg_dummy_freq,
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07001703 .c = {
1704 .dbg_name = "sdac_clk",
Matt Wagantall84f43fd2011-08-16 23:28:38 -07001705 .ops = &clk_ops_rcg_7x30,
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07001706 CLK_INIT(sdac_clk.c),
1707 },
1708};
1709
1710static struct branch_clk sdac_m_clk = {
1711 .b = {
1712 .ctl_reg = SDAC_NS_REG,
1713 .en_mask = BIT(12),
1714 .halt_reg = CLK_HALT_STATEB_REG,
1715 .halt_bit = 17,
1716 .reset_mask = P_SDAC_M_CLK,
1717 },
1718 .parent = &sdac_clk.c,
1719 .c = {
1720 .dbg_name = "sdac_m_clk",
1721 .ops = &clk_ops_branch,
1722 CLK_INIT(sdac_m_clk.c),
1723 },
1724};
1725
1726static struct clk_freq_tbl clk_tbl_tv[] = {
1727 F_MND8( 0, 0, 0, gnd, 1, 0, 0, NONE),
1728 F_MND8(27000000, 23, 16, pll4, 2, 2, 33, NOMINAL),
1729 F_MND8(74250000, 23, 16, pll4, 2, 1, 6, NOMINAL),
1730 F_END,
1731};
1732
1733static struct rcg_clk tv_clk = {
1734 .ns_reg = TV_NS_REG,
1735 .b = {
1736 .ctl_reg = TV_NS_REG,
1737 .halt_check = NOCHECK,
1738 },
1739 .md_reg = TV_NS_REG - 4,
1740 .ns_mask = F_MASK_MND8(23, 16),
1741 .root_en_mask = BIT(11),
1742 .freq_tbl = clk_tbl_tv,
Matt Wagantall84f43fd2011-08-16 23:28:38 -07001743 .current_freq = &rcg_dummy_freq,
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07001744 .set_rate = set_rate_mnd,
1745 .c = {
1746 .dbg_name = "tv_clk",
Matt Wagantall84f43fd2011-08-16 23:28:38 -07001747 .ops = &clk_ops_rcg_7x30,
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07001748 CLK_INIT(tv_clk.c),
1749 },
1750};
1751
1752static struct branch_clk hdmi_clk = {
1753 .b = {
1754 .ctl_reg = HDMI_NS_REG,
1755 .en_mask = BIT(9),
1756 .halt_reg = CLK_HALT_STATEC_REG,
1757 .halt_bit = 7,
1758 .reset_mask = P_HDMI_CLK,
1759 },
1760 .parent = &tv_clk.c,
1761 .c = {
1762 .dbg_name = "hdmi_clk",
1763 .ops = &clk_ops_branch,
1764 CLK_INIT(hdmi_clk.c),
1765 },
1766};
1767
1768static struct branch_clk tv_dac_clk = {
1769 .b = {
1770 .ctl_reg = TV_NS_REG,
1771 .en_mask = BIT(12),
1772 .halt_reg = CLK_HALT_STATEB_REG,
1773 .halt_bit = 27,
1774 .reset_mask = P_TV_DAC_CLK,
1775 },
1776 .parent = &tv_clk.c,
1777 .c = {
1778 .dbg_name = "tv_dac_clk",
1779 .ops = &clk_ops_branch,
1780 CLK_INIT(tv_dac_clk.c),
1781 },
1782};
1783
1784static struct branch_clk tv_enc_clk = {
1785 .b = {
1786 .ctl_reg = TV_NS_REG,
1787 .en_mask = BIT(9),
1788 .halt_reg = CLK_HALT_STATEB_REG,
1789 .halt_bit = 10,
1790 .reset_mask = P_TV_ENC_CLK,
1791 },
1792 .parent = &tv_clk.c,
1793 .c = {
1794 .dbg_name = "tv_enc_clk",
1795 .ops = &clk_ops_branch,
1796 CLK_INIT(tv_enc_clk.c),
1797 },
1798};
1799
1800/* Hacking root & branch into one param. */
1801static struct branch_clk tsif_ref_clk = {
1802 .b = {
1803 .ctl_reg = TSIF_NS_REG,
1804 .en_mask = BIT(9)|BIT(11),
1805 .halt_reg = CLK_HALT_STATEB_REG,
1806 .halt_bit = 11,
1807 .reset_mask = P_TSIF_REF_CLK,
1808 },
1809 .parent = &tv_clk.c,
1810 .c = {
1811 .dbg_name = "tsif_ref_clk",
1812 .ops = &clk_ops_branch,
1813 CLK_INIT(tsif_ref_clk.c),
1814 },
1815};
1816
1817static struct clk_freq_tbl clk_tbl_usb[] = {
1818 F_MND8( 0, 0, 0, gnd, 1, 0, 0, NONE),
1819 F_MND8(60000000, 23, 16, pll1, 2, 5, 32, NOMINAL),
1820 F_END,
1821};
1822
1823static struct rcg_clk usb_hs_src_clk = {
1824 .ns_reg = USBH_NS_REG,
1825 .b = {
1826 .ctl_reg = USBH_NS_REG,
1827 .halt_check = NOCHECK,
1828 },
1829 .md_reg = USBH_NS_REG - 4,
1830 .ns_mask = F_MASK_MND8(23, 16),
1831 .root_en_mask = BIT(11),
1832 .freq_tbl = clk_tbl_usb,
Matt Wagantall84f43fd2011-08-16 23:28:38 -07001833 .current_freq = &rcg_dummy_freq,
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07001834 .set_rate = set_rate_mnd,
1835 .c = {
1836 .dbg_name = "usb_hs_src_clk",
Matt Wagantall84f43fd2011-08-16 23:28:38 -07001837 .ops = &clk_ops_rcg_7x30,
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07001838 CLK_INIT(usb_hs_src_clk.c),
Stephen Boyd7fa26742011-08-11 23:22:29 -07001839 .depends = &axi_li_adsp_a_clk.c,
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07001840 },
1841};
1842
1843static struct branch_clk usb_hs_clk = {
1844 .b = {
1845 .ctl_reg = USBH_NS_REG,
1846 .en_mask = BIT(9),
1847 .halt_reg = CLK_HALT_STATEB_REG,
1848 .halt_bit = 26,
1849 .reset_mask = P_USB_HS_CLK,
1850 },
1851 .c = {
1852 .dbg_name = "usb_hs_clk",
1853 .ops = &clk_ops_branch,
1854 CLK_INIT(usb_hs_clk.c),
1855 },
1856};
1857
1858static struct branch_clk usb_hs_core_clk = {
1859 .b = {
1860 .ctl_reg = USBH_NS_REG,
1861 .en_mask = BIT(13),
1862 .halt_reg = CLK_HALT_STATEA_REG,
1863 .halt_bit = 27,
1864 .reset_mask = P_USB_HS_CORE_CLK,
1865 },
1866 .parent = &usb_hs_src_clk.c,
1867 .c = {
1868 .dbg_name = "usb_hs_core_clk",
1869 .ops = &clk_ops_branch,
1870 CLK_INIT(usb_hs_core_clk.c),
1871 },
1872};
1873
1874static struct branch_clk usb_hs2_clk = {
1875 .b = {
1876 .ctl_reg = USBH2_NS_REG,
1877 .en_mask = BIT(9),
1878 .halt_reg = CLK_HALT_STATEB_REG,
1879 .halt_bit = 3,
1880 .reset_mask = P_USB_HS2_CLK,
1881 },
1882 .parent = &usb_hs_src_clk.c,
1883 .c = {
1884 .dbg_name = "usb_hs2_clk",
1885 .ops = &clk_ops_branch,
1886 CLK_INIT(usb_hs2_clk.c),
1887 },
1888};
1889
1890static struct branch_clk usb_hs2_core_clk = {
1891 .b = {
1892 .ctl_reg = USBH2_NS_REG,
1893 .en_mask = BIT(4),
1894 .halt_reg = CLK_HALT_STATEA_REG,
1895 .halt_bit = 28,
1896 .reset_mask = P_USB_HS2_CORE_CLK,
1897 },
1898 .parent = &usb_hs_src_clk.c,
1899 .c = {
1900 .dbg_name = "usb_hs2_core_clk",
1901 .ops = &clk_ops_branch,
1902 CLK_INIT(usb_hs2_core_clk.c),
1903 },
1904};
1905
1906static struct branch_clk usb_hs3_clk = {
1907 .b = {
1908 .ctl_reg = USBH3_NS_REG,
1909 .en_mask = BIT(9),
1910 .halt_reg = CLK_HALT_STATEB_REG,
1911 .halt_bit = 2,
1912 .reset_mask = P_USB_HS3_CLK,
1913 },
1914 .parent = &usb_hs_src_clk.c,
1915 .c = {
1916 .dbg_name = "usb_hs3_clk",
1917 .ops = &clk_ops_branch,
1918 CLK_INIT(usb_hs3_clk.c),
1919 },
1920};
1921
1922static struct branch_clk usb_hs3_core_clk = {
1923 .b = {
1924 .ctl_reg = USBH3_NS_REG,
1925 .en_mask = BIT(4),
1926 .halt_reg = CLK_HALT_STATEA_REG,
1927 .halt_bit = 29,
1928 .reset_mask = P_USB_HS3_CORE_CLK,
1929 },
1930 .parent = &usb_hs_src_clk.c,
1931 .c = {
1932 .dbg_name = "usb_hs3_core_clk",
1933 .ops = &clk_ops_branch,
1934 CLK_INIT(usb_hs3_core_clk.c),
1935 },
1936};
1937
1938static struct clk_freq_tbl clk_tbl_vfe_jpeg[] = {
1939 F_MND16( 24576000, lpxo, 1, 0, 0, NOMINAL),
1940 F_MND16( 36864000, pll3, 4, 1, 5, NOMINAL),
1941 F_MND16( 46080000, pll3, 4, 1, 4, NOMINAL),
1942 F_MND16( 61440000, pll3, 4, 1, 3, NOMINAL),
1943 F_MND16( 73728000, pll3, 2, 1, 5, NOMINAL),
1944 F_MND16( 81920000, pll3, 3, 1, 3, NOMINAL),
1945 F_MND16( 92160000, pll3, 4, 1, 2, NOMINAL),
1946 F_MND16( 98304000, pll3, 3, 2, 5, NOMINAL),
1947 F_MND16(105326000, pll3, 2, 2, 7, NOMINAL),
1948 F_MND16(122880000, pll3, 2, 1, 3, NOMINAL),
1949 F_MND16(147456000, pll3, 2, 2, 5, NOMINAL),
1950 F_MND16(153600000, pll1, 2, 2, 5, NOMINAL),
1951 F_MND16(192000000, pll1, 4, 0, 0, HIGH),
1952 F_END,
1953};
1954
1955static struct rcg_clk jpeg_clk = {
1956 .b = {
1957 .ctl_reg = JPEG_NS_REG,
1958 .en_mask = BIT(9),
1959 .halt_reg = CLK_HALT_STATEB_REG,
1960 .halt_bit = 1,
1961 .reset_mask = P_JPEG_CLK,
1962 },
1963 .ns_reg = JPEG_NS_REG,
1964 .md_reg = JPEG_NS_REG - 4,
1965 .root_en_mask = BIT(11),
1966 .freq_tbl = clk_tbl_vfe_jpeg,
1967 .ns_mask = F_MASK_MND16,
1968 .set_rate = set_rate_mnd,
Matt Wagantall84f43fd2011-08-16 23:28:38 -07001969 .current_freq = &rcg_dummy_freq,
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07001970 .c = {
1971 .dbg_name = "jpeg_clk",
Matt Wagantall84f43fd2011-08-16 23:28:38 -07001972 .ops = &clk_ops_rcg_7x30,
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07001973 CLK_INIT(jpeg_clk.c),
Stephen Boyd7fa26742011-08-11 23:22:29 -07001974 .depends = &axi_li_jpeg_clk.c,
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07001975 },
1976};
1977
1978static struct rcg_clk vfe_clk = {
1979 .b = {
1980 .ctl_reg = CAM_VFE_NS_REG,
1981 .en_mask = BIT(9),
1982 .halt_reg = CLK_HALT_STATEB_REG,
1983 .halt_bit = 0,
1984 .reset_mask = P_VFE_CLK,
1985 },
1986 .ns_reg = CAM_VFE_NS_REG,
1987 .md_reg = CAM_VFE_NS_REG - 4,
1988 .root_en_mask = BIT(13),
1989 .freq_tbl = clk_tbl_vfe_jpeg,
1990 .ns_mask = F_MASK_MND16,
1991 .set_rate = set_rate_mnd,
Matt Wagantall84f43fd2011-08-16 23:28:38 -07001992 .current_freq = &rcg_dummy_freq,
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07001993 .c = {
1994 .dbg_name = "vfe_clk",
Matt Wagantall84f43fd2011-08-16 23:28:38 -07001995 .ops = &clk_ops_rcg_7x30,
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07001996 CLK_INIT(vfe_clk.c),
Stephen Boyd7fa26742011-08-11 23:22:29 -07001997 .depends = &axi_li_vfe_clk.c,
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07001998 },
1999};
2000
2001static struct branch_clk vfe_mdc_clk = {
2002 .b = {
2003 .ctl_reg = CAM_VFE_NS_REG,
2004 .en_mask = BIT(11),
2005 .halt_reg = CLK_HALT_STATEA_REG,
2006 .halt_bit = 9,
2007 .reset_mask = P_VFE_MDC_CLK,
2008 },
2009 .parent = &vfe_clk.c,
2010 .c = {
2011 .dbg_name = "vfe_mdc_clk",
2012 .ops = &clk_ops_branch,
2013 CLK_INIT(vfe_mdc_clk.c),
2014 },
2015};
2016
2017static struct branch_clk vfe_camif_clk = {
2018 .b = {
2019 .ctl_reg = CAM_VFE_NS_REG,
2020 .en_mask = BIT(15),
2021 .halt_reg = CLK_HALT_STATEC_REG,
2022 .halt_bit = 13,
2023 .reset_mask = P_VFE_CAMIF_CLK,
2024 },
2025 .parent = &vfe_clk.c,
2026 .c = {
2027 .dbg_name = "vfe_camif_clk",
2028 .ops = &clk_ops_branch,
2029 CLK_INIT(vfe_camif_clk.c),
2030 },
2031};
2032
2033static struct branch_clk csi0_vfe_clk = {
2034 .b = {
2035 .ctl_reg = CSI_NS_REG,
2036 .en_mask = BIT(15),
2037 .halt_reg = CLK_HALT_STATEC_REG,
2038 .halt_bit = 16,
2039 .reset_mask = P_CSI0_VFE_CLK,
2040 },
2041 .parent = &vfe_clk.c,
2042 .c = {
2043 .dbg_name = "csi0_vfe_clk",
2044 .ops = &clk_ops_branch,
2045 CLK_INIT(csi0_vfe_clk.c),
2046 },
2047};
2048
2049static struct clk_freq_tbl clk_tbl_cam[] = {
2050 F_MND16( 0, gnd, 1, 0, 0, NONE),
2051 F_MND16( 6000000, pll1, 4, 1, 32, NOMINAL),
2052 F_MND16( 8000000, pll1, 4, 1, 24, NOMINAL),
2053 F_MND16(12000000, pll1, 4, 1, 16, NOMINAL),
2054 F_MND16(16000000, pll1, 4, 1, 12, NOMINAL),
2055 F_MND16(19200000, pll1, 4, 1, 10, NOMINAL),
2056 F_MND16(24000000, pll1, 4, 1, 8, NOMINAL),
2057 F_MND16(32000000, pll1, 4, 1, 6, NOMINAL),
2058 F_MND16(48000000, pll1, 4, 1, 4, NOMINAL),
2059 F_MND16(64000000, pll1, 4, 1, 3, NOMINAL),
2060 F_END,
2061};
2062
2063static struct rcg_clk cam_m_clk = {
2064 .b = {
2065 .ctl_reg = CAM_NS_REG,
2066 .halt_check = DELAY,
2067 .reset_mask = P_CAM_M_CLK,
2068 },
2069 .ns_reg = CAM_NS_REG,
2070 .md_reg = CAM_NS_REG - 4,
2071 .root_en_mask = BIT(9),
2072 .freq_tbl = clk_tbl_cam,
2073 .ns_mask = F_MASK_MND16,
2074 .set_rate = set_rate_mnd,
Matt Wagantall84f43fd2011-08-16 23:28:38 -07002075 .current_freq = &rcg_dummy_freq,
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07002076 .c = {
2077 .dbg_name = "cam_m_clk",
Matt Wagantall84f43fd2011-08-16 23:28:38 -07002078 .ops = &clk_ops_rcg_7x30,
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07002079 CLK_INIT(cam_m_clk.c),
2080 },
2081};
2082
2083static struct clk_freq_tbl clk_tbl_vpe[] = {
2084 F_MND8( 24576000, 22, 15, lpxo, 1, 0, 0, NOMINAL),
2085 F_MND8( 30720000, 22, 15, pll3, 4, 1, 6, NOMINAL),
2086 F_MND8( 61440000, 22, 15, pll3, 4, 1, 3, NOMINAL),
2087 F_MND8( 81920000, 22, 15, pll3, 3, 1, 3, NOMINAL),
2088 F_MND8(122880000, 22, 15, pll3, 3, 1, 2, NOMINAL),
2089 F_MND8(147456000, 22, 15, pll3, 1, 1, 5, NOMINAL),
2090 F_MND8(153600000, 22, 15, pll1, 1, 1, 5, NOMINAL),
2091 F_END,
2092};
2093
2094static struct rcg_clk vpe_clk = {
2095 .b = {
2096 .ctl_reg = VPE_NS_REG,
2097 .en_mask = BIT(9),
2098 .halt_reg = CLK_HALT_STATEC_REG,
2099 .halt_bit = 10,
2100 .reset_mask = P_VPE_CLK,
2101 },
2102 .ns_reg = VPE_NS_REG,
2103 .md_reg = VPE_NS_REG - 4,
2104 .ns_mask = F_MASK_MND8(22, 15),
2105 .root_en_mask = BIT(11),
2106 .freq_tbl = clk_tbl_vpe,
Matt Wagantall84f43fd2011-08-16 23:28:38 -07002107 .current_freq = &rcg_dummy_freq,
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07002108 .set_rate = set_rate_mnd,
2109 .c = {
2110 .dbg_name = "vpe_clk",
Matt Wagantall84f43fd2011-08-16 23:28:38 -07002111 .ops = &clk_ops_rcg_7x30,
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07002112 CLK_INIT(vpe_clk.c),
Stephen Boyd7fa26742011-08-11 23:22:29 -07002113 .depends = &axi_vpe_clk.c,
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07002114 },
2115};
2116
2117
2118static struct clk_freq_tbl clk_tbl_mfc[] = {
2119 F_MND8( 24576000, 24, 17, lpxo, 1, 0, 0, NOMINAL),
2120 F_MND8( 30720000, 24, 17, pll3, 4, 1, 6, NOMINAL),
2121 F_MND8( 61440000, 24, 17, pll3, 4, 1, 3, NOMINAL),
2122 F_MND8( 81920000, 24, 17, pll3, 3, 1, 3, NOMINAL),
2123 F_MND8(122880000, 24, 17, pll3, 3, 1, 2, NOMINAL),
2124 F_MND8(147456000, 24, 17, pll3, 1, 1, 5, NOMINAL),
2125 F_MND8(153600000, 24, 17, pll1, 1, 1, 5, NOMINAL),
2126 F_MND8(170667000, 24, 17, pll1, 1, 2, 9, NOMINAL),
2127 F_END,
2128};
2129
2130static struct rcg_clk mfc_clk = {
2131 .b = {
2132 .ctl_reg = MFC_NS_REG,
2133 .en_mask = BIT(9),
2134 .halt_reg = CLK_HALT_STATEC_REG,
2135 .halt_bit = 12,
2136 .reset_mask = P_MFC_CLK,
2137 },
2138 .ns_reg = MFC_NS_REG,
2139 .md_reg = MFC_NS_REG - 4,
2140 .ns_mask = F_MASK_MND8(24, 17),
2141 .root_en_mask = BIT(11),
2142 .freq_tbl = clk_tbl_mfc,
Matt Wagantall84f43fd2011-08-16 23:28:38 -07002143 .current_freq = &rcg_dummy_freq,
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07002144 .set_rate = set_rate_mnd,
2145 .c = {
2146 .dbg_name = "mfc_clk",
Matt Wagantall84f43fd2011-08-16 23:28:38 -07002147 .ops = &clk_ops_rcg_7x30,
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07002148 CLK_INIT(mfc_clk.c),
Stephen Boyd7fa26742011-08-11 23:22:29 -07002149 .depends = &axi_mfc_clk.c,
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07002150 },
2151};
2152
2153static struct branch_clk mfc_div2_clk = {
2154 .b = {
2155 .ctl_reg = MFC_NS_REG,
2156 .en_mask = BIT(15),
2157 .halt_reg = CLK_HALT_STATEC_REG,
2158 .halt_bit = 11,
2159 .reset_mask = P_MFC_DIV2_CLK,
2160 },
2161 .parent = &mfc_clk.c,
2162 .c = {
2163 .dbg_name = "mfc_div2_clk",
2164 .ops = &clk_ops_branch,
2165 CLK_INIT(mfc_div2_clk.c),
2166 },
2167};
2168
2169static struct clk_freq_tbl clk_tbl_spi[] = {
2170 F_MND8( 0, 0, 0, gnd, 1, 0, 0, NONE),
2171 F_MND8( 9963243, 19, 12, pll3, 4, 2, 37, NOMINAL),
2172 F_MND8(26331429, 19, 12, pll3, 4, 1, 7, NOMINAL),
2173 F_END,
2174};
2175
2176static struct rcg_clk spi_clk = {
2177 .b = {
2178 .ctl_reg = SPI_NS_REG,
2179 .en_mask = BIT(9),
2180 .halt_reg = CLK_HALT_STATEC_REG,
2181 .halt_bit = 0,
2182 .reset_mask = P_SPI_CLK,
2183 },
2184 .ns_reg = SPI_NS_REG,
2185 .md_reg = SPI_NS_REG - 4,
2186 .ns_mask = F_MASK_MND8(19, 12),
2187 .root_en_mask = BIT(11),
2188 .freq_tbl = clk_tbl_spi,
Matt Wagantall84f43fd2011-08-16 23:28:38 -07002189 .current_freq = &rcg_dummy_freq,
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07002190 .set_rate = set_rate_mnd,
2191 .c = {
2192 .dbg_name = "spi_clk",
Matt Wagantall84f43fd2011-08-16 23:28:38 -07002193 .ops = &clk_ops_rcg_7x30,
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07002194 CLK_INIT(spi_clk.c),
2195 },
2196};
2197
2198static struct clk_freq_tbl clk_tbl_lpa_codec[] = {
2199 F_RAW(1, NULL, 0, 0, 0, 0, LOW, NULL), /* src MI2S_CODEC_RX */
2200 F_RAW(2, NULL, 0, 1, 0, 0, LOW, NULL), /* src ECODEC_CIF */
2201 F_RAW(3, NULL, 0, 2, 0, 0, LOW, NULL), /* src MI2S */
2202 F_RAW(4, NULL, 0, 3, 0, 0, LOW, NULL), /* src SDAC */
2203 F_END,
2204};
2205
2206static struct rcg_clk lpa_codec_clk = {
2207 .b = {
2208 .ctl_reg = LPA_NS_REG,
2209 .en_mask = BIT(9),
2210 .halt_reg = CLK_HALT_STATEC_REG,
2211 .halt_bit = 6,
2212 .reset_mask = P_LPA_CODEC_CLK,
2213 },
2214 .ns_reg = LPA_NS_REG,
2215 .ns_mask = BM(1, 0),
2216 .set_rate = set_rate_nop,
2217 .freq_tbl = clk_tbl_lpa_codec,
Matt Wagantall84f43fd2011-08-16 23:28:38 -07002218 .current_freq = &rcg_dummy_freq,
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07002219 .c = {
2220 .dbg_name = "lpa_codec_clk",
Matt Wagantall84f43fd2011-08-16 23:28:38 -07002221 .ops = &clk_ops_rcg_7x30,
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07002222 CLK_INIT(lpa_codec_clk.c),
2223 },
2224};
2225
2226static struct clk_freq_tbl clk_tbl_mdc[] = {
2227 F_RAW(1, NULL, 0, 0, 0, 0, LOW, NULL),
2228 F_END
2229};
2230
2231static struct rcg_clk mdc_clk = {
2232 .b = {
2233 .ctl_reg = MDC_NS_REG,
2234 .en_mask = BIT(9),
2235 .halt_reg = CLK_HALT_STATEA_REG,
2236 .halt_bit = 10,
2237 .reset_mask = P_MDC_CLK,
2238 },
2239 .ns_reg = MDC_NS_REG,
2240 .root_en_mask = BIT(11),
2241 .freq_tbl = clk_tbl_mdc,
Matt Wagantall84f43fd2011-08-16 23:28:38 -07002242 .current_freq = &rcg_dummy_freq,
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07002243 .set_rate = set_rate_nop,
2244 .c = {
2245 .dbg_name = "mdc_clk",
Matt Wagantall84f43fd2011-08-16 23:28:38 -07002246 .ops = &clk_ops_rcg_7x30,
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07002247 CLK_INIT(mdc_clk.c),
2248 },
2249};
2250
2251static struct branch_clk lpa_core_clk = {
2252 .b = {
2253 .ctl_reg = LPA_NS_REG,
2254 .en_mask = BIT(5),
2255 .halt_reg = CLK_HALT_STATEC_REG,
2256 .halt_bit = 5,
2257 .reset_mask = P_LPA_CORE_CLK,
2258 },
2259 .c = {
2260 .dbg_name = "lpa_core_clk",
2261 .ops = &clk_ops_branch,
2262 CLK_INIT(lpa_core_clk.c),
2263 },
2264};
2265
2266static DEFINE_CLK_PCOM(adsp_clk, ADSP_CLK, CLKFLAG_SKIP_AUTO_OFF);
2267static DEFINE_CLK_PCOM(codec_ssbi_clk, CODEC_SSBI_CLK, CLKFLAG_SKIP_AUTO_OFF);
2268static DEFINE_CLK_PCOM(ebi1_clk, EBI1_CLK, CLKFLAG_SKIP_AUTO_OFF | CLKFLAG_MIN);
2269static DEFINE_CLK_PCOM(ebi1_fixed_clk, EBI1_FIXED_CLK, CLKFLAG_MIN |
2270 CLKFLAG_SKIP_AUTO_OFF);
2271static DEFINE_CLK_PCOM(ecodec_clk, ECODEC_CLK, CLKFLAG_SKIP_AUTO_OFF);
2272static DEFINE_CLK_PCOM(gp_clk, GP_CLK, CLKFLAG_SKIP_AUTO_OFF);
2273static DEFINE_CLK_PCOM(uart3_clk, UART3_CLK, 0);
2274static DEFINE_CLK_PCOM(usb_phy_clk, USB_PHY_CLK, CLKFLAG_MIN);
2275
2276static DEFINE_CLK_PCOM(p_grp_2d_clk, GRP_2D_CLK, CLKFLAG_SKIP_AUTO_OFF);
2277static DEFINE_CLK_PCOM(p_grp_2d_p_clk, GRP_2D_P_CLK, CLKFLAG_SKIP_AUTO_OFF);
2278static DEFINE_CLK_PCOM(p_hdmi_clk, HDMI_CLK, CLKFLAG_SKIP_AUTO_OFF);
2279static DEFINE_CLK_PCOM(p_jpeg_clk, JPEG_CLK, 0);
2280static DEFINE_CLK_PCOM(p_jpeg_p_clk, JPEG_P_CLK, 0);
2281static DEFINE_CLK_PCOM(p_lpa_codec_clk, LPA_CODEC_CLK, CLKFLAG_SKIP_AUTO_OFF);
2282static DEFINE_CLK_PCOM(p_lpa_core_clk, LPA_CORE_CLK, CLKFLAG_SKIP_AUTO_OFF);
2283static DEFINE_CLK_PCOM(p_lpa_p_clk, LPA_P_CLK, CLKFLAG_SKIP_AUTO_OFF);
2284static DEFINE_CLK_PCOM(p_mi2s_m_clk, MI2S_M_CLK, CLKFLAG_SKIP_AUTO_OFF);
2285static DEFINE_CLK_PCOM(p_mi2s_s_clk, MI2S_S_CLK, CLKFLAG_SKIP_AUTO_OFF);
2286static DEFINE_CLK_PCOM(p_mi2s_codec_rx_m_clk, MI2S_CODEC_RX_M_CLK,
2287 CLKFLAG_SKIP_AUTO_OFF);
2288static DEFINE_CLK_PCOM(p_mi2s_codec_rx_s_clk, MI2S_CODEC_RX_S_CLK,
2289 CLKFLAG_SKIP_AUTO_OFF);
2290static DEFINE_CLK_PCOM(p_mi2s_codec_tx_m_clk, MI2S_CODEC_TX_M_CLK,
2291 CLKFLAG_SKIP_AUTO_OFF);
2292static DEFINE_CLK_PCOM(p_mi2s_codec_tx_s_clk, MI2S_CODEC_TX_S_CLK,
2293 CLKFLAG_SKIP_AUTO_OFF);
2294static DEFINE_CLK_PCOM(p_sdac_clk, SDAC_CLK, 0);
2295static DEFINE_CLK_PCOM(p_sdac_m_clk, SDAC_M_CLK, 0);
2296static DEFINE_CLK_PCOM(p_vfe_clk, VFE_CLK, CLKFLAG_SKIP_AUTO_OFF);
2297static DEFINE_CLK_PCOM(p_vfe_camif_clk, VFE_CAMIF_CLK, CLKFLAG_SKIP_AUTO_OFF);
2298static DEFINE_CLK_PCOM(p_vfe_mdc_clk, VFE_MDC_CLK, CLKFLAG_SKIP_AUTO_OFF);
2299static DEFINE_CLK_PCOM(p_vfe_p_clk, VFE_P_CLK, 0);
2300static DEFINE_CLK_PCOM(p_grp_3d_clk, GRP_3D_CLK, CLKFLAG_SKIP_AUTO_OFF);
2301static DEFINE_CLK_PCOM(p_grp_3d_p_clk, GRP_3D_P_CLK, CLKFLAG_SKIP_AUTO_OFF);
2302static DEFINE_CLK_PCOM(p_imem_clk, IMEM_CLK, 0);
2303static DEFINE_CLK_PCOM(p_mdp_lcdc_pad_pclk_clk, MDP_LCDC_PAD_PCLK_CLK,
2304 CLKFLAG_SKIP_AUTO_OFF);
2305static DEFINE_CLK_PCOM(p_mdp_lcdc_pclk_clk, MDP_LCDC_PCLK_CLK,
2306 CLKFLAG_SKIP_AUTO_OFF);
2307static DEFINE_CLK_PCOM(p_mdp_p_clk, MDP_P_CLK, CLKFLAG_SKIP_AUTO_OFF);
2308static DEFINE_CLK_PCOM(p_mdp_vsync_clk, MDP_VSYNC_CLK, 0);
2309static DEFINE_CLK_PCOM(p_tsif_ref_clk, TSIF_REF_CLK, CLKFLAG_SKIP_AUTO_OFF);
2310static DEFINE_CLK_PCOM(p_tsif_p_clk, TSIF_P_CLK, CLKFLAG_SKIP_AUTO_OFF);
2311static DEFINE_CLK_PCOM(p_tv_dac_clk, TV_DAC_CLK, CLKFLAG_SKIP_AUTO_OFF);
2312static DEFINE_CLK_PCOM(p_tv_enc_clk, TV_ENC_CLK, CLKFLAG_SKIP_AUTO_OFF);
2313static DEFINE_CLK_PCOM(p_emdh_clk, EMDH_CLK, CLKFLAG_MIN | CLKFLAG_MAX);
2314static DEFINE_CLK_PCOM(p_emdh_p_clk, EMDH_P_CLK, 0);
2315static DEFINE_CLK_PCOM(p_i2c_clk, I2C_CLK, CLKFLAG_SKIP_AUTO_OFF);
2316static DEFINE_CLK_PCOM(p_i2c_2_clk, I2C_2_CLK, CLKFLAG_SKIP_AUTO_OFF);
2317static DEFINE_CLK_PCOM(p_mdc_clk, MDC_CLK, CLKFLAG_SKIP_AUTO_OFF);
2318static DEFINE_CLK_PCOM(p_pmdh_clk, PMDH_CLK, CLKFLAG_MIN | CLKFLAG_MAX);
2319static DEFINE_CLK_PCOM(p_pmdh_p_clk, PMDH_P_CLK, CLKFLAG_SKIP_AUTO_OFF);
2320static DEFINE_CLK_PCOM(p_sdc1_clk, SDC1_CLK, 0);
2321static DEFINE_CLK_PCOM(p_sdc1_p_clk, SDC1_P_CLK, 0);
2322static DEFINE_CLK_PCOM(p_sdc2_clk, SDC2_CLK, 0);
2323static DEFINE_CLK_PCOM(p_sdc2_p_clk, SDC2_P_CLK, 0);
2324static DEFINE_CLK_PCOM(p_sdc3_clk, SDC3_CLK, 0);
2325static DEFINE_CLK_PCOM(p_sdc3_p_clk, SDC3_P_CLK, 0);
2326static DEFINE_CLK_PCOM(p_sdc4_clk, SDC4_CLK, 0);
2327static DEFINE_CLK_PCOM(p_sdc4_p_clk, SDC4_P_CLK, 0);
2328static DEFINE_CLK_PCOM(p_uart2_clk, UART2_CLK, CLKFLAG_SKIP_AUTO_OFF);
2329static DEFINE_CLK_PCOM(p_usb_hs2_clk, USB_HS2_CLK, 0);
2330static DEFINE_CLK_PCOM(p_usb_hs2_core_clk, USB_HS2_CORE_CLK, 0);
2331static DEFINE_CLK_PCOM(p_usb_hs2_p_clk, USB_HS2_P_CLK, 0);
2332static DEFINE_CLK_PCOM(p_usb_hs3_clk, USB_HS3_CLK, 0);
2333static DEFINE_CLK_PCOM(p_usb_hs3_core_clk, USB_HS3_CORE_CLK, 0);
2334static DEFINE_CLK_PCOM(p_usb_hs3_p_clk, USB_HS3_P_CLK, 0);
2335static DEFINE_CLK_PCOM(p_qup_i2c_clk, QUP_I2C_CLK, CLKFLAG_SKIP_AUTO_OFF);
2336static DEFINE_CLK_PCOM(p_spi_clk, SPI_CLK, CLKFLAG_SKIP_AUTO_OFF);
2337static DEFINE_CLK_PCOM(p_spi_p_clk, SPI_P_CLK, CLKFLAG_SKIP_AUTO_OFF);
2338static DEFINE_CLK_PCOM(p_uart1_clk, UART1_CLK, 0);
2339static DEFINE_CLK_PCOM(p_uart1dm_clk, UART1DM_CLK, 0);
2340static DEFINE_CLK_PCOM(p_uart2dm_clk, UART2DM_CLK, CLKFLAG_SKIP_AUTO_OFF);
2341static DEFINE_CLK_PCOM(p_usb_hs_clk, USB_HS_CLK, 0);
2342static DEFINE_CLK_PCOM(p_usb_hs_core_clk, USB_HS_CORE_CLK, 0);
2343static DEFINE_CLK_PCOM(p_usb_hs_p_clk, USB_HS_P_CLK, 0);
2344static DEFINE_CLK_PCOM(p_cam_m_clk, CAM_M_CLK, CLKFLAG_SKIP_AUTO_OFF);
2345static DEFINE_CLK_PCOM(p_camif_pad_p_clk, CAMIF_PAD_P_CLK, 0);
2346static DEFINE_CLK_PCOM(p_csi0_clk, CSI0_CLK, CLKFLAG_SKIP_AUTO_OFF);
2347static DEFINE_CLK_PCOM(p_csi0_vfe_clk, CSI0_VFE_CLK, CLKFLAG_SKIP_AUTO_OFF);
2348static DEFINE_CLK_PCOM(p_csi0_p_clk, CSI0_P_CLK, CLKFLAG_SKIP_AUTO_OFF);
2349static DEFINE_CLK_PCOM(p_mdp_clk, MDP_CLK, 0);
2350static DEFINE_CLK_PCOM(p_mfc_clk, MFC_CLK, CLKFLAG_SKIP_AUTO_OFF);
2351static DEFINE_CLK_PCOM(p_mfc_div2_clk, MFC_DIV2_CLK, CLKFLAG_SKIP_AUTO_OFF);
2352static DEFINE_CLK_PCOM(p_mfc_p_clk, MFC_P_CLK, CLKFLAG_SKIP_AUTO_OFF);
2353static DEFINE_CLK_PCOM(p_vpe_clk, VPE_CLK, CLKFLAG_SKIP_AUTO_OFF);
2354static DEFINE_CLK_PCOM(p_adm_clk, ADM_CLK, CLKFLAG_SKIP_AUTO_OFF);
2355static DEFINE_CLK_PCOM(p_ce_clk, CE_CLK, CLKFLAG_SKIP_AUTO_OFF);
2356static DEFINE_CLK_PCOM(p_axi_rotator_clk, AXI_ROTATOR_CLK,
2357 CLKFLAG_SKIP_AUTO_OFF);
2358static DEFINE_CLK_PCOM(p_rotator_imem_clk, ROTATOR_IMEM_CLK, 0);
2359static DEFINE_CLK_PCOM(p_rotator_p_clk, ROTATOR_P_CLK, 0);
2360
2361static DEFINE_CLK_VOTER(ebi_dtv_clk, &ebi1_fixed_clk.c);
Matt Wagantall9dc01632011-08-17 18:55:04 -07002362static DEFINE_CLK_VOTER(ebi_grp_3d_clk, &ebi1_fixed_clk.c);
2363static DEFINE_CLK_VOTER(ebi_grp_2d_clk, &ebi1_fixed_clk.c);
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07002364static DEFINE_CLK_VOTER(ebi_lcdc_clk, &ebi1_fixed_clk.c);
2365static DEFINE_CLK_VOTER(ebi_mddi_clk, &ebi1_fixed_clk.c);
2366static DEFINE_CLK_VOTER(ebi_tv_clk, &ebi1_fixed_clk.c);
2367static DEFINE_CLK_VOTER(ebi_vcd_clk, &ebi1_fixed_clk.c);
2368static DEFINE_CLK_VOTER(ebi_vfe_clk, &ebi1_fixed_clk.c);
2369static DEFINE_CLK_VOTER(ebi_adm_clk, &ebi1_fixed_clk.c);
2370
2371/*
2372 * SoC-specific functions required by clock-local driver
2373 */
2374
2375/* Update the sys_vdd voltage given a level. */
2376static int msm7x30_update_sys_vdd(enum sys_vdd_level level)
2377{
2378 int rc, target_mv;
2379 static const int mv[NUM_SYS_VDD_LEVELS] = {
2380 [NONE...LOW] = 1000,
2381 [NOMINAL] = 1100,
2382 [HIGH] = 1200,
2383 };
2384
2385 target_mv = mv[level];
2386 rc = msm_proc_comm(PCOM_CLKCTL_RPC_MIN_MSMC1, &target_mv, NULL);
2387 if (rc)
2388 goto out;
2389 if (target_mv) {
2390 rc = -EINVAL;
2391 goto out;
2392 }
2393out:
2394 return rc;
2395}
2396
2397#ifdef CONFIG_DEBUG_FS
2398
2399#define CLK_TEST_2(s) (s)
2400#define CLK_TEST_HS(s) (0x4000 | ((s) << 8))
2401#define CLK_TEST_LS(s) (0x4D40 | (s))
2402
2403struct measure_sel {
2404 u32 test_vector;
2405 struct clk *clk;
2406};
2407
2408static struct measure_sel measure_mux[] = {
2409 { CLK_TEST_2(0x03), &emdh_p_clk.c },
2410 { CLK_TEST_2(0x04), &pmdh_p_clk.c },
2411 { CLK_TEST_2(0x06), &mdp_p_clk.c },
2412 { CLK_TEST_2(0x07), &lpa_p_clk.c },
2413 { CLK_TEST_2(0x08), &usb_hs2_p_clk.c },
2414 { CLK_TEST_2(0x09), &spi_clk.c },
2415 { CLK_TEST_2(0x0A), &midi_clk.c },
2416 { CLK_TEST_2(0x0B), &i2c_2_clk.c },
2417 { CLK_TEST_2(0x0D), &mi2s_m_clk.c },
2418 { CLK_TEST_2(0x0E), &lpa_core_clk.c },
2419 { CLK_TEST_2(0x0F), &lpa_codec_clk.c },
2420 { CLK_TEST_2(0x10), &usb_hs3_p_clk.c },
2421 { CLK_TEST_2(0x11), &adm_p_clk.c },
2422 { CLK_TEST_2(0x13), &hdmi_clk.c },
2423 { CLK_TEST_2(0x14), &usb_hs_core_clk.c },
2424 { CLK_TEST_2(0x15), &usb_hs2_core_clk.c },
2425 { CLK_TEST_2(0x16), &usb_hs3_core_clk.c },
2426 { CLK_TEST_2(0x17), &mi2s_codec_tx_s_clk.c },
2427 { CLK_TEST_2(0x18), &spi_p_clk.c },
2428 { CLK_TEST_2(0x1A), &camif_pad_p_clk.c },
2429 { CLK_TEST_2(0x1C), &qup_i2c_clk.c },
2430 { CLK_TEST_2(0x1F), &mfc_div2_clk.c },
2431 { CLK_TEST_2(0x38), &mfc_clk.c },
2432
2433 { CLK_TEST_HS(0x00), &adm_clk.c },
2434 { CLK_TEST_HS(0x01), &mdp_lcdc_pad_pclk_clk.c },
2435 { CLK_TEST_HS(0x02), &mdp_lcdc_pclk_clk.c },
2436 { CLK_TEST_HS(0x03), &axi_rotator_clk.c },
2437 { CLK_TEST_HS(0x07), &axi_li_vg_clk.c },
2438 { CLK_TEST_HS(0x09), &axi_li_apps_clk.c },
2439 { CLK_TEST_HS(0x0E), &axi_li_jpeg_clk.c },
2440 { CLK_TEST_HS(0x0F), &emdh_clk.c },
2441 { CLK_TEST_HS(0x14), &mdp_clk.c },
2442 { CLK_TEST_HS(0x15), &pmdh_clk.c },
2443 { CLK_TEST_HS(0x19), &axi_grp_2d_clk.c },
2444 { CLK_TEST_HS(0x1A), &axi_li_grp_clk.c },
2445 { CLK_TEST_HS(0x1B), &axi_li_vfe_clk.c },
2446 { CLK_TEST_HS(0x1C), &grp_2d_clk.c },
2447 { CLK_TEST_HS(0x1E), &grp_3d_clk.c },
2448 { CLK_TEST_HS(0x1F), &imem_clk.c },
2449 { CLK_TEST_HS(0x20), &jpeg_clk.c },
2450 { CLK_TEST_HS(0x24), &axi_li_adsp_a_clk.c },
2451 { CLK_TEST_HS(0x26), &rotator_imem_clk.c },
2452 { CLK_TEST_HS(0x27), &axi_vpe_clk.c },
2453 { CLK_TEST_HS(0x2A), &axi_mfc_clk.c },
2454 { CLK_TEST_HS(0x2B), &axi_mdp_clk.c },
2455 { CLK_TEST_HS(0x2C), &vpe_clk.c },
2456 { CLK_TEST_HS(0x30), &vfe_camif_clk.c },
2457 { CLK_TEST_HS(0x31), &csi0_clk.c },
2458 { CLK_TEST_HS(0x32), &csi0_vfe_clk.c },
2459 { CLK_TEST_HS(0x33), &csi0_p_clk.c },
2460
2461 { CLK_TEST_LS(0x03), &ce_clk.c },
2462 { CLK_TEST_LS(0x04), &cam_m_clk.c },
2463 { CLK_TEST_LS(0x0C), &grp_2d_p_clk.c },
2464 { CLK_TEST_LS(0x0D), &i2c_clk.c },
2465 { CLK_TEST_LS(0x0E), &mi2s_codec_rx_m_clk.c },
2466 { CLK_TEST_LS(0x0F), &mi2s_codec_rx_s_clk.c },
2467 { CLK_TEST_LS(0x10), &mi2s_codec_tx_m_clk.c },
2468 { CLK_TEST_LS(0x13), &mdp_vsync_clk.c },
2469 { CLK_TEST_LS(0x15), &vfe_p_clk.c },
2470 { CLK_TEST_LS(0x16), &mdc_clk.c },
2471 { CLK_TEST_LS(0x17), &vfe_mdc_clk.c },
2472 { CLK_TEST_LS(0x18), &usb_hs_p_clk.c },
2473 { CLK_TEST_LS(0x1C), &uart1dm_p_clk.c },
2474 { CLK_TEST_LS(0x1E), &jpeg_p_clk.c },
2475 { CLK_TEST_LS(0x20), &sdac_clk.c },
2476 { CLK_TEST_LS(0x21), &sdc1_p_clk.c },
2477 { CLK_TEST_LS(0x22), &sdc1_clk.c },
2478 { CLK_TEST_LS(0x23), &sdc2_p_clk.c },
2479 { CLK_TEST_LS(0x24), &sdc2_clk.c },
2480 { CLK_TEST_LS(0x25), &tsif_p_clk.c },
2481 { CLK_TEST_LS(0x26), &sdac_m_clk.c },
2482 { CLK_TEST_LS(0x27), &grp_3d_p_clk.c },
2483 { CLK_TEST_LS(0x2A), &tsif_ref_clk.c },
2484 { CLK_TEST_LS(0x2B), &tv_enc_clk.c },
2485 { CLK_TEST_LS(0x2C), &tv_dac_clk.c },
2486 { CLK_TEST_LS(0x2D), &rotator_p_clk.c },
2487 { CLK_TEST_LS(0x2F), &uart1_clk.c },
2488 { CLK_TEST_LS(0x30), &uart1dm_clk.c },
2489 { CLK_TEST_LS(0x31), &uart2_clk.c },
2490 { CLK_TEST_LS(0x33), &usb_hs2_clk.c },
2491 { CLK_TEST_LS(0x34), &usb_hs3_clk.c },
2492 { CLK_TEST_LS(0x35), &mfc_p_clk.c },
2493 { CLK_TEST_LS(0x36), &vfe_clk.c },
2494 { CLK_TEST_LS(0x39), &sdc3_p_clk.c },
2495 { CLK_TEST_LS(0x3A), &sdc3_clk.c },
2496 { CLK_TEST_LS(0x3B), &sdc4_p_clk.c },
2497 { CLK_TEST_LS(0x3C), &sdc4_clk.c },
2498 { CLK_TEST_LS(0x3D), &uart2dm_clk.c },
2499 { CLK_TEST_LS(0x3E), &uart2dm_p_clk.c },
2500 { CLK_TEST_LS(0x3F), &usb_hs_clk.c },
2501};
2502
2503static struct measure_sel *find_measure_sel(struct clk *clk)
2504{
2505 int i;
2506
2507 for (i = 0; i < ARRAY_SIZE(measure_mux); i++)
2508 if (measure_mux[i].clk == clk)
2509 return &measure_mux[i];
2510 return NULL;
2511}
2512
2513static int measure_clk_set_parent(struct clk *clk, struct clk *parent)
2514{
2515 struct measure_sel *p;
2516 unsigned long flags;
2517
2518 if (!parent)
2519 return -EINVAL;
2520
2521 p = find_measure_sel(parent);
2522 if (!p)
2523 return -EINVAL;
2524
2525 spin_lock_irqsave(&local_clock_reg_lock, flags);
2526
2527 /* Program test vector. */
2528 if (p->test_vector <= 0xFF) {
2529 /* Select CLK_TEST_2 */
2530 writel_relaxed(0x4D40, CLK_TEST_BASE_REG);
2531 writel_relaxed(p->test_vector, CLK_TEST_2_BASE_REG);
2532 } else
2533 writel_relaxed(p->test_vector, CLK_TEST_BASE_REG);
2534
2535 spin_unlock_irqrestore(&local_clock_reg_lock, flags);
2536
2537 return 0;
2538}
2539
2540/* Sample clock for 'tcxo4_ticks' reference clock ticks. */
2541static u32 run_measurement(unsigned tcxo4_ticks)
2542{
2543 /* TCXO4_CNT_EN and RINGOSC_CNT_EN register values. */
2544 u32 reg_val_enable = readl_relaxed(MISC_CLK_CTL_BASE_REG) | 0x3;
2545 u32 reg_val_disable = reg_val_enable & ~0x3;
2546
2547 /* Stop counters and set the TCXO4 counter start value. */
2548 writel_relaxed(reg_val_disable, MISC_CLK_CTL_BASE_REG);
2549 writel_relaxed(tcxo4_ticks, TCXO_CNT_BASE_REG);
2550
2551 /* Run measurement and wait for completion. */
2552 writel_relaxed(reg_val_enable, MISC_CLK_CTL_BASE_REG);
2553 while (readl_relaxed(TCXO_CNT_DONE_BASE_REG) == 0)
2554 cpu_relax();
2555
2556 /* Stop counters. */
2557 writel_relaxed(reg_val_disable, MISC_CLK_CTL_BASE_REG);
2558
2559 return readl_relaxed(RINGOSC_CNT_BASE_REG);
2560}
2561
2562/* Perform a hardware rate measurement for a given clock.
2563 FOR DEBUG USE ONLY: Measurements take ~15 ms! */
2564static unsigned measure_clk_get_rate(struct clk *clk)
2565{
2566 unsigned long flags;
2567 u32 regval, prph_web_reg_old;
2568 u64 raw_count_short, raw_count_full;
2569 unsigned ret;
2570
2571 clk_enable(&tcxo_clk.c);
2572
2573 spin_lock_irqsave(&local_clock_reg_lock, flags);
2574
2575 /* Enable TCXO4 clock branch and root. */
2576 prph_web_reg_old = readl_relaxed(PRPH_WEB_NS_BASE_REG);
2577 regval = prph_web_reg_old | BIT(9) | BIT(11);
2578 writel_relaxed(regval, PRPH_WEB_NS_BASE_REG);
2579
2580 /*
2581 * The ring oscillator counter will not reset if the measured clock
2582 * is not running. To detect this, run a short measurement before
2583 * the full measurement. If the raw results of the two are the same
2584 * then the clock must be off.
2585 */
2586
2587 /* Run a short measurement. (~1 ms) */
2588 raw_count_short = run_measurement(0x1000);
2589 /* Run a full measurement. (~14 ms) */
2590 raw_count_full = run_measurement(0x10000);
2591
2592 /* Disable TCXO4 clock branch and root. */
2593 writel_relaxed(prph_web_reg_old, PRPH_WEB_NS_BASE_REG);
2594
2595 spin_unlock_irqrestore(&local_clock_reg_lock, flags);
2596
2597 /* Return 0 if the clock is off. */
2598 if (raw_count_full == raw_count_short)
2599 ret = 0;
2600 else {
2601 /* Compute rate in Hz. */
2602 raw_count_full = ((raw_count_full * 10) + 15) * 4800000;
2603 do_div(raw_count_full, ((0x10000 * 10) + 35));
2604 ret = raw_count_full;
2605 }
2606
2607 clk_disable(&tcxo_clk.c);
2608
2609 return ret;
2610}
2611#else /* !CONFIG_DEBUG_FS */
2612static int measure_clk_set_parent(struct clk *clk, struct clk *parent)
2613{
2614 return -EINVAL;
2615}
2616
2617static unsigned measure_clk_get_rate(struct clk *clk)
2618{
2619 return 0;
2620}
2621#endif /* CONFIG_DEBUG_FS */
2622
2623static struct clk_ops measure_clk_ops = {
2624 .set_parent = measure_clk_set_parent,
2625 .get_rate = measure_clk_get_rate,
2626 .is_local = local_clk_is_local,
2627};
2628
2629static struct clk measure_clk = {
2630 .dbg_name = "measure_clk",
2631 .ops = &measure_clk_ops,
2632 CLK_INIT(measure_clk),
2633};
2634
2635/* Implementation for clk_set_flags(). */
2636int soc_clk_set_flags(struct clk *clk, unsigned clk_flags)
2637{
2638 uint32_t regval, ret = 0;
2639 unsigned long flags;
2640
2641 spin_lock_irqsave(&local_clock_reg_lock, flags);
2642
2643 if (clk == &vfe_clk.c) {
2644 regval = readl_relaxed(CAM_VFE_NS_REG);
2645 /* Flag values chosen for backward compatibility
2646 * with proc_comm remote clock control. */
2647 if (clk_flags == 0x00000100) {
2648 /* Select external source. */
2649 regval |= BIT(14);
2650 } else if (clk_flags == 0x00000200) {
2651 /* Select internal source. */
2652 regval &= ~BIT(14);
2653 } else
2654 ret = -EINVAL;
2655
2656 writel_relaxed(regval, CAM_VFE_NS_REG);
2657 /* Make sure write is issued before returning. */
2658 mb();
2659 } else
2660 ret = -EPERM;
2661
2662 spin_unlock_irqrestore(&local_clock_reg_lock, flags);
2663
2664 return ret;
2665}
2666
2667static int msm7x30_clk_reset(struct clk *clk, enum clk_reset_action action)
2668{
2669 /* reset_mask is actually a proc_comm id */
2670 unsigned id = to_rcg_clk(clk)->b.reset_mask;
2671 return pc_clk_reset(id, action);
2672}
2673
2674static int soc_branch_clk_reset(struct clk *clk, enum clk_reset_action action)
2675{
2676 unsigned id = to_branch_clk(clk)->b.reset_mask;
2677 return pc_clk_reset(id, action);
2678}
2679
2680/*
2681 * Clock ownership detection code
2682 */
2683
2684enum {
2685 SH2_OWN_GLBL,
2686 SH2_OWN_APPS1,
2687 SH2_OWN_APPS2,
2688 SH2_OWN_ROW1,
2689 SH2_OWN_ROW2,
2690 SH2_OWN_APPS3,
2691 NUM_OWNERSHIP
2692};
2693static __initdata uint32_t ownership_regs[NUM_OWNERSHIP];
2694
2695static void __init cache_ownership(void)
2696{
2697 ownership_regs[SH2_OWN_GLBL] = readl_relaxed(SH2_OWN_GLBL_BASE_REG);
2698 ownership_regs[SH2_OWN_APPS1] = readl_relaxed(SH2_OWN_APPS1_BASE_REG);
2699 ownership_regs[SH2_OWN_APPS2] = readl_relaxed(SH2_OWN_APPS2_BASE_REG);
2700 ownership_regs[SH2_OWN_ROW1] = readl_relaxed(SH2_OWN_ROW1_BASE_REG);
2701 ownership_regs[SH2_OWN_ROW2] = readl_relaxed(SH2_OWN_ROW2_BASE_REG);
2702 ownership_regs[SH2_OWN_APPS3] = readl_relaxed(SH2_OWN_APPS3_BASE_REG);
2703}
2704
2705static void __init print_ownership(void)
2706{
2707 pr_info("Clock ownership\n");
2708 pr_info(" GLBL : %08x\n", ownership_regs[SH2_OWN_GLBL]);
2709 pr_info(" APPS : %08x %08x %08x\n", ownership_regs[SH2_OWN_APPS1],
2710 ownership_regs[SH2_OWN_APPS2], ownership_regs[SH2_OWN_APPS3]);
2711 pr_info(" ROW : %08x %08x\n", ownership_regs[SH2_OWN_ROW1],
2712 ownership_regs[SH2_OWN_ROW2]);
2713}
2714
2715#define O(x) (&ownership_regs[(SH2_OWN_##x)])
2716#define OWN(r, b, name, clk, dev) \
2717 { \
2718 .lk = CLK_LOOKUP(name, clk.c, dev), \
2719 .remote = &p_##clk.c, \
2720 .reg = O(r), \
2721 .bit = BIT(b), \
2722 }
2723
2724static struct clk_local_ownership {
2725 struct clk_lookup lk;
2726 const u32 *reg;
2727 const u32 bit;
2728 struct clk *remote;
2729} ownership_map[] __initdata = {
2730 /* Sources */
2731 { CLK_LOOKUP("pll1_clk", pll1_clk.c, "acpu") },
2732 { CLK_LOOKUP("pll2_clk", pll2_clk.c, "acpu") },
2733 { CLK_LOOKUP("pll3_clk", pll3_clk.c, "acpu") },
2734 { CLK_LOOKUP("measure", measure_clk, "debug") },
2735
2736 /* PCOM */
2737 { CLK_LOOKUP("adsp_clk", adsp_clk.c, NULL) },
2738 { CLK_LOOKUP("codec_ssbi_clk", codec_ssbi_clk.c, NULL) },
2739 { CLK_LOOKUP("ebi1_clk", ebi1_clk.c, NULL) },
2740 { CLK_LOOKUP("ebi1_fixed_clk", ebi1_fixed_clk.c, NULL) },
2741 { CLK_LOOKUP("ecodec_clk", ecodec_clk.c, NULL) },
Matt Wagantallb86ad262011-10-24 19:50:29 -07002742 { CLK_LOOKUP("core_clk", gp_clk.c, NULL) },
Matt Wagantalle2522372011-08-17 14:52:21 -07002743 { CLK_LOOKUP("core_clk", uart3_clk.c, "msm_serial.2") },
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07002744 { CLK_LOOKUP("usb_phy_clk", usb_phy_clk.c, NULL) },
2745
2746 /* Voters */
2747 { CLK_LOOKUP("ebi1_dtv_clk", ebi_dtv_clk.c, NULL) },
Matt Wagantall9dc01632011-08-17 18:55:04 -07002748 { CLK_LOOKUP("bus_clk", ebi_grp_2d_clk.c, "kgsl-2d0.0") },
2749 { CLK_LOOKUP("bus_clk", ebi_grp_3d_clk.c, "kgsl-3d0.0") },
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07002750 { CLK_LOOKUP("ebi1_lcdc_clk", ebi_lcdc_clk.c, NULL) },
2751 { CLK_LOOKUP("ebi1_mddi_clk", ebi_mddi_clk.c, NULL) },
2752 { CLK_LOOKUP("ebi1_tv_clk", ebi_tv_clk.c, NULL) },
Matt Wagantall3f7660b2011-08-17 21:25:13 -07002753 { CLK_LOOKUP("mem_clk", ebi_vcd_clk.c, "msm_vidc.0") },
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07002754 { CLK_LOOKUP("ebi1_vfe_clk", ebi_vfe_clk.c, NULL) },
Matt Wagantalle1a86062011-08-18 17:46:10 -07002755 { CLK_LOOKUP("mem_clk", ebi_adm_clk.c, "msm_dmov") },
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07002756
2757 /*
2758 * This is a many-to-one mapping because we don't know how the remote
2759 * clock code has decided to handle the dependencies between clocks for
2760 * a particular hardware block. We determine the ownership for all the
2761 * clocks going into a block by checking the ownership bit of one
2762 * register (usually the ns register).
2763 */
Matt Wagantall9dc01632011-08-17 18:55:04 -07002764 OWN(APPS1, 6, "core_clk", grp_2d_clk, "kgsl-2d0.0"),
Matt Wagantall49722712011-08-17 18:50:53 -07002765 OWN(APPS1, 6, "core_clk", grp_2d_clk, "footswitch-pcom.0"),
Matt Wagantall9dc01632011-08-17 18:55:04 -07002766 OWN(APPS1, 6, "iface_clk", grp_2d_p_clk, "kgsl-2d0.0"),
Matt Wagantall49722712011-08-17 18:50:53 -07002767 OWN(APPS1, 6, "iface_clk", grp_2d_p_clk, "footswitch-pcom.0"),
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07002768 OWN(APPS1, 31, "hdmi_clk", hdmi_clk, NULL),
2769 OWN(APPS1, 0, "jpeg_clk", jpeg_clk, NULL),
2770 OWN(APPS1, 0, "jpeg_pclk", jpeg_p_clk, NULL),
2771 OWN(APPS1, 23, "lpa_codec_clk", lpa_codec_clk, NULL),
2772 OWN(APPS1, 23, "lpa_core_clk", lpa_core_clk, NULL),
2773 OWN(APPS1, 23, "lpa_pclk", lpa_p_clk, NULL),
2774 OWN(APPS1, 28, "mi2s_m_clk", mi2s_m_clk, NULL),
2775 OWN(APPS1, 28, "mi2s_s_clk", mi2s_s_clk, NULL),
2776 OWN(APPS1, 12, "mi2s_codec_rx_m_clk", mi2s_codec_rx_m_clk, NULL),
2777 OWN(APPS1, 12, "mi2s_codec_rx_s_clk", mi2s_codec_rx_s_clk, NULL),
2778 OWN(APPS1, 14, "mi2s_codec_tx_m_clk", mi2s_codec_tx_m_clk, NULL),
2779 OWN(APPS1, 14, "mi2s_codec_tx_s_clk", mi2s_codec_tx_s_clk, NULL),
2780 { CLK_LOOKUP("midi_clk", midi_clk.c, NULL),
2781 O(APPS1), BIT(22) },
2782 OWN(APPS1, 26, "sdac_clk", sdac_clk, NULL),
2783 OWN(APPS1, 26, "sdac_m_clk", sdac_m_clk, NULL),
2784 OWN(APPS1, 8, "vfe_clk", vfe_clk, NULL),
Matt Wagantall49722712011-08-17 18:50:53 -07002785 OWN(APPS1, 8, "core_clk", vfe_clk, "footswitch-pcom.8"),
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07002786 OWN(APPS1, 8, "vfe_camif_clk", vfe_camif_clk, NULL),
2787 OWN(APPS1, 8, "vfe_mdc_clk", vfe_mdc_clk, NULL),
2788 OWN(APPS1, 8, "vfe_pclk", vfe_p_clk, NULL),
Matt Wagantall49722712011-08-17 18:50:53 -07002789 OWN(APPS1, 8, "iface_clk", vfe_p_clk, "footswitch-pcom.8"),
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07002790
Matt Wagantall9dc01632011-08-17 18:55:04 -07002791 OWN(APPS2, 0, "core_clk", grp_3d_clk, "kgsl-3d0.0"),
Matt Wagantall49722712011-08-17 18:50:53 -07002792 OWN(APPS2, 0, "core_clk", grp_3d_clk, "footswitch-pcom.2"),
Matt Wagantall9dc01632011-08-17 18:55:04 -07002793 OWN(APPS2, 0, "iface_clk", grp_3d_p_clk, "kgsl-3d0.0"),
Matt Wagantall49722712011-08-17 18:50:53 -07002794 OWN(APPS2, 0, "iface_clk", grp_3d_p_clk, "footswitch-pcom.2"),
Matt Wagantall9dc01632011-08-17 18:55:04 -07002795 { CLK_LOOKUP("src_clk", grp_3d_src_clk.c, "kgsl-3d0.0"),
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07002796 O(APPS2), BIT(0), &p_grp_3d_clk.c },
Matt Wagantall49722712011-08-17 18:50:53 -07002797 { CLK_LOOKUP("src_clk", grp_3d_src_clk.c, "footswitch-pcom.2"),
2798 O(APPS2), BIT(0), &p_grp_3d_clk.c },
Matt Wagantall9dc01632011-08-17 18:55:04 -07002799 OWN(APPS2, 0, "mem_clk", imem_clk, "kgsl-3d0.0"),
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07002800 OWN(APPS2, 4, "mdp_lcdc_pad_pclk_clk", mdp_lcdc_pad_pclk_clk, NULL),
2801 OWN(APPS2, 4, "mdp_lcdc_pclk_clk", mdp_lcdc_pclk_clk, NULL),
2802 OWN(APPS2, 4, "mdp_pclk", mdp_p_clk, NULL),
Matt Wagantall49722712011-08-17 18:50:53 -07002803 OWN(APPS2, 4, "iface_clk", mdp_p_clk, "footswitch-pcom.4"),
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07002804 OWN(APPS2, 28, "mdp_vsync_clk", mdp_vsync_clk, NULL),
Matt Wagantall640e5fd2011-08-17 16:08:53 -07002805 OWN(APPS2, 5, "ref_clk", tsif_ref_clk, "msm_tsif.0"),
2806 OWN(APPS2, 5, "iface_clk", tsif_p_clk, "msm_tsif.0"),
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07002807 { CLK_LOOKUP("tv_src_clk", tv_clk.c, NULL),
2808 O(APPS2), BIT(2), &p_tv_enc_clk.c },
2809 OWN(APPS2, 2, "tv_dac_clk", tv_dac_clk, NULL),
2810 OWN(APPS2, 2, "tv_enc_clk", tv_enc_clk, NULL),
2811
2812 OWN(ROW1, 7, "emdh_clk", emdh_clk, "msm_mddi.1"),
2813 OWN(ROW1, 7, "emdh_pclk", emdh_p_clk, "msm_mddi.1"),
Matt Wagantallac294852011-08-17 15:44:58 -07002814 OWN(ROW1, 11, "core_clk", i2c_clk, "msm_i2c.0"),
2815 OWN(ROW1, 12, "core_clk", i2c_2_clk, "msm_i2c.2"),
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07002816 OWN(ROW1, 17, "mdc_clk", mdc_clk, NULL),
2817 OWN(ROW1, 19, "mddi_clk", pmdh_clk, NULL),
2818 OWN(ROW1, 19, "mddi_pclk", pmdh_p_clk, NULL),
Matt Wagantall37ce3842011-08-17 16:00:36 -07002819 OWN(ROW1, 23, "core_clk", sdc1_clk, "msm_sdcc.1"),
2820 OWN(ROW1, 23, "iface_clk", sdc1_p_clk, "msm_sdcc.1"),
2821 OWN(ROW1, 25, "core_clk", sdc2_clk, "msm_sdcc.2"),
2822 OWN(ROW1, 25, "iface_clk", sdc2_p_clk, "msm_sdcc.2"),
2823 OWN(ROW1, 27, "core_clk", sdc3_clk, "msm_sdcc.3"),
2824 OWN(ROW1, 27, "iface_clk", sdc3_p_clk, "msm_sdcc.3"),
2825 OWN(ROW1, 29, "core_clk", sdc4_clk, "msm_sdcc.4"),
2826 OWN(ROW1, 29, "iface_clk", sdc4_p_clk, "msm_sdcc.4"),
Matt Wagantalle2522372011-08-17 14:52:21 -07002827 OWN(ROW1, 0, "core_clk", uart2_clk, "msm_serial.1"),
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07002828 OWN(ROW1, 2, "usb_hs2_clk", usb_hs2_clk, NULL),
2829 OWN(ROW1, 2, "usb_hs2_core_clk", usb_hs2_core_clk, NULL),
2830 OWN(ROW1, 2, "usb_hs2_pclk", usb_hs2_p_clk, NULL),
2831 OWN(ROW1, 4, "usb_hs3_clk", usb_hs3_clk, NULL),
2832 OWN(ROW1, 4, "usb_hs3_core_clk", usb_hs3_core_clk, NULL),
2833 OWN(ROW1, 4, "usb_hs3_pclk", usb_hs3_p_clk, NULL),
2834
Matt Wagantallac294852011-08-17 15:44:58 -07002835 OWN(ROW2, 3, "core_clk", qup_i2c_clk, "qup_i2c.4"),
2836 OWN(ROW2, 1, "core_clk", spi_clk, "spi_qsd.0"),
2837 OWN(ROW2, 1, "iface_clk", spi_p_clk, "spi_qsd.0"),
Matt Wagantalle2522372011-08-17 14:52:21 -07002838 OWN(ROW2, 9, "core_clk", uart1_clk, "msm_serial.0"),
2839 OWN(ROW2, 6, "core_clk", uart1dm_clk, "msm_serial_hs.0"),
2840 OWN(ROW2, 8, "core_clk", uart2dm_clk, "msm_serial_hs.1"),
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07002841 OWN(ROW2, 11, "usb_hs_clk", usb_hs_clk, NULL),
2842 OWN(ROW2, 11, "usb_hs_core_clk", usb_hs_core_clk, NULL),
2843 OWN(ROW2, 11, "usb_hs_pclk", usb_hs_p_clk, NULL),
2844
2845 OWN(APPS3, 6, "cam_m_clk", cam_m_clk, NULL),
2846 OWN(APPS3, 6, "camif_pad_pclk", camif_pad_p_clk, NULL),
Matt Wagantallac294852011-08-17 15:44:58 -07002847 OWN(APPS3, 6, "iface_clk", camif_pad_p_clk, "qup_i2c.4"),
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07002848 OWN(APPS3, 11, "csi_clk", csi0_clk, NULL),
2849 OWN(APPS3, 11, "csi_vfe_clk", csi0_vfe_clk, NULL),
2850 OWN(APPS3, 11, "csi_pclk", csi0_p_clk, NULL),
2851 OWN(APPS3, 0, "mdp_clk", mdp_clk, NULL),
Matt Wagantall49722712011-08-17 18:50:53 -07002852 OWN(APPS3, 0, "core_clk", mdp_clk, "footswitch-pcom.4"),
Matt Wagantall3f7660b2011-08-17 21:25:13 -07002853 OWN(APPS3, 2, "core_clk", mfc_clk, "msm_vidc.0"),
Matt Wagantall49722712011-08-17 18:50:53 -07002854 OWN(APPS3, 2, "core_clk", mfc_clk, "footswitch-pcom.5"),
Matt Wagantall3f7660b2011-08-17 21:25:13 -07002855 OWN(APPS3, 2, "core_div2_clk", mfc_div2_clk, "msm_vidc.0"),
2856 OWN(APPS3, 2, "iface_clk", mfc_p_clk, "msm_vidc.0"),
Matt Wagantall49722712011-08-17 18:50:53 -07002857 OWN(APPS3, 2, "iface_clk", mfc_p_clk, "footswitch-pcom.5"),
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07002858 OWN(APPS3, 4, "vpe_clk", vpe_clk, NULL),
Matt Wagantall49722712011-08-17 18:50:53 -07002859 OWN(APPS3, 4, "core_clk", vpe_clk, "footswitch-pcom.9"),
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07002860
Matt Wagantalle1a86062011-08-18 17:46:10 -07002861 OWN(GLBL, 8, "core_clk", adm_clk, "msm_dmov"),
2862 { CLK_LOOKUP("iface_clk", adm_p_clk.c, "msm_dmov"),
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07002863 O(GLBL), BIT(13), &dummy_clk },
Matt Wagantallc4b3a4d2011-08-17 16:58:39 -07002864 OWN(GLBL, 8, "core_clk", ce_clk, "qce.0"),
Matt Wagantalle0b11452011-09-13 17:25:33 -07002865 OWN(GLBL, 8, "core_clk", ce_clk, "crypto.0"),
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07002866 OWN(GLBL, 13, "rotator_clk", axi_rotator_clk, NULL),
Matt Wagantall49722712011-08-17 18:50:53 -07002867 OWN(GLBL, 13, "core_clk", axi_rotator_clk, "footswitch-pcom.6"),
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07002868 OWN(GLBL, 13, "rotator_imem_clk", rotator_imem_clk, NULL),
2869 OWN(GLBL, 13, "rotator_pclk", rotator_p_clk, NULL),
Matt Wagantall49722712011-08-17 18:50:53 -07002870 OWN(GLBL, 13, "iface_clk", rotator_p_clk, "footswitch-pcom.6"),
Matt Wagantalle2522372011-08-17 14:52:21 -07002871 { CLK_LOOKUP("iface_clk", uart1dm_p_clk.c, "msm_serial_hs.0"),
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07002872 O(GLBL), BIT(8), &dummy_clk },
Matt Wagantalle2522372011-08-17 14:52:21 -07002873 { CLK_LOOKUP("iface_clk", uart2dm_p_clk.c, "msm_serial_hs.1"),
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07002874 O(GLBL), BIT(8), &dummy_clk },
2875};
2876
2877static struct clk_lookup msm_clocks_7x30[ARRAY_SIZE(ownership_map)];
2878
2879static void __init set_clock_ownership(void)
2880{
2881 unsigned i;
2882 struct clk_lookup *lk;
2883
2884 for (i = 0; i < ARRAY_SIZE(ownership_map); i++) {
2885 const u32 *reg = ownership_map[i].reg;
2886 u32 bit = ownership_map[i].bit;
2887 struct clk *remote = ownership_map[i].remote;
2888
2889 lk = &ownership_map[i].lk;
2890 memcpy(&msm_clocks_7x30[i], lk, sizeof(*lk));
2891
2892 if (reg && !(*reg & bit))
2893 msm_clocks_7x30[i].clk = remote;
2894 }
2895}
2896
2897/*
2898 * Miscellaneous clock register initializations
2899 */
2900static const struct reg_init {
2901 const void __iomem *reg;
2902 uint32_t mask;
2903 uint32_t val;
2904} ri_list[] __initconst = {
2905 /* Enable UMDX_P clock. Known to causes issues, so never turn off. */
2906 {GLBL_CLK_ENA_2_SC_REG, BIT(2), BIT(2)},
2907
2908 /* Disable all the child clocks of USB_HS_SRC. */
2909 { USBH_NS_REG, BIT(13) | BIT(9), 0 },
2910 { USBH2_NS_REG, BIT(9) | BIT(4), 0 },
2911 { USBH3_NS_REG, BIT(9) | BIT(4), 0 },
2912
2913 {EMDH_NS_REG, BM(18, 17) , BVAL(18, 17, 0x3)}, /* RX div = div-4. */
2914 {PMDH_NS_REG, BM(18, 17), BVAL(18, 17, 0x3)}, /* RX div = div-4. */
2915 /* MI2S_CODEC_RX_S src = MI2S_CODEC_RX_M. */
2916 {MI2S_RX_NS_REG, BIT(14), 0x0},
2917 /* MI2S_CODEC_TX_S src = MI2S_CODEC_TX_M. */
2918 {MI2S_TX_NS_REG, BIT(14), 0x0},
2919 {MI2S_NS_REG, BIT(14), 0x0}, /* MI2S_S src = MI2S_M. */
2920 /* Allow DSP to decide the LPA CORE src. */
2921 {LPA_CORE_CLK_MA0_REG, BIT(0), BIT(0)},
2922 {LPA_CORE_CLK_MA2_REG, BIT(0), BIT(0)},
2923 {MI2S_CODEC_RX_DIV_REG, 0xF, 0xD}, /* MI2S_CODEC_RX_S div = div-8. */
2924 {MI2S_CODEC_TX_DIV_REG, 0xF, 0xD}, /* MI2S_CODEC_TX_S div = div-8. */
2925 {MI2S_DIV_REG, 0xF, 0x7}, /* MI2S_S div = div-8. */
2926 {MDC_NS_REG, 0x3, 0x3}, /* MDC src = external MDH src. */
2927 {SDAC_NS_REG, BM(15, 14), 0x0}, /* SDAC div = div-1. */
2928 /* Disable sources TCXO/5 & TCXO/6. UART1 src = TCXO*/
2929 {UART_NS_REG, BM(26, 25) | BM(2, 0), 0x0},
2930 /* HDMI div = div-1, non-inverted. tv_enc_src = tv_clk_src */
2931 {HDMI_NS_REG, 0x7, 0x0},
2932 {TV_NS_REG, BM(15, 14), 0x0}, /* tv_clk_src_div2 = div-1 */
2933
2934 /* USBH core clocks src = USB_HS_SRC. */
2935 {USBH_NS_REG, BIT(15), BIT(15)},
2936 {USBH2_NS_REG, BIT(6), BIT(6)},
2937 {USBH3_NS_REG, BIT(6), BIT(6)},
2938};
2939
2940/* Local clock driver initialization. */
Stephen Boydbb600ae2011-08-02 20:11:40 -07002941static void __init msm7x30_clock_init(void)
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07002942{
2943 int i;
2944 uint32_t val;
2945
2946 cache_ownership();
2947 print_ownership();
2948 set_clock_ownership();
2949
2950 soc_update_sys_vdd = msm7x30_update_sys_vdd;
2951
2952 /* When we have no local clock control, the rest of the code in this
2953 * function is a NOP since writes to shadow regions that we don't own
2954 * are ignored. */
2955
2956 clk_set_rate(&usb_hs_src_clk.c, clk_tbl_usb[1].freq_hz);
2957
2958 for (i = 0; i < ARRAY_SIZE(ri_list); i++) {
2959 val = readl_relaxed(ri_list[i].reg);
2960 val &= ~ri_list[i].mask;
2961 val |= ri_list[i].val;
2962 writel_relaxed(val, ri_list[i].reg);
2963 }
2964
2965 clk_set_rate(&i2c_clk.c, 19200000);
2966 clk_set_rate(&i2c_2_clk.c, 19200000);
2967 clk_set_rate(&qup_i2c_clk.c, 19200000);
2968 clk_set_rate(&uart1_clk.c, 19200000);
2969 clk_set_rate(&uart2_clk.c, 19200000);
2970 clk_set_rate(&mi2s_m_clk.c, 12288000);
2971 clk_set_rate(&midi_clk.c, 98304000);
2972 clk_set_rate(&mdp_vsync_clk.c, 24576000);
2973 clk_set_rate(&glbl_root_clk.c, 1);
2974 clk_set_rate(&mdc_clk.c, 1);
2975 /* Sync the LPA_CODEC clock to MI2S_CODEC_RX */
2976 clk_set_rate(&lpa_codec_clk.c, 1);
2977 /* Sync the GRP2D clock to AXI */
2978 clk_set_rate(&grp_2d_clk.c, 1);
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07002979}
2980
Stephen Boydbb600ae2011-08-02 20:11:40 -07002981struct clock_init_data msm7x30_clock_init_data __initdata = {
2982 .table = msm_clocks_7x30,
2983 .size = ARRAY_SIZE(msm_clocks_7x30),
2984 .init = msm7x30_clock_init,
2985};
2986
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07002987/*
2988 * Clock operation handler registration
2989 */
Matt Wagantall84f43fd2011-08-16 23:28:38 -07002990static struct clk_ops clk_ops_rcg_7x30 = {
Matt Wagantall0625ea02011-07-13 18:51:56 -07002991 .enable = rcg_clk_enable,
2992 .disable = rcg_clk_disable,
2993 .auto_off = rcg_clk_auto_off,
2994 .set_rate = rcg_clk_set_rate,
2995 .set_min_rate = rcg_clk_set_min_rate,
Matt Wagantall0625ea02011-07-13 18:51:56 -07002996 .get_rate = rcg_clk_get_rate,
2997 .list_rate = rcg_clk_list_rate,
2998 .is_enabled = rcg_clk_is_enabled,
2999 .round_rate = rcg_clk_round_rate,
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07003000 .reset = msm7x30_clk_reset,
3001 .set_flags = soc_clk_set_flags,
3002 .is_local = local_clk_is_local,
Matt Wagantall0625ea02011-07-13 18:51:56 -07003003 .get_parent = rcg_clk_get_parent,
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07003004};
3005
3006static struct clk_ops clk_ops_branch = {
3007 .enable = branch_clk_enable,
3008 .disable = branch_clk_disable,
3009 .auto_off = branch_clk_auto_off,
3010 .is_enabled = branch_clk_is_enabled,
3011 .reset = soc_branch_clk_reset,
3012 .set_flags = soc_clk_set_flags,
3013 .is_local = local_clk_is_local,
3014 .get_parent = branch_clk_get_parent,
3015 .set_parent = branch_clk_set_parent,
3016};