blob: ffa8f77e8fddbd1e6433e3eaad0916c65ab4be62 [file] [log] [blame]
Duy Truonge833aca2013-02-12 13:35:08 -08001/* Copyright (c) 2009-2012, The Linux Foundation. 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>
Vikram Mulukutla73d42112011-09-19 16:32:54 -070027#include <mach/rpm-9615.h>
Vikram Mulukutlab5e1cda2011-10-04 16:17:22 -070028#include <mach/rpm-regulator.h>
Vikram Mulukutla489e39e2011-08-31 18:04:05 -070029
Matt Wagantalld55b90f2012-02-23 23:27:44 -080030#include "clock.h"
Vikram Mulukutla489e39e2011-08-31 18:04:05 -070031#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)
Stephen Boyde04f0f72012-05-23 18:34:32 -0700138#define LCC_SEC_PCM_MD_REG REG_LPA(0x00F4)
139#define LCC_SEC_PCM_NS_REG REG_LPA(0x00F0)
140#define LCC_SEC_PCM_STATUS_REG REG_LPA(0x00F8)
Vikram Mulukutla489e39e2011-08-31 18:04:05 -0700141#define LCC_PLL0_STATUS_REG REG_LPA(0x0018)
142#define LCC_SPARE_I2S_MIC_MD_REG REG_LPA(0x007C)
143#define LCC_SPARE_I2S_MIC_NS_REG REG_LPA(0x0078)
144#define LCC_SPARE_I2S_MIC_STATUS_REG REG_LPA(0x0080)
145#define LCC_SPARE_I2S_SPKR_MD_REG REG_LPA(0x0088)
146#define LCC_SPARE_I2S_SPKR_NS_REG REG_LPA(0x0084)
147#define LCC_SPARE_I2S_SPKR_STATUS_REG REG_LPA(0x008C)
148#define LCC_SLIMBUS_NS_REG REG_LPA(0x00CC)
149#define LCC_SLIMBUS_MD_REG REG_LPA(0x00D0)
150#define LCC_SLIMBUS_STATUS_REG REG_LPA(0x00D4)
151#define LCC_AHBEX_BRANCH_CTL_REG REG_LPA(0x00E4)
152#define LCC_PRI_PLL_CLK_CTL_REG REG_LPA(0x00C4)
153
154#define GCC_APCS_CLK_DIAG REG_GCC(0x001C)
155
156/* MUX source input identifiers. */
Vikram Mulukutla128986a2012-07-10 13:32:08 -0700157#define cxo_to_bb_mux 0
158#define pll8_to_bb_mux 3
159#define pll8_activeonly_to_bb_mux 3
160#define pll14_to_bb_mux 4
161#define gnd_to_bb_mux 6
162#define cxo_to_xo_mux 0
163#define gnd_to_xo_mux 3
164#define cxo_to_lpa_mux 1
165#define pll4_to_lpa_mux 2
166#define gnd_to_lpa_mux 6
Vikram Mulukutla489e39e2011-08-31 18:04:05 -0700167
168/* Test Vector Macros */
169#define TEST_TYPE_PER_LS 1
170#define TEST_TYPE_PER_HS 2
171#define TEST_TYPE_LPA 5
Vikram Mulukutlaefd64f52012-01-09 17:41:09 -0800172#define TEST_TYPE_LPA_HS 6
Vikram Mulukutla489e39e2011-08-31 18:04:05 -0700173#define TEST_TYPE_SHIFT 24
174#define TEST_CLK_SEL_MASK BM(23, 0)
175#define TEST_VECTOR(s, t) (((t) << TEST_TYPE_SHIFT) | BVAL(23, 0, (s)))
176#define TEST_PER_LS(s) TEST_VECTOR((s), TEST_TYPE_PER_LS)
177#define TEST_PER_HS(s) TEST_VECTOR((s), TEST_TYPE_PER_HS)
178#define TEST_LPA(s) TEST_VECTOR((s), TEST_TYPE_LPA)
Vikram Mulukutlaefd64f52012-01-09 17:41:09 -0800179#define TEST_LPA_HS(s) TEST_VECTOR((s), TEST_TYPE_LPA_HS)
Vikram Mulukutla489e39e2011-08-31 18:04:05 -0700180
Matt Wagantalle18bbc82011-10-06 10:07:28 -0700181enum vdd_dig_levels {
182 VDD_DIG_NONE,
183 VDD_DIG_LOW,
184 VDD_DIG_NOMINAL,
Saravana Kannan909e78e2012-10-15 22:16:04 -0700185 VDD_DIG_HIGH,
186 VDD_DIG_NUM
Matt Wagantalle18bbc82011-10-06 10:07:28 -0700187};
188
189static int set_vdd_dig(struct clk_vdd_class *vdd_class, int level)
190{
Vikram Mulukutla8c648eb2012-06-01 11:49:35 -0700191 static const int vdd_corner[] = {
192 [VDD_DIG_NONE] = RPM_VREG_CORNER_NONE,
193 [VDD_DIG_LOW] = RPM_VREG_CORNER_LOW,
194 [VDD_DIG_NOMINAL] = RPM_VREG_CORNER_NOMINAL,
195 [VDD_DIG_HIGH] = RPM_VREG_CORNER_HIGH,
Matt Wagantalle18bbc82011-10-06 10:07:28 -0700196 };
197
Vikram Mulukutla8c648eb2012-06-01 11:49:35 -0700198 return rpm_vreg_set_voltage(RPM_VREG_ID_PM8018_VDD_DIG_CORNER,
199 RPM_VREG_VOTER3, vdd_corner[level], RPM_VREG_CORNER_HIGH, 1);
Matt Wagantalle18bbc82011-10-06 10:07:28 -0700200}
201
Saravana Kannan909e78e2012-10-15 22:16:04 -0700202static DEFINE_VDD_CLASS(vdd_dig, set_vdd_dig, VDD_DIG_NUM);
Matt Wagantalle18bbc82011-10-06 10:07:28 -0700203
204#define VDD_DIG_FMAX_MAP1(l1, f1) \
Saravana Kannan909e78e2012-10-15 22:16:04 -0700205 .vdd_class = &vdd_dig, \
206 .fmax = (unsigned long[VDD_DIG_NUM]) { \
207 [VDD_DIG_##l1] = (f1), \
208 }, \
209 .num_fmax = VDD_DIG_NUM
Matt Wagantalle18bbc82011-10-06 10:07:28 -0700210#define VDD_DIG_FMAX_MAP2(l1, f1, l2, f2) \
Saravana Kannan909e78e2012-10-15 22:16:04 -0700211 .vdd_class = &vdd_dig, \
212 .fmax = (unsigned long[VDD_DIG_NUM]) { \
213 [VDD_DIG_##l1] = (f1), \
214 [VDD_DIG_##l2] = (f2), \
215 }, \
216 .num_fmax = VDD_DIG_NUM
Vikram Mulukutla489e39e2011-08-31 18:04:05 -0700217
218/*
219 * Clock Descriptions
220 */
221
Stephen Boyd72a80352012-01-26 15:57:38 -0800222DEFINE_CLK_RPM_BRANCH(cxo_clk, cxo_a_clk, CXO, 19200000);
Vikram Mulukutla489e39e2011-08-31 18:04:05 -0700223
Vikram Mulukutla31680ae2011-11-04 14:23:55 -0700224static DEFINE_SPINLOCK(soft_vote_lock);
225
Matt Wagantallf82f2942012-01-27 13:56:13 -0800226static int pll_acpu_vote_clk_enable(struct clk *c)
Vikram Mulukutla31680ae2011-11-04 14:23:55 -0700227{
228 int ret = 0;
229 unsigned long flags;
Matt Wagantallf82f2942012-01-27 13:56:13 -0800230 struct pll_vote_clk *pllv = to_pll_vote_clk(c);
Vikram Mulukutla31680ae2011-11-04 14:23:55 -0700231
232 spin_lock_irqsave(&soft_vote_lock, flags);
233
Matt Wagantallf82f2942012-01-27 13:56:13 -0800234 if (!*pllv->soft_vote)
235 ret = pll_vote_clk_enable(c);
Vikram Mulukutla31680ae2011-11-04 14:23:55 -0700236 if (ret == 0)
Matt Wagantallf82f2942012-01-27 13:56:13 -0800237 *pllv->soft_vote |= (pllv->soft_vote_mask);
Vikram Mulukutla31680ae2011-11-04 14:23:55 -0700238
239 spin_unlock_irqrestore(&soft_vote_lock, flags);
240 return ret;
241}
242
Matt Wagantallf82f2942012-01-27 13:56:13 -0800243static void pll_acpu_vote_clk_disable(struct clk *c)
Vikram Mulukutla31680ae2011-11-04 14:23:55 -0700244{
245 unsigned long flags;
Matt Wagantallf82f2942012-01-27 13:56:13 -0800246 struct pll_vote_clk *pllv = to_pll_vote_clk(c);
Vikram Mulukutla31680ae2011-11-04 14:23:55 -0700247
248 spin_lock_irqsave(&soft_vote_lock, flags);
249
Matt Wagantallf82f2942012-01-27 13:56:13 -0800250 *pllv->soft_vote &= ~(pllv->soft_vote_mask);
251 if (!*pllv->soft_vote)
252 pll_vote_clk_disable(c);
Vikram Mulukutla31680ae2011-11-04 14:23:55 -0700253
254 spin_unlock_irqrestore(&soft_vote_lock, flags);
255}
256
257static struct clk_ops clk_ops_pll_acpu_vote = {
258 .enable = pll_acpu_vote_clk_enable,
259 .disable = pll_acpu_vote_clk_disable,
Vikram Mulukutla31680ae2011-11-04 14:23:55 -0700260 .is_enabled = pll_vote_clk_is_enabled,
Vikram Mulukutla31680ae2011-11-04 14:23:55 -0700261 .get_parent = pll_vote_clk_get_parent,
Vikram Mulukutla31680ae2011-11-04 14:23:55 -0700262};
263
264#define PLL_SOFT_VOTE_PRIMARY BIT(0)
265#define PLL_SOFT_VOTE_ACPU BIT(1)
266
267static unsigned int soft_vote_pll0;
268
Vikram Mulukutla489e39e2011-08-31 18:04:05 -0700269static struct pll_vote_clk pll0_clk = {
Vikram Mulukutla489e39e2011-08-31 18:04:05 -0700270 .en_reg = BB_PLL_ENA_SC0_REG,
271 .en_mask = BIT(0),
272 .status_reg = BB_PLL0_STATUS_REG,
Vikram Mulukutla681d8682012-03-09 23:56:20 -0800273 .status_mask = BIT(16),
Vikram Mulukutla489e39e2011-08-31 18:04:05 -0700274 .parent = &cxo_clk.c,
Vikram Mulukutla31680ae2011-11-04 14:23:55 -0700275 .soft_vote = &soft_vote_pll0,
276 .soft_vote_mask = PLL_SOFT_VOTE_PRIMARY,
Vikram Mulukutla489e39e2011-08-31 18:04:05 -0700277 .c = {
278 .dbg_name = "pll0_clk",
Tianyi Gou7949ecb2012-02-14 14:25:32 -0800279 .rate = 276000000,
Vikram Mulukutla31680ae2011-11-04 14:23:55 -0700280 .ops = &clk_ops_pll_acpu_vote,
Vikram Mulukutla489e39e2011-08-31 18:04:05 -0700281 CLK_INIT(pll0_clk.c),
282 },
283};
284
Vikram Mulukutla128986a2012-07-10 13:32:08 -0700285static struct pll_vote_clk pll0_activeonly_clk = {
Vikram Mulukutla31680ae2011-11-04 14:23:55 -0700286 .en_reg = BB_PLL_ENA_SC0_REG,
287 .en_mask = BIT(0),
288 .status_reg = BB_PLL0_STATUS_REG,
Vikram Mulukutla681d8682012-03-09 23:56:20 -0800289 .status_mask = BIT(16),
Vikram Mulukutla31680ae2011-11-04 14:23:55 -0700290 .soft_vote = &soft_vote_pll0,
291 .soft_vote_mask = PLL_SOFT_VOTE_ACPU,
292 .c = {
Vikram Mulukutla128986a2012-07-10 13:32:08 -0700293 .dbg_name = "pll0_activeonly_clk",
Tianyi Gou7949ecb2012-02-14 14:25:32 -0800294 .rate = 276000000,
Vikram Mulukutla31680ae2011-11-04 14:23:55 -0700295 .ops = &clk_ops_pll_acpu_vote,
Vikram Mulukutla128986a2012-07-10 13:32:08 -0700296 CLK_INIT(pll0_activeonly_clk.c),
Vikram Mulukutla31680ae2011-11-04 14:23:55 -0700297 },
298};
299
Vikram Mulukutla489e39e2011-08-31 18:04:05 -0700300static struct pll_vote_clk pll4_clk = {
Vikram Mulukutla489e39e2011-08-31 18:04:05 -0700301 .en_reg = BB_PLL_ENA_SC0_REG,
302 .en_mask = BIT(4),
303 .status_reg = LCC_PLL0_STATUS_REG,
Vikram Mulukutla681d8682012-03-09 23:56:20 -0800304 .status_mask = BIT(16),
Vikram Mulukutla489e39e2011-08-31 18:04:05 -0700305 .parent = &cxo_clk.c,
306 .c = {
307 .dbg_name = "pll4_clk",
Tianyi Gou7949ecb2012-02-14 14:25:32 -0800308 .rate = 393216000,
Vikram Mulukutla489e39e2011-08-31 18:04:05 -0700309 .ops = &clk_ops_pll_vote,
310 CLK_INIT(pll4_clk.c),
311 },
312};
313
Vikram Mulukutla31680ae2011-11-04 14:23:55 -0700314static unsigned int soft_vote_pll8;
315
Vikram Mulukutla489e39e2011-08-31 18:04:05 -0700316static struct pll_vote_clk pll8_clk = {
Vikram Mulukutla489e39e2011-08-31 18:04:05 -0700317 .en_reg = BB_PLL_ENA_SC0_REG,
318 .en_mask = BIT(8),
319 .status_reg = BB_PLL8_STATUS_REG,
Vikram Mulukutla681d8682012-03-09 23:56:20 -0800320 .status_mask = BIT(16),
Vikram Mulukutla489e39e2011-08-31 18:04:05 -0700321 .parent = &cxo_clk.c,
Vikram Mulukutla31680ae2011-11-04 14:23:55 -0700322 .soft_vote = &soft_vote_pll8,
323 .soft_vote_mask = PLL_SOFT_VOTE_PRIMARY,
Vikram Mulukutla489e39e2011-08-31 18:04:05 -0700324 .c = {
325 .dbg_name = "pll8_clk",
Tianyi Gou7949ecb2012-02-14 14:25:32 -0800326 .rate = 384000000,
Vikram Mulukutla31680ae2011-11-04 14:23:55 -0700327 .ops = &clk_ops_pll_acpu_vote,
Vikram Mulukutla489e39e2011-08-31 18:04:05 -0700328 CLK_INIT(pll8_clk.c),
329 },
330};
331
Vikram Mulukutla128986a2012-07-10 13:32:08 -0700332static struct pll_vote_clk pll8_activeonly_clk = {
Vikram Mulukutla31680ae2011-11-04 14:23:55 -0700333 .en_reg = BB_PLL_ENA_SC0_REG,
334 .en_mask = BIT(8),
335 .status_reg = BB_PLL8_STATUS_REG,
Vikram Mulukutla681d8682012-03-09 23:56:20 -0800336 .status_mask = BIT(16),
Vikram Mulukutla31680ae2011-11-04 14:23:55 -0700337 .soft_vote = &soft_vote_pll8,
338 .soft_vote_mask = PLL_SOFT_VOTE_ACPU,
339 .c = {
Vikram Mulukutla128986a2012-07-10 13:32:08 -0700340 .dbg_name = "pll8_activeonly_clk",
Tianyi Gou7949ecb2012-02-14 14:25:32 -0800341 .rate = 384000000,
Vikram Mulukutla31680ae2011-11-04 14:23:55 -0700342 .ops = &clk_ops_pll_acpu_vote,
Vikram Mulukutla128986a2012-07-10 13:32:08 -0700343 CLK_INIT(pll8_activeonly_clk.c),
Vikram Mulukutla31680ae2011-11-04 14:23:55 -0700344 },
345};
346
Vikram Mulukutla128986a2012-07-10 13:32:08 -0700347static struct pll_clk pll9_activeonly_clk = {
Vikram Mulukutla266551f2012-01-11 12:32:58 -0800348 .mode_reg = SC_PLL0_MODE_REG,
Vikram Mulukutla31680ae2011-11-04 14:23:55 -0700349 .c = {
Vikram Mulukutla128986a2012-07-10 13:32:08 -0700350 .dbg_name = "pll9_activeonly_clk",
Tianyi Gou7949ecb2012-02-14 14:25:32 -0800351 .rate = 440000000,
Vikram Mulukutla681d8682012-03-09 23:56:20 -0800352 .ops = &clk_ops_local_pll,
Vikram Mulukutla128986a2012-07-10 13:32:08 -0700353 CLK_INIT(pll9_activeonly_clk.c),
Vikram Mulukutla31680ae2011-11-04 14:23:55 -0700354 },
355};
356
Vikram Mulukutla489e39e2011-08-31 18:04:05 -0700357static struct pll_vote_clk pll14_clk = {
Vikram Mulukutla489e39e2011-08-31 18:04:05 -0700358 .en_reg = BB_PLL_ENA_SC0_REG,
359 .en_mask = BIT(11),
360 .status_reg = BB_PLL14_STATUS_REG,
Vikram Mulukutla681d8682012-03-09 23:56:20 -0800361 .status_mask = BIT(16),
Vikram Mulukutla489e39e2011-08-31 18:04:05 -0700362 .parent = &cxo_clk.c,
363 .c = {
364 .dbg_name = "pll14_clk",
Tianyi Gou7949ecb2012-02-14 14:25:32 -0800365 .rate = 480000000,
Vikram Mulukutla489e39e2011-08-31 18:04:05 -0700366 .ops = &clk_ops_pll_vote,
367 CLK_INIT(pll14_clk.c),
368 },
369};
370
Vikram Mulukutla489e39e2011-08-31 18:04:05 -0700371/*
372 * Peripheral Clocks
373 */
Matt Wagantall7625a4c2011-11-01 16:17:53 -0700374#define CLK_GP(i, n, h_r, h_b) \
375 struct rcg_clk i##_clk = { \
376 .b = { \
377 .ctl_reg = GPn_NS_REG(n), \
378 .en_mask = BIT(9), \
379 .halt_reg = h_r, \
380 .halt_bit = h_b, \
381 }, \
382 .ns_reg = GPn_NS_REG(n), \
383 .md_reg = GPn_MD_REG(n), \
384 .root_en_mask = BIT(11), \
385 .ns_mask = (BM(23, 16) | BM(6, 0)), \
Matt Wagantall07c45472012-02-10 23:27:24 -0800386 .mnd_en_mask = BIT(8), \
Matt Wagantall7625a4c2011-11-01 16:17:53 -0700387 .set_rate = set_rate_mnd, \
388 .freq_tbl = clk_tbl_gp, \
389 .current_freq = &rcg_dummy_freq, \
390 .c = { \
391 .dbg_name = #i "_clk", \
Stephen Boyd409b8b42012-04-10 12:12:56 -0700392 .ops = &clk_ops_rcg, \
Matt Wagantall7625a4c2011-11-01 16:17:53 -0700393 VDD_DIG_FMAX_MAP1(LOW, 27000000), \
394 CLK_INIT(i##_clk.c), \
395 }, \
396 }
397#define F_GP(f, s, d, m, n) \
398 { \
399 .freq_hz = f, \
400 .src_clk = &s##_clk.c, \
401 .md_val = MD8(16, m, 0, n), \
402 .ns_val = NS(23, 16, n, m, 5, 4, 3, d, 2, 0, s##_to_bb_mux), \
Matt Wagantall7625a4c2011-11-01 16:17:53 -0700403 }
404static struct clk_freq_tbl clk_tbl_gp[] = {
405 F_GP( 0, gnd, 1, 0, 0),
406 F_GP( 9600000, cxo, 2, 0, 0),
407 F_GP( 19200000, cxo, 1, 0, 0),
408 F_END
409};
410
411static CLK_GP(gp0, 0, CLK_HALT_SFPB_MISC_STATE_REG, 7);
412static CLK_GP(gp1, 1, CLK_HALT_SFPB_MISC_STATE_REG, 6);
413static CLK_GP(gp2, 2, CLK_HALT_SFPB_MISC_STATE_REG, 5);
414
Vikram Mulukutla489e39e2011-08-31 18:04:05 -0700415#define CLK_GSBI_UART(i, n, h_r, h_b) \
416 struct rcg_clk i##_clk = { \
417 .b = { \
418 .ctl_reg = GSBIn_UART_APPS_NS_REG(n), \
419 .en_mask = BIT(9), \
420 .reset_reg = GSBIn_RESET_REG(n), \
421 .reset_mask = BIT(0), \
422 .halt_reg = h_r, \
423 .halt_bit = h_b, \
424 }, \
425 .ns_reg = GSBIn_UART_APPS_NS_REG(n), \
426 .md_reg = GSBIn_UART_APPS_MD_REG(n), \
427 .root_en_mask = BIT(11), \
428 .ns_mask = (BM(31, 16) | BM(6, 0)), \
Matt Wagantall07c45472012-02-10 23:27:24 -0800429 .mnd_en_mask = BIT(8), \
Vikram Mulukutla489e39e2011-08-31 18:04:05 -0700430 .set_rate = set_rate_mnd, \
431 .freq_tbl = clk_tbl_gsbi_uart, \
432 .current_freq = &rcg_dummy_freq, \
433 .c = { \
434 .dbg_name = #i "_clk", \
Stephen Boyd409b8b42012-04-10 12:12:56 -0700435 .ops = &clk_ops_rcg, \
Matt Wagantalle18bbc82011-10-06 10:07:28 -0700436 VDD_DIG_FMAX_MAP2(LOW, 32000000, NOMINAL, 64000000), \
Vikram Mulukutla489e39e2011-08-31 18:04:05 -0700437 CLK_INIT(i##_clk.c), \
438 }, \
439 }
Matt Wagantalle18bbc82011-10-06 10:07:28 -0700440#define F_GSBI_UART(f, s, d, m, n) \
Vikram Mulukutla489e39e2011-08-31 18:04:05 -0700441 { \
442 .freq_hz = f, \
443 .src_clk = &s##_clk.c, \
444 .md_val = MD16(m, n), \
445 .ns_val = NS(31, 16, n, m, 5, 4, 3, d, 2, 0, s##_to_bb_mux), \
Vikram Mulukutla489e39e2011-08-31 18:04:05 -0700446 }
447static struct clk_freq_tbl clk_tbl_gsbi_uart[] = {
Matt Wagantalle18bbc82011-10-06 10:07:28 -0700448 F_GSBI_UART( 0, gnd, 1, 0, 0),
Matt Wagantall9a561f72012-01-19 16:13:12 -0800449 F_GSBI_UART( 3686400, pll8, 2, 12, 625),
450 F_GSBI_UART( 7372800, pll8, 2, 24, 625),
451 F_GSBI_UART(14745600, pll8, 2, 48, 625),
Matt Wagantalle18bbc82011-10-06 10:07:28 -0700452 F_GSBI_UART(16000000, pll8, 4, 1, 6),
453 F_GSBI_UART(24000000, pll8, 4, 1, 4),
454 F_GSBI_UART(32000000, pll8, 4, 1, 3),
455 F_GSBI_UART(40000000, pll8, 1, 5, 48),
456 F_GSBI_UART(46400000, pll8, 1, 29, 240),
457 F_GSBI_UART(48000000, pll8, 4, 1, 2),
458 F_GSBI_UART(51200000, pll8, 1, 2, 15),
459 F_GSBI_UART(56000000, pll8, 1, 7, 48),
460 F_GSBI_UART(58982400, pll8, 1, 96, 625),
461 F_GSBI_UART(64000000, pll8, 2, 1, 3),
Vikram Mulukutla489e39e2011-08-31 18:04:05 -0700462 F_END
463};
464
465static CLK_GSBI_UART(gsbi1_uart, 1, CLK_HALT_CFPB_STATEA_REG, 10);
466static CLK_GSBI_UART(gsbi2_uart, 2, CLK_HALT_CFPB_STATEA_REG, 6);
467static CLK_GSBI_UART(gsbi3_uart, 3, CLK_HALT_CFPB_STATEA_REG, 2);
468static CLK_GSBI_UART(gsbi4_uart, 4, CLK_HALT_CFPB_STATEB_REG, 26);
469static CLK_GSBI_UART(gsbi5_uart, 5, CLK_HALT_CFPB_STATEB_REG, 22);
470
471#define CLK_GSBI_QUP(i, n, h_r, h_b) \
472 struct rcg_clk i##_clk = { \
473 .b = { \
474 .ctl_reg = GSBIn_QUP_APPS_NS_REG(n), \
475 .en_mask = BIT(9), \
476 .reset_reg = GSBIn_RESET_REG(n), \
477 .reset_mask = BIT(0), \
478 .halt_reg = h_r, \
479 .halt_bit = h_b, \
480 }, \
481 .ns_reg = GSBIn_QUP_APPS_NS_REG(n), \
482 .md_reg = GSBIn_QUP_APPS_MD_REG(n), \
483 .root_en_mask = BIT(11), \
484 .ns_mask = (BM(23, 16) | BM(6, 0)), \
Matt Wagantall07c45472012-02-10 23:27:24 -0800485 .mnd_en_mask = BIT(8), \
Vikram Mulukutla489e39e2011-08-31 18:04:05 -0700486 .set_rate = set_rate_mnd, \
487 .freq_tbl = clk_tbl_gsbi_qup, \
488 .current_freq = &rcg_dummy_freq, \
489 .c = { \
490 .dbg_name = #i "_clk", \
Stephen Boyd409b8b42012-04-10 12:12:56 -0700491 .ops = &clk_ops_rcg, \
Matt Wagantalle18bbc82011-10-06 10:07:28 -0700492 VDD_DIG_FMAX_MAP2(LOW, 24000000, NOMINAL, 52000000), \
Vikram Mulukutla489e39e2011-08-31 18:04:05 -0700493 CLK_INIT(i##_clk.c), \
494 }, \
495 }
Matt Wagantalle18bbc82011-10-06 10:07:28 -0700496#define F_GSBI_QUP(f, s, d, m, n) \
Vikram Mulukutla489e39e2011-08-31 18:04:05 -0700497 { \
498 .freq_hz = f, \
499 .src_clk = &s##_clk.c, \
500 .md_val = MD8(16, m, 0, n), \
501 .ns_val = NS(23, 16, n, m, 5, 4, 3, d, 2, 0, s##_to_bb_mux), \
Vikram Mulukutla489e39e2011-08-31 18:04:05 -0700502 }
503static struct clk_freq_tbl clk_tbl_gsbi_qup[] = {
Matt Wagantalle18bbc82011-10-06 10:07:28 -0700504 F_GSBI_QUP( 0, gnd, 1, 0, 0),
505 F_GSBI_QUP( 960000, cxo, 4, 1, 5),
506 F_GSBI_QUP( 4800000, cxo, 4, 0, 1),
507 F_GSBI_QUP( 9600000, cxo, 2, 0, 1),
508 F_GSBI_QUP(15058800, pll8, 1, 2, 51),
509 F_GSBI_QUP(24000000, pll8, 4, 1, 4),
510 F_GSBI_QUP(25600000, pll8, 1, 1, 15),
511 F_GSBI_QUP(48000000, pll8, 4, 1, 2),
512 F_GSBI_QUP(51200000, pll8, 1, 2, 15),
Vikram Mulukutla489e39e2011-08-31 18:04:05 -0700513 F_END
514};
515
516static CLK_GSBI_QUP(gsbi1_qup, 1, CLK_HALT_CFPB_STATEA_REG, 9);
517static CLK_GSBI_QUP(gsbi2_qup, 2, CLK_HALT_CFPB_STATEA_REG, 4);
518static CLK_GSBI_QUP(gsbi3_qup, 3, CLK_HALT_CFPB_STATEA_REG, 0);
519static CLK_GSBI_QUP(gsbi4_qup, 4, CLK_HALT_CFPB_STATEB_REG, 24);
520static CLK_GSBI_QUP(gsbi5_qup, 5, CLK_HALT_CFPB_STATEB_REG, 20);
521
Matt Wagantalle18bbc82011-10-06 10:07:28 -0700522#define F_PDM(f, s, d) \
Vikram Mulukutla489e39e2011-08-31 18:04:05 -0700523 { \
524 .freq_hz = f, \
525 .src_clk = &s##_clk.c, \
526 .ns_val = NS_SRC_SEL(1, 0, s##_to_xo_mux), \
Vikram Mulukutla489e39e2011-08-31 18:04:05 -0700527 }
528static struct clk_freq_tbl clk_tbl_pdm[] = {
Matt Wagantalle18bbc82011-10-06 10:07:28 -0700529 F_PDM( 0, gnd, 1),
530 F_PDM(19200000, cxo, 1),
Vikram Mulukutla489e39e2011-08-31 18:04:05 -0700531 F_END
532};
533
534static struct rcg_clk pdm_clk = {
535 .b = {
536 .ctl_reg = PDM_CLK_NS_REG,
537 .en_mask = BIT(9),
538 .reset_reg = PDM_CLK_NS_REG,
539 .reset_mask = BIT(12),
540 .halt_reg = CLK_HALT_CFPB_STATEC_REG,
541 .halt_bit = 3,
542 },
543 .ns_reg = PDM_CLK_NS_REG,
544 .root_en_mask = BIT(11),
545 .ns_mask = BM(1, 0),
546 .set_rate = set_rate_nop,
547 .freq_tbl = clk_tbl_pdm,
548 .current_freq = &rcg_dummy_freq,
549 .c = {
550 .dbg_name = "pdm_clk",
Stephen Boyd409b8b42012-04-10 12:12:56 -0700551 .ops = &clk_ops_rcg,
Matt Wagantalle18bbc82011-10-06 10:07:28 -0700552 VDD_DIG_FMAX_MAP1(LOW, 19200000),
Vikram Mulukutla489e39e2011-08-31 18:04:05 -0700553 CLK_INIT(pdm_clk.c),
554 },
555};
556
557static struct branch_clk pmem_clk = {
558 .b = {
559 .ctl_reg = PMEM_ACLK_CTL_REG,
560 .en_mask = BIT(4),
Matt Wagantallbc8c9062012-02-07 12:33:06 -0800561 .hwcg_reg = PMEM_ACLK_CTL_REG,
562 .hwcg_mask = BIT(6),
Vikram Mulukutla489e39e2011-08-31 18:04:05 -0700563 .halt_reg = CLK_HALT_DFAB_STATE_REG,
564 .halt_bit = 20,
565 },
566 .c = {
567 .dbg_name = "pmem_clk",
568 .ops = &clk_ops_branch,
569 CLK_INIT(pmem_clk.c),
570 },
571};
572
Matt Wagantalle18bbc82011-10-06 10:07:28 -0700573#define F_PRNG(f, s) \
Vikram Mulukutla489e39e2011-08-31 18:04:05 -0700574 { \
575 .freq_hz = f, \
576 .src_clk = &s##_clk.c, \
Vikram Mulukutla489e39e2011-08-31 18:04:05 -0700577 }
578static struct clk_freq_tbl clk_tbl_prng[] = {
Matt Wagantalle18bbc82011-10-06 10:07:28 -0700579 F_PRNG(32000000, pll8),
Vikram Mulukutla489e39e2011-08-31 18:04:05 -0700580 F_END
581};
582
583static struct rcg_clk prng_clk = {
584 .b = {
585 .ctl_reg = SC0_U_CLK_BRANCH_ENA_VOTE_REG,
586 .en_mask = BIT(10),
587 .halt_reg = CLK_HALT_SFPB_MISC_STATE_REG,
588 .halt_check = HALT_VOTED,
589 .halt_bit = 10,
590 },
591 .set_rate = set_rate_nop,
592 .freq_tbl = clk_tbl_prng,
593 .current_freq = &rcg_dummy_freq,
594 .c = {
595 .dbg_name = "prng_clk",
Stephen Boyd409b8b42012-04-10 12:12:56 -0700596 .ops = &clk_ops_rcg,
Matt Wagantalle18bbc82011-10-06 10:07:28 -0700597 VDD_DIG_FMAX_MAP2(LOW, 32000000, NOMINAL, 65000000),
Vikram Mulukutla489e39e2011-08-31 18:04:05 -0700598 CLK_INIT(prng_clk.c),
599 },
600};
601
602#define CLK_SDC(name, n, h_b, f_table) \
603 struct rcg_clk name = { \
604 .b = { \
605 .ctl_reg = SDCn_APPS_CLK_NS_REG(n), \
606 .en_mask = BIT(9), \
607 .reset_reg = SDCn_RESET_REG(n), \
608 .reset_mask = BIT(0), \
609 .halt_reg = CLK_HALT_DFAB_STATE_REG, \
610 .halt_bit = h_b, \
611 }, \
612 .ns_reg = SDCn_APPS_CLK_NS_REG(n), \
613 .md_reg = SDCn_APPS_CLK_MD_REG(n), \
614 .root_en_mask = BIT(11), \
615 .ns_mask = (BM(23, 16) | BM(6, 0)), \
Matt Wagantall07c45472012-02-10 23:27:24 -0800616 .mnd_en_mask = BIT(8), \
Vikram Mulukutla489e39e2011-08-31 18:04:05 -0700617 .set_rate = set_rate_mnd, \
618 .freq_tbl = f_table, \
619 .current_freq = &rcg_dummy_freq, \
620 .c = { \
621 .dbg_name = #name, \
Stephen Boyd409b8b42012-04-10 12:12:56 -0700622 .ops = &clk_ops_rcg, \
Vikram Mulukutla2d0f6432011-11-07 20:22:08 -0800623 VDD_DIG_FMAX_MAP2(LOW, 26000000, NOMINAL, 52000000), \
Vikram Mulukutla489e39e2011-08-31 18:04:05 -0700624 CLK_INIT(name.c), \
625 }, \
626 }
Matt Wagantalle18bbc82011-10-06 10:07:28 -0700627#define F_SDC(f, s, d, m, n) \
Vikram Mulukutla489e39e2011-08-31 18:04:05 -0700628 { \
629 .freq_hz = f, \
630 .src_clk = &s##_clk.c, \
631 .md_val = MD8(16, m, 0, n), \
632 .ns_val = NS(23, 16, n, m, 5, 4, 3, d, 2, 0, s##_to_bb_mux), \
Vikram Mulukutla489e39e2011-08-31 18:04:05 -0700633 }
634static struct clk_freq_tbl clk_tbl_sdc1_2[] = {
Matt Wagantalle18bbc82011-10-06 10:07:28 -0700635 F_SDC( 0, gnd, 1, 0, 0),
636 F_SDC( 144300, cxo, 1, 1, 133),
637 F_SDC( 400000, pll8, 4, 1, 240),
638 F_SDC( 16000000, pll8, 4, 1, 6),
639 F_SDC( 17070000, pll8, 1, 2, 45),
640 F_SDC( 20210000, pll8, 1, 1, 19),
641 F_SDC( 24000000, pll8, 4, 1, 4),
Vikram Mulukutla2d0f6432011-11-07 20:22:08 -0800642 F_SDC( 38400000, pll8, 2, 1, 5),
Matt Wagantalle18bbc82011-10-06 10:07:28 -0700643 F_SDC( 48000000, pll8, 4, 1, 2),
Vikram Mulukutla2d0f6432011-11-07 20:22:08 -0800644 F_SDC( 64000000, pll8, 3, 1, 2),
645 F_SDC( 76800000, pll8, 1, 1, 5),
Vikram Mulukutla489e39e2011-08-31 18:04:05 -0700646 F_END
647};
648
649static CLK_SDC(sdc1_clk, 1, 6, clk_tbl_sdc1_2);
650static CLK_SDC(sdc2_clk, 2, 5, clk_tbl_sdc1_2);
651
Matt Wagantalle18bbc82011-10-06 10:07:28 -0700652#define F_USB(f, s, d, m, n) \
Vikram Mulukutla489e39e2011-08-31 18:04:05 -0700653 { \
654 .freq_hz = f, \
655 .src_clk = &s##_clk.c, \
656 .md_val = MD8(16, m, 0, n), \
657 .ns_val = NS(23, 16, n, m, 5, 4, 3, d, 2, 0, s##_to_bb_mux), \
Vikram Mulukutla489e39e2011-08-31 18:04:05 -0700658 }
659static struct clk_freq_tbl clk_tbl_usb[] = {
Vikram Mulukutla35425992012-07-09 11:32:53 -0700660 F_USB( 0, gnd, 1, 0, 0),
Matt Wagantalle18bbc82011-10-06 10:07:28 -0700661 F_USB(60000000, pll8, 1, 5, 32),
Vikram Mulukutla489e39e2011-08-31 18:04:05 -0700662 F_END
663};
664
Vikram Mulukutla35425992012-07-09 11:32:53 -0700665static struct clk_freq_tbl clk_tbl_usb_hs1_sys[] = {
666 F_USB( 0, gnd, 1, 0, 0),
667 F_USB(60000000, pll8_activeonly, 1, 5, 32),
668 F_END
669};
670
Vikram Mulukutla6c9158f2011-12-08 12:41:20 -0800671static struct clk_freq_tbl clk_tbl_usb_hsic_sys[] = {
Vikram Mulukutla128986a2012-07-10 13:32:08 -0700672 F_USB( 0, gnd, 1, 0, 0),
673 F_USB(64000000, pll8_activeonly, 1, 1, 6),
Vikram Mulukutla6c9158f2011-12-08 12:41:20 -0800674 F_END
675};
676
Vikram Mulukutla489e39e2011-08-31 18:04:05 -0700677static struct rcg_clk usb_hs1_xcvr_clk = {
678 .b = {
679 .ctl_reg = USB_HS1_XCVR_FS_CLK_NS_REG,
680 .en_mask = BIT(9),
681 .reset_reg = USB_HS1_RESET_REG,
682 .reset_mask = BIT(0),
683 .halt_reg = CLK_HALT_DFAB_STATE_REG,
684 .halt_bit = 0,
685 },
686 .ns_reg = USB_HS1_XCVR_FS_CLK_NS_REG,
687 .md_reg = USB_HS1_XCVR_FS_CLK_MD_REG,
688 .root_en_mask = BIT(11),
689 .ns_mask = (BM(23, 16) | BM(6, 0)),
Matt Wagantall07c45472012-02-10 23:27:24 -0800690 .mnd_en_mask = BIT(8),
Vikram Mulukutla489e39e2011-08-31 18:04:05 -0700691 .set_rate = set_rate_mnd,
692 .freq_tbl = clk_tbl_usb,
693 .current_freq = &rcg_dummy_freq,
694 .c = {
695 .dbg_name = "usb_hs1_xcvr_clk",
Stephen Boyd409b8b42012-04-10 12:12:56 -0700696 .ops = &clk_ops_rcg,
Matt Wagantalle18bbc82011-10-06 10:07:28 -0700697 VDD_DIG_FMAX_MAP1(NOMINAL, 60000000),
Vikram Mulukutla489e39e2011-08-31 18:04:05 -0700698 CLK_INIT(usb_hs1_xcvr_clk.c),
699 },
700};
701
702static struct rcg_clk usb_hs1_sys_clk = {
703 .b = {
704 .ctl_reg = USB_HS1_SYS_CLK_NS_REG,
705 .en_mask = BIT(9),
706 .reset_reg = USB_HS1_RESET_REG,
707 .reset_mask = BIT(0),
708 .halt_reg = CLK_HALT_DFAB_STATE_REG,
709 .halt_bit = 4,
710 },
711 .ns_reg = USB_HS1_SYS_CLK_NS_REG,
712 .md_reg = USB_HS1_SYS_CLK_MD_REG,
713 .root_en_mask = BIT(11),
714 .ns_mask = (BM(23, 16) | BM(6, 0)),
Matt Wagantall07c45472012-02-10 23:27:24 -0800715 .mnd_en_mask = BIT(8),
Vikram Mulukutla489e39e2011-08-31 18:04:05 -0700716 .set_rate = set_rate_mnd,
Vikram Mulukutla35425992012-07-09 11:32:53 -0700717 .freq_tbl = clk_tbl_usb_hs1_sys,
Vikram Mulukutla489e39e2011-08-31 18:04:05 -0700718 .current_freq = &rcg_dummy_freq,
719 .c = {
720 .dbg_name = "usb_hs1_sys_clk",
Stephen Boyd409b8b42012-04-10 12:12:56 -0700721 .ops = &clk_ops_rcg,
Matt Wagantalle18bbc82011-10-06 10:07:28 -0700722 VDD_DIG_FMAX_MAP1(NOMINAL, 60000000),
Vikram Mulukutla489e39e2011-08-31 18:04:05 -0700723 CLK_INIT(usb_hs1_sys_clk.c),
724 },
725};
726
727static struct rcg_clk usb_hsic_xcvr_clk = {
728 .b = {
729 .ctl_reg = USB_HSIC_XCVR_FS_CLK_NS_REG,
730 .en_mask = BIT(9),
731 .reset_reg = USB_HSIC_RESET_REG,
732 .reset_mask = BIT(0),
733 .halt_reg = CLK_HALT_DFAB_STATE_REG,
734 .halt_bit = 9,
735 },
736 .ns_reg = USB_HSIC_XCVR_FS_CLK_NS_REG,
737 .md_reg = USB_HSIC_XCVR_FS_CLK_MD_REG,
738 .root_en_mask = BIT(11),
739 .ns_mask = (BM(23, 16) | BM(6, 0)),
Matt Wagantall07c45472012-02-10 23:27:24 -0800740 .mnd_en_mask = BIT(8),
Vikram Mulukutla489e39e2011-08-31 18:04:05 -0700741 .set_rate = set_rate_mnd,
742 .freq_tbl = clk_tbl_usb,
743 .current_freq = &rcg_dummy_freq,
744 .c = {
745 .dbg_name = "usb_hsic_xcvr_clk",
Stephen Boyd409b8b42012-04-10 12:12:56 -0700746 .ops = &clk_ops_rcg,
Vikram Mulukutla6c9158f2011-12-08 12:41:20 -0800747 VDD_DIG_FMAX_MAP1(LOW, 60000000),
Vikram Mulukutla489e39e2011-08-31 18:04:05 -0700748 CLK_INIT(usb_hsic_xcvr_clk.c),
749 },
750};
751
752static struct rcg_clk usb_hsic_sys_clk = {
753 .b = {
754 .ctl_reg = USB_HSIC_SYSTEM_CLK_NS_REG,
755 .en_mask = BIT(9),
756 .reset_reg = USB_HSIC_RESET_REG,
757 .reset_mask = BIT(0),
758 .halt_reg = CLK_HALT_DFAB_STATE_REG,
759 .halt_bit = 7,
760 },
761 .ns_reg = USB_HSIC_SYSTEM_CLK_NS_REG,
762 .md_reg = USB_HSIC_SYSTEM_CLK_MD_REG,
763 .root_en_mask = BIT(11),
764 .ns_mask = (BM(23, 16) | BM(6, 0)),
Matt Wagantall07c45472012-02-10 23:27:24 -0800765 .mnd_en_mask = BIT(8),
Vikram Mulukutla489e39e2011-08-31 18:04:05 -0700766 .set_rate = set_rate_mnd,
Vikram Mulukutla6c9158f2011-12-08 12:41:20 -0800767 .freq_tbl = clk_tbl_usb_hsic_sys,
Vikram Mulukutla489e39e2011-08-31 18:04:05 -0700768 .current_freq = &rcg_dummy_freq,
769 .c = {
770 .dbg_name = "usb_hsic_sys_clk",
Stephen Boyd409b8b42012-04-10 12:12:56 -0700771 .ops = &clk_ops_rcg,
Vikram Mulukutla6c9158f2011-12-08 12:41:20 -0800772 VDD_DIG_FMAX_MAP1(LOW, 64000000),
Vikram Mulukutla489e39e2011-08-31 18:04:05 -0700773 CLK_INIT(usb_hsic_sys_clk.c),
774 },
775};
776
777static struct clk_freq_tbl clk_tbl_usb_hsic[] = {
Matt Wagantalle18bbc82011-10-06 10:07:28 -0700778 F_USB( 0, gnd, 1, 0, 0),
Vikram Mulukutla6c9158f2011-12-08 12:41:20 -0800779 F_USB(480000000, pll14, 1, 0, 0),
Vikram Mulukutla489e39e2011-08-31 18:04:05 -0700780 F_END
781};
782
783static struct rcg_clk usb_hsic_clk = {
784 .b = {
785 .ctl_reg = USB_HSIC_CLK_NS_REG,
786 .en_mask = BIT(9),
787 .reset_reg = USB_HSIC_RESET_REG,
788 .reset_mask = BIT(0),
Vikram Mulukutla6c9158f2011-12-08 12:41:20 -0800789 .halt_check = DELAY,
Vikram Mulukutla489e39e2011-08-31 18:04:05 -0700790 },
791 .ns_reg = USB_HSIC_CLK_NS_REG,
792 .md_reg = USB_HSIC_CLK_MD_REG,
793 .root_en_mask = BIT(11),
794 .ns_mask = (BM(23, 16) | BM(6, 0)),
795 .set_rate = set_rate_mnd,
796 .freq_tbl = clk_tbl_usb_hsic,
797 .current_freq = &rcg_dummy_freq,
798 .c = {
799 .dbg_name = "usb_hsic_clk",
Stephen Boyd409b8b42012-04-10 12:12:56 -0700800 .ops = &clk_ops_rcg,
Vikram Mulukutla6c9158f2011-12-08 12:41:20 -0800801 VDD_DIG_FMAX_MAP1(LOW, 480000000),
Vikram Mulukutla489e39e2011-08-31 18:04:05 -0700802 CLK_INIT(usb_hsic_clk.c),
803 },
804};
805
806static struct branch_clk usb_hsic_hsio_cal_clk = {
807 .b = {
808 .ctl_reg = USB_HSIC_HSIO_CAL_CLK_CTL_REG,
809 .en_mask = BIT(0),
810 .halt_reg = CLK_HALT_DFAB_STATE_REG,
811 .halt_bit = 8,
812 },
813 .parent = &cxo_clk.c,
814 .c = {
815 .dbg_name = "usb_hsic_hsio_cal_clk",
816 .ops = &clk_ops_branch,
817 CLK_INIT(usb_hsic_hsio_cal_clk.c),
818 },
819};
820
821/* Fast Peripheral Bus Clocks */
822static struct branch_clk ce1_core_clk = {
823 .b = {
824 .ctl_reg = CE1_CORE_CLK_CTL_REG,
825 .en_mask = BIT(4),
Matt Wagantallbc8c9062012-02-07 12:33:06 -0800826 .hwcg_reg = CE1_CORE_CLK_CTL_REG,
827 .hwcg_mask = BIT(6),
Vikram Mulukutla489e39e2011-08-31 18:04:05 -0700828 .halt_reg = CLK_HALT_CFPB_STATEC_REG,
829 .halt_bit = 27,
830 },
831 .c = {
832 .dbg_name = "ce1_core_clk",
833 .ops = &clk_ops_branch,
834 CLK_INIT(ce1_core_clk.c),
835 },
836};
837static struct branch_clk ce1_p_clk = {
838 .b = {
839 .ctl_reg = CE1_HCLK_CTL_REG,
840 .en_mask = BIT(4),
841 .halt_reg = CLK_HALT_CFPB_STATEC_REG,
842 .halt_bit = 1,
843 },
844 .c = {
845 .dbg_name = "ce1_p_clk",
846 .ops = &clk_ops_branch,
847 CLK_INIT(ce1_p_clk.c),
848 },
849};
850
851static struct branch_clk dma_bam_p_clk = {
852 .b = {
853 .ctl_reg = DMA_BAM_HCLK_CTL,
854 .en_mask = BIT(4),
855 .halt_reg = CLK_HALT_DFAB_STATE_REG,
856 .halt_bit = 12,
857 },
858 .c = {
859 .dbg_name = "dma_bam_p_clk",
860 .ops = &clk_ops_branch,
861 CLK_INIT(dma_bam_p_clk.c),
862 },
863};
864
865static struct branch_clk gsbi1_p_clk = {
866 .b = {
867 .ctl_reg = GSBIn_HCLK_CTL_REG(1),
868 .en_mask = BIT(4),
869 .halt_reg = CLK_HALT_CFPB_STATEA_REG,
870 .halt_bit = 11,
871 },
872 .c = {
873 .dbg_name = "gsbi1_p_clk",
874 .ops = &clk_ops_branch,
875 CLK_INIT(gsbi1_p_clk.c),
876 },
877};
878
879static struct branch_clk gsbi2_p_clk = {
880 .b = {
881 .ctl_reg = GSBIn_HCLK_CTL_REG(2),
882 .en_mask = BIT(4),
883 .halt_reg = CLK_HALT_CFPB_STATEA_REG,
884 .halt_bit = 7,
885 },
886 .c = {
887 .dbg_name = "gsbi2_p_clk",
888 .ops = &clk_ops_branch,
889 CLK_INIT(gsbi2_p_clk.c),
890 },
891};
892
893static struct branch_clk gsbi3_p_clk = {
894 .b = {
895 .ctl_reg = GSBIn_HCLK_CTL_REG(3),
896 .en_mask = BIT(4),
897 .halt_reg = CLK_HALT_CFPB_STATEA_REG,
898 .halt_bit = 3,
899 },
900 .c = {
901 .dbg_name = "gsbi3_p_clk",
902 .ops = &clk_ops_branch,
903 CLK_INIT(gsbi3_p_clk.c),
904 },
905};
906
907static struct branch_clk gsbi4_p_clk = {
908 .b = {
909 .ctl_reg = GSBIn_HCLK_CTL_REG(4),
910 .en_mask = BIT(4),
911 .halt_reg = CLK_HALT_CFPB_STATEB_REG,
912 .halt_bit = 27,
913 },
914 .c = {
915 .dbg_name = "gsbi4_p_clk",
916 .ops = &clk_ops_branch,
917 CLK_INIT(gsbi4_p_clk.c),
918 },
919};
920
921static struct branch_clk gsbi5_p_clk = {
922 .b = {
923 .ctl_reg = GSBIn_HCLK_CTL_REG(5),
924 .en_mask = BIT(4),
925 .halt_reg = CLK_HALT_CFPB_STATEB_REG,
926 .halt_bit = 23,
927 },
928 .c = {
929 .dbg_name = "gsbi5_p_clk",
930 .ops = &clk_ops_branch,
931 CLK_INIT(gsbi5_p_clk.c),
932 },
933};
934
935static struct branch_clk usb_hs1_p_clk = {
936 .b = {
937 .ctl_reg = USB_HS1_HCLK_CTL_REG,
938 .en_mask = BIT(4),
Matt Wagantallbc8c9062012-02-07 12:33:06 -0800939 .hwcg_reg = USB_HS1_HCLK_CTL_REG,
940 .hwcg_mask = BIT(6),
Vikram Mulukutla489e39e2011-08-31 18:04:05 -0700941 .halt_reg = CLK_HALT_DFAB_STATE_REG,
942 .halt_bit = 1,
943 },
944 .c = {
945 .dbg_name = "usb_hs1_p_clk",
946 .ops = &clk_ops_branch,
947 CLK_INIT(usb_hs1_p_clk.c),
948 },
949};
950
951static struct branch_clk usb_hsic_p_clk = {
952 .b = {
953 .ctl_reg = USB_HSIC_HCLK_CTL_REG,
954 .en_mask = BIT(4),
Matt Wagantallbc8c9062012-02-07 12:33:06 -0800955 .hwcg_reg = USB_HSIC_HCLK_CTL_REG,
956 .hwcg_mask = BIT(6),
Vikram Mulukutla489e39e2011-08-31 18:04:05 -0700957 .halt_reg = CLK_HALT_DFAB_STATE_REG,
958 .halt_bit = 3,
959 },
960 .c = {
961 .dbg_name = "usb_hsic_p_clk",
962 .ops = &clk_ops_branch,
963 CLK_INIT(usb_hsic_p_clk.c),
964 },
965};
966
967static struct branch_clk sdc1_p_clk = {
968 .b = {
969 .ctl_reg = SDCn_HCLK_CTL_REG(1),
970 .en_mask = BIT(4),
Matt Wagantallbc8c9062012-02-07 12:33:06 -0800971 .hwcg_reg = SDCn_HCLK_CTL_REG(1),
972 .hwcg_mask = BIT(6),
Vikram Mulukutla489e39e2011-08-31 18:04:05 -0700973 .halt_reg = CLK_HALT_DFAB_STATE_REG,
974 .halt_bit = 11,
975 },
976 .c = {
977 .dbg_name = "sdc1_p_clk",
978 .ops = &clk_ops_branch,
979 CLK_INIT(sdc1_p_clk.c),
980 },
981};
982
983static struct branch_clk sdc2_p_clk = {
984 .b = {
985 .ctl_reg = SDCn_HCLK_CTL_REG(2),
986 .en_mask = BIT(4),
Matt Wagantallbc8c9062012-02-07 12:33:06 -0800987 .hwcg_reg = SDCn_HCLK_CTL_REG(2),
988 .hwcg_mask = BIT(6),
Vikram Mulukutla489e39e2011-08-31 18:04:05 -0700989 .halt_reg = CLK_HALT_DFAB_STATE_REG,
990 .halt_bit = 10,
991 },
992 .c = {
993 .dbg_name = "sdc2_p_clk",
994 .ops = &clk_ops_branch,
995 CLK_INIT(sdc2_p_clk.c),
996 },
997};
998
999/* HW-Voteable Clocks */
1000static struct branch_clk adm0_clk = {
1001 .b = {
1002 .ctl_reg = SC0_U_CLK_BRANCH_ENA_VOTE_REG,
1003 .en_mask = BIT(2),
1004 .halt_reg = CLK_HALT_MSS_KPSS_MISC_STATE_REG,
1005 .halt_check = HALT_VOTED,
1006 .halt_bit = 14,
1007 },
1008 .c = {
1009 .dbg_name = "adm0_clk",
1010 .ops = &clk_ops_branch,
1011 CLK_INIT(adm0_clk.c),
1012 },
1013};
1014
1015static struct branch_clk adm0_p_clk = {
1016 .b = {
1017 .ctl_reg = SC0_U_CLK_BRANCH_ENA_VOTE_REG,
1018 .en_mask = BIT(3),
1019 .halt_reg = CLK_HALT_MSS_KPSS_MISC_STATE_REG,
1020 .halt_check = HALT_VOTED,
1021 .halt_bit = 13,
1022 },
1023 .c = {
1024 .dbg_name = "adm0_p_clk",
1025 .ops = &clk_ops_branch,
1026 CLK_INIT(adm0_p_clk.c),
1027 },
1028};
1029
1030static struct branch_clk pmic_arb0_p_clk = {
1031 .b = {
1032 .ctl_reg = SC0_U_CLK_BRANCH_ENA_VOTE_REG,
1033 .en_mask = BIT(8),
1034 .halt_reg = CLK_HALT_SFPB_MISC_STATE_REG,
1035 .halt_check = HALT_VOTED,
1036 .halt_bit = 22,
1037 },
1038 .c = {
1039 .dbg_name = "pmic_arb0_p_clk",
1040 .ops = &clk_ops_branch,
1041 CLK_INIT(pmic_arb0_p_clk.c),
1042 },
1043};
1044
1045static struct branch_clk pmic_arb1_p_clk = {
1046 .b = {
1047 .ctl_reg = SC0_U_CLK_BRANCH_ENA_VOTE_REG,
1048 .en_mask = BIT(9),
1049 .halt_reg = CLK_HALT_SFPB_MISC_STATE_REG,
1050 .halt_check = HALT_VOTED,
1051 .halt_bit = 21,
1052 },
1053 .c = {
1054 .dbg_name = "pmic_arb1_p_clk",
1055 .ops = &clk_ops_branch,
1056 CLK_INIT(pmic_arb1_p_clk.c),
1057 },
1058};
1059
1060static struct branch_clk pmic_ssbi2_clk = {
1061 .b = {
1062 .ctl_reg = SC0_U_CLK_BRANCH_ENA_VOTE_REG,
1063 .en_mask = BIT(7),
1064 .halt_reg = CLK_HALT_SFPB_MISC_STATE_REG,
1065 .halt_check = HALT_VOTED,
1066 .halt_bit = 23,
1067 },
1068 .c = {
1069 .dbg_name = "pmic_ssbi2_clk",
1070 .ops = &clk_ops_branch,
1071 CLK_INIT(pmic_ssbi2_clk.c),
1072 },
1073};
1074
1075static struct branch_clk rpm_msg_ram_p_clk = {
1076 .b = {
1077 .ctl_reg = SC0_U_CLK_BRANCH_ENA_VOTE_REG,
1078 .en_mask = BIT(6),
1079 .halt_reg = CLK_HALT_SFPB_MISC_STATE_REG,
1080 .halt_check = HALT_VOTED,
1081 .halt_bit = 12,
1082 },
1083 .c = {
1084 .dbg_name = "rpm_msg_ram_p_clk",
1085 .ops = &clk_ops_branch,
1086 CLK_INIT(rpm_msg_ram_p_clk.c),
1087 },
1088};
1089
1090/*
1091 * Low Power Audio Clocks
1092 */
Matt Wagantalle18bbc82011-10-06 10:07:28 -07001093#define F_AIF_OSR(f, s, d, m, n) \
Vikram Mulukutla489e39e2011-08-31 18:04:05 -07001094 { \
1095 .freq_hz = f, \
1096 .src_clk = &s##_clk.c, \
1097 .md_val = MD8(8, m, 0, n), \
1098 .ns_val = NS(31, 24, n, m, 5, 4, 3, d, 2, 0, s##_to_lpa_mux), \
Vikram Mulukutla489e39e2011-08-31 18:04:05 -07001099 }
1100static struct clk_freq_tbl clk_tbl_aif_osr[] = {
Matt Wagantalle18bbc82011-10-06 10:07:28 -07001101 F_AIF_OSR( 0, gnd, 1, 0, 0),
1102 F_AIF_OSR( 512000, pll4, 4, 1, 192),
1103 F_AIF_OSR( 768000, pll4, 4, 1, 128),
1104 F_AIF_OSR( 1024000, pll4, 4, 1, 96),
1105 F_AIF_OSR( 1536000, pll4, 4, 1, 64),
1106 F_AIF_OSR( 2048000, pll4, 4, 1, 48),
1107 F_AIF_OSR( 3072000, pll4, 4, 1, 32),
1108 F_AIF_OSR( 4096000, pll4, 4, 1, 24),
1109 F_AIF_OSR( 6144000, pll4, 4, 1, 16),
1110 F_AIF_OSR( 8192000, pll4, 4, 1, 12),
1111 F_AIF_OSR(12288000, pll4, 4, 1, 8),
1112 F_AIF_OSR(24576000, pll4, 4, 1, 4),
Vikram Mulukutla489e39e2011-08-31 18:04:05 -07001113 F_END
1114};
1115
1116#define CLK_AIF_OSR(i, ns, md, h_r) \
1117 struct rcg_clk i##_clk = { \
1118 .b = { \
1119 .ctl_reg = ns, \
1120 .en_mask = BIT(17), \
1121 .reset_reg = ns, \
1122 .reset_mask = BIT(19), \
1123 .halt_reg = h_r, \
1124 .halt_check = ENABLE, \
1125 .halt_bit = 1, \
1126 }, \
1127 .ns_reg = ns, \
1128 .md_reg = md, \
1129 .root_en_mask = BIT(9), \
1130 .ns_mask = (BM(31, 24) | BM(6, 0)), \
Matt Wagantall07c45472012-02-10 23:27:24 -08001131 .mnd_en_mask = BIT(8), \
Vikram Mulukutla489e39e2011-08-31 18:04:05 -07001132 .set_rate = set_rate_mnd, \
1133 .freq_tbl = clk_tbl_aif_osr, \
1134 .current_freq = &rcg_dummy_freq, \
1135 .c = { \
1136 .dbg_name = #i "_clk", \
Stephen Boyd409b8b42012-04-10 12:12:56 -07001137 .ops = &clk_ops_rcg, \
Vikram Mulukutla489e39e2011-08-31 18:04:05 -07001138 CLK_INIT(i##_clk.c), \
1139 }, \
1140 }
1141#define CLK_AIF_OSR_DIV(i, ns, md, h_r) \
1142 struct rcg_clk i##_clk = { \
1143 .b = { \
1144 .ctl_reg = ns, \
1145 .en_mask = BIT(21), \
1146 .reset_reg = ns, \
1147 .reset_mask = BIT(23), \
1148 .halt_reg = h_r, \
1149 .halt_check = ENABLE, \
1150 .halt_bit = 1, \
1151 }, \
1152 .ns_reg = ns, \
1153 .md_reg = md, \
1154 .root_en_mask = BIT(9), \
1155 .ns_mask = (BM(31, 24) | BM(6, 0)), \
Matt Wagantall07c45472012-02-10 23:27:24 -08001156 .mnd_en_mask = BIT(8), \
Vikram Mulukutla489e39e2011-08-31 18:04:05 -07001157 .set_rate = set_rate_mnd, \
1158 .freq_tbl = clk_tbl_aif_osr, \
1159 .current_freq = &rcg_dummy_freq, \
1160 .c = { \
1161 .dbg_name = #i "_clk", \
Stephen Boyd409b8b42012-04-10 12:12:56 -07001162 .ops = &clk_ops_rcg, \
Vikram Mulukutla489e39e2011-08-31 18:04:05 -07001163 CLK_INIT(i##_clk.c), \
1164 }, \
1165 }
1166
Vikram Mulukutla489e39e2011-08-31 18:04:05 -07001167#define CLK_AIF_BIT(i, ns, h_r) \
Stephen Boyd9fd19642011-11-16 11:11:09 -08001168 struct cdiv_clk i##_clk = { \
Vikram Mulukutla489e39e2011-08-31 18:04:05 -07001169 .b = { \
1170 .ctl_reg = ns, \
1171 .en_mask = BIT(15), \
1172 .halt_reg = h_r, \
1173 .halt_check = DELAY, \
1174 }, \
1175 .ns_reg = ns, \
Stephen Boyd9fd19642011-11-16 11:11:09 -08001176 .ext_mask = BIT(14), \
1177 .div_offset = 10, \
1178 .max_div = 16, \
Vikram Mulukutla489e39e2011-08-31 18:04:05 -07001179 .c = { \
1180 .dbg_name = #i "_clk", \
Stephen Boyd9fd19642011-11-16 11:11:09 -08001181 .ops = &clk_ops_cdiv, \
Vikram Mulukutla489e39e2011-08-31 18:04:05 -07001182 CLK_INIT(i##_clk.c), \
Stephen Boydd51d5e82012-06-18 18:09:50 -07001183 .rate = ULONG_MAX, \
Vikram Mulukutla489e39e2011-08-31 18:04:05 -07001184 }, \
1185 }
1186
Vikram Mulukutla489e39e2011-08-31 18:04:05 -07001187#define CLK_AIF_BIT_DIV(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(19), \
1192 .halt_reg = h_r, \
Stephen Boyd7bb9cf82012-01-25 18:09:01 -08001193 .halt_check = DELAY, \
Vikram Mulukutla489e39e2011-08-31 18:04:05 -07001194 }, \
1195 .ns_reg = ns, \
Stephen Boyd9fd19642011-11-16 11:11:09 -08001196 .ext_mask = BIT(18), \
1197 .div_offset = 10, \
1198 .max_div = 256, \
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), \
Stephen Boydd51d5e82012-06-18 18:09:50 -07001203 .rate = ULONG_MAX, \
Vikram Mulukutla489e39e2011-08-31 18:04:05 -07001204 }, \
1205 }
1206
1207static CLK_AIF_OSR(mi2s_osr, LCC_MI2S_NS_REG, LCC_MI2S_MD_REG,
1208 LCC_MI2S_STATUS_REG);
1209static CLK_AIF_BIT(mi2s_bit, LCC_MI2S_NS_REG, LCC_MI2S_STATUS_REG);
1210
1211static CLK_AIF_OSR_DIV(codec_i2s_mic_osr, LCC_CODEC_I2S_MIC_NS_REG,
1212 LCC_CODEC_I2S_MIC_MD_REG, LCC_CODEC_I2S_MIC_STATUS_REG);
1213static CLK_AIF_BIT_DIV(codec_i2s_mic_bit, LCC_CODEC_I2S_MIC_NS_REG,
1214 LCC_CODEC_I2S_MIC_STATUS_REG);
1215
1216static CLK_AIF_OSR_DIV(spare_i2s_mic_osr, LCC_SPARE_I2S_MIC_NS_REG,
1217 LCC_SPARE_I2S_MIC_MD_REG, LCC_SPARE_I2S_MIC_STATUS_REG);
1218static CLK_AIF_BIT_DIV(spare_i2s_mic_bit, LCC_SPARE_I2S_MIC_NS_REG,
1219 LCC_SPARE_I2S_MIC_STATUS_REG);
1220
1221static CLK_AIF_OSR_DIV(codec_i2s_spkr_osr, LCC_CODEC_I2S_SPKR_NS_REG,
1222 LCC_CODEC_I2S_SPKR_MD_REG, LCC_CODEC_I2S_SPKR_STATUS_REG);
1223static CLK_AIF_BIT_DIV(codec_i2s_spkr_bit, LCC_CODEC_I2S_SPKR_NS_REG,
1224 LCC_CODEC_I2S_SPKR_STATUS_REG);
1225
1226static CLK_AIF_OSR_DIV(spare_i2s_spkr_osr, LCC_SPARE_I2S_SPKR_NS_REG,
1227 LCC_SPARE_I2S_SPKR_MD_REG, LCC_SPARE_I2S_SPKR_STATUS_REG);
1228static CLK_AIF_BIT_DIV(spare_i2s_spkr_bit, LCC_SPARE_I2S_SPKR_NS_REG,
1229 LCC_SPARE_I2S_SPKR_STATUS_REG);
1230
Matt Wagantalle18bbc82011-10-06 10:07:28 -07001231#define F_PCM(f, s, d, m, n) \
Vikram Mulukutla489e39e2011-08-31 18:04:05 -07001232 { \
1233 .freq_hz = f, \
1234 .src_clk = &s##_clk.c, \
1235 .md_val = MD16(m, n), \
1236 .ns_val = NS(31, 16, n, m, 5, 4, 3, d, 2, 0, s##_to_lpa_mux), \
Vikram Mulukutla489e39e2011-08-31 18:04:05 -07001237 }
1238static struct clk_freq_tbl clk_tbl_pcm[] = {
Stephen Boyd630f3252012-01-31 00:10:08 -08001239 { .ns_val = BIT(10) /* external input */ },
Matt Wagantalle18bbc82011-10-06 10:07:28 -07001240 F_PCM( 512000, pll4, 4, 1, 192),
1241 F_PCM( 768000, pll4, 4, 1, 128),
1242 F_PCM( 1024000, pll4, 4, 1, 96),
1243 F_PCM( 1536000, pll4, 4, 1, 64),
1244 F_PCM( 2048000, pll4, 4, 1, 48),
1245 F_PCM( 3072000, pll4, 4, 1, 32),
1246 F_PCM( 4096000, pll4, 4, 1, 24),
1247 F_PCM( 6144000, pll4, 4, 1, 16),
1248 F_PCM( 8192000, pll4, 4, 1, 12),
1249 F_PCM(12288000, pll4, 4, 1, 8),
1250 F_PCM(24576000, pll4, 4, 1, 4),
Vikram Mulukutla489e39e2011-08-31 18:04:05 -07001251 F_END
1252};
1253
1254static struct rcg_clk pcm_clk = {
1255 .b = {
1256 .ctl_reg = LCC_PCM_NS_REG,
1257 .en_mask = BIT(11),
1258 .reset_reg = LCC_PCM_NS_REG,
1259 .reset_mask = BIT(13),
1260 .halt_reg = LCC_PCM_STATUS_REG,
1261 .halt_check = ENABLE,
1262 .halt_bit = 0,
1263 },
1264 .ns_reg = LCC_PCM_NS_REG,
1265 .md_reg = LCC_PCM_MD_REG,
1266 .root_en_mask = BIT(9),
Stephen Boyd630f3252012-01-31 00:10:08 -08001267 .ns_mask = BM(31, 16) | BIT(10) | BM(6, 0),
Matt Wagantall07c45472012-02-10 23:27:24 -08001268 .mnd_en_mask = BIT(8),
Vikram Mulukutla489e39e2011-08-31 18:04:05 -07001269 .set_rate = set_rate_mnd,
1270 .freq_tbl = clk_tbl_pcm,
1271 .current_freq = &rcg_dummy_freq,
1272 .c = {
1273 .dbg_name = "pcm_clk",
Stephen Boyd409b8b42012-04-10 12:12:56 -07001274 .ops = &clk_ops_rcg,
Matt Wagantalle18bbc82011-10-06 10:07:28 -07001275 VDD_DIG_FMAX_MAP1(LOW, 24576000),
Vikram Mulukutla489e39e2011-08-31 18:04:05 -07001276 CLK_INIT(pcm_clk.c),
Stephen Boydc5492fc2012-06-18 18:47:03 -07001277 .rate = ULONG_MAX,
Vikram Mulukutla489e39e2011-08-31 18:04:05 -07001278 },
1279};
1280
Stephen Boyde04f0f72012-05-23 18:34:32 -07001281static struct rcg_clk sec_pcm_clk = {
1282 .b = {
1283 .ctl_reg = LCC_SEC_PCM_NS_REG,
1284 .en_mask = BIT(11),
1285 .reset_reg = LCC_SEC_PCM_NS_REG,
1286 .reset_mask = BIT(13),
1287 .halt_reg = LCC_SEC_PCM_STATUS_REG,
1288 .halt_check = ENABLE,
1289 .halt_bit = 0,
1290 },
1291 .ns_reg = LCC_SEC_PCM_NS_REG,
1292 .md_reg = LCC_SEC_PCM_MD_REG,
1293 .root_en_mask = BIT(9),
1294 .ns_mask = BM(31, 16) | BIT(10) | BM(6, 0),
1295 .mnd_en_mask = BIT(8),
1296 .set_rate = set_rate_mnd,
1297 .freq_tbl = clk_tbl_pcm,
1298 .current_freq = &rcg_dummy_freq,
1299 .c = {
1300 .dbg_name = "sec_pcm_clk",
1301 .ops = &clk_ops_rcg,
1302 VDD_DIG_FMAX_MAP1(LOW, 24576000),
1303 CLK_INIT(sec_pcm_clk.c),
1304 },
1305};
1306
Vikram Mulukutla489e39e2011-08-31 18:04:05 -07001307static struct rcg_clk audio_slimbus_clk = {
1308 .b = {
1309 .ctl_reg = LCC_SLIMBUS_NS_REG,
1310 .en_mask = BIT(10),
1311 .reset_reg = LCC_AHBEX_BRANCH_CTL_REG,
1312 .reset_mask = BIT(5),
1313 .halt_reg = LCC_SLIMBUS_STATUS_REG,
1314 .halt_check = ENABLE,
1315 .halt_bit = 0,
1316 },
1317 .ns_reg = LCC_SLIMBUS_NS_REG,
1318 .md_reg = LCC_SLIMBUS_MD_REG,
1319 .root_en_mask = BIT(9),
1320 .ns_mask = (BM(31, 24) | BM(6, 0)),
Matt Wagantall07c45472012-02-10 23:27:24 -08001321 .mnd_en_mask = BIT(8),
Vikram Mulukutla489e39e2011-08-31 18:04:05 -07001322 .set_rate = set_rate_mnd,
1323 .freq_tbl = clk_tbl_aif_osr,
1324 .current_freq = &rcg_dummy_freq,
1325 .c = {
1326 .dbg_name = "audio_slimbus_clk",
Stephen Boyd409b8b42012-04-10 12:12:56 -07001327 .ops = &clk_ops_rcg,
Matt Wagantalle18bbc82011-10-06 10:07:28 -07001328 VDD_DIG_FMAX_MAP1(LOW, 24576000),
Vikram Mulukutla489e39e2011-08-31 18:04:05 -07001329 CLK_INIT(audio_slimbus_clk.c),
1330 },
1331};
1332
1333static struct branch_clk sps_slimbus_clk = {
1334 .b = {
1335 .ctl_reg = LCC_SLIMBUS_NS_REG,
1336 .en_mask = BIT(12),
1337 .halt_reg = LCC_SLIMBUS_STATUS_REG,
1338 .halt_check = ENABLE,
1339 .halt_bit = 1,
1340 },
1341 .parent = &audio_slimbus_clk.c,
1342 .c = {
1343 .dbg_name = "sps_slimbus_clk",
1344 .ops = &clk_ops_branch,
1345 CLK_INIT(sps_slimbus_clk.c),
1346 },
1347};
1348
1349static struct branch_clk slimbus_xo_src_clk = {
1350 .b = {
1351 .ctl_reg = SLIMBUS_XO_SRC_CLK_CTL_REG,
1352 .en_mask = BIT(2),
1353 .halt_reg = CLK_HALT_DFAB_STATE_REG,
1354 .halt_bit = 28,
1355 },
1356 .parent = &sps_slimbus_clk.c,
1357 .c = {
1358 .dbg_name = "slimbus_xo_src_clk",
1359 .ops = &clk_ops_branch,
1360 CLK_INIT(slimbus_xo_src_clk.c),
1361 },
1362};
1363
Vikram Mulukutla73d42112011-09-19 16:32:54 -07001364DEFINE_CLK_RPM(cfpb_clk, cfpb_a_clk, CFPB, NULL);
1365DEFINE_CLK_RPM(dfab_clk, dfab_a_clk, DAYTONA_FABRIC, NULL);
1366DEFINE_CLK_RPM(ebi1_clk, ebi1_a_clk, EBI1, NULL);
1367DEFINE_CLK_RPM(sfab_clk, sfab_a_clk, SYSTEM_FABRIC, NULL);
1368DEFINE_CLK_RPM(sfpb_clk, sfpb_a_clk, SFPB, NULL);
1369
Matt Wagantall35e78fc2012-04-05 14:18:44 -07001370static DEFINE_CLK_VOTER(dfab_usb_hs_clk, &dfab_clk.c, 0);
1371static DEFINE_CLK_VOTER(dfab_sdc1_clk, &dfab_clk.c, 0);
1372static DEFINE_CLK_VOTER(dfab_sdc2_clk, &dfab_clk.c, 0);
1373static DEFINE_CLK_VOTER(dfab_sps_clk, &dfab_clk.c, 0);
1374static DEFINE_CLK_VOTER(dfab_bam_dmux_clk, &dfab_clk.c, 0);
1375static DEFINE_CLK_VOTER(dfab_msmbus_clk, &dfab_clk.c, 0);
1376static DEFINE_CLK_VOTER(dfab_msmbus_a_clk, &dfab_a_clk.c, 0);
Matt Wagantall42cd12a2012-03-30 18:02:40 -07001377static DEFINE_CLK_VOTER(ebi1_msmbus_clk, &ebi1_clk.c, LONG_MAX);
Matt Wagantall33bac7e2012-05-22 14:59:05 -07001378static DEFINE_CLK_VOTER(ebi1_msmbus_a_clk, &ebi1_a_clk.c, LONG_MAX);
1379static DEFINE_CLK_VOTER(ebi1_acpu_a_clk, &ebi1_a_clk.c, LONG_MAX);
Matt Wagantall35e78fc2012-04-05 14:18:44 -07001380static DEFINE_CLK_VOTER(ebi1_adm_clk, &ebi1_clk.c, 0);
Matt Wagantall33bac7e2012-05-22 14:59:05 -07001381static DEFINE_CLK_VOTER(sfab_msmbus_a_clk, &sfab_a_clk.c, LONG_MAX);
1382static DEFINE_CLK_VOTER(sfab_acpu_a_clk, &sfab_a_clk.c, LONG_MAX);
Vikram Mulukutla489e39e2011-08-31 18:04:05 -07001383
1384#ifdef CONFIG_DEBUG_FS
1385struct measure_sel {
1386 u32 test_vector;
Matt Wagantallf82f2942012-01-27 13:56:13 -08001387 struct clk *c;
Vikram Mulukutla489e39e2011-08-31 18:04:05 -07001388};
1389
Vikram Mulukutlaefd64f52012-01-09 17:41:09 -08001390static DEFINE_CLK_MEASURE(q6sw_clk);
1391static DEFINE_CLK_MEASURE(q6fw_clk);
1392static DEFINE_CLK_MEASURE(q6_func_clk);
1393
Vikram Mulukutla489e39e2011-08-31 18:04:05 -07001394static struct measure_sel measure_mux[] = {
1395 { TEST_PER_LS(0x08), &slimbus_xo_src_clk.c },
1396 { TEST_PER_LS(0x12), &sdc1_p_clk.c },
1397 { TEST_PER_LS(0x13), &sdc1_clk.c },
1398 { TEST_PER_LS(0x14), &sdc2_p_clk.c },
1399 { TEST_PER_LS(0x15), &sdc2_clk.c },
Matt Wagantall7625a4c2011-11-01 16:17:53 -07001400 { TEST_PER_LS(0x1F), &gp0_clk.c },
1401 { TEST_PER_LS(0x20), &gp1_clk.c },
1402 { TEST_PER_LS(0x21), &gp2_clk.c },
Vikram Mulukutla489e39e2011-08-31 18:04:05 -07001403 { TEST_PER_LS(0x26), &pmem_clk.c },
Vikram Mulukutla73d42112011-09-19 16:32:54 -07001404 { TEST_PER_LS(0x25), &dfab_clk.c },
1405 { TEST_PER_LS(0x25), &dfab_a_clk.c },
Vikram Mulukutla489e39e2011-08-31 18:04:05 -07001406 { TEST_PER_LS(0x32), &dma_bam_p_clk.c },
Vikram Mulukutla73d42112011-09-19 16:32:54 -07001407 { TEST_PER_LS(0x33), &cfpb_clk.c },
1408 { TEST_PER_LS(0x33), &cfpb_a_clk.c },
Vikram Mulukutla489e39e2011-08-31 18:04:05 -07001409 { TEST_PER_LS(0x3E), &gsbi1_uart_clk.c },
1410 { TEST_PER_LS(0x3F), &gsbi1_qup_clk.c },
1411 { TEST_PER_LS(0x41), &gsbi2_p_clk.c },
1412 { TEST_PER_LS(0x42), &gsbi2_uart_clk.c },
1413 { TEST_PER_LS(0x44), &gsbi2_qup_clk.c },
1414 { TEST_PER_LS(0x45), &gsbi3_p_clk.c },
1415 { TEST_PER_LS(0x46), &gsbi3_uart_clk.c },
1416 { TEST_PER_LS(0x48), &gsbi3_qup_clk.c },
1417 { TEST_PER_LS(0x49), &gsbi4_p_clk.c },
1418 { TEST_PER_LS(0x4A), &gsbi4_uart_clk.c },
1419 { TEST_PER_LS(0x4C), &gsbi4_qup_clk.c },
1420 { TEST_PER_LS(0x4D), &gsbi5_p_clk.c },
1421 { TEST_PER_LS(0x4E), &gsbi5_uart_clk.c },
1422 { TEST_PER_LS(0x50), &gsbi5_qup_clk.c },
Vikram Mulukutla73d42112011-09-19 16:32:54 -07001423 { TEST_PER_LS(0x78), &sfpb_clk.c },
1424 { TEST_PER_LS(0x78), &sfpb_a_clk.c },
Vikram Mulukutla489e39e2011-08-31 18:04:05 -07001425 { TEST_PER_LS(0x7A), &pmic_ssbi2_clk.c },
1426 { TEST_PER_LS(0x7B), &pmic_arb0_p_clk.c },
1427 { TEST_PER_LS(0x7C), &pmic_arb1_p_clk.c },
1428 { TEST_PER_LS(0x7D), &prng_clk.c },
1429 { TEST_PER_LS(0x7F), &rpm_msg_ram_p_clk.c },
1430 { TEST_PER_LS(0x80), &adm0_p_clk.c },
1431 { TEST_PER_LS(0x84), &usb_hs1_p_clk.c },
1432 { TEST_PER_LS(0x85), &usb_hs1_xcvr_clk.c },
1433 { TEST_PER_LS(0x86), &usb_hsic_sys_clk.c },
1434 { TEST_PER_LS(0x87), &usb_hsic_p_clk.c },
1435 { TEST_PER_LS(0x88), &usb_hsic_xcvr_clk.c },
1436 { TEST_PER_LS(0x8B), &usb_hsic_hsio_cal_clk.c },
1437 { TEST_PER_LS(0x8D), &usb_hs1_sys_clk.c },
1438 { TEST_PER_LS(0x92), &ce1_p_clk.c },
Vikram Mulukutla73d42112011-09-19 16:32:54 -07001439 { TEST_PER_HS(0x18), &sfab_clk.c },
1440 { TEST_PER_HS(0x18), &sfab_a_clk.c },
Vikram Mulukutlaefd64f52012-01-09 17:41:09 -08001441 { TEST_PER_HS(0x26), &q6sw_clk },
1442 { TEST_PER_HS(0x27), &q6fw_clk },
Vikram Mulukutla489e39e2011-08-31 18:04:05 -07001443 { TEST_PER_LS(0xA4), &ce1_core_clk.c },
1444 { TEST_PER_HS(0x2A), &adm0_clk.c },
Vikram Mulukutla73d42112011-09-19 16:32:54 -07001445 { TEST_PER_HS(0x34), &ebi1_clk.c },
1446 { TEST_PER_HS(0x34), &ebi1_a_clk.c },
Vikram Mulukutla6c9158f2011-12-08 12:41:20 -08001447 { TEST_PER_HS(0x3E), &usb_hsic_clk.c },
Vikram Mulukutla489e39e2011-08-31 18:04:05 -07001448 { TEST_LPA(0x0F), &mi2s_bit_clk.c },
1449 { TEST_LPA(0x10), &codec_i2s_mic_bit_clk.c },
1450 { TEST_LPA(0x11), &codec_i2s_spkr_bit_clk.c },
1451 { TEST_LPA(0x12), &spare_i2s_mic_bit_clk.c },
1452 { TEST_LPA(0x13), &spare_i2s_spkr_bit_clk.c },
1453 { TEST_LPA(0x14), &pcm_clk.c },
1454 { TEST_LPA(0x1D), &audio_slimbus_clk.c },
Vikram Mulukutlaefd64f52012-01-09 17:41:09 -08001455 { TEST_LPA_HS(0x00), &q6_func_clk },
Vikram Mulukutla489e39e2011-08-31 18:04:05 -07001456};
1457
Matt Wagantallf82f2942012-01-27 13:56:13 -08001458static struct measure_sel *find_measure_sel(struct clk *c)
Vikram Mulukutla489e39e2011-08-31 18:04:05 -07001459{
1460 int i;
1461
1462 for (i = 0; i < ARRAY_SIZE(measure_mux); i++)
Matt Wagantallf82f2942012-01-27 13:56:13 -08001463 if (measure_mux[i].c == c)
Vikram Mulukutla489e39e2011-08-31 18:04:05 -07001464 return &measure_mux[i];
1465 return NULL;
1466}
1467
1468static int measure_clk_set_parent(struct clk *c, struct clk *parent)
1469{
1470 int ret = 0;
1471 u32 clk_sel;
1472 struct measure_sel *p;
Matt Wagantallf82f2942012-01-27 13:56:13 -08001473 struct measure_clk *measure = to_measure_clk(c);
Vikram Mulukutla489e39e2011-08-31 18:04:05 -07001474 unsigned long flags;
1475
1476 if (!parent)
1477 return -EINVAL;
1478
1479 p = find_measure_sel(parent);
1480 if (!p)
1481 return -EINVAL;
1482
1483 spin_lock_irqsave(&local_clock_reg_lock, flags);
1484
1485 /*
1486 * Program the test vector, measurement period (sample_ticks)
1487 * and scaling multiplier.
1488 */
Matt Wagantallf82f2942012-01-27 13:56:13 -08001489 measure->sample_ticks = 0x10000;
Vikram Mulukutla489e39e2011-08-31 18:04:05 -07001490 clk_sel = p->test_vector & TEST_CLK_SEL_MASK;
Matt Wagantallf82f2942012-01-27 13:56:13 -08001491 measure->multiplier = 1;
Vikram Mulukutla489e39e2011-08-31 18:04:05 -07001492 switch (p->test_vector >> TEST_TYPE_SHIFT) {
1493 case TEST_TYPE_PER_LS:
1494 writel_relaxed(0x4030D00|BVAL(7, 0, clk_sel), CLK_TEST_REG);
1495 break;
1496 case TEST_TYPE_PER_HS:
1497 writel_relaxed(0x4020000|BVAL(16, 10, clk_sel), CLK_TEST_REG);
1498 break;
1499 case TEST_TYPE_LPA:
1500 writel_relaxed(0x4030D98, CLK_TEST_REG);
1501 writel_relaxed(BVAL(6, 1, clk_sel)|BIT(0),
1502 LCC_CLK_LS_DEBUG_CFG_REG);
1503 break;
Vikram Mulukutlaefd64f52012-01-09 17:41:09 -08001504 case TEST_TYPE_LPA_HS:
1505 writel_relaxed(0x402BC00, CLK_TEST_REG);
1506 writel_relaxed(BVAL(2, 1, clk_sel)|BIT(0),
1507 LCC_CLK_HS_DEBUG_CFG_REG);
1508 break;
Vikram Mulukutla489e39e2011-08-31 18:04:05 -07001509 default:
1510 ret = -EPERM;
1511 }
1512 /* Make sure test vector is set before starting measurements. */
1513 mb();
1514
1515 spin_unlock_irqrestore(&local_clock_reg_lock, flags);
1516
1517 return ret;
1518}
1519
1520/* Sample clock for 'ticks' reference clock ticks. */
Matt Wagantall9de3bfb2011-11-03 20:13:12 -07001521static unsigned long run_measurement(unsigned ticks)
Vikram Mulukutla489e39e2011-08-31 18:04:05 -07001522{
1523 /* Stop counters and set the XO4 counter start value. */
Vikram Mulukutla489e39e2011-08-31 18:04:05 -07001524 writel_relaxed(ticks, RINGOSC_TCXO_CTL_REG);
1525
1526 /* Wait for timer to become ready. */
1527 while ((readl_relaxed(RINGOSC_STATUS_REG) & BIT(25)) != 0)
1528 cpu_relax();
1529
1530 /* Run measurement and wait for completion. */
1531 writel_relaxed(BIT(28)|ticks, RINGOSC_TCXO_CTL_REG);
1532 while ((readl_relaxed(RINGOSC_STATUS_REG) & BIT(25)) == 0)
1533 cpu_relax();
1534
1535 /* Stop counters. */
1536 writel_relaxed(0x0, RINGOSC_TCXO_CTL_REG);
1537
1538 /* Return measured ticks. */
1539 return readl_relaxed(RINGOSC_STATUS_REG) & BM(24, 0);
1540}
1541
1542
1543/* Perform a hardware rate measurement for a given clock.
1544 FOR DEBUG USE ONLY: Measurements take ~15 ms! */
Matt Wagantall9de3bfb2011-11-03 20:13:12 -07001545static unsigned long measure_clk_get_rate(struct clk *c)
Vikram Mulukutla489e39e2011-08-31 18:04:05 -07001546{
1547 unsigned long flags;
1548 u32 pdm_reg_backup, ringosc_reg_backup;
1549 u64 raw_count_short, raw_count_full;
Matt Wagantallf82f2942012-01-27 13:56:13 -08001550 struct measure_clk *measure = to_measure_clk(c);
Vikram Mulukutla489e39e2011-08-31 18:04:05 -07001551 unsigned ret;
1552
1553 spin_lock_irqsave(&local_clock_reg_lock, flags);
1554
1555 /* Enable CXO/4 and RINGOSC branch and root. */
1556 pdm_reg_backup = readl_relaxed(PDM_CLK_NS_REG);
1557 ringosc_reg_backup = readl_relaxed(RINGOSC_NS_REG);
1558 writel_relaxed(0x2898, PDM_CLK_NS_REG);
1559 writel_relaxed(0xA00, RINGOSC_NS_REG);
1560
1561 /*
1562 * The ring oscillator counter will not reset if the measured clock
1563 * is not running. To detect this, run a short measurement before
1564 * the full measurement. If the raw results of the two are the same
1565 * then the clock must be off.
1566 */
1567
1568 /* Run a short measurement. (~1 ms) */
1569 raw_count_short = run_measurement(0x1000);
1570 /* Run a full measurement. (~14 ms) */
Matt Wagantallf82f2942012-01-27 13:56:13 -08001571 raw_count_full = run_measurement(measure->sample_ticks);
Vikram Mulukutla489e39e2011-08-31 18:04:05 -07001572
1573 writel_relaxed(ringosc_reg_backup, RINGOSC_NS_REG);
1574 writel_relaxed(pdm_reg_backup, PDM_CLK_NS_REG);
1575
1576 /* Return 0 if the clock is off. */
1577 if (raw_count_full == raw_count_short)
1578 ret = 0;
1579 else {
1580 /* Compute rate in Hz. */
1581 raw_count_full = ((raw_count_full * 10) + 15) * 4800000;
Matt Wagantallf82f2942012-01-27 13:56:13 -08001582 do_div(raw_count_full, ((measure->sample_ticks * 10) + 35));
1583 ret = (raw_count_full * measure->multiplier);
Vikram Mulukutla489e39e2011-08-31 18:04:05 -07001584 }
1585
1586 /* Route dbg_hs_clk to PLLTEST. 300mV single-ended amplitude. */
1587 writel_relaxed(0x38F8, PLLTEST_PAD_CFG_REG);
1588 spin_unlock_irqrestore(&local_clock_reg_lock, flags);
1589
1590 return ret;
1591}
1592#else /* !CONFIG_DEBUG_FS */
Matt Wagantallf82f2942012-01-27 13:56:13 -08001593static int measure_clk_set_parent(struct clk *c, struct clk *parent)
Vikram Mulukutla489e39e2011-08-31 18:04:05 -07001594{
1595 return -EINVAL;
1596}
1597
Matt Wagantallf82f2942012-01-27 13:56:13 -08001598static unsigned long measure_clk_get_rate(struct clk *c)
Vikram Mulukutla489e39e2011-08-31 18:04:05 -07001599{
1600 return 0;
1601}
1602#endif /* CONFIG_DEBUG_FS */
1603
Matt Wagantallae053222012-05-14 19:42:07 -07001604static struct clk_ops clk_ops_measure = {
Vikram Mulukutla489e39e2011-08-31 18:04:05 -07001605 .set_parent = measure_clk_set_parent,
1606 .get_rate = measure_clk_get_rate,
Vikram Mulukutla489e39e2011-08-31 18:04:05 -07001607};
1608
1609static struct measure_clk measure_clk = {
1610 .c = {
1611 .dbg_name = "measure_clk",
Matt Wagantallae053222012-05-14 19:42:07 -07001612 .ops = &clk_ops_measure,
Vikram Mulukutla489e39e2011-08-31 18:04:05 -07001613 CLK_INIT(measure_clk.c),
1614 },
1615 .multiplier = 1,
1616};
1617
1618static struct clk_lookup msm_clocks_9615[] = {
Stephen Boyd72a80352012-01-26 15:57:38 -08001619 CLK_LOOKUP("xo", cxo_a_clk.c, ""),
Stephen Boyd69d35e32012-02-14 15:33:30 -08001620 CLK_LOOKUP("xo", cxo_clk.c, "BAM_RMNT"),
Stephen Boyd5a190a82012-03-01 14:45:15 -08001621 CLK_LOOKUP("xo", cxo_clk.c, "msm_xo"),
David Collinsa7d23532012-08-02 10:48:16 -07001622 CLK_LOOKUP("vref_buff", cxo_clk.c, "rpm-regulator"),
Vikram Mulukutla489e39e2011-08-31 18:04:05 -07001623 CLK_LOOKUP("pll0", pll0_clk.c, NULL),
1624 CLK_LOOKUP("pll8", pll8_clk.c, NULL),
Vikram Mulukutla489e39e2011-08-31 18:04:05 -07001625 CLK_LOOKUP("pll14", pll14_clk.c, NULL),
Vikram Mulukutla31680ae2011-11-04 14:23:55 -07001626
Vikram Mulukutla128986a2012-07-10 13:32:08 -07001627 CLK_LOOKUP("pll0", pll0_activeonly_clk.c, "acpu"),
1628 CLK_LOOKUP("pll8", pll8_activeonly_clk.c, "acpu"),
1629 CLK_LOOKUP("pll9", pll9_activeonly_clk.c, "acpu"),
Vikram Mulukutla31680ae2011-11-04 14:23:55 -07001630
Vikram Mulukutla489e39e2011-08-31 18:04:05 -07001631 CLK_LOOKUP("measure", measure_clk.c, "debug"),
1632
Matt Wagantalld75f1312012-05-23 16:17:35 -07001633 CLK_LOOKUP("bus_clk", cfpb_clk.c, ""),
1634 CLK_LOOKUP("bus_clk", cfpb_a_clk.c, ""),
1635 CLK_LOOKUP("bus_clk", dfab_clk.c, ""),
1636 CLK_LOOKUP("bus_clk", dfab_a_clk.c, ""),
1637 CLK_LOOKUP("mem_clk", ebi1_clk.c, ""),
1638 CLK_LOOKUP("mem_clk", ebi1_a_clk.c, ""),
1639 CLK_LOOKUP("bus_clk", sfab_clk.c, ""),
1640 CLK_LOOKUP("bus_clk", sfab_a_clk.c, ""),
1641 CLK_LOOKUP("bus_clk", sfpb_clk.c, ""),
1642 CLK_LOOKUP("bus_clk", sfpb_a_clk.c, ""),
1643
Matt Wagantallb2710b82011-11-16 19:55:17 -08001644 CLK_LOOKUP("bus_clk", sfab_clk.c, "msm_sys_fab"),
Matt Wagantall33bac7e2012-05-22 14:59:05 -07001645 CLK_LOOKUP("bus_a_clk", sfab_msmbus_a_clk.c, "msm_sys_fab"),
Matt Wagantallb2710b82011-11-16 19:55:17 -08001646 CLK_LOOKUP("mem_clk", ebi1_msmbus_clk.c, "msm_bus"),
Matt Wagantall33bac7e2012-05-22 14:59:05 -07001647 CLK_LOOKUP("mem_a_clk", ebi1_msmbus_a_clk.c, "msm_bus"),
Gagan Macbc5f81d2012-04-04 15:03:12 -06001648 CLK_LOOKUP("dfab_clk", dfab_msmbus_clk.c, "msm_bus"),
1649 CLK_LOOKUP("dfab_a_clk", dfab_msmbus_a_clk.c, "msm_bus"),
Matt Wagantallb2710b82011-11-16 19:55:17 -08001650
Matt Wagantallc00f95d2012-01-05 14:22:45 -08001651 CLK_LOOKUP("core_clk", gp0_clk.c, ""),
1652 CLK_LOOKUP("core_clk", gp1_clk.c, ""),
1653 CLK_LOOKUP("core_clk", gp2_clk.c, ""),
Matt Wagantall7625a4c2011-11-01 16:17:53 -07001654
Matt Wagantallc00f95d2012-01-05 14:22:45 -08001655 CLK_LOOKUP("core_clk", gsbi3_uart_clk.c, ""),
Vikram Mulukutla489e39e2011-08-31 18:04:05 -07001656 CLK_LOOKUP("core_clk", gsbi4_uart_clk.c, "msm_serial_hsl.0"),
Matt Wagantallc00f95d2012-01-05 14:22:45 -08001657 CLK_LOOKUP("core_clk", gsbi5_uart_clk.c, ""),
Vikram Mulukutla489e39e2011-08-31 18:04:05 -07001658
Harini Jayaraman738c9312011-09-08 15:22:38 -06001659 CLK_LOOKUP("core_clk", gsbi3_qup_clk.c, "spi_qsd.0"),
Matt Wagantallc00f95d2012-01-05 14:22:45 -08001660 CLK_LOOKUP("core_clk", gsbi4_qup_clk.c, ""),
Harini Jayaramaneba52672011-09-08 15:13:00 -06001661 CLK_LOOKUP("core_clk", gsbi5_qup_clk.c, "qup_i2c.0"),
Vikram Mulukutla489e39e2011-08-31 18:04:05 -07001662
Matt Wagantallc00f95d2012-01-05 14:22:45 -08001663 CLK_LOOKUP("core_clk", pdm_clk.c, ""),
Vikram Mulukutladd0a2372011-09-19 15:58:21 -07001664 CLK_LOOKUP("mem_clk", pmem_clk.c, "msm_sps"),
Ramesh Masavarapu5ad37392011-10-10 10:44:10 -07001665 CLK_LOOKUP("core_clk", prng_clk.c, "msm_rng.0"),
Vikram Mulukutla489e39e2011-08-31 18:04:05 -07001666 CLK_LOOKUP("core_clk", sdc1_clk.c, "msm_sdcc.1"),
1667 CLK_LOOKUP("core_clk", sdc2_clk.c, "msm_sdcc.2"),
Matt Wagantallc00f95d2012-01-05 14:22:45 -08001668 CLK_LOOKUP("iface_clk", ce1_p_clk.c, ""),
1669 CLK_LOOKUP("core_clk", ce1_core_clk.c, ""),
Vikram Mulukutla489e39e2011-08-31 18:04:05 -07001670 CLK_LOOKUP("dma_bam_pclk", dma_bam_p_clk.c, NULL),
1671
Harini Jayaraman738c9312011-09-08 15:22:38 -06001672 CLK_LOOKUP("iface_clk", gsbi3_p_clk.c, "spi_qsd.0"),
Vikram Mulukutla489e39e2011-08-31 18:04:05 -07001673 CLK_LOOKUP("iface_clk", gsbi4_p_clk.c, "msm_serial_hsl.0"),
Harini Jayaramaneba52672011-09-08 15:13:00 -06001674 CLK_LOOKUP("iface_clk", gsbi5_p_clk.c, "qup_i2c.0"),
Vikram Mulukutla489e39e2011-08-31 18:04:05 -07001675
Manu Gautam5143b252012-01-05 19:25:23 -08001676 CLK_LOOKUP("iface_clk", usb_hs1_p_clk.c, "msm_otg"),
1677 CLK_LOOKUP("core_clk", usb_hs1_sys_clk.c, "msm_otg"),
1678 CLK_LOOKUP("alt_core_clk", usb_hs1_xcvr_clk.c, "msm_otg"),
1679 CLK_LOOKUP("alt_core_clk", usb_hsic_xcvr_clk.c, "msm_hsic_host"),
1680 CLK_LOOKUP("cal_clk", usb_hsic_hsio_cal_clk.c, "msm_hsic_host"),
1681 CLK_LOOKUP("core_clk", usb_hsic_sys_clk.c, "msm_hsic_host"),
1682 CLK_LOOKUP("iface_clk", usb_hsic_p_clk.c, "msm_hsic_host"),
1683 CLK_LOOKUP("phy_clk", usb_hsic_clk.c, "msm_hsic_host"),
Ofir Cohendf314b42012-01-15 11:59:34 +02001684 CLK_LOOKUP("alt_core_clk", usb_hsic_xcvr_clk.c, "msm_hsic_peripheral"),
1685 CLK_LOOKUP("cal_clk", usb_hsic_hsio_cal_clk.c, "msm_hsic_peripheral"),
1686 CLK_LOOKUP("core_clk", usb_hsic_sys_clk.c, "msm_hsic_peripheral"),
1687 CLK_LOOKUP("iface_clk", usb_hsic_p_clk.c, "msm_hsic_peripheral"),
1688 CLK_LOOKUP("phy_clk", usb_hsic_clk.c, "msm_hsic_peripheral"),
Vikram Mulukutla489e39e2011-08-31 18:04:05 -07001689
1690 CLK_LOOKUP("iface_clk", sdc1_p_clk.c, "msm_sdcc.1"),
1691 CLK_LOOKUP("iface_clk", sdc2_p_clk.c, "msm_sdcc.2"),
1692 CLK_LOOKUP("core_clk", adm0_clk.c, "msm_dmov"),
1693 CLK_LOOKUP("iface_clk", adm0_p_clk.c, "msm_dmov"),
Matt Wagantallc00f95d2012-01-05 14:22:45 -08001694 CLK_LOOKUP("iface_clk", pmic_arb0_p_clk.c, ""),
1695 CLK_LOOKUP("iface_clk", pmic_arb1_p_clk.c, ""),
1696 CLK_LOOKUP("core_clk", pmic_ssbi2_clk.c, ""),
1697 CLK_LOOKUP("mem_clk", rpm_msg_ram_p_clk.c, ""),
Kuirong Wanga9c3acc2012-02-09 17:00:45 -08001698 CLK_LOOKUP("bit_clk", mi2s_bit_clk.c, "msm-dai-q6.6"),
1699 CLK_LOOKUP("osr_clk", mi2s_osr_clk.c, "msm-dai-q6.6"),
Vikram Mulukutla489e39e2011-08-31 18:04:05 -07001700
Kuirong Wanga9c3acc2012-02-09 17:00:45 -08001701 CLK_LOOKUP("bit_clk", codec_i2s_mic_bit_clk.c,
1702 "msm-dai-q6.1"),
1703 CLK_LOOKUP("osr_clk", codec_i2s_mic_osr_clk.c,
1704 "msm-dai-q6.1"),
Venkat Sudhir5efc4912012-05-15 17:10:35 -07001705 CLK_LOOKUP("bit_clk", codec_i2s_spkr_bit_clk.c,
1706 "msm-dai-q6.0"),
1707 CLK_LOOKUP("osr_clk", codec_i2s_spkr_osr_clk.c,
1708 "msm-dai-q6.0"),
Kuirong Wanga9c3acc2012-02-09 17:00:45 -08001709 CLK_LOOKUP("bit_clk", spare_i2s_mic_bit_clk.c,
1710 "msm-dai-q6.5"),
1711 CLK_LOOKUP("osr_clk", spare_i2s_mic_osr_clk.c,
1712 "msm-dai-q6.5"),
1713 CLK_LOOKUP("bit_clk", codec_i2s_spkr_bit_clk.c,
1714 "msm-dai-q6.16384"),
1715 CLK_LOOKUP("osr_clk", codec_i2s_spkr_osr_clk.c,
1716 "msm-dai-q6.16384"),
1717 CLK_LOOKUP("bit_clk", spare_i2s_spkr_bit_clk.c,
1718 "msm-dai-q6.4"),
1719 CLK_LOOKUP("osr_clk", spare_i2s_spkr_osr_clk.c,
1720 "msm-dai-q6.4"),
1721 CLK_LOOKUP("pcm_clk", pcm_clk.c, "msm-dai-q6.2"),
Kiran Kandi5f4ab692012-02-23 11:23:56 -08001722 CLK_LOOKUP("pcm_clk", pcm_clk.c, "msm-dai-q6.3"),
Shiv Maliyappanahalli7f4dec52012-06-01 16:06:08 -07001723 CLK_LOOKUP("sec_pcm_clk", sec_pcm_clk.c, "msm-dai-q6.12"),
1724 CLK_LOOKUP("sec_pcm_clk", sec_pcm_clk.c, "msm-dai-q6.13"),
Vikram Mulukutla489e39e2011-08-31 18:04:05 -07001725
1726 CLK_LOOKUP("sps_slimbus_clk", sps_slimbus_clk.c, NULL),
Tianyi Gou44a81b02012-02-06 17:49:07 -08001727 CLK_LOOKUP("core_clk", audio_slimbus_clk.c, "msm_slim_ctrl.1"),
Manu Gautam5143b252012-01-05 19:25:23 -08001728 CLK_LOOKUP("core_clk", dfab_usb_hs_clk.c, "msm_otg"),
Vikram Mulukutla489e39e2011-08-31 18:04:05 -07001729 CLK_LOOKUP("bus_clk", dfab_sdc1_clk.c, "msm_sdcc.1"),
1730 CLK_LOOKUP("bus_clk", dfab_sdc2_clk.c, "msm_sdcc.2"),
1731 CLK_LOOKUP("dfab_clk", dfab_sps_clk.c, "msm_sps"),
Vikram Mulukutlacfd73ad2011-11-09 11:39:34 -08001732 CLK_LOOKUP("bus_clk", dfab_bam_dmux_clk.c, "BAM_RMNT"),
Vikram Mulukutla73d42112011-09-19 16:32:54 -07001733 CLK_LOOKUP("mem_clk", ebi1_adm_clk.c, "msm_dmov"),
Matt Wagantall33bac7e2012-05-22 14:59:05 -07001734 CLK_LOOKUP("mem_clk", ebi1_acpu_a_clk.c, ""),
1735 CLK_LOOKUP("bus_clk", sfab_acpu_a_clk.c, ""),
Vikram Mulukutla489e39e2011-08-31 18:04:05 -07001736
Ramesh Masavarapufa679d92011-10-13 23:42:59 -07001737 CLK_LOOKUP("iface_clk", ce1_p_clk.c, "qce.0"),
1738 CLK_LOOKUP("iface_clk", ce1_p_clk.c, "qcrypto.0"),
1739 CLK_LOOKUP("core_clk", ce1_core_clk.c, "qce.0"),
1740 CLK_LOOKUP("core_clk", ce1_core_clk.c, "qcrypto.0"),
1741
Vikram Mulukutlaefd64f52012-01-09 17:41:09 -08001742 CLK_LOOKUP("q6sw_clk", q6sw_clk, NULL),
1743 CLK_LOOKUP("q6fw_clk", q6fw_clk, NULL),
1744 CLK_LOOKUP("q6_func_clk", q6_func_clk, NULL),
Vikram Mulukutla489e39e2011-08-31 18:04:05 -07001745};
1746
Vikram Mulukutla5b146722012-04-23 18:17:50 -07001747static struct pll_config_regs pll0_regs __initdata = {
1748 .l_reg = BB_PLL0_L_VAL_REG,
1749 .m_reg = BB_PLL0_M_VAL_REG,
1750 .n_reg = BB_PLL0_N_VAL_REG,
1751 .config_reg = BB_PLL0_CONFIG_REG,
1752 .mode_reg = BB_PLL0_MODE_REG,
1753};
Vikram Mulukutla489e39e2011-08-31 18:04:05 -07001754
Vikram Mulukutla5b146722012-04-23 18:17:50 -07001755static struct pll_config pll0_config __initdata = {
1756 .l = 0xE,
1757 .m = 0x3,
1758 .n = 0x8,
1759 .vco_val = 0x0,
1760 .vco_mask = BM(17, 16),
1761 .pre_div_val = 0x0,
1762 .pre_div_mask = BIT(19),
1763 .post_div_val = 0x0,
1764 .post_div_mask = BM(21, 20),
1765 .mn_ena_val = BIT(22),
1766 .mn_ena_mask = BIT(22),
1767 .main_output_val = BIT(23),
1768 .main_output_mask = BIT(23),
1769};
Vikram Mulukutla489e39e2011-08-31 18:04:05 -07001770
Vikram Mulukutla5b146722012-04-23 18:17:50 -07001771static struct pll_config_regs pll14_regs __initdata = {
1772 .l_reg = BB_PLL14_L_VAL_REG,
1773 .m_reg = BB_PLL14_M_VAL_REG,
1774 .n_reg = BB_PLL14_N_VAL_REG,
1775 .config_reg = BB_PLL14_CONFIG_REG,
1776 .mode_reg = BB_PLL14_MODE_REG,
1777};
Vikram Mulukutla489e39e2011-08-31 18:04:05 -07001778
Vikram Mulukutla5b146722012-04-23 18:17:50 -07001779static struct pll_config pll14_config __initdata = {
1780 .l = 0x19,
1781 .m = 0x0,
1782 .n = 0x1,
1783 .vco_val = 0x0,
1784 .vco_mask = BM(17, 16),
1785 .pre_div_val = 0x0,
1786 .pre_div_mask = BIT(19),
1787 .post_div_val = 0x0,
1788 .post_div_mask = BM(21, 20),
1789 .main_output_val = BIT(23),
1790 .main_output_mask = BIT(23),
1791};
Vikram Mulukutla489e39e2011-08-31 18:04:05 -07001792
1793/*
1794 * Miscellaneous clock register initializations
1795 */
Matt Wagantallb64888f2012-04-02 21:35:07 -07001796static void __init msm9615_clock_pre_init(void)
Vikram Mulukutla489e39e2011-08-31 18:04:05 -07001797{
Vikram Mulukutla01d06b82012-01-10 14:19:44 -08001798 u32 regval, is_pll_enabled, pll9_lval;
Vikram Mulukutla489e39e2011-08-31 18:04:05 -07001799
Matt Wagantallb64888f2012-04-02 21:35:07 -07001800 vote_vdd_level(&vdd_dig, VDD_DIG_HIGH);
1801
Vikram Mulukutla681d8682012-03-09 23:56:20 -08001802 clk_ops_local_pll.enable = sr_pll_clk_enable;
Matt Wagantallb64888f2012-04-02 21:35:07 -07001803
Vikram Mulukutla489e39e2011-08-31 18:04:05 -07001804 /* Enable PDM CXO source. */
1805 regval = readl_relaxed(PDM_CLK_NS_REG);
1806 writel_relaxed(BIT(13) | regval, PDM_CLK_NS_REG);
1807
1808 /* Check if PLL0 is active */
1809 is_pll_enabled = readl_relaxed(BB_PLL0_STATUS_REG) & BIT(16);
1810
1811 if (!is_pll_enabled) {
Vikram Mulukutla489e39e2011-08-31 18:04:05 -07001812 /* Enable AUX output */
1813 regval = readl_relaxed(BB_PLL0_TEST_CTL_REG);
1814 regval |= BIT(12);
1815 writel_relaxed(regval, BB_PLL0_TEST_CTL_REG);
1816
Vikram Mulukutlae12adf62012-07-18 13:55:31 -07001817 configure_sr_pll(&pll0_config, &pll0_regs, 1);
Vikram Mulukutla489e39e2011-08-31 18:04:05 -07001818 }
1819
Vikram Mulukutla3349d932011-10-12 20:00:34 -07001820 /* Check if PLL14 is enabled in FSM mode */
1821 is_pll_enabled = readl_relaxed(BB_PLL14_STATUS_REG) & BIT(16);
1822
Vikram Mulukutla5b146722012-04-23 18:17:50 -07001823 if (!is_pll_enabled)
Vikram Mulukutlae12adf62012-07-18 13:55:31 -07001824 configure_sr_pll(&pll14_config, &pll14_regs, 1);
Vikram Mulukutla5b146722012-04-23 18:17:50 -07001825 else if (!(readl_relaxed(BB_PLL14_MODE_REG) & BIT(20)))
Vikram Mulukutla3349d932011-10-12 20:00:34 -07001826 WARN(1, "PLL14 enabled in non-FSM mode!\n");
1827
Vikram Mulukutla01d06b82012-01-10 14:19:44 -08001828 /* Detect PLL9 rate and fixup structure accordingly */
1829 pll9_lval = readl_relaxed(SC_PLL0_L_VAL_REG);
1830
1831 if (pll9_lval == 0x1C)
Vikram Mulukutla128986a2012-07-10 13:32:08 -07001832 pll9_activeonly_clk.c.rate = 550000000;
Vikram Mulukutla01d06b82012-01-10 14:19:44 -08001833
Vikram Mulukutla489e39e2011-08-31 18:04:05 -07001834 /* Enable PLL4 source on the LPASS Primary PLL Mux */
1835 regval = readl_relaxed(LCC_PRI_PLL_CLK_CTL_REG);
1836 writel_relaxed(regval | BIT(0), LCC_PRI_PLL_CLK_CTL_REG);
Vikram Mulukutla0ee27882011-11-15 18:25:04 -08001837
Matt Wagantallbc8c9062012-02-07 12:33:06 -08001838 /*
1839 * Disable hardware clock gating for pmem_clk. Leaving it enabled
1840 * results in the clock staying on.
1841 */
1842 regval = readl_relaxed(PMEM_ACLK_CTL_REG);
Vikram Mulukutla0ee27882011-11-15 18:25:04 -08001843 regval &= ~BIT(6);
Matt Wagantallbc8c9062012-02-07 12:33:06 -08001844 writel_relaxed(regval, PMEM_ACLK_CTL_REG);
Matt Wagantallebbb29f2012-02-13 14:45:46 -08001845
1846 /*
1847 * Disable hardware clock gating for dma_bam_p_clk, which does
1848 * not have working support for the feature.
1849 */
1850 regval = readl_relaxed(DMA_BAM_HCLK_CTL);
1851 regval &= ~BIT(6);
1852 writel_relaxed(regval, DMA_BAM_HCLK_CTL);
Vikram Mulukutla489e39e2011-08-31 18:04:05 -07001853}
1854
Matt Wagantallb64888f2012-04-02 21:35:07 -07001855static void __init msm9615_clock_post_init(void)
Vikram Mulukutla489e39e2011-08-31 18:04:05 -07001856{
Stephen Boyd72a80352012-01-26 15:57:38 -08001857 /* Keep CXO on whenever APPS cpu is active */
1858 clk_prepare_enable(&cxo_a_clk.c);
Vikram Mulukutla489e39e2011-08-31 18:04:05 -07001859
Vikram Mulukutla489e39e2011-08-31 18:04:05 -07001860 /* Initialize rates for clocks that only support one. */
1861 clk_set_rate(&pdm_clk.c, 19200000);
1862 clk_set_rate(&prng_clk.c, 32000000);
1863 clk_set_rate(&usb_hs1_xcvr_clk.c, 60000000);
1864 clk_set_rate(&usb_hs1_sys_clk.c, 60000000);
1865 clk_set_rate(&usb_hsic_xcvr_clk.c, 60000000);
Vikram Mulukutla6c9158f2011-12-08 12:41:20 -08001866 clk_set_rate(&usb_hsic_sys_clk.c, 64000000);
1867 clk_set_rate(&usb_hsic_clk.c, 480000000);
Vikram Mulukutla489e39e2011-08-31 18:04:05 -07001868
1869 /*
1870 * The halt status bits for PDM may be incorrect at boot.
1871 * Toggle these clocks on and off to refresh them.
1872 */
Stephen Boyd409b8b42012-04-10 12:12:56 -07001873 clk_prepare_enable(&pdm_clk.c);
1874 clk_disable_unprepare(&pdm_clk.c);
Vikram Mulukutla489e39e2011-08-31 18:04:05 -07001875}
1876
1877static int __init msm9615_clock_late_init(void)
1878{
Matt Wagantalle18bbc82011-10-06 10:07:28 -07001879 return unvote_vdd_level(&vdd_dig, VDD_DIG_HIGH);
Vikram Mulukutla489e39e2011-08-31 18:04:05 -07001880}
1881
1882struct clock_init_data msm9615_clock_init_data __initdata = {
1883 .table = msm_clocks_9615,
1884 .size = ARRAY_SIZE(msm_clocks_9615),
Matt Wagantallb64888f2012-04-02 21:35:07 -07001885 .pre_init = msm9615_clock_pre_init,
1886 .post_init = msm9615_clock_post_init,
Vikram Mulukutla489e39e2011-08-31 18:04:05 -07001887 .late_init = msm9615_clock_late_init,
1888};