19952f691SThomas Gleixner // SPDX-License-Identifier: GPL-2.0-only
276da314dSPeter De Schrijver /*
308acae34SPaul Walmsley * Copyright (c) 2012-2014 NVIDIA CORPORATION. All rights reserved.
476da314dSPeter De Schrijver */
576da314dSPeter De Schrijver
676da314dSPeter De Schrijver #include <linux/io.h>
776da314dSPeter De Schrijver #include <linux/clk-provider.h>
876da314dSPeter De Schrijver #include <linux/clkdev.h>
976da314dSPeter De Schrijver #include <linux/of.h>
1076da314dSPeter De Schrijver #include <linux/of_address.h>
1176da314dSPeter De Schrijver #include <linux/delay.h>
1276da314dSPeter De Schrijver #include <linux/export.h>
1376da314dSPeter De Schrijver #include <linux/clk/tegra.h>
1476da314dSPeter De Schrijver #include <dt-bindings/clock/tegra124-car.h>
15a3c83ff2SPaul Walmsley #include <dt-bindings/reset/tegra124-car.h>
1676da314dSPeter De Schrijver
1776da314dSPeter De Schrijver #include "clk.h"
1876da314dSPeter De Schrijver #include "clk-id.h"
1976da314dSPeter De Schrijver
2008acae34SPaul Walmsley /*
2108acae34SPaul Walmsley * TEGRA124_CAR_BANK_COUNT: the number of peripheral clock register
2208acae34SPaul Walmsley * banks present in the Tegra124/132 CAR IP block. The banks are
2308acae34SPaul Walmsley * identified by single letters, e.g.: L, H, U, V, W, X. See
2408acae34SPaul Walmsley * periph_regs[] in drivers/clk/tegra/clk.c
2508acae34SPaul Walmsley */
2608acae34SPaul Walmsley #define TEGRA124_CAR_BANK_COUNT 6
2708acae34SPaul Walmsley
2861792e40SJoseph Lo #define CLK_SOURCE_CSITE 0x1d4
2976da314dSPeter De Schrijver #define CLK_SOURCE_EMC 0x19c
30e5f8a107SThierry Reding #define CLK_SOURCE_SOR0 0x414
3176da314dSPeter De Schrijver
32a3c83ff2SPaul Walmsley #define RST_DFLL_DVCO 0x2f4
33a3c83ff2SPaul Walmsley #define DVFS_DFLL_RESET_SHIFT 0
34a3c83ff2SPaul Walmsley
3576da314dSPeter De Schrijver #define PLLC_BASE 0x80
3676da314dSPeter De Schrijver #define PLLC_OUT 0x84
3776da314dSPeter De Schrijver #define PLLC_MISC2 0x88
3876da314dSPeter De Schrijver #define PLLC_MISC 0x8c
3976da314dSPeter De Schrijver #define PLLC2_BASE 0x4e8
4076da314dSPeter De Schrijver #define PLLC2_MISC 0x4ec
4176da314dSPeter De Schrijver #define PLLC3_BASE 0x4fc
4276da314dSPeter De Schrijver #define PLLC3_MISC 0x500
4376da314dSPeter De Schrijver #define PLLM_BASE 0x90
4476da314dSPeter De Schrijver #define PLLM_OUT 0x94
4576da314dSPeter De Schrijver #define PLLM_MISC 0x9c
4676da314dSPeter De Schrijver #define PLLP_BASE 0xa0
4776da314dSPeter De Schrijver #define PLLP_MISC 0xac
4876da314dSPeter De Schrijver #define PLLA_BASE 0xb0
4976da314dSPeter De Schrijver #define PLLA_MISC 0xbc
5076da314dSPeter De Schrijver #define PLLD_BASE 0xd0
5176da314dSPeter De Schrijver #define PLLD_MISC 0xdc
5276da314dSPeter De Schrijver #define PLLU_BASE 0xc0
5376da314dSPeter De Schrijver #define PLLU_MISC 0xcc
5476da314dSPeter De Schrijver #define PLLX_BASE 0xe0
5576da314dSPeter De Schrijver #define PLLX_MISC 0xe4
5676da314dSPeter De Schrijver #define PLLX_MISC2 0x514
5776da314dSPeter De Schrijver #define PLLX_MISC3 0x518
5876da314dSPeter De Schrijver #define PLLE_BASE 0xe8
5976da314dSPeter De Schrijver #define PLLE_MISC 0xec
6076da314dSPeter De Schrijver #define PLLD2_BASE 0x4b8
6176da314dSPeter De Schrijver #define PLLD2_MISC 0x4bc
6276da314dSPeter De Schrijver #define PLLE_AUX 0x48c
6376da314dSPeter De Schrijver #define PLLRE_BASE 0x4c4
6476da314dSPeter De Schrijver #define PLLRE_MISC 0x4c8
6576da314dSPeter De Schrijver #define PLLDP_BASE 0x590
6676da314dSPeter De Schrijver #define PLLDP_MISC 0x594
6776da314dSPeter De Schrijver #define PLLC4_BASE 0x5a4
6876da314dSPeter De Schrijver #define PLLC4_MISC 0x5a8
6976da314dSPeter De Schrijver
7076da314dSPeter De Schrijver #define PLLC_IDDQ_BIT 26
7176da314dSPeter De Schrijver #define PLLRE_IDDQ_BIT 16
7276da314dSPeter De Schrijver #define PLLSS_IDDQ_BIT 19
7376da314dSPeter De Schrijver
7476da314dSPeter De Schrijver #define PLL_BASE_LOCK BIT(27)
7576da314dSPeter De Schrijver #define PLLE_MISC_LOCK BIT(11)
7676da314dSPeter De Schrijver #define PLLRE_MISC_LOCK BIT(24)
7776da314dSPeter De Schrijver
7876da314dSPeter De Schrijver #define PLL_MISC_LOCK_ENABLE 18
7976da314dSPeter De Schrijver #define PLLC_MISC_LOCK_ENABLE 24
8076da314dSPeter De Schrijver #define PLLDU_MISC_LOCK_ENABLE 22
8176da314dSPeter De Schrijver #define PLLE_MISC_LOCK_ENABLE 9
8276da314dSPeter De Schrijver #define PLLRE_MISC_LOCK_ENABLE 30
8376da314dSPeter De Schrijver #define PLLSS_MISC_LOCK_ENABLE 30
8476da314dSPeter De Schrijver
8576da314dSPeter De Schrijver #define PLLXC_SW_MAX_P 6
8676da314dSPeter De Schrijver
8776da314dSPeter De Schrijver #define PMC_PLLM_WB0_OVERRIDE 0x1dc
8876da314dSPeter De Schrijver #define PMC_PLLM_WB0_OVERRIDE_2 0x2b0
8976da314dSPeter De Schrijver
90c38864a7STuomas Tynkkynen #define CCLKG_BURST_POLICY 0x368
91c38864a7STuomas Tynkkynen
929e036d3eSJoseph Lo /* Tegra CPU clock and reset control regs */
939e036d3eSJoseph Lo #define CLK_RST_CONTROLLER_CPU_CMPLX_STATUS 0x470
949e036d3eSJoseph Lo
95e5f8a107SThierry Reding #define MASK(x) (BIT(x) - 1)
96e5f8a107SThierry Reding
97e5f8a107SThierry Reding #define MUX8_NOGATE_LOCK(_name, _parents, _offset, _clk_id, _lock) \
98e5f8a107SThierry Reding TEGRA_INIT_DATA_TABLE(_name, NULL, NULL, _parents, _offset, \
99e5f8a107SThierry Reding 29, MASK(3), 0, 0, 8, 1, TEGRA_DIVIDER_ROUND_UP,\
100e5f8a107SThierry Reding 0, TEGRA_PERIPH_NO_GATE, _clk_id,\
101e5f8a107SThierry Reding _parents##_idx, 0, _lock)
102e5f8a107SThierry Reding
103e5f8a107SThierry Reding #define NODIV(_name, _parents, _offset, \
104e5f8a107SThierry Reding _mux_shift, _mux_mask, _clk_num, \
105e5f8a107SThierry Reding _gate_flags, _clk_id, _lock) \
106e5f8a107SThierry Reding TEGRA_INIT_DATA_TABLE(_name, NULL, NULL, _parents, _offset,\
107e5f8a107SThierry Reding _mux_shift, _mux_mask, 0, 0, 0, 0, 0,\
108e5f8a107SThierry Reding _clk_num, (_gate_flags) | TEGRA_PERIPH_NO_DIV,\
109e5f8a107SThierry Reding _clk_id, _parents##_idx, 0, _lock)
110e5f8a107SThierry Reding
11161792e40SJoseph Lo #ifdef CONFIG_PM_SLEEP
11261792e40SJoseph Lo static struct cpu_clk_suspend_context {
11361792e40SJoseph Lo u32 clk_csite_src;
114c38864a7STuomas Tynkkynen u32 cclkg_burst;
115c38864a7STuomas Tynkkynen u32 cclkg_divider;
11661792e40SJoseph Lo } tegra124_cpu_clk_sctx;
11761792e40SJoseph Lo #endif
11861792e40SJoseph Lo
11976da314dSPeter De Schrijver static void __iomem *clk_base;
12076da314dSPeter De Schrijver static void __iomem *pmc_base;
12176da314dSPeter De Schrijver
12276da314dSPeter De Schrijver static unsigned long osc_freq;
12376da314dSPeter De Schrijver static unsigned long pll_ref_freq;
12476da314dSPeter De Schrijver
12576da314dSPeter De Schrijver static DEFINE_SPINLOCK(pll_d_lock);
12676da314dSPeter De Schrijver static DEFINE_SPINLOCK(pll_e_lock);
12776da314dSPeter De Schrijver static DEFINE_SPINLOCK(pll_re_lock);
12876da314dSPeter De Schrijver static DEFINE_SPINLOCK(pll_u_lock);
1294f4f85faSThierry Reding static DEFINE_SPINLOCK(emc_lock);
130e5f8a107SThierry Reding static DEFINE_SPINLOCK(sor0_lock);
13176da314dSPeter De Schrijver
13276da314dSPeter De Schrijver /* possible OSC frequencies in Hz */
13376da314dSPeter De Schrijver static unsigned long tegra124_input_freq[] = {
13476da314dSPeter De Schrijver [ 0] = 13000000,
13576da314dSPeter De Schrijver [ 1] = 16800000,
13676da314dSPeter De Schrijver [ 4] = 19200000,
13776da314dSPeter De Schrijver [ 5] = 38400000,
13876da314dSPeter De Schrijver [ 8] = 12000000,
13976da314dSPeter De Schrijver [ 9] = 48000000,
140c4947e36SThierry Reding [12] = 26000000,
14176da314dSPeter De Schrijver };
14276da314dSPeter De Schrijver
14376da314dSPeter De Schrijver static struct div_nmp pllxc_nmp = {
14476da314dSPeter De Schrijver .divm_shift = 0,
14576da314dSPeter De Schrijver .divm_width = 8,
14676da314dSPeter De Schrijver .divn_shift = 8,
14776da314dSPeter De Schrijver .divn_width = 8,
14876da314dSPeter De Schrijver .divp_shift = 20,
14976da314dSPeter De Schrijver .divp_width = 4,
15076da314dSPeter De Schrijver };
15176da314dSPeter De Schrijver
152385f9adfSThierry Reding static const struct pdiv_map pllxc_p[] = {
15376da314dSPeter De Schrijver { .pdiv = 1, .hw_val = 0 },
15476da314dSPeter De Schrijver { .pdiv = 2, .hw_val = 1 },
15576da314dSPeter De Schrijver { .pdiv = 3, .hw_val = 2 },
15676da314dSPeter De Schrijver { .pdiv = 4, .hw_val = 3 },
15776da314dSPeter De Schrijver { .pdiv = 5, .hw_val = 4 },
15876da314dSPeter De Schrijver { .pdiv = 6, .hw_val = 5 },
15976da314dSPeter De Schrijver { .pdiv = 8, .hw_val = 6 },
16076da314dSPeter De Schrijver { .pdiv = 10, .hw_val = 7 },
16176da314dSPeter De Schrijver { .pdiv = 12, .hw_val = 8 },
16276da314dSPeter De Schrijver { .pdiv = 16, .hw_val = 9 },
16376da314dSPeter De Schrijver { .pdiv = 12, .hw_val = 10 },
16476da314dSPeter De Schrijver { .pdiv = 16, .hw_val = 11 },
16576da314dSPeter De Schrijver { .pdiv = 20, .hw_val = 12 },
16676da314dSPeter De Schrijver { .pdiv = 24, .hw_val = 13 },
16776da314dSPeter De Schrijver { .pdiv = 32, .hw_val = 14 },
16876da314dSPeter De Schrijver { .pdiv = 0, .hw_val = 0 },
16976da314dSPeter De Schrijver };
17076da314dSPeter De Schrijver
17176da314dSPeter De Schrijver static struct tegra_clk_pll_freq_table pll_x_freq_table[] = {
17276da314dSPeter De Schrijver /* 1 GHz */
17386c679a5SRhyland Klein { 12000000, 1000000000, 83, 1, 1, 0 }, /* actual: 996.0 MHz */
17486c679a5SRhyland Klein { 13000000, 1000000000, 76, 1, 1, 0 }, /* actual: 988.0 MHz */
17586c679a5SRhyland Klein { 16800000, 1000000000, 59, 1, 1, 0 }, /* actual: 991.2 MHz */
17686c679a5SRhyland Klein { 19200000, 1000000000, 52, 1, 1, 0 }, /* actual: 998.4 MHz */
17786c679a5SRhyland Klein { 26000000, 1000000000, 76, 2, 1, 0 }, /* actual: 988.0 MHz */
17876da314dSPeter De Schrijver { 0, 0, 0, 0, 0, 0 },
17976da314dSPeter De Schrijver };
18076da314dSPeter De Schrijver
18176da314dSPeter De Schrijver static struct tegra_clk_pll_params pll_x_params = {
18276da314dSPeter De Schrijver .input_min = 12000000,
18376da314dSPeter De Schrijver .input_max = 800000000,
18476da314dSPeter De Schrijver .cf_min = 12000000,
18576da314dSPeter De Schrijver .cf_max = 19200000, /* s/w policy, h/w capability 50 MHz */
18676da314dSPeter De Schrijver .vco_min = 700000000,
18776da314dSPeter De Schrijver .vco_max = 3000000000UL,
18876da314dSPeter De Schrijver .base_reg = PLLX_BASE,
18976da314dSPeter De Schrijver .misc_reg = PLLX_MISC,
19076da314dSPeter De Schrijver .lock_mask = PLL_BASE_LOCK,
19176da314dSPeter De Schrijver .lock_enable_bit_idx = PLL_MISC_LOCK_ENABLE,
19276da314dSPeter De Schrijver .lock_delay = 300,
19376da314dSPeter De Schrijver .iddq_reg = PLLX_MISC3,
19476da314dSPeter De Schrijver .iddq_bit_idx = 3,
19576da314dSPeter De Schrijver .max_p = 6,
19676da314dSPeter De Schrijver .dyn_ramp_reg = PLLX_MISC2,
19776da314dSPeter De Schrijver .stepa_shift = 16,
19876da314dSPeter De Schrijver .stepb_shift = 24,
19976da314dSPeter De Schrijver .pdiv_tohw = pllxc_p,
20076da314dSPeter De Schrijver .div_nmp = &pllxc_nmp,
20176da314dSPeter De Schrijver .freq_table = pll_x_freq_table,
2023706b436SRhyland Klein .flags = TEGRA_PLL_USE_LOCK | TEGRA_PLL_HAS_LOCK_ENABLE,
20376da314dSPeter De Schrijver };
20476da314dSPeter De Schrijver
20576da314dSPeter De Schrijver static struct tegra_clk_pll_freq_table pll_c_freq_table[] = {
2068d99704fSThierry Reding { 12000000, 624000000, 104, 1, 2, 0 },
2078d99704fSThierry Reding { 12000000, 600000000, 100, 1, 2, 0 },
2088d99704fSThierry Reding { 13000000, 600000000, 92, 1, 2, 0 }, /* actual: 598.0 MHz */
2098d99704fSThierry Reding { 16800000, 600000000, 71, 1, 2, 0 }, /* actual: 596.4 MHz */
2108d99704fSThierry Reding { 19200000, 600000000, 62, 1, 2, 0 }, /* actual: 595.2 MHz */
2118d99704fSThierry Reding { 26000000, 600000000, 92, 2, 2, 0 }, /* actual: 598.0 MHz */
21276da314dSPeter De Schrijver { 0, 0, 0, 0, 0, 0 },
21376da314dSPeter De Schrijver };
21476da314dSPeter De Schrijver
21576da314dSPeter De Schrijver static struct tegra_clk_pll_params pll_c_params = {
21676da314dSPeter De Schrijver .input_min = 12000000,
21776da314dSPeter De Schrijver .input_max = 800000000,
21876da314dSPeter De Schrijver .cf_min = 12000000,
21976da314dSPeter De Schrijver .cf_max = 19200000, /* s/w policy, h/w capability 50 MHz */
22076da314dSPeter De Schrijver .vco_min = 600000000,
22176da314dSPeter De Schrijver .vco_max = 1400000000,
22276da314dSPeter De Schrijver .base_reg = PLLC_BASE,
22376da314dSPeter De Schrijver .misc_reg = PLLC_MISC,
22476da314dSPeter De Schrijver .lock_mask = PLL_BASE_LOCK,
22576da314dSPeter De Schrijver .lock_enable_bit_idx = PLLC_MISC_LOCK_ENABLE,
22676da314dSPeter De Schrijver .lock_delay = 300,
22776da314dSPeter De Schrijver .iddq_reg = PLLC_MISC,
22876da314dSPeter De Schrijver .iddq_bit_idx = PLLC_IDDQ_BIT,
22976da314dSPeter De Schrijver .max_p = PLLXC_SW_MAX_P,
23076da314dSPeter De Schrijver .dyn_ramp_reg = PLLC_MISC2,
23176da314dSPeter De Schrijver .stepa_shift = 17,
23276da314dSPeter De Schrijver .stepb_shift = 9,
23376da314dSPeter De Schrijver .pdiv_tohw = pllxc_p,
23476da314dSPeter De Schrijver .div_nmp = &pllxc_nmp,
23576da314dSPeter De Schrijver .freq_table = pll_c_freq_table,
2363706b436SRhyland Klein .flags = TEGRA_PLL_USE_LOCK | TEGRA_PLL_HAS_LOCK_ENABLE,
23776da314dSPeter De Schrijver };
23876da314dSPeter De Schrijver
23976da314dSPeter De Schrijver static struct div_nmp pllcx_nmp = {
24076da314dSPeter De Schrijver .divm_shift = 0,
24176da314dSPeter De Schrijver .divm_width = 2,
24276da314dSPeter De Schrijver .divn_shift = 8,
24376da314dSPeter De Schrijver .divn_width = 8,
24476da314dSPeter De Schrijver .divp_shift = 20,
24576da314dSPeter De Schrijver .divp_width = 3,
24676da314dSPeter De Schrijver };
24776da314dSPeter De Schrijver
248385f9adfSThierry Reding static const struct pdiv_map pllc_p[] = {
24976da314dSPeter De Schrijver { .pdiv = 1, .hw_val = 0 },
25076da314dSPeter De Schrijver { .pdiv = 2, .hw_val = 1 },
25176da314dSPeter De Schrijver { .pdiv = 3, .hw_val = 2 },
25276da314dSPeter De Schrijver { .pdiv = 4, .hw_val = 3 },
25376da314dSPeter De Schrijver { .pdiv = 6, .hw_val = 4 },
25476da314dSPeter De Schrijver { .pdiv = 8, .hw_val = 5 },
25576da314dSPeter De Schrijver { .pdiv = 12, .hw_val = 6 },
25676da314dSPeter De Schrijver { .pdiv = 16, .hw_val = 7 },
25776da314dSPeter De Schrijver { .pdiv = 0, .hw_val = 0 },
25876da314dSPeter De Schrijver };
25976da314dSPeter De Schrijver
26076da314dSPeter De Schrijver static struct tegra_clk_pll_freq_table pll_cx_freq_table[] = {
2618d99704fSThierry Reding { 12000000, 600000000, 100, 1, 2, 0 },
2628d99704fSThierry Reding { 13000000, 600000000, 92, 1, 2, 0 }, /* actual: 598.0 MHz */
2638d99704fSThierry Reding { 16800000, 600000000, 71, 1, 2, 0 }, /* actual: 596.4 MHz */
2648d99704fSThierry Reding { 19200000, 600000000, 62, 1, 2, 0 }, /* actual: 595.2 MHz */
2658d99704fSThierry Reding { 26000000, 600000000, 92, 2, 2, 0 }, /* actual: 598.0 MHz */
26676da314dSPeter De Schrijver { 0, 0, 0, 0, 0, 0 },
26776da314dSPeter De Schrijver };
26876da314dSPeter De Schrijver
26976da314dSPeter De Schrijver static struct tegra_clk_pll_params pll_c2_params = {
27076da314dSPeter De Schrijver .input_min = 12000000,
27176da314dSPeter De Schrijver .input_max = 48000000,
27276da314dSPeter De Schrijver .cf_min = 12000000,
27376da314dSPeter De Schrijver .cf_max = 19200000,
27476da314dSPeter De Schrijver .vco_min = 600000000,
27576da314dSPeter De Schrijver .vco_max = 1200000000,
27676da314dSPeter De Schrijver .base_reg = PLLC2_BASE,
27776da314dSPeter De Schrijver .misc_reg = PLLC2_MISC,
27876da314dSPeter De Schrijver .lock_mask = PLL_BASE_LOCK,
27976da314dSPeter De Schrijver .lock_enable_bit_idx = PLL_MISC_LOCK_ENABLE,
28076da314dSPeter De Schrijver .lock_delay = 300,
28176da314dSPeter De Schrijver .pdiv_tohw = pllc_p,
28276da314dSPeter De Schrijver .div_nmp = &pllcx_nmp,
28376da314dSPeter De Schrijver .max_p = 7,
28476da314dSPeter De Schrijver .ext_misc_reg[0] = 0x4f0,
28576da314dSPeter De Schrijver .ext_misc_reg[1] = 0x4f4,
28676da314dSPeter De Schrijver .ext_misc_reg[2] = 0x4f8,
28776da314dSPeter De Schrijver .freq_table = pll_cx_freq_table,
28876da314dSPeter De Schrijver .flags = TEGRA_PLL_USE_LOCK,
28976da314dSPeter De Schrijver };
29076da314dSPeter De Schrijver
29176da314dSPeter De Schrijver static struct tegra_clk_pll_params pll_c3_params = {
29276da314dSPeter De Schrijver .input_min = 12000000,
29376da314dSPeter De Schrijver .input_max = 48000000,
29476da314dSPeter De Schrijver .cf_min = 12000000,
29576da314dSPeter De Schrijver .cf_max = 19200000,
29676da314dSPeter De Schrijver .vco_min = 600000000,
29776da314dSPeter De Schrijver .vco_max = 1200000000,
29876da314dSPeter De Schrijver .base_reg = PLLC3_BASE,
29976da314dSPeter De Schrijver .misc_reg = PLLC3_MISC,
30076da314dSPeter De Schrijver .lock_mask = PLL_BASE_LOCK,
30176da314dSPeter De Schrijver .lock_enable_bit_idx = PLL_MISC_LOCK_ENABLE,
30276da314dSPeter De Schrijver .lock_delay = 300,
30376da314dSPeter De Schrijver .pdiv_tohw = pllc_p,
30476da314dSPeter De Schrijver .div_nmp = &pllcx_nmp,
30576da314dSPeter De Schrijver .max_p = 7,
30676da314dSPeter De Schrijver .ext_misc_reg[0] = 0x504,
30776da314dSPeter De Schrijver .ext_misc_reg[1] = 0x508,
30876da314dSPeter De Schrijver .ext_misc_reg[2] = 0x50c,
30976da314dSPeter De Schrijver .freq_table = pll_cx_freq_table,
31076da314dSPeter De Schrijver .flags = TEGRA_PLL_USE_LOCK,
31176da314dSPeter De Schrijver };
31276da314dSPeter De Schrijver
31376da314dSPeter De Schrijver static struct div_nmp pllss_nmp = {
31476da314dSPeter De Schrijver .divm_shift = 0,
31576da314dSPeter De Schrijver .divm_width = 8,
31676da314dSPeter De Schrijver .divn_shift = 8,
31776da314dSPeter De Schrijver .divn_width = 8,
31876da314dSPeter De Schrijver .divp_shift = 20,
31976da314dSPeter De Schrijver .divp_width = 4,
32076da314dSPeter De Schrijver };
32176da314dSPeter De Schrijver
322385f9adfSThierry Reding static const struct pdiv_map pll12g_ssd_esd_p[] = {
32376da314dSPeter De Schrijver { .pdiv = 1, .hw_val = 0 },
32476da314dSPeter De Schrijver { .pdiv = 2, .hw_val = 1 },
32576da314dSPeter De Schrijver { .pdiv = 3, .hw_val = 2 },
32676da314dSPeter De Schrijver { .pdiv = 4, .hw_val = 3 },
32776da314dSPeter De Schrijver { .pdiv = 5, .hw_val = 4 },
32876da314dSPeter De Schrijver { .pdiv = 6, .hw_val = 5 },
32976da314dSPeter De Schrijver { .pdiv = 8, .hw_val = 6 },
33076da314dSPeter De Schrijver { .pdiv = 10, .hw_val = 7 },
33176da314dSPeter De Schrijver { .pdiv = 12, .hw_val = 8 },
33276da314dSPeter De Schrijver { .pdiv = 16, .hw_val = 9 },
33376da314dSPeter De Schrijver { .pdiv = 12, .hw_val = 10 },
33476da314dSPeter De Schrijver { .pdiv = 16, .hw_val = 11 },
33576da314dSPeter De Schrijver { .pdiv = 20, .hw_val = 12 },
33676da314dSPeter De Schrijver { .pdiv = 24, .hw_val = 13 },
33776da314dSPeter De Schrijver { .pdiv = 32, .hw_val = 14 },
33876da314dSPeter De Schrijver { .pdiv = 0, .hw_val = 0 },
33976da314dSPeter De Schrijver };
34076da314dSPeter De Schrijver
34176da314dSPeter De Schrijver static struct tegra_clk_pll_freq_table pll_c4_freq_table[] = {
34286c679a5SRhyland Klein { 12000000, 600000000, 100, 1, 2, 0 },
34386c679a5SRhyland Klein { 13000000, 600000000, 92, 1, 2, 0 }, /* actual: 598.0 MHz */
34486c679a5SRhyland Klein { 16800000, 600000000, 71, 1, 2, 0 }, /* actual: 596.4 MHz */
34586c679a5SRhyland Klein { 19200000, 600000000, 62, 1, 2, 0 }, /* actual: 595.2 MHz */
34686c679a5SRhyland Klein { 26000000, 600000000, 92, 2, 2, 0 }, /* actual: 598.0 MHz */
34776da314dSPeter De Schrijver { 0, 0, 0, 0, 0, 0 },
34876da314dSPeter De Schrijver };
34976da314dSPeter De Schrijver
35076da314dSPeter De Schrijver static struct tegra_clk_pll_params pll_c4_params = {
35176da314dSPeter De Schrijver .input_min = 12000000,
35276da314dSPeter De Schrijver .input_max = 1000000000,
35376da314dSPeter De Schrijver .cf_min = 12000000,
35476da314dSPeter De Schrijver .cf_max = 19200000, /* s/w policy, h/w capability 38 MHz */
35576da314dSPeter De Schrijver .vco_min = 600000000,
35676da314dSPeter De Schrijver .vco_max = 1200000000,
35776da314dSPeter De Schrijver .base_reg = PLLC4_BASE,
35876da314dSPeter De Schrijver .misc_reg = PLLC4_MISC,
35976da314dSPeter De Schrijver .lock_mask = PLL_BASE_LOCK,
36076da314dSPeter De Schrijver .lock_enable_bit_idx = PLLSS_MISC_LOCK_ENABLE,
36176da314dSPeter De Schrijver .lock_delay = 300,
36276da314dSPeter De Schrijver .iddq_reg = PLLC4_BASE,
36376da314dSPeter De Schrijver .iddq_bit_idx = PLLSS_IDDQ_BIT,
36476da314dSPeter De Schrijver .pdiv_tohw = pll12g_ssd_esd_p,
36576da314dSPeter De Schrijver .div_nmp = &pllss_nmp,
36676da314dSPeter De Schrijver .ext_misc_reg[0] = 0x5ac,
36776da314dSPeter De Schrijver .ext_misc_reg[1] = 0x5b0,
36876da314dSPeter De Schrijver .ext_misc_reg[2] = 0x5b4,
36976da314dSPeter De Schrijver .freq_table = pll_c4_freq_table,
3703706b436SRhyland Klein .flags = TEGRA_PLL_USE_LOCK | TEGRA_PLL_HAS_LOCK_ENABLE,
37176da314dSPeter De Schrijver };
37276da314dSPeter De Schrijver
373385f9adfSThierry Reding static const struct pdiv_map pllm_p[] = {
37476da314dSPeter De Schrijver { .pdiv = 1, .hw_val = 0 },
37576da314dSPeter De Schrijver { .pdiv = 2, .hw_val = 1 },
37686c679a5SRhyland Klein { .pdiv = 3, .hw_val = 2 },
37786c679a5SRhyland Klein { .pdiv = 4, .hw_val = 3 },
37886c679a5SRhyland Klein { .pdiv = 5, .hw_val = 4 },
37986c679a5SRhyland Klein { .pdiv = 6, .hw_val = 5 },
38086c679a5SRhyland Klein { .pdiv = 8, .hw_val = 6 },
38186c679a5SRhyland Klein { .pdiv = 10, .hw_val = 7 },
38286c679a5SRhyland Klein { .pdiv = 12, .hw_val = 8 },
38386c679a5SRhyland Klein { .pdiv = 16, .hw_val = 9 },
38486c679a5SRhyland Klein { .pdiv = 12, .hw_val = 10 },
38586c679a5SRhyland Klein { .pdiv = 16, .hw_val = 11 },
38686c679a5SRhyland Klein { .pdiv = 20, .hw_val = 12 },
38786c679a5SRhyland Klein { .pdiv = 24, .hw_val = 13 },
38886c679a5SRhyland Klein { .pdiv = 32, .hw_val = 14 },
38976da314dSPeter De Schrijver { .pdiv = 0, .hw_val = 0 },
39076da314dSPeter De Schrijver };
39176da314dSPeter De Schrijver
39276da314dSPeter De Schrijver static struct tegra_clk_pll_freq_table pll_m_freq_table[] = {
3938d99704fSThierry Reding { 12000000, 800000000, 66, 1, 1, 0 }, /* actual: 792.0 MHz */
3948d99704fSThierry Reding { 13000000, 800000000, 61, 1, 1, 0 }, /* actual: 793.0 MHz */
3958d99704fSThierry Reding { 16800000, 800000000, 47, 1, 1, 0 }, /* actual: 789.6 MHz */
3968d99704fSThierry Reding { 19200000, 800000000, 41, 1, 1, 0 }, /* actual: 787.2 MHz */
3978d99704fSThierry Reding { 26000000, 800000000, 61, 2, 1, 0 }, /* actual: 793.0 MHz */
39876da314dSPeter De Schrijver { 0, 0, 0, 0, 0, 0},
39976da314dSPeter De Schrijver };
40076da314dSPeter De Schrijver
40176da314dSPeter De Schrijver static struct div_nmp pllm_nmp = {
40276da314dSPeter De Schrijver .divm_shift = 0,
40376da314dSPeter De Schrijver .divm_width = 8,
40476da314dSPeter De Schrijver .override_divm_shift = 0,
40576da314dSPeter De Schrijver .divn_shift = 8,
40676da314dSPeter De Schrijver .divn_width = 8,
40776da314dSPeter De Schrijver .override_divn_shift = 8,
40876da314dSPeter De Schrijver .divp_shift = 20,
40976da314dSPeter De Schrijver .divp_width = 1,
41076da314dSPeter De Schrijver .override_divp_shift = 27,
41176da314dSPeter De Schrijver };
41276da314dSPeter De Schrijver
41376da314dSPeter De Schrijver static struct tegra_clk_pll_params pll_m_params = {
41476da314dSPeter De Schrijver .input_min = 12000000,
41576da314dSPeter De Schrijver .input_max = 500000000,
41676da314dSPeter De Schrijver .cf_min = 12000000,
41776da314dSPeter De Schrijver .cf_max = 19200000, /* s/w policy, h/w capability 50 MHz */
41876da314dSPeter De Schrijver .vco_min = 400000000,
41976da314dSPeter De Schrijver .vco_max = 1066000000,
42076da314dSPeter De Schrijver .base_reg = PLLM_BASE,
42176da314dSPeter De Schrijver .misc_reg = PLLM_MISC,
42276da314dSPeter De Schrijver .lock_mask = PLL_BASE_LOCK,
42376da314dSPeter De Schrijver .lock_delay = 300,
42486c679a5SRhyland Klein .max_p = 5,
42576da314dSPeter De Schrijver .pdiv_tohw = pllm_p,
42676da314dSPeter De Schrijver .div_nmp = &pllm_nmp,
42776da314dSPeter De Schrijver .pmc_divnm_reg = PMC_PLLM_WB0_OVERRIDE,
42876da314dSPeter De Schrijver .pmc_divp_reg = PMC_PLLM_WB0_OVERRIDE_2,
42976da314dSPeter De Schrijver .freq_table = pll_m_freq_table,
430449c695dSDmitry Osipenko .flags = TEGRA_PLL_USE_LOCK,
43176da314dSPeter De Schrijver };
43276da314dSPeter De Schrijver
43376da314dSPeter De Schrijver static struct tegra_clk_pll_freq_table pll_e_freq_table[] = {
43476da314dSPeter De Schrijver /* PLLE special case: use cpcon field to store cml divider value */
43576da314dSPeter De Schrijver { 336000000, 100000000, 100, 21, 16, 11 },
43676da314dSPeter De Schrijver { 312000000, 100000000, 200, 26, 24, 13 },
43776da314dSPeter De Schrijver { 13000000, 100000000, 200, 1, 26, 13 },
43876da314dSPeter De Schrijver { 12000000, 100000000, 200, 1, 24, 13 },
43976da314dSPeter De Schrijver { 0, 0, 0, 0, 0, 0 },
44076da314dSPeter De Schrijver };
44176da314dSPeter De Schrijver
44286c679a5SRhyland Klein static const struct pdiv_map plle_p[] = {
44386c679a5SRhyland Klein { .pdiv = 1, .hw_val = 0 },
44486c679a5SRhyland Klein { .pdiv = 2, .hw_val = 1 },
44586c679a5SRhyland Klein { .pdiv = 3, .hw_val = 2 },
44686c679a5SRhyland Klein { .pdiv = 4, .hw_val = 3 },
44786c679a5SRhyland Klein { .pdiv = 5, .hw_val = 4 },
44886c679a5SRhyland Klein { .pdiv = 6, .hw_val = 5 },
44986c679a5SRhyland Klein { .pdiv = 8, .hw_val = 6 },
45086c679a5SRhyland Klein { .pdiv = 10, .hw_val = 7 },
45186c679a5SRhyland Klein { .pdiv = 12, .hw_val = 8 },
45286c679a5SRhyland Klein { .pdiv = 16, .hw_val = 9 },
45386c679a5SRhyland Klein { .pdiv = 12, .hw_val = 10 },
45486c679a5SRhyland Klein { .pdiv = 16, .hw_val = 11 },
45586c679a5SRhyland Klein { .pdiv = 20, .hw_val = 12 },
45686c679a5SRhyland Klein { .pdiv = 24, .hw_val = 13 },
45786c679a5SRhyland Klein { .pdiv = 32, .hw_val = 14 },
45886c679a5SRhyland Klein { .pdiv = 1, .hw_val = 0 },
45986c679a5SRhyland Klein };
46086c679a5SRhyland Klein
46176da314dSPeter De Schrijver static struct div_nmp plle_nmp = {
46276da314dSPeter De Schrijver .divm_shift = 0,
46376da314dSPeter De Schrijver .divm_width = 8,
46476da314dSPeter De Schrijver .divn_shift = 8,
46576da314dSPeter De Schrijver .divn_width = 8,
46676da314dSPeter De Schrijver .divp_shift = 24,
46776da314dSPeter De Schrijver .divp_width = 4,
46876da314dSPeter De Schrijver };
46976da314dSPeter De Schrijver
47076da314dSPeter De Schrijver static struct tegra_clk_pll_params pll_e_params = {
47176da314dSPeter De Schrijver .input_min = 12000000,
47276da314dSPeter De Schrijver .input_max = 1000000000,
47376da314dSPeter De Schrijver .cf_min = 12000000,
47476da314dSPeter De Schrijver .cf_max = 75000000,
47576da314dSPeter De Schrijver .vco_min = 1600000000,
47676da314dSPeter De Schrijver .vco_max = 2400000000U,
47776da314dSPeter De Schrijver .base_reg = PLLE_BASE,
47876da314dSPeter De Schrijver .misc_reg = PLLE_MISC,
47976da314dSPeter De Schrijver .aux_reg = PLLE_AUX,
48076da314dSPeter De Schrijver .lock_mask = PLLE_MISC_LOCK,
48176da314dSPeter De Schrijver .lock_enable_bit_idx = PLLE_MISC_LOCK_ENABLE,
48276da314dSPeter De Schrijver .lock_delay = 300,
48386c679a5SRhyland Klein .pdiv_tohw = plle_p,
48476da314dSPeter De Schrijver .div_nmp = &plle_nmp,
48576da314dSPeter De Schrijver .freq_table = pll_e_freq_table,
4863706b436SRhyland Klein .flags = TEGRA_PLL_FIXED | TEGRA_PLL_HAS_LOCK_ENABLE,
48776da314dSPeter De Schrijver .fixed_rate = 100000000,
48876da314dSPeter De Schrijver };
48976da314dSPeter De Schrijver
49076da314dSPeter De Schrijver static const struct clk_div_table pll_re_div_table[] = {
49176da314dSPeter De Schrijver { .val = 0, .div = 1 },
49276da314dSPeter De Schrijver { .val = 1, .div = 2 },
49376da314dSPeter De Schrijver { .val = 2, .div = 3 },
49476da314dSPeter De Schrijver { .val = 3, .div = 4 },
49576da314dSPeter De Schrijver { .val = 4, .div = 5 },
49676da314dSPeter De Schrijver { .val = 5, .div = 6 },
49776da314dSPeter De Schrijver { .val = 0, .div = 0 },
49876da314dSPeter De Schrijver };
49976da314dSPeter De Schrijver
50076da314dSPeter De Schrijver static struct div_nmp pllre_nmp = {
50176da314dSPeter De Schrijver .divm_shift = 0,
50276da314dSPeter De Schrijver .divm_width = 8,
50376da314dSPeter De Schrijver .divn_shift = 8,
50476da314dSPeter De Schrijver .divn_width = 8,
50576da314dSPeter De Schrijver .divp_shift = 16,
50676da314dSPeter De Schrijver .divp_width = 4,
50776da314dSPeter De Schrijver };
50876da314dSPeter De Schrijver
50976da314dSPeter De Schrijver static struct tegra_clk_pll_params pll_re_vco_params = {
51076da314dSPeter De Schrijver .input_min = 12000000,
51176da314dSPeter De Schrijver .input_max = 1000000000,
51276da314dSPeter De Schrijver .cf_min = 12000000,
51376da314dSPeter De Schrijver .cf_max = 19200000, /* s/w policy, h/w capability 38 MHz */
51476da314dSPeter De Schrijver .vco_min = 300000000,
51576da314dSPeter De Schrijver .vco_max = 600000000,
51676da314dSPeter De Schrijver .base_reg = PLLRE_BASE,
51776da314dSPeter De Schrijver .misc_reg = PLLRE_MISC,
51876da314dSPeter De Schrijver .lock_mask = PLLRE_MISC_LOCK,
51976da314dSPeter De Schrijver .lock_enable_bit_idx = PLLRE_MISC_LOCK_ENABLE,
52076da314dSPeter De Schrijver .lock_delay = 300,
52176da314dSPeter De Schrijver .iddq_reg = PLLRE_MISC,
52276da314dSPeter De Schrijver .iddq_bit_idx = PLLRE_IDDQ_BIT,
52376da314dSPeter De Schrijver .div_nmp = &pllre_nmp,
5243706b436SRhyland Klein .flags = TEGRA_PLL_USE_LOCK | TEGRA_PLL_HAS_LOCK_ENABLE |
5253706b436SRhyland Klein TEGRA_PLL_LOCK_MISC,
52676da314dSPeter De Schrijver };
52776da314dSPeter De Schrijver
52876da314dSPeter De Schrijver static struct div_nmp pllp_nmp = {
52976da314dSPeter De Schrijver .divm_shift = 0,
53076da314dSPeter De Schrijver .divm_width = 5,
53176da314dSPeter De Schrijver .divn_shift = 8,
53276da314dSPeter De Schrijver .divn_width = 10,
53376da314dSPeter De Schrijver .divp_shift = 20,
53476da314dSPeter De Schrijver .divp_width = 3,
53576da314dSPeter De Schrijver };
53676da314dSPeter De Schrijver
53776da314dSPeter De Schrijver static struct tegra_clk_pll_freq_table pll_p_freq_table[] = {
53886c679a5SRhyland Klein { 12000000, 408000000, 408, 12, 1, 8 },
53986c679a5SRhyland Klein { 13000000, 408000000, 408, 13, 1, 8 },
54086c679a5SRhyland Klein { 16800000, 408000000, 340, 14, 1, 8 },
54186c679a5SRhyland Klein { 19200000, 408000000, 340, 16, 1, 8 },
54286c679a5SRhyland Klein { 26000000, 408000000, 408, 26, 1, 8 },
54376da314dSPeter De Schrijver { 0, 0, 0, 0, 0, 0 },
54476da314dSPeter De Schrijver };
54576da314dSPeter De Schrijver
54676da314dSPeter De Schrijver static struct tegra_clk_pll_params pll_p_params = {
54776da314dSPeter De Schrijver .input_min = 2000000,
54876da314dSPeter De Schrijver .input_max = 31000000,
54976da314dSPeter De Schrijver .cf_min = 1000000,
55076da314dSPeter De Schrijver .cf_max = 6000000,
55176da314dSPeter De Schrijver .vco_min = 200000000,
55276da314dSPeter De Schrijver .vco_max = 700000000,
55376da314dSPeter De Schrijver .base_reg = PLLP_BASE,
55476da314dSPeter De Schrijver .misc_reg = PLLP_MISC,
55576da314dSPeter De Schrijver .lock_mask = PLL_BASE_LOCK,
55676da314dSPeter De Schrijver .lock_enable_bit_idx = PLL_MISC_LOCK_ENABLE,
55776da314dSPeter De Schrijver .lock_delay = 300,
55876da314dSPeter De Schrijver .div_nmp = &pllp_nmp,
55976da314dSPeter De Schrijver .freq_table = pll_p_freq_table,
56076da314dSPeter De Schrijver .fixed_rate = 408000000,
5613706b436SRhyland Klein .flags = TEGRA_PLL_FIXED | TEGRA_PLL_USE_LOCK |
5623706b436SRhyland Klein TEGRA_PLL_HAS_LOCK_ENABLE,
56376da314dSPeter De Schrijver };
56476da314dSPeter De Schrijver
56576da314dSPeter De Schrijver static struct tegra_clk_pll_freq_table pll_a_freq_table[] = {
56686c679a5SRhyland Klein { 9600000, 282240000, 147, 5, 1, 4 },
56786c679a5SRhyland Klein { 9600000, 368640000, 192, 5, 1, 4 },
56886c679a5SRhyland Klein { 9600000, 240000000, 200, 8, 1, 8 },
56986c679a5SRhyland Klein { 28800000, 282240000, 245, 25, 1, 8 },
57086c679a5SRhyland Klein { 28800000, 368640000, 320, 25, 1, 8 },
57186c679a5SRhyland Klein { 28800000, 240000000, 200, 24, 1, 8 },
57276da314dSPeter De Schrijver { 0, 0, 0, 0, 0, 0 },
57376da314dSPeter De Schrijver };
57476da314dSPeter De Schrijver
57576da314dSPeter De Schrijver static struct tegra_clk_pll_params pll_a_params = {
57676da314dSPeter De Schrijver .input_min = 2000000,
57776da314dSPeter De Schrijver .input_max = 31000000,
57876da314dSPeter De Schrijver .cf_min = 1000000,
57976da314dSPeter De Schrijver .cf_max = 6000000,
58076da314dSPeter De Schrijver .vco_min = 200000000,
58176da314dSPeter De Schrijver .vco_max = 700000000,
58276da314dSPeter De Schrijver .base_reg = PLLA_BASE,
58376da314dSPeter De Schrijver .misc_reg = PLLA_MISC,
58476da314dSPeter De Schrijver .lock_mask = PLL_BASE_LOCK,
58576da314dSPeter De Schrijver .lock_enable_bit_idx = PLL_MISC_LOCK_ENABLE,
58676da314dSPeter De Schrijver .lock_delay = 300,
58776da314dSPeter De Schrijver .div_nmp = &pllp_nmp,
58876da314dSPeter De Schrijver .freq_table = pll_a_freq_table,
5893706b436SRhyland Klein .flags = TEGRA_PLL_HAS_CPCON | TEGRA_PLL_USE_LOCK |
5903706b436SRhyland Klein TEGRA_PLL_HAS_LOCK_ENABLE,
59176da314dSPeter De Schrijver };
59276da314dSPeter De Schrijver
59367fc26bfSRhyland Klein static struct div_nmp plld_nmp = {
59467fc26bfSRhyland Klein .divm_shift = 0,
59567fc26bfSRhyland Klein .divm_width = 5,
59667fc26bfSRhyland Klein .divn_shift = 8,
59767fc26bfSRhyland Klein .divn_width = 11,
59867fc26bfSRhyland Klein .divp_shift = 20,
59967fc26bfSRhyland Klein .divp_width = 3,
60067fc26bfSRhyland Klein };
60167fc26bfSRhyland Klein
60276da314dSPeter De Schrijver static struct tegra_clk_pll_freq_table pll_d_freq_table[] = {
60376da314dSPeter De Schrijver { 12000000, 216000000, 864, 12, 4, 12 },
60476da314dSPeter De Schrijver { 13000000, 216000000, 864, 13, 4, 12 },
60576da314dSPeter De Schrijver { 16800000, 216000000, 720, 14, 4, 12 },
60676da314dSPeter De Schrijver { 19200000, 216000000, 720, 16, 4, 12 },
60776da314dSPeter De Schrijver { 26000000, 216000000, 864, 26, 4, 12 },
60876da314dSPeter De Schrijver { 12000000, 594000000, 594, 12, 1, 12 },
60976da314dSPeter De Schrijver { 13000000, 594000000, 594, 13, 1, 12 },
61076da314dSPeter De Schrijver { 16800000, 594000000, 495, 14, 1, 12 },
61176da314dSPeter De Schrijver { 19200000, 594000000, 495, 16, 1, 12 },
61276da314dSPeter De Schrijver { 26000000, 594000000, 594, 26, 1, 12 },
61376da314dSPeter De Schrijver { 12000000, 1000000000, 1000, 12, 1, 12 },
61476da314dSPeter De Schrijver { 13000000, 1000000000, 1000, 13, 1, 12 },
61576da314dSPeter De Schrijver { 19200000, 1000000000, 625, 12, 1, 12 },
61676da314dSPeter De Schrijver { 26000000, 1000000000, 1000, 26, 1, 12 },
61776da314dSPeter De Schrijver { 0, 0, 0, 0, 0, 0 },
61876da314dSPeter De Schrijver };
61976da314dSPeter De Schrijver
62076da314dSPeter De Schrijver static struct tegra_clk_pll_params pll_d_params = {
62176da314dSPeter De Schrijver .input_min = 2000000,
62276da314dSPeter De Schrijver .input_max = 40000000,
62376da314dSPeter De Schrijver .cf_min = 1000000,
62476da314dSPeter De Schrijver .cf_max = 6000000,
62576da314dSPeter De Schrijver .vco_min = 500000000,
62676da314dSPeter De Schrijver .vco_max = 1000000000,
62776da314dSPeter De Schrijver .base_reg = PLLD_BASE,
62876da314dSPeter De Schrijver .misc_reg = PLLD_MISC,
62976da314dSPeter De Schrijver .lock_mask = PLL_BASE_LOCK,
63076da314dSPeter De Schrijver .lock_enable_bit_idx = PLLDU_MISC_LOCK_ENABLE,
63176da314dSPeter De Schrijver .lock_delay = 1000,
63267fc26bfSRhyland Klein .div_nmp = &plld_nmp,
63376da314dSPeter De Schrijver .freq_table = pll_d_freq_table,
63476da314dSPeter De Schrijver .flags = TEGRA_PLL_HAS_CPCON | TEGRA_PLL_SET_LFCON |
6353706b436SRhyland Klein TEGRA_PLL_USE_LOCK | TEGRA_PLL_HAS_LOCK_ENABLE,
63676da314dSPeter De Schrijver };
63776da314dSPeter De Schrijver
63876da314dSPeter De Schrijver static struct tegra_clk_pll_freq_table tegra124_pll_d2_freq_table[] = {
6398d99704fSThierry Reding { 12000000, 594000000, 99, 1, 2, 0 },
6408d99704fSThierry Reding { 13000000, 594000000, 91, 1, 2, 0 }, /* actual: 591.5 MHz */
6418d99704fSThierry Reding { 16800000, 594000000, 71, 1, 2, 0 }, /* actual: 596.4 MHz */
6428d99704fSThierry Reding { 19200000, 594000000, 62, 1, 2, 0 }, /* actual: 595.2 MHz */
6438d99704fSThierry Reding { 26000000, 594000000, 91, 2, 2, 0 }, /* actual: 591.5 MHz */
64476da314dSPeter De Schrijver { 0, 0, 0, 0, 0, 0 },
64576da314dSPeter De Schrijver };
64676da314dSPeter De Schrijver
64776da314dSPeter De Schrijver static struct tegra_clk_pll_params tegra124_pll_d2_params = {
64876da314dSPeter De Schrijver .input_min = 12000000,
64976da314dSPeter De Schrijver .input_max = 1000000000,
65076da314dSPeter De Schrijver .cf_min = 12000000,
65176da314dSPeter De Schrijver .cf_max = 19200000, /* s/w policy, h/w capability 38 MHz */
65276da314dSPeter De Schrijver .vco_min = 600000000,
65376da314dSPeter De Schrijver .vco_max = 1200000000,
65476da314dSPeter De Schrijver .base_reg = PLLD2_BASE,
65576da314dSPeter De Schrijver .misc_reg = PLLD2_MISC,
65676da314dSPeter De Schrijver .lock_mask = PLL_BASE_LOCK,
65776da314dSPeter De Schrijver .lock_enable_bit_idx = PLLSS_MISC_LOCK_ENABLE,
65876da314dSPeter De Schrijver .lock_delay = 300,
65976da314dSPeter De Schrijver .iddq_reg = PLLD2_BASE,
66076da314dSPeter De Schrijver .iddq_bit_idx = PLLSS_IDDQ_BIT,
66176da314dSPeter De Schrijver .pdiv_tohw = pll12g_ssd_esd_p,
66276da314dSPeter De Schrijver .div_nmp = &pllss_nmp,
66376da314dSPeter De Schrijver .ext_misc_reg[0] = 0x570,
66476da314dSPeter De Schrijver .ext_misc_reg[1] = 0x574,
66576da314dSPeter De Schrijver .ext_misc_reg[2] = 0x578,
66676da314dSPeter De Schrijver .max_p = 15,
66776da314dSPeter De Schrijver .freq_table = tegra124_pll_d2_freq_table,
6683706b436SRhyland Klein .flags = TEGRA_PLL_USE_LOCK | TEGRA_PLL_HAS_LOCK_ENABLE,
66976da314dSPeter De Schrijver };
67076da314dSPeter De Schrijver
67176da314dSPeter De Schrijver static struct tegra_clk_pll_freq_table pll_dp_freq_table[] = {
67286c679a5SRhyland Klein { 12000000, 600000000, 100, 1, 2, 0 },
67386c679a5SRhyland Klein { 13000000, 600000000, 92, 1, 2, 0 }, /* actual: 598.0 MHz */
67486c679a5SRhyland Klein { 16800000, 600000000, 71, 1, 2, 0 }, /* actual: 596.4 MHz */
67586c679a5SRhyland Klein { 19200000, 600000000, 62, 1, 2, 0 }, /* actual: 595.2 MHz */
67686c679a5SRhyland Klein { 26000000, 600000000, 92, 2, 2, 0 }, /* actual: 598.0 MHz */
67776da314dSPeter De Schrijver { 0, 0, 0, 0, 0, 0 },
67876da314dSPeter De Schrijver };
67976da314dSPeter De Schrijver
68076da314dSPeter De Schrijver static struct tegra_clk_pll_params pll_dp_params = {
68176da314dSPeter De Schrijver .input_min = 12000000,
68276da314dSPeter De Schrijver .input_max = 1000000000,
68376da314dSPeter De Schrijver .cf_min = 12000000,
68476da314dSPeter De Schrijver .cf_max = 19200000, /* s/w policy, h/w capability 38 MHz */
68576da314dSPeter De Schrijver .vco_min = 600000000,
68676da314dSPeter De Schrijver .vco_max = 1200000000,
68776da314dSPeter De Schrijver .base_reg = PLLDP_BASE,
68876da314dSPeter De Schrijver .misc_reg = PLLDP_MISC,
68976da314dSPeter De Schrijver .lock_mask = PLL_BASE_LOCK,
69076da314dSPeter De Schrijver .lock_enable_bit_idx = PLLSS_MISC_LOCK_ENABLE,
69176da314dSPeter De Schrijver .lock_delay = 300,
69276da314dSPeter De Schrijver .iddq_reg = PLLDP_BASE,
69376da314dSPeter De Schrijver .iddq_bit_idx = PLLSS_IDDQ_BIT,
69476da314dSPeter De Schrijver .pdiv_tohw = pll12g_ssd_esd_p,
69576da314dSPeter De Schrijver .div_nmp = &pllss_nmp,
69676da314dSPeter De Schrijver .ext_misc_reg[0] = 0x598,
69776da314dSPeter De Schrijver .ext_misc_reg[1] = 0x59c,
69876da314dSPeter De Schrijver .ext_misc_reg[2] = 0x5a0,
69976da314dSPeter De Schrijver .max_p = 5,
70076da314dSPeter De Schrijver .freq_table = pll_dp_freq_table,
7013706b436SRhyland Klein .flags = TEGRA_PLL_USE_LOCK | TEGRA_PLL_HAS_LOCK_ENABLE,
70276da314dSPeter De Schrijver };
70376da314dSPeter De Schrijver
704385f9adfSThierry Reding static const struct pdiv_map pllu_p[] = {
70576da314dSPeter De Schrijver { .pdiv = 1, .hw_val = 1 },
70676da314dSPeter De Schrijver { .pdiv = 2, .hw_val = 0 },
70776da314dSPeter De Schrijver { .pdiv = 0, .hw_val = 0 },
70876da314dSPeter De Schrijver };
70976da314dSPeter De Schrijver
71076da314dSPeter De Schrijver static struct div_nmp pllu_nmp = {
71176da314dSPeter De Schrijver .divm_shift = 0,
71276da314dSPeter De Schrijver .divm_width = 5,
71376da314dSPeter De Schrijver .divn_shift = 8,
71476da314dSPeter De Schrijver .divn_width = 10,
71576da314dSPeter De Schrijver .divp_shift = 20,
71676da314dSPeter De Schrijver .divp_width = 1,
71776da314dSPeter De Schrijver };
71876da314dSPeter De Schrijver
71976da314dSPeter De Schrijver static struct tegra_clk_pll_freq_table pll_u_freq_table[] = {
72076da314dSPeter De Schrijver { 12000000, 480000000, 960, 12, 2, 12 },
72176da314dSPeter De Schrijver { 13000000, 480000000, 960, 13, 2, 12 },
72276da314dSPeter De Schrijver { 16800000, 480000000, 400, 7, 2, 5 },
72376da314dSPeter De Schrijver { 19200000, 480000000, 200, 4, 2, 3 },
72476da314dSPeter De Schrijver { 26000000, 480000000, 960, 26, 2, 12 },
72576da314dSPeter De Schrijver { 0, 0, 0, 0, 0, 0 },
72676da314dSPeter De Schrijver };
72776da314dSPeter De Schrijver
72876da314dSPeter De Schrijver static struct tegra_clk_pll_params pll_u_params = {
72976da314dSPeter De Schrijver .input_min = 2000000,
73076da314dSPeter De Schrijver .input_max = 40000000,
73176da314dSPeter De Schrijver .cf_min = 1000000,
73276da314dSPeter De Schrijver .cf_max = 6000000,
73376da314dSPeter De Schrijver .vco_min = 480000000,
73476da314dSPeter De Schrijver .vco_max = 960000000,
73576da314dSPeter De Schrijver .base_reg = PLLU_BASE,
73676da314dSPeter De Schrijver .misc_reg = PLLU_MISC,
73776da314dSPeter De Schrijver .lock_mask = PLL_BASE_LOCK,
73876da314dSPeter De Schrijver .lock_enable_bit_idx = PLLDU_MISC_LOCK_ENABLE,
73976da314dSPeter De Schrijver .lock_delay = 1000,
74076da314dSPeter De Schrijver .pdiv_tohw = pllu_p,
74176da314dSPeter De Schrijver .div_nmp = &pllu_nmp,
74276da314dSPeter De Schrijver .freq_table = pll_u_freq_table,
74376da314dSPeter De Schrijver .flags = TEGRA_PLLU | TEGRA_PLL_HAS_CPCON | TEGRA_PLL_SET_LFCON |
7443706b436SRhyland Klein TEGRA_PLL_USE_LOCK | TEGRA_PLL_HAS_LOCK_ENABLE,
74576da314dSPeter De Schrijver };
74676da314dSPeter De Schrijver
74776da314dSPeter De Schrijver static struct tegra_clk tegra124_clks[tegra_clk_max] __initdata = {
74876da314dSPeter De Schrijver [tegra_clk_ispb] = { .dt_id = TEGRA124_CLK_ISPB, .present = true },
74976da314dSPeter De Schrijver [tegra_clk_rtc] = { .dt_id = TEGRA124_CLK_RTC, .present = true },
75076da314dSPeter De Schrijver [tegra_clk_timer] = { .dt_id = TEGRA124_CLK_TIMER, .present = true },
75176da314dSPeter De Schrijver [tegra_clk_uarta] = { .dt_id = TEGRA124_CLK_UARTA, .present = true },
75220e7c323SAndrew Bresticker [tegra_clk_sdmmc2_8] = { .dt_id = TEGRA124_CLK_SDMMC2, .present = true },
75376da314dSPeter De Schrijver [tegra_clk_i2s1] = { .dt_id = TEGRA124_CLK_I2S1, .present = true },
75476da314dSPeter De Schrijver [tegra_clk_i2c1] = { .dt_id = TEGRA124_CLK_I2C1, .present = true },
75520e7c323SAndrew Bresticker [tegra_clk_sdmmc1_8] = { .dt_id = TEGRA124_CLK_SDMMC1, .present = true },
75620e7c323SAndrew Bresticker [tegra_clk_sdmmc4_8] = { .dt_id = TEGRA124_CLK_SDMMC4, .present = true },
75776da314dSPeter De Schrijver [tegra_clk_pwm] = { .dt_id = TEGRA124_CLK_PWM, .present = true },
75876da314dSPeter De Schrijver [tegra_clk_i2s2] = { .dt_id = TEGRA124_CLK_I2S2, .present = true },
75976da314dSPeter De Schrijver [tegra_clk_usbd] = { .dt_id = TEGRA124_CLK_USBD, .present = true },
76076da314dSPeter De Schrijver [tegra_clk_isp_8] = { .dt_id = TEGRA124_CLK_ISP, .present = true },
76176da314dSPeter De Schrijver [tegra_clk_disp2] = { .dt_id = TEGRA124_CLK_DISP2, .present = true },
76276da314dSPeter De Schrijver [tegra_clk_disp1] = { .dt_id = TEGRA124_CLK_DISP1, .present = true },
76382ba1c3cSMark Zhang [tegra_clk_host1x_8] = { .dt_id = TEGRA124_CLK_HOST1X, .present = true },
76476da314dSPeter De Schrijver [tegra_clk_vcp] = { .dt_id = TEGRA124_CLK_VCP, .present = true },
76576da314dSPeter De Schrijver [tegra_clk_i2s0] = { .dt_id = TEGRA124_CLK_I2S0, .present = true },
76676da314dSPeter De Schrijver [tegra_clk_apbdma] = { .dt_id = TEGRA124_CLK_APBDMA, .present = true },
76776da314dSPeter De Schrijver [tegra_clk_kbc] = { .dt_id = TEGRA124_CLK_KBC, .present = true },
76876da314dSPeter De Schrijver [tegra_clk_kfuse] = { .dt_id = TEGRA124_CLK_KFUSE, .present = true },
76976da314dSPeter De Schrijver [tegra_clk_sbc1] = { .dt_id = TEGRA124_CLK_SBC1, .present = true },
77076da314dSPeter De Schrijver [tegra_clk_nor] = { .dt_id = TEGRA124_CLK_NOR, .present = true },
77176da314dSPeter De Schrijver [tegra_clk_sbc2] = { .dt_id = TEGRA124_CLK_SBC2, .present = true },
77276da314dSPeter De Schrijver [tegra_clk_sbc3] = { .dt_id = TEGRA124_CLK_SBC3, .present = true },
77376da314dSPeter De Schrijver [tegra_clk_i2c5] = { .dt_id = TEGRA124_CLK_I2C5, .present = true },
77476da314dSPeter De Schrijver [tegra_clk_mipi] = { .dt_id = TEGRA124_CLK_MIPI, .present = true },
77576da314dSPeter De Schrijver [tegra_clk_hdmi] = { .dt_id = TEGRA124_CLK_HDMI, .present = true },
77676da314dSPeter De Schrijver [tegra_clk_csi] = { .dt_id = TEGRA124_CLK_CSI, .present = true },
77776da314dSPeter De Schrijver [tegra_clk_i2c2] = { .dt_id = TEGRA124_CLK_I2C2, .present = true },
77876da314dSPeter De Schrijver [tegra_clk_uartc] = { .dt_id = TEGRA124_CLK_UARTC, .present = true },
77976da314dSPeter De Schrijver [tegra_clk_mipi_cal] = { .dt_id = TEGRA124_CLK_MIPI_CAL, .present = true },
78076da314dSPeter De Schrijver [tegra_clk_usb2] = { .dt_id = TEGRA124_CLK_USB2, .present = true },
78176da314dSPeter De Schrijver [tegra_clk_usb3] = { .dt_id = TEGRA124_CLK_USB3, .present = true },
78276da314dSPeter De Schrijver [tegra_clk_vde_8] = { .dt_id = TEGRA124_CLK_VDE, .present = true },
78376da314dSPeter De Schrijver [tegra_clk_bsea] = { .dt_id = TEGRA124_CLK_BSEA, .present = true },
78476da314dSPeter De Schrijver [tegra_clk_bsev] = { .dt_id = TEGRA124_CLK_BSEV, .present = true },
78576da314dSPeter De Schrijver [tegra_clk_uartd] = { .dt_id = TEGRA124_CLK_UARTD, .present = true },
78676da314dSPeter De Schrijver [tegra_clk_i2c3] = { .dt_id = TEGRA124_CLK_I2C3, .present = true },
78776da314dSPeter De Schrijver [tegra_clk_sbc4] = { .dt_id = TEGRA124_CLK_SBC4, .present = true },
78820e7c323SAndrew Bresticker [tegra_clk_sdmmc3_8] = { .dt_id = TEGRA124_CLK_SDMMC3, .present = true },
78976da314dSPeter De Schrijver [tegra_clk_pcie] = { .dt_id = TEGRA124_CLK_PCIE, .present = true },
79076da314dSPeter De Schrijver [tegra_clk_owr] = { .dt_id = TEGRA124_CLK_OWR, .present = true },
79176da314dSPeter De Schrijver [tegra_clk_afi] = { .dt_id = TEGRA124_CLK_AFI, .present = true },
79276da314dSPeter De Schrijver [tegra_clk_csite] = { .dt_id = TEGRA124_CLK_CSITE, .present = true },
79376da314dSPeter De Schrijver [tegra_clk_la] = { .dt_id = TEGRA124_CLK_LA, .present = true },
79476da314dSPeter De Schrijver [tegra_clk_trace] = { .dt_id = TEGRA124_CLK_TRACE, .present = true },
79576da314dSPeter De Schrijver [tegra_clk_soc_therm] = { .dt_id = TEGRA124_CLK_SOC_THERM, .present = true },
79676da314dSPeter De Schrijver [tegra_clk_dtv] = { .dt_id = TEGRA124_CLK_DTV, .present = true },
79776da314dSPeter De Schrijver [tegra_clk_i2cslow] = { .dt_id = TEGRA124_CLK_I2CSLOW, .present = true },
79876da314dSPeter De Schrijver [tegra_clk_tsec] = { .dt_id = TEGRA124_CLK_TSEC, .present = true },
79976da314dSPeter De Schrijver [tegra_clk_xusb_host] = { .dt_id = TEGRA124_CLK_XUSB_HOST, .present = true },
80076da314dSPeter De Schrijver [tegra_clk_msenc] = { .dt_id = TEGRA124_CLK_MSENC, .present = true },
80176da314dSPeter De Schrijver [tegra_clk_csus] = { .dt_id = TEGRA124_CLK_CSUS, .present = true },
80276da314dSPeter De Schrijver [tegra_clk_mselect] = { .dt_id = TEGRA124_CLK_MSELECT, .present = true },
80376da314dSPeter De Schrijver [tegra_clk_tsensor] = { .dt_id = TEGRA124_CLK_TSENSOR, .present = true },
80476da314dSPeter De Schrijver [tegra_clk_i2s3] = { .dt_id = TEGRA124_CLK_I2S3, .present = true },
80576da314dSPeter De Schrijver [tegra_clk_i2s4] = { .dt_id = TEGRA124_CLK_I2S4, .present = true },
80676da314dSPeter De Schrijver [tegra_clk_i2c4] = { .dt_id = TEGRA124_CLK_I2C4, .present = true },
80776da314dSPeter De Schrijver [tegra_clk_sbc5] = { .dt_id = TEGRA124_CLK_SBC5, .present = true },
80876da314dSPeter De Schrijver [tegra_clk_sbc6] = { .dt_id = TEGRA124_CLK_SBC6, .present = true },
80976da314dSPeter De Schrijver [tegra_clk_d_audio] = { .dt_id = TEGRA124_CLK_D_AUDIO, .present = true },
81076da314dSPeter De Schrijver [tegra_clk_apbif] = { .dt_id = TEGRA124_CLK_APBIF, .present = true },
81176da314dSPeter De Schrijver [tegra_clk_dam0] = { .dt_id = TEGRA124_CLK_DAM0, .present = true },
81276da314dSPeter De Schrijver [tegra_clk_dam1] = { .dt_id = TEGRA124_CLK_DAM1, .present = true },
81376da314dSPeter De Schrijver [tegra_clk_dam2] = { .dt_id = TEGRA124_CLK_DAM2, .present = true },
81476da314dSPeter De Schrijver [tegra_clk_hda2codec_2x] = { .dt_id = TEGRA124_CLK_HDA2CODEC_2X, .present = true },
81576da314dSPeter De Schrijver [tegra_clk_audio0_2x] = { .dt_id = TEGRA124_CLK_AUDIO0_2X, .present = true },
81676da314dSPeter De Schrijver [tegra_clk_audio1_2x] = { .dt_id = TEGRA124_CLK_AUDIO1_2X, .present = true },
81776da314dSPeter De Schrijver [tegra_clk_audio2_2x] = { .dt_id = TEGRA124_CLK_AUDIO2_2X, .present = true },
81876da314dSPeter De Schrijver [tegra_clk_audio3_2x] = { .dt_id = TEGRA124_CLK_AUDIO3_2X, .present = true },
81976da314dSPeter De Schrijver [tegra_clk_audio4_2x] = { .dt_id = TEGRA124_CLK_AUDIO4_2X, .present = true },
82076da314dSPeter De Schrijver [tegra_clk_spdif_2x] = { .dt_id = TEGRA124_CLK_SPDIF_2X, .present = true },
82176da314dSPeter De Schrijver [tegra_clk_actmon] = { .dt_id = TEGRA124_CLK_ACTMON, .present = true },
82276da314dSPeter De Schrijver [tegra_clk_extern1] = { .dt_id = TEGRA124_CLK_EXTERN1, .present = true },
82376da314dSPeter De Schrijver [tegra_clk_extern2] = { .dt_id = TEGRA124_CLK_EXTERN2, .present = true },
82476da314dSPeter De Schrijver [tegra_clk_extern3] = { .dt_id = TEGRA124_CLK_EXTERN3, .present = true },
82576da314dSPeter De Schrijver [tegra_clk_sata_oob] = { .dt_id = TEGRA124_CLK_SATA_OOB, .present = true },
82676da314dSPeter De Schrijver [tegra_clk_sata] = { .dt_id = TEGRA124_CLK_SATA, .present = true },
82776da314dSPeter De Schrijver [tegra_clk_hda] = { .dt_id = TEGRA124_CLK_HDA, .present = true },
82876da314dSPeter De Schrijver [tegra_clk_se] = { .dt_id = TEGRA124_CLK_SE, .present = true },
82976da314dSPeter De Schrijver [tegra_clk_hda2hdmi] = { .dt_id = TEGRA124_CLK_HDA2HDMI, .present = true },
83076da314dSPeter De Schrijver [tegra_clk_sata_cold] = { .dt_id = TEGRA124_CLK_SATA_COLD, .present = true },
83176da314dSPeter De Schrijver [tegra_clk_cilab] = { .dt_id = TEGRA124_CLK_CILAB, .present = true },
83276da314dSPeter De Schrijver [tegra_clk_cilcd] = { .dt_id = TEGRA124_CLK_CILCD, .present = true },
83376da314dSPeter De Schrijver [tegra_clk_cile] = { .dt_id = TEGRA124_CLK_CILE, .present = true },
83476da314dSPeter De Schrijver [tegra_clk_dsialp] = { .dt_id = TEGRA124_CLK_DSIALP, .present = true },
83576da314dSPeter De Schrijver [tegra_clk_dsiblp] = { .dt_id = TEGRA124_CLK_DSIBLP, .present = true },
83676da314dSPeter De Schrijver [tegra_clk_entropy] = { .dt_id = TEGRA124_CLK_ENTROPY, .present = true },
83776da314dSPeter De Schrijver [tegra_clk_dds] = { .dt_id = TEGRA124_CLK_DDS, .present = true },
83876da314dSPeter De Schrijver [tegra_clk_dp2] = { .dt_id = TEGRA124_CLK_DP2, .present = true },
83976da314dSPeter De Schrijver [tegra_clk_amx] = { .dt_id = TEGRA124_CLK_AMX, .present = true },
84076da314dSPeter De Schrijver [tegra_clk_adx] = { .dt_id = TEGRA124_CLK_ADX, .present = true },
84176da314dSPeter De Schrijver [tegra_clk_xusb_ss] = { .dt_id = TEGRA124_CLK_XUSB_SS, .present = true },
84276da314dSPeter De Schrijver [tegra_clk_i2c6] = { .dt_id = TEGRA124_CLK_I2C6, .present = true },
84376da314dSPeter De Schrijver [tegra_clk_vim2_clk] = { .dt_id = TEGRA124_CLK_VIM2_CLK, .present = true },
84476da314dSPeter De Schrijver [tegra_clk_hdmi_audio] = { .dt_id = TEGRA124_CLK_HDMI_AUDIO, .present = true },
84576da314dSPeter De Schrijver [tegra_clk_clk72Mhz] = { .dt_id = TEGRA124_CLK_CLK72MHZ, .present = true },
84676da314dSPeter De Schrijver [tegra_clk_vic03] = { .dt_id = TEGRA124_CLK_VIC03, .present = true },
84776da314dSPeter De Schrijver [tegra_clk_adx1] = { .dt_id = TEGRA124_CLK_ADX1, .present = true },
84876da314dSPeter De Schrijver [tegra_clk_dpaux] = { .dt_id = TEGRA124_CLK_DPAUX, .present = true },
84976da314dSPeter De Schrijver [tegra_clk_sor0] = { .dt_id = TEGRA124_CLK_SOR0, .present = true },
850da8d1a35SThierry Reding [tegra_clk_sor0_out] = { .dt_id = TEGRA124_CLK_SOR0_OUT, .present = true },
85176da314dSPeter De Schrijver [tegra_clk_gpu] = { .dt_id = TEGRA124_CLK_GPU, .present = true },
85276da314dSPeter De Schrijver [tegra_clk_amx1] = { .dt_id = TEGRA124_CLK_AMX1, .present = true },
85376da314dSPeter De Schrijver [tegra_clk_uartb] = { .dt_id = TEGRA124_CLK_UARTB, .present = true },
85476da314dSPeter De Schrijver [tegra_clk_vfir] = { .dt_id = TEGRA124_CLK_VFIR, .present = true },
85576da314dSPeter De Schrijver [tegra_clk_spdif_in] = { .dt_id = TEGRA124_CLK_SPDIF_IN, .present = true },
85676da314dSPeter De Schrijver [tegra_clk_spdif_out] = { .dt_id = TEGRA124_CLK_SPDIF_OUT, .present = true },
85776da314dSPeter De Schrijver [tegra_clk_vi_9] = { .dt_id = TEGRA124_CLK_VI, .present = true },
858167d5366SPeter De Schrijver [tegra_clk_vi_sensor_8] = { .dt_id = TEGRA124_CLK_VI_SENSOR, .present = true },
85976da314dSPeter De Schrijver [tegra_clk_fuse] = { .dt_id = TEGRA124_CLK_FUSE, .present = true },
86076da314dSPeter De Schrijver [tegra_clk_fuse_burn] = { .dt_id = TEGRA124_CLK_FUSE_BURN, .present = true },
86176da314dSPeter De Schrijver [tegra_clk_clk_32k] = { .dt_id = TEGRA124_CLK_CLK_32K, .present = true },
86276da314dSPeter De Schrijver [tegra_clk_clk_m] = { .dt_id = TEGRA124_CLK_CLK_M, .present = true },
8632b50e49bSSowjanya Komatineni [tegra_clk_osc] = { .dt_id = TEGRA124_CLK_OSC, .present = true },
8649a85eb4dSSowjanya Komatineni [tegra_clk_osc_div2] = { .dt_id = TEGRA124_CLK_OSC_DIV2, .present = true },
8659a85eb4dSSowjanya Komatineni [tegra_clk_osc_div4] = { .dt_id = TEGRA124_CLK_OSC_DIV4, .present = true },
86676da314dSPeter De Schrijver [tegra_clk_pll_ref] = { .dt_id = TEGRA124_CLK_PLL_REF, .present = true },
86776da314dSPeter De Schrijver [tegra_clk_pll_c] = { .dt_id = TEGRA124_CLK_PLL_C, .present = true },
86876da314dSPeter De Schrijver [tegra_clk_pll_c_out1] = { .dt_id = TEGRA124_CLK_PLL_C_OUT1, .present = true },
86976da314dSPeter De Schrijver [tegra_clk_pll_c2] = { .dt_id = TEGRA124_CLK_PLL_C2, .present = true },
87076da314dSPeter De Schrijver [tegra_clk_pll_c3] = { .dt_id = TEGRA124_CLK_PLL_C3, .present = true },
87176da314dSPeter De Schrijver [tegra_clk_pll_m] = { .dt_id = TEGRA124_CLK_PLL_M, .present = true },
87276da314dSPeter De Schrijver [tegra_clk_pll_m_out1] = { .dt_id = TEGRA124_CLK_PLL_M_OUT1, .present = true },
87376da314dSPeter De Schrijver [tegra_clk_pll_p] = { .dt_id = TEGRA124_CLK_PLL_P, .present = true },
87476da314dSPeter De Schrijver [tegra_clk_pll_p_out1] = { .dt_id = TEGRA124_CLK_PLL_P_OUT1, .present = true },
87576da314dSPeter De Schrijver [tegra_clk_pll_p_out2] = { .dt_id = TEGRA124_CLK_PLL_P_OUT2, .present = true },
87676da314dSPeter De Schrijver [tegra_clk_pll_p_out3] = { .dt_id = TEGRA124_CLK_PLL_P_OUT3, .present = true },
87776da314dSPeter De Schrijver [tegra_clk_pll_p_out4] = { .dt_id = TEGRA124_CLK_PLL_P_OUT4, .present = true },
87876da314dSPeter De Schrijver [tegra_clk_pll_a] = { .dt_id = TEGRA124_CLK_PLL_A, .present = true },
87976da314dSPeter De Schrijver [tegra_clk_pll_a_out0] = { .dt_id = TEGRA124_CLK_PLL_A_OUT0, .present = true },
88076da314dSPeter De Schrijver [tegra_clk_pll_d] = { .dt_id = TEGRA124_CLK_PLL_D, .present = true },
88176da314dSPeter De Schrijver [tegra_clk_pll_d_out0] = { .dt_id = TEGRA124_CLK_PLL_D_OUT0, .present = true },
88276da314dSPeter De Schrijver [tegra_clk_pll_d2] = { .dt_id = TEGRA124_CLK_PLL_D2, .present = true },
88376da314dSPeter De Schrijver [tegra_clk_pll_d2_out0] = { .dt_id = TEGRA124_CLK_PLL_D2_OUT0, .present = true },
88476da314dSPeter De Schrijver [tegra_clk_pll_u] = { .dt_id = TEGRA124_CLK_PLL_U, .present = true },
88576da314dSPeter De Schrijver [tegra_clk_pll_u_480m] = { .dt_id = TEGRA124_CLK_PLL_U_480M, .present = true },
88676da314dSPeter De Schrijver [tegra_clk_pll_u_60m] = { .dt_id = TEGRA124_CLK_PLL_U_60M, .present = true },
88776da314dSPeter De Schrijver [tegra_clk_pll_u_48m] = { .dt_id = TEGRA124_CLK_PLL_U_48M, .present = true },
88876da314dSPeter De Schrijver [tegra_clk_pll_u_12m] = { .dt_id = TEGRA124_CLK_PLL_U_12M, .present = true },
88976da314dSPeter De Schrijver [tegra_clk_pll_x] = { .dt_id = TEGRA124_CLK_PLL_X, .present = true },
89076da314dSPeter De Schrijver [tegra_clk_pll_x_out0] = { .dt_id = TEGRA124_CLK_PLL_X_OUT0, .present = true },
89176da314dSPeter De Schrijver [tegra_clk_pll_re_vco] = { .dt_id = TEGRA124_CLK_PLL_RE_VCO, .present = true },
89276da314dSPeter De Schrijver [tegra_clk_pll_re_out] = { .dt_id = TEGRA124_CLK_PLL_RE_OUT, .present = true },
89376da314dSPeter De Schrijver [tegra_clk_spdif_in_sync] = { .dt_id = TEGRA124_CLK_SPDIF_IN_SYNC, .present = true },
89476da314dSPeter De Schrijver [tegra_clk_i2s0_sync] = { .dt_id = TEGRA124_CLK_I2S0_SYNC, .present = true },
89576da314dSPeter De Schrijver [tegra_clk_i2s1_sync] = { .dt_id = TEGRA124_CLK_I2S1_SYNC, .present = true },
89676da314dSPeter De Schrijver [tegra_clk_i2s2_sync] = { .dt_id = TEGRA124_CLK_I2S2_SYNC, .present = true },
89776da314dSPeter De Schrijver [tegra_clk_i2s3_sync] = { .dt_id = TEGRA124_CLK_I2S3_SYNC, .present = true },
89876da314dSPeter De Schrijver [tegra_clk_i2s4_sync] = { .dt_id = TEGRA124_CLK_I2S4_SYNC, .present = true },
89976da314dSPeter De Schrijver [tegra_clk_vimclk_sync] = { .dt_id = TEGRA124_CLK_VIMCLK_SYNC, .present = true },
90076da314dSPeter De Schrijver [tegra_clk_audio0] = { .dt_id = TEGRA124_CLK_AUDIO0, .present = true },
90176da314dSPeter De Schrijver [tegra_clk_audio1] = { .dt_id = TEGRA124_CLK_AUDIO1, .present = true },
90276da314dSPeter De Schrijver [tegra_clk_audio2] = { .dt_id = TEGRA124_CLK_AUDIO2, .present = true },
90376da314dSPeter De Schrijver [tegra_clk_audio3] = { .dt_id = TEGRA124_CLK_AUDIO3, .present = true },
90476da314dSPeter De Schrijver [tegra_clk_audio4] = { .dt_id = TEGRA124_CLK_AUDIO4, .present = true },
90576da314dSPeter De Schrijver [tegra_clk_spdif] = { .dt_id = TEGRA124_CLK_SPDIF, .present = true },
90676da314dSPeter De Schrijver [tegra_clk_xusb_host_src] = { .dt_id = TEGRA124_CLK_XUSB_HOST_SRC, .present = true },
90776da314dSPeter De Schrijver [tegra_clk_xusb_falcon_src] = { .dt_id = TEGRA124_CLK_XUSB_FALCON_SRC, .present = true },
90876da314dSPeter De Schrijver [tegra_clk_xusb_fs_src] = { .dt_id = TEGRA124_CLK_XUSB_FS_SRC, .present = true },
90976da314dSPeter De Schrijver [tegra_clk_xusb_ss_src] = { .dt_id = TEGRA124_CLK_XUSB_SS_SRC, .present = true },
9105c992afcSAndrew Bresticker [tegra_clk_xusb_ss_div2] = { .dt_id = TEGRA124_CLK_XUSB_SS_DIV2, .present = true },
91176da314dSPeter De Schrijver [tegra_clk_xusb_dev_src] = { .dt_id = TEGRA124_CLK_XUSB_DEV_SRC, .present = true },
91276da314dSPeter De Schrijver [tegra_clk_xusb_dev] = { .dt_id = TEGRA124_CLK_XUSB_DEV, .present = true },
91376da314dSPeter De Schrijver [tegra_clk_xusb_hs_src] = { .dt_id = TEGRA124_CLK_XUSB_HS_SRC, .present = true },
91476da314dSPeter De Schrijver [tegra_clk_sclk] = { .dt_id = TEGRA124_CLK_SCLK, .present = true },
91576da314dSPeter De Schrijver [tegra_clk_hclk] = { .dt_id = TEGRA124_CLK_HCLK, .present = true },
91676da314dSPeter De Schrijver [tegra_clk_pclk] = { .dt_id = TEGRA124_CLK_PCLK, .present = true },
91776da314dSPeter De Schrijver [tegra_clk_cclk_g] = { .dt_id = TEGRA124_CLK_CCLK_G, .present = true },
91876da314dSPeter De Schrijver [tegra_clk_cclk_lp] = { .dt_id = TEGRA124_CLK_CCLK_LP, .present = true },
91976da314dSPeter De Schrijver [tegra_clk_dfll_ref] = { .dt_id = TEGRA124_CLK_DFLL_REF, .present = true },
92076da314dSPeter De Schrijver [tegra_clk_dfll_soc] = { .dt_id = TEGRA124_CLK_DFLL_SOC, .present = true },
92176da314dSPeter De Schrijver [tegra_clk_vi_sensor2] = { .dt_id = TEGRA124_CLK_VI_SENSOR2, .present = true },
92276da314dSPeter De Schrijver [tegra_clk_pll_p_out5] = { .dt_id = TEGRA124_CLK_PLL_P_OUT5, .present = true },
92376da314dSPeter De Schrijver [tegra_clk_pll_c4] = { .dt_id = TEGRA124_CLK_PLL_C4, .present = true },
92476da314dSPeter De Schrijver [tegra_clk_pll_dp] = { .dt_id = TEGRA124_CLK_PLL_DP, .present = true },
92576da314dSPeter De Schrijver [tegra_clk_audio0_mux] = { .dt_id = TEGRA124_CLK_AUDIO0_MUX, .present = true },
92676da314dSPeter De Schrijver [tegra_clk_audio1_mux] = { .dt_id = TEGRA124_CLK_AUDIO1_MUX, .present = true },
92776da314dSPeter De Schrijver [tegra_clk_audio2_mux] = { .dt_id = TEGRA124_CLK_AUDIO2_MUX, .present = true },
92876da314dSPeter De Schrijver [tegra_clk_audio3_mux] = { .dt_id = TEGRA124_CLK_AUDIO3_MUX, .present = true },
92976da314dSPeter De Schrijver [tegra_clk_audio4_mux] = { .dt_id = TEGRA124_CLK_AUDIO4_MUX, .present = true },
93076da314dSPeter De Schrijver [tegra_clk_spdif_mux] = { .dt_id = TEGRA124_CLK_SPDIF_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 },
9382b50e49bSSowjanya Komatineni { .con_id = "osc", .dt_id = TEGRA124_CLK_OSC },
9399a85eb4dSSowjanya Komatineni { .con_id = "osc_div2", .dt_id = TEGRA124_CLK_OSC_DIV2 },
9409a85eb4dSSowjanya Komatineni { .con_id = "osc_div4", .dt_id = TEGRA124_CLK_OSC_DIV4 },
94176da314dSPeter De Schrijver { .con_id = "pll_c", .dt_id = TEGRA124_CLK_PLL_C },
94276da314dSPeter De Schrijver { .con_id = "pll_c_out1", .dt_id = TEGRA124_CLK_PLL_C_OUT1 },
94376da314dSPeter De Schrijver { .con_id = "pll_c2", .dt_id = TEGRA124_CLK_PLL_C2 },
94476da314dSPeter De Schrijver { .con_id = "pll_c3", .dt_id = TEGRA124_CLK_PLL_C3 },
94576da314dSPeter De Schrijver { .con_id = "pll_p", .dt_id = TEGRA124_CLK_PLL_P },
94676da314dSPeter De Schrijver { .con_id = "pll_p_out1", .dt_id = TEGRA124_CLK_PLL_P_OUT1 },
94776da314dSPeter De Schrijver { .con_id = "pll_p_out2", .dt_id = TEGRA124_CLK_PLL_P_OUT2 },
94876da314dSPeter De Schrijver { .con_id = "pll_p_out3", .dt_id = TEGRA124_CLK_PLL_P_OUT3 },
94976da314dSPeter De Schrijver { .con_id = "pll_p_out4", .dt_id = TEGRA124_CLK_PLL_P_OUT4 },
95076da314dSPeter De Schrijver { .con_id = "pll_m", .dt_id = TEGRA124_CLK_PLL_M },
95176da314dSPeter De Schrijver { .con_id = "pll_m_out1", .dt_id = TEGRA124_CLK_PLL_M_OUT1 },
95276da314dSPeter De Schrijver { .con_id = "pll_x", .dt_id = TEGRA124_CLK_PLL_X },
95376da314dSPeter De Schrijver { .con_id = "pll_x_out0", .dt_id = TEGRA124_CLK_PLL_X_OUT0 },
95476da314dSPeter De Schrijver { .con_id = "pll_u", .dt_id = TEGRA124_CLK_PLL_U },
95576da314dSPeter De Schrijver { .con_id = "pll_u_480M", .dt_id = TEGRA124_CLK_PLL_U_480M },
95676da314dSPeter De Schrijver { .con_id = "pll_u_60M", .dt_id = TEGRA124_CLK_PLL_U_60M },
95776da314dSPeter De Schrijver { .con_id = "pll_u_48M", .dt_id = TEGRA124_CLK_PLL_U_48M },
95876da314dSPeter De Schrijver { .con_id = "pll_u_12M", .dt_id = TEGRA124_CLK_PLL_U_12M },
95976da314dSPeter De Schrijver { .con_id = "pll_d", .dt_id = TEGRA124_CLK_PLL_D },
96076da314dSPeter De Schrijver { .con_id = "pll_d_out0", .dt_id = TEGRA124_CLK_PLL_D_OUT0 },
96176da314dSPeter De Schrijver { .con_id = "pll_d2", .dt_id = TEGRA124_CLK_PLL_D2 },
96276da314dSPeter De Schrijver { .con_id = "pll_d2_out0", .dt_id = TEGRA124_CLK_PLL_D2_OUT0 },
96376da314dSPeter De Schrijver { .con_id = "pll_a", .dt_id = TEGRA124_CLK_PLL_A },
96476da314dSPeter De Schrijver { .con_id = "pll_a_out0", .dt_id = TEGRA124_CLK_PLL_A_OUT0 },
96576da314dSPeter De Schrijver { .con_id = "pll_re_vco", .dt_id = TEGRA124_CLK_PLL_RE_VCO },
96676da314dSPeter De Schrijver { .con_id = "pll_re_out", .dt_id = TEGRA124_CLK_PLL_RE_OUT },
96776da314dSPeter De Schrijver { .con_id = "spdif_in_sync", .dt_id = TEGRA124_CLK_SPDIF_IN_SYNC },
96876da314dSPeter De Schrijver { .con_id = "i2s0_sync", .dt_id = TEGRA124_CLK_I2S0_SYNC },
96976da314dSPeter De Schrijver { .con_id = "i2s1_sync", .dt_id = TEGRA124_CLK_I2S1_SYNC },
97076da314dSPeter De Schrijver { .con_id = "i2s2_sync", .dt_id = TEGRA124_CLK_I2S2_SYNC },
97176da314dSPeter De Schrijver { .con_id = "i2s3_sync", .dt_id = TEGRA124_CLK_I2S3_SYNC },
97276da314dSPeter De Schrijver { .con_id = "i2s4_sync", .dt_id = TEGRA124_CLK_I2S4_SYNC },
97376da314dSPeter De Schrijver { .con_id = "vimclk_sync", .dt_id = TEGRA124_CLK_VIMCLK_SYNC },
97476da314dSPeter De Schrijver { .con_id = "audio0", .dt_id = TEGRA124_CLK_AUDIO0 },
97576da314dSPeter De Schrijver { .con_id = "audio1", .dt_id = TEGRA124_CLK_AUDIO1 },
97676da314dSPeter De Schrijver { .con_id = "audio2", .dt_id = TEGRA124_CLK_AUDIO2 },
97776da314dSPeter De Schrijver { .con_id = "audio3", .dt_id = TEGRA124_CLK_AUDIO3 },
97876da314dSPeter De Schrijver { .con_id = "audio4", .dt_id = TEGRA124_CLK_AUDIO4 },
97976da314dSPeter De Schrijver { .con_id = "spdif", .dt_id = TEGRA124_CLK_SPDIF },
98076da314dSPeter De Schrijver { .con_id = "audio0_2x", .dt_id = TEGRA124_CLK_AUDIO0_2X },
98176da314dSPeter De Schrijver { .con_id = "audio1_2x", .dt_id = TEGRA124_CLK_AUDIO1_2X },
98276da314dSPeter De Schrijver { .con_id = "audio2_2x", .dt_id = TEGRA124_CLK_AUDIO2_2X },
98376da314dSPeter De Schrijver { .con_id = "audio3_2x", .dt_id = TEGRA124_CLK_AUDIO3_2X },
98476da314dSPeter De Schrijver { .con_id = "audio4_2x", .dt_id = TEGRA124_CLK_AUDIO4_2X },
98576da314dSPeter De Schrijver { .con_id = "spdif_2x", .dt_id = TEGRA124_CLK_SPDIF_2X },
986acbeec3dSSowjanya Komatineni { .con_id = "extern1", .dt_id = TEGRA124_CLK_EXTERN1 },
987acbeec3dSSowjanya Komatineni { .con_id = "extern2", .dt_id = TEGRA124_CLK_EXTERN2 },
988acbeec3dSSowjanya Komatineni { .con_id = "extern3", .dt_id = TEGRA124_CLK_EXTERN3 },
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
100225175c80SThierry Reding static const char * const sor0_parents[] = {
100325175c80SThierry Reding "pll_p_out0", "pll_m_out0", "pll_d_out0", "pll_a_out0", "pll_c_out0",
100425175c80SThierry Reding "pll_d2_out0", "clk_m",
1005e5f8a107SThierry Reding };
1006e5f8a107SThierry Reding
100725175c80SThierry Reding static const char * const sor0_out_parents[] = {
100825175c80SThierry Reding "clk_m", "sor0_pad_clkout",
1009e5f8a107SThierry Reding };
1010e5f8a107SThierry Reding
1011e5f8a107SThierry Reding static struct tegra_periph_init_data tegra124_periph[] = {
101225175c80SThierry Reding TEGRA_INIT_DATA_TABLE("sor0", NULL, NULL, sor0_parents,
101325175c80SThierry Reding CLK_SOURCE_SOR0, 29, 0x7, 0, 0, 0, 0,
101425175c80SThierry Reding 0, 182, 0, tegra_clk_sor0, NULL, 0,
101525175c80SThierry Reding &sor0_lock),
101625175c80SThierry Reding TEGRA_INIT_DATA_TABLE("sor0_out", NULL, NULL, sor0_out_parents,
101725175c80SThierry Reding CLK_SOURCE_SOR0, 14, 0x1, 0, 0, 0, 0,
101825175c80SThierry Reding 0, 0, TEGRA_PERIPH_NO_GATE, tegra_clk_sor0_out,
101925175c80SThierry Reding NULL, 0, &sor0_lock),
1020e5f8a107SThierry Reding };
1021e5f8a107SThierry Reding
102276da314dSPeter De Schrijver static struct clk **clks;
102376da314dSPeter De Schrijver
tegra124_periph_clk_init(void __iomem * clk_base,void __iomem * pmc_base)102476da314dSPeter De Schrijver static __init void tegra124_periph_clk_init(void __iomem *clk_base,
102576da314dSPeter De Schrijver void __iomem *pmc_base)
102676da314dSPeter De Schrijver {
102776da314dSPeter De Schrijver struct clk *clk;
1028e5f8a107SThierry Reding unsigned int i;
102976da314dSPeter De Schrijver
10305c992afcSAndrew Bresticker /* xusb_ss_div2 */
10315c992afcSAndrew Bresticker clk = clk_register_fixed_factor(NULL, "xusb_ss_div2", "xusb_ss_src", 0,
10325c992afcSAndrew Bresticker 1, 2);
10335c992afcSAndrew Bresticker clks[TEGRA124_CLK_XUSB_SS_DIV2] = clk;
103476da314dSPeter De Schrijver
1035eede7113SThierry Reding clk = tegra_clk_register_periph_fixed("dpaux", "pll_p", 0, clk_base,
1036eede7113SThierry Reding 1, 17, 181);
1037eede7113SThierry Reding clks[TEGRA124_CLK_DPAUX] = clk;
1038eede7113SThierry Reding
1039c1d676ceSThierry Reding clk = clk_register_gate(NULL, "pll_d_dsi_out", "pll_d_out0", 0,
1040b270491eSMark Zhang clk_base + PLLD_MISC, 30, 0, &pll_d_lock);
1041c1d676ceSThierry Reding clks[TEGRA124_CLK_PLL_D_DSI_OUT] = clk;
104276da314dSPeter De Schrijver
1043c1d676ceSThierry Reding clk = tegra_clk_register_periph_gate("dsia", "pll_d_dsi_out", 0,
1044c1d676ceSThierry Reding clk_base, 0, 48,
1045c1d676ceSThierry Reding periph_clk_enb_refcnt);
1046b270491eSMark Zhang clks[TEGRA124_CLK_DSIA] = clk;
1047b270491eSMark Zhang
1048c1d676ceSThierry Reding clk = tegra_clk_register_periph_gate("dsib", "pll_d_dsi_out", 0,
1049c1d676ceSThierry Reding clk_base, 0, 82,
1050c1d676ceSThierry Reding periph_clk_enb_refcnt);
1051b270491eSMark Zhang clks[TEGRA124_CLK_DSIB] = clk;
105276da314dSPeter De Schrijver
1053ac67477fSTomeu Vizoso clk = tegra_clk_register_mc("mc", "emc", clk_base + CLK_SOURCE_EMC,
10544f4f85faSThierry Reding &emc_lock);
10554f4f85faSThierry Reding clks[TEGRA124_CLK_MC] = clk;
105676da314dSPeter De Schrijver
105776da314dSPeter De Schrijver /* cml0 */
105876da314dSPeter De Schrijver clk = clk_register_gate(NULL, "cml0", "pll_e", 0, clk_base + PLLE_AUX,
105976da314dSPeter De Schrijver 0, 0, &pll_e_lock);
106076da314dSPeter De Schrijver clk_register_clkdev(clk, "cml0", NULL);
106176da314dSPeter De Schrijver clks[TEGRA124_CLK_CML0] = clk;
106276da314dSPeter De Schrijver
106376da314dSPeter De Schrijver /* cml1 */
106476da314dSPeter De Schrijver clk = clk_register_gate(NULL, "cml1", "pll_e", 0, clk_base + PLLE_AUX,
106576da314dSPeter De Schrijver 1, 0, &pll_e_lock);
106676da314dSPeter De Schrijver clk_register_clkdev(clk, "cml1", NULL);
106776da314dSPeter De Schrijver clks[TEGRA124_CLK_CML1] = clk;
106876da314dSPeter De Schrijver
1069e5f8a107SThierry Reding for (i = 0; i < ARRAY_SIZE(tegra124_periph); i++) {
1070e5f8a107SThierry Reding struct tegra_periph_init_data *init = &tegra124_periph[i];
1071e5f8a107SThierry Reding struct clk **clkp;
1072e5f8a107SThierry Reding
1073e5f8a107SThierry Reding clkp = tegra_lookup_dt_id(init->clk_id, tegra124_clks);
1074e5f8a107SThierry Reding if (!clkp) {
1075e5f8a107SThierry Reding pr_warn("clock %u not found\n", init->clk_id);
1076e5f8a107SThierry Reding continue;
1077e5f8a107SThierry Reding }
1078e5f8a107SThierry Reding
1079e5f8a107SThierry Reding clk = tegra_clk_register_periph_data(clk_base, init);
1080e5f8a107SThierry Reding *clkp = clk;
1081e5f8a107SThierry Reding }
1082e5f8a107SThierry Reding
108376da314dSPeter De Schrijver tegra_periph_clk_init(clk_base, pmc_base, tegra124_clks, &pll_p_params);
108476da314dSPeter De Schrijver }
108576da314dSPeter De Schrijver
tegra124_pll_init(void __iomem * clk_base,void __iomem * pmc)108676da314dSPeter De Schrijver static void __init tegra124_pll_init(void __iomem *clk_base,
108776da314dSPeter De Schrijver void __iomem *pmc)
108876da314dSPeter De Schrijver {
108976da314dSPeter De Schrijver struct clk *clk;
109076da314dSPeter De Schrijver
109176da314dSPeter De Schrijver /* PLLC */
109276da314dSPeter De Schrijver clk = tegra_clk_register_pllxc("pll_c", "pll_ref", clk_base,
109376da314dSPeter De Schrijver pmc, 0, &pll_c_params, NULL);
109476da314dSPeter De Schrijver clk_register_clkdev(clk, "pll_c", NULL);
109576da314dSPeter De Schrijver clks[TEGRA124_CLK_PLL_C] = clk;
109676da314dSPeter De Schrijver
109776da314dSPeter De Schrijver /* PLLC_OUT1 */
109876da314dSPeter De Schrijver clk = tegra_clk_register_divider("pll_c_out1_div", "pll_c",
109976da314dSPeter De Schrijver clk_base + PLLC_OUT, 0, TEGRA_DIVIDER_ROUND_UP,
110076da314dSPeter De Schrijver 8, 8, 1, NULL);
110176da314dSPeter De Schrijver clk = tegra_clk_register_pll_out("pll_c_out1", "pll_c_out1_div",
110276da314dSPeter De Schrijver clk_base + PLLC_OUT, 1, 0,
110376da314dSPeter De Schrijver CLK_SET_RATE_PARENT, 0, NULL);
110476da314dSPeter De Schrijver clk_register_clkdev(clk, "pll_c_out1", NULL);
110576da314dSPeter De Schrijver clks[TEGRA124_CLK_PLL_C_OUT1] = clk;
110676da314dSPeter De Schrijver
11074c495c20SMikko Perttunen /* PLLC_UD */
11084c495c20SMikko Perttunen clk = clk_register_fixed_factor(NULL, "pll_c_ud", "pll_c",
11094c495c20SMikko Perttunen CLK_SET_RATE_PARENT, 1, 1);
11104c495c20SMikko Perttunen clk_register_clkdev(clk, "pll_c_ud", NULL);
11114c495c20SMikko Perttunen clks[TEGRA124_CLK_PLL_C_UD] = clk;
11124c495c20SMikko Perttunen
111376da314dSPeter De Schrijver /* PLLC2 */
111476da314dSPeter De Schrijver clk = tegra_clk_register_pllc("pll_c2", "pll_ref", clk_base, pmc, 0,
111576da314dSPeter De Schrijver &pll_c2_params, NULL);
111676da314dSPeter De Schrijver clk_register_clkdev(clk, "pll_c2", NULL);
111776da314dSPeter De Schrijver clks[TEGRA124_CLK_PLL_C2] = clk;
111876da314dSPeter De Schrijver
111976da314dSPeter De Schrijver /* PLLC3 */
112076da314dSPeter De Schrijver clk = tegra_clk_register_pllc("pll_c3", "pll_ref", clk_base, pmc, 0,
112176da314dSPeter De Schrijver &pll_c3_params, NULL);
112276da314dSPeter De Schrijver clk_register_clkdev(clk, "pll_c3", NULL);
112376da314dSPeter De Schrijver clks[TEGRA124_CLK_PLL_C3] = clk;
112476da314dSPeter De Schrijver
112576da314dSPeter De Schrijver /* PLLM */
112676da314dSPeter De Schrijver clk = tegra_clk_register_pllm("pll_m", "pll_ref", clk_base, pmc,
11272dcabf05SDmitry Osipenko CLK_SET_RATE_GATE, &pll_m_params, NULL);
112876da314dSPeter De Schrijver clk_register_clkdev(clk, "pll_m", NULL);
112976da314dSPeter De Schrijver clks[TEGRA124_CLK_PLL_M] = clk;
113076da314dSPeter De Schrijver
113176da314dSPeter De Schrijver /* PLLM_OUT1 */
113276da314dSPeter De Schrijver clk = tegra_clk_register_divider("pll_m_out1_div", "pll_m",
113376da314dSPeter De Schrijver clk_base + PLLM_OUT, 0, TEGRA_DIVIDER_ROUND_UP,
113476da314dSPeter De Schrijver 8, 8, 1, NULL);
113576da314dSPeter De Schrijver clk = tegra_clk_register_pll_out("pll_m_out1", "pll_m_out1_div",
11362dcabf05SDmitry Osipenko clk_base + PLLM_OUT, 1, 0,
113776da314dSPeter De Schrijver CLK_SET_RATE_PARENT, 0, NULL);
113876da314dSPeter De Schrijver clk_register_clkdev(clk, "pll_m_out1", NULL);
113976da314dSPeter De Schrijver clks[TEGRA124_CLK_PLL_M_OUT1] = clk;
114076da314dSPeter De Schrijver
114176da314dSPeter De Schrijver /* PLLM_UD */
114276da314dSPeter De Schrijver clk = clk_register_fixed_factor(NULL, "pll_m_ud", "pll_m",
114376da314dSPeter De Schrijver CLK_SET_RATE_PARENT, 1, 1);
11444c495c20SMikko Perttunen clk_register_clkdev(clk, "pll_m_ud", NULL);
11454c495c20SMikko Perttunen clks[TEGRA124_CLK_PLL_M_UD] = clk;
114676da314dSPeter De Schrijver
114776da314dSPeter De Schrijver /* PLLU */
114815d68e8cSAndrew Bresticker clk = tegra_clk_register_pllu_tegra114("pll_u", "pll_ref", clk_base, 0,
114976da314dSPeter De Schrijver &pll_u_params, &pll_u_lock);
115076da314dSPeter De Schrijver clk_register_clkdev(clk, "pll_u", NULL);
115176da314dSPeter De Schrijver clks[TEGRA124_CLK_PLL_U] = clk;
115276da314dSPeter De Schrijver
115376da314dSPeter De Schrijver /* PLLU_480M */
115476da314dSPeter De Schrijver clk = clk_register_gate(NULL, "pll_u_480M", "pll_u",
115576da314dSPeter De Schrijver CLK_SET_RATE_PARENT, clk_base + PLLU_BASE,
115676da314dSPeter De Schrijver 22, 0, &pll_u_lock);
115776da314dSPeter De Schrijver clk_register_clkdev(clk, "pll_u_480M", NULL);
115876da314dSPeter De Schrijver clks[TEGRA124_CLK_PLL_U_480M] = clk;
115976da314dSPeter De Schrijver
116076da314dSPeter De Schrijver /* PLLU_60M */
116176da314dSPeter De Schrijver clk = clk_register_fixed_factor(NULL, "pll_u_60M", "pll_u",
116276da314dSPeter De Schrijver CLK_SET_RATE_PARENT, 1, 8);
116376da314dSPeter De Schrijver clk_register_clkdev(clk, "pll_u_60M", NULL);
116476da314dSPeter De Schrijver clks[TEGRA124_CLK_PLL_U_60M] = clk;
116576da314dSPeter De Schrijver
116676da314dSPeter De Schrijver /* PLLU_48M */
116776da314dSPeter De Schrijver clk = clk_register_fixed_factor(NULL, "pll_u_48M", "pll_u",
116876da314dSPeter De Schrijver CLK_SET_RATE_PARENT, 1, 10);
116976da314dSPeter De Schrijver clk_register_clkdev(clk, "pll_u_48M", NULL);
117076da314dSPeter De Schrijver clks[TEGRA124_CLK_PLL_U_48M] = clk;
117176da314dSPeter De Schrijver
117276da314dSPeter De Schrijver /* PLLU_12M */
117376da314dSPeter De Schrijver clk = clk_register_fixed_factor(NULL, "pll_u_12M", "pll_u",
117476da314dSPeter De Schrijver CLK_SET_RATE_PARENT, 1, 40);
117576da314dSPeter De Schrijver clk_register_clkdev(clk, "pll_u_12M", NULL);
117676da314dSPeter De Schrijver clks[TEGRA124_CLK_PLL_U_12M] = clk;
117776da314dSPeter De Schrijver
117876da314dSPeter De Schrijver /* PLLD */
117976da314dSPeter De Schrijver clk = tegra_clk_register_pll("pll_d", "pll_ref", clk_base, pmc, 0,
118076da314dSPeter De Schrijver &pll_d_params, &pll_d_lock);
118176da314dSPeter De Schrijver clk_register_clkdev(clk, "pll_d", NULL);
118276da314dSPeter De Schrijver clks[TEGRA124_CLK_PLL_D] = clk;
118376da314dSPeter De Schrijver
118476da314dSPeter De Schrijver /* PLLD_OUT0 */
118576da314dSPeter De Schrijver clk = clk_register_fixed_factor(NULL, "pll_d_out0", "pll_d",
118676da314dSPeter De Schrijver CLK_SET_RATE_PARENT, 1, 2);
118776da314dSPeter De Schrijver clk_register_clkdev(clk, "pll_d_out0", NULL);
118876da314dSPeter De Schrijver clks[TEGRA124_CLK_PLL_D_OUT0] = clk;
118976da314dSPeter De Schrijver
119076da314dSPeter De Schrijver /* PLLRE */
119176da314dSPeter De Schrijver clk = tegra_clk_register_pllre("pll_re_vco", "pll_ref", clk_base, pmc,
119276da314dSPeter De Schrijver 0, &pll_re_vco_params, &pll_re_lock, pll_ref_freq);
119376da314dSPeter De Schrijver clk_register_clkdev(clk, "pll_re_vco", NULL);
119476da314dSPeter De Schrijver clks[TEGRA124_CLK_PLL_RE_VCO] = clk;
119576da314dSPeter De Schrijver
119676da314dSPeter De Schrijver clk = clk_register_divider_table(NULL, "pll_re_out", "pll_re_vco", 0,
119776da314dSPeter De Schrijver clk_base + PLLRE_BASE, 16, 4, 0,
119876da314dSPeter De Schrijver pll_re_div_table, &pll_re_lock);
119976da314dSPeter De Schrijver clk_register_clkdev(clk, "pll_re_out", NULL);
120076da314dSPeter De Schrijver clks[TEGRA124_CLK_PLL_RE_OUT] = clk;
120176da314dSPeter De Schrijver
120276da314dSPeter De Schrijver /* PLLE */
120376da314dSPeter De Schrijver clk = tegra_clk_register_plle_tegra114("pll_e", "pll_ref",
120476da314dSPeter De Schrijver clk_base, 0, &pll_e_params, NULL);
120576da314dSPeter De Schrijver clk_register_clkdev(clk, "pll_e", NULL);
120676da314dSPeter De Schrijver clks[TEGRA124_CLK_PLL_E] = clk;
120776da314dSPeter De Schrijver
120876da314dSPeter De Schrijver /* PLLC4 */
120976da314dSPeter De Schrijver clk = tegra_clk_register_pllss("pll_c4", "pll_ref", clk_base, 0,
121076da314dSPeter De Schrijver &pll_c4_params, NULL);
121176da314dSPeter De Schrijver clk_register_clkdev(clk, "pll_c4", NULL);
121276da314dSPeter De Schrijver clks[TEGRA124_CLK_PLL_C4] = clk;
121376da314dSPeter De Schrijver
121476da314dSPeter De Schrijver /* PLLDP */
121576da314dSPeter De Schrijver clk = tegra_clk_register_pllss("pll_dp", "pll_ref", clk_base, 0,
121676da314dSPeter De Schrijver &pll_dp_params, NULL);
121776da314dSPeter De Schrijver clk_register_clkdev(clk, "pll_dp", NULL);
121876da314dSPeter De Schrijver clks[TEGRA124_CLK_PLL_DP] = clk;
121976da314dSPeter De Schrijver
122076da314dSPeter De Schrijver /* PLLD2 */
122176da314dSPeter De Schrijver clk = tegra_clk_register_pllss("pll_d2", "pll_ref", clk_base, 0,
122276da314dSPeter De Schrijver &tegra124_pll_d2_params, NULL);
122376da314dSPeter De Schrijver clk_register_clkdev(clk, "pll_d2", NULL);
122476da314dSPeter De Schrijver clks[TEGRA124_CLK_PLL_D2] = clk;
122576da314dSPeter De Schrijver
12260e766c2dSDavid Ung /* PLLD2_OUT0 */
122776da314dSPeter De Schrijver clk = clk_register_fixed_factor(NULL, "pll_d2_out0", "pll_d2",
12280e766c2dSDavid Ung CLK_SET_RATE_PARENT, 1, 1);
122976da314dSPeter De Schrijver clk_register_clkdev(clk, "pll_d2_out0", NULL);
123076da314dSPeter De Schrijver clks[TEGRA124_CLK_PLL_D2_OUT0] = clk;
123176da314dSPeter De Schrijver
123276da314dSPeter De Schrijver }
123376da314dSPeter De Schrijver
12349e036d3eSJoseph Lo /* Tegra124 CPU clock and reset control functions */
tegra124_wait_cpu_in_reset(u32 cpu)12359e036d3eSJoseph Lo static void tegra124_wait_cpu_in_reset(u32 cpu)
12369e036d3eSJoseph Lo {
12379e036d3eSJoseph Lo unsigned int reg;
12389e036d3eSJoseph Lo
12399e036d3eSJoseph Lo do {
12409e036d3eSJoseph Lo reg = readl(clk_base + CLK_RST_CONTROLLER_CPU_CMPLX_STATUS);
12419e036d3eSJoseph Lo cpu_relax();
12429e036d3eSJoseph Lo } while (!(reg & (1 << cpu))); /* check CPU been reset or not */
12439e036d3eSJoseph Lo }
12449e036d3eSJoseph Lo
tegra124_disable_cpu_clock(u32 cpu)12459e036d3eSJoseph Lo static void tegra124_disable_cpu_clock(u32 cpu)
12469e036d3eSJoseph Lo {
12479e036d3eSJoseph Lo /* flow controller would take care in the power sequence. */
12489e036d3eSJoseph Lo }
12499e036d3eSJoseph Lo
125061792e40SJoseph Lo #ifdef CONFIG_PM_SLEEP
tegra124_cpu_clock_suspend(void)125161792e40SJoseph Lo static void tegra124_cpu_clock_suspend(void)
125261792e40SJoseph Lo {
125361792e40SJoseph Lo /* switch coresite to clk_m, save off original source */
125461792e40SJoseph Lo tegra124_cpu_clk_sctx.clk_csite_src =
125561792e40SJoseph Lo readl(clk_base + CLK_SOURCE_CSITE);
125661792e40SJoseph Lo writel(3 << 30, clk_base + CLK_SOURCE_CSITE);
1257c38864a7STuomas Tynkkynen
1258c38864a7STuomas Tynkkynen tegra124_cpu_clk_sctx.cclkg_burst =
1259c38864a7STuomas Tynkkynen readl(clk_base + CCLKG_BURST_POLICY);
1260c38864a7STuomas Tynkkynen tegra124_cpu_clk_sctx.cclkg_divider =
1261c38864a7STuomas Tynkkynen readl(clk_base + CCLKG_BURST_POLICY + 4);
126261792e40SJoseph Lo }
126361792e40SJoseph Lo
tegra124_cpu_clock_resume(void)126461792e40SJoseph Lo static void tegra124_cpu_clock_resume(void)
126561792e40SJoseph Lo {
126661792e40SJoseph Lo writel(tegra124_cpu_clk_sctx.clk_csite_src,
126761792e40SJoseph Lo clk_base + CLK_SOURCE_CSITE);
1268c38864a7STuomas Tynkkynen
1269c38864a7STuomas Tynkkynen writel(tegra124_cpu_clk_sctx.cclkg_burst,
1270c38864a7STuomas Tynkkynen clk_base + CCLKG_BURST_POLICY);
1271c38864a7STuomas Tynkkynen writel(tegra124_cpu_clk_sctx.cclkg_divider,
1272c38864a7STuomas Tynkkynen clk_base + CCLKG_BURST_POLICY + 4);
127361792e40SJoseph Lo }
127461792e40SJoseph Lo #endif
127561792e40SJoseph Lo
12769e036d3eSJoseph Lo static struct tegra_cpu_car_ops tegra124_cpu_car_ops = {
12779e036d3eSJoseph Lo .wait_for_reset = tegra124_wait_cpu_in_reset,
12789e036d3eSJoseph Lo .disable_clock = tegra124_disable_cpu_clock,
127961792e40SJoseph Lo #ifdef CONFIG_PM_SLEEP
128061792e40SJoseph Lo .suspend = tegra124_cpu_clock_suspend,
128161792e40SJoseph Lo .resume = tegra124_cpu_clock_resume,
128261792e40SJoseph Lo #endif
12839e036d3eSJoseph Lo };
12849e036d3eSJoseph Lo
128576da314dSPeter De Schrijver static const struct of_device_id pmc_match[] __initconst = {
128676da314dSPeter De Schrijver { .compatible = "nvidia,tegra124-pmc" },
128776da314dSPeter De Schrijver { },
128876da314dSPeter De Schrijver };
128976da314dSPeter De Schrijver
129008acae34SPaul Walmsley static struct tegra_clk_init_table common_init_table[] __initdata = {
129176da314dSPeter De Schrijver { TEGRA124_CLK_UARTA, TEGRA124_CLK_PLL_P, 408000000, 0 },
129276da314dSPeter De Schrijver { TEGRA124_CLK_UARTB, TEGRA124_CLK_PLL_P, 408000000, 0 },
129376da314dSPeter De Schrijver { TEGRA124_CLK_UARTC, TEGRA124_CLK_PLL_P, 408000000, 0 },
129476da314dSPeter De Schrijver { TEGRA124_CLK_UARTD, TEGRA124_CLK_PLL_P, 408000000, 0 },
12954d3d6417SThierry Reding { TEGRA124_CLK_PLL_A, TEGRA124_CLK_CLK_MAX, 282240000, 0 },
1296efdd205cSSowjanya Komatineni { TEGRA124_CLK_PLL_A_OUT0, TEGRA124_CLK_CLK_MAX, 11289600, 0 },
129776da314dSPeter De Schrijver { TEGRA124_CLK_I2S0, TEGRA124_CLK_PLL_A_OUT0, 11289600, 0 },
129876da314dSPeter De Schrijver { TEGRA124_CLK_I2S1, TEGRA124_CLK_PLL_A_OUT0, 11289600, 0 },
129976da314dSPeter De Schrijver { TEGRA124_CLK_I2S2, TEGRA124_CLK_PLL_A_OUT0, 11289600, 0 },
130076da314dSPeter De Schrijver { TEGRA124_CLK_I2S3, TEGRA124_CLK_PLL_A_OUT0, 11289600, 0 },
130176da314dSPeter De Schrijver { TEGRA124_CLK_I2S4, TEGRA124_CLK_PLL_A_OUT0, 11289600, 0 },
13028097d4c7SThierry Reding { TEGRA124_CLK_VDE, TEGRA124_CLK_PLL_C3, 600000000, 0 },
130376da314dSPeter De Schrijver { TEGRA124_CLK_HOST1X, TEGRA124_CLK_PLL_P, 136000000, 1 },
1304f892f24bSSean Paul { TEGRA124_CLK_DSIALP, TEGRA124_CLK_PLL_P, 68000000, 0 },
1305f892f24bSSean Paul { TEGRA124_CLK_DSIBLP, TEGRA124_CLK_PLL_P, 68000000, 0 },
13062dcabf05SDmitry Osipenko { TEGRA124_CLK_SCLK, TEGRA124_CLK_PLL_P_OUT2, 102000000, 0 },
130776da314dSPeter De Schrijver { TEGRA124_CLK_DFLL_SOC, TEGRA124_CLK_PLL_P, 51000000, 1 },
130876da314dSPeter De Schrijver { TEGRA124_CLK_DFLL_REF, TEGRA124_CLK_PLL_P, 51000000, 1 },
130976da314dSPeter De Schrijver { TEGRA124_CLK_PLL_C, TEGRA124_CLK_CLK_MAX, 768000000, 0 },
131076da314dSPeter De Schrijver { TEGRA124_CLK_PLL_C_OUT1, TEGRA124_CLK_CLK_MAX, 100000000, 0 },
131176da314dSPeter De Schrijver { TEGRA124_CLK_SBC4, TEGRA124_CLK_PLL_P, 12000000, 1 },
131276da314dSPeter De Schrijver { TEGRA124_CLK_TSEC, TEGRA124_CLK_PLL_C3, 0, 0 },
131376da314dSPeter De Schrijver { TEGRA124_CLK_MSENC, TEGRA124_CLK_PLL_C3, 0, 0 },
13144a7f10d6SAndrew Bresticker { TEGRA124_CLK_PLL_RE_VCO, TEGRA124_CLK_CLK_MAX, 672000000, 0 },
13154a7f10d6SAndrew Bresticker { TEGRA124_CLK_XUSB_SS_SRC, TEGRA124_CLK_PLL_U_480M, 120000000, 0 },
13164a7f10d6SAndrew Bresticker { TEGRA124_CLK_XUSB_FS_SRC, TEGRA124_CLK_PLL_U_48M, 48000000, 0 },
13174a7f10d6SAndrew Bresticker { TEGRA124_CLK_XUSB_HS_SRC, TEGRA124_CLK_PLL_U_60M, 60000000, 0 },
13184a7f10d6SAndrew Bresticker { TEGRA124_CLK_XUSB_FALCON_SRC, TEGRA124_CLK_PLL_RE_OUT, 224000000, 0 },
13194a7f10d6SAndrew Bresticker { TEGRA124_CLK_XUSB_HOST_SRC, TEGRA124_CLK_PLL_RE_OUT, 112000000, 0 },
1320cb44cc2fSMikko Perttunen { TEGRA124_CLK_SATA, TEGRA124_CLK_PLL_P, 104000000, 0 },
1321cb44cc2fSMikko Perttunen { TEGRA124_CLK_SATA_OOB, TEGRA124_CLK_PLL_P, 204000000, 0 },
13220a7eec7fSPeter De Schrijver { TEGRA124_CLK_MSELECT, TEGRA124_CLK_CLK_MAX, 0, 1 },
13230a7eec7fSPeter De Schrijver { TEGRA124_CLK_CSITE, TEGRA124_CLK_CLK_MAX, 0, 1 },
13240a7eec7fSPeter De Schrijver { TEGRA124_CLK_TSENSOR, TEGRA124_CLK_CLK_M, 400000, 0 },
132526f8590cSThierry Reding { TEGRA124_CLK_VIC03, TEGRA124_CLK_PLL_C3, 0, 0 },
1326845d782dSJon Hunter { TEGRA124_CLK_SPDIF_IN_SYNC, TEGRA124_CLK_CLK_MAX, 24576000, 0 },
1327845d782dSJon Hunter { TEGRA124_CLK_I2S0_SYNC, TEGRA124_CLK_CLK_MAX, 24576000, 0 },
1328845d782dSJon Hunter { TEGRA124_CLK_I2S1_SYNC, TEGRA124_CLK_CLK_MAX, 24576000, 0 },
1329845d782dSJon Hunter { TEGRA124_CLK_I2S2_SYNC, TEGRA124_CLK_CLK_MAX, 24576000, 0 },
1330845d782dSJon Hunter { TEGRA124_CLK_I2S3_SYNC, TEGRA124_CLK_CLK_MAX, 24576000, 0 },
1331845d782dSJon Hunter { TEGRA124_CLK_I2S4_SYNC, TEGRA124_CLK_CLK_MAX, 24576000, 0 },
1332845d782dSJon Hunter { TEGRA124_CLK_VIMCLK_SYNC, TEGRA124_CLK_CLK_MAX, 24576000, 0 },
1333*c461c677SJon Hunter { TEGRA124_CLK_PWM, TEGRA124_CLK_PLL_P, 408000000, 0 },
13348d99704fSThierry Reding /* must be the last entry */
133576da314dSPeter De Schrijver { TEGRA124_CLK_CLK_MAX, TEGRA124_CLK_CLK_MAX, 0, 0 },
133676da314dSPeter De Schrijver };
133776da314dSPeter De Schrijver
133808acae34SPaul Walmsley static struct tegra_clk_init_table tegra124_init_table[] __initdata = {
133908acae34SPaul Walmsley { TEGRA124_CLK_SOC_THERM, TEGRA124_CLK_PLL_P, 51000000, 0 },
134008acae34SPaul Walmsley { TEGRA124_CLK_CCLK_G, TEGRA124_CLK_CLK_MAX, 0, 1 },
134104794d98SDylan Reid { TEGRA124_CLK_HDA, TEGRA124_CLK_PLL_P, 102000000, 0 },
134204794d98SDylan Reid { TEGRA124_CLK_HDA2CODEC_2X, TEGRA124_CLK_PLL_P, 48000000, 0 },
13438d99704fSThierry Reding /* must be the last entry */
134408acae34SPaul Walmsley { TEGRA124_CLK_CLK_MAX, TEGRA124_CLK_CLK_MAX, 0, 0 },
134508acae34SPaul Walmsley };
134608acae34SPaul Walmsley
134708acae34SPaul Walmsley /* Tegra132 requires the SOC_THERM clock to remain active */
134808acae34SPaul Walmsley static struct tegra_clk_init_table tegra132_init_table[] __initdata = {
134908acae34SPaul Walmsley { TEGRA124_CLK_SOC_THERM, TEGRA124_CLK_PLL_P, 51000000, 1 },
13508d99704fSThierry Reding /* must be the last entry */
135108acae34SPaul Walmsley { TEGRA124_CLK_CLK_MAX, TEGRA124_CLK_CLK_MAX, 0, 0 },
135208acae34SPaul Walmsley };
135308acae34SPaul Walmsley
135488d909beSRhyland Klein static struct tegra_audio_clk_info tegra124_audio_plls[] = {
135588d909beSRhyland Klein { "pll_a", &pll_a_params, tegra_clk_pll_a, "pll_p_out1" },
135688d909beSRhyland Klein };
135788d909beSRhyland Klein
135808acae34SPaul Walmsley /**
135908acae34SPaul Walmsley * tegra124_clock_apply_init_table - initialize clocks on Tegra124 SoCs
136008acae34SPaul Walmsley *
136108acae34SPaul Walmsley * Program an initial clock rate and enable or disable clocks needed
136208acae34SPaul Walmsley * by the rest of the kernel, for Tegra124 SoCs. It is intended to be
136308acae34SPaul Walmsley * called by assigning a pointer to it to tegra_clk_apply_init_table -
136408acae34SPaul Walmsley * this will be called as an arch_initcall. No return value.
136508acae34SPaul Walmsley */
tegra124_clock_apply_init_table(void)136676da314dSPeter De Schrijver static void __init tegra124_clock_apply_init_table(void)
136776da314dSPeter De Schrijver {
136808acae34SPaul Walmsley tegra_init_from_table(common_init_table, clks, TEGRA124_CLK_CLK_MAX);
136908acae34SPaul Walmsley tegra_init_from_table(tegra124_init_table, clks, TEGRA124_CLK_CLK_MAX);
137076da314dSPeter De Schrijver }
137176da314dSPeter De Schrijver
137208acae34SPaul Walmsley /**
1373a3c83ff2SPaul Walmsley * tegra124_car_barrier - wait for pending writes to the CAR to complete
1374a3c83ff2SPaul Walmsley *
1375a3c83ff2SPaul Walmsley * Wait for any outstanding writes to the CAR MMIO space from this CPU
1376a3c83ff2SPaul Walmsley * to complete before continuing execution. No return value.
1377a3c83ff2SPaul Walmsley */
tegra124_car_barrier(void)1378a3c83ff2SPaul Walmsley static void tegra124_car_barrier(void)
1379a3c83ff2SPaul Walmsley {
1380a3c83ff2SPaul Walmsley readl_relaxed(clk_base + RST_DFLL_DVCO);
1381a3c83ff2SPaul Walmsley }
1382a3c83ff2SPaul Walmsley
1383a3c83ff2SPaul Walmsley /**
1384a3c83ff2SPaul Walmsley * tegra124_clock_assert_dfll_dvco_reset - assert the DFLL's DVCO reset
1385a3c83ff2SPaul Walmsley *
1386a3c83ff2SPaul Walmsley * Assert the reset line of the DFLL's DVCO. No return value.
1387a3c83ff2SPaul Walmsley */
tegra124_clock_assert_dfll_dvco_reset(void)1388c5a132a8SStephen Boyd static void tegra124_clock_assert_dfll_dvco_reset(void)
1389a3c83ff2SPaul Walmsley {
1390a3c83ff2SPaul Walmsley u32 v;
1391a3c83ff2SPaul Walmsley
1392a3c83ff2SPaul Walmsley v = readl_relaxed(clk_base + RST_DFLL_DVCO);
1393a3c83ff2SPaul Walmsley v |= (1 << DVFS_DFLL_RESET_SHIFT);
1394a3c83ff2SPaul Walmsley writel_relaxed(v, clk_base + RST_DFLL_DVCO);
1395a3c83ff2SPaul Walmsley tegra124_car_barrier();
1396a3c83ff2SPaul Walmsley }
1397a3c83ff2SPaul Walmsley
1398a3c83ff2SPaul Walmsley /**
1399a3c83ff2SPaul Walmsley * tegra124_clock_deassert_dfll_dvco_reset - deassert the DFLL's DVCO reset
1400a3c83ff2SPaul Walmsley *
1401a3c83ff2SPaul Walmsley * Deassert the reset line of the DFLL's DVCO, allowing the DVCO to
1402a3c83ff2SPaul Walmsley * operate. No return value.
1403a3c83ff2SPaul Walmsley */
tegra124_clock_deassert_dfll_dvco_reset(void)1404c5a132a8SStephen Boyd static void tegra124_clock_deassert_dfll_dvco_reset(void)
1405a3c83ff2SPaul Walmsley {
1406a3c83ff2SPaul Walmsley u32 v;
1407a3c83ff2SPaul Walmsley
1408a3c83ff2SPaul Walmsley v = readl_relaxed(clk_base + RST_DFLL_DVCO);
1409a3c83ff2SPaul Walmsley v &= ~(1 << DVFS_DFLL_RESET_SHIFT);
1410a3c83ff2SPaul Walmsley writel_relaxed(v, clk_base + RST_DFLL_DVCO);
1411a3c83ff2SPaul Walmsley tegra124_car_barrier();
1412a3c83ff2SPaul Walmsley }
1413a3c83ff2SPaul Walmsley
tegra124_reset_assert(unsigned long id)1414c5a132a8SStephen Boyd static int tegra124_reset_assert(unsigned long id)
1415a3c83ff2SPaul Walmsley {
1416a3c83ff2SPaul Walmsley if (id == TEGRA124_RST_DFLL_DVCO)
1417a3c83ff2SPaul Walmsley tegra124_clock_assert_dfll_dvco_reset();
1418a3c83ff2SPaul Walmsley else
1419a3c83ff2SPaul Walmsley return -EINVAL;
1420a3c83ff2SPaul Walmsley
1421a3c83ff2SPaul Walmsley return 0;
1422a3c83ff2SPaul Walmsley }
1423a3c83ff2SPaul Walmsley
tegra124_reset_deassert(unsigned long id)1424c5a132a8SStephen Boyd static int tegra124_reset_deassert(unsigned long id)
1425a3c83ff2SPaul Walmsley {
1426a3c83ff2SPaul Walmsley if (id == TEGRA124_RST_DFLL_DVCO)
1427a3c83ff2SPaul Walmsley tegra124_clock_deassert_dfll_dvco_reset();
1428a3c83ff2SPaul Walmsley else
1429a3c83ff2SPaul Walmsley return -EINVAL;
1430a3c83ff2SPaul Walmsley
1431a3c83ff2SPaul Walmsley return 0;
1432a3c83ff2SPaul Walmsley }
1433a3c83ff2SPaul Walmsley
1434a3c83ff2SPaul Walmsley /**
143508acae34SPaul Walmsley * tegra132_clock_apply_init_table - initialize clocks on Tegra132 SoCs
143608acae34SPaul Walmsley *
143708acae34SPaul Walmsley * Program an initial clock rate and enable or disable clocks needed
143808acae34SPaul Walmsley * by the rest of the kernel, for Tegra132 SoCs. It is intended to be
143908acae34SPaul Walmsley * called by assigning a pointer to it to tegra_clk_apply_init_table -
144008acae34SPaul Walmsley * this will be called as an arch_initcall. No return value.
144108acae34SPaul Walmsley */
tegra132_clock_apply_init_table(void)144208acae34SPaul Walmsley static void __init tegra132_clock_apply_init_table(void)
144308acae34SPaul Walmsley {
144408acae34SPaul Walmsley tegra_init_from_table(common_init_table, clks, TEGRA124_CLK_CLK_MAX);
144508acae34SPaul Walmsley tegra_init_from_table(tegra132_init_table, clks, TEGRA124_CLK_CLK_MAX);
144608acae34SPaul Walmsley }
144708acae34SPaul Walmsley
144808acae34SPaul Walmsley /**
144908acae34SPaul Walmsley * tegra124_132_clock_init_pre - clock initialization preamble for T124/T132
145008acae34SPaul Walmsley * @np: struct device_node * of the DT node for the SoC CAR IP block
145108acae34SPaul Walmsley *
1452acbeec3dSSowjanya Komatineni * Register most of the clocks controlled by the CAR IP block.
1453acbeec3dSSowjanya Komatineni * Everything in this function should be common to Tegra124 and Tegra132.
1454acbeec3dSSowjanya Komatineni * No return value.
145508acae34SPaul Walmsley */
tegra124_132_clock_init_pre(struct device_node * np)145608acae34SPaul Walmsley static void __init tegra124_132_clock_init_pre(struct device_node *np)
145776da314dSPeter De Schrijver {
145876da314dSPeter De Schrijver struct device_node *node;
1459b270491eSMark Zhang u32 plld_base;
146076da314dSPeter De Schrijver
146176da314dSPeter De Schrijver clk_base = of_iomap(np, 0);
146276da314dSPeter De Schrijver if (!clk_base) {
146308acae34SPaul Walmsley pr_err("ioremap tegra124/tegra132 CAR failed\n");
146476da314dSPeter De Schrijver return;
146576da314dSPeter De Schrijver }
146676da314dSPeter De Schrijver
146776da314dSPeter De Schrijver node = of_find_matching_node(NULL, pmc_match);
146876da314dSPeter De Schrijver if (!node) {
146976da314dSPeter De Schrijver pr_err("Failed to find pmc node\n");
147076da314dSPeter De Schrijver WARN_ON(1);
147176da314dSPeter De Schrijver return;
147276da314dSPeter De Schrijver }
147376da314dSPeter De Schrijver
147476da314dSPeter De Schrijver pmc_base = of_iomap(node, 0);
147502bd544fSLiang He of_node_put(node);
147676da314dSPeter De Schrijver if (!pmc_base) {
147776da314dSPeter De Schrijver pr_err("Can't map pmc registers\n");
147876da314dSPeter De Schrijver WARN_ON(1);
147976da314dSPeter De Schrijver return;
148076da314dSPeter De Schrijver }
148176da314dSPeter De Schrijver
148208acae34SPaul Walmsley clks = tegra_clk_init(clk_base, TEGRA124_CLK_CLK_MAX,
148308acae34SPaul Walmsley TEGRA124_CAR_BANK_COUNT);
148476da314dSPeter De Schrijver if (!clks)
148576da314dSPeter De Schrijver return;
148676da314dSPeter De Schrijver
148776da314dSPeter De Schrijver if (tegra_osc_clk_init(clk_base, tegra124_clks, tegra124_input_freq,
148863cc5a4dSThierry Reding ARRAY_SIZE(tegra124_input_freq), 1, &osc_freq,
148963cc5a4dSThierry Reding &pll_ref_freq) < 0)
149076da314dSPeter De Schrijver return;
149176da314dSPeter De Schrijver
149276da314dSPeter De Schrijver tegra_fixed_clk_init(tegra124_clks);
149376da314dSPeter De Schrijver tegra124_pll_init(clk_base, pmc_base);
149476da314dSPeter De Schrijver tegra124_periph_clk_init(clk_base, pmc_base);
149588d909beSRhyland Klein tegra_audio_clk_init(clk_base, pmc_base, tegra124_clks,
149688d909beSRhyland Klein tegra124_audio_plls,
1497845d782dSJon Hunter ARRAY_SIZE(tegra124_audio_plls), 24576000);
1498b270491eSMark Zhang
1499b270491eSMark Zhang /* For Tegra124 & Tegra132, PLLD is the only source for DSIA & DSIB */
15005834fd75SJonas Gorski plld_base = readl(clk_base + PLLD_BASE);
1501b270491eSMark Zhang plld_base &= ~BIT(25);
15025834fd75SJonas Gorski writel(plld_base, clk_base + PLLD_BASE);
150308acae34SPaul Walmsley }
150476da314dSPeter De Schrijver
tegra124_clk_src_onecell_get(struct of_phandle_args * clkspec,void * data)1505281462e5SDmitry Osipenko static struct clk *tegra124_clk_src_onecell_get(struct of_phandle_args *clkspec,
1506281462e5SDmitry Osipenko void *data)
1507281462e5SDmitry Osipenko {
1508281462e5SDmitry Osipenko struct clk_hw *hw;
1509281462e5SDmitry Osipenko struct clk *clk;
1510281462e5SDmitry Osipenko
1511281462e5SDmitry Osipenko clk = of_clk_src_onecell_get(clkspec, data);
1512281462e5SDmitry Osipenko if (IS_ERR(clk))
1513281462e5SDmitry Osipenko return clk;
1514281462e5SDmitry Osipenko
1515281462e5SDmitry Osipenko hw = __clk_get_hw(clk);
1516281462e5SDmitry Osipenko
1517281462e5SDmitry Osipenko if (clkspec->args[0] == TEGRA124_CLK_EMC) {
1518281462e5SDmitry Osipenko if (!tegra124_clk_emc_driver_available(hw))
1519281462e5SDmitry Osipenko return ERR_PTR(-EPROBE_DEFER);
1520281462e5SDmitry Osipenko }
1521281462e5SDmitry Osipenko
1522281462e5SDmitry Osipenko return clk;
1523281462e5SDmitry Osipenko }
1524281462e5SDmitry Osipenko
152508acae34SPaul Walmsley /**
152608acae34SPaul Walmsley * tegra124_132_clock_init_post - clock initialization postamble for T124/T132
152708acae34SPaul Walmsley * @np: struct device_node * of the DT node for the SoC CAR IP block
152808acae34SPaul Walmsley *
1529acbeec3dSSowjanya Komatineni * Register most of the clocks controlled by the CAR IP block.
1530acbeec3dSSowjanya Komatineni * Everything in this function should be common to Tegra124
153108acae34SPaul Walmsley * and Tegra132. This function must be called after
1532acbeec3dSSowjanya Komatineni * tegra124_132_clock_init_pre(), otherwise clk_base will not be set.
1533acbeec3dSSowjanya Komatineni * No return value.
153408acae34SPaul Walmsley */
tegra124_132_clock_init_post(struct device_node * np)153508acae34SPaul Walmsley static void __init tegra124_132_clock_init_post(struct device_node *np)
153608acae34SPaul Walmsley {
153776da314dSPeter De Schrijver tegra_super_clk_gen4_init(clk_base, pmc_base, tegra124_clks,
153876da314dSPeter De Schrijver &pll_x_params);
1539a3c83ff2SPaul Walmsley tegra_init_special_resets(1, tegra124_reset_assert,
1540a3c83ff2SPaul Walmsley tegra124_reset_deassert);
1541281462e5SDmitry Osipenko tegra_add_of_provider(np, tegra124_clk_src_onecell_get);
15422db04f16SMikko Perttunen
1543281462e5SDmitry Osipenko clks[TEGRA124_CLK_EMC] = tegra124_clk_register_emc(clk_base, np,
15442db04f16SMikko Perttunen &emc_lock);
15452db04f16SMikko Perttunen
154676da314dSPeter De Schrijver tegra_register_devclks(devclks, ARRAY_SIZE(devclks));
154776da314dSPeter De Schrijver
15489e036d3eSJoseph Lo tegra_cpu_car_ops = &tegra124_cpu_car_ops;
154976da314dSPeter De Schrijver }
155008acae34SPaul Walmsley
155108acae34SPaul Walmsley /**
155208acae34SPaul Walmsley * tegra124_clock_init - Tegra124-specific clock initialization
155308acae34SPaul Walmsley * @np: struct device_node * of the DT node for the SoC CAR IP block
155408acae34SPaul Walmsley *
155508acae34SPaul Walmsley * Register most SoC clocks for the Tegra124 system-on-chip. Most of
155608acae34SPaul Walmsley * this code is shared between the Tegra124 and Tegra132 SoCs,
155708acae34SPaul Walmsley * although some of the initial clock settings and CPU clocks differ.
155808acae34SPaul Walmsley * Intended to be called by the OF init code when a DT node with the
155908acae34SPaul Walmsley * "nvidia,tegra124-car" string is encountered, and declared with
156008acae34SPaul Walmsley * CLK_OF_DECLARE. No return value.
156108acae34SPaul Walmsley */
tegra124_clock_init(struct device_node * np)156208acae34SPaul Walmsley static void __init tegra124_clock_init(struct device_node *np)
156308acae34SPaul Walmsley {
156408acae34SPaul Walmsley tegra124_132_clock_init_pre(np);
156508acae34SPaul Walmsley tegra_clk_apply_init_table = tegra124_clock_apply_init_table;
156608acae34SPaul Walmsley tegra124_132_clock_init_post(np);
156708acae34SPaul Walmsley }
156808acae34SPaul Walmsley
156908acae34SPaul Walmsley /**
157008acae34SPaul Walmsley * tegra132_clock_init - Tegra132-specific clock initialization
157108acae34SPaul Walmsley * @np: struct device_node * of the DT node for the SoC CAR IP block
157208acae34SPaul Walmsley *
157308acae34SPaul Walmsley * Register most SoC clocks for the Tegra132 system-on-chip. Most of
157408acae34SPaul Walmsley * this code is shared between the Tegra124 and Tegra132 SoCs,
157508acae34SPaul Walmsley * although some of the initial clock settings and CPU clocks differ.
157608acae34SPaul Walmsley * Intended to be called by the OF init code when a DT node with the
157708acae34SPaul Walmsley * "nvidia,tegra132-car" string is encountered, and declared with
157808acae34SPaul Walmsley * CLK_OF_DECLARE. No return value.
157908acae34SPaul Walmsley */
tegra132_clock_init(struct device_node * np)158008acae34SPaul Walmsley static void __init tegra132_clock_init(struct device_node *np)
158108acae34SPaul Walmsley {
158208acae34SPaul Walmsley tegra124_132_clock_init_pre(np);
158308acae34SPaul Walmsley
158408acae34SPaul Walmsley /*
158508acae34SPaul Walmsley * On Tegra132, these clocks are controlled by the
158608acae34SPaul Walmsley * CLUSTER_clocks IP block, located in the CPU complex
158708acae34SPaul Walmsley */
158808acae34SPaul Walmsley tegra124_clks[tegra_clk_cclk_g].present = false;
158908acae34SPaul Walmsley tegra124_clks[tegra_clk_cclk_lp].present = false;
159008acae34SPaul Walmsley tegra124_clks[tegra_clk_pll_x].present = false;
159108acae34SPaul Walmsley tegra124_clks[tegra_clk_pll_x_out0].present = false;
159208acae34SPaul Walmsley
159308acae34SPaul Walmsley tegra_clk_apply_init_table = tegra132_clock_apply_init_table;
159408acae34SPaul Walmsley tegra124_132_clock_init_post(np);
159508acae34SPaul Walmsley }
159676da314dSPeter De Schrijver CLK_OF_DECLARE(tegra124, "nvidia,tegra124-car", tegra124_clock_init);
159708acae34SPaul Walmsley CLK_OF_DECLARE(tegra132, "nvidia,tegra132-car", tegra132_clock_init);
1598