clock.c 9.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420
  1. // SPDX-License-Identifier: GPL-2.0+
  2. /*
  3. * Keystone2: pll initialization
  4. *
  5. * (C) Copyright 2012-2014
  6. * Texas Instruments Incorporated, <www.ti.com>
  7. */
  8. #include <common.h>
  9. #include <asm/arch/clock.h>
  10. #include <asm/arch/clock_defs.h>
  11. /* DEV and ARM speed definitions as specified in DEVSPEED register */
  12. int __weak speeds[DEVSPEED_NUMSPDS] = {
  13. SPD1000,
  14. SPD1200,
  15. SPD1350,
  16. SPD1400,
  17. SPD1500,
  18. SPD1400,
  19. SPD1350,
  20. SPD1200,
  21. SPD1000,
  22. SPD800,
  23. };
  24. const struct keystone_pll_regs keystone_pll_regs[] = {
  25. [CORE_PLL] = {KS2_MAINPLLCTL0, KS2_MAINPLLCTL1},
  26. [PASS_PLL] = {KS2_PASSPLLCTL0, KS2_PASSPLLCTL1},
  27. [TETRIS_PLL] = {KS2_ARMPLLCTL0, KS2_ARMPLLCTL1},
  28. [DDR3A_PLL] = {KS2_DDR3APLLCTL0, KS2_DDR3APLLCTL1},
  29. [DDR3B_PLL] = {KS2_DDR3BPLLCTL0, KS2_DDR3BPLLCTL1},
  30. [UART_PLL] = {KS2_UARTPLLCTL0, KS2_UARTPLLCTL1},
  31. };
  32. inline void pll_pa_clk_sel(void)
  33. {
  34. setbits_le32(keystone_pll_regs[PASS_PLL].reg1, CFG_PLLCTL1_PAPLL_MASK);
  35. }
  36. static void wait_for_completion(const struct pll_init_data *data)
  37. {
  38. int i;
  39. for (i = 0; i < 100; i++) {
  40. sdelay(450);
  41. if (!(pllctl_reg_read(data->pll, stat) & PLLSTAT_GOSTAT_MASK))
  42. break;
  43. }
  44. }
  45. static inline void bypass_main_pll(const struct pll_init_data *data)
  46. {
  47. pllctl_reg_clrbits(data->pll, ctl, PLLCTL_PLLENSRC_MASK |
  48. PLLCTL_PLLEN_MASK);
  49. /* 4 cycles of reference clock CLKIN*/
  50. sdelay(340);
  51. }
  52. static void configure_mult_div(const struct pll_init_data *data)
  53. {
  54. u32 pllm, plld, bwadj;
  55. pllm = data->pll_m - 1;
  56. plld = (data->pll_d - 1) & CFG_PLLCTL0_PLLD_MASK;
  57. /* Program Multiplier */
  58. if (data->pll == MAIN_PLL)
  59. pllctl_reg_write(data->pll, mult, pllm & PLLM_MULT_LO_MASK);
  60. clrsetbits_le32(keystone_pll_regs[data->pll].reg0,
  61. CFG_PLLCTL0_PLLM_MASK,
  62. pllm << CFG_PLLCTL0_PLLM_SHIFT);
  63. /* Program BWADJ */
  64. bwadj = (data->pll_m - 1) >> 1; /* Divide pllm by 2 */
  65. clrsetbits_le32(keystone_pll_regs[data->pll].reg0,
  66. CFG_PLLCTL0_BWADJ_MASK,
  67. (bwadj << CFG_PLLCTL0_BWADJ_SHIFT) &
  68. CFG_PLLCTL0_BWADJ_MASK);
  69. bwadj = bwadj >> CFG_PLLCTL0_BWADJ_BITS;
  70. clrsetbits_le32(keystone_pll_regs[data->pll].reg1,
  71. CFG_PLLCTL1_BWADJ_MASK, bwadj);
  72. /* Program Divider */
  73. clrsetbits_le32(keystone_pll_regs[data->pll].reg0,
  74. CFG_PLLCTL0_PLLD_MASK, plld);
  75. }
  76. void configure_main_pll(const struct pll_init_data *data)
  77. {
  78. u32 tmp, pllod, i, alnctl_val = 0;
  79. u32 *offset;
  80. pllod = data->pll_od - 1;
  81. /* 100 micro sec for stabilization */
  82. sdelay(210000);
  83. tmp = pllctl_reg_read(data->pll, secctl);
  84. /* Check for Bypass */
  85. if (tmp & SECCTL_BYPASS_MASK) {
  86. setbits_le32(keystone_pll_regs[data->pll].reg1,
  87. CFG_PLLCTL1_ENSAT_MASK);
  88. bypass_main_pll(data);
  89. /* Powerdown and powerup Main Pll */
  90. pllctl_reg_setbits(data->pll, secctl, SECCTL_BYPASS_MASK);
  91. pllctl_reg_setbits(data->pll, ctl, PLLCTL_PLLPWRDN_MASK);
  92. /* 5 micro sec */
  93. sdelay(21000);
  94. pllctl_reg_clrbits(data->pll, ctl, PLLCTL_PLLPWRDN_MASK);
  95. } else {
  96. bypass_main_pll(data);
  97. }
  98. configure_mult_div(data);
  99. /* Program Output Divider */
  100. pllctl_reg_rmw(data->pll, secctl, SECCTL_OP_DIV_MASK,
  101. ((pllod << SECCTL_OP_DIV_SHIFT) & SECCTL_OP_DIV_MASK));
  102. /* Program PLLDIVn */
  103. wait_for_completion(data);
  104. for (i = 0; i < PLLDIV_MAX; i++) {
  105. if (i < 3)
  106. offset = pllctl_reg(data->pll, div1) + i;
  107. else
  108. offset = pllctl_reg(data->pll, div4) + (i - 3);
  109. if (divn_val[i] != -1) {
  110. __raw_writel(divn_val[i] | PLLDIV_ENABLE_MASK, offset);
  111. alnctl_val |= BIT(i);
  112. }
  113. }
  114. if (alnctl_val) {
  115. pllctl_reg_setbits(data->pll, alnctl, alnctl_val);
  116. /*
  117. * Set GOSET bit in PLLCMD to initiate the GO operation
  118. * to change the divide
  119. */
  120. pllctl_reg_setbits(data->pll, cmd, PLLSTAT_GOSTAT_MASK);
  121. wait_for_completion(data);
  122. }
  123. /* Reset PLL */
  124. pllctl_reg_setbits(data->pll, ctl, PLLCTL_PLLRST_MASK);
  125. sdelay(21000); /* Wait for a minimum of 7 us*/
  126. pllctl_reg_clrbits(data->pll, ctl, PLLCTL_PLLRST_MASK);
  127. sdelay(105000); /* Wait for PLL Lock time (min 50 us) */
  128. /* Enable PLL */
  129. pllctl_reg_clrbits(data->pll, secctl, SECCTL_BYPASS_MASK);
  130. pllctl_reg_setbits(data->pll, ctl, PLLCTL_PLLEN_MASK);
  131. }
  132. void configure_secondary_pll(const struct pll_init_data *data)
  133. {
  134. int pllod = data->pll_od - 1;
  135. /* Enable Glitch free bypass for ARM PLL */
  136. if (cpu_is_k2hk() && data->pll == TETRIS_PLL)
  137. clrbits_le32(KS2_MISC_CTRL, MISC_CTL1_ARM_PLL_EN);
  138. /* Enable Bypass mode */
  139. setbits_le32(keystone_pll_regs[data->pll].reg1, CFG_PLLCTL1_ENSAT_MASK);
  140. setbits_le32(keystone_pll_regs[data->pll].reg0,
  141. CFG_PLLCTL0_BYPASS_MASK);
  142. configure_mult_div(data);
  143. /* Program Output Divider */
  144. clrsetbits_le32(keystone_pll_regs[data->pll].reg0,
  145. CFG_PLLCTL0_CLKOD_MASK,
  146. (pllod << CFG_PLLCTL0_CLKOD_SHIFT) &
  147. CFG_PLLCTL0_CLKOD_MASK);
  148. /* Reset PLL */
  149. setbits_le32(keystone_pll_regs[data->pll].reg1, CFG_PLLCTL1_RST_MASK);
  150. /* Wait for 5 micro seconds */
  151. sdelay(21000);
  152. /* Select the Output of PASS PLL as input to PASS */
  153. if (data->pll == PASS_PLL && cpu_is_k2hk())
  154. pll_pa_clk_sel();
  155. clrbits_le32(keystone_pll_regs[data->pll].reg1, CFG_PLLCTL1_RST_MASK);
  156. /* Wait for 500 * REFCLK cucles * (PLLD + 1) */
  157. sdelay(105000);
  158. /* Switch to PLL mode */
  159. clrbits_le32(keystone_pll_regs[data->pll].reg0,
  160. CFG_PLLCTL0_BYPASS_MASK);
  161. /* Select the Output of ARM PLL as input to ARM */
  162. if (cpu_is_k2hk() && data->pll == TETRIS_PLL)
  163. setbits_le32(KS2_MISC_CTRL, MISC_CTL1_ARM_PLL_EN);
  164. }
  165. void init_pll(const struct pll_init_data *data)
  166. {
  167. if (data->pll == MAIN_PLL)
  168. configure_main_pll(data);
  169. else
  170. configure_secondary_pll(data);
  171. /*
  172. * This is required to provide a delay between multiple
  173. * consequent PPL configurations
  174. */
  175. sdelay(210000);
  176. }
  177. void init_plls(void)
  178. {
  179. struct pll_init_data *data;
  180. int pll;
  181. for (pll = MAIN_PLL; pll < MAX_PLL_COUNT; pll++) {
  182. data = get_pll_init_data(pll);
  183. if (data)
  184. init_pll(data);
  185. }
  186. }
  187. static int get_max_speed(u32 val, u32 speed_supported, int *spds)
  188. {
  189. int speed;
  190. /* Left most setbit gives the speed */
  191. for (speed = DEVSPEED_NUMSPDS; speed >= 0; speed--) {
  192. if ((val & BIT(speed)) & speed_supported)
  193. return spds[speed];
  194. }
  195. /* If no bit is set, return minimum speed */
  196. if (cpu_is_k2g())
  197. return SPD200;
  198. else
  199. return SPD800;
  200. }
  201. static inline u32 read_efuse_bootrom(void)
  202. {
  203. if (cpu_is_k2hk() && (cpu_revision() <= 1))
  204. return __raw_readl(KS2_REV1_DEVSPEED);
  205. else
  206. return __raw_readl(KS2_EFUSE_BOOTROM);
  207. }
  208. int get_max_arm_speed(int *spds)
  209. {
  210. u32 armspeed = read_efuse_bootrom();
  211. armspeed = (armspeed & DEVSPEED_ARMSPEED_MASK) >>
  212. DEVSPEED_ARMSPEED_SHIFT;
  213. return get_max_speed(armspeed, ARM_SUPPORTED_SPEEDS, spds);
  214. }
  215. int get_max_dev_speed(int *spds)
  216. {
  217. u32 devspeed = read_efuse_bootrom();
  218. devspeed = (devspeed & DEVSPEED_DEVSPEED_MASK) >>
  219. DEVSPEED_DEVSPEED_SHIFT;
  220. return get_max_speed(devspeed, DEV_SUPPORTED_SPEEDS, spds);
  221. }
  222. /**
  223. * pll_freq_get - get pll frequency
  224. * @pll: pll identifier
  225. */
  226. static unsigned long pll_freq_get(int pll)
  227. {
  228. unsigned long mult = 1, prediv = 1, output_div = 2;
  229. unsigned long ret;
  230. u32 tmp, reg;
  231. if (pll == MAIN_PLL) {
  232. ret = get_external_clk(sys_clk);
  233. if (pllctl_reg_read(pll, ctl) & PLLCTL_PLLEN_MASK) {
  234. /* PLL mode */
  235. tmp = __raw_readl(KS2_MAINPLLCTL0);
  236. prediv = (tmp & CFG_PLLCTL0_PLLD_MASK) + 1;
  237. mult = ((tmp & CFG_PLLCTL0_PLLM_HI_MASK) >>
  238. CFG_PLLCTL0_PLLM_SHIFT |
  239. (pllctl_reg_read(pll, mult) &
  240. PLLM_MULT_LO_MASK)) + 1;
  241. output_div = ((pllctl_reg_read(pll, secctl) &
  242. SECCTL_OP_DIV_MASK) >>
  243. SECCTL_OP_DIV_SHIFT) + 1;
  244. ret = ret / prediv / output_div * mult;
  245. }
  246. } else {
  247. switch (pll) {
  248. case PASS_PLL:
  249. ret = get_external_clk(pa_clk);
  250. reg = KS2_PASSPLLCTL0;
  251. break;
  252. case TETRIS_PLL:
  253. ret = get_external_clk(tetris_clk);
  254. reg = KS2_ARMPLLCTL0;
  255. break;
  256. case DDR3A_PLL:
  257. ret = get_external_clk(ddr3a_clk);
  258. reg = KS2_DDR3APLLCTL0;
  259. break;
  260. case DDR3B_PLL:
  261. ret = get_external_clk(ddr3b_clk);
  262. reg = KS2_DDR3BPLLCTL0;
  263. break;
  264. case UART_PLL:
  265. ret = get_external_clk(uart_clk);
  266. reg = KS2_UARTPLLCTL0;
  267. break;
  268. default:
  269. return 0;
  270. }
  271. tmp = __raw_readl(reg);
  272. if (!(tmp & CFG_PLLCTL0_BYPASS_MASK)) {
  273. /* Bypass disabled */
  274. prediv = (tmp & CFG_PLLCTL0_PLLD_MASK) + 1;
  275. mult = ((tmp & CFG_PLLCTL0_PLLM_MASK) >>
  276. CFG_PLLCTL0_PLLM_SHIFT) + 1;
  277. output_div = ((tmp & CFG_PLLCTL0_CLKOD_MASK) >>
  278. CFG_PLLCTL0_CLKOD_SHIFT) + 1;
  279. ret = ((ret / prediv) * mult) / output_div;
  280. }
  281. }
  282. return ret;
  283. }
  284. unsigned long ks_clk_get_rate(unsigned int clk)
  285. {
  286. unsigned long freq = 0;
  287. switch (clk) {
  288. case core_pll_clk:
  289. freq = pll_freq_get(CORE_PLL);
  290. break;
  291. case pass_pll_clk:
  292. freq = pll_freq_get(PASS_PLL);
  293. break;
  294. case tetris_pll_clk:
  295. if (!cpu_is_k2e())
  296. freq = pll_freq_get(TETRIS_PLL);
  297. break;
  298. case ddr3a_pll_clk:
  299. freq = pll_freq_get(DDR3A_PLL);
  300. break;
  301. case ddr3b_pll_clk:
  302. if (cpu_is_k2hk())
  303. freq = pll_freq_get(DDR3B_PLL);
  304. break;
  305. case uart_pll_clk:
  306. if (cpu_is_k2g())
  307. freq = pll_freq_get(UART_PLL);
  308. break;
  309. case sys_clk0_1_clk:
  310. case sys_clk0_clk:
  311. freq = pll_freq_get(CORE_PLL) / pll0div_read(1);
  312. break;
  313. case sys_clk1_clk:
  314. return pll_freq_get(CORE_PLL) / pll0div_read(2);
  315. break;
  316. case sys_clk2_clk:
  317. freq = pll_freq_get(CORE_PLL) / pll0div_read(3);
  318. break;
  319. case sys_clk3_clk:
  320. freq = pll_freq_get(CORE_PLL) / pll0div_read(4);
  321. break;
  322. case sys_clk0_2_clk:
  323. freq = ks_clk_get_rate(sys_clk0_clk) / 2;
  324. break;
  325. case sys_clk0_3_clk:
  326. freq = ks_clk_get_rate(sys_clk0_clk) / 3;
  327. break;
  328. case sys_clk0_4_clk:
  329. freq = ks_clk_get_rate(sys_clk0_clk) / 4;
  330. break;
  331. case sys_clk0_6_clk:
  332. freq = ks_clk_get_rate(sys_clk0_clk) / 6;
  333. break;
  334. case sys_clk0_8_clk:
  335. freq = ks_clk_get_rate(sys_clk0_clk) / 8;
  336. break;
  337. case sys_clk0_12_clk:
  338. freq = ks_clk_get_rate(sys_clk0_clk) / 12;
  339. break;
  340. case sys_clk0_24_clk:
  341. freq = ks_clk_get_rate(sys_clk0_clk) / 24;
  342. break;
  343. case sys_clk1_3_clk:
  344. freq = ks_clk_get_rate(sys_clk1_clk) / 3;
  345. break;
  346. case sys_clk1_4_clk:
  347. freq = ks_clk_get_rate(sys_clk1_clk) / 4;
  348. break;
  349. case sys_clk1_6_clk:
  350. freq = ks_clk_get_rate(sys_clk1_clk) / 6;
  351. break;
  352. case sys_clk1_12_clk:
  353. freq = ks_clk_get_rate(sys_clk1_clk) / 12;
  354. break;
  355. default:
  356. break;
  357. }
  358. return freq;
  359. }