clock.c 20 KB

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