clock.c 22 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915
  1. /*
  2. * Copyright (C) 2010-2011 Freescale Semiconductor, Inc.
  3. *
  4. * SPDX-License-Identifier: GPL-2.0+
  5. */
  6. #include <common.h>
  7. #include <div64.h>
  8. #include <asm/io.h>
  9. #include <asm/errno.h>
  10. #include <asm/arch/imx-regs.h>
  11. #include <asm/arch/crm_regs.h>
  12. #include <asm/arch/clock.h>
  13. #include <asm/arch/sys_proto.h>
  14. enum pll_clocks {
  15. PLL_SYS, /* System PLL */
  16. PLL_BUS, /* System Bus PLL*/
  17. PLL_USBOTG, /* OTG USB PLL */
  18. PLL_ENET, /* ENET PLL */
  19. };
  20. struct mxc_ccm_reg *imx_ccm = (struct mxc_ccm_reg *)CCM_BASE_ADDR;
  21. #ifdef CONFIG_MXC_OCOTP
  22. void enable_ocotp_clk(unsigned char enable)
  23. {
  24. u32 reg;
  25. reg = __raw_readl(&imx_ccm->CCGR2);
  26. if (enable)
  27. reg |= MXC_CCM_CCGR2_OCOTP_CTRL_MASK;
  28. else
  29. reg &= ~MXC_CCM_CCGR2_OCOTP_CTRL_MASK;
  30. __raw_writel(reg, &imx_ccm->CCGR2);
  31. }
  32. #endif
  33. #ifdef CONFIG_NAND_MXS
  34. void setup_gpmi_io_clk(u32 cfg)
  35. {
  36. /* Disable clocks per ERR007177 from MX6 errata */
  37. clrbits_le32(&imx_ccm->CCGR4,
  38. MXC_CCM_CCGR4_RAWNAND_U_BCH_INPUT_APB_MASK |
  39. MXC_CCM_CCGR4_RAWNAND_U_GPMI_BCH_INPUT_BCH_MASK |
  40. MXC_CCM_CCGR4_RAWNAND_U_GPMI_BCH_INPUT_GPMI_IO_MASK |
  41. MXC_CCM_CCGR4_RAWNAND_U_GPMI_INPUT_APB_MASK |
  42. MXC_CCM_CCGR4_PL301_MX6QPER1_BCH_MASK);
  43. clrbits_le32(&imx_ccm->CCGR2, MXC_CCM_CCGR2_IOMUX_IPT_CLK_IO_MASK);
  44. clrsetbits_le32(&imx_ccm->cs2cdr,
  45. MXC_CCM_CS2CDR_ENFC_CLK_PODF_MASK |
  46. MXC_CCM_CS2CDR_ENFC_CLK_PRED_MASK |
  47. MXC_CCM_CS2CDR_ENFC_CLK_SEL_MASK,
  48. cfg);
  49. setbits_le32(&imx_ccm->CCGR2, MXC_CCM_CCGR2_IOMUX_IPT_CLK_IO_MASK);
  50. setbits_le32(&imx_ccm->CCGR4,
  51. MXC_CCM_CCGR4_RAWNAND_U_BCH_INPUT_APB_MASK |
  52. MXC_CCM_CCGR4_RAWNAND_U_GPMI_BCH_INPUT_BCH_MASK |
  53. MXC_CCM_CCGR4_RAWNAND_U_GPMI_BCH_INPUT_GPMI_IO_MASK |
  54. MXC_CCM_CCGR4_RAWNAND_U_GPMI_INPUT_APB_MASK |
  55. MXC_CCM_CCGR4_PL301_MX6QPER1_BCH_MASK);
  56. }
  57. #endif
  58. void enable_usboh3_clk(unsigned char enable)
  59. {
  60. u32 reg;
  61. reg = __raw_readl(&imx_ccm->CCGR6);
  62. if (enable)
  63. reg |= MXC_CCM_CCGR6_USBOH3_MASK;
  64. else
  65. reg &= ~(MXC_CCM_CCGR6_USBOH3_MASK);
  66. __raw_writel(reg, &imx_ccm->CCGR6);
  67. }
  68. #if defined(CONFIG_FEC_MXC) && !defined(CONFIG_MX6SX)
  69. void enable_enet_clk(unsigned char enable)
  70. {
  71. u32 mask, *addr;
  72. if (is_cpu_type(MXC_CPU_MX6UL)) {
  73. mask = MXC_CCM_CCGR3_ENET_MASK;
  74. addr = &imx_ccm->CCGR3;
  75. } else {
  76. mask = MXC_CCM_CCGR1_ENET_MASK;
  77. addr = &imx_ccm->CCGR1;
  78. }
  79. if (enable)
  80. setbits_le32(addr, mask);
  81. else
  82. clrbits_le32(addr, mask);
  83. }
  84. #endif
  85. #ifdef CONFIG_MXC_UART
  86. void enable_uart_clk(unsigned char enable)
  87. {
  88. u32 mask;
  89. if (is_cpu_type(MXC_CPU_MX6UL))
  90. mask = MXC_CCM_CCGR5_UART_MASK;
  91. else
  92. mask = MXC_CCM_CCGR5_UART_MASK | MXC_CCM_CCGR5_UART_SERIAL_MASK;
  93. if (enable)
  94. setbits_le32(&imx_ccm->CCGR5, mask);
  95. else
  96. clrbits_le32(&imx_ccm->CCGR5, mask);
  97. }
  98. #endif
  99. #ifdef CONFIG_MMC
  100. int enable_usdhc_clk(unsigned char enable, unsigned bus_num)
  101. {
  102. u32 mask;
  103. if (bus_num > 3)
  104. return -EINVAL;
  105. mask = MXC_CCM_CCGR_CG_MASK << (bus_num * 2 + 2);
  106. if (enable)
  107. setbits_le32(&imx_ccm->CCGR6, mask);
  108. else
  109. clrbits_le32(&imx_ccm->CCGR6, mask);
  110. return 0;
  111. }
  112. #endif
  113. #ifdef CONFIG_SYS_I2C_MXC
  114. /* i2c_num can be from 0 - 3 */
  115. int enable_i2c_clk(unsigned char enable, unsigned i2c_num)
  116. {
  117. u32 reg;
  118. u32 mask;
  119. u32 *addr;
  120. if (i2c_num > 3)
  121. return -EINVAL;
  122. if (i2c_num < 3) {
  123. mask = MXC_CCM_CCGR_CG_MASK
  124. << (MXC_CCM_CCGR2_I2C1_SERIAL_OFFSET
  125. + (i2c_num << 1));
  126. reg = __raw_readl(&imx_ccm->CCGR2);
  127. if (enable)
  128. reg |= mask;
  129. else
  130. reg &= ~mask;
  131. __raw_writel(reg, &imx_ccm->CCGR2);
  132. } else {
  133. if (is_cpu_type(MXC_CPU_MX6SX) || is_cpu_type(MXC_CPU_MX6UL)) {
  134. mask = MXC_CCM_CCGR6_I2C4_MASK;
  135. addr = &imx_ccm->CCGR6;
  136. } else {
  137. mask = MXC_CCM_CCGR1_I2C4_SERIAL_MASK;
  138. addr = &imx_ccm->CCGR1;
  139. }
  140. reg = __raw_readl(addr);
  141. if (enable)
  142. reg |= mask;
  143. else
  144. reg &= ~mask;
  145. __raw_writel(reg, addr);
  146. }
  147. return 0;
  148. }
  149. #endif
  150. /* spi_num can be from 0 - SPI_MAX_NUM */
  151. int enable_spi_clk(unsigned char enable, unsigned spi_num)
  152. {
  153. u32 reg;
  154. u32 mask;
  155. if (spi_num > SPI_MAX_NUM)
  156. return -EINVAL;
  157. mask = MXC_CCM_CCGR_CG_MASK << (spi_num << 1);
  158. reg = __raw_readl(&imx_ccm->CCGR1);
  159. if (enable)
  160. reg |= mask;
  161. else
  162. reg &= ~mask;
  163. __raw_writel(reg, &imx_ccm->CCGR1);
  164. return 0;
  165. }
  166. static u32 decode_pll(enum pll_clocks pll, u32 infreq)
  167. {
  168. u32 div;
  169. switch (pll) {
  170. case PLL_SYS:
  171. div = __raw_readl(&imx_ccm->analog_pll_sys);
  172. div &= BM_ANADIG_PLL_SYS_DIV_SELECT;
  173. return (infreq * div) >> 1;
  174. case PLL_BUS:
  175. div = __raw_readl(&imx_ccm->analog_pll_528);
  176. div &= BM_ANADIG_PLL_528_DIV_SELECT;
  177. return infreq * (20 + (div << 1));
  178. case PLL_USBOTG:
  179. div = __raw_readl(&imx_ccm->analog_usb1_pll_480_ctrl);
  180. div &= BM_ANADIG_USB1_PLL_480_CTRL_DIV_SELECT;
  181. return infreq * (20 + (div << 1));
  182. case PLL_ENET:
  183. div = __raw_readl(&imx_ccm->analog_pll_enet);
  184. div &= BM_ANADIG_PLL_ENET_DIV_SELECT;
  185. return 25000000 * (div + (div >> 1) + 1);
  186. default:
  187. return 0;
  188. }
  189. /* NOTREACHED */
  190. }
  191. static u32 mxc_get_pll_pfd(enum pll_clocks pll, int pfd_num)
  192. {
  193. u32 div;
  194. u64 freq;
  195. switch (pll) {
  196. case PLL_BUS:
  197. if (!is_cpu_type(MXC_CPU_MX6UL)) {
  198. if (pfd_num == 3) {
  199. /* No PFD3 on PPL2 */
  200. return 0;
  201. }
  202. }
  203. div = __raw_readl(&imx_ccm->analog_pfd_528);
  204. freq = (u64)decode_pll(PLL_BUS, MXC_HCLK);
  205. break;
  206. case PLL_USBOTG:
  207. div = __raw_readl(&imx_ccm->analog_pfd_480);
  208. freq = (u64)decode_pll(PLL_USBOTG, MXC_HCLK);
  209. break;
  210. default:
  211. /* No PFD on other PLL */
  212. return 0;
  213. }
  214. return lldiv(freq * 18, (div & ANATOP_PFD_FRAC_MASK(pfd_num)) >>
  215. ANATOP_PFD_FRAC_SHIFT(pfd_num));
  216. }
  217. static u32 get_mcu_main_clk(void)
  218. {
  219. u32 reg, freq;
  220. reg = __raw_readl(&imx_ccm->cacrr);
  221. reg &= MXC_CCM_CACRR_ARM_PODF_MASK;
  222. reg >>= MXC_CCM_CACRR_ARM_PODF_OFFSET;
  223. freq = decode_pll(PLL_SYS, MXC_HCLK);
  224. return freq / (reg + 1);
  225. }
  226. u32 get_periph_clk(void)
  227. {
  228. u32 reg, div = 0, freq = 0;
  229. reg = __raw_readl(&imx_ccm->cbcdr);
  230. if (reg & MXC_CCM_CBCDR_PERIPH_CLK_SEL) {
  231. div = (reg & MXC_CCM_CBCDR_PERIPH_CLK2_PODF_MASK) >>
  232. MXC_CCM_CBCDR_PERIPH_CLK2_PODF_OFFSET;
  233. reg = __raw_readl(&imx_ccm->cbcmr);
  234. reg &= MXC_CCM_CBCMR_PERIPH_CLK2_SEL_MASK;
  235. reg >>= MXC_CCM_CBCMR_PERIPH_CLK2_SEL_OFFSET;
  236. switch (reg) {
  237. case 0:
  238. freq = decode_pll(PLL_USBOTG, MXC_HCLK);
  239. break;
  240. case 1:
  241. case 2:
  242. freq = MXC_HCLK;
  243. break;
  244. default:
  245. break;
  246. }
  247. } else {
  248. reg = __raw_readl(&imx_ccm->cbcmr);
  249. reg &= MXC_CCM_CBCMR_PRE_PERIPH_CLK_SEL_MASK;
  250. reg >>= MXC_CCM_CBCMR_PRE_PERIPH_CLK_SEL_OFFSET;
  251. switch (reg) {
  252. case 0:
  253. freq = decode_pll(PLL_BUS, MXC_HCLK);
  254. break;
  255. case 1:
  256. freq = mxc_get_pll_pfd(PLL_BUS, 2);
  257. break;
  258. case 2:
  259. freq = mxc_get_pll_pfd(PLL_BUS, 0);
  260. break;
  261. case 3:
  262. /* static / 2 divider */
  263. freq = mxc_get_pll_pfd(PLL_BUS, 2) / 2;
  264. break;
  265. default:
  266. break;
  267. }
  268. }
  269. return freq / (div + 1);
  270. }
  271. static u32 get_ipg_clk(void)
  272. {
  273. u32 reg, ipg_podf;
  274. reg = __raw_readl(&imx_ccm->cbcdr);
  275. reg &= MXC_CCM_CBCDR_IPG_PODF_MASK;
  276. ipg_podf = reg >> MXC_CCM_CBCDR_IPG_PODF_OFFSET;
  277. return get_ahb_clk() / (ipg_podf + 1);
  278. }
  279. static u32 get_ipg_per_clk(void)
  280. {
  281. u32 reg, perclk_podf;
  282. reg = __raw_readl(&imx_ccm->cscmr1);
  283. if (is_cpu_type(MXC_CPU_MX6SL) || is_cpu_type(MXC_CPU_MX6SX) ||
  284. is_mx6dqp() || is_cpu_type(MXC_CPU_MX6UL)) {
  285. if (reg & MXC_CCM_CSCMR1_PER_CLK_SEL_MASK)
  286. return MXC_HCLK; /* OSC 24Mhz */
  287. }
  288. perclk_podf = reg & MXC_CCM_CSCMR1_PERCLK_PODF_MASK;
  289. return get_ipg_clk() / (perclk_podf + 1);
  290. }
  291. static u32 get_uart_clk(void)
  292. {
  293. u32 reg, uart_podf;
  294. u32 freq = decode_pll(PLL_USBOTG, MXC_HCLK) / 6; /* static divider */
  295. reg = __raw_readl(&imx_ccm->cscdr1);
  296. if (is_cpu_type(MXC_CPU_MX6SL) || is_cpu_type(MXC_CPU_MX6SX) ||
  297. is_mx6dqp() || is_cpu_type(MXC_CPU_MX6UL)) {
  298. if (reg & MXC_CCM_CSCDR1_UART_CLK_SEL)
  299. freq = MXC_HCLK;
  300. }
  301. reg &= MXC_CCM_CSCDR1_UART_CLK_PODF_MASK;
  302. uart_podf = reg >> MXC_CCM_CSCDR1_UART_CLK_PODF_OFFSET;
  303. return freq / (uart_podf + 1);
  304. }
  305. static u32 get_cspi_clk(void)
  306. {
  307. u32 reg, cspi_podf;
  308. reg = __raw_readl(&imx_ccm->cscdr2);
  309. cspi_podf = (reg & MXC_CCM_CSCDR2_ECSPI_CLK_PODF_MASK) >>
  310. MXC_CCM_CSCDR2_ECSPI_CLK_PODF_OFFSET;
  311. if (is_mx6dqp() || is_cpu_type(MXC_CPU_MX6SL) ||
  312. is_cpu_type(MXC_CPU_MX6SX) || is_cpu_type(MXC_CPU_MX6UL)) {
  313. if (reg & MXC_CCM_CSCDR2_ECSPI_CLK_SEL_MASK)
  314. return MXC_HCLK / (cspi_podf + 1);
  315. }
  316. return decode_pll(PLL_USBOTG, MXC_HCLK) / (8 * (cspi_podf + 1));
  317. }
  318. static u32 get_axi_clk(void)
  319. {
  320. u32 root_freq, axi_podf;
  321. u32 cbcdr = __raw_readl(&imx_ccm->cbcdr);
  322. axi_podf = cbcdr & MXC_CCM_CBCDR_AXI_PODF_MASK;
  323. axi_podf >>= MXC_CCM_CBCDR_AXI_PODF_OFFSET;
  324. if (cbcdr & MXC_CCM_CBCDR_AXI_SEL) {
  325. if (cbcdr & MXC_CCM_CBCDR_AXI_ALT_SEL)
  326. root_freq = mxc_get_pll_pfd(PLL_BUS, 2);
  327. else
  328. root_freq = mxc_get_pll_pfd(PLL_USBOTG, 1);
  329. } else
  330. root_freq = get_periph_clk();
  331. return root_freq / (axi_podf + 1);
  332. }
  333. static u32 get_emi_slow_clk(void)
  334. {
  335. u32 emi_clk_sel, emi_slow_podf, cscmr1, root_freq = 0;
  336. cscmr1 = __raw_readl(&imx_ccm->cscmr1);
  337. emi_clk_sel = cscmr1 & MXC_CCM_CSCMR1_ACLK_EMI_SLOW_MASK;
  338. emi_clk_sel >>= MXC_CCM_CSCMR1_ACLK_EMI_SLOW_OFFSET;
  339. emi_slow_podf = cscmr1 & MXC_CCM_CSCMR1_ACLK_EMI_SLOW_PODF_MASK;
  340. emi_slow_podf >>= MXC_CCM_CSCMR1_ACLK_EMI_SLOW_PODF_OFFSET;
  341. switch (emi_clk_sel) {
  342. case 0:
  343. root_freq = get_axi_clk();
  344. break;
  345. case 1:
  346. root_freq = decode_pll(PLL_USBOTG, MXC_HCLK);
  347. break;
  348. case 2:
  349. root_freq = mxc_get_pll_pfd(PLL_BUS, 2);
  350. break;
  351. case 3:
  352. root_freq = mxc_get_pll_pfd(PLL_BUS, 0);
  353. break;
  354. }
  355. return root_freq / (emi_slow_podf + 1);
  356. }
  357. static u32 get_mmdc_ch0_clk(void)
  358. {
  359. u32 cbcmr = __raw_readl(&imx_ccm->cbcmr);
  360. u32 cbcdr = __raw_readl(&imx_ccm->cbcdr);
  361. u32 freq, podf, per2_clk2_podf;
  362. if (is_cpu_type(MXC_CPU_MX6SX) || is_cpu_type(MXC_CPU_MX6UL) ||
  363. is_cpu_type(MXC_CPU_MX6SL)) {
  364. podf = (cbcdr & MXC_CCM_CBCDR_MMDC_CH1_PODF_MASK) >>
  365. MXC_CCM_CBCDR_MMDC_CH1_PODF_OFFSET;
  366. if (cbcdr & MXC_CCM_CBCDR_PERIPH2_CLK_SEL) {
  367. per2_clk2_podf = (cbcdr & MXC_CCM_CBCDR_PERIPH2_CLK2_PODF_MASK) >>
  368. MXC_CCM_CBCDR_PERIPH2_CLK2_PODF_OFFSET;
  369. if (is_cpu_type(MXC_CPU_MX6SL)) {
  370. if (cbcmr & MXC_CCM_CBCMR_PERIPH2_CLK2_SEL)
  371. freq = MXC_HCLK;
  372. else
  373. freq = decode_pll(PLL_USBOTG, MXC_HCLK);
  374. } else {
  375. if (cbcmr & MXC_CCM_CBCMR_PERIPH2_CLK2_SEL)
  376. freq = decode_pll(PLL_BUS, MXC_HCLK);
  377. else
  378. freq = decode_pll(PLL_USBOTG, MXC_HCLK);
  379. }
  380. } else {
  381. per2_clk2_podf = 0;
  382. switch ((cbcmr &
  383. MXC_CCM_CBCMR_PRE_PERIPH2_CLK_SEL_MASK) >>
  384. MXC_CCM_CBCMR_PRE_PERIPH2_CLK_SEL_OFFSET) {
  385. case 0:
  386. freq = decode_pll(PLL_BUS, MXC_HCLK);
  387. break;
  388. case 1:
  389. freq = mxc_get_pll_pfd(PLL_BUS, 2);
  390. break;
  391. case 2:
  392. freq = mxc_get_pll_pfd(PLL_BUS, 0);
  393. break;
  394. case 3:
  395. /* static / 2 divider */
  396. freq = mxc_get_pll_pfd(PLL_BUS, 2) / 2;
  397. break;
  398. }
  399. }
  400. return freq / (podf + 1) / (per2_clk2_podf + 1);
  401. } else {
  402. podf = (cbcdr & MXC_CCM_CBCDR_MMDC_CH0_PODF_MASK) >>
  403. MXC_CCM_CBCDR_MMDC_CH0_PODF_OFFSET;
  404. return get_periph_clk() / (podf + 1);
  405. }
  406. }
  407. #ifdef CONFIG_FSL_QSPI
  408. /* qspi_num can be from 0 - 1 */
  409. void enable_qspi_clk(int qspi_num)
  410. {
  411. u32 reg = 0;
  412. /* Enable QuadSPI clock */
  413. switch (qspi_num) {
  414. case 0:
  415. /* disable the clock gate */
  416. clrbits_le32(&imx_ccm->CCGR3, MXC_CCM_CCGR3_QSPI1_MASK);
  417. /* set 50M : (50 = 396 / 2 / 4) */
  418. reg = readl(&imx_ccm->cscmr1);
  419. reg &= ~(MXC_CCM_CSCMR1_QSPI1_PODF_MASK |
  420. MXC_CCM_CSCMR1_QSPI1_CLK_SEL_MASK);
  421. reg |= ((1 << MXC_CCM_CSCMR1_QSPI1_PODF_OFFSET) |
  422. (2 << MXC_CCM_CSCMR1_QSPI1_CLK_SEL_OFFSET));
  423. writel(reg, &imx_ccm->cscmr1);
  424. /* enable the clock gate */
  425. setbits_le32(&imx_ccm->CCGR3, MXC_CCM_CCGR3_QSPI1_MASK);
  426. break;
  427. case 1:
  428. /*
  429. * disable the clock gate
  430. * QSPI2 and GPMI_BCH_INPUT_GPMI_IO share the same clock gate,
  431. * disable both of them.
  432. */
  433. clrbits_le32(&imx_ccm->CCGR4, MXC_CCM_CCGR4_QSPI2_ENFC_MASK |
  434. MXC_CCM_CCGR4_RAWNAND_U_GPMI_BCH_INPUT_GPMI_IO_MASK);
  435. /* set 50M : (50 = 396 / 2 / 4) */
  436. reg = readl(&imx_ccm->cs2cdr);
  437. reg &= ~(MXC_CCM_CS2CDR_QSPI2_CLK_PODF_MASK |
  438. MXC_CCM_CS2CDR_QSPI2_CLK_PRED_MASK |
  439. MXC_CCM_CS2CDR_QSPI2_CLK_SEL_MASK);
  440. reg |= (MXC_CCM_CS2CDR_QSPI2_CLK_PRED(0x1) |
  441. MXC_CCM_CS2CDR_QSPI2_CLK_SEL(0x3));
  442. writel(reg, &imx_ccm->cs2cdr);
  443. /*enable the clock gate*/
  444. setbits_le32(&imx_ccm->CCGR4, MXC_CCM_CCGR4_QSPI2_ENFC_MASK |
  445. MXC_CCM_CCGR4_RAWNAND_U_GPMI_BCH_INPUT_GPMI_IO_MASK);
  446. break;
  447. default:
  448. break;
  449. }
  450. }
  451. #endif
  452. #ifdef CONFIG_FEC_MXC
  453. int enable_fec_anatop_clock(int fec_id, enum enet_freq freq)
  454. {
  455. u32 reg = 0;
  456. s32 timeout = 100000;
  457. struct anatop_regs __iomem *anatop =
  458. (struct anatop_regs __iomem *)ANATOP_BASE_ADDR;
  459. if (freq < ENET_25MHZ || freq > ENET_125MHZ)
  460. return -EINVAL;
  461. if (fec_id == 0) {
  462. reg &= ~BM_ANADIG_PLL_ENET_DIV_SELECT;
  463. reg |= BF_ANADIG_PLL_ENET_DIV_SELECT(freq);
  464. } else if (fec_id == 1) {
  465. /* Only i.MX6SX/UL support ENET2 */
  466. if (!(is_cpu_type(MXC_CPU_MX6SX) ||
  467. is_cpu_type(MXC_CPU_MX6UL)))
  468. return -EINVAL;
  469. reg &= ~BM_ANADIG_PLL_ENET2_DIV_SELECT;
  470. reg |= BF_ANADIG_PLL_ENET2_DIV_SELECT(freq);
  471. } else {
  472. return -EINVAL;
  473. }
  474. if ((reg & BM_ANADIG_PLL_ENET_POWERDOWN) ||
  475. (!(reg & BM_ANADIG_PLL_ENET_LOCK))) {
  476. reg &= ~BM_ANADIG_PLL_ENET_POWERDOWN;
  477. writel(reg, &anatop->pll_enet);
  478. while (timeout--) {
  479. if (readl(&anatop->pll_enet) & BM_ANADIG_PLL_ENET_LOCK)
  480. break;
  481. }
  482. if (timeout < 0)
  483. return -ETIMEDOUT;
  484. }
  485. /* Enable FEC clock */
  486. if (fec_id == 0)
  487. reg |= BM_ANADIG_PLL_ENET_ENABLE;
  488. else
  489. reg |= BM_ANADIG_PLL_ENET2_ENABLE;
  490. reg &= ~BM_ANADIG_PLL_ENET_BYPASS;
  491. writel(reg, &anatop->pll_enet);
  492. #ifdef CONFIG_MX6SX
  493. /*
  494. * Set enet ahb clock to 200MHz
  495. * pll2_pfd2_396m-> ENET_PODF-> ENET_AHB
  496. */
  497. reg = readl(&imx_ccm->chsccdr);
  498. reg &= ~(MXC_CCM_CHSCCDR_ENET_PRE_CLK_SEL_MASK
  499. | MXC_CCM_CHSCCDR_ENET_PODF_MASK
  500. | MXC_CCM_CHSCCDR_ENET_CLK_SEL_MASK);
  501. /* PLL2 PFD2 */
  502. reg |= (4 << MXC_CCM_CHSCCDR_ENET_PRE_CLK_SEL_OFFSET);
  503. /* Div = 2*/
  504. reg |= (1 << MXC_CCM_CHSCCDR_ENET_PODF_OFFSET);
  505. reg |= (0 << MXC_CCM_CHSCCDR_ENET_CLK_SEL_OFFSET);
  506. writel(reg, &imx_ccm->chsccdr);
  507. /* Enable enet system clock */
  508. reg = readl(&imx_ccm->CCGR3);
  509. reg |= MXC_CCM_CCGR3_ENET_MASK;
  510. writel(reg, &imx_ccm->CCGR3);
  511. #endif
  512. return 0;
  513. }
  514. #endif
  515. static u32 get_usdhc_clk(u32 port)
  516. {
  517. u32 root_freq = 0, usdhc_podf = 0, clk_sel = 0;
  518. u32 cscmr1 = __raw_readl(&imx_ccm->cscmr1);
  519. u32 cscdr1 = __raw_readl(&imx_ccm->cscdr1);
  520. switch (port) {
  521. case 0:
  522. usdhc_podf = (cscdr1 & MXC_CCM_CSCDR1_USDHC1_PODF_MASK) >>
  523. MXC_CCM_CSCDR1_USDHC1_PODF_OFFSET;
  524. clk_sel = cscmr1 & MXC_CCM_CSCMR1_USDHC1_CLK_SEL;
  525. break;
  526. case 1:
  527. usdhc_podf = (cscdr1 & MXC_CCM_CSCDR1_USDHC2_PODF_MASK) >>
  528. MXC_CCM_CSCDR1_USDHC2_PODF_OFFSET;
  529. clk_sel = cscmr1 & MXC_CCM_CSCMR1_USDHC2_CLK_SEL;
  530. break;
  531. case 2:
  532. usdhc_podf = (cscdr1 & MXC_CCM_CSCDR1_USDHC3_PODF_MASK) >>
  533. MXC_CCM_CSCDR1_USDHC3_PODF_OFFSET;
  534. clk_sel = cscmr1 & MXC_CCM_CSCMR1_USDHC3_CLK_SEL;
  535. break;
  536. case 3:
  537. usdhc_podf = (cscdr1 & MXC_CCM_CSCDR1_USDHC4_PODF_MASK) >>
  538. MXC_CCM_CSCDR1_USDHC4_PODF_OFFSET;
  539. clk_sel = cscmr1 & MXC_CCM_CSCMR1_USDHC4_CLK_SEL;
  540. break;
  541. default:
  542. break;
  543. }
  544. if (clk_sel)
  545. root_freq = mxc_get_pll_pfd(PLL_BUS, 0);
  546. else
  547. root_freq = mxc_get_pll_pfd(PLL_BUS, 2);
  548. return root_freq / (usdhc_podf + 1);
  549. }
  550. u32 imx_get_uartclk(void)
  551. {
  552. return get_uart_clk();
  553. }
  554. u32 imx_get_fecclk(void)
  555. {
  556. return mxc_get_clock(MXC_IPG_CLK);
  557. }
  558. #if defined(CONFIG_CMD_SATA) || defined(CONFIG_PCIE_IMX)
  559. static int enable_enet_pll(uint32_t en)
  560. {
  561. struct mxc_ccm_reg *const imx_ccm
  562. = (struct mxc_ccm_reg *) CCM_BASE_ADDR;
  563. s32 timeout = 100000;
  564. u32 reg = 0;
  565. /* Enable PLLs */
  566. reg = readl(&imx_ccm->analog_pll_enet);
  567. reg &= ~BM_ANADIG_PLL_SYS_POWERDOWN;
  568. writel(reg, &imx_ccm->analog_pll_enet);
  569. reg |= BM_ANADIG_PLL_SYS_ENABLE;
  570. while (timeout--) {
  571. if (readl(&imx_ccm->analog_pll_enet) & BM_ANADIG_PLL_SYS_LOCK)
  572. break;
  573. }
  574. if (timeout <= 0)
  575. return -EIO;
  576. reg &= ~BM_ANADIG_PLL_SYS_BYPASS;
  577. writel(reg, &imx_ccm->analog_pll_enet);
  578. reg |= en;
  579. writel(reg, &imx_ccm->analog_pll_enet);
  580. return 0;
  581. }
  582. #endif
  583. #ifdef CONFIG_CMD_SATA
  584. static void ungate_sata_clock(void)
  585. {
  586. struct mxc_ccm_reg *const imx_ccm =
  587. (struct mxc_ccm_reg *)CCM_BASE_ADDR;
  588. /* Enable SATA clock. */
  589. setbits_le32(&imx_ccm->CCGR5, MXC_CCM_CCGR5_SATA_MASK);
  590. }
  591. int enable_sata_clock(void)
  592. {
  593. ungate_sata_clock();
  594. return enable_enet_pll(BM_ANADIG_PLL_ENET_ENABLE_SATA);
  595. }
  596. void disable_sata_clock(void)
  597. {
  598. struct mxc_ccm_reg *const imx_ccm =
  599. (struct mxc_ccm_reg *)CCM_BASE_ADDR;
  600. clrbits_le32(&imx_ccm->CCGR5, MXC_CCM_CCGR5_SATA_MASK);
  601. }
  602. #endif
  603. #ifdef CONFIG_PCIE_IMX
  604. static void ungate_pcie_clock(void)
  605. {
  606. struct mxc_ccm_reg *const imx_ccm =
  607. (struct mxc_ccm_reg *)CCM_BASE_ADDR;
  608. /* Enable PCIe clock. */
  609. setbits_le32(&imx_ccm->CCGR4, MXC_CCM_CCGR4_PCIE_MASK);
  610. }
  611. int enable_pcie_clock(void)
  612. {
  613. struct anatop_regs *anatop_regs =
  614. (struct anatop_regs *)ANATOP_BASE_ADDR;
  615. struct mxc_ccm_reg *ccm_regs = (struct mxc_ccm_reg *)CCM_BASE_ADDR;
  616. u32 lvds1_clk_sel;
  617. /*
  618. * Here be dragons!
  619. *
  620. * The register ANATOP_MISC1 is not documented in the Freescale
  621. * MX6RM. The register that is mapped in the ANATOP space and
  622. * marked as ANATOP_MISC1 is actually documented in the PMU section
  623. * of the datasheet as PMU_MISC1.
  624. *
  625. * Switch LVDS clock source to SATA (0xb) on mx6q/dl or PCI (0xa) on
  626. * mx6sx, disable clock INPUT and enable clock OUTPUT. This is important
  627. * for PCI express link that is clocked from the i.MX6.
  628. */
  629. #define ANADIG_ANA_MISC1_LVDSCLK1_IBEN (1 << 12)
  630. #define ANADIG_ANA_MISC1_LVDSCLK1_OBEN (1 << 10)
  631. #define ANADIG_ANA_MISC1_LVDS1_CLK_SEL_MASK 0x0000001F
  632. #define ANADIG_ANA_MISC1_LVDS1_CLK_SEL_PCIE_REF 0xa
  633. #define ANADIG_ANA_MISC1_LVDS1_CLK_SEL_SATA_REF 0xb
  634. if (is_cpu_type(MXC_CPU_MX6SX))
  635. lvds1_clk_sel = ANADIG_ANA_MISC1_LVDS1_CLK_SEL_PCIE_REF;
  636. else
  637. lvds1_clk_sel = ANADIG_ANA_MISC1_LVDS1_CLK_SEL_SATA_REF;
  638. clrsetbits_le32(&anatop_regs->ana_misc1,
  639. ANADIG_ANA_MISC1_LVDSCLK1_IBEN |
  640. ANADIG_ANA_MISC1_LVDS1_CLK_SEL_MASK,
  641. ANADIG_ANA_MISC1_LVDSCLK1_OBEN | lvds1_clk_sel);
  642. /* PCIe reference clock sourced from AXI. */
  643. clrbits_le32(&ccm_regs->cbcmr, MXC_CCM_CBCMR_PCIE_AXI_CLK_SEL);
  644. /* Party time! Ungate the clock to the PCIe. */
  645. #ifdef CONFIG_CMD_SATA
  646. ungate_sata_clock();
  647. #endif
  648. ungate_pcie_clock();
  649. return enable_enet_pll(BM_ANADIG_PLL_ENET_ENABLE_SATA |
  650. BM_ANADIG_PLL_ENET_ENABLE_PCIE);
  651. }
  652. #endif
  653. #ifdef CONFIG_SECURE_BOOT
  654. void hab_caam_clock_enable(unsigned char enable)
  655. {
  656. u32 reg;
  657. /* CG4 ~ CG6, CAAM clocks */
  658. reg = __raw_readl(&imx_ccm->CCGR0);
  659. if (enable)
  660. reg |= (MXC_CCM_CCGR0_CAAM_WRAPPER_IPG_MASK |
  661. MXC_CCM_CCGR0_CAAM_WRAPPER_ACLK_MASK |
  662. MXC_CCM_CCGR0_CAAM_SECURE_MEM_MASK);
  663. else
  664. reg &= ~(MXC_CCM_CCGR0_CAAM_WRAPPER_IPG_MASK |
  665. MXC_CCM_CCGR0_CAAM_WRAPPER_ACLK_MASK |
  666. MXC_CCM_CCGR0_CAAM_SECURE_MEM_MASK);
  667. __raw_writel(reg, &imx_ccm->CCGR0);
  668. /* EMI slow clk */
  669. reg = __raw_readl(&imx_ccm->CCGR6);
  670. if (enable)
  671. reg |= MXC_CCM_CCGR6_EMI_SLOW_MASK;
  672. else
  673. reg &= ~MXC_CCM_CCGR6_EMI_SLOW_MASK;
  674. __raw_writel(reg, &imx_ccm->CCGR6);
  675. }
  676. #endif
  677. static void enable_pll3(void)
  678. {
  679. struct anatop_regs __iomem *anatop =
  680. (struct anatop_regs __iomem *)ANATOP_BASE_ADDR;
  681. /* make sure pll3 is enabled */
  682. if ((readl(&anatop->usb1_pll_480_ctrl) &
  683. BM_ANADIG_USB1_PLL_480_CTRL_LOCK) == 0) {
  684. /* enable pll's power */
  685. writel(BM_ANADIG_USB1_PLL_480_CTRL_POWER,
  686. &anatop->usb1_pll_480_ctrl_set);
  687. writel(0x80, &anatop->ana_misc2_clr);
  688. /* wait for pll lock */
  689. while ((readl(&anatop->usb1_pll_480_ctrl) &
  690. BM_ANADIG_USB1_PLL_480_CTRL_LOCK) == 0)
  691. ;
  692. /* disable bypass */
  693. writel(BM_ANADIG_USB1_PLL_480_CTRL_BYPASS,
  694. &anatop->usb1_pll_480_ctrl_clr);
  695. /* enable pll output */
  696. writel(BM_ANADIG_USB1_PLL_480_CTRL_ENABLE,
  697. &anatop->usb1_pll_480_ctrl_set);
  698. }
  699. }
  700. void enable_thermal_clk(void)
  701. {
  702. enable_pll3();
  703. }
  704. unsigned int mxc_get_clock(enum mxc_clock clk)
  705. {
  706. switch (clk) {
  707. case MXC_ARM_CLK:
  708. return get_mcu_main_clk();
  709. case MXC_PER_CLK:
  710. return get_periph_clk();
  711. case MXC_AHB_CLK:
  712. return get_ahb_clk();
  713. case MXC_IPG_CLK:
  714. return get_ipg_clk();
  715. case MXC_IPG_PERCLK:
  716. case MXC_I2C_CLK:
  717. return get_ipg_per_clk();
  718. case MXC_UART_CLK:
  719. return get_uart_clk();
  720. case MXC_CSPI_CLK:
  721. return get_cspi_clk();
  722. case MXC_AXI_CLK:
  723. return get_axi_clk();
  724. case MXC_EMI_SLOW_CLK:
  725. return get_emi_slow_clk();
  726. case MXC_DDR_CLK:
  727. return get_mmdc_ch0_clk();
  728. case MXC_ESDHC_CLK:
  729. return get_usdhc_clk(0);
  730. case MXC_ESDHC2_CLK:
  731. return get_usdhc_clk(1);
  732. case MXC_ESDHC3_CLK:
  733. return get_usdhc_clk(2);
  734. case MXC_ESDHC4_CLK:
  735. return get_usdhc_clk(3);
  736. case MXC_SATA_CLK:
  737. return get_ahb_clk();
  738. default:
  739. printf("Unsupported MXC CLK: %d\n", clk);
  740. break;
  741. }
  742. return 0;
  743. }
  744. /*
  745. * Dump some core clockes.
  746. */
  747. int do_mx6_showclocks(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
  748. {
  749. u32 freq;
  750. freq = decode_pll(PLL_SYS, MXC_HCLK);
  751. printf("PLL_SYS %8d MHz\n", freq / 1000000);
  752. freq = decode_pll(PLL_BUS, MXC_HCLK);
  753. printf("PLL_BUS %8d MHz\n", freq / 1000000);
  754. freq = decode_pll(PLL_USBOTG, MXC_HCLK);
  755. printf("PLL_OTG %8d MHz\n", freq / 1000000);
  756. freq = decode_pll(PLL_ENET, MXC_HCLK);
  757. printf("PLL_NET %8d MHz\n", freq / 1000000);
  758. printf("\n");
  759. printf("IPG %8d kHz\n", mxc_get_clock(MXC_IPG_CLK) / 1000);
  760. printf("UART %8d kHz\n", mxc_get_clock(MXC_UART_CLK) / 1000);
  761. #ifdef CONFIG_MXC_SPI
  762. printf("CSPI %8d kHz\n", mxc_get_clock(MXC_CSPI_CLK) / 1000);
  763. #endif
  764. printf("AHB %8d kHz\n", mxc_get_clock(MXC_AHB_CLK) / 1000);
  765. printf("AXI %8d kHz\n", mxc_get_clock(MXC_AXI_CLK) / 1000);
  766. printf("DDR %8d kHz\n", mxc_get_clock(MXC_DDR_CLK) / 1000);
  767. printf("USDHC1 %8d kHz\n", mxc_get_clock(MXC_ESDHC_CLK) / 1000);
  768. printf("USDHC2 %8d kHz\n", mxc_get_clock(MXC_ESDHC2_CLK) / 1000);
  769. printf("USDHC3 %8d kHz\n", mxc_get_clock(MXC_ESDHC3_CLK) / 1000);
  770. printf("USDHC4 %8d kHz\n", mxc_get_clock(MXC_ESDHC4_CLK) / 1000);
  771. printf("EMI SLOW %8d kHz\n", mxc_get_clock(MXC_EMI_SLOW_CLK) / 1000);
  772. printf("IPG PERCLK %8d kHz\n", mxc_get_clock(MXC_IPG_PERCLK) / 1000);
  773. return 0;
  774. }
  775. #ifndef CONFIG_MX6SX
  776. void enable_ipu_clock(void)
  777. {
  778. struct mxc_ccm_reg *mxc_ccm = (struct mxc_ccm_reg *)CCM_BASE_ADDR;
  779. int reg;
  780. reg = readl(&mxc_ccm->CCGR3);
  781. reg |= MXC_CCM_CCGR3_IPU1_IPU_MASK;
  782. writel(reg, &mxc_ccm->CCGR3);
  783. if (is_mx6dqp()) {
  784. setbits_le32(&mxc_ccm->CCGR6, MXC_CCM_CCGR6_PRG_CLK0_MASK);
  785. setbits_le32(&mxc_ccm->CCGR3, MXC_CCM_CCGR3_IPU2_IPU_MASK);
  786. }
  787. }
  788. #endif
  789. /***************************************************/
  790. U_BOOT_CMD(
  791. clocks, CONFIG_SYS_MAXARGS, 1, do_mx6_showclocks,
  792. "display clocks",
  793. ""
  794. );