cclock44xx_data.c 60 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563156415651566156715681569157015711572157315741575157615771578157915801581158215831584158515861587158815891590159115921593159415951596159715981599160016011602160316041605160616071608160916101611161216131614161516161617161816191620162116221623162416251626162716281629163016311632163316341635163616371638163916401641164216431644164516461647164816491650165116521653165416551656165716581659166016611662166316641665166616671668166916701671167216731674167516761677167816791680168116821683168416851686168716881689169016911692169316941695169616971698169917001701170217031704170517061707170817091710171117121713171417151716171717181719172017211722172317241725172617271728172917301731173217331734
  1. /*
  2. * OMAP4 Clock data
  3. *
  4. * Copyright (C) 2009-2012 Texas Instruments, Inc.
  5. * Copyright (C) 2009-2010 Nokia Corporation
  6. *
  7. * Paul Walmsley (paul@pwsan.com)
  8. * Rajendra Nayak (rnayak@ti.com)
  9. * Benoit Cousson (b-cousson@ti.com)
  10. * Mike Turquette (mturquette@ti.com)
  11. *
  12. * This program is free software; you can redistribute it and/or modify
  13. * it under the terms of the GNU General Public License version 2 as
  14. * published by the Free Software Foundation.
  15. *
  16. * XXX Some of the ES1 clocks have been removed/changed; once support
  17. * is added for discriminating clocks by ES level, these should be added back
  18. * in.
  19. *
  20. * XXX All of the remaining MODULEMODE clock nodes should be removed
  21. * once the drivers are updated to use pm_runtime or to use the appropriate
  22. * upstream clock node for rate/parent selection.
  23. */
  24. #include <linux/kernel.h>
  25. #include <linux/list.h>
  26. #include <linux/clk-private.h>
  27. #include <linux/clkdev.h>
  28. #include <linux/io.h>
  29. #include "soc.h"
  30. #include "iomap.h"
  31. #include "clock.h"
  32. #include "clock44xx.h"
  33. #include "cm1_44xx.h"
  34. #include "cm2_44xx.h"
  35. #include "cm-regbits-44xx.h"
  36. #include "prm44xx.h"
  37. #include "prm-regbits-44xx.h"
  38. #include "control.h"
  39. #include "scrm44xx.h"
  40. /* OMAP4 modulemode control */
  41. #define OMAP4430_MODULEMODE_HWCTRL_SHIFT 0
  42. #define OMAP4430_MODULEMODE_SWCTRL_SHIFT 1
  43. /*
  44. * OMAP4 ABE DPLL default frequency. In OMAP4460 TRM version V, section
  45. * "3.6.3.2.3 CM1_ABE Clock Generator" states that the "DPLL_ABE_X2_CLK
  46. * must be set to 196.608 MHz" and hence, the DPLL locked frequency is
  47. * half of this value.
  48. */
  49. #define OMAP4_DPLL_ABE_DEFFREQ 98304000
  50. /*
  51. * OMAP4 USB DPLL default frequency. In OMAP4430 TRM version V, section
  52. * "3.6.3.9.5 DPLL_USB Preferred Settings" shows that the preferred
  53. * locked frequency for the USB DPLL is 960MHz.
  54. */
  55. #define OMAP4_DPLL_USB_DEFFREQ 960000000
  56. /* Root clocks */
  57. DEFINE_CLK_FIXED_RATE(extalt_clkin_ck, CLK_IS_ROOT, 59000000, 0x0);
  58. DEFINE_CLK_FIXED_RATE(pad_clks_src_ck, CLK_IS_ROOT, 12000000, 0x0);
  59. DEFINE_CLK_GATE(pad_clks_ck, "pad_clks_src_ck", &pad_clks_src_ck, 0x0,
  60. OMAP4430_CM_CLKSEL_ABE, OMAP4430_PAD_CLKS_GATE_SHIFT,
  61. 0x0, NULL);
  62. DEFINE_CLK_FIXED_RATE(pad_slimbus_core_clks_ck, CLK_IS_ROOT, 12000000, 0x0);
  63. DEFINE_CLK_FIXED_RATE(secure_32k_clk_src_ck, CLK_IS_ROOT, 32768, 0x0);
  64. DEFINE_CLK_FIXED_RATE(slimbus_src_clk, CLK_IS_ROOT, 12000000, 0x0);
  65. DEFINE_CLK_GATE(slimbus_clk, "slimbus_src_clk", &slimbus_src_clk, 0x0,
  66. OMAP4430_CM_CLKSEL_ABE, OMAP4430_SLIMBUS_CLK_GATE_SHIFT,
  67. 0x0, NULL);
  68. DEFINE_CLK_FIXED_RATE(sys_32k_ck, CLK_IS_ROOT, 32768, 0x0);
  69. DEFINE_CLK_FIXED_RATE(virt_12000000_ck, CLK_IS_ROOT, 12000000, 0x0);
  70. DEFINE_CLK_FIXED_RATE(virt_13000000_ck, CLK_IS_ROOT, 13000000, 0x0);
  71. DEFINE_CLK_FIXED_RATE(virt_16800000_ck, CLK_IS_ROOT, 16800000, 0x0);
  72. DEFINE_CLK_FIXED_RATE(virt_19200000_ck, CLK_IS_ROOT, 19200000, 0x0);
  73. DEFINE_CLK_FIXED_RATE(virt_26000000_ck, CLK_IS_ROOT, 26000000, 0x0);
  74. DEFINE_CLK_FIXED_RATE(virt_27000000_ck, CLK_IS_ROOT, 27000000, 0x0);
  75. DEFINE_CLK_FIXED_RATE(virt_38400000_ck, CLK_IS_ROOT, 38400000, 0x0);
  76. static const char *sys_clkin_ck_parents[] = {
  77. "virt_12000000_ck", "virt_13000000_ck", "virt_16800000_ck",
  78. "virt_19200000_ck", "virt_26000000_ck", "virt_27000000_ck",
  79. "virt_38400000_ck",
  80. };
  81. DEFINE_CLK_MUX(sys_clkin_ck, sys_clkin_ck_parents, NULL, 0x0,
  82. OMAP4430_CM_SYS_CLKSEL, OMAP4430_SYS_CLKSEL_SHIFT,
  83. OMAP4430_SYS_CLKSEL_WIDTH, CLK_MUX_INDEX_ONE, NULL);
  84. DEFINE_CLK_FIXED_RATE(tie_low_clock_ck, CLK_IS_ROOT, 0, 0x0);
  85. DEFINE_CLK_FIXED_RATE(utmi_phy_clkout_ck, CLK_IS_ROOT, 60000000, 0x0);
  86. DEFINE_CLK_FIXED_RATE(xclk60mhsp1_ck, CLK_IS_ROOT, 60000000, 0x0);
  87. DEFINE_CLK_FIXED_RATE(xclk60mhsp2_ck, CLK_IS_ROOT, 60000000, 0x0);
  88. DEFINE_CLK_FIXED_RATE(xclk60motg_ck, CLK_IS_ROOT, 60000000, 0x0);
  89. /* Module clocks and DPLL outputs */
  90. static const char *abe_dpll_bypass_clk_mux_ck_parents[] = {
  91. "sys_clkin_ck", "sys_32k_ck",
  92. };
  93. DEFINE_CLK_MUX(abe_dpll_bypass_clk_mux_ck, abe_dpll_bypass_clk_mux_ck_parents,
  94. NULL, 0x0, OMAP4430_CM_L4_WKUP_CLKSEL, OMAP4430_CLKSEL_SHIFT,
  95. OMAP4430_CLKSEL_WIDTH, 0x0, NULL);
  96. DEFINE_CLK_MUX(abe_dpll_refclk_mux_ck, abe_dpll_bypass_clk_mux_ck_parents, NULL,
  97. 0x0, OMAP4430_CM_ABE_PLL_REF_CLKSEL, OMAP4430_CLKSEL_0_0_SHIFT,
  98. OMAP4430_CLKSEL_0_0_WIDTH, 0x0, NULL);
  99. /* DPLL_ABE */
  100. static struct dpll_data dpll_abe_dd = {
  101. .mult_div1_reg = OMAP4430_CM_CLKSEL_DPLL_ABE,
  102. .clk_bypass = &abe_dpll_bypass_clk_mux_ck,
  103. .clk_ref = &abe_dpll_refclk_mux_ck,
  104. .control_reg = OMAP4430_CM_CLKMODE_DPLL_ABE,
  105. .modes = (1 << DPLL_LOW_POWER_BYPASS) | (1 << DPLL_LOCKED),
  106. .autoidle_reg = OMAP4430_CM_AUTOIDLE_DPLL_ABE,
  107. .idlest_reg = OMAP4430_CM_IDLEST_DPLL_ABE,
  108. .mult_mask = OMAP4430_DPLL_MULT_MASK,
  109. .div1_mask = OMAP4430_DPLL_DIV_MASK,
  110. .enable_mask = OMAP4430_DPLL_EN_MASK,
  111. .autoidle_mask = OMAP4430_AUTO_DPLL_MODE_MASK,
  112. .idlest_mask = OMAP4430_ST_DPLL_CLK_MASK,
  113. .m4xen_mask = OMAP4430_DPLL_REGM4XEN_MASK,
  114. .lpmode_mask = OMAP4430_DPLL_LPMODE_EN_MASK,
  115. .max_multiplier = 2047,
  116. .max_divider = 128,
  117. .min_divider = 1,
  118. };
  119. static const char *dpll_abe_ck_parents[] = {
  120. "abe_dpll_refclk_mux_ck",
  121. };
  122. static struct clk dpll_abe_ck;
  123. static const struct clk_ops dpll_abe_ck_ops = {
  124. .enable = &omap3_noncore_dpll_enable,
  125. .disable = &omap3_noncore_dpll_disable,
  126. .recalc_rate = &omap4_dpll_regm4xen_recalc,
  127. .round_rate = &omap4_dpll_regm4xen_round_rate,
  128. .set_rate = &omap3_noncore_dpll_set_rate,
  129. .get_parent = &omap2_init_dpll_parent,
  130. };
  131. static struct clk_hw_omap dpll_abe_ck_hw = {
  132. .hw = {
  133. .clk = &dpll_abe_ck,
  134. },
  135. .dpll_data = &dpll_abe_dd,
  136. .ops = &clkhwops_omap3_dpll,
  137. };
  138. DEFINE_STRUCT_CLK(dpll_abe_ck, dpll_abe_ck_parents, dpll_abe_ck_ops);
  139. static const char *dpll_abe_x2_ck_parents[] = {
  140. "dpll_abe_ck",
  141. };
  142. static struct clk dpll_abe_x2_ck;
  143. static const struct clk_ops dpll_abe_x2_ck_ops = {
  144. .recalc_rate = &omap3_clkoutx2_recalc,
  145. };
  146. static struct clk_hw_omap dpll_abe_x2_ck_hw = {
  147. .hw = {
  148. .clk = &dpll_abe_x2_ck,
  149. },
  150. .flags = CLOCK_CLKOUTX2,
  151. .clksel_reg = OMAP4430_CM_DIV_M2_DPLL_ABE,
  152. .ops = &clkhwops_omap4_dpllmx,
  153. };
  154. DEFINE_STRUCT_CLK(dpll_abe_x2_ck, dpll_abe_x2_ck_parents, dpll_abe_x2_ck_ops);
  155. static const struct clk_ops omap_hsdivider_ops = {
  156. .set_rate = &omap2_clksel_set_rate,
  157. .recalc_rate = &omap2_clksel_recalc,
  158. .round_rate = &omap2_clksel_round_rate,
  159. };
  160. DEFINE_CLK_OMAP_HSDIVIDER(dpll_abe_m2x2_ck, "dpll_abe_x2_ck", &dpll_abe_x2_ck,
  161. 0x0, OMAP4430_CM_DIV_M2_DPLL_ABE,
  162. OMAP4430_DPLL_CLKOUT_DIV_MASK);
  163. DEFINE_CLK_FIXED_FACTOR(abe_24m_fclk, "dpll_abe_m2x2_ck", &dpll_abe_m2x2_ck,
  164. 0x0, 1, 8);
  165. DEFINE_CLK_DIVIDER(abe_clk, "dpll_abe_m2x2_ck", &dpll_abe_m2x2_ck, 0x0,
  166. OMAP4430_CM_CLKSEL_ABE, OMAP4430_CLKSEL_OPP_SHIFT,
  167. OMAP4430_CLKSEL_OPP_WIDTH, CLK_DIVIDER_POWER_OF_TWO, NULL);
  168. DEFINE_CLK_DIVIDER(aess_fclk, "abe_clk", &abe_clk, 0x0,
  169. OMAP4430_CM1_ABE_AESS_CLKCTRL,
  170. OMAP4430_CLKSEL_AESS_FCLK_SHIFT,
  171. OMAP4430_CLKSEL_AESS_FCLK_WIDTH,
  172. 0x0, NULL);
  173. DEFINE_CLK_OMAP_HSDIVIDER(dpll_abe_m3x2_ck, "dpll_abe_x2_ck", &dpll_abe_x2_ck,
  174. 0x0, OMAP4430_CM_DIV_M3_DPLL_ABE,
  175. OMAP4430_DPLL_CLKOUTHIF_DIV_MASK);
  176. static const char *core_hsd_byp_clk_mux_ck_parents[] = {
  177. "sys_clkin_ck", "dpll_abe_m3x2_ck",
  178. };
  179. DEFINE_CLK_MUX(core_hsd_byp_clk_mux_ck, core_hsd_byp_clk_mux_ck_parents, NULL,
  180. 0x0, OMAP4430_CM_CLKSEL_DPLL_CORE,
  181. OMAP4430_DPLL_BYP_CLKSEL_SHIFT, OMAP4430_DPLL_BYP_CLKSEL_WIDTH,
  182. 0x0, NULL);
  183. /* DPLL_CORE */
  184. static struct dpll_data dpll_core_dd = {
  185. .mult_div1_reg = OMAP4430_CM_CLKSEL_DPLL_CORE,
  186. .clk_bypass = &core_hsd_byp_clk_mux_ck,
  187. .clk_ref = &sys_clkin_ck,
  188. .control_reg = OMAP4430_CM_CLKMODE_DPLL_CORE,
  189. .modes = (1 << DPLL_LOW_POWER_BYPASS) | (1 << DPLL_LOCKED),
  190. .autoidle_reg = OMAP4430_CM_AUTOIDLE_DPLL_CORE,
  191. .idlest_reg = OMAP4430_CM_IDLEST_DPLL_CORE,
  192. .mult_mask = OMAP4430_DPLL_MULT_MASK,
  193. .div1_mask = OMAP4430_DPLL_DIV_MASK,
  194. .enable_mask = OMAP4430_DPLL_EN_MASK,
  195. .autoidle_mask = OMAP4430_AUTO_DPLL_MODE_MASK,
  196. .idlest_mask = OMAP4430_ST_DPLL_CLK_MASK,
  197. .max_multiplier = 2047,
  198. .max_divider = 128,
  199. .min_divider = 1,
  200. };
  201. static const char *dpll_core_ck_parents[] = {
  202. "sys_clkin_ck", "core_hsd_byp_clk_mux_ck"
  203. };
  204. static struct clk dpll_core_ck;
  205. static const struct clk_ops dpll_core_ck_ops = {
  206. .recalc_rate = &omap3_dpll_recalc,
  207. .get_parent = &omap2_init_dpll_parent,
  208. };
  209. static struct clk_hw_omap dpll_core_ck_hw = {
  210. .hw = {
  211. .clk = &dpll_core_ck,
  212. },
  213. .dpll_data = &dpll_core_dd,
  214. .ops = &clkhwops_omap3_dpll,
  215. };
  216. DEFINE_STRUCT_CLK(dpll_core_ck, dpll_core_ck_parents, dpll_core_ck_ops);
  217. static const char *dpll_core_x2_ck_parents[] = {
  218. "dpll_core_ck",
  219. };
  220. static struct clk dpll_core_x2_ck;
  221. static struct clk_hw_omap dpll_core_x2_ck_hw = {
  222. .hw = {
  223. .clk = &dpll_core_x2_ck,
  224. },
  225. };
  226. DEFINE_STRUCT_CLK(dpll_core_x2_ck, dpll_core_x2_ck_parents, dpll_abe_x2_ck_ops);
  227. DEFINE_CLK_OMAP_HSDIVIDER(dpll_core_m6x2_ck, "dpll_core_x2_ck",
  228. &dpll_core_x2_ck, 0x0, OMAP4430_CM_DIV_M6_DPLL_CORE,
  229. OMAP4430_HSDIVIDER_CLKOUT3_DIV_MASK);
  230. DEFINE_CLK_OMAP_HSDIVIDER(dpll_core_m2_ck, "dpll_core_ck", &dpll_core_ck, 0x0,
  231. OMAP4430_CM_DIV_M2_DPLL_CORE,
  232. OMAP4430_DPLL_CLKOUT_DIV_MASK);
  233. DEFINE_CLK_FIXED_FACTOR(ddrphy_ck, "dpll_core_m2_ck", &dpll_core_m2_ck, 0x0, 1,
  234. 2);
  235. DEFINE_CLK_OMAP_HSDIVIDER(dpll_core_m5x2_ck, "dpll_core_x2_ck",
  236. &dpll_core_x2_ck, 0x0, OMAP4430_CM_DIV_M5_DPLL_CORE,
  237. OMAP4430_HSDIVIDER_CLKOUT2_DIV_MASK);
  238. DEFINE_CLK_DIVIDER(div_core_ck, "dpll_core_m5x2_ck", &dpll_core_m5x2_ck, 0x0,
  239. OMAP4430_CM_CLKSEL_CORE, OMAP4430_CLKSEL_CORE_SHIFT,
  240. OMAP4430_CLKSEL_CORE_WIDTH, 0x0, NULL);
  241. DEFINE_CLK_DIVIDER(div_iva_hs_clk, "dpll_core_m5x2_ck", &dpll_core_m5x2_ck,
  242. 0x0, OMAP4430_CM_BYPCLK_DPLL_IVA, OMAP4430_CLKSEL_0_1_SHIFT,
  243. OMAP4430_CLKSEL_0_1_WIDTH, CLK_DIVIDER_POWER_OF_TWO, NULL);
  244. DEFINE_CLK_DIVIDER(div_mpu_hs_clk, "dpll_core_m5x2_ck", &dpll_core_m5x2_ck,
  245. 0x0, OMAP4430_CM_BYPCLK_DPLL_MPU, OMAP4430_CLKSEL_0_1_SHIFT,
  246. OMAP4430_CLKSEL_0_1_WIDTH, CLK_DIVIDER_POWER_OF_TWO, NULL);
  247. DEFINE_CLK_OMAP_HSDIVIDER(dpll_core_m4x2_ck, "dpll_core_x2_ck",
  248. &dpll_core_x2_ck, 0x0, OMAP4430_CM_DIV_M4_DPLL_CORE,
  249. OMAP4430_HSDIVIDER_CLKOUT1_DIV_MASK);
  250. DEFINE_CLK_FIXED_FACTOR(dll_clk_div_ck, "dpll_core_m4x2_ck", &dpll_core_m4x2_ck,
  251. 0x0, 1, 2);
  252. DEFINE_CLK_DIVIDER(dpll_abe_m2_ck, "dpll_abe_ck", &dpll_abe_ck, 0x0,
  253. OMAP4430_CM_DIV_M2_DPLL_ABE, OMAP4430_DPLL_CLKOUT_DIV_SHIFT,
  254. OMAP4430_DPLL_CLKOUT_DIV_WIDTH, CLK_DIVIDER_ONE_BASED, NULL);
  255. static const struct clk_ops dpll_hsd_ops = {
  256. .enable = &omap2_dflt_clk_enable,
  257. .disable = &omap2_dflt_clk_disable,
  258. .is_enabled = &omap2_dflt_clk_is_enabled,
  259. .recalc_rate = &omap2_clksel_recalc,
  260. .get_parent = &omap2_clksel_find_parent_index,
  261. .set_parent = &omap2_clksel_set_parent,
  262. .init = &omap2_init_clk_clkdm,
  263. };
  264. static const struct clk_ops func_dmic_abe_gfclk_ops = {
  265. .recalc_rate = &omap2_clksel_recalc,
  266. .get_parent = &omap2_clksel_find_parent_index,
  267. .set_parent = &omap2_clksel_set_parent,
  268. };
  269. static const char *dpll_core_m3x2_ck_parents[] = {
  270. "dpll_core_x2_ck",
  271. };
  272. static const struct clksel dpll_core_m3x2_div[] = {
  273. { .parent = &dpll_core_x2_ck, .rates = div31_1to31_rates },
  274. { .parent = NULL },
  275. };
  276. /* XXX Missing round_rate, set_rate in ops */
  277. DEFINE_CLK_OMAP_MUX_GATE(dpll_core_m3x2_ck, NULL, dpll_core_m3x2_div,
  278. OMAP4430_CM_DIV_M3_DPLL_CORE,
  279. OMAP4430_DPLL_CLKOUTHIF_DIV_MASK,
  280. OMAP4430_CM_DIV_M3_DPLL_CORE,
  281. OMAP4430_DPLL_CLKOUTHIF_GATE_CTRL_SHIFT, NULL,
  282. dpll_core_m3x2_ck_parents, dpll_hsd_ops);
  283. DEFINE_CLK_OMAP_HSDIVIDER(dpll_core_m7x2_ck, "dpll_core_x2_ck",
  284. &dpll_core_x2_ck, 0x0, OMAP4430_CM_DIV_M7_DPLL_CORE,
  285. OMAP4430_HSDIVIDER_CLKOUT4_DIV_MASK);
  286. static const char *iva_hsd_byp_clk_mux_ck_parents[] = {
  287. "sys_clkin_ck", "div_iva_hs_clk",
  288. };
  289. DEFINE_CLK_MUX(iva_hsd_byp_clk_mux_ck, iva_hsd_byp_clk_mux_ck_parents, NULL,
  290. 0x0, OMAP4430_CM_CLKSEL_DPLL_IVA, OMAP4430_DPLL_BYP_CLKSEL_SHIFT,
  291. OMAP4430_DPLL_BYP_CLKSEL_WIDTH, 0x0, NULL);
  292. /* DPLL_IVA */
  293. static struct dpll_data dpll_iva_dd = {
  294. .mult_div1_reg = OMAP4430_CM_CLKSEL_DPLL_IVA,
  295. .clk_bypass = &iva_hsd_byp_clk_mux_ck,
  296. .clk_ref = &sys_clkin_ck,
  297. .control_reg = OMAP4430_CM_CLKMODE_DPLL_IVA,
  298. .modes = (1 << DPLL_LOW_POWER_BYPASS) | (1 << DPLL_LOCKED),
  299. .autoidle_reg = OMAP4430_CM_AUTOIDLE_DPLL_IVA,
  300. .idlest_reg = OMAP4430_CM_IDLEST_DPLL_IVA,
  301. .mult_mask = OMAP4430_DPLL_MULT_MASK,
  302. .div1_mask = OMAP4430_DPLL_DIV_MASK,
  303. .enable_mask = OMAP4430_DPLL_EN_MASK,
  304. .autoidle_mask = OMAP4430_AUTO_DPLL_MODE_MASK,
  305. .idlest_mask = OMAP4430_ST_DPLL_CLK_MASK,
  306. .max_multiplier = 2047,
  307. .max_divider = 128,
  308. .min_divider = 1,
  309. };
  310. static const char *dpll_iva_ck_parents[] = {
  311. "sys_clkin_ck", "iva_hsd_byp_clk_mux_ck"
  312. };
  313. static struct clk dpll_iva_ck;
  314. static const struct clk_ops dpll_ck_ops = {
  315. .enable = &omap3_noncore_dpll_enable,
  316. .disable = &omap3_noncore_dpll_disable,
  317. .recalc_rate = &omap3_dpll_recalc,
  318. .round_rate = &omap2_dpll_round_rate,
  319. .set_rate = &omap3_noncore_dpll_set_rate,
  320. .get_parent = &omap2_init_dpll_parent,
  321. };
  322. static struct clk_hw_omap dpll_iva_ck_hw = {
  323. .hw = {
  324. .clk = &dpll_iva_ck,
  325. },
  326. .dpll_data = &dpll_iva_dd,
  327. .ops = &clkhwops_omap3_dpll,
  328. };
  329. DEFINE_STRUCT_CLK(dpll_iva_ck, dpll_iva_ck_parents, dpll_ck_ops);
  330. static const char *dpll_iva_x2_ck_parents[] = {
  331. "dpll_iva_ck",
  332. };
  333. static struct clk dpll_iva_x2_ck;
  334. static struct clk_hw_omap dpll_iva_x2_ck_hw = {
  335. .hw = {
  336. .clk = &dpll_iva_x2_ck,
  337. },
  338. };
  339. DEFINE_STRUCT_CLK(dpll_iva_x2_ck, dpll_iva_x2_ck_parents, dpll_abe_x2_ck_ops);
  340. DEFINE_CLK_OMAP_HSDIVIDER(dpll_iva_m4x2_ck, "dpll_iva_x2_ck", &dpll_iva_x2_ck,
  341. 0x0, OMAP4430_CM_DIV_M4_DPLL_IVA,
  342. OMAP4430_HSDIVIDER_CLKOUT1_DIV_MASK);
  343. DEFINE_CLK_OMAP_HSDIVIDER(dpll_iva_m5x2_ck, "dpll_iva_x2_ck", &dpll_iva_x2_ck,
  344. 0x0, OMAP4430_CM_DIV_M5_DPLL_IVA,
  345. OMAP4430_HSDIVIDER_CLKOUT2_DIV_MASK);
  346. /* DPLL_MPU */
  347. static struct dpll_data dpll_mpu_dd = {
  348. .mult_div1_reg = OMAP4430_CM_CLKSEL_DPLL_MPU,
  349. .clk_bypass = &div_mpu_hs_clk,
  350. .clk_ref = &sys_clkin_ck,
  351. .control_reg = OMAP4430_CM_CLKMODE_DPLL_MPU,
  352. .modes = (1 << DPLL_LOW_POWER_BYPASS) | (1 << DPLL_LOCKED),
  353. .autoidle_reg = OMAP4430_CM_AUTOIDLE_DPLL_MPU,
  354. .idlest_reg = OMAP4430_CM_IDLEST_DPLL_MPU,
  355. .mult_mask = OMAP4430_DPLL_MULT_MASK,
  356. .div1_mask = OMAP4430_DPLL_DIV_MASK,
  357. .enable_mask = OMAP4430_DPLL_EN_MASK,
  358. .autoidle_mask = OMAP4430_AUTO_DPLL_MODE_MASK,
  359. .idlest_mask = OMAP4430_ST_DPLL_CLK_MASK,
  360. .max_multiplier = 2047,
  361. .max_divider = 128,
  362. .min_divider = 1,
  363. };
  364. static const char *dpll_mpu_ck_parents[] = {
  365. "sys_clkin_ck", "div_mpu_hs_clk"
  366. };
  367. static struct clk dpll_mpu_ck;
  368. static struct clk_hw_omap dpll_mpu_ck_hw = {
  369. .hw = {
  370. .clk = &dpll_mpu_ck,
  371. },
  372. .dpll_data = &dpll_mpu_dd,
  373. .ops = &clkhwops_omap3_dpll,
  374. };
  375. DEFINE_STRUCT_CLK(dpll_mpu_ck, dpll_mpu_ck_parents, dpll_ck_ops);
  376. DEFINE_CLK_FIXED_FACTOR(mpu_periphclk, "dpll_mpu_ck", &dpll_mpu_ck, 0x0, 1, 2);
  377. DEFINE_CLK_OMAP_HSDIVIDER(dpll_mpu_m2_ck, "dpll_mpu_ck", &dpll_mpu_ck, 0x0,
  378. OMAP4430_CM_DIV_M2_DPLL_MPU,
  379. OMAP4430_DPLL_CLKOUT_DIV_MASK);
  380. DEFINE_CLK_FIXED_FACTOR(per_hs_clk_div_ck, "dpll_abe_m3x2_ck",
  381. &dpll_abe_m3x2_ck, 0x0, 1, 2);
  382. static const char *per_hsd_byp_clk_mux_ck_parents[] = {
  383. "sys_clkin_ck", "per_hs_clk_div_ck",
  384. };
  385. DEFINE_CLK_MUX(per_hsd_byp_clk_mux_ck, per_hsd_byp_clk_mux_ck_parents, NULL,
  386. 0x0, OMAP4430_CM_CLKSEL_DPLL_PER, OMAP4430_DPLL_BYP_CLKSEL_SHIFT,
  387. OMAP4430_DPLL_BYP_CLKSEL_WIDTH, 0x0, NULL);
  388. /* DPLL_PER */
  389. static struct dpll_data dpll_per_dd = {
  390. .mult_div1_reg = OMAP4430_CM_CLKSEL_DPLL_PER,
  391. .clk_bypass = &per_hsd_byp_clk_mux_ck,
  392. .clk_ref = &sys_clkin_ck,
  393. .control_reg = OMAP4430_CM_CLKMODE_DPLL_PER,
  394. .modes = (1 << DPLL_LOW_POWER_BYPASS) | (1 << DPLL_LOCKED),
  395. .autoidle_reg = OMAP4430_CM_AUTOIDLE_DPLL_PER,
  396. .idlest_reg = OMAP4430_CM_IDLEST_DPLL_PER,
  397. .mult_mask = OMAP4430_DPLL_MULT_MASK,
  398. .div1_mask = OMAP4430_DPLL_DIV_MASK,
  399. .enable_mask = OMAP4430_DPLL_EN_MASK,
  400. .autoidle_mask = OMAP4430_AUTO_DPLL_MODE_MASK,
  401. .idlest_mask = OMAP4430_ST_DPLL_CLK_MASK,
  402. .max_multiplier = 2047,
  403. .max_divider = 128,
  404. .min_divider = 1,
  405. };
  406. static const char *dpll_per_ck_parents[] = {
  407. "sys_clkin_ck", "per_hsd_byp_clk_mux_ck"
  408. };
  409. static struct clk dpll_per_ck;
  410. static struct clk_hw_omap dpll_per_ck_hw = {
  411. .hw = {
  412. .clk = &dpll_per_ck,
  413. },
  414. .dpll_data = &dpll_per_dd,
  415. .ops = &clkhwops_omap3_dpll,
  416. };
  417. DEFINE_STRUCT_CLK(dpll_per_ck, dpll_per_ck_parents, dpll_ck_ops);
  418. DEFINE_CLK_DIVIDER(dpll_per_m2_ck, "dpll_per_ck", &dpll_per_ck, 0x0,
  419. OMAP4430_CM_DIV_M2_DPLL_PER, OMAP4430_DPLL_CLKOUT_DIV_SHIFT,
  420. OMAP4430_DPLL_CLKOUT_DIV_WIDTH, CLK_DIVIDER_ONE_BASED, NULL);
  421. static const char *dpll_per_x2_ck_parents[] = {
  422. "dpll_per_ck",
  423. };
  424. static struct clk dpll_per_x2_ck;
  425. static struct clk_hw_omap dpll_per_x2_ck_hw = {
  426. .hw = {
  427. .clk = &dpll_per_x2_ck,
  428. },
  429. .flags = CLOCK_CLKOUTX2,
  430. .clksel_reg = OMAP4430_CM_DIV_M2_DPLL_PER,
  431. .ops = &clkhwops_omap4_dpllmx,
  432. };
  433. DEFINE_STRUCT_CLK(dpll_per_x2_ck, dpll_per_x2_ck_parents, dpll_abe_x2_ck_ops);
  434. DEFINE_CLK_OMAP_HSDIVIDER(dpll_per_m2x2_ck, "dpll_per_x2_ck", &dpll_per_x2_ck,
  435. 0x0, OMAP4430_CM_DIV_M2_DPLL_PER,
  436. OMAP4430_DPLL_CLKOUT_DIV_MASK);
  437. static const char *dpll_per_m3x2_ck_parents[] = {
  438. "dpll_per_x2_ck",
  439. };
  440. static const struct clksel dpll_per_m3x2_div[] = {
  441. { .parent = &dpll_per_x2_ck, .rates = div31_1to31_rates },
  442. { .parent = NULL },
  443. };
  444. /* XXX Missing round_rate, set_rate in ops */
  445. DEFINE_CLK_OMAP_MUX_GATE(dpll_per_m3x2_ck, NULL, dpll_per_m3x2_div,
  446. OMAP4430_CM_DIV_M3_DPLL_PER,
  447. OMAP4430_DPLL_CLKOUTHIF_DIV_MASK,
  448. OMAP4430_CM_DIV_M3_DPLL_PER,
  449. OMAP4430_DPLL_CLKOUTHIF_GATE_CTRL_SHIFT, NULL,
  450. dpll_per_m3x2_ck_parents, dpll_hsd_ops);
  451. DEFINE_CLK_OMAP_HSDIVIDER(dpll_per_m4x2_ck, "dpll_per_x2_ck", &dpll_per_x2_ck,
  452. 0x0, OMAP4430_CM_DIV_M4_DPLL_PER,
  453. OMAP4430_HSDIVIDER_CLKOUT1_DIV_MASK);
  454. DEFINE_CLK_OMAP_HSDIVIDER(dpll_per_m5x2_ck, "dpll_per_x2_ck", &dpll_per_x2_ck,
  455. 0x0, OMAP4430_CM_DIV_M5_DPLL_PER,
  456. OMAP4430_HSDIVIDER_CLKOUT2_DIV_MASK);
  457. DEFINE_CLK_OMAP_HSDIVIDER(dpll_per_m6x2_ck, "dpll_per_x2_ck", &dpll_per_x2_ck,
  458. 0x0, OMAP4430_CM_DIV_M6_DPLL_PER,
  459. OMAP4430_HSDIVIDER_CLKOUT3_DIV_MASK);
  460. DEFINE_CLK_OMAP_HSDIVIDER(dpll_per_m7x2_ck, "dpll_per_x2_ck", &dpll_per_x2_ck,
  461. 0x0, OMAP4430_CM_DIV_M7_DPLL_PER,
  462. OMAP4430_HSDIVIDER_CLKOUT4_DIV_MASK);
  463. DEFINE_CLK_FIXED_FACTOR(usb_hs_clk_div_ck, "dpll_abe_m3x2_ck",
  464. &dpll_abe_m3x2_ck, 0x0, 1, 3);
  465. /* DPLL_USB */
  466. static struct dpll_data dpll_usb_dd = {
  467. .mult_div1_reg = OMAP4430_CM_CLKSEL_DPLL_USB,
  468. .clk_bypass = &usb_hs_clk_div_ck,
  469. .flags = DPLL_J_TYPE,
  470. .clk_ref = &sys_clkin_ck,
  471. .control_reg = OMAP4430_CM_CLKMODE_DPLL_USB,
  472. .modes = (1 << DPLL_LOW_POWER_BYPASS) | (1 << DPLL_LOCKED),
  473. .autoidle_reg = OMAP4430_CM_AUTOIDLE_DPLL_USB,
  474. .idlest_reg = OMAP4430_CM_IDLEST_DPLL_USB,
  475. .mult_mask = OMAP4430_DPLL_MULT_USB_MASK,
  476. .div1_mask = OMAP4430_DPLL_DIV_0_7_MASK,
  477. .enable_mask = OMAP4430_DPLL_EN_MASK,
  478. .autoidle_mask = OMAP4430_AUTO_DPLL_MODE_MASK,
  479. .idlest_mask = OMAP4430_ST_DPLL_CLK_MASK,
  480. .sddiv_mask = OMAP4430_DPLL_SD_DIV_MASK,
  481. .max_multiplier = 4095,
  482. .max_divider = 256,
  483. .min_divider = 1,
  484. };
  485. static const char *dpll_usb_ck_parents[] = {
  486. "sys_clkin_ck", "usb_hs_clk_div_ck"
  487. };
  488. static struct clk dpll_usb_ck;
  489. static const struct clk_ops dpll_usb_ck_ops = {
  490. .enable = &omap3_noncore_dpll_enable,
  491. .disable = &omap3_noncore_dpll_disable,
  492. .recalc_rate = &omap3_dpll_recalc,
  493. .round_rate = &omap2_dpll_round_rate,
  494. .set_rate = &omap3_noncore_dpll_set_rate,
  495. .get_parent = &omap2_init_dpll_parent,
  496. .init = &omap2_init_clk_clkdm,
  497. };
  498. static struct clk_hw_omap dpll_usb_ck_hw = {
  499. .hw = {
  500. .clk = &dpll_usb_ck,
  501. },
  502. .dpll_data = &dpll_usb_dd,
  503. .clkdm_name = "l3_init_clkdm",
  504. .ops = &clkhwops_omap3_dpll,
  505. };
  506. DEFINE_STRUCT_CLK(dpll_usb_ck, dpll_usb_ck_parents, dpll_usb_ck_ops);
  507. static const char *dpll_usb_clkdcoldo_ck_parents[] = {
  508. "dpll_usb_ck",
  509. };
  510. static struct clk dpll_usb_clkdcoldo_ck;
  511. static const struct clk_ops dpll_usb_clkdcoldo_ck_ops = {
  512. };
  513. static struct clk_hw_omap dpll_usb_clkdcoldo_ck_hw = {
  514. .hw = {
  515. .clk = &dpll_usb_clkdcoldo_ck,
  516. },
  517. .clksel_reg = OMAP4430_CM_CLKDCOLDO_DPLL_USB,
  518. .ops = &clkhwops_omap4_dpllmx,
  519. };
  520. DEFINE_STRUCT_CLK(dpll_usb_clkdcoldo_ck, dpll_usb_clkdcoldo_ck_parents,
  521. dpll_usb_clkdcoldo_ck_ops);
  522. DEFINE_CLK_OMAP_HSDIVIDER(dpll_usb_m2_ck, "dpll_usb_ck", &dpll_usb_ck, 0x0,
  523. OMAP4430_CM_DIV_M2_DPLL_USB,
  524. OMAP4430_DPLL_CLKOUT_DIV_0_6_MASK);
  525. static const char *ducati_clk_mux_ck_parents[] = {
  526. "div_core_ck", "dpll_per_m6x2_ck",
  527. };
  528. DEFINE_CLK_MUX(ducati_clk_mux_ck, ducati_clk_mux_ck_parents, NULL, 0x0,
  529. OMAP4430_CM_CLKSEL_DUCATI_ISS_ROOT, OMAP4430_CLKSEL_0_0_SHIFT,
  530. OMAP4430_CLKSEL_0_0_WIDTH, 0x0, NULL);
  531. DEFINE_CLK_FIXED_FACTOR(func_12m_fclk, "dpll_per_m2x2_ck", &dpll_per_m2x2_ck,
  532. 0x0, 1, 16);
  533. DEFINE_CLK_FIXED_FACTOR(func_24m_clk, "dpll_per_m2_ck", &dpll_per_m2_ck, 0x0,
  534. 1, 4);
  535. DEFINE_CLK_FIXED_FACTOR(func_24mc_fclk, "dpll_per_m2x2_ck", &dpll_per_m2x2_ck,
  536. 0x0, 1, 8);
  537. static const struct clk_div_table func_48m_fclk_rates[] = {
  538. { .div = 4, .val = 0 },
  539. { .div = 8, .val = 1 },
  540. { .div = 0 },
  541. };
  542. DEFINE_CLK_DIVIDER_TABLE(func_48m_fclk, "dpll_per_m2x2_ck", &dpll_per_m2x2_ck,
  543. 0x0, OMAP4430_CM_SCALE_FCLK, OMAP4430_SCALE_FCLK_SHIFT,
  544. OMAP4430_SCALE_FCLK_WIDTH, 0x0, func_48m_fclk_rates,
  545. NULL);
  546. DEFINE_CLK_FIXED_FACTOR(func_48mc_fclk, "dpll_per_m2x2_ck", &dpll_per_m2x2_ck,
  547. 0x0, 1, 4);
  548. static const struct clk_div_table func_64m_fclk_rates[] = {
  549. { .div = 2, .val = 0 },
  550. { .div = 4, .val = 1 },
  551. { .div = 0 },
  552. };
  553. DEFINE_CLK_DIVIDER_TABLE(func_64m_fclk, "dpll_per_m4x2_ck", &dpll_per_m4x2_ck,
  554. 0x0, OMAP4430_CM_SCALE_FCLK, OMAP4430_SCALE_FCLK_SHIFT,
  555. OMAP4430_SCALE_FCLK_WIDTH, 0x0, func_64m_fclk_rates,
  556. NULL);
  557. static const struct clk_div_table func_96m_fclk_rates[] = {
  558. { .div = 2, .val = 0 },
  559. { .div = 4, .val = 1 },
  560. { .div = 0 },
  561. };
  562. DEFINE_CLK_DIVIDER_TABLE(func_96m_fclk, "dpll_per_m2x2_ck", &dpll_per_m2x2_ck,
  563. 0x0, OMAP4430_CM_SCALE_FCLK, OMAP4430_SCALE_FCLK_SHIFT,
  564. OMAP4430_SCALE_FCLK_WIDTH, 0x0, func_96m_fclk_rates,
  565. NULL);
  566. static const struct clk_div_table init_60m_fclk_rates[] = {
  567. { .div = 1, .val = 0 },
  568. { .div = 8, .val = 1 },
  569. { .div = 0 },
  570. };
  571. DEFINE_CLK_DIVIDER_TABLE(init_60m_fclk, "dpll_usb_m2_ck", &dpll_usb_m2_ck,
  572. 0x0, OMAP4430_CM_CLKSEL_USB_60MHZ,
  573. OMAP4430_CLKSEL_0_0_SHIFT, OMAP4430_CLKSEL_0_0_WIDTH,
  574. 0x0, init_60m_fclk_rates, NULL);
  575. DEFINE_CLK_DIVIDER(l3_div_ck, "div_core_ck", &div_core_ck, 0x0,
  576. OMAP4430_CM_CLKSEL_CORE, OMAP4430_CLKSEL_L3_SHIFT,
  577. OMAP4430_CLKSEL_L3_WIDTH, 0x0, NULL);
  578. DEFINE_CLK_DIVIDER(l4_div_ck, "l3_div_ck", &l3_div_ck, 0x0,
  579. OMAP4430_CM_CLKSEL_CORE, OMAP4430_CLKSEL_L4_SHIFT,
  580. OMAP4430_CLKSEL_L4_WIDTH, 0x0, NULL);
  581. DEFINE_CLK_FIXED_FACTOR(lp_clk_div_ck, "dpll_abe_m2x2_ck", &dpll_abe_m2x2_ck,
  582. 0x0, 1, 16);
  583. static const char *l4_wkup_clk_mux_ck_parents[] = {
  584. "sys_clkin_ck", "lp_clk_div_ck",
  585. };
  586. DEFINE_CLK_MUX(l4_wkup_clk_mux_ck, l4_wkup_clk_mux_ck_parents, NULL, 0x0,
  587. OMAP4430_CM_L4_WKUP_CLKSEL, OMAP4430_CLKSEL_0_0_SHIFT,
  588. OMAP4430_CLKSEL_0_0_WIDTH, 0x0, NULL);
  589. static const struct clk_div_table ocp_abe_iclk_rates[] = {
  590. { .div = 2, .val = 0 },
  591. { .div = 1, .val = 1 },
  592. { .div = 0 },
  593. };
  594. DEFINE_CLK_DIVIDER_TABLE(ocp_abe_iclk, "aess_fclk", &aess_fclk, 0x0,
  595. OMAP4430_CM1_ABE_AESS_CLKCTRL,
  596. OMAP4430_CLKSEL_AESS_FCLK_SHIFT,
  597. OMAP4430_CLKSEL_AESS_FCLK_WIDTH,
  598. 0x0, ocp_abe_iclk_rates, NULL);
  599. DEFINE_CLK_FIXED_FACTOR(per_abe_24m_fclk, "dpll_abe_m2_ck", &dpll_abe_m2_ck,
  600. 0x0, 1, 4);
  601. DEFINE_CLK_DIVIDER(per_abe_nc_fclk, "dpll_abe_m2_ck", &dpll_abe_m2_ck, 0x0,
  602. OMAP4430_CM_SCALE_FCLK, OMAP4430_SCALE_FCLK_SHIFT,
  603. OMAP4430_SCALE_FCLK_WIDTH, 0x0, NULL);
  604. DEFINE_CLK_DIVIDER(syc_clk_div_ck, "sys_clkin_ck", &sys_clkin_ck, 0x0,
  605. OMAP4430_CM_ABE_DSS_SYS_CLKSEL, OMAP4430_CLKSEL_0_0_SHIFT,
  606. OMAP4430_CLKSEL_0_0_WIDTH, 0x0, NULL);
  607. static const char *dbgclk_mux_ck_parents[] = {
  608. "sys_clkin_ck"
  609. };
  610. static struct clk dbgclk_mux_ck;
  611. DEFINE_STRUCT_CLK_HW_OMAP(dbgclk_mux_ck, NULL);
  612. DEFINE_STRUCT_CLK(dbgclk_mux_ck, dbgclk_mux_ck_parents,
  613. dpll_usb_clkdcoldo_ck_ops);
  614. /* Leaf clocks controlled by modules */
  615. DEFINE_CLK_GATE(aes1_fck, "l3_div_ck", &l3_div_ck, 0x0,
  616. OMAP4430_CM_L4SEC_AES1_CLKCTRL,
  617. OMAP4430_MODULEMODE_SWCTRL_SHIFT, 0x0, NULL);
  618. DEFINE_CLK_GATE(aes2_fck, "l3_div_ck", &l3_div_ck, 0x0,
  619. OMAP4430_CM_L4SEC_AES2_CLKCTRL,
  620. OMAP4430_MODULEMODE_SWCTRL_SHIFT, 0x0, NULL);
  621. DEFINE_CLK_GATE(bandgap_fclk, "sys_32k_ck", &sys_32k_ck, 0x0,
  622. OMAP4430_CM_WKUP_BANDGAP_CLKCTRL,
  623. OMAP4430_OPTFCLKEN_BGAP_32K_SHIFT, 0x0, NULL);
  624. static const struct clk_div_table div_ts_ck_rates[] = {
  625. { .div = 8, .val = 0 },
  626. { .div = 16, .val = 1 },
  627. { .div = 32, .val = 2 },
  628. { .div = 0 },
  629. };
  630. DEFINE_CLK_DIVIDER_TABLE(div_ts_ck, "l4_wkup_clk_mux_ck", &l4_wkup_clk_mux_ck,
  631. 0x0, OMAP4430_CM_WKUP_BANDGAP_CLKCTRL,
  632. OMAP4430_CLKSEL_24_25_SHIFT,
  633. OMAP4430_CLKSEL_24_25_WIDTH, 0x0, div_ts_ck_rates,
  634. NULL);
  635. DEFINE_CLK_GATE(bandgap_ts_fclk, "div_ts_ck", &div_ts_ck, 0x0,
  636. OMAP4430_CM_WKUP_BANDGAP_CLKCTRL,
  637. OMAP4460_OPTFCLKEN_TS_FCLK_SHIFT,
  638. 0x0, NULL);
  639. static const char *dmic_sync_mux_ck_parents[] = {
  640. "abe_24m_fclk", "syc_clk_div_ck", "func_24m_clk",
  641. };
  642. DEFINE_CLK_MUX(dmic_sync_mux_ck, dmic_sync_mux_ck_parents, NULL,
  643. 0x0, OMAP4430_CM1_ABE_DMIC_CLKCTRL,
  644. OMAP4430_CLKSEL_INTERNAL_SOURCE_SHIFT,
  645. OMAP4430_CLKSEL_INTERNAL_SOURCE_WIDTH, 0x0, NULL);
  646. static const struct clksel func_dmic_abe_gfclk_sel[] = {
  647. { .parent = &dmic_sync_mux_ck, .rates = div_1_0_rates },
  648. { .parent = &pad_clks_ck, .rates = div_1_1_rates },
  649. { .parent = &slimbus_clk, .rates = div_1_2_rates },
  650. { .parent = NULL },
  651. };
  652. static const char *func_dmic_abe_gfclk_parents[] = {
  653. "dmic_sync_mux_ck", "pad_clks_ck", "slimbus_clk",
  654. };
  655. DEFINE_CLK_OMAP_MUX(func_dmic_abe_gfclk, "abe_clkdm", func_dmic_abe_gfclk_sel,
  656. OMAP4430_CM1_ABE_DMIC_CLKCTRL, OMAP4430_CLKSEL_SOURCE_MASK,
  657. func_dmic_abe_gfclk_parents, func_dmic_abe_gfclk_ops);
  658. DEFINE_CLK_GATE(dss_sys_clk, "syc_clk_div_ck", &syc_clk_div_ck, 0x0,
  659. OMAP4430_CM_DSS_DSS_CLKCTRL,
  660. OMAP4430_OPTFCLKEN_SYS_CLK_SHIFT, 0x0, NULL);
  661. DEFINE_CLK_GATE(dss_tv_clk, "extalt_clkin_ck", &extalt_clkin_ck, 0x0,
  662. OMAP4430_CM_DSS_DSS_CLKCTRL,
  663. OMAP4430_OPTFCLKEN_TV_CLK_SHIFT, 0x0, NULL);
  664. DEFINE_CLK_GATE(dss_dss_clk, "dpll_per_m5x2_ck", &dpll_per_m5x2_ck, 0x0,
  665. OMAP4430_CM_DSS_DSS_CLKCTRL, OMAP4430_OPTFCLKEN_DSSCLK_SHIFT,
  666. 0x0, NULL);
  667. DEFINE_CLK_GATE(dss_48mhz_clk, "func_48mc_fclk", &func_48mc_fclk, 0x0,
  668. OMAP4430_CM_DSS_DSS_CLKCTRL, OMAP4430_OPTFCLKEN_48MHZ_CLK_SHIFT,
  669. 0x0, NULL);
  670. DEFINE_CLK_GATE(dss_fck, "l3_div_ck", &l3_div_ck, 0x0,
  671. OMAP4430_CM_DSS_DSS_CLKCTRL, OMAP4430_MODULEMODE_SWCTRL_SHIFT,
  672. 0x0, NULL);
  673. DEFINE_CLK_DIVIDER(fdif_fck, "dpll_per_m4x2_ck", &dpll_per_m4x2_ck, 0x0,
  674. OMAP4430_CM_CAM_FDIF_CLKCTRL, OMAP4430_CLKSEL_FCLK_SHIFT,
  675. OMAP4430_CLKSEL_FCLK_WIDTH, CLK_DIVIDER_POWER_OF_TWO, NULL);
  676. DEFINE_CLK_GATE(gpio1_dbclk, "sys_32k_ck", &sys_32k_ck, 0x0,
  677. OMAP4430_CM_WKUP_GPIO1_CLKCTRL,
  678. OMAP4430_OPTFCLKEN_DBCLK_SHIFT, 0x0, NULL);
  679. DEFINE_CLK_GATE(gpio2_dbclk, "sys_32k_ck", &sys_32k_ck, 0x0,
  680. OMAP4430_CM_L4PER_GPIO2_CLKCTRL, OMAP4430_OPTFCLKEN_DBCLK_SHIFT,
  681. 0x0, NULL);
  682. DEFINE_CLK_GATE(gpio3_dbclk, "sys_32k_ck", &sys_32k_ck, 0x0,
  683. OMAP4430_CM_L4PER_GPIO3_CLKCTRL,
  684. OMAP4430_OPTFCLKEN_DBCLK_SHIFT, 0x0, NULL);
  685. DEFINE_CLK_GATE(gpio4_dbclk, "sys_32k_ck", &sys_32k_ck, 0x0,
  686. OMAP4430_CM_L4PER_GPIO4_CLKCTRL, OMAP4430_OPTFCLKEN_DBCLK_SHIFT,
  687. 0x0, NULL);
  688. DEFINE_CLK_GATE(gpio5_dbclk, "sys_32k_ck", &sys_32k_ck, 0x0,
  689. OMAP4430_CM_L4PER_GPIO5_CLKCTRL, OMAP4430_OPTFCLKEN_DBCLK_SHIFT,
  690. 0x0, NULL);
  691. DEFINE_CLK_GATE(gpio6_dbclk, "sys_32k_ck", &sys_32k_ck, 0x0,
  692. OMAP4430_CM_L4PER_GPIO6_CLKCTRL, OMAP4430_OPTFCLKEN_DBCLK_SHIFT,
  693. 0x0, NULL);
  694. static const struct clksel sgx_clk_mux_sel[] = {
  695. { .parent = &dpll_core_m7x2_ck, .rates = div_1_0_rates },
  696. { .parent = &dpll_per_m7x2_ck, .rates = div_1_1_rates },
  697. { .parent = NULL },
  698. };
  699. static const char *sgx_clk_mux_parents[] = {
  700. "dpll_core_m7x2_ck", "dpll_per_m7x2_ck",
  701. };
  702. DEFINE_CLK_OMAP_MUX(sgx_clk_mux, "l3_gfx_clkdm", sgx_clk_mux_sel,
  703. OMAP4430_CM_GFX_GFX_CLKCTRL, OMAP4430_CLKSEL_SGX_FCLK_MASK,
  704. sgx_clk_mux_parents, func_dmic_abe_gfclk_ops);
  705. DEFINE_CLK_DIVIDER(hsi_fck, "dpll_per_m2x2_ck", &dpll_per_m2x2_ck, 0x0,
  706. OMAP4430_CM_L3INIT_HSI_CLKCTRL, OMAP4430_CLKSEL_24_25_SHIFT,
  707. OMAP4430_CLKSEL_24_25_WIDTH, CLK_DIVIDER_POWER_OF_TWO,
  708. NULL);
  709. DEFINE_CLK_GATE(iss_ctrlclk, "func_96m_fclk", &func_96m_fclk, 0x0,
  710. OMAP4430_CM_CAM_ISS_CLKCTRL, OMAP4430_OPTFCLKEN_CTRLCLK_SHIFT,
  711. 0x0, NULL);
  712. DEFINE_CLK_MUX(mcasp_sync_mux_ck, dmic_sync_mux_ck_parents, NULL, 0x0,
  713. OMAP4430_CM1_ABE_MCASP_CLKCTRL,
  714. OMAP4430_CLKSEL_INTERNAL_SOURCE_SHIFT,
  715. OMAP4430_CLKSEL_INTERNAL_SOURCE_WIDTH, 0x0, NULL);
  716. static const struct clksel func_mcasp_abe_gfclk_sel[] = {
  717. { .parent = &mcasp_sync_mux_ck, .rates = div_1_0_rates },
  718. { .parent = &pad_clks_ck, .rates = div_1_1_rates },
  719. { .parent = &slimbus_clk, .rates = div_1_2_rates },
  720. { .parent = NULL },
  721. };
  722. static const char *func_mcasp_abe_gfclk_parents[] = {
  723. "mcasp_sync_mux_ck", "pad_clks_ck", "slimbus_clk",
  724. };
  725. DEFINE_CLK_OMAP_MUX(func_mcasp_abe_gfclk, "abe_clkdm", func_mcasp_abe_gfclk_sel,
  726. OMAP4430_CM1_ABE_MCASP_CLKCTRL, OMAP4430_CLKSEL_SOURCE_MASK,
  727. func_mcasp_abe_gfclk_parents, func_dmic_abe_gfclk_ops);
  728. DEFINE_CLK_MUX(mcbsp1_sync_mux_ck, dmic_sync_mux_ck_parents, NULL, 0x0,
  729. OMAP4430_CM1_ABE_MCBSP1_CLKCTRL,
  730. OMAP4430_CLKSEL_INTERNAL_SOURCE_SHIFT,
  731. OMAP4430_CLKSEL_INTERNAL_SOURCE_WIDTH, 0x0, NULL);
  732. static const struct clksel func_mcbsp1_gfclk_sel[] = {
  733. { .parent = &mcbsp1_sync_mux_ck, .rates = div_1_0_rates },
  734. { .parent = &pad_clks_ck, .rates = div_1_1_rates },
  735. { .parent = &slimbus_clk, .rates = div_1_2_rates },
  736. { .parent = NULL },
  737. };
  738. static const char *func_mcbsp1_gfclk_parents[] = {
  739. "mcbsp1_sync_mux_ck", "pad_clks_ck", "slimbus_clk",
  740. };
  741. DEFINE_CLK_OMAP_MUX(func_mcbsp1_gfclk, "abe_clkdm", func_mcbsp1_gfclk_sel,
  742. OMAP4430_CM1_ABE_MCBSP1_CLKCTRL,
  743. OMAP4430_CLKSEL_SOURCE_MASK, func_mcbsp1_gfclk_parents,
  744. func_dmic_abe_gfclk_ops);
  745. DEFINE_CLK_MUX(mcbsp2_sync_mux_ck, dmic_sync_mux_ck_parents, NULL, 0x0,
  746. OMAP4430_CM1_ABE_MCBSP2_CLKCTRL,
  747. OMAP4430_CLKSEL_INTERNAL_SOURCE_SHIFT,
  748. OMAP4430_CLKSEL_INTERNAL_SOURCE_WIDTH, 0x0, NULL);
  749. static const struct clksel func_mcbsp2_gfclk_sel[] = {
  750. { .parent = &mcbsp2_sync_mux_ck, .rates = div_1_0_rates },
  751. { .parent = &pad_clks_ck, .rates = div_1_1_rates },
  752. { .parent = &slimbus_clk, .rates = div_1_2_rates },
  753. { .parent = NULL },
  754. };
  755. static const char *func_mcbsp2_gfclk_parents[] = {
  756. "mcbsp2_sync_mux_ck", "pad_clks_ck", "slimbus_clk",
  757. };
  758. DEFINE_CLK_OMAP_MUX(func_mcbsp2_gfclk, "abe_clkdm", func_mcbsp2_gfclk_sel,
  759. OMAP4430_CM1_ABE_MCBSP2_CLKCTRL,
  760. OMAP4430_CLKSEL_SOURCE_MASK, func_mcbsp2_gfclk_parents,
  761. func_dmic_abe_gfclk_ops);
  762. DEFINE_CLK_MUX(mcbsp3_sync_mux_ck, dmic_sync_mux_ck_parents, NULL, 0x0,
  763. OMAP4430_CM1_ABE_MCBSP3_CLKCTRL,
  764. OMAP4430_CLKSEL_INTERNAL_SOURCE_SHIFT,
  765. OMAP4430_CLKSEL_INTERNAL_SOURCE_WIDTH, 0x0, NULL);
  766. static const struct clksel func_mcbsp3_gfclk_sel[] = {
  767. { .parent = &mcbsp3_sync_mux_ck, .rates = div_1_0_rates },
  768. { .parent = &pad_clks_ck, .rates = div_1_1_rates },
  769. { .parent = &slimbus_clk, .rates = div_1_2_rates },
  770. { .parent = NULL },
  771. };
  772. static const char *func_mcbsp3_gfclk_parents[] = {
  773. "mcbsp3_sync_mux_ck", "pad_clks_ck", "slimbus_clk",
  774. };
  775. DEFINE_CLK_OMAP_MUX(func_mcbsp3_gfclk, "abe_clkdm", func_mcbsp3_gfclk_sel,
  776. OMAP4430_CM1_ABE_MCBSP3_CLKCTRL,
  777. OMAP4430_CLKSEL_SOURCE_MASK, func_mcbsp3_gfclk_parents,
  778. func_dmic_abe_gfclk_ops);
  779. static const char *mcbsp4_sync_mux_ck_parents[] = {
  780. "func_96m_fclk", "per_abe_nc_fclk",
  781. };
  782. DEFINE_CLK_MUX(mcbsp4_sync_mux_ck, mcbsp4_sync_mux_ck_parents, NULL, 0x0,
  783. OMAP4430_CM_L4PER_MCBSP4_CLKCTRL,
  784. OMAP4430_CLKSEL_INTERNAL_SOURCE_SHIFT,
  785. OMAP4430_CLKSEL_INTERNAL_SOURCE_WIDTH, 0x0, NULL);
  786. static const struct clksel per_mcbsp4_gfclk_sel[] = {
  787. { .parent = &mcbsp4_sync_mux_ck, .rates = div_1_0_rates },
  788. { .parent = &pad_clks_ck, .rates = div_1_1_rates },
  789. { .parent = NULL },
  790. };
  791. static const char *per_mcbsp4_gfclk_parents[] = {
  792. "mcbsp4_sync_mux_ck", "pad_clks_ck",
  793. };
  794. DEFINE_CLK_OMAP_MUX(per_mcbsp4_gfclk, "l4_per_clkdm", per_mcbsp4_gfclk_sel,
  795. OMAP4430_CM_L4PER_MCBSP4_CLKCTRL,
  796. OMAP4430_CLKSEL_SOURCE_24_24_MASK, per_mcbsp4_gfclk_parents,
  797. func_dmic_abe_gfclk_ops);
  798. static const struct clksel hsmmc1_fclk_sel[] = {
  799. { .parent = &func_64m_fclk, .rates = div_1_0_rates },
  800. { .parent = &func_96m_fclk, .rates = div_1_1_rates },
  801. { .parent = NULL },
  802. };
  803. static const char *hsmmc1_fclk_parents[] = {
  804. "func_64m_fclk", "func_96m_fclk",
  805. };
  806. DEFINE_CLK_OMAP_MUX(hsmmc1_fclk, "l3_init_clkdm", hsmmc1_fclk_sel,
  807. OMAP4430_CM_L3INIT_MMC1_CLKCTRL, OMAP4430_CLKSEL_MASK,
  808. hsmmc1_fclk_parents, func_dmic_abe_gfclk_ops);
  809. DEFINE_CLK_OMAP_MUX(hsmmc2_fclk, "l3_init_clkdm", hsmmc1_fclk_sel,
  810. OMAP4430_CM_L3INIT_MMC2_CLKCTRL, OMAP4430_CLKSEL_MASK,
  811. hsmmc1_fclk_parents, func_dmic_abe_gfclk_ops);
  812. DEFINE_CLK_GATE(ocp2scp_usb_phy_phy_48m, "func_48m_fclk", &func_48m_fclk, 0x0,
  813. OMAP4430_CM_L3INIT_USBPHYOCP2SCP_CLKCTRL,
  814. OMAP4430_OPTFCLKEN_PHY_48M_SHIFT, 0x0, NULL);
  815. DEFINE_CLK_GATE(sha2md5_fck, "l3_div_ck", &l3_div_ck, 0x0,
  816. OMAP4430_CM_L4SEC_SHA2MD51_CLKCTRL,
  817. OMAP4430_MODULEMODE_SWCTRL_SHIFT, 0x0, NULL);
  818. DEFINE_CLK_GATE(slimbus1_fclk_1, "func_24m_clk", &func_24m_clk, 0x0,
  819. OMAP4430_CM1_ABE_SLIMBUS_CLKCTRL,
  820. OMAP4430_OPTFCLKEN_FCLK1_SHIFT, 0x0, NULL);
  821. DEFINE_CLK_GATE(slimbus1_fclk_0, "abe_24m_fclk", &abe_24m_fclk, 0x0,
  822. OMAP4430_CM1_ABE_SLIMBUS_CLKCTRL,
  823. OMAP4430_OPTFCLKEN_FCLK0_SHIFT, 0x0, NULL);
  824. DEFINE_CLK_GATE(slimbus1_fclk_2, "pad_clks_ck", &pad_clks_ck, 0x0,
  825. OMAP4430_CM1_ABE_SLIMBUS_CLKCTRL,
  826. OMAP4430_OPTFCLKEN_FCLK2_SHIFT, 0x0, NULL);
  827. DEFINE_CLK_GATE(slimbus1_slimbus_clk, "slimbus_clk", &slimbus_clk, 0x0,
  828. OMAP4430_CM1_ABE_SLIMBUS_CLKCTRL,
  829. OMAP4430_OPTFCLKEN_SLIMBUS_CLK_11_11_SHIFT, 0x0, NULL);
  830. DEFINE_CLK_GATE(slimbus2_fclk_1, "per_abe_24m_fclk", &per_abe_24m_fclk, 0x0,
  831. OMAP4430_CM_L4PER_SLIMBUS2_CLKCTRL,
  832. OMAP4430_OPTFCLKEN_PERABE24M_GFCLK_SHIFT, 0x0, NULL);
  833. DEFINE_CLK_GATE(slimbus2_fclk_0, "func_24mc_fclk", &func_24mc_fclk, 0x0,
  834. OMAP4430_CM_L4PER_SLIMBUS2_CLKCTRL,
  835. OMAP4430_OPTFCLKEN_PER24MC_GFCLK_SHIFT, 0x0, NULL);
  836. DEFINE_CLK_GATE(slimbus2_slimbus_clk, "pad_slimbus_core_clks_ck",
  837. &pad_slimbus_core_clks_ck, 0x0,
  838. OMAP4430_CM_L4PER_SLIMBUS2_CLKCTRL,
  839. OMAP4430_OPTFCLKEN_SLIMBUS_CLK_SHIFT, 0x0, NULL);
  840. DEFINE_CLK_GATE(smartreflex_core_fck, "l4_wkup_clk_mux_ck", &l4_wkup_clk_mux_ck,
  841. 0x0, OMAP4430_CM_ALWON_SR_CORE_CLKCTRL,
  842. OMAP4430_MODULEMODE_SWCTRL_SHIFT, 0x0, NULL);
  843. DEFINE_CLK_GATE(smartreflex_iva_fck, "l4_wkup_clk_mux_ck", &l4_wkup_clk_mux_ck,
  844. 0x0, OMAP4430_CM_ALWON_SR_IVA_CLKCTRL,
  845. OMAP4430_MODULEMODE_SWCTRL_SHIFT, 0x0, NULL);
  846. DEFINE_CLK_GATE(smartreflex_mpu_fck, "l4_wkup_clk_mux_ck", &l4_wkup_clk_mux_ck,
  847. 0x0, OMAP4430_CM_ALWON_SR_MPU_CLKCTRL,
  848. OMAP4430_MODULEMODE_SWCTRL_SHIFT, 0x0, NULL);
  849. static const struct clksel dmt1_clk_mux_sel[] = {
  850. { .parent = &sys_clkin_ck, .rates = div_1_0_rates },
  851. { .parent = &sys_32k_ck, .rates = div_1_1_rates },
  852. { .parent = NULL },
  853. };
  854. DEFINE_CLK_OMAP_MUX(dmt1_clk_mux, "l4_wkup_clkdm", dmt1_clk_mux_sel,
  855. OMAP4430_CM_WKUP_TIMER1_CLKCTRL, OMAP4430_CLKSEL_MASK,
  856. abe_dpll_bypass_clk_mux_ck_parents,
  857. func_dmic_abe_gfclk_ops);
  858. DEFINE_CLK_OMAP_MUX(cm2_dm10_mux, "l4_per_clkdm", dmt1_clk_mux_sel,
  859. OMAP4430_CM_L4PER_DMTIMER10_CLKCTRL, OMAP4430_CLKSEL_MASK,
  860. abe_dpll_bypass_clk_mux_ck_parents,
  861. func_dmic_abe_gfclk_ops);
  862. DEFINE_CLK_OMAP_MUX(cm2_dm11_mux, "l4_per_clkdm", dmt1_clk_mux_sel,
  863. OMAP4430_CM_L4PER_DMTIMER11_CLKCTRL, OMAP4430_CLKSEL_MASK,
  864. abe_dpll_bypass_clk_mux_ck_parents,
  865. func_dmic_abe_gfclk_ops);
  866. DEFINE_CLK_OMAP_MUX(cm2_dm2_mux, "l4_per_clkdm", dmt1_clk_mux_sel,
  867. OMAP4430_CM_L4PER_DMTIMER2_CLKCTRL, OMAP4430_CLKSEL_MASK,
  868. abe_dpll_bypass_clk_mux_ck_parents,
  869. func_dmic_abe_gfclk_ops);
  870. DEFINE_CLK_OMAP_MUX(cm2_dm3_mux, "l4_per_clkdm", dmt1_clk_mux_sel,
  871. OMAP4430_CM_L4PER_DMTIMER3_CLKCTRL, OMAP4430_CLKSEL_MASK,
  872. abe_dpll_bypass_clk_mux_ck_parents,
  873. func_dmic_abe_gfclk_ops);
  874. DEFINE_CLK_OMAP_MUX(cm2_dm4_mux, "l4_per_clkdm", dmt1_clk_mux_sel,
  875. OMAP4430_CM_L4PER_DMTIMER4_CLKCTRL, OMAP4430_CLKSEL_MASK,
  876. abe_dpll_bypass_clk_mux_ck_parents,
  877. func_dmic_abe_gfclk_ops);
  878. static const struct clksel timer5_sync_mux_sel[] = {
  879. { .parent = &syc_clk_div_ck, .rates = div_1_0_rates },
  880. { .parent = &sys_32k_ck, .rates = div_1_1_rates },
  881. { .parent = NULL },
  882. };
  883. static const char *timer5_sync_mux_parents[] = {
  884. "syc_clk_div_ck", "sys_32k_ck",
  885. };
  886. DEFINE_CLK_OMAP_MUX(timer5_sync_mux, "abe_clkdm", timer5_sync_mux_sel,
  887. OMAP4430_CM1_ABE_TIMER5_CLKCTRL, OMAP4430_CLKSEL_MASK,
  888. timer5_sync_mux_parents, func_dmic_abe_gfclk_ops);
  889. DEFINE_CLK_OMAP_MUX(timer6_sync_mux, "abe_clkdm", timer5_sync_mux_sel,
  890. OMAP4430_CM1_ABE_TIMER6_CLKCTRL, OMAP4430_CLKSEL_MASK,
  891. timer5_sync_mux_parents, func_dmic_abe_gfclk_ops);
  892. DEFINE_CLK_OMAP_MUX(timer7_sync_mux, "abe_clkdm", timer5_sync_mux_sel,
  893. OMAP4430_CM1_ABE_TIMER7_CLKCTRL, OMAP4430_CLKSEL_MASK,
  894. timer5_sync_mux_parents, func_dmic_abe_gfclk_ops);
  895. DEFINE_CLK_OMAP_MUX(timer8_sync_mux, "abe_clkdm", timer5_sync_mux_sel,
  896. OMAP4430_CM1_ABE_TIMER8_CLKCTRL, OMAP4430_CLKSEL_MASK,
  897. timer5_sync_mux_parents, func_dmic_abe_gfclk_ops);
  898. DEFINE_CLK_OMAP_MUX(cm2_dm9_mux, "l4_per_clkdm", dmt1_clk_mux_sel,
  899. OMAP4430_CM_L4PER_DMTIMER9_CLKCTRL, OMAP4430_CLKSEL_MASK,
  900. abe_dpll_bypass_clk_mux_ck_parents,
  901. func_dmic_abe_gfclk_ops);
  902. static struct clk usb_host_fs_fck;
  903. static const char *usb_host_fs_fck_parent_names[] = {
  904. "func_48mc_fclk",
  905. };
  906. static const struct clk_ops usb_host_fs_fck_ops = {
  907. .enable = &omap2_dflt_clk_enable,
  908. .disable = &omap2_dflt_clk_disable,
  909. .is_enabled = &omap2_dflt_clk_is_enabled,
  910. };
  911. static struct clk_hw_omap usb_host_fs_fck_hw = {
  912. .hw = {
  913. .clk = &usb_host_fs_fck,
  914. },
  915. .enable_reg = OMAP4430_CM_L3INIT_USB_HOST_FS_CLKCTRL,
  916. .enable_bit = OMAP4430_MODULEMODE_SWCTRL_SHIFT,
  917. .clkdm_name = "l3_init_clkdm",
  918. };
  919. DEFINE_STRUCT_CLK(usb_host_fs_fck, usb_host_fs_fck_parent_names,
  920. usb_host_fs_fck_ops);
  921. static const char *utmi_p1_gfclk_parents[] = {
  922. "init_60m_fclk", "xclk60mhsp1_ck",
  923. };
  924. DEFINE_CLK_MUX(utmi_p1_gfclk, utmi_p1_gfclk_parents, NULL, 0x0,
  925. OMAP4430_CM_L3INIT_USB_HOST_CLKCTRL,
  926. OMAP4430_CLKSEL_UTMI_P1_SHIFT, OMAP4430_CLKSEL_UTMI_P1_WIDTH,
  927. 0x0, NULL);
  928. DEFINE_CLK_GATE(usb_host_hs_utmi_p1_clk, "utmi_p1_gfclk", &utmi_p1_gfclk, 0x0,
  929. OMAP4430_CM_L3INIT_USB_HOST_CLKCTRL,
  930. OMAP4430_OPTFCLKEN_UTMI_P1_CLK_SHIFT, 0x0, NULL);
  931. static const char *utmi_p2_gfclk_parents[] = {
  932. "init_60m_fclk", "xclk60mhsp2_ck",
  933. };
  934. DEFINE_CLK_MUX(utmi_p2_gfclk, utmi_p2_gfclk_parents, NULL, 0x0,
  935. OMAP4430_CM_L3INIT_USB_HOST_CLKCTRL,
  936. OMAP4430_CLKSEL_UTMI_P2_SHIFT, OMAP4430_CLKSEL_UTMI_P2_WIDTH,
  937. 0x0, NULL);
  938. DEFINE_CLK_GATE(usb_host_hs_utmi_p2_clk, "utmi_p2_gfclk", &utmi_p2_gfclk, 0x0,
  939. OMAP4430_CM_L3INIT_USB_HOST_CLKCTRL,
  940. OMAP4430_OPTFCLKEN_UTMI_P2_CLK_SHIFT, 0x0, NULL);
  941. DEFINE_CLK_GATE(usb_host_hs_utmi_p3_clk, "init_60m_fclk", &init_60m_fclk, 0x0,
  942. OMAP4430_CM_L3INIT_USB_HOST_CLKCTRL,
  943. OMAP4430_OPTFCLKEN_UTMI_P3_CLK_SHIFT, 0x0, NULL);
  944. DEFINE_CLK_GATE(usb_host_hs_hsic480m_p1_clk, "dpll_usb_m2_ck",
  945. &dpll_usb_m2_ck, 0x0,
  946. OMAP4430_CM_L3INIT_USB_HOST_CLKCTRL,
  947. OMAP4430_OPTFCLKEN_HSIC480M_P1_CLK_SHIFT, 0x0, NULL);
  948. DEFINE_CLK_GATE(usb_host_hs_hsic60m_p1_clk, "init_60m_fclk",
  949. &init_60m_fclk, 0x0,
  950. OMAP4430_CM_L3INIT_USB_HOST_CLKCTRL,
  951. OMAP4430_OPTFCLKEN_HSIC60M_P1_CLK_SHIFT, 0x0, NULL);
  952. DEFINE_CLK_GATE(usb_host_hs_hsic60m_p2_clk, "init_60m_fclk",
  953. &init_60m_fclk, 0x0,
  954. OMAP4430_CM_L3INIT_USB_HOST_CLKCTRL,
  955. OMAP4430_OPTFCLKEN_HSIC60M_P2_CLK_SHIFT, 0x0, NULL);
  956. DEFINE_CLK_GATE(usb_host_hs_hsic480m_p2_clk, "dpll_usb_m2_ck",
  957. &dpll_usb_m2_ck, 0x0,
  958. OMAP4430_CM_L3INIT_USB_HOST_CLKCTRL,
  959. OMAP4430_OPTFCLKEN_HSIC480M_P2_CLK_SHIFT, 0x0, NULL);
  960. DEFINE_CLK_GATE(usb_host_hs_func48mclk, "func_48mc_fclk", &func_48mc_fclk, 0x0,
  961. OMAP4430_CM_L3INIT_USB_HOST_CLKCTRL,
  962. OMAP4430_OPTFCLKEN_FUNC48MCLK_SHIFT, 0x0, NULL);
  963. DEFINE_CLK_GATE(usb_host_hs_fck, "init_60m_fclk", &init_60m_fclk, 0x0,
  964. OMAP4430_CM_L3INIT_USB_HOST_CLKCTRL,
  965. OMAP4430_MODULEMODE_SWCTRL_SHIFT, 0x0, NULL);
  966. static const char *otg_60m_gfclk_parents[] = {
  967. "utmi_phy_clkout_ck", "xclk60motg_ck",
  968. };
  969. DEFINE_CLK_MUX(otg_60m_gfclk, otg_60m_gfclk_parents, NULL, 0x0,
  970. OMAP4430_CM_L3INIT_USB_OTG_CLKCTRL, OMAP4430_CLKSEL_60M_SHIFT,
  971. OMAP4430_CLKSEL_60M_WIDTH, 0x0, NULL);
  972. DEFINE_CLK_GATE(usb_otg_hs_xclk, "otg_60m_gfclk", &otg_60m_gfclk, 0x0,
  973. OMAP4430_CM_L3INIT_USB_OTG_CLKCTRL,
  974. OMAP4430_OPTFCLKEN_XCLK_SHIFT, 0x0, NULL);
  975. DEFINE_CLK_GATE(usb_otg_hs_ick, "l3_div_ck", &l3_div_ck, 0x0,
  976. OMAP4430_CM_L3INIT_USB_OTG_CLKCTRL,
  977. OMAP4430_MODULEMODE_HWCTRL_SHIFT, 0x0, NULL);
  978. DEFINE_CLK_GATE(usb_phy_cm_clk32k, "sys_32k_ck", &sys_32k_ck, 0x0,
  979. OMAP4430_CM_ALWON_USBPHY_CLKCTRL,
  980. OMAP4430_OPTFCLKEN_CLK32K_SHIFT, 0x0, NULL);
  981. DEFINE_CLK_GATE(usb_tll_hs_usb_ch2_clk, "init_60m_fclk", &init_60m_fclk, 0x0,
  982. OMAP4430_CM_L3INIT_USB_TLL_CLKCTRL,
  983. OMAP4430_OPTFCLKEN_USB_CH2_CLK_SHIFT, 0x0, NULL);
  984. DEFINE_CLK_GATE(usb_tll_hs_usb_ch0_clk, "init_60m_fclk", &init_60m_fclk, 0x0,
  985. OMAP4430_CM_L3INIT_USB_TLL_CLKCTRL,
  986. OMAP4430_OPTFCLKEN_USB_CH0_CLK_SHIFT, 0x0, NULL);
  987. DEFINE_CLK_GATE(usb_tll_hs_usb_ch1_clk, "init_60m_fclk", &init_60m_fclk, 0x0,
  988. OMAP4430_CM_L3INIT_USB_TLL_CLKCTRL,
  989. OMAP4430_OPTFCLKEN_USB_CH1_CLK_SHIFT, 0x0, NULL);
  990. DEFINE_CLK_GATE(usb_tll_hs_ick, "l4_div_ck", &l4_div_ck, 0x0,
  991. OMAP4430_CM_L3INIT_USB_TLL_CLKCTRL,
  992. OMAP4430_MODULEMODE_HWCTRL_SHIFT, 0x0, NULL);
  993. static const struct clk_div_table usim_ck_rates[] = {
  994. { .div = 14, .val = 0 },
  995. { .div = 18, .val = 1 },
  996. { .div = 0 },
  997. };
  998. DEFINE_CLK_DIVIDER_TABLE(usim_ck, "dpll_per_m4x2_ck", &dpll_per_m4x2_ck, 0x0,
  999. OMAP4430_CM_WKUP_USIM_CLKCTRL,
  1000. OMAP4430_CLKSEL_DIV_SHIFT, OMAP4430_CLKSEL_DIV_WIDTH,
  1001. 0x0, usim_ck_rates, NULL);
  1002. DEFINE_CLK_GATE(usim_fclk, "usim_ck", &usim_ck, 0x0,
  1003. OMAP4430_CM_WKUP_USIM_CLKCTRL, OMAP4430_OPTFCLKEN_FCLK_SHIFT,
  1004. 0x0, NULL);
  1005. /* Remaining optional clocks */
  1006. static const char *pmd_stm_clock_mux_ck_parents[] = {
  1007. "sys_clkin_ck", "dpll_core_m6x2_ck", "tie_low_clock_ck",
  1008. };
  1009. DEFINE_CLK_MUX(pmd_stm_clock_mux_ck, pmd_stm_clock_mux_ck_parents, NULL, 0x0,
  1010. OMAP4430_CM_EMU_DEBUGSS_CLKCTRL, OMAP4430_PMD_STM_MUX_CTRL_SHIFT,
  1011. OMAP4430_PMD_STM_MUX_CTRL_WIDTH, 0x0, NULL);
  1012. DEFINE_CLK_MUX(pmd_trace_clk_mux_ck, pmd_stm_clock_mux_ck_parents, NULL, 0x0,
  1013. OMAP4430_CM_EMU_DEBUGSS_CLKCTRL,
  1014. OMAP4430_PMD_TRACE_MUX_CTRL_SHIFT,
  1015. OMAP4430_PMD_TRACE_MUX_CTRL_WIDTH, 0x0, NULL);
  1016. DEFINE_CLK_DIVIDER(stm_clk_div_ck, "pmd_stm_clock_mux_ck",
  1017. &pmd_stm_clock_mux_ck, 0x0, OMAP4430_CM_EMU_DEBUGSS_CLKCTRL,
  1018. OMAP4430_CLKSEL_PMD_STM_CLK_SHIFT,
  1019. OMAP4430_CLKSEL_PMD_STM_CLK_WIDTH, CLK_DIVIDER_POWER_OF_TWO,
  1020. NULL);
  1021. static const char *trace_clk_div_ck_parents[] = {
  1022. "pmd_trace_clk_mux_ck",
  1023. };
  1024. static const struct clksel trace_clk_div_div[] = {
  1025. { .parent = &pmd_trace_clk_mux_ck, .rates = div3_1to4_rates },
  1026. { .parent = NULL },
  1027. };
  1028. static struct clk trace_clk_div_ck;
  1029. static const struct clk_ops trace_clk_div_ck_ops = {
  1030. .recalc_rate = &omap2_clksel_recalc,
  1031. .set_rate = &omap2_clksel_set_rate,
  1032. .round_rate = &omap2_clksel_round_rate,
  1033. .init = &omap2_init_clk_clkdm,
  1034. .enable = &omap2_clkops_enable_clkdm,
  1035. .disable = &omap2_clkops_disable_clkdm,
  1036. };
  1037. static struct clk_hw_omap trace_clk_div_ck_hw = {
  1038. .hw = {
  1039. .clk = &trace_clk_div_ck,
  1040. },
  1041. .clkdm_name = "emu_sys_clkdm",
  1042. .clksel = trace_clk_div_div,
  1043. .clksel_reg = OMAP4430_CM_EMU_DEBUGSS_CLKCTRL,
  1044. .clksel_mask = OMAP4430_CLKSEL_PMD_TRACE_CLK_MASK,
  1045. };
  1046. DEFINE_STRUCT_CLK(trace_clk_div_ck, trace_clk_div_ck_parents,
  1047. trace_clk_div_ck_ops);
  1048. /* SCRM aux clk nodes */
  1049. static const struct clksel auxclk_src_sel[] = {
  1050. { .parent = &sys_clkin_ck, .rates = div_1_0_rates },
  1051. { .parent = &dpll_core_m3x2_ck, .rates = div_1_1_rates },
  1052. { .parent = &dpll_per_m3x2_ck, .rates = div_1_2_rates },
  1053. { .parent = NULL },
  1054. };
  1055. static const char *auxclk_src_ck_parents[] = {
  1056. "sys_clkin_ck", "dpll_core_m3x2_ck", "dpll_per_m3x2_ck",
  1057. };
  1058. static const struct clk_ops auxclk_src_ck_ops = {
  1059. .enable = &omap2_dflt_clk_enable,
  1060. .disable = &omap2_dflt_clk_disable,
  1061. .is_enabled = &omap2_dflt_clk_is_enabled,
  1062. .recalc_rate = &omap2_clksel_recalc,
  1063. .get_parent = &omap2_clksel_find_parent_index,
  1064. };
  1065. DEFINE_CLK_OMAP_MUX_GATE(auxclk0_src_ck, NULL, auxclk_src_sel,
  1066. OMAP4_SCRM_AUXCLK0, OMAP4_SRCSELECT_MASK,
  1067. OMAP4_SCRM_AUXCLK0, OMAP4_ENABLE_SHIFT, NULL,
  1068. auxclk_src_ck_parents, auxclk_src_ck_ops);
  1069. DEFINE_CLK_DIVIDER(auxclk0_ck, "auxclk0_src_ck", &auxclk0_src_ck, 0x0,
  1070. OMAP4_SCRM_AUXCLK0, OMAP4_CLKDIV_SHIFT, OMAP4_CLKDIV_WIDTH,
  1071. 0x0, NULL);
  1072. DEFINE_CLK_OMAP_MUX_GATE(auxclk1_src_ck, NULL, auxclk_src_sel,
  1073. OMAP4_SCRM_AUXCLK1, OMAP4_SRCSELECT_MASK,
  1074. OMAP4_SCRM_AUXCLK1, OMAP4_ENABLE_SHIFT, NULL,
  1075. auxclk_src_ck_parents, auxclk_src_ck_ops);
  1076. DEFINE_CLK_DIVIDER(auxclk1_ck, "auxclk1_src_ck", &auxclk1_src_ck, 0x0,
  1077. OMAP4_SCRM_AUXCLK1, OMAP4_CLKDIV_SHIFT, OMAP4_CLKDIV_WIDTH,
  1078. 0x0, NULL);
  1079. DEFINE_CLK_OMAP_MUX_GATE(auxclk2_src_ck, NULL, auxclk_src_sel,
  1080. OMAP4_SCRM_AUXCLK2, OMAP4_SRCSELECT_MASK,
  1081. OMAP4_SCRM_AUXCLK2, OMAP4_ENABLE_SHIFT, NULL,
  1082. auxclk_src_ck_parents, auxclk_src_ck_ops);
  1083. DEFINE_CLK_DIVIDER(auxclk2_ck, "auxclk2_src_ck", &auxclk2_src_ck, 0x0,
  1084. OMAP4_SCRM_AUXCLK2, OMAP4_CLKDIV_SHIFT, OMAP4_CLKDIV_WIDTH,
  1085. 0x0, NULL);
  1086. DEFINE_CLK_OMAP_MUX_GATE(auxclk3_src_ck, NULL, auxclk_src_sel,
  1087. OMAP4_SCRM_AUXCLK3, OMAP4_SRCSELECT_MASK,
  1088. OMAP4_SCRM_AUXCLK3, OMAP4_ENABLE_SHIFT, NULL,
  1089. auxclk_src_ck_parents, auxclk_src_ck_ops);
  1090. DEFINE_CLK_DIVIDER(auxclk3_ck, "auxclk3_src_ck", &auxclk3_src_ck, 0x0,
  1091. OMAP4_SCRM_AUXCLK3, OMAP4_CLKDIV_SHIFT, OMAP4_CLKDIV_WIDTH,
  1092. 0x0, NULL);
  1093. DEFINE_CLK_OMAP_MUX_GATE(auxclk4_src_ck, NULL, auxclk_src_sel,
  1094. OMAP4_SCRM_AUXCLK4, OMAP4_SRCSELECT_MASK,
  1095. OMAP4_SCRM_AUXCLK4, OMAP4_ENABLE_SHIFT, NULL,
  1096. auxclk_src_ck_parents, auxclk_src_ck_ops);
  1097. DEFINE_CLK_DIVIDER(auxclk4_ck, "auxclk4_src_ck", &auxclk4_src_ck, 0x0,
  1098. OMAP4_SCRM_AUXCLK4, OMAP4_CLKDIV_SHIFT, OMAP4_CLKDIV_WIDTH,
  1099. 0x0, NULL);
  1100. DEFINE_CLK_OMAP_MUX_GATE(auxclk5_src_ck, NULL, auxclk_src_sel,
  1101. OMAP4_SCRM_AUXCLK5, OMAP4_SRCSELECT_MASK,
  1102. OMAP4_SCRM_AUXCLK5, OMAP4_ENABLE_SHIFT, NULL,
  1103. auxclk_src_ck_parents, auxclk_src_ck_ops);
  1104. DEFINE_CLK_DIVIDER(auxclk5_ck, "auxclk5_src_ck", &auxclk5_src_ck, 0x0,
  1105. OMAP4_SCRM_AUXCLK5, OMAP4_CLKDIV_SHIFT, OMAP4_CLKDIV_WIDTH,
  1106. 0x0, NULL);
  1107. static const char *auxclkreq_ck_parents[] = {
  1108. "auxclk0_ck", "auxclk1_ck", "auxclk2_ck", "auxclk3_ck", "auxclk4_ck",
  1109. "auxclk5_ck",
  1110. };
  1111. DEFINE_CLK_MUX(auxclkreq0_ck, auxclkreq_ck_parents, NULL, 0x0,
  1112. OMAP4_SCRM_AUXCLKREQ0, OMAP4_MAPPING_SHIFT, OMAP4_MAPPING_WIDTH,
  1113. 0x0, NULL);
  1114. DEFINE_CLK_MUX(auxclkreq1_ck, auxclkreq_ck_parents, NULL, 0x0,
  1115. OMAP4_SCRM_AUXCLKREQ1, OMAP4_MAPPING_SHIFT, OMAP4_MAPPING_WIDTH,
  1116. 0x0, NULL);
  1117. DEFINE_CLK_MUX(auxclkreq2_ck, auxclkreq_ck_parents, NULL, 0x0,
  1118. OMAP4_SCRM_AUXCLKREQ2, OMAP4_MAPPING_SHIFT, OMAP4_MAPPING_WIDTH,
  1119. 0x0, NULL);
  1120. DEFINE_CLK_MUX(auxclkreq3_ck, auxclkreq_ck_parents, NULL, 0x0,
  1121. OMAP4_SCRM_AUXCLKREQ3, OMAP4_MAPPING_SHIFT, OMAP4_MAPPING_WIDTH,
  1122. 0x0, NULL);
  1123. DEFINE_CLK_MUX(auxclkreq4_ck, auxclkreq_ck_parents, NULL, 0x0,
  1124. OMAP4_SCRM_AUXCLKREQ4, OMAP4_MAPPING_SHIFT, OMAP4_MAPPING_WIDTH,
  1125. 0x0, NULL);
  1126. DEFINE_CLK_MUX(auxclkreq5_ck, auxclkreq_ck_parents, NULL, 0x0,
  1127. OMAP4_SCRM_AUXCLKREQ5, OMAP4_MAPPING_SHIFT, OMAP4_MAPPING_WIDTH,
  1128. 0x0, NULL);
  1129. /*
  1130. * clocks specific to omap4460
  1131. */
  1132. static struct omap_clk omap446x_clks[] = {
  1133. CLK(NULL, "div_ts_ck", &div_ts_ck),
  1134. CLK(NULL, "bandgap_ts_fclk", &bandgap_ts_fclk),
  1135. };
  1136. /*
  1137. * clocks specific to omap4430
  1138. */
  1139. static struct omap_clk omap443x_clks[] = {
  1140. CLK(NULL, "bandgap_fclk", &bandgap_fclk),
  1141. };
  1142. /*
  1143. * clocks common to omap44xx
  1144. */
  1145. static struct omap_clk omap44xx_clks[] = {
  1146. CLK(NULL, "extalt_clkin_ck", &extalt_clkin_ck),
  1147. CLK(NULL, "pad_clks_src_ck", &pad_clks_src_ck),
  1148. CLK(NULL, "pad_clks_ck", &pad_clks_ck),
  1149. CLK(NULL, "pad_slimbus_core_clks_ck", &pad_slimbus_core_clks_ck),
  1150. CLK(NULL, "secure_32k_clk_src_ck", &secure_32k_clk_src_ck),
  1151. CLK(NULL, "slimbus_src_clk", &slimbus_src_clk),
  1152. CLK(NULL, "slimbus_clk", &slimbus_clk),
  1153. CLK(NULL, "sys_32k_ck", &sys_32k_ck),
  1154. CLK(NULL, "virt_12000000_ck", &virt_12000000_ck),
  1155. CLK(NULL, "virt_13000000_ck", &virt_13000000_ck),
  1156. CLK(NULL, "virt_16800000_ck", &virt_16800000_ck),
  1157. CLK(NULL, "virt_19200000_ck", &virt_19200000_ck),
  1158. CLK(NULL, "virt_26000000_ck", &virt_26000000_ck),
  1159. CLK(NULL, "virt_27000000_ck", &virt_27000000_ck),
  1160. CLK(NULL, "virt_38400000_ck", &virt_38400000_ck),
  1161. CLK(NULL, "sys_clkin_ck", &sys_clkin_ck),
  1162. CLK(NULL, "tie_low_clock_ck", &tie_low_clock_ck),
  1163. CLK(NULL, "utmi_phy_clkout_ck", &utmi_phy_clkout_ck),
  1164. CLK(NULL, "xclk60mhsp1_ck", &xclk60mhsp1_ck),
  1165. CLK(NULL, "xclk60mhsp2_ck", &xclk60mhsp2_ck),
  1166. CLK(NULL, "xclk60motg_ck", &xclk60motg_ck),
  1167. CLK(NULL, "abe_dpll_bypass_clk_mux_ck", &abe_dpll_bypass_clk_mux_ck),
  1168. CLK(NULL, "abe_dpll_refclk_mux_ck", &abe_dpll_refclk_mux_ck),
  1169. CLK(NULL, "dpll_abe_ck", &dpll_abe_ck),
  1170. CLK(NULL, "dpll_abe_x2_ck", &dpll_abe_x2_ck),
  1171. CLK(NULL, "dpll_abe_m2x2_ck", &dpll_abe_m2x2_ck),
  1172. CLK(NULL, "abe_24m_fclk", &abe_24m_fclk),
  1173. CLK(NULL, "abe_clk", &abe_clk),
  1174. CLK(NULL, "aess_fclk", &aess_fclk),
  1175. CLK(NULL, "dpll_abe_m3x2_ck", &dpll_abe_m3x2_ck),
  1176. CLK(NULL, "core_hsd_byp_clk_mux_ck", &core_hsd_byp_clk_mux_ck),
  1177. CLK(NULL, "dpll_core_ck", &dpll_core_ck),
  1178. CLK(NULL, "dpll_core_x2_ck", &dpll_core_x2_ck),
  1179. CLK(NULL, "dpll_core_m6x2_ck", &dpll_core_m6x2_ck),
  1180. CLK(NULL, "dbgclk_mux_ck", &dbgclk_mux_ck),
  1181. CLK(NULL, "dpll_core_m2_ck", &dpll_core_m2_ck),
  1182. CLK(NULL, "ddrphy_ck", &ddrphy_ck),
  1183. CLK(NULL, "dpll_core_m5x2_ck", &dpll_core_m5x2_ck),
  1184. CLK(NULL, "div_core_ck", &div_core_ck),
  1185. CLK(NULL, "div_iva_hs_clk", &div_iva_hs_clk),
  1186. CLK(NULL, "div_mpu_hs_clk", &div_mpu_hs_clk),
  1187. CLK(NULL, "dpll_core_m4x2_ck", &dpll_core_m4x2_ck),
  1188. CLK(NULL, "dll_clk_div_ck", &dll_clk_div_ck),
  1189. CLK(NULL, "dpll_abe_m2_ck", &dpll_abe_m2_ck),
  1190. CLK(NULL, "dpll_core_m3x2_ck", &dpll_core_m3x2_ck),
  1191. CLK(NULL, "dpll_core_m7x2_ck", &dpll_core_m7x2_ck),
  1192. CLK(NULL, "iva_hsd_byp_clk_mux_ck", &iva_hsd_byp_clk_mux_ck),
  1193. CLK(NULL, "dpll_iva_ck", &dpll_iva_ck),
  1194. CLK(NULL, "dpll_iva_x2_ck", &dpll_iva_x2_ck),
  1195. CLK(NULL, "dpll_iva_m4x2_ck", &dpll_iva_m4x2_ck),
  1196. CLK(NULL, "dpll_iva_m5x2_ck", &dpll_iva_m5x2_ck),
  1197. CLK(NULL, "dpll_mpu_ck", &dpll_mpu_ck),
  1198. CLK(NULL, "dpll_mpu_m2_ck", &dpll_mpu_m2_ck),
  1199. CLK(NULL, "per_hs_clk_div_ck", &per_hs_clk_div_ck),
  1200. CLK(NULL, "per_hsd_byp_clk_mux_ck", &per_hsd_byp_clk_mux_ck),
  1201. CLK(NULL, "dpll_per_ck", &dpll_per_ck),
  1202. CLK(NULL, "dpll_per_m2_ck", &dpll_per_m2_ck),
  1203. CLK(NULL, "dpll_per_x2_ck", &dpll_per_x2_ck),
  1204. CLK(NULL, "dpll_per_m2x2_ck", &dpll_per_m2x2_ck),
  1205. CLK(NULL, "dpll_per_m3x2_ck", &dpll_per_m3x2_ck),
  1206. CLK(NULL, "dpll_per_m4x2_ck", &dpll_per_m4x2_ck),
  1207. CLK(NULL, "dpll_per_m5x2_ck", &dpll_per_m5x2_ck),
  1208. CLK(NULL, "dpll_per_m6x2_ck", &dpll_per_m6x2_ck),
  1209. CLK(NULL, "dpll_per_m7x2_ck", &dpll_per_m7x2_ck),
  1210. CLK(NULL, "usb_hs_clk_div_ck", &usb_hs_clk_div_ck),
  1211. CLK(NULL, "dpll_usb_ck", &dpll_usb_ck),
  1212. CLK(NULL, "dpll_usb_clkdcoldo_ck", &dpll_usb_clkdcoldo_ck),
  1213. CLK(NULL, "dpll_usb_m2_ck", &dpll_usb_m2_ck),
  1214. CLK(NULL, "ducati_clk_mux_ck", &ducati_clk_mux_ck),
  1215. CLK(NULL, "func_12m_fclk", &func_12m_fclk),
  1216. CLK(NULL, "func_24m_clk", &func_24m_clk),
  1217. CLK(NULL, "func_24mc_fclk", &func_24mc_fclk),
  1218. CLK(NULL, "func_48m_fclk", &func_48m_fclk),
  1219. CLK(NULL, "func_48mc_fclk", &func_48mc_fclk),
  1220. CLK(NULL, "func_64m_fclk", &func_64m_fclk),
  1221. CLK(NULL, "func_96m_fclk", &func_96m_fclk),
  1222. CLK(NULL, "init_60m_fclk", &init_60m_fclk),
  1223. CLK(NULL, "l3_div_ck", &l3_div_ck),
  1224. CLK(NULL, "l4_div_ck", &l4_div_ck),
  1225. CLK(NULL, "lp_clk_div_ck", &lp_clk_div_ck),
  1226. CLK(NULL, "l4_wkup_clk_mux_ck", &l4_wkup_clk_mux_ck),
  1227. CLK("smp_twd", NULL, &mpu_periphclk),
  1228. CLK(NULL, "ocp_abe_iclk", &ocp_abe_iclk),
  1229. CLK(NULL, "per_abe_24m_fclk", &per_abe_24m_fclk),
  1230. CLK(NULL, "per_abe_nc_fclk", &per_abe_nc_fclk),
  1231. CLK(NULL, "syc_clk_div_ck", &syc_clk_div_ck),
  1232. CLK(NULL, "aes1_fck", &aes1_fck),
  1233. CLK(NULL, "aes2_fck", &aes2_fck),
  1234. CLK(NULL, "dmic_sync_mux_ck", &dmic_sync_mux_ck),
  1235. CLK(NULL, "func_dmic_abe_gfclk", &func_dmic_abe_gfclk),
  1236. CLK(NULL, "dss_sys_clk", &dss_sys_clk),
  1237. CLK(NULL, "dss_tv_clk", &dss_tv_clk),
  1238. CLK(NULL, "dss_dss_clk", &dss_dss_clk),
  1239. CLK(NULL, "dss_48mhz_clk", &dss_48mhz_clk),
  1240. CLK(NULL, "dss_fck", &dss_fck),
  1241. CLK("omapdss_dss", "ick", &dss_fck),
  1242. CLK(NULL, "fdif_fck", &fdif_fck),
  1243. CLK(NULL, "gpio1_dbclk", &gpio1_dbclk),
  1244. CLK(NULL, "gpio2_dbclk", &gpio2_dbclk),
  1245. CLK(NULL, "gpio3_dbclk", &gpio3_dbclk),
  1246. CLK(NULL, "gpio4_dbclk", &gpio4_dbclk),
  1247. CLK(NULL, "gpio5_dbclk", &gpio5_dbclk),
  1248. CLK(NULL, "gpio6_dbclk", &gpio6_dbclk),
  1249. CLK(NULL, "sgx_clk_mux", &sgx_clk_mux),
  1250. CLK(NULL, "hsi_fck", &hsi_fck),
  1251. CLK(NULL, "iss_ctrlclk", &iss_ctrlclk),
  1252. CLK(NULL, "mcasp_sync_mux_ck", &mcasp_sync_mux_ck),
  1253. CLK(NULL, "func_mcasp_abe_gfclk", &func_mcasp_abe_gfclk),
  1254. CLK(NULL, "mcbsp1_sync_mux_ck", &mcbsp1_sync_mux_ck),
  1255. CLK(NULL, "func_mcbsp1_gfclk", &func_mcbsp1_gfclk),
  1256. CLK(NULL, "mcbsp2_sync_mux_ck", &mcbsp2_sync_mux_ck),
  1257. CLK(NULL, "func_mcbsp2_gfclk", &func_mcbsp2_gfclk),
  1258. CLK(NULL, "mcbsp3_sync_mux_ck", &mcbsp3_sync_mux_ck),
  1259. CLK(NULL, "func_mcbsp3_gfclk", &func_mcbsp3_gfclk),
  1260. CLK(NULL, "mcbsp4_sync_mux_ck", &mcbsp4_sync_mux_ck),
  1261. CLK(NULL, "per_mcbsp4_gfclk", &per_mcbsp4_gfclk),
  1262. CLK(NULL, "hsmmc1_fclk", &hsmmc1_fclk),
  1263. CLK(NULL, "hsmmc2_fclk", &hsmmc2_fclk),
  1264. CLK(NULL, "ocp2scp_usb_phy_phy_48m", &ocp2scp_usb_phy_phy_48m),
  1265. CLK(NULL, "sha2md5_fck", &sha2md5_fck),
  1266. CLK(NULL, "slimbus1_fclk_1", &slimbus1_fclk_1),
  1267. CLK(NULL, "slimbus1_fclk_0", &slimbus1_fclk_0),
  1268. CLK(NULL, "slimbus1_fclk_2", &slimbus1_fclk_2),
  1269. CLK(NULL, "slimbus1_slimbus_clk", &slimbus1_slimbus_clk),
  1270. CLK(NULL, "slimbus2_fclk_1", &slimbus2_fclk_1),
  1271. CLK(NULL, "slimbus2_fclk_0", &slimbus2_fclk_0),
  1272. CLK(NULL, "slimbus2_slimbus_clk", &slimbus2_slimbus_clk),
  1273. CLK(NULL, "smartreflex_core_fck", &smartreflex_core_fck),
  1274. CLK(NULL, "smartreflex_iva_fck", &smartreflex_iva_fck),
  1275. CLK(NULL, "smartreflex_mpu_fck", &smartreflex_mpu_fck),
  1276. CLK(NULL, "dmt1_clk_mux", &dmt1_clk_mux),
  1277. CLK(NULL, "cm2_dm10_mux", &cm2_dm10_mux),
  1278. CLK(NULL, "cm2_dm11_mux", &cm2_dm11_mux),
  1279. CLK(NULL, "cm2_dm2_mux", &cm2_dm2_mux),
  1280. CLK(NULL, "cm2_dm3_mux", &cm2_dm3_mux),
  1281. CLK(NULL, "cm2_dm4_mux", &cm2_dm4_mux),
  1282. CLK(NULL, "timer5_sync_mux", &timer5_sync_mux),
  1283. CLK(NULL, "timer6_sync_mux", &timer6_sync_mux),
  1284. CLK(NULL, "timer7_sync_mux", &timer7_sync_mux),
  1285. CLK(NULL, "timer8_sync_mux", &timer8_sync_mux),
  1286. CLK(NULL, "cm2_dm9_mux", &cm2_dm9_mux),
  1287. CLK(NULL, "usb_host_fs_fck", &usb_host_fs_fck),
  1288. CLK("usbhs_omap", "fs_fck", &usb_host_fs_fck),
  1289. CLK(NULL, "utmi_p1_gfclk", &utmi_p1_gfclk),
  1290. CLK(NULL, "usb_host_hs_utmi_p1_clk", &usb_host_hs_utmi_p1_clk),
  1291. CLK(NULL, "utmi_p2_gfclk", &utmi_p2_gfclk),
  1292. CLK(NULL, "usb_host_hs_utmi_p2_clk", &usb_host_hs_utmi_p2_clk),
  1293. CLK(NULL, "usb_host_hs_utmi_p3_clk", &usb_host_hs_utmi_p3_clk),
  1294. CLK(NULL, "usb_host_hs_hsic480m_p1_clk", &usb_host_hs_hsic480m_p1_clk),
  1295. CLK(NULL, "usb_host_hs_hsic60m_p1_clk", &usb_host_hs_hsic60m_p1_clk),
  1296. CLK(NULL, "usb_host_hs_hsic60m_p2_clk", &usb_host_hs_hsic60m_p2_clk),
  1297. CLK(NULL, "usb_host_hs_hsic480m_p2_clk", &usb_host_hs_hsic480m_p2_clk),
  1298. CLK(NULL, "usb_host_hs_func48mclk", &usb_host_hs_func48mclk),
  1299. CLK(NULL, "usb_host_hs_fck", &usb_host_hs_fck),
  1300. CLK("usbhs_omap", "hs_fck", &usb_host_hs_fck),
  1301. CLK(NULL, "otg_60m_gfclk", &otg_60m_gfclk),
  1302. CLK(NULL, "usb_otg_hs_xclk", &usb_otg_hs_xclk),
  1303. CLK(NULL, "usb_otg_hs_ick", &usb_otg_hs_ick),
  1304. CLK("musb-omap2430", "ick", &usb_otg_hs_ick),
  1305. CLK(NULL, "usb_phy_cm_clk32k", &usb_phy_cm_clk32k),
  1306. CLK(NULL, "usb_tll_hs_usb_ch2_clk", &usb_tll_hs_usb_ch2_clk),
  1307. CLK(NULL, "usb_tll_hs_usb_ch0_clk", &usb_tll_hs_usb_ch0_clk),
  1308. CLK(NULL, "usb_tll_hs_usb_ch1_clk", &usb_tll_hs_usb_ch1_clk),
  1309. CLK(NULL, "usb_tll_hs_ick", &usb_tll_hs_ick),
  1310. CLK("usbhs_omap", "usbtll_ick", &usb_tll_hs_ick),
  1311. CLK("usbhs_tll", "usbtll_ick", &usb_tll_hs_ick),
  1312. CLK(NULL, "usim_ck", &usim_ck),
  1313. CLK(NULL, "usim_fclk", &usim_fclk),
  1314. CLK(NULL, "pmd_stm_clock_mux_ck", &pmd_stm_clock_mux_ck),
  1315. CLK(NULL, "pmd_trace_clk_mux_ck", &pmd_trace_clk_mux_ck),
  1316. CLK(NULL, "stm_clk_div_ck", &stm_clk_div_ck),
  1317. CLK(NULL, "trace_clk_div_ck", &trace_clk_div_ck),
  1318. CLK(NULL, "auxclk0_src_ck", &auxclk0_src_ck),
  1319. CLK(NULL, "auxclk0_ck", &auxclk0_ck),
  1320. CLK(NULL, "auxclkreq0_ck", &auxclkreq0_ck),
  1321. CLK(NULL, "auxclk1_src_ck", &auxclk1_src_ck),
  1322. CLK(NULL, "auxclk1_ck", &auxclk1_ck),
  1323. CLK(NULL, "auxclkreq1_ck", &auxclkreq1_ck),
  1324. CLK(NULL, "auxclk2_src_ck", &auxclk2_src_ck),
  1325. CLK(NULL, "auxclk2_ck", &auxclk2_ck),
  1326. CLK(NULL, "auxclkreq2_ck", &auxclkreq2_ck),
  1327. CLK(NULL, "auxclk3_src_ck", &auxclk3_src_ck),
  1328. CLK(NULL, "auxclk3_ck", &auxclk3_ck),
  1329. CLK(NULL, "auxclkreq3_ck", &auxclkreq3_ck),
  1330. CLK(NULL, "auxclk4_src_ck", &auxclk4_src_ck),
  1331. CLK(NULL, "auxclk4_ck", &auxclk4_ck),
  1332. CLK(NULL, "auxclkreq4_ck", &auxclkreq4_ck),
  1333. CLK(NULL, "auxclk5_src_ck", &auxclk5_src_ck),
  1334. CLK(NULL, "auxclk5_ck", &auxclk5_ck),
  1335. CLK(NULL, "auxclkreq5_ck", &auxclkreq5_ck),
  1336. CLK("50000000.gpmc", "fck", &dummy_ck),
  1337. CLK("omap_i2c.1", "ick", &dummy_ck),
  1338. CLK("omap_i2c.2", "ick", &dummy_ck),
  1339. CLK("omap_i2c.3", "ick", &dummy_ck),
  1340. CLK("omap_i2c.4", "ick", &dummy_ck),
  1341. CLK(NULL, "mailboxes_ick", &dummy_ck),
  1342. CLK("omap_hsmmc.0", "ick", &dummy_ck),
  1343. CLK("omap_hsmmc.1", "ick", &dummy_ck),
  1344. CLK("omap_hsmmc.2", "ick", &dummy_ck),
  1345. CLK("omap_hsmmc.3", "ick", &dummy_ck),
  1346. CLK("omap_hsmmc.4", "ick", &dummy_ck),
  1347. CLK("omap-mcbsp.1", "ick", &dummy_ck),
  1348. CLK("omap-mcbsp.2", "ick", &dummy_ck),
  1349. CLK("omap-mcbsp.3", "ick", &dummy_ck),
  1350. CLK("omap-mcbsp.4", "ick", &dummy_ck),
  1351. CLK("omap2_mcspi.1", "ick", &dummy_ck),
  1352. CLK("omap2_mcspi.2", "ick", &dummy_ck),
  1353. CLK("omap2_mcspi.3", "ick", &dummy_ck),
  1354. CLK("omap2_mcspi.4", "ick", &dummy_ck),
  1355. CLK(NULL, "uart1_ick", &dummy_ck),
  1356. CLK(NULL, "uart2_ick", &dummy_ck),
  1357. CLK(NULL, "uart3_ick", &dummy_ck),
  1358. CLK(NULL, "uart4_ick", &dummy_ck),
  1359. CLK("usbhs_omap", "usbhost_ick", &dummy_ck),
  1360. CLK("usbhs_omap", "usbtll_fck", &dummy_ck),
  1361. CLK("usbhs_tll", "usbtll_fck", &dummy_ck),
  1362. CLK("omap_wdt", "ick", &dummy_ck),
  1363. CLK(NULL, "timer_32k_ck", &sys_32k_ck),
  1364. /* TODO: Remove "omap_timer.X" aliases once DT migration is complete */
  1365. CLK("omap_timer.1", "timer_sys_ck", &sys_clkin_ck),
  1366. CLK("omap_timer.2", "timer_sys_ck", &sys_clkin_ck),
  1367. CLK("omap_timer.3", "timer_sys_ck", &sys_clkin_ck),
  1368. CLK("omap_timer.4", "timer_sys_ck", &sys_clkin_ck),
  1369. CLK("omap_timer.9", "timer_sys_ck", &sys_clkin_ck),
  1370. CLK("omap_timer.10", "timer_sys_ck", &sys_clkin_ck),
  1371. CLK("omap_timer.11", "timer_sys_ck", &sys_clkin_ck),
  1372. CLK("omap_timer.5", "timer_sys_ck", &syc_clk_div_ck),
  1373. CLK("omap_timer.6", "timer_sys_ck", &syc_clk_div_ck),
  1374. CLK("omap_timer.7", "timer_sys_ck", &syc_clk_div_ck),
  1375. CLK("omap_timer.8", "timer_sys_ck", &syc_clk_div_ck),
  1376. CLK("4a318000.timer", "timer_sys_ck", &sys_clkin_ck),
  1377. CLK("48032000.timer", "timer_sys_ck", &sys_clkin_ck),
  1378. CLK("48034000.timer", "timer_sys_ck", &sys_clkin_ck),
  1379. CLK("48036000.timer", "timer_sys_ck", &sys_clkin_ck),
  1380. CLK("4803e000.timer", "timer_sys_ck", &sys_clkin_ck),
  1381. CLK("48086000.timer", "timer_sys_ck", &sys_clkin_ck),
  1382. CLK("48088000.timer", "timer_sys_ck", &sys_clkin_ck),
  1383. CLK("40138000.timer", "timer_sys_ck", &syc_clk_div_ck),
  1384. CLK("4013a000.timer", "timer_sys_ck", &syc_clk_div_ck),
  1385. CLK("4013c000.timer", "timer_sys_ck", &syc_clk_div_ck),
  1386. CLK("4013e000.timer", "timer_sys_ck", &syc_clk_div_ck),
  1387. CLK(NULL, "cpufreq_ck", &dpll_mpu_ck),
  1388. };
  1389. int __init omap4xxx_clk_init(void)
  1390. {
  1391. int rc;
  1392. if (cpu_is_omap443x()) {
  1393. cpu_mask = RATE_IN_4430;
  1394. omap_clocks_register(omap443x_clks, ARRAY_SIZE(omap443x_clks));
  1395. } else if (cpu_is_omap446x() || cpu_is_omap447x()) {
  1396. cpu_mask = RATE_IN_4460 | RATE_IN_4430;
  1397. omap_clocks_register(omap446x_clks, ARRAY_SIZE(omap446x_clks));
  1398. if (cpu_is_omap447x())
  1399. pr_warn("WARNING: OMAP4470 clock data incomplete!\n");
  1400. } else {
  1401. return 0;
  1402. }
  1403. omap_clocks_register(omap44xx_clks, ARRAY_SIZE(omap44xx_clks));
  1404. omap2_clk_disable_autoidle_all();
  1405. /*
  1406. * A set rate of ABE DPLL inturn triggers a set rate of USB DPLL
  1407. * when its in bypass. So always lock USB before ABE DPLL.
  1408. */
  1409. /*
  1410. * Lock USB DPLL on OMAP4 devices so that the L3INIT power
  1411. * domain can transition to retention state when not in use.
  1412. */
  1413. rc = clk_set_rate(&dpll_usb_ck, OMAP4_DPLL_USB_DEFFREQ);
  1414. if (rc)
  1415. pr_err("%s: failed to configure USB DPLL!\n", __func__);
  1416. /*
  1417. * On OMAP4460 the ABE DPLL fails to turn on if in idle low-power
  1418. * state when turning the ABE clock domain. Workaround this by
  1419. * locking the ABE DPLL on boot.
  1420. * Lock the ABE DPLL in any case to avoid issues with audio.
  1421. */
  1422. rc = clk_set_parent(&abe_dpll_refclk_mux_ck, &sys_32k_ck);
  1423. if (!rc)
  1424. rc = clk_set_rate(&dpll_abe_ck, OMAP4_DPLL_ABE_DEFFREQ);
  1425. if (rc)
  1426. pr_err("%s: failed to configure ABE DPLL!\n", __func__);
  1427. return 0;
  1428. }