diff options
Diffstat (limited to 'drivers/clk/tegra')
-rw-r--r-- | drivers/clk/tegra/clk-divider.c | 13 | ||||
-rw-r--r-- | drivers/clk/tegra/clk-tegra114.c | 7 | ||||
-rw-r--r-- | drivers/clk/tegra/clk-tegra124.c | 7 | ||||
-rw-r--r-- | drivers/clk/tegra/clk-tegra20.c | 8 | ||||
-rw-r--r-- | drivers/clk/tegra/clk-tegra30.c | 7 | ||||
-rw-r--r-- | drivers/clk/tegra/clk.h | 2 |
6 files changed, 40 insertions, 4 deletions
diff --git a/drivers/clk/tegra/clk-divider.c b/drivers/clk/tegra/clk-divider.c index 290f9c1a3749..59a5714dfe18 100644 --- a/drivers/clk/tegra/clk-divider.c +++ b/drivers/clk/tegra/clk-divider.c | |||
@@ -185,3 +185,16 @@ struct clk *tegra_clk_register_divider(const char *name, | |||
185 | 185 | ||
186 | return clk; | 186 | return clk; |
187 | } | 187 | } |
188 | |||
189 | static const struct clk_div_table mc_div_table[] = { | ||
190 | { .val = 0, .div = 2 }, | ||
191 | { .val = 1, .div = 1 }, | ||
192 | { .val = 0, .div = 0 }, | ||
193 | }; | ||
194 | |||
195 | struct clk *tegra_clk_register_mc(const char *name, const char *parent_name, | ||
196 | void __iomem *reg, spinlock_t *lock) | ||
197 | { | ||
198 | return clk_register_divider_table(NULL, name, parent_name, 0, reg, | ||
199 | 16, 1, 0, mc_div_table, lock); | ||
200 | } | ||
diff --git a/drivers/clk/tegra/clk-tegra114.c b/drivers/clk/tegra/clk-tegra114.c index f760f31d05c4..0b03d2cf7264 100644 --- a/drivers/clk/tegra/clk-tegra114.c +++ b/drivers/clk/tegra/clk-tegra114.c | |||
@@ -173,6 +173,7 @@ static DEFINE_SPINLOCK(pll_d_lock); | |||
173 | static DEFINE_SPINLOCK(pll_d2_lock); | 173 | static DEFINE_SPINLOCK(pll_d2_lock); |
174 | static DEFINE_SPINLOCK(pll_u_lock); | 174 | static DEFINE_SPINLOCK(pll_u_lock); |
175 | static DEFINE_SPINLOCK(pll_re_lock); | 175 | static DEFINE_SPINLOCK(pll_re_lock); |
176 | static DEFINE_SPINLOCK(emc_lock); | ||
176 | 177 | ||
177 | static struct div_nmp pllxc_nmp = { | 178 | static struct div_nmp pllxc_nmp = { |
178 | .divm_shift = 0, | 179 | .divm_shift = 0, |
@@ -1228,7 +1229,11 @@ static __init void tegra114_periph_clk_init(void __iomem *clk_base, | |||
1228 | ARRAY_SIZE(mux_pllmcp_clkm), | 1229 | ARRAY_SIZE(mux_pllmcp_clkm), |
1229 | CLK_SET_RATE_NO_REPARENT, | 1230 | CLK_SET_RATE_NO_REPARENT, |
1230 | clk_base + CLK_SOURCE_EMC, | 1231 | clk_base + CLK_SOURCE_EMC, |
1231 | 29, 3, 0, NULL); | 1232 | 29, 3, 0, &emc_lock); |
1233 | |||
1234 | clk = tegra_clk_register_mc("mc", "emc_mux", clk_base + CLK_SOURCE_EMC, | ||
1235 | &emc_lock); | ||
1236 | clks[TEGRA114_CLK_MC] = clk; | ||
1232 | 1237 | ||
1233 | for (i = 0; i < ARRAY_SIZE(tegra_periph_clk_list); i++) { | 1238 | for (i = 0; i < ARRAY_SIZE(tegra_periph_clk_list); i++) { |
1234 | data = &tegra_periph_clk_list[i]; | 1239 | data = &tegra_periph_clk_list[i]; |
diff --git a/drivers/clk/tegra/clk-tegra124.c b/drivers/clk/tegra/clk-tegra124.c index e3a85842ce0c..f5f9baca7bb6 100644 --- a/drivers/clk/tegra/clk-tegra124.c +++ b/drivers/clk/tegra/clk-tegra124.c | |||
@@ -132,6 +132,7 @@ static DEFINE_SPINLOCK(pll_d2_lock); | |||
132 | static DEFINE_SPINLOCK(pll_e_lock); | 132 | static DEFINE_SPINLOCK(pll_e_lock); |
133 | static DEFINE_SPINLOCK(pll_re_lock); | 133 | static DEFINE_SPINLOCK(pll_re_lock); |
134 | static DEFINE_SPINLOCK(pll_u_lock); | 134 | static DEFINE_SPINLOCK(pll_u_lock); |
135 | static DEFINE_SPINLOCK(emc_lock); | ||
135 | 136 | ||
136 | /* possible OSC frequencies in Hz */ | 137 | /* possible OSC frequencies in Hz */ |
137 | static unsigned long tegra124_input_freq[] = { | 138 | static unsigned long tegra124_input_freq[] = { |
@@ -1127,7 +1128,11 @@ static __init void tegra124_periph_clk_init(void __iomem *clk_base, | |||
1127 | clk = clk_register_mux(NULL, "emc_mux", mux_pllmcp_clkm, | 1128 | clk = clk_register_mux(NULL, "emc_mux", mux_pllmcp_clkm, |
1128 | ARRAY_SIZE(mux_pllmcp_clkm), 0, | 1129 | ARRAY_SIZE(mux_pllmcp_clkm), 0, |
1129 | clk_base + CLK_SOURCE_EMC, | 1130 | clk_base + CLK_SOURCE_EMC, |
1130 | 29, 3, 0, NULL); | 1131 | 29, 3, 0, &emc_lock); |
1132 | |||
1133 | clk = tegra_clk_register_mc("mc", "emc_mux", clk_base + CLK_SOURCE_EMC, | ||
1134 | &emc_lock); | ||
1135 | clks[TEGRA124_CLK_MC] = clk; | ||
1131 | 1136 | ||
1132 | /* cml0 */ | 1137 | /* cml0 */ |
1133 | clk = clk_register_gate(NULL, "cml0", "pll_e", 0, clk_base + PLLE_AUX, | 1138 | clk = clk_register_gate(NULL, "cml0", "pll_e", 0, clk_base + PLLE_AUX, |
diff --git a/drivers/clk/tegra/clk-tegra20.c b/drivers/clk/tegra/clk-tegra20.c index dace2b1b5ae6..41272dcc9e22 100644 --- a/drivers/clk/tegra/clk-tegra20.c +++ b/drivers/clk/tegra/clk-tegra20.c | |||
@@ -140,6 +140,8 @@ static struct cpu_clk_suspend_context { | |||
140 | static void __iomem *clk_base; | 140 | static void __iomem *clk_base; |
141 | static void __iomem *pmc_base; | 141 | static void __iomem *pmc_base; |
142 | 142 | ||
143 | static DEFINE_SPINLOCK(emc_lock); | ||
144 | |||
143 | #define TEGRA_INIT_DATA_MUX(_name, _parents, _offset, \ | 145 | #define TEGRA_INIT_DATA_MUX(_name, _parents, _offset, \ |
144 | _clk_num, _gate_flags, _clk_id) \ | 146 | _clk_num, _gate_flags, _clk_id) \ |
145 | TEGRA_INIT_DATA(_name, NULL, NULL, _parents, _offset, \ | 147 | TEGRA_INIT_DATA(_name, NULL, NULL, _parents, _offset, \ |
@@ -819,11 +821,15 @@ static void __init tegra20_periph_clk_init(void) | |||
819 | ARRAY_SIZE(mux_pllmcp_clkm), | 821 | ARRAY_SIZE(mux_pllmcp_clkm), |
820 | CLK_SET_RATE_NO_REPARENT, | 822 | CLK_SET_RATE_NO_REPARENT, |
821 | clk_base + CLK_SOURCE_EMC, | 823 | clk_base + CLK_SOURCE_EMC, |
822 | 30, 2, 0, NULL); | 824 | 30, 2, 0, &emc_lock); |
823 | clk = tegra_clk_register_periph_gate("emc", "emc_mux", 0, clk_base, 0, | 825 | clk = tegra_clk_register_periph_gate("emc", "emc_mux", 0, clk_base, 0, |
824 | 57, periph_clk_enb_refcnt); | 826 | 57, periph_clk_enb_refcnt); |
825 | clks[TEGRA20_CLK_EMC] = clk; | 827 | clks[TEGRA20_CLK_EMC] = clk; |
826 | 828 | ||
829 | clk = tegra_clk_register_mc("mc", "emc_mux", clk_base + CLK_SOURCE_EMC, | ||
830 | &emc_lock); | ||
831 | clks[TEGRA20_CLK_MC] = clk; | ||
832 | |||
827 | /* dsi */ | 833 | /* dsi */ |
828 | clk = tegra_clk_register_periph_gate("dsi", "pll_d", 0, clk_base, 0, | 834 | clk = tegra_clk_register_periph_gate("dsi", "pll_d", 0, clk_base, 0, |
829 | 48, periph_clk_enb_refcnt); | 835 | 48, periph_clk_enb_refcnt); |
diff --git a/drivers/clk/tegra/clk-tegra30.c b/drivers/clk/tegra/clk-tegra30.c index 5bbacd01094f..4b9d8bd3d0bf 100644 --- a/drivers/clk/tegra/clk-tegra30.c +++ b/drivers/clk/tegra/clk-tegra30.c | |||
@@ -177,6 +177,7 @@ static unsigned long input_freq; | |||
177 | 177 | ||
178 | static DEFINE_SPINLOCK(cml_lock); | 178 | static DEFINE_SPINLOCK(cml_lock); |
179 | static DEFINE_SPINLOCK(pll_d_lock); | 179 | static DEFINE_SPINLOCK(pll_d_lock); |
180 | static DEFINE_SPINLOCK(emc_lock); | ||
180 | 181 | ||
181 | #define TEGRA_INIT_DATA_MUX(_name, _parents, _offset, \ | 182 | #define TEGRA_INIT_DATA_MUX(_name, _parents, _offset, \ |
182 | _clk_num, _gate_flags, _clk_id) \ | 183 | _clk_num, _gate_flags, _clk_id) \ |
@@ -1157,11 +1158,15 @@ static void __init tegra30_periph_clk_init(void) | |||
1157 | ARRAY_SIZE(mux_pllmcp_clkm), | 1158 | ARRAY_SIZE(mux_pllmcp_clkm), |
1158 | CLK_SET_RATE_NO_REPARENT, | 1159 | CLK_SET_RATE_NO_REPARENT, |
1159 | clk_base + CLK_SOURCE_EMC, | 1160 | clk_base + CLK_SOURCE_EMC, |
1160 | 30, 2, 0, NULL); | 1161 | 30, 2, 0, &emc_lock); |
1161 | clk = tegra_clk_register_periph_gate("emc", "emc_mux", 0, clk_base, 0, | 1162 | clk = tegra_clk_register_periph_gate("emc", "emc_mux", 0, clk_base, 0, |
1162 | 57, periph_clk_enb_refcnt); | 1163 | 57, periph_clk_enb_refcnt); |
1163 | clks[TEGRA30_CLK_EMC] = clk; | 1164 | clks[TEGRA30_CLK_EMC] = clk; |
1164 | 1165 | ||
1166 | clk = tegra_clk_register_mc("mc", "emc_mux", clk_base + CLK_SOURCE_EMC, | ||
1167 | &emc_lock); | ||
1168 | clks[TEGRA30_CLK_MC] = clk; | ||
1169 | |||
1165 | /* cml0 */ | 1170 | /* cml0 */ |
1166 | clk = clk_register_gate(NULL, "cml0", "pll_e", 0, clk_base + PLLE_AUX, | 1171 | clk = clk_register_gate(NULL, "cml0", "pll_e", 0, clk_base + PLLE_AUX, |
1167 | 0, 0, &cml_lock); | 1172 | 0, 0, &cml_lock); |
diff --git a/drivers/clk/tegra/clk.h b/drivers/clk/tegra/clk.h index 16ec8d6bb87f..4e458aa8d45c 100644 --- a/drivers/clk/tegra/clk.h +++ b/drivers/clk/tegra/clk.h | |||
@@ -86,6 +86,8 @@ struct clk *tegra_clk_register_divider(const char *name, | |||
86 | const char *parent_name, void __iomem *reg, | 86 | const char *parent_name, void __iomem *reg, |
87 | unsigned long flags, u8 clk_divider_flags, u8 shift, u8 width, | 87 | unsigned long flags, u8 clk_divider_flags, u8 shift, u8 width, |
88 | u8 frac_width, spinlock_t *lock); | 88 | u8 frac_width, spinlock_t *lock); |
89 | struct clk *tegra_clk_register_mc(const char *name, const char *parent_name, | ||
90 | void __iomem *reg, spinlock_t *lock); | ||
89 | 91 | ||
90 | /* | 92 | /* |
91 | * Tegra PLL: | 93 | * Tegra PLL: |