blob: 7e163df30b4d2b17a51288f4ab011f7efa109ced [file] [log] [blame]
Vikram Mulukutla489e39e2011-08-31 18:04:05 -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#include <linux/kernel.h>
14#include <linux/init.h>
15#include <linux/err.h>
16#include <linux/ctype.h>
17#include <linux/bitops.h>
18#include <linux/io.h>
19#include <linux/spinlock.h>
20#include <linux/delay.h>
21#include <linux/clk.h>
22#include <linux/clkdev.h>
23
24#include <asm/mach-types.h>
25
26#include <mach/msm_iomap.h>
27#include <mach/clk.h>
28#include <mach/msm_xo.h>
Vikram Mulukutla73d42112011-09-19 16:32:54 -070029#include <mach/rpm-9615.h>
Vikram Mulukutlab5e1cda2011-10-04 16:17:22 -070030#include <mach/rpm-regulator.h>
Vikram Mulukutla489e39e2011-08-31 18:04:05 -070031
32#include "clock-local.h"
33#include "clock-voter.h"
Vikram Mulukutla73d42112011-09-19 16:32:54 -070034#include "clock-rpm.h"
Vikram Mulukutla489e39e2011-08-31 18:04:05 -070035#include "devices.h"
36
37#define REG(off) (MSM_CLK_CTL_BASE + (off))
38#define REG_LPA(off) (MSM_LPASS_CLK_CTL_BASE + (off))
39#define REG_GCC(off) (MSM_APCS_GCC_BASE + (off))
40
41/* Peripheral clock registers. */
42#define CE1_HCLK_CTL_REG REG(0x2720)
43#define CE1_CORE_CLK_CTL_REG REG(0x2724)
44#define DMA_BAM_HCLK_CTL REG(0x25C0)
45#define CLK_HALT_CFPB_STATEA_REG REG(0x2FCC)
46#define CLK_HALT_CFPB_STATEB_REG REG(0x2FD0)
47#define CLK_HALT_CFPB_STATEC_REG REG(0x2FD4)
48#define CLK_HALT_DFAB_STATE_REG REG(0x2FC8)
49
50#define CLK_HALT_MSS_KPSS_MISC_STATE_REG REG(0x2FDC)
51#define CLK_HALT_SFPB_MISC_STATE_REG REG(0x2FD8)
52#define CLK_TEST_REG REG(0x2FA0)
Matt Wagantall7625a4c2011-11-01 16:17:53 -070053#define GPn_MD_REG(n) REG(0x2D00+(0x20*(n)))
54#define GPn_NS_REG(n) REG(0x2D24+(0x20*(n)))
Vikram Mulukutla489e39e2011-08-31 18:04:05 -070055#define GSBIn_HCLK_CTL_REG(n) REG(0x29C0+(0x20*((n)-1)))
56#define GSBIn_QUP_APPS_MD_REG(n) REG(0x29C8+(0x20*((n)-1)))
57#define GSBIn_QUP_APPS_NS_REG(n) REG(0x29CC+(0x20*((n)-1)))
58#define GSBIn_RESET_REG(n) REG(0x29DC+(0x20*((n)-1)))
59#define GSBIn_UART_APPS_MD_REG(n) REG(0x29D0+(0x20*((n)-1)))
60#define GSBIn_UART_APPS_NS_REG(n) REG(0x29D4+(0x20*((n)-1)))
61#define PDM_CLK_NS_REG REG(0x2CC0)
62#define BB_PLL_ENA_SC0_REG REG(0x34C0)
63
64#define BB_PLL0_L_VAL_REG REG(0x30C4)
65#define BB_PLL0_M_VAL_REG REG(0x30C8)
66#define BB_PLL0_MODE_REG REG(0x30C0)
67#define BB_PLL0_N_VAL_REG REG(0x30CC)
68#define BB_PLL0_STATUS_REG REG(0x30D8)
69#define BB_PLL0_CONFIG_REG REG(0x30D4)
70#define BB_PLL0_TEST_CTL_REG REG(0x30D0)
71
72#define BB_PLL8_L_VAL_REG REG(0x3144)
73#define BB_PLL8_M_VAL_REG REG(0x3148)
74#define BB_PLL8_MODE_REG REG(0x3140)
75#define BB_PLL8_N_VAL_REG REG(0x314C)
76#define BB_PLL8_STATUS_REG REG(0x3158)
77#define BB_PLL8_CONFIG_REG REG(0x3154)
78#define BB_PLL8_TEST_CTL_REG REG(0x3150)
79
80#define BB_PLL14_L_VAL_REG REG(0x31C4)
81#define BB_PLL14_M_VAL_REG REG(0x31C8)
82#define BB_PLL14_MODE_REG REG(0x31C0)
83#define BB_PLL14_N_VAL_REG REG(0x31CC)
84#define BB_PLL14_STATUS_REG REG(0x31D8)
85#define BB_PLL14_CONFIG_REG REG(0x31D4)
86#define BB_PLL14_TEST_CTL_REG REG(0x31D0)
87
88#define SC_PLL0_L_VAL_REG REG(0x3208)
89#define SC_PLL0_M_VAL_REG REG(0x320C)
90#define SC_PLL0_MODE_REG REG(0x3200)
91#define SC_PLL0_N_VAL_REG REG(0x3210)
92#define SC_PLL0_STATUS_REG REG(0x321C)
93#define SC_PLL0_CONFIG_REG REG(0x3204)
94#define SC_PLL0_TEST_CTL_REG REG(0x3218)
95
96#define PLLTEST_PAD_CFG_REG REG(0x2FA4)
97#define PMEM_ACLK_CTL_REG REG(0x25A0)
98#define RINGOSC_NS_REG REG(0x2DC0)
99#define RINGOSC_STATUS_REG REG(0x2DCC)
100#define RINGOSC_TCXO_CTL_REG REG(0x2DC4)
101#define SC0_U_CLK_BRANCH_ENA_VOTE_REG REG(0x3080)
102#define SDCn_APPS_CLK_MD_REG(n) REG(0x2828+(0x20*((n)-1)))
103#define SDCn_APPS_CLK_NS_REG(n) REG(0x282C+(0x20*((n)-1)))
104#define SDCn_HCLK_CTL_REG(n) REG(0x2820+(0x20*((n)-1)))
105#define SDCn_RESET_REG(n) REG(0x2830+(0x20*((n)-1)))
106#define USB_HS1_HCLK_CTL_REG REG(0x2900)
107#define USB_HS1_RESET_REG REG(0x2910)
108#define USB_HS1_XCVR_FS_CLK_MD_REG REG(0x2908)
109#define USB_HS1_XCVR_FS_CLK_NS_REG REG(0x290C)
110#define USB_HS1_SYS_CLK_MD_REG REG(0x36A0)
111#define USB_HS1_SYS_CLK_NS_REG REG(0x36A4)
112#define USB_HSIC_HCLK_CTL_REG REG(0x2920)
113#define USB_HSIC_XCVR_FS_CLK_MD_REG REG(0x2924)
114#define USB_HSIC_XCVR_FS_CLK_NS_REG REG(0x2928)
115#define USB_HSIC_RESET_REG REG(0x2934)
116#define USB_HSIC_HSIO_CAL_CLK_CTL_REG REG(0x2B48)
117#define USB_HSIC_CLK_MD_REG REG(0x2B4C)
118#define USB_HSIC_CLK_NS_REG REG(0x2B50)
119#define USB_HSIC_SYSTEM_CLK_MD_REG REG(0x2B54)
120#define USB_HSIC_SYSTEM_CLK_NS_REG REG(0x2B58)
121#define SLIMBUS_XO_SRC_CLK_CTL_REG REG(0x2628)
122
123/* Low-power Audio clock registers. */
124#define LCC_CLK_LS_DEBUG_CFG_REG REG_LPA(0x00A8)
125#define LCC_CODEC_I2S_MIC_MD_REG REG_LPA(0x0064)
126#define LCC_CODEC_I2S_MIC_NS_REG REG_LPA(0x0060)
127#define LCC_CODEC_I2S_MIC_STATUS_REG REG_LPA(0x0068)
128#define LCC_CODEC_I2S_SPKR_MD_REG REG_LPA(0x0070)
129#define LCC_CODEC_I2S_SPKR_NS_REG REG_LPA(0x006C)
130#define LCC_CODEC_I2S_SPKR_STATUS_REG REG_LPA(0x0074)
131#define LCC_MI2S_MD_REG REG_LPA(0x004C)
132#define LCC_MI2S_NS_REG REG_LPA(0x0048)
133#define LCC_MI2S_STATUS_REG REG_LPA(0x0050)
134#define LCC_PCM_MD_REG REG_LPA(0x0058)
135#define LCC_PCM_NS_REG REG_LPA(0x0054)
136#define LCC_PCM_STATUS_REG REG_LPA(0x005C)
137#define LCC_PLL0_STATUS_REG REG_LPA(0x0018)
138#define LCC_SPARE_I2S_MIC_MD_REG REG_LPA(0x007C)
139#define LCC_SPARE_I2S_MIC_NS_REG REG_LPA(0x0078)
140#define LCC_SPARE_I2S_MIC_STATUS_REG REG_LPA(0x0080)
141#define LCC_SPARE_I2S_SPKR_MD_REG REG_LPA(0x0088)
142#define LCC_SPARE_I2S_SPKR_NS_REG REG_LPA(0x0084)
143#define LCC_SPARE_I2S_SPKR_STATUS_REG REG_LPA(0x008C)
144#define LCC_SLIMBUS_NS_REG REG_LPA(0x00CC)
145#define LCC_SLIMBUS_MD_REG REG_LPA(0x00D0)
146#define LCC_SLIMBUS_STATUS_REG REG_LPA(0x00D4)
147#define LCC_AHBEX_BRANCH_CTL_REG REG_LPA(0x00E4)
148#define LCC_PRI_PLL_CLK_CTL_REG REG_LPA(0x00C4)
149
150#define GCC_APCS_CLK_DIAG REG_GCC(0x001C)
151
152/* MUX source input identifiers. */
153#define cxo_to_bb_mux 0
154#define pll8_to_bb_mux 3
155#define pll14_to_bb_mux 4
156#define gnd_to_bb_mux 6
157#define cxo_to_xo_mux 0
158#define gnd_to_xo_mux 3
159#define cxo_to_lpa_mux 1
160#define pll4_to_lpa_mux 2
161#define gnd_to_lpa_mux 6
162
163/* Test Vector Macros */
164#define TEST_TYPE_PER_LS 1
165#define TEST_TYPE_PER_HS 2
166#define TEST_TYPE_LPA 5
167#define TEST_TYPE_SHIFT 24
168#define TEST_CLK_SEL_MASK BM(23, 0)
169#define TEST_VECTOR(s, t) (((t) << TEST_TYPE_SHIFT) | BVAL(23, 0, (s)))
170#define TEST_PER_LS(s) TEST_VECTOR((s), TEST_TYPE_PER_LS)
171#define TEST_PER_HS(s) TEST_VECTOR((s), TEST_TYPE_PER_HS)
172#define TEST_LPA(s) TEST_VECTOR((s), TEST_TYPE_LPA)
173
174#define MN_MODE_DUAL_EDGE 0x2
175
176/* MD Registers */
177#define MD8(m_lsb, m, n_lsb, n) \
178 (BVAL((m_lsb+7), m_lsb, m) | BVAL((n_lsb+7), n_lsb, ~(n)))
179#define MD16(m, n) (BVAL(31, 16, m) | BVAL(15, 0, ~(n)))
180
181/* NS Registers */
182#define NS(n_msb, n_lsb, n, m, mde_lsb, d_msb, d_lsb, d, s_msb, s_lsb, s) \
183 (BVAL(n_msb, n_lsb, ~(n-m)) \
184 | (BVAL((mde_lsb+1), mde_lsb, MN_MODE_DUAL_EDGE) * !!(n)) \
185 | BVAL(d_msb, d_lsb, (d-1)) | BVAL(s_msb, s_lsb, s))
186
187#define NS_SRC_SEL(s_msb, s_lsb, s) \
188 BVAL(s_msb, s_lsb, s)
189
Matt Wagantalle18bbc82011-10-06 10:07:28 -0700190enum vdd_dig_levels {
191 VDD_DIG_NONE,
192 VDD_DIG_LOW,
193 VDD_DIG_NOMINAL,
194 VDD_DIG_HIGH
195};
196
197static int set_vdd_dig(struct clk_vdd_class *vdd_class, int level)
198{
Matt Wagantalle18bbc82011-10-06 10:07:28 -0700199 static const int vdd_uv[] = {
Vikram Mulukutla5e6ab912011-11-04 15:20:19 -0700200 [VDD_DIG_NONE] = 0,
201 [VDD_DIG_LOW] = 945000,
202 [VDD_DIG_NOMINAL] = 1050000,
Matt Wagantalle18bbc82011-10-06 10:07:28 -0700203 [VDD_DIG_HIGH] = 1150000
204 };
205
206 return rpm_vreg_set_voltage(RPM_VREG_ID_PM8018_S1, RPM_VREG_VOTER3,
207 vdd_uv[level], vdd_uv[VDD_DIG_HIGH], 1);
208}
209
210static DEFINE_VDD_CLASS(vdd_dig, set_vdd_dig);
211
212#define VDD_DIG_FMAX_MAP1(l1, f1) \
213 .vdd_class = &vdd_dig, \
214 .fmax[VDD_DIG_##l1] = (f1)
215#define VDD_DIG_FMAX_MAP2(l1, f1, l2, f2) \
216 .vdd_class = &vdd_dig, \
217 .fmax[VDD_DIG_##l1] = (f1), \
218 .fmax[VDD_DIG_##l2] = (f2)
Vikram Mulukutla489e39e2011-08-31 18:04:05 -0700219
220/*
221 * Clock Descriptions
222 */
223
224static struct msm_xo_voter *xo_cxo;
225
226static int cxo_clk_enable(struct clk *clk)
227{
228 return msm_xo_mode_vote(xo_cxo, MSM_XO_MODE_ON);
229}
230
231static void cxo_clk_disable(struct clk *clk)
232{
233 msm_xo_mode_vote(xo_cxo, MSM_XO_MODE_OFF);
234}
235
236static struct clk_ops clk_ops_cxo = {
237 .enable = cxo_clk_enable,
238 .disable = cxo_clk_disable,
239 .get_rate = fixed_clk_get_rate,
240 .is_local = local_clk_is_local,
241};
242
243static struct fixed_clk cxo_clk = {
244 .rate = 19200000,
245 .c = {
246 .dbg_name = "cxo_clk",
247 .ops = &clk_ops_cxo,
248 CLK_INIT(cxo_clk.c),
249 },
250};
251
252static struct pll_vote_clk pll0_clk = {
253 .rate = 276000000,
254 .en_reg = BB_PLL_ENA_SC0_REG,
255 .en_mask = BIT(0),
256 .status_reg = BB_PLL0_STATUS_REG,
257 .parent = &cxo_clk.c,
258 .c = {
259 .dbg_name = "pll0_clk",
260 .ops = &clk_ops_pll_vote,
261 CLK_INIT(pll0_clk.c),
262 },
263};
264
265static struct pll_vote_clk pll4_clk = {
266 .rate = 393216000,
267 .en_reg = BB_PLL_ENA_SC0_REG,
268 .en_mask = BIT(4),
269 .status_reg = LCC_PLL0_STATUS_REG,
270 .parent = &cxo_clk.c,
271 .c = {
272 .dbg_name = "pll4_clk",
273 .ops = &clk_ops_pll_vote,
274 CLK_INIT(pll4_clk.c),
275 },
276};
277
278static struct pll_vote_clk pll8_clk = {
279 .rate = 384000000,
280 .en_reg = BB_PLL_ENA_SC0_REG,
281 .en_mask = BIT(8),
282 .status_reg = BB_PLL8_STATUS_REG,
283 .parent = &cxo_clk.c,
284 .c = {
285 .dbg_name = "pll8_clk",
286 .ops = &clk_ops_pll_vote,
287 CLK_INIT(pll8_clk.c),
288 },
289};
290
291static struct pll_vote_clk pll9_clk = {
292 .rate = 440000000,
293 .en_reg = BB_PLL_ENA_SC0_REG,
294 .en_mask = BIT(9),
295 .status_reg = SC_PLL0_STATUS_REG,
296 .parent = &cxo_clk.c,
297 .c = {
298 .dbg_name = "pll9_clk",
299 .ops = &clk_ops_pll_vote,
300 CLK_INIT(pll9_clk.c),
301 },
302};
303
304static struct pll_vote_clk pll14_clk = {
305 .rate = 480000000,
306 .en_reg = BB_PLL_ENA_SC0_REG,
307 .en_mask = BIT(11),
308 .status_reg = BB_PLL14_STATUS_REG,
309 .parent = &cxo_clk.c,
310 .c = {
311 .dbg_name = "pll14_clk",
312 .ops = &clk_ops_pll_vote,
313 CLK_INIT(pll14_clk.c),
314 },
315};
316
Vikram Mulukutla489e39e2011-08-31 18:04:05 -0700317static int soc_clk_reset(struct clk *clk, enum clk_reset_action action)
318{
319 return branch_reset(&to_rcg_clk(clk)->b, action);
320}
321
322static struct clk_ops clk_ops_rcg_9615 = {
323 .enable = rcg_clk_enable,
324 .disable = rcg_clk_disable,
Matt Wagantall41af0772011-09-17 12:21:39 -0700325 .auto_off = rcg_clk_disable,
Vikram Mulukutla489e39e2011-08-31 18:04:05 -0700326 .set_rate = rcg_clk_set_rate,
327 .set_min_rate = rcg_clk_set_min_rate,
328 .get_rate = rcg_clk_get_rate,
329 .list_rate = rcg_clk_list_rate,
330 .is_enabled = rcg_clk_is_enabled,
331 .round_rate = rcg_clk_round_rate,
332 .reset = soc_clk_reset,
333 .is_local = local_clk_is_local,
334 .get_parent = rcg_clk_get_parent,
335};
336
337static struct clk_ops clk_ops_branch = {
338 .enable = branch_clk_enable,
339 .disable = branch_clk_disable,
Matt Wagantall41af0772011-09-17 12:21:39 -0700340 .auto_off = branch_clk_disable,
Vikram Mulukutla489e39e2011-08-31 18:04:05 -0700341 .is_enabled = branch_clk_is_enabled,
342 .reset = branch_clk_reset,
343 .is_local = local_clk_is_local,
344 .get_parent = branch_clk_get_parent,
345 .set_parent = branch_clk_set_parent,
346};
347
348/*
349 * Peripheral Clocks
350 */
Matt Wagantall7625a4c2011-11-01 16:17:53 -0700351#define CLK_GP(i, n, h_r, h_b) \
352 struct rcg_clk i##_clk = { \
353 .b = { \
354 .ctl_reg = GPn_NS_REG(n), \
355 .en_mask = BIT(9), \
356 .halt_reg = h_r, \
357 .halt_bit = h_b, \
358 }, \
359 .ns_reg = GPn_NS_REG(n), \
360 .md_reg = GPn_MD_REG(n), \
361 .root_en_mask = BIT(11), \
362 .ns_mask = (BM(23, 16) | BM(6, 0)), \
363 .set_rate = set_rate_mnd, \
364 .freq_tbl = clk_tbl_gp, \
365 .current_freq = &rcg_dummy_freq, \
366 .c = { \
367 .dbg_name = #i "_clk", \
368 .ops = &clk_ops_rcg_9615, \
369 VDD_DIG_FMAX_MAP1(LOW, 27000000), \
370 CLK_INIT(i##_clk.c), \
371 }, \
372 }
373#define F_GP(f, s, d, m, n) \
374 { \
375 .freq_hz = f, \
376 .src_clk = &s##_clk.c, \
377 .md_val = MD8(16, m, 0, n), \
378 .ns_val = NS(23, 16, n, m, 5, 4, 3, d, 2, 0, s##_to_bb_mux), \
379 .mnd_en_mask = BIT(8) * !!(n), \
380 }
381static struct clk_freq_tbl clk_tbl_gp[] = {
382 F_GP( 0, gnd, 1, 0, 0),
383 F_GP( 9600000, cxo, 2, 0, 0),
384 F_GP( 19200000, cxo, 1, 0, 0),
385 F_END
386};
387
388static CLK_GP(gp0, 0, CLK_HALT_SFPB_MISC_STATE_REG, 7);
389static CLK_GP(gp1, 1, CLK_HALT_SFPB_MISC_STATE_REG, 6);
390static CLK_GP(gp2, 2, CLK_HALT_SFPB_MISC_STATE_REG, 5);
391
Vikram Mulukutla489e39e2011-08-31 18:04:05 -0700392#define CLK_GSBI_UART(i, n, h_r, h_b) \
393 struct rcg_clk i##_clk = { \
394 .b = { \
395 .ctl_reg = GSBIn_UART_APPS_NS_REG(n), \
396 .en_mask = BIT(9), \
397 .reset_reg = GSBIn_RESET_REG(n), \
398 .reset_mask = BIT(0), \
399 .halt_reg = h_r, \
400 .halt_bit = h_b, \
401 }, \
402 .ns_reg = GSBIn_UART_APPS_NS_REG(n), \
403 .md_reg = GSBIn_UART_APPS_MD_REG(n), \
404 .root_en_mask = BIT(11), \
405 .ns_mask = (BM(31, 16) | BM(6, 0)), \
406 .set_rate = set_rate_mnd, \
407 .freq_tbl = clk_tbl_gsbi_uart, \
408 .current_freq = &rcg_dummy_freq, \
409 .c = { \
410 .dbg_name = #i "_clk", \
411 .ops = &clk_ops_rcg_9615, \
Matt Wagantalle18bbc82011-10-06 10:07:28 -0700412 VDD_DIG_FMAX_MAP2(LOW, 32000000, NOMINAL, 64000000), \
Vikram Mulukutla489e39e2011-08-31 18:04:05 -0700413 CLK_INIT(i##_clk.c), \
414 }, \
415 }
Matt Wagantalle18bbc82011-10-06 10:07:28 -0700416#define F_GSBI_UART(f, s, d, m, n) \
Vikram Mulukutla489e39e2011-08-31 18:04:05 -0700417 { \
418 .freq_hz = f, \
419 .src_clk = &s##_clk.c, \
420 .md_val = MD16(m, n), \
421 .ns_val = NS(31, 16, n, m, 5, 4, 3, d, 2, 0, s##_to_bb_mux), \
422 .mnd_en_mask = BIT(8) * !!(n), \
Vikram Mulukutla489e39e2011-08-31 18:04:05 -0700423 }
424static struct clk_freq_tbl clk_tbl_gsbi_uart[] = {
Matt Wagantalle18bbc82011-10-06 10:07:28 -0700425 F_GSBI_UART( 0, gnd, 1, 0, 0),
426 F_GSBI_UART( 3686400, pll8, 1, 6, 625),
427 F_GSBI_UART( 7372800, pll8, 1, 12, 625),
428 F_GSBI_UART(14745600, pll8, 1, 24, 625),
429 F_GSBI_UART(16000000, pll8, 4, 1, 6),
430 F_GSBI_UART(24000000, pll8, 4, 1, 4),
431 F_GSBI_UART(32000000, pll8, 4, 1, 3),
432 F_GSBI_UART(40000000, pll8, 1, 5, 48),
433 F_GSBI_UART(46400000, pll8, 1, 29, 240),
434 F_GSBI_UART(48000000, pll8, 4, 1, 2),
435 F_GSBI_UART(51200000, pll8, 1, 2, 15),
436 F_GSBI_UART(56000000, pll8, 1, 7, 48),
437 F_GSBI_UART(58982400, pll8, 1, 96, 625),
438 F_GSBI_UART(64000000, pll8, 2, 1, 3),
Vikram Mulukutla489e39e2011-08-31 18:04:05 -0700439 F_END
440};
441
442static CLK_GSBI_UART(gsbi1_uart, 1, CLK_HALT_CFPB_STATEA_REG, 10);
443static CLK_GSBI_UART(gsbi2_uart, 2, CLK_HALT_CFPB_STATEA_REG, 6);
444static CLK_GSBI_UART(gsbi3_uart, 3, CLK_HALT_CFPB_STATEA_REG, 2);
445static CLK_GSBI_UART(gsbi4_uart, 4, CLK_HALT_CFPB_STATEB_REG, 26);
446static CLK_GSBI_UART(gsbi5_uart, 5, CLK_HALT_CFPB_STATEB_REG, 22);
447
448#define CLK_GSBI_QUP(i, n, h_r, h_b) \
449 struct rcg_clk i##_clk = { \
450 .b = { \
451 .ctl_reg = GSBIn_QUP_APPS_NS_REG(n), \
452 .en_mask = BIT(9), \
453 .reset_reg = GSBIn_RESET_REG(n), \
454 .reset_mask = BIT(0), \
455 .halt_reg = h_r, \
456 .halt_bit = h_b, \
457 }, \
458 .ns_reg = GSBIn_QUP_APPS_NS_REG(n), \
459 .md_reg = GSBIn_QUP_APPS_MD_REG(n), \
460 .root_en_mask = BIT(11), \
461 .ns_mask = (BM(23, 16) | BM(6, 0)), \
462 .set_rate = set_rate_mnd, \
463 .freq_tbl = clk_tbl_gsbi_qup, \
464 .current_freq = &rcg_dummy_freq, \
465 .c = { \
466 .dbg_name = #i "_clk", \
467 .ops = &clk_ops_rcg_9615, \
Matt Wagantalle18bbc82011-10-06 10:07:28 -0700468 VDD_DIG_FMAX_MAP2(LOW, 24000000, NOMINAL, 52000000), \
Vikram Mulukutla489e39e2011-08-31 18:04:05 -0700469 CLK_INIT(i##_clk.c), \
470 }, \
471 }
Matt Wagantalle18bbc82011-10-06 10:07:28 -0700472#define F_GSBI_QUP(f, s, d, m, n) \
Vikram Mulukutla489e39e2011-08-31 18:04:05 -0700473 { \
474 .freq_hz = f, \
475 .src_clk = &s##_clk.c, \
476 .md_val = MD8(16, m, 0, n), \
477 .ns_val = NS(23, 16, n, m, 5, 4, 3, d, 2, 0, s##_to_bb_mux), \
478 .mnd_en_mask = BIT(8) * !!(n), \
Vikram Mulukutla489e39e2011-08-31 18:04:05 -0700479 }
480static struct clk_freq_tbl clk_tbl_gsbi_qup[] = {
Matt Wagantalle18bbc82011-10-06 10:07:28 -0700481 F_GSBI_QUP( 0, gnd, 1, 0, 0),
482 F_GSBI_QUP( 960000, cxo, 4, 1, 5),
483 F_GSBI_QUP( 4800000, cxo, 4, 0, 1),
484 F_GSBI_QUP( 9600000, cxo, 2, 0, 1),
485 F_GSBI_QUP(15058800, pll8, 1, 2, 51),
486 F_GSBI_QUP(24000000, pll8, 4, 1, 4),
487 F_GSBI_QUP(25600000, pll8, 1, 1, 15),
488 F_GSBI_QUP(48000000, pll8, 4, 1, 2),
489 F_GSBI_QUP(51200000, pll8, 1, 2, 15),
Vikram Mulukutla489e39e2011-08-31 18:04:05 -0700490 F_END
491};
492
493static CLK_GSBI_QUP(gsbi1_qup, 1, CLK_HALT_CFPB_STATEA_REG, 9);
494static CLK_GSBI_QUP(gsbi2_qup, 2, CLK_HALT_CFPB_STATEA_REG, 4);
495static CLK_GSBI_QUP(gsbi3_qup, 3, CLK_HALT_CFPB_STATEA_REG, 0);
496static CLK_GSBI_QUP(gsbi4_qup, 4, CLK_HALT_CFPB_STATEB_REG, 24);
497static CLK_GSBI_QUP(gsbi5_qup, 5, CLK_HALT_CFPB_STATEB_REG, 20);
498
Matt Wagantalle18bbc82011-10-06 10:07:28 -0700499#define F_PDM(f, s, d) \
Vikram Mulukutla489e39e2011-08-31 18:04:05 -0700500 { \
501 .freq_hz = f, \
502 .src_clk = &s##_clk.c, \
503 .ns_val = NS_SRC_SEL(1, 0, s##_to_xo_mux), \
Vikram Mulukutla489e39e2011-08-31 18:04:05 -0700504 }
505static struct clk_freq_tbl clk_tbl_pdm[] = {
Matt Wagantalle18bbc82011-10-06 10:07:28 -0700506 F_PDM( 0, gnd, 1),
507 F_PDM(19200000, cxo, 1),
Vikram Mulukutla489e39e2011-08-31 18:04:05 -0700508 F_END
509};
510
511static struct rcg_clk pdm_clk = {
512 .b = {
513 .ctl_reg = PDM_CLK_NS_REG,
514 .en_mask = BIT(9),
515 .reset_reg = PDM_CLK_NS_REG,
516 .reset_mask = BIT(12),
517 .halt_reg = CLK_HALT_CFPB_STATEC_REG,
518 .halt_bit = 3,
519 },
520 .ns_reg = PDM_CLK_NS_REG,
521 .root_en_mask = BIT(11),
522 .ns_mask = BM(1, 0),
523 .set_rate = set_rate_nop,
524 .freq_tbl = clk_tbl_pdm,
525 .current_freq = &rcg_dummy_freq,
526 .c = {
527 .dbg_name = "pdm_clk",
528 .ops = &clk_ops_rcg_9615,
Matt Wagantalle18bbc82011-10-06 10:07:28 -0700529 VDD_DIG_FMAX_MAP1(LOW, 19200000),
Vikram Mulukutla489e39e2011-08-31 18:04:05 -0700530 CLK_INIT(pdm_clk.c),
531 },
532};
533
534static struct branch_clk pmem_clk = {
535 .b = {
536 .ctl_reg = PMEM_ACLK_CTL_REG,
537 .en_mask = BIT(4),
538 .halt_reg = CLK_HALT_DFAB_STATE_REG,
539 .halt_bit = 20,
540 },
541 .c = {
542 .dbg_name = "pmem_clk",
543 .ops = &clk_ops_branch,
544 CLK_INIT(pmem_clk.c),
545 },
546};
547
Matt Wagantalle18bbc82011-10-06 10:07:28 -0700548#define F_PRNG(f, s) \
Vikram Mulukutla489e39e2011-08-31 18:04:05 -0700549 { \
550 .freq_hz = f, \
551 .src_clk = &s##_clk.c, \
Vikram Mulukutla489e39e2011-08-31 18:04:05 -0700552 }
553static struct clk_freq_tbl clk_tbl_prng[] = {
Matt Wagantalle18bbc82011-10-06 10:07:28 -0700554 F_PRNG(32000000, pll8),
Vikram Mulukutla489e39e2011-08-31 18:04:05 -0700555 F_END
556};
557
558static struct rcg_clk prng_clk = {
559 .b = {
560 .ctl_reg = SC0_U_CLK_BRANCH_ENA_VOTE_REG,
561 .en_mask = BIT(10),
562 .halt_reg = CLK_HALT_SFPB_MISC_STATE_REG,
563 .halt_check = HALT_VOTED,
564 .halt_bit = 10,
565 },
566 .set_rate = set_rate_nop,
567 .freq_tbl = clk_tbl_prng,
568 .current_freq = &rcg_dummy_freq,
569 .c = {
570 .dbg_name = "prng_clk",
571 .ops = &clk_ops_rcg_9615,
Matt Wagantalle18bbc82011-10-06 10:07:28 -0700572 VDD_DIG_FMAX_MAP2(LOW, 32000000, NOMINAL, 65000000),
Vikram Mulukutla489e39e2011-08-31 18:04:05 -0700573 CLK_INIT(prng_clk.c),
574 },
575};
576
577#define CLK_SDC(name, n, h_b, f_table) \
578 struct rcg_clk name = { \
579 .b = { \
580 .ctl_reg = SDCn_APPS_CLK_NS_REG(n), \
581 .en_mask = BIT(9), \
582 .reset_reg = SDCn_RESET_REG(n), \
583 .reset_mask = BIT(0), \
584 .halt_reg = CLK_HALT_DFAB_STATE_REG, \
585 .halt_bit = h_b, \
586 }, \
587 .ns_reg = SDCn_APPS_CLK_NS_REG(n), \
588 .md_reg = SDCn_APPS_CLK_MD_REG(n), \
589 .root_en_mask = BIT(11), \
590 .ns_mask = (BM(23, 16) | BM(6, 0)), \
591 .set_rate = set_rate_mnd, \
592 .freq_tbl = f_table, \
593 .current_freq = &rcg_dummy_freq, \
594 .c = { \
595 .dbg_name = #name, \
596 .ops = &clk_ops_rcg_9615, \
Matt Wagantalle18bbc82011-10-06 10:07:28 -0700597 VDD_DIG_FMAX_MAP2(LOW, 25000000, NOMINAL, 50000000), \
Vikram Mulukutla489e39e2011-08-31 18:04:05 -0700598 CLK_INIT(name.c), \
599 }, \
600 }
Matt Wagantalle18bbc82011-10-06 10:07:28 -0700601#define F_SDC(f, s, d, m, n) \
Vikram Mulukutla489e39e2011-08-31 18:04:05 -0700602 { \
603 .freq_hz = f, \
604 .src_clk = &s##_clk.c, \
605 .md_val = MD8(16, m, 0, n), \
606 .ns_val = NS(23, 16, n, m, 5, 4, 3, d, 2, 0, s##_to_bb_mux), \
607 .mnd_en_mask = BIT(8) * !!(n), \
Vikram Mulukutla489e39e2011-08-31 18:04:05 -0700608 }
609static struct clk_freq_tbl clk_tbl_sdc1_2[] = {
Matt Wagantalle18bbc82011-10-06 10:07:28 -0700610 F_SDC( 0, gnd, 1, 0, 0),
611 F_SDC( 144300, cxo, 1, 1, 133),
612 F_SDC( 400000, pll8, 4, 1, 240),
613 F_SDC( 16000000, pll8, 4, 1, 6),
614 F_SDC( 17070000, pll8, 1, 2, 45),
615 F_SDC( 20210000, pll8, 1, 1, 19),
616 F_SDC( 24000000, pll8, 4, 1, 4),
617 F_SDC( 48000000, pll8, 4, 1, 2),
Vikram Mulukutla489e39e2011-08-31 18:04:05 -0700618 F_END
619};
620
621static CLK_SDC(sdc1_clk, 1, 6, clk_tbl_sdc1_2);
622static CLK_SDC(sdc2_clk, 2, 5, clk_tbl_sdc1_2);
623
Matt Wagantalle18bbc82011-10-06 10:07:28 -0700624#define F_USB(f, s, d, m, n) \
Vikram Mulukutla489e39e2011-08-31 18:04:05 -0700625 { \
626 .freq_hz = f, \
627 .src_clk = &s##_clk.c, \
628 .md_val = MD8(16, m, 0, n), \
629 .ns_val = NS(23, 16, n, m, 5, 4, 3, d, 2, 0, s##_to_bb_mux), \
630 .mnd_en_mask = BIT(8) * !!(n), \
Vikram Mulukutla489e39e2011-08-31 18:04:05 -0700631 }
632static struct clk_freq_tbl clk_tbl_usb[] = {
Matt Wagantalle18bbc82011-10-06 10:07:28 -0700633 F_USB( 0, gnd, 1, 0, 0),
634 F_USB(60000000, pll8, 1, 5, 32),
Vikram Mulukutla489e39e2011-08-31 18:04:05 -0700635 F_END
636};
637
638static struct rcg_clk usb_hs1_xcvr_clk = {
639 .b = {
640 .ctl_reg = USB_HS1_XCVR_FS_CLK_NS_REG,
641 .en_mask = BIT(9),
642 .reset_reg = USB_HS1_RESET_REG,
643 .reset_mask = BIT(0),
644 .halt_reg = CLK_HALT_DFAB_STATE_REG,
645 .halt_bit = 0,
646 },
647 .ns_reg = USB_HS1_XCVR_FS_CLK_NS_REG,
648 .md_reg = USB_HS1_XCVR_FS_CLK_MD_REG,
649 .root_en_mask = BIT(11),
650 .ns_mask = (BM(23, 16) | BM(6, 0)),
651 .set_rate = set_rate_mnd,
652 .freq_tbl = clk_tbl_usb,
653 .current_freq = &rcg_dummy_freq,
654 .c = {
655 .dbg_name = "usb_hs1_xcvr_clk",
656 .ops = &clk_ops_rcg_9615,
Matt Wagantalle18bbc82011-10-06 10:07:28 -0700657 VDD_DIG_FMAX_MAP1(NOMINAL, 60000000),
Vikram Mulukutla489e39e2011-08-31 18:04:05 -0700658 CLK_INIT(usb_hs1_xcvr_clk.c),
659 },
660};
661
662static struct rcg_clk usb_hs1_sys_clk = {
663 .b = {
664 .ctl_reg = USB_HS1_SYS_CLK_NS_REG,
665 .en_mask = BIT(9),
666 .reset_reg = USB_HS1_RESET_REG,
667 .reset_mask = BIT(0),
668 .halt_reg = CLK_HALT_DFAB_STATE_REG,
669 .halt_bit = 4,
670 },
671 .ns_reg = USB_HS1_SYS_CLK_NS_REG,
672 .md_reg = USB_HS1_SYS_CLK_MD_REG,
673 .root_en_mask = BIT(11),
674 .ns_mask = (BM(23, 16) | BM(6, 0)),
675 .set_rate = set_rate_mnd,
676 .freq_tbl = clk_tbl_usb,
677 .current_freq = &rcg_dummy_freq,
678 .c = {
679 .dbg_name = "usb_hs1_sys_clk",
680 .ops = &clk_ops_rcg_9615,
Matt Wagantalle18bbc82011-10-06 10:07:28 -0700681 VDD_DIG_FMAX_MAP1(NOMINAL, 60000000),
Vikram Mulukutla489e39e2011-08-31 18:04:05 -0700682 CLK_INIT(usb_hs1_sys_clk.c),
683 },
684};
685
686static struct rcg_clk usb_hsic_xcvr_clk = {
687 .b = {
688 .ctl_reg = USB_HSIC_XCVR_FS_CLK_NS_REG,
689 .en_mask = BIT(9),
690 .reset_reg = USB_HSIC_RESET_REG,
691 .reset_mask = BIT(0),
692 .halt_reg = CLK_HALT_DFAB_STATE_REG,
693 .halt_bit = 9,
694 },
695 .ns_reg = USB_HSIC_XCVR_FS_CLK_NS_REG,
696 .md_reg = USB_HSIC_XCVR_FS_CLK_MD_REG,
697 .root_en_mask = BIT(11),
698 .ns_mask = (BM(23, 16) | BM(6, 0)),
699 .set_rate = set_rate_mnd,
700 .freq_tbl = clk_tbl_usb,
701 .current_freq = &rcg_dummy_freq,
702 .c = {
703 .dbg_name = "usb_hsic_xcvr_clk",
704 .ops = &clk_ops_rcg_9615,
Matt Wagantalle18bbc82011-10-06 10:07:28 -0700705 VDD_DIG_FMAX_MAP1(NOMINAL, 60000000),
Vikram Mulukutla489e39e2011-08-31 18:04:05 -0700706 CLK_INIT(usb_hsic_xcvr_clk.c),
707 },
708};
709
710static struct rcg_clk usb_hsic_sys_clk = {
711 .b = {
712 .ctl_reg = USB_HSIC_SYSTEM_CLK_NS_REG,
713 .en_mask = BIT(9),
714 .reset_reg = USB_HSIC_RESET_REG,
715 .reset_mask = BIT(0),
716 .halt_reg = CLK_HALT_DFAB_STATE_REG,
717 .halt_bit = 7,
718 },
719 .ns_reg = USB_HSIC_SYSTEM_CLK_NS_REG,
720 .md_reg = USB_HSIC_SYSTEM_CLK_MD_REG,
721 .root_en_mask = BIT(11),
722 .ns_mask = (BM(23, 16) | BM(6, 0)),
723 .set_rate = set_rate_mnd,
724 .freq_tbl = clk_tbl_usb,
725 .current_freq = &rcg_dummy_freq,
726 .c = {
727 .dbg_name = "usb_hsic_sys_clk",
728 .ops = &clk_ops_rcg_9615,
Matt Wagantalle18bbc82011-10-06 10:07:28 -0700729 VDD_DIG_FMAX_MAP1(NOMINAL, 60000000),
Vikram Mulukutla489e39e2011-08-31 18:04:05 -0700730 CLK_INIT(usb_hsic_sys_clk.c),
731 },
732};
733
734static struct clk_freq_tbl clk_tbl_usb_hsic[] = {
Matt Wagantalle18bbc82011-10-06 10:07:28 -0700735 F_USB( 0, gnd, 1, 0, 0),
736 F_USB(480000000, pll14, 1, 0, 1),
Vikram Mulukutla489e39e2011-08-31 18:04:05 -0700737 F_END
738};
739
740static struct rcg_clk usb_hsic_clk = {
741 .b = {
742 .ctl_reg = USB_HSIC_CLK_NS_REG,
743 .en_mask = BIT(9),
744 .reset_reg = USB_HSIC_RESET_REG,
745 .reset_mask = BIT(0),
746 .halt_reg = CLK_HALT_DFAB_STATE_REG,
747 .halt_bit = 7,
748 },
749 .ns_reg = USB_HSIC_CLK_NS_REG,
750 .md_reg = USB_HSIC_CLK_MD_REG,
751 .root_en_mask = BIT(11),
752 .ns_mask = (BM(23, 16) | BM(6, 0)),
753 .set_rate = set_rate_mnd,
754 .freq_tbl = clk_tbl_usb_hsic,
755 .current_freq = &rcg_dummy_freq,
756 .c = {
757 .dbg_name = "usb_hsic_clk",
758 .ops = &clk_ops_rcg_9615,
Matt Wagantalle18bbc82011-10-06 10:07:28 -0700759 VDD_DIG_FMAX_MAP1(NOMINAL, 480000000),
Vikram Mulukutla489e39e2011-08-31 18:04:05 -0700760 CLK_INIT(usb_hsic_clk.c),
761 },
762};
763
764static struct branch_clk usb_hsic_hsio_cal_clk = {
765 .b = {
766 .ctl_reg = USB_HSIC_HSIO_CAL_CLK_CTL_REG,
767 .en_mask = BIT(0),
768 .halt_reg = CLK_HALT_DFAB_STATE_REG,
769 .halt_bit = 8,
770 },
771 .parent = &cxo_clk.c,
772 .c = {
773 .dbg_name = "usb_hsic_hsio_cal_clk",
774 .ops = &clk_ops_branch,
775 CLK_INIT(usb_hsic_hsio_cal_clk.c),
776 },
777};
778
779/* Fast Peripheral Bus Clocks */
780static struct branch_clk ce1_core_clk = {
781 .b = {
782 .ctl_reg = CE1_CORE_CLK_CTL_REG,
783 .en_mask = BIT(4),
784 .halt_reg = CLK_HALT_CFPB_STATEC_REG,
785 .halt_bit = 27,
786 },
787 .c = {
788 .dbg_name = "ce1_core_clk",
789 .ops = &clk_ops_branch,
790 CLK_INIT(ce1_core_clk.c),
791 },
792};
793static struct branch_clk ce1_p_clk = {
794 .b = {
795 .ctl_reg = CE1_HCLK_CTL_REG,
796 .en_mask = BIT(4),
797 .halt_reg = CLK_HALT_CFPB_STATEC_REG,
798 .halt_bit = 1,
799 },
800 .c = {
801 .dbg_name = "ce1_p_clk",
802 .ops = &clk_ops_branch,
803 CLK_INIT(ce1_p_clk.c),
804 },
805};
806
807static struct branch_clk dma_bam_p_clk = {
808 .b = {
809 .ctl_reg = DMA_BAM_HCLK_CTL,
810 .en_mask = BIT(4),
811 .halt_reg = CLK_HALT_DFAB_STATE_REG,
812 .halt_bit = 12,
813 },
814 .c = {
815 .dbg_name = "dma_bam_p_clk",
816 .ops = &clk_ops_branch,
817 CLK_INIT(dma_bam_p_clk.c),
818 },
819};
820
821static struct branch_clk gsbi1_p_clk = {
822 .b = {
823 .ctl_reg = GSBIn_HCLK_CTL_REG(1),
824 .en_mask = BIT(4),
825 .halt_reg = CLK_HALT_CFPB_STATEA_REG,
826 .halt_bit = 11,
827 },
828 .c = {
829 .dbg_name = "gsbi1_p_clk",
830 .ops = &clk_ops_branch,
831 CLK_INIT(gsbi1_p_clk.c),
832 },
833};
834
835static struct branch_clk gsbi2_p_clk = {
836 .b = {
837 .ctl_reg = GSBIn_HCLK_CTL_REG(2),
838 .en_mask = BIT(4),
839 .halt_reg = CLK_HALT_CFPB_STATEA_REG,
840 .halt_bit = 7,
841 },
842 .c = {
843 .dbg_name = "gsbi2_p_clk",
844 .ops = &clk_ops_branch,
845 CLK_INIT(gsbi2_p_clk.c),
846 },
847};
848
849static struct branch_clk gsbi3_p_clk = {
850 .b = {
851 .ctl_reg = GSBIn_HCLK_CTL_REG(3),
852 .en_mask = BIT(4),
853 .halt_reg = CLK_HALT_CFPB_STATEA_REG,
854 .halt_bit = 3,
855 },
856 .c = {
857 .dbg_name = "gsbi3_p_clk",
858 .ops = &clk_ops_branch,
859 CLK_INIT(gsbi3_p_clk.c),
860 },
861};
862
863static struct branch_clk gsbi4_p_clk = {
864 .b = {
865 .ctl_reg = GSBIn_HCLK_CTL_REG(4),
866 .en_mask = BIT(4),
867 .halt_reg = CLK_HALT_CFPB_STATEB_REG,
868 .halt_bit = 27,
869 },
870 .c = {
871 .dbg_name = "gsbi4_p_clk",
872 .ops = &clk_ops_branch,
873 CLK_INIT(gsbi4_p_clk.c),
874 },
875};
876
877static struct branch_clk gsbi5_p_clk = {
878 .b = {
879 .ctl_reg = GSBIn_HCLK_CTL_REG(5),
880 .en_mask = BIT(4),
881 .halt_reg = CLK_HALT_CFPB_STATEB_REG,
882 .halt_bit = 23,
883 },
884 .c = {
885 .dbg_name = "gsbi5_p_clk",
886 .ops = &clk_ops_branch,
887 CLK_INIT(gsbi5_p_clk.c),
888 },
889};
890
891static struct branch_clk usb_hs1_p_clk = {
892 .b = {
893 .ctl_reg = USB_HS1_HCLK_CTL_REG,
894 .en_mask = BIT(4),
895 .halt_reg = CLK_HALT_DFAB_STATE_REG,
896 .halt_bit = 1,
897 },
898 .c = {
899 .dbg_name = "usb_hs1_p_clk",
900 .ops = &clk_ops_branch,
901 CLK_INIT(usb_hs1_p_clk.c),
902 },
903};
904
905static struct branch_clk usb_hsic_p_clk = {
906 .b = {
907 .ctl_reg = USB_HSIC_HCLK_CTL_REG,
908 .en_mask = BIT(4),
909 .halt_reg = CLK_HALT_DFAB_STATE_REG,
910 .halt_bit = 3,
911 },
912 .c = {
913 .dbg_name = "usb_hsic_p_clk",
914 .ops = &clk_ops_branch,
915 CLK_INIT(usb_hsic_p_clk.c),
916 },
917};
918
919static struct branch_clk sdc1_p_clk = {
920 .b = {
921 .ctl_reg = SDCn_HCLK_CTL_REG(1),
922 .en_mask = BIT(4),
923 .halt_reg = CLK_HALT_DFAB_STATE_REG,
924 .halt_bit = 11,
925 },
926 .c = {
927 .dbg_name = "sdc1_p_clk",
928 .ops = &clk_ops_branch,
929 CLK_INIT(sdc1_p_clk.c),
930 },
931};
932
933static struct branch_clk sdc2_p_clk = {
934 .b = {
935 .ctl_reg = SDCn_HCLK_CTL_REG(2),
936 .en_mask = BIT(4),
937 .halt_reg = CLK_HALT_DFAB_STATE_REG,
938 .halt_bit = 10,
939 },
940 .c = {
941 .dbg_name = "sdc2_p_clk",
942 .ops = &clk_ops_branch,
943 CLK_INIT(sdc2_p_clk.c),
944 },
945};
946
947/* HW-Voteable Clocks */
948static struct branch_clk adm0_clk = {
949 .b = {
950 .ctl_reg = SC0_U_CLK_BRANCH_ENA_VOTE_REG,
951 .en_mask = BIT(2),
952 .halt_reg = CLK_HALT_MSS_KPSS_MISC_STATE_REG,
953 .halt_check = HALT_VOTED,
954 .halt_bit = 14,
955 },
956 .c = {
957 .dbg_name = "adm0_clk",
958 .ops = &clk_ops_branch,
959 CLK_INIT(adm0_clk.c),
960 },
961};
962
963static struct branch_clk adm0_p_clk = {
964 .b = {
965 .ctl_reg = SC0_U_CLK_BRANCH_ENA_VOTE_REG,
966 .en_mask = BIT(3),
967 .halt_reg = CLK_HALT_MSS_KPSS_MISC_STATE_REG,
968 .halt_check = HALT_VOTED,
969 .halt_bit = 13,
970 },
971 .c = {
972 .dbg_name = "adm0_p_clk",
973 .ops = &clk_ops_branch,
974 CLK_INIT(adm0_p_clk.c),
975 },
976};
977
978static struct branch_clk pmic_arb0_p_clk = {
979 .b = {
980 .ctl_reg = SC0_U_CLK_BRANCH_ENA_VOTE_REG,
981 .en_mask = BIT(8),
982 .halt_reg = CLK_HALT_SFPB_MISC_STATE_REG,
983 .halt_check = HALT_VOTED,
984 .halt_bit = 22,
985 },
986 .c = {
987 .dbg_name = "pmic_arb0_p_clk",
988 .ops = &clk_ops_branch,
989 CLK_INIT(pmic_arb0_p_clk.c),
990 },
991};
992
993static struct branch_clk pmic_arb1_p_clk = {
994 .b = {
995 .ctl_reg = SC0_U_CLK_BRANCH_ENA_VOTE_REG,
996 .en_mask = BIT(9),
997 .halt_reg = CLK_HALT_SFPB_MISC_STATE_REG,
998 .halt_check = HALT_VOTED,
999 .halt_bit = 21,
1000 },
1001 .c = {
1002 .dbg_name = "pmic_arb1_p_clk",
1003 .ops = &clk_ops_branch,
1004 CLK_INIT(pmic_arb1_p_clk.c),
1005 },
1006};
1007
1008static struct branch_clk pmic_ssbi2_clk = {
1009 .b = {
1010 .ctl_reg = SC0_U_CLK_BRANCH_ENA_VOTE_REG,
1011 .en_mask = BIT(7),
1012 .halt_reg = CLK_HALT_SFPB_MISC_STATE_REG,
1013 .halt_check = HALT_VOTED,
1014 .halt_bit = 23,
1015 },
1016 .c = {
1017 .dbg_name = "pmic_ssbi2_clk",
1018 .ops = &clk_ops_branch,
1019 CLK_INIT(pmic_ssbi2_clk.c),
1020 },
1021};
1022
1023static struct branch_clk rpm_msg_ram_p_clk = {
1024 .b = {
1025 .ctl_reg = SC0_U_CLK_BRANCH_ENA_VOTE_REG,
1026 .en_mask = BIT(6),
1027 .halt_reg = CLK_HALT_SFPB_MISC_STATE_REG,
1028 .halt_check = HALT_VOTED,
1029 .halt_bit = 12,
1030 },
1031 .c = {
1032 .dbg_name = "rpm_msg_ram_p_clk",
1033 .ops = &clk_ops_branch,
1034 CLK_INIT(rpm_msg_ram_p_clk.c),
1035 },
1036};
1037
1038/*
1039 * Low Power Audio Clocks
1040 */
Matt Wagantalle18bbc82011-10-06 10:07:28 -07001041#define F_AIF_OSR(f, s, d, m, n) \
Vikram Mulukutla489e39e2011-08-31 18:04:05 -07001042 { \
1043 .freq_hz = f, \
1044 .src_clk = &s##_clk.c, \
1045 .md_val = MD8(8, m, 0, n), \
1046 .ns_val = NS(31, 24, n, m, 5, 4, 3, d, 2, 0, s##_to_lpa_mux), \
1047 .mnd_en_mask = BIT(8) * !!(n), \
Vikram Mulukutla489e39e2011-08-31 18:04:05 -07001048 }
1049static struct clk_freq_tbl clk_tbl_aif_osr[] = {
Matt Wagantalle18bbc82011-10-06 10:07:28 -07001050 F_AIF_OSR( 0, gnd, 1, 0, 0),
1051 F_AIF_OSR( 512000, pll4, 4, 1, 192),
1052 F_AIF_OSR( 768000, pll4, 4, 1, 128),
1053 F_AIF_OSR( 1024000, pll4, 4, 1, 96),
1054 F_AIF_OSR( 1536000, pll4, 4, 1, 64),
1055 F_AIF_OSR( 2048000, pll4, 4, 1, 48),
1056 F_AIF_OSR( 3072000, pll4, 4, 1, 32),
1057 F_AIF_OSR( 4096000, pll4, 4, 1, 24),
1058 F_AIF_OSR( 6144000, pll4, 4, 1, 16),
1059 F_AIF_OSR( 8192000, pll4, 4, 1, 12),
1060 F_AIF_OSR(12288000, pll4, 4, 1, 8),
1061 F_AIF_OSR(24576000, pll4, 4, 1, 4),
Vikram Mulukutla489e39e2011-08-31 18:04:05 -07001062 F_END
1063};
1064
1065#define CLK_AIF_OSR(i, ns, md, h_r) \
1066 struct rcg_clk i##_clk = { \
1067 .b = { \
1068 .ctl_reg = ns, \
1069 .en_mask = BIT(17), \
1070 .reset_reg = ns, \
1071 .reset_mask = BIT(19), \
1072 .halt_reg = h_r, \
1073 .halt_check = ENABLE, \
1074 .halt_bit = 1, \
1075 }, \
1076 .ns_reg = ns, \
1077 .md_reg = md, \
1078 .root_en_mask = BIT(9), \
1079 .ns_mask = (BM(31, 24) | BM(6, 0)), \
1080 .set_rate = set_rate_mnd, \
1081 .freq_tbl = clk_tbl_aif_osr, \
1082 .current_freq = &rcg_dummy_freq, \
1083 .c = { \
1084 .dbg_name = #i "_clk", \
1085 .ops = &clk_ops_rcg_9615, \
1086 CLK_INIT(i##_clk.c), \
1087 }, \
1088 }
1089#define CLK_AIF_OSR_DIV(i, ns, md, h_r) \
1090 struct rcg_clk i##_clk = { \
1091 .b = { \
1092 .ctl_reg = ns, \
1093 .en_mask = BIT(21), \
1094 .reset_reg = ns, \
1095 .reset_mask = BIT(23), \
1096 .halt_reg = h_r, \
1097 .halt_check = ENABLE, \
1098 .halt_bit = 1, \
1099 }, \
1100 .ns_reg = ns, \
1101 .md_reg = md, \
1102 .root_en_mask = BIT(9), \
1103 .ns_mask = (BM(31, 24) | BM(6, 0)), \
1104 .set_rate = set_rate_mnd, \
1105 .freq_tbl = clk_tbl_aif_osr, \
1106 .current_freq = &rcg_dummy_freq, \
1107 .c = { \
1108 .dbg_name = #i "_clk", \
1109 .ops = &clk_ops_rcg_9615, \
1110 CLK_INIT(i##_clk.c), \
1111 }, \
1112 }
1113
1114#define F_AIF_BIT(d, s) \
1115 { \
1116 .freq_hz = d, \
1117 .ns_val = (BVAL(14, 14, s) | BVAL(13, 10, (d-1))) \
1118 }
1119static struct clk_freq_tbl clk_tbl_aif_bit[] = {
1120 F_AIF_BIT(0, 1), /* Use external clock. */
1121 F_AIF_BIT(1, 0), F_AIF_BIT(2, 0), F_AIF_BIT(3, 0), F_AIF_BIT(4, 0),
1122 F_AIF_BIT(5, 0), F_AIF_BIT(6, 0), F_AIF_BIT(7, 0), F_AIF_BIT(8, 0),
1123 F_AIF_BIT(9, 0), F_AIF_BIT(10, 0), F_AIF_BIT(11, 0), F_AIF_BIT(12, 0),
1124 F_AIF_BIT(13, 0), F_AIF_BIT(14, 0), F_AIF_BIT(15, 0), F_AIF_BIT(16, 0),
1125 F_END
1126};
1127
1128#define CLK_AIF_BIT(i, ns, h_r) \
1129 struct rcg_clk i##_clk = { \
1130 .b = { \
1131 .ctl_reg = ns, \
1132 .en_mask = BIT(15), \
1133 .halt_reg = h_r, \
1134 .halt_check = DELAY, \
1135 }, \
1136 .ns_reg = ns, \
1137 .ns_mask = BM(14, 10), \
1138 .set_rate = set_rate_nop, \
1139 .freq_tbl = clk_tbl_aif_bit, \
1140 .current_freq = &rcg_dummy_freq, \
1141 .c = { \
1142 .dbg_name = #i "_clk", \
1143 .ops = &clk_ops_rcg_9615, \
1144 CLK_INIT(i##_clk.c), \
1145 }, \
1146 }
1147
1148#define F_AIF_BIT_D(d, s) \
1149 { \
1150 .freq_hz = d, \
1151 .ns_val = (BVAL(18, 18, s) | BVAL(17, 10, (d-1))) \
1152 }
1153static struct clk_freq_tbl clk_tbl_aif_bit_div[] = {
1154 F_AIF_BIT_D(0, 1), /* Use external clock. */
1155 F_AIF_BIT_D(1, 0), F_AIF_BIT_D(2, 0), F_AIF_BIT_D(3, 0),
1156 F_AIF_BIT_D(4, 0), F_AIF_BIT_D(5, 0), F_AIF_BIT_D(6, 0),
1157 F_AIF_BIT_D(7, 0), F_AIF_BIT_D(8, 0), F_AIF_BIT_D(9, 0),
1158 F_AIF_BIT_D(10, 0), F_AIF_BIT_D(11, 0), F_AIF_BIT_D(12, 0),
1159 F_AIF_BIT_D(13, 0), F_AIF_BIT_D(14, 0), F_AIF_BIT_D(15, 0),
1160 F_AIF_BIT_D(16, 0),
1161 F_END
1162};
1163
1164#define CLK_AIF_BIT_DIV(i, ns, h_r) \
1165 struct rcg_clk i##_clk = { \
1166 .b = { \
1167 .ctl_reg = ns, \
1168 .en_mask = BIT(19), \
1169 .halt_reg = h_r, \
1170 .halt_check = ENABLE, \
1171 }, \
1172 .ns_reg = ns, \
1173 .ns_mask = BM(18, 10), \
1174 .set_rate = set_rate_nop, \
1175 .freq_tbl = clk_tbl_aif_bit_div, \
1176 .current_freq = &rcg_dummy_freq, \
1177 .c = { \
1178 .dbg_name = #i "_clk", \
1179 .ops = &clk_ops_rcg_9615, \
1180 CLK_INIT(i##_clk.c), \
1181 }, \
1182 }
1183
1184static CLK_AIF_OSR(mi2s_osr, LCC_MI2S_NS_REG, LCC_MI2S_MD_REG,
1185 LCC_MI2S_STATUS_REG);
1186static CLK_AIF_BIT(mi2s_bit, LCC_MI2S_NS_REG, LCC_MI2S_STATUS_REG);
1187
1188static CLK_AIF_OSR_DIV(codec_i2s_mic_osr, LCC_CODEC_I2S_MIC_NS_REG,
1189 LCC_CODEC_I2S_MIC_MD_REG, LCC_CODEC_I2S_MIC_STATUS_REG);
1190static CLK_AIF_BIT_DIV(codec_i2s_mic_bit, LCC_CODEC_I2S_MIC_NS_REG,
1191 LCC_CODEC_I2S_MIC_STATUS_REG);
1192
1193static CLK_AIF_OSR_DIV(spare_i2s_mic_osr, LCC_SPARE_I2S_MIC_NS_REG,
1194 LCC_SPARE_I2S_MIC_MD_REG, LCC_SPARE_I2S_MIC_STATUS_REG);
1195static CLK_AIF_BIT_DIV(spare_i2s_mic_bit, LCC_SPARE_I2S_MIC_NS_REG,
1196 LCC_SPARE_I2S_MIC_STATUS_REG);
1197
1198static CLK_AIF_OSR_DIV(codec_i2s_spkr_osr, LCC_CODEC_I2S_SPKR_NS_REG,
1199 LCC_CODEC_I2S_SPKR_MD_REG, LCC_CODEC_I2S_SPKR_STATUS_REG);
1200static CLK_AIF_BIT_DIV(codec_i2s_spkr_bit, LCC_CODEC_I2S_SPKR_NS_REG,
1201 LCC_CODEC_I2S_SPKR_STATUS_REG);
1202
1203static CLK_AIF_OSR_DIV(spare_i2s_spkr_osr, LCC_SPARE_I2S_SPKR_NS_REG,
1204 LCC_SPARE_I2S_SPKR_MD_REG, LCC_SPARE_I2S_SPKR_STATUS_REG);
1205static CLK_AIF_BIT_DIV(spare_i2s_spkr_bit, LCC_SPARE_I2S_SPKR_NS_REG,
1206 LCC_SPARE_I2S_SPKR_STATUS_REG);
1207
Matt Wagantalle18bbc82011-10-06 10:07:28 -07001208#define F_PCM(f, s, d, m, n) \
Vikram Mulukutla489e39e2011-08-31 18:04:05 -07001209 { \
1210 .freq_hz = f, \
1211 .src_clk = &s##_clk.c, \
1212 .md_val = MD16(m, n), \
1213 .ns_val = NS(31, 16, n, m, 5, 4, 3, d, 2, 0, s##_to_lpa_mux), \
1214 .mnd_en_mask = BIT(8) * !!(n), \
Vikram Mulukutla489e39e2011-08-31 18:04:05 -07001215 }
1216static struct clk_freq_tbl clk_tbl_pcm[] = {
Matt Wagantalle18bbc82011-10-06 10:07:28 -07001217 F_PCM( 0, gnd, 1, 0, 0),
1218 F_PCM( 512000, pll4, 4, 1, 192),
1219 F_PCM( 768000, pll4, 4, 1, 128),
1220 F_PCM( 1024000, pll4, 4, 1, 96),
1221 F_PCM( 1536000, pll4, 4, 1, 64),
1222 F_PCM( 2048000, pll4, 4, 1, 48),
1223 F_PCM( 3072000, pll4, 4, 1, 32),
1224 F_PCM( 4096000, pll4, 4, 1, 24),
1225 F_PCM( 6144000, pll4, 4, 1, 16),
1226 F_PCM( 8192000, pll4, 4, 1, 12),
1227 F_PCM(12288000, pll4, 4, 1, 8),
1228 F_PCM(24576000, pll4, 4, 1, 4),
Vikram Mulukutla489e39e2011-08-31 18:04:05 -07001229 F_END
1230};
1231
1232static struct rcg_clk pcm_clk = {
1233 .b = {
1234 .ctl_reg = LCC_PCM_NS_REG,
1235 .en_mask = BIT(11),
1236 .reset_reg = LCC_PCM_NS_REG,
1237 .reset_mask = BIT(13),
1238 .halt_reg = LCC_PCM_STATUS_REG,
1239 .halt_check = ENABLE,
1240 .halt_bit = 0,
1241 },
1242 .ns_reg = LCC_PCM_NS_REG,
1243 .md_reg = LCC_PCM_MD_REG,
1244 .root_en_mask = BIT(9),
1245 .ns_mask = (BM(31, 16) | BM(6, 0)),
1246 .set_rate = set_rate_mnd,
1247 .freq_tbl = clk_tbl_pcm,
1248 .current_freq = &rcg_dummy_freq,
1249 .c = {
1250 .dbg_name = "pcm_clk",
1251 .ops = &clk_ops_rcg_9615,
Matt Wagantalle18bbc82011-10-06 10:07:28 -07001252 VDD_DIG_FMAX_MAP1(LOW, 24576000),
Vikram Mulukutla489e39e2011-08-31 18:04:05 -07001253 CLK_INIT(pcm_clk.c),
1254 },
1255};
1256
1257static struct rcg_clk audio_slimbus_clk = {
1258 .b = {
1259 .ctl_reg = LCC_SLIMBUS_NS_REG,
1260 .en_mask = BIT(10),
1261 .reset_reg = LCC_AHBEX_BRANCH_CTL_REG,
1262 .reset_mask = BIT(5),
1263 .halt_reg = LCC_SLIMBUS_STATUS_REG,
1264 .halt_check = ENABLE,
1265 .halt_bit = 0,
1266 },
1267 .ns_reg = LCC_SLIMBUS_NS_REG,
1268 .md_reg = LCC_SLIMBUS_MD_REG,
1269 .root_en_mask = BIT(9),
1270 .ns_mask = (BM(31, 24) | BM(6, 0)),
1271 .set_rate = set_rate_mnd,
1272 .freq_tbl = clk_tbl_aif_osr,
1273 .current_freq = &rcg_dummy_freq,
1274 .c = {
1275 .dbg_name = "audio_slimbus_clk",
1276 .ops = &clk_ops_rcg_9615,
Matt Wagantalle18bbc82011-10-06 10:07:28 -07001277 VDD_DIG_FMAX_MAP1(LOW, 24576000),
Vikram Mulukutla489e39e2011-08-31 18:04:05 -07001278 CLK_INIT(audio_slimbus_clk.c),
1279 },
1280};
1281
1282static struct branch_clk sps_slimbus_clk = {
1283 .b = {
1284 .ctl_reg = LCC_SLIMBUS_NS_REG,
1285 .en_mask = BIT(12),
1286 .halt_reg = LCC_SLIMBUS_STATUS_REG,
1287 .halt_check = ENABLE,
1288 .halt_bit = 1,
1289 },
1290 .parent = &audio_slimbus_clk.c,
1291 .c = {
1292 .dbg_name = "sps_slimbus_clk",
1293 .ops = &clk_ops_branch,
1294 CLK_INIT(sps_slimbus_clk.c),
1295 },
1296};
1297
1298static struct branch_clk slimbus_xo_src_clk = {
1299 .b = {
1300 .ctl_reg = SLIMBUS_XO_SRC_CLK_CTL_REG,
1301 .en_mask = BIT(2),
1302 .halt_reg = CLK_HALT_DFAB_STATE_REG,
1303 .halt_bit = 28,
1304 },
1305 .parent = &sps_slimbus_clk.c,
1306 .c = {
1307 .dbg_name = "slimbus_xo_src_clk",
1308 .ops = &clk_ops_branch,
1309 CLK_INIT(slimbus_xo_src_clk.c),
1310 },
1311};
1312
Vikram Mulukutla73d42112011-09-19 16:32:54 -07001313DEFINE_CLK_RPM(cfpb_clk, cfpb_a_clk, CFPB, NULL);
1314DEFINE_CLK_RPM(dfab_clk, dfab_a_clk, DAYTONA_FABRIC, NULL);
1315DEFINE_CLK_RPM(ebi1_clk, ebi1_a_clk, EBI1, NULL);
1316DEFINE_CLK_RPM(sfab_clk, sfab_a_clk, SYSTEM_FABRIC, NULL);
1317DEFINE_CLK_RPM(sfpb_clk, sfpb_a_clk, SFPB, NULL);
1318
1319static DEFINE_CLK_VOTER(dfab_usb_hs_clk, &dfab_clk.c);
1320static DEFINE_CLK_VOTER(dfab_sdc1_clk, &dfab_clk.c);
1321static DEFINE_CLK_VOTER(dfab_sdc2_clk, &dfab_clk.c);
1322static DEFINE_CLK_VOTER(dfab_sps_clk, &dfab_clk.c);
Vikram Mulukutlacfd73ad2011-11-09 11:39:34 -08001323static DEFINE_CLK_VOTER(dfab_bam_dmux_clk, &dfab_clk.c);
Vikram Mulukutla73d42112011-09-19 16:32:54 -07001324static DEFINE_CLK_VOTER(ebi1_msmbus_clk, &ebi1_clk.c);
Vikram Mulukutla489e39e2011-08-31 18:04:05 -07001325
1326/*
1327 * TODO: replace dummy_clk below with ebi1_clk.c once the
1328 * bus driver starts voting on ebi1 rates.
1329 */
1330static DEFINE_CLK_VOTER(ebi1_adm_clk, &dummy_clk);
1331
1332#ifdef CONFIG_DEBUG_FS
1333struct measure_sel {
1334 u32 test_vector;
1335 struct clk *clk;
1336};
1337
1338static struct measure_sel measure_mux[] = {
1339 { TEST_PER_LS(0x08), &slimbus_xo_src_clk.c },
1340 { TEST_PER_LS(0x12), &sdc1_p_clk.c },
1341 { TEST_PER_LS(0x13), &sdc1_clk.c },
1342 { TEST_PER_LS(0x14), &sdc2_p_clk.c },
1343 { TEST_PER_LS(0x15), &sdc2_clk.c },
Matt Wagantall7625a4c2011-11-01 16:17:53 -07001344 { TEST_PER_LS(0x1F), &gp0_clk.c },
1345 { TEST_PER_LS(0x20), &gp1_clk.c },
1346 { TEST_PER_LS(0x21), &gp2_clk.c },
Vikram Mulukutla489e39e2011-08-31 18:04:05 -07001347 { TEST_PER_LS(0x26), &pmem_clk.c },
Vikram Mulukutla73d42112011-09-19 16:32:54 -07001348 { TEST_PER_LS(0x25), &dfab_clk.c },
1349 { TEST_PER_LS(0x25), &dfab_a_clk.c },
Vikram Mulukutla489e39e2011-08-31 18:04:05 -07001350 { TEST_PER_LS(0x32), &dma_bam_p_clk.c },
Vikram Mulukutla73d42112011-09-19 16:32:54 -07001351 { TEST_PER_LS(0x33), &cfpb_clk.c },
1352 { TEST_PER_LS(0x33), &cfpb_a_clk.c },
Vikram Mulukutla489e39e2011-08-31 18:04:05 -07001353 { TEST_PER_LS(0x3E), &gsbi1_uart_clk.c },
1354 { TEST_PER_LS(0x3F), &gsbi1_qup_clk.c },
1355 { TEST_PER_LS(0x41), &gsbi2_p_clk.c },
1356 { TEST_PER_LS(0x42), &gsbi2_uart_clk.c },
1357 { TEST_PER_LS(0x44), &gsbi2_qup_clk.c },
1358 { TEST_PER_LS(0x45), &gsbi3_p_clk.c },
1359 { TEST_PER_LS(0x46), &gsbi3_uart_clk.c },
1360 { TEST_PER_LS(0x48), &gsbi3_qup_clk.c },
1361 { TEST_PER_LS(0x49), &gsbi4_p_clk.c },
1362 { TEST_PER_LS(0x4A), &gsbi4_uart_clk.c },
1363 { TEST_PER_LS(0x4C), &gsbi4_qup_clk.c },
1364 { TEST_PER_LS(0x4D), &gsbi5_p_clk.c },
1365 { TEST_PER_LS(0x4E), &gsbi5_uart_clk.c },
1366 { TEST_PER_LS(0x50), &gsbi5_qup_clk.c },
Vikram Mulukutla73d42112011-09-19 16:32:54 -07001367 { TEST_PER_LS(0x78), &sfpb_clk.c },
1368 { TEST_PER_LS(0x78), &sfpb_a_clk.c },
Vikram Mulukutla489e39e2011-08-31 18:04:05 -07001369 { TEST_PER_LS(0x7A), &pmic_ssbi2_clk.c },
1370 { TEST_PER_LS(0x7B), &pmic_arb0_p_clk.c },
1371 { TEST_PER_LS(0x7C), &pmic_arb1_p_clk.c },
1372 { TEST_PER_LS(0x7D), &prng_clk.c },
1373 { TEST_PER_LS(0x7F), &rpm_msg_ram_p_clk.c },
1374 { TEST_PER_LS(0x80), &adm0_p_clk.c },
1375 { TEST_PER_LS(0x84), &usb_hs1_p_clk.c },
1376 { TEST_PER_LS(0x85), &usb_hs1_xcvr_clk.c },
1377 { TEST_PER_LS(0x86), &usb_hsic_sys_clk.c },
1378 { TEST_PER_LS(0x87), &usb_hsic_p_clk.c },
1379 { TEST_PER_LS(0x88), &usb_hsic_xcvr_clk.c },
1380 { TEST_PER_LS(0x8B), &usb_hsic_hsio_cal_clk.c },
1381 { TEST_PER_LS(0x8D), &usb_hs1_sys_clk.c },
1382 { TEST_PER_LS(0x92), &ce1_p_clk.c },
Vikram Mulukutla73d42112011-09-19 16:32:54 -07001383 { TEST_PER_HS(0x18), &sfab_clk.c },
1384 { TEST_PER_HS(0x18), &sfab_a_clk.c },
Vikram Mulukutla489e39e2011-08-31 18:04:05 -07001385 { TEST_PER_LS(0xA4), &ce1_core_clk.c },
1386 { TEST_PER_HS(0x2A), &adm0_clk.c },
Vikram Mulukutla73d42112011-09-19 16:32:54 -07001387 { TEST_PER_HS(0x34), &ebi1_clk.c },
1388 { TEST_PER_HS(0x34), &ebi1_a_clk.c },
Vikram Mulukutla489e39e2011-08-31 18:04:05 -07001389 { TEST_LPA(0x0F), &mi2s_bit_clk.c },
1390 { TEST_LPA(0x10), &codec_i2s_mic_bit_clk.c },
1391 { TEST_LPA(0x11), &codec_i2s_spkr_bit_clk.c },
1392 { TEST_LPA(0x12), &spare_i2s_mic_bit_clk.c },
1393 { TEST_LPA(0x13), &spare_i2s_spkr_bit_clk.c },
1394 { TEST_LPA(0x14), &pcm_clk.c },
1395 { TEST_LPA(0x1D), &audio_slimbus_clk.c },
1396};
1397
1398static struct measure_sel *find_measure_sel(struct clk *clk)
1399{
1400 int i;
1401
1402 for (i = 0; i < ARRAY_SIZE(measure_mux); i++)
1403 if (measure_mux[i].clk == clk)
1404 return &measure_mux[i];
1405 return NULL;
1406}
1407
1408static int measure_clk_set_parent(struct clk *c, struct clk *parent)
1409{
1410 int ret = 0;
1411 u32 clk_sel;
1412 struct measure_sel *p;
1413 struct measure_clk *clk = to_measure_clk(c);
1414 unsigned long flags;
1415
1416 if (!parent)
1417 return -EINVAL;
1418
1419 p = find_measure_sel(parent);
1420 if (!p)
1421 return -EINVAL;
1422
1423 spin_lock_irqsave(&local_clock_reg_lock, flags);
1424
1425 /*
1426 * Program the test vector, measurement period (sample_ticks)
1427 * and scaling multiplier.
1428 */
1429 clk->sample_ticks = 0x10000;
1430 clk_sel = p->test_vector & TEST_CLK_SEL_MASK;
1431 clk->multiplier = 1;
1432 switch (p->test_vector >> TEST_TYPE_SHIFT) {
1433 case TEST_TYPE_PER_LS:
1434 writel_relaxed(0x4030D00|BVAL(7, 0, clk_sel), CLK_TEST_REG);
1435 break;
1436 case TEST_TYPE_PER_HS:
1437 writel_relaxed(0x4020000|BVAL(16, 10, clk_sel), CLK_TEST_REG);
1438 break;
1439 case TEST_TYPE_LPA:
1440 writel_relaxed(0x4030D98, CLK_TEST_REG);
1441 writel_relaxed(BVAL(6, 1, clk_sel)|BIT(0),
1442 LCC_CLK_LS_DEBUG_CFG_REG);
1443 break;
1444 default:
1445 ret = -EPERM;
1446 }
1447 /* Make sure test vector is set before starting measurements. */
1448 mb();
1449
1450 spin_unlock_irqrestore(&local_clock_reg_lock, flags);
1451
1452 return ret;
1453}
1454
1455/* Sample clock for 'ticks' reference clock ticks. */
Matt Wagantall9de3bfb2011-11-03 20:13:12 -07001456static unsigned long run_measurement(unsigned ticks)
Vikram Mulukutla489e39e2011-08-31 18:04:05 -07001457{
1458 /* Stop counters and set the XO4 counter start value. */
Vikram Mulukutla489e39e2011-08-31 18:04:05 -07001459 writel_relaxed(ticks, RINGOSC_TCXO_CTL_REG);
1460
1461 /* Wait for timer to become ready. */
1462 while ((readl_relaxed(RINGOSC_STATUS_REG) & BIT(25)) != 0)
1463 cpu_relax();
1464
1465 /* Run measurement and wait for completion. */
1466 writel_relaxed(BIT(28)|ticks, RINGOSC_TCXO_CTL_REG);
1467 while ((readl_relaxed(RINGOSC_STATUS_REG) & BIT(25)) == 0)
1468 cpu_relax();
1469
1470 /* Stop counters. */
1471 writel_relaxed(0x0, RINGOSC_TCXO_CTL_REG);
1472
1473 /* Return measured ticks. */
1474 return readl_relaxed(RINGOSC_STATUS_REG) & BM(24, 0);
1475}
1476
1477
1478/* Perform a hardware rate measurement for a given clock.
1479 FOR DEBUG USE ONLY: Measurements take ~15 ms! */
Matt Wagantall9de3bfb2011-11-03 20:13:12 -07001480static unsigned long measure_clk_get_rate(struct clk *c)
Vikram Mulukutla489e39e2011-08-31 18:04:05 -07001481{
1482 unsigned long flags;
1483 u32 pdm_reg_backup, ringosc_reg_backup;
1484 u64 raw_count_short, raw_count_full;
1485 struct measure_clk *clk = to_measure_clk(c);
1486 unsigned ret;
1487
1488 spin_lock_irqsave(&local_clock_reg_lock, flags);
1489
1490 /* Enable CXO/4 and RINGOSC branch and root. */
1491 pdm_reg_backup = readl_relaxed(PDM_CLK_NS_REG);
1492 ringosc_reg_backup = readl_relaxed(RINGOSC_NS_REG);
1493 writel_relaxed(0x2898, PDM_CLK_NS_REG);
1494 writel_relaxed(0xA00, RINGOSC_NS_REG);
1495
1496 /*
1497 * The ring oscillator counter will not reset if the measured clock
1498 * is not running. To detect this, run a short measurement before
1499 * the full measurement. If the raw results of the two are the same
1500 * then the clock must be off.
1501 */
1502
1503 /* Run a short measurement. (~1 ms) */
1504 raw_count_short = run_measurement(0x1000);
1505 /* Run a full measurement. (~14 ms) */
1506 raw_count_full = run_measurement(clk->sample_ticks);
1507
1508 writel_relaxed(ringosc_reg_backup, RINGOSC_NS_REG);
1509 writel_relaxed(pdm_reg_backup, PDM_CLK_NS_REG);
1510
1511 /* Return 0 if the clock is off. */
1512 if (raw_count_full == raw_count_short)
1513 ret = 0;
1514 else {
1515 /* Compute rate in Hz. */
1516 raw_count_full = ((raw_count_full * 10) + 15) * 4800000;
1517 do_div(raw_count_full, ((clk->sample_ticks * 10) + 35));
1518 ret = (raw_count_full * clk->multiplier);
1519 }
1520
1521 /* Route dbg_hs_clk to PLLTEST. 300mV single-ended amplitude. */
1522 writel_relaxed(0x38F8, PLLTEST_PAD_CFG_REG);
1523 spin_unlock_irqrestore(&local_clock_reg_lock, flags);
1524
1525 return ret;
1526}
1527#else /* !CONFIG_DEBUG_FS */
1528static int measure_clk_set_parent(struct clk *clk, struct clk *parent)
1529{
1530 return -EINVAL;
1531}
1532
Matt Wagantall9de3bfb2011-11-03 20:13:12 -07001533static unsigned long measure_clk_get_rate(struct clk *clk)
Vikram Mulukutla489e39e2011-08-31 18:04:05 -07001534{
1535 return 0;
1536}
1537#endif /* CONFIG_DEBUG_FS */
1538
1539static struct clk_ops measure_clk_ops = {
1540 .set_parent = measure_clk_set_parent,
1541 .get_rate = measure_clk_get_rate,
1542 .is_local = local_clk_is_local,
1543};
1544
1545static struct measure_clk measure_clk = {
1546 .c = {
1547 .dbg_name = "measure_clk",
1548 .ops = &measure_clk_ops,
1549 CLK_INIT(measure_clk.c),
1550 },
1551 .multiplier = 1,
1552};
1553
1554static struct clk_lookup msm_clocks_9615[] = {
1555 CLK_LOOKUP("cxo", cxo_clk.c, NULL),
1556 CLK_LOOKUP("pll0", pll0_clk.c, NULL),
1557 CLK_LOOKUP("pll8", pll8_clk.c, NULL),
1558 CLK_LOOKUP("pll9", pll9_clk.c, NULL),
1559 CLK_LOOKUP("pll14", pll14_clk.c, NULL),
1560 CLK_LOOKUP("measure", measure_clk.c, "debug"),
1561
Vikram Mulukutla73d42112011-09-19 16:32:54 -07001562 CLK_LOOKUP("cfpb_clk", cfpb_clk.c, NULL),
1563 CLK_LOOKUP("cfpb_a_clk", cfpb_a_clk.c, NULL),
1564 CLK_LOOKUP("dfab_clk", dfab_clk.c, NULL),
1565 CLK_LOOKUP("dfab_a_clk", dfab_a_clk.c, NULL),
1566 CLK_LOOKUP("ebi1_clk", ebi1_clk.c, NULL),
1567 CLK_LOOKUP("ebi1_a_clk", ebi1_a_clk.c, NULL),
1568 CLK_LOOKUP("sfab_clk", sfab_clk.c, NULL),
1569 CLK_LOOKUP("sfab_a_clk", sfab_a_clk.c, NULL),
1570 CLK_LOOKUP("sfpb_clk", sfpb_clk.c, NULL),
1571 CLK_LOOKUP("sfpb_a_clk", sfpb_a_clk.c, NULL),
Vikram Mulukutla489e39e2011-08-31 18:04:05 -07001572
Matt Wagantall7625a4c2011-11-01 16:17:53 -07001573 CLK_LOOKUP("core_clk", gp0_clk.c, NULL),
1574 CLK_LOOKUP("core_clk", gp1_clk.c, NULL),
1575 CLK_LOOKUP("core_clk", gp2_clk.c, NULL),
1576
Vikram Mulukutla489e39e2011-08-31 18:04:05 -07001577 CLK_LOOKUP("core_clk", gsbi1_uart_clk.c, NULL),
1578 CLK_LOOKUP("core_clk", gsbi2_uart_clk.c, NULL),
1579 CLK_LOOKUP("core_clk", gsbi3_uart_clk.c, NULL),
1580 CLK_LOOKUP("core_clk", gsbi4_uart_clk.c, "msm_serial_hsl.0"),
1581 CLK_LOOKUP("core_clk", gsbi5_uart_clk.c, NULL),
1582
1583 CLK_LOOKUP("core_clk", gsbi1_qup_clk.c, NULL),
1584 CLK_LOOKUP("core_clk", gsbi2_qup_clk.c, NULL),
Harini Jayaraman738c9312011-09-08 15:22:38 -06001585 CLK_LOOKUP("core_clk", gsbi3_qup_clk.c, "spi_qsd.0"),
Vikram Mulukutla489e39e2011-08-31 18:04:05 -07001586 CLK_LOOKUP("core_clk", gsbi4_qup_clk.c, NULL),
Harini Jayaramaneba52672011-09-08 15:13:00 -06001587 CLK_LOOKUP("core_clk", gsbi5_qup_clk.c, "qup_i2c.0"),
Vikram Mulukutla489e39e2011-08-31 18:04:05 -07001588
Matt Wagantallb86ad262011-10-24 19:50:29 -07001589 CLK_LOOKUP("core_clk", pdm_clk.c, NULL),
Vikram Mulukutladd0a2372011-09-19 15:58:21 -07001590 CLK_LOOKUP("mem_clk", pmem_clk.c, "msm_sps"),
Ramesh Masavarapu5ad37392011-10-10 10:44:10 -07001591 CLK_LOOKUP("core_clk", prng_clk.c, "msm_rng.0"),
Vikram Mulukutla489e39e2011-08-31 18:04:05 -07001592 CLK_LOOKUP("core_clk", sdc1_clk.c, "msm_sdcc.1"),
1593 CLK_LOOKUP("core_clk", sdc2_clk.c, "msm_sdcc.2"),
Matt Wagantallb86ad262011-10-24 19:50:29 -07001594 CLK_LOOKUP("iface_clk", ce1_p_clk.c, NULL),
1595 CLK_LOOKUP("core_clk", ce1_core_clk.c, NULL),
Vikram Mulukutla489e39e2011-08-31 18:04:05 -07001596 CLK_LOOKUP("dma_bam_pclk", dma_bam_p_clk.c, NULL),
1597
1598 CLK_LOOKUP("iface_clk", gsbi1_p_clk.c, NULL),
1599 CLK_LOOKUP("iface_clk", gsbi2_p_clk.c, NULL),
Harini Jayaraman738c9312011-09-08 15:22:38 -06001600 CLK_LOOKUP("iface_clk", gsbi3_p_clk.c, "spi_qsd.0"),
Vikram Mulukutla489e39e2011-08-31 18:04:05 -07001601 CLK_LOOKUP("iface_clk", gsbi4_p_clk.c, "msm_serial_hsl.0"),
Harini Jayaramaneba52672011-09-08 15:13:00 -06001602 CLK_LOOKUP("iface_clk", gsbi5_p_clk.c, "qup_i2c.0"),
Vikram Mulukutla489e39e2011-08-31 18:04:05 -07001603
1604 CLK_LOOKUP("usb_hs_pclk", usb_hs1_p_clk.c, NULL),
1605 CLK_LOOKUP("usb_hs_system_clk", usb_hs1_sys_clk.c, NULL),
1606 CLK_LOOKUP("usb_hs_clk", usb_hs1_xcvr_clk.c, NULL),
1607 CLK_LOOKUP("usb_hsic_xcvr_clk", usb_hsic_xcvr_clk.c, NULL),
1608 CLK_LOOKUP("usb_hsic_hsio_cal_clk", usb_hsic_hsio_cal_clk.c, NULL),
1609 CLK_LOOKUP("usb_hsic_sys_clk", usb_hsic_sys_clk.c, NULL),
1610 CLK_LOOKUP("usb_hsic_p_clk", usb_hsic_p_clk.c, NULL),
1611
1612 CLK_LOOKUP("iface_clk", sdc1_p_clk.c, "msm_sdcc.1"),
1613 CLK_LOOKUP("iface_clk", sdc2_p_clk.c, "msm_sdcc.2"),
1614 CLK_LOOKUP("core_clk", adm0_clk.c, "msm_dmov"),
1615 CLK_LOOKUP("iface_clk", adm0_p_clk.c, "msm_dmov"),
Matt Wagantallb86ad262011-10-24 19:50:29 -07001616 CLK_LOOKUP("iface_clk", pmic_arb0_p_clk.c, NULL),
1617 CLK_LOOKUP("iface_clk", pmic_arb1_p_clk.c, NULL),
1618 CLK_LOOKUP("core_clk", pmic_ssbi2_clk.c, NULL),
1619 CLK_LOOKUP("mem_clk", rpm_msg_ram_p_clk.c, NULL),
Vikram Mulukutla489e39e2011-08-31 18:04:05 -07001620 CLK_LOOKUP("mi2s_bit_clk", mi2s_bit_clk.c, NULL),
1621 CLK_LOOKUP("mi2s_osr_clk", mi2s_osr_clk.c, NULL),
1622
1623 CLK_LOOKUP("i2s_mic_bit_clk", codec_i2s_mic_bit_clk.c, NULL),
1624 CLK_LOOKUP("i2s_mic_osr_clk", codec_i2s_mic_osr_clk.c, NULL),
1625 CLK_LOOKUP("i2s_mic_bit_clk", spare_i2s_mic_bit_clk.c, NULL),
1626 CLK_LOOKUP("i2s_mic_osr_clk", spare_i2s_mic_osr_clk.c, NULL),
1627 CLK_LOOKUP("i2s_spkr_bit_clk", codec_i2s_spkr_bit_clk.c, NULL),
1628 CLK_LOOKUP("i2s_spkr_osr_clk", codec_i2s_spkr_osr_clk.c, NULL),
1629 CLK_LOOKUP("i2s_spkr_bit_clk", spare_i2s_spkr_bit_clk.c, NULL),
1630 CLK_LOOKUP("i2s_spkr_osr_clk", spare_i2s_spkr_osr_clk.c, NULL),
1631 CLK_LOOKUP("pcm_clk", pcm_clk.c, NULL),
1632
1633 CLK_LOOKUP("sps_slimbus_clk", sps_slimbus_clk.c, NULL),
1634 CLK_LOOKUP("audio_slimbus_clk", audio_slimbus_clk.c, NULL),
1635 CLK_LOOKUP("dfab_usb_hs_clk", dfab_usb_hs_clk.c, NULL),
1636 CLK_LOOKUP("bus_clk", dfab_sdc1_clk.c, "msm_sdcc.1"),
1637 CLK_LOOKUP("bus_clk", dfab_sdc2_clk.c, "msm_sdcc.2"),
1638 CLK_LOOKUP("dfab_clk", dfab_sps_clk.c, "msm_sps"),
Vikram Mulukutlacfd73ad2011-11-09 11:39:34 -08001639 CLK_LOOKUP("bus_clk", dfab_bam_dmux_clk.c, "BAM_RMNT"),
Vikram Mulukutla73d42112011-09-19 16:32:54 -07001640 CLK_LOOKUP("ebi1_msmbus_clk", ebi1_msmbus_clk.c, NULL),
1641 CLK_LOOKUP("mem_clk", ebi1_adm_clk.c, "msm_dmov"),
Vikram Mulukutla489e39e2011-08-31 18:04:05 -07001642
Ramesh Masavarapufa679d92011-10-13 23:42:59 -07001643 CLK_LOOKUP("iface_clk", ce1_p_clk.c, "qce.0"),
1644 CLK_LOOKUP("iface_clk", ce1_p_clk.c, "qcrypto.0"),
1645 CLK_LOOKUP("core_clk", ce1_core_clk.c, "qce.0"),
1646 CLK_LOOKUP("core_clk", ce1_core_clk.c, "qcrypto.0"),
1647
1648 /* TODO: Make this real when RPM's ready. */
1649 CLK_DUMMY("ebi1_msmbus_clk", ebi1_msmbus_clk.c, NULL, OFF),
1650 CLK_DUMMY("mem_clk", ebi1_adm_clk.c, "msm_dmov", OFF),
1651
Vikram Mulukutla489e39e2011-08-31 18:04:05 -07001652};
1653
1654static void set_fsm_mode(void __iomem *mode_reg)
1655{
1656 u32 regval = readl_relaxed(mode_reg);
1657
1658 /* De-assert reset to FSM */
1659 regval &= ~BIT(21);
1660 writel_relaxed(regval, mode_reg);
1661
1662 /* Program bias count */
1663 regval &= ~BM(19, 14);
1664 regval |= BVAL(19, 14, 0x4);
1665 writel_relaxed(regval, mode_reg);
1666
1667 /* Program lock count */
1668 regval &= ~BM(13, 8);
1669 regval |= BVAL(13, 8, 0x8);
1670 writel_relaxed(regval, mode_reg);
1671
1672 /* Enable PLL FSM voting */
1673 regval |= BIT(20);
1674 writel_relaxed(regval, mode_reg);
1675}
1676
1677/*
1678 * Miscellaneous clock register initializations
1679 */
1680static void __init reg_init(void)
1681{
1682 u32 regval, is_pll_enabled;
1683
1684 /* Enable PDM CXO source. */
1685 regval = readl_relaxed(PDM_CLK_NS_REG);
1686 writel_relaxed(BIT(13) | regval, PDM_CLK_NS_REG);
1687
1688 /* Check if PLL0 is active */
1689 is_pll_enabled = readl_relaxed(BB_PLL0_STATUS_REG) & BIT(16);
1690
1691 if (!is_pll_enabled) {
1692 writel_relaxed(0xE, BB_PLL0_L_VAL_REG);
1693 writel_relaxed(0x3, BB_PLL0_M_VAL_REG);
1694 writel_relaxed(0x8, BB_PLL0_N_VAL_REG);
1695
1696 regval = readl_relaxed(BB_PLL0_CONFIG_REG);
1697
1698 /* Enable the main output and the MN accumulator */
1699 regval |= BIT(23) | BIT(22);
1700
1701 /* Set pre-divider and post-divider values to 1 and 1 */
1702 regval &= ~BIT(19);
1703 regval &= ~BM(21, 20);
1704
1705 /* Set VCO frequency */
1706 regval &= ~BM(17, 16);
1707
1708 writel_relaxed(regval, BB_PLL0_CONFIG_REG);
1709
1710 /* Enable AUX output */
1711 regval = readl_relaxed(BB_PLL0_TEST_CTL_REG);
1712 regval |= BIT(12);
1713 writel_relaxed(regval, BB_PLL0_TEST_CTL_REG);
1714
1715 set_fsm_mode(BB_PLL0_MODE_REG);
1716 }
1717
1718 /* Check if PLL9 (SC_PLL0) is enabled in FSM mode */
1719 is_pll_enabled = readl_relaxed(SC_PLL0_STATUS_REG) & BIT(16);
1720
1721 if (!is_pll_enabled) {
1722 writel_relaxed(0x16, SC_PLL0_L_VAL_REG);
1723 writel_relaxed(0xB, SC_PLL0_M_VAL_REG);
1724 writel_relaxed(0xC, SC_PLL0_N_VAL_REG);
1725
1726 regval = readl_relaxed(SC_PLL0_CONFIG_REG);
1727
1728 /* Enable main output and the MN accumulator */
1729 regval |= BIT(23) | BIT(22);
1730
1731 /* Set pre-divider and post-divider values to 1 and 1 */
1732 regval &= ~BIT(19);
1733 regval &= ~BM(21, 20);
1734
1735 /* Set VCO frequency */
1736 regval &= ~BM(17, 16);
1737
1738 writel_relaxed(regval, SC_PLL0_CONFIG_REG);
1739
1740 set_fsm_mode(SC_PLL0_MODE_REG);
1741
Vikram Mulukutla3349d932011-10-12 20:00:34 -07001742 } else if (!(readl_relaxed(SC_PLL0_MODE_REG) & BIT(20)))
Vikram Mulukutla489e39e2011-08-31 18:04:05 -07001743 WARN(1, "PLL9 enabled in non-FSM mode!\n");
1744
Vikram Mulukutla3349d932011-10-12 20:00:34 -07001745 /* Check if PLL14 is enabled in FSM mode */
1746 is_pll_enabled = readl_relaxed(BB_PLL14_STATUS_REG) & BIT(16);
1747
1748 if (!is_pll_enabled) {
1749 writel_relaxed(0x19, BB_PLL14_L_VAL_REG);
1750 writel_relaxed(0x0, BB_PLL14_M_VAL_REG);
1751 writel_relaxed(0x1, BB_PLL14_N_VAL_REG);
1752
1753 regval = readl_relaxed(BB_PLL14_CONFIG_REG);
1754
1755 /* Enable main output and the MN accumulator */
1756 regval |= BIT(23) | BIT(22);
1757
1758 /* Set pre-divider and post-divider values to 1 and 1 */
1759 regval &= ~BIT(19);
1760 regval &= ~BM(21, 20);
1761
1762 /* Set VCO frequency */
1763 regval &= ~BM(17, 16);
1764
1765 writel_relaxed(regval, BB_PLL14_CONFIG_REG);
1766
1767 set_fsm_mode(BB_PLL14_MODE_REG);
1768
1769 } else if (!(readl_relaxed(BB_PLL14_MODE_REG) & BIT(20)))
1770 WARN(1, "PLL14 enabled in non-FSM mode!\n");
1771
Vikram Mulukutla489e39e2011-08-31 18:04:05 -07001772 /* Enable PLL4 source on the LPASS Primary PLL Mux */
1773 regval = readl_relaxed(LCC_PRI_PLL_CLK_CTL_REG);
1774 writel_relaxed(regval | BIT(0), LCC_PRI_PLL_CLK_CTL_REG);
1775}
1776
1777/* Local clock driver initialization. */
1778static void __init msm9615_clock_init(void)
1779{
1780 xo_cxo = msm_xo_get(MSM_XO_TCXO_D0, "clock-9615");
1781 if (IS_ERR(xo_cxo)) {
1782 pr_err("%s: msm_xo_get(CXO) failed.\n", __func__);
1783 BUG();
1784 }
1785
Matt Wagantalle18bbc82011-10-06 10:07:28 -07001786 vote_vdd_level(&vdd_dig, VDD_DIG_HIGH);
Vikram Mulukutla489e39e2011-08-31 18:04:05 -07001787
1788 clk_ops_pll.enable = sr_pll_clk_enable;
1789
1790 /* Initialize clock registers. */
1791 reg_init();
1792
1793 /* Initialize rates for clocks that only support one. */
1794 clk_set_rate(&pdm_clk.c, 19200000);
1795 clk_set_rate(&prng_clk.c, 32000000);
1796 clk_set_rate(&usb_hs1_xcvr_clk.c, 60000000);
1797 clk_set_rate(&usb_hs1_sys_clk.c, 60000000);
1798 clk_set_rate(&usb_hsic_xcvr_clk.c, 60000000);
1799 clk_set_rate(&usb_hsic_sys_clk.c, 60000000);
1800 clk_set_rate(&usb_hsic_clk.c, 48000000);
1801
1802 /*
1803 * The halt status bits for PDM may be incorrect at boot.
1804 * Toggle these clocks on and off to refresh them.
1805 */
1806 rcg_clk_enable(&pdm_clk.c);
1807 rcg_clk_disable(&pdm_clk.c);
1808}
1809
1810static int __init msm9615_clock_late_init(void)
1811{
Matt Wagantalle18bbc82011-10-06 10:07:28 -07001812 return unvote_vdd_level(&vdd_dig, VDD_DIG_HIGH);
Vikram Mulukutla489e39e2011-08-31 18:04:05 -07001813}
1814
1815struct clock_init_data msm9615_clock_init_data __initdata = {
1816 .table = msm_clocks_9615,
1817 .size = ARRAY_SIZE(msm_clocks_9615),
1818 .init = msm9615_clock_init,
1819 .late_init = msm9615_clock_late_init,
1820};