cclock44xx_data.c 62 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411141214131414141514161417141814191420142114221423142414251426142714281429143014311432143314341435143614371438143914401441144214431444144514461447144814491450145114521453145414551456145714581459146014611462146314641465146614671468146914701471147214731474147514761477147814791480148114821483148414851486148714881489149014911492149314941495149614971498149915001501150215031504150515061507150815091510151115121513151415151516151715181519152015211522152315241525152615271528152915301531153215331534153515361537153815391540154115421543154415451546154715481549155015511552155315541555155615571558155915601561156215631564156515661567156815691570157115721573157415751576157715781579158015811582158315841585158615871588158915901591159215931594159515961597159815991600160116021603160416051606160716081609161016111612161316141615161616171618161916201621162216231624162516261627162816291630163116321633163416351636163716381639164016411642164316441645164616471648164916501651165216531654165516561657165816591660166116621663166416651666166716681669167016711672167316741675167616771678167916801681168216831684168516861687168816891690169116921693169416951696169716981699170017011702170317041705170617071708170917101711171217131714171517161717171817191720172117221723172417251726172717281729
  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. * clkdev
  1131. */
  1132. static struct omap_clk omap44xx_clks[] = {
  1133. CLK(NULL, "extalt_clkin_ck", &extalt_clkin_ck, CK_443X),
  1134. CLK(NULL, "pad_clks_src_ck", &pad_clks_src_ck, CK_443X),
  1135. CLK(NULL, "pad_clks_ck", &pad_clks_ck, CK_443X),
  1136. CLK(NULL, "pad_slimbus_core_clks_ck", &pad_slimbus_core_clks_ck, CK_443X),
  1137. CLK(NULL, "secure_32k_clk_src_ck", &secure_32k_clk_src_ck, CK_443X),
  1138. CLK(NULL, "slimbus_src_clk", &slimbus_src_clk, CK_443X),
  1139. CLK(NULL, "slimbus_clk", &slimbus_clk, CK_443X),
  1140. CLK(NULL, "sys_32k_ck", &sys_32k_ck, CK_443X),
  1141. CLK(NULL, "virt_12000000_ck", &virt_12000000_ck, CK_443X),
  1142. CLK(NULL, "virt_13000000_ck", &virt_13000000_ck, CK_443X),
  1143. CLK(NULL, "virt_16800000_ck", &virt_16800000_ck, CK_443X),
  1144. CLK(NULL, "virt_19200000_ck", &virt_19200000_ck, CK_443X),
  1145. CLK(NULL, "virt_26000000_ck", &virt_26000000_ck, CK_443X),
  1146. CLK(NULL, "virt_27000000_ck", &virt_27000000_ck, CK_443X),
  1147. CLK(NULL, "virt_38400000_ck", &virt_38400000_ck, CK_443X),
  1148. CLK(NULL, "sys_clkin_ck", &sys_clkin_ck, CK_443X),
  1149. CLK(NULL, "tie_low_clock_ck", &tie_low_clock_ck, CK_443X),
  1150. CLK(NULL, "utmi_phy_clkout_ck", &utmi_phy_clkout_ck, CK_443X),
  1151. CLK(NULL, "xclk60mhsp1_ck", &xclk60mhsp1_ck, CK_443X),
  1152. CLK(NULL, "xclk60mhsp2_ck", &xclk60mhsp2_ck, CK_443X),
  1153. CLK(NULL, "xclk60motg_ck", &xclk60motg_ck, CK_443X),
  1154. CLK(NULL, "abe_dpll_bypass_clk_mux_ck", &abe_dpll_bypass_clk_mux_ck, CK_443X),
  1155. CLK(NULL, "abe_dpll_refclk_mux_ck", &abe_dpll_refclk_mux_ck, CK_443X),
  1156. CLK(NULL, "dpll_abe_ck", &dpll_abe_ck, CK_443X),
  1157. CLK(NULL, "dpll_abe_x2_ck", &dpll_abe_x2_ck, CK_443X),
  1158. CLK(NULL, "dpll_abe_m2x2_ck", &dpll_abe_m2x2_ck, CK_443X),
  1159. CLK(NULL, "abe_24m_fclk", &abe_24m_fclk, CK_443X),
  1160. CLK(NULL, "abe_clk", &abe_clk, CK_443X),
  1161. CLK(NULL, "aess_fclk", &aess_fclk, CK_443X),
  1162. CLK(NULL, "dpll_abe_m3x2_ck", &dpll_abe_m3x2_ck, CK_443X),
  1163. CLK(NULL, "core_hsd_byp_clk_mux_ck", &core_hsd_byp_clk_mux_ck, CK_443X),
  1164. CLK(NULL, "dpll_core_ck", &dpll_core_ck, CK_443X),
  1165. CLK(NULL, "dpll_core_x2_ck", &dpll_core_x2_ck, CK_443X),
  1166. CLK(NULL, "dpll_core_m6x2_ck", &dpll_core_m6x2_ck, CK_443X),
  1167. CLK(NULL, "dbgclk_mux_ck", &dbgclk_mux_ck, CK_443X),
  1168. CLK(NULL, "dpll_core_m2_ck", &dpll_core_m2_ck, CK_443X),
  1169. CLK(NULL, "ddrphy_ck", &ddrphy_ck, CK_443X),
  1170. CLK(NULL, "dpll_core_m5x2_ck", &dpll_core_m5x2_ck, CK_443X),
  1171. CLK(NULL, "div_core_ck", &div_core_ck, CK_443X),
  1172. CLK(NULL, "div_iva_hs_clk", &div_iva_hs_clk, CK_443X),
  1173. CLK(NULL, "div_mpu_hs_clk", &div_mpu_hs_clk, CK_443X),
  1174. CLK(NULL, "dpll_core_m4x2_ck", &dpll_core_m4x2_ck, CK_443X),
  1175. CLK(NULL, "dll_clk_div_ck", &dll_clk_div_ck, CK_443X),
  1176. CLK(NULL, "dpll_abe_m2_ck", &dpll_abe_m2_ck, CK_443X),
  1177. CLK(NULL, "dpll_core_m3x2_ck", &dpll_core_m3x2_ck, CK_443X),
  1178. CLK(NULL, "dpll_core_m7x2_ck", &dpll_core_m7x2_ck, CK_443X),
  1179. CLK(NULL, "iva_hsd_byp_clk_mux_ck", &iva_hsd_byp_clk_mux_ck, CK_443X),
  1180. CLK(NULL, "dpll_iva_ck", &dpll_iva_ck, CK_443X),
  1181. CLK(NULL, "dpll_iva_x2_ck", &dpll_iva_x2_ck, CK_443X),
  1182. CLK(NULL, "dpll_iva_m4x2_ck", &dpll_iva_m4x2_ck, CK_443X),
  1183. CLK(NULL, "dpll_iva_m5x2_ck", &dpll_iva_m5x2_ck, CK_443X),
  1184. CLK(NULL, "dpll_mpu_ck", &dpll_mpu_ck, CK_443X),
  1185. CLK(NULL, "dpll_mpu_m2_ck", &dpll_mpu_m2_ck, CK_443X),
  1186. CLK(NULL, "per_hs_clk_div_ck", &per_hs_clk_div_ck, CK_443X),
  1187. CLK(NULL, "per_hsd_byp_clk_mux_ck", &per_hsd_byp_clk_mux_ck, CK_443X),
  1188. CLK(NULL, "dpll_per_ck", &dpll_per_ck, CK_443X),
  1189. CLK(NULL, "dpll_per_m2_ck", &dpll_per_m2_ck, CK_443X),
  1190. CLK(NULL, "dpll_per_x2_ck", &dpll_per_x2_ck, CK_443X),
  1191. CLK(NULL, "dpll_per_m2x2_ck", &dpll_per_m2x2_ck, CK_443X),
  1192. CLK(NULL, "dpll_per_m3x2_ck", &dpll_per_m3x2_ck, CK_443X),
  1193. CLK(NULL, "dpll_per_m4x2_ck", &dpll_per_m4x2_ck, CK_443X),
  1194. CLK(NULL, "dpll_per_m5x2_ck", &dpll_per_m5x2_ck, CK_443X),
  1195. CLK(NULL, "dpll_per_m6x2_ck", &dpll_per_m6x2_ck, CK_443X),
  1196. CLK(NULL, "dpll_per_m7x2_ck", &dpll_per_m7x2_ck, CK_443X),
  1197. CLK(NULL, "usb_hs_clk_div_ck", &usb_hs_clk_div_ck, CK_443X),
  1198. CLK(NULL, "dpll_usb_ck", &dpll_usb_ck, CK_443X),
  1199. CLK(NULL, "dpll_usb_clkdcoldo_ck", &dpll_usb_clkdcoldo_ck, CK_443X),
  1200. CLK(NULL, "dpll_usb_m2_ck", &dpll_usb_m2_ck, CK_443X),
  1201. CLK(NULL, "ducati_clk_mux_ck", &ducati_clk_mux_ck, CK_443X),
  1202. CLK(NULL, "func_12m_fclk", &func_12m_fclk, CK_443X),
  1203. CLK(NULL, "func_24m_clk", &func_24m_clk, CK_443X),
  1204. CLK(NULL, "func_24mc_fclk", &func_24mc_fclk, CK_443X),
  1205. CLK(NULL, "func_48m_fclk", &func_48m_fclk, CK_443X),
  1206. CLK(NULL, "func_48mc_fclk", &func_48mc_fclk, CK_443X),
  1207. CLK(NULL, "func_64m_fclk", &func_64m_fclk, CK_443X),
  1208. CLK(NULL, "func_96m_fclk", &func_96m_fclk, CK_443X),
  1209. CLK(NULL, "init_60m_fclk", &init_60m_fclk, CK_443X),
  1210. CLK(NULL, "l3_div_ck", &l3_div_ck, CK_443X),
  1211. CLK(NULL, "l4_div_ck", &l4_div_ck, CK_443X),
  1212. CLK(NULL, "lp_clk_div_ck", &lp_clk_div_ck, CK_443X),
  1213. CLK(NULL, "l4_wkup_clk_mux_ck", &l4_wkup_clk_mux_ck, CK_443X),
  1214. CLK("smp_twd", NULL, &mpu_periphclk, CK_443X),
  1215. CLK(NULL, "ocp_abe_iclk", &ocp_abe_iclk, CK_443X),
  1216. CLK(NULL, "per_abe_24m_fclk", &per_abe_24m_fclk, CK_443X),
  1217. CLK(NULL, "per_abe_nc_fclk", &per_abe_nc_fclk, CK_443X),
  1218. CLK(NULL, "syc_clk_div_ck", &syc_clk_div_ck, CK_443X),
  1219. CLK(NULL, "aes1_fck", &aes1_fck, CK_443X),
  1220. CLK(NULL, "aes2_fck", &aes2_fck, CK_443X),
  1221. CLK(NULL, "bandgap_fclk", &bandgap_fclk, CK_443X),
  1222. CLK(NULL, "div_ts_ck", &div_ts_ck, CK_446X),
  1223. CLK(NULL, "bandgap_ts_fclk", &bandgap_ts_fclk, CK_446X),
  1224. CLK(NULL, "dmic_sync_mux_ck", &dmic_sync_mux_ck, CK_443X),
  1225. CLK(NULL, "func_dmic_abe_gfclk", &func_dmic_abe_gfclk, CK_443X),
  1226. CLK(NULL, "dss_sys_clk", &dss_sys_clk, CK_443X),
  1227. CLK(NULL, "dss_tv_clk", &dss_tv_clk, CK_443X),
  1228. CLK(NULL, "dss_dss_clk", &dss_dss_clk, CK_443X),
  1229. CLK(NULL, "dss_48mhz_clk", &dss_48mhz_clk, CK_443X),
  1230. CLK(NULL, "dss_fck", &dss_fck, CK_443X),
  1231. CLK("omapdss_dss", "ick", &dss_fck, CK_443X),
  1232. CLK(NULL, "fdif_fck", &fdif_fck, CK_443X),
  1233. CLK(NULL, "gpio1_dbclk", &gpio1_dbclk, CK_443X),
  1234. CLK(NULL, "gpio2_dbclk", &gpio2_dbclk, CK_443X),
  1235. CLK(NULL, "gpio3_dbclk", &gpio3_dbclk, CK_443X),
  1236. CLK(NULL, "gpio4_dbclk", &gpio4_dbclk, CK_443X),
  1237. CLK(NULL, "gpio5_dbclk", &gpio5_dbclk, CK_443X),
  1238. CLK(NULL, "gpio6_dbclk", &gpio6_dbclk, CK_443X),
  1239. CLK(NULL, "sgx_clk_mux", &sgx_clk_mux, CK_443X),
  1240. CLK(NULL, "hsi_fck", &hsi_fck, CK_443X),
  1241. CLK(NULL, "iss_ctrlclk", &iss_ctrlclk, CK_443X),
  1242. CLK(NULL, "mcasp_sync_mux_ck", &mcasp_sync_mux_ck, CK_443X),
  1243. CLK(NULL, "func_mcasp_abe_gfclk", &func_mcasp_abe_gfclk, CK_443X),
  1244. CLK(NULL, "mcbsp1_sync_mux_ck", &mcbsp1_sync_mux_ck, CK_443X),
  1245. CLK(NULL, "func_mcbsp1_gfclk", &func_mcbsp1_gfclk, CK_443X),
  1246. CLK(NULL, "mcbsp2_sync_mux_ck", &mcbsp2_sync_mux_ck, CK_443X),
  1247. CLK(NULL, "func_mcbsp2_gfclk", &func_mcbsp2_gfclk, CK_443X),
  1248. CLK(NULL, "mcbsp3_sync_mux_ck", &mcbsp3_sync_mux_ck, CK_443X),
  1249. CLK(NULL, "func_mcbsp3_gfclk", &func_mcbsp3_gfclk, CK_443X),
  1250. CLK(NULL, "mcbsp4_sync_mux_ck", &mcbsp4_sync_mux_ck, CK_443X),
  1251. CLK(NULL, "per_mcbsp4_gfclk", &per_mcbsp4_gfclk, CK_443X),
  1252. CLK(NULL, "hsmmc1_fclk", &hsmmc1_fclk, CK_443X),
  1253. CLK(NULL, "hsmmc2_fclk", &hsmmc2_fclk, CK_443X),
  1254. CLK(NULL, "ocp2scp_usb_phy_phy_48m", &ocp2scp_usb_phy_phy_48m, CK_443X),
  1255. CLK(NULL, "sha2md5_fck", &sha2md5_fck, CK_443X),
  1256. CLK(NULL, "slimbus1_fclk_1", &slimbus1_fclk_1, CK_443X),
  1257. CLK(NULL, "slimbus1_fclk_0", &slimbus1_fclk_0, CK_443X),
  1258. CLK(NULL, "slimbus1_fclk_2", &slimbus1_fclk_2, CK_443X),
  1259. CLK(NULL, "slimbus1_slimbus_clk", &slimbus1_slimbus_clk, CK_443X),
  1260. CLK(NULL, "slimbus2_fclk_1", &slimbus2_fclk_1, CK_443X),
  1261. CLK(NULL, "slimbus2_fclk_0", &slimbus2_fclk_0, CK_443X),
  1262. CLK(NULL, "slimbus2_slimbus_clk", &slimbus2_slimbus_clk, CK_443X),
  1263. CLK(NULL, "smartreflex_core_fck", &smartreflex_core_fck, CK_443X),
  1264. CLK(NULL, "smartreflex_iva_fck", &smartreflex_iva_fck, CK_443X),
  1265. CLK(NULL, "smartreflex_mpu_fck", &smartreflex_mpu_fck, CK_443X),
  1266. CLK(NULL, "dmt1_clk_mux", &dmt1_clk_mux, CK_443X),
  1267. CLK(NULL, "cm2_dm10_mux", &cm2_dm10_mux, CK_443X),
  1268. CLK(NULL, "cm2_dm11_mux", &cm2_dm11_mux, CK_443X),
  1269. CLK(NULL, "cm2_dm2_mux", &cm2_dm2_mux, CK_443X),
  1270. CLK(NULL, "cm2_dm3_mux", &cm2_dm3_mux, CK_443X),
  1271. CLK(NULL, "cm2_dm4_mux", &cm2_dm4_mux, CK_443X),
  1272. CLK(NULL, "timer5_sync_mux", &timer5_sync_mux, CK_443X),
  1273. CLK(NULL, "timer6_sync_mux", &timer6_sync_mux, CK_443X),
  1274. CLK(NULL, "timer7_sync_mux", &timer7_sync_mux, CK_443X),
  1275. CLK(NULL, "timer8_sync_mux", &timer8_sync_mux, CK_443X),
  1276. CLK(NULL, "cm2_dm9_mux", &cm2_dm9_mux, CK_443X),
  1277. CLK(NULL, "usb_host_fs_fck", &usb_host_fs_fck, CK_443X),
  1278. CLK("usbhs_omap", "fs_fck", &usb_host_fs_fck, CK_443X),
  1279. CLK(NULL, "utmi_p1_gfclk", &utmi_p1_gfclk, CK_443X),
  1280. CLK(NULL, "usb_host_hs_utmi_p1_clk", &usb_host_hs_utmi_p1_clk, CK_443X),
  1281. CLK(NULL, "utmi_p2_gfclk", &utmi_p2_gfclk, CK_443X),
  1282. CLK(NULL, "usb_host_hs_utmi_p2_clk", &usb_host_hs_utmi_p2_clk, CK_443X),
  1283. CLK(NULL, "usb_host_hs_utmi_p3_clk", &usb_host_hs_utmi_p3_clk, CK_443X),
  1284. CLK(NULL, "usb_host_hs_hsic480m_p1_clk", &usb_host_hs_hsic480m_p1_clk, CK_443X),
  1285. CLK(NULL, "usb_host_hs_hsic60m_p1_clk", &usb_host_hs_hsic60m_p1_clk, CK_443X),
  1286. CLK(NULL, "usb_host_hs_hsic60m_p2_clk", &usb_host_hs_hsic60m_p2_clk, CK_443X),
  1287. CLK(NULL, "usb_host_hs_hsic480m_p2_clk", &usb_host_hs_hsic480m_p2_clk, CK_443X),
  1288. CLK(NULL, "usb_host_hs_func48mclk", &usb_host_hs_func48mclk, CK_443X),
  1289. CLK(NULL, "usb_host_hs_fck", &usb_host_hs_fck, CK_443X),
  1290. CLK("usbhs_omap", "hs_fck", &usb_host_hs_fck, CK_443X),
  1291. CLK(NULL, "otg_60m_gfclk", &otg_60m_gfclk, CK_443X),
  1292. CLK(NULL, "usb_otg_hs_xclk", &usb_otg_hs_xclk, CK_443X),
  1293. CLK(NULL, "usb_otg_hs_ick", &usb_otg_hs_ick, CK_443X),
  1294. CLK("musb-omap2430", "ick", &usb_otg_hs_ick, CK_443X),
  1295. CLK(NULL, "usb_phy_cm_clk32k", &usb_phy_cm_clk32k, CK_443X),
  1296. CLK(NULL, "usb_tll_hs_usb_ch2_clk", &usb_tll_hs_usb_ch2_clk, CK_443X),
  1297. CLK(NULL, "usb_tll_hs_usb_ch0_clk", &usb_tll_hs_usb_ch0_clk, CK_443X),
  1298. CLK(NULL, "usb_tll_hs_usb_ch1_clk", &usb_tll_hs_usb_ch1_clk, CK_443X),
  1299. CLK(NULL, "usb_tll_hs_ick", &usb_tll_hs_ick, CK_443X),
  1300. CLK("usbhs_omap", "usbtll_ick", &usb_tll_hs_ick, CK_443X),
  1301. CLK("usbhs_tll", "usbtll_ick", &usb_tll_hs_ick, CK_443X),
  1302. CLK(NULL, "usim_ck", &usim_ck, CK_443X),
  1303. CLK(NULL, "usim_fclk", &usim_fclk, CK_443X),
  1304. CLK(NULL, "pmd_stm_clock_mux_ck", &pmd_stm_clock_mux_ck, CK_443X),
  1305. CLK(NULL, "pmd_trace_clk_mux_ck", &pmd_trace_clk_mux_ck, CK_443X),
  1306. CLK(NULL, "stm_clk_div_ck", &stm_clk_div_ck, CK_443X),
  1307. CLK(NULL, "trace_clk_div_ck", &trace_clk_div_ck, CK_443X),
  1308. CLK(NULL, "auxclk0_src_ck", &auxclk0_src_ck, CK_443X),
  1309. CLK(NULL, "auxclk0_ck", &auxclk0_ck, CK_443X),
  1310. CLK(NULL, "auxclkreq0_ck", &auxclkreq0_ck, CK_443X),
  1311. CLK(NULL, "auxclk1_src_ck", &auxclk1_src_ck, CK_443X),
  1312. CLK(NULL, "auxclk1_ck", &auxclk1_ck, CK_443X),
  1313. CLK(NULL, "auxclkreq1_ck", &auxclkreq1_ck, CK_443X),
  1314. CLK(NULL, "auxclk2_src_ck", &auxclk2_src_ck, CK_443X),
  1315. CLK(NULL, "auxclk2_ck", &auxclk2_ck, CK_443X),
  1316. CLK(NULL, "auxclkreq2_ck", &auxclkreq2_ck, CK_443X),
  1317. CLK(NULL, "auxclk3_src_ck", &auxclk3_src_ck, CK_443X),
  1318. CLK(NULL, "auxclk3_ck", &auxclk3_ck, CK_443X),
  1319. CLK(NULL, "auxclkreq3_ck", &auxclkreq3_ck, CK_443X),
  1320. CLK(NULL, "auxclk4_src_ck", &auxclk4_src_ck, CK_443X),
  1321. CLK(NULL, "auxclk4_ck", &auxclk4_ck, CK_443X),
  1322. CLK(NULL, "auxclkreq4_ck", &auxclkreq4_ck, CK_443X),
  1323. CLK(NULL, "auxclk5_src_ck", &auxclk5_src_ck, CK_443X),
  1324. CLK(NULL, "auxclk5_ck", &auxclk5_ck, CK_443X),
  1325. CLK(NULL, "auxclkreq5_ck", &auxclkreq5_ck, CK_443X),
  1326. CLK("omap-gpmc", "fck", &dummy_ck, CK_443X),
  1327. CLK("omap_i2c.1", "ick", &dummy_ck, CK_443X),
  1328. CLK("omap_i2c.2", "ick", &dummy_ck, CK_443X),
  1329. CLK("omap_i2c.3", "ick", &dummy_ck, CK_443X),
  1330. CLK("omap_i2c.4", "ick", &dummy_ck, CK_443X),
  1331. CLK(NULL, "mailboxes_ick", &dummy_ck, CK_443X),
  1332. CLK("omap_hsmmc.0", "ick", &dummy_ck, CK_443X),
  1333. CLK("omap_hsmmc.1", "ick", &dummy_ck, CK_443X),
  1334. CLK("omap_hsmmc.2", "ick", &dummy_ck, CK_443X),
  1335. CLK("omap_hsmmc.3", "ick", &dummy_ck, CK_443X),
  1336. CLK("omap_hsmmc.4", "ick", &dummy_ck, CK_443X),
  1337. CLK("omap-mcbsp.1", "ick", &dummy_ck, CK_443X),
  1338. CLK("omap-mcbsp.2", "ick", &dummy_ck, CK_443X),
  1339. CLK("omap-mcbsp.3", "ick", &dummy_ck, CK_443X),
  1340. CLK("omap-mcbsp.4", "ick", &dummy_ck, CK_443X),
  1341. CLK("omap2_mcspi.1", "ick", &dummy_ck, CK_443X),
  1342. CLK("omap2_mcspi.2", "ick", &dummy_ck, CK_443X),
  1343. CLK("omap2_mcspi.3", "ick", &dummy_ck, CK_443X),
  1344. CLK("omap2_mcspi.4", "ick", &dummy_ck, CK_443X),
  1345. CLK(NULL, "uart1_ick", &dummy_ck, CK_443X),
  1346. CLK(NULL, "uart2_ick", &dummy_ck, CK_443X),
  1347. CLK(NULL, "uart3_ick", &dummy_ck, CK_443X),
  1348. CLK(NULL, "uart4_ick", &dummy_ck, CK_443X),
  1349. CLK("usbhs_omap", "usbhost_ick", &dummy_ck, CK_443X),
  1350. CLK("usbhs_omap", "usbtll_fck", &dummy_ck, CK_443X),
  1351. CLK("usbhs_tll", "usbtll_fck", &dummy_ck, CK_443X),
  1352. CLK("omap_wdt", "ick", &dummy_ck, CK_443X),
  1353. CLK(NULL, "timer_32k_ck", &sys_32k_ck, CK_443X),
  1354. /* TODO: Remove "omap_timer.X" aliases once DT migration is complete */
  1355. CLK("omap_timer.1", "timer_sys_ck", &sys_clkin_ck, CK_443X),
  1356. CLK("omap_timer.2", "timer_sys_ck", &sys_clkin_ck, CK_443X),
  1357. CLK("omap_timer.3", "timer_sys_ck", &sys_clkin_ck, CK_443X),
  1358. CLK("omap_timer.4", "timer_sys_ck", &sys_clkin_ck, CK_443X),
  1359. CLK("omap_timer.9", "timer_sys_ck", &sys_clkin_ck, CK_443X),
  1360. CLK("omap_timer.10", "timer_sys_ck", &sys_clkin_ck, CK_443X),
  1361. CLK("omap_timer.11", "timer_sys_ck", &sys_clkin_ck, CK_443X),
  1362. CLK("omap_timer.5", "timer_sys_ck", &syc_clk_div_ck, CK_443X),
  1363. CLK("omap_timer.6", "timer_sys_ck", &syc_clk_div_ck, CK_443X),
  1364. CLK("omap_timer.7", "timer_sys_ck", &syc_clk_div_ck, CK_443X),
  1365. CLK("omap_timer.8", "timer_sys_ck", &syc_clk_div_ck, CK_443X),
  1366. CLK("4a318000.timer", "timer_sys_ck", &sys_clkin_ck, CK_443X),
  1367. CLK("48032000.timer", "timer_sys_ck", &sys_clkin_ck, CK_443X),
  1368. CLK("48034000.timer", "timer_sys_ck", &sys_clkin_ck, CK_443X),
  1369. CLK("48036000.timer", "timer_sys_ck", &sys_clkin_ck, CK_443X),
  1370. CLK("4803e000.timer", "timer_sys_ck", &sys_clkin_ck, CK_443X),
  1371. CLK("48086000.timer", "timer_sys_ck", &sys_clkin_ck, CK_443X),
  1372. CLK("48088000.timer", "timer_sys_ck", &sys_clkin_ck, CK_443X),
  1373. CLK("40138000.timer", "timer_sys_ck", &syc_clk_div_ck, CK_443X),
  1374. CLK("4013a000.timer", "timer_sys_ck", &syc_clk_div_ck, CK_443X),
  1375. CLK("4013c000.timer", "timer_sys_ck", &syc_clk_div_ck, CK_443X),
  1376. CLK("4013e000.timer", "timer_sys_ck", &syc_clk_div_ck, CK_443X),
  1377. CLK(NULL, "cpufreq_ck", &dpll_mpu_ck, CK_443X),
  1378. };
  1379. int __init omap4xxx_clk_init(void)
  1380. {
  1381. u32 cpu_clkflg;
  1382. struct omap_clk *c;
  1383. int rc;
  1384. if (cpu_is_omap443x()) {
  1385. cpu_mask = RATE_IN_4430;
  1386. cpu_clkflg = CK_443X;
  1387. } else if (cpu_is_omap446x() || cpu_is_omap447x()) {
  1388. cpu_mask = RATE_IN_4460 | RATE_IN_4430;
  1389. cpu_clkflg = CK_446X | CK_443X;
  1390. if (cpu_is_omap447x())
  1391. pr_warn("WARNING: OMAP4470 clock data incomplete!\n");
  1392. } else {
  1393. return 0;
  1394. }
  1395. for (c = omap44xx_clks; c < omap44xx_clks + ARRAY_SIZE(omap44xx_clks);
  1396. c++) {
  1397. if (c->cpu & cpu_clkflg) {
  1398. clkdev_add(&c->lk);
  1399. if (!__clk_init(NULL, c->lk.clk))
  1400. omap2_init_clk_hw_omap_clocks(c->lk.clk);
  1401. }
  1402. }
  1403. omap2_clk_disable_autoidle_all();
  1404. /*
  1405. * On OMAP4460 the ABE DPLL fails to turn on if in idle low-power
  1406. * state when turning the ABE clock domain. Workaround this by
  1407. * locking the ABE DPLL on boot.
  1408. * Lock the ABE DPLL in any case to avoid issues with audio.
  1409. */
  1410. rc = clk_set_parent(&abe_dpll_refclk_mux_ck, &sys_32k_ck);
  1411. if (!rc)
  1412. rc = clk_set_rate(&dpll_abe_ck, OMAP4_DPLL_ABE_DEFFREQ);
  1413. if (rc)
  1414. pr_err("%s: failed to configure ABE DPLL!\n", __func__);
  1415. /*
  1416. * Lock USB DPLL on OMAP4 devices so that the L3INIT power
  1417. * domain can transition to retention state when not in use.
  1418. */
  1419. rc = clk_set_rate(&dpll_usb_ck, OMAP4_DPLL_USB_DEFFREQ);
  1420. if (rc)
  1421. pr_err("%s: failed to configure USB DPLL!\n", __func__);
  1422. return 0;
  1423. }