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