Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

clk: tegra: Implement memory-controller clock

The memory controller clock runs either at half or the same frequency as
the EMC clock.

Reviewed-By: Tomeu Vizoso <tomeu.vizoso@collabora.com>
Acked-by: Mike Turquette <mturquette@linaro.org>
Signed-off-by: Thierry Reding <treding@nvidia.com>

+43 -7
+13
drivers/clk/tegra/clk-divider.c
··· 185 185 186 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 + }
+6 -1
drivers/clk/tegra/clk-tegra114.c
··· 173 173 static DEFINE_SPINLOCK(pll_d2_lock); 174 174 static DEFINE_SPINLOCK(pll_u_lock); 175 175 static DEFINE_SPINLOCK(pll_re_lock); 176 + static DEFINE_SPINLOCK(emc_lock); 176 177 177 178 static struct div_nmp pllxc_nmp = { 178 179 .divm_shift = 0, ··· 1229 1228 ARRAY_SIZE(mux_pllmcp_clkm), 1230 1229 CLK_SET_RATE_NO_REPARENT, 1231 1230 clk_base + CLK_SOURCE_EMC, 1232 - 29, 3, 0, NULL); 1231 + 29, 3, 0, &emc_lock); 1232 + 1233 + clk = tegra_clk_register_mc("mc", "emc_mux", clk_base + CLK_SOURCE_EMC, 1234 + &emc_lock); 1235 + clks[TEGRA114_CLK_MC] = clk; 1233 1236 1234 1237 for (i = 0; i < ARRAY_SIZE(tegra_periph_clk_list); i++) { 1235 1238 data = &tegra_periph_clk_list[i];
+6 -1
drivers/clk/tegra/clk-tegra124.c
··· 132 132 static DEFINE_SPINLOCK(pll_e_lock); 133 133 static DEFINE_SPINLOCK(pll_re_lock); 134 134 static DEFINE_SPINLOCK(pll_u_lock); 135 + static DEFINE_SPINLOCK(emc_lock); 135 136 136 137 /* possible OSC frequencies in Hz */ 137 138 static unsigned long tegra124_input_freq[] = { ··· 1128 1127 clk = clk_register_mux(NULL, "emc_mux", mux_pllmcp_clkm, 1129 1128 ARRAY_SIZE(mux_pllmcp_clkm), 0, 1130 1129 clk_base + CLK_SOURCE_EMC, 1131 - 29, 3, 0, NULL); 1130 + 29, 3, 0, &emc_lock); 1131 + 1132 + clk = tegra_clk_register_mc("mc", "emc_mux", clk_base + CLK_SOURCE_EMC, 1133 + &emc_lock); 1134 + clks[TEGRA124_CLK_MC] = clk; 1132 1135 1133 1136 /* cml0 */ 1134 1137 clk = clk_register_gate(NULL, "cml0", "pll_e", 0, clk_base + PLLE_AUX,
+7 -1
drivers/clk/tegra/clk-tegra20.c
··· 140 140 static void __iomem *clk_base; 141 141 static void __iomem *pmc_base; 142 142 143 + static DEFINE_SPINLOCK(emc_lock); 144 + 143 145 #define TEGRA_INIT_DATA_MUX(_name, _parents, _offset, \ 144 146 _clk_num, _gate_flags, _clk_id) \ 145 147 TEGRA_INIT_DATA(_name, NULL, NULL, _parents, _offset, \ ··· 821 819 ARRAY_SIZE(mux_pllmcp_clkm), 822 820 CLK_SET_RATE_NO_REPARENT, 823 821 clk_base + CLK_SOURCE_EMC, 824 - 30, 2, 0, NULL); 822 + 30, 2, 0, &emc_lock); 825 823 clk = tegra_clk_register_periph_gate("emc", "emc_mux", 0, clk_base, 0, 826 824 57, periph_clk_enb_refcnt); 827 825 clks[TEGRA20_CLK_EMC] = clk; 826 + 827 + clk = tegra_clk_register_mc("mc", "emc_mux", clk_base + CLK_SOURCE_EMC, 828 + &emc_lock); 829 + clks[TEGRA20_CLK_MC] = clk; 828 830 829 831 /* dsi */ 830 832 clk = tegra_clk_register_periph_gate("dsi", "pll_d", 0, clk_base, 0,
+6 -1
drivers/clk/tegra/clk-tegra30.c
··· 177 177 178 178 static DEFINE_SPINLOCK(cml_lock); 179 179 static DEFINE_SPINLOCK(pll_d_lock); 180 + static DEFINE_SPINLOCK(emc_lock); 180 181 181 182 #define TEGRA_INIT_DATA_MUX(_name, _parents, _offset, \ 182 183 _clk_num, _gate_flags, _clk_id) \ ··· 1158 1157 ARRAY_SIZE(mux_pllmcp_clkm), 1159 1158 CLK_SET_RATE_NO_REPARENT, 1160 1159 clk_base + CLK_SOURCE_EMC, 1161 - 30, 2, 0, NULL); 1160 + 30, 2, 0, &emc_lock); 1162 1161 clk = tegra_clk_register_periph_gate("emc", "emc_mux", 0, clk_base, 0, 1163 1162 57, periph_clk_enb_refcnt); 1164 1163 clks[TEGRA30_CLK_EMC] = clk; 1164 + 1165 + clk = tegra_clk_register_mc("mc", "emc_mux", clk_base + CLK_SOURCE_EMC, 1166 + &emc_lock); 1167 + clks[TEGRA30_CLK_MC] = clk; 1165 1168 1166 1169 /* cml0 */ 1167 1170 clk = clk_register_gate(NULL, "cml0", "pll_e", 0, clk_base + PLLE_AUX,
+2
drivers/clk/tegra/clk.h
··· 86 86 const char *parent_name, void __iomem *reg, 87 87 unsigned long flags, u8 clk_divider_flags, u8 shift, u8 width, 88 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 93 * Tegra PLL:
+1 -1
include/dt-bindings/clock/tegra114-car.h
··· 49 49 #define TEGRA114_CLK_I2S0 30 50 50 /* 31 */ 51 51 52 - /* 32 */ 52 + #define TEGRA114_CLK_MC 32 53 53 /* 33 */ 54 54 #define TEGRA114_CLK_APBDMA 34 55 55 /* 35 */
+1 -1
include/dt-bindings/clock/tegra124-car.h
··· 48 48 #define TEGRA124_CLK_I2S0 30 49 49 /* 31 */ 50 50 51 - /* 32 */ 51 + #define TEGRA124_CLK_MC 32 52 52 /* 33 */ 53 53 #define TEGRA124_CLK_APBDMA 34 54 54 /* 35 */
+1 -1
include/dt-bindings/clock/tegra20-car.h
··· 49 49 /* 30 */ 50 50 #define TEGRA20_CLK_CACHE2 31 51 51 52 - #define TEGRA20_CLK_MEM 32 52 + #define TEGRA20_CLK_MC 32 53 53 #define TEGRA20_CLK_AHBDMA 33 54 54 #define TEGRA20_CLK_APBDMA 34 55 55 /* 35 */