blob: 1fd9b4d6ae1a0b08be5495661120cf8ed668e96d [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
Vikram Mulukutla5a8fad62012-04-17 05:45:38 -0700156#define pll8_acpu_to_bb_mux 3
Vikram Mulukutla489e39e2011-08-31 18:04:05 -0700157#define pll14_to_bb_mux 4
158#define gnd_to_bb_mux 6
159#define cxo_to_xo_mux 0
160#define gnd_to_xo_mux 3
161#define cxo_to_lpa_mux 1
162#define pll4_to_lpa_mux 2
163#define gnd_to_lpa_mux 6
164
165/* Test Vector Macros */
166#define TEST_TYPE_PER_LS 1
167#define TEST_TYPE_PER_HS 2
168#define TEST_TYPE_LPA 5
Vikram Mulukutlaefd64f52012-01-09 17:41:09 -0800169#define TEST_TYPE_LPA_HS 6
Vikram Mulukutla489e39e2011-08-31 18:04:05 -0700170#define TEST_TYPE_SHIFT 24
171#define TEST_CLK_SEL_MASK BM(23, 0)
172#define TEST_VECTOR(s, t) (((t) << TEST_TYPE_SHIFT) | BVAL(23, 0, (s)))
173#define TEST_PER_LS(s) TEST_VECTOR((s), TEST_TYPE_PER_LS)
174#define TEST_PER_HS(s) TEST_VECTOR((s), TEST_TYPE_PER_HS)
175#define TEST_LPA(s) TEST_VECTOR((s), TEST_TYPE_LPA)
Vikram Mulukutlaefd64f52012-01-09 17:41:09 -0800176#define TEST_LPA_HS(s) TEST_VECTOR((s), TEST_TYPE_LPA_HS)
Vikram Mulukutla489e39e2011-08-31 18:04:05 -0700177
Matt Wagantalle18bbc82011-10-06 10:07:28 -0700178enum vdd_dig_levels {
179 VDD_DIG_NONE,
180 VDD_DIG_LOW,
181 VDD_DIG_NOMINAL,
182 VDD_DIG_HIGH
183};
184
185static int set_vdd_dig(struct clk_vdd_class *vdd_class, int level)
186{
Matt Wagantalle18bbc82011-10-06 10:07:28 -0700187 static const int vdd_uv[] = {
Vikram Mulukutla5e6ab912011-11-04 15:20:19 -0700188 [VDD_DIG_NONE] = 0,
189 [VDD_DIG_LOW] = 945000,
190 [VDD_DIG_NOMINAL] = 1050000,
Matt Wagantalle18bbc82011-10-06 10:07:28 -0700191 [VDD_DIG_HIGH] = 1150000
192 };
193
194 return rpm_vreg_set_voltage(RPM_VREG_ID_PM8018_S1, RPM_VREG_VOTER3,
195 vdd_uv[level], vdd_uv[VDD_DIG_HIGH], 1);
196}
197
198static DEFINE_VDD_CLASS(vdd_dig, set_vdd_dig);
199
200#define VDD_DIG_FMAX_MAP1(l1, f1) \
201 .vdd_class = &vdd_dig, \
202 .fmax[VDD_DIG_##l1] = (f1)
203#define VDD_DIG_FMAX_MAP2(l1, f1, l2, f2) \
204 .vdd_class = &vdd_dig, \
205 .fmax[VDD_DIG_##l1] = (f1), \
206 .fmax[VDD_DIG_##l2] = (f2)
Vikram Mulukutla489e39e2011-08-31 18:04:05 -0700207
208/*
209 * Clock Descriptions
210 */
211
Stephen Boyd72a80352012-01-26 15:57:38 -0800212DEFINE_CLK_RPM_BRANCH(cxo_clk, cxo_a_clk, CXO, 19200000);
Vikram Mulukutla489e39e2011-08-31 18:04:05 -0700213
Vikram Mulukutla31680ae2011-11-04 14:23:55 -0700214static DEFINE_SPINLOCK(soft_vote_lock);
215
216static int pll_acpu_vote_clk_enable(struct clk *clk)
217{
218 int ret = 0;
219 unsigned long flags;
220 struct pll_vote_clk *pll = to_pll_vote_clk(clk);
221
222 spin_lock_irqsave(&soft_vote_lock, flags);
223
224 if (!*pll->soft_vote)
225 ret = pll_vote_clk_enable(clk);
226 if (ret == 0)
227 *pll->soft_vote |= (pll->soft_vote_mask);
228
229 spin_unlock_irqrestore(&soft_vote_lock, flags);
230 return ret;
231}
232
233static void pll_acpu_vote_clk_disable(struct clk *clk)
234{
235 unsigned long flags;
236 struct pll_vote_clk *pll = to_pll_vote_clk(clk);
237
238 spin_lock_irqsave(&soft_vote_lock, flags);
239
240 *pll->soft_vote &= ~(pll->soft_vote_mask);
241 if (!*pll->soft_vote)
242 pll_vote_clk_disable(clk);
243
244 spin_unlock_irqrestore(&soft_vote_lock, flags);
245}
246
247static struct clk_ops clk_ops_pll_acpu_vote = {
248 .enable = pll_acpu_vote_clk_enable,
249 .disable = pll_acpu_vote_clk_disable,
250 .auto_off = pll_acpu_vote_clk_disable,
251 .is_enabled = pll_vote_clk_is_enabled,
Vikram Mulukutla31680ae2011-11-04 14:23:55 -0700252 .get_parent = pll_vote_clk_get_parent,
Vikram Mulukutla31680ae2011-11-04 14:23:55 -0700253};
254
255#define PLL_SOFT_VOTE_PRIMARY BIT(0)
256#define PLL_SOFT_VOTE_ACPU BIT(1)
257
258static unsigned int soft_vote_pll0;
259
Vikram Mulukutla489e39e2011-08-31 18:04:05 -0700260static struct pll_vote_clk pll0_clk = {
Vikram Mulukutla489e39e2011-08-31 18:04:05 -0700261 .en_reg = BB_PLL_ENA_SC0_REG,
262 .en_mask = BIT(0),
263 .status_reg = BB_PLL0_STATUS_REG,
Vikram Mulukutla681d8682012-03-09 23:56:20 -0800264 .status_mask = BIT(16),
Vikram Mulukutla489e39e2011-08-31 18:04:05 -0700265 .parent = &cxo_clk.c,
Vikram Mulukutla31680ae2011-11-04 14:23:55 -0700266 .soft_vote = &soft_vote_pll0,
267 .soft_vote_mask = PLL_SOFT_VOTE_PRIMARY,
Vikram Mulukutla489e39e2011-08-31 18:04:05 -0700268 .c = {
269 .dbg_name = "pll0_clk",
Tianyi Gou7949ecb2012-02-14 14:25:32 -0800270 .rate = 276000000,
Vikram Mulukutla31680ae2011-11-04 14:23:55 -0700271 .ops = &clk_ops_pll_acpu_vote,
Vikram Mulukutla489e39e2011-08-31 18:04:05 -0700272 CLK_INIT(pll0_clk.c),
Stephen Boyd3bbf3462012-01-12 00:19:23 -0800273 .warned = true,
Vikram Mulukutla489e39e2011-08-31 18:04:05 -0700274 },
275};
276
Vikram Mulukutla31680ae2011-11-04 14:23:55 -0700277static struct pll_vote_clk pll0_acpu_clk = {
Vikram Mulukutla31680ae2011-11-04 14:23:55 -0700278 .en_reg = BB_PLL_ENA_SC0_REG,
279 .en_mask = BIT(0),
280 .status_reg = BB_PLL0_STATUS_REG,
Vikram Mulukutla681d8682012-03-09 23:56:20 -0800281 .status_mask = BIT(16),
Vikram Mulukutla31680ae2011-11-04 14:23:55 -0700282 .soft_vote = &soft_vote_pll0,
283 .soft_vote_mask = PLL_SOFT_VOTE_ACPU,
284 .c = {
285 .dbg_name = "pll0_acpu_clk",
Tianyi Gou7949ecb2012-02-14 14:25:32 -0800286 .rate = 276000000,
Vikram Mulukutla31680ae2011-11-04 14:23:55 -0700287 .ops = &clk_ops_pll_acpu_vote,
288 CLK_INIT(pll0_acpu_clk.c),
Stephen Boyd3bbf3462012-01-12 00:19:23 -0800289 .warned = true,
Vikram Mulukutla31680ae2011-11-04 14:23:55 -0700290 },
291};
292
Vikram Mulukutla489e39e2011-08-31 18:04:05 -0700293static struct pll_vote_clk pll4_clk = {
Vikram Mulukutla489e39e2011-08-31 18:04:05 -0700294 .en_reg = BB_PLL_ENA_SC0_REG,
295 .en_mask = BIT(4),
296 .status_reg = LCC_PLL0_STATUS_REG,
Vikram Mulukutla681d8682012-03-09 23:56:20 -0800297 .status_mask = BIT(16),
Vikram Mulukutla489e39e2011-08-31 18:04:05 -0700298 .parent = &cxo_clk.c,
299 .c = {
300 .dbg_name = "pll4_clk",
Tianyi Gou7949ecb2012-02-14 14:25:32 -0800301 .rate = 393216000,
Vikram Mulukutla489e39e2011-08-31 18:04:05 -0700302 .ops = &clk_ops_pll_vote,
303 CLK_INIT(pll4_clk.c),
Stephen Boyd3bbf3462012-01-12 00:19:23 -0800304 .warned = true,
Vikram Mulukutla489e39e2011-08-31 18:04:05 -0700305 },
306};
307
Vikram Mulukutla31680ae2011-11-04 14:23:55 -0700308static unsigned int soft_vote_pll8;
309
Vikram Mulukutla489e39e2011-08-31 18:04:05 -0700310static struct pll_vote_clk pll8_clk = {
Vikram Mulukutla489e39e2011-08-31 18:04:05 -0700311 .en_reg = BB_PLL_ENA_SC0_REG,
312 .en_mask = BIT(8),
313 .status_reg = BB_PLL8_STATUS_REG,
Vikram Mulukutla681d8682012-03-09 23:56:20 -0800314 .status_mask = BIT(16),
Vikram Mulukutla489e39e2011-08-31 18:04:05 -0700315 .parent = &cxo_clk.c,
Vikram Mulukutla31680ae2011-11-04 14:23:55 -0700316 .soft_vote = &soft_vote_pll8,
317 .soft_vote_mask = PLL_SOFT_VOTE_PRIMARY,
Vikram Mulukutla489e39e2011-08-31 18:04:05 -0700318 .c = {
319 .dbg_name = "pll8_clk",
Tianyi Gou7949ecb2012-02-14 14:25:32 -0800320 .rate = 384000000,
Vikram Mulukutla31680ae2011-11-04 14:23:55 -0700321 .ops = &clk_ops_pll_acpu_vote,
Vikram Mulukutla489e39e2011-08-31 18:04:05 -0700322 CLK_INIT(pll8_clk.c),
Stephen Boyd3bbf3462012-01-12 00:19:23 -0800323 .warned = true,
Vikram Mulukutla489e39e2011-08-31 18:04:05 -0700324 },
325};
326
Vikram Mulukutla31680ae2011-11-04 14:23:55 -0700327static struct pll_vote_clk pll8_acpu_clk = {
Vikram Mulukutla31680ae2011-11-04 14:23:55 -0700328 .en_reg = BB_PLL_ENA_SC0_REG,
329 .en_mask = BIT(8),
330 .status_reg = BB_PLL8_STATUS_REG,
Vikram Mulukutla681d8682012-03-09 23:56:20 -0800331 .status_mask = BIT(16),
Vikram Mulukutla31680ae2011-11-04 14:23:55 -0700332 .soft_vote = &soft_vote_pll8,
333 .soft_vote_mask = PLL_SOFT_VOTE_ACPU,
334 .c = {
335 .dbg_name = "pll8_acpu_clk",
Tianyi Gou7949ecb2012-02-14 14:25:32 -0800336 .rate = 384000000,
Vikram Mulukutla31680ae2011-11-04 14:23:55 -0700337 .ops = &clk_ops_pll_acpu_vote,
338 CLK_INIT(pll8_acpu_clk.c),
Stephen Boyd3bbf3462012-01-12 00:19:23 -0800339 .warned = true,
Vikram Mulukutla31680ae2011-11-04 14:23:55 -0700340 },
341};
342
Vikram Mulukutla266551f2012-01-11 12:32:58 -0800343static struct pll_clk pll9_acpu_clk = {
Vikram Mulukutla266551f2012-01-11 12:32:58 -0800344 .mode_reg = SC_PLL0_MODE_REG,
Vikram Mulukutla31680ae2011-11-04 14:23:55 -0700345 .c = {
346 .dbg_name = "pll9_acpu_clk",
Tianyi Gou7949ecb2012-02-14 14:25:32 -0800347 .rate = 440000000,
Vikram Mulukutla681d8682012-03-09 23:56:20 -0800348 .ops = &clk_ops_local_pll,
Vikram Mulukutla31680ae2011-11-04 14:23:55 -0700349 CLK_INIT(pll9_acpu_clk.c),
Stephen Boyd3bbf3462012-01-12 00:19:23 -0800350 .warned = true,
Vikram Mulukutla31680ae2011-11-04 14:23:55 -0700351 },
352};
353
Vikram Mulukutla489e39e2011-08-31 18:04:05 -0700354static struct pll_vote_clk pll14_clk = {
Vikram Mulukutla489e39e2011-08-31 18:04:05 -0700355 .en_reg = BB_PLL_ENA_SC0_REG,
356 .en_mask = BIT(11),
357 .status_reg = BB_PLL14_STATUS_REG,
Vikram Mulukutla681d8682012-03-09 23:56:20 -0800358 .status_mask = BIT(16),
Vikram Mulukutla489e39e2011-08-31 18:04:05 -0700359 .parent = &cxo_clk.c,
360 .c = {
361 .dbg_name = "pll14_clk",
Tianyi Gou7949ecb2012-02-14 14:25:32 -0800362 .rate = 480000000,
Vikram Mulukutla489e39e2011-08-31 18:04:05 -0700363 .ops = &clk_ops_pll_vote,
364 CLK_INIT(pll14_clk.c),
Stephen Boyd3bbf3462012-01-12 00:19:23 -0800365 .warned = true,
Vikram Mulukutla489e39e2011-08-31 18:04:05 -0700366 },
367};
368
Vikram Mulukutla489e39e2011-08-31 18:04:05 -0700369/*
370 * Peripheral Clocks
371 */
Matt Wagantall7625a4c2011-11-01 16:17:53 -0700372#define CLK_GP(i, n, h_r, h_b) \
373 struct rcg_clk i##_clk = { \
374 .b = { \
375 .ctl_reg = GPn_NS_REG(n), \
376 .en_mask = BIT(9), \
377 .halt_reg = h_r, \
378 .halt_bit = h_b, \
379 }, \
380 .ns_reg = GPn_NS_REG(n), \
381 .md_reg = GPn_MD_REG(n), \
382 .root_en_mask = BIT(11), \
383 .ns_mask = (BM(23, 16) | BM(6, 0)), \
Matt Wagantall07c45472012-02-10 23:27:24 -0800384 .mnd_en_mask = BIT(8), \
Matt Wagantall7625a4c2011-11-01 16:17:53 -0700385 .set_rate = set_rate_mnd, \
386 .freq_tbl = clk_tbl_gp, \
387 .current_freq = &rcg_dummy_freq, \
388 .c = { \
389 .dbg_name = #i "_clk", \
Stephen Boyd409b8b42012-04-10 12:12:56 -0700390 .ops = &clk_ops_rcg, \
Matt Wagantall7625a4c2011-11-01 16:17:53 -0700391 VDD_DIG_FMAX_MAP1(LOW, 27000000), \
392 CLK_INIT(i##_clk.c), \
393 }, \
394 }
395#define F_GP(f, s, d, m, n) \
396 { \
397 .freq_hz = f, \
398 .src_clk = &s##_clk.c, \
399 .md_val = MD8(16, m, 0, n), \
400 .ns_val = NS(23, 16, n, m, 5, 4, 3, d, 2, 0, s##_to_bb_mux), \
Matt Wagantall7625a4c2011-11-01 16:17:53 -0700401 }
402static struct clk_freq_tbl clk_tbl_gp[] = {
403 F_GP( 0, gnd, 1, 0, 0),
404 F_GP( 9600000, cxo, 2, 0, 0),
405 F_GP( 19200000, cxo, 1, 0, 0),
406 F_END
407};
408
409static CLK_GP(gp0, 0, CLK_HALT_SFPB_MISC_STATE_REG, 7);
410static CLK_GP(gp1, 1, CLK_HALT_SFPB_MISC_STATE_REG, 6);
411static CLK_GP(gp2, 2, CLK_HALT_SFPB_MISC_STATE_REG, 5);
412
Vikram Mulukutla489e39e2011-08-31 18:04:05 -0700413#define CLK_GSBI_UART(i, n, h_r, h_b) \
414 struct rcg_clk i##_clk = { \
415 .b = { \
416 .ctl_reg = GSBIn_UART_APPS_NS_REG(n), \
417 .en_mask = BIT(9), \
418 .reset_reg = GSBIn_RESET_REG(n), \
419 .reset_mask = BIT(0), \
420 .halt_reg = h_r, \
421 .halt_bit = h_b, \
422 }, \
423 .ns_reg = GSBIn_UART_APPS_NS_REG(n), \
424 .md_reg = GSBIn_UART_APPS_MD_REG(n), \
425 .root_en_mask = BIT(11), \
426 .ns_mask = (BM(31, 16) | BM(6, 0)), \
Matt Wagantall07c45472012-02-10 23:27:24 -0800427 .mnd_en_mask = BIT(8), \
Vikram Mulukutla489e39e2011-08-31 18:04:05 -0700428 .set_rate = set_rate_mnd, \
429 .freq_tbl = clk_tbl_gsbi_uart, \
430 .current_freq = &rcg_dummy_freq, \
431 .c = { \
432 .dbg_name = #i "_clk", \
Stephen Boyd409b8b42012-04-10 12:12:56 -0700433 .ops = &clk_ops_rcg, \
Matt Wagantalle18bbc82011-10-06 10:07:28 -0700434 VDD_DIG_FMAX_MAP2(LOW, 32000000, NOMINAL, 64000000), \
Vikram Mulukutla489e39e2011-08-31 18:04:05 -0700435 CLK_INIT(i##_clk.c), \
436 }, \
437 }
Matt Wagantalle18bbc82011-10-06 10:07:28 -0700438#define F_GSBI_UART(f, s, d, m, n) \
Vikram Mulukutla489e39e2011-08-31 18:04:05 -0700439 { \
440 .freq_hz = f, \
441 .src_clk = &s##_clk.c, \
442 .md_val = MD16(m, n), \
443 .ns_val = NS(31, 16, n, m, 5, 4, 3, d, 2, 0, s##_to_bb_mux), \
Vikram Mulukutla489e39e2011-08-31 18:04:05 -0700444 }
445static struct clk_freq_tbl clk_tbl_gsbi_uart[] = {
Matt Wagantalle18bbc82011-10-06 10:07:28 -0700446 F_GSBI_UART( 0, gnd, 1, 0, 0),
Matt Wagantall9a561f72012-01-19 16:13:12 -0800447 F_GSBI_UART( 3686400, pll8, 2, 12, 625),
448 F_GSBI_UART( 7372800, pll8, 2, 24, 625),
449 F_GSBI_UART(14745600, pll8, 2, 48, 625),
Matt Wagantalle18bbc82011-10-06 10:07:28 -0700450 F_GSBI_UART(16000000, pll8, 4, 1, 6),
451 F_GSBI_UART(24000000, pll8, 4, 1, 4),
452 F_GSBI_UART(32000000, pll8, 4, 1, 3),
453 F_GSBI_UART(40000000, pll8, 1, 5, 48),
454 F_GSBI_UART(46400000, pll8, 1, 29, 240),
455 F_GSBI_UART(48000000, pll8, 4, 1, 2),
456 F_GSBI_UART(51200000, pll8, 1, 2, 15),
457 F_GSBI_UART(56000000, pll8, 1, 7, 48),
458 F_GSBI_UART(58982400, pll8, 1, 96, 625),
459 F_GSBI_UART(64000000, pll8, 2, 1, 3),
Vikram Mulukutla489e39e2011-08-31 18:04:05 -0700460 F_END
461};
462
463static CLK_GSBI_UART(gsbi1_uart, 1, CLK_HALT_CFPB_STATEA_REG, 10);
464static CLK_GSBI_UART(gsbi2_uart, 2, CLK_HALT_CFPB_STATEA_REG, 6);
465static CLK_GSBI_UART(gsbi3_uart, 3, CLK_HALT_CFPB_STATEA_REG, 2);
466static CLK_GSBI_UART(gsbi4_uart, 4, CLK_HALT_CFPB_STATEB_REG, 26);
467static CLK_GSBI_UART(gsbi5_uart, 5, CLK_HALT_CFPB_STATEB_REG, 22);
468
469#define CLK_GSBI_QUP(i, n, h_r, h_b) \
470 struct rcg_clk i##_clk = { \
471 .b = { \
472 .ctl_reg = GSBIn_QUP_APPS_NS_REG(n), \
473 .en_mask = BIT(9), \
474 .reset_reg = GSBIn_RESET_REG(n), \
475 .reset_mask = BIT(0), \
476 .halt_reg = h_r, \
477 .halt_bit = h_b, \
478 }, \
479 .ns_reg = GSBIn_QUP_APPS_NS_REG(n), \
480 .md_reg = GSBIn_QUP_APPS_MD_REG(n), \
481 .root_en_mask = BIT(11), \
482 .ns_mask = (BM(23, 16) | BM(6, 0)), \
Matt Wagantall07c45472012-02-10 23:27:24 -0800483 .mnd_en_mask = BIT(8), \
Vikram Mulukutla489e39e2011-08-31 18:04:05 -0700484 .set_rate = set_rate_mnd, \
485 .freq_tbl = clk_tbl_gsbi_qup, \
486 .current_freq = &rcg_dummy_freq, \
487 .c = { \
488 .dbg_name = #i "_clk", \
Stephen Boyd409b8b42012-04-10 12:12:56 -0700489 .ops = &clk_ops_rcg, \
Matt Wagantalle18bbc82011-10-06 10:07:28 -0700490 VDD_DIG_FMAX_MAP2(LOW, 24000000, NOMINAL, 52000000), \
Vikram Mulukutla489e39e2011-08-31 18:04:05 -0700491 CLK_INIT(i##_clk.c), \
492 }, \
493 }
Matt Wagantalle18bbc82011-10-06 10:07:28 -0700494#define F_GSBI_QUP(f, s, d, m, n) \
Vikram Mulukutla489e39e2011-08-31 18:04:05 -0700495 { \
496 .freq_hz = f, \
497 .src_clk = &s##_clk.c, \
498 .md_val = MD8(16, m, 0, n), \
499 .ns_val = NS(23, 16, n, m, 5, 4, 3, d, 2, 0, s##_to_bb_mux), \
Vikram Mulukutla489e39e2011-08-31 18:04:05 -0700500 }
501static struct clk_freq_tbl clk_tbl_gsbi_qup[] = {
Matt Wagantalle18bbc82011-10-06 10:07:28 -0700502 F_GSBI_QUP( 0, gnd, 1, 0, 0),
503 F_GSBI_QUP( 960000, cxo, 4, 1, 5),
504 F_GSBI_QUP( 4800000, cxo, 4, 0, 1),
505 F_GSBI_QUP( 9600000, cxo, 2, 0, 1),
506 F_GSBI_QUP(15058800, pll8, 1, 2, 51),
507 F_GSBI_QUP(24000000, pll8, 4, 1, 4),
508 F_GSBI_QUP(25600000, pll8, 1, 1, 15),
509 F_GSBI_QUP(48000000, pll8, 4, 1, 2),
510 F_GSBI_QUP(51200000, pll8, 1, 2, 15),
Vikram Mulukutla489e39e2011-08-31 18:04:05 -0700511 F_END
512};
513
514static CLK_GSBI_QUP(gsbi1_qup, 1, CLK_HALT_CFPB_STATEA_REG, 9);
515static CLK_GSBI_QUP(gsbi2_qup, 2, CLK_HALT_CFPB_STATEA_REG, 4);
516static CLK_GSBI_QUP(gsbi3_qup, 3, CLK_HALT_CFPB_STATEA_REG, 0);
517static CLK_GSBI_QUP(gsbi4_qup, 4, CLK_HALT_CFPB_STATEB_REG, 24);
518static CLK_GSBI_QUP(gsbi5_qup, 5, CLK_HALT_CFPB_STATEB_REG, 20);
519
Matt Wagantalle18bbc82011-10-06 10:07:28 -0700520#define F_PDM(f, s, d) \
Vikram Mulukutla489e39e2011-08-31 18:04:05 -0700521 { \
522 .freq_hz = f, \
523 .src_clk = &s##_clk.c, \
524 .ns_val = NS_SRC_SEL(1, 0, s##_to_xo_mux), \
Vikram Mulukutla489e39e2011-08-31 18:04:05 -0700525 }
526static struct clk_freq_tbl clk_tbl_pdm[] = {
Matt Wagantalle18bbc82011-10-06 10:07:28 -0700527 F_PDM( 0, gnd, 1),
528 F_PDM(19200000, cxo, 1),
Vikram Mulukutla489e39e2011-08-31 18:04:05 -0700529 F_END
530};
531
532static struct rcg_clk pdm_clk = {
533 .b = {
534 .ctl_reg = PDM_CLK_NS_REG,
535 .en_mask = BIT(9),
536 .reset_reg = PDM_CLK_NS_REG,
537 .reset_mask = BIT(12),
538 .halt_reg = CLK_HALT_CFPB_STATEC_REG,
539 .halt_bit = 3,
540 },
541 .ns_reg = PDM_CLK_NS_REG,
542 .root_en_mask = BIT(11),
543 .ns_mask = BM(1, 0),
544 .set_rate = set_rate_nop,
545 .freq_tbl = clk_tbl_pdm,
546 .current_freq = &rcg_dummy_freq,
547 .c = {
548 .dbg_name = "pdm_clk",
Stephen Boyd409b8b42012-04-10 12:12:56 -0700549 .ops = &clk_ops_rcg,
Matt Wagantalle18bbc82011-10-06 10:07:28 -0700550 VDD_DIG_FMAX_MAP1(LOW, 19200000),
Vikram Mulukutla489e39e2011-08-31 18:04:05 -0700551 CLK_INIT(pdm_clk.c),
552 },
553};
554
555static struct branch_clk pmem_clk = {
556 .b = {
557 .ctl_reg = PMEM_ACLK_CTL_REG,
558 .en_mask = BIT(4),
Matt Wagantallbc8c9062012-02-07 12:33:06 -0800559 .hwcg_reg = PMEM_ACLK_CTL_REG,
560 .hwcg_mask = BIT(6),
Vikram Mulukutla489e39e2011-08-31 18:04:05 -0700561 .halt_reg = CLK_HALT_DFAB_STATE_REG,
562 .halt_bit = 20,
563 },
564 .c = {
565 .dbg_name = "pmem_clk",
566 .ops = &clk_ops_branch,
567 CLK_INIT(pmem_clk.c),
568 },
569};
570
Matt Wagantalle18bbc82011-10-06 10:07:28 -0700571#define F_PRNG(f, s) \
Vikram Mulukutla489e39e2011-08-31 18:04:05 -0700572 { \
573 .freq_hz = f, \
574 .src_clk = &s##_clk.c, \
Vikram Mulukutla489e39e2011-08-31 18:04:05 -0700575 }
576static struct clk_freq_tbl clk_tbl_prng[] = {
Matt Wagantalle18bbc82011-10-06 10:07:28 -0700577 F_PRNG(32000000, pll8),
Vikram Mulukutla489e39e2011-08-31 18:04:05 -0700578 F_END
579};
580
581static struct rcg_clk prng_clk = {
582 .b = {
583 .ctl_reg = SC0_U_CLK_BRANCH_ENA_VOTE_REG,
584 .en_mask = BIT(10),
585 .halt_reg = CLK_HALT_SFPB_MISC_STATE_REG,
586 .halt_check = HALT_VOTED,
587 .halt_bit = 10,
588 },
589 .set_rate = set_rate_nop,
590 .freq_tbl = clk_tbl_prng,
591 .current_freq = &rcg_dummy_freq,
592 .c = {
593 .dbg_name = "prng_clk",
Stephen Boyd409b8b42012-04-10 12:12:56 -0700594 .ops = &clk_ops_rcg,
Matt Wagantalle18bbc82011-10-06 10:07:28 -0700595 VDD_DIG_FMAX_MAP2(LOW, 32000000, NOMINAL, 65000000),
Vikram Mulukutla489e39e2011-08-31 18:04:05 -0700596 CLK_INIT(prng_clk.c),
597 },
598};
599
600#define CLK_SDC(name, n, h_b, f_table) \
601 struct rcg_clk name = { \
602 .b = { \
603 .ctl_reg = SDCn_APPS_CLK_NS_REG(n), \
604 .en_mask = BIT(9), \
605 .reset_reg = SDCn_RESET_REG(n), \
606 .reset_mask = BIT(0), \
607 .halt_reg = CLK_HALT_DFAB_STATE_REG, \
608 .halt_bit = h_b, \
609 }, \
610 .ns_reg = SDCn_APPS_CLK_NS_REG(n), \
611 .md_reg = SDCn_APPS_CLK_MD_REG(n), \
612 .root_en_mask = BIT(11), \
613 .ns_mask = (BM(23, 16) | BM(6, 0)), \
Matt Wagantall07c45472012-02-10 23:27:24 -0800614 .mnd_en_mask = BIT(8), \
Vikram Mulukutla489e39e2011-08-31 18:04:05 -0700615 .set_rate = set_rate_mnd, \
616 .freq_tbl = f_table, \
617 .current_freq = &rcg_dummy_freq, \
618 .c = { \
619 .dbg_name = #name, \
Stephen Boyd409b8b42012-04-10 12:12:56 -0700620 .ops = &clk_ops_rcg, \
Vikram Mulukutla2d0f6432011-11-07 20:22:08 -0800621 VDD_DIG_FMAX_MAP2(LOW, 26000000, NOMINAL, 52000000), \
Vikram Mulukutla489e39e2011-08-31 18:04:05 -0700622 CLK_INIT(name.c), \
623 }, \
624 }
Matt Wagantalle18bbc82011-10-06 10:07:28 -0700625#define F_SDC(f, s, d, m, n) \
Vikram Mulukutla489e39e2011-08-31 18:04:05 -0700626 { \
627 .freq_hz = f, \
628 .src_clk = &s##_clk.c, \
629 .md_val = MD8(16, m, 0, n), \
630 .ns_val = NS(23, 16, n, m, 5, 4, 3, d, 2, 0, s##_to_bb_mux), \
Vikram Mulukutla489e39e2011-08-31 18:04:05 -0700631 }
632static struct clk_freq_tbl clk_tbl_sdc1_2[] = {
Matt Wagantalle18bbc82011-10-06 10:07:28 -0700633 F_SDC( 0, gnd, 1, 0, 0),
634 F_SDC( 144300, cxo, 1, 1, 133),
635 F_SDC( 400000, pll8, 4, 1, 240),
636 F_SDC( 16000000, pll8, 4, 1, 6),
637 F_SDC( 17070000, pll8, 1, 2, 45),
638 F_SDC( 20210000, pll8, 1, 1, 19),
639 F_SDC( 24000000, pll8, 4, 1, 4),
Vikram Mulukutla2d0f6432011-11-07 20:22:08 -0800640 F_SDC( 38400000, pll8, 2, 1, 5),
Matt Wagantalle18bbc82011-10-06 10:07:28 -0700641 F_SDC( 48000000, pll8, 4, 1, 2),
Vikram Mulukutla2d0f6432011-11-07 20:22:08 -0800642 F_SDC( 64000000, pll8, 3, 1, 2),
643 F_SDC( 76800000, pll8, 1, 1, 5),
Vikram Mulukutla489e39e2011-08-31 18:04:05 -0700644 F_END
645};
646
647static CLK_SDC(sdc1_clk, 1, 6, clk_tbl_sdc1_2);
648static CLK_SDC(sdc2_clk, 2, 5, clk_tbl_sdc1_2);
649
Matt Wagantalle18bbc82011-10-06 10:07:28 -0700650#define F_USB(f, s, d, m, n) \
Vikram Mulukutla489e39e2011-08-31 18:04:05 -0700651 { \
652 .freq_hz = f, \
653 .src_clk = &s##_clk.c, \
654 .md_val = MD8(16, m, 0, n), \
655 .ns_val = NS(23, 16, n, m, 5, 4, 3, d, 2, 0, s##_to_bb_mux), \
Vikram Mulukutla489e39e2011-08-31 18:04:05 -0700656 }
657static struct clk_freq_tbl clk_tbl_usb[] = {
Matt Wagantalle18bbc82011-10-06 10:07:28 -0700658 F_USB( 0, gnd, 1, 0, 0),
659 F_USB(60000000, pll8, 1, 5, 32),
Vikram Mulukutla489e39e2011-08-31 18:04:05 -0700660 F_END
661};
662
Vikram Mulukutla6c9158f2011-12-08 12:41:20 -0800663static struct clk_freq_tbl clk_tbl_usb_hsic_sys[] = {
Vikram Mulukutla5a8fad62012-04-17 05:45:38 -0700664 F_USB( 0, gnd, 1, 0, 0),
665 F_USB(64000000, pll8_acpu, 1, 1, 6),
Vikram Mulukutla6c9158f2011-12-08 12:41:20 -0800666 F_END
667};
668
Vikram Mulukutla489e39e2011-08-31 18:04:05 -0700669static struct rcg_clk usb_hs1_xcvr_clk = {
670 .b = {
671 .ctl_reg = USB_HS1_XCVR_FS_CLK_NS_REG,
672 .en_mask = BIT(9),
673 .reset_reg = USB_HS1_RESET_REG,
674 .reset_mask = BIT(0),
675 .halt_reg = CLK_HALT_DFAB_STATE_REG,
676 .halt_bit = 0,
677 },
678 .ns_reg = USB_HS1_XCVR_FS_CLK_NS_REG,
679 .md_reg = USB_HS1_XCVR_FS_CLK_MD_REG,
680 .root_en_mask = BIT(11),
681 .ns_mask = (BM(23, 16) | BM(6, 0)),
Matt Wagantall07c45472012-02-10 23:27:24 -0800682 .mnd_en_mask = BIT(8),
Vikram Mulukutla489e39e2011-08-31 18:04:05 -0700683 .set_rate = set_rate_mnd,
684 .freq_tbl = clk_tbl_usb,
685 .current_freq = &rcg_dummy_freq,
686 .c = {
687 .dbg_name = "usb_hs1_xcvr_clk",
Stephen Boyd409b8b42012-04-10 12:12:56 -0700688 .ops = &clk_ops_rcg,
Matt Wagantalle18bbc82011-10-06 10:07:28 -0700689 VDD_DIG_FMAX_MAP1(NOMINAL, 60000000),
Vikram Mulukutla489e39e2011-08-31 18:04:05 -0700690 CLK_INIT(usb_hs1_xcvr_clk.c),
691 },
692};
693
694static struct rcg_clk usb_hs1_sys_clk = {
695 .b = {
696 .ctl_reg = USB_HS1_SYS_CLK_NS_REG,
697 .en_mask = BIT(9),
698 .reset_reg = USB_HS1_RESET_REG,
699 .reset_mask = BIT(0),
700 .halt_reg = CLK_HALT_DFAB_STATE_REG,
701 .halt_bit = 4,
702 },
703 .ns_reg = USB_HS1_SYS_CLK_NS_REG,
704 .md_reg = USB_HS1_SYS_CLK_MD_REG,
705 .root_en_mask = BIT(11),
706 .ns_mask = (BM(23, 16) | BM(6, 0)),
Matt Wagantall07c45472012-02-10 23:27:24 -0800707 .mnd_en_mask = BIT(8),
Vikram Mulukutla489e39e2011-08-31 18:04:05 -0700708 .set_rate = set_rate_mnd,
709 .freq_tbl = clk_tbl_usb,
710 .current_freq = &rcg_dummy_freq,
711 .c = {
712 .dbg_name = "usb_hs1_sys_clk",
Stephen Boyd409b8b42012-04-10 12:12:56 -0700713 .ops = &clk_ops_rcg,
Matt Wagantalle18bbc82011-10-06 10:07:28 -0700714 VDD_DIG_FMAX_MAP1(NOMINAL, 60000000),
Vikram Mulukutla489e39e2011-08-31 18:04:05 -0700715 CLK_INIT(usb_hs1_sys_clk.c),
716 },
717};
718
719static struct rcg_clk usb_hsic_xcvr_clk = {
720 .b = {
721 .ctl_reg = USB_HSIC_XCVR_FS_CLK_NS_REG,
722 .en_mask = BIT(9),
723 .reset_reg = USB_HSIC_RESET_REG,
724 .reset_mask = BIT(0),
725 .halt_reg = CLK_HALT_DFAB_STATE_REG,
726 .halt_bit = 9,
727 },
728 .ns_reg = USB_HSIC_XCVR_FS_CLK_NS_REG,
729 .md_reg = USB_HSIC_XCVR_FS_CLK_MD_REG,
730 .root_en_mask = BIT(11),
731 .ns_mask = (BM(23, 16) | BM(6, 0)),
Matt Wagantall07c45472012-02-10 23:27:24 -0800732 .mnd_en_mask = BIT(8),
Vikram Mulukutla489e39e2011-08-31 18:04:05 -0700733 .set_rate = set_rate_mnd,
734 .freq_tbl = clk_tbl_usb,
735 .current_freq = &rcg_dummy_freq,
736 .c = {
737 .dbg_name = "usb_hsic_xcvr_clk",
Stephen Boyd409b8b42012-04-10 12:12:56 -0700738 .ops = &clk_ops_rcg,
Vikram Mulukutla6c9158f2011-12-08 12:41:20 -0800739 VDD_DIG_FMAX_MAP1(LOW, 60000000),
Vikram Mulukutla489e39e2011-08-31 18:04:05 -0700740 CLK_INIT(usb_hsic_xcvr_clk.c),
741 },
742};
743
744static struct rcg_clk usb_hsic_sys_clk = {
745 .b = {
746 .ctl_reg = USB_HSIC_SYSTEM_CLK_NS_REG,
747 .en_mask = BIT(9),
748 .reset_reg = USB_HSIC_RESET_REG,
749 .reset_mask = BIT(0),
750 .halt_reg = CLK_HALT_DFAB_STATE_REG,
751 .halt_bit = 7,
752 },
753 .ns_reg = USB_HSIC_SYSTEM_CLK_NS_REG,
754 .md_reg = USB_HSIC_SYSTEM_CLK_MD_REG,
755 .root_en_mask = BIT(11),
756 .ns_mask = (BM(23, 16) | BM(6, 0)),
Matt Wagantall07c45472012-02-10 23:27:24 -0800757 .mnd_en_mask = BIT(8),
Vikram Mulukutla489e39e2011-08-31 18:04:05 -0700758 .set_rate = set_rate_mnd,
Vikram Mulukutla6c9158f2011-12-08 12:41:20 -0800759 .freq_tbl = clk_tbl_usb_hsic_sys,
Vikram Mulukutla489e39e2011-08-31 18:04:05 -0700760 .current_freq = &rcg_dummy_freq,
761 .c = {
762 .dbg_name = "usb_hsic_sys_clk",
Stephen Boyd409b8b42012-04-10 12:12:56 -0700763 .ops = &clk_ops_rcg,
Vikram Mulukutla6c9158f2011-12-08 12:41:20 -0800764 VDD_DIG_FMAX_MAP1(LOW, 64000000),
Vikram Mulukutla489e39e2011-08-31 18:04:05 -0700765 CLK_INIT(usb_hsic_sys_clk.c),
766 },
767};
768
769static struct clk_freq_tbl clk_tbl_usb_hsic[] = {
Matt Wagantalle18bbc82011-10-06 10:07:28 -0700770 F_USB( 0, gnd, 1, 0, 0),
Vikram Mulukutla6c9158f2011-12-08 12:41:20 -0800771 F_USB(480000000, pll14, 1, 0, 0),
Vikram Mulukutla489e39e2011-08-31 18:04:05 -0700772 F_END
773};
774
775static struct rcg_clk usb_hsic_clk = {
776 .b = {
777 .ctl_reg = USB_HSIC_CLK_NS_REG,
778 .en_mask = BIT(9),
779 .reset_reg = USB_HSIC_RESET_REG,
780 .reset_mask = BIT(0),
Vikram Mulukutla6c9158f2011-12-08 12:41:20 -0800781 .halt_check = DELAY,
Vikram Mulukutla489e39e2011-08-31 18:04:05 -0700782 },
783 .ns_reg = USB_HSIC_CLK_NS_REG,
784 .md_reg = USB_HSIC_CLK_MD_REG,
785 .root_en_mask = BIT(11),
786 .ns_mask = (BM(23, 16) | BM(6, 0)),
787 .set_rate = set_rate_mnd,
788 .freq_tbl = clk_tbl_usb_hsic,
789 .current_freq = &rcg_dummy_freq,
790 .c = {
791 .dbg_name = "usb_hsic_clk",
Stephen Boyd409b8b42012-04-10 12:12:56 -0700792 .ops = &clk_ops_rcg,
Vikram Mulukutla6c9158f2011-12-08 12:41:20 -0800793 VDD_DIG_FMAX_MAP1(LOW, 480000000),
Vikram Mulukutla489e39e2011-08-31 18:04:05 -0700794 CLK_INIT(usb_hsic_clk.c),
795 },
796};
797
798static struct branch_clk usb_hsic_hsio_cal_clk = {
799 .b = {
800 .ctl_reg = USB_HSIC_HSIO_CAL_CLK_CTL_REG,
801 .en_mask = BIT(0),
802 .halt_reg = CLK_HALT_DFAB_STATE_REG,
803 .halt_bit = 8,
804 },
805 .parent = &cxo_clk.c,
806 .c = {
807 .dbg_name = "usb_hsic_hsio_cal_clk",
808 .ops = &clk_ops_branch,
809 CLK_INIT(usb_hsic_hsio_cal_clk.c),
810 },
811};
812
813/* Fast Peripheral Bus Clocks */
814static struct branch_clk ce1_core_clk = {
815 .b = {
816 .ctl_reg = CE1_CORE_CLK_CTL_REG,
817 .en_mask = BIT(4),
Matt Wagantallbc8c9062012-02-07 12:33:06 -0800818 .hwcg_reg = CE1_CORE_CLK_CTL_REG,
819 .hwcg_mask = BIT(6),
Vikram Mulukutla489e39e2011-08-31 18:04:05 -0700820 .halt_reg = CLK_HALT_CFPB_STATEC_REG,
821 .halt_bit = 27,
822 },
823 .c = {
824 .dbg_name = "ce1_core_clk",
825 .ops = &clk_ops_branch,
826 CLK_INIT(ce1_core_clk.c),
827 },
828};
829static struct branch_clk ce1_p_clk = {
830 .b = {
831 .ctl_reg = CE1_HCLK_CTL_REG,
832 .en_mask = BIT(4),
833 .halt_reg = CLK_HALT_CFPB_STATEC_REG,
834 .halt_bit = 1,
835 },
836 .c = {
837 .dbg_name = "ce1_p_clk",
838 .ops = &clk_ops_branch,
839 CLK_INIT(ce1_p_clk.c),
840 },
841};
842
843static struct branch_clk dma_bam_p_clk = {
844 .b = {
845 .ctl_reg = DMA_BAM_HCLK_CTL,
846 .en_mask = BIT(4),
847 .halt_reg = CLK_HALT_DFAB_STATE_REG,
848 .halt_bit = 12,
849 },
850 .c = {
851 .dbg_name = "dma_bam_p_clk",
852 .ops = &clk_ops_branch,
853 CLK_INIT(dma_bam_p_clk.c),
854 },
855};
856
857static struct branch_clk gsbi1_p_clk = {
858 .b = {
859 .ctl_reg = GSBIn_HCLK_CTL_REG(1),
860 .en_mask = BIT(4),
861 .halt_reg = CLK_HALT_CFPB_STATEA_REG,
862 .halt_bit = 11,
863 },
864 .c = {
865 .dbg_name = "gsbi1_p_clk",
866 .ops = &clk_ops_branch,
867 CLK_INIT(gsbi1_p_clk.c),
868 },
869};
870
871static struct branch_clk gsbi2_p_clk = {
872 .b = {
873 .ctl_reg = GSBIn_HCLK_CTL_REG(2),
874 .en_mask = BIT(4),
875 .halt_reg = CLK_HALT_CFPB_STATEA_REG,
876 .halt_bit = 7,
877 },
878 .c = {
879 .dbg_name = "gsbi2_p_clk",
880 .ops = &clk_ops_branch,
881 CLK_INIT(gsbi2_p_clk.c),
882 },
883};
884
885static struct branch_clk gsbi3_p_clk = {
886 .b = {
887 .ctl_reg = GSBIn_HCLK_CTL_REG(3),
888 .en_mask = BIT(4),
889 .halt_reg = CLK_HALT_CFPB_STATEA_REG,
890 .halt_bit = 3,
891 },
892 .c = {
893 .dbg_name = "gsbi3_p_clk",
894 .ops = &clk_ops_branch,
895 CLK_INIT(gsbi3_p_clk.c),
896 },
897};
898
899static struct branch_clk gsbi4_p_clk = {
900 .b = {
901 .ctl_reg = GSBIn_HCLK_CTL_REG(4),
902 .en_mask = BIT(4),
903 .halt_reg = CLK_HALT_CFPB_STATEB_REG,
904 .halt_bit = 27,
905 },
906 .c = {
907 .dbg_name = "gsbi4_p_clk",
908 .ops = &clk_ops_branch,
909 CLK_INIT(gsbi4_p_clk.c),
910 },
911};
912
913static struct branch_clk gsbi5_p_clk = {
914 .b = {
915 .ctl_reg = GSBIn_HCLK_CTL_REG(5),
916 .en_mask = BIT(4),
917 .halt_reg = CLK_HALT_CFPB_STATEB_REG,
918 .halt_bit = 23,
919 },
920 .c = {
921 .dbg_name = "gsbi5_p_clk",
922 .ops = &clk_ops_branch,
923 CLK_INIT(gsbi5_p_clk.c),
924 },
925};
926
927static struct branch_clk usb_hs1_p_clk = {
928 .b = {
929 .ctl_reg = USB_HS1_HCLK_CTL_REG,
930 .en_mask = BIT(4),
Matt Wagantallbc8c9062012-02-07 12:33:06 -0800931 .hwcg_reg = USB_HS1_HCLK_CTL_REG,
932 .hwcg_mask = BIT(6),
Vikram Mulukutla489e39e2011-08-31 18:04:05 -0700933 .halt_reg = CLK_HALT_DFAB_STATE_REG,
934 .halt_bit = 1,
935 },
936 .c = {
937 .dbg_name = "usb_hs1_p_clk",
938 .ops = &clk_ops_branch,
939 CLK_INIT(usb_hs1_p_clk.c),
940 },
941};
942
943static struct branch_clk usb_hsic_p_clk = {
944 .b = {
945 .ctl_reg = USB_HSIC_HCLK_CTL_REG,
946 .en_mask = BIT(4),
Matt Wagantallbc8c9062012-02-07 12:33:06 -0800947 .hwcg_reg = USB_HSIC_HCLK_CTL_REG,
948 .hwcg_mask = BIT(6),
Vikram Mulukutla489e39e2011-08-31 18:04:05 -0700949 .halt_reg = CLK_HALT_DFAB_STATE_REG,
950 .halt_bit = 3,
951 },
952 .c = {
953 .dbg_name = "usb_hsic_p_clk",
954 .ops = &clk_ops_branch,
955 CLK_INIT(usb_hsic_p_clk.c),
956 },
957};
958
959static struct branch_clk sdc1_p_clk = {
960 .b = {
961 .ctl_reg = SDCn_HCLK_CTL_REG(1),
962 .en_mask = BIT(4),
Matt Wagantallbc8c9062012-02-07 12:33:06 -0800963 .hwcg_reg = SDCn_HCLK_CTL_REG(1),
964 .hwcg_mask = BIT(6),
Vikram Mulukutla489e39e2011-08-31 18:04:05 -0700965 .halt_reg = CLK_HALT_DFAB_STATE_REG,
966 .halt_bit = 11,
967 },
968 .c = {
969 .dbg_name = "sdc1_p_clk",
970 .ops = &clk_ops_branch,
971 CLK_INIT(sdc1_p_clk.c),
972 },
973};
974
975static struct branch_clk sdc2_p_clk = {
976 .b = {
977 .ctl_reg = SDCn_HCLK_CTL_REG(2),
978 .en_mask = BIT(4),
Matt Wagantallbc8c9062012-02-07 12:33:06 -0800979 .hwcg_reg = SDCn_HCLK_CTL_REG(2),
980 .hwcg_mask = BIT(6),
Vikram Mulukutla489e39e2011-08-31 18:04:05 -0700981 .halt_reg = CLK_HALT_DFAB_STATE_REG,
982 .halt_bit = 10,
983 },
984 .c = {
985 .dbg_name = "sdc2_p_clk",
986 .ops = &clk_ops_branch,
987 CLK_INIT(sdc2_p_clk.c),
988 },
989};
990
991/* HW-Voteable Clocks */
992static struct branch_clk adm0_clk = {
993 .b = {
994 .ctl_reg = SC0_U_CLK_BRANCH_ENA_VOTE_REG,
995 .en_mask = BIT(2),
996 .halt_reg = CLK_HALT_MSS_KPSS_MISC_STATE_REG,
997 .halt_check = HALT_VOTED,
998 .halt_bit = 14,
999 },
1000 .c = {
1001 .dbg_name = "adm0_clk",
1002 .ops = &clk_ops_branch,
1003 CLK_INIT(adm0_clk.c),
1004 },
1005};
1006
1007static struct branch_clk adm0_p_clk = {
1008 .b = {
1009 .ctl_reg = SC0_U_CLK_BRANCH_ENA_VOTE_REG,
1010 .en_mask = BIT(3),
1011 .halt_reg = CLK_HALT_MSS_KPSS_MISC_STATE_REG,
1012 .halt_check = HALT_VOTED,
1013 .halt_bit = 13,
1014 },
1015 .c = {
1016 .dbg_name = "adm0_p_clk",
1017 .ops = &clk_ops_branch,
1018 CLK_INIT(adm0_p_clk.c),
1019 },
1020};
1021
1022static struct branch_clk pmic_arb0_p_clk = {
1023 .b = {
1024 .ctl_reg = SC0_U_CLK_BRANCH_ENA_VOTE_REG,
1025 .en_mask = BIT(8),
1026 .halt_reg = CLK_HALT_SFPB_MISC_STATE_REG,
1027 .halt_check = HALT_VOTED,
1028 .halt_bit = 22,
1029 },
1030 .c = {
1031 .dbg_name = "pmic_arb0_p_clk",
1032 .ops = &clk_ops_branch,
1033 CLK_INIT(pmic_arb0_p_clk.c),
1034 },
1035};
1036
1037static struct branch_clk pmic_arb1_p_clk = {
1038 .b = {
1039 .ctl_reg = SC0_U_CLK_BRANCH_ENA_VOTE_REG,
1040 .en_mask = BIT(9),
1041 .halt_reg = CLK_HALT_SFPB_MISC_STATE_REG,
1042 .halt_check = HALT_VOTED,
1043 .halt_bit = 21,
1044 },
1045 .c = {
1046 .dbg_name = "pmic_arb1_p_clk",
1047 .ops = &clk_ops_branch,
1048 CLK_INIT(pmic_arb1_p_clk.c),
1049 },
1050};
1051
1052static struct branch_clk pmic_ssbi2_clk = {
1053 .b = {
1054 .ctl_reg = SC0_U_CLK_BRANCH_ENA_VOTE_REG,
1055 .en_mask = BIT(7),
1056 .halt_reg = CLK_HALT_SFPB_MISC_STATE_REG,
1057 .halt_check = HALT_VOTED,
1058 .halt_bit = 23,
1059 },
1060 .c = {
1061 .dbg_name = "pmic_ssbi2_clk",
1062 .ops = &clk_ops_branch,
1063 CLK_INIT(pmic_ssbi2_clk.c),
1064 },
1065};
1066
1067static struct branch_clk rpm_msg_ram_p_clk = {
1068 .b = {
1069 .ctl_reg = SC0_U_CLK_BRANCH_ENA_VOTE_REG,
1070 .en_mask = BIT(6),
1071 .halt_reg = CLK_HALT_SFPB_MISC_STATE_REG,
1072 .halt_check = HALT_VOTED,
1073 .halt_bit = 12,
1074 },
1075 .c = {
1076 .dbg_name = "rpm_msg_ram_p_clk",
1077 .ops = &clk_ops_branch,
1078 CLK_INIT(rpm_msg_ram_p_clk.c),
1079 },
1080};
1081
1082/*
1083 * Low Power Audio Clocks
1084 */
Matt Wagantalle18bbc82011-10-06 10:07:28 -07001085#define F_AIF_OSR(f, s, d, m, n) \
Vikram Mulukutla489e39e2011-08-31 18:04:05 -07001086 { \
1087 .freq_hz = f, \
1088 .src_clk = &s##_clk.c, \
1089 .md_val = MD8(8, m, 0, n), \
1090 .ns_val = NS(31, 24, n, m, 5, 4, 3, d, 2, 0, s##_to_lpa_mux), \
Vikram Mulukutla489e39e2011-08-31 18:04:05 -07001091 }
1092static struct clk_freq_tbl clk_tbl_aif_osr[] = {
Matt Wagantalle18bbc82011-10-06 10:07:28 -07001093 F_AIF_OSR( 0, gnd, 1, 0, 0),
1094 F_AIF_OSR( 512000, pll4, 4, 1, 192),
1095 F_AIF_OSR( 768000, pll4, 4, 1, 128),
1096 F_AIF_OSR( 1024000, pll4, 4, 1, 96),
1097 F_AIF_OSR( 1536000, pll4, 4, 1, 64),
1098 F_AIF_OSR( 2048000, pll4, 4, 1, 48),
1099 F_AIF_OSR( 3072000, pll4, 4, 1, 32),
1100 F_AIF_OSR( 4096000, pll4, 4, 1, 24),
1101 F_AIF_OSR( 6144000, pll4, 4, 1, 16),
1102 F_AIF_OSR( 8192000, pll4, 4, 1, 12),
1103 F_AIF_OSR(12288000, pll4, 4, 1, 8),
1104 F_AIF_OSR(24576000, pll4, 4, 1, 4),
Vikram Mulukutla489e39e2011-08-31 18:04:05 -07001105 F_END
1106};
1107
1108#define CLK_AIF_OSR(i, ns, md, h_r) \
1109 struct rcg_clk i##_clk = { \
1110 .b = { \
1111 .ctl_reg = ns, \
1112 .en_mask = BIT(17), \
1113 .reset_reg = ns, \
1114 .reset_mask = BIT(19), \
1115 .halt_reg = h_r, \
1116 .halt_check = ENABLE, \
1117 .halt_bit = 1, \
1118 }, \
1119 .ns_reg = ns, \
1120 .md_reg = md, \
1121 .root_en_mask = BIT(9), \
1122 .ns_mask = (BM(31, 24) | BM(6, 0)), \
Matt Wagantall07c45472012-02-10 23:27:24 -08001123 .mnd_en_mask = BIT(8), \
Vikram Mulukutla489e39e2011-08-31 18:04:05 -07001124 .set_rate = set_rate_mnd, \
1125 .freq_tbl = clk_tbl_aif_osr, \
1126 .current_freq = &rcg_dummy_freq, \
1127 .c = { \
1128 .dbg_name = #i "_clk", \
Stephen Boyd409b8b42012-04-10 12:12:56 -07001129 .ops = &clk_ops_rcg, \
Vikram Mulukutla489e39e2011-08-31 18:04:05 -07001130 CLK_INIT(i##_clk.c), \
1131 }, \
1132 }
1133#define CLK_AIF_OSR_DIV(i, ns, md, h_r) \
1134 struct rcg_clk i##_clk = { \
1135 .b = { \
1136 .ctl_reg = ns, \
1137 .en_mask = BIT(21), \
1138 .reset_reg = ns, \
1139 .reset_mask = BIT(23), \
1140 .halt_reg = h_r, \
1141 .halt_check = ENABLE, \
1142 .halt_bit = 1, \
1143 }, \
1144 .ns_reg = ns, \
1145 .md_reg = md, \
1146 .root_en_mask = BIT(9), \
1147 .ns_mask = (BM(31, 24) | BM(6, 0)), \
Matt Wagantall07c45472012-02-10 23:27:24 -08001148 .mnd_en_mask = BIT(8), \
Vikram Mulukutla489e39e2011-08-31 18:04:05 -07001149 .set_rate = set_rate_mnd, \
1150 .freq_tbl = clk_tbl_aif_osr, \
1151 .current_freq = &rcg_dummy_freq, \
1152 .c = { \
1153 .dbg_name = #i "_clk", \
Stephen Boyd409b8b42012-04-10 12:12:56 -07001154 .ops = &clk_ops_rcg, \
Vikram Mulukutla489e39e2011-08-31 18:04:05 -07001155 CLK_INIT(i##_clk.c), \
1156 }, \
1157 }
1158
Vikram Mulukutla489e39e2011-08-31 18:04:05 -07001159#define CLK_AIF_BIT(i, ns, h_r) \
Stephen Boyd9fd19642011-11-16 11:11:09 -08001160 struct cdiv_clk i##_clk = { \
Vikram Mulukutla489e39e2011-08-31 18:04:05 -07001161 .b = { \
1162 .ctl_reg = ns, \
1163 .en_mask = BIT(15), \
1164 .halt_reg = h_r, \
1165 .halt_check = DELAY, \
1166 }, \
1167 .ns_reg = ns, \
Stephen Boyd9fd19642011-11-16 11:11:09 -08001168 .ext_mask = BIT(14), \
1169 .div_offset = 10, \
1170 .max_div = 16, \
Vikram Mulukutla489e39e2011-08-31 18:04:05 -07001171 .c = { \
1172 .dbg_name = #i "_clk", \
Stephen Boyd9fd19642011-11-16 11:11:09 -08001173 .ops = &clk_ops_cdiv, \
Vikram Mulukutla489e39e2011-08-31 18:04:05 -07001174 CLK_INIT(i##_clk.c), \
1175 }, \
1176 }
1177
Vikram Mulukutla489e39e2011-08-31 18:04:05 -07001178#define CLK_AIF_BIT_DIV(i, ns, h_r) \
Stephen Boyd9fd19642011-11-16 11:11:09 -08001179 struct cdiv_clk i##_clk = { \
Vikram Mulukutla489e39e2011-08-31 18:04:05 -07001180 .b = { \
1181 .ctl_reg = ns, \
1182 .en_mask = BIT(19), \
1183 .halt_reg = h_r, \
Stephen Boyd7bb9cf82012-01-25 18:09:01 -08001184 .halt_check = DELAY, \
Vikram Mulukutla489e39e2011-08-31 18:04:05 -07001185 }, \
1186 .ns_reg = ns, \
Stephen Boyd9fd19642011-11-16 11:11:09 -08001187 .ext_mask = BIT(18), \
1188 .div_offset = 10, \
1189 .max_div = 256, \
Vikram Mulukutla489e39e2011-08-31 18:04:05 -07001190 .c = { \
1191 .dbg_name = #i "_clk", \
Stephen Boyd9fd19642011-11-16 11:11:09 -08001192 .ops = &clk_ops_cdiv, \
Vikram Mulukutla489e39e2011-08-31 18:04:05 -07001193 CLK_INIT(i##_clk.c), \
1194 }, \
1195 }
1196
1197static CLK_AIF_OSR(mi2s_osr, LCC_MI2S_NS_REG, LCC_MI2S_MD_REG,
1198 LCC_MI2S_STATUS_REG);
1199static CLK_AIF_BIT(mi2s_bit, LCC_MI2S_NS_REG, LCC_MI2S_STATUS_REG);
1200
1201static CLK_AIF_OSR_DIV(codec_i2s_mic_osr, LCC_CODEC_I2S_MIC_NS_REG,
1202 LCC_CODEC_I2S_MIC_MD_REG, LCC_CODEC_I2S_MIC_STATUS_REG);
1203static CLK_AIF_BIT_DIV(codec_i2s_mic_bit, LCC_CODEC_I2S_MIC_NS_REG,
1204 LCC_CODEC_I2S_MIC_STATUS_REG);
1205
1206static CLK_AIF_OSR_DIV(spare_i2s_mic_osr, LCC_SPARE_I2S_MIC_NS_REG,
1207 LCC_SPARE_I2S_MIC_MD_REG, LCC_SPARE_I2S_MIC_STATUS_REG);
1208static CLK_AIF_BIT_DIV(spare_i2s_mic_bit, LCC_SPARE_I2S_MIC_NS_REG,
1209 LCC_SPARE_I2S_MIC_STATUS_REG);
1210
1211static CLK_AIF_OSR_DIV(codec_i2s_spkr_osr, LCC_CODEC_I2S_SPKR_NS_REG,
1212 LCC_CODEC_I2S_SPKR_MD_REG, LCC_CODEC_I2S_SPKR_STATUS_REG);
1213static CLK_AIF_BIT_DIV(codec_i2s_spkr_bit, LCC_CODEC_I2S_SPKR_NS_REG,
1214 LCC_CODEC_I2S_SPKR_STATUS_REG);
1215
1216static CLK_AIF_OSR_DIV(spare_i2s_spkr_osr, LCC_SPARE_I2S_SPKR_NS_REG,
1217 LCC_SPARE_I2S_SPKR_MD_REG, LCC_SPARE_I2S_SPKR_STATUS_REG);
1218static CLK_AIF_BIT_DIV(spare_i2s_spkr_bit, LCC_SPARE_I2S_SPKR_NS_REG,
1219 LCC_SPARE_I2S_SPKR_STATUS_REG);
1220
Matt Wagantalle18bbc82011-10-06 10:07:28 -07001221#define F_PCM(f, s, d, m, n) \
Vikram Mulukutla489e39e2011-08-31 18:04:05 -07001222 { \
1223 .freq_hz = f, \
1224 .src_clk = &s##_clk.c, \
1225 .md_val = MD16(m, n), \
1226 .ns_val = NS(31, 16, n, m, 5, 4, 3, d, 2, 0, s##_to_lpa_mux), \
Vikram Mulukutla489e39e2011-08-31 18:04:05 -07001227 }
1228static struct clk_freq_tbl clk_tbl_pcm[] = {
Stephen Boyd630f3252012-01-31 00:10:08 -08001229 { .ns_val = BIT(10) /* external input */ },
Matt Wagantalle18bbc82011-10-06 10:07:28 -07001230 F_PCM( 512000, pll4, 4, 1, 192),
1231 F_PCM( 768000, pll4, 4, 1, 128),
1232 F_PCM( 1024000, pll4, 4, 1, 96),
1233 F_PCM( 1536000, pll4, 4, 1, 64),
1234 F_PCM( 2048000, pll4, 4, 1, 48),
1235 F_PCM( 3072000, pll4, 4, 1, 32),
1236 F_PCM( 4096000, pll4, 4, 1, 24),
1237 F_PCM( 6144000, pll4, 4, 1, 16),
1238 F_PCM( 8192000, pll4, 4, 1, 12),
1239 F_PCM(12288000, pll4, 4, 1, 8),
1240 F_PCM(24576000, pll4, 4, 1, 4),
Vikram Mulukutla489e39e2011-08-31 18:04:05 -07001241 F_END
1242};
1243
1244static struct rcg_clk pcm_clk = {
1245 .b = {
1246 .ctl_reg = LCC_PCM_NS_REG,
1247 .en_mask = BIT(11),
1248 .reset_reg = LCC_PCM_NS_REG,
1249 .reset_mask = BIT(13),
1250 .halt_reg = LCC_PCM_STATUS_REG,
1251 .halt_check = ENABLE,
1252 .halt_bit = 0,
1253 },
1254 .ns_reg = LCC_PCM_NS_REG,
1255 .md_reg = LCC_PCM_MD_REG,
1256 .root_en_mask = BIT(9),
Stephen Boyd630f3252012-01-31 00:10:08 -08001257 .ns_mask = BM(31, 16) | BIT(10) | BM(6, 0),
Matt Wagantall07c45472012-02-10 23:27:24 -08001258 .mnd_en_mask = BIT(8),
Vikram Mulukutla489e39e2011-08-31 18:04:05 -07001259 .set_rate = set_rate_mnd,
1260 .freq_tbl = clk_tbl_pcm,
1261 .current_freq = &rcg_dummy_freq,
1262 .c = {
1263 .dbg_name = "pcm_clk",
Stephen Boyd409b8b42012-04-10 12:12:56 -07001264 .ops = &clk_ops_rcg,
Matt Wagantalle18bbc82011-10-06 10:07:28 -07001265 VDD_DIG_FMAX_MAP1(LOW, 24576000),
Vikram Mulukutla489e39e2011-08-31 18:04:05 -07001266 CLK_INIT(pcm_clk.c),
1267 },
1268};
1269
1270static struct rcg_clk audio_slimbus_clk = {
1271 .b = {
1272 .ctl_reg = LCC_SLIMBUS_NS_REG,
1273 .en_mask = BIT(10),
1274 .reset_reg = LCC_AHBEX_BRANCH_CTL_REG,
1275 .reset_mask = BIT(5),
1276 .halt_reg = LCC_SLIMBUS_STATUS_REG,
1277 .halt_check = ENABLE,
1278 .halt_bit = 0,
1279 },
1280 .ns_reg = LCC_SLIMBUS_NS_REG,
1281 .md_reg = LCC_SLIMBUS_MD_REG,
1282 .root_en_mask = BIT(9),
1283 .ns_mask = (BM(31, 24) | BM(6, 0)),
Matt Wagantall07c45472012-02-10 23:27:24 -08001284 .mnd_en_mask = BIT(8),
Vikram Mulukutla489e39e2011-08-31 18:04:05 -07001285 .set_rate = set_rate_mnd,
1286 .freq_tbl = clk_tbl_aif_osr,
1287 .current_freq = &rcg_dummy_freq,
1288 .c = {
1289 .dbg_name = "audio_slimbus_clk",
Stephen Boyd409b8b42012-04-10 12:12:56 -07001290 .ops = &clk_ops_rcg,
Matt Wagantalle18bbc82011-10-06 10:07:28 -07001291 VDD_DIG_FMAX_MAP1(LOW, 24576000),
Vikram Mulukutla489e39e2011-08-31 18:04:05 -07001292 CLK_INIT(audio_slimbus_clk.c),
1293 },
1294};
1295
1296static struct branch_clk sps_slimbus_clk = {
1297 .b = {
1298 .ctl_reg = LCC_SLIMBUS_NS_REG,
1299 .en_mask = BIT(12),
1300 .halt_reg = LCC_SLIMBUS_STATUS_REG,
1301 .halt_check = ENABLE,
1302 .halt_bit = 1,
1303 },
1304 .parent = &audio_slimbus_clk.c,
1305 .c = {
1306 .dbg_name = "sps_slimbus_clk",
1307 .ops = &clk_ops_branch,
1308 CLK_INIT(sps_slimbus_clk.c),
1309 },
1310};
1311
1312static struct branch_clk slimbus_xo_src_clk = {
1313 .b = {
1314 .ctl_reg = SLIMBUS_XO_SRC_CLK_CTL_REG,
1315 .en_mask = BIT(2),
1316 .halt_reg = CLK_HALT_DFAB_STATE_REG,
1317 .halt_bit = 28,
1318 },
1319 .parent = &sps_slimbus_clk.c,
1320 .c = {
1321 .dbg_name = "slimbus_xo_src_clk",
1322 .ops = &clk_ops_branch,
1323 CLK_INIT(slimbus_xo_src_clk.c),
1324 },
1325};
1326
Vikram Mulukutla73d42112011-09-19 16:32:54 -07001327DEFINE_CLK_RPM(cfpb_clk, cfpb_a_clk, CFPB, NULL);
1328DEFINE_CLK_RPM(dfab_clk, dfab_a_clk, DAYTONA_FABRIC, NULL);
1329DEFINE_CLK_RPM(ebi1_clk, ebi1_a_clk, EBI1, NULL);
1330DEFINE_CLK_RPM(sfab_clk, sfab_a_clk, SYSTEM_FABRIC, NULL);
1331DEFINE_CLK_RPM(sfpb_clk, sfpb_a_clk, SFPB, NULL);
1332
Matt Wagantall35e78fc2012-04-05 14:18:44 -07001333static DEFINE_CLK_VOTER(dfab_usb_hs_clk, &dfab_clk.c, 0);
1334static DEFINE_CLK_VOTER(dfab_sdc1_clk, &dfab_clk.c, 0);
1335static DEFINE_CLK_VOTER(dfab_sdc2_clk, &dfab_clk.c, 0);
1336static DEFINE_CLK_VOTER(dfab_sps_clk, &dfab_clk.c, 0);
1337static DEFINE_CLK_VOTER(dfab_bam_dmux_clk, &dfab_clk.c, 0);
1338static DEFINE_CLK_VOTER(dfab_msmbus_clk, &dfab_clk.c, 0);
1339static DEFINE_CLK_VOTER(dfab_msmbus_a_clk, &dfab_a_clk.c, 0);
Matt Wagantall42cd12a2012-03-30 18:02:40 -07001340static DEFINE_CLK_VOTER(ebi1_msmbus_clk, &ebi1_clk.c, LONG_MAX);
Matt Wagantall35e78fc2012-04-05 14:18:44 -07001341static DEFINE_CLK_VOTER(ebi1_adm_clk, &ebi1_clk.c, 0);
Vikram Mulukutla489e39e2011-08-31 18:04:05 -07001342
1343#ifdef CONFIG_DEBUG_FS
1344struct measure_sel {
1345 u32 test_vector;
1346 struct clk *clk;
1347};
1348
Vikram Mulukutlaefd64f52012-01-09 17:41:09 -08001349static DEFINE_CLK_MEASURE(q6sw_clk);
1350static DEFINE_CLK_MEASURE(q6fw_clk);
1351static DEFINE_CLK_MEASURE(q6_func_clk);
1352
Vikram Mulukutla489e39e2011-08-31 18:04:05 -07001353static struct measure_sel measure_mux[] = {
1354 { TEST_PER_LS(0x08), &slimbus_xo_src_clk.c },
1355 { TEST_PER_LS(0x12), &sdc1_p_clk.c },
1356 { TEST_PER_LS(0x13), &sdc1_clk.c },
1357 { TEST_PER_LS(0x14), &sdc2_p_clk.c },
1358 { TEST_PER_LS(0x15), &sdc2_clk.c },
Matt Wagantall7625a4c2011-11-01 16:17:53 -07001359 { TEST_PER_LS(0x1F), &gp0_clk.c },
1360 { TEST_PER_LS(0x20), &gp1_clk.c },
1361 { TEST_PER_LS(0x21), &gp2_clk.c },
Vikram Mulukutla489e39e2011-08-31 18:04:05 -07001362 { TEST_PER_LS(0x26), &pmem_clk.c },
Vikram Mulukutla73d42112011-09-19 16:32:54 -07001363 { TEST_PER_LS(0x25), &dfab_clk.c },
1364 { TEST_PER_LS(0x25), &dfab_a_clk.c },
Vikram Mulukutla489e39e2011-08-31 18:04:05 -07001365 { TEST_PER_LS(0x32), &dma_bam_p_clk.c },
Vikram Mulukutla73d42112011-09-19 16:32:54 -07001366 { TEST_PER_LS(0x33), &cfpb_clk.c },
1367 { TEST_PER_LS(0x33), &cfpb_a_clk.c },
Vikram Mulukutla489e39e2011-08-31 18:04:05 -07001368 { TEST_PER_LS(0x3E), &gsbi1_uart_clk.c },
1369 { TEST_PER_LS(0x3F), &gsbi1_qup_clk.c },
1370 { TEST_PER_LS(0x41), &gsbi2_p_clk.c },
1371 { TEST_PER_LS(0x42), &gsbi2_uart_clk.c },
1372 { TEST_PER_LS(0x44), &gsbi2_qup_clk.c },
1373 { TEST_PER_LS(0x45), &gsbi3_p_clk.c },
1374 { TEST_PER_LS(0x46), &gsbi3_uart_clk.c },
1375 { TEST_PER_LS(0x48), &gsbi3_qup_clk.c },
1376 { TEST_PER_LS(0x49), &gsbi4_p_clk.c },
1377 { TEST_PER_LS(0x4A), &gsbi4_uart_clk.c },
1378 { TEST_PER_LS(0x4C), &gsbi4_qup_clk.c },
1379 { TEST_PER_LS(0x4D), &gsbi5_p_clk.c },
1380 { TEST_PER_LS(0x4E), &gsbi5_uart_clk.c },
1381 { TEST_PER_LS(0x50), &gsbi5_qup_clk.c },
Vikram Mulukutla73d42112011-09-19 16:32:54 -07001382 { TEST_PER_LS(0x78), &sfpb_clk.c },
1383 { TEST_PER_LS(0x78), &sfpb_a_clk.c },
Vikram Mulukutla489e39e2011-08-31 18:04:05 -07001384 { TEST_PER_LS(0x7A), &pmic_ssbi2_clk.c },
1385 { TEST_PER_LS(0x7B), &pmic_arb0_p_clk.c },
1386 { TEST_PER_LS(0x7C), &pmic_arb1_p_clk.c },
1387 { TEST_PER_LS(0x7D), &prng_clk.c },
1388 { TEST_PER_LS(0x7F), &rpm_msg_ram_p_clk.c },
1389 { TEST_PER_LS(0x80), &adm0_p_clk.c },
1390 { TEST_PER_LS(0x84), &usb_hs1_p_clk.c },
1391 { TEST_PER_LS(0x85), &usb_hs1_xcvr_clk.c },
1392 { TEST_PER_LS(0x86), &usb_hsic_sys_clk.c },
1393 { TEST_PER_LS(0x87), &usb_hsic_p_clk.c },
1394 { TEST_PER_LS(0x88), &usb_hsic_xcvr_clk.c },
1395 { TEST_PER_LS(0x8B), &usb_hsic_hsio_cal_clk.c },
1396 { TEST_PER_LS(0x8D), &usb_hs1_sys_clk.c },
1397 { TEST_PER_LS(0x92), &ce1_p_clk.c },
Vikram Mulukutla73d42112011-09-19 16:32:54 -07001398 { TEST_PER_HS(0x18), &sfab_clk.c },
1399 { TEST_PER_HS(0x18), &sfab_a_clk.c },
Vikram Mulukutlaefd64f52012-01-09 17:41:09 -08001400 { TEST_PER_HS(0x26), &q6sw_clk },
1401 { TEST_PER_HS(0x27), &q6fw_clk },
Vikram Mulukutla489e39e2011-08-31 18:04:05 -07001402 { TEST_PER_LS(0xA4), &ce1_core_clk.c },
1403 { TEST_PER_HS(0x2A), &adm0_clk.c },
Vikram Mulukutla73d42112011-09-19 16:32:54 -07001404 { TEST_PER_HS(0x34), &ebi1_clk.c },
1405 { TEST_PER_HS(0x34), &ebi1_a_clk.c },
Vikram Mulukutla6c9158f2011-12-08 12:41:20 -08001406 { TEST_PER_HS(0x3E), &usb_hsic_clk.c },
Vikram Mulukutla489e39e2011-08-31 18:04:05 -07001407 { TEST_LPA(0x0F), &mi2s_bit_clk.c },
1408 { TEST_LPA(0x10), &codec_i2s_mic_bit_clk.c },
1409 { TEST_LPA(0x11), &codec_i2s_spkr_bit_clk.c },
1410 { TEST_LPA(0x12), &spare_i2s_mic_bit_clk.c },
1411 { TEST_LPA(0x13), &spare_i2s_spkr_bit_clk.c },
1412 { TEST_LPA(0x14), &pcm_clk.c },
1413 { TEST_LPA(0x1D), &audio_slimbus_clk.c },
Vikram Mulukutlaefd64f52012-01-09 17:41:09 -08001414 { TEST_LPA_HS(0x00), &q6_func_clk },
Vikram Mulukutla489e39e2011-08-31 18:04:05 -07001415};
1416
1417static struct measure_sel *find_measure_sel(struct clk *clk)
1418{
1419 int i;
1420
1421 for (i = 0; i < ARRAY_SIZE(measure_mux); i++)
1422 if (measure_mux[i].clk == clk)
1423 return &measure_mux[i];
1424 return NULL;
1425}
1426
1427static int measure_clk_set_parent(struct clk *c, struct clk *parent)
1428{
1429 int ret = 0;
1430 u32 clk_sel;
1431 struct measure_sel *p;
1432 struct measure_clk *clk = to_measure_clk(c);
1433 unsigned long flags;
1434
1435 if (!parent)
1436 return -EINVAL;
1437
1438 p = find_measure_sel(parent);
1439 if (!p)
1440 return -EINVAL;
1441
1442 spin_lock_irqsave(&local_clock_reg_lock, flags);
1443
1444 /*
1445 * Program the test vector, measurement period (sample_ticks)
1446 * and scaling multiplier.
1447 */
1448 clk->sample_ticks = 0x10000;
1449 clk_sel = p->test_vector & TEST_CLK_SEL_MASK;
1450 clk->multiplier = 1;
1451 switch (p->test_vector >> TEST_TYPE_SHIFT) {
1452 case TEST_TYPE_PER_LS:
1453 writel_relaxed(0x4030D00|BVAL(7, 0, clk_sel), CLK_TEST_REG);
1454 break;
1455 case TEST_TYPE_PER_HS:
1456 writel_relaxed(0x4020000|BVAL(16, 10, clk_sel), CLK_TEST_REG);
1457 break;
1458 case TEST_TYPE_LPA:
1459 writel_relaxed(0x4030D98, CLK_TEST_REG);
1460 writel_relaxed(BVAL(6, 1, clk_sel)|BIT(0),
1461 LCC_CLK_LS_DEBUG_CFG_REG);
1462 break;
Vikram Mulukutlaefd64f52012-01-09 17:41:09 -08001463 case TEST_TYPE_LPA_HS:
1464 writel_relaxed(0x402BC00, CLK_TEST_REG);
1465 writel_relaxed(BVAL(2, 1, clk_sel)|BIT(0),
1466 LCC_CLK_HS_DEBUG_CFG_REG);
1467 break;
Vikram Mulukutla489e39e2011-08-31 18:04:05 -07001468 default:
1469 ret = -EPERM;
1470 }
1471 /* Make sure test vector is set before starting measurements. */
1472 mb();
1473
1474 spin_unlock_irqrestore(&local_clock_reg_lock, flags);
1475
1476 return ret;
1477}
1478
1479/* Sample clock for 'ticks' reference clock ticks. */
Matt Wagantall9de3bfb2011-11-03 20:13:12 -07001480static unsigned long run_measurement(unsigned ticks)
Vikram Mulukutla489e39e2011-08-31 18:04:05 -07001481{
1482 /* Stop counters and set the XO4 counter start value. */
Vikram Mulukutla489e39e2011-08-31 18:04:05 -07001483 writel_relaxed(ticks, RINGOSC_TCXO_CTL_REG);
1484
1485 /* Wait for timer to become ready. */
1486 while ((readl_relaxed(RINGOSC_STATUS_REG) & BIT(25)) != 0)
1487 cpu_relax();
1488
1489 /* Run measurement and wait for completion. */
1490 writel_relaxed(BIT(28)|ticks, RINGOSC_TCXO_CTL_REG);
1491 while ((readl_relaxed(RINGOSC_STATUS_REG) & BIT(25)) == 0)
1492 cpu_relax();
1493
1494 /* Stop counters. */
1495 writel_relaxed(0x0, RINGOSC_TCXO_CTL_REG);
1496
1497 /* Return measured ticks. */
1498 return readl_relaxed(RINGOSC_STATUS_REG) & BM(24, 0);
1499}
1500
1501
1502/* Perform a hardware rate measurement for a given clock.
1503 FOR DEBUG USE ONLY: Measurements take ~15 ms! */
Matt Wagantall9de3bfb2011-11-03 20:13:12 -07001504static unsigned long measure_clk_get_rate(struct clk *c)
Vikram Mulukutla489e39e2011-08-31 18:04:05 -07001505{
1506 unsigned long flags;
1507 u32 pdm_reg_backup, ringosc_reg_backup;
1508 u64 raw_count_short, raw_count_full;
1509 struct measure_clk *clk = to_measure_clk(c);
1510 unsigned ret;
1511
1512 spin_lock_irqsave(&local_clock_reg_lock, flags);
1513
1514 /* Enable CXO/4 and RINGOSC branch and root. */
1515 pdm_reg_backup = readl_relaxed(PDM_CLK_NS_REG);
1516 ringosc_reg_backup = readl_relaxed(RINGOSC_NS_REG);
1517 writel_relaxed(0x2898, PDM_CLK_NS_REG);
1518 writel_relaxed(0xA00, RINGOSC_NS_REG);
1519
1520 /*
1521 * The ring oscillator counter will not reset if the measured clock
1522 * is not running. To detect this, run a short measurement before
1523 * the full measurement. If the raw results of the two are the same
1524 * then the clock must be off.
1525 */
1526
1527 /* Run a short measurement. (~1 ms) */
1528 raw_count_short = run_measurement(0x1000);
1529 /* Run a full measurement. (~14 ms) */
1530 raw_count_full = run_measurement(clk->sample_ticks);
1531
1532 writel_relaxed(ringosc_reg_backup, RINGOSC_NS_REG);
1533 writel_relaxed(pdm_reg_backup, PDM_CLK_NS_REG);
1534
1535 /* Return 0 if the clock is off. */
1536 if (raw_count_full == raw_count_short)
1537 ret = 0;
1538 else {
1539 /* Compute rate in Hz. */
1540 raw_count_full = ((raw_count_full * 10) + 15) * 4800000;
1541 do_div(raw_count_full, ((clk->sample_ticks * 10) + 35));
1542 ret = (raw_count_full * clk->multiplier);
1543 }
1544
1545 /* Route dbg_hs_clk to PLLTEST. 300mV single-ended amplitude. */
1546 writel_relaxed(0x38F8, PLLTEST_PAD_CFG_REG);
1547 spin_unlock_irqrestore(&local_clock_reg_lock, flags);
1548
1549 return ret;
1550}
1551#else /* !CONFIG_DEBUG_FS */
1552static int measure_clk_set_parent(struct clk *clk, struct clk *parent)
1553{
1554 return -EINVAL;
1555}
1556
Matt Wagantall9de3bfb2011-11-03 20:13:12 -07001557static unsigned long measure_clk_get_rate(struct clk *clk)
Vikram Mulukutla489e39e2011-08-31 18:04:05 -07001558{
1559 return 0;
1560}
1561#endif /* CONFIG_DEBUG_FS */
1562
1563static struct clk_ops measure_clk_ops = {
1564 .set_parent = measure_clk_set_parent,
1565 .get_rate = measure_clk_get_rate,
Vikram Mulukutla489e39e2011-08-31 18:04:05 -07001566};
1567
1568static struct measure_clk measure_clk = {
1569 .c = {
1570 .dbg_name = "measure_clk",
1571 .ops = &measure_clk_ops,
1572 CLK_INIT(measure_clk.c),
1573 },
1574 .multiplier = 1,
1575};
1576
1577static struct clk_lookup msm_clocks_9615[] = {
Stephen Boyd72a80352012-01-26 15:57:38 -08001578 CLK_LOOKUP("xo", cxo_a_clk.c, ""),
Stephen Boyd69d35e32012-02-14 15:33:30 -08001579 CLK_LOOKUP("xo", cxo_clk.c, "BAM_RMNT"),
Stephen Boyd5a190a82012-03-01 14:45:15 -08001580 CLK_LOOKUP("xo", cxo_clk.c, "msm_xo"),
Vikram Mulukutla489e39e2011-08-31 18:04:05 -07001581 CLK_LOOKUP("pll0", pll0_clk.c, NULL),
1582 CLK_LOOKUP("pll8", pll8_clk.c, NULL),
Vikram Mulukutla489e39e2011-08-31 18:04:05 -07001583 CLK_LOOKUP("pll14", pll14_clk.c, NULL),
Vikram Mulukutla31680ae2011-11-04 14:23:55 -07001584
1585 CLK_LOOKUP("pll0", pll0_acpu_clk.c, "acpu"),
1586 CLK_LOOKUP("pll8", pll8_acpu_clk.c, "acpu"),
1587 CLK_LOOKUP("pll9", pll9_acpu_clk.c, "acpu"),
1588
Vikram Mulukutla489e39e2011-08-31 18:04:05 -07001589 CLK_LOOKUP("measure", measure_clk.c, "debug"),
1590
Matt Wagantallb2710b82011-11-16 19:55:17 -08001591 CLK_LOOKUP("bus_clk", sfab_clk.c, "msm_sys_fab"),
1592 CLK_LOOKUP("bus_a_clk", sfab_a_clk.c, "msm_sys_fab"),
1593 CLK_LOOKUP("mem_clk", ebi1_msmbus_clk.c, "msm_bus"),
1594 CLK_LOOKUP("mem_a_clk", ebi1_a_clk.c, "msm_bus"),
Gagan Macbc5f81d2012-04-04 15:03:12 -06001595 CLK_LOOKUP("dfab_clk", dfab_msmbus_clk.c, "msm_bus"),
1596 CLK_LOOKUP("dfab_a_clk", dfab_msmbus_a_clk.c, "msm_bus"),
Matt Wagantallb2710b82011-11-16 19:55:17 -08001597
1598 CLK_LOOKUP("bus_clk", sfpb_clk.c, NULL),
1599 CLK_LOOKUP("bus_a_clk", sfpb_a_clk.c, NULL),
1600 CLK_LOOKUP("bus_clk", cfpb_clk.c, NULL),
1601 CLK_LOOKUP("bus_a_clk", cfpb_a_clk.c, NULL),
1602 CLK_LOOKUP("ebi1_clk", ebi1_clk.c, NULL),
Vikram Mulukutla489e39e2011-08-31 18:04:05 -07001603
Matt Wagantallc00f95d2012-01-05 14:22:45 -08001604 CLK_LOOKUP("core_clk", gp0_clk.c, ""),
1605 CLK_LOOKUP("core_clk", gp1_clk.c, ""),
1606 CLK_LOOKUP("core_clk", gp2_clk.c, ""),
Matt Wagantall7625a4c2011-11-01 16:17:53 -07001607
Matt Wagantallc00f95d2012-01-05 14:22:45 -08001608 CLK_LOOKUP("core_clk", gsbi3_uart_clk.c, ""),
Vikram Mulukutla489e39e2011-08-31 18:04:05 -07001609 CLK_LOOKUP("core_clk", gsbi4_uart_clk.c, "msm_serial_hsl.0"),
Matt Wagantallc00f95d2012-01-05 14:22:45 -08001610 CLK_LOOKUP("core_clk", gsbi5_uart_clk.c, ""),
Vikram Mulukutla489e39e2011-08-31 18:04:05 -07001611
Harini Jayaraman738c9312011-09-08 15:22:38 -06001612 CLK_LOOKUP("core_clk", gsbi3_qup_clk.c, "spi_qsd.0"),
Matt Wagantallc00f95d2012-01-05 14:22:45 -08001613 CLK_LOOKUP("core_clk", gsbi4_qup_clk.c, ""),
Harini Jayaramaneba52672011-09-08 15:13:00 -06001614 CLK_LOOKUP("core_clk", gsbi5_qup_clk.c, "qup_i2c.0"),
Vikram Mulukutla489e39e2011-08-31 18:04:05 -07001615
Matt Wagantallc00f95d2012-01-05 14:22:45 -08001616 CLK_LOOKUP("core_clk", pdm_clk.c, ""),
Vikram Mulukutladd0a2372011-09-19 15:58:21 -07001617 CLK_LOOKUP("mem_clk", pmem_clk.c, "msm_sps"),
Ramesh Masavarapu5ad37392011-10-10 10:44:10 -07001618 CLK_LOOKUP("core_clk", prng_clk.c, "msm_rng.0"),
Vikram Mulukutla489e39e2011-08-31 18:04:05 -07001619 CLK_LOOKUP("core_clk", sdc1_clk.c, "msm_sdcc.1"),
1620 CLK_LOOKUP("core_clk", sdc2_clk.c, "msm_sdcc.2"),
Matt Wagantallc00f95d2012-01-05 14:22:45 -08001621 CLK_LOOKUP("iface_clk", ce1_p_clk.c, ""),
1622 CLK_LOOKUP("core_clk", ce1_core_clk.c, ""),
Vikram Mulukutla489e39e2011-08-31 18:04:05 -07001623 CLK_LOOKUP("dma_bam_pclk", dma_bam_p_clk.c, NULL),
1624
Harini Jayaraman738c9312011-09-08 15:22:38 -06001625 CLK_LOOKUP("iface_clk", gsbi3_p_clk.c, "spi_qsd.0"),
Vikram Mulukutla489e39e2011-08-31 18:04:05 -07001626 CLK_LOOKUP("iface_clk", gsbi4_p_clk.c, "msm_serial_hsl.0"),
Harini Jayaramaneba52672011-09-08 15:13:00 -06001627 CLK_LOOKUP("iface_clk", gsbi5_p_clk.c, "qup_i2c.0"),
Vikram Mulukutla489e39e2011-08-31 18:04:05 -07001628
Manu Gautam5143b252012-01-05 19:25:23 -08001629 CLK_LOOKUP("iface_clk", usb_hs1_p_clk.c, "msm_otg"),
1630 CLK_LOOKUP("core_clk", usb_hs1_sys_clk.c, "msm_otg"),
1631 CLK_LOOKUP("alt_core_clk", usb_hs1_xcvr_clk.c, "msm_otg"),
1632 CLK_LOOKUP("alt_core_clk", usb_hsic_xcvr_clk.c, "msm_hsic_host"),
1633 CLK_LOOKUP("cal_clk", usb_hsic_hsio_cal_clk.c, "msm_hsic_host"),
1634 CLK_LOOKUP("core_clk", usb_hsic_sys_clk.c, "msm_hsic_host"),
1635 CLK_LOOKUP("iface_clk", usb_hsic_p_clk.c, "msm_hsic_host"),
1636 CLK_LOOKUP("phy_clk", usb_hsic_clk.c, "msm_hsic_host"),
Ofir Cohendf314b42012-01-15 11:59:34 +02001637 CLK_LOOKUP("alt_core_clk", usb_hsic_xcvr_clk.c, "msm_hsic_peripheral"),
1638 CLK_LOOKUP("cal_clk", usb_hsic_hsio_cal_clk.c, "msm_hsic_peripheral"),
1639 CLK_LOOKUP("core_clk", usb_hsic_sys_clk.c, "msm_hsic_peripheral"),
1640 CLK_LOOKUP("iface_clk", usb_hsic_p_clk.c, "msm_hsic_peripheral"),
1641 CLK_LOOKUP("phy_clk", usb_hsic_clk.c, "msm_hsic_peripheral"),
Vikram Mulukutla489e39e2011-08-31 18:04:05 -07001642
1643 CLK_LOOKUP("iface_clk", sdc1_p_clk.c, "msm_sdcc.1"),
1644 CLK_LOOKUP("iface_clk", sdc2_p_clk.c, "msm_sdcc.2"),
1645 CLK_LOOKUP("core_clk", adm0_clk.c, "msm_dmov"),
1646 CLK_LOOKUP("iface_clk", adm0_p_clk.c, "msm_dmov"),
Matt Wagantallc00f95d2012-01-05 14:22:45 -08001647 CLK_LOOKUP("iface_clk", pmic_arb0_p_clk.c, ""),
1648 CLK_LOOKUP("iface_clk", pmic_arb1_p_clk.c, ""),
1649 CLK_LOOKUP("core_clk", pmic_ssbi2_clk.c, ""),
1650 CLK_LOOKUP("mem_clk", rpm_msg_ram_p_clk.c, ""),
Kuirong Wanga9c3acc2012-02-09 17:00:45 -08001651 CLK_LOOKUP("bit_clk", mi2s_bit_clk.c, "msm-dai-q6.6"),
1652 CLK_LOOKUP("osr_clk", mi2s_osr_clk.c, "msm-dai-q6.6"),
Vikram Mulukutla489e39e2011-08-31 18:04:05 -07001653
Kuirong Wanga9c3acc2012-02-09 17:00:45 -08001654 CLK_LOOKUP("bit_clk", codec_i2s_mic_bit_clk.c,
1655 "msm-dai-q6.1"),
1656 CLK_LOOKUP("osr_clk", codec_i2s_mic_osr_clk.c,
1657 "msm-dai-q6.1"),
1658 CLK_LOOKUP("bit_clk", spare_i2s_mic_bit_clk.c,
1659 "msm-dai-q6.5"),
1660 CLK_LOOKUP("osr_clk", spare_i2s_mic_osr_clk.c,
1661 "msm-dai-q6.5"),
1662 CLK_LOOKUP("bit_clk", codec_i2s_spkr_bit_clk.c,
1663 "msm-dai-q6.16384"),
1664 CLK_LOOKUP("osr_clk", codec_i2s_spkr_osr_clk.c,
1665 "msm-dai-q6.16384"),
1666 CLK_LOOKUP("bit_clk", spare_i2s_spkr_bit_clk.c,
1667 "msm-dai-q6.4"),
1668 CLK_LOOKUP("osr_clk", spare_i2s_spkr_osr_clk.c,
1669 "msm-dai-q6.4"),
1670 CLK_LOOKUP("pcm_clk", pcm_clk.c, "msm-dai-q6.2"),
Kiran Kandi5f4ab692012-02-23 11:23:56 -08001671 CLK_LOOKUP("pcm_clk", pcm_clk.c, "msm-dai-q6.3"),
Vikram Mulukutla489e39e2011-08-31 18:04:05 -07001672
1673 CLK_LOOKUP("sps_slimbus_clk", sps_slimbus_clk.c, NULL),
Tianyi Gou44a81b02012-02-06 17:49:07 -08001674 CLK_LOOKUP("core_clk", audio_slimbus_clk.c, "msm_slim_ctrl.1"),
Manu Gautam5143b252012-01-05 19:25:23 -08001675 CLK_LOOKUP("core_clk", dfab_usb_hs_clk.c, "msm_otg"),
Vikram Mulukutla489e39e2011-08-31 18:04:05 -07001676 CLK_LOOKUP("bus_clk", dfab_sdc1_clk.c, "msm_sdcc.1"),
1677 CLK_LOOKUP("bus_clk", dfab_sdc2_clk.c, "msm_sdcc.2"),
1678 CLK_LOOKUP("dfab_clk", dfab_sps_clk.c, "msm_sps"),
Vikram Mulukutlacfd73ad2011-11-09 11:39:34 -08001679 CLK_LOOKUP("bus_clk", dfab_bam_dmux_clk.c, "BAM_RMNT"),
Vikram Mulukutla73d42112011-09-19 16:32:54 -07001680 CLK_LOOKUP("mem_clk", ebi1_adm_clk.c, "msm_dmov"),
Vikram Mulukutla489e39e2011-08-31 18:04:05 -07001681
Ramesh Masavarapufa679d92011-10-13 23:42:59 -07001682 CLK_LOOKUP("iface_clk", ce1_p_clk.c, "qce.0"),
1683 CLK_LOOKUP("iface_clk", ce1_p_clk.c, "qcrypto.0"),
1684 CLK_LOOKUP("core_clk", ce1_core_clk.c, "qce.0"),
1685 CLK_LOOKUP("core_clk", ce1_core_clk.c, "qcrypto.0"),
1686
Vikram Mulukutlaefd64f52012-01-09 17:41:09 -08001687 CLK_LOOKUP("q6sw_clk", q6sw_clk, NULL),
1688 CLK_LOOKUP("q6fw_clk", q6fw_clk, NULL),
1689 CLK_LOOKUP("q6_func_clk", q6_func_clk, NULL),
Vikram Mulukutla489e39e2011-08-31 18:04:05 -07001690};
1691
Vikram Mulukutla5b146722012-04-23 18:17:50 -07001692static struct pll_config_regs pll0_regs __initdata = {
1693 .l_reg = BB_PLL0_L_VAL_REG,
1694 .m_reg = BB_PLL0_M_VAL_REG,
1695 .n_reg = BB_PLL0_N_VAL_REG,
1696 .config_reg = BB_PLL0_CONFIG_REG,
1697 .mode_reg = BB_PLL0_MODE_REG,
1698};
Vikram Mulukutla489e39e2011-08-31 18:04:05 -07001699
Vikram Mulukutla5b146722012-04-23 18:17:50 -07001700static struct pll_config pll0_config __initdata = {
1701 .l = 0xE,
1702 .m = 0x3,
1703 .n = 0x8,
1704 .vco_val = 0x0,
1705 .vco_mask = BM(17, 16),
1706 .pre_div_val = 0x0,
1707 .pre_div_mask = BIT(19),
1708 .post_div_val = 0x0,
1709 .post_div_mask = BM(21, 20),
1710 .mn_ena_val = BIT(22),
1711 .mn_ena_mask = BIT(22),
1712 .main_output_val = BIT(23),
1713 .main_output_mask = BIT(23),
1714};
Vikram Mulukutla489e39e2011-08-31 18:04:05 -07001715
Vikram Mulukutla5b146722012-04-23 18:17:50 -07001716static struct pll_config_regs pll14_regs __initdata = {
1717 .l_reg = BB_PLL14_L_VAL_REG,
1718 .m_reg = BB_PLL14_M_VAL_REG,
1719 .n_reg = BB_PLL14_N_VAL_REG,
1720 .config_reg = BB_PLL14_CONFIG_REG,
1721 .mode_reg = BB_PLL14_MODE_REG,
1722};
Vikram Mulukutla489e39e2011-08-31 18:04:05 -07001723
Vikram Mulukutla5b146722012-04-23 18:17:50 -07001724static struct pll_config pll14_config __initdata = {
1725 .l = 0x19,
1726 .m = 0x0,
1727 .n = 0x1,
1728 .vco_val = 0x0,
1729 .vco_mask = BM(17, 16),
1730 .pre_div_val = 0x0,
1731 .pre_div_mask = BIT(19),
1732 .post_div_val = 0x0,
1733 .post_div_mask = BM(21, 20),
1734 .main_output_val = BIT(23),
1735 .main_output_mask = BIT(23),
1736};
Vikram Mulukutla489e39e2011-08-31 18:04:05 -07001737
1738/*
1739 * Miscellaneous clock register initializations
1740 */
Matt Wagantallb64888f2012-04-02 21:35:07 -07001741static void __init msm9615_clock_pre_init(void)
Vikram Mulukutla489e39e2011-08-31 18:04:05 -07001742{
Vikram Mulukutla01d06b82012-01-10 14:19:44 -08001743 u32 regval, is_pll_enabled, pll9_lval;
Vikram Mulukutla489e39e2011-08-31 18:04:05 -07001744
Matt Wagantallb64888f2012-04-02 21:35:07 -07001745 vote_vdd_level(&vdd_dig, VDD_DIG_HIGH);
1746
Vikram Mulukutla681d8682012-03-09 23:56:20 -08001747 clk_ops_local_pll.enable = sr_pll_clk_enable;
Matt Wagantallb64888f2012-04-02 21:35:07 -07001748
Vikram Mulukutla489e39e2011-08-31 18:04:05 -07001749 /* Enable PDM CXO source. */
1750 regval = readl_relaxed(PDM_CLK_NS_REG);
1751 writel_relaxed(BIT(13) | regval, PDM_CLK_NS_REG);
1752
1753 /* Check if PLL0 is active */
1754 is_pll_enabled = readl_relaxed(BB_PLL0_STATUS_REG) & BIT(16);
1755
1756 if (!is_pll_enabled) {
Vikram Mulukutla489e39e2011-08-31 18:04:05 -07001757 /* Enable AUX output */
1758 regval = readl_relaxed(BB_PLL0_TEST_CTL_REG);
1759 regval |= BIT(12);
1760 writel_relaxed(regval, BB_PLL0_TEST_CTL_REG);
1761
Vikram Mulukutla5b146722012-04-23 18:17:50 -07001762 configure_pll(&pll0_config, &pll0_regs, 1);
Vikram Mulukutla489e39e2011-08-31 18:04:05 -07001763 }
1764
Vikram Mulukutla3349d932011-10-12 20:00:34 -07001765 /* Check if PLL14 is enabled in FSM mode */
1766 is_pll_enabled = readl_relaxed(BB_PLL14_STATUS_REG) & BIT(16);
1767
Vikram Mulukutla5b146722012-04-23 18:17:50 -07001768 if (!is_pll_enabled)
1769 configure_pll(&pll14_config, &pll14_regs, 1);
1770 else if (!(readl_relaxed(BB_PLL14_MODE_REG) & BIT(20)))
Vikram Mulukutla3349d932011-10-12 20:00:34 -07001771 WARN(1, "PLL14 enabled in non-FSM mode!\n");
1772
Vikram Mulukutla01d06b82012-01-10 14:19:44 -08001773 /* Detect PLL9 rate and fixup structure accordingly */
1774 pll9_lval = readl_relaxed(SC_PLL0_L_VAL_REG);
1775
1776 if (pll9_lval == 0x1C)
Tianyi Gou7949ecb2012-02-14 14:25:32 -08001777 pll9_acpu_clk.c.rate = 550000000;
Vikram Mulukutla01d06b82012-01-10 14:19:44 -08001778
Vikram Mulukutla489e39e2011-08-31 18:04:05 -07001779 /* Enable PLL4 source on the LPASS Primary PLL Mux */
1780 regval = readl_relaxed(LCC_PRI_PLL_CLK_CTL_REG);
1781 writel_relaxed(regval | BIT(0), LCC_PRI_PLL_CLK_CTL_REG);
Vikram Mulukutla0ee27882011-11-15 18:25:04 -08001782
Matt Wagantallbc8c9062012-02-07 12:33:06 -08001783 /*
1784 * Disable hardware clock gating for pmem_clk. Leaving it enabled
1785 * results in the clock staying on.
1786 */
1787 regval = readl_relaxed(PMEM_ACLK_CTL_REG);
Vikram Mulukutla0ee27882011-11-15 18:25:04 -08001788 regval &= ~BIT(6);
Matt Wagantallbc8c9062012-02-07 12:33:06 -08001789 writel_relaxed(regval, PMEM_ACLK_CTL_REG);
Matt Wagantallebbb29f2012-02-13 14:45:46 -08001790
1791 /*
1792 * Disable hardware clock gating for dma_bam_p_clk, which does
1793 * not have working support for the feature.
1794 */
1795 regval = readl_relaxed(DMA_BAM_HCLK_CTL);
1796 regval &= ~BIT(6);
1797 writel_relaxed(regval, DMA_BAM_HCLK_CTL);
Vikram Mulukutla489e39e2011-08-31 18:04:05 -07001798}
1799
Matt Wagantallb64888f2012-04-02 21:35:07 -07001800static void __init msm9615_clock_post_init(void)
Vikram Mulukutla489e39e2011-08-31 18:04:05 -07001801{
Stephen Boyd72a80352012-01-26 15:57:38 -08001802 /* Keep CXO on whenever APPS cpu is active */
1803 clk_prepare_enable(&cxo_a_clk.c);
Vikram Mulukutla489e39e2011-08-31 18:04:05 -07001804
Vikram Mulukutla489e39e2011-08-31 18:04:05 -07001805 /* Initialize rates for clocks that only support one. */
1806 clk_set_rate(&pdm_clk.c, 19200000);
1807 clk_set_rate(&prng_clk.c, 32000000);
1808 clk_set_rate(&usb_hs1_xcvr_clk.c, 60000000);
1809 clk_set_rate(&usb_hs1_sys_clk.c, 60000000);
1810 clk_set_rate(&usb_hsic_xcvr_clk.c, 60000000);
Vikram Mulukutla6c9158f2011-12-08 12:41:20 -08001811 clk_set_rate(&usb_hsic_sys_clk.c, 64000000);
1812 clk_set_rate(&usb_hsic_clk.c, 480000000);
Vikram Mulukutla489e39e2011-08-31 18:04:05 -07001813
1814 /*
1815 * The halt status bits for PDM may be incorrect at boot.
1816 * Toggle these clocks on and off to refresh them.
1817 */
Stephen Boyd409b8b42012-04-10 12:12:56 -07001818 clk_prepare_enable(&pdm_clk.c);
1819 clk_disable_unprepare(&pdm_clk.c);
Vikram Mulukutla489e39e2011-08-31 18:04:05 -07001820}
1821
1822static int __init msm9615_clock_late_init(void)
1823{
Matt Wagantalle18bbc82011-10-06 10:07:28 -07001824 return unvote_vdd_level(&vdd_dig, VDD_DIG_HIGH);
Vikram Mulukutla489e39e2011-08-31 18:04:05 -07001825}
1826
1827struct clock_init_data msm9615_clock_init_data __initdata = {
1828 .table = msm_clocks_9615,
1829 .size = ARRAY_SIZE(msm_clocks_9615),
Matt Wagantallb64888f2012-04-02 21:35:07 -07001830 .pre_init = msm9615_clock_pre_init,
1831 .post_init = msm9615_clock_post_init,
Vikram Mulukutla489e39e2011-08-31 18:04:05 -07001832 .late_init = msm9615_clock_late_init,
1833};