blob: 8bb9a226d05c9c33f926caf1ecd1c3816fa4cc56 [file] [log] [blame]
Peter De Schrijver2cb5efe2013-04-03 17:40:45 +03001/*
2 * Copyright (c) 2012, 2013, NVIDIA CORPORATION. All rights reserved.
3 *
4 * This program is free software; you can redistribute it and/or modify it
5 * under the terms and conditions of the GNU General Public License,
6 * version 2, as published by the Free Software Foundation.
7 *
8 * This program is distributed in the hope it will be useful, but WITHOUT
9 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
10 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
11 * more details.
12 *
13 * You should have received a copy of the GNU General Public License
14 * along with this program. If not, see <http://www.gnu.org/licenses/>.
15 */
16
17#include <linux/io.h>
18#include <linux/clk.h>
19#include <linux/clk-provider.h>
20#include <linux/clkdev.h>
21#include <linux/of.h>
22#include <linux/of_address.h>
23#include <linux/delay.h>
Paul Walmsley25c9ded2013-06-07 06:18:58 -060024#include <linux/export.h>
Peter De Schrijver2cb5efe2013-04-03 17:40:45 +030025#include <linux/clk/tegra.h>
Peter De Schrijverc9e2d692013-08-22 15:27:46 +030026#include <dt-bindings/clock/tegra114-car.h>
Peter De Schrijver2cb5efe2013-04-03 17:40:45 +030027
28#include "clk.h"
Peter De Schrijver6609dbe2013-09-17 15:42:24 +030029#include "clk-id.h"
Peter De Schrijver2cb5efe2013-04-03 17:40:45 +030030
Paul Walmsley1c472d82013-06-07 06:19:09 -060031#define RST_DFLL_DVCO 0x2F4
Paul Walmsley25c9ded2013-06-07 06:18:58 -060032#define CPU_FINETRIM_SELECT 0x4d4 /* override default prop dlys */
33#define CPU_FINETRIM_DR 0x4d8 /* rise->rise prop dly A */
34#define CPU_FINETRIM_R 0x4e4 /* rise->rise prop dly inc A */
Peter De Schrijver2cb5efe2013-04-03 17:40:45 +030035
Paul Walmsley1c472d82013-06-07 06:19:09 -060036/* RST_DFLL_DVCO bitfields */
37#define DVFS_DFLL_RESET_SHIFT 0
38
Paul Walmsley25c9ded2013-06-07 06:18:58 -060039/* CPU_FINETRIM_SELECT and CPU_FINETRIM_DR bitfields */
40#define CPU_FINETRIM_1_FCPU_1 BIT(0) /* fcpu0 */
41#define CPU_FINETRIM_1_FCPU_2 BIT(1) /* fcpu1 */
42#define CPU_FINETRIM_1_FCPU_3 BIT(2) /* fcpu2 */
43#define CPU_FINETRIM_1_FCPU_4 BIT(3) /* fcpu3 */
44#define CPU_FINETRIM_1_FCPU_5 BIT(4) /* fl2 */
45#define CPU_FINETRIM_1_FCPU_6 BIT(5) /* ftop */
46
47/* CPU_FINETRIM_R bitfields */
48#define CPU_FINETRIM_R_FCPU_1_SHIFT 0 /* fcpu0 */
49#define CPU_FINETRIM_R_FCPU_1_MASK (0x3 << CPU_FINETRIM_R_FCPU_1_SHIFT)
50#define CPU_FINETRIM_R_FCPU_2_SHIFT 2 /* fcpu1 */
51#define CPU_FINETRIM_R_FCPU_2_MASK (0x3 << CPU_FINETRIM_R_FCPU_2_SHIFT)
52#define CPU_FINETRIM_R_FCPU_3_SHIFT 4 /* fcpu2 */
53#define CPU_FINETRIM_R_FCPU_3_MASK (0x3 << CPU_FINETRIM_R_FCPU_3_SHIFT)
54#define CPU_FINETRIM_R_FCPU_4_SHIFT 6 /* fcpu3 */
55#define CPU_FINETRIM_R_FCPU_4_MASK (0x3 << CPU_FINETRIM_R_FCPU_4_SHIFT)
56#define CPU_FINETRIM_R_FCPU_5_SHIFT 8 /* fl2 */
57#define CPU_FINETRIM_R_FCPU_5_MASK (0x3 << CPU_FINETRIM_R_FCPU_5_SHIFT)
58#define CPU_FINETRIM_R_FCPU_6_SHIFT 10 /* ftop */
59#define CPU_FINETRIM_R_FCPU_6_MASK (0x3 << CPU_FINETRIM_R_FCPU_6_SHIFT)
60
Peter De Schrijverd5ff89a2013-08-22 18:44:06 +030061#define TEGRA114_CLK_PERIPH_BANKS 5
62
Peter De Schrijver2cb5efe2013-04-03 17:40:45 +030063#define PLLC_BASE 0x80
64#define PLLC_MISC2 0x88
65#define PLLC_MISC 0x8c
66#define PLLC2_BASE 0x4e8
67#define PLLC2_MISC 0x4ec
68#define PLLC3_BASE 0x4fc
69#define PLLC3_MISC 0x500
70#define PLLM_BASE 0x90
71#define PLLM_MISC 0x9c
72#define PLLP_BASE 0xa0
73#define PLLP_MISC 0xac
74#define PLLX_BASE 0xe0
75#define PLLX_MISC 0xe4
76#define PLLX_MISC2 0x514
77#define PLLX_MISC3 0x518
78#define PLLD_BASE 0xd0
79#define PLLD_MISC 0xdc
80#define PLLD2_BASE 0x4b8
81#define PLLD2_MISC 0x4bc
82#define PLLE_BASE 0xe8
83#define PLLE_MISC 0xec
84#define PLLA_BASE 0xb0
85#define PLLA_MISC 0xbc
86#define PLLU_BASE 0xc0
87#define PLLU_MISC 0xcc
88#define PLLRE_BASE 0x4c4
89#define PLLRE_MISC 0x4c8
90
91#define PLL_MISC_LOCK_ENABLE 18
92#define PLLC_MISC_LOCK_ENABLE 24
93#define PLLDU_MISC_LOCK_ENABLE 22
94#define PLLE_MISC_LOCK_ENABLE 9
95#define PLLRE_MISC_LOCK_ENABLE 30
96
97#define PLLC_IDDQ_BIT 26
98#define PLLX_IDDQ_BIT 3
99#define PLLRE_IDDQ_BIT 16
100
101#define PLL_BASE_LOCK BIT(27)
102#define PLLE_MISC_LOCK BIT(11)
103#define PLLRE_MISC_LOCK BIT(24)
104#define PLLCX_BASE_LOCK (BIT(26)|BIT(27))
105
106#define PLLE_AUX 0x48c
107#define PLLC_OUT 0x84
108#define PLLM_OUT 0x94
109#define PLLP_OUTA 0xa4
110#define PLLP_OUTB 0xa8
Peter De Schrijver2cb5efe2013-04-03 17:40:45 +0300111
112#define PMC_CLK_OUT_CNTRL 0x1a8
113#define PMC_DPD_PADS_ORIDE 0x1c
114#define PMC_DPD_PADS_ORIDE_BLINK_ENB 20
115#define PMC_CTRL 0
116#define PMC_CTRL_BLINK_ENB 7
Alexandre Courbot91392272013-05-26 11:56:31 +0900117#define PMC_BLINK_TIMER 0x40
Peter De Schrijver2cb5efe2013-04-03 17:40:45 +0300118
119#define OSC_CTRL 0x50
120#define OSC_CTRL_OSC_FREQ_SHIFT 28
121#define OSC_CTRL_PLL_REF_DIV_SHIFT 26
122
123#define PLLXC_SW_MAX_P 6
124
125#define CCLKG_BURST_POLICY 0x368
126#define CCLKLP_BURST_POLICY 0x370
127#define SCLK_BURST_POLICY 0x028
128#define SYSTEM_CLK_RATE 0x030
129
130#define UTMIP_PLL_CFG2 0x488
131#define UTMIP_PLL_CFG2_STABLE_COUNT(x) (((x) & 0xffff) << 6)
132#define UTMIP_PLL_CFG2_ACTIVE_DLY_COUNT(x) (((x) & 0x3f) << 18)
133#define UTMIP_PLL_CFG2_FORCE_PD_SAMP_A_POWERDOWN BIT(0)
134#define UTMIP_PLL_CFG2_FORCE_PD_SAMP_B_POWERDOWN BIT(2)
135#define UTMIP_PLL_CFG2_FORCE_PD_SAMP_C_POWERDOWN BIT(4)
136
137#define UTMIP_PLL_CFG1 0x484
138#define UTMIP_PLL_CFG1_ENABLE_DLY_COUNT(x) (((x) & 0x1f) << 6)
139#define UTMIP_PLL_CFG1_XTAL_FREQ_COUNT(x) (((x) & 0xfff) << 0)
140#define UTMIP_PLL_CFG1_FORCE_PLLU_POWERUP BIT(17)
141#define UTMIP_PLL_CFG1_FORCE_PLLU_POWERDOWN BIT(16)
142#define UTMIP_PLL_CFG1_FORCE_PLL_ENABLE_POWERUP BIT(15)
143#define UTMIP_PLL_CFG1_FORCE_PLL_ENABLE_POWERDOWN BIT(14)
144#define UTMIP_PLL_CFG1_FORCE_PLL_ACTIVE_POWERDOWN BIT(12)
145
146#define UTMIPLL_HW_PWRDN_CFG0 0x52c
147#define UTMIPLL_HW_PWRDN_CFG0_SEQ_START_STATE BIT(25)
148#define UTMIPLL_HW_PWRDN_CFG0_SEQ_ENABLE BIT(24)
149#define UTMIPLL_HW_PWRDN_CFG0_USE_LOCKDET BIT(6)
150#define UTMIPLL_HW_PWRDN_CFG0_SEQ_RESET_INPUT_VALUE BIT(5)
151#define UTMIPLL_HW_PWRDN_CFG0_SEQ_IN_SWCTL BIT(4)
152#define UTMIPLL_HW_PWRDN_CFG0_CLK_ENABLE_SWCTL BIT(2)
153#define UTMIPLL_HW_PWRDN_CFG0_IDDQ_OVERRIDE BIT(1)
154#define UTMIPLL_HW_PWRDN_CFG0_IDDQ_SWCTL BIT(0)
155
156#define CLK_SOURCE_I2S0 0x1d8
157#define CLK_SOURCE_I2S1 0x100
158#define CLK_SOURCE_I2S2 0x104
159#define CLK_SOURCE_NDFLASH 0x160
160#define CLK_SOURCE_I2S3 0x3bc
161#define CLK_SOURCE_I2S4 0x3c0
162#define CLK_SOURCE_SPDIF_OUT 0x108
163#define CLK_SOURCE_SPDIF_IN 0x10c
164#define CLK_SOURCE_PWM 0x110
165#define CLK_SOURCE_ADX 0x638
166#define CLK_SOURCE_AMX 0x63c
167#define CLK_SOURCE_HDA 0x428
168#define CLK_SOURCE_HDA2CODEC_2X 0x3e4
169#define CLK_SOURCE_SBC1 0x134
170#define CLK_SOURCE_SBC2 0x118
171#define CLK_SOURCE_SBC3 0x11c
172#define CLK_SOURCE_SBC4 0x1b4
173#define CLK_SOURCE_SBC5 0x3c8
174#define CLK_SOURCE_SBC6 0x3cc
175#define CLK_SOURCE_SATA_OOB 0x420
176#define CLK_SOURCE_SATA 0x424
177#define CLK_SOURCE_NDSPEED 0x3f8
178#define CLK_SOURCE_VFIR 0x168
179#define CLK_SOURCE_SDMMC1 0x150
180#define CLK_SOURCE_SDMMC2 0x154
181#define CLK_SOURCE_SDMMC3 0x1bc
182#define CLK_SOURCE_SDMMC4 0x164
183#define CLK_SOURCE_VDE 0x1c8
184#define CLK_SOURCE_CSITE 0x1d4
185#define CLK_SOURCE_LA 0x1f8
186#define CLK_SOURCE_TRACE 0x634
187#define CLK_SOURCE_OWR 0x1cc
188#define CLK_SOURCE_NOR 0x1d0
189#define CLK_SOURCE_MIPI 0x174
190#define CLK_SOURCE_I2C1 0x124
191#define CLK_SOURCE_I2C2 0x198
192#define CLK_SOURCE_I2C3 0x1b8
193#define CLK_SOURCE_I2C4 0x3c4
194#define CLK_SOURCE_I2C5 0x128
195#define CLK_SOURCE_UARTA 0x178
196#define CLK_SOURCE_UARTB 0x17c
197#define CLK_SOURCE_UARTC 0x1a0
198#define CLK_SOURCE_UARTD 0x1c0
199#define CLK_SOURCE_UARTE 0x1c4
200#define CLK_SOURCE_UARTA_DBG 0x178
201#define CLK_SOURCE_UARTB_DBG 0x17c
202#define CLK_SOURCE_UARTC_DBG 0x1a0
203#define CLK_SOURCE_UARTD_DBG 0x1c0
204#define CLK_SOURCE_UARTE_DBG 0x1c4
205#define CLK_SOURCE_3D 0x158
206#define CLK_SOURCE_2D 0x15c
207#define CLK_SOURCE_VI_SENSOR 0x1a8
208#define CLK_SOURCE_VI 0x148
209#define CLK_SOURCE_EPP 0x16c
210#define CLK_SOURCE_MSENC 0x1f0
211#define CLK_SOURCE_TSEC 0x1f4
212#define CLK_SOURCE_HOST1X 0x180
213#define CLK_SOURCE_HDMI 0x18c
214#define CLK_SOURCE_DISP1 0x138
215#define CLK_SOURCE_DISP2 0x13c
216#define CLK_SOURCE_CILAB 0x614
217#define CLK_SOURCE_CILCD 0x618
218#define CLK_SOURCE_CILE 0x61c
219#define CLK_SOURCE_DSIALP 0x620
220#define CLK_SOURCE_DSIBLP 0x624
221#define CLK_SOURCE_TSENSOR 0x3b8
222#define CLK_SOURCE_D_AUDIO 0x3d0
223#define CLK_SOURCE_DAM0 0x3d8
224#define CLK_SOURCE_DAM1 0x3dc
225#define CLK_SOURCE_DAM2 0x3e0
226#define CLK_SOURCE_ACTMON 0x3e8
227#define CLK_SOURCE_EXTERN1 0x3ec
228#define CLK_SOURCE_EXTERN2 0x3f0
229#define CLK_SOURCE_EXTERN3 0x3f4
230#define CLK_SOURCE_I2CSLOW 0x3fc
231#define CLK_SOURCE_SE 0x42c
232#define CLK_SOURCE_MSELECT 0x3b4
Paul Walmsley9e601212013-06-07 06:19:01 -0600233#define CLK_SOURCE_DFLL_REF 0x62c
234#define CLK_SOURCE_DFLL_SOC 0x630
Peter De Schrijver2cb5efe2013-04-03 17:40:45 +0300235#define CLK_SOURCE_SOC_THERM 0x644
236#define CLK_SOURCE_XUSB_HOST_SRC 0x600
237#define CLK_SOURCE_XUSB_FALCON_SRC 0x604
238#define CLK_SOURCE_XUSB_FS_SRC 0x608
239#define CLK_SOURCE_XUSB_SS_SRC 0x610
240#define CLK_SOURCE_XUSB_DEV_SRC 0x60c
241#define CLK_SOURCE_EMC 0x19c
242
Peter De Schrijverd53442e2013-06-06 13:47:29 +0300243/* PLLM override registers */
244#define PMC_PLLM_WB0_OVERRIDE 0x1dc
245#define PMC_PLLM_WB0_OVERRIDE_2 0x2b0
246
Joseph Lo31972fd2013-05-20 18:39:28 +0800247/* Tegra CPU clock and reset control regs */
248#define CLK_RST_CONTROLLER_CPU_CMPLX_STATUS 0x470
249
Joseph Load7d1142013-07-03 17:50:44 +0800250#ifdef CONFIG_PM_SLEEP
251static struct cpu_clk_suspend_context {
252 u32 clk_csite_src;
Joseph Lo0017f442013-08-12 17:40:02 +0800253 u32 cclkg_burst;
254 u32 cclkg_divider;
Joseph Load7d1142013-07-03 17:50:44 +0800255} tegra114_cpu_clk_sctx;
256#endif
257
Peter De Schrijver2cb5efe2013-04-03 17:40:45 +0300258static void __iomem *clk_base;
259static void __iomem *pmc_base;
260
261static DEFINE_SPINLOCK(pll_d_lock);
262static DEFINE_SPINLOCK(pll_d2_lock);
263static DEFINE_SPINLOCK(pll_u_lock);
264static DEFINE_SPINLOCK(pll_div_lock);
265static DEFINE_SPINLOCK(pll_re_lock);
Peter De Schrijver2cb5efe2013-04-03 17:40:45 +0300266static DEFINE_SPINLOCK(clk_out_lock);
267static DEFINE_SPINLOCK(sysrate_lock);
268
Peter De Schrijverfd428ad2013-06-05 16:51:26 +0300269static struct div_nmp pllxc_nmp = {
270 .divm_shift = 0,
271 .divm_width = 8,
272 .divn_shift = 8,
273 .divn_width = 8,
274 .divp_shift = 20,
275 .divp_width = 4,
276};
277
Peter De Schrijver2cb5efe2013-04-03 17:40:45 +0300278static struct pdiv_map pllxc_p[] = {
279 { .pdiv = 1, .hw_val = 0 },
280 { .pdiv = 2, .hw_val = 1 },
281 { .pdiv = 3, .hw_val = 2 },
282 { .pdiv = 4, .hw_val = 3 },
283 { .pdiv = 5, .hw_val = 4 },
284 { .pdiv = 6, .hw_val = 5 },
285 { .pdiv = 8, .hw_val = 6 },
286 { .pdiv = 10, .hw_val = 7 },
287 { .pdiv = 12, .hw_val = 8 },
288 { .pdiv = 16, .hw_val = 9 },
289 { .pdiv = 12, .hw_val = 10 },
290 { .pdiv = 16, .hw_val = 11 },
291 { .pdiv = 20, .hw_val = 12 },
292 { .pdiv = 24, .hw_val = 13 },
293 { .pdiv = 32, .hw_val = 14 },
294 { .pdiv = 0, .hw_val = 0 },
295};
296
297static struct tegra_clk_pll_freq_table pll_c_freq_table[] = {
298 { 12000000, 624000000, 104, 0, 2},
299 { 12000000, 600000000, 100, 0, 2},
300 { 13000000, 600000000, 92, 0, 2}, /* actual: 598.0 MHz */
301 { 16800000, 600000000, 71, 0, 2}, /* actual: 596.4 MHz */
302 { 19200000, 600000000, 62, 0, 2}, /* actual: 595.2 MHz */
303 { 26000000, 600000000, 92, 1, 2}, /* actual: 598.0 MHz */
304 { 0, 0, 0, 0, 0, 0 },
305};
306
307static struct tegra_clk_pll_params pll_c_params = {
308 .input_min = 12000000,
309 .input_max = 800000000,
310 .cf_min = 12000000,
311 .cf_max = 19200000, /* s/w policy, h/w capability 50 MHz */
312 .vco_min = 600000000,
313 .vco_max = 1400000000,
314 .base_reg = PLLC_BASE,
315 .misc_reg = PLLC_MISC,
316 .lock_mask = PLL_BASE_LOCK,
317 .lock_enable_bit_idx = PLLC_MISC_LOCK_ENABLE,
318 .lock_delay = 300,
319 .iddq_reg = PLLC_MISC,
320 .iddq_bit_idx = PLLC_IDDQ_BIT,
321 .max_p = PLLXC_SW_MAX_P,
322 .dyn_ramp_reg = PLLC_MISC2,
323 .stepa_shift = 17,
324 .stepb_shift = 9,
325 .pdiv_tohw = pllxc_p,
Peter De Schrijverfd428ad2013-06-05 16:51:26 +0300326 .div_nmp = &pllxc_nmp,
Peter De Schrijverebe142b2013-10-04 17:28:34 +0300327 .freq_table = pll_c_freq_table,
328 .flags = TEGRA_PLL_USE_LOCK,
Peter De Schrijverfd428ad2013-06-05 16:51:26 +0300329};
330
331static struct div_nmp pllcx_nmp = {
332 .divm_shift = 0,
333 .divm_width = 2,
334 .divn_shift = 8,
335 .divn_width = 8,
336 .divp_shift = 20,
337 .divp_width = 3,
Peter De Schrijver2cb5efe2013-04-03 17:40:45 +0300338};
339
340static struct pdiv_map pllc_p[] = {
341 { .pdiv = 1, .hw_val = 0 },
342 { .pdiv = 2, .hw_val = 1 },
343 { .pdiv = 4, .hw_val = 3 },
344 { .pdiv = 8, .hw_val = 5 },
345 { .pdiv = 16, .hw_val = 7 },
346 { .pdiv = 0, .hw_val = 0 },
347};
348
349static struct tegra_clk_pll_freq_table pll_cx_freq_table[] = {
350 {12000000, 600000000, 100, 0, 2},
351 {13000000, 600000000, 92, 0, 2}, /* actual: 598.0 MHz */
352 {16800000, 600000000, 71, 0, 2}, /* actual: 596.4 MHz */
353 {19200000, 600000000, 62, 0, 2}, /* actual: 595.2 MHz */
354 {26000000, 600000000, 92, 1, 2}, /* actual: 598.0 MHz */
355 {0, 0, 0, 0, 0, 0},
356};
357
358static struct tegra_clk_pll_params pll_c2_params = {
359 .input_min = 12000000,
360 .input_max = 48000000,
361 .cf_min = 12000000,
362 .cf_max = 19200000,
363 .vco_min = 600000000,
364 .vco_max = 1200000000,
365 .base_reg = PLLC2_BASE,
366 .misc_reg = PLLC2_MISC,
367 .lock_mask = PLL_BASE_LOCK,
368 .lock_enable_bit_idx = PLL_MISC_LOCK_ENABLE,
369 .lock_delay = 300,
370 .pdiv_tohw = pllc_p,
Peter De Schrijverfd428ad2013-06-05 16:51:26 +0300371 .div_nmp = &pllcx_nmp,
372 .max_p = 7,
Peter De Schrijver2cb5efe2013-04-03 17:40:45 +0300373 .ext_misc_reg[0] = 0x4f0,
374 .ext_misc_reg[1] = 0x4f4,
375 .ext_misc_reg[2] = 0x4f8,
Peter De Schrijverebe142b2013-10-04 17:28:34 +0300376 .freq_table = pll_cx_freq_table,
377 .flags = TEGRA_PLL_USE_LOCK,
Peter De Schrijver2cb5efe2013-04-03 17:40:45 +0300378};
379
380static struct tegra_clk_pll_params pll_c3_params = {
381 .input_min = 12000000,
382 .input_max = 48000000,
383 .cf_min = 12000000,
384 .cf_max = 19200000,
385 .vco_min = 600000000,
386 .vco_max = 1200000000,
387 .base_reg = PLLC3_BASE,
388 .misc_reg = PLLC3_MISC,
389 .lock_mask = PLL_BASE_LOCK,
390 .lock_enable_bit_idx = PLL_MISC_LOCK_ENABLE,
391 .lock_delay = 300,
392 .pdiv_tohw = pllc_p,
Peter De Schrijverfd428ad2013-06-05 16:51:26 +0300393 .div_nmp = &pllcx_nmp,
394 .max_p = 7,
Peter De Schrijver2cb5efe2013-04-03 17:40:45 +0300395 .ext_misc_reg[0] = 0x504,
396 .ext_misc_reg[1] = 0x508,
397 .ext_misc_reg[2] = 0x50c,
Peter De Schrijverebe142b2013-10-04 17:28:34 +0300398 .freq_table = pll_cx_freq_table,
399 .flags = TEGRA_PLL_USE_LOCK,
Peter De Schrijver2cb5efe2013-04-03 17:40:45 +0300400};
401
Peter De Schrijverfd428ad2013-06-05 16:51:26 +0300402static struct div_nmp pllm_nmp = {
403 .divm_shift = 0,
404 .divm_width = 8,
Peter De Schrijverd53442e2013-06-06 13:47:29 +0300405 .override_divm_shift = 0,
Peter De Schrijverfd428ad2013-06-05 16:51:26 +0300406 .divn_shift = 8,
407 .divn_width = 8,
Peter De Schrijverd53442e2013-06-06 13:47:29 +0300408 .override_divn_shift = 8,
Peter De Schrijverfd428ad2013-06-05 16:51:26 +0300409 .divp_shift = 20,
410 .divp_width = 1,
Peter De Schrijverd53442e2013-06-06 13:47:29 +0300411 .override_divp_shift = 27,
Peter De Schrijverfd428ad2013-06-05 16:51:26 +0300412};
413
Peter De Schrijver2cb5efe2013-04-03 17:40:45 +0300414static struct pdiv_map pllm_p[] = {
415 { .pdiv = 1, .hw_val = 0 },
416 { .pdiv = 2, .hw_val = 1 },
417 { .pdiv = 0, .hw_val = 0 },
418};
419
420static struct tegra_clk_pll_freq_table pll_m_freq_table[] = {
421 {12000000, 800000000, 66, 0, 1}, /* actual: 792.0 MHz */
422 {13000000, 800000000, 61, 0, 1}, /* actual: 793.0 MHz */
423 {16800000, 800000000, 47, 0, 1}, /* actual: 789.6 MHz */
424 {19200000, 800000000, 41, 0, 1}, /* actual: 787.2 MHz */
425 {26000000, 800000000, 61, 1, 1}, /* actual: 793.0 MHz */
426 {0, 0, 0, 0, 0, 0},
427};
428
429static struct tegra_clk_pll_params pll_m_params = {
430 .input_min = 12000000,
431 .input_max = 500000000,
432 .cf_min = 12000000,
433 .cf_max = 19200000, /* s/w policy, h/w capability 50 MHz */
434 .vco_min = 400000000,
435 .vco_max = 1066000000,
436 .base_reg = PLLM_BASE,
437 .misc_reg = PLLM_MISC,
438 .lock_mask = PLL_BASE_LOCK,
439 .lock_enable_bit_idx = PLL_MISC_LOCK_ENABLE,
440 .lock_delay = 300,
441 .max_p = 2,
442 .pdiv_tohw = pllm_p,
Peter De Schrijverfd428ad2013-06-05 16:51:26 +0300443 .div_nmp = &pllm_nmp,
Peter De Schrijverd53442e2013-06-06 13:47:29 +0300444 .pmc_divnm_reg = PMC_PLLM_WB0_OVERRIDE,
445 .pmc_divp_reg = PMC_PLLM_WB0_OVERRIDE_2,
Peter De Schrijverebe142b2013-10-04 17:28:34 +0300446 .freq_table = pll_m_freq_table,
447 .flags = TEGRA_PLL_USE_LOCK,
Peter De Schrijverfd428ad2013-06-05 16:51:26 +0300448};
449
450static struct div_nmp pllp_nmp = {
451 .divm_shift = 0,
452 .divm_width = 5,
453 .divn_shift = 8,
454 .divn_width = 10,
455 .divp_shift = 20,
456 .divp_width = 3,
Peter De Schrijver2cb5efe2013-04-03 17:40:45 +0300457};
458
459static struct tegra_clk_pll_freq_table pll_p_freq_table[] = {
460 {12000000, 216000000, 432, 12, 1, 8},
461 {13000000, 216000000, 432, 13, 1, 8},
462 {16800000, 216000000, 360, 14, 1, 8},
463 {19200000, 216000000, 360, 16, 1, 8},
464 {26000000, 216000000, 432, 26, 1, 8},
465 {0, 0, 0, 0, 0, 0},
466};
467
468static struct tegra_clk_pll_params pll_p_params = {
469 .input_min = 2000000,
470 .input_max = 31000000,
471 .cf_min = 1000000,
472 .cf_max = 6000000,
473 .vco_min = 200000000,
474 .vco_max = 700000000,
475 .base_reg = PLLP_BASE,
476 .misc_reg = PLLP_MISC,
477 .lock_mask = PLL_BASE_LOCK,
478 .lock_enable_bit_idx = PLL_MISC_LOCK_ENABLE,
479 .lock_delay = 300,
Peter De Schrijverfd428ad2013-06-05 16:51:26 +0300480 .div_nmp = &pllp_nmp,
Peter De Schrijverebe142b2013-10-04 17:28:34 +0300481 .freq_table = pll_p_freq_table,
482 .flags = TEGRA_PLL_FIXED | TEGRA_PLL_USE_LOCK,
483 .fixed_rate = 408000000,
Peter De Schrijver2cb5efe2013-04-03 17:40:45 +0300484};
485
486static struct tegra_clk_pll_freq_table pll_a_freq_table[] = {
487 {9600000, 282240000, 147, 5, 0, 4},
488 {9600000, 368640000, 192, 5, 0, 4},
489 {9600000, 240000000, 200, 8, 0, 8},
490
491 {28800000, 282240000, 245, 25, 0, 8},
492 {28800000, 368640000, 320, 25, 0, 8},
493 {28800000, 240000000, 200, 24, 0, 8},
494 {0, 0, 0, 0, 0, 0},
495};
496
497
498static struct tegra_clk_pll_params pll_a_params = {
499 .input_min = 2000000,
500 .input_max = 31000000,
501 .cf_min = 1000000,
502 .cf_max = 6000000,
503 .vco_min = 200000000,
504 .vco_max = 700000000,
505 .base_reg = PLLA_BASE,
506 .misc_reg = PLLA_MISC,
507 .lock_mask = PLL_BASE_LOCK,
508 .lock_enable_bit_idx = PLL_MISC_LOCK_ENABLE,
509 .lock_delay = 300,
Peter De Schrijverfd428ad2013-06-05 16:51:26 +0300510 .div_nmp = &pllp_nmp,
Peter De Schrijverebe142b2013-10-04 17:28:34 +0300511 .freq_table = pll_a_freq_table,
512 .flags = TEGRA_PLL_HAS_CPCON | TEGRA_PLL_USE_LOCK,
Peter De Schrijver2cb5efe2013-04-03 17:40:45 +0300513};
514
515static struct tegra_clk_pll_freq_table pll_d_freq_table[] = {
516 {12000000, 216000000, 864, 12, 2, 12},
517 {13000000, 216000000, 864, 13, 2, 12},
518 {16800000, 216000000, 720, 14, 2, 12},
519 {19200000, 216000000, 720, 16, 2, 12},
520 {26000000, 216000000, 864, 26, 2, 12},
521
522 {12000000, 594000000, 594, 12, 0, 12},
523 {13000000, 594000000, 594, 13, 0, 12},
524 {16800000, 594000000, 495, 14, 0, 12},
525 {19200000, 594000000, 495, 16, 0, 12},
526 {26000000, 594000000, 594, 26, 0, 12},
527
528 {12000000, 1000000000, 1000, 12, 0, 12},
529 {13000000, 1000000000, 1000, 13, 0, 12},
530 {19200000, 1000000000, 625, 12, 0, 12},
531 {26000000, 1000000000, 1000, 26, 0, 12},
532
533 {0, 0, 0, 0, 0, 0},
534};
535
536static struct tegra_clk_pll_params pll_d_params = {
537 .input_min = 2000000,
538 .input_max = 40000000,
539 .cf_min = 1000000,
540 .cf_max = 6000000,
541 .vco_min = 500000000,
542 .vco_max = 1000000000,
543 .base_reg = PLLD_BASE,
544 .misc_reg = PLLD_MISC,
545 .lock_mask = PLL_BASE_LOCK,
546 .lock_enable_bit_idx = PLLDU_MISC_LOCK_ENABLE,
547 .lock_delay = 1000,
Peter De Schrijverfd428ad2013-06-05 16:51:26 +0300548 .div_nmp = &pllp_nmp,
Peter De Schrijverebe142b2013-10-04 17:28:34 +0300549 .freq_table = pll_d_freq_table,
550 .flags = TEGRA_PLL_HAS_CPCON | TEGRA_PLL_SET_LFCON |
551 TEGRA_PLL_USE_LOCK,
Peter De Schrijver2cb5efe2013-04-03 17:40:45 +0300552};
553
554static struct tegra_clk_pll_params pll_d2_params = {
555 .input_min = 2000000,
556 .input_max = 40000000,
557 .cf_min = 1000000,
558 .cf_max = 6000000,
559 .vco_min = 500000000,
560 .vco_max = 1000000000,
561 .base_reg = PLLD2_BASE,
562 .misc_reg = PLLD2_MISC,
563 .lock_mask = PLL_BASE_LOCK,
564 .lock_enable_bit_idx = PLLDU_MISC_LOCK_ENABLE,
565 .lock_delay = 1000,
Peter De Schrijverfd428ad2013-06-05 16:51:26 +0300566 .div_nmp = &pllp_nmp,
Peter De Schrijverebe142b2013-10-04 17:28:34 +0300567 .freq_table = pll_d_freq_table,
568 .flags = TEGRA_PLL_HAS_CPCON | TEGRA_PLL_SET_LFCON |
569 TEGRA_PLL_USE_LOCK,
Peter De Schrijver2cb5efe2013-04-03 17:40:45 +0300570};
571
572static struct pdiv_map pllu_p[] = {
573 { .pdiv = 1, .hw_val = 1 },
574 { .pdiv = 2, .hw_val = 0 },
575 { .pdiv = 0, .hw_val = 0 },
576};
577
Peter De Schrijverfd428ad2013-06-05 16:51:26 +0300578static struct div_nmp pllu_nmp = {
579 .divm_shift = 0,
580 .divm_width = 5,
581 .divn_shift = 8,
582 .divn_width = 10,
583 .divp_shift = 20,
584 .divp_width = 1,
585};
586
Peter De Schrijver2cb5efe2013-04-03 17:40:45 +0300587static struct tegra_clk_pll_freq_table pll_u_freq_table[] = {
588 {12000000, 480000000, 960, 12, 0, 12},
589 {13000000, 480000000, 960, 13, 0, 12},
590 {16800000, 480000000, 400, 7, 0, 5},
591 {19200000, 480000000, 200, 4, 0, 3},
592 {26000000, 480000000, 960, 26, 0, 12},
593 {0, 0, 0, 0, 0, 0},
594};
595
596static struct tegra_clk_pll_params pll_u_params = {
597 .input_min = 2000000,
598 .input_max = 40000000,
599 .cf_min = 1000000,
600 .cf_max = 6000000,
601 .vco_min = 480000000,
602 .vco_max = 960000000,
603 .base_reg = PLLU_BASE,
604 .misc_reg = PLLU_MISC,
605 .lock_mask = PLL_BASE_LOCK,
606 .lock_enable_bit_idx = PLLDU_MISC_LOCK_ENABLE,
607 .lock_delay = 1000,
608 .pdiv_tohw = pllu_p,
Peter De Schrijverfd428ad2013-06-05 16:51:26 +0300609 .div_nmp = &pllu_nmp,
Peter De Schrijverebe142b2013-10-04 17:28:34 +0300610 .freq_table = pll_u_freq_table,
611 .flags = TEGRA_PLLU | TEGRA_PLL_HAS_CPCON | TEGRA_PLL_SET_LFCON |
612 TEGRA_PLL_USE_LOCK,
Peter De Schrijver2cb5efe2013-04-03 17:40:45 +0300613};
614
615static struct tegra_clk_pll_freq_table pll_x_freq_table[] = {
616 /* 1 GHz */
617 {12000000, 1000000000, 83, 0, 1}, /* actual: 996.0 MHz */
618 {13000000, 1000000000, 76, 0, 1}, /* actual: 988.0 MHz */
619 {16800000, 1000000000, 59, 0, 1}, /* actual: 991.2 MHz */
620 {19200000, 1000000000, 52, 0, 1}, /* actual: 998.4 MHz */
621 {26000000, 1000000000, 76, 1, 1}, /* actual: 988.0 MHz */
622
623 {0, 0, 0, 0, 0, 0},
624};
625
626static struct tegra_clk_pll_params pll_x_params = {
627 .input_min = 12000000,
628 .input_max = 800000000,
629 .cf_min = 12000000,
630 .cf_max = 19200000, /* s/w policy, h/w capability 50 MHz */
631 .vco_min = 700000000,
632 .vco_max = 2400000000U,
633 .base_reg = PLLX_BASE,
634 .misc_reg = PLLX_MISC,
635 .lock_mask = PLL_BASE_LOCK,
636 .lock_enable_bit_idx = PLL_MISC_LOCK_ENABLE,
637 .lock_delay = 300,
638 .iddq_reg = PLLX_MISC3,
639 .iddq_bit_idx = PLLX_IDDQ_BIT,
640 .max_p = PLLXC_SW_MAX_P,
641 .dyn_ramp_reg = PLLX_MISC2,
642 .stepa_shift = 16,
643 .stepb_shift = 24,
644 .pdiv_tohw = pllxc_p,
Peter De Schrijverfd428ad2013-06-05 16:51:26 +0300645 .div_nmp = &pllxc_nmp,
Peter De Schrijverebe142b2013-10-04 17:28:34 +0300646 .freq_table = pll_x_freq_table,
647 .flags = TEGRA_PLL_USE_LOCK,
Peter De Schrijver2cb5efe2013-04-03 17:40:45 +0300648};
649
650static struct tegra_clk_pll_freq_table pll_e_freq_table[] = {
651 /* PLLE special case: use cpcon field to store cml divider value */
652 {336000000, 100000000, 100, 21, 16, 11},
653 {312000000, 100000000, 200, 26, 24, 13},
Peter De Schrijver8e9cc802013-11-25 14:44:13 +0200654 {12000000, 100000000, 200, 1, 24, 13},
Peter De Schrijver2cb5efe2013-04-03 17:40:45 +0300655 {0, 0, 0, 0, 0, 0},
656};
657
Peter De Schrijverfd428ad2013-06-05 16:51:26 +0300658static struct div_nmp plle_nmp = {
659 .divm_shift = 0,
660 .divm_width = 8,
661 .divn_shift = 8,
662 .divn_width = 8,
663 .divp_shift = 24,
664 .divp_width = 4,
665};
666
Peter De Schrijver2cb5efe2013-04-03 17:40:45 +0300667static struct tegra_clk_pll_params pll_e_params = {
668 .input_min = 12000000,
669 .input_max = 1000000000,
670 .cf_min = 12000000,
671 .cf_max = 75000000,
672 .vco_min = 1600000000,
673 .vco_max = 2400000000U,
674 .base_reg = PLLE_BASE,
675 .misc_reg = PLLE_MISC,
676 .aux_reg = PLLE_AUX,
677 .lock_mask = PLLE_MISC_LOCK,
678 .lock_enable_bit_idx = PLLE_MISC_LOCK_ENABLE,
679 .lock_delay = 300,
Peter De Schrijverfd428ad2013-06-05 16:51:26 +0300680 .div_nmp = &plle_nmp,
Peter De Schrijverebe142b2013-10-04 17:28:34 +0300681 .freq_table = pll_e_freq_table,
682 .flags = TEGRA_PLL_FIXED,
683 .fixed_rate = 100000000,
Peter De Schrijverfd428ad2013-06-05 16:51:26 +0300684};
685
686static struct div_nmp pllre_nmp = {
687 .divm_shift = 0,
688 .divm_width = 8,
689 .divn_shift = 8,
690 .divn_width = 8,
691 .divp_shift = 16,
692 .divp_width = 4,
Peter De Schrijver2cb5efe2013-04-03 17:40:45 +0300693};
694
695static struct tegra_clk_pll_params pll_re_vco_params = {
696 .input_min = 12000000,
697 .input_max = 1000000000,
698 .cf_min = 12000000,
699 .cf_max = 19200000, /* s/w policy, h/w capability 38 MHz */
700 .vco_min = 300000000,
701 .vco_max = 600000000,
702 .base_reg = PLLRE_BASE,
703 .misc_reg = PLLRE_MISC,
704 .lock_mask = PLLRE_MISC_LOCK,
705 .lock_enable_bit_idx = PLLRE_MISC_LOCK_ENABLE,
706 .lock_delay = 300,
707 .iddq_reg = PLLRE_MISC,
708 .iddq_bit_idx = PLLRE_IDDQ_BIT,
Peter De Schrijverfd428ad2013-06-05 16:51:26 +0300709 .div_nmp = &pllre_nmp,
Peter De Schrijverebe142b2013-10-04 17:28:34 +0300710 .flags = TEGRA_PLL_USE_LOCK,
Peter De Schrijver2cb5efe2013-04-03 17:40:45 +0300711};
712
Peter De Schrijver2cb5efe2013-04-03 17:40:45 +0300713/* possible OSC frequencies in Hz */
714static unsigned long tegra114_input_freq[] = {
715 [0] = 13000000,
716 [1] = 16800000,
717 [4] = 19200000,
718 [5] = 38400000,
719 [8] = 12000000,
720 [9] = 48000000,
721 [12] = 260000000,
722};
723
724#define MASK(x) (BIT(x) - 1)
725
Peter De Schrijver73d37e42013-10-09 14:47:57 +0300726#define TEGRA_INIT_DATA_MUX(_name, _parents, _offset, \
Peter De Schrijverd5ff89a2013-08-22 18:44:06 +0300727 _clk_num, _gate_flags, _clk_id) \
Peter De Schrijver73d37e42013-10-09 14:47:57 +0300728 TEGRA_INIT_DATA_TABLE(_name, NULL, NULL, _parents, _offset,\
Peter De Schrijver252d0d22013-11-26 13:48:09 +0200729 30, MASK(2), 0, 0, 8, 1, TEGRA_DIVIDER_ROUND_UP, \
Peter De Schrijver343a6072013-09-02 15:22:02 +0300730 _clk_num, _gate_flags, _clk_id, _parents##_idx, 0)
Peter De Schrijver2cb5efe2013-04-03 17:40:45 +0300731
Peter De Schrijver73d37e42013-10-09 14:47:57 +0300732#define TEGRA_INIT_DATA_MUX_FLAGS(_name, _parents, _offset,\
Peter De Schrijverd5ff89a2013-08-22 18:44:06 +0300733 _clk_num, _gate_flags, _clk_id, flags)\
Peter De Schrijver73d37e42013-10-09 14:47:57 +0300734 TEGRA_INIT_DATA_TABLE(_name, NULL, NULL, _parents, _offset,\
Peter De Schrijver252d0d22013-11-26 13:48:09 +0200735 30, MASK(2), 0, 0, 8, 1, TEGRA_DIVIDER_ROUND_UP,\
Peter De Schrijver343a6072013-09-02 15:22:02 +0300736 _clk_num, _gate_flags, _clk_id, _parents##_idx, flags)
Peter De Schrijver2cb5efe2013-04-03 17:40:45 +0300737
Peter De Schrijver73d37e42013-10-09 14:47:57 +0300738#define TEGRA_INIT_DATA_MUX8(_name, _parents, _offset, \
Peter De Schrijverd5ff89a2013-08-22 18:44:06 +0300739 _clk_num, _gate_flags, _clk_id) \
Peter De Schrijver73d37e42013-10-09 14:47:57 +0300740 TEGRA_INIT_DATA_TABLE(_name, NULL, NULL, _parents, _offset,\
Peter De Schrijver252d0d22013-11-26 13:48:09 +0200741 29, MASK(3), 0, 0, 8, 1, TEGRA_DIVIDER_ROUND_UP,\
Peter De Schrijver343a6072013-09-02 15:22:02 +0300742 _clk_num, _gate_flags, _clk_id, _parents##_idx, 0)
Peter De Schrijver2cb5efe2013-04-03 17:40:45 +0300743
Peter De Schrijver73d37e42013-10-09 14:47:57 +0300744#define TEGRA_INIT_DATA_INT_FLAGS(_name, _parents, _offset,\
Peter De Schrijverd5ff89a2013-08-22 18:44:06 +0300745 _clk_num, _gate_flags, _clk_id, flags)\
Peter De Schrijver73d37e42013-10-09 14:47:57 +0300746 TEGRA_INIT_DATA_TABLE(_name, NULL, NULL, _parents, _offset,\
Peter De Schrijver252d0d22013-11-26 13:48:09 +0200747 30, MASK(2), 0, 0, 8, 1, TEGRA_DIVIDER_INT | \
Peter De Schrijverd5ff89a2013-08-22 18:44:06 +0300748 TEGRA_DIVIDER_ROUND_UP, _clk_num, \
Peter De Schrijver343a6072013-09-02 15:22:02 +0300749 _gate_flags, _clk_id, _parents##_idx, flags)
Peter De Schrijver2cb5efe2013-04-03 17:40:45 +0300750
Peter De Schrijver73d37e42013-10-09 14:47:57 +0300751#define TEGRA_INIT_DATA_INT8(_name, _parents, _offset,\
Peter De Schrijverd5ff89a2013-08-22 18:44:06 +0300752 _clk_num, _gate_flags, _clk_id) \
Peter De Schrijver73d37e42013-10-09 14:47:57 +0300753 TEGRA_INIT_DATA_TABLE(_name, NULL, NULL, _parents, _offset,\
Peter De Schrijver252d0d22013-11-26 13:48:09 +0200754 29, MASK(3), 0, 0, 8, 1, TEGRA_DIVIDER_INT | \
Peter De Schrijverd5ff89a2013-08-22 18:44:06 +0300755 TEGRA_DIVIDER_ROUND_UP, _clk_num, \
Peter De Schrijver343a6072013-09-02 15:22:02 +0300756 _gate_flags, _clk_id, _parents##_idx, 0)
Peter De Schrijver2cb5efe2013-04-03 17:40:45 +0300757
Peter De Schrijver73d37e42013-10-09 14:47:57 +0300758#define TEGRA_INIT_DATA_UART(_name, _parents, _offset,\
Peter De Schrijverd5ff89a2013-08-22 18:44:06 +0300759 _clk_num, _clk_id) \
Peter De Schrijver73d37e42013-10-09 14:47:57 +0300760 TEGRA_INIT_DATA_TABLE(_name, NULL, NULL, _parents, _offset,\
Peter De Schrijver252d0d22013-11-26 13:48:09 +0200761 30, MASK(2), 0, 0, 16, 1, TEGRA_DIVIDER_UART | \
Peter De Schrijverd5ff89a2013-08-22 18:44:06 +0300762 TEGRA_DIVIDER_ROUND_UP, _clk_num, \
Peter De Schrijver343a6072013-09-02 15:22:02 +0300763 0, _clk_id, _parents##_idx, 0)
Peter De Schrijver2cb5efe2013-04-03 17:40:45 +0300764
Peter De Schrijver73d37e42013-10-09 14:47:57 +0300765#define TEGRA_INIT_DATA_I2C(_name, _parents, _offset,\
Peter De Schrijverd5ff89a2013-08-22 18:44:06 +0300766 _clk_num, _clk_id) \
Peter De Schrijver73d37e42013-10-09 14:47:57 +0300767 TEGRA_INIT_DATA_TABLE(_name, NULL, NULL, _parents, _offset,\
Peter De Schrijver252d0d22013-11-26 13:48:09 +0200768 30, MASK(2), 0, 0, 16, 0, TEGRA_DIVIDER_ROUND_UP,\
Peter De Schrijver343a6072013-09-02 15:22:02 +0300769 _clk_num, 0, _clk_id, _parents##_idx, 0)
Peter De Schrijver2cb5efe2013-04-03 17:40:45 +0300770
Peter De Schrijver73d37e42013-10-09 14:47:57 +0300771#define TEGRA_INIT_DATA_NODIV(_name, _parents, _offset, \
Peter De Schrijverd5ff89a2013-08-22 18:44:06 +0300772 _mux_shift, _mux_mask, _clk_num, \
Peter De Schrijver2cb5efe2013-04-03 17:40:45 +0300773 _gate_flags, _clk_id) \
Peter De Schrijver73d37e42013-10-09 14:47:57 +0300774 TEGRA_INIT_DATA_TABLE(_name, NULL, NULL, _parents, _offset,\
Peter De Schrijverd5ff89a2013-08-22 18:44:06 +0300775 _mux_shift, _mux_mask, 0, 0, 0, 0, 0,\
Peter De Schrijver343a6072013-09-02 15:22:02 +0300776 _clk_num, _gate_flags, \
Peter De Schrijver2cb5efe2013-04-03 17:40:45 +0300777 _clk_id, _parents##_idx, 0)
778
Peter De Schrijver73d37e42013-10-09 14:47:57 +0300779#define TEGRA_INIT_DATA_XUSB(_name, _parents, _offset, \
Peter De Schrijverd5ff89a2013-08-22 18:44:06 +0300780 _clk_num, _gate_flags, _clk_id) \
Peter De Schrijver73d37e42013-10-09 14:47:57 +0300781 TEGRA_INIT_DATA_TABLE(_name, NULL, NULL, _parents, _offset, \
Peter De Schrijver252d0d22013-11-26 13:48:09 +0200782 29, MASK(3), 0, 0, 8, 1, TEGRA_DIVIDER_INT | \
Peter De Schrijverd5ff89a2013-08-22 18:44:06 +0300783 TEGRA_DIVIDER_ROUND_UP, _clk_num, \
Peter De Schrijver343a6072013-09-02 15:22:02 +0300784 _gate_flags, _clk_id, _parents##_idx, 0)
Peter De Schrijver2cb5efe2013-04-03 17:40:45 +0300785
Peter De Schrijver73d37e42013-10-09 14:47:57 +0300786#define TEGRA_INIT_DATA_AUDIO(_name, _offset, _clk_num,\
Peter De Schrijverd5ff89a2013-08-22 18:44:06 +0300787 _gate_flags, _clk_id) \
Peter De Schrijver73d37e42013-10-09 14:47:57 +0300788 TEGRA_INIT_DATA_TABLE(_name, NULL, NULL, mux_d_audio_clk, \
Peter De Schrijver252d0d22013-11-26 13:48:09 +0200789 _offset, 16, 0xE01F, 0, 0, 8, 1, \
Peter De Schrijver343a6072013-09-02 15:22:02 +0300790 TEGRA_DIVIDER_ROUND_UP, _clk_num, \
791 _gate_flags , _clk_id, mux_d_audio_clk_idx, 0)
Peter De Schrijver2cb5efe2013-04-03 17:40:45 +0300792
Peter De Schrijver2cb5efe2013-04-03 17:40:45 +0300793struct utmi_clk_param {
794 /* Oscillator Frequency in KHz */
795 u32 osc_frequency;
796 /* UTMIP PLL Enable Delay Count */
797 u8 enable_delay_count;
798 /* UTMIP PLL Stable count */
799 u8 stable_count;
800 /* UTMIP PLL Active delay count */
801 u8 active_delay_count;
802 /* UTMIP PLL Xtal frequency count */
803 u8 xtal_freq_count;
804};
805
806static const struct utmi_clk_param utmi_parameters[] = {
807 {.osc_frequency = 13000000, .enable_delay_count = 0x02,
808 .stable_count = 0x33, .active_delay_count = 0x05,
809 .xtal_freq_count = 0x7F},
810 {.osc_frequency = 19200000, .enable_delay_count = 0x03,
811 .stable_count = 0x4B, .active_delay_count = 0x06,
812 .xtal_freq_count = 0xBB},
813 {.osc_frequency = 12000000, .enable_delay_count = 0x02,
814 .stable_count = 0x2F, .active_delay_count = 0x04,
815 .xtal_freq_count = 0x76},
816 {.osc_frequency = 26000000, .enable_delay_count = 0x04,
817 .stable_count = 0x66, .active_delay_count = 0x09,
818 .xtal_freq_count = 0xFE},
819 {.osc_frequency = 16800000, .enable_delay_count = 0x03,
820 .stable_count = 0x41, .active_delay_count = 0x0A,
821 .xtal_freq_count = 0xA4},
822};
823
824/* peripheral mux definitions */
825
826#define MUX_I2S_SPDIF(_id) \
827static const char *mux_pllaout0_##_id##_2x_pllp_clkm[] = { "pll_a_out0", \
828 #_id, "pll_p",\
829 "clk_m"};
830MUX_I2S_SPDIF(audio0)
831MUX_I2S_SPDIF(audio1)
832MUX_I2S_SPDIF(audio2)
833MUX_I2S_SPDIF(audio3)
834MUX_I2S_SPDIF(audio4)
835MUX_I2S_SPDIF(audio)
836
837#define mux_pllaout0_audio0_2x_pllp_clkm_idx NULL
838#define mux_pllaout0_audio1_2x_pllp_clkm_idx NULL
839#define mux_pllaout0_audio2_2x_pllp_clkm_idx NULL
840#define mux_pllaout0_audio3_2x_pllp_clkm_idx NULL
841#define mux_pllaout0_audio4_2x_pllp_clkm_idx NULL
842#define mux_pllaout0_audio_2x_pllp_clkm_idx NULL
843
844static const char *mux_pllp_pllc_pllm_clkm[] = {
845 "pll_p", "pll_c", "pll_m", "clk_m"
846};
847#define mux_pllp_pllc_pllm_clkm_idx NULL
848
849static const char *mux_pllp_pllc_pllm[] = { "pll_p", "pll_c", "pll_m" };
850#define mux_pllp_pllc_pllm_idx NULL
851
852static const char *mux_pllp_pllc_clk32_clkm[] = {
853 "pll_p", "pll_c", "clk_32k", "clk_m"
854};
855#define mux_pllp_pllc_clk32_clkm_idx NULL
856
857static const char *mux_plla_pllc_pllp_clkm[] = {
858 "pll_a_out0", "pll_c", "pll_p", "clk_m"
859};
860#define mux_plla_pllc_pllp_clkm_idx mux_pllp_pllc_pllm_clkm_idx
861
862static const char *mux_pllp_pllc2_c_c3_pllm_clkm[] = {
863 "pll_p", "pll_c2", "pll_c", "pll_c3", "pll_m", "clk_m"
864};
865static u32 mux_pllp_pllc2_c_c3_pllm_clkm_idx[] = {
866 [0] = 0, [1] = 1, [2] = 2, [3] = 3, [4] = 4, [5] = 6,
867};
868
869static const char *mux_pllp_clkm[] = {
870 "pll_p", "clk_m"
871};
872static u32 mux_pllp_clkm_idx[] = {
873 [0] = 0, [1] = 3,
874};
875
876static const char *mux_pllm_pllc2_c_c3_pllp_plla[] = {
877 "pll_m", "pll_c2", "pll_c", "pll_c3", "pll_p", "pll_a_out0"
878};
879#define mux_pllm_pllc2_c_c3_pllp_plla_idx mux_pllp_pllc2_c_c3_pllm_clkm_idx
880
881static const char *mux_pllp_pllm_plld_plla_pllc_plld2_clkm[] = {
882 "pll_p", "pll_m", "pll_d_out0", "pll_a_out0", "pll_c",
883 "pll_d2_out0", "clk_m"
884};
885#define mux_pllp_pllm_plld_plla_pllc_plld2_clkm_idx NULL
886
887static const char *mux_pllm_pllc_pllp_plla[] = {
888 "pll_m", "pll_c", "pll_p", "pll_a_out0"
889};
890#define mux_pllm_pllc_pllp_plla_idx mux_pllp_pllc_pllm_clkm_idx
891
892static const char *mux_pllp_pllc_clkm[] = {
893 "pll_p", "pll_c", "pll_m"
894};
895static u32 mux_pllp_pllc_clkm_idx[] = {
896 [0] = 0, [1] = 1, [2] = 3,
897};
898
899static const char *mux_pllp_pllc_clkm_clk32[] = {
900 "pll_p", "pll_c", "clk_m", "clk_32k"
901};
902#define mux_pllp_pllc_clkm_clk32_idx NULL
903
904static const char *mux_plla_clk32_pllp_clkm_plle[] = {
905 "pll_a_out0", "clk_32k", "pll_p", "clk_m", "pll_e_out0"
906};
907#define mux_plla_clk32_pllp_clkm_plle_idx NULL
908
909static const char *mux_clkm_pllp_pllc_pllre[] = {
910 "clk_m", "pll_p", "pll_c", "pll_re_out"
911};
912static u32 mux_clkm_pllp_pllc_pllre_idx[] = {
913 [0] = 0, [1] = 1, [2] = 3, [3] = 5,
914};
915
916static const char *mux_clkm_48M_pllp_480M[] = {
917 "clk_m", "pll_u_48M", "pll_p", "pll_u_480M"
918};
919#define mux_clkm_48M_pllp_480M_idx NULL
920
921static const char *mux_clkm_pllre_clk32_480M_pllc_ref[] = {
922 "clk_m", "pll_re_out", "clk_32k", "pll_u_480M", "pll_c", "pll_ref"
923};
924static u32 mux_clkm_pllre_clk32_480M_pllc_ref_idx[] = {
925 [0] = 0, [1] = 1, [2] = 3, [3] = 3, [4] = 4, [5] = 7,
926};
927
928static const char *mux_plld_out0_plld2_out0[] = {
929 "pll_d_out0", "pll_d2_out0",
930};
931#define mux_plld_out0_plld2_out0_idx NULL
932
933static const char *mux_d_audio_clk[] = {
934 "pll_a_out0", "pll_p", "clk_m", "spdif_in_sync", "i2s0_sync",
935 "i2s1_sync", "i2s2_sync", "i2s3_sync", "i2s4_sync", "vimclk_sync",
936};
937static u32 mux_d_audio_clk_idx[] = {
938 [0] = 0, [1] = 0x8000, [2] = 0xc000, [3] = 0xE000, [4] = 0xE001,
939 [5] = 0xE002, [6] = 0xE003, [7] = 0xE004, [8] = 0xE005, [9] = 0xE007,
940};
941
942static const char *mux_pllmcp_clkm[] = {
943 "pll_m_out0", "pll_c_out0", "pll_p_out0", "clk_m", "pll_m_ud",
944};
945
946static const struct clk_div_table pll_re_div_table[] = {
947 { .val = 0, .div = 1 },
948 { .val = 1, .div = 2 },
949 { .val = 2, .div = 3 },
950 { .val = 3, .div = 4 },
951 { .val = 4, .div = 5 },
952 { .val = 5, .div = 6 },
953 { .val = 0, .div = 0 },
954};
955
Peter De Schrijver6609dbe2013-09-17 15:42:24 +0300956static struct tegra_clk tegra114_clks[tegra_clk_max] __initdata = {
957 [tegra_clk_rtc] = { .dt_id = TEGRA114_CLK_RTC, .present = true },
958 [tegra_clk_timer] = { .dt_id = TEGRA114_CLK_TIMER, .present = true },
959 [tegra_clk_uarta] = { .dt_id = TEGRA114_CLK_UARTA, .present = true },
960 [tegra_clk_uartd] = { .dt_id = TEGRA114_CLK_UARTD, .present = true },
961 [tegra_clk_sdmmc2] = { .dt_id = TEGRA114_CLK_SDMMC2, .present = true },
962 [tegra_clk_i2s1] = { .dt_id = TEGRA114_CLK_I2S1, .present = true },
963 [tegra_clk_i2c1] = { .dt_id = TEGRA114_CLK_I2C1, .present = true },
964 [tegra_clk_ndflash] = { .dt_id = TEGRA114_CLK_NDFLASH, .present = true },
965 [tegra_clk_sdmmc1] = { .dt_id = TEGRA114_CLK_SDMMC1, .present = true },
966 [tegra_clk_sdmmc4] = { .dt_id = TEGRA114_CLK_SDMMC4, .present = true },
967 [tegra_clk_pwm] = { .dt_id = TEGRA114_CLK_PWM, .present = true },
968 [tegra_clk_i2s0] = { .dt_id = TEGRA114_CLK_I2S0, .present = true },
969 [tegra_clk_i2s2] = { .dt_id = TEGRA114_CLK_I2S2, .present = true },
970 [tegra_clk_epp_8] = { .dt_id = TEGRA114_CLK_EPP, .present = true },
971 [tegra_clk_gr2d_8] = { .dt_id = TEGRA114_CLK_GR2D, .present = true },
972 [tegra_clk_usbd] = { .dt_id = TEGRA114_CLK_USBD, .present = true },
973 [tegra_clk_isp] = { .dt_id = TEGRA114_CLK_ISP, .present = true },
974 [tegra_clk_gr3d_8] = { .dt_id = TEGRA114_CLK_GR3D, .present = true },
975 [tegra_clk_disp2] = { .dt_id = TEGRA114_CLK_DISP2, .present = true },
976 [tegra_clk_disp1] = { .dt_id = TEGRA114_CLK_DISP1, .present = true },
977 [tegra_clk_host1x_8] = { .dt_id = TEGRA114_CLK_HOST1X, .present = true },
978 [tegra_clk_vcp] = { .dt_id = TEGRA114_CLK_VCP, .present = true },
979 [tegra_clk_apbdma] = { .dt_id = TEGRA114_CLK_APBDMA, .present = true },
980 [tegra_clk_kbc] = { .dt_id = TEGRA114_CLK_KBC, .present = true },
981 [tegra_clk_kfuse] = { .dt_id = TEGRA114_CLK_KFUSE, .present = true },
982 [tegra_clk_sbc1_8] = { .dt_id = TEGRA114_CLK_SBC1, .present = true },
983 [tegra_clk_nor] = { .dt_id = TEGRA114_CLK_NOR, .present = true },
984 [tegra_clk_sbc2_8] = { .dt_id = TEGRA114_CLK_SBC2, .present = true },
985 [tegra_clk_sbc3_8] = { .dt_id = TEGRA114_CLK_SBC3, .present = true },
986 [tegra_clk_i2c5] = { .dt_id = TEGRA114_CLK_I2C5, .present = true },
987 [tegra_clk_dsia] = { .dt_id = TEGRA114_CLK_DSIA, .present = true },
988 [tegra_clk_mipi] = { .dt_id = TEGRA114_CLK_MIPI, .present = true },
989 [tegra_clk_hdmi] = { .dt_id = TEGRA114_CLK_HDMI, .present = true },
990 [tegra_clk_csi] = { .dt_id = TEGRA114_CLK_CSI, .present = true },
991 [tegra_clk_i2c2] = { .dt_id = TEGRA114_CLK_I2C2, .present = true },
992 [tegra_clk_uartc] = { .dt_id = TEGRA114_CLK_UARTC, .present = true },
993 [tegra_clk_mipi_cal] = { .dt_id = TEGRA114_CLK_MIPI_CAL, .present = true },
994 [tegra_clk_emc] = { .dt_id = TEGRA114_CLK_EMC, .present = true },
995 [tegra_clk_usb2] = { .dt_id = TEGRA114_CLK_USB2, .present = true },
996 [tegra_clk_usb3] = { .dt_id = TEGRA114_CLK_USB3, .present = true },
997 [tegra_clk_vde_8] = { .dt_id = TEGRA114_CLK_VDE, .present = true },
998 [tegra_clk_bsea] = { .dt_id = TEGRA114_CLK_BSEA, .present = true },
999 [tegra_clk_bsev] = { .dt_id = TEGRA114_CLK_BSEV, .present = true },
1000 [tegra_clk_i2c3] = { .dt_id = TEGRA114_CLK_I2C3, .present = true },
1001 [tegra_clk_sbc4_8] = { .dt_id = TEGRA114_CLK_SBC4, .present = true },
1002 [tegra_clk_sdmmc3] = { .dt_id = TEGRA114_CLK_SDMMC3, .present = true },
1003 [tegra_clk_owr] = { .dt_id = TEGRA114_CLK_OWR, .present = true },
1004 [tegra_clk_csite] = { .dt_id = TEGRA114_CLK_CSITE, .present = true },
1005 [tegra_clk_la] = { .dt_id = TEGRA114_CLK_LA, .present = true },
1006 [tegra_clk_trace] = { .dt_id = TEGRA114_CLK_TRACE, .present = true },
1007 [tegra_clk_soc_therm] = { .dt_id = TEGRA114_CLK_SOC_THERM, .present = true },
1008 [tegra_clk_dtv] = { .dt_id = TEGRA114_CLK_DTV, .present = true },
1009 [tegra_clk_ndspeed] = { .dt_id = TEGRA114_CLK_NDSPEED, .present = true },
1010 [tegra_clk_i2cslow] = { .dt_id = TEGRA114_CLK_I2CSLOW, .present = true },
1011 [tegra_clk_dsib] = { .dt_id = TEGRA114_CLK_DSIB, .present = true },
1012 [tegra_clk_tsec] = { .dt_id = TEGRA114_CLK_TSEC, .present = true },
1013 [tegra_clk_xusb_host] = { .dt_id = TEGRA114_CLK_XUSB_HOST, .present = true },
1014 [tegra_clk_msenc] = { .dt_id = TEGRA114_CLK_MSENC, .present = true },
1015 [tegra_clk_csus] = { .dt_id = TEGRA114_CLK_CSUS, .present = true },
1016 [tegra_clk_mselect] = { .dt_id = TEGRA114_CLK_MSELECT, .present = true },
1017 [tegra_clk_tsensor] = { .dt_id = TEGRA114_CLK_TSENSOR, .present = true },
1018 [tegra_clk_i2s3] = { .dt_id = TEGRA114_CLK_I2S3, .present = true },
1019 [tegra_clk_i2s4] = { .dt_id = TEGRA114_CLK_I2S4, .present = true },
1020 [tegra_clk_i2c4] = { .dt_id = TEGRA114_CLK_I2C4, .present = true },
1021 [tegra_clk_sbc5_8] = { .dt_id = TEGRA114_CLK_SBC5, .present = true },
1022 [tegra_clk_sbc6_8] = { .dt_id = TEGRA114_CLK_SBC6, .present = true },
1023 [tegra_clk_d_audio] = { .dt_id = TEGRA114_CLK_D_AUDIO, .present = true },
1024 [tegra_clk_apbif] = { .dt_id = TEGRA114_CLK_APBIF, .present = true },
1025 [tegra_clk_dam0] = { .dt_id = TEGRA114_CLK_DAM0, .present = true },
1026 [tegra_clk_dam1] = { .dt_id = TEGRA114_CLK_DAM1, .present = true },
1027 [tegra_clk_dam2] = { .dt_id = TEGRA114_CLK_DAM2, .present = true },
1028 [tegra_clk_hda2codec_2x] = { .dt_id = TEGRA114_CLK_HDA2CODEC_2X, .present = true },
1029 [tegra_clk_audio0_2x] = { .dt_id = TEGRA114_CLK_AUDIO0_2X, .present = true },
1030 [tegra_clk_audio1_2x] = { .dt_id = TEGRA114_CLK_AUDIO1_2X, .present = true },
1031 [tegra_clk_audio2_2x] = { .dt_id = TEGRA114_CLK_AUDIO2_2X, .present = true },
1032 [tegra_clk_audio3_2x] = { .dt_id = TEGRA114_CLK_AUDIO3_2X, .present = true },
1033 [tegra_clk_audio4_2x] = { .dt_id = TEGRA114_CLK_AUDIO4_2X, .present = true },
1034 [tegra_clk_spdif_2x] = { .dt_id = TEGRA114_CLK_SPDIF_2X, .present = true },
1035 [tegra_clk_actmon] = { .dt_id = TEGRA114_CLK_ACTMON, .present = true },
1036 [tegra_clk_extern1] = { .dt_id = TEGRA114_CLK_EXTERN1, .present = true },
1037 [tegra_clk_extern2] = { .dt_id = TEGRA114_CLK_EXTERN2, .present = true },
1038 [tegra_clk_extern3] = { .dt_id = TEGRA114_CLK_EXTERN3, .present = true },
1039 [tegra_clk_hda] = { .dt_id = TEGRA114_CLK_HDA, .present = true },
1040 [tegra_clk_se] = { .dt_id = TEGRA114_CLK_SE, .present = true },
1041 [tegra_clk_hda2hdmi] = { .dt_id = TEGRA114_CLK_HDA2HDMI, .present = true },
1042 [tegra_clk_cilab] = { .dt_id = TEGRA114_CLK_CILAB, .present = true },
1043 [tegra_clk_cilcd] = { .dt_id = TEGRA114_CLK_CILCD, .present = true },
1044 [tegra_clk_cile] = { .dt_id = TEGRA114_CLK_CILE, .present = true },
1045 [tegra_clk_dsialp] = { .dt_id = TEGRA114_CLK_DSIALP, .present = true },
1046 [tegra_clk_dsiblp] = { .dt_id = TEGRA114_CLK_DSIBLP, .present = true },
1047 [tegra_clk_dds] = { .dt_id = TEGRA114_CLK_DDS, .present = true },
1048 [tegra_clk_dp2] = { .dt_id = TEGRA114_CLK_DP2, .present = true },
1049 [tegra_clk_amx] = { .dt_id = TEGRA114_CLK_AMX, .present = true },
1050 [tegra_clk_adx] = { .dt_id = TEGRA114_CLK_ADX, .present = true },
1051 [tegra_clk_xusb_ss] = { .dt_id = TEGRA114_CLK_XUSB_SS, .present = true },
1052 [tegra_clk_uartb] = { .dt_id = TEGRA114_CLK_UARTB, .present = true },
1053 [tegra_clk_vfir] = { .dt_id = TEGRA114_CLK_VFIR, .present = true },
1054 [tegra_clk_spdif_in] = { .dt_id = TEGRA114_CLK_SPDIF_IN, .present = true },
1055 [tegra_clk_spdif_out] = { .dt_id = TEGRA114_CLK_SPDIF_OUT, .present = true },
1056 [tegra_clk_vi_8] = { .dt_id = TEGRA114_CLK_VI, .present = true },
1057 [tegra_clk_vi_sensor_8] = { .dt_id = TEGRA114_CLK_VI_SENSOR, .present = true },
1058 [tegra_clk_fuse] = { .dt_id = TEGRA114_CLK_FUSE, .present = true },
1059 [tegra_clk_fuse_burn] = { .dt_id = TEGRA114_CLK_FUSE_BURN, .present = true },
1060 [tegra_clk_clk_32k] = { .dt_id = TEGRA114_CLK_CLK_32K, .present = true },
1061 [tegra_clk_clk_m] = { .dt_id = TEGRA114_CLK_CLK_M, .present = true },
1062 [tegra_clk_clk_m_div2] = { .dt_id = TEGRA114_CLK_CLK_M_DIV2, .present = true },
1063 [tegra_clk_clk_m_div4] = { .dt_id = TEGRA114_CLK_CLK_M_DIV4, .present = true },
1064 [tegra_clk_pll_ref] = { .dt_id = TEGRA114_CLK_PLL_REF, .present = true },
1065 [tegra_clk_pll_c] = { .dt_id = TEGRA114_CLK_PLL_C, .present = true },
1066 [tegra_clk_pll_c_out1] = { .dt_id = TEGRA114_CLK_PLL_C_OUT1, .present = true },
1067 [tegra_clk_pll_c2] = { .dt_id = TEGRA114_CLK_PLL_C2, .present = true },
1068 [tegra_clk_pll_c3] = { .dt_id = TEGRA114_CLK_PLL_C3, .present = true },
1069 [tegra_clk_pll_m] = { .dt_id = TEGRA114_CLK_PLL_M, .present = true },
1070 [tegra_clk_pll_m_out1] = { .dt_id = TEGRA114_CLK_PLL_M_OUT1, .present = true },
1071 [tegra_clk_pll_p] = { .dt_id = TEGRA114_CLK_PLL_P, .present = true },
1072 [tegra_clk_pll_p_out1] = { .dt_id = TEGRA114_CLK_PLL_P_OUT1, .present = true },
1073 [tegra_clk_pll_p_out2_int] = { .dt_id = TEGRA114_CLK_PLL_P_OUT2, .present = true },
1074 [tegra_clk_pll_p_out3] = { .dt_id = TEGRA114_CLK_PLL_P_OUT3, .present = true },
1075 [tegra_clk_pll_p_out4] = { .dt_id = TEGRA114_CLK_PLL_P_OUT4, .present = true },
1076 [tegra_clk_pll_a] = { .dt_id = TEGRA114_CLK_PLL_A, .present = true },
1077 [tegra_clk_pll_a_out0] = { .dt_id = TEGRA114_CLK_PLL_A_OUT0, .present = true },
1078 [tegra_clk_pll_d] = { .dt_id = TEGRA114_CLK_PLL_D, .present = true },
1079 [tegra_clk_pll_d_out0] = { .dt_id = TEGRA114_CLK_PLL_D_OUT0, .present = true },
1080 [tegra_clk_pll_d2] = { .dt_id = TEGRA114_CLK_PLL_D2, .present = true },
1081 [tegra_clk_pll_d2_out0] = { .dt_id = TEGRA114_CLK_PLL_D2_OUT0, .present = true },
1082 [tegra_clk_pll_u] = { .dt_id = TEGRA114_CLK_PLL_U, .present = true },
1083 [tegra_clk_pll_u_480m] = { .dt_id = TEGRA114_CLK_PLL_U_480M, .present = true },
1084 [tegra_clk_pll_u_60m] = { .dt_id = TEGRA114_CLK_PLL_U_60M, .present = true },
1085 [tegra_clk_pll_u_48m] = { .dt_id = TEGRA114_CLK_PLL_U_48M, .present = true },
1086 [tegra_clk_pll_u_12m] = { .dt_id = TEGRA114_CLK_PLL_U_12M, .present = true },
1087 [tegra_clk_pll_x] = { .dt_id = TEGRA114_CLK_PLL_X, .present = true },
1088 [tegra_clk_pll_x_out0] = { .dt_id = TEGRA114_CLK_PLL_X_OUT0, .present = true },
1089 [tegra_clk_pll_re_vco] = { .dt_id = TEGRA114_CLK_PLL_RE_VCO, .present = true },
1090 [tegra_clk_pll_re_out] = { .dt_id = TEGRA114_CLK_PLL_RE_OUT, .present = true },
1091 [tegra_clk_pll_e_out0] = { .dt_id = TEGRA114_CLK_PLL_E_OUT0, .present = true },
1092 [tegra_clk_spdif_in_sync] = { .dt_id = TEGRA114_CLK_SPDIF_IN_SYNC, .present = true },
1093 [tegra_clk_i2s0_sync] = { .dt_id = TEGRA114_CLK_I2S0_SYNC, .present = true },
1094 [tegra_clk_i2s1_sync] = { .dt_id = TEGRA114_CLK_I2S1_SYNC, .present = true },
1095 [tegra_clk_i2s2_sync] = { .dt_id = TEGRA114_CLK_I2S2_SYNC, .present = true },
1096 [tegra_clk_i2s3_sync] = { .dt_id = TEGRA114_CLK_I2S3_SYNC, .present = true },
1097 [tegra_clk_i2s4_sync] = { .dt_id = TEGRA114_CLK_I2S4_SYNC, .present = true },
1098 [tegra_clk_vimclk_sync] = { .dt_id = TEGRA114_CLK_VIMCLK_SYNC, .present = true },
1099 [tegra_clk_audio0] = { .dt_id = TEGRA114_CLK_AUDIO0, .present = true },
1100 [tegra_clk_audio1] = { .dt_id = TEGRA114_CLK_AUDIO1, .present = true },
1101 [tegra_clk_audio2] = { .dt_id = TEGRA114_CLK_AUDIO2, .present = true },
1102 [tegra_clk_audio3] = { .dt_id = TEGRA114_CLK_AUDIO3, .present = true },
1103 [tegra_clk_audio4] = { .dt_id = TEGRA114_CLK_AUDIO4, .present = true },
1104 [tegra_clk_spdif] = { .dt_id = TEGRA114_CLK_SPDIF, .present = true },
1105 [tegra_clk_clk_out_1] = { .dt_id = TEGRA114_CLK_CLK_OUT_1, .present = true },
1106 [tegra_clk_clk_out_2] = { .dt_id = TEGRA114_CLK_CLK_OUT_2, .present = true },
1107 [tegra_clk_clk_out_3] = { .dt_id = TEGRA114_CLK_CLK_OUT_3, .present = true },
1108 [tegra_clk_blink] = { .dt_id = TEGRA114_CLK_BLINK, .present = true },
1109 [tegra_clk_xusb_host_src] = { .dt_id = TEGRA114_CLK_XUSB_HOST_SRC, .present = true },
1110 [tegra_clk_xusb_falcon_src] = { .dt_id = TEGRA114_CLK_XUSB_FALCON_SRC, .present = true },
1111 [tegra_clk_xusb_fs_src] = { .dt_id = TEGRA114_CLK_XUSB_FS_SRC, .present = true },
1112 [tegra_clk_xusb_ss_src] = { .dt_id = TEGRA114_CLK_XUSB_SS_SRC, .present = true },
1113 [tegra_clk_xusb_dev_src] = { .dt_id = TEGRA114_CLK_XUSB_DEV_SRC, .present = true },
1114 [tegra_clk_xusb_dev] = { .dt_id = TEGRA114_CLK_XUSB_DEV, .present = true },
1115 [tegra_clk_xusb_hs_src] = { .dt_id = TEGRA114_CLK_XUSB_HS_SRC, .present = true },
1116 [tegra_clk_sclk] = { .dt_id = TEGRA114_CLK_SCLK, .present = true },
1117 [tegra_clk_hclk] = { .dt_id = TEGRA114_CLK_HCLK, .present = true },
1118 [tegra_clk_pclk] = { .dt_id = TEGRA114_CLK_PCLK, .present = true },
1119 [tegra_clk_cclk_g] = { .dt_id = TEGRA114_CLK_CCLK_G, .present = true },
1120 [tegra_clk_cclk_lp] = { .dt_id = TEGRA114_CLK_CCLK_LP, .present = true },
1121 [tegra_clk_dfll_ref] = { .dt_id = TEGRA114_CLK_DFLL_REF, .present = true },
1122 [tegra_clk_dfll_soc] = { .dt_id = TEGRA114_CLK_DFLL_SOC, .present = true },
1123 [tegra_clk_audio0_mux] = { .dt_id = TEGRA114_CLK_AUDIO0_MUX, .present = true },
1124 [tegra_clk_audio1_mux] = { .dt_id = TEGRA114_CLK_AUDIO1_MUX, .present = true },
1125 [tegra_clk_audio2_mux] = { .dt_id = TEGRA114_CLK_AUDIO2_MUX, .present = true },
1126 [tegra_clk_audio3_mux] = { .dt_id = TEGRA114_CLK_AUDIO3_MUX, .present = true },
1127 [tegra_clk_audio4_mux] = { .dt_id = TEGRA114_CLK_AUDIO4_MUX, .present = true },
1128 [tegra_clk_spdif_mux] = { .dt_id = TEGRA114_CLK_SPDIF_MUX, .present = true },
1129 [tegra_clk_clk_out_1_mux] = { .dt_id = TEGRA114_CLK_CLK_OUT_1_MUX, .present = true },
1130 [tegra_clk_clk_out_2_mux] = { .dt_id = TEGRA114_CLK_CLK_OUT_2_MUX, .present = true },
1131 [tegra_clk_clk_out_3_mux] = { .dt_id = TEGRA114_CLK_CLK_OUT_3_MUX, .present = true },
1132 [tegra_clk_dsia_mux] = { .dt_id = TEGRA114_CLK_DSIA_MUX, .present = true },
1133 [tegra_clk_dsib_mux] = { .dt_id = TEGRA114_CLK_DSIB_MUX, .present = true },
1134};
1135
Peter De Schrijver73d37e42013-10-09 14:47:57 +03001136static struct tegra_devclk devclks[] __initdata = {
1137 { .con_id = "clk_m", .dt_id = TEGRA114_CLK_CLK_M },
1138 { .con_id = "pll_ref", .dt_id = TEGRA114_CLK_PLL_REF },
1139 { .con_id = "clk_32k", .dt_id = TEGRA114_CLK_CLK_32K },
1140 { .con_id = "clk_m_div2", .dt_id = TEGRA114_CLK_CLK_M_DIV2 },
1141 { .con_id = "clk_m_div4", .dt_id = TEGRA114_CLK_CLK_M_DIV4 },
1142 { .con_id = "pll_c", .dt_id = TEGRA114_CLK_PLL_C },
1143 { .con_id = "pll_c_out1", .dt_id = TEGRA114_CLK_PLL_C_OUT1 },
1144 { .con_id = "pll_c2", .dt_id = TEGRA114_CLK_PLL_C2 },
1145 { .con_id = "pll_c3", .dt_id = TEGRA114_CLK_PLL_C3 },
1146 { .con_id = "pll_p", .dt_id = TEGRA114_CLK_PLL_P },
1147 { .con_id = "pll_p_out1", .dt_id = TEGRA114_CLK_PLL_P_OUT1 },
1148 { .con_id = "pll_p_out2", .dt_id = TEGRA114_CLK_PLL_P_OUT2 },
1149 { .con_id = "pll_p_out3", .dt_id = TEGRA114_CLK_PLL_P_OUT3 },
1150 { .con_id = "pll_p_out4", .dt_id = TEGRA114_CLK_PLL_P_OUT4 },
1151 { .con_id = "pll_m", .dt_id = TEGRA114_CLK_PLL_M },
1152 { .con_id = "pll_m_out1", .dt_id = TEGRA114_CLK_PLL_M_OUT1 },
1153 { .con_id = "pll_x", .dt_id = TEGRA114_CLK_PLL_X },
1154 { .con_id = "pll_x_out0", .dt_id = TEGRA114_CLK_PLL_X_OUT0 },
1155 { .con_id = "pll_u", .dt_id = TEGRA114_CLK_PLL_U },
1156 { .con_id = "pll_u_480M", .dt_id = TEGRA114_CLK_PLL_U_480M },
1157 { .con_id = "pll_u_60M", .dt_id = TEGRA114_CLK_PLL_U_60M },
1158 { .con_id = "pll_u_48M", .dt_id = TEGRA114_CLK_PLL_U_48M },
1159 { .con_id = "pll_u_12M", .dt_id = TEGRA114_CLK_PLL_U_12M },
1160 { .con_id = "pll_d", .dt_id = TEGRA114_CLK_PLL_D },
1161 { .con_id = "pll_d_out0", .dt_id = TEGRA114_CLK_PLL_D_OUT0 },
1162 { .con_id = "pll_d2", .dt_id = TEGRA114_CLK_PLL_D2 },
1163 { .con_id = "pll_d2_out0", .dt_id = TEGRA114_CLK_PLL_D2_OUT0 },
1164 { .con_id = "pll_a", .dt_id = TEGRA114_CLK_PLL_A },
1165 { .con_id = "pll_a_out0", .dt_id = TEGRA114_CLK_PLL_A_OUT0 },
1166 { .con_id = "pll_re_vco", .dt_id = TEGRA114_CLK_PLL_RE_VCO },
1167 { .con_id = "pll_re_out", .dt_id = TEGRA114_CLK_PLL_RE_OUT },
1168 { .con_id = "pll_e_out0", .dt_id = TEGRA114_CLK_PLL_E_OUT0 },
1169 { .con_id = "spdif_in_sync", .dt_id = TEGRA114_CLK_SPDIF_IN_SYNC },
1170 { .con_id = "i2s0_sync", .dt_id = TEGRA114_CLK_I2S0_SYNC },
1171 { .con_id = "i2s1_sync", .dt_id = TEGRA114_CLK_I2S1_SYNC },
1172 { .con_id = "i2s2_sync", .dt_id = TEGRA114_CLK_I2S2_SYNC },
1173 { .con_id = "i2s3_sync", .dt_id = TEGRA114_CLK_I2S3_SYNC },
1174 { .con_id = "i2s4_sync", .dt_id = TEGRA114_CLK_I2S4_SYNC },
1175 { .con_id = "vimclk_sync", .dt_id = TEGRA114_CLK_VIMCLK_SYNC },
1176 { .con_id = "audio0", .dt_id = TEGRA114_CLK_AUDIO0 },
1177 { .con_id = "audio1", .dt_id = TEGRA114_CLK_AUDIO1 },
1178 { .con_id = "audio2", .dt_id = TEGRA114_CLK_AUDIO2 },
1179 { .con_id = "audio3", .dt_id = TEGRA114_CLK_AUDIO3 },
1180 { .con_id = "audio4", .dt_id = TEGRA114_CLK_AUDIO4 },
1181 { .con_id = "spdif", .dt_id = TEGRA114_CLK_SPDIF },
1182 { .con_id = "audio0_2x", .dt_id = TEGRA114_CLK_AUDIO0_2X },
1183 { .con_id = "audio1_2x", .dt_id = TEGRA114_CLK_AUDIO1_2X },
1184 { .con_id = "audio2_2x", .dt_id = TEGRA114_CLK_AUDIO2_2X },
1185 { .con_id = "audio3_2x", .dt_id = TEGRA114_CLK_AUDIO3_2X },
1186 { .con_id = "audio4_2x", .dt_id = TEGRA114_CLK_AUDIO4_2X },
1187 { .con_id = "spdif_2x", .dt_id = TEGRA114_CLK_SPDIF_2X },
1188 { .con_id = "extern1", .dev_id = "clk_out_1", .dt_id = TEGRA114_CLK_EXTERN1 },
1189 { .con_id = "extern2", .dev_id = "clk_out_2", .dt_id = TEGRA114_CLK_EXTERN2 },
1190 { .con_id = "extern3", .dev_id = "clk_out_3", .dt_id = TEGRA114_CLK_EXTERN3 },
1191 { .con_id = "blink", .dt_id = TEGRA114_CLK_BLINK },
1192 { .con_id = "cclk_g", .dt_id = TEGRA114_CLK_CCLK_G },
1193 { .con_id = "cclk_lp", .dt_id = TEGRA114_CLK_CCLK_LP },
1194 { .con_id = "sclk", .dt_id = TEGRA114_CLK_SCLK },
1195 { .con_id = "hclk", .dt_id = TEGRA114_CLK_HCLK },
1196 { .con_id = "pclk", .dt_id = TEGRA114_CLK_PCLK },
1197 { .dev_id = "rtc-tegra", .dt_id = TEGRA114_CLK_RTC },
1198 { .dev_id = "timer", .dt_id = TEGRA114_CLK_TIMER },
1199};
1200
Peter De Schrijver343a6072013-09-02 15:22:02 +03001201static struct clk **clks;
Peter De Schrijver2cb5efe2013-04-03 17:40:45 +03001202
1203static unsigned long osc_freq;
1204static unsigned long pll_ref_freq;
1205
1206static int __init tegra114_osc_clk_init(void __iomem *clk_base)
1207{
1208 struct clk *clk;
1209 u32 val, pll_ref_div;
1210
1211 val = readl_relaxed(clk_base + OSC_CTRL);
1212
1213 osc_freq = tegra114_input_freq[val >> OSC_CTRL_OSC_FREQ_SHIFT];
1214 if (!osc_freq) {
1215 WARN_ON(1);
1216 return -EINVAL;
1217 }
1218
1219 /* clk_m */
1220 clk = clk_register_fixed_rate(NULL, "clk_m", NULL, CLK_IS_ROOT,
1221 osc_freq);
Peter De Schrijverc9e2d692013-08-22 15:27:46 +03001222 clks[TEGRA114_CLK_CLK_M] = clk;
Peter De Schrijver2cb5efe2013-04-03 17:40:45 +03001223
1224 /* pll_ref */
1225 val = (val >> OSC_CTRL_PLL_REF_DIV_SHIFT) & 3;
1226 pll_ref_div = 1 << val;
1227 clk = clk_register_fixed_factor(NULL, "pll_ref", "clk_m",
1228 CLK_SET_RATE_PARENT, 1, pll_ref_div);
Peter De Schrijverc9e2d692013-08-22 15:27:46 +03001229 clks[TEGRA114_CLK_PLL_REF] = clk;
Peter De Schrijver2cb5efe2013-04-03 17:40:45 +03001230
1231 pll_ref_freq = osc_freq / pll_ref_div;
1232
1233 return 0;
1234}
1235
1236static void __init tegra114_fixed_clk_init(void __iomem *clk_base)
1237{
1238 struct clk *clk;
1239
1240 /* clk_32k */
1241 clk = clk_register_fixed_rate(NULL, "clk_32k", NULL, CLK_IS_ROOT,
1242 32768);
Peter De Schrijverc9e2d692013-08-22 15:27:46 +03001243 clks[TEGRA114_CLK_CLK_32K] = clk;
Peter De Schrijver2cb5efe2013-04-03 17:40:45 +03001244
1245 /* clk_m_div2 */
1246 clk = clk_register_fixed_factor(NULL, "clk_m_div2", "clk_m",
1247 CLK_SET_RATE_PARENT, 1, 2);
Peter De Schrijverc9e2d692013-08-22 15:27:46 +03001248 clks[TEGRA114_CLK_CLK_M_DIV2] = clk;
Peter De Schrijver2cb5efe2013-04-03 17:40:45 +03001249
1250 /* clk_m_div4 */
1251 clk = clk_register_fixed_factor(NULL, "clk_m_div4", "clk_m",
1252 CLK_SET_RATE_PARENT, 1, 4);
Peter De Schrijverc9e2d692013-08-22 15:27:46 +03001253 clks[TEGRA114_CLK_CLK_M_DIV4] = clk;
Peter De Schrijver2cb5efe2013-04-03 17:40:45 +03001254
1255}
1256
1257static __init void tegra114_utmi_param_configure(void __iomem *clk_base)
1258{
1259 u32 reg;
1260 int i;
1261
1262 for (i = 0; i < ARRAY_SIZE(utmi_parameters); i++) {
1263 if (osc_freq == utmi_parameters[i].osc_frequency)
1264 break;
1265 }
1266
1267 if (i >= ARRAY_SIZE(utmi_parameters)) {
1268 pr_err("%s: Unexpected oscillator freq %lu\n", __func__,
1269 osc_freq);
1270 return;
1271 }
1272
1273 reg = readl_relaxed(clk_base + UTMIP_PLL_CFG2);
1274
1275 /* Program UTMIP PLL stable and active counts */
1276 /* [FIXME] arclk_rst.h says WRONG! This should be 1ms -> 0x50 Check! */
1277 reg &= ~UTMIP_PLL_CFG2_STABLE_COUNT(~0);
1278 reg |= UTMIP_PLL_CFG2_STABLE_COUNT(utmi_parameters[i].stable_count);
1279
1280 reg &= ~UTMIP_PLL_CFG2_ACTIVE_DLY_COUNT(~0);
1281
1282 reg |= UTMIP_PLL_CFG2_ACTIVE_DLY_COUNT(utmi_parameters[i].
1283 active_delay_count);
1284
1285 /* Remove power downs from UTMIP PLL control bits */
1286 reg &= ~UTMIP_PLL_CFG2_FORCE_PD_SAMP_A_POWERDOWN;
1287 reg &= ~UTMIP_PLL_CFG2_FORCE_PD_SAMP_B_POWERDOWN;
1288 reg &= ~UTMIP_PLL_CFG2_FORCE_PD_SAMP_C_POWERDOWN;
1289
1290 writel_relaxed(reg, clk_base + UTMIP_PLL_CFG2);
1291
1292 /* Program UTMIP PLL delay and oscillator frequency counts */
1293 reg = readl_relaxed(clk_base + UTMIP_PLL_CFG1);
1294 reg &= ~UTMIP_PLL_CFG1_ENABLE_DLY_COUNT(~0);
1295
1296 reg |= UTMIP_PLL_CFG1_ENABLE_DLY_COUNT(utmi_parameters[i].
1297 enable_delay_count);
1298
1299 reg &= ~UTMIP_PLL_CFG1_XTAL_FREQ_COUNT(~0);
1300 reg |= UTMIP_PLL_CFG1_XTAL_FREQ_COUNT(utmi_parameters[i].
1301 xtal_freq_count);
1302
1303 /* Remove power downs from UTMIP PLL control bits */
1304 reg &= ~UTMIP_PLL_CFG1_FORCE_PLL_ENABLE_POWERDOWN;
1305 reg &= ~UTMIP_PLL_CFG1_FORCE_PLL_ACTIVE_POWERDOWN;
1306 reg &= ~UTMIP_PLL_CFG1_FORCE_PLLU_POWERUP;
1307 reg &= ~UTMIP_PLL_CFG1_FORCE_PLLU_POWERDOWN;
1308 writel_relaxed(reg, clk_base + UTMIP_PLL_CFG1);
1309
1310 /* Setup HW control of UTMIPLL */
1311 reg = readl_relaxed(clk_base + UTMIPLL_HW_PWRDN_CFG0);
1312 reg |= UTMIPLL_HW_PWRDN_CFG0_USE_LOCKDET;
1313 reg &= ~UTMIPLL_HW_PWRDN_CFG0_CLK_ENABLE_SWCTL;
1314 reg |= UTMIPLL_HW_PWRDN_CFG0_SEQ_START_STATE;
1315 writel_relaxed(reg, clk_base + UTMIPLL_HW_PWRDN_CFG0);
1316
1317 reg = readl_relaxed(clk_base + UTMIP_PLL_CFG1);
1318 reg &= ~UTMIP_PLL_CFG1_FORCE_PLL_ENABLE_POWERUP;
1319 reg &= ~UTMIP_PLL_CFG1_FORCE_PLL_ENABLE_POWERDOWN;
1320 writel_relaxed(reg, clk_base + UTMIP_PLL_CFG1);
1321
1322 udelay(1);
1323
1324 /* Setup SW override of UTMIPLL assuming USB2.0
1325 ports are assigned to USB2 */
1326 reg = readl_relaxed(clk_base + UTMIPLL_HW_PWRDN_CFG0);
1327 reg |= UTMIPLL_HW_PWRDN_CFG0_IDDQ_SWCTL;
1328 reg &= ~UTMIPLL_HW_PWRDN_CFG0_IDDQ_OVERRIDE;
1329 writel_relaxed(reg, clk_base + UTMIPLL_HW_PWRDN_CFG0);
1330
1331 udelay(1);
1332
1333 /* Enable HW control UTMIPLL */
1334 reg = readl_relaxed(clk_base + UTMIPLL_HW_PWRDN_CFG0);
1335 reg |= UTMIPLL_HW_PWRDN_CFG0_SEQ_ENABLE;
1336 writel_relaxed(reg, clk_base + UTMIPLL_HW_PWRDN_CFG0);
1337}
1338
Peter De Schrijver2cb5efe2013-04-03 17:40:45 +03001339static void __init tegra114_pll_init(void __iomem *clk_base,
1340 void __iomem *pmc)
1341{
1342 u32 val;
1343 struct clk *clk;
1344
1345 /* PLLC */
Peter De Schrijver04edb092013-09-06 14:37:37 +03001346 clk = tegra_clk_register_pllxc("pll_c", "pll_ref", clk_base,
Peter De Schrijverebe142b2013-10-04 17:28:34 +03001347 pmc, 0, &pll_c_params, NULL);
Peter De Schrijver04edb092013-09-06 14:37:37 +03001348 clks[TEGRA114_CLK_PLL_C] = clk;
Peter De Schrijver2cb5efe2013-04-03 17:40:45 +03001349
Peter De Schrijver04edb092013-09-06 14:37:37 +03001350 /* PLLC_OUT1 */
1351 clk = tegra_clk_register_divider("pll_c_out1_div", "pll_c",
1352 clk_base + PLLC_OUT, 0, TEGRA_DIVIDER_ROUND_UP,
1353 8, 8, 1, NULL);
1354 clk = tegra_clk_register_pll_out("pll_c_out1", "pll_c_out1_div",
1355 clk_base + PLLC_OUT, 1, 0,
1356 CLK_SET_RATE_PARENT, 0, NULL);
Peter De Schrijver04edb092013-09-06 14:37:37 +03001357 clks[TEGRA114_CLK_PLL_C_OUT1] = clk;
Peter De Schrijver2cb5efe2013-04-03 17:40:45 +03001358
1359 /* PLLC2 */
Peter De Schrijverebe142b2013-10-04 17:28:34 +03001360 clk = tegra_clk_register_pllc("pll_c2", "pll_ref", clk_base, pmc, 0,
1361 &pll_c2_params, NULL);
Peter De Schrijverc9e2d692013-08-22 15:27:46 +03001362 clks[TEGRA114_CLK_PLL_C2] = clk;
Peter De Schrijver2cb5efe2013-04-03 17:40:45 +03001363
1364 /* PLLC3 */
Peter De Schrijverebe142b2013-10-04 17:28:34 +03001365 clk = tegra_clk_register_pllc("pll_c3", "pll_ref", clk_base, pmc, 0,
1366 &pll_c3_params, NULL);
Peter De Schrijverc9e2d692013-08-22 15:27:46 +03001367 clks[TEGRA114_CLK_PLL_C3] = clk;
Peter De Schrijver2cb5efe2013-04-03 17:40:45 +03001368
1369 /* PLLP */
1370 clk = tegra_clk_register_pll("pll_p", "pll_ref", clk_base, pmc, 0,
Peter De Schrijverebe142b2013-10-04 17:28:34 +03001371 &pll_p_params, NULL);
Peter De Schrijverc9e2d692013-08-22 15:27:46 +03001372 clks[TEGRA114_CLK_PLL_P] = clk;
Peter De Schrijver2cb5efe2013-04-03 17:40:45 +03001373
1374 /* PLLP_OUT1 */
1375 clk = tegra_clk_register_divider("pll_p_out1_div", "pll_p",
1376 clk_base + PLLP_OUTA, 0, TEGRA_DIVIDER_FIXED |
1377 TEGRA_DIVIDER_ROUND_UP, 8, 8, 1, &pll_div_lock);
1378 clk = tegra_clk_register_pll_out("pll_p_out1", "pll_p_out1_div",
1379 clk_base + PLLP_OUTA, 1, 0,
1380 CLK_IGNORE_UNUSED | CLK_SET_RATE_PARENT, 0,
1381 &pll_div_lock);
Peter De Schrijverc9e2d692013-08-22 15:27:46 +03001382 clks[TEGRA114_CLK_PLL_P_OUT1] = clk;
Peter De Schrijver2cb5efe2013-04-03 17:40:45 +03001383
1384 /* PLLP_OUT2 */
1385 clk = tegra_clk_register_divider("pll_p_out2_div", "pll_p",
1386 clk_base + PLLP_OUTA, 0, TEGRA_DIVIDER_FIXED |
Peter De Schrijverc388eee2013-06-05 16:37:17 +03001387 TEGRA_DIVIDER_ROUND_UP | TEGRA_DIVIDER_INT, 24,
1388 8, 1, &pll_div_lock);
Peter De Schrijver2cb5efe2013-04-03 17:40:45 +03001389 clk = tegra_clk_register_pll_out("pll_p_out2", "pll_p_out2_div",
1390 clk_base + PLLP_OUTA, 17, 16,
1391 CLK_IGNORE_UNUSED | CLK_SET_RATE_PARENT, 0,
1392 &pll_div_lock);
Peter De Schrijverc9e2d692013-08-22 15:27:46 +03001393 clks[TEGRA114_CLK_PLL_P_OUT2] = clk;
Peter De Schrijver2cb5efe2013-04-03 17:40:45 +03001394
1395 /* PLLP_OUT3 */
1396 clk = tegra_clk_register_divider("pll_p_out3_div", "pll_p",
1397 clk_base + PLLP_OUTB, 0, TEGRA_DIVIDER_FIXED |
1398 TEGRA_DIVIDER_ROUND_UP, 8, 8, 1, &pll_div_lock);
1399 clk = tegra_clk_register_pll_out("pll_p_out3", "pll_p_out3_div",
1400 clk_base + PLLP_OUTB, 1, 0,
1401 CLK_IGNORE_UNUSED | CLK_SET_RATE_PARENT, 0,
1402 &pll_div_lock);
Peter De Schrijverc9e2d692013-08-22 15:27:46 +03001403 clks[TEGRA114_CLK_PLL_P_OUT3] = clk;
Peter De Schrijver2cb5efe2013-04-03 17:40:45 +03001404
1405 /* PLLP_OUT4 */
1406 clk = tegra_clk_register_divider("pll_p_out4_div", "pll_p",
1407 clk_base + PLLP_OUTB, 0, TEGRA_DIVIDER_FIXED |
1408 TEGRA_DIVIDER_ROUND_UP, 24, 8, 1,
1409 &pll_div_lock);
1410 clk = tegra_clk_register_pll_out("pll_p_out4", "pll_p_out4_div",
1411 clk_base + PLLP_OUTB, 17, 16,
1412 CLK_IGNORE_UNUSED | CLK_SET_RATE_PARENT, 0,
1413 &pll_div_lock);
Peter De Schrijverc9e2d692013-08-22 15:27:46 +03001414 clks[TEGRA114_CLK_PLL_P_OUT4] = clk;
Peter De Schrijver2cb5efe2013-04-03 17:40:45 +03001415
1416 /* PLLM */
Peter De Schrijver2cb5efe2013-04-03 17:40:45 +03001417 clk = tegra_clk_register_pllm("pll_m", "pll_ref", clk_base, pmc,
Peter De Schrijverebe142b2013-10-04 17:28:34 +03001418 CLK_IGNORE_UNUSED | CLK_SET_RATE_GATE,
1419 &pll_m_params, NULL);
Peter De Schrijverc9e2d692013-08-22 15:27:46 +03001420 clks[TEGRA114_CLK_PLL_M] = clk;
Peter De Schrijver2cb5efe2013-04-03 17:40:45 +03001421
1422 /* PLLM_OUT1 */
1423 clk = tegra_clk_register_divider("pll_m_out1_div", "pll_m",
1424 clk_base + PLLM_OUT, 0, TEGRA_DIVIDER_ROUND_UP,
1425 8, 8, 1, NULL);
1426 clk = tegra_clk_register_pll_out("pll_m_out1", "pll_m_out1_div",
1427 clk_base + PLLM_OUT, 1, 0, CLK_IGNORE_UNUSED |
1428 CLK_SET_RATE_PARENT, 0, NULL);
Peter De Schrijverc9e2d692013-08-22 15:27:46 +03001429 clks[TEGRA114_CLK_PLL_M_OUT1] = clk;
Peter De Schrijver2cb5efe2013-04-03 17:40:45 +03001430
1431 /* PLLM_UD */
1432 clk = clk_register_fixed_factor(NULL, "pll_m_ud", "pll_m",
1433 CLK_SET_RATE_PARENT, 1, 1);
1434
1435 /* PLLX */
Peter De Schrijver04edb092013-09-06 14:37:37 +03001436 clk = tegra_clk_register_pllxc("pll_x", "pll_ref", clk_base,
Peter De Schrijverebe142b2013-10-04 17:28:34 +03001437 pmc, CLK_IGNORE_UNUSED, &pll_x_params, NULL);
Peter De Schrijver04edb092013-09-06 14:37:37 +03001438 clks[TEGRA114_CLK_PLL_X] = clk;
Peter De Schrijver2cb5efe2013-04-03 17:40:45 +03001439
1440 /* PLLX_OUT0 */
1441 clk = clk_register_fixed_factor(NULL, "pll_x_out0", "pll_x",
1442 CLK_SET_RATE_PARENT, 1, 2);
Peter De Schrijverc9e2d692013-08-22 15:27:46 +03001443 clks[TEGRA114_CLK_PLL_X_OUT0] = clk;
Peter De Schrijver2cb5efe2013-04-03 17:40:45 +03001444
1445 /* PLLU */
1446 val = readl(clk_base + pll_u_params.base_reg);
1447 val &= ~BIT(24); /* disable PLLU_OVERRIDE */
1448 writel(val, clk_base + pll_u_params.base_reg);
1449
1450 clk = tegra_clk_register_pll("pll_u", "pll_ref", clk_base, pmc, 0,
Peter De Schrijverebe142b2013-10-04 17:28:34 +03001451 &pll_u_params, &pll_u_lock);
Peter De Schrijverc9e2d692013-08-22 15:27:46 +03001452 clks[TEGRA114_CLK_PLL_U] = clk;
Peter De Schrijver2cb5efe2013-04-03 17:40:45 +03001453
1454 tegra114_utmi_param_configure(clk_base);
1455
1456 /* PLLU_480M */
1457 clk = clk_register_gate(NULL, "pll_u_480M", "pll_u",
1458 CLK_SET_RATE_PARENT, clk_base + PLLU_BASE,
1459 22, 0, &pll_u_lock);
Peter De Schrijverc9e2d692013-08-22 15:27:46 +03001460 clks[TEGRA114_CLK_PLL_U_480M] = clk;
Peter De Schrijver2cb5efe2013-04-03 17:40:45 +03001461
1462 /* PLLU_60M */
1463 clk = clk_register_fixed_factor(NULL, "pll_u_60M", "pll_u",
1464 CLK_SET_RATE_PARENT, 1, 8);
Peter De Schrijverc9e2d692013-08-22 15:27:46 +03001465 clks[TEGRA114_CLK_PLL_U_60M] = clk;
Peter De Schrijver2cb5efe2013-04-03 17:40:45 +03001466
1467 /* PLLU_48M */
1468 clk = clk_register_fixed_factor(NULL, "pll_u_48M", "pll_u",
1469 CLK_SET_RATE_PARENT, 1, 10);
Peter De Schrijverc9e2d692013-08-22 15:27:46 +03001470 clks[TEGRA114_CLK_PLL_U_48M] = clk;
Peter De Schrijver2cb5efe2013-04-03 17:40:45 +03001471
1472 /* PLLU_12M */
1473 clk = clk_register_fixed_factor(NULL, "pll_u_12M", "pll_u",
1474 CLK_SET_RATE_PARENT, 1, 40);
Peter De Schrijverc9e2d692013-08-22 15:27:46 +03001475 clks[TEGRA114_CLK_PLL_U_12M] = clk;
Peter De Schrijver2cb5efe2013-04-03 17:40:45 +03001476
1477 /* PLLD */
1478 clk = tegra_clk_register_pll("pll_d", "pll_ref", clk_base, pmc, 0,
Peter De Schrijverebe142b2013-10-04 17:28:34 +03001479 &pll_d_params, &pll_d_lock);
Peter De Schrijverc9e2d692013-08-22 15:27:46 +03001480 clks[TEGRA114_CLK_PLL_D] = clk;
Peter De Schrijver2cb5efe2013-04-03 17:40:45 +03001481
1482 /* PLLD_OUT0 */
1483 clk = clk_register_fixed_factor(NULL, "pll_d_out0", "pll_d",
1484 CLK_SET_RATE_PARENT, 1, 2);
Peter De Schrijverc9e2d692013-08-22 15:27:46 +03001485 clks[TEGRA114_CLK_PLL_D_OUT0] = clk;
Peter De Schrijver2cb5efe2013-04-03 17:40:45 +03001486
1487 /* PLLD2 */
1488 clk = tegra_clk_register_pll("pll_d2", "pll_ref", clk_base, pmc, 0,
Peter De Schrijverebe142b2013-10-04 17:28:34 +03001489 &pll_d2_params, &pll_d2_lock);
Peter De Schrijverc9e2d692013-08-22 15:27:46 +03001490 clks[TEGRA114_CLK_PLL_D2] = clk;
Peter De Schrijver2cb5efe2013-04-03 17:40:45 +03001491
1492 /* PLLD2_OUT0 */
1493 clk = clk_register_fixed_factor(NULL, "pll_d2_out0", "pll_d2",
1494 CLK_SET_RATE_PARENT, 1, 2);
Peter De Schrijverc9e2d692013-08-22 15:27:46 +03001495 clks[TEGRA114_CLK_PLL_D2_OUT0] = clk;
Peter De Schrijver2cb5efe2013-04-03 17:40:45 +03001496
Peter De Schrijver2cb5efe2013-04-03 17:40:45 +03001497 /* PLLRE */
Peter De Schrijver2cb5efe2013-04-03 17:40:45 +03001498 clk = tegra_clk_register_pllre("pll_re_vco", "pll_ref", clk_base, pmc,
Peter De Schrijverebe142b2013-10-04 17:28:34 +03001499 0, &pll_re_vco_params, &pll_re_lock, pll_ref_freq);
Peter De Schrijverc9e2d692013-08-22 15:27:46 +03001500 clks[TEGRA114_CLK_PLL_RE_VCO] = clk;
Peter De Schrijver2cb5efe2013-04-03 17:40:45 +03001501
1502 clk = clk_register_divider_table(NULL, "pll_re_out", "pll_re_vco", 0,
1503 clk_base + PLLRE_BASE, 16, 4, 0,
1504 pll_re_div_table, &pll_re_lock);
Peter De Schrijverc9e2d692013-08-22 15:27:46 +03001505 clks[TEGRA114_CLK_PLL_RE_OUT] = clk;
Peter De Schrijver2cb5efe2013-04-03 17:40:45 +03001506
1507 /* PLLE */
Peter De Schrijver8e9cc802013-11-25 14:44:13 +02001508 clk = tegra_clk_register_plle_tegra114("pll_e_out0", "pll_ref",
Peter De Schrijverebe142b2013-10-04 17:28:34 +03001509 clk_base, 0, &pll_e_params, NULL);
Peter De Schrijverc9e2d692013-08-22 15:27:46 +03001510 clks[TEGRA114_CLK_PLL_E_OUT0] = clk;
Peter De Schrijver2cb5efe2013-04-03 17:40:45 +03001511}
1512
Peter De Schrijver2cb5efe2013-04-03 17:40:45 +03001513static const char *clk_out1_parents[] = { "clk_m", "clk_m_div2",
1514 "clk_m_div4", "extern1",
1515};
1516
1517static const char *clk_out2_parents[] = { "clk_m", "clk_m_div2",
1518 "clk_m_div4", "extern2",
1519};
1520
1521static const char *clk_out3_parents[] = { "clk_m", "clk_m_div2",
1522 "clk_m_div4", "extern3",
1523};
1524
Peter De Schrijver2cb5efe2013-04-03 17:40:45 +03001525static void __init tegra114_pmc_clk_init(void __iomem *pmc_base)
1526{
1527 struct clk *clk;
1528
1529 /* clk_out_1 */
1530 clk = clk_register_mux(NULL, "clk_out_1_mux", clk_out1_parents,
James Hogan819c1de2013-07-29 12:25:01 +01001531 ARRAY_SIZE(clk_out1_parents),
1532 CLK_SET_RATE_NO_REPARENT,
Peter De Schrijver2cb5efe2013-04-03 17:40:45 +03001533 pmc_base + PMC_CLK_OUT_CNTRL, 6, 3, 0,
1534 &clk_out_lock);
Peter De Schrijverc9e2d692013-08-22 15:27:46 +03001535 clks[TEGRA114_CLK_CLK_OUT_1_MUX] = clk;
Peter De Schrijver2cb5efe2013-04-03 17:40:45 +03001536 clk = clk_register_gate(NULL, "clk_out_1", "clk_out_1_mux", 0,
1537 pmc_base + PMC_CLK_OUT_CNTRL, 2, 0,
1538 &clk_out_lock);
Peter De Schrijverc9e2d692013-08-22 15:27:46 +03001539 clks[TEGRA114_CLK_CLK_OUT_1] = clk;
Peter De Schrijver2cb5efe2013-04-03 17:40:45 +03001540
1541 /* clk_out_2 */
1542 clk = clk_register_mux(NULL, "clk_out_2_mux", clk_out2_parents,
James Hogan819c1de2013-07-29 12:25:01 +01001543 ARRAY_SIZE(clk_out2_parents),
1544 CLK_SET_RATE_NO_REPARENT,
Peter De Schrijver2cb5efe2013-04-03 17:40:45 +03001545 pmc_base + PMC_CLK_OUT_CNTRL, 14, 3, 0,
1546 &clk_out_lock);
Peter De Schrijverc9e2d692013-08-22 15:27:46 +03001547 clks[TEGRA114_CLK_CLK_OUT_2_MUX] = clk;
Peter De Schrijver2cb5efe2013-04-03 17:40:45 +03001548 clk = clk_register_gate(NULL, "clk_out_2", "clk_out_2_mux", 0,
1549 pmc_base + PMC_CLK_OUT_CNTRL, 10, 0,
1550 &clk_out_lock);
Peter De Schrijverc9e2d692013-08-22 15:27:46 +03001551 clks[TEGRA114_CLK_CLK_OUT_2] = clk;
Peter De Schrijver2cb5efe2013-04-03 17:40:45 +03001552
1553 /* clk_out_3 */
1554 clk = clk_register_mux(NULL, "clk_out_3_mux", clk_out3_parents,
James Hogan819c1de2013-07-29 12:25:01 +01001555 ARRAY_SIZE(clk_out3_parents),
1556 CLK_SET_RATE_NO_REPARENT,
Peter De Schrijver2cb5efe2013-04-03 17:40:45 +03001557 pmc_base + PMC_CLK_OUT_CNTRL, 22, 3, 0,
1558 &clk_out_lock);
Peter De Schrijverc9e2d692013-08-22 15:27:46 +03001559 clks[TEGRA114_CLK_CLK_OUT_3_MUX] = clk;
Peter De Schrijver2cb5efe2013-04-03 17:40:45 +03001560 clk = clk_register_gate(NULL, "clk_out_3", "clk_out_3_mux", 0,
1561 pmc_base + PMC_CLK_OUT_CNTRL, 18, 0,
1562 &clk_out_lock);
Peter De Schrijverc9e2d692013-08-22 15:27:46 +03001563 clks[TEGRA114_CLK_CLK_OUT_3] = clk;
Peter De Schrijver2cb5efe2013-04-03 17:40:45 +03001564
1565 /* blink */
Alexandre Courbot91392272013-05-26 11:56:31 +09001566 /* clear the blink timer register to directly output clk_32k */
1567 writel_relaxed(0, pmc_base + PMC_BLINK_TIMER);
Peter De Schrijver2cb5efe2013-04-03 17:40:45 +03001568 clk = clk_register_gate(NULL, "blink_override", "clk_32k", 0,
1569 pmc_base + PMC_DPD_PADS_ORIDE,
1570 PMC_DPD_PADS_ORIDE_BLINK_ENB, 0, NULL);
1571 clk = clk_register_gate(NULL, "blink", "blink_override", 0,
1572 pmc_base + PMC_CTRL,
1573 PMC_CTRL_BLINK_ENB, 0, NULL);
Peter De Schrijverc9e2d692013-08-22 15:27:46 +03001574 clks[TEGRA114_CLK_BLINK] = clk;
Peter De Schrijver2cb5efe2013-04-03 17:40:45 +03001575
1576}
1577
1578static const char *sclk_parents[] = { "clk_m", "pll_c_out1", "pll_p_out4",
Peter De Schrijver29b09442013-06-05 17:29:28 +03001579 "pll_p", "pll_p_out2", "unused",
Peter De Schrijver2cb5efe2013-04-03 17:40:45 +03001580 "clk_32k", "pll_m_out1" };
1581
1582static const char *cclk_g_parents[] = { "clk_m", "pll_c", "clk_32k", "pll_m",
1583 "pll_p", "pll_p_out4", "unused",
1584 "unused", "pll_x" };
1585
1586static const char *cclk_lp_parents[] = { "clk_m", "pll_c", "clk_32k", "pll_m",
1587 "pll_p", "pll_p_out4", "unused",
1588 "unused", "pll_x", "pll_x_out0" };
1589
1590static void __init tegra114_super_clk_init(void __iomem *clk_base)
1591{
1592 struct clk *clk;
1593
1594 /* CCLKG */
1595 clk = tegra_clk_register_super_mux("cclk_g", cclk_g_parents,
1596 ARRAY_SIZE(cclk_g_parents),
1597 CLK_SET_RATE_PARENT,
1598 clk_base + CCLKG_BURST_POLICY,
1599 0, 4, 0, 0, NULL);
Peter De Schrijverc9e2d692013-08-22 15:27:46 +03001600 clks[TEGRA114_CLK_CCLK_G] = clk;
Peter De Schrijver2cb5efe2013-04-03 17:40:45 +03001601
1602 /* CCLKLP */
1603 clk = tegra_clk_register_super_mux("cclk_lp", cclk_lp_parents,
1604 ARRAY_SIZE(cclk_lp_parents),
1605 CLK_SET_RATE_PARENT,
1606 clk_base + CCLKLP_BURST_POLICY,
1607 0, 4, 8, 9, NULL);
Peter De Schrijverc9e2d692013-08-22 15:27:46 +03001608 clks[TEGRA114_CLK_CCLK_LP] = clk;
Peter De Schrijver2cb5efe2013-04-03 17:40:45 +03001609
1610 /* SCLK */
1611 clk = tegra_clk_register_super_mux("sclk", sclk_parents,
1612 ARRAY_SIZE(sclk_parents),
1613 CLK_SET_RATE_PARENT,
1614 clk_base + SCLK_BURST_POLICY,
1615 0, 4, 0, 0, NULL);
Peter De Schrijverc9e2d692013-08-22 15:27:46 +03001616 clks[TEGRA114_CLK_SCLK] = clk;
Peter De Schrijver2cb5efe2013-04-03 17:40:45 +03001617
1618 /* HCLK */
1619 clk = clk_register_divider(NULL, "hclk_div", "sclk", 0,
1620 clk_base + SYSTEM_CLK_RATE, 4, 2, 0,
1621 &sysrate_lock);
1622 clk = clk_register_gate(NULL, "hclk", "hclk_div", CLK_SET_RATE_PARENT |
1623 CLK_IGNORE_UNUSED, clk_base + SYSTEM_CLK_RATE,
1624 7, CLK_GATE_SET_TO_DISABLE, &sysrate_lock);
Peter De Schrijverc9e2d692013-08-22 15:27:46 +03001625 clks[TEGRA114_CLK_HCLK] = clk;
Peter De Schrijver2cb5efe2013-04-03 17:40:45 +03001626
1627 /* PCLK */
1628 clk = clk_register_divider(NULL, "pclk_div", "hclk", 0,
1629 clk_base + SYSTEM_CLK_RATE, 0, 2, 0,
1630 &sysrate_lock);
1631 clk = clk_register_gate(NULL, "pclk", "pclk_div", CLK_SET_RATE_PARENT |
1632 CLK_IGNORE_UNUSED, clk_base + SYSTEM_CLK_RATE,
1633 3, CLK_GATE_SET_TO_DISABLE, &sysrate_lock);
Peter De Schrijverc9e2d692013-08-22 15:27:46 +03001634 clks[TEGRA114_CLK_PCLK] = clk;
Peter De Schrijver2cb5efe2013-04-03 17:40:45 +03001635}
1636
1637static struct tegra_periph_init_data tegra_periph_clk_list[] = {
Peter De Schrijver73d37e42013-10-09 14:47:57 +03001638 TEGRA_INIT_DATA_MUX("i2s0", mux_pllaout0_audio0_2x_pllp_clkm, CLK_SOURCE_I2S0, 30, TEGRA_PERIPH_ON_APB, TEGRA114_CLK_I2S0),
1639 TEGRA_INIT_DATA_MUX("i2s1", mux_pllaout0_audio1_2x_pllp_clkm, CLK_SOURCE_I2S1, 11, TEGRA_PERIPH_ON_APB, TEGRA114_CLK_I2S1),
1640 TEGRA_INIT_DATA_MUX("i2s2", mux_pllaout0_audio2_2x_pllp_clkm, CLK_SOURCE_I2S2, 18, TEGRA_PERIPH_ON_APB, TEGRA114_CLK_I2S2),
1641 TEGRA_INIT_DATA_MUX("i2s3", mux_pllaout0_audio3_2x_pllp_clkm, CLK_SOURCE_I2S3, 101, TEGRA_PERIPH_ON_APB, TEGRA114_CLK_I2S3),
1642 TEGRA_INIT_DATA_MUX("i2s4", mux_pllaout0_audio4_2x_pllp_clkm, CLK_SOURCE_I2S4, 102, TEGRA_PERIPH_ON_APB, TEGRA114_CLK_I2S4),
1643 TEGRA_INIT_DATA_MUX("spdif_out", mux_pllaout0_audio_2x_pllp_clkm, CLK_SOURCE_SPDIF_OUT, 10, TEGRA_PERIPH_ON_APB, TEGRA114_CLK_SPDIF_OUT),
1644 TEGRA_INIT_DATA_MUX("spdif_in", mux_pllp_pllc_pllm, CLK_SOURCE_SPDIF_IN, 10, TEGRA_PERIPH_ON_APB, TEGRA114_CLK_SPDIF_IN),
1645 TEGRA_INIT_DATA_MUX("pwm", mux_pllp_pllc_clk32_clkm, CLK_SOURCE_PWM, 17, TEGRA_PERIPH_ON_APB, TEGRA114_CLK_PWM),
1646 TEGRA_INIT_DATA_MUX("adx", mux_plla_pllc_pllp_clkm, CLK_SOURCE_ADX, 154, TEGRA_PERIPH_ON_APB, TEGRA114_CLK_ADX),
1647 TEGRA_INIT_DATA_MUX("amx", mux_plla_pllc_pllp_clkm, CLK_SOURCE_AMX, 153, TEGRA_PERIPH_ON_APB, TEGRA114_CLK_AMX),
1648 TEGRA_INIT_DATA_MUX("hda", mux_pllp_pllc_pllm_clkm, CLK_SOURCE_HDA, 125, TEGRA_PERIPH_ON_APB, TEGRA114_CLK_HDA),
1649 TEGRA_INIT_DATA_MUX("hda2codec_2x", mux_pllp_pllc_pllm_clkm, CLK_SOURCE_HDA2CODEC_2X, 111, TEGRA_PERIPH_ON_APB, TEGRA114_CLK_HDA2CODEC_2X),
1650 TEGRA_INIT_DATA_MUX8("sbc1", mux_pllp_pllc2_c_c3_pllm_clkm, CLK_SOURCE_SBC1, 41, TEGRA_PERIPH_ON_APB, TEGRA114_CLK_SBC1),
1651 TEGRA_INIT_DATA_MUX8("sbc2", mux_pllp_pllc2_c_c3_pllm_clkm, CLK_SOURCE_SBC2, 44, TEGRA_PERIPH_ON_APB, TEGRA114_CLK_SBC2),
1652 TEGRA_INIT_DATA_MUX8("sbc3", mux_pllp_pllc2_c_c3_pllm_clkm, CLK_SOURCE_SBC3, 46, TEGRA_PERIPH_ON_APB, TEGRA114_CLK_SBC3),
1653 TEGRA_INIT_DATA_MUX8("sbc4", mux_pllp_pllc2_c_c3_pllm_clkm, CLK_SOURCE_SBC4, 68, TEGRA_PERIPH_ON_APB, TEGRA114_CLK_SBC4),
1654 TEGRA_INIT_DATA_MUX8("sbc5", mux_pllp_pllc2_c_c3_pllm_clkm, CLK_SOURCE_SBC5, 104, TEGRA_PERIPH_ON_APB, TEGRA114_CLK_SBC5),
1655 TEGRA_INIT_DATA_MUX8("sbc6", mux_pllp_pllc2_c_c3_pllm_clkm, CLK_SOURCE_SBC6, 105, TEGRA_PERIPH_ON_APB, TEGRA114_CLK_SBC6),
1656 TEGRA_INIT_DATA_MUX8("ndflash", mux_pllp_pllc2_c_c3_pllm_clkm, CLK_SOURCE_NDFLASH, 13, TEGRA_PERIPH_ON_APB, TEGRA114_CLK_NDSPEED),
1657 TEGRA_INIT_DATA_MUX8("ndspeed", mux_pllp_pllc2_c_c3_pllm_clkm, CLK_SOURCE_NDSPEED, 80, TEGRA_PERIPH_ON_APB, TEGRA114_CLK_NDSPEED),
1658 TEGRA_INIT_DATA_MUX("vfir", mux_pllp_pllc_pllm_clkm, CLK_SOURCE_VFIR, 7, TEGRA_PERIPH_ON_APB, TEGRA114_CLK_VFIR),
1659 TEGRA_INIT_DATA_MUX("sdmmc1", mux_pllp_pllc_pllm_clkm, CLK_SOURCE_SDMMC1, 14, 0, TEGRA114_CLK_SDMMC1),
1660 TEGRA_INIT_DATA_MUX("sdmmc2", mux_pllp_pllc_pllm_clkm, CLK_SOURCE_SDMMC2, 9, 0, TEGRA114_CLK_SDMMC2),
1661 TEGRA_INIT_DATA_MUX("sdmmc3", mux_pllp_pllc_pllm_clkm, CLK_SOURCE_SDMMC3, 69, 0, TEGRA114_CLK_SDMMC3),
1662 TEGRA_INIT_DATA_MUX("sdmmc4", mux_pllp_pllc_pllm_clkm, CLK_SOURCE_SDMMC4, 15, 0, TEGRA114_CLK_SDMMC4),
1663 TEGRA_INIT_DATA_INT8("vde", mux_pllp_pllc2_c_c3_pllm_clkm, CLK_SOURCE_VDE, 61, 0, TEGRA114_CLK_VDE),
1664 TEGRA_INIT_DATA_MUX_FLAGS("csite", mux_pllp_pllc_pllm_clkm, CLK_SOURCE_CSITE, 73, TEGRA_PERIPH_ON_APB, TEGRA114_CLK_CSITE, CLK_IGNORE_UNUSED),
1665 TEGRA_INIT_DATA_MUX("la", mux_pllp_pllc_pllm_clkm, CLK_SOURCE_LA, 76, TEGRA_PERIPH_ON_APB, TEGRA114_CLK_LA),
1666 TEGRA_INIT_DATA_MUX("trace", mux_pllp_pllc_pllm_clkm, CLK_SOURCE_TRACE, 77, TEGRA_PERIPH_ON_APB, TEGRA114_CLK_TRACE),
1667 TEGRA_INIT_DATA_MUX("owr", mux_pllp_pllc_pllm_clkm, CLK_SOURCE_OWR, 71, TEGRA_PERIPH_ON_APB, TEGRA114_CLK_OWR),
1668 TEGRA_INIT_DATA_MUX("nor", mux_pllp_pllc_pllm_clkm, CLK_SOURCE_NOR, 42, 0, TEGRA114_CLK_NOR),
1669 TEGRA_INIT_DATA_MUX("mipi", mux_pllp_pllc_pllm_clkm, CLK_SOURCE_MIPI, 50, TEGRA_PERIPH_ON_APB, TEGRA114_CLK_MIPI),
1670 TEGRA_INIT_DATA_I2C("i2c1", mux_pllp_clkm, CLK_SOURCE_I2C1, 12, TEGRA114_CLK_I2C1),
1671 TEGRA_INIT_DATA_I2C("i2c2", mux_pllp_clkm, CLK_SOURCE_I2C2, 54, TEGRA114_CLK_I2C2),
1672 TEGRA_INIT_DATA_I2C("i2c3", mux_pllp_clkm, CLK_SOURCE_I2C3, 67, TEGRA114_CLK_I2C3),
1673 TEGRA_INIT_DATA_I2C("i2c4", mux_pllp_clkm, CLK_SOURCE_I2C4, 103, TEGRA114_CLK_I2C4),
1674 TEGRA_INIT_DATA_I2C("i2c5", mux_pllp_clkm, CLK_SOURCE_I2C5, 47, TEGRA114_CLK_I2C5),
1675 TEGRA_INIT_DATA_UART("uarta", mux_pllp_pllc_pllm_clkm, CLK_SOURCE_UARTA, 6, TEGRA114_CLK_UARTA),
1676 TEGRA_INIT_DATA_UART("uartb", mux_pllp_pllc_pllm_clkm, CLK_SOURCE_UARTB, 7, TEGRA114_CLK_UARTB),
1677 TEGRA_INIT_DATA_UART("uartc", mux_pllp_pllc_pllm_clkm, CLK_SOURCE_UARTC, 55, TEGRA114_CLK_UARTC),
1678 TEGRA_INIT_DATA_UART("uartd", mux_pllp_pllc_pllm_clkm, CLK_SOURCE_UARTD, 65, TEGRA114_CLK_UARTD),
1679 TEGRA_INIT_DATA_INT8("3d", mux_pllm_pllc2_c_c3_pllp_plla, CLK_SOURCE_3D, 24, 0, TEGRA114_CLK_GR3D),
1680 TEGRA_INIT_DATA_INT8("2d", mux_pllm_pllc2_c_c3_pllp_plla, CLK_SOURCE_2D, 21, 0, TEGRA114_CLK_GR2D),
1681 TEGRA_INIT_DATA_MUX("vi_sensor", mux_pllm_pllc2_c_c3_pllp_plla, CLK_SOURCE_VI_SENSOR, 20, TEGRA_PERIPH_NO_RESET, TEGRA114_CLK_VI_SENSOR),
1682 TEGRA_INIT_DATA_INT8("vi", mux_pllm_pllc2_c_c3_pllp_plla, CLK_SOURCE_VI, 20, 0, TEGRA114_CLK_VI),
1683 TEGRA_INIT_DATA_INT8("epp", mux_pllm_pllc2_c_c3_pllp_plla, CLK_SOURCE_EPP, 19, 0, TEGRA114_CLK_EPP),
1684 TEGRA_INIT_DATA_INT8("msenc", mux_pllm_pllc2_c_c3_pllp_plla, CLK_SOURCE_MSENC, 91, TEGRA_PERIPH_WAR_1005168, TEGRA114_CLK_MSENC),
1685 TEGRA_INIT_DATA_INT8("tsec", mux_pllp_pllc2_c_c3_pllm_clkm, CLK_SOURCE_TSEC, 83, 0, TEGRA114_CLK_TSEC),
1686 TEGRA_INIT_DATA_INT8("host1x", mux_pllm_pllc2_c_c3_pllp_plla, CLK_SOURCE_HOST1X, 28, 0, TEGRA114_CLK_HOST1X),
1687 TEGRA_INIT_DATA_MUX8("hdmi", mux_pllp_pllm_plld_plla_pllc_plld2_clkm, CLK_SOURCE_HDMI, 51, 0, TEGRA114_CLK_HDMI),
1688 TEGRA_INIT_DATA_MUX("cilab", mux_pllp_pllc_clkm, CLK_SOURCE_CILAB, 144, 0, TEGRA114_CLK_CILAB),
1689 TEGRA_INIT_DATA_MUX("cilcd", mux_pllp_pllc_clkm, CLK_SOURCE_CILCD, 145, 0, TEGRA114_CLK_CILCD),
1690 TEGRA_INIT_DATA_MUX("cile", mux_pllp_pllc_clkm, CLK_SOURCE_CILE, 146, 0, TEGRA114_CLK_CILE),
1691 TEGRA_INIT_DATA_MUX("dsialp", mux_pllp_pllc_clkm, CLK_SOURCE_DSIALP, 147, 0, TEGRA114_CLK_DSIALP),
1692 TEGRA_INIT_DATA_MUX("dsiblp", mux_pllp_pllc_clkm, CLK_SOURCE_DSIBLP, 148, 0, TEGRA114_CLK_DSIBLP),
1693 TEGRA_INIT_DATA_MUX("tsensor", mux_pllp_pllc_clkm_clk32, CLK_SOURCE_TSENSOR, 100, TEGRA_PERIPH_ON_APB, TEGRA114_CLK_TSENSOR),
1694 TEGRA_INIT_DATA_MUX("actmon", mux_pllp_pllc_clk32_clkm, CLK_SOURCE_ACTMON, 119, 0, TEGRA114_CLK_ACTMON),
1695 TEGRA_INIT_DATA_MUX8("extern1", mux_plla_clk32_pllp_clkm_plle, CLK_SOURCE_EXTERN1, 120, 0, TEGRA114_CLK_EXTERN1),
1696 TEGRA_INIT_DATA_MUX8("extern2", mux_plla_clk32_pllp_clkm_plle, CLK_SOURCE_EXTERN2, 121, 0, TEGRA114_CLK_EXTERN2),
1697 TEGRA_INIT_DATA_MUX8("extern3", mux_plla_clk32_pllp_clkm_plle, CLK_SOURCE_EXTERN3, 122, 0, TEGRA114_CLK_EXTERN3),
1698 TEGRA_INIT_DATA_MUX("i2cslow", mux_pllp_pllc_clk32_clkm, CLK_SOURCE_I2CSLOW, 81, TEGRA_PERIPH_ON_APB, TEGRA114_CLK_I2CSLOW),
1699 TEGRA_INIT_DATA_INT8("se", mux_pllp_pllc2_c_c3_pllm_clkm, CLK_SOURCE_SE, 127, TEGRA_PERIPH_ON_APB, TEGRA114_CLK_SE),
1700 TEGRA_INIT_DATA_INT_FLAGS("mselect", mux_pllp_clkm, CLK_SOURCE_MSELECT, 99, 0, TEGRA114_CLK_MSELECT, CLK_IGNORE_UNUSED),
1701 TEGRA_INIT_DATA_MUX("dfll_ref", mux_pllp_clkm, CLK_SOURCE_DFLL_REF, 155, TEGRA_PERIPH_ON_APB, TEGRA114_CLK_DFLL_REF),
1702 TEGRA_INIT_DATA_MUX("dfll_soc", mux_pllp_clkm, CLK_SOURCE_DFLL_SOC, 155, TEGRA_PERIPH_ON_APB, TEGRA114_CLK_DFLL_SOC),
1703 TEGRA_INIT_DATA_MUX8("soc_therm", mux_pllm_pllc_pllp_plla, CLK_SOURCE_SOC_THERM, 78, TEGRA_PERIPH_ON_APB, TEGRA114_CLK_SOC_THERM),
1704 TEGRA_INIT_DATA_XUSB("xusb_host_src", mux_clkm_pllp_pllc_pllre, CLK_SOURCE_XUSB_HOST_SRC, 143, TEGRA_PERIPH_ON_APB | TEGRA_PERIPH_NO_RESET, TEGRA114_CLK_XUSB_HOST_SRC),
1705 TEGRA_INIT_DATA_XUSB("xusb_falcon_src", mux_clkm_pllp_pllc_pllre, CLK_SOURCE_XUSB_FALCON_SRC, 143, TEGRA_PERIPH_NO_RESET, TEGRA114_CLK_XUSB_FALCON_SRC),
1706 TEGRA_INIT_DATA_XUSB("xusb_fs_src", mux_clkm_48M_pllp_480M, CLK_SOURCE_XUSB_FS_SRC, 143, TEGRA_PERIPH_NO_RESET, TEGRA114_CLK_XUSB_FS_SRC),
1707 TEGRA_INIT_DATA_XUSB("xusb_ss_src", mux_clkm_pllre_clk32_480M_pllc_ref, CLK_SOURCE_XUSB_SS_SRC, 143, TEGRA_PERIPH_NO_RESET, TEGRA114_CLK_XUSB_SS_SRC),
1708 TEGRA_INIT_DATA_XUSB("xusb_dev_src", mux_clkm_pllp_pllc_pllre, CLK_SOURCE_XUSB_DEV_SRC, 95, TEGRA_PERIPH_ON_APB | TEGRA_PERIPH_NO_RESET, TEGRA114_CLK_XUSB_DEV_SRC),
1709 TEGRA_INIT_DATA_AUDIO("d_audio", CLK_SOURCE_D_AUDIO, 106, TEGRA_PERIPH_ON_APB, TEGRA114_CLK_D_AUDIO),
1710 TEGRA_INIT_DATA_AUDIO("dam0", CLK_SOURCE_DAM0, 108, TEGRA_PERIPH_ON_APB, TEGRA114_CLK_DAM0),
1711 TEGRA_INIT_DATA_AUDIO("dam1", CLK_SOURCE_DAM1, 109, TEGRA_PERIPH_ON_APB, TEGRA114_CLK_DAM1),
1712 TEGRA_INIT_DATA_AUDIO("dam2", CLK_SOURCE_DAM2, 110, TEGRA_PERIPH_ON_APB, TEGRA114_CLK_DAM2),
Peter De Schrijver2cb5efe2013-04-03 17:40:45 +03001713};
1714
1715static struct tegra_periph_init_data tegra_periph_nodiv_clk_list[] = {
Peter De Schrijver73d37e42013-10-09 14:47:57 +03001716 TEGRA_INIT_DATA_NODIV("disp1", mux_pllp_pllm_plld_plla_pllc_plld2_clkm, CLK_SOURCE_DISP1, 29, 7, 27, 0, TEGRA114_CLK_DISP1),
1717 TEGRA_INIT_DATA_NODIV("disp2", mux_pllp_pllm_plld_plla_pllc_plld2_clkm, CLK_SOURCE_DISP2, 29, 7, 26, 0, TEGRA114_CLK_DISP2),
Peter De Schrijver2cb5efe2013-04-03 17:40:45 +03001718};
1719
1720static __init void tegra114_periph_clk_init(void __iomem *clk_base)
1721{
1722 struct tegra_periph_init_data *data;
1723 struct clk *clk;
1724 int i;
1725 u32 val;
1726
1727 /* apbdma */
1728 clk = tegra_clk_register_periph_gate("apbdma", "clk_m", 0, clk_base,
Peter De Schrijverd5ff89a2013-08-22 18:44:06 +03001729 0, 34, periph_clk_enb_refcnt);
Peter De Schrijverc9e2d692013-08-22 15:27:46 +03001730 clks[TEGRA114_CLK_APBDMA] = clk;
Peter De Schrijver2cb5efe2013-04-03 17:40:45 +03001731
1732 /* rtc */
1733 clk = tegra_clk_register_periph_gate("rtc", "clk_32k",
1734 TEGRA_PERIPH_ON_APB |
1735 TEGRA_PERIPH_NO_RESET, clk_base,
Peter De Schrijverd5ff89a2013-08-22 18:44:06 +03001736 0, 4, periph_clk_enb_refcnt);
Peter De Schrijverc9e2d692013-08-22 15:27:46 +03001737 clks[TEGRA114_CLK_RTC] = clk;
Peter De Schrijver2cb5efe2013-04-03 17:40:45 +03001738
1739 /* kbc */
1740 clk = tegra_clk_register_periph_gate("kbc", "clk_32k",
1741 TEGRA_PERIPH_ON_APB |
1742 TEGRA_PERIPH_NO_RESET, clk_base,
Peter De Schrijverd5ff89a2013-08-22 18:44:06 +03001743 0, 36, periph_clk_enb_refcnt);
Peter De Schrijverc9e2d692013-08-22 15:27:46 +03001744 clks[TEGRA114_CLK_KBC] = clk;
Peter De Schrijver2cb5efe2013-04-03 17:40:45 +03001745
1746 /* timer */
1747 clk = tegra_clk_register_periph_gate("timer", "clk_m", 0, clk_base,
Peter De Schrijverd5ff89a2013-08-22 18:44:06 +03001748 0, 5, periph_clk_enb_refcnt);
Peter De Schrijverc9e2d692013-08-22 15:27:46 +03001749 clks[TEGRA114_CLK_TIMER] = clk;
Peter De Schrijver2cb5efe2013-04-03 17:40:45 +03001750
1751 /* kfuse */
1752 clk = tegra_clk_register_periph_gate("kfuse", "clk_m",
1753 TEGRA_PERIPH_ON_APB, clk_base, 0, 40,
Peter De Schrijverd5ff89a2013-08-22 18:44:06 +03001754 periph_clk_enb_refcnt);
Peter De Schrijverc9e2d692013-08-22 15:27:46 +03001755 clks[TEGRA114_CLK_KFUSE] = clk;
Peter De Schrijver2cb5efe2013-04-03 17:40:45 +03001756
1757 /* fuse */
1758 clk = tegra_clk_register_periph_gate("fuse", "clk_m",
1759 TEGRA_PERIPH_ON_APB, clk_base, 0, 39,
Peter De Schrijverd5ff89a2013-08-22 18:44:06 +03001760 periph_clk_enb_refcnt);
Peter De Schrijverc9e2d692013-08-22 15:27:46 +03001761 clks[TEGRA114_CLK_FUSE] = clk;
Peter De Schrijver2cb5efe2013-04-03 17:40:45 +03001762
1763 /* fuse_burn */
1764 clk = tegra_clk_register_periph_gate("fuse_burn", "clk_m",
1765 TEGRA_PERIPH_ON_APB, clk_base, 0, 39,
Peter De Schrijverd5ff89a2013-08-22 18:44:06 +03001766 periph_clk_enb_refcnt);
Peter De Schrijverc9e2d692013-08-22 15:27:46 +03001767 clks[TEGRA114_CLK_FUSE_BURN] = clk;
Peter De Schrijver2cb5efe2013-04-03 17:40:45 +03001768
1769 /* apbif */
1770 clk = tegra_clk_register_periph_gate("apbif", "clk_m",
1771 TEGRA_PERIPH_ON_APB, clk_base, 0, 107,
Peter De Schrijverd5ff89a2013-08-22 18:44:06 +03001772 periph_clk_enb_refcnt);
Peter De Schrijverc9e2d692013-08-22 15:27:46 +03001773 clks[TEGRA114_CLK_APBIF] = clk;
Peter De Schrijver2cb5efe2013-04-03 17:40:45 +03001774
1775 /* hda2hdmi */
1776 clk = tegra_clk_register_periph_gate("hda2hdmi", "clk_m",
1777 TEGRA_PERIPH_ON_APB, clk_base, 0, 128,
Peter De Schrijverd5ff89a2013-08-22 18:44:06 +03001778 periph_clk_enb_refcnt);
Peter De Schrijverc9e2d692013-08-22 15:27:46 +03001779 clks[TEGRA114_CLK_HDA2HDMI] = clk;
Peter De Schrijver2cb5efe2013-04-03 17:40:45 +03001780
1781 /* vcp */
1782 clk = tegra_clk_register_periph_gate("vcp", "clk_m", 0, clk_base, 0,
Peter De Schrijverd5ff89a2013-08-22 18:44:06 +03001783 29, periph_clk_enb_refcnt);
Peter De Schrijverc9e2d692013-08-22 15:27:46 +03001784 clks[TEGRA114_CLK_VCP] = clk;
Peter De Schrijver2cb5efe2013-04-03 17:40:45 +03001785
1786 /* bsea */
1787 clk = tegra_clk_register_periph_gate("bsea", "clk_m", 0, clk_base,
Peter De Schrijverd5ff89a2013-08-22 18:44:06 +03001788 0, 62, periph_clk_enb_refcnt);
Peter De Schrijverc9e2d692013-08-22 15:27:46 +03001789 clks[TEGRA114_CLK_BSEA] = clk;
Peter De Schrijver2cb5efe2013-04-03 17:40:45 +03001790
1791 /* bsev */
1792 clk = tegra_clk_register_periph_gate("bsev", "clk_m", 0, clk_base,
Peter De Schrijverd5ff89a2013-08-22 18:44:06 +03001793 0, 63, periph_clk_enb_refcnt);
Peter De Schrijverc9e2d692013-08-22 15:27:46 +03001794 clks[TEGRA114_CLK_BSEV] = clk;
Peter De Schrijver2cb5efe2013-04-03 17:40:45 +03001795
1796 /* mipi-cal */
1797 clk = tegra_clk_register_periph_gate("mipi-cal", "clk_m", 0, clk_base,
Peter De Schrijverd5ff89a2013-08-22 18:44:06 +03001798 0, 56, periph_clk_enb_refcnt);
Peter De Schrijverc9e2d692013-08-22 15:27:46 +03001799 clks[TEGRA114_CLK_MIPI_CAL] = clk;
Peter De Schrijver2cb5efe2013-04-03 17:40:45 +03001800
1801 /* usbd */
1802 clk = tegra_clk_register_periph_gate("usbd", "clk_m", 0, clk_base,
Peter De Schrijverd5ff89a2013-08-22 18:44:06 +03001803 0, 22, periph_clk_enb_refcnt);
Peter De Schrijverc9e2d692013-08-22 15:27:46 +03001804 clks[TEGRA114_CLK_USBD] = clk;
Peter De Schrijver2cb5efe2013-04-03 17:40:45 +03001805
1806 /* usb2 */
1807 clk = tegra_clk_register_periph_gate("usb2", "clk_m", 0, clk_base,
Peter De Schrijverd5ff89a2013-08-22 18:44:06 +03001808 0, 58, periph_clk_enb_refcnt);
Peter De Schrijverc9e2d692013-08-22 15:27:46 +03001809 clks[TEGRA114_CLK_USB2] = clk;
Peter De Schrijver2cb5efe2013-04-03 17:40:45 +03001810
1811 /* usb3 */
1812 clk = tegra_clk_register_periph_gate("usb3", "clk_m", 0, clk_base,
Peter De Schrijverd5ff89a2013-08-22 18:44:06 +03001813 0, 59, periph_clk_enb_refcnt);
Peter De Schrijverc9e2d692013-08-22 15:27:46 +03001814 clks[TEGRA114_CLK_USB3] = clk;
Peter De Schrijver2cb5efe2013-04-03 17:40:45 +03001815
1816 /* csi */
1817 clk = tegra_clk_register_periph_gate("csi", "pll_p_out3", 0, clk_base,
Peter De Schrijverd5ff89a2013-08-22 18:44:06 +03001818 0, 52, periph_clk_enb_refcnt);
Peter De Schrijverc9e2d692013-08-22 15:27:46 +03001819 clks[TEGRA114_CLK_CSI] = clk;
Peter De Schrijver2cb5efe2013-04-03 17:40:45 +03001820
1821 /* isp */
1822 clk = tegra_clk_register_periph_gate("isp", "clk_m", 0, clk_base, 0,
Peter De Schrijverd5ff89a2013-08-22 18:44:06 +03001823 23, periph_clk_enb_refcnt);
Peter De Schrijverc9e2d692013-08-22 15:27:46 +03001824 clks[TEGRA114_CLK_ISP] = clk;
Peter De Schrijver2cb5efe2013-04-03 17:40:45 +03001825
1826 /* csus */
1827 clk = tegra_clk_register_periph_gate("csus", "clk_m",
1828 TEGRA_PERIPH_NO_RESET, clk_base, 0, 92,
Peter De Schrijverd5ff89a2013-08-22 18:44:06 +03001829 periph_clk_enb_refcnt);
Peter De Schrijverc9e2d692013-08-22 15:27:46 +03001830 clks[TEGRA114_CLK_CSUS] = clk;
Peter De Schrijver2cb5efe2013-04-03 17:40:45 +03001831
1832 /* dds */
1833 clk = tegra_clk_register_periph_gate("dds", "clk_m",
1834 TEGRA_PERIPH_ON_APB, clk_base, 0, 150,
Peter De Schrijverd5ff89a2013-08-22 18:44:06 +03001835 periph_clk_enb_refcnt);
Peter De Schrijverc9e2d692013-08-22 15:27:46 +03001836 clks[TEGRA114_CLK_DDS] = clk;
Peter De Schrijver2cb5efe2013-04-03 17:40:45 +03001837
1838 /* dp2 */
1839 clk = tegra_clk_register_periph_gate("dp2", "clk_m",
1840 TEGRA_PERIPH_ON_APB, clk_base, 0, 152,
Peter De Schrijverd5ff89a2013-08-22 18:44:06 +03001841 periph_clk_enb_refcnt);
Peter De Schrijverc9e2d692013-08-22 15:27:46 +03001842 clks[TEGRA114_CLK_DP2] = clk;
Peter De Schrijver2cb5efe2013-04-03 17:40:45 +03001843
1844 /* dtv */
1845 clk = tegra_clk_register_periph_gate("dtv", "clk_m",
1846 TEGRA_PERIPH_ON_APB, clk_base, 0, 79,
Peter De Schrijverd5ff89a2013-08-22 18:44:06 +03001847 periph_clk_enb_refcnt);
Peter De Schrijverc9e2d692013-08-22 15:27:46 +03001848 clks[TEGRA114_CLK_DTV] = clk;
Peter De Schrijver2cb5efe2013-04-03 17:40:45 +03001849
1850 /* dsia */
1851 clk = clk_register_mux(NULL, "dsia_mux", mux_plld_out0_plld2_out0,
James Hogan819c1de2013-07-29 12:25:01 +01001852 ARRAY_SIZE(mux_plld_out0_plld2_out0),
1853 CLK_SET_RATE_NO_REPARENT,
Peter De Schrijver2cb5efe2013-04-03 17:40:45 +03001854 clk_base + PLLD_BASE, 25, 1, 0, &pll_d_lock);
Peter De Schrijverc9e2d692013-08-22 15:27:46 +03001855 clks[TEGRA114_CLK_DSIA_MUX] = clk;
Peter De Schrijver2cb5efe2013-04-03 17:40:45 +03001856 clk = tegra_clk_register_periph_gate("dsia", "dsia_mux", 0, clk_base,
Peter De Schrijverd5ff89a2013-08-22 18:44:06 +03001857 0, 48, periph_clk_enb_refcnt);
Peter De Schrijverc9e2d692013-08-22 15:27:46 +03001858 clks[TEGRA114_CLK_DSIA] = clk;
Peter De Schrijver2cb5efe2013-04-03 17:40:45 +03001859
1860 /* dsib */
1861 clk = clk_register_mux(NULL, "dsib_mux", mux_plld_out0_plld2_out0,
James Hogan819c1de2013-07-29 12:25:01 +01001862 ARRAY_SIZE(mux_plld_out0_plld2_out0),
1863 CLK_SET_RATE_NO_REPARENT,
Peter De Schrijver2cb5efe2013-04-03 17:40:45 +03001864 clk_base + PLLD2_BASE, 25, 1, 0, &pll_d2_lock);
Peter De Schrijverc9e2d692013-08-22 15:27:46 +03001865 clks[TEGRA114_CLK_DSIB_MUX] = clk;
Peter De Schrijver2cb5efe2013-04-03 17:40:45 +03001866 clk = tegra_clk_register_periph_gate("dsib", "dsib_mux", 0, clk_base,
Peter De Schrijverd5ff89a2013-08-22 18:44:06 +03001867 0, 82, periph_clk_enb_refcnt);
Peter De Schrijverc9e2d692013-08-22 15:27:46 +03001868 clks[TEGRA114_CLK_DSIB] = clk;
Peter De Schrijver2cb5efe2013-04-03 17:40:45 +03001869
1870 /* xusb_hs_src */
1871 val = readl(clk_base + CLK_SOURCE_XUSB_SS_SRC);
1872 val |= BIT(25); /* always select PLLU_60M */
1873 writel(val, clk_base + CLK_SOURCE_XUSB_SS_SRC);
1874
1875 clk = clk_register_fixed_factor(NULL, "xusb_hs_src", "pll_u_60M", 0,
1876 1, 1);
Peter De Schrijverc9e2d692013-08-22 15:27:46 +03001877 clks[TEGRA114_CLK_XUSB_HS_SRC] = clk;
Peter De Schrijver2cb5efe2013-04-03 17:40:45 +03001878
1879 /* xusb_host */
1880 clk = tegra_clk_register_periph_gate("xusb_host", "xusb_host_src", 0,
Peter De Schrijverd5ff89a2013-08-22 18:44:06 +03001881 clk_base, 0, 89, periph_clk_enb_refcnt);
Peter De Schrijverc9e2d692013-08-22 15:27:46 +03001882 clks[TEGRA114_CLK_XUSB_HOST] = clk;
Peter De Schrijver2cb5efe2013-04-03 17:40:45 +03001883
1884 /* xusb_ss */
1885 clk = tegra_clk_register_periph_gate("xusb_ss", "xusb_ss_src", 0,
Peter De Schrijverd5ff89a2013-08-22 18:44:06 +03001886 clk_base, 0, 156, periph_clk_enb_refcnt);
Peter De Schrijverc9e2d692013-08-22 15:27:46 +03001887 clks[TEGRA114_CLK_XUSB_HOST] = clk;
Peter De Schrijver2cb5efe2013-04-03 17:40:45 +03001888
1889 /* xusb_dev */
1890 clk = tegra_clk_register_periph_gate("xusb_dev", "xusb_dev_src", 0,
Peter De Schrijverd5ff89a2013-08-22 18:44:06 +03001891 clk_base, 0, 95, periph_clk_enb_refcnt);
Peter De Schrijverc9e2d692013-08-22 15:27:46 +03001892 clks[TEGRA114_CLK_XUSB_DEV] = clk;
Peter De Schrijver2cb5efe2013-04-03 17:40:45 +03001893
1894 /* emc */
1895 clk = clk_register_mux(NULL, "emc_mux", mux_pllmcp_clkm,
James Hogan819c1de2013-07-29 12:25:01 +01001896 ARRAY_SIZE(mux_pllmcp_clkm),
1897 CLK_SET_RATE_NO_REPARENT,
Peter De Schrijver2cb5efe2013-04-03 17:40:45 +03001898 clk_base + CLK_SOURCE_EMC,
1899 29, 3, 0, NULL);
1900 clk = tegra_clk_register_periph_gate("emc", "emc_mux", 0, clk_base,
Peter De Schrijverd5ff89a2013-08-22 18:44:06 +03001901 CLK_IGNORE_UNUSED, 57, periph_clk_enb_refcnt);
Peter De Schrijverc9e2d692013-08-22 15:27:46 +03001902 clks[TEGRA114_CLK_EMC] = clk;
Peter De Schrijver2cb5efe2013-04-03 17:40:45 +03001903
1904 for (i = 0; i < ARRAY_SIZE(tegra_periph_clk_list); i++) {
1905 data = &tegra_periph_clk_list[i];
Peter De Schrijverd5ff89a2013-08-22 18:44:06 +03001906
1907 clk = tegra_clk_register_periph(data->name,
1908 data->parent_names, data->num_parents, &data->periph,
1909 clk_base, data->offset, data->flags);
Peter De Schrijver2cb5efe2013-04-03 17:40:45 +03001910 clks[data->clk_id] = clk;
1911 }
1912
1913 for (i = 0; i < ARRAY_SIZE(tegra_periph_nodiv_clk_list); i++) {
1914 data = &tegra_periph_nodiv_clk_list[i];
Peter De Schrijverd5ff89a2013-08-22 18:44:06 +03001915
Peter De Schrijver2cb5efe2013-04-03 17:40:45 +03001916 clk = tegra_clk_register_periph_nodiv(data->name,
1917 data->parent_names, data->num_parents,
1918 &data->periph, clk_base, data->offset);
1919 clks[data->clk_id] = clk;
1920 }
1921}
1922
Joseph Lo31972fd2013-05-20 18:39:28 +08001923/* Tegra114 CPU clock and reset control functions */
1924static void tegra114_wait_cpu_in_reset(u32 cpu)
1925{
1926 unsigned int reg;
1927
1928 do {
1929 reg = readl(clk_base + CLK_RST_CONTROLLER_CPU_CMPLX_STATUS);
1930 cpu_relax();
1931 } while (!(reg & (1 << cpu))); /* check CPU been reset or not */
1932}
1933static void tegra114_disable_cpu_clock(u32 cpu)
1934{
1935 /* flow controller would take care in the power sequence. */
1936}
1937
Joseph Load7d1142013-07-03 17:50:44 +08001938#ifdef CONFIG_PM_SLEEP
1939static void tegra114_cpu_clock_suspend(void)
1940{
1941 /* switch coresite to clk_m, save off original source */
1942 tegra114_cpu_clk_sctx.clk_csite_src =
1943 readl(clk_base + CLK_SOURCE_CSITE);
1944 writel(3 << 30, clk_base + CLK_SOURCE_CSITE);
Joseph Lo0017f442013-08-12 17:40:02 +08001945
1946 tegra114_cpu_clk_sctx.cclkg_burst =
1947 readl(clk_base + CCLKG_BURST_POLICY);
1948 tegra114_cpu_clk_sctx.cclkg_divider =
1949 readl(clk_base + CCLKG_BURST_POLICY + 4);
Joseph Load7d1142013-07-03 17:50:44 +08001950}
1951
1952static void tegra114_cpu_clock_resume(void)
1953{
1954 writel(tegra114_cpu_clk_sctx.clk_csite_src,
1955 clk_base + CLK_SOURCE_CSITE);
Joseph Lo0017f442013-08-12 17:40:02 +08001956
1957 writel(tegra114_cpu_clk_sctx.cclkg_burst,
1958 clk_base + CCLKG_BURST_POLICY);
1959 writel(tegra114_cpu_clk_sctx.cclkg_divider,
1960 clk_base + CCLKG_BURST_POLICY + 4);
Joseph Load7d1142013-07-03 17:50:44 +08001961}
1962#endif
1963
Joseph Lo31972fd2013-05-20 18:39:28 +08001964static struct tegra_cpu_car_ops tegra114_cpu_car_ops = {
1965 .wait_for_reset = tegra114_wait_cpu_in_reset,
1966 .disable_clock = tegra114_disable_cpu_clock,
Joseph Load7d1142013-07-03 17:50:44 +08001967#ifdef CONFIG_PM_SLEEP
1968 .suspend = tegra114_cpu_clock_suspend,
1969 .resume = tegra114_cpu_clock_resume,
1970#endif
Joseph Lo31972fd2013-05-20 18:39:28 +08001971};
Peter De Schrijver2cb5efe2013-04-03 17:40:45 +03001972
1973static const struct of_device_id pmc_match[] __initconst = {
1974 { .compatible = "nvidia,tegra114-pmc" },
1975 {},
1976};
1977
Paul Walmsley9e601212013-06-07 06:19:01 -06001978/*
1979 * dfll_soc/dfll_ref apparently must be kept enabled, otherwise I2C5
1980 * breaks
1981 */
Sachin Kamat056dfcf2013-08-08 09:55:47 +05301982static struct tegra_clk_init_table init_table[] __initdata = {
Peter De Schrijverc9e2d692013-08-22 15:27:46 +03001983 {TEGRA114_CLK_UARTA, TEGRA114_CLK_PLL_P, 408000000, 0},
1984 {TEGRA114_CLK_UARTB, TEGRA114_CLK_PLL_P, 408000000, 0},
1985 {TEGRA114_CLK_UARTC, TEGRA114_CLK_PLL_P, 408000000, 0},
1986 {TEGRA114_CLK_UARTD, TEGRA114_CLK_PLL_P, 408000000, 0},
1987 {TEGRA114_CLK_PLL_A, TEGRA114_CLK_CLK_MAX, 564480000, 1},
1988 {TEGRA114_CLK_PLL_A_OUT0, TEGRA114_CLK_CLK_MAX, 11289600, 1},
1989 {TEGRA114_CLK_EXTERN1, TEGRA114_CLK_PLL_A_OUT0, 0, 1},
1990 {TEGRA114_CLK_CLK_OUT_1_MUX, TEGRA114_CLK_EXTERN1, 0, 1},
1991 {TEGRA114_CLK_CLK_OUT_1, TEGRA114_CLK_CLK_MAX, 0, 1},
1992 {TEGRA114_CLK_I2S0, TEGRA114_CLK_PLL_A_OUT0, 11289600, 0},
1993 {TEGRA114_CLK_I2S1, TEGRA114_CLK_PLL_A_OUT0, 11289600, 0},
1994 {TEGRA114_CLK_I2S2, TEGRA114_CLK_PLL_A_OUT0, 11289600, 0},
1995 {TEGRA114_CLK_I2S3, TEGRA114_CLK_PLL_A_OUT0, 11289600, 0},
1996 {TEGRA114_CLK_I2S4, TEGRA114_CLK_PLL_A_OUT0, 11289600, 0},
Andrew Chew897e1dd2013-08-07 19:25:09 +08001997 {TEGRA114_CLK_HOST1X, TEGRA114_CLK_PLL_P, 136000000, 0},
Peter De Schrijverc9e2d692013-08-22 15:27:46 +03001998 {TEGRA114_CLK_DFLL_SOC, TEGRA114_CLK_PLL_P, 51000000, 1},
1999 {TEGRA114_CLK_DFLL_REF, TEGRA114_CLK_PLL_P, 51000000, 1},
Thierry Redingf67a8d22013-10-02 23:12:40 +02002000 {TEGRA114_CLK_GR2D, TEGRA114_CLK_PLL_C2, 300000000, 0},
2001 {TEGRA114_CLK_GR3D, TEGRA114_CLK_PLL_C2, 300000000, 0},
Mark Zhangfc20eef2013-08-07 19:25:08 +08002002
Peter De Schrijverc9e2d692013-08-22 15:27:46 +03002003 /* This MUST be the last entry. */
2004 {TEGRA114_CLK_CLK_MAX, TEGRA114_CLK_CLK_MAX, 0, 0},
Peter De Schrijver2cb5efe2013-04-03 17:40:45 +03002005};
2006
2007static void __init tegra114_clock_apply_init_table(void)
2008{
Peter De Schrijverc9e2d692013-08-22 15:27:46 +03002009 tegra_init_from_table(init_table, clks, TEGRA114_CLK_CLK_MAX);
Peter De Schrijver2cb5efe2013-04-03 17:40:45 +03002010}
2011
Paul Walmsley25c9ded2013-06-07 06:18:58 -06002012
2013/**
2014 * tegra114_car_barrier - wait for pending writes to the CAR to complete
2015 *
2016 * Wait for any outstanding writes to the CAR MMIO space from this CPU
2017 * to complete before continuing execution. No return value.
2018 */
2019static void tegra114_car_barrier(void)
2020{
2021 wmb(); /* probably unnecessary */
2022 readl_relaxed(clk_base + CPU_FINETRIM_SELECT);
2023}
2024
2025/**
2026 * tegra114_clock_tune_cpu_trimmers_high - use high-voltage propagation delays
2027 *
2028 * When the CPU rail voltage is in the high-voltage range, use the
2029 * built-in hardwired clock propagation delays in the CPU clock
2030 * shaper. No return value.
2031 */
2032void tegra114_clock_tune_cpu_trimmers_high(void)
2033{
2034 u32 select = 0;
2035
2036 /* Use hardwired rise->rise & fall->fall clock propagation delays */
2037 select |= ~(CPU_FINETRIM_1_FCPU_1 | CPU_FINETRIM_1_FCPU_2 |
2038 CPU_FINETRIM_1_FCPU_3 | CPU_FINETRIM_1_FCPU_4 |
2039 CPU_FINETRIM_1_FCPU_5 | CPU_FINETRIM_1_FCPU_6);
2040 writel_relaxed(select, clk_base + CPU_FINETRIM_SELECT);
2041
2042 tegra114_car_barrier();
2043}
2044EXPORT_SYMBOL(tegra114_clock_tune_cpu_trimmers_high);
2045
2046/**
2047 * tegra114_clock_tune_cpu_trimmers_low - use low-voltage propagation delays
2048 *
2049 * When the CPU rail voltage is in the low-voltage range, use the
2050 * extended clock propagation delays set by
2051 * tegra114_clock_tune_cpu_trimmers_init(). The intention is to
2052 * maintain the input clock duty cycle that the FCPU subsystem
2053 * expects. No return value.
2054 */
2055void tegra114_clock_tune_cpu_trimmers_low(void)
2056{
2057 u32 select = 0;
2058
2059 /*
2060 * Use software-specified rise->rise & fall->fall clock
2061 * propagation delays (from
2062 * tegra114_clock_tune_cpu_trimmers_init()
2063 */
2064 select |= (CPU_FINETRIM_1_FCPU_1 | CPU_FINETRIM_1_FCPU_2 |
2065 CPU_FINETRIM_1_FCPU_3 | CPU_FINETRIM_1_FCPU_4 |
2066 CPU_FINETRIM_1_FCPU_5 | CPU_FINETRIM_1_FCPU_6);
2067 writel_relaxed(select, clk_base + CPU_FINETRIM_SELECT);
2068
2069 tegra114_car_barrier();
2070}
2071EXPORT_SYMBOL(tegra114_clock_tune_cpu_trimmers_low);
2072
2073/**
2074 * tegra114_clock_tune_cpu_trimmers_init - set up and enable clk prop delays
2075 *
2076 * Program extended clock propagation delays into the FCPU clock
2077 * shaper and enable them. XXX Define the purpose - peak current
2078 * reduction? No return value.
2079 */
2080/* XXX Initial voltage rail state assumption issues? */
2081void tegra114_clock_tune_cpu_trimmers_init(void)
2082{
2083 u32 dr = 0, r = 0;
2084
2085 /* Increment the rise->rise clock delay by four steps */
2086 r |= (CPU_FINETRIM_R_FCPU_1_MASK | CPU_FINETRIM_R_FCPU_2_MASK |
2087 CPU_FINETRIM_R_FCPU_3_MASK | CPU_FINETRIM_R_FCPU_4_MASK |
2088 CPU_FINETRIM_R_FCPU_5_MASK | CPU_FINETRIM_R_FCPU_6_MASK);
2089 writel_relaxed(r, clk_base + CPU_FINETRIM_R);
2090
2091 /*
2092 * Use the rise->rise clock propagation delay specified in the
2093 * r field
2094 */
2095 dr |= (CPU_FINETRIM_1_FCPU_1 | CPU_FINETRIM_1_FCPU_2 |
2096 CPU_FINETRIM_1_FCPU_3 | CPU_FINETRIM_1_FCPU_4 |
2097 CPU_FINETRIM_1_FCPU_5 | CPU_FINETRIM_1_FCPU_6);
2098 writel_relaxed(dr, clk_base + CPU_FINETRIM_DR);
2099
2100 tegra114_clock_tune_cpu_trimmers_low();
2101}
2102EXPORT_SYMBOL(tegra114_clock_tune_cpu_trimmers_init);
2103
Paul Walmsley1c472d82013-06-07 06:19:09 -06002104/**
2105 * tegra114_clock_assert_dfll_dvco_reset - assert the DFLL's DVCO reset
2106 *
2107 * Assert the reset line of the DFLL's DVCO. No return value.
2108 */
2109void tegra114_clock_assert_dfll_dvco_reset(void)
2110{
2111 u32 v;
2112
2113 v = readl_relaxed(clk_base + RST_DFLL_DVCO);
2114 v |= (1 << DVFS_DFLL_RESET_SHIFT);
2115 writel_relaxed(v, clk_base + RST_DFLL_DVCO);
2116 tegra114_car_barrier();
2117}
2118EXPORT_SYMBOL(tegra114_clock_assert_dfll_dvco_reset);
2119
2120/**
2121 * tegra114_clock_deassert_dfll_dvco_reset - deassert the DFLL's DVCO reset
2122 *
2123 * Deassert the reset line of the DFLL's DVCO, allowing the DVCO to
2124 * operate. No return value.
2125 */
2126void tegra114_clock_deassert_dfll_dvco_reset(void)
2127{
2128 u32 v;
2129
2130 v = readl_relaxed(clk_base + RST_DFLL_DVCO);
2131 v &= ~(1 << DVFS_DFLL_RESET_SHIFT);
2132 writel_relaxed(v, clk_base + RST_DFLL_DVCO);
2133 tegra114_car_barrier();
2134}
2135EXPORT_SYMBOL(tegra114_clock_deassert_dfll_dvco_reset);
2136
Prashant Gaikwad061cec92013-05-27 13:10:09 +05302137static void __init tegra114_clock_init(struct device_node *np)
Peter De Schrijver2cb5efe2013-04-03 17:40:45 +03002138{
2139 struct device_node *node;
Peter De Schrijver2cb5efe2013-04-03 17:40:45 +03002140
2141 clk_base = of_iomap(np, 0);
2142 if (!clk_base) {
2143 pr_err("ioremap tegra114 CAR failed\n");
2144 return;
2145 }
2146
2147 node = of_find_matching_node(NULL, pmc_match);
2148 if (!node) {
2149 pr_err("Failed to find pmc node\n");
2150 WARN_ON(1);
2151 return;
2152 }
2153
2154 pmc_base = of_iomap(node, 0);
2155 if (!pmc_base) {
2156 pr_err("Can't map pmc registers\n");
2157 WARN_ON(1);
2158 return;
2159 }
2160
Peter De Schrijver343a6072013-09-02 15:22:02 +03002161 clks = tegra_clk_init(TEGRA114_CLK_CLK_MAX, TEGRA114_CLK_PERIPH_BANKS);
2162 if (!clks)
Peter De Schrijver2cb5efe2013-04-03 17:40:45 +03002163 return;
2164
Peter De Schrijver343a6072013-09-02 15:22:02 +03002165 if (tegra114_osc_clk_init(clk_base) < 0)
Peter De Schrijverd5ff89a2013-08-22 18:44:06 +03002166 return;
2167
Peter De Schrijver2cb5efe2013-04-03 17:40:45 +03002168 tegra114_fixed_clk_init(clk_base);
2169 tegra114_pll_init(clk_base, pmc_base);
2170 tegra114_periph_clk_init(clk_base);
Peter De Schrijver6609dbe2013-09-17 15:42:24 +03002171 tegra_audio_clk_init(clk_base, pmc_base, tegra114_clks, &pll_a_params);
Peter De Schrijver2cb5efe2013-04-03 17:40:45 +03002172 tegra114_pmc_clk_init(pmc_base);
2173 tegra114_super_clk_init(clk_base);
2174
Peter De Schrijver343a6072013-09-02 15:22:02 +03002175 tegra_add_of_provider(np);
Peter De Schrijver73d37e42013-10-09 14:47:57 +03002176 tegra_register_devclks(devclks, ARRAY_SIZE(devclks));
Peter De Schrijver2cb5efe2013-04-03 17:40:45 +03002177
2178 tegra_clk_apply_init_table = tegra114_clock_apply_init_table;
2179
2180 tegra_cpu_car_ops = &tegra114_cpu_car_ops;
2181}
Prashant Gaikwad061cec92013-05-27 13:10:09 +05302182CLK_OF_DECLARE(tegra114, "nvidia,tegra114-car", tegra114_clock_init);