clock_init.c 17 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684
  1. /*
  2. * Clock setup for SMDK5250 board based on EXYNOS5
  3. *
  4. * Copyright (C) 2012 Samsung Electronics
  5. *
  6. * See file CREDITS for list of people who contributed to this
  7. * project.
  8. *
  9. * This program is free software; you can redistribute it and/or
  10. * modify it under the terms of the GNU General Public License as
  11. * published by the Free Software Foundation; either version 2 of
  12. * the License, or (at your option) any later version.
  13. *
  14. * This program is distributed in the hope that it will be useful,
  15. * but WITHOUT ANY WARRANTY; without even the implied warranty of
  16. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  17. * GNU General Public License for more details.
  18. *
  19. * You should have received a copy of the GNU General Public License
  20. * along with this program; if not, write to the Free Software
  21. * Foundation, Inc., 59 Temple Place, Suite 330, Boston,
  22. * MA 02111-1307 USA
  23. */
  24. #include <common.h>
  25. #include <config.h>
  26. #include <asm/io.h>
  27. #include <asm/arch/clk.h>
  28. #include <asm/arch/clock.h>
  29. #include <asm/arch/spl.h>
  30. #include <asm/arch/dwmmc.h>
  31. #include "clock_init.h"
  32. #include "setup.h"
  33. #define FSYS1_MMC0_DIV_MASK 0xff0f
  34. #define FSYS1_MMC0_DIV_VAL 0x0701
  35. DECLARE_GLOBAL_DATA_PTR;
  36. struct arm_clk_ratios arm_clk_ratios[] = {
  37. {
  38. .arm_freq_mhz = 600,
  39. .apll_mdiv = 0xc8,
  40. .apll_pdiv = 0x4,
  41. .apll_sdiv = 0x1,
  42. .arm2_ratio = 0x0,
  43. .apll_ratio = 0x1,
  44. .pclk_dbg_ratio = 0x1,
  45. .atb_ratio = 0x2,
  46. .periph_ratio = 0x7,
  47. .acp_ratio = 0x7,
  48. .cpud_ratio = 0x1,
  49. .arm_ratio = 0x0,
  50. }, {
  51. .arm_freq_mhz = 800,
  52. .apll_mdiv = 0x64,
  53. .apll_pdiv = 0x3,
  54. .apll_sdiv = 0x0,
  55. .arm2_ratio = 0x0,
  56. .apll_ratio = 0x1,
  57. .pclk_dbg_ratio = 0x1,
  58. .atb_ratio = 0x3,
  59. .periph_ratio = 0x7,
  60. .acp_ratio = 0x7,
  61. .cpud_ratio = 0x2,
  62. .arm_ratio = 0x0,
  63. }, {
  64. .arm_freq_mhz = 1000,
  65. .apll_mdiv = 0x7d,
  66. .apll_pdiv = 0x3,
  67. .apll_sdiv = 0x0,
  68. .arm2_ratio = 0x0,
  69. .apll_ratio = 0x1,
  70. .pclk_dbg_ratio = 0x1,
  71. .atb_ratio = 0x4,
  72. .periph_ratio = 0x7,
  73. .acp_ratio = 0x7,
  74. .cpud_ratio = 0x2,
  75. .arm_ratio = 0x0,
  76. }, {
  77. .arm_freq_mhz = 1200,
  78. .apll_mdiv = 0x96,
  79. .apll_pdiv = 0x3,
  80. .apll_sdiv = 0x0,
  81. .arm2_ratio = 0x0,
  82. .apll_ratio = 0x3,
  83. .pclk_dbg_ratio = 0x1,
  84. .atb_ratio = 0x5,
  85. .periph_ratio = 0x7,
  86. .acp_ratio = 0x7,
  87. .cpud_ratio = 0x3,
  88. .arm_ratio = 0x0,
  89. }, {
  90. .arm_freq_mhz = 1400,
  91. .apll_mdiv = 0xaf,
  92. .apll_pdiv = 0x3,
  93. .apll_sdiv = 0x0,
  94. .arm2_ratio = 0x0,
  95. .apll_ratio = 0x3,
  96. .pclk_dbg_ratio = 0x1,
  97. .atb_ratio = 0x6,
  98. .periph_ratio = 0x7,
  99. .acp_ratio = 0x7,
  100. .cpud_ratio = 0x3,
  101. .arm_ratio = 0x0,
  102. }, {
  103. .arm_freq_mhz = 1700,
  104. .apll_mdiv = 0x1a9,
  105. .apll_pdiv = 0x6,
  106. .apll_sdiv = 0x0,
  107. .arm2_ratio = 0x0,
  108. .apll_ratio = 0x3,
  109. .pclk_dbg_ratio = 0x1,
  110. .atb_ratio = 0x6,
  111. .periph_ratio = 0x7,
  112. .acp_ratio = 0x7,
  113. .cpud_ratio = 0x3,
  114. .arm_ratio = 0x0,
  115. }
  116. };
  117. struct mem_timings mem_timings[] = {
  118. {
  119. .mem_manuf = MEM_MANUF_ELPIDA,
  120. .mem_type = DDR_MODE_DDR3,
  121. .frequency_mhz = 800,
  122. .mpll_mdiv = 0xc8,
  123. .mpll_pdiv = 0x3,
  124. .mpll_sdiv = 0x0,
  125. .cpll_mdiv = 0xde,
  126. .cpll_pdiv = 0x4,
  127. .cpll_sdiv = 0x2,
  128. .gpll_mdiv = 0x215,
  129. .gpll_pdiv = 0xc,
  130. .gpll_sdiv = 0x1,
  131. .epll_mdiv = 0x60,
  132. .epll_pdiv = 0x3,
  133. .epll_sdiv = 0x3,
  134. .vpll_mdiv = 0x96,
  135. .vpll_pdiv = 0x3,
  136. .vpll_sdiv = 0x2,
  137. .bpll_mdiv = 0x64,
  138. .bpll_pdiv = 0x3,
  139. .bpll_sdiv = 0x0,
  140. .pclk_cdrex_ratio = 0x5,
  141. .direct_cmd_msr = {
  142. 0x00020018, 0x00030000, 0x00010042, 0x00000d70
  143. },
  144. .timing_ref = 0x000000bb,
  145. .timing_row = 0x8c36650e,
  146. .timing_data = 0x3630580b,
  147. .timing_power = 0x41000a44,
  148. .phy0_dqs = 0x08080808,
  149. .phy1_dqs = 0x08080808,
  150. .phy0_dq = 0x08080808,
  151. .phy1_dq = 0x08080808,
  152. .phy0_tFS = 0x4,
  153. .phy1_tFS = 0x4,
  154. .phy0_pulld_dqs = 0xf,
  155. .phy1_pulld_dqs = 0xf,
  156. .lpddr3_ctrl_phy_reset = 0x1,
  157. .ctrl_start_point = 0x10,
  158. .ctrl_inc = 0x10,
  159. .ctrl_start = 0x1,
  160. .ctrl_dll_on = 0x1,
  161. .ctrl_ref = 0x8,
  162. .ctrl_force = 0x1a,
  163. .ctrl_rdlat = 0x0b,
  164. .ctrl_bstlen = 0x08,
  165. .fp_resync = 0x8,
  166. .iv_size = 0x7,
  167. .dfi_init_start = 1,
  168. .aref_en = 1,
  169. .rd_fetch = 0x3,
  170. .zq_mode_dds = 0x7,
  171. .zq_mode_term = 0x1,
  172. .zq_mode_noterm = 0,
  173. /*
  174. * Dynamic Clock: Always Running
  175. * Memory Burst length: 8
  176. * Number of chips: 1
  177. * Memory Bus width: 32 bit
  178. * Memory Type: DDR3
  179. * Additional Latancy for PLL: 0 Cycle
  180. */
  181. .memcontrol = DMC_MEMCONTROL_CLK_STOP_DISABLE |
  182. DMC_MEMCONTROL_DPWRDN_DISABLE |
  183. DMC_MEMCONTROL_DPWRDN_ACTIVE_PRECHARGE |
  184. DMC_MEMCONTROL_TP_DISABLE |
  185. DMC_MEMCONTROL_DSREF_ENABLE |
  186. DMC_MEMCONTROL_ADD_LAT_PALL_CYCLE(0) |
  187. DMC_MEMCONTROL_MEM_TYPE_DDR3 |
  188. DMC_MEMCONTROL_MEM_WIDTH_32BIT |
  189. DMC_MEMCONTROL_NUM_CHIP_1 |
  190. DMC_MEMCONTROL_BL_8 |
  191. DMC_MEMCONTROL_PZQ_DISABLE |
  192. DMC_MEMCONTROL_MRR_BYTE_7_0,
  193. .memconfig = DMC_MEMCONFIGx_CHIP_MAP_INTERLEAVED |
  194. DMC_MEMCONFIGx_CHIP_COL_10 |
  195. DMC_MEMCONFIGx_CHIP_ROW_15 |
  196. DMC_MEMCONFIGx_CHIP_BANK_8,
  197. .membaseconfig0 = DMC_MEMBASECONFIG_VAL(0x40),
  198. .membaseconfig1 = DMC_MEMBASECONFIG_VAL(0x80),
  199. .prechconfig_tp_cnt = 0xff,
  200. .dpwrdn_cyc = 0xff,
  201. .dsref_cyc = 0xffff,
  202. .concontrol = DMC_CONCONTROL_DFI_INIT_START_DISABLE |
  203. DMC_CONCONTROL_TIMEOUT_LEVEL0 |
  204. DMC_CONCONTROL_RD_FETCH_DISABLE |
  205. DMC_CONCONTROL_EMPTY_DISABLE |
  206. DMC_CONCONTROL_AREF_EN_DISABLE |
  207. DMC_CONCONTROL_IO_PD_CON_DISABLE,
  208. .dmc_channels = 2,
  209. .chips_per_channel = 2,
  210. .chips_to_configure = 1,
  211. .send_zq_init = 1,
  212. .impedance = IMP_OUTPUT_DRV_30_OHM,
  213. .gate_leveling_enable = 0,
  214. }, {
  215. .mem_manuf = MEM_MANUF_SAMSUNG,
  216. .mem_type = DDR_MODE_DDR3,
  217. .frequency_mhz = 800,
  218. .mpll_mdiv = 0xc8,
  219. .mpll_pdiv = 0x3,
  220. .mpll_sdiv = 0x0,
  221. .cpll_mdiv = 0xde,
  222. .cpll_pdiv = 0x4,
  223. .cpll_sdiv = 0x2,
  224. .gpll_mdiv = 0x215,
  225. .gpll_pdiv = 0xc,
  226. .gpll_sdiv = 0x1,
  227. .epll_mdiv = 0x60,
  228. .epll_pdiv = 0x3,
  229. .epll_sdiv = 0x3,
  230. .vpll_mdiv = 0x96,
  231. .vpll_pdiv = 0x3,
  232. .vpll_sdiv = 0x2,
  233. .bpll_mdiv = 0x64,
  234. .bpll_pdiv = 0x3,
  235. .bpll_sdiv = 0x0,
  236. .pclk_cdrex_ratio = 0x5,
  237. .direct_cmd_msr = {
  238. 0x00020018, 0x00030000, 0x00010000, 0x00000d70
  239. },
  240. .timing_ref = 0x000000bb,
  241. .timing_row = 0x8c36650e,
  242. .timing_data = 0x3630580b,
  243. .timing_power = 0x41000a44,
  244. .phy0_dqs = 0x08080808,
  245. .phy1_dqs = 0x08080808,
  246. .phy0_dq = 0x08080808,
  247. .phy1_dq = 0x08080808,
  248. .phy0_tFS = 0x8,
  249. .phy1_tFS = 0x8,
  250. .phy0_pulld_dqs = 0xf,
  251. .phy1_pulld_dqs = 0xf,
  252. .lpddr3_ctrl_phy_reset = 0x1,
  253. .ctrl_start_point = 0x10,
  254. .ctrl_inc = 0x10,
  255. .ctrl_start = 0x1,
  256. .ctrl_dll_on = 0x1,
  257. .ctrl_ref = 0x8,
  258. .ctrl_force = 0x1a,
  259. .ctrl_rdlat = 0x0b,
  260. .ctrl_bstlen = 0x08,
  261. .fp_resync = 0x8,
  262. .iv_size = 0x7,
  263. .dfi_init_start = 1,
  264. .aref_en = 1,
  265. .rd_fetch = 0x3,
  266. .zq_mode_dds = 0x5,
  267. .zq_mode_term = 0x1,
  268. .zq_mode_noterm = 1,
  269. /*
  270. * Dynamic Clock: Always Running
  271. * Memory Burst length: 8
  272. * Number of chips: 1
  273. * Memory Bus width: 32 bit
  274. * Memory Type: DDR3
  275. * Additional Latancy for PLL: 0 Cycle
  276. */
  277. .memcontrol = DMC_MEMCONTROL_CLK_STOP_DISABLE |
  278. DMC_MEMCONTROL_DPWRDN_DISABLE |
  279. DMC_MEMCONTROL_DPWRDN_ACTIVE_PRECHARGE |
  280. DMC_MEMCONTROL_TP_DISABLE |
  281. DMC_MEMCONTROL_DSREF_ENABLE |
  282. DMC_MEMCONTROL_ADD_LAT_PALL_CYCLE(0) |
  283. DMC_MEMCONTROL_MEM_TYPE_DDR3 |
  284. DMC_MEMCONTROL_MEM_WIDTH_32BIT |
  285. DMC_MEMCONTROL_NUM_CHIP_1 |
  286. DMC_MEMCONTROL_BL_8 |
  287. DMC_MEMCONTROL_PZQ_DISABLE |
  288. DMC_MEMCONTROL_MRR_BYTE_7_0,
  289. .memconfig = DMC_MEMCONFIGx_CHIP_MAP_INTERLEAVED |
  290. DMC_MEMCONFIGx_CHIP_COL_10 |
  291. DMC_MEMCONFIGx_CHIP_ROW_15 |
  292. DMC_MEMCONFIGx_CHIP_BANK_8,
  293. .membaseconfig0 = DMC_MEMBASECONFIG_VAL(0x40),
  294. .membaseconfig1 = DMC_MEMBASECONFIG_VAL(0x80),
  295. .prechconfig_tp_cnt = 0xff,
  296. .dpwrdn_cyc = 0xff,
  297. .dsref_cyc = 0xffff,
  298. .concontrol = DMC_CONCONTROL_DFI_INIT_START_DISABLE |
  299. DMC_CONCONTROL_TIMEOUT_LEVEL0 |
  300. DMC_CONCONTROL_RD_FETCH_DISABLE |
  301. DMC_CONCONTROL_EMPTY_DISABLE |
  302. DMC_CONCONTROL_AREF_EN_DISABLE |
  303. DMC_CONCONTROL_IO_PD_CON_DISABLE,
  304. .dmc_channels = 2,
  305. .chips_per_channel = 2,
  306. .chips_to_configure = 1,
  307. .send_zq_init = 1,
  308. .impedance = IMP_OUTPUT_DRV_40_OHM,
  309. .gate_leveling_enable = 1,
  310. }
  311. };
  312. /**
  313. * Get the required memory type and speed (SPL version).
  314. *
  315. * In SPL we have no device tree, so we use the machine parameters
  316. *
  317. * @param mem_type Returns memory type
  318. * @param frequency_mhz Returns memory speed in MHz
  319. * @param arm_freq Returns ARM clock speed in MHz
  320. * @param mem_manuf Return Memory Manufacturer name
  321. * @return 0 if all ok
  322. */
  323. static int clock_get_mem_selection(enum ddr_mode *mem_type,
  324. unsigned *frequency_mhz, unsigned *arm_freq,
  325. enum mem_manuf *mem_manuf)
  326. {
  327. struct spl_machine_param *params;
  328. params = spl_get_machine_params();
  329. *mem_type = params->mem_type;
  330. *frequency_mhz = params->frequency_mhz;
  331. *arm_freq = params->arm_freq_mhz;
  332. *mem_manuf = params->mem_manuf;
  333. return 0;
  334. }
  335. /* Get the ratios for setting ARM clock */
  336. struct arm_clk_ratios *get_arm_ratios(void)
  337. {
  338. struct arm_clk_ratios *arm_ratio;
  339. enum ddr_mode mem_type;
  340. enum mem_manuf mem_manuf;
  341. unsigned frequency_mhz, arm_freq;
  342. int i;
  343. if (clock_get_mem_selection(&mem_type, &frequency_mhz,
  344. &arm_freq, &mem_manuf))
  345. ;
  346. for (i = 0, arm_ratio = arm_clk_ratios; i < ARRAY_SIZE(arm_clk_ratios);
  347. i++, arm_ratio++) {
  348. if (arm_ratio->arm_freq_mhz == arm_freq)
  349. return arm_ratio;
  350. }
  351. /* will hang if failed to find clock ratio */
  352. while (1)
  353. ;
  354. return NULL;
  355. }
  356. struct mem_timings *clock_get_mem_timings(void)
  357. {
  358. struct mem_timings *mem;
  359. enum ddr_mode mem_type;
  360. enum mem_manuf mem_manuf;
  361. unsigned frequency_mhz, arm_freq;
  362. int i;
  363. if (!clock_get_mem_selection(&mem_type, &frequency_mhz,
  364. &arm_freq, &mem_manuf)) {
  365. for (i = 0, mem = mem_timings; i < ARRAY_SIZE(mem_timings);
  366. i++, mem++) {
  367. if (mem->mem_type == mem_type &&
  368. mem->frequency_mhz == frequency_mhz &&
  369. mem->mem_manuf == mem_manuf)
  370. return mem;
  371. }
  372. }
  373. /* will hang if failed to find memory timings */
  374. while (1)
  375. ;
  376. return NULL;
  377. }
  378. void system_clock_init()
  379. {
  380. struct exynos5_clock *clk = (struct exynos5_clock *)EXYNOS5_CLOCK_BASE;
  381. struct mem_timings *mem;
  382. struct arm_clk_ratios *arm_clk_ratio;
  383. u32 val, tmp;
  384. mem = clock_get_mem_timings();
  385. arm_clk_ratio = get_arm_ratios();
  386. clrbits_le32(&clk->src_cpu, MUX_APLL_SEL_MASK);
  387. do {
  388. val = readl(&clk->mux_stat_cpu);
  389. } while ((val | MUX_APLL_SEL_MASK) != val);
  390. clrbits_le32(&clk->src_core1, MUX_MPLL_SEL_MASK);
  391. do {
  392. val = readl(&clk->mux_stat_core1);
  393. } while ((val | MUX_MPLL_SEL_MASK) != val);
  394. clrbits_le32(&clk->src_top2, MUX_CPLL_SEL_MASK);
  395. clrbits_le32(&clk->src_top2, MUX_EPLL_SEL_MASK);
  396. clrbits_le32(&clk->src_top2, MUX_VPLL_SEL_MASK);
  397. clrbits_le32(&clk->src_top2, MUX_GPLL_SEL_MASK);
  398. tmp = MUX_CPLL_SEL_MASK | MUX_EPLL_SEL_MASK | MUX_VPLL_SEL_MASK
  399. | MUX_GPLL_SEL_MASK;
  400. do {
  401. val = readl(&clk->mux_stat_top2);
  402. } while ((val | tmp) != val);
  403. clrbits_le32(&clk->src_cdrex, MUX_BPLL_SEL_MASK);
  404. do {
  405. val = readl(&clk->mux_stat_cdrex);
  406. } while ((val | MUX_BPLL_SEL_MASK) != val);
  407. /* PLL locktime */
  408. writel(APLL_LOCK_VAL, &clk->apll_lock);
  409. writel(MPLL_LOCK_VAL, &clk->mpll_lock);
  410. writel(BPLL_LOCK_VAL, &clk->bpll_lock);
  411. writel(CPLL_LOCK_VAL, &clk->cpll_lock);
  412. writel(GPLL_LOCK_VAL, &clk->gpll_lock);
  413. writel(EPLL_LOCK_VAL, &clk->epll_lock);
  414. writel(VPLL_LOCK_VAL, &clk->vpll_lock);
  415. writel(CLK_REG_DISABLE, &clk->pll_div2_sel);
  416. writel(MUX_HPM_SEL_MASK, &clk->src_cpu);
  417. do {
  418. val = readl(&clk->mux_stat_cpu);
  419. } while ((val | HPM_SEL_SCLK_MPLL) != val);
  420. val = arm_clk_ratio->arm2_ratio << 28
  421. | arm_clk_ratio->apll_ratio << 24
  422. | arm_clk_ratio->pclk_dbg_ratio << 20
  423. | arm_clk_ratio->atb_ratio << 16
  424. | arm_clk_ratio->periph_ratio << 12
  425. | arm_clk_ratio->acp_ratio << 8
  426. | arm_clk_ratio->cpud_ratio << 4
  427. | arm_clk_ratio->arm_ratio;
  428. writel(val, &clk->div_cpu0);
  429. do {
  430. val = readl(&clk->div_stat_cpu0);
  431. } while (0 != val);
  432. writel(CLK_DIV_CPU1_VAL, &clk->div_cpu1);
  433. do {
  434. val = readl(&clk->div_stat_cpu1);
  435. } while (0 != val);
  436. /* Set APLL */
  437. writel(APLL_CON1_VAL, &clk->apll_con1);
  438. val = set_pll(arm_clk_ratio->apll_mdiv, arm_clk_ratio->apll_pdiv,
  439. arm_clk_ratio->apll_sdiv);
  440. writel(val, &clk->apll_con0);
  441. while ((readl(&clk->apll_con0) & APLL_CON0_LOCKED) == 0)
  442. ;
  443. /* Set MPLL */
  444. writel(MPLL_CON1_VAL, &clk->mpll_con1);
  445. val = set_pll(mem->mpll_mdiv, mem->mpll_pdiv, mem->mpll_sdiv);
  446. writel(val, &clk->mpll_con0);
  447. while ((readl(&clk->mpll_con0) & MPLL_CON0_LOCKED) == 0)
  448. ;
  449. /* Set BPLL */
  450. writel(BPLL_CON1_VAL, &clk->bpll_con1);
  451. val = set_pll(mem->bpll_mdiv, mem->bpll_pdiv, mem->bpll_sdiv);
  452. writel(val, &clk->bpll_con0);
  453. while ((readl(&clk->bpll_con0) & BPLL_CON0_LOCKED) == 0)
  454. ;
  455. /* Set CPLL */
  456. writel(CPLL_CON1_VAL, &clk->cpll_con1);
  457. val = set_pll(mem->cpll_mdiv, mem->cpll_pdiv, mem->cpll_sdiv);
  458. writel(val, &clk->cpll_con0);
  459. while ((readl(&clk->cpll_con0) & CPLL_CON0_LOCKED) == 0)
  460. ;
  461. /* Set GPLL */
  462. writel(GPLL_CON1_VAL, &clk->gpll_con1);
  463. val = set_pll(mem->gpll_mdiv, mem->gpll_pdiv, mem->gpll_sdiv);
  464. writel(val, &clk->gpll_con0);
  465. while ((readl(&clk->gpll_con0) & GPLL_CON0_LOCKED) == 0)
  466. ;
  467. /* Set EPLL */
  468. writel(EPLL_CON2_VAL, &clk->epll_con2);
  469. writel(EPLL_CON1_VAL, &clk->epll_con1);
  470. val = set_pll(mem->epll_mdiv, mem->epll_pdiv, mem->epll_sdiv);
  471. writel(val, &clk->epll_con0);
  472. while ((readl(&clk->epll_con0) & EPLL_CON0_LOCKED) == 0)
  473. ;
  474. /* Set VPLL */
  475. writel(VPLL_CON2_VAL, &clk->vpll_con2);
  476. writel(VPLL_CON1_VAL, &clk->vpll_con1);
  477. val = set_pll(mem->vpll_mdiv, mem->vpll_pdiv, mem->vpll_sdiv);
  478. writel(val, &clk->vpll_con0);
  479. while ((readl(&clk->vpll_con0) & VPLL_CON0_LOCKED) == 0)
  480. ;
  481. writel(CLK_SRC_CORE0_VAL, &clk->src_core0);
  482. writel(CLK_DIV_CORE0_VAL, &clk->div_core0);
  483. while (readl(&clk->div_stat_core0) != 0)
  484. ;
  485. writel(CLK_DIV_CORE1_VAL, &clk->div_core1);
  486. while (readl(&clk->div_stat_core1) != 0)
  487. ;
  488. writel(CLK_DIV_SYSRGT_VAL, &clk->div_sysrgt);
  489. while (readl(&clk->div_stat_sysrgt) != 0)
  490. ;
  491. writel(CLK_DIV_ACP_VAL, &clk->div_acp);
  492. while (readl(&clk->div_stat_acp) != 0)
  493. ;
  494. writel(CLK_DIV_SYSLFT_VAL, &clk->div_syslft);
  495. while (readl(&clk->div_stat_syslft) != 0)
  496. ;
  497. writel(CLK_SRC_TOP0_VAL, &clk->src_top0);
  498. writel(CLK_SRC_TOP1_VAL, &clk->src_top1);
  499. writel(TOP2_VAL, &clk->src_top2);
  500. writel(CLK_SRC_TOP3_VAL, &clk->src_top3);
  501. writel(CLK_DIV_TOP0_VAL, &clk->div_top0);
  502. while (readl(&clk->div_stat_top0))
  503. ;
  504. writel(CLK_DIV_TOP1_VAL, &clk->div_top1);
  505. while (readl(&clk->div_stat_top1))
  506. ;
  507. writel(CLK_SRC_LEX_VAL, &clk->src_lex);
  508. while (1) {
  509. val = readl(&clk->mux_stat_lex);
  510. if (val == (val | 1))
  511. break;
  512. }
  513. writel(CLK_DIV_LEX_VAL, &clk->div_lex);
  514. while (readl(&clk->div_stat_lex))
  515. ;
  516. writel(CLK_DIV_R0X_VAL, &clk->div_r0x);
  517. while (readl(&clk->div_stat_r0x))
  518. ;
  519. writel(CLK_DIV_R0X_VAL, &clk->div_r0x);
  520. while (readl(&clk->div_stat_r0x))
  521. ;
  522. writel(CLK_DIV_R1X_VAL, &clk->div_r1x);
  523. while (readl(&clk->div_stat_r1x))
  524. ;
  525. writel(CLK_REG_DISABLE, &clk->src_cdrex);
  526. writel(CLK_DIV_CDREX_VAL, &clk->div_cdrex);
  527. while (readl(&clk->div_stat_cdrex))
  528. ;
  529. val = readl(&clk->src_cpu);
  530. val |= CLK_SRC_CPU_VAL;
  531. writel(val, &clk->src_cpu);
  532. val = readl(&clk->src_top2);
  533. val |= CLK_SRC_TOP2_VAL;
  534. writel(val, &clk->src_top2);
  535. val = readl(&clk->src_core1);
  536. val |= CLK_SRC_CORE1_VAL;
  537. writel(val, &clk->src_core1);
  538. writel(CLK_SRC_FSYS0_VAL, &clk->src_fsys);
  539. writel(CLK_DIV_FSYS0_VAL, &clk->div_fsys0);
  540. while (readl(&clk->div_stat_fsys0))
  541. ;
  542. writel(CLK_REG_DISABLE, &clk->clkout_cmu_cpu);
  543. writel(CLK_REG_DISABLE, &clk->clkout_cmu_core);
  544. writel(CLK_REG_DISABLE, &clk->clkout_cmu_acp);
  545. writel(CLK_REG_DISABLE, &clk->clkout_cmu_top);
  546. writel(CLK_REG_DISABLE, &clk->clkout_cmu_lex);
  547. writel(CLK_REG_DISABLE, &clk->clkout_cmu_r0x);
  548. writel(CLK_REG_DISABLE, &clk->clkout_cmu_r1x);
  549. writel(CLK_REG_DISABLE, &clk->clkout_cmu_cdrex);
  550. writel(CLK_SRC_PERIC0_VAL, &clk->src_peric0);
  551. writel(CLK_DIV_PERIC0_VAL, &clk->div_peric0);
  552. writel(CLK_SRC_PERIC1_VAL, &clk->src_peric1);
  553. writel(CLK_DIV_PERIC1_VAL, &clk->div_peric1);
  554. writel(CLK_DIV_PERIC2_VAL, &clk->div_peric2);
  555. writel(CLK_DIV_PERIC3_VAL, &clk->div_peric3);
  556. writel(SCLK_SRC_ISP_VAL, &clk->sclk_src_isp);
  557. writel(SCLK_DIV_ISP_VAL, &clk->sclk_div_isp);
  558. writel(CLK_DIV_ISP0_VAL, &clk->div_isp0);
  559. writel(CLK_DIV_ISP1_VAL, &clk->div_isp1);
  560. writel(CLK_DIV_ISP2_VAL, &clk->div_isp2);
  561. /* FIMD1 SRC CLK SELECTION */
  562. writel(CLK_SRC_DISP1_0_VAL, &clk->src_disp1_0);
  563. val = MMC2_PRE_RATIO_VAL << MMC2_PRE_RATIO_OFFSET
  564. | MMC2_RATIO_VAL << MMC2_RATIO_OFFSET
  565. | MMC3_PRE_RATIO_VAL << MMC3_PRE_RATIO_OFFSET
  566. | MMC3_RATIO_VAL << MMC3_RATIO_OFFSET;
  567. writel(val, &clk->div_fsys2);
  568. }
  569. void clock_init_dp_clock(void)
  570. {
  571. struct exynos5_clock *clk = (struct exynos5_clock *)EXYNOS5_CLOCK_BASE;
  572. /* DP clock enable */
  573. setbits_le32(&clk->gate_ip_disp1, CLK_GATE_DP1_ALLOW);
  574. /* We run DP at 267 Mhz */
  575. setbits_le32(&clk->div_disp1_0, CLK_DIV_DISP1_0_FIMD1);
  576. }
  577. /*
  578. * Set clock divisor value for booting from EMMC.
  579. * Set DWMMC channel-0 clk div to operate mmc0 device at 50MHz.
  580. */
  581. void emmc_boot_clk_div_set(void)
  582. {
  583. struct exynos5_clock *clk = (struct exynos5_clock *)EXYNOS5_CLOCK_BASE;
  584. unsigned int div_mmc;
  585. div_mmc = readl((unsigned int) &clk->div_fsys1) & ~FSYS1_MMC0_DIV_MASK;
  586. div_mmc |= FSYS1_MMC0_DIV_VAL;
  587. writel(div_mmc, (unsigned int) &clk->div_fsys1);
  588. }