clock.c 20 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673
  1. // SPDX-License-Identifier: GPL-2.0-only
  2. /*
  3. * Atheros AR71XX/AR724X/AR913X common routines
  4. *
  5. * Copyright (C) 2010-2011 Jaiganesh Narayanan <[email protected]>
  6. * Copyright (C) 2011 Gabor Juhos <[email protected]>
  7. *
  8. * Parts of this file are based on Atheros' 2.6.15/2.6.31 BSP
  9. */
  10. #include <linux/kernel.h>
  11. #include <linux/init.h>
  12. #include <linux/io.h>
  13. #include <linux/err.h>
  14. #include <linux/clk.h>
  15. #include <linux/clkdev.h>
  16. #include <linux/clk-provider.h>
  17. #include <linux/of.h>
  18. #include <linux/of_address.h>
  19. #include <dt-bindings/clock/ath79-clk.h>
  20. #include <asm/div64.h>
  21. #include <asm/mach-ath79/ath79.h>
  22. #include <asm/mach-ath79/ar71xx_regs.h>
  23. #include "common.h"
  24. #define AR71XX_BASE_FREQ 40000000
  25. #define AR724X_BASE_FREQ 40000000
  26. static struct clk *clks[ATH79_CLK_END];
  27. static struct clk_onecell_data clk_data = {
  28. .clks = clks,
  29. .clk_num = ARRAY_SIZE(clks),
  30. };
  31. static const char * const clk_names[ATH79_CLK_END] = {
  32. [ATH79_CLK_CPU] = "cpu",
  33. [ATH79_CLK_DDR] = "ddr",
  34. [ATH79_CLK_AHB] = "ahb",
  35. [ATH79_CLK_REF] = "ref",
  36. [ATH79_CLK_MDIO] = "mdio",
  37. };
  38. static const char * __init ath79_clk_name(int type)
  39. {
  40. BUG_ON(type >= ARRAY_SIZE(clk_names) || !clk_names[type]);
  41. return clk_names[type];
  42. }
  43. static void __init __ath79_set_clk(int type, const char *name, struct clk *clk)
  44. {
  45. if (IS_ERR(clk))
  46. panic("failed to allocate %s clock structure", clk_names[type]);
  47. clks[type] = clk;
  48. clk_register_clkdev(clk, name, NULL);
  49. }
  50. static struct clk * __init ath79_set_clk(int type, unsigned long rate)
  51. {
  52. const char *name = ath79_clk_name(type);
  53. struct clk *clk;
  54. clk = clk_register_fixed_rate(NULL, name, NULL, 0, rate);
  55. __ath79_set_clk(type, name, clk);
  56. return clk;
  57. }
  58. static struct clk * __init ath79_set_ff_clk(int type, const char *parent,
  59. unsigned int mult, unsigned int div)
  60. {
  61. const char *name = ath79_clk_name(type);
  62. struct clk *clk;
  63. clk = clk_register_fixed_factor(NULL, name, parent, 0, mult, div);
  64. __ath79_set_clk(type, name, clk);
  65. return clk;
  66. }
  67. static unsigned long __init ath79_setup_ref_clk(unsigned long rate)
  68. {
  69. struct clk *clk = clks[ATH79_CLK_REF];
  70. if (clk)
  71. rate = clk_get_rate(clk);
  72. else
  73. clk = ath79_set_clk(ATH79_CLK_REF, rate);
  74. return rate;
  75. }
  76. static void __init ar71xx_clocks_init(void __iomem *pll_base)
  77. {
  78. unsigned long ref_rate;
  79. unsigned long cpu_rate;
  80. unsigned long ddr_rate;
  81. unsigned long ahb_rate;
  82. u32 pll;
  83. u32 freq;
  84. u32 div;
  85. ref_rate = ath79_setup_ref_clk(AR71XX_BASE_FREQ);
  86. pll = __raw_readl(pll_base + AR71XX_PLL_REG_CPU_CONFIG);
  87. div = ((pll >> AR71XX_PLL_FB_SHIFT) & AR71XX_PLL_FB_MASK) + 1;
  88. freq = div * ref_rate;
  89. div = ((pll >> AR71XX_CPU_DIV_SHIFT) & AR71XX_CPU_DIV_MASK) + 1;
  90. cpu_rate = freq / div;
  91. div = ((pll >> AR71XX_DDR_DIV_SHIFT) & AR71XX_DDR_DIV_MASK) + 1;
  92. ddr_rate = freq / div;
  93. div = (((pll >> AR71XX_AHB_DIV_SHIFT) & AR71XX_AHB_DIV_MASK) + 1) * 2;
  94. ahb_rate = cpu_rate / div;
  95. ath79_set_clk(ATH79_CLK_CPU, cpu_rate);
  96. ath79_set_clk(ATH79_CLK_DDR, ddr_rate);
  97. ath79_set_clk(ATH79_CLK_AHB, ahb_rate);
  98. }
  99. static void __init ar724x_clocks_init(void __iomem *pll_base)
  100. {
  101. u32 mult, div, ddr_div, ahb_div;
  102. u32 pll;
  103. ath79_setup_ref_clk(AR71XX_BASE_FREQ);
  104. pll = __raw_readl(pll_base + AR724X_PLL_REG_CPU_CONFIG);
  105. mult = ((pll >> AR724X_PLL_FB_SHIFT) & AR724X_PLL_FB_MASK);
  106. div = ((pll >> AR724X_PLL_REF_DIV_SHIFT) & AR724X_PLL_REF_DIV_MASK) * 2;
  107. ddr_div = ((pll >> AR724X_DDR_DIV_SHIFT) & AR724X_DDR_DIV_MASK) + 1;
  108. ahb_div = (((pll >> AR724X_AHB_DIV_SHIFT) & AR724X_AHB_DIV_MASK) + 1) * 2;
  109. ath79_set_ff_clk(ATH79_CLK_CPU, "ref", mult, div);
  110. ath79_set_ff_clk(ATH79_CLK_DDR, "ref", mult, div * ddr_div);
  111. ath79_set_ff_clk(ATH79_CLK_AHB, "ref", mult, div * ahb_div);
  112. }
  113. static void __init ar933x_clocks_init(void __iomem *pll_base)
  114. {
  115. unsigned long ref_rate;
  116. u32 clock_ctrl;
  117. u32 ref_div;
  118. u32 ninit_mul;
  119. u32 out_div;
  120. u32 cpu_div;
  121. u32 ddr_div;
  122. u32 ahb_div;
  123. u32 t;
  124. t = ath79_reset_rr(AR933X_RESET_REG_BOOTSTRAP);
  125. if (t & AR933X_BOOTSTRAP_REF_CLK_40)
  126. ref_rate = (40 * 1000 * 1000);
  127. else
  128. ref_rate = (25 * 1000 * 1000);
  129. ath79_setup_ref_clk(ref_rate);
  130. clock_ctrl = __raw_readl(pll_base + AR933X_PLL_CLOCK_CTRL_REG);
  131. if (clock_ctrl & AR933X_PLL_CLOCK_CTRL_BYPASS) {
  132. ref_div = 1;
  133. ninit_mul = 1;
  134. out_div = 1;
  135. cpu_div = 1;
  136. ddr_div = 1;
  137. ahb_div = 1;
  138. } else {
  139. u32 cpu_config;
  140. u32 t;
  141. cpu_config = __raw_readl(pll_base + AR933X_PLL_CPU_CONFIG_REG);
  142. t = (cpu_config >> AR933X_PLL_CPU_CONFIG_REFDIV_SHIFT) &
  143. AR933X_PLL_CPU_CONFIG_REFDIV_MASK;
  144. ref_div = t;
  145. ninit_mul = (cpu_config >> AR933X_PLL_CPU_CONFIG_NINT_SHIFT) &
  146. AR933X_PLL_CPU_CONFIG_NINT_MASK;
  147. t = (cpu_config >> AR933X_PLL_CPU_CONFIG_OUTDIV_SHIFT) &
  148. AR933X_PLL_CPU_CONFIG_OUTDIV_MASK;
  149. if (t == 0)
  150. t = 1;
  151. out_div = (1 << t);
  152. cpu_div = ((clock_ctrl >> AR933X_PLL_CLOCK_CTRL_CPU_DIV_SHIFT) &
  153. AR933X_PLL_CLOCK_CTRL_CPU_DIV_MASK) + 1;
  154. ddr_div = ((clock_ctrl >> AR933X_PLL_CLOCK_CTRL_DDR_DIV_SHIFT) &
  155. AR933X_PLL_CLOCK_CTRL_DDR_DIV_MASK) + 1;
  156. ahb_div = ((clock_ctrl >> AR933X_PLL_CLOCK_CTRL_AHB_DIV_SHIFT) &
  157. AR933X_PLL_CLOCK_CTRL_AHB_DIV_MASK) + 1;
  158. }
  159. ath79_set_ff_clk(ATH79_CLK_CPU, "ref", ninit_mul,
  160. ref_div * out_div * cpu_div);
  161. ath79_set_ff_clk(ATH79_CLK_DDR, "ref", ninit_mul,
  162. ref_div * out_div * ddr_div);
  163. ath79_set_ff_clk(ATH79_CLK_AHB, "ref", ninit_mul,
  164. ref_div * out_div * ahb_div);
  165. }
  166. static u32 __init ar934x_get_pll_freq(u32 ref, u32 ref_div, u32 nint, u32 nfrac,
  167. u32 frac, u32 out_div)
  168. {
  169. u64 t;
  170. u32 ret;
  171. t = ref;
  172. t *= nint;
  173. do_div(t, ref_div);
  174. ret = t;
  175. t = ref;
  176. t *= nfrac;
  177. do_div(t, ref_div * frac);
  178. ret += t;
  179. ret /= (1 << out_div);
  180. return ret;
  181. }
  182. static void __init ar934x_clocks_init(void __iomem *pll_base)
  183. {
  184. unsigned long ref_rate;
  185. unsigned long cpu_rate;
  186. unsigned long ddr_rate;
  187. unsigned long ahb_rate;
  188. u32 pll, out_div, ref_div, nint, nfrac, frac, clk_ctrl, postdiv;
  189. u32 cpu_pll, ddr_pll;
  190. u32 bootstrap;
  191. void __iomem *dpll_base;
  192. dpll_base = ioremap(AR934X_SRIF_BASE, AR934X_SRIF_SIZE);
  193. bootstrap = ath79_reset_rr(AR934X_RESET_REG_BOOTSTRAP);
  194. if (bootstrap & AR934X_BOOTSTRAP_REF_CLK_40)
  195. ref_rate = 40 * 1000 * 1000;
  196. else
  197. ref_rate = 25 * 1000 * 1000;
  198. ref_rate = ath79_setup_ref_clk(ref_rate);
  199. pll = __raw_readl(dpll_base + AR934X_SRIF_CPU_DPLL2_REG);
  200. if (pll & AR934X_SRIF_DPLL2_LOCAL_PLL) {
  201. out_div = (pll >> AR934X_SRIF_DPLL2_OUTDIV_SHIFT) &
  202. AR934X_SRIF_DPLL2_OUTDIV_MASK;
  203. pll = __raw_readl(dpll_base + AR934X_SRIF_CPU_DPLL1_REG);
  204. nint = (pll >> AR934X_SRIF_DPLL1_NINT_SHIFT) &
  205. AR934X_SRIF_DPLL1_NINT_MASK;
  206. nfrac = pll & AR934X_SRIF_DPLL1_NFRAC_MASK;
  207. ref_div = (pll >> AR934X_SRIF_DPLL1_REFDIV_SHIFT) &
  208. AR934X_SRIF_DPLL1_REFDIV_MASK;
  209. frac = 1 << 18;
  210. } else {
  211. pll = __raw_readl(pll_base + AR934X_PLL_CPU_CONFIG_REG);
  212. out_div = (pll >> AR934X_PLL_CPU_CONFIG_OUTDIV_SHIFT) &
  213. AR934X_PLL_CPU_CONFIG_OUTDIV_MASK;
  214. ref_div = (pll >> AR934X_PLL_CPU_CONFIG_REFDIV_SHIFT) &
  215. AR934X_PLL_CPU_CONFIG_REFDIV_MASK;
  216. nint = (pll >> AR934X_PLL_CPU_CONFIG_NINT_SHIFT) &
  217. AR934X_PLL_CPU_CONFIG_NINT_MASK;
  218. nfrac = (pll >> AR934X_PLL_CPU_CONFIG_NFRAC_SHIFT) &
  219. AR934X_PLL_CPU_CONFIG_NFRAC_MASK;
  220. frac = 1 << 6;
  221. }
  222. cpu_pll = ar934x_get_pll_freq(ref_rate, ref_div, nint,
  223. nfrac, frac, out_div);
  224. pll = __raw_readl(dpll_base + AR934X_SRIF_DDR_DPLL2_REG);
  225. if (pll & AR934X_SRIF_DPLL2_LOCAL_PLL) {
  226. out_div = (pll >> AR934X_SRIF_DPLL2_OUTDIV_SHIFT) &
  227. AR934X_SRIF_DPLL2_OUTDIV_MASK;
  228. pll = __raw_readl(dpll_base + AR934X_SRIF_DDR_DPLL1_REG);
  229. nint = (pll >> AR934X_SRIF_DPLL1_NINT_SHIFT) &
  230. AR934X_SRIF_DPLL1_NINT_MASK;
  231. nfrac = pll & AR934X_SRIF_DPLL1_NFRAC_MASK;
  232. ref_div = (pll >> AR934X_SRIF_DPLL1_REFDIV_SHIFT) &
  233. AR934X_SRIF_DPLL1_REFDIV_MASK;
  234. frac = 1 << 18;
  235. } else {
  236. pll = __raw_readl(pll_base + AR934X_PLL_DDR_CONFIG_REG);
  237. out_div = (pll >> AR934X_PLL_DDR_CONFIG_OUTDIV_SHIFT) &
  238. AR934X_PLL_DDR_CONFIG_OUTDIV_MASK;
  239. ref_div = (pll >> AR934X_PLL_DDR_CONFIG_REFDIV_SHIFT) &
  240. AR934X_PLL_DDR_CONFIG_REFDIV_MASK;
  241. nint = (pll >> AR934X_PLL_DDR_CONFIG_NINT_SHIFT) &
  242. AR934X_PLL_DDR_CONFIG_NINT_MASK;
  243. nfrac = (pll >> AR934X_PLL_DDR_CONFIG_NFRAC_SHIFT) &
  244. AR934X_PLL_DDR_CONFIG_NFRAC_MASK;
  245. frac = 1 << 10;
  246. }
  247. ddr_pll = ar934x_get_pll_freq(ref_rate, ref_div, nint,
  248. nfrac, frac, out_div);
  249. clk_ctrl = __raw_readl(pll_base + AR934X_PLL_CPU_DDR_CLK_CTRL_REG);
  250. postdiv = (clk_ctrl >> AR934X_PLL_CPU_DDR_CLK_CTRL_CPU_POST_DIV_SHIFT) &
  251. AR934X_PLL_CPU_DDR_CLK_CTRL_CPU_POST_DIV_MASK;
  252. if (clk_ctrl & AR934X_PLL_CPU_DDR_CLK_CTRL_CPU_PLL_BYPASS)
  253. cpu_rate = ref_rate;
  254. else if (clk_ctrl & AR934X_PLL_CPU_DDR_CLK_CTRL_CPUCLK_FROM_CPUPLL)
  255. cpu_rate = cpu_pll / (postdiv + 1);
  256. else
  257. cpu_rate = ddr_pll / (postdiv + 1);
  258. postdiv = (clk_ctrl >> AR934X_PLL_CPU_DDR_CLK_CTRL_DDR_POST_DIV_SHIFT) &
  259. AR934X_PLL_CPU_DDR_CLK_CTRL_DDR_POST_DIV_MASK;
  260. if (clk_ctrl & AR934X_PLL_CPU_DDR_CLK_CTRL_DDR_PLL_BYPASS)
  261. ddr_rate = ref_rate;
  262. else if (clk_ctrl & AR934X_PLL_CPU_DDR_CLK_CTRL_DDRCLK_FROM_DDRPLL)
  263. ddr_rate = ddr_pll / (postdiv + 1);
  264. else
  265. ddr_rate = cpu_pll / (postdiv + 1);
  266. postdiv = (clk_ctrl >> AR934X_PLL_CPU_DDR_CLK_CTRL_AHB_POST_DIV_SHIFT) &
  267. AR934X_PLL_CPU_DDR_CLK_CTRL_AHB_POST_DIV_MASK;
  268. if (clk_ctrl & AR934X_PLL_CPU_DDR_CLK_CTRL_AHB_PLL_BYPASS)
  269. ahb_rate = ref_rate;
  270. else if (clk_ctrl & AR934X_PLL_CPU_DDR_CLK_CTRL_AHBCLK_FROM_DDRPLL)
  271. ahb_rate = ddr_pll / (postdiv + 1);
  272. else
  273. ahb_rate = cpu_pll / (postdiv + 1);
  274. ath79_set_clk(ATH79_CLK_CPU, cpu_rate);
  275. ath79_set_clk(ATH79_CLK_DDR, ddr_rate);
  276. ath79_set_clk(ATH79_CLK_AHB, ahb_rate);
  277. clk_ctrl = __raw_readl(pll_base + AR934X_PLL_SWITCH_CLOCK_CONTROL_REG);
  278. if (clk_ctrl & AR934X_PLL_SWITCH_CLOCK_CONTROL_MDIO_CLK_SEL)
  279. ath79_set_clk(ATH79_CLK_MDIO, 100 * 1000 * 1000);
  280. iounmap(dpll_base);
  281. }
  282. static void __init qca953x_clocks_init(void __iomem *pll_base)
  283. {
  284. unsigned long ref_rate;
  285. unsigned long cpu_rate;
  286. unsigned long ddr_rate;
  287. unsigned long ahb_rate;
  288. u32 pll, out_div, ref_div, nint, frac, clk_ctrl, postdiv;
  289. u32 cpu_pll, ddr_pll;
  290. u32 bootstrap;
  291. bootstrap = ath79_reset_rr(QCA953X_RESET_REG_BOOTSTRAP);
  292. if (bootstrap & QCA953X_BOOTSTRAP_REF_CLK_40)
  293. ref_rate = 40 * 1000 * 1000;
  294. else
  295. ref_rate = 25 * 1000 * 1000;
  296. ref_rate = ath79_setup_ref_clk(ref_rate);
  297. pll = __raw_readl(pll_base + QCA953X_PLL_CPU_CONFIG_REG);
  298. out_div = (pll >> QCA953X_PLL_CPU_CONFIG_OUTDIV_SHIFT) &
  299. QCA953X_PLL_CPU_CONFIG_OUTDIV_MASK;
  300. ref_div = (pll >> QCA953X_PLL_CPU_CONFIG_REFDIV_SHIFT) &
  301. QCA953X_PLL_CPU_CONFIG_REFDIV_MASK;
  302. nint = (pll >> QCA953X_PLL_CPU_CONFIG_NINT_SHIFT) &
  303. QCA953X_PLL_CPU_CONFIG_NINT_MASK;
  304. frac = (pll >> QCA953X_PLL_CPU_CONFIG_NFRAC_SHIFT) &
  305. QCA953X_PLL_CPU_CONFIG_NFRAC_MASK;
  306. cpu_pll = nint * ref_rate / ref_div;
  307. cpu_pll += frac * (ref_rate >> 6) / ref_div;
  308. cpu_pll /= (1 << out_div);
  309. pll = __raw_readl(pll_base + QCA953X_PLL_DDR_CONFIG_REG);
  310. out_div = (pll >> QCA953X_PLL_DDR_CONFIG_OUTDIV_SHIFT) &
  311. QCA953X_PLL_DDR_CONFIG_OUTDIV_MASK;
  312. ref_div = (pll >> QCA953X_PLL_DDR_CONFIG_REFDIV_SHIFT) &
  313. QCA953X_PLL_DDR_CONFIG_REFDIV_MASK;
  314. nint = (pll >> QCA953X_PLL_DDR_CONFIG_NINT_SHIFT) &
  315. QCA953X_PLL_DDR_CONFIG_NINT_MASK;
  316. frac = (pll >> QCA953X_PLL_DDR_CONFIG_NFRAC_SHIFT) &
  317. QCA953X_PLL_DDR_CONFIG_NFRAC_MASK;
  318. ddr_pll = nint * ref_rate / ref_div;
  319. ddr_pll += frac * (ref_rate >> 6) / (ref_div << 4);
  320. ddr_pll /= (1 << out_div);
  321. clk_ctrl = __raw_readl(pll_base + QCA953X_PLL_CLK_CTRL_REG);
  322. postdiv = (clk_ctrl >> QCA953X_PLL_CLK_CTRL_CPU_POST_DIV_SHIFT) &
  323. QCA953X_PLL_CLK_CTRL_CPU_POST_DIV_MASK;
  324. if (clk_ctrl & QCA953X_PLL_CLK_CTRL_CPU_PLL_BYPASS)
  325. cpu_rate = ref_rate;
  326. else if (clk_ctrl & QCA953X_PLL_CLK_CTRL_CPUCLK_FROM_CPUPLL)
  327. cpu_rate = cpu_pll / (postdiv + 1);
  328. else
  329. cpu_rate = ddr_pll / (postdiv + 1);
  330. postdiv = (clk_ctrl >> QCA953X_PLL_CLK_CTRL_DDR_POST_DIV_SHIFT) &
  331. QCA953X_PLL_CLK_CTRL_DDR_POST_DIV_MASK;
  332. if (clk_ctrl & QCA953X_PLL_CLK_CTRL_DDR_PLL_BYPASS)
  333. ddr_rate = ref_rate;
  334. else if (clk_ctrl & QCA953X_PLL_CLK_CTRL_DDRCLK_FROM_DDRPLL)
  335. ddr_rate = ddr_pll / (postdiv + 1);
  336. else
  337. ddr_rate = cpu_pll / (postdiv + 1);
  338. postdiv = (clk_ctrl >> QCA953X_PLL_CLK_CTRL_AHB_POST_DIV_SHIFT) &
  339. QCA953X_PLL_CLK_CTRL_AHB_POST_DIV_MASK;
  340. if (clk_ctrl & QCA953X_PLL_CLK_CTRL_AHB_PLL_BYPASS)
  341. ahb_rate = ref_rate;
  342. else if (clk_ctrl & QCA953X_PLL_CLK_CTRL_AHBCLK_FROM_DDRPLL)
  343. ahb_rate = ddr_pll / (postdiv + 1);
  344. else
  345. ahb_rate = cpu_pll / (postdiv + 1);
  346. ath79_set_clk(ATH79_CLK_CPU, cpu_rate);
  347. ath79_set_clk(ATH79_CLK_DDR, ddr_rate);
  348. ath79_set_clk(ATH79_CLK_AHB, ahb_rate);
  349. }
  350. static void __init qca955x_clocks_init(void __iomem *pll_base)
  351. {
  352. unsigned long ref_rate;
  353. unsigned long cpu_rate;
  354. unsigned long ddr_rate;
  355. unsigned long ahb_rate;
  356. u32 pll, out_div, ref_div, nint, frac, clk_ctrl, postdiv;
  357. u32 cpu_pll, ddr_pll;
  358. u32 bootstrap;
  359. bootstrap = ath79_reset_rr(QCA955X_RESET_REG_BOOTSTRAP);
  360. if (bootstrap & QCA955X_BOOTSTRAP_REF_CLK_40)
  361. ref_rate = 40 * 1000 * 1000;
  362. else
  363. ref_rate = 25 * 1000 * 1000;
  364. ref_rate = ath79_setup_ref_clk(ref_rate);
  365. pll = __raw_readl(pll_base + QCA955X_PLL_CPU_CONFIG_REG);
  366. out_div = (pll >> QCA955X_PLL_CPU_CONFIG_OUTDIV_SHIFT) &
  367. QCA955X_PLL_CPU_CONFIG_OUTDIV_MASK;
  368. ref_div = (pll >> QCA955X_PLL_CPU_CONFIG_REFDIV_SHIFT) &
  369. QCA955X_PLL_CPU_CONFIG_REFDIV_MASK;
  370. nint = (pll >> QCA955X_PLL_CPU_CONFIG_NINT_SHIFT) &
  371. QCA955X_PLL_CPU_CONFIG_NINT_MASK;
  372. frac = (pll >> QCA955X_PLL_CPU_CONFIG_NFRAC_SHIFT) &
  373. QCA955X_PLL_CPU_CONFIG_NFRAC_MASK;
  374. cpu_pll = nint * ref_rate / ref_div;
  375. cpu_pll += frac * ref_rate / (ref_div * (1 << 6));
  376. cpu_pll /= (1 << out_div);
  377. pll = __raw_readl(pll_base + QCA955X_PLL_DDR_CONFIG_REG);
  378. out_div = (pll >> QCA955X_PLL_DDR_CONFIG_OUTDIV_SHIFT) &
  379. QCA955X_PLL_DDR_CONFIG_OUTDIV_MASK;
  380. ref_div = (pll >> QCA955X_PLL_DDR_CONFIG_REFDIV_SHIFT) &
  381. QCA955X_PLL_DDR_CONFIG_REFDIV_MASK;
  382. nint = (pll >> QCA955X_PLL_DDR_CONFIG_NINT_SHIFT) &
  383. QCA955X_PLL_DDR_CONFIG_NINT_MASK;
  384. frac = (pll >> QCA955X_PLL_DDR_CONFIG_NFRAC_SHIFT) &
  385. QCA955X_PLL_DDR_CONFIG_NFRAC_MASK;
  386. ddr_pll = nint * ref_rate / ref_div;
  387. ddr_pll += frac * ref_rate / (ref_div * (1 << 10));
  388. ddr_pll /= (1 << out_div);
  389. clk_ctrl = __raw_readl(pll_base + QCA955X_PLL_CLK_CTRL_REG);
  390. postdiv = (clk_ctrl >> QCA955X_PLL_CLK_CTRL_CPU_POST_DIV_SHIFT) &
  391. QCA955X_PLL_CLK_CTRL_CPU_POST_DIV_MASK;
  392. if (clk_ctrl & QCA955X_PLL_CLK_CTRL_CPU_PLL_BYPASS)
  393. cpu_rate = ref_rate;
  394. else if (clk_ctrl & QCA955X_PLL_CLK_CTRL_CPUCLK_FROM_CPUPLL)
  395. cpu_rate = ddr_pll / (postdiv + 1);
  396. else
  397. cpu_rate = cpu_pll / (postdiv + 1);
  398. postdiv = (clk_ctrl >> QCA955X_PLL_CLK_CTRL_DDR_POST_DIV_SHIFT) &
  399. QCA955X_PLL_CLK_CTRL_DDR_POST_DIV_MASK;
  400. if (clk_ctrl & QCA955X_PLL_CLK_CTRL_DDR_PLL_BYPASS)
  401. ddr_rate = ref_rate;
  402. else if (clk_ctrl & QCA955X_PLL_CLK_CTRL_DDRCLK_FROM_DDRPLL)
  403. ddr_rate = cpu_pll / (postdiv + 1);
  404. else
  405. ddr_rate = ddr_pll / (postdiv + 1);
  406. postdiv = (clk_ctrl >> QCA955X_PLL_CLK_CTRL_AHB_POST_DIV_SHIFT) &
  407. QCA955X_PLL_CLK_CTRL_AHB_POST_DIV_MASK;
  408. if (clk_ctrl & QCA955X_PLL_CLK_CTRL_AHB_PLL_BYPASS)
  409. ahb_rate = ref_rate;
  410. else if (clk_ctrl & QCA955X_PLL_CLK_CTRL_AHBCLK_FROM_DDRPLL)
  411. ahb_rate = ddr_pll / (postdiv + 1);
  412. else
  413. ahb_rate = cpu_pll / (postdiv + 1);
  414. ath79_set_clk(ATH79_CLK_CPU, cpu_rate);
  415. ath79_set_clk(ATH79_CLK_DDR, ddr_rate);
  416. ath79_set_clk(ATH79_CLK_AHB, ahb_rate);
  417. }
  418. static void __init qca956x_clocks_init(void __iomem *pll_base)
  419. {
  420. unsigned long ref_rate;
  421. unsigned long cpu_rate;
  422. unsigned long ddr_rate;
  423. unsigned long ahb_rate;
  424. u32 pll, out_div, ref_div, nint, hfrac, lfrac, clk_ctrl, postdiv;
  425. u32 cpu_pll, ddr_pll;
  426. u32 bootstrap;
  427. /*
  428. * QCA956x timer init workaround has to be applied right before setting
  429. * up the clock. Else, there will be no jiffies
  430. */
  431. u32 misc;
  432. misc = ath79_reset_rr(AR71XX_RESET_REG_MISC_INT_ENABLE);
  433. misc |= MISC_INT_MIPS_SI_TIMERINT_MASK;
  434. ath79_reset_wr(AR71XX_RESET_REG_MISC_INT_ENABLE, misc);
  435. bootstrap = ath79_reset_rr(QCA956X_RESET_REG_BOOTSTRAP);
  436. if (bootstrap & QCA956X_BOOTSTRAP_REF_CLK_40)
  437. ref_rate = 40 * 1000 * 1000;
  438. else
  439. ref_rate = 25 * 1000 * 1000;
  440. ref_rate = ath79_setup_ref_clk(ref_rate);
  441. pll = __raw_readl(pll_base + QCA956X_PLL_CPU_CONFIG_REG);
  442. out_div = (pll >> QCA956X_PLL_CPU_CONFIG_OUTDIV_SHIFT) &
  443. QCA956X_PLL_CPU_CONFIG_OUTDIV_MASK;
  444. ref_div = (pll >> QCA956X_PLL_CPU_CONFIG_REFDIV_SHIFT) &
  445. QCA956X_PLL_CPU_CONFIG_REFDIV_MASK;
  446. pll = __raw_readl(pll_base + QCA956X_PLL_CPU_CONFIG1_REG);
  447. nint = (pll >> QCA956X_PLL_CPU_CONFIG1_NINT_SHIFT) &
  448. QCA956X_PLL_CPU_CONFIG1_NINT_MASK;
  449. hfrac = (pll >> QCA956X_PLL_CPU_CONFIG1_NFRAC_H_SHIFT) &
  450. QCA956X_PLL_CPU_CONFIG1_NFRAC_H_MASK;
  451. lfrac = (pll >> QCA956X_PLL_CPU_CONFIG1_NFRAC_L_SHIFT) &
  452. QCA956X_PLL_CPU_CONFIG1_NFRAC_L_MASK;
  453. cpu_pll = nint * ref_rate / ref_div;
  454. cpu_pll += (lfrac * ref_rate) / ((ref_div * 25) << 13);
  455. cpu_pll += (hfrac >> 13) * ref_rate / ref_div;
  456. cpu_pll /= (1 << out_div);
  457. pll = __raw_readl(pll_base + QCA956X_PLL_DDR_CONFIG_REG);
  458. out_div = (pll >> QCA956X_PLL_DDR_CONFIG_OUTDIV_SHIFT) &
  459. QCA956X_PLL_DDR_CONFIG_OUTDIV_MASK;
  460. ref_div = (pll >> QCA956X_PLL_DDR_CONFIG_REFDIV_SHIFT) &
  461. QCA956X_PLL_DDR_CONFIG_REFDIV_MASK;
  462. pll = __raw_readl(pll_base + QCA956X_PLL_DDR_CONFIG1_REG);
  463. nint = (pll >> QCA956X_PLL_DDR_CONFIG1_NINT_SHIFT) &
  464. QCA956X_PLL_DDR_CONFIG1_NINT_MASK;
  465. hfrac = (pll >> QCA956X_PLL_DDR_CONFIG1_NFRAC_H_SHIFT) &
  466. QCA956X_PLL_DDR_CONFIG1_NFRAC_H_MASK;
  467. lfrac = (pll >> QCA956X_PLL_DDR_CONFIG1_NFRAC_L_SHIFT) &
  468. QCA956X_PLL_DDR_CONFIG1_NFRAC_L_MASK;
  469. ddr_pll = nint * ref_rate / ref_div;
  470. ddr_pll += (lfrac * ref_rate) / ((ref_div * 25) << 13);
  471. ddr_pll += (hfrac >> 13) * ref_rate / ref_div;
  472. ddr_pll /= (1 << out_div);
  473. clk_ctrl = __raw_readl(pll_base + QCA956X_PLL_CLK_CTRL_REG);
  474. postdiv = (clk_ctrl >> QCA956X_PLL_CLK_CTRL_CPU_POST_DIV_SHIFT) &
  475. QCA956X_PLL_CLK_CTRL_CPU_POST_DIV_MASK;
  476. if (clk_ctrl & QCA956X_PLL_CLK_CTRL_CPU_PLL_BYPASS)
  477. cpu_rate = ref_rate;
  478. else if (clk_ctrl & QCA956X_PLL_CLK_CTRL_CPU_DDRCLK_FROM_CPUPLL)
  479. cpu_rate = ddr_pll / (postdiv + 1);
  480. else
  481. cpu_rate = cpu_pll / (postdiv + 1);
  482. postdiv = (clk_ctrl >> QCA956X_PLL_CLK_CTRL_DDR_POST_DIV_SHIFT) &
  483. QCA956X_PLL_CLK_CTRL_DDR_POST_DIV_MASK;
  484. if (clk_ctrl & QCA956X_PLL_CLK_CTRL_DDR_PLL_BYPASS)
  485. ddr_rate = ref_rate;
  486. else if (clk_ctrl & QCA956X_PLL_CLK_CTRL_CPU_DDRCLK_FROM_DDRPLL)
  487. ddr_rate = cpu_pll / (postdiv + 1);
  488. else
  489. ddr_rate = ddr_pll / (postdiv + 1);
  490. postdiv = (clk_ctrl >> QCA956X_PLL_CLK_CTRL_AHB_POST_DIV_SHIFT) &
  491. QCA956X_PLL_CLK_CTRL_AHB_POST_DIV_MASK;
  492. if (clk_ctrl & QCA956X_PLL_CLK_CTRL_AHB_PLL_BYPASS)
  493. ahb_rate = ref_rate;
  494. else if (clk_ctrl & QCA956X_PLL_CLK_CTRL_AHBCLK_FROM_DDRPLL)
  495. ahb_rate = ddr_pll / (postdiv + 1);
  496. else
  497. ahb_rate = cpu_pll / (postdiv + 1);
  498. ath79_set_clk(ATH79_CLK_CPU, cpu_rate);
  499. ath79_set_clk(ATH79_CLK_DDR, ddr_rate);
  500. ath79_set_clk(ATH79_CLK_AHB, ahb_rate);
  501. }
  502. static void __init ath79_clocks_init_dt(struct device_node *np)
  503. {
  504. struct clk *ref_clk;
  505. void __iomem *pll_base;
  506. ref_clk = of_clk_get(np, 0);
  507. if (!IS_ERR(ref_clk))
  508. clks[ATH79_CLK_REF] = ref_clk;
  509. pll_base = of_iomap(np, 0);
  510. if (!pll_base) {
  511. pr_err("%pOF: can't map pll registers\n", np);
  512. goto err_clk;
  513. }
  514. if (of_device_is_compatible(np, "qca,ar7100-pll"))
  515. ar71xx_clocks_init(pll_base);
  516. else if (of_device_is_compatible(np, "qca,ar7240-pll") ||
  517. of_device_is_compatible(np, "qca,ar9130-pll"))
  518. ar724x_clocks_init(pll_base);
  519. else if (of_device_is_compatible(np, "qca,ar9330-pll"))
  520. ar933x_clocks_init(pll_base);
  521. else if (of_device_is_compatible(np, "qca,ar9340-pll"))
  522. ar934x_clocks_init(pll_base);
  523. else if (of_device_is_compatible(np, "qca,qca9530-pll"))
  524. qca953x_clocks_init(pll_base);
  525. else if (of_device_is_compatible(np, "qca,qca9550-pll"))
  526. qca955x_clocks_init(pll_base);
  527. else if (of_device_is_compatible(np, "qca,qca9560-pll"))
  528. qca956x_clocks_init(pll_base);
  529. if (!clks[ATH79_CLK_MDIO])
  530. clks[ATH79_CLK_MDIO] = clks[ATH79_CLK_REF];
  531. if (of_clk_add_provider(np, of_clk_src_onecell_get, &clk_data)) {
  532. pr_err("%pOF: could not register clk provider\n", np);
  533. goto err_iounmap;
  534. }
  535. return;
  536. err_iounmap:
  537. iounmap(pll_base);
  538. err_clk:
  539. clk_put(ref_clk);
  540. }
  541. CLK_OF_DECLARE(ar7100_clk, "qca,ar7100-pll", ath79_clocks_init_dt);
  542. CLK_OF_DECLARE(ar7240_clk, "qca,ar7240-pll", ath79_clocks_init_dt);
  543. CLK_OF_DECLARE(ar9130_clk, "qca,ar9130-pll", ath79_clocks_init_dt);
  544. CLK_OF_DECLARE(ar9330_clk, "qca,ar9330-pll", ath79_clocks_init_dt);
  545. CLK_OF_DECLARE(ar9340_clk, "qca,ar9340-pll", ath79_clocks_init_dt);
  546. CLK_OF_DECLARE(ar9530_clk, "qca,qca9530-pll", ath79_clocks_init_dt);
  547. CLK_OF_DECLARE(ar9550_clk, "qca,qca9550-pll", ath79_clocks_init_dt);
  548. CLK_OF_DECLARE(ar9560_clk, "qca,qca9560-pll", ath79_clocks_init_dt);