blob: 17052ae5e95cadc62dd2078d8af8837005b1a7a2 [file] [log] [blame]
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07001/* Copyright (c) 2009-2011, Code Aurora Forum. All rights reserved.
2 *
3 * This program is free software; you can redistribute it and/or modify
4 * it under the terms of the GNU General Public License version 2 and
5 * only version 2 as published by the Free Software Foundation.
6 *
7 * This program is distributed in the hope that it will be useful,
8 * but WITHOUT ANY WARRANTY; without even the implied warranty of
9 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
10 * GNU General Public License for more details.
11 *
12 */
13
14#include <linux/kernel.h>
15#include <linux/init.h>
16#include <linux/err.h>
17#include <linux/ctype.h>
18#include <linux/bitops.h>
19#include <linux/io.h>
20#include <linux/spinlock.h>
21#include <linux/delay.h>
22#include <linux/clk.h>
23#include <linux/clkdev.h>
24
25#include <mach/msm_iomap.h>
26#include <mach/clk.h>
27#include <mach/msm_xo.h>
28#include <mach/scm-io.h>
29#include <mach/rpm.h>
30#include <mach/rpm-regulator.h>
31
32#include "clock-local.h"
33#include "clock-rpm.h"
34#include "clock-voter.h"
35
36#ifdef CONFIG_MSM_SECURE_IO
37#undef readl_relaxed
38#undef writel_relaxed
39#define readl_relaxed secure_readl
40#define writel_relaxed secure_writel
41#endif
42
43#define REG(off) (MSM_CLK_CTL_BASE + (off))
44#define REG_MM(off) (MSM_MMSS_CLK_CTL_BASE + (off))
45#define REG_LPA(off) (MSM_LPASS_CLK_CTL_BASE + (off))
46
47/* Peripheral clock registers. */
48#define CE2_HCLK_CTL_REG REG(0x2740)
49#define CLK_HALT_CFPB_STATEA_REG REG(0x2FCC)
50#define CLK_HALT_CFPB_STATEB_REG REG(0x2FD0)
51#define CLK_HALT_CFPB_STATEC_REG REG(0x2FD4)
52#define CLK_HALT_DFAB_STATE_REG REG(0x2FC8)
53#define CLK_HALT_MSS_SMPSS_MISC_STATE_REG REG(0x2FDC)
54#define CLK_HALT_SFPB_MISC_STATE_REG REG(0x2FD8)
55#define CLK_TEST_REG REG(0x2FA0)
Matt Wagantall66cd0932011-09-12 19:04:34 -070056#define EBI2_2X_CLK_CTL_REG REG(0x2660)
57#define EBI2_CLK_CTL_REG REG(0x2664)
Matt Wagantall7625a4c2011-11-01 16:17:53 -070058#define GPn_MD_REG(n) REG(0x2D00+(0x20*(n)))
59#define GPn_NS_REG(n) REG(0x2D24+(0x20*(n)))
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -070060#define GSBIn_HCLK_CTL_REG(n) REG(0x29C0+(0x20*((n)-1)))
61#define GSBIn_QUP_APPS_MD_REG(n) REG(0x29C8+(0x20*((n)-1)))
62#define GSBIn_QUP_APPS_NS_REG(n) REG(0x29CC+(0x20*((n)-1)))
63#define GSBIn_RESET_REG(n) REG(0x29DC+(0x20*((n)-1)))
64#define GSBIn_UART_APPS_MD_REG(n) REG(0x29D0+(0x20*((n)-1)))
65#define GSBIn_UART_APPS_NS_REG(n) REG(0x29D4+(0x20*((n)-1)))
66#define PDM_CLK_NS_REG REG(0x2CC0)
67#define BB_PLL_ENA_SC0_REG REG(0x34C0)
68#define BB_PLL0_STATUS_REG REG(0x30D8)
69#define BB_PLL6_STATUS_REG REG(0x3118)
70#define BB_PLL8_L_VAL_REG REG(0x3144)
71#define BB_PLL8_M_VAL_REG REG(0x3148)
72#define BB_PLL8_MODE_REG REG(0x3140)
73#define BB_PLL8_N_VAL_REG REG(0x314C)
74#define BB_PLL8_STATUS_REG REG(0x3158)
75#define PLLTEST_PAD_CFG_REG REG(0x2FA4)
76#define PMEM_ACLK_CTL_REG REG(0x25A0)
77#define PPSS_HCLK_CTL_REG REG(0x2580)
78#define RINGOSC_NS_REG REG(0x2DC0)
79#define RINGOSC_STATUS_REG REG(0x2DCC)
80#define RINGOSC_TCXO_CTL_REG REG(0x2DC4)
81#define SC0_U_CLK_BRANCH_ENA_VOTE_REG REG(0x3080)
82#define SC1_U_CLK_BRANCH_ENA_VOTE_REG REG(0x30A0)
83#define SC0_U_CLK_SLEEP_ENA_VOTE_REG REG(0x3084)
84#define SC1_U_CLK_SLEEP_ENA_VOTE_REG REG(0x30A4)
85#define SDCn_APPS_CLK_MD_REG(n) REG(0x2828+(0x20*((n)-1)))
86#define SDCn_APPS_CLK_NS_REG(n) REG(0x282C+(0x20*((n)-1)))
87#define SDCn_HCLK_CTL_REG(n) REG(0x2820+(0x20*((n)-1)))
88#define SDCn_RESET_REG(n) REG(0x2830+(0x20*((n)-1)))
89#define TSIF_HCLK_CTL_REG REG(0x2700)
90#define TSIF_REF_CLK_MD_REG REG(0x270C)
91#define TSIF_REF_CLK_NS_REG REG(0x2710)
92#define TSSC_CLK_CTL_REG REG(0x2CA0)
93#define USB_FSn_HCLK_CTL_REG(n) REG(0x2960+(0x20*((n)-1)))
94#define USB_FSn_RESET_REG(n) REG(0x2974+(0x20*((n)-1)))
95#define USB_FSn_SYSTEM_CLK_CTL_REG(n) REG(0x296C+(0x20*((n)-1)))
96#define USB_FSn_XCVR_FS_CLK_MD_REG(n) REG(0x2964+(0x20*((n)-1)))
97#define USB_FSn_XCVR_FS_CLK_NS_REG(n) REG(0x2968+(0x20*((n)-1)))
98#define USB_HS1_HCLK_CTL_REG REG(0x2900)
99#define USB_HS1_RESET_REG REG(0x2910)
100#define USB_HS1_XCVR_FS_CLK_MD_REG REG(0x2908)
101#define USB_HS1_XCVR_FS_CLK_NS_REG REG(0x290C)
102#define USB_PHY0_RESET_REG REG(0x2E20)
103
104/* Multimedia clock registers. */
105#define AHB_EN_REG REG_MM(0x0008)
106#define AHB_EN2_REG REG_MM(0x0038)
107#define AHB_NS_REG REG_MM(0x0004)
108#define AXI_NS_REG REG_MM(0x0014)
109#define CAMCLK_CC_REG REG_MM(0x0140)
110#define CAMCLK_MD_REG REG_MM(0x0144)
111#define CAMCLK_NS_REG REG_MM(0x0148)
112#define CSI_CC_REG REG_MM(0x0040)
113#define CSI_NS_REG REG_MM(0x0048)
114#define DBG_BUS_VEC_A_REG REG_MM(0x01C8)
115#define DBG_BUS_VEC_B_REG REG_MM(0x01CC)
116#define DBG_BUS_VEC_C_REG REG_MM(0x01D0)
117#define DBG_BUS_VEC_D_REG REG_MM(0x01D4)
118#define DBG_BUS_VEC_E_REG REG_MM(0x01D8)
119#define DBG_BUS_VEC_F_REG REG_MM(0x01DC)
120#define DBG_BUS_VEC_H_REG REG_MM(0x01E4)
Matt Wagantallf8032602011-06-15 23:01:56 -0700121#define DBG_BUS_VEC_I_REG REG_MM(0x01E8)
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700122#define DBG_CFG_REG_HS_REG REG_MM(0x01B4)
123#define DBG_CFG_REG_LS_REG REG_MM(0x01B8)
124#define GFX2D0_CC_REG REG_MM(0x0060)
125#define GFX2D0_MD0_REG REG_MM(0x0064)
126#define GFX2D0_MD1_REG REG_MM(0x0068)
127#define GFX2D0_NS_REG REG_MM(0x0070)
128#define GFX2D1_CC_REG REG_MM(0x0074)
129#define GFX2D1_MD0_REG REG_MM(0x0078)
130#define GFX2D1_MD1_REG REG_MM(0x006C)
131#define GFX2D1_NS_REG REG_MM(0x007C)
132#define GFX3D_CC_REG REG_MM(0x0080)
133#define GFX3D_MD0_REG REG_MM(0x0084)
134#define GFX3D_MD1_REG REG_MM(0x0088)
135#define GFX3D_NS_REG REG_MM(0x008C)
136#define IJPEG_CC_REG REG_MM(0x0098)
137#define IJPEG_MD_REG REG_MM(0x009C)
138#define IJPEG_NS_REG REG_MM(0x00A0)
139#define JPEGD_CC_REG REG_MM(0x00A4)
140#define JPEGD_NS_REG REG_MM(0x00AC)
141#define MAXI_EN_REG REG_MM(0x0018)
Matt Wagantallf63a8892011-06-15 16:44:46 -0700142#define MAXI_EN2_REG REG_MM(0x0020)
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700143#define MAXI_EN3_REG REG_MM(0x002C)
144#define MDP_CC_REG REG_MM(0x00C0)
145#define MDP_MD0_REG REG_MM(0x00C4)
146#define MDP_MD1_REG REG_MM(0x00C8)
147#define MDP_NS_REG REG_MM(0x00D0)
148#define MISC_CC_REG REG_MM(0x0058)
149#define MISC_CC2_REG REG_MM(0x005C)
150#define PIXEL_CC_REG REG_MM(0x00D4)
151#define PIXEL_CC2_REG REG_MM(0x0120)
152#define PIXEL_MD_REG REG_MM(0x00D8)
153#define PIXEL_NS_REG REG_MM(0x00DC)
154#define MM_PLL0_MODE_REG REG_MM(0x0300)
155#define MM_PLL1_MODE_REG REG_MM(0x031C)
156#define MM_PLL2_CONFIG_REG REG_MM(0x0348)
157#define MM_PLL2_L_VAL_REG REG_MM(0x033C)
158#define MM_PLL2_M_VAL_REG REG_MM(0x0340)
159#define MM_PLL2_MODE_REG REG_MM(0x0338)
160#define MM_PLL2_N_VAL_REG REG_MM(0x0344)
161#define ROT_CC_REG REG_MM(0x00E0)
162#define ROT_NS_REG REG_MM(0x00E8)
163#define SAXI_EN_REG REG_MM(0x0030)
164#define SW_RESET_AHB_REG REG_MM(0x020C)
165#define SW_RESET_ALL_REG REG_MM(0x0204)
166#define SW_RESET_AXI_REG REG_MM(0x0208)
167#define SW_RESET_CORE_REG REG_MM(0x0210)
168#define TV_CC_REG REG_MM(0x00EC)
169#define TV_CC2_REG REG_MM(0x0124)
170#define TV_MD_REG REG_MM(0x00F0)
171#define TV_NS_REG REG_MM(0x00F4)
172#define VCODEC_CC_REG REG_MM(0x00F8)
173#define VCODEC_MD0_REG REG_MM(0x00FC)
174#define VCODEC_MD1_REG REG_MM(0x0128)
175#define VCODEC_NS_REG REG_MM(0x0100)
176#define VFE_CC_REG REG_MM(0x0104)
177#define VFE_MD_REG REG_MM(0x0108)
178#define VFE_NS_REG REG_MM(0x010C)
179#define VPE_CC_REG REG_MM(0x0110)
180#define VPE_NS_REG REG_MM(0x0118)
181
182/* Low-power Audio clock registers. */
183#define LCC_CLK_LS_DEBUG_CFG_REG REG_LPA(0x00A8)
184#define LCC_CODEC_I2S_MIC_MD_REG REG_LPA(0x0064)
185#define LCC_CODEC_I2S_MIC_NS_REG REG_LPA(0x0060)
186#define LCC_CODEC_I2S_MIC_STATUS_REG REG_LPA(0x0068)
187#define LCC_CODEC_I2S_SPKR_MD_REG REG_LPA(0x0070)
188#define LCC_CODEC_I2S_SPKR_NS_REG REG_LPA(0x006C)
189#define LCC_CODEC_I2S_SPKR_STATUS_REG REG_LPA(0x0074)
190#define LCC_MI2S_MD_REG REG_LPA(0x004C)
191#define LCC_MI2S_NS_REG REG_LPA(0x0048)
192#define LCC_MI2S_STATUS_REG REG_LPA(0x0050)
193#define LCC_PCM_MD_REG REG_LPA(0x0058)
194#define LCC_PCM_NS_REG REG_LPA(0x0054)
195#define LCC_PCM_STATUS_REG REG_LPA(0x005C)
196#define LCC_PLL0_CONFIG_REG REG_LPA(0x0014)
197#define LCC_PLL0_L_VAL_REG REG_LPA(0x0004)
198#define LCC_PLL0_M_VAL_REG REG_LPA(0x0008)
199#define LCC_PLL0_MODE_REG REG_LPA(0x0000)
200#define LCC_PLL0_N_VAL_REG REG_LPA(0x000C)
201#define LCC_PRI_PLL_CLK_CTL_REG REG_LPA(0x00C4)
202#define LCC_SPARE_I2S_MIC_MD_REG REG_LPA(0x007C)
203#define LCC_SPARE_I2S_MIC_NS_REG REG_LPA(0x0078)
204#define LCC_SPARE_I2S_MIC_STATUS_REG REG_LPA(0x0080)
205#define LCC_SPARE_I2S_SPKR_MD_REG REG_LPA(0x0088)
206#define LCC_SPARE_I2S_SPKR_NS_REG REG_LPA(0x0084)
207#define LCC_SPARE_I2S_SPKR_STATUS_REG REG_LPA(0x008C)
208
209/* MUX source input identifiers. */
210#define pxo_to_bb_mux 0
211#define mxo_to_bb_mux 1
Matt Wagantall7625a4c2011-11-01 16:17:53 -0700212#define cxo_to_bb_mux 5
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700213#define pll0_to_bb_mux 2
214#define pll8_to_bb_mux 3
215#define pll6_to_bb_mux 4
216#define gnd_to_bb_mux 6
217#define pxo_to_mm_mux 0
218#define pll1_to_mm_mux 1 /* or MMSS_PLL0 */
219#define pll2_to_mm_mux 1 /* or MMSS_PLL1 */
220#define pll3_to_mm_mux 3 /* or MMSS_PLL2 */
221#define pll8_to_mm_mux 2 /* or MMSS_GPERF */
222#define pll0_to_mm_mux 3 /* or MMSS_GPLL0 */
223#define mxo_to_mm_mux 4
224#define gnd_to_mm_mux 6
225#define cxo_to_xo_mux 0
226#define pxo_to_xo_mux 1
227#define mxo_to_xo_mux 2
228#define gnd_to_xo_mux 3
229#define pxo_to_lpa_mux 0
230#define cxo_to_lpa_mux 1
231#define pll4_to_lpa_mux 2 /* or LPA_PLL0 */
232#define gnd_to_lpa_mux 6
233
234/* Test Vector Macros */
235#define TEST_TYPE_PER_LS 1
236#define TEST_TYPE_PER_HS 2
237#define TEST_TYPE_MM_LS 3
238#define TEST_TYPE_MM_HS 4
239#define TEST_TYPE_LPA 5
240#define TEST_TYPE_SC 6
241#define TEST_TYPE_MM_HS2X 7
242#define TEST_TYPE_SHIFT 24
243#define TEST_CLK_SEL_MASK BM(23, 0)
244#define TEST_VECTOR(s, t) (((t) << TEST_TYPE_SHIFT) | BVAL(23, 0, (s)))
245#define TEST_PER_LS(s) TEST_VECTOR((s), TEST_TYPE_PER_LS)
246#define TEST_PER_HS(s) TEST_VECTOR((s), TEST_TYPE_PER_HS)
247#define TEST_MM_LS(s) TEST_VECTOR((s), TEST_TYPE_MM_LS)
248#define TEST_MM_HS(s) TEST_VECTOR((s), TEST_TYPE_MM_HS)
249#define TEST_LPA(s) TEST_VECTOR((s), TEST_TYPE_LPA)
250#define TEST_SC(s) TEST_VECTOR((s), TEST_TYPE_SC)
251#define TEST_MM_HS2X(s) TEST_VECTOR((s), TEST_TYPE_MM_HS2X)
252
253struct pll_rate {
254 const uint32_t l_val;
255 const uint32_t m_val;
256 const uint32_t n_val;
257 const uint32_t vco;
258 const uint32_t post_div;
259 const uint32_t i_bits;
260};
261#define PLL_RATE(l, m, n, v, d, i) { l, m, n, v, (d>>1), i }
262/*
263 * Clock frequency definitions and macros
264 */
265#define MN_MODE_DUAL_EDGE 0x2
266
267/* MD Registers */
268#define MD4(m_lsb, m, n_lsb, n) \
269 (BVAL((m_lsb+3), m_lsb, m) | BVAL((n_lsb+3), n_lsb, ~(n)))
270#define MD8(m_lsb, m, n_lsb, n) \
271 (BVAL((m_lsb+7), m_lsb, m) | BVAL((n_lsb+7), n_lsb, ~(n)))
272#define MD16(m, n) (BVAL(31, 16, m) | BVAL(15, 0, ~(n)))
273
274/* NS Registers */
275#define NS(n_msb, n_lsb, n, m, mde_lsb, d_msb, d_lsb, d, s_msb, s_lsb, s) \
276 (BVAL(n_msb, n_lsb, ~(n-m)) \
277 | (BVAL((mde_lsb+1), mde_lsb, MN_MODE_DUAL_EDGE) * !!(n)) \
278 | BVAL(d_msb, d_lsb, (d-1)) | BVAL(s_msb, s_lsb, s))
279
280#define NS_MM(n_msb, n_lsb, n, m, d_msb, d_lsb, d, s_msb, s_lsb, s) \
281 (BVAL(n_msb, n_lsb, ~(n-m)) | BVAL(d_msb, d_lsb, (d-1)) \
282 | BVAL(s_msb, s_lsb, s))
283
284#define NS_DIVSRC(d_msb , d_lsb, d, s_msb, s_lsb, s) \
285 (BVAL(d_msb, d_lsb, (d-1)) | BVAL(s_msb, s_lsb, s))
286
287#define NS_DIV(d_msb , d_lsb, d) \
288 BVAL(d_msb, d_lsb, (d-1))
289
290#define NS_SRC_SEL(s_msb, s_lsb, s) \
291 BVAL(s_msb, s_lsb, s)
292
293#define NS_MND_BANKED4(n0_lsb, n1_lsb, n, m, s0_lsb, s1_lsb, s) \
294 (BVAL((n0_lsb+3), n0_lsb, ~(n-m)) \
295 | BVAL((n1_lsb+3), n1_lsb, ~(n-m)) \
296 | BVAL((s0_lsb+2), s0_lsb, s) \
297 | BVAL((s1_lsb+2), s1_lsb, s))
298
299#define NS_MND_BANKED8(n0_lsb, n1_lsb, n, m, s0_lsb, s1_lsb, s) \
300 (BVAL((n0_lsb+7), n0_lsb, ~(n-m)) \
301 | BVAL((n1_lsb+7), n1_lsb, ~(n-m)) \
302 | BVAL((s0_lsb+2), s0_lsb, s) \
303 | BVAL((s1_lsb+2), s1_lsb, s))
304
305#define NS_DIVSRC_BANKED(d0_msb, d0_lsb, d1_msb, d1_lsb, d, \
306 s0_msb, s0_lsb, s1_msb, s1_lsb, s) \
307 (BVAL(d0_msb, d0_lsb, (d-1)) | BVAL(d1_msb, d1_lsb, (d-1)) \
308 | BVAL(s0_msb, s0_lsb, s) \
309 | BVAL(s1_msb, s1_lsb, s))
310
311/* CC Registers */
312#define CC(mde_lsb, n) (BVAL((mde_lsb+1), mde_lsb, MN_MODE_DUAL_EDGE) * !!(n))
313#define CC_BANKED(mde0_lsb, mde1_lsb, n) \
314 ((BVAL((mde0_lsb+1), mde0_lsb, MN_MODE_DUAL_EDGE) \
315 | BVAL((mde1_lsb+1), mde1_lsb, MN_MODE_DUAL_EDGE)) \
316 * !!(n))
317
Matt Wagantalle18bbc82011-10-06 10:07:28 -0700318enum vdd_dig_levels {
319 VDD_DIG_NONE,
320 VDD_DIG_LOW,
321 VDD_DIG_NOMINAL,
322 VDD_DIG_HIGH
323};
324
325static int set_vdd_dig(struct clk_vdd_class *vdd_class, int level)
326{
327 static const int vdd_uv[] = {
328 [VDD_DIG_NONE] = 500000,
329 [VDD_DIG_LOW] = 1000000,
330 [VDD_DIG_NOMINAL] = 1100000,
331 [VDD_DIG_HIGH] = 1200000
332 };
333
334 return rpm_vreg_set_voltage(RPM_VREG_ID_PM8058_S1, RPM_VREG_VOTER3,
335 vdd_uv[level], 1200000, 1);
336}
337
338static DEFINE_VDD_CLASS(vdd_dig, set_vdd_dig);
339
340#define VDD_DIG_FMAX_MAP1(l1, f1) \
341 .vdd_class = &vdd_dig, \
342 .fmax[VDD_DIG_##l1] = (f1)
343#define VDD_DIG_FMAX_MAP2(l1, f1, l2, f2) \
344 .vdd_class = &vdd_dig, \
345 .fmax[VDD_DIG_##l1] = (f1), \
346 .fmax[VDD_DIG_##l2] = (f2)
347#define VDD_DIG_FMAX_MAP3(l1, f1, l2, f2, l3, f3) \
348 .vdd_class = &vdd_dig, \
349 .fmax[VDD_DIG_##l1] = (f1), \
350 .fmax[VDD_DIG_##l2] = (f2), \
351 .fmax[VDD_DIG_##l3] = (f3)
352
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700353static struct msm_xo_voter *xo_pxo, *xo_cxo;
354
355static bool xo_clk_is_local(struct clk *clk)
356{
357 return false;
358}
359
360static int pxo_clk_enable(struct clk *clk)
361{
362 return msm_xo_mode_vote(xo_pxo, MSM_XO_MODE_ON);
363}
364
365static void pxo_clk_disable(struct clk *clk)
366{
367 msm_xo_mode_vote(xo_pxo, MSM_XO_MODE_OFF);
368}
369
370static struct clk_ops clk_ops_pxo = {
371 .enable = pxo_clk_enable,
372 .disable = pxo_clk_disable,
373 .get_rate = fixed_clk_get_rate,
374 .is_local = xo_clk_is_local,
375};
376
377static struct fixed_clk pxo_clk = {
378 .rate = 27000000,
379 .c = {
380 .dbg_name = "pxo_clk",
381 .ops = &clk_ops_pxo,
382 CLK_INIT(pxo_clk.c),
383 },
384};
385
386static int cxo_clk_enable(struct clk *clk)
387{
388 return msm_xo_mode_vote(xo_cxo, MSM_XO_MODE_ON);
389}
390
391static void cxo_clk_disable(struct clk *clk)
392{
393 msm_xo_mode_vote(xo_cxo, MSM_XO_MODE_OFF);
394}
395
396static struct clk_ops clk_ops_cxo = {
397 .enable = cxo_clk_enable,
398 .disable = cxo_clk_disable,
399 .get_rate = fixed_clk_get_rate,
400 .is_local = xo_clk_is_local,
401};
402
403static struct fixed_clk cxo_clk = {
404 .rate = 19200000,
405 .c = {
406 .dbg_name = "cxo_clk",
407 .ops = &clk_ops_cxo,
408 CLK_INIT(cxo_clk.c),
409 },
410};
411
412static struct pll_vote_clk pll8_clk = {
413 .rate = 384000000,
414 .en_reg = BB_PLL_ENA_SC0_REG,
415 .en_mask = BIT(8),
416 .status_reg = BB_PLL8_STATUS_REG,
417 .parent = &pxo_clk.c,
418 .c = {
419 .dbg_name = "pll8_clk",
420 .ops = &clk_ops_pll_vote,
421 CLK_INIT(pll8_clk.c),
422 },
423};
424
425static struct pll_clk pll2_clk = {
426 .rate = 800000000,
427 .mode_reg = MM_PLL1_MODE_REG,
428 .parent = &pxo_clk.c,
429 .c = {
430 .dbg_name = "pll2_clk",
431 .ops = &clk_ops_pll,
432 CLK_INIT(pll2_clk.c),
433 },
434};
435
436static struct pll_clk pll3_clk = {
437 .rate = 0, /* TODO: Detect rate dynamically */
438 .mode_reg = MM_PLL2_MODE_REG,
439 .parent = &pxo_clk.c,
440 .c = {
441 .dbg_name = "pll3_clk",
442 .ops = &clk_ops_pll,
443 CLK_INIT(pll3_clk.c),
444 },
445};
446
447static int pll4_clk_enable(struct clk *clk)
448{
449 struct msm_rpm_iv_pair iv = { MSM_RPM_ID_PLL_4, 1 };
450 return msm_rpm_set_noirq(MSM_RPM_CTX_SET_0, &iv, 1);
451}
452
453static void pll4_clk_disable(struct clk *clk)
454{
455 struct msm_rpm_iv_pair iv = { MSM_RPM_ID_PLL_4, 0 };
456 msm_rpm_set_noirq(MSM_RPM_CTX_SET_0, &iv, 1);
457}
458
459static struct clk *pll4_clk_get_parent(struct clk *clk)
460{
461 return &pxo_clk.c;
462}
463
464static bool pll4_clk_is_local(struct clk *clk)
465{
466 return false;
467}
468
469static struct clk_ops clk_ops_pll4 = {
470 .enable = pll4_clk_enable,
471 .disable = pll4_clk_disable,
472 .get_rate = fixed_clk_get_rate,
473 .get_parent = pll4_clk_get_parent,
474 .is_local = pll4_clk_is_local,
475};
476
477static struct fixed_clk pll4_clk = {
478 .rate = 540672000,
479 .c = {
480 .dbg_name = "pll4_clk",
481 .ops = &clk_ops_pll4,
482 CLK_INIT(pll4_clk.c),
483 },
484};
485
486/*
487 * SoC-specific Set-Rate Functions
488 */
489
490/* Unlike other clocks, the TV rate is adjusted through PLL
491 * re-programming. It is also routed through an MND divider. */
492static void set_rate_tv(struct rcg_clk *clk, struct clk_freq_tbl *nf)
493{
494 struct pll_rate *rate = nf->extra_freq_data;
495 uint32_t pll_mode, pll_config, misc_cc2;
496
497 /* Disable PLL output. */
498 pll_mode = readl_relaxed(MM_PLL2_MODE_REG);
499 pll_mode &= ~BIT(0);
500 writel_relaxed(pll_mode, MM_PLL2_MODE_REG);
501
502 /* Assert active-low PLL reset. */
503 pll_mode &= ~BIT(2);
504 writel_relaxed(pll_mode, MM_PLL2_MODE_REG);
505
506 /* Program L, M and N values. */
507 writel_relaxed(rate->l_val, MM_PLL2_L_VAL_REG);
508 writel_relaxed(rate->m_val, MM_PLL2_M_VAL_REG);
509 writel_relaxed(rate->n_val, MM_PLL2_N_VAL_REG);
510
511 /* Configure MN counter, post-divide, VCO, and i-bits. */
512 pll_config = readl_relaxed(MM_PLL2_CONFIG_REG);
513 pll_config &= ~(BM(22, 20) | BM(18, 0));
514 pll_config |= rate->n_val ? BIT(22) : 0;
515 pll_config |= BVAL(21, 20, rate->post_div);
516 pll_config |= BVAL(17, 16, rate->vco);
517 pll_config |= rate->i_bits;
518 writel_relaxed(pll_config, MM_PLL2_CONFIG_REG);
519
520 /* Configure MND. */
521 set_rate_mnd(clk, nf);
522
523 /* Configure hdmi_ref_clk to be equal to the TV clock rate. */
524 misc_cc2 = readl_relaxed(MISC_CC2_REG);
525 misc_cc2 &= ~(BIT(28)|BM(21, 18));
526 misc_cc2 |= (BIT(28)|BVAL(21, 18, (nf->ns_val >> 14) & 0x3));
527 writel_relaxed(misc_cc2, MISC_CC2_REG);
528
529 /* De-assert active-low PLL reset. */
530 pll_mode |= BIT(2);
531 writel_relaxed(pll_mode, MM_PLL2_MODE_REG);
532
533 /* Enable PLL output. */
534 pll_mode |= BIT(0);
535 writel_relaxed(pll_mode, MM_PLL2_MODE_REG);
536}
537
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700538static int soc_clk_reset(struct clk *clk, enum clk_reset_action action)
539{
540 return branch_reset(&to_rcg_clk(clk)->b, action);
541}
542
Matt Wagantall84f43fd2011-08-16 23:28:38 -0700543static struct clk_ops clk_ops_rcg_8x60 = {
Matt Wagantall0625ea02011-07-13 18:51:56 -0700544 .enable = rcg_clk_enable,
545 .disable = rcg_clk_disable,
Matt Wagantall41af0772011-09-17 12:21:39 -0700546 .auto_off = rcg_clk_disable,
Matt Wagantall14dc2af2011-08-12 13:16:06 -0700547 .handoff = rcg_clk_handoff,
Matt Wagantall0625ea02011-07-13 18:51:56 -0700548 .set_rate = rcg_clk_set_rate,
549 .set_min_rate = rcg_clk_set_min_rate,
Matt Wagantall0625ea02011-07-13 18:51:56 -0700550 .get_rate = rcg_clk_get_rate,
551 .list_rate = rcg_clk_list_rate,
552 .is_enabled = rcg_clk_is_enabled,
553 .round_rate = rcg_clk_round_rate,
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700554 .reset = soc_clk_reset,
555 .is_local = local_clk_is_local,
Matt Wagantall0625ea02011-07-13 18:51:56 -0700556 .get_parent = rcg_clk_get_parent,
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700557};
558
559static struct clk_ops clk_ops_branch = {
560 .enable = branch_clk_enable,
561 .disable = branch_clk_disable,
Matt Wagantall41af0772011-09-17 12:21:39 -0700562 .auto_off = branch_clk_disable,
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700563 .is_enabled = branch_clk_is_enabled,
564 .reset = branch_clk_reset,
565 .is_local = local_clk_is_local,
566 .get_parent = branch_clk_get_parent,
567 .set_parent = branch_clk_set_parent,
568};
569
570static struct clk_ops clk_ops_reset = {
571 .reset = branch_clk_reset,
572 .is_local = local_clk_is_local,
573};
574
575/*
576 * Clock Descriptions
577 */
578
579/* AXI Interfaces */
580static struct branch_clk gmem_axi_clk = {
581 .b = {
582 .ctl_reg = MAXI_EN_REG,
583 .en_mask = BIT(24),
584 .halt_reg = DBG_BUS_VEC_E_REG,
585 .halt_bit = 6,
586 },
587 .c = {
588 .dbg_name = "gmem_axi_clk",
589 .ops = &clk_ops_branch,
590 CLK_INIT(gmem_axi_clk.c),
591 },
592};
593
594static struct branch_clk ijpeg_axi_clk = {
595 .b = {
596 .ctl_reg = MAXI_EN_REG,
597 .en_mask = BIT(21),
598 .reset_reg = SW_RESET_AXI_REG,
599 .reset_mask = BIT(14),
600 .halt_reg = DBG_BUS_VEC_E_REG,
601 .halt_bit = 4,
602 },
603 .c = {
604 .dbg_name = "ijpeg_axi_clk",
605 .ops = &clk_ops_branch,
606 CLK_INIT(ijpeg_axi_clk.c),
607 },
608};
609
610static struct branch_clk imem_axi_clk = {
611 .b = {
612 .ctl_reg = MAXI_EN_REG,
613 .en_mask = BIT(22),
614 .reset_reg = SW_RESET_CORE_REG,
615 .reset_mask = BIT(10),
616 .halt_reg = DBG_BUS_VEC_E_REG,
617 .halt_bit = 7,
618 },
619 .c = {
620 .dbg_name = "imem_axi_clk",
621 .ops = &clk_ops_branch,
622 CLK_INIT(imem_axi_clk.c),
623 },
624};
625
626static struct branch_clk jpegd_axi_clk = {
627 .b = {
628 .ctl_reg = MAXI_EN_REG,
629 .en_mask = BIT(25),
630 .halt_reg = DBG_BUS_VEC_E_REG,
631 .halt_bit = 5,
632 },
633 .c = {
634 .dbg_name = "jpegd_axi_clk",
635 .ops = &clk_ops_branch,
636 CLK_INIT(jpegd_axi_clk.c),
637 },
638};
639
640static struct branch_clk mdp_axi_clk = {
641 .b = {
642 .ctl_reg = MAXI_EN_REG,
643 .en_mask = BIT(23),
644 .reset_reg = SW_RESET_AXI_REG,
645 .reset_mask = BIT(13),
646 .halt_reg = DBG_BUS_VEC_E_REG,
647 .halt_bit = 8,
648 },
649 .c = {
650 .dbg_name = "mdp_axi_clk",
651 .ops = &clk_ops_branch,
652 CLK_INIT(mdp_axi_clk.c),
653 },
654};
655
656static struct branch_clk vcodec_axi_clk = {
657 .b = {
658 .ctl_reg = MAXI_EN_REG,
659 .en_mask = BIT(19),
660 .reset_reg = SW_RESET_AXI_REG,
661 .reset_mask = BIT(4)|BIT(5),
662 .halt_reg = DBG_BUS_VEC_E_REG,
663 .halt_bit = 3,
664 },
665 .c = {
666 .dbg_name = "vcodec_axi_clk",
667 .ops = &clk_ops_branch,
668 CLK_INIT(vcodec_axi_clk.c),
669 },
670};
671
672static struct branch_clk vfe_axi_clk = {
673 .b = {
674 .ctl_reg = MAXI_EN_REG,
675 .en_mask = BIT(18),
676 .reset_reg = SW_RESET_AXI_REG,
677 .reset_mask = BIT(9),
678 .halt_reg = DBG_BUS_VEC_E_REG,
679 .halt_bit = 0,
680 },
681 .c = {
682 .dbg_name = "vfe_axi_clk",
683 .ops = &clk_ops_branch,
684 CLK_INIT(vfe_axi_clk.c),
685 },
686};
687
688static struct branch_clk rot_axi_clk = {
689 .b = {
Matt Wagantallf63a8892011-06-15 16:44:46 -0700690 .ctl_reg = MAXI_EN2_REG,
691 .en_mask = BIT(24),
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700692 .reset_reg = SW_RESET_AXI_REG,
693 .reset_mask = BIT(6),
Matt Wagantallf63a8892011-06-15 16:44:46 -0700694 .halt_reg = DBG_BUS_VEC_E_REG,
695 .halt_bit = 2,
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700696 },
697 .c = {
698 .dbg_name = "rot_axi_clk",
Matt Wagantallf63a8892011-06-15 16:44:46 -0700699 .ops = &clk_ops_branch,
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700700 CLK_INIT(rot_axi_clk.c),
701 },
702};
703
704static struct branch_clk vpe_axi_clk = {
705 .b = {
Matt Wagantallf63a8892011-06-15 16:44:46 -0700706 .ctl_reg = MAXI_EN2_REG,
707 .en_mask = BIT(26),
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700708 .reset_reg = SW_RESET_AXI_REG,
709 .reset_mask = BIT(15),
Matt Wagantallf63a8892011-06-15 16:44:46 -0700710 .halt_reg = DBG_BUS_VEC_E_REG,
711 .halt_bit = 1,
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700712 },
713 .c = {
714 .dbg_name = "vpe_axi_clk",
Matt Wagantallf63a8892011-06-15 16:44:46 -0700715 .ops = &clk_ops_branch,
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700716 CLK_INIT(vpe_axi_clk.c),
717 },
718};
719
Matt Wagantallf8032602011-06-15 23:01:56 -0700720static struct branch_clk smi_2x_axi_clk = {
721 .b = {
722 .ctl_reg = MAXI_EN2_REG,
723 .en_mask = BIT(30),
724 .halt_reg = DBG_BUS_VEC_I_REG,
725 .halt_bit = 0,
726 },
727 .c = {
728 .dbg_name = "smi_2x_axi_clk",
729 .ops = &clk_ops_branch,
730 .flags = CLKFLAG_SKIP_AUTO_OFF,
731 CLK_INIT(smi_2x_axi_clk.c),
732 },
733};
734
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700735/* AHB Interfaces */
736static struct branch_clk amp_p_clk = {
737 .b = {
738 .ctl_reg = AHB_EN_REG,
739 .en_mask = BIT(24),
740 .halt_reg = DBG_BUS_VEC_F_REG,
741 .halt_bit = 18,
742 },
743 .c = {
744 .dbg_name = "amp_p_clk",
745 .ops = &clk_ops_branch,
746 CLK_INIT(amp_p_clk.c),
747 },
748};
749
750static struct branch_clk csi0_p_clk = {
751 .b = {
752 .ctl_reg = AHB_EN_REG,
753 .en_mask = BIT(7),
754 .reset_reg = SW_RESET_AHB_REG,
755 .reset_mask = BIT(17),
756 .halt_reg = DBG_BUS_VEC_F_REG,
757 .halt_bit = 16,
758 },
759 .c = {
760 .dbg_name = "csi0_p_clk",
761 .ops = &clk_ops_branch,
762 CLK_INIT(csi0_p_clk.c),
763 },
764};
765
766static struct branch_clk csi1_p_clk = {
767 .b = {
768 .ctl_reg = AHB_EN_REG,
769 .en_mask = BIT(20),
770 .reset_reg = SW_RESET_AHB_REG,
771 .reset_mask = BIT(16),
772 .halt_reg = DBG_BUS_VEC_F_REG,
773 .halt_bit = 17,
774 },
775 .c = {
776 .dbg_name = "csi1_p_clk",
777 .ops = &clk_ops_branch,
778 CLK_INIT(csi1_p_clk.c),
779 },
780};
781
782static struct branch_clk dsi_m_p_clk = {
783 .b = {
784 .ctl_reg = AHB_EN_REG,
785 .en_mask = BIT(9),
786 .reset_reg = SW_RESET_AHB_REG,
787 .reset_mask = BIT(6),
788 .halt_reg = DBG_BUS_VEC_F_REG,
789 .halt_bit = 19,
790 },
791 .c = {
792 .dbg_name = "dsi_m_p_clk",
793 .ops = &clk_ops_branch,
794 CLK_INIT(dsi_m_p_clk.c),
795 },
796};
797
798static struct branch_clk dsi_s_p_clk = {
799 .b = {
800 .ctl_reg = AHB_EN_REG,
801 .en_mask = BIT(18),
802 .reset_reg = SW_RESET_AHB_REG,
803 .reset_mask = BIT(5),
804 .halt_reg = DBG_BUS_VEC_F_REG,
805 .halt_bit = 20,
806 },
807 .c = {
808 .dbg_name = "dsi_s_p_clk",
809 .ops = &clk_ops_branch,
810 CLK_INIT(dsi_s_p_clk.c),
811 },
812};
813
814static struct branch_clk gfx2d0_p_clk = {
815 .b = {
816 .ctl_reg = AHB_EN_REG,
817 .en_mask = BIT(19),
818 .reset_reg = SW_RESET_AHB_REG,
819 .reset_mask = BIT(12),
820 .halt_reg = DBG_BUS_VEC_F_REG,
821 .halt_bit = 2,
822 },
823 .c = {
824 .dbg_name = "gfx2d0_p_clk",
825 .ops = &clk_ops_branch,
826 CLK_INIT(gfx2d0_p_clk.c),
827 },
828};
829
830static struct branch_clk gfx2d1_p_clk = {
831 .b = {
832 .ctl_reg = AHB_EN_REG,
833 .en_mask = BIT(2),
834 .reset_reg = SW_RESET_AHB_REG,
835 .reset_mask = BIT(11),
836 .halt_reg = DBG_BUS_VEC_F_REG,
837 .halt_bit = 3,
838 },
839 .c = {
840 .dbg_name = "gfx2d1_p_clk",
841 .ops = &clk_ops_branch,
842 CLK_INIT(gfx2d1_p_clk.c),
843 },
844};
845
846static struct branch_clk gfx3d_p_clk = {
847 .b = {
848 .ctl_reg = AHB_EN_REG,
849 .en_mask = BIT(3),
850 .reset_reg = SW_RESET_AHB_REG,
851 .reset_mask = BIT(10),
852 .halt_reg = DBG_BUS_VEC_F_REG,
853 .halt_bit = 4,
854 },
855 .c = {
856 .dbg_name = "gfx3d_p_clk",
857 .ops = &clk_ops_branch,
858 CLK_INIT(gfx3d_p_clk.c),
859 },
860};
861
862static struct branch_clk hdmi_m_p_clk = {
863 .b = {
864 .ctl_reg = AHB_EN_REG,
865 .en_mask = BIT(14),
866 .reset_reg = SW_RESET_AHB_REG,
867 .reset_mask = BIT(9),
868 .halt_reg = DBG_BUS_VEC_F_REG,
869 .halt_bit = 5,
870 },
871 .c = {
872 .dbg_name = "hdmi_m_p_clk",
873 .ops = &clk_ops_branch,
874 CLK_INIT(hdmi_m_p_clk.c),
875 },
876};
877
878static struct branch_clk hdmi_s_p_clk = {
879 .b = {
880 .ctl_reg = AHB_EN_REG,
881 .en_mask = BIT(4),
882 .reset_reg = SW_RESET_AHB_REG,
883 .reset_mask = BIT(9),
884 .halt_reg = DBG_BUS_VEC_F_REG,
885 .halt_bit = 6,
886 },
887 .c = {
888 .dbg_name = "hdmi_s_p_clk",
889 .ops = &clk_ops_branch,
890 CLK_INIT(hdmi_s_p_clk.c),
891 },
892};
893
894static struct branch_clk ijpeg_p_clk = {
895 .b = {
896 .ctl_reg = AHB_EN_REG,
897 .en_mask = BIT(5),
898 .reset_reg = SW_RESET_AHB_REG,
899 .reset_mask = BIT(7),
900 .halt_reg = DBG_BUS_VEC_F_REG,
901 .halt_bit = 9,
902 },
903 .c = {
904 .dbg_name = "ijpeg_p_clk",
905 .ops = &clk_ops_branch,
906 CLK_INIT(ijpeg_p_clk.c),
907 },
908};
909
910static struct branch_clk imem_p_clk = {
911 .b = {
912 .ctl_reg = AHB_EN_REG,
913 .en_mask = BIT(6),
914 .reset_reg = SW_RESET_AHB_REG,
915 .reset_mask = BIT(8),
916 .halt_reg = DBG_BUS_VEC_F_REG,
917 .halt_bit = 10,
918 },
919 .c = {
920 .dbg_name = "imem_p_clk",
921 .ops = &clk_ops_branch,
922 CLK_INIT(imem_p_clk.c),
923 },
924};
925
926static struct branch_clk jpegd_p_clk = {
927 .b = {
928 .ctl_reg = AHB_EN_REG,
929 .en_mask = BIT(21),
930 .reset_reg = SW_RESET_AHB_REG,
931 .reset_mask = BIT(4),
932 .halt_reg = DBG_BUS_VEC_F_REG,
933 .halt_bit = 7,
934 },
935 .c = {
936 .dbg_name = "jpegd_p_clk",
937 .ops = &clk_ops_branch,
938 CLK_INIT(jpegd_p_clk.c),
939 },
940};
941
942static struct branch_clk mdp_p_clk = {
943 .b = {
944 .ctl_reg = AHB_EN_REG,
945 .en_mask = BIT(10),
946 .reset_reg = SW_RESET_AHB_REG,
947 .reset_mask = BIT(3),
948 .halt_reg = DBG_BUS_VEC_F_REG,
949 .halt_bit = 11,
950 },
951 .c = {
952 .dbg_name = "mdp_p_clk",
953 .ops = &clk_ops_branch,
954 CLK_INIT(mdp_p_clk.c),
955 },
956};
957
958static struct branch_clk rot_p_clk = {
959 .b = {
960 .ctl_reg = AHB_EN_REG,
961 .en_mask = BIT(12),
962 .reset_reg = SW_RESET_AHB_REG,
963 .reset_mask = BIT(2),
964 .halt_reg = DBG_BUS_VEC_F_REG,
965 .halt_bit = 13,
966 },
967 .c = {
968 .dbg_name = "rot_p_clk",
969 .ops = &clk_ops_branch,
970 CLK_INIT(rot_p_clk.c),
971 },
972};
973
974static struct branch_clk smmu_p_clk = {
975 .b = {
976 .ctl_reg = AHB_EN_REG,
977 .en_mask = BIT(15),
978 .halt_reg = DBG_BUS_VEC_F_REG,
979 .halt_bit = 22,
980 },
981 .c = {
982 .dbg_name = "smmu_p_clk",
983 .ops = &clk_ops_branch,
984 CLK_INIT(smmu_p_clk.c),
985 },
986};
987
988static struct branch_clk tv_enc_p_clk = {
989 .b = {
990 .ctl_reg = AHB_EN_REG,
991 .en_mask = BIT(25),
992 .reset_reg = SW_RESET_AHB_REG,
993 .reset_mask = BIT(15),
994 .halt_reg = DBG_BUS_VEC_F_REG,
995 .halt_bit = 23,
996 },
997 .c = {
998 .dbg_name = "tv_enc_p_clk",
999 .ops = &clk_ops_branch,
1000 CLK_INIT(tv_enc_p_clk.c),
1001 },
1002};
1003
1004static struct branch_clk vcodec_p_clk = {
1005 .b = {
1006 .ctl_reg = AHB_EN_REG,
1007 .en_mask = BIT(11),
1008 .reset_reg = SW_RESET_AHB_REG,
1009 .reset_mask = BIT(1),
1010 .halt_reg = DBG_BUS_VEC_F_REG,
1011 .halt_bit = 12,
1012 },
1013 .c = {
1014 .dbg_name = "vcodec_p_clk",
1015 .ops = &clk_ops_branch,
1016 CLK_INIT(vcodec_p_clk.c),
1017 },
1018};
1019
1020static struct branch_clk vfe_p_clk = {
1021 .b = {
1022 .ctl_reg = AHB_EN_REG,
1023 .en_mask = BIT(13),
1024 .reset_reg = SW_RESET_AHB_REG,
1025 .reset_mask = BIT(0),
1026 .halt_reg = DBG_BUS_VEC_F_REG,
1027 .halt_bit = 14,
1028 },
1029 .c = {
1030 .dbg_name = "vfe_p_clk",
1031 .ops = &clk_ops_branch,
1032 CLK_INIT(vfe_p_clk.c),
1033 },
1034};
1035
1036static struct branch_clk vpe_p_clk = {
1037 .b = {
1038 .ctl_reg = AHB_EN_REG,
1039 .en_mask = BIT(16),
1040 .reset_reg = SW_RESET_AHB_REG,
1041 .reset_mask = BIT(14),
1042 .halt_reg = DBG_BUS_VEC_F_REG,
1043 .halt_bit = 15,
1044 },
1045 .c = {
1046 .dbg_name = "vpe_p_clk",
1047 .ops = &clk_ops_branch,
1048 CLK_INIT(vpe_p_clk.c),
1049 },
1050};
1051
1052/*
1053 * Peripheral Clocks
1054 */
Matt Wagantall7625a4c2011-11-01 16:17:53 -07001055#define CLK_GP(i, n, h_r, h_b) \
1056 struct rcg_clk i##_clk = { \
1057 .b = { \
1058 .ctl_reg = GPn_NS_REG(n), \
1059 .en_mask = BIT(9), \
1060 .halt_reg = h_r, \
1061 .halt_bit = h_b, \
1062 }, \
1063 .ns_reg = GPn_NS_REG(n), \
1064 .md_reg = GPn_MD_REG(n), \
1065 .root_en_mask = BIT(11), \
1066 .ns_mask = (BM(23, 16) | BM(6, 0)), \
1067 .set_rate = set_rate_mnd, \
1068 .freq_tbl = clk_tbl_gp, \
1069 .current_freq = &rcg_dummy_freq, \
1070 .c = { \
1071 .dbg_name = #i "_clk", \
1072 .ops = &clk_ops_rcg_8x60, \
1073 VDD_DIG_FMAX_MAP1(LOW, 27000000), \
1074 CLK_INIT(i##_clk.c), \
1075 }, \
1076 }
1077#define F_GP(f, s, d, m, n) \
1078 { \
1079 .freq_hz = f, \
1080 .src_clk = &s##_clk.c, \
1081 .md_val = MD8(16, m, 0, n), \
1082 .ns_val = NS(23, 16, n, m, 5, 4, 3, d, 2, 0, s##_to_bb_mux), \
1083 .mnd_en_mask = BIT(8) * !!(n), \
1084 }
1085static struct clk_freq_tbl clk_tbl_gp[] = {
1086 F_GP( 0, gnd, 1, 0, 0),
1087 F_GP( 9600000, cxo, 2, 0, 0),
1088 F_GP( 13500000, pxo, 2, 0, 0),
1089 F_GP( 19200000, cxo, 1, 0, 0),
1090 F_GP( 27000000, pxo, 1, 0, 0),
1091 F_END
1092};
1093
1094static CLK_GP(gp0, 0, CLK_HALT_SFPB_MISC_STATE_REG, 7);
1095static CLK_GP(gp1, 1, CLK_HALT_SFPB_MISC_STATE_REG, 6);
1096static CLK_GP(gp2, 2, CLK_HALT_SFPB_MISC_STATE_REG, 5);
1097
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07001098#define CLK_GSBI_UART(i, n, h_r, h_b) \
1099 struct rcg_clk i##_clk = { \
1100 .b = { \
1101 .ctl_reg = GSBIn_UART_APPS_NS_REG(n), \
1102 .en_mask = BIT(9), \
1103 .reset_reg = GSBIn_RESET_REG(n), \
1104 .reset_mask = BIT(0), \
1105 .halt_reg = h_r, \
1106 .halt_bit = h_b, \
1107 }, \
1108 .ns_reg = GSBIn_UART_APPS_NS_REG(n), \
1109 .md_reg = GSBIn_UART_APPS_MD_REG(n), \
1110 .root_en_mask = BIT(11), \
1111 .ns_mask = (BM(31, 16) | BM(6, 0)), \
1112 .set_rate = set_rate_mnd, \
1113 .freq_tbl = clk_tbl_gsbi_uart, \
Matt Wagantall84f43fd2011-08-16 23:28:38 -07001114 .current_freq = &rcg_dummy_freq, \
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07001115 .c = { \
1116 .dbg_name = #i "_clk", \
Matt Wagantall84f43fd2011-08-16 23:28:38 -07001117 .ops = &clk_ops_rcg_8x60, \
Matt Wagantalle18bbc82011-10-06 10:07:28 -07001118 VDD_DIG_FMAX_MAP2(LOW, 32000000, NOMINAL, 64000000), \
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07001119 CLK_INIT(i##_clk.c), \
1120 }, \
1121 }
Matt Wagantalle18bbc82011-10-06 10:07:28 -07001122#define F_GSBI_UART(f, s, d, m, n) \
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07001123 { \
1124 .freq_hz = f, \
1125 .src_clk = &s##_clk.c, \
1126 .md_val = MD16(m, n), \
1127 .ns_val = NS(31, 16, n, m, 5, 4, 3, d, 2, 0, s##_to_bb_mux), \
1128 .mnd_en_mask = BIT(8) * !!(n), \
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07001129 }
1130static struct clk_freq_tbl clk_tbl_gsbi_uart[] = {
Matt Wagantalle18bbc82011-10-06 10:07:28 -07001131 F_GSBI_UART( 0, gnd, 1, 0, 0),
1132 F_GSBI_UART( 1843200, pll8, 1, 3, 625),
1133 F_GSBI_UART( 3686400, pll8, 1, 6, 625),
1134 F_GSBI_UART( 7372800, pll8, 1, 12, 625),
1135 F_GSBI_UART(14745600, pll8, 1, 24, 625),
1136 F_GSBI_UART(16000000, pll8, 4, 1, 6),
1137 F_GSBI_UART(24000000, pll8, 4, 1, 4),
1138 F_GSBI_UART(32000000, pll8, 4, 1, 3),
1139 F_GSBI_UART(40000000, pll8, 1, 5, 48),
1140 F_GSBI_UART(46400000, pll8, 1, 29, 240),
1141 F_GSBI_UART(48000000, pll8, 4, 1, 2),
1142 F_GSBI_UART(51200000, pll8, 1, 2, 15),
1143 F_GSBI_UART(56000000, pll8, 1, 7, 48),
1144 F_GSBI_UART(58982400, pll8, 1, 96, 625),
1145 F_GSBI_UART(64000000, pll8, 2, 1, 3),
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07001146 F_END
1147};
1148
1149static CLK_GSBI_UART(gsbi1_uart, 1, CLK_HALT_CFPB_STATEA_REG, 10);
1150static CLK_GSBI_UART(gsbi2_uart, 2, CLK_HALT_CFPB_STATEA_REG, 6);
1151static CLK_GSBI_UART(gsbi3_uart, 3, CLK_HALT_CFPB_STATEA_REG, 2);
1152static CLK_GSBI_UART(gsbi4_uart, 4, CLK_HALT_CFPB_STATEB_REG, 26);
1153static CLK_GSBI_UART(gsbi5_uart, 5, CLK_HALT_CFPB_STATEB_REG, 22);
1154static CLK_GSBI_UART(gsbi6_uart, 6, CLK_HALT_CFPB_STATEB_REG, 18);
1155static CLK_GSBI_UART(gsbi7_uart, 7, CLK_HALT_CFPB_STATEB_REG, 14);
1156static CLK_GSBI_UART(gsbi8_uart, 8, CLK_HALT_CFPB_STATEB_REG, 10);
1157static CLK_GSBI_UART(gsbi9_uart, 9, CLK_HALT_CFPB_STATEB_REG, 6);
1158static CLK_GSBI_UART(gsbi10_uart, 10, CLK_HALT_CFPB_STATEB_REG, 2);
1159static CLK_GSBI_UART(gsbi11_uart, 11, CLK_HALT_CFPB_STATEC_REG, 17);
1160static CLK_GSBI_UART(gsbi12_uart, 12, CLK_HALT_CFPB_STATEC_REG, 13);
1161
1162#define CLK_GSBI_QUP(i, n, h_r, h_b) \
1163 struct rcg_clk i##_clk = { \
1164 .b = { \
1165 .ctl_reg = GSBIn_QUP_APPS_NS_REG(n), \
1166 .en_mask = BIT(9), \
1167 .reset_reg = GSBIn_RESET_REG(n), \
1168 .reset_mask = BIT(0), \
1169 .halt_reg = h_r, \
1170 .halt_bit = h_b, \
1171 }, \
1172 .ns_reg = GSBIn_QUP_APPS_NS_REG(n), \
1173 .md_reg = GSBIn_QUP_APPS_MD_REG(n), \
1174 .root_en_mask = BIT(11), \
1175 .ns_mask = (BM(23, 16) | BM(6, 0)), \
1176 .set_rate = set_rate_mnd, \
1177 .freq_tbl = clk_tbl_gsbi_qup, \
Matt Wagantall84f43fd2011-08-16 23:28:38 -07001178 .current_freq = &rcg_dummy_freq, \
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07001179 .c = { \
1180 .dbg_name = #i "_clk", \
Matt Wagantall84f43fd2011-08-16 23:28:38 -07001181 .ops = &clk_ops_rcg_8x60, \
Matt Wagantalle18bbc82011-10-06 10:07:28 -07001182 VDD_DIG_FMAX_MAP2(LOW, 24000000, NOMINAL, 52000000), \
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07001183 CLK_INIT(i##_clk.c), \
1184 }, \
1185 }
Matt Wagantalle18bbc82011-10-06 10:07:28 -07001186#define F_GSBI_QUP(f, s, d, m, n) \
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07001187 { \
1188 .freq_hz = f, \
1189 .src_clk = &s##_clk.c, \
1190 .md_val = MD8(16, m, 0, n), \
1191 .ns_val = NS(23, 16, n, m, 5, 4, 3, d, 2, 0, s##_to_bb_mux), \
1192 .mnd_en_mask = BIT(8) * !!(n), \
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07001193 }
1194static struct clk_freq_tbl clk_tbl_gsbi_qup[] = {
Matt Wagantalle18bbc82011-10-06 10:07:28 -07001195 F_GSBI_QUP( 0, gnd, 1, 0, 0),
1196 F_GSBI_QUP( 1100000, pxo, 1, 2, 49),
1197 F_GSBI_QUP( 5400000, pxo, 1, 1, 5),
1198 F_GSBI_QUP(10800000, pxo, 1, 2, 5),
1199 F_GSBI_QUP(15060000, pll8, 1, 2, 51),
1200 F_GSBI_QUP(24000000, pll8, 4, 1, 4),
1201 F_GSBI_QUP(25600000, pll8, 1, 1, 15),
1202 F_GSBI_QUP(27000000, pxo, 1, 0, 0),
1203 F_GSBI_QUP(48000000, pll8, 4, 1, 2),
1204 F_GSBI_QUP(51200000, pll8, 1, 2, 15),
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07001205 F_END
1206};
1207
1208static CLK_GSBI_QUP(gsbi1_qup, 1, CLK_HALT_CFPB_STATEA_REG, 9);
1209static CLK_GSBI_QUP(gsbi2_qup, 2, CLK_HALT_CFPB_STATEA_REG, 4);
1210static CLK_GSBI_QUP(gsbi3_qup, 3, CLK_HALT_CFPB_STATEA_REG, 0);
1211static CLK_GSBI_QUP(gsbi4_qup, 4, CLK_HALT_CFPB_STATEB_REG, 24);
1212static CLK_GSBI_QUP(gsbi5_qup, 5, CLK_HALT_CFPB_STATEB_REG, 20);
1213static CLK_GSBI_QUP(gsbi6_qup, 6, CLK_HALT_CFPB_STATEB_REG, 16);
1214static CLK_GSBI_QUP(gsbi7_qup, 7, CLK_HALT_CFPB_STATEB_REG, 12);
1215static CLK_GSBI_QUP(gsbi8_qup, 8, CLK_HALT_CFPB_STATEB_REG, 8);
1216static CLK_GSBI_QUP(gsbi9_qup, 9, CLK_HALT_CFPB_STATEB_REG, 4);
1217static CLK_GSBI_QUP(gsbi10_qup, 10, CLK_HALT_CFPB_STATEB_REG, 0);
1218static CLK_GSBI_QUP(gsbi11_qup, 11, CLK_HALT_CFPB_STATEC_REG, 15);
1219static CLK_GSBI_QUP(gsbi12_qup, 12, CLK_HALT_CFPB_STATEC_REG, 11);
1220
Matt Wagantalle18bbc82011-10-06 10:07:28 -07001221#define F_PDM(f, s, d) \
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07001222 { \
1223 .freq_hz = f, \
1224 .src_clk = &s##_clk.c, \
1225 .ns_val = NS_SRC_SEL(1, 0, s##_to_xo_mux), \
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07001226 }
1227static struct clk_freq_tbl clk_tbl_pdm[] = {
Matt Wagantalle18bbc82011-10-06 10:07:28 -07001228 F_PDM( 0, gnd, 1),
1229 F_PDM(27000000, pxo, 1),
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07001230 F_END
1231};
1232
1233static struct rcg_clk pdm_clk = {
1234 .b = {
1235 .ctl_reg = PDM_CLK_NS_REG,
1236 .en_mask = BIT(9),
1237 .reset_reg = PDM_CLK_NS_REG,
1238 .reset_mask = BIT(12),
1239 .halt_reg = CLK_HALT_CFPB_STATEC_REG,
1240 .halt_bit = 3,
1241 },
1242 .ns_reg = PDM_CLK_NS_REG,
1243 .root_en_mask = BIT(11),
1244 .ns_mask = BM(1, 0),
1245 .set_rate = set_rate_nop,
1246 .freq_tbl = clk_tbl_pdm,
Matt Wagantall84f43fd2011-08-16 23:28:38 -07001247 .current_freq = &rcg_dummy_freq,
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07001248 .c = {
1249 .dbg_name = "pdm_clk",
Matt Wagantall84f43fd2011-08-16 23:28:38 -07001250 .ops = &clk_ops_rcg_8x60,
Matt Wagantalle18bbc82011-10-06 10:07:28 -07001251 VDD_DIG_FMAX_MAP1(LOW, 27000000),
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07001252 CLK_INIT(pdm_clk.c),
1253 },
1254};
1255
1256static struct branch_clk pmem_clk = {
1257 .b = {
1258 .ctl_reg = PMEM_ACLK_CTL_REG,
1259 .en_mask = BIT(4),
1260 .halt_reg = CLK_HALT_DFAB_STATE_REG,
1261 .halt_bit = 20,
1262 },
1263 .c = {
1264 .dbg_name = "pmem_clk",
1265 .ops = &clk_ops_branch,
1266 CLK_INIT(pmem_clk.c),
1267 },
1268};
1269
Matt Wagantalle18bbc82011-10-06 10:07:28 -07001270#define F_PRNG(f, s) \
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07001271 { \
1272 .freq_hz = f, \
1273 .src_clk = &s##_clk.c, \
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07001274 }
1275static struct clk_freq_tbl clk_tbl_prng[] = {
Matt Wagantalle18bbc82011-10-06 10:07:28 -07001276 F_PRNG(64000000, pll8),
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07001277 F_END
1278};
1279
1280static struct rcg_clk prng_clk = {
1281 .b = {
1282 .ctl_reg = SC0_U_CLK_BRANCH_ENA_VOTE_REG,
1283 .en_mask = BIT(10),
1284 .halt_reg = CLK_HALT_SFPB_MISC_STATE_REG,
1285 .halt_check = HALT_VOTED,
1286 .halt_bit = 10,
1287 },
1288 .set_rate = set_rate_nop,
1289 .freq_tbl = clk_tbl_prng,
Matt Wagantall84f43fd2011-08-16 23:28:38 -07001290 .current_freq = &rcg_dummy_freq,
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07001291 .c = {
1292 .dbg_name = "prng_clk",
Matt Wagantall84f43fd2011-08-16 23:28:38 -07001293 .ops = &clk_ops_rcg_8x60,
Matt Wagantalle18bbc82011-10-06 10:07:28 -07001294 VDD_DIG_FMAX_MAP2(LOW, 32000000, NOMINAL, 65000000),
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07001295 CLK_INIT(prng_clk.c),
1296 },
1297};
1298
1299#define CLK_SDC(i, n, h_r, h_b) \
1300 struct rcg_clk i##_clk = { \
1301 .b = { \
1302 .ctl_reg = SDCn_APPS_CLK_NS_REG(n), \
1303 .en_mask = BIT(9), \
1304 .reset_reg = SDCn_RESET_REG(n), \
1305 .reset_mask = BIT(0), \
1306 .halt_reg = h_r, \
1307 .halt_bit = h_b, \
1308 }, \
1309 .ns_reg = SDCn_APPS_CLK_NS_REG(n), \
1310 .md_reg = SDCn_APPS_CLK_MD_REG(n), \
1311 .root_en_mask = BIT(11), \
1312 .ns_mask = (BM(23, 16) | BM(6, 0)), \
1313 .set_rate = set_rate_mnd, \
1314 .freq_tbl = clk_tbl_sdc, \
Matt Wagantall84f43fd2011-08-16 23:28:38 -07001315 .current_freq = &rcg_dummy_freq, \
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07001316 .c = { \
1317 .dbg_name = #i "_clk", \
Matt Wagantall84f43fd2011-08-16 23:28:38 -07001318 .ops = &clk_ops_rcg_8x60, \
Matt Wagantalle18bbc82011-10-06 10:07:28 -07001319 VDD_DIG_FMAX_MAP2(LOW, 25000000, NOMINAL, 50000000), \
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07001320 CLK_INIT(i##_clk.c), \
1321 }, \
1322 }
Matt Wagantalle18bbc82011-10-06 10:07:28 -07001323#define F_SDC(f, s, d, m, n) \
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07001324 { \
1325 .freq_hz = f, \
1326 .src_clk = &s##_clk.c, \
1327 .md_val = MD8(16, m, 0, n), \
1328 .ns_val = NS(23, 16, n, m, 5, 4, 3, d, 2, 0, s##_to_bb_mux), \
1329 .mnd_en_mask = BIT(8) * !!(n), \
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07001330 }
1331static struct clk_freq_tbl clk_tbl_sdc[] = {
Matt Wagantalle18bbc82011-10-06 10:07:28 -07001332 F_SDC( 0, gnd, 1, 0, 0),
1333 F_SDC( 144000, pxo, 3, 2, 125),
1334 F_SDC( 400000, pll8, 4, 1, 240),
1335 F_SDC(16000000, pll8, 4, 1, 6),
1336 F_SDC(17070000, pll8, 1, 2, 45),
1337 F_SDC(20210000, pll8, 1, 1, 19),
1338 F_SDC(24000000, pll8, 4, 1, 4),
1339 F_SDC(48000000, pll8, 4, 1, 2),
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07001340 F_END
1341};
1342
1343static CLK_SDC(sdc1, 1, CLK_HALT_DFAB_STATE_REG, 6);
1344static CLK_SDC(sdc2, 2, CLK_HALT_DFAB_STATE_REG, 5);
1345static CLK_SDC(sdc3, 3, CLK_HALT_DFAB_STATE_REG, 4);
1346static CLK_SDC(sdc4, 4, CLK_HALT_DFAB_STATE_REG, 3);
1347static CLK_SDC(sdc5, 5, CLK_HALT_DFAB_STATE_REG, 2);
1348
Matt Wagantalle18bbc82011-10-06 10:07:28 -07001349#define F_TSIF_REF(f, s, d, m, n) \
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07001350 { \
1351 .freq_hz = f, \
1352 .src_clk = &s##_clk.c, \
1353 .md_val = MD16(m, n), \
1354 .ns_val = NS(31, 16, n, m, 5, 4, 3, d, 2, 0, s##_to_bb_mux), \
1355 .mnd_en_mask = BIT(8) * !!(n), \
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07001356 }
1357static struct clk_freq_tbl clk_tbl_tsif_ref[] = {
Matt Wagantalle18bbc82011-10-06 10:07:28 -07001358 F_TSIF_REF( 0, gnd, 1, 0, 0),
1359 F_TSIF_REF(105000, pxo, 1, 1, 256),
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07001360 F_END
1361};
1362
1363static struct rcg_clk tsif_ref_clk = {
1364 .b = {
1365 .ctl_reg = TSIF_REF_CLK_NS_REG,
1366 .en_mask = BIT(9),
1367 .halt_reg = CLK_HALT_CFPB_STATEC_REG,
1368 .halt_bit = 5,
1369 },
1370 .ns_reg = TSIF_REF_CLK_NS_REG,
1371 .md_reg = TSIF_REF_CLK_MD_REG,
1372 .root_en_mask = BIT(11),
1373 .ns_mask = (BM(31, 16) | BM(6, 0)),
1374 .set_rate = set_rate_mnd,
1375 .freq_tbl = clk_tbl_tsif_ref,
Matt Wagantall84f43fd2011-08-16 23:28:38 -07001376 .current_freq = &rcg_dummy_freq,
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07001377 .c = {
1378 .dbg_name = "tsif_ref_clk",
Matt Wagantall84f43fd2011-08-16 23:28:38 -07001379 .ops = &clk_ops_rcg_8x60,
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07001380 CLK_INIT(tsif_ref_clk.c),
1381 },
1382};
1383
Matt Wagantalle18bbc82011-10-06 10:07:28 -07001384#define F_TSSC(f, s) \
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07001385 { \
1386 .freq_hz = f, \
1387 .src_clk = &s##_clk.c, \
1388 .ns_val = NS_SRC_SEL(1, 0, s##_to_xo_mux), \
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07001389 }
1390static struct clk_freq_tbl clk_tbl_tssc[] = {
Matt Wagantalle18bbc82011-10-06 10:07:28 -07001391 F_TSSC( 0, gnd),
1392 F_TSSC(27000000, pxo),
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07001393 F_END
1394};
1395
1396static struct rcg_clk tssc_clk = {
1397 .b = {
1398 .ctl_reg = TSSC_CLK_CTL_REG,
1399 .en_mask = BIT(4),
1400 .halt_reg = CLK_HALT_CFPB_STATEC_REG,
1401 .halt_bit = 4,
1402 },
1403 .ns_reg = TSSC_CLK_CTL_REG,
1404 .ns_mask = BM(1, 0),
1405 .set_rate = set_rate_nop,
1406 .freq_tbl = clk_tbl_tssc,
Matt Wagantall84f43fd2011-08-16 23:28:38 -07001407 .current_freq = &rcg_dummy_freq,
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07001408 .c = {
1409 .dbg_name = "tssc_clk",
Matt Wagantall84f43fd2011-08-16 23:28:38 -07001410 .ops = &clk_ops_rcg_8x60,
Matt Wagantalle18bbc82011-10-06 10:07:28 -07001411 VDD_DIG_FMAX_MAP1(LOW, 27000000),
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07001412 CLK_INIT(tssc_clk.c),
1413 },
1414};
1415
Matt Wagantalle18bbc82011-10-06 10:07:28 -07001416#define F_USB(f, s, d, m, n) \
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07001417 { \
1418 .freq_hz = f, \
1419 .src_clk = &s##_clk.c, \
1420 .md_val = MD8(16, m, 0, n), \
1421 .ns_val = NS(23, 16, n, m, 5, 4, 3, d, 2, 0, s##_to_bb_mux), \
1422 .mnd_en_mask = BIT(8) * !!(n), \
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07001423 }
1424static struct clk_freq_tbl clk_tbl_usb[] = {
Matt Wagantalle18bbc82011-10-06 10:07:28 -07001425 F_USB( 0, gnd, 1, 0, 0),
1426 F_USB(60000000, pll8, 1, 5, 32),
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07001427 F_END
1428};
1429
1430static struct rcg_clk usb_hs1_xcvr_clk = {
1431 .b = {
1432 .ctl_reg = USB_HS1_XCVR_FS_CLK_NS_REG,
1433 .en_mask = BIT(9),
1434 .reset_reg = USB_HS1_RESET_REG,
1435 .reset_mask = BIT(0),
1436 .halt_reg = CLK_HALT_DFAB_STATE_REG,
1437 .halt_bit = 0,
1438 },
1439 .ns_reg = USB_HS1_XCVR_FS_CLK_NS_REG,
1440 .md_reg = USB_HS1_XCVR_FS_CLK_MD_REG,
1441 .root_en_mask = BIT(11),
1442 .ns_mask = (BM(23, 16) | BM(6, 0)),
1443 .set_rate = set_rate_mnd,
1444 .freq_tbl = clk_tbl_usb,
Matt Wagantall84f43fd2011-08-16 23:28:38 -07001445 .current_freq = &rcg_dummy_freq,
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07001446 .c = {
1447 .dbg_name = "usb_hs1_xcvr_clk",
Matt Wagantall84f43fd2011-08-16 23:28:38 -07001448 .ops = &clk_ops_rcg_8x60,
Matt Wagantalle18bbc82011-10-06 10:07:28 -07001449 VDD_DIG_FMAX_MAP1(NOMINAL, 60000000),
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07001450 CLK_INIT(usb_hs1_xcvr_clk.c),
1451 },
1452};
1453
1454static struct branch_clk usb_phy0_clk = {
1455 .b = {
1456 .reset_reg = USB_PHY0_RESET_REG,
1457 .reset_mask = BIT(0),
1458 },
1459 .c = {
1460 .dbg_name = "usb_phy0_clk",
1461 .ops = &clk_ops_reset,
1462 CLK_INIT(usb_phy0_clk.c),
1463 },
1464};
1465
1466#define CLK_USB_FS(i, n) \
1467 struct rcg_clk i##_clk = { \
1468 .ns_reg = USB_FSn_XCVR_FS_CLK_NS_REG(n), \
1469 .b = { \
1470 .ctl_reg = USB_FSn_XCVR_FS_CLK_NS_REG(n), \
1471 .halt_check = NOCHECK, \
1472 }, \
1473 .md_reg = USB_FSn_XCVR_FS_CLK_MD_REG(n), \
1474 .root_en_mask = BIT(11), \
1475 .ns_mask = (BM(23, 16) | BM(6, 0)), \
1476 .set_rate = set_rate_mnd, \
1477 .freq_tbl = clk_tbl_usb, \
Matt Wagantall84f43fd2011-08-16 23:28:38 -07001478 .current_freq = &rcg_dummy_freq, \
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07001479 .c = { \
1480 .dbg_name = #i "_clk", \
Matt Wagantall84f43fd2011-08-16 23:28:38 -07001481 .ops = &clk_ops_rcg_8x60, \
Matt Wagantalle18bbc82011-10-06 10:07:28 -07001482 VDD_DIG_FMAX_MAP1(NOMINAL, 60000000), \
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07001483 CLK_INIT(i##_clk.c), \
1484 }, \
1485 }
1486
1487static CLK_USB_FS(usb_fs1_src, 1);
1488static struct branch_clk usb_fs1_xcvr_clk = {
1489 .b = {
1490 .ctl_reg = USB_FSn_XCVR_FS_CLK_NS_REG(1),
1491 .en_mask = BIT(9),
1492 .reset_reg = USB_FSn_RESET_REG(1),
1493 .reset_mask = BIT(1),
1494 .halt_reg = CLK_HALT_CFPB_STATEA_REG,
1495 .halt_bit = 15,
1496 },
1497 .parent = &usb_fs1_src_clk.c,
1498 .c = {
1499 .dbg_name = "usb_fs1_xcvr_clk",
1500 .ops = &clk_ops_branch,
1501 CLK_INIT(usb_fs1_xcvr_clk.c),
1502 },
1503};
1504
1505static struct branch_clk usb_fs1_sys_clk = {
1506 .b = {
1507 .ctl_reg = USB_FSn_SYSTEM_CLK_CTL_REG(1),
1508 .en_mask = BIT(4),
1509 .reset_reg = USB_FSn_RESET_REG(1),
1510 .reset_mask = BIT(0),
1511 .halt_reg = CLK_HALT_CFPB_STATEA_REG,
1512 .halt_bit = 16,
1513 },
1514 .parent = &usb_fs1_src_clk.c,
1515 .c = {
1516 .dbg_name = "usb_fs1_sys_clk",
1517 .ops = &clk_ops_branch,
1518 CLK_INIT(usb_fs1_sys_clk.c),
1519 },
1520};
1521
1522static CLK_USB_FS(usb_fs2_src, 2);
1523static struct branch_clk usb_fs2_xcvr_clk = {
1524 .b = {
1525 .ctl_reg = USB_FSn_XCVR_FS_CLK_NS_REG(2),
1526 .en_mask = BIT(9),
1527 .reset_reg = USB_FSn_RESET_REG(2),
1528 .reset_mask = BIT(1),
1529 .halt_reg = CLK_HALT_CFPB_STATEA_REG,
1530 .halt_bit = 12,
1531 },
1532 .parent = &usb_fs2_src_clk.c,
1533 .c = {
1534 .dbg_name = "usb_fs2_xcvr_clk",
1535 .ops = &clk_ops_branch,
1536 CLK_INIT(usb_fs2_xcvr_clk.c),
1537 },
1538};
1539
1540static struct branch_clk usb_fs2_sys_clk = {
1541 .b = {
1542 .ctl_reg = USB_FSn_SYSTEM_CLK_CTL_REG(2),
1543 .en_mask = BIT(4),
1544 .reset_reg = USB_FSn_RESET_REG(2),
1545 .reset_mask = BIT(0),
1546 .halt_reg = CLK_HALT_CFPB_STATEA_REG,
1547 .halt_bit = 13,
1548 },
1549 .parent = &usb_fs2_src_clk.c,
1550 .c = {
1551 .dbg_name = "usb_fs2_sys_clk",
1552 .ops = &clk_ops_branch,
1553 CLK_INIT(usb_fs2_sys_clk.c),
1554 },
1555};
1556
1557/* Fast Peripheral Bus Clocks */
1558static struct branch_clk ce2_p_clk = {
1559 .b = {
1560 .ctl_reg = CE2_HCLK_CTL_REG,
1561 .en_mask = BIT(4),
1562 .halt_reg = CLK_HALT_CFPB_STATEC_REG,
1563 .halt_bit = 0,
1564 },
1565 .parent = &pxo_clk.c,
1566 .c = {
1567 .dbg_name = "ce2_p_clk",
1568 .ops = &clk_ops_branch,
1569 CLK_INIT(ce2_p_clk.c),
1570 },
1571};
1572
1573static struct branch_clk gsbi1_p_clk = {
1574 .b = {
1575 .ctl_reg = GSBIn_HCLK_CTL_REG(1),
1576 .en_mask = BIT(4),
1577 .halt_reg = CLK_HALT_CFPB_STATEA_REG,
1578 .halt_bit = 11,
1579 },
1580 .c = {
1581 .dbg_name = "gsbi1_p_clk",
1582 .ops = &clk_ops_branch,
1583 CLK_INIT(gsbi1_p_clk.c),
1584 },
1585};
1586
1587static struct branch_clk gsbi2_p_clk = {
1588 .b = {
1589 .ctl_reg = GSBIn_HCLK_CTL_REG(2),
1590 .en_mask = BIT(4),
1591 .halt_reg = CLK_HALT_CFPB_STATEA_REG,
1592 .halt_bit = 7,
1593 },
1594 .c = {
1595 .dbg_name = "gsbi2_p_clk",
1596 .ops = &clk_ops_branch,
1597 CLK_INIT(gsbi2_p_clk.c),
1598 },
1599};
1600
1601static struct branch_clk gsbi3_p_clk = {
1602 .b = {
1603 .ctl_reg = GSBIn_HCLK_CTL_REG(3),
1604 .en_mask = BIT(4),
1605 .halt_reg = CLK_HALT_CFPB_STATEA_REG,
1606 .halt_bit = 3,
1607 },
1608 .c = {
1609 .dbg_name = "gsbi3_p_clk",
1610 .ops = &clk_ops_branch,
1611 CLK_INIT(gsbi3_p_clk.c),
1612 },
1613};
1614
1615static struct branch_clk gsbi4_p_clk = {
1616 .b = {
1617 .ctl_reg = GSBIn_HCLK_CTL_REG(4),
1618 .en_mask = BIT(4),
1619 .halt_reg = CLK_HALT_CFPB_STATEB_REG,
1620 .halt_bit = 27,
1621 },
1622 .c = {
1623 .dbg_name = "gsbi4_p_clk",
1624 .ops = &clk_ops_branch,
1625 CLK_INIT(gsbi4_p_clk.c),
1626 },
1627};
1628
1629static struct branch_clk gsbi5_p_clk = {
1630 .b = {
1631 .ctl_reg = GSBIn_HCLK_CTL_REG(5),
1632 .en_mask = BIT(4),
1633 .halt_reg = CLK_HALT_CFPB_STATEB_REG,
1634 .halt_bit = 23,
1635 },
1636 .c = {
1637 .dbg_name = "gsbi5_p_clk",
1638 .ops = &clk_ops_branch,
1639 CLK_INIT(gsbi5_p_clk.c),
1640 },
1641};
1642
1643static struct branch_clk gsbi6_p_clk = {
1644 .b = {
1645 .ctl_reg = GSBIn_HCLK_CTL_REG(6),
1646 .en_mask = BIT(4),
1647 .halt_reg = CLK_HALT_CFPB_STATEB_REG,
1648 .halt_bit = 19,
1649 },
1650 .c = {
1651 .dbg_name = "gsbi6_p_clk",
1652 .ops = &clk_ops_branch,
1653 CLK_INIT(gsbi6_p_clk.c),
1654 },
1655};
1656
1657static struct branch_clk gsbi7_p_clk = {
1658 .b = {
1659 .ctl_reg = GSBIn_HCLK_CTL_REG(7),
1660 .en_mask = BIT(4),
1661 .halt_reg = CLK_HALT_CFPB_STATEB_REG,
1662 .halt_bit = 15,
1663 },
1664 .c = {
1665 .dbg_name = "gsbi7_p_clk",
1666 .ops = &clk_ops_branch,
1667 CLK_INIT(gsbi7_p_clk.c),
1668 },
1669};
1670
1671static struct branch_clk gsbi8_p_clk = {
1672 .b = {
1673 .ctl_reg = GSBIn_HCLK_CTL_REG(8),
1674 .en_mask = BIT(4),
1675 .halt_reg = CLK_HALT_CFPB_STATEB_REG,
1676 .halt_bit = 11,
1677 },
1678 .c = {
1679 .dbg_name = "gsbi8_p_clk",
1680 .ops = &clk_ops_branch,
1681 CLK_INIT(gsbi8_p_clk.c),
1682 },
1683};
1684
1685static struct branch_clk gsbi9_p_clk = {
1686 .b = {
1687 .ctl_reg = GSBIn_HCLK_CTL_REG(9),
1688 .en_mask = BIT(4),
1689 .halt_reg = CLK_HALT_CFPB_STATEB_REG,
1690 .halt_bit = 7,
1691 },
1692 .c = {
1693 .dbg_name = "gsbi9_p_clk",
1694 .ops = &clk_ops_branch,
1695 CLK_INIT(gsbi9_p_clk.c),
1696 },
1697};
1698
1699static struct branch_clk gsbi10_p_clk = {
1700 .b = {
1701 .ctl_reg = GSBIn_HCLK_CTL_REG(10),
1702 .en_mask = BIT(4),
1703 .halt_reg = CLK_HALT_CFPB_STATEB_REG,
1704 .halt_bit = 3,
1705 },
1706 .c = {
1707 .dbg_name = "gsbi10_p_clk",
1708 .ops = &clk_ops_branch,
1709 CLK_INIT(gsbi10_p_clk.c),
1710 },
1711};
1712
1713static struct branch_clk gsbi11_p_clk = {
1714 .b = {
1715 .ctl_reg = GSBIn_HCLK_CTL_REG(11),
1716 .en_mask = BIT(4),
1717 .halt_reg = CLK_HALT_CFPB_STATEC_REG,
1718 .halt_bit = 18,
1719 },
1720 .c = {
1721 .dbg_name = "gsbi11_p_clk",
1722 .ops = &clk_ops_branch,
1723 CLK_INIT(gsbi11_p_clk.c),
1724 },
1725};
1726
1727static struct branch_clk gsbi12_p_clk = {
1728 .b = {
1729 .ctl_reg = GSBIn_HCLK_CTL_REG(12),
1730 .en_mask = BIT(4),
1731 .halt_reg = CLK_HALT_CFPB_STATEC_REG,
1732 .halt_bit = 14,
1733 },
1734 .c = {
1735 .dbg_name = "gsbi12_p_clk",
1736 .ops = &clk_ops_branch,
1737 CLK_INIT(gsbi12_p_clk.c),
1738 },
1739};
1740
1741static struct branch_clk ppss_p_clk = {
1742 .b = {
1743 .ctl_reg = PPSS_HCLK_CTL_REG,
1744 .en_mask = BIT(4),
1745 .halt_reg = CLK_HALT_DFAB_STATE_REG,
1746 .halt_bit = 19,
1747 },
1748 .c = {
1749 .dbg_name = "ppss_p_clk",
1750 .ops = &clk_ops_branch,
1751 CLK_INIT(ppss_p_clk.c),
1752 },
1753};
1754
1755static struct branch_clk tsif_p_clk = {
1756 .b = {
1757 .ctl_reg = TSIF_HCLK_CTL_REG,
1758 .en_mask = BIT(4),
1759 .halt_reg = CLK_HALT_CFPB_STATEC_REG,
1760 .halt_bit = 7,
1761 },
1762 .c = {
1763 .dbg_name = "tsif_p_clk",
1764 .ops = &clk_ops_branch,
1765 CLK_INIT(tsif_p_clk.c),
1766 },
1767};
1768
1769static struct branch_clk usb_fs1_p_clk = {
1770 .b = {
1771 .ctl_reg = USB_FSn_HCLK_CTL_REG(1),
1772 .en_mask = BIT(4),
1773 .halt_reg = CLK_HALT_CFPB_STATEA_REG,
1774 .halt_bit = 17,
1775 },
1776 .c = {
1777 .dbg_name = "usb_fs1_p_clk",
1778 .ops = &clk_ops_branch,
1779 CLK_INIT(usb_fs1_p_clk.c),
1780 },
1781};
1782
1783static struct branch_clk usb_fs2_p_clk = {
1784 .b = {
1785 .ctl_reg = USB_FSn_HCLK_CTL_REG(2),
1786 .en_mask = BIT(4),
1787 .halt_reg = CLK_HALT_CFPB_STATEA_REG,
1788 .halt_bit = 14,
1789 },
1790 .c = {
1791 .dbg_name = "usb_fs2_p_clk",
1792 .ops = &clk_ops_branch,
1793 CLK_INIT(usb_fs2_p_clk.c),
1794 },
1795};
1796
1797static struct branch_clk usb_hs1_p_clk = {
1798 .b = {
1799 .ctl_reg = USB_HS1_HCLK_CTL_REG,
1800 .en_mask = BIT(4),
1801 .halt_reg = CLK_HALT_DFAB_STATE_REG,
1802 .halt_bit = 1,
1803 },
1804 .c = {
1805 .dbg_name = "usb_hs1_p_clk",
1806 .ops = &clk_ops_branch,
1807 CLK_INIT(usb_hs1_p_clk.c),
1808 },
1809};
1810
1811static struct branch_clk sdc1_p_clk = {
1812 .b = {
1813 .ctl_reg = SDCn_HCLK_CTL_REG(1),
1814 .en_mask = BIT(4),
1815 .halt_reg = CLK_HALT_DFAB_STATE_REG,
1816 .halt_bit = 11,
1817 },
1818 .c = {
1819 .dbg_name = "sdc1_p_clk",
1820 .ops = &clk_ops_branch,
1821 CLK_INIT(sdc1_p_clk.c),
1822 },
1823};
1824
1825static struct branch_clk sdc2_p_clk = {
1826 .b = {
1827 .ctl_reg = SDCn_HCLK_CTL_REG(2),
1828 .en_mask = BIT(4),
1829 .halt_reg = CLK_HALT_DFAB_STATE_REG,
1830 .halt_bit = 10,
1831 },
1832 .c = {
1833 .dbg_name = "sdc2_p_clk",
1834 .ops = &clk_ops_branch,
1835 CLK_INIT(sdc2_p_clk.c),
1836 },
1837};
1838
1839static struct branch_clk sdc3_p_clk = {
1840 .b = {
1841 .ctl_reg = SDCn_HCLK_CTL_REG(3),
1842 .en_mask = BIT(4),
1843 .halt_reg = CLK_HALT_DFAB_STATE_REG,
1844 .halt_bit = 9,
1845 },
1846 .c = {
1847 .dbg_name = "sdc3_p_clk",
1848 .ops = &clk_ops_branch,
1849 CLK_INIT(sdc3_p_clk.c),
1850 },
1851};
1852
1853static struct branch_clk sdc4_p_clk = {
1854 .b = {
1855 .ctl_reg = SDCn_HCLK_CTL_REG(4),
1856 .en_mask = BIT(4),
1857 .halt_reg = CLK_HALT_DFAB_STATE_REG,
1858 .halt_bit = 8,
1859 },
1860 .c = {
1861 .dbg_name = "sdc4_p_clk",
1862 .ops = &clk_ops_branch,
1863 CLK_INIT(sdc4_p_clk.c),
1864 },
1865};
1866
1867static struct branch_clk sdc5_p_clk = {
1868 .b = {
1869 .ctl_reg = SDCn_HCLK_CTL_REG(5),
1870 .en_mask = BIT(4),
1871 .halt_reg = CLK_HALT_DFAB_STATE_REG,
1872 .halt_bit = 7,
1873 },
1874 .c = {
1875 .dbg_name = "sdc5_p_clk",
1876 .ops = &clk_ops_branch,
1877 CLK_INIT(sdc5_p_clk.c),
1878 },
1879};
1880
Matt Wagantall66cd0932011-09-12 19:04:34 -07001881static struct branch_clk ebi2_2x_clk = {
1882 .b = {
1883 .ctl_reg = EBI2_2X_CLK_CTL_REG,
1884 .en_mask = BIT(4),
1885 .halt_reg = CLK_HALT_CFPB_STATEA_REG,
1886 .halt_bit = 18,
1887 },
1888 .c = {
1889 .dbg_name = "ebi2_2x_clk",
1890 .ops = &clk_ops_branch,
1891 CLK_INIT(ebi2_2x_clk.c),
1892 },
1893};
1894
1895static struct branch_clk ebi2_clk = {
1896 .b = {
1897 .ctl_reg = EBI2_CLK_CTL_REG,
1898 .en_mask = BIT(4),
1899 .halt_reg = CLK_HALT_CFPB_STATEA_REG,
1900 .halt_bit = 19,
1901 },
1902 .c = {
1903 .dbg_name = "ebi2_clk",
1904 .ops = &clk_ops_branch,
1905 CLK_INIT(ebi2_clk.c),
1906 .depends = &ebi2_2x_clk.c,
1907 },
1908};
1909
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07001910/* HW-Voteable Clocks */
1911static struct branch_clk adm0_clk = {
1912 .b = {
1913 .ctl_reg = SC0_U_CLK_BRANCH_ENA_VOTE_REG,
1914 .en_mask = BIT(2),
1915 .halt_reg = CLK_HALT_MSS_SMPSS_MISC_STATE_REG,
1916 .halt_check = HALT_VOTED,
1917 .halt_bit = 14,
1918 },
1919 .parent = &pxo_clk.c,
1920 .c = {
1921 .dbg_name = "adm0_clk",
1922 .ops = &clk_ops_branch,
1923 CLK_INIT(adm0_clk.c),
1924 },
1925};
1926
1927static struct branch_clk adm0_p_clk = {
1928 .b = {
1929 .ctl_reg = SC0_U_CLK_BRANCH_ENA_VOTE_REG,
1930 .en_mask = BIT(3),
1931 .halt_reg = CLK_HALT_MSS_SMPSS_MISC_STATE_REG,
1932 .halt_check = HALT_VOTED,
1933 .halt_bit = 13,
1934 },
1935 .c = {
1936 .dbg_name = "adm0_p_clk",
1937 .ops = &clk_ops_branch,
1938 CLK_INIT(adm0_p_clk.c),
1939 },
1940};
1941
1942static struct branch_clk adm1_clk = {
1943 .b = {
1944 .ctl_reg = SC0_U_CLK_BRANCH_ENA_VOTE_REG,
1945 .en_mask = BIT(4),
1946 .halt_reg = CLK_HALT_MSS_SMPSS_MISC_STATE_REG,
1947 .halt_check = HALT_VOTED,
1948 .halt_bit = 12,
1949 },
1950 .parent = &pxo_clk.c,
1951 .c = {
1952 .dbg_name = "adm1_clk",
1953 .ops = &clk_ops_branch,
1954 CLK_INIT(adm1_clk.c),
1955 },
1956};
1957
1958static struct branch_clk adm1_p_clk = {
1959 .b = {
1960 .ctl_reg = SC0_U_CLK_BRANCH_ENA_VOTE_REG,
1961 .en_mask = BIT(5),
1962 .halt_reg = CLK_HALT_MSS_SMPSS_MISC_STATE_REG,
1963 .halt_check = HALT_VOTED,
1964 .halt_bit = 11,
1965 },
1966 .c = {
1967 .dbg_name = "adm1_p_clk",
1968 .ops = &clk_ops_branch,
1969 CLK_INIT(adm1_p_clk.c),
1970 },
1971};
1972
1973static struct branch_clk modem_ahb1_p_clk = {
1974 .b = {
1975 .ctl_reg = SC0_U_CLK_BRANCH_ENA_VOTE_REG,
1976 .en_mask = BIT(0),
1977 .halt_reg = CLK_HALT_MSS_SMPSS_MISC_STATE_REG,
1978 .halt_check = HALT_VOTED,
1979 .halt_bit = 8,
1980 },
1981 .c = {
1982 .dbg_name = "modem_ahb1_p_clk",
1983 .ops = &clk_ops_branch,
1984 CLK_INIT(modem_ahb1_p_clk.c),
1985 },
1986};
1987
1988static struct branch_clk modem_ahb2_p_clk = {
1989 .b = {
1990 .ctl_reg = SC0_U_CLK_BRANCH_ENA_VOTE_REG,
1991 .en_mask = BIT(1),
1992 .halt_reg = CLK_HALT_MSS_SMPSS_MISC_STATE_REG,
1993 .halt_check = HALT_VOTED,
1994 .halt_bit = 7,
1995 },
1996 .c = {
1997 .dbg_name = "modem_ahb2_p_clk",
1998 .ops = &clk_ops_branch,
1999 CLK_INIT(modem_ahb2_p_clk.c),
2000 },
2001};
2002
2003static struct branch_clk pmic_arb0_p_clk = {
2004 .b = {
2005 .ctl_reg = SC0_U_CLK_BRANCH_ENA_VOTE_REG,
2006 .en_mask = BIT(8),
2007 .halt_reg = CLK_HALT_SFPB_MISC_STATE_REG,
2008 .halt_check = HALT_VOTED,
2009 .halt_bit = 22,
2010 },
2011 .c = {
2012 .dbg_name = "pmic_arb0_p_clk",
2013 .ops = &clk_ops_branch,
2014 CLK_INIT(pmic_arb0_p_clk.c),
2015 },
2016};
2017
2018static struct branch_clk pmic_arb1_p_clk = {
2019 .b = {
2020 .ctl_reg = SC0_U_CLK_BRANCH_ENA_VOTE_REG,
2021 .en_mask = BIT(9),
2022 .halt_reg = CLK_HALT_SFPB_MISC_STATE_REG,
2023 .halt_check = HALT_VOTED,
2024 .halt_bit = 21,
2025 },
2026 .c = {
2027 .dbg_name = "pmic_arb1_p_clk",
2028 .ops = &clk_ops_branch,
2029 CLK_INIT(pmic_arb1_p_clk.c),
2030 },
2031};
2032
2033static struct branch_clk pmic_ssbi2_clk = {
2034 .b = {
2035 .ctl_reg = SC0_U_CLK_BRANCH_ENA_VOTE_REG,
2036 .en_mask = BIT(7),
2037 .halt_reg = CLK_HALT_SFPB_MISC_STATE_REG,
2038 .halt_check = HALT_VOTED,
2039 .halt_bit = 23,
2040 },
2041 .c = {
2042 .dbg_name = "pmic_ssbi2_clk",
2043 .ops = &clk_ops_branch,
2044 CLK_INIT(pmic_ssbi2_clk.c),
2045 },
2046};
2047
2048static struct branch_clk rpm_msg_ram_p_clk = {
2049 .b = {
2050 .ctl_reg = SC0_U_CLK_BRANCH_ENA_VOTE_REG,
2051 .en_mask = BIT(6),
2052 .halt_reg = CLK_HALT_SFPB_MISC_STATE_REG,
2053 .halt_check = HALT_VOTED,
2054 .halt_bit = 12,
2055 },
2056 .c = {
2057 .dbg_name = "rpm_msg_ram_p_clk",
2058 .ops = &clk_ops_branch,
2059 CLK_INIT(rpm_msg_ram_p_clk.c),
2060 },
2061};
2062
2063/*
2064 * Multimedia Clocks
2065 */
2066
2067static struct branch_clk amp_clk = {
2068 .b = {
2069 .reset_reg = SW_RESET_CORE_REG,
2070 .reset_mask = BIT(20),
2071 },
2072 .c = {
2073 .dbg_name = "amp_clk",
2074 .ops = &clk_ops_reset,
2075 CLK_INIT(amp_clk.c),
2076 },
2077};
2078
Matt Wagantalle18bbc82011-10-06 10:07:28 -07002079#define F_CAM(f, s, d, m, n) \
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07002080 { \
2081 .freq_hz = f, \
2082 .src_clk = &s##_clk.c, \
2083 .md_val = MD8(8, m, 0, n), \
2084 .ns_val = NS_MM(31, 24, n, m, 15, 14, d, 2, 0, s##_to_mm_mux), \
2085 .ctl_val = CC(6, n), \
2086 .mnd_en_mask = BIT(5) * !!(n), \
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07002087 }
2088static struct clk_freq_tbl clk_tbl_cam[] = {
Matt Wagantalle18bbc82011-10-06 10:07:28 -07002089 F_CAM( 0, gnd, 1, 0, 0),
2090 F_CAM( 6000000, pll8, 4, 1, 16),
2091 F_CAM( 8000000, pll8, 4, 1, 12),
2092 F_CAM( 12000000, pll8, 4, 1, 8),
2093 F_CAM( 16000000, pll8, 4, 1, 6),
2094 F_CAM( 19200000, pll8, 4, 1, 5),
2095 F_CAM( 24000000, pll8, 4, 1, 4),
2096 F_CAM( 32000000, pll8, 4, 1, 3),
2097 F_CAM( 48000000, pll8, 4, 1, 2),
2098 F_CAM( 64000000, pll8, 3, 1, 2),
2099 F_CAM( 96000000, pll8, 4, 0, 0),
2100 F_CAM(128000000, pll8, 3, 0, 0),
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07002101 F_END
2102};
2103
2104static struct rcg_clk cam_clk = {
2105 .b = {
2106 .ctl_reg = CAMCLK_CC_REG,
2107 .en_mask = BIT(0),
2108 .halt_check = DELAY,
2109 },
2110 .ns_reg = CAMCLK_NS_REG,
2111 .md_reg = CAMCLK_MD_REG,
2112 .root_en_mask = BIT(2),
2113 .ns_mask = (BM(31, 24) | BM(15, 14) | BM(2, 0)),
2114 .ctl_mask = BM(7, 6),
2115 .set_rate = set_rate_mnd_8,
2116 .freq_tbl = clk_tbl_cam,
Matt Wagantall84f43fd2011-08-16 23:28:38 -07002117 .current_freq = &rcg_dummy_freq,
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07002118 .c = {
2119 .dbg_name = "cam_clk",
Matt Wagantall84f43fd2011-08-16 23:28:38 -07002120 .ops = &clk_ops_rcg_8x60,
Matt Wagantalle18bbc82011-10-06 10:07:28 -07002121 VDD_DIG_FMAX_MAP2(LOW, 64000000, NOMINAL, 128000000),
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07002122 CLK_INIT(cam_clk.c),
2123 },
2124};
2125
Matt Wagantalle18bbc82011-10-06 10:07:28 -07002126#define F_CSI(f, s, d) \
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07002127 { \
2128 .freq_hz = f, \
2129 .src_clk = &s##_clk.c, \
2130 .ns_val = NS_DIVSRC(15, 12, d, 2, 0, s##_to_mm_mux), \
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07002131 }
2132static struct clk_freq_tbl clk_tbl_csi[] = {
Matt Wagantalle18bbc82011-10-06 10:07:28 -07002133 F_CSI( 0, gnd, 1),
2134 F_CSI(192000000, pll8, 2),
2135 F_CSI(384000000, pll8, 1),
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07002136 F_END
2137};
2138
2139static struct rcg_clk csi_src_clk = {
2140 .ns_reg = CSI_NS_REG,
2141 .b = {
2142 .ctl_reg = CSI_CC_REG,
2143 .halt_check = NOCHECK,
2144 },
2145 .root_en_mask = BIT(2),
2146 .ns_mask = (BM(15, 12) | BM(2, 0)),
2147 .set_rate = set_rate_nop,
2148 .freq_tbl = clk_tbl_csi,
Matt Wagantall84f43fd2011-08-16 23:28:38 -07002149 .current_freq = &rcg_dummy_freq,
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07002150 .c = {
2151 .dbg_name = "csi_src_clk",
Matt Wagantall84f43fd2011-08-16 23:28:38 -07002152 .ops = &clk_ops_rcg_8x60,
Matt Wagantalle18bbc82011-10-06 10:07:28 -07002153 VDD_DIG_FMAX_MAP2(LOW, 192000000, NOMINAL, 384000000),
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07002154 CLK_INIT(csi_src_clk.c),
2155 },
2156};
2157
2158static struct branch_clk csi0_clk = {
2159 .b = {
2160 .ctl_reg = CSI_CC_REG,
2161 .en_mask = BIT(0),
2162 .reset_reg = SW_RESET_CORE_REG,
2163 .reset_mask = BIT(8),
2164 .halt_reg = DBG_BUS_VEC_B_REG,
2165 .halt_bit = 13,
2166 },
2167 .parent = &csi_src_clk.c,
2168 .c = {
2169 .dbg_name = "csi0_clk",
2170 .ops = &clk_ops_branch,
2171 CLK_INIT(csi0_clk.c),
2172 },
2173};
2174
2175static struct branch_clk csi1_clk = {
2176 .b = {
2177 .ctl_reg = CSI_CC_REG,
2178 .en_mask = BIT(7),
2179 .reset_reg = SW_RESET_CORE_REG,
2180 .reset_mask = BIT(18),
2181 .halt_reg = DBG_BUS_VEC_B_REG,
2182 .halt_bit = 14,
2183 },
2184 .parent = &csi_src_clk.c,
2185 .c = {
2186 .dbg_name = "csi1_clk",
2187 .ops = &clk_ops_branch,
2188 CLK_INIT(csi1_clk.c),
2189 },
2190};
2191
2192#define F_DSI(d) \
2193 { \
2194 .freq_hz = d, \
2195 .ns_val = BVAL(27, 24, (d-1)), \
2196 }
2197/* The DSI_BYTE clock is sourced from the DSI PHY PLL, which may change rate
2198 * without this clock driver knowing. So, overload the clk_set_rate() to set
2199 * the divider (1 to 16) of the clock with respect to the PLL rate. */
2200static struct clk_freq_tbl clk_tbl_dsi_byte[] = {
2201 F_DSI(1), F_DSI(2), F_DSI(3), F_DSI(4),
2202 F_DSI(5), F_DSI(6), F_DSI(7), F_DSI(8),
2203 F_DSI(9), F_DSI(10), F_DSI(11), F_DSI(12),
2204 F_DSI(13), F_DSI(14), F_DSI(15), F_DSI(16),
2205 F_END
2206};
2207
2208
2209static struct rcg_clk dsi_byte_clk = {
2210 .b = {
2211 .ctl_reg = MISC_CC_REG,
2212 .halt_check = DELAY,
2213 .reset_reg = SW_RESET_CORE_REG,
2214 .reset_mask = BIT(7),
2215 },
2216 .ns_reg = MISC_CC2_REG,
2217 .root_en_mask = BIT(2),
2218 .ns_mask = BM(27, 24),
2219 .set_rate = set_rate_nop,
2220 .freq_tbl = clk_tbl_dsi_byte,
Matt Wagantall84f43fd2011-08-16 23:28:38 -07002221 .current_freq = &rcg_dummy_freq,
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07002222 .c = {
2223 .dbg_name = "dsi_byte_clk",
Matt Wagantall84f43fd2011-08-16 23:28:38 -07002224 .ops = &clk_ops_rcg_8x60,
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07002225 CLK_INIT(dsi_byte_clk.c),
2226 },
2227};
2228
2229static struct branch_clk dsi_esc_clk = {
2230 .b = {
2231 .ctl_reg = MISC_CC_REG,
2232 .en_mask = BIT(0),
2233 .halt_reg = DBG_BUS_VEC_B_REG,
2234 .halt_bit = 24,
2235 },
2236 .c = {
2237 .dbg_name = "dsi_esc_clk",
2238 .ops = &clk_ops_branch,
2239 CLK_INIT(dsi_esc_clk.c),
2240 },
2241};
2242
Matt Wagantalle18bbc82011-10-06 10:07:28 -07002243#define F_GFX2D(f, s, m, n) \
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07002244 { \
2245 .freq_hz = f, \
2246 .src_clk = &s##_clk.c, \
2247 .md_val = MD4(4, m, 0, n), \
2248 .ns_val = NS_MND_BANKED4(20, 16, n, m, 3, 0, s##_to_mm_mux), \
2249 .ctl_val = CC_BANKED(9, 6, n), \
2250 .mnd_en_mask = (BIT(8) | BIT(5)) * !!(n), \
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07002251 }
2252static struct clk_freq_tbl clk_tbl_gfx2d[] = {
Matt Wagantalle18bbc82011-10-06 10:07:28 -07002253 F_GFX2D( 0, gnd, 0, 0),
2254 F_GFX2D( 27000000, pxo, 0, 0),
2255 F_GFX2D( 48000000, pll8, 1, 8),
2256 F_GFX2D( 54857000, pll8, 1, 7),
2257 F_GFX2D( 64000000, pll8, 1, 6),
2258 F_GFX2D( 76800000, pll8, 1, 5),
2259 F_GFX2D( 96000000, pll8, 1, 4),
2260 F_GFX2D(128000000, pll8, 1, 3),
2261 F_GFX2D(145455000, pll2, 2, 11),
2262 F_GFX2D(160000000, pll2, 1, 5),
2263 F_GFX2D(177778000, pll2, 2, 9),
2264 F_GFX2D(200000000, pll2, 1, 4),
2265 F_GFX2D(228571000, pll2, 2, 7),
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07002266 F_END
2267};
2268
2269static struct bank_masks bmnd_info_gfx2d0 = {
2270 .bank_sel_mask = BIT(11),
2271 .bank0_mask = {
2272 .md_reg = GFX2D0_MD0_REG,
2273 .ns_mask = BM(23, 20) | BM(5, 3),
2274 .rst_mask = BIT(25),
2275 .mnd_en_mask = BIT(8),
2276 .mode_mask = BM(10, 9),
2277 },
2278 .bank1_mask = {
2279 .md_reg = GFX2D0_MD1_REG,
2280 .ns_mask = BM(19, 16) | BM(2, 0),
2281 .rst_mask = BIT(24),
2282 .mnd_en_mask = BIT(5),
2283 .mode_mask = BM(7, 6),
2284 },
2285};
2286
2287static struct rcg_clk gfx2d0_clk = {
2288 .b = {
2289 .ctl_reg = GFX2D0_CC_REG,
2290 .en_mask = BIT(0),
2291 .reset_reg = SW_RESET_CORE_REG,
2292 .reset_mask = BIT(14),
2293 .halt_reg = DBG_BUS_VEC_A_REG,
2294 .halt_bit = 9,
2295 },
2296 .ns_reg = GFX2D0_NS_REG,
2297 .root_en_mask = BIT(2),
2298 .set_rate = set_rate_mnd_banked,
2299 .freq_tbl = clk_tbl_gfx2d,
Stephen Boydc78d9a72011-07-20 00:46:24 -07002300 .bank_info = &bmnd_info_gfx2d0,
Matt Wagantall84f43fd2011-08-16 23:28:38 -07002301 .current_freq = &rcg_dummy_freq,
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07002302 .c = {
2303 .dbg_name = "gfx2d0_clk",
Matt Wagantall84f43fd2011-08-16 23:28:38 -07002304 .ops = &clk_ops_rcg_8x60,
Matt Wagantalle18bbc82011-10-06 10:07:28 -07002305 VDD_DIG_FMAX_MAP3(LOW, 100000000, NOMINAL, 200000000,
2306 HIGH, 228571000),
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07002307 CLK_INIT(gfx2d0_clk.c),
2308 },
2309};
2310
2311static struct bank_masks bmnd_info_gfx2d1 = {
2312 .bank_sel_mask = BIT(11),
2313 .bank0_mask = {
2314 .md_reg = GFX2D1_MD0_REG,
2315 .ns_mask = BM(23, 20) | BM(5, 3),
2316 .rst_mask = BIT(25),
2317 .mnd_en_mask = BIT(8),
2318 .mode_mask = BM(10, 9),
2319 },
2320 .bank1_mask = {
2321 .md_reg = GFX2D1_MD1_REG,
2322 .ns_mask = BM(19, 16) | BM(2, 0),
2323 .rst_mask = BIT(24),
2324 .mnd_en_mask = BIT(5),
2325 .mode_mask = BM(7, 6),
2326 },
2327};
2328
2329static struct rcg_clk gfx2d1_clk = {
2330 .b = {
2331 .ctl_reg = GFX2D1_CC_REG,
2332 .en_mask = BIT(0),
2333 .reset_reg = SW_RESET_CORE_REG,
2334 .reset_mask = BIT(13),
2335 .halt_reg = DBG_BUS_VEC_A_REG,
2336 .halt_bit = 14,
2337 },
2338 .ns_reg = GFX2D1_NS_REG,
2339 .root_en_mask = BIT(2),
2340 .set_rate = set_rate_mnd_banked,
2341 .freq_tbl = clk_tbl_gfx2d,
Stephen Boydc78d9a72011-07-20 00:46:24 -07002342 .bank_info = &bmnd_info_gfx2d1,
Matt Wagantall84f43fd2011-08-16 23:28:38 -07002343 .current_freq = &rcg_dummy_freq,
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07002344 .c = {
2345 .dbg_name = "gfx2d1_clk",
Matt Wagantall84f43fd2011-08-16 23:28:38 -07002346 .ops = &clk_ops_rcg_8x60,
Matt Wagantalle18bbc82011-10-06 10:07:28 -07002347 VDD_DIG_FMAX_MAP3(LOW, 100000000, NOMINAL, 200000000,
2348 HIGH, 228571000),
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07002349 CLK_INIT(gfx2d1_clk.c),
2350 },
2351};
2352
Matt Wagantalle18bbc82011-10-06 10:07:28 -07002353#define F_GFX3D(f, s, m, n) \
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07002354 { \
2355 .freq_hz = f, \
2356 .src_clk = &s##_clk.c, \
2357 .md_val = MD4(4, m, 0, n), \
2358 .ns_val = NS_MND_BANKED4(18, 14, n, m, 3, 0, s##_to_mm_mux), \
2359 .ctl_val = CC_BANKED(9, 6, n), \
2360 .mnd_en_mask = (BIT(8) | BIT(5)) * !!(n), \
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07002361 }
2362static struct clk_freq_tbl clk_tbl_gfx3d[] = {
Matt Wagantalle18bbc82011-10-06 10:07:28 -07002363 F_GFX3D( 0, gnd, 0, 0),
2364 F_GFX3D( 27000000, pxo, 0, 0),
2365 F_GFX3D( 48000000, pll8, 1, 8),
2366 F_GFX3D( 54857000, pll8, 1, 7),
2367 F_GFX3D( 64000000, pll8, 1, 6),
2368 F_GFX3D( 76800000, pll8, 1, 5),
2369 F_GFX3D( 96000000, pll8, 1, 4),
2370 F_GFX3D(128000000, pll8, 1, 3),
2371 F_GFX3D(145455000, pll2, 2, 11),
2372 F_GFX3D(160000000, pll2, 1, 5),
2373 F_GFX3D(177778000, pll2, 2, 9),
2374 F_GFX3D(200000000, pll2, 1, 4),
2375 F_GFX3D(228571000, pll2, 2, 7),
2376 F_GFX3D(266667000, pll2, 1, 3),
2377 F_GFX3D(320000000, pll2, 2, 5),
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07002378 F_END
2379};
2380
2381static struct bank_masks bmnd_info_gfx3d = {
2382 .bank_sel_mask = BIT(11),
2383 .bank0_mask = {
2384 .md_reg = GFX3D_MD0_REG,
2385 .ns_mask = BM(21, 18) | BM(5, 3),
2386 .rst_mask = BIT(23),
2387 .mnd_en_mask = BIT(8),
2388 .mode_mask = BM(10, 9),
2389 },
2390 .bank1_mask = {
2391 .md_reg = GFX3D_MD1_REG,
2392 .ns_mask = BM(17, 14) | BM(2, 0),
2393 .rst_mask = BIT(22),
2394 .mnd_en_mask = BIT(5),
2395 .mode_mask = BM(7, 6),
2396 },
2397};
2398
2399static struct rcg_clk gfx3d_clk = {
2400 .b = {
2401 .ctl_reg = GFX3D_CC_REG,
2402 .en_mask = BIT(0),
2403 .reset_reg = SW_RESET_CORE_REG,
2404 .reset_mask = BIT(12),
2405 .halt_reg = DBG_BUS_VEC_A_REG,
2406 .halt_bit = 4,
2407 },
2408 .ns_reg = GFX3D_NS_REG,
2409 .root_en_mask = BIT(2),
2410 .set_rate = set_rate_mnd_banked,
2411 .freq_tbl = clk_tbl_gfx3d,
Stephen Boydc78d9a72011-07-20 00:46:24 -07002412 .bank_info = &bmnd_info_gfx3d,
Matt Wagantall84f43fd2011-08-16 23:28:38 -07002413 .current_freq = &rcg_dummy_freq,
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07002414 .c = {
2415 .dbg_name = "gfx3d_clk",
Matt Wagantall84f43fd2011-08-16 23:28:38 -07002416 .ops = &clk_ops_rcg_8x60,
Matt Wagantalle18bbc82011-10-06 10:07:28 -07002417 VDD_DIG_FMAX_MAP3(LOW, 96000000, NOMINAL, 200000000,
2418 HIGH, 320000000),
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07002419 CLK_INIT(gfx3d_clk.c),
Stephen Boyd7fa26742011-08-11 23:22:29 -07002420 .depends = &gmem_axi_clk.c,
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07002421 },
2422};
2423
Matt Wagantalle18bbc82011-10-06 10:07:28 -07002424#define F_IJPEG(f, s, d, m, n) \
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07002425 { \
2426 .freq_hz = f, \
2427 .src_clk = &s##_clk.c, \
2428 .md_val = MD8(8, m, 0, n), \
2429 .ns_val = NS_MM(23, 16, n, m, 15, 12, d, 2, 0, s##_to_mm_mux), \
2430 .ctl_val = CC(6, n), \
2431 .mnd_en_mask = BIT(5) * !!n, \
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07002432 }
2433static struct clk_freq_tbl clk_tbl_ijpeg[] = {
Matt Wagantalle18bbc82011-10-06 10:07:28 -07002434 F_IJPEG( 0, gnd, 1, 0, 0),
2435 F_IJPEG( 27000000, pxo, 1, 0, 0),
2436 F_IJPEG( 36570000, pll8, 1, 2, 21),
2437 F_IJPEG( 54860000, pll8, 7, 0, 0),
2438 F_IJPEG( 96000000, pll8, 4, 0, 0),
2439 F_IJPEG(109710000, pll8, 1, 2, 7),
2440 F_IJPEG(128000000, pll8, 3, 0, 0),
2441 F_IJPEG(153600000, pll8, 1, 2, 5),
2442 F_IJPEG(200000000, pll2, 4, 0, 0),
2443 F_IJPEG(228571000, pll2, 1, 2, 7),
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07002444 F_END
2445};
2446
2447static struct rcg_clk ijpeg_clk = {
2448 .b = {
2449 .ctl_reg = IJPEG_CC_REG,
2450 .en_mask = BIT(0),
2451 .reset_reg = SW_RESET_CORE_REG,
2452 .reset_mask = BIT(9),
2453 .halt_reg = DBG_BUS_VEC_A_REG,
2454 .halt_bit = 24,
2455 },
2456 .ns_reg = IJPEG_NS_REG,
2457 .md_reg = IJPEG_MD_REG,
2458 .root_en_mask = BIT(2),
2459 .ns_mask = (BM(23, 16) | BM(15, 12) | BM(2, 0)),
2460 .ctl_mask = BM(7, 6),
2461 .set_rate = set_rate_mnd,
2462 .freq_tbl = clk_tbl_ijpeg,
Matt Wagantall84f43fd2011-08-16 23:28:38 -07002463 .current_freq = &rcg_dummy_freq,
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07002464 .c = {
2465 .dbg_name = "ijpeg_clk",
Matt Wagantall84f43fd2011-08-16 23:28:38 -07002466 .ops = &clk_ops_rcg_8x60,
Matt Wagantalle18bbc82011-10-06 10:07:28 -07002467 VDD_DIG_FMAX_MAP2(LOW, 110000000, NOMINAL, 228571000),
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07002468 CLK_INIT(ijpeg_clk.c),
Stephen Boyd7fa26742011-08-11 23:22:29 -07002469 .depends = &ijpeg_axi_clk.c,
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07002470 },
2471};
2472
Matt Wagantalle18bbc82011-10-06 10:07:28 -07002473#define F_JPEGD(f, s, d) \
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07002474 { \
2475 .freq_hz = f, \
2476 .src_clk = &s##_clk.c, \
2477 .ns_val = NS_DIVSRC(15, 12, d, 2, 0, s##_to_mm_mux), \
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07002478 }
2479static struct clk_freq_tbl clk_tbl_jpegd[] = {
Matt Wagantalle18bbc82011-10-06 10:07:28 -07002480 F_JPEGD( 0, gnd, 1),
2481 F_JPEGD( 64000000, pll8, 6),
2482 F_JPEGD( 76800000, pll8, 5),
2483 F_JPEGD( 96000000, pll8, 4),
2484 F_JPEGD(160000000, pll2, 5),
2485 F_JPEGD(200000000, pll2, 4),
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07002486 F_END
2487};
2488
2489static struct rcg_clk jpegd_clk = {
2490 .b = {
2491 .ctl_reg = JPEGD_CC_REG,
2492 .en_mask = BIT(0),
2493 .reset_reg = SW_RESET_CORE_REG,
2494 .reset_mask = BIT(19),
2495 .halt_reg = DBG_BUS_VEC_A_REG,
2496 .halt_bit = 19,
2497 },
2498 .ns_reg = JPEGD_NS_REG,
2499 .root_en_mask = BIT(2),
2500 .ns_mask = (BM(15, 12) | BM(2, 0)),
2501 .set_rate = set_rate_nop,
2502 .freq_tbl = clk_tbl_jpegd,
Matt Wagantall84f43fd2011-08-16 23:28:38 -07002503 .current_freq = &rcg_dummy_freq,
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07002504 .c = {
2505 .dbg_name = "jpegd_clk",
Matt Wagantall84f43fd2011-08-16 23:28:38 -07002506 .ops = &clk_ops_rcg_8x60,
Matt Wagantalle18bbc82011-10-06 10:07:28 -07002507 VDD_DIG_FMAX_MAP2(LOW, 96000000, NOMINAL, 200000000),
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07002508 CLK_INIT(jpegd_clk.c),
Stephen Boyd7fa26742011-08-11 23:22:29 -07002509 .depends = &jpegd_axi_clk.c,
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07002510 },
2511};
2512
Matt Wagantalle18bbc82011-10-06 10:07:28 -07002513#define F_MDP(f, s, m, n) \
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07002514 { \
2515 .freq_hz = f, \
2516 .src_clk = &s##_clk.c, \
2517 .md_val = MD8(8, m, 0, n), \
2518 .ns_val = NS_MND_BANKED8(22, 14, n, m, 3, 0, s##_to_mm_mux), \
2519 .ctl_val = CC_BANKED(9, 6, n), \
2520 .mnd_en_mask = (BIT(8) | BIT(5)) * !!(n), \
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07002521 }
2522static struct clk_freq_tbl clk_tbl_mdp[] = {
Matt Wagantalle18bbc82011-10-06 10:07:28 -07002523 F_MDP( 0, gnd, 0, 0),
2524 F_MDP( 9600000, pll8, 1, 40),
2525 F_MDP( 13710000, pll8, 1, 28),
2526 F_MDP( 27000000, pxo, 0, 0),
2527 F_MDP( 29540000, pll8, 1, 13),
2528 F_MDP( 34910000, pll8, 1, 11),
2529 F_MDP( 38400000, pll8, 1, 10),
2530 F_MDP( 59080000, pll8, 2, 13),
2531 F_MDP( 76800000, pll8, 1, 5),
2532 F_MDP( 85330000, pll8, 2, 9),
2533 F_MDP( 96000000, pll8, 1, 4),
2534 F_MDP(128000000, pll8, 1, 3),
2535 F_MDP(160000000, pll2, 1, 5),
2536 F_MDP(177780000, pll2, 2, 9),
2537 F_MDP(200000000, pll2, 1, 4),
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07002538 F_END
2539};
2540
2541static struct bank_masks bmnd_info_mdp = {
2542 .bank_sel_mask = BIT(11),
2543 .bank0_mask = {
2544 .md_reg = MDP_MD0_REG,
2545 .ns_mask = BM(29, 22) | BM(5, 3),
2546 .rst_mask = BIT(31),
2547 .mnd_en_mask = BIT(8),
2548 .mode_mask = BM(10, 9),
2549 },
2550 .bank1_mask = {
2551 .md_reg = MDP_MD1_REG,
2552 .ns_mask = BM(21, 14) | BM(2, 0),
2553 .rst_mask = BIT(30),
2554 .mnd_en_mask = BIT(5),
2555 .mode_mask = BM(7, 6),
2556 },
2557};
2558
2559static struct rcg_clk mdp_clk = {
2560 .b = {
2561 .ctl_reg = MDP_CC_REG,
2562 .en_mask = BIT(0),
2563 .reset_reg = SW_RESET_CORE_REG,
2564 .reset_mask = BIT(21),
2565 .halt_reg = DBG_BUS_VEC_C_REG,
2566 .halt_bit = 10,
2567 },
2568 .ns_reg = MDP_NS_REG,
2569 .root_en_mask = BIT(2),
2570 .set_rate = set_rate_mnd_banked,
2571 .freq_tbl = clk_tbl_mdp,
Stephen Boydc78d9a72011-07-20 00:46:24 -07002572 .bank_info = &bmnd_info_mdp,
Matt Wagantall84f43fd2011-08-16 23:28:38 -07002573 .current_freq = &rcg_dummy_freq,
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07002574 .c = {
2575 .dbg_name = "mdp_clk",
Matt Wagantall84f43fd2011-08-16 23:28:38 -07002576 .ops = &clk_ops_rcg_8x60,
Matt Wagantalle18bbc82011-10-06 10:07:28 -07002577 VDD_DIG_FMAX_MAP3(LOW, 85330000, NOMINAL, 200000000,
2578 HIGH, 228571000),
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07002579 CLK_INIT(mdp_clk.c),
Stephen Boyd7fa26742011-08-11 23:22:29 -07002580 .depends = &mdp_axi_clk.c,
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07002581 },
2582};
2583
Matt Wagantalle18bbc82011-10-06 10:07:28 -07002584#define F_MDP_VSYNC(f, s) \
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07002585 { \
2586 .freq_hz = f, \
2587 .src_clk = &s##_clk.c, \
2588 .ns_val = NS_SRC_SEL(13, 13, s##_to_bb_mux), \
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07002589 }
2590static struct clk_freq_tbl clk_tbl_mdp_vsync[] = {
Matt Wagantalle18bbc82011-10-06 10:07:28 -07002591 F_MDP_VSYNC(27000000, pxo),
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07002592 F_END
2593};
2594
2595static struct rcg_clk mdp_vsync_clk = {
2596 .b = {
2597 .ctl_reg = MISC_CC_REG,
2598 .en_mask = BIT(6),
2599 .reset_reg = SW_RESET_CORE_REG,
2600 .reset_mask = BIT(3),
2601 .halt_reg = DBG_BUS_VEC_B_REG,
2602 .halt_bit = 22,
2603 },
2604 .ns_reg = MISC_CC2_REG,
2605 .ns_mask = BIT(13),
2606 .set_rate = set_rate_nop,
2607 .freq_tbl = clk_tbl_mdp_vsync,
Matt Wagantall84f43fd2011-08-16 23:28:38 -07002608 .current_freq = &rcg_dummy_freq,
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07002609 .c = {
2610 .dbg_name = "mdp_vsync_clk",
Matt Wagantall84f43fd2011-08-16 23:28:38 -07002611 .ops = &clk_ops_rcg_8x60,
Matt Wagantalle18bbc82011-10-06 10:07:28 -07002612 VDD_DIG_FMAX_MAP1(LOW, 27000000),
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07002613 CLK_INIT(mdp_vsync_clk.c),
2614 },
2615};
2616
Matt Wagantalle18bbc82011-10-06 10:07:28 -07002617#define F_PIXEL_MDP(f, s, d, m, n) \
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07002618 { \
2619 .freq_hz = f, \
2620 .src_clk = &s##_clk.c, \
2621 .md_val = MD16(m, n), \
2622 .ns_val = NS_MM(31, 16, n, m, 15, 14, d, 2, 0, s##_to_mm_mux), \
2623 .ctl_val = CC(6, n), \
2624 .mnd_en_mask = BIT(5) * !!(n), \
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07002625 }
2626static struct clk_freq_tbl clk_tbl_pixel_mdp[] = {
Matt Wagantalle18bbc82011-10-06 10:07:28 -07002627 F_PIXEL_MDP( 0, gnd, 1, 0, 0),
2628 F_PIXEL_MDP( 25600000, pll8, 3, 1, 5),
2629 F_PIXEL_MDP( 42667000, pll8, 1, 1, 9),
2630 F_PIXEL_MDP( 43192000, pll8, 1, 64, 569),
2631 F_PIXEL_MDP( 48000000, pll8, 4, 1, 2),
2632 F_PIXEL_MDP( 53990000, pll8, 2, 169, 601),
2633 F_PIXEL_MDP( 64000000, pll8, 2, 1, 3),
2634 F_PIXEL_MDP( 69300000, pll8, 1, 231, 1280),
2635 F_PIXEL_MDP( 76800000, pll8, 1, 1, 5),
2636 F_PIXEL_MDP( 85333000, pll8, 1, 2, 9),
2637 F_PIXEL_MDP(106500000, pll8, 1, 71, 256),
2638 F_PIXEL_MDP(109714000, pll8, 1, 2, 7),
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07002639 F_END
2640};
2641
2642static struct rcg_clk pixel_mdp_clk = {
2643 .ns_reg = PIXEL_NS_REG,
2644 .md_reg = PIXEL_MD_REG,
2645 .b = {
2646 .ctl_reg = PIXEL_CC_REG,
2647 .en_mask = BIT(0),
2648 .reset_reg = SW_RESET_CORE_REG,
2649 .reset_mask = BIT(5),
2650 .halt_reg = DBG_BUS_VEC_C_REG,
2651 .halt_bit = 23,
2652 },
2653 .root_en_mask = BIT(2),
2654 .ns_mask = (BM(31, 16) | BM(15, 14) | BM(2, 0)),
2655 .ctl_mask = BM(7, 6),
2656 .set_rate = set_rate_mnd,
2657 .freq_tbl = clk_tbl_pixel_mdp,
Matt Wagantall84f43fd2011-08-16 23:28:38 -07002658 .current_freq = &rcg_dummy_freq,
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07002659 .c = {
2660 .dbg_name = "pixel_mdp_clk",
Matt Wagantall84f43fd2011-08-16 23:28:38 -07002661 .ops = &clk_ops_rcg_8x60,
Matt Wagantalle18bbc82011-10-06 10:07:28 -07002662 VDD_DIG_FMAX_MAP2(LOW, 85333000, NOMINAL, 170000000),
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07002663 CLK_INIT(pixel_mdp_clk.c),
2664 },
2665};
2666
2667static struct branch_clk pixel_lcdc_clk = {
2668 .b = {
2669 .ctl_reg = PIXEL_CC_REG,
2670 .en_mask = BIT(8),
2671 .halt_reg = DBG_BUS_VEC_C_REG,
2672 .halt_bit = 21,
2673 },
2674 .parent = &pixel_mdp_clk.c,
2675 .c = {
2676 .dbg_name = "pixel_lcdc_clk",
2677 .ops = &clk_ops_branch,
2678 CLK_INIT(pixel_lcdc_clk.c),
2679 },
2680};
2681
Matt Wagantalle18bbc82011-10-06 10:07:28 -07002682#define F_ROT(f, s, d) \
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07002683 { \
2684 .freq_hz = f, \
2685 .src_clk = &s##_clk.c, \
2686 .ns_val = NS_DIVSRC_BANKED(29, 26, 25, 22, d, \
2687 21, 19, 18, 16, s##_to_mm_mux), \
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07002688 }
2689static struct clk_freq_tbl clk_tbl_rot[] = {
Matt Wagantalle18bbc82011-10-06 10:07:28 -07002690 F_ROT( 0, gnd, 1),
2691 F_ROT( 27000000, pxo, 1),
2692 F_ROT( 29540000, pll8, 13),
2693 F_ROT( 32000000, pll8, 12),
2694 F_ROT( 38400000, pll8, 10),
2695 F_ROT( 48000000, pll8, 8),
2696 F_ROT( 54860000, pll8, 7),
2697 F_ROT( 64000000, pll8, 6),
2698 F_ROT( 76800000, pll8, 5),
2699 F_ROT( 96000000, pll8, 4),
2700 F_ROT(100000000, pll2, 8),
2701 F_ROT(114290000, pll2, 7),
2702 F_ROT(133330000, pll2, 6),
2703 F_ROT(160000000, pll2, 5),
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07002704 F_END
2705};
2706
2707static struct bank_masks bdiv_info_rot = {
2708 .bank_sel_mask = BIT(30),
2709 .bank0_mask = {
2710 .ns_mask = BM(25, 22) | BM(18, 16),
2711 },
2712 .bank1_mask = {
2713 .ns_mask = BM(29, 26) | BM(21, 19),
2714 },
2715};
2716
2717static struct rcg_clk rot_clk = {
2718 .b = {
2719 .ctl_reg = ROT_CC_REG,
2720 .en_mask = BIT(0),
2721 .reset_reg = SW_RESET_CORE_REG,
2722 .reset_mask = BIT(2),
2723 .halt_reg = DBG_BUS_VEC_C_REG,
2724 .halt_bit = 15,
2725 },
2726 .ns_reg = ROT_NS_REG,
2727 .root_en_mask = BIT(2),
2728 .set_rate = set_rate_div_banked,
2729 .freq_tbl = clk_tbl_rot,
Stephen Boydc78d9a72011-07-20 00:46:24 -07002730 .bank_info = &bdiv_info_rot,
Matt Wagantall84f43fd2011-08-16 23:28:38 -07002731 .current_freq = &rcg_dummy_freq,
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07002732 .c = {
2733 .dbg_name = "rot_clk",
Matt Wagantall84f43fd2011-08-16 23:28:38 -07002734 .ops = &clk_ops_rcg_8x60,
Matt Wagantalle18bbc82011-10-06 10:07:28 -07002735 VDD_DIG_FMAX_MAP2(LOW, 80000000, NOMINAL, 160000000),
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07002736 CLK_INIT(rot_clk.c),
Stephen Boyd7fa26742011-08-11 23:22:29 -07002737 .depends = &rot_axi_clk.c,
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07002738 },
2739};
2740
Matt Wagantalle18bbc82011-10-06 10:07:28 -07002741#define F_TV(f, s, p_r, d, m, n) \
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07002742 { \
2743 .freq_hz = f, \
2744 .src_clk = &s##_clk.c, \
2745 .md_val = MD8(8, m, 0, n), \
2746 .ns_val = NS_MM(23, 16, n, m, 15, 14, d, 2, 0, s##_to_mm_mux), \
2747 .ctl_val = CC(6, n), \
2748 .mnd_en_mask = BIT(5) * !!(n), \
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07002749 .extra_freq_data = p_r, \
2750 }
2751/* Switching TV freqs requires PLL reconfiguration. */
2752static struct pll_rate mm_pll2_rate[] = {
2753 [0] = PLL_RATE( 7, 6301, 13500, 0, 4, 0x4248B), /* 50400500 Hz */
2754 [1] = PLL_RATE( 8, 0, 0, 0, 4, 0x4248B), /* 54000000 Hz */
2755 [2] = PLL_RATE(16, 2, 125, 0, 4, 0x5248F), /* 108108000 Hz */
2756 [3] = PLL_RATE(22, 0, 0, 2, 4, 0x6248B), /* 148500000 Hz */
2757 [4] = PLL_RATE(44, 0, 0, 2, 4, 0x6248F), /* 297000000 Hz */
2758};
2759static struct clk_freq_tbl clk_tbl_tv[] = {
Matt Wagantalle18bbc82011-10-06 10:07:28 -07002760 F_TV( 0, gnd, &mm_pll2_rate[0], 1, 0, 0),
2761 F_TV( 25200000, pll3, &mm_pll2_rate[0], 2, 0, 0),
2762 F_TV( 27000000, pll3, &mm_pll2_rate[1], 2, 0, 0),
2763 F_TV( 27030000, pll3, &mm_pll2_rate[2], 4, 0, 0),
2764 F_TV( 74250000, pll3, &mm_pll2_rate[3], 2, 0, 0),
2765 F_TV(148500000, pll3, &mm_pll2_rate[4], 2, 0, 0),
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07002766 F_END
2767};
2768
2769static struct rcg_clk tv_src_clk = {
2770 .ns_reg = TV_NS_REG,
2771 .b = {
2772 .ctl_reg = TV_CC_REG,
2773 .halt_check = NOCHECK,
2774 },
2775 .md_reg = TV_MD_REG,
2776 .root_en_mask = BIT(2),
2777 .ns_mask = (BM(23, 16) | BM(15, 14) | BM(2, 0)),
2778 .ctl_mask = BM(7, 6),
2779 .set_rate = set_rate_tv,
2780 .freq_tbl = clk_tbl_tv,
Matt Wagantall84f43fd2011-08-16 23:28:38 -07002781 .current_freq = &rcg_dummy_freq,
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07002782 .c = {
2783 .dbg_name = "tv_src_clk",
Matt Wagantall84f43fd2011-08-16 23:28:38 -07002784 .ops = &clk_ops_rcg_8x60,
Matt Wagantalle18bbc82011-10-06 10:07:28 -07002785 VDD_DIG_FMAX_MAP2(LOW, 27030000, NOMINAL, 149000000),
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07002786 CLK_INIT(tv_src_clk.c),
2787 },
2788};
2789
2790static struct branch_clk tv_enc_clk = {
2791 .b = {
2792 .ctl_reg = TV_CC_REG,
2793 .en_mask = BIT(8),
2794 .reset_reg = SW_RESET_CORE_REG,
2795 .reset_mask = BIT(0),
2796 .halt_reg = DBG_BUS_VEC_D_REG,
2797 .halt_bit = 8,
2798 },
2799 .parent = &tv_src_clk.c,
2800 .c = {
2801 .dbg_name = "tv_enc_clk",
2802 .ops = &clk_ops_branch,
2803 CLK_INIT(tv_enc_clk.c),
2804 },
2805};
2806
2807static struct branch_clk tv_dac_clk = {
2808 .b = {
2809 .ctl_reg = TV_CC_REG,
2810 .en_mask = BIT(10),
2811 .halt_reg = DBG_BUS_VEC_D_REG,
2812 .halt_bit = 9,
2813 },
2814 .parent = &tv_src_clk.c,
2815 .c = {
2816 .dbg_name = "tv_dac_clk",
2817 .ops = &clk_ops_branch,
2818 CLK_INIT(tv_dac_clk.c),
2819 },
2820};
2821
2822static struct branch_clk mdp_tv_clk = {
2823 .b = {
2824 .ctl_reg = TV_CC_REG,
2825 .en_mask = BIT(0),
2826 .reset_reg = SW_RESET_CORE_REG,
2827 .reset_mask = BIT(4),
2828 .halt_reg = DBG_BUS_VEC_D_REG,
2829 .halt_bit = 11,
2830 },
2831 .parent = &tv_src_clk.c,
2832 .c = {
2833 .dbg_name = "mdp_tv_clk",
2834 .ops = &clk_ops_branch,
2835 CLK_INIT(mdp_tv_clk.c),
2836 },
2837};
2838
2839static struct branch_clk hdmi_tv_clk = {
2840 .b = {
2841 .ctl_reg = TV_CC_REG,
2842 .en_mask = BIT(12),
2843 .reset_reg = SW_RESET_CORE_REG,
2844 .reset_mask = BIT(1),
2845 .halt_reg = DBG_BUS_VEC_D_REG,
2846 .halt_bit = 10,
2847 },
2848 .parent = &tv_src_clk.c,
2849 .c = {
2850 .dbg_name = "hdmi_tv_clk",
2851 .ops = &clk_ops_branch,
2852 CLK_INIT(hdmi_tv_clk.c),
2853 },
2854};
2855
2856static struct branch_clk hdmi_app_clk = {
2857 .b = {
2858 .ctl_reg = MISC_CC2_REG,
2859 .en_mask = BIT(11),
2860 .reset_reg = SW_RESET_CORE_REG,
2861 .reset_mask = BIT(11),
2862 .halt_reg = DBG_BUS_VEC_B_REG,
2863 .halt_bit = 25,
2864 },
2865 .c = {
2866 .dbg_name = "hdmi_app_clk",
2867 .ops = &clk_ops_branch,
2868 CLK_INIT(hdmi_app_clk.c),
2869 },
2870};
2871
Matt Wagantalle18bbc82011-10-06 10:07:28 -07002872#define F_VCODEC(f, s, m, n) \
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07002873 { \
2874 .freq_hz = f, \
2875 .src_clk = &s##_clk.c, \
2876 .md_val = MD8(8, m, 0, n), \
2877 .ns_val = NS_MM(18, 11, n, m, 0, 0, 1, 2, 0, s##_to_mm_mux), \
2878 .ctl_val = CC(6, n), \
2879 .mnd_en_mask = BIT(5) * !!(n), \
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07002880 }
2881static struct clk_freq_tbl clk_tbl_vcodec[] = {
Matt Wagantalle18bbc82011-10-06 10:07:28 -07002882 F_VCODEC( 0, gnd, 0, 0),
2883 F_VCODEC( 27000000, pxo, 0, 0),
2884 F_VCODEC( 32000000, pll8, 1, 12),
2885 F_VCODEC( 48000000, pll8, 1, 8),
2886 F_VCODEC( 54860000, pll8, 1, 7),
2887 F_VCODEC( 96000000, pll8, 1, 4),
2888 F_VCODEC(133330000, pll2, 1, 6),
2889 F_VCODEC(200000000, pll2, 1, 4),
2890 F_VCODEC(228570000, pll2, 2, 7),
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07002891 F_END
2892};
2893
2894static struct rcg_clk vcodec_clk = {
2895 .b = {
2896 .ctl_reg = VCODEC_CC_REG,
2897 .en_mask = BIT(0),
2898 .reset_reg = SW_RESET_CORE_REG,
2899 .reset_mask = BIT(6),
2900 .halt_reg = DBG_BUS_VEC_C_REG,
2901 .halt_bit = 29,
2902 },
2903 .ns_reg = VCODEC_NS_REG,
2904 .md_reg = VCODEC_MD0_REG,
2905 .root_en_mask = BIT(2),
2906 .ns_mask = (BM(18, 11) | BM(2, 0)),
2907 .ctl_mask = BM(7, 6),
2908 .set_rate = set_rate_mnd,
2909 .freq_tbl = clk_tbl_vcodec,
Matt Wagantall84f43fd2011-08-16 23:28:38 -07002910 .current_freq = &rcg_dummy_freq,
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07002911 .c = {
2912 .dbg_name = "vcodec_clk",
Matt Wagantall84f43fd2011-08-16 23:28:38 -07002913 .ops = &clk_ops_rcg_8x60,
Matt Wagantalle18bbc82011-10-06 10:07:28 -07002914 VDD_DIG_FMAX_MAP3(LOW, 100000000, NOMINAL, 200000000,
2915 HIGH, 228571000),
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07002916 CLK_INIT(vcodec_clk.c),
Stephen Boyd7fa26742011-08-11 23:22:29 -07002917 .depends = &vcodec_axi_clk.c,
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07002918 },
2919};
2920
Matt Wagantalle18bbc82011-10-06 10:07:28 -07002921#define F_VPE(f, s, d) \
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07002922 { \
2923 .freq_hz = f, \
2924 .src_clk = &s##_clk.c, \
2925 .ns_val = NS_DIVSRC(15, 12, d, 2, 0, s##_to_mm_mux), \
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07002926 }
2927static struct clk_freq_tbl clk_tbl_vpe[] = {
Matt Wagantalle18bbc82011-10-06 10:07:28 -07002928 F_VPE( 0, gnd, 1),
2929 F_VPE( 27000000, pxo, 1),
2930 F_VPE( 34909000, pll8, 11),
2931 F_VPE( 38400000, pll8, 10),
2932 F_VPE( 64000000, pll8, 6),
2933 F_VPE( 76800000, pll8, 5),
2934 F_VPE( 96000000, pll8, 4),
2935 F_VPE(100000000, pll2, 8),
2936 F_VPE(160000000, pll2, 5),
2937 F_VPE(200000000, pll2, 4),
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07002938 F_END
2939};
2940
2941static struct rcg_clk vpe_clk = {
2942 .b = {
2943 .ctl_reg = VPE_CC_REG,
2944 .en_mask = BIT(0),
2945 .reset_reg = SW_RESET_CORE_REG,
2946 .reset_mask = BIT(17),
2947 .halt_reg = DBG_BUS_VEC_A_REG,
2948 .halt_bit = 28,
2949 },
2950 .ns_reg = VPE_NS_REG,
2951 .root_en_mask = BIT(2),
2952 .ns_mask = (BM(15, 12) | BM(2, 0)),
2953 .set_rate = set_rate_nop,
2954 .freq_tbl = clk_tbl_vpe,
Matt Wagantall84f43fd2011-08-16 23:28:38 -07002955 .current_freq = &rcg_dummy_freq,
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07002956 .c = {
2957 .dbg_name = "vpe_clk",
Matt Wagantall84f43fd2011-08-16 23:28:38 -07002958 .ops = &clk_ops_rcg_8x60,
Matt Wagantalle18bbc82011-10-06 10:07:28 -07002959 VDD_DIG_FMAX_MAP3(LOW, 76800000, NOMINAL, 160000000,
2960 HIGH, 200000000),
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07002961 CLK_INIT(vpe_clk.c),
Stephen Boyd7fa26742011-08-11 23:22:29 -07002962 .depends = &vpe_axi_clk.c,
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07002963 },
2964};
2965
Matt Wagantalle18bbc82011-10-06 10:07:28 -07002966#define F_VFE(f, s, d, m, n) \
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07002967 { \
2968 .freq_hz = f, \
2969 .src_clk = &s##_clk.c, \
2970 .md_val = MD8(8, m, 0, n), \
2971 .ns_val = NS_MM(23, 16, n, m, 11, 10, d, 2, 0, s##_to_mm_mux), \
2972 .ctl_val = CC(6, n), \
2973 .mnd_en_mask = BIT(5) * !!(n), \
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07002974 }
2975static struct clk_freq_tbl clk_tbl_vfe[] = {
Matt Wagantalle18bbc82011-10-06 10:07:28 -07002976 F_VFE( 0, gnd, 1, 0, 0),
2977 F_VFE( 13960000, pll8, 1, 2, 55),
2978 F_VFE( 27000000, pxo, 1, 0, 0),
2979 F_VFE( 36570000, pll8, 1, 2, 21),
2980 F_VFE( 38400000, pll8, 2, 1, 5),
2981 F_VFE( 45180000, pll8, 1, 2, 17),
2982 F_VFE( 48000000, pll8, 2, 1, 4),
2983 F_VFE( 54860000, pll8, 1, 1, 7),
2984 F_VFE( 64000000, pll8, 2, 1, 3),
2985 F_VFE( 76800000, pll8, 1, 1, 5),
2986 F_VFE( 96000000, pll8, 2, 1, 2),
2987 F_VFE(109710000, pll8, 1, 2, 7),
2988 F_VFE(128000000, pll8, 1, 1, 3),
2989 F_VFE(153600000, pll8, 1, 2, 5),
2990 F_VFE(200000000, pll2, 2, 1, 2),
2991 F_VFE(228570000, pll2, 1, 2, 7),
2992 F_VFE(266667000, pll2, 1, 1, 3),
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07002993 F_END
2994};
2995
2996static struct rcg_clk vfe_clk = {
2997 .b = {
2998 .ctl_reg = VFE_CC_REG,
2999 .reset_reg = SW_RESET_CORE_REG,
3000 .reset_mask = BIT(15),
3001 .halt_reg = DBG_BUS_VEC_B_REG,
3002 .halt_bit = 6,
3003 .en_mask = BIT(0),
3004 },
3005 .ns_reg = VFE_NS_REG,
3006 .md_reg = VFE_MD_REG,
3007 .root_en_mask = BIT(2),
3008 .ns_mask = (BM(23, 16) | BM(11, 10) | BM(2, 0)),
3009 .ctl_mask = BM(7, 6),
3010 .set_rate = set_rate_mnd,
3011 .freq_tbl = clk_tbl_vfe,
Matt Wagantall84f43fd2011-08-16 23:28:38 -07003012 .current_freq = &rcg_dummy_freq,
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07003013 .c = {
3014 .dbg_name = "vfe_clk",
Matt Wagantall84f43fd2011-08-16 23:28:38 -07003015 .ops = &clk_ops_rcg_8x60,
Matt Wagantalle18bbc82011-10-06 10:07:28 -07003016 VDD_DIG_FMAX_MAP3(LOW, 110000000, NOMINAL, 228570000,
3017 HIGH, 266667000),
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07003018 CLK_INIT(vfe_clk.c),
Stephen Boyd7fa26742011-08-11 23:22:29 -07003019 .depends = &vfe_axi_clk.c,
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07003020 },
3021};
3022
3023static struct branch_clk csi0_vfe_clk = {
3024 .b = {
3025 .ctl_reg = VFE_CC_REG,
3026 .en_mask = BIT(12),
3027 .reset_reg = SW_RESET_CORE_REG,
3028 .reset_mask = BIT(24),
3029 .halt_reg = DBG_BUS_VEC_B_REG,
3030 .halt_bit = 7,
3031 },
3032 .parent = &vfe_clk.c,
3033 .c = {
3034 .dbg_name = "csi0_vfe_clk",
3035 .ops = &clk_ops_branch,
3036 CLK_INIT(csi0_vfe_clk.c),
3037 },
3038};
3039
3040static struct branch_clk csi1_vfe_clk = {
3041 .b = {
3042 .ctl_reg = VFE_CC_REG,
3043 .en_mask = BIT(10),
3044 .reset_reg = SW_RESET_CORE_REG,
3045 .reset_mask = BIT(23),
3046 .halt_reg = DBG_BUS_VEC_B_REG,
3047 .halt_bit = 8,
3048 },
3049 .parent = &vfe_clk.c,
3050 .c = {
3051 .dbg_name = "csi1_vfe_clk",
3052 .ops = &clk_ops_branch,
3053 CLK_INIT(csi1_vfe_clk.c),
3054 },
3055};
3056
3057/*
3058 * Low Power Audio Clocks
3059 */
Matt Wagantalle18bbc82011-10-06 10:07:28 -07003060#define F_AIF_OSR(f, s, d, m, n) \
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07003061 { \
3062 .freq_hz = f, \
3063 .src_clk = &s##_clk.c, \
3064 .md_val = MD8(8, m, 0, n), \
3065 .ns_val = NS(31, 24, n, m, 5, 4, 3, d, 2, 0, s##_to_lpa_mux), \
3066 .mnd_en_mask = BIT(8) * !!(n), \
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07003067 }
3068static struct clk_freq_tbl clk_tbl_aif_osr[] = {
Matt Wagantalle18bbc82011-10-06 10:07:28 -07003069 F_AIF_OSR( 0, gnd, 1, 0, 0),
3070 F_AIF_OSR( 768000, pll4, 4, 1, 176),
3071 F_AIF_OSR( 1024000, pll4, 4, 1, 132),
3072 F_AIF_OSR( 1536000, pll4, 4, 1, 88),
3073 F_AIF_OSR( 2048000, pll4, 4, 1, 66),
3074 F_AIF_OSR( 3072000, pll4, 4, 1, 44),
3075 F_AIF_OSR( 4096000, pll4, 4, 1, 33),
3076 F_AIF_OSR( 6144000, pll4, 4, 1, 22),
3077 F_AIF_OSR( 8192000, pll4, 2, 1, 33),
3078 F_AIF_OSR(12288000, pll4, 4, 1, 11),
3079 F_AIF_OSR(24576000, pll4, 2, 1, 11),
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07003080 F_END
3081};
3082
3083#define CLK_AIF_OSR(i, ns, md, h_r) \
3084 struct rcg_clk i##_clk = { \
3085 .b = { \
3086 .ctl_reg = ns, \
3087 .en_mask = BIT(17), \
3088 .reset_reg = ns, \
3089 .reset_mask = BIT(19), \
3090 .halt_reg = h_r, \
3091 .halt_check = ENABLE, \
3092 .halt_bit = 1, \
3093 }, \
3094 .ns_reg = ns, \
3095 .md_reg = md, \
3096 .root_en_mask = BIT(9), \
3097 .ns_mask = (BM(31, 24) | BM(6, 0)), \
3098 .set_rate = set_rate_mnd, \
3099 .freq_tbl = clk_tbl_aif_osr, \
Matt Wagantall84f43fd2011-08-16 23:28:38 -07003100 .current_freq = &rcg_dummy_freq, \
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07003101 .c = { \
3102 .dbg_name = #i "_clk", \
Matt Wagantall84f43fd2011-08-16 23:28:38 -07003103 .ops = &clk_ops_rcg_8x60, \
Matt Wagantalle18bbc82011-10-06 10:07:28 -07003104 VDD_DIG_FMAX_MAP1(LOW, 24576000), \
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07003105 CLK_INIT(i##_clk.c), \
3106 }, \
3107 }
3108
3109#define F_AIF_BIT(d, s) \
3110 { \
3111 .freq_hz = d, \
3112 .ns_val = (BVAL(14, 14, s) | BVAL(13, 10, (d-1))) \
3113 }
3114static struct clk_freq_tbl clk_tbl_aif_bit[] = {
3115 F_AIF_BIT(0, 1), /* Use external clock. */
3116 F_AIF_BIT(1, 0), F_AIF_BIT(2, 0), F_AIF_BIT(3, 0), F_AIF_BIT(4, 0),
3117 F_AIF_BIT(5, 0), F_AIF_BIT(6, 0), F_AIF_BIT(7, 0), F_AIF_BIT(8, 0),
3118 F_AIF_BIT(9, 0), F_AIF_BIT(10, 0), F_AIF_BIT(11, 0), F_AIF_BIT(12, 0),
3119 F_AIF_BIT(13, 0), F_AIF_BIT(14, 0), F_AIF_BIT(15, 0), F_AIF_BIT(16, 0),
3120 F_END
3121};
3122
3123#define CLK_AIF_BIT(i, ns, h_r) \
3124 struct rcg_clk i##_clk = { \
3125 .b = { \
3126 .ctl_reg = ns, \
3127 .en_mask = BIT(15), \
3128 .halt_reg = h_r, \
3129 .halt_check = DELAY, \
3130 }, \
3131 .ns_reg = ns, \
3132 .ns_mask = BM(14, 10), \
3133 .set_rate = set_rate_nop, \
3134 .freq_tbl = clk_tbl_aif_bit, \
Matt Wagantall84f43fd2011-08-16 23:28:38 -07003135 .current_freq = &rcg_dummy_freq, \
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07003136 .c = { \
3137 .dbg_name = #i "_clk", \
Matt Wagantall84f43fd2011-08-16 23:28:38 -07003138 .ops = &clk_ops_rcg_8x60, \
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07003139 CLK_INIT(i##_clk.c), \
3140 }, \
3141 }
3142
3143static CLK_AIF_OSR(mi2s_osr, LCC_MI2S_NS_REG, LCC_MI2S_MD_REG,
3144 LCC_MI2S_STATUS_REG);
3145static CLK_AIF_BIT(mi2s_bit, LCC_MI2S_NS_REG, LCC_MI2S_STATUS_REG);
3146
3147static CLK_AIF_OSR(codec_i2s_mic_osr, LCC_CODEC_I2S_MIC_NS_REG,
3148 LCC_CODEC_I2S_MIC_MD_REG, LCC_CODEC_I2S_MIC_STATUS_REG);
3149static CLK_AIF_BIT(codec_i2s_mic_bit, LCC_CODEC_I2S_MIC_NS_REG,
3150 LCC_CODEC_I2S_MIC_STATUS_REG);
3151
3152static CLK_AIF_OSR(spare_i2s_mic_osr, LCC_SPARE_I2S_MIC_NS_REG,
3153 LCC_SPARE_I2S_MIC_MD_REG, LCC_SPARE_I2S_MIC_STATUS_REG);
3154static CLK_AIF_BIT(spare_i2s_mic_bit, LCC_SPARE_I2S_MIC_NS_REG,
3155 LCC_SPARE_I2S_MIC_STATUS_REG);
3156
3157static CLK_AIF_OSR(codec_i2s_spkr_osr, LCC_CODEC_I2S_SPKR_NS_REG,
3158 LCC_CODEC_I2S_SPKR_MD_REG, LCC_CODEC_I2S_SPKR_STATUS_REG);
3159static CLK_AIF_BIT(codec_i2s_spkr_bit, LCC_CODEC_I2S_SPKR_NS_REG,
3160 LCC_CODEC_I2S_SPKR_STATUS_REG);
3161
3162static CLK_AIF_OSR(spare_i2s_spkr_osr, LCC_SPARE_I2S_SPKR_NS_REG,
3163 LCC_SPARE_I2S_SPKR_MD_REG, LCC_SPARE_I2S_SPKR_STATUS_REG);
3164static CLK_AIF_BIT(spare_i2s_spkr_bit, LCC_SPARE_I2S_SPKR_NS_REG,
3165 LCC_SPARE_I2S_SPKR_STATUS_REG);
3166
Matt Wagantalle18bbc82011-10-06 10:07:28 -07003167#define F_PCM(f, s, d, m, n) \
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07003168 { \
3169 .freq_hz = f, \
3170 .src_clk = &s##_clk.c, \
3171 .md_val = MD16(m, n), \
3172 .ns_val = NS(31, 16, n, m, 5, 4, 3, d, 2, 0, s##_to_lpa_mux), \
3173 .mnd_en_mask = BIT(8) * !!(n), \
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07003174 }
3175static struct clk_freq_tbl clk_tbl_pcm[] = {
Matt Wagantalle18bbc82011-10-06 10:07:28 -07003176 F_PCM( 0, gnd, 1, 0, 0),
3177 F_PCM( 512000, pll4, 4, 1, 264),
3178 F_PCM( 768000, pll4, 4, 1, 176),
3179 F_PCM( 1024000, pll4, 4, 1, 132),
3180 F_PCM( 1536000, pll4, 4, 1, 88),
3181 F_PCM( 2048000, pll4, 4, 1, 66),
3182 F_PCM( 3072000, pll4, 4, 1, 44),
3183 F_PCM( 4096000, pll4, 4, 1, 33),
3184 F_PCM( 6144000, pll4, 4, 1, 22),
3185 F_PCM( 8192000, pll4, 2, 1, 33),
3186 F_PCM(12288000, pll4, 4, 1, 11),
3187 F_PCM(24580000, pll4, 2, 1, 11),
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07003188 F_END
3189};
3190
3191static struct rcg_clk pcm_clk = {
3192 .b = {
3193 .ctl_reg = LCC_PCM_NS_REG,
3194 .en_mask = BIT(11),
3195 .reset_reg = LCC_PCM_NS_REG,
3196 .reset_mask = BIT(13),
3197 .halt_reg = LCC_PCM_STATUS_REG,
3198 .halt_check = ENABLE,
3199 .halt_bit = 0,
3200 },
3201 .ns_reg = LCC_PCM_NS_REG,
3202 .md_reg = LCC_PCM_MD_REG,
3203 .root_en_mask = BIT(9),
3204 .ns_mask = (BM(31, 16) | BM(6, 0)),
3205 .set_rate = set_rate_mnd,
3206 .freq_tbl = clk_tbl_pcm,
Matt Wagantall84f43fd2011-08-16 23:28:38 -07003207 .current_freq = &rcg_dummy_freq,
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07003208 .c = {
3209 .dbg_name = "pcm_clk",
Matt Wagantall84f43fd2011-08-16 23:28:38 -07003210 .ops = &clk_ops_rcg_8x60,
Matt Wagantalle18bbc82011-10-06 10:07:28 -07003211 VDD_DIG_FMAX_MAP1(LOW, 24580000),
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07003212 CLK_INIT(pcm_clk.c),
3213 },
3214};
3215
Matt Wagantall735f01a2011-08-12 12:40:28 -07003216DEFINE_CLK_RPM(afab_clk, afab_a_clk, APPS_FABRIC, NULL);
3217DEFINE_CLK_RPM(cfpb_clk, cfpb_a_clk, CFPB, NULL);
3218DEFINE_CLK_RPM(dfab_clk, dfab_a_clk, DAYTONA_FABRIC, NULL);
3219DEFINE_CLK_RPM(ebi1_clk, ebi1_a_clk, EBI1, NULL);
3220DEFINE_CLK_RPM(mmfab_clk, mmfab_a_clk, MM_FABRIC, NULL);
3221DEFINE_CLK_RPM(mmfpb_clk, mmfpb_a_clk, MMFPB, NULL);
3222DEFINE_CLK_RPM(sfab_clk, sfab_a_clk, SYSTEM_FABRIC, NULL);
3223DEFINE_CLK_RPM(sfpb_clk, sfpb_a_clk, SFPB, NULL);
Matt Wagantallf8032602011-06-15 23:01:56 -07003224DEFINE_CLK_RPM(smi_clk, smi_a_clk, SMI, &smi_2x_axi_clk.c);
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07003225
3226static DEFINE_CLK_VOTER(dfab_dsps_clk, &dfab_clk.c);
3227static DEFINE_CLK_VOTER(dfab_usb_hs_clk, &dfab_clk.c);
3228static DEFINE_CLK_VOTER(dfab_sdc1_clk, &dfab_clk.c);
3229static DEFINE_CLK_VOTER(dfab_sdc2_clk, &dfab_clk.c);
3230static DEFINE_CLK_VOTER(dfab_sdc3_clk, &dfab_clk.c);
3231static DEFINE_CLK_VOTER(dfab_sdc4_clk, &dfab_clk.c);
3232static DEFINE_CLK_VOTER(dfab_sdc5_clk, &dfab_clk.c);
3233
3234static DEFINE_CLK_VOTER(ebi1_msmbus_clk, &ebi1_clk.c);
3235static DEFINE_CLK_VOTER(ebi1_adm0_clk, &ebi1_clk.c);
3236static DEFINE_CLK_VOTER(ebi1_adm1_clk, &ebi1_clk.c);
3237
3238static DEFINE_CLK_MEASURE(sc0_m_clk);
3239static DEFINE_CLK_MEASURE(sc1_m_clk);
3240static DEFINE_CLK_MEASURE(l2_m_clk);
3241
3242#ifdef CONFIG_DEBUG_FS
3243struct measure_sel {
3244 u32 test_vector;
3245 struct clk *clk;
3246};
3247
3248static struct measure_sel measure_mux[] = {
3249 { TEST_PER_LS(0x08), &modem_ahb1_p_clk.c },
3250 { TEST_PER_LS(0x09), &modem_ahb2_p_clk.c },
3251 { TEST_PER_LS(0x12), &sdc1_p_clk.c },
3252 { TEST_PER_LS(0x13), &sdc1_clk.c },
3253 { TEST_PER_LS(0x14), &sdc2_p_clk.c },
3254 { TEST_PER_LS(0x15), &sdc2_clk.c },
3255 { TEST_PER_LS(0x16), &sdc3_p_clk.c },
3256 { TEST_PER_LS(0x17), &sdc3_clk.c },
3257 { TEST_PER_LS(0x18), &sdc4_p_clk.c },
3258 { TEST_PER_LS(0x19), &sdc4_clk.c },
3259 { TEST_PER_LS(0x1A), &sdc5_p_clk.c },
3260 { TEST_PER_LS(0x1B), &sdc5_clk.c },
Matt Wagantall66cd0932011-09-12 19:04:34 -07003261 { TEST_PER_LS(0x1D), &ebi2_2x_clk.c },
3262 { TEST_PER_LS(0x1E), &ebi2_clk.c },
Matt Wagantall7625a4c2011-11-01 16:17:53 -07003263 { TEST_PER_LS(0x1F), &gp0_clk.c },
3264 { TEST_PER_LS(0x20), &gp1_clk.c },
3265 { TEST_PER_LS(0x21), &gp2_clk.c },
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07003266 { TEST_PER_LS(0x25), &dfab_clk.c },
3267 { TEST_PER_LS(0x25), &dfab_a_clk.c },
3268 { TEST_PER_LS(0x26), &pmem_clk.c },
3269 { TEST_PER_LS(0x2B), &ppss_p_clk.c },
3270 { TEST_PER_LS(0x33), &cfpb_clk.c },
3271 { TEST_PER_LS(0x33), &cfpb_a_clk.c },
3272 { TEST_PER_LS(0x3D), &gsbi1_p_clk.c },
3273 { TEST_PER_LS(0x3E), &gsbi1_uart_clk.c },
3274 { TEST_PER_LS(0x3F), &gsbi1_qup_clk.c },
3275 { TEST_PER_LS(0x41), &gsbi2_p_clk.c },
3276 { TEST_PER_LS(0x42), &gsbi2_uart_clk.c },
3277 { TEST_PER_LS(0x44), &gsbi2_qup_clk.c },
3278 { TEST_PER_LS(0x45), &gsbi3_p_clk.c },
3279 { TEST_PER_LS(0x46), &gsbi3_uart_clk.c },
3280 { TEST_PER_LS(0x48), &gsbi3_qup_clk.c },
3281 { TEST_PER_LS(0x49), &gsbi4_p_clk.c },
3282 { TEST_PER_LS(0x4A), &gsbi4_uart_clk.c },
3283 { TEST_PER_LS(0x4C), &gsbi4_qup_clk.c },
3284 { TEST_PER_LS(0x4D), &gsbi5_p_clk.c },
3285 { TEST_PER_LS(0x4E), &gsbi5_uart_clk.c },
3286 { TEST_PER_LS(0x50), &gsbi5_qup_clk.c },
3287 { TEST_PER_LS(0x51), &gsbi6_p_clk.c },
3288 { TEST_PER_LS(0x52), &gsbi6_uart_clk.c },
3289 { TEST_PER_LS(0x54), &gsbi6_qup_clk.c },
3290 { TEST_PER_LS(0x55), &gsbi7_p_clk.c },
3291 { TEST_PER_LS(0x56), &gsbi7_uart_clk.c },
3292 { TEST_PER_LS(0x58), &gsbi7_qup_clk.c },
3293 { TEST_PER_LS(0x59), &gsbi8_p_clk.c },
3294 { TEST_PER_LS(0x5A), &gsbi8_uart_clk.c },
3295 { TEST_PER_LS(0x5C), &gsbi8_qup_clk.c },
3296 { TEST_PER_LS(0x5D), &gsbi9_p_clk.c },
3297 { TEST_PER_LS(0x5E), &gsbi9_uart_clk.c },
3298 { TEST_PER_LS(0x60), &gsbi9_qup_clk.c },
3299 { TEST_PER_LS(0x61), &gsbi10_p_clk.c },
3300 { TEST_PER_LS(0x62), &gsbi10_uart_clk.c },
3301 { TEST_PER_LS(0x64), &gsbi10_qup_clk.c },
3302 { TEST_PER_LS(0x65), &gsbi11_p_clk.c },
3303 { TEST_PER_LS(0x66), &gsbi11_uart_clk.c },
3304 { TEST_PER_LS(0x68), &gsbi11_qup_clk.c },
3305 { TEST_PER_LS(0x69), &gsbi12_p_clk.c },
3306 { TEST_PER_LS(0x6A), &gsbi12_uart_clk.c },
3307 { TEST_PER_LS(0x6C), &gsbi12_qup_clk.c },
3308 { TEST_PER_LS(0x78), &sfpb_clk.c },
3309 { TEST_PER_LS(0x78), &sfpb_a_clk.c },
3310 { TEST_PER_LS(0x7A), &pmic_ssbi2_clk.c },
3311 { TEST_PER_LS(0x7B), &pmic_arb0_p_clk.c },
3312 { TEST_PER_LS(0x7C), &pmic_arb1_p_clk.c },
3313 { TEST_PER_LS(0x7D), &prng_clk.c },
3314 { TEST_PER_LS(0x7F), &rpm_msg_ram_p_clk.c },
3315 { TEST_PER_LS(0x80), &adm0_p_clk.c },
3316 { TEST_PER_LS(0x81), &adm1_p_clk.c },
3317 { TEST_PER_LS(0x84), &usb_hs1_p_clk.c },
3318 { TEST_PER_LS(0x85), &usb_hs1_xcvr_clk.c },
3319 { TEST_PER_LS(0x89), &usb_fs1_p_clk.c },
3320 { TEST_PER_LS(0x8A), &usb_fs1_sys_clk.c },
3321 { TEST_PER_LS(0x8B), &usb_fs1_xcvr_clk.c },
3322 { TEST_PER_LS(0x8C), &usb_fs2_p_clk.c },
3323 { TEST_PER_LS(0x8D), &usb_fs2_sys_clk.c },
3324 { TEST_PER_LS(0x8E), &usb_fs2_xcvr_clk.c },
3325 { TEST_PER_LS(0x8F), &tsif_p_clk.c },
3326 { TEST_PER_LS(0x91), &tsif_ref_clk.c },
3327 { TEST_PER_LS(0x93), &ce2_p_clk.c },
3328 { TEST_PER_LS(0x94), &tssc_clk.c },
3329
3330 { TEST_PER_HS(0x07), &afab_clk.c },
3331 { TEST_PER_HS(0x07), &afab_a_clk.c },
3332 { TEST_PER_HS(0x18), &sfab_clk.c },
3333 { TEST_PER_HS(0x18), &sfab_a_clk.c },
3334 { TEST_PER_HS(0x2A), &adm0_clk.c },
3335 { TEST_PER_HS(0x2B), &adm1_clk.c },
3336 { TEST_PER_HS(0x34), &ebi1_clk.c },
3337 { TEST_PER_HS(0x34), &ebi1_a_clk.c },
3338
3339 { TEST_MM_LS(0x00), &dsi_byte_clk.c },
3340 { TEST_MM_LS(0x01), &pixel_lcdc_clk.c },
3341 { TEST_MM_LS(0x04), &pixel_mdp_clk.c },
3342 { TEST_MM_LS(0x06), &amp_p_clk.c },
3343 { TEST_MM_LS(0x07), &csi0_p_clk.c },
3344 { TEST_MM_LS(0x08), &csi1_p_clk.c },
3345 { TEST_MM_LS(0x09), &dsi_m_p_clk.c },
3346 { TEST_MM_LS(0x0A), &dsi_s_p_clk.c },
3347 { TEST_MM_LS(0x0C), &gfx2d0_p_clk.c },
3348 { TEST_MM_LS(0x0D), &gfx2d1_p_clk.c },
3349 { TEST_MM_LS(0x0E), &gfx3d_p_clk.c },
3350 { TEST_MM_LS(0x0F), &hdmi_m_p_clk.c },
3351 { TEST_MM_LS(0x10), &hdmi_s_p_clk.c },
3352 { TEST_MM_LS(0x11), &ijpeg_p_clk.c },
3353 { TEST_MM_LS(0x12), &imem_p_clk.c },
3354 { TEST_MM_LS(0x13), &jpegd_p_clk.c },
3355 { TEST_MM_LS(0x14), &mdp_p_clk.c },
3356 { TEST_MM_LS(0x16), &rot_p_clk.c },
3357 { TEST_MM_LS(0x18), &smmu_p_clk.c },
3358 { TEST_MM_LS(0x19), &tv_enc_p_clk.c },
3359 { TEST_MM_LS(0x1A), &vcodec_p_clk.c },
3360 { TEST_MM_LS(0x1B), &vfe_p_clk.c },
3361 { TEST_MM_LS(0x1C), &vpe_p_clk.c },
3362 { TEST_MM_LS(0x1D), &cam_clk.c },
3363 { TEST_MM_LS(0x1F), &hdmi_app_clk.c },
3364 { TEST_MM_LS(0x20), &mdp_vsync_clk.c },
3365 { TEST_MM_LS(0x21), &tv_dac_clk.c },
3366 { TEST_MM_LS(0x22), &tv_enc_clk.c },
3367 { TEST_MM_LS(0x23), &dsi_esc_clk.c },
3368 { TEST_MM_LS(0x25), &mmfpb_clk.c },
3369 { TEST_MM_LS(0x25), &mmfpb_a_clk.c },
3370
3371 { TEST_MM_HS(0x00), &csi0_clk.c },
3372 { TEST_MM_HS(0x01), &csi1_clk.c },
3373 { TEST_MM_HS(0x03), &csi0_vfe_clk.c },
3374 { TEST_MM_HS(0x04), &csi1_vfe_clk.c },
3375 { TEST_MM_HS(0x05), &ijpeg_clk.c },
3376 { TEST_MM_HS(0x06), &vfe_clk.c },
3377 { TEST_MM_HS(0x07), &gfx2d0_clk.c },
3378 { TEST_MM_HS(0x08), &gfx2d1_clk.c },
3379 { TEST_MM_HS(0x09), &gfx3d_clk.c },
3380 { TEST_MM_HS(0x0A), &jpegd_clk.c },
3381 { TEST_MM_HS(0x0B), &vcodec_clk.c },
3382 { TEST_MM_HS(0x0F), &mmfab_clk.c },
3383 { TEST_MM_HS(0x0F), &mmfab_a_clk.c },
3384 { TEST_MM_HS(0x11), &gmem_axi_clk.c },
3385 { TEST_MM_HS(0x12), &ijpeg_axi_clk.c },
3386 { TEST_MM_HS(0x13), &imem_axi_clk.c },
3387 { TEST_MM_HS(0x14), &jpegd_axi_clk.c },
3388 { TEST_MM_HS(0x15), &mdp_axi_clk.c },
Matt Wagantallf63a8892011-06-15 16:44:46 -07003389 { TEST_MM_HS(0x16), &rot_axi_clk.c },
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07003390 { TEST_MM_HS(0x17), &vcodec_axi_clk.c },
3391 { TEST_MM_HS(0x18), &vfe_axi_clk.c },
Matt Wagantallf63a8892011-06-15 16:44:46 -07003392 { TEST_MM_HS(0x19), &vpe_axi_clk.c },
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07003393 { TEST_MM_HS(0x1A), &mdp_clk.c },
3394 { TEST_MM_HS(0x1B), &rot_clk.c },
3395 { TEST_MM_HS(0x1C), &vpe_clk.c },
3396 { TEST_MM_HS(0x1E), &hdmi_tv_clk.c },
3397 { TEST_MM_HS(0x1F), &mdp_tv_clk.c },
Matt Wagantallf8032602011-06-15 23:01:56 -07003398 { TEST_MM_HS(0x24), &smi_2x_axi_clk.c },
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07003399
3400 { TEST_MM_HS2X(0x24), &smi_clk.c },
3401 { TEST_MM_HS2X(0x24), &smi_a_clk.c },
3402
3403 { TEST_LPA(0x0A), &mi2s_osr_clk.c },
3404 { TEST_LPA(0x0B), &mi2s_bit_clk.c },
3405 { TEST_LPA(0x0C), &codec_i2s_mic_osr_clk.c },
3406 { TEST_LPA(0x0D), &codec_i2s_mic_bit_clk.c },
3407 { TEST_LPA(0x0E), &codec_i2s_spkr_osr_clk.c },
3408 { TEST_LPA(0x0F), &codec_i2s_spkr_bit_clk.c },
3409 { TEST_LPA(0x10), &spare_i2s_mic_osr_clk.c },
3410 { TEST_LPA(0x11), &spare_i2s_mic_bit_clk.c },
3411 { TEST_LPA(0x12), &spare_i2s_spkr_osr_clk.c },
3412 { TEST_LPA(0x13), &spare_i2s_spkr_bit_clk.c },
3413 { TEST_LPA(0x14), &pcm_clk.c },
3414
3415 { TEST_SC(0x40), &sc0_m_clk },
3416 { TEST_SC(0x41), &sc1_m_clk },
3417 { TEST_SC(0x42), &l2_m_clk },
3418};
3419
3420static struct measure_sel *find_measure_sel(struct clk *clk)
3421{
3422 int i;
3423
3424 for (i = 0; i < ARRAY_SIZE(measure_mux); i++)
3425 if (measure_mux[i].clk == clk)
3426 return &measure_mux[i];
3427 return NULL;
3428}
3429
3430static int measure_clk_set_parent(struct clk *c, struct clk *parent)
3431{
3432 int ret = 0;
3433 u32 clk_sel;
3434 struct measure_sel *p;
3435 struct measure_clk *clk = to_measure_clk(c);
3436 unsigned long flags;
3437
3438 if (!parent)
3439 return -EINVAL;
3440
3441 p = find_measure_sel(parent);
3442 if (!p)
3443 return -EINVAL;
3444
3445 spin_lock_irqsave(&local_clock_reg_lock, flags);
3446
3447 /*
3448 * Program the test vector, measurement period (sample_ticks)
3449 * and scaling factors (multiplier, divider).
3450 */
3451 clk_sel = p->test_vector & TEST_CLK_SEL_MASK;
3452 clk->sample_ticks = 0x10000;
3453 clk->multiplier = 1;
3454 clk->divider = 1;
3455 switch (p->test_vector >> TEST_TYPE_SHIFT) {
3456 case TEST_TYPE_PER_LS:
3457 writel_relaxed(0x4030D00|BVAL(7, 0, clk_sel), CLK_TEST_REG);
3458 break;
3459 case TEST_TYPE_PER_HS:
3460 writel_relaxed(0x4020000|BVAL(16, 10, clk_sel), CLK_TEST_REG);
3461 break;
3462 case TEST_TYPE_MM_LS:
3463 writel_relaxed(0x4030D97, CLK_TEST_REG);
3464 writel_relaxed(BVAL(6, 1, clk_sel)|BIT(0), DBG_CFG_REG_LS_REG);
3465 break;
3466 case TEST_TYPE_MM_HS2X:
3467 clk->divider = 2;
3468 case TEST_TYPE_MM_HS:
3469 writel_relaxed(0x402B800, CLK_TEST_REG);
3470 writel_relaxed(BVAL(6, 1, clk_sel)|BIT(0), DBG_CFG_REG_HS_REG);
3471 break;
3472 case TEST_TYPE_LPA:
3473 writel_relaxed(0x4030D98, CLK_TEST_REG);
3474 writel_relaxed(BVAL(6, 1, clk_sel)|BIT(0),
3475 LCC_CLK_LS_DEBUG_CFG_REG);
3476 break;
3477 case TEST_TYPE_SC:
3478 writel_relaxed(0x5020000|BVAL(16, 10, clk_sel), CLK_TEST_REG);
3479 clk->sample_ticks = 0x4000;
3480 clk->multiplier = 2;
3481 break;
3482 default:
3483 ret = -EPERM;
3484 }
3485 /* Make sure test vector is set before starting measurements. */
3486 mb();
3487
3488 spin_unlock_irqrestore(&local_clock_reg_lock, flags);
3489
3490 return ret;
3491}
3492
3493/* Sample clock for 'ticks' reference clock ticks. */
3494static u32 run_measurement(unsigned ticks)
3495{
3496 /* Stop counters and set the XO4 counter start value. */
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07003497 writel_relaxed(ticks, RINGOSC_TCXO_CTL_REG);
3498
3499 /* Wait for timer to become ready. */
3500 while ((readl_relaxed(RINGOSC_STATUS_REG) & BIT(25)) != 0)
3501 cpu_relax();
3502
3503 /* Run measurement and wait for completion. */
3504 writel_relaxed(BIT(20)|ticks, RINGOSC_TCXO_CTL_REG);
3505 while ((readl_relaxed(RINGOSC_STATUS_REG) & BIT(25)) == 0)
3506 cpu_relax();
3507
3508 /* Stop counters. */
3509 writel_relaxed(0x0, RINGOSC_TCXO_CTL_REG);
3510
3511 /* Return measured ticks. */
3512 return readl_relaxed(RINGOSC_STATUS_REG) & BM(24, 0);
3513}
3514
3515/* Perform a hardware rate measurement for a given clock.
3516 FOR DEBUG USE ONLY: Measurements take ~15 ms! */
Matt Wagantall9de3bfb2011-11-03 20:13:12 -07003517static unsigned long measure_clk_get_rate(struct clk *c)
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07003518{
3519 unsigned long flags;
3520 u32 pdm_reg_backup, ringosc_reg_backup;
3521 u64 raw_count_short, raw_count_full;
3522 struct measure_clk *clk = to_measure_clk(c);
3523 unsigned ret;
3524
3525 spin_lock_irqsave(&local_clock_reg_lock, flags);
3526
3527 /* Enable CXO/4 and RINGOSC branch and root. */
3528 pdm_reg_backup = readl_relaxed(PDM_CLK_NS_REG);
3529 ringosc_reg_backup = readl_relaxed(RINGOSC_NS_REG);
3530 writel_relaxed(0x2898, PDM_CLK_NS_REG);
3531 writel_relaxed(0xA00, RINGOSC_NS_REG);
3532
3533 /*
3534 * The ring oscillator counter will not reset if the measured clock
3535 * is not running. To detect this, run a short measurement before
3536 * the full measurement. If the raw results of the two are the same
3537 * then the clock must be off.
3538 */
3539
3540 /* Run a short measurement. (~1 ms) */
3541 raw_count_short = run_measurement(0x1000);
3542 /* Run a full measurement. (~14 ms) */
3543 raw_count_full = run_measurement(clk->sample_ticks);
3544
3545 writel_relaxed(ringosc_reg_backup, RINGOSC_NS_REG);
3546 writel_relaxed(pdm_reg_backup, PDM_CLK_NS_REG);
3547
3548 /* Return 0 if the clock is off. */
3549 if (raw_count_full == raw_count_short)
3550 ret = 0;
3551 else {
3552 /* Compute rate in Hz. */
3553 raw_count_full = ((raw_count_full * 10) + 15) * 4800000;
3554 do_div(raw_count_full,
3555 (((clk->sample_ticks * 10) + 35) * clk->divider));
3556 ret = (raw_count_full * clk->multiplier);
3557 }
3558
3559 /* Route dbg_hs_clk to PLLTEST. 300mV single-ended amplitude. */
3560 writel_relaxed(0x3CF8, PLLTEST_PAD_CFG_REG);
3561 spin_unlock_irqrestore(&local_clock_reg_lock, flags);
3562
3563 return ret;
3564}
3565#else /* !CONFIG_DEBUG_FS */
3566static int measure_clk_set_parent(struct clk *clk, struct clk *parent)
3567{
3568 return -EINVAL;
3569}
3570
Matt Wagantall9de3bfb2011-11-03 20:13:12 -07003571static unsigned long measure_clk_get_rate(struct clk *clk)
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07003572{
3573 return 0;
3574}
3575#endif /* CONFIG_DEBUG_FS */
3576
3577static struct clk_ops measure_clk_ops = {
3578 .set_parent = measure_clk_set_parent,
3579 .get_rate = measure_clk_get_rate,
3580 .is_local = local_clk_is_local,
3581};
3582
3583static struct measure_clk measure_clk = {
3584 .c = {
3585 .dbg_name = "measure_clk",
3586 .ops = &measure_clk_ops,
3587 CLK_INIT(measure_clk.c),
3588 },
3589 .multiplier = 1,
3590 .divider = 1,
3591};
3592
3593static struct clk_lookup msm_clocks_8x60[] = {
3594 CLK_LOOKUP("cxo", cxo_clk.c, NULL),
3595 CLK_LOOKUP("pll4", pll4_clk.c, NULL),
3596 CLK_LOOKUP("pll4", pll4_clk.c, "peripheral-reset"),
3597 CLK_LOOKUP("measure", measure_clk.c, "debug"),
3598
3599 CLK_LOOKUP("afab_clk", afab_clk.c, NULL),
3600 CLK_LOOKUP("afab_a_clk", afab_a_clk.c, NULL),
3601 CLK_LOOKUP("cfpb_clk", cfpb_clk.c, NULL),
3602 CLK_LOOKUP("cfpb_a_clk", cfpb_a_clk.c, NULL),
3603 CLK_LOOKUP("dfab_clk", dfab_clk.c, NULL),
3604 CLK_LOOKUP("dfab_a_clk", dfab_a_clk.c, NULL),
3605 CLK_LOOKUP("ebi1_clk", ebi1_clk.c, NULL),
3606 CLK_LOOKUP("ebi1_a_clk", ebi1_a_clk.c, NULL),
3607 CLK_LOOKUP("mmfab_clk", mmfab_clk.c, NULL),
3608 CLK_LOOKUP("mmfab_a_clk", mmfab_a_clk.c, NULL),
3609 CLK_LOOKUP("mmfpb_clk", mmfpb_clk.c, NULL),
3610 CLK_LOOKUP("mmfpb_a_clk", mmfpb_a_clk.c, NULL),
3611 CLK_LOOKUP("sfab_clk", sfab_clk.c, NULL),
3612 CLK_LOOKUP("sfab_a_clk", sfab_a_clk.c, NULL),
3613 CLK_LOOKUP("sfpb_clk", sfpb_clk.c, NULL),
3614 CLK_LOOKUP("sfpb_a_clk", sfpb_a_clk.c, NULL),
3615 CLK_LOOKUP("smi_clk", smi_clk.c, NULL),
3616 CLK_LOOKUP("smi_a_clk", smi_a_clk.c, NULL),
3617
Matt Wagantall7625a4c2011-11-01 16:17:53 -07003618 CLK_LOOKUP("core_clk", gp0_clk.c, NULL),
3619 CLK_LOOKUP("core_clk", gp1_clk.c, NULL),
3620 CLK_LOOKUP("core_clk", gp2_clk.c, NULL),
Matt Wagantalle2522372011-08-17 14:52:21 -07003621 CLK_LOOKUP("core_clk", gsbi1_uart_clk.c, NULL),
3622 CLK_LOOKUP("core_clk", gsbi2_uart_clk.c, NULL),
3623 CLK_LOOKUP("core_clk", gsbi3_uart_clk.c, "msm_serial_hsl.2"),
3624 CLK_LOOKUP("core_clk", gsbi4_uart_clk.c, NULL),
3625 CLK_LOOKUP("core_clk", gsbi5_uart_clk.c, NULL),
3626 CLK_LOOKUP("core_clk", gsbi6_uart_clk.c, "msm_serial_hs.0"),
3627 CLK_LOOKUP("core_clk", gsbi7_uart_clk.c, NULL),
3628 CLK_LOOKUP("core_clk", gsbi8_uart_clk.c, NULL),
3629 CLK_LOOKUP("core_clk", gsbi9_uart_clk.c, "msm_serial_hsl.1"),
3630 CLK_LOOKUP("core_clk", gsbi10_uart_clk.c, NULL),
3631 CLK_LOOKUP("core_clk", gsbi11_uart_clk.c, NULL),
3632 CLK_LOOKUP("core_clk", gsbi12_uart_clk.c, "msm_serial_hsl.0"),
Matt Wagantallac294852011-08-17 15:44:58 -07003633 CLK_LOOKUP("core_clk", gsbi1_qup_clk.c, "spi_qsd.0"),
Matt Wagantall62cf63e2011-08-17 16:34:47 -07003634 CLK_LOOKUP("core_clk", gsbi2_qup_clk.c, NULL),
Matt Wagantallac294852011-08-17 15:44:58 -07003635 CLK_LOOKUP("core_clk", gsbi3_qup_clk.c, "qup_i2c.0"),
3636 CLK_LOOKUP("core_clk", gsbi4_qup_clk.c, "qup_i2c.1"),
Matt Wagantall62cf63e2011-08-17 16:34:47 -07003637 CLK_LOOKUP("core_clk", gsbi5_qup_clk.c, NULL),
3638 CLK_LOOKUP("core_clk", gsbi6_qup_clk.c, NULL),
Matt Wagantallac294852011-08-17 15:44:58 -07003639 CLK_LOOKUP("core_clk", gsbi7_qup_clk.c, "qup_i2c.4"),
3640 CLK_LOOKUP("core_clk", gsbi8_qup_clk.c, "qup_i2c.3"),
3641 CLK_LOOKUP("core_clk", gsbi9_qup_clk.c, "qup_i2c.2"),
3642 CLK_LOOKUP("core_clk", gsbi10_qup_clk.c, "spi_qsd.1"),
Matt Wagantall62cf63e2011-08-17 16:34:47 -07003643 CLK_LOOKUP("core_clk", gsbi11_qup_clk.c, NULL),
Wentao Xu4a053042011-10-03 14:06:34 -04003644 CLK_LOOKUP("gsbi_qup_clk", gsbi12_qup_clk.c, "msm_dsps"),
Matt Wagantallac294852011-08-17 15:44:58 -07003645 CLK_LOOKUP("core_clk", gsbi12_qup_clk.c, "qup_i2c.5"),
Matt Wagantallb86ad262011-10-24 19:50:29 -07003646 CLK_LOOKUP("core_clk", pdm_clk.c, NULL),
Wentao Xu4a053042011-10-03 14:06:34 -04003647 CLK_LOOKUP("mem_clk", pmem_clk.c, "msm_dsps"),
Matt Wagantallc1205292011-08-11 17:19:31 -07003648 CLK_LOOKUP("core_clk", prng_clk.c, "msm_rng.0"),
Matt Wagantall37ce3842011-08-17 16:00:36 -07003649 CLK_LOOKUP("core_clk", sdc1_clk.c, "msm_sdcc.1"),
3650 CLK_LOOKUP("core_clk", sdc2_clk.c, "msm_sdcc.2"),
3651 CLK_LOOKUP("core_clk", sdc3_clk.c, "msm_sdcc.3"),
3652 CLK_LOOKUP("core_clk", sdc4_clk.c, "msm_sdcc.4"),
3653 CLK_LOOKUP("core_clk", sdc5_clk.c, "msm_sdcc.5"),
Matt Wagantall640e5fd2011-08-17 16:08:53 -07003654 CLK_LOOKUP("ref_clk", tsif_ref_clk.c, "msm_tsif.0"),
3655 CLK_LOOKUP("ref_clk", tsif_ref_clk.c, "msm_tsif.1"),
Matt Wagantallb86ad262011-10-24 19:50:29 -07003656 CLK_LOOKUP("core_clk", tssc_clk.c, NULL),
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07003657 CLK_LOOKUP("usb_hs_clk", usb_hs1_xcvr_clk.c, NULL),
3658 CLK_LOOKUP("usb_phy_clk", usb_phy0_clk.c, NULL),
3659 CLK_LOOKUP("usb_fs_clk", usb_fs1_xcvr_clk.c, NULL),
3660 CLK_LOOKUP("usb_fs_sys_clk", usb_fs1_sys_clk.c, NULL),
3661 CLK_LOOKUP("usb_fs_src_clk", usb_fs1_src_clk.c, NULL),
3662 CLK_LOOKUP("usb_fs_clk", usb_fs2_xcvr_clk.c, NULL),
3663 CLK_LOOKUP("usb_fs_sys_clk", usb_fs2_sys_clk.c, NULL),
3664 CLK_LOOKUP("usb_fs_src_clk", usb_fs2_src_clk.c, NULL),
Matt Wagantallc4b3a4d2011-08-17 16:58:39 -07003665 CLK_LOOKUP("core_clk", ce2_p_clk.c, "qce.0"),
Matt Wagantalle0b11452011-09-13 17:25:33 -07003666 CLK_LOOKUP("core_clk", ce2_p_clk.c, "qcrypto.0"),
Matt Wagantallac294852011-08-17 15:44:58 -07003667 CLK_LOOKUP("iface_clk", gsbi1_p_clk.c, "spi_qsd.0"),
Matt Wagantall62cf63e2011-08-17 16:34:47 -07003668 CLK_LOOKUP("iface_clk", gsbi2_p_clk.c, NULL),
Matt Wagantalle2522372011-08-17 14:52:21 -07003669 CLK_LOOKUP("iface_clk", gsbi3_p_clk.c, "msm_serial_hsl.2"),
Matt Wagantallac294852011-08-17 15:44:58 -07003670 CLK_LOOKUP("iface_clk", gsbi3_p_clk.c, "qup_i2c.0"),
3671 CLK_LOOKUP("iface_clk", gsbi4_p_clk.c, "qup_i2c.1"),
Matt Wagantall62cf63e2011-08-17 16:34:47 -07003672 CLK_LOOKUP("iface_clk", gsbi5_p_clk.c, NULL),
Matt Wagantalle2522372011-08-17 14:52:21 -07003673 CLK_LOOKUP("iface_clk", gsbi6_p_clk.c, "msm_serial_hs.0"),
Matt Wagantallac294852011-08-17 15:44:58 -07003674 CLK_LOOKUP("iface_clk", gsbi7_p_clk.c, "qup_i2c.4"),
3675 CLK_LOOKUP("iface_clk", gsbi8_p_clk.c, "qup_i2c.3"),
Matt Wagantalle2522372011-08-17 14:52:21 -07003676 CLK_LOOKUP("iface_clk", gsbi9_p_clk.c, "msm_serial_hsl.1"),
Matt Wagantallac294852011-08-17 15:44:58 -07003677 CLK_LOOKUP("iface_clk", gsbi9_p_clk.c, "qup_i2c.2"),
3678 CLK_LOOKUP("iface_clk", gsbi10_p_clk.c, "spi_qsd.1"),
Matt Wagantall62cf63e2011-08-17 16:34:47 -07003679 CLK_LOOKUP("iface_clk", gsbi11_p_clk.c, NULL),
3680 CLK_LOOKUP("iface_clk", gsbi12_p_clk.c, NULL),
Matt Wagantalle2522372011-08-17 14:52:21 -07003681 CLK_LOOKUP("iface_clk", gsbi12_p_clk.c, "msm_serial_hsl.0"),
Matt Wagantallac294852011-08-17 15:44:58 -07003682 CLK_LOOKUP("iface_clk", gsbi12_p_clk.c, "qup_i2c.5"),
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07003683 CLK_LOOKUP("ppss_pclk", ppss_p_clk.c, NULL),
Matt Wagantall640e5fd2011-08-17 16:08:53 -07003684 CLK_LOOKUP("iface_clk", tsif_p_clk.c, "msm_tsif.0"),
3685 CLK_LOOKUP("iface_clk", tsif_p_clk.c, "msm_tsif.1"),
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07003686 CLK_LOOKUP("usb_fs_pclk", usb_fs1_p_clk.c, NULL),
3687 CLK_LOOKUP("usb_fs_pclk", usb_fs2_p_clk.c, NULL),
3688 CLK_LOOKUP("usb_hs_pclk", usb_hs1_p_clk.c, NULL),
Matt Wagantall37ce3842011-08-17 16:00:36 -07003689 CLK_LOOKUP("iface_clk", sdc1_p_clk.c, "msm_sdcc.1"),
3690 CLK_LOOKUP("iface_clk", sdc2_p_clk.c, "msm_sdcc.2"),
3691 CLK_LOOKUP("iface_clk", sdc3_p_clk.c, "msm_sdcc.3"),
3692 CLK_LOOKUP("iface_clk", sdc4_p_clk.c, "msm_sdcc.4"),
3693 CLK_LOOKUP("iface_clk", sdc5_p_clk.c, "msm_sdcc.5"),
Matt Wagantall66cd0932011-09-12 19:04:34 -07003694 CLK_LOOKUP("mem_clk", ebi2_2x_clk.c, NULL),
Terence Hampsonb36a38c2011-09-19 19:10:40 -04003695 CLK_LOOKUP("mem_clk", ebi2_clk.c, "msm_ebi2"),
Matt Wagantalle1a86062011-08-18 17:46:10 -07003696 CLK_LOOKUP("core_clk", adm0_clk.c, "msm_dmov.0"),
3697 CLK_LOOKUP("iface_clk", adm0_p_clk.c, "msm_dmov.0"),
3698 CLK_LOOKUP("core_clk", adm1_clk.c, "msm_dmov.1"),
3699 CLK_LOOKUP("iface_clk", adm1_p_clk.c, "msm_dmov.1"),
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07003700 CLK_LOOKUP("modem_ahb1_pclk", modem_ahb1_p_clk.c, NULL),
3701 CLK_LOOKUP("modem_ahb2_pclk", modem_ahb2_p_clk.c, NULL),
Matt Wagantallb86ad262011-10-24 19:50:29 -07003702 CLK_LOOKUP("iface_clk", pmic_arb0_p_clk.c, NULL),
3703 CLK_LOOKUP("iface_clk", pmic_arb1_p_clk.c, NULL),
3704 CLK_LOOKUP("core_clk", pmic_ssbi2_clk.c, NULL),
3705 CLK_LOOKUP("mem_clk", rpm_msg_ram_p_clk.c, NULL),
3706 CLK_LOOKUP("core_clk", amp_clk.c, NULL),
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07003707 CLK_LOOKUP("cam_clk", cam_clk.c, NULL),
3708 CLK_LOOKUP("csi_clk", csi0_clk.c, NULL),
3709 CLK_LOOKUP("csi_clk", csi1_clk.c, "msm_camera_ov7692.0"),
3710 CLK_LOOKUP("csi_clk", csi1_clk.c, "msm_camera_ov9726.0"),
3711 CLK_LOOKUP("csi_src_clk", csi_src_clk.c, NULL),
3712 CLK_LOOKUP("dsi_byte_div_clk", dsi_byte_clk.c, NULL),
3713 CLK_LOOKUP("dsi_esc_clk", dsi_esc_clk.c, NULL),
Matt Wagantall9dc01632011-08-17 18:55:04 -07003714 CLK_LOOKUP("core_clk", gfx2d0_clk.c, "kgsl-2d0.0"),
Matt Wagantall49722712011-08-17 18:50:53 -07003715 CLK_LOOKUP("core_clk", gfx2d0_clk.c, "footswitch-8x60.0"),
Matt Wagantall9dc01632011-08-17 18:55:04 -07003716 CLK_LOOKUP("core_clk", gfx2d1_clk.c, "kgsl-2d1.1"),
Matt Wagantall49722712011-08-17 18:50:53 -07003717 CLK_LOOKUP("core_clk", gfx2d1_clk.c, "footswitch-8x60.1"),
Matt Wagantall9dc01632011-08-17 18:55:04 -07003718 CLK_LOOKUP("core_clk", gfx3d_clk.c, "kgsl-3d0.0"),
Matt Wagantall49722712011-08-17 18:50:53 -07003719 CLK_LOOKUP("core_clk", gfx3d_clk.c, "footswitch-8x60.2"),
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07003720 CLK_LOOKUP("ijpeg_clk", ijpeg_clk.c, NULL),
Matt Wagantall49722712011-08-17 18:50:53 -07003721 CLK_LOOKUP("core_clk", ijpeg_clk.c, "footswitch-8x60.3"),
Matt Wagantallb86ad262011-10-24 19:50:29 -07003722 CLK_LOOKUP("core_clk", jpegd_clk.c, NULL),
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07003723 CLK_LOOKUP("mdp_clk", mdp_clk.c, NULL),
Matt Wagantall49722712011-08-17 18:50:53 -07003724 CLK_LOOKUP("core_clk", mdp_clk.c, "footswitch-8x60.4"),
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07003725 CLK_LOOKUP("mdp_vsync_clk", mdp_vsync_clk.c, NULL),
3726 CLK_LOOKUP("pixel_lcdc_clk", pixel_lcdc_clk.c, NULL),
3727 CLK_LOOKUP("pixel_mdp_clk", pixel_mdp_clk.c, NULL),
Matt Wagantallbb90da92011-10-25 15:07:52 -07003728 CLK_LOOKUP("core_clk", rot_clk.c, "msm_rotator.0"),
Matt Wagantall49722712011-08-17 18:50:53 -07003729 CLK_LOOKUP("core_clk", rot_clk.c, "footswitch-8x60.6"),
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07003730 CLK_LOOKUP("tv_enc_clk", tv_enc_clk.c, NULL),
3731 CLK_LOOKUP("tv_dac_clk", tv_dac_clk.c, NULL),
Matt Wagantall3f7660b2011-08-17 21:25:13 -07003732 CLK_LOOKUP("core_clk", vcodec_clk.c, "msm_vidc.0"),
Matt Wagantall49722712011-08-17 18:50:53 -07003733 CLK_LOOKUP("core_clk", vcodec_clk.c, "footswitch-8x60.7"),
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07003734 CLK_LOOKUP("mdp_tv_clk", mdp_tv_clk.c, NULL),
3735 CLK_LOOKUP("hdmi_clk", hdmi_tv_clk.c, NULL),
3736 CLK_LOOKUP("tv_src_clk", tv_src_clk.c, NULL),
Matt Wagantall5a4f1ba2011-08-18 18:13:03 -07003737 CLK_LOOKUP("core_clk", hdmi_app_clk.c, "hdmi_msm.1"),
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07003738 CLK_LOOKUP("vpe_clk", vpe_clk.c, NULL),
Matt Wagantall49722712011-08-17 18:50:53 -07003739 CLK_LOOKUP("core_clk", vpe_clk.c, "footswitch-8x60.9"),
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07003740 CLK_LOOKUP("csi_vfe_clk", csi0_vfe_clk.c, NULL),
3741 CLK_LOOKUP("csi_vfe_clk", csi1_vfe_clk.c, "msm_camera_ov7692.0"),
3742 CLK_LOOKUP("csi_vfe_clk", csi1_vfe_clk.c, "msm_camera_ov9726.0"),
3743 CLK_LOOKUP("vfe_clk", vfe_clk.c, NULL),
Matt Wagantall49722712011-08-17 18:50:53 -07003744 CLK_LOOKUP("core_clk", vfe_clk.c, "footswitch-8x60.8"),
Matt Wagantall49722712011-08-17 18:50:53 -07003745 CLK_LOOKUP("bus_clk", vfe_axi_clk.c, "footswitch-8x60.8"),
3746 CLK_LOOKUP("bus_clk", ijpeg_axi_clk.c, "footswitch-8x60.3"),
Matt Wagantall9dc01632011-08-17 18:55:04 -07003747 CLK_LOOKUP("mem_clk", imem_axi_clk.c, "kgsl-3d0.0"),
Matt Wagantall49722712011-08-17 18:50:53 -07003748 CLK_LOOKUP("bus_clk", mdp_axi_clk.c, "footswitch-8x60.4"),
3749 CLK_LOOKUP("bus_clk", rot_axi_clk.c, "footswitch-8x60.6"),
3750 CLK_LOOKUP("bus_clk", vcodec_axi_clk.c, "footswitch-8x60.7"),
3751 CLK_LOOKUP("bus_clk", vpe_axi_clk.c, "footswitch-8x60.9"),
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07003752 CLK_LOOKUP("amp_pclk", amp_p_clk.c, NULL),
3753 CLK_LOOKUP("csi_pclk", csi0_p_clk.c, NULL),
3754 CLK_LOOKUP("csi_pclk", csi1_p_clk.c, "msm_camera_ov7692.0"),
3755 CLK_LOOKUP("csi_pclk", csi1_p_clk.c, "msm_camera_ov9726.0"),
3756 CLK_LOOKUP("dsi_m_pclk", dsi_m_p_clk.c, NULL),
3757 CLK_LOOKUP("dsi_s_pclk", dsi_s_p_clk.c, NULL),
Matt Wagantall9dc01632011-08-17 18:55:04 -07003758 CLK_LOOKUP("iface_clk", gfx2d0_p_clk.c, "kgsl-2d0.0"),
Matt Wagantall49722712011-08-17 18:50:53 -07003759 CLK_LOOKUP("iface_clk", gfx2d0_p_clk.c, "footswitch-8x60.0"),
Matt Wagantall9dc01632011-08-17 18:55:04 -07003760 CLK_LOOKUP("iface_clk", gfx2d1_p_clk.c, "kgsl-2d1.1"),
Matt Wagantall49722712011-08-17 18:50:53 -07003761 CLK_LOOKUP("iface_clk", gfx2d1_p_clk.c, "footswitch-8x60.1"),
Matt Wagantall9dc01632011-08-17 18:55:04 -07003762 CLK_LOOKUP("iface_clk", gfx3d_p_clk.c, "kgsl-3d0.0"),
Matt Wagantall49722712011-08-17 18:50:53 -07003763 CLK_LOOKUP("iface_clk", gfx3d_p_clk.c, "footswitch-8x60.2"),
Matt Wagantall5a4f1ba2011-08-18 18:13:03 -07003764 CLK_LOOKUP("master_iface_clk", hdmi_m_p_clk.c, "hdmi_msm.1"),
3765 CLK_LOOKUP("slave_iface_clk", hdmi_s_p_clk.c, "hdmi_msm.1"),
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07003766 CLK_LOOKUP("ijpeg_pclk", ijpeg_p_clk.c, NULL),
Matt Wagantall49722712011-08-17 18:50:53 -07003767 CLK_LOOKUP("iface_clk", ijpeg_p_clk.c, "footswitch-8x60.3"),
Matt Wagantallb86ad262011-10-24 19:50:29 -07003768 CLK_LOOKUP("iface_clk", jpegd_p_clk.c, NULL),
Matt Wagantall9dc01632011-08-17 18:55:04 -07003769 CLK_LOOKUP("mem_iface_clk", imem_p_clk.c, "kgsl-3d0.0"),
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07003770 CLK_LOOKUP("mdp_pclk", mdp_p_clk.c, NULL),
Matt Wagantall49722712011-08-17 18:50:53 -07003771 CLK_LOOKUP("iface_clk", mdp_p_clk.c, "footswitch-8x60.4"),
Matt Wagantalle604d712011-10-21 15:38:18 -07003772 CLK_LOOKUP("iface_clk", smmu_p_clk.c, "msm_iommu"),
Matt Wagantallbb90da92011-10-25 15:07:52 -07003773 CLK_LOOKUP("iface_clk", rot_p_clk.c, "msm_rotator.0"),
Matt Wagantall49722712011-08-17 18:50:53 -07003774 CLK_LOOKUP("iface_clk", rot_p_clk.c, "footswitch-8x60.6"),
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07003775 CLK_LOOKUP("tv_enc_pclk", tv_enc_p_clk.c, NULL),
Matt Wagantall3f7660b2011-08-17 21:25:13 -07003776 CLK_LOOKUP("iface_clk", vcodec_p_clk.c, "msm_vidc.0"),
Matt Wagantall49722712011-08-17 18:50:53 -07003777 CLK_LOOKUP("iface_clk", vcodec_p_clk.c, "footswitch-8x60.7"),
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07003778 CLK_LOOKUP("vfe_pclk", vfe_p_clk.c, NULL),
Matt Wagantall49722712011-08-17 18:50:53 -07003779 CLK_LOOKUP("iface_clk", vfe_p_clk.c, "footswitch-8x60.8"),
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07003780 CLK_LOOKUP("vpe_pclk", vpe_p_clk.c, NULL),
Matt Wagantall49722712011-08-17 18:50:53 -07003781 CLK_LOOKUP("iface_clk", vpe_p_clk.c, "footswitch-8x60.9"),
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07003782 CLK_LOOKUP("mi2s_osr_clk", mi2s_osr_clk.c, NULL),
3783 CLK_LOOKUP("mi2s_bit_clk", mi2s_bit_clk.c, NULL),
3784 CLK_LOOKUP("i2s_mic_osr_clk", codec_i2s_mic_osr_clk.c, NULL),
3785 CLK_LOOKUP("i2s_mic_bit_clk", codec_i2s_mic_bit_clk.c, NULL),
3786 CLK_LOOKUP("i2s_mic_osr_clk", spare_i2s_mic_osr_clk.c, NULL),
3787 CLK_LOOKUP("i2s_mic_bit_clk", spare_i2s_mic_bit_clk.c, NULL),
3788 CLK_LOOKUP("i2s_spkr_osr_clk", codec_i2s_spkr_osr_clk.c, NULL),
3789 CLK_LOOKUP("i2s_spkr_bit_clk", codec_i2s_spkr_bit_clk.c, NULL),
3790 CLK_LOOKUP("i2s_spkr_osr_clk", spare_i2s_spkr_osr_clk.c, NULL),
3791 CLK_LOOKUP("i2s_spkr_bit_clk", spare_i2s_spkr_bit_clk.c, NULL),
3792 CLK_LOOKUP("pcm_clk", pcm_clk.c, NULL),
Matt Wagantalle604d712011-10-21 15:38:18 -07003793 CLK_LOOKUP("core_clk", jpegd_axi_clk.c, "msm_iommu.0"),
3794 CLK_LOOKUP("core_clk", mdp_axi_clk.c, "msm_iommu.2"),
3795 CLK_LOOKUP("core_clk", mdp_axi_clk.c, "msm_iommu.3"),
3796 CLK_LOOKUP("core_clk", ijpeg_axi_clk.c, "msm_iommu.5"),
3797 CLK_LOOKUP("core_clk", vfe_axi_clk.c, "msm_iommu.6"),
3798 CLK_LOOKUP("core_clk", vcodec_axi_clk.c, "msm_iommu.7"),
3799 CLK_LOOKUP("core_clk", vcodec_axi_clk.c, "msm_iommu.8"),
3800 CLK_LOOKUP("core_clk", gfx3d_clk.c, "msm_iommu.9"),
3801 CLK_LOOKUP("core_clk", gfx2d0_clk.c, "msm_iommu.10"),
3802 CLK_LOOKUP("core_clk", gfx2d1_clk.c, "msm_iommu.11"),
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07003803
3804 CLK_LOOKUP("dfab_dsps_clk", dfab_dsps_clk.c, NULL),
3805 CLK_LOOKUP("dfab_usb_hs_clk", dfab_usb_hs_clk.c, NULL),
Matt Wagantall37ce3842011-08-17 16:00:36 -07003806 CLK_LOOKUP("bus_clk", dfab_sdc1_clk.c, "msm_sdcc.1"),
3807 CLK_LOOKUP("bus_clk", dfab_sdc2_clk.c, "msm_sdcc.2"),
3808 CLK_LOOKUP("bus_clk", dfab_sdc3_clk.c, "msm_sdcc.3"),
3809 CLK_LOOKUP("bus_clk", dfab_sdc4_clk.c, "msm_sdcc.4"),
3810 CLK_LOOKUP("bus_clk", dfab_sdc5_clk.c, "msm_sdcc.5"),
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07003811
3812 CLK_LOOKUP("ebi1_msmbus_clk", ebi1_msmbus_clk.c, NULL),
Matt Wagantalle1a86062011-08-18 17:46:10 -07003813 CLK_LOOKUP("mem_clk", ebi1_adm0_clk.c, "msm_dmov.0"),
3814 CLK_LOOKUP("mem_clk", ebi1_adm1_clk.c, "msm_dmov.1"),
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07003815
3816 CLK_LOOKUP("sc0_mclk", sc0_m_clk, NULL),
3817 CLK_LOOKUP("sc1_mclk", sc1_m_clk, NULL),
3818 CLK_LOOKUP("l2_mclk", l2_m_clk, NULL),
3819};
3820
3821/*
3822 * Miscellaneous clock register initializations
3823 */
3824
3825/* Read, modify, then write-back a register. */
3826static void __init rmwreg(uint32_t val, void *reg, uint32_t mask)
3827{
3828 uint32_t regval = readl_relaxed(reg);
3829 regval &= ~mask;
3830 regval |= val;
3831 writel_relaxed(regval, reg);
3832}
3833
3834static void __init reg_init(void)
3835{
3836 /* Setup MM_PLL2 (PLL3), but turn it off. Rate set by set_rate_tv(). */
3837 rmwreg(0, MM_PLL2_MODE_REG, BIT(0)); /* Disable output */
3838 /* Set ref, bypass, assert reset, disable output, disable test mode */
3839 writel_relaxed(0, MM_PLL2_MODE_REG); /* PXO */
3840 writel_relaxed(0x00800000, MM_PLL2_CONFIG_REG); /* Enable main out. */
3841
3842 /* The clock driver doesn't use SC1's voting register to control
3843 * HW-voteable clocks. Clear its bits so that disabling bits in the
3844 * SC0 register will cause the corresponding clocks to be disabled. */
3845 rmwreg(BIT(12)|BIT(11), SC0_U_CLK_BRANCH_ENA_VOTE_REG, BM(12, 11));
3846 writel_relaxed(BIT(12)|BIT(11), SC1_U_CLK_BRANCH_ENA_VOTE_REG);
3847 /* Let sc_aclk and sc_clk halt when both Scorpions are collapsed. */
3848 writel_relaxed(BIT(12)|BIT(11), SC0_U_CLK_SLEEP_ENA_VOTE_REG);
3849 writel_relaxed(BIT(12)|BIT(11), SC1_U_CLK_SLEEP_ENA_VOTE_REG);
3850
3851 /* Deassert MM SW_RESET_ALL signal. */
3852 writel_relaxed(0, SW_RESET_ALL_REG);
3853
3854 /* Initialize MM AHB registers: Enable the FPB clock and disable HW
3855 * gating for all clocks. Also set VFE_AHB's FORCE_CORE_ON bit to
3856 * prevent its memory from being collapsed when the clock is halted.
3857 * The sleep and wake-up delays are set to safe values. */
Matt Wagantall30011d22011-07-25 20:32:04 -07003858 rmwreg(0x00000003, AHB_EN_REG, 0x6C000003);
3859 writel_relaxed(0x000007F9, AHB_EN2_REG);
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07003860
3861 /* Deassert all locally-owned MM AHB resets. */
3862 rmwreg(0, SW_RESET_AHB_REG, 0xFFF7DFFF);
3863
3864 /* Initialize MM AXI registers: Enable HW gating for all clocks that
3865 * support it. Also set FORCE_CORE_ON bits, and any sleep and wake-up
3866 * delays to safe values. */
Matt Wagantall30011d22011-07-25 20:32:04 -07003867 rmwreg(0x100207F9, MAXI_EN_REG, 0x1803FFFF);
3868 rmwreg(0x7027FCFF, MAXI_EN2_REG, 0x7A3FFFFF);
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07003869 writel_relaxed(0x3FE7FCFF, MAXI_EN3_REG);
3870 writel_relaxed(0x000001D8, SAXI_EN_REG);
3871
3872 /* Initialize MM CC registers: Set MM FORCE_CORE_ON bits so that core
3873 * memories retain state even when not clocked. Also, set sleep and
3874 * wake-up delays to safe values. */
Matt Wagantall30011d22011-07-25 20:32:04 -07003875 rmwreg(0x00000000, CSI_CC_REG, 0x00000018);
3876 rmwreg(0x00000400, MISC_CC_REG, 0x017C0400);
3877 rmwreg(0x000007FD, MISC_CC2_REG, 0x70C2E7FF);
3878 rmwreg(0x80FF0000, GFX2D0_CC_REG, 0xE0FF0010);
3879 rmwreg(0x80FF0000, GFX2D1_CC_REG, 0xE0FF0010);
3880 rmwreg(0x80FF0000, GFX3D_CC_REG, 0xE0FF0010);
3881 rmwreg(0x80FF0000, IJPEG_CC_REG, 0xE0FF0018);
3882 rmwreg(0x80FF0000, JPEGD_CC_REG, 0xE0FF0018);
3883 rmwreg(0x80FF0000, MDP_CC_REG, 0xE1FF0010);
3884 rmwreg(0x80FF0000, PIXEL_CC_REG, 0xE1FF0010);
3885 rmwreg(0x000004FF, PIXEL_CC2_REG, 0x000007FF);
3886 rmwreg(0x80FF0000, ROT_CC_REG, 0xE0FF0010);
3887 rmwreg(0x80FF0000, TV_CC_REG, 0xE1FFC010);
3888 rmwreg(0x000004FF, TV_CC2_REG, 0x000027FF);
3889 rmwreg(0xC0FF0000, VCODEC_CC_REG, 0xE0FF0010);
3890 rmwreg(0x80FF0000, VFE_CC_REG, 0xE0FFC010);
3891 rmwreg(0x80FF0000, VPE_CC_REG, 0xE0FF0010);
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07003892
3893 /* De-assert MM AXI resets to all hardware blocks. */
3894 writel_relaxed(0, SW_RESET_AXI_REG);
3895
3896 /* Deassert all MM core resets. */
3897 writel_relaxed(0, SW_RESET_CORE_REG);
3898
3899 /* Reset 3D core once more, with its clock enabled. This can
3900 * eventually be done as part of the GDFS footswitch driver. */
3901 clk_set_rate(&gfx3d_clk.c, 27000000);
3902 clk_enable(&gfx3d_clk.c);
3903 writel_relaxed(BIT(12), SW_RESET_CORE_REG);
3904 mb();
3905 udelay(5);
3906 writel_relaxed(0, SW_RESET_CORE_REG);
3907 /* Make sure reset is de-asserted before clock is disabled. */
3908 mb();
3909 clk_disable(&gfx3d_clk.c);
3910
3911 /* Enable TSSC and PDM PXO sources. */
3912 writel_relaxed(BIT(11), TSSC_CLK_CTL_REG);
3913 writel_relaxed(BIT(15), PDM_CLK_NS_REG);
3914 /* Set the dsi_byte_clk src to the DSI PHY PLL,
3915 * dsi_esc_clk to PXO/2, and the hdmi_app_clk src to PXO */
3916 rmwreg(0x400001, MISC_CC2_REG, 0x424003);
3917}
3918
3919/* Local clock driver initialization. */
Stephen Boydbb600ae2011-08-02 20:11:40 -07003920static void __init msm8660_clock_init(void)
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07003921{
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07003922 xo_pxo = msm_xo_get(MSM_XO_PXO, "clock-8x60");
3923 if (IS_ERR(xo_pxo)) {
3924 pr_err("%s: msm_xo_get(PXO) failed.\n", __func__);
3925 BUG();
3926 }
3927 xo_cxo = msm_xo_get(MSM_XO_TCXO_D1, "clock-8x60");
3928 if (IS_ERR(xo_cxo)) {
3929 pr_err("%s: msm_xo_get(CXO) failed.\n", __func__);
3930 BUG();
3931 }
3932
Matt Wagantalle18bbc82011-10-06 10:07:28 -07003933 vote_vdd_level(&vdd_dig, VDD_DIG_HIGH);
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07003934 /* Initialize clock registers. */
3935 reg_init();
3936
3937 /* Initialize rates for clocks that only support one. */
3938 clk_set_rate(&pdm_clk.c, 27000000);
3939 clk_set_rate(&prng_clk.c, 64000000);
3940 clk_set_rate(&mdp_vsync_clk.c, 27000000);
3941 clk_set_rate(&tsif_ref_clk.c, 105000);
3942 clk_set_rate(&tssc_clk.c, 27000000);
3943 clk_set_rate(&usb_hs1_xcvr_clk.c, 60000000);
3944 clk_set_rate(&usb_fs1_src_clk.c, 60000000);
3945 clk_set_rate(&usb_fs2_src_clk.c, 60000000);
3946
3947 /* The halt status bits for PDM and TSSC may be incorrect at boot.
3948 * Toggle these clocks on and off to refresh them. */
Matt Wagantall0625ea02011-07-13 18:51:56 -07003949 rcg_clk_enable(&pdm_clk.c);
3950 rcg_clk_disable(&pdm_clk.c);
3951 rcg_clk_enable(&tssc_clk.c);
3952 rcg_clk_disable(&tssc_clk.c);
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07003953}
3954
Stephen Boydbb600ae2011-08-02 20:11:40 -07003955static int __init msm8660_clock_late_init(void)
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07003956{
3957 int rc;
3958
3959 /* Vote for MMFPB to be at least 64MHz when an Apps CPU is active. */
3960 struct clk *mmfpb_a_clk = clk_get(NULL, "mmfpb_a_clk");
3961 if (WARN(IS_ERR(mmfpb_a_clk), "mmfpb_a_clk not found (%ld)\n",
3962 PTR_ERR(mmfpb_a_clk)))
3963 return PTR_ERR(mmfpb_a_clk);
Matt Wagantallde555f562011-11-08 14:18:07 -08003964 rc = clk_set_rate(mmfpb_a_clk, 64000000);
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07003965 if (WARN(rc, "mmfpb_a_clk rate was not set (%d)\n", rc))
3966 return rc;
3967 rc = clk_enable(mmfpb_a_clk);
3968 if (WARN(rc, "mmfpb_a_clk not enabled (%d)\n", rc))
3969 return rc;
3970
Matt Wagantalle18bbc82011-10-06 10:07:28 -07003971 return unvote_vdd_level(&vdd_dig, VDD_DIG_HIGH);
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07003972}
Stephen Boydbb600ae2011-08-02 20:11:40 -07003973
3974struct clock_init_data msm8x60_clock_init_data __initdata = {
3975 .table = msm_clocks_8x60,
3976 .size = ARRAY_SIZE(msm_clocks_8x60),
3977 .init = msm8660_clock_init,
3978 .late_init = msm8660_clock_late_init,
3979};