clock2430_data.c 61 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411141214131414141514161417141814191420142114221423142414251426142714281429143014311432143314341435143614371438143914401441144214431444144514461447144814491450145114521453145414551456145714581459146014611462146314641465146614671468146914701471147214731474147514761477147814791480148114821483148414851486148714881489149014911492149314941495149614971498149915001501150215031504150515061507150815091510151115121513151415151516151715181519152015211522152315241525152615271528152915301531153215331534153515361537153815391540154115421543154415451546154715481549155015511552155315541555155615571558155915601561156215631564156515661567156815691570157115721573157415751576157715781579158015811582158315841585158615871588158915901591159215931594159515961597159815991600160116021603160416051606160716081609161016111612161316141615161616171618161916201621162216231624162516261627162816291630163116321633163416351636163716381639164016411642164316441645164616471648164916501651165216531654165516561657165816591660166116621663166416651666166716681669167016711672167316741675167616771678167916801681168216831684168516861687168816891690169116921693169416951696169716981699170017011702170317041705170617071708170917101711171217131714171517161717171817191720172117221723172417251726172717281729173017311732173317341735173617371738173917401741174217431744174517461747174817491750175117521753175417551756175717581759176017611762176317641765176617671768176917701771177217731774177517761777177817791780178117821783178417851786178717881789179017911792179317941795179617971798179918001801180218031804180518061807180818091810181118121813181418151816181718181819182018211822182318241825182618271828182918301831183218331834183518361837183818391840184118421843184418451846184718481849185018511852185318541855185618571858185918601861186218631864186518661867186818691870187118721873187418751876187718781879188018811882188318841885188618871888188918901891189218931894189518961897189818991900190119021903190419051906190719081909191019111912191319141915191619171918191919201921192219231924192519261927192819291930193119321933193419351936193719381939194019411942194319441945194619471948194919501951195219531954195519561957195819591960196119621963196419651966196719681969197019711972197319741975197619771978197919801981198219831984198519861987198819891990199119921993199419951996199719981999200020012002200320042005200620072008200920102011201220132014201520162017201820192020202120222023202420252026202720282029203020312032203320342035203620372038203920402041204220432044204520462047204820492050205120522053205420552056205720582059206020612062206320642065
  1. /*
  2. * OMAP2430 clock data
  3. *
  4. * Copyright (C) 2005-2009 Texas Instruments, Inc.
  5. * Copyright (C) 2004-2011 Nokia Corporation
  6. *
  7. * Contacts:
  8. * Richard Woodruff <r-woodruff2@ti.com>
  9. * Paul Walmsley
  10. *
  11. * This program is free software; you can redistribute it and/or modify
  12. * it under the terms of the GNU General Public License version 2 as
  13. * published by the Free Software Foundation.
  14. */
  15. #include <linux/kernel.h>
  16. #include <linux/clk.h>
  17. #include <linux/list.h>
  18. #include <plat/hardware.h>
  19. #include <plat/clkdev_omap.h>
  20. #include "iomap.h"
  21. #include "clock.h"
  22. #include "clock2xxx.h"
  23. #include "opp2xxx.h"
  24. #include "cm2xxx_3xxx.h"
  25. #include "prm2xxx_3xxx.h"
  26. #include "prm-regbits-24xx.h"
  27. #include "cm-regbits-24xx.h"
  28. #include "sdrc.h"
  29. #include "control.h"
  30. #define OMAP_CM_REGADDR OMAP2430_CM_REGADDR
  31. /*
  32. * 2430 clock tree.
  33. *
  34. * NOTE:In many cases here we are assigning a 'default' parent. In
  35. * many cases the parent is selectable. The set parent calls will
  36. * also switch sources.
  37. *
  38. * Several sources are given initial rates which may be wrong, this will
  39. * be fixed up in the init func.
  40. *
  41. * Things are broadly separated below by clock domains. It is
  42. * noteworthy that most peripherals have dependencies on multiple clock
  43. * domains. Many get their interface clocks from the L4 domain, but get
  44. * functional clocks from fixed sources or other core domain derived
  45. * clocks.
  46. */
  47. /* Base external input clocks */
  48. static struct clk func_32k_ck = {
  49. .name = "func_32k_ck",
  50. .ops = &clkops_null,
  51. .rate = 32768,
  52. .clkdm_name = "wkup_clkdm",
  53. };
  54. static struct clk secure_32k_ck = {
  55. .name = "secure_32k_ck",
  56. .ops = &clkops_null,
  57. .rate = 32768,
  58. .clkdm_name = "wkup_clkdm",
  59. };
  60. /* Typical 12/13MHz in standalone mode, will be 26Mhz in chassis mode */
  61. static struct clk osc_ck = { /* (*12, *13, 19.2, *26, 38.4)MHz */
  62. .name = "osc_ck",
  63. .ops = &clkops_oscck,
  64. .clkdm_name = "wkup_clkdm",
  65. .recalc = &omap2_osc_clk_recalc,
  66. };
  67. /* Without modem likely 12MHz, with modem likely 13MHz */
  68. static struct clk sys_ck = { /* (*12, *13, 19.2, 26, 38.4)MHz */
  69. .name = "sys_ck", /* ~ ref_clk also */
  70. .ops = &clkops_null,
  71. .parent = &osc_ck,
  72. .clkdm_name = "wkup_clkdm",
  73. .recalc = &omap2xxx_sys_clk_recalc,
  74. };
  75. static struct clk alt_ck = { /* Typical 54M or 48M, may not exist */
  76. .name = "alt_ck",
  77. .ops = &clkops_null,
  78. .rate = 54000000,
  79. .clkdm_name = "wkup_clkdm",
  80. };
  81. /* Optional external clock input for McBSP CLKS */
  82. static struct clk mcbsp_clks = {
  83. .name = "mcbsp_clks",
  84. .ops = &clkops_null,
  85. };
  86. /*
  87. * Analog domain root source clocks
  88. */
  89. /* dpll_ck, is broken out in to special cases through clksel */
  90. /* REVISIT: Rate changes on dpll_ck trigger a full set change. ...
  91. * deal with this
  92. */
  93. static struct dpll_data dpll_dd = {
  94. .mult_div1_reg = OMAP_CM_REGADDR(PLL_MOD, CM_CLKSEL1),
  95. .mult_mask = OMAP24XX_DPLL_MULT_MASK,
  96. .div1_mask = OMAP24XX_DPLL_DIV_MASK,
  97. .clk_bypass = &sys_ck,
  98. .clk_ref = &sys_ck,
  99. .control_reg = OMAP_CM_REGADDR(PLL_MOD, CM_CLKEN),
  100. .enable_mask = OMAP24XX_EN_DPLL_MASK,
  101. .max_multiplier = 1023,
  102. .min_divider = 1,
  103. .max_divider = 16,
  104. };
  105. /*
  106. * XXX Cannot add round_rate here yet, as this is still a composite clock,
  107. * not just a DPLL
  108. */
  109. static struct clk dpll_ck = {
  110. .name = "dpll_ck",
  111. .ops = &clkops_omap2xxx_dpll_ops,
  112. .parent = &sys_ck, /* Can be func_32k also */
  113. .dpll_data = &dpll_dd,
  114. .clkdm_name = "wkup_clkdm",
  115. .recalc = &omap2_dpllcore_recalc,
  116. .set_rate = &omap2_reprogram_dpllcore,
  117. };
  118. static struct clk apll96_ck = {
  119. .name = "apll96_ck",
  120. .ops = &clkops_apll96,
  121. .parent = &sys_ck,
  122. .rate = 96000000,
  123. .flags = ENABLE_ON_INIT,
  124. .clkdm_name = "wkup_clkdm",
  125. .enable_reg = OMAP_CM_REGADDR(PLL_MOD, CM_CLKEN),
  126. .enable_bit = OMAP24XX_EN_96M_PLL_SHIFT,
  127. };
  128. static struct clk apll54_ck = {
  129. .name = "apll54_ck",
  130. .ops = &clkops_apll54,
  131. .parent = &sys_ck,
  132. .rate = 54000000,
  133. .flags = ENABLE_ON_INIT,
  134. .clkdm_name = "wkup_clkdm",
  135. .enable_reg = OMAP_CM_REGADDR(PLL_MOD, CM_CLKEN),
  136. .enable_bit = OMAP24XX_EN_54M_PLL_SHIFT,
  137. };
  138. /*
  139. * PRCM digital base sources
  140. */
  141. /* func_54m_ck */
  142. static const struct clksel_rate func_54m_apll54_rates[] = {
  143. { .div = 1, .val = 0, .flags = RATE_IN_24XX },
  144. { .div = 0 },
  145. };
  146. static const struct clksel_rate func_54m_alt_rates[] = {
  147. { .div = 1, .val = 1, .flags = RATE_IN_24XX },
  148. { .div = 0 },
  149. };
  150. static const struct clksel func_54m_clksel[] = {
  151. { .parent = &apll54_ck, .rates = func_54m_apll54_rates, },
  152. { .parent = &alt_ck, .rates = func_54m_alt_rates, },
  153. { .parent = NULL },
  154. };
  155. static struct clk func_54m_ck = {
  156. .name = "func_54m_ck",
  157. .ops = &clkops_null,
  158. .parent = &apll54_ck, /* can also be alt_clk */
  159. .clkdm_name = "wkup_clkdm",
  160. .init = &omap2_init_clksel_parent,
  161. .clksel_reg = OMAP_CM_REGADDR(PLL_MOD, CM_CLKSEL1),
  162. .clksel_mask = OMAP24XX_54M_SOURCE_MASK,
  163. .clksel = func_54m_clksel,
  164. .recalc = &omap2_clksel_recalc,
  165. };
  166. static struct clk core_ck = {
  167. .name = "core_ck",
  168. .ops = &clkops_null,
  169. .parent = &dpll_ck, /* can also be 32k */
  170. .clkdm_name = "wkup_clkdm",
  171. .recalc = &followparent_recalc,
  172. };
  173. /* func_96m_ck */
  174. static const struct clksel_rate func_96m_apll96_rates[] = {
  175. { .div = 1, .val = 0, .flags = RATE_IN_24XX },
  176. { .div = 0 },
  177. };
  178. static const struct clksel_rate func_96m_alt_rates[] = {
  179. { .div = 1, .val = 1, .flags = RATE_IN_243X },
  180. { .div = 0 },
  181. };
  182. static const struct clksel func_96m_clksel[] = {
  183. { .parent = &apll96_ck, .rates = func_96m_apll96_rates },
  184. { .parent = &alt_ck, .rates = func_96m_alt_rates },
  185. { .parent = NULL }
  186. };
  187. static struct clk func_96m_ck = {
  188. .name = "func_96m_ck",
  189. .ops = &clkops_null,
  190. .parent = &apll96_ck,
  191. .clkdm_name = "wkup_clkdm",
  192. .init = &omap2_init_clksel_parent,
  193. .clksel_reg = OMAP_CM_REGADDR(PLL_MOD, CM_CLKSEL1),
  194. .clksel_mask = OMAP2430_96M_SOURCE_MASK,
  195. .clksel = func_96m_clksel,
  196. .recalc = &omap2_clksel_recalc,
  197. };
  198. /* func_48m_ck */
  199. static const struct clksel_rate func_48m_apll96_rates[] = {
  200. { .div = 2, .val = 0, .flags = RATE_IN_24XX },
  201. { .div = 0 },
  202. };
  203. static const struct clksel_rate func_48m_alt_rates[] = {
  204. { .div = 1, .val = 1, .flags = RATE_IN_24XX },
  205. { .div = 0 },
  206. };
  207. static const struct clksel func_48m_clksel[] = {
  208. { .parent = &apll96_ck, .rates = func_48m_apll96_rates },
  209. { .parent = &alt_ck, .rates = func_48m_alt_rates },
  210. { .parent = NULL }
  211. };
  212. static struct clk func_48m_ck = {
  213. .name = "func_48m_ck",
  214. .ops = &clkops_null,
  215. .parent = &apll96_ck, /* 96M or Alt */
  216. .clkdm_name = "wkup_clkdm",
  217. .init = &omap2_init_clksel_parent,
  218. .clksel_reg = OMAP_CM_REGADDR(PLL_MOD, CM_CLKSEL1),
  219. .clksel_mask = OMAP24XX_48M_SOURCE_MASK,
  220. .clksel = func_48m_clksel,
  221. .recalc = &omap2_clksel_recalc,
  222. .round_rate = &omap2_clksel_round_rate,
  223. .set_rate = &omap2_clksel_set_rate
  224. };
  225. static struct clk func_12m_ck = {
  226. .name = "func_12m_ck",
  227. .ops = &clkops_null,
  228. .parent = &func_48m_ck,
  229. .fixed_div = 4,
  230. .clkdm_name = "wkup_clkdm",
  231. .recalc = &omap_fixed_divisor_recalc,
  232. };
  233. /* Secure timer, only available in secure mode */
  234. static struct clk wdt1_osc_ck = {
  235. .name = "ck_wdt1_osc",
  236. .ops = &clkops_null, /* RMK: missing? */
  237. .parent = &osc_ck,
  238. .recalc = &followparent_recalc,
  239. };
  240. /*
  241. * The common_clkout* clksel_rate structs are common to
  242. * sys_clkout, sys_clkout_src, sys_clkout2, and sys_clkout2_src.
  243. * sys_clkout2_* are 2420-only, so the
  244. * clksel_rate flags fields are inaccurate for those clocks. This is
  245. * harmless since access to those clocks are gated by the struct clk
  246. * flags fields, which mark them as 2420-only.
  247. */
  248. static const struct clksel_rate common_clkout_src_core_rates[] = {
  249. { .div = 1, .val = 0, .flags = RATE_IN_24XX },
  250. { .div = 0 }
  251. };
  252. static const struct clksel_rate common_clkout_src_sys_rates[] = {
  253. { .div = 1, .val = 1, .flags = RATE_IN_24XX },
  254. { .div = 0 }
  255. };
  256. static const struct clksel_rate common_clkout_src_96m_rates[] = {
  257. { .div = 1, .val = 2, .flags = RATE_IN_24XX },
  258. { .div = 0 }
  259. };
  260. static const struct clksel_rate common_clkout_src_54m_rates[] = {
  261. { .div = 1, .val = 3, .flags = RATE_IN_24XX },
  262. { .div = 0 }
  263. };
  264. static const struct clksel common_clkout_src_clksel[] = {
  265. { .parent = &core_ck, .rates = common_clkout_src_core_rates },
  266. { .parent = &sys_ck, .rates = common_clkout_src_sys_rates },
  267. { .parent = &func_96m_ck, .rates = common_clkout_src_96m_rates },
  268. { .parent = &func_54m_ck, .rates = common_clkout_src_54m_rates },
  269. { .parent = NULL }
  270. };
  271. static struct clk sys_clkout_src = {
  272. .name = "sys_clkout_src",
  273. .ops = &clkops_omap2_dflt,
  274. .parent = &func_54m_ck,
  275. .clkdm_name = "wkup_clkdm",
  276. .enable_reg = OMAP2430_PRCM_CLKOUT_CTRL,
  277. .enable_bit = OMAP24XX_CLKOUT_EN_SHIFT,
  278. .init = &omap2_init_clksel_parent,
  279. .clksel_reg = OMAP2430_PRCM_CLKOUT_CTRL,
  280. .clksel_mask = OMAP24XX_CLKOUT_SOURCE_MASK,
  281. .clksel = common_clkout_src_clksel,
  282. .recalc = &omap2_clksel_recalc,
  283. .round_rate = &omap2_clksel_round_rate,
  284. .set_rate = &omap2_clksel_set_rate
  285. };
  286. static const struct clksel_rate common_clkout_rates[] = {
  287. { .div = 1, .val = 0, .flags = RATE_IN_24XX },
  288. { .div = 2, .val = 1, .flags = RATE_IN_24XX },
  289. { .div = 4, .val = 2, .flags = RATE_IN_24XX },
  290. { .div = 8, .val = 3, .flags = RATE_IN_24XX },
  291. { .div = 16, .val = 4, .flags = RATE_IN_24XX },
  292. { .div = 0 },
  293. };
  294. static const struct clksel sys_clkout_clksel[] = {
  295. { .parent = &sys_clkout_src, .rates = common_clkout_rates },
  296. { .parent = NULL }
  297. };
  298. static struct clk sys_clkout = {
  299. .name = "sys_clkout",
  300. .ops = &clkops_null,
  301. .parent = &sys_clkout_src,
  302. .clkdm_name = "wkup_clkdm",
  303. .clksel_reg = OMAP2430_PRCM_CLKOUT_CTRL,
  304. .clksel_mask = OMAP24XX_CLKOUT_DIV_MASK,
  305. .clksel = sys_clkout_clksel,
  306. .recalc = &omap2_clksel_recalc,
  307. .round_rate = &omap2_clksel_round_rate,
  308. .set_rate = &omap2_clksel_set_rate
  309. };
  310. static struct clk emul_ck = {
  311. .name = "emul_ck",
  312. .ops = &clkops_omap2_dflt,
  313. .parent = &func_54m_ck,
  314. .clkdm_name = "wkup_clkdm",
  315. .enable_reg = OMAP2430_PRCM_CLKEMUL_CTRL,
  316. .enable_bit = OMAP24XX_EMULATION_EN_SHIFT,
  317. .recalc = &followparent_recalc,
  318. };
  319. /*
  320. * MPU clock domain
  321. * Clocks:
  322. * MPU_FCLK, MPU_ICLK
  323. * INT_M_FCLK, INT_M_I_CLK
  324. *
  325. * - Individual clocks are hardware managed.
  326. * - Base divider comes from: CM_CLKSEL_MPU
  327. *
  328. */
  329. static const struct clksel_rate mpu_core_rates[] = {
  330. { .div = 1, .val = 1, .flags = RATE_IN_24XX },
  331. { .div = 2, .val = 2, .flags = RATE_IN_24XX },
  332. { .div = 0 },
  333. };
  334. static const struct clksel mpu_clksel[] = {
  335. { .parent = &core_ck, .rates = mpu_core_rates },
  336. { .parent = NULL }
  337. };
  338. static struct clk mpu_ck = { /* Control cpu */
  339. .name = "mpu_ck",
  340. .ops = &clkops_null,
  341. .parent = &core_ck,
  342. .clkdm_name = "mpu_clkdm",
  343. .init = &omap2_init_clksel_parent,
  344. .clksel_reg = OMAP_CM_REGADDR(MPU_MOD, CM_CLKSEL),
  345. .clksel_mask = OMAP24XX_CLKSEL_MPU_MASK,
  346. .clksel = mpu_clksel,
  347. .recalc = &omap2_clksel_recalc,
  348. };
  349. /*
  350. * DSP (2430-IVA2.1) clock domain
  351. * Clocks:
  352. * 2430: IVA2.1_FCLK (really just DSP_FCLK), IVA2.1_ICLK
  353. *
  354. * Won't be too specific here. The core clock comes into this block
  355. * it is divided then tee'ed. One branch goes directly to xyz enable
  356. * controls. The other branch gets further divided by 2 then possibly
  357. * routed into a synchronizer and out of clocks abc.
  358. */
  359. static const struct clksel_rate dsp_fck_core_rates[] = {
  360. { .div = 1, .val = 1, .flags = RATE_IN_24XX },
  361. { .div = 2, .val = 2, .flags = RATE_IN_24XX },
  362. { .div = 3, .val = 3, .flags = RATE_IN_24XX },
  363. { .div = 4, .val = 4, .flags = RATE_IN_24XX },
  364. { .div = 0 },
  365. };
  366. static const struct clksel dsp_fck_clksel[] = {
  367. { .parent = &core_ck, .rates = dsp_fck_core_rates },
  368. { .parent = NULL }
  369. };
  370. static struct clk dsp_fck = {
  371. .name = "dsp_fck",
  372. .ops = &clkops_omap2_dflt_wait,
  373. .parent = &core_ck,
  374. .clkdm_name = "dsp_clkdm",
  375. .enable_reg = OMAP_CM_REGADDR(OMAP24XX_DSP_MOD, CM_FCLKEN),
  376. .enable_bit = OMAP24XX_CM_FCLKEN_DSP_EN_DSP_SHIFT,
  377. .clksel_reg = OMAP_CM_REGADDR(OMAP24XX_DSP_MOD, CM_CLKSEL),
  378. .clksel_mask = OMAP24XX_CLKSEL_DSP_MASK,
  379. .clksel = dsp_fck_clksel,
  380. .recalc = &omap2_clksel_recalc,
  381. };
  382. static const struct clksel dsp_ick_clksel[] = {
  383. { .parent = &dsp_fck, .rates = dsp_ick_rates },
  384. { .parent = NULL }
  385. };
  386. /* 2430 only - EN_DSP controls both dsp fclk and iclk on 2430 */
  387. static struct clk iva2_1_ick = {
  388. .name = "iva2_1_ick",
  389. .ops = &clkops_omap2_dflt_wait,
  390. .parent = &dsp_fck,
  391. .clkdm_name = "dsp_clkdm",
  392. .enable_reg = OMAP_CM_REGADDR(OMAP24XX_DSP_MOD, CM_FCLKEN),
  393. .enable_bit = OMAP24XX_CM_FCLKEN_DSP_EN_DSP_SHIFT,
  394. .clksel_reg = OMAP_CM_REGADDR(OMAP24XX_DSP_MOD, CM_CLKSEL),
  395. .clksel_mask = OMAP24XX_CLKSEL_DSP_IF_MASK,
  396. .clksel = dsp_ick_clksel,
  397. .recalc = &omap2_clksel_recalc,
  398. };
  399. /*
  400. * L3 clock domain
  401. * L3 clocks are used for both interface and functional clocks to
  402. * multiple entities. Some of these clocks are completely managed
  403. * by hardware, and some others allow software control. Hardware
  404. * managed ones general are based on directly CLK_REQ signals and
  405. * various auto idle settings. The functional spec sets many of these
  406. * as 'tie-high' for their enables.
  407. *
  408. * I-CLOCKS:
  409. * L3-Interconnect, SMS, GPMC, SDRC, OCM_RAM, OCM_ROM, SDMA
  410. * CAM, HS-USB.
  411. * F-CLOCK
  412. * SSI.
  413. *
  414. * GPMC memories and SDRC have timing and clock sensitive registers which
  415. * may very well need notification when the clock changes. Currently for low
  416. * operating points, these are taken care of in sleep.S.
  417. */
  418. static const struct clksel_rate core_l3_core_rates[] = {
  419. { .div = 1, .val = 1, .flags = RATE_IN_24XX },
  420. { .div = 4, .val = 4, .flags = RATE_IN_24XX },
  421. { .div = 6, .val = 6, .flags = RATE_IN_24XX },
  422. { .div = 0 }
  423. };
  424. static const struct clksel core_l3_clksel[] = {
  425. { .parent = &core_ck, .rates = core_l3_core_rates },
  426. { .parent = NULL }
  427. };
  428. static struct clk core_l3_ck = { /* Used for ick and fck, interconnect */
  429. .name = "core_l3_ck",
  430. .ops = &clkops_null,
  431. .parent = &core_ck,
  432. .clkdm_name = "core_l3_clkdm",
  433. .clksel_reg = OMAP_CM_REGADDR(CORE_MOD, CM_CLKSEL1),
  434. .clksel_mask = OMAP24XX_CLKSEL_L3_MASK,
  435. .clksel = core_l3_clksel,
  436. .recalc = &omap2_clksel_recalc,
  437. };
  438. /* usb_l4_ick */
  439. static const struct clksel_rate usb_l4_ick_core_l3_rates[] = {
  440. { .div = 1, .val = 1, .flags = RATE_IN_24XX },
  441. { .div = 2, .val = 2, .flags = RATE_IN_24XX },
  442. { .div = 4, .val = 4, .flags = RATE_IN_24XX },
  443. { .div = 0 }
  444. };
  445. static const struct clksel usb_l4_ick_clksel[] = {
  446. { .parent = &core_l3_ck, .rates = usb_l4_ick_core_l3_rates },
  447. { .parent = NULL },
  448. };
  449. /* It is unclear from TRM whether usb_l4_ick is really in L3 or L4 clkdm */
  450. static struct clk usb_l4_ick = { /* FS-USB interface clock */
  451. .name = "usb_l4_ick",
  452. .ops = &clkops_omap2_iclk_dflt_wait,
  453. .parent = &core_l3_ck,
  454. .clkdm_name = "core_l4_clkdm",
  455. .enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_ICLKEN2),
  456. .enable_bit = OMAP24XX_EN_USB_SHIFT,
  457. .clksel_reg = OMAP_CM_REGADDR(CORE_MOD, CM_CLKSEL1),
  458. .clksel_mask = OMAP24XX_CLKSEL_USB_MASK,
  459. .clksel = usb_l4_ick_clksel,
  460. .recalc = &omap2_clksel_recalc,
  461. };
  462. /*
  463. * L4 clock management domain
  464. *
  465. * This domain contains lots of interface clocks from the L4 interface, some
  466. * functional clocks. Fixed APLL functional source clocks are managed in
  467. * this domain.
  468. */
  469. static const struct clksel_rate l4_core_l3_rates[] = {
  470. { .div = 1, .val = 1, .flags = RATE_IN_24XX },
  471. { .div = 2, .val = 2, .flags = RATE_IN_24XX },
  472. { .div = 0 }
  473. };
  474. static const struct clksel l4_clksel[] = {
  475. { .parent = &core_l3_ck, .rates = l4_core_l3_rates },
  476. { .parent = NULL }
  477. };
  478. static struct clk l4_ck = { /* used both as an ick and fck */
  479. .name = "l4_ck",
  480. .ops = &clkops_null,
  481. .parent = &core_l3_ck,
  482. .clkdm_name = "core_l4_clkdm",
  483. .clksel_reg = OMAP_CM_REGADDR(CORE_MOD, CM_CLKSEL1),
  484. .clksel_mask = OMAP24XX_CLKSEL_L4_MASK,
  485. .clksel = l4_clksel,
  486. .recalc = &omap2_clksel_recalc,
  487. };
  488. /*
  489. * SSI is in L3 management domain, its direct parent is core not l3,
  490. * many core power domain entities are grouped into the L3 clock
  491. * domain.
  492. * SSI_SSR_FCLK, SSI_SST_FCLK, SSI_L4_ICLK
  493. *
  494. * ssr = core/1/2/3/4/5, sst = 1/2 ssr.
  495. */
  496. static const struct clksel_rate ssi_ssr_sst_fck_core_rates[] = {
  497. { .div = 1, .val = 1, .flags = RATE_IN_24XX },
  498. { .div = 2, .val = 2, .flags = RATE_IN_24XX },
  499. { .div = 3, .val = 3, .flags = RATE_IN_24XX },
  500. { .div = 4, .val = 4, .flags = RATE_IN_24XX },
  501. { .div = 5, .val = 5, .flags = RATE_IN_243X },
  502. { .div = 0 }
  503. };
  504. static const struct clksel ssi_ssr_sst_fck_clksel[] = {
  505. { .parent = &core_ck, .rates = ssi_ssr_sst_fck_core_rates },
  506. { .parent = NULL }
  507. };
  508. static struct clk ssi_ssr_sst_fck = {
  509. .name = "ssi_fck",
  510. .ops = &clkops_omap2_dflt_wait,
  511. .parent = &core_ck,
  512. .clkdm_name = "core_l3_clkdm",
  513. .enable_reg = OMAP_CM_REGADDR(CORE_MOD, OMAP24XX_CM_FCLKEN2),
  514. .enable_bit = OMAP24XX_EN_SSI_SHIFT,
  515. .clksel_reg = OMAP_CM_REGADDR(CORE_MOD, CM_CLKSEL1),
  516. .clksel_mask = OMAP24XX_CLKSEL_SSI_MASK,
  517. .clksel = ssi_ssr_sst_fck_clksel,
  518. .recalc = &omap2_clksel_recalc,
  519. };
  520. /*
  521. * Presumably this is the same as SSI_ICLK.
  522. * TRM contradicts itself on what clockdomain SSI_ICLK is in
  523. */
  524. static struct clk ssi_l4_ick = {
  525. .name = "ssi_l4_ick",
  526. .ops = &clkops_omap2_iclk_dflt_wait,
  527. .parent = &l4_ck,
  528. .clkdm_name = "core_l4_clkdm",
  529. .enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_ICLKEN2),
  530. .enable_bit = OMAP24XX_EN_SSI_SHIFT,
  531. .recalc = &followparent_recalc,
  532. };
  533. /*
  534. * GFX clock domain
  535. * Clocks:
  536. * GFX_FCLK, GFX_ICLK
  537. * GFX_CG1(2d), GFX_CG2(3d)
  538. *
  539. * GFX_FCLK runs from L3, and is divided by (1,2,3,4)
  540. * The 2d and 3d clocks run at a hardware determined
  541. * divided value of fclk.
  542. *
  543. */
  544. /* This clksel struct is shared between gfx_3d_fck and gfx_2d_fck */
  545. static const struct clksel gfx_fck_clksel[] = {
  546. { .parent = &core_l3_ck, .rates = gfx_l3_rates },
  547. { .parent = NULL },
  548. };
  549. static struct clk gfx_3d_fck = {
  550. .name = "gfx_3d_fck",
  551. .ops = &clkops_omap2_dflt_wait,
  552. .parent = &core_l3_ck,
  553. .clkdm_name = "gfx_clkdm",
  554. .enable_reg = OMAP_CM_REGADDR(GFX_MOD, CM_FCLKEN),
  555. .enable_bit = OMAP24XX_EN_3D_SHIFT,
  556. .clksel_reg = OMAP_CM_REGADDR(GFX_MOD, CM_CLKSEL),
  557. .clksel_mask = OMAP_CLKSEL_GFX_MASK,
  558. .clksel = gfx_fck_clksel,
  559. .recalc = &omap2_clksel_recalc,
  560. .round_rate = &omap2_clksel_round_rate,
  561. .set_rate = &omap2_clksel_set_rate
  562. };
  563. static struct clk gfx_2d_fck = {
  564. .name = "gfx_2d_fck",
  565. .ops = &clkops_omap2_dflt_wait,
  566. .parent = &core_l3_ck,
  567. .clkdm_name = "gfx_clkdm",
  568. .enable_reg = OMAP_CM_REGADDR(GFX_MOD, CM_FCLKEN),
  569. .enable_bit = OMAP24XX_EN_2D_SHIFT,
  570. .clksel_reg = OMAP_CM_REGADDR(GFX_MOD, CM_CLKSEL),
  571. .clksel_mask = OMAP_CLKSEL_GFX_MASK,
  572. .clksel = gfx_fck_clksel,
  573. .recalc = &omap2_clksel_recalc,
  574. };
  575. /* This interface clock does not have a CM_AUTOIDLE bit */
  576. static struct clk gfx_ick = {
  577. .name = "gfx_ick", /* From l3 */
  578. .ops = &clkops_omap2_dflt_wait,
  579. .parent = &core_l3_ck,
  580. .clkdm_name = "gfx_clkdm",
  581. .enable_reg = OMAP_CM_REGADDR(GFX_MOD, CM_ICLKEN),
  582. .enable_bit = OMAP_EN_GFX_SHIFT,
  583. .recalc = &followparent_recalc,
  584. };
  585. /*
  586. * Modem clock domain (2430)
  587. * CLOCKS:
  588. * MDM_OSC_CLK
  589. * MDM_ICLK
  590. * These clocks are usable in chassis mode only.
  591. */
  592. static const struct clksel_rate mdm_ick_core_rates[] = {
  593. { .div = 1, .val = 1, .flags = RATE_IN_243X },
  594. { .div = 4, .val = 4, .flags = RATE_IN_243X },
  595. { .div = 6, .val = 6, .flags = RATE_IN_243X },
  596. { .div = 9, .val = 9, .flags = RATE_IN_243X },
  597. { .div = 0 }
  598. };
  599. static const struct clksel mdm_ick_clksel[] = {
  600. { .parent = &core_ck, .rates = mdm_ick_core_rates },
  601. { .parent = NULL }
  602. };
  603. static struct clk mdm_ick = { /* used both as a ick and fck */
  604. .name = "mdm_ick",
  605. .ops = &clkops_omap2_iclk_dflt_wait,
  606. .parent = &core_ck,
  607. .clkdm_name = "mdm_clkdm",
  608. .enable_reg = OMAP_CM_REGADDR(OMAP2430_MDM_MOD, CM_ICLKEN),
  609. .enable_bit = OMAP2430_CM_ICLKEN_MDM_EN_MDM_SHIFT,
  610. .clksel_reg = OMAP_CM_REGADDR(OMAP2430_MDM_MOD, CM_CLKSEL),
  611. .clksel_mask = OMAP2430_CLKSEL_MDM_MASK,
  612. .clksel = mdm_ick_clksel,
  613. .recalc = &omap2_clksel_recalc,
  614. };
  615. static struct clk mdm_osc_ck = {
  616. .name = "mdm_osc_ck",
  617. .ops = &clkops_omap2_mdmclk_dflt_wait,
  618. .parent = &osc_ck,
  619. .clkdm_name = "mdm_clkdm",
  620. .enable_reg = OMAP_CM_REGADDR(OMAP2430_MDM_MOD, CM_FCLKEN),
  621. .enable_bit = OMAP2430_EN_OSC_SHIFT,
  622. .recalc = &followparent_recalc,
  623. };
  624. /*
  625. * DSS clock domain
  626. * CLOCKs:
  627. * DSS_L4_ICLK, DSS_L3_ICLK,
  628. * DSS_CLK1, DSS_CLK2, DSS_54MHz_CLK
  629. *
  630. * DSS is both initiator and target.
  631. */
  632. /* XXX Add RATE_NOT_VALIDATED */
  633. static const struct clksel_rate dss1_fck_sys_rates[] = {
  634. { .div = 1, .val = 0, .flags = RATE_IN_24XX },
  635. { .div = 0 }
  636. };
  637. static const struct clksel_rate dss1_fck_core_rates[] = {
  638. { .div = 1, .val = 1, .flags = RATE_IN_24XX },
  639. { .div = 2, .val = 2, .flags = RATE_IN_24XX },
  640. { .div = 3, .val = 3, .flags = RATE_IN_24XX },
  641. { .div = 4, .val = 4, .flags = RATE_IN_24XX },
  642. { .div = 5, .val = 5, .flags = RATE_IN_24XX },
  643. { .div = 6, .val = 6, .flags = RATE_IN_24XX },
  644. { .div = 8, .val = 8, .flags = RATE_IN_24XX },
  645. { .div = 9, .val = 9, .flags = RATE_IN_24XX },
  646. { .div = 12, .val = 12, .flags = RATE_IN_24XX },
  647. { .div = 16, .val = 16, .flags = RATE_IN_24XX },
  648. { .div = 0 }
  649. };
  650. static const struct clksel dss1_fck_clksel[] = {
  651. { .parent = &sys_ck, .rates = dss1_fck_sys_rates },
  652. { .parent = &core_ck, .rates = dss1_fck_core_rates },
  653. { .parent = NULL },
  654. };
  655. static struct clk dss_ick = { /* Enables both L3,L4 ICLK's */
  656. .name = "dss_ick",
  657. .ops = &clkops_omap2_iclk_dflt,
  658. .parent = &l4_ck, /* really both l3 and l4 */
  659. .clkdm_name = "dss_clkdm",
  660. .enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_ICLKEN1),
  661. .enable_bit = OMAP24XX_EN_DSS1_SHIFT,
  662. .recalc = &followparent_recalc,
  663. };
  664. static struct clk dss1_fck = {
  665. .name = "dss1_fck",
  666. .ops = &clkops_omap2_dflt,
  667. .parent = &core_ck, /* Core or sys */
  668. .clkdm_name = "dss_clkdm",
  669. .enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_FCLKEN1),
  670. .enable_bit = OMAP24XX_EN_DSS1_SHIFT,
  671. .init = &omap2_init_clksel_parent,
  672. .clksel_reg = OMAP_CM_REGADDR(CORE_MOD, CM_CLKSEL1),
  673. .clksel_mask = OMAP24XX_CLKSEL_DSS1_MASK,
  674. .clksel = dss1_fck_clksel,
  675. .recalc = &omap2_clksel_recalc,
  676. };
  677. static const struct clksel_rate dss2_fck_sys_rates[] = {
  678. { .div = 1, .val = 0, .flags = RATE_IN_24XX },
  679. { .div = 0 }
  680. };
  681. static const struct clksel_rate dss2_fck_48m_rates[] = {
  682. { .div = 1, .val = 1, .flags = RATE_IN_24XX },
  683. { .div = 0 }
  684. };
  685. static const struct clksel dss2_fck_clksel[] = {
  686. { .parent = &sys_ck, .rates = dss2_fck_sys_rates },
  687. { .parent = &func_48m_ck, .rates = dss2_fck_48m_rates },
  688. { .parent = NULL }
  689. };
  690. static struct clk dss2_fck = { /* Alt clk used in power management */
  691. .name = "dss2_fck",
  692. .ops = &clkops_omap2_dflt,
  693. .parent = &sys_ck, /* fixed at sys_ck or 48MHz */
  694. .clkdm_name = "dss_clkdm",
  695. .enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_FCLKEN1),
  696. .enable_bit = OMAP24XX_EN_DSS2_SHIFT,
  697. .init = &omap2_init_clksel_parent,
  698. .clksel_reg = OMAP_CM_REGADDR(CORE_MOD, CM_CLKSEL1),
  699. .clksel_mask = OMAP24XX_CLKSEL_DSS2_MASK,
  700. .clksel = dss2_fck_clksel,
  701. .recalc = &omap2_clksel_recalc,
  702. };
  703. static struct clk dss_54m_fck = { /* Alt clk used in power management */
  704. .name = "dss_54m_fck", /* 54m tv clk */
  705. .ops = &clkops_omap2_dflt_wait,
  706. .parent = &func_54m_ck,
  707. .clkdm_name = "dss_clkdm",
  708. .enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_FCLKEN1),
  709. .enable_bit = OMAP24XX_EN_TV_SHIFT,
  710. .recalc = &followparent_recalc,
  711. };
  712. static struct clk wu_l4_ick = {
  713. .name = "wu_l4_ick",
  714. .ops = &clkops_null,
  715. .parent = &sys_ck,
  716. .clkdm_name = "wkup_clkdm",
  717. .recalc = &followparent_recalc,
  718. };
  719. /*
  720. * CORE power domain ICLK & FCLK defines.
  721. * Many of the these can have more than one possible parent. Entries
  722. * here will likely have an L4 interface parent, and may have multiple
  723. * functional clock parents.
  724. */
  725. static const struct clksel_rate gpt_alt_rates[] = {
  726. { .div = 1, .val = 2, .flags = RATE_IN_24XX },
  727. { .div = 0 }
  728. };
  729. static const struct clksel omap24xx_gpt_clksel[] = {
  730. { .parent = &func_32k_ck, .rates = gpt_32k_rates },
  731. { .parent = &sys_ck, .rates = gpt_sys_rates },
  732. { .parent = &alt_ck, .rates = gpt_alt_rates },
  733. { .parent = NULL },
  734. };
  735. static struct clk gpt1_ick = {
  736. .name = "gpt1_ick",
  737. .ops = &clkops_omap2_iclk_dflt_wait,
  738. .parent = &wu_l4_ick,
  739. .clkdm_name = "wkup_clkdm",
  740. .enable_reg = OMAP_CM_REGADDR(WKUP_MOD, CM_ICLKEN),
  741. .enable_bit = OMAP24XX_EN_GPT1_SHIFT,
  742. .recalc = &followparent_recalc,
  743. };
  744. static struct clk gpt1_fck = {
  745. .name = "gpt1_fck",
  746. .ops = &clkops_omap2_dflt_wait,
  747. .parent = &func_32k_ck,
  748. .clkdm_name = "core_l4_clkdm",
  749. .enable_reg = OMAP_CM_REGADDR(WKUP_MOD, CM_FCLKEN),
  750. .enable_bit = OMAP24XX_EN_GPT1_SHIFT,
  751. .init = &omap2_init_clksel_parent,
  752. .clksel_reg = OMAP_CM_REGADDR(WKUP_MOD, CM_CLKSEL1),
  753. .clksel_mask = OMAP24XX_CLKSEL_GPT1_MASK,
  754. .clksel = omap24xx_gpt_clksel,
  755. .recalc = &omap2_clksel_recalc,
  756. .round_rate = &omap2_clksel_round_rate,
  757. .set_rate = &omap2_clksel_set_rate
  758. };
  759. static struct clk gpt2_ick = {
  760. .name = "gpt2_ick",
  761. .ops = &clkops_omap2_iclk_dflt_wait,
  762. .parent = &l4_ck,
  763. .clkdm_name = "core_l4_clkdm",
  764. .enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_ICLKEN1),
  765. .enable_bit = OMAP24XX_EN_GPT2_SHIFT,
  766. .recalc = &followparent_recalc,
  767. };
  768. static struct clk gpt2_fck = {
  769. .name = "gpt2_fck",
  770. .ops = &clkops_omap2_dflt_wait,
  771. .parent = &func_32k_ck,
  772. .clkdm_name = "core_l4_clkdm",
  773. .enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_FCLKEN1),
  774. .enable_bit = OMAP24XX_EN_GPT2_SHIFT,
  775. .init = &omap2_init_clksel_parent,
  776. .clksel_reg = OMAP_CM_REGADDR(CORE_MOD, CM_CLKSEL2),
  777. .clksel_mask = OMAP24XX_CLKSEL_GPT2_MASK,
  778. .clksel = omap24xx_gpt_clksel,
  779. .recalc = &omap2_clksel_recalc,
  780. };
  781. static struct clk gpt3_ick = {
  782. .name = "gpt3_ick",
  783. .ops = &clkops_omap2_iclk_dflt_wait,
  784. .parent = &l4_ck,
  785. .clkdm_name = "core_l4_clkdm",
  786. .enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_ICLKEN1),
  787. .enable_bit = OMAP24XX_EN_GPT3_SHIFT,
  788. .recalc = &followparent_recalc,
  789. };
  790. static struct clk gpt3_fck = {
  791. .name = "gpt3_fck",
  792. .ops = &clkops_omap2_dflt_wait,
  793. .parent = &func_32k_ck,
  794. .clkdm_name = "core_l4_clkdm",
  795. .enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_FCLKEN1),
  796. .enable_bit = OMAP24XX_EN_GPT3_SHIFT,
  797. .init = &omap2_init_clksel_parent,
  798. .clksel_reg = OMAP_CM_REGADDR(CORE_MOD, CM_CLKSEL2),
  799. .clksel_mask = OMAP24XX_CLKSEL_GPT3_MASK,
  800. .clksel = omap24xx_gpt_clksel,
  801. .recalc = &omap2_clksel_recalc,
  802. };
  803. static struct clk gpt4_ick = {
  804. .name = "gpt4_ick",
  805. .ops = &clkops_omap2_iclk_dflt_wait,
  806. .parent = &l4_ck,
  807. .clkdm_name = "core_l4_clkdm",
  808. .enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_ICLKEN1),
  809. .enable_bit = OMAP24XX_EN_GPT4_SHIFT,
  810. .recalc = &followparent_recalc,
  811. };
  812. static struct clk gpt4_fck = {
  813. .name = "gpt4_fck",
  814. .ops = &clkops_omap2_dflt_wait,
  815. .parent = &func_32k_ck,
  816. .clkdm_name = "core_l4_clkdm",
  817. .enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_FCLKEN1),
  818. .enable_bit = OMAP24XX_EN_GPT4_SHIFT,
  819. .init = &omap2_init_clksel_parent,
  820. .clksel_reg = OMAP_CM_REGADDR(CORE_MOD, CM_CLKSEL2),
  821. .clksel_mask = OMAP24XX_CLKSEL_GPT4_MASK,
  822. .clksel = omap24xx_gpt_clksel,
  823. .recalc = &omap2_clksel_recalc,
  824. };
  825. static struct clk gpt5_ick = {
  826. .name = "gpt5_ick",
  827. .ops = &clkops_omap2_iclk_dflt_wait,
  828. .parent = &l4_ck,
  829. .clkdm_name = "core_l4_clkdm",
  830. .enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_ICLKEN1),
  831. .enable_bit = OMAP24XX_EN_GPT5_SHIFT,
  832. .recalc = &followparent_recalc,
  833. };
  834. static struct clk gpt5_fck = {
  835. .name = "gpt5_fck",
  836. .ops = &clkops_omap2_dflt_wait,
  837. .parent = &func_32k_ck,
  838. .clkdm_name = "core_l4_clkdm",
  839. .enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_FCLKEN1),
  840. .enable_bit = OMAP24XX_EN_GPT5_SHIFT,
  841. .init = &omap2_init_clksel_parent,
  842. .clksel_reg = OMAP_CM_REGADDR(CORE_MOD, CM_CLKSEL2),
  843. .clksel_mask = OMAP24XX_CLKSEL_GPT5_MASK,
  844. .clksel = omap24xx_gpt_clksel,
  845. .recalc = &omap2_clksel_recalc,
  846. };
  847. static struct clk gpt6_ick = {
  848. .name = "gpt6_ick",
  849. .ops = &clkops_omap2_iclk_dflt_wait,
  850. .parent = &l4_ck,
  851. .clkdm_name = "core_l4_clkdm",
  852. .enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_ICLKEN1),
  853. .enable_bit = OMAP24XX_EN_GPT6_SHIFT,
  854. .recalc = &followparent_recalc,
  855. };
  856. static struct clk gpt6_fck = {
  857. .name = "gpt6_fck",
  858. .ops = &clkops_omap2_dflt_wait,
  859. .parent = &func_32k_ck,
  860. .clkdm_name = "core_l4_clkdm",
  861. .enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_FCLKEN1),
  862. .enable_bit = OMAP24XX_EN_GPT6_SHIFT,
  863. .init = &omap2_init_clksel_parent,
  864. .clksel_reg = OMAP_CM_REGADDR(CORE_MOD, CM_CLKSEL2),
  865. .clksel_mask = OMAP24XX_CLKSEL_GPT6_MASK,
  866. .clksel = omap24xx_gpt_clksel,
  867. .recalc = &omap2_clksel_recalc,
  868. };
  869. static struct clk gpt7_ick = {
  870. .name = "gpt7_ick",
  871. .ops = &clkops_omap2_iclk_dflt_wait,
  872. .parent = &l4_ck,
  873. .clkdm_name = "core_l4_clkdm",
  874. .enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_ICLKEN1),
  875. .enable_bit = OMAP24XX_EN_GPT7_SHIFT,
  876. .recalc = &followparent_recalc,
  877. };
  878. static struct clk gpt7_fck = {
  879. .name = "gpt7_fck",
  880. .ops = &clkops_omap2_dflt_wait,
  881. .parent = &func_32k_ck,
  882. .clkdm_name = "core_l4_clkdm",
  883. .enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_FCLKEN1),
  884. .enable_bit = OMAP24XX_EN_GPT7_SHIFT,
  885. .init = &omap2_init_clksel_parent,
  886. .clksel_reg = OMAP_CM_REGADDR(CORE_MOD, CM_CLKSEL2),
  887. .clksel_mask = OMAP24XX_CLKSEL_GPT7_MASK,
  888. .clksel = omap24xx_gpt_clksel,
  889. .recalc = &omap2_clksel_recalc,
  890. };
  891. static struct clk gpt8_ick = {
  892. .name = "gpt8_ick",
  893. .ops = &clkops_omap2_iclk_dflt_wait,
  894. .parent = &l4_ck,
  895. .clkdm_name = "core_l4_clkdm",
  896. .enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_ICLKEN1),
  897. .enable_bit = OMAP24XX_EN_GPT8_SHIFT,
  898. .recalc = &followparent_recalc,
  899. };
  900. static struct clk gpt8_fck = {
  901. .name = "gpt8_fck",
  902. .ops = &clkops_omap2_dflt_wait,
  903. .parent = &func_32k_ck,
  904. .clkdm_name = "core_l4_clkdm",
  905. .enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_FCLKEN1),
  906. .enable_bit = OMAP24XX_EN_GPT8_SHIFT,
  907. .init = &omap2_init_clksel_parent,
  908. .clksel_reg = OMAP_CM_REGADDR(CORE_MOD, CM_CLKSEL2),
  909. .clksel_mask = OMAP24XX_CLKSEL_GPT8_MASK,
  910. .clksel = omap24xx_gpt_clksel,
  911. .recalc = &omap2_clksel_recalc,
  912. };
  913. static struct clk gpt9_ick = {
  914. .name = "gpt9_ick",
  915. .ops = &clkops_omap2_iclk_dflt_wait,
  916. .parent = &l4_ck,
  917. .clkdm_name = "core_l4_clkdm",
  918. .enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_ICLKEN1),
  919. .enable_bit = OMAP24XX_EN_GPT9_SHIFT,
  920. .recalc = &followparent_recalc,
  921. };
  922. static struct clk gpt9_fck = {
  923. .name = "gpt9_fck",
  924. .ops = &clkops_omap2_dflt_wait,
  925. .parent = &func_32k_ck,
  926. .clkdm_name = "core_l4_clkdm",
  927. .enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_FCLKEN1),
  928. .enable_bit = OMAP24XX_EN_GPT9_SHIFT,
  929. .init = &omap2_init_clksel_parent,
  930. .clksel_reg = OMAP_CM_REGADDR(CORE_MOD, CM_CLKSEL2),
  931. .clksel_mask = OMAP24XX_CLKSEL_GPT9_MASK,
  932. .clksel = omap24xx_gpt_clksel,
  933. .recalc = &omap2_clksel_recalc,
  934. };
  935. static struct clk gpt10_ick = {
  936. .name = "gpt10_ick",
  937. .ops = &clkops_omap2_iclk_dflt_wait,
  938. .parent = &l4_ck,
  939. .clkdm_name = "core_l4_clkdm",
  940. .enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_ICLKEN1),
  941. .enable_bit = OMAP24XX_EN_GPT10_SHIFT,
  942. .recalc = &followparent_recalc,
  943. };
  944. static struct clk gpt10_fck = {
  945. .name = "gpt10_fck",
  946. .ops = &clkops_omap2_dflt_wait,
  947. .parent = &func_32k_ck,
  948. .clkdm_name = "core_l4_clkdm",
  949. .enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_FCLKEN1),
  950. .enable_bit = OMAP24XX_EN_GPT10_SHIFT,
  951. .init = &omap2_init_clksel_parent,
  952. .clksel_reg = OMAP_CM_REGADDR(CORE_MOD, CM_CLKSEL2),
  953. .clksel_mask = OMAP24XX_CLKSEL_GPT10_MASK,
  954. .clksel = omap24xx_gpt_clksel,
  955. .recalc = &omap2_clksel_recalc,
  956. };
  957. static struct clk gpt11_ick = {
  958. .name = "gpt11_ick",
  959. .ops = &clkops_omap2_iclk_dflt_wait,
  960. .parent = &l4_ck,
  961. .clkdm_name = "core_l4_clkdm",
  962. .enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_ICLKEN1),
  963. .enable_bit = OMAP24XX_EN_GPT11_SHIFT,
  964. .recalc = &followparent_recalc,
  965. };
  966. static struct clk gpt11_fck = {
  967. .name = "gpt11_fck",
  968. .ops = &clkops_omap2_dflt_wait,
  969. .parent = &func_32k_ck,
  970. .clkdm_name = "core_l4_clkdm",
  971. .enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_FCLKEN1),
  972. .enable_bit = OMAP24XX_EN_GPT11_SHIFT,
  973. .init = &omap2_init_clksel_parent,
  974. .clksel_reg = OMAP_CM_REGADDR(CORE_MOD, CM_CLKSEL2),
  975. .clksel_mask = OMAP24XX_CLKSEL_GPT11_MASK,
  976. .clksel = omap24xx_gpt_clksel,
  977. .recalc = &omap2_clksel_recalc,
  978. };
  979. static struct clk gpt12_ick = {
  980. .name = "gpt12_ick",
  981. .ops = &clkops_omap2_iclk_dflt_wait,
  982. .parent = &l4_ck,
  983. .clkdm_name = "core_l4_clkdm",
  984. .enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_ICLKEN1),
  985. .enable_bit = OMAP24XX_EN_GPT12_SHIFT,
  986. .recalc = &followparent_recalc,
  987. };
  988. static struct clk gpt12_fck = {
  989. .name = "gpt12_fck",
  990. .ops = &clkops_omap2_dflt_wait,
  991. .parent = &secure_32k_ck,
  992. .clkdm_name = "core_l4_clkdm",
  993. .enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_FCLKEN1),
  994. .enable_bit = OMAP24XX_EN_GPT12_SHIFT,
  995. .init = &omap2_init_clksel_parent,
  996. .clksel_reg = OMAP_CM_REGADDR(CORE_MOD, CM_CLKSEL2),
  997. .clksel_mask = OMAP24XX_CLKSEL_GPT12_MASK,
  998. .clksel = omap24xx_gpt_clksel,
  999. .recalc = &omap2_clksel_recalc,
  1000. };
  1001. static struct clk mcbsp1_ick = {
  1002. .name = "mcbsp1_ick",
  1003. .ops = &clkops_omap2_iclk_dflt_wait,
  1004. .parent = &l4_ck,
  1005. .clkdm_name = "core_l4_clkdm",
  1006. .enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_ICLKEN1),
  1007. .enable_bit = OMAP24XX_EN_MCBSP1_SHIFT,
  1008. .recalc = &followparent_recalc,
  1009. };
  1010. static const struct clksel_rate common_mcbsp_96m_rates[] = {
  1011. { .div = 1, .val = 0, .flags = RATE_IN_24XX },
  1012. { .div = 0 }
  1013. };
  1014. static const struct clksel_rate common_mcbsp_mcbsp_rates[] = {
  1015. { .div = 1, .val = 1, .flags = RATE_IN_24XX },
  1016. { .div = 0 }
  1017. };
  1018. static const struct clksel mcbsp_fck_clksel[] = {
  1019. { .parent = &func_96m_ck, .rates = common_mcbsp_96m_rates },
  1020. { .parent = &mcbsp_clks, .rates = common_mcbsp_mcbsp_rates },
  1021. { .parent = NULL }
  1022. };
  1023. static struct clk mcbsp1_fck = {
  1024. .name = "mcbsp1_fck",
  1025. .ops = &clkops_omap2_dflt_wait,
  1026. .parent = &func_96m_ck,
  1027. .init = &omap2_init_clksel_parent,
  1028. .clkdm_name = "core_l4_clkdm",
  1029. .enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_FCLKEN1),
  1030. .enable_bit = OMAP24XX_EN_MCBSP1_SHIFT,
  1031. .clksel_reg = OMAP243X_CTRL_REGADDR(OMAP2_CONTROL_DEVCONF0),
  1032. .clksel_mask = OMAP2_MCBSP1_CLKS_MASK,
  1033. .clksel = mcbsp_fck_clksel,
  1034. .recalc = &omap2_clksel_recalc,
  1035. };
  1036. static struct clk mcbsp2_ick = {
  1037. .name = "mcbsp2_ick",
  1038. .ops = &clkops_omap2_iclk_dflt_wait,
  1039. .parent = &l4_ck,
  1040. .clkdm_name = "core_l4_clkdm",
  1041. .enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_ICLKEN1),
  1042. .enable_bit = OMAP24XX_EN_MCBSP2_SHIFT,
  1043. .recalc = &followparent_recalc,
  1044. };
  1045. static struct clk mcbsp2_fck = {
  1046. .name = "mcbsp2_fck",
  1047. .ops = &clkops_omap2_dflt_wait,
  1048. .parent = &func_96m_ck,
  1049. .init = &omap2_init_clksel_parent,
  1050. .clkdm_name = "core_l4_clkdm",
  1051. .enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_FCLKEN1),
  1052. .enable_bit = OMAP24XX_EN_MCBSP2_SHIFT,
  1053. .clksel_reg = OMAP243X_CTRL_REGADDR(OMAP2_CONTROL_DEVCONF0),
  1054. .clksel_mask = OMAP2_MCBSP2_CLKS_MASK,
  1055. .clksel = mcbsp_fck_clksel,
  1056. .recalc = &omap2_clksel_recalc,
  1057. };
  1058. static struct clk mcbsp3_ick = {
  1059. .name = "mcbsp3_ick",
  1060. .ops = &clkops_omap2_iclk_dflt_wait,
  1061. .parent = &l4_ck,
  1062. .clkdm_name = "core_l4_clkdm",
  1063. .enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_ICLKEN2),
  1064. .enable_bit = OMAP2430_EN_MCBSP3_SHIFT,
  1065. .recalc = &followparent_recalc,
  1066. };
  1067. static struct clk mcbsp3_fck = {
  1068. .name = "mcbsp3_fck",
  1069. .ops = &clkops_omap2_dflt_wait,
  1070. .parent = &func_96m_ck,
  1071. .init = &omap2_init_clksel_parent,
  1072. .clkdm_name = "core_l4_clkdm",
  1073. .enable_reg = OMAP_CM_REGADDR(CORE_MOD, OMAP24XX_CM_FCLKEN2),
  1074. .enable_bit = OMAP2430_EN_MCBSP3_SHIFT,
  1075. .clksel_reg = OMAP243X_CTRL_REGADDR(OMAP243X_CONTROL_DEVCONF1),
  1076. .clksel_mask = OMAP2_MCBSP3_CLKS_MASK,
  1077. .clksel = mcbsp_fck_clksel,
  1078. .recalc = &omap2_clksel_recalc,
  1079. };
  1080. static struct clk mcbsp4_ick = {
  1081. .name = "mcbsp4_ick",
  1082. .ops = &clkops_omap2_iclk_dflt_wait,
  1083. .parent = &l4_ck,
  1084. .clkdm_name = "core_l4_clkdm",
  1085. .enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_ICLKEN2),
  1086. .enable_bit = OMAP2430_EN_MCBSP4_SHIFT,
  1087. .recalc = &followparent_recalc,
  1088. };
  1089. static struct clk mcbsp4_fck = {
  1090. .name = "mcbsp4_fck",
  1091. .ops = &clkops_omap2_dflt_wait,
  1092. .parent = &func_96m_ck,
  1093. .init = &omap2_init_clksel_parent,
  1094. .clkdm_name = "core_l4_clkdm",
  1095. .enable_reg = OMAP_CM_REGADDR(CORE_MOD, OMAP24XX_CM_FCLKEN2),
  1096. .enable_bit = OMAP2430_EN_MCBSP4_SHIFT,
  1097. .clksel_reg = OMAP243X_CTRL_REGADDR(OMAP243X_CONTROL_DEVCONF1),
  1098. .clksel_mask = OMAP2_MCBSP4_CLKS_MASK,
  1099. .clksel = mcbsp_fck_clksel,
  1100. .recalc = &omap2_clksel_recalc,
  1101. };
  1102. static struct clk mcbsp5_ick = {
  1103. .name = "mcbsp5_ick",
  1104. .ops = &clkops_omap2_iclk_dflt_wait,
  1105. .parent = &l4_ck,
  1106. .clkdm_name = "core_l4_clkdm",
  1107. .enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_ICLKEN2),
  1108. .enable_bit = OMAP2430_EN_MCBSP5_SHIFT,
  1109. .recalc = &followparent_recalc,
  1110. };
  1111. static struct clk mcbsp5_fck = {
  1112. .name = "mcbsp5_fck",
  1113. .ops = &clkops_omap2_dflt_wait,
  1114. .parent = &func_96m_ck,
  1115. .init = &omap2_init_clksel_parent,
  1116. .clkdm_name = "core_l4_clkdm",
  1117. .enable_reg = OMAP_CM_REGADDR(CORE_MOD, OMAP24XX_CM_FCLKEN2),
  1118. .enable_bit = OMAP2430_EN_MCBSP5_SHIFT,
  1119. .clksel_reg = OMAP243X_CTRL_REGADDR(OMAP243X_CONTROL_DEVCONF1),
  1120. .clksel_mask = OMAP2_MCBSP5_CLKS_MASK,
  1121. .clksel = mcbsp_fck_clksel,
  1122. .recalc = &omap2_clksel_recalc,
  1123. };
  1124. static struct clk mcspi1_ick = {
  1125. .name = "mcspi1_ick",
  1126. .ops = &clkops_omap2_iclk_dflt_wait,
  1127. .parent = &l4_ck,
  1128. .clkdm_name = "core_l4_clkdm",
  1129. .enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_ICLKEN1),
  1130. .enable_bit = OMAP24XX_EN_MCSPI1_SHIFT,
  1131. .recalc = &followparent_recalc,
  1132. };
  1133. static struct clk mcspi1_fck = {
  1134. .name = "mcspi1_fck",
  1135. .ops = &clkops_omap2_dflt_wait,
  1136. .parent = &func_48m_ck,
  1137. .clkdm_name = "core_l4_clkdm",
  1138. .enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_FCLKEN1),
  1139. .enable_bit = OMAP24XX_EN_MCSPI1_SHIFT,
  1140. .recalc = &followparent_recalc,
  1141. };
  1142. static struct clk mcspi2_ick = {
  1143. .name = "mcspi2_ick",
  1144. .ops = &clkops_omap2_iclk_dflt_wait,
  1145. .parent = &l4_ck,
  1146. .clkdm_name = "core_l4_clkdm",
  1147. .enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_ICLKEN1),
  1148. .enable_bit = OMAP24XX_EN_MCSPI2_SHIFT,
  1149. .recalc = &followparent_recalc,
  1150. };
  1151. static struct clk mcspi2_fck = {
  1152. .name = "mcspi2_fck",
  1153. .ops = &clkops_omap2_dflt_wait,
  1154. .parent = &func_48m_ck,
  1155. .clkdm_name = "core_l4_clkdm",
  1156. .enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_FCLKEN1),
  1157. .enable_bit = OMAP24XX_EN_MCSPI2_SHIFT,
  1158. .recalc = &followparent_recalc,
  1159. };
  1160. static struct clk mcspi3_ick = {
  1161. .name = "mcspi3_ick",
  1162. .ops = &clkops_omap2_iclk_dflt_wait,
  1163. .parent = &l4_ck,
  1164. .clkdm_name = "core_l4_clkdm",
  1165. .enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_ICLKEN2),
  1166. .enable_bit = OMAP2430_EN_MCSPI3_SHIFT,
  1167. .recalc = &followparent_recalc,
  1168. };
  1169. static struct clk mcspi3_fck = {
  1170. .name = "mcspi3_fck",
  1171. .ops = &clkops_omap2_dflt_wait,
  1172. .parent = &func_48m_ck,
  1173. .clkdm_name = "core_l4_clkdm",
  1174. .enable_reg = OMAP_CM_REGADDR(CORE_MOD, OMAP24XX_CM_FCLKEN2),
  1175. .enable_bit = OMAP2430_EN_MCSPI3_SHIFT,
  1176. .recalc = &followparent_recalc,
  1177. };
  1178. static struct clk uart1_ick = {
  1179. .name = "uart1_ick",
  1180. .ops = &clkops_omap2_iclk_dflt_wait,
  1181. .parent = &l4_ck,
  1182. .clkdm_name = "core_l4_clkdm",
  1183. .enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_ICLKEN1),
  1184. .enable_bit = OMAP24XX_EN_UART1_SHIFT,
  1185. .recalc = &followparent_recalc,
  1186. };
  1187. static struct clk uart1_fck = {
  1188. .name = "uart1_fck",
  1189. .ops = &clkops_omap2_dflt_wait,
  1190. .parent = &func_48m_ck,
  1191. .clkdm_name = "core_l4_clkdm",
  1192. .enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_FCLKEN1),
  1193. .enable_bit = OMAP24XX_EN_UART1_SHIFT,
  1194. .recalc = &followparent_recalc,
  1195. };
  1196. static struct clk uart2_ick = {
  1197. .name = "uart2_ick",
  1198. .ops = &clkops_omap2_iclk_dflt_wait,
  1199. .parent = &l4_ck,
  1200. .clkdm_name = "core_l4_clkdm",
  1201. .enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_ICLKEN1),
  1202. .enable_bit = OMAP24XX_EN_UART2_SHIFT,
  1203. .recalc = &followparent_recalc,
  1204. };
  1205. static struct clk uart2_fck = {
  1206. .name = "uart2_fck",
  1207. .ops = &clkops_omap2_dflt_wait,
  1208. .parent = &func_48m_ck,
  1209. .clkdm_name = "core_l4_clkdm",
  1210. .enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_FCLKEN1),
  1211. .enable_bit = OMAP24XX_EN_UART2_SHIFT,
  1212. .recalc = &followparent_recalc,
  1213. };
  1214. static struct clk uart3_ick = {
  1215. .name = "uart3_ick",
  1216. .ops = &clkops_omap2_iclk_dflt_wait,
  1217. .parent = &l4_ck,
  1218. .clkdm_name = "core_l4_clkdm",
  1219. .enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_ICLKEN2),
  1220. .enable_bit = OMAP24XX_EN_UART3_SHIFT,
  1221. .recalc = &followparent_recalc,
  1222. };
  1223. static struct clk uart3_fck = {
  1224. .name = "uart3_fck",
  1225. .ops = &clkops_omap2_dflt_wait,
  1226. .parent = &func_48m_ck,
  1227. .clkdm_name = "core_l4_clkdm",
  1228. .enable_reg = OMAP_CM_REGADDR(CORE_MOD, OMAP24XX_CM_FCLKEN2),
  1229. .enable_bit = OMAP24XX_EN_UART3_SHIFT,
  1230. .recalc = &followparent_recalc,
  1231. };
  1232. static struct clk gpios_ick = {
  1233. .name = "gpios_ick",
  1234. .ops = &clkops_omap2_iclk_dflt_wait,
  1235. .parent = &wu_l4_ick,
  1236. .clkdm_name = "wkup_clkdm",
  1237. .enable_reg = OMAP_CM_REGADDR(WKUP_MOD, CM_ICLKEN),
  1238. .enable_bit = OMAP24XX_EN_GPIOS_SHIFT,
  1239. .recalc = &followparent_recalc,
  1240. };
  1241. static struct clk gpios_fck = {
  1242. .name = "gpios_fck",
  1243. .ops = &clkops_omap2_dflt_wait,
  1244. .parent = &func_32k_ck,
  1245. .clkdm_name = "wkup_clkdm",
  1246. .enable_reg = OMAP_CM_REGADDR(WKUP_MOD, CM_FCLKEN),
  1247. .enable_bit = OMAP24XX_EN_GPIOS_SHIFT,
  1248. .recalc = &followparent_recalc,
  1249. };
  1250. static struct clk mpu_wdt_ick = {
  1251. .name = "mpu_wdt_ick",
  1252. .ops = &clkops_omap2_iclk_dflt_wait,
  1253. .parent = &wu_l4_ick,
  1254. .clkdm_name = "wkup_clkdm",
  1255. .enable_reg = OMAP_CM_REGADDR(WKUP_MOD, CM_ICLKEN),
  1256. .enable_bit = OMAP24XX_EN_MPU_WDT_SHIFT,
  1257. .recalc = &followparent_recalc,
  1258. };
  1259. static struct clk mpu_wdt_fck = {
  1260. .name = "mpu_wdt_fck",
  1261. .ops = &clkops_omap2_dflt_wait,
  1262. .parent = &func_32k_ck,
  1263. .clkdm_name = "wkup_clkdm",
  1264. .enable_reg = OMAP_CM_REGADDR(WKUP_MOD, CM_FCLKEN),
  1265. .enable_bit = OMAP24XX_EN_MPU_WDT_SHIFT,
  1266. .recalc = &followparent_recalc,
  1267. };
  1268. static struct clk sync_32k_ick = {
  1269. .name = "sync_32k_ick",
  1270. .ops = &clkops_omap2_iclk_dflt_wait,
  1271. .flags = ENABLE_ON_INIT,
  1272. .parent = &wu_l4_ick,
  1273. .clkdm_name = "wkup_clkdm",
  1274. .enable_reg = OMAP_CM_REGADDR(WKUP_MOD, CM_ICLKEN),
  1275. .enable_bit = OMAP24XX_EN_32KSYNC_SHIFT,
  1276. .recalc = &followparent_recalc,
  1277. };
  1278. static struct clk wdt1_ick = {
  1279. .name = "wdt1_ick",
  1280. .ops = &clkops_omap2_iclk_dflt_wait,
  1281. .parent = &wu_l4_ick,
  1282. .clkdm_name = "wkup_clkdm",
  1283. .enable_reg = OMAP_CM_REGADDR(WKUP_MOD, CM_ICLKEN),
  1284. .enable_bit = OMAP24XX_EN_WDT1_SHIFT,
  1285. .recalc = &followparent_recalc,
  1286. };
  1287. static struct clk omapctrl_ick = {
  1288. .name = "omapctrl_ick",
  1289. .ops = &clkops_omap2_iclk_dflt_wait,
  1290. .flags = ENABLE_ON_INIT,
  1291. .parent = &wu_l4_ick,
  1292. .clkdm_name = "wkup_clkdm",
  1293. .enable_reg = OMAP_CM_REGADDR(WKUP_MOD, CM_ICLKEN),
  1294. .enable_bit = OMAP24XX_EN_OMAPCTRL_SHIFT,
  1295. .recalc = &followparent_recalc,
  1296. };
  1297. static struct clk icr_ick = {
  1298. .name = "icr_ick",
  1299. .ops = &clkops_omap2_iclk_dflt_wait,
  1300. .parent = &wu_l4_ick,
  1301. .clkdm_name = "wkup_clkdm",
  1302. .enable_reg = OMAP_CM_REGADDR(WKUP_MOD, CM_ICLKEN),
  1303. .enable_bit = OMAP2430_EN_ICR_SHIFT,
  1304. .recalc = &followparent_recalc,
  1305. };
  1306. static struct clk cam_ick = {
  1307. .name = "cam_ick",
  1308. .ops = &clkops_omap2_iclk_dflt,
  1309. .parent = &l4_ck,
  1310. .clkdm_name = "core_l4_clkdm",
  1311. .enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_ICLKEN1),
  1312. .enable_bit = OMAP24XX_EN_CAM_SHIFT,
  1313. .recalc = &followparent_recalc,
  1314. };
  1315. /*
  1316. * cam_fck controls both CAM_MCLK and CAM_FCLK. It should probably be
  1317. * split into two separate clocks, since the parent clocks are different
  1318. * and the clockdomains are also different.
  1319. */
  1320. static struct clk cam_fck = {
  1321. .name = "cam_fck",
  1322. .ops = &clkops_omap2_dflt,
  1323. .parent = &func_96m_ck,
  1324. .clkdm_name = "core_l3_clkdm",
  1325. .enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_FCLKEN1),
  1326. .enable_bit = OMAP24XX_EN_CAM_SHIFT,
  1327. .recalc = &followparent_recalc,
  1328. };
  1329. static struct clk mailboxes_ick = {
  1330. .name = "mailboxes_ick",
  1331. .ops = &clkops_omap2_iclk_dflt_wait,
  1332. .parent = &l4_ck,
  1333. .clkdm_name = "core_l4_clkdm",
  1334. .enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_ICLKEN1),
  1335. .enable_bit = OMAP24XX_EN_MAILBOXES_SHIFT,
  1336. .recalc = &followparent_recalc,
  1337. };
  1338. static struct clk wdt4_ick = {
  1339. .name = "wdt4_ick",
  1340. .ops = &clkops_omap2_iclk_dflt_wait,
  1341. .parent = &l4_ck,
  1342. .clkdm_name = "core_l4_clkdm",
  1343. .enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_ICLKEN1),
  1344. .enable_bit = OMAP24XX_EN_WDT4_SHIFT,
  1345. .recalc = &followparent_recalc,
  1346. };
  1347. static struct clk wdt4_fck = {
  1348. .name = "wdt4_fck",
  1349. .ops = &clkops_omap2_dflt_wait,
  1350. .parent = &func_32k_ck,
  1351. .clkdm_name = "core_l4_clkdm",
  1352. .enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_FCLKEN1),
  1353. .enable_bit = OMAP24XX_EN_WDT4_SHIFT,
  1354. .recalc = &followparent_recalc,
  1355. };
  1356. static struct clk mspro_ick = {
  1357. .name = "mspro_ick",
  1358. .ops = &clkops_omap2_iclk_dflt_wait,
  1359. .parent = &l4_ck,
  1360. .clkdm_name = "core_l4_clkdm",
  1361. .enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_ICLKEN1),
  1362. .enable_bit = OMAP24XX_EN_MSPRO_SHIFT,
  1363. .recalc = &followparent_recalc,
  1364. };
  1365. static struct clk mspro_fck = {
  1366. .name = "mspro_fck",
  1367. .ops = &clkops_omap2_dflt_wait,
  1368. .parent = &func_96m_ck,
  1369. .clkdm_name = "core_l4_clkdm",
  1370. .enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_FCLKEN1),
  1371. .enable_bit = OMAP24XX_EN_MSPRO_SHIFT,
  1372. .recalc = &followparent_recalc,
  1373. };
  1374. static struct clk fac_ick = {
  1375. .name = "fac_ick",
  1376. .ops = &clkops_omap2_iclk_dflt_wait,
  1377. .parent = &l4_ck,
  1378. .clkdm_name = "core_l4_clkdm",
  1379. .enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_ICLKEN1),
  1380. .enable_bit = OMAP24XX_EN_FAC_SHIFT,
  1381. .recalc = &followparent_recalc,
  1382. };
  1383. static struct clk fac_fck = {
  1384. .name = "fac_fck",
  1385. .ops = &clkops_omap2_dflt_wait,
  1386. .parent = &func_12m_ck,
  1387. .clkdm_name = "core_l4_clkdm",
  1388. .enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_FCLKEN1),
  1389. .enable_bit = OMAP24XX_EN_FAC_SHIFT,
  1390. .recalc = &followparent_recalc,
  1391. };
  1392. static struct clk hdq_ick = {
  1393. .name = "hdq_ick",
  1394. .ops = &clkops_omap2_iclk_dflt_wait,
  1395. .parent = &l4_ck,
  1396. .clkdm_name = "core_l4_clkdm",
  1397. .enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_ICLKEN1),
  1398. .enable_bit = OMAP24XX_EN_HDQ_SHIFT,
  1399. .recalc = &followparent_recalc,
  1400. };
  1401. static struct clk hdq_fck = {
  1402. .name = "hdq_fck",
  1403. .ops = &clkops_omap2_dflt_wait,
  1404. .parent = &func_12m_ck,
  1405. .clkdm_name = "core_l4_clkdm",
  1406. .enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_FCLKEN1),
  1407. .enable_bit = OMAP24XX_EN_HDQ_SHIFT,
  1408. .recalc = &followparent_recalc,
  1409. };
  1410. /*
  1411. * XXX This is marked as a 2420-only define, but it claims to be present
  1412. * on 2430 also. Double-check.
  1413. */
  1414. static struct clk i2c2_ick = {
  1415. .name = "i2c2_ick",
  1416. .ops = &clkops_omap2_iclk_dflt_wait,
  1417. .parent = &l4_ck,
  1418. .clkdm_name = "core_l4_clkdm",
  1419. .enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_ICLKEN1),
  1420. .enable_bit = OMAP2420_EN_I2C2_SHIFT,
  1421. .recalc = &followparent_recalc,
  1422. };
  1423. static struct clk i2chs2_fck = {
  1424. .name = "i2chs2_fck",
  1425. .ops = &clkops_omap2430_i2chs_wait,
  1426. .parent = &func_96m_ck,
  1427. .clkdm_name = "core_l4_clkdm",
  1428. .enable_reg = OMAP_CM_REGADDR(CORE_MOD, OMAP24XX_CM_FCLKEN2),
  1429. .enable_bit = OMAP2430_EN_I2CHS2_SHIFT,
  1430. .recalc = &followparent_recalc,
  1431. };
  1432. /*
  1433. * XXX This is marked as a 2420-only define, but it claims to be present
  1434. * on 2430 also. Double-check.
  1435. */
  1436. static struct clk i2c1_ick = {
  1437. .name = "i2c1_ick",
  1438. .ops = &clkops_omap2_iclk_dflt_wait,
  1439. .parent = &l4_ck,
  1440. .clkdm_name = "core_l4_clkdm",
  1441. .enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_ICLKEN1),
  1442. .enable_bit = OMAP2420_EN_I2C1_SHIFT,
  1443. .recalc = &followparent_recalc,
  1444. };
  1445. static struct clk i2chs1_fck = {
  1446. .name = "i2chs1_fck",
  1447. .ops = &clkops_omap2430_i2chs_wait,
  1448. .parent = &func_96m_ck,
  1449. .clkdm_name = "core_l4_clkdm",
  1450. .enable_reg = OMAP_CM_REGADDR(CORE_MOD, OMAP24XX_CM_FCLKEN2),
  1451. .enable_bit = OMAP2430_EN_I2CHS1_SHIFT,
  1452. .recalc = &followparent_recalc,
  1453. };
  1454. /*
  1455. * The enable_reg/enable_bit in this clock is only used for CM_AUTOIDLE
  1456. * accesses derived from this data.
  1457. */
  1458. static struct clk gpmc_fck = {
  1459. .name = "gpmc_fck",
  1460. .ops = &clkops_omap2_iclk_idle_only,
  1461. .parent = &core_l3_ck,
  1462. .flags = ENABLE_ON_INIT,
  1463. .clkdm_name = "core_l3_clkdm",
  1464. .enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_ICLKEN3),
  1465. .enable_bit = OMAP24XX_AUTO_GPMC_SHIFT,
  1466. .recalc = &followparent_recalc,
  1467. };
  1468. static struct clk sdma_fck = {
  1469. .name = "sdma_fck",
  1470. .ops = &clkops_null, /* RMK: missing? */
  1471. .parent = &core_l3_ck,
  1472. .clkdm_name = "core_l3_clkdm",
  1473. .recalc = &followparent_recalc,
  1474. };
  1475. /*
  1476. * The enable_reg/enable_bit in this clock is only used for CM_AUTOIDLE
  1477. * accesses derived from this data.
  1478. */
  1479. static struct clk sdma_ick = {
  1480. .name = "sdma_ick",
  1481. .ops = &clkops_omap2_iclk_idle_only,
  1482. .parent = &core_l3_ck,
  1483. .clkdm_name = "core_l3_clkdm",
  1484. .enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_ICLKEN3),
  1485. .enable_bit = OMAP24XX_AUTO_SDMA_SHIFT,
  1486. .recalc = &followparent_recalc,
  1487. };
  1488. static struct clk sdrc_ick = {
  1489. .name = "sdrc_ick",
  1490. .ops = &clkops_omap2_iclk_idle_only,
  1491. .parent = &core_l3_ck,
  1492. .flags = ENABLE_ON_INIT,
  1493. .clkdm_name = "core_l3_clkdm",
  1494. .enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_ICLKEN3),
  1495. .enable_bit = OMAP2430_EN_SDRC_SHIFT,
  1496. .recalc = &followparent_recalc,
  1497. };
  1498. static struct clk des_ick = {
  1499. .name = "des_ick",
  1500. .ops = &clkops_omap2_iclk_dflt_wait,
  1501. .parent = &l4_ck,
  1502. .clkdm_name = "core_l4_clkdm",
  1503. .enable_reg = OMAP_CM_REGADDR(CORE_MOD, OMAP24XX_CM_ICLKEN4),
  1504. .enable_bit = OMAP24XX_EN_DES_SHIFT,
  1505. .recalc = &followparent_recalc,
  1506. };
  1507. static struct clk sha_ick = {
  1508. .name = "sha_ick",
  1509. .ops = &clkops_omap2_iclk_dflt_wait,
  1510. .parent = &l4_ck,
  1511. .clkdm_name = "core_l4_clkdm",
  1512. .enable_reg = OMAP_CM_REGADDR(CORE_MOD, OMAP24XX_CM_ICLKEN4),
  1513. .enable_bit = OMAP24XX_EN_SHA_SHIFT,
  1514. .recalc = &followparent_recalc,
  1515. };
  1516. static struct clk rng_ick = {
  1517. .name = "rng_ick",
  1518. .ops = &clkops_omap2_iclk_dflt_wait,
  1519. .parent = &l4_ck,
  1520. .clkdm_name = "core_l4_clkdm",
  1521. .enable_reg = OMAP_CM_REGADDR(CORE_MOD, OMAP24XX_CM_ICLKEN4),
  1522. .enable_bit = OMAP24XX_EN_RNG_SHIFT,
  1523. .recalc = &followparent_recalc,
  1524. };
  1525. static struct clk aes_ick = {
  1526. .name = "aes_ick",
  1527. .ops = &clkops_omap2_iclk_dflt_wait,
  1528. .parent = &l4_ck,
  1529. .clkdm_name = "core_l4_clkdm",
  1530. .enable_reg = OMAP_CM_REGADDR(CORE_MOD, OMAP24XX_CM_ICLKEN4),
  1531. .enable_bit = OMAP24XX_EN_AES_SHIFT,
  1532. .recalc = &followparent_recalc,
  1533. };
  1534. static struct clk pka_ick = {
  1535. .name = "pka_ick",
  1536. .ops = &clkops_omap2_iclk_dflt_wait,
  1537. .parent = &l4_ck,
  1538. .clkdm_name = "core_l4_clkdm",
  1539. .enable_reg = OMAP_CM_REGADDR(CORE_MOD, OMAP24XX_CM_ICLKEN4),
  1540. .enable_bit = OMAP24XX_EN_PKA_SHIFT,
  1541. .recalc = &followparent_recalc,
  1542. };
  1543. static struct clk usb_fck = {
  1544. .name = "usb_fck",
  1545. .ops = &clkops_omap2_dflt_wait,
  1546. .parent = &func_48m_ck,
  1547. .clkdm_name = "core_l3_clkdm",
  1548. .enable_reg = OMAP_CM_REGADDR(CORE_MOD, OMAP24XX_CM_FCLKEN2),
  1549. .enable_bit = OMAP24XX_EN_USB_SHIFT,
  1550. .recalc = &followparent_recalc,
  1551. };
  1552. static struct clk usbhs_ick = {
  1553. .name = "usbhs_ick",
  1554. .ops = &clkops_omap2_iclk_dflt_wait,
  1555. .parent = &core_l3_ck,
  1556. .clkdm_name = "core_l3_clkdm",
  1557. .enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_ICLKEN2),
  1558. .enable_bit = OMAP2430_EN_USBHS_SHIFT,
  1559. .recalc = &followparent_recalc,
  1560. };
  1561. static struct clk mmchs1_ick = {
  1562. .name = "mmchs1_ick",
  1563. .ops = &clkops_omap2_iclk_dflt_wait,
  1564. .parent = &l4_ck,
  1565. .clkdm_name = "core_l4_clkdm",
  1566. .enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_ICLKEN2),
  1567. .enable_bit = OMAP2430_EN_MMCHS1_SHIFT,
  1568. .recalc = &followparent_recalc,
  1569. };
  1570. static struct clk mmchs1_fck = {
  1571. .name = "mmchs1_fck",
  1572. .ops = &clkops_omap2_dflt_wait,
  1573. .parent = &func_96m_ck,
  1574. .clkdm_name = "core_l4_clkdm",
  1575. .enable_reg = OMAP_CM_REGADDR(CORE_MOD, OMAP24XX_CM_FCLKEN2),
  1576. .enable_bit = OMAP2430_EN_MMCHS1_SHIFT,
  1577. .recalc = &followparent_recalc,
  1578. };
  1579. static struct clk mmchs2_ick = {
  1580. .name = "mmchs2_ick",
  1581. .ops = &clkops_omap2_iclk_dflt_wait,
  1582. .parent = &l4_ck,
  1583. .clkdm_name = "core_l4_clkdm",
  1584. .enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_ICLKEN2),
  1585. .enable_bit = OMAP2430_EN_MMCHS2_SHIFT,
  1586. .recalc = &followparent_recalc,
  1587. };
  1588. static struct clk mmchs2_fck = {
  1589. .name = "mmchs2_fck",
  1590. .ops = &clkops_omap2_dflt_wait,
  1591. .parent = &func_96m_ck,
  1592. .clkdm_name = "core_l4_clkdm",
  1593. .enable_reg = OMAP_CM_REGADDR(CORE_MOD, OMAP24XX_CM_FCLKEN2),
  1594. .enable_bit = OMAP2430_EN_MMCHS2_SHIFT,
  1595. .recalc = &followparent_recalc,
  1596. };
  1597. static struct clk gpio5_ick = {
  1598. .name = "gpio5_ick",
  1599. .ops = &clkops_omap2_iclk_dflt_wait,
  1600. .parent = &l4_ck,
  1601. .clkdm_name = "core_l4_clkdm",
  1602. .enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_ICLKEN2),
  1603. .enable_bit = OMAP2430_EN_GPIO5_SHIFT,
  1604. .recalc = &followparent_recalc,
  1605. };
  1606. static struct clk gpio5_fck = {
  1607. .name = "gpio5_fck",
  1608. .ops = &clkops_omap2_dflt_wait,
  1609. .parent = &func_32k_ck,
  1610. .clkdm_name = "core_l4_clkdm",
  1611. .enable_reg = OMAP_CM_REGADDR(CORE_MOD, OMAP24XX_CM_FCLKEN2),
  1612. .enable_bit = OMAP2430_EN_GPIO5_SHIFT,
  1613. .recalc = &followparent_recalc,
  1614. };
  1615. static struct clk mdm_intc_ick = {
  1616. .name = "mdm_intc_ick",
  1617. .ops = &clkops_omap2_iclk_dflt_wait,
  1618. .parent = &l4_ck,
  1619. .clkdm_name = "core_l4_clkdm",
  1620. .enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_ICLKEN2),
  1621. .enable_bit = OMAP2430_EN_MDM_INTC_SHIFT,
  1622. .recalc = &followparent_recalc,
  1623. };
  1624. static struct clk mmchsdb1_fck = {
  1625. .name = "mmchsdb1_fck",
  1626. .ops = &clkops_omap2_dflt_wait,
  1627. .parent = &func_32k_ck,
  1628. .clkdm_name = "core_l4_clkdm",
  1629. .enable_reg = OMAP_CM_REGADDR(CORE_MOD, OMAP24XX_CM_FCLKEN2),
  1630. .enable_bit = OMAP2430_EN_MMCHSDB1_SHIFT,
  1631. .recalc = &followparent_recalc,
  1632. };
  1633. static struct clk mmchsdb2_fck = {
  1634. .name = "mmchsdb2_fck",
  1635. .ops = &clkops_omap2_dflt_wait,
  1636. .parent = &func_32k_ck,
  1637. .clkdm_name = "core_l4_clkdm",
  1638. .enable_reg = OMAP_CM_REGADDR(CORE_MOD, OMAP24XX_CM_FCLKEN2),
  1639. .enable_bit = OMAP2430_EN_MMCHSDB2_SHIFT,
  1640. .recalc = &followparent_recalc,
  1641. };
  1642. /*
  1643. * This clock is a composite clock which does entire set changes then
  1644. * forces a rebalance. It keys on the MPU speed, but it really could
  1645. * be any key speed part of a set in the rate table.
  1646. *
  1647. * to really change a set, you need memory table sets which get changed
  1648. * in sram, pre-notifiers & post notifiers, changing the top set, without
  1649. * having low level display recalc's won't work... this is why dpm notifiers
  1650. * work, isr's off, walk a list of clocks already _off_ and not messing with
  1651. * the bus.
  1652. *
  1653. * This clock should have no parent. It embodies the entire upper level
  1654. * active set. A parent will mess up some of the init also.
  1655. */
  1656. static struct clk virt_prcm_set = {
  1657. .name = "virt_prcm_set",
  1658. .ops = &clkops_null,
  1659. .parent = &mpu_ck, /* Indexed by mpu speed, no parent */
  1660. .recalc = &omap2_table_mpu_recalc, /* sets are keyed on mpu rate */
  1661. .set_rate = &omap2_select_table_rate,
  1662. .round_rate = &omap2_round_to_table_rate,
  1663. };
  1664. /*
  1665. * clkdev integration
  1666. */
  1667. static struct omap_clk omap2430_clks[] = {
  1668. /* external root sources */
  1669. CLK(NULL, "func_32k_ck", &func_32k_ck, CK_243X),
  1670. CLK(NULL, "secure_32k_ck", &secure_32k_ck, CK_243X),
  1671. CLK(NULL, "osc_ck", &osc_ck, CK_243X),
  1672. CLK(NULL, "sys_ck", &sys_ck, CK_243X),
  1673. CLK(NULL, "alt_ck", &alt_ck, CK_243X),
  1674. CLK(NULL, "mcbsp_clks", &mcbsp_clks, CK_243X),
  1675. /* internal analog sources */
  1676. CLK(NULL, "dpll_ck", &dpll_ck, CK_243X),
  1677. CLK(NULL, "apll96_ck", &apll96_ck, CK_243X),
  1678. CLK(NULL, "apll54_ck", &apll54_ck, CK_243X),
  1679. /* internal prcm root sources */
  1680. CLK(NULL, "func_54m_ck", &func_54m_ck, CK_243X),
  1681. CLK(NULL, "core_ck", &core_ck, CK_243X),
  1682. CLK(NULL, "func_96m_ck", &func_96m_ck, CK_243X),
  1683. CLK(NULL, "func_48m_ck", &func_48m_ck, CK_243X),
  1684. CLK(NULL, "func_12m_ck", &func_12m_ck, CK_243X),
  1685. CLK(NULL, "ck_wdt1_osc", &wdt1_osc_ck, CK_243X),
  1686. CLK(NULL, "sys_clkout_src", &sys_clkout_src, CK_243X),
  1687. CLK(NULL, "sys_clkout", &sys_clkout, CK_243X),
  1688. CLK(NULL, "emul_ck", &emul_ck, CK_243X),
  1689. /* mpu domain clocks */
  1690. CLK(NULL, "mpu_ck", &mpu_ck, CK_243X),
  1691. /* dsp domain clocks */
  1692. CLK(NULL, "dsp_fck", &dsp_fck, CK_243X),
  1693. CLK(NULL, "iva2_1_ick", &iva2_1_ick, CK_243X),
  1694. /* GFX domain clocks */
  1695. CLK(NULL, "gfx_3d_fck", &gfx_3d_fck, CK_243X),
  1696. CLK(NULL, "gfx_2d_fck", &gfx_2d_fck, CK_243X),
  1697. CLK(NULL, "gfx_ick", &gfx_ick, CK_243X),
  1698. /* Modem domain clocks */
  1699. CLK(NULL, "mdm_ick", &mdm_ick, CK_243X),
  1700. CLK(NULL, "mdm_osc_ck", &mdm_osc_ck, CK_243X),
  1701. /* DSS domain clocks */
  1702. CLK("omapdss_dss", "ick", &dss_ick, CK_243X),
  1703. CLK(NULL, "dss1_fck", &dss1_fck, CK_243X),
  1704. CLK(NULL, "dss2_fck", &dss2_fck, CK_243X),
  1705. CLK(NULL, "dss_54m_fck", &dss_54m_fck, CK_243X),
  1706. /* L3 domain clocks */
  1707. CLK(NULL, "core_l3_ck", &core_l3_ck, CK_243X),
  1708. CLK(NULL, "ssi_fck", &ssi_ssr_sst_fck, CK_243X),
  1709. CLK(NULL, "usb_l4_ick", &usb_l4_ick, CK_243X),
  1710. /* L4 domain clocks */
  1711. CLK(NULL, "l4_ck", &l4_ck, CK_243X),
  1712. CLK(NULL, "ssi_l4_ick", &ssi_l4_ick, CK_243X),
  1713. CLK(NULL, "wu_l4_ick", &wu_l4_ick, CK_243X),
  1714. /* virtual meta-group clock */
  1715. CLK(NULL, "virt_prcm_set", &virt_prcm_set, CK_243X),
  1716. /* general l4 interface ck, multi-parent functional clk */
  1717. CLK(NULL, "gpt1_ick", &gpt1_ick, CK_243X),
  1718. CLK(NULL, "gpt1_fck", &gpt1_fck, CK_243X),
  1719. CLK(NULL, "gpt2_ick", &gpt2_ick, CK_243X),
  1720. CLK(NULL, "gpt2_fck", &gpt2_fck, CK_243X),
  1721. CLK(NULL, "gpt3_ick", &gpt3_ick, CK_243X),
  1722. CLK(NULL, "gpt3_fck", &gpt3_fck, CK_243X),
  1723. CLK(NULL, "gpt4_ick", &gpt4_ick, CK_243X),
  1724. CLK(NULL, "gpt4_fck", &gpt4_fck, CK_243X),
  1725. CLK(NULL, "gpt5_ick", &gpt5_ick, CK_243X),
  1726. CLK(NULL, "gpt5_fck", &gpt5_fck, CK_243X),
  1727. CLK(NULL, "gpt6_ick", &gpt6_ick, CK_243X),
  1728. CLK(NULL, "gpt6_fck", &gpt6_fck, CK_243X),
  1729. CLK(NULL, "gpt7_ick", &gpt7_ick, CK_243X),
  1730. CLK(NULL, "gpt7_fck", &gpt7_fck, CK_243X),
  1731. CLK(NULL, "gpt8_ick", &gpt8_ick, CK_243X),
  1732. CLK(NULL, "gpt8_fck", &gpt8_fck, CK_243X),
  1733. CLK(NULL, "gpt9_ick", &gpt9_ick, CK_243X),
  1734. CLK(NULL, "gpt9_fck", &gpt9_fck, CK_243X),
  1735. CLK(NULL, "gpt10_ick", &gpt10_ick, CK_243X),
  1736. CLK(NULL, "gpt10_fck", &gpt10_fck, CK_243X),
  1737. CLK(NULL, "gpt11_ick", &gpt11_ick, CK_243X),
  1738. CLK(NULL, "gpt11_fck", &gpt11_fck, CK_243X),
  1739. CLK(NULL, "gpt12_ick", &gpt12_ick, CK_243X),
  1740. CLK(NULL, "gpt12_fck", &gpt12_fck, CK_243X),
  1741. CLK("omap-mcbsp.1", "ick", &mcbsp1_ick, CK_243X),
  1742. CLK(NULL, "mcbsp1_fck", &mcbsp1_fck, CK_243X),
  1743. CLK("omap-mcbsp.2", "ick", &mcbsp2_ick, CK_243X),
  1744. CLK(NULL, "mcbsp2_fck", &mcbsp2_fck, CK_243X),
  1745. CLK("omap-mcbsp.3", "ick", &mcbsp3_ick, CK_243X),
  1746. CLK(NULL, "mcbsp3_fck", &mcbsp3_fck, CK_243X),
  1747. CLK("omap-mcbsp.4", "ick", &mcbsp4_ick, CK_243X),
  1748. CLK(NULL, "mcbsp4_fck", &mcbsp4_fck, CK_243X),
  1749. CLK("omap-mcbsp.5", "ick", &mcbsp5_ick, CK_243X),
  1750. CLK(NULL, "mcbsp5_fck", &mcbsp5_fck, CK_243X),
  1751. CLK("omap2_mcspi.1", "ick", &mcspi1_ick, CK_243X),
  1752. CLK(NULL, "mcspi1_fck", &mcspi1_fck, CK_243X),
  1753. CLK("omap2_mcspi.2", "ick", &mcspi2_ick, CK_243X),
  1754. CLK(NULL, "mcspi2_fck", &mcspi2_fck, CK_243X),
  1755. CLK("omap2_mcspi.3", "ick", &mcspi3_ick, CK_243X),
  1756. CLK(NULL, "mcspi3_fck", &mcspi3_fck, CK_243X),
  1757. CLK(NULL, "uart1_ick", &uart1_ick, CK_243X),
  1758. CLK(NULL, "uart1_fck", &uart1_fck, CK_243X),
  1759. CLK(NULL, "uart2_ick", &uart2_ick, CK_243X),
  1760. CLK(NULL, "uart2_fck", &uart2_fck, CK_243X),
  1761. CLK(NULL, "uart3_ick", &uart3_ick, CK_243X),
  1762. CLK(NULL, "uart3_fck", &uart3_fck, CK_243X),
  1763. CLK(NULL, "gpios_ick", &gpios_ick, CK_243X),
  1764. CLK(NULL, "gpios_fck", &gpios_fck, CK_243X),
  1765. CLK("omap_wdt", "ick", &mpu_wdt_ick, CK_243X),
  1766. CLK(NULL, "mpu_wdt_fck", &mpu_wdt_fck, CK_243X),
  1767. CLK(NULL, "sync_32k_ick", &sync_32k_ick, CK_243X),
  1768. CLK(NULL, "wdt1_ick", &wdt1_ick, CK_243X),
  1769. CLK(NULL, "omapctrl_ick", &omapctrl_ick, CK_243X),
  1770. CLK(NULL, "icr_ick", &icr_ick, CK_243X),
  1771. CLK("omap24xxcam", "fck", &cam_fck, CK_243X),
  1772. CLK("omap24xxcam", "ick", &cam_ick, CK_243X),
  1773. CLK(NULL, "mailboxes_ick", &mailboxes_ick, CK_243X),
  1774. CLK(NULL, "wdt4_ick", &wdt4_ick, CK_243X),
  1775. CLK(NULL, "wdt4_fck", &wdt4_fck, CK_243X),
  1776. CLK(NULL, "mspro_ick", &mspro_ick, CK_243X),
  1777. CLK(NULL, "mspro_fck", &mspro_fck, CK_243X),
  1778. CLK(NULL, "fac_ick", &fac_ick, CK_243X),
  1779. CLK(NULL, "fac_fck", &fac_fck, CK_243X),
  1780. CLK("omap_hdq.0", "ick", &hdq_ick, CK_243X),
  1781. CLK("omap_hdq.1", "fck", &hdq_fck, CK_243X),
  1782. CLK("omap_i2c.1", "ick", &i2c1_ick, CK_243X),
  1783. CLK(NULL, "i2chs1_fck", &i2chs1_fck, CK_243X),
  1784. CLK("omap_i2c.2", "ick", &i2c2_ick, CK_243X),
  1785. CLK(NULL, "i2chs2_fck", &i2chs2_fck, CK_243X),
  1786. CLK(NULL, "gpmc_fck", &gpmc_fck, CK_243X),
  1787. CLK(NULL, "sdma_fck", &sdma_fck, CK_243X),
  1788. CLK(NULL, "sdma_ick", &sdma_ick, CK_243X),
  1789. CLK(NULL, "sdrc_ick", &sdrc_ick, CK_243X),
  1790. CLK(NULL, "des_ick", &des_ick, CK_243X),
  1791. CLK("omap-sham", "ick", &sha_ick, CK_243X),
  1792. CLK("omap_rng", "ick", &rng_ick, CK_243X),
  1793. CLK("omap-aes", "ick", &aes_ick, CK_243X),
  1794. CLK(NULL, "pka_ick", &pka_ick, CK_243X),
  1795. CLK(NULL, "usb_fck", &usb_fck, CK_243X),
  1796. CLK("musb-omap2430", "ick", &usbhs_ick, CK_243X),
  1797. CLK("omap_hsmmc.0", "ick", &mmchs1_ick, CK_243X),
  1798. CLK(NULL, "mmchs1_fck", &mmchs1_fck, CK_243X),
  1799. CLK("omap_hsmmc.1", "ick", &mmchs2_ick, CK_243X),
  1800. CLK(NULL, "mmchs2_fck", &mmchs2_fck, CK_243X),
  1801. CLK(NULL, "gpio5_ick", &gpio5_ick, CK_243X),
  1802. CLK(NULL, "gpio5_fck", &gpio5_fck, CK_243X),
  1803. CLK(NULL, "mdm_intc_ick", &mdm_intc_ick, CK_243X),
  1804. CLK("omap_hsmmc.0", "mmchsdb_fck", &mmchsdb1_fck, CK_243X),
  1805. CLK("omap_hsmmc.1", "mmchsdb_fck", &mmchsdb2_fck, CK_243X),
  1806. CLK(NULL, "timer_32k_ck", &func_32k_ck, CK_243X),
  1807. CLK(NULL, "timer_sys_ck", &sys_ck, CK_243X),
  1808. CLK(NULL, "timer_ext_ck", &alt_ck, CK_243X),
  1809. };
  1810. /*
  1811. * init code
  1812. */
  1813. int __init omap2430_clk_init(void)
  1814. {
  1815. const struct prcm_config *prcm;
  1816. struct omap_clk *c;
  1817. u32 clkrate;
  1818. prcm_clksrc_ctrl = OMAP2430_PRCM_CLKSRC_CTRL;
  1819. cm_idlest_pll = OMAP_CM_REGADDR(PLL_MOD, CM_IDLEST);
  1820. cpu_mask = RATE_IN_243X;
  1821. rate_table = omap2430_rate_table;
  1822. clk_init(&omap2_clk_functions);
  1823. for (c = omap2430_clks; c < omap2430_clks + ARRAY_SIZE(omap2430_clks);
  1824. c++)
  1825. clk_preinit(c->lk.clk);
  1826. osc_ck.rate = omap2_osc_clk_recalc(&osc_ck);
  1827. propagate_rate(&osc_ck);
  1828. sys_ck.rate = omap2xxx_sys_clk_recalc(&sys_ck);
  1829. propagate_rate(&sys_ck);
  1830. for (c = omap2430_clks; c < omap2430_clks + ARRAY_SIZE(omap2430_clks);
  1831. c++) {
  1832. clkdev_add(&c->lk);
  1833. clk_register(c->lk.clk);
  1834. omap2_init_clk_clkdm(c->lk.clk);
  1835. }
  1836. /* Disable autoidle on all clocks; let the PM code enable it later */
  1837. omap_clk_disable_autoidle_all();
  1838. /* Check the MPU rate set by bootloader */
  1839. clkrate = omap2xxx_clk_get_core_rate(&dpll_ck);
  1840. for (prcm = rate_table; prcm->mpu_speed; prcm++) {
  1841. if (!(prcm->flags & cpu_mask))
  1842. continue;
  1843. if (prcm->xtal_speed != sys_ck.rate)
  1844. continue;
  1845. if (prcm->dpll_speed <= clkrate)
  1846. break;
  1847. }
  1848. curr_prcm_set = prcm;
  1849. recalculate_root_clocks();
  1850. pr_info("Clocking rate (Crystal/DPLL/MPU): %ld.%01ld/%ld/%ld MHz\n",
  1851. (sys_ck.rate / 1000000), (sys_ck.rate / 100000) % 10,
  1852. (dpll_ck.rate / 1000000), (mpu_ck.rate / 1000000)) ;
  1853. /*
  1854. * Only enable those clocks we will need, let the drivers
  1855. * enable other clocks as necessary
  1856. */
  1857. clk_enable_init_clocks();
  1858. /* Avoid sleeping sleeping during omap2_clk_prepare_for_reboot() */
  1859. vclk = clk_get(NULL, "virt_prcm_set");
  1860. sclk = clk_get(NULL, "sys_ck");
  1861. dclk = clk_get(NULL, "dpll_ck");
  1862. return 0;
  1863. }