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