blob: 3f255564562c5e080f74e24cf1828e18cdc7ad4d [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"
Vikram Mulukutla681d8682012-03-09 23:56:20 -080035#include "clock-pll.h"
Vikram Mulukutla489e39e2011-08-31 18:04:05 -070036
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
Stephen Boyd72a80352012-01-26 15:57:38 -0800211DEFINE_CLK_RPM_BRANCH(cxo_clk, cxo_a_clk, CXO, 19200000);
Vikram Mulukutla489e39e2011-08-31 18:04:05 -0700212
Vikram Mulukutla31680ae2011-11-04 14:23:55 -0700213static DEFINE_SPINLOCK(soft_vote_lock);
214
215static int pll_acpu_vote_clk_enable(struct clk *clk)
216{
217 int ret = 0;
218 unsigned long flags;
219 struct pll_vote_clk *pll = to_pll_vote_clk(clk);
220
221 spin_lock_irqsave(&soft_vote_lock, flags);
222
223 if (!*pll->soft_vote)
224 ret = pll_vote_clk_enable(clk);
225 if (ret == 0)
226 *pll->soft_vote |= (pll->soft_vote_mask);
227
228 spin_unlock_irqrestore(&soft_vote_lock, flags);
229 return ret;
230}
231
232static void pll_acpu_vote_clk_disable(struct clk *clk)
233{
234 unsigned long flags;
235 struct pll_vote_clk *pll = to_pll_vote_clk(clk);
236
237 spin_lock_irqsave(&soft_vote_lock, flags);
238
239 *pll->soft_vote &= ~(pll->soft_vote_mask);
240 if (!*pll->soft_vote)
241 pll_vote_clk_disable(clk);
242
243 spin_unlock_irqrestore(&soft_vote_lock, flags);
244}
245
246static struct clk_ops clk_ops_pll_acpu_vote = {
247 .enable = pll_acpu_vote_clk_enable,
248 .disable = pll_acpu_vote_clk_disable,
249 .auto_off = pll_acpu_vote_clk_disable,
250 .is_enabled = pll_vote_clk_is_enabled,
Vikram Mulukutla31680ae2011-11-04 14:23:55 -0700251 .get_parent = pll_vote_clk_get_parent,
Vikram Mulukutla31680ae2011-11-04 14:23:55 -0700252};
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,
Vikram Mulukutla681d8682012-03-09 23:56:20 -0800263 .status_mask = BIT(16),
Vikram Mulukutla489e39e2011-08-31 18:04:05 -0700264 .parent = &cxo_clk.c,
Vikram Mulukutla31680ae2011-11-04 14:23:55 -0700265 .soft_vote = &soft_vote_pll0,
266 .soft_vote_mask = PLL_SOFT_VOTE_PRIMARY,
Vikram Mulukutla489e39e2011-08-31 18:04:05 -0700267 .c = {
268 .dbg_name = "pll0_clk",
Tianyi Gou7949ecb2012-02-14 14:25:32 -0800269 .rate = 276000000,
Vikram Mulukutla31680ae2011-11-04 14:23:55 -0700270 .ops = &clk_ops_pll_acpu_vote,
Vikram Mulukutla489e39e2011-08-31 18:04:05 -0700271 CLK_INIT(pll0_clk.c),
Stephen Boyd3bbf3462012-01-12 00:19:23 -0800272 .warned = true,
Vikram Mulukutla489e39e2011-08-31 18:04:05 -0700273 },
274};
275
Vikram Mulukutla31680ae2011-11-04 14:23:55 -0700276static struct pll_vote_clk pll0_acpu_clk = {
Vikram Mulukutla31680ae2011-11-04 14:23:55 -0700277 .en_reg = BB_PLL_ENA_SC0_REG,
278 .en_mask = BIT(0),
279 .status_reg = BB_PLL0_STATUS_REG,
Vikram Mulukutla681d8682012-03-09 23:56:20 -0800280 .status_mask = BIT(16),
Vikram Mulukutla31680ae2011-11-04 14:23:55 -0700281 .soft_vote = &soft_vote_pll0,
282 .soft_vote_mask = PLL_SOFT_VOTE_ACPU,
283 .c = {
284 .dbg_name = "pll0_acpu_clk",
Tianyi Gou7949ecb2012-02-14 14:25:32 -0800285 .rate = 276000000,
Vikram Mulukutla31680ae2011-11-04 14:23:55 -0700286 .ops = &clk_ops_pll_acpu_vote,
287 CLK_INIT(pll0_acpu_clk.c),
Stephen Boyd3bbf3462012-01-12 00:19:23 -0800288 .warned = true,
Vikram Mulukutla31680ae2011-11-04 14:23:55 -0700289 },
290};
291
Vikram Mulukutla489e39e2011-08-31 18:04:05 -0700292static struct pll_vote_clk pll4_clk = {
Vikram Mulukutla489e39e2011-08-31 18:04:05 -0700293 .en_reg = BB_PLL_ENA_SC0_REG,
294 .en_mask = BIT(4),
295 .status_reg = LCC_PLL0_STATUS_REG,
Vikram Mulukutla681d8682012-03-09 23:56:20 -0800296 .status_mask = BIT(16),
Vikram Mulukutla489e39e2011-08-31 18:04:05 -0700297 .parent = &cxo_clk.c,
298 .c = {
299 .dbg_name = "pll4_clk",
Tianyi Gou7949ecb2012-02-14 14:25:32 -0800300 .rate = 393216000,
Vikram Mulukutla489e39e2011-08-31 18:04:05 -0700301 .ops = &clk_ops_pll_vote,
302 CLK_INIT(pll4_clk.c),
Stephen Boyd3bbf3462012-01-12 00:19:23 -0800303 .warned = true,
Vikram Mulukutla489e39e2011-08-31 18:04:05 -0700304 },
305};
306
Vikram Mulukutla31680ae2011-11-04 14:23:55 -0700307static unsigned int soft_vote_pll8;
308
Vikram Mulukutla489e39e2011-08-31 18:04:05 -0700309static struct pll_vote_clk pll8_clk = {
Vikram Mulukutla489e39e2011-08-31 18:04:05 -0700310 .en_reg = BB_PLL_ENA_SC0_REG,
311 .en_mask = BIT(8),
312 .status_reg = BB_PLL8_STATUS_REG,
Vikram Mulukutla681d8682012-03-09 23:56:20 -0800313 .status_mask = BIT(16),
Vikram Mulukutla489e39e2011-08-31 18:04:05 -0700314 .parent = &cxo_clk.c,
Vikram Mulukutla31680ae2011-11-04 14:23:55 -0700315 .soft_vote = &soft_vote_pll8,
316 .soft_vote_mask = PLL_SOFT_VOTE_PRIMARY,
Vikram Mulukutla489e39e2011-08-31 18:04:05 -0700317 .c = {
318 .dbg_name = "pll8_clk",
Tianyi Gou7949ecb2012-02-14 14:25:32 -0800319 .rate = 384000000,
Vikram Mulukutla31680ae2011-11-04 14:23:55 -0700320 .ops = &clk_ops_pll_acpu_vote,
Vikram Mulukutla489e39e2011-08-31 18:04:05 -0700321 CLK_INIT(pll8_clk.c),
Stephen Boyd3bbf3462012-01-12 00:19:23 -0800322 .warned = true,
Vikram Mulukutla489e39e2011-08-31 18:04:05 -0700323 },
324};
325
Vikram Mulukutla31680ae2011-11-04 14:23:55 -0700326static struct pll_vote_clk pll8_acpu_clk = {
Vikram Mulukutla31680ae2011-11-04 14:23:55 -0700327 .en_reg = BB_PLL_ENA_SC0_REG,
328 .en_mask = BIT(8),
329 .status_reg = BB_PLL8_STATUS_REG,
Vikram Mulukutla681d8682012-03-09 23:56:20 -0800330 .status_mask = BIT(16),
Vikram Mulukutla31680ae2011-11-04 14:23:55 -0700331 .soft_vote = &soft_vote_pll8,
332 .soft_vote_mask = PLL_SOFT_VOTE_ACPU,
333 .c = {
334 .dbg_name = "pll8_acpu_clk",
Tianyi Gou7949ecb2012-02-14 14:25:32 -0800335 .rate = 384000000,
Vikram Mulukutla31680ae2011-11-04 14:23:55 -0700336 .ops = &clk_ops_pll_acpu_vote,
337 CLK_INIT(pll8_acpu_clk.c),
Stephen Boyd3bbf3462012-01-12 00:19:23 -0800338 .warned = true,
Vikram Mulukutla31680ae2011-11-04 14:23:55 -0700339 },
340};
341
Vikram Mulukutla266551f2012-01-11 12:32:58 -0800342static struct pll_clk pll9_acpu_clk = {
Vikram Mulukutla266551f2012-01-11 12:32:58 -0800343 .mode_reg = SC_PLL0_MODE_REG,
Vikram Mulukutla31680ae2011-11-04 14:23:55 -0700344 .c = {
345 .dbg_name = "pll9_acpu_clk",
Tianyi Gou7949ecb2012-02-14 14:25:32 -0800346 .rate = 440000000,
Vikram Mulukutla681d8682012-03-09 23:56:20 -0800347 .ops = &clk_ops_local_pll,
Vikram Mulukutla31680ae2011-11-04 14:23:55 -0700348 CLK_INIT(pll9_acpu_clk.c),
Stephen Boyd3bbf3462012-01-12 00:19:23 -0800349 .warned = true,
Vikram Mulukutla31680ae2011-11-04 14:23:55 -0700350 },
351};
352
Vikram Mulukutla489e39e2011-08-31 18:04:05 -0700353static struct pll_vote_clk pll14_clk = {
Vikram Mulukutla489e39e2011-08-31 18:04:05 -0700354 .en_reg = BB_PLL_ENA_SC0_REG,
355 .en_mask = BIT(11),
356 .status_reg = BB_PLL14_STATUS_REG,
Vikram Mulukutla681d8682012-03-09 23:56:20 -0800357 .status_mask = BIT(16),
Vikram Mulukutla489e39e2011-08-31 18:04:05 -0700358 .parent = &cxo_clk.c,
359 .c = {
360 .dbg_name = "pll14_clk",
Tianyi Gou7949ecb2012-02-14 14:25:32 -0800361 .rate = 480000000,
Vikram Mulukutla489e39e2011-08-31 18:04:05 -0700362 .ops = &clk_ops_pll_vote,
363 CLK_INIT(pll14_clk.c),
Stephen Boyd3bbf3462012-01-12 00:19:23 -0800364 .warned = true,
Vikram Mulukutla489e39e2011-08-31 18:04:05 -0700365 },
366};
367
Vikram Mulukutla489e39e2011-08-31 18:04:05 -0700368static struct clk_ops clk_ops_rcg_9615 = {
369 .enable = rcg_clk_enable,
370 .disable = rcg_clk_disable,
Matt Wagantall41af0772011-09-17 12:21:39 -0700371 .auto_off = rcg_clk_disable,
Matt Wagantallbc8c9062012-02-07 12:33:06 -0800372 .enable_hwcg = rcg_clk_enable_hwcg,
373 .disable_hwcg = rcg_clk_disable_hwcg,
374 .in_hwcg_mode = rcg_clk_in_hwcg_mode,
375 .handoff = rcg_clk_handoff,
Vikram Mulukutla489e39e2011-08-31 18:04:05 -0700376 .set_rate = rcg_clk_set_rate,
Vikram Mulukutla489e39e2011-08-31 18:04:05 -0700377 .list_rate = rcg_clk_list_rate,
378 .is_enabled = rcg_clk_is_enabled,
379 .round_rate = rcg_clk_round_rate,
Stephen Boyd7bf28142011-12-07 00:30:52 -0800380 .reset = rcg_clk_reset,
Vikram Mulukutla489e39e2011-08-31 18:04:05 -0700381 .get_parent = rcg_clk_get_parent,
382};
383
384static struct clk_ops clk_ops_branch = {
385 .enable = branch_clk_enable,
386 .disable = branch_clk_disable,
Matt Wagantall41af0772011-09-17 12:21:39 -0700387 .auto_off = branch_clk_disable,
Matt Wagantallbc8c9062012-02-07 12:33:06 -0800388 .enable_hwcg = branch_clk_enable_hwcg,
389 .disable_hwcg = branch_clk_disable_hwcg,
390 .in_hwcg_mode = branch_clk_in_hwcg_mode,
391 .handoff = branch_clk_handoff,
Vikram Mulukutla489e39e2011-08-31 18:04:05 -0700392 .is_enabled = branch_clk_is_enabled,
393 .reset = branch_clk_reset,
Vikram Mulukutla489e39e2011-08-31 18:04:05 -0700394 .get_parent = branch_clk_get_parent,
Vikram Mulukutla489e39e2011-08-31 18:04:05 -0700395};
396
397/*
398 * Peripheral Clocks
399 */
Matt Wagantall7625a4c2011-11-01 16:17:53 -0700400#define CLK_GP(i, n, h_r, h_b) \
401 struct rcg_clk i##_clk = { \
402 .b = { \
403 .ctl_reg = GPn_NS_REG(n), \
404 .en_mask = BIT(9), \
405 .halt_reg = h_r, \
406 .halt_bit = h_b, \
407 }, \
408 .ns_reg = GPn_NS_REG(n), \
409 .md_reg = GPn_MD_REG(n), \
410 .root_en_mask = BIT(11), \
411 .ns_mask = (BM(23, 16) | BM(6, 0)), \
Matt Wagantall07c45472012-02-10 23:27:24 -0800412 .mnd_en_mask = BIT(8), \
Matt Wagantall7625a4c2011-11-01 16:17:53 -0700413 .set_rate = set_rate_mnd, \
414 .freq_tbl = clk_tbl_gp, \
415 .current_freq = &rcg_dummy_freq, \
416 .c = { \
417 .dbg_name = #i "_clk", \
418 .ops = &clk_ops_rcg_9615, \
419 VDD_DIG_FMAX_MAP1(LOW, 27000000), \
420 CLK_INIT(i##_clk.c), \
421 }, \
422 }
423#define F_GP(f, s, d, m, n) \
424 { \
425 .freq_hz = f, \
426 .src_clk = &s##_clk.c, \
427 .md_val = MD8(16, m, 0, n), \
428 .ns_val = NS(23, 16, n, m, 5, 4, 3, d, 2, 0, s##_to_bb_mux), \
Matt Wagantall7625a4c2011-11-01 16:17:53 -0700429 }
430static struct clk_freq_tbl clk_tbl_gp[] = {
431 F_GP( 0, gnd, 1, 0, 0),
432 F_GP( 9600000, cxo, 2, 0, 0),
433 F_GP( 19200000, cxo, 1, 0, 0),
434 F_END
435};
436
437static CLK_GP(gp0, 0, CLK_HALT_SFPB_MISC_STATE_REG, 7);
438static CLK_GP(gp1, 1, CLK_HALT_SFPB_MISC_STATE_REG, 6);
439static CLK_GP(gp2, 2, CLK_HALT_SFPB_MISC_STATE_REG, 5);
440
Vikram Mulukutla489e39e2011-08-31 18:04:05 -0700441#define CLK_GSBI_UART(i, n, h_r, h_b) \
442 struct rcg_clk i##_clk = { \
443 .b = { \
444 .ctl_reg = GSBIn_UART_APPS_NS_REG(n), \
445 .en_mask = BIT(9), \
446 .reset_reg = GSBIn_RESET_REG(n), \
447 .reset_mask = BIT(0), \
448 .halt_reg = h_r, \
449 .halt_bit = h_b, \
450 }, \
451 .ns_reg = GSBIn_UART_APPS_NS_REG(n), \
452 .md_reg = GSBIn_UART_APPS_MD_REG(n), \
453 .root_en_mask = BIT(11), \
454 .ns_mask = (BM(31, 16) | BM(6, 0)), \
Matt Wagantall07c45472012-02-10 23:27:24 -0800455 .mnd_en_mask = BIT(8), \
Vikram Mulukutla489e39e2011-08-31 18:04:05 -0700456 .set_rate = set_rate_mnd, \
457 .freq_tbl = clk_tbl_gsbi_uart, \
458 .current_freq = &rcg_dummy_freq, \
459 .c = { \
460 .dbg_name = #i "_clk", \
461 .ops = &clk_ops_rcg_9615, \
Matt Wagantalle18bbc82011-10-06 10:07:28 -0700462 VDD_DIG_FMAX_MAP2(LOW, 32000000, NOMINAL, 64000000), \
Vikram Mulukutla489e39e2011-08-31 18:04:05 -0700463 CLK_INIT(i##_clk.c), \
464 }, \
465 }
Matt Wagantalle18bbc82011-10-06 10:07:28 -0700466#define F_GSBI_UART(f, s, d, m, n) \
Vikram Mulukutla489e39e2011-08-31 18:04:05 -0700467 { \
468 .freq_hz = f, \
469 .src_clk = &s##_clk.c, \
470 .md_val = MD16(m, n), \
471 .ns_val = NS(31, 16, n, m, 5, 4, 3, d, 2, 0, s##_to_bb_mux), \
Vikram Mulukutla489e39e2011-08-31 18:04:05 -0700472 }
473static struct clk_freq_tbl clk_tbl_gsbi_uart[] = {
Matt Wagantalle18bbc82011-10-06 10:07:28 -0700474 F_GSBI_UART( 0, gnd, 1, 0, 0),
Matt Wagantall9a561f72012-01-19 16:13:12 -0800475 F_GSBI_UART( 3686400, pll8, 2, 12, 625),
476 F_GSBI_UART( 7372800, pll8, 2, 24, 625),
477 F_GSBI_UART(14745600, pll8, 2, 48, 625),
Matt Wagantalle18bbc82011-10-06 10:07:28 -0700478 F_GSBI_UART(16000000, pll8, 4, 1, 6),
479 F_GSBI_UART(24000000, pll8, 4, 1, 4),
480 F_GSBI_UART(32000000, pll8, 4, 1, 3),
481 F_GSBI_UART(40000000, pll8, 1, 5, 48),
482 F_GSBI_UART(46400000, pll8, 1, 29, 240),
483 F_GSBI_UART(48000000, pll8, 4, 1, 2),
484 F_GSBI_UART(51200000, pll8, 1, 2, 15),
485 F_GSBI_UART(56000000, pll8, 1, 7, 48),
486 F_GSBI_UART(58982400, pll8, 1, 96, 625),
487 F_GSBI_UART(64000000, pll8, 2, 1, 3),
Vikram Mulukutla489e39e2011-08-31 18:04:05 -0700488 F_END
489};
490
491static CLK_GSBI_UART(gsbi1_uart, 1, CLK_HALT_CFPB_STATEA_REG, 10);
492static CLK_GSBI_UART(gsbi2_uart, 2, CLK_HALT_CFPB_STATEA_REG, 6);
493static CLK_GSBI_UART(gsbi3_uart, 3, CLK_HALT_CFPB_STATEA_REG, 2);
494static CLK_GSBI_UART(gsbi4_uart, 4, CLK_HALT_CFPB_STATEB_REG, 26);
495static CLK_GSBI_UART(gsbi5_uart, 5, CLK_HALT_CFPB_STATEB_REG, 22);
496
497#define CLK_GSBI_QUP(i, n, h_r, h_b) \
498 struct rcg_clk i##_clk = { \
499 .b = { \
500 .ctl_reg = GSBIn_QUP_APPS_NS_REG(n), \
501 .en_mask = BIT(9), \
502 .reset_reg = GSBIn_RESET_REG(n), \
503 .reset_mask = BIT(0), \
504 .halt_reg = h_r, \
505 .halt_bit = h_b, \
506 }, \
507 .ns_reg = GSBIn_QUP_APPS_NS_REG(n), \
508 .md_reg = GSBIn_QUP_APPS_MD_REG(n), \
509 .root_en_mask = BIT(11), \
510 .ns_mask = (BM(23, 16) | BM(6, 0)), \
Matt Wagantall07c45472012-02-10 23:27:24 -0800511 .mnd_en_mask = BIT(8), \
Vikram Mulukutla489e39e2011-08-31 18:04:05 -0700512 .set_rate = set_rate_mnd, \
513 .freq_tbl = clk_tbl_gsbi_qup, \
514 .current_freq = &rcg_dummy_freq, \
515 .c = { \
516 .dbg_name = #i "_clk", \
517 .ops = &clk_ops_rcg_9615, \
Matt Wagantalle18bbc82011-10-06 10:07:28 -0700518 VDD_DIG_FMAX_MAP2(LOW, 24000000, NOMINAL, 52000000), \
Vikram Mulukutla489e39e2011-08-31 18:04:05 -0700519 CLK_INIT(i##_clk.c), \
520 }, \
521 }
Matt Wagantalle18bbc82011-10-06 10:07:28 -0700522#define F_GSBI_QUP(f, s, d, m, n) \
Vikram Mulukutla489e39e2011-08-31 18:04:05 -0700523 { \
524 .freq_hz = f, \
525 .src_clk = &s##_clk.c, \
526 .md_val = MD8(16, m, 0, n), \
527 .ns_val = NS(23, 16, n, m, 5, 4, 3, d, 2, 0, s##_to_bb_mux), \
Vikram Mulukutla489e39e2011-08-31 18:04:05 -0700528 }
529static struct clk_freq_tbl clk_tbl_gsbi_qup[] = {
Matt Wagantalle18bbc82011-10-06 10:07:28 -0700530 F_GSBI_QUP( 0, gnd, 1, 0, 0),
531 F_GSBI_QUP( 960000, cxo, 4, 1, 5),
532 F_GSBI_QUP( 4800000, cxo, 4, 0, 1),
533 F_GSBI_QUP( 9600000, cxo, 2, 0, 1),
534 F_GSBI_QUP(15058800, pll8, 1, 2, 51),
535 F_GSBI_QUP(24000000, pll8, 4, 1, 4),
536 F_GSBI_QUP(25600000, pll8, 1, 1, 15),
537 F_GSBI_QUP(48000000, pll8, 4, 1, 2),
538 F_GSBI_QUP(51200000, pll8, 1, 2, 15),
Vikram Mulukutla489e39e2011-08-31 18:04:05 -0700539 F_END
540};
541
542static CLK_GSBI_QUP(gsbi1_qup, 1, CLK_HALT_CFPB_STATEA_REG, 9);
543static CLK_GSBI_QUP(gsbi2_qup, 2, CLK_HALT_CFPB_STATEA_REG, 4);
544static CLK_GSBI_QUP(gsbi3_qup, 3, CLK_HALT_CFPB_STATEA_REG, 0);
545static CLK_GSBI_QUP(gsbi4_qup, 4, CLK_HALT_CFPB_STATEB_REG, 24);
546static CLK_GSBI_QUP(gsbi5_qup, 5, CLK_HALT_CFPB_STATEB_REG, 20);
547
Matt Wagantalle18bbc82011-10-06 10:07:28 -0700548#define F_PDM(f, s, d) \
Vikram Mulukutla489e39e2011-08-31 18:04:05 -0700549 { \
550 .freq_hz = f, \
551 .src_clk = &s##_clk.c, \
552 .ns_val = NS_SRC_SEL(1, 0, s##_to_xo_mux), \
Vikram Mulukutla489e39e2011-08-31 18:04:05 -0700553 }
554static struct clk_freq_tbl clk_tbl_pdm[] = {
Matt Wagantalle18bbc82011-10-06 10:07:28 -0700555 F_PDM( 0, gnd, 1),
556 F_PDM(19200000, cxo, 1),
Vikram Mulukutla489e39e2011-08-31 18:04:05 -0700557 F_END
558};
559
560static struct rcg_clk pdm_clk = {
561 .b = {
562 .ctl_reg = PDM_CLK_NS_REG,
563 .en_mask = BIT(9),
564 .reset_reg = PDM_CLK_NS_REG,
565 .reset_mask = BIT(12),
566 .halt_reg = CLK_HALT_CFPB_STATEC_REG,
567 .halt_bit = 3,
568 },
569 .ns_reg = PDM_CLK_NS_REG,
570 .root_en_mask = BIT(11),
571 .ns_mask = BM(1, 0),
572 .set_rate = set_rate_nop,
573 .freq_tbl = clk_tbl_pdm,
574 .current_freq = &rcg_dummy_freq,
575 .c = {
576 .dbg_name = "pdm_clk",
577 .ops = &clk_ops_rcg_9615,
Matt Wagantalle18bbc82011-10-06 10:07:28 -0700578 VDD_DIG_FMAX_MAP1(LOW, 19200000),
Vikram Mulukutla489e39e2011-08-31 18:04:05 -0700579 CLK_INIT(pdm_clk.c),
580 },
581};
582
583static struct branch_clk pmem_clk = {
584 .b = {
585 .ctl_reg = PMEM_ACLK_CTL_REG,
586 .en_mask = BIT(4),
Matt Wagantallbc8c9062012-02-07 12:33:06 -0800587 .hwcg_reg = PMEM_ACLK_CTL_REG,
588 .hwcg_mask = BIT(6),
Vikram Mulukutla489e39e2011-08-31 18:04:05 -0700589 .halt_reg = CLK_HALT_DFAB_STATE_REG,
590 .halt_bit = 20,
591 },
592 .c = {
593 .dbg_name = "pmem_clk",
594 .ops = &clk_ops_branch,
595 CLK_INIT(pmem_clk.c),
596 },
597};
598
Matt Wagantalle18bbc82011-10-06 10:07:28 -0700599#define F_PRNG(f, s) \
Vikram Mulukutla489e39e2011-08-31 18:04:05 -0700600 { \
601 .freq_hz = f, \
602 .src_clk = &s##_clk.c, \
Vikram Mulukutla489e39e2011-08-31 18:04:05 -0700603 }
604static struct clk_freq_tbl clk_tbl_prng[] = {
Matt Wagantalle18bbc82011-10-06 10:07:28 -0700605 F_PRNG(32000000, pll8),
Vikram Mulukutla489e39e2011-08-31 18:04:05 -0700606 F_END
607};
608
609static struct rcg_clk prng_clk = {
610 .b = {
611 .ctl_reg = SC0_U_CLK_BRANCH_ENA_VOTE_REG,
612 .en_mask = BIT(10),
613 .halt_reg = CLK_HALT_SFPB_MISC_STATE_REG,
614 .halt_check = HALT_VOTED,
615 .halt_bit = 10,
616 },
617 .set_rate = set_rate_nop,
618 .freq_tbl = clk_tbl_prng,
619 .current_freq = &rcg_dummy_freq,
620 .c = {
621 .dbg_name = "prng_clk",
622 .ops = &clk_ops_rcg_9615,
Matt Wagantalle18bbc82011-10-06 10:07:28 -0700623 VDD_DIG_FMAX_MAP2(LOW, 32000000, NOMINAL, 65000000),
Vikram Mulukutla489e39e2011-08-31 18:04:05 -0700624 CLK_INIT(prng_clk.c),
625 },
626};
627
628#define CLK_SDC(name, n, h_b, f_table) \
629 struct rcg_clk name = { \
630 .b = { \
631 .ctl_reg = SDCn_APPS_CLK_NS_REG(n), \
632 .en_mask = BIT(9), \
633 .reset_reg = SDCn_RESET_REG(n), \
634 .reset_mask = BIT(0), \
635 .halt_reg = CLK_HALT_DFAB_STATE_REG, \
636 .halt_bit = h_b, \
637 }, \
638 .ns_reg = SDCn_APPS_CLK_NS_REG(n), \
639 .md_reg = SDCn_APPS_CLK_MD_REG(n), \
640 .root_en_mask = BIT(11), \
641 .ns_mask = (BM(23, 16) | BM(6, 0)), \
Matt Wagantall07c45472012-02-10 23:27:24 -0800642 .mnd_en_mask = BIT(8), \
Vikram Mulukutla489e39e2011-08-31 18:04:05 -0700643 .set_rate = set_rate_mnd, \
644 .freq_tbl = f_table, \
645 .current_freq = &rcg_dummy_freq, \
646 .c = { \
647 .dbg_name = #name, \
648 .ops = &clk_ops_rcg_9615, \
Vikram Mulukutla2d0f6432011-11-07 20:22:08 -0800649 VDD_DIG_FMAX_MAP2(LOW, 26000000, NOMINAL, 52000000), \
Vikram Mulukutla489e39e2011-08-31 18:04:05 -0700650 CLK_INIT(name.c), \
651 }, \
652 }
Matt Wagantalle18bbc82011-10-06 10:07:28 -0700653#define F_SDC(f, s, d, m, n) \
Vikram Mulukutla489e39e2011-08-31 18:04:05 -0700654 { \
655 .freq_hz = f, \
656 .src_clk = &s##_clk.c, \
657 .md_val = MD8(16, m, 0, n), \
658 .ns_val = NS(23, 16, n, m, 5, 4, 3, d, 2, 0, s##_to_bb_mux), \
Vikram Mulukutla489e39e2011-08-31 18:04:05 -0700659 }
660static struct clk_freq_tbl clk_tbl_sdc1_2[] = {
Matt Wagantalle18bbc82011-10-06 10:07:28 -0700661 F_SDC( 0, gnd, 1, 0, 0),
662 F_SDC( 144300, cxo, 1, 1, 133),
663 F_SDC( 400000, pll8, 4, 1, 240),
664 F_SDC( 16000000, pll8, 4, 1, 6),
665 F_SDC( 17070000, pll8, 1, 2, 45),
666 F_SDC( 20210000, pll8, 1, 1, 19),
667 F_SDC( 24000000, pll8, 4, 1, 4),
Vikram Mulukutla2d0f6432011-11-07 20:22:08 -0800668 F_SDC( 38400000, pll8, 2, 1, 5),
Matt Wagantalle18bbc82011-10-06 10:07:28 -0700669 F_SDC( 48000000, pll8, 4, 1, 2),
Vikram Mulukutla2d0f6432011-11-07 20:22:08 -0800670 F_SDC( 64000000, pll8, 3, 1, 2),
671 F_SDC( 76800000, pll8, 1, 1, 5),
Vikram Mulukutla489e39e2011-08-31 18:04:05 -0700672 F_END
673};
674
675static CLK_SDC(sdc1_clk, 1, 6, clk_tbl_sdc1_2);
676static CLK_SDC(sdc2_clk, 2, 5, clk_tbl_sdc1_2);
677
Matt Wagantalle18bbc82011-10-06 10:07:28 -0700678#define F_USB(f, s, d, m, n) \
Vikram Mulukutla489e39e2011-08-31 18:04:05 -0700679 { \
680 .freq_hz = f, \
681 .src_clk = &s##_clk.c, \
682 .md_val = MD8(16, m, 0, n), \
683 .ns_val = NS(23, 16, n, m, 5, 4, 3, d, 2, 0, s##_to_bb_mux), \
Vikram Mulukutla489e39e2011-08-31 18:04:05 -0700684 }
685static struct clk_freq_tbl clk_tbl_usb[] = {
Matt Wagantalle18bbc82011-10-06 10:07:28 -0700686 F_USB( 0, gnd, 1, 0, 0),
687 F_USB(60000000, pll8, 1, 5, 32),
Vikram Mulukutla489e39e2011-08-31 18:04:05 -0700688 F_END
689};
690
Vikram Mulukutla6c9158f2011-12-08 12:41:20 -0800691static struct clk_freq_tbl clk_tbl_usb_hsic_sys[] = {
692 F_USB( 0, gnd, 1, 0, 0),
693 F_USB(64000000, pll8, 1, 1, 6),
694 F_END
695};
696
Vikram Mulukutla489e39e2011-08-31 18:04:05 -0700697static struct rcg_clk usb_hs1_xcvr_clk = {
698 .b = {
699 .ctl_reg = USB_HS1_XCVR_FS_CLK_NS_REG,
700 .en_mask = BIT(9),
701 .reset_reg = USB_HS1_RESET_REG,
702 .reset_mask = BIT(0),
703 .halt_reg = CLK_HALT_DFAB_STATE_REG,
704 .halt_bit = 0,
705 },
706 .ns_reg = USB_HS1_XCVR_FS_CLK_NS_REG,
707 .md_reg = USB_HS1_XCVR_FS_CLK_MD_REG,
708 .root_en_mask = BIT(11),
709 .ns_mask = (BM(23, 16) | BM(6, 0)),
Matt Wagantall07c45472012-02-10 23:27:24 -0800710 .mnd_en_mask = BIT(8),
Vikram Mulukutla489e39e2011-08-31 18:04:05 -0700711 .set_rate = set_rate_mnd,
712 .freq_tbl = clk_tbl_usb,
713 .current_freq = &rcg_dummy_freq,
714 .c = {
715 .dbg_name = "usb_hs1_xcvr_clk",
716 .ops = &clk_ops_rcg_9615,
Matt Wagantalle18bbc82011-10-06 10:07:28 -0700717 VDD_DIG_FMAX_MAP1(NOMINAL, 60000000),
Vikram Mulukutla489e39e2011-08-31 18:04:05 -0700718 CLK_INIT(usb_hs1_xcvr_clk.c),
719 },
720};
721
722static struct rcg_clk usb_hs1_sys_clk = {
723 .b = {
724 .ctl_reg = USB_HS1_SYS_CLK_NS_REG,
725 .en_mask = BIT(9),
726 .reset_reg = USB_HS1_RESET_REG,
727 .reset_mask = BIT(0),
728 .halt_reg = CLK_HALT_DFAB_STATE_REG,
729 .halt_bit = 4,
730 },
731 .ns_reg = USB_HS1_SYS_CLK_NS_REG,
732 .md_reg = USB_HS1_SYS_CLK_MD_REG,
733 .root_en_mask = BIT(11),
734 .ns_mask = (BM(23, 16) | BM(6, 0)),
Matt Wagantall07c45472012-02-10 23:27:24 -0800735 .mnd_en_mask = BIT(8),
Vikram Mulukutla489e39e2011-08-31 18:04:05 -0700736 .set_rate = set_rate_mnd,
737 .freq_tbl = clk_tbl_usb,
738 .current_freq = &rcg_dummy_freq,
739 .c = {
740 .dbg_name = "usb_hs1_sys_clk",
741 .ops = &clk_ops_rcg_9615,
Matt Wagantalle18bbc82011-10-06 10:07:28 -0700742 VDD_DIG_FMAX_MAP1(NOMINAL, 60000000),
Vikram Mulukutla489e39e2011-08-31 18:04:05 -0700743 CLK_INIT(usb_hs1_sys_clk.c),
744 },
745};
746
747static struct rcg_clk usb_hsic_xcvr_clk = {
748 .b = {
749 .ctl_reg = USB_HSIC_XCVR_FS_CLK_NS_REG,
750 .en_mask = BIT(9),
751 .reset_reg = USB_HSIC_RESET_REG,
752 .reset_mask = BIT(0),
753 .halt_reg = CLK_HALT_DFAB_STATE_REG,
754 .halt_bit = 9,
755 },
756 .ns_reg = USB_HSIC_XCVR_FS_CLK_NS_REG,
757 .md_reg = USB_HSIC_XCVR_FS_CLK_MD_REG,
758 .root_en_mask = BIT(11),
759 .ns_mask = (BM(23, 16) | BM(6, 0)),
Matt Wagantall07c45472012-02-10 23:27:24 -0800760 .mnd_en_mask = BIT(8),
Vikram Mulukutla489e39e2011-08-31 18:04:05 -0700761 .set_rate = set_rate_mnd,
762 .freq_tbl = clk_tbl_usb,
763 .current_freq = &rcg_dummy_freq,
764 .c = {
765 .dbg_name = "usb_hsic_xcvr_clk",
766 .ops = &clk_ops_rcg_9615,
Vikram Mulukutla6c9158f2011-12-08 12:41:20 -0800767 VDD_DIG_FMAX_MAP1(LOW, 60000000),
Vikram Mulukutla489e39e2011-08-31 18:04:05 -0700768 CLK_INIT(usb_hsic_xcvr_clk.c),
769 },
770};
771
772static struct rcg_clk usb_hsic_sys_clk = {
773 .b = {
774 .ctl_reg = USB_HSIC_SYSTEM_CLK_NS_REG,
775 .en_mask = BIT(9),
776 .reset_reg = USB_HSIC_RESET_REG,
777 .reset_mask = BIT(0),
778 .halt_reg = CLK_HALT_DFAB_STATE_REG,
779 .halt_bit = 7,
780 },
781 .ns_reg = USB_HSIC_SYSTEM_CLK_NS_REG,
782 .md_reg = USB_HSIC_SYSTEM_CLK_MD_REG,
783 .root_en_mask = BIT(11),
784 .ns_mask = (BM(23, 16) | BM(6, 0)),
Matt Wagantall07c45472012-02-10 23:27:24 -0800785 .mnd_en_mask = BIT(8),
Vikram Mulukutla489e39e2011-08-31 18:04:05 -0700786 .set_rate = set_rate_mnd,
Vikram Mulukutla6c9158f2011-12-08 12:41:20 -0800787 .freq_tbl = clk_tbl_usb_hsic_sys,
Vikram Mulukutla489e39e2011-08-31 18:04:05 -0700788 .current_freq = &rcg_dummy_freq,
789 .c = {
790 .dbg_name = "usb_hsic_sys_clk",
791 .ops = &clk_ops_rcg_9615,
Vikram Mulukutla6c9158f2011-12-08 12:41:20 -0800792 VDD_DIG_FMAX_MAP1(LOW, 64000000),
Vikram Mulukutla489e39e2011-08-31 18:04:05 -0700793 CLK_INIT(usb_hsic_sys_clk.c),
794 },
795};
796
797static struct clk_freq_tbl clk_tbl_usb_hsic[] = {
Matt Wagantalle18bbc82011-10-06 10:07:28 -0700798 F_USB( 0, gnd, 1, 0, 0),
Vikram Mulukutla6c9158f2011-12-08 12:41:20 -0800799 F_USB(480000000, pll14, 1, 0, 0),
Vikram Mulukutla489e39e2011-08-31 18:04:05 -0700800 F_END
801};
802
803static struct rcg_clk usb_hsic_clk = {
804 .b = {
805 .ctl_reg = USB_HSIC_CLK_NS_REG,
806 .en_mask = BIT(9),
807 .reset_reg = USB_HSIC_RESET_REG,
808 .reset_mask = BIT(0),
Vikram Mulukutla6c9158f2011-12-08 12:41:20 -0800809 .halt_check = DELAY,
Vikram Mulukutla489e39e2011-08-31 18:04:05 -0700810 },
811 .ns_reg = USB_HSIC_CLK_NS_REG,
812 .md_reg = USB_HSIC_CLK_MD_REG,
813 .root_en_mask = BIT(11),
814 .ns_mask = (BM(23, 16) | BM(6, 0)),
815 .set_rate = set_rate_mnd,
816 .freq_tbl = clk_tbl_usb_hsic,
817 .current_freq = &rcg_dummy_freq,
818 .c = {
819 .dbg_name = "usb_hsic_clk",
820 .ops = &clk_ops_rcg_9615,
Vikram Mulukutla6c9158f2011-12-08 12:41:20 -0800821 VDD_DIG_FMAX_MAP1(LOW, 480000000),
Vikram Mulukutla489e39e2011-08-31 18:04:05 -0700822 CLK_INIT(usb_hsic_clk.c),
823 },
824};
825
826static struct branch_clk usb_hsic_hsio_cal_clk = {
827 .b = {
828 .ctl_reg = USB_HSIC_HSIO_CAL_CLK_CTL_REG,
829 .en_mask = BIT(0),
830 .halt_reg = CLK_HALT_DFAB_STATE_REG,
831 .halt_bit = 8,
832 },
833 .parent = &cxo_clk.c,
834 .c = {
835 .dbg_name = "usb_hsic_hsio_cal_clk",
836 .ops = &clk_ops_branch,
837 CLK_INIT(usb_hsic_hsio_cal_clk.c),
838 },
839};
840
841/* Fast Peripheral Bus Clocks */
842static struct branch_clk ce1_core_clk = {
843 .b = {
844 .ctl_reg = CE1_CORE_CLK_CTL_REG,
845 .en_mask = BIT(4),
Matt Wagantallbc8c9062012-02-07 12:33:06 -0800846 .hwcg_reg = CE1_CORE_CLK_CTL_REG,
847 .hwcg_mask = BIT(6),
Vikram Mulukutla489e39e2011-08-31 18:04:05 -0700848 .halt_reg = CLK_HALT_CFPB_STATEC_REG,
849 .halt_bit = 27,
850 },
851 .c = {
852 .dbg_name = "ce1_core_clk",
853 .ops = &clk_ops_branch,
854 CLK_INIT(ce1_core_clk.c),
855 },
856};
857static struct branch_clk ce1_p_clk = {
858 .b = {
859 .ctl_reg = CE1_HCLK_CTL_REG,
860 .en_mask = BIT(4),
861 .halt_reg = CLK_HALT_CFPB_STATEC_REG,
862 .halt_bit = 1,
863 },
864 .c = {
865 .dbg_name = "ce1_p_clk",
866 .ops = &clk_ops_branch,
867 CLK_INIT(ce1_p_clk.c),
868 },
869};
870
871static struct branch_clk dma_bam_p_clk = {
872 .b = {
873 .ctl_reg = DMA_BAM_HCLK_CTL,
874 .en_mask = BIT(4),
875 .halt_reg = CLK_HALT_DFAB_STATE_REG,
876 .halt_bit = 12,
877 },
878 .c = {
879 .dbg_name = "dma_bam_p_clk",
880 .ops = &clk_ops_branch,
881 CLK_INIT(dma_bam_p_clk.c),
882 },
883};
884
885static struct branch_clk gsbi1_p_clk = {
886 .b = {
887 .ctl_reg = GSBIn_HCLK_CTL_REG(1),
888 .en_mask = BIT(4),
889 .halt_reg = CLK_HALT_CFPB_STATEA_REG,
890 .halt_bit = 11,
891 },
892 .c = {
893 .dbg_name = "gsbi1_p_clk",
894 .ops = &clk_ops_branch,
895 CLK_INIT(gsbi1_p_clk.c),
896 },
897};
898
899static struct branch_clk gsbi2_p_clk = {
900 .b = {
901 .ctl_reg = GSBIn_HCLK_CTL_REG(2),
902 .en_mask = BIT(4),
903 .halt_reg = CLK_HALT_CFPB_STATEA_REG,
904 .halt_bit = 7,
905 },
906 .c = {
907 .dbg_name = "gsbi2_p_clk",
908 .ops = &clk_ops_branch,
909 CLK_INIT(gsbi2_p_clk.c),
910 },
911};
912
913static struct branch_clk gsbi3_p_clk = {
914 .b = {
915 .ctl_reg = GSBIn_HCLK_CTL_REG(3),
916 .en_mask = BIT(4),
917 .halt_reg = CLK_HALT_CFPB_STATEA_REG,
918 .halt_bit = 3,
919 },
920 .c = {
921 .dbg_name = "gsbi3_p_clk",
922 .ops = &clk_ops_branch,
923 CLK_INIT(gsbi3_p_clk.c),
924 },
925};
926
927static struct branch_clk gsbi4_p_clk = {
928 .b = {
929 .ctl_reg = GSBIn_HCLK_CTL_REG(4),
930 .en_mask = BIT(4),
931 .halt_reg = CLK_HALT_CFPB_STATEB_REG,
932 .halt_bit = 27,
933 },
934 .c = {
935 .dbg_name = "gsbi4_p_clk",
936 .ops = &clk_ops_branch,
937 CLK_INIT(gsbi4_p_clk.c),
938 },
939};
940
941static struct branch_clk gsbi5_p_clk = {
942 .b = {
943 .ctl_reg = GSBIn_HCLK_CTL_REG(5),
944 .en_mask = BIT(4),
945 .halt_reg = CLK_HALT_CFPB_STATEB_REG,
946 .halt_bit = 23,
947 },
948 .c = {
949 .dbg_name = "gsbi5_p_clk",
950 .ops = &clk_ops_branch,
951 CLK_INIT(gsbi5_p_clk.c),
952 },
953};
954
955static struct branch_clk usb_hs1_p_clk = {
956 .b = {
957 .ctl_reg = USB_HS1_HCLK_CTL_REG,
958 .en_mask = BIT(4),
Matt Wagantallbc8c9062012-02-07 12:33:06 -0800959 .hwcg_reg = USB_HS1_HCLK_CTL_REG,
960 .hwcg_mask = BIT(6),
Vikram Mulukutla489e39e2011-08-31 18:04:05 -0700961 .halt_reg = CLK_HALT_DFAB_STATE_REG,
962 .halt_bit = 1,
963 },
964 .c = {
965 .dbg_name = "usb_hs1_p_clk",
966 .ops = &clk_ops_branch,
967 CLK_INIT(usb_hs1_p_clk.c),
968 },
969};
970
971static struct branch_clk usb_hsic_p_clk = {
972 .b = {
973 .ctl_reg = USB_HSIC_HCLK_CTL_REG,
974 .en_mask = BIT(4),
Matt Wagantallbc8c9062012-02-07 12:33:06 -0800975 .hwcg_reg = USB_HSIC_HCLK_CTL_REG,
976 .hwcg_mask = BIT(6),
Vikram Mulukutla489e39e2011-08-31 18:04:05 -0700977 .halt_reg = CLK_HALT_DFAB_STATE_REG,
978 .halt_bit = 3,
979 },
980 .c = {
981 .dbg_name = "usb_hsic_p_clk",
982 .ops = &clk_ops_branch,
983 CLK_INIT(usb_hsic_p_clk.c),
984 },
985};
986
987static struct branch_clk sdc1_p_clk = {
988 .b = {
989 .ctl_reg = SDCn_HCLK_CTL_REG(1),
990 .en_mask = BIT(4),
Matt Wagantallbc8c9062012-02-07 12:33:06 -0800991 .hwcg_reg = SDCn_HCLK_CTL_REG(1),
992 .hwcg_mask = BIT(6),
Vikram Mulukutla489e39e2011-08-31 18:04:05 -0700993 .halt_reg = CLK_HALT_DFAB_STATE_REG,
994 .halt_bit = 11,
995 },
996 .c = {
997 .dbg_name = "sdc1_p_clk",
998 .ops = &clk_ops_branch,
999 CLK_INIT(sdc1_p_clk.c),
1000 },
1001};
1002
1003static struct branch_clk sdc2_p_clk = {
1004 .b = {
1005 .ctl_reg = SDCn_HCLK_CTL_REG(2),
1006 .en_mask = BIT(4),
Matt Wagantallbc8c9062012-02-07 12:33:06 -08001007 .hwcg_reg = SDCn_HCLK_CTL_REG(2),
1008 .hwcg_mask = BIT(6),
Vikram Mulukutla489e39e2011-08-31 18:04:05 -07001009 .halt_reg = CLK_HALT_DFAB_STATE_REG,
1010 .halt_bit = 10,
1011 },
1012 .c = {
1013 .dbg_name = "sdc2_p_clk",
1014 .ops = &clk_ops_branch,
1015 CLK_INIT(sdc2_p_clk.c),
1016 },
1017};
1018
1019/* HW-Voteable Clocks */
1020static struct branch_clk adm0_clk = {
1021 .b = {
1022 .ctl_reg = SC0_U_CLK_BRANCH_ENA_VOTE_REG,
1023 .en_mask = BIT(2),
1024 .halt_reg = CLK_HALT_MSS_KPSS_MISC_STATE_REG,
1025 .halt_check = HALT_VOTED,
1026 .halt_bit = 14,
1027 },
1028 .c = {
1029 .dbg_name = "adm0_clk",
1030 .ops = &clk_ops_branch,
1031 CLK_INIT(adm0_clk.c),
1032 },
1033};
1034
1035static struct branch_clk adm0_p_clk = {
1036 .b = {
1037 .ctl_reg = SC0_U_CLK_BRANCH_ENA_VOTE_REG,
1038 .en_mask = BIT(3),
1039 .halt_reg = CLK_HALT_MSS_KPSS_MISC_STATE_REG,
1040 .halt_check = HALT_VOTED,
1041 .halt_bit = 13,
1042 },
1043 .c = {
1044 .dbg_name = "adm0_p_clk",
1045 .ops = &clk_ops_branch,
1046 CLK_INIT(adm0_p_clk.c),
1047 },
1048};
1049
1050static struct branch_clk pmic_arb0_p_clk = {
1051 .b = {
1052 .ctl_reg = SC0_U_CLK_BRANCH_ENA_VOTE_REG,
1053 .en_mask = BIT(8),
1054 .halt_reg = CLK_HALT_SFPB_MISC_STATE_REG,
1055 .halt_check = HALT_VOTED,
1056 .halt_bit = 22,
1057 },
1058 .c = {
1059 .dbg_name = "pmic_arb0_p_clk",
1060 .ops = &clk_ops_branch,
1061 CLK_INIT(pmic_arb0_p_clk.c),
1062 },
1063};
1064
1065static struct branch_clk pmic_arb1_p_clk = {
1066 .b = {
1067 .ctl_reg = SC0_U_CLK_BRANCH_ENA_VOTE_REG,
1068 .en_mask = BIT(9),
1069 .halt_reg = CLK_HALT_SFPB_MISC_STATE_REG,
1070 .halt_check = HALT_VOTED,
1071 .halt_bit = 21,
1072 },
1073 .c = {
1074 .dbg_name = "pmic_arb1_p_clk",
1075 .ops = &clk_ops_branch,
1076 CLK_INIT(pmic_arb1_p_clk.c),
1077 },
1078};
1079
1080static struct branch_clk pmic_ssbi2_clk = {
1081 .b = {
1082 .ctl_reg = SC0_U_CLK_BRANCH_ENA_VOTE_REG,
1083 .en_mask = BIT(7),
1084 .halt_reg = CLK_HALT_SFPB_MISC_STATE_REG,
1085 .halt_check = HALT_VOTED,
1086 .halt_bit = 23,
1087 },
1088 .c = {
1089 .dbg_name = "pmic_ssbi2_clk",
1090 .ops = &clk_ops_branch,
1091 CLK_INIT(pmic_ssbi2_clk.c),
1092 },
1093};
1094
1095static struct branch_clk rpm_msg_ram_p_clk = {
1096 .b = {
1097 .ctl_reg = SC0_U_CLK_BRANCH_ENA_VOTE_REG,
1098 .en_mask = BIT(6),
1099 .halt_reg = CLK_HALT_SFPB_MISC_STATE_REG,
1100 .halt_check = HALT_VOTED,
1101 .halt_bit = 12,
1102 },
1103 .c = {
1104 .dbg_name = "rpm_msg_ram_p_clk",
1105 .ops = &clk_ops_branch,
1106 CLK_INIT(rpm_msg_ram_p_clk.c),
1107 },
1108};
1109
1110/*
1111 * Low Power Audio Clocks
1112 */
Matt Wagantalle18bbc82011-10-06 10:07:28 -07001113#define F_AIF_OSR(f, s, d, m, n) \
Vikram Mulukutla489e39e2011-08-31 18:04:05 -07001114 { \
1115 .freq_hz = f, \
1116 .src_clk = &s##_clk.c, \
1117 .md_val = MD8(8, m, 0, n), \
1118 .ns_val = NS(31, 24, n, m, 5, 4, 3, d, 2, 0, s##_to_lpa_mux), \
Vikram Mulukutla489e39e2011-08-31 18:04:05 -07001119 }
1120static struct clk_freq_tbl clk_tbl_aif_osr[] = {
Matt Wagantalle18bbc82011-10-06 10:07:28 -07001121 F_AIF_OSR( 0, gnd, 1, 0, 0),
1122 F_AIF_OSR( 512000, pll4, 4, 1, 192),
1123 F_AIF_OSR( 768000, pll4, 4, 1, 128),
1124 F_AIF_OSR( 1024000, pll4, 4, 1, 96),
1125 F_AIF_OSR( 1536000, pll4, 4, 1, 64),
1126 F_AIF_OSR( 2048000, pll4, 4, 1, 48),
1127 F_AIF_OSR( 3072000, pll4, 4, 1, 32),
1128 F_AIF_OSR( 4096000, pll4, 4, 1, 24),
1129 F_AIF_OSR( 6144000, pll4, 4, 1, 16),
1130 F_AIF_OSR( 8192000, pll4, 4, 1, 12),
1131 F_AIF_OSR(12288000, pll4, 4, 1, 8),
1132 F_AIF_OSR(24576000, pll4, 4, 1, 4),
Vikram Mulukutla489e39e2011-08-31 18:04:05 -07001133 F_END
1134};
1135
1136#define CLK_AIF_OSR(i, ns, md, h_r) \
1137 struct rcg_clk i##_clk = { \
1138 .b = { \
1139 .ctl_reg = ns, \
1140 .en_mask = BIT(17), \
1141 .reset_reg = ns, \
1142 .reset_mask = BIT(19), \
1143 .halt_reg = h_r, \
1144 .halt_check = ENABLE, \
1145 .halt_bit = 1, \
1146 }, \
1147 .ns_reg = ns, \
1148 .md_reg = md, \
1149 .root_en_mask = BIT(9), \
1150 .ns_mask = (BM(31, 24) | BM(6, 0)), \
Matt Wagantall07c45472012-02-10 23:27:24 -08001151 .mnd_en_mask = BIT(8), \
Vikram Mulukutla489e39e2011-08-31 18:04:05 -07001152 .set_rate = set_rate_mnd, \
1153 .freq_tbl = clk_tbl_aif_osr, \
1154 .current_freq = &rcg_dummy_freq, \
1155 .c = { \
1156 .dbg_name = #i "_clk", \
1157 .ops = &clk_ops_rcg_9615, \
1158 CLK_INIT(i##_clk.c), \
1159 }, \
1160 }
1161#define CLK_AIF_OSR_DIV(i, ns, md, h_r) \
1162 struct rcg_clk i##_clk = { \
1163 .b = { \
1164 .ctl_reg = ns, \
1165 .en_mask = BIT(21), \
1166 .reset_reg = ns, \
1167 .reset_mask = BIT(23), \
1168 .halt_reg = h_r, \
1169 .halt_check = ENABLE, \
1170 .halt_bit = 1, \
1171 }, \
1172 .ns_reg = ns, \
1173 .md_reg = md, \
1174 .root_en_mask = BIT(9), \
1175 .ns_mask = (BM(31, 24) | BM(6, 0)), \
Matt Wagantall07c45472012-02-10 23:27:24 -08001176 .mnd_en_mask = BIT(8), \
Vikram Mulukutla489e39e2011-08-31 18:04:05 -07001177 .set_rate = set_rate_mnd, \
1178 .freq_tbl = clk_tbl_aif_osr, \
1179 .current_freq = &rcg_dummy_freq, \
1180 .c = { \
1181 .dbg_name = #i "_clk", \
1182 .ops = &clk_ops_rcg_9615, \
1183 CLK_INIT(i##_clk.c), \
1184 }, \
1185 }
1186
Vikram Mulukutla489e39e2011-08-31 18:04:05 -07001187#define CLK_AIF_BIT(i, ns, h_r) \
Stephen Boyd9fd19642011-11-16 11:11:09 -08001188 struct cdiv_clk i##_clk = { \
Vikram Mulukutla489e39e2011-08-31 18:04:05 -07001189 .b = { \
1190 .ctl_reg = ns, \
1191 .en_mask = BIT(15), \
1192 .halt_reg = h_r, \
1193 .halt_check = DELAY, \
1194 }, \
1195 .ns_reg = ns, \
Stephen Boyd9fd19642011-11-16 11:11:09 -08001196 .ext_mask = BIT(14), \
1197 .div_offset = 10, \
1198 .max_div = 16, \
Vikram Mulukutla489e39e2011-08-31 18:04:05 -07001199 .c = { \
1200 .dbg_name = #i "_clk", \
Stephen Boyd9fd19642011-11-16 11:11:09 -08001201 .ops = &clk_ops_cdiv, \
Vikram Mulukutla489e39e2011-08-31 18:04:05 -07001202 CLK_INIT(i##_clk.c), \
1203 }, \
1204 }
1205
Vikram Mulukutla489e39e2011-08-31 18:04:05 -07001206#define CLK_AIF_BIT_DIV(i, ns, h_r) \
Stephen Boyd9fd19642011-11-16 11:11:09 -08001207 struct cdiv_clk i##_clk = { \
Vikram Mulukutla489e39e2011-08-31 18:04:05 -07001208 .b = { \
1209 .ctl_reg = ns, \
1210 .en_mask = BIT(19), \
1211 .halt_reg = h_r, \
Stephen Boyd7bb9cf82012-01-25 18:09:01 -08001212 .halt_check = DELAY, \
Vikram Mulukutla489e39e2011-08-31 18:04:05 -07001213 }, \
1214 .ns_reg = ns, \
Stephen Boyd9fd19642011-11-16 11:11:09 -08001215 .ext_mask = BIT(18), \
1216 .div_offset = 10, \
1217 .max_div = 256, \
Vikram Mulukutla489e39e2011-08-31 18:04:05 -07001218 .c = { \
1219 .dbg_name = #i "_clk", \
Stephen Boyd9fd19642011-11-16 11:11:09 -08001220 .ops = &clk_ops_cdiv, \
Vikram Mulukutla489e39e2011-08-31 18:04:05 -07001221 CLK_INIT(i##_clk.c), \
1222 }, \
1223 }
1224
1225static CLK_AIF_OSR(mi2s_osr, LCC_MI2S_NS_REG, LCC_MI2S_MD_REG,
1226 LCC_MI2S_STATUS_REG);
1227static CLK_AIF_BIT(mi2s_bit, LCC_MI2S_NS_REG, LCC_MI2S_STATUS_REG);
1228
1229static CLK_AIF_OSR_DIV(codec_i2s_mic_osr, LCC_CODEC_I2S_MIC_NS_REG,
1230 LCC_CODEC_I2S_MIC_MD_REG, LCC_CODEC_I2S_MIC_STATUS_REG);
1231static CLK_AIF_BIT_DIV(codec_i2s_mic_bit, LCC_CODEC_I2S_MIC_NS_REG,
1232 LCC_CODEC_I2S_MIC_STATUS_REG);
1233
1234static CLK_AIF_OSR_DIV(spare_i2s_mic_osr, LCC_SPARE_I2S_MIC_NS_REG,
1235 LCC_SPARE_I2S_MIC_MD_REG, LCC_SPARE_I2S_MIC_STATUS_REG);
1236static CLK_AIF_BIT_DIV(spare_i2s_mic_bit, LCC_SPARE_I2S_MIC_NS_REG,
1237 LCC_SPARE_I2S_MIC_STATUS_REG);
1238
1239static CLK_AIF_OSR_DIV(codec_i2s_spkr_osr, LCC_CODEC_I2S_SPKR_NS_REG,
1240 LCC_CODEC_I2S_SPKR_MD_REG, LCC_CODEC_I2S_SPKR_STATUS_REG);
1241static CLK_AIF_BIT_DIV(codec_i2s_spkr_bit, LCC_CODEC_I2S_SPKR_NS_REG,
1242 LCC_CODEC_I2S_SPKR_STATUS_REG);
1243
1244static CLK_AIF_OSR_DIV(spare_i2s_spkr_osr, LCC_SPARE_I2S_SPKR_NS_REG,
1245 LCC_SPARE_I2S_SPKR_MD_REG, LCC_SPARE_I2S_SPKR_STATUS_REG);
1246static CLK_AIF_BIT_DIV(spare_i2s_spkr_bit, LCC_SPARE_I2S_SPKR_NS_REG,
1247 LCC_SPARE_I2S_SPKR_STATUS_REG);
1248
Matt Wagantalle18bbc82011-10-06 10:07:28 -07001249#define F_PCM(f, s, d, m, n) \
Vikram Mulukutla489e39e2011-08-31 18:04:05 -07001250 { \
1251 .freq_hz = f, \
1252 .src_clk = &s##_clk.c, \
1253 .md_val = MD16(m, n), \
1254 .ns_val = NS(31, 16, n, m, 5, 4, 3, d, 2, 0, s##_to_lpa_mux), \
Vikram Mulukutla489e39e2011-08-31 18:04:05 -07001255 }
1256static struct clk_freq_tbl clk_tbl_pcm[] = {
Stephen Boyd630f3252012-01-31 00:10:08 -08001257 { .ns_val = BIT(10) /* external input */ },
Matt Wagantalle18bbc82011-10-06 10:07:28 -07001258 F_PCM( 512000, pll4, 4, 1, 192),
1259 F_PCM( 768000, pll4, 4, 1, 128),
1260 F_PCM( 1024000, pll4, 4, 1, 96),
1261 F_PCM( 1536000, pll4, 4, 1, 64),
1262 F_PCM( 2048000, pll4, 4, 1, 48),
1263 F_PCM( 3072000, pll4, 4, 1, 32),
1264 F_PCM( 4096000, pll4, 4, 1, 24),
1265 F_PCM( 6144000, pll4, 4, 1, 16),
1266 F_PCM( 8192000, pll4, 4, 1, 12),
1267 F_PCM(12288000, pll4, 4, 1, 8),
1268 F_PCM(24576000, pll4, 4, 1, 4),
Vikram Mulukutla489e39e2011-08-31 18:04:05 -07001269 F_END
1270};
1271
1272static struct rcg_clk pcm_clk = {
1273 .b = {
1274 .ctl_reg = LCC_PCM_NS_REG,
1275 .en_mask = BIT(11),
1276 .reset_reg = LCC_PCM_NS_REG,
1277 .reset_mask = BIT(13),
1278 .halt_reg = LCC_PCM_STATUS_REG,
1279 .halt_check = ENABLE,
1280 .halt_bit = 0,
1281 },
1282 .ns_reg = LCC_PCM_NS_REG,
1283 .md_reg = LCC_PCM_MD_REG,
1284 .root_en_mask = BIT(9),
Stephen Boyd630f3252012-01-31 00:10:08 -08001285 .ns_mask = BM(31, 16) | BIT(10) | BM(6, 0),
Matt Wagantall07c45472012-02-10 23:27:24 -08001286 .mnd_en_mask = BIT(8),
Vikram Mulukutla489e39e2011-08-31 18:04:05 -07001287 .set_rate = set_rate_mnd,
1288 .freq_tbl = clk_tbl_pcm,
1289 .current_freq = &rcg_dummy_freq,
1290 .c = {
1291 .dbg_name = "pcm_clk",
1292 .ops = &clk_ops_rcg_9615,
Matt Wagantalle18bbc82011-10-06 10:07:28 -07001293 VDD_DIG_FMAX_MAP1(LOW, 24576000),
Vikram Mulukutla489e39e2011-08-31 18:04:05 -07001294 CLK_INIT(pcm_clk.c),
1295 },
1296};
1297
1298static struct rcg_clk audio_slimbus_clk = {
1299 .b = {
1300 .ctl_reg = LCC_SLIMBUS_NS_REG,
1301 .en_mask = BIT(10),
1302 .reset_reg = LCC_AHBEX_BRANCH_CTL_REG,
1303 .reset_mask = BIT(5),
1304 .halt_reg = LCC_SLIMBUS_STATUS_REG,
1305 .halt_check = ENABLE,
1306 .halt_bit = 0,
1307 },
1308 .ns_reg = LCC_SLIMBUS_NS_REG,
1309 .md_reg = LCC_SLIMBUS_MD_REG,
1310 .root_en_mask = BIT(9),
1311 .ns_mask = (BM(31, 24) | BM(6, 0)),
Matt Wagantall07c45472012-02-10 23:27:24 -08001312 .mnd_en_mask = BIT(8),
Vikram Mulukutla489e39e2011-08-31 18:04:05 -07001313 .set_rate = set_rate_mnd,
1314 .freq_tbl = clk_tbl_aif_osr,
1315 .current_freq = &rcg_dummy_freq,
1316 .c = {
1317 .dbg_name = "audio_slimbus_clk",
1318 .ops = &clk_ops_rcg_9615,
Matt Wagantalle18bbc82011-10-06 10:07:28 -07001319 VDD_DIG_FMAX_MAP1(LOW, 24576000),
Vikram Mulukutla489e39e2011-08-31 18:04:05 -07001320 CLK_INIT(audio_slimbus_clk.c),
1321 },
1322};
1323
1324static struct branch_clk sps_slimbus_clk = {
1325 .b = {
1326 .ctl_reg = LCC_SLIMBUS_NS_REG,
1327 .en_mask = BIT(12),
1328 .halt_reg = LCC_SLIMBUS_STATUS_REG,
1329 .halt_check = ENABLE,
1330 .halt_bit = 1,
1331 },
1332 .parent = &audio_slimbus_clk.c,
1333 .c = {
1334 .dbg_name = "sps_slimbus_clk",
1335 .ops = &clk_ops_branch,
1336 CLK_INIT(sps_slimbus_clk.c),
1337 },
1338};
1339
1340static struct branch_clk slimbus_xo_src_clk = {
1341 .b = {
1342 .ctl_reg = SLIMBUS_XO_SRC_CLK_CTL_REG,
1343 .en_mask = BIT(2),
1344 .halt_reg = CLK_HALT_DFAB_STATE_REG,
1345 .halt_bit = 28,
1346 },
1347 .parent = &sps_slimbus_clk.c,
1348 .c = {
1349 .dbg_name = "slimbus_xo_src_clk",
1350 .ops = &clk_ops_branch,
1351 CLK_INIT(slimbus_xo_src_clk.c),
1352 },
1353};
1354
Vikram Mulukutla73d42112011-09-19 16:32:54 -07001355DEFINE_CLK_RPM(cfpb_clk, cfpb_a_clk, CFPB, NULL);
1356DEFINE_CLK_RPM(dfab_clk, dfab_a_clk, DAYTONA_FABRIC, NULL);
1357DEFINE_CLK_RPM(ebi1_clk, ebi1_a_clk, EBI1, NULL);
1358DEFINE_CLK_RPM(sfab_clk, sfab_a_clk, SYSTEM_FABRIC, NULL);
1359DEFINE_CLK_RPM(sfpb_clk, sfpb_a_clk, SFPB, NULL);
1360
Matt Wagantall35e78fc2012-04-05 14:18:44 -07001361static DEFINE_CLK_VOTER(dfab_usb_hs_clk, &dfab_clk.c, 0);
1362static DEFINE_CLK_VOTER(dfab_sdc1_clk, &dfab_clk.c, 0);
1363static DEFINE_CLK_VOTER(dfab_sdc2_clk, &dfab_clk.c, 0);
1364static DEFINE_CLK_VOTER(dfab_sps_clk, &dfab_clk.c, 0);
1365static DEFINE_CLK_VOTER(dfab_bam_dmux_clk, &dfab_clk.c, 0);
1366static DEFINE_CLK_VOTER(dfab_msmbus_clk, &dfab_clk.c, 0);
1367static DEFINE_CLK_VOTER(dfab_msmbus_a_clk, &dfab_a_clk.c, 0);
Matt Wagantall42cd12a2012-03-30 18:02:40 -07001368static DEFINE_CLK_VOTER(ebi1_msmbus_clk, &ebi1_clk.c, LONG_MAX);
Matt Wagantall35e78fc2012-04-05 14:18:44 -07001369static DEFINE_CLK_VOTER(ebi1_adm_clk, &ebi1_clk.c, 0);
Vikram Mulukutla489e39e2011-08-31 18:04:05 -07001370
1371#ifdef CONFIG_DEBUG_FS
1372struct measure_sel {
1373 u32 test_vector;
1374 struct clk *clk;
1375};
1376
Vikram Mulukutlaefd64f52012-01-09 17:41:09 -08001377static DEFINE_CLK_MEASURE(q6sw_clk);
1378static DEFINE_CLK_MEASURE(q6fw_clk);
1379static DEFINE_CLK_MEASURE(q6_func_clk);
1380
Vikram Mulukutla489e39e2011-08-31 18:04:05 -07001381static struct measure_sel measure_mux[] = {
1382 { TEST_PER_LS(0x08), &slimbus_xo_src_clk.c },
1383 { TEST_PER_LS(0x12), &sdc1_p_clk.c },
1384 { TEST_PER_LS(0x13), &sdc1_clk.c },
1385 { TEST_PER_LS(0x14), &sdc2_p_clk.c },
1386 { TEST_PER_LS(0x15), &sdc2_clk.c },
Matt Wagantall7625a4c2011-11-01 16:17:53 -07001387 { TEST_PER_LS(0x1F), &gp0_clk.c },
1388 { TEST_PER_LS(0x20), &gp1_clk.c },
1389 { TEST_PER_LS(0x21), &gp2_clk.c },
Vikram Mulukutla489e39e2011-08-31 18:04:05 -07001390 { TEST_PER_LS(0x26), &pmem_clk.c },
Vikram Mulukutla73d42112011-09-19 16:32:54 -07001391 { TEST_PER_LS(0x25), &dfab_clk.c },
1392 { TEST_PER_LS(0x25), &dfab_a_clk.c },
Vikram Mulukutla489e39e2011-08-31 18:04:05 -07001393 { TEST_PER_LS(0x32), &dma_bam_p_clk.c },
Vikram Mulukutla73d42112011-09-19 16:32:54 -07001394 { TEST_PER_LS(0x33), &cfpb_clk.c },
1395 { TEST_PER_LS(0x33), &cfpb_a_clk.c },
Vikram Mulukutla489e39e2011-08-31 18:04:05 -07001396 { TEST_PER_LS(0x3E), &gsbi1_uart_clk.c },
1397 { TEST_PER_LS(0x3F), &gsbi1_qup_clk.c },
1398 { TEST_PER_LS(0x41), &gsbi2_p_clk.c },
1399 { TEST_PER_LS(0x42), &gsbi2_uart_clk.c },
1400 { TEST_PER_LS(0x44), &gsbi2_qup_clk.c },
1401 { TEST_PER_LS(0x45), &gsbi3_p_clk.c },
1402 { TEST_PER_LS(0x46), &gsbi3_uart_clk.c },
1403 { TEST_PER_LS(0x48), &gsbi3_qup_clk.c },
1404 { TEST_PER_LS(0x49), &gsbi4_p_clk.c },
1405 { TEST_PER_LS(0x4A), &gsbi4_uart_clk.c },
1406 { TEST_PER_LS(0x4C), &gsbi4_qup_clk.c },
1407 { TEST_PER_LS(0x4D), &gsbi5_p_clk.c },
1408 { TEST_PER_LS(0x4E), &gsbi5_uart_clk.c },
1409 { TEST_PER_LS(0x50), &gsbi5_qup_clk.c },
Vikram Mulukutla73d42112011-09-19 16:32:54 -07001410 { TEST_PER_LS(0x78), &sfpb_clk.c },
1411 { TEST_PER_LS(0x78), &sfpb_a_clk.c },
Vikram Mulukutla489e39e2011-08-31 18:04:05 -07001412 { TEST_PER_LS(0x7A), &pmic_ssbi2_clk.c },
1413 { TEST_PER_LS(0x7B), &pmic_arb0_p_clk.c },
1414 { TEST_PER_LS(0x7C), &pmic_arb1_p_clk.c },
1415 { TEST_PER_LS(0x7D), &prng_clk.c },
1416 { TEST_PER_LS(0x7F), &rpm_msg_ram_p_clk.c },
1417 { TEST_PER_LS(0x80), &adm0_p_clk.c },
1418 { TEST_PER_LS(0x84), &usb_hs1_p_clk.c },
1419 { TEST_PER_LS(0x85), &usb_hs1_xcvr_clk.c },
1420 { TEST_PER_LS(0x86), &usb_hsic_sys_clk.c },
1421 { TEST_PER_LS(0x87), &usb_hsic_p_clk.c },
1422 { TEST_PER_LS(0x88), &usb_hsic_xcvr_clk.c },
1423 { TEST_PER_LS(0x8B), &usb_hsic_hsio_cal_clk.c },
1424 { TEST_PER_LS(0x8D), &usb_hs1_sys_clk.c },
1425 { TEST_PER_LS(0x92), &ce1_p_clk.c },
Vikram Mulukutla73d42112011-09-19 16:32:54 -07001426 { TEST_PER_HS(0x18), &sfab_clk.c },
1427 { TEST_PER_HS(0x18), &sfab_a_clk.c },
Vikram Mulukutlaefd64f52012-01-09 17:41:09 -08001428 { TEST_PER_HS(0x26), &q6sw_clk },
1429 { TEST_PER_HS(0x27), &q6fw_clk },
Vikram Mulukutla489e39e2011-08-31 18:04:05 -07001430 { TEST_PER_LS(0xA4), &ce1_core_clk.c },
1431 { TEST_PER_HS(0x2A), &adm0_clk.c },
Vikram Mulukutla73d42112011-09-19 16:32:54 -07001432 { TEST_PER_HS(0x34), &ebi1_clk.c },
1433 { TEST_PER_HS(0x34), &ebi1_a_clk.c },
Vikram Mulukutla6c9158f2011-12-08 12:41:20 -08001434 { TEST_PER_HS(0x3E), &usb_hsic_clk.c },
Vikram Mulukutla489e39e2011-08-31 18:04:05 -07001435 { TEST_LPA(0x0F), &mi2s_bit_clk.c },
1436 { TEST_LPA(0x10), &codec_i2s_mic_bit_clk.c },
1437 { TEST_LPA(0x11), &codec_i2s_spkr_bit_clk.c },
1438 { TEST_LPA(0x12), &spare_i2s_mic_bit_clk.c },
1439 { TEST_LPA(0x13), &spare_i2s_spkr_bit_clk.c },
1440 { TEST_LPA(0x14), &pcm_clk.c },
1441 { TEST_LPA(0x1D), &audio_slimbus_clk.c },
Vikram Mulukutlaefd64f52012-01-09 17:41:09 -08001442 { TEST_LPA_HS(0x00), &q6_func_clk },
Vikram Mulukutla489e39e2011-08-31 18:04:05 -07001443};
1444
1445static struct measure_sel *find_measure_sel(struct clk *clk)
1446{
1447 int i;
1448
1449 for (i = 0; i < ARRAY_SIZE(measure_mux); i++)
1450 if (measure_mux[i].clk == clk)
1451 return &measure_mux[i];
1452 return NULL;
1453}
1454
1455static int measure_clk_set_parent(struct clk *c, struct clk *parent)
1456{
1457 int ret = 0;
1458 u32 clk_sel;
1459 struct measure_sel *p;
1460 struct measure_clk *clk = to_measure_clk(c);
1461 unsigned long flags;
1462
1463 if (!parent)
1464 return -EINVAL;
1465
1466 p = find_measure_sel(parent);
1467 if (!p)
1468 return -EINVAL;
1469
1470 spin_lock_irqsave(&local_clock_reg_lock, flags);
1471
1472 /*
1473 * Program the test vector, measurement period (sample_ticks)
1474 * and scaling multiplier.
1475 */
1476 clk->sample_ticks = 0x10000;
1477 clk_sel = p->test_vector & TEST_CLK_SEL_MASK;
1478 clk->multiplier = 1;
1479 switch (p->test_vector >> TEST_TYPE_SHIFT) {
1480 case TEST_TYPE_PER_LS:
1481 writel_relaxed(0x4030D00|BVAL(7, 0, clk_sel), CLK_TEST_REG);
1482 break;
1483 case TEST_TYPE_PER_HS:
1484 writel_relaxed(0x4020000|BVAL(16, 10, clk_sel), CLK_TEST_REG);
1485 break;
1486 case TEST_TYPE_LPA:
1487 writel_relaxed(0x4030D98, CLK_TEST_REG);
1488 writel_relaxed(BVAL(6, 1, clk_sel)|BIT(0),
1489 LCC_CLK_LS_DEBUG_CFG_REG);
1490 break;
Vikram Mulukutlaefd64f52012-01-09 17:41:09 -08001491 case TEST_TYPE_LPA_HS:
1492 writel_relaxed(0x402BC00, CLK_TEST_REG);
1493 writel_relaxed(BVAL(2, 1, clk_sel)|BIT(0),
1494 LCC_CLK_HS_DEBUG_CFG_REG);
1495 break;
Vikram Mulukutla489e39e2011-08-31 18:04:05 -07001496 default:
1497 ret = -EPERM;
1498 }
1499 /* Make sure test vector is set before starting measurements. */
1500 mb();
1501
1502 spin_unlock_irqrestore(&local_clock_reg_lock, flags);
1503
1504 return ret;
1505}
1506
1507/* Sample clock for 'ticks' reference clock ticks. */
Matt Wagantall9de3bfb2011-11-03 20:13:12 -07001508static unsigned long run_measurement(unsigned ticks)
Vikram Mulukutla489e39e2011-08-31 18:04:05 -07001509{
1510 /* Stop counters and set the XO4 counter start value. */
Vikram Mulukutla489e39e2011-08-31 18:04:05 -07001511 writel_relaxed(ticks, RINGOSC_TCXO_CTL_REG);
1512
1513 /* Wait for timer to become ready. */
1514 while ((readl_relaxed(RINGOSC_STATUS_REG) & BIT(25)) != 0)
1515 cpu_relax();
1516
1517 /* Run measurement and wait for completion. */
1518 writel_relaxed(BIT(28)|ticks, RINGOSC_TCXO_CTL_REG);
1519 while ((readl_relaxed(RINGOSC_STATUS_REG) & BIT(25)) == 0)
1520 cpu_relax();
1521
1522 /* Stop counters. */
1523 writel_relaxed(0x0, RINGOSC_TCXO_CTL_REG);
1524
1525 /* Return measured ticks. */
1526 return readl_relaxed(RINGOSC_STATUS_REG) & BM(24, 0);
1527}
1528
1529
1530/* Perform a hardware rate measurement for a given clock.
1531 FOR DEBUG USE ONLY: Measurements take ~15 ms! */
Matt Wagantall9de3bfb2011-11-03 20:13:12 -07001532static unsigned long measure_clk_get_rate(struct clk *c)
Vikram Mulukutla489e39e2011-08-31 18:04:05 -07001533{
1534 unsigned long flags;
1535 u32 pdm_reg_backup, ringosc_reg_backup;
1536 u64 raw_count_short, raw_count_full;
1537 struct measure_clk *clk = to_measure_clk(c);
1538 unsigned ret;
1539
1540 spin_lock_irqsave(&local_clock_reg_lock, flags);
1541
1542 /* Enable CXO/4 and RINGOSC branch and root. */
1543 pdm_reg_backup = readl_relaxed(PDM_CLK_NS_REG);
1544 ringosc_reg_backup = readl_relaxed(RINGOSC_NS_REG);
1545 writel_relaxed(0x2898, PDM_CLK_NS_REG);
1546 writel_relaxed(0xA00, RINGOSC_NS_REG);
1547
1548 /*
1549 * The ring oscillator counter will not reset if the measured clock
1550 * is not running. To detect this, run a short measurement before
1551 * the full measurement. If the raw results of the two are the same
1552 * then the clock must be off.
1553 */
1554
1555 /* Run a short measurement. (~1 ms) */
1556 raw_count_short = run_measurement(0x1000);
1557 /* Run a full measurement. (~14 ms) */
1558 raw_count_full = run_measurement(clk->sample_ticks);
1559
1560 writel_relaxed(ringosc_reg_backup, RINGOSC_NS_REG);
1561 writel_relaxed(pdm_reg_backup, PDM_CLK_NS_REG);
1562
1563 /* Return 0 if the clock is off. */
1564 if (raw_count_full == raw_count_short)
1565 ret = 0;
1566 else {
1567 /* Compute rate in Hz. */
1568 raw_count_full = ((raw_count_full * 10) + 15) * 4800000;
1569 do_div(raw_count_full, ((clk->sample_ticks * 10) + 35));
1570 ret = (raw_count_full * clk->multiplier);
1571 }
1572
1573 /* Route dbg_hs_clk to PLLTEST. 300mV single-ended amplitude. */
1574 writel_relaxed(0x38F8, PLLTEST_PAD_CFG_REG);
1575 spin_unlock_irqrestore(&local_clock_reg_lock, flags);
1576
1577 return ret;
1578}
1579#else /* !CONFIG_DEBUG_FS */
1580static int measure_clk_set_parent(struct clk *clk, struct clk *parent)
1581{
1582 return -EINVAL;
1583}
1584
Matt Wagantall9de3bfb2011-11-03 20:13:12 -07001585static unsigned long measure_clk_get_rate(struct clk *clk)
Vikram Mulukutla489e39e2011-08-31 18:04:05 -07001586{
1587 return 0;
1588}
1589#endif /* CONFIG_DEBUG_FS */
1590
1591static struct clk_ops measure_clk_ops = {
1592 .set_parent = measure_clk_set_parent,
1593 .get_rate = measure_clk_get_rate,
Vikram Mulukutla489e39e2011-08-31 18:04:05 -07001594};
1595
1596static struct measure_clk measure_clk = {
1597 .c = {
1598 .dbg_name = "measure_clk",
1599 .ops = &measure_clk_ops,
1600 CLK_INIT(measure_clk.c),
1601 },
1602 .multiplier = 1,
1603};
1604
1605static struct clk_lookup msm_clocks_9615[] = {
Stephen Boyd72a80352012-01-26 15:57:38 -08001606 CLK_LOOKUP("xo", cxo_a_clk.c, ""),
Stephen Boyd69d35e32012-02-14 15:33:30 -08001607 CLK_LOOKUP("xo", cxo_clk.c, "BAM_RMNT"),
Stephen Boyd5a190a82012-03-01 14:45:15 -08001608 CLK_LOOKUP("xo", cxo_clk.c, "msm_xo"),
Vikram Mulukutla489e39e2011-08-31 18:04:05 -07001609 CLK_LOOKUP("pll0", pll0_clk.c, NULL),
1610 CLK_LOOKUP("pll8", pll8_clk.c, NULL),
Vikram Mulukutla489e39e2011-08-31 18:04:05 -07001611 CLK_LOOKUP("pll14", pll14_clk.c, NULL),
Vikram Mulukutla31680ae2011-11-04 14:23:55 -07001612
1613 CLK_LOOKUP("pll0", pll0_acpu_clk.c, "acpu"),
1614 CLK_LOOKUP("pll8", pll8_acpu_clk.c, "acpu"),
1615 CLK_LOOKUP("pll9", pll9_acpu_clk.c, "acpu"),
1616
Vikram Mulukutla489e39e2011-08-31 18:04:05 -07001617 CLK_LOOKUP("measure", measure_clk.c, "debug"),
1618
Matt Wagantallb2710b82011-11-16 19:55:17 -08001619 CLK_LOOKUP("bus_clk", sfab_clk.c, "msm_sys_fab"),
1620 CLK_LOOKUP("bus_a_clk", sfab_a_clk.c, "msm_sys_fab"),
1621 CLK_LOOKUP("mem_clk", ebi1_msmbus_clk.c, "msm_bus"),
1622 CLK_LOOKUP("mem_a_clk", ebi1_a_clk.c, "msm_bus"),
Gagan Macbc5f81d2012-04-04 15:03:12 -06001623 CLK_LOOKUP("dfab_clk", dfab_msmbus_clk.c, "msm_bus"),
1624 CLK_LOOKUP("dfab_a_clk", dfab_msmbus_a_clk.c, "msm_bus"),
Matt Wagantallb2710b82011-11-16 19:55:17 -08001625
1626 CLK_LOOKUP("bus_clk", sfpb_clk.c, NULL),
1627 CLK_LOOKUP("bus_a_clk", sfpb_a_clk.c, NULL),
1628 CLK_LOOKUP("bus_clk", cfpb_clk.c, NULL),
1629 CLK_LOOKUP("bus_a_clk", cfpb_a_clk.c, NULL),
1630 CLK_LOOKUP("ebi1_clk", ebi1_clk.c, NULL),
Vikram Mulukutla489e39e2011-08-31 18:04:05 -07001631
Matt Wagantallc00f95d2012-01-05 14:22:45 -08001632 CLK_LOOKUP("core_clk", gp0_clk.c, ""),
1633 CLK_LOOKUP("core_clk", gp1_clk.c, ""),
1634 CLK_LOOKUP("core_clk", gp2_clk.c, ""),
Matt Wagantall7625a4c2011-11-01 16:17:53 -07001635
Matt Wagantallc00f95d2012-01-05 14:22:45 -08001636 CLK_LOOKUP("core_clk", gsbi3_uart_clk.c, ""),
Vikram Mulukutla489e39e2011-08-31 18:04:05 -07001637 CLK_LOOKUP("core_clk", gsbi4_uart_clk.c, "msm_serial_hsl.0"),
Matt Wagantallc00f95d2012-01-05 14:22:45 -08001638 CLK_LOOKUP("core_clk", gsbi5_uart_clk.c, ""),
Vikram Mulukutla489e39e2011-08-31 18:04:05 -07001639
Harini Jayaraman738c9312011-09-08 15:22:38 -06001640 CLK_LOOKUP("core_clk", gsbi3_qup_clk.c, "spi_qsd.0"),
Matt Wagantallc00f95d2012-01-05 14:22:45 -08001641 CLK_LOOKUP("core_clk", gsbi4_qup_clk.c, ""),
Harini Jayaramaneba52672011-09-08 15:13:00 -06001642 CLK_LOOKUP("core_clk", gsbi5_qup_clk.c, "qup_i2c.0"),
Vikram Mulukutla489e39e2011-08-31 18:04:05 -07001643
Matt Wagantallc00f95d2012-01-05 14:22:45 -08001644 CLK_LOOKUP("core_clk", pdm_clk.c, ""),
Vikram Mulukutladd0a2372011-09-19 15:58:21 -07001645 CLK_LOOKUP("mem_clk", pmem_clk.c, "msm_sps"),
Ramesh Masavarapu5ad37392011-10-10 10:44:10 -07001646 CLK_LOOKUP("core_clk", prng_clk.c, "msm_rng.0"),
Vikram Mulukutla489e39e2011-08-31 18:04:05 -07001647 CLK_LOOKUP("core_clk", sdc1_clk.c, "msm_sdcc.1"),
1648 CLK_LOOKUP("core_clk", sdc2_clk.c, "msm_sdcc.2"),
Matt Wagantallc00f95d2012-01-05 14:22:45 -08001649 CLK_LOOKUP("iface_clk", ce1_p_clk.c, ""),
1650 CLK_LOOKUP("core_clk", ce1_core_clk.c, ""),
Vikram Mulukutla489e39e2011-08-31 18:04:05 -07001651 CLK_LOOKUP("dma_bam_pclk", dma_bam_p_clk.c, NULL),
1652
Harini Jayaraman738c9312011-09-08 15:22:38 -06001653 CLK_LOOKUP("iface_clk", gsbi3_p_clk.c, "spi_qsd.0"),
Vikram Mulukutla489e39e2011-08-31 18:04:05 -07001654 CLK_LOOKUP("iface_clk", gsbi4_p_clk.c, "msm_serial_hsl.0"),
Harini Jayaramaneba52672011-09-08 15:13:00 -06001655 CLK_LOOKUP("iface_clk", gsbi5_p_clk.c, "qup_i2c.0"),
Vikram Mulukutla489e39e2011-08-31 18:04:05 -07001656
Manu Gautam5143b252012-01-05 19:25:23 -08001657 CLK_LOOKUP("iface_clk", usb_hs1_p_clk.c, "msm_otg"),
1658 CLK_LOOKUP("core_clk", usb_hs1_sys_clk.c, "msm_otg"),
1659 CLK_LOOKUP("alt_core_clk", usb_hs1_xcvr_clk.c, "msm_otg"),
1660 CLK_LOOKUP("alt_core_clk", usb_hsic_xcvr_clk.c, "msm_hsic_host"),
1661 CLK_LOOKUP("cal_clk", usb_hsic_hsio_cal_clk.c, "msm_hsic_host"),
1662 CLK_LOOKUP("core_clk", usb_hsic_sys_clk.c, "msm_hsic_host"),
1663 CLK_LOOKUP("iface_clk", usb_hsic_p_clk.c, "msm_hsic_host"),
1664 CLK_LOOKUP("phy_clk", usb_hsic_clk.c, "msm_hsic_host"),
Ofir Cohendf314b42012-01-15 11:59:34 +02001665 CLK_LOOKUP("alt_core_clk", usb_hsic_xcvr_clk.c, "msm_hsic_peripheral"),
1666 CLK_LOOKUP("cal_clk", usb_hsic_hsio_cal_clk.c, "msm_hsic_peripheral"),
1667 CLK_LOOKUP("core_clk", usb_hsic_sys_clk.c, "msm_hsic_peripheral"),
1668 CLK_LOOKUP("iface_clk", usb_hsic_p_clk.c, "msm_hsic_peripheral"),
1669 CLK_LOOKUP("phy_clk", usb_hsic_clk.c, "msm_hsic_peripheral"),
Vikram Mulukutla489e39e2011-08-31 18:04:05 -07001670
1671 CLK_LOOKUP("iface_clk", sdc1_p_clk.c, "msm_sdcc.1"),
1672 CLK_LOOKUP("iface_clk", sdc2_p_clk.c, "msm_sdcc.2"),
1673 CLK_LOOKUP("core_clk", adm0_clk.c, "msm_dmov"),
1674 CLK_LOOKUP("iface_clk", adm0_p_clk.c, "msm_dmov"),
Matt Wagantallc00f95d2012-01-05 14:22:45 -08001675 CLK_LOOKUP("iface_clk", pmic_arb0_p_clk.c, ""),
1676 CLK_LOOKUP("iface_clk", pmic_arb1_p_clk.c, ""),
1677 CLK_LOOKUP("core_clk", pmic_ssbi2_clk.c, ""),
1678 CLK_LOOKUP("mem_clk", rpm_msg_ram_p_clk.c, ""),
Kuirong Wanga9c3acc2012-02-09 17:00:45 -08001679 CLK_LOOKUP("bit_clk", mi2s_bit_clk.c, "msm-dai-q6.6"),
1680 CLK_LOOKUP("osr_clk", mi2s_osr_clk.c, "msm-dai-q6.6"),
Vikram Mulukutla489e39e2011-08-31 18:04:05 -07001681
Kuirong Wanga9c3acc2012-02-09 17:00:45 -08001682 CLK_LOOKUP("bit_clk", codec_i2s_mic_bit_clk.c,
1683 "msm-dai-q6.1"),
1684 CLK_LOOKUP("osr_clk", codec_i2s_mic_osr_clk.c,
1685 "msm-dai-q6.1"),
1686 CLK_LOOKUP("bit_clk", spare_i2s_mic_bit_clk.c,
1687 "msm-dai-q6.5"),
1688 CLK_LOOKUP("osr_clk", spare_i2s_mic_osr_clk.c,
1689 "msm-dai-q6.5"),
1690 CLK_LOOKUP("bit_clk", codec_i2s_spkr_bit_clk.c,
1691 "msm-dai-q6.16384"),
1692 CLK_LOOKUP("osr_clk", codec_i2s_spkr_osr_clk.c,
1693 "msm-dai-q6.16384"),
1694 CLK_LOOKUP("bit_clk", spare_i2s_spkr_bit_clk.c,
1695 "msm-dai-q6.4"),
1696 CLK_LOOKUP("osr_clk", spare_i2s_spkr_osr_clk.c,
1697 "msm-dai-q6.4"),
1698 CLK_LOOKUP("pcm_clk", pcm_clk.c, "msm-dai-q6.2"),
Kiran Kandi5f4ab692012-02-23 11:23:56 -08001699 CLK_LOOKUP("pcm_clk", pcm_clk.c, "msm-dai-q6.3"),
Vikram Mulukutla489e39e2011-08-31 18:04:05 -07001700
1701 CLK_LOOKUP("sps_slimbus_clk", sps_slimbus_clk.c, NULL),
Tianyi Gou44a81b02012-02-06 17:49:07 -08001702 CLK_LOOKUP("core_clk", audio_slimbus_clk.c, "msm_slim_ctrl.1"),
Manu Gautam5143b252012-01-05 19:25:23 -08001703 CLK_LOOKUP("core_clk", dfab_usb_hs_clk.c, "msm_otg"),
Vikram Mulukutla489e39e2011-08-31 18:04:05 -07001704 CLK_LOOKUP("bus_clk", dfab_sdc1_clk.c, "msm_sdcc.1"),
1705 CLK_LOOKUP("bus_clk", dfab_sdc2_clk.c, "msm_sdcc.2"),
1706 CLK_LOOKUP("dfab_clk", dfab_sps_clk.c, "msm_sps"),
Vikram Mulukutlacfd73ad2011-11-09 11:39:34 -08001707 CLK_LOOKUP("bus_clk", dfab_bam_dmux_clk.c, "BAM_RMNT"),
Vikram Mulukutla73d42112011-09-19 16:32:54 -07001708 CLK_LOOKUP("mem_clk", ebi1_adm_clk.c, "msm_dmov"),
Vikram Mulukutla489e39e2011-08-31 18:04:05 -07001709
Ramesh Masavarapufa679d92011-10-13 23:42:59 -07001710 CLK_LOOKUP("iface_clk", ce1_p_clk.c, "qce.0"),
1711 CLK_LOOKUP("iface_clk", ce1_p_clk.c, "qcrypto.0"),
1712 CLK_LOOKUP("core_clk", ce1_core_clk.c, "qce.0"),
1713 CLK_LOOKUP("core_clk", ce1_core_clk.c, "qcrypto.0"),
1714
Vikram Mulukutlaefd64f52012-01-09 17:41:09 -08001715 CLK_LOOKUP("q6sw_clk", q6sw_clk, NULL),
1716 CLK_LOOKUP("q6fw_clk", q6fw_clk, NULL),
1717 CLK_LOOKUP("q6_func_clk", q6_func_clk, NULL),
Vikram Mulukutla489e39e2011-08-31 18:04:05 -07001718};
1719
1720static void set_fsm_mode(void __iomem *mode_reg)
1721{
1722 u32 regval = readl_relaxed(mode_reg);
1723
1724 /* De-assert reset to FSM */
1725 regval &= ~BIT(21);
1726 writel_relaxed(regval, mode_reg);
1727
1728 /* Program bias count */
1729 regval &= ~BM(19, 14);
Vikram Mulukutlad2314f32011-10-14 10:12:02 -07001730 regval |= BVAL(19, 14, 0x1);
Vikram Mulukutla489e39e2011-08-31 18:04:05 -07001731 writel_relaxed(regval, mode_reg);
1732
1733 /* Program lock count */
1734 regval &= ~BM(13, 8);
1735 regval |= BVAL(13, 8, 0x8);
1736 writel_relaxed(regval, mode_reg);
1737
1738 /* Enable PLL FSM voting */
1739 regval |= BIT(20);
1740 writel_relaxed(regval, mode_reg);
1741}
1742
1743/*
1744 * Miscellaneous clock register initializations
1745 */
Matt Wagantallb64888f2012-04-02 21:35:07 -07001746static void __init msm9615_clock_pre_init(void)
Vikram Mulukutla489e39e2011-08-31 18:04:05 -07001747{
Vikram Mulukutla01d06b82012-01-10 14:19:44 -08001748 u32 regval, is_pll_enabled, pll9_lval;
Vikram Mulukutla489e39e2011-08-31 18:04:05 -07001749
Matt Wagantallb64888f2012-04-02 21:35:07 -07001750 vote_vdd_level(&vdd_dig, VDD_DIG_HIGH);
1751
Vikram Mulukutla681d8682012-03-09 23:56:20 -08001752 clk_ops_local_pll.enable = sr_pll_clk_enable;
Matt Wagantallb64888f2012-04-02 21:35:07 -07001753
Vikram Mulukutla489e39e2011-08-31 18:04:05 -07001754 /* Enable PDM CXO source. */
1755 regval = readl_relaxed(PDM_CLK_NS_REG);
1756 writel_relaxed(BIT(13) | regval, PDM_CLK_NS_REG);
1757
1758 /* Check if PLL0 is active */
1759 is_pll_enabled = readl_relaxed(BB_PLL0_STATUS_REG) & BIT(16);
1760
1761 if (!is_pll_enabled) {
1762 writel_relaxed(0xE, BB_PLL0_L_VAL_REG);
1763 writel_relaxed(0x3, BB_PLL0_M_VAL_REG);
1764 writel_relaxed(0x8, BB_PLL0_N_VAL_REG);
1765
1766 regval = readl_relaxed(BB_PLL0_CONFIG_REG);
1767
1768 /* Enable the main output and the MN accumulator */
1769 regval |= BIT(23) | BIT(22);
1770
1771 /* Set pre-divider and post-divider values to 1 and 1 */
1772 regval &= ~BIT(19);
1773 regval &= ~BM(21, 20);
1774
1775 /* Set VCO frequency */
1776 regval &= ~BM(17, 16);
1777
1778 writel_relaxed(regval, BB_PLL0_CONFIG_REG);
1779
1780 /* Enable AUX output */
1781 regval = readl_relaxed(BB_PLL0_TEST_CTL_REG);
1782 regval |= BIT(12);
1783 writel_relaxed(regval, BB_PLL0_TEST_CTL_REG);
1784
1785 set_fsm_mode(BB_PLL0_MODE_REG);
1786 }
1787
Vikram Mulukutla3349d932011-10-12 20:00:34 -07001788 /* Check if PLL14 is enabled in FSM mode */
1789 is_pll_enabled = readl_relaxed(BB_PLL14_STATUS_REG) & BIT(16);
1790
1791 if (!is_pll_enabled) {
1792 writel_relaxed(0x19, BB_PLL14_L_VAL_REG);
1793 writel_relaxed(0x0, BB_PLL14_M_VAL_REG);
1794 writel_relaxed(0x1, BB_PLL14_N_VAL_REG);
1795
1796 regval = readl_relaxed(BB_PLL14_CONFIG_REG);
1797
1798 /* Enable main output and the MN accumulator */
1799 regval |= BIT(23) | BIT(22);
1800
1801 /* Set pre-divider and post-divider values to 1 and 1 */
1802 regval &= ~BIT(19);
1803 regval &= ~BM(21, 20);
1804
1805 /* Set VCO frequency */
1806 regval &= ~BM(17, 16);
1807
1808 writel_relaxed(regval, BB_PLL14_CONFIG_REG);
1809
1810 set_fsm_mode(BB_PLL14_MODE_REG);
1811
1812 } else if (!(readl_relaxed(BB_PLL14_MODE_REG) & BIT(20)))
1813 WARN(1, "PLL14 enabled in non-FSM mode!\n");
1814
Vikram Mulukutla01d06b82012-01-10 14:19:44 -08001815 /* Detect PLL9 rate and fixup structure accordingly */
1816 pll9_lval = readl_relaxed(SC_PLL0_L_VAL_REG);
1817
1818 if (pll9_lval == 0x1C)
Tianyi Gou7949ecb2012-02-14 14:25:32 -08001819 pll9_acpu_clk.c.rate = 550000000;
Vikram Mulukutla01d06b82012-01-10 14:19:44 -08001820
Vikram Mulukutla489e39e2011-08-31 18:04:05 -07001821 /* Enable PLL4 source on the LPASS Primary PLL Mux */
1822 regval = readl_relaxed(LCC_PRI_PLL_CLK_CTL_REG);
1823 writel_relaxed(regval | BIT(0), LCC_PRI_PLL_CLK_CTL_REG);
Vikram Mulukutla0ee27882011-11-15 18:25:04 -08001824
Matt Wagantallbc8c9062012-02-07 12:33:06 -08001825 /*
1826 * Disable hardware clock gating for pmem_clk. Leaving it enabled
1827 * results in the clock staying on.
1828 */
1829 regval = readl_relaxed(PMEM_ACLK_CTL_REG);
Vikram Mulukutla0ee27882011-11-15 18:25:04 -08001830 regval &= ~BIT(6);
Matt Wagantallbc8c9062012-02-07 12:33:06 -08001831 writel_relaxed(regval, PMEM_ACLK_CTL_REG);
Matt Wagantallebbb29f2012-02-13 14:45:46 -08001832
1833 /*
1834 * Disable hardware clock gating for dma_bam_p_clk, which does
1835 * not have working support for the feature.
1836 */
1837 regval = readl_relaxed(DMA_BAM_HCLK_CTL);
1838 regval &= ~BIT(6);
1839 writel_relaxed(regval, DMA_BAM_HCLK_CTL);
Vikram Mulukutla489e39e2011-08-31 18:04:05 -07001840}
1841
Matt Wagantallb64888f2012-04-02 21:35:07 -07001842static void __init msm9615_clock_post_init(void)
Vikram Mulukutla489e39e2011-08-31 18:04:05 -07001843{
Stephen Boyd72a80352012-01-26 15:57:38 -08001844 /* Keep CXO on whenever APPS cpu is active */
1845 clk_prepare_enable(&cxo_a_clk.c);
Vikram Mulukutla489e39e2011-08-31 18:04:05 -07001846
Vikram Mulukutla489e39e2011-08-31 18:04:05 -07001847 /* Initialize rates for clocks that only support one. */
1848 clk_set_rate(&pdm_clk.c, 19200000);
1849 clk_set_rate(&prng_clk.c, 32000000);
1850 clk_set_rate(&usb_hs1_xcvr_clk.c, 60000000);
1851 clk_set_rate(&usb_hs1_sys_clk.c, 60000000);
1852 clk_set_rate(&usb_hsic_xcvr_clk.c, 60000000);
Vikram Mulukutla6c9158f2011-12-08 12:41:20 -08001853 clk_set_rate(&usb_hsic_sys_clk.c, 64000000);
1854 clk_set_rate(&usb_hsic_clk.c, 480000000);
Vikram Mulukutla489e39e2011-08-31 18:04:05 -07001855
1856 /*
1857 * The halt status bits for PDM may be incorrect at boot.
1858 * Toggle these clocks on and off to refresh them.
1859 */
1860 rcg_clk_enable(&pdm_clk.c);
1861 rcg_clk_disable(&pdm_clk.c);
1862}
1863
1864static int __init msm9615_clock_late_init(void)
1865{
Matt Wagantalle18bbc82011-10-06 10:07:28 -07001866 return unvote_vdd_level(&vdd_dig, VDD_DIG_HIGH);
Vikram Mulukutla489e39e2011-08-31 18:04:05 -07001867}
1868
1869struct clock_init_data msm9615_clock_init_data __initdata = {
1870 .table = msm_clocks_9615,
1871 .size = ARRAY_SIZE(msm_clocks_9615),
Matt Wagantallb64888f2012-04-02 21:35:07 -07001872 .pre_init = msm9615_clock_pre_init,
1873 .post_init = msm9615_clock_post_init,
Vikram Mulukutla489e39e2011-08-31 18:04:05 -07001874 .late_init = msm9615_clock_late_init,
1875};