blob: 225ea2b8e2d8c7d2cae1e39038b7a814e9086e0f [file] [log] [blame]
Manu Gautam5143b252012-01-05 19:25:23 -08001/* Copyright (c) 2009-2012, Code Aurora Forum. All rights reserved.
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07002 *
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>
Steve Mucklef132c6c2012-06-06 18:30:57 -070028#include <mach/proc_comm.h>
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -070029
30#include "clock.h"
31#include "clock-local.h"
32#include "clock-pcom.h"
33#include "clock-voter.h"
Vikram Mulukutla681d8682012-03-09 23:56:20 -080034#include "clock-pll.h"
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -070035
36#define REG_BASE(off) (MSM_CLK_CTL_BASE + (off))
37#define REG(off) (MSM_CLK_CTL_SH2_BASE + (off))
38
39/* Shadow-region 2 (SH2) registers. */
40#define QUP_I2C_NS_REG REG(0x04F0)
41#define CAM_NS_REG REG(0x0374)
42#define CAM_VFE_NS_REG REG(0x0044)
43#define CLK_HALT_STATEA_REG REG(0x0108)
44#define CLK_HALT_STATEB_REG REG(0x010C)
45#define CLK_HALT_STATEC_REG REG(0x02D4)
46#define CSI_NS_REG REG(0x0174)
47#define EMDH_NS_REG REG(0x0050)
48#define GLBL_CLK_ENA_2_SC_REG REG(0x03C0)
49#define GLBL_CLK_ENA_SC_REG REG(0x03BC)
50#define GLBL_CLK_STATE_2_REG REG(0x037C)
51#define GLBL_CLK_STATE_REG REG(0x0004)
52#define GRP_2D_NS_REG REG(0x0034)
53#define GRP_NS_REG REG(0x0084)
54#define HDMI_NS_REG REG(0x0484)
55#define I2C_2_NS_REG REG(0x02D8)
56#define I2C_NS_REG REG(0x0068)
57#define JPEG_NS_REG REG(0x0164)
58#define LPA_CORE_CLK_MA0_REG REG(0x04F4)
59#define LPA_CORE_CLK_MA2_REG REG(0x04FC)
60#define LPA_NS_REG REG(0x02E8)
61#define MDC_NS_REG REG(0x007C)
62#define MDP_LCDC_NS_REG REG(0x0390)
63#define MDP_NS_REG REG(0x014C)
64#define MDP_VSYNC_REG REG(0x0460)
65#define MFC_NS_REG REG(0x0154)
66#define MI2S_CODEC_RX_DIV_REG REG(0x02EC)
67#define MI2S_CODEC_TX_DIV_REG REG(0x02F0)
68#define MI2S_DIV_REG REG(0x02E4)
69#define MI2S_NS_REG REG(0x02E0)
70#define MI2S_RX_NS_REG REG(0x0070)
71#define MI2S_TX_NS_REG REG(0x0078)
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -070072#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. */
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700124#define N8(msb, lsb, m, n) (BVAL(msb, lsb, ~(n-m)) | BVAL(6, 5, \
125 (MN_MODE_DUAL_EDGE * !!(n))))
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700126#define N16(m, n) (BVAL(31, 16, ~(n-m)) | BVAL(6, 5, \
127 (MN_MODE_DUAL_EDGE * !!(n))))
128#define SPDIV(s, d) (BVAL(4, 3, d-1) | BVAL(2, 0, s))
129#define SDIV(s, d) (BVAL(6, 3, d-1) | BVAL(2, 0, s))
130#define F_MASK_BASIC (BM(6, 3)|BM(2, 0))
131#define F_MASK_MND16 (BM(31, 16)|BM(6, 5)|BM(4, 3)|BM(2, 0))
132#define F_MASK_MND8(m, l) (BM(m, l)|BM(6, 5)|BM(4, 3)|BM(2, 0))
133
134/*
135 * Clock frequency definitions and macros
136 */
Matt Wagantalle18bbc82011-10-06 10:07:28 -0700137#define F_BASIC(f, s, div) \
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700138 { \
139 .freq_hz = f, \
140 .src_clk = &s##_clk.c, \
141 .ns_val = SDIV(SRC_SEL_##s, div), \
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700142 }
143
Matt Wagantalle18bbc82011-10-06 10:07:28 -0700144#define F_MND16(f, s, div, m, n) \
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700145 { \
146 .freq_hz = f, \
147 .src_clk = &s##_clk.c, \
148 .md_val = MD16(m, n), \
149 .ns_val = N16(m, n) | SPDIV(SRC_SEL_##s, div), \
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700150 }
151
Matt Wagantalle18bbc82011-10-06 10:07:28 -0700152#define F_MND8(f, nmsb, nlsb, s, div, m, n) \
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700153 { \
154 .freq_hz = f, \
155 .src_clk = &s##_clk.c, \
Stephen Boydd10d2642012-01-23 18:09:00 -0800156 .md_val = MD8(8, m, 0, n), \
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700157 .ns_val = N8(nmsb, nlsb, m, n) | SPDIV(SRC_SEL_##s, div), \
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700158 }
159
Matt Wagantalle18bbc82011-10-06 10:07:28 -0700160enum vdd_dig_levels {
161 VDD_DIG_NONE,
162 VDD_DIG_LOW,
163 VDD_DIG_NOMINAL,
164 VDD_DIG_HIGH
165};
166
167static int set_vdd_dig(struct clk_vdd_class *vdd_class, int level)
168{
169 int rc, target_mv;
170
171 static const int mv[] = {
172 [VDD_DIG_NONE] = 1000,
173 [VDD_DIG_LOW] = 1000,
174 [VDD_DIG_NOMINAL] = 1100,
175 [VDD_DIG_HIGH] = 1200
176 };
177
178 target_mv = mv[level];
179 rc = msm_proc_comm(PCOM_CLKCTL_RPC_MIN_MSMC1, &target_mv, NULL);
180 if (rc)
181 return rc;
182 if (target_mv)
183 rc = -EINVAL;
184
185 return rc;
186}
187
188static DEFINE_VDD_CLASS(vdd_dig, set_vdd_dig);
189
190#define VDD_DIG_FMAX_MAP1(l1, f1) \
191 .vdd_class = &vdd_dig, \
192 .fmax[VDD_DIG_##l1] = (f1)
193#define VDD_DIG_FMAX_MAP2(l1, f1, l2, f2) \
194 .vdd_class = &vdd_dig, \
195 .fmax[VDD_DIG_##l1] = (f1), \
196 .fmax[VDD_DIG_##l2] = (f2)
197
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700198#define PCOM_XO_DISABLE 0
199#define PCOM_XO_ENABLE 1
200#define PCOM_XO_TCXO 0
201#define PCOM_XO_LPXO 1
202
Matt Wagantallf82f2942012-01-27 13:56:13 -0800203static bool pcom_is_local(struct clk *c)
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700204{
205 return false;
206}
207
208static int pcom_xo_enable(unsigned pcom_id, unsigned enable)
209{
210 /* TODO: Check return code in pcom_id */
211 return msm_proc_comm(PCOM_CLKCTL_RPC_SRC_REQUEST, &pcom_id, &enable);
212}
213
214static int tcxo_clk_enable(struct clk *clk)
215{
216 return pcom_xo_enable(PCOM_XO_TCXO, PCOM_XO_ENABLE);
217}
218
219static void tcxo_clk_disable(struct clk *clk)
220{
221 pcom_xo_enable(PCOM_XO_TCXO, PCOM_XO_DISABLE);
222}
223
Matt Wagantallc4388bf2012-05-14 23:03:00 -0700224static enum handoff xo_clk_handoff(struct clk *clk)
225{
226 return HANDOFF_ENABLED_CLK;
227}
228
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700229static struct clk_ops clk_ops_tcxo = {
230 .enable = tcxo_clk_enable,
231 .disable = tcxo_clk_disable,
Matt Wagantallc4388bf2012-05-14 23:03:00 -0700232 .handoff = xo_clk_handoff,
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700233 .is_local = pcom_is_local,
234};
235
236static struct fixed_clk tcxo_clk = {
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700237 .c = {
238 .dbg_name = "tcxo_clk",
Tianyi Gou7949ecb2012-02-14 14:25:32 -0800239 .rate = 19200000,
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700240 .ops = &clk_ops_tcxo,
241 CLK_INIT(tcxo_clk.c),
Stephen Boyd3bbf3462012-01-12 00:19:23 -0800242 .warned = true,
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700243 },
244};
245
246static int lpxo_clk_enable(struct clk *clk)
247{
248 return pcom_xo_enable(PCOM_XO_LPXO, PCOM_XO_ENABLE);
249}
250
251static void lpxo_clk_disable(struct clk *clk)
252{
253 pcom_xo_enable(PCOM_XO_LPXO, PCOM_XO_DISABLE);
254}
255
256static struct clk_ops clk_ops_lpxo = {
257 .enable = lpxo_clk_enable,
258 .disable = lpxo_clk_disable,
Matt Wagantallc4388bf2012-05-14 23:03:00 -0700259 .handoff = xo_clk_handoff,
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700260 .is_local = pcom_is_local,
261};
262
263static struct fixed_clk lpxo_clk = {
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700264 .c = {
265 .dbg_name = "lpxo_clk",
Tianyi Gou7949ecb2012-02-14 14:25:32 -0800266 .rate = 24576000,
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700267 .ops = &clk_ops_lpxo,
268 CLK_INIT(lpxo_clk.c),
Stephen Boyd3bbf3462012-01-12 00:19:23 -0800269 .warned = true,
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700270 },
271};
272
273static struct pll_vote_clk pll1_clk = {
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700274 .en_reg = PLL_ENA_REG,
275 .en_mask = BIT(1),
276 .status_reg = PLL1_STATUS_BASE_REG,
Vikram Mulukutla681d8682012-03-09 23:56:20 -0800277 .status_mask = BIT(16),
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700278 .parent = &tcxo_clk.c,
279 .c = {
280 .dbg_name = "pll1_clk",
Tianyi Gou7949ecb2012-02-14 14:25:32 -0800281 .rate = 768000000,
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700282 .ops = &clk_ops_pll_vote,
283 CLK_INIT(pll1_clk.c),
Stephen Boyd3bbf3462012-01-12 00:19:23 -0800284 .warned = true,
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700285 },
286};
287
288static struct pll_vote_clk pll2_clk = {
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700289 .en_reg = PLL_ENA_REG,
290 .en_mask = BIT(2),
291 .status_reg = PLL2_STATUS_BASE_REG,
Vikram Mulukutla681d8682012-03-09 23:56:20 -0800292 .status_mask = BIT(16),
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700293 .parent = &tcxo_clk.c,
294 .c = {
295 .dbg_name = "pll2_clk",
Tianyi Gou7949ecb2012-02-14 14:25:32 -0800296 .rate = 806400000, /* TODO: Support scaling */
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700297 .ops = &clk_ops_pll_vote,
298 CLK_INIT(pll2_clk.c),
Stephen Boyd3bbf3462012-01-12 00:19:23 -0800299 .warned = true,
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700300 },
301};
302
303static struct pll_vote_clk pll3_clk = {
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700304 .en_reg = PLL_ENA_REG,
305 .en_mask = BIT(3),
306 .status_reg = PLL3_STATUS_BASE_REG,
Vikram Mulukutla681d8682012-03-09 23:56:20 -0800307 .status_mask = BIT(16),
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700308 .parent = &lpxo_clk.c,
309 .c = {
310 .dbg_name = "pll3_clk",
Tianyi Gou7949ecb2012-02-14 14:25:32 -0800311 .rate = 737280000,
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700312 .ops = &clk_ops_pll_vote,
313 CLK_INIT(pll3_clk.c),
314 },
315};
316
317static struct pll_vote_clk pll4_clk = {
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700318 .en_reg = PLL_ENA_REG,
319 .en_mask = BIT(4),
320 .status_reg = PLL4_STATUS_BASE_REG,
Vikram Mulukutla681d8682012-03-09 23:56:20 -0800321 .status_mask = BIT(16),
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700322 .parent = &lpxo_clk.c,
323 .c = {
324 .dbg_name = "pll4_clk",
Tianyi Gou7949ecb2012-02-14 14:25:32 -0800325 .rate = 891000000,
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700326 .ops = &clk_ops_pll_vote,
327 CLK_INIT(pll4_clk.c),
Stephen Boyd3bbf3462012-01-12 00:19:23 -0800328 .warned = true,
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700329 },
330};
331
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700332static struct clk_freq_tbl clk_tbl_axi[] = {
Matt Wagantall07c45472012-02-10 23:27:24 -0800333 F_RAW(1, &lpxo_clk.c, 0, 0, 0, NULL),
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700334 F_END,
335};
336
337/* For global clocks to be on we must have GLBL_ROOT_ENA set */
338static struct rcg_clk glbl_root_clk = {
339 .b = {
340 .ctl_reg = GLBL_CLK_ENA_SC_REG,
341 .en_mask = BIT(29),
342 .halt_check = NOCHECK,
343 },
344 .freq_tbl = clk_tbl_axi,
345 .set_rate = set_rate_nop,
Matt Wagantall84f43fd2011-08-16 23:28:38 -0700346 .current_freq = &rcg_dummy_freq,
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700347 .set_rate = set_rate_nop,
348 .c = {
349 .dbg_name = "glbl_root_clk",
Stephen Boyd409b8b42012-04-10 12:12:56 -0700350 .ops = &clk_ops_rcg,
Matt Wagantalle18bbc82011-10-06 10:07:28 -0700351 VDD_DIG_FMAX_MAP1(NOMINAL, 1),
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700352 CLK_INIT(glbl_root_clk.c),
353 },
354};
355
356/* AXI bridge clocks. */
357static struct branch_clk axi_li_apps_clk = {
358 .b = {
359 .ctl_reg = GLBL_CLK_ENA_SC_REG,
360 .en_mask = BIT(2),
361 .halt_reg = GLBL_CLK_STATE_REG,
362 .halt_check = HALT_VOTED,
363 .halt_bit = 2,
364 },
365 .parent = &glbl_root_clk.c,
366 .c = {
367 .dbg_name = "axi_li_apps_clk",
368 .ops = &clk_ops_branch,
369 CLK_INIT(axi_li_apps_clk.c),
370 },
371};
372
373static struct branch_clk axi_li_adsp_a_clk = {
374 .b = {
375 .ctl_reg = GLBL_CLK_ENA_2_SC_REG,
376 .en_mask = BIT(14),
377 .halt_reg = GLBL_CLK_STATE_2_REG,
378 .halt_check = HALT_VOTED,
379 .halt_bit = 14,
380 },
381 .parent = &axi_li_apps_clk.c,
382 .c = {
383 .dbg_name = "axi_li_adsp_a_clk",
384 .ops = &clk_ops_branch,
385 CLK_INIT(axi_li_adsp_a_clk.c),
386 },
387};
388
389static struct branch_clk axi_li_jpeg_clk = {
390 .b = {
391 .ctl_reg = GLBL_CLK_ENA_2_SC_REG,
392 .en_mask = BIT(19),
393 .halt_reg = GLBL_CLK_STATE_2_REG,
394 .halt_check = HALT_VOTED,
395 .halt_bit = 19,
396 },
397 .parent = &axi_li_apps_clk.c,
398 .c = {
399 .dbg_name = "axi_li_jpeg_clk",
400 .ops = &clk_ops_branch,
401 CLK_INIT(axi_li_jpeg_clk.c),
402 },
403};
404
405static struct branch_clk axi_li_vfe_clk = {
406 .b = {
407 .ctl_reg = GLBL_CLK_ENA_SC_REG,
408 .en_mask = BIT(23),
409 .halt_reg = GLBL_CLK_STATE_REG,
410 .halt_check = HALT_VOTED,
411 .halt_bit = 23,
412 },
413 .parent = &axi_li_apps_clk.c,
414 .c = {
415 .dbg_name = "axi_li_vfe_clk",
416 .ops = &clk_ops_branch,
417 CLK_INIT(axi_li_vfe_clk.c),
418 },
419};
420
421static struct branch_clk axi_mdp_clk = {
422 .b = {
423 .ctl_reg = GLBL_CLK_ENA_2_SC_REG,
424 .en_mask = BIT(29),
425 .halt_reg = GLBL_CLK_STATE_2_REG,
426 .halt_check = HALT_VOTED,
427 .halt_bit = 29,
428 },
429 .parent = &axi_li_apps_clk.c,
430 .c = {
431 .dbg_name = "axi_mdp_clk",
432 .ops = &clk_ops_branch,
433 CLK_INIT(axi_mdp_clk.c),
434 },
435};
436
437static struct branch_clk axi_li_vg_clk = {
438 .b = {
439 .ctl_reg = GLBL_CLK_ENA_SC_REG,
440 .en_mask = BIT(3),
441 .halt_reg = GLBL_CLK_STATE_REG,
442 .halt_check = HALT_VOTED,
443 .halt_bit = 3,
444 },
445 .parent = &glbl_root_clk.c,
446 .c = {
447 .dbg_name = "axi_li_vg_clk",
448 .ops = &clk_ops_branch,
449 CLK_INIT(axi_li_vg_clk.c),
450 },
451};
452
453static struct branch_clk axi_grp_2d_clk = {
454 .b = {
455 .ctl_reg = GLBL_CLK_ENA_SC_REG,
456 .en_mask = BIT(21),
457 .halt_reg = GLBL_CLK_STATE_REG,
458 .halt_check = HALT_VOTED,
459 .halt_bit = 21,
460 },
461 .parent = &axi_li_vg_clk.c,
462 .c = {
463 .dbg_name = "axi_grp_2d_clk",
464 .ops = &clk_ops_branch,
465 CLK_INIT(axi_grp_2d_clk.c),
466 },
467};
468
469static struct branch_clk axi_li_grp_clk = {
470 .b = {
471 .ctl_reg = GLBL_CLK_ENA_SC_REG,
472 .en_mask = BIT(22),
473 .halt_reg = GLBL_CLK_STATE_REG,
474 .halt_check = HALT_VOTED,
475 .halt_bit = 22,
476 },
477 .parent = &axi_li_vg_clk.c,
478 .c = {
479 .dbg_name = "axi_li_grp_clk",
480 .ops = &clk_ops_branch,
481 CLK_INIT(axi_li_grp_clk.c),
482 },
483};
484
485static struct branch_clk axi_mfc_clk = {
486 .b = {
487 .ctl_reg = GLBL_CLK_ENA_2_SC_REG,
488 .en_mask = BIT(20),
489 .halt_reg = GLBL_CLK_STATE_2_REG,
490 .halt_check = HALT_VOTED,
491 .halt_bit = 20,
492 },
493 .parent = &axi_li_vg_clk.c,
494 .c = {
495 .dbg_name = "axi_mfc_clk",
496 .ops = &clk_ops_branch,
497 CLK_INIT(axi_mfc_clk.c),
498 },
499};
500
501static struct branch_clk axi_rotator_clk = {
502 .b = {
503 .ctl_reg = GLBL_CLK_ENA_2_SC_REG,
504 .en_mask = BIT(22),
505 .halt_reg = GLBL_CLK_STATE_2_REG,
506 .halt_check = HALT_VOTED,
507 .halt_bit = 22,
508 .reset_mask = P_AXI_ROTATOR_CLK,
509 },
510 .parent = &axi_li_vg_clk.c,
511 .c = {
512 .dbg_name = "axi_rotator_clk",
513 .ops = &clk_ops_branch,
514 CLK_INIT(axi_rotator_clk.c),
515 },
516};
517
518static struct branch_clk axi_vpe_clk = {
519 .b = {
520 .ctl_reg = GLBL_CLK_ENA_2_SC_REG,
521 .en_mask = BIT(21),
522 .halt_reg = GLBL_CLK_STATE_2_REG,
523 .halt_check = HALT_VOTED,
524 .halt_bit = 21,
525 },
526 .parent = &axi_li_vg_clk.c,
527 .c = {
528 .dbg_name = "axi_vpe_clk",
529 .ops = &clk_ops_branch,
530 CLK_INIT(axi_vpe_clk.c),
531 },
532};
533
534/* Peripheral bus clocks. */
535static struct branch_clk adm_clk = {
536 .b = {
537 .ctl_reg = GLBL_CLK_ENA_SC_REG,
538 .en_mask = BIT(5),
539 .halt_reg = GLBL_CLK_STATE_REG,
540 .halt_check = HALT_VOTED,
541 .halt_bit = 5,
542 .reset_mask = P_ADM_CLK,
543 },
544 .parent = &axi_li_apps_clk.c,
545 .c = {
546 .dbg_name = "adm_clk",
547 .ops = &clk_ops_branch,
548 CLK_INIT(adm_clk.c),
549 },
550};
551
552static struct branch_clk adm_p_clk = {
553 .b = {
554 .ctl_reg = GLBL_CLK_ENA_2_SC_REG,
555 .en_mask = BIT(15),
556 .halt_reg = GLBL_CLK_STATE_2_REG,
557 .halt_check = HALT_VOTED,
558 .halt_bit = 15,
559 },
560 .parent = &glbl_root_clk.c,
561 .c = {
562 .dbg_name = "adm_p_clk",
563 .ops = &clk_ops_branch,
564 CLK_INIT(adm_p_clk.c),
565 },
566};
567
568static struct branch_clk ce_clk = {
569 .b = {
570 .ctl_reg = GLBL_CLK_ENA_SC_REG,
571 .en_mask = BIT(6),
572 .halt_reg = GLBL_CLK_STATE_REG,
573 .halt_check = HALT_VOTED,
574 .halt_bit = 6,
575 .reset_mask = P_CE_CLK,
576 },
577 .parent = &glbl_root_clk.c,
578 .c = {
579 .dbg_name = "ce_clk",
580 .ops = &clk_ops_branch,
581 CLK_INIT(ce_clk.c),
582 },
583};
584
585static struct branch_clk camif_pad_p_clk = {
586 .b = {
587 .ctl_reg = GLBL_CLK_ENA_SC_REG,
588 .en_mask = BIT(9),
589 .halt_reg = GLBL_CLK_STATE_REG,
590 .halt_check = HALT_VOTED,
591 .halt_bit = 9,
592 .reset_mask = P_CAMIF_PAD_P_CLK,
593 },
594 .parent = &glbl_root_clk.c,
595 .c = {
596 .dbg_name = "camif_pad_p_clk",
597 .ops = &clk_ops_branch,
598 CLK_INIT(camif_pad_p_clk.c),
599 },
600};
601
602static struct branch_clk csi0_p_clk = {
603 .b = {
604 .ctl_reg = GLBL_CLK_ENA_SC_REG,
605 .en_mask = BIT(30),
606 .halt_reg = GLBL_CLK_STATE_REG,
607 .halt_check = HALT_VOTED,
608 .halt_bit = 30,
609 .reset_mask = P_CSI0_P_CLK,
610 },
611 .parent = &glbl_root_clk.c,
612 .c = {
613 .dbg_name = "csi0_p_clk",
614 .ops = &clk_ops_branch,
615 CLK_INIT(csi0_p_clk.c),
616 },
617};
618
619static struct branch_clk emdh_p_clk = {
620 .b = {
621 .ctl_reg = GLBL_CLK_ENA_2_SC_REG,
622 .en_mask = BIT(3),
623 .halt_reg = GLBL_CLK_STATE_2_REG,
624 .halt_check = HALT_VOTED,
625 .halt_bit = 3,
626 .reset_mask = P_EMDH_P_CLK,
627 },
628 .parent = &glbl_root_clk.c,
629 .c = {
630 .dbg_name = "emdh_p_clk",
631 .ops = &clk_ops_branch,
632 CLK_INIT(emdh_p_clk.c),
633 },
634};
635
636static struct branch_clk grp_2d_p_clk = {
637 .b = {
638 .ctl_reg = GLBL_CLK_ENA_SC_REG,
639 .en_mask = BIT(24),
640 .halt_reg = GLBL_CLK_STATE_REG,
641 .halt_check = HALT_VOTED,
642 .halt_bit = 24,
643 .reset_mask = P_GRP_2D_P_CLK,
644 },
645 .parent = &glbl_root_clk.c,
646 .c = {
647 .dbg_name = "grp_2d_p_clk",
648 .ops = &clk_ops_branch,
649 CLK_INIT(grp_2d_p_clk.c),
650 },
651};
652
653static struct branch_clk grp_3d_p_clk = {
654 .b = {
655 .ctl_reg = GLBL_CLK_ENA_2_SC_REG,
656 .en_mask = BIT(17),
657 .halt_reg = GLBL_CLK_STATE_2_REG,
658 .halt_check = HALT_VOTED,
659 .halt_bit = 17,
660 .reset_mask = P_GRP_3D_P_CLK,
661 },
662 .parent = &glbl_root_clk.c,
663 .c = {
664 .dbg_name = "grp_3d_p_clk",
665 .ops = &clk_ops_branch,
666 CLK_INIT(grp_3d_p_clk.c),
667 },
668};
669
670static struct branch_clk jpeg_p_clk = {
671 .b = {
672 .ctl_reg = GLBL_CLK_ENA_2_SC_REG,
673 .en_mask = BIT(24),
674 .halt_reg = GLBL_CLK_STATE_2_REG,
675 .halt_check = HALT_VOTED,
676 .halt_bit = 24,
677 .reset_mask = P_JPEG_P_CLK,
678 },
679 .parent = &glbl_root_clk.c,
680 .c = {
681 .dbg_name = "jpeg_p_clk",
682 .ops = &clk_ops_branch,
683 CLK_INIT(jpeg_p_clk.c),
684 },
685};
686
687static struct branch_clk lpa_p_clk = {
688 .b = {
689 .ctl_reg = GLBL_CLK_ENA_2_SC_REG,
690 .en_mask = BIT(7),
691 .halt_reg = GLBL_CLK_STATE_2_REG,
692 .halt_check = HALT_VOTED,
693 .halt_bit = 7,
694 .reset_mask = P_LPA_P_CLK,
695 },
696 .parent = &glbl_root_clk.c,
697 .c = {
698 .dbg_name = "lpa_p_clk",
699 .ops = &clk_ops_branch,
700 CLK_INIT(lpa_p_clk.c),
701 },
702};
703
704static struct branch_clk mdp_p_clk = {
705 .b = {
706 .ctl_reg = GLBL_CLK_ENA_2_SC_REG,
707 .en_mask = BIT(6),
708 .halt_reg = GLBL_CLK_STATE_2_REG,
709 .halt_check = HALT_VOTED,
710 .halt_bit = 6,
711 .reset_mask = P_MDP_P_CLK,
712 },
713 .parent = &glbl_root_clk.c,
714 .c = {
715 .dbg_name = "mdp_p_clk",
716 .ops = &clk_ops_branch,
717 CLK_INIT(mdp_p_clk.c),
718 },
719};
720
721static struct branch_clk mfc_p_clk = {
722 .b = {
723 .ctl_reg = GLBL_CLK_ENA_2_SC_REG,
724 .en_mask = BIT(26),
725 .halt_reg = GLBL_CLK_STATE_2_REG,
726 .halt_check = HALT_VOTED,
727 .halt_bit = 26,
728 .reset_mask = P_MFC_P_CLK,
729 },
730 .parent = &glbl_root_clk.c,
731 .c = {
732 .dbg_name = "mfc_p_clk",
733 .ops = &clk_ops_branch,
734 CLK_INIT(mfc_p_clk.c),
735 },
736};
737
738static struct branch_clk pmdh_p_clk = {
739 .b = {
740 .ctl_reg = GLBL_CLK_ENA_2_SC_REG,
741 .en_mask = BIT(4),
742 .halt_reg = GLBL_CLK_STATE_2_REG,
743 .halt_check = HALT_VOTED,
744 .halt_bit = 4,
745 .reset_mask = P_PMDH_P_CLK,
746 },
747 .parent = &glbl_root_clk.c,
748 .c = {
749 .dbg_name = "pmdh_p_clk",
750 .ops = &clk_ops_branch,
751 CLK_INIT(pmdh_p_clk.c),
752 },
753};
754
755static struct branch_clk rotator_imem_clk = {
756 .b = {
757 .ctl_reg = GLBL_CLK_ENA_2_SC_REG,
758 .en_mask = BIT(23),
759 .halt_reg = GLBL_CLK_STATE_2_REG,
760 .halt_check = HALT_VOTED,
761 .halt_bit = 23,
762 .reset_mask = P_ROTATOR_IMEM_CLK,
763 },
764 .parent = &glbl_root_clk.c,
765 .c = {
766 .dbg_name = "rotator_imem_clk",
767 .ops = &clk_ops_branch,
768 CLK_INIT(rotator_imem_clk.c),
769 },
770};
771
772static struct branch_clk rotator_p_clk = {
773 .b = {
774 .ctl_reg = GLBL_CLK_ENA_2_SC_REG,
775 .en_mask = BIT(25),
776 .halt_reg = GLBL_CLK_STATE_2_REG,
777 .halt_check = HALT_VOTED,
778 .halt_bit = 25,
779 .reset_mask = P_ROTATOR_P_CLK,
780 },
781 .parent = &glbl_root_clk.c,
782 .c = {
783 .dbg_name = "rotator_p_clk",
784 .ops = &clk_ops_branch,
785 CLK_INIT(rotator_p_clk.c),
786 },
787};
788
789static struct branch_clk sdc1_p_clk = {
790 .b = {
791 .ctl_reg = GLBL_CLK_ENA_SC_REG,
792 .en_mask = BIT(7),
793 .halt_reg = GLBL_CLK_STATE_REG,
794 .halt_check = HALT_VOTED,
795 .halt_bit = 7,
796 .reset_mask = P_SDC1_P_CLK,
797 },
798 .parent = &glbl_root_clk.c,
799 .c = {
800 .dbg_name = "sdc1_p_clk",
801 .ops = &clk_ops_branch,
802 CLK_INIT(sdc1_p_clk.c),
803 },
804};
805
806static struct branch_clk sdc2_p_clk = {
807 .b = {
808 .ctl_reg = GLBL_CLK_ENA_SC_REG,
809 .en_mask = BIT(8),
810 .halt_reg = GLBL_CLK_STATE_REG,
811 .halt_check = HALT_VOTED,
812 .halt_bit = 8,
813 .reset_mask = P_SDC2_P_CLK,
814 },
815 .parent = &glbl_root_clk.c,
816 .c = {
817 .dbg_name = "sdc2_p_clk",
818 .ops = &clk_ops_branch,
819 CLK_INIT(sdc2_p_clk.c),
820 },
821};
822
823static struct branch_clk sdc3_p_clk = {
824 .b = {
825 .ctl_reg = GLBL_CLK_ENA_SC_REG,
826 .en_mask = BIT(27),
827 .halt_reg = GLBL_CLK_STATE_REG,
828 .halt_check = HALT_VOTED,
829 .halt_bit = 27,
830 .reset_mask = P_SDC3_P_CLK,
831 },
832 .parent = &glbl_root_clk.c,
833 .c = {
834 .dbg_name = "sdc3_p_clk",
835 .ops = &clk_ops_branch,
836 CLK_INIT(sdc3_p_clk.c),
837 },
838};
839
840static struct branch_clk sdc4_p_clk = {
841 .b = {
842 .ctl_reg = GLBL_CLK_ENA_SC_REG,
843 .en_mask = BIT(28),
844 .halt_reg = GLBL_CLK_STATE_REG,
845 .halt_check = HALT_VOTED,
846 .halt_bit = 28,
847 .reset_mask = P_SDC4_P_CLK,
848 },
849 .parent = &glbl_root_clk.c,
850 .c = {
851 .dbg_name = "sdc4_p_clk",
852 .ops = &clk_ops_branch,
853 CLK_INIT(sdc4_p_clk.c),
854 },
855};
856
857static struct branch_clk spi_p_clk = {
858 .b = {
859 .ctl_reg = GLBL_CLK_ENA_2_SC_REG,
860 .en_mask = BIT(10),
861 .halt_reg = GLBL_CLK_STATE_2_REG,
862 .halt_check = HALT_VOTED,
863 .halt_bit = 10,
864 .reset_mask = P_SPI_P_CLK,
865 },
866 .parent = &glbl_root_clk.c,
867 .c = {
868 .dbg_name = "spi_p_clk",
869 .ops = &clk_ops_branch,
870 CLK_INIT(spi_p_clk.c),
871 },
872};
873
874static struct branch_clk tsif_p_clk = {
875 .b = {
876 .ctl_reg = GLBL_CLK_ENA_SC_REG,
877 .en_mask = BIT(18),
878 .halt_reg = GLBL_CLK_STATE_REG,
879 .halt_check = HALT_VOTED,
880 .halt_bit = 18,
881 .reset_mask = P_TSIF_P_CLK,
882 },
883 .parent = &glbl_root_clk.c,
884 .c = {
885 .dbg_name = "tsif_p_clk",
886 .ops = &clk_ops_branch,
887 CLK_INIT(tsif_p_clk.c),
888 },
889};
890
891static struct branch_clk uart1dm_p_clk = {
892 .b = {
893 .ctl_reg = GLBL_CLK_ENA_SC_REG,
894 .en_mask = BIT(17),
895 .halt_reg = GLBL_CLK_STATE_REG,
896 .halt_check = HALT_VOTED,
897 .halt_bit = 17,
898 },
899 .parent = &glbl_root_clk.c,
900 .c = {
901 .dbg_name = "uart1dm_p_clk",
902 .ops = &clk_ops_branch,
903 CLK_INIT(uart1dm_p_clk.c),
904 },
905};
906
907static struct branch_clk uart2dm_p_clk = {
908 .b = {
909 .ctl_reg = GLBL_CLK_ENA_SC_REG,
910 .en_mask = BIT(26),
911 .halt_reg = GLBL_CLK_STATE_REG,
912 .halt_check = HALT_VOTED,
913 .halt_bit = 26,
914 },
915 .parent = &glbl_root_clk.c,
916 .c = {
917 .dbg_name = "uart2dm_p_clk",
918 .ops = &clk_ops_branch,
919 CLK_INIT(uart2dm_p_clk.c),
920 },
921};
922
923static struct branch_clk usb_hs2_p_clk = {
924 .b = {
925 .ctl_reg = GLBL_CLK_ENA_2_SC_REG,
926 .en_mask = BIT(8),
927 .halt_reg = GLBL_CLK_STATE_2_REG,
928 .halt_check = HALT_VOTED,
929 .halt_bit = 8,
930 .reset_mask = P_USB_HS2_P_CLK,
931 },
932 .parent = &glbl_root_clk.c,
933 .c = {
934 .dbg_name = "usb_hs2_p_clk",
935 .ops = &clk_ops_branch,
936 CLK_INIT(usb_hs2_p_clk.c),
937 },
938};
939
940static struct branch_clk usb_hs3_p_clk = {
941 .b = {
942 .ctl_reg = GLBL_CLK_ENA_2_SC_REG,
943 .en_mask = BIT(9),
944 .halt_reg = GLBL_CLK_STATE_2_REG,
945 .halt_check = HALT_VOTED,
946 .halt_bit = 9,
947 .reset_mask = P_USB_HS3_P_CLK,
948 },
949 .parent = &glbl_root_clk.c,
950 .c = {
951 .dbg_name = "usb_hs3_p_clk",
952 .ops = &clk_ops_branch,
953 CLK_INIT(usb_hs3_p_clk.c),
954 },
955};
956
957static struct branch_clk usb_hs_p_clk = {
958 .b = {
959 .ctl_reg = GLBL_CLK_ENA_SC_REG,
960 .en_mask = BIT(25),
961 .halt_reg = GLBL_CLK_STATE_REG,
962 .halt_check = HALT_VOTED,
963 .halt_bit = 25,
964 .reset_mask = P_USB_HS_P_CLK,
965 },
966 .parent = &glbl_root_clk.c,
967 .c = {
968 .dbg_name = "usb_hs_p_clk",
969 .ops = &clk_ops_branch,
970 CLK_INIT(usb_hs_p_clk.c),
971 },
972};
973
974static struct branch_clk vfe_p_clk = {
975 .b = {
976 .ctl_reg = GLBL_CLK_ENA_2_SC_REG,
977 .en_mask = BIT(27),
978 .halt_reg = GLBL_CLK_STATE_2_REG,
979 .halt_check = HALT_VOTED,
980 .halt_bit = 27,
981 .reset_mask = P_VFE_P_CLK,
982 },
983 .parent = &glbl_root_clk.c,
984 .c = {
985 .dbg_name = "vfe_p_clk",
986 .ops = &clk_ops_branch,
987 CLK_INIT(vfe_p_clk.c),
988 },
989};
990
991static struct clk_freq_tbl clk_tbl_csi[] = {
Matt Wagantalle18bbc82011-10-06 10:07:28 -0700992 F_MND8( 0, 0, 0, gnd, 1, 0, 0),
993 F_MND8(153600000, 24, 17, pll1, 2, 2, 5),
994 F_MND8(192000000, 24, 17, pll1, 4, 0, 0),
995 F_MND8(384000000, 24, 17, pll1, 2, 0, 0),
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700996 F_END,
997};
998
999static struct rcg_clk csi0_clk = {
1000 .b = {
1001 .ctl_reg = CSI_NS_REG,
1002 .en_mask = BIT(9),
1003 .halt_reg = CLK_HALT_STATEC_REG,
1004 .halt_bit = 17,
1005 .reset_mask = P_CSI0_CLK,
1006 },
1007 .ns_reg = CSI_NS_REG,
1008 .md_reg = CSI_NS_REG - 4,
1009 .ns_mask = F_MASK_MND8(24, 17),
Matt Wagantall07c45472012-02-10 23:27:24 -08001010 .mnd_en_mask = BIT(8),
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07001011 .root_en_mask = BIT(11),
1012 .freq_tbl = clk_tbl_csi,
Matt Wagantall84f43fd2011-08-16 23:28:38 -07001013 .current_freq = &rcg_dummy_freq,
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07001014 .set_rate = set_rate_mnd,
1015 .c = {
1016 .dbg_name = "csi0_clk",
Stephen Boyd409b8b42012-04-10 12:12:56 -07001017 .ops = &clk_ops_rcg,
Matt Wagantalle18bbc82011-10-06 10:07:28 -07001018 VDD_DIG_FMAX_MAP1(NOMINAL, 384000000),
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07001019 CLK_INIT(csi0_clk.c),
1020 },
1021};
1022
1023static struct clk_freq_tbl clk_tbl_tcxo[] = {
Matt Wagantall07c45472012-02-10 23:27:24 -08001024 F_RAW(19200000, &tcxo_clk.c, 0, 0, 0, NULL),
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07001025 F_END,
1026};
1027
1028static struct rcg_clk i2c_clk = {
1029 .b = {
1030 .ctl_reg = I2C_NS_REG,
1031 .en_mask = BIT(9),
1032 .halt_reg = CLK_HALT_STATEA_REG,
1033 .halt_bit = 15,
1034 .reset_mask = P_I2C_CLK,
1035 },
1036 .set_rate = set_rate_nop,
1037 .freq_tbl = clk_tbl_tcxo,
1038 .root_en_mask = BIT(11),
Matt Wagantall84f43fd2011-08-16 23:28:38 -07001039 .current_freq = &rcg_dummy_freq,
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07001040 .c = {
1041 .dbg_name = "i2c_clk",
Stephen Boyd409b8b42012-04-10 12:12:56 -07001042 .ops = &clk_ops_rcg,
Matt Wagantalle18bbc82011-10-06 10:07:28 -07001043 VDD_DIG_FMAX_MAP1(NOMINAL, 19200000),
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07001044 CLK_INIT(i2c_clk.c),
1045 },
1046};
1047
1048static struct rcg_clk i2c_2_clk = {
1049 .b = {
1050 .ctl_reg = I2C_2_NS_REG,
1051 .en_mask = BIT(0),
1052 .halt_reg = CLK_HALT_STATEC_REG,
1053 .halt_bit = 2,
1054 .reset_mask = P_I2C_2_CLK,
1055 },
1056 .root_en_mask = BIT(2),
1057 .freq_tbl = clk_tbl_tcxo,
1058 .set_rate = set_rate_nop,
Matt Wagantall84f43fd2011-08-16 23:28:38 -07001059 .current_freq = &rcg_dummy_freq,
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07001060 .c = {
1061 .dbg_name = "i2c_2_clk",
Stephen Boyd409b8b42012-04-10 12:12:56 -07001062 .ops = &clk_ops_rcg,
Matt Wagantalle18bbc82011-10-06 10:07:28 -07001063 VDD_DIG_FMAX_MAP1(NOMINAL, 19200000),
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07001064 CLK_INIT(i2c_2_clk.c),
1065 },
1066};
1067
1068static struct rcg_clk qup_i2c_clk = {
1069 .b = {
1070 .ctl_reg = QUP_I2C_NS_REG,
1071 .en_mask = BIT(0),
1072 .halt_reg = CLK_HALT_STATEB_REG,
1073 .halt_bit = 31,
1074 .reset_mask = P_QUP_I2C_CLK,
1075 },
1076 .root_en_mask = BIT(2),
1077 .freq_tbl = clk_tbl_tcxo,
1078 .set_rate = set_rate_nop,
Matt Wagantall84f43fd2011-08-16 23:28:38 -07001079 .current_freq = &rcg_dummy_freq,
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07001080 .c = {
1081 .dbg_name = "qup_i2c_clk",
Stephen Boyd409b8b42012-04-10 12:12:56 -07001082 .ops = &clk_ops_rcg,
Matt Wagantalle18bbc82011-10-06 10:07:28 -07001083 VDD_DIG_FMAX_MAP1(NOMINAL, 19200000),
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07001084 CLK_INIT(qup_i2c_clk.c),
1085 },
1086};
1087
1088static struct rcg_clk uart1_clk = {
1089 .b = {
1090 .ctl_reg = UART_NS_REG,
1091 .en_mask = BIT(5),
1092 .halt_reg = CLK_HALT_STATEB_REG,
1093 .halt_bit = 7,
1094 .reset_mask = P_UART1_CLK,
1095 },
1096 .root_en_mask = BIT(4),
1097 .freq_tbl = clk_tbl_tcxo,
1098 .set_rate = set_rate_nop,
Matt Wagantall84f43fd2011-08-16 23:28:38 -07001099 .current_freq = &rcg_dummy_freq,
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07001100 .c = {
1101 .dbg_name = "uart1_clk",
Stephen Boyd409b8b42012-04-10 12:12:56 -07001102 .ops = &clk_ops_rcg,
Matt Wagantalle18bbc82011-10-06 10:07:28 -07001103 VDD_DIG_FMAX_MAP1(NOMINAL, 19200000),
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07001104 CLK_INIT(uart1_clk.c),
1105 },
1106};
1107
1108static struct rcg_clk uart2_clk = {
1109 .b = {
1110 .ctl_reg = UART2_NS_REG,
1111 .en_mask = BIT(5),
1112 .halt_reg = CLK_HALT_STATEB_REG,
1113 .halt_bit = 5,
1114 .reset_mask = P_UART2_CLK,
1115 },
1116 .root_en_mask = BIT(4),
1117 .freq_tbl = clk_tbl_tcxo,
1118 .set_rate = set_rate_nop,
Matt Wagantall84f43fd2011-08-16 23:28:38 -07001119 .current_freq = &rcg_dummy_freq,
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07001120 .c = {
1121 .dbg_name = "uart2_clk",
Stephen Boyd409b8b42012-04-10 12:12:56 -07001122 .ops = &clk_ops_rcg,
Matt Wagantalle18bbc82011-10-06 10:07:28 -07001123 VDD_DIG_FMAX_MAP1(NOMINAL, 19200000),
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07001124 CLK_INIT(uart2_clk.c),
1125 },
1126};
1127
1128static struct clk_freq_tbl clk_tbl_uartdm[] = {
Matt Wagantalle18bbc82011-10-06 10:07:28 -07001129 F_MND16( 0, gnd, 1, 0, 0),
1130 F_MND16( 3686400, pll3, 3, 3, 200),
1131 F_MND16( 7372800, pll3, 3, 3, 100),
1132 F_MND16(14745600, pll3, 3, 3, 50),
1133 F_MND16(32000000, pll3, 3, 25, 192),
1134 F_MND16(40000000, pll3, 3, 125, 768),
1135 F_MND16(46400000, pll3, 3, 145, 768),
1136 F_MND16(48000000, pll3, 3, 25, 128),
1137 F_MND16(51200000, pll3, 3, 5, 24),
1138 F_MND16(56000000, pll3, 3, 175, 768),
1139 F_MND16(58982400, pll3, 3, 6, 25),
1140 F_MND16(64000000, pll1, 4, 1, 3),
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07001141 F_END,
1142};
1143
1144static struct rcg_clk uart1dm_clk = {
1145 .b = {
1146 .ctl_reg = UART1DM_NS_REG,
1147 .en_mask = BIT(9),
1148 .halt_reg = CLK_HALT_STATEB_REG,
1149 .halt_bit = 6,
1150 .reset_mask = P_UART1DM_CLK,
1151 },
1152 .ns_reg = UART1DM_NS_REG,
1153 .md_reg = UART1DM_NS_REG - 4,
1154 .root_en_mask = BIT(11),
Matt Wagantall07c45472012-02-10 23:27:24 -08001155 .mnd_en_mask = BIT(8),
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07001156 .freq_tbl = clk_tbl_uartdm,
1157 .ns_mask = F_MASK_MND16,
Matt Wagantall84f43fd2011-08-16 23:28:38 -07001158 .current_freq = &rcg_dummy_freq,
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07001159 .set_rate = set_rate_mnd,
1160 .c = {
1161 .dbg_name = "uart1dm_clk",
Stephen Boyd409b8b42012-04-10 12:12:56 -07001162 .ops = &clk_ops_rcg,
Matt Wagantalle18bbc82011-10-06 10:07:28 -07001163 VDD_DIG_FMAX_MAP1(NOMINAL, 64000000),
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07001164 CLK_INIT(uart1dm_clk.c),
1165 },
1166};
1167
1168static struct rcg_clk uart2dm_clk = {
1169 .b = {
1170 .ctl_reg = UART2DM_NS_REG,
1171 .en_mask = BIT(9),
1172 .halt_reg = CLK_HALT_STATEB_REG,
1173 .halt_bit = 23,
1174 .reset_mask = P_UART2DM_CLK,
1175 },
1176 .ns_reg = UART2DM_NS_REG,
1177 .md_reg = UART2DM_NS_REG - 4,
1178 .root_en_mask = BIT(11),
1179 .freq_tbl = clk_tbl_uartdm,
1180 .ns_mask = F_MASK_MND16,
Matt Wagantall07c45472012-02-10 23:27:24 -08001181 .mnd_en_mask = BIT(8),
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07001182 .set_rate = set_rate_mnd,
Matt Wagantall84f43fd2011-08-16 23:28:38 -07001183 .current_freq = &rcg_dummy_freq,
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07001184 .c = {
1185 .dbg_name = "uart2dm_clk",
Stephen Boyd409b8b42012-04-10 12:12:56 -07001186 .ops = &clk_ops_rcg,
Matt Wagantalle18bbc82011-10-06 10:07:28 -07001187 VDD_DIG_FMAX_MAP1(NOMINAL, 64000000),
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07001188 CLK_INIT(uart2dm_clk.c),
1189 },
1190};
1191
1192static struct clk_freq_tbl clk_tbl_mdh[] = {
Matt Wagantalle18bbc82011-10-06 10:07:28 -07001193 F_BASIC( 0, gnd, 1),
1194 F_BASIC( 49150000, pll3, 15),
1195 F_BASIC( 92160000, pll3, 8),
1196 F_BASIC(122880000, pll3, 6),
1197 F_BASIC(184320000, pll3, 4),
1198 F_BASIC(245760000, pll3, 3),
1199 F_BASIC(368640000, pll3, 2),
1200 F_BASIC(384000000, pll1, 2),
1201 F_BASIC(445500000, pll4, 2),
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07001202 F_END,
1203};
1204
1205static struct rcg_clk emdh_clk = {
1206 .b = {
1207 .ctl_reg = EMDH_NS_REG,
1208 .halt_check = DELAY,
1209 .reset_mask = P_EMDH_CLK,
1210 },
1211 .root_en_mask = BIT(11),
1212 .ns_reg = EMDH_NS_REG,
1213 .ns_mask = F_MASK_BASIC,
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07001214 .set_rate = set_rate_nop,
1215 .freq_tbl = clk_tbl_mdh,
Matt Wagantall84f43fd2011-08-16 23:28:38 -07001216 .current_freq = &rcg_dummy_freq,
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07001217 .c = {
1218 .dbg_name = "emdh_clk",
1219 .flags = CLKFLAG_MIN | CLKFLAG_MAX,
Stephen Boyd409b8b42012-04-10 12:12:56 -07001220 .ops = &clk_ops_rcg,
Matt Wagantalle18bbc82011-10-06 10:07:28 -07001221 VDD_DIG_FMAX_MAP1(NOMINAL, 445500000),
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07001222 CLK_INIT(emdh_clk.c),
Stephen Boyd7fa26742011-08-11 23:22:29 -07001223 .depends = &axi_li_adsp_a_clk.c,
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07001224 },
1225};
1226
1227static struct rcg_clk pmdh_clk = {
1228 .b = {
1229 .ctl_reg = PMDH_NS_REG,
1230 .halt_check = DELAY,
1231 .reset_mask = P_PMDH_CLK,
1232 },
1233 .root_en_mask = BIT(11),
1234 .ns_reg = PMDH_NS_REG,
1235 .ns_mask = F_MASK_BASIC,
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07001236 .set_rate = set_rate_nop,
1237 .freq_tbl = clk_tbl_mdh,
Matt Wagantall84f43fd2011-08-16 23:28:38 -07001238 .current_freq = &rcg_dummy_freq,
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07001239 .c = {
1240 .dbg_name = "pmdh_clk",
1241 .flags = CLKFLAG_MIN | CLKFLAG_MAX,
Stephen Boyd409b8b42012-04-10 12:12:56 -07001242 .ops = &clk_ops_rcg,
Matt Wagantalle18bbc82011-10-06 10:07:28 -07001243 VDD_DIG_FMAX_MAP1(NOMINAL, 445500000),
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07001244 CLK_INIT(pmdh_clk.c),
Stephen Boyd7fa26742011-08-11 23:22:29 -07001245 .depends = &axi_li_adsp_a_clk.c,
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07001246 },
1247};
1248
1249static struct clk_freq_tbl clk_tbl_grp[] = {
Matt Wagantalle18bbc82011-10-06 10:07:28 -07001250 F_BASIC( 24576000, lpxo, 1),
1251 F_BASIC( 46080000, pll3, 16),
1252 F_BASIC( 49152000, pll3, 15),
1253 F_BASIC( 52662875, pll3, 14),
1254 F_BASIC( 56713846, pll3, 13),
1255 F_BASIC( 61440000, pll3, 12),
1256 F_BASIC( 67025454, pll3, 11),
1257 F_BASIC( 73728000, pll3, 10),
1258 F_BASIC( 81920000, pll3, 9),
1259 F_BASIC( 92160000, pll3, 8),
1260 F_BASIC(105325714, pll3, 7),
1261 F_BASIC(122880000, pll3, 6),
1262 F_BASIC(147456000, pll3, 5),
1263 F_BASIC(184320000, pll3, 4),
1264 F_BASIC(192000000, pll1, 4),
1265 F_BASIC(245760000, pll3, 3),
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07001266 /* Sync to AXI. Hence this "rate" is not fixed. */
Matt Wagantall07c45472012-02-10 23:27:24 -08001267 F_RAW(1, &lpxo_clk.c, 0, BIT(14), 0, NULL),
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07001268 F_END,
1269};
1270
1271static struct rcg_clk grp_2d_clk = {
1272 .b = {
1273 .ctl_reg = GRP_2D_NS_REG,
1274 .en_mask = BIT(7),
1275 .halt_reg = CLK_HALT_STATEA_REG,
1276 .halt_bit = 31,
1277 .reset_mask = P_GRP_2D_CLK,
1278 },
1279 .ns_reg = GRP_2D_NS_REG,
1280 .root_en_mask = BIT(11),
1281 .ns_mask = F_MASK_BASIC | (7 << 12),
1282 .set_rate = set_rate_nop,
1283 .freq_tbl = clk_tbl_grp,
Matt Wagantall84f43fd2011-08-16 23:28:38 -07001284 .current_freq = &rcg_dummy_freq,
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07001285 .c = {
1286 .dbg_name = "grp_2d_clk",
Stephen Boyd409b8b42012-04-10 12:12:56 -07001287 .ops = &clk_ops_rcg,
Matt Wagantalle18bbc82011-10-06 10:07:28 -07001288 VDD_DIG_FMAX_MAP2(NOMINAL, 192000000, HIGH, 245760000),
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07001289 CLK_INIT(grp_2d_clk.c),
Stephen Boyd7fa26742011-08-11 23:22:29 -07001290 .depends = &axi_grp_2d_clk.c,
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07001291 },
1292};
1293
1294static struct rcg_clk grp_3d_src_clk = {
1295 .ns_reg = GRP_NS_REG,
1296 .b = {
1297 .ctl_reg = GRP_NS_REG,
1298 .halt_check = NOCHECK,
1299 },
1300 .root_en_mask = BIT(11),
1301 .ns_mask = F_MASK_BASIC | (7 << 12),
1302 .set_rate = set_rate_nop,
1303 .freq_tbl = clk_tbl_grp,
Matt Wagantall84f43fd2011-08-16 23:28:38 -07001304 .current_freq = &rcg_dummy_freq,
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07001305 .c = {
1306 .dbg_name = "grp_3d_src_clk",
Stephen Boyd409b8b42012-04-10 12:12:56 -07001307 .ops = &clk_ops_rcg,
Matt Wagantalle18bbc82011-10-06 10:07:28 -07001308 VDD_DIG_FMAX_MAP2(NOMINAL, 192000000, HIGH, 245760000),
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07001309 CLK_INIT(grp_3d_src_clk.c),
Stephen Boyd7fa26742011-08-11 23:22:29 -07001310 .depends = &axi_li_grp_clk.c,
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07001311 },
1312};
1313
1314static struct branch_clk grp_3d_clk = {
1315 .b = {
1316 .ctl_reg = GRP_NS_REG,
1317 .en_mask = BIT(7),
1318 .halt_reg = CLK_HALT_STATEB_REG,
1319 .halt_bit = 18,
1320 .reset_mask = P_GRP_3D_CLK,
1321 },
1322 .parent = &grp_3d_src_clk.c,
1323 .c = {
1324 .dbg_name = "grp_3d_clk",
1325 .ops = &clk_ops_branch,
1326 CLK_INIT(grp_3d_clk.c),
1327 },
1328};
1329
1330static struct branch_clk imem_clk = {
1331 .b = {
1332 .ctl_reg = GRP_NS_REG,
1333 .en_mask = BIT(9),
1334 .halt_reg = CLK_HALT_STATEB_REG,
1335 .halt_bit = 19,
1336 .reset_mask = P_IMEM_CLK,
1337 },
1338 .parent = &grp_3d_src_clk.c,
1339 .c = {
1340 .dbg_name = "imem_clk",
1341 .ops = &clk_ops_branch,
1342 CLK_INIT(imem_clk.c),
1343 },
1344};
1345
1346static struct clk_freq_tbl clk_tbl_sdc1_3[] = {
Matt Wagantalle18bbc82011-10-06 10:07:28 -07001347 F_MND8( 0, 0, 0, gnd, 1, 0, 0),
1348 F_MND8( 144000, 19, 12, lpxo, 1, 1, 171),
1349 F_MND8( 400000, 19, 12, lpxo, 1, 2, 123),
1350 F_MND8(16027000, 19, 12, pll3, 3, 14, 215),
1351 F_MND8(17000000, 19, 12, pll3, 4, 19, 206),
1352 F_MND8(20480000, 19, 12, pll3, 4, 23, 212),
1353 F_MND8(24576000, 19, 12, lpxo, 1, 0, 0),
1354 F_MND8(49152000, 19, 12, pll3, 3, 1, 5),
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07001355 F_END,
1356};
1357
1358static struct rcg_clk sdc1_clk = {
1359 .b = {
1360 .ctl_reg = SDCn_NS_REG(1),
1361 .en_mask = BIT(9),
1362 .halt_reg = CLK_HALT_STATEA_REG,
1363 .halt_bit = 1,
1364 .reset_mask = P_SDC1_CLK,
1365 },
1366 .ns_reg = SDCn_NS_REG(1),
1367 .md_reg = SDCn_NS_REG(1) - 4,
1368 .ns_mask = F_MASK_MND8(19, 12),
Matt Wagantall07c45472012-02-10 23:27:24 -08001369 .mnd_en_mask = BIT(8),
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07001370 .root_en_mask = BIT(11),
1371 .freq_tbl = clk_tbl_sdc1_3,
Matt Wagantall84f43fd2011-08-16 23:28:38 -07001372 .current_freq = &rcg_dummy_freq,
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07001373 .set_rate = set_rate_mnd,
1374 .c = {
1375 .dbg_name = "sdc1_clk",
Stephen Boyd409b8b42012-04-10 12:12:56 -07001376 .ops = &clk_ops_rcg,
Matt Wagantalle18bbc82011-10-06 10:07:28 -07001377 VDD_DIG_FMAX_MAP1(NOMINAL, 49152000),
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07001378 CLK_INIT(sdc1_clk.c),
1379 },
1380};
1381
1382static struct rcg_clk sdc3_clk = {
1383 .b = {
1384 .ctl_reg = SDCn_NS_REG(3),
1385 .en_mask = BIT(9),
1386 .halt_reg = CLK_HALT_STATEB_REG,
1387 .halt_bit = 24,
1388 .reset_mask = P_SDC3_CLK,
1389 },
1390 .ns_reg = SDCn_NS_REG(3),
1391 .md_reg = SDCn_NS_REG(3) - 4,
1392 .ns_mask = F_MASK_MND8(19, 12),
Matt Wagantall07c45472012-02-10 23:27:24 -08001393 .mnd_en_mask = BIT(8),
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07001394 .root_en_mask = BIT(11),
1395 .freq_tbl = clk_tbl_sdc1_3,
Matt Wagantall84f43fd2011-08-16 23:28:38 -07001396 .current_freq = &rcg_dummy_freq,
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07001397 .set_rate = set_rate_mnd,
1398 .c = {
1399 .dbg_name = "sdc3_clk",
Stephen Boyd409b8b42012-04-10 12:12:56 -07001400 .ops = &clk_ops_rcg,
Matt Wagantalle18bbc82011-10-06 10:07:28 -07001401 VDD_DIG_FMAX_MAP1(NOMINAL, 49152000),
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07001402 CLK_INIT(sdc3_clk.c),
1403 },
1404};
1405
1406static struct clk_freq_tbl clk_tbl_sdc2_4[] = {
Matt Wagantalle18bbc82011-10-06 10:07:28 -07001407 F_MND8( 0, 0, 0, gnd, 1, 0, 0),
1408 F_MND8( 144000, 20, 13, lpxo, 1, 1, 171),
1409 F_MND8( 400000, 20, 13, lpxo, 1, 2, 123),
1410 F_MND8(16027000, 20, 13, pll3, 3, 14, 215),
1411 F_MND8(17000000, 20, 13, pll3, 4, 19, 206),
1412 F_MND8(20480000, 20, 13, pll3, 4, 23, 212),
1413 F_MND8(24576000, 20, 13, lpxo, 1, 0, 0),
1414 F_MND8(49152000, 20, 13, pll3, 3, 1, 5),
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07001415 F_END,
1416};
1417
1418static struct rcg_clk sdc2_clk = {
1419 .b = {
1420 .ctl_reg = SDCn_NS_REG(2),
1421 .en_mask = BIT(9),
1422 .halt_reg = CLK_HALT_STATEA_REG,
1423 .halt_bit = 0,
1424 .reset_mask = P_SDC2_CLK,
1425 },
1426 .ns_reg = SDCn_NS_REG(2),
1427 .md_reg = SDCn_NS_REG(2) - 4,
1428 .ns_mask = F_MASK_MND8(20, 13),
Matt Wagantall07c45472012-02-10 23:27:24 -08001429 .mnd_en_mask = BIT(8),
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07001430 .root_en_mask = BIT(11),
1431 .freq_tbl = clk_tbl_sdc2_4,
Matt Wagantall84f43fd2011-08-16 23:28:38 -07001432 .current_freq = &rcg_dummy_freq,
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07001433 .set_rate = set_rate_mnd,
1434 .c = {
1435 .dbg_name = "sdc2_clk",
Stephen Boyd409b8b42012-04-10 12:12:56 -07001436 .ops = &clk_ops_rcg,
Matt Wagantalle18bbc82011-10-06 10:07:28 -07001437 VDD_DIG_FMAX_MAP1(NOMINAL, 49152000),
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07001438 CLK_INIT(sdc2_clk.c),
1439 },
1440};
1441
1442static struct rcg_clk sdc4_clk = {
1443 .b = {
1444 .ctl_reg = SDCn_NS_REG(4),
1445 .en_mask = BIT(9),
1446 .halt_reg = CLK_HALT_STATEB_REG,
1447 .halt_bit = 25,
1448 .reset_mask = P_SDC4_CLK,
1449 },
1450 .ns_reg = SDCn_NS_REG(4),
1451 .md_reg = SDCn_NS_REG(4) - 4,
1452 .ns_mask = F_MASK_MND8(20, 13),
Matt Wagantall07c45472012-02-10 23:27:24 -08001453 .mnd_en_mask = BIT(8),
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07001454 .root_en_mask = BIT(11),
1455 .freq_tbl = clk_tbl_sdc2_4,
Matt Wagantall84f43fd2011-08-16 23:28:38 -07001456 .current_freq = &rcg_dummy_freq,
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07001457 .set_rate = set_rate_mnd,
1458 .c = {
1459 .dbg_name = "sdc4_clk",
Stephen Boyd409b8b42012-04-10 12:12:56 -07001460 .ops = &clk_ops_rcg,
Matt Wagantalle18bbc82011-10-06 10:07:28 -07001461 VDD_DIG_FMAX_MAP1(NOMINAL, 49152000),
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07001462 CLK_INIT(sdc4_clk.c),
1463 },
1464};
1465
1466static struct clk_freq_tbl clk_tbl_mdp_core[] = {
Matt Wagantalle18bbc82011-10-06 10:07:28 -07001467 F_BASIC( 24576000, lpxo, 1),
1468 F_BASIC( 46080000, pll3, 16),
1469 F_BASIC( 49152000, pll3, 15),
1470 F_BASIC( 52663000, pll3, 14),
1471 F_BASIC( 92160000, pll3, 8),
1472 F_BASIC(122880000, pll3, 6),
1473 F_BASIC(147456000, pll3, 5),
1474 F_BASIC(153600000, pll1, 5),
1475 F_BASIC(192000000, pll1, 4),
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07001476 F_END,
1477};
1478
1479static struct rcg_clk mdp_clk = {
1480 .b = {
1481 .ctl_reg = MDP_NS_REG,
1482 .en_mask = BIT(9),
1483 .halt_reg = CLK_HALT_STATEB_REG,
1484 .halt_bit = 16,
1485 .reset_mask = P_MDP_CLK,
1486 },
1487 .ns_reg = MDP_NS_REG,
1488 .root_en_mask = BIT(11),
1489 .ns_mask = F_MASK_BASIC,
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07001490 .set_rate = set_rate_nop,
1491 .freq_tbl = clk_tbl_mdp_core,
Matt Wagantall84f43fd2011-08-16 23:28:38 -07001492 .current_freq = &rcg_dummy_freq,
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07001493 .c = {
1494 .dbg_name = "mdp_clk",
Stephen Boyd409b8b42012-04-10 12:12:56 -07001495 .ops = &clk_ops_rcg,
Matt Wagantalle18bbc82011-10-06 10:07:28 -07001496 VDD_DIG_FMAX_MAP2(NOMINAL, 153600000, HIGH, 192000000),
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07001497 CLK_INIT(mdp_clk.c),
Stephen Boyd7fa26742011-08-11 23:22:29 -07001498 .depends = &axi_mdp_clk.c,
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07001499 },
1500};
1501
1502static struct clk_freq_tbl clk_tbl_mdp_lcdc[] = {
Matt Wagantalle18bbc82011-10-06 10:07:28 -07001503 F_MND16( 0, gnd, 1, 0, 0),
1504 F_MND16(24576000, lpxo, 1, 0, 0),
1505 F_MND16(30720000, pll3, 4, 1, 6),
1506 F_MND16(32768000, pll3, 3, 2, 15),
1507 F_MND16(40960000, pll3, 2, 1, 9),
1508 F_MND16(73728000, pll3, 2, 1, 5),
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07001509 F_END,
1510};
1511
1512static struct rcg_clk mdp_lcdc_pclk_clk = {
1513 .b = {
1514 .ctl_reg = MDP_LCDC_NS_REG,
1515 .en_mask = BIT(9),
1516 .halt_reg = CLK_HALT_STATEB_REG,
1517 .halt_bit = 28,
1518 .reset_mask = P_MDP_LCDC_PCLK_CLK,
1519 },
1520 .ns_reg = MDP_LCDC_NS_REG,
1521 .md_reg = MDP_LCDC_NS_REG - 4,
1522 .root_en_mask = BIT(11),
1523 .ns_mask = F_MASK_MND16,
Matt Wagantall07c45472012-02-10 23:27:24 -08001524 .mnd_en_mask = BIT(8),
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07001525 .set_rate = set_rate_mnd,
1526 .freq_tbl = clk_tbl_mdp_lcdc,
Matt Wagantall84f43fd2011-08-16 23:28:38 -07001527 .current_freq = &rcg_dummy_freq,
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07001528 .c = {
1529 .dbg_name = "mdp_lcdc_pclk_clk",
Stephen Boyd409b8b42012-04-10 12:12:56 -07001530 .ops = &clk_ops_rcg,
Matt Wagantalle18bbc82011-10-06 10:07:28 -07001531 VDD_DIG_FMAX_MAP1(NOMINAL, 73728000),
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07001532 CLK_INIT(mdp_lcdc_pclk_clk.c),
1533 },
1534};
1535
1536static struct branch_clk mdp_lcdc_pad_pclk_clk = {
1537 .b = {
1538 .ctl_reg = MDP_LCDC_NS_REG,
1539 .en_mask = BIT(12),
1540 .halt_reg = CLK_HALT_STATEB_REG,
1541 .halt_bit = 29,
1542 .reset_mask = P_MDP_LCDC_PAD_PCLK_CLK,
1543 },
1544 .parent = &mdp_lcdc_pclk_clk.c,
1545 .c = {
1546 .dbg_name = "mdp_lcdc_pad_pclk_clk",
1547 .ops = &clk_ops_branch,
1548 CLK_INIT(mdp_lcdc_pad_pclk_clk.c),
1549 },
1550};
1551
1552static struct clk_freq_tbl clk_tbl_mdp_vsync[] = {
Matt Wagantall07c45472012-02-10 23:27:24 -08001553 F_RAW( 0, &gnd_clk.c, 0, (0x3<<2), 0, NULL),
1554 F_RAW(24576000, &lpxo_clk.c, 0, (0x1<<2), 0, NULL),
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07001555 F_END,
1556};
1557
1558static struct rcg_clk mdp_vsync_clk = {
1559 .b = {
1560 .ctl_reg = MDP_VSYNC_REG,
1561 .en_mask = BIT(0),
1562 .halt_reg = CLK_HALT_STATEB_REG,
1563 .halt_bit = 30,
1564 .reset_mask = P_MDP_VSYNC_CLK,
1565 },
1566 .ns_reg = MDP_VSYNC_REG,
1567 .ns_mask = BM(3, 2),
1568 .freq_tbl = clk_tbl_mdp_vsync,
1569 .set_rate = set_rate_nop,
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 = "mdp_vsync_clk",
Stephen Boyd409b8b42012-04-10 12:12:56 -07001573 .ops = &clk_ops_rcg,
Matt Wagantalle18bbc82011-10-06 10:07:28 -07001574 VDD_DIG_FMAX_MAP1(NOMINAL, 24576000),
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07001575 CLK_INIT(mdp_vsync_clk.c),
1576 },
1577};
1578
1579static struct clk_freq_tbl clk_tbl_mi2s_codec[] = {
Matt Wagantalle18bbc82011-10-06 10:07:28 -07001580 F_MND16( 0, gnd, 1, 0, 0),
1581 F_MND16( 2048000, lpxo, 4, 1, 3),
1582 F_MND16(12288000, lpxo, 2, 0, 0),
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07001583 F_END,
1584};
1585
1586static struct rcg_clk mi2s_codec_rx_m_clk = {
1587 .b = {
1588 .ctl_reg = MI2S_RX_NS_REG,
1589 .en_mask = BIT(12),
1590 .halt_reg = CLK_HALT_STATEA_REG,
1591 .halt_bit = 12,
1592 .reset_mask = P_MI2S_CODEC_RX_M_CLK,
1593 },
1594 .ns_reg = MI2S_RX_NS_REG,
1595 .md_reg = MI2S_RX_NS_REG - 4,
1596 .root_en_mask = BIT(11),
1597 .ns_mask = F_MASK_MND16,
Matt Wagantall07c45472012-02-10 23:27:24 -08001598 .mnd_en_mask = BIT(8),
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07001599 .set_rate = set_rate_mnd,
1600 .freq_tbl = clk_tbl_mi2s_codec,
Matt Wagantall84f43fd2011-08-16 23:28:38 -07001601 .current_freq = &rcg_dummy_freq,
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07001602 .c = {
1603 .dbg_name = "mi2s_codec_rx_m_clk",
Stephen Boyd409b8b42012-04-10 12:12:56 -07001604 .ops = &clk_ops_rcg,
Matt Wagantalle18bbc82011-10-06 10:07:28 -07001605 VDD_DIG_FMAX_MAP1(NOMINAL, 12288000),
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07001606 CLK_INIT(mi2s_codec_rx_m_clk.c),
1607 },
1608};
1609
1610static struct branch_clk mi2s_codec_rx_s_clk = {
1611 .b = {
1612 .ctl_reg = MI2S_RX_NS_REG,
1613 .en_mask = BIT(9),
1614 .halt_reg = CLK_HALT_STATEA_REG,
1615 .halt_bit = 13,
1616 .reset_mask = P_MI2S_CODEC_RX_S_CLK,
1617 },
1618 .parent = &mi2s_codec_rx_m_clk.c,
1619 .c = {
1620 .dbg_name = "mi2s_codec_rx_s_clk",
1621 .ops = &clk_ops_branch,
1622 CLK_INIT(mi2s_codec_rx_s_clk.c),
1623 },
1624};
1625
1626static struct rcg_clk mi2s_codec_tx_m_clk = {
1627 .b = {
1628 .ctl_reg = MI2S_TX_NS_REG,
1629 .en_mask = BIT(12),
1630 .halt_reg = CLK_HALT_STATEC_REG,
1631 .halt_bit = 8,
1632 .reset_mask = P_MI2S_CODEC_TX_M_CLK,
1633 },
1634 .ns_reg = MI2S_TX_NS_REG,
1635 .md_reg = MI2S_TX_NS_REG - 4,
1636 .root_en_mask = BIT(11),
1637 .ns_mask = F_MASK_MND16,
Matt Wagantall07c45472012-02-10 23:27:24 -08001638 .mnd_en_mask = BIT(8),
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07001639 .set_rate = set_rate_mnd,
1640 .freq_tbl = clk_tbl_mi2s_codec,
Matt Wagantall84f43fd2011-08-16 23:28:38 -07001641 .current_freq = &rcg_dummy_freq,
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07001642 .c = {
1643 .dbg_name = "mi2s_codec_tx_m_clk",
Stephen Boyd409b8b42012-04-10 12:12:56 -07001644 .ops = &clk_ops_rcg,
Matt Wagantalle18bbc82011-10-06 10:07:28 -07001645 VDD_DIG_FMAX_MAP1(NOMINAL, 12288000),
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07001646 CLK_INIT(mi2s_codec_tx_m_clk.c),
1647 },
1648};
1649
1650static struct branch_clk mi2s_codec_tx_s_clk = {
1651 .b = {
1652 .ctl_reg = MI2S_TX_NS_REG,
1653 .en_mask = BIT(9),
1654 .halt_reg = CLK_HALT_STATEA_REG,
1655 .halt_bit = 11,
1656 .reset_mask = P_MI2S_CODEC_TX_S_CLK,
1657 },
1658 .parent = &mi2s_codec_tx_m_clk.c,
1659 .c = {
1660 .dbg_name = "mi2s_codec_tx_s_clk",
1661 .ops = &clk_ops_branch,
1662 CLK_INIT(mi2s_codec_tx_s_clk.c),
1663 },
1664};
1665
1666static struct clk_freq_tbl clk_tbl_mi2s[] = {
Matt Wagantalle18bbc82011-10-06 10:07:28 -07001667 F_MND16( 0, gnd, 1, 0, 0),
1668 F_MND16(12288000, lpxo, 2, 0, 0),
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07001669 F_END,
1670};
1671
1672static struct rcg_clk mi2s_m_clk = {
1673 .b = {
1674 .ctl_reg = MI2S_NS_REG,
1675 .en_mask = BIT(12),
1676 .halt_reg = CLK_HALT_STATEC_REG,
1677 .halt_bit = 4,
1678 .reset_mask = P_MI2S_M_CLK,
1679 },
1680 .ns_reg = MI2S_NS_REG,
1681 .md_reg = MI2S_NS_REG - 4,
1682 .root_en_mask = BIT(11),
1683 .ns_mask = F_MASK_MND16,
Matt Wagantall07c45472012-02-10 23:27:24 -08001684 .mnd_en_mask = BIT(8),
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07001685 .set_rate = set_rate_mnd,
1686 .freq_tbl = clk_tbl_mi2s,
Matt Wagantall84f43fd2011-08-16 23:28:38 -07001687 .current_freq = &rcg_dummy_freq,
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07001688 .c = {
1689 .dbg_name = "mi2s_m_clk",
Stephen Boyd409b8b42012-04-10 12:12:56 -07001690 .ops = &clk_ops_rcg,
Matt Wagantalle18bbc82011-10-06 10:07:28 -07001691 VDD_DIG_FMAX_MAP1(NOMINAL, 12288000),
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07001692 CLK_INIT(mi2s_m_clk.c),
1693 },
1694};
1695
1696static struct branch_clk mi2s_s_clk = {
1697 .b = {
1698 .ctl_reg = MI2S_NS_REG,
1699 .en_mask = BIT(9),
1700 .halt_reg = CLK_HALT_STATEC_REG,
1701 .halt_bit = 3,
1702 .reset_mask = P_MI2S_S_CLK,
1703 },
1704 .parent = &mi2s_m_clk.c,
1705 .c = {
1706 .dbg_name = "mi2s_s_clk",
1707 .ops = &clk_ops_branch,
1708 CLK_INIT(mi2s_s_clk.c),
1709 },
1710};
1711
Matt Wagantalle18bbc82011-10-06 10:07:28 -07001712#define F_SDAC(f, s, div, m, n) \
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07001713 { \
1714 .freq_hz = f, \
1715 .md_val = MD16(m, n), \
1716 .ns_val = N16(m, n) | SPDIV(SRC_SEL_SDAC_##s, div), \
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07001717 .src_clk = &s##_clk.c, \
1718 }
1719
1720static struct clk_freq_tbl clk_tbl_sdac[] = {
Matt Wagantalle18bbc82011-10-06 10:07:28 -07001721 F_SDAC( 256000, lpxo, 4, 1, 24),
1722 F_SDAC( 352800, lpxo, 1, 147, 10240),
1723 F_SDAC( 384000, lpxo, 4, 1, 16),
1724 F_SDAC( 512000, lpxo, 4, 1, 12),
1725 F_SDAC( 705600, lpxo, 1, 147, 5120),
1726 F_SDAC( 768000, lpxo, 4, 1, 8),
1727 F_SDAC(1024000, lpxo, 4, 1, 6),
1728 F_SDAC(1411200, lpxo, 1, 147, 2560),
1729 F_SDAC(1536000, lpxo, 4, 1, 4),
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07001730 F_END,
1731};
1732
1733static struct rcg_clk sdac_clk = {
1734 .b = {
1735 .ctl_reg = SDAC_NS_REG,
1736 .en_mask = BIT(9),
1737 .halt_reg = CLK_HALT_STATEA_REG,
1738 .halt_bit = 2,
1739 .reset_mask = P_SDAC_CLK,
1740 },
1741 .ns_reg = SDAC_NS_REG,
1742 .md_reg = SDAC_NS_REG - 4,
1743 .root_en_mask = BIT(11),
Matt Wagantall07c45472012-02-10 23:27:24 -08001744 .mnd_en_mask = BIT(8),
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07001745 .freq_tbl = clk_tbl_sdac,
1746 .ns_mask = F_MASK_MND16,
1747 .set_rate = set_rate_mnd,
Matt Wagantall84f43fd2011-08-16 23:28:38 -07001748 .current_freq = &rcg_dummy_freq,
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07001749 .c = {
1750 .dbg_name = "sdac_clk",
Stephen Boyd409b8b42012-04-10 12:12:56 -07001751 .ops = &clk_ops_rcg,
Matt Wagantalle18bbc82011-10-06 10:07:28 -07001752 VDD_DIG_FMAX_MAP1(NOMINAL, 1536000),
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07001753 CLK_INIT(sdac_clk.c),
1754 },
1755};
1756
1757static struct branch_clk sdac_m_clk = {
1758 .b = {
1759 .ctl_reg = SDAC_NS_REG,
1760 .en_mask = BIT(12),
1761 .halt_reg = CLK_HALT_STATEB_REG,
1762 .halt_bit = 17,
1763 .reset_mask = P_SDAC_M_CLK,
1764 },
1765 .parent = &sdac_clk.c,
1766 .c = {
1767 .dbg_name = "sdac_m_clk",
1768 .ops = &clk_ops_branch,
1769 CLK_INIT(sdac_m_clk.c),
1770 },
1771};
1772
1773static struct clk_freq_tbl clk_tbl_tv[] = {
Matt Wagantalle18bbc82011-10-06 10:07:28 -07001774 F_MND8( 0, 0, 0, gnd, 1, 0, 0),
1775 F_MND8(27000000, 23, 16, pll4, 2, 2, 33),
1776 F_MND8(74250000, 23, 16, pll4, 2, 1, 6),
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07001777 F_END,
1778};
1779
1780static struct rcg_clk tv_clk = {
1781 .ns_reg = TV_NS_REG,
1782 .b = {
1783 .ctl_reg = TV_NS_REG,
1784 .halt_check = NOCHECK,
1785 },
1786 .md_reg = TV_NS_REG - 4,
1787 .ns_mask = F_MASK_MND8(23, 16),
Matt Wagantall07c45472012-02-10 23:27:24 -08001788 .mnd_en_mask = BIT(8),
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07001789 .root_en_mask = BIT(11),
1790 .freq_tbl = clk_tbl_tv,
Matt Wagantall84f43fd2011-08-16 23:28:38 -07001791 .current_freq = &rcg_dummy_freq,
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07001792 .set_rate = set_rate_mnd,
1793 .c = {
1794 .dbg_name = "tv_clk",
Stephen Boyd409b8b42012-04-10 12:12:56 -07001795 .ops = &clk_ops_rcg,
Matt Wagantalle18bbc82011-10-06 10:07:28 -07001796 VDD_DIG_FMAX_MAP1(NOMINAL, 74250000),
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07001797 CLK_INIT(tv_clk.c),
1798 },
1799};
1800
1801static struct branch_clk hdmi_clk = {
1802 .b = {
1803 .ctl_reg = HDMI_NS_REG,
1804 .en_mask = BIT(9),
1805 .halt_reg = CLK_HALT_STATEC_REG,
1806 .halt_bit = 7,
1807 .reset_mask = P_HDMI_CLK,
1808 },
1809 .parent = &tv_clk.c,
1810 .c = {
1811 .dbg_name = "hdmi_clk",
1812 .ops = &clk_ops_branch,
1813 CLK_INIT(hdmi_clk.c),
1814 },
1815};
1816
1817static struct branch_clk tv_dac_clk = {
1818 .b = {
1819 .ctl_reg = TV_NS_REG,
1820 .en_mask = BIT(12),
1821 .halt_reg = CLK_HALT_STATEB_REG,
1822 .halt_bit = 27,
1823 .reset_mask = P_TV_DAC_CLK,
1824 },
1825 .parent = &tv_clk.c,
1826 .c = {
1827 .dbg_name = "tv_dac_clk",
1828 .ops = &clk_ops_branch,
1829 CLK_INIT(tv_dac_clk.c),
1830 },
1831};
1832
1833static struct branch_clk tv_enc_clk = {
1834 .b = {
1835 .ctl_reg = TV_NS_REG,
1836 .en_mask = BIT(9),
1837 .halt_reg = CLK_HALT_STATEB_REG,
1838 .halt_bit = 10,
1839 .reset_mask = P_TV_ENC_CLK,
1840 },
1841 .parent = &tv_clk.c,
1842 .c = {
1843 .dbg_name = "tv_enc_clk",
1844 .ops = &clk_ops_branch,
1845 CLK_INIT(tv_enc_clk.c),
1846 },
1847};
1848
1849/* Hacking root & branch into one param. */
1850static struct branch_clk tsif_ref_clk = {
1851 .b = {
1852 .ctl_reg = TSIF_NS_REG,
1853 .en_mask = BIT(9)|BIT(11),
1854 .halt_reg = CLK_HALT_STATEB_REG,
1855 .halt_bit = 11,
1856 .reset_mask = P_TSIF_REF_CLK,
1857 },
1858 .parent = &tv_clk.c,
1859 .c = {
1860 .dbg_name = "tsif_ref_clk",
1861 .ops = &clk_ops_branch,
1862 CLK_INIT(tsif_ref_clk.c),
1863 },
1864};
1865
1866static struct clk_freq_tbl clk_tbl_usb[] = {
Matt Wagantalle18bbc82011-10-06 10:07:28 -07001867 F_MND8( 0, 0, 0, gnd, 1, 0, 0),
1868 F_MND8(60000000, 23, 16, pll1, 2, 5, 32),
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07001869 F_END,
1870};
1871
1872static struct rcg_clk usb_hs_src_clk = {
1873 .ns_reg = USBH_NS_REG,
1874 .b = {
1875 .ctl_reg = USBH_NS_REG,
1876 .halt_check = NOCHECK,
1877 },
1878 .md_reg = USBH_NS_REG - 4,
1879 .ns_mask = F_MASK_MND8(23, 16),
Matt Wagantall07c45472012-02-10 23:27:24 -08001880 .mnd_en_mask = BIT(8),
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07001881 .root_en_mask = BIT(11),
1882 .freq_tbl = clk_tbl_usb,
Matt Wagantall84f43fd2011-08-16 23:28:38 -07001883 .current_freq = &rcg_dummy_freq,
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07001884 .set_rate = set_rate_mnd,
1885 .c = {
1886 .dbg_name = "usb_hs_src_clk",
Stephen Boyd409b8b42012-04-10 12:12:56 -07001887 .ops = &clk_ops_rcg,
Matt Wagantalle18bbc82011-10-06 10:07:28 -07001888 VDD_DIG_FMAX_MAP1(NOMINAL, 60000000),
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07001889 CLK_INIT(usb_hs_src_clk.c),
Stephen Boyd7fa26742011-08-11 23:22:29 -07001890 .depends = &axi_li_adsp_a_clk.c,
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07001891 },
1892};
1893
1894static struct branch_clk usb_hs_clk = {
1895 .b = {
1896 .ctl_reg = USBH_NS_REG,
1897 .en_mask = BIT(9),
1898 .halt_reg = CLK_HALT_STATEB_REG,
1899 .halt_bit = 26,
1900 .reset_mask = P_USB_HS_CLK,
1901 },
1902 .c = {
1903 .dbg_name = "usb_hs_clk",
1904 .ops = &clk_ops_branch,
1905 CLK_INIT(usb_hs_clk.c),
1906 },
1907};
1908
1909static struct branch_clk usb_hs_core_clk = {
1910 .b = {
1911 .ctl_reg = USBH_NS_REG,
1912 .en_mask = BIT(13),
1913 .halt_reg = CLK_HALT_STATEA_REG,
1914 .halt_bit = 27,
1915 .reset_mask = P_USB_HS_CORE_CLK,
1916 },
1917 .parent = &usb_hs_src_clk.c,
1918 .c = {
1919 .dbg_name = "usb_hs_core_clk",
1920 .ops = &clk_ops_branch,
1921 CLK_INIT(usb_hs_core_clk.c),
1922 },
1923};
1924
1925static struct branch_clk usb_hs2_clk = {
1926 .b = {
1927 .ctl_reg = USBH2_NS_REG,
1928 .en_mask = BIT(9),
1929 .halt_reg = CLK_HALT_STATEB_REG,
1930 .halt_bit = 3,
1931 .reset_mask = P_USB_HS2_CLK,
1932 },
1933 .parent = &usb_hs_src_clk.c,
1934 .c = {
1935 .dbg_name = "usb_hs2_clk",
1936 .ops = &clk_ops_branch,
1937 CLK_INIT(usb_hs2_clk.c),
1938 },
1939};
1940
1941static struct branch_clk usb_hs2_core_clk = {
1942 .b = {
1943 .ctl_reg = USBH2_NS_REG,
1944 .en_mask = BIT(4),
1945 .halt_reg = CLK_HALT_STATEA_REG,
1946 .halt_bit = 28,
1947 .reset_mask = P_USB_HS2_CORE_CLK,
1948 },
1949 .parent = &usb_hs_src_clk.c,
1950 .c = {
1951 .dbg_name = "usb_hs2_core_clk",
1952 .ops = &clk_ops_branch,
1953 CLK_INIT(usb_hs2_core_clk.c),
1954 },
1955};
1956
1957static struct branch_clk usb_hs3_clk = {
1958 .b = {
1959 .ctl_reg = USBH3_NS_REG,
1960 .en_mask = BIT(9),
1961 .halt_reg = CLK_HALT_STATEB_REG,
1962 .halt_bit = 2,
1963 .reset_mask = P_USB_HS3_CLK,
1964 },
1965 .parent = &usb_hs_src_clk.c,
1966 .c = {
1967 .dbg_name = "usb_hs3_clk",
1968 .ops = &clk_ops_branch,
1969 CLK_INIT(usb_hs3_clk.c),
1970 },
1971};
1972
1973static struct branch_clk usb_hs3_core_clk = {
1974 .b = {
1975 .ctl_reg = USBH3_NS_REG,
1976 .en_mask = BIT(4),
1977 .halt_reg = CLK_HALT_STATEA_REG,
1978 .halt_bit = 29,
1979 .reset_mask = P_USB_HS3_CORE_CLK,
1980 },
1981 .parent = &usb_hs_src_clk.c,
1982 .c = {
1983 .dbg_name = "usb_hs3_core_clk",
1984 .ops = &clk_ops_branch,
1985 CLK_INIT(usb_hs3_core_clk.c),
1986 },
1987};
1988
1989static struct clk_freq_tbl clk_tbl_vfe_jpeg[] = {
Matt Wagantalle18bbc82011-10-06 10:07:28 -07001990 F_MND16( 24576000, lpxo, 1, 0, 0),
1991 F_MND16( 36864000, pll3, 4, 1, 5),
1992 F_MND16( 46080000, pll3, 4, 1, 4),
1993 F_MND16( 61440000, pll3, 4, 1, 3),
1994 F_MND16( 73728000, pll3, 2, 1, 5),
1995 F_MND16( 81920000, pll3, 3, 1, 3),
1996 F_MND16( 92160000, pll3, 4, 1, 2),
1997 F_MND16( 98304000, pll3, 3, 2, 5),
1998 F_MND16(105326000, pll3, 2, 2, 7),
1999 F_MND16(122880000, pll3, 2, 1, 3),
2000 F_MND16(147456000, pll3, 2, 2, 5),
2001 F_MND16(153600000, pll1, 2, 2, 5),
2002 F_MND16(192000000, pll1, 4, 0, 0),
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07002003 F_END,
2004};
2005
2006static struct rcg_clk jpeg_clk = {
2007 .b = {
2008 .ctl_reg = JPEG_NS_REG,
2009 .en_mask = BIT(9),
2010 .halt_reg = CLK_HALT_STATEB_REG,
2011 .halt_bit = 1,
2012 .reset_mask = P_JPEG_CLK,
2013 },
2014 .ns_reg = JPEG_NS_REG,
2015 .md_reg = JPEG_NS_REG - 4,
2016 .root_en_mask = BIT(11),
2017 .freq_tbl = clk_tbl_vfe_jpeg,
2018 .ns_mask = F_MASK_MND16,
Matt Wagantall07c45472012-02-10 23:27:24 -08002019 .mnd_en_mask = BIT(8),
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07002020 .set_rate = set_rate_mnd,
Matt Wagantall84f43fd2011-08-16 23:28:38 -07002021 .current_freq = &rcg_dummy_freq,
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07002022 .c = {
2023 .dbg_name = "jpeg_clk",
Stephen Boyd409b8b42012-04-10 12:12:56 -07002024 .ops = &clk_ops_rcg,
Matt Wagantalle18bbc82011-10-06 10:07:28 -07002025 VDD_DIG_FMAX_MAP2(NOMINAL, 153600000, HIGH, 192000000),
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07002026 CLK_INIT(jpeg_clk.c),
Stephen Boyd7fa26742011-08-11 23:22:29 -07002027 .depends = &axi_li_jpeg_clk.c,
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07002028 },
2029};
2030
2031static struct rcg_clk vfe_clk = {
2032 .b = {
2033 .ctl_reg = CAM_VFE_NS_REG,
2034 .en_mask = BIT(9),
2035 .halt_reg = CLK_HALT_STATEB_REG,
2036 .halt_bit = 0,
2037 .reset_mask = P_VFE_CLK,
2038 },
2039 .ns_reg = CAM_VFE_NS_REG,
2040 .md_reg = CAM_VFE_NS_REG - 4,
2041 .root_en_mask = BIT(13),
2042 .freq_tbl = clk_tbl_vfe_jpeg,
2043 .ns_mask = F_MASK_MND16,
Matt Wagantall07c45472012-02-10 23:27:24 -08002044 .mnd_en_mask = BIT(8),
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07002045 .set_rate = set_rate_mnd,
Matt Wagantall84f43fd2011-08-16 23:28:38 -07002046 .current_freq = &rcg_dummy_freq,
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07002047 .c = {
2048 .dbg_name = "vfe_clk",
Stephen Boyd409b8b42012-04-10 12:12:56 -07002049 .ops = &clk_ops_rcg,
Matt Wagantalle18bbc82011-10-06 10:07:28 -07002050 VDD_DIG_FMAX_MAP2(NOMINAL, 153600000, HIGH, 192000000),
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07002051 CLK_INIT(vfe_clk.c),
Stephen Boyd7fa26742011-08-11 23:22:29 -07002052 .depends = &axi_li_vfe_clk.c,
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07002053 },
2054};
2055
2056static struct branch_clk vfe_mdc_clk = {
2057 .b = {
2058 .ctl_reg = CAM_VFE_NS_REG,
2059 .en_mask = BIT(11),
2060 .halt_reg = CLK_HALT_STATEA_REG,
2061 .halt_bit = 9,
2062 .reset_mask = P_VFE_MDC_CLK,
2063 },
2064 .parent = &vfe_clk.c,
2065 .c = {
2066 .dbg_name = "vfe_mdc_clk",
2067 .ops = &clk_ops_branch,
2068 CLK_INIT(vfe_mdc_clk.c),
2069 },
2070};
2071
2072static struct branch_clk vfe_camif_clk = {
2073 .b = {
2074 .ctl_reg = CAM_VFE_NS_REG,
2075 .en_mask = BIT(15),
2076 .halt_reg = CLK_HALT_STATEC_REG,
2077 .halt_bit = 13,
2078 .reset_mask = P_VFE_CAMIF_CLK,
2079 },
2080 .parent = &vfe_clk.c,
2081 .c = {
2082 .dbg_name = "vfe_camif_clk",
2083 .ops = &clk_ops_branch,
2084 CLK_INIT(vfe_camif_clk.c),
2085 },
2086};
2087
2088static struct branch_clk csi0_vfe_clk = {
2089 .b = {
2090 .ctl_reg = CSI_NS_REG,
2091 .en_mask = BIT(15),
2092 .halt_reg = CLK_HALT_STATEC_REG,
2093 .halt_bit = 16,
2094 .reset_mask = P_CSI0_VFE_CLK,
2095 },
2096 .parent = &vfe_clk.c,
2097 .c = {
2098 .dbg_name = "csi0_vfe_clk",
2099 .ops = &clk_ops_branch,
2100 CLK_INIT(csi0_vfe_clk.c),
2101 },
2102};
2103
2104static struct clk_freq_tbl clk_tbl_cam[] = {
Matt Wagantalle18bbc82011-10-06 10:07:28 -07002105 F_MND16( 0, gnd, 1, 0, 0),
2106 F_MND16( 6000000, pll1, 4, 1, 32),
2107 F_MND16( 8000000, pll1, 4, 1, 24),
2108 F_MND16(12000000, pll1, 4, 1, 16),
2109 F_MND16(16000000, pll1, 4, 1, 12),
2110 F_MND16(19200000, pll1, 4, 1, 10),
2111 F_MND16(24000000, pll1, 4, 1, 8),
2112 F_MND16(32000000, pll1, 4, 1, 6),
2113 F_MND16(48000000, pll1, 4, 1, 4),
2114 F_MND16(64000000, pll1, 4, 1, 3),
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07002115 F_END,
2116};
2117
2118static struct rcg_clk cam_m_clk = {
2119 .b = {
2120 .ctl_reg = CAM_NS_REG,
2121 .halt_check = DELAY,
2122 .reset_mask = P_CAM_M_CLK,
2123 },
2124 .ns_reg = CAM_NS_REG,
2125 .md_reg = CAM_NS_REG - 4,
2126 .root_en_mask = BIT(9),
2127 .freq_tbl = clk_tbl_cam,
2128 .ns_mask = F_MASK_MND16,
Matt Wagantall07c45472012-02-10 23:27:24 -08002129 .mnd_en_mask = BIT(8),
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07002130 .set_rate = set_rate_mnd,
Matt Wagantall84f43fd2011-08-16 23:28:38 -07002131 .current_freq = &rcg_dummy_freq,
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07002132 .c = {
2133 .dbg_name = "cam_m_clk",
Stephen Boyd409b8b42012-04-10 12:12:56 -07002134 .ops = &clk_ops_rcg,
Matt Wagantalle18bbc82011-10-06 10:07:28 -07002135 VDD_DIG_FMAX_MAP1(NOMINAL, 64000000),
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07002136 CLK_INIT(cam_m_clk.c),
2137 },
2138};
2139
2140static struct clk_freq_tbl clk_tbl_vpe[] = {
Matt Wagantalle18bbc82011-10-06 10:07:28 -07002141 F_MND8( 24576000, 22, 15, lpxo, 1, 0, 0),
2142 F_MND8( 30720000, 22, 15, pll3, 4, 1, 6),
2143 F_MND8( 61440000, 22, 15, pll3, 4, 1, 3),
2144 F_MND8( 81920000, 22, 15, pll3, 3, 1, 3),
2145 F_MND8(122880000, 22, 15, pll3, 3, 1, 2),
2146 F_MND8(147456000, 22, 15, pll3, 1, 1, 5),
2147 F_MND8(153600000, 22, 15, pll1, 1, 1, 5),
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07002148 F_END,
2149};
2150
2151static struct rcg_clk vpe_clk = {
2152 .b = {
2153 .ctl_reg = VPE_NS_REG,
2154 .en_mask = BIT(9),
2155 .halt_reg = CLK_HALT_STATEC_REG,
2156 .halt_bit = 10,
2157 .reset_mask = P_VPE_CLK,
2158 },
2159 .ns_reg = VPE_NS_REG,
2160 .md_reg = VPE_NS_REG - 4,
2161 .ns_mask = F_MASK_MND8(22, 15),
Matt Wagantall07c45472012-02-10 23:27:24 -08002162 .mnd_en_mask = BIT(8),
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07002163 .root_en_mask = BIT(11),
2164 .freq_tbl = clk_tbl_vpe,
Matt Wagantall84f43fd2011-08-16 23:28:38 -07002165 .current_freq = &rcg_dummy_freq,
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07002166 .set_rate = set_rate_mnd,
2167 .c = {
2168 .dbg_name = "vpe_clk",
Stephen Boyd409b8b42012-04-10 12:12:56 -07002169 .ops = &clk_ops_rcg,
Matt Wagantalle18bbc82011-10-06 10:07:28 -07002170 VDD_DIG_FMAX_MAP1(NOMINAL, 153600000),
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07002171 CLK_INIT(vpe_clk.c),
Stephen Boyd7fa26742011-08-11 23:22:29 -07002172 .depends = &axi_vpe_clk.c,
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07002173 },
2174};
2175
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07002176static struct clk_freq_tbl clk_tbl_mfc[] = {
Matt Wagantalle18bbc82011-10-06 10:07:28 -07002177 F_MND8( 24576000, 24, 17, lpxo, 1, 0, 0),
2178 F_MND8( 30720000, 24, 17, pll3, 4, 1, 6),
2179 F_MND8( 61440000, 24, 17, pll3, 4, 1, 3),
2180 F_MND8( 81920000, 24, 17, pll3, 3, 1, 3),
2181 F_MND8(122880000, 24, 17, pll3, 3, 1, 2),
2182 F_MND8(147456000, 24, 17, pll3, 1, 1, 5),
2183 F_MND8(153600000, 24, 17, pll1, 1, 1, 5),
2184 F_MND8(170667000, 24, 17, pll1, 1, 2, 9),
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07002185 F_END,
2186};
2187
2188static struct rcg_clk mfc_clk = {
2189 .b = {
2190 .ctl_reg = MFC_NS_REG,
2191 .en_mask = BIT(9),
2192 .halt_reg = CLK_HALT_STATEC_REG,
2193 .halt_bit = 12,
2194 .reset_mask = P_MFC_CLK,
2195 },
2196 .ns_reg = MFC_NS_REG,
2197 .md_reg = MFC_NS_REG - 4,
2198 .ns_mask = F_MASK_MND8(24, 17),
Matt Wagantall07c45472012-02-10 23:27:24 -08002199 .mnd_en_mask = BIT(8),
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07002200 .root_en_mask = BIT(11),
2201 .freq_tbl = clk_tbl_mfc,
Matt Wagantall84f43fd2011-08-16 23:28:38 -07002202 .current_freq = &rcg_dummy_freq,
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07002203 .set_rate = set_rate_mnd,
2204 .c = {
2205 .dbg_name = "mfc_clk",
Stephen Boyd409b8b42012-04-10 12:12:56 -07002206 .ops = &clk_ops_rcg,
Matt Wagantalle18bbc82011-10-06 10:07:28 -07002207 VDD_DIG_FMAX_MAP1(NOMINAL, 170667000),
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07002208 CLK_INIT(mfc_clk.c),
Stephen Boyd7fa26742011-08-11 23:22:29 -07002209 .depends = &axi_mfc_clk.c,
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07002210 },
2211};
2212
2213static struct branch_clk mfc_div2_clk = {
2214 .b = {
2215 .ctl_reg = MFC_NS_REG,
2216 .en_mask = BIT(15),
2217 .halt_reg = CLK_HALT_STATEC_REG,
2218 .halt_bit = 11,
2219 .reset_mask = P_MFC_DIV2_CLK,
2220 },
2221 .parent = &mfc_clk.c,
2222 .c = {
2223 .dbg_name = "mfc_div2_clk",
2224 .ops = &clk_ops_branch,
2225 CLK_INIT(mfc_div2_clk.c),
2226 },
2227};
2228
2229static struct clk_freq_tbl clk_tbl_spi[] = {
Matt Wagantalle18bbc82011-10-06 10:07:28 -07002230 F_MND8( 0, 0, 0, gnd, 1, 0, 0),
2231 F_MND8( 9963243, 19, 12, pll3, 4, 2, 37),
Matt Wagantalla7df37f2011-11-11 11:28:11 -08002232 F_MND8(24576000, 19, 12, lpxo, 1, 0, 0),
Matt Wagantalle18bbc82011-10-06 10:07:28 -07002233 F_MND8(26331429, 19, 12, pll3, 4, 1, 7),
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07002234 F_END,
2235};
2236
2237static struct rcg_clk spi_clk = {
2238 .b = {
2239 .ctl_reg = SPI_NS_REG,
2240 .en_mask = BIT(9),
2241 .halt_reg = CLK_HALT_STATEC_REG,
2242 .halt_bit = 0,
2243 .reset_mask = P_SPI_CLK,
2244 },
2245 .ns_reg = SPI_NS_REG,
2246 .md_reg = SPI_NS_REG - 4,
2247 .ns_mask = F_MASK_MND8(19, 12),
Matt Wagantall07c45472012-02-10 23:27:24 -08002248 .mnd_en_mask = BIT(8),
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07002249 .root_en_mask = BIT(11),
2250 .freq_tbl = clk_tbl_spi,
Matt Wagantall84f43fd2011-08-16 23:28:38 -07002251 .current_freq = &rcg_dummy_freq,
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07002252 .set_rate = set_rate_mnd,
2253 .c = {
2254 .dbg_name = "spi_clk",
Stephen Boyd409b8b42012-04-10 12:12:56 -07002255 .ops = &clk_ops_rcg,
Matt Wagantalle18bbc82011-10-06 10:07:28 -07002256 VDD_DIG_FMAX_MAP1(NOMINAL, 26331429),
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07002257 CLK_INIT(spi_clk.c),
2258 },
2259};
2260
2261static struct clk_freq_tbl clk_tbl_lpa_codec[] = {
Matt Wagantall07c45472012-02-10 23:27:24 -08002262 F_RAW(1, NULL, 0, 0, 0, NULL), /* src MI2S_CODEC_RX */
2263 F_RAW(2, NULL, 0, 1, 0, NULL), /* src ECODEC_CIF */
2264 F_RAW(3, NULL, 0, 2, 0, NULL), /* src MI2S */
2265 F_RAW(4, NULL, 0, 3, 0, NULL), /* src SDAC */
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07002266 F_END,
2267};
2268
2269static struct rcg_clk lpa_codec_clk = {
2270 .b = {
2271 .ctl_reg = LPA_NS_REG,
2272 .en_mask = BIT(9),
2273 .halt_reg = CLK_HALT_STATEC_REG,
2274 .halt_bit = 6,
2275 .reset_mask = P_LPA_CODEC_CLK,
2276 },
2277 .ns_reg = LPA_NS_REG,
2278 .ns_mask = BM(1, 0),
2279 .set_rate = set_rate_nop,
2280 .freq_tbl = clk_tbl_lpa_codec,
Matt Wagantall84f43fd2011-08-16 23:28:38 -07002281 .current_freq = &rcg_dummy_freq,
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07002282 .c = {
2283 .dbg_name = "lpa_codec_clk",
Stephen Boyd409b8b42012-04-10 12:12:56 -07002284 .ops = &clk_ops_rcg,
Matt Wagantalle18bbc82011-10-06 10:07:28 -07002285 VDD_DIG_FMAX_MAP1(LOW, 4),
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07002286 CLK_INIT(lpa_codec_clk.c),
2287 },
2288};
2289
2290static struct clk_freq_tbl clk_tbl_mdc[] = {
Matt Wagantall07c45472012-02-10 23:27:24 -08002291 F_RAW(1, NULL, 0, 0, 0, NULL),
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07002292 F_END
2293};
2294
2295static struct rcg_clk mdc_clk = {
2296 .b = {
2297 .ctl_reg = MDC_NS_REG,
2298 .en_mask = BIT(9),
2299 .halt_reg = CLK_HALT_STATEA_REG,
2300 .halt_bit = 10,
2301 .reset_mask = P_MDC_CLK,
2302 },
2303 .ns_reg = MDC_NS_REG,
2304 .root_en_mask = BIT(11),
2305 .freq_tbl = clk_tbl_mdc,
Matt Wagantall84f43fd2011-08-16 23:28:38 -07002306 .current_freq = &rcg_dummy_freq,
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07002307 .set_rate = set_rate_nop,
2308 .c = {
2309 .dbg_name = "mdc_clk",
Stephen Boyd409b8b42012-04-10 12:12:56 -07002310 .ops = &clk_ops_rcg,
Matt Wagantalle18bbc82011-10-06 10:07:28 -07002311 VDD_DIG_FMAX_MAP1(LOW, 1),
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07002312 CLK_INIT(mdc_clk.c),
2313 },
2314};
2315
2316static struct branch_clk lpa_core_clk = {
2317 .b = {
2318 .ctl_reg = LPA_NS_REG,
2319 .en_mask = BIT(5),
2320 .halt_reg = CLK_HALT_STATEC_REG,
2321 .halt_bit = 5,
2322 .reset_mask = P_LPA_CORE_CLK,
2323 },
2324 .c = {
2325 .dbg_name = "lpa_core_clk",
2326 .ops = &clk_ops_branch,
2327 CLK_INIT(lpa_core_clk.c),
2328 },
2329};
2330
2331static DEFINE_CLK_PCOM(adsp_clk, ADSP_CLK, CLKFLAG_SKIP_AUTO_OFF);
2332static DEFINE_CLK_PCOM(codec_ssbi_clk, CODEC_SSBI_CLK, CLKFLAG_SKIP_AUTO_OFF);
2333static DEFINE_CLK_PCOM(ebi1_clk, EBI1_CLK, CLKFLAG_SKIP_AUTO_OFF | CLKFLAG_MIN);
2334static DEFINE_CLK_PCOM(ebi1_fixed_clk, EBI1_FIXED_CLK, CLKFLAG_MIN |
2335 CLKFLAG_SKIP_AUTO_OFF);
2336static DEFINE_CLK_PCOM(ecodec_clk, ECODEC_CLK, CLKFLAG_SKIP_AUTO_OFF);
2337static DEFINE_CLK_PCOM(gp_clk, GP_CLK, CLKFLAG_SKIP_AUTO_OFF);
2338static DEFINE_CLK_PCOM(uart3_clk, UART3_CLK, 0);
2339static DEFINE_CLK_PCOM(usb_phy_clk, USB_PHY_CLK, CLKFLAG_MIN);
2340
2341static DEFINE_CLK_PCOM(p_grp_2d_clk, GRP_2D_CLK, CLKFLAG_SKIP_AUTO_OFF);
2342static DEFINE_CLK_PCOM(p_grp_2d_p_clk, GRP_2D_P_CLK, CLKFLAG_SKIP_AUTO_OFF);
2343static DEFINE_CLK_PCOM(p_hdmi_clk, HDMI_CLK, CLKFLAG_SKIP_AUTO_OFF);
Matt Wagantall2eedd222011-11-16 12:55:21 -08002344static DEFINE_CLK_PCOM(p_jpeg_clk, JPEG_CLK, CLKFLAG_MIN);
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07002345static DEFINE_CLK_PCOM(p_jpeg_p_clk, JPEG_P_CLK, 0);
2346static DEFINE_CLK_PCOM(p_lpa_codec_clk, LPA_CODEC_CLK, CLKFLAG_SKIP_AUTO_OFF);
2347static DEFINE_CLK_PCOM(p_lpa_core_clk, LPA_CORE_CLK, CLKFLAG_SKIP_AUTO_OFF);
2348static DEFINE_CLK_PCOM(p_lpa_p_clk, LPA_P_CLK, CLKFLAG_SKIP_AUTO_OFF);
2349static DEFINE_CLK_PCOM(p_mi2s_m_clk, MI2S_M_CLK, CLKFLAG_SKIP_AUTO_OFF);
2350static DEFINE_CLK_PCOM(p_mi2s_s_clk, MI2S_S_CLK, CLKFLAG_SKIP_AUTO_OFF);
2351static DEFINE_CLK_PCOM(p_mi2s_codec_rx_m_clk, MI2S_CODEC_RX_M_CLK,
2352 CLKFLAG_SKIP_AUTO_OFF);
2353static DEFINE_CLK_PCOM(p_mi2s_codec_rx_s_clk, MI2S_CODEC_RX_S_CLK,
2354 CLKFLAG_SKIP_AUTO_OFF);
2355static DEFINE_CLK_PCOM(p_mi2s_codec_tx_m_clk, MI2S_CODEC_TX_M_CLK,
2356 CLKFLAG_SKIP_AUTO_OFF);
2357static DEFINE_CLK_PCOM(p_mi2s_codec_tx_s_clk, MI2S_CODEC_TX_S_CLK,
2358 CLKFLAG_SKIP_AUTO_OFF);
2359static DEFINE_CLK_PCOM(p_sdac_clk, SDAC_CLK, 0);
2360static DEFINE_CLK_PCOM(p_sdac_m_clk, SDAC_M_CLK, 0);
2361static DEFINE_CLK_PCOM(p_vfe_clk, VFE_CLK, CLKFLAG_SKIP_AUTO_OFF);
2362static DEFINE_CLK_PCOM(p_vfe_camif_clk, VFE_CAMIF_CLK, CLKFLAG_SKIP_AUTO_OFF);
2363static DEFINE_CLK_PCOM(p_vfe_mdc_clk, VFE_MDC_CLK, CLKFLAG_SKIP_AUTO_OFF);
2364static DEFINE_CLK_PCOM(p_vfe_p_clk, VFE_P_CLK, 0);
2365static DEFINE_CLK_PCOM(p_grp_3d_clk, GRP_3D_CLK, CLKFLAG_SKIP_AUTO_OFF);
2366static DEFINE_CLK_PCOM(p_grp_3d_p_clk, GRP_3D_P_CLK, CLKFLAG_SKIP_AUTO_OFF);
2367static DEFINE_CLK_PCOM(p_imem_clk, IMEM_CLK, 0);
2368static DEFINE_CLK_PCOM(p_mdp_lcdc_pad_pclk_clk, MDP_LCDC_PAD_PCLK_CLK,
2369 CLKFLAG_SKIP_AUTO_OFF);
2370static DEFINE_CLK_PCOM(p_mdp_lcdc_pclk_clk, MDP_LCDC_PCLK_CLK,
2371 CLKFLAG_SKIP_AUTO_OFF);
2372static DEFINE_CLK_PCOM(p_mdp_p_clk, MDP_P_CLK, CLKFLAG_SKIP_AUTO_OFF);
2373static DEFINE_CLK_PCOM(p_mdp_vsync_clk, MDP_VSYNC_CLK, 0);
2374static DEFINE_CLK_PCOM(p_tsif_ref_clk, TSIF_REF_CLK, CLKFLAG_SKIP_AUTO_OFF);
2375static DEFINE_CLK_PCOM(p_tsif_p_clk, TSIF_P_CLK, CLKFLAG_SKIP_AUTO_OFF);
2376static DEFINE_CLK_PCOM(p_tv_dac_clk, TV_DAC_CLK, CLKFLAG_SKIP_AUTO_OFF);
2377static DEFINE_CLK_PCOM(p_tv_enc_clk, TV_ENC_CLK, CLKFLAG_SKIP_AUTO_OFF);
2378static DEFINE_CLK_PCOM(p_emdh_clk, EMDH_CLK, CLKFLAG_MIN | CLKFLAG_MAX);
2379static DEFINE_CLK_PCOM(p_emdh_p_clk, EMDH_P_CLK, 0);
2380static DEFINE_CLK_PCOM(p_i2c_clk, I2C_CLK, CLKFLAG_SKIP_AUTO_OFF);
2381static DEFINE_CLK_PCOM(p_i2c_2_clk, I2C_2_CLK, CLKFLAG_SKIP_AUTO_OFF);
2382static DEFINE_CLK_PCOM(p_mdc_clk, MDC_CLK, CLKFLAG_SKIP_AUTO_OFF);
2383static DEFINE_CLK_PCOM(p_pmdh_clk, PMDH_CLK, CLKFLAG_MIN | CLKFLAG_MAX);
2384static DEFINE_CLK_PCOM(p_pmdh_p_clk, PMDH_P_CLK, CLKFLAG_SKIP_AUTO_OFF);
2385static DEFINE_CLK_PCOM(p_sdc1_clk, SDC1_CLK, 0);
2386static DEFINE_CLK_PCOM(p_sdc1_p_clk, SDC1_P_CLK, 0);
2387static DEFINE_CLK_PCOM(p_sdc2_clk, SDC2_CLK, 0);
2388static DEFINE_CLK_PCOM(p_sdc2_p_clk, SDC2_P_CLK, 0);
2389static DEFINE_CLK_PCOM(p_sdc3_clk, SDC3_CLK, 0);
2390static DEFINE_CLK_PCOM(p_sdc3_p_clk, SDC3_P_CLK, 0);
2391static DEFINE_CLK_PCOM(p_sdc4_clk, SDC4_CLK, 0);
2392static DEFINE_CLK_PCOM(p_sdc4_p_clk, SDC4_P_CLK, 0);
2393static DEFINE_CLK_PCOM(p_uart2_clk, UART2_CLK, CLKFLAG_SKIP_AUTO_OFF);
2394static DEFINE_CLK_PCOM(p_usb_hs2_clk, USB_HS2_CLK, 0);
2395static DEFINE_CLK_PCOM(p_usb_hs2_core_clk, USB_HS2_CORE_CLK, 0);
2396static DEFINE_CLK_PCOM(p_usb_hs2_p_clk, USB_HS2_P_CLK, 0);
2397static DEFINE_CLK_PCOM(p_usb_hs3_clk, USB_HS3_CLK, 0);
2398static DEFINE_CLK_PCOM(p_usb_hs3_core_clk, USB_HS3_CORE_CLK, 0);
2399static DEFINE_CLK_PCOM(p_usb_hs3_p_clk, USB_HS3_P_CLK, 0);
2400static DEFINE_CLK_PCOM(p_qup_i2c_clk, QUP_I2C_CLK, CLKFLAG_SKIP_AUTO_OFF);
2401static DEFINE_CLK_PCOM(p_spi_clk, SPI_CLK, CLKFLAG_SKIP_AUTO_OFF);
2402static DEFINE_CLK_PCOM(p_spi_p_clk, SPI_P_CLK, CLKFLAG_SKIP_AUTO_OFF);
2403static DEFINE_CLK_PCOM(p_uart1_clk, UART1_CLK, 0);
2404static DEFINE_CLK_PCOM(p_uart1dm_clk, UART1DM_CLK, 0);
2405static DEFINE_CLK_PCOM(p_uart2dm_clk, UART2DM_CLK, CLKFLAG_SKIP_AUTO_OFF);
2406static DEFINE_CLK_PCOM(p_usb_hs_clk, USB_HS_CLK, 0);
2407static DEFINE_CLK_PCOM(p_usb_hs_core_clk, USB_HS_CORE_CLK, 0);
2408static DEFINE_CLK_PCOM(p_usb_hs_p_clk, USB_HS_P_CLK, 0);
2409static DEFINE_CLK_PCOM(p_cam_m_clk, CAM_M_CLK, CLKFLAG_SKIP_AUTO_OFF);
2410static DEFINE_CLK_PCOM(p_camif_pad_p_clk, CAMIF_PAD_P_CLK, 0);
2411static DEFINE_CLK_PCOM(p_csi0_clk, CSI0_CLK, CLKFLAG_SKIP_AUTO_OFF);
2412static DEFINE_CLK_PCOM(p_csi0_vfe_clk, CSI0_VFE_CLK, CLKFLAG_SKIP_AUTO_OFF);
2413static DEFINE_CLK_PCOM(p_csi0_p_clk, CSI0_P_CLK, CLKFLAG_SKIP_AUTO_OFF);
Matt Wagantalla12cc952011-11-08 18:14:50 -08002414static DEFINE_CLK_PCOM(p_mdp_clk, MDP_CLK, CLKFLAG_MIN);
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07002415static DEFINE_CLK_PCOM(p_mfc_clk, MFC_CLK, CLKFLAG_SKIP_AUTO_OFF);
2416static DEFINE_CLK_PCOM(p_mfc_div2_clk, MFC_DIV2_CLK, CLKFLAG_SKIP_AUTO_OFF);
2417static DEFINE_CLK_PCOM(p_mfc_p_clk, MFC_P_CLK, CLKFLAG_SKIP_AUTO_OFF);
2418static DEFINE_CLK_PCOM(p_vpe_clk, VPE_CLK, CLKFLAG_SKIP_AUTO_OFF);
2419static DEFINE_CLK_PCOM(p_adm_clk, ADM_CLK, CLKFLAG_SKIP_AUTO_OFF);
2420static DEFINE_CLK_PCOM(p_ce_clk, CE_CLK, CLKFLAG_SKIP_AUTO_OFF);
2421static DEFINE_CLK_PCOM(p_axi_rotator_clk, AXI_ROTATOR_CLK,
2422 CLKFLAG_SKIP_AUTO_OFF);
2423static DEFINE_CLK_PCOM(p_rotator_imem_clk, ROTATOR_IMEM_CLK, 0);
2424static DEFINE_CLK_PCOM(p_rotator_p_clk, ROTATOR_P_CLK, 0);
2425
Matt Wagantall35e78fc2012-04-05 14:18:44 -07002426static DEFINE_CLK_VOTER(ebi_dtv_clk, &ebi1_fixed_clk.c, 0);
2427static DEFINE_CLK_VOTER(ebi_grp_3d_clk, &ebi1_fixed_clk.c, 0);
2428static DEFINE_CLK_VOTER(ebi_grp_2d_clk, &ebi1_fixed_clk.c, 0);
2429static DEFINE_CLK_VOTER(ebi_lcdc_clk, &ebi1_fixed_clk.c, 0);
2430static DEFINE_CLK_VOTER(ebi_mddi_clk, &ebi1_fixed_clk.c, 0);
2431static DEFINE_CLK_VOTER(ebi_tv_clk, &ebi1_fixed_clk.c, 0);
2432static DEFINE_CLK_VOTER(ebi_vcd_clk, &ebi1_fixed_clk.c, 0);
2433static DEFINE_CLK_VOTER(ebi_vfe_clk, &ebi1_fixed_clk.c, 0);
2434static DEFINE_CLK_VOTER(ebi_adm_clk, &ebi1_fixed_clk.c, 0);
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07002435
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07002436#ifdef CONFIG_DEBUG_FS
2437
2438#define CLK_TEST_2(s) (s)
2439#define CLK_TEST_HS(s) (0x4000 | ((s) << 8))
2440#define CLK_TEST_LS(s) (0x4D40 | (s))
2441
2442struct measure_sel {
2443 u32 test_vector;
Matt Wagantallf82f2942012-01-27 13:56:13 -08002444 struct clk *c;
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07002445};
2446
2447static struct measure_sel measure_mux[] = {
2448 { CLK_TEST_2(0x03), &emdh_p_clk.c },
2449 { CLK_TEST_2(0x04), &pmdh_p_clk.c },
2450 { CLK_TEST_2(0x06), &mdp_p_clk.c },
2451 { CLK_TEST_2(0x07), &lpa_p_clk.c },
2452 { CLK_TEST_2(0x08), &usb_hs2_p_clk.c },
2453 { CLK_TEST_2(0x09), &spi_clk.c },
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07002454 { CLK_TEST_2(0x0B), &i2c_2_clk.c },
2455 { CLK_TEST_2(0x0D), &mi2s_m_clk.c },
2456 { CLK_TEST_2(0x0E), &lpa_core_clk.c },
2457 { CLK_TEST_2(0x0F), &lpa_codec_clk.c },
2458 { CLK_TEST_2(0x10), &usb_hs3_p_clk.c },
2459 { CLK_TEST_2(0x11), &adm_p_clk.c },
2460 { CLK_TEST_2(0x13), &hdmi_clk.c },
2461 { CLK_TEST_2(0x14), &usb_hs_core_clk.c },
2462 { CLK_TEST_2(0x15), &usb_hs2_core_clk.c },
2463 { CLK_TEST_2(0x16), &usb_hs3_core_clk.c },
2464 { CLK_TEST_2(0x17), &mi2s_codec_tx_s_clk.c },
2465 { CLK_TEST_2(0x18), &spi_p_clk.c },
2466 { CLK_TEST_2(0x1A), &camif_pad_p_clk.c },
2467 { CLK_TEST_2(0x1C), &qup_i2c_clk.c },
2468 { CLK_TEST_2(0x1F), &mfc_div2_clk.c },
2469 { CLK_TEST_2(0x38), &mfc_clk.c },
2470
2471 { CLK_TEST_HS(0x00), &adm_clk.c },
2472 { CLK_TEST_HS(0x01), &mdp_lcdc_pad_pclk_clk.c },
2473 { CLK_TEST_HS(0x02), &mdp_lcdc_pclk_clk.c },
2474 { CLK_TEST_HS(0x03), &axi_rotator_clk.c },
2475 { CLK_TEST_HS(0x07), &axi_li_vg_clk.c },
2476 { CLK_TEST_HS(0x09), &axi_li_apps_clk.c },
2477 { CLK_TEST_HS(0x0E), &axi_li_jpeg_clk.c },
2478 { CLK_TEST_HS(0x0F), &emdh_clk.c },
2479 { CLK_TEST_HS(0x14), &mdp_clk.c },
2480 { CLK_TEST_HS(0x15), &pmdh_clk.c },
2481 { CLK_TEST_HS(0x19), &axi_grp_2d_clk.c },
2482 { CLK_TEST_HS(0x1A), &axi_li_grp_clk.c },
2483 { CLK_TEST_HS(0x1B), &axi_li_vfe_clk.c },
2484 { CLK_TEST_HS(0x1C), &grp_2d_clk.c },
2485 { CLK_TEST_HS(0x1E), &grp_3d_clk.c },
2486 { CLK_TEST_HS(0x1F), &imem_clk.c },
2487 { CLK_TEST_HS(0x20), &jpeg_clk.c },
2488 { CLK_TEST_HS(0x24), &axi_li_adsp_a_clk.c },
2489 { CLK_TEST_HS(0x26), &rotator_imem_clk.c },
2490 { CLK_TEST_HS(0x27), &axi_vpe_clk.c },
2491 { CLK_TEST_HS(0x2A), &axi_mfc_clk.c },
2492 { CLK_TEST_HS(0x2B), &axi_mdp_clk.c },
2493 { CLK_TEST_HS(0x2C), &vpe_clk.c },
2494 { CLK_TEST_HS(0x30), &vfe_camif_clk.c },
2495 { CLK_TEST_HS(0x31), &csi0_clk.c },
2496 { CLK_TEST_HS(0x32), &csi0_vfe_clk.c },
2497 { CLK_TEST_HS(0x33), &csi0_p_clk.c },
2498
2499 { CLK_TEST_LS(0x03), &ce_clk.c },
2500 { CLK_TEST_LS(0x04), &cam_m_clk.c },
2501 { CLK_TEST_LS(0x0C), &grp_2d_p_clk.c },
2502 { CLK_TEST_LS(0x0D), &i2c_clk.c },
2503 { CLK_TEST_LS(0x0E), &mi2s_codec_rx_m_clk.c },
2504 { CLK_TEST_LS(0x0F), &mi2s_codec_rx_s_clk.c },
2505 { CLK_TEST_LS(0x10), &mi2s_codec_tx_m_clk.c },
2506 { CLK_TEST_LS(0x13), &mdp_vsync_clk.c },
2507 { CLK_TEST_LS(0x15), &vfe_p_clk.c },
2508 { CLK_TEST_LS(0x16), &mdc_clk.c },
2509 { CLK_TEST_LS(0x17), &vfe_mdc_clk.c },
2510 { CLK_TEST_LS(0x18), &usb_hs_p_clk.c },
2511 { CLK_TEST_LS(0x1C), &uart1dm_p_clk.c },
2512 { CLK_TEST_LS(0x1E), &jpeg_p_clk.c },
2513 { CLK_TEST_LS(0x20), &sdac_clk.c },
2514 { CLK_TEST_LS(0x21), &sdc1_p_clk.c },
2515 { CLK_TEST_LS(0x22), &sdc1_clk.c },
2516 { CLK_TEST_LS(0x23), &sdc2_p_clk.c },
2517 { CLK_TEST_LS(0x24), &sdc2_clk.c },
2518 { CLK_TEST_LS(0x25), &tsif_p_clk.c },
2519 { CLK_TEST_LS(0x26), &sdac_m_clk.c },
2520 { CLK_TEST_LS(0x27), &grp_3d_p_clk.c },
2521 { CLK_TEST_LS(0x2A), &tsif_ref_clk.c },
2522 { CLK_TEST_LS(0x2B), &tv_enc_clk.c },
2523 { CLK_TEST_LS(0x2C), &tv_dac_clk.c },
2524 { CLK_TEST_LS(0x2D), &rotator_p_clk.c },
2525 { CLK_TEST_LS(0x2F), &uart1_clk.c },
2526 { CLK_TEST_LS(0x30), &uart1dm_clk.c },
2527 { CLK_TEST_LS(0x31), &uart2_clk.c },
2528 { CLK_TEST_LS(0x33), &usb_hs2_clk.c },
2529 { CLK_TEST_LS(0x34), &usb_hs3_clk.c },
2530 { CLK_TEST_LS(0x35), &mfc_p_clk.c },
2531 { CLK_TEST_LS(0x36), &vfe_clk.c },
2532 { CLK_TEST_LS(0x39), &sdc3_p_clk.c },
2533 { CLK_TEST_LS(0x3A), &sdc3_clk.c },
2534 { CLK_TEST_LS(0x3B), &sdc4_p_clk.c },
2535 { CLK_TEST_LS(0x3C), &sdc4_clk.c },
2536 { CLK_TEST_LS(0x3D), &uart2dm_clk.c },
2537 { CLK_TEST_LS(0x3E), &uart2dm_p_clk.c },
2538 { CLK_TEST_LS(0x3F), &usb_hs_clk.c },
2539};
2540
Matt Wagantallf82f2942012-01-27 13:56:13 -08002541static struct measure_sel *find_measure_sel(struct clk *c)
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07002542{
2543 int i;
2544
2545 for (i = 0; i < ARRAY_SIZE(measure_mux); i++)
Matt Wagantallf82f2942012-01-27 13:56:13 -08002546 if (measure_mux[i].c == c)
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07002547 return &measure_mux[i];
2548 return NULL;
2549}
2550
Matt Wagantallf82f2942012-01-27 13:56:13 -08002551static int measure_clk_set_parent(struct clk *c, struct clk *parent)
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07002552{
2553 struct measure_sel *p;
2554 unsigned long flags;
2555
2556 if (!parent)
2557 return -EINVAL;
2558
2559 p = find_measure_sel(parent);
2560 if (!p)
2561 return -EINVAL;
2562
2563 spin_lock_irqsave(&local_clock_reg_lock, flags);
2564
2565 /* Program test vector. */
2566 if (p->test_vector <= 0xFF) {
2567 /* Select CLK_TEST_2 */
2568 writel_relaxed(0x4D40, CLK_TEST_BASE_REG);
2569 writel_relaxed(p->test_vector, CLK_TEST_2_BASE_REG);
2570 } else
2571 writel_relaxed(p->test_vector, CLK_TEST_BASE_REG);
2572
2573 spin_unlock_irqrestore(&local_clock_reg_lock, flags);
2574
2575 return 0;
2576}
2577
2578/* Sample clock for 'tcxo4_ticks' reference clock ticks. */
Matt Wagantall9de3bfb2011-11-03 20:13:12 -07002579static unsigned long run_measurement(unsigned tcxo4_ticks)
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07002580{
2581 /* TCXO4_CNT_EN and RINGOSC_CNT_EN register values. */
2582 u32 reg_val_enable = readl_relaxed(MISC_CLK_CTL_BASE_REG) | 0x3;
2583 u32 reg_val_disable = reg_val_enable & ~0x3;
2584
2585 /* Stop counters and set the TCXO4 counter start value. */
2586 writel_relaxed(reg_val_disable, MISC_CLK_CTL_BASE_REG);
2587 writel_relaxed(tcxo4_ticks, TCXO_CNT_BASE_REG);
2588
2589 /* Run measurement and wait for completion. */
2590 writel_relaxed(reg_val_enable, MISC_CLK_CTL_BASE_REG);
2591 while (readl_relaxed(TCXO_CNT_DONE_BASE_REG) == 0)
2592 cpu_relax();
2593
2594 /* Stop counters. */
2595 writel_relaxed(reg_val_disable, MISC_CLK_CTL_BASE_REG);
2596
2597 return readl_relaxed(RINGOSC_CNT_BASE_REG);
2598}
2599
2600/* Perform a hardware rate measurement for a given clock.
2601 FOR DEBUG USE ONLY: Measurements take ~15 ms! */
Matt Wagantallf82f2942012-01-27 13:56:13 -08002602static unsigned long measure_clk_get_rate(struct clk *c)
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07002603{
2604 unsigned long flags;
2605 u32 regval, prph_web_reg_old;
2606 u64 raw_count_short, raw_count_full;
2607 unsigned ret;
2608
Stephen Boyde334aeb2012-01-24 12:17:29 -08002609 clk_prepare_enable(&tcxo_clk.c);
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07002610
2611 spin_lock_irqsave(&local_clock_reg_lock, flags);
2612
2613 /* Enable TCXO4 clock branch and root. */
2614 prph_web_reg_old = readl_relaxed(PRPH_WEB_NS_BASE_REG);
2615 regval = prph_web_reg_old | BIT(9) | BIT(11);
2616 writel_relaxed(regval, PRPH_WEB_NS_BASE_REG);
2617
2618 /*
2619 * The ring oscillator counter will not reset if the measured clock
2620 * is not running. To detect this, run a short measurement before
2621 * the full measurement. If the raw results of the two are the same
2622 * then the clock must be off.
2623 */
2624
2625 /* Run a short measurement. (~1 ms) */
2626 raw_count_short = run_measurement(0x1000);
2627 /* Run a full measurement. (~14 ms) */
2628 raw_count_full = run_measurement(0x10000);
2629
2630 /* Disable TCXO4 clock branch and root. */
2631 writel_relaxed(prph_web_reg_old, PRPH_WEB_NS_BASE_REG);
2632
2633 spin_unlock_irqrestore(&local_clock_reg_lock, flags);
2634
2635 /* Return 0 if the clock is off. */
2636 if (raw_count_full == raw_count_short)
2637 ret = 0;
2638 else {
2639 /* Compute rate in Hz. */
2640 raw_count_full = ((raw_count_full * 10) + 15) * 4800000;
2641 do_div(raw_count_full, ((0x10000 * 10) + 35));
2642 ret = raw_count_full;
2643 }
2644
Stephen Boyde334aeb2012-01-24 12:17:29 -08002645 clk_disable_unprepare(&tcxo_clk.c);
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07002646
2647 return ret;
2648}
2649#else /* !CONFIG_DEBUG_FS */
Matt Wagantallf82f2942012-01-27 13:56:13 -08002650static int measure_clk_set_parent(struct clk *c, struct clk *parent)
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07002651{
2652 return -EINVAL;
2653}
2654
Matt Wagantallf82f2942012-01-27 13:56:13 -08002655static unsigned long measure_clk_get_rate(struct clk *c)
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07002656{
2657 return 0;
2658}
2659#endif /* CONFIG_DEBUG_FS */
2660
Matt Wagantallae053222012-05-14 19:42:07 -07002661static struct clk_ops clk_ops_measure = {
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07002662 .set_parent = measure_clk_set_parent,
2663 .get_rate = measure_clk_get_rate,
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07002664};
2665
2666static struct clk measure_clk = {
2667 .dbg_name = "measure_clk",
Matt Wagantallae053222012-05-14 19:42:07 -07002668 .ops = &clk_ops_measure,
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07002669 CLK_INIT(measure_clk),
2670};
2671
2672/* Implementation for clk_set_flags(). */
Matt Wagantallf82f2942012-01-27 13:56:13 -08002673int soc_clk_set_flags(struct clk *c, unsigned clk_flags)
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07002674{
2675 uint32_t regval, ret = 0;
2676 unsigned long flags;
2677
2678 spin_lock_irqsave(&local_clock_reg_lock, flags);
2679
Matt Wagantallf82f2942012-01-27 13:56:13 -08002680 if (c == &vfe_clk.c) {
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07002681 regval = readl_relaxed(CAM_VFE_NS_REG);
2682 /* Flag values chosen for backward compatibility
2683 * with proc_comm remote clock control. */
2684 if (clk_flags == 0x00000100) {
2685 /* Select external source. */
2686 regval |= BIT(14);
2687 } else if (clk_flags == 0x00000200) {
2688 /* Select internal source. */
2689 regval &= ~BIT(14);
2690 } else
2691 ret = -EINVAL;
2692
2693 writel_relaxed(regval, CAM_VFE_NS_REG);
2694 /* Make sure write is issued before returning. */
2695 mb();
2696 } else
2697 ret = -EPERM;
2698
2699 spin_unlock_irqrestore(&local_clock_reg_lock, flags);
2700
2701 return ret;
2702}
2703
Matt Wagantallf82f2942012-01-27 13:56:13 -08002704static int msm7x30_clk_reset(struct clk *c, enum clk_reset_action action)
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07002705{
2706 /* reset_mask is actually a proc_comm id */
Matt Wagantallf82f2942012-01-27 13:56:13 -08002707 return pc_clk_reset(to_rcg_clk(c)->b.reset_mask, action);
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07002708}
2709
Matt Wagantallf82f2942012-01-27 13:56:13 -08002710static int soc_branch_clk_reset(struct clk *c, enum clk_reset_action action)
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07002711{
Matt Wagantallf82f2942012-01-27 13:56:13 -08002712 return pc_clk_reset(to_branch_clk(c)->b.reset_mask, action);
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07002713}
2714
2715/*
2716 * Clock ownership detection code
2717 */
2718
2719enum {
2720 SH2_OWN_GLBL,
2721 SH2_OWN_APPS1,
2722 SH2_OWN_APPS2,
2723 SH2_OWN_ROW1,
2724 SH2_OWN_ROW2,
2725 SH2_OWN_APPS3,
2726 NUM_OWNERSHIP
2727};
2728static __initdata uint32_t ownership_regs[NUM_OWNERSHIP];
2729
2730static void __init cache_ownership(void)
2731{
2732 ownership_regs[SH2_OWN_GLBL] = readl_relaxed(SH2_OWN_GLBL_BASE_REG);
2733 ownership_regs[SH2_OWN_APPS1] = readl_relaxed(SH2_OWN_APPS1_BASE_REG);
2734 ownership_regs[SH2_OWN_APPS2] = readl_relaxed(SH2_OWN_APPS2_BASE_REG);
2735 ownership_regs[SH2_OWN_ROW1] = readl_relaxed(SH2_OWN_ROW1_BASE_REG);
2736 ownership_regs[SH2_OWN_ROW2] = readl_relaxed(SH2_OWN_ROW2_BASE_REG);
2737 ownership_regs[SH2_OWN_APPS3] = readl_relaxed(SH2_OWN_APPS3_BASE_REG);
2738}
2739
2740static void __init print_ownership(void)
2741{
2742 pr_info("Clock ownership\n");
2743 pr_info(" GLBL : %08x\n", ownership_regs[SH2_OWN_GLBL]);
2744 pr_info(" APPS : %08x %08x %08x\n", ownership_regs[SH2_OWN_APPS1],
2745 ownership_regs[SH2_OWN_APPS2], ownership_regs[SH2_OWN_APPS3]);
2746 pr_info(" ROW : %08x %08x\n", ownership_regs[SH2_OWN_ROW1],
2747 ownership_regs[SH2_OWN_ROW2]);
2748}
2749
2750#define O(x) (&ownership_regs[(SH2_OWN_##x)])
2751#define OWN(r, b, name, clk, dev) \
2752 { \
2753 .lk = CLK_LOOKUP(name, clk.c, dev), \
2754 .remote = &p_##clk.c, \
2755 .reg = O(r), \
2756 .bit = BIT(b), \
2757 }
2758
2759static struct clk_local_ownership {
2760 struct clk_lookup lk;
2761 const u32 *reg;
2762 const u32 bit;
2763 struct clk *remote;
2764} ownership_map[] __initdata = {
2765 /* Sources */
2766 { CLK_LOOKUP("pll1_clk", pll1_clk.c, "acpu") },
2767 { CLK_LOOKUP("pll2_clk", pll2_clk.c, "acpu") },
2768 { CLK_LOOKUP("pll3_clk", pll3_clk.c, "acpu") },
2769 { CLK_LOOKUP("measure", measure_clk, "debug") },
2770
2771 /* PCOM */
2772 { CLK_LOOKUP("adsp_clk", adsp_clk.c, NULL) },
2773 { CLK_LOOKUP("codec_ssbi_clk", codec_ssbi_clk.c, NULL) },
2774 { CLK_LOOKUP("ebi1_clk", ebi1_clk.c, NULL) },
2775 { CLK_LOOKUP("ebi1_fixed_clk", ebi1_fixed_clk.c, NULL) },
2776 { CLK_LOOKUP("ecodec_clk", ecodec_clk.c, NULL) },
Matt Wagantallc00f95d2012-01-05 14:22:45 -08002777 { CLK_LOOKUP("core_clk", gp_clk.c, "") },
Matt Wagantalle2522372011-08-17 14:52:21 -07002778 { CLK_LOOKUP("core_clk", uart3_clk.c, "msm_serial.2") },
Manu Gautam5143b252012-01-05 19:25:23 -08002779 { CLK_LOOKUP("phy_clk", usb_phy_clk.c, "msm_otg") },
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07002780
2781 /* Voters */
Ravishangar Kalyanam1b064f52012-03-15 18:17:54 -07002782 { CLK_LOOKUP("mem_clk", ebi_dtv_clk.c, "dtv.0") },
Matt Wagantall9dc01632011-08-17 18:55:04 -07002783 { CLK_LOOKUP("bus_clk", ebi_grp_2d_clk.c, "kgsl-2d0.0") },
2784 { CLK_LOOKUP("bus_clk", ebi_grp_3d_clk.c, "kgsl-3d0.0") },
Ravishangar Kalyanam1b064f52012-03-15 18:17:54 -07002785 { CLK_LOOKUP("mem_clk", ebi_lcdc_clk.c, "lcdc.0") },
2786 { CLK_LOOKUP("mem_clk", ebi_mddi_clk.c, "mddi.0") },
2787 { CLK_LOOKUP("mem_clk", ebi_tv_clk.c, "tvenc.0") },
Matt Wagantall3f7660b2011-08-17 21:25:13 -07002788 { CLK_LOOKUP("mem_clk", ebi_vcd_clk.c, "msm_vidc.0") },
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07002789 { CLK_LOOKUP("ebi1_vfe_clk", ebi_vfe_clk.c, NULL) },
Matt Wagantalle1a86062011-08-18 17:46:10 -07002790 { CLK_LOOKUP("mem_clk", ebi_adm_clk.c, "msm_dmov") },
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07002791
2792 /*
2793 * This is a many-to-one mapping because we don't know how the remote
2794 * clock code has decided to handle the dependencies between clocks for
2795 * a particular hardware block. We determine the ownership for all the
2796 * clocks going into a block by checking the ownership bit of one
2797 * register (usually the ns register).
2798 */
Matt Wagantall9dc01632011-08-17 18:55:04 -07002799 OWN(APPS1, 6, "core_clk", grp_2d_clk, "kgsl-2d0.0"),
Matt Wagantall49722712011-08-17 18:50:53 -07002800 OWN(APPS1, 6, "core_clk", grp_2d_clk, "footswitch-pcom.0"),
Matt Wagantall9dc01632011-08-17 18:55:04 -07002801 OWN(APPS1, 6, "iface_clk", grp_2d_p_clk, "kgsl-2d0.0"),
Matt Wagantall49722712011-08-17 18:50:53 -07002802 OWN(APPS1, 6, "iface_clk", grp_2d_p_clk, "footswitch-pcom.0"),
Ravishangar Kalyanam1b064f52012-03-15 18:17:54 -07002803 OWN(APPS1, 31, "hdmi_clk", hdmi_clk, "dtv.0"),
Matt Wagantallf45cd362012-05-03 21:09:44 -07002804 OWN(APPS1, 0, "core_clk", jpeg_clk, "msm_gemini.0"),
2805 OWN(APPS1, 0, "iface_clk", jpeg_p_clk, "msm_gemini.0"),
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07002806 OWN(APPS1, 23, "lpa_codec_clk", lpa_codec_clk, NULL),
2807 OWN(APPS1, 23, "lpa_core_clk", lpa_core_clk, NULL),
2808 OWN(APPS1, 23, "lpa_pclk", lpa_p_clk, NULL),
2809 OWN(APPS1, 28, "mi2s_m_clk", mi2s_m_clk, NULL),
2810 OWN(APPS1, 28, "mi2s_s_clk", mi2s_s_clk, NULL),
2811 OWN(APPS1, 12, "mi2s_codec_rx_m_clk", mi2s_codec_rx_m_clk, NULL),
2812 OWN(APPS1, 12, "mi2s_codec_rx_s_clk", mi2s_codec_rx_s_clk, NULL),
2813 OWN(APPS1, 14, "mi2s_codec_tx_m_clk", mi2s_codec_tx_m_clk, NULL),
2814 OWN(APPS1, 14, "mi2s_codec_tx_s_clk", mi2s_codec_tx_s_clk, NULL),
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07002815 OWN(APPS1, 26, "sdac_clk", sdac_clk, NULL),
2816 OWN(APPS1, 26, "sdac_m_clk", sdac_m_clk, NULL),
2817 OWN(APPS1, 8, "vfe_clk", vfe_clk, NULL),
Matt Wagantall49722712011-08-17 18:50:53 -07002818 OWN(APPS1, 8, "core_clk", vfe_clk, "footswitch-pcom.8"),
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07002819 OWN(APPS1, 8, "vfe_camif_clk", vfe_camif_clk, NULL),
2820 OWN(APPS1, 8, "vfe_mdc_clk", vfe_mdc_clk, NULL),
2821 OWN(APPS1, 8, "vfe_pclk", vfe_p_clk, NULL),
Matt Wagantall49722712011-08-17 18:50:53 -07002822 OWN(APPS1, 8, "iface_clk", vfe_p_clk, "footswitch-pcom.8"),
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07002823
Matt Wagantall9dc01632011-08-17 18:55:04 -07002824 OWN(APPS2, 0, "core_clk", grp_3d_clk, "kgsl-3d0.0"),
Matt Wagantall49722712011-08-17 18:50:53 -07002825 OWN(APPS2, 0, "core_clk", grp_3d_clk, "footswitch-pcom.2"),
Matt Wagantall9dc01632011-08-17 18:55:04 -07002826 OWN(APPS2, 0, "iface_clk", grp_3d_p_clk, "kgsl-3d0.0"),
Matt Wagantall49722712011-08-17 18:50:53 -07002827 OWN(APPS2, 0, "iface_clk", grp_3d_p_clk, "footswitch-pcom.2"),
Matt Wagantall9dc01632011-08-17 18:55:04 -07002828 { CLK_LOOKUP("src_clk", grp_3d_src_clk.c, "kgsl-3d0.0"),
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07002829 O(APPS2), BIT(0), &p_grp_3d_clk.c },
Matt Wagantall49722712011-08-17 18:50:53 -07002830 { CLK_LOOKUP("src_clk", grp_3d_src_clk.c, "footswitch-pcom.2"),
2831 O(APPS2), BIT(0), &p_grp_3d_clk.c },
Matt Wagantall9dc01632011-08-17 18:55:04 -07002832 OWN(APPS2, 0, "mem_clk", imem_clk, "kgsl-3d0.0"),
Ravishangar Kalyanam1b064f52012-03-15 18:17:54 -07002833 OWN(APPS2, 4, "lcdc_clk", mdp_lcdc_pad_pclk_clk, "lcdc.0"),
2834 OWN(APPS2, 4, "mdp_clk", mdp_lcdc_pclk_clk, "lcdc.0"),
2835 OWN(APPS2, 4, "iface_clk", mdp_p_clk, "mdp.0"),
Matt Wagantall49722712011-08-17 18:50:53 -07002836 OWN(APPS2, 4, "iface_clk", mdp_p_clk, "footswitch-pcom.4"),
Ravishangar Kalyanam1b064f52012-03-15 18:17:54 -07002837 OWN(APPS2, 28, "vsync_clk", mdp_vsync_clk, "mdp.0"),
Matt Wagantall640e5fd2011-08-17 16:08:53 -07002838 OWN(APPS2, 5, "ref_clk", tsif_ref_clk, "msm_tsif.0"),
2839 OWN(APPS2, 5, "iface_clk", tsif_p_clk, "msm_tsif.0"),
Ravishangar Kalyanam1b064f52012-03-15 18:17:54 -07002840 { CLK_LOOKUP("src_clk", tv_clk.c, "dtv.0"),
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07002841 O(APPS2), BIT(2), &p_tv_enc_clk.c },
2842 OWN(APPS2, 2, "tv_dac_clk", tv_dac_clk, NULL),
2843 OWN(APPS2, 2, "tv_enc_clk", tv_enc_clk, NULL),
2844
Ravishangar Kalyanam1b064f52012-03-15 18:17:54 -07002845 OWN(ROW1, 7, "core_clk", emdh_clk, "msm_mddi.1"),
2846 OWN(ROW1, 7, "iface_clk", emdh_p_clk, "msm_mddi.1"),
Matt Wagantallac294852011-08-17 15:44:58 -07002847 OWN(ROW1, 11, "core_clk", i2c_clk, "msm_i2c.0"),
2848 OWN(ROW1, 12, "core_clk", i2c_2_clk, "msm_i2c.2"),
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07002849 OWN(ROW1, 17, "mdc_clk", mdc_clk, NULL),
Ravishangar Kalyanam1b064f52012-03-15 18:17:54 -07002850 OWN(ROW1, 19, "core_clk", pmdh_clk, "mddi.0"),
2851 OWN(ROW1, 19, "iface_clk", pmdh_p_clk, "mddi.0"),
Matt Wagantall37ce3842011-08-17 16:00:36 -07002852 OWN(ROW1, 23, "core_clk", sdc1_clk, "msm_sdcc.1"),
2853 OWN(ROW1, 23, "iface_clk", sdc1_p_clk, "msm_sdcc.1"),
2854 OWN(ROW1, 25, "core_clk", sdc2_clk, "msm_sdcc.2"),
2855 OWN(ROW1, 25, "iface_clk", sdc2_p_clk, "msm_sdcc.2"),
2856 OWN(ROW1, 27, "core_clk", sdc3_clk, "msm_sdcc.3"),
2857 OWN(ROW1, 27, "iface_clk", sdc3_p_clk, "msm_sdcc.3"),
2858 OWN(ROW1, 29, "core_clk", sdc4_clk, "msm_sdcc.4"),
2859 OWN(ROW1, 29, "iface_clk", sdc4_p_clk, "msm_sdcc.4"),
Matt Wagantalle2522372011-08-17 14:52:21 -07002860 OWN(ROW1, 0, "core_clk", uart2_clk, "msm_serial.1"),
Manu Gautam5143b252012-01-05 19:25:23 -08002861 OWN(ROW1, 2, "alt_core_clk", usb_hs2_clk, "msm_hsusb_host.0"),
2862 OWN(ROW1, 2, "core_clk", usb_hs2_core_clk, "msm_hsusb_host.0"),
2863 OWN(ROW1, 2, "iface_clk", usb_hs2_p_clk, "msm_hsusb_host.0"),
Matt Wagantallc00f95d2012-01-05 14:22:45 -08002864 OWN(ROW1, 4, "alt_core_clk", usb_hs3_clk, ""),
2865 OWN(ROW1, 4, "core_clk", usb_hs3_core_clk, ""),
2866 OWN(ROW1, 4, "iface_clk", usb_hs3_p_clk, ""),
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07002867
Matt Wagantallac294852011-08-17 15:44:58 -07002868 OWN(ROW2, 3, "core_clk", qup_i2c_clk, "qup_i2c.4"),
2869 OWN(ROW2, 1, "core_clk", spi_clk, "spi_qsd.0"),
2870 OWN(ROW2, 1, "iface_clk", spi_p_clk, "spi_qsd.0"),
Matt Wagantalle2522372011-08-17 14:52:21 -07002871 OWN(ROW2, 9, "core_clk", uart1_clk, "msm_serial.0"),
2872 OWN(ROW2, 6, "core_clk", uart1dm_clk, "msm_serial_hs.0"),
2873 OWN(ROW2, 8, "core_clk", uart2dm_clk, "msm_serial_hs.1"),
Manu Gautam5143b252012-01-05 19:25:23 -08002874 OWN(ROW2, 11, "alt_core_clk", usb_hs_clk, "msm_otg"),
2875 OWN(ROW2, 11, "core_clk", usb_hs_core_clk, "msm_otg"),
2876 OWN(ROW2, 11, "iface_clk", usb_hs_p_clk, "msm_otg"),
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07002877
2878 OWN(APPS3, 6, "cam_m_clk", cam_m_clk, NULL),
Kiran Kumar H N305c53b2012-03-24 14:14:13 -07002879 OWN(APPS3, 6, "cam_clk", cam_m_clk, "4-0020"),
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07002880 OWN(APPS3, 6, "camif_pad_pclk", camif_pad_p_clk, NULL),
Matt Wagantallac294852011-08-17 15:44:58 -07002881 OWN(APPS3, 6, "iface_clk", camif_pad_p_clk, "qup_i2c.4"),
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07002882 OWN(APPS3, 11, "csi_clk", csi0_clk, NULL),
2883 OWN(APPS3, 11, "csi_vfe_clk", csi0_vfe_clk, NULL),
2884 OWN(APPS3, 11, "csi_pclk", csi0_p_clk, NULL),
Ravishangar Kalyanam1b064f52012-03-15 18:17:54 -07002885 OWN(APPS3, 0, "core_clk", mdp_clk, "mdp.0"),
Matt Wagantall49722712011-08-17 18:50:53 -07002886 OWN(APPS3, 0, "core_clk", mdp_clk, "footswitch-pcom.4"),
Matt Wagantall3f7660b2011-08-17 21:25:13 -07002887 OWN(APPS3, 2, "core_clk", mfc_clk, "msm_vidc.0"),
Matt Wagantall49722712011-08-17 18:50:53 -07002888 OWN(APPS3, 2, "core_clk", mfc_clk, "footswitch-pcom.5"),
Matt Wagantall3f7660b2011-08-17 21:25:13 -07002889 OWN(APPS3, 2, "core_div2_clk", mfc_div2_clk, "msm_vidc.0"),
2890 OWN(APPS3, 2, "iface_clk", mfc_p_clk, "msm_vidc.0"),
Matt Wagantall49722712011-08-17 18:50:53 -07002891 OWN(APPS3, 2, "iface_clk", mfc_p_clk, "footswitch-pcom.5"),
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07002892 OWN(APPS3, 4, "vpe_clk", vpe_clk, NULL),
Matt Wagantall49722712011-08-17 18:50:53 -07002893 OWN(APPS3, 4, "core_clk", vpe_clk, "footswitch-pcom.9"),
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07002894
Matt Wagantalle1a86062011-08-18 17:46:10 -07002895 OWN(GLBL, 8, "core_clk", adm_clk, "msm_dmov"),
2896 { CLK_LOOKUP("iface_clk", adm_p_clk.c, "msm_dmov"),
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07002897 O(GLBL), BIT(13), &dummy_clk },
Matt Wagantallc4b3a4d2011-08-17 16:58:39 -07002898 OWN(GLBL, 8, "core_clk", ce_clk, "qce.0"),
Matt Wagantalle0b11452011-09-13 17:25:33 -07002899 OWN(GLBL, 8, "core_clk", ce_clk, "crypto.0"),
Matt Wagantallbb90da92011-10-25 15:07:52 -07002900 OWN(GLBL, 13, "core_clk", axi_rotator_clk, "msm_rotator.0"),
Matt Wagantall49722712011-08-17 18:50:53 -07002901 OWN(GLBL, 13, "core_clk", axi_rotator_clk, "footswitch-pcom.6"),
Matt Wagantallbb90da92011-10-25 15:07:52 -07002902 OWN(GLBL, 13, "mem_clk", rotator_imem_clk, "msm_rotator.0"),
2903 OWN(GLBL, 13, "iface_clk", rotator_p_clk, "msm_rotator.0"),
Matt Wagantall49722712011-08-17 18:50:53 -07002904 OWN(GLBL, 13, "iface_clk", rotator_p_clk, "footswitch-pcom.6"),
Matt Wagantalle2522372011-08-17 14:52:21 -07002905 { CLK_LOOKUP("iface_clk", uart1dm_p_clk.c, "msm_serial_hs.0"),
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07002906 O(GLBL), BIT(8), &dummy_clk },
Matt Wagantalle2522372011-08-17 14:52:21 -07002907 { CLK_LOOKUP("iface_clk", uart2dm_p_clk.c, "msm_serial_hs.1"),
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07002908 O(GLBL), BIT(8), &dummy_clk },
2909};
2910
2911static struct clk_lookup msm_clocks_7x30[ARRAY_SIZE(ownership_map)];
2912
2913static void __init set_clock_ownership(void)
2914{
2915 unsigned i;
2916 struct clk_lookup *lk;
2917
2918 for (i = 0; i < ARRAY_SIZE(ownership_map); i++) {
2919 const u32 *reg = ownership_map[i].reg;
2920 u32 bit = ownership_map[i].bit;
2921 struct clk *remote = ownership_map[i].remote;
2922
2923 lk = &ownership_map[i].lk;
2924 memcpy(&msm_clocks_7x30[i], lk, sizeof(*lk));
2925
2926 if (reg && !(*reg & bit))
2927 msm_clocks_7x30[i].clk = remote;
2928 }
2929}
2930
2931/*
2932 * Miscellaneous clock register initializations
2933 */
2934static const struct reg_init {
2935 const void __iomem *reg;
2936 uint32_t mask;
2937 uint32_t val;
2938} ri_list[] __initconst = {
2939 /* Enable UMDX_P clock. Known to causes issues, so never turn off. */
2940 {GLBL_CLK_ENA_2_SC_REG, BIT(2), BIT(2)},
2941
2942 /* Disable all the child clocks of USB_HS_SRC. */
2943 { USBH_NS_REG, BIT(13) | BIT(9), 0 },
2944 { USBH2_NS_REG, BIT(9) | BIT(4), 0 },
2945 { USBH3_NS_REG, BIT(9) | BIT(4), 0 },
2946
2947 {EMDH_NS_REG, BM(18, 17) , BVAL(18, 17, 0x3)}, /* RX div = div-4. */
2948 {PMDH_NS_REG, BM(18, 17), BVAL(18, 17, 0x3)}, /* RX div = div-4. */
2949 /* MI2S_CODEC_RX_S src = MI2S_CODEC_RX_M. */
2950 {MI2S_RX_NS_REG, BIT(14), 0x0},
2951 /* MI2S_CODEC_TX_S src = MI2S_CODEC_TX_M. */
2952 {MI2S_TX_NS_REG, BIT(14), 0x0},
2953 {MI2S_NS_REG, BIT(14), 0x0}, /* MI2S_S src = MI2S_M. */
2954 /* Allow DSP to decide the LPA CORE src. */
2955 {LPA_CORE_CLK_MA0_REG, BIT(0), BIT(0)},
2956 {LPA_CORE_CLK_MA2_REG, BIT(0), BIT(0)},
2957 {MI2S_CODEC_RX_DIV_REG, 0xF, 0xD}, /* MI2S_CODEC_RX_S div = div-8. */
2958 {MI2S_CODEC_TX_DIV_REG, 0xF, 0xD}, /* MI2S_CODEC_TX_S div = div-8. */
2959 {MI2S_DIV_REG, 0xF, 0x7}, /* MI2S_S div = div-8. */
2960 {MDC_NS_REG, 0x3, 0x3}, /* MDC src = external MDH src. */
2961 {SDAC_NS_REG, BM(15, 14), 0x0}, /* SDAC div = div-1. */
2962 /* Disable sources TCXO/5 & TCXO/6. UART1 src = TCXO*/
2963 {UART_NS_REG, BM(26, 25) | BM(2, 0), 0x0},
2964 /* HDMI div = div-1, non-inverted. tv_enc_src = tv_clk_src */
2965 {HDMI_NS_REG, 0x7, 0x0},
2966 {TV_NS_REG, BM(15, 14), 0x0}, /* tv_clk_src_div2 = div-1 */
2967
2968 /* USBH core clocks src = USB_HS_SRC. */
2969 {USBH_NS_REG, BIT(15), BIT(15)},
2970 {USBH2_NS_REG, BIT(6), BIT(6)},
2971 {USBH3_NS_REG, BIT(6), BIT(6)},
2972};
2973
Matt Wagantallb64888f2012-04-02 21:35:07 -07002974static void __init msm7x30_clock_pre_init(void)
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07002975{
2976 int i;
2977 uint32_t val;
2978
Stephen Boyd409b8b42012-04-10 12:12:56 -07002979 clk_ops_branch.reset = soc_branch_clk_reset;
2980 clk_ops_rcg.reset = msm7x30_clk_reset;
2981 clk_ops_rcg.set_flags = soc_clk_set_flags;
2982
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07002983 cache_ownership();
2984 print_ownership();
2985 set_clock_ownership();
2986
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07002987 /* When we have no local clock control, the rest of the code in this
2988 * function is a NOP since writes to shadow regions that we don't own
2989 * are ignored. */
2990
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07002991 for (i = 0; i < ARRAY_SIZE(ri_list); i++) {
2992 val = readl_relaxed(ri_list[i].reg);
2993 val &= ~ri_list[i].mask;
2994 val |= ri_list[i].val;
2995 writel_relaxed(val, ri_list[i].reg);
2996 }
Matt Wagantallb64888f2012-04-02 21:35:07 -07002997}
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07002998
Matt Wagantallb64888f2012-04-02 21:35:07 -07002999static void __init msm7x30_clock_post_init(void)
3000{
3001 clk_set_rate(&usb_hs_src_clk.c, 60000000);
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07003002 clk_set_rate(&i2c_clk.c, 19200000);
3003 clk_set_rate(&i2c_2_clk.c, 19200000);
3004 clk_set_rate(&qup_i2c_clk.c, 19200000);
3005 clk_set_rate(&uart1_clk.c, 19200000);
3006 clk_set_rate(&uart2_clk.c, 19200000);
3007 clk_set_rate(&mi2s_m_clk.c, 12288000);
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07003008 clk_set_rate(&mdp_vsync_clk.c, 24576000);
3009 clk_set_rate(&glbl_root_clk.c, 1);
3010 clk_set_rate(&mdc_clk.c, 1);
3011 /* Sync the LPA_CODEC clock to MI2S_CODEC_RX */
3012 clk_set_rate(&lpa_codec_clk.c, 1);
3013 /* Sync the GRP2D clock to AXI */
3014 clk_set_rate(&grp_2d_clk.c, 1);
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07003015}
3016
Stephen Boydbb600ae2011-08-02 20:11:40 -07003017struct clock_init_data msm7x30_clock_init_data __initdata = {
3018 .table = msm_clocks_7x30,
3019 .size = ARRAY_SIZE(msm_clocks_7x30),
Matt Wagantallb64888f2012-04-02 21:35:07 -07003020 .pre_init = msm7x30_clock_pre_init,
3021 .post_init = msm7x30_clock_post_init,
Stephen Boydbb600ae2011-08-02 20:11:40 -07003022};