blob: 72a9eabf588be57429d564ea57a27b64a9e5be5a [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>
Vikram Mulukutla73d42112011-09-19 16:32:54 -070028#include <mach/rpm-9615.h>
Vikram Mulukutlab5e1cda2011-10-04 16:17:22 -070029#include <mach/rpm-regulator.h>
Vikram Mulukutla489e39e2011-08-31 18:04:05 -070030
31#include "clock-local.h"
32#include "clock-voter.h"
Vikram Mulukutla73d42112011-09-19 16:32:54 -070033#include "clock-rpm.h"
Vikram Mulukutla489e39e2011-08-31 18:04:05 -070034#include "devices.h"
35
36#define REG(off) (MSM_CLK_CTL_BASE + (off))
37#define REG_LPA(off) (MSM_LPASS_CLK_CTL_BASE + (off))
38#define REG_GCC(off) (MSM_APCS_GCC_BASE + (off))
39
40/* Peripheral clock registers. */
41#define CE1_HCLK_CTL_REG REG(0x2720)
42#define CE1_CORE_CLK_CTL_REG REG(0x2724)
43#define DMA_BAM_HCLK_CTL REG(0x25C0)
44#define CLK_HALT_CFPB_STATEA_REG REG(0x2FCC)
45#define CLK_HALT_CFPB_STATEB_REG REG(0x2FD0)
46#define CLK_HALT_CFPB_STATEC_REG REG(0x2FD4)
47#define CLK_HALT_DFAB_STATE_REG REG(0x2FC8)
48
49#define CLK_HALT_MSS_KPSS_MISC_STATE_REG REG(0x2FDC)
50#define CLK_HALT_SFPB_MISC_STATE_REG REG(0x2FD8)
51#define CLK_TEST_REG REG(0x2FA0)
Matt Wagantall7625a4c2011-11-01 16:17:53 -070052#define GPn_MD_REG(n) REG(0x2D00+(0x20*(n)))
53#define GPn_NS_REG(n) REG(0x2D24+(0x20*(n)))
Vikram Mulukutla489e39e2011-08-31 18:04:05 -070054#define GSBIn_HCLK_CTL_REG(n) REG(0x29C0+(0x20*((n)-1)))
55#define GSBIn_QUP_APPS_MD_REG(n) REG(0x29C8+(0x20*((n)-1)))
56#define GSBIn_QUP_APPS_NS_REG(n) REG(0x29CC+(0x20*((n)-1)))
57#define GSBIn_RESET_REG(n) REG(0x29DC+(0x20*((n)-1)))
58#define GSBIn_UART_APPS_MD_REG(n) REG(0x29D0+(0x20*((n)-1)))
59#define GSBIn_UART_APPS_NS_REG(n) REG(0x29D4+(0x20*((n)-1)))
60#define PDM_CLK_NS_REG REG(0x2CC0)
61#define BB_PLL_ENA_SC0_REG REG(0x34C0)
62
63#define BB_PLL0_L_VAL_REG REG(0x30C4)
64#define BB_PLL0_M_VAL_REG REG(0x30C8)
65#define BB_PLL0_MODE_REG REG(0x30C0)
66#define BB_PLL0_N_VAL_REG REG(0x30CC)
67#define BB_PLL0_STATUS_REG REG(0x30D8)
68#define BB_PLL0_CONFIG_REG REG(0x30D4)
69#define BB_PLL0_TEST_CTL_REG REG(0x30D0)
70
71#define BB_PLL8_L_VAL_REG REG(0x3144)
72#define BB_PLL8_M_VAL_REG REG(0x3148)
73#define BB_PLL8_MODE_REG REG(0x3140)
74#define BB_PLL8_N_VAL_REG REG(0x314C)
75#define BB_PLL8_STATUS_REG REG(0x3158)
76#define BB_PLL8_CONFIG_REG REG(0x3154)
77#define BB_PLL8_TEST_CTL_REG REG(0x3150)
78
79#define BB_PLL14_L_VAL_REG REG(0x31C4)
80#define BB_PLL14_M_VAL_REG REG(0x31C8)
81#define BB_PLL14_MODE_REG REG(0x31C0)
82#define BB_PLL14_N_VAL_REG REG(0x31CC)
83#define BB_PLL14_STATUS_REG REG(0x31D8)
84#define BB_PLL14_CONFIG_REG REG(0x31D4)
85#define BB_PLL14_TEST_CTL_REG REG(0x31D0)
86
87#define SC_PLL0_L_VAL_REG REG(0x3208)
88#define SC_PLL0_M_VAL_REG REG(0x320C)
89#define SC_PLL0_MODE_REG REG(0x3200)
90#define SC_PLL0_N_VAL_REG REG(0x3210)
91#define SC_PLL0_STATUS_REG REG(0x321C)
92#define SC_PLL0_CONFIG_REG REG(0x3204)
93#define SC_PLL0_TEST_CTL_REG REG(0x3218)
94
95#define PLLTEST_PAD_CFG_REG REG(0x2FA4)
96#define PMEM_ACLK_CTL_REG REG(0x25A0)
97#define RINGOSC_NS_REG REG(0x2DC0)
98#define RINGOSC_STATUS_REG REG(0x2DCC)
99#define RINGOSC_TCXO_CTL_REG REG(0x2DC4)
100#define SC0_U_CLK_BRANCH_ENA_VOTE_REG REG(0x3080)
101#define SDCn_APPS_CLK_MD_REG(n) REG(0x2828+(0x20*((n)-1)))
102#define SDCn_APPS_CLK_NS_REG(n) REG(0x282C+(0x20*((n)-1)))
103#define SDCn_HCLK_CTL_REG(n) REG(0x2820+(0x20*((n)-1)))
104#define SDCn_RESET_REG(n) REG(0x2830+(0x20*((n)-1)))
105#define USB_HS1_HCLK_CTL_REG REG(0x2900)
106#define USB_HS1_RESET_REG REG(0x2910)
107#define USB_HS1_XCVR_FS_CLK_MD_REG REG(0x2908)
108#define USB_HS1_XCVR_FS_CLK_NS_REG REG(0x290C)
109#define USB_HS1_SYS_CLK_MD_REG REG(0x36A0)
110#define USB_HS1_SYS_CLK_NS_REG REG(0x36A4)
111#define USB_HSIC_HCLK_CTL_REG REG(0x2920)
112#define USB_HSIC_XCVR_FS_CLK_MD_REG REG(0x2924)
113#define USB_HSIC_XCVR_FS_CLK_NS_REG REG(0x2928)
114#define USB_HSIC_RESET_REG REG(0x2934)
115#define USB_HSIC_HSIO_CAL_CLK_CTL_REG REG(0x2B48)
116#define USB_HSIC_CLK_MD_REG REG(0x2B4C)
117#define USB_HSIC_CLK_NS_REG REG(0x2B50)
118#define USB_HSIC_SYSTEM_CLK_MD_REG REG(0x2B54)
119#define USB_HSIC_SYSTEM_CLK_NS_REG REG(0x2B58)
120#define SLIMBUS_XO_SRC_CLK_CTL_REG REG(0x2628)
121
122/* Low-power Audio clock registers. */
Vikram Mulukutlaefd64f52012-01-09 17:41:09 -0800123#define LCC_CLK_HS_DEBUG_CFG_REG REG_LPA(0x00A4)
Vikram Mulukutla489e39e2011-08-31 18:04:05 -0700124#define LCC_CLK_LS_DEBUG_CFG_REG REG_LPA(0x00A8)
125#define LCC_CODEC_I2S_MIC_MD_REG REG_LPA(0x0064)
126#define LCC_CODEC_I2S_MIC_NS_REG REG_LPA(0x0060)
127#define LCC_CODEC_I2S_MIC_STATUS_REG REG_LPA(0x0068)
128#define LCC_CODEC_I2S_SPKR_MD_REG REG_LPA(0x0070)
129#define LCC_CODEC_I2S_SPKR_NS_REG REG_LPA(0x006C)
130#define LCC_CODEC_I2S_SPKR_STATUS_REG REG_LPA(0x0074)
131#define LCC_MI2S_MD_REG REG_LPA(0x004C)
132#define LCC_MI2S_NS_REG REG_LPA(0x0048)
133#define LCC_MI2S_STATUS_REG REG_LPA(0x0050)
134#define LCC_PCM_MD_REG REG_LPA(0x0058)
135#define LCC_PCM_NS_REG REG_LPA(0x0054)
136#define LCC_PCM_STATUS_REG REG_LPA(0x005C)
137#define LCC_PLL0_STATUS_REG REG_LPA(0x0018)
138#define LCC_SPARE_I2S_MIC_MD_REG REG_LPA(0x007C)
139#define LCC_SPARE_I2S_MIC_NS_REG REG_LPA(0x0078)
140#define LCC_SPARE_I2S_MIC_STATUS_REG REG_LPA(0x0080)
141#define LCC_SPARE_I2S_SPKR_MD_REG REG_LPA(0x0088)
142#define LCC_SPARE_I2S_SPKR_NS_REG REG_LPA(0x0084)
143#define LCC_SPARE_I2S_SPKR_STATUS_REG REG_LPA(0x008C)
144#define LCC_SLIMBUS_NS_REG REG_LPA(0x00CC)
145#define LCC_SLIMBUS_MD_REG REG_LPA(0x00D0)
146#define LCC_SLIMBUS_STATUS_REG REG_LPA(0x00D4)
147#define LCC_AHBEX_BRANCH_CTL_REG REG_LPA(0x00E4)
148#define LCC_PRI_PLL_CLK_CTL_REG REG_LPA(0x00C4)
149
150#define GCC_APCS_CLK_DIAG REG_GCC(0x001C)
151
152/* MUX source input identifiers. */
153#define cxo_to_bb_mux 0
154#define pll8_to_bb_mux 3
155#define pll14_to_bb_mux 4
156#define gnd_to_bb_mux 6
157#define cxo_to_xo_mux 0
158#define gnd_to_xo_mux 3
159#define cxo_to_lpa_mux 1
160#define pll4_to_lpa_mux 2
161#define gnd_to_lpa_mux 6
162
163/* Test Vector Macros */
164#define TEST_TYPE_PER_LS 1
165#define TEST_TYPE_PER_HS 2
166#define TEST_TYPE_LPA 5
Vikram Mulukutlaefd64f52012-01-09 17:41:09 -0800167#define TEST_TYPE_LPA_HS 6
Vikram Mulukutla489e39e2011-08-31 18:04:05 -0700168#define TEST_TYPE_SHIFT 24
169#define TEST_CLK_SEL_MASK BM(23, 0)
170#define TEST_VECTOR(s, t) (((t) << TEST_TYPE_SHIFT) | BVAL(23, 0, (s)))
171#define TEST_PER_LS(s) TEST_VECTOR((s), TEST_TYPE_PER_LS)
172#define TEST_PER_HS(s) TEST_VECTOR((s), TEST_TYPE_PER_HS)
173#define TEST_LPA(s) TEST_VECTOR((s), TEST_TYPE_LPA)
Vikram Mulukutlaefd64f52012-01-09 17:41:09 -0800174#define TEST_LPA_HS(s) TEST_VECTOR((s), TEST_TYPE_LPA_HS)
Vikram Mulukutla489e39e2011-08-31 18:04:05 -0700175
Matt Wagantalle18bbc82011-10-06 10:07:28 -0700176enum vdd_dig_levels {
177 VDD_DIG_NONE,
178 VDD_DIG_LOW,
179 VDD_DIG_NOMINAL,
180 VDD_DIG_HIGH
181};
182
183static int set_vdd_dig(struct clk_vdd_class *vdd_class, int level)
184{
Matt Wagantalle18bbc82011-10-06 10:07:28 -0700185 static const int vdd_uv[] = {
Vikram Mulukutla5e6ab912011-11-04 15:20:19 -0700186 [VDD_DIG_NONE] = 0,
187 [VDD_DIG_LOW] = 945000,
188 [VDD_DIG_NOMINAL] = 1050000,
Matt Wagantalle18bbc82011-10-06 10:07:28 -0700189 [VDD_DIG_HIGH] = 1150000
190 };
191
192 return rpm_vreg_set_voltage(RPM_VREG_ID_PM8018_S1, RPM_VREG_VOTER3,
193 vdd_uv[level], vdd_uv[VDD_DIG_HIGH], 1);
194}
195
196static DEFINE_VDD_CLASS(vdd_dig, set_vdd_dig);
197
198#define VDD_DIG_FMAX_MAP1(l1, f1) \
199 .vdd_class = &vdd_dig, \
200 .fmax[VDD_DIG_##l1] = (f1)
201#define VDD_DIG_FMAX_MAP2(l1, f1, l2, f2) \
202 .vdd_class = &vdd_dig, \
203 .fmax[VDD_DIG_##l1] = (f1), \
204 .fmax[VDD_DIG_##l2] = (f2)
Vikram Mulukutla489e39e2011-08-31 18:04:05 -0700205
206/*
207 * Clock Descriptions
208 */
209
Stephen Boyd72a80352012-01-26 15:57:38 -0800210DEFINE_CLK_RPM_BRANCH(cxo_clk, cxo_a_clk, CXO, 19200000);
Vikram Mulukutla489e39e2011-08-31 18:04:05 -0700211
Vikram Mulukutla31680ae2011-11-04 14:23:55 -0700212static DEFINE_SPINLOCK(soft_vote_lock);
213
214static int pll_acpu_vote_clk_enable(struct clk *clk)
215{
216 int ret = 0;
217 unsigned long flags;
218 struct pll_vote_clk *pll = to_pll_vote_clk(clk);
219
220 spin_lock_irqsave(&soft_vote_lock, flags);
221
222 if (!*pll->soft_vote)
223 ret = pll_vote_clk_enable(clk);
224 if (ret == 0)
225 *pll->soft_vote |= (pll->soft_vote_mask);
226
227 spin_unlock_irqrestore(&soft_vote_lock, flags);
228 return ret;
229}
230
231static void pll_acpu_vote_clk_disable(struct clk *clk)
232{
233 unsigned long flags;
234 struct pll_vote_clk *pll = to_pll_vote_clk(clk);
235
236 spin_lock_irqsave(&soft_vote_lock, flags);
237
238 *pll->soft_vote &= ~(pll->soft_vote_mask);
239 if (!*pll->soft_vote)
240 pll_vote_clk_disable(clk);
241
242 spin_unlock_irqrestore(&soft_vote_lock, flags);
243}
244
245static struct clk_ops clk_ops_pll_acpu_vote = {
246 .enable = pll_acpu_vote_clk_enable,
247 .disable = pll_acpu_vote_clk_disable,
248 .auto_off = pll_acpu_vote_clk_disable,
249 .is_enabled = pll_vote_clk_is_enabled,
Vikram Mulukutla31680ae2011-11-04 14:23:55 -0700250 .get_parent = pll_vote_clk_get_parent,
251 .is_local = local_clk_is_local,
252};
253
254#define PLL_SOFT_VOTE_PRIMARY BIT(0)
255#define PLL_SOFT_VOTE_ACPU BIT(1)
256
257static unsigned int soft_vote_pll0;
258
Vikram Mulukutla489e39e2011-08-31 18:04:05 -0700259static struct pll_vote_clk pll0_clk = {
Vikram Mulukutla489e39e2011-08-31 18:04:05 -0700260 .en_reg = BB_PLL_ENA_SC0_REG,
261 .en_mask = BIT(0),
262 .status_reg = BB_PLL0_STATUS_REG,
263 .parent = &cxo_clk.c,
Vikram Mulukutla31680ae2011-11-04 14:23:55 -0700264 .soft_vote = &soft_vote_pll0,
265 .soft_vote_mask = PLL_SOFT_VOTE_PRIMARY,
Vikram Mulukutla489e39e2011-08-31 18:04:05 -0700266 .c = {
267 .dbg_name = "pll0_clk",
Tianyi Gou7949ecb2012-02-14 14:25:32 -0800268 .rate = 276000000,
Vikram Mulukutla31680ae2011-11-04 14:23:55 -0700269 .ops = &clk_ops_pll_acpu_vote,
Vikram Mulukutla489e39e2011-08-31 18:04:05 -0700270 CLK_INIT(pll0_clk.c),
Stephen Boyd3bbf3462012-01-12 00:19:23 -0800271 .warned = true,
Vikram Mulukutla489e39e2011-08-31 18:04:05 -0700272 },
273};
274
Vikram Mulukutla31680ae2011-11-04 14:23:55 -0700275static struct pll_vote_clk pll0_acpu_clk = {
Vikram Mulukutla31680ae2011-11-04 14:23:55 -0700276 .en_reg = BB_PLL_ENA_SC0_REG,
277 .en_mask = BIT(0),
278 .status_reg = BB_PLL0_STATUS_REG,
279 .soft_vote = &soft_vote_pll0,
280 .soft_vote_mask = PLL_SOFT_VOTE_ACPU,
281 .c = {
282 .dbg_name = "pll0_acpu_clk",
Tianyi Gou7949ecb2012-02-14 14:25:32 -0800283 .rate = 276000000,
Vikram Mulukutla31680ae2011-11-04 14:23:55 -0700284 .ops = &clk_ops_pll_acpu_vote,
285 CLK_INIT(pll0_acpu_clk.c),
Stephen Boyd3bbf3462012-01-12 00:19:23 -0800286 .warned = true,
Vikram Mulukutla31680ae2011-11-04 14:23:55 -0700287 },
288};
289
Vikram Mulukutla489e39e2011-08-31 18:04:05 -0700290static struct pll_vote_clk pll4_clk = {
Vikram Mulukutla489e39e2011-08-31 18:04:05 -0700291 .en_reg = BB_PLL_ENA_SC0_REG,
292 .en_mask = BIT(4),
293 .status_reg = LCC_PLL0_STATUS_REG,
294 .parent = &cxo_clk.c,
295 .c = {
296 .dbg_name = "pll4_clk",
Tianyi Gou7949ecb2012-02-14 14:25:32 -0800297 .rate = 393216000,
Vikram Mulukutla489e39e2011-08-31 18:04:05 -0700298 .ops = &clk_ops_pll_vote,
299 CLK_INIT(pll4_clk.c),
Stephen Boyd3bbf3462012-01-12 00:19:23 -0800300 .warned = true,
Vikram Mulukutla489e39e2011-08-31 18:04:05 -0700301 },
302};
303
Vikram Mulukutla31680ae2011-11-04 14:23:55 -0700304static unsigned int soft_vote_pll8;
305
Vikram Mulukutla489e39e2011-08-31 18:04:05 -0700306static struct pll_vote_clk pll8_clk = {
Vikram Mulukutla489e39e2011-08-31 18:04:05 -0700307 .en_reg = BB_PLL_ENA_SC0_REG,
308 .en_mask = BIT(8),
309 .status_reg = BB_PLL8_STATUS_REG,
310 .parent = &cxo_clk.c,
Vikram Mulukutla31680ae2011-11-04 14:23:55 -0700311 .soft_vote = &soft_vote_pll8,
312 .soft_vote_mask = PLL_SOFT_VOTE_PRIMARY,
Vikram Mulukutla489e39e2011-08-31 18:04:05 -0700313 .c = {
314 .dbg_name = "pll8_clk",
Tianyi Gou7949ecb2012-02-14 14:25:32 -0800315 .rate = 384000000,
Vikram Mulukutla31680ae2011-11-04 14:23:55 -0700316 .ops = &clk_ops_pll_acpu_vote,
Vikram Mulukutla489e39e2011-08-31 18:04:05 -0700317 CLK_INIT(pll8_clk.c),
Stephen Boyd3bbf3462012-01-12 00:19:23 -0800318 .warned = true,
Vikram Mulukutla489e39e2011-08-31 18:04:05 -0700319 },
320};
321
Vikram Mulukutla31680ae2011-11-04 14:23:55 -0700322static struct pll_vote_clk pll8_acpu_clk = {
Vikram Mulukutla31680ae2011-11-04 14:23:55 -0700323 .en_reg = BB_PLL_ENA_SC0_REG,
324 .en_mask = BIT(8),
325 .status_reg = BB_PLL8_STATUS_REG,
326 .soft_vote = &soft_vote_pll8,
327 .soft_vote_mask = PLL_SOFT_VOTE_ACPU,
328 .c = {
329 .dbg_name = "pll8_acpu_clk",
Tianyi Gou7949ecb2012-02-14 14:25:32 -0800330 .rate = 384000000,
Vikram Mulukutla31680ae2011-11-04 14:23:55 -0700331 .ops = &clk_ops_pll_acpu_vote,
332 CLK_INIT(pll8_acpu_clk.c),
Stephen Boyd3bbf3462012-01-12 00:19:23 -0800333 .warned = true,
Vikram Mulukutla31680ae2011-11-04 14:23:55 -0700334 },
335};
336
Vikram Mulukutla266551f2012-01-11 12:32:58 -0800337static struct pll_clk pll9_acpu_clk = {
Vikram Mulukutla266551f2012-01-11 12:32:58 -0800338 .mode_reg = SC_PLL0_MODE_REG,
Vikram Mulukutla31680ae2011-11-04 14:23:55 -0700339 .c = {
340 .dbg_name = "pll9_acpu_clk",
Tianyi Gou7949ecb2012-02-14 14:25:32 -0800341 .rate = 440000000,
Vikram Mulukutla266551f2012-01-11 12:32:58 -0800342 .ops = &clk_ops_pll,
Vikram Mulukutla31680ae2011-11-04 14:23:55 -0700343 CLK_INIT(pll9_acpu_clk.c),
Stephen Boyd3bbf3462012-01-12 00:19:23 -0800344 .warned = true,
Vikram Mulukutla31680ae2011-11-04 14:23:55 -0700345 },
346};
347
Vikram Mulukutla489e39e2011-08-31 18:04:05 -0700348static struct pll_vote_clk pll14_clk = {
Vikram Mulukutla489e39e2011-08-31 18:04:05 -0700349 .en_reg = BB_PLL_ENA_SC0_REG,
350 .en_mask = BIT(11),
351 .status_reg = BB_PLL14_STATUS_REG,
352 .parent = &cxo_clk.c,
353 .c = {
354 .dbg_name = "pll14_clk",
Tianyi Gou7949ecb2012-02-14 14:25:32 -0800355 .rate = 480000000,
Vikram Mulukutla489e39e2011-08-31 18:04:05 -0700356 .ops = &clk_ops_pll_vote,
357 CLK_INIT(pll14_clk.c),
Stephen Boyd3bbf3462012-01-12 00:19:23 -0800358 .warned = true,
Vikram Mulukutla489e39e2011-08-31 18:04:05 -0700359 },
360};
361
Vikram Mulukutla489e39e2011-08-31 18:04:05 -0700362static struct clk_ops clk_ops_rcg_9615 = {
363 .enable = rcg_clk_enable,
364 .disable = rcg_clk_disable,
Matt Wagantall41af0772011-09-17 12:21:39 -0700365 .auto_off = rcg_clk_disable,
Matt Wagantallbc8c9062012-02-07 12:33:06 -0800366 .enable_hwcg = rcg_clk_enable_hwcg,
367 .disable_hwcg = rcg_clk_disable_hwcg,
368 .in_hwcg_mode = rcg_clk_in_hwcg_mode,
369 .handoff = rcg_clk_handoff,
Vikram Mulukutla489e39e2011-08-31 18:04:05 -0700370 .set_rate = rcg_clk_set_rate,
Vikram Mulukutla489e39e2011-08-31 18:04:05 -0700371 .list_rate = rcg_clk_list_rate,
372 .is_enabled = rcg_clk_is_enabled,
373 .round_rate = rcg_clk_round_rate,
Stephen Boyd7bf28142011-12-07 00:30:52 -0800374 .reset = rcg_clk_reset,
Vikram Mulukutla489e39e2011-08-31 18:04:05 -0700375 .is_local = local_clk_is_local,
376 .get_parent = rcg_clk_get_parent,
377};
378
379static struct clk_ops clk_ops_branch = {
380 .enable = branch_clk_enable,
381 .disable = branch_clk_disable,
Matt Wagantall41af0772011-09-17 12:21:39 -0700382 .auto_off = branch_clk_disable,
Matt Wagantallbc8c9062012-02-07 12:33:06 -0800383 .enable_hwcg = branch_clk_enable_hwcg,
384 .disable_hwcg = branch_clk_disable_hwcg,
385 .in_hwcg_mode = branch_clk_in_hwcg_mode,
386 .handoff = branch_clk_handoff,
Vikram Mulukutla489e39e2011-08-31 18:04:05 -0700387 .is_enabled = branch_clk_is_enabled,
388 .reset = branch_clk_reset,
389 .is_local = local_clk_is_local,
390 .get_parent = branch_clk_get_parent,
391 .set_parent = branch_clk_set_parent,
392};
393
394/*
395 * Peripheral Clocks
396 */
Matt Wagantall7625a4c2011-11-01 16:17:53 -0700397#define CLK_GP(i, n, h_r, h_b) \
398 struct rcg_clk i##_clk = { \
399 .b = { \
400 .ctl_reg = GPn_NS_REG(n), \
401 .en_mask = BIT(9), \
402 .halt_reg = h_r, \
403 .halt_bit = h_b, \
404 }, \
405 .ns_reg = GPn_NS_REG(n), \
406 .md_reg = GPn_MD_REG(n), \
407 .root_en_mask = BIT(11), \
408 .ns_mask = (BM(23, 16) | BM(6, 0)), \
Matt Wagantall07c45472012-02-10 23:27:24 -0800409 .mnd_en_mask = BIT(8), \
Matt Wagantall7625a4c2011-11-01 16:17:53 -0700410 .set_rate = set_rate_mnd, \
411 .freq_tbl = clk_tbl_gp, \
412 .current_freq = &rcg_dummy_freq, \
413 .c = { \
414 .dbg_name = #i "_clk", \
415 .ops = &clk_ops_rcg_9615, \
416 VDD_DIG_FMAX_MAP1(LOW, 27000000), \
417 CLK_INIT(i##_clk.c), \
418 }, \
419 }
420#define F_GP(f, s, d, m, n) \
421 { \
422 .freq_hz = f, \
423 .src_clk = &s##_clk.c, \
424 .md_val = MD8(16, m, 0, n), \
425 .ns_val = NS(23, 16, n, m, 5, 4, 3, d, 2, 0, s##_to_bb_mux), \
Matt Wagantall7625a4c2011-11-01 16:17:53 -0700426 }
427static struct clk_freq_tbl clk_tbl_gp[] = {
428 F_GP( 0, gnd, 1, 0, 0),
429 F_GP( 9600000, cxo, 2, 0, 0),
430 F_GP( 19200000, cxo, 1, 0, 0),
431 F_END
432};
433
434static CLK_GP(gp0, 0, CLK_HALT_SFPB_MISC_STATE_REG, 7);
435static CLK_GP(gp1, 1, CLK_HALT_SFPB_MISC_STATE_REG, 6);
436static CLK_GP(gp2, 2, CLK_HALT_SFPB_MISC_STATE_REG, 5);
437
Vikram Mulukutla489e39e2011-08-31 18:04:05 -0700438#define CLK_GSBI_UART(i, n, h_r, h_b) \
439 struct rcg_clk i##_clk = { \
440 .b = { \
441 .ctl_reg = GSBIn_UART_APPS_NS_REG(n), \
442 .en_mask = BIT(9), \
443 .reset_reg = GSBIn_RESET_REG(n), \
444 .reset_mask = BIT(0), \
445 .halt_reg = h_r, \
446 .halt_bit = h_b, \
447 }, \
448 .ns_reg = GSBIn_UART_APPS_NS_REG(n), \
449 .md_reg = GSBIn_UART_APPS_MD_REG(n), \
450 .root_en_mask = BIT(11), \
451 .ns_mask = (BM(31, 16) | BM(6, 0)), \
Matt Wagantall07c45472012-02-10 23:27:24 -0800452 .mnd_en_mask = BIT(8), \
Vikram Mulukutla489e39e2011-08-31 18:04:05 -0700453 .set_rate = set_rate_mnd, \
454 .freq_tbl = clk_tbl_gsbi_uart, \
455 .current_freq = &rcg_dummy_freq, \
456 .c = { \
457 .dbg_name = #i "_clk", \
458 .ops = &clk_ops_rcg_9615, \
Matt Wagantalle18bbc82011-10-06 10:07:28 -0700459 VDD_DIG_FMAX_MAP2(LOW, 32000000, NOMINAL, 64000000), \
Vikram Mulukutla489e39e2011-08-31 18:04:05 -0700460 CLK_INIT(i##_clk.c), \
461 }, \
462 }
Matt Wagantalle18bbc82011-10-06 10:07:28 -0700463#define F_GSBI_UART(f, s, d, m, n) \
Vikram Mulukutla489e39e2011-08-31 18:04:05 -0700464 { \
465 .freq_hz = f, \
466 .src_clk = &s##_clk.c, \
467 .md_val = MD16(m, n), \
468 .ns_val = NS(31, 16, n, m, 5, 4, 3, d, 2, 0, s##_to_bb_mux), \
Vikram Mulukutla489e39e2011-08-31 18:04:05 -0700469 }
470static struct clk_freq_tbl clk_tbl_gsbi_uart[] = {
Matt Wagantalle18bbc82011-10-06 10:07:28 -0700471 F_GSBI_UART( 0, gnd, 1, 0, 0),
Matt Wagantall9a561f72012-01-19 16:13:12 -0800472 F_GSBI_UART( 3686400, pll8, 2, 12, 625),
473 F_GSBI_UART( 7372800, pll8, 2, 24, 625),
474 F_GSBI_UART(14745600, pll8, 2, 48, 625),
Matt Wagantalle18bbc82011-10-06 10:07:28 -0700475 F_GSBI_UART(16000000, pll8, 4, 1, 6),
476 F_GSBI_UART(24000000, pll8, 4, 1, 4),
477 F_GSBI_UART(32000000, pll8, 4, 1, 3),
478 F_GSBI_UART(40000000, pll8, 1, 5, 48),
479 F_GSBI_UART(46400000, pll8, 1, 29, 240),
480 F_GSBI_UART(48000000, pll8, 4, 1, 2),
481 F_GSBI_UART(51200000, pll8, 1, 2, 15),
482 F_GSBI_UART(56000000, pll8, 1, 7, 48),
483 F_GSBI_UART(58982400, pll8, 1, 96, 625),
484 F_GSBI_UART(64000000, pll8, 2, 1, 3),
Vikram Mulukutla489e39e2011-08-31 18:04:05 -0700485 F_END
486};
487
488static CLK_GSBI_UART(gsbi1_uart, 1, CLK_HALT_CFPB_STATEA_REG, 10);
489static CLK_GSBI_UART(gsbi2_uart, 2, CLK_HALT_CFPB_STATEA_REG, 6);
490static CLK_GSBI_UART(gsbi3_uart, 3, CLK_HALT_CFPB_STATEA_REG, 2);
491static CLK_GSBI_UART(gsbi4_uart, 4, CLK_HALT_CFPB_STATEB_REG, 26);
492static CLK_GSBI_UART(gsbi5_uart, 5, CLK_HALT_CFPB_STATEB_REG, 22);
493
494#define CLK_GSBI_QUP(i, n, h_r, h_b) \
495 struct rcg_clk i##_clk = { \
496 .b = { \
497 .ctl_reg = GSBIn_QUP_APPS_NS_REG(n), \
498 .en_mask = BIT(9), \
499 .reset_reg = GSBIn_RESET_REG(n), \
500 .reset_mask = BIT(0), \
501 .halt_reg = h_r, \
502 .halt_bit = h_b, \
503 }, \
504 .ns_reg = GSBIn_QUP_APPS_NS_REG(n), \
505 .md_reg = GSBIn_QUP_APPS_MD_REG(n), \
506 .root_en_mask = BIT(11), \
507 .ns_mask = (BM(23, 16) | BM(6, 0)), \
Matt Wagantall07c45472012-02-10 23:27:24 -0800508 .mnd_en_mask = BIT(8), \
Vikram Mulukutla489e39e2011-08-31 18:04:05 -0700509 .set_rate = set_rate_mnd, \
510 .freq_tbl = clk_tbl_gsbi_qup, \
511 .current_freq = &rcg_dummy_freq, \
512 .c = { \
513 .dbg_name = #i "_clk", \
514 .ops = &clk_ops_rcg_9615, \
Matt Wagantalle18bbc82011-10-06 10:07:28 -0700515 VDD_DIG_FMAX_MAP2(LOW, 24000000, NOMINAL, 52000000), \
Vikram Mulukutla489e39e2011-08-31 18:04:05 -0700516 CLK_INIT(i##_clk.c), \
517 }, \
518 }
Matt Wagantalle18bbc82011-10-06 10:07:28 -0700519#define F_GSBI_QUP(f, s, d, m, n) \
Vikram Mulukutla489e39e2011-08-31 18:04:05 -0700520 { \
521 .freq_hz = f, \
522 .src_clk = &s##_clk.c, \
523 .md_val = MD8(16, m, 0, n), \
524 .ns_val = NS(23, 16, n, m, 5, 4, 3, d, 2, 0, s##_to_bb_mux), \
Vikram Mulukutla489e39e2011-08-31 18:04:05 -0700525 }
526static struct clk_freq_tbl clk_tbl_gsbi_qup[] = {
Matt Wagantalle18bbc82011-10-06 10:07:28 -0700527 F_GSBI_QUP( 0, gnd, 1, 0, 0),
528 F_GSBI_QUP( 960000, cxo, 4, 1, 5),
529 F_GSBI_QUP( 4800000, cxo, 4, 0, 1),
530 F_GSBI_QUP( 9600000, cxo, 2, 0, 1),
531 F_GSBI_QUP(15058800, pll8, 1, 2, 51),
532 F_GSBI_QUP(24000000, pll8, 4, 1, 4),
533 F_GSBI_QUP(25600000, pll8, 1, 1, 15),
534 F_GSBI_QUP(48000000, pll8, 4, 1, 2),
535 F_GSBI_QUP(51200000, pll8, 1, 2, 15),
Vikram Mulukutla489e39e2011-08-31 18:04:05 -0700536 F_END
537};
538
539static CLK_GSBI_QUP(gsbi1_qup, 1, CLK_HALT_CFPB_STATEA_REG, 9);
540static CLK_GSBI_QUP(gsbi2_qup, 2, CLK_HALT_CFPB_STATEA_REG, 4);
541static CLK_GSBI_QUP(gsbi3_qup, 3, CLK_HALT_CFPB_STATEA_REG, 0);
542static CLK_GSBI_QUP(gsbi4_qup, 4, CLK_HALT_CFPB_STATEB_REG, 24);
543static CLK_GSBI_QUP(gsbi5_qup, 5, CLK_HALT_CFPB_STATEB_REG, 20);
544
Matt Wagantalle18bbc82011-10-06 10:07:28 -0700545#define F_PDM(f, s, d) \
Vikram Mulukutla489e39e2011-08-31 18:04:05 -0700546 { \
547 .freq_hz = f, \
548 .src_clk = &s##_clk.c, \
549 .ns_val = NS_SRC_SEL(1, 0, s##_to_xo_mux), \
Vikram Mulukutla489e39e2011-08-31 18:04:05 -0700550 }
551static struct clk_freq_tbl clk_tbl_pdm[] = {
Matt Wagantalle18bbc82011-10-06 10:07:28 -0700552 F_PDM( 0, gnd, 1),
553 F_PDM(19200000, cxo, 1),
Vikram Mulukutla489e39e2011-08-31 18:04:05 -0700554 F_END
555};
556
557static struct rcg_clk pdm_clk = {
558 .b = {
559 .ctl_reg = PDM_CLK_NS_REG,
560 .en_mask = BIT(9),
561 .reset_reg = PDM_CLK_NS_REG,
562 .reset_mask = BIT(12),
563 .halt_reg = CLK_HALT_CFPB_STATEC_REG,
564 .halt_bit = 3,
565 },
566 .ns_reg = PDM_CLK_NS_REG,
567 .root_en_mask = BIT(11),
568 .ns_mask = BM(1, 0),
569 .set_rate = set_rate_nop,
570 .freq_tbl = clk_tbl_pdm,
571 .current_freq = &rcg_dummy_freq,
572 .c = {
573 .dbg_name = "pdm_clk",
574 .ops = &clk_ops_rcg_9615,
Matt Wagantalle18bbc82011-10-06 10:07:28 -0700575 VDD_DIG_FMAX_MAP1(LOW, 19200000),
Vikram Mulukutla489e39e2011-08-31 18:04:05 -0700576 CLK_INIT(pdm_clk.c),
577 },
578};
579
580static struct branch_clk pmem_clk = {
581 .b = {
582 .ctl_reg = PMEM_ACLK_CTL_REG,
583 .en_mask = BIT(4),
Matt Wagantallbc8c9062012-02-07 12:33:06 -0800584 .hwcg_reg = PMEM_ACLK_CTL_REG,
585 .hwcg_mask = BIT(6),
Vikram Mulukutla489e39e2011-08-31 18:04:05 -0700586 .halt_reg = CLK_HALT_DFAB_STATE_REG,
587 .halt_bit = 20,
588 },
589 .c = {
590 .dbg_name = "pmem_clk",
591 .ops = &clk_ops_branch,
592 CLK_INIT(pmem_clk.c),
593 },
594};
595
Matt Wagantalle18bbc82011-10-06 10:07:28 -0700596#define F_PRNG(f, s) \
Vikram Mulukutla489e39e2011-08-31 18:04:05 -0700597 { \
598 .freq_hz = f, \
599 .src_clk = &s##_clk.c, \
Vikram Mulukutla489e39e2011-08-31 18:04:05 -0700600 }
601static struct clk_freq_tbl clk_tbl_prng[] = {
Matt Wagantalle18bbc82011-10-06 10:07:28 -0700602 F_PRNG(32000000, pll8),
Vikram Mulukutla489e39e2011-08-31 18:04:05 -0700603 F_END
604};
605
606static struct rcg_clk prng_clk = {
607 .b = {
608 .ctl_reg = SC0_U_CLK_BRANCH_ENA_VOTE_REG,
609 .en_mask = BIT(10),
610 .halt_reg = CLK_HALT_SFPB_MISC_STATE_REG,
611 .halt_check = HALT_VOTED,
612 .halt_bit = 10,
613 },
614 .set_rate = set_rate_nop,
615 .freq_tbl = clk_tbl_prng,
616 .current_freq = &rcg_dummy_freq,
617 .c = {
618 .dbg_name = "prng_clk",
619 .ops = &clk_ops_rcg_9615,
Matt Wagantalle18bbc82011-10-06 10:07:28 -0700620 VDD_DIG_FMAX_MAP2(LOW, 32000000, NOMINAL, 65000000),
Vikram Mulukutla489e39e2011-08-31 18:04:05 -0700621 CLK_INIT(prng_clk.c),
622 },
623};
624
625#define CLK_SDC(name, n, h_b, f_table) \
626 struct rcg_clk name = { \
627 .b = { \
628 .ctl_reg = SDCn_APPS_CLK_NS_REG(n), \
629 .en_mask = BIT(9), \
630 .reset_reg = SDCn_RESET_REG(n), \
631 .reset_mask = BIT(0), \
632 .halt_reg = CLK_HALT_DFAB_STATE_REG, \
633 .halt_bit = h_b, \
634 }, \
635 .ns_reg = SDCn_APPS_CLK_NS_REG(n), \
636 .md_reg = SDCn_APPS_CLK_MD_REG(n), \
637 .root_en_mask = BIT(11), \
638 .ns_mask = (BM(23, 16) | BM(6, 0)), \
Matt Wagantall07c45472012-02-10 23:27:24 -0800639 .mnd_en_mask = BIT(8), \
Vikram Mulukutla489e39e2011-08-31 18:04:05 -0700640 .set_rate = set_rate_mnd, \
641 .freq_tbl = f_table, \
642 .current_freq = &rcg_dummy_freq, \
643 .c = { \
644 .dbg_name = #name, \
645 .ops = &clk_ops_rcg_9615, \
Vikram Mulukutla2d0f6432011-11-07 20:22:08 -0800646 VDD_DIG_FMAX_MAP2(LOW, 26000000, NOMINAL, 52000000), \
Vikram Mulukutla489e39e2011-08-31 18:04:05 -0700647 CLK_INIT(name.c), \
648 }, \
649 }
Matt Wagantalle18bbc82011-10-06 10:07:28 -0700650#define F_SDC(f, s, d, m, n) \
Vikram Mulukutla489e39e2011-08-31 18:04:05 -0700651 { \
652 .freq_hz = f, \
653 .src_clk = &s##_clk.c, \
654 .md_val = MD8(16, m, 0, n), \
655 .ns_val = NS(23, 16, n, m, 5, 4, 3, d, 2, 0, s##_to_bb_mux), \
Vikram Mulukutla489e39e2011-08-31 18:04:05 -0700656 }
657static struct clk_freq_tbl clk_tbl_sdc1_2[] = {
Matt Wagantalle18bbc82011-10-06 10:07:28 -0700658 F_SDC( 0, gnd, 1, 0, 0),
659 F_SDC( 144300, cxo, 1, 1, 133),
660 F_SDC( 400000, pll8, 4, 1, 240),
661 F_SDC( 16000000, pll8, 4, 1, 6),
662 F_SDC( 17070000, pll8, 1, 2, 45),
663 F_SDC( 20210000, pll8, 1, 1, 19),
664 F_SDC( 24000000, pll8, 4, 1, 4),
Vikram Mulukutla2d0f6432011-11-07 20:22:08 -0800665 F_SDC( 38400000, pll8, 2, 1, 5),
Matt Wagantalle18bbc82011-10-06 10:07:28 -0700666 F_SDC( 48000000, pll8, 4, 1, 2),
Vikram Mulukutla2d0f6432011-11-07 20:22:08 -0800667 F_SDC( 64000000, pll8, 3, 1, 2),
668 F_SDC( 76800000, pll8, 1, 1, 5),
Vikram Mulukutla489e39e2011-08-31 18:04:05 -0700669 F_END
670};
671
672static CLK_SDC(sdc1_clk, 1, 6, clk_tbl_sdc1_2);
673static CLK_SDC(sdc2_clk, 2, 5, clk_tbl_sdc1_2);
674
Matt Wagantalle18bbc82011-10-06 10:07:28 -0700675#define F_USB(f, s, d, m, n) \
Vikram Mulukutla489e39e2011-08-31 18:04:05 -0700676 { \
677 .freq_hz = f, \
678 .src_clk = &s##_clk.c, \
679 .md_val = MD8(16, m, 0, n), \
680 .ns_val = NS(23, 16, n, m, 5, 4, 3, d, 2, 0, s##_to_bb_mux), \
Vikram Mulukutla489e39e2011-08-31 18:04:05 -0700681 }
682static struct clk_freq_tbl clk_tbl_usb[] = {
Matt Wagantalle18bbc82011-10-06 10:07:28 -0700683 F_USB( 0, gnd, 1, 0, 0),
684 F_USB(60000000, pll8, 1, 5, 32),
Vikram Mulukutla489e39e2011-08-31 18:04:05 -0700685 F_END
686};
687
Vikram Mulukutla6c9158f2011-12-08 12:41:20 -0800688static struct clk_freq_tbl clk_tbl_usb_hsic_sys[] = {
689 F_USB( 0, gnd, 1, 0, 0),
690 F_USB(64000000, pll8, 1, 1, 6),
691 F_END
692};
693
Vikram Mulukutla489e39e2011-08-31 18:04:05 -0700694static struct rcg_clk usb_hs1_xcvr_clk = {
695 .b = {
696 .ctl_reg = USB_HS1_XCVR_FS_CLK_NS_REG,
697 .en_mask = BIT(9),
698 .reset_reg = USB_HS1_RESET_REG,
699 .reset_mask = BIT(0),
700 .halt_reg = CLK_HALT_DFAB_STATE_REG,
701 .halt_bit = 0,
702 },
703 .ns_reg = USB_HS1_XCVR_FS_CLK_NS_REG,
704 .md_reg = USB_HS1_XCVR_FS_CLK_MD_REG,
705 .root_en_mask = BIT(11),
706 .ns_mask = (BM(23, 16) | BM(6, 0)),
Matt Wagantall07c45472012-02-10 23:27:24 -0800707 .mnd_en_mask = BIT(8),
Vikram Mulukutla489e39e2011-08-31 18:04:05 -0700708 .set_rate = set_rate_mnd,
709 .freq_tbl = clk_tbl_usb,
710 .current_freq = &rcg_dummy_freq,
711 .c = {
712 .dbg_name = "usb_hs1_xcvr_clk",
713 .ops = &clk_ops_rcg_9615,
Matt Wagantalle18bbc82011-10-06 10:07:28 -0700714 VDD_DIG_FMAX_MAP1(NOMINAL, 60000000),
Vikram Mulukutla489e39e2011-08-31 18:04:05 -0700715 CLK_INIT(usb_hs1_xcvr_clk.c),
716 },
717};
718
719static struct rcg_clk usb_hs1_sys_clk = {
720 .b = {
721 .ctl_reg = USB_HS1_SYS_CLK_NS_REG,
722 .en_mask = BIT(9),
723 .reset_reg = USB_HS1_RESET_REG,
724 .reset_mask = BIT(0),
725 .halt_reg = CLK_HALT_DFAB_STATE_REG,
726 .halt_bit = 4,
727 },
728 .ns_reg = USB_HS1_SYS_CLK_NS_REG,
729 .md_reg = USB_HS1_SYS_CLK_MD_REG,
730 .root_en_mask = BIT(11),
731 .ns_mask = (BM(23, 16) | BM(6, 0)),
Matt Wagantall07c45472012-02-10 23:27:24 -0800732 .mnd_en_mask = BIT(8),
Vikram Mulukutla489e39e2011-08-31 18:04:05 -0700733 .set_rate = set_rate_mnd,
734 .freq_tbl = clk_tbl_usb,
735 .current_freq = &rcg_dummy_freq,
736 .c = {
737 .dbg_name = "usb_hs1_sys_clk",
738 .ops = &clk_ops_rcg_9615,
Matt Wagantalle18bbc82011-10-06 10:07:28 -0700739 VDD_DIG_FMAX_MAP1(NOMINAL, 60000000),
Vikram Mulukutla489e39e2011-08-31 18:04:05 -0700740 CLK_INIT(usb_hs1_sys_clk.c),
741 },
742};
743
744static struct rcg_clk usb_hsic_xcvr_clk = {
745 .b = {
746 .ctl_reg = USB_HSIC_XCVR_FS_CLK_NS_REG,
747 .en_mask = BIT(9),
748 .reset_reg = USB_HSIC_RESET_REG,
749 .reset_mask = BIT(0),
750 .halt_reg = CLK_HALT_DFAB_STATE_REG,
751 .halt_bit = 9,
752 },
753 .ns_reg = USB_HSIC_XCVR_FS_CLK_NS_REG,
754 .md_reg = USB_HSIC_XCVR_FS_CLK_MD_REG,
755 .root_en_mask = BIT(11),
756 .ns_mask = (BM(23, 16) | BM(6, 0)),
Matt Wagantall07c45472012-02-10 23:27:24 -0800757 .mnd_en_mask = BIT(8),
Vikram Mulukutla489e39e2011-08-31 18:04:05 -0700758 .set_rate = set_rate_mnd,
759 .freq_tbl = clk_tbl_usb,
760 .current_freq = &rcg_dummy_freq,
761 .c = {
762 .dbg_name = "usb_hsic_xcvr_clk",
763 .ops = &clk_ops_rcg_9615,
Vikram Mulukutla6c9158f2011-12-08 12:41:20 -0800764 VDD_DIG_FMAX_MAP1(LOW, 60000000),
Vikram Mulukutla489e39e2011-08-31 18:04:05 -0700765 CLK_INIT(usb_hsic_xcvr_clk.c),
766 },
767};
768
769static struct rcg_clk usb_hsic_sys_clk = {
770 .b = {
771 .ctl_reg = USB_HSIC_SYSTEM_CLK_NS_REG,
772 .en_mask = BIT(9),
773 .reset_reg = USB_HSIC_RESET_REG,
774 .reset_mask = BIT(0),
775 .halt_reg = CLK_HALT_DFAB_STATE_REG,
776 .halt_bit = 7,
777 },
778 .ns_reg = USB_HSIC_SYSTEM_CLK_NS_REG,
779 .md_reg = USB_HSIC_SYSTEM_CLK_MD_REG,
780 .root_en_mask = BIT(11),
781 .ns_mask = (BM(23, 16) | BM(6, 0)),
Matt Wagantall07c45472012-02-10 23:27:24 -0800782 .mnd_en_mask = BIT(8),
Vikram Mulukutla489e39e2011-08-31 18:04:05 -0700783 .set_rate = set_rate_mnd,
Vikram Mulukutla6c9158f2011-12-08 12:41:20 -0800784 .freq_tbl = clk_tbl_usb_hsic_sys,
Vikram Mulukutla489e39e2011-08-31 18:04:05 -0700785 .current_freq = &rcg_dummy_freq,
786 .c = {
787 .dbg_name = "usb_hsic_sys_clk",
788 .ops = &clk_ops_rcg_9615,
Vikram Mulukutla6c9158f2011-12-08 12:41:20 -0800789 VDD_DIG_FMAX_MAP1(LOW, 64000000),
Vikram Mulukutla489e39e2011-08-31 18:04:05 -0700790 CLK_INIT(usb_hsic_sys_clk.c),
791 },
792};
793
794static struct clk_freq_tbl clk_tbl_usb_hsic[] = {
Matt Wagantalle18bbc82011-10-06 10:07:28 -0700795 F_USB( 0, gnd, 1, 0, 0),
Vikram Mulukutla6c9158f2011-12-08 12:41:20 -0800796 F_USB(480000000, pll14, 1, 0, 0),
Vikram Mulukutla489e39e2011-08-31 18:04:05 -0700797 F_END
798};
799
800static struct rcg_clk usb_hsic_clk = {
801 .b = {
802 .ctl_reg = USB_HSIC_CLK_NS_REG,
803 .en_mask = BIT(9),
804 .reset_reg = USB_HSIC_RESET_REG,
805 .reset_mask = BIT(0),
Vikram Mulukutla6c9158f2011-12-08 12:41:20 -0800806 .halt_check = DELAY,
Vikram Mulukutla489e39e2011-08-31 18:04:05 -0700807 },
808 .ns_reg = USB_HSIC_CLK_NS_REG,
809 .md_reg = USB_HSIC_CLK_MD_REG,
810 .root_en_mask = BIT(11),
811 .ns_mask = (BM(23, 16) | BM(6, 0)),
812 .set_rate = set_rate_mnd,
813 .freq_tbl = clk_tbl_usb_hsic,
814 .current_freq = &rcg_dummy_freq,
815 .c = {
816 .dbg_name = "usb_hsic_clk",
817 .ops = &clk_ops_rcg_9615,
Vikram Mulukutla6c9158f2011-12-08 12:41:20 -0800818 VDD_DIG_FMAX_MAP1(LOW, 480000000),
Vikram Mulukutla489e39e2011-08-31 18:04:05 -0700819 CLK_INIT(usb_hsic_clk.c),
820 },
821};
822
823static struct branch_clk usb_hsic_hsio_cal_clk = {
824 .b = {
825 .ctl_reg = USB_HSIC_HSIO_CAL_CLK_CTL_REG,
826 .en_mask = BIT(0),
827 .halt_reg = CLK_HALT_DFAB_STATE_REG,
828 .halt_bit = 8,
829 },
830 .parent = &cxo_clk.c,
831 .c = {
832 .dbg_name = "usb_hsic_hsio_cal_clk",
833 .ops = &clk_ops_branch,
834 CLK_INIT(usb_hsic_hsio_cal_clk.c),
835 },
836};
837
838/* Fast Peripheral Bus Clocks */
839static struct branch_clk ce1_core_clk = {
840 .b = {
841 .ctl_reg = CE1_CORE_CLK_CTL_REG,
842 .en_mask = BIT(4),
Matt Wagantallbc8c9062012-02-07 12:33:06 -0800843 .hwcg_reg = CE1_CORE_CLK_CTL_REG,
844 .hwcg_mask = BIT(6),
Vikram Mulukutla489e39e2011-08-31 18:04:05 -0700845 .halt_reg = CLK_HALT_CFPB_STATEC_REG,
846 .halt_bit = 27,
847 },
848 .c = {
849 .dbg_name = "ce1_core_clk",
850 .ops = &clk_ops_branch,
851 CLK_INIT(ce1_core_clk.c),
852 },
853};
854static struct branch_clk ce1_p_clk = {
855 .b = {
856 .ctl_reg = CE1_HCLK_CTL_REG,
857 .en_mask = BIT(4),
858 .halt_reg = CLK_HALT_CFPB_STATEC_REG,
859 .halt_bit = 1,
860 },
861 .c = {
862 .dbg_name = "ce1_p_clk",
863 .ops = &clk_ops_branch,
864 CLK_INIT(ce1_p_clk.c),
865 },
866};
867
868static struct branch_clk dma_bam_p_clk = {
869 .b = {
870 .ctl_reg = DMA_BAM_HCLK_CTL,
871 .en_mask = BIT(4),
872 .halt_reg = CLK_HALT_DFAB_STATE_REG,
873 .halt_bit = 12,
874 },
875 .c = {
876 .dbg_name = "dma_bam_p_clk",
877 .ops = &clk_ops_branch,
878 CLK_INIT(dma_bam_p_clk.c),
879 },
880};
881
882static struct branch_clk gsbi1_p_clk = {
883 .b = {
884 .ctl_reg = GSBIn_HCLK_CTL_REG(1),
885 .en_mask = BIT(4),
886 .halt_reg = CLK_HALT_CFPB_STATEA_REG,
887 .halt_bit = 11,
888 },
889 .c = {
890 .dbg_name = "gsbi1_p_clk",
891 .ops = &clk_ops_branch,
892 CLK_INIT(gsbi1_p_clk.c),
893 },
894};
895
896static struct branch_clk gsbi2_p_clk = {
897 .b = {
898 .ctl_reg = GSBIn_HCLK_CTL_REG(2),
899 .en_mask = BIT(4),
900 .halt_reg = CLK_HALT_CFPB_STATEA_REG,
901 .halt_bit = 7,
902 },
903 .c = {
904 .dbg_name = "gsbi2_p_clk",
905 .ops = &clk_ops_branch,
906 CLK_INIT(gsbi2_p_clk.c),
907 },
908};
909
910static struct branch_clk gsbi3_p_clk = {
911 .b = {
912 .ctl_reg = GSBIn_HCLK_CTL_REG(3),
913 .en_mask = BIT(4),
914 .halt_reg = CLK_HALT_CFPB_STATEA_REG,
915 .halt_bit = 3,
916 },
917 .c = {
918 .dbg_name = "gsbi3_p_clk",
919 .ops = &clk_ops_branch,
920 CLK_INIT(gsbi3_p_clk.c),
921 },
922};
923
924static struct branch_clk gsbi4_p_clk = {
925 .b = {
926 .ctl_reg = GSBIn_HCLK_CTL_REG(4),
927 .en_mask = BIT(4),
928 .halt_reg = CLK_HALT_CFPB_STATEB_REG,
929 .halt_bit = 27,
930 },
931 .c = {
932 .dbg_name = "gsbi4_p_clk",
933 .ops = &clk_ops_branch,
934 CLK_INIT(gsbi4_p_clk.c),
935 },
936};
937
938static struct branch_clk gsbi5_p_clk = {
939 .b = {
940 .ctl_reg = GSBIn_HCLK_CTL_REG(5),
941 .en_mask = BIT(4),
942 .halt_reg = CLK_HALT_CFPB_STATEB_REG,
943 .halt_bit = 23,
944 },
945 .c = {
946 .dbg_name = "gsbi5_p_clk",
947 .ops = &clk_ops_branch,
948 CLK_INIT(gsbi5_p_clk.c),
949 },
950};
951
952static struct branch_clk usb_hs1_p_clk = {
953 .b = {
954 .ctl_reg = USB_HS1_HCLK_CTL_REG,
955 .en_mask = BIT(4),
Matt Wagantallbc8c9062012-02-07 12:33:06 -0800956 .hwcg_reg = USB_HS1_HCLK_CTL_REG,
957 .hwcg_mask = BIT(6),
Vikram Mulukutla489e39e2011-08-31 18:04:05 -0700958 .halt_reg = CLK_HALT_DFAB_STATE_REG,
959 .halt_bit = 1,
960 },
961 .c = {
962 .dbg_name = "usb_hs1_p_clk",
963 .ops = &clk_ops_branch,
964 CLK_INIT(usb_hs1_p_clk.c),
965 },
966};
967
968static struct branch_clk usb_hsic_p_clk = {
969 .b = {
970 .ctl_reg = USB_HSIC_HCLK_CTL_REG,
971 .en_mask = BIT(4),
Matt Wagantallbc8c9062012-02-07 12:33:06 -0800972 .hwcg_reg = USB_HSIC_HCLK_CTL_REG,
973 .hwcg_mask = BIT(6),
Vikram Mulukutla489e39e2011-08-31 18:04:05 -0700974 .halt_reg = CLK_HALT_DFAB_STATE_REG,
975 .halt_bit = 3,
976 },
977 .c = {
978 .dbg_name = "usb_hsic_p_clk",
979 .ops = &clk_ops_branch,
980 CLK_INIT(usb_hsic_p_clk.c),
981 },
982};
983
984static struct branch_clk sdc1_p_clk = {
985 .b = {
986 .ctl_reg = SDCn_HCLK_CTL_REG(1),
987 .en_mask = BIT(4),
Matt Wagantallbc8c9062012-02-07 12:33:06 -0800988 .hwcg_reg = SDCn_HCLK_CTL_REG(1),
989 .hwcg_mask = BIT(6),
Vikram Mulukutla489e39e2011-08-31 18:04:05 -0700990 .halt_reg = CLK_HALT_DFAB_STATE_REG,
991 .halt_bit = 11,
992 },
993 .c = {
994 .dbg_name = "sdc1_p_clk",
995 .ops = &clk_ops_branch,
996 CLK_INIT(sdc1_p_clk.c),
997 },
998};
999
1000static struct branch_clk sdc2_p_clk = {
1001 .b = {
1002 .ctl_reg = SDCn_HCLK_CTL_REG(2),
1003 .en_mask = BIT(4),
Matt Wagantallbc8c9062012-02-07 12:33:06 -08001004 .hwcg_reg = SDCn_HCLK_CTL_REG(2),
1005 .hwcg_mask = BIT(6),
Vikram Mulukutla489e39e2011-08-31 18:04:05 -07001006 .halt_reg = CLK_HALT_DFAB_STATE_REG,
1007 .halt_bit = 10,
1008 },
1009 .c = {
1010 .dbg_name = "sdc2_p_clk",
1011 .ops = &clk_ops_branch,
1012 CLK_INIT(sdc2_p_clk.c),
1013 },
1014};
1015
1016/* HW-Voteable Clocks */
1017static struct branch_clk adm0_clk = {
1018 .b = {
1019 .ctl_reg = SC0_U_CLK_BRANCH_ENA_VOTE_REG,
1020 .en_mask = BIT(2),
1021 .halt_reg = CLK_HALT_MSS_KPSS_MISC_STATE_REG,
1022 .halt_check = HALT_VOTED,
1023 .halt_bit = 14,
1024 },
1025 .c = {
1026 .dbg_name = "adm0_clk",
1027 .ops = &clk_ops_branch,
1028 CLK_INIT(adm0_clk.c),
1029 },
1030};
1031
1032static struct branch_clk adm0_p_clk = {
1033 .b = {
1034 .ctl_reg = SC0_U_CLK_BRANCH_ENA_VOTE_REG,
1035 .en_mask = BIT(3),
1036 .halt_reg = CLK_HALT_MSS_KPSS_MISC_STATE_REG,
1037 .halt_check = HALT_VOTED,
1038 .halt_bit = 13,
1039 },
1040 .c = {
1041 .dbg_name = "adm0_p_clk",
1042 .ops = &clk_ops_branch,
1043 CLK_INIT(adm0_p_clk.c),
1044 },
1045};
1046
1047static struct branch_clk pmic_arb0_p_clk = {
1048 .b = {
1049 .ctl_reg = SC0_U_CLK_BRANCH_ENA_VOTE_REG,
1050 .en_mask = BIT(8),
1051 .halt_reg = CLK_HALT_SFPB_MISC_STATE_REG,
1052 .halt_check = HALT_VOTED,
1053 .halt_bit = 22,
1054 },
1055 .c = {
1056 .dbg_name = "pmic_arb0_p_clk",
1057 .ops = &clk_ops_branch,
1058 CLK_INIT(pmic_arb0_p_clk.c),
1059 },
1060};
1061
1062static struct branch_clk pmic_arb1_p_clk = {
1063 .b = {
1064 .ctl_reg = SC0_U_CLK_BRANCH_ENA_VOTE_REG,
1065 .en_mask = BIT(9),
1066 .halt_reg = CLK_HALT_SFPB_MISC_STATE_REG,
1067 .halt_check = HALT_VOTED,
1068 .halt_bit = 21,
1069 },
1070 .c = {
1071 .dbg_name = "pmic_arb1_p_clk",
1072 .ops = &clk_ops_branch,
1073 CLK_INIT(pmic_arb1_p_clk.c),
1074 },
1075};
1076
1077static struct branch_clk pmic_ssbi2_clk = {
1078 .b = {
1079 .ctl_reg = SC0_U_CLK_BRANCH_ENA_VOTE_REG,
1080 .en_mask = BIT(7),
1081 .halt_reg = CLK_HALT_SFPB_MISC_STATE_REG,
1082 .halt_check = HALT_VOTED,
1083 .halt_bit = 23,
1084 },
1085 .c = {
1086 .dbg_name = "pmic_ssbi2_clk",
1087 .ops = &clk_ops_branch,
1088 CLK_INIT(pmic_ssbi2_clk.c),
1089 },
1090};
1091
1092static struct branch_clk rpm_msg_ram_p_clk = {
1093 .b = {
1094 .ctl_reg = SC0_U_CLK_BRANCH_ENA_VOTE_REG,
1095 .en_mask = BIT(6),
1096 .halt_reg = CLK_HALT_SFPB_MISC_STATE_REG,
1097 .halt_check = HALT_VOTED,
1098 .halt_bit = 12,
1099 },
1100 .c = {
1101 .dbg_name = "rpm_msg_ram_p_clk",
1102 .ops = &clk_ops_branch,
1103 CLK_INIT(rpm_msg_ram_p_clk.c),
1104 },
1105};
1106
1107/*
1108 * Low Power Audio Clocks
1109 */
Matt Wagantalle18bbc82011-10-06 10:07:28 -07001110#define F_AIF_OSR(f, s, d, m, n) \
Vikram Mulukutla489e39e2011-08-31 18:04:05 -07001111 { \
1112 .freq_hz = f, \
1113 .src_clk = &s##_clk.c, \
1114 .md_val = MD8(8, m, 0, n), \
1115 .ns_val = NS(31, 24, n, m, 5, 4, 3, d, 2, 0, s##_to_lpa_mux), \
Vikram Mulukutla489e39e2011-08-31 18:04:05 -07001116 }
1117static struct clk_freq_tbl clk_tbl_aif_osr[] = {
Matt Wagantalle18bbc82011-10-06 10:07:28 -07001118 F_AIF_OSR( 0, gnd, 1, 0, 0),
1119 F_AIF_OSR( 512000, pll4, 4, 1, 192),
1120 F_AIF_OSR( 768000, pll4, 4, 1, 128),
1121 F_AIF_OSR( 1024000, pll4, 4, 1, 96),
1122 F_AIF_OSR( 1536000, pll4, 4, 1, 64),
1123 F_AIF_OSR( 2048000, pll4, 4, 1, 48),
1124 F_AIF_OSR( 3072000, pll4, 4, 1, 32),
1125 F_AIF_OSR( 4096000, pll4, 4, 1, 24),
1126 F_AIF_OSR( 6144000, pll4, 4, 1, 16),
1127 F_AIF_OSR( 8192000, pll4, 4, 1, 12),
1128 F_AIF_OSR(12288000, pll4, 4, 1, 8),
1129 F_AIF_OSR(24576000, pll4, 4, 1, 4),
Vikram Mulukutla489e39e2011-08-31 18:04:05 -07001130 F_END
1131};
1132
1133#define CLK_AIF_OSR(i, ns, md, h_r) \
1134 struct rcg_clk i##_clk = { \
1135 .b = { \
1136 .ctl_reg = ns, \
1137 .en_mask = BIT(17), \
1138 .reset_reg = ns, \
1139 .reset_mask = BIT(19), \
1140 .halt_reg = h_r, \
1141 .halt_check = ENABLE, \
1142 .halt_bit = 1, \
1143 }, \
1144 .ns_reg = ns, \
1145 .md_reg = md, \
1146 .root_en_mask = BIT(9), \
1147 .ns_mask = (BM(31, 24) | BM(6, 0)), \
Matt Wagantall07c45472012-02-10 23:27:24 -08001148 .mnd_en_mask = BIT(8), \
Vikram Mulukutla489e39e2011-08-31 18:04:05 -07001149 .set_rate = set_rate_mnd, \
1150 .freq_tbl = clk_tbl_aif_osr, \
1151 .current_freq = &rcg_dummy_freq, \
1152 .c = { \
1153 .dbg_name = #i "_clk", \
1154 .ops = &clk_ops_rcg_9615, \
1155 CLK_INIT(i##_clk.c), \
1156 }, \
1157 }
1158#define CLK_AIF_OSR_DIV(i, ns, md, h_r) \
1159 struct rcg_clk i##_clk = { \
1160 .b = { \
1161 .ctl_reg = ns, \
1162 .en_mask = BIT(21), \
1163 .reset_reg = ns, \
1164 .reset_mask = BIT(23), \
1165 .halt_reg = h_r, \
1166 .halt_check = ENABLE, \
1167 .halt_bit = 1, \
1168 }, \
1169 .ns_reg = ns, \
1170 .md_reg = md, \
1171 .root_en_mask = BIT(9), \
1172 .ns_mask = (BM(31, 24) | BM(6, 0)), \
Matt Wagantall07c45472012-02-10 23:27:24 -08001173 .mnd_en_mask = BIT(8), \
Vikram Mulukutla489e39e2011-08-31 18:04:05 -07001174 .set_rate = set_rate_mnd, \
1175 .freq_tbl = clk_tbl_aif_osr, \
1176 .current_freq = &rcg_dummy_freq, \
1177 .c = { \
1178 .dbg_name = #i "_clk", \
1179 .ops = &clk_ops_rcg_9615, \
1180 CLK_INIT(i##_clk.c), \
1181 }, \
1182 }
1183
Vikram Mulukutla489e39e2011-08-31 18:04:05 -07001184#define CLK_AIF_BIT(i, ns, h_r) \
Stephen Boyd9fd19642011-11-16 11:11:09 -08001185 struct cdiv_clk i##_clk = { \
Vikram Mulukutla489e39e2011-08-31 18:04:05 -07001186 .b = { \
1187 .ctl_reg = ns, \
1188 .en_mask = BIT(15), \
1189 .halt_reg = h_r, \
1190 .halt_check = DELAY, \
1191 }, \
1192 .ns_reg = ns, \
Stephen Boyd9fd19642011-11-16 11:11:09 -08001193 .ext_mask = BIT(14), \
1194 .div_offset = 10, \
1195 .max_div = 16, \
Vikram Mulukutla489e39e2011-08-31 18:04:05 -07001196 .c = { \
1197 .dbg_name = #i "_clk", \
Stephen Boyd9fd19642011-11-16 11:11:09 -08001198 .ops = &clk_ops_cdiv, \
Vikram Mulukutla489e39e2011-08-31 18:04:05 -07001199 CLK_INIT(i##_clk.c), \
1200 }, \
1201 }
1202
Vikram Mulukutla489e39e2011-08-31 18:04:05 -07001203#define CLK_AIF_BIT_DIV(i, ns, h_r) \
Stephen Boyd9fd19642011-11-16 11:11:09 -08001204 struct cdiv_clk i##_clk = { \
Vikram Mulukutla489e39e2011-08-31 18:04:05 -07001205 .b = { \
1206 .ctl_reg = ns, \
1207 .en_mask = BIT(19), \
1208 .halt_reg = h_r, \
Stephen Boyd7bb9cf82012-01-25 18:09:01 -08001209 .halt_check = DELAY, \
Vikram Mulukutla489e39e2011-08-31 18:04:05 -07001210 }, \
1211 .ns_reg = ns, \
Stephen Boyd9fd19642011-11-16 11:11:09 -08001212 .ext_mask = BIT(18), \
1213 .div_offset = 10, \
1214 .max_div = 256, \
Vikram Mulukutla489e39e2011-08-31 18:04:05 -07001215 .c = { \
1216 .dbg_name = #i "_clk", \
Stephen Boyd9fd19642011-11-16 11:11:09 -08001217 .ops = &clk_ops_cdiv, \
Vikram Mulukutla489e39e2011-08-31 18:04:05 -07001218 CLK_INIT(i##_clk.c), \
1219 }, \
1220 }
1221
1222static CLK_AIF_OSR(mi2s_osr, LCC_MI2S_NS_REG, LCC_MI2S_MD_REG,
1223 LCC_MI2S_STATUS_REG);
1224static CLK_AIF_BIT(mi2s_bit, LCC_MI2S_NS_REG, LCC_MI2S_STATUS_REG);
1225
1226static CLK_AIF_OSR_DIV(codec_i2s_mic_osr, LCC_CODEC_I2S_MIC_NS_REG,
1227 LCC_CODEC_I2S_MIC_MD_REG, LCC_CODEC_I2S_MIC_STATUS_REG);
1228static CLK_AIF_BIT_DIV(codec_i2s_mic_bit, LCC_CODEC_I2S_MIC_NS_REG,
1229 LCC_CODEC_I2S_MIC_STATUS_REG);
1230
1231static CLK_AIF_OSR_DIV(spare_i2s_mic_osr, LCC_SPARE_I2S_MIC_NS_REG,
1232 LCC_SPARE_I2S_MIC_MD_REG, LCC_SPARE_I2S_MIC_STATUS_REG);
1233static CLK_AIF_BIT_DIV(spare_i2s_mic_bit, LCC_SPARE_I2S_MIC_NS_REG,
1234 LCC_SPARE_I2S_MIC_STATUS_REG);
1235
1236static CLK_AIF_OSR_DIV(codec_i2s_spkr_osr, LCC_CODEC_I2S_SPKR_NS_REG,
1237 LCC_CODEC_I2S_SPKR_MD_REG, LCC_CODEC_I2S_SPKR_STATUS_REG);
1238static CLK_AIF_BIT_DIV(codec_i2s_spkr_bit, LCC_CODEC_I2S_SPKR_NS_REG,
1239 LCC_CODEC_I2S_SPKR_STATUS_REG);
1240
1241static CLK_AIF_OSR_DIV(spare_i2s_spkr_osr, LCC_SPARE_I2S_SPKR_NS_REG,
1242 LCC_SPARE_I2S_SPKR_MD_REG, LCC_SPARE_I2S_SPKR_STATUS_REG);
1243static CLK_AIF_BIT_DIV(spare_i2s_spkr_bit, LCC_SPARE_I2S_SPKR_NS_REG,
1244 LCC_SPARE_I2S_SPKR_STATUS_REG);
1245
Matt Wagantalle18bbc82011-10-06 10:07:28 -07001246#define F_PCM(f, s, d, m, n) \
Vikram Mulukutla489e39e2011-08-31 18:04:05 -07001247 { \
1248 .freq_hz = f, \
1249 .src_clk = &s##_clk.c, \
1250 .md_val = MD16(m, n), \
1251 .ns_val = NS(31, 16, n, m, 5, 4, 3, d, 2, 0, s##_to_lpa_mux), \
Vikram Mulukutla489e39e2011-08-31 18:04:05 -07001252 }
1253static struct clk_freq_tbl clk_tbl_pcm[] = {
Matt Wagantalle18bbc82011-10-06 10:07:28 -07001254 F_PCM( 0, gnd, 1, 0, 0),
1255 F_PCM( 512000, pll4, 4, 1, 192),
1256 F_PCM( 768000, pll4, 4, 1, 128),
1257 F_PCM( 1024000, pll4, 4, 1, 96),
1258 F_PCM( 1536000, pll4, 4, 1, 64),
1259 F_PCM( 2048000, pll4, 4, 1, 48),
1260 F_PCM( 3072000, pll4, 4, 1, 32),
1261 F_PCM( 4096000, pll4, 4, 1, 24),
1262 F_PCM( 6144000, pll4, 4, 1, 16),
1263 F_PCM( 8192000, pll4, 4, 1, 12),
1264 F_PCM(12288000, pll4, 4, 1, 8),
1265 F_PCM(24576000, pll4, 4, 1, 4),
Vikram Mulukutla489e39e2011-08-31 18:04:05 -07001266 F_END
1267};
1268
1269static struct rcg_clk pcm_clk = {
1270 .b = {
1271 .ctl_reg = LCC_PCM_NS_REG,
1272 .en_mask = BIT(11),
1273 .reset_reg = LCC_PCM_NS_REG,
1274 .reset_mask = BIT(13),
1275 .halt_reg = LCC_PCM_STATUS_REG,
1276 .halt_check = ENABLE,
1277 .halt_bit = 0,
1278 },
1279 .ns_reg = LCC_PCM_NS_REG,
1280 .md_reg = LCC_PCM_MD_REG,
1281 .root_en_mask = BIT(9),
1282 .ns_mask = (BM(31, 16) | BM(6, 0)),
Matt Wagantall07c45472012-02-10 23:27:24 -08001283 .mnd_en_mask = BIT(8),
Vikram Mulukutla489e39e2011-08-31 18:04:05 -07001284 .set_rate = set_rate_mnd,
1285 .freq_tbl = clk_tbl_pcm,
1286 .current_freq = &rcg_dummy_freq,
1287 .c = {
1288 .dbg_name = "pcm_clk",
1289 .ops = &clk_ops_rcg_9615,
Matt Wagantalle18bbc82011-10-06 10:07:28 -07001290 VDD_DIG_FMAX_MAP1(LOW, 24576000),
Vikram Mulukutla489e39e2011-08-31 18:04:05 -07001291 CLK_INIT(pcm_clk.c),
1292 },
1293};
1294
1295static struct rcg_clk audio_slimbus_clk = {
1296 .b = {
1297 .ctl_reg = LCC_SLIMBUS_NS_REG,
1298 .en_mask = BIT(10),
1299 .reset_reg = LCC_AHBEX_BRANCH_CTL_REG,
1300 .reset_mask = BIT(5),
1301 .halt_reg = LCC_SLIMBUS_STATUS_REG,
1302 .halt_check = ENABLE,
1303 .halt_bit = 0,
1304 },
1305 .ns_reg = LCC_SLIMBUS_NS_REG,
1306 .md_reg = LCC_SLIMBUS_MD_REG,
1307 .root_en_mask = BIT(9),
1308 .ns_mask = (BM(31, 24) | BM(6, 0)),
Matt Wagantall07c45472012-02-10 23:27:24 -08001309 .mnd_en_mask = BIT(8),
Vikram Mulukutla489e39e2011-08-31 18:04:05 -07001310 .set_rate = set_rate_mnd,
1311 .freq_tbl = clk_tbl_aif_osr,
1312 .current_freq = &rcg_dummy_freq,
1313 .c = {
1314 .dbg_name = "audio_slimbus_clk",
1315 .ops = &clk_ops_rcg_9615,
Matt Wagantalle18bbc82011-10-06 10:07:28 -07001316 VDD_DIG_FMAX_MAP1(LOW, 24576000),
Vikram Mulukutla489e39e2011-08-31 18:04:05 -07001317 CLK_INIT(audio_slimbus_clk.c),
1318 },
1319};
1320
1321static struct branch_clk sps_slimbus_clk = {
1322 .b = {
1323 .ctl_reg = LCC_SLIMBUS_NS_REG,
1324 .en_mask = BIT(12),
1325 .halt_reg = LCC_SLIMBUS_STATUS_REG,
1326 .halt_check = ENABLE,
1327 .halt_bit = 1,
1328 },
1329 .parent = &audio_slimbus_clk.c,
1330 .c = {
1331 .dbg_name = "sps_slimbus_clk",
1332 .ops = &clk_ops_branch,
1333 CLK_INIT(sps_slimbus_clk.c),
1334 },
1335};
1336
1337static struct branch_clk slimbus_xo_src_clk = {
1338 .b = {
1339 .ctl_reg = SLIMBUS_XO_SRC_CLK_CTL_REG,
1340 .en_mask = BIT(2),
1341 .halt_reg = CLK_HALT_DFAB_STATE_REG,
1342 .halt_bit = 28,
1343 },
1344 .parent = &sps_slimbus_clk.c,
1345 .c = {
1346 .dbg_name = "slimbus_xo_src_clk",
1347 .ops = &clk_ops_branch,
1348 CLK_INIT(slimbus_xo_src_clk.c),
1349 },
1350};
1351
Vikram Mulukutla73d42112011-09-19 16:32:54 -07001352DEFINE_CLK_RPM(cfpb_clk, cfpb_a_clk, CFPB, NULL);
1353DEFINE_CLK_RPM(dfab_clk, dfab_a_clk, DAYTONA_FABRIC, NULL);
1354DEFINE_CLK_RPM(ebi1_clk, ebi1_a_clk, EBI1, NULL);
1355DEFINE_CLK_RPM(sfab_clk, sfab_a_clk, SYSTEM_FABRIC, NULL);
1356DEFINE_CLK_RPM(sfpb_clk, sfpb_a_clk, SFPB, NULL);
1357
1358static DEFINE_CLK_VOTER(dfab_usb_hs_clk, &dfab_clk.c);
1359static DEFINE_CLK_VOTER(dfab_sdc1_clk, &dfab_clk.c);
1360static DEFINE_CLK_VOTER(dfab_sdc2_clk, &dfab_clk.c);
1361static DEFINE_CLK_VOTER(dfab_sps_clk, &dfab_clk.c);
Vikram Mulukutlacfd73ad2011-11-09 11:39:34 -08001362static DEFINE_CLK_VOTER(dfab_bam_dmux_clk, &dfab_clk.c);
Vikram Mulukutla73d42112011-09-19 16:32:54 -07001363static DEFINE_CLK_VOTER(ebi1_msmbus_clk, &ebi1_clk.c);
Stephen Boyd4bc7c9b2012-03-07 16:06:21 -08001364static DEFINE_CLK_VOTER(ebi1_adm_clk, &ebi1_clk.c);
Vikram Mulukutla489e39e2011-08-31 18:04:05 -07001365
1366#ifdef CONFIG_DEBUG_FS
1367struct measure_sel {
1368 u32 test_vector;
1369 struct clk *clk;
1370};
1371
Vikram Mulukutlaefd64f52012-01-09 17:41:09 -08001372static DEFINE_CLK_MEASURE(q6sw_clk);
1373static DEFINE_CLK_MEASURE(q6fw_clk);
1374static DEFINE_CLK_MEASURE(q6_func_clk);
1375
Vikram Mulukutla489e39e2011-08-31 18:04:05 -07001376static struct measure_sel measure_mux[] = {
1377 { TEST_PER_LS(0x08), &slimbus_xo_src_clk.c },
1378 { TEST_PER_LS(0x12), &sdc1_p_clk.c },
1379 { TEST_PER_LS(0x13), &sdc1_clk.c },
1380 { TEST_PER_LS(0x14), &sdc2_p_clk.c },
1381 { TEST_PER_LS(0x15), &sdc2_clk.c },
Matt Wagantall7625a4c2011-11-01 16:17:53 -07001382 { TEST_PER_LS(0x1F), &gp0_clk.c },
1383 { TEST_PER_LS(0x20), &gp1_clk.c },
1384 { TEST_PER_LS(0x21), &gp2_clk.c },
Vikram Mulukutla489e39e2011-08-31 18:04:05 -07001385 { TEST_PER_LS(0x26), &pmem_clk.c },
Vikram Mulukutla73d42112011-09-19 16:32:54 -07001386 { TEST_PER_LS(0x25), &dfab_clk.c },
1387 { TEST_PER_LS(0x25), &dfab_a_clk.c },
Vikram Mulukutla489e39e2011-08-31 18:04:05 -07001388 { TEST_PER_LS(0x32), &dma_bam_p_clk.c },
Vikram Mulukutla73d42112011-09-19 16:32:54 -07001389 { TEST_PER_LS(0x33), &cfpb_clk.c },
1390 { TEST_PER_LS(0x33), &cfpb_a_clk.c },
Vikram Mulukutla489e39e2011-08-31 18:04:05 -07001391 { TEST_PER_LS(0x3E), &gsbi1_uart_clk.c },
1392 { TEST_PER_LS(0x3F), &gsbi1_qup_clk.c },
1393 { TEST_PER_LS(0x41), &gsbi2_p_clk.c },
1394 { TEST_PER_LS(0x42), &gsbi2_uart_clk.c },
1395 { TEST_PER_LS(0x44), &gsbi2_qup_clk.c },
1396 { TEST_PER_LS(0x45), &gsbi3_p_clk.c },
1397 { TEST_PER_LS(0x46), &gsbi3_uart_clk.c },
1398 { TEST_PER_LS(0x48), &gsbi3_qup_clk.c },
1399 { TEST_PER_LS(0x49), &gsbi4_p_clk.c },
1400 { TEST_PER_LS(0x4A), &gsbi4_uart_clk.c },
1401 { TEST_PER_LS(0x4C), &gsbi4_qup_clk.c },
1402 { TEST_PER_LS(0x4D), &gsbi5_p_clk.c },
1403 { TEST_PER_LS(0x4E), &gsbi5_uart_clk.c },
1404 { TEST_PER_LS(0x50), &gsbi5_qup_clk.c },
Vikram Mulukutla73d42112011-09-19 16:32:54 -07001405 { TEST_PER_LS(0x78), &sfpb_clk.c },
1406 { TEST_PER_LS(0x78), &sfpb_a_clk.c },
Vikram Mulukutla489e39e2011-08-31 18:04:05 -07001407 { TEST_PER_LS(0x7A), &pmic_ssbi2_clk.c },
1408 { TEST_PER_LS(0x7B), &pmic_arb0_p_clk.c },
1409 { TEST_PER_LS(0x7C), &pmic_arb1_p_clk.c },
1410 { TEST_PER_LS(0x7D), &prng_clk.c },
1411 { TEST_PER_LS(0x7F), &rpm_msg_ram_p_clk.c },
1412 { TEST_PER_LS(0x80), &adm0_p_clk.c },
1413 { TEST_PER_LS(0x84), &usb_hs1_p_clk.c },
1414 { TEST_PER_LS(0x85), &usb_hs1_xcvr_clk.c },
1415 { TEST_PER_LS(0x86), &usb_hsic_sys_clk.c },
1416 { TEST_PER_LS(0x87), &usb_hsic_p_clk.c },
1417 { TEST_PER_LS(0x88), &usb_hsic_xcvr_clk.c },
1418 { TEST_PER_LS(0x8B), &usb_hsic_hsio_cal_clk.c },
1419 { TEST_PER_LS(0x8D), &usb_hs1_sys_clk.c },
1420 { TEST_PER_LS(0x92), &ce1_p_clk.c },
Vikram Mulukutla73d42112011-09-19 16:32:54 -07001421 { TEST_PER_HS(0x18), &sfab_clk.c },
1422 { TEST_PER_HS(0x18), &sfab_a_clk.c },
Vikram Mulukutlaefd64f52012-01-09 17:41:09 -08001423 { TEST_PER_HS(0x26), &q6sw_clk },
1424 { TEST_PER_HS(0x27), &q6fw_clk },
Vikram Mulukutla489e39e2011-08-31 18:04:05 -07001425 { TEST_PER_LS(0xA4), &ce1_core_clk.c },
1426 { TEST_PER_HS(0x2A), &adm0_clk.c },
Vikram Mulukutla73d42112011-09-19 16:32:54 -07001427 { TEST_PER_HS(0x34), &ebi1_clk.c },
1428 { TEST_PER_HS(0x34), &ebi1_a_clk.c },
Vikram Mulukutla6c9158f2011-12-08 12:41:20 -08001429 { TEST_PER_HS(0x3E), &usb_hsic_clk.c },
Vikram Mulukutla489e39e2011-08-31 18:04:05 -07001430 { TEST_LPA(0x0F), &mi2s_bit_clk.c },
1431 { TEST_LPA(0x10), &codec_i2s_mic_bit_clk.c },
1432 { TEST_LPA(0x11), &codec_i2s_spkr_bit_clk.c },
1433 { TEST_LPA(0x12), &spare_i2s_mic_bit_clk.c },
1434 { TEST_LPA(0x13), &spare_i2s_spkr_bit_clk.c },
1435 { TEST_LPA(0x14), &pcm_clk.c },
1436 { TEST_LPA(0x1D), &audio_slimbus_clk.c },
Vikram Mulukutlaefd64f52012-01-09 17:41:09 -08001437 { TEST_LPA_HS(0x00), &q6_func_clk },
Vikram Mulukutla489e39e2011-08-31 18:04:05 -07001438};
1439
1440static struct measure_sel *find_measure_sel(struct clk *clk)
1441{
1442 int i;
1443
1444 for (i = 0; i < ARRAY_SIZE(measure_mux); i++)
1445 if (measure_mux[i].clk == clk)
1446 return &measure_mux[i];
1447 return NULL;
1448}
1449
1450static int measure_clk_set_parent(struct clk *c, struct clk *parent)
1451{
1452 int ret = 0;
1453 u32 clk_sel;
1454 struct measure_sel *p;
1455 struct measure_clk *clk = to_measure_clk(c);
1456 unsigned long flags;
1457
1458 if (!parent)
1459 return -EINVAL;
1460
1461 p = find_measure_sel(parent);
1462 if (!p)
1463 return -EINVAL;
1464
1465 spin_lock_irqsave(&local_clock_reg_lock, flags);
1466
1467 /*
1468 * Program the test vector, measurement period (sample_ticks)
1469 * and scaling multiplier.
1470 */
1471 clk->sample_ticks = 0x10000;
1472 clk_sel = p->test_vector & TEST_CLK_SEL_MASK;
1473 clk->multiplier = 1;
1474 switch (p->test_vector >> TEST_TYPE_SHIFT) {
1475 case TEST_TYPE_PER_LS:
1476 writel_relaxed(0x4030D00|BVAL(7, 0, clk_sel), CLK_TEST_REG);
1477 break;
1478 case TEST_TYPE_PER_HS:
1479 writel_relaxed(0x4020000|BVAL(16, 10, clk_sel), CLK_TEST_REG);
1480 break;
1481 case TEST_TYPE_LPA:
1482 writel_relaxed(0x4030D98, CLK_TEST_REG);
1483 writel_relaxed(BVAL(6, 1, clk_sel)|BIT(0),
1484 LCC_CLK_LS_DEBUG_CFG_REG);
1485 break;
Vikram Mulukutlaefd64f52012-01-09 17:41:09 -08001486 case TEST_TYPE_LPA_HS:
1487 writel_relaxed(0x402BC00, CLK_TEST_REG);
1488 writel_relaxed(BVAL(2, 1, clk_sel)|BIT(0),
1489 LCC_CLK_HS_DEBUG_CFG_REG);
1490 break;
Vikram Mulukutla489e39e2011-08-31 18:04:05 -07001491 default:
1492 ret = -EPERM;
1493 }
1494 /* Make sure test vector is set before starting measurements. */
1495 mb();
1496
1497 spin_unlock_irqrestore(&local_clock_reg_lock, flags);
1498
1499 return ret;
1500}
1501
1502/* Sample clock for 'ticks' reference clock ticks. */
Matt Wagantall9de3bfb2011-11-03 20:13:12 -07001503static unsigned long run_measurement(unsigned ticks)
Vikram Mulukutla489e39e2011-08-31 18:04:05 -07001504{
1505 /* Stop counters and set the XO4 counter start value. */
Vikram Mulukutla489e39e2011-08-31 18:04:05 -07001506 writel_relaxed(ticks, RINGOSC_TCXO_CTL_REG);
1507
1508 /* Wait for timer to become ready. */
1509 while ((readl_relaxed(RINGOSC_STATUS_REG) & BIT(25)) != 0)
1510 cpu_relax();
1511
1512 /* Run measurement and wait for completion. */
1513 writel_relaxed(BIT(28)|ticks, RINGOSC_TCXO_CTL_REG);
1514 while ((readl_relaxed(RINGOSC_STATUS_REG) & BIT(25)) == 0)
1515 cpu_relax();
1516
1517 /* Stop counters. */
1518 writel_relaxed(0x0, RINGOSC_TCXO_CTL_REG);
1519
1520 /* Return measured ticks. */
1521 return readl_relaxed(RINGOSC_STATUS_REG) & BM(24, 0);
1522}
1523
1524
1525/* Perform a hardware rate measurement for a given clock.
1526 FOR DEBUG USE ONLY: Measurements take ~15 ms! */
Matt Wagantall9de3bfb2011-11-03 20:13:12 -07001527static unsigned long measure_clk_get_rate(struct clk *c)
Vikram Mulukutla489e39e2011-08-31 18:04:05 -07001528{
1529 unsigned long flags;
1530 u32 pdm_reg_backup, ringosc_reg_backup;
1531 u64 raw_count_short, raw_count_full;
1532 struct measure_clk *clk = to_measure_clk(c);
1533 unsigned ret;
1534
1535 spin_lock_irqsave(&local_clock_reg_lock, flags);
1536
1537 /* Enable CXO/4 and RINGOSC branch and root. */
1538 pdm_reg_backup = readl_relaxed(PDM_CLK_NS_REG);
1539 ringosc_reg_backup = readl_relaxed(RINGOSC_NS_REG);
1540 writel_relaxed(0x2898, PDM_CLK_NS_REG);
1541 writel_relaxed(0xA00, RINGOSC_NS_REG);
1542
1543 /*
1544 * The ring oscillator counter will not reset if the measured clock
1545 * is not running. To detect this, run a short measurement before
1546 * the full measurement. If the raw results of the two are the same
1547 * then the clock must be off.
1548 */
1549
1550 /* Run a short measurement. (~1 ms) */
1551 raw_count_short = run_measurement(0x1000);
1552 /* Run a full measurement. (~14 ms) */
1553 raw_count_full = run_measurement(clk->sample_ticks);
1554
1555 writel_relaxed(ringosc_reg_backup, RINGOSC_NS_REG);
1556 writel_relaxed(pdm_reg_backup, PDM_CLK_NS_REG);
1557
1558 /* Return 0 if the clock is off. */
1559 if (raw_count_full == raw_count_short)
1560 ret = 0;
1561 else {
1562 /* Compute rate in Hz. */
1563 raw_count_full = ((raw_count_full * 10) + 15) * 4800000;
1564 do_div(raw_count_full, ((clk->sample_ticks * 10) + 35));
1565 ret = (raw_count_full * clk->multiplier);
1566 }
1567
1568 /* Route dbg_hs_clk to PLLTEST. 300mV single-ended amplitude. */
1569 writel_relaxed(0x38F8, PLLTEST_PAD_CFG_REG);
1570 spin_unlock_irqrestore(&local_clock_reg_lock, flags);
1571
1572 return ret;
1573}
1574#else /* !CONFIG_DEBUG_FS */
1575static int measure_clk_set_parent(struct clk *clk, struct clk *parent)
1576{
1577 return -EINVAL;
1578}
1579
Matt Wagantall9de3bfb2011-11-03 20:13:12 -07001580static unsigned long measure_clk_get_rate(struct clk *clk)
Vikram Mulukutla489e39e2011-08-31 18:04:05 -07001581{
1582 return 0;
1583}
1584#endif /* CONFIG_DEBUG_FS */
1585
1586static struct clk_ops measure_clk_ops = {
1587 .set_parent = measure_clk_set_parent,
1588 .get_rate = measure_clk_get_rate,
1589 .is_local = local_clk_is_local,
1590};
1591
1592static struct measure_clk measure_clk = {
1593 .c = {
1594 .dbg_name = "measure_clk",
1595 .ops = &measure_clk_ops,
1596 CLK_INIT(measure_clk.c),
1597 },
1598 .multiplier = 1,
1599};
1600
1601static struct clk_lookup msm_clocks_9615[] = {
Stephen Boyd72a80352012-01-26 15:57:38 -08001602 CLK_LOOKUP("xo", cxo_a_clk.c, ""),
Stephen Boyd69d35e32012-02-14 15:33:30 -08001603 CLK_LOOKUP("xo", cxo_clk.c, "BAM_RMNT"),
Stephen Boyd5a190a82012-03-01 14:45:15 -08001604 CLK_LOOKUP("xo", cxo_clk.c, "msm_xo"),
Vikram Mulukutla489e39e2011-08-31 18:04:05 -07001605 CLK_LOOKUP("pll0", pll0_clk.c, NULL),
1606 CLK_LOOKUP("pll8", pll8_clk.c, NULL),
Vikram Mulukutla489e39e2011-08-31 18:04:05 -07001607 CLK_LOOKUP("pll14", pll14_clk.c, NULL),
Vikram Mulukutla31680ae2011-11-04 14:23:55 -07001608
1609 CLK_LOOKUP("pll0", pll0_acpu_clk.c, "acpu"),
1610 CLK_LOOKUP("pll8", pll8_acpu_clk.c, "acpu"),
1611 CLK_LOOKUP("pll9", pll9_acpu_clk.c, "acpu"),
1612
Vikram Mulukutla489e39e2011-08-31 18:04:05 -07001613 CLK_LOOKUP("measure", measure_clk.c, "debug"),
1614
Matt Wagantallb2710b82011-11-16 19:55:17 -08001615 CLK_LOOKUP("bus_clk", sfab_clk.c, "msm_sys_fab"),
1616 CLK_LOOKUP("bus_a_clk", sfab_a_clk.c, "msm_sys_fab"),
1617 CLK_LOOKUP("mem_clk", ebi1_msmbus_clk.c, "msm_bus"),
1618 CLK_LOOKUP("mem_a_clk", ebi1_a_clk.c, "msm_bus"),
1619
1620 CLK_LOOKUP("bus_clk", sfpb_clk.c, NULL),
1621 CLK_LOOKUP("bus_a_clk", sfpb_a_clk.c, NULL),
1622 CLK_LOOKUP("bus_clk", cfpb_clk.c, NULL),
1623 CLK_LOOKUP("bus_a_clk", cfpb_a_clk.c, NULL),
1624 CLK_LOOKUP("ebi1_clk", ebi1_clk.c, NULL),
Vikram Mulukutla73d42112011-09-19 16:32:54 -07001625 CLK_LOOKUP("dfab_clk", dfab_clk.c, NULL),
1626 CLK_LOOKUP("dfab_a_clk", dfab_a_clk.c, NULL),
Vikram Mulukutla489e39e2011-08-31 18:04:05 -07001627
Matt Wagantallc00f95d2012-01-05 14:22:45 -08001628 CLK_LOOKUP("core_clk", gp0_clk.c, ""),
1629 CLK_LOOKUP("core_clk", gp1_clk.c, ""),
1630 CLK_LOOKUP("core_clk", gp2_clk.c, ""),
Matt Wagantall7625a4c2011-11-01 16:17:53 -07001631
Matt Wagantallc00f95d2012-01-05 14:22:45 -08001632 CLK_LOOKUP("core_clk", gsbi3_uart_clk.c, ""),
Vikram Mulukutla489e39e2011-08-31 18:04:05 -07001633 CLK_LOOKUP("core_clk", gsbi4_uart_clk.c, "msm_serial_hsl.0"),
Matt Wagantallc00f95d2012-01-05 14:22:45 -08001634 CLK_LOOKUP("core_clk", gsbi5_uart_clk.c, ""),
Vikram Mulukutla489e39e2011-08-31 18:04:05 -07001635
Harini Jayaraman738c9312011-09-08 15:22:38 -06001636 CLK_LOOKUP("core_clk", gsbi3_qup_clk.c, "spi_qsd.0"),
Matt Wagantallc00f95d2012-01-05 14:22:45 -08001637 CLK_LOOKUP("core_clk", gsbi4_qup_clk.c, ""),
Harini Jayaramaneba52672011-09-08 15:13:00 -06001638 CLK_LOOKUP("core_clk", gsbi5_qup_clk.c, "qup_i2c.0"),
Vikram Mulukutla489e39e2011-08-31 18:04:05 -07001639
Matt Wagantallc00f95d2012-01-05 14:22:45 -08001640 CLK_LOOKUP("core_clk", pdm_clk.c, ""),
Vikram Mulukutladd0a2372011-09-19 15:58:21 -07001641 CLK_LOOKUP("mem_clk", pmem_clk.c, "msm_sps"),
Ramesh Masavarapu5ad37392011-10-10 10:44:10 -07001642 CLK_LOOKUP("core_clk", prng_clk.c, "msm_rng.0"),
Vikram Mulukutla489e39e2011-08-31 18:04:05 -07001643 CLK_LOOKUP("core_clk", sdc1_clk.c, "msm_sdcc.1"),
1644 CLK_LOOKUP("core_clk", sdc2_clk.c, "msm_sdcc.2"),
Matt Wagantallc00f95d2012-01-05 14:22:45 -08001645 CLK_LOOKUP("iface_clk", ce1_p_clk.c, ""),
1646 CLK_LOOKUP("core_clk", ce1_core_clk.c, ""),
Vikram Mulukutla489e39e2011-08-31 18:04:05 -07001647 CLK_LOOKUP("dma_bam_pclk", dma_bam_p_clk.c, NULL),
1648
Harini Jayaraman738c9312011-09-08 15:22:38 -06001649 CLK_LOOKUP("iface_clk", gsbi3_p_clk.c, "spi_qsd.0"),
Vikram Mulukutla489e39e2011-08-31 18:04:05 -07001650 CLK_LOOKUP("iface_clk", gsbi4_p_clk.c, "msm_serial_hsl.0"),
Harini Jayaramaneba52672011-09-08 15:13:00 -06001651 CLK_LOOKUP("iface_clk", gsbi5_p_clk.c, "qup_i2c.0"),
Vikram Mulukutla489e39e2011-08-31 18:04:05 -07001652
Manu Gautam5143b252012-01-05 19:25:23 -08001653 CLK_LOOKUP("iface_clk", usb_hs1_p_clk.c, "msm_otg"),
1654 CLK_LOOKUP("core_clk", usb_hs1_sys_clk.c, "msm_otg"),
1655 CLK_LOOKUP("alt_core_clk", usb_hs1_xcvr_clk.c, "msm_otg"),
1656 CLK_LOOKUP("alt_core_clk", usb_hsic_xcvr_clk.c, "msm_hsic_host"),
1657 CLK_LOOKUP("cal_clk", usb_hsic_hsio_cal_clk.c, "msm_hsic_host"),
1658 CLK_LOOKUP("core_clk", usb_hsic_sys_clk.c, "msm_hsic_host"),
1659 CLK_LOOKUP("iface_clk", usb_hsic_p_clk.c, "msm_hsic_host"),
1660 CLK_LOOKUP("phy_clk", usb_hsic_clk.c, "msm_hsic_host"),
Ofir Cohendf314b42012-01-15 11:59:34 +02001661 CLK_LOOKUP("alt_core_clk", usb_hsic_xcvr_clk.c, "msm_hsic_peripheral"),
1662 CLK_LOOKUP("cal_clk", usb_hsic_hsio_cal_clk.c, "msm_hsic_peripheral"),
1663 CLK_LOOKUP("core_clk", usb_hsic_sys_clk.c, "msm_hsic_peripheral"),
1664 CLK_LOOKUP("iface_clk", usb_hsic_p_clk.c, "msm_hsic_peripheral"),
1665 CLK_LOOKUP("phy_clk", usb_hsic_clk.c, "msm_hsic_peripheral"),
Vikram Mulukutla489e39e2011-08-31 18:04:05 -07001666
1667 CLK_LOOKUP("iface_clk", sdc1_p_clk.c, "msm_sdcc.1"),
1668 CLK_LOOKUP("iface_clk", sdc2_p_clk.c, "msm_sdcc.2"),
1669 CLK_LOOKUP("core_clk", adm0_clk.c, "msm_dmov"),
1670 CLK_LOOKUP("iface_clk", adm0_p_clk.c, "msm_dmov"),
Matt Wagantallc00f95d2012-01-05 14:22:45 -08001671 CLK_LOOKUP("iface_clk", pmic_arb0_p_clk.c, ""),
1672 CLK_LOOKUP("iface_clk", pmic_arb1_p_clk.c, ""),
1673 CLK_LOOKUP("core_clk", pmic_ssbi2_clk.c, ""),
1674 CLK_LOOKUP("mem_clk", rpm_msg_ram_p_clk.c, ""),
Kuirong Wanga9c3acc2012-02-09 17:00:45 -08001675 CLK_LOOKUP("bit_clk", mi2s_bit_clk.c, "msm-dai-q6.6"),
1676 CLK_LOOKUP("osr_clk", mi2s_osr_clk.c, "msm-dai-q6.6"),
Vikram Mulukutla489e39e2011-08-31 18:04:05 -07001677
Kuirong Wanga9c3acc2012-02-09 17:00:45 -08001678 CLK_LOOKUP("bit_clk", codec_i2s_mic_bit_clk.c,
1679 "msm-dai-q6.1"),
1680 CLK_LOOKUP("osr_clk", codec_i2s_mic_osr_clk.c,
1681 "msm-dai-q6.1"),
1682 CLK_LOOKUP("bit_clk", spare_i2s_mic_bit_clk.c,
1683 "msm-dai-q6.5"),
1684 CLK_LOOKUP("osr_clk", spare_i2s_mic_osr_clk.c,
1685 "msm-dai-q6.5"),
1686 CLK_LOOKUP("bit_clk", codec_i2s_spkr_bit_clk.c,
1687 "msm-dai-q6.16384"),
1688 CLK_LOOKUP("osr_clk", codec_i2s_spkr_osr_clk.c,
1689 "msm-dai-q6.16384"),
1690 CLK_LOOKUP("bit_clk", spare_i2s_spkr_bit_clk.c,
1691 "msm-dai-q6.4"),
1692 CLK_LOOKUP("osr_clk", spare_i2s_spkr_osr_clk.c,
1693 "msm-dai-q6.4"),
1694 CLK_LOOKUP("pcm_clk", pcm_clk.c, "msm-dai-q6.2"),
Kiran Kandi5f4ab692012-02-23 11:23:56 -08001695 CLK_LOOKUP("pcm_clk", pcm_clk.c, "msm-dai-q6.3"),
Vikram Mulukutla489e39e2011-08-31 18:04:05 -07001696
1697 CLK_LOOKUP("sps_slimbus_clk", sps_slimbus_clk.c, NULL),
Tianyi Gou44a81b02012-02-06 17:49:07 -08001698 CLK_LOOKUP("core_clk", audio_slimbus_clk.c, "msm_slim_ctrl.1"),
Manu Gautam5143b252012-01-05 19:25:23 -08001699 CLK_LOOKUP("core_clk", dfab_usb_hs_clk.c, "msm_otg"),
Vikram Mulukutla489e39e2011-08-31 18:04:05 -07001700 CLK_LOOKUP("bus_clk", dfab_sdc1_clk.c, "msm_sdcc.1"),
1701 CLK_LOOKUP("bus_clk", dfab_sdc2_clk.c, "msm_sdcc.2"),
1702 CLK_LOOKUP("dfab_clk", dfab_sps_clk.c, "msm_sps"),
Vikram Mulukutlacfd73ad2011-11-09 11:39:34 -08001703 CLK_LOOKUP("bus_clk", dfab_bam_dmux_clk.c, "BAM_RMNT"),
Vikram Mulukutla73d42112011-09-19 16:32:54 -07001704 CLK_LOOKUP("mem_clk", ebi1_adm_clk.c, "msm_dmov"),
Vikram Mulukutla489e39e2011-08-31 18:04:05 -07001705
Ramesh Masavarapufa679d92011-10-13 23:42:59 -07001706 CLK_LOOKUP("iface_clk", ce1_p_clk.c, "qce.0"),
1707 CLK_LOOKUP("iface_clk", ce1_p_clk.c, "qcrypto.0"),
1708 CLK_LOOKUP("core_clk", ce1_core_clk.c, "qce.0"),
1709 CLK_LOOKUP("core_clk", ce1_core_clk.c, "qcrypto.0"),
1710
Vikram Mulukutlaefd64f52012-01-09 17:41:09 -08001711 CLK_LOOKUP("q6sw_clk", q6sw_clk, NULL),
1712 CLK_LOOKUP("q6fw_clk", q6fw_clk, NULL),
1713 CLK_LOOKUP("q6_func_clk", q6_func_clk, NULL),
Vikram Mulukutla489e39e2011-08-31 18:04:05 -07001714};
1715
1716static void set_fsm_mode(void __iomem *mode_reg)
1717{
1718 u32 regval = readl_relaxed(mode_reg);
1719
1720 /* De-assert reset to FSM */
1721 regval &= ~BIT(21);
1722 writel_relaxed(regval, mode_reg);
1723
1724 /* Program bias count */
1725 regval &= ~BM(19, 14);
Vikram Mulukutlad2314f32011-10-14 10:12:02 -07001726 regval |= BVAL(19, 14, 0x1);
Vikram Mulukutla489e39e2011-08-31 18:04:05 -07001727 writel_relaxed(regval, mode_reg);
1728
1729 /* Program lock count */
1730 regval &= ~BM(13, 8);
1731 regval |= BVAL(13, 8, 0x8);
1732 writel_relaxed(regval, mode_reg);
1733
1734 /* Enable PLL FSM voting */
1735 regval |= BIT(20);
1736 writel_relaxed(regval, mode_reg);
1737}
1738
1739/*
1740 * Miscellaneous clock register initializations
1741 */
Matt Wagantallb64888f2012-04-02 21:35:07 -07001742static void __init msm9615_clock_pre_init(void)
Vikram Mulukutla489e39e2011-08-31 18:04:05 -07001743{
Vikram Mulukutla01d06b82012-01-10 14:19:44 -08001744 u32 regval, is_pll_enabled, pll9_lval;
Vikram Mulukutla489e39e2011-08-31 18:04:05 -07001745
Matt Wagantallb64888f2012-04-02 21:35:07 -07001746 vote_vdd_level(&vdd_dig, VDD_DIG_HIGH);
1747
1748 clk_ops_pll.enable = sr_pll_clk_enable;
1749
Vikram Mulukutla489e39e2011-08-31 18:04:05 -07001750 /* Enable PDM CXO source. */
1751 regval = readl_relaxed(PDM_CLK_NS_REG);
1752 writel_relaxed(BIT(13) | regval, PDM_CLK_NS_REG);
1753
1754 /* Check if PLL0 is active */
1755 is_pll_enabled = readl_relaxed(BB_PLL0_STATUS_REG) & BIT(16);
1756
1757 if (!is_pll_enabled) {
1758 writel_relaxed(0xE, BB_PLL0_L_VAL_REG);
1759 writel_relaxed(0x3, BB_PLL0_M_VAL_REG);
1760 writel_relaxed(0x8, BB_PLL0_N_VAL_REG);
1761
1762 regval = readl_relaxed(BB_PLL0_CONFIG_REG);
1763
1764 /* Enable the main output and the MN accumulator */
1765 regval |= BIT(23) | BIT(22);
1766
1767 /* Set pre-divider and post-divider values to 1 and 1 */
1768 regval &= ~BIT(19);
1769 regval &= ~BM(21, 20);
1770
1771 /* Set VCO frequency */
1772 regval &= ~BM(17, 16);
1773
1774 writel_relaxed(regval, BB_PLL0_CONFIG_REG);
1775
1776 /* Enable AUX output */
1777 regval = readl_relaxed(BB_PLL0_TEST_CTL_REG);
1778 regval |= BIT(12);
1779 writel_relaxed(regval, BB_PLL0_TEST_CTL_REG);
1780
1781 set_fsm_mode(BB_PLL0_MODE_REG);
1782 }
1783
Vikram Mulukutla3349d932011-10-12 20:00:34 -07001784 /* Check if PLL14 is enabled in FSM mode */
1785 is_pll_enabled = readl_relaxed(BB_PLL14_STATUS_REG) & BIT(16);
1786
1787 if (!is_pll_enabled) {
1788 writel_relaxed(0x19, BB_PLL14_L_VAL_REG);
1789 writel_relaxed(0x0, BB_PLL14_M_VAL_REG);
1790 writel_relaxed(0x1, BB_PLL14_N_VAL_REG);
1791
1792 regval = readl_relaxed(BB_PLL14_CONFIG_REG);
1793
1794 /* Enable main output and the MN accumulator */
1795 regval |= BIT(23) | BIT(22);
1796
1797 /* Set pre-divider and post-divider values to 1 and 1 */
1798 regval &= ~BIT(19);
1799 regval &= ~BM(21, 20);
1800
1801 /* Set VCO frequency */
1802 regval &= ~BM(17, 16);
1803
1804 writel_relaxed(regval, BB_PLL14_CONFIG_REG);
1805
1806 set_fsm_mode(BB_PLL14_MODE_REG);
1807
1808 } else if (!(readl_relaxed(BB_PLL14_MODE_REG) & BIT(20)))
1809 WARN(1, "PLL14 enabled in non-FSM mode!\n");
1810
Vikram Mulukutla01d06b82012-01-10 14:19:44 -08001811 /* Detect PLL9 rate and fixup structure accordingly */
1812 pll9_lval = readl_relaxed(SC_PLL0_L_VAL_REG);
1813
1814 if (pll9_lval == 0x1C)
Tianyi Gou7949ecb2012-02-14 14:25:32 -08001815 pll9_acpu_clk.c.rate = 550000000;
Vikram Mulukutla01d06b82012-01-10 14:19:44 -08001816
Vikram Mulukutla489e39e2011-08-31 18:04:05 -07001817 /* Enable PLL4 source on the LPASS Primary PLL Mux */
1818 regval = readl_relaxed(LCC_PRI_PLL_CLK_CTL_REG);
1819 writel_relaxed(regval | BIT(0), LCC_PRI_PLL_CLK_CTL_REG);
Vikram Mulukutla0ee27882011-11-15 18:25:04 -08001820
Matt Wagantallbc8c9062012-02-07 12:33:06 -08001821 /*
1822 * Disable hardware clock gating for pmem_clk. Leaving it enabled
1823 * results in the clock staying on.
1824 */
1825 regval = readl_relaxed(PMEM_ACLK_CTL_REG);
Vikram Mulukutla0ee27882011-11-15 18:25:04 -08001826 regval &= ~BIT(6);
Matt Wagantallbc8c9062012-02-07 12:33:06 -08001827 writel_relaxed(regval, PMEM_ACLK_CTL_REG);
Matt Wagantallebbb29f2012-02-13 14:45:46 -08001828
1829 /*
1830 * Disable hardware clock gating for dma_bam_p_clk, which does
1831 * not have working support for the feature.
1832 */
1833 regval = readl_relaxed(DMA_BAM_HCLK_CTL);
1834 regval &= ~BIT(6);
1835 writel_relaxed(regval, DMA_BAM_HCLK_CTL);
Vikram Mulukutla489e39e2011-08-31 18:04:05 -07001836}
1837
Matt Wagantallb64888f2012-04-02 21:35:07 -07001838static void __init msm9615_clock_post_init(void)
Vikram Mulukutla489e39e2011-08-31 18:04:05 -07001839{
Stephen Boyd72a80352012-01-26 15:57:38 -08001840 /* Keep CXO on whenever APPS cpu is active */
1841 clk_prepare_enable(&cxo_a_clk.c);
Vikram Mulukutla489e39e2011-08-31 18:04:05 -07001842
Vikram Mulukutla489e39e2011-08-31 18:04:05 -07001843 /* Initialize rates for clocks that only support one. */
1844 clk_set_rate(&pdm_clk.c, 19200000);
1845 clk_set_rate(&prng_clk.c, 32000000);
1846 clk_set_rate(&usb_hs1_xcvr_clk.c, 60000000);
1847 clk_set_rate(&usb_hs1_sys_clk.c, 60000000);
1848 clk_set_rate(&usb_hsic_xcvr_clk.c, 60000000);
Vikram Mulukutla6c9158f2011-12-08 12:41:20 -08001849 clk_set_rate(&usb_hsic_sys_clk.c, 64000000);
1850 clk_set_rate(&usb_hsic_clk.c, 480000000);
Vikram Mulukutla489e39e2011-08-31 18:04:05 -07001851
1852 /*
1853 * The halt status bits for PDM may be incorrect at boot.
1854 * Toggle these clocks on and off to refresh them.
1855 */
1856 rcg_clk_enable(&pdm_clk.c);
1857 rcg_clk_disable(&pdm_clk.c);
1858}
1859
1860static int __init msm9615_clock_late_init(void)
1861{
Matt Wagantalle18bbc82011-10-06 10:07:28 -07001862 return unvote_vdd_level(&vdd_dig, VDD_DIG_HIGH);
Vikram Mulukutla489e39e2011-08-31 18:04:05 -07001863}
1864
1865struct clock_init_data msm9615_clock_init_data __initdata = {
1866 .table = msm_clocks_9615,
1867 .size = ARRAY_SIZE(msm_clocks_9615),
Matt Wagantallb64888f2012-04-02 21:35:07 -07001868 .pre_init = msm9615_clock_pre_init,
1869 .post_init = msm9615_clock_post_init,
Vikram Mulukutla489e39e2011-08-31 18:04:05 -07001870 .late_init = msm9615_clock_late_init,
1871};