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