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