clock_manager_arria10.c 32 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105
  1. /*
  2. * Copyright (C) 2016-2017 Intel Corporation
  3. *
  4. * SPDX-License-Identifier: GPL-2.0
  5. */
  6. #include <common.h>
  7. #include <fdtdec.h>
  8. #include <asm/io.h>
  9. #include <dm.h>
  10. #include <asm/arch/clock_manager.h>
  11. DECLARE_GLOBAL_DATA_PTR;
  12. static u32 eosc1_hz;
  13. static u32 cb_intosc_hz;
  14. static u32 f2s_free_hz;
  15. static u32 cm_l4_main_clk_hz;
  16. static u32 cm_l4_sp_clk_hz;
  17. static u32 cm_l4_mp_clk_hz;
  18. static u32 cm_l4_sys_free_clk_hz;
  19. struct mainpll_cfg {
  20. u32 vco0_psrc;
  21. u32 vco1_denom;
  22. u32 vco1_numer;
  23. u32 mpuclk;
  24. u32 mpuclk_cnt;
  25. u32 mpuclk_src;
  26. u32 nocclk;
  27. u32 nocclk_cnt;
  28. u32 nocclk_src;
  29. u32 cntr2clk_cnt;
  30. u32 cntr3clk_cnt;
  31. u32 cntr4clk_cnt;
  32. u32 cntr5clk_cnt;
  33. u32 cntr6clk_cnt;
  34. u32 cntr7clk_cnt;
  35. u32 cntr7clk_src;
  36. u32 cntr8clk_cnt;
  37. u32 cntr9clk_cnt;
  38. u32 cntr9clk_src;
  39. u32 cntr15clk_cnt;
  40. u32 nocdiv_l4mainclk;
  41. u32 nocdiv_l4mpclk;
  42. u32 nocdiv_l4spclk;
  43. u32 nocdiv_csatclk;
  44. u32 nocdiv_cstraceclk;
  45. u32 nocdiv_cspdbclk;
  46. };
  47. struct perpll_cfg {
  48. u32 vco0_psrc;
  49. u32 vco1_denom;
  50. u32 vco1_numer;
  51. u32 cntr2clk_cnt;
  52. u32 cntr2clk_src;
  53. u32 cntr3clk_cnt;
  54. u32 cntr3clk_src;
  55. u32 cntr4clk_cnt;
  56. u32 cntr4clk_src;
  57. u32 cntr5clk_cnt;
  58. u32 cntr5clk_src;
  59. u32 cntr6clk_cnt;
  60. u32 cntr6clk_src;
  61. u32 cntr7clk_cnt;
  62. u32 cntr8clk_cnt;
  63. u32 cntr8clk_src;
  64. u32 cntr9clk_cnt;
  65. u32 emacctl_emac0sel;
  66. u32 emacctl_emac1sel;
  67. u32 emacctl_emac2sel;
  68. u32 gpiodiv_gpiodbclk;
  69. };
  70. struct alteragrp_cfg {
  71. u32 nocclk;
  72. u32 mpuclk;
  73. };
  74. static const struct socfpga_clock_manager *clock_manager_base =
  75. (struct socfpga_clock_manager *)SOCFPGA_CLKMGR_ADDRESS;
  76. static int of_to_struct(const void *blob, int node, int cfg_len, void *cfg)
  77. {
  78. if (fdtdec_get_int_array(blob, node, "altr,of_reg_value",
  79. (u32 *)cfg, cfg_len)) {
  80. /* could not find required property */
  81. return -EINVAL;
  82. }
  83. return 0;
  84. }
  85. static int of_get_input_clks(const void *blob, int node, u32 *val)
  86. {
  87. *val = fdtdec_get_uint(blob, node, "clock-frequency", 0);
  88. if (!*val)
  89. return -EINVAL;
  90. return 0;
  91. }
  92. static int of_get_clk_cfg(const void *blob, struct mainpll_cfg *main_cfg,
  93. struct perpll_cfg *per_cfg,
  94. struct alteragrp_cfg *altrgrp_cfg)
  95. {
  96. int node, child, len;
  97. const char *node_name;
  98. node = fdtdec_next_compatible(blob, 0, COMPAT_ALTERA_SOCFPGA_CLK);
  99. if (node < 0)
  100. return -EINVAL;
  101. child = fdt_first_subnode(blob, node);
  102. if (child < 0)
  103. return -EINVAL;
  104. child = fdt_first_subnode(blob, child);
  105. if (child < 0)
  106. return -EINVAL;
  107. node_name = fdt_get_name(blob, child, &len);
  108. while (node_name) {
  109. if (!strcmp(node_name, "osc1")) {
  110. if (of_get_input_clks(blob, child, &eosc1_hz))
  111. return -EINVAL;
  112. } else if (!strcmp(node_name, "cb_intosc_ls_clk")) {
  113. if (of_get_input_clks(blob, child, &cb_intosc_hz))
  114. return -EINVAL;
  115. } else if (!strcmp(node_name, "f2s_free_clk")) {
  116. if (of_get_input_clks(blob, child, &f2s_free_hz))
  117. return -EINVAL;
  118. } else if (!strcmp(node_name, "main_pll")) {
  119. if (of_to_struct(blob, child,
  120. sizeof(*main_cfg)/sizeof(u32),
  121. main_cfg))
  122. return -EINVAL;
  123. } else if (!strcmp(node_name, "periph_pll")) {
  124. if (of_to_struct(blob, child,
  125. sizeof(*per_cfg)/sizeof(u32),
  126. per_cfg))
  127. return -EINVAL;
  128. } else if (!strcmp(node_name, "altera")) {
  129. if (of_to_struct(blob, child,
  130. sizeof(*altrgrp_cfg)/sizeof(u32),
  131. altrgrp_cfg))
  132. return -EINVAL;
  133. main_cfg->mpuclk = altrgrp_cfg->mpuclk;
  134. main_cfg->nocclk = altrgrp_cfg->nocclk;
  135. }
  136. child = fdt_next_subnode(blob, child);
  137. if (child < 0)
  138. break;
  139. node_name = fdt_get_name(blob, child, &len);
  140. }
  141. return 0;
  142. }
  143. /* calculate the intended main VCO frequency based on handoff */
  144. static unsigned int cm_calc_handoff_main_vco_clk_hz
  145. (struct mainpll_cfg *main_cfg)
  146. {
  147. unsigned int clk_hz;
  148. /* Check main VCO clock source: eosc, intosc or f2s? */
  149. switch (main_cfg->vco0_psrc) {
  150. case CLKMGR_MAINPLL_VCO0_PSRC_EOSC:
  151. clk_hz = eosc1_hz;
  152. break;
  153. case CLKMGR_MAINPLL_VCO0_PSRC_E_INTOSC:
  154. clk_hz = cb_intosc_hz;
  155. break;
  156. case CLKMGR_MAINPLL_VCO0_PSRC_F2S:
  157. clk_hz = f2s_free_hz;
  158. break;
  159. default:
  160. return 0;
  161. }
  162. /* calculate the VCO frequency */
  163. clk_hz /= 1 + main_cfg->vco1_denom;
  164. clk_hz *= 1 + main_cfg->vco1_numer;
  165. return clk_hz;
  166. }
  167. /* calculate the intended periph VCO frequency based on handoff */
  168. static unsigned int cm_calc_handoff_periph_vco_clk_hz(
  169. struct mainpll_cfg *main_cfg, struct perpll_cfg *per_cfg)
  170. {
  171. unsigned int clk_hz;
  172. /* Check periph VCO clock source: eosc, intosc, f2s or mainpll? */
  173. switch (per_cfg->vco0_psrc) {
  174. case CLKMGR_PERPLL_VCO0_PSRC_EOSC:
  175. clk_hz = eosc1_hz;
  176. break;
  177. case CLKMGR_PERPLL_VCO0_PSRC_E_INTOSC:
  178. clk_hz = cb_intosc_hz;
  179. break;
  180. case CLKMGR_PERPLL_VCO0_PSRC_F2S:
  181. clk_hz = f2s_free_hz;
  182. break;
  183. case CLKMGR_PERPLL_VCO0_PSRC_MAIN:
  184. clk_hz = cm_calc_handoff_main_vco_clk_hz(main_cfg);
  185. clk_hz /= main_cfg->cntr15clk_cnt;
  186. break;
  187. default:
  188. return 0;
  189. }
  190. /* calculate the VCO frequency */
  191. clk_hz /= 1 + per_cfg->vco1_denom;
  192. clk_hz *= 1 + per_cfg->vco1_numer;
  193. return clk_hz;
  194. }
  195. /* calculate the intended MPU clock frequency based on handoff */
  196. static unsigned int cm_calc_handoff_mpu_clk_hz(struct mainpll_cfg *main_cfg,
  197. struct perpll_cfg *per_cfg)
  198. {
  199. unsigned int clk_hz;
  200. /* Check MPU clock source: main, periph, osc1, intosc or f2s? */
  201. switch (main_cfg->mpuclk_src) {
  202. case CLKMGR_MAINPLL_MPUCLK_SRC_MAIN:
  203. clk_hz = cm_calc_handoff_main_vco_clk_hz(main_cfg);
  204. clk_hz /= (main_cfg->mpuclk & CLKMGR_MAINPLL_MPUCLK_CNT_MSK)
  205. + 1;
  206. break;
  207. case CLKMGR_MAINPLL_MPUCLK_SRC_PERI:
  208. clk_hz = cm_calc_handoff_periph_vco_clk_hz(main_cfg, per_cfg);
  209. clk_hz /= ((main_cfg->mpuclk >>
  210. CLKMGR_MAINPLL_MPUCLK_PERICNT_LSB) &
  211. CLKMGR_MAINPLL_MPUCLK_CNT_MSK) + 1;
  212. break;
  213. case CLKMGR_MAINPLL_MPUCLK_SRC_OSC1:
  214. clk_hz = eosc1_hz;
  215. break;
  216. case CLKMGR_MAINPLL_MPUCLK_SRC_INTOSC:
  217. clk_hz = cb_intosc_hz;
  218. break;
  219. case CLKMGR_MAINPLL_MPUCLK_SRC_FPGA:
  220. clk_hz = f2s_free_hz;
  221. break;
  222. default:
  223. return 0;
  224. }
  225. clk_hz /= main_cfg->mpuclk_cnt + 1;
  226. return clk_hz;
  227. }
  228. /* calculate the intended NOC clock frequency based on handoff */
  229. static unsigned int cm_calc_handoff_noc_clk_hz(struct mainpll_cfg *main_cfg,
  230. struct perpll_cfg *per_cfg)
  231. {
  232. unsigned int clk_hz;
  233. /* Check MPU clock source: main, periph, osc1, intosc or f2s? */
  234. switch (main_cfg->nocclk_src) {
  235. case CLKMGR_MAINPLL_NOCCLK_SRC_MAIN:
  236. clk_hz = cm_calc_handoff_main_vco_clk_hz(main_cfg);
  237. clk_hz /= (main_cfg->nocclk & CLKMGR_MAINPLL_NOCCLK_CNT_MSK)
  238. + 1;
  239. break;
  240. case CLKMGR_MAINPLL_NOCCLK_SRC_PERI:
  241. clk_hz = cm_calc_handoff_periph_vco_clk_hz(main_cfg, per_cfg);
  242. clk_hz /= ((main_cfg->nocclk >>
  243. CLKMGR_MAINPLL_NOCCLK_PERICNT_LSB) &
  244. CLKMGR_MAINPLL_NOCCLK_CNT_MSK) + 1;
  245. break;
  246. case CLKMGR_MAINPLL_NOCCLK_SRC_OSC1:
  247. clk_hz = eosc1_hz;
  248. break;
  249. case CLKMGR_MAINPLL_NOCCLK_SRC_INTOSC:
  250. clk_hz = cb_intosc_hz;
  251. break;
  252. case CLKMGR_MAINPLL_NOCCLK_SRC_FPGA:
  253. clk_hz = f2s_free_hz;
  254. break;
  255. default:
  256. return 0;
  257. }
  258. clk_hz /= main_cfg->nocclk_cnt + 1;
  259. return clk_hz;
  260. }
  261. /* return 1 if PLL ramp is required */
  262. static int cm_is_pll_ramp_required(int main0periph1,
  263. struct mainpll_cfg *main_cfg,
  264. struct perpll_cfg *per_cfg)
  265. {
  266. /* Check for main PLL */
  267. if (main0periph1 == 0) {
  268. /*
  269. * PLL ramp is not required if both MPU clock and NOC clock are
  270. * not sourced from main PLL
  271. */
  272. if (main_cfg->mpuclk_src != CLKMGR_MAINPLL_MPUCLK_SRC_MAIN &&
  273. main_cfg->nocclk_src != CLKMGR_MAINPLL_NOCCLK_SRC_MAIN)
  274. return 0;
  275. /*
  276. * PLL ramp is required if MPU clock is sourced from main PLL
  277. * and MPU clock is over 900MHz (as advised by HW team)
  278. */
  279. if (main_cfg->mpuclk_src == CLKMGR_MAINPLL_MPUCLK_SRC_MAIN &&
  280. (cm_calc_handoff_mpu_clk_hz(main_cfg, per_cfg) >
  281. CLKMGR_PLL_RAMP_MPUCLK_THRESHOLD_HZ))
  282. return 1;
  283. /*
  284. * PLL ramp is required if NOC clock is sourced from main PLL
  285. * and NOC clock is over 300MHz (as advised by HW team)
  286. */
  287. if (main_cfg->nocclk_src == CLKMGR_MAINPLL_NOCCLK_SRC_MAIN &&
  288. (cm_calc_handoff_noc_clk_hz(main_cfg, per_cfg) >
  289. CLKMGR_PLL_RAMP_NOCCLK_THRESHOLD_HZ))
  290. return 2;
  291. } else if (main0periph1 == 1) {
  292. /*
  293. * PLL ramp is not required if both MPU clock and NOC clock are
  294. * not sourced from periph PLL
  295. */
  296. if (main_cfg->mpuclk_src != CLKMGR_MAINPLL_MPUCLK_SRC_PERI &&
  297. main_cfg->nocclk_src != CLKMGR_MAINPLL_NOCCLK_SRC_PERI)
  298. return 0;
  299. /*
  300. * PLL ramp is required if MPU clock are source from periph PLL
  301. * and MPU clock is over 900MHz (as advised by HW team)
  302. */
  303. if (main_cfg->mpuclk_src == CLKMGR_MAINPLL_MPUCLK_SRC_PERI &&
  304. (cm_calc_handoff_mpu_clk_hz(main_cfg, per_cfg) >
  305. CLKMGR_PLL_RAMP_MPUCLK_THRESHOLD_HZ))
  306. return 1;
  307. /*
  308. * PLL ramp is required if NOC clock are source from periph PLL
  309. * and NOC clock is over 300MHz (as advised by HW team)
  310. */
  311. if (main_cfg->nocclk_src == CLKMGR_MAINPLL_NOCCLK_SRC_PERI &&
  312. (cm_calc_handoff_noc_clk_hz(main_cfg, per_cfg) >
  313. CLKMGR_PLL_RAMP_NOCCLK_THRESHOLD_HZ))
  314. return 2;
  315. }
  316. return 0;
  317. }
  318. static u32 cm_calculate_numer(struct mainpll_cfg *main_cfg,
  319. struct perpll_cfg *per_cfg,
  320. u32 safe_hz, u32 clk_hz)
  321. {
  322. u32 cnt;
  323. u32 clk;
  324. u32 shift;
  325. u32 mask;
  326. u32 denom;
  327. if (main_cfg->mpuclk_src == CLKMGR_MAINPLL_MPUCLK_SRC_MAIN) {
  328. cnt = main_cfg->mpuclk_cnt;
  329. clk = main_cfg->mpuclk;
  330. shift = 0;
  331. mask = CLKMGR_MAINPLL_MPUCLK_CNT_MSK;
  332. denom = main_cfg->vco1_denom;
  333. } else if (main_cfg->nocclk_src == CLKMGR_MAINPLL_NOCCLK_SRC_MAIN) {
  334. cnt = main_cfg->nocclk_cnt;
  335. clk = main_cfg->nocclk;
  336. shift = 0;
  337. mask = CLKMGR_MAINPLL_NOCCLK_CNT_MSK;
  338. denom = main_cfg->vco1_denom;
  339. } else if (main_cfg->mpuclk_src == CLKMGR_MAINPLL_MPUCLK_SRC_PERI) {
  340. cnt = main_cfg->mpuclk_cnt;
  341. clk = main_cfg->mpuclk;
  342. shift = CLKMGR_MAINPLL_MPUCLK_PERICNT_LSB;
  343. mask = CLKMGR_MAINPLL_MPUCLK_CNT_MSK;
  344. denom = per_cfg->vco1_denom;
  345. } else if (main_cfg->nocclk_src == CLKMGR_MAINPLL_NOCCLK_SRC_PERI) {
  346. cnt = main_cfg->nocclk_cnt;
  347. clk = main_cfg->nocclk;
  348. shift = CLKMGR_MAINPLL_NOCCLK_PERICNT_LSB;
  349. mask = CLKMGR_MAINPLL_NOCCLK_CNT_MSK;
  350. denom = per_cfg->vco1_denom;
  351. } else {
  352. return 0;
  353. }
  354. return (safe_hz / clk_hz) * (cnt + 1) * (((clk >> shift) & mask) + 1) *
  355. (1 + denom) - 1;
  356. }
  357. /*
  358. * Calculate the new PLL numerator which is based on existing DTS hand off and
  359. * intended safe frequency (safe_hz). Note that PLL ramp is only modifying the
  360. * numerator while maintaining denominator as denominator will influence the
  361. * jitter condition. Please refer A10 HPS TRM for the jitter guide. Note final
  362. * value for numerator is minus with 1 to cater our register value
  363. * representation.
  364. */
  365. static unsigned int cm_calc_safe_pll_numer(int main0periph1,
  366. struct mainpll_cfg *main_cfg,
  367. struct perpll_cfg *per_cfg,
  368. unsigned int safe_hz)
  369. {
  370. unsigned int clk_hz = 0;
  371. /* Check for main PLL */
  372. if (main0periph1 == 0) {
  373. /* Check main VCO clock source: eosc, intosc or f2s? */
  374. switch (main_cfg->vco0_psrc) {
  375. case CLKMGR_MAINPLL_VCO0_PSRC_EOSC:
  376. clk_hz = eosc1_hz;
  377. break;
  378. case CLKMGR_MAINPLL_VCO0_PSRC_E_INTOSC:
  379. clk_hz = cb_intosc_hz;
  380. break;
  381. case CLKMGR_MAINPLL_VCO0_PSRC_F2S:
  382. clk_hz = f2s_free_hz;
  383. break;
  384. default:
  385. return 0;
  386. }
  387. } else if (main0periph1 == 1) {
  388. /* Check periph VCO clock source: eosc, intosc, f2s, mainpll */
  389. switch (per_cfg->vco0_psrc) {
  390. case CLKMGR_PERPLL_VCO0_PSRC_EOSC:
  391. clk_hz = eosc1_hz;
  392. break;
  393. case CLKMGR_PERPLL_VCO0_PSRC_E_INTOSC:
  394. clk_hz = cb_intosc_hz;
  395. break;
  396. case CLKMGR_PERPLL_VCO0_PSRC_F2S:
  397. clk_hz = f2s_free_hz;
  398. break;
  399. case CLKMGR_PERPLL_VCO0_PSRC_MAIN:
  400. clk_hz = cm_calc_handoff_main_vco_clk_hz(main_cfg);
  401. clk_hz /= main_cfg->cntr15clk_cnt;
  402. break;
  403. default:
  404. return 0;
  405. }
  406. } else {
  407. return 0;
  408. }
  409. return cm_calculate_numer(main_cfg, per_cfg, safe_hz, clk_hz);
  410. }
  411. /* ramping the main PLL to final value */
  412. static void cm_pll_ramp_main(struct mainpll_cfg *main_cfg,
  413. struct perpll_cfg *per_cfg,
  414. unsigned int pll_ramp_main_hz)
  415. {
  416. unsigned int clk_hz = 0, clk_incr_hz = 0, clk_final_hz = 0;
  417. /* find out the increment value */
  418. if (main_cfg->mpuclk_src == CLKMGR_MAINPLL_MPUCLK_SRC_MAIN) {
  419. clk_incr_hz = CLKMGR_PLL_RAMP_MPUCLK_INCREMENT_HZ;
  420. clk_final_hz = cm_calc_handoff_mpu_clk_hz(main_cfg, per_cfg);
  421. } else if (main_cfg->nocclk_src == CLKMGR_MAINPLL_NOCCLK_SRC_MAIN) {
  422. clk_incr_hz = CLKMGR_PLL_RAMP_NOCCLK_INCREMENT_HZ;
  423. clk_final_hz = cm_calc_handoff_noc_clk_hz(main_cfg, per_cfg);
  424. }
  425. /* execute the ramping here */
  426. for (clk_hz = pll_ramp_main_hz + clk_incr_hz;
  427. clk_hz < clk_final_hz; clk_hz += clk_incr_hz) {
  428. writel((main_cfg->vco1_denom <<
  429. CLKMGR_MAINPLL_VCO1_DENOM_LSB) |
  430. cm_calc_safe_pll_numer(0, main_cfg, per_cfg, clk_hz),
  431. &clock_manager_base->main_pll.vco1);
  432. mdelay(1);
  433. cm_wait_for_lock(LOCKED_MASK);
  434. }
  435. writel((main_cfg->vco1_denom << CLKMGR_MAINPLL_VCO1_DENOM_LSB) |
  436. main_cfg->vco1_numer, &clock_manager_base->main_pll.vco1);
  437. mdelay(1);
  438. cm_wait_for_lock(LOCKED_MASK);
  439. }
  440. /* ramping the periph PLL to final value */
  441. static void cm_pll_ramp_periph(struct mainpll_cfg *main_cfg,
  442. struct perpll_cfg *per_cfg,
  443. unsigned int pll_ramp_periph_hz)
  444. {
  445. unsigned int clk_hz = 0, clk_incr_hz = 0, clk_final_hz = 0;
  446. /* find out the increment value */
  447. if (main_cfg->mpuclk_src == CLKMGR_MAINPLL_MPUCLK_SRC_PERI) {
  448. clk_incr_hz = CLKMGR_PLL_RAMP_MPUCLK_INCREMENT_HZ;
  449. clk_final_hz = cm_calc_handoff_mpu_clk_hz(main_cfg, per_cfg);
  450. } else if (main_cfg->nocclk_src == CLKMGR_MAINPLL_NOCCLK_SRC_PERI) {
  451. clk_incr_hz = CLKMGR_PLL_RAMP_NOCCLK_INCREMENT_HZ;
  452. clk_final_hz = cm_calc_handoff_noc_clk_hz(main_cfg, per_cfg);
  453. }
  454. /* execute the ramping here */
  455. for (clk_hz = pll_ramp_periph_hz + clk_incr_hz;
  456. clk_hz < clk_final_hz; clk_hz += clk_incr_hz) {
  457. writel((per_cfg->vco1_denom << CLKMGR_PERPLL_VCO1_DENOM_LSB) |
  458. cm_calc_safe_pll_numer(1, main_cfg, per_cfg, clk_hz),
  459. &clock_manager_base->per_pll.vco1);
  460. mdelay(1);
  461. cm_wait_for_lock(LOCKED_MASK);
  462. }
  463. writel((per_cfg->vco1_denom << CLKMGR_PERPLL_VCO1_DENOM_LSB) |
  464. per_cfg->vco1_numer, &clock_manager_base->per_pll.vco1);
  465. mdelay(1);
  466. cm_wait_for_lock(LOCKED_MASK);
  467. }
  468. /*
  469. * Setup clocks while making no assumptions of the
  470. * previous state of the clocks.
  471. *
  472. * Start by being paranoid and gate all sw managed clocks
  473. *
  474. * Put all plls in bypass
  475. *
  476. * Put all plls VCO registers back to reset value (bgpwr dwn).
  477. *
  478. * Put peripheral and main pll src to reset value to avoid glitch.
  479. *
  480. * Delay 5 us.
  481. *
  482. * Deassert bg pwr dn and set numerator and denominator
  483. *
  484. * Start 7 us timer.
  485. *
  486. * set internal dividers
  487. *
  488. * Wait for 7 us timer.
  489. *
  490. * Enable plls
  491. *
  492. * Set external dividers while plls are locking
  493. *
  494. * Wait for pll lock
  495. *
  496. * Assert/deassert outreset all.
  497. *
  498. * Take all pll's out of bypass
  499. *
  500. * Clear safe mode
  501. *
  502. * set source main and peripheral clocks
  503. *
  504. * Ungate clocks
  505. */
  506. static int cm_full_cfg(struct mainpll_cfg *main_cfg, struct perpll_cfg *per_cfg)
  507. {
  508. unsigned int pll_ramp_main_hz = 0, pll_ramp_periph_hz = 0,
  509. ramp_required;
  510. /* gate off all mainpll clock excpet HW managed clock */
  511. writel(CLKMGR_MAINPLL_EN_S2FUSER0CLKEN_SET_MSK |
  512. CLKMGR_MAINPLL_EN_HMCPLLREFCLKEN_SET_MSK,
  513. &clock_manager_base->main_pll.enr);
  514. /* now we can gate off the rest of the peripheral clocks */
  515. writel(0, &clock_manager_base->per_pll.en);
  516. /* Put all plls in external bypass */
  517. writel(CLKMGR_MAINPLL_BYPASS_RESET,
  518. &clock_manager_base->main_pll.bypasss);
  519. writel(CLKMGR_PERPLL_BYPASS_RESET,
  520. &clock_manager_base->per_pll.bypasss);
  521. /*
  522. * Put all plls VCO registers back to reset value.
  523. * Some code might have messed with them. At same time set the
  524. * desired clock source
  525. */
  526. writel(CLKMGR_MAINPLL_VCO0_RESET |
  527. CLKMGR_MAINPLL_VCO0_REGEXTSEL_SET_MSK |
  528. (main_cfg->vco0_psrc << CLKMGR_MAINPLL_VCO0_PSRC_LSB),
  529. &clock_manager_base->main_pll.vco0);
  530. writel(CLKMGR_PERPLL_VCO0_RESET |
  531. CLKMGR_PERPLL_VCO0_REGEXTSEL_SET_MSK |
  532. (per_cfg->vco0_psrc << CLKMGR_PERPLL_VCO0_PSRC_LSB),
  533. &clock_manager_base->per_pll.vco0);
  534. writel(CLKMGR_MAINPLL_VCO1_RESET, &clock_manager_base->main_pll.vco1);
  535. writel(CLKMGR_PERPLL_VCO1_RESET, &clock_manager_base->per_pll.vco1);
  536. /* clear the interrupt register status register */
  537. writel(CLKMGR_CLKMGR_INTR_MAINPLLLOST_SET_MSK |
  538. CLKMGR_CLKMGR_INTR_PERPLLLOST_SET_MSK |
  539. CLKMGR_CLKMGR_INTR_MAINPLLRFSLIP_SET_MSK |
  540. CLKMGR_CLKMGR_INTR_PERPLLRFSLIP_SET_MSK |
  541. CLKMGR_CLKMGR_INTR_MAINPLLFBSLIP_SET_MSK |
  542. CLKMGR_CLKMGR_INTR_PERPLLFBSLIP_SET_MSK |
  543. CLKMGR_CLKMGR_INTR_MAINPLLACHIEVED_SET_MSK |
  544. CLKMGR_CLKMGR_INTR_PERPLLACHIEVED_SET_MSK,
  545. &clock_manager_base->intr);
  546. /* Program VCO Numerator and Denominator for main PLL */
  547. ramp_required = cm_is_pll_ramp_required(0, main_cfg, per_cfg);
  548. if (ramp_required) {
  549. /* set main PLL to safe starting threshold frequency */
  550. if (ramp_required == 1)
  551. pll_ramp_main_hz = CLKMGR_PLL_RAMP_MPUCLK_THRESHOLD_HZ;
  552. else if (ramp_required == 2)
  553. pll_ramp_main_hz = CLKMGR_PLL_RAMP_NOCCLK_THRESHOLD_HZ;
  554. writel((main_cfg->vco1_denom << CLKMGR_MAINPLL_VCO1_DENOM_LSB) |
  555. cm_calc_safe_pll_numer(0, main_cfg, per_cfg,
  556. pll_ramp_main_hz),
  557. &clock_manager_base->main_pll.vco1);
  558. } else
  559. writel((main_cfg->vco1_denom << CLKMGR_MAINPLL_VCO1_DENOM_LSB) |
  560. main_cfg->vco1_numer,
  561. &clock_manager_base->main_pll.vco1);
  562. /* Program VCO Numerator and Denominator for periph PLL */
  563. ramp_required = cm_is_pll_ramp_required(1, main_cfg, per_cfg);
  564. if (ramp_required) {
  565. /* set periph PLL to safe starting threshold frequency */
  566. if (ramp_required == 1)
  567. pll_ramp_periph_hz =
  568. CLKMGR_PLL_RAMP_MPUCLK_THRESHOLD_HZ;
  569. else if (ramp_required == 2)
  570. pll_ramp_periph_hz =
  571. CLKMGR_PLL_RAMP_NOCCLK_THRESHOLD_HZ;
  572. writel((per_cfg->vco1_denom << CLKMGR_PERPLL_VCO1_DENOM_LSB) |
  573. cm_calc_safe_pll_numer(1, main_cfg, per_cfg,
  574. pll_ramp_periph_hz),
  575. &clock_manager_base->per_pll.vco1);
  576. } else
  577. writel((per_cfg->vco1_denom << CLKMGR_PERPLL_VCO1_DENOM_LSB) |
  578. per_cfg->vco1_numer,
  579. &clock_manager_base->per_pll.vco1);
  580. /* Wait for at least 5 us */
  581. udelay(5);
  582. /* Now deassert BGPWRDN and PWRDN */
  583. clrbits_le32(&clock_manager_base->main_pll.vco0,
  584. CLKMGR_MAINPLL_VCO0_BGPWRDN_SET_MSK |
  585. CLKMGR_MAINPLL_VCO0_PWRDN_SET_MSK);
  586. clrbits_le32(&clock_manager_base->per_pll.vco0,
  587. CLKMGR_PERPLL_VCO0_BGPWRDN_SET_MSK |
  588. CLKMGR_PERPLL_VCO0_PWRDN_SET_MSK);
  589. /* Wait for at least 7 us */
  590. udelay(7);
  591. /* enable the VCO and disable the external regulator to PLL */
  592. writel((readl(&clock_manager_base->main_pll.vco0) &
  593. ~CLKMGR_MAINPLL_VCO0_REGEXTSEL_SET_MSK) |
  594. CLKMGR_MAINPLL_VCO0_EN_SET_MSK,
  595. &clock_manager_base->main_pll.vco0);
  596. writel((readl(&clock_manager_base->per_pll.vco0) &
  597. ~CLKMGR_PERPLL_VCO0_REGEXTSEL_SET_MSK) |
  598. CLKMGR_PERPLL_VCO0_EN_SET_MSK,
  599. &clock_manager_base->per_pll.vco0);
  600. /* setup all the main PLL counter and clock source */
  601. writel(main_cfg->nocclk,
  602. SOCFPGA_CLKMGR_ADDRESS + CLKMGR_MAINPLL_NOC_CLK_OFFSET);
  603. writel(main_cfg->mpuclk,
  604. SOCFPGA_CLKMGR_ADDRESS + CLKMGR_ALTERAGRP_MPU_CLK_OFFSET);
  605. /* main_emaca_clk divider */
  606. writel(main_cfg->cntr2clk_cnt, &clock_manager_base->main_pll.cntr2clk);
  607. /* main_emacb_clk divider */
  608. writel(main_cfg->cntr3clk_cnt, &clock_manager_base->main_pll.cntr3clk);
  609. /* main_emac_ptp_clk divider */
  610. writel(main_cfg->cntr4clk_cnt, &clock_manager_base->main_pll.cntr4clk);
  611. /* main_gpio_db_clk divider */
  612. writel(main_cfg->cntr5clk_cnt, &clock_manager_base->main_pll.cntr5clk);
  613. /* main_sdmmc_clk divider */
  614. writel(main_cfg->cntr6clk_cnt, &clock_manager_base->main_pll.cntr6clk);
  615. /* main_s2f_user0_clk divider */
  616. writel(main_cfg->cntr7clk_cnt |
  617. (main_cfg->cntr7clk_src << CLKMGR_MAINPLL_CNTR7CLK_SRC_LSB),
  618. &clock_manager_base->main_pll.cntr7clk);
  619. /* main_s2f_user1_clk divider */
  620. writel(main_cfg->cntr8clk_cnt, &clock_manager_base->main_pll.cntr8clk);
  621. /* main_hmc_pll_clk divider */
  622. writel(main_cfg->cntr9clk_cnt |
  623. (main_cfg->cntr9clk_src << CLKMGR_MAINPLL_CNTR9CLK_SRC_LSB),
  624. &clock_manager_base->main_pll.cntr9clk);
  625. /* main_periph_ref_clk divider */
  626. writel(main_cfg->cntr15clk_cnt,
  627. &clock_manager_base->main_pll.cntr15clk);
  628. /* setup all the peripheral PLL counter and clock source */
  629. /* peri_emaca_clk divider */
  630. writel(per_cfg->cntr2clk_cnt |
  631. (per_cfg->cntr2clk_src << CLKMGR_PERPLL_CNTR2CLK_SRC_LSB),
  632. &clock_manager_base->per_pll.cntr2clk);
  633. /* peri_emacb_clk divider */
  634. writel(per_cfg->cntr3clk_cnt |
  635. (per_cfg->cntr3clk_src << CLKMGR_PERPLL_CNTR3CLK_SRC_LSB),
  636. &clock_manager_base->per_pll.cntr3clk);
  637. /* peri_emac_ptp_clk divider */
  638. writel(per_cfg->cntr4clk_cnt |
  639. (per_cfg->cntr4clk_src << CLKMGR_PERPLL_CNTR4CLK_SRC_LSB),
  640. &clock_manager_base->per_pll.cntr4clk);
  641. /* peri_gpio_db_clk divider */
  642. writel(per_cfg->cntr5clk_cnt |
  643. (per_cfg->cntr5clk_src << CLKMGR_PERPLL_CNTR5CLK_SRC_LSB),
  644. &clock_manager_base->per_pll.cntr5clk);
  645. /* peri_sdmmc_clk divider */
  646. writel(per_cfg->cntr6clk_cnt |
  647. (per_cfg->cntr6clk_src << CLKMGR_PERPLL_CNTR6CLK_SRC_LSB),
  648. &clock_manager_base->per_pll.cntr6clk);
  649. /* peri_s2f_user0_clk divider */
  650. writel(per_cfg->cntr7clk_cnt, &clock_manager_base->per_pll.cntr7clk);
  651. /* peri_s2f_user1_clk divider */
  652. writel(per_cfg->cntr8clk_cnt |
  653. (per_cfg->cntr8clk_src << CLKMGR_PERPLL_CNTR8CLK_SRC_LSB),
  654. &clock_manager_base->per_pll.cntr8clk);
  655. /* peri_hmc_pll_clk divider */
  656. writel(per_cfg->cntr9clk_cnt, &clock_manager_base->per_pll.cntr9clk);
  657. /* setup all the external PLL counter */
  658. /* mpu wrapper / external divider */
  659. writel(main_cfg->mpuclk_cnt |
  660. (main_cfg->mpuclk_src << CLKMGR_MAINPLL_MPUCLK_SRC_LSB),
  661. &clock_manager_base->main_pll.mpuclk);
  662. /* NOC wrapper / external divider */
  663. writel(main_cfg->nocclk_cnt |
  664. (main_cfg->nocclk_src << CLKMGR_MAINPLL_NOCCLK_SRC_LSB),
  665. &clock_manager_base->main_pll.nocclk);
  666. /* NOC subclock divider such as l4 */
  667. writel(main_cfg->nocdiv_l4mainclk |
  668. (main_cfg->nocdiv_l4mpclk <<
  669. CLKMGR_MAINPLL_NOCDIV_L4MPCLK_LSB) |
  670. (main_cfg->nocdiv_l4spclk <<
  671. CLKMGR_MAINPLL_NOCDIV_L4SPCLK_LSB) |
  672. (main_cfg->nocdiv_csatclk <<
  673. CLKMGR_MAINPLL_NOCDIV_CSATCLK_LSB) |
  674. (main_cfg->nocdiv_cstraceclk <<
  675. CLKMGR_MAINPLL_NOCDIV_CSTRACECLK_LSB) |
  676. (main_cfg->nocdiv_cspdbclk <<
  677. CLKMGR_MAINPLL_NOCDIV_CSPDBGCLK_LSB),
  678. &clock_manager_base->main_pll.nocdiv);
  679. /* gpio_db external divider */
  680. writel(per_cfg->gpiodiv_gpiodbclk,
  681. &clock_manager_base->per_pll.gpiodiv);
  682. /* setup the EMAC clock mux select */
  683. writel((per_cfg->emacctl_emac0sel <<
  684. CLKMGR_PERPLL_EMACCTL_EMAC0SEL_LSB) |
  685. (per_cfg->emacctl_emac1sel <<
  686. CLKMGR_PERPLL_EMACCTL_EMAC1SEL_LSB) |
  687. (per_cfg->emacctl_emac2sel <<
  688. CLKMGR_PERPLL_EMACCTL_EMAC2SEL_LSB),
  689. &clock_manager_base->per_pll.emacctl);
  690. /* at this stage, check for PLL lock status */
  691. cm_wait_for_lock(LOCKED_MASK);
  692. /*
  693. * after locking, but before taking out of bypass,
  694. * assert/deassert outresetall
  695. */
  696. /* assert mainpll outresetall */
  697. setbits_le32(&clock_manager_base->main_pll.vco0,
  698. CLKMGR_MAINPLL_VCO0_OUTRSTALL_SET_MSK);
  699. /* assert perpll outresetall */
  700. setbits_le32(&clock_manager_base->per_pll.vco0,
  701. CLKMGR_PERPLL_VCO0_OUTRSTALL_SET_MSK);
  702. /* de-assert mainpll outresetall */
  703. clrbits_le32(&clock_manager_base->main_pll.vco0,
  704. CLKMGR_MAINPLL_VCO0_OUTRSTALL_SET_MSK);
  705. /* de-assert perpll outresetall */
  706. clrbits_le32(&clock_manager_base->per_pll.vco0,
  707. CLKMGR_PERPLL_VCO0_OUTRSTALL_SET_MSK);
  708. /* Take all PLLs out of bypass when boot mode is cleared. */
  709. /* release mainpll from bypass */
  710. writel(CLKMGR_MAINPLL_BYPASS_RESET,
  711. &clock_manager_base->main_pll.bypassr);
  712. /* wait till Clock Manager is not busy */
  713. cm_wait_for_fsm();
  714. /* release perpll from bypass */
  715. writel(CLKMGR_PERPLL_BYPASS_RESET,
  716. &clock_manager_base->per_pll.bypassr);
  717. /* wait till Clock Manager is not busy */
  718. cm_wait_for_fsm();
  719. /* clear boot mode */
  720. clrbits_le32(&clock_manager_base->ctrl,
  721. CLKMGR_CLKMGR_CTL_BOOTMOD_SET_MSK);
  722. /* wait till Clock Manager is not busy */
  723. cm_wait_for_fsm();
  724. /* At here, we need to ramp to final value if needed */
  725. if (pll_ramp_main_hz != 0)
  726. cm_pll_ramp_main(main_cfg, per_cfg, pll_ramp_main_hz);
  727. if (pll_ramp_periph_hz != 0)
  728. cm_pll_ramp_periph(main_cfg, per_cfg, pll_ramp_periph_hz);
  729. /* Now ungate non-hw-managed clocks */
  730. writel(CLKMGR_MAINPLL_EN_S2FUSER0CLKEN_SET_MSK |
  731. CLKMGR_MAINPLL_EN_HMCPLLREFCLKEN_SET_MSK,
  732. &clock_manager_base->main_pll.ens);
  733. writel(CLKMGR_PERPLL_EN_RESET, &clock_manager_base->per_pll.ens);
  734. /* Clear the loss lock and slip bits as they might set during
  735. clock reconfiguration */
  736. writel(CLKMGR_CLKMGR_INTR_MAINPLLLOST_SET_MSK |
  737. CLKMGR_CLKMGR_INTR_PERPLLLOST_SET_MSK |
  738. CLKMGR_CLKMGR_INTR_MAINPLLRFSLIP_SET_MSK |
  739. CLKMGR_CLKMGR_INTR_PERPLLRFSLIP_SET_MSK |
  740. CLKMGR_CLKMGR_INTR_MAINPLLFBSLIP_SET_MSK |
  741. CLKMGR_CLKMGR_INTR_PERPLLFBSLIP_SET_MSK,
  742. &clock_manager_base->intr);
  743. return 0;
  744. }
  745. void cm_use_intosc(void)
  746. {
  747. setbits_le32(&clock_manager_base->ctrl,
  748. CLKMGR_CLKMGR_CTL_BOOTCLK_INTOSC_SET_MSK);
  749. }
  750. unsigned int cm_get_noc_clk_hz(void)
  751. {
  752. unsigned int clk_src, divisor, nocclk, src_hz;
  753. nocclk = readl(&clock_manager_base->main_pll.nocclk);
  754. clk_src = (nocclk >> CLKMGR_MAINPLL_NOCCLK_SRC_LSB) &
  755. CLKMGR_MAINPLL_NOCCLK_SRC_MSK;
  756. divisor = 1 + (nocclk & CLKMGR_MAINPLL_NOCDIV_MSK);
  757. if (clk_src == CLKMGR_PERPLLGRP_SRC_MAIN) {
  758. src_hz = cm_get_main_vco_clk_hz();
  759. src_hz /= 1 +
  760. (readl(SOCFPGA_CLKMGR_ADDRESS + CLKMGR_MAINPLL_NOC_CLK_OFFSET) &
  761. CLKMGR_MAINPLL_NOCCLK_CNT_MSK);
  762. } else if (clk_src == CLKMGR_PERPLLGRP_SRC_PERI) {
  763. src_hz = cm_get_per_vco_clk_hz();
  764. src_hz /= 1 +
  765. ((readl(SOCFPGA_CLKMGR_ADDRESS +
  766. CLKMGR_MAINPLL_NOC_CLK_OFFSET) >>
  767. CLKMGR_MAINPLL_NOCCLK_PERICNT_LSB) &
  768. CLKMGR_MAINPLL_NOCCLK_CNT_MSK);
  769. } else if (clk_src == CLKMGR_PERPLLGRP_SRC_OSC1) {
  770. src_hz = eosc1_hz;
  771. } else if (clk_src == CLKMGR_PERPLLGRP_SRC_INTOSC) {
  772. src_hz = cb_intosc_hz;
  773. } else if (clk_src == CLKMGR_PERPLLGRP_SRC_FPGA) {
  774. src_hz = f2s_free_hz;
  775. } else {
  776. src_hz = 0;
  777. }
  778. return src_hz / divisor;
  779. }
  780. unsigned int cm_get_l4_noc_hz(unsigned int nocdivshift)
  781. {
  782. unsigned int divisor2 = 1 <<
  783. ((readl(&clock_manager_base->main_pll.nocdiv) >>
  784. nocdivshift) & CLKMGR_MAINPLL_NOCDIV_MSK);
  785. return cm_get_noc_clk_hz() / divisor2;
  786. }
  787. int cm_basic_init(const void *blob)
  788. {
  789. struct mainpll_cfg main_cfg;
  790. struct perpll_cfg per_cfg;
  791. struct alteragrp_cfg altrgrp_cfg;
  792. int rval;
  793. /* initialize to zero for use case of optional node */
  794. memset(&main_cfg, 0, sizeof(main_cfg));
  795. memset(&per_cfg, 0, sizeof(per_cfg));
  796. memset(&altrgrp_cfg, 0, sizeof(altrgrp_cfg));
  797. rval = of_get_clk_cfg(blob, &main_cfg, &per_cfg, &altrgrp_cfg);
  798. if (rval)
  799. return rval;
  800. rval = cm_full_cfg(&main_cfg, &per_cfg);
  801. cm_l4_main_clk_hz =
  802. cm_get_l4_noc_hz(CLKMGR_MAINPLL_NOCDIV_L4MAINCLK_LSB);
  803. cm_l4_mp_clk_hz = cm_get_l4_noc_hz(CLKMGR_MAINPLL_NOCDIV_L4MPCLK_LSB);
  804. cm_l4_sp_clk_hz = cm_get_l4_sp_clk_hz();
  805. cm_l4_sys_free_clk_hz = cm_get_noc_clk_hz() / 4;
  806. return rval;
  807. }
  808. unsigned long cm_get_mpu_clk_hz(void)
  809. {
  810. u32 reg, clk_hz;
  811. u32 clk_src, mainmpuclk_reg;
  812. mainmpuclk_reg = readl(&clock_manager_base->main_pll.mpuclk);
  813. clk_src = (mainmpuclk_reg >> CLKMGR_MAINPLL_MPUCLK_SRC_LSB) &
  814. CLKMGR_MAINPLL_MPUCLK_SRC_MSK;
  815. reg = readl(&clock_manager_base->altera.mpuclk);
  816. /* Check MPU clock source: main, periph, osc1, intosc or f2s? */
  817. switch (clk_src) {
  818. case CLKMGR_MAINPLL_MPUCLK_SRC_MAIN:
  819. clk_hz = cm_get_main_vco_clk_hz();
  820. clk_hz /= (reg & CLKMGR_MAINPLL_MPUCLK_CNT_MSK) + 1;
  821. break;
  822. case CLKMGR_MAINPLL_MPUCLK_SRC_PERI:
  823. clk_hz = cm_get_per_vco_clk_hz();
  824. clk_hz /= (((reg >> CLKMGR_MAINPLL_MPUCLK_PERICNT_LSB) &
  825. CLKMGR_MAINPLL_MPUCLK_CNT_MSK) + 1);
  826. break;
  827. case CLKMGR_MAINPLL_MPUCLK_SRC_OSC1:
  828. clk_hz = eosc1_hz;
  829. break;
  830. case CLKMGR_MAINPLL_MPUCLK_SRC_INTOSC:
  831. clk_hz = cb_intosc_hz;
  832. break;
  833. case CLKMGR_MAINPLL_MPUCLK_SRC_FPGA:
  834. clk_hz = f2s_free_hz;
  835. break;
  836. default:
  837. printf("cm_get_mpu_clk_hz invalid clk_src %d\n", clk_src);
  838. return 0;
  839. }
  840. clk_hz /= (mainmpuclk_reg & CLKMGR_MAINPLL_MPUCLK_CNT_MSK) + 1;
  841. return clk_hz;
  842. }
  843. unsigned int cm_get_per_vco_clk_hz(void)
  844. {
  845. u32 src_hz = 0;
  846. u32 clk_src = 0;
  847. u32 numer = 0;
  848. u32 denom = 0;
  849. u32 vco = 0;
  850. clk_src = readl(&clock_manager_base->per_pll.vco0);
  851. clk_src = (clk_src >> CLKMGR_PERPLL_VCO0_PSRC_LSB) &
  852. CLKMGR_PERPLL_VCO0_PSRC_MSK;
  853. if (clk_src == CLKMGR_PERPLL_VCO0_PSRC_EOSC) {
  854. src_hz = eosc1_hz;
  855. } else if (clk_src == CLKMGR_PERPLL_VCO0_PSRC_E_INTOSC) {
  856. src_hz = cb_intosc_hz;
  857. } else if (clk_src == CLKMGR_PERPLL_VCO0_PSRC_F2S) {
  858. src_hz = f2s_free_hz;
  859. } else if (clk_src == CLKMGR_PERPLL_VCO0_PSRC_MAIN) {
  860. src_hz = cm_get_main_vco_clk_hz();
  861. src_hz /= (readl(&clock_manager_base->main_pll.cntr15clk) &
  862. CLKMGR_MAINPLL_CNTRCLK_MSK) + 1;
  863. } else {
  864. printf("cm_get_per_vco_clk_hz invalid clk_src %d\n", clk_src);
  865. return 0;
  866. }
  867. vco = readl(&clock_manager_base->per_pll.vco1);
  868. numer = vco & CLKMGR_PERPLL_VCO1_NUMER_MSK;
  869. denom = (vco >> CLKMGR_PERPLL_VCO1_DENOM_LSB) &
  870. CLKMGR_PERPLL_VCO1_DENOM_MSK;
  871. vco = src_hz;
  872. vco /= 1 + denom;
  873. vco *= 1 + numer;
  874. return vco;
  875. }
  876. unsigned int cm_get_main_vco_clk_hz(void)
  877. {
  878. u32 src_hz, numer, denom, vco;
  879. u32 clk_src = readl(&clock_manager_base->main_pll.vco0);
  880. clk_src = (clk_src >> CLKMGR_MAINPLL_VCO0_PSRC_LSB) &
  881. CLKMGR_MAINPLL_VCO0_PSRC_MSK;
  882. if (clk_src == CLKMGR_MAINPLL_VCO0_PSRC_EOSC) {
  883. src_hz = eosc1_hz;
  884. } else if (clk_src == CLKMGR_MAINPLL_VCO0_PSRC_E_INTOSC) {
  885. src_hz = cb_intosc_hz;
  886. } else if (clk_src == CLKMGR_MAINPLL_VCO0_PSRC_F2S) {
  887. src_hz = f2s_free_hz;
  888. } else {
  889. printf("cm_get_main_vco_clk_hz invalid clk_src %d\n", clk_src);
  890. return 0;
  891. }
  892. vco = readl(&clock_manager_base->main_pll.vco1);
  893. numer = vco & CLKMGR_MAINPLL_VCO1_NUMER_MSK;
  894. denom = (vco >> CLKMGR_MAINPLL_VCO1_DENOM_LSB) &
  895. CLKMGR_MAINPLL_VCO1_DENOM_MSK;
  896. vco = src_hz;
  897. vco /= 1 + denom;
  898. vco *= 1 + numer;
  899. return vco;
  900. }
  901. unsigned int cm_get_l4_sp_clk_hz(void)
  902. {
  903. return cm_get_l4_noc_hz(CLKMGR_MAINPLL_NOCDIV_L4SPCLK_LSB);
  904. }
  905. unsigned int cm_get_mmc_controller_clk_hz(void)
  906. {
  907. u32 clk_hz = 0;
  908. u32 clk_input = 0;
  909. clk_input = readl(&clock_manager_base->per_pll.cntr6clk);
  910. clk_input = (clk_input >> CLKMGR_PERPLL_CNTR6CLK_SRC_LSB) &
  911. CLKMGR_PERPLLGRP_SRC_MSK;
  912. switch (clk_input) {
  913. case CLKMGR_PERPLLGRP_SRC_MAIN:
  914. clk_hz = cm_get_main_vco_clk_hz();
  915. clk_hz /= 1 + (readl(&clock_manager_base->main_pll.cntr6clk) &
  916. CLKMGR_MAINPLL_CNTRCLK_MSK);
  917. break;
  918. case CLKMGR_PERPLLGRP_SRC_PERI:
  919. clk_hz = cm_get_per_vco_clk_hz();
  920. clk_hz /= 1 + (readl(&clock_manager_base->per_pll.cntr6clk) &
  921. CLKMGR_PERPLL_CNTRCLK_MSK);
  922. break;
  923. case CLKMGR_PERPLLGRP_SRC_OSC1:
  924. clk_hz = eosc1_hz;
  925. break;
  926. case CLKMGR_PERPLLGRP_SRC_INTOSC:
  927. clk_hz = cb_intosc_hz;
  928. break;
  929. case CLKMGR_PERPLLGRP_SRC_FPGA:
  930. clk_hz = f2s_free_hz;
  931. break;
  932. }
  933. return clk_hz / 4;
  934. }
  935. unsigned int cm_get_spi_controller_clk_hz(void)
  936. {
  937. return cm_get_l4_noc_hz(CLKMGR_MAINPLL_NOCDIV_L4MPCLK_LSB);
  938. }
  939. unsigned int cm_get_qspi_controller_clk_hz(void)
  940. {
  941. return cm_get_l4_noc_hz(CLKMGR_MAINPLL_NOCDIV_L4MAINCLK_LSB);
  942. }
  943. /* Override weak dw_spi_get_clk implementation in designware_spi.c driver */
  944. int dw_spi_get_clk(struct udevice *bus, ulong *rate)
  945. {
  946. *rate = cm_get_spi_controller_clk_hz();
  947. return 0;
  948. }
  949. void cm_print_clock_quick_summary(void)
  950. {
  951. printf("MPU %10ld kHz\n", cm_get_mpu_clk_hz() / 1000);
  952. printf("MMC %8d kHz\n", cm_get_mmc_controller_clk_hz() / 1000);
  953. printf("QSPI %8d kHz\n", cm_get_qspi_controller_clk_hz() / 1000);
  954. printf("SPI %8d kHz\n", cm_get_spi_controller_clk_hz() / 1000);
  955. printf("EOSC1 %8d kHz\n", eosc1_hz / 1000);
  956. printf("cb_intosc %8d kHz\n", cb_intosc_hz / 1000);
  957. printf("f2s_free %8d kHz\n", f2s_free_hz / 1000);
  958. printf("Main VCO %8d kHz\n", cm_get_main_vco_clk_hz() / 1000);
  959. printf("NOC %8d kHz\n", cm_get_noc_clk_hz() / 1000);
  960. printf("L4 Main %8d kHz\n",
  961. cm_get_l4_noc_hz(CLKMGR_MAINPLL_NOCDIV_L4MAINCLK_LSB) / 1000);
  962. printf("L4 MP %8d kHz\n",
  963. cm_get_l4_noc_hz(CLKMGR_MAINPLL_NOCDIV_L4MPCLK_LSB) / 1000);
  964. printf("L4 SP %8d kHz\n", cm_get_l4_sp_clk_hz() / 1000);
  965. printf("L4 sys free %8d kHz\n", cm_l4_sys_free_clk_hz / 1000);
  966. }