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

MIPS: ath79: update devicetree clock support for AR9331

Signed-off-by: Antony Pavlov <antonynpavlov@gmail.com>
Cc: Gabor Juhos <juhosg@openwrt.org>
Cc: Alban Bedel <albeu@free.fr>
Cc: Michael Turquette <mturquette@baylibre.com>
Cc: Stephen Boyd <sboyd@codeaurora.org>
Cc: Rob Herring <robh+dt@kernel.org>
Cc: linux-clk@vger.kernel.org
Cc: linux-mips@linux-mips.org
Cc: devicetree@vger.kernel.org
Patchwork: https://patchwork.linux-mips.org/patch/12879/
Signed-off-by: Ralf Baechle <ralf@linux-mips.org>

authored by

Antony Pavlov and committed by
Ralf Baechle
5ae5c452 1e6a3492

+74 -46
+74 -46
arch/mips/ath79/clock.c
··· 137 137 clk_add_alias("uart", NULL, "ahb", NULL); 138 138 } 139 139 140 + static void __init ar9330_clk_init(struct clk *ref_clk, void __iomem *pll_base) 141 + { 142 + u32 clock_ctrl; 143 + u32 ref_div; 144 + u32 ninit_mul; 145 + u32 out_div; 146 + 147 + u32 cpu_div; 148 + u32 ddr_div; 149 + u32 ahb_div; 150 + 151 + clock_ctrl = __raw_readl(pll_base + AR933X_PLL_CLOCK_CTRL_REG); 152 + if (clock_ctrl & AR933X_PLL_CLOCK_CTRL_BYPASS) { 153 + ref_div = 1; 154 + ninit_mul = 1; 155 + out_div = 1; 156 + 157 + cpu_div = 1; 158 + ddr_div = 1; 159 + ahb_div = 1; 160 + } else { 161 + u32 cpu_config; 162 + u32 t; 163 + 164 + cpu_config = __raw_readl(pll_base + AR933X_PLL_CPU_CONFIG_REG); 165 + 166 + t = (cpu_config >> AR933X_PLL_CPU_CONFIG_REFDIV_SHIFT) & 167 + AR933X_PLL_CPU_CONFIG_REFDIV_MASK; 168 + ref_div = t; 169 + 170 + ninit_mul = (cpu_config >> AR933X_PLL_CPU_CONFIG_NINT_SHIFT) & 171 + AR933X_PLL_CPU_CONFIG_NINT_MASK; 172 + 173 + t = (cpu_config >> AR933X_PLL_CPU_CONFIG_OUTDIV_SHIFT) & 174 + AR933X_PLL_CPU_CONFIG_OUTDIV_MASK; 175 + if (t == 0) 176 + t = 1; 177 + 178 + out_div = (1 << t); 179 + 180 + cpu_div = ((clock_ctrl >> AR933X_PLL_CLOCK_CTRL_CPU_DIV_SHIFT) & 181 + AR933X_PLL_CLOCK_CTRL_CPU_DIV_MASK) + 1; 182 + 183 + ddr_div = ((clock_ctrl >> AR933X_PLL_CLOCK_CTRL_DDR_DIV_SHIFT) & 184 + AR933X_PLL_CLOCK_CTRL_DDR_DIV_MASK) + 1; 185 + 186 + ahb_div = ((clock_ctrl >> AR933X_PLL_CLOCK_CTRL_AHB_DIV_SHIFT) & 187 + AR933X_PLL_CLOCK_CTRL_AHB_DIV_MASK) + 1; 188 + } 189 + 190 + clks[ATH79_CLK_CPU] = ath79_reg_ffclk("cpu", "ref", 191 + ninit_mul, ref_div * out_div * cpu_div); 192 + clks[ATH79_CLK_DDR] = ath79_reg_ffclk("ddr", "ref", 193 + ninit_mul, ref_div * out_div * ddr_div); 194 + clks[ATH79_CLK_AHB] = ath79_reg_ffclk("ahb", "ref", 195 + ninit_mul, ref_div * out_div * ahb_div); 196 + } 197 + 140 198 static void __init ar933x_clocks_init(void) 141 199 { 200 + struct clk *ref_clk; 142 201 unsigned long ref_rate; 143 - unsigned long cpu_rate; 144 - unsigned long ddr_rate; 145 - unsigned long ahb_rate; 146 - u32 clock_ctrl; 147 - u32 cpu_config; 148 - u32 freq; 149 202 u32 t; 150 203 151 204 t = ath79_reset_rr(AR933X_RESET_REG_BOOTSTRAP); ··· 207 154 else 208 155 ref_rate = (25 * 1000 * 1000); 209 156 210 - clock_ctrl = ath79_pll_rr(AR933X_PLL_CLOCK_CTRL_REG); 211 - if (clock_ctrl & AR933X_PLL_CLOCK_CTRL_BYPASS) { 212 - cpu_rate = ref_rate; 213 - ahb_rate = ref_rate; 214 - ddr_rate = ref_rate; 215 - } else { 216 - cpu_config = ath79_pll_rr(AR933X_PLL_CPU_CONFIG_REG); 157 + ref_clk = ath79_add_sys_clkdev("ref", ref_rate); 217 158 218 - t = (cpu_config >> AR933X_PLL_CPU_CONFIG_REFDIV_SHIFT) & 219 - AR933X_PLL_CPU_CONFIG_REFDIV_MASK; 220 - freq = ref_rate / t; 159 + ar9330_clk_init(ref_clk, ath79_pll_base); 221 160 222 - t = (cpu_config >> AR933X_PLL_CPU_CONFIG_NINT_SHIFT) & 223 - AR933X_PLL_CPU_CONFIG_NINT_MASK; 224 - freq *= t; 225 - 226 - t = (cpu_config >> AR933X_PLL_CPU_CONFIG_OUTDIV_SHIFT) & 227 - AR933X_PLL_CPU_CONFIG_OUTDIV_MASK; 228 - if (t == 0) 229 - t = 1; 230 - 231 - freq >>= t; 232 - 233 - t = ((clock_ctrl >> AR933X_PLL_CLOCK_CTRL_CPU_DIV_SHIFT) & 234 - AR933X_PLL_CLOCK_CTRL_CPU_DIV_MASK) + 1; 235 - cpu_rate = freq / t; 236 - 237 - t = ((clock_ctrl >> AR933X_PLL_CLOCK_CTRL_DDR_DIV_SHIFT) & 238 - AR933X_PLL_CLOCK_CTRL_DDR_DIV_MASK) + 1; 239 - ddr_rate = freq / t; 240 - 241 - t = ((clock_ctrl >> AR933X_PLL_CLOCK_CTRL_AHB_DIV_SHIFT) & 242 - AR933X_PLL_CLOCK_CTRL_AHB_DIV_MASK) + 1; 243 - ahb_rate = freq / t; 244 - } 245 - 246 - ath79_add_sys_clkdev("ref", ref_rate); 247 - clks[ATH79_CLK_CPU] = ath79_add_sys_clkdev("cpu", cpu_rate); 248 - clks[ATH79_CLK_DDR] = ath79_add_sys_clkdev("ddr", ddr_rate); 249 - clks[ATH79_CLK_AHB] = ath79_add_sys_clkdev("ahb", ahb_rate); 161 + /* just make happy plat_time_init() from arch/mips/ath79/setup.c */ 162 + clk_register_clkdev(clks[ATH79_CLK_CPU], "cpu", NULL); 163 + clk_register_clkdev(clks[ATH79_CLK_DDR], "ddr", NULL); 164 + clk_register_clkdev(clks[ATH79_CLK_AHB], "ahb", NULL); 250 165 251 166 clk_add_alias("wdt", NULL, "ahb", NULL); 252 167 clk_add_alias("uart", NULL, "ref", NULL); ··· 481 460 482 461 CLK_OF_DECLARE(ar7100, "qca,ar7100-pll", ath79_clocks_init_dt); 483 462 CLK_OF_DECLARE(ar7240, "qca,ar7240-pll", ath79_clocks_init_dt); 484 - CLK_OF_DECLARE(ar9330, "qca,ar9330-pll", ath79_clocks_init_dt); 485 463 CLK_OF_DECLARE(ar9340, "qca,ar9340-pll", ath79_clocks_init_dt); 486 464 CLK_OF_DECLARE(ar9550, "qca,qca9550-pll", ath79_clocks_init_dt); 487 465 ··· 502 482 goto err_clk; 503 483 } 504 484 505 - ar724x_clk_init(ref_clk, pll_base); 485 + if (of_device_is_compatible(np, "qca,ar9130-pll")) 486 + ar724x_clk_init(ref_clk, pll_base); 487 + else if (of_device_is_compatible(np, "qca,ar9330-pll")) 488 + ar9330_clk_init(ref_clk, pll_base); 489 + else { 490 + pr_err("%s: could not find any appropriate clk_init()\n", dnfn); 491 + goto err_clk; 492 + } 506 493 507 494 if (of_clk_add_provider(np, of_clk_src_onecell_get, &clk_data)) { 508 495 pr_err("%s: could not register clk provider\n", dnfn); ··· 525 498 return; 526 499 } 527 500 CLK_OF_DECLARE(ar9130_clk, "qca,ar9130-pll", ath79_clocks_init_dt_ng); 501 + CLK_OF_DECLARE(ar9330_clk, "qca,ar9330-pll", ath79_clocks_init_dt_ng); 528 502 #endif