clock.c 28 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216
  1. /* linux/arch/arm/mach-exynos4/clock.c
  2. *
  3. * Copyright (c) 2010-2011 Samsung Electronics Co., Ltd.
  4. * http://www.samsung.com
  5. *
  6. * EXYNOS4 - Clock support
  7. *
  8. * This program is free software; you can redistribute it and/or modify
  9. * it under the terms of the GNU General Public License version 2 as
  10. * published by the Free Software Foundation.
  11. */
  12. #include <linux/kernel.h>
  13. #include <linux/err.h>
  14. #include <linux/io.h>
  15. #include <plat/cpu-freq.h>
  16. #include <plat/clock.h>
  17. #include <plat/cpu.h>
  18. #include <plat/pll.h>
  19. #include <plat/s5p-clock.h>
  20. #include <plat/clock-clksrc.h>
  21. #include <mach/map.h>
  22. #include <mach/regs-clock.h>
  23. #include <mach/sysmmu.h>
  24. static struct clk clk_sclk_hdmi27m = {
  25. .name = "sclk_hdmi27m",
  26. .id = -1,
  27. .rate = 27000000,
  28. };
  29. static struct clk clk_sclk_hdmiphy = {
  30. .name = "sclk_hdmiphy",
  31. .id = -1,
  32. };
  33. static struct clk clk_sclk_usbphy0 = {
  34. .name = "sclk_usbphy0",
  35. .id = -1,
  36. .rate = 27000000,
  37. };
  38. static struct clk clk_sclk_usbphy1 = {
  39. .name = "sclk_usbphy1",
  40. .id = -1,
  41. };
  42. static int exynos4_clksrc_mask_top_ctrl(struct clk *clk, int enable)
  43. {
  44. return s5p_gatectrl(S5P_CLKSRC_MASK_TOP, clk, enable);
  45. }
  46. static int exynos4_clksrc_mask_cam_ctrl(struct clk *clk, int enable)
  47. {
  48. return s5p_gatectrl(S5P_CLKSRC_MASK_CAM, clk, enable);
  49. }
  50. static int exynos4_clksrc_mask_lcd0_ctrl(struct clk *clk, int enable)
  51. {
  52. return s5p_gatectrl(S5P_CLKSRC_MASK_LCD0, clk, enable);
  53. }
  54. static int exynos4_clksrc_mask_lcd1_ctrl(struct clk *clk, int enable)
  55. {
  56. return s5p_gatectrl(S5P_CLKSRC_MASK_LCD1, clk, enable);
  57. }
  58. static int exynos4_clksrc_mask_fsys_ctrl(struct clk *clk, int enable)
  59. {
  60. return s5p_gatectrl(S5P_CLKSRC_MASK_FSYS, clk, enable);
  61. }
  62. static int exynos4_clksrc_mask_peril0_ctrl(struct clk *clk, int enable)
  63. {
  64. return s5p_gatectrl(S5P_CLKSRC_MASK_PERIL0, clk, enable);
  65. }
  66. static int exynos4_clksrc_mask_peril1_ctrl(struct clk *clk, int enable)
  67. {
  68. return s5p_gatectrl(S5P_CLKSRC_MASK_PERIL1, clk, enable);
  69. }
  70. static int exynos4_clk_ip_mfc_ctrl(struct clk *clk, int enable)
  71. {
  72. return s5p_gatectrl(S5P_CLKGATE_IP_MFC, clk, enable);
  73. }
  74. static int exynos4_clk_ip_cam_ctrl(struct clk *clk, int enable)
  75. {
  76. return s5p_gatectrl(S5P_CLKGATE_IP_CAM, clk, enable);
  77. }
  78. static int exynos4_clk_ip_tv_ctrl(struct clk *clk, int enable)
  79. {
  80. return s5p_gatectrl(S5P_CLKGATE_IP_TV, clk, enable);
  81. }
  82. static int exynos4_clk_ip_image_ctrl(struct clk *clk, int enable)
  83. {
  84. return s5p_gatectrl(S5P_CLKGATE_IP_IMAGE, clk, enable);
  85. }
  86. static int exynos4_clk_ip_lcd0_ctrl(struct clk *clk, int enable)
  87. {
  88. return s5p_gatectrl(S5P_CLKGATE_IP_LCD0, clk, enable);
  89. }
  90. static int exynos4_clk_ip_lcd1_ctrl(struct clk *clk, int enable)
  91. {
  92. return s5p_gatectrl(S5P_CLKGATE_IP_LCD1, clk, enable);
  93. }
  94. static int exynos4_clk_ip_fsys_ctrl(struct clk *clk, int enable)
  95. {
  96. return s5p_gatectrl(S5P_CLKGATE_IP_FSYS, clk, enable);
  97. }
  98. static int exynos4_clk_ip_peril_ctrl(struct clk *clk, int enable)
  99. {
  100. return s5p_gatectrl(S5P_CLKGATE_IP_PERIL, clk, enable);
  101. }
  102. static int exynos4_clk_ip_perir_ctrl(struct clk *clk, int enable)
  103. {
  104. return s5p_gatectrl(S5P_CLKGATE_IP_PERIR, clk, enable);
  105. }
  106. /* Core list of CMU_CPU side */
  107. static struct clksrc_clk clk_mout_apll = {
  108. .clk = {
  109. .name = "mout_apll",
  110. .id = -1,
  111. },
  112. .sources = &clk_src_apll,
  113. .reg_src = { .reg = S5P_CLKSRC_CPU, .shift = 0, .size = 1 },
  114. };
  115. static struct clksrc_clk clk_sclk_apll = {
  116. .clk = {
  117. .name = "sclk_apll",
  118. .id = -1,
  119. .parent = &clk_mout_apll.clk,
  120. },
  121. .reg_div = { .reg = S5P_CLKDIV_CPU, .shift = 24, .size = 3 },
  122. };
  123. static struct clksrc_clk clk_mout_epll = {
  124. .clk = {
  125. .name = "mout_epll",
  126. .id = -1,
  127. },
  128. .sources = &clk_src_epll,
  129. .reg_src = { .reg = S5P_CLKSRC_TOP0, .shift = 4, .size = 1 },
  130. };
  131. static struct clksrc_clk clk_mout_mpll = {
  132. .clk = {
  133. .name = "mout_mpll",
  134. .id = -1,
  135. },
  136. .sources = &clk_src_mpll,
  137. .reg_src = { .reg = S5P_CLKSRC_CPU, .shift = 8, .size = 1 },
  138. };
  139. static struct clk *clkset_moutcore_list[] = {
  140. [0] = &clk_mout_apll.clk,
  141. [1] = &clk_mout_mpll.clk,
  142. };
  143. static struct clksrc_sources clkset_moutcore = {
  144. .sources = clkset_moutcore_list,
  145. .nr_sources = ARRAY_SIZE(clkset_moutcore_list),
  146. };
  147. static struct clksrc_clk clk_moutcore = {
  148. .clk = {
  149. .name = "moutcore",
  150. .id = -1,
  151. },
  152. .sources = &clkset_moutcore,
  153. .reg_src = { .reg = S5P_CLKSRC_CPU, .shift = 16, .size = 1 },
  154. };
  155. static struct clksrc_clk clk_coreclk = {
  156. .clk = {
  157. .name = "core_clk",
  158. .id = -1,
  159. .parent = &clk_moutcore.clk,
  160. },
  161. .reg_div = { .reg = S5P_CLKDIV_CPU, .shift = 0, .size = 3 },
  162. };
  163. static struct clksrc_clk clk_armclk = {
  164. .clk = {
  165. .name = "armclk",
  166. .id = -1,
  167. .parent = &clk_coreclk.clk,
  168. },
  169. };
  170. static struct clksrc_clk clk_aclk_corem0 = {
  171. .clk = {
  172. .name = "aclk_corem0",
  173. .id = -1,
  174. .parent = &clk_coreclk.clk,
  175. },
  176. .reg_div = { .reg = S5P_CLKDIV_CPU, .shift = 4, .size = 3 },
  177. };
  178. static struct clksrc_clk clk_aclk_cores = {
  179. .clk = {
  180. .name = "aclk_cores",
  181. .id = -1,
  182. .parent = &clk_coreclk.clk,
  183. },
  184. .reg_div = { .reg = S5P_CLKDIV_CPU, .shift = 4, .size = 3 },
  185. };
  186. static struct clksrc_clk clk_aclk_corem1 = {
  187. .clk = {
  188. .name = "aclk_corem1",
  189. .id = -1,
  190. .parent = &clk_coreclk.clk,
  191. },
  192. .reg_div = { .reg = S5P_CLKDIV_CPU, .shift = 8, .size = 3 },
  193. };
  194. static struct clksrc_clk clk_periphclk = {
  195. .clk = {
  196. .name = "periphclk",
  197. .id = -1,
  198. .parent = &clk_coreclk.clk,
  199. },
  200. .reg_div = { .reg = S5P_CLKDIV_CPU, .shift = 12, .size = 3 },
  201. };
  202. /* Core list of CMU_CORE side */
  203. static struct clk *clkset_corebus_list[] = {
  204. [0] = &clk_mout_mpll.clk,
  205. [1] = &clk_sclk_apll.clk,
  206. };
  207. static struct clksrc_sources clkset_mout_corebus = {
  208. .sources = clkset_corebus_list,
  209. .nr_sources = ARRAY_SIZE(clkset_corebus_list),
  210. };
  211. static struct clksrc_clk clk_mout_corebus = {
  212. .clk = {
  213. .name = "mout_corebus",
  214. .id = -1,
  215. },
  216. .sources = &clkset_mout_corebus,
  217. .reg_src = { .reg = S5P_CLKSRC_DMC, .shift = 4, .size = 1 },
  218. };
  219. static struct clksrc_clk clk_sclk_dmc = {
  220. .clk = {
  221. .name = "sclk_dmc",
  222. .id = -1,
  223. .parent = &clk_mout_corebus.clk,
  224. },
  225. .reg_div = { .reg = S5P_CLKDIV_DMC0, .shift = 12, .size = 3 },
  226. };
  227. static struct clksrc_clk clk_aclk_cored = {
  228. .clk = {
  229. .name = "aclk_cored",
  230. .id = -1,
  231. .parent = &clk_sclk_dmc.clk,
  232. },
  233. .reg_div = { .reg = S5P_CLKDIV_DMC0, .shift = 16, .size = 3 },
  234. };
  235. static struct clksrc_clk clk_aclk_corep = {
  236. .clk = {
  237. .name = "aclk_corep",
  238. .id = -1,
  239. .parent = &clk_aclk_cored.clk,
  240. },
  241. .reg_div = { .reg = S5P_CLKDIV_DMC0, .shift = 20, .size = 3 },
  242. };
  243. static struct clksrc_clk clk_aclk_acp = {
  244. .clk = {
  245. .name = "aclk_acp",
  246. .id = -1,
  247. .parent = &clk_mout_corebus.clk,
  248. },
  249. .reg_div = { .reg = S5P_CLKDIV_DMC0, .shift = 0, .size = 3 },
  250. };
  251. static struct clksrc_clk clk_pclk_acp = {
  252. .clk = {
  253. .name = "pclk_acp",
  254. .id = -1,
  255. .parent = &clk_aclk_acp.clk,
  256. },
  257. .reg_div = { .reg = S5P_CLKDIV_DMC0, .shift = 4, .size = 3 },
  258. };
  259. /* Core list of CMU_TOP side */
  260. static struct clk *clkset_aclk_top_list[] = {
  261. [0] = &clk_mout_mpll.clk,
  262. [1] = &clk_sclk_apll.clk,
  263. };
  264. static struct clksrc_sources clkset_aclk = {
  265. .sources = clkset_aclk_top_list,
  266. .nr_sources = ARRAY_SIZE(clkset_aclk_top_list),
  267. };
  268. static struct clksrc_clk clk_aclk_200 = {
  269. .clk = {
  270. .name = "aclk_200",
  271. .id = -1,
  272. },
  273. .sources = &clkset_aclk,
  274. .reg_src = { .reg = S5P_CLKSRC_TOP0, .shift = 12, .size = 1 },
  275. .reg_div = { .reg = S5P_CLKDIV_TOP, .shift = 0, .size = 3 },
  276. };
  277. static struct clksrc_clk clk_aclk_100 = {
  278. .clk = {
  279. .name = "aclk_100",
  280. .id = -1,
  281. },
  282. .sources = &clkset_aclk,
  283. .reg_src = { .reg = S5P_CLKSRC_TOP0, .shift = 16, .size = 1 },
  284. .reg_div = { .reg = S5P_CLKDIV_TOP, .shift = 4, .size = 4 },
  285. };
  286. static struct clksrc_clk clk_aclk_160 = {
  287. .clk = {
  288. .name = "aclk_160",
  289. .id = -1,
  290. },
  291. .sources = &clkset_aclk,
  292. .reg_src = { .reg = S5P_CLKSRC_TOP0, .shift = 20, .size = 1 },
  293. .reg_div = { .reg = S5P_CLKDIV_TOP, .shift = 8, .size = 3 },
  294. };
  295. static struct clksrc_clk clk_aclk_133 = {
  296. .clk = {
  297. .name = "aclk_133",
  298. .id = -1,
  299. },
  300. .sources = &clkset_aclk,
  301. .reg_src = { .reg = S5P_CLKSRC_TOP0, .shift = 24, .size = 1 },
  302. .reg_div = { .reg = S5P_CLKDIV_TOP, .shift = 12, .size = 3 },
  303. };
  304. static struct clk *clkset_vpllsrc_list[] = {
  305. [0] = &clk_fin_vpll,
  306. [1] = &clk_sclk_hdmi27m,
  307. };
  308. static struct clksrc_sources clkset_vpllsrc = {
  309. .sources = clkset_vpllsrc_list,
  310. .nr_sources = ARRAY_SIZE(clkset_vpllsrc_list),
  311. };
  312. static struct clksrc_clk clk_vpllsrc = {
  313. .clk = {
  314. .name = "vpll_src",
  315. .id = -1,
  316. .enable = exynos4_clksrc_mask_top_ctrl,
  317. .ctrlbit = (1 << 0),
  318. },
  319. .sources = &clkset_vpllsrc,
  320. .reg_src = { .reg = S5P_CLKSRC_TOP1, .shift = 0, .size = 1 },
  321. };
  322. static struct clk *clkset_sclk_vpll_list[] = {
  323. [0] = &clk_vpllsrc.clk,
  324. [1] = &clk_fout_vpll,
  325. };
  326. static struct clksrc_sources clkset_sclk_vpll = {
  327. .sources = clkset_sclk_vpll_list,
  328. .nr_sources = ARRAY_SIZE(clkset_sclk_vpll_list),
  329. };
  330. static struct clksrc_clk clk_sclk_vpll = {
  331. .clk = {
  332. .name = "sclk_vpll",
  333. .id = -1,
  334. },
  335. .sources = &clkset_sclk_vpll,
  336. .reg_src = { .reg = S5P_CLKSRC_TOP0, .shift = 8, .size = 1 },
  337. };
  338. static struct clk init_clocks_off[] = {
  339. {
  340. .name = "timers",
  341. .id = -1,
  342. .parent = &clk_aclk_100.clk,
  343. .enable = exynos4_clk_ip_peril_ctrl,
  344. .ctrlbit = (1<<24),
  345. }, {
  346. .name = "csis",
  347. .id = 0,
  348. .enable = exynos4_clk_ip_cam_ctrl,
  349. .ctrlbit = (1 << 4),
  350. }, {
  351. .name = "csis",
  352. .id = 1,
  353. .enable = exynos4_clk_ip_cam_ctrl,
  354. .ctrlbit = (1 << 5),
  355. }, {
  356. .name = "fimc",
  357. .id = 0,
  358. .enable = exynos4_clk_ip_cam_ctrl,
  359. .ctrlbit = (1 << 0),
  360. }, {
  361. .name = "fimc",
  362. .id = 1,
  363. .enable = exynos4_clk_ip_cam_ctrl,
  364. .ctrlbit = (1 << 1),
  365. }, {
  366. .name = "fimc",
  367. .id = 2,
  368. .enable = exynos4_clk_ip_cam_ctrl,
  369. .ctrlbit = (1 << 2),
  370. }, {
  371. .name = "fimc",
  372. .id = 3,
  373. .enable = exynos4_clk_ip_cam_ctrl,
  374. .ctrlbit = (1 << 3),
  375. }, {
  376. .name = "fimd",
  377. .id = 0,
  378. .enable = exynos4_clk_ip_lcd0_ctrl,
  379. .ctrlbit = (1 << 0),
  380. }, {
  381. .name = "fimd",
  382. .id = 1,
  383. .enable = exynos4_clk_ip_lcd1_ctrl,
  384. .ctrlbit = (1 << 0),
  385. }, {
  386. .name = "sataphy",
  387. .id = -1,
  388. .parent = &clk_aclk_133.clk,
  389. .enable = exynos4_clk_ip_fsys_ctrl,
  390. .ctrlbit = (1 << 3),
  391. }, {
  392. .name = "hsmmc",
  393. .id = 0,
  394. .parent = &clk_aclk_133.clk,
  395. .enable = exynos4_clk_ip_fsys_ctrl,
  396. .ctrlbit = (1 << 5),
  397. }, {
  398. .name = "hsmmc",
  399. .id = 1,
  400. .parent = &clk_aclk_133.clk,
  401. .enable = exynos4_clk_ip_fsys_ctrl,
  402. .ctrlbit = (1 << 6),
  403. }, {
  404. .name = "hsmmc",
  405. .id = 2,
  406. .parent = &clk_aclk_133.clk,
  407. .enable = exynos4_clk_ip_fsys_ctrl,
  408. .ctrlbit = (1 << 7),
  409. }, {
  410. .name = "hsmmc",
  411. .id = 3,
  412. .parent = &clk_aclk_133.clk,
  413. .enable = exynos4_clk_ip_fsys_ctrl,
  414. .ctrlbit = (1 << 8),
  415. }, {
  416. .name = "hsmmc",
  417. .id = 4,
  418. .parent = &clk_aclk_133.clk,
  419. .enable = exynos4_clk_ip_fsys_ctrl,
  420. .ctrlbit = (1 << 9),
  421. }, {
  422. .name = "sata",
  423. .id = -1,
  424. .parent = &clk_aclk_133.clk,
  425. .enable = exynos4_clk_ip_fsys_ctrl,
  426. .ctrlbit = (1 << 10),
  427. }, {
  428. .name = "pdma",
  429. .id = 0,
  430. .enable = exynos4_clk_ip_fsys_ctrl,
  431. .ctrlbit = (1 << 0),
  432. }, {
  433. .name = "pdma",
  434. .id = 1,
  435. .enable = exynos4_clk_ip_fsys_ctrl,
  436. .ctrlbit = (1 << 1),
  437. }, {
  438. .name = "adc",
  439. .id = -1,
  440. .enable = exynos4_clk_ip_peril_ctrl,
  441. .ctrlbit = (1 << 15),
  442. }, {
  443. .name = "keypad",
  444. .id = -1,
  445. .enable = exynos4_clk_ip_perir_ctrl,
  446. .ctrlbit = (1 << 16),
  447. }, {
  448. .name = "rtc",
  449. .id = -1,
  450. .enable = exynos4_clk_ip_perir_ctrl,
  451. .ctrlbit = (1 << 15),
  452. }, {
  453. .name = "watchdog",
  454. .id = -1,
  455. .parent = &clk_aclk_100.clk,
  456. .enable = exynos4_clk_ip_perir_ctrl,
  457. .ctrlbit = (1 << 14),
  458. }, {
  459. .name = "usbhost",
  460. .id = -1,
  461. .enable = exynos4_clk_ip_fsys_ctrl ,
  462. .ctrlbit = (1 << 12),
  463. }, {
  464. .name = "otg",
  465. .id = -1,
  466. .enable = exynos4_clk_ip_fsys_ctrl,
  467. .ctrlbit = (1 << 13),
  468. }, {
  469. .name = "spi",
  470. .id = 0,
  471. .enable = exynos4_clk_ip_peril_ctrl,
  472. .ctrlbit = (1 << 16),
  473. }, {
  474. .name = "spi",
  475. .id = 1,
  476. .enable = exynos4_clk_ip_peril_ctrl,
  477. .ctrlbit = (1 << 17),
  478. }, {
  479. .name = "spi",
  480. .id = 2,
  481. .enable = exynos4_clk_ip_peril_ctrl,
  482. .ctrlbit = (1 << 18),
  483. }, {
  484. .name = "iis",
  485. .id = 0,
  486. .enable = exynos4_clk_ip_peril_ctrl,
  487. .ctrlbit = (1 << 19),
  488. }, {
  489. .name = "iis",
  490. .id = 1,
  491. .enable = exynos4_clk_ip_peril_ctrl,
  492. .ctrlbit = (1 << 20),
  493. }, {
  494. .name = "iis",
  495. .id = 2,
  496. .enable = exynos4_clk_ip_peril_ctrl,
  497. .ctrlbit = (1 << 21),
  498. }, {
  499. .name = "ac97",
  500. .id = -1,
  501. .enable = exynos4_clk_ip_peril_ctrl,
  502. .ctrlbit = (1 << 27),
  503. }, {
  504. .name = "fimg2d",
  505. .id = -1,
  506. .enable = exynos4_clk_ip_image_ctrl,
  507. .ctrlbit = (1 << 0),
  508. }, {
  509. .name = "i2c",
  510. .id = 0,
  511. .parent = &clk_aclk_100.clk,
  512. .enable = exynos4_clk_ip_peril_ctrl,
  513. .ctrlbit = (1 << 6),
  514. }, {
  515. .name = "i2c",
  516. .id = 1,
  517. .parent = &clk_aclk_100.clk,
  518. .enable = exynos4_clk_ip_peril_ctrl,
  519. .ctrlbit = (1 << 7),
  520. }, {
  521. .name = "i2c",
  522. .id = 2,
  523. .parent = &clk_aclk_100.clk,
  524. .enable = exynos4_clk_ip_peril_ctrl,
  525. .ctrlbit = (1 << 8),
  526. }, {
  527. .name = "i2c",
  528. .id = 3,
  529. .parent = &clk_aclk_100.clk,
  530. .enable = exynos4_clk_ip_peril_ctrl,
  531. .ctrlbit = (1 << 9),
  532. }, {
  533. .name = "i2c",
  534. .id = 4,
  535. .parent = &clk_aclk_100.clk,
  536. .enable = exynos4_clk_ip_peril_ctrl,
  537. .ctrlbit = (1 << 10),
  538. }, {
  539. .name = "i2c",
  540. .id = 5,
  541. .parent = &clk_aclk_100.clk,
  542. .enable = exynos4_clk_ip_peril_ctrl,
  543. .ctrlbit = (1 << 11),
  544. }, {
  545. .name = "i2c",
  546. .id = 6,
  547. .parent = &clk_aclk_100.clk,
  548. .enable = exynos4_clk_ip_peril_ctrl,
  549. .ctrlbit = (1 << 12),
  550. }, {
  551. .name = "i2c",
  552. .id = 7,
  553. .parent = &clk_aclk_100.clk,
  554. .enable = exynos4_clk_ip_peril_ctrl,
  555. .ctrlbit = (1 << 13),
  556. }, {
  557. .name = "SYSMMU_MDMA",
  558. .id = -1,
  559. .enable = exynos4_clk_ip_image_ctrl,
  560. .ctrlbit = (1 << 5),
  561. }, {
  562. .name = "SYSMMU_FIMC0",
  563. .id = -1,
  564. .enable = exynos4_clk_ip_cam_ctrl,
  565. .ctrlbit = (1 << 7),
  566. }, {
  567. .name = "SYSMMU_FIMC1",
  568. .id = -1,
  569. .enable = exynos4_clk_ip_cam_ctrl,
  570. .ctrlbit = (1 << 8),
  571. }, {
  572. .name = "SYSMMU_FIMC2",
  573. .id = -1,
  574. .enable = exynos4_clk_ip_cam_ctrl,
  575. .ctrlbit = (1 << 9),
  576. }, {
  577. .name = "SYSMMU_FIMC3",
  578. .id = -1,
  579. .enable = exynos4_clk_ip_cam_ctrl,
  580. .ctrlbit = (1 << 10),
  581. }, {
  582. .name = "SYSMMU_JPEG",
  583. .id = -1,
  584. .enable = exynos4_clk_ip_cam_ctrl,
  585. .ctrlbit = (1 << 11),
  586. }, {
  587. .name = "SYSMMU_FIMD0",
  588. .id = -1,
  589. .enable = exynos4_clk_ip_lcd0_ctrl,
  590. .ctrlbit = (1 << 4),
  591. }, {
  592. .name = "SYSMMU_FIMD1",
  593. .id = -1,
  594. .enable = exynos4_clk_ip_lcd1_ctrl,
  595. .ctrlbit = (1 << 4),
  596. }, {
  597. .name = "SYSMMU_PCIe",
  598. .id = -1,
  599. .enable = exynos4_clk_ip_fsys_ctrl,
  600. .ctrlbit = (1 << 18),
  601. }, {
  602. .name = "SYSMMU_G2D",
  603. .id = -1,
  604. .enable = exynos4_clk_ip_image_ctrl,
  605. .ctrlbit = (1 << 3),
  606. }, {
  607. .name = "SYSMMU_ROTATOR",
  608. .id = -1,
  609. .enable = exynos4_clk_ip_image_ctrl,
  610. .ctrlbit = (1 << 4),
  611. }, {
  612. .name = "SYSMMU_TV",
  613. .id = -1,
  614. .enable = exynos4_clk_ip_tv_ctrl,
  615. .ctrlbit = (1 << 4),
  616. }, {
  617. .name = "SYSMMU_MFC_L",
  618. .id = -1,
  619. .enable = exynos4_clk_ip_mfc_ctrl,
  620. .ctrlbit = (1 << 1),
  621. }, {
  622. .name = "SYSMMU_MFC_R",
  623. .id = -1,
  624. .enable = exynos4_clk_ip_mfc_ctrl,
  625. .ctrlbit = (1 << 2),
  626. }
  627. };
  628. static struct clk init_clocks[] = {
  629. {
  630. .name = "uart",
  631. .id = 0,
  632. .enable = exynos4_clk_ip_peril_ctrl,
  633. .ctrlbit = (1 << 0),
  634. }, {
  635. .name = "uart",
  636. .id = 1,
  637. .enable = exynos4_clk_ip_peril_ctrl,
  638. .ctrlbit = (1 << 1),
  639. }, {
  640. .name = "uart",
  641. .id = 2,
  642. .enable = exynos4_clk_ip_peril_ctrl,
  643. .ctrlbit = (1 << 2),
  644. }, {
  645. .name = "uart",
  646. .id = 3,
  647. .enable = exynos4_clk_ip_peril_ctrl,
  648. .ctrlbit = (1 << 3),
  649. }, {
  650. .name = "uart",
  651. .id = 4,
  652. .enable = exynos4_clk_ip_peril_ctrl,
  653. .ctrlbit = (1 << 4),
  654. }, {
  655. .name = "uart",
  656. .id = 5,
  657. .enable = exynos4_clk_ip_peril_ctrl,
  658. .ctrlbit = (1 << 5),
  659. }
  660. };
  661. static struct clk *clkset_group_list[] = {
  662. [0] = &clk_ext_xtal_mux,
  663. [1] = &clk_xusbxti,
  664. [2] = &clk_sclk_hdmi27m,
  665. [3] = &clk_sclk_usbphy0,
  666. [4] = &clk_sclk_usbphy1,
  667. [5] = &clk_sclk_hdmiphy,
  668. [6] = &clk_mout_mpll.clk,
  669. [7] = &clk_mout_epll.clk,
  670. [8] = &clk_sclk_vpll.clk,
  671. };
  672. static struct clksrc_sources clkset_group = {
  673. .sources = clkset_group_list,
  674. .nr_sources = ARRAY_SIZE(clkset_group_list),
  675. };
  676. static struct clk *clkset_mout_g2d0_list[] = {
  677. [0] = &clk_mout_mpll.clk,
  678. [1] = &clk_sclk_apll.clk,
  679. };
  680. static struct clksrc_sources clkset_mout_g2d0 = {
  681. .sources = clkset_mout_g2d0_list,
  682. .nr_sources = ARRAY_SIZE(clkset_mout_g2d0_list),
  683. };
  684. static struct clksrc_clk clk_mout_g2d0 = {
  685. .clk = {
  686. .name = "mout_g2d0",
  687. .id = -1,
  688. },
  689. .sources = &clkset_mout_g2d0,
  690. .reg_src = { .reg = S5P_CLKSRC_IMAGE, .shift = 0, .size = 1 },
  691. };
  692. static struct clk *clkset_mout_g2d1_list[] = {
  693. [0] = &clk_mout_epll.clk,
  694. [1] = &clk_sclk_vpll.clk,
  695. };
  696. static struct clksrc_sources clkset_mout_g2d1 = {
  697. .sources = clkset_mout_g2d1_list,
  698. .nr_sources = ARRAY_SIZE(clkset_mout_g2d1_list),
  699. };
  700. static struct clksrc_clk clk_mout_g2d1 = {
  701. .clk = {
  702. .name = "mout_g2d1",
  703. .id = -1,
  704. },
  705. .sources = &clkset_mout_g2d1,
  706. .reg_src = { .reg = S5P_CLKSRC_IMAGE, .shift = 4, .size = 1 },
  707. };
  708. static struct clk *clkset_mout_g2d_list[] = {
  709. [0] = &clk_mout_g2d0.clk,
  710. [1] = &clk_mout_g2d1.clk,
  711. };
  712. static struct clksrc_sources clkset_mout_g2d = {
  713. .sources = clkset_mout_g2d_list,
  714. .nr_sources = ARRAY_SIZE(clkset_mout_g2d_list),
  715. };
  716. static struct clksrc_clk clk_dout_mmc0 = {
  717. .clk = {
  718. .name = "dout_mmc0",
  719. .id = -1,
  720. },
  721. .sources = &clkset_group,
  722. .reg_src = { .reg = S5P_CLKSRC_FSYS, .shift = 0, .size = 4 },
  723. .reg_div = { .reg = S5P_CLKDIV_FSYS1, .shift = 0, .size = 4 },
  724. };
  725. static struct clksrc_clk clk_dout_mmc1 = {
  726. .clk = {
  727. .name = "dout_mmc1",
  728. .id = -1,
  729. },
  730. .sources = &clkset_group,
  731. .reg_src = { .reg = S5P_CLKSRC_FSYS, .shift = 4, .size = 4 },
  732. .reg_div = { .reg = S5P_CLKDIV_FSYS1, .shift = 16, .size = 4 },
  733. };
  734. static struct clksrc_clk clk_dout_mmc2 = {
  735. .clk = {
  736. .name = "dout_mmc2",
  737. .id = -1,
  738. },
  739. .sources = &clkset_group,
  740. .reg_src = { .reg = S5P_CLKSRC_FSYS, .shift = 8, .size = 4 },
  741. .reg_div = { .reg = S5P_CLKDIV_FSYS2, .shift = 0, .size = 4 },
  742. };
  743. static struct clksrc_clk clk_dout_mmc3 = {
  744. .clk = {
  745. .name = "dout_mmc3",
  746. .id = -1,
  747. },
  748. .sources = &clkset_group,
  749. .reg_src = { .reg = S5P_CLKSRC_FSYS, .shift = 12, .size = 4 },
  750. .reg_div = { .reg = S5P_CLKDIV_FSYS2, .shift = 16, .size = 4 },
  751. };
  752. static struct clksrc_clk clk_dout_mmc4 = {
  753. .clk = {
  754. .name = "dout_mmc4",
  755. .id = -1,
  756. },
  757. .sources = &clkset_group,
  758. .reg_src = { .reg = S5P_CLKSRC_FSYS, .shift = 16, .size = 4 },
  759. .reg_div = { .reg = S5P_CLKDIV_FSYS3, .shift = 0, .size = 4 },
  760. };
  761. static struct clksrc_clk clksrcs[] = {
  762. {
  763. .clk = {
  764. .name = "uclk1",
  765. .id = 0,
  766. .enable = exynos4_clksrc_mask_peril0_ctrl,
  767. .ctrlbit = (1 << 0),
  768. },
  769. .sources = &clkset_group,
  770. .reg_src = { .reg = S5P_CLKSRC_PERIL0, .shift = 0, .size = 4 },
  771. .reg_div = { .reg = S5P_CLKDIV_PERIL0, .shift = 0, .size = 4 },
  772. }, {
  773. .clk = {
  774. .name = "uclk1",
  775. .id = 1,
  776. .enable = exynos4_clksrc_mask_peril0_ctrl,
  777. .ctrlbit = (1 << 4),
  778. },
  779. .sources = &clkset_group,
  780. .reg_src = { .reg = S5P_CLKSRC_PERIL0, .shift = 4, .size = 4 },
  781. .reg_div = { .reg = S5P_CLKDIV_PERIL0, .shift = 4, .size = 4 },
  782. }, {
  783. .clk = {
  784. .name = "uclk1",
  785. .id = 2,
  786. .enable = exynos4_clksrc_mask_peril0_ctrl,
  787. .ctrlbit = (1 << 8),
  788. },
  789. .sources = &clkset_group,
  790. .reg_src = { .reg = S5P_CLKSRC_PERIL0, .shift = 8, .size = 4 },
  791. .reg_div = { .reg = S5P_CLKDIV_PERIL0, .shift = 8, .size = 4 },
  792. }, {
  793. .clk = {
  794. .name = "uclk1",
  795. .id = 3,
  796. .enable = exynos4_clksrc_mask_peril0_ctrl,
  797. .ctrlbit = (1 << 12),
  798. },
  799. .sources = &clkset_group,
  800. .reg_src = { .reg = S5P_CLKSRC_PERIL0, .shift = 12, .size = 4 },
  801. .reg_div = { .reg = S5P_CLKDIV_PERIL0, .shift = 12, .size = 4 },
  802. }, {
  803. .clk = {
  804. .name = "sclk_pwm",
  805. .id = -1,
  806. .enable = exynos4_clksrc_mask_peril0_ctrl,
  807. .ctrlbit = (1 << 24),
  808. },
  809. .sources = &clkset_group,
  810. .reg_src = { .reg = S5P_CLKSRC_PERIL0, .shift = 24, .size = 4 },
  811. .reg_div = { .reg = S5P_CLKDIV_PERIL3, .shift = 0, .size = 4 },
  812. }, {
  813. .clk = {
  814. .name = "sclk_csis",
  815. .id = 0,
  816. .enable = exynos4_clksrc_mask_cam_ctrl,
  817. .ctrlbit = (1 << 24),
  818. },
  819. .sources = &clkset_group,
  820. .reg_src = { .reg = S5P_CLKSRC_CAM, .shift = 24, .size = 4 },
  821. .reg_div = { .reg = S5P_CLKDIV_CAM, .shift = 24, .size = 4 },
  822. }, {
  823. .clk = {
  824. .name = "sclk_csis",
  825. .id = 1,
  826. .enable = exynos4_clksrc_mask_cam_ctrl,
  827. .ctrlbit = (1 << 28),
  828. },
  829. .sources = &clkset_group,
  830. .reg_src = { .reg = S5P_CLKSRC_CAM, .shift = 28, .size = 4 },
  831. .reg_div = { .reg = S5P_CLKDIV_CAM, .shift = 28, .size = 4 },
  832. }, {
  833. .clk = {
  834. .name = "sclk_cam",
  835. .id = 0,
  836. .enable = exynos4_clksrc_mask_cam_ctrl,
  837. .ctrlbit = (1 << 16),
  838. },
  839. .sources = &clkset_group,
  840. .reg_src = { .reg = S5P_CLKSRC_CAM, .shift = 16, .size = 4 },
  841. .reg_div = { .reg = S5P_CLKDIV_CAM, .shift = 16, .size = 4 },
  842. }, {
  843. .clk = {
  844. .name = "sclk_cam",
  845. .id = 1,
  846. .enable = exynos4_clksrc_mask_cam_ctrl,
  847. .ctrlbit = (1 << 20),
  848. },
  849. .sources = &clkset_group,
  850. .reg_src = { .reg = S5P_CLKSRC_CAM, .shift = 20, .size = 4 },
  851. .reg_div = { .reg = S5P_CLKDIV_CAM, .shift = 20, .size = 4 },
  852. }, {
  853. .clk = {
  854. .name = "sclk_fimc",
  855. .id = 0,
  856. .enable = exynos4_clksrc_mask_cam_ctrl,
  857. .ctrlbit = (1 << 0),
  858. },
  859. .sources = &clkset_group,
  860. .reg_src = { .reg = S5P_CLKSRC_CAM, .shift = 0, .size = 4 },
  861. .reg_div = { .reg = S5P_CLKDIV_CAM, .shift = 0, .size = 4 },
  862. }, {
  863. .clk = {
  864. .name = "sclk_fimc",
  865. .id = 1,
  866. .enable = exynos4_clksrc_mask_cam_ctrl,
  867. .ctrlbit = (1 << 4),
  868. },
  869. .sources = &clkset_group,
  870. .reg_src = { .reg = S5P_CLKSRC_CAM, .shift = 4, .size = 4 },
  871. .reg_div = { .reg = S5P_CLKDIV_CAM, .shift = 4, .size = 4 },
  872. }, {
  873. .clk = {
  874. .name = "sclk_fimc",
  875. .id = 2,
  876. .enable = exynos4_clksrc_mask_cam_ctrl,
  877. .ctrlbit = (1 << 8),
  878. },
  879. .sources = &clkset_group,
  880. .reg_src = { .reg = S5P_CLKSRC_CAM, .shift = 8, .size = 4 },
  881. .reg_div = { .reg = S5P_CLKDIV_CAM, .shift = 8, .size = 4 },
  882. }, {
  883. .clk = {
  884. .name = "sclk_fimc",
  885. .id = 3,
  886. .enable = exynos4_clksrc_mask_cam_ctrl,
  887. .ctrlbit = (1 << 12),
  888. },
  889. .sources = &clkset_group,
  890. .reg_src = { .reg = S5P_CLKSRC_CAM, .shift = 12, .size = 4 },
  891. .reg_div = { .reg = S5P_CLKDIV_CAM, .shift = 12, .size = 4 },
  892. }, {
  893. .clk = {
  894. .name = "sclk_fimd",
  895. .id = 0,
  896. .enable = exynos4_clksrc_mask_lcd0_ctrl,
  897. .ctrlbit = (1 << 0),
  898. },
  899. .sources = &clkset_group,
  900. .reg_src = { .reg = S5P_CLKSRC_LCD0, .shift = 0, .size = 4 },
  901. .reg_div = { .reg = S5P_CLKDIV_LCD0, .shift = 0, .size = 4 },
  902. }, {
  903. .clk = {
  904. .name = "sclk_fimd",
  905. .id = 1,
  906. .enable = exynos4_clksrc_mask_lcd1_ctrl,
  907. .ctrlbit = (1 << 0),
  908. },
  909. .sources = &clkset_group,
  910. .reg_src = { .reg = S5P_CLKSRC_LCD1, .shift = 0, .size = 4 },
  911. .reg_div = { .reg = S5P_CLKDIV_LCD1, .shift = 0, .size = 4 },
  912. }, {
  913. .clk = {
  914. .name = "sclk_sata",
  915. .id = -1,
  916. .enable = exynos4_clksrc_mask_fsys_ctrl,
  917. .ctrlbit = (1 << 24),
  918. },
  919. .sources = &clkset_mout_corebus,
  920. .reg_src = { .reg = S5P_CLKSRC_FSYS, .shift = 24, .size = 1 },
  921. .reg_div = { .reg = S5P_CLKDIV_FSYS0, .shift = 20, .size = 4 },
  922. }, {
  923. .clk = {
  924. .name = "sclk_spi",
  925. .id = 0,
  926. .enable = exynos4_clksrc_mask_peril1_ctrl,
  927. .ctrlbit = (1 << 16),
  928. },
  929. .sources = &clkset_group,
  930. .reg_src = { .reg = S5P_CLKSRC_PERIL1, .shift = 16, .size = 4 },
  931. .reg_div = { .reg = S5P_CLKDIV_PERIL1, .shift = 0, .size = 4 },
  932. }, {
  933. .clk = {
  934. .name = "sclk_spi",
  935. .id = 1,
  936. .enable = exynos4_clksrc_mask_peril1_ctrl,
  937. .ctrlbit = (1 << 20),
  938. },
  939. .sources = &clkset_group,
  940. .reg_src = { .reg = S5P_CLKSRC_PERIL1, .shift = 20, .size = 4 },
  941. .reg_div = { .reg = S5P_CLKDIV_PERIL1, .shift = 16, .size = 4 },
  942. }, {
  943. .clk = {
  944. .name = "sclk_spi",
  945. .id = 2,
  946. .enable = exynos4_clksrc_mask_peril1_ctrl,
  947. .ctrlbit = (1 << 24),
  948. },
  949. .sources = &clkset_group,
  950. .reg_src = { .reg = S5P_CLKSRC_PERIL1, .shift = 24, .size = 4 },
  951. .reg_div = { .reg = S5P_CLKDIV_PERIL2, .shift = 0, .size = 4 },
  952. }, {
  953. .clk = {
  954. .name = "sclk_fimg2d",
  955. .id = -1,
  956. },
  957. .sources = &clkset_mout_g2d,
  958. .reg_src = { .reg = S5P_CLKSRC_IMAGE, .shift = 8, .size = 1 },
  959. .reg_div = { .reg = S5P_CLKDIV_IMAGE, .shift = 0, .size = 4 },
  960. }, {
  961. .clk = {
  962. .name = "sclk_mmc",
  963. .id = 0,
  964. .parent = &clk_dout_mmc0.clk,
  965. .enable = exynos4_clksrc_mask_fsys_ctrl,
  966. .ctrlbit = (1 << 0),
  967. },
  968. .reg_div = { .reg = S5P_CLKDIV_FSYS1, .shift = 8, .size = 8 },
  969. }, {
  970. .clk = {
  971. .name = "sclk_mmc",
  972. .id = 1,
  973. .parent = &clk_dout_mmc1.clk,
  974. .enable = exynos4_clksrc_mask_fsys_ctrl,
  975. .ctrlbit = (1 << 4),
  976. },
  977. .reg_div = { .reg = S5P_CLKDIV_FSYS1, .shift = 24, .size = 8 },
  978. }, {
  979. .clk = {
  980. .name = "sclk_mmc",
  981. .id = 2,
  982. .parent = &clk_dout_mmc2.clk,
  983. .enable = exynos4_clksrc_mask_fsys_ctrl,
  984. .ctrlbit = (1 << 8),
  985. },
  986. .reg_div = { .reg = S5P_CLKDIV_FSYS2, .shift = 8, .size = 8 },
  987. }, {
  988. .clk = {
  989. .name = "sclk_mmc",
  990. .id = 3,
  991. .parent = &clk_dout_mmc3.clk,
  992. .enable = exynos4_clksrc_mask_fsys_ctrl,
  993. .ctrlbit = (1 << 12),
  994. },
  995. .reg_div = { .reg = S5P_CLKDIV_FSYS2, .shift = 24, .size = 8 },
  996. }, {
  997. .clk = {
  998. .name = "sclk_mmc",
  999. .id = 4,
  1000. .parent = &clk_dout_mmc4.clk,
  1001. .enable = exynos4_clksrc_mask_fsys_ctrl,
  1002. .ctrlbit = (1 << 16),
  1003. },
  1004. .reg_div = { .reg = S5P_CLKDIV_FSYS3, .shift = 8, .size = 8 },
  1005. }
  1006. };
  1007. /* Clock initialization code */
  1008. static struct clksrc_clk *sysclks[] = {
  1009. &clk_mout_apll,
  1010. &clk_sclk_apll,
  1011. &clk_mout_epll,
  1012. &clk_mout_mpll,
  1013. &clk_moutcore,
  1014. &clk_coreclk,
  1015. &clk_armclk,
  1016. &clk_aclk_corem0,
  1017. &clk_aclk_cores,
  1018. &clk_aclk_corem1,
  1019. &clk_periphclk,
  1020. &clk_mout_corebus,
  1021. &clk_sclk_dmc,
  1022. &clk_aclk_cored,
  1023. &clk_aclk_corep,
  1024. &clk_aclk_acp,
  1025. &clk_pclk_acp,
  1026. &clk_vpllsrc,
  1027. &clk_sclk_vpll,
  1028. &clk_aclk_200,
  1029. &clk_aclk_100,
  1030. &clk_aclk_160,
  1031. &clk_aclk_133,
  1032. &clk_dout_mmc0,
  1033. &clk_dout_mmc1,
  1034. &clk_dout_mmc2,
  1035. &clk_dout_mmc3,
  1036. &clk_dout_mmc4,
  1037. };
  1038. static int xtal_rate;
  1039. static unsigned long exynos4_fout_apll_get_rate(struct clk *clk)
  1040. {
  1041. return s5p_get_pll45xx(xtal_rate, __raw_readl(S5P_APLL_CON0), pll_4508);
  1042. }
  1043. static struct clk_ops exynos4_fout_apll_ops = {
  1044. .get_rate = exynos4_fout_apll_get_rate,
  1045. };
  1046. void __init_or_cpufreq exynos4_setup_clocks(void)
  1047. {
  1048. struct clk *xtal_clk;
  1049. unsigned long apll;
  1050. unsigned long mpll;
  1051. unsigned long epll;
  1052. unsigned long vpll;
  1053. unsigned long vpllsrc;
  1054. unsigned long xtal;
  1055. unsigned long armclk;
  1056. unsigned long sclk_dmc;
  1057. unsigned long aclk_200;
  1058. unsigned long aclk_100;
  1059. unsigned long aclk_160;
  1060. unsigned long aclk_133;
  1061. unsigned int ptr;
  1062. printk(KERN_DEBUG "%s: registering clocks\n", __func__);
  1063. xtal_clk = clk_get(NULL, "xtal");
  1064. BUG_ON(IS_ERR(xtal_clk));
  1065. xtal = clk_get_rate(xtal_clk);
  1066. xtal_rate = xtal;
  1067. clk_put(xtal_clk);
  1068. printk(KERN_DEBUG "%s: xtal is %ld\n", __func__, xtal);
  1069. apll = s5p_get_pll45xx(xtal, __raw_readl(S5P_APLL_CON0), pll_4508);
  1070. mpll = s5p_get_pll45xx(xtal, __raw_readl(S5P_MPLL_CON0), pll_4508);
  1071. epll = s5p_get_pll46xx(xtal, __raw_readl(S5P_EPLL_CON0),
  1072. __raw_readl(S5P_EPLL_CON1), pll_4600);
  1073. vpllsrc = clk_get_rate(&clk_vpllsrc.clk);
  1074. vpll = s5p_get_pll46xx(vpllsrc, __raw_readl(S5P_VPLL_CON0),
  1075. __raw_readl(S5P_VPLL_CON1), pll_4650);
  1076. clk_fout_apll.ops = &exynos4_fout_apll_ops;
  1077. clk_fout_mpll.rate = mpll;
  1078. clk_fout_epll.rate = epll;
  1079. clk_fout_vpll.rate = vpll;
  1080. printk(KERN_INFO "EXYNOS4: PLL settings, A=%ld, M=%ld, E=%ld V=%ld",
  1081. apll, mpll, epll, vpll);
  1082. armclk = clk_get_rate(&clk_armclk.clk);
  1083. sclk_dmc = clk_get_rate(&clk_sclk_dmc.clk);
  1084. aclk_200 = clk_get_rate(&clk_aclk_200.clk);
  1085. aclk_100 = clk_get_rate(&clk_aclk_100.clk);
  1086. aclk_160 = clk_get_rate(&clk_aclk_160.clk);
  1087. aclk_133 = clk_get_rate(&clk_aclk_133.clk);
  1088. printk(KERN_INFO "EXYNOS4: ARMCLK=%ld, DMC=%ld, ACLK200=%ld\n"
  1089. "ACLK100=%ld, ACLK160=%ld, ACLK133=%ld\n",
  1090. armclk, sclk_dmc, aclk_200,
  1091. aclk_100, aclk_160, aclk_133);
  1092. clk_f.rate = armclk;
  1093. clk_h.rate = sclk_dmc;
  1094. clk_p.rate = aclk_100;
  1095. for (ptr = 0; ptr < ARRAY_SIZE(clksrcs); ptr++)
  1096. s3c_set_clksrc(&clksrcs[ptr], true);
  1097. }
  1098. static struct clk *clks[] __initdata = {
  1099. /* Nothing here yet */
  1100. };
  1101. void __init exynos4_register_clocks(void)
  1102. {
  1103. int ptr;
  1104. s3c24xx_register_clocks(clks, ARRAY_SIZE(clks));
  1105. for (ptr = 0; ptr < ARRAY_SIZE(sysclks); ptr++)
  1106. s3c_register_clksrc(sysclks[ptr], 1);
  1107. s3c_register_clksrc(clksrcs, ARRAY_SIZE(clksrcs));
  1108. s3c_register_clocks(init_clocks, ARRAY_SIZE(init_clocks));
  1109. s3c_register_clocks(init_clocks_off, ARRAY_SIZE(init_clocks_off));
  1110. s3c_disable_clocks(init_clocks_off, ARRAY_SIZE(init_clocks_off));
  1111. s3c_pwmclk_init();
  1112. }