clock_init.c 16 KB

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