blob: 76219abd5114b7fa5c6d2d6cbdb0e2d720dfbe7b [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. */
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
Vikram Mulukutla31680ae2011-11-04 14:23:55 -0700252static DEFINE_SPINLOCK(soft_vote_lock);
253
254static int pll_acpu_vote_clk_enable(struct clk *clk)
255{
256 int ret = 0;
257 unsigned long flags;
258 struct pll_vote_clk *pll = to_pll_vote_clk(clk);
259
260 spin_lock_irqsave(&soft_vote_lock, flags);
261
262 if (!*pll->soft_vote)
263 ret = pll_vote_clk_enable(clk);
264 if (ret == 0)
265 *pll->soft_vote |= (pll->soft_vote_mask);
266
267 spin_unlock_irqrestore(&soft_vote_lock, flags);
268 return ret;
269}
270
271static void pll_acpu_vote_clk_disable(struct clk *clk)
272{
273 unsigned long flags;
274 struct pll_vote_clk *pll = to_pll_vote_clk(clk);
275
276 spin_lock_irqsave(&soft_vote_lock, flags);
277
278 *pll->soft_vote &= ~(pll->soft_vote_mask);
279 if (!*pll->soft_vote)
280 pll_vote_clk_disable(clk);
281
282 spin_unlock_irqrestore(&soft_vote_lock, flags);
283}
284
285static struct clk_ops clk_ops_pll_acpu_vote = {
286 .enable = pll_acpu_vote_clk_enable,
287 .disable = pll_acpu_vote_clk_disable,
288 .auto_off = pll_acpu_vote_clk_disable,
289 .is_enabled = pll_vote_clk_is_enabled,
290 .get_rate = pll_vote_clk_get_rate,
291 .get_parent = pll_vote_clk_get_parent,
292 .is_local = local_clk_is_local,
293};
294
295#define PLL_SOFT_VOTE_PRIMARY BIT(0)
296#define PLL_SOFT_VOTE_ACPU BIT(1)
297
298static unsigned int soft_vote_pll0;
299
Vikram Mulukutla489e39e2011-08-31 18:04:05 -0700300static struct pll_vote_clk pll0_clk = {
301 .rate = 276000000,
302 .en_reg = BB_PLL_ENA_SC0_REG,
303 .en_mask = BIT(0),
304 .status_reg = BB_PLL0_STATUS_REG,
305 .parent = &cxo_clk.c,
Vikram Mulukutla31680ae2011-11-04 14:23:55 -0700306 .soft_vote = &soft_vote_pll0,
307 .soft_vote_mask = PLL_SOFT_VOTE_PRIMARY,
Vikram Mulukutla489e39e2011-08-31 18:04:05 -0700308 .c = {
309 .dbg_name = "pll0_clk",
Vikram Mulukutla31680ae2011-11-04 14:23:55 -0700310 .ops = &clk_ops_pll_acpu_vote,
Vikram Mulukutla489e39e2011-08-31 18:04:05 -0700311 CLK_INIT(pll0_clk.c),
312 },
313};
314
Vikram Mulukutla31680ae2011-11-04 14:23:55 -0700315static struct pll_vote_clk pll0_acpu_clk = {
316 .rate = 276000000,
317 .en_reg = BB_PLL_ENA_SC0_REG,
318 .en_mask = BIT(0),
319 .status_reg = BB_PLL0_STATUS_REG,
320 .soft_vote = &soft_vote_pll0,
321 .soft_vote_mask = PLL_SOFT_VOTE_ACPU,
322 .c = {
323 .dbg_name = "pll0_acpu_clk",
324 .ops = &clk_ops_pll_acpu_vote,
325 CLK_INIT(pll0_acpu_clk.c),
326 },
327};
328
Vikram Mulukutla489e39e2011-08-31 18:04:05 -0700329static struct pll_vote_clk pll4_clk = {
330 .rate = 393216000,
331 .en_reg = BB_PLL_ENA_SC0_REG,
332 .en_mask = BIT(4),
333 .status_reg = LCC_PLL0_STATUS_REG,
334 .parent = &cxo_clk.c,
335 .c = {
336 .dbg_name = "pll4_clk",
337 .ops = &clk_ops_pll_vote,
338 CLK_INIT(pll4_clk.c),
339 },
340};
341
Vikram Mulukutla31680ae2011-11-04 14:23:55 -0700342static unsigned int soft_vote_pll8;
343
Vikram Mulukutla489e39e2011-08-31 18:04:05 -0700344static struct pll_vote_clk pll8_clk = {
345 .rate = 384000000,
346 .en_reg = BB_PLL_ENA_SC0_REG,
347 .en_mask = BIT(8),
348 .status_reg = BB_PLL8_STATUS_REG,
349 .parent = &cxo_clk.c,
Vikram Mulukutla31680ae2011-11-04 14:23:55 -0700350 .soft_vote = &soft_vote_pll8,
351 .soft_vote_mask = PLL_SOFT_VOTE_PRIMARY,
Vikram Mulukutla489e39e2011-08-31 18:04:05 -0700352 .c = {
353 .dbg_name = "pll8_clk",
Vikram Mulukutla31680ae2011-11-04 14:23:55 -0700354 .ops = &clk_ops_pll_acpu_vote,
Vikram Mulukutla489e39e2011-08-31 18:04:05 -0700355 CLK_INIT(pll8_clk.c),
356 },
357};
358
Vikram Mulukutla31680ae2011-11-04 14:23:55 -0700359static struct pll_vote_clk pll8_acpu_clk = {
360 .rate = 384000000,
361 .en_reg = BB_PLL_ENA_SC0_REG,
362 .en_mask = BIT(8),
363 .status_reg = BB_PLL8_STATUS_REG,
364 .soft_vote = &soft_vote_pll8,
365 .soft_vote_mask = PLL_SOFT_VOTE_ACPU,
366 .c = {
367 .dbg_name = "pll8_acpu_clk",
368 .ops = &clk_ops_pll_acpu_vote,
369 CLK_INIT(pll8_acpu_clk.c),
370 },
371};
372
373static unsigned int soft_vote_pll9;
374
Vikram Mulukutla489e39e2011-08-31 18:04:05 -0700375static struct pll_vote_clk pll9_clk = {
376 .rate = 440000000,
377 .en_reg = BB_PLL_ENA_SC0_REG,
378 .en_mask = BIT(9),
379 .status_reg = SC_PLL0_STATUS_REG,
380 .parent = &cxo_clk.c,
Vikram Mulukutla31680ae2011-11-04 14:23:55 -0700381 .soft_vote = &soft_vote_pll9,
382 .soft_vote_mask = PLL_SOFT_VOTE_PRIMARY,
Vikram Mulukutla489e39e2011-08-31 18:04:05 -0700383 .c = {
384 .dbg_name = "pll9_clk",
Vikram Mulukutla31680ae2011-11-04 14:23:55 -0700385 .ops = &clk_ops_pll_acpu_vote,
Vikram Mulukutla489e39e2011-08-31 18:04:05 -0700386 CLK_INIT(pll9_clk.c),
387 },
388};
389
Vikram Mulukutla31680ae2011-11-04 14:23:55 -0700390static struct pll_vote_clk pll9_acpu_clk = {
391 .rate = 440000000,
392 .en_reg = BB_PLL_ENA_SC0_REG,
393 .en_mask = BIT(9),
394 .soft_vote = &soft_vote_pll9,
395 .soft_vote_mask = PLL_SOFT_VOTE_ACPU,
396 .status_reg = SC_PLL0_STATUS_REG,
397 .c = {
398 .dbg_name = "pll9_acpu_clk",
399 .ops = &clk_ops_pll_acpu_vote,
400 CLK_INIT(pll9_acpu_clk.c),
401 },
402};
403
Vikram Mulukutla489e39e2011-08-31 18:04:05 -0700404static struct pll_vote_clk pll14_clk = {
405 .rate = 480000000,
406 .en_reg = BB_PLL_ENA_SC0_REG,
407 .en_mask = BIT(11),
408 .status_reg = BB_PLL14_STATUS_REG,
409 .parent = &cxo_clk.c,
410 .c = {
411 .dbg_name = "pll14_clk",
412 .ops = &clk_ops_pll_vote,
413 CLK_INIT(pll14_clk.c),
414 },
415};
416
Vikram Mulukutla489e39e2011-08-31 18:04:05 -0700417static struct clk_ops clk_ops_rcg_9615 = {
418 .enable = rcg_clk_enable,
419 .disable = rcg_clk_disable,
Matt Wagantall41af0772011-09-17 12:21:39 -0700420 .auto_off = rcg_clk_disable,
Vikram Mulukutla489e39e2011-08-31 18:04:05 -0700421 .set_rate = rcg_clk_set_rate,
Vikram Mulukutla489e39e2011-08-31 18:04:05 -0700422 .get_rate = rcg_clk_get_rate,
423 .list_rate = rcg_clk_list_rate,
424 .is_enabled = rcg_clk_is_enabled,
425 .round_rate = rcg_clk_round_rate,
Stephen Boyd7bf28142011-12-07 00:30:52 -0800426 .reset = rcg_clk_reset,
Vikram Mulukutla489e39e2011-08-31 18:04:05 -0700427 .is_local = local_clk_is_local,
428 .get_parent = rcg_clk_get_parent,
429};
430
431static struct clk_ops clk_ops_branch = {
432 .enable = branch_clk_enable,
433 .disable = branch_clk_disable,
Matt Wagantall41af0772011-09-17 12:21:39 -0700434 .auto_off = branch_clk_disable,
Vikram Mulukutla489e39e2011-08-31 18:04:05 -0700435 .is_enabled = branch_clk_is_enabled,
436 .reset = branch_clk_reset,
437 .is_local = local_clk_is_local,
438 .get_parent = branch_clk_get_parent,
439 .set_parent = branch_clk_set_parent,
440};
441
442/*
443 * Peripheral Clocks
444 */
Matt Wagantall7625a4c2011-11-01 16:17:53 -0700445#define CLK_GP(i, n, h_r, h_b) \
446 struct rcg_clk i##_clk = { \
447 .b = { \
448 .ctl_reg = GPn_NS_REG(n), \
449 .en_mask = BIT(9), \
450 .halt_reg = h_r, \
451 .halt_bit = h_b, \
452 }, \
453 .ns_reg = GPn_NS_REG(n), \
454 .md_reg = GPn_MD_REG(n), \
455 .root_en_mask = BIT(11), \
456 .ns_mask = (BM(23, 16) | BM(6, 0)), \
457 .set_rate = set_rate_mnd, \
458 .freq_tbl = clk_tbl_gp, \
459 .current_freq = &rcg_dummy_freq, \
460 .c = { \
461 .dbg_name = #i "_clk", \
462 .ops = &clk_ops_rcg_9615, \
463 VDD_DIG_FMAX_MAP1(LOW, 27000000), \
464 CLK_INIT(i##_clk.c), \
465 }, \
466 }
467#define F_GP(f, s, d, m, n) \
468 { \
469 .freq_hz = f, \
470 .src_clk = &s##_clk.c, \
471 .md_val = MD8(16, m, 0, n), \
472 .ns_val = NS(23, 16, n, m, 5, 4, 3, d, 2, 0, s##_to_bb_mux), \
473 .mnd_en_mask = BIT(8) * !!(n), \
474 }
475static struct clk_freq_tbl clk_tbl_gp[] = {
476 F_GP( 0, gnd, 1, 0, 0),
477 F_GP( 9600000, cxo, 2, 0, 0),
478 F_GP( 19200000, cxo, 1, 0, 0),
479 F_END
480};
481
482static CLK_GP(gp0, 0, CLK_HALT_SFPB_MISC_STATE_REG, 7);
483static CLK_GP(gp1, 1, CLK_HALT_SFPB_MISC_STATE_REG, 6);
484static CLK_GP(gp2, 2, CLK_HALT_SFPB_MISC_STATE_REG, 5);
485
Vikram Mulukutla489e39e2011-08-31 18:04:05 -0700486#define CLK_GSBI_UART(i, n, h_r, h_b) \
487 struct rcg_clk i##_clk = { \
488 .b = { \
489 .ctl_reg = GSBIn_UART_APPS_NS_REG(n), \
490 .en_mask = BIT(9), \
491 .reset_reg = GSBIn_RESET_REG(n), \
492 .reset_mask = BIT(0), \
493 .halt_reg = h_r, \
494 .halt_bit = h_b, \
495 }, \
496 .ns_reg = GSBIn_UART_APPS_NS_REG(n), \
497 .md_reg = GSBIn_UART_APPS_MD_REG(n), \
498 .root_en_mask = BIT(11), \
499 .ns_mask = (BM(31, 16) | BM(6, 0)), \
500 .set_rate = set_rate_mnd, \
501 .freq_tbl = clk_tbl_gsbi_uart, \
502 .current_freq = &rcg_dummy_freq, \
503 .c = { \
504 .dbg_name = #i "_clk", \
505 .ops = &clk_ops_rcg_9615, \
Matt Wagantalle18bbc82011-10-06 10:07:28 -0700506 VDD_DIG_FMAX_MAP2(LOW, 32000000, NOMINAL, 64000000), \
Vikram Mulukutla489e39e2011-08-31 18:04:05 -0700507 CLK_INIT(i##_clk.c), \
508 }, \
509 }
Matt Wagantalle18bbc82011-10-06 10:07:28 -0700510#define F_GSBI_UART(f, s, d, m, n) \
Vikram Mulukutla489e39e2011-08-31 18:04:05 -0700511 { \
512 .freq_hz = f, \
513 .src_clk = &s##_clk.c, \
514 .md_val = MD16(m, n), \
515 .ns_val = NS(31, 16, n, m, 5, 4, 3, d, 2, 0, s##_to_bb_mux), \
516 .mnd_en_mask = BIT(8) * !!(n), \
Vikram Mulukutla489e39e2011-08-31 18:04:05 -0700517 }
518static struct clk_freq_tbl clk_tbl_gsbi_uart[] = {
Matt Wagantalle18bbc82011-10-06 10:07:28 -0700519 F_GSBI_UART( 0, gnd, 1, 0, 0),
520 F_GSBI_UART( 3686400, pll8, 1, 6, 625),
521 F_GSBI_UART( 7372800, pll8, 1, 12, 625),
522 F_GSBI_UART(14745600, pll8, 1, 24, 625),
523 F_GSBI_UART(16000000, pll8, 4, 1, 6),
524 F_GSBI_UART(24000000, pll8, 4, 1, 4),
525 F_GSBI_UART(32000000, pll8, 4, 1, 3),
526 F_GSBI_UART(40000000, pll8, 1, 5, 48),
527 F_GSBI_UART(46400000, pll8, 1, 29, 240),
528 F_GSBI_UART(48000000, pll8, 4, 1, 2),
529 F_GSBI_UART(51200000, pll8, 1, 2, 15),
530 F_GSBI_UART(56000000, pll8, 1, 7, 48),
531 F_GSBI_UART(58982400, pll8, 1, 96, 625),
532 F_GSBI_UART(64000000, pll8, 2, 1, 3),
Vikram Mulukutla489e39e2011-08-31 18:04:05 -0700533 F_END
534};
535
536static CLK_GSBI_UART(gsbi1_uart, 1, CLK_HALT_CFPB_STATEA_REG, 10);
537static CLK_GSBI_UART(gsbi2_uart, 2, CLK_HALT_CFPB_STATEA_REG, 6);
538static CLK_GSBI_UART(gsbi3_uart, 3, CLK_HALT_CFPB_STATEA_REG, 2);
539static CLK_GSBI_UART(gsbi4_uart, 4, CLK_HALT_CFPB_STATEB_REG, 26);
540static CLK_GSBI_UART(gsbi5_uart, 5, CLK_HALT_CFPB_STATEB_REG, 22);
541
542#define CLK_GSBI_QUP(i, n, h_r, h_b) \
543 struct rcg_clk i##_clk = { \
544 .b = { \
545 .ctl_reg = GSBIn_QUP_APPS_NS_REG(n), \
546 .en_mask = BIT(9), \
547 .reset_reg = GSBIn_RESET_REG(n), \
548 .reset_mask = BIT(0), \
549 .halt_reg = h_r, \
550 .halt_bit = h_b, \
551 }, \
552 .ns_reg = GSBIn_QUP_APPS_NS_REG(n), \
553 .md_reg = GSBIn_QUP_APPS_MD_REG(n), \
554 .root_en_mask = BIT(11), \
555 .ns_mask = (BM(23, 16) | BM(6, 0)), \
556 .set_rate = set_rate_mnd, \
557 .freq_tbl = clk_tbl_gsbi_qup, \
558 .current_freq = &rcg_dummy_freq, \
559 .c = { \
560 .dbg_name = #i "_clk", \
561 .ops = &clk_ops_rcg_9615, \
Matt Wagantalle18bbc82011-10-06 10:07:28 -0700562 VDD_DIG_FMAX_MAP2(LOW, 24000000, NOMINAL, 52000000), \
Vikram Mulukutla489e39e2011-08-31 18:04:05 -0700563 CLK_INIT(i##_clk.c), \
564 }, \
565 }
Matt Wagantalle18bbc82011-10-06 10:07:28 -0700566#define F_GSBI_QUP(f, s, d, m, n) \
Vikram Mulukutla489e39e2011-08-31 18:04:05 -0700567 { \
568 .freq_hz = f, \
569 .src_clk = &s##_clk.c, \
570 .md_val = MD8(16, m, 0, n), \
571 .ns_val = NS(23, 16, n, m, 5, 4, 3, d, 2, 0, s##_to_bb_mux), \
572 .mnd_en_mask = BIT(8) * !!(n), \
Vikram Mulukutla489e39e2011-08-31 18:04:05 -0700573 }
574static struct clk_freq_tbl clk_tbl_gsbi_qup[] = {
Matt Wagantalle18bbc82011-10-06 10:07:28 -0700575 F_GSBI_QUP( 0, gnd, 1, 0, 0),
576 F_GSBI_QUP( 960000, cxo, 4, 1, 5),
577 F_GSBI_QUP( 4800000, cxo, 4, 0, 1),
578 F_GSBI_QUP( 9600000, cxo, 2, 0, 1),
579 F_GSBI_QUP(15058800, pll8, 1, 2, 51),
580 F_GSBI_QUP(24000000, pll8, 4, 1, 4),
581 F_GSBI_QUP(25600000, pll8, 1, 1, 15),
582 F_GSBI_QUP(48000000, pll8, 4, 1, 2),
583 F_GSBI_QUP(51200000, pll8, 1, 2, 15),
Vikram Mulukutla489e39e2011-08-31 18:04:05 -0700584 F_END
585};
586
587static CLK_GSBI_QUP(gsbi1_qup, 1, CLK_HALT_CFPB_STATEA_REG, 9);
588static CLK_GSBI_QUP(gsbi2_qup, 2, CLK_HALT_CFPB_STATEA_REG, 4);
589static CLK_GSBI_QUP(gsbi3_qup, 3, CLK_HALT_CFPB_STATEA_REG, 0);
590static CLK_GSBI_QUP(gsbi4_qup, 4, CLK_HALT_CFPB_STATEB_REG, 24);
591static CLK_GSBI_QUP(gsbi5_qup, 5, CLK_HALT_CFPB_STATEB_REG, 20);
592
Matt Wagantalle18bbc82011-10-06 10:07:28 -0700593#define F_PDM(f, s, d) \
Vikram Mulukutla489e39e2011-08-31 18:04:05 -0700594 { \
595 .freq_hz = f, \
596 .src_clk = &s##_clk.c, \
597 .ns_val = NS_SRC_SEL(1, 0, s##_to_xo_mux), \
Vikram Mulukutla489e39e2011-08-31 18:04:05 -0700598 }
599static struct clk_freq_tbl clk_tbl_pdm[] = {
Matt Wagantalle18bbc82011-10-06 10:07:28 -0700600 F_PDM( 0, gnd, 1),
601 F_PDM(19200000, cxo, 1),
Vikram Mulukutla489e39e2011-08-31 18:04:05 -0700602 F_END
603};
604
605static struct rcg_clk pdm_clk = {
606 .b = {
607 .ctl_reg = PDM_CLK_NS_REG,
608 .en_mask = BIT(9),
609 .reset_reg = PDM_CLK_NS_REG,
610 .reset_mask = BIT(12),
611 .halt_reg = CLK_HALT_CFPB_STATEC_REG,
612 .halt_bit = 3,
613 },
614 .ns_reg = PDM_CLK_NS_REG,
615 .root_en_mask = BIT(11),
616 .ns_mask = BM(1, 0),
617 .set_rate = set_rate_nop,
618 .freq_tbl = clk_tbl_pdm,
619 .current_freq = &rcg_dummy_freq,
620 .c = {
621 .dbg_name = "pdm_clk",
622 .ops = &clk_ops_rcg_9615,
Matt Wagantalle18bbc82011-10-06 10:07:28 -0700623 VDD_DIG_FMAX_MAP1(LOW, 19200000),
Vikram Mulukutla489e39e2011-08-31 18:04:05 -0700624 CLK_INIT(pdm_clk.c),
625 },
626};
627
628static struct branch_clk pmem_clk = {
629 .b = {
630 .ctl_reg = PMEM_ACLK_CTL_REG,
631 .en_mask = BIT(4),
632 .halt_reg = CLK_HALT_DFAB_STATE_REG,
633 .halt_bit = 20,
634 },
635 .c = {
636 .dbg_name = "pmem_clk",
637 .ops = &clk_ops_branch,
638 CLK_INIT(pmem_clk.c),
639 },
640};
641
Matt Wagantalle18bbc82011-10-06 10:07:28 -0700642#define F_PRNG(f, s) \
Vikram Mulukutla489e39e2011-08-31 18:04:05 -0700643 { \
644 .freq_hz = f, \
645 .src_clk = &s##_clk.c, \
Vikram Mulukutla489e39e2011-08-31 18:04:05 -0700646 }
647static struct clk_freq_tbl clk_tbl_prng[] = {
Matt Wagantalle18bbc82011-10-06 10:07:28 -0700648 F_PRNG(32000000, pll8),
Vikram Mulukutla489e39e2011-08-31 18:04:05 -0700649 F_END
650};
651
652static struct rcg_clk prng_clk = {
653 .b = {
654 .ctl_reg = SC0_U_CLK_BRANCH_ENA_VOTE_REG,
655 .en_mask = BIT(10),
656 .halt_reg = CLK_HALT_SFPB_MISC_STATE_REG,
657 .halt_check = HALT_VOTED,
658 .halt_bit = 10,
659 },
660 .set_rate = set_rate_nop,
661 .freq_tbl = clk_tbl_prng,
662 .current_freq = &rcg_dummy_freq,
663 .c = {
664 .dbg_name = "prng_clk",
665 .ops = &clk_ops_rcg_9615,
Matt Wagantalle18bbc82011-10-06 10:07:28 -0700666 VDD_DIG_FMAX_MAP2(LOW, 32000000, NOMINAL, 65000000),
Vikram Mulukutla489e39e2011-08-31 18:04:05 -0700667 CLK_INIT(prng_clk.c),
668 },
669};
670
671#define CLK_SDC(name, n, h_b, f_table) \
672 struct rcg_clk name = { \
673 .b = { \
674 .ctl_reg = SDCn_APPS_CLK_NS_REG(n), \
675 .en_mask = BIT(9), \
676 .reset_reg = SDCn_RESET_REG(n), \
677 .reset_mask = BIT(0), \
678 .halt_reg = CLK_HALT_DFAB_STATE_REG, \
679 .halt_bit = h_b, \
680 }, \
681 .ns_reg = SDCn_APPS_CLK_NS_REG(n), \
682 .md_reg = SDCn_APPS_CLK_MD_REG(n), \
683 .root_en_mask = BIT(11), \
684 .ns_mask = (BM(23, 16) | BM(6, 0)), \
685 .set_rate = set_rate_mnd, \
686 .freq_tbl = f_table, \
687 .current_freq = &rcg_dummy_freq, \
688 .c = { \
689 .dbg_name = #name, \
690 .ops = &clk_ops_rcg_9615, \
Matt Wagantalle18bbc82011-10-06 10:07:28 -0700691 VDD_DIG_FMAX_MAP2(LOW, 25000000, NOMINAL, 50000000), \
Vikram Mulukutla489e39e2011-08-31 18:04:05 -0700692 CLK_INIT(name.c), \
693 }, \
694 }
Matt Wagantalle18bbc82011-10-06 10:07:28 -0700695#define F_SDC(f, s, d, m, n) \
Vikram Mulukutla489e39e2011-08-31 18:04:05 -0700696 { \
697 .freq_hz = f, \
698 .src_clk = &s##_clk.c, \
699 .md_val = MD8(16, m, 0, n), \
700 .ns_val = NS(23, 16, n, m, 5, 4, 3, d, 2, 0, s##_to_bb_mux), \
701 .mnd_en_mask = BIT(8) * !!(n), \
Vikram Mulukutla489e39e2011-08-31 18:04:05 -0700702 }
703static struct clk_freq_tbl clk_tbl_sdc1_2[] = {
Matt Wagantalle18bbc82011-10-06 10:07:28 -0700704 F_SDC( 0, gnd, 1, 0, 0),
705 F_SDC( 144300, cxo, 1, 1, 133),
706 F_SDC( 400000, pll8, 4, 1, 240),
707 F_SDC( 16000000, pll8, 4, 1, 6),
708 F_SDC( 17070000, pll8, 1, 2, 45),
709 F_SDC( 20210000, pll8, 1, 1, 19),
710 F_SDC( 24000000, pll8, 4, 1, 4),
711 F_SDC( 48000000, pll8, 4, 1, 2),
Vikram Mulukutla489e39e2011-08-31 18:04:05 -0700712 F_END
713};
714
715static CLK_SDC(sdc1_clk, 1, 6, clk_tbl_sdc1_2);
716static CLK_SDC(sdc2_clk, 2, 5, clk_tbl_sdc1_2);
717
Matt Wagantalle18bbc82011-10-06 10:07:28 -0700718#define F_USB(f, s, d, m, n) \
Vikram Mulukutla489e39e2011-08-31 18:04:05 -0700719 { \
720 .freq_hz = f, \
721 .src_clk = &s##_clk.c, \
722 .md_val = MD8(16, m, 0, n), \
723 .ns_val = NS(23, 16, n, m, 5, 4, 3, d, 2, 0, s##_to_bb_mux), \
724 .mnd_en_mask = BIT(8) * !!(n), \
Vikram Mulukutla489e39e2011-08-31 18:04:05 -0700725 }
726static struct clk_freq_tbl clk_tbl_usb[] = {
Matt Wagantalle18bbc82011-10-06 10:07:28 -0700727 F_USB( 0, gnd, 1, 0, 0),
728 F_USB(60000000, pll8, 1, 5, 32),
Vikram Mulukutla489e39e2011-08-31 18:04:05 -0700729 F_END
730};
731
Vikram Mulukutla6c9158f2011-12-08 12:41:20 -0800732static struct clk_freq_tbl clk_tbl_usb_hsic_sys[] = {
733 F_USB( 0, gnd, 1, 0, 0),
734 F_USB(64000000, pll8, 1, 1, 6),
735 F_END
736};
737
Vikram Mulukutla489e39e2011-08-31 18:04:05 -0700738static struct rcg_clk usb_hs1_xcvr_clk = {
739 .b = {
740 .ctl_reg = USB_HS1_XCVR_FS_CLK_NS_REG,
741 .en_mask = BIT(9),
742 .reset_reg = USB_HS1_RESET_REG,
743 .reset_mask = BIT(0),
744 .halt_reg = CLK_HALT_DFAB_STATE_REG,
745 .halt_bit = 0,
746 },
747 .ns_reg = USB_HS1_XCVR_FS_CLK_NS_REG,
748 .md_reg = USB_HS1_XCVR_FS_CLK_MD_REG,
749 .root_en_mask = BIT(11),
750 .ns_mask = (BM(23, 16) | BM(6, 0)),
751 .set_rate = set_rate_mnd,
752 .freq_tbl = clk_tbl_usb,
753 .current_freq = &rcg_dummy_freq,
754 .c = {
755 .dbg_name = "usb_hs1_xcvr_clk",
756 .ops = &clk_ops_rcg_9615,
Matt Wagantalle18bbc82011-10-06 10:07:28 -0700757 VDD_DIG_FMAX_MAP1(NOMINAL, 60000000),
Vikram Mulukutla489e39e2011-08-31 18:04:05 -0700758 CLK_INIT(usb_hs1_xcvr_clk.c),
759 },
760};
761
762static struct rcg_clk usb_hs1_sys_clk = {
763 .b = {
764 .ctl_reg = USB_HS1_SYS_CLK_NS_REG,
765 .en_mask = BIT(9),
766 .reset_reg = USB_HS1_RESET_REG,
767 .reset_mask = BIT(0),
768 .halt_reg = CLK_HALT_DFAB_STATE_REG,
769 .halt_bit = 4,
770 },
771 .ns_reg = USB_HS1_SYS_CLK_NS_REG,
772 .md_reg = USB_HS1_SYS_CLK_MD_REG,
773 .root_en_mask = BIT(11),
774 .ns_mask = (BM(23, 16) | BM(6, 0)),
775 .set_rate = set_rate_mnd,
776 .freq_tbl = clk_tbl_usb,
777 .current_freq = &rcg_dummy_freq,
778 .c = {
779 .dbg_name = "usb_hs1_sys_clk",
780 .ops = &clk_ops_rcg_9615,
Matt Wagantalle18bbc82011-10-06 10:07:28 -0700781 VDD_DIG_FMAX_MAP1(NOMINAL, 60000000),
Vikram Mulukutla489e39e2011-08-31 18:04:05 -0700782 CLK_INIT(usb_hs1_sys_clk.c),
783 },
784};
785
786static struct rcg_clk usb_hsic_xcvr_clk = {
787 .b = {
788 .ctl_reg = USB_HSIC_XCVR_FS_CLK_NS_REG,
789 .en_mask = BIT(9),
790 .reset_reg = USB_HSIC_RESET_REG,
791 .reset_mask = BIT(0),
792 .halt_reg = CLK_HALT_DFAB_STATE_REG,
793 .halt_bit = 9,
794 },
795 .ns_reg = USB_HSIC_XCVR_FS_CLK_NS_REG,
796 .md_reg = USB_HSIC_XCVR_FS_CLK_MD_REG,
797 .root_en_mask = BIT(11),
798 .ns_mask = (BM(23, 16) | BM(6, 0)),
799 .set_rate = set_rate_mnd,
800 .freq_tbl = clk_tbl_usb,
801 .current_freq = &rcg_dummy_freq,
802 .c = {
803 .dbg_name = "usb_hsic_xcvr_clk",
804 .ops = &clk_ops_rcg_9615,
Vikram Mulukutla6c9158f2011-12-08 12:41:20 -0800805 VDD_DIG_FMAX_MAP1(LOW, 60000000),
Vikram Mulukutla489e39e2011-08-31 18:04:05 -0700806 CLK_INIT(usb_hsic_xcvr_clk.c),
807 },
808};
809
810static struct rcg_clk usb_hsic_sys_clk = {
811 .b = {
812 .ctl_reg = USB_HSIC_SYSTEM_CLK_NS_REG,
813 .en_mask = BIT(9),
814 .reset_reg = USB_HSIC_RESET_REG,
815 .reset_mask = BIT(0),
816 .halt_reg = CLK_HALT_DFAB_STATE_REG,
817 .halt_bit = 7,
818 },
819 .ns_reg = USB_HSIC_SYSTEM_CLK_NS_REG,
820 .md_reg = USB_HSIC_SYSTEM_CLK_MD_REG,
821 .root_en_mask = BIT(11),
822 .ns_mask = (BM(23, 16) | BM(6, 0)),
823 .set_rate = set_rate_mnd,
Vikram Mulukutla6c9158f2011-12-08 12:41:20 -0800824 .freq_tbl = clk_tbl_usb_hsic_sys,
Vikram Mulukutla489e39e2011-08-31 18:04:05 -0700825 .current_freq = &rcg_dummy_freq,
826 .c = {
827 .dbg_name = "usb_hsic_sys_clk",
828 .ops = &clk_ops_rcg_9615,
Vikram Mulukutla6c9158f2011-12-08 12:41:20 -0800829 VDD_DIG_FMAX_MAP1(LOW, 64000000),
Vikram Mulukutla489e39e2011-08-31 18:04:05 -0700830 CLK_INIT(usb_hsic_sys_clk.c),
831 },
832};
833
834static struct clk_freq_tbl clk_tbl_usb_hsic[] = {
Matt Wagantalle18bbc82011-10-06 10:07:28 -0700835 F_USB( 0, gnd, 1, 0, 0),
Vikram Mulukutla6c9158f2011-12-08 12:41:20 -0800836 F_USB(480000000, pll14, 1, 0, 0),
Vikram Mulukutla489e39e2011-08-31 18:04:05 -0700837 F_END
838};
839
840static struct rcg_clk usb_hsic_clk = {
841 .b = {
842 .ctl_reg = USB_HSIC_CLK_NS_REG,
843 .en_mask = BIT(9),
844 .reset_reg = USB_HSIC_RESET_REG,
845 .reset_mask = BIT(0),
Vikram Mulukutla6c9158f2011-12-08 12:41:20 -0800846 .halt_check = DELAY,
Vikram Mulukutla489e39e2011-08-31 18:04:05 -0700847 },
848 .ns_reg = USB_HSIC_CLK_NS_REG,
849 .md_reg = USB_HSIC_CLK_MD_REG,
850 .root_en_mask = BIT(11),
851 .ns_mask = (BM(23, 16) | BM(6, 0)),
852 .set_rate = set_rate_mnd,
853 .freq_tbl = clk_tbl_usb_hsic,
854 .current_freq = &rcg_dummy_freq,
855 .c = {
856 .dbg_name = "usb_hsic_clk",
857 .ops = &clk_ops_rcg_9615,
Vikram Mulukutla6c9158f2011-12-08 12:41:20 -0800858 VDD_DIG_FMAX_MAP1(LOW, 480000000),
Vikram Mulukutla489e39e2011-08-31 18:04:05 -0700859 CLK_INIT(usb_hsic_clk.c),
860 },
861};
862
863static struct branch_clk usb_hsic_hsio_cal_clk = {
864 .b = {
865 .ctl_reg = USB_HSIC_HSIO_CAL_CLK_CTL_REG,
866 .en_mask = BIT(0),
867 .halt_reg = CLK_HALT_DFAB_STATE_REG,
868 .halt_bit = 8,
869 },
870 .parent = &cxo_clk.c,
871 .c = {
872 .dbg_name = "usb_hsic_hsio_cal_clk",
873 .ops = &clk_ops_branch,
874 CLK_INIT(usb_hsic_hsio_cal_clk.c),
875 },
876};
877
878/* Fast Peripheral Bus Clocks */
879static struct branch_clk ce1_core_clk = {
880 .b = {
881 .ctl_reg = CE1_CORE_CLK_CTL_REG,
882 .en_mask = BIT(4),
883 .halt_reg = CLK_HALT_CFPB_STATEC_REG,
884 .halt_bit = 27,
885 },
886 .c = {
887 .dbg_name = "ce1_core_clk",
888 .ops = &clk_ops_branch,
889 CLK_INIT(ce1_core_clk.c),
890 },
891};
892static struct branch_clk ce1_p_clk = {
893 .b = {
894 .ctl_reg = CE1_HCLK_CTL_REG,
895 .en_mask = BIT(4),
896 .halt_reg = CLK_HALT_CFPB_STATEC_REG,
897 .halt_bit = 1,
898 },
899 .c = {
900 .dbg_name = "ce1_p_clk",
901 .ops = &clk_ops_branch,
902 CLK_INIT(ce1_p_clk.c),
903 },
904};
905
906static struct branch_clk dma_bam_p_clk = {
907 .b = {
908 .ctl_reg = DMA_BAM_HCLK_CTL,
909 .en_mask = BIT(4),
910 .halt_reg = CLK_HALT_DFAB_STATE_REG,
911 .halt_bit = 12,
912 },
913 .c = {
914 .dbg_name = "dma_bam_p_clk",
915 .ops = &clk_ops_branch,
916 CLK_INIT(dma_bam_p_clk.c),
917 },
918};
919
920static struct branch_clk gsbi1_p_clk = {
921 .b = {
922 .ctl_reg = GSBIn_HCLK_CTL_REG(1),
923 .en_mask = BIT(4),
924 .halt_reg = CLK_HALT_CFPB_STATEA_REG,
925 .halt_bit = 11,
926 },
927 .c = {
928 .dbg_name = "gsbi1_p_clk",
929 .ops = &clk_ops_branch,
930 CLK_INIT(gsbi1_p_clk.c),
931 },
932};
933
934static struct branch_clk gsbi2_p_clk = {
935 .b = {
936 .ctl_reg = GSBIn_HCLK_CTL_REG(2),
937 .en_mask = BIT(4),
938 .halt_reg = CLK_HALT_CFPB_STATEA_REG,
939 .halt_bit = 7,
940 },
941 .c = {
942 .dbg_name = "gsbi2_p_clk",
943 .ops = &clk_ops_branch,
944 CLK_INIT(gsbi2_p_clk.c),
945 },
946};
947
948static struct branch_clk gsbi3_p_clk = {
949 .b = {
950 .ctl_reg = GSBIn_HCLK_CTL_REG(3),
951 .en_mask = BIT(4),
952 .halt_reg = CLK_HALT_CFPB_STATEA_REG,
953 .halt_bit = 3,
954 },
955 .c = {
956 .dbg_name = "gsbi3_p_clk",
957 .ops = &clk_ops_branch,
958 CLK_INIT(gsbi3_p_clk.c),
959 },
960};
961
962static struct branch_clk gsbi4_p_clk = {
963 .b = {
964 .ctl_reg = GSBIn_HCLK_CTL_REG(4),
965 .en_mask = BIT(4),
966 .halt_reg = CLK_HALT_CFPB_STATEB_REG,
967 .halt_bit = 27,
968 },
969 .c = {
970 .dbg_name = "gsbi4_p_clk",
971 .ops = &clk_ops_branch,
972 CLK_INIT(gsbi4_p_clk.c),
973 },
974};
975
976static struct branch_clk gsbi5_p_clk = {
977 .b = {
978 .ctl_reg = GSBIn_HCLK_CTL_REG(5),
979 .en_mask = BIT(4),
980 .halt_reg = CLK_HALT_CFPB_STATEB_REG,
981 .halt_bit = 23,
982 },
983 .c = {
984 .dbg_name = "gsbi5_p_clk",
985 .ops = &clk_ops_branch,
986 CLK_INIT(gsbi5_p_clk.c),
987 },
988};
989
990static struct branch_clk usb_hs1_p_clk = {
991 .b = {
992 .ctl_reg = USB_HS1_HCLK_CTL_REG,
993 .en_mask = BIT(4),
994 .halt_reg = CLK_HALT_DFAB_STATE_REG,
995 .halt_bit = 1,
996 },
997 .c = {
998 .dbg_name = "usb_hs1_p_clk",
999 .ops = &clk_ops_branch,
1000 CLK_INIT(usb_hs1_p_clk.c),
1001 },
1002};
1003
1004static struct branch_clk usb_hsic_p_clk = {
1005 .b = {
1006 .ctl_reg = USB_HSIC_HCLK_CTL_REG,
1007 .en_mask = BIT(4),
1008 .halt_reg = CLK_HALT_DFAB_STATE_REG,
1009 .halt_bit = 3,
1010 },
1011 .c = {
1012 .dbg_name = "usb_hsic_p_clk",
1013 .ops = &clk_ops_branch,
1014 CLK_INIT(usb_hsic_p_clk.c),
1015 },
1016};
1017
1018static struct branch_clk sdc1_p_clk = {
1019 .b = {
1020 .ctl_reg = SDCn_HCLK_CTL_REG(1),
1021 .en_mask = BIT(4),
1022 .halt_reg = CLK_HALT_DFAB_STATE_REG,
1023 .halt_bit = 11,
1024 },
1025 .c = {
1026 .dbg_name = "sdc1_p_clk",
1027 .ops = &clk_ops_branch,
1028 CLK_INIT(sdc1_p_clk.c),
1029 },
1030};
1031
1032static struct branch_clk sdc2_p_clk = {
1033 .b = {
1034 .ctl_reg = SDCn_HCLK_CTL_REG(2),
1035 .en_mask = BIT(4),
1036 .halt_reg = CLK_HALT_DFAB_STATE_REG,
1037 .halt_bit = 10,
1038 },
1039 .c = {
1040 .dbg_name = "sdc2_p_clk",
1041 .ops = &clk_ops_branch,
1042 CLK_INIT(sdc2_p_clk.c),
1043 },
1044};
1045
1046/* HW-Voteable Clocks */
1047static struct branch_clk adm0_clk = {
1048 .b = {
1049 .ctl_reg = SC0_U_CLK_BRANCH_ENA_VOTE_REG,
1050 .en_mask = BIT(2),
1051 .halt_reg = CLK_HALT_MSS_KPSS_MISC_STATE_REG,
1052 .halt_check = HALT_VOTED,
1053 .halt_bit = 14,
1054 },
1055 .c = {
1056 .dbg_name = "adm0_clk",
1057 .ops = &clk_ops_branch,
1058 CLK_INIT(adm0_clk.c),
1059 },
1060};
1061
1062static struct branch_clk adm0_p_clk = {
1063 .b = {
1064 .ctl_reg = SC0_U_CLK_BRANCH_ENA_VOTE_REG,
1065 .en_mask = BIT(3),
1066 .halt_reg = CLK_HALT_MSS_KPSS_MISC_STATE_REG,
1067 .halt_check = HALT_VOTED,
1068 .halt_bit = 13,
1069 },
1070 .c = {
1071 .dbg_name = "adm0_p_clk",
1072 .ops = &clk_ops_branch,
1073 CLK_INIT(adm0_p_clk.c),
1074 },
1075};
1076
1077static struct branch_clk pmic_arb0_p_clk = {
1078 .b = {
1079 .ctl_reg = SC0_U_CLK_BRANCH_ENA_VOTE_REG,
1080 .en_mask = BIT(8),
1081 .halt_reg = CLK_HALT_SFPB_MISC_STATE_REG,
1082 .halt_check = HALT_VOTED,
1083 .halt_bit = 22,
1084 },
1085 .c = {
1086 .dbg_name = "pmic_arb0_p_clk",
1087 .ops = &clk_ops_branch,
1088 CLK_INIT(pmic_arb0_p_clk.c),
1089 },
1090};
1091
1092static struct branch_clk pmic_arb1_p_clk = {
1093 .b = {
1094 .ctl_reg = SC0_U_CLK_BRANCH_ENA_VOTE_REG,
1095 .en_mask = BIT(9),
1096 .halt_reg = CLK_HALT_SFPB_MISC_STATE_REG,
1097 .halt_check = HALT_VOTED,
1098 .halt_bit = 21,
1099 },
1100 .c = {
1101 .dbg_name = "pmic_arb1_p_clk",
1102 .ops = &clk_ops_branch,
1103 CLK_INIT(pmic_arb1_p_clk.c),
1104 },
1105};
1106
1107static struct branch_clk pmic_ssbi2_clk = {
1108 .b = {
1109 .ctl_reg = SC0_U_CLK_BRANCH_ENA_VOTE_REG,
1110 .en_mask = BIT(7),
1111 .halt_reg = CLK_HALT_SFPB_MISC_STATE_REG,
1112 .halt_check = HALT_VOTED,
1113 .halt_bit = 23,
1114 },
1115 .c = {
1116 .dbg_name = "pmic_ssbi2_clk",
1117 .ops = &clk_ops_branch,
1118 CLK_INIT(pmic_ssbi2_clk.c),
1119 },
1120};
1121
1122static struct branch_clk rpm_msg_ram_p_clk = {
1123 .b = {
1124 .ctl_reg = SC0_U_CLK_BRANCH_ENA_VOTE_REG,
1125 .en_mask = BIT(6),
1126 .halt_reg = CLK_HALT_SFPB_MISC_STATE_REG,
1127 .halt_check = HALT_VOTED,
1128 .halt_bit = 12,
1129 },
1130 .c = {
1131 .dbg_name = "rpm_msg_ram_p_clk",
1132 .ops = &clk_ops_branch,
1133 CLK_INIT(rpm_msg_ram_p_clk.c),
1134 },
1135};
1136
1137/*
1138 * Low Power Audio Clocks
1139 */
Matt Wagantalle18bbc82011-10-06 10:07:28 -07001140#define F_AIF_OSR(f, s, d, m, n) \
Vikram Mulukutla489e39e2011-08-31 18:04:05 -07001141 { \
1142 .freq_hz = f, \
1143 .src_clk = &s##_clk.c, \
1144 .md_val = MD8(8, m, 0, n), \
1145 .ns_val = NS(31, 24, n, m, 5, 4, 3, d, 2, 0, s##_to_lpa_mux), \
1146 .mnd_en_mask = BIT(8) * !!(n), \
Vikram Mulukutla489e39e2011-08-31 18:04:05 -07001147 }
1148static struct clk_freq_tbl clk_tbl_aif_osr[] = {
Matt Wagantalle18bbc82011-10-06 10:07:28 -07001149 F_AIF_OSR( 0, gnd, 1, 0, 0),
1150 F_AIF_OSR( 512000, pll4, 4, 1, 192),
1151 F_AIF_OSR( 768000, pll4, 4, 1, 128),
1152 F_AIF_OSR( 1024000, pll4, 4, 1, 96),
1153 F_AIF_OSR( 1536000, pll4, 4, 1, 64),
1154 F_AIF_OSR( 2048000, pll4, 4, 1, 48),
1155 F_AIF_OSR( 3072000, pll4, 4, 1, 32),
1156 F_AIF_OSR( 4096000, pll4, 4, 1, 24),
1157 F_AIF_OSR( 6144000, pll4, 4, 1, 16),
1158 F_AIF_OSR( 8192000, pll4, 4, 1, 12),
1159 F_AIF_OSR(12288000, pll4, 4, 1, 8),
1160 F_AIF_OSR(24576000, pll4, 4, 1, 4),
Vikram Mulukutla489e39e2011-08-31 18:04:05 -07001161 F_END
1162};
1163
1164#define CLK_AIF_OSR(i, ns, md, h_r) \
1165 struct rcg_clk i##_clk = { \
1166 .b = { \
1167 .ctl_reg = ns, \
1168 .en_mask = BIT(17), \
1169 .reset_reg = ns, \
1170 .reset_mask = BIT(19), \
1171 .halt_reg = h_r, \
1172 .halt_check = ENABLE, \
1173 .halt_bit = 1, \
1174 }, \
1175 .ns_reg = ns, \
1176 .md_reg = md, \
1177 .root_en_mask = BIT(9), \
1178 .ns_mask = (BM(31, 24) | BM(6, 0)), \
1179 .set_rate = set_rate_mnd, \
1180 .freq_tbl = clk_tbl_aif_osr, \
1181 .current_freq = &rcg_dummy_freq, \
1182 .c = { \
1183 .dbg_name = #i "_clk", \
1184 .ops = &clk_ops_rcg_9615, \
1185 CLK_INIT(i##_clk.c), \
1186 }, \
1187 }
1188#define CLK_AIF_OSR_DIV(i, ns, md, h_r) \
1189 struct rcg_clk i##_clk = { \
1190 .b = { \
1191 .ctl_reg = ns, \
1192 .en_mask = BIT(21), \
1193 .reset_reg = ns, \
1194 .reset_mask = BIT(23), \
1195 .halt_reg = h_r, \
1196 .halt_check = ENABLE, \
1197 .halt_bit = 1, \
1198 }, \
1199 .ns_reg = ns, \
1200 .md_reg = md, \
1201 .root_en_mask = BIT(9), \
1202 .ns_mask = (BM(31, 24) | BM(6, 0)), \
1203 .set_rate = set_rate_mnd, \
1204 .freq_tbl = clk_tbl_aif_osr, \
1205 .current_freq = &rcg_dummy_freq, \
1206 .c = { \
1207 .dbg_name = #i "_clk", \
1208 .ops = &clk_ops_rcg_9615, \
1209 CLK_INIT(i##_clk.c), \
1210 }, \
1211 }
1212
Vikram Mulukutla489e39e2011-08-31 18:04:05 -07001213#define CLK_AIF_BIT(i, ns, h_r) \
Stephen Boyd9fd19642011-11-16 11:11:09 -08001214 struct cdiv_clk i##_clk = { \
Vikram Mulukutla489e39e2011-08-31 18:04:05 -07001215 .b = { \
1216 .ctl_reg = ns, \
1217 .en_mask = BIT(15), \
1218 .halt_reg = h_r, \
1219 .halt_check = DELAY, \
1220 }, \
1221 .ns_reg = ns, \
Stephen Boyd9fd19642011-11-16 11:11:09 -08001222 .ext_mask = BIT(14), \
1223 .div_offset = 10, \
1224 .max_div = 16, \
Vikram Mulukutla489e39e2011-08-31 18:04:05 -07001225 .c = { \
1226 .dbg_name = #i "_clk", \
Stephen Boyd9fd19642011-11-16 11:11:09 -08001227 .ops = &clk_ops_cdiv, \
Vikram Mulukutla489e39e2011-08-31 18:04:05 -07001228 CLK_INIT(i##_clk.c), \
1229 }, \
1230 }
1231
Vikram Mulukutla489e39e2011-08-31 18:04:05 -07001232#define CLK_AIF_BIT_DIV(i, ns, h_r) \
Stephen Boyd9fd19642011-11-16 11:11:09 -08001233 struct cdiv_clk i##_clk = { \
Vikram Mulukutla489e39e2011-08-31 18:04:05 -07001234 .b = { \
1235 .ctl_reg = ns, \
1236 .en_mask = BIT(19), \
1237 .halt_reg = h_r, \
1238 .halt_check = ENABLE, \
1239 }, \
1240 .ns_reg = ns, \
Stephen Boyd9fd19642011-11-16 11:11:09 -08001241 .ext_mask = BIT(18), \
1242 .div_offset = 10, \
1243 .max_div = 256, \
Vikram Mulukutla489e39e2011-08-31 18:04:05 -07001244 .c = { \
1245 .dbg_name = #i "_clk", \
Stephen Boyd9fd19642011-11-16 11:11:09 -08001246 .ops = &clk_ops_cdiv, \
Vikram Mulukutla489e39e2011-08-31 18:04:05 -07001247 CLK_INIT(i##_clk.c), \
1248 }, \
1249 }
1250
1251static CLK_AIF_OSR(mi2s_osr, LCC_MI2S_NS_REG, LCC_MI2S_MD_REG,
1252 LCC_MI2S_STATUS_REG);
1253static CLK_AIF_BIT(mi2s_bit, LCC_MI2S_NS_REG, LCC_MI2S_STATUS_REG);
1254
1255static CLK_AIF_OSR_DIV(codec_i2s_mic_osr, LCC_CODEC_I2S_MIC_NS_REG,
1256 LCC_CODEC_I2S_MIC_MD_REG, LCC_CODEC_I2S_MIC_STATUS_REG);
1257static CLK_AIF_BIT_DIV(codec_i2s_mic_bit, LCC_CODEC_I2S_MIC_NS_REG,
1258 LCC_CODEC_I2S_MIC_STATUS_REG);
1259
1260static CLK_AIF_OSR_DIV(spare_i2s_mic_osr, LCC_SPARE_I2S_MIC_NS_REG,
1261 LCC_SPARE_I2S_MIC_MD_REG, LCC_SPARE_I2S_MIC_STATUS_REG);
1262static CLK_AIF_BIT_DIV(spare_i2s_mic_bit, LCC_SPARE_I2S_MIC_NS_REG,
1263 LCC_SPARE_I2S_MIC_STATUS_REG);
1264
1265static CLK_AIF_OSR_DIV(codec_i2s_spkr_osr, LCC_CODEC_I2S_SPKR_NS_REG,
1266 LCC_CODEC_I2S_SPKR_MD_REG, LCC_CODEC_I2S_SPKR_STATUS_REG);
1267static CLK_AIF_BIT_DIV(codec_i2s_spkr_bit, LCC_CODEC_I2S_SPKR_NS_REG,
1268 LCC_CODEC_I2S_SPKR_STATUS_REG);
1269
1270static CLK_AIF_OSR_DIV(spare_i2s_spkr_osr, LCC_SPARE_I2S_SPKR_NS_REG,
1271 LCC_SPARE_I2S_SPKR_MD_REG, LCC_SPARE_I2S_SPKR_STATUS_REG);
1272static CLK_AIF_BIT_DIV(spare_i2s_spkr_bit, LCC_SPARE_I2S_SPKR_NS_REG,
1273 LCC_SPARE_I2S_SPKR_STATUS_REG);
1274
Matt Wagantalle18bbc82011-10-06 10:07:28 -07001275#define F_PCM(f, s, d, m, n) \
Vikram Mulukutla489e39e2011-08-31 18:04:05 -07001276 { \
1277 .freq_hz = f, \
1278 .src_clk = &s##_clk.c, \
1279 .md_val = MD16(m, n), \
1280 .ns_val = NS(31, 16, n, m, 5, 4, 3, d, 2, 0, s##_to_lpa_mux), \
1281 .mnd_en_mask = BIT(8) * !!(n), \
Vikram Mulukutla489e39e2011-08-31 18:04:05 -07001282 }
1283static struct clk_freq_tbl clk_tbl_pcm[] = {
Matt Wagantalle18bbc82011-10-06 10:07:28 -07001284 F_PCM( 0, gnd, 1, 0, 0),
1285 F_PCM( 512000, pll4, 4, 1, 192),
1286 F_PCM( 768000, pll4, 4, 1, 128),
1287 F_PCM( 1024000, pll4, 4, 1, 96),
1288 F_PCM( 1536000, pll4, 4, 1, 64),
1289 F_PCM( 2048000, pll4, 4, 1, 48),
1290 F_PCM( 3072000, pll4, 4, 1, 32),
1291 F_PCM( 4096000, pll4, 4, 1, 24),
1292 F_PCM( 6144000, pll4, 4, 1, 16),
1293 F_PCM( 8192000, pll4, 4, 1, 12),
1294 F_PCM(12288000, pll4, 4, 1, 8),
1295 F_PCM(24576000, pll4, 4, 1, 4),
Vikram Mulukutla489e39e2011-08-31 18:04:05 -07001296 F_END
1297};
1298
1299static struct rcg_clk pcm_clk = {
1300 .b = {
1301 .ctl_reg = LCC_PCM_NS_REG,
1302 .en_mask = BIT(11),
1303 .reset_reg = LCC_PCM_NS_REG,
1304 .reset_mask = BIT(13),
1305 .halt_reg = LCC_PCM_STATUS_REG,
1306 .halt_check = ENABLE,
1307 .halt_bit = 0,
1308 },
1309 .ns_reg = LCC_PCM_NS_REG,
1310 .md_reg = LCC_PCM_MD_REG,
1311 .root_en_mask = BIT(9),
1312 .ns_mask = (BM(31, 16) | BM(6, 0)),
1313 .set_rate = set_rate_mnd,
1314 .freq_tbl = clk_tbl_pcm,
1315 .current_freq = &rcg_dummy_freq,
1316 .c = {
1317 .dbg_name = "pcm_clk",
1318 .ops = &clk_ops_rcg_9615,
Matt Wagantalle18bbc82011-10-06 10:07:28 -07001319 VDD_DIG_FMAX_MAP1(LOW, 24576000),
Vikram Mulukutla489e39e2011-08-31 18:04:05 -07001320 CLK_INIT(pcm_clk.c),
1321 },
1322};
1323
1324static struct rcg_clk audio_slimbus_clk = {
1325 .b = {
1326 .ctl_reg = LCC_SLIMBUS_NS_REG,
1327 .en_mask = BIT(10),
1328 .reset_reg = LCC_AHBEX_BRANCH_CTL_REG,
1329 .reset_mask = BIT(5),
1330 .halt_reg = LCC_SLIMBUS_STATUS_REG,
1331 .halt_check = ENABLE,
1332 .halt_bit = 0,
1333 },
1334 .ns_reg = LCC_SLIMBUS_NS_REG,
1335 .md_reg = LCC_SLIMBUS_MD_REG,
1336 .root_en_mask = BIT(9),
1337 .ns_mask = (BM(31, 24) | BM(6, 0)),
1338 .set_rate = set_rate_mnd,
1339 .freq_tbl = clk_tbl_aif_osr,
1340 .current_freq = &rcg_dummy_freq,
1341 .c = {
1342 .dbg_name = "audio_slimbus_clk",
1343 .ops = &clk_ops_rcg_9615,
Matt Wagantalle18bbc82011-10-06 10:07:28 -07001344 VDD_DIG_FMAX_MAP1(LOW, 24576000),
Vikram Mulukutla489e39e2011-08-31 18:04:05 -07001345 CLK_INIT(audio_slimbus_clk.c),
1346 },
1347};
1348
1349static struct branch_clk sps_slimbus_clk = {
1350 .b = {
1351 .ctl_reg = LCC_SLIMBUS_NS_REG,
1352 .en_mask = BIT(12),
1353 .halt_reg = LCC_SLIMBUS_STATUS_REG,
1354 .halt_check = ENABLE,
1355 .halt_bit = 1,
1356 },
1357 .parent = &audio_slimbus_clk.c,
1358 .c = {
1359 .dbg_name = "sps_slimbus_clk",
1360 .ops = &clk_ops_branch,
1361 CLK_INIT(sps_slimbus_clk.c),
1362 },
1363};
1364
1365static struct branch_clk slimbus_xo_src_clk = {
1366 .b = {
1367 .ctl_reg = SLIMBUS_XO_SRC_CLK_CTL_REG,
1368 .en_mask = BIT(2),
1369 .halt_reg = CLK_HALT_DFAB_STATE_REG,
1370 .halt_bit = 28,
1371 },
1372 .parent = &sps_slimbus_clk.c,
1373 .c = {
1374 .dbg_name = "slimbus_xo_src_clk",
1375 .ops = &clk_ops_branch,
1376 CLK_INIT(slimbus_xo_src_clk.c),
1377 },
1378};
1379
Vikram Mulukutla73d42112011-09-19 16:32:54 -07001380DEFINE_CLK_RPM(cfpb_clk, cfpb_a_clk, CFPB, NULL);
1381DEFINE_CLK_RPM(dfab_clk, dfab_a_clk, DAYTONA_FABRIC, NULL);
1382DEFINE_CLK_RPM(ebi1_clk, ebi1_a_clk, EBI1, NULL);
1383DEFINE_CLK_RPM(sfab_clk, sfab_a_clk, SYSTEM_FABRIC, NULL);
1384DEFINE_CLK_RPM(sfpb_clk, sfpb_a_clk, SFPB, NULL);
1385
1386static DEFINE_CLK_VOTER(dfab_usb_hs_clk, &dfab_clk.c);
1387static DEFINE_CLK_VOTER(dfab_sdc1_clk, &dfab_clk.c);
1388static DEFINE_CLK_VOTER(dfab_sdc2_clk, &dfab_clk.c);
1389static DEFINE_CLK_VOTER(dfab_sps_clk, &dfab_clk.c);
Vikram Mulukutlacfd73ad2011-11-09 11:39:34 -08001390static DEFINE_CLK_VOTER(dfab_bam_dmux_clk, &dfab_clk.c);
Vikram Mulukutla73d42112011-09-19 16:32:54 -07001391static DEFINE_CLK_VOTER(ebi1_msmbus_clk, &ebi1_clk.c);
Vikram Mulukutla489e39e2011-08-31 18:04:05 -07001392
1393/*
1394 * TODO: replace dummy_clk below with ebi1_clk.c once the
1395 * bus driver starts voting on ebi1 rates.
1396 */
1397static DEFINE_CLK_VOTER(ebi1_adm_clk, &dummy_clk);
1398
1399#ifdef CONFIG_DEBUG_FS
1400struct measure_sel {
1401 u32 test_vector;
1402 struct clk *clk;
1403};
1404
1405static struct measure_sel measure_mux[] = {
1406 { TEST_PER_LS(0x08), &slimbus_xo_src_clk.c },
1407 { TEST_PER_LS(0x12), &sdc1_p_clk.c },
1408 { TEST_PER_LS(0x13), &sdc1_clk.c },
1409 { TEST_PER_LS(0x14), &sdc2_p_clk.c },
1410 { TEST_PER_LS(0x15), &sdc2_clk.c },
Matt Wagantall7625a4c2011-11-01 16:17:53 -07001411 { TEST_PER_LS(0x1F), &gp0_clk.c },
1412 { TEST_PER_LS(0x20), &gp1_clk.c },
1413 { TEST_PER_LS(0x21), &gp2_clk.c },
Vikram Mulukutla489e39e2011-08-31 18:04:05 -07001414 { TEST_PER_LS(0x26), &pmem_clk.c },
Vikram Mulukutla73d42112011-09-19 16:32:54 -07001415 { TEST_PER_LS(0x25), &dfab_clk.c },
1416 { TEST_PER_LS(0x25), &dfab_a_clk.c },
Vikram Mulukutla489e39e2011-08-31 18:04:05 -07001417 { TEST_PER_LS(0x32), &dma_bam_p_clk.c },
Vikram Mulukutla73d42112011-09-19 16:32:54 -07001418 { TEST_PER_LS(0x33), &cfpb_clk.c },
1419 { TEST_PER_LS(0x33), &cfpb_a_clk.c },
Vikram Mulukutla489e39e2011-08-31 18:04:05 -07001420 { TEST_PER_LS(0x3E), &gsbi1_uart_clk.c },
1421 { TEST_PER_LS(0x3F), &gsbi1_qup_clk.c },
1422 { TEST_PER_LS(0x41), &gsbi2_p_clk.c },
1423 { TEST_PER_LS(0x42), &gsbi2_uart_clk.c },
1424 { TEST_PER_LS(0x44), &gsbi2_qup_clk.c },
1425 { TEST_PER_LS(0x45), &gsbi3_p_clk.c },
1426 { TEST_PER_LS(0x46), &gsbi3_uart_clk.c },
1427 { TEST_PER_LS(0x48), &gsbi3_qup_clk.c },
1428 { TEST_PER_LS(0x49), &gsbi4_p_clk.c },
1429 { TEST_PER_LS(0x4A), &gsbi4_uart_clk.c },
1430 { TEST_PER_LS(0x4C), &gsbi4_qup_clk.c },
1431 { TEST_PER_LS(0x4D), &gsbi5_p_clk.c },
1432 { TEST_PER_LS(0x4E), &gsbi5_uart_clk.c },
1433 { TEST_PER_LS(0x50), &gsbi5_qup_clk.c },
Vikram Mulukutla73d42112011-09-19 16:32:54 -07001434 { TEST_PER_LS(0x78), &sfpb_clk.c },
1435 { TEST_PER_LS(0x78), &sfpb_a_clk.c },
Vikram Mulukutla489e39e2011-08-31 18:04:05 -07001436 { TEST_PER_LS(0x7A), &pmic_ssbi2_clk.c },
1437 { TEST_PER_LS(0x7B), &pmic_arb0_p_clk.c },
1438 { TEST_PER_LS(0x7C), &pmic_arb1_p_clk.c },
1439 { TEST_PER_LS(0x7D), &prng_clk.c },
1440 { TEST_PER_LS(0x7F), &rpm_msg_ram_p_clk.c },
1441 { TEST_PER_LS(0x80), &adm0_p_clk.c },
1442 { TEST_PER_LS(0x84), &usb_hs1_p_clk.c },
1443 { TEST_PER_LS(0x85), &usb_hs1_xcvr_clk.c },
1444 { TEST_PER_LS(0x86), &usb_hsic_sys_clk.c },
1445 { TEST_PER_LS(0x87), &usb_hsic_p_clk.c },
1446 { TEST_PER_LS(0x88), &usb_hsic_xcvr_clk.c },
1447 { TEST_PER_LS(0x8B), &usb_hsic_hsio_cal_clk.c },
1448 { TEST_PER_LS(0x8D), &usb_hs1_sys_clk.c },
1449 { TEST_PER_LS(0x92), &ce1_p_clk.c },
Vikram Mulukutla73d42112011-09-19 16:32:54 -07001450 { TEST_PER_HS(0x18), &sfab_clk.c },
1451 { TEST_PER_HS(0x18), &sfab_a_clk.c },
Vikram Mulukutla489e39e2011-08-31 18:04:05 -07001452 { TEST_PER_LS(0xA4), &ce1_core_clk.c },
1453 { TEST_PER_HS(0x2A), &adm0_clk.c },
Vikram Mulukutla73d42112011-09-19 16:32:54 -07001454 { TEST_PER_HS(0x34), &ebi1_clk.c },
1455 { TEST_PER_HS(0x34), &ebi1_a_clk.c },
Vikram Mulukutla6c9158f2011-12-08 12:41:20 -08001456 { TEST_PER_HS(0x3E), &usb_hsic_clk.c },
Vikram Mulukutla489e39e2011-08-31 18:04:05 -07001457 { TEST_LPA(0x0F), &mi2s_bit_clk.c },
1458 { TEST_LPA(0x10), &codec_i2s_mic_bit_clk.c },
1459 { TEST_LPA(0x11), &codec_i2s_spkr_bit_clk.c },
1460 { TEST_LPA(0x12), &spare_i2s_mic_bit_clk.c },
1461 { TEST_LPA(0x13), &spare_i2s_spkr_bit_clk.c },
1462 { TEST_LPA(0x14), &pcm_clk.c },
1463 { TEST_LPA(0x1D), &audio_slimbus_clk.c },
1464};
1465
1466static struct measure_sel *find_measure_sel(struct clk *clk)
1467{
1468 int i;
1469
1470 for (i = 0; i < ARRAY_SIZE(measure_mux); i++)
1471 if (measure_mux[i].clk == clk)
1472 return &measure_mux[i];
1473 return NULL;
1474}
1475
1476static int measure_clk_set_parent(struct clk *c, struct clk *parent)
1477{
1478 int ret = 0;
1479 u32 clk_sel;
1480 struct measure_sel *p;
1481 struct measure_clk *clk = to_measure_clk(c);
1482 unsigned long flags;
1483
1484 if (!parent)
1485 return -EINVAL;
1486
1487 p = find_measure_sel(parent);
1488 if (!p)
1489 return -EINVAL;
1490
1491 spin_lock_irqsave(&local_clock_reg_lock, flags);
1492
1493 /*
1494 * Program the test vector, measurement period (sample_ticks)
1495 * and scaling multiplier.
1496 */
1497 clk->sample_ticks = 0x10000;
1498 clk_sel = p->test_vector & TEST_CLK_SEL_MASK;
1499 clk->multiplier = 1;
1500 switch (p->test_vector >> TEST_TYPE_SHIFT) {
1501 case TEST_TYPE_PER_LS:
1502 writel_relaxed(0x4030D00|BVAL(7, 0, clk_sel), CLK_TEST_REG);
1503 break;
1504 case TEST_TYPE_PER_HS:
1505 writel_relaxed(0x4020000|BVAL(16, 10, clk_sel), CLK_TEST_REG);
1506 break;
1507 case TEST_TYPE_LPA:
1508 writel_relaxed(0x4030D98, CLK_TEST_REG);
1509 writel_relaxed(BVAL(6, 1, clk_sel)|BIT(0),
1510 LCC_CLK_LS_DEBUG_CFG_REG);
1511 break;
1512 default:
1513 ret = -EPERM;
1514 }
1515 /* Make sure test vector is set before starting measurements. */
1516 mb();
1517
1518 spin_unlock_irqrestore(&local_clock_reg_lock, flags);
1519
1520 return ret;
1521}
1522
1523/* Sample clock for 'ticks' reference clock ticks. */
Matt Wagantall9de3bfb2011-11-03 20:13:12 -07001524static unsigned long run_measurement(unsigned ticks)
Vikram Mulukutla489e39e2011-08-31 18:04:05 -07001525{
1526 /* Stop counters and set the XO4 counter start value. */
Vikram Mulukutla489e39e2011-08-31 18:04:05 -07001527 writel_relaxed(ticks, RINGOSC_TCXO_CTL_REG);
1528
1529 /* Wait for timer to become ready. */
1530 while ((readl_relaxed(RINGOSC_STATUS_REG) & BIT(25)) != 0)
1531 cpu_relax();
1532
1533 /* Run measurement and wait for completion. */
1534 writel_relaxed(BIT(28)|ticks, RINGOSC_TCXO_CTL_REG);
1535 while ((readl_relaxed(RINGOSC_STATUS_REG) & BIT(25)) == 0)
1536 cpu_relax();
1537
1538 /* Stop counters. */
1539 writel_relaxed(0x0, RINGOSC_TCXO_CTL_REG);
1540
1541 /* Return measured ticks. */
1542 return readl_relaxed(RINGOSC_STATUS_REG) & BM(24, 0);
1543}
1544
1545
1546/* Perform a hardware rate measurement for a given clock.
1547 FOR DEBUG USE ONLY: Measurements take ~15 ms! */
Matt Wagantall9de3bfb2011-11-03 20:13:12 -07001548static unsigned long measure_clk_get_rate(struct clk *c)
Vikram Mulukutla489e39e2011-08-31 18:04:05 -07001549{
1550 unsigned long flags;
1551 u32 pdm_reg_backup, ringosc_reg_backup;
1552 u64 raw_count_short, raw_count_full;
1553 struct measure_clk *clk = to_measure_clk(c);
1554 unsigned ret;
1555
1556 spin_lock_irqsave(&local_clock_reg_lock, flags);
1557
1558 /* Enable CXO/4 and RINGOSC branch and root. */
1559 pdm_reg_backup = readl_relaxed(PDM_CLK_NS_REG);
1560 ringosc_reg_backup = readl_relaxed(RINGOSC_NS_REG);
1561 writel_relaxed(0x2898, PDM_CLK_NS_REG);
1562 writel_relaxed(0xA00, RINGOSC_NS_REG);
1563
1564 /*
1565 * The ring oscillator counter will not reset if the measured clock
1566 * is not running. To detect this, run a short measurement before
1567 * the full measurement. If the raw results of the two are the same
1568 * then the clock must be off.
1569 */
1570
1571 /* Run a short measurement. (~1 ms) */
1572 raw_count_short = run_measurement(0x1000);
1573 /* Run a full measurement. (~14 ms) */
1574 raw_count_full = run_measurement(clk->sample_ticks);
1575
1576 writel_relaxed(ringosc_reg_backup, RINGOSC_NS_REG);
1577 writel_relaxed(pdm_reg_backup, PDM_CLK_NS_REG);
1578
1579 /* Return 0 if the clock is off. */
1580 if (raw_count_full == raw_count_short)
1581 ret = 0;
1582 else {
1583 /* Compute rate in Hz. */
1584 raw_count_full = ((raw_count_full * 10) + 15) * 4800000;
1585 do_div(raw_count_full, ((clk->sample_ticks * 10) + 35));
1586 ret = (raw_count_full * clk->multiplier);
1587 }
1588
1589 /* Route dbg_hs_clk to PLLTEST. 300mV single-ended amplitude. */
1590 writel_relaxed(0x38F8, PLLTEST_PAD_CFG_REG);
1591 spin_unlock_irqrestore(&local_clock_reg_lock, flags);
1592
1593 return ret;
1594}
1595#else /* !CONFIG_DEBUG_FS */
1596static int measure_clk_set_parent(struct clk *clk, struct clk *parent)
1597{
1598 return -EINVAL;
1599}
1600
Matt Wagantall9de3bfb2011-11-03 20:13:12 -07001601static unsigned long measure_clk_get_rate(struct clk *clk)
Vikram Mulukutla489e39e2011-08-31 18:04:05 -07001602{
1603 return 0;
1604}
1605#endif /* CONFIG_DEBUG_FS */
1606
1607static struct clk_ops measure_clk_ops = {
1608 .set_parent = measure_clk_set_parent,
1609 .get_rate = measure_clk_get_rate,
1610 .is_local = local_clk_is_local,
1611};
1612
1613static struct measure_clk measure_clk = {
1614 .c = {
1615 .dbg_name = "measure_clk",
1616 .ops = &measure_clk_ops,
1617 CLK_INIT(measure_clk.c),
1618 },
1619 .multiplier = 1,
1620};
1621
1622static struct clk_lookup msm_clocks_9615[] = {
1623 CLK_LOOKUP("cxo", cxo_clk.c, NULL),
1624 CLK_LOOKUP("pll0", pll0_clk.c, NULL),
1625 CLK_LOOKUP("pll8", pll8_clk.c, NULL),
1626 CLK_LOOKUP("pll9", pll9_clk.c, NULL),
1627 CLK_LOOKUP("pll14", pll14_clk.c, NULL),
Vikram Mulukutla31680ae2011-11-04 14:23:55 -07001628
1629 CLK_LOOKUP("pll0", pll0_acpu_clk.c, "acpu"),
1630 CLK_LOOKUP("pll8", pll8_acpu_clk.c, "acpu"),
1631 CLK_LOOKUP("pll9", pll9_acpu_clk.c, "acpu"),
1632
Vikram Mulukutla489e39e2011-08-31 18:04:05 -07001633 CLK_LOOKUP("measure", measure_clk.c, "debug"),
1634
Matt Wagantallb2710b82011-11-16 19:55:17 -08001635 CLK_LOOKUP("bus_clk", sfab_clk.c, "msm_sys_fab"),
1636 CLK_LOOKUP("bus_a_clk", sfab_a_clk.c, "msm_sys_fab"),
1637 CLK_LOOKUP("mem_clk", ebi1_msmbus_clk.c, "msm_bus"),
1638 CLK_LOOKUP("mem_a_clk", ebi1_a_clk.c, "msm_bus"),
1639
1640 CLK_LOOKUP("bus_clk", sfpb_clk.c, NULL),
1641 CLK_LOOKUP("bus_a_clk", sfpb_a_clk.c, NULL),
1642 CLK_LOOKUP("bus_clk", cfpb_clk.c, NULL),
1643 CLK_LOOKUP("bus_a_clk", cfpb_a_clk.c, NULL),
1644 CLK_LOOKUP("ebi1_clk", ebi1_clk.c, NULL),
Vikram Mulukutla73d42112011-09-19 16:32:54 -07001645 CLK_LOOKUP("dfab_clk", dfab_clk.c, NULL),
1646 CLK_LOOKUP("dfab_a_clk", dfab_a_clk.c, NULL),
Vikram Mulukutla489e39e2011-08-31 18:04:05 -07001647
Matt Wagantall7625a4c2011-11-01 16:17:53 -07001648 CLK_LOOKUP("core_clk", gp0_clk.c, NULL),
1649 CLK_LOOKUP("core_clk", gp1_clk.c, NULL),
1650 CLK_LOOKUP("core_clk", gp2_clk.c, NULL),
1651
Vikram Mulukutla489e39e2011-08-31 18:04:05 -07001652 CLK_LOOKUP("core_clk", gsbi3_uart_clk.c, NULL),
1653 CLK_LOOKUP("core_clk", gsbi4_uart_clk.c, "msm_serial_hsl.0"),
1654 CLK_LOOKUP("core_clk", gsbi5_uart_clk.c, NULL),
1655
Harini Jayaraman738c9312011-09-08 15:22:38 -06001656 CLK_LOOKUP("core_clk", gsbi3_qup_clk.c, "spi_qsd.0"),
Vikram Mulukutla489e39e2011-08-31 18:04:05 -07001657 CLK_LOOKUP("core_clk", gsbi4_qup_clk.c, NULL),
Harini Jayaramaneba52672011-09-08 15:13:00 -06001658 CLK_LOOKUP("core_clk", gsbi5_qup_clk.c, "qup_i2c.0"),
Vikram Mulukutla489e39e2011-08-31 18:04:05 -07001659
Matt Wagantallb86ad262011-10-24 19:50:29 -07001660 CLK_LOOKUP("core_clk", pdm_clk.c, NULL),
Vikram Mulukutladd0a2372011-09-19 15:58:21 -07001661 CLK_LOOKUP("mem_clk", pmem_clk.c, "msm_sps"),
Ramesh Masavarapu5ad37392011-10-10 10:44:10 -07001662 CLK_LOOKUP("core_clk", prng_clk.c, "msm_rng.0"),
Vikram Mulukutla489e39e2011-08-31 18:04:05 -07001663 CLK_LOOKUP("core_clk", sdc1_clk.c, "msm_sdcc.1"),
1664 CLK_LOOKUP("core_clk", sdc2_clk.c, "msm_sdcc.2"),
Matt Wagantallb86ad262011-10-24 19:50:29 -07001665 CLK_LOOKUP("iface_clk", ce1_p_clk.c, NULL),
1666 CLK_LOOKUP("core_clk", ce1_core_clk.c, NULL),
Vikram Mulukutla489e39e2011-08-31 18:04:05 -07001667 CLK_LOOKUP("dma_bam_pclk", dma_bam_p_clk.c, NULL),
1668
Harini Jayaraman738c9312011-09-08 15:22:38 -06001669 CLK_LOOKUP("iface_clk", gsbi3_p_clk.c, "spi_qsd.0"),
Vikram Mulukutla489e39e2011-08-31 18:04:05 -07001670 CLK_LOOKUP("iface_clk", gsbi4_p_clk.c, "msm_serial_hsl.0"),
Harini Jayaramaneba52672011-09-08 15:13:00 -06001671 CLK_LOOKUP("iface_clk", gsbi5_p_clk.c, "qup_i2c.0"),
Vikram Mulukutla489e39e2011-08-31 18:04:05 -07001672
Manu Gautam5143b252012-01-05 19:25:23 -08001673 CLK_LOOKUP("iface_clk", usb_hs1_p_clk.c, "msm_otg"),
1674 CLK_LOOKUP("core_clk", usb_hs1_sys_clk.c, "msm_otg"),
1675 CLK_LOOKUP("alt_core_clk", usb_hs1_xcvr_clk.c, "msm_otg"),
1676 CLK_LOOKUP("alt_core_clk", usb_hsic_xcvr_clk.c, "msm_hsic_host"),
1677 CLK_LOOKUP("cal_clk", usb_hsic_hsio_cal_clk.c, "msm_hsic_host"),
1678 CLK_LOOKUP("core_clk", usb_hsic_sys_clk.c, "msm_hsic_host"),
1679 CLK_LOOKUP("iface_clk", usb_hsic_p_clk.c, "msm_hsic_host"),
1680 CLK_LOOKUP("phy_clk", usb_hsic_clk.c, "msm_hsic_host"),
Vikram Mulukutla489e39e2011-08-31 18:04:05 -07001681
1682 CLK_LOOKUP("iface_clk", sdc1_p_clk.c, "msm_sdcc.1"),
1683 CLK_LOOKUP("iface_clk", sdc2_p_clk.c, "msm_sdcc.2"),
1684 CLK_LOOKUP("core_clk", adm0_clk.c, "msm_dmov"),
1685 CLK_LOOKUP("iface_clk", adm0_p_clk.c, "msm_dmov"),
Matt Wagantallb86ad262011-10-24 19:50:29 -07001686 CLK_LOOKUP("iface_clk", pmic_arb0_p_clk.c, NULL),
1687 CLK_LOOKUP("iface_clk", pmic_arb1_p_clk.c, NULL),
1688 CLK_LOOKUP("core_clk", pmic_ssbi2_clk.c, NULL),
1689 CLK_LOOKUP("mem_clk", rpm_msg_ram_p_clk.c, NULL),
Vikram Mulukutla489e39e2011-08-31 18:04:05 -07001690 CLK_LOOKUP("mi2s_bit_clk", mi2s_bit_clk.c, NULL),
1691 CLK_LOOKUP("mi2s_osr_clk", mi2s_osr_clk.c, NULL),
1692
1693 CLK_LOOKUP("i2s_mic_bit_clk", codec_i2s_mic_bit_clk.c, NULL),
1694 CLK_LOOKUP("i2s_mic_osr_clk", codec_i2s_mic_osr_clk.c, NULL),
1695 CLK_LOOKUP("i2s_mic_bit_clk", spare_i2s_mic_bit_clk.c, NULL),
1696 CLK_LOOKUP("i2s_mic_osr_clk", spare_i2s_mic_osr_clk.c, NULL),
1697 CLK_LOOKUP("i2s_spkr_bit_clk", codec_i2s_spkr_bit_clk.c, NULL),
1698 CLK_LOOKUP("i2s_spkr_osr_clk", codec_i2s_spkr_osr_clk.c, NULL),
1699 CLK_LOOKUP("i2s_spkr_bit_clk", spare_i2s_spkr_bit_clk.c, NULL),
1700 CLK_LOOKUP("i2s_spkr_osr_clk", spare_i2s_spkr_osr_clk.c, NULL),
1701 CLK_LOOKUP("pcm_clk", pcm_clk.c, NULL),
1702
1703 CLK_LOOKUP("sps_slimbus_clk", sps_slimbus_clk.c, NULL),
1704 CLK_LOOKUP("audio_slimbus_clk", audio_slimbus_clk.c, NULL),
Manu Gautam5143b252012-01-05 19:25:23 -08001705 CLK_LOOKUP("core_clk", dfab_usb_hs_clk.c, "msm_otg"),
Vikram Mulukutla489e39e2011-08-31 18:04:05 -07001706 CLK_LOOKUP("bus_clk", dfab_sdc1_clk.c, "msm_sdcc.1"),
1707 CLK_LOOKUP("bus_clk", dfab_sdc2_clk.c, "msm_sdcc.2"),
1708 CLK_LOOKUP("dfab_clk", dfab_sps_clk.c, "msm_sps"),
Vikram Mulukutlacfd73ad2011-11-09 11:39:34 -08001709 CLK_LOOKUP("bus_clk", dfab_bam_dmux_clk.c, "BAM_RMNT"),
Vikram Mulukutla73d42112011-09-19 16:32:54 -07001710 CLK_LOOKUP("mem_clk", ebi1_adm_clk.c, "msm_dmov"),
Vikram Mulukutla489e39e2011-08-31 18:04:05 -07001711
Ramesh Masavarapufa679d92011-10-13 23:42:59 -07001712 CLK_LOOKUP("iface_clk", ce1_p_clk.c, "qce.0"),
1713 CLK_LOOKUP("iface_clk", ce1_p_clk.c, "qcrypto.0"),
1714 CLK_LOOKUP("core_clk", ce1_core_clk.c, "qce.0"),
1715 CLK_LOOKUP("core_clk", ce1_core_clk.c, "qcrypto.0"),
1716
1717 /* TODO: Make this real when RPM's ready. */
1718 CLK_DUMMY("ebi1_msmbus_clk", ebi1_msmbus_clk.c, NULL, OFF),
1719 CLK_DUMMY("mem_clk", ebi1_adm_clk.c, "msm_dmov", OFF),
1720
Vikram Mulukutla489e39e2011-08-31 18:04:05 -07001721};
1722
1723static void set_fsm_mode(void __iomem *mode_reg)
1724{
1725 u32 regval = readl_relaxed(mode_reg);
1726
1727 /* De-assert reset to FSM */
1728 regval &= ~BIT(21);
1729 writel_relaxed(regval, mode_reg);
1730
1731 /* Program bias count */
1732 regval &= ~BM(19, 14);
Vikram Mulukutlad2314f32011-10-14 10:12:02 -07001733 regval |= BVAL(19, 14, 0x1);
Vikram Mulukutla489e39e2011-08-31 18:04:05 -07001734 writel_relaxed(regval, mode_reg);
1735
1736 /* Program lock count */
1737 regval &= ~BM(13, 8);
1738 regval |= BVAL(13, 8, 0x8);
1739 writel_relaxed(regval, mode_reg);
1740
1741 /* Enable PLL FSM voting */
1742 regval |= BIT(20);
1743 writel_relaxed(regval, mode_reg);
1744}
1745
1746/*
1747 * Miscellaneous clock register initializations
1748 */
1749static void __init reg_init(void)
1750{
1751 u32 regval, is_pll_enabled;
1752
1753 /* Enable PDM CXO source. */
1754 regval = readl_relaxed(PDM_CLK_NS_REG);
1755 writel_relaxed(BIT(13) | regval, PDM_CLK_NS_REG);
1756
1757 /* Check if PLL0 is active */
1758 is_pll_enabled = readl_relaxed(BB_PLL0_STATUS_REG) & BIT(16);
1759
1760 if (!is_pll_enabled) {
1761 writel_relaxed(0xE, BB_PLL0_L_VAL_REG);
1762 writel_relaxed(0x3, BB_PLL0_M_VAL_REG);
1763 writel_relaxed(0x8, BB_PLL0_N_VAL_REG);
1764
1765 regval = readl_relaxed(BB_PLL0_CONFIG_REG);
1766
1767 /* Enable the main output and the MN accumulator */
1768 regval |= BIT(23) | BIT(22);
1769
1770 /* Set pre-divider and post-divider values to 1 and 1 */
1771 regval &= ~BIT(19);
1772 regval &= ~BM(21, 20);
1773
1774 /* Set VCO frequency */
1775 regval &= ~BM(17, 16);
1776
1777 writel_relaxed(regval, BB_PLL0_CONFIG_REG);
1778
1779 /* Enable AUX output */
1780 regval = readl_relaxed(BB_PLL0_TEST_CTL_REG);
1781 regval |= BIT(12);
1782 writel_relaxed(regval, BB_PLL0_TEST_CTL_REG);
1783
1784 set_fsm_mode(BB_PLL0_MODE_REG);
1785 }
1786
1787 /* Check if PLL9 (SC_PLL0) is enabled in FSM mode */
1788 is_pll_enabled = readl_relaxed(SC_PLL0_STATUS_REG) & BIT(16);
1789
1790 if (!is_pll_enabled) {
1791 writel_relaxed(0x16, SC_PLL0_L_VAL_REG);
1792 writel_relaxed(0xB, SC_PLL0_M_VAL_REG);
1793 writel_relaxed(0xC, SC_PLL0_N_VAL_REG);
1794
1795 regval = readl_relaxed(SC_PLL0_CONFIG_REG);
1796
1797 /* Enable main output and the MN accumulator */
1798 regval |= BIT(23) | BIT(22);
1799
1800 /* Set pre-divider and post-divider values to 1 and 1 */
1801 regval &= ~BIT(19);
1802 regval &= ~BM(21, 20);
1803
1804 /* Set VCO frequency */
1805 regval &= ~BM(17, 16);
1806
1807 writel_relaxed(regval, SC_PLL0_CONFIG_REG);
1808
1809 set_fsm_mode(SC_PLL0_MODE_REG);
1810
Vikram Mulukutla3349d932011-10-12 20:00:34 -07001811 } else if (!(readl_relaxed(SC_PLL0_MODE_REG) & BIT(20)))
Vikram Mulukutla489e39e2011-08-31 18:04:05 -07001812 WARN(1, "PLL9 enabled in non-FSM mode!\n");
1813
Vikram Mulukutla3349d932011-10-12 20:00:34 -07001814 /* Check if PLL14 is enabled in FSM mode */
1815 is_pll_enabled = readl_relaxed(BB_PLL14_STATUS_REG) & BIT(16);
1816
1817 if (!is_pll_enabled) {
1818 writel_relaxed(0x19, BB_PLL14_L_VAL_REG);
1819 writel_relaxed(0x0, BB_PLL14_M_VAL_REG);
1820 writel_relaxed(0x1, BB_PLL14_N_VAL_REG);
1821
1822 regval = readl_relaxed(BB_PLL14_CONFIG_REG);
1823
1824 /* Enable main output and the MN accumulator */
1825 regval |= BIT(23) | BIT(22);
1826
1827 /* Set pre-divider and post-divider values to 1 and 1 */
1828 regval &= ~BIT(19);
1829 regval &= ~BM(21, 20);
1830
1831 /* Set VCO frequency */
1832 regval &= ~BM(17, 16);
1833
1834 writel_relaxed(regval, BB_PLL14_CONFIG_REG);
1835
1836 set_fsm_mode(BB_PLL14_MODE_REG);
1837
1838 } else if (!(readl_relaxed(BB_PLL14_MODE_REG) & BIT(20)))
1839 WARN(1, "PLL14 enabled in non-FSM mode!\n");
1840
Vikram Mulukutla489e39e2011-08-31 18:04:05 -07001841 /* Enable PLL4 source on the LPASS Primary PLL Mux */
1842 regval = readl_relaxed(LCC_PRI_PLL_CLK_CTL_REG);
1843 writel_relaxed(regval | BIT(0), LCC_PRI_PLL_CLK_CTL_REG);
Vikram Mulukutla0ee27882011-11-15 18:25:04 -08001844
1845 /* Disable hardware clock gating on certain clocks */
1846 regval = readl_relaxed(USB_HSIC_HCLK_CTL_REG);
1847 regval &= ~BIT(6);
1848 writel_relaxed(regval, USB_HSIC_HCLK_CTL_REG);
1849
1850 regval = readl_relaxed(CE1_CORE_CLK_CTL_REG);
1851 regval &= ~BIT(6);
1852 writel_relaxed(regval, CE1_CORE_CLK_CTL_REG);
1853
1854 regval = readl_relaxed(USB_HS1_HCLK_CTL_REG);
1855 regval &= ~BIT(6);
1856 writel_relaxed(regval, USB_HS1_HCLK_CTL_REG);
Vikram Mulukutladb89d742012-01-06 15:33:46 -08001857
1858 regval = readl_relaxed(DMA_BAM_HCLK_CTL);
1859 regval &= ~BIT(6);
1860 writel_relaxed(regval, DMA_BAM_HCLK_CTL);
Vikram Mulukutla489e39e2011-08-31 18:04:05 -07001861}
1862
1863/* Local clock driver initialization. */
1864static void __init msm9615_clock_init(void)
1865{
Matt Wagantalled90b002011-12-12 21:22:43 -08001866 xo_cxo = msm_xo_get(MSM_XO_CXO, "clock-9615");
Vikram Mulukutla489e39e2011-08-31 18:04:05 -07001867 if (IS_ERR(xo_cxo)) {
1868 pr_err("%s: msm_xo_get(CXO) failed.\n", __func__);
1869 BUG();
1870 }
1871
Matt Wagantalle18bbc82011-10-06 10:07:28 -07001872 vote_vdd_level(&vdd_dig, VDD_DIG_HIGH);
Vikram Mulukutla489e39e2011-08-31 18:04:05 -07001873
1874 clk_ops_pll.enable = sr_pll_clk_enable;
1875
1876 /* Initialize clock registers. */
1877 reg_init();
1878
1879 /* Initialize rates for clocks that only support one. */
1880 clk_set_rate(&pdm_clk.c, 19200000);
1881 clk_set_rate(&prng_clk.c, 32000000);
1882 clk_set_rate(&usb_hs1_xcvr_clk.c, 60000000);
1883 clk_set_rate(&usb_hs1_sys_clk.c, 60000000);
1884 clk_set_rate(&usb_hsic_xcvr_clk.c, 60000000);
Vikram Mulukutla6c9158f2011-12-08 12:41:20 -08001885 clk_set_rate(&usb_hsic_sys_clk.c, 64000000);
1886 clk_set_rate(&usb_hsic_clk.c, 480000000);
Vikram Mulukutla489e39e2011-08-31 18:04:05 -07001887
1888 /*
1889 * The halt status bits for PDM may be incorrect at boot.
1890 * Toggle these clocks on and off to refresh them.
1891 */
1892 rcg_clk_enable(&pdm_clk.c);
1893 rcg_clk_disable(&pdm_clk.c);
1894}
1895
1896static int __init msm9615_clock_late_init(void)
1897{
Matt Wagantalle18bbc82011-10-06 10:07:28 -07001898 return unvote_vdd_level(&vdd_dig, VDD_DIG_HIGH);
Vikram Mulukutla489e39e2011-08-31 18:04:05 -07001899}
1900
1901struct clock_init_data msm9615_clock_init_data __initdata = {
1902 .table = msm_clocks_9615,
1903 .size = ARRAY_SIZE(msm_clocks_9615),
1904 .init = msm9615_clock_init,
1905 .late_init = msm9615_clock_late_init,
1906};