clock.c 27 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133
  1. /*
  2. * Copyright (C) 2015 Freescale Semiconductor, Inc.
  3. *
  4. * Author:
  5. * Peng Fan <Peng.Fan@freescale.com>
  6. *
  7. * SPDX-License-Identifier: GPL-2.0+
  8. */
  9. #include <common.h>
  10. #include <div64.h>
  11. #include <asm/io.h>
  12. #include <linux/errno.h>
  13. #include <asm/arch/imx-regs.h>
  14. #include <asm/arch/crm_regs.h>
  15. #include <asm/arch/clock.h>
  16. #include <asm/arch/sys_proto.h>
  17. struct mxc_ccm_anatop_reg *ccm_anatop = (struct mxc_ccm_anatop_reg *)
  18. ANATOP_BASE_ADDR;
  19. struct mxc_ccm_reg *ccm_reg = (struct mxc_ccm_reg *)CCM_BASE_ADDR;
  20. #ifdef CONFIG_FSL_ESDHC
  21. DECLARE_GLOBAL_DATA_PTR;
  22. #endif
  23. int get_clocks(void)
  24. {
  25. #ifdef CONFIG_FSL_ESDHC
  26. #if CONFIG_SYS_FSL_ESDHC_ADDR == USDHC2_BASE_ADDR
  27. gd->arch.sdhc_clk = mxc_get_clock(MXC_ESDHC2_CLK);
  28. #elif CONFIG_SYS_FSL_ESDHC_ADDR == USDHC3_BASE_ADDR
  29. gd->arch.sdhc_clk = mxc_get_clock(MXC_ESDHC3_CLK);
  30. #else
  31. gd->arch.sdhc_clk = mxc_get_clock(MXC_ESDHC_CLK);
  32. #endif
  33. #endif
  34. return 0;
  35. }
  36. u32 get_ahb_clk(void)
  37. {
  38. return get_root_clk(AHB_CLK_ROOT);
  39. }
  40. static u32 get_ipg_clk(void)
  41. {
  42. /*
  43. * The AHB and IPG are fixed at 2:1 ratio, and synchronized to
  44. * each other.
  45. */
  46. return get_ahb_clk() / 2;
  47. }
  48. u32 imx_get_uartclk(void)
  49. {
  50. return get_root_clk(UART1_CLK_ROOT);
  51. }
  52. u32 imx_get_fecclk(void)
  53. {
  54. return get_root_clk(ENET_AXI_CLK_ROOT);
  55. }
  56. #ifdef CONFIG_MXC_OCOTP
  57. void enable_ocotp_clk(unsigned char enable)
  58. {
  59. clock_enable(CCGR_OCOTP, enable);
  60. }
  61. void enable_thermal_clk(void)
  62. {
  63. enable_ocotp_clk(1);
  64. }
  65. #endif
  66. void enable_usboh3_clk(unsigned char enable)
  67. {
  68. u32 target;
  69. if (enable) {
  70. /* disable the clock gate first */
  71. clock_enable(CCGR_USB_HSIC, 0);
  72. /* 120Mhz */
  73. target = CLK_ROOT_ON |
  74. USB_HSIC_CLK_ROOT_FROM_PLL_SYS_MAIN_480M_CLK |
  75. CLK_ROOT_PRE_DIV(CLK_ROOT_PRE_DIV1) |
  76. CLK_ROOT_POST_DIV(CLK_ROOT_POST_DIV1);
  77. clock_set_target_val(USB_HSIC_CLK_ROOT, target);
  78. /* enable the clock gate */
  79. clock_enable(CCGR_USB_CTRL, 1);
  80. clock_enable(CCGR_USB_HSIC, 1);
  81. clock_enable(CCGR_USB_PHY1, 1);
  82. clock_enable(CCGR_USB_PHY2, 1);
  83. } else {
  84. clock_enable(CCGR_USB_CTRL, 0);
  85. clock_enable(CCGR_USB_HSIC, 0);
  86. clock_enable(CCGR_USB_PHY1, 0);
  87. clock_enable(CCGR_USB_PHY2, 0);
  88. }
  89. }
  90. static u32 decode_pll(enum pll_clocks pll, u32 infreq)
  91. {
  92. u32 reg, div_sel;
  93. u32 num, denom;
  94. /*
  95. * Alought there are four choices for the bypass src,
  96. * we choose OSC_24M which is the default set in ROM.
  97. */
  98. switch (pll) {
  99. case PLL_CORE:
  100. reg = readl(&ccm_anatop->pll_arm);
  101. if (reg & CCM_ANALOG_PLL_ARM_POWERDOWN_MASK)
  102. return 0;
  103. if (reg & CCM_ANALOG_PLL_ARM_BYPASS_MASK)
  104. return MXC_HCLK;
  105. div_sel = (reg & CCM_ANALOG_PLL_ARM_DIV_SELECT_MASK) >>
  106. CCM_ANALOG_PLL_ARM_DIV_SELECT_SHIFT;
  107. return (infreq * div_sel) / 2;
  108. case PLL_SYS:
  109. reg = readl(&ccm_anatop->pll_480);
  110. if (reg & CCM_ANALOG_PLL_480_POWERDOWN_MASK)
  111. return 0;
  112. if (reg & CCM_ANALOG_PLL_480_BYPASS_MASK)
  113. return MXC_HCLK;
  114. if (((reg & CCM_ANALOG_PLL_480_DIV_SELECT_MASK) >>
  115. CCM_ANALOG_PLL_480_DIV_SELECT_SHIFT) == 0)
  116. return 480000000u;
  117. else
  118. return 528000000u;
  119. case PLL_ENET:
  120. reg = readl(&ccm_anatop->pll_enet);
  121. if (reg & CCM_ANALOG_PLL_ENET_POWERDOWN_MASK)
  122. return 0;
  123. if (reg & CCM_ANALOG_PLL_ENET_BYPASS_MASK)
  124. return MXC_HCLK;
  125. return 1000000000u;
  126. case PLL_DDR:
  127. reg = readl(&ccm_anatop->pll_ddr);
  128. if (reg & CCM_ANALOG_PLL_DDR_POWERDOWN_MASK)
  129. return 0;
  130. num = ccm_anatop->pll_ddr_num;
  131. denom = ccm_anatop->pll_ddr_denom;
  132. if (reg & CCM_ANALOG_PLL_DDR_BYPASS_MASK)
  133. return MXC_HCLK;
  134. div_sel = (reg & CCM_ANALOG_PLL_DDR_DIV_SELECT_MASK) >>
  135. CCM_ANALOG_PLL_DDR_DIV_SELECT_SHIFT;
  136. return infreq * (div_sel + num / denom);
  137. case PLL_USB:
  138. return 480000000u;
  139. default:
  140. printf("Unsupported pll clocks %d\n", pll);
  141. break;
  142. }
  143. return 0;
  144. }
  145. static u32 mxc_get_pll_sys_derive(int derive)
  146. {
  147. u32 freq, div, frac;
  148. u32 reg;
  149. div = 1;
  150. reg = readl(&ccm_anatop->pll_480);
  151. freq = decode_pll(PLL_SYS, MXC_HCLK);
  152. switch (derive) {
  153. case PLL_SYS_MAIN_480M_CLK:
  154. if (reg & CCM_ANALOG_PLL_480_MAIN_DIV1_CLKGATE_MASK)
  155. return 0;
  156. else
  157. return freq;
  158. case PLL_SYS_MAIN_240M_CLK:
  159. if (reg & CCM_ANALOG_PLL_480_MAIN_DIV2_CLKGATE_MASK)
  160. return 0;
  161. else
  162. return freq / 2;
  163. case PLL_SYS_MAIN_120M_CLK:
  164. if (reg & CCM_ANALOG_PLL_480_MAIN_DIV4_CLKGATE_MASK)
  165. return 0;
  166. else
  167. return freq / 4;
  168. case PLL_SYS_PFD0_392M_CLK:
  169. reg = readl(&ccm_anatop->pfd_480a);
  170. if (reg & CCM_ANALOG_PFD_480A_PFD0_DIV1_CLKGATE_MASK)
  171. return 0;
  172. frac = (reg & CCM_ANALOG_PFD_480A_PFD0_FRAC_MASK) >>
  173. CCM_ANALOG_PFD_480A_PFD0_FRAC_SHIFT;
  174. break;
  175. case PLL_SYS_PFD0_196M_CLK:
  176. if (reg & CCM_ANALOG_PLL_480_PFD0_DIV2_CLKGATE_MASK)
  177. return 0;
  178. reg = readl(&ccm_anatop->pfd_480a);
  179. frac = (reg & CCM_ANALOG_PFD_480A_PFD0_FRAC_MASK) >>
  180. CCM_ANALOG_PFD_480A_PFD0_FRAC_SHIFT;
  181. div = 2;
  182. break;
  183. case PLL_SYS_PFD1_332M_CLK:
  184. reg = readl(&ccm_anatop->pfd_480a);
  185. if (reg & CCM_ANALOG_PFD_480A_PFD1_DIV1_CLKGATE_MASK)
  186. return 0;
  187. frac = (reg & CCM_ANALOG_PFD_480A_PFD1_FRAC_MASK) >>
  188. CCM_ANALOG_PFD_480A_PFD1_FRAC_SHIFT;
  189. break;
  190. case PLL_SYS_PFD1_166M_CLK:
  191. if (reg & CCM_ANALOG_PLL_480_PFD1_DIV2_CLKGATE_MASK)
  192. return 0;
  193. reg = readl(&ccm_anatop->pfd_480a);
  194. frac = (reg & CCM_ANALOG_PFD_480A_PFD1_FRAC_MASK) >>
  195. CCM_ANALOG_PFD_480A_PFD1_FRAC_SHIFT;
  196. div = 2;
  197. break;
  198. case PLL_SYS_PFD2_270M_CLK:
  199. reg = readl(&ccm_anatop->pfd_480a);
  200. if (reg & CCM_ANALOG_PFD_480A_PFD2_DIV1_CLKGATE_MASK)
  201. return 0;
  202. frac = (reg & CCM_ANALOG_PFD_480A_PFD2_FRAC_MASK) >>
  203. CCM_ANALOG_PFD_480A_PFD2_FRAC_SHIFT;
  204. break;
  205. case PLL_SYS_PFD2_135M_CLK:
  206. if (reg & CCM_ANALOG_PLL_480_PFD2_DIV2_CLKGATE_MASK)
  207. return 0;
  208. reg = readl(&ccm_anatop->pfd_480a);
  209. frac = (reg & CCM_ANALOG_PFD_480A_PFD2_FRAC_MASK) >>
  210. CCM_ANALOG_PFD_480A_PFD2_FRAC_SHIFT;
  211. div = 2;
  212. break;
  213. case PLL_SYS_PFD3_CLK:
  214. reg = readl(&ccm_anatop->pfd_480a);
  215. if (reg & CCM_ANALOG_PFD_480A_PFD3_DIV1_CLKGATE_MASK)
  216. return 0;
  217. frac = (reg & CCM_ANALOG_PFD_480A_PFD3_FRAC_MASK) >>
  218. CCM_ANALOG_PFD_480A_PFD3_FRAC_SHIFT;
  219. break;
  220. case PLL_SYS_PFD4_CLK:
  221. reg = readl(&ccm_anatop->pfd_480b);
  222. if (reg & CCM_ANALOG_PFD_480B_PFD4_DIV1_CLKGATE_MASK)
  223. return 0;
  224. frac = (reg & CCM_ANALOG_PFD_480B_PFD4_FRAC_MASK) >>
  225. CCM_ANALOG_PFD_480B_PFD4_FRAC_SHIFT;
  226. break;
  227. case PLL_SYS_PFD5_CLK:
  228. reg = readl(&ccm_anatop->pfd_480b);
  229. if (reg & CCM_ANALOG_PFD_480B_PFD5_DIV1_CLKGATE_MASK)
  230. return 0;
  231. frac = (reg & CCM_ANALOG_PFD_480B_PFD5_FRAC_MASK) >>
  232. CCM_ANALOG_PFD_480B_PFD5_FRAC_SHIFT;
  233. break;
  234. case PLL_SYS_PFD6_CLK:
  235. reg = readl(&ccm_anatop->pfd_480b);
  236. if (reg & CCM_ANALOG_PFD_480B_PFD6_DIV1_CLKGATE_MASK)
  237. return 0;
  238. frac = (reg & CCM_ANALOG_PFD_480B_PFD6_FRAC_MASK) >>
  239. CCM_ANALOG_PFD_480B_PFD6_FRAC_SHIFT;
  240. break;
  241. case PLL_SYS_PFD7_CLK:
  242. reg = readl(&ccm_anatop->pfd_480b);
  243. if (reg & CCM_ANALOG_PFD_480B_PFD7_DIV1_CLKGATE_MASK)
  244. return 0;
  245. frac = (reg & CCM_ANALOG_PFD_480B_PFD7_FRAC_MASK) >>
  246. CCM_ANALOG_PFD_480B_PFD7_FRAC_SHIFT;
  247. break;
  248. default:
  249. printf("Error derived pll_sys clock %d\n", derive);
  250. return 0;
  251. }
  252. return ((freq / frac) * 18) / div;
  253. }
  254. static u32 mxc_get_pll_enet_derive(int derive)
  255. {
  256. u32 freq, reg;
  257. freq = decode_pll(PLL_ENET, MXC_HCLK);
  258. reg = readl(&ccm_anatop->pll_enet);
  259. switch (derive) {
  260. case PLL_ENET_MAIN_500M_CLK:
  261. if (reg & CCM_ANALOG_PLL_ENET_ENABLE_CLK_500MHZ_MASK)
  262. return freq / 2;
  263. break;
  264. case PLL_ENET_MAIN_250M_CLK:
  265. if (reg & CCM_ANALOG_PLL_ENET_ENABLE_CLK_250MHZ_MASK)
  266. return freq / 4;
  267. break;
  268. case PLL_ENET_MAIN_125M_CLK:
  269. if (reg & CCM_ANALOG_PLL_ENET_ENABLE_CLK_125MHZ_MASK)
  270. return freq / 8;
  271. break;
  272. case PLL_ENET_MAIN_100M_CLK:
  273. if (reg & CCM_ANALOG_PLL_ENET_ENABLE_CLK_100MHZ_MASK)
  274. return freq / 10;
  275. break;
  276. case PLL_ENET_MAIN_50M_CLK:
  277. if (reg & CCM_ANALOG_PLL_ENET_ENABLE_CLK_50MHZ_MASK)
  278. return freq / 20;
  279. break;
  280. case PLL_ENET_MAIN_40M_CLK:
  281. if (reg & CCM_ANALOG_PLL_ENET_ENABLE_CLK_40MHZ_MASK)
  282. return freq / 25;
  283. break;
  284. case PLL_ENET_MAIN_25M_CLK:
  285. if (reg & CCM_ANALOG_PLL_ENET_ENABLE_CLK_25MHZ_MASK)
  286. return freq / 40;
  287. break;
  288. default:
  289. printf("Error derived pll_enet clock %d\n", derive);
  290. break;
  291. }
  292. return 0;
  293. }
  294. static u32 mxc_get_pll_ddr_derive(int derive)
  295. {
  296. u32 freq, reg;
  297. freq = decode_pll(PLL_DDR, MXC_HCLK);
  298. reg = readl(&ccm_anatop->pll_ddr);
  299. switch (derive) {
  300. case PLL_DRAM_MAIN_1066M_CLK:
  301. return freq;
  302. case PLL_DRAM_MAIN_533M_CLK:
  303. if (reg & CCM_ANALOG_PLL_DDR_DIV2_ENABLE_CLK_MASK)
  304. return freq / 2;
  305. break;
  306. default:
  307. printf("Error derived pll_ddr clock %d\n", derive);
  308. break;
  309. }
  310. return 0;
  311. }
  312. static u32 mxc_get_pll_derive(enum pll_clocks pll, int derive)
  313. {
  314. switch (pll) {
  315. case PLL_SYS:
  316. return mxc_get_pll_sys_derive(derive);
  317. case PLL_ENET:
  318. return mxc_get_pll_enet_derive(derive);
  319. case PLL_DDR:
  320. return mxc_get_pll_ddr_derive(derive);
  321. default:
  322. printf("Error pll.\n");
  323. return 0;
  324. }
  325. }
  326. static u32 get_root_src_clk(enum clk_root_src root_src)
  327. {
  328. switch (root_src) {
  329. case OSC_24M_CLK:
  330. return 24000000u;
  331. case PLL_ARM_MAIN_800M_CLK:
  332. return decode_pll(PLL_CORE, MXC_HCLK);
  333. case PLL_SYS_MAIN_480M_CLK:
  334. case PLL_SYS_MAIN_240M_CLK:
  335. case PLL_SYS_MAIN_120M_CLK:
  336. case PLL_SYS_PFD0_392M_CLK:
  337. case PLL_SYS_PFD0_196M_CLK:
  338. case PLL_SYS_PFD1_332M_CLK:
  339. case PLL_SYS_PFD1_166M_CLK:
  340. case PLL_SYS_PFD2_270M_CLK:
  341. case PLL_SYS_PFD2_135M_CLK:
  342. case PLL_SYS_PFD3_CLK:
  343. case PLL_SYS_PFD4_CLK:
  344. case PLL_SYS_PFD5_CLK:
  345. case PLL_SYS_PFD6_CLK:
  346. case PLL_SYS_PFD7_CLK:
  347. return mxc_get_pll_derive(PLL_SYS, root_src);
  348. case PLL_ENET_MAIN_500M_CLK:
  349. case PLL_ENET_MAIN_250M_CLK:
  350. case PLL_ENET_MAIN_125M_CLK:
  351. case PLL_ENET_MAIN_100M_CLK:
  352. case PLL_ENET_MAIN_50M_CLK:
  353. case PLL_ENET_MAIN_40M_CLK:
  354. case PLL_ENET_MAIN_25M_CLK:
  355. return mxc_get_pll_derive(PLL_ENET, root_src);
  356. case PLL_DRAM_MAIN_1066M_CLK:
  357. case PLL_DRAM_MAIN_533M_CLK:
  358. return mxc_get_pll_derive(PLL_DDR, root_src);
  359. case PLL_AUDIO_MAIN_CLK:
  360. return decode_pll(PLL_AUDIO, MXC_HCLK);
  361. case PLL_VIDEO_MAIN_CLK:
  362. return decode_pll(PLL_VIDEO, MXC_HCLK);
  363. case PLL_USB_MAIN_480M_CLK:
  364. return decode_pll(PLL_USB, MXC_HCLK);
  365. case REF_1M_CLK:
  366. return 1000000;
  367. case OSC_32K_CLK:
  368. return MXC_CLK32;
  369. case EXT_CLK_1:
  370. case EXT_CLK_2:
  371. case EXT_CLK_3:
  372. case EXT_CLK_4:
  373. printf("No EXT CLK supported??\n");
  374. break;
  375. };
  376. return 0;
  377. }
  378. u32 get_root_clk(enum clk_root_index clock_id)
  379. {
  380. enum clk_root_src root_src;
  381. u32 post_podf, pre_podf, auto_podf, root_src_clk;
  382. int auto_en;
  383. if (clock_root_enabled(clock_id) <= 0)
  384. return 0;
  385. if (clock_get_prediv(clock_id, &pre_podf) < 0)
  386. return 0;
  387. if (clock_get_postdiv(clock_id, &post_podf) < 0)
  388. return 0;
  389. if (clock_get_autopostdiv(clock_id, &auto_podf, &auto_en) < 0)
  390. return 0;
  391. if (auto_en == 0)
  392. auto_podf = 0;
  393. if (clock_get_src(clock_id, &root_src) < 0)
  394. return 0;
  395. root_src_clk = get_root_src_clk(root_src);
  396. /*
  397. * bypass clk is ignored.
  398. */
  399. return root_src_clk / (post_podf + 1) / (pre_podf + 1) /
  400. (auto_podf + 1);
  401. }
  402. static u32 get_ddrc_clk(void)
  403. {
  404. u32 reg, freq;
  405. enum root_post_div post_div;
  406. reg = readl(&ccm_reg->root[DRAM_CLK_ROOT].target_root);
  407. if (reg & CLK_ROOT_MUX_MASK)
  408. /* DRAM_ALT_CLK_ROOT */
  409. freq = get_root_clk(DRAM_ALT_CLK_ROOT);
  410. else
  411. /* PLL_DRAM_MAIN_1066M_CLK */
  412. freq = mxc_get_pll_derive(PLL_DDR, PLL_DRAM_MAIN_1066M_CLK);
  413. post_div = reg & DRAM_CLK_ROOT_POST_DIV_MASK;
  414. return freq / (post_div + 1) / 2;
  415. }
  416. unsigned int mxc_get_clock(enum mxc_clock clk)
  417. {
  418. switch (clk) {
  419. case MXC_ARM_CLK:
  420. return get_root_clk(ARM_A7_CLK_ROOT);
  421. case MXC_AXI_CLK:
  422. return get_root_clk(MAIN_AXI_CLK_ROOT);
  423. case MXC_AHB_CLK:
  424. return get_root_clk(AHB_CLK_ROOT);
  425. case MXC_IPG_CLK:
  426. return get_ipg_clk();
  427. case MXC_I2C_CLK:
  428. return get_root_clk(I2C1_CLK_ROOT);
  429. case MXC_UART_CLK:
  430. return get_root_clk(UART1_CLK_ROOT);
  431. case MXC_CSPI_CLK:
  432. return get_root_clk(ECSPI1_CLK_ROOT);
  433. case MXC_DDR_CLK:
  434. return get_ddrc_clk();
  435. case MXC_ESDHC_CLK:
  436. return get_root_clk(USDHC1_CLK_ROOT);
  437. case MXC_ESDHC2_CLK:
  438. return get_root_clk(USDHC2_CLK_ROOT);
  439. case MXC_ESDHC3_CLK:
  440. return get_root_clk(USDHC3_CLK_ROOT);
  441. default:
  442. printf("Unsupported mxc_clock %d\n", clk);
  443. break;
  444. }
  445. return 0;
  446. }
  447. #ifdef CONFIG_SYS_I2C_MXC
  448. /* i2c_num can be 0 - 3 */
  449. int enable_i2c_clk(unsigned char enable, unsigned i2c_num)
  450. {
  451. u32 target;
  452. if (i2c_num >= 4)
  453. return -EINVAL;
  454. if (enable) {
  455. clock_enable(CCGR_I2C1 + i2c_num, 0);
  456. /* Set i2c root clock to PLL_SYS_MAIN_120M_CLK */
  457. target = CLK_ROOT_ON |
  458. I2C1_CLK_ROOT_FROM_PLL_SYS_MAIN_120M_CLK |
  459. CLK_ROOT_PRE_DIV(CLK_ROOT_PRE_DIV1) |
  460. CLK_ROOT_POST_DIV(CLK_ROOT_POST_DIV2);
  461. clock_set_target_val(I2C1_CLK_ROOT + i2c_num, target);
  462. clock_enable(CCGR_I2C1 + i2c_num, 1);
  463. } else {
  464. clock_enable(CCGR_I2C1 + i2c_num, 0);
  465. }
  466. return 0;
  467. }
  468. #endif
  469. static void init_clk_esdhc(void)
  470. {
  471. u32 target;
  472. /* disable the clock gate first */
  473. clock_enable(CCGR_USDHC1, 0);
  474. clock_enable(CCGR_USDHC2, 0);
  475. clock_enable(CCGR_USDHC3, 0);
  476. /* 196: 392/2 */
  477. target = CLK_ROOT_ON | USDHC1_CLK_ROOT_FROM_PLL_SYS_PFD0_392M_CLK |
  478. CLK_ROOT_PRE_DIV(CLK_ROOT_PRE_DIV1) |
  479. CLK_ROOT_POST_DIV(CLK_ROOT_POST_DIV2);
  480. clock_set_target_val(USDHC1_CLK_ROOT, target);
  481. target = CLK_ROOT_ON | USDHC1_CLK_ROOT_FROM_PLL_SYS_PFD0_392M_CLK |
  482. CLK_ROOT_PRE_DIV(CLK_ROOT_PRE_DIV1) |
  483. CLK_ROOT_POST_DIV(CLK_ROOT_POST_DIV2);
  484. clock_set_target_val(USDHC2_CLK_ROOT, target);
  485. target = CLK_ROOT_ON | USDHC1_CLK_ROOT_FROM_PLL_SYS_PFD0_392M_CLK |
  486. CLK_ROOT_PRE_DIV(CLK_ROOT_PRE_DIV1) |
  487. CLK_ROOT_POST_DIV(CLK_ROOT_POST_DIV2);
  488. clock_set_target_val(USDHC3_CLK_ROOT, target);
  489. /* enable the clock gate */
  490. clock_enable(CCGR_USDHC1, 1);
  491. clock_enable(CCGR_USDHC2, 1);
  492. clock_enable(CCGR_USDHC3, 1);
  493. }
  494. static void init_clk_uart(void)
  495. {
  496. u32 target;
  497. /* disable the clock gate first */
  498. clock_enable(CCGR_UART1, 0);
  499. clock_enable(CCGR_UART2, 0);
  500. clock_enable(CCGR_UART3, 0);
  501. clock_enable(CCGR_UART4, 0);
  502. clock_enable(CCGR_UART5, 0);
  503. clock_enable(CCGR_UART6, 0);
  504. clock_enable(CCGR_UART7, 0);
  505. /* 24Mhz */
  506. target = CLK_ROOT_ON | UART1_CLK_ROOT_FROM_OSC_24M_CLK |
  507. CLK_ROOT_PRE_DIV(CLK_ROOT_PRE_DIV1) |
  508. CLK_ROOT_POST_DIV(CLK_ROOT_POST_DIV1);
  509. clock_set_target_val(UART1_CLK_ROOT, target);
  510. target = CLK_ROOT_ON | UART2_CLK_ROOT_FROM_OSC_24M_CLK |
  511. CLK_ROOT_PRE_DIV(CLK_ROOT_PRE_DIV1) |
  512. CLK_ROOT_POST_DIV(CLK_ROOT_POST_DIV1);
  513. clock_set_target_val(UART2_CLK_ROOT, target);
  514. target = CLK_ROOT_ON | UART3_CLK_ROOT_FROM_OSC_24M_CLK |
  515. CLK_ROOT_PRE_DIV(CLK_ROOT_PRE_DIV1) |
  516. CLK_ROOT_POST_DIV(CLK_ROOT_POST_DIV1);
  517. clock_set_target_val(UART3_CLK_ROOT, target);
  518. target = CLK_ROOT_ON | UART4_CLK_ROOT_FROM_OSC_24M_CLK |
  519. CLK_ROOT_PRE_DIV(CLK_ROOT_PRE_DIV1) |
  520. CLK_ROOT_POST_DIV(CLK_ROOT_POST_DIV1);
  521. clock_set_target_val(UART4_CLK_ROOT, target);
  522. target = CLK_ROOT_ON | UART5_CLK_ROOT_FROM_OSC_24M_CLK |
  523. CLK_ROOT_PRE_DIV(CLK_ROOT_PRE_DIV1) |
  524. CLK_ROOT_POST_DIV(CLK_ROOT_POST_DIV1);
  525. clock_set_target_val(UART5_CLK_ROOT, target);
  526. target = CLK_ROOT_ON | UART6_CLK_ROOT_FROM_OSC_24M_CLK |
  527. CLK_ROOT_PRE_DIV(CLK_ROOT_PRE_DIV1) |
  528. CLK_ROOT_POST_DIV(CLK_ROOT_POST_DIV1);
  529. clock_set_target_val(UART6_CLK_ROOT, target);
  530. target = CLK_ROOT_ON | UART7_CLK_ROOT_FROM_OSC_24M_CLK |
  531. CLK_ROOT_PRE_DIV(CLK_ROOT_PRE_DIV1) |
  532. CLK_ROOT_POST_DIV(CLK_ROOT_POST_DIV1);
  533. clock_set_target_val(UART7_CLK_ROOT, target);
  534. /* enable the clock gate */
  535. clock_enable(CCGR_UART1, 1);
  536. clock_enable(CCGR_UART2, 1);
  537. clock_enable(CCGR_UART3, 1);
  538. clock_enable(CCGR_UART4, 1);
  539. clock_enable(CCGR_UART5, 1);
  540. clock_enable(CCGR_UART6, 1);
  541. clock_enable(CCGR_UART7, 1);
  542. }
  543. static void init_clk_weim(void)
  544. {
  545. u32 target;
  546. /* disable the clock gate first */
  547. clock_enable(CCGR_WEIM, 0);
  548. /* 120Mhz */
  549. target = CLK_ROOT_ON | EIM_CLK_ROOT_FROM_PLL_SYS_MAIN_120M_CLK |
  550. CLK_ROOT_PRE_DIV(CLK_ROOT_PRE_DIV1) |
  551. CLK_ROOT_POST_DIV(CLK_ROOT_POST_DIV1);
  552. clock_set_target_val(EIM_CLK_ROOT, target);
  553. /* enable the clock gate */
  554. clock_enable(CCGR_WEIM, 1);
  555. }
  556. static void init_clk_ecspi(void)
  557. {
  558. u32 target;
  559. /* disable the clock gate first */
  560. clock_enable(CCGR_ECSPI1, 0);
  561. clock_enable(CCGR_ECSPI2, 0);
  562. clock_enable(CCGR_ECSPI3, 0);
  563. clock_enable(CCGR_ECSPI4, 0);
  564. /* 60Mhz: 240/4 */
  565. target = CLK_ROOT_ON | ECSPI1_CLK_ROOT_FROM_PLL_SYS_MAIN_240M_CLK |
  566. CLK_ROOT_PRE_DIV(CLK_ROOT_PRE_DIV1) |
  567. CLK_ROOT_POST_DIV(CLK_ROOT_POST_DIV4);
  568. clock_set_target_val(ECSPI1_CLK_ROOT, target);
  569. target = CLK_ROOT_ON | ECSPI2_CLK_ROOT_FROM_PLL_SYS_MAIN_240M_CLK |
  570. CLK_ROOT_PRE_DIV(CLK_ROOT_PRE_DIV1) |
  571. CLK_ROOT_POST_DIV(CLK_ROOT_POST_DIV4);
  572. clock_set_target_val(ECSPI2_CLK_ROOT, target);
  573. target = CLK_ROOT_ON | ECSPI3_CLK_ROOT_FROM_PLL_SYS_MAIN_240M_CLK |
  574. CLK_ROOT_PRE_DIV(CLK_ROOT_PRE_DIV1) |
  575. CLK_ROOT_POST_DIV(CLK_ROOT_POST_DIV4);
  576. clock_set_target_val(ECSPI3_CLK_ROOT, target);
  577. target = CLK_ROOT_ON | ECSPI4_CLK_ROOT_FROM_PLL_SYS_MAIN_240M_CLK |
  578. CLK_ROOT_PRE_DIV(CLK_ROOT_PRE_DIV1) |
  579. CLK_ROOT_POST_DIV(CLK_ROOT_POST_DIV4);
  580. clock_set_target_val(ECSPI4_CLK_ROOT, target);
  581. /* enable the clock gate */
  582. clock_enable(CCGR_ECSPI1, 1);
  583. clock_enable(CCGR_ECSPI2, 1);
  584. clock_enable(CCGR_ECSPI3, 1);
  585. clock_enable(CCGR_ECSPI4, 1);
  586. }
  587. static void init_clk_wdog(void)
  588. {
  589. u32 target;
  590. /* disable the clock gate first */
  591. clock_enable(CCGR_WDOG1, 0);
  592. clock_enable(CCGR_WDOG2, 0);
  593. clock_enable(CCGR_WDOG3, 0);
  594. clock_enable(CCGR_WDOG4, 0);
  595. /* 24Mhz */
  596. target = CLK_ROOT_ON | WDOG_CLK_ROOT_FROM_OSC_24M_CLK |
  597. CLK_ROOT_PRE_DIV(CLK_ROOT_PRE_DIV1) |
  598. CLK_ROOT_POST_DIV(CLK_ROOT_POST_DIV1);
  599. clock_set_target_val(WDOG_CLK_ROOT, target);
  600. /* enable the clock gate */
  601. clock_enable(CCGR_WDOG1, 1);
  602. clock_enable(CCGR_WDOG2, 1);
  603. clock_enable(CCGR_WDOG3, 1);
  604. clock_enable(CCGR_WDOG4, 1);
  605. }
  606. #ifdef CONFIG_MXC_EPDC
  607. static void init_clk_epdc(void)
  608. {
  609. u32 target;
  610. /* disable the clock gate first */
  611. clock_enable(CCGR_EPDC, 0);
  612. /* 24Mhz */
  613. target = CLK_ROOT_ON | EPDC_PIXEL_CLK_ROOT_FROM_PLL_SYS_MAIN_480M_CLK |
  614. CLK_ROOT_PRE_DIV(CLK_ROOT_PRE_DIV1) |
  615. CLK_ROOT_POST_DIV(CLK_ROOT_POST_DIV12);
  616. clock_set_target_val(EPDC_PIXEL_CLK_ROOT, target);
  617. /* enable the clock gate */
  618. clock_enable(CCGR_EPDC, 1);
  619. }
  620. #endif
  621. static int enable_pll_enet(void)
  622. {
  623. u32 reg;
  624. s32 timeout = 100000;
  625. reg = readl(&ccm_anatop->pll_enet);
  626. /* If pll_enet powered up, no need to set it again */
  627. if (reg & ANADIG_PLL_ENET_PWDN_MASK) {
  628. reg &= ~ANADIG_PLL_ENET_PWDN_MASK;
  629. writel(reg, &ccm_anatop->pll_enet);
  630. while (timeout--) {
  631. if (readl(&ccm_anatop->pll_enet) & ANADIG_PLL_LOCK)
  632. break;
  633. }
  634. if (timeout <= 0) {
  635. /* If timeout, we set pwdn for pll_enet. */
  636. reg |= ANADIG_PLL_ENET_PWDN_MASK;
  637. return -ETIME;
  638. }
  639. }
  640. /* Clear bypass */
  641. writel(CCM_ANALOG_PLL_ENET_BYPASS_MASK, &ccm_anatop->pll_enet_clr);
  642. writel((CCM_ANALOG_PLL_ENET_ENABLE_CLK_500MHZ_MASK
  643. | CCM_ANALOG_PLL_ENET_ENABLE_CLK_250MHZ_MASK
  644. | CCM_ANALOG_PLL_ENET_ENABLE_CLK_125MHZ_MASK
  645. | CCM_ANALOG_PLL_ENET_ENABLE_CLK_100MHZ_MASK
  646. | CCM_ANALOG_PLL_ENET_ENABLE_CLK_50MHZ_MASK
  647. | CCM_ANALOG_PLL_ENET_ENABLE_CLK_40MHZ_MASK
  648. | CCM_ANALOG_PLL_ENET_ENABLE_CLK_25MHZ_MASK),
  649. &ccm_anatop->pll_enet_set);
  650. return 0;
  651. }
  652. static int enable_pll_video(u32 pll_div, u32 pll_num, u32 pll_denom,
  653. u32 post_div)
  654. {
  655. u32 reg = 0;
  656. ulong start;
  657. debug("pll5 div = %d, num = %d, denom = %d\n",
  658. pll_div, pll_num, pll_denom);
  659. /* Power up PLL5 video and disable its output */
  660. writel(CCM_ANALOG_PLL_VIDEO_CLR_ENABLE_CLK_MASK |
  661. CCM_ANALOG_PLL_VIDEO_CLR_POWERDOWN_MASK |
  662. CCM_ANALOG_PLL_VIDEO_CLR_BYPASS_MASK |
  663. CCM_ANALOG_PLL_VIDEO_CLR_DIV_SELECT_MASK |
  664. CCM_ANALOG_PLL_VIDEO_CLR_POST_DIV_SEL_MASK |
  665. CCM_ANALOG_PLL_VIDEO_CLR_TEST_DIV_SELECT_MASK,
  666. &ccm_anatop->pll_video_clr);
  667. /* Set div, num and denom */
  668. switch (post_div) {
  669. case 1:
  670. writel(CCM_ANALOG_PLL_VIDEO_SET_DIV_SELECT(pll_div) |
  671. CCM_ANALOG_PLL_VIDEO_SET_TEST_DIV_SELECT(0x1) |
  672. CCM_ANALOG_PLL_VIDEO_SET_POST_DIV_SEL(0x0),
  673. &ccm_anatop->pll_video_set);
  674. break;
  675. case 2:
  676. writel(CCM_ANALOG_PLL_VIDEO_SET_DIV_SELECT(pll_div) |
  677. CCM_ANALOG_PLL_VIDEO_SET_TEST_DIV_SELECT(0x0) |
  678. CCM_ANALOG_PLL_VIDEO_SET_POST_DIV_SEL(0x0),
  679. &ccm_anatop->pll_video_set);
  680. break;
  681. case 3:
  682. writel(CCM_ANALOG_PLL_VIDEO_SET_DIV_SELECT(pll_div) |
  683. CCM_ANALOG_PLL_VIDEO_SET_TEST_DIV_SELECT(0x0) |
  684. CCM_ANALOG_PLL_VIDEO_SET_POST_DIV_SEL(0x1),
  685. &ccm_anatop->pll_video_set);
  686. break;
  687. case 4:
  688. writel(CCM_ANALOG_PLL_VIDEO_SET_DIV_SELECT(pll_div) |
  689. CCM_ANALOG_PLL_VIDEO_SET_TEST_DIV_SELECT(0x0) |
  690. CCM_ANALOG_PLL_VIDEO_SET_POST_DIV_SEL(0x3),
  691. &ccm_anatop->pll_video_set);
  692. break;
  693. case 0:
  694. default:
  695. writel(CCM_ANALOG_PLL_VIDEO_SET_DIV_SELECT(pll_div) |
  696. CCM_ANALOG_PLL_VIDEO_SET_TEST_DIV_SELECT(0x2) |
  697. CCM_ANALOG_PLL_VIDEO_SET_POST_DIV_SEL(0x0),
  698. &ccm_anatop->pll_video_set);
  699. break;
  700. }
  701. writel(CCM_ANALOG_PLL_VIDEO_NUM_A(pll_num),
  702. &ccm_anatop->pll_video_num);
  703. writel(CCM_ANALOG_PLL_VIDEO_DENOM_B(pll_denom),
  704. &ccm_anatop->pll_video_denom);
  705. /* Wait PLL5 lock */
  706. start = get_timer(0); /* Get current timestamp */
  707. do {
  708. reg = readl(&ccm_anatop->pll_video);
  709. if (reg & CCM_ANALOG_PLL_VIDEO_LOCK_MASK) {
  710. /* Enable PLL out */
  711. writel(CCM_ANALOG_PLL_VIDEO_CLR_ENABLE_CLK_MASK,
  712. &ccm_anatop->pll_video_set);
  713. return 0;
  714. }
  715. } while (get_timer(0) < (start + 10)); /* Wait 10ms */
  716. printf("Lock PLL5 timeout\n");
  717. return 1;
  718. }
  719. int set_clk_qspi(void)
  720. {
  721. u32 target;
  722. /* disable the clock gate first */
  723. clock_enable(CCGR_QSPI, 0);
  724. /* 49M: 392/2/4 */
  725. target = CLK_ROOT_ON | QSPI_CLK_ROOT_FROM_PLL_SYS_PFD4_CLK |
  726. CLK_ROOT_PRE_DIV(CLK_ROOT_PRE_DIV1) |
  727. CLK_ROOT_POST_DIV(CLK_ROOT_POST_DIV2);
  728. clock_set_target_val(QSPI_CLK_ROOT, target);
  729. /* enable the clock gate */
  730. clock_enable(CCGR_QSPI, 1);
  731. return 0;
  732. }
  733. int set_clk_nand(void)
  734. {
  735. u32 target;
  736. /* disable the clock gate first */
  737. clock_enable(CCGR_RAWNAND, 0);
  738. enable_pll_enet();
  739. /* 100: 500/5 */
  740. target = CLK_ROOT_ON | NAND_CLK_ROOT_FROM_PLL_ENET_MAIN_500M_CLK |
  741. CLK_ROOT_PRE_DIV(CLK_ROOT_PRE_DIV1) |
  742. CLK_ROOT_POST_DIV(CLK_ROOT_POST_DIV5);
  743. clock_set_target_val(NAND_CLK_ROOT, target);
  744. /* enable the clock gate */
  745. clock_enable(CCGR_RAWNAND, 1);
  746. return 0;
  747. }
  748. void mxs_set_lcdclk(uint32_t base_addr, uint32_t freq)
  749. {
  750. u32 hck = MXC_HCLK/1000;
  751. u32 min = hck * 27;
  752. u32 max = hck * 54;
  753. u32 temp, best = 0;
  754. u32 i, j, pred = 1, postd = 1;
  755. u32 pll_div, pll_num, pll_denom, post_div = 0;
  756. u32 target;
  757. debug("mxs_set_lcdclk, freq = %d\n", freq);
  758. clock_enable(CCGR_LCDIF, 0);
  759. temp = (freq * 8 * 8);
  760. if (temp < min) {
  761. for (i = 1; i <= 4; i++) {
  762. if ((temp * (1 << i)) > min) {
  763. post_div = i;
  764. freq = (freq * (1 << i));
  765. break;
  766. }
  767. }
  768. if (5 == i) {
  769. printf("Fail to set rate to %dkhz", freq);
  770. return;
  771. }
  772. }
  773. for (i = 1; i <= 8; i++) {
  774. for (j = 1; j <= 8; j++) {
  775. temp = freq * i * j;
  776. if (temp > max || temp < min)
  777. continue;
  778. if (best == 0 || temp < best) {
  779. best = temp;
  780. pred = i;
  781. postd = j;
  782. }
  783. }
  784. }
  785. if (best == 0) {
  786. printf("Fail to set rate to %dkhz", freq);
  787. return;
  788. }
  789. debug("best %d, pred = %d, postd = %d\n", best, pred, postd);
  790. pll_div = best / hck;
  791. pll_denom = 1000000;
  792. pll_num = (best - hck * pll_div) * pll_denom / hck;
  793. if (enable_pll_video(pll_div, pll_num, pll_denom, post_div))
  794. return;
  795. target = CLK_ROOT_ON | LCDIF_PIXEL_CLK_ROOT_FROM_PLL_VIDEO_MAIN_CLK |
  796. CLK_ROOT_PRE_DIV((pred - 1)) | CLK_ROOT_POST_DIV((postd - 1));
  797. clock_set_target_val(LCDIF_PIXEL_CLK_ROOT, target);
  798. clock_enable(CCGR_LCDIF, 1);
  799. }
  800. #ifdef CONFIG_FEC_MXC
  801. int set_clk_enet(enum enet_freq type)
  802. {
  803. u32 target;
  804. int ret;
  805. u32 enet1_ref, enet2_ref;
  806. /* disable the clock first */
  807. clock_enable(CCGR_ENET1, 0);
  808. clock_enable(CCGR_ENET2, 0);
  809. switch (type) {
  810. case ENET_125MHz:
  811. enet1_ref = ENET1_REF_CLK_ROOT_FROM_PLL_ENET_MAIN_125M_CLK;
  812. enet2_ref = ENET2_REF_CLK_ROOT_FROM_PLL_ENET_MAIN_125M_CLK;
  813. break;
  814. case ENET_50MHz:
  815. enet1_ref = ENET1_REF_CLK_ROOT_FROM_PLL_ENET_MAIN_50M_CLK;
  816. enet2_ref = ENET2_REF_CLK_ROOT_FROM_PLL_ENET_MAIN_50M_CLK;
  817. break;
  818. case ENET_25MHz:
  819. enet1_ref = ENET1_REF_CLK_ROOT_FROM_PLL_ENET_MAIN_25M_CLK;
  820. enet2_ref = ENET2_REF_CLK_ROOT_FROM_PLL_ENET_MAIN_25M_CLK;
  821. break;
  822. default:
  823. return -EINVAL;
  824. }
  825. ret = enable_pll_enet();
  826. if (ret != 0)
  827. return ret;
  828. /* set enet axi clock 196M: 392/2 */
  829. target = CLK_ROOT_ON | ENET_AXI_CLK_ROOT_FROM_PLL_SYS_PFD4_CLK |
  830. CLK_ROOT_PRE_DIV(CLK_ROOT_PRE_DIV1) |
  831. CLK_ROOT_POST_DIV(CLK_ROOT_POST_DIV2);
  832. clock_set_target_val(ENET_AXI_CLK_ROOT, target);
  833. target = CLK_ROOT_ON | enet1_ref |
  834. CLK_ROOT_PRE_DIV(CLK_ROOT_PRE_DIV1) |
  835. CLK_ROOT_POST_DIV(CLK_ROOT_POST_DIV1);
  836. clock_set_target_val(ENET1_REF_CLK_ROOT, target);
  837. target = CLK_ROOT_ON | ENET1_TIME_CLK_ROOT_FROM_PLL_ENET_MAIN_100M_CLK |
  838. CLK_ROOT_PRE_DIV(CLK_ROOT_PRE_DIV1) |
  839. CLK_ROOT_POST_DIV(CLK_ROOT_POST_DIV4);
  840. clock_set_target_val(ENET1_TIME_CLK_ROOT, target);
  841. target = CLK_ROOT_ON | enet2_ref |
  842. CLK_ROOT_PRE_DIV(CLK_ROOT_PRE_DIV1) |
  843. CLK_ROOT_POST_DIV(CLK_ROOT_POST_DIV1);
  844. clock_set_target_val(ENET2_REF_CLK_ROOT, target);
  845. target = CLK_ROOT_ON | ENET2_TIME_CLK_ROOT_FROM_PLL_ENET_MAIN_100M_CLK |
  846. CLK_ROOT_PRE_DIV(CLK_ROOT_PRE_DIV1) |
  847. CLK_ROOT_POST_DIV(CLK_ROOT_POST_DIV4);
  848. clock_set_target_val(ENET2_TIME_CLK_ROOT, target);
  849. #ifdef CONFIG_FEC_MXC_25M_REF_CLK
  850. target = CLK_ROOT_ON |
  851. ENET_PHY_REF_CLK_ROOT_FROM_PLL_ENET_MAIN_25M_CLK |
  852. CLK_ROOT_PRE_DIV(CLK_ROOT_PRE_DIV1) |
  853. CLK_ROOT_POST_DIV(CLK_ROOT_POST_DIV1);
  854. clock_set_target_val(ENET_PHY_REF_CLK_ROOT, target);
  855. #endif
  856. /* enable clock */
  857. clock_enable(CCGR_ENET1, 1);
  858. clock_enable(CCGR_ENET2, 1);
  859. return 0;
  860. }
  861. #endif
  862. /* Configure PLL/PFD freq */
  863. void clock_init(void)
  864. {
  865. /* Rom has enabled PLL_ARM, PLL_DDR, PLL_SYS, PLL_ENET
  866. * In u-boot, we have to:
  867. * 1. Configure PFD3- PFD7 for freq we needed in u-boot
  868. * 2. Set clock root for peripherals (ip channel) used in u-boot but without set rate
  869. * interface. The clocks for these peripherals are enabled after this intialization.
  870. * 3. Other peripherals with set clock rate interface does not be set in this function.
  871. */
  872. u32 reg;
  873. /*
  874. * Configure PFD4 to 392M
  875. * 480M * 18 / 0x16 = 392M
  876. */
  877. reg = readl(&ccm_anatop->pfd_480b);
  878. reg &= ~(ANATOP_PFD480B_PFD4_FRAC_MASK |
  879. CCM_ANALOG_PFD_480B_PFD4_DIV1_CLKGATE_MASK);
  880. reg |= ANATOP_PFD480B_PFD4_FRAC_392M_VAL;
  881. writel(reg, &ccm_anatop->pfd_480b);
  882. init_clk_esdhc();
  883. init_clk_uart();
  884. init_clk_weim();
  885. init_clk_ecspi();
  886. init_clk_wdog();
  887. #ifdef CONFIG_MXC_EPDC
  888. init_clk_epdc();
  889. #endif
  890. enable_usboh3_clk(1);
  891. clock_enable(CCGR_SNVS, 1);
  892. #ifdef CONFIG_NAND_MXS
  893. clock_enable(CCGR_RAWNAND, 1);
  894. #endif
  895. if (IS_ENABLED(CONFIG_IMX_RDC)) {
  896. clock_enable(CCGR_RDC, 1);
  897. clock_enable(CCGR_SEMA1, 1);
  898. clock_enable(CCGR_SEMA2, 1);
  899. }
  900. }
  901. #ifdef CONFIG_SECURE_BOOT
  902. void hab_caam_clock_enable(unsigned char enable)
  903. {
  904. if (enable)
  905. clock_enable(CCGR_CAAM, 1);
  906. else
  907. clock_enable(CCGR_CAAM, 0);
  908. }
  909. #endif
  910. #ifdef CONFIG_MXC_EPDC
  911. void epdc_clock_enable(void)
  912. {
  913. clock_enable(CCGR_EPDC, 1);
  914. }
  915. void epdc_clock_disable(void)
  916. {
  917. clock_enable(CCGR_EPDC, 0);
  918. }
  919. #endif
  920. /*
  921. * Dump some core clockes.
  922. */
  923. int do_mx7_showclocks(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
  924. {
  925. u32 freq;
  926. freq = decode_pll(PLL_CORE, MXC_HCLK);
  927. printf("PLL_CORE %8d MHz\n", freq / 1000000);
  928. freq = decode_pll(PLL_SYS, MXC_HCLK);
  929. printf("PLL_SYS %8d MHz\n", freq / 1000000);
  930. freq = decode_pll(PLL_ENET, MXC_HCLK);
  931. printf("PLL_NET %8d MHz\n", freq / 1000000);
  932. printf("\n");
  933. printf("IPG %8d kHz\n", mxc_get_clock(MXC_IPG_CLK) / 1000);
  934. printf("UART %8d kHz\n", mxc_get_clock(MXC_UART_CLK) / 1000);
  935. #ifdef CONFIG_MXC_SPI
  936. printf("CSPI %8d kHz\n", mxc_get_clock(MXC_CSPI_CLK) / 1000);
  937. #endif
  938. printf("AHB %8d kHz\n", mxc_get_clock(MXC_AHB_CLK) / 1000);
  939. printf("AXI %8d kHz\n", mxc_get_clock(MXC_AXI_CLK) / 1000);
  940. printf("DDR %8d kHz\n", mxc_get_clock(MXC_DDR_CLK) / 1000);
  941. printf("USDHC1 %8d kHz\n", mxc_get_clock(MXC_ESDHC_CLK) / 1000);
  942. printf("USDHC2 %8d kHz\n", mxc_get_clock(MXC_ESDHC2_CLK) / 1000);
  943. printf("USDHC3 %8d kHz\n", mxc_get_clock(MXC_ESDHC3_CLK) / 1000);
  944. return 0;
  945. }
  946. U_BOOT_CMD(
  947. clocks, CONFIG_SYS_MAXARGS, 1, do_mx7_showclocks,
  948. "display clocks",
  949. ""
  950. );