clock.c 34 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411141214131414141514161417
  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. .rate = 27000000,
  27. };
  28. static struct clk clk_sclk_hdmiphy = {
  29. .name = "sclk_hdmiphy",
  30. };
  31. static struct clk clk_sclk_usbphy0 = {
  32. .name = "sclk_usbphy0",
  33. .rate = 27000000,
  34. };
  35. static struct clk clk_sclk_usbphy1 = {
  36. .name = "sclk_usbphy1",
  37. };
  38. static struct clk dummy_apb_pclk = {
  39. .name = "apb_pclk",
  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_clksrc_mask_tv_ctrl(struct clk *clk, int enable)
  75. {
  76. return s5p_gatectrl(S5P_CLKSRC_MASK_TV, clk, enable);
  77. }
  78. static int exynos4_clk_ip_cam_ctrl(struct clk *clk, int enable)
  79. {
  80. return s5p_gatectrl(S5P_CLKGATE_IP_CAM, clk, enable);
  81. }
  82. static int exynos4_clk_ip_tv_ctrl(struct clk *clk, int enable)
  83. {
  84. return s5p_gatectrl(S5P_CLKGATE_IP_TV, clk, enable);
  85. }
  86. static int exynos4_clk_ip_image_ctrl(struct clk *clk, int enable)
  87. {
  88. return s5p_gatectrl(S5P_CLKGATE_IP_IMAGE, clk, enable);
  89. }
  90. static int exynos4_clk_ip_lcd0_ctrl(struct clk *clk, int enable)
  91. {
  92. return s5p_gatectrl(S5P_CLKGATE_IP_LCD0, clk, enable);
  93. }
  94. static int exynos4_clk_ip_lcd1_ctrl(struct clk *clk, int enable)
  95. {
  96. return s5p_gatectrl(S5P_CLKGATE_IP_LCD1, clk, enable);
  97. }
  98. static int exynos4_clk_ip_fsys_ctrl(struct clk *clk, int enable)
  99. {
  100. return s5p_gatectrl(S5P_CLKGATE_IP_FSYS, clk, enable);
  101. }
  102. static int exynos4_clk_ip_peril_ctrl(struct clk *clk, int enable)
  103. {
  104. return s5p_gatectrl(S5P_CLKGATE_IP_PERIL, clk, enable);
  105. }
  106. static int exynos4_clk_ip_perir_ctrl(struct clk *clk, int enable)
  107. {
  108. return s5p_gatectrl(S5P_CLKGATE_IP_PERIR, clk, enable);
  109. }
  110. static int exynos4_clk_hdmiphy_ctrl(struct clk *clk, int enable)
  111. {
  112. return s5p_gatectrl(S5P_HDMI_PHY_CONTROL, clk, enable);
  113. }
  114. static int exynos4_clk_dac_ctrl(struct clk *clk, int enable)
  115. {
  116. return s5p_gatectrl(S5P_DAC_PHY_CONTROL, clk, enable);
  117. }
  118. /* Core list of CMU_CPU side */
  119. static struct clksrc_clk clk_mout_apll = {
  120. .clk = {
  121. .name = "mout_apll",
  122. },
  123. .sources = &clk_src_apll,
  124. .reg_src = { .reg = S5P_CLKSRC_CPU, .shift = 0, .size = 1 },
  125. };
  126. static struct clksrc_clk clk_sclk_apll = {
  127. .clk = {
  128. .name = "sclk_apll",
  129. .parent = &clk_mout_apll.clk,
  130. },
  131. .reg_div = { .reg = S5P_CLKDIV_CPU, .shift = 24, .size = 3 },
  132. };
  133. static struct clksrc_clk clk_mout_epll = {
  134. .clk = {
  135. .name = "mout_epll",
  136. },
  137. .sources = &clk_src_epll,
  138. .reg_src = { .reg = S5P_CLKSRC_TOP0, .shift = 4, .size = 1 },
  139. };
  140. static struct clksrc_clk clk_mout_mpll = {
  141. .clk = {
  142. .name = "mout_mpll",
  143. },
  144. .sources = &clk_src_mpll,
  145. .reg_src = { .reg = S5P_CLKSRC_CPU, .shift = 8, .size = 1 },
  146. };
  147. static struct clk *clkset_moutcore_list[] = {
  148. [0] = &clk_mout_apll.clk,
  149. [1] = &clk_mout_mpll.clk,
  150. };
  151. static struct clksrc_sources clkset_moutcore = {
  152. .sources = clkset_moutcore_list,
  153. .nr_sources = ARRAY_SIZE(clkset_moutcore_list),
  154. };
  155. static struct clksrc_clk clk_moutcore = {
  156. .clk = {
  157. .name = "moutcore",
  158. },
  159. .sources = &clkset_moutcore,
  160. .reg_src = { .reg = S5P_CLKSRC_CPU, .shift = 16, .size = 1 },
  161. };
  162. static struct clksrc_clk clk_coreclk = {
  163. .clk = {
  164. .name = "core_clk",
  165. .parent = &clk_moutcore.clk,
  166. },
  167. .reg_div = { .reg = S5P_CLKDIV_CPU, .shift = 0, .size = 3 },
  168. };
  169. static struct clksrc_clk clk_armclk = {
  170. .clk = {
  171. .name = "armclk",
  172. .parent = &clk_coreclk.clk,
  173. },
  174. };
  175. static struct clksrc_clk clk_aclk_corem0 = {
  176. .clk = {
  177. .name = "aclk_corem0",
  178. .parent = &clk_coreclk.clk,
  179. },
  180. .reg_div = { .reg = S5P_CLKDIV_CPU, .shift = 4, .size = 3 },
  181. };
  182. static struct clksrc_clk clk_aclk_cores = {
  183. .clk = {
  184. .name = "aclk_cores",
  185. .parent = &clk_coreclk.clk,
  186. },
  187. .reg_div = { .reg = S5P_CLKDIV_CPU, .shift = 4, .size = 3 },
  188. };
  189. static struct clksrc_clk clk_aclk_corem1 = {
  190. .clk = {
  191. .name = "aclk_corem1",
  192. .parent = &clk_coreclk.clk,
  193. },
  194. .reg_div = { .reg = S5P_CLKDIV_CPU, .shift = 8, .size = 3 },
  195. };
  196. static struct clksrc_clk clk_periphclk = {
  197. .clk = {
  198. .name = "periphclk",
  199. .parent = &clk_coreclk.clk,
  200. },
  201. .reg_div = { .reg = S5P_CLKDIV_CPU, .shift = 12, .size = 3 },
  202. };
  203. /* Core list of CMU_CORE side */
  204. static struct clk *clkset_corebus_list[] = {
  205. [0] = &clk_mout_mpll.clk,
  206. [1] = &clk_sclk_apll.clk,
  207. };
  208. static struct clksrc_sources clkset_mout_corebus = {
  209. .sources = clkset_corebus_list,
  210. .nr_sources = ARRAY_SIZE(clkset_corebus_list),
  211. };
  212. static struct clksrc_clk clk_mout_corebus = {
  213. .clk = {
  214. .name = "mout_corebus",
  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. .parent = &clk_mout_corebus.clk,
  223. },
  224. .reg_div = { .reg = S5P_CLKDIV_DMC0, .shift = 12, .size = 3 },
  225. };
  226. static struct clksrc_clk clk_aclk_cored = {
  227. .clk = {
  228. .name = "aclk_cored",
  229. .parent = &clk_sclk_dmc.clk,
  230. },
  231. .reg_div = { .reg = S5P_CLKDIV_DMC0, .shift = 16, .size = 3 },
  232. };
  233. static struct clksrc_clk clk_aclk_corep = {
  234. .clk = {
  235. .name = "aclk_corep",
  236. .parent = &clk_aclk_cored.clk,
  237. },
  238. .reg_div = { .reg = S5P_CLKDIV_DMC0, .shift = 20, .size = 3 },
  239. };
  240. static struct clksrc_clk clk_aclk_acp = {
  241. .clk = {
  242. .name = "aclk_acp",
  243. .parent = &clk_mout_corebus.clk,
  244. },
  245. .reg_div = { .reg = S5P_CLKDIV_DMC0, .shift = 0, .size = 3 },
  246. };
  247. static struct clksrc_clk clk_pclk_acp = {
  248. .clk = {
  249. .name = "pclk_acp",
  250. .parent = &clk_aclk_acp.clk,
  251. },
  252. .reg_div = { .reg = S5P_CLKDIV_DMC0, .shift = 4, .size = 3 },
  253. };
  254. /* Core list of CMU_TOP side */
  255. static struct clk *clkset_aclk_top_list[] = {
  256. [0] = &clk_mout_mpll.clk,
  257. [1] = &clk_sclk_apll.clk,
  258. };
  259. static struct clksrc_sources clkset_aclk = {
  260. .sources = clkset_aclk_top_list,
  261. .nr_sources = ARRAY_SIZE(clkset_aclk_top_list),
  262. };
  263. static struct clksrc_clk clk_aclk_200 = {
  264. .clk = {
  265. .name = "aclk_200",
  266. },
  267. .sources = &clkset_aclk,
  268. .reg_src = { .reg = S5P_CLKSRC_TOP0, .shift = 12, .size = 1 },
  269. .reg_div = { .reg = S5P_CLKDIV_TOP, .shift = 0, .size = 3 },
  270. };
  271. static struct clksrc_clk clk_aclk_100 = {
  272. .clk = {
  273. .name = "aclk_100",
  274. },
  275. .sources = &clkset_aclk,
  276. .reg_src = { .reg = S5P_CLKSRC_TOP0, .shift = 16, .size = 1 },
  277. .reg_div = { .reg = S5P_CLKDIV_TOP, .shift = 4, .size = 4 },
  278. };
  279. static struct clksrc_clk clk_aclk_160 = {
  280. .clk = {
  281. .name = "aclk_160",
  282. },
  283. .sources = &clkset_aclk,
  284. .reg_src = { .reg = S5P_CLKSRC_TOP0, .shift = 20, .size = 1 },
  285. .reg_div = { .reg = S5P_CLKDIV_TOP, .shift = 8, .size = 3 },
  286. };
  287. static struct clksrc_clk clk_aclk_133 = {
  288. .clk = {
  289. .name = "aclk_133",
  290. },
  291. .sources = &clkset_aclk,
  292. .reg_src = { .reg = S5P_CLKSRC_TOP0, .shift = 24, .size = 1 },
  293. .reg_div = { .reg = S5P_CLKDIV_TOP, .shift = 12, .size = 3 },
  294. };
  295. static struct clk *clkset_vpllsrc_list[] = {
  296. [0] = &clk_fin_vpll,
  297. [1] = &clk_sclk_hdmi27m,
  298. };
  299. static struct clksrc_sources clkset_vpllsrc = {
  300. .sources = clkset_vpllsrc_list,
  301. .nr_sources = ARRAY_SIZE(clkset_vpllsrc_list),
  302. };
  303. static struct clksrc_clk clk_vpllsrc = {
  304. .clk = {
  305. .name = "vpll_src",
  306. .enable = exynos4_clksrc_mask_top_ctrl,
  307. .ctrlbit = (1 << 0),
  308. },
  309. .sources = &clkset_vpllsrc,
  310. .reg_src = { .reg = S5P_CLKSRC_TOP1, .shift = 0, .size = 1 },
  311. };
  312. static struct clk *clkset_sclk_vpll_list[] = {
  313. [0] = &clk_vpllsrc.clk,
  314. [1] = &clk_fout_vpll,
  315. };
  316. static struct clksrc_sources clkset_sclk_vpll = {
  317. .sources = clkset_sclk_vpll_list,
  318. .nr_sources = ARRAY_SIZE(clkset_sclk_vpll_list),
  319. };
  320. static struct clksrc_clk clk_sclk_vpll = {
  321. .clk = {
  322. .name = "sclk_vpll",
  323. },
  324. .sources = &clkset_sclk_vpll,
  325. .reg_src = { .reg = S5P_CLKSRC_TOP0, .shift = 8, .size = 1 },
  326. };
  327. static struct clk init_clocks_off[] = {
  328. {
  329. .name = "timers",
  330. .parent = &clk_aclk_100.clk,
  331. .enable = exynos4_clk_ip_peril_ctrl,
  332. .ctrlbit = (1<<24),
  333. }, {
  334. .name = "csis",
  335. .devname = "s5p-mipi-csis.0",
  336. .enable = exynos4_clk_ip_cam_ctrl,
  337. .ctrlbit = (1 << 4),
  338. }, {
  339. .name = "csis",
  340. .devname = "s5p-mipi-csis.1",
  341. .enable = exynos4_clk_ip_cam_ctrl,
  342. .ctrlbit = (1 << 5),
  343. }, {
  344. .name = "fimc",
  345. .devname = "exynos4-fimc.0",
  346. .enable = exynos4_clk_ip_cam_ctrl,
  347. .ctrlbit = (1 << 0),
  348. }, {
  349. .name = "fimc",
  350. .devname = "exynos4-fimc.1",
  351. .enable = exynos4_clk_ip_cam_ctrl,
  352. .ctrlbit = (1 << 1),
  353. }, {
  354. .name = "fimc",
  355. .devname = "exynos4-fimc.2",
  356. .enable = exynos4_clk_ip_cam_ctrl,
  357. .ctrlbit = (1 << 2),
  358. }, {
  359. .name = "fimc",
  360. .devname = "exynos4-fimc.3",
  361. .enable = exynos4_clk_ip_cam_ctrl,
  362. .ctrlbit = (1 << 3),
  363. }, {
  364. .name = "fimd",
  365. .devname = "exynos4-fb.0",
  366. .enable = exynos4_clk_ip_lcd0_ctrl,
  367. .ctrlbit = (1 << 0),
  368. }, {
  369. .name = "fimd",
  370. .devname = "exynos4-fb.1",
  371. .enable = exynos4_clk_ip_lcd1_ctrl,
  372. .ctrlbit = (1 << 0),
  373. }, {
  374. .name = "sataphy",
  375. .parent = &clk_aclk_133.clk,
  376. .enable = exynos4_clk_ip_fsys_ctrl,
  377. .ctrlbit = (1 << 3),
  378. }, {
  379. .name = "hsmmc",
  380. .devname = "s3c-sdhci.0",
  381. .parent = &clk_aclk_133.clk,
  382. .enable = exynos4_clk_ip_fsys_ctrl,
  383. .ctrlbit = (1 << 5),
  384. }, {
  385. .name = "hsmmc",
  386. .devname = "s3c-sdhci.1",
  387. .parent = &clk_aclk_133.clk,
  388. .enable = exynos4_clk_ip_fsys_ctrl,
  389. .ctrlbit = (1 << 6),
  390. }, {
  391. .name = "hsmmc",
  392. .devname = "s3c-sdhci.2",
  393. .parent = &clk_aclk_133.clk,
  394. .enable = exynos4_clk_ip_fsys_ctrl,
  395. .ctrlbit = (1 << 7),
  396. }, {
  397. .name = "hsmmc",
  398. .devname = "s3c-sdhci.3",
  399. .parent = &clk_aclk_133.clk,
  400. .enable = exynos4_clk_ip_fsys_ctrl,
  401. .ctrlbit = (1 << 8),
  402. }, {
  403. .name = "dwmmc",
  404. .parent = &clk_aclk_133.clk,
  405. .enable = exynos4_clk_ip_fsys_ctrl,
  406. .ctrlbit = (1 << 9),
  407. }, {
  408. .name = "dac",
  409. .devname = "s5p-sdo",
  410. .enable = exynos4_clk_ip_tv_ctrl,
  411. .ctrlbit = (1 << 2),
  412. }, {
  413. .name = "mixer",
  414. .devname = "s5p-mixer",
  415. .enable = exynos4_clk_ip_tv_ctrl,
  416. .ctrlbit = (1 << 1),
  417. }, {
  418. .name = "vp",
  419. .devname = "s5p-mixer",
  420. .enable = exynos4_clk_ip_tv_ctrl,
  421. .ctrlbit = (1 << 0),
  422. }, {
  423. .name = "hdmi",
  424. .devname = "exynos4-hdmi",
  425. .enable = exynos4_clk_ip_tv_ctrl,
  426. .ctrlbit = (1 << 3),
  427. }, {
  428. .name = "hdmiphy",
  429. .devname = "exynos4-hdmi",
  430. .enable = exynos4_clk_hdmiphy_ctrl,
  431. .ctrlbit = (1 << 0),
  432. }, {
  433. .name = "dacphy",
  434. .devname = "s5p-sdo",
  435. .enable = exynos4_clk_dac_ctrl,
  436. .ctrlbit = (1 << 0),
  437. }, {
  438. .name = "sata",
  439. .parent = &clk_aclk_133.clk,
  440. .enable = exynos4_clk_ip_fsys_ctrl,
  441. .ctrlbit = (1 << 10),
  442. }, {
  443. .name = "dma",
  444. .devname = "dma-pl330.0",
  445. .enable = exynos4_clk_ip_fsys_ctrl,
  446. .ctrlbit = (1 << 0),
  447. }, {
  448. .name = "dma",
  449. .devname = "dma-pl330.1",
  450. .enable = exynos4_clk_ip_fsys_ctrl,
  451. .ctrlbit = (1 << 1),
  452. }, {
  453. .name = "adc",
  454. .enable = exynos4_clk_ip_peril_ctrl,
  455. .ctrlbit = (1 << 15),
  456. }, {
  457. .name = "keypad",
  458. .enable = exynos4_clk_ip_perir_ctrl,
  459. .ctrlbit = (1 << 16),
  460. }, {
  461. .name = "rtc",
  462. .enable = exynos4_clk_ip_perir_ctrl,
  463. .ctrlbit = (1 << 15),
  464. }, {
  465. .name = "watchdog",
  466. .parent = &clk_aclk_100.clk,
  467. .enable = exynos4_clk_ip_perir_ctrl,
  468. .ctrlbit = (1 << 14),
  469. }, {
  470. .name = "usbhost",
  471. .enable = exynos4_clk_ip_fsys_ctrl ,
  472. .ctrlbit = (1 << 12),
  473. }, {
  474. .name = "otg",
  475. .enable = exynos4_clk_ip_fsys_ctrl,
  476. .ctrlbit = (1 << 13),
  477. }, {
  478. .name = "spi",
  479. .devname = "s3c64xx-spi.0",
  480. .enable = exynos4_clk_ip_peril_ctrl,
  481. .ctrlbit = (1 << 16),
  482. }, {
  483. .name = "spi",
  484. .devname = "s3c64xx-spi.1",
  485. .enable = exynos4_clk_ip_peril_ctrl,
  486. .ctrlbit = (1 << 17),
  487. }, {
  488. .name = "spi",
  489. .devname = "s3c64xx-spi.2",
  490. .enable = exynos4_clk_ip_peril_ctrl,
  491. .ctrlbit = (1 << 18),
  492. }, {
  493. .name = "iis",
  494. .devname = "samsung-i2s.0",
  495. .enable = exynos4_clk_ip_peril_ctrl,
  496. .ctrlbit = (1 << 19),
  497. }, {
  498. .name = "iis",
  499. .devname = "samsung-i2s.1",
  500. .enable = exynos4_clk_ip_peril_ctrl,
  501. .ctrlbit = (1 << 20),
  502. }, {
  503. .name = "iis",
  504. .devname = "samsung-i2s.2",
  505. .enable = exynos4_clk_ip_peril_ctrl,
  506. .ctrlbit = (1 << 21),
  507. }, {
  508. .name = "ac97",
  509. .devname = "samsung-ac97",
  510. .enable = exynos4_clk_ip_peril_ctrl,
  511. .ctrlbit = (1 << 27),
  512. }, {
  513. .name = "fimg2d",
  514. .enable = exynos4_clk_ip_image_ctrl,
  515. .ctrlbit = (1 << 0),
  516. }, {
  517. .name = "mfc",
  518. .devname = "s5p-mfc",
  519. .enable = exynos4_clk_ip_mfc_ctrl,
  520. .ctrlbit = (1 << 0),
  521. }, {
  522. .name = "i2c",
  523. .devname = "s3c2440-i2c.0",
  524. .parent = &clk_aclk_100.clk,
  525. .enable = exynos4_clk_ip_peril_ctrl,
  526. .ctrlbit = (1 << 6),
  527. }, {
  528. .name = "i2c",
  529. .devname = "s3c2440-i2c.1",
  530. .parent = &clk_aclk_100.clk,
  531. .enable = exynos4_clk_ip_peril_ctrl,
  532. .ctrlbit = (1 << 7),
  533. }, {
  534. .name = "i2c",
  535. .devname = "s3c2440-i2c.2",
  536. .parent = &clk_aclk_100.clk,
  537. .enable = exynos4_clk_ip_peril_ctrl,
  538. .ctrlbit = (1 << 8),
  539. }, {
  540. .name = "i2c",
  541. .devname = "s3c2440-i2c.3",
  542. .parent = &clk_aclk_100.clk,
  543. .enable = exynos4_clk_ip_peril_ctrl,
  544. .ctrlbit = (1 << 9),
  545. }, {
  546. .name = "i2c",
  547. .devname = "s3c2440-i2c.4",
  548. .parent = &clk_aclk_100.clk,
  549. .enable = exynos4_clk_ip_peril_ctrl,
  550. .ctrlbit = (1 << 10),
  551. }, {
  552. .name = "i2c",
  553. .devname = "s3c2440-i2c.5",
  554. .parent = &clk_aclk_100.clk,
  555. .enable = exynos4_clk_ip_peril_ctrl,
  556. .ctrlbit = (1 << 11),
  557. }, {
  558. .name = "i2c",
  559. .devname = "s3c2440-i2c.6",
  560. .parent = &clk_aclk_100.clk,
  561. .enable = exynos4_clk_ip_peril_ctrl,
  562. .ctrlbit = (1 << 12),
  563. }, {
  564. .name = "i2c",
  565. .devname = "s3c2440-i2c.7",
  566. .parent = &clk_aclk_100.clk,
  567. .enable = exynos4_clk_ip_peril_ctrl,
  568. .ctrlbit = (1 << 13),
  569. }, {
  570. .name = "i2c",
  571. .devname = "s3c2440-hdmiphy-i2c",
  572. .parent = &clk_aclk_100.clk,
  573. .enable = exynos4_clk_ip_peril_ctrl,
  574. .ctrlbit = (1 << 14),
  575. }, {
  576. .name = "SYSMMU_MDMA",
  577. .enable = exynos4_clk_ip_image_ctrl,
  578. .ctrlbit = (1 << 5),
  579. }, {
  580. .name = "SYSMMU_FIMC0",
  581. .enable = exynos4_clk_ip_cam_ctrl,
  582. .ctrlbit = (1 << 7),
  583. }, {
  584. .name = "SYSMMU_FIMC1",
  585. .enable = exynos4_clk_ip_cam_ctrl,
  586. .ctrlbit = (1 << 8),
  587. }, {
  588. .name = "SYSMMU_FIMC2",
  589. .enable = exynos4_clk_ip_cam_ctrl,
  590. .ctrlbit = (1 << 9),
  591. }, {
  592. .name = "SYSMMU_FIMC3",
  593. .enable = exynos4_clk_ip_cam_ctrl,
  594. .ctrlbit = (1 << 10),
  595. }, {
  596. .name = "SYSMMU_JPEG",
  597. .enable = exynos4_clk_ip_cam_ctrl,
  598. .ctrlbit = (1 << 11),
  599. }, {
  600. .name = "SYSMMU_FIMD0",
  601. .enable = exynos4_clk_ip_lcd0_ctrl,
  602. .ctrlbit = (1 << 4),
  603. }, {
  604. .name = "SYSMMU_FIMD1",
  605. .enable = exynos4_clk_ip_lcd1_ctrl,
  606. .ctrlbit = (1 << 4),
  607. }, {
  608. .name = "SYSMMU_PCIe",
  609. .enable = exynos4_clk_ip_fsys_ctrl,
  610. .ctrlbit = (1 << 18),
  611. }, {
  612. .name = "SYSMMU_G2D",
  613. .enable = exynos4_clk_ip_image_ctrl,
  614. .ctrlbit = (1 << 3),
  615. }, {
  616. .name = "SYSMMU_ROTATOR",
  617. .enable = exynos4_clk_ip_image_ctrl,
  618. .ctrlbit = (1 << 4),
  619. }, {
  620. .name = "SYSMMU_TV",
  621. .enable = exynos4_clk_ip_tv_ctrl,
  622. .ctrlbit = (1 << 4),
  623. }, {
  624. .name = "SYSMMU_MFC_L",
  625. .enable = exynos4_clk_ip_mfc_ctrl,
  626. .ctrlbit = (1 << 1),
  627. }, {
  628. .name = "SYSMMU_MFC_R",
  629. .enable = exynos4_clk_ip_mfc_ctrl,
  630. .ctrlbit = (1 << 2),
  631. }
  632. };
  633. static struct clk init_clocks[] = {
  634. {
  635. .name = "uart",
  636. .devname = "s5pv210-uart.0",
  637. .enable = exynos4_clk_ip_peril_ctrl,
  638. .ctrlbit = (1 << 0),
  639. }, {
  640. .name = "uart",
  641. .devname = "s5pv210-uart.1",
  642. .enable = exynos4_clk_ip_peril_ctrl,
  643. .ctrlbit = (1 << 1),
  644. }, {
  645. .name = "uart",
  646. .devname = "s5pv210-uart.2",
  647. .enable = exynos4_clk_ip_peril_ctrl,
  648. .ctrlbit = (1 << 2),
  649. }, {
  650. .name = "uart",
  651. .devname = "s5pv210-uart.3",
  652. .enable = exynos4_clk_ip_peril_ctrl,
  653. .ctrlbit = (1 << 3),
  654. }, {
  655. .name = "uart",
  656. .devname = "s5pv210-uart.4",
  657. .enable = exynos4_clk_ip_peril_ctrl,
  658. .ctrlbit = (1 << 4),
  659. }, {
  660. .name = "uart",
  661. .devname = "s5pv210-uart.5",
  662. .enable = exynos4_clk_ip_peril_ctrl,
  663. .ctrlbit = (1 << 5),
  664. }
  665. };
  666. static struct clk *clkset_group_list[] = {
  667. [0] = &clk_ext_xtal_mux,
  668. [1] = &clk_xusbxti,
  669. [2] = &clk_sclk_hdmi27m,
  670. [3] = &clk_sclk_usbphy0,
  671. [4] = &clk_sclk_usbphy1,
  672. [5] = &clk_sclk_hdmiphy,
  673. [6] = &clk_mout_mpll.clk,
  674. [7] = &clk_mout_epll.clk,
  675. [8] = &clk_sclk_vpll.clk,
  676. };
  677. static struct clksrc_sources clkset_group = {
  678. .sources = clkset_group_list,
  679. .nr_sources = ARRAY_SIZE(clkset_group_list),
  680. };
  681. static struct clk *clkset_mout_g2d0_list[] = {
  682. [0] = &clk_mout_mpll.clk,
  683. [1] = &clk_sclk_apll.clk,
  684. };
  685. static struct clksrc_sources clkset_mout_g2d0 = {
  686. .sources = clkset_mout_g2d0_list,
  687. .nr_sources = ARRAY_SIZE(clkset_mout_g2d0_list),
  688. };
  689. static struct clksrc_clk clk_mout_g2d0 = {
  690. .clk = {
  691. .name = "mout_g2d0",
  692. },
  693. .sources = &clkset_mout_g2d0,
  694. .reg_src = { .reg = S5P_CLKSRC_IMAGE, .shift = 0, .size = 1 },
  695. };
  696. static struct clk *clkset_mout_g2d1_list[] = {
  697. [0] = &clk_mout_epll.clk,
  698. [1] = &clk_sclk_vpll.clk,
  699. };
  700. static struct clksrc_sources clkset_mout_g2d1 = {
  701. .sources = clkset_mout_g2d1_list,
  702. .nr_sources = ARRAY_SIZE(clkset_mout_g2d1_list),
  703. };
  704. static struct clksrc_clk clk_mout_g2d1 = {
  705. .clk = {
  706. .name = "mout_g2d1",
  707. },
  708. .sources = &clkset_mout_g2d1,
  709. .reg_src = { .reg = S5P_CLKSRC_IMAGE, .shift = 4, .size = 1 },
  710. };
  711. static struct clk *clkset_mout_g2d_list[] = {
  712. [0] = &clk_mout_g2d0.clk,
  713. [1] = &clk_mout_g2d1.clk,
  714. };
  715. static struct clksrc_sources clkset_mout_g2d = {
  716. .sources = clkset_mout_g2d_list,
  717. .nr_sources = ARRAY_SIZE(clkset_mout_g2d_list),
  718. };
  719. static struct clk *clkset_mout_mfc0_list[] = {
  720. [0] = &clk_mout_mpll.clk,
  721. [1] = &clk_sclk_apll.clk,
  722. };
  723. static struct clksrc_sources clkset_mout_mfc0 = {
  724. .sources = clkset_mout_mfc0_list,
  725. .nr_sources = ARRAY_SIZE(clkset_mout_mfc0_list),
  726. };
  727. static struct clksrc_clk clk_mout_mfc0 = {
  728. .clk = {
  729. .name = "mout_mfc0",
  730. },
  731. .sources = &clkset_mout_mfc0,
  732. .reg_src = { .reg = S5P_CLKSRC_MFC, .shift = 0, .size = 1 },
  733. };
  734. static struct clk *clkset_mout_mfc1_list[] = {
  735. [0] = &clk_mout_epll.clk,
  736. [1] = &clk_sclk_vpll.clk,
  737. };
  738. static struct clksrc_sources clkset_mout_mfc1 = {
  739. .sources = clkset_mout_mfc1_list,
  740. .nr_sources = ARRAY_SIZE(clkset_mout_mfc1_list),
  741. };
  742. static struct clksrc_clk clk_mout_mfc1 = {
  743. .clk = {
  744. .name = "mout_mfc1",
  745. },
  746. .sources = &clkset_mout_mfc1,
  747. .reg_src = { .reg = S5P_CLKSRC_MFC, .shift = 4, .size = 1 },
  748. };
  749. static struct clk *clkset_mout_mfc_list[] = {
  750. [0] = &clk_mout_mfc0.clk,
  751. [1] = &clk_mout_mfc1.clk,
  752. };
  753. static struct clksrc_sources clkset_mout_mfc = {
  754. .sources = clkset_mout_mfc_list,
  755. .nr_sources = ARRAY_SIZE(clkset_mout_mfc_list),
  756. };
  757. static struct clk *clkset_sclk_dac_list[] = {
  758. [0] = &clk_sclk_vpll.clk,
  759. [1] = &clk_sclk_hdmiphy,
  760. };
  761. static struct clksrc_sources clkset_sclk_dac = {
  762. .sources = clkset_sclk_dac_list,
  763. .nr_sources = ARRAY_SIZE(clkset_sclk_dac_list),
  764. };
  765. static struct clksrc_clk clk_sclk_dac = {
  766. .clk = {
  767. .name = "sclk_dac",
  768. .enable = exynos4_clksrc_mask_tv_ctrl,
  769. .ctrlbit = (1 << 8),
  770. },
  771. .sources = &clkset_sclk_dac,
  772. .reg_src = { .reg = S5P_CLKSRC_TV, .shift = 8, .size = 1 },
  773. };
  774. static struct clksrc_clk clk_sclk_pixel = {
  775. .clk = {
  776. .name = "sclk_pixel",
  777. .parent = &clk_sclk_vpll.clk,
  778. },
  779. .reg_div = { .reg = S5P_CLKDIV_TV, .shift = 0, .size = 4 },
  780. };
  781. static struct clk *clkset_sclk_hdmi_list[] = {
  782. [0] = &clk_sclk_pixel.clk,
  783. [1] = &clk_sclk_hdmiphy,
  784. };
  785. static struct clksrc_sources clkset_sclk_hdmi = {
  786. .sources = clkset_sclk_hdmi_list,
  787. .nr_sources = ARRAY_SIZE(clkset_sclk_hdmi_list),
  788. };
  789. static struct clksrc_clk clk_sclk_hdmi = {
  790. .clk = {
  791. .name = "sclk_hdmi",
  792. .enable = exynos4_clksrc_mask_tv_ctrl,
  793. .ctrlbit = (1 << 0),
  794. },
  795. .sources = &clkset_sclk_hdmi,
  796. .reg_src = { .reg = S5P_CLKSRC_TV, .shift = 0, .size = 1 },
  797. };
  798. static struct clk *clkset_sclk_mixer_list[] = {
  799. [0] = &clk_sclk_dac.clk,
  800. [1] = &clk_sclk_hdmi.clk,
  801. };
  802. static struct clksrc_sources clkset_sclk_mixer = {
  803. .sources = clkset_sclk_mixer_list,
  804. .nr_sources = ARRAY_SIZE(clkset_sclk_mixer_list),
  805. };
  806. static struct clksrc_clk clk_sclk_mixer = {
  807. .clk = {
  808. .name = "sclk_mixer",
  809. .enable = exynos4_clksrc_mask_tv_ctrl,
  810. .ctrlbit = (1 << 4),
  811. },
  812. .sources = &clkset_sclk_mixer,
  813. .reg_src = { .reg = S5P_CLKSRC_TV, .shift = 4, .size = 1 },
  814. };
  815. static struct clksrc_clk *sclk_tv[] = {
  816. &clk_sclk_dac,
  817. &clk_sclk_pixel,
  818. &clk_sclk_hdmi,
  819. &clk_sclk_mixer,
  820. };
  821. static struct clksrc_clk clk_dout_mmc0 = {
  822. .clk = {
  823. .name = "dout_mmc0",
  824. },
  825. .sources = &clkset_group,
  826. .reg_src = { .reg = S5P_CLKSRC_FSYS, .shift = 0, .size = 4 },
  827. .reg_div = { .reg = S5P_CLKDIV_FSYS1, .shift = 0, .size = 4 },
  828. };
  829. static struct clksrc_clk clk_dout_mmc1 = {
  830. .clk = {
  831. .name = "dout_mmc1",
  832. },
  833. .sources = &clkset_group,
  834. .reg_src = { .reg = S5P_CLKSRC_FSYS, .shift = 4, .size = 4 },
  835. .reg_div = { .reg = S5P_CLKDIV_FSYS1, .shift = 16, .size = 4 },
  836. };
  837. static struct clksrc_clk clk_dout_mmc2 = {
  838. .clk = {
  839. .name = "dout_mmc2",
  840. },
  841. .sources = &clkset_group,
  842. .reg_src = { .reg = S5P_CLKSRC_FSYS, .shift = 8, .size = 4 },
  843. .reg_div = { .reg = S5P_CLKDIV_FSYS2, .shift = 0, .size = 4 },
  844. };
  845. static struct clksrc_clk clk_dout_mmc3 = {
  846. .clk = {
  847. .name = "dout_mmc3",
  848. },
  849. .sources = &clkset_group,
  850. .reg_src = { .reg = S5P_CLKSRC_FSYS, .shift = 12, .size = 4 },
  851. .reg_div = { .reg = S5P_CLKDIV_FSYS2, .shift = 16, .size = 4 },
  852. };
  853. static struct clksrc_clk clk_dout_mmc4 = {
  854. .clk = {
  855. .name = "dout_mmc4",
  856. },
  857. .sources = &clkset_group,
  858. .reg_src = { .reg = S5P_CLKSRC_FSYS, .shift = 16, .size = 4 },
  859. .reg_div = { .reg = S5P_CLKDIV_FSYS3, .shift = 0, .size = 4 },
  860. };
  861. static struct clksrc_clk clksrcs[] = {
  862. {
  863. .clk = {
  864. .name = "uclk1",
  865. .devname = "s5pv210-uart.0",
  866. .enable = exynos4_clksrc_mask_peril0_ctrl,
  867. .ctrlbit = (1 << 0),
  868. },
  869. .sources = &clkset_group,
  870. .reg_src = { .reg = S5P_CLKSRC_PERIL0, .shift = 0, .size = 4 },
  871. .reg_div = { .reg = S5P_CLKDIV_PERIL0, .shift = 0, .size = 4 },
  872. }, {
  873. .clk = {
  874. .name = "uclk1",
  875. .devname = "s5pv210-uart.1",
  876. .enable = exynos4_clksrc_mask_peril0_ctrl,
  877. .ctrlbit = (1 << 4),
  878. },
  879. .sources = &clkset_group,
  880. .reg_src = { .reg = S5P_CLKSRC_PERIL0, .shift = 4, .size = 4 },
  881. .reg_div = { .reg = S5P_CLKDIV_PERIL0, .shift = 4, .size = 4 },
  882. }, {
  883. .clk = {
  884. .name = "uclk1",
  885. .devname = "s5pv210-uart.2",
  886. .enable = exynos4_clksrc_mask_peril0_ctrl,
  887. .ctrlbit = (1 << 8),
  888. },
  889. .sources = &clkset_group,
  890. .reg_src = { .reg = S5P_CLKSRC_PERIL0, .shift = 8, .size = 4 },
  891. .reg_div = { .reg = S5P_CLKDIV_PERIL0, .shift = 8, .size = 4 },
  892. }, {
  893. .clk = {
  894. .name = "uclk1",
  895. .devname = "s5pv210-uart.3",
  896. .enable = exynos4_clksrc_mask_peril0_ctrl,
  897. .ctrlbit = (1 << 12),
  898. },
  899. .sources = &clkset_group,
  900. .reg_src = { .reg = S5P_CLKSRC_PERIL0, .shift = 12, .size = 4 },
  901. .reg_div = { .reg = S5P_CLKDIV_PERIL0, .shift = 12, .size = 4 },
  902. }, {
  903. .clk = {
  904. .name = "sclk_pwm",
  905. .enable = exynos4_clksrc_mask_peril0_ctrl,
  906. .ctrlbit = (1 << 24),
  907. },
  908. .sources = &clkset_group,
  909. .reg_src = { .reg = S5P_CLKSRC_PERIL0, .shift = 24, .size = 4 },
  910. .reg_div = { .reg = S5P_CLKDIV_PERIL3, .shift = 0, .size = 4 },
  911. }, {
  912. .clk = {
  913. .name = "sclk_csis",
  914. .devname = "s5p-mipi-csis.0",
  915. .enable = exynos4_clksrc_mask_cam_ctrl,
  916. .ctrlbit = (1 << 24),
  917. },
  918. .sources = &clkset_group,
  919. .reg_src = { .reg = S5P_CLKSRC_CAM, .shift = 24, .size = 4 },
  920. .reg_div = { .reg = S5P_CLKDIV_CAM, .shift = 24, .size = 4 },
  921. }, {
  922. .clk = {
  923. .name = "sclk_csis",
  924. .devname = "s5p-mipi-csis.1",
  925. .enable = exynos4_clksrc_mask_cam_ctrl,
  926. .ctrlbit = (1 << 28),
  927. },
  928. .sources = &clkset_group,
  929. .reg_src = { .reg = S5P_CLKSRC_CAM, .shift = 28, .size = 4 },
  930. .reg_div = { .reg = S5P_CLKDIV_CAM, .shift = 28, .size = 4 },
  931. }, {
  932. .clk = {
  933. .name = "sclk_cam0",
  934. .enable = exynos4_clksrc_mask_cam_ctrl,
  935. .ctrlbit = (1 << 16),
  936. },
  937. .sources = &clkset_group,
  938. .reg_src = { .reg = S5P_CLKSRC_CAM, .shift = 16, .size = 4 },
  939. .reg_div = { .reg = S5P_CLKDIV_CAM, .shift = 16, .size = 4 },
  940. }, {
  941. .clk = {
  942. .name = "sclk_cam1",
  943. .enable = exynos4_clksrc_mask_cam_ctrl,
  944. .ctrlbit = (1 << 20),
  945. },
  946. .sources = &clkset_group,
  947. .reg_src = { .reg = S5P_CLKSRC_CAM, .shift = 20, .size = 4 },
  948. .reg_div = { .reg = S5P_CLKDIV_CAM, .shift = 20, .size = 4 },
  949. }, {
  950. .clk = {
  951. .name = "sclk_fimc",
  952. .devname = "exynos4-fimc.0",
  953. .enable = exynos4_clksrc_mask_cam_ctrl,
  954. .ctrlbit = (1 << 0),
  955. },
  956. .sources = &clkset_group,
  957. .reg_src = { .reg = S5P_CLKSRC_CAM, .shift = 0, .size = 4 },
  958. .reg_div = { .reg = S5P_CLKDIV_CAM, .shift = 0, .size = 4 },
  959. }, {
  960. .clk = {
  961. .name = "sclk_fimc",
  962. .devname = "exynos4-fimc.1",
  963. .enable = exynos4_clksrc_mask_cam_ctrl,
  964. .ctrlbit = (1 << 4),
  965. },
  966. .sources = &clkset_group,
  967. .reg_src = { .reg = S5P_CLKSRC_CAM, .shift = 4, .size = 4 },
  968. .reg_div = { .reg = S5P_CLKDIV_CAM, .shift = 4, .size = 4 },
  969. }, {
  970. .clk = {
  971. .name = "sclk_fimc",
  972. .devname = "exynos4-fimc.2",
  973. .enable = exynos4_clksrc_mask_cam_ctrl,
  974. .ctrlbit = (1 << 8),
  975. },
  976. .sources = &clkset_group,
  977. .reg_src = { .reg = S5P_CLKSRC_CAM, .shift = 8, .size = 4 },
  978. .reg_div = { .reg = S5P_CLKDIV_CAM, .shift = 8, .size = 4 },
  979. }, {
  980. .clk = {
  981. .name = "sclk_fimc",
  982. .devname = "exynos4-fimc.3",
  983. .enable = exynos4_clksrc_mask_cam_ctrl,
  984. .ctrlbit = (1 << 12),
  985. },
  986. .sources = &clkset_group,
  987. .reg_src = { .reg = S5P_CLKSRC_CAM, .shift = 12, .size = 4 },
  988. .reg_div = { .reg = S5P_CLKDIV_CAM, .shift = 12, .size = 4 },
  989. }, {
  990. .clk = {
  991. .name = "sclk_fimd",
  992. .devname = "exynos4-fb.0",
  993. .enable = exynos4_clksrc_mask_lcd0_ctrl,
  994. .ctrlbit = (1 << 0),
  995. },
  996. .sources = &clkset_group,
  997. .reg_src = { .reg = S5P_CLKSRC_LCD0, .shift = 0, .size = 4 },
  998. .reg_div = { .reg = S5P_CLKDIV_LCD0, .shift = 0, .size = 4 },
  999. }, {
  1000. .clk = {
  1001. .name = "sclk_fimd",
  1002. .devname = "exynos4-fb.1",
  1003. .enable = exynos4_clksrc_mask_lcd1_ctrl,
  1004. .ctrlbit = (1 << 0),
  1005. },
  1006. .sources = &clkset_group,
  1007. .reg_src = { .reg = S5P_CLKSRC_LCD1, .shift = 0, .size = 4 },
  1008. .reg_div = { .reg = S5P_CLKDIV_LCD1, .shift = 0, .size = 4 },
  1009. }, {
  1010. .clk = {
  1011. .name = "sclk_sata",
  1012. .enable = exynos4_clksrc_mask_fsys_ctrl,
  1013. .ctrlbit = (1 << 24),
  1014. },
  1015. .sources = &clkset_mout_corebus,
  1016. .reg_src = { .reg = S5P_CLKSRC_FSYS, .shift = 24, .size = 1 },
  1017. .reg_div = { .reg = S5P_CLKDIV_FSYS0, .shift = 20, .size = 4 },
  1018. }, {
  1019. .clk = {
  1020. .name = "sclk_spi",
  1021. .devname = "s3c64xx-spi.0",
  1022. .enable = exynos4_clksrc_mask_peril1_ctrl,
  1023. .ctrlbit = (1 << 16),
  1024. },
  1025. .sources = &clkset_group,
  1026. .reg_src = { .reg = S5P_CLKSRC_PERIL1, .shift = 16, .size = 4 },
  1027. .reg_div = { .reg = S5P_CLKDIV_PERIL1, .shift = 0, .size = 4 },
  1028. }, {
  1029. .clk = {
  1030. .name = "sclk_spi",
  1031. .devname = "s3c64xx-spi.1",
  1032. .enable = exynos4_clksrc_mask_peril1_ctrl,
  1033. .ctrlbit = (1 << 20),
  1034. },
  1035. .sources = &clkset_group,
  1036. .reg_src = { .reg = S5P_CLKSRC_PERIL1, .shift = 20, .size = 4 },
  1037. .reg_div = { .reg = S5P_CLKDIV_PERIL1, .shift = 16, .size = 4 },
  1038. }, {
  1039. .clk = {
  1040. .name = "sclk_spi",
  1041. .devname = "s3c64xx-spi.2",
  1042. .enable = exynos4_clksrc_mask_peril1_ctrl,
  1043. .ctrlbit = (1 << 24),
  1044. },
  1045. .sources = &clkset_group,
  1046. .reg_src = { .reg = S5P_CLKSRC_PERIL1, .shift = 24, .size = 4 },
  1047. .reg_div = { .reg = S5P_CLKDIV_PERIL2, .shift = 0, .size = 4 },
  1048. }, {
  1049. .clk = {
  1050. .name = "sclk_fimg2d",
  1051. },
  1052. .sources = &clkset_mout_g2d,
  1053. .reg_src = { .reg = S5P_CLKSRC_IMAGE, .shift = 8, .size = 1 },
  1054. .reg_div = { .reg = S5P_CLKDIV_IMAGE, .shift = 0, .size = 4 },
  1055. }, {
  1056. .clk = {
  1057. .name = "sclk_mfc",
  1058. .devname = "s5p-mfc",
  1059. },
  1060. .sources = &clkset_mout_mfc,
  1061. .reg_src = { .reg = S5P_CLKSRC_MFC, .shift = 8, .size = 1 },
  1062. .reg_div = { .reg = S5P_CLKDIV_MFC, .shift = 0, .size = 4 },
  1063. }, {
  1064. .clk = {
  1065. .name = "sclk_mmc",
  1066. .devname = "s3c-sdhci.0",
  1067. .parent = &clk_dout_mmc0.clk,
  1068. .enable = exynos4_clksrc_mask_fsys_ctrl,
  1069. .ctrlbit = (1 << 0),
  1070. },
  1071. .reg_div = { .reg = S5P_CLKDIV_FSYS1, .shift = 8, .size = 8 },
  1072. }, {
  1073. .clk = {
  1074. .name = "sclk_mmc",
  1075. .devname = "s3c-sdhci.1",
  1076. .parent = &clk_dout_mmc1.clk,
  1077. .enable = exynos4_clksrc_mask_fsys_ctrl,
  1078. .ctrlbit = (1 << 4),
  1079. },
  1080. .reg_div = { .reg = S5P_CLKDIV_FSYS1, .shift = 24, .size = 8 },
  1081. }, {
  1082. .clk = {
  1083. .name = "sclk_mmc",
  1084. .devname = "s3c-sdhci.2",
  1085. .parent = &clk_dout_mmc2.clk,
  1086. .enable = exynos4_clksrc_mask_fsys_ctrl,
  1087. .ctrlbit = (1 << 8),
  1088. },
  1089. .reg_div = { .reg = S5P_CLKDIV_FSYS2, .shift = 8, .size = 8 },
  1090. }, {
  1091. .clk = {
  1092. .name = "sclk_mmc",
  1093. .devname = "s3c-sdhci.3",
  1094. .parent = &clk_dout_mmc3.clk,
  1095. .enable = exynos4_clksrc_mask_fsys_ctrl,
  1096. .ctrlbit = (1 << 12),
  1097. },
  1098. .reg_div = { .reg = S5P_CLKDIV_FSYS2, .shift = 24, .size = 8 },
  1099. }, {
  1100. .clk = {
  1101. .name = "sclk_dwmmc",
  1102. .parent = &clk_dout_mmc4.clk,
  1103. .enable = exynos4_clksrc_mask_fsys_ctrl,
  1104. .ctrlbit = (1 << 16),
  1105. },
  1106. .reg_div = { .reg = S5P_CLKDIV_FSYS3, .shift = 8, .size = 8 },
  1107. }
  1108. };
  1109. /* Clock initialization code */
  1110. static struct clksrc_clk *sysclks[] = {
  1111. &clk_mout_apll,
  1112. &clk_sclk_apll,
  1113. &clk_mout_epll,
  1114. &clk_mout_mpll,
  1115. &clk_moutcore,
  1116. &clk_coreclk,
  1117. &clk_armclk,
  1118. &clk_aclk_corem0,
  1119. &clk_aclk_cores,
  1120. &clk_aclk_corem1,
  1121. &clk_periphclk,
  1122. &clk_mout_corebus,
  1123. &clk_sclk_dmc,
  1124. &clk_aclk_cored,
  1125. &clk_aclk_corep,
  1126. &clk_aclk_acp,
  1127. &clk_pclk_acp,
  1128. &clk_vpllsrc,
  1129. &clk_sclk_vpll,
  1130. &clk_aclk_200,
  1131. &clk_aclk_100,
  1132. &clk_aclk_160,
  1133. &clk_aclk_133,
  1134. &clk_dout_mmc0,
  1135. &clk_dout_mmc1,
  1136. &clk_dout_mmc2,
  1137. &clk_dout_mmc3,
  1138. &clk_dout_mmc4,
  1139. &clk_mout_mfc0,
  1140. &clk_mout_mfc1,
  1141. };
  1142. static int xtal_rate;
  1143. static unsigned long exynos4_fout_apll_get_rate(struct clk *clk)
  1144. {
  1145. return s5p_get_pll45xx(xtal_rate, __raw_readl(S5P_APLL_CON0), pll_4508);
  1146. }
  1147. static struct clk_ops exynos4_fout_apll_ops = {
  1148. .get_rate = exynos4_fout_apll_get_rate,
  1149. };
  1150. static u32 vpll_div[][8] = {
  1151. { 54000000, 3, 53, 3, 1024, 0, 17, 0 },
  1152. { 108000000, 3, 53, 2, 1024, 0, 17, 0 },
  1153. };
  1154. static unsigned long exynos4_vpll_get_rate(struct clk *clk)
  1155. {
  1156. return clk->rate;
  1157. }
  1158. static int exynos4_vpll_set_rate(struct clk *clk, unsigned long rate)
  1159. {
  1160. unsigned int vpll_con0, vpll_con1 = 0;
  1161. unsigned int i;
  1162. /* Return if nothing changed */
  1163. if (clk->rate == rate)
  1164. return 0;
  1165. vpll_con0 = __raw_readl(S5P_VPLL_CON0);
  1166. vpll_con0 &= ~(0x1 << 27 | \
  1167. PLL90XX_MDIV_MASK << PLL46XX_MDIV_SHIFT | \
  1168. PLL90XX_PDIV_MASK << PLL46XX_PDIV_SHIFT | \
  1169. PLL90XX_SDIV_MASK << PLL46XX_SDIV_SHIFT);
  1170. vpll_con1 = __raw_readl(S5P_VPLL_CON1);
  1171. vpll_con1 &= ~(PLL46XX_MRR_MASK << PLL46XX_MRR_SHIFT | \
  1172. PLL46XX_MFR_MASK << PLL46XX_MFR_SHIFT | \
  1173. PLL4650C_KDIV_MASK << PLL46XX_KDIV_SHIFT);
  1174. for (i = 0; i < ARRAY_SIZE(vpll_div); i++) {
  1175. if (vpll_div[i][0] == rate) {
  1176. vpll_con0 |= vpll_div[i][1] << PLL46XX_PDIV_SHIFT;
  1177. vpll_con0 |= vpll_div[i][2] << PLL46XX_MDIV_SHIFT;
  1178. vpll_con0 |= vpll_div[i][3] << PLL46XX_SDIV_SHIFT;
  1179. vpll_con1 |= vpll_div[i][4] << PLL46XX_KDIV_SHIFT;
  1180. vpll_con1 |= vpll_div[i][5] << PLL46XX_MFR_SHIFT;
  1181. vpll_con1 |= vpll_div[i][6] << PLL46XX_MRR_SHIFT;
  1182. vpll_con0 |= vpll_div[i][7] << 27;
  1183. break;
  1184. }
  1185. }
  1186. if (i == ARRAY_SIZE(vpll_div)) {
  1187. printk(KERN_ERR "%s: Invalid Clock VPLL Frequency\n",
  1188. __func__);
  1189. return -EINVAL;
  1190. }
  1191. __raw_writel(vpll_con0, S5P_VPLL_CON0);
  1192. __raw_writel(vpll_con1, S5P_VPLL_CON1);
  1193. /* Wait for VPLL lock */
  1194. while (!(__raw_readl(S5P_VPLL_CON0) & (1 << PLL46XX_LOCKED_SHIFT)))
  1195. continue;
  1196. clk->rate = rate;
  1197. return 0;
  1198. }
  1199. static struct clk_ops exynos4_vpll_ops = {
  1200. .get_rate = exynos4_vpll_get_rate,
  1201. .set_rate = exynos4_vpll_set_rate,
  1202. };
  1203. void __init_or_cpufreq exynos4_setup_clocks(void)
  1204. {
  1205. struct clk *xtal_clk;
  1206. unsigned long apll;
  1207. unsigned long mpll;
  1208. unsigned long epll;
  1209. unsigned long vpll;
  1210. unsigned long vpllsrc;
  1211. unsigned long xtal;
  1212. unsigned long armclk;
  1213. unsigned long sclk_dmc;
  1214. unsigned long aclk_200;
  1215. unsigned long aclk_100;
  1216. unsigned long aclk_160;
  1217. unsigned long aclk_133;
  1218. unsigned int ptr;
  1219. printk(KERN_DEBUG "%s: registering clocks\n", __func__);
  1220. xtal_clk = clk_get(NULL, "xtal");
  1221. BUG_ON(IS_ERR(xtal_clk));
  1222. xtal = clk_get_rate(xtal_clk);
  1223. xtal_rate = xtal;
  1224. clk_put(xtal_clk);
  1225. printk(KERN_DEBUG "%s: xtal is %ld\n", __func__, xtal);
  1226. apll = s5p_get_pll45xx(xtal, __raw_readl(S5P_APLL_CON0), pll_4508);
  1227. mpll = s5p_get_pll45xx(xtal, __raw_readl(S5P_MPLL_CON0), pll_4508);
  1228. epll = s5p_get_pll46xx(xtal, __raw_readl(S5P_EPLL_CON0),
  1229. __raw_readl(S5P_EPLL_CON1), pll_4600);
  1230. vpllsrc = clk_get_rate(&clk_vpllsrc.clk);
  1231. vpll = s5p_get_pll46xx(vpllsrc, __raw_readl(S5P_VPLL_CON0),
  1232. __raw_readl(S5P_VPLL_CON1), pll_4650c);
  1233. clk_fout_apll.ops = &exynos4_fout_apll_ops;
  1234. clk_fout_mpll.rate = mpll;
  1235. clk_fout_epll.rate = epll;
  1236. clk_fout_vpll.ops = &exynos4_vpll_ops;
  1237. clk_fout_vpll.rate = vpll;
  1238. printk(KERN_INFO "EXYNOS4: PLL settings, A=%ld, M=%ld, E=%ld V=%ld",
  1239. apll, mpll, epll, vpll);
  1240. armclk = clk_get_rate(&clk_armclk.clk);
  1241. sclk_dmc = clk_get_rate(&clk_sclk_dmc.clk);
  1242. aclk_200 = clk_get_rate(&clk_aclk_200.clk);
  1243. aclk_100 = clk_get_rate(&clk_aclk_100.clk);
  1244. aclk_160 = clk_get_rate(&clk_aclk_160.clk);
  1245. aclk_133 = clk_get_rate(&clk_aclk_133.clk);
  1246. printk(KERN_INFO "EXYNOS4: ARMCLK=%ld, DMC=%ld, ACLK200=%ld\n"
  1247. "ACLK100=%ld, ACLK160=%ld, ACLK133=%ld\n",
  1248. armclk, sclk_dmc, aclk_200,
  1249. aclk_100, aclk_160, aclk_133);
  1250. clk_f.rate = armclk;
  1251. clk_h.rate = sclk_dmc;
  1252. clk_p.rate = aclk_100;
  1253. for (ptr = 0; ptr < ARRAY_SIZE(clksrcs); ptr++)
  1254. s3c_set_clksrc(&clksrcs[ptr], true);
  1255. }
  1256. static struct clk *clks[] __initdata = {
  1257. &clk_sclk_hdmi27m,
  1258. &clk_sclk_hdmiphy,
  1259. &clk_sclk_usbphy0,
  1260. &clk_sclk_usbphy1,
  1261. };
  1262. void __init exynos4_register_clocks(void)
  1263. {
  1264. int ptr;
  1265. s3c24xx_register_clocks(clks, ARRAY_SIZE(clks));
  1266. for (ptr = 0; ptr < ARRAY_SIZE(sysclks); ptr++)
  1267. s3c_register_clksrc(sysclks[ptr], 1);
  1268. for (ptr = 0; ptr < ARRAY_SIZE(sclk_tv); ptr++)
  1269. s3c_register_clksrc(sclk_tv[ptr], 1);
  1270. s3c_register_clksrc(clksrcs, ARRAY_SIZE(clksrcs));
  1271. s3c_register_clocks(init_clocks, ARRAY_SIZE(init_clocks));
  1272. s3c_register_clocks(init_clocks_off, ARRAY_SIZE(init_clocks_off));
  1273. s3c_disable_clocks(init_clocks_off, ARRAY_SIZE(init_clocks_off));
  1274. s3c24xx_register_clock(&dummy_apb_pclk);
  1275. s3c_pwmclk_init();
  1276. }