blob: a8ecd90231da521b015285b7923f2a4925f8c078 [file] [log] [blame]
Manu Gautam5143b252012-01-05 19:25:23 -08001/* Copyright (c) 2009-2012, Code Aurora Forum. All rights reserved.
Vikram Mulukutla489e39e2011-08-31 18:04:05 -07002 *
3 * This program is free software; you can redistribute it and/or modify
4 * it under the terms of the GNU General Public License version 2 and
5 * only version 2 as published by the Free Software Foundation.
6 *
7 * This program is distributed in the hope that it will be useful,
8 * but WITHOUT ANY WARRANTY; without even the implied warranty of
9 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
10 * GNU General Public License for more details.
11 */
12
13#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. */
Vikram Mulukutlaefd64f52012-01-09 17:41:09 -0800124#define LCC_CLK_HS_DEBUG_CFG_REG REG_LPA(0x00A4)
Vikram Mulukutla489e39e2011-08-31 18:04:05 -0700125#define LCC_CLK_LS_DEBUG_CFG_REG REG_LPA(0x00A8)
126#define LCC_CODEC_I2S_MIC_MD_REG REG_LPA(0x0064)
127#define LCC_CODEC_I2S_MIC_NS_REG REG_LPA(0x0060)
128#define LCC_CODEC_I2S_MIC_STATUS_REG REG_LPA(0x0068)
129#define LCC_CODEC_I2S_SPKR_MD_REG REG_LPA(0x0070)
130#define LCC_CODEC_I2S_SPKR_NS_REG REG_LPA(0x006C)
131#define LCC_CODEC_I2S_SPKR_STATUS_REG REG_LPA(0x0074)
132#define LCC_MI2S_MD_REG REG_LPA(0x004C)
133#define LCC_MI2S_NS_REG REG_LPA(0x0048)
134#define LCC_MI2S_STATUS_REG REG_LPA(0x0050)
135#define LCC_PCM_MD_REG REG_LPA(0x0058)
136#define LCC_PCM_NS_REG REG_LPA(0x0054)
137#define LCC_PCM_STATUS_REG REG_LPA(0x005C)
138#define LCC_PLL0_STATUS_REG REG_LPA(0x0018)
139#define LCC_SPARE_I2S_MIC_MD_REG REG_LPA(0x007C)
140#define LCC_SPARE_I2S_MIC_NS_REG REG_LPA(0x0078)
141#define LCC_SPARE_I2S_MIC_STATUS_REG REG_LPA(0x0080)
142#define LCC_SPARE_I2S_SPKR_MD_REG REG_LPA(0x0088)
143#define LCC_SPARE_I2S_SPKR_NS_REG REG_LPA(0x0084)
144#define LCC_SPARE_I2S_SPKR_STATUS_REG REG_LPA(0x008C)
145#define LCC_SLIMBUS_NS_REG REG_LPA(0x00CC)
146#define LCC_SLIMBUS_MD_REG REG_LPA(0x00D0)
147#define LCC_SLIMBUS_STATUS_REG REG_LPA(0x00D4)
148#define LCC_AHBEX_BRANCH_CTL_REG REG_LPA(0x00E4)
149#define LCC_PRI_PLL_CLK_CTL_REG REG_LPA(0x00C4)
150
151#define GCC_APCS_CLK_DIAG REG_GCC(0x001C)
152
153/* MUX source input identifiers. */
154#define cxo_to_bb_mux 0
155#define pll8_to_bb_mux 3
156#define pll14_to_bb_mux 4
157#define gnd_to_bb_mux 6
158#define cxo_to_xo_mux 0
159#define gnd_to_xo_mux 3
160#define cxo_to_lpa_mux 1
161#define pll4_to_lpa_mux 2
162#define gnd_to_lpa_mux 6
163
164/* Test Vector Macros */
165#define TEST_TYPE_PER_LS 1
166#define TEST_TYPE_PER_HS 2
167#define TEST_TYPE_LPA 5
Vikram Mulukutlaefd64f52012-01-09 17:41:09 -0800168#define TEST_TYPE_LPA_HS 6
Vikram Mulukutla489e39e2011-08-31 18:04:05 -0700169#define TEST_TYPE_SHIFT 24
170#define TEST_CLK_SEL_MASK BM(23, 0)
171#define TEST_VECTOR(s, t) (((t) << TEST_TYPE_SHIFT) | BVAL(23, 0, (s)))
172#define TEST_PER_LS(s) TEST_VECTOR((s), TEST_TYPE_PER_LS)
173#define TEST_PER_HS(s) TEST_VECTOR((s), TEST_TYPE_PER_HS)
174#define TEST_LPA(s) TEST_VECTOR((s), TEST_TYPE_LPA)
Vikram Mulukutlaefd64f52012-01-09 17:41:09 -0800175#define TEST_LPA_HS(s) TEST_VECTOR((s), TEST_TYPE_LPA_HS)
Vikram Mulukutla489e39e2011-08-31 18:04:05 -0700176
Matt Wagantalle18bbc82011-10-06 10:07:28 -0700177enum vdd_dig_levels {
178 VDD_DIG_NONE,
179 VDD_DIG_LOW,
180 VDD_DIG_NOMINAL,
181 VDD_DIG_HIGH
182};
183
184static int set_vdd_dig(struct clk_vdd_class *vdd_class, int level)
185{
Matt Wagantalle18bbc82011-10-06 10:07:28 -0700186 static const int vdd_uv[] = {
Vikram Mulukutla5e6ab912011-11-04 15:20:19 -0700187 [VDD_DIG_NONE] = 0,
188 [VDD_DIG_LOW] = 945000,
189 [VDD_DIG_NOMINAL] = 1050000,
Matt Wagantalle18bbc82011-10-06 10:07:28 -0700190 [VDD_DIG_HIGH] = 1150000
191 };
192
193 return rpm_vreg_set_voltage(RPM_VREG_ID_PM8018_S1, RPM_VREG_VOTER3,
194 vdd_uv[level], vdd_uv[VDD_DIG_HIGH], 1);
195}
196
197static DEFINE_VDD_CLASS(vdd_dig, set_vdd_dig);
198
199#define VDD_DIG_FMAX_MAP1(l1, f1) \
200 .vdd_class = &vdd_dig, \
201 .fmax[VDD_DIG_##l1] = (f1)
202#define VDD_DIG_FMAX_MAP2(l1, f1, l2, f2) \
203 .vdd_class = &vdd_dig, \
204 .fmax[VDD_DIG_##l1] = (f1), \
205 .fmax[VDD_DIG_##l2] = (f2)
Vikram Mulukutla489e39e2011-08-31 18:04:05 -0700206
207/*
208 * Clock Descriptions
209 */
210
211static struct msm_xo_voter *xo_cxo;
212
213static int cxo_clk_enable(struct clk *clk)
214{
215 return msm_xo_mode_vote(xo_cxo, MSM_XO_MODE_ON);
216}
217
218static void cxo_clk_disable(struct clk *clk)
219{
220 msm_xo_mode_vote(xo_cxo, MSM_XO_MODE_OFF);
221}
222
223static struct clk_ops clk_ops_cxo = {
224 .enable = cxo_clk_enable,
225 .disable = cxo_clk_disable,
226 .get_rate = fixed_clk_get_rate,
227 .is_local = local_clk_is_local,
228};
229
230static struct fixed_clk cxo_clk = {
231 .rate = 19200000,
232 .c = {
233 .dbg_name = "cxo_clk",
234 .ops = &clk_ops_cxo,
235 CLK_INIT(cxo_clk.c),
236 },
237};
238
Vikram Mulukutla31680ae2011-11-04 14:23:55 -0700239static DEFINE_SPINLOCK(soft_vote_lock);
240
241static int pll_acpu_vote_clk_enable(struct clk *clk)
242{
243 int ret = 0;
244 unsigned long flags;
245 struct pll_vote_clk *pll = to_pll_vote_clk(clk);
246
247 spin_lock_irqsave(&soft_vote_lock, flags);
248
249 if (!*pll->soft_vote)
250 ret = pll_vote_clk_enable(clk);
251 if (ret == 0)
252 *pll->soft_vote |= (pll->soft_vote_mask);
253
254 spin_unlock_irqrestore(&soft_vote_lock, flags);
255 return ret;
256}
257
258static void pll_acpu_vote_clk_disable(struct clk *clk)
259{
260 unsigned long flags;
261 struct pll_vote_clk *pll = to_pll_vote_clk(clk);
262
263 spin_lock_irqsave(&soft_vote_lock, flags);
264
265 *pll->soft_vote &= ~(pll->soft_vote_mask);
266 if (!*pll->soft_vote)
267 pll_vote_clk_disable(clk);
268
269 spin_unlock_irqrestore(&soft_vote_lock, flags);
270}
271
272static struct clk_ops clk_ops_pll_acpu_vote = {
273 .enable = pll_acpu_vote_clk_enable,
274 .disable = pll_acpu_vote_clk_disable,
275 .auto_off = pll_acpu_vote_clk_disable,
276 .is_enabled = pll_vote_clk_is_enabled,
277 .get_rate = pll_vote_clk_get_rate,
278 .get_parent = pll_vote_clk_get_parent,
279 .is_local = local_clk_is_local,
280};
281
282#define PLL_SOFT_VOTE_PRIMARY BIT(0)
283#define PLL_SOFT_VOTE_ACPU BIT(1)
284
285static unsigned int soft_vote_pll0;
286
Vikram Mulukutla489e39e2011-08-31 18:04:05 -0700287static struct pll_vote_clk pll0_clk = {
288 .rate = 276000000,
289 .en_reg = BB_PLL_ENA_SC0_REG,
290 .en_mask = BIT(0),
291 .status_reg = BB_PLL0_STATUS_REG,
292 .parent = &cxo_clk.c,
Vikram Mulukutla31680ae2011-11-04 14:23:55 -0700293 .soft_vote = &soft_vote_pll0,
294 .soft_vote_mask = PLL_SOFT_VOTE_PRIMARY,
Vikram Mulukutla489e39e2011-08-31 18:04:05 -0700295 .c = {
296 .dbg_name = "pll0_clk",
Vikram Mulukutla31680ae2011-11-04 14:23:55 -0700297 .ops = &clk_ops_pll_acpu_vote,
Vikram Mulukutla489e39e2011-08-31 18:04:05 -0700298 CLK_INIT(pll0_clk.c),
299 },
300};
301
Vikram Mulukutla31680ae2011-11-04 14:23:55 -0700302static struct pll_vote_clk pll0_acpu_clk = {
303 .rate = 276000000,
304 .en_reg = BB_PLL_ENA_SC0_REG,
305 .en_mask = BIT(0),
306 .status_reg = BB_PLL0_STATUS_REG,
307 .soft_vote = &soft_vote_pll0,
308 .soft_vote_mask = PLL_SOFT_VOTE_ACPU,
309 .c = {
310 .dbg_name = "pll0_acpu_clk",
311 .ops = &clk_ops_pll_acpu_vote,
312 CLK_INIT(pll0_acpu_clk.c),
313 },
314};
315
Vikram Mulukutla489e39e2011-08-31 18:04:05 -0700316static struct pll_vote_clk pll4_clk = {
317 .rate = 393216000,
318 .en_reg = BB_PLL_ENA_SC0_REG,
319 .en_mask = BIT(4),
320 .status_reg = LCC_PLL0_STATUS_REG,
321 .parent = &cxo_clk.c,
322 .c = {
323 .dbg_name = "pll4_clk",
324 .ops = &clk_ops_pll_vote,
325 CLK_INIT(pll4_clk.c),
326 },
327};
328
Vikram Mulukutla31680ae2011-11-04 14:23:55 -0700329static unsigned int soft_vote_pll8;
330
Vikram Mulukutla489e39e2011-08-31 18:04:05 -0700331static struct pll_vote_clk pll8_clk = {
332 .rate = 384000000,
333 .en_reg = BB_PLL_ENA_SC0_REG,
334 .en_mask = BIT(8),
335 .status_reg = BB_PLL8_STATUS_REG,
336 .parent = &cxo_clk.c,
Vikram Mulukutla31680ae2011-11-04 14:23:55 -0700337 .soft_vote = &soft_vote_pll8,
338 .soft_vote_mask = PLL_SOFT_VOTE_PRIMARY,
Vikram Mulukutla489e39e2011-08-31 18:04:05 -0700339 .c = {
340 .dbg_name = "pll8_clk",
Vikram Mulukutla31680ae2011-11-04 14:23:55 -0700341 .ops = &clk_ops_pll_acpu_vote,
Vikram Mulukutla489e39e2011-08-31 18:04:05 -0700342 CLK_INIT(pll8_clk.c),
343 },
344};
345
Vikram Mulukutla31680ae2011-11-04 14:23:55 -0700346static struct pll_vote_clk pll8_acpu_clk = {
347 .rate = 384000000,
348 .en_reg = BB_PLL_ENA_SC0_REG,
349 .en_mask = BIT(8),
350 .status_reg = BB_PLL8_STATUS_REG,
351 .soft_vote = &soft_vote_pll8,
352 .soft_vote_mask = PLL_SOFT_VOTE_ACPU,
353 .c = {
354 .dbg_name = "pll8_acpu_clk",
355 .ops = &clk_ops_pll_acpu_vote,
356 CLK_INIT(pll8_acpu_clk.c),
357 },
358};
359
Vikram Mulukutla266551f2012-01-11 12:32:58 -0800360static struct pll_clk pll9_acpu_clk = {
Vikram Mulukutla489e39e2011-08-31 18:04:05 -0700361 .rate = 440000000,
Vikram Mulukutla266551f2012-01-11 12:32:58 -0800362 .mode_reg = SC_PLL0_MODE_REG,
Vikram Mulukutla31680ae2011-11-04 14:23:55 -0700363 .c = {
364 .dbg_name = "pll9_acpu_clk",
Vikram Mulukutla266551f2012-01-11 12:32:58 -0800365 .ops = &clk_ops_pll,
Vikram Mulukutla31680ae2011-11-04 14:23:55 -0700366 CLK_INIT(pll9_acpu_clk.c),
367 },
368};
369
Vikram Mulukutla489e39e2011-08-31 18:04:05 -0700370static struct pll_vote_clk pll14_clk = {
371 .rate = 480000000,
372 .en_reg = BB_PLL_ENA_SC0_REG,
373 .en_mask = BIT(11),
374 .status_reg = BB_PLL14_STATUS_REG,
375 .parent = &cxo_clk.c,
376 .c = {
377 .dbg_name = "pll14_clk",
378 .ops = &clk_ops_pll_vote,
379 CLK_INIT(pll14_clk.c),
380 },
381};
382
Vikram Mulukutla489e39e2011-08-31 18:04:05 -0700383static struct clk_ops clk_ops_rcg_9615 = {
384 .enable = rcg_clk_enable,
385 .disable = rcg_clk_disable,
Matt Wagantall41af0772011-09-17 12:21:39 -0700386 .auto_off = rcg_clk_disable,
Vikram Mulukutla489e39e2011-08-31 18:04:05 -0700387 .set_rate = rcg_clk_set_rate,
Vikram Mulukutla489e39e2011-08-31 18:04:05 -0700388 .get_rate = rcg_clk_get_rate,
389 .list_rate = rcg_clk_list_rate,
390 .is_enabled = rcg_clk_is_enabled,
391 .round_rate = rcg_clk_round_rate,
Stephen Boyd7bf28142011-12-07 00:30:52 -0800392 .reset = rcg_clk_reset,
Vikram Mulukutla489e39e2011-08-31 18:04:05 -0700393 .is_local = local_clk_is_local,
394 .get_parent = rcg_clk_get_parent,
395};
396
397static struct clk_ops clk_ops_branch = {
398 .enable = branch_clk_enable,
399 .disable = branch_clk_disable,
Matt Wagantall41af0772011-09-17 12:21:39 -0700400 .auto_off = branch_clk_disable,
Vikram Mulukutla489e39e2011-08-31 18:04:05 -0700401 .is_enabled = branch_clk_is_enabled,
402 .reset = branch_clk_reset,
403 .is_local = local_clk_is_local,
404 .get_parent = branch_clk_get_parent,
405 .set_parent = branch_clk_set_parent,
406};
407
408/*
409 * Peripheral Clocks
410 */
Matt Wagantall7625a4c2011-11-01 16:17:53 -0700411#define CLK_GP(i, n, h_r, h_b) \
412 struct rcg_clk i##_clk = { \
413 .b = { \
414 .ctl_reg = GPn_NS_REG(n), \
415 .en_mask = BIT(9), \
416 .halt_reg = h_r, \
417 .halt_bit = h_b, \
418 }, \
419 .ns_reg = GPn_NS_REG(n), \
420 .md_reg = GPn_MD_REG(n), \
421 .root_en_mask = BIT(11), \
422 .ns_mask = (BM(23, 16) | BM(6, 0)), \
423 .set_rate = set_rate_mnd, \
424 .freq_tbl = clk_tbl_gp, \
425 .current_freq = &rcg_dummy_freq, \
426 .c = { \
427 .dbg_name = #i "_clk", \
428 .ops = &clk_ops_rcg_9615, \
429 VDD_DIG_FMAX_MAP1(LOW, 27000000), \
430 CLK_INIT(i##_clk.c), \
431 }, \
432 }
433#define F_GP(f, s, d, m, n) \
434 { \
435 .freq_hz = f, \
436 .src_clk = &s##_clk.c, \
437 .md_val = MD8(16, m, 0, n), \
438 .ns_val = NS(23, 16, n, m, 5, 4, 3, d, 2, 0, s##_to_bb_mux), \
439 .mnd_en_mask = BIT(8) * !!(n), \
440 }
441static struct clk_freq_tbl clk_tbl_gp[] = {
442 F_GP( 0, gnd, 1, 0, 0),
443 F_GP( 9600000, cxo, 2, 0, 0),
444 F_GP( 19200000, cxo, 1, 0, 0),
445 F_END
446};
447
448static CLK_GP(gp0, 0, CLK_HALT_SFPB_MISC_STATE_REG, 7);
449static CLK_GP(gp1, 1, CLK_HALT_SFPB_MISC_STATE_REG, 6);
450static CLK_GP(gp2, 2, CLK_HALT_SFPB_MISC_STATE_REG, 5);
451
Vikram Mulukutla489e39e2011-08-31 18:04:05 -0700452#define CLK_GSBI_UART(i, n, h_r, h_b) \
453 struct rcg_clk i##_clk = { \
454 .b = { \
455 .ctl_reg = GSBIn_UART_APPS_NS_REG(n), \
456 .en_mask = BIT(9), \
457 .reset_reg = GSBIn_RESET_REG(n), \
458 .reset_mask = BIT(0), \
459 .halt_reg = h_r, \
460 .halt_bit = h_b, \
461 }, \
462 .ns_reg = GSBIn_UART_APPS_NS_REG(n), \
463 .md_reg = GSBIn_UART_APPS_MD_REG(n), \
464 .root_en_mask = BIT(11), \
465 .ns_mask = (BM(31, 16) | BM(6, 0)), \
466 .set_rate = set_rate_mnd, \
467 .freq_tbl = clk_tbl_gsbi_uart, \
468 .current_freq = &rcg_dummy_freq, \
469 .c = { \
470 .dbg_name = #i "_clk", \
471 .ops = &clk_ops_rcg_9615, \
Matt Wagantalle18bbc82011-10-06 10:07:28 -0700472 VDD_DIG_FMAX_MAP2(LOW, 32000000, NOMINAL, 64000000), \
Vikram Mulukutla489e39e2011-08-31 18:04:05 -0700473 CLK_INIT(i##_clk.c), \
474 }, \
475 }
Matt Wagantalle18bbc82011-10-06 10:07:28 -0700476#define F_GSBI_UART(f, s, d, m, n) \
Vikram Mulukutla489e39e2011-08-31 18:04:05 -0700477 { \
478 .freq_hz = f, \
479 .src_clk = &s##_clk.c, \
480 .md_val = MD16(m, n), \
481 .ns_val = NS(31, 16, n, m, 5, 4, 3, d, 2, 0, s##_to_bb_mux), \
482 .mnd_en_mask = BIT(8) * !!(n), \
Vikram Mulukutla489e39e2011-08-31 18:04:05 -0700483 }
484static struct clk_freq_tbl clk_tbl_gsbi_uart[] = {
Matt Wagantalle18bbc82011-10-06 10:07:28 -0700485 F_GSBI_UART( 0, gnd, 1, 0, 0),
Matt Wagantall9a561f72012-01-19 16:13:12 -0800486 F_GSBI_UART( 3686400, pll8, 2, 12, 625),
487 F_GSBI_UART( 7372800, pll8, 2, 24, 625),
488 F_GSBI_UART(14745600, pll8, 2, 48, 625),
Matt Wagantalle18bbc82011-10-06 10:07:28 -0700489 F_GSBI_UART(16000000, pll8, 4, 1, 6),
490 F_GSBI_UART(24000000, pll8, 4, 1, 4),
491 F_GSBI_UART(32000000, pll8, 4, 1, 3),
492 F_GSBI_UART(40000000, pll8, 1, 5, 48),
493 F_GSBI_UART(46400000, pll8, 1, 29, 240),
494 F_GSBI_UART(48000000, pll8, 4, 1, 2),
495 F_GSBI_UART(51200000, pll8, 1, 2, 15),
496 F_GSBI_UART(56000000, pll8, 1, 7, 48),
497 F_GSBI_UART(58982400, pll8, 1, 96, 625),
498 F_GSBI_UART(64000000, pll8, 2, 1, 3),
Vikram Mulukutla489e39e2011-08-31 18:04:05 -0700499 F_END
500};
501
502static CLK_GSBI_UART(gsbi1_uart, 1, CLK_HALT_CFPB_STATEA_REG, 10);
503static CLK_GSBI_UART(gsbi2_uart, 2, CLK_HALT_CFPB_STATEA_REG, 6);
504static CLK_GSBI_UART(gsbi3_uart, 3, CLK_HALT_CFPB_STATEA_REG, 2);
505static CLK_GSBI_UART(gsbi4_uart, 4, CLK_HALT_CFPB_STATEB_REG, 26);
506static CLK_GSBI_UART(gsbi5_uart, 5, CLK_HALT_CFPB_STATEB_REG, 22);
507
508#define CLK_GSBI_QUP(i, n, h_r, h_b) \
509 struct rcg_clk i##_clk = { \
510 .b = { \
511 .ctl_reg = GSBIn_QUP_APPS_NS_REG(n), \
512 .en_mask = BIT(9), \
513 .reset_reg = GSBIn_RESET_REG(n), \
514 .reset_mask = BIT(0), \
515 .halt_reg = h_r, \
516 .halt_bit = h_b, \
517 }, \
518 .ns_reg = GSBIn_QUP_APPS_NS_REG(n), \
519 .md_reg = GSBIn_QUP_APPS_MD_REG(n), \
520 .root_en_mask = BIT(11), \
521 .ns_mask = (BM(23, 16) | BM(6, 0)), \
522 .set_rate = set_rate_mnd, \
523 .freq_tbl = clk_tbl_gsbi_qup, \
524 .current_freq = &rcg_dummy_freq, \
525 .c = { \
526 .dbg_name = #i "_clk", \
527 .ops = &clk_ops_rcg_9615, \
Matt Wagantalle18bbc82011-10-06 10:07:28 -0700528 VDD_DIG_FMAX_MAP2(LOW, 24000000, NOMINAL, 52000000), \
Vikram Mulukutla489e39e2011-08-31 18:04:05 -0700529 CLK_INIT(i##_clk.c), \
530 }, \
531 }
Matt Wagantalle18bbc82011-10-06 10:07:28 -0700532#define F_GSBI_QUP(f, s, d, m, n) \
Vikram Mulukutla489e39e2011-08-31 18:04:05 -0700533 { \
534 .freq_hz = f, \
535 .src_clk = &s##_clk.c, \
536 .md_val = MD8(16, m, 0, n), \
537 .ns_val = NS(23, 16, n, m, 5, 4, 3, d, 2, 0, s##_to_bb_mux), \
538 .mnd_en_mask = BIT(8) * !!(n), \
Vikram Mulukutla489e39e2011-08-31 18:04:05 -0700539 }
540static struct clk_freq_tbl clk_tbl_gsbi_qup[] = {
Matt Wagantalle18bbc82011-10-06 10:07:28 -0700541 F_GSBI_QUP( 0, gnd, 1, 0, 0),
542 F_GSBI_QUP( 960000, cxo, 4, 1, 5),
543 F_GSBI_QUP( 4800000, cxo, 4, 0, 1),
544 F_GSBI_QUP( 9600000, cxo, 2, 0, 1),
545 F_GSBI_QUP(15058800, pll8, 1, 2, 51),
546 F_GSBI_QUP(24000000, pll8, 4, 1, 4),
547 F_GSBI_QUP(25600000, pll8, 1, 1, 15),
548 F_GSBI_QUP(48000000, pll8, 4, 1, 2),
549 F_GSBI_QUP(51200000, pll8, 1, 2, 15),
Vikram Mulukutla489e39e2011-08-31 18:04:05 -0700550 F_END
551};
552
553static CLK_GSBI_QUP(gsbi1_qup, 1, CLK_HALT_CFPB_STATEA_REG, 9);
554static CLK_GSBI_QUP(gsbi2_qup, 2, CLK_HALT_CFPB_STATEA_REG, 4);
555static CLK_GSBI_QUP(gsbi3_qup, 3, CLK_HALT_CFPB_STATEA_REG, 0);
556static CLK_GSBI_QUP(gsbi4_qup, 4, CLK_HALT_CFPB_STATEB_REG, 24);
557static CLK_GSBI_QUP(gsbi5_qup, 5, CLK_HALT_CFPB_STATEB_REG, 20);
558
Matt Wagantalle18bbc82011-10-06 10:07:28 -0700559#define F_PDM(f, s, d) \
Vikram Mulukutla489e39e2011-08-31 18:04:05 -0700560 { \
561 .freq_hz = f, \
562 .src_clk = &s##_clk.c, \
563 .ns_val = NS_SRC_SEL(1, 0, s##_to_xo_mux), \
Vikram Mulukutla489e39e2011-08-31 18:04:05 -0700564 }
565static struct clk_freq_tbl clk_tbl_pdm[] = {
Matt Wagantalle18bbc82011-10-06 10:07:28 -0700566 F_PDM( 0, gnd, 1),
567 F_PDM(19200000, cxo, 1),
Vikram Mulukutla489e39e2011-08-31 18:04:05 -0700568 F_END
569};
570
571static struct rcg_clk pdm_clk = {
572 .b = {
573 .ctl_reg = PDM_CLK_NS_REG,
574 .en_mask = BIT(9),
575 .reset_reg = PDM_CLK_NS_REG,
576 .reset_mask = BIT(12),
577 .halt_reg = CLK_HALT_CFPB_STATEC_REG,
578 .halt_bit = 3,
579 },
580 .ns_reg = PDM_CLK_NS_REG,
581 .root_en_mask = BIT(11),
582 .ns_mask = BM(1, 0),
583 .set_rate = set_rate_nop,
584 .freq_tbl = clk_tbl_pdm,
585 .current_freq = &rcg_dummy_freq,
586 .c = {
587 .dbg_name = "pdm_clk",
588 .ops = &clk_ops_rcg_9615,
Matt Wagantalle18bbc82011-10-06 10:07:28 -0700589 VDD_DIG_FMAX_MAP1(LOW, 19200000),
Vikram Mulukutla489e39e2011-08-31 18:04:05 -0700590 CLK_INIT(pdm_clk.c),
591 },
592};
593
594static struct branch_clk pmem_clk = {
595 .b = {
596 .ctl_reg = PMEM_ACLK_CTL_REG,
597 .en_mask = BIT(4),
598 .halt_reg = CLK_HALT_DFAB_STATE_REG,
599 .halt_bit = 20,
600 },
601 .c = {
602 .dbg_name = "pmem_clk",
603 .ops = &clk_ops_branch,
604 CLK_INIT(pmem_clk.c),
605 },
606};
607
Matt Wagantalle18bbc82011-10-06 10:07:28 -0700608#define F_PRNG(f, s) \
Vikram Mulukutla489e39e2011-08-31 18:04:05 -0700609 { \
610 .freq_hz = f, \
611 .src_clk = &s##_clk.c, \
Vikram Mulukutla489e39e2011-08-31 18:04:05 -0700612 }
613static struct clk_freq_tbl clk_tbl_prng[] = {
Matt Wagantalle18bbc82011-10-06 10:07:28 -0700614 F_PRNG(32000000, pll8),
Vikram Mulukutla489e39e2011-08-31 18:04:05 -0700615 F_END
616};
617
618static struct rcg_clk prng_clk = {
619 .b = {
620 .ctl_reg = SC0_U_CLK_BRANCH_ENA_VOTE_REG,
621 .en_mask = BIT(10),
622 .halt_reg = CLK_HALT_SFPB_MISC_STATE_REG,
623 .halt_check = HALT_VOTED,
624 .halt_bit = 10,
625 },
626 .set_rate = set_rate_nop,
627 .freq_tbl = clk_tbl_prng,
628 .current_freq = &rcg_dummy_freq,
629 .c = {
630 .dbg_name = "prng_clk",
631 .ops = &clk_ops_rcg_9615,
Matt Wagantalle18bbc82011-10-06 10:07:28 -0700632 VDD_DIG_FMAX_MAP2(LOW, 32000000, NOMINAL, 65000000),
Vikram Mulukutla489e39e2011-08-31 18:04:05 -0700633 CLK_INIT(prng_clk.c),
634 },
635};
636
637#define CLK_SDC(name, n, h_b, f_table) \
638 struct rcg_clk name = { \
639 .b = { \
640 .ctl_reg = SDCn_APPS_CLK_NS_REG(n), \
641 .en_mask = BIT(9), \
642 .reset_reg = SDCn_RESET_REG(n), \
643 .reset_mask = BIT(0), \
644 .halt_reg = CLK_HALT_DFAB_STATE_REG, \
645 .halt_bit = h_b, \
646 }, \
647 .ns_reg = SDCn_APPS_CLK_NS_REG(n), \
648 .md_reg = SDCn_APPS_CLK_MD_REG(n), \
649 .root_en_mask = BIT(11), \
650 .ns_mask = (BM(23, 16) | BM(6, 0)), \
651 .set_rate = set_rate_mnd, \
652 .freq_tbl = f_table, \
653 .current_freq = &rcg_dummy_freq, \
654 .c = { \
655 .dbg_name = #name, \
656 .ops = &clk_ops_rcg_9615, \
Matt Wagantalle18bbc82011-10-06 10:07:28 -0700657 VDD_DIG_FMAX_MAP2(LOW, 25000000, NOMINAL, 50000000), \
Vikram Mulukutla489e39e2011-08-31 18:04:05 -0700658 CLK_INIT(name.c), \
659 }, \
660 }
Matt Wagantalle18bbc82011-10-06 10:07:28 -0700661#define F_SDC(f, s, d, m, n) \
Vikram Mulukutla489e39e2011-08-31 18:04:05 -0700662 { \
663 .freq_hz = f, \
664 .src_clk = &s##_clk.c, \
665 .md_val = MD8(16, m, 0, n), \
666 .ns_val = NS(23, 16, n, m, 5, 4, 3, d, 2, 0, s##_to_bb_mux), \
667 .mnd_en_mask = BIT(8) * !!(n), \
Vikram Mulukutla489e39e2011-08-31 18:04:05 -0700668 }
669static struct clk_freq_tbl clk_tbl_sdc1_2[] = {
Matt Wagantalle18bbc82011-10-06 10:07:28 -0700670 F_SDC( 0, gnd, 1, 0, 0),
671 F_SDC( 144300, cxo, 1, 1, 133),
672 F_SDC( 400000, pll8, 4, 1, 240),
673 F_SDC( 16000000, pll8, 4, 1, 6),
674 F_SDC( 17070000, pll8, 1, 2, 45),
675 F_SDC( 20210000, pll8, 1, 1, 19),
676 F_SDC( 24000000, pll8, 4, 1, 4),
677 F_SDC( 48000000, pll8, 4, 1, 2),
Vikram Mulukutla489e39e2011-08-31 18:04:05 -0700678 F_END
679};
680
681static CLK_SDC(sdc1_clk, 1, 6, clk_tbl_sdc1_2);
682static CLK_SDC(sdc2_clk, 2, 5, clk_tbl_sdc1_2);
683
Matt Wagantalle18bbc82011-10-06 10:07:28 -0700684#define F_USB(f, s, d, m, n) \
Vikram Mulukutla489e39e2011-08-31 18:04:05 -0700685 { \
686 .freq_hz = f, \
687 .src_clk = &s##_clk.c, \
688 .md_val = MD8(16, m, 0, n), \
689 .ns_val = NS(23, 16, n, m, 5, 4, 3, d, 2, 0, s##_to_bb_mux), \
690 .mnd_en_mask = BIT(8) * !!(n), \
Vikram Mulukutla489e39e2011-08-31 18:04:05 -0700691 }
692static struct clk_freq_tbl clk_tbl_usb[] = {
Matt Wagantalle18bbc82011-10-06 10:07:28 -0700693 F_USB( 0, gnd, 1, 0, 0),
694 F_USB(60000000, pll8, 1, 5, 32),
Vikram Mulukutla489e39e2011-08-31 18:04:05 -0700695 F_END
696};
697
Vikram Mulukutla6c9158f2011-12-08 12:41:20 -0800698static struct clk_freq_tbl clk_tbl_usb_hsic_sys[] = {
699 F_USB( 0, gnd, 1, 0, 0),
700 F_USB(64000000, pll8, 1, 1, 6),
701 F_END
702};
703
Vikram Mulukutla489e39e2011-08-31 18:04:05 -0700704static struct rcg_clk usb_hs1_xcvr_clk = {
705 .b = {
706 .ctl_reg = USB_HS1_XCVR_FS_CLK_NS_REG,
707 .en_mask = BIT(9),
708 .reset_reg = USB_HS1_RESET_REG,
709 .reset_mask = BIT(0),
710 .halt_reg = CLK_HALT_DFAB_STATE_REG,
711 .halt_bit = 0,
712 },
713 .ns_reg = USB_HS1_XCVR_FS_CLK_NS_REG,
714 .md_reg = USB_HS1_XCVR_FS_CLK_MD_REG,
715 .root_en_mask = BIT(11),
716 .ns_mask = (BM(23, 16) | BM(6, 0)),
717 .set_rate = set_rate_mnd,
718 .freq_tbl = clk_tbl_usb,
719 .current_freq = &rcg_dummy_freq,
720 .c = {
721 .dbg_name = "usb_hs1_xcvr_clk",
722 .ops = &clk_ops_rcg_9615,
Matt Wagantalle18bbc82011-10-06 10:07:28 -0700723 VDD_DIG_FMAX_MAP1(NOMINAL, 60000000),
Vikram Mulukutla489e39e2011-08-31 18:04:05 -0700724 CLK_INIT(usb_hs1_xcvr_clk.c),
725 },
726};
727
728static struct rcg_clk usb_hs1_sys_clk = {
729 .b = {
730 .ctl_reg = USB_HS1_SYS_CLK_NS_REG,
731 .en_mask = BIT(9),
732 .reset_reg = USB_HS1_RESET_REG,
733 .reset_mask = BIT(0),
734 .halt_reg = CLK_HALT_DFAB_STATE_REG,
735 .halt_bit = 4,
736 },
737 .ns_reg = USB_HS1_SYS_CLK_NS_REG,
738 .md_reg = USB_HS1_SYS_CLK_MD_REG,
739 .root_en_mask = BIT(11),
740 .ns_mask = (BM(23, 16) | BM(6, 0)),
741 .set_rate = set_rate_mnd,
742 .freq_tbl = clk_tbl_usb,
743 .current_freq = &rcg_dummy_freq,
744 .c = {
745 .dbg_name = "usb_hs1_sys_clk",
746 .ops = &clk_ops_rcg_9615,
Matt Wagantalle18bbc82011-10-06 10:07:28 -0700747 VDD_DIG_FMAX_MAP1(NOMINAL, 60000000),
Vikram Mulukutla489e39e2011-08-31 18:04:05 -0700748 CLK_INIT(usb_hs1_sys_clk.c),
749 },
750};
751
752static struct rcg_clk usb_hsic_xcvr_clk = {
753 .b = {
754 .ctl_reg = USB_HSIC_XCVR_FS_CLK_NS_REG,
755 .en_mask = BIT(9),
756 .reset_reg = USB_HSIC_RESET_REG,
757 .reset_mask = BIT(0),
758 .halt_reg = CLK_HALT_DFAB_STATE_REG,
759 .halt_bit = 9,
760 },
761 .ns_reg = USB_HSIC_XCVR_FS_CLK_NS_REG,
762 .md_reg = USB_HSIC_XCVR_FS_CLK_MD_REG,
763 .root_en_mask = BIT(11),
764 .ns_mask = (BM(23, 16) | BM(6, 0)),
765 .set_rate = set_rate_mnd,
766 .freq_tbl = clk_tbl_usb,
767 .current_freq = &rcg_dummy_freq,
768 .c = {
769 .dbg_name = "usb_hsic_xcvr_clk",
770 .ops = &clk_ops_rcg_9615,
Vikram Mulukutla6c9158f2011-12-08 12:41:20 -0800771 VDD_DIG_FMAX_MAP1(LOW, 60000000),
Vikram Mulukutla489e39e2011-08-31 18:04:05 -0700772 CLK_INIT(usb_hsic_xcvr_clk.c),
773 },
774};
775
776static struct rcg_clk usb_hsic_sys_clk = {
777 .b = {
778 .ctl_reg = USB_HSIC_SYSTEM_CLK_NS_REG,
779 .en_mask = BIT(9),
780 .reset_reg = USB_HSIC_RESET_REG,
781 .reset_mask = BIT(0),
782 .halt_reg = CLK_HALT_DFAB_STATE_REG,
783 .halt_bit = 7,
784 },
785 .ns_reg = USB_HSIC_SYSTEM_CLK_NS_REG,
786 .md_reg = USB_HSIC_SYSTEM_CLK_MD_REG,
787 .root_en_mask = BIT(11),
788 .ns_mask = (BM(23, 16) | BM(6, 0)),
789 .set_rate = set_rate_mnd,
Vikram Mulukutla6c9158f2011-12-08 12:41:20 -0800790 .freq_tbl = clk_tbl_usb_hsic_sys,
Vikram Mulukutla489e39e2011-08-31 18:04:05 -0700791 .current_freq = &rcg_dummy_freq,
792 .c = {
793 .dbg_name = "usb_hsic_sys_clk",
794 .ops = &clk_ops_rcg_9615,
Vikram Mulukutla6c9158f2011-12-08 12:41:20 -0800795 VDD_DIG_FMAX_MAP1(LOW, 64000000),
Vikram Mulukutla489e39e2011-08-31 18:04:05 -0700796 CLK_INIT(usb_hsic_sys_clk.c),
797 },
798};
799
800static struct clk_freq_tbl clk_tbl_usb_hsic[] = {
Matt Wagantalle18bbc82011-10-06 10:07:28 -0700801 F_USB( 0, gnd, 1, 0, 0),
Vikram Mulukutla6c9158f2011-12-08 12:41:20 -0800802 F_USB(480000000, pll14, 1, 0, 0),
Vikram Mulukutla489e39e2011-08-31 18:04:05 -0700803 F_END
804};
805
806static struct rcg_clk usb_hsic_clk = {
807 .b = {
808 .ctl_reg = USB_HSIC_CLK_NS_REG,
809 .en_mask = BIT(9),
810 .reset_reg = USB_HSIC_RESET_REG,
811 .reset_mask = BIT(0),
Vikram Mulukutla6c9158f2011-12-08 12:41:20 -0800812 .halt_check = DELAY,
Vikram Mulukutla489e39e2011-08-31 18:04:05 -0700813 },
814 .ns_reg = USB_HSIC_CLK_NS_REG,
815 .md_reg = USB_HSIC_CLK_MD_REG,
816 .root_en_mask = BIT(11),
817 .ns_mask = (BM(23, 16) | BM(6, 0)),
818 .set_rate = set_rate_mnd,
819 .freq_tbl = clk_tbl_usb_hsic,
820 .current_freq = &rcg_dummy_freq,
821 .c = {
822 .dbg_name = "usb_hsic_clk",
823 .ops = &clk_ops_rcg_9615,
Vikram Mulukutla6c9158f2011-12-08 12:41:20 -0800824 VDD_DIG_FMAX_MAP1(LOW, 480000000),
Vikram Mulukutla489e39e2011-08-31 18:04:05 -0700825 CLK_INIT(usb_hsic_clk.c),
826 },
827};
828
829static struct branch_clk usb_hsic_hsio_cal_clk = {
830 .b = {
831 .ctl_reg = USB_HSIC_HSIO_CAL_CLK_CTL_REG,
832 .en_mask = BIT(0),
833 .halt_reg = CLK_HALT_DFAB_STATE_REG,
834 .halt_bit = 8,
835 },
836 .parent = &cxo_clk.c,
837 .c = {
838 .dbg_name = "usb_hsic_hsio_cal_clk",
839 .ops = &clk_ops_branch,
840 CLK_INIT(usb_hsic_hsio_cal_clk.c),
841 },
842};
843
844/* Fast Peripheral Bus Clocks */
845static struct branch_clk ce1_core_clk = {
846 .b = {
847 .ctl_reg = CE1_CORE_CLK_CTL_REG,
848 .en_mask = BIT(4),
849 .halt_reg = CLK_HALT_CFPB_STATEC_REG,
850 .halt_bit = 27,
851 },
852 .c = {
853 .dbg_name = "ce1_core_clk",
854 .ops = &clk_ops_branch,
855 CLK_INIT(ce1_core_clk.c),
856 },
857};
858static struct branch_clk ce1_p_clk = {
859 .b = {
860 .ctl_reg = CE1_HCLK_CTL_REG,
861 .en_mask = BIT(4),
862 .halt_reg = CLK_HALT_CFPB_STATEC_REG,
863 .halt_bit = 1,
864 },
865 .c = {
866 .dbg_name = "ce1_p_clk",
867 .ops = &clk_ops_branch,
868 CLK_INIT(ce1_p_clk.c),
869 },
870};
871
872static struct branch_clk dma_bam_p_clk = {
873 .b = {
874 .ctl_reg = DMA_BAM_HCLK_CTL,
875 .en_mask = BIT(4),
876 .halt_reg = CLK_HALT_DFAB_STATE_REG,
877 .halt_bit = 12,
878 },
879 .c = {
880 .dbg_name = "dma_bam_p_clk",
881 .ops = &clk_ops_branch,
882 CLK_INIT(dma_bam_p_clk.c),
883 },
884};
885
886static struct branch_clk gsbi1_p_clk = {
887 .b = {
888 .ctl_reg = GSBIn_HCLK_CTL_REG(1),
889 .en_mask = BIT(4),
890 .halt_reg = CLK_HALT_CFPB_STATEA_REG,
891 .halt_bit = 11,
892 },
893 .c = {
894 .dbg_name = "gsbi1_p_clk",
895 .ops = &clk_ops_branch,
896 CLK_INIT(gsbi1_p_clk.c),
897 },
898};
899
900static struct branch_clk gsbi2_p_clk = {
901 .b = {
902 .ctl_reg = GSBIn_HCLK_CTL_REG(2),
903 .en_mask = BIT(4),
904 .halt_reg = CLK_HALT_CFPB_STATEA_REG,
905 .halt_bit = 7,
906 },
907 .c = {
908 .dbg_name = "gsbi2_p_clk",
909 .ops = &clk_ops_branch,
910 CLK_INIT(gsbi2_p_clk.c),
911 },
912};
913
914static struct branch_clk gsbi3_p_clk = {
915 .b = {
916 .ctl_reg = GSBIn_HCLK_CTL_REG(3),
917 .en_mask = BIT(4),
918 .halt_reg = CLK_HALT_CFPB_STATEA_REG,
919 .halt_bit = 3,
920 },
921 .c = {
922 .dbg_name = "gsbi3_p_clk",
923 .ops = &clk_ops_branch,
924 CLK_INIT(gsbi3_p_clk.c),
925 },
926};
927
928static struct branch_clk gsbi4_p_clk = {
929 .b = {
930 .ctl_reg = GSBIn_HCLK_CTL_REG(4),
931 .en_mask = BIT(4),
932 .halt_reg = CLK_HALT_CFPB_STATEB_REG,
933 .halt_bit = 27,
934 },
935 .c = {
936 .dbg_name = "gsbi4_p_clk",
937 .ops = &clk_ops_branch,
938 CLK_INIT(gsbi4_p_clk.c),
939 },
940};
941
942static struct branch_clk gsbi5_p_clk = {
943 .b = {
944 .ctl_reg = GSBIn_HCLK_CTL_REG(5),
945 .en_mask = BIT(4),
946 .halt_reg = CLK_HALT_CFPB_STATEB_REG,
947 .halt_bit = 23,
948 },
949 .c = {
950 .dbg_name = "gsbi5_p_clk",
951 .ops = &clk_ops_branch,
952 CLK_INIT(gsbi5_p_clk.c),
953 },
954};
955
956static struct branch_clk usb_hs1_p_clk = {
957 .b = {
958 .ctl_reg = USB_HS1_HCLK_CTL_REG,
959 .en_mask = BIT(4),
960 .halt_reg = CLK_HALT_DFAB_STATE_REG,
961 .halt_bit = 1,
962 },
963 .c = {
964 .dbg_name = "usb_hs1_p_clk",
965 .ops = &clk_ops_branch,
966 CLK_INIT(usb_hs1_p_clk.c),
967 },
968};
969
970static struct branch_clk usb_hsic_p_clk = {
971 .b = {
972 .ctl_reg = USB_HSIC_HCLK_CTL_REG,
973 .en_mask = BIT(4),
974 .halt_reg = CLK_HALT_DFAB_STATE_REG,
975 .halt_bit = 3,
976 },
977 .c = {
978 .dbg_name = "usb_hsic_p_clk",
979 .ops = &clk_ops_branch,
980 CLK_INIT(usb_hsic_p_clk.c),
981 },
982};
983
984static struct branch_clk sdc1_p_clk = {
985 .b = {
986 .ctl_reg = SDCn_HCLK_CTL_REG(1),
987 .en_mask = BIT(4),
988 .halt_reg = CLK_HALT_DFAB_STATE_REG,
989 .halt_bit = 11,
990 },
991 .c = {
992 .dbg_name = "sdc1_p_clk",
993 .ops = &clk_ops_branch,
994 CLK_INIT(sdc1_p_clk.c),
995 },
996};
997
998static struct branch_clk sdc2_p_clk = {
999 .b = {
1000 .ctl_reg = SDCn_HCLK_CTL_REG(2),
1001 .en_mask = BIT(4),
1002 .halt_reg = CLK_HALT_DFAB_STATE_REG,
1003 .halt_bit = 10,
1004 },
1005 .c = {
1006 .dbg_name = "sdc2_p_clk",
1007 .ops = &clk_ops_branch,
1008 CLK_INIT(sdc2_p_clk.c),
1009 },
1010};
1011
1012/* HW-Voteable Clocks */
1013static struct branch_clk adm0_clk = {
1014 .b = {
1015 .ctl_reg = SC0_U_CLK_BRANCH_ENA_VOTE_REG,
1016 .en_mask = BIT(2),
1017 .halt_reg = CLK_HALT_MSS_KPSS_MISC_STATE_REG,
1018 .halt_check = HALT_VOTED,
1019 .halt_bit = 14,
1020 },
1021 .c = {
1022 .dbg_name = "adm0_clk",
1023 .ops = &clk_ops_branch,
1024 CLK_INIT(adm0_clk.c),
1025 },
1026};
1027
1028static struct branch_clk adm0_p_clk = {
1029 .b = {
1030 .ctl_reg = SC0_U_CLK_BRANCH_ENA_VOTE_REG,
1031 .en_mask = BIT(3),
1032 .halt_reg = CLK_HALT_MSS_KPSS_MISC_STATE_REG,
1033 .halt_check = HALT_VOTED,
1034 .halt_bit = 13,
1035 },
1036 .c = {
1037 .dbg_name = "adm0_p_clk",
1038 .ops = &clk_ops_branch,
1039 CLK_INIT(adm0_p_clk.c),
1040 },
1041};
1042
1043static struct branch_clk pmic_arb0_p_clk = {
1044 .b = {
1045 .ctl_reg = SC0_U_CLK_BRANCH_ENA_VOTE_REG,
1046 .en_mask = BIT(8),
1047 .halt_reg = CLK_HALT_SFPB_MISC_STATE_REG,
1048 .halt_check = HALT_VOTED,
1049 .halt_bit = 22,
1050 },
1051 .c = {
1052 .dbg_name = "pmic_arb0_p_clk",
1053 .ops = &clk_ops_branch,
1054 CLK_INIT(pmic_arb0_p_clk.c),
1055 },
1056};
1057
1058static struct branch_clk pmic_arb1_p_clk = {
1059 .b = {
1060 .ctl_reg = SC0_U_CLK_BRANCH_ENA_VOTE_REG,
1061 .en_mask = BIT(9),
1062 .halt_reg = CLK_HALT_SFPB_MISC_STATE_REG,
1063 .halt_check = HALT_VOTED,
1064 .halt_bit = 21,
1065 },
1066 .c = {
1067 .dbg_name = "pmic_arb1_p_clk",
1068 .ops = &clk_ops_branch,
1069 CLK_INIT(pmic_arb1_p_clk.c),
1070 },
1071};
1072
1073static struct branch_clk pmic_ssbi2_clk = {
1074 .b = {
1075 .ctl_reg = SC0_U_CLK_BRANCH_ENA_VOTE_REG,
1076 .en_mask = BIT(7),
1077 .halt_reg = CLK_HALT_SFPB_MISC_STATE_REG,
1078 .halt_check = HALT_VOTED,
1079 .halt_bit = 23,
1080 },
1081 .c = {
1082 .dbg_name = "pmic_ssbi2_clk",
1083 .ops = &clk_ops_branch,
1084 CLK_INIT(pmic_ssbi2_clk.c),
1085 },
1086};
1087
1088static struct branch_clk rpm_msg_ram_p_clk = {
1089 .b = {
1090 .ctl_reg = SC0_U_CLK_BRANCH_ENA_VOTE_REG,
1091 .en_mask = BIT(6),
1092 .halt_reg = CLK_HALT_SFPB_MISC_STATE_REG,
1093 .halt_check = HALT_VOTED,
1094 .halt_bit = 12,
1095 },
1096 .c = {
1097 .dbg_name = "rpm_msg_ram_p_clk",
1098 .ops = &clk_ops_branch,
1099 CLK_INIT(rpm_msg_ram_p_clk.c),
1100 },
1101};
1102
1103/*
1104 * Low Power Audio Clocks
1105 */
Matt Wagantalle18bbc82011-10-06 10:07:28 -07001106#define F_AIF_OSR(f, s, d, m, n) \
Vikram Mulukutla489e39e2011-08-31 18:04:05 -07001107 { \
1108 .freq_hz = f, \
1109 .src_clk = &s##_clk.c, \
1110 .md_val = MD8(8, m, 0, n), \
1111 .ns_val = NS(31, 24, n, m, 5, 4, 3, d, 2, 0, s##_to_lpa_mux), \
1112 .mnd_en_mask = BIT(8) * !!(n), \
Vikram Mulukutla489e39e2011-08-31 18:04:05 -07001113 }
1114static struct clk_freq_tbl clk_tbl_aif_osr[] = {
Matt Wagantalle18bbc82011-10-06 10:07:28 -07001115 F_AIF_OSR( 0, gnd, 1, 0, 0),
1116 F_AIF_OSR( 512000, pll4, 4, 1, 192),
1117 F_AIF_OSR( 768000, pll4, 4, 1, 128),
1118 F_AIF_OSR( 1024000, pll4, 4, 1, 96),
1119 F_AIF_OSR( 1536000, pll4, 4, 1, 64),
1120 F_AIF_OSR( 2048000, pll4, 4, 1, 48),
1121 F_AIF_OSR( 3072000, pll4, 4, 1, 32),
1122 F_AIF_OSR( 4096000, pll4, 4, 1, 24),
1123 F_AIF_OSR( 6144000, pll4, 4, 1, 16),
1124 F_AIF_OSR( 8192000, pll4, 4, 1, 12),
1125 F_AIF_OSR(12288000, pll4, 4, 1, 8),
1126 F_AIF_OSR(24576000, pll4, 4, 1, 4),
Vikram Mulukutla489e39e2011-08-31 18:04:05 -07001127 F_END
1128};
1129
1130#define CLK_AIF_OSR(i, ns, md, h_r) \
1131 struct rcg_clk i##_clk = { \
1132 .b = { \
1133 .ctl_reg = ns, \
1134 .en_mask = BIT(17), \
1135 .reset_reg = ns, \
1136 .reset_mask = BIT(19), \
1137 .halt_reg = h_r, \
1138 .halt_check = ENABLE, \
1139 .halt_bit = 1, \
1140 }, \
1141 .ns_reg = ns, \
1142 .md_reg = md, \
1143 .root_en_mask = BIT(9), \
1144 .ns_mask = (BM(31, 24) | BM(6, 0)), \
1145 .set_rate = set_rate_mnd, \
1146 .freq_tbl = clk_tbl_aif_osr, \
1147 .current_freq = &rcg_dummy_freq, \
1148 .c = { \
1149 .dbg_name = #i "_clk", \
1150 .ops = &clk_ops_rcg_9615, \
1151 CLK_INIT(i##_clk.c), \
1152 }, \
1153 }
1154#define CLK_AIF_OSR_DIV(i, ns, md, h_r) \
1155 struct rcg_clk i##_clk = { \
1156 .b = { \
1157 .ctl_reg = ns, \
1158 .en_mask = BIT(21), \
1159 .reset_reg = ns, \
1160 .reset_mask = BIT(23), \
1161 .halt_reg = h_r, \
1162 .halt_check = ENABLE, \
1163 .halt_bit = 1, \
1164 }, \
1165 .ns_reg = ns, \
1166 .md_reg = md, \
1167 .root_en_mask = BIT(9), \
1168 .ns_mask = (BM(31, 24) | BM(6, 0)), \
1169 .set_rate = set_rate_mnd, \
1170 .freq_tbl = clk_tbl_aif_osr, \
1171 .current_freq = &rcg_dummy_freq, \
1172 .c = { \
1173 .dbg_name = #i "_clk", \
1174 .ops = &clk_ops_rcg_9615, \
1175 CLK_INIT(i##_clk.c), \
1176 }, \
1177 }
1178
Vikram Mulukutla489e39e2011-08-31 18:04:05 -07001179#define CLK_AIF_BIT(i, ns, h_r) \
Stephen Boyd9fd19642011-11-16 11:11:09 -08001180 struct cdiv_clk i##_clk = { \
Vikram Mulukutla489e39e2011-08-31 18:04:05 -07001181 .b = { \
1182 .ctl_reg = ns, \
1183 .en_mask = BIT(15), \
1184 .halt_reg = h_r, \
1185 .halt_check = DELAY, \
1186 }, \
1187 .ns_reg = ns, \
Stephen Boyd9fd19642011-11-16 11:11:09 -08001188 .ext_mask = BIT(14), \
1189 .div_offset = 10, \
1190 .max_div = 16, \
Vikram Mulukutla489e39e2011-08-31 18:04:05 -07001191 .c = { \
1192 .dbg_name = #i "_clk", \
Stephen Boyd9fd19642011-11-16 11:11:09 -08001193 .ops = &clk_ops_cdiv, \
Vikram Mulukutla489e39e2011-08-31 18:04:05 -07001194 CLK_INIT(i##_clk.c), \
1195 }, \
1196 }
1197
Vikram Mulukutla489e39e2011-08-31 18:04:05 -07001198#define CLK_AIF_BIT_DIV(i, ns, h_r) \
Stephen Boyd9fd19642011-11-16 11:11:09 -08001199 struct cdiv_clk i##_clk = { \
Vikram Mulukutla489e39e2011-08-31 18:04:05 -07001200 .b = { \
1201 .ctl_reg = ns, \
1202 .en_mask = BIT(19), \
1203 .halt_reg = h_r, \
Stephen Boyd7bb9cf82012-01-25 18:09:01 -08001204 .halt_check = DELAY, \
Vikram Mulukutla489e39e2011-08-31 18:04:05 -07001205 }, \
1206 .ns_reg = ns, \
Stephen Boyd9fd19642011-11-16 11:11:09 -08001207 .ext_mask = BIT(18), \
1208 .div_offset = 10, \
1209 .max_div = 256, \
Vikram Mulukutla489e39e2011-08-31 18:04:05 -07001210 .c = { \
1211 .dbg_name = #i "_clk", \
Stephen Boyd9fd19642011-11-16 11:11:09 -08001212 .ops = &clk_ops_cdiv, \
Vikram Mulukutla489e39e2011-08-31 18:04:05 -07001213 CLK_INIT(i##_clk.c), \
1214 }, \
1215 }
1216
1217static CLK_AIF_OSR(mi2s_osr, LCC_MI2S_NS_REG, LCC_MI2S_MD_REG,
1218 LCC_MI2S_STATUS_REG);
1219static CLK_AIF_BIT(mi2s_bit, LCC_MI2S_NS_REG, LCC_MI2S_STATUS_REG);
1220
1221static CLK_AIF_OSR_DIV(codec_i2s_mic_osr, LCC_CODEC_I2S_MIC_NS_REG,
1222 LCC_CODEC_I2S_MIC_MD_REG, LCC_CODEC_I2S_MIC_STATUS_REG);
1223static CLK_AIF_BIT_DIV(codec_i2s_mic_bit, LCC_CODEC_I2S_MIC_NS_REG,
1224 LCC_CODEC_I2S_MIC_STATUS_REG);
1225
1226static CLK_AIF_OSR_DIV(spare_i2s_mic_osr, LCC_SPARE_I2S_MIC_NS_REG,
1227 LCC_SPARE_I2S_MIC_MD_REG, LCC_SPARE_I2S_MIC_STATUS_REG);
1228static CLK_AIF_BIT_DIV(spare_i2s_mic_bit, LCC_SPARE_I2S_MIC_NS_REG,
1229 LCC_SPARE_I2S_MIC_STATUS_REG);
1230
1231static CLK_AIF_OSR_DIV(codec_i2s_spkr_osr, LCC_CODEC_I2S_SPKR_NS_REG,
1232 LCC_CODEC_I2S_SPKR_MD_REG, LCC_CODEC_I2S_SPKR_STATUS_REG);
1233static CLK_AIF_BIT_DIV(codec_i2s_spkr_bit, LCC_CODEC_I2S_SPKR_NS_REG,
1234 LCC_CODEC_I2S_SPKR_STATUS_REG);
1235
1236static CLK_AIF_OSR_DIV(spare_i2s_spkr_osr, LCC_SPARE_I2S_SPKR_NS_REG,
1237 LCC_SPARE_I2S_SPKR_MD_REG, LCC_SPARE_I2S_SPKR_STATUS_REG);
1238static CLK_AIF_BIT_DIV(spare_i2s_spkr_bit, LCC_SPARE_I2S_SPKR_NS_REG,
1239 LCC_SPARE_I2S_SPKR_STATUS_REG);
1240
Matt Wagantalle18bbc82011-10-06 10:07:28 -07001241#define F_PCM(f, s, d, m, n) \
Vikram Mulukutla489e39e2011-08-31 18:04:05 -07001242 { \
1243 .freq_hz = f, \
1244 .src_clk = &s##_clk.c, \
1245 .md_val = MD16(m, n), \
1246 .ns_val = NS(31, 16, n, m, 5, 4, 3, d, 2, 0, s##_to_lpa_mux), \
1247 .mnd_en_mask = BIT(8) * !!(n), \
Vikram Mulukutla489e39e2011-08-31 18:04:05 -07001248 }
1249static struct clk_freq_tbl clk_tbl_pcm[] = {
Matt Wagantalle18bbc82011-10-06 10:07:28 -07001250 F_PCM( 0, gnd, 1, 0, 0),
1251 F_PCM( 512000, pll4, 4, 1, 192),
1252 F_PCM( 768000, pll4, 4, 1, 128),
1253 F_PCM( 1024000, pll4, 4, 1, 96),
1254 F_PCM( 1536000, pll4, 4, 1, 64),
1255 F_PCM( 2048000, pll4, 4, 1, 48),
1256 F_PCM( 3072000, pll4, 4, 1, 32),
1257 F_PCM( 4096000, pll4, 4, 1, 24),
1258 F_PCM( 6144000, pll4, 4, 1, 16),
1259 F_PCM( 8192000, pll4, 4, 1, 12),
1260 F_PCM(12288000, pll4, 4, 1, 8),
1261 F_PCM(24576000, pll4, 4, 1, 4),
Vikram Mulukutla489e39e2011-08-31 18:04:05 -07001262 F_END
1263};
1264
1265static struct rcg_clk pcm_clk = {
1266 .b = {
1267 .ctl_reg = LCC_PCM_NS_REG,
1268 .en_mask = BIT(11),
1269 .reset_reg = LCC_PCM_NS_REG,
1270 .reset_mask = BIT(13),
1271 .halt_reg = LCC_PCM_STATUS_REG,
1272 .halt_check = ENABLE,
1273 .halt_bit = 0,
1274 },
1275 .ns_reg = LCC_PCM_NS_REG,
1276 .md_reg = LCC_PCM_MD_REG,
1277 .root_en_mask = BIT(9),
1278 .ns_mask = (BM(31, 16) | BM(6, 0)),
1279 .set_rate = set_rate_mnd,
1280 .freq_tbl = clk_tbl_pcm,
1281 .current_freq = &rcg_dummy_freq,
1282 .c = {
1283 .dbg_name = "pcm_clk",
1284 .ops = &clk_ops_rcg_9615,
Matt Wagantalle18bbc82011-10-06 10:07:28 -07001285 VDD_DIG_FMAX_MAP1(LOW, 24576000),
Vikram Mulukutla489e39e2011-08-31 18:04:05 -07001286 CLK_INIT(pcm_clk.c),
1287 },
1288};
1289
1290static struct rcg_clk audio_slimbus_clk = {
1291 .b = {
1292 .ctl_reg = LCC_SLIMBUS_NS_REG,
1293 .en_mask = BIT(10),
1294 .reset_reg = LCC_AHBEX_BRANCH_CTL_REG,
1295 .reset_mask = BIT(5),
1296 .halt_reg = LCC_SLIMBUS_STATUS_REG,
1297 .halt_check = ENABLE,
1298 .halt_bit = 0,
1299 },
1300 .ns_reg = LCC_SLIMBUS_NS_REG,
1301 .md_reg = LCC_SLIMBUS_MD_REG,
1302 .root_en_mask = BIT(9),
1303 .ns_mask = (BM(31, 24) | BM(6, 0)),
1304 .set_rate = set_rate_mnd,
1305 .freq_tbl = clk_tbl_aif_osr,
1306 .current_freq = &rcg_dummy_freq,
1307 .c = {
1308 .dbg_name = "audio_slimbus_clk",
1309 .ops = &clk_ops_rcg_9615,
Matt Wagantalle18bbc82011-10-06 10:07:28 -07001310 VDD_DIG_FMAX_MAP1(LOW, 24576000),
Vikram Mulukutla489e39e2011-08-31 18:04:05 -07001311 CLK_INIT(audio_slimbus_clk.c),
1312 },
1313};
1314
1315static struct branch_clk sps_slimbus_clk = {
1316 .b = {
1317 .ctl_reg = LCC_SLIMBUS_NS_REG,
1318 .en_mask = BIT(12),
1319 .halt_reg = LCC_SLIMBUS_STATUS_REG,
1320 .halt_check = ENABLE,
1321 .halt_bit = 1,
1322 },
1323 .parent = &audio_slimbus_clk.c,
1324 .c = {
1325 .dbg_name = "sps_slimbus_clk",
1326 .ops = &clk_ops_branch,
1327 CLK_INIT(sps_slimbus_clk.c),
1328 },
1329};
1330
1331static struct branch_clk slimbus_xo_src_clk = {
1332 .b = {
1333 .ctl_reg = SLIMBUS_XO_SRC_CLK_CTL_REG,
1334 .en_mask = BIT(2),
1335 .halt_reg = CLK_HALT_DFAB_STATE_REG,
1336 .halt_bit = 28,
1337 },
1338 .parent = &sps_slimbus_clk.c,
1339 .c = {
1340 .dbg_name = "slimbus_xo_src_clk",
1341 .ops = &clk_ops_branch,
1342 CLK_INIT(slimbus_xo_src_clk.c),
1343 },
1344};
1345
Vikram Mulukutla73d42112011-09-19 16:32:54 -07001346DEFINE_CLK_RPM(cfpb_clk, cfpb_a_clk, CFPB, NULL);
1347DEFINE_CLK_RPM(dfab_clk, dfab_a_clk, DAYTONA_FABRIC, NULL);
1348DEFINE_CLK_RPM(ebi1_clk, ebi1_a_clk, EBI1, NULL);
1349DEFINE_CLK_RPM(sfab_clk, sfab_a_clk, SYSTEM_FABRIC, NULL);
1350DEFINE_CLK_RPM(sfpb_clk, sfpb_a_clk, SFPB, NULL);
1351
1352static DEFINE_CLK_VOTER(dfab_usb_hs_clk, &dfab_clk.c);
1353static DEFINE_CLK_VOTER(dfab_sdc1_clk, &dfab_clk.c);
1354static DEFINE_CLK_VOTER(dfab_sdc2_clk, &dfab_clk.c);
1355static DEFINE_CLK_VOTER(dfab_sps_clk, &dfab_clk.c);
Vikram Mulukutlacfd73ad2011-11-09 11:39:34 -08001356static DEFINE_CLK_VOTER(dfab_bam_dmux_clk, &dfab_clk.c);
Vikram Mulukutla73d42112011-09-19 16:32:54 -07001357static DEFINE_CLK_VOTER(ebi1_msmbus_clk, &ebi1_clk.c);
Vikram Mulukutla489e39e2011-08-31 18:04:05 -07001358
1359/*
1360 * TODO: replace dummy_clk below with ebi1_clk.c once the
1361 * bus driver starts voting on ebi1 rates.
1362 */
1363static DEFINE_CLK_VOTER(ebi1_adm_clk, &dummy_clk);
1364
1365#ifdef CONFIG_DEBUG_FS
1366struct measure_sel {
1367 u32 test_vector;
1368 struct clk *clk;
1369};
1370
Vikram Mulukutlaefd64f52012-01-09 17:41:09 -08001371static DEFINE_CLK_MEASURE(q6sw_clk);
1372static DEFINE_CLK_MEASURE(q6fw_clk);
1373static DEFINE_CLK_MEASURE(q6_func_clk);
1374
Vikram Mulukutla489e39e2011-08-31 18:04:05 -07001375static struct measure_sel measure_mux[] = {
1376 { TEST_PER_LS(0x08), &slimbus_xo_src_clk.c },
1377 { TEST_PER_LS(0x12), &sdc1_p_clk.c },
1378 { TEST_PER_LS(0x13), &sdc1_clk.c },
1379 { TEST_PER_LS(0x14), &sdc2_p_clk.c },
1380 { TEST_PER_LS(0x15), &sdc2_clk.c },
Matt Wagantall7625a4c2011-11-01 16:17:53 -07001381 { TEST_PER_LS(0x1F), &gp0_clk.c },
1382 { TEST_PER_LS(0x20), &gp1_clk.c },
1383 { TEST_PER_LS(0x21), &gp2_clk.c },
Vikram Mulukutla489e39e2011-08-31 18:04:05 -07001384 { TEST_PER_LS(0x26), &pmem_clk.c },
Vikram Mulukutla73d42112011-09-19 16:32:54 -07001385 { TEST_PER_LS(0x25), &dfab_clk.c },
1386 { TEST_PER_LS(0x25), &dfab_a_clk.c },
Vikram Mulukutla489e39e2011-08-31 18:04:05 -07001387 { TEST_PER_LS(0x32), &dma_bam_p_clk.c },
Vikram Mulukutla73d42112011-09-19 16:32:54 -07001388 { TEST_PER_LS(0x33), &cfpb_clk.c },
1389 { TEST_PER_LS(0x33), &cfpb_a_clk.c },
Vikram Mulukutla489e39e2011-08-31 18:04:05 -07001390 { TEST_PER_LS(0x3E), &gsbi1_uart_clk.c },
1391 { TEST_PER_LS(0x3F), &gsbi1_qup_clk.c },
1392 { TEST_PER_LS(0x41), &gsbi2_p_clk.c },
1393 { TEST_PER_LS(0x42), &gsbi2_uart_clk.c },
1394 { TEST_PER_LS(0x44), &gsbi2_qup_clk.c },
1395 { TEST_PER_LS(0x45), &gsbi3_p_clk.c },
1396 { TEST_PER_LS(0x46), &gsbi3_uart_clk.c },
1397 { TEST_PER_LS(0x48), &gsbi3_qup_clk.c },
1398 { TEST_PER_LS(0x49), &gsbi4_p_clk.c },
1399 { TEST_PER_LS(0x4A), &gsbi4_uart_clk.c },
1400 { TEST_PER_LS(0x4C), &gsbi4_qup_clk.c },
1401 { TEST_PER_LS(0x4D), &gsbi5_p_clk.c },
1402 { TEST_PER_LS(0x4E), &gsbi5_uart_clk.c },
1403 { TEST_PER_LS(0x50), &gsbi5_qup_clk.c },
Vikram Mulukutla73d42112011-09-19 16:32:54 -07001404 { TEST_PER_LS(0x78), &sfpb_clk.c },
1405 { TEST_PER_LS(0x78), &sfpb_a_clk.c },
Vikram Mulukutla489e39e2011-08-31 18:04:05 -07001406 { TEST_PER_LS(0x7A), &pmic_ssbi2_clk.c },
1407 { TEST_PER_LS(0x7B), &pmic_arb0_p_clk.c },
1408 { TEST_PER_LS(0x7C), &pmic_arb1_p_clk.c },
1409 { TEST_PER_LS(0x7D), &prng_clk.c },
1410 { TEST_PER_LS(0x7F), &rpm_msg_ram_p_clk.c },
1411 { TEST_PER_LS(0x80), &adm0_p_clk.c },
1412 { TEST_PER_LS(0x84), &usb_hs1_p_clk.c },
1413 { TEST_PER_LS(0x85), &usb_hs1_xcvr_clk.c },
1414 { TEST_PER_LS(0x86), &usb_hsic_sys_clk.c },
1415 { TEST_PER_LS(0x87), &usb_hsic_p_clk.c },
1416 { TEST_PER_LS(0x88), &usb_hsic_xcvr_clk.c },
1417 { TEST_PER_LS(0x8B), &usb_hsic_hsio_cal_clk.c },
1418 { TEST_PER_LS(0x8D), &usb_hs1_sys_clk.c },
1419 { TEST_PER_LS(0x92), &ce1_p_clk.c },
Vikram Mulukutla73d42112011-09-19 16:32:54 -07001420 { TEST_PER_HS(0x18), &sfab_clk.c },
1421 { TEST_PER_HS(0x18), &sfab_a_clk.c },
Vikram Mulukutlaefd64f52012-01-09 17:41:09 -08001422 { TEST_PER_HS(0x26), &q6sw_clk },
1423 { TEST_PER_HS(0x27), &q6fw_clk },
Vikram Mulukutla489e39e2011-08-31 18:04:05 -07001424 { TEST_PER_LS(0xA4), &ce1_core_clk.c },
1425 { TEST_PER_HS(0x2A), &adm0_clk.c },
Vikram Mulukutla73d42112011-09-19 16:32:54 -07001426 { TEST_PER_HS(0x34), &ebi1_clk.c },
1427 { TEST_PER_HS(0x34), &ebi1_a_clk.c },
Vikram Mulukutla6c9158f2011-12-08 12:41:20 -08001428 { TEST_PER_HS(0x3E), &usb_hsic_clk.c },
Vikram Mulukutla489e39e2011-08-31 18:04:05 -07001429 { TEST_LPA(0x0F), &mi2s_bit_clk.c },
1430 { TEST_LPA(0x10), &codec_i2s_mic_bit_clk.c },
1431 { TEST_LPA(0x11), &codec_i2s_spkr_bit_clk.c },
1432 { TEST_LPA(0x12), &spare_i2s_mic_bit_clk.c },
1433 { TEST_LPA(0x13), &spare_i2s_spkr_bit_clk.c },
1434 { TEST_LPA(0x14), &pcm_clk.c },
1435 { TEST_LPA(0x1D), &audio_slimbus_clk.c },
Vikram Mulukutlaefd64f52012-01-09 17:41:09 -08001436 { TEST_LPA_HS(0x00), &q6_func_clk },
Vikram Mulukutla489e39e2011-08-31 18:04:05 -07001437};
1438
1439static struct measure_sel *find_measure_sel(struct clk *clk)
1440{
1441 int i;
1442
1443 for (i = 0; i < ARRAY_SIZE(measure_mux); i++)
1444 if (measure_mux[i].clk == clk)
1445 return &measure_mux[i];
1446 return NULL;
1447}
1448
1449static int measure_clk_set_parent(struct clk *c, struct clk *parent)
1450{
1451 int ret = 0;
1452 u32 clk_sel;
1453 struct measure_sel *p;
1454 struct measure_clk *clk = to_measure_clk(c);
1455 unsigned long flags;
1456
1457 if (!parent)
1458 return -EINVAL;
1459
1460 p = find_measure_sel(parent);
1461 if (!p)
1462 return -EINVAL;
1463
1464 spin_lock_irqsave(&local_clock_reg_lock, flags);
1465
1466 /*
1467 * Program the test vector, measurement period (sample_ticks)
1468 * and scaling multiplier.
1469 */
1470 clk->sample_ticks = 0x10000;
1471 clk_sel = p->test_vector & TEST_CLK_SEL_MASK;
1472 clk->multiplier = 1;
1473 switch (p->test_vector >> TEST_TYPE_SHIFT) {
1474 case TEST_TYPE_PER_LS:
1475 writel_relaxed(0x4030D00|BVAL(7, 0, clk_sel), CLK_TEST_REG);
1476 break;
1477 case TEST_TYPE_PER_HS:
1478 writel_relaxed(0x4020000|BVAL(16, 10, clk_sel), CLK_TEST_REG);
1479 break;
1480 case TEST_TYPE_LPA:
1481 writel_relaxed(0x4030D98, CLK_TEST_REG);
1482 writel_relaxed(BVAL(6, 1, clk_sel)|BIT(0),
1483 LCC_CLK_LS_DEBUG_CFG_REG);
1484 break;
Vikram Mulukutlaefd64f52012-01-09 17:41:09 -08001485 case TEST_TYPE_LPA_HS:
1486 writel_relaxed(0x402BC00, CLK_TEST_REG);
1487 writel_relaxed(BVAL(2, 1, clk_sel)|BIT(0),
1488 LCC_CLK_HS_DEBUG_CFG_REG);
1489 break;
Vikram Mulukutla489e39e2011-08-31 18:04:05 -07001490 default:
1491 ret = -EPERM;
1492 }
1493 /* Make sure test vector is set before starting measurements. */
1494 mb();
1495
1496 spin_unlock_irqrestore(&local_clock_reg_lock, flags);
1497
1498 return ret;
1499}
1500
1501/* Sample clock for 'ticks' reference clock ticks. */
Matt Wagantall9de3bfb2011-11-03 20:13:12 -07001502static unsigned long run_measurement(unsigned ticks)
Vikram Mulukutla489e39e2011-08-31 18:04:05 -07001503{
1504 /* Stop counters and set the XO4 counter start value. */
Vikram Mulukutla489e39e2011-08-31 18:04:05 -07001505 writel_relaxed(ticks, RINGOSC_TCXO_CTL_REG);
1506
1507 /* Wait for timer to become ready. */
1508 while ((readl_relaxed(RINGOSC_STATUS_REG) & BIT(25)) != 0)
1509 cpu_relax();
1510
1511 /* Run measurement and wait for completion. */
1512 writel_relaxed(BIT(28)|ticks, RINGOSC_TCXO_CTL_REG);
1513 while ((readl_relaxed(RINGOSC_STATUS_REG) & BIT(25)) == 0)
1514 cpu_relax();
1515
1516 /* Stop counters. */
1517 writel_relaxed(0x0, RINGOSC_TCXO_CTL_REG);
1518
1519 /* Return measured ticks. */
1520 return readl_relaxed(RINGOSC_STATUS_REG) & BM(24, 0);
1521}
1522
1523
1524/* Perform a hardware rate measurement for a given clock.
1525 FOR DEBUG USE ONLY: Measurements take ~15 ms! */
Matt Wagantall9de3bfb2011-11-03 20:13:12 -07001526static unsigned long measure_clk_get_rate(struct clk *c)
Vikram Mulukutla489e39e2011-08-31 18:04:05 -07001527{
1528 unsigned long flags;
1529 u32 pdm_reg_backup, ringosc_reg_backup;
1530 u64 raw_count_short, raw_count_full;
1531 struct measure_clk *clk = to_measure_clk(c);
1532 unsigned ret;
1533
1534 spin_lock_irqsave(&local_clock_reg_lock, flags);
1535
1536 /* Enable CXO/4 and RINGOSC branch and root. */
1537 pdm_reg_backup = readl_relaxed(PDM_CLK_NS_REG);
1538 ringosc_reg_backup = readl_relaxed(RINGOSC_NS_REG);
1539 writel_relaxed(0x2898, PDM_CLK_NS_REG);
1540 writel_relaxed(0xA00, RINGOSC_NS_REG);
1541
1542 /*
1543 * The ring oscillator counter will not reset if the measured clock
1544 * is not running. To detect this, run a short measurement before
1545 * the full measurement. If the raw results of the two are the same
1546 * then the clock must be off.
1547 */
1548
1549 /* Run a short measurement. (~1 ms) */
1550 raw_count_short = run_measurement(0x1000);
1551 /* Run a full measurement. (~14 ms) */
1552 raw_count_full = run_measurement(clk->sample_ticks);
1553
1554 writel_relaxed(ringosc_reg_backup, RINGOSC_NS_REG);
1555 writel_relaxed(pdm_reg_backup, PDM_CLK_NS_REG);
1556
1557 /* Return 0 if the clock is off. */
1558 if (raw_count_full == raw_count_short)
1559 ret = 0;
1560 else {
1561 /* Compute rate in Hz. */
1562 raw_count_full = ((raw_count_full * 10) + 15) * 4800000;
1563 do_div(raw_count_full, ((clk->sample_ticks * 10) + 35));
1564 ret = (raw_count_full * clk->multiplier);
1565 }
1566
1567 /* Route dbg_hs_clk to PLLTEST. 300mV single-ended amplitude. */
1568 writel_relaxed(0x38F8, PLLTEST_PAD_CFG_REG);
1569 spin_unlock_irqrestore(&local_clock_reg_lock, flags);
1570
1571 return ret;
1572}
1573#else /* !CONFIG_DEBUG_FS */
1574static int measure_clk_set_parent(struct clk *clk, struct clk *parent)
1575{
1576 return -EINVAL;
1577}
1578
Matt Wagantall9de3bfb2011-11-03 20:13:12 -07001579static unsigned long measure_clk_get_rate(struct clk *clk)
Vikram Mulukutla489e39e2011-08-31 18:04:05 -07001580{
1581 return 0;
1582}
1583#endif /* CONFIG_DEBUG_FS */
1584
1585static struct clk_ops measure_clk_ops = {
1586 .set_parent = measure_clk_set_parent,
1587 .get_rate = measure_clk_get_rate,
1588 .is_local = local_clk_is_local,
1589};
1590
1591static struct measure_clk measure_clk = {
1592 .c = {
1593 .dbg_name = "measure_clk",
1594 .ops = &measure_clk_ops,
1595 CLK_INIT(measure_clk.c),
1596 },
1597 .multiplier = 1,
1598};
1599
1600static struct clk_lookup msm_clocks_9615[] = {
1601 CLK_LOOKUP("cxo", cxo_clk.c, NULL),
1602 CLK_LOOKUP("pll0", pll0_clk.c, NULL),
1603 CLK_LOOKUP("pll8", pll8_clk.c, NULL),
Vikram Mulukutla489e39e2011-08-31 18:04:05 -07001604 CLK_LOOKUP("pll14", pll14_clk.c, NULL),
Vikram Mulukutla31680ae2011-11-04 14:23:55 -07001605
1606 CLK_LOOKUP("pll0", pll0_acpu_clk.c, "acpu"),
1607 CLK_LOOKUP("pll8", pll8_acpu_clk.c, "acpu"),
1608 CLK_LOOKUP("pll9", pll9_acpu_clk.c, "acpu"),
1609
Vikram Mulukutla489e39e2011-08-31 18:04:05 -07001610 CLK_LOOKUP("measure", measure_clk.c, "debug"),
1611
Matt Wagantallb2710b82011-11-16 19:55:17 -08001612 CLK_LOOKUP("bus_clk", sfab_clk.c, "msm_sys_fab"),
1613 CLK_LOOKUP("bus_a_clk", sfab_a_clk.c, "msm_sys_fab"),
1614 CLK_LOOKUP("mem_clk", ebi1_msmbus_clk.c, "msm_bus"),
1615 CLK_LOOKUP("mem_a_clk", ebi1_a_clk.c, "msm_bus"),
1616
1617 CLK_LOOKUP("bus_clk", sfpb_clk.c, NULL),
1618 CLK_LOOKUP("bus_a_clk", sfpb_a_clk.c, NULL),
1619 CLK_LOOKUP("bus_clk", cfpb_clk.c, NULL),
1620 CLK_LOOKUP("bus_a_clk", cfpb_a_clk.c, NULL),
1621 CLK_LOOKUP("ebi1_clk", ebi1_clk.c, NULL),
Vikram Mulukutla73d42112011-09-19 16:32:54 -07001622 CLK_LOOKUP("dfab_clk", dfab_clk.c, NULL),
1623 CLK_LOOKUP("dfab_a_clk", dfab_a_clk.c, NULL),
Vikram Mulukutla489e39e2011-08-31 18:04:05 -07001624
Matt Wagantallc00f95d2012-01-05 14:22:45 -08001625 CLK_LOOKUP("core_clk", gp0_clk.c, ""),
1626 CLK_LOOKUP("core_clk", gp1_clk.c, ""),
1627 CLK_LOOKUP("core_clk", gp2_clk.c, ""),
Matt Wagantall7625a4c2011-11-01 16:17:53 -07001628
Matt Wagantallc00f95d2012-01-05 14:22:45 -08001629 CLK_LOOKUP("core_clk", gsbi3_uart_clk.c, ""),
Vikram Mulukutla489e39e2011-08-31 18:04:05 -07001630 CLK_LOOKUP("core_clk", gsbi4_uart_clk.c, "msm_serial_hsl.0"),
Matt Wagantallc00f95d2012-01-05 14:22:45 -08001631 CLK_LOOKUP("core_clk", gsbi5_uart_clk.c, ""),
Vikram Mulukutla489e39e2011-08-31 18:04:05 -07001632
Harini Jayaraman738c9312011-09-08 15:22:38 -06001633 CLK_LOOKUP("core_clk", gsbi3_qup_clk.c, "spi_qsd.0"),
Matt Wagantallc00f95d2012-01-05 14:22:45 -08001634 CLK_LOOKUP("core_clk", gsbi4_qup_clk.c, ""),
Harini Jayaramaneba52672011-09-08 15:13:00 -06001635 CLK_LOOKUP("core_clk", gsbi5_qup_clk.c, "qup_i2c.0"),
Vikram Mulukutla489e39e2011-08-31 18:04:05 -07001636
Matt Wagantallc00f95d2012-01-05 14:22:45 -08001637 CLK_LOOKUP("core_clk", pdm_clk.c, ""),
Vikram Mulukutladd0a2372011-09-19 15:58:21 -07001638 CLK_LOOKUP("mem_clk", pmem_clk.c, "msm_sps"),
Ramesh Masavarapu5ad37392011-10-10 10:44:10 -07001639 CLK_LOOKUP("core_clk", prng_clk.c, "msm_rng.0"),
Vikram Mulukutla489e39e2011-08-31 18:04:05 -07001640 CLK_LOOKUP("core_clk", sdc1_clk.c, "msm_sdcc.1"),
1641 CLK_LOOKUP("core_clk", sdc2_clk.c, "msm_sdcc.2"),
Matt Wagantallc00f95d2012-01-05 14:22:45 -08001642 CLK_LOOKUP("iface_clk", ce1_p_clk.c, ""),
1643 CLK_LOOKUP("core_clk", ce1_core_clk.c, ""),
Vikram Mulukutla489e39e2011-08-31 18:04:05 -07001644 CLK_LOOKUP("dma_bam_pclk", dma_bam_p_clk.c, NULL),
1645
Harini Jayaraman738c9312011-09-08 15:22:38 -06001646 CLK_LOOKUP("iface_clk", gsbi3_p_clk.c, "spi_qsd.0"),
Vikram Mulukutla489e39e2011-08-31 18:04:05 -07001647 CLK_LOOKUP("iface_clk", gsbi4_p_clk.c, "msm_serial_hsl.0"),
Harini Jayaramaneba52672011-09-08 15:13:00 -06001648 CLK_LOOKUP("iface_clk", gsbi5_p_clk.c, "qup_i2c.0"),
Vikram Mulukutla489e39e2011-08-31 18:04:05 -07001649
Manu Gautam5143b252012-01-05 19:25:23 -08001650 CLK_LOOKUP("iface_clk", usb_hs1_p_clk.c, "msm_otg"),
1651 CLK_LOOKUP("core_clk", usb_hs1_sys_clk.c, "msm_otg"),
1652 CLK_LOOKUP("alt_core_clk", usb_hs1_xcvr_clk.c, "msm_otg"),
1653 CLK_LOOKUP("alt_core_clk", usb_hsic_xcvr_clk.c, "msm_hsic_host"),
1654 CLK_LOOKUP("cal_clk", usb_hsic_hsio_cal_clk.c, "msm_hsic_host"),
1655 CLK_LOOKUP("core_clk", usb_hsic_sys_clk.c, "msm_hsic_host"),
1656 CLK_LOOKUP("iface_clk", usb_hsic_p_clk.c, "msm_hsic_host"),
1657 CLK_LOOKUP("phy_clk", usb_hsic_clk.c, "msm_hsic_host"),
Ofir Cohendf314b42012-01-15 11:59:34 +02001658 CLK_LOOKUP("alt_core_clk", usb_hsic_xcvr_clk.c, "msm_hsic_peripheral"),
1659 CLK_LOOKUP("cal_clk", usb_hsic_hsio_cal_clk.c, "msm_hsic_peripheral"),
1660 CLK_LOOKUP("core_clk", usb_hsic_sys_clk.c, "msm_hsic_peripheral"),
1661 CLK_LOOKUP("iface_clk", usb_hsic_p_clk.c, "msm_hsic_peripheral"),
1662 CLK_LOOKUP("phy_clk", usb_hsic_clk.c, "msm_hsic_peripheral"),
Vikram Mulukutla489e39e2011-08-31 18:04:05 -07001663
1664 CLK_LOOKUP("iface_clk", sdc1_p_clk.c, "msm_sdcc.1"),
1665 CLK_LOOKUP("iface_clk", sdc2_p_clk.c, "msm_sdcc.2"),
1666 CLK_LOOKUP("core_clk", adm0_clk.c, "msm_dmov"),
1667 CLK_LOOKUP("iface_clk", adm0_p_clk.c, "msm_dmov"),
Matt Wagantallc00f95d2012-01-05 14:22:45 -08001668 CLK_LOOKUP("iface_clk", pmic_arb0_p_clk.c, ""),
1669 CLK_LOOKUP("iface_clk", pmic_arb1_p_clk.c, ""),
1670 CLK_LOOKUP("core_clk", pmic_ssbi2_clk.c, ""),
1671 CLK_LOOKUP("mem_clk", rpm_msg_ram_p_clk.c, ""),
Vikram Mulukutla489e39e2011-08-31 18:04:05 -07001672 CLK_LOOKUP("mi2s_bit_clk", mi2s_bit_clk.c, NULL),
1673 CLK_LOOKUP("mi2s_osr_clk", mi2s_osr_clk.c, NULL),
1674
1675 CLK_LOOKUP("i2s_mic_bit_clk", codec_i2s_mic_bit_clk.c, NULL),
1676 CLK_LOOKUP("i2s_mic_osr_clk", codec_i2s_mic_osr_clk.c, NULL),
1677 CLK_LOOKUP("i2s_mic_bit_clk", spare_i2s_mic_bit_clk.c, NULL),
1678 CLK_LOOKUP("i2s_mic_osr_clk", spare_i2s_mic_osr_clk.c, NULL),
1679 CLK_LOOKUP("i2s_spkr_bit_clk", codec_i2s_spkr_bit_clk.c, NULL),
1680 CLK_LOOKUP("i2s_spkr_osr_clk", codec_i2s_spkr_osr_clk.c, NULL),
1681 CLK_LOOKUP("i2s_spkr_bit_clk", spare_i2s_spkr_bit_clk.c, NULL),
1682 CLK_LOOKUP("i2s_spkr_osr_clk", spare_i2s_spkr_osr_clk.c, NULL),
1683 CLK_LOOKUP("pcm_clk", pcm_clk.c, NULL),
1684
1685 CLK_LOOKUP("sps_slimbus_clk", sps_slimbus_clk.c, NULL),
1686 CLK_LOOKUP("audio_slimbus_clk", audio_slimbus_clk.c, NULL),
Manu Gautam5143b252012-01-05 19:25:23 -08001687 CLK_LOOKUP("core_clk", dfab_usb_hs_clk.c, "msm_otg"),
Vikram Mulukutla489e39e2011-08-31 18:04:05 -07001688 CLK_LOOKUP("bus_clk", dfab_sdc1_clk.c, "msm_sdcc.1"),
1689 CLK_LOOKUP("bus_clk", dfab_sdc2_clk.c, "msm_sdcc.2"),
1690 CLK_LOOKUP("dfab_clk", dfab_sps_clk.c, "msm_sps"),
Vikram Mulukutlacfd73ad2011-11-09 11:39:34 -08001691 CLK_LOOKUP("bus_clk", dfab_bam_dmux_clk.c, "BAM_RMNT"),
Vikram Mulukutla73d42112011-09-19 16:32:54 -07001692 CLK_LOOKUP("mem_clk", ebi1_adm_clk.c, "msm_dmov"),
Vikram Mulukutla489e39e2011-08-31 18:04:05 -07001693
Ramesh Masavarapufa679d92011-10-13 23:42:59 -07001694 CLK_LOOKUP("iface_clk", ce1_p_clk.c, "qce.0"),
1695 CLK_LOOKUP("iface_clk", ce1_p_clk.c, "qcrypto.0"),
1696 CLK_LOOKUP("core_clk", ce1_core_clk.c, "qce.0"),
1697 CLK_LOOKUP("core_clk", ce1_core_clk.c, "qcrypto.0"),
1698
Vikram Mulukutlaefd64f52012-01-09 17:41:09 -08001699 CLK_LOOKUP("q6sw_clk", q6sw_clk, NULL),
1700 CLK_LOOKUP("q6fw_clk", q6fw_clk, NULL),
1701 CLK_LOOKUP("q6_func_clk", q6_func_clk, NULL),
1702
Ramesh Masavarapufa679d92011-10-13 23:42:59 -07001703 /* TODO: Make this real when RPM's ready. */
1704 CLK_DUMMY("ebi1_msmbus_clk", ebi1_msmbus_clk.c, NULL, OFF),
1705 CLK_DUMMY("mem_clk", ebi1_adm_clk.c, "msm_dmov", OFF),
1706
Vikram Mulukutla489e39e2011-08-31 18:04:05 -07001707};
1708
1709static void set_fsm_mode(void __iomem *mode_reg)
1710{
1711 u32 regval = readl_relaxed(mode_reg);
1712
1713 /* De-assert reset to FSM */
1714 regval &= ~BIT(21);
1715 writel_relaxed(regval, mode_reg);
1716
1717 /* Program bias count */
1718 regval &= ~BM(19, 14);
Vikram Mulukutlad2314f32011-10-14 10:12:02 -07001719 regval |= BVAL(19, 14, 0x1);
Vikram Mulukutla489e39e2011-08-31 18:04:05 -07001720 writel_relaxed(regval, mode_reg);
1721
1722 /* Program lock count */
1723 regval &= ~BM(13, 8);
1724 regval |= BVAL(13, 8, 0x8);
1725 writel_relaxed(regval, mode_reg);
1726
1727 /* Enable PLL FSM voting */
1728 regval |= BIT(20);
1729 writel_relaxed(regval, mode_reg);
1730}
1731
1732/*
1733 * Miscellaneous clock register initializations
1734 */
1735static void __init reg_init(void)
1736{
Vikram Mulukutla01d06b82012-01-10 14:19:44 -08001737 u32 regval, is_pll_enabled, pll9_lval;
Vikram Mulukutla489e39e2011-08-31 18:04:05 -07001738
1739 /* Enable PDM CXO source. */
1740 regval = readl_relaxed(PDM_CLK_NS_REG);
1741 writel_relaxed(BIT(13) | regval, PDM_CLK_NS_REG);
1742
1743 /* Check if PLL0 is active */
1744 is_pll_enabled = readl_relaxed(BB_PLL0_STATUS_REG) & BIT(16);
1745
1746 if (!is_pll_enabled) {
1747 writel_relaxed(0xE, BB_PLL0_L_VAL_REG);
1748 writel_relaxed(0x3, BB_PLL0_M_VAL_REG);
1749 writel_relaxed(0x8, BB_PLL0_N_VAL_REG);
1750
1751 regval = readl_relaxed(BB_PLL0_CONFIG_REG);
1752
1753 /* Enable the main output and the MN accumulator */
1754 regval |= BIT(23) | BIT(22);
1755
1756 /* Set pre-divider and post-divider values to 1 and 1 */
1757 regval &= ~BIT(19);
1758 regval &= ~BM(21, 20);
1759
1760 /* Set VCO frequency */
1761 regval &= ~BM(17, 16);
1762
1763 writel_relaxed(regval, BB_PLL0_CONFIG_REG);
1764
1765 /* Enable AUX output */
1766 regval = readl_relaxed(BB_PLL0_TEST_CTL_REG);
1767 regval |= BIT(12);
1768 writel_relaxed(regval, BB_PLL0_TEST_CTL_REG);
1769
1770 set_fsm_mode(BB_PLL0_MODE_REG);
1771 }
1772
Vikram Mulukutla3349d932011-10-12 20:00:34 -07001773 /* Check if PLL14 is enabled in FSM mode */
1774 is_pll_enabled = readl_relaxed(BB_PLL14_STATUS_REG) & BIT(16);
1775
1776 if (!is_pll_enabled) {
1777 writel_relaxed(0x19, BB_PLL14_L_VAL_REG);
1778 writel_relaxed(0x0, BB_PLL14_M_VAL_REG);
1779 writel_relaxed(0x1, BB_PLL14_N_VAL_REG);
1780
1781 regval = readl_relaxed(BB_PLL14_CONFIG_REG);
1782
1783 /* Enable main output and the MN accumulator */
1784 regval |= BIT(23) | BIT(22);
1785
1786 /* Set pre-divider and post-divider values to 1 and 1 */
1787 regval &= ~BIT(19);
1788 regval &= ~BM(21, 20);
1789
1790 /* Set VCO frequency */
1791 regval &= ~BM(17, 16);
1792
1793 writel_relaxed(regval, BB_PLL14_CONFIG_REG);
1794
1795 set_fsm_mode(BB_PLL14_MODE_REG);
1796
1797 } else if (!(readl_relaxed(BB_PLL14_MODE_REG) & BIT(20)))
1798 WARN(1, "PLL14 enabled in non-FSM mode!\n");
1799
Vikram Mulukutla01d06b82012-01-10 14:19:44 -08001800 /* Detect PLL9 rate and fixup structure accordingly */
1801 pll9_lval = readl_relaxed(SC_PLL0_L_VAL_REG);
1802
1803 if (pll9_lval == 0x1C)
1804 pll9_acpu_clk.rate = 550000000;
1805
Vikram Mulukutla489e39e2011-08-31 18:04:05 -07001806 /* Enable PLL4 source on the LPASS Primary PLL Mux */
1807 regval = readl_relaxed(LCC_PRI_PLL_CLK_CTL_REG);
1808 writel_relaxed(regval | BIT(0), LCC_PRI_PLL_CLK_CTL_REG);
Vikram Mulukutla0ee27882011-11-15 18:25:04 -08001809
1810 /* Disable hardware clock gating on certain clocks */
1811 regval = readl_relaxed(USB_HSIC_HCLK_CTL_REG);
1812 regval &= ~BIT(6);
1813 writel_relaxed(regval, USB_HSIC_HCLK_CTL_REG);
1814
1815 regval = readl_relaxed(CE1_CORE_CLK_CTL_REG);
1816 regval &= ~BIT(6);
1817 writel_relaxed(regval, CE1_CORE_CLK_CTL_REG);
1818
1819 regval = readl_relaxed(USB_HS1_HCLK_CTL_REG);
1820 regval &= ~BIT(6);
1821 writel_relaxed(regval, USB_HS1_HCLK_CTL_REG);
Vikram Mulukutladb89d742012-01-06 15:33:46 -08001822
1823 regval = readl_relaxed(DMA_BAM_HCLK_CTL);
1824 regval &= ~BIT(6);
1825 writel_relaxed(regval, DMA_BAM_HCLK_CTL);
Vikram Mulukutla489e39e2011-08-31 18:04:05 -07001826}
1827
1828/* Local clock driver initialization. */
1829static void __init msm9615_clock_init(void)
1830{
Matt Wagantalled90b002011-12-12 21:22:43 -08001831 xo_cxo = msm_xo_get(MSM_XO_CXO, "clock-9615");
Vikram Mulukutla489e39e2011-08-31 18:04:05 -07001832 if (IS_ERR(xo_cxo)) {
1833 pr_err("%s: msm_xo_get(CXO) failed.\n", __func__);
1834 BUG();
1835 }
1836
Matt Wagantalle18bbc82011-10-06 10:07:28 -07001837 vote_vdd_level(&vdd_dig, VDD_DIG_HIGH);
Vikram Mulukutla489e39e2011-08-31 18:04:05 -07001838
1839 clk_ops_pll.enable = sr_pll_clk_enable;
1840
1841 /* Initialize clock registers. */
1842 reg_init();
1843
1844 /* Initialize rates for clocks that only support one. */
1845 clk_set_rate(&pdm_clk.c, 19200000);
1846 clk_set_rate(&prng_clk.c, 32000000);
1847 clk_set_rate(&usb_hs1_xcvr_clk.c, 60000000);
1848 clk_set_rate(&usb_hs1_sys_clk.c, 60000000);
1849 clk_set_rate(&usb_hsic_xcvr_clk.c, 60000000);
Vikram Mulukutla6c9158f2011-12-08 12:41:20 -08001850 clk_set_rate(&usb_hsic_sys_clk.c, 64000000);
1851 clk_set_rate(&usb_hsic_clk.c, 480000000);
Vikram Mulukutla489e39e2011-08-31 18:04:05 -07001852
1853 /*
1854 * The halt status bits for PDM may be incorrect at boot.
1855 * Toggle these clocks on and off to refresh them.
1856 */
1857 rcg_clk_enable(&pdm_clk.c);
1858 rcg_clk_disable(&pdm_clk.c);
1859}
1860
1861static int __init msm9615_clock_late_init(void)
1862{
Matt Wagantalle18bbc82011-10-06 10:07:28 -07001863 return unvote_vdd_level(&vdd_dig, VDD_DIG_HIGH);
Vikram Mulukutla489e39e2011-08-31 18:04:05 -07001864}
1865
1866struct clock_init_data msm9615_clock_init_data __initdata = {
1867 .table = msm_clocks_9615,
1868 .size = ARRAY_SIZE(msm_clocks_9615),
1869 .init = msm9615_clock_init,
1870 .late_init = msm9615_clock_late_init,
1871};