blob: 9e4268f5bbf9da0b426da90ca32bd71d64d76e47 [file] [log] [blame]
Manu Gautam5143b252012-01-05 19:25:23 -08001/* Copyright (c) 2009-2012, Code Aurora Forum. All rights reserved.
Vikram Mulukutla489e39e2011-08-31 18:04:05 -07002 *
3 * This program is free software; you can redistribute it and/or modify
4 * it under the terms of the GNU General Public License version 2 and
5 * only version 2 as published by the Free Software Foundation.
6 *
7 * This program is distributed in the hope that it will be useful,
8 * but WITHOUT ANY WARRANTY; without even the implied warranty of
9 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
10 * GNU General Public License for more details.
11 */
12
13#include <linux/kernel.h>
14#include <linux/init.h>
15#include <linux/err.h>
16#include <linux/ctype.h>
17#include <linux/bitops.h>
18#include <linux/io.h>
19#include <linux/spinlock.h>
20#include <linux/delay.h>
21#include <linux/clk.h>
22#include <linux/clkdev.h>
23
24#include <asm/mach-types.h>
25
26#include <mach/msm_iomap.h>
27#include <mach/clk.h>
28#include <mach/msm_xo.h>
Vikram Mulukutla73d42112011-09-19 16:32:54 -070029#include <mach/rpm-9615.h>
Vikram Mulukutlab5e1cda2011-10-04 16:17:22 -070030#include <mach/rpm-regulator.h>
Vikram Mulukutla489e39e2011-08-31 18:04:05 -070031
32#include "clock-local.h"
33#include "clock-voter.h"
Vikram Mulukutla73d42112011-09-19 16:32:54 -070034#include "clock-rpm.h"
Vikram Mulukutla489e39e2011-08-31 18:04:05 -070035#include "devices.h"
36
37#define REG(off) (MSM_CLK_CTL_BASE + (off))
38#define REG_LPA(off) (MSM_LPASS_CLK_CTL_BASE + (off))
39#define REG_GCC(off) (MSM_APCS_GCC_BASE + (off))
40
41/* Peripheral clock registers. */
42#define CE1_HCLK_CTL_REG REG(0x2720)
43#define CE1_CORE_CLK_CTL_REG REG(0x2724)
44#define DMA_BAM_HCLK_CTL REG(0x25C0)
45#define CLK_HALT_CFPB_STATEA_REG REG(0x2FCC)
46#define CLK_HALT_CFPB_STATEB_REG REG(0x2FD0)
47#define CLK_HALT_CFPB_STATEC_REG REG(0x2FD4)
48#define CLK_HALT_DFAB_STATE_REG REG(0x2FC8)
49
50#define CLK_HALT_MSS_KPSS_MISC_STATE_REG REG(0x2FDC)
51#define CLK_HALT_SFPB_MISC_STATE_REG REG(0x2FD8)
52#define CLK_TEST_REG REG(0x2FA0)
Matt Wagantall7625a4c2011-11-01 16:17:53 -070053#define GPn_MD_REG(n) REG(0x2D00+(0x20*(n)))
54#define GPn_NS_REG(n) REG(0x2D24+(0x20*(n)))
Vikram Mulukutla489e39e2011-08-31 18:04:05 -070055#define GSBIn_HCLK_CTL_REG(n) REG(0x29C0+(0x20*((n)-1)))
56#define GSBIn_QUP_APPS_MD_REG(n) REG(0x29C8+(0x20*((n)-1)))
57#define GSBIn_QUP_APPS_NS_REG(n) REG(0x29CC+(0x20*((n)-1)))
58#define GSBIn_RESET_REG(n) REG(0x29DC+(0x20*((n)-1)))
59#define GSBIn_UART_APPS_MD_REG(n) REG(0x29D0+(0x20*((n)-1)))
60#define GSBIn_UART_APPS_NS_REG(n) REG(0x29D4+(0x20*((n)-1)))
61#define PDM_CLK_NS_REG REG(0x2CC0)
62#define BB_PLL_ENA_SC0_REG REG(0x34C0)
63
64#define BB_PLL0_L_VAL_REG REG(0x30C4)
65#define BB_PLL0_M_VAL_REG REG(0x30C8)
66#define BB_PLL0_MODE_REG REG(0x30C0)
67#define BB_PLL0_N_VAL_REG REG(0x30CC)
68#define BB_PLL0_STATUS_REG REG(0x30D8)
69#define BB_PLL0_CONFIG_REG REG(0x30D4)
70#define BB_PLL0_TEST_CTL_REG REG(0x30D0)
71
72#define BB_PLL8_L_VAL_REG REG(0x3144)
73#define BB_PLL8_M_VAL_REG REG(0x3148)
74#define BB_PLL8_MODE_REG REG(0x3140)
75#define BB_PLL8_N_VAL_REG REG(0x314C)
76#define BB_PLL8_STATUS_REG REG(0x3158)
77#define BB_PLL8_CONFIG_REG REG(0x3154)
78#define BB_PLL8_TEST_CTL_REG REG(0x3150)
79
80#define BB_PLL14_L_VAL_REG REG(0x31C4)
81#define BB_PLL14_M_VAL_REG REG(0x31C8)
82#define BB_PLL14_MODE_REG REG(0x31C0)
83#define BB_PLL14_N_VAL_REG REG(0x31CC)
84#define BB_PLL14_STATUS_REG REG(0x31D8)
85#define BB_PLL14_CONFIG_REG REG(0x31D4)
86#define BB_PLL14_TEST_CTL_REG REG(0x31D0)
87
88#define SC_PLL0_L_VAL_REG REG(0x3208)
89#define SC_PLL0_M_VAL_REG REG(0x320C)
90#define SC_PLL0_MODE_REG REG(0x3200)
91#define SC_PLL0_N_VAL_REG REG(0x3210)
92#define SC_PLL0_STATUS_REG REG(0x321C)
93#define SC_PLL0_CONFIG_REG REG(0x3204)
94#define SC_PLL0_TEST_CTL_REG REG(0x3218)
95
96#define PLLTEST_PAD_CFG_REG REG(0x2FA4)
97#define PMEM_ACLK_CTL_REG REG(0x25A0)
98#define RINGOSC_NS_REG REG(0x2DC0)
99#define RINGOSC_STATUS_REG REG(0x2DCC)
100#define RINGOSC_TCXO_CTL_REG REG(0x2DC4)
101#define SC0_U_CLK_BRANCH_ENA_VOTE_REG REG(0x3080)
102#define SDCn_APPS_CLK_MD_REG(n) REG(0x2828+(0x20*((n)-1)))
103#define SDCn_APPS_CLK_NS_REG(n) REG(0x282C+(0x20*((n)-1)))
104#define SDCn_HCLK_CTL_REG(n) REG(0x2820+(0x20*((n)-1)))
105#define SDCn_RESET_REG(n) REG(0x2830+(0x20*((n)-1)))
106#define USB_HS1_HCLK_CTL_REG REG(0x2900)
107#define USB_HS1_RESET_REG REG(0x2910)
108#define USB_HS1_XCVR_FS_CLK_MD_REG REG(0x2908)
109#define USB_HS1_XCVR_FS_CLK_NS_REG REG(0x290C)
110#define USB_HS1_SYS_CLK_MD_REG REG(0x36A0)
111#define USB_HS1_SYS_CLK_NS_REG REG(0x36A4)
112#define USB_HSIC_HCLK_CTL_REG REG(0x2920)
113#define USB_HSIC_XCVR_FS_CLK_MD_REG REG(0x2924)
114#define USB_HSIC_XCVR_FS_CLK_NS_REG REG(0x2928)
115#define USB_HSIC_RESET_REG REG(0x2934)
116#define USB_HSIC_HSIO_CAL_CLK_CTL_REG REG(0x2B48)
117#define USB_HSIC_CLK_MD_REG REG(0x2B4C)
118#define USB_HSIC_CLK_NS_REG REG(0x2B50)
119#define USB_HSIC_SYSTEM_CLK_MD_REG REG(0x2B54)
120#define USB_HSIC_SYSTEM_CLK_NS_REG REG(0x2B58)
121#define SLIMBUS_XO_SRC_CLK_CTL_REG REG(0x2628)
122
123/* Low-power Audio clock registers. */
Vikram Mulukutlaefd64f52012-01-09 17:41:09 -0800124#define LCC_CLK_HS_DEBUG_CFG_REG REG_LPA(0x00A4)
Vikram Mulukutla489e39e2011-08-31 18:04:05 -0700125#define LCC_CLK_LS_DEBUG_CFG_REG REG_LPA(0x00A8)
126#define LCC_CODEC_I2S_MIC_MD_REG REG_LPA(0x0064)
127#define LCC_CODEC_I2S_MIC_NS_REG REG_LPA(0x0060)
128#define LCC_CODEC_I2S_MIC_STATUS_REG REG_LPA(0x0068)
129#define LCC_CODEC_I2S_SPKR_MD_REG REG_LPA(0x0070)
130#define LCC_CODEC_I2S_SPKR_NS_REG REG_LPA(0x006C)
131#define LCC_CODEC_I2S_SPKR_STATUS_REG REG_LPA(0x0074)
132#define LCC_MI2S_MD_REG REG_LPA(0x004C)
133#define LCC_MI2S_NS_REG REG_LPA(0x0048)
134#define LCC_MI2S_STATUS_REG REG_LPA(0x0050)
135#define LCC_PCM_MD_REG REG_LPA(0x0058)
136#define LCC_PCM_NS_REG REG_LPA(0x0054)
137#define LCC_PCM_STATUS_REG REG_LPA(0x005C)
138#define LCC_PLL0_STATUS_REG REG_LPA(0x0018)
139#define LCC_SPARE_I2S_MIC_MD_REG REG_LPA(0x007C)
140#define LCC_SPARE_I2S_MIC_NS_REG REG_LPA(0x0078)
141#define LCC_SPARE_I2S_MIC_STATUS_REG REG_LPA(0x0080)
142#define LCC_SPARE_I2S_SPKR_MD_REG REG_LPA(0x0088)
143#define LCC_SPARE_I2S_SPKR_NS_REG REG_LPA(0x0084)
144#define LCC_SPARE_I2S_SPKR_STATUS_REG REG_LPA(0x008C)
145#define LCC_SLIMBUS_NS_REG REG_LPA(0x00CC)
146#define LCC_SLIMBUS_MD_REG REG_LPA(0x00D0)
147#define LCC_SLIMBUS_STATUS_REG REG_LPA(0x00D4)
148#define LCC_AHBEX_BRANCH_CTL_REG REG_LPA(0x00E4)
149#define LCC_PRI_PLL_CLK_CTL_REG REG_LPA(0x00C4)
150
151#define GCC_APCS_CLK_DIAG REG_GCC(0x001C)
152
153/* MUX source input identifiers. */
154#define cxo_to_bb_mux 0
155#define pll8_to_bb_mux 3
156#define pll14_to_bb_mux 4
157#define gnd_to_bb_mux 6
158#define cxo_to_xo_mux 0
159#define gnd_to_xo_mux 3
160#define cxo_to_lpa_mux 1
161#define pll4_to_lpa_mux 2
162#define gnd_to_lpa_mux 6
163
164/* Test Vector Macros */
165#define TEST_TYPE_PER_LS 1
166#define TEST_TYPE_PER_HS 2
167#define TEST_TYPE_LPA 5
Vikram Mulukutlaefd64f52012-01-09 17:41:09 -0800168#define TEST_TYPE_LPA_HS 6
Vikram Mulukutla489e39e2011-08-31 18:04:05 -0700169#define TEST_TYPE_SHIFT 24
170#define TEST_CLK_SEL_MASK BM(23, 0)
171#define TEST_VECTOR(s, t) (((t) << TEST_TYPE_SHIFT) | BVAL(23, 0, (s)))
172#define TEST_PER_LS(s) TEST_VECTOR((s), TEST_TYPE_PER_LS)
173#define TEST_PER_HS(s) TEST_VECTOR((s), TEST_TYPE_PER_HS)
174#define TEST_LPA(s) TEST_VECTOR((s), TEST_TYPE_LPA)
Vikram Mulukutlaefd64f52012-01-09 17:41:09 -0800175#define TEST_LPA_HS(s) TEST_VECTOR((s), TEST_TYPE_LPA_HS)
Vikram Mulukutla489e39e2011-08-31 18:04:05 -0700176
Matt Wagantalle18bbc82011-10-06 10:07:28 -0700177enum vdd_dig_levels {
178 VDD_DIG_NONE,
179 VDD_DIG_LOW,
180 VDD_DIG_NOMINAL,
181 VDD_DIG_HIGH
182};
183
184static int set_vdd_dig(struct clk_vdd_class *vdd_class, int level)
185{
Matt Wagantalle18bbc82011-10-06 10:07:28 -0700186 static const int vdd_uv[] = {
Vikram Mulukutla5e6ab912011-11-04 15:20:19 -0700187 [VDD_DIG_NONE] = 0,
188 [VDD_DIG_LOW] = 945000,
189 [VDD_DIG_NOMINAL] = 1050000,
Matt Wagantalle18bbc82011-10-06 10:07:28 -0700190 [VDD_DIG_HIGH] = 1150000
191 };
192
193 return rpm_vreg_set_voltage(RPM_VREG_ID_PM8018_S1, RPM_VREG_VOTER3,
194 vdd_uv[level], vdd_uv[VDD_DIG_HIGH], 1);
195}
196
197static DEFINE_VDD_CLASS(vdd_dig, set_vdd_dig);
198
199#define VDD_DIG_FMAX_MAP1(l1, f1) \
200 .vdd_class = &vdd_dig, \
201 .fmax[VDD_DIG_##l1] = (f1)
202#define VDD_DIG_FMAX_MAP2(l1, f1, l2, f2) \
203 .vdd_class = &vdd_dig, \
204 .fmax[VDD_DIG_##l1] = (f1), \
205 .fmax[VDD_DIG_##l2] = (f2)
Vikram Mulukutla489e39e2011-08-31 18:04:05 -0700206
207/*
208 * Clock Descriptions
209 */
210
211static struct msm_xo_voter *xo_cxo;
212
213static int cxo_clk_enable(struct clk *clk)
214{
215 return msm_xo_mode_vote(xo_cxo, MSM_XO_MODE_ON);
216}
217
218static void cxo_clk_disable(struct clk *clk)
219{
220 msm_xo_mode_vote(xo_cxo, MSM_XO_MODE_OFF);
221}
222
223static struct clk_ops clk_ops_cxo = {
224 .enable = cxo_clk_enable,
225 .disable = cxo_clk_disable,
Vikram Mulukutla489e39e2011-08-31 18:04:05 -0700226 .is_local = local_clk_is_local,
227};
228
229static struct fixed_clk cxo_clk = {
Vikram Mulukutla489e39e2011-08-31 18:04:05 -0700230 .c = {
231 .dbg_name = "cxo_clk",
Tianyi Gou7949ecb2012-02-14 14:25:32 -0800232 .rate = 19200000,
Vikram Mulukutla489e39e2011-08-31 18:04:05 -0700233 .ops = &clk_ops_cxo,
234 CLK_INIT(cxo_clk.c),
235 },
236};
237
Vikram Mulukutla31680ae2011-11-04 14:23:55 -0700238static DEFINE_SPINLOCK(soft_vote_lock);
239
240static int pll_acpu_vote_clk_enable(struct clk *clk)
241{
242 int ret = 0;
243 unsigned long flags;
244 struct pll_vote_clk *pll = to_pll_vote_clk(clk);
245
246 spin_lock_irqsave(&soft_vote_lock, flags);
247
248 if (!*pll->soft_vote)
249 ret = pll_vote_clk_enable(clk);
250 if (ret == 0)
251 *pll->soft_vote |= (pll->soft_vote_mask);
252
253 spin_unlock_irqrestore(&soft_vote_lock, flags);
254 return ret;
255}
256
257static void pll_acpu_vote_clk_disable(struct clk *clk)
258{
259 unsigned long flags;
260 struct pll_vote_clk *pll = to_pll_vote_clk(clk);
261
262 spin_lock_irqsave(&soft_vote_lock, flags);
263
264 *pll->soft_vote &= ~(pll->soft_vote_mask);
265 if (!*pll->soft_vote)
266 pll_vote_clk_disable(clk);
267
268 spin_unlock_irqrestore(&soft_vote_lock, flags);
269}
270
271static struct clk_ops clk_ops_pll_acpu_vote = {
272 .enable = pll_acpu_vote_clk_enable,
273 .disable = pll_acpu_vote_clk_disable,
274 .auto_off = pll_acpu_vote_clk_disable,
275 .is_enabled = pll_vote_clk_is_enabled,
Vikram Mulukutla31680ae2011-11-04 14:23:55 -0700276 .get_parent = pll_vote_clk_get_parent,
277 .is_local = local_clk_is_local,
278};
279
280#define PLL_SOFT_VOTE_PRIMARY BIT(0)
281#define PLL_SOFT_VOTE_ACPU BIT(1)
282
283static unsigned int soft_vote_pll0;
284
Vikram Mulukutla489e39e2011-08-31 18:04:05 -0700285static struct pll_vote_clk pll0_clk = {
Vikram Mulukutla489e39e2011-08-31 18:04:05 -0700286 .en_reg = BB_PLL_ENA_SC0_REG,
287 .en_mask = BIT(0),
288 .status_reg = BB_PLL0_STATUS_REG,
289 .parent = &cxo_clk.c,
Vikram Mulukutla31680ae2011-11-04 14:23:55 -0700290 .soft_vote = &soft_vote_pll0,
291 .soft_vote_mask = PLL_SOFT_VOTE_PRIMARY,
Vikram Mulukutla489e39e2011-08-31 18:04:05 -0700292 .c = {
293 .dbg_name = "pll0_clk",
Tianyi Gou7949ecb2012-02-14 14:25:32 -0800294 .rate = 276000000,
Vikram Mulukutla31680ae2011-11-04 14:23:55 -0700295 .ops = &clk_ops_pll_acpu_vote,
Vikram Mulukutla489e39e2011-08-31 18:04:05 -0700296 CLK_INIT(pll0_clk.c),
297 },
298};
299
Vikram Mulukutla31680ae2011-11-04 14:23:55 -0700300static struct pll_vote_clk pll0_acpu_clk = {
Vikram Mulukutla31680ae2011-11-04 14:23:55 -0700301 .en_reg = BB_PLL_ENA_SC0_REG,
302 .en_mask = BIT(0),
303 .status_reg = BB_PLL0_STATUS_REG,
304 .soft_vote = &soft_vote_pll0,
305 .soft_vote_mask = PLL_SOFT_VOTE_ACPU,
306 .c = {
307 .dbg_name = "pll0_acpu_clk",
Tianyi Gou7949ecb2012-02-14 14:25:32 -0800308 .rate = 276000000,
Vikram Mulukutla31680ae2011-11-04 14:23:55 -0700309 .ops = &clk_ops_pll_acpu_vote,
310 CLK_INIT(pll0_acpu_clk.c),
311 },
312};
313
Vikram Mulukutla489e39e2011-08-31 18:04:05 -0700314static struct pll_vote_clk pll4_clk = {
Vikram Mulukutla489e39e2011-08-31 18:04:05 -0700315 .en_reg = BB_PLL_ENA_SC0_REG,
316 .en_mask = BIT(4),
317 .status_reg = LCC_PLL0_STATUS_REG,
318 .parent = &cxo_clk.c,
319 .c = {
320 .dbg_name = "pll4_clk",
Tianyi Gou7949ecb2012-02-14 14:25:32 -0800321 .rate = 393216000,
Vikram Mulukutla489e39e2011-08-31 18:04:05 -0700322 .ops = &clk_ops_pll_vote,
323 CLK_INIT(pll4_clk.c),
324 },
325};
326
Vikram Mulukutla31680ae2011-11-04 14:23:55 -0700327static unsigned int soft_vote_pll8;
328
Vikram Mulukutla489e39e2011-08-31 18:04:05 -0700329static struct pll_vote_clk pll8_clk = {
Vikram Mulukutla489e39e2011-08-31 18:04:05 -0700330 .en_reg = BB_PLL_ENA_SC0_REG,
331 .en_mask = BIT(8),
332 .status_reg = BB_PLL8_STATUS_REG,
333 .parent = &cxo_clk.c,
Vikram Mulukutla31680ae2011-11-04 14:23:55 -0700334 .soft_vote = &soft_vote_pll8,
335 .soft_vote_mask = PLL_SOFT_VOTE_PRIMARY,
Vikram Mulukutla489e39e2011-08-31 18:04:05 -0700336 .c = {
337 .dbg_name = "pll8_clk",
Tianyi Gou7949ecb2012-02-14 14:25:32 -0800338 .rate = 384000000,
Vikram Mulukutla31680ae2011-11-04 14:23:55 -0700339 .ops = &clk_ops_pll_acpu_vote,
Vikram Mulukutla489e39e2011-08-31 18:04:05 -0700340 CLK_INIT(pll8_clk.c),
341 },
342};
343
Vikram Mulukutla31680ae2011-11-04 14:23:55 -0700344static struct pll_vote_clk pll8_acpu_clk = {
Vikram Mulukutla31680ae2011-11-04 14:23:55 -0700345 .en_reg = BB_PLL_ENA_SC0_REG,
346 .en_mask = BIT(8),
347 .status_reg = BB_PLL8_STATUS_REG,
348 .soft_vote = &soft_vote_pll8,
349 .soft_vote_mask = PLL_SOFT_VOTE_ACPU,
350 .c = {
351 .dbg_name = "pll8_acpu_clk",
Tianyi Gou7949ecb2012-02-14 14:25:32 -0800352 .rate = 384000000,
Vikram Mulukutla31680ae2011-11-04 14:23:55 -0700353 .ops = &clk_ops_pll_acpu_vote,
354 CLK_INIT(pll8_acpu_clk.c),
355 },
356};
357
Vikram Mulukutla266551f2012-01-11 12:32:58 -0800358static struct pll_clk pll9_acpu_clk = {
Vikram Mulukutla266551f2012-01-11 12:32:58 -0800359 .mode_reg = SC_PLL0_MODE_REG,
Vikram Mulukutla31680ae2011-11-04 14:23:55 -0700360 .c = {
361 .dbg_name = "pll9_acpu_clk",
Tianyi Gou7949ecb2012-02-14 14:25:32 -0800362 .rate = 440000000,
Vikram Mulukutla266551f2012-01-11 12:32:58 -0800363 .ops = &clk_ops_pll,
Vikram Mulukutla31680ae2011-11-04 14:23:55 -0700364 CLK_INIT(pll9_acpu_clk.c),
365 },
366};
367
Vikram Mulukutla489e39e2011-08-31 18:04:05 -0700368static struct pll_vote_clk pll14_clk = {
Vikram Mulukutla489e39e2011-08-31 18:04:05 -0700369 .en_reg = BB_PLL_ENA_SC0_REG,
370 .en_mask = BIT(11),
371 .status_reg = BB_PLL14_STATUS_REG,
372 .parent = &cxo_clk.c,
373 .c = {
374 .dbg_name = "pll14_clk",
Tianyi Gou7949ecb2012-02-14 14:25:32 -0800375 .rate = 480000000,
Vikram Mulukutla489e39e2011-08-31 18:04:05 -0700376 .ops = &clk_ops_pll_vote,
377 CLK_INIT(pll14_clk.c),
378 },
379};
380
Vikram Mulukutla489e39e2011-08-31 18:04:05 -0700381static struct clk_ops clk_ops_rcg_9615 = {
382 .enable = rcg_clk_enable,
383 .disable = rcg_clk_disable,
Matt Wagantall41af0772011-09-17 12:21:39 -0700384 .auto_off = rcg_clk_disable,
Matt Wagantallbc8c9062012-02-07 12:33:06 -0800385 .enable_hwcg = rcg_clk_enable_hwcg,
386 .disable_hwcg = rcg_clk_disable_hwcg,
387 .in_hwcg_mode = rcg_clk_in_hwcg_mode,
388 .handoff = rcg_clk_handoff,
Vikram Mulukutla489e39e2011-08-31 18:04:05 -0700389 .set_rate = rcg_clk_set_rate,
Vikram Mulukutla489e39e2011-08-31 18:04:05 -0700390 .get_rate = rcg_clk_get_rate,
391 .list_rate = rcg_clk_list_rate,
392 .is_enabled = rcg_clk_is_enabled,
393 .round_rate = rcg_clk_round_rate,
Stephen Boyd7bf28142011-12-07 00:30:52 -0800394 .reset = rcg_clk_reset,
Vikram Mulukutla489e39e2011-08-31 18:04:05 -0700395 .is_local = local_clk_is_local,
396 .get_parent = rcg_clk_get_parent,
397};
398
399static struct clk_ops clk_ops_branch = {
400 .enable = branch_clk_enable,
401 .disable = branch_clk_disable,
Matt Wagantall41af0772011-09-17 12:21:39 -0700402 .auto_off = branch_clk_disable,
Matt Wagantallbc8c9062012-02-07 12:33:06 -0800403 .enable_hwcg = branch_clk_enable_hwcg,
404 .disable_hwcg = branch_clk_disable_hwcg,
405 .in_hwcg_mode = branch_clk_in_hwcg_mode,
406 .handoff = branch_clk_handoff,
Vikram Mulukutla489e39e2011-08-31 18:04:05 -0700407 .is_enabled = branch_clk_is_enabled,
408 .reset = branch_clk_reset,
409 .is_local = local_clk_is_local,
410 .get_parent = branch_clk_get_parent,
411 .set_parent = branch_clk_set_parent,
412};
413
414/*
415 * Peripheral Clocks
416 */
Matt Wagantall7625a4c2011-11-01 16:17:53 -0700417#define CLK_GP(i, n, h_r, h_b) \
418 struct rcg_clk i##_clk = { \
419 .b = { \
420 .ctl_reg = GPn_NS_REG(n), \
421 .en_mask = BIT(9), \
422 .halt_reg = h_r, \
423 .halt_bit = h_b, \
424 }, \
425 .ns_reg = GPn_NS_REG(n), \
426 .md_reg = GPn_MD_REG(n), \
427 .root_en_mask = BIT(11), \
428 .ns_mask = (BM(23, 16) | BM(6, 0)), \
Matt Wagantall07c45472012-02-10 23:27:24 -0800429 .mnd_en_mask = BIT(8), \
Matt Wagantall7625a4c2011-11-01 16:17:53 -0700430 .set_rate = set_rate_mnd, \
431 .freq_tbl = clk_tbl_gp, \
432 .current_freq = &rcg_dummy_freq, \
433 .c = { \
434 .dbg_name = #i "_clk", \
435 .ops = &clk_ops_rcg_9615, \
436 VDD_DIG_FMAX_MAP1(LOW, 27000000), \
437 CLK_INIT(i##_clk.c), \
438 }, \
439 }
440#define F_GP(f, s, d, m, n) \
441 { \
442 .freq_hz = f, \
443 .src_clk = &s##_clk.c, \
444 .md_val = MD8(16, m, 0, n), \
445 .ns_val = NS(23, 16, n, m, 5, 4, 3, d, 2, 0, s##_to_bb_mux), \
Matt Wagantall7625a4c2011-11-01 16:17:53 -0700446 }
447static struct clk_freq_tbl clk_tbl_gp[] = {
448 F_GP( 0, gnd, 1, 0, 0),
449 F_GP( 9600000, cxo, 2, 0, 0),
450 F_GP( 19200000, cxo, 1, 0, 0),
451 F_END
452};
453
454static CLK_GP(gp0, 0, CLK_HALT_SFPB_MISC_STATE_REG, 7);
455static CLK_GP(gp1, 1, CLK_HALT_SFPB_MISC_STATE_REG, 6);
456static CLK_GP(gp2, 2, CLK_HALT_SFPB_MISC_STATE_REG, 5);
457
Vikram Mulukutla489e39e2011-08-31 18:04:05 -0700458#define CLK_GSBI_UART(i, n, h_r, h_b) \
459 struct rcg_clk i##_clk = { \
460 .b = { \
461 .ctl_reg = GSBIn_UART_APPS_NS_REG(n), \
462 .en_mask = BIT(9), \
463 .reset_reg = GSBIn_RESET_REG(n), \
464 .reset_mask = BIT(0), \
465 .halt_reg = h_r, \
466 .halt_bit = h_b, \
467 }, \
468 .ns_reg = GSBIn_UART_APPS_NS_REG(n), \
469 .md_reg = GSBIn_UART_APPS_MD_REG(n), \
470 .root_en_mask = BIT(11), \
471 .ns_mask = (BM(31, 16) | BM(6, 0)), \
Matt Wagantall07c45472012-02-10 23:27:24 -0800472 .mnd_en_mask = BIT(8), \
Vikram Mulukutla489e39e2011-08-31 18:04:05 -0700473 .set_rate = set_rate_mnd, \
474 .freq_tbl = clk_tbl_gsbi_uart, \
475 .current_freq = &rcg_dummy_freq, \
476 .c = { \
477 .dbg_name = #i "_clk", \
478 .ops = &clk_ops_rcg_9615, \
Matt Wagantalle18bbc82011-10-06 10:07:28 -0700479 VDD_DIG_FMAX_MAP2(LOW, 32000000, NOMINAL, 64000000), \
Vikram Mulukutla489e39e2011-08-31 18:04:05 -0700480 CLK_INIT(i##_clk.c), \
481 }, \
482 }
Matt Wagantalle18bbc82011-10-06 10:07:28 -0700483#define F_GSBI_UART(f, s, d, m, n) \
Vikram Mulukutla489e39e2011-08-31 18:04:05 -0700484 { \
485 .freq_hz = f, \
486 .src_clk = &s##_clk.c, \
487 .md_val = MD16(m, n), \
488 .ns_val = NS(31, 16, n, m, 5, 4, 3, d, 2, 0, s##_to_bb_mux), \
Vikram Mulukutla489e39e2011-08-31 18:04:05 -0700489 }
490static struct clk_freq_tbl clk_tbl_gsbi_uart[] = {
Matt Wagantalle18bbc82011-10-06 10:07:28 -0700491 F_GSBI_UART( 0, gnd, 1, 0, 0),
Matt Wagantall9a561f72012-01-19 16:13:12 -0800492 F_GSBI_UART( 3686400, pll8, 2, 12, 625),
493 F_GSBI_UART( 7372800, pll8, 2, 24, 625),
494 F_GSBI_UART(14745600, pll8, 2, 48, 625),
Matt Wagantalle18bbc82011-10-06 10:07:28 -0700495 F_GSBI_UART(16000000, pll8, 4, 1, 6),
496 F_GSBI_UART(24000000, pll8, 4, 1, 4),
497 F_GSBI_UART(32000000, pll8, 4, 1, 3),
498 F_GSBI_UART(40000000, pll8, 1, 5, 48),
499 F_GSBI_UART(46400000, pll8, 1, 29, 240),
500 F_GSBI_UART(48000000, pll8, 4, 1, 2),
501 F_GSBI_UART(51200000, pll8, 1, 2, 15),
502 F_GSBI_UART(56000000, pll8, 1, 7, 48),
503 F_GSBI_UART(58982400, pll8, 1, 96, 625),
504 F_GSBI_UART(64000000, pll8, 2, 1, 3),
Vikram Mulukutla489e39e2011-08-31 18:04:05 -0700505 F_END
506};
507
508static CLK_GSBI_UART(gsbi1_uart, 1, CLK_HALT_CFPB_STATEA_REG, 10);
509static CLK_GSBI_UART(gsbi2_uart, 2, CLK_HALT_CFPB_STATEA_REG, 6);
510static CLK_GSBI_UART(gsbi3_uart, 3, CLK_HALT_CFPB_STATEA_REG, 2);
511static CLK_GSBI_UART(gsbi4_uart, 4, CLK_HALT_CFPB_STATEB_REG, 26);
512static CLK_GSBI_UART(gsbi5_uart, 5, CLK_HALT_CFPB_STATEB_REG, 22);
513
514#define CLK_GSBI_QUP(i, n, h_r, h_b) \
515 struct rcg_clk i##_clk = { \
516 .b = { \
517 .ctl_reg = GSBIn_QUP_APPS_NS_REG(n), \
518 .en_mask = BIT(9), \
519 .reset_reg = GSBIn_RESET_REG(n), \
520 .reset_mask = BIT(0), \
521 .halt_reg = h_r, \
522 .halt_bit = h_b, \
523 }, \
524 .ns_reg = GSBIn_QUP_APPS_NS_REG(n), \
525 .md_reg = GSBIn_QUP_APPS_MD_REG(n), \
526 .root_en_mask = BIT(11), \
527 .ns_mask = (BM(23, 16) | BM(6, 0)), \
Matt Wagantall07c45472012-02-10 23:27:24 -0800528 .mnd_en_mask = BIT(8), \
Vikram Mulukutla489e39e2011-08-31 18:04:05 -0700529 .set_rate = set_rate_mnd, \
530 .freq_tbl = clk_tbl_gsbi_qup, \
531 .current_freq = &rcg_dummy_freq, \
532 .c = { \
533 .dbg_name = #i "_clk", \
534 .ops = &clk_ops_rcg_9615, \
Matt Wagantalle18bbc82011-10-06 10:07:28 -0700535 VDD_DIG_FMAX_MAP2(LOW, 24000000, NOMINAL, 52000000), \
Vikram Mulukutla489e39e2011-08-31 18:04:05 -0700536 CLK_INIT(i##_clk.c), \
537 }, \
538 }
Matt Wagantalle18bbc82011-10-06 10:07:28 -0700539#define F_GSBI_QUP(f, s, d, m, n) \
Vikram Mulukutla489e39e2011-08-31 18:04:05 -0700540 { \
541 .freq_hz = f, \
542 .src_clk = &s##_clk.c, \
543 .md_val = MD8(16, m, 0, n), \
544 .ns_val = NS(23, 16, n, m, 5, 4, 3, d, 2, 0, s##_to_bb_mux), \
Vikram Mulukutla489e39e2011-08-31 18:04:05 -0700545 }
546static struct clk_freq_tbl clk_tbl_gsbi_qup[] = {
Matt Wagantalle18bbc82011-10-06 10:07:28 -0700547 F_GSBI_QUP( 0, gnd, 1, 0, 0),
548 F_GSBI_QUP( 960000, cxo, 4, 1, 5),
549 F_GSBI_QUP( 4800000, cxo, 4, 0, 1),
550 F_GSBI_QUP( 9600000, cxo, 2, 0, 1),
551 F_GSBI_QUP(15058800, pll8, 1, 2, 51),
552 F_GSBI_QUP(24000000, pll8, 4, 1, 4),
553 F_GSBI_QUP(25600000, pll8, 1, 1, 15),
554 F_GSBI_QUP(48000000, pll8, 4, 1, 2),
555 F_GSBI_QUP(51200000, pll8, 1, 2, 15),
Vikram Mulukutla489e39e2011-08-31 18:04:05 -0700556 F_END
557};
558
559static CLK_GSBI_QUP(gsbi1_qup, 1, CLK_HALT_CFPB_STATEA_REG, 9);
560static CLK_GSBI_QUP(gsbi2_qup, 2, CLK_HALT_CFPB_STATEA_REG, 4);
561static CLK_GSBI_QUP(gsbi3_qup, 3, CLK_HALT_CFPB_STATEA_REG, 0);
562static CLK_GSBI_QUP(gsbi4_qup, 4, CLK_HALT_CFPB_STATEB_REG, 24);
563static CLK_GSBI_QUP(gsbi5_qup, 5, CLK_HALT_CFPB_STATEB_REG, 20);
564
Matt Wagantalle18bbc82011-10-06 10:07:28 -0700565#define F_PDM(f, s, d) \
Vikram Mulukutla489e39e2011-08-31 18:04:05 -0700566 { \
567 .freq_hz = f, \
568 .src_clk = &s##_clk.c, \
569 .ns_val = NS_SRC_SEL(1, 0, s##_to_xo_mux), \
Vikram Mulukutla489e39e2011-08-31 18:04:05 -0700570 }
571static struct clk_freq_tbl clk_tbl_pdm[] = {
Matt Wagantalle18bbc82011-10-06 10:07:28 -0700572 F_PDM( 0, gnd, 1),
573 F_PDM(19200000, cxo, 1),
Vikram Mulukutla489e39e2011-08-31 18:04:05 -0700574 F_END
575};
576
577static struct rcg_clk pdm_clk = {
578 .b = {
579 .ctl_reg = PDM_CLK_NS_REG,
580 .en_mask = BIT(9),
581 .reset_reg = PDM_CLK_NS_REG,
582 .reset_mask = BIT(12),
583 .halt_reg = CLK_HALT_CFPB_STATEC_REG,
584 .halt_bit = 3,
585 },
586 .ns_reg = PDM_CLK_NS_REG,
587 .root_en_mask = BIT(11),
588 .ns_mask = BM(1, 0),
589 .set_rate = set_rate_nop,
590 .freq_tbl = clk_tbl_pdm,
591 .current_freq = &rcg_dummy_freq,
592 .c = {
593 .dbg_name = "pdm_clk",
594 .ops = &clk_ops_rcg_9615,
Matt Wagantalle18bbc82011-10-06 10:07:28 -0700595 VDD_DIG_FMAX_MAP1(LOW, 19200000),
Vikram Mulukutla489e39e2011-08-31 18:04:05 -0700596 CLK_INIT(pdm_clk.c),
597 },
598};
599
600static struct branch_clk pmem_clk = {
601 .b = {
602 .ctl_reg = PMEM_ACLK_CTL_REG,
603 .en_mask = BIT(4),
Matt Wagantallbc8c9062012-02-07 12:33:06 -0800604 .hwcg_reg = PMEM_ACLK_CTL_REG,
605 .hwcg_mask = BIT(6),
Vikram Mulukutla489e39e2011-08-31 18:04:05 -0700606 .halt_reg = CLK_HALT_DFAB_STATE_REG,
607 .halt_bit = 20,
608 },
609 .c = {
610 .dbg_name = "pmem_clk",
611 .ops = &clk_ops_branch,
612 CLK_INIT(pmem_clk.c),
613 },
614};
615
Matt Wagantalle18bbc82011-10-06 10:07:28 -0700616#define F_PRNG(f, s) \
Vikram Mulukutla489e39e2011-08-31 18:04:05 -0700617 { \
618 .freq_hz = f, \
619 .src_clk = &s##_clk.c, \
Vikram Mulukutla489e39e2011-08-31 18:04:05 -0700620 }
621static struct clk_freq_tbl clk_tbl_prng[] = {
Matt Wagantalle18bbc82011-10-06 10:07:28 -0700622 F_PRNG(32000000, pll8),
Vikram Mulukutla489e39e2011-08-31 18:04:05 -0700623 F_END
624};
625
626static struct rcg_clk prng_clk = {
627 .b = {
628 .ctl_reg = SC0_U_CLK_BRANCH_ENA_VOTE_REG,
629 .en_mask = BIT(10),
630 .halt_reg = CLK_HALT_SFPB_MISC_STATE_REG,
631 .halt_check = HALT_VOTED,
632 .halt_bit = 10,
633 },
634 .set_rate = set_rate_nop,
635 .freq_tbl = clk_tbl_prng,
636 .current_freq = &rcg_dummy_freq,
637 .c = {
638 .dbg_name = "prng_clk",
639 .ops = &clk_ops_rcg_9615,
Matt Wagantalle18bbc82011-10-06 10:07:28 -0700640 VDD_DIG_FMAX_MAP2(LOW, 32000000, NOMINAL, 65000000),
Vikram Mulukutla489e39e2011-08-31 18:04:05 -0700641 CLK_INIT(prng_clk.c),
642 },
643};
644
645#define CLK_SDC(name, n, h_b, f_table) \
646 struct rcg_clk name = { \
647 .b = { \
648 .ctl_reg = SDCn_APPS_CLK_NS_REG(n), \
649 .en_mask = BIT(9), \
650 .reset_reg = SDCn_RESET_REG(n), \
651 .reset_mask = BIT(0), \
652 .halt_reg = CLK_HALT_DFAB_STATE_REG, \
653 .halt_bit = h_b, \
654 }, \
655 .ns_reg = SDCn_APPS_CLK_NS_REG(n), \
656 .md_reg = SDCn_APPS_CLK_MD_REG(n), \
657 .root_en_mask = BIT(11), \
658 .ns_mask = (BM(23, 16) | BM(6, 0)), \
Matt Wagantall07c45472012-02-10 23:27:24 -0800659 .mnd_en_mask = BIT(8), \
Vikram Mulukutla489e39e2011-08-31 18:04:05 -0700660 .set_rate = set_rate_mnd, \
661 .freq_tbl = f_table, \
662 .current_freq = &rcg_dummy_freq, \
663 .c = { \
664 .dbg_name = #name, \
665 .ops = &clk_ops_rcg_9615, \
Vikram Mulukutla2d0f6432011-11-07 20:22:08 -0800666 VDD_DIG_FMAX_MAP2(LOW, 26000000, NOMINAL, 52000000), \
Vikram Mulukutla489e39e2011-08-31 18:04:05 -0700667 CLK_INIT(name.c), \
668 }, \
669 }
Matt Wagantalle18bbc82011-10-06 10:07:28 -0700670#define F_SDC(f, s, d, m, n) \
Vikram Mulukutla489e39e2011-08-31 18:04:05 -0700671 { \
672 .freq_hz = f, \
673 .src_clk = &s##_clk.c, \
674 .md_val = MD8(16, m, 0, n), \
675 .ns_val = NS(23, 16, n, m, 5, 4, 3, d, 2, 0, s##_to_bb_mux), \
Vikram Mulukutla489e39e2011-08-31 18:04:05 -0700676 }
677static struct clk_freq_tbl clk_tbl_sdc1_2[] = {
Matt Wagantalle18bbc82011-10-06 10:07:28 -0700678 F_SDC( 0, gnd, 1, 0, 0),
679 F_SDC( 144300, cxo, 1, 1, 133),
680 F_SDC( 400000, pll8, 4, 1, 240),
681 F_SDC( 16000000, pll8, 4, 1, 6),
682 F_SDC( 17070000, pll8, 1, 2, 45),
683 F_SDC( 20210000, pll8, 1, 1, 19),
684 F_SDC( 24000000, pll8, 4, 1, 4),
Vikram Mulukutla2d0f6432011-11-07 20:22:08 -0800685 F_SDC( 38400000, pll8, 2, 1, 5),
Matt Wagantalle18bbc82011-10-06 10:07:28 -0700686 F_SDC( 48000000, pll8, 4, 1, 2),
Vikram Mulukutla2d0f6432011-11-07 20:22:08 -0800687 F_SDC( 64000000, pll8, 3, 1, 2),
688 F_SDC( 76800000, pll8, 1, 1, 5),
Vikram Mulukutla489e39e2011-08-31 18:04:05 -0700689 F_END
690};
691
692static CLK_SDC(sdc1_clk, 1, 6, clk_tbl_sdc1_2);
693static CLK_SDC(sdc2_clk, 2, 5, clk_tbl_sdc1_2);
694
Matt Wagantalle18bbc82011-10-06 10:07:28 -0700695#define F_USB(f, s, d, m, n) \
Vikram Mulukutla489e39e2011-08-31 18:04:05 -0700696 { \
697 .freq_hz = f, \
698 .src_clk = &s##_clk.c, \
699 .md_val = MD8(16, m, 0, n), \
700 .ns_val = NS(23, 16, n, m, 5, 4, 3, d, 2, 0, s##_to_bb_mux), \
Vikram Mulukutla489e39e2011-08-31 18:04:05 -0700701 }
702static struct clk_freq_tbl clk_tbl_usb[] = {
Matt Wagantalle18bbc82011-10-06 10:07:28 -0700703 F_USB( 0, gnd, 1, 0, 0),
704 F_USB(60000000, pll8, 1, 5, 32),
Vikram Mulukutla489e39e2011-08-31 18:04:05 -0700705 F_END
706};
707
Vikram Mulukutla6c9158f2011-12-08 12:41:20 -0800708static struct clk_freq_tbl clk_tbl_usb_hsic_sys[] = {
709 F_USB( 0, gnd, 1, 0, 0),
710 F_USB(64000000, pll8, 1, 1, 6),
711 F_END
712};
713
Vikram Mulukutla489e39e2011-08-31 18:04:05 -0700714static struct rcg_clk usb_hs1_xcvr_clk = {
715 .b = {
716 .ctl_reg = USB_HS1_XCVR_FS_CLK_NS_REG,
717 .en_mask = BIT(9),
718 .reset_reg = USB_HS1_RESET_REG,
719 .reset_mask = BIT(0),
720 .halt_reg = CLK_HALT_DFAB_STATE_REG,
721 .halt_bit = 0,
722 },
723 .ns_reg = USB_HS1_XCVR_FS_CLK_NS_REG,
724 .md_reg = USB_HS1_XCVR_FS_CLK_MD_REG,
725 .root_en_mask = BIT(11),
726 .ns_mask = (BM(23, 16) | BM(6, 0)),
Matt Wagantall07c45472012-02-10 23:27:24 -0800727 .mnd_en_mask = BIT(8),
Vikram Mulukutla489e39e2011-08-31 18:04:05 -0700728 .set_rate = set_rate_mnd,
729 .freq_tbl = clk_tbl_usb,
730 .current_freq = &rcg_dummy_freq,
731 .c = {
732 .dbg_name = "usb_hs1_xcvr_clk",
733 .ops = &clk_ops_rcg_9615,
Matt Wagantalle18bbc82011-10-06 10:07:28 -0700734 VDD_DIG_FMAX_MAP1(NOMINAL, 60000000),
Vikram Mulukutla489e39e2011-08-31 18:04:05 -0700735 CLK_INIT(usb_hs1_xcvr_clk.c),
736 },
737};
738
739static struct rcg_clk usb_hs1_sys_clk = {
740 .b = {
741 .ctl_reg = USB_HS1_SYS_CLK_NS_REG,
742 .en_mask = BIT(9),
743 .reset_reg = USB_HS1_RESET_REG,
744 .reset_mask = BIT(0),
745 .halt_reg = CLK_HALT_DFAB_STATE_REG,
746 .halt_bit = 4,
747 },
748 .ns_reg = USB_HS1_SYS_CLK_NS_REG,
749 .md_reg = USB_HS1_SYS_CLK_MD_REG,
750 .root_en_mask = BIT(11),
751 .ns_mask = (BM(23, 16) | BM(6, 0)),
Matt Wagantall07c45472012-02-10 23:27:24 -0800752 .mnd_en_mask = BIT(8),
Vikram Mulukutla489e39e2011-08-31 18:04:05 -0700753 .set_rate = set_rate_mnd,
754 .freq_tbl = clk_tbl_usb,
755 .current_freq = &rcg_dummy_freq,
756 .c = {
757 .dbg_name = "usb_hs1_sys_clk",
758 .ops = &clk_ops_rcg_9615,
Matt Wagantalle18bbc82011-10-06 10:07:28 -0700759 VDD_DIG_FMAX_MAP1(NOMINAL, 60000000),
Vikram Mulukutla489e39e2011-08-31 18:04:05 -0700760 CLK_INIT(usb_hs1_sys_clk.c),
761 },
762};
763
764static struct rcg_clk usb_hsic_xcvr_clk = {
765 .b = {
766 .ctl_reg = USB_HSIC_XCVR_FS_CLK_NS_REG,
767 .en_mask = BIT(9),
768 .reset_reg = USB_HSIC_RESET_REG,
769 .reset_mask = BIT(0),
770 .halt_reg = CLK_HALT_DFAB_STATE_REG,
771 .halt_bit = 9,
772 },
773 .ns_reg = USB_HSIC_XCVR_FS_CLK_NS_REG,
774 .md_reg = USB_HSIC_XCVR_FS_CLK_MD_REG,
775 .root_en_mask = BIT(11),
776 .ns_mask = (BM(23, 16) | BM(6, 0)),
Matt Wagantall07c45472012-02-10 23:27:24 -0800777 .mnd_en_mask = BIT(8),
Vikram Mulukutla489e39e2011-08-31 18:04:05 -0700778 .set_rate = set_rate_mnd,
779 .freq_tbl = clk_tbl_usb,
780 .current_freq = &rcg_dummy_freq,
781 .c = {
782 .dbg_name = "usb_hsic_xcvr_clk",
783 .ops = &clk_ops_rcg_9615,
Vikram Mulukutla6c9158f2011-12-08 12:41:20 -0800784 VDD_DIG_FMAX_MAP1(LOW, 60000000),
Vikram Mulukutla489e39e2011-08-31 18:04:05 -0700785 CLK_INIT(usb_hsic_xcvr_clk.c),
786 },
787};
788
789static struct rcg_clk usb_hsic_sys_clk = {
790 .b = {
791 .ctl_reg = USB_HSIC_SYSTEM_CLK_NS_REG,
792 .en_mask = BIT(9),
793 .reset_reg = USB_HSIC_RESET_REG,
794 .reset_mask = BIT(0),
795 .halt_reg = CLK_HALT_DFAB_STATE_REG,
796 .halt_bit = 7,
797 },
798 .ns_reg = USB_HSIC_SYSTEM_CLK_NS_REG,
799 .md_reg = USB_HSIC_SYSTEM_CLK_MD_REG,
800 .root_en_mask = BIT(11),
801 .ns_mask = (BM(23, 16) | BM(6, 0)),
Matt Wagantall07c45472012-02-10 23:27:24 -0800802 .mnd_en_mask = BIT(8),
Vikram Mulukutla489e39e2011-08-31 18:04:05 -0700803 .set_rate = set_rate_mnd,
Vikram Mulukutla6c9158f2011-12-08 12:41:20 -0800804 .freq_tbl = clk_tbl_usb_hsic_sys,
Vikram Mulukutla489e39e2011-08-31 18:04:05 -0700805 .current_freq = &rcg_dummy_freq,
806 .c = {
807 .dbg_name = "usb_hsic_sys_clk",
808 .ops = &clk_ops_rcg_9615,
Vikram Mulukutla6c9158f2011-12-08 12:41:20 -0800809 VDD_DIG_FMAX_MAP1(LOW, 64000000),
Vikram Mulukutla489e39e2011-08-31 18:04:05 -0700810 CLK_INIT(usb_hsic_sys_clk.c),
811 },
812};
813
814static struct clk_freq_tbl clk_tbl_usb_hsic[] = {
Matt Wagantalle18bbc82011-10-06 10:07:28 -0700815 F_USB( 0, gnd, 1, 0, 0),
Vikram Mulukutla6c9158f2011-12-08 12:41:20 -0800816 F_USB(480000000, pll14, 1, 0, 0),
Vikram Mulukutla489e39e2011-08-31 18:04:05 -0700817 F_END
818};
819
820static struct rcg_clk usb_hsic_clk = {
821 .b = {
822 .ctl_reg = USB_HSIC_CLK_NS_REG,
823 .en_mask = BIT(9),
824 .reset_reg = USB_HSIC_RESET_REG,
825 .reset_mask = BIT(0),
Vikram Mulukutla6c9158f2011-12-08 12:41:20 -0800826 .halt_check = DELAY,
Vikram Mulukutla489e39e2011-08-31 18:04:05 -0700827 },
828 .ns_reg = USB_HSIC_CLK_NS_REG,
829 .md_reg = USB_HSIC_CLK_MD_REG,
830 .root_en_mask = BIT(11),
831 .ns_mask = (BM(23, 16) | BM(6, 0)),
832 .set_rate = set_rate_mnd,
833 .freq_tbl = clk_tbl_usb_hsic,
834 .current_freq = &rcg_dummy_freq,
835 .c = {
836 .dbg_name = "usb_hsic_clk",
837 .ops = &clk_ops_rcg_9615,
Vikram Mulukutla6c9158f2011-12-08 12:41:20 -0800838 VDD_DIG_FMAX_MAP1(LOW, 480000000),
Vikram Mulukutla489e39e2011-08-31 18:04:05 -0700839 CLK_INIT(usb_hsic_clk.c),
840 },
841};
842
843static struct branch_clk usb_hsic_hsio_cal_clk = {
844 .b = {
845 .ctl_reg = USB_HSIC_HSIO_CAL_CLK_CTL_REG,
846 .en_mask = BIT(0),
847 .halt_reg = CLK_HALT_DFAB_STATE_REG,
848 .halt_bit = 8,
849 },
850 .parent = &cxo_clk.c,
851 .c = {
852 .dbg_name = "usb_hsic_hsio_cal_clk",
853 .ops = &clk_ops_branch,
854 CLK_INIT(usb_hsic_hsio_cal_clk.c),
855 },
856};
857
858/* Fast Peripheral Bus Clocks */
859static struct branch_clk ce1_core_clk = {
860 .b = {
861 .ctl_reg = CE1_CORE_CLK_CTL_REG,
862 .en_mask = BIT(4),
Matt Wagantallbc8c9062012-02-07 12:33:06 -0800863 .hwcg_reg = CE1_CORE_CLK_CTL_REG,
864 .hwcg_mask = BIT(6),
Vikram Mulukutla489e39e2011-08-31 18:04:05 -0700865 .halt_reg = CLK_HALT_CFPB_STATEC_REG,
866 .halt_bit = 27,
867 },
868 .c = {
869 .dbg_name = "ce1_core_clk",
870 .ops = &clk_ops_branch,
871 CLK_INIT(ce1_core_clk.c),
872 },
873};
874static struct branch_clk ce1_p_clk = {
875 .b = {
876 .ctl_reg = CE1_HCLK_CTL_REG,
877 .en_mask = BIT(4),
878 .halt_reg = CLK_HALT_CFPB_STATEC_REG,
879 .halt_bit = 1,
880 },
881 .c = {
882 .dbg_name = "ce1_p_clk",
883 .ops = &clk_ops_branch,
884 CLK_INIT(ce1_p_clk.c),
885 },
886};
887
888static struct branch_clk dma_bam_p_clk = {
889 .b = {
890 .ctl_reg = DMA_BAM_HCLK_CTL,
891 .en_mask = BIT(4),
892 .halt_reg = CLK_HALT_DFAB_STATE_REG,
893 .halt_bit = 12,
894 },
895 .c = {
896 .dbg_name = "dma_bam_p_clk",
897 .ops = &clk_ops_branch,
898 CLK_INIT(dma_bam_p_clk.c),
899 },
900};
901
902static struct branch_clk gsbi1_p_clk = {
903 .b = {
904 .ctl_reg = GSBIn_HCLK_CTL_REG(1),
905 .en_mask = BIT(4),
906 .halt_reg = CLK_HALT_CFPB_STATEA_REG,
907 .halt_bit = 11,
908 },
909 .c = {
910 .dbg_name = "gsbi1_p_clk",
911 .ops = &clk_ops_branch,
912 CLK_INIT(gsbi1_p_clk.c),
913 },
914};
915
916static struct branch_clk gsbi2_p_clk = {
917 .b = {
918 .ctl_reg = GSBIn_HCLK_CTL_REG(2),
919 .en_mask = BIT(4),
920 .halt_reg = CLK_HALT_CFPB_STATEA_REG,
921 .halt_bit = 7,
922 },
923 .c = {
924 .dbg_name = "gsbi2_p_clk",
925 .ops = &clk_ops_branch,
926 CLK_INIT(gsbi2_p_clk.c),
927 },
928};
929
930static struct branch_clk gsbi3_p_clk = {
931 .b = {
932 .ctl_reg = GSBIn_HCLK_CTL_REG(3),
933 .en_mask = BIT(4),
934 .halt_reg = CLK_HALT_CFPB_STATEA_REG,
935 .halt_bit = 3,
936 },
937 .c = {
938 .dbg_name = "gsbi3_p_clk",
939 .ops = &clk_ops_branch,
940 CLK_INIT(gsbi3_p_clk.c),
941 },
942};
943
944static struct branch_clk gsbi4_p_clk = {
945 .b = {
946 .ctl_reg = GSBIn_HCLK_CTL_REG(4),
947 .en_mask = BIT(4),
948 .halt_reg = CLK_HALT_CFPB_STATEB_REG,
949 .halt_bit = 27,
950 },
951 .c = {
952 .dbg_name = "gsbi4_p_clk",
953 .ops = &clk_ops_branch,
954 CLK_INIT(gsbi4_p_clk.c),
955 },
956};
957
958static struct branch_clk gsbi5_p_clk = {
959 .b = {
960 .ctl_reg = GSBIn_HCLK_CTL_REG(5),
961 .en_mask = BIT(4),
962 .halt_reg = CLK_HALT_CFPB_STATEB_REG,
963 .halt_bit = 23,
964 },
965 .c = {
966 .dbg_name = "gsbi5_p_clk",
967 .ops = &clk_ops_branch,
968 CLK_INIT(gsbi5_p_clk.c),
969 },
970};
971
972static struct branch_clk usb_hs1_p_clk = {
973 .b = {
974 .ctl_reg = USB_HS1_HCLK_CTL_REG,
975 .en_mask = BIT(4),
Matt Wagantallbc8c9062012-02-07 12:33:06 -0800976 .hwcg_reg = USB_HS1_HCLK_CTL_REG,
977 .hwcg_mask = BIT(6),
Vikram Mulukutla489e39e2011-08-31 18:04:05 -0700978 .halt_reg = CLK_HALT_DFAB_STATE_REG,
979 .halt_bit = 1,
980 },
981 .c = {
982 .dbg_name = "usb_hs1_p_clk",
983 .ops = &clk_ops_branch,
984 CLK_INIT(usb_hs1_p_clk.c),
985 },
986};
987
988static struct branch_clk usb_hsic_p_clk = {
989 .b = {
990 .ctl_reg = USB_HSIC_HCLK_CTL_REG,
991 .en_mask = BIT(4),
Matt Wagantallbc8c9062012-02-07 12:33:06 -0800992 .hwcg_reg = USB_HSIC_HCLK_CTL_REG,
993 .hwcg_mask = BIT(6),
Vikram Mulukutla489e39e2011-08-31 18:04:05 -0700994 .halt_reg = CLK_HALT_DFAB_STATE_REG,
995 .halt_bit = 3,
996 },
997 .c = {
998 .dbg_name = "usb_hsic_p_clk",
999 .ops = &clk_ops_branch,
1000 CLK_INIT(usb_hsic_p_clk.c),
1001 },
1002};
1003
1004static struct branch_clk sdc1_p_clk = {
1005 .b = {
1006 .ctl_reg = SDCn_HCLK_CTL_REG(1),
1007 .en_mask = BIT(4),
Matt Wagantallbc8c9062012-02-07 12:33:06 -08001008 .hwcg_reg = SDCn_HCLK_CTL_REG(1),
1009 .hwcg_mask = BIT(6),
Vikram Mulukutla489e39e2011-08-31 18:04:05 -07001010 .halt_reg = CLK_HALT_DFAB_STATE_REG,
1011 .halt_bit = 11,
1012 },
1013 .c = {
1014 .dbg_name = "sdc1_p_clk",
1015 .ops = &clk_ops_branch,
1016 CLK_INIT(sdc1_p_clk.c),
1017 },
1018};
1019
1020static struct branch_clk sdc2_p_clk = {
1021 .b = {
1022 .ctl_reg = SDCn_HCLK_CTL_REG(2),
1023 .en_mask = BIT(4),
Matt Wagantallbc8c9062012-02-07 12:33:06 -08001024 .hwcg_reg = SDCn_HCLK_CTL_REG(2),
1025 .hwcg_mask = BIT(6),
Vikram Mulukutla489e39e2011-08-31 18:04:05 -07001026 .halt_reg = CLK_HALT_DFAB_STATE_REG,
1027 .halt_bit = 10,
1028 },
1029 .c = {
1030 .dbg_name = "sdc2_p_clk",
1031 .ops = &clk_ops_branch,
1032 CLK_INIT(sdc2_p_clk.c),
1033 },
1034};
1035
1036/* HW-Voteable Clocks */
1037static struct branch_clk adm0_clk = {
1038 .b = {
1039 .ctl_reg = SC0_U_CLK_BRANCH_ENA_VOTE_REG,
1040 .en_mask = BIT(2),
1041 .halt_reg = CLK_HALT_MSS_KPSS_MISC_STATE_REG,
1042 .halt_check = HALT_VOTED,
1043 .halt_bit = 14,
1044 },
1045 .c = {
1046 .dbg_name = "adm0_clk",
1047 .ops = &clk_ops_branch,
1048 CLK_INIT(adm0_clk.c),
1049 },
1050};
1051
1052static struct branch_clk adm0_p_clk = {
1053 .b = {
1054 .ctl_reg = SC0_U_CLK_BRANCH_ENA_VOTE_REG,
1055 .en_mask = BIT(3),
1056 .halt_reg = CLK_HALT_MSS_KPSS_MISC_STATE_REG,
1057 .halt_check = HALT_VOTED,
1058 .halt_bit = 13,
1059 },
1060 .c = {
1061 .dbg_name = "adm0_p_clk",
1062 .ops = &clk_ops_branch,
1063 CLK_INIT(adm0_p_clk.c),
1064 },
1065};
1066
1067static struct branch_clk pmic_arb0_p_clk = {
1068 .b = {
1069 .ctl_reg = SC0_U_CLK_BRANCH_ENA_VOTE_REG,
1070 .en_mask = BIT(8),
1071 .halt_reg = CLK_HALT_SFPB_MISC_STATE_REG,
1072 .halt_check = HALT_VOTED,
1073 .halt_bit = 22,
1074 },
1075 .c = {
1076 .dbg_name = "pmic_arb0_p_clk",
1077 .ops = &clk_ops_branch,
1078 CLK_INIT(pmic_arb0_p_clk.c),
1079 },
1080};
1081
1082static struct branch_clk pmic_arb1_p_clk = {
1083 .b = {
1084 .ctl_reg = SC0_U_CLK_BRANCH_ENA_VOTE_REG,
1085 .en_mask = BIT(9),
1086 .halt_reg = CLK_HALT_SFPB_MISC_STATE_REG,
1087 .halt_check = HALT_VOTED,
1088 .halt_bit = 21,
1089 },
1090 .c = {
1091 .dbg_name = "pmic_arb1_p_clk",
1092 .ops = &clk_ops_branch,
1093 CLK_INIT(pmic_arb1_p_clk.c),
1094 },
1095};
1096
1097static struct branch_clk pmic_ssbi2_clk = {
1098 .b = {
1099 .ctl_reg = SC0_U_CLK_BRANCH_ENA_VOTE_REG,
1100 .en_mask = BIT(7),
1101 .halt_reg = CLK_HALT_SFPB_MISC_STATE_REG,
1102 .halt_check = HALT_VOTED,
1103 .halt_bit = 23,
1104 },
1105 .c = {
1106 .dbg_name = "pmic_ssbi2_clk",
1107 .ops = &clk_ops_branch,
1108 CLK_INIT(pmic_ssbi2_clk.c),
1109 },
1110};
1111
1112static struct branch_clk rpm_msg_ram_p_clk = {
1113 .b = {
1114 .ctl_reg = SC0_U_CLK_BRANCH_ENA_VOTE_REG,
1115 .en_mask = BIT(6),
1116 .halt_reg = CLK_HALT_SFPB_MISC_STATE_REG,
1117 .halt_check = HALT_VOTED,
1118 .halt_bit = 12,
1119 },
1120 .c = {
1121 .dbg_name = "rpm_msg_ram_p_clk",
1122 .ops = &clk_ops_branch,
1123 CLK_INIT(rpm_msg_ram_p_clk.c),
1124 },
1125};
1126
1127/*
1128 * Low Power Audio Clocks
1129 */
Matt Wagantalle18bbc82011-10-06 10:07:28 -07001130#define F_AIF_OSR(f, s, d, m, n) \
Vikram Mulukutla489e39e2011-08-31 18:04:05 -07001131 { \
1132 .freq_hz = f, \
1133 .src_clk = &s##_clk.c, \
1134 .md_val = MD8(8, m, 0, n), \
1135 .ns_val = NS(31, 24, n, m, 5, 4, 3, d, 2, 0, s##_to_lpa_mux), \
Vikram Mulukutla489e39e2011-08-31 18:04:05 -07001136 }
1137static struct clk_freq_tbl clk_tbl_aif_osr[] = {
Matt Wagantalle18bbc82011-10-06 10:07:28 -07001138 F_AIF_OSR( 0, gnd, 1, 0, 0),
1139 F_AIF_OSR( 512000, pll4, 4, 1, 192),
1140 F_AIF_OSR( 768000, pll4, 4, 1, 128),
1141 F_AIF_OSR( 1024000, pll4, 4, 1, 96),
1142 F_AIF_OSR( 1536000, pll4, 4, 1, 64),
1143 F_AIF_OSR( 2048000, pll4, 4, 1, 48),
1144 F_AIF_OSR( 3072000, pll4, 4, 1, 32),
1145 F_AIF_OSR( 4096000, pll4, 4, 1, 24),
1146 F_AIF_OSR( 6144000, pll4, 4, 1, 16),
1147 F_AIF_OSR( 8192000, pll4, 4, 1, 12),
1148 F_AIF_OSR(12288000, pll4, 4, 1, 8),
1149 F_AIF_OSR(24576000, pll4, 4, 1, 4),
Vikram Mulukutla489e39e2011-08-31 18:04:05 -07001150 F_END
1151};
1152
1153#define CLK_AIF_OSR(i, ns, md, h_r) \
1154 struct rcg_clk i##_clk = { \
1155 .b = { \
1156 .ctl_reg = ns, \
1157 .en_mask = BIT(17), \
1158 .reset_reg = ns, \
1159 .reset_mask = BIT(19), \
1160 .halt_reg = h_r, \
1161 .halt_check = ENABLE, \
1162 .halt_bit = 1, \
1163 }, \
1164 .ns_reg = ns, \
1165 .md_reg = md, \
1166 .root_en_mask = BIT(9), \
1167 .ns_mask = (BM(31, 24) | BM(6, 0)), \
Matt Wagantall07c45472012-02-10 23:27:24 -08001168 .mnd_en_mask = BIT(8), \
Vikram Mulukutla489e39e2011-08-31 18:04:05 -07001169 .set_rate = set_rate_mnd, \
1170 .freq_tbl = clk_tbl_aif_osr, \
1171 .current_freq = &rcg_dummy_freq, \
1172 .c = { \
1173 .dbg_name = #i "_clk", \
1174 .ops = &clk_ops_rcg_9615, \
1175 CLK_INIT(i##_clk.c), \
1176 }, \
1177 }
1178#define CLK_AIF_OSR_DIV(i, ns, md, h_r) \
1179 struct rcg_clk i##_clk = { \
1180 .b = { \
1181 .ctl_reg = ns, \
1182 .en_mask = BIT(21), \
1183 .reset_reg = ns, \
1184 .reset_mask = BIT(23), \
1185 .halt_reg = h_r, \
1186 .halt_check = ENABLE, \
1187 .halt_bit = 1, \
1188 }, \
1189 .ns_reg = ns, \
1190 .md_reg = md, \
1191 .root_en_mask = BIT(9), \
1192 .ns_mask = (BM(31, 24) | BM(6, 0)), \
Matt Wagantall07c45472012-02-10 23:27:24 -08001193 .mnd_en_mask = BIT(8), \
Vikram Mulukutla489e39e2011-08-31 18:04:05 -07001194 .set_rate = set_rate_mnd, \
1195 .freq_tbl = clk_tbl_aif_osr, \
1196 .current_freq = &rcg_dummy_freq, \
1197 .c = { \
1198 .dbg_name = #i "_clk", \
1199 .ops = &clk_ops_rcg_9615, \
1200 CLK_INIT(i##_clk.c), \
1201 }, \
1202 }
1203
Vikram Mulukutla489e39e2011-08-31 18:04:05 -07001204#define CLK_AIF_BIT(i, ns, h_r) \
Stephen Boyd9fd19642011-11-16 11:11:09 -08001205 struct cdiv_clk i##_clk = { \
Vikram Mulukutla489e39e2011-08-31 18:04:05 -07001206 .b = { \
1207 .ctl_reg = ns, \
1208 .en_mask = BIT(15), \
1209 .halt_reg = h_r, \
1210 .halt_check = DELAY, \
1211 }, \
1212 .ns_reg = ns, \
Stephen Boyd9fd19642011-11-16 11:11:09 -08001213 .ext_mask = BIT(14), \
1214 .div_offset = 10, \
1215 .max_div = 16, \
Vikram Mulukutla489e39e2011-08-31 18:04:05 -07001216 .c = { \
1217 .dbg_name = #i "_clk", \
Stephen Boyd9fd19642011-11-16 11:11:09 -08001218 .ops = &clk_ops_cdiv, \
Vikram Mulukutla489e39e2011-08-31 18:04:05 -07001219 CLK_INIT(i##_clk.c), \
1220 }, \
1221 }
1222
Vikram Mulukutla489e39e2011-08-31 18:04:05 -07001223#define CLK_AIF_BIT_DIV(i, ns, h_r) \
Stephen Boyd9fd19642011-11-16 11:11:09 -08001224 struct cdiv_clk i##_clk = { \
Vikram Mulukutla489e39e2011-08-31 18:04:05 -07001225 .b = { \
1226 .ctl_reg = ns, \
1227 .en_mask = BIT(19), \
1228 .halt_reg = h_r, \
Stephen Boyd7bb9cf82012-01-25 18:09:01 -08001229 .halt_check = DELAY, \
Vikram Mulukutla489e39e2011-08-31 18:04:05 -07001230 }, \
1231 .ns_reg = ns, \
Stephen Boyd9fd19642011-11-16 11:11:09 -08001232 .ext_mask = BIT(18), \
1233 .div_offset = 10, \
1234 .max_div = 256, \
Vikram Mulukutla489e39e2011-08-31 18:04:05 -07001235 .c = { \
1236 .dbg_name = #i "_clk", \
Stephen Boyd9fd19642011-11-16 11:11:09 -08001237 .ops = &clk_ops_cdiv, \
Vikram Mulukutla489e39e2011-08-31 18:04:05 -07001238 CLK_INIT(i##_clk.c), \
1239 }, \
1240 }
1241
1242static CLK_AIF_OSR(mi2s_osr, LCC_MI2S_NS_REG, LCC_MI2S_MD_REG,
1243 LCC_MI2S_STATUS_REG);
1244static CLK_AIF_BIT(mi2s_bit, LCC_MI2S_NS_REG, LCC_MI2S_STATUS_REG);
1245
1246static CLK_AIF_OSR_DIV(codec_i2s_mic_osr, LCC_CODEC_I2S_MIC_NS_REG,
1247 LCC_CODEC_I2S_MIC_MD_REG, LCC_CODEC_I2S_MIC_STATUS_REG);
1248static CLK_AIF_BIT_DIV(codec_i2s_mic_bit, LCC_CODEC_I2S_MIC_NS_REG,
1249 LCC_CODEC_I2S_MIC_STATUS_REG);
1250
1251static CLK_AIF_OSR_DIV(spare_i2s_mic_osr, LCC_SPARE_I2S_MIC_NS_REG,
1252 LCC_SPARE_I2S_MIC_MD_REG, LCC_SPARE_I2S_MIC_STATUS_REG);
1253static CLK_AIF_BIT_DIV(spare_i2s_mic_bit, LCC_SPARE_I2S_MIC_NS_REG,
1254 LCC_SPARE_I2S_MIC_STATUS_REG);
1255
1256static CLK_AIF_OSR_DIV(codec_i2s_spkr_osr, LCC_CODEC_I2S_SPKR_NS_REG,
1257 LCC_CODEC_I2S_SPKR_MD_REG, LCC_CODEC_I2S_SPKR_STATUS_REG);
1258static CLK_AIF_BIT_DIV(codec_i2s_spkr_bit, LCC_CODEC_I2S_SPKR_NS_REG,
1259 LCC_CODEC_I2S_SPKR_STATUS_REG);
1260
1261static CLK_AIF_OSR_DIV(spare_i2s_spkr_osr, LCC_SPARE_I2S_SPKR_NS_REG,
1262 LCC_SPARE_I2S_SPKR_MD_REG, LCC_SPARE_I2S_SPKR_STATUS_REG);
1263static CLK_AIF_BIT_DIV(spare_i2s_spkr_bit, LCC_SPARE_I2S_SPKR_NS_REG,
1264 LCC_SPARE_I2S_SPKR_STATUS_REG);
1265
Matt Wagantalle18bbc82011-10-06 10:07:28 -07001266#define F_PCM(f, s, d, m, n) \
Vikram Mulukutla489e39e2011-08-31 18:04:05 -07001267 { \
1268 .freq_hz = f, \
1269 .src_clk = &s##_clk.c, \
1270 .md_val = MD16(m, n), \
1271 .ns_val = NS(31, 16, n, m, 5, 4, 3, d, 2, 0, s##_to_lpa_mux), \
Vikram Mulukutla489e39e2011-08-31 18:04:05 -07001272 }
1273static struct clk_freq_tbl clk_tbl_pcm[] = {
Matt Wagantalle18bbc82011-10-06 10:07:28 -07001274 F_PCM( 0, gnd, 1, 0, 0),
1275 F_PCM( 512000, pll4, 4, 1, 192),
1276 F_PCM( 768000, pll4, 4, 1, 128),
1277 F_PCM( 1024000, pll4, 4, 1, 96),
1278 F_PCM( 1536000, pll4, 4, 1, 64),
1279 F_PCM( 2048000, pll4, 4, 1, 48),
1280 F_PCM( 3072000, pll4, 4, 1, 32),
1281 F_PCM( 4096000, pll4, 4, 1, 24),
1282 F_PCM( 6144000, pll4, 4, 1, 16),
1283 F_PCM( 8192000, pll4, 4, 1, 12),
1284 F_PCM(12288000, pll4, 4, 1, 8),
1285 F_PCM(24576000, pll4, 4, 1, 4),
Vikram Mulukutla489e39e2011-08-31 18:04:05 -07001286 F_END
1287};
1288
1289static struct rcg_clk pcm_clk = {
1290 .b = {
1291 .ctl_reg = LCC_PCM_NS_REG,
1292 .en_mask = BIT(11),
1293 .reset_reg = LCC_PCM_NS_REG,
1294 .reset_mask = BIT(13),
1295 .halt_reg = LCC_PCM_STATUS_REG,
1296 .halt_check = ENABLE,
1297 .halt_bit = 0,
1298 },
1299 .ns_reg = LCC_PCM_NS_REG,
1300 .md_reg = LCC_PCM_MD_REG,
1301 .root_en_mask = BIT(9),
1302 .ns_mask = (BM(31, 16) | BM(6, 0)),
Matt Wagantall07c45472012-02-10 23:27:24 -08001303 .mnd_en_mask = BIT(8),
Vikram Mulukutla489e39e2011-08-31 18:04:05 -07001304 .set_rate = set_rate_mnd,
1305 .freq_tbl = clk_tbl_pcm,
1306 .current_freq = &rcg_dummy_freq,
1307 .c = {
1308 .dbg_name = "pcm_clk",
1309 .ops = &clk_ops_rcg_9615,
Matt Wagantalle18bbc82011-10-06 10:07:28 -07001310 VDD_DIG_FMAX_MAP1(LOW, 24576000),
Vikram Mulukutla489e39e2011-08-31 18:04:05 -07001311 CLK_INIT(pcm_clk.c),
1312 },
1313};
1314
1315static struct rcg_clk audio_slimbus_clk = {
1316 .b = {
1317 .ctl_reg = LCC_SLIMBUS_NS_REG,
1318 .en_mask = BIT(10),
1319 .reset_reg = LCC_AHBEX_BRANCH_CTL_REG,
1320 .reset_mask = BIT(5),
1321 .halt_reg = LCC_SLIMBUS_STATUS_REG,
1322 .halt_check = ENABLE,
1323 .halt_bit = 0,
1324 },
1325 .ns_reg = LCC_SLIMBUS_NS_REG,
1326 .md_reg = LCC_SLIMBUS_MD_REG,
1327 .root_en_mask = BIT(9),
1328 .ns_mask = (BM(31, 24) | BM(6, 0)),
Matt Wagantall07c45472012-02-10 23:27:24 -08001329 .mnd_en_mask = BIT(8),
Vikram Mulukutla489e39e2011-08-31 18:04:05 -07001330 .set_rate = set_rate_mnd,
1331 .freq_tbl = clk_tbl_aif_osr,
1332 .current_freq = &rcg_dummy_freq,
1333 .c = {
1334 .dbg_name = "audio_slimbus_clk",
1335 .ops = &clk_ops_rcg_9615,
Matt Wagantalle18bbc82011-10-06 10:07:28 -07001336 VDD_DIG_FMAX_MAP1(LOW, 24576000),
Vikram Mulukutla489e39e2011-08-31 18:04:05 -07001337 CLK_INIT(audio_slimbus_clk.c),
1338 },
1339};
1340
1341static struct branch_clk sps_slimbus_clk = {
1342 .b = {
1343 .ctl_reg = LCC_SLIMBUS_NS_REG,
1344 .en_mask = BIT(12),
1345 .halt_reg = LCC_SLIMBUS_STATUS_REG,
1346 .halt_check = ENABLE,
1347 .halt_bit = 1,
1348 },
1349 .parent = &audio_slimbus_clk.c,
1350 .c = {
1351 .dbg_name = "sps_slimbus_clk",
1352 .ops = &clk_ops_branch,
1353 CLK_INIT(sps_slimbus_clk.c),
1354 },
1355};
1356
1357static struct branch_clk slimbus_xo_src_clk = {
1358 .b = {
1359 .ctl_reg = SLIMBUS_XO_SRC_CLK_CTL_REG,
1360 .en_mask = BIT(2),
1361 .halt_reg = CLK_HALT_DFAB_STATE_REG,
1362 .halt_bit = 28,
1363 },
1364 .parent = &sps_slimbus_clk.c,
1365 .c = {
1366 .dbg_name = "slimbus_xo_src_clk",
1367 .ops = &clk_ops_branch,
1368 CLK_INIT(slimbus_xo_src_clk.c),
1369 },
1370};
1371
Vikram Mulukutla73d42112011-09-19 16:32:54 -07001372DEFINE_CLK_RPM(cfpb_clk, cfpb_a_clk, CFPB, NULL);
1373DEFINE_CLK_RPM(dfab_clk, dfab_a_clk, DAYTONA_FABRIC, NULL);
1374DEFINE_CLK_RPM(ebi1_clk, ebi1_a_clk, EBI1, NULL);
1375DEFINE_CLK_RPM(sfab_clk, sfab_a_clk, SYSTEM_FABRIC, NULL);
1376DEFINE_CLK_RPM(sfpb_clk, sfpb_a_clk, SFPB, NULL);
1377
1378static DEFINE_CLK_VOTER(dfab_usb_hs_clk, &dfab_clk.c);
1379static DEFINE_CLK_VOTER(dfab_sdc1_clk, &dfab_clk.c);
1380static DEFINE_CLK_VOTER(dfab_sdc2_clk, &dfab_clk.c);
1381static DEFINE_CLK_VOTER(dfab_sps_clk, &dfab_clk.c);
Vikram Mulukutlacfd73ad2011-11-09 11:39:34 -08001382static DEFINE_CLK_VOTER(dfab_bam_dmux_clk, &dfab_clk.c);
Vikram Mulukutla73d42112011-09-19 16:32:54 -07001383static DEFINE_CLK_VOTER(ebi1_msmbus_clk, &ebi1_clk.c);
Vikram Mulukutla489e39e2011-08-31 18:04:05 -07001384
1385/*
1386 * TODO: replace dummy_clk below with ebi1_clk.c once the
1387 * bus driver starts voting on ebi1 rates.
1388 */
1389static DEFINE_CLK_VOTER(ebi1_adm_clk, &dummy_clk);
1390
1391#ifdef CONFIG_DEBUG_FS
1392struct measure_sel {
1393 u32 test_vector;
1394 struct clk *clk;
1395};
1396
Vikram Mulukutlaefd64f52012-01-09 17:41:09 -08001397static DEFINE_CLK_MEASURE(q6sw_clk);
1398static DEFINE_CLK_MEASURE(q6fw_clk);
1399static DEFINE_CLK_MEASURE(q6_func_clk);
1400
Vikram Mulukutla489e39e2011-08-31 18:04:05 -07001401static struct measure_sel measure_mux[] = {
1402 { TEST_PER_LS(0x08), &slimbus_xo_src_clk.c },
1403 { TEST_PER_LS(0x12), &sdc1_p_clk.c },
1404 { TEST_PER_LS(0x13), &sdc1_clk.c },
1405 { TEST_PER_LS(0x14), &sdc2_p_clk.c },
1406 { TEST_PER_LS(0x15), &sdc2_clk.c },
Matt Wagantall7625a4c2011-11-01 16:17:53 -07001407 { TEST_PER_LS(0x1F), &gp0_clk.c },
1408 { TEST_PER_LS(0x20), &gp1_clk.c },
1409 { TEST_PER_LS(0x21), &gp2_clk.c },
Vikram Mulukutla489e39e2011-08-31 18:04:05 -07001410 { TEST_PER_LS(0x26), &pmem_clk.c },
Vikram Mulukutla73d42112011-09-19 16:32:54 -07001411 { TEST_PER_LS(0x25), &dfab_clk.c },
1412 { TEST_PER_LS(0x25), &dfab_a_clk.c },
Vikram Mulukutla489e39e2011-08-31 18:04:05 -07001413 { TEST_PER_LS(0x32), &dma_bam_p_clk.c },
Vikram Mulukutla73d42112011-09-19 16:32:54 -07001414 { TEST_PER_LS(0x33), &cfpb_clk.c },
1415 { TEST_PER_LS(0x33), &cfpb_a_clk.c },
Vikram Mulukutla489e39e2011-08-31 18:04:05 -07001416 { TEST_PER_LS(0x3E), &gsbi1_uart_clk.c },
1417 { TEST_PER_LS(0x3F), &gsbi1_qup_clk.c },
1418 { TEST_PER_LS(0x41), &gsbi2_p_clk.c },
1419 { TEST_PER_LS(0x42), &gsbi2_uart_clk.c },
1420 { TEST_PER_LS(0x44), &gsbi2_qup_clk.c },
1421 { TEST_PER_LS(0x45), &gsbi3_p_clk.c },
1422 { TEST_PER_LS(0x46), &gsbi3_uart_clk.c },
1423 { TEST_PER_LS(0x48), &gsbi3_qup_clk.c },
1424 { TEST_PER_LS(0x49), &gsbi4_p_clk.c },
1425 { TEST_PER_LS(0x4A), &gsbi4_uart_clk.c },
1426 { TEST_PER_LS(0x4C), &gsbi4_qup_clk.c },
1427 { TEST_PER_LS(0x4D), &gsbi5_p_clk.c },
1428 { TEST_PER_LS(0x4E), &gsbi5_uart_clk.c },
1429 { TEST_PER_LS(0x50), &gsbi5_qup_clk.c },
Vikram Mulukutla73d42112011-09-19 16:32:54 -07001430 { TEST_PER_LS(0x78), &sfpb_clk.c },
1431 { TEST_PER_LS(0x78), &sfpb_a_clk.c },
Vikram Mulukutla489e39e2011-08-31 18:04:05 -07001432 { TEST_PER_LS(0x7A), &pmic_ssbi2_clk.c },
1433 { TEST_PER_LS(0x7B), &pmic_arb0_p_clk.c },
1434 { TEST_PER_LS(0x7C), &pmic_arb1_p_clk.c },
1435 { TEST_PER_LS(0x7D), &prng_clk.c },
1436 { TEST_PER_LS(0x7F), &rpm_msg_ram_p_clk.c },
1437 { TEST_PER_LS(0x80), &adm0_p_clk.c },
1438 { TEST_PER_LS(0x84), &usb_hs1_p_clk.c },
1439 { TEST_PER_LS(0x85), &usb_hs1_xcvr_clk.c },
1440 { TEST_PER_LS(0x86), &usb_hsic_sys_clk.c },
1441 { TEST_PER_LS(0x87), &usb_hsic_p_clk.c },
1442 { TEST_PER_LS(0x88), &usb_hsic_xcvr_clk.c },
1443 { TEST_PER_LS(0x8B), &usb_hsic_hsio_cal_clk.c },
1444 { TEST_PER_LS(0x8D), &usb_hs1_sys_clk.c },
1445 { TEST_PER_LS(0x92), &ce1_p_clk.c },
Vikram Mulukutla73d42112011-09-19 16:32:54 -07001446 { TEST_PER_HS(0x18), &sfab_clk.c },
1447 { TEST_PER_HS(0x18), &sfab_a_clk.c },
Vikram Mulukutlaefd64f52012-01-09 17:41:09 -08001448 { TEST_PER_HS(0x26), &q6sw_clk },
1449 { TEST_PER_HS(0x27), &q6fw_clk },
Vikram Mulukutla489e39e2011-08-31 18:04:05 -07001450 { TEST_PER_LS(0xA4), &ce1_core_clk.c },
1451 { TEST_PER_HS(0x2A), &adm0_clk.c },
Vikram Mulukutla73d42112011-09-19 16:32:54 -07001452 { TEST_PER_HS(0x34), &ebi1_clk.c },
1453 { TEST_PER_HS(0x34), &ebi1_a_clk.c },
Vikram Mulukutla6c9158f2011-12-08 12:41:20 -08001454 { TEST_PER_HS(0x3E), &usb_hsic_clk.c },
Vikram Mulukutla489e39e2011-08-31 18:04:05 -07001455 { TEST_LPA(0x0F), &mi2s_bit_clk.c },
1456 { TEST_LPA(0x10), &codec_i2s_mic_bit_clk.c },
1457 { TEST_LPA(0x11), &codec_i2s_spkr_bit_clk.c },
1458 { TEST_LPA(0x12), &spare_i2s_mic_bit_clk.c },
1459 { TEST_LPA(0x13), &spare_i2s_spkr_bit_clk.c },
1460 { TEST_LPA(0x14), &pcm_clk.c },
1461 { TEST_LPA(0x1D), &audio_slimbus_clk.c },
Vikram Mulukutlaefd64f52012-01-09 17:41:09 -08001462 { TEST_LPA_HS(0x00), &q6_func_clk },
Vikram Mulukutla489e39e2011-08-31 18:04:05 -07001463};
1464
1465static struct measure_sel *find_measure_sel(struct clk *clk)
1466{
1467 int i;
1468
1469 for (i = 0; i < ARRAY_SIZE(measure_mux); i++)
1470 if (measure_mux[i].clk == clk)
1471 return &measure_mux[i];
1472 return NULL;
1473}
1474
1475static int measure_clk_set_parent(struct clk *c, struct clk *parent)
1476{
1477 int ret = 0;
1478 u32 clk_sel;
1479 struct measure_sel *p;
1480 struct measure_clk *clk = to_measure_clk(c);
1481 unsigned long flags;
1482
1483 if (!parent)
1484 return -EINVAL;
1485
1486 p = find_measure_sel(parent);
1487 if (!p)
1488 return -EINVAL;
1489
1490 spin_lock_irqsave(&local_clock_reg_lock, flags);
1491
1492 /*
1493 * Program the test vector, measurement period (sample_ticks)
1494 * and scaling multiplier.
1495 */
1496 clk->sample_ticks = 0x10000;
1497 clk_sel = p->test_vector & TEST_CLK_SEL_MASK;
1498 clk->multiplier = 1;
1499 switch (p->test_vector >> TEST_TYPE_SHIFT) {
1500 case TEST_TYPE_PER_LS:
1501 writel_relaxed(0x4030D00|BVAL(7, 0, clk_sel), CLK_TEST_REG);
1502 break;
1503 case TEST_TYPE_PER_HS:
1504 writel_relaxed(0x4020000|BVAL(16, 10, clk_sel), CLK_TEST_REG);
1505 break;
1506 case TEST_TYPE_LPA:
1507 writel_relaxed(0x4030D98, CLK_TEST_REG);
1508 writel_relaxed(BVAL(6, 1, clk_sel)|BIT(0),
1509 LCC_CLK_LS_DEBUG_CFG_REG);
1510 break;
Vikram Mulukutlaefd64f52012-01-09 17:41:09 -08001511 case TEST_TYPE_LPA_HS:
1512 writel_relaxed(0x402BC00, CLK_TEST_REG);
1513 writel_relaxed(BVAL(2, 1, clk_sel)|BIT(0),
1514 LCC_CLK_HS_DEBUG_CFG_REG);
1515 break;
Vikram Mulukutla489e39e2011-08-31 18:04:05 -07001516 default:
1517 ret = -EPERM;
1518 }
1519 /* Make sure test vector is set before starting measurements. */
1520 mb();
1521
1522 spin_unlock_irqrestore(&local_clock_reg_lock, flags);
1523
1524 return ret;
1525}
1526
1527/* Sample clock for 'ticks' reference clock ticks. */
Matt Wagantall9de3bfb2011-11-03 20:13:12 -07001528static unsigned long run_measurement(unsigned ticks)
Vikram Mulukutla489e39e2011-08-31 18:04:05 -07001529{
1530 /* Stop counters and set the XO4 counter start value. */
Vikram Mulukutla489e39e2011-08-31 18:04:05 -07001531 writel_relaxed(ticks, RINGOSC_TCXO_CTL_REG);
1532
1533 /* Wait for timer to become ready. */
1534 while ((readl_relaxed(RINGOSC_STATUS_REG) & BIT(25)) != 0)
1535 cpu_relax();
1536
1537 /* Run measurement and wait for completion. */
1538 writel_relaxed(BIT(28)|ticks, RINGOSC_TCXO_CTL_REG);
1539 while ((readl_relaxed(RINGOSC_STATUS_REG) & BIT(25)) == 0)
1540 cpu_relax();
1541
1542 /* Stop counters. */
1543 writel_relaxed(0x0, RINGOSC_TCXO_CTL_REG);
1544
1545 /* Return measured ticks. */
1546 return readl_relaxed(RINGOSC_STATUS_REG) & BM(24, 0);
1547}
1548
1549
1550/* Perform a hardware rate measurement for a given clock.
1551 FOR DEBUG USE ONLY: Measurements take ~15 ms! */
Matt Wagantall9de3bfb2011-11-03 20:13:12 -07001552static unsigned long measure_clk_get_rate(struct clk *c)
Vikram Mulukutla489e39e2011-08-31 18:04:05 -07001553{
1554 unsigned long flags;
1555 u32 pdm_reg_backup, ringosc_reg_backup;
1556 u64 raw_count_short, raw_count_full;
1557 struct measure_clk *clk = to_measure_clk(c);
1558 unsigned ret;
1559
1560 spin_lock_irqsave(&local_clock_reg_lock, flags);
1561
1562 /* Enable CXO/4 and RINGOSC branch and root. */
1563 pdm_reg_backup = readl_relaxed(PDM_CLK_NS_REG);
1564 ringosc_reg_backup = readl_relaxed(RINGOSC_NS_REG);
1565 writel_relaxed(0x2898, PDM_CLK_NS_REG);
1566 writel_relaxed(0xA00, RINGOSC_NS_REG);
1567
1568 /*
1569 * The ring oscillator counter will not reset if the measured clock
1570 * is not running. To detect this, run a short measurement before
1571 * the full measurement. If the raw results of the two are the same
1572 * then the clock must be off.
1573 */
1574
1575 /* Run a short measurement. (~1 ms) */
1576 raw_count_short = run_measurement(0x1000);
1577 /* Run a full measurement. (~14 ms) */
1578 raw_count_full = run_measurement(clk->sample_ticks);
1579
1580 writel_relaxed(ringosc_reg_backup, RINGOSC_NS_REG);
1581 writel_relaxed(pdm_reg_backup, PDM_CLK_NS_REG);
1582
1583 /* Return 0 if the clock is off. */
1584 if (raw_count_full == raw_count_short)
1585 ret = 0;
1586 else {
1587 /* Compute rate in Hz. */
1588 raw_count_full = ((raw_count_full * 10) + 15) * 4800000;
1589 do_div(raw_count_full, ((clk->sample_ticks * 10) + 35));
1590 ret = (raw_count_full * clk->multiplier);
1591 }
1592
1593 /* Route dbg_hs_clk to PLLTEST. 300mV single-ended amplitude. */
1594 writel_relaxed(0x38F8, PLLTEST_PAD_CFG_REG);
1595 spin_unlock_irqrestore(&local_clock_reg_lock, flags);
1596
1597 return ret;
1598}
1599#else /* !CONFIG_DEBUG_FS */
1600static int measure_clk_set_parent(struct clk *clk, struct clk *parent)
1601{
1602 return -EINVAL;
1603}
1604
Matt Wagantall9de3bfb2011-11-03 20:13:12 -07001605static unsigned long measure_clk_get_rate(struct clk *clk)
Vikram Mulukutla489e39e2011-08-31 18:04:05 -07001606{
1607 return 0;
1608}
1609#endif /* CONFIG_DEBUG_FS */
1610
1611static struct clk_ops measure_clk_ops = {
1612 .set_parent = measure_clk_set_parent,
1613 .get_rate = measure_clk_get_rate,
1614 .is_local = local_clk_is_local,
1615};
1616
1617static struct measure_clk measure_clk = {
1618 .c = {
1619 .dbg_name = "measure_clk",
1620 .ops = &measure_clk_ops,
1621 CLK_INIT(measure_clk.c),
1622 },
1623 .multiplier = 1,
1624};
1625
1626static struct clk_lookup msm_clocks_9615[] = {
Stephen Boyd7dd22662012-01-26 16:09:31 -08001627 CLK_LOOKUP("xo", cxo_clk.c, "msm_otg"),
Stephen Boyd69d35e32012-02-14 15:33:30 -08001628 CLK_LOOKUP("xo", cxo_clk.c, "BAM_RMNT"),
Vikram Mulukutla489e39e2011-08-31 18:04:05 -07001629 CLK_LOOKUP("pll0", pll0_clk.c, NULL),
1630 CLK_LOOKUP("pll8", pll8_clk.c, NULL),
Vikram Mulukutla489e39e2011-08-31 18:04:05 -07001631 CLK_LOOKUP("pll14", pll14_clk.c, NULL),
Vikram Mulukutla31680ae2011-11-04 14:23:55 -07001632
1633 CLK_LOOKUP("pll0", pll0_acpu_clk.c, "acpu"),
1634 CLK_LOOKUP("pll8", pll8_acpu_clk.c, "acpu"),
1635 CLK_LOOKUP("pll9", pll9_acpu_clk.c, "acpu"),
1636
Vikram Mulukutla489e39e2011-08-31 18:04:05 -07001637 CLK_LOOKUP("measure", measure_clk.c, "debug"),
1638
Matt Wagantallb2710b82011-11-16 19:55:17 -08001639 CLK_LOOKUP("bus_clk", sfab_clk.c, "msm_sys_fab"),
1640 CLK_LOOKUP("bus_a_clk", sfab_a_clk.c, "msm_sys_fab"),
1641 CLK_LOOKUP("mem_clk", ebi1_msmbus_clk.c, "msm_bus"),
1642 CLK_LOOKUP("mem_a_clk", ebi1_a_clk.c, "msm_bus"),
1643
1644 CLK_LOOKUP("bus_clk", sfpb_clk.c, NULL),
1645 CLK_LOOKUP("bus_a_clk", sfpb_a_clk.c, NULL),
1646 CLK_LOOKUP("bus_clk", cfpb_clk.c, NULL),
1647 CLK_LOOKUP("bus_a_clk", cfpb_a_clk.c, NULL),
1648 CLK_LOOKUP("ebi1_clk", ebi1_clk.c, NULL),
Vikram Mulukutla73d42112011-09-19 16:32:54 -07001649 CLK_LOOKUP("dfab_clk", dfab_clk.c, NULL),
1650 CLK_LOOKUP("dfab_a_clk", dfab_a_clk.c, NULL),
Vikram Mulukutla489e39e2011-08-31 18:04:05 -07001651
Matt Wagantallc00f95d2012-01-05 14:22:45 -08001652 CLK_LOOKUP("core_clk", gp0_clk.c, ""),
1653 CLK_LOOKUP("core_clk", gp1_clk.c, ""),
1654 CLK_LOOKUP("core_clk", gp2_clk.c, ""),
Matt Wagantall7625a4c2011-11-01 16:17:53 -07001655
Matt Wagantallc00f95d2012-01-05 14:22:45 -08001656 CLK_LOOKUP("core_clk", gsbi3_uart_clk.c, ""),
Vikram Mulukutla489e39e2011-08-31 18:04:05 -07001657 CLK_LOOKUP("core_clk", gsbi4_uart_clk.c, "msm_serial_hsl.0"),
Matt Wagantallc00f95d2012-01-05 14:22:45 -08001658 CLK_LOOKUP("core_clk", gsbi5_uart_clk.c, ""),
Vikram Mulukutla489e39e2011-08-31 18:04:05 -07001659
Harini Jayaraman738c9312011-09-08 15:22:38 -06001660 CLK_LOOKUP("core_clk", gsbi3_qup_clk.c, "spi_qsd.0"),
Matt Wagantallc00f95d2012-01-05 14:22:45 -08001661 CLK_LOOKUP("core_clk", gsbi4_qup_clk.c, ""),
Harini Jayaramaneba52672011-09-08 15:13:00 -06001662 CLK_LOOKUP("core_clk", gsbi5_qup_clk.c, "qup_i2c.0"),
Vikram Mulukutla489e39e2011-08-31 18:04:05 -07001663
Matt Wagantallc00f95d2012-01-05 14:22:45 -08001664 CLK_LOOKUP("core_clk", pdm_clk.c, ""),
Vikram Mulukutladd0a2372011-09-19 15:58:21 -07001665 CLK_LOOKUP("mem_clk", pmem_clk.c, "msm_sps"),
Ramesh Masavarapu5ad37392011-10-10 10:44:10 -07001666 CLK_LOOKUP("core_clk", prng_clk.c, "msm_rng.0"),
Vikram Mulukutla489e39e2011-08-31 18:04:05 -07001667 CLK_LOOKUP("core_clk", sdc1_clk.c, "msm_sdcc.1"),
1668 CLK_LOOKUP("core_clk", sdc2_clk.c, "msm_sdcc.2"),
Matt Wagantallc00f95d2012-01-05 14:22:45 -08001669 CLK_LOOKUP("iface_clk", ce1_p_clk.c, ""),
1670 CLK_LOOKUP("core_clk", ce1_core_clk.c, ""),
Vikram Mulukutla489e39e2011-08-31 18:04:05 -07001671 CLK_LOOKUP("dma_bam_pclk", dma_bam_p_clk.c, NULL),
1672
Harini Jayaraman738c9312011-09-08 15:22:38 -06001673 CLK_LOOKUP("iface_clk", gsbi3_p_clk.c, "spi_qsd.0"),
Vikram Mulukutla489e39e2011-08-31 18:04:05 -07001674 CLK_LOOKUP("iface_clk", gsbi4_p_clk.c, "msm_serial_hsl.0"),
Harini Jayaramaneba52672011-09-08 15:13:00 -06001675 CLK_LOOKUP("iface_clk", gsbi5_p_clk.c, "qup_i2c.0"),
Vikram Mulukutla489e39e2011-08-31 18:04:05 -07001676
Manu Gautam5143b252012-01-05 19:25:23 -08001677 CLK_LOOKUP("iface_clk", usb_hs1_p_clk.c, "msm_otg"),
1678 CLK_LOOKUP("core_clk", usb_hs1_sys_clk.c, "msm_otg"),
1679 CLK_LOOKUP("alt_core_clk", usb_hs1_xcvr_clk.c, "msm_otg"),
1680 CLK_LOOKUP("alt_core_clk", usb_hsic_xcvr_clk.c, "msm_hsic_host"),
1681 CLK_LOOKUP("cal_clk", usb_hsic_hsio_cal_clk.c, "msm_hsic_host"),
1682 CLK_LOOKUP("core_clk", usb_hsic_sys_clk.c, "msm_hsic_host"),
1683 CLK_LOOKUP("iface_clk", usb_hsic_p_clk.c, "msm_hsic_host"),
1684 CLK_LOOKUP("phy_clk", usb_hsic_clk.c, "msm_hsic_host"),
Ofir Cohendf314b42012-01-15 11:59:34 +02001685 CLK_LOOKUP("alt_core_clk", usb_hsic_xcvr_clk.c, "msm_hsic_peripheral"),
1686 CLK_LOOKUP("cal_clk", usb_hsic_hsio_cal_clk.c, "msm_hsic_peripheral"),
1687 CLK_LOOKUP("core_clk", usb_hsic_sys_clk.c, "msm_hsic_peripheral"),
1688 CLK_LOOKUP("iface_clk", usb_hsic_p_clk.c, "msm_hsic_peripheral"),
1689 CLK_LOOKUP("phy_clk", usb_hsic_clk.c, "msm_hsic_peripheral"),
Vikram Mulukutla489e39e2011-08-31 18:04:05 -07001690
1691 CLK_LOOKUP("iface_clk", sdc1_p_clk.c, "msm_sdcc.1"),
1692 CLK_LOOKUP("iface_clk", sdc2_p_clk.c, "msm_sdcc.2"),
1693 CLK_LOOKUP("core_clk", adm0_clk.c, "msm_dmov"),
1694 CLK_LOOKUP("iface_clk", adm0_p_clk.c, "msm_dmov"),
Matt Wagantallc00f95d2012-01-05 14:22:45 -08001695 CLK_LOOKUP("iface_clk", pmic_arb0_p_clk.c, ""),
1696 CLK_LOOKUP("iface_clk", pmic_arb1_p_clk.c, ""),
1697 CLK_LOOKUP("core_clk", pmic_ssbi2_clk.c, ""),
1698 CLK_LOOKUP("mem_clk", rpm_msg_ram_p_clk.c, ""),
Kuirong Wanga9c3acc2012-02-09 17:00:45 -08001699 CLK_LOOKUP("bit_clk", mi2s_bit_clk.c, "msm-dai-q6.6"),
1700 CLK_LOOKUP("osr_clk", mi2s_osr_clk.c, "msm-dai-q6.6"),
Vikram Mulukutla489e39e2011-08-31 18:04:05 -07001701
Kuirong Wanga9c3acc2012-02-09 17:00:45 -08001702 CLK_LOOKUP("bit_clk", codec_i2s_mic_bit_clk.c,
1703 "msm-dai-q6.1"),
1704 CLK_LOOKUP("osr_clk", codec_i2s_mic_osr_clk.c,
1705 "msm-dai-q6.1"),
1706 CLK_LOOKUP("bit_clk", spare_i2s_mic_bit_clk.c,
1707 "msm-dai-q6.5"),
1708 CLK_LOOKUP("osr_clk", spare_i2s_mic_osr_clk.c,
1709 "msm-dai-q6.5"),
1710 CLK_LOOKUP("bit_clk", codec_i2s_spkr_bit_clk.c,
1711 "msm-dai-q6.16384"),
1712 CLK_LOOKUP("osr_clk", codec_i2s_spkr_osr_clk.c,
1713 "msm-dai-q6.16384"),
1714 CLK_LOOKUP("bit_clk", spare_i2s_spkr_bit_clk.c,
1715 "msm-dai-q6.4"),
1716 CLK_LOOKUP("osr_clk", spare_i2s_spkr_osr_clk.c,
1717 "msm-dai-q6.4"),
1718 CLK_LOOKUP("pcm_clk", pcm_clk.c, "msm-dai-q6.2"),
Vikram Mulukutla489e39e2011-08-31 18:04:05 -07001719
1720 CLK_LOOKUP("sps_slimbus_clk", sps_slimbus_clk.c, NULL),
Tianyi Gou44a81b02012-02-06 17:49:07 -08001721 CLK_LOOKUP("core_clk", audio_slimbus_clk.c, "msm_slim_ctrl.1"),
Manu Gautam5143b252012-01-05 19:25:23 -08001722 CLK_LOOKUP("core_clk", dfab_usb_hs_clk.c, "msm_otg"),
Vikram Mulukutla489e39e2011-08-31 18:04:05 -07001723 CLK_LOOKUP("bus_clk", dfab_sdc1_clk.c, "msm_sdcc.1"),
1724 CLK_LOOKUP("bus_clk", dfab_sdc2_clk.c, "msm_sdcc.2"),
1725 CLK_LOOKUP("dfab_clk", dfab_sps_clk.c, "msm_sps"),
Vikram Mulukutlacfd73ad2011-11-09 11:39:34 -08001726 CLK_LOOKUP("bus_clk", dfab_bam_dmux_clk.c, "BAM_RMNT"),
Vikram Mulukutla73d42112011-09-19 16:32:54 -07001727 CLK_LOOKUP("mem_clk", ebi1_adm_clk.c, "msm_dmov"),
Vikram Mulukutla489e39e2011-08-31 18:04:05 -07001728
Ramesh Masavarapufa679d92011-10-13 23:42:59 -07001729 CLK_LOOKUP("iface_clk", ce1_p_clk.c, "qce.0"),
1730 CLK_LOOKUP("iface_clk", ce1_p_clk.c, "qcrypto.0"),
1731 CLK_LOOKUP("core_clk", ce1_core_clk.c, "qce.0"),
1732 CLK_LOOKUP("core_clk", ce1_core_clk.c, "qcrypto.0"),
1733
Vikram Mulukutlaefd64f52012-01-09 17:41:09 -08001734 CLK_LOOKUP("q6sw_clk", q6sw_clk, NULL),
1735 CLK_LOOKUP("q6fw_clk", q6fw_clk, NULL),
1736 CLK_LOOKUP("q6_func_clk", q6_func_clk, NULL),
1737
Ramesh Masavarapufa679d92011-10-13 23:42:59 -07001738 /* TODO: Make this real when RPM's ready. */
1739 CLK_DUMMY("ebi1_msmbus_clk", ebi1_msmbus_clk.c, NULL, OFF),
1740 CLK_DUMMY("mem_clk", ebi1_adm_clk.c, "msm_dmov", OFF),
1741
Vikram Mulukutla489e39e2011-08-31 18:04:05 -07001742};
1743
1744static void set_fsm_mode(void __iomem *mode_reg)
1745{
1746 u32 regval = readl_relaxed(mode_reg);
1747
1748 /* De-assert reset to FSM */
1749 regval &= ~BIT(21);
1750 writel_relaxed(regval, mode_reg);
1751
1752 /* Program bias count */
1753 regval &= ~BM(19, 14);
Vikram Mulukutlad2314f32011-10-14 10:12:02 -07001754 regval |= BVAL(19, 14, 0x1);
Vikram Mulukutla489e39e2011-08-31 18:04:05 -07001755 writel_relaxed(regval, mode_reg);
1756
1757 /* Program lock count */
1758 regval &= ~BM(13, 8);
1759 regval |= BVAL(13, 8, 0x8);
1760 writel_relaxed(regval, mode_reg);
1761
1762 /* Enable PLL FSM voting */
1763 regval |= BIT(20);
1764 writel_relaxed(regval, mode_reg);
1765}
1766
1767/*
1768 * Miscellaneous clock register initializations
1769 */
1770static void __init reg_init(void)
1771{
Vikram Mulukutla01d06b82012-01-10 14:19:44 -08001772 u32 regval, is_pll_enabled, pll9_lval;
Vikram Mulukutla489e39e2011-08-31 18:04:05 -07001773
1774 /* Enable PDM CXO source. */
1775 regval = readl_relaxed(PDM_CLK_NS_REG);
1776 writel_relaxed(BIT(13) | regval, PDM_CLK_NS_REG);
1777
1778 /* Check if PLL0 is active */
1779 is_pll_enabled = readl_relaxed(BB_PLL0_STATUS_REG) & BIT(16);
1780
1781 if (!is_pll_enabled) {
1782 writel_relaxed(0xE, BB_PLL0_L_VAL_REG);
1783 writel_relaxed(0x3, BB_PLL0_M_VAL_REG);
1784 writel_relaxed(0x8, BB_PLL0_N_VAL_REG);
1785
1786 regval = readl_relaxed(BB_PLL0_CONFIG_REG);
1787
1788 /* Enable the main output and the MN accumulator */
1789 regval |= BIT(23) | BIT(22);
1790
1791 /* Set pre-divider and post-divider values to 1 and 1 */
1792 regval &= ~BIT(19);
1793 regval &= ~BM(21, 20);
1794
1795 /* Set VCO frequency */
1796 regval &= ~BM(17, 16);
1797
1798 writel_relaxed(regval, BB_PLL0_CONFIG_REG);
1799
1800 /* Enable AUX output */
1801 regval = readl_relaxed(BB_PLL0_TEST_CTL_REG);
1802 regval |= BIT(12);
1803 writel_relaxed(regval, BB_PLL0_TEST_CTL_REG);
1804
1805 set_fsm_mode(BB_PLL0_MODE_REG);
1806 }
1807
Vikram Mulukutla3349d932011-10-12 20:00:34 -07001808 /* Check if PLL14 is enabled in FSM mode */
1809 is_pll_enabled = readl_relaxed(BB_PLL14_STATUS_REG) & BIT(16);
1810
1811 if (!is_pll_enabled) {
1812 writel_relaxed(0x19, BB_PLL14_L_VAL_REG);
1813 writel_relaxed(0x0, BB_PLL14_M_VAL_REG);
1814 writel_relaxed(0x1, BB_PLL14_N_VAL_REG);
1815
1816 regval = readl_relaxed(BB_PLL14_CONFIG_REG);
1817
1818 /* Enable main output and the MN accumulator */
1819 regval |= BIT(23) | BIT(22);
1820
1821 /* Set pre-divider and post-divider values to 1 and 1 */
1822 regval &= ~BIT(19);
1823 regval &= ~BM(21, 20);
1824
1825 /* Set VCO frequency */
1826 regval &= ~BM(17, 16);
1827
1828 writel_relaxed(regval, BB_PLL14_CONFIG_REG);
1829
1830 set_fsm_mode(BB_PLL14_MODE_REG);
1831
1832 } else if (!(readl_relaxed(BB_PLL14_MODE_REG) & BIT(20)))
1833 WARN(1, "PLL14 enabled in non-FSM mode!\n");
1834
Vikram Mulukutla01d06b82012-01-10 14:19:44 -08001835 /* Detect PLL9 rate and fixup structure accordingly */
1836 pll9_lval = readl_relaxed(SC_PLL0_L_VAL_REG);
1837
1838 if (pll9_lval == 0x1C)
Tianyi Gou7949ecb2012-02-14 14:25:32 -08001839 pll9_acpu_clk.c.rate = 550000000;
Vikram Mulukutla01d06b82012-01-10 14:19:44 -08001840
Vikram Mulukutla489e39e2011-08-31 18:04:05 -07001841 /* Enable PLL4 source on the LPASS Primary PLL Mux */
1842 regval = readl_relaxed(LCC_PRI_PLL_CLK_CTL_REG);
1843 writel_relaxed(regval | BIT(0), LCC_PRI_PLL_CLK_CTL_REG);
Vikram Mulukutla0ee27882011-11-15 18:25:04 -08001844
Matt Wagantallbc8c9062012-02-07 12:33:06 -08001845 /*
1846 * Disable hardware clock gating for pmem_clk. Leaving it enabled
1847 * results in the clock staying on.
1848 */
1849 regval = readl_relaxed(PMEM_ACLK_CTL_REG);
Vikram Mulukutla0ee27882011-11-15 18:25:04 -08001850 regval &= ~BIT(6);
Matt Wagantallbc8c9062012-02-07 12:33:06 -08001851 writel_relaxed(regval, PMEM_ACLK_CTL_REG);
Matt Wagantallebbb29f2012-02-13 14:45:46 -08001852
1853 /*
1854 * Disable hardware clock gating for dma_bam_p_clk, which does
1855 * not have working support for the feature.
1856 */
1857 regval = readl_relaxed(DMA_BAM_HCLK_CTL);
1858 regval &= ~BIT(6);
1859 writel_relaxed(regval, DMA_BAM_HCLK_CTL);
Vikram Mulukutla489e39e2011-08-31 18:04:05 -07001860}
1861
1862/* Local clock driver initialization. */
1863static void __init msm9615_clock_init(void)
1864{
Matt Wagantalled90b002011-12-12 21:22:43 -08001865 xo_cxo = msm_xo_get(MSM_XO_CXO, "clock-9615");
Vikram Mulukutla489e39e2011-08-31 18:04:05 -07001866 if (IS_ERR(xo_cxo)) {
1867 pr_err("%s: msm_xo_get(CXO) failed.\n", __func__);
1868 BUG();
1869 }
1870
Matt Wagantalle18bbc82011-10-06 10:07:28 -07001871 vote_vdd_level(&vdd_dig, VDD_DIG_HIGH);
Vikram Mulukutla489e39e2011-08-31 18:04:05 -07001872
1873 clk_ops_pll.enable = sr_pll_clk_enable;
1874
1875 /* Initialize clock registers. */
1876 reg_init();
1877
1878 /* Initialize rates for clocks that only support one. */
1879 clk_set_rate(&pdm_clk.c, 19200000);
1880 clk_set_rate(&prng_clk.c, 32000000);
1881 clk_set_rate(&usb_hs1_xcvr_clk.c, 60000000);
1882 clk_set_rate(&usb_hs1_sys_clk.c, 60000000);
1883 clk_set_rate(&usb_hsic_xcvr_clk.c, 60000000);
Vikram Mulukutla6c9158f2011-12-08 12:41:20 -08001884 clk_set_rate(&usb_hsic_sys_clk.c, 64000000);
1885 clk_set_rate(&usb_hsic_clk.c, 480000000);
Vikram Mulukutla489e39e2011-08-31 18:04:05 -07001886
1887 /*
1888 * The halt status bits for PDM may be incorrect at boot.
1889 * Toggle these clocks on and off to refresh them.
1890 */
1891 rcg_clk_enable(&pdm_clk.c);
1892 rcg_clk_disable(&pdm_clk.c);
1893}
1894
1895static int __init msm9615_clock_late_init(void)
1896{
Matt Wagantalle18bbc82011-10-06 10:07:28 -07001897 return unvote_vdd_level(&vdd_dig, VDD_DIG_HIGH);
Vikram Mulukutla489e39e2011-08-31 18:04:05 -07001898}
1899
1900struct clock_init_data msm9615_clock_init_data __initdata = {
1901 .table = msm_clocks_9615,
1902 .size = ARRAY_SIZE(msm_clocks_9615),
1903 .init = msm9615_clock_init,
1904 .late_init = msm9615_clock_late_init,
1905};