xref: /linux/drivers/clk/tegra/clk-tegra124.c (revision 2dcabf053c6ecde46f7aa3612c5a57fb8bd185c4)
176da314dSPeter De Schrijver /*
208acae34SPaul Walmsley  * Copyright (c) 2012-2014 NVIDIA CORPORATION.  All rights reserved.
376da314dSPeter De Schrijver  *
476da314dSPeter De Schrijver  * This program is free software; you can redistribute it and/or modify it
576da314dSPeter De Schrijver  * under the terms and conditions of the GNU General Public License,
676da314dSPeter De Schrijver  * version 2, as published by the Free Software Foundation.
776da314dSPeter De Schrijver  *
876da314dSPeter De Schrijver  * This program is distributed in the hope it will be useful, but WITHOUT
976da314dSPeter De Schrijver  * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
1076da314dSPeter De Schrijver  * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License for
1176da314dSPeter De Schrijver  * more details.
1276da314dSPeter De Schrijver  *
1376da314dSPeter De Schrijver  * You should have received a copy of the GNU General Public License
1476da314dSPeter De Schrijver  * along with this program.  If not, see <http://www.gnu.org/licenses/>.
1576da314dSPeter De Schrijver  */
1676da314dSPeter De Schrijver 
1776da314dSPeter De Schrijver #include <linux/io.h>
1876da314dSPeter De Schrijver #include <linux/clk-provider.h>
1976da314dSPeter De Schrijver #include <linux/clkdev.h>
2076da314dSPeter De Schrijver #include <linux/of.h>
2176da314dSPeter De Schrijver #include <linux/of_address.h>
2276da314dSPeter De Schrijver #include <linux/delay.h>
2376da314dSPeter De Schrijver #include <linux/export.h>
2476da314dSPeter De Schrijver #include <linux/clk/tegra.h>
2576da314dSPeter De Schrijver #include <dt-bindings/clock/tegra124-car.h>
26a3c83ff2SPaul Walmsley #include <dt-bindings/reset/tegra124-car.h>
2776da314dSPeter De Schrijver 
2876da314dSPeter De Schrijver #include "clk.h"
2976da314dSPeter De Schrijver #include "clk-id.h"
3076da314dSPeter De Schrijver 
3108acae34SPaul Walmsley /*
3208acae34SPaul Walmsley  * TEGRA124_CAR_BANK_COUNT: the number of peripheral clock register
3308acae34SPaul Walmsley  * banks present in the Tegra124/132 CAR IP block.  The banks are
3408acae34SPaul Walmsley  * identified by single letters, e.g.: L, H, U, V, W, X.  See
3508acae34SPaul Walmsley  * periph_regs[] in drivers/clk/tegra/clk.c
3608acae34SPaul Walmsley  */
3708acae34SPaul Walmsley #define TEGRA124_CAR_BANK_COUNT			6
3808acae34SPaul Walmsley 
3961792e40SJoseph Lo #define CLK_SOURCE_CSITE 0x1d4
4076da314dSPeter De Schrijver #define CLK_SOURCE_EMC 0x19c
4176da314dSPeter De Schrijver 
42a3c83ff2SPaul Walmsley #define RST_DFLL_DVCO			0x2f4
43a3c83ff2SPaul Walmsley #define DVFS_DFLL_RESET_SHIFT		0
44a3c83ff2SPaul Walmsley 
4576da314dSPeter De Schrijver #define PLLC_BASE 0x80
4676da314dSPeter De Schrijver #define PLLC_OUT 0x84
4776da314dSPeter De Schrijver #define PLLC_MISC2 0x88
4876da314dSPeter De Schrijver #define PLLC_MISC 0x8c
4976da314dSPeter De Schrijver #define PLLC2_BASE 0x4e8
5076da314dSPeter De Schrijver #define PLLC2_MISC 0x4ec
5176da314dSPeter De Schrijver #define PLLC3_BASE 0x4fc
5276da314dSPeter De Schrijver #define PLLC3_MISC 0x500
5376da314dSPeter De Schrijver #define PLLM_BASE 0x90
5476da314dSPeter De Schrijver #define PLLM_OUT 0x94
5576da314dSPeter De Schrijver #define PLLM_MISC 0x9c
5676da314dSPeter De Schrijver #define PLLP_BASE 0xa0
5776da314dSPeter De Schrijver #define PLLP_MISC 0xac
5876da314dSPeter De Schrijver #define PLLA_BASE 0xb0
5976da314dSPeter De Schrijver #define PLLA_MISC 0xbc
6076da314dSPeter De Schrijver #define PLLD_BASE 0xd0
6176da314dSPeter De Schrijver #define PLLD_MISC 0xdc
6276da314dSPeter De Schrijver #define PLLU_BASE 0xc0
6376da314dSPeter De Schrijver #define PLLU_MISC 0xcc
6476da314dSPeter De Schrijver #define PLLX_BASE 0xe0
6576da314dSPeter De Schrijver #define PLLX_MISC 0xe4
6676da314dSPeter De Schrijver #define PLLX_MISC2 0x514
6776da314dSPeter De Schrijver #define PLLX_MISC3 0x518
6876da314dSPeter De Schrijver #define PLLE_BASE 0xe8
6976da314dSPeter De Schrijver #define PLLE_MISC 0xec
7076da314dSPeter De Schrijver #define PLLD2_BASE 0x4b8
7176da314dSPeter De Schrijver #define PLLD2_MISC 0x4bc
7276da314dSPeter De Schrijver #define PLLE_AUX 0x48c
7376da314dSPeter De Schrijver #define PLLRE_BASE 0x4c4
7476da314dSPeter De Schrijver #define PLLRE_MISC 0x4c8
7576da314dSPeter De Schrijver #define PLLDP_BASE 0x590
7676da314dSPeter De Schrijver #define PLLDP_MISC 0x594
7776da314dSPeter De Schrijver #define PLLC4_BASE 0x5a4
7876da314dSPeter De Schrijver #define PLLC4_MISC 0x5a8
7976da314dSPeter De Schrijver 
8076da314dSPeter De Schrijver #define PLLC_IDDQ_BIT 26
8176da314dSPeter De Schrijver #define PLLRE_IDDQ_BIT 16
8276da314dSPeter De Schrijver #define PLLSS_IDDQ_BIT 19
8376da314dSPeter De Schrijver 
8476da314dSPeter De Schrijver #define PLL_BASE_LOCK BIT(27)
8576da314dSPeter De Schrijver #define PLLE_MISC_LOCK BIT(11)
8676da314dSPeter De Schrijver #define PLLRE_MISC_LOCK BIT(24)
8776da314dSPeter De Schrijver 
8876da314dSPeter De Schrijver #define PLL_MISC_LOCK_ENABLE 18
8976da314dSPeter De Schrijver #define PLLC_MISC_LOCK_ENABLE 24
9076da314dSPeter De Schrijver #define PLLDU_MISC_LOCK_ENABLE 22
9176da314dSPeter De Schrijver #define PLLE_MISC_LOCK_ENABLE 9
9276da314dSPeter De Schrijver #define PLLRE_MISC_LOCK_ENABLE 30
9376da314dSPeter De Schrijver #define PLLSS_MISC_LOCK_ENABLE 30
9476da314dSPeter De Schrijver 
9576da314dSPeter De Schrijver #define PLLXC_SW_MAX_P 6
9676da314dSPeter De Schrijver 
9776da314dSPeter De Schrijver #define PMC_PLLM_WB0_OVERRIDE 0x1dc
9876da314dSPeter De Schrijver #define PMC_PLLM_WB0_OVERRIDE_2 0x2b0
9976da314dSPeter De Schrijver 
100c38864a7STuomas Tynkkynen #define CCLKG_BURST_POLICY 0x368
101c38864a7STuomas Tynkkynen 
1029e036d3eSJoseph Lo /* Tegra CPU clock and reset control regs */
1039e036d3eSJoseph Lo #define CLK_RST_CONTROLLER_CPU_CMPLX_STATUS	0x470
1049e036d3eSJoseph Lo 
10561792e40SJoseph Lo #ifdef CONFIG_PM_SLEEP
10661792e40SJoseph Lo static struct cpu_clk_suspend_context {
10761792e40SJoseph Lo 	u32 clk_csite_src;
108c38864a7STuomas Tynkkynen 	u32 cclkg_burst;
109c38864a7STuomas Tynkkynen 	u32 cclkg_divider;
11061792e40SJoseph Lo } tegra124_cpu_clk_sctx;
11161792e40SJoseph Lo #endif
11261792e40SJoseph Lo 
11376da314dSPeter De Schrijver static void __iomem *clk_base;
11476da314dSPeter De Schrijver static void __iomem *pmc_base;
11576da314dSPeter De Schrijver 
11676da314dSPeter De Schrijver static unsigned long osc_freq;
11776da314dSPeter De Schrijver static unsigned long pll_ref_freq;
11876da314dSPeter De Schrijver 
11976da314dSPeter De Schrijver static DEFINE_SPINLOCK(pll_d_lock);
12076da314dSPeter De Schrijver static DEFINE_SPINLOCK(pll_e_lock);
12176da314dSPeter De Schrijver static DEFINE_SPINLOCK(pll_re_lock);
12276da314dSPeter De Schrijver static DEFINE_SPINLOCK(pll_u_lock);
1234f4f85faSThierry Reding static DEFINE_SPINLOCK(emc_lock);
12476da314dSPeter De Schrijver 
12576da314dSPeter De Schrijver /* possible OSC frequencies in Hz */
12676da314dSPeter De Schrijver static unsigned long tegra124_input_freq[] = {
12776da314dSPeter De Schrijver 	[ 0] = 13000000,
12876da314dSPeter De Schrijver 	[ 1] = 16800000,
12976da314dSPeter De Schrijver 	[ 4] = 19200000,
13076da314dSPeter De Schrijver 	[ 5] = 38400000,
13176da314dSPeter De Schrijver 	[ 8] = 12000000,
13276da314dSPeter De Schrijver 	[ 9] = 48000000,
133c4947e36SThierry Reding 	[12] = 26000000,
13476da314dSPeter De Schrijver };
13576da314dSPeter De Schrijver 
13676da314dSPeter De Schrijver static struct div_nmp pllxc_nmp = {
13776da314dSPeter De Schrijver 	.divm_shift = 0,
13876da314dSPeter De Schrijver 	.divm_width = 8,
13976da314dSPeter De Schrijver 	.divn_shift = 8,
14076da314dSPeter De Schrijver 	.divn_width = 8,
14176da314dSPeter De Schrijver 	.divp_shift = 20,
14276da314dSPeter De Schrijver 	.divp_width = 4,
14376da314dSPeter De Schrijver };
14476da314dSPeter De Schrijver 
145385f9adfSThierry Reding static const struct pdiv_map pllxc_p[] = {
14676da314dSPeter De Schrijver 	{ .pdiv =  1, .hw_val =  0 },
14776da314dSPeter De Schrijver 	{ .pdiv =  2, .hw_val =  1 },
14876da314dSPeter De Schrijver 	{ .pdiv =  3, .hw_val =  2 },
14976da314dSPeter De Schrijver 	{ .pdiv =  4, .hw_val =  3 },
15076da314dSPeter De Schrijver 	{ .pdiv =  5, .hw_val =  4 },
15176da314dSPeter De Schrijver 	{ .pdiv =  6, .hw_val =  5 },
15276da314dSPeter De Schrijver 	{ .pdiv =  8, .hw_val =  6 },
15376da314dSPeter De Schrijver 	{ .pdiv = 10, .hw_val =  7 },
15476da314dSPeter De Schrijver 	{ .pdiv = 12, .hw_val =  8 },
15576da314dSPeter De Schrijver 	{ .pdiv = 16, .hw_val =  9 },
15676da314dSPeter De Schrijver 	{ .pdiv = 12, .hw_val = 10 },
15776da314dSPeter De Schrijver 	{ .pdiv = 16, .hw_val = 11 },
15876da314dSPeter De Schrijver 	{ .pdiv = 20, .hw_val = 12 },
15976da314dSPeter De Schrijver 	{ .pdiv = 24, .hw_val = 13 },
16076da314dSPeter De Schrijver 	{ .pdiv = 32, .hw_val = 14 },
16176da314dSPeter De Schrijver 	{ .pdiv =  0, .hw_val =  0 },
16276da314dSPeter De Schrijver };
16376da314dSPeter De Schrijver 
16476da314dSPeter De Schrijver static struct tegra_clk_pll_freq_table pll_x_freq_table[] = {
16576da314dSPeter De Schrijver 	/* 1 GHz */
16686c679a5SRhyland Klein 	{ 12000000, 1000000000, 83, 1, 1, 0 }, /* actual: 996.0 MHz */
16786c679a5SRhyland Klein 	{ 13000000, 1000000000, 76, 1, 1, 0 }, /* actual: 988.0 MHz */
16886c679a5SRhyland Klein 	{ 16800000, 1000000000, 59, 1, 1, 0 }, /* actual: 991.2 MHz */
16986c679a5SRhyland Klein 	{ 19200000, 1000000000, 52, 1, 1, 0 }, /* actual: 998.4 MHz */
17086c679a5SRhyland Klein 	{ 26000000, 1000000000, 76, 2, 1, 0 }, /* actual: 988.0 MHz */
17176da314dSPeter De Schrijver 	{        0,          0,  0, 0, 0, 0 },
17276da314dSPeter De Schrijver };
17376da314dSPeter De Schrijver 
17476da314dSPeter De Schrijver static struct tegra_clk_pll_params pll_x_params = {
17576da314dSPeter De Schrijver 	.input_min = 12000000,
17676da314dSPeter De Schrijver 	.input_max = 800000000,
17776da314dSPeter De Schrijver 	.cf_min = 12000000,
17876da314dSPeter De Schrijver 	.cf_max = 19200000,	/* s/w policy, h/w capability 50 MHz */
17976da314dSPeter De Schrijver 	.vco_min = 700000000,
18076da314dSPeter De Schrijver 	.vco_max = 3000000000UL,
18176da314dSPeter De Schrijver 	.base_reg = PLLX_BASE,
18276da314dSPeter De Schrijver 	.misc_reg = PLLX_MISC,
18376da314dSPeter De Schrijver 	.lock_mask = PLL_BASE_LOCK,
18476da314dSPeter De Schrijver 	.lock_enable_bit_idx = PLL_MISC_LOCK_ENABLE,
18576da314dSPeter De Schrijver 	.lock_delay = 300,
18676da314dSPeter De Schrijver 	.iddq_reg = PLLX_MISC3,
18776da314dSPeter De Schrijver 	.iddq_bit_idx = 3,
18876da314dSPeter De Schrijver 	.max_p = 6,
18976da314dSPeter De Schrijver 	.dyn_ramp_reg = PLLX_MISC2,
19076da314dSPeter De Schrijver 	.stepa_shift = 16,
19176da314dSPeter De Schrijver 	.stepb_shift = 24,
19276da314dSPeter De Schrijver 	.pdiv_tohw = pllxc_p,
19376da314dSPeter De Schrijver 	.div_nmp = &pllxc_nmp,
19476da314dSPeter De Schrijver 	.freq_table = pll_x_freq_table,
1953706b436SRhyland Klein 	.flags = TEGRA_PLL_USE_LOCK | TEGRA_PLL_HAS_LOCK_ENABLE,
19676da314dSPeter De Schrijver };
19776da314dSPeter De Schrijver 
19876da314dSPeter De Schrijver static struct tegra_clk_pll_freq_table pll_c_freq_table[] = {
1998d99704fSThierry Reding 	{ 12000000, 624000000, 104, 1, 2, 0 },
2008d99704fSThierry Reding 	{ 12000000, 600000000, 100, 1, 2, 0 },
2018d99704fSThierry Reding 	{ 13000000, 600000000,  92, 1, 2, 0 }, /* actual: 598.0 MHz */
2028d99704fSThierry Reding 	{ 16800000, 600000000,  71, 1, 2, 0 }, /* actual: 596.4 MHz */
2038d99704fSThierry Reding 	{ 19200000, 600000000,  62, 1, 2, 0 }, /* actual: 595.2 MHz */
2048d99704fSThierry Reding 	{ 26000000, 600000000,  92, 2, 2, 0 }, /* actual: 598.0 MHz */
20576da314dSPeter De Schrijver 	{        0,         0,   0, 0, 0, 0 },
20676da314dSPeter De Schrijver };
20776da314dSPeter De Schrijver 
20876da314dSPeter De Schrijver static struct tegra_clk_pll_params pll_c_params = {
20976da314dSPeter De Schrijver 	.input_min = 12000000,
21076da314dSPeter De Schrijver 	.input_max = 800000000,
21176da314dSPeter De Schrijver 	.cf_min = 12000000,
21276da314dSPeter De Schrijver 	.cf_max = 19200000, /* s/w policy, h/w capability 50 MHz */
21376da314dSPeter De Schrijver 	.vco_min = 600000000,
21476da314dSPeter De Schrijver 	.vco_max = 1400000000,
21576da314dSPeter De Schrijver 	.base_reg = PLLC_BASE,
21676da314dSPeter De Schrijver 	.misc_reg = PLLC_MISC,
21776da314dSPeter De Schrijver 	.lock_mask = PLL_BASE_LOCK,
21876da314dSPeter De Schrijver 	.lock_enable_bit_idx = PLLC_MISC_LOCK_ENABLE,
21976da314dSPeter De Schrijver 	.lock_delay = 300,
22076da314dSPeter De Schrijver 	.iddq_reg = PLLC_MISC,
22176da314dSPeter De Schrijver 	.iddq_bit_idx = PLLC_IDDQ_BIT,
22276da314dSPeter De Schrijver 	.max_p = PLLXC_SW_MAX_P,
22376da314dSPeter De Schrijver 	.dyn_ramp_reg = PLLC_MISC2,
22476da314dSPeter De Schrijver 	.stepa_shift = 17,
22576da314dSPeter De Schrijver 	.stepb_shift = 9,
22676da314dSPeter De Schrijver 	.pdiv_tohw = pllxc_p,
22776da314dSPeter De Schrijver 	.div_nmp = &pllxc_nmp,
22876da314dSPeter De Schrijver 	.freq_table = pll_c_freq_table,
2293706b436SRhyland Klein 	.flags = TEGRA_PLL_USE_LOCK | TEGRA_PLL_HAS_LOCK_ENABLE,
23076da314dSPeter De Schrijver };
23176da314dSPeter De Schrijver 
23276da314dSPeter De Schrijver static struct div_nmp pllcx_nmp = {
23376da314dSPeter De Schrijver 	.divm_shift = 0,
23476da314dSPeter De Schrijver 	.divm_width = 2,
23576da314dSPeter De Schrijver 	.divn_shift = 8,
23676da314dSPeter De Schrijver 	.divn_width = 8,
23776da314dSPeter De Schrijver 	.divp_shift = 20,
23876da314dSPeter De Schrijver 	.divp_width = 3,
23976da314dSPeter De Schrijver };
24076da314dSPeter De Schrijver 
241385f9adfSThierry Reding static const struct pdiv_map pllc_p[] = {
24276da314dSPeter De Schrijver 	{ .pdiv =  1, .hw_val = 0 },
24376da314dSPeter De Schrijver 	{ .pdiv =  2, .hw_val = 1 },
24476da314dSPeter De Schrijver 	{ .pdiv =  3, .hw_val = 2 },
24576da314dSPeter De Schrijver 	{ .pdiv =  4, .hw_val = 3 },
24676da314dSPeter De Schrijver 	{ .pdiv =  6, .hw_val = 4 },
24776da314dSPeter De Schrijver 	{ .pdiv =  8, .hw_val = 5 },
24876da314dSPeter De Schrijver 	{ .pdiv = 12, .hw_val = 6 },
24976da314dSPeter De Schrijver 	{ .pdiv = 16, .hw_val = 7 },
25076da314dSPeter De Schrijver 	{ .pdiv =  0, .hw_val = 0 },
25176da314dSPeter De Schrijver };
25276da314dSPeter De Schrijver 
25376da314dSPeter De Schrijver static struct tegra_clk_pll_freq_table pll_cx_freq_table[] = {
2548d99704fSThierry Reding 	{ 12000000, 600000000, 100, 1, 2, 0 },
2558d99704fSThierry Reding 	{ 13000000, 600000000,  92, 1, 2, 0 }, /* actual: 598.0 MHz */
2568d99704fSThierry Reding 	{ 16800000, 600000000,  71, 1, 2, 0 }, /* actual: 596.4 MHz */
2578d99704fSThierry Reding 	{ 19200000, 600000000,  62, 1, 2, 0 }, /* actual: 595.2 MHz */
2588d99704fSThierry Reding 	{ 26000000, 600000000,  92, 2, 2, 0 }, /* actual: 598.0 MHz */
25976da314dSPeter De Schrijver 	{        0,         0,   0, 0, 0, 0 },
26076da314dSPeter De Schrijver };
26176da314dSPeter De Schrijver 
26276da314dSPeter De Schrijver static struct tegra_clk_pll_params pll_c2_params = {
26376da314dSPeter De Schrijver 	.input_min = 12000000,
26476da314dSPeter De Schrijver 	.input_max = 48000000,
26576da314dSPeter De Schrijver 	.cf_min = 12000000,
26676da314dSPeter De Schrijver 	.cf_max = 19200000,
26776da314dSPeter De Schrijver 	.vco_min = 600000000,
26876da314dSPeter De Schrijver 	.vco_max = 1200000000,
26976da314dSPeter De Schrijver 	.base_reg = PLLC2_BASE,
27076da314dSPeter De Schrijver 	.misc_reg = PLLC2_MISC,
27176da314dSPeter De Schrijver 	.lock_mask = PLL_BASE_LOCK,
27276da314dSPeter De Schrijver 	.lock_enable_bit_idx = PLL_MISC_LOCK_ENABLE,
27376da314dSPeter De Schrijver 	.lock_delay = 300,
27476da314dSPeter De Schrijver 	.pdiv_tohw = pllc_p,
27576da314dSPeter De Schrijver 	.div_nmp = &pllcx_nmp,
27676da314dSPeter De Schrijver 	.max_p = 7,
27776da314dSPeter De Schrijver 	.ext_misc_reg[0] = 0x4f0,
27876da314dSPeter De Schrijver 	.ext_misc_reg[1] = 0x4f4,
27976da314dSPeter De Schrijver 	.ext_misc_reg[2] = 0x4f8,
28076da314dSPeter De Schrijver 	.freq_table = pll_cx_freq_table,
28176da314dSPeter De Schrijver 	.flags = TEGRA_PLL_USE_LOCK,
28276da314dSPeter De Schrijver };
28376da314dSPeter De Schrijver 
28476da314dSPeter De Schrijver static struct tegra_clk_pll_params pll_c3_params = {
28576da314dSPeter De Schrijver 	.input_min = 12000000,
28676da314dSPeter De Schrijver 	.input_max = 48000000,
28776da314dSPeter De Schrijver 	.cf_min = 12000000,
28876da314dSPeter De Schrijver 	.cf_max = 19200000,
28976da314dSPeter De Schrijver 	.vco_min = 600000000,
29076da314dSPeter De Schrijver 	.vco_max = 1200000000,
29176da314dSPeter De Schrijver 	.base_reg = PLLC3_BASE,
29276da314dSPeter De Schrijver 	.misc_reg = PLLC3_MISC,
29376da314dSPeter De Schrijver 	.lock_mask = PLL_BASE_LOCK,
29476da314dSPeter De Schrijver 	.lock_enable_bit_idx = PLL_MISC_LOCK_ENABLE,
29576da314dSPeter De Schrijver 	.lock_delay = 300,
29676da314dSPeter De Schrijver 	.pdiv_tohw = pllc_p,
29776da314dSPeter De Schrijver 	.div_nmp = &pllcx_nmp,
29876da314dSPeter De Schrijver 	.max_p = 7,
29976da314dSPeter De Schrijver 	.ext_misc_reg[0] = 0x504,
30076da314dSPeter De Schrijver 	.ext_misc_reg[1] = 0x508,
30176da314dSPeter De Schrijver 	.ext_misc_reg[2] = 0x50c,
30276da314dSPeter De Schrijver 	.freq_table = pll_cx_freq_table,
30376da314dSPeter De Schrijver 	.flags = TEGRA_PLL_USE_LOCK,
30476da314dSPeter De Schrijver };
30576da314dSPeter De Schrijver 
30676da314dSPeter De Schrijver static struct div_nmp pllss_nmp = {
30776da314dSPeter De Schrijver 	.divm_shift = 0,
30876da314dSPeter De Schrijver 	.divm_width = 8,
30976da314dSPeter De Schrijver 	.divn_shift = 8,
31076da314dSPeter De Schrijver 	.divn_width = 8,
31176da314dSPeter De Schrijver 	.divp_shift = 20,
31276da314dSPeter De Schrijver 	.divp_width = 4,
31376da314dSPeter De Schrijver };
31476da314dSPeter De Schrijver 
315385f9adfSThierry Reding static const struct pdiv_map pll12g_ssd_esd_p[] = {
31676da314dSPeter De Schrijver 	{ .pdiv =  1, .hw_val =  0 },
31776da314dSPeter De Schrijver 	{ .pdiv =  2, .hw_val =  1 },
31876da314dSPeter De Schrijver 	{ .pdiv =  3, .hw_val =  2 },
31976da314dSPeter De Schrijver 	{ .pdiv =  4, .hw_val =  3 },
32076da314dSPeter De Schrijver 	{ .pdiv =  5, .hw_val =  4 },
32176da314dSPeter De Schrijver 	{ .pdiv =  6, .hw_val =  5 },
32276da314dSPeter De Schrijver 	{ .pdiv =  8, .hw_val =  6 },
32376da314dSPeter De Schrijver 	{ .pdiv = 10, .hw_val =  7 },
32476da314dSPeter De Schrijver 	{ .pdiv = 12, .hw_val =  8 },
32576da314dSPeter De Schrijver 	{ .pdiv = 16, .hw_val =  9 },
32676da314dSPeter De Schrijver 	{ .pdiv = 12, .hw_val = 10 },
32776da314dSPeter De Schrijver 	{ .pdiv = 16, .hw_val = 11 },
32876da314dSPeter De Schrijver 	{ .pdiv = 20, .hw_val = 12 },
32976da314dSPeter De Schrijver 	{ .pdiv = 24, .hw_val = 13 },
33076da314dSPeter De Schrijver 	{ .pdiv = 32, .hw_val = 14 },
33176da314dSPeter De Schrijver 	{ .pdiv =  0, .hw_val =  0 },
33276da314dSPeter De Schrijver };
33376da314dSPeter De Schrijver 
33476da314dSPeter De Schrijver static struct tegra_clk_pll_freq_table pll_c4_freq_table[] = {
33586c679a5SRhyland Klein 	{ 12000000, 600000000, 100, 1, 2, 0 },
33686c679a5SRhyland Klein 	{ 13000000, 600000000,  92, 1, 2, 0 }, /* actual: 598.0 MHz */
33786c679a5SRhyland Klein 	{ 16800000, 600000000,  71, 1, 2, 0 }, /* actual: 596.4 MHz */
33886c679a5SRhyland Klein 	{ 19200000, 600000000,  62, 1, 2, 0 }, /* actual: 595.2 MHz */
33986c679a5SRhyland Klein 	{ 26000000, 600000000,  92, 2, 2, 0 }, /* actual: 598.0 MHz */
34076da314dSPeter De Schrijver 	{        0,         0,   0, 0, 0, 0 },
34176da314dSPeter De Schrijver };
34276da314dSPeter De Schrijver 
34376da314dSPeter De Schrijver static struct tegra_clk_pll_params pll_c4_params = {
34476da314dSPeter De Schrijver 	.input_min = 12000000,
34576da314dSPeter De Schrijver 	.input_max = 1000000000,
34676da314dSPeter De Schrijver 	.cf_min = 12000000,
34776da314dSPeter De Schrijver 	.cf_max = 19200000, /* s/w policy, h/w capability 38 MHz */
34876da314dSPeter De Schrijver 	.vco_min = 600000000,
34976da314dSPeter De Schrijver 	.vco_max = 1200000000,
35076da314dSPeter De Schrijver 	.base_reg = PLLC4_BASE,
35176da314dSPeter De Schrijver 	.misc_reg = PLLC4_MISC,
35276da314dSPeter De Schrijver 	.lock_mask = PLL_BASE_LOCK,
35376da314dSPeter De Schrijver 	.lock_enable_bit_idx = PLLSS_MISC_LOCK_ENABLE,
35476da314dSPeter De Schrijver 	.lock_delay = 300,
35576da314dSPeter De Schrijver 	.iddq_reg = PLLC4_BASE,
35676da314dSPeter De Schrijver 	.iddq_bit_idx = PLLSS_IDDQ_BIT,
35776da314dSPeter De Schrijver 	.pdiv_tohw = pll12g_ssd_esd_p,
35876da314dSPeter De Schrijver 	.div_nmp = &pllss_nmp,
35976da314dSPeter De Schrijver 	.ext_misc_reg[0] = 0x5ac,
36076da314dSPeter De Schrijver 	.ext_misc_reg[1] = 0x5b0,
36176da314dSPeter De Schrijver 	.ext_misc_reg[2] = 0x5b4,
36276da314dSPeter De Schrijver 	.freq_table = pll_c4_freq_table,
3633706b436SRhyland Klein 	.flags = TEGRA_PLL_USE_LOCK | TEGRA_PLL_HAS_LOCK_ENABLE,
36476da314dSPeter De Schrijver };
36576da314dSPeter De Schrijver 
366385f9adfSThierry Reding static const struct pdiv_map pllm_p[] = {
36776da314dSPeter De Schrijver 	{ .pdiv =  1, .hw_val =  0 },
36876da314dSPeter De Schrijver 	{ .pdiv =  2, .hw_val =  1 },
36986c679a5SRhyland Klein 	{ .pdiv =  3, .hw_val =  2 },
37086c679a5SRhyland Klein 	{ .pdiv =  4, .hw_val =  3 },
37186c679a5SRhyland Klein 	{ .pdiv =  5, .hw_val =  4 },
37286c679a5SRhyland Klein 	{ .pdiv =  6, .hw_val =  5 },
37386c679a5SRhyland Klein 	{ .pdiv =  8, .hw_val =  6 },
37486c679a5SRhyland Klein 	{ .pdiv = 10, .hw_val =  7 },
37586c679a5SRhyland Klein 	{ .pdiv = 12, .hw_val =  8 },
37686c679a5SRhyland Klein 	{ .pdiv = 16, .hw_val =  9 },
37786c679a5SRhyland Klein 	{ .pdiv = 12, .hw_val = 10 },
37886c679a5SRhyland Klein 	{ .pdiv = 16, .hw_val = 11 },
37986c679a5SRhyland Klein 	{ .pdiv = 20, .hw_val = 12 },
38086c679a5SRhyland Klein 	{ .pdiv = 24, .hw_val = 13 },
38186c679a5SRhyland Klein 	{ .pdiv = 32, .hw_val = 14 },
38276da314dSPeter De Schrijver 	{ .pdiv =  0, .hw_val =  0 },
38376da314dSPeter De Schrijver };
38476da314dSPeter De Schrijver 
38576da314dSPeter De Schrijver static struct tegra_clk_pll_freq_table pll_m_freq_table[] = {
3868d99704fSThierry Reding 	{ 12000000, 800000000, 66, 1, 1, 0 }, /* actual: 792.0 MHz */
3878d99704fSThierry Reding 	{ 13000000, 800000000, 61, 1, 1, 0 }, /* actual: 793.0 MHz */
3888d99704fSThierry Reding 	{ 16800000, 800000000, 47, 1, 1, 0 }, /* actual: 789.6 MHz */
3898d99704fSThierry Reding 	{ 19200000, 800000000, 41, 1, 1, 0 }, /* actual: 787.2 MHz */
3908d99704fSThierry Reding 	{ 26000000, 800000000, 61, 2, 1, 0 }, /* actual: 793.0 MHz */
39176da314dSPeter De Schrijver 	{        0,         0,  0, 0, 0, 0},
39276da314dSPeter De Schrijver };
39376da314dSPeter De Schrijver 
39476da314dSPeter De Schrijver static struct div_nmp pllm_nmp = {
39576da314dSPeter De Schrijver 	.divm_shift = 0,
39676da314dSPeter De Schrijver 	.divm_width = 8,
39776da314dSPeter De Schrijver 	.override_divm_shift = 0,
39876da314dSPeter De Schrijver 	.divn_shift = 8,
39976da314dSPeter De Schrijver 	.divn_width = 8,
40076da314dSPeter De Schrijver 	.override_divn_shift = 8,
40176da314dSPeter De Schrijver 	.divp_shift = 20,
40276da314dSPeter De Schrijver 	.divp_width = 1,
40376da314dSPeter De Schrijver 	.override_divp_shift = 27,
40476da314dSPeter De Schrijver };
40576da314dSPeter De Schrijver 
40676da314dSPeter De Schrijver static struct tegra_clk_pll_params pll_m_params = {
40776da314dSPeter De Schrijver 	.input_min = 12000000,
40876da314dSPeter De Schrijver 	.input_max = 500000000,
40976da314dSPeter De Schrijver 	.cf_min = 12000000,
41076da314dSPeter De Schrijver 	.cf_max = 19200000,	/* s/w policy, h/w capability 50 MHz */
41176da314dSPeter De Schrijver 	.vco_min = 400000000,
41276da314dSPeter De Schrijver 	.vco_max = 1066000000,
41376da314dSPeter De Schrijver 	.base_reg = PLLM_BASE,
41476da314dSPeter De Schrijver 	.misc_reg = PLLM_MISC,
41576da314dSPeter De Schrijver 	.lock_mask = PLL_BASE_LOCK,
41676da314dSPeter De Schrijver 	.lock_enable_bit_idx = PLL_MISC_LOCK_ENABLE,
41776da314dSPeter De Schrijver 	.lock_delay = 300,
41886c679a5SRhyland Klein 	.max_p = 5,
41976da314dSPeter De Schrijver 	.pdiv_tohw = pllm_p,
42076da314dSPeter De Schrijver 	.div_nmp = &pllm_nmp,
42176da314dSPeter De Schrijver 	.pmc_divnm_reg = PMC_PLLM_WB0_OVERRIDE,
42276da314dSPeter De Schrijver 	.pmc_divp_reg = PMC_PLLM_WB0_OVERRIDE_2,
42376da314dSPeter De Schrijver 	.freq_table = pll_m_freq_table,
4243706b436SRhyland Klein 	.flags = TEGRA_PLL_USE_LOCK | TEGRA_PLL_HAS_LOCK_ENABLE,
42576da314dSPeter De Schrijver };
42676da314dSPeter De Schrijver 
42776da314dSPeter De Schrijver static struct tegra_clk_pll_freq_table pll_e_freq_table[] = {
42876da314dSPeter De Schrijver 	/* PLLE special case: use cpcon field to store cml divider value */
42976da314dSPeter De Schrijver 	{ 336000000, 100000000, 100, 21, 16, 11 },
43076da314dSPeter De Schrijver 	{ 312000000, 100000000, 200, 26, 24, 13 },
43176da314dSPeter De Schrijver 	{  13000000, 100000000, 200,  1, 26, 13 },
43276da314dSPeter De Schrijver 	{  12000000, 100000000, 200,  1, 24, 13 },
43376da314dSPeter De Schrijver 	{         0,         0,   0,  0,  0,  0 },
43476da314dSPeter De Schrijver };
43576da314dSPeter De Schrijver 
43686c679a5SRhyland Klein static const struct pdiv_map plle_p[] = {
43786c679a5SRhyland Klein 	{ .pdiv =  1, .hw_val =  0 },
43886c679a5SRhyland Klein 	{ .pdiv =  2, .hw_val =  1 },
43986c679a5SRhyland Klein 	{ .pdiv =  3, .hw_val =  2 },
44086c679a5SRhyland Klein 	{ .pdiv =  4, .hw_val =  3 },
44186c679a5SRhyland Klein 	{ .pdiv =  5, .hw_val =  4 },
44286c679a5SRhyland Klein 	{ .pdiv =  6, .hw_val =  5 },
44386c679a5SRhyland Klein 	{ .pdiv =  8, .hw_val =  6 },
44486c679a5SRhyland Klein 	{ .pdiv = 10, .hw_val =  7 },
44586c679a5SRhyland Klein 	{ .pdiv = 12, .hw_val =  8 },
44686c679a5SRhyland Klein 	{ .pdiv = 16, .hw_val =  9 },
44786c679a5SRhyland Klein 	{ .pdiv = 12, .hw_val = 10 },
44886c679a5SRhyland Klein 	{ .pdiv = 16, .hw_val = 11 },
44986c679a5SRhyland Klein 	{ .pdiv = 20, .hw_val = 12 },
45086c679a5SRhyland Klein 	{ .pdiv = 24, .hw_val = 13 },
45186c679a5SRhyland Klein 	{ .pdiv = 32, .hw_val = 14 },
45286c679a5SRhyland Klein 	{ .pdiv =  1, .hw_val =  0 },
45386c679a5SRhyland Klein };
45486c679a5SRhyland Klein 
45576da314dSPeter De Schrijver static struct div_nmp plle_nmp = {
45676da314dSPeter De Schrijver 	.divm_shift = 0,
45776da314dSPeter De Schrijver 	.divm_width = 8,
45876da314dSPeter De Schrijver 	.divn_shift = 8,
45976da314dSPeter De Schrijver 	.divn_width = 8,
46076da314dSPeter De Schrijver 	.divp_shift = 24,
46176da314dSPeter De Schrijver 	.divp_width = 4,
46276da314dSPeter De Schrijver };
46376da314dSPeter De Schrijver 
46476da314dSPeter De Schrijver static struct tegra_clk_pll_params pll_e_params = {
46576da314dSPeter De Schrijver 	.input_min = 12000000,
46676da314dSPeter De Schrijver 	.input_max = 1000000000,
46776da314dSPeter De Schrijver 	.cf_min = 12000000,
46876da314dSPeter De Schrijver 	.cf_max = 75000000,
46976da314dSPeter De Schrijver 	.vco_min = 1600000000,
47076da314dSPeter De Schrijver 	.vco_max = 2400000000U,
47176da314dSPeter De Schrijver 	.base_reg = PLLE_BASE,
47276da314dSPeter De Schrijver 	.misc_reg = PLLE_MISC,
47376da314dSPeter De Schrijver 	.aux_reg = PLLE_AUX,
47476da314dSPeter De Schrijver 	.lock_mask = PLLE_MISC_LOCK,
47576da314dSPeter De Schrijver 	.lock_enable_bit_idx = PLLE_MISC_LOCK_ENABLE,
47676da314dSPeter De Schrijver 	.lock_delay = 300,
47786c679a5SRhyland Klein 	.pdiv_tohw = plle_p,
47876da314dSPeter De Schrijver 	.div_nmp = &plle_nmp,
47976da314dSPeter De Schrijver 	.freq_table = pll_e_freq_table,
4803706b436SRhyland Klein 	.flags = TEGRA_PLL_FIXED | TEGRA_PLL_HAS_LOCK_ENABLE,
48176da314dSPeter De Schrijver 	.fixed_rate = 100000000,
48276da314dSPeter De Schrijver };
48376da314dSPeter De Schrijver 
48476da314dSPeter De Schrijver static const struct clk_div_table pll_re_div_table[] = {
48576da314dSPeter De Schrijver 	{ .val = 0, .div = 1 },
48676da314dSPeter De Schrijver 	{ .val = 1, .div = 2 },
48776da314dSPeter De Schrijver 	{ .val = 2, .div = 3 },
48876da314dSPeter De Schrijver 	{ .val = 3, .div = 4 },
48976da314dSPeter De Schrijver 	{ .val = 4, .div = 5 },
49076da314dSPeter De Schrijver 	{ .val = 5, .div = 6 },
49176da314dSPeter De Schrijver 	{ .val = 0, .div = 0 },
49276da314dSPeter De Schrijver };
49376da314dSPeter De Schrijver 
49476da314dSPeter De Schrijver static struct div_nmp pllre_nmp = {
49576da314dSPeter De Schrijver 	.divm_shift = 0,
49676da314dSPeter De Schrijver 	.divm_width = 8,
49776da314dSPeter De Schrijver 	.divn_shift = 8,
49876da314dSPeter De Schrijver 	.divn_width = 8,
49976da314dSPeter De Schrijver 	.divp_shift = 16,
50076da314dSPeter De Schrijver 	.divp_width = 4,
50176da314dSPeter De Schrijver };
50276da314dSPeter De Schrijver 
50376da314dSPeter De Schrijver static struct tegra_clk_pll_params pll_re_vco_params = {
50476da314dSPeter De Schrijver 	.input_min = 12000000,
50576da314dSPeter De Schrijver 	.input_max = 1000000000,
50676da314dSPeter De Schrijver 	.cf_min = 12000000,
50776da314dSPeter De Schrijver 	.cf_max = 19200000, /* s/w policy, h/w capability 38 MHz */
50876da314dSPeter De Schrijver 	.vco_min = 300000000,
50976da314dSPeter De Schrijver 	.vco_max = 600000000,
51076da314dSPeter De Schrijver 	.base_reg = PLLRE_BASE,
51176da314dSPeter De Schrijver 	.misc_reg = PLLRE_MISC,
51276da314dSPeter De Schrijver 	.lock_mask = PLLRE_MISC_LOCK,
51376da314dSPeter De Schrijver 	.lock_enable_bit_idx = PLLRE_MISC_LOCK_ENABLE,
51476da314dSPeter De Schrijver 	.lock_delay = 300,
51576da314dSPeter De Schrijver 	.iddq_reg = PLLRE_MISC,
51676da314dSPeter De Schrijver 	.iddq_bit_idx = PLLRE_IDDQ_BIT,
51776da314dSPeter De Schrijver 	.div_nmp = &pllre_nmp,
5183706b436SRhyland Klein 	.flags = TEGRA_PLL_USE_LOCK | TEGRA_PLL_HAS_LOCK_ENABLE |
5193706b436SRhyland Klein 		 TEGRA_PLL_LOCK_MISC,
52076da314dSPeter De Schrijver };
52176da314dSPeter De Schrijver 
52276da314dSPeter De Schrijver static struct div_nmp pllp_nmp = {
52376da314dSPeter De Schrijver 	.divm_shift = 0,
52476da314dSPeter De Schrijver 	.divm_width = 5,
52576da314dSPeter De Schrijver 	.divn_shift = 8,
52676da314dSPeter De Schrijver 	.divn_width = 10,
52776da314dSPeter De Schrijver 	.divp_shift = 20,
52876da314dSPeter De Schrijver 	.divp_width = 3,
52976da314dSPeter De Schrijver };
53076da314dSPeter De Schrijver 
53176da314dSPeter De Schrijver static struct tegra_clk_pll_freq_table pll_p_freq_table[] = {
53286c679a5SRhyland Klein 	{ 12000000, 408000000, 408, 12, 1, 8 },
53386c679a5SRhyland Klein 	{ 13000000, 408000000, 408, 13, 1, 8 },
53486c679a5SRhyland Klein 	{ 16800000, 408000000, 340, 14, 1, 8 },
53586c679a5SRhyland Klein 	{ 19200000, 408000000, 340, 16, 1, 8 },
53686c679a5SRhyland Klein 	{ 26000000, 408000000, 408, 26, 1, 8 },
53776da314dSPeter De Schrijver 	{        0,         0,   0,  0, 0, 0 },
53876da314dSPeter De Schrijver };
53976da314dSPeter De Schrijver 
54076da314dSPeter De Schrijver static struct tegra_clk_pll_params pll_p_params = {
54176da314dSPeter De Schrijver 	.input_min = 2000000,
54276da314dSPeter De Schrijver 	.input_max = 31000000,
54376da314dSPeter De Schrijver 	.cf_min = 1000000,
54476da314dSPeter De Schrijver 	.cf_max = 6000000,
54576da314dSPeter De Schrijver 	.vco_min = 200000000,
54676da314dSPeter De Schrijver 	.vco_max = 700000000,
54776da314dSPeter De Schrijver 	.base_reg = PLLP_BASE,
54876da314dSPeter De Schrijver 	.misc_reg = PLLP_MISC,
54976da314dSPeter De Schrijver 	.lock_mask = PLL_BASE_LOCK,
55076da314dSPeter De Schrijver 	.lock_enable_bit_idx = PLL_MISC_LOCK_ENABLE,
55176da314dSPeter De Schrijver 	.lock_delay = 300,
55276da314dSPeter De Schrijver 	.div_nmp = &pllp_nmp,
55376da314dSPeter De Schrijver 	.freq_table = pll_p_freq_table,
55476da314dSPeter De Schrijver 	.fixed_rate = 408000000,
5553706b436SRhyland Klein 	.flags = TEGRA_PLL_FIXED | TEGRA_PLL_USE_LOCK |
5563706b436SRhyland Klein 		 TEGRA_PLL_HAS_LOCK_ENABLE,
55776da314dSPeter De Schrijver };
55876da314dSPeter De Schrijver 
55976da314dSPeter De Schrijver static struct tegra_clk_pll_freq_table pll_a_freq_table[] = {
56086c679a5SRhyland Klein 	{  9600000, 282240000, 147,  5, 1, 4 },
56186c679a5SRhyland Klein 	{  9600000, 368640000, 192,  5, 1, 4 },
56286c679a5SRhyland Klein 	{  9600000, 240000000, 200,  8, 1, 8 },
56386c679a5SRhyland Klein 	{ 28800000, 282240000, 245, 25, 1, 8 },
56486c679a5SRhyland Klein 	{ 28800000, 368640000, 320, 25, 1, 8 },
56586c679a5SRhyland Klein 	{ 28800000, 240000000, 200, 24, 1, 8 },
56676da314dSPeter De Schrijver 	{        0,         0,   0,  0, 0, 0 },
56776da314dSPeter De Schrijver };
56876da314dSPeter De Schrijver 
56976da314dSPeter De Schrijver static struct tegra_clk_pll_params pll_a_params = {
57076da314dSPeter De Schrijver 	.input_min = 2000000,
57176da314dSPeter De Schrijver 	.input_max = 31000000,
57276da314dSPeter De Schrijver 	.cf_min = 1000000,
57376da314dSPeter De Schrijver 	.cf_max = 6000000,
57476da314dSPeter De Schrijver 	.vco_min = 200000000,
57576da314dSPeter De Schrijver 	.vco_max = 700000000,
57676da314dSPeter De Schrijver 	.base_reg = PLLA_BASE,
57776da314dSPeter De Schrijver 	.misc_reg = PLLA_MISC,
57876da314dSPeter De Schrijver 	.lock_mask = PLL_BASE_LOCK,
57976da314dSPeter De Schrijver 	.lock_enable_bit_idx = PLL_MISC_LOCK_ENABLE,
58076da314dSPeter De Schrijver 	.lock_delay = 300,
58176da314dSPeter De Schrijver 	.div_nmp = &pllp_nmp,
58276da314dSPeter De Schrijver 	.freq_table = pll_a_freq_table,
5833706b436SRhyland Klein 	.flags = TEGRA_PLL_HAS_CPCON | TEGRA_PLL_USE_LOCK |
5843706b436SRhyland Klein 		 TEGRA_PLL_HAS_LOCK_ENABLE,
58576da314dSPeter De Schrijver };
58676da314dSPeter De Schrijver 
58767fc26bfSRhyland Klein static struct div_nmp plld_nmp = {
58867fc26bfSRhyland Klein 	.divm_shift = 0,
58967fc26bfSRhyland Klein 	.divm_width = 5,
59067fc26bfSRhyland Klein 	.divn_shift = 8,
59167fc26bfSRhyland Klein 	.divn_width = 11,
59267fc26bfSRhyland Klein 	.divp_shift = 20,
59367fc26bfSRhyland Klein 	.divp_width = 3,
59467fc26bfSRhyland Klein };
59567fc26bfSRhyland Klein 
59676da314dSPeter De Schrijver static struct tegra_clk_pll_freq_table pll_d_freq_table[] = {
59776da314dSPeter De Schrijver 	{ 12000000,  216000000,  864, 12, 4, 12 },
59876da314dSPeter De Schrijver 	{ 13000000,  216000000,  864, 13, 4, 12 },
59976da314dSPeter De Schrijver 	{ 16800000,  216000000,  720, 14, 4, 12 },
60076da314dSPeter De Schrijver 	{ 19200000,  216000000,  720, 16, 4, 12 },
60176da314dSPeter De Schrijver 	{ 26000000,  216000000,  864, 26, 4, 12 },
60276da314dSPeter De Schrijver 	{ 12000000,  594000000,  594, 12, 1, 12 },
60376da314dSPeter De Schrijver 	{ 13000000,  594000000,  594, 13, 1, 12 },
60476da314dSPeter De Schrijver 	{ 16800000,  594000000,  495, 14, 1, 12 },
60576da314dSPeter De Schrijver 	{ 19200000,  594000000,  495, 16, 1, 12 },
60676da314dSPeter De Schrijver 	{ 26000000,  594000000,  594, 26, 1, 12 },
60776da314dSPeter De Schrijver 	{ 12000000, 1000000000, 1000, 12, 1, 12 },
60876da314dSPeter De Schrijver 	{ 13000000, 1000000000, 1000, 13, 1, 12 },
60976da314dSPeter De Schrijver 	{ 19200000, 1000000000,  625, 12, 1, 12 },
61076da314dSPeter De Schrijver 	{ 26000000, 1000000000, 1000, 26, 1, 12 },
61176da314dSPeter De Schrijver 	{        0,          0,    0,  0, 0,  0 },
61276da314dSPeter De Schrijver };
61376da314dSPeter De Schrijver 
61476da314dSPeter De Schrijver static struct tegra_clk_pll_params pll_d_params = {
61576da314dSPeter De Schrijver 	.input_min = 2000000,
61676da314dSPeter De Schrijver 	.input_max = 40000000,
61776da314dSPeter De Schrijver 	.cf_min = 1000000,
61876da314dSPeter De Schrijver 	.cf_max = 6000000,
61976da314dSPeter De Schrijver 	.vco_min = 500000000,
62076da314dSPeter De Schrijver 	.vco_max = 1000000000,
62176da314dSPeter De Schrijver 	.base_reg = PLLD_BASE,
62276da314dSPeter De Schrijver 	.misc_reg = PLLD_MISC,
62376da314dSPeter De Schrijver 	.lock_mask = PLL_BASE_LOCK,
62476da314dSPeter De Schrijver 	.lock_enable_bit_idx = PLLDU_MISC_LOCK_ENABLE,
62576da314dSPeter De Schrijver 	.lock_delay = 1000,
62667fc26bfSRhyland Klein 	.div_nmp = &plld_nmp,
62776da314dSPeter De Schrijver 	.freq_table = pll_d_freq_table,
62876da314dSPeter De Schrijver 	.flags = TEGRA_PLL_HAS_CPCON | TEGRA_PLL_SET_LFCON |
6293706b436SRhyland Klein 		 TEGRA_PLL_USE_LOCK | TEGRA_PLL_HAS_LOCK_ENABLE,
63076da314dSPeter De Schrijver };
63176da314dSPeter De Schrijver 
63276da314dSPeter De Schrijver static struct tegra_clk_pll_freq_table tegra124_pll_d2_freq_table[] = {
6338d99704fSThierry Reding 	{ 12000000, 594000000, 99, 1, 2, 0 },
6348d99704fSThierry Reding 	{ 13000000, 594000000, 91, 1, 2, 0 }, /* actual: 591.5 MHz */
6358d99704fSThierry Reding 	{ 16800000, 594000000, 71, 1, 2, 0 }, /* actual: 596.4 MHz */
6368d99704fSThierry Reding 	{ 19200000, 594000000, 62, 1, 2, 0 }, /* actual: 595.2 MHz */
6378d99704fSThierry Reding 	{ 26000000, 594000000, 91, 2, 2, 0 }, /* actual: 591.5 MHz */
63876da314dSPeter De Schrijver 	{        0,         0,  0, 0, 0, 0 },
63976da314dSPeter De Schrijver };
64076da314dSPeter De Schrijver 
64176da314dSPeter De Schrijver static struct tegra_clk_pll_params tegra124_pll_d2_params = {
64276da314dSPeter De Schrijver 	.input_min = 12000000,
64376da314dSPeter De Schrijver 	.input_max = 1000000000,
64476da314dSPeter De Schrijver 	.cf_min = 12000000,
64576da314dSPeter De Schrijver 	.cf_max = 19200000, /* s/w policy, h/w capability 38 MHz */
64676da314dSPeter De Schrijver 	.vco_min = 600000000,
64776da314dSPeter De Schrijver 	.vco_max = 1200000000,
64876da314dSPeter De Schrijver 	.base_reg = PLLD2_BASE,
64976da314dSPeter De Schrijver 	.misc_reg = PLLD2_MISC,
65076da314dSPeter De Schrijver 	.lock_mask = PLL_BASE_LOCK,
65176da314dSPeter De Schrijver 	.lock_enable_bit_idx = PLLSS_MISC_LOCK_ENABLE,
65276da314dSPeter De Schrijver 	.lock_delay = 300,
65376da314dSPeter De Schrijver 	.iddq_reg = PLLD2_BASE,
65476da314dSPeter De Schrijver 	.iddq_bit_idx = PLLSS_IDDQ_BIT,
65576da314dSPeter De Schrijver 	.pdiv_tohw = pll12g_ssd_esd_p,
65676da314dSPeter De Schrijver 	.div_nmp = &pllss_nmp,
65776da314dSPeter De Schrijver 	.ext_misc_reg[0] = 0x570,
65876da314dSPeter De Schrijver 	.ext_misc_reg[1] = 0x574,
65976da314dSPeter De Schrijver 	.ext_misc_reg[2] = 0x578,
66076da314dSPeter De Schrijver 	.max_p = 15,
66176da314dSPeter De Schrijver 	.freq_table = tegra124_pll_d2_freq_table,
6623706b436SRhyland Klein 	.flags = TEGRA_PLL_USE_LOCK | TEGRA_PLL_HAS_LOCK_ENABLE,
66376da314dSPeter De Schrijver };
66476da314dSPeter De Schrijver 
66576da314dSPeter De Schrijver static struct tegra_clk_pll_freq_table pll_dp_freq_table[] = {
66686c679a5SRhyland Klein 	{ 12000000, 600000000, 100, 1, 2, 0 },
66786c679a5SRhyland Klein 	{ 13000000, 600000000,  92, 1, 2, 0 }, /* actual: 598.0 MHz */
66886c679a5SRhyland Klein 	{ 16800000, 600000000,  71, 1, 2, 0 }, /* actual: 596.4 MHz */
66986c679a5SRhyland Klein 	{ 19200000, 600000000,  62, 1, 2, 0 }, /* actual: 595.2 MHz */
67086c679a5SRhyland Klein 	{ 26000000, 600000000,  92, 2, 2, 0 }, /* actual: 598.0 MHz */
67176da314dSPeter De Schrijver 	{        0,         0,   0, 0, 0, 0 },
67276da314dSPeter De Schrijver };
67376da314dSPeter De Schrijver 
67476da314dSPeter De Schrijver static struct tegra_clk_pll_params pll_dp_params = {
67576da314dSPeter De Schrijver 	.input_min = 12000000,
67676da314dSPeter De Schrijver 	.input_max = 1000000000,
67776da314dSPeter De Schrijver 	.cf_min = 12000000,
67876da314dSPeter De Schrijver 	.cf_max = 19200000, /* s/w policy, h/w capability 38 MHz */
67976da314dSPeter De Schrijver 	.vco_min = 600000000,
68076da314dSPeter De Schrijver 	.vco_max = 1200000000,
68176da314dSPeter De Schrijver 	.base_reg = PLLDP_BASE,
68276da314dSPeter De Schrijver 	.misc_reg = PLLDP_MISC,
68376da314dSPeter De Schrijver 	.lock_mask = PLL_BASE_LOCK,
68476da314dSPeter De Schrijver 	.lock_enable_bit_idx = PLLSS_MISC_LOCK_ENABLE,
68576da314dSPeter De Schrijver 	.lock_delay = 300,
68676da314dSPeter De Schrijver 	.iddq_reg = PLLDP_BASE,
68776da314dSPeter De Schrijver 	.iddq_bit_idx = PLLSS_IDDQ_BIT,
68876da314dSPeter De Schrijver 	.pdiv_tohw = pll12g_ssd_esd_p,
68976da314dSPeter De Schrijver 	.div_nmp = &pllss_nmp,
69076da314dSPeter De Schrijver 	.ext_misc_reg[0] = 0x598,
69176da314dSPeter De Schrijver 	.ext_misc_reg[1] = 0x59c,
69276da314dSPeter De Schrijver 	.ext_misc_reg[2] = 0x5a0,
69376da314dSPeter De Schrijver 	.max_p = 5,
69476da314dSPeter De Schrijver 	.freq_table = pll_dp_freq_table,
6953706b436SRhyland Klein 	.flags = TEGRA_PLL_USE_LOCK | TEGRA_PLL_HAS_LOCK_ENABLE,
69676da314dSPeter De Schrijver };
69776da314dSPeter De Schrijver 
698385f9adfSThierry Reding static const struct pdiv_map pllu_p[] = {
69976da314dSPeter De Schrijver 	{ .pdiv = 1, .hw_val = 1 },
70076da314dSPeter De Schrijver 	{ .pdiv = 2, .hw_val = 0 },
70176da314dSPeter De Schrijver 	{ .pdiv = 0, .hw_val = 0 },
70276da314dSPeter De Schrijver };
70376da314dSPeter De Schrijver 
70476da314dSPeter De Schrijver static struct div_nmp pllu_nmp = {
70576da314dSPeter De Schrijver 	.divm_shift = 0,
70676da314dSPeter De Schrijver 	.divm_width = 5,
70776da314dSPeter De Schrijver 	.divn_shift = 8,
70876da314dSPeter De Schrijver 	.divn_width = 10,
70976da314dSPeter De Schrijver 	.divp_shift = 20,
71076da314dSPeter De Schrijver 	.divp_width = 1,
71176da314dSPeter De Schrijver };
71276da314dSPeter De Schrijver 
71376da314dSPeter De Schrijver static struct tegra_clk_pll_freq_table pll_u_freq_table[] = {
71476da314dSPeter De Schrijver 	{ 12000000, 480000000, 960, 12, 2, 12 },
71576da314dSPeter De Schrijver 	{ 13000000, 480000000, 960, 13, 2, 12 },
71676da314dSPeter De Schrijver 	{ 16800000, 480000000, 400,  7, 2,  5 },
71776da314dSPeter De Schrijver 	{ 19200000, 480000000, 200,  4, 2,  3 },
71876da314dSPeter De Schrijver 	{ 26000000, 480000000, 960, 26, 2, 12 },
71976da314dSPeter De Schrijver 	{        0,         0,   0,  0, 0,  0 },
72076da314dSPeter De Schrijver };
72176da314dSPeter De Schrijver 
72276da314dSPeter De Schrijver static struct tegra_clk_pll_params pll_u_params = {
72376da314dSPeter De Schrijver 	.input_min = 2000000,
72476da314dSPeter De Schrijver 	.input_max = 40000000,
72576da314dSPeter De Schrijver 	.cf_min = 1000000,
72676da314dSPeter De Schrijver 	.cf_max = 6000000,
72776da314dSPeter De Schrijver 	.vco_min = 480000000,
72876da314dSPeter De Schrijver 	.vco_max = 960000000,
72976da314dSPeter De Schrijver 	.base_reg = PLLU_BASE,
73076da314dSPeter De Schrijver 	.misc_reg = PLLU_MISC,
73176da314dSPeter De Schrijver 	.lock_mask = PLL_BASE_LOCK,
73276da314dSPeter De Schrijver 	.lock_enable_bit_idx = PLLDU_MISC_LOCK_ENABLE,
73376da314dSPeter De Schrijver 	.lock_delay = 1000,
73476da314dSPeter De Schrijver 	.pdiv_tohw = pllu_p,
73576da314dSPeter De Schrijver 	.div_nmp = &pllu_nmp,
73676da314dSPeter De Schrijver 	.freq_table = pll_u_freq_table,
73776da314dSPeter De Schrijver 	.flags = TEGRA_PLLU | TEGRA_PLL_HAS_CPCON | TEGRA_PLL_SET_LFCON |
7383706b436SRhyland Klein 		 TEGRA_PLL_USE_LOCK | TEGRA_PLL_HAS_LOCK_ENABLE,
73976da314dSPeter De Schrijver };
74076da314dSPeter De Schrijver 
74176da314dSPeter De Schrijver static struct tegra_clk tegra124_clks[tegra_clk_max] __initdata = {
74276da314dSPeter De Schrijver 	[tegra_clk_ispb] = { .dt_id = TEGRA124_CLK_ISPB, .present = true },
74376da314dSPeter De Schrijver 	[tegra_clk_rtc] = { .dt_id = TEGRA124_CLK_RTC, .present = true },
74476da314dSPeter De Schrijver 	[tegra_clk_timer] = { .dt_id = TEGRA124_CLK_TIMER, .present = true },
74576da314dSPeter De Schrijver 	[tegra_clk_uarta] = { .dt_id = TEGRA124_CLK_UARTA, .present = true },
74620e7c323SAndrew Bresticker 	[tegra_clk_sdmmc2_8] = { .dt_id = TEGRA124_CLK_SDMMC2, .present = true },
74776da314dSPeter De Schrijver 	[tegra_clk_i2s1] = { .dt_id = TEGRA124_CLK_I2S1, .present = true },
74876da314dSPeter De Schrijver 	[tegra_clk_i2c1] = { .dt_id = TEGRA124_CLK_I2C1, .present = true },
74920e7c323SAndrew Bresticker 	[tegra_clk_sdmmc1_8] = { .dt_id = TEGRA124_CLK_SDMMC1, .present = true },
75020e7c323SAndrew Bresticker 	[tegra_clk_sdmmc4_8] = { .dt_id = TEGRA124_CLK_SDMMC4, .present = true },
75176da314dSPeter De Schrijver 	[tegra_clk_pwm] = { .dt_id = TEGRA124_CLK_PWM, .present = true },
75276da314dSPeter De Schrijver 	[tegra_clk_i2s2] = { .dt_id = TEGRA124_CLK_I2S2, .present = true },
75376da314dSPeter De Schrijver 	[tegra_clk_usbd] = { .dt_id = TEGRA124_CLK_USBD, .present = true },
75476da314dSPeter De Schrijver 	[tegra_clk_isp_8] = { .dt_id = TEGRA124_CLK_ISP, .present = true },
75576da314dSPeter De Schrijver 	[tegra_clk_disp2] = { .dt_id = TEGRA124_CLK_DISP2, .present = true },
75676da314dSPeter De Schrijver 	[tegra_clk_disp1] = { .dt_id = TEGRA124_CLK_DISP1, .present = true },
75782ba1c3cSMark Zhang 	[tegra_clk_host1x_8] = { .dt_id = TEGRA124_CLK_HOST1X, .present = true },
75876da314dSPeter De Schrijver 	[tegra_clk_vcp] = { .dt_id = TEGRA124_CLK_VCP, .present = true },
75976da314dSPeter De Schrijver 	[tegra_clk_i2s0] = { .dt_id = TEGRA124_CLK_I2S0, .present = true },
76076da314dSPeter De Schrijver 	[tegra_clk_apbdma] = { .dt_id = TEGRA124_CLK_APBDMA, .present = true },
76176da314dSPeter De Schrijver 	[tegra_clk_kbc] = { .dt_id = TEGRA124_CLK_KBC, .present = true },
76276da314dSPeter De Schrijver 	[tegra_clk_kfuse] = { .dt_id = TEGRA124_CLK_KFUSE, .present = true },
76376da314dSPeter De Schrijver 	[tegra_clk_sbc1] = { .dt_id = TEGRA124_CLK_SBC1, .present = true },
76476da314dSPeter De Schrijver 	[tegra_clk_nor] = { .dt_id = TEGRA124_CLK_NOR, .present = true },
76576da314dSPeter De Schrijver 	[tegra_clk_sbc2] = { .dt_id = TEGRA124_CLK_SBC2, .present = true },
76676da314dSPeter De Schrijver 	[tegra_clk_sbc3] = { .dt_id = TEGRA124_CLK_SBC3, .present = true },
76776da314dSPeter De Schrijver 	[tegra_clk_i2c5] = { .dt_id = TEGRA124_CLK_I2C5, .present = true },
76876da314dSPeter De Schrijver 	[tegra_clk_mipi] = { .dt_id = TEGRA124_CLK_MIPI, .present = true },
76976da314dSPeter De Schrijver 	[tegra_clk_hdmi] = { .dt_id = TEGRA124_CLK_HDMI, .present = true },
77076da314dSPeter De Schrijver 	[tegra_clk_csi] = { .dt_id = TEGRA124_CLK_CSI, .present = true },
77176da314dSPeter De Schrijver 	[tegra_clk_i2c2] = { .dt_id = TEGRA124_CLK_I2C2, .present = true },
77276da314dSPeter De Schrijver 	[tegra_clk_uartc] = { .dt_id = TEGRA124_CLK_UARTC, .present = true },
77376da314dSPeter De Schrijver 	[tegra_clk_mipi_cal] = { .dt_id = TEGRA124_CLK_MIPI_CAL, .present = true },
77476da314dSPeter De Schrijver 	[tegra_clk_usb2] = { .dt_id = TEGRA124_CLK_USB2, .present = true },
77576da314dSPeter De Schrijver 	[tegra_clk_usb3] = { .dt_id = TEGRA124_CLK_USB3, .present = true },
77676da314dSPeter De Schrijver 	[tegra_clk_vde_8] = { .dt_id = TEGRA124_CLK_VDE, .present = true },
77776da314dSPeter De Schrijver 	[tegra_clk_bsea] = { .dt_id = TEGRA124_CLK_BSEA, .present = true },
77876da314dSPeter De Schrijver 	[tegra_clk_bsev] = { .dt_id = TEGRA124_CLK_BSEV, .present = true },
77976da314dSPeter De Schrijver 	[tegra_clk_uartd] = { .dt_id = TEGRA124_CLK_UARTD, .present = true },
78076da314dSPeter De Schrijver 	[tegra_clk_i2c3] = { .dt_id = TEGRA124_CLK_I2C3, .present = true },
78176da314dSPeter De Schrijver 	[tegra_clk_sbc4] = { .dt_id = TEGRA124_CLK_SBC4, .present = true },
78220e7c323SAndrew Bresticker 	[tegra_clk_sdmmc3_8] = { .dt_id = TEGRA124_CLK_SDMMC3, .present = true },
78376da314dSPeter De Schrijver 	[tegra_clk_pcie] = { .dt_id = TEGRA124_CLK_PCIE, .present = true },
78476da314dSPeter De Schrijver 	[tegra_clk_owr] = { .dt_id = TEGRA124_CLK_OWR, .present = true },
78576da314dSPeter De Schrijver 	[tegra_clk_afi] = { .dt_id = TEGRA124_CLK_AFI, .present = true },
78676da314dSPeter De Schrijver 	[tegra_clk_csite] = { .dt_id = TEGRA124_CLK_CSITE, .present = true },
78776da314dSPeter De Schrijver 	[tegra_clk_la] = { .dt_id = TEGRA124_CLK_LA, .present = true },
78876da314dSPeter De Schrijver 	[tegra_clk_trace] = { .dt_id = TEGRA124_CLK_TRACE, .present = true },
78976da314dSPeter De Schrijver 	[tegra_clk_soc_therm] = { .dt_id = TEGRA124_CLK_SOC_THERM, .present = true },
79076da314dSPeter De Schrijver 	[tegra_clk_dtv] = { .dt_id = TEGRA124_CLK_DTV, .present = true },
79176da314dSPeter De Schrijver 	[tegra_clk_i2cslow] = { .dt_id = TEGRA124_CLK_I2CSLOW, .present = true },
79276da314dSPeter De Schrijver 	[tegra_clk_tsec] = { .dt_id = TEGRA124_CLK_TSEC, .present = true },
79376da314dSPeter De Schrijver 	[tegra_clk_xusb_host] = { .dt_id = TEGRA124_CLK_XUSB_HOST, .present = true },
79476da314dSPeter De Schrijver 	[tegra_clk_msenc] = { .dt_id = TEGRA124_CLK_MSENC, .present = true },
79576da314dSPeter De Schrijver 	[tegra_clk_csus] = { .dt_id = TEGRA124_CLK_CSUS, .present = true },
79676da314dSPeter De Schrijver 	[tegra_clk_mselect] = { .dt_id = TEGRA124_CLK_MSELECT, .present = true },
79776da314dSPeter De Schrijver 	[tegra_clk_tsensor] = { .dt_id = TEGRA124_CLK_TSENSOR, .present = true },
79876da314dSPeter De Schrijver 	[tegra_clk_i2s3] = { .dt_id = TEGRA124_CLK_I2S3, .present = true },
79976da314dSPeter De Schrijver 	[tegra_clk_i2s4] = { .dt_id = TEGRA124_CLK_I2S4, .present = true },
80076da314dSPeter De Schrijver 	[tegra_clk_i2c4] = { .dt_id = TEGRA124_CLK_I2C4, .present = true },
80176da314dSPeter De Schrijver 	[tegra_clk_sbc5] = { .dt_id = TEGRA124_CLK_SBC5, .present = true },
80276da314dSPeter De Schrijver 	[tegra_clk_sbc6] = { .dt_id = TEGRA124_CLK_SBC6, .present = true },
80376da314dSPeter De Schrijver 	[tegra_clk_d_audio] = { .dt_id = TEGRA124_CLK_D_AUDIO, .present = true },
80476da314dSPeter De Schrijver 	[tegra_clk_apbif] = { .dt_id = TEGRA124_CLK_APBIF, .present = true },
80576da314dSPeter De Schrijver 	[tegra_clk_dam0] = { .dt_id = TEGRA124_CLK_DAM0, .present = true },
80676da314dSPeter De Schrijver 	[tegra_clk_dam1] = { .dt_id = TEGRA124_CLK_DAM1, .present = true },
80776da314dSPeter De Schrijver 	[tegra_clk_dam2] = { .dt_id = TEGRA124_CLK_DAM2, .present = true },
80876da314dSPeter De Schrijver 	[tegra_clk_hda2codec_2x] = { .dt_id = TEGRA124_CLK_HDA2CODEC_2X, .present = true },
80976da314dSPeter De Schrijver 	[tegra_clk_audio0_2x] = { .dt_id = TEGRA124_CLK_AUDIO0_2X, .present = true },
81076da314dSPeter De Schrijver 	[tegra_clk_audio1_2x] = { .dt_id = TEGRA124_CLK_AUDIO1_2X, .present = true },
81176da314dSPeter De Schrijver 	[tegra_clk_audio2_2x] = { .dt_id = TEGRA124_CLK_AUDIO2_2X, .present = true },
81276da314dSPeter De Schrijver 	[tegra_clk_audio3_2x] = { .dt_id = TEGRA124_CLK_AUDIO3_2X, .present = true },
81376da314dSPeter De Schrijver 	[tegra_clk_audio4_2x] = { .dt_id = TEGRA124_CLK_AUDIO4_2X, .present = true },
81476da314dSPeter De Schrijver 	[tegra_clk_spdif_2x] = { .dt_id = TEGRA124_CLK_SPDIF_2X, .present = true },
81576da314dSPeter De Schrijver 	[tegra_clk_actmon] = { .dt_id = TEGRA124_CLK_ACTMON, .present = true },
81676da314dSPeter De Schrijver 	[tegra_clk_extern1] = { .dt_id = TEGRA124_CLK_EXTERN1, .present = true },
81776da314dSPeter De Schrijver 	[tegra_clk_extern2] = { .dt_id = TEGRA124_CLK_EXTERN2, .present = true },
81876da314dSPeter De Schrijver 	[tegra_clk_extern3] = { .dt_id = TEGRA124_CLK_EXTERN3, .present = true },
81976da314dSPeter De Schrijver 	[tegra_clk_sata_oob] = { .dt_id = TEGRA124_CLK_SATA_OOB, .present = true },
82076da314dSPeter De Schrijver 	[tegra_clk_sata] = { .dt_id = TEGRA124_CLK_SATA, .present = true },
82176da314dSPeter De Schrijver 	[tegra_clk_hda] = { .dt_id = TEGRA124_CLK_HDA, .present = true },
82276da314dSPeter De Schrijver 	[tegra_clk_se] = { .dt_id = TEGRA124_CLK_SE, .present = true },
82376da314dSPeter De Schrijver 	[tegra_clk_hda2hdmi] = { .dt_id = TEGRA124_CLK_HDA2HDMI, .present = true },
82476da314dSPeter De Schrijver 	[tegra_clk_sata_cold] = { .dt_id = TEGRA124_CLK_SATA_COLD, .present = true },
82576da314dSPeter De Schrijver 	[tegra_clk_cilab] = { .dt_id = TEGRA124_CLK_CILAB, .present = true },
82676da314dSPeter De Schrijver 	[tegra_clk_cilcd] = { .dt_id = TEGRA124_CLK_CILCD, .present = true },
82776da314dSPeter De Schrijver 	[tegra_clk_cile] = { .dt_id = TEGRA124_CLK_CILE, .present = true },
82876da314dSPeter De Schrijver 	[tegra_clk_dsialp] = { .dt_id = TEGRA124_CLK_DSIALP, .present = true },
82976da314dSPeter De Schrijver 	[tegra_clk_dsiblp] = { .dt_id = TEGRA124_CLK_DSIBLP, .present = true },
83076da314dSPeter De Schrijver 	[tegra_clk_entropy] = { .dt_id = TEGRA124_CLK_ENTROPY, .present = true },
83176da314dSPeter De Schrijver 	[tegra_clk_dds] = { .dt_id = TEGRA124_CLK_DDS, .present = true },
83276da314dSPeter De Schrijver 	[tegra_clk_dp2] = { .dt_id = TEGRA124_CLK_DP2, .present = true },
83376da314dSPeter De Schrijver 	[tegra_clk_amx] = { .dt_id = TEGRA124_CLK_AMX, .present = true },
83476da314dSPeter De Schrijver 	[tegra_clk_adx] = { .dt_id = TEGRA124_CLK_ADX, .present = true },
83576da314dSPeter De Schrijver 	[tegra_clk_xusb_ss] = { .dt_id = TEGRA124_CLK_XUSB_SS, .present = true },
83676da314dSPeter De Schrijver 	[tegra_clk_i2c6] = { .dt_id = TEGRA124_CLK_I2C6, .present = true },
83776da314dSPeter De Schrijver 	[tegra_clk_vim2_clk] = { .dt_id = TEGRA124_CLK_VIM2_CLK, .present = true },
83876da314dSPeter De Schrijver 	[tegra_clk_hdmi_audio] = { .dt_id = TEGRA124_CLK_HDMI_AUDIO, .present = true },
83976da314dSPeter De Schrijver 	[tegra_clk_clk72Mhz] = { .dt_id = TEGRA124_CLK_CLK72MHZ, .present = true },
84076da314dSPeter De Schrijver 	[tegra_clk_vic03] = { .dt_id = TEGRA124_CLK_VIC03, .present = true },
84176da314dSPeter De Schrijver 	[tegra_clk_adx1] = { .dt_id = TEGRA124_CLK_ADX1, .present = true },
84276da314dSPeter De Schrijver 	[tegra_clk_dpaux] = { .dt_id = TEGRA124_CLK_DPAUX, .present = true },
84376da314dSPeter De Schrijver 	[tegra_clk_sor0] = { .dt_id = TEGRA124_CLK_SOR0, .present = true },
84476da314dSPeter De Schrijver 	[tegra_clk_sor0_lvds] = { .dt_id = TEGRA124_CLK_SOR0_LVDS, .present = true },
84576da314dSPeter De Schrijver 	[tegra_clk_gpu] = { .dt_id = TEGRA124_CLK_GPU, .present = true },
84676da314dSPeter De Schrijver 	[tegra_clk_amx1] = { .dt_id = TEGRA124_CLK_AMX1, .present = true },
84776da314dSPeter De Schrijver 	[tegra_clk_uartb] = { .dt_id = TEGRA124_CLK_UARTB, .present = true },
84876da314dSPeter De Schrijver 	[tegra_clk_vfir] = { .dt_id = TEGRA124_CLK_VFIR, .present = true },
84976da314dSPeter De Schrijver 	[tegra_clk_spdif_in] = { .dt_id = TEGRA124_CLK_SPDIF_IN, .present = true },
85076da314dSPeter De Schrijver 	[tegra_clk_spdif_out] = { .dt_id = TEGRA124_CLK_SPDIF_OUT, .present = true },
85176da314dSPeter De Schrijver 	[tegra_clk_vi_9] = { .dt_id = TEGRA124_CLK_VI, .present = true },
852167d5366SPeter De Schrijver 	[tegra_clk_vi_sensor_8] = { .dt_id = TEGRA124_CLK_VI_SENSOR, .present = true },
85376da314dSPeter De Schrijver 	[tegra_clk_fuse] = { .dt_id = TEGRA124_CLK_FUSE, .present = true },
85476da314dSPeter De Schrijver 	[tegra_clk_fuse_burn] = { .dt_id = TEGRA124_CLK_FUSE_BURN, .present = true },
85576da314dSPeter De Schrijver 	[tegra_clk_clk_32k] = { .dt_id = TEGRA124_CLK_CLK_32K, .present = true },
85676da314dSPeter De Schrijver 	[tegra_clk_clk_m] = { .dt_id = TEGRA124_CLK_CLK_M, .present = true },
85776da314dSPeter De Schrijver 	[tegra_clk_clk_m_div2] = { .dt_id = TEGRA124_CLK_CLK_M_DIV2, .present = true },
85876da314dSPeter De Schrijver 	[tegra_clk_clk_m_div4] = { .dt_id = TEGRA124_CLK_CLK_M_DIV4, .present = true },
85976da314dSPeter De Schrijver 	[tegra_clk_pll_ref] = { .dt_id = TEGRA124_CLK_PLL_REF, .present = true },
86076da314dSPeter De Schrijver 	[tegra_clk_pll_c] = { .dt_id = TEGRA124_CLK_PLL_C, .present = true },
86176da314dSPeter De Schrijver 	[tegra_clk_pll_c_out1] = { .dt_id = TEGRA124_CLK_PLL_C_OUT1, .present = true },
86276da314dSPeter De Schrijver 	[tegra_clk_pll_c2] = { .dt_id = TEGRA124_CLK_PLL_C2, .present = true },
86376da314dSPeter De Schrijver 	[tegra_clk_pll_c3] = { .dt_id = TEGRA124_CLK_PLL_C3, .present = true },
86476da314dSPeter De Schrijver 	[tegra_clk_pll_m] = { .dt_id = TEGRA124_CLK_PLL_M, .present = true },
86576da314dSPeter De Schrijver 	[tegra_clk_pll_m_out1] = { .dt_id = TEGRA124_CLK_PLL_M_OUT1, .present = true },
86676da314dSPeter De Schrijver 	[tegra_clk_pll_p] = { .dt_id = TEGRA124_CLK_PLL_P, .present = true },
86776da314dSPeter De Schrijver 	[tegra_clk_pll_p_out1] = { .dt_id = TEGRA124_CLK_PLL_P_OUT1, .present = true },
86876da314dSPeter De Schrijver 	[tegra_clk_pll_p_out2] = { .dt_id = TEGRA124_CLK_PLL_P_OUT2, .present = true },
86976da314dSPeter De Schrijver 	[tegra_clk_pll_p_out3] = { .dt_id = TEGRA124_CLK_PLL_P_OUT3, .present = true },
87076da314dSPeter De Schrijver 	[tegra_clk_pll_p_out4] = { .dt_id = TEGRA124_CLK_PLL_P_OUT4, .present = true },
87176da314dSPeter De Schrijver 	[tegra_clk_pll_a] = { .dt_id = TEGRA124_CLK_PLL_A, .present = true },
87276da314dSPeter De Schrijver 	[tegra_clk_pll_a_out0] = { .dt_id = TEGRA124_CLK_PLL_A_OUT0, .present = true },
87376da314dSPeter De Schrijver 	[tegra_clk_pll_d] = { .dt_id = TEGRA124_CLK_PLL_D, .present = true },
87476da314dSPeter De Schrijver 	[tegra_clk_pll_d_out0] = { .dt_id = TEGRA124_CLK_PLL_D_OUT0, .present = true },
87576da314dSPeter De Schrijver 	[tegra_clk_pll_d2] = { .dt_id = TEGRA124_CLK_PLL_D2, .present = true },
87676da314dSPeter De Schrijver 	[tegra_clk_pll_d2_out0] = { .dt_id = TEGRA124_CLK_PLL_D2_OUT0, .present = true },
87776da314dSPeter De Schrijver 	[tegra_clk_pll_u] = { .dt_id = TEGRA124_CLK_PLL_U, .present = true },
87876da314dSPeter De Schrijver 	[tegra_clk_pll_u_480m] = { .dt_id = TEGRA124_CLK_PLL_U_480M, .present = true },
87976da314dSPeter De Schrijver 	[tegra_clk_pll_u_60m] = { .dt_id = TEGRA124_CLK_PLL_U_60M, .present = true },
88076da314dSPeter De Schrijver 	[tegra_clk_pll_u_48m] = { .dt_id = TEGRA124_CLK_PLL_U_48M, .present = true },
88176da314dSPeter De Schrijver 	[tegra_clk_pll_u_12m] = { .dt_id = TEGRA124_CLK_PLL_U_12M, .present = true },
88276da314dSPeter De Schrijver 	[tegra_clk_pll_x] = { .dt_id = TEGRA124_CLK_PLL_X, .present = true },
88376da314dSPeter De Schrijver 	[tegra_clk_pll_x_out0] = { .dt_id = TEGRA124_CLK_PLL_X_OUT0, .present = true },
88476da314dSPeter De Schrijver 	[tegra_clk_pll_re_vco] = { .dt_id = TEGRA124_CLK_PLL_RE_VCO, .present = true },
88576da314dSPeter De Schrijver 	[tegra_clk_pll_re_out] = { .dt_id = TEGRA124_CLK_PLL_RE_OUT, .present = true },
88676da314dSPeter De Schrijver 	[tegra_clk_spdif_in_sync] = { .dt_id = TEGRA124_CLK_SPDIF_IN_SYNC, .present = true },
88776da314dSPeter De Schrijver 	[tegra_clk_i2s0_sync] = { .dt_id = TEGRA124_CLK_I2S0_SYNC, .present = true },
88876da314dSPeter De Schrijver 	[tegra_clk_i2s1_sync] = { .dt_id = TEGRA124_CLK_I2S1_SYNC, .present = true },
88976da314dSPeter De Schrijver 	[tegra_clk_i2s2_sync] = { .dt_id = TEGRA124_CLK_I2S2_SYNC, .present = true },
89076da314dSPeter De Schrijver 	[tegra_clk_i2s3_sync] = { .dt_id = TEGRA124_CLK_I2S3_SYNC, .present = true },
89176da314dSPeter De Schrijver 	[tegra_clk_i2s4_sync] = { .dt_id = TEGRA124_CLK_I2S4_SYNC, .present = true },
89276da314dSPeter De Schrijver 	[tegra_clk_vimclk_sync] = { .dt_id = TEGRA124_CLK_VIMCLK_SYNC, .present = true },
89376da314dSPeter De Schrijver 	[tegra_clk_audio0] = { .dt_id = TEGRA124_CLK_AUDIO0, .present = true },
89476da314dSPeter De Schrijver 	[tegra_clk_audio1] = { .dt_id = TEGRA124_CLK_AUDIO1, .present = true },
89576da314dSPeter De Schrijver 	[tegra_clk_audio2] = { .dt_id = TEGRA124_CLK_AUDIO2, .present = true },
89676da314dSPeter De Schrijver 	[tegra_clk_audio3] = { .dt_id = TEGRA124_CLK_AUDIO3, .present = true },
89776da314dSPeter De Schrijver 	[tegra_clk_audio4] = { .dt_id = TEGRA124_CLK_AUDIO4, .present = true },
89876da314dSPeter De Schrijver 	[tegra_clk_spdif] = { .dt_id = TEGRA124_CLK_SPDIF, .present = true },
89976da314dSPeter De Schrijver 	[tegra_clk_clk_out_1] = { .dt_id = TEGRA124_CLK_CLK_OUT_1, .present = true },
90076da314dSPeter De Schrijver 	[tegra_clk_clk_out_2] = { .dt_id = TEGRA124_CLK_CLK_OUT_2, .present = true },
90176da314dSPeter De Schrijver 	[tegra_clk_clk_out_3] = { .dt_id = TEGRA124_CLK_CLK_OUT_3, .present = true },
90276da314dSPeter De Schrijver 	[tegra_clk_blink] = { .dt_id = TEGRA124_CLK_BLINK, .present = true },
90376da314dSPeter De Schrijver 	[tegra_clk_xusb_host_src] = { .dt_id = TEGRA124_CLK_XUSB_HOST_SRC, .present = true },
90476da314dSPeter De Schrijver 	[tegra_clk_xusb_falcon_src] = { .dt_id = TEGRA124_CLK_XUSB_FALCON_SRC, .present = true },
90576da314dSPeter De Schrijver 	[tegra_clk_xusb_fs_src] = { .dt_id = TEGRA124_CLK_XUSB_FS_SRC, .present = true },
90676da314dSPeter De Schrijver 	[tegra_clk_xusb_ss_src] = { .dt_id = TEGRA124_CLK_XUSB_SS_SRC, .present = true },
9075c992afcSAndrew Bresticker 	[tegra_clk_xusb_ss_div2] = { .dt_id = TEGRA124_CLK_XUSB_SS_DIV2, .present = true },
90876da314dSPeter De Schrijver 	[tegra_clk_xusb_dev_src] = { .dt_id = TEGRA124_CLK_XUSB_DEV_SRC, .present = true },
90976da314dSPeter De Schrijver 	[tegra_clk_xusb_dev] = { .dt_id = TEGRA124_CLK_XUSB_DEV, .present = true },
91076da314dSPeter De Schrijver 	[tegra_clk_xusb_hs_src] = { .dt_id = TEGRA124_CLK_XUSB_HS_SRC, .present = true },
91176da314dSPeter De Schrijver 	[tegra_clk_sclk] = { .dt_id = TEGRA124_CLK_SCLK, .present = true },
91276da314dSPeter De Schrijver 	[tegra_clk_hclk] = { .dt_id = TEGRA124_CLK_HCLK, .present = true },
91376da314dSPeter De Schrijver 	[tegra_clk_pclk] = { .dt_id = TEGRA124_CLK_PCLK, .present = true },
91476da314dSPeter De Schrijver 	[tegra_clk_cclk_g] = { .dt_id = TEGRA124_CLK_CCLK_G, .present = true },
91576da314dSPeter De Schrijver 	[tegra_clk_cclk_lp] = { .dt_id = TEGRA124_CLK_CCLK_LP, .present = true },
91676da314dSPeter De Schrijver 	[tegra_clk_dfll_ref] = { .dt_id = TEGRA124_CLK_DFLL_REF, .present = true },
91776da314dSPeter De Schrijver 	[tegra_clk_dfll_soc] = { .dt_id = TEGRA124_CLK_DFLL_SOC, .present = true },
91876da314dSPeter De Schrijver 	[tegra_clk_vi_sensor2] = { .dt_id = TEGRA124_CLK_VI_SENSOR2, .present = true },
91976da314dSPeter De Schrijver 	[tegra_clk_pll_p_out5] = { .dt_id = TEGRA124_CLK_PLL_P_OUT5, .present = true },
92076da314dSPeter De Schrijver 	[tegra_clk_pll_c4] = { .dt_id = TEGRA124_CLK_PLL_C4, .present = true },
92176da314dSPeter De Schrijver 	[tegra_clk_pll_dp] = { .dt_id = TEGRA124_CLK_PLL_DP, .present = true },
92276da314dSPeter De Schrijver 	[tegra_clk_audio0_mux] = { .dt_id = TEGRA124_CLK_AUDIO0_MUX, .present = true },
92376da314dSPeter De Schrijver 	[tegra_clk_audio1_mux] = { .dt_id = TEGRA124_CLK_AUDIO1_MUX, .present = true },
92476da314dSPeter De Schrijver 	[tegra_clk_audio2_mux] = { .dt_id = TEGRA124_CLK_AUDIO2_MUX, .present = true },
92576da314dSPeter De Schrijver 	[tegra_clk_audio3_mux] = { .dt_id = TEGRA124_CLK_AUDIO3_MUX, .present = true },
92676da314dSPeter De Schrijver 	[tegra_clk_audio4_mux] = { .dt_id = TEGRA124_CLK_AUDIO4_MUX, .present = true },
92776da314dSPeter De Schrijver 	[tegra_clk_spdif_mux] = { .dt_id = TEGRA124_CLK_SPDIF_MUX, .present = true },
92876da314dSPeter De Schrijver 	[tegra_clk_clk_out_1_mux] = { .dt_id = TEGRA124_CLK_CLK_OUT_1_MUX, .present = true },
92976da314dSPeter De Schrijver 	[tegra_clk_clk_out_2_mux] = { .dt_id = TEGRA124_CLK_CLK_OUT_2_MUX, .present = true },
93076da314dSPeter De Schrijver 	[tegra_clk_clk_out_3_mux] = { .dt_id = TEGRA124_CLK_CLK_OUT_3_MUX, .present = true },
931bfa34832SPeter De Schrijver 	[tegra_clk_cec] = { .dt_id = TEGRA124_CLK_CEC, .present = true },
93276da314dSPeter De Schrijver };
93376da314dSPeter De Schrijver 
93476da314dSPeter De Schrijver static struct tegra_devclk devclks[] __initdata = {
93576da314dSPeter De Schrijver 	{ .con_id = "clk_m", .dt_id = TEGRA124_CLK_CLK_M },
93676da314dSPeter De Schrijver 	{ .con_id = "pll_ref", .dt_id = TEGRA124_CLK_PLL_REF },
93776da314dSPeter De Schrijver 	{ .con_id = "clk_32k", .dt_id = TEGRA124_CLK_CLK_32K },
93876da314dSPeter De Schrijver 	{ .con_id = "clk_m_div2", .dt_id = TEGRA124_CLK_CLK_M_DIV2 },
93976da314dSPeter De Schrijver 	{ .con_id = "clk_m_div4", .dt_id = TEGRA124_CLK_CLK_M_DIV4 },
94076da314dSPeter De Schrijver 	{ .con_id = "pll_c", .dt_id = TEGRA124_CLK_PLL_C },
94176da314dSPeter De Schrijver 	{ .con_id = "pll_c_out1", .dt_id = TEGRA124_CLK_PLL_C_OUT1 },
94276da314dSPeter De Schrijver 	{ .con_id = "pll_c2", .dt_id = TEGRA124_CLK_PLL_C2 },
94376da314dSPeter De Schrijver 	{ .con_id = "pll_c3", .dt_id = TEGRA124_CLK_PLL_C3 },
94476da314dSPeter De Schrijver 	{ .con_id = "pll_p", .dt_id = TEGRA124_CLK_PLL_P },
94576da314dSPeter De Schrijver 	{ .con_id = "pll_p_out1", .dt_id = TEGRA124_CLK_PLL_P_OUT1 },
94676da314dSPeter De Schrijver 	{ .con_id = "pll_p_out2", .dt_id = TEGRA124_CLK_PLL_P_OUT2 },
94776da314dSPeter De Schrijver 	{ .con_id = "pll_p_out3", .dt_id = TEGRA124_CLK_PLL_P_OUT3 },
94876da314dSPeter De Schrijver 	{ .con_id = "pll_p_out4", .dt_id = TEGRA124_CLK_PLL_P_OUT4 },
94976da314dSPeter De Schrijver 	{ .con_id = "pll_m", .dt_id = TEGRA124_CLK_PLL_M },
95076da314dSPeter De Schrijver 	{ .con_id = "pll_m_out1", .dt_id = TEGRA124_CLK_PLL_M_OUT1 },
95176da314dSPeter De Schrijver 	{ .con_id = "pll_x", .dt_id = TEGRA124_CLK_PLL_X },
95276da314dSPeter De Schrijver 	{ .con_id = "pll_x_out0", .dt_id = TEGRA124_CLK_PLL_X_OUT0 },
95376da314dSPeter De Schrijver 	{ .con_id = "pll_u", .dt_id = TEGRA124_CLK_PLL_U },
95476da314dSPeter De Schrijver 	{ .con_id = "pll_u_480M", .dt_id = TEGRA124_CLK_PLL_U_480M },
95576da314dSPeter De Schrijver 	{ .con_id = "pll_u_60M", .dt_id = TEGRA124_CLK_PLL_U_60M },
95676da314dSPeter De Schrijver 	{ .con_id = "pll_u_48M", .dt_id = TEGRA124_CLK_PLL_U_48M },
95776da314dSPeter De Schrijver 	{ .con_id = "pll_u_12M", .dt_id = TEGRA124_CLK_PLL_U_12M },
95876da314dSPeter De Schrijver 	{ .con_id = "pll_d", .dt_id = TEGRA124_CLK_PLL_D },
95976da314dSPeter De Schrijver 	{ .con_id = "pll_d_out0", .dt_id = TEGRA124_CLK_PLL_D_OUT0 },
96076da314dSPeter De Schrijver 	{ .con_id = "pll_d2", .dt_id = TEGRA124_CLK_PLL_D2 },
96176da314dSPeter De Schrijver 	{ .con_id = "pll_d2_out0", .dt_id = TEGRA124_CLK_PLL_D2_OUT0 },
96276da314dSPeter De Schrijver 	{ .con_id = "pll_a", .dt_id = TEGRA124_CLK_PLL_A },
96376da314dSPeter De Schrijver 	{ .con_id = "pll_a_out0", .dt_id = TEGRA124_CLK_PLL_A_OUT0 },
96476da314dSPeter De Schrijver 	{ .con_id = "pll_re_vco", .dt_id = TEGRA124_CLK_PLL_RE_VCO },
96576da314dSPeter De Schrijver 	{ .con_id = "pll_re_out", .dt_id = TEGRA124_CLK_PLL_RE_OUT },
96676da314dSPeter De Schrijver 	{ .con_id = "spdif_in_sync", .dt_id = TEGRA124_CLK_SPDIF_IN_SYNC },
96776da314dSPeter De Schrijver 	{ .con_id = "i2s0_sync", .dt_id = TEGRA124_CLK_I2S0_SYNC },
96876da314dSPeter De Schrijver 	{ .con_id = "i2s1_sync", .dt_id = TEGRA124_CLK_I2S1_SYNC },
96976da314dSPeter De Schrijver 	{ .con_id = "i2s2_sync", .dt_id = TEGRA124_CLK_I2S2_SYNC },
97076da314dSPeter De Schrijver 	{ .con_id = "i2s3_sync", .dt_id = TEGRA124_CLK_I2S3_SYNC },
97176da314dSPeter De Schrijver 	{ .con_id = "i2s4_sync", .dt_id = TEGRA124_CLK_I2S4_SYNC },
97276da314dSPeter De Schrijver 	{ .con_id = "vimclk_sync", .dt_id = TEGRA124_CLK_VIMCLK_SYNC },
97376da314dSPeter De Schrijver 	{ .con_id = "audio0", .dt_id = TEGRA124_CLK_AUDIO0 },
97476da314dSPeter De Schrijver 	{ .con_id = "audio1", .dt_id = TEGRA124_CLK_AUDIO1 },
97576da314dSPeter De Schrijver 	{ .con_id = "audio2", .dt_id = TEGRA124_CLK_AUDIO2 },
97676da314dSPeter De Schrijver 	{ .con_id = "audio3", .dt_id = TEGRA124_CLK_AUDIO3 },
97776da314dSPeter De Schrijver 	{ .con_id = "audio4", .dt_id = TEGRA124_CLK_AUDIO4 },
97876da314dSPeter De Schrijver 	{ .con_id = "spdif", .dt_id = TEGRA124_CLK_SPDIF },
97976da314dSPeter De Schrijver 	{ .con_id = "audio0_2x", .dt_id = TEGRA124_CLK_AUDIO0_2X },
98076da314dSPeter De Schrijver 	{ .con_id = "audio1_2x", .dt_id = TEGRA124_CLK_AUDIO1_2X },
98176da314dSPeter De Schrijver 	{ .con_id = "audio2_2x", .dt_id = TEGRA124_CLK_AUDIO2_2X },
98276da314dSPeter De Schrijver 	{ .con_id = "audio3_2x", .dt_id = TEGRA124_CLK_AUDIO3_2X },
98376da314dSPeter De Schrijver 	{ .con_id = "audio4_2x", .dt_id = TEGRA124_CLK_AUDIO4_2X },
98476da314dSPeter De Schrijver 	{ .con_id = "spdif_2x", .dt_id = TEGRA124_CLK_SPDIF_2X },
98576da314dSPeter De Schrijver 	{ .con_id = "extern1", .dev_id = "clk_out_1", .dt_id = TEGRA124_CLK_EXTERN1 },
98676da314dSPeter De Schrijver 	{ .con_id = "extern2", .dev_id = "clk_out_2", .dt_id = TEGRA124_CLK_EXTERN2 },
98776da314dSPeter De Schrijver 	{ .con_id = "extern3", .dev_id = "clk_out_3", .dt_id = TEGRA124_CLK_EXTERN3 },
98876da314dSPeter De Schrijver 	{ .con_id = "blink", .dt_id = TEGRA124_CLK_BLINK },
98976da314dSPeter De Schrijver 	{ .con_id = "cclk_g", .dt_id = TEGRA124_CLK_CCLK_G },
99076da314dSPeter De Schrijver 	{ .con_id = "cclk_lp", .dt_id = TEGRA124_CLK_CCLK_LP },
99176da314dSPeter De Schrijver 	{ .con_id = "sclk", .dt_id = TEGRA124_CLK_SCLK },
99276da314dSPeter De Schrijver 	{ .con_id = "hclk", .dt_id = TEGRA124_CLK_HCLK },
99376da314dSPeter De Schrijver 	{ .con_id = "pclk", .dt_id = TEGRA124_CLK_PCLK },
9945ab5d404SAlexandre Courbot 	{ .con_id = "fuse", .dt_id = TEGRA124_CLK_FUSE },
99576da314dSPeter De Schrijver 	{ .dev_id = "rtc-tegra", .dt_id = TEGRA124_CLK_RTC },
99676da314dSPeter De Schrijver 	{ .dev_id = "timer", .dt_id = TEGRA124_CLK_TIMER },
99704794d98SDylan Reid 	{ .con_id = "hda", .dt_id = TEGRA124_CLK_HDA },
99804794d98SDylan Reid 	{ .con_id = "hda2codec_2x", .dt_id = TEGRA124_CLK_HDA2CODEC_2X },
99904794d98SDylan Reid 	{ .con_id = "hda2hdmi", .dt_id = TEGRA124_CLK_HDA2HDMI },
100076da314dSPeter De Schrijver };
100176da314dSPeter De Schrijver 
100276da314dSPeter De Schrijver static struct clk **clks;
100376da314dSPeter De Schrijver 
100476da314dSPeter De Schrijver static __init void tegra124_periph_clk_init(void __iomem *clk_base,
100576da314dSPeter De Schrijver 					    void __iomem *pmc_base)
100676da314dSPeter De Schrijver {
100776da314dSPeter De Schrijver 	struct clk *clk;
100876da314dSPeter De Schrijver 
10095c992afcSAndrew Bresticker 	/* xusb_ss_div2 */
10105c992afcSAndrew Bresticker 	clk = clk_register_fixed_factor(NULL, "xusb_ss_div2", "xusb_ss_src", 0,
10115c992afcSAndrew Bresticker 					1, 2);
10125c992afcSAndrew Bresticker 	clks[TEGRA124_CLK_XUSB_SS_DIV2] = clk;
101376da314dSPeter De Schrijver 
1014eede7113SThierry Reding 	clk = tegra_clk_register_periph_fixed("dpaux", "pll_p", 0, clk_base,
1015eede7113SThierry Reding 					      1, 17, 181);
1016eede7113SThierry Reding 	clks[TEGRA124_CLK_DPAUX] = clk;
1017eede7113SThierry Reding 
1018c1d676ceSThierry Reding 	clk = clk_register_gate(NULL, "pll_d_dsi_out", "pll_d_out0", 0,
1019b270491eSMark Zhang 				clk_base + PLLD_MISC, 30, 0, &pll_d_lock);
1020c1d676ceSThierry Reding 	clks[TEGRA124_CLK_PLL_D_DSI_OUT] = clk;
102176da314dSPeter De Schrijver 
1022c1d676ceSThierry Reding 	clk = tegra_clk_register_periph_gate("dsia", "pll_d_dsi_out", 0,
1023c1d676ceSThierry Reding 					     clk_base, 0, 48,
1024c1d676ceSThierry Reding 					     periph_clk_enb_refcnt);
1025b270491eSMark Zhang 	clks[TEGRA124_CLK_DSIA] = clk;
1026b270491eSMark Zhang 
1027c1d676ceSThierry Reding 	clk = tegra_clk_register_periph_gate("dsib", "pll_d_dsi_out", 0,
1028c1d676ceSThierry Reding 					     clk_base, 0, 82,
1029c1d676ceSThierry Reding 					     periph_clk_enb_refcnt);
1030b270491eSMark Zhang 	clks[TEGRA124_CLK_DSIB] = clk;
103176da314dSPeter De Schrijver 
1032ac67477fSTomeu Vizoso 	clk = tegra_clk_register_mc("mc", "emc", clk_base + CLK_SOURCE_EMC,
10334f4f85faSThierry Reding 				    &emc_lock);
10344f4f85faSThierry Reding 	clks[TEGRA124_CLK_MC] = clk;
103576da314dSPeter De Schrijver 
103676da314dSPeter De Schrijver 	/* cml0 */
103776da314dSPeter De Schrijver 	clk = clk_register_gate(NULL, "cml0", "pll_e", 0, clk_base + PLLE_AUX,
103876da314dSPeter De Schrijver 				0, 0, &pll_e_lock);
103976da314dSPeter De Schrijver 	clk_register_clkdev(clk, "cml0", NULL);
104076da314dSPeter De Schrijver 	clks[TEGRA124_CLK_CML0] = clk;
104176da314dSPeter De Schrijver 
104276da314dSPeter De Schrijver 	/* cml1 */
104376da314dSPeter De Schrijver 	clk = clk_register_gate(NULL, "cml1", "pll_e", 0, clk_base + PLLE_AUX,
104476da314dSPeter De Schrijver 				1, 0, &pll_e_lock);
104576da314dSPeter De Schrijver 	clk_register_clkdev(clk, "cml1", NULL);
104676da314dSPeter De Schrijver 	clks[TEGRA124_CLK_CML1] = clk;
104776da314dSPeter De Schrijver 
104876da314dSPeter De Schrijver 	tegra_periph_clk_init(clk_base, pmc_base, tegra124_clks, &pll_p_params);
104976da314dSPeter De Schrijver }
105076da314dSPeter De Schrijver 
105176da314dSPeter De Schrijver static void __init tegra124_pll_init(void __iomem *clk_base,
105276da314dSPeter De Schrijver 				     void __iomem *pmc)
105376da314dSPeter De Schrijver {
105476da314dSPeter De Schrijver 	struct clk *clk;
105576da314dSPeter De Schrijver 
105676da314dSPeter De Schrijver 	/* PLLC */
105776da314dSPeter De Schrijver 	clk = tegra_clk_register_pllxc("pll_c", "pll_ref", clk_base,
105876da314dSPeter De Schrijver 			pmc, 0, &pll_c_params, NULL);
105976da314dSPeter De Schrijver 	clk_register_clkdev(clk, "pll_c", NULL);
106076da314dSPeter De Schrijver 	clks[TEGRA124_CLK_PLL_C] = clk;
106176da314dSPeter De Schrijver 
106276da314dSPeter De Schrijver 	/* PLLC_OUT1 */
106376da314dSPeter De Schrijver 	clk = tegra_clk_register_divider("pll_c_out1_div", "pll_c",
106476da314dSPeter De Schrijver 			clk_base + PLLC_OUT, 0, TEGRA_DIVIDER_ROUND_UP,
106576da314dSPeter De Schrijver 			8, 8, 1, NULL);
106676da314dSPeter De Schrijver 	clk = tegra_clk_register_pll_out("pll_c_out1", "pll_c_out1_div",
106776da314dSPeter De Schrijver 				clk_base + PLLC_OUT, 1, 0,
106876da314dSPeter De Schrijver 				CLK_SET_RATE_PARENT, 0, NULL);
106976da314dSPeter De Schrijver 	clk_register_clkdev(clk, "pll_c_out1", NULL);
107076da314dSPeter De Schrijver 	clks[TEGRA124_CLK_PLL_C_OUT1] = clk;
107176da314dSPeter De Schrijver 
10724c495c20SMikko Perttunen 	/* PLLC_UD */
10734c495c20SMikko Perttunen 	clk = clk_register_fixed_factor(NULL, "pll_c_ud", "pll_c",
10744c495c20SMikko Perttunen 					CLK_SET_RATE_PARENT, 1, 1);
10754c495c20SMikko Perttunen 	clk_register_clkdev(clk, "pll_c_ud", NULL);
10764c495c20SMikko Perttunen 	clks[TEGRA124_CLK_PLL_C_UD] = clk;
10774c495c20SMikko Perttunen 
107876da314dSPeter De Schrijver 	/* PLLC2 */
107976da314dSPeter De Schrijver 	clk = tegra_clk_register_pllc("pll_c2", "pll_ref", clk_base, pmc, 0,
108076da314dSPeter De Schrijver 			     &pll_c2_params, NULL);
108176da314dSPeter De Schrijver 	clk_register_clkdev(clk, "pll_c2", NULL);
108276da314dSPeter De Schrijver 	clks[TEGRA124_CLK_PLL_C2] = clk;
108376da314dSPeter De Schrijver 
108476da314dSPeter De Schrijver 	/* PLLC3 */
108576da314dSPeter De Schrijver 	clk = tegra_clk_register_pllc("pll_c3", "pll_ref", clk_base, pmc, 0,
108676da314dSPeter De Schrijver 			     &pll_c3_params, NULL);
108776da314dSPeter De Schrijver 	clk_register_clkdev(clk, "pll_c3", NULL);
108876da314dSPeter De Schrijver 	clks[TEGRA124_CLK_PLL_C3] = clk;
108976da314dSPeter De Schrijver 
109076da314dSPeter De Schrijver 	/* PLLM */
109176da314dSPeter De Schrijver 	clk = tegra_clk_register_pllm("pll_m", "pll_ref", clk_base, pmc,
1092*2dcabf05SDmitry Osipenko 			     CLK_SET_RATE_GATE, &pll_m_params, NULL);
109376da314dSPeter De Schrijver 	clk_register_clkdev(clk, "pll_m", NULL);
109476da314dSPeter De Schrijver 	clks[TEGRA124_CLK_PLL_M] = clk;
109576da314dSPeter De Schrijver 
109676da314dSPeter De Schrijver 	/* PLLM_OUT1 */
109776da314dSPeter De Schrijver 	clk = tegra_clk_register_divider("pll_m_out1_div", "pll_m",
109876da314dSPeter De Schrijver 				clk_base + PLLM_OUT, 0, TEGRA_DIVIDER_ROUND_UP,
109976da314dSPeter De Schrijver 				8, 8, 1, NULL);
110076da314dSPeter De Schrijver 	clk = tegra_clk_register_pll_out("pll_m_out1", "pll_m_out1_div",
1101*2dcabf05SDmitry Osipenko 				clk_base + PLLM_OUT, 1, 0,
110276da314dSPeter De Schrijver 				CLK_SET_RATE_PARENT, 0, NULL);
110376da314dSPeter De Schrijver 	clk_register_clkdev(clk, "pll_m_out1", NULL);
110476da314dSPeter De Schrijver 	clks[TEGRA124_CLK_PLL_M_OUT1] = clk;
110576da314dSPeter De Schrijver 
110676da314dSPeter De Schrijver 	/* PLLM_UD */
110776da314dSPeter De Schrijver 	clk = clk_register_fixed_factor(NULL, "pll_m_ud", "pll_m",
110876da314dSPeter De Schrijver 					CLK_SET_RATE_PARENT, 1, 1);
11094c495c20SMikko Perttunen 	clk_register_clkdev(clk, "pll_m_ud", NULL);
11104c495c20SMikko Perttunen 	clks[TEGRA124_CLK_PLL_M_UD] = clk;
111176da314dSPeter De Schrijver 
111276da314dSPeter De Schrijver 	/* PLLU */
111315d68e8cSAndrew Bresticker 	clk = tegra_clk_register_pllu_tegra114("pll_u", "pll_ref", clk_base, 0,
111476da314dSPeter De Schrijver 					       &pll_u_params, &pll_u_lock);
111576da314dSPeter De Schrijver 	clk_register_clkdev(clk, "pll_u", NULL);
111676da314dSPeter De Schrijver 	clks[TEGRA124_CLK_PLL_U] = clk;
111776da314dSPeter De Schrijver 
111876da314dSPeter De Schrijver 	/* PLLU_480M */
111976da314dSPeter De Schrijver 	clk = clk_register_gate(NULL, "pll_u_480M", "pll_u",
112076da314dSPeter De Schrijver 				CLK_SET_RATE_PARENT, clk_base + PLLU_BASE,
112176da314dSPeter De Schrijver 				22, 0, &pll_u_lock);
112276da314dSPeter De Schrijver 	clk_register_clkdev(clk, "pll_u_480M", NULL);
112376da314dSPeter De Schrijver 	clks[TEGRA124_CLK_PLL_U_480M] = clk;
112476da314dSPeter De Schrijver 
112576da314dSPeter De Schrijver 	/* PLLU_60M */
112676da314dSPeter De Schrijver 	clk = clk_register_fixed_factor(NULL, "pll_u_60M", "pll_u",
112776da314dSPeter De Schrijver 					CLK_SET_RATE_PARENT, 1, 8);
112876da314dSPeter De Schrijver 	clk_register_clkdev(clk, "pll_u_60M", NULL);
112976da314dSPeter De Schrijver 	clks[TEGRA124_CLK_PLL_U_60M] = clk;
113076da314dSPeter De Schrijver 
113176da314dSPeter De Schrijver 	/* PLLU_48M */
113276da314dSPeter De Schrijver 	clk = clk_register_fixed_factor(NULL, "pll_u_48M", "pll_u",
113376da314dSPeter De Schrijver 					CLK_SET_RATE_PARENT, 1, 10);
113476da314dSPeter De Schrijver 	clk_register_clkdev(clk, "pll_u_48M", NULL);
113576da314dSPeter De Schrijver 	clks[TEGRA124_CLK_PLL_U_48M] = clk;
113676da314dSPeter De Schrijver 
113776da314dSPeter De Schrijver 	/* PLLU_12M */
113876da314dSPeter De Schrijver 	clk = clk_register_fixed_factor(NULL, "pll_u_12M", "pll_u",
113976da314dSPeter De Schrijver 					CLK_SET_RATE_PARENT, 1, 40);
114076da314dSPeter De Schrijver 	clk_register_clkdev(clk, "pll_u_12M", NULL);
114176da314dSPeter De Schrijver 	clks[TEGRA124_CLK_PLL_U_12M] = clk;
114276da314dSPeter De Schrijver 
114376da314dSPeter De Schrijver 	/* PLLD */
114476da314dSPeter De Schrijver 	clk = tegra_clk_register_pll("pll_d", "pll_ref", clk_base, pmc, 0,
114576da314dSPeter De Schrijver 			    &pll_d_params, &pll_d_lock);
114676da314dSPeter De Schrijver 	clk_register_clkdev(clk, "pll_d", NULL);
114776da314dSPeter De Schrijver 	clks[TEGRA124_CLK_PLL_D] = clk;
114876da314dSPeter De Schrijver 
114976da314dSPeter De Schrijver 	/* PLLD_OUT0 */
115076da314dSPeter De Schrijver 	clk = clk_register_fixed_factor(NULL, "pll_d_out0", "pll_d",
115176da314dSPeter De Schrijver 					CLK_SET_RATE_PARENT, 1, 2);
115276da314dSPeter De Schrijver 	clk_register_clkdev(clk, "pll_d_out0", NULL);
115376da314dSPeter De Schrijver 	clks[TEGRA124_CLK_PLL_D_OUT0] = clk;
115476da314dSPeter De Schrijver 
115576da314dSPeter De Schrijver 	/* PLLRE */
115676da314dSPeter De Schrijver 	clk = tegra_clk_register_pllre("pll_re_vco", "pll_ref", clk_base, pmc,
115776da314dSPeter De Schrijver 			     0, &pll_re_vco_params, &pll_re_lock, pll_ref_freq);
115876da314dSPeter De Schrijver 	clk_register_clkdev(clk, "pll_re_vco", NULL);
115976da314dSPeter De Schrijver 	clks[TEGRA124_CLK_PLL_RE_VCO] = clk;
116076da314dSPeter De Schrijver 
116176da314dSPeter De Schrijver 	clk = clk_register_divider_table(NULL, "pll_re_out", "pll_re_vco", 0,
116276da314dSPeter De Schrijver 					 clk_base + PLLRE_BASE, 16, 4, 0,
116376da314dSPeter De Schrijver 					 pll_re_div_table, &pll_re_lock);
116476da314dSPeter De Schrijver 	clk_register_clkdev(clk, "pll_re_out", NULL);
116576da314dSPeter De Schrijver 	clks[TEGRA124_CLK_PLL_RE_OUT] = clk;
116676da314dSPeter De Schrijver 
116776da314dSPeter De Schrijver 	/* PLLE */
116876da314dSPeter De Schrijver 	clk = tegra_clk_register_plle_tegra114("pll_e", "pll_ref",
116976da314dSPeter De Schrijver 				      clk_base, 0, &pll_e_params, NULL);
117076da314dSPeter De Schrijver 	clk_register_clkdev(clk, "pll_e", NULL);
117176da314dSPeter De Schrijver 	clks[TEGRA124_CLK_PLL_E] = clk;
117276da314dSPeter De Schrijver 
117376da314dSPeter De Schrijver 	/* PLLC4 */
117476da314dSPeter De Schrijver 	clk = tegra_clk_register_pllss("pll_c4", "pll_ref", clk_base, 0,
117576da314dSPeter De Schrijver 					&pll_c4_params, NULL);
117676da314dSPeter De Schrijver 	clk_register_clkdev(clk, "pll_c4", NULL);
117776da314dSPeter De Schrijver 	clks[TEGRA124_CLK_PLL_C4] = clk;
117876da314dSPeter De Schrijver 
117976da314dSPeter De Schrijver 	/* PLLDP */
118076da314dSPeter De Schrijver 	clk = tegra_clk_register_pllss("pll_dp", "pll_ref", clk_base, 0,
118176da314dSPeter De Schrijver 					&pll_dp_params, NULL);
118276da314dSPeter De Schrijver 	clk_register_clkdev(clk, "pll_dp", NULL);
118376da314dSPeter De Schrijver 	clks[TEGRA124_CLK_PLL_DP] = clk;
118476da314dSPeter De Schrijver 
118576da314dSPeter De Schrijver 	/* PLLD2 */
118676da314dSPeter De Schrijver 	clk = tegra_clk_register_pllss("pll_d2", "pll_ref", clk_base, 0,
118776da314dSPeter De Schrijver 					&tegra124_pll_d2_params, NULL);
118876da314dSPeter De Schrijver 	clk_register_clkdev(clk, "pll_d2", NULL);
118976da314dSPeter De Schrijver 	clks[TEGRA124_CLK_PLL_D2] = clk;
119076da314dSPeter De Schrijver 
11910e766c2dSDavid Ung 	/* PLLD2_OUT0 */
119276da314dSPeter De Schrijver 	clk = clk_register_fixed_factor(NULL, "pll_d2_out0", "pll_d2",
11930e766c2dSDavid Ung 					CLK_SET_RATE_PARENT, 1, 1);
119476da314dSPeter De Schrijver 	clk_register_clkdev(clk, "pll_d2_out0", NULL);
119576da314dSPeter De Schrijver 	clks[TEGRA124_CLK_PLL_D2_OUT0] = clk;
119676da314dSPeter De Schrijver 
119776da314dSPeter De Schrijver }
119876da314dSPeter De Schrijver 
11999e036d3eSJoseph Lo /* Tegra124 CPU clock and reset control functions */
12009e036d3eSJoseph Lo static void tegra124_wait_cpu_in_reset(u32 cpu)
12019e036d3eSJoseph Lo {
12029e036d3eSJoseph Lo 	unsigned int reg;
12039e036d3eSJoseph Lo 
12049e036d3eSJoseph Lo 	do {
12059e036d3eSJoseph Lo 		reg = readl(clk_base + CLK_RST_CONTROLLER_CPU_CMPLX_STATUS);
12069e036d3eSJoseph Lo 		cpu_relax();
12079e036d3eSJoseph Lo 	} while (!(reg & (1 << cpu)));  /* check CPU been reset or not */
12089e036d3eSJoseph Lo }
12099e036d3eSJoseph Lo 
12109e036d3eSJoseph Lo static void tegra124_disable_cpu_clock(u32 cpu)
12119e036d3eSJoseph Lo {
12129e036d3eSJoseph Lo 	/* flow controller would take care in the power sequence. */
12139e036d3eSJoseph Lo }
12149e036d3eSJoseph Lo 
121561792e40SJoseph Lo #ifdef CONFIG_PM_SLEEP
121661792e40SJoseph Lo static void tegra124_cpu_clock_suspend(void)
121761792e40SJoseph Lo {
121861792e40SJoseph Lo 	/* switch coresite to clk_m, save off original source */
121961792e40SJoseph Lo 	tegra124_cpu_clk_sctx.clk_csite_src =
122061792e40SJoseph Lo 				readl(clk_base + CLK_SOURCE_CSITE);
122161792e40SJoseph Lo 	writel(3 << 30, clk_base + CLK_SOURCE_CSITE);
1222c38864a7STuomas Tynkkynen 
1223c38864a7STuomas Tynkkynen 	tegra124_cpu_clk_sctx.cclkg_burst =
1224c38864a7STuomas Tynkkynen 				readl(clk_base + CCLKG_BURST_POLICY);
1225c38864a7STuomas Tynkkynen 	tegra124_cpu_clk_sctx.cclkg_divider =
1226c38864a7STuomas Tynkkynen 				readl(clk_base + CCLKG_BURST_POLICY + 4);
122761792e40SJoseph Lo }
122861792e40SJoseph Lo 
122961792e40SJoseph Lo static void tegra124_cpu_clock_resume(void)
123061792e40SJoseph Lo {
123161792e40SJoseph Lo 	writel(tegra124_cpu_clk_sctx.clk_csite_src,
123261792e40SJoseph Lo 				clk_base + CLK_SOURCE_CSITE);
1233c38864a7STuomas Tynkkynen 
1234c38864a7STuomas Tynkkynen 	writel(tegra124_cpu_clk_sctx.cclkg_burst,
1235c38864a7STuomas Tynkkynen 					clk_base + CCLKG_BURST_POLICY);
1236c38864a7STuomas Tynkkynen 	writel(tegra124_cpu_clk_sctx.cclkg_divider,
1237c38864a7STuomas Tynkkynen 					clk_base + CCLKG_BURST_POLICY + 4);
123861792e40SJoseph Lo }
123961792e40SJoseph Lo #endif
124061792e40SJoseph Lo 
12419e036d3eSJoseph Lo static struct tegra_cpu_car_ops tegra124_cpu_car_ops = {
12429e036d3eSJoseph Lo 	.wait_for_reset	= tegra124_wait_cpu_in_reset,
12439e036d3eSJoseph Lo 	.disable_clock	= tegra124_disable_cpu_clock,
124461792e40SJoseph Lo #ifdef CONFIG_PM_SLEEP
124561792e40SJoseph Lo 	.suspend	= tegra124_cpu_clock_suspend,
124661792e40SJoseph Lo 	.resume		= tegra124_cpu_clock_resume,
124761792e40SJoseph Lo #endif
12489e036d3eSJoseph Lo };
12499e036d3eSJoseph Lo 
125076da314dSPeter De Schrijver static const struct of_device_id pmc_match[] __initconst = {
125176da314dSPeter De Schrijver 	{ .compatible = "nvidia,tegra124-pmc" },
125276da314dSPeter De Schrijver 	{ },
125376da314dSPeter De Schrijver };
125476da314dSPeter De Schrijver 
125508acae34SPaul Walmsley static struct tegra_clk_init_table common_init_table[] __initdata = {
125676da314dSPeter De Schrijver 	{ TEGRA124_CLK_UARTA, TEGRA124_CLK_PLL_P, 408000000, 0 },
125776da314dSPeter De Schrijver 	{ TEGRA124_CLK_UARTB, TEGRA124_CLK_PLL_P, 408000000, 0 },
125876da314dSPeter De Schrijver 	{ TEGRA124_CLK_UARTC, TEGRA124_CLK_PLL_P, 408000000, 0 },
125976da314dSPeter De Schrijver 	{ TEGRA124_CLK_UARTD, TEGRA124_CLK_PLL_P, 408000000, 0 },
126076da314dSPeter De Schrijver 	{ TEGRA124_CLK_PLL_A, TEGRA124_CLK_CLK_MAX, 564480000, 1 },
126176da314dSPeter De Schrijver 	{ TEGRA124_CLK_PLL_A_OUT0, TEGRA124_CLK_CLK_MAX, 11289600, 1 },
126276da314dSPeter De Schrijver 	{ TEGRA124_CLK_EXTERN1, TEGRA124_CLK_PLL_A_OUT0, 0, 1 },
126376da314dSPeter De Schrijver 	{ TEGRA124_CLK_CLK_OUT_1_MUX, TEGRA124_CLK_EXTERN1, 0, 1 },
126476da314dSPeter De Schrijver 	{ TEGRA124_CLK_CLK_OUT_1, TEGRA124_CLK_CLK_MAX, 0, 1 },
126576da314dSPeter De Schrijver 	{ TEGRA124_CLK_I2S0, TEGRA124_CLK_PLL_A_OUT0, 11289600, 0 },
126676da314dSPeter De Schrijver 	{ TEGRA124_CLK_I2S1, TEGRA124_CLK_PLL_A_OUT0, 11289600, 0 },
126776da314dSPeter De Schrijver 	{ TEGRA124_CLK_I2S2, TEGRA124_CLK_PLL_A_OUT0, 11289600, 0 },
126876da314dSPeter De Schrijver 	{ TEGRA124_CLK_I2S3, TEGRA124_CLK_PLL_A_OUT0, 11289600, 0 },
126976da314dSPeter De Schrijver 	{ TEGRA124_CLK_I2S4, TEGRA124_CLK_PLL_A_OUT0, 11289600, 0 },
127076da314dSPeter De Schrijver 	{ TEGRA124_CLK_VDE, TEGRA124_CLK_PLL_P, 0, 0 },
127176da314dSPeter De Schrijver 	{ TEGRA124_CLK_HOST1X, TEGRA124_CLK_PLL_P, 136000000, 1 },
1272f892f24bSSean Paul 	{ TEGRA124_CLK_DSIALP, TEGRA124_CLK_PLL_P, 68000000, 0 },
1273f892f24bSSean Paul 	{ TEGRA124_CLK_DSIBLP, TEGRA124_CLK_PLL_P, 68000000, 0 },
1274*2dcabf05SDmitry Osipenko 	{ TEGRA124_CLK_SCLK, TEGRA124_CLK_PLL_P_OUT2, 102000000, 0 },
127576da314dSPeter De Schrijver 	{ TEGRA124_CLK_DFLL_SOC, TEGRA124_CLK_PLL_P, 51000000, 1 },
127676da314dSPeter De Schrijver 	{ TEGRA124_CLK_DFLL_REF, TEGRA124_CLK_PLL_P, 51000000, 1 },
127776da314dSPeter De Schrijver 	{ TEGRA124_CLK_PLL_C, TEGRA124_CLK_CLK_MAX, 768000000, 0 },
127876da314dSPeter De Schrijver 	{ TEGRA124_CLK_PLL_C_OUT1, TEGRA124_CLK_CLK_MAX, 100000000, 0 },
127976da314dSPeter De Schrijver 	{ TEGRA124_CLK_SBC4, TEGRA124_CLK_PLL_P, 12000000, 1 },
128076da314dSPeter De Schrijver 	{ TEGRA124_CLK_TSEC, TEGRA124_CLK_PLL_C3, 0, 0 },
128176da314dSPeter De Schrijver 	{ TEGRA124_CLK_MSENC, TEGRA124_CLK_PLL_C3, 0, 0 },
12824a7f10d6SAndrew Bresticker 	{ TEGRA124_CLK_PLL_RE_VCO, TEGRA124_CLK_CLK_MAX, 672000000, 0 },
12834a7f10d6SAndrew Bresticker 	{ TEGRA124_CLK_XUSB_SS_SRC, TEGRA124_CLK_PLL_U_480M, 120000000, 0 },
12844a7f10d6SAndrew Bresticker 	{ TEGRA124_CLK_XUSB_FS_SRC, TEGRA124_CLK_PLL_U_48M, 48000000, 0 },
12854a7f10d6SAndrew Bresticker 	{ TEGRA124_CLK_XUSB_HS_SRC, TEGRA124_CLK_PLL_U_60M, 60000000, 0 },
12864a7f10d6SAndrew Bresticker 	{ TEGRA124_CLK_XUSB_FALCON_SRC, TEGRA124_CLK_PLL_RE_OUT, 224000000, 0 },
12874a7f10d6SAndrew Bresticker 	{ TEGRA124_CLK_XUSB_HOST_SRC, TEGRA124_CLK_PLL_RE_OUT, 112000000, 0 },
1288cb44cc2fSMikko Perttunen 	{ TEGRA124_CLK_SATA, TEGRA124_CLK_PLL_P, 104000000, 0 },
1289cb44cc2fSMikko Perttunen 	{ TEGRA124_CLK_SATA_OOB, TEGRA124_CLK_PLL_P, 204000000, 0 },
12900a7eec7fSPeter De Schrijver 	{ TEGRA124_CLK_MSELECT, TEGRA124_CLK_CLK_MAX, 0, 1 },
12910a7eec7fSPeter De Schrijver 	{ TEGRA124_CLK_CSITE, TEGRA124_CLK_CLK_MAX, 0, 1 },
12920a7eec7fSPeter De Schrijver 	{ TEGRA124_CLK_TSENSOR, TEGRA124_CLK_CLK_M, 400000, 0 },
12938d99704fSThierry Reding 	/* must be the last entry */
129476da314dSPeter De Schrijver 	{ TEGRA124_CLK_CLK_MAX, TEGRA124_CLK_CLK_MAX, 0, 0 },
129576da314dSPeter De Schrijver };
129676da314dSPeter De Schrijver 
129708acae34SPaul Walmsley static struct tegra_clk_init_table tegra124_init_table[] __initdata = {
129808acae34SPaul Walmsley 	{ TEGRA124_CLK_SOC_THERM, TEGRA124_CLK_PLL_P, 51000000, 0 },
129908acae34SPaul Walmsley 	{ TEGRA124_CLK_CCLK_G, TEGRA124_CLK_CLK_MAX, 0, 1 },
130004794d98SDylan Reid 	{ TEGRA124_CLK_HDA, TEGRA124_CLK_PLL_P, 102000000, 0 },
130104794d98SDylan Reid 	{ TEGRA124_CLK_HDA2CODEC_2X, TEGRA124_CLK_PLL_P, 48000000, 0 },
13028d99704fSThierry Reding 	/* must be the last entry */
130308acae34SPaul Walmsley 	{ TEGRA124_CLK_CLK_MAX, TEGRA124_CLK_CLK_MAX, 0, 0 },
130408acae34SPaul Walmsley };
130508acae34SPaul Walmsley 
130608acae34SPaul Walmsley /* Tegra132 requires the SOC_THERM clock to remain active */
130708acae34SPaul Walmsley static struct tegra_clk_init_table tegra132_init_table[] __initdata = {
130808acae34SPaul Walmsley 	{ TEGRA124_CLK_SOC_THERM, TEGRA124_CLK_PLL_P, 51000000, 1 },
13098d99704fSThierry Reding 	/* must be the last entry */
131008acae34SPaul Walmsley 	{ TEGRA124_CLK_CLK_MAX, TEGRA124_CLK_CLK_MAX, 0, 0 },
131108acae34SPaul Walmsley };
131208acae34SPaul Walmsley 
131388d909beSRhyland Klein static struct tegra_audio_clk_info tegra124_audio_plls[] = {
131488d909beSRhyland Klein 	{ "pll_a", &pll_a_params, tegra_clk_pll_a, "pll_p_out1" },
131588d909beSRhyland Klein };
131688d909beSRhyland Klein 
131708acae34SPaul Walmsley /**
131808acae34SPaul Walmsley  * tegra124_clock_apply_init_table - initialize clocks on Tegra124 SoCs
131908acae34SPaul Walmsley  *
132008acae34SPaul Walmsley  * Program an initial clock rate and enable or disable clocks needed
132108acae34SPaul Walmsley  * by the rest of the kernel, for Tegra124 SoCs.  It is intended to be
132208acae34SPaul Walmsley  * called by assigning a pointer to it to tegra_clk_apply_init_table -
132308acae34SPaul Walmsley  * this will be called as an arch_initcall.  No return value.
132408acae34SPaul Walmsley  */
132576da314dSPeter De Schrijver static void __init tegra124_clock_apply_init_table(void)
132676da314dSPeter De Schrijver {
132708acae34SPaul Walmsley 	tegra_init_from_table(common_init_table, clks, TEGRA124_CLK_CLK_MAX);
132808acae34SPaul Walmsley 	tegra_init_from_table(tegra124_init_table, clks, TEGRA124_CLK_CLK_MAX);
132976da314dSPeter De Schrijver }
133076da314dSPeter De Schrijver 
133108acae34SPaul Walmsley /**
1332a3c83ff2SPaul Walmsley  * tegra124_car_barrier - wait for pending writes to the CAR to complete
1333a3c83ff2SPaul Walmsley  *
1334a3c83ff2SPaul Walmsley  * Wait for any outstanding writes to the CAR MMIO space from this CPU
1335a3c83ff2SPaul Walmsley  * to complete before continuing execution.  No return value.
1336a3c83ff2SPaul Walmsley  */
1337a3c83ff2SPaul Walmsley static void tegra124_car_barrier(void)
1338a3c83ff2SPaul Walmsley {
1339a3c83ff2SPaul Walmsley 	readl_relaxed(clk_base + RST_DFLL_DVCO);
1340a3c83ff2SPaul Walmsley }
1341a3c83ff2SPaul Walmsley 
1342a3c83ff2SPaul Walmsley /**
1343a3c83ff2SPaul Walmsley  * tegra124_clock_assert_dfll_dvco_reset - assert the DFLL's DVCO reset
1344a3c83ff2SPaul Walmsley  *
1345a3c83ff2SPaul Walmsley  * Assert the reset line of the DFLL's DVCO.  No return value.
1346a3c83ff2SPaul Walmsley  */
1347c5a132a8SStephen Boyd static void tegra124_clock_assert_dfll_dvco_reset(void)
1348a3c83ff2SPaul Walmsley {
1349a3c83ff2SPaul Walmsley 	u32 v;
1350a3c83ff2SPaul Walmsley 
1351a3c83ff2SPaul Walmsley 	v = readl_relaxed(clk_base + RST_DFLL_DVCO);
1352a3c83ff2SPaul Walmsley 	v |= (1 << DVFS_DFLL_RESET_SHIFT);
1353a3c83ff2SPaul Walmsley 	writel_relaxed(v, clk_base + RST_DFLL_DVCO);
1354a3c83ff2SPaul Walmsley 	tegra124_car_barrier();
1355a3c83ff2SPaul Walmsley }
1356a3c83ff2SPaul Walmsley 
1357a3c83ff2SPaul Walmsley /**
1358a3c83ff2SPaul Walmsley  * tegra124_clock_deassert_dfll_dvco_reset - deassert the DFLL's DVCO reset
1359a3c83ff2SPaul Walmsley  *
1360a3c83ff2SPaul Walmsley  * Deassert the reset line of the DFLL's DVCO, allowing the DVCO to
1361a3c83ff2SPaul Walmsley  * operate.  No return value.
1362a3c83ff2SPaul Walmsley  */
1363c5a132a8SStephen Boyd static void tegra124_clock_deassert_dfll_dvco_reset(void)
1364a3c83ff2SPaul Walmsley {
1365a3c83ff2SPaul Walmsley 	u32 v;
1366a3c83ff2SPaul Walmsley 
1367a3c83ff2SPaul Walmsley 	v = readl_relaxed(clk_base + RST_DFLL_DVCO);
1368a3c83ff2SPaul Walmsley 	v &= ~(1 << DVFS_DFLL_RESET_SHIFT);
1369a3c83ff2SPaul Walmsley 	writel_relaxed(v, clk_base + RST_DFLL_DVCO);
1370a3c83ff2SPaul Walmsley 	tegra124_car_barrier();
1371a3c83ff2SPaul Walmsley }
1372a3c83ff2SPaul Walmsley 
1373c5a132a8SStephen Boyd static int tegra124_reset_assert(unsigned long id)
1374a3c83ff2SPaul Walmsley {
1375a3c83ff2SPaul Walmsley 	if (id == TEGRA124_RST_DFLL_DVCO)
1376a3c83ff2SPaul Walmsley 		tegra124_clock_assert_dfll_dvco_reset();
1377a3c83ff2SPaul Walmsley 	else
1378a3c83ff2SPaul Walmsley 		return -EINVAL;
1379a3c83ff2SPaul Walmsley 
1380a3c83ff2SPaul Walmsley 	return 0;
1381a3c83ff2SPaul Walmsley }
1382a3c83ff2SPaul Walmsley 
1383c5a132a8SStephen Boyd static int tegra124_reset_deassert(unsigned long id)
1384a3c83ff2SPaul Walmsley {
1385a3c83ff2SPaul Walmsley 	if (id == TEGRA124_RST_DFLL_DVCO)
1386a3c83ff2SPaul Walmsley 		tegra124_clock_deassert_dfll_dvco_reset();
1387a3c83ff2SPaul Walmsley 	else
1388a3c83ff2SPaul Walmsley 		return -EINVAL;
1389a3c83ff2SPaul Walmsley 
1390a3c83ff2SPaul Walmsley 	return 0;
1391a3c83ff2SPaul Walmsley }
1392a3c83ff2SPaul Walmsley 
1393a3c83ff2SPaul Walmsley /**
139408acae34SPaul Walmsley  * tegra132_clock_apply_init_table - initialize clocks on Tegra132 SoCs
139508acae34SPaul Walmsley  *
139608acae34SPaul Walmsley  * Program an initial clock rate and enable or disable clocks needed
139708acae34SPaul Walmsley  * by the rest of the kernel, for Tegra132 SoCs.  It is intended to be
139808acae34SPaul Walmsley  * called by assigning a pointer to it to tegra_clk_apply_init_table -
139908acae34SPaul Walmsley  * this will be called as an arch_initcall.  No return value.
140008acae34SPaul Walmsley  */
140108acae34SPaul Walmsley static void __init tegra132_clock_apply_init_table(void)
140208acae34SPaul Walmsley {
140308acae34SPaul Walmsley 	tegra_init_from_table(common_init_table, clks, TEGRA124_CLK_CLK_MAX);
140408acae34SPaul Walmsley 	tegra_init_from_table(tegra132_init_table, clks, TEGRA124_CLK_CLK_MAX);
140508acae34SPaul Walmsley }
140608acae34SPaul Walmsley 
140708acae34SPaul Walmsley /**
140808acae34SPaul Walmsley  * tegra124_132_clock_init_pre - clock initialization preamble for T124/T132
140908acae34SPaul Walmsley  * @np: struct device_node * of the DT node for the SoC CAR IP block
141008acae34SPaul Walmsley  *
141108acae34SPaul Walmsley  * Register most of the clocks controlled by the CAR IP block, along
141208acae34SPaul Walmsley  * with a few clocks controlled by the PMC IP block.  Everything in
141308acae34SPaul Walmsley  * this function should be common to Tegra124 and Tegra132.  XXX The
141408acae34SPaul Walmsley  * PMC clock initialization should probably be moved to PMC-specific
141508acae34SPaul Walmsley  * driver code.  No return value.
141608acae34SPaul Walmsley  */
141708acae34SPaul Walmsley static void __init tegra124_132_clock_init_pre(struct device_node *np)
141876da314dSPeter De Schrijver {
141976da314dSPeter De Schrijver 	struct device_node *node;
1420b270491eSMark Zhang 	u32 plld_base;
142176da314dSPeter De Schrijver 
142276da314dSPeter De Schrijver 	clk_base = of_iomap(np, 0);
142376da314dSPeter De Schrijver 	if (!clk_base) {
142408acae34SPaul Walmsley 		pr_err("ioremap tegra124/tegra132 CAR failed\n");
142576da314dSPeter De Schrijver 		return;
142676da314dSPeter De Schrijver 	}
142776da314dSPeter De Schrijver 
142876da314dSPeter De Schrijver 	node = of_find_matching_node(NULL, pmc_match);
142976da314dSPeter De Schrijver 	if (!node) {
143076da314dSPeter De Schrijver 		pr_err("Failed to find pmc node\n");
143176da314dSPeter De Schrijver 		WARN_ON(1);
143276da314dSPeter De Schrijver 		return;
143376da314dSPeter De Schrijver 	}
143476da314dSPeter De Schrijver 
143576da314dSPeter De Schrijver 	pmc_base = of_iomap(node, 0);
143676da314dSPeter De Schrijver 	if (!pmc_base) {
143776da314dSPeter De Schrijver 		pr_err("Can't map pmc registers\n");
143876da314dSPeter De Schrijver 		WARN_ON(1);
143976da314dSPeter De Schrijver 		return;
144076da314dSPeter De Schrijver 	}
144176da314dSPeter De Schrijver 
144208acae34SPaul Walmsley 	clks = tegra_clk_init(clk_base, TEGRA124_CLK_CLK_MAX,
144308acae34SPaul Walmsley 			      TEGRA124_CAR_BANK_COUNT);
144476da314dSPeter De Schrijver 	if (!clks)
144576da314dSPeter De Schrijver 		return;
144676da314dSPeter De Schrijver 
144776da314dSPeter De Schrijver 	if (tegra_osc_clk_init(clk_base, tegra124_clks, tegra124_input_freq,
144863cc5a4dSThierry Reding 			       ARRAY_SIZE(tegra124_input_freq), 1, &osc_freq,
144963cc5a4dSThierry Reding 			       &pll_ref_freq) < 0)
145076da314dSPeter De Schrijver 		return;
145176da314dSPeter De Schrijver 
145276da314dSPeter De Schrijver 	tegra_fixed_clk_init(tegra124_clks);
145376da314dSPeter De Schrijver 	tegra124_pll_init(clk_base, pmc_base);
145476da314dSPeter De Schrijver 	tegra124_periph_clk_init(clk_base, pmc_base);
145588d909beSRhyland Klein 	tegra_audio_clk_init(clk_base, pmc_base, tegra124_clks,
145688d909beSRhyland Klein 			     tegra124_audio_plls,
145788d909beSRhyland Klein 			     ARRAY_SIZE(tegra124_audio_plls));
145876da314dSPeter De Schrijver 	tegra_pmc_clk_init(pmc_base, tegra124_clks);
1459b270491eSMark Zhang 
1460b270491eSMark Zhang 	/* For Tegra124 & Tegra132, PLLD is the only source for DSIA & DSIB */
1461b270491eSMark Zhang 	plld_base = clk_readl(clk_base + PLLD_BASE);
1462b270491eSMark Zhang 	plld_base &= ~BIT(25);
1463b270491eSMark Zhang 	clk_writel(plld_base, clk_base + PLLD_BASE);
146408acae34SPaul Walmsley }
146576da314dSPeter De Schrijver 
146608acae34SPaul Walmsley /**
146708acae34SPaul Walmsley  * tegra124_132_clock_init_post - clock initialization postamble for T124/T132
146808acae34SPaul Walmsley  * @np: struct device_node * of the DT node for the SoC CAR IP block
146908acae34SPaul Walmsley  *
147008acae34SPaul Walmsley  * Register most of the along with a few clocks controlled by the PMC
147108acae34SPaul Walmsley  * IP block.  Everything in this function should be common to Tegra124
147208acae34SPaul Walmsley  * and Tegra132.  This function must be called after
147308acae34SPaul Walmsley  * tegra124_132_clock_init_pre(), otherwise clk_base and pmc_base will
147408acae34SPaul Walmsley  * not be set.  No return value.
147508acae34SPaul Walmsley  */
147608acae34SPaul Walmsley static void __init tegra124_132_clock_init_post(struct device_node *np)
147708acae34SPaul Walmsley {
147876da314dSPeter De Schrijver 	tegra_super_clk_gen4_init(clk_base, pmc_base, tegra124_clks,
147976da314dSPeter De Schrijver 				  &pll_x_params);
1480a3c83ff2SPaul Walmsley 	tegra_init_special_resets(1, tegra124_reset_assert,
1481a3c83ff2SPaul Walmsley 				  tegra124_reset_deassert);
148276da314dSPeter De Schrijver 	tegra_add_of_provider(np);
14832db04f16SMikko Perttunen 
14842db04f16SMikko Perttunen 	clks[TEGRA124_CLK_EMC] = tegra_clk_register_emc(clk_base, np,
14852db04f16SMikko Perttunen 							&emc_lock);
14862db04f16SMikko Perttunen 
148776da314dSPeter De Schrijver 	tegra_register_devclks(devclks, ARRAY_SIZE(devclks));
148876da314dSPeter De Schrijver 
14899e036d3eSJoseph Lo 	tegra_cpu_car_ops = &tegra124_cpu_car_ops;
149076da314dSPeter De Schrijver }
149108acae34SPaul Walmsley 
149208acae34SPaul Walmsley /**
149308acae34SPaul Walmsley  * tegra124_clock_init - Tegra124-specific clock initialization
149408acae34SPaul Walmsley  * @np: struct device_node * of the DT node for the SoC CAR IP block
149508acae34SPaul Walmsley  *
149608acae34SPaul Walmsley  * Register most SoC clocks for the Tegra124 system-on-chip.  Most of
149708acae34SPaul Walmsley  * this code is shared between the Tegra124 and Tegra132 SoCs,
149808acae34SPaul Walmsley  * although some of the initial clock settings and CPU clocks differ.
149908acae34SPaul Walmsley  * Intended to be called by the OF init code when a DT node with the
150008acae34SPaul Walmsley  * "nvidia,tegra124-car" string is encountered, and declared with
150108acae34SPaul Walmsley  * CLK_OF_DECLARE.  No return value.
150208acae34SPaul Walmsley  */
150308acae34SPaul Walmsley static void __init tegra124_clock_init(struct device_node *np)
150408acae34SPaul Walmsley {
150508acae34SPaul Walmsley 	tegra124_132_clock_init_pre(np);
150608acae34SPaul Walmsley 	tegra_clk_apply_init_table = tegra124_clock_apply_init_table;
150708acae34SPaul Walmsley 	tegra124_132_clock_init_post(np);
150808acae34SPaul Walmsley }
150908acae34SPaul Walmsley 
151008acae34SPaul Walmsley /**
151108acae34SPaul Walmsley  * tegra132_clock_init - Tegra132-specific clock initialization
151208acae34SPaul Walmsley  * @np: struct device_node * of the DT node for the SoC CAR IP block
151308acae34SPaul Walmsley  *
151408acae34SPaul Walmsley  * Register most SoC clocks for the Tegra132 system-on-chip.  Most of
151508acae34SPaul Walmsley  * this code is shared between the Tegra124 and Tegra132 SoCs,
151608acae34SPaul Walmsley  * although some of the initial clock settings and CPU clocks differ.
151708acae34SPaul Walmsley  * Intended to be called by the OF init code when a DT node with the
151808acae34SPaul Walmsley  * "nvidia,tegra132-car" string is encountered, and declared with
151908acae34SPaul Walmsley  * CLK_OF_DECLARE.  No return value.
152008acae34SPaul Walmsley  */
152108acae34SPaul Walmsley static void __init tegra132_clock_init(struct device_node *np)
152208acae34SPaul Walmsley {
152308acae34SPaul Walmsley 	tegra124_132_clock_init_pre(np);
152408acae34SPaul Walmsley 
152508acae34SPaul Walmsley 	/*
152608acae34SPaul Walmsley 	 * On Tegra132, these clocks are controlled by the
152708acae34SPaul Walmsley 	 * CLUSTER_clocks IP block, located in the CPU complex
152808acae34SPaul Walmsley 	 */
152908acae34SPaul Walmsley 	tegra124_clks[tegra_clk_cclk_g].present = false;
153008acae34SPaul Walmsley 	tegra124_clks[tegra_clk_cclk_lp].present = false;
153108acae34SPaul Walmsley 	tegra124_clks[tegra_clk_pll_x].present = false;
153208acae34SPaul Walmsley 	tegra124_clks[tegra_clk_pll_x_out0].present = false;
153308acae34SPaul Walmsley 
153408acae34SPaul Walmsley 	tegra_clk_apply_init_table = tegra132_clock_apply_init_table;
153508acae34SPaul Walmsley 	tegra124_132_clock_init_post(np);
153608acae34SPaul Walmsley }
153776da314dSPeter De Schrijver CLK_OF_DECLARE(tegra124, "nvidia,tegra124-car", tegra124_clock_init);
153808acae34SPaul Walmsley CLK_OF_DECLARE(tegra132, "nvidia,tegra132-car", tegra132_clock_init);
1539