blob: b7b3f57e0932be9865ae14bb024c90e01b655c32 [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
177#define MN_MODE_DUAL_EDGE 0x2
178
179/* MD Registers */
180#define MD8(m_lsb, m, n_lsb, n) \
181 (BVAL((m_lsb+7), m_lsb, m) | BVAL((n_lsb+7), n_lsb, ~(n)))
182#define MD16(m, n) (BVAL(31, 16, m) | BVAL(15, 0, ~(n)))
183
184/* NS Registers */
185#define NS(n_msb, n_lsb, n, m, mde_lsb, d_msb, d_lsb, d, s_msb, s_lsb, s) \
186 (BVAL(n_msb, n_lsb, ~(n-m)) \
187 | (BVAL((mde_lsb+1), mde_lsb, MN_MODE_DUAL_EDGE) * !!(n)) \
188 | BVAL(d_msb, d_lsb, (d-1)) | BVAL(s_msb, s_lsb, s))
189
190#define NS_SRC_SEL(s_msb, s_lsb, s) \
191 BVAL(s_msb, s_lsb, s)
192
Matt Wagantalle18bbc82011-10-06 10:07:28 -0700193enum vdd_dig_levels {
194 VDD_DIG_NONE,
195 VDD_DIG_LOW,
196 VDD_DIG_NOMINAL,
197 VDD_DIG_HIGH
198};
199
200static int set_vdd_dig(struct clk_vdd_class *vdd_class, int level)
201{
Matt Wagantalle18bbc82011-10-06 10:07:28 -0700202 static const int vdd_uv[] = {
Vikram Mulukutla5e6ab912011-11-04 15:20:19 -0700203 [VDD_DIG_NONE] = 0,
204 [VDD_DIG_LOW] = 945000,
205 [VDD_DIG_NOMINAL] = 1050000,
Matt Wagantalle18bbc82011-10-06 10:07:28 -0700206 [VDD_DIG_HIGH] = 1150000
207 };
208
209 return rpm_vreg_set_voltage(RPM_VREG_ID_PM8018_S1, RPM_VREG_VOTER3,
210 vdd_uv[level], vdd_uv[VDD_DIG_HIGH], 1);
211}
212
213static DEFINE_VDD_CLASS(vdd_dig, set_vdd_dig);
214
215#define VDD_DIG_FMAX_MAP1(l1, f1) \
216 .vdd_class = &vdd_dig, \
217 .fmax[VDD_DIG_##l1] = (f1)
218#define VDD_DIG_FMAX_MAP2(l1, f1, l2, f2) \
219 .vdd_class = &vdd_dig, \
220 .fmax[VDD_DIG_##l1] = (f1), \
221 .fmax[VDD_DIG_##l2] = (f2)
Vikram Mulukutla489e39e2011-08-31 18:04:05 -0700222
223/*
224 * Clock Descriptions
225 */
226
227static struct msm_xo_voter *xo_cxo;
228
229static int cxo_clk_enable(struct clk *clk)
230{
231 return msm_xo_mode_vote(xo_cxo, MSM_XO_MODE_ON);
232}
233
234static void cxo_clk_disable(struct clk *clk)
235{
236 msm_xo_mode_vote(xo_cxo, MSM_XO_MODE_OFF);
237}
238
239static struct clk_ops clk_ops_cxo = {
240 .enable = cxo_clk_enable,
241 .disable = cxo_clk_disable,
242 .get_rate = fixed_clk_get_rate,
243 .is_local = local_clk_is_local,
244};
245
246static struct fixed_clk cxo_clk = {
247 .rate = 19200000,
248 .c = {
249 .dbg_name = "cxo_clk",
250 .ops = &clk_ops_cxo,
251 CLK_INIT(cxo_clk.c),
252 },
253};
254
Vikram Mulukutla31680ae2011-11-04 14:23:55 -0700255static DEFINE_SPINLOCK(soft_vote_lock);
256
257static int pll_acpu_vote_clk_enable(struct clk *clk)
258{
259 int ret = 0;
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 if (!*pll->soft_vote)
266 ret = pll_vote_clk_enable(clk);
267 if (ret == 0)
268 *pll->soft_vote |= (pll->soft_vote_mask);
269
270 spin_unlock_irqrestore(&soft_vote_lock, flags);
271 return ret;
272}
273
274static void pll_acpu_vote_clk_disable(struct clk *clk)
275{
276 unsigned long flags;
277 struct pll_vote_clk *pll = to_pll_vote_clk(clk);
278
279 spin_lock_irqsave(&soft_vote_lock, flags);
280
281 *pll->soft_vote &= ~(pll->soft_vote_mask);
282 if (!*pll->soft_vote)
283 pll_vote_clk_disable(clk);
284
285 spin_unlock_irqrestore(&soft_vote_lock, flags);
286}
287
288static struct clk_ops clk_ops_pll_acpu_vote = {
289 .enable = pll_acpu_vote_clk_enable,
290 .disable = pll_acpu_vote_clk_disable,
291 .auto_off = pll_acpu_vote_clk_disable,
292 .is_enabled = pll_vote_clk_is_enabled,
293 .get_rate = pll_vote_clk_get_rate,
294 .get_parent = pll_vote_clk_get_parent,
295 .is_local = local_clk_is_local,
296};
297
298#define PLL_SOFT_VOTE_PRIMARY BIT(0)
299#define PLL_SOFT_VOTE_ACPU BIT(1)
300
301static unsigned int soft_vote_pll0;
302
Vikram Mulukutla489e39e2011-08-31 18:04:05 -0700303static struct pll_vote_clk pll0_clk = {
304 .rate = 276000000,
305 .en_reg = BB_PLL_ENA_SC0_REG,
306 .en_mask = BIT(0),
307 .status_reg = BB_PLL0_STATUS_REG,
308 .parent = &cxo_clk.c,
Vikram Mulukutla31680ae2011-11-04 14:23:55 -0700309 .soft_vote = &soft_vote_pll0,
310 .soft_vote_mask = PLL_SOFT_VOTE_PRIMARY,
Vikram Mulukutla489e39e2011-08-31 18:04:05 -0700311 .c = {
312 .dbg_name = "pll0_clk",
Vikram Mulukutla31680ae2011-11-04 14:23:55 -0700313 .ops = &clk_ops_pll_acpu_vote,
Vikram Mulukutla489e39e2011-08-31 18:04:05 -0700314 CLK_INIT(pll0_clk.c),
315 },
316};
317
Vikram Mulukutla31680ae2011-11-04 14:23:55 -0700318static struct pll_vote_clk pll0_acpu_clk = {
319 .rate = 276000000,
320 .en_reg = BB_PLL_ENA_SC0_REG,
321 .en_mask = BIT(0),
322 .status_reg = BB_PLL0_STATUS_REG,
323 .soft_vote = &soft_vote_pll0,
324 .soft_vote_mask = PLL_SOFT_VOTE_ACPU,
325 .c = {
326 .dbg_name = "pll0_acpu_clk",
327 .ops = &clk_ops_pll_acpu_vote,
328 CLK_INIT(pll0_acpu_clk.c),
329 },
330};
331
Vikram Mulukutla489e39e2011-08-31 18:04:05 -0700332static struct pll_vote_clk pll4_clk = {
333 .rate = 393216000,
334 .en_reg = BB_PLL_ENA_SC0_REG,
335 .en_mask = BIT(4),
336 .status_reg = LCC_PLL0_STATUS_REG,
337 .parent = &cxo_clk.c,
338 .c = {
339 .dbg_name = "pll4_clk",
340 .ops = &clk_ops_pll_vote,
341 CLK_INIT(pll4_clk.c),
342 },
343};
344
Vikram Mulukutla31680ae2011-11-04 14:23:55 -0700345static unsigned int soft_vote_pll8;
346
Vikram Mulukutla489e39e2011-08-31 18:04:05 -0700347static struct pll_vote_clk pll8_clk = {
348 .rate = 384000000,
349 .en_reg = BB_PLL_ENA_SC0_REG,
350 .en_mask = BIT(8),
351 .status_reg = BB_PLL8_STATUS_REG,
352 .parent = &cxo_clk.c,
Vikram Mulukutla31680ae2011-11-04 14:23:55 -0700353 .soft_vote = &soft_vote_pll8,
354 .soft_vote_mask = PLL_SOFT_VOTE_PRIMARY,
Vikram Mulukutla489e39e2011-08-31 18:04:05 -0700355 .c = {
356 .dbg_name = "pll8_clk",
Vikram Mulukutla31680ae2011-11-04 14:23:55 -0700357 .ops = &clk_ops_pll_acpu_vote,
Vikram Mulukutla489e39e2011-08-31 18:04:05 -0700358 CLK_INIT(pll8_clk.c),
359 },
360};
361
Vikram Mulukutla31680ae2011-11-04 14:23:55 -0700362static struct pll_vote_clk pll8_acpu_clk = {
363 .rate = 384000000,
364 .en_reg = BB_PLL_ENA_SC0_REG,
365 .en_mask = BIT(8),
366 .status_reg = BB_PLL8_STATUS_REG,
367 .soft_vote = &soft_vote_pll8,
368 .soft_vote_mask = PLL_SOFT_VOTE_ACPU,
369 .c = {
370 .dbg_name = "pll8_acpu_clk",
371 .ops = &clk_ops_pll_acpu_vote,
372 CLK_INIT(pll8_acpu_clk.c),
373 },
374};
375
376static unsigned int soft_vote_pll9;
377
Vikram Mulukutla489e39e2011-08-31 18:04:05 -0700378static struct pll_vote_clk pll9_clk = {
379 .rate = 440000000,
380 .en_reg = BB_PLL_ENA_SC0_REG,
381 .en_mask = BIT(9),
382 .status_reg = SC_PLL0_STATUS_REG,
383 .parent = &cxo_clk.c,
Vikram Mulukutla31680ae2011-11-04 14:23:55 -0700384 .soft_vote = &soft_vote_pll9,
385 .soft_vote_mask = PLL_SOFT_VOTE_PRIMARY,
Vikram Mulukutla489e39e2011-08-31 18:04:05 -0700386 .c = {
387 .dbg_name = "pll9_clk",
Vikram Mulukutla31680ae2011-11-04 14:23:55 -0700388 .ops = &clk_ops_pll_acpu_vote,
Vikram Mulukutla489e39e2011-08-31 18:04:05 -0700389 CLK_INIT(pll9_clk.c),
390 },
391};
392
Vikram Mulukutla31680ae2011-11-04 14:23:55 -0700393static struct pll_vote_clk pll9_acpu_clk = {
394 .rate = 440000000,
395 .en_reg = BB_PLL_ENA_SC0_REG,
396 .en_mask = BIT(9),
397 .soft_vote = &soft_vote_pll9,
398 .soft_vote_mask = PLL_SOFT_VOTE_ACPU,
399 .status_reg = SC_PLL0_STATUS_REG,
400 .c = {
401 .dbg_name = "pll9_acpu_clk",
402 .ops = &clk_ops_pll_acpu_vote,
403 CLK_INIT(pll9_acpu_clk.c),
404 },
405};
406
Vikram Mulukutla489e39e2011-08-31 18:04:05 -0700407static struct pll_vote_clk pll14_clk = {
408 .rate = 480000000,
409 .en_reg = BB_PLL_ENA_SC0_REG,
410 .en_mask = BIT(11),
411 .status_reg = BB_PLL14_STATUS_REG,
412 .parent = &cxo_clk.c,
413 .c = {
414 .dbg_name = "pll14_clk",
415 .ops = &clk_ops_pll_vote,
416 CLK_INIT(pll14_clk.c),
417 },
418};
419
Vikram Mulukutla489e39e2011-08-31 18:04:05 -0700420static struct clk_ops clk_ops_rcg_9615 = {
421 .enable = rcg_clk_enable,
422 .disable = rcg_clk_disable,
Matt Wagantall41af0772011-09-17 12:21:39 -0700423 .auto_off = rcg_clk_disable,
Vikram Mulukutla489e39e2011-08-31 18:04:05 -0700424 .set_rate = rcg_clk_set_rate,
Vikram Mulukutla489e39e2011-08-31 18:04:05 -0700425 .get_rate = rcg_clk_get_rate,
426 .list_rate = rcg_clk_list_rate,
427 .is_enabled = rcg_clk_is_enabled,
428 .round_rate = rcg_clk_round_rate,
Stephen Boyd7bf28142011-12-07 00:30:52 -0800429 .reset = rcg_clk_reset,
Vikram Mulukutla489e39e2011-08-31 18:04:05 -0700430 .is_local = local_clk_is_local,
431 .get_parent = rcg_clk_get_parent,
432};
433
434static struct clk_ops clk_ops_branch = {
435 .enable = branch_clk_enable,
436 .disable = branch_clk_disable,
Matt Wagantall41af0772011-09-17 12:21:39 -0700437 .auto_off = branch_clk_disable,
Vikram Mulukutla489e39e2011-08-31 18:04:05 -0700438 .is_enabled = branch_clk_is_enabled,
439 .reset = branch_clk_reset,
440 .is_local = local_clk_is_local,
441 .get_parent = branch_clk_get_parent,
442 .set_parent = branch_clk_set_parent,
443};
444
445/*
446 * Peripheral Clocks
447 */
Matt Wagantall7625a4c2011-11-01 16:17:53 -0700448#define CLK_GP(i, n, h_r, h_b) \
449 struct rcg_clk i##_clk = { \
450 .b = { \
451 .ctl_reg = GPn_NS_REG(n), \
452 .en_mask = BIT(9), \
453 .halt_reg = h_r, \
454 .halt_bit = h_b, \
455 }, \
456 .ns_reg = GPn_NS_REG(n), \
457 .md_reg = GPn_MD_REG(n), \
458 .root_en_mask = BIT(11), \
459 .ns_mask = (BM(23, 16) | BM(6, 0)), \
460 .set_rate = set_rate_mnd, \
461 .freq_tbl = clk_tbl_gp, \
462 .current_freq = &rcg_dummy_freq, \
463 .c = { \
464 .dbg_name = #i "_clk", \
465 .ops = &clk_ops_rcg_9615, \
466 VDD_DIG_FMAX_MAP1(LOW, 27000000), \
467 CLK_INIT(i##_clk.c), \
468 }, \
469 }
470#define F_GP(f, s, d, m, n) \
471 { \
472 .freq_hz = f, \
473 .src_clk = &s##_clk.c, \
474 .md_val = MD8(16, m, 0, n), \
475 .ns_val = NS(23, 16, n, m, 5, 4, 3, d, 2, 0, s##_to_bb_mux), \
476 .mnd_en_mask = BIT(8) * !!(n), \
477 }
478static struct clk_freq_tbl clk_tbl_gp[] = {
479 F_GP( 0, gnd, 1, 0, 0),
480 F_GP( 9600000, cxo, 2, 0, 0),
481 F_GP( 19200000, cxo, 1, 0, 0),
482 F_END
483};
484
485static CLK_GP(gp0, 0, CLK_HALT_SFPB_MISC_STATE_REG, 7);
486static CLK_GP(gp1, 1, CLK_HALT_SFPB_MISC_STATE_REG, 6);
487static CLK_GP(gp2, 2, CLK_HALT_SFPB_MISC_STATE_REG, 5);
488
Vikram Mulukutla489e39e2011-08-31 18:04:05 -0700489#define CLK_GSBI_UART(i, n, h_r, h_b) \
490 struct rcg_clk i##_clk = { \
491 .b = { \
492 .ctl_reg = GSBIn_UART_APPS_NS_REG(n), \
493 .en_mask = BIT(9), \
494 .reset_reg = GSBIn_RESET_REG(n), \
495 .reset_mask = BIT(0), \
496 .halt_reg = h_r, \
497 .halt_bit = h_b, \
498 }, \
499 .ns_reg = GSBIn_UART_APPS_NS_REG(n), \
500 .md_reg = GSBIn_UART_APPS_MD_REG(n), \
501 .root_en_mask = BIT(11), \
502 .ns_mask = (BM(31, 16) | BM(6, 0)), \
503 .set_rate = set_rate_mnd, \
504 .freq_tbl = clk_tbl_gsbi_uart, \
505 .current_freq = &rcg_dummy_freq, \
506 .c = { \
507 .dbg_name = #i "_clk", \
508 .ops = &clk_ops_rcg_9615, \
Matt Wagantalle18bbc82011-10-06 10:07:28 -0700509 VDD_DIG_FMAX_MAP2(LOW, 32000000, NOMINAL, 64000000), \
Vikram Mulukutla489e39e2011-08-31 18:04:05 -0700510 CLK_INIT(i##_clk.c), \
511 }, \
512 }
Matt Wagantalle18bbc82011-10-06 10:07:28 -0700513#define F_GSBI_UART(f, s, d, m, n) \
Vikram Mulukutla489e39e2011-08-31 18:04:05 -0700514 { \
515 .freq_hz = f, \
516 .src_clk = &s##_clk.c, \
517 .md_val = MD16(m, n), \
518 .ns_val = NS(31, 16, n, m, 5, 4, 3, d, 2, 0, s##_to_bb_mux), \
519 .mnd_en_mask = BIT(8) * !!(n), \
Vikram Mulukutla489e39e2011-08-31 18:04:05 -0700520 }
521static struct clk_freq_tbl clk_tbl_gsbi_uart[] = {
Matt Wagantalle18bbc82011-10-06 10:07:28 -0700522 F_GSBI_UART( 0, gnd, 1, 0, 0),
523 F_GSBI_UART( 3686400, pll8, 1, 6, 625),
524 F_GSBI_UART( 7372800, pll8, 1, 12, 625),
525 F_GSBI_UART(14745600, pll8, 1, 24, 625),
526 F_GSBI_UART(16000000, pll8, 4, 1, 6),
527 F_GSBI_UART(24000000, pll8, 4, 1, 4),
528 F_GSBI_UART(32000000, pll8, 4, 1, 3),
529 F_GSBI_UART(40000000, pll8, 1, 5, 48),
530 F_GSBI_UART(46400000, pll8, 1, 29, 240),
531 F_GSBI_UART(48000000, pll8, 4, 1, 2),
532 F_GSBI_UART(51200000, pll8, 1, 2, 15),
533 F_GSBI_UART(56000000, pll8, 1, 7, 48),
534 F_GSBI_UART(58982400, pll8, 1, 96, 625),
535 F_GSBI_UART(64000000, pll8, 2, 1, 3),
Vikram Mulukutla489e39e2011-08-31 18:04:05 -0700536 F_END
537};
538
539static CLK_GSBI_UART(gsbi1_uart, 1, CLK_HALT_CFPB_STATEA_REG, 10);
540static CLK_GSBI_UART(gsbi2_uart, 2, CLK_HALT_CFPB_STATEA_REG, 6);
541static CLK_GSBI_UART(gsbi3_uart, 3, CLK_HALT_CFPB_STATEA_REG, 2);
542static CLK_GSBI_UART(gsbi4_uart, 4, CLK_HALT_CFPB_STATEB_REG, 26);
543static CLK_GSBI_UART(gsbi5_uart, 5, CLK_HALT_CFPB_STATEB_REG, 22);
544
545#define CLK_GSBI_QUP(i, n, h_r, h_b) \
546 struct rcg_clk i##_clk = { \
547 .b = { \
548 .ctl_reg = GSBIn_QUP_APPS_NS_REG(n), \
549 .en_mask = BIT(9), \
550 .reset_reg = GSBIn_RESET_REG(n), \
551 .reset_mask = BIT(0), \
552 .halt_reg = h_r, \
553 .halt_bit = h_b, \
554 }, \
555 .ns_reg = GSBIn_QUP_APPS_NS_REG(n), \
556 .md_reg = GSBIn_QUP_APPS_MD_REG(n), \
557 .root_en_mask = BIT(11), \
558 .ns_mask = (BM(23, 16) | BM(6, 0)), \
559 .set_rate = set_rate_mnd, \
560 .freq_tbl = clk_tbl_gsbi_qup, \
561 .current_freq = &rcg_dummy_freq, \
562 .c = { \
563 .dbg_name = #i "_clk", \
564 .ops = &clk_ops_rcg_9615, \
Matt Wagantalle18bbc82011-10-06 10:07:28 -0700565 VDD_DIG_FMAX_MAP2(LOW, 24000000, NOMINAL, 52000000), \
Vikram Mulukutla489e39e2011-08-31 18:04:05 -0700566 CLK_INIT(i##_clk.c), \
567 }, \
568 }
Matt Wagantalle18bbc82011-10-06 10:07:28 -0700569#define F_GSBI_QUP(f, s, d, m, n) \
Vikram Mulukutla489e39e2011-08-31 18:04:05 -0700570 { \
571 .freq_hz = f, \
572 .src_clk = &s##_clk.c, \
573 .md_val = MD8(16, m, 0, n), \
574 .ns_val = NS(23, 16, n, m, 5, 4, 3, d, 2, 0, s##_to_bb_mux), \
575 .mnd_en_mask = BIT(8) * !!(n), \
Vikram Mulukutla489e39e2011-08-31 18:04:05 -0700576 }
577static struct clk_freq_tbl clk_tbl_gsbi_qup[] = {
Matt Wagantalle18bbc82011-10-06 10:07:28 -0700578 F_GSBI_QUP( 0, gnd, 1, 0, 0),
579 F_GSBI_QUP( 960000, cxo, 4, 1, 5),
580 F_GSBI_QUP( 4800000, cxo, 4, 0, 1),
581 F_GSBI_QUP( 9600000, cxo, 2, 0, 1),
582 F_GSBI_QUP(15058800, pll8, 1, 2, 51),
583 F_GSBI_QUP(24000000, pll8, 4, 1, 4),
584 F_GSBI_QUP(25600000, pll8, 1, 1, 15),
585 F_GSBI_QUP(48000000, pll8, 4, 1, 2),
586 F_GSBI_QUP(51200000, pll8, 1, 2, 15),
Vikram Mulukutla489e39e2011-08-31 18:04:05 -0700587 F_END
588};
589
590static CLK_GSBI_QUP(gsbi1_qup, 1, CLK_HALT_CFPB_STATEA_REG, 9);
591static CLK_GSBI_QUP(gsbi2_qup, 2, CLK_HALT_CFPB_STATEA_REG, 4);
592static CLK_GSBI_QUP(gsbi3_qup, 3, CLK_HALT_CFPB_STATEA_REG, 0);
593static CLK_GSBI_QUP(gsbi4_qup, 4, CLK_HALT_CFPB_STATEB_REG, 24);
594static CLK_GSBI_QUP(gsbi5_qup, 5, CLK_HALT_CFPB_STATEB_REG, 20);
595
Matt Wagantalle18bbc82011-10-06 10:07:28 -0700596#define F_PDM(f, s, d) \
Vikram Mulukutla489e39e2011-08-31 18:04:05 -0700597 { \
598 .freq_hz = f, \
599 .src_clk = &s##_clk.c, \
600 .ns_val = NS_SRC_SEL(1, 0, s##_to_xo_mux), \
Vikram Mulukutla489e39e2011-08-31 18:04:05 -0700601 }
602static struct clk_freq_tbl clk_tbl_pdm[] = {
Matt Wagantalle18bbc82011-10-06 10:07:28 -0700603 F_PDM( 0, gnd, 1),
604 F_PDM(19200000, cxo, 1),
Vikram Mulukutla489e39e2011-08-31 18:04:05 -0700605 F_END
606};
607
608static struct rcg_clk pdm_clk = {
609 .b = {
610 .ctl_reg = PDM_CLK_NS_REG,
611 .en_mask = BIT(9),
612 .reset_reg = PDM_CLK_NS_REG,
613 .reset_mask = BIT(12),
614 .halt_reg = CLK_HALT_CFPB_STATEC_REG,
615 .halt_bit = 3,
616 },
617 .ns_reg = PDM_CLK_NS_REG,
618 .root_en_mask = BIT(11),
619 .ns_mask = BM(1, 0),
620 .set_rate = set_rate_nop,
621 .freq_tbl = clk_tbl_pdm,
622 .current_freq = &rcg_dummy_freq,
623 .c = {
624 .dbg_name = "pdm_clk",
625 .ops = &clk_ops_rcg_9615,
Matt Wagantalle18bbc82011-10-06 10:07:28 -0700626 VDD_DIG_FMAX_MAP1(LOW, 19200000),
Vikram Mulukutla489e39e2011-08-31 18:04:05 -0700627 CLK_INIT(pdm_clk.c),
628 },
629};
630
631static struct branch_clk pmem_clk = {
632 .b = {
633 .ctl_reg = PMEM_ACLK_CTL_REG,
634 .en_mask = BIT(4),
635 .halt_reg = CLK_HALT_DFAB_STATE_REG,
636 .halt_bit = 20,
637 },
638 .c = {
639 .dbg_name = "pmem_clk",
640 .ops = &clk_ops_branch,
641 CLK_INIT(pmem_clk.c),
642 },
643};
644
Matt Wagantalle18bbc82011-10-06 10:07:28 -0700645#define F_PRNG(f, s) \
Vikram Mulukutla489e39e2011-08-31 18:04:05 -0700646 { \
647 .freq_hz = f, \
648 .src_clk = &s##_clk.c, \
Vikram Mulukutla489e39e2011-08-31 18:04:05 -0700649 }
650static struct clk_freq_tbl clk_tbl_prng[] = {
Matt Wagantalle18bbc82011-10-06 10:07:28 -0700651 F_PRNG(32000000, pll8),
Vikram Mulukutla489e39e2011-08-31 18:04:05 -0700652 F_END
653};
654
655static struct rcg_clk prng_clk = {
656 .b = {
657 .ctl_reg = SC0_U_CLK_BRANCH_ENA_VOTE_REG,
658 .en_mask = BIT(10),
659 .halt_reg = CLK_HALT_SFPB_MISC_STATE_REG,
660 .halt_check = HALT_VOTED,
661 .halt_bit = 10,
662 },
663 .set_rate = set_rate_nop,
664 .freq_tbl = clk_tbl_prng,
665 .current_freq = &rcg_dummy_freq,
666 .c = {
667 .dbg_name = "prng_clk",
668 .ops = &clk_ops_rcg_9615,
Matt Wagantalle18bbc82011-10-06 10:07:28 -0700669 VDD_DIG_FMAX_MAP2(LOW, 32000000, NOMINAL, 65000000),
Vikram Mulukutla489e39e2011-08-31 18:04:05 -0700670 CLK_INIT(prng_clk.c),
671 },
672};
673
674#define CLK_SDC(name, n, h_b, f_table) \
675 struct rcg_clk name = { \
676 .b = { \
677 .ctl_reg = SDCn_APPS_CLK_NS_REG(n), \
678 .en_mask = BIT(9), \
679 .reset_reg = SDCn_RESET_REG(n), \
680 .reset_mask = BIT(0), \
681 .halt_reg = CLK_HALT_DFAB_STATE_REG, \
682 .halt_bit = h_b, \
683 }, \
684 .ns_reg = SDCn_APPS_CLK_NS_REG(n), \
685 .md_reg = SDCn_APPS_CLK_MD_REG(n), \
686 .root_en_mask = BIT(11), \
687 .ns_mask = (BM(23, 16) | BM(6, 0)), \
688 .set_rate = set_rate_mnd, \
689 .freq_tbl = f_table, \
690 .current_freq = &rcg_dummy_freq, \
691 .c = { \
692 .dbg_name = #name, \
693 .ops = &clk_ops_rcg_9615, \
Matt Wagantalle18bbc82011-10-06 10:07:28 -0700694 VDD_DIG_FMAX_MAP2(LOW, 25000000, NOMINAL, 50000000), \
Vikram Mulukutla489e39e2011-08-31 18:04:05 -0700695 CLK_INIT(name.c), \
696 }, \
697 }
Matt Wagantalle18bbc82011-10-06 10:07:28 -0700698#define F_SDC(f, s, d, m, n) \
Vikram Mulukutla489e39e2011-08-31 18:04:05 -0700699 { \
700 .freq_hz = f, \
701 .src_clk = &s##_clk.c, \
702 .md_val = MD8(16, m, 0, n), \
703 .ns_val = NS(23, 16, n, m, 5, 4, 3, d, 2, 0, s##_to_bb_mux), \
704 .mnd_en_mask = BIT(8) * !!(n), \
Vikram Mulukutla489e39e2011-08-31 18:04:05 -0700705 }
706static struct clk_freq_tbl clk_tbl_sdc1_2[] = {
Matt Wagantalle18bbc82011-10-06 10:07:28 -0700707 F_SDC( 0, gnd, 1, 0, 0),
708 F_SDC( 144300, cxo, 1, 1, 133),
709 F_SDC( 400000, pll8, 4, 1, 240),
710 F_SDC( 16000000, pll8, 4, 1, 6),
711 F_SDC( 17070000, pll8, 1, 2, 45),
712 F_SDC( 20210000, pll8, 1, 1, 19),
713 F_SDC( 24000000, pll8, 4, 1, 4),
714 F_SDC( 48000000, pll8, 4, 1, 2),
Vikram Mulukutla489e39e2011-08-31 18:04:05 -0700715 F_END
716};
717
718static CLK_SDC(sdc1_clk, 1, 6, clk_tbl_sdc1_2);
719static CLK_SDC(sdc2_clk, 2, 5, clk_tbl_sdc1_2);
720
Matt Wagantalle18bbc82011-10-06 10:07:28 -0700721#define F_USB(f, s, d, m, n) \
Vikram Mulukutla489e39e2011-08-31 18:04:05 -0700722 { \
723 .freq_hz = f, \
724 .src_clk = &s##_clk.c, \
725 .md_val = MD8(16, m, 0, n), \
726 .ns_val = NS(23, 16, n, m, 5, 4, 3, d, 2, 0, s##_to_bb_mux), \
727 .mnd_en_mask = BIT(8) * !!(n), \
Vikram Mulukutla489e39e2011-08-31 18:04:05 -0700728 }
729static struct clk_freq_tbl clk_tbl_usb[] = {
Matt Wagantalle18bbc82011-10-06 10:07:28 -0700730 F_USB( 0, gnd, 1, 0, 0),
731 F_USB(60000000, pll8, 1, 5, 32),
Vikram Mulukutla489e39e2011-08-31 18:04:05 -0700732 F_END
733};
734
Vikram Mulukutla6c9158f2011-12-08 12:41:20 -0800735static struct clk_freq_tbl clk_tbl_usb_hsic_sys[] = {
736 F_USB( 0, gnd, 1, 0, 0),
737 F_USB(64000000, pll8, 1, 1, 6),
738 F_END
739};
740
Vikram Mulukutla489e39e2011-08-31 18:04:05 -0700741static struct rcg_clk usb_hs1_xcvr_clk = {
742 .b = {
743 .ctl_reg = USB_HS1_XCVR_FS_CLK_NS_REG,
744 .en_mask = BIT(9),
745 .reset_reg = USB_HS1_RESET_REG,
746 .reset_mask = BIT(0),
747 .halt_reg = CLK_HALT_DFAB_STATE_REG,
748 .halt_bit = 0,
749 },
750 .ns_reg = USB_HS1_XCVR_FS_CLK_NS_REG,
751 .md_reg = USB_HS1_XCVR_FS_CLK_MD_REG,
752 .root_en_mask = BIT(11),
753 .ns_mask = (BM(23, 16) | BM(6, 0)),
754 .set_rate = set_rate_mnd,
755 .freq_tbl = clk_tbl_usb,
756 .current_freq = &rcg_dummy_freq,
757 .c = {
758 .dbg_name = "usb_hs1_xcvr_clk",
759 .ops = &clk_ops_rcg_9615,
Matt Wagantalle18bbc82011-10-06 10:07:28 -0700760 VDD_DIG_FMAX_MAP1(NOMINAL, 60000000),
Vikram Mulukutla489e39e2011-08-31 18:04:05 -0700761 CLK_INIT(usb_hs1_xcvr_clk.c),
762 },
763};
764
765static struct rcg_clk usb_hs1_sys_clk = {
766 .b = {
767 .ctl_reg = USB_HS1_SYS_CLK_NS_REG,
768 .en_mask = BIT(9),
769 .reset_reg = USB_HS1_RESET_REG,
770 .reset_mask = BIT(0),
771 .halt_reg = CLK_HALT_DFAB_STATE_REG,
772 .halt_bit = 4,
773 },
774 .ns_reg = USB_HS1_SYS_CLK_NS_REG,
775 .md_reg = USB_HS1_SYS_CLK_MD_REG,
776 .root_en_mask = BIT(11),
777 .ns_mask = (BM(23, 16) | BM(6, 0)),
778 .set_rate = set_rate_mnd,
779 .freq_tbl = clk_tbl_usb,
780 .current_freq = &rcg_dummy_freq,
781 .c = {
782 .dbg_name = "usb_hs1_sys_clk",
783 .ops = &clk_ops_rcg_9615,
Matt Wagantalle18bbc82011-10-06 10:07:28 -0700784 VDD_DIG_FMAX_MAP1(NOMINAL, 60000000),
Vikram Mulukutla489e39e2011-08-31 18:04:05 -0700785 CLK_INIT(usb_hs1_sys_clk.c),
786 },
787};
788
789static struct rcg_clk usb_hsic_xcvr_clk = {
790 .b = {
791 .ctl_reg = USB_HSIC_XCVR_FS_CLK_NS_REG,
792 .en_mask = BIT(9),
793 .reset_reg = USB_HSIC_RESET_REG,
794 .reset_mask = BIT(0),
795 .halt_reg = CLK_HALT_DFAB_STATE_REG,
796 .halt_bit = 9,
797 },
798 .ns_reg = USB_HSIC_XCVR_FS_CLK_NS_REG,
799 .md_reg = USB_HSIC_XCVR_FS_CLK_MD_REG,
800 .root_en_mask = BIT(11),
801 .ns_mask = (BM(23, 16) | BM(6, 0)),
802 .set_rate = set_rate_mnd,
803 .freq_tbl = clk_tbl_usb,
804 .current_freq = &rcg_dummy_freq,
805 .c = {
806 .dbg_name = "usb_hsic_xcvr_clk",
807 .ops = &clk_ops_rcg_9615,
Vikram Mulukutla6c9158f2011-12-08 12:41:20 -0800808 VDD_DIG_FMAX_MAP1(LOW, 60000000),
Vikram Mulukutla489e39e2011-08-31 18:04:05 -0700809 CLK_INIT(usb_hsic_xcvr_clk.c),
810 },
811};
812
813static struct rcg_clk usb_hsic_sys_clk = {
814 .b = {
815 .ctl_reg = USB_HSIC_SYSTEM_CLK_NS_REG,
816 .en_mask = BIT(9),
817 .reset_reg = USB_HSIC_RESET_REG,
818 .reset_mask = BIT(0),
819 .halt_reg = CLK_HALT_DFAB_STATE_REG,
820 .halt_bit = 7,
821 },
822 .ns_reg = USB_HSIC_SYSTEM_CLK_NS_REG,
823 .md_reg = USB_HSIC_SYSTEM_CLK_MD_REG,
824 .root_en_mask = BIT(11),
825 .ns_mask = (BM(23, 16) | BM(6, 0)),
826 .set_rate = set_rate_mnd,
Vikram Mulukutla6c9158f2011-12-08 12:41:20 -0800827 .freq_tbl = clk_tbl_usb_hsic_sys,
Vikram Mulukutla489e39e2011-08-31 18:04:05 -0700828 .current_freq = &rcg_dummy_freq,
829 .c = {
830 .dbg_name = "usb_hsic_sys_clk",
831 .ops = &clk_ops_rcg_9615,
Vikram Mulukutla6c9158f2011-12-08 12:41:20 -0800832 VDD_DIG_FMAX_MAP1(LOW, 64000000),
Vikram Mulukutla489e39e2011-08-31 18:04:05 -0700833 CLK_INIT(usb_hsic_sys_clk.c),
834 },
835};
836
837static struct clk_freq_tbl clk_tbl_usb_hsic[] = {
Matt Wagantalle18bbc82011-10-06 10:07:28 -0700838 F_USB( 0, gnd, 1, 0, 0),
Vikram Mulukutla6c9158f2011-12-08 12:41:20 -0800839 F_USB(480000000, pll14, 1, 0, 0),
Vikram Mulukutla489e39e2011-08-31 18:04:05 -0700840 F_END
841};
842
843static struct rcg_clk usb_hsic_clk = {
844 .b = {
845 .ctl_reg = USB_HSIC_CLK_NS_REG,
846 .en_mask = BIT(9),
847 .reset_reg = USB_HSIC_RESET_REG,
848 .reset_mask = BIT(0),
Vikram Mulukutla6c9158f2011-12-08 12:41:20 -0800849 .halt_check = DELAY,
Vikram Mulukutla489e39e2011-08-31 18:04:05 -0700850 },
851 .ns_reg = USB_HSIC_CLK_NS_REG,
852 .md_reg = USB_HSIC_CLK_MD_REG,
853 .root_en_mask = BIT(11),
854 .ns_mask = (BM(23, 16) | BM(6, 0)),
855 .set_rate = set_rate_mnd,
856 .freq_tbl = clk_tbl_usb_hsic,
857 .current_freq = &rcg_dummy_freq,
858 .c = {
859 .dbg_name = "usb_hsic_clk",
860 .ops = &clk_ops_rcg_9615,
Vikram Mulukutla6c9158f2011-12-08 12:41:20 -0800861 VDD_DIG_FMAX_MAP1(LOW, 480000000),
Vikram Mulukutla489e39e2011-08-31 18:04:05 -0700862 CLK_INIT(usb_hsic_clk.c),
863 },
864};
865
866static struct branch_clk usb_hsic_hsio_cal_clk = {
867 .b = {
868 .ctl_reg = USB_HSIC_HSIO_CAL_CLK_CTL_REG,
869 .en_mask = BIT(0),
870 .halt_reg = CLK_HALT_DFAB_STATE_REG,
871 .halt_bit = 8,
872 },
873 .parent = &cxo_clk.c,
874 .c = {
875 .dbg_name = "usb_hsic_hsio_cal_clk",
876 .ops = &clk_ops_branch,
877 CLK_INIT(usb_hsic_hsio_cal_clk.c),
878 },
879};
880
881/* Fast Peripheral Bus Clocks */
882static struct branch_clk ce1_core_clk = {
883 .b = {
884 .ctl_reg = CE1_CORE_CLK_CTL_REG,
885 .en_mask = BIT(4),
886 .halt_reg = CLK_HALT_CFPB_STATEC_REG,
887 .halt_bit = 27,
888 },
889 .c = {
890 .dbg_name = "ce1_core_clk",
891 .ops = &clk_ops_branch,
892 CLK_INIT(ce1_core_clk.c),
893 },
894};
895static struct branch_clk ce1_p_clk = {
896 .b = {
897 .ctl_reg = CE1_HCLK_CTL_REG,
898 .en_mask = BIT(4),
899 .halt_reg = CLK_HALT_CFPB_STATEC_REG,
900 .halt_bit = 1,
901 },
902 .c = {
903 .dbg_name = "ce1_p_clk",
904 .ops = &clk_ops_branch,
905 CLK_INIT(ce1_p_clk.c),
906 },
907};
908
909static struct branch_clk dma_bam_p_clk = {
910 .b = {
911 .ctl_reg = DMA_BAM_HCLK_CTL,
912 .en_mask = BIT(4),
913 .halt_reg = CLK_HALT_DFAB_STATE_REG,
914 .halt_bit = 12,
915 },
916 .c = {
917 .dbg_name = "dma_bam_p_clk",
918 .ops = &clk_ops_branch,
919 CLK_INIT(dma_bam_p_clk.c),
920 },
921};
922
923static struct branch_clk gsbi1_p_clk = {
924 .b = {
925 .ctl_reg = GSBIn_HCLK_CTL_REG(1),
926 .en_mask = BIT(4),
927 .halt_reg = CLK_HALT_CFPB_STATEA_REG,
928 .halt_bit = 11,
929 },
930 .c = {
931 .dbg_name = "gsbi1_p_clk",
932 .ops = &clk_ops_branch,
933 CLK_INIT(gsbi1_p_clk.c),
934 },
935};
936
937static struct branch_clk gsbi2_p_clk = {
938 .b = {
939 .ctl_reg = GSBIn_HCLK_CTL_REG(2),
940 .en_mask = BIT(4),
941 .halt_reg = CLK_HALT_CFPB_STATEA_REG,
942 .halt_bit = 7,
943 },
944 .c = {
945 .dbg_name = "gsbi2_p_clk",
946 .ops = &clk_ops_branch,
947 CLK_INIT(gsbi2_p_clk.c),
948 },
949};
950
951static struct branch_clk gsbi3_p_clk = {
952 .b = {
953 .ctl_reg = GSBIn_HCLK_CTL_REG(3),
954 .en_mask = BIT(4),
955 .halt_reg = CLK_HALT_CFPB_STATEA_REG,
956 .halt_bit = 3,
957 },
958 .c = {
959 .dbg_name = "gsbi3_p_clk",
960 .ops = &clk_ops_branch,
961 CLK_INIT(gsbi3_p_clk.c),
962 },
963};
964
965static struct branch_clk gsbi4_p_clk = {
966 .b = {
967 .ctl_reg = GSBIn_HCLK_CTL_REG(4),
968 .en_mask = BIT(4),
969 .halt_reg = CLK_HALT_CFPB_STATEB_REG,
970 .halt_bit = 27,
971 },
972 .c = {
973 .dbg_name = "gsbi4_p_clk",
974 .ops = &clk_ops_branch,
975 CLK_INIT(gsbi4_p_clk.c),
976 },
977};
978
979static struct branch_clk gsbi5_p_clk = {
980 .b = {
981 .ctl_reg = GSBIn_HCLK_CTL_REG(5),
982 .en_mask = BIT(4),
983 .halt_reg = CLK_HALT_CFPB_STATEB_REG,
984 .halt_bit = 23,
985 },
986 .c = {
987 .dbg_name = "gsbi5_p_clk",
988 .ops = &clk_ops_branch,
989 CLK_INIT(gsbi5_p_clk.c),
990 },
991};
992
993static struct branch_clk usb_hs1_p_clk = {
994 .b = {
995 .ctl_reg = USB_HS1_HCLK_CTL_REG,
996 .en_mask = BIT(4),
997 .halt_reg = CLK_HALT_DFAB_STATE_REG,
998 .halt_bit = 1,
999 },
1000 .c = {
1001 .dbg_name = "usb_hs1_p_clk",
1002 .ops = &clk_ops_branch,
1003 CLK_INIT(usb_hs1_p_clk.c),
1004 },
1005};
1006
1007static struct branch_clk usb_hsic_p_clk = {
1008 .b = {
1009 .ctl_reg = USB_HSIC_HCLK_CTL_REG,
1010 .en_mask = BIT(4),
1011 .halt_reg = CLK_HALT_DFAB_STATE_REG,
1012 .halt_bit = 3,
1013 },
1014 .c = {
1015 .dbg_name = "usb_hsic_p_clk",
1016 .ops = &clk_ops_branch,
1017 CLK_INIT(usb_hsic_p_clk.c),
1018 },
1019};
1020
1021static struct branch_clk sdc1_p_clk = {
1022 .b = {
1023 .ctl_reg = SDCn_HCLK_CTL_REG(1),
1024 .en_mask = BIT(4),
1025 .halt_reg = CLK_HALT_DFAB_STATE_REG,
1026 .halt_bit = 11,
1027 },
1028 .c = {
1029 .dbg_name = "sdc1_p_clk",
1030 .ops = &clk_ops_branch,
1031 CLK_INIT(sdc1_p_clk.c),
1032 },
1033};
1034
1035static struct branch_clk sdc2_p_clk = {
1036 .b = {
1037 .ctl_reg = SDCn_HCLK_CTL_REG(2),
1038 .en_mask = BIT(4),
1039 .halt_reg = CLK_HALT_DFAB_STATE_REG,
1040 .halt_bit = 10,
1041 },
1042 .c = {
1043 .dbg_name = "sdc2_p_clk",
1044 .ops = &clk_ops_branch,
1045 CLK_INIT(sdc2_p_clk.c),
1046 },
1047};
1048
1049/* HW-Voteable Clocks */
1050static struct branch_clk adm0_clk = {
1051 .b = {
1052 .ctl_reg = SC0_U_CLK_BRANCH_ENA_VOTE_REG,
1053 .en_mask = BIT(2),
1054 .halt_reg = CLK_HALT_MSS_KPSS_MISC_STATE_REG,
1055 .halt_check = HALT_VOTED,
1056 .halt_bit = 14,
1057 },
1058 .c = {
1059 .dbg_name = "adm0_clk",
1060 .ops = &clk_ops_branch,
1061 CLK_INIT(adm0_clk.c),
1062 },
1063};
1064
1065static struct branch_clk adm0_p_clk = {
1066 .b = {
1067 .ctl_reg = SC0_U_CLK_BRANCH_ENA_VOTE_REG,
1068 .en_mask = BIT(3),
1069 .halt_reg = CLK_HALT_MSS_KPSS_MISC_STATE_REG,
1070 .halt_check = HALT_VOTED,
1071 .halt_bit = 13,
1072 },
1073 .c = {
1074 .dbg_name = "adm0_p_clk",
1075 .ops = &clk_ops_branch,
1076 CLK_INIT(adm0_p_clk.c),
1077 },
1078};
1079
1080static struct branch_clk pmic_arb0_p_clk = {
1081 .b = {
1082 .ctl_reg = SC0_U_CLK_BRANCH_ENA_VOTE_REG,
1083 .en_mask = BIT(8),
1084 .halt_reg = CLK_HALT_SFPB_MISC_STATE_REG,
1085 .halt_check = HALT_VOTED,
1086 .halt_bit = 22,
1087 },
1088 .c = {
1089 .dbg_name = "pmic_arb0_p_clk",
1090 .ops = &clk_ops_branch,
1091 CLK_INIT(pmic_arb0_p_clk.c),
1092 },
1093};
1094
1095static struct branch_clk pmic_arb1_p_clk = {
1096 .b = {
1097 .ctl_reg = SC0_U_CLK_BRANCH_ENA_VOTE_REG,
1098 .en_mask = BIT(9),
1099 .halt_reg = CLK_HALT_SFPB_MISC_STATE_REG,
1100 .halt_check = HALT_VOTED,
1101 .halt_bit = 21,
1102 },
1103 .c = {
1104 .dbg_name = "pmic_arb1_p_clk",
1105 .ops = &clk_ops_branch,
1106 CLK_INIT(pmic_arb1_p_clk.c),
1107 },
1108};
1109
1110static struct branch_clk pmic_ssbi2_clk = {
1111 .b = {
1112 .ctl_reg = SC0_U_CLK_BRANCH_ENA_VOTE_REG,
1113 .en_mask = BIT(7),
1114 .halt_reg = CLK_HALT_SFPB_MISC_STATE_REG,
1115 .halt_check = HALT_VOTED,
1116 .halt_bit = 23,
1117 },
1118 .c = {
1119 .dbg_name = "pmic_ssbi2_clk",
1120 .ops = &clk_ops_branch,
1121 CLK_INIT(pmic_ssbi2_clk.c),
1122 },
1123};
1124
1125static struct branch_clk rpm_msg_ram_p_clk = {
1126 .b = {
1127 .ctl_reg = SC0_U_CLK_BRANCH_ENA_VOTE_REG,
1128 .en_mask = BIT(6),
1129 .halt_reg = CLK_HALT_SFPB_MISC_STATE_REG,
1130 .halt_check = HALT_VOTED,
1131 .halt_bit = 12,
1132 },
1133 .c = {
1134 .dbg_name = "rpm_msg_ram_p_clk",
1135 .ops = &clk_ops_branch,
1136 CLK_INIT(rpm_msg_ram_p_clk.c),
1137 },
1138};
1139
1140/*
1141 * Low Power Audio Clocks
1142 */
Matt Wagantalle18bbc82011-10-06 10:07:28 -07001143#define F_AIF_OSR(f, s, d, m, n) \
Vikram Mulukutla489e39e2011-08-31 18:04:05 -07001144 { \
1145 .freq_hz = f, \
1146 .src_clk = &s##_clk.c, \
1147 .md_val = MD8(8, m, 0, n), \
1148 .ns_val = NS(31, 24, n, m, 5, 4, 3, d, 2, 0, s##_to_lpa_mux), \
1149 .mnd_en_mask = BIT(8) * !!(n), \
Vikram Mulukutla489e39e2011-08-31 18:04:05 -07001150 }
1151static struct clk_freq_tbl clk_tbl_aif_osr[] = {
Matt Wagantalle18bbc82011-10-06 10:07:28 -07001152 F_AIF_OSR( 0, gnd, 1, 0, 0),
1153 F_AIF_OSR( 512000, pll4, 4, 1, 192),
1154 F_AIF_OSR( 768000, pll4, 4, 1, 128),
1155 F_AIF_OSR( 1024000, pll4, 4, 1, 96),
1156 F_AIF_OSR( 1536000, pll4, 4, 1, 64),
1157 F_AIF_OSR( 2048000, pll4, 4, 1, 48),
1158 F_AIF_OSR( 3072000, pll4, 4, 1, 32),
1159 F_AIF_OSR( 4096000, pll4, 4, 1, 24),
1160 F_AIF_OSR( 6144000, pll4, 4, 1, 16),
1161 F_AIF_OSR( 8192000, pll4, 4, 1, 12),
1162 F_AIF_OSR(12288000, pll4, 4, 1, 8),
1163 F_AIF_OSR(24576000, pll4, 4, 1, 4),
Vikram Mulukutla489e39e2011-08-31 18:04:05 -07001164 F_END
1165};
1166
1167#define CLK_AIF_OSR(i, ns, md, h_r) \
1168 struct rcg_clk i##_clk = { \
1169 .b = { \
1170 .ctl_reg = ns, \
1171 .en_mask = BIT(17), \
1172 .reset_reg = ns, \
1173 .reset_mask = BIT(19), \
1174 .halt_reg = h_r, \
1175 .halt_check = ENABLE, \
1176 .halt_bit = 1, \
1177 }, \
1178 .ns_reg = ns, \
1179 .md_reg = md, \
1180 .root_en_mask = BIT(9), \
1181 .ns_mask = (BM(31, 24) | BM(6, 0)), \
1182 .set_rate = set_rate_mnd, \
1183 .freq_tbl = clk_tbl_aif_osr, \
1184 .current_freq = &rcg_dummy_freq, \
1185 .c = { \
1186 .dbg_name = #i "_clk", \
1187 .ops = &clk_ops_rcg_9615, \
1188 CLK_INIT(i##_clk.c), \
1189 }, \
1190 }
1191#define CLK_AIF_OSR_DIV(i, ns, md, h_r) \
1192 struct rcg_clk i##_clk = { \
1193 .b = { \
1194 .ctl_reg = ns, \
1195 .en_mask = BIT(21), \
1196 .reset_reg = ns, \
1197 .reset_mask = BIT(23), \
1198 .halt_reg = h_r, \
1199 .halt_check = ENABLE, \
1200 .halt_bit = 1, \
1201 }, \
1202 .ns_reg = ns, \
1203 .md_reg = md, \
1204 .root_en_mask = BIT(9), \
1205 .ns_mask = (BM(31, 24) | BM(6, 0)), \
1206 .set_rate = set_rate_mnd, \
1207 .freq_tbl = clk_tbl_aif_osr, \
1208 .current_freq = &rcg_dummy_freq, \
1209 .c = { \
1210 .dbg_name = #i "_clk", \
1211 .ops = &clk_ops_rcg_9615, \
1212 CLK_INIT(i##_clk.c), \
1213 }, \
1214 }
1215
Vikram Mulukutla489e39e2011-08-31 18:04:05 -07001216#define CLK_AIF_BIT(i, ns, h_r) \
Stephen Boyd9fd19642011-11-16 11:11:09 -08001217 struct cdiv_clk i##_clk = { \
Vikram Mulukutla489e39e2011-08-31 18:04:05 -07001218 .b = { \
1219 .ctl_reg = ns, \
1220 .en_mask = BIT(15), \
1221 .halt_reg = h_r, \
1222 .halt_check = DELAY, \
1223 }, \
1224 .ns_reg = ns, \
Stephen Boyd9fd19642011-11-16 11:11:09 -08001225 .ext_mask = BIT(14), \
1226 .div_offset = 10, \
1227 .max_div = 16, \
Vikram Mulukutla489e39e2011-08-31 18:04:05 -07001228 .c = { \
1229 .dbg_name = #i "_clk", \
Stephen Boyd9fd19642011-11-16 11:11:09 -08001230 .ops = &clk_ops_cdiv, \
Vikram Mulukutla489e39e2011-08-31 18:04:05 -07001231 CLK_INIT(i##_clk.c), \
1232 }, \
1233 }
1234
Vikram Mulukutla489e39e2011-08-31 18:04:05 -07001235#define CLK_AIF_BIT_DIV(i, ns, h_r) \
Stephen Boyd9fd19642011-11-16 11:11:09 -08001236 struct cdiv_clk i##_clk = { \
Vikram Mulukutla489e39e2011-08-31 18:04:05 -07001237 .b = { \
1238 .ctl_reg = ns, \
1239 .en_mask = BIT(19), \
1240 .halt_reg = h_r, \
1241 .halt_check = ENABLE, \
1242 }, \
1243 .ns_reg = ns, \
Stephen Boyd9fd19642011-11-16 11:11:09 -08001244 .ext_mask = BIT(18), \
1245 .div_offset = 10, \
1246 .max_div = 256, \
Vikram Mulukutla489e39e2011-08-31 18:04:05 -07001247 .c = { \
1248 .dbg_name = #i "_clk", \
Stephen Boyd9fd19642011-11-16 11:11:09 -08001249 .ops = &clk_ops_cdiv, \
Vikram Mulukutla489e39e2011-08-31 18:04:05 -07001250 CLK_INIT(i##_clk.c), \
1251 }, \
1252 }
1253
1254static CLK_AIF_OSR(mi2s_osr, LCC_MI2S_NS_REG, LCC_MI2S_MD_REG,
1255 LCC_MI2S_STATUS_REG);
1256static CLK_AIF_BIT(mi2s_bit, LCC_MI2S_NS_REG, LCC_MI2S_STATUS_REG);
1257
1258static CLK_AIF_OSR_DIV(codec_i2s_mic_osr, LCC_CODEC_I2S_MIC_NS_REG,
1259 LCC_CODEC_I2S_MIC_MD_REG, LCC_CODEC_I2S_MIC_STATUS_REG);
1260static CLK_AIF_BIT_DIV(codec_i2s_mic_bit, LCC_CODEC_I2S_MIC_NS_REG,
1261 LCC_CODEC_I2S_MIC_STATUS_REG);
1262
1263static CLK_AIF_OSR_DIV(spare_i2s_mic_osr, LCC_SPARE_I2S_MIC_NS_REG,
1264 LCC_SPARE_I2S_MIC_MD_REG, LCC_SPARE_I2S_MIC_STATUS_REG);
1265static CLK_AIF_BIT_DIV(spare_i2s_mic_bit, LCC_SPARE_I2S_MIC_NS_REG,
1266 LCC_SPARE_I2S_MIC_STATUS_REG);
1267
1268static CLK_AIF_OSR_DIV(codec_i2s_spkr_osr, LCC_CODEC_I2S_SPKR_NS_REG,
1269 LCC_CODEC_I2S_SPKR_MD_REG, LCC_CODEC_I2S_SPKR_STATUS_REG);
1270static CLK_AIF_BIT_DIV(codec_i2s_spkr_bit, LCC_CODEC_I2S_SPKR_NS_REG,
1271 LCC_CODEC_I2S_SPKR_STATUS_REG);
1272
1273static CLK_AIF_OSR_DIV(spare_i2s_spkr_osr, LCC_SPARE_I2S_SPKR_NS_REG,
1274 LCC_SPARE_I2S_SPKR_MD_REG, LCC_SPARE_I2S_SPKR_STATUS_REG);
1275static CLK_AIF_BIT_DIV(spare_i2s_spkr_bit, LCC_SPARE_I2S_SPKR_NS_REG,
1276 LCC_SPARE_I2S_SPKR_STATUS_REG);
1277
Matt Wagantalle18bbc82011-10-06 10:07:28 -07001278#define F_PCM(f, s, d, m, n) \
Vikram Mulukutla489e39e2011-08-31 18:04:05 -07001279 { \
1280 .freq_hz = f, \
1281 .src_clk = &s##_clk.c, \
1282 .md_val = MD16(m, n), \
1283 .ns_val = NS(31, 16, n, m, 5, 4, 3, d, 2, 0, s##_to_lpa_mux), \
1284 .mnd_en_mask = BIT(8) * !!(n), \
Vikram Mulukutla489e39e2011-08-31 18:04:05 -07001285 }
1286static struct clk_freq_tbl clk_tbl_pcm[] = {
Matt Wagantalle18bbc82011-10-06 10:07:28 -07001287 F_PCM( 0, gnd, 1, 0, 0),
1288 F_PCM( 512000, pll4, 4, 1, 192),
1289 F_PCM( 768000, pll4, 4, 1, 128),
1290 F_PCM( 1024000, pll4, 4, 1, 96),
1291 F_PCM( 1536000, pll4, 4, 1, 64),
1292 F_PCM( 2048000, pll4, 4, 1, 48),
1293 F_PCM( 3072000, pll4, 4, 1, 32),
1294 F_PCM( 4096000, pll4, 4, 1, 24),
1295 F_PCM( 6144000, pll4, 4, 1, 16),
1296 F_PCM( 8192000, pll4, 4, 1, 12),
1297 F_PCM(12288000, pll4, 4, 1, 8),
1298 F_PCM(24576000, pll4, 4, 1, 4),
Vikram Mulukutla489e39e2011-08-31 18:04:05 -07001299 F_END
1300};
1301
1302static struct rcg_clk pcm_clk = {
1303 .b = {
1304 .ctl_reg = LCC_PCM_NS_REG,
1305 .en_mask = BIT(11),
1306 .reset_reg = LCC_PCM_NS_REG,
1307 .reset_mask = BIT(13),
1308 .halt_reg = LCC_PCM_STATUS_REG,
1309 .halt_check = ENABLE,
1310 .halt_bit = 0,
1311 },
1312 .ns_reg = LCC_PCM_NS_REG,
1313 .md_reg = LCC_PCM_MD_REG,
1314 .root_en_mask = BIT(9),
1315 .ns_mask = (BM(31, 16) | BM(6, 0)),
1316 .set_rate = set_rate_mnd,
1317 .freq_tbl = clk_tbl_pcm,
1318 .current_freq = &rcg_dummy_freq,
1319 .c = {
1320 .dbg_name = "pcm_clk",
1321 .ops = &clk_ops_rcg_9615,
Matt Wagantalle18bbc82011-10-06 10:07:28 -07001322 VDD_DIG_FMAX_MAP1(LOW, 24576000),
Vikram Mulukutla489e39e2011-08-31 18:04:05 -07001323 CLK_INIT(pcm_clk.c),
1324 },
1325};
1326
1327static struct rcg_clk audio_slimbus_clk = {
1328 .b = {
1329 .ctl_reg = LCC_SLIMBUS_NS_REG,
1330 .en_mask = BIT(10),
1331 .reset_reg = LCC_AHBEX_BRANCH_CTL_REG,
1332 .reset_mask = BIT(5),
1333 .halt_reg = LCC_SLIMBUS_STATUS_REG,
1334 .halt_check = ENABLE,
1335 .halt_bit = 0,
1336 },
1337 .ns_reg = LCC_SLIMBUS_NS_REG,
1338 .md_reg = LCC_SLIMBUS_MD_REG,
1339 .root_en_mask = BIT(9),
1340 .ns_mask = (BM(31, 24) | BM(6, 0)),
1341 .set_rate = set_rate_mnd,
1342 .freq_tbl = clk_tbl_aif_osr,
1343 .current_freq = &rcg_dummy_freq,
1344 .c = {
1345 .dbg_name = "audio_slimbus_clk",
1346 .ops = &clk_ops_rcg_9615,
Matt Wagantalle18bbc82011-10-06 10:07:28 -07001347 VDD_DIG_FMAX_MAP1(LOW, 24576000),
Vikram Mulukutla489e39e2011-08-31 18:04:05 -07001348 CLK_INIT(audio_slimbus_clk.c),
1349 },
1350};
1351
1352static struct branch_clk sps_slimbus_clk = {
1353 .b = {
1354 .ctl_reg = LCC_SLIMBUS_NS_REG,
1355 .en_mask = BIT(12),
1356 .halt_reg = LCC_SLIMBUS_STATUS_REG,
1357 .halt_check = ENABLE,
1358 .halt_bit = 1,
1359 },
1360 .parent = &audio_slimbus_clk.c,
1361 .c = {
1362 .dbg_name = "sps_slimbus_clk",
1363 .ops = &clk_ops_branch,
1364 CLK_INIT(sps_slimbus_clk.c),
1365 },
1366};
1367
1368static struct branch_clk slimbus_xo_src_clk = {
1369 .b = {
1370 .ctl_reg = SLIMBUS_XO_SRC_CLK_CTL_REG,
1371 .en_mask = BIT(2),
1372 .halt_reg = CLK_HALT_DFAB_STATE_REG,
1373 .halt_bit = 28,
1374 },
1375 .parent = &sps_slimbus_clk.c,
1376 .c = {
1377 .dbg_name = "slimbus_xo_src_clk",
1378 .ops = &clk_ops_branch,
1379 CLK_INIT(slimbus_xo_src_clk.c),
1380 },
1381};
1382
Vikram Mulukutla73d42112011-09-19 16:32:54 -07001383DEFINE_CLK_RPM(cfpb_clk, cfpb_a_clk, CFPB, NULL);
1384DEFINE_CLK_RPM(dfab_clk, dfab_a_clk, DAYTONA_FABRIC, NULL);
1385DEFINE_CLK_RPM(ebi1_clk, ebi1_a_clk, EBI1, NULL);
1386DEFINE_CLK_RPM(sfab_clk, sfab_a_clk, SYSTEM_FABRIC, NULL);
1387DEFINE_CLK_RPM(sfpb_clk, sfpb_a_clk, SFPB, NULL);
1388
1389static DEFINE_CLK_VOTER(dfab_usb_hs_clk, &dfab_clk.c);
1390static DEFINE_CLK_VOTER(dfab_sdc1_clk, &dfab_clk.c);
1391static DEFINE_CLK_VOTER(dfab_sdc2_clk, &dfab_clk.c);
1392static DEFINE_CLK_VOTER(dfab_sps_clk, &dfab_clk.c);
Vikram Mulukutlacfd73ad2011-11-09 11:39:34 -08001393static DEFINE_CLK_VOTER(dfab_bam_dmux_clk, &dfab_clk.c);
Vikram Mulukutla73d42112011-09-19 16:32:54 -07001394static DEFINE_CLK_VOTER(ebi1_msmbus_clk, &ebi1_clk.c);
Vikram Mulukutla489e39e2011-08-31 18:04:05 -07001395
1396/*
1397 * TODO: replace dummy_clk below with ebi1_clk.c once the
1398 * bus driver starts voting on ebi1 rates.
1399 */
1400static DEFINE_CLK_VOTER(ebi1_adm_clk, &dummy_clk);
1401
1402#ifdef CONFIG_DEBUG_FS
1403struct measure_sel {
1404 u32 test_vector;
1405 struct clk *clk;
1406};
1407
Vikram Mulukutlaefd64f52012-01-09 17:41:09 -08001408static DEFINE_CLK_MEASURE(q6sw_clk);
1409static DEFINE_CLK_MEASURE(q6fw_clk);
1410static DEFINE_CLK_MEASURE(q6_func_clk);
1411
Vikram Mulukutla489e39e2011-08-31 18:04:05 -07001412static struct measure_sel measure_mux[] = {
1413 { TEST_PER_LS(0x08), &slimbus_xo_src_clk.c },
1414 { TEST_PER_LS(0x12), &sdc1_p_clk.c },
1415 { TEST_PER_LS(0x13), &sdc1_clk.c },
1416 { TEST_PER_LS(0x14), &sdc2_p_clk.c },
1417 { TEST_PER_LS(0x15), &sdc2_clk.c },
Matt Wagantall7625a4c2011-11-01 16:17:53 -07001418 { TEST_PER_LS(0x1F), &gp0_clk.c },
1419 { TEST_PER_LS(0x20), &gp1_clk.c },
1420 { TEST_PER_LS(0x21), &gp2_clk.c },
Vikram Mulukutla489e39e2011-08-31 18:04:05 -07001421 { TEST_PER_LS(0x26), &pmem_clk.c },
Vikram Mulukutla73d42112011-09-19 16:32:54 -07001422 { TEST_PER_LS(0x25), &dfab_clk.c },
1423 { TEST_PER_LS(0x25), &dfab_a_clk.c },
Vikram Mulukutla489e39e2011-08-31 18:04:05 -07001424 { TEST_PER_LS(0x32), &dma_bam_p_clk.c },
Vikram Mulukutla73d42112011-09-19 16:32:54 -07001425 { TEST_PER_LS(0x33), &cfpb_clk.c },
1426 { TEST_PER_LS(0x33), &cfpb_a_clk.c },
Vikram Mulukutla489e39e2011-08-31 18:04:05 -07001427 { TEST_PER_LS(0x3E), &gsbi1_uart_clk.c },
1428 { TEST_PER_LS(0x3F), &gsbi1_qup_clk.c },
1429 { TEST_PER_LS(0x41), &gsbi2_p_clk.c },
1430 { TEST_PER_LS(0x42), &gsbi2_uart_clk.c },
1431 { TEST_PER_LS(0x44), &gsbi2_qup_clk.c },
1432 { TEST_PER_LS(0x45), &gsbi3_p_clk.c },
1433 { TEST_PER_LS(0x46), &gsbi3_uart_clk.c },
1434 { TEST_PER_LS(0x48), &gsbi3_qup_clk.c },
1435 { TEST_PER_LS(0x49), &gsbi4_p_clk.c },
1436 { TEST_PER_LS(0x4A), &gsbi4_uart_clk.c },
1437 { TEST_PER_LS(0x4C), &gsbi4_qup_clk.c },
1438 { TEST_PER_LS(0x4D), &gsbi5_p_clk.c },
1439 { TEST_PER_LS(0x4E), &gsbi5_uart_clk.c },
1440 { TEST_PER_LS(0x50), &gsbi5_qup_clk.c },
Vikram Mulukutla73d42112011-09-19 16:32:54 -07001441 { TEST_PER_LS(0x78), &sfpb_clk.c },
1442 { TEST_PER_LS(0x78), &sfpb_a_clk.c },
Vikram Mulukutla489e39e2011-08-31 18:04:05 -07001443 { TEST_PER_LS(0x7A), &pmic_ssbi2_clk.c },
1444 { TEST_PER_LS(0x7B), &pmic_arb0_p_clk.c },
1445 { TEST_PER_LS(0x7C), &pmic_arb1_p_clk.c },
1446 { TEST_PER_LS(0x7D), &prng_clk.c },
1447 { TEST_PER_LS(0x7F), &rpm_msg_ram_p_clk.c },
1448 { TEST_PER_LS(0x80), &adm0_p_clk.c },
1449 { TEST_PER_LS(0x84), &usb_hs1_p_clk.c },
1450 { TEST_PER_LS(0x85), &usb_hs1_xcvr_clk.c },
1451 { TEST_PER_LS(0x86), &usb_hsic_sys_clk.c },
1452 { TEST_PER_LS(0x87), &usb_hsic_p_clk.c },
1453 { TEST_PER_LS(0x88), &usb_hsic_xcvr_clk.c },
1454 { TEST_PER_LS(0x8B), &usb_hsic_hsio_cal_clk.c },
1455 { TEST_PER_LS(0x8D), &usb_hs1_sys_clk.c },
1456 { TEST_PER_LS(0x92), &ce1_p_clk.c },
Vikram Mulukutla73d42112011-09-19 16:32:54 -07001457 { TEST_PER_HS(0x18), &sfab_clk.c },
1458 { TEST_PER_HS(0x18), &sfab_a_clk.c },
Vikram Mulukutlaefd64f52012-01-09 17:41:09 -08001459 { TEST_PER_HS(0x26), &q6sw_clk },
1460 { TEST_PER_HS(0x27), &q6fw_clk },
Vikram Mulukutla489e39e2011-08-31 18:04:05 -07001461 { TEST_PER_LS(0xA4), &ce1_core_clk.c },
1462 { TEST_PER_HS(0x2A), &adm0_clk.c },
Vikram Mulukutla73d42112011-09-19 16:32:54 -07001463 { TEST_PER_HS(0x34), &ebi1_clk.c },
1464 { TEST_PER_HS(0x34), &ebi1_a_clk.c },
Vikram Mulukutla6c9158f2011-12-08 12:41:20 -08001465 { TEST_PER_HS(0x3E), &usb_hsic_clk.c },
Vikram Mulukutla489e39e2011-08-31 18:04:05 -07001466 { TEST_LPA(0x0F), &mi2s_bit_clk.c },
1467 { TEST_LPA(0x10), &codec_i2s_mic_bit_clk.c },
1468 { TEST_LPA(0x11), &codec_i2s_spkr_bit_clk.c },
1469 { TEST_LPA(0x12), &spare_i2s_mic_bit_clk.c },
1470 { TEST_LPA(0x13), &spare_i2s_spkr_bit_clk.c },
1471 { TEST_LPA(0x14), &pcm_clk.c },
1472 { TEST_LPA(0x1D), &audio_slimbus_clk.c },
Vikram Mulukutlaefd64f52012-01-09 17:41:09 -08001473 { TEST_LPA_HS(0x00), &q6_func_clk },
Vikram Mulukutla489e39e2011-08-31 18:04:05 -07001474};
1475
1476static struct measure_sel *find_measure_sel(struct clk *clk)
1477{
1478 int i;
1479
1480 for (i = 0; i < ARRAY_SIZE(measure_mux); i++)
1481 if (measure_mux[i].clk == clk)
1482 return &measure_mux[i];
1483 return NULL;
1484}
1485
1486static int measure_clk_set_parent(struct clk *c, struct clk *parent)
1487{
1488 int ret = 0;
1489 u32 clk_sel;
1490 struct measure_sel *p;
1491 struct measure_clk *clk = to_measure_clk(c);
1492 unsigned long flags;
1493
1494 if (!parent)
1495 return -EINVAL;
1496
1497 p = find_measure_sel(parent);
1498 if (!p)
1499 return -EINVAL;
1500
1501 spin_lock_irqsave(&local_clock_reg_lock, flags);
1502
1503 /*
1504 * Program the test vector, measurement period (sample_ticks)
1505 * and scaling multiplier.
1506 */
1507 clk->sample_ticks = 0x10000;
1508 clk_sel = p->test_vector & TEST_CLK_SEL_MASK;
1509 clk->multiplier = 1;
1510 switch (p->test_vector >> TEST_TYPE_SHIFT) {
1511 case TEST_TYPE_PER_LS:
1512 writel_relaxed(0x4030D00|BVAL(7, 0, clk_sel), CLK_TEST_REG);
1513 break;
1514 case TEST_TYPE_PER_HS:
1515 writel_relaxed(0x4020000|BVAL(16, 10, clk_sel), CLK_TEST_REG);
1516 break;
1517 case TEST_TYPE_LPA:
1518 writel_relaxed(0x4030D98, CLK_TEST_REG);
1519 writel_relaxed(BVAL(6, 1, clk_sel)|BIT(0),
1520 LCC_CLK_LS_DEBUG_CFG_REG);
1521 break;
Vikram Mulukutlaefd64f52012-01-09 17:41:09 -08001522 case TEST_TYPE_LPA_HS:
1523 writel_relaxed(0x402BC00, CLK_TEST_REG);
1524 writel_relaxed(BVAL(2, 1, clk_sel)|BIT(0),
1525 LCC_CLK_HS_DEBUG_CFG_REG);
1526 break;
Vikram Mulukutla489e39e2011-08-31 18:04:05 -07001527 default:
1528 ret = -EPERM;
1529 }
1530 /* Make sure test vector is set before starting measurements. */
1531 mb();
1532
1533 spin_unlock_irqrestore(&local_clock_reg_lock, flags);
1534
1535 return ret;
1536}
1537
1538/* Sample clock for 'ticks' reference clock ticks. */
Matt Wagantall9de3bfb2011-11-03 20:13:12 -07001539static unsigned long run_measurement(unsigned ticks)
Vikram Mulukutla489e39e2011-08-31 18:04:05 -07001540{
1541 /* Stop counters and set the XO4 counter start value. */
Vikram Mulukutla489e39e2011-08-31 18:04:05 -07001542 writel_relaxed(ticks, RINGOSC_TCXO_CTL_REG);
1543
1544 /* Wait for timer to become ready. */
1545 while ((readl_relaxed(RINGOSC_STATUS_REG) & BIT(25)) != 0)
1546 cpu_relax();
1547
1548 /* Run measurement and wait for completion. */
1549 writel_relaxed(BIT(28)|ticks, RINGOSC_TCXO_CTL_REG);
1550 while ((readl_relaxed(RINGOSC_STATUS_REG) & BIT(25)) == 0)
1551 cpu_relax();
1552
1553 /* Stop counters. */
1554 writel_relaxed(0x0, RINGOSC_TCXO_CTL_REG);
1555
1556 /* Return measured ticks. */
1557 return readl_relaxed(RINGOSC_STATUS_REG) & BM(24, 0);
1558}
1559
1560
1561/* Perform a hardware rate measurement for a given clock.
1562 FOR DEBUG USE ONLY: Measurements take ~15 ms! */
Matt Wagantall9de3bfb2011-11-03 20:13:12 -07001563static unsigned long measure_clk_get_rate(struct clk *c)
Vikram Mulukutla489e39e2011-08-31 18:04:05 -07001564{
1565 unsigned long flags;
1566 u32 pdm_reg_backup, ringosc_reg_backup;
1567 u64 raw_count_short, raw_count_full;
1568 struct measure_clk *clk = to_measure_clk(c);
1569 unsigned ret;
1570
1571 spin_lock_irqsave(&local_clock_reg_lock, flags);
1572
1573 /* Enable CXO/4 and RINGOSC branch and root. */
1574 pdm_reg_backup = readl_relaxed(PDM_CLK_NS_REG);
1575 ringosc_reg_backup = readl_relaxed(RINGOSC_NS_REG);
1576 writel_relaxed(0x2898, PDM_CLK_NS_REG);
1577 writel_relaxed(0xA00, RINGOSC_NS_REG);
1578
1579 /*
1580 * The ring oscillator counter will not reset if the measured clock
1581 * is not running. To detect this, run a short measurement before
1582 * the full measurement. If the raw results of the two are the same
1583 * then the clock must be off.
1584 */
1585
1586 /* Run a short measurement. (~1 ms) */
1587 raw_count_short = run_measurement(0x1000);
1588 /* Run a full measurement. (~14 ms) */
1589 raw_count_full = run_measurement(clk->sample_ticks);
1590
1591 writel_relaxed(ringosc_reg_backup, RINGOSC_NS_REG);
1592 writel_relaxed(pdm_reg_backup, PDM_CLK_NS_REG);
1593
1594 /* Return 0 if the clock is off. */
1595 if (raw_count_full == raw_count_short)
1596 ret = 0;
1597 else {
1598 /* Compute rate in Hz. */
1599 raw_count_full = ((raw_count_full * 10) + 15) * 4800000;
1600 do_div(raw_count_full, ((clk->sample_ticks * 10) + 35));
1601 ret = (raw_count_full * clk->multiplier);
1602 }
1603
1604 /* Route dbg_hs_clk to PLLTEST. 300mV single-ended amplitude. */
1605 writel_relaxed(0x38F8, PLLTEST_PAD_CFG_REG);
1606 spin_unlock_irqrestore(&local_clock_reg_lock, flags);
1607
1608 return ret;
1609}
1610#else /* !CONFIG_DEBUG_FS */
1611static int measure_clk_set_parent(struct clk *clk, struct clk *parent)
1612{
1613 return -EINVAL;
1614}
1615
Matt Wagantall9de3bfb2011-11-03 20:13:12 -07001616static unsigned long measure_clk_get_rate(struct clk *clk)
Vikram Mulukutla489e39e2011-08-31 18:04:05 -07001617{
1618 return 0;
1619}
1620#endif /* CONFIG_DEBUG_FS */
1621
1622static struct clk_ops measure_clk_ops = {
1623 .set_parent = measure_clk_set_parent,
1624 .get_rate = measure_clk_get_rate,
1625 .is_local = local_clk_is_local,
1626};
1627
1628static struct measure_clk measure_clk = {
1629 .c = {
1630 .dbg_name = "measure_clk",
1631 .ops = &measure_clk_ops,
1632 CLK_INIT(measure_clk.c),
1633 },
1634 .multiplier = 1,
1635};
1636
1637static struct clk_lookup msm_clocks_9615[] = {
1638 CLK_LOOKUP("cxo", cxo_clk.c, NULL),
1639 CLK_LOOKUP("pll0", pll0_clk.c, NULL),
1640 CLK_LOOKUP("pll8", pll8_clk.c, NULL),
1641 CLK_LOOKUP("pll9", pll9_clk.c, NULL),
1642 CLK_LOOKUP("pll14", pll14_clk.c, NULL),
Vikram Mulukutla31680ae2011-11-04 14:23:55 -07001643
1644 CLK_LOOKUP("pll0", pll0_acpu_clk.c, "acpu"),
1645 CLK_LOOKUP("pll8", pll8_acpu_clk.c, "acpu"),
1646 CLK_LOOKUP("pll9", pll9_acpu_clk.c, "acpu"),
1647
Vikram Mulukutla489e39e2011-08-31 18:04:05 -07001648 CLK_LOOKUP("measure", measure_clk.c, "debug"),
1649
Matt Wagantallb2710b82011-11-16 19:55:17 -08001650 CLK_LOOKUP("bus_clk", sfab_clk.c, "msm_sys_fab"),
1651 CLK_LOOKUP("bus_a_clk", sfab_a_clk.c, "msm_sys_fab"),
1652 CLK_LOOKUP("mem_clk", ebi1_msmbus_clk.c, "msm_bus"),
1653 CLK_LOOKUP("mem_a_clk", ebi1_a_clk.c, "msm_bus"),
1654
1655 CLK_LOOKUP("bus_clk", sfpb_clk.c, NULL),
1656 CLK_LOOKUP("bus_a_clk", sfpb_a_clk.c, NULL),
1657 CLK_LOOKUP("bus_clk", cfpb_clk.c, NULL),
1658 CLK_LOOKUP("bus_a_clk", cfpb_a_clk.c, NULL),
1659 CLK_LOOKUP("ebi1_clk", ebi1_clk.c, NULL),
Vikram Mulukutla73d42112011-09-19 16:32:54 -07001660 CLK_LOOKUP("dfab_clk", dfab_clk.c, NULL),
1661 CLK_LOOKUP("dfab_a_clk", dfab_a_clk.c, NULL),
Vikram Mulukutla489e39e2011-08-31 18:04:05 -07001662
Matt Wagantall7625a4c2011-11-01 16:17:53 -07001663 CLK_LOOKUP("core_clk", gp0_clk.c, NULL),
1664 CLK_LOOKUP("core_clk", gp1_clk.c, NULL),
1665 CLK_LOOKUP("core_clk", gp2_clk.c, NULL),
1666
Vikram Mulukutla489e39e2011-08-31 18:04:05 -07001667 CLK_LOOKUP("core_clk", gsbi3_uart_clk.c, NULL),
1668 CLK_LOOKUP("core_clk", gsbi4_uart_clk.c, "msm_serial_hsl.0"),
1669 CLK_LOOKUP("core_clk", gsbi5_uart_clk.c, NULL),
1670
Harini Jayaraman738c9312011-09-08 15:22:38 -06001671 CLK_LOOKUP("core_clk", gsbi3_qup_clk.c, "spi_qsd.0"),
Vikram Mulukutla489e39e2011-08-31 18:04:05 -07001672 CLK_LOOKUP("core_clk", gsbi4_qup_clk.c, NULL),
Harini Jayaramaneba52672011-09-08 15:13:00 -06001673 CLK_LOOKUP("core_clk", gsbi5_qup_clk.c, "qup_i2c.0"),
Vikram Mulukutla489e39e2011-08-31 18:04:05 -07001674
Matt Wagantallb86ad262011-10-24 19:50:29 -07001675 CLK_LOOKUP("core_clk", pdm_clk.c, NULL),
Vikram Mulukutladd0a2372011-09-19 15:58:21 -07001676 CLK_LOOKUP("mem_clk", pmem_clk.c, "msm_sps"),
Ramesh Masavarapu5ad37392011-10-10 10:44:10 -07001677 CLK_LOOKUP("core_clk", prng_clk.c, "msm_rng.0"),
Vikram Mulukutla489e39e2011-08-31 18:04:05 -07001678 CLK_LOOKUP("core_clk", sdc1_clk.c, "msm_sdcc.1"),
1679 CLK_LOOKUP("core_clk", sdc2_clk.c, "msm_sdcc.2"),
Matt Wagantallb86ad262011-10-24 19:50:29 -07001680 CLK_LOOKUP("iface_clk", ce1_p_clk.c, NULL),
1681 CLK_LOOKUP("core_clk", ce1_core_clk.c, NULL),
Vikram Mulukutla489e39e2011-08-31 18:04:05 -07001682 CLK_LOOKUP("dma_bam_pclk", dma_bam_p_clk.c, NULL),
1683
Harini Jayaraman738c9312011-09-08 15:22:38 -06001684 CLK_LOOKUP("iface_clk", gsbi3_p_clk.c, "spi_qsd.0"),
Vikram Mulukutla489e39e2011-08-31 18:04:05 -07001685 CLK_LOOKUP("iface_clk", gsbi4_p_clk.c, "msm_serial_hsl.0"),
Harini Jayaramaneba52672011-09-08 15:13:00 -06001686 CLK_LOOKUP("iface_clk", gsbi5_p_clk.c, "qup_i2c.0"),
Vikram Mulukutla489e39e2011-08-31 18:04:05 -07001687
Manu Gautam5143b252012-01-05 19:25:23 -08001688 CLK_LOOKUP("iface_clk", usb_hs1_p_clk.c, "msm_otg"),
1689 CLK_LOOKUP("core_clk", usb_hs1_sys_clk.c, "msm_otg"),
1690 CLK_LOOKUP("alt_core_clk", usb_hs1_xcvr_clk.c, "msm_otg"),
1691 CLK_LOOKUP("alt_core_clk", usb_hsic_xcvr_clk.c, "msm_hsic_host"),
1692 CLK_LOOKUP("cal_clk", usb_hsic_hsio_cal_clk.c, "msm_hsic_host"),
1693 CLK_LOOKUP("core_clk", usb_hsic_sys_clk.c, "msm_hsic_host"),
1694 CLK_LOOKUP("iface_clk", usb_hsic_p_clk.c, "msm_hsic_host"),
1695 CLK_LOOKUP("phy_clk", usb_hsic_clk.c, "msm_hsic_host"),
Vikram Mulukutla489e39e2011-08-31 18:04:05 -07001696
1697 CLK_LOOKUP("iface_clk", sdc1_p_clk.c, "msm_sdcc.1"),
1698 CLK_LOOKUP("iface_clk", sdc2_p_clk.c, "msm_sdcc.2"),
1699 CLK_LOOKUP("core_clk", adm0_clk.c, "msm_dmov"),
1700 CLK_LOOKUP("iface_clk", adm0_p_clk.c, "msm_dmov"),
Matt Wagantallb86ad262011-10-24 19:50:29 -07001701 CLK_LOOKUP("iface_clk", pmic_arb0_p_clk.c, NULL),
1702 CLK_LOOKUP("iface_clk", pmic_arb1_p_clk.c, NULL),
1703 CLK_LOOKUP("core_clk", pmic_ssbi2_clk.c, NULL),
1704 CLK_LOOKUP("mem_clk", rpm_msg_ram_p_clk.c, NULL),
Vikram Mulukutla489e39e2011-08-31 18:04:05 -07001705 CLK_LOOKUP("mi2s_bit_clk", mi2s_bit_clk.c, NULL),
1706 CLK_LOOKUP("mi2s_osr_clk", mi2s_osr_clk.c, NULL),
1707
1708 CLK_LOOKUP("i2s_mic_bit_clk", codec_i2s_mic_bit_clk.c, NULL),
1709 CLK_LOOKUP("i2s_mic_osr_clk", codec_i2s_mic_osr_clk.c, NULL),
1710 CLK_LOOKUP("i2s_mic_bit_clk", spare_i2s_mic_bit_clk.c, NULL),
1711 CLK_LOOKUP("i2s_mic_osr_clk", spare_i2s_mic_osr_clk.c, NULL),
1712 CLK_LOOKUP("i2s_spkr_bit_clk", codec_i2s_spkr_bit_clk.c, NULL),
1713 CLK_LOOKUP("i2s_spkr_osr_clk", codec_i2s_spkr_osr_clk.c, NULL),
1714 CLK_LOOKUP("i2s_spkr_bit_clk", spare_i2s_spkr_bit_clk.c, NULL),
1715 CLK_LOOKUP("i2s_spkr_osr_clk", spare_i2s_spkr_osr_clk.c, NULL),
1716 CLK_LOOKUP("pcm_clk", pcm_clk.c, NULL),
1717
1718 CLK_LOOKUP("sps_slimbus_clk", sps_slimbus_clk.c, NULL),
1719 CLK_LOOKUP("audio_slimbus_clk", audio_slimbus_clk.c, NULL),
Manu Gautam5143b252012-01-05 19:25:23 -08001720 CLK_LOOKUP("core_clk", dfab_usb_hs_clk.c, "msm_otg"),
Vikram Mulukutla489e39e2011-08-31 18:04:05 -07001721 CLK_LOOKUP("bus_clk", dfab_sdc1_clk.c, "msm_sdcc.1"),
1722 CLK_LOOKUP("bus_clk", dfab_sdc2_clk.c, "msm_sdcc.2"),
1723 CLK_LOOKUP("dfab_clk", dfab_sps_clk.c, "msm_sps"),
Vikram Mulukutlacfd73ad2011-11-09 11:39:34 -08001724 CLK_LOOKUP("bus_clk", dfab_bam_dmux_clk.c, "BAM_RMNT"),
Vikram Mulukutla73d42112011-09-19 16:32:54 -07001725 CLK_LOOKUP("mem_clk", ebi1_adm_clk.c, "msm_dmov"),
Vikram Mulukutla489e39e2011-08-31 18:04:05 -07001726
Ramesh Masavarapufa679d92011-10-13 23:42:59 -07001727 CLK_LOOKUP("iface_clk", ce1_p_clk.c, "qce.0"),
1728 CLK_LOOKUP("iface_clk", ce1_p_clk.c, "qcrypto.0"),
1729 CLK_LOOKUP("core_clk", ce1_core_clk.c, "qce.0"),
1730 CLK_LOOKUP("core_clk", ce1_core_clk.c, "qcrypto.0"),
1731
Vikram Mulukutlaefd64f52012-01-09 17:41:09 -08001732 CLK_LOOKUP("q6sw_clk", q6sw_clk, NULL),
1733 CLK_LOOKUP("q6fw_clk", q6fw_clk, NULL),
1734 CLK_LOOKUP("q6_func_clk", q6_func_clk, NULL),
1735
Ramesh Masavarapufa679d92011-10-13 23:42:59 -07001736 /* TODO: Make this real when RPM's ready. */
1737 CLK_DUMMY("ebi1_msmbus_clk", ebi1_msmbus_clk.c, NULL, OFF),
1738 CLK_DUMMY("mem_clk", ebi1_adm_clk.c, "msm_dmov", OFF),
1739
Vikram Mulukutla489e39e2011-08-31 18:04:05 -07001740};
1741
1742static void set_fsm_mode(void __iomem *mode_reg)
1743{
1744 u32 regval = readl_relaxed(mode_reg);
1745
1746 /* De-assert reset to FSM */
1747 regval &= ~BIT(21);
1748 writel_relaxed(regval, mode_reg);
1749
1750 /* Program bias count */
1751 regval &= ~BM(19, 14);
Vikram Mulukutlad2314f32011-10-14 10:12:02 -07001752 regval |= BVAL(19, 14, 0x1);
Vikram Mulukutla489e39e2011-08-31 18:04:05 -07001753 writel_relaxed(regval, mode_reg);
1754
1755 /* Program lock count */
1756 regval &= ~BM(13, 8);
1757 regval |= BVAL(13, 8, 0x8);
1758 writel_relaxed(regval, mode_reg);
1759
1760 /* Enable PLL FSM voting */
1761 regval |= BIT(20);
1762 writel_relaxed(regval, mode_reg);
1763}
1764
1765/*
1766 * Miscellaneous clock register initializations
1767 */
1768static void __init reg_init(void)
1769{
1770 u32 regval, is_pll_enabled;
1771
1772 /* Enable PDM CXO source. */
1773 regval = readl_relaxed(PDM_CLK_NS_REG);
1774 writel_relaxed(BIT(13) | regval, PDM_CLK_NS_REG);
1775
1776 /* Check if PLL0 is active */
1777 is_pll_enabled = readl_relaxed(BB_PLL0_STATUS_REG) & BIT(16);
1778
1779 if (!is_pll_enabled) {
1780 writel_relaxed(0xE, BB_PLL0_L_VAL_REG);
1781 writel_relaxed(0x3, BB_PLL0_M_VAL_REG);
1782 writel_relaxed(0x8, BB_PLL0_N_VAL_REG);
1783
1784 regval = readl_relaxed(BB_PLL0_CONFIG_REG);
1785
1786 /* Enable the main output and the MN accumulator */
1787 regval |= BIT(23) | BIT(22);
1788
1789 /* Set pre-divider and post-divider values to 1 and 1 */
1790 regval &= ~BIT(19);
1791 regval &= ~BM(21, 20);
1792
1793 /* Set VCO frequency */
1794 regval &= ~BM(17, 16);
1795
1796 writel_relaxed(regval, BB_PLL0_CONFIG_REG);
1797
1798 /* Enable AUX output */
1799 regval = readl_relaxed(BB_PLL0_TEST_CTL_REG);
1800 regval |= BIT(12);
1801 writel_relaxed(regval, BB_PLL0_TEST_CTL_REG);
1802
1803 set_fsm_mode(BB_PLL0_MODE_REG);
1804 }
1805
1806 /* Check if PLL9 (SC_PLL0) is enabled in FSM mode */
1807 is_pll_enabled = readl_relaxed(SC_PLL0_STATUS_REG) & BIT(16);
1808
1809 if (!is_pll_enabled) {
1810 writel_relaxed(0x16, SC_PLL0_L_VAL_REG);
1811 writel_relaxed(0xB, SC_PLL0_M_VAL_REG);
1812 writel_relaxed(0xC, SC_PLL0_N_VAL_REG);
1813
1814 regval = readl_relaxed(SC_PLL0_CONFIG_REG);
1815
1816 /* Enable main output and the MN accumulator */
1817 regval |= BIT(23) | BIT(22);
1818
1819 /* Set pre-divider and post-divider values to 1 and 1 */
1820 regval &= ~BIT(19);
1821 regval &= ~BM(21, 20);
1822
1823 /* Set VCO frequency */
1824 regval &= ~BM(17, 16);
1825
1826 writel_relaxed(regval, SC_PLL0_CONFIG_REG);
1827
1828 set_fsm_mode(SC_PLL0_MODE_REG);
1829
Vikram Mulukutla3349d932011-10-12 20:00:34 -07001830 } else if (!(readl_relaxed(SC_PLL0_MODE_REG) & BIT(20)))
Vikram Mulukutla489e39e2011-08-31 18:04:05 -07001831 WARN(1, "PLL9 enabled in non-FSM mode!\n");
1832
Vikram Mulukutla3349d932011-10-12 20:00:34 -07001833 /* Check if PLL14 is enabled in FSM mode */
1834 is_pll_enabled = readl_relaxed(BB_PLL14_STATUS_REG) & BIT(16);
1835
1836 if (!is_pll_enabled) {
1837 writel_relaxed(0x19, BB_PLL14_L_VAL_REG);
1838 writel_relaxed(0x0, BB_PLL14_M_VAL_REG);
1839 writel_relaxed(0x1, BB_PLL14_N_VAL_REG);
1840
1841 regval = readl_relaxed(BB_PLL14_CONFIG_REG);
1842
1843 /* Enable main output and the MN accumulator */
1844 regval |= BIT(23) | BIT(22);
1845
1846 /* Set pre-divider and post-divider values to 1 and 1 */
1847 regval &= ~BIT(19);
1848 regval &= ~BM(21, 20);
1849
1850 /* Set VCO frequency */
1851 regval &= ~BM(17, 16);
1852
1853 writel_relaxed(regval, BB_PLL14_CONFIG_REG);
1854
1855 set_fsm_mode(BB_PLL14_MODE_REG);
1856
1857 } else if (!(readl_relaxed(BB_PLL14_MODE_REG) & BIT(20)))
1858 WARN(1, "PLL14 enabled in non-FSM mode!\n");
1859
Vikram Mulukutla489e39e2011-08-31 18:04:05 -07001860 /* Enable PLL4 source on the LPASS Primary PLL Mux */
1861 regval = readl_relaxed(LCC_PRI_PLL_CLK_CTL_REG);
1862 writel_relaxed(regval | BIT(0), LCC_PRI_PLL_CLK_CTL_REG);
Vikram Mulukutla0ee27882011-11-15 18:25:04 -08001863
1864 /* Disable hardware clock gating on certain clocks */
1865 regval = readl_relaxed(USB_HSIC_HCLK_CTL_REG);
1866 regval &= ~BIT(6);
1867 writel_relaxed(regval, USB_HSIC_HCLK_CTL_REG);
1868
1869 regval = readl_relaxed(CE1_CORE_CLK_CTL_REG);
1870 regval &= ~BIT(6);
1871 writel_relaxed(regval, CE1_CORE_CLK_CTL_REG);
1872
1873 regval = readl_relaxed(USB_HS1_HCLK_CTL_REG);
1874 regval &= ~BIT(6);
1875 writel_relaxed(regval, USB_HS1_HCLK_CTL_REG);
Vikram Mulukutladb89d742012-01-06 15:33:46 -08001876
1877 regval = readl_relaxed(DMA_BAM_HCLK_CTL);
1878 regval &= ~BIT(6);
1879 writel_relaxed(regval, DMA_BAM_HCLK_CTL);
Vikram Mulukutla489e39e2011-08-31 18:04:05 -07001880}
1881
1882/* Local clock driver initialization. */
1883static void __init msm9615_clock_init(void)
1884{
Matt Wagantalled90b002011-12-12 21:22:43 -08001885 xo_cxo = msm_xo_get(MSM_XO_CXO, "clock-9615");
Vikram Mulukutla489e39e2011-08-31 18:04:05 -07001886 if (IS_ERR(xo_cxo)) {
1887 pr_err("%s: msm_xo_get(CXO) failed.\n", __func__);
1888 BUG();
1889 }
1890
Matt Wagantalle18bbc82011-10-06 10:07:28 -07001891 vote_vdd_level(&vdd_dig, VDD_DIG_HIGH);
Vikram Mulukutla489e39e2011-08-31 18:04:05 -07001892
1893 clk_ops_pll.enable = sr_pll_clk_enable;
1894
1895 /* Initialize clock registers. */
1896 reg_init();
1897
1898 /* Initialize rates for clocks that only support one. */
1899 clk_set_rate(&pdm_clk.c, 19200000);
1900 clk_set_rate(&prng_clk.c, 32000000);
1901 clk_set_rate(&usb_hs1_xcvr_clk.c, 60000000);
1902 clk_set_rate(&usb_hs1_sys_clk.c, 60000000);
1903 clk_set_rate(&usb_hsic_xcvr_clk.c, 60000000);
Vikram Mulukutla6c9158f2011-12-08 12:41:20 -08001904 clk_set_rate(&usb_hsic_sys_clk.c, 64000000);
1905 clk_set_rate(&usb_hsic_clk.c, 480000000);
Vikram Mulukutla489e39e2011-08-31 18:04:05 -07001906
1907 /*
1908 * The halt status bits for PDM may be incorrect at boot.
1909 * Toggle these clocks on and off to refresh them.
1910 */
1911 rcg_clk_enable(&pdm_clk.c);
1912 rcg_clk_disable(&pdm_clk.c);
1913}
1914
1915static int __init msm9615_clock_late_init(void)
1916{
Matt Wagantalle18bbc82011-10-06 10:07:28 -07001917 return unvote_vdd_level(&vdd_dig, VDD_DIG_HIGH);
Vikram Mulukutla489e39e2011-08-31 18:04:05 -07001918}
1919
1920struct clock_init_data msm9615_clock_init_data __initdata = {
1921 .table = msm_clocks_9615,
1922 .size = ARRAY_SIZE(msm_clocks_9615),
1923 .init = msm9615_clock_init,
1924 .late_init = msm9615_clock_late_init,
1925};