clock_init_exynos5.c 25 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005
  1. /*
  2. * Clock setup for SMDK5250 board based on EXYNOS5
  3. *
  4. * Copyright (C) 2012 Samsung Electronics
  5. *
  6. * SPDX-License-Identifier: GPL-2.0+
  7. */
  8. #include <common.h>
  9. #include <config.h>
  10. #include <asm/io.h>
  11. #include <asm/arch/clk.h>
  12. #include <asm/arch/clock.h>
  13. #include <asm/arch/spl.h>
  14. #include <asm/arch/dwmmc.h>
  15. #include "clock_init.h"
  16. #include "common_setup.h"
  17. #include "exynos5_setup.h"
  18. #define FSYS1_MMC0_DIV_MASK 0xff0f
  19. #define FSYS1_MMC0_DIV_VAL 0x0701
  20. DECLARE_GLOBAL_DATA_PTR;
  21. struct arm_clk_ratios arm_clk_ratios[] = {
  22. #ifdef CONFIG_EXYNOS5420
  23. {
  24. .arm_freq_mhz = 900,
  25. .apll_mdiv = 0x96,
  26. .apll_pdiv = 0x2,
  27. .apll_sdiv = 0x1,
  28. .arm2_ratio = 0x0,
  29. .apll_ratio = 0x3,
  30. .pclk_dbg_ratio = 0x6,
  31. .atb_ratio = 0x6,
  32. .periph_ratio = 0x7,
  33. .acp_ratio = 0x0,
  34. .cpud_ratio = 0x2,
  35. .arm_ratio = 0x0,
  36. }
  37. #else
  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. #endif
  118. };
  119. struct mem_timings mem_timings[] = {
  120. #ifdef CONFIG_EXYNOS5420
  121. {
  122. .mem_manuf = MEM_MANUF_SAMSUNG,
  123. .mem_type = DDR_MODE_DDR3,
  124. .frequency_mhz = 800,
  125. /* MPLL @800MHz*/
  126. .mpll_mdiv = 0xc8,
  127. .mpll_pdiv = 0x3,
  128. .mpll_sdiv = 0x1,
  129. /* CPLL @666MHz */
  130. .cpll_mdiv = 0xde,
  131. .cpll_pdiv = 0x4,
  132. .cpll_sdiv = 0x1,
  133. /* EPLL @600MHz */
  134. .epll_mdiv = 0x64,
  135. .epll_pdiv = 0x2,
  136. .epll_sdiv = 0x1,
  137. /* VPLL @430MHz */
  138. .vpll_mdiv = 0xd7,
  139. .vpll_pdiv = 0x3,
  140. .vpll_sdiv = 0x2,
  141. /* BPLL @800MHz */
  142. .bpll_mdiv = 0xc8,
  143. .bpll_pdiv = 0x3,
  144. .bpll_sdiv = 0x1,
  145. /* KPLL @600MHz */
  146. .kpll_mdiv = 0x190,
  147. .kpll_pdiv = 0x4,
  148. .kpll_sdiv = 0x2,
  149. /* DPLL @600MHz */
  150. .dpll_mdiv = 0x190,
  151. .dpll_pdiv = 0x4,
  152. .dpll_sdiv = 0x2,
  153. /* IPLL @370MHz */
  154. .ipll_mdiv = 0xb9,
  155. .ipll_pdiv = 0x3,
  156. .ipll_sdiv = 0x2,
  157. /* SPLL @400MHz */
  158. .spll_mdiv = 0xc8,
  159. .spll_pdiv = 0x3,
  160. .spll_sdiv = 0x2,
  161. /* RPLL @141Mhz */
  162. .rpll_mdiv = 0x5E,
  163. .rpll_pdiv = 0x2,
  164. .rpll_sdiv = 0x3,
  165. .direct_cmd_msr = {
  166. 0x00020018, 0x00030000, 0x00010046, 0x00000d70,
  167. 0x00000c70
  168. },
  169. .timing_ref = 0x000000bb,
  170. .timing_row = 0x6836650f,
  171. .timing_data = 0x3630580b,
  172. .timing_power = 0x41000a26,
  173. .phy0_dqs = 0x08080808,
  174. .phy1_dqs = 0x08080808,
  175. .phy0_dq = 0x08080808,
  176. .phy1_dq = 0x08080808,
  177. .phy0_tFS = 0x8,
  178. .phy1_tFS = 0x8,
  179. .phy0_pulld_dqs = 0xf,
  180. .phy1_pulld_dqs = 0xf,
  181. .lpddr3_ctrl_phy_reset = 0x1,
  182. .ctrl_start_point = 0x10,
  183. .ctrl_inc = 0x10,
  184. .ctrl_start = 0x1,
  185. .ctrl_dll_on = 0x1,
  186. .ctrl_ref = 0x8,
  187. .ctrl_force = 0x1a,
  188. .ctrl_rdlat = 0x0b,
  189. .ctrl_bstlen = 0x08,
  190. .fp_resync = 0x8,
  191. .iv_size = 0x7,
  192. .dfi_init_start = 1,
  193. .aref_en = 1,
  194. .rd_fetch = 0x3,
  195. .zq_mode_dds = 0x7,
  196. .zq_mode_term = 0x1,
  197. .zq_mode_noterm = 1,
  198. /*
  199. * Dynamic Clock: Always Running
  200. * Memory Burst length: 8
  201. * Number of chips: 1
  202. * Memory Bus width: 32 bit
  203. * Memory Type: DDR3
  204. * Additional Latancy for PLL: 0 Cycle
  205. */
  206. .memcontrol = DMC_MEMCONTROL_CLK_STOP_DISABLE |
  207. DMC_MEMCONTROL_DPWRDN_DISABLE |
  208. DMC_MEMCONTROL_DPWRDN_ACTIVE_PRECHARGE |
  209. DMC_MEMCONTROL_TP_DISABLE |
  210. DMC_MEMCONTROL_DSREF_DISABLE |
  211. DMC_MEMCONTROL_ADD_LAT_PALL_CYCLE(0) |
  212. DMC_MEMCONTROL_MEM_TYPE_DDR3 |
  213. DMC_MEMCONTROL_MEM_WIDTH_32BIT |
  214. DMC_MEMCONTROL_NUM_CHIP_1 |
  215. DMC_MEMCONTROL_BL_8 |
  216. DMC_MEMCONTROL_PZQ_DISABLE |
  217. DMC_MEMCONTROL_MRR_BYTE_7_0,
  218. .memconfig = DMC_MEMCONFIG_CHIP_MAP_SPLIT |
  219. DMC_MEMCONFIGX_CHIP_COL_10 |
  220. DMC_MEMCONFIGX_CHIP_ROW_15 |
  221. DMC_MEMCONFIGX_CHIP_BANK_8,
  222. .prechconfig_tp_cnt = 0xff,
  223. .dpwrdn_cyc = 0xff,
  224. .dsref_cyc = 0xffff,
  225. .concontrol = DMC_CONCONTROL_DFI_INIT_START_DISABLE |
  226. DMC_CONCONTROL_TIMEOUT_LEVEL0 |
  227. DMC_CONCONTROL_RD_FETCH_DISABLE |
  228. DMC_CONCONTROL_EMPTY_DISABLE |
  229. DMC_CONCONTROL_AREF_EN_DISABLE |
  230. DMC_CONCONTROL_IO_PD_CON_DISABLE,
  231. .dmc_channels = 1,
  232. .chips_per_channel = 1,
  233. .chips_to_configure = 1,
  234. .send_zq_init = 1,
  235. .gate_leveling_enable = 1,
  236. .read_leveling_enable = 0,
  237. }
  238. #else
  239. {
  240. .mem_manuf = MEM_MANUF_ELPIDA,
  241. .mem_type = DDR_MODE_DDR3,
  242. .frequency_mhz = 800,
  243. .mpll_mdiv = 0xc8,
  244. .mpll_pdiv = 0x3,
  245. .mpll_sdiv = 0x0,
  246. .cpll_mdiv = 0xde,
  247. .cpll_pdiv = 0x4,
  248. .cpll_sdiv = 0x2,
  249. .gpll_mdiv = 0x215,
  250. .gpll_pdiv = 0xc,
  251. .gpll_sdiv = 0x1,
  252. .epll_mdiv = 0x60,
  253. .epll_pdiv = 0x3,
  254. .epll_sdiv = 0x3,
  255. .vpll_mdiv = 0x96,
  256. .vpll_pdiv = 0x3,
  257. .vpll_sdiv = 0x2,
  258. .bpll_mdiv = 0x64,
  259. .bpll_pdiv = 0x3,
  260. .bpll_sdiv = 0x0,
  261. .pclk_cdrex_ratio = 0x5,
  262. .direct_cmd_msr = {
  263. 0x00020018, 0x00030000, 0x00010042, 0x00000d70
  264. },
  265. .timing_ref = 0x000000bb,
  266. .timing_row = 0x8c36650e,
  267. .timing_data = 0x3630580b,
  268. .timing_power = 0x41000a44,
  269. .phy0_dqs = 0x08080808,
  270. .phy1_dqs = 0x08080808,
  271. .phy0_dq = 0x08080808,
  272. .phy1_dq = 0x08080808,
  273. .phy0_tFS = 0x4,
  274. .phy1_tFS = 0x4,
  275. .phy0_pulld_dqs = 0xf,
  276. .phy1_pulld_dqs = 0xf,
  277. .lpddr3_ctrl_phy_reset = 0x1,
  278. .ctrl_start_point = 0x10,
  279. .ctrl_inc = 0x10,
  280. .ctrl_start = 0x1,
  281. .ctrl_dll_on = 0x1,
  282. .ctrl_ref = 0x8,
  283. .ctrl_force = 0x1a,
  284. .ctrl_rdlat = 0x0b,
  285. .ctrl_bstlen = 0x08,
  286. .fp_resync = 0x8,
  287. .iv_size = 0x7,
  288. .dfi_init_start = 1,
  289. .aref_en = 1,
  290. .rd_fetch = 0x3,
  291. .zq_mode_dds = 0x7,
  292. .zq_mode_term = 0x1,
  293. .zq_mode_noterm = 0,
  294. /*
  295. * Dynamic Clock: Always Running
  296. * Memory Burst length: 8
  297. * Number of chips: 1
  298. * Memory Bus width: 32 bit
  299. * Memory Type: DDR3
  300. * Additional Latancy for PLL: 0 Cycle
  301. */
  302. .memcontrol = DMC_MEMCONTROL_CLK_STOP_DISABLE |
  303. DMC_MEMCONTROL_DPWRDN_DISABLE |
  304. DMC_MEMCONTROL_DPWRDN_ACTIVE_PRECHARGE |
  305. DMC_MEMCONTROL_TP_DISABLE |
  306. DMC_MEMCONTROL_DSREF_ENABLE |
  307. DMC_MEMCONTROL_ADD_LAT_PALL_CYCLE(0) |
  308. DMC_MEMCONTROL_MEM_TYPE_DDR3 |
  309. DMC_MEMCONTROL_MEM_WIDTH_32BIT |
  310. DMC_MEMCONTROL_NUM_CHIP_1 |
  311. DMC_MEMCONTROL_BL_8 |
  312. DMC_MEMCONTROL_PZQ_DISABLE |
  313. DMC_MEMCONTROL_MRR_BYTE_7_0,
  314. .memconfig = DMC_MEMCONFIGX_CHIP_MAP_INTERLEAVED |
  315. DMC_MEMCONFIGX_CHIP_COL_10 |
  316. DMC_MEMCONFIGX_CHIP_ROW_15 |
  317. DMC_MEMCONFIGX_CHIP_BANK_8,
  318. .membaseconfig0 = DMC_MEMBASECONFIG_VAL(0x40),
  319. .membaseconfig1 = DMC_MEMBASECONFIG_VAL(0x80),
  320. .prechconfig_tp_cnt = 0xff,
  321. .dpwrdn_cyc = 0xff,
  322. .dsref_cyc = 0xffff,
  323. .concontrol = DMC_CONCONTROL_DFI_INIT_START_DISABLE |
  324. DMC_CONCONTROL_TIMEOUT_LEVEL0 |
  325. DMC_CONCONTROL_RD_FETCH_DISABLE |
  326. DMC_CONCONTROL_EMPTY_DISABLE |
  327. DMC_CONCONTROL_AREF_EN_DISABLE |
  328. DMC_CONCONTROL_IO_PD_CON_DISABLE,
  329. .dmc_channels = 2,
  330. .chips_per_channel = 2,
  331. .chips_to_configure = 1,
  332. .send_zq_init = 1,
  333. .impedance = IMP_OUTPUT_DRV_30_OHM,
  334. .gate_leveling_enable = 0,
  335. }, {
  336. .mem_manuf = MEM_MANUF_SAMSUNG,
  337. .mem_type = DDR_MODE_DDR3,
  338. .frequency_mhz = 800,
  339. .mpll_mdiv = 0xc8,
  340. .mpll_pdiv = 0x3,
  341. .mpll_sdiv = 0x0,
  342. .cpll_mdiv = 0xde,
  343. .cpll_pdiv = 0x4,
  344. .cpll_sdiv = 0x2,
  345. .gpll_mdiv = 0x215,
  346. .gpll_pdiv = 0xc,
  347. .gpll_sdiv = 0x1,
  348. .epll_mdiv = 0x60,
  349. .epll_pdiv = 0x3,
  350. .epll_sdiv = 0x3,
  351. .vpll_mdiv = 0x96,
  352. .vpll_pdiv = 0x3,
  353. .vpll_sdiv = 0x2,
  354. .bpll_mdiv = 0x64,
  355. .bpll_pdiv = 0x3,
  356. .bpll_sdiv = 0x0,
  357. .pclk_cdrex_ratio = 0x5,
  358. .direct_cmd_msr = {
  359. 0x00020018, 0x00030000, 0x00010000, 0x00000d70
  360. },
  361. .timing_ref = 0x000000bb,
  362. .timing_row = 0x8c36650e,
  363. .timing_data = 0x3630580b,
  364. .timing_power = 0x41000a44,
  365. .phy0_dqs = 0x08080808,
  366. .phy1_dqs = 0x08080808,
  367. .phy0_dq = 0x08080808,
  368. .phy1_dq = 0x08080808,
  369. .phy0_tFS = 0x8,
  370. .phy1_tFS = 0x8,
  371. .phy0_pulld_dqs = 0xf,
  372. .phy1_pulld_dqs = 0xf,
  373. .lpddr3_ctrl_phy_reset = 0x1,
  374. .ctrl_start_point = 0x10,
  375. .ctrl_inc = 0x10,
  376. .ctrl_start = 0x1,
  377. .ctrl_dll_on = 0x1,
  378. .ctrl_ref = 0x8,
  379. .ctrl_force = 0x1a,
  380. .ctrl_rdlat = 0x0b,
  381. .ctrl_bstlen = 0x08,
  382. .fp_resync = 0x8,
  383. .iv_size = 0x7,
  384. .dfi_init_start = 1,
  385. .aref_en = 1,
  386. .rd_fetch = 0x3,
  387. .zq_mode_dds = 0x5,
  388. .zq_mode_term = 0x1,
  389. .zq_mode_noterm = 1,
  390. /*
  391. * Dynamic Clock: Always Running
  392. * Memory Burst length: 8
  393. * Number of chips: 1
  394. * Memory Bus width: 32 bit
  395. * Memory Type: DDR3
  396. * Additional Latancy for PLL: 0 Cycle
  397. */
  398. .memcontrol = DMC_MEMCONTROL_CLK_STOP_DISABLE |
  399. DMC_MEMCONTROL_DPWRDN_DISABLE |
  400. DMC_MEMCONTROL_DPWRDN_ACTIVE_PRECHARGE |
  401. DMC_MEMCONTROL_TP_DISABLE |
  402. DMC_MEMCONTROL_DSREF_ENABLE |
  403. DMC_MEMCONTROL_ADD_LAT_PALL_CYCLE(0) |
  404. DMC_MEMCONTROL_MEM_TYPE_DDR3 |
  405. DMC_MEMCONTROL_MEM_WIDTH_32BIT |
  406. DMC_MEMCONTROL_NUM_CHIP_1 |
  407. DMC_MEMCONTROL_BL_8 |
  408. DMC_MEMCONTROL_PZQ_DISABLE |
  409. DMC_MEMCONTROL_MRR_BYTE_7_0,
  410. .memconfig = DMC_MEMCONFIGX_CHIP_MAP_INTERLEAVED |
  411. DMC_MEMCONFIGX_CHIP_COL_10 |
  412. DMC_MEMCONFIGX_CHIP_ROW_15 |
  413. DMC_MEMCONFIGX_CHIP_BANK_8,
  414. .membaseconfig0 = DMC_MEMBASECONFIG_VAL(0x40),
  415. .membaseconfig1 = DMC_MEMBASECONFIG_VAL(0x80),
  416. .prechconfig_tp_cnt = 0xff,
  417. .dpwrdn_cyc = 0xff,
  418. .dsref_cyc = 0xffff,
  419. .concontrol = DMC_CONCONTROL_DFI_INIT_START_DISABLE |
  420. DMC_CONCONTROL_TIMEOUT_LEVEL0 |
  421. DMC_CONCONTROL_RD_FETCH_DISABLE |
  422. DMC_CONCONTROL_EMPTY_DISABLE |
  423. DMC_CONCONTROL_AREF_EN_DISABLE |
  424. DMC_CONCONTROL_IO_PD_CON_DISABLE,
  425. .dmc_channels = 2,
  426. .chips_per_channel = 2,
  427. .chips_to_configure = 1,
  428. .send_zq_init = 1,
  429. .impedance = IMP_OUTPUT_DRV_40_OHM,
  430. .gate_leveling_enable = 1,
  431. }
  432. #endif
  433. };
  434. /**
  435. * Get the required memory type and speed (SPL version).
  436. *
  437. * In SPL we have no device tree, so we use the machine parameters
  438. *
  439. * @param mem_type Returns memory type
  440. * @param frequency_mhz Returns memory speed in MHz
  441. * @param arm_freq Returns ARM clock speed in MHz
  442. * @param mem_manuf Return Memory Manufacturer name
  443. */
  444. static void clock_get_mem_selection(enum ddr_mode *mem_type,
  445. unsigned *frequency_mhz, unsigned *arm_freq,
  446. enum mem_manuf *mem_manuf)
  447. {
  448. struct spl_machine_param *params;
  449. params = spl_get_machine_params();
  450. *mem_type = params->mem_type;
  451. *frequency_mhz = params->frequency_mhz;
  452. *arm_freq = params->arm_freq_mhz;
  453. *mem_manuf = params->mem_manuf;
  454. }
  455. /* Get the ratios for setting ARM clock */
  456. struct arm_clk_ratios *get_arm_ratios(void)
  457. {
  458. struct arm_clk_ratios *arm_ratio;
  459. enum ddr_mode mem_type;
  460. enum mem_manuf mem_manuf;
  461. unsigned frequency_mhz, arm_freq;
  462. int i;
  463. clock_get_mem_selection(&mem_type, &frequency_mhz,
  464. &arm_freq, &mem_manuf);
  465. for (i = 0, arm_ratio = arm_clk_ratios; i < ARRAY_SIZE(arm_clk_ratios);
  466. i++, arm_ratio++) {
  467. if (arm_ratio->arm_freq_mhz == arm_freq)
  468. return arm_ratio;
  469. }
  470. /* will hang if failed to find clock ratio */
  471. while (1)
  472. ;
  473. return NULL;
  474. }
  475. struct mem_timings *clock_get_mem_timings(void)
  476. {
  477. struct mem_timings *mem;
  478. enum ddr_mode mem_type;
  479. enum mem_manuf mem_manuf;
  480. unsigned frequency_mhz, arm_freq;
  481. int i;
  482. clock_get_mem_selection(&mem_type, &frequency_mhz,
  483. &arm_freq, &mem_manuf);
  484. for (i = 0, mem = mem_timings; i < ARRAY_SIZE(mem_timings);
  485. i++, mem++) {
  486. if (mem->mem_type == mem_type &&
  487. mem->frequency_mhz == frequency_mhz &&
  488. mem->mem_manuf == mem_manuf)
  489. return mem;
  490. }
  491. /* will hang if failed to find memory timings */
  492. while (1)
  493. ;
  494. return NULL;
  495. }
  496. static void exynos5250_system_clock_init(void)
  497. {
  498. struct exynos5_clock *clk =
  499. (struct exynos5_clock *)samsung_get_base_clock();
  500. struct mem_timings *mem;
  501. struct arm_clk_ratios *arm_clk_ratio;
  502. u32 val, tmp;
  503. mem = clock_get_mem_timings();
  504. arm_clk_ratio = get_arm_ratios();
  505. clrbits_le32(&clk->src_cpu, MUX_APLL_SEL_MASK);
  506. do {
  507. val = readl(&clk->mux_stat_cpu);
  508. } while ((val | MUX_APLL_SEL_MASK) != val);
  509. clrbits_le32(&clk->src_core1, MUX_MPLL_SEL_MASK);
  510. do {
  511. val = readl(&clk->mux_stat_core1);
  512. } while ((val | MUX_MPLL_SEL_MASK) != val);
  513. clrbits_le32(&clk->src_top2, MUX_CPLL_SEL_MASK);
  514. clrbits_le32(&clk->src_top2, MUX_EPLL_SEL_MASK);
  515. clrbits_le32(&clk->src_top2, MUX_VPLL_SEL_MASK);
  516. clrbits_le32(&clk->src_top2, MUX_GPLL_SEL_MASK);
  517. tmp = MUX_CPLL_SEL_MASK | MUX_EPLL_SEL_MASK | MUX_VPLL_SEL_MASK
  518. | MUX_GPLL_SEL_MASK;
  519. do {
  520. val = readl(&clk->mux_stat_top2);
  521. } while ((val | tmp) != val);
  522. clrbits_le32(&clk->src_cdrex, MUX_BPLL_SEL_MASK);
  523. do {
  524. val = readl(&clk->mux_stat_cdrex);
  525. } while ((val | MUX_BPLL_SEL_MASK) != val);
  526. /* PLL locktime */
  527. writel(mem->apll_pdiv * PLL_LOCK_FACTOR, &clk->apll_lock);
  528. writel(mem->mpll_pdiv * PLL_LOCK_FACTOR, &clk->mpll_lock);
  529. writel(mem->bpll_pdiv * PLL_LOCK_FACTOR, &clk->bpll_lock);
  530. writel(mem->cpll_pdiv * PLL_LOCK_FACTOR, &clk->cpll_lock);
  531. writel(mem->gpll_pdiv * PLL_X_LOCK_FACTOR, &clk->gpll_lock);
  532. writel(mem->epll_pdiv * PLL_X_LOCK_FACTOR, &clk->epll_lock);
  533. writel(mem->vpll_pdiv * PLL_X_LOCK_FACTOR, &clk->vpll_lock);
  534. writel(CLK_REG_DISABLE, &clk->pll_div2_sel);
  535. writel(MUX_HPM_SEL_MASK, &clk->src_cpu);
  536. do {
  537. val = readl(&clk->mux_stat_cpu);
  538. } while ((val | HPM_SEL_SCLK_MPLL) != val);
  539. val = arm_clk_ratio->arm2_ratio << 28
  540. | arm_clk_ratio->apll_ratio << 24
  541. | arm_clk_ratio->pclk_dbg_ratio << 20
  542. | arm_clk_ratio->atb_ratio << 16
  543. | arm_clk_ratio->periph_ratio << 12
  544. | arm_clk_ratio->acp_ratio << 8
  545. | arm_clk_ratio->cpud_ratio << 4
  546. | arm_clk_ratio->arm_ratio;
  547. writel(val, &clk->div_cpu0);
  548. do {
  549. val = readl(&clk->div_stat_cpu0);
  550. } while (0 != val);
  551. writel(CLK_DIV_CPU1_VAL, &clk->div_cpu1);
  552. do {
  553. val = readl(&clk->div_stat_cpu1);
  554. } while (0 != val);
  555. /* Set APLL */
  556. writel(APLL_CON1_VAL, &clk->apll_con1);
  557. val = set_pll(arm_clk_ratio->apll_mdiv, arm_clk_ratio->apll_pdiv,
  558. arm_clk_ratio->apll_sdiv);
  559. writel(val, &clk->apll_con0);
  560. while ((readl(&clk->apll_con0) & APLL_CON0_LOCKED) == 0)
  561. ;
  562. /* Set MPLL */
  563. writel(MPLL_CON1_VAL, &clk->mpll_con1);
  564. val = set_pll(mem->mpll_mdiv, mem->mpll_pdiv, mem->mpll_sdiv);
  565. writel(val, &clk->mpll_con0);
  566. while ((readl(&clk->mpll_con0) & MPLL_CON0_LOCKED) == 0)
  567. ;
  568. /* Set BPLL */
  569. writel(BPLL_CON1_VAL, &clk->bpll_con1);
  570. val = set_pll(mem->bpll_mdiv, mem->bpll_pdiv, mem->bpll_sdiv);
  571. writel(val, &clk->bpll_con0);
  572. while ((readl(&clk->bpll_con0) & BPLL_CON0_LOCKED) == 0)
  573. ;
  574. /* Set CPLL */
  575. writel(CPLL_CON1_VAL, &clk->cpll_con1);
  576. val = set_pll(mem->cpll_mdiv, mem->cpll_pdiv, mem->cpll_sdiv);
  577. writel(val, &clk->cpll_con0);
  578. while ((readl(&clk->cpll_con0) & CPLL_CON0_LOCKED) == 0)
  579. ;
  580. /* Set GPLL */
  581. writel(GPLL_CON1_VAL, &clk->gpll_con1);
  582. val = set_pll(mem->gpll_mdiv, mem->gpll_pdiv, mem->gpll_sdiv);
  583. writel(val, &clk->gpll_con0);
  584. while ((readl(&clk->gpll_con0) & GPLL_CON0_LOCKED) == 0)
  585. ;
  586. /* Set EPLL */
  587. writel(EPLL_CON2_VAL, &clk->epll_con2);
  588. writel(EPLL_CON1_VAL, &clk->epll_con1);
  589. val = set_pll(mem->epll_mdiv, mem->epll_pdiv, mem->epll_sdiv);
  590. writel(val, &clk->epll_con0);
  591. while ((readl(&clk->epll_con0) & EPLL_CON0_LOCKED) == 0)
  592. ;
  593. /* Set VPLL */
  594. writel(VPLL_CON2_VAL, &clk->vpll_con2);
  595. writel(VPLL_CON1_VAL, &clk->vpll_con1);
  596. val = set_pll(mem->vpll_mdiv, mem->vpll_pdiv, mem->vpll_sdiv);
  597. writel(val, &clk->vpll_con0);
  598. while ((readl(&clk->vpll_con0) & VPLL_CON0_LOCKED) == 0)
  599. ;
  600. writel(CLK_SRC_CORE0_VAL, &clk->src_core0);
  601. writel(CLK_DIV_CORE0_VAL, &clk->div_core0);
  602. while (readl(&clk->div_stat_core0) != 0)
  603. ;
  604. writel(CLK_DIV_CORE1_VAL, &clk->div_core1);
  605. while (readl(&clk->div_stat_core1) != 0)
  606. ;
  607. writel(CLK_DIV_SYSRGT_VAL, &clk->div_sysrgt);
  608. while (readl(&clk->div_stat_sysrgt) != 0)
  609. ;
  610. writel(CLK_DIV_ACP_VAL, &clk->div_acp);
  611. while (readl(&clk->div_stat_acp) != 0)
  612. ;
  613. writel(CLK_DIV_SYSLFT_VAL, &clk->div_syslft);
  614. while (readl(&clk->div_stat_syslft) != 0)
  615. ;
  616. writel(CLK_SRC_TOP0_VAL, &clk->src_top0);
  617. writel(CLK_SRC_TOP1_VAL, &clk->src_top1);
  618. writel(TOP2_VAL, &clk->src_top2);
  619. writel(CLK_SRC_TOP3_VAL, &clk->src_top3);
  620. writel(CLK_DIV_TOP0_VAL, &clk->div_top0);
  621. while (readl(&clk->div_stat_top0))
  622. ;
  623. writel(CLK_DIV_TOP1_VAL, &clk->div_top1);
  624. while (readl(&clk->div_stat_top1))
  625. ;
  626. writel(CLK_SRC_LEX_VAL, &clk->src_lex);
  627. while (1) {
  628. val = readl(&clk->mux_stat_lex);
  629. if (val == (val | 1))
  630. break;
  631. }
  632. writel(CLK_DIV_LEX_VAL, &clk->div_lex);
  633. while (readl(&clk->div_stat_lex))
  634. ;
  635. writel(CLK_DIV_R0X_VAL, &clk->div_r0x);
  636. while (readl(&clk->div_stat_r0x))
  637. ;
  638. writel(CLK_DIV_R0X_VAL, &clk->div_r0x);
  639. while (readl(&clk->div_stat_r0x))
  640. ;
  641. writel(CLK_DIV_R1X_VAL, &clk->div_r1x);
  642. while (readl(&clk->div_stat_r1x))
  643. ;
  644. writel(CLK_REG_DISABLE, &clk->src_cdrex);
  645. writel(CLK_DIV_CDREX_VAL, &clk->div_cdrex);
  646. while (readl(&clk->div_stat_cdrex))
  647. ;
  648. val = readl(&clk->src_cpu);
  649. val |= CLK_SRC_CPU_VAL;
  650. writel(val, &clk->src_cpu);
  651. val = readl(&clk->src_top2);
  652. val |= CLK_SRC_TOP2_VAL;
  653. writel(val, &clk->src_top2);
  654. val = readl(&clk->src_core1);
  655. val |= CLK_SRC_CORE1_VAL;
  656. writel(val, &clk->src_core1);
  657. writel(CLK_SRC_FSYS0_VAL, &clk->src_fsys);
  658. writel(CLK_DIV_FSYS0_VAL, &clk->div_fsys0);
  659. while (readl(&clk->div_stat_fsys0))
  660. ;
  661. writel(CLK_REG_DISABLE, &clk->clkout_cmu_cpu);
  662. writel(CLK_REG_DISABLE, &clk->clkout_cmu_core);
  663. writel(CLK_REG_DISABLE, &clk->clkout_cmu_acp);
  664. writel(CLK_REG_DISABLE, &clk->clkout_cmu_top);
  665. writel(CLK_REG_DISABLE, &clk->clkout_cmu_lex);
  666. writel(CLK_REG_DISABLE, &clk->clkout_cmu_r0x);
  667. writel(CLK_REG_DISABLE, &clk->clkout_cmu_r1x);
  668. writel(CLK_REG_DISABLE, &clk->clkout_cmu_cdrex);
  669. writel(CLK_SRC_PERIC0_VAL, &clk->src_peric0);
  670. writel(CLK_DIV_PERIC0_VAL, &clk->div_peric0);
  671. writel(CLK_SRC_PERIC1_VAL, &clk->src_peric1);
  672. writel(CLK_DIV_PERIC1_VAL, &clk->div_peric1);
  673. writel(CLK_DIV_PERIC2_VAL, &clk->div_peric2);
  674. writel(CLK_DIV_PERIC3_VAL, &clk->div_peric3);
  675. writel(SCLK_SRC_ISP_VAL, &clk->sclk_src_isp);
  676. writel(SCLK_DIV_ISP_VAL, &clk->sclk_div_isp);
  677. writel(CLK_DIV_ISP0_VAL, &clk->div_isp0);
  678. writel(CLK_DIV_ISP1_VAL, &clk->div_isp1);
  679. writel(CLK_DIV_ISP2_VAL, &clk->div_isp2);
  680. /* FIMD1 SRC CLK SELECTION */
  681. writel(CLK_SRC_DISP1_0_VAL, &clk->src_disp1_0);
  682. val = MMC2_PRE_RATIO_VAL << MMC2_PRE_RATIO_OFFSET
  683. | MMC2_RATIO_VAL << MMC2_RATIO_OFFSET
  684. | MMC3_PRE_RATIO_VAL << MMC3_PRE_RATIO_OFFSET
  685. | MMC3_RATIO_VAL << MMC3_RATIO_OFFSET;
  686. writel(val, &clk->div_fsys2);
  687. }
  688. static void exynos5420_system_clock_init(void)
  689. {
  690. struct exynos5420_clock *clk =
  691. (struct exynos5420_clock *)samsung_get_base_clock();
  692. struct mem_timings *mem;
  693. struct arm_clk_ratios *arm_clk_ratio;
  694. u32 val;
  695. mem = clock_get_mem_timings();
  696. arm_clk_ratio = get_arm_ratios();
  697. /* PLL locktime */
  698. writel(arm_clk_ratio->apll_pdiv * PLL_LOCK_FACTOR, &clk->apll_lock);
  699. writel(mem->mpll_pdiv * PLL_LOCK_FACTOR, &clk->mpll_lock);
  700. writel(mem->bpll_pdiv * PLL_LOCK_FACTOR, &clk->bpll_lock);
  701. writel(mem->cpll_pdiv * PLL_LOCK_FACTOR, &clk->cpll_lock);
  702. writel(mem->dpll_pdiv * PLL_LOCK_FACTOR, &clk->dpll_lock);
  703. writel(mem->epll_pdiv * PLL_X_LOCK_FACTOR, &clk->epll_lock);
  704. writel(mem->vpll_pdiv * PLL_LOCK_FACTOR, &clk->vpll_lock);
  705. writel(mem->ipll_pdiv * PLL_LOCK_FACTOR, &clk->ipll_lock);
  706. writel(mem->spll_pdiv * PLL_LOCK_FACTOR, &clk->spll_lock);
  707. writel(mem->kpll_pdiv * PLL_LOCK_FACTOR, &clk->kpll_lock);
  708. writel(mem->rpll_pdiv * PLL_X_LOCK_FACTOR, &clk->rpll_lock);
  709. setbits_le32(&clk->src_cpu, MUX_HPM_SEL_MASK);
  710. writel(0, &clk->src_top6);
  711. writel(0, &clk->src_cdrex);
  712. writel(SRC_KFC_HPM_SEL, &clk->src_kfc);
  713. writel(HPM_RATIO, &clk->div_cpu1);
  714. writel(CLK_DIV_CPU0_VAL, &clk->div_cpu0);
  715. /* switch A15 clock source to OSC clock before changing APLL */
  716. clrbits_le32(&clk->src_cpu, APLL_FOUT);
  717. /* Set APLL */
  718. writel(APLL_CON1_VAL, &clk->apll_con1);
  719. val = set_pll(arm_clk_ratio->apll_mdiv,
  720. arm_clk_ratio->apll_pdiv,
  721. arm_clk_ratio->apll_sdiv);
  722. writel(val, &clk->apll_con0);
  723. while ((readl(&clk->apll_con0) & PLL_LOCKED) == 0)
  724. ;
  725. /* now it is safe to switch to APLL */
  726. setbits_le32(&clk->src_cpu, APLL_FOUT);
  727. writel(SRC_KFC_HPM_SEL, &clk->src_kfc);
  728. writel(CLK_DIV_KFC_VAL, &clk->div_kfc0);
  729. /* switch A7 clock source to OSC clock before changing KPLL */
  730. clrbits_le32(&clk->src_kfc, KPLL_FOUT);
  731. /* Set KPLL*/
  732. writel(KPLL_CON1_VAL, &clk->kpll_con1);
  733. val = set_pll(mem->kpll_mdiv, mem->kpll_pdiv, mem->kpll_sdiv);
  734. writel(val, &clk->kpll_con0);
  735. while ((readl(&clk->kpll_con0) & PLL_LOCKED) == 0)
  736. ;
  737. /* now it is safe to switch to KPLL */
  738. setbits_le32(&clk->src_kfc, KPLL_FOUT);
  739. /* Set MPLL */
  740. writel(MPLL_CON1_VAL, &clk->mpll_con1);
  741. val = set_pll(mem->mpll_mdiv, mem->mpll_pdiv, mem->mpll_sdiv);
  742. writel(val, &clk->mpll_con0);
  743. while ((readl(&clk->mpll_con0) & PLL_LOCKED) == 0)
  744. ;
  745. /* Set DPLL */
  746. writel(DPLL_CON1_VAL, &clk->dpll_con1);
  747. val = set_pll(mem->dpll_mdiv, mem->dpll_pdiv, mem->dpll_sdiv);
  748. writel(val, &clk->dpll_con0);
  749. while ((readl(&clk->dpll_con0) & PLL_LOCKED) == 0)
  750. ;
  751. /* Set EPLL */
  752. writel(EPLL_CON2_VAL, &clk->epll_con2);
  753. writel(EPLL_CON1_VAL, &clk->epll_con1);
  754. val = set_pll(mem->epll_mdiv, mem->epll_pdiv, mem->epll_sdiv);
  755. writel(val, &clk->epll_con0);
  756. while ((readl(&clk->epll_con0) & PLL_LOCKED) == 0)
  757. ;
  758. /* Set CPLL */
  759. writel(CPLL_CON1_VAL, &clk->cpll_con1);
  760. val = set_pll(mem->cpll_mdiv, mem->cpll_pdiv, mem->cpll_sdiv);
  761. writel(val, &clk->cpll_con0);
  762. while ((readl(&clk->cpll_con0) & PLL_LOCKED) == 0)
  763. ;
  764. /* Set IPLL */
  765. writel(IPLL_CON1_VAL, &clk->ipll_con1);
  766. val = set_pll(mem->ipll_mdiv, mem->ipll_pdiv, mem->ipll_sdiv);
  767. writel(val, &clk->ipll_con0);
  768. while ((readl(&clk->ipll_con0) & PLL_LOCKED) == 0)
  769. ;
  770. /* Set VPLL */
  771. writel(VPLL_CON1_VAL, &clk->vpll_con1);
  772. val = set_pll(mem->vpll_mdiv, mem->vpll_pdiv, mem->vpll_sdiv);
  773. writel(val, &clk->vpll_con0);
  774. while ((readl(&clk->vpll_con0) & PLL_LOCKED) == 0)
  775. ;
  776. /* Set BPLL */
  777. writel(BPLL_CON1_VAL, &clk->bpll_con1);
  778. val = set_pll(mem->bpll_mdiv, mem->bpll_pdiv, mem->bpll_sdiv);
  779. writel(val, &clk->bpll_con0);
  780. while ((readl(&clk->bpll_con0) & PLL_LOCKED) == 0)
  781. ;
  782. /* Set SPLL */
  783. writel(SPLL_CON1_VAL, &clk->spll_con1);
  784. val = set_pll(mem->spll_mdiv, mem->spll_pdiv, mem->spll_sdiv);
  785. writel(val, &clk->spll_con0);
  786. while ((readl(&clk->spll_con0) & PLL_LOCKED) == 0)
  787. ;
  788. /* Set RPLL */
  789. writel(RPLL_CON2_VAL, &clk->rpll_con2);
  790. writel(RPLL_CON1_VAL, &clk->rpll_con1);
  791. val = set_pll(mem->rpll_mdiv, mem->rpll_pdiv, mem->rpll_sdiv);
  792. writel(val, &clk->rpll_con0);
  793. while ((readl(&clk->rpll_con0) & PLL_LOCKED) == 0)
  794. ;
  795. writel(CLK_DIV_CDREX0_VAL, &clk->div_cdrex0);
  796. writel(CLK_DIV_CDREX1_VAL, &clk->div_cdrex1);
  797. writel(CLK_SRC_TOP0_VAL, &clk->src_top0);
  798. writel(CLK_SRC_TOP1_VAL, &clk->src_top1);
  799. writel(CLK_SRC_TOP2_VAL, &clk->src_top2);
  800. writel(CLK_SRC_TOP7_VAL, &clk->src_top7);
  801. writel(CLK_DIV_TOP0_VAL, &clk->div_top0);
  802. writel(CLK_DIV_TOP1_VAL, &clk->div_top1);
  803. writel(CLK_DIV_TOP2_VAL, &clk->div_top2);
  804. writel(0, &clk->src_top10);
  805. writel(0, &clk->src_top11);
  806. writel(0, &clk->src_top12);
  807. writel(CLK_SRC_TOP3_VAL, &clk->src_top3);
  808. writel(CLK_SRC_TOP4_VAL, &clk->src_top4);
  809. writel(CLK_SRC_TOP5_VAL, &clk->src_top5);
  810. /* DISP1 BLK CLK SELECTION */
  811. writel(CLK_SRC_DISP1_0_VAL, &clk->src_disp10);
  812. writel(CLK_DIV_DISP1_0_VAL, &clk->div_disp10);
  813. /* AUDIO BLK */
  814. writel(AUDIO0_SEL_EPLL, &clk->src_mau);
  815. writel(DIV_MAU_VAL, &clk->div_mau);
  816. /* FSYS */
  817. writel(CLK_SRC_FSYS0_VAL, &clk->src_fsys);
  818. writel(CLK_DIV_FSYS0_VAL, &clk->div_fsys0);
  819. writel(CLK_DIV_FSYS1_VAL, &clk->div_fsys1);
  820. writel(CLK_DIV_FSYS2_VAL, &clk->div_fsys2);
  821. writel(CLK_SRC_ISP_VAL, &clk->src_isp);
  822. writel(CLK_DIV_ISP0_VAL, &clk->div_isp0);
  823. writel(CLK_DIV_ISP1_VAL, &clk->div_isp1);
  824. writel(CLK_SRC_PERIC0_VAL, &clk->src_peric0);
  825. writel(CLK_SRC_PERIC1_VAL, &clk->src_peric1);
  826. writel(CLK_DIV_PERIC0_VAL, &clk->div_peric0);
  827. writel(CLK_DIV_PERIC1_VAL, &clk->div_peric1);
  828. writel(CLK_DIV_PERIC2_VAL, &clk->div_peric2);
  829. writel(CLK_DIV_PERIC3_VAL, &clk->div_peric3);
  830. writel(CLK_DIV_PERIC4_VAL, &clk->div_peric4);
  831. writel(CLK_DIV_CPERI1_VAL, &clk->div_cperi1);
  832. writel(CLK_DIV2_RATIO, &clk->clkdiv2_ratio);
  833. writel(CLK_DIV4_RATIO, &clk->clkdiv4_ratio);
  834. writel(CLK_DIV_G2D, &clk->div_g2d);
  835. writel(CLK_SRC_TOP6_VAL, &clk->src_top6);
  836. writel(CLK_SRC_CDREX_VAL, &clk->src_cdrex);
  837. writel(CLK_SRC_KFC_VAL, &clk->src_kfc);
  838. }
  839. void system_clock_init(void)
  840. {
  841. if (proid_is_exynos5420() || proid_is_exynos5422())
  842. exynos5420_system_clock_init();
  843. else
  844. exynos5250_system_clock_init();
  845. }
  846. void clock_init_dp_clock(void)
  847. {
  848. struct exynos5_clock *clk =
  849. (struct exynos5_clock *)samsung_get_base_clock();
  850. /* DP clock enable */
  851. setbits_le32(&clk->gate_ip_disp1, CLK_GATE_DP1_ALLOW);
  852. /* We run DP at 267 Mhz */
  853. setbits_le32(&clk->div_disp1_0, CLK_DIV_DISP1_0_FIMD1);
  854. }
  855. /*
  856. * Set clock divisor value for booting from EMMC.
  857. * Set DWMMC channel-0 clk div to operate mmc0 device at 50MHz.
  858. */
  859. void emmc_boot_clk_div_set(void)
  860. {
  861. struct exynos5_clock *clk =
  862. (struct exynos5_clock *)samsung_get_base_clock();
  863. unsigned int div_mmc;
  864. div_mmc = readl((unsigned int) &clk->div_fsys1) & ~FSYS1_MMC0_DIV_MASK;
  865. div_mmc |= FSYS1_MMC0_DIV_VAL;
  866. writel(div_mmc, (unsigned int) &clk->div_fsys1);
  867. }