clk-54xx.c 20 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576
  1. /*
  2. * OMAP5 Clock init
  3. *
  4. * Copyright (C) 2013 Texas Instruments, Inc.
  5. *
  6. * Tero Kristo (t-kristo@ti.com)
  7. *
  8. * This program is free software; you can redistribute it and/or modify
  9. * it under the terms of the GNU General Public License version 2 as
  10. * published by the Free Software Foundation.
  11. */
  12. #include <linux/kernel.h>
  13. #include <linux/list.h>
  14. #include <linux/clk.h>
  15. #include <linux/clkdev.h>
  16. #include <linux/io.h>
  17. #include <linux/clk/ti.h>
  18. #include <dt-bindings/clock/omap5.h>
  19. #include "clock.h"
  20. #define OMAP5_DPLL_ABE_DEFFREQ 98304000
  21. /*
  22. * OMAP543x TRM, section "3.6.3.9.5 DPLL_USB Preferred Settings"
  23. * states it must be at 960MHz
  24. */
  25. #define OMAP5_DPLL_USB_DEFFREQ 960000000
  26. static const struct omap_clkctrl_reg_data omap5_mpu_clkctrl_regs[] __initconst = {
  27. { OMAP5_MPU_CLKCTRL, NULL, 0, "dpll_mpu_m2_ck" },
  28. { 0 },
  29. };
  30. static const struct omap_clkctrl_reg_data omap5_dsp_clkctrl_regs[] __initconst = {
  31. { OMAP5_MMU_DSP_CLKCTRL, NULL, CLKF_HW_SUP, "dpll_iva_h11x2_ck" },
  32. { 0 },
  33. };
  34. static const char * const omap5_dmic_gfclk_parents[] __initconst = {
  35. "abe_cm:clk:0018:26",
  36. "pad_clks_ck",
  37. "slimbus_clk",
  38. NULL,
  39. };
  40. static const char * const omap5_dmic_sync_mux_ck_parents[] __initconst = {
  41. "abe_24m_fclk",
  42. "dss_syc_gfclk_div",
  43. "func_24m_clk",
  44. NULL,
  45. };
  46. static const struct omap_clkctrl_bit_data omap5_dmic_bit_data[] __initconst = {
  47. { 24, TI_CLK_MUX, omap5_dmic_gfclk_parents, NULL },
  48. { 26, TI_CLK_MUX, omap5_dmic_sync_mux_ck_parents, NULL },
  49. { 0 },
  50. };
  51. static const char * const omap5_mcbsp1_gfclk_parents[] __initconst = {
  52. "abe_cm:clk:0028:26",
  53. "pad_clks_ck",
  54. "slimbus_clk",
  55. NULL,
  56. };
  57. static const struct omap_clkctrl_bit_data omap5_mcbsp1_bit_data[] __initconst = {
  58. { 24, TI_CLK_MUX, omap5_mcbsp1_gfclk_parents, NULL },
  59. { 26, TI_CLK_MUX, omap5_dmic_sync_mux_ck_parents, NULL },
  60. { 0 },
  61. };
  62. static const char * const omap5_mcbsp2_gfclk_parents[] __initconst = {
  63. "abe_cm:clk:0030:26",
  64. "pad_clks_ck",
  65. "slimbus_clk",
  66. NULL,
  67. };
  68. static const struct omap_clkctrl_bit_data omap5_mcbsp2_bit_data[] __initconst = {
  69. { 24, TI_CLK_MUX, omap5_mcbsp2_gfclk_parents, NULL },
  70. { 26, TI_CLK_MUX, omap5_dmic_sync_mux_ck_parents, NULL },
  71. { 0 },
  72. };
  73. static const char * const omap5_mcbsp3_gfclk_parents[] __initconst = {
  74. "abe_cm:clk:0038:26",
  75. "pad_clks_ck",
  76. "slimbus_clk",
  77. NULL,
  78. };
  79. static const struct omap_clkctrl_bit_data omap5_mcbsp3_bit_data[] __initconst = {
  80. { 24, TI_CLK_MUX, omap5_mcbsp3_gfclk_parents, NULL },
  81. { 26, TI_CLK_MUX, omap5_dmic_sync_mux_ck_parents, NULL },
  82. { 0 },
  83. };
  84. static const char * const omap5_timer5_gfclk_mux_parents[] __initconst = {
  85. "dss_syc_gfclk_div",
  86. "sys_32k_ck",
  87. NULL,
  88. };
  89. static const struct omap_clkctrl_bit_data omap5_timer5_bit_data[] __initconst = {
  90. { 24, TI_CLK_MUX, omap5_timer5_gfclk_mux_parents, NULL },
  91. { 0 },
  92. };
  93. static const struct omap_clkctrl_bit_data omap5_timer6_bit_data[] __initconst = {
  94. { 24, TI_CLK_MUX, omap5_timer5_gfclk_mux_parents, NULL },
  95. { 0 },
  96. };
  97. static const struct omap_clkctrl_bit_data omap5_timer7_bit_data[] __initconst = {
  98. { 24, TI_CLK_MUX, omap5_timer5_gfclk_mux_parents, NULL },
  99. { 0 },
  100. };
  101. static const struct omap_clkctrl_bit_data omap5_timer8_bit_data[] __initconst = {
  102. { 24, TI_CLK_MUX, omap5_timer5_gfclk_mux_parents, NULL },
  103. { 0 },
  104. };
  105. static const struct omap_clkctrl_reg_data omap5_abe_clkctrl_regs[] __initconst = {
  106. { OMAP5_L4_ABE_CLKCTRL, NULL, 0, "abe_iclk" },
  107. { OMAP5_MCPDM_CLKCTRL, NULL, CLKF_SW_SUP, "pad_clks_ck" },
  108. { OMAP5_DMIC_CLKCTRL, omap5_dmic_bit_data, CLKF_SW_SUP, "abe_cm:clk:0018:24" },
  109. { OMAP5_MCBSP1_CLKCTRL, omap5_mcbsp1_bit_data, CLKF_SW_SUP, "abe_cm:clk:0028:24" },
  110. { OMAP5_MCBSP2_CLKCTRL, omap5_mcbsp2_bit_data, CLKF_SW_SUP, "abe_cm:clk:0030:24" },
  111. { OMAP5_MCBSP3_CLKCTRL, omap5_mcbsp3_bit_data, CLKF_SW_SUP, "abe_cm:clk:0038:24" },
  112. { OMAP5_TIMER5_CLKCTRL, omap5_timer5_bit_data, CLKF_SW_SUP, "abe_cm:clk:0048:24" },
  113. { OMAP5_TIMER6_CLKCTRL, omap5_timer6_bit_data, CLKF_SW_SUP, "abe_cm:clk:0050:24" },
  114. { OMAP5_TIMER7_CLKCTRL, omap5_timer7_bit_data, CLKF_SW_SUP, "abe_cm:clk:0058:24" },
  115. { OMAP5_TIMER8_CLKCTRL, omap5_timer8_bit_data, CLKF_SW_SUP, "abe_cm:clk:0060:24" },
  116. { 0 },
  117. };
  118. static const struct omap_clkctrl_reg_data omap5_l3main1_clkctrl_regs[] __initconst = {
  119. { OMAP5_L3_MAIN_1_CLKCTRL, NULL, 0, "l3_iclk_div" },
  120. { 0 },
  121. };
  122. static const struct omap_clkctrl_reg_data omap5_l3main2_clkctrl_regs[] __initconst = {
  123. { OMAP5_L3_MAIN_2_CLKCTRL, NULL, 0, "l3_iclk_div" },
  124. { 0 },
  125. };
  126. static const struct omap_clkctrl_reg_data omap5_ipu_clkctrl_regs[] __initconst = {
  127. { OMAP5_MMU_IPU_CLKCTRL, NULL, CLKF_HW_SUP, "dpll_core_h22x2_ck" },
  128. { 0 },
  129. };
  130. static const struct omap_clkctrl_reg_data omap5_dma_clkctrl_regs[] __initconst = {
  131. { OMAP5_DMA_SYSTEM_CLKCTRL, NULL, 0, "l3_iclk_div" },
  132. { 0 },
  133. };
  134. static const struct omap_clkctrl_reg_data omap5_emif_clkctrl_regs[] __initconst = {
  135. { OMAP5_DMM_CLKCTRL, NULL, 0, "l3_iclk_div" },
  136. { OMAP5_EMIF1_CLKCTRL, NULL, CLKF_HW_SUP, "dpll_core_h11x2_ck" },
  137. { OMAP5_EMIF2_CLKCTRL, NULL, CLKF_HW_SUP, "dpll_core_h11x2_ck" },
  138. { 0 },
  139. };
  140. static const struct omap_clkctrl_reg_data omap5_l4cfg_clkctrl_regs[] __initconst = {
  141. { OMAP5_L4_CFG_CLKCTRL, NULL, 0, "l4_root_clk_div" },
  142. { OMAP5_SPINLOCK_CLKCTRL, NULL, 0, "l4_root_clk_div" },
  143. { OMAP5_MAILBOX_CLKCTRL, NULL, 0, "l4_root_clk_div" },
  144. { 0 },
  145. };
  146. static const struct omap_clkctrl_reg_data omap5_l3instr_clkctrl_regs[] __initconst = {
  147. { OMAP5_L3_MAIN_3_CLKCTRL, NULL, CLKF_HW_SUP, "l3_iclk_div" },
  148. { OMAP5_L3_INSTR_CLKCTRL, NULL, CLKF_HW_SUP, "l3_iclk_div" },
  149. { 0 },
  150. };
  151. static const char * const omap5_timer10_gfclk_mux_parents[] __initconst = {
  152. "sys_clkin",
  153. "sys_32k_ck",
  154. NULL,
  155. };
  156. static const struct omap_clkctrl_bit_data omap5_timer10_bit_data[] __initconst = {
  157. { 24, TI_CLK_MUX, omap5_timer10_gfclk_mux_parents, NULL },
  158. { 0 },
  159. };
  160. static const struct omap_clkctrl_bit_data omap5_timer11_bit_data[] __initconst = {
  161. { 24, TI_CLK_MUX, omap5_timer10_gfclk_mux_parents, NULL },
  162. { 0 },
  163. };
  164. static const struct omap_clkctrl_bit_data omap5_timer2_bit_data[] __initconst = {
  165. { 24, TI_CLK_MUX, omap5_timer10_gfclk_mux_parents, NULL },
  166. { 0 },
  167. };
  168. static const struct omap_clkctrl_bit_data omap5_timer3_bit_data[] __initconst = {
  169. { 24, TI_CLK_MUX, omap5_timer10_gfclk_mux_parents, NULL },
  170. { 0 },
  171. };
  172. static const struct omap_clkctrl_bit_data omap5_timer4_bit_data[] __initconst = {
  173. { 24, TI_CLK_MUX, omap5_timer10_gfclk_mux_parents, NULL },
  174. { 0 },
  175. };
  176. static const struct omap_clkctrl_bit_data omap5_timer9_bit_data[] __initconst = {
  177. { 24, TI_CLK_MUX, omap5_timer10_gfclk_mux_parents, NULL },
  178. { 0 },
  179. };
  180. static const char * const omap5_gpio2_dbclk_parents[] __initconst = {
  181. "sys_32k_ck",
  182. NULL,
  183. };
  184. static const struct omap_clkctrl_bit_data omap5_gpio2_bit_data[] __initconst = {
  185. { 8, TI_CLK_GATE, omap5_gpio2_dbclk_parents, NULL },
  186. { 0 },
  187. };
  188. static const struct omap_clkctrl_bit_data omap5_gpio3_bit_data[] __initconst = {
  189. { 8, TI_CLK_GATE, omap5_gpio2_dbclk_parents, NULL },
  190. { 0 },
  191. };
  192. static const struct omap_clkctrl_bit_data omap5_gpio4_bit_data[] __initconst = {
  193. { 8, TI_CLK_GATE, omap5_gpio2_dbclk_parents, NULL },
  194. { 0 },
  195. };
  196. static const struct omap_clkctrl_bit_data omap5_gpio5_bit_data[] __initconst = {
  197. { 8, TI_CLK_GATE, omap5_gpio2_dbclk_parents, NULL },
  198. { 0 },
  199. };
  200. static const struct omap_clkctrl_bit_data omap5_gpio6_bit_data[] __initconst = {
  201. { 8, TI_CLK_GATE, omap5_gpio2_dbclk_parents, NULL },
  202. { 0 },
  203. };
  204. static const struct omap_clkctrl_bit_data omap5_gpio7_bit_data[] __initconst = {
  205. { 8, TI_CLK_GATE, omap5_gpio2_dbclk_parents, NULL },
  206. { 0 },
  207. };
  208. static const struct omap_clkctrl_bit_data omap5_gpio8_bit_data[] __initconst = {
  209. { 8, TI_CLK_GATE, omap5_gpio2_dbclk_parents, NULL },
  210. { 0 },
  211. };
  212. static const struct omap_clkctrl_reg_data omap5_l4per_clkctrl_regs[] __initconst = {
  213. { OMAP5_TIMER10_CLKCTRL, omap5_timer10_bit_data, CLKF_SW_SUP, "l4per_cm:clk:0008:24" },
  214. { OMAP5_TIMER11_CLKCTRL, omap5_timer11_bit_data, CLKF_SW_SUP, "l4per_cm:clk:0010:24" },
  215. { OMAP5_TIMER2_CLKCTRL, omap5_timer2_bit_data, CLKF_SW_SUP, "l4per_cm:clk:0018:24" },
  216. { OMAP5_TIMER3_CLKCTRL, omap5_timer3_bit_data, CLKF_SW_SUP, "l4per_cm:clk:0020:24" },
  217. { OMAP5_TIMER4_CLKCTRL, omap5_timer4_bit_data, CLKF_SW_SUP, "l4per_cm:clk:0028:24" },
  218. { OMAP5_TIMER9_CLKCTRL, omap5_timer9_bit_data, CLKF_SW_SUP, "l4per_cm:clk:0030:24" },
  219. { OMAP5_GPIO2_CLKCTRL, omap5_gpio2_bit_data, CLKF_HW_SUP, "l4_root_clk_div" },
  220. { OMAP5_GPIO3_CLKCTRL, omap5_gpio3_bit_data, CLKF_HW_SUP, "l4_root_clk_div" },
  221. { OMAP5_GPIO4_CLKCTRL, omap5_gpio4_bit_data, CLKF_HW_SUP, "l4_root_clk_div" },
  222. { OMAP5_GPIO5_CLKCTRL, omap5_gpio5_bit_data, CLKF_HW_SUP, "l4_root_clk_div" },
  223. { OMAP5_GPIO6_CLKCTRL, omap5_gpio6_bit_data, CLKF_HW_SUP, "l4_root_clk_div" },
  224. { OMAP5_I2C1_CLKCTRL, NULL, CLKF_SW_SUP, "func_96m_fclk" },
  225. { OMAP5_I2C2_CLKCTRL, NULL, CLKF_SW_SUP, "func_96m_fclk" },
  226. { OMAP5_I2C3_CLKCTRL, NULL, CLKF_SW_SUP, "func_96m_fclk" },
  227. { OMAP5_I2C4_CLKCTRL, NULL, CLKF_SW_SUP, "func_96m_fclk" },
  228. { OMAP5_L4_PER_CLKCTRL, NULL, 0, "l4_root_clk_div" },
  229. { OMAP5_MCSPI1_CLKCTRL, NULL, CLKF_SW_SUP, "func_48m_fclk" },
  230. { OMAP5_MCSPI2_CLKCTRL, NULL, CLKF_SW_SUP, "func_48m_fclk" },
  231. { OMAP5_MCSPI3_CLKCTRL, NULL, CLKF_SW_SUP, "func_48m_fclk" },
  232. { OMAP5_MCSPI4_CLKCTRL, NULL, CLKF_SW_SUP, "func_48m_fclk" },
  233. { OMAP5_GPIO7_CLKCTRL, omap5_gpio7_bit_data, CLKF_HW_SUP, "l4_root_clk_div" },
  234. { OMAP5_GPIO8_CLKCTRL, omap5_gpio8_bit_data, CLKF_HW_SUP, "l4_root_clk_div" },
  235. { OMAP5_MMC3_CLKCTRL, NULL, CLKF_SW_SUP, "func_48m_fclk" },
  236. { OMAP5_MMC4_CLKCTRL, NULL, CLKF_SW_SUP, "func_48m_fclk" },
  237. { OMAP5_UART1_CLKCTRL, NULL, CLKF_SW_SUP, "func_48m_fclk" },
  238. { OMAP5_UART2_CLKCTRL, NULL, CLKF_SW_SUP, "func_48m_fclk" },
  239. { OMAP5_UART3_CLKCTRL, NULL, CLKF_SW_SUP, "func_48m_fclk" },
  240. { OMAP5_UART4_CLKCTRL, NULL, CLKF_SW_SUP, "func_48m_fclk" },
  241. { OMAP5_MMC5_CLKCTRL, NULL, CLKF_SW_SUP, "func_96m_fclk" },
  242. { OMAP5_I2C5_CLKCTRL, NULL, CLKF_SW_SUP, "func_96m_fclk" },
  243. { OMAP5_UART5_CLKCTRL, NULL, CLKF_SW_SUP, "func_48m_fclk" },
  244. { OMAP5_UART6_CLKCTRL, NULL, CLKF_SW_SUP, "func_48m_fclk" },
  245. { 0 },
  246. };
  247. static const char * const omap5_dss_dss_clk_parents[] __initconst = {
  248. "dpll_per_h12x2_ck",
  249. NULL,
  250. };
  251. static const char * const omap5_dss_48mhz_clk_parents[] __initconst = {
  252. "func_48m_fclk",
  253. NULL,
  254. };
  255. static const char * const omap5_dss_sys_clk_parents[] __initconst = {
  256. "dss_syc_gfclk_div",
  257. NULL,
  258. };
  259. static const struct omap_clkctrl_bit_data omap5_dss_core_bit_data[] __initconst = {
  260. { 8, TI_CLK_GATE, omap5_dss_dss_clk_parents, NULL },
  261. { 9, TI_CLK_GATE, omap5_dss_48mhz_clk_parents, NULL },
  262. { 10, TI_CLK_GATE, omap5_dss_sys_clk_parents, NULL },
  263. { 11, TI_CLK_GATE, omap5_gpio2_dbclk_parents, NULL },
  264. { 0 },
  265. };
  266. static const struct omap_clkctrl_reg_data omap5_dss_clkctrl_regs[] __initconst = {
  267. { OMAP5_DSS_CORE_CLKCTRL, omap5_dss_core_bit_data, CLKF_SW_SUP, "dss_cm:clk:0000:8" },
  268. { 0 },
  269. };
  270. static const char * const omap5_mmc1_fclk_mux_parents[] __initconst = {
  271. "func_128m_clk",
  272. "dpll_per_m2x2_ck",
  273. NULL,
  274. };
  275. static const char * const omap5_mmc1_fclk_parents[] __initconst = {
  276. "l3init_cm:clk:0008:24",
  277. NULL,
  278. };
  279. static const struct omap_clkctrl_div_data omap5_mmc1_fclk_data __initconst = {
  280. .max_div = 2,
  281. };
  282. static const struct omap_clkctrl_bit_data omap5_mmc1_bit_data[] __initconst = {
  283. { 8, TI_CLK_GATE, omap5_gpio2_dbclk_parents, NULL },
  284. { 24, TI_CLK_MUX, omap5_mmc1_fclk_mux_parents, NULL },
  285. { 25, TI_CLK_DIVIDER, omap5_mmc1_fclk_parents, &omap5_mmc1_fclk_data },
  286. { 0 },
  287. };
  288. static const char * const omap5_mmc2_fclk_parents[] __initconst = {
  289. "l3init_cm:clk:0010:24",
  290. NULL,
  291. };
  292. static const struct omap_clkctrl_div_data omap5_mmc2_fclk_data __initconst = {
  293. .max_div = 2,
  294. };
  295. static const struct omap_clkctrl_bit_data omap5_mmc2_bit_data[] __initconst = {
  296. { 24, TI_CLK_MUX, omap5_mmc1_fclk_mux_parents, NULL },
  297. { 25, TI_CLK_DIVIDER, omap5_mmc2_fclk_parents, &omap5_mmc2_fclk_data },
  298. { 0 },
  299. };
  300. static const char * const omap5_usb_host_hs_hsic60m_p3_clk_parents[] __initconst = {
  301. "l3init_60m_fclk",
  302. NULL,
  303. };
  304. static const char * const omap5_usb_host_hs_hsic480m_p3_clk_parents[] __initconst = {
  305. "dpll_usb_m2_ck",
  306. NULL,
  307. };
  308. static const char * const omap5_usb_host_hs_utmi_p1_clk_parents[] __initconst = {
  309. "l3init_cm:clk:0038:24",
  310. NULL,
  311. };
  312. static const char * const omap5_usb_host_hs_utmi_p2_clk_parents[] __initconst = {
  313. "l3init_cm:clk:0038:25",
  314. NULL,
  315. };
  316. static const char * const omap5_utmi_p1_gfclk_parents[] __initconst = {
  317. "l3init_60m_fclk",
  318. "xclk60mhsp1_ck",
  319. NULL,
  320. };
  321. static const char * const omap5_utmi_p2_gfclk_parents[] __initconst = {
  322. "l3init_60m_fclk",
  323. "xclk60mhsp2_ck",
  324. NULL,
  325. };
  326. static const struct omap_clkctrl_bit_data omap5_usb_host_hs_bit_data[] __initconst = {
  327. { 6, TI_CLK_GATE, omap5_usb_host_hs_hsic60m_p3_clk_parents, NULL },
  328. { 7, TI_CLK_GATE, omap5_usb_host_hs_hsic480m_p3_clk_parents, NULL },
  329. { 8, TI_CLK_GATE, omap5_usb_host_hs_utmi_p1_clk_parents, NULL },
  330. { 9, TI_CLK_GATE, omap5_usb_host_hs_utmi_p2_clk_parents, NULL },
  331. { 10, TI_CLK_GATE, omap5_usb_host_hs_hsic60m_p3_clk_parents, NULL },
  332. { 11, TI_CLK_GATE, omap5_usb_host_hs_hsic60m_p3_clk_parents, NULL },
  333. { 12, TI_CLK_GATE, omap5_usb_host_hs_hsic60m_p3_clk_parents, NULL },
  334. { 13, TI_CLK_GATE, omap5_usb_host_hs_hsic480m_p3_clk_parents, NULL },
  335. { 14, TI_CLK_GATE, omap5_usb_host_hs_hsic480m_p3_clk_parents, NULL },
  336. { 24, TI_CLK_MUX, omap5_utmi_p1_gfclk_parents, NULL },
  337. { 25, TI_CLK_MUX, omap5_utmi_p2_gfclk_parents, NULL },
  338. { 0 },
  339. };
  340. static const struct omap_clkctrl_bit_data omap5_usb_tll_hs_bit_data[] __initconst = {
  341. { 8, TI_CLK_GATE, omap5_usb_host_hs_hsic60m_p3_clk_parents, NULL },
  342. { 9, TI_CLK_GATE, omap5_usb_host_hs_hsic60m_p3_clk_parents, NULL },
  343. { 10, TI_CLK_GATE, omap5_usb_host_hs_hsic60m_p3_clk_parents, NULL },
  344. { 0 },
  345. };
  346. static const char * const omap5_sata_ref_clk_parents[] __initconst = {
  347. "sys_clkin",
  348. NULL,
  349. };
  350. static const struct omap_clkctrl_bit_data omap5_sata_bit_data[] __initconst = {
  351. { 8, TI_CLK_GATE, omap5_sata_ref_clk_parents, NULL },
  352. { 0 },
  353. };
  354. static const char * const omap5_usb_otg_ss_refclk960m_parents[] __initconst = {
  355. "dpll_usb_clkdcoldo",
  356. NULL,
  357. };
  358. static const struct omap_clkctrl_bit_data omap5_usb_otg_ss_bit_data[] __initconst = {
  359. { 8, TI_CLK_GATE, omap5_usb_otg_ss_refclk960m_parents, NULL },
  360. { 0 },
  361. };
  362. static const struct omap_clkctrl_reg_data omap5_l3init_clkctrl_regs[] __initconst = {
  363. { OMAP5_MMC1_CLKCTRL, omap5_mmc1_bit_data, CLKF_SW_SUP, "l3init_cm:clk:0008:25" },
  364. { OMAP5_MMC2_CLKCTRL, omap5_mmc2_bit_data, CLKF_SW_SUP, "l3init_cm:clk:0010:25" },
  365. { OMAP5_USB_HOST_HS_CLKCTRL, omap5_usb_host_hs_bit_data, CLKF_SW_SUP, "l3init_60m_fclk" },
  366. { OMAP5_USB_TLL_HS_CLKCTRL, omap5_usb_tll_hs_bit_data, CLKF_HW_SUP, "l4_root_clk_div" },
  367. { OMAP5_SATA_CLKCTRL, omap5_sata_bit_data, CLKF_SW_SUP, "func_48m_fclk" },
  368. { OMAP5_OCP2SCP1_CLKCTRL, NULL, CLKF_HW_SUP, "l4_root_clk_div" },
  369. { OMAP5_OCP2SCP3_CLKCTRL, NULL, CLKF_HW_SUP, "l4_root_clk_div" },
  370. { OMAP5_USB_OTG_SS_CLKCTRL, omap5_usb_otg_ss_bit_data, CLKF_HW_SUP, "dpll_core_h13x2_ck" },
  371. { 0 },
  372. };
  373. static const struct omap_clkctrl_bit_data omap5_gpio1_bit_data[] __initconst = {
  374. { 8, TI_CLK_GATE, omap5_gpio2_dbclk_parents, NULL },
  375. { 0 },
  376. };
  377. static const struct omap_clkctrl_bit_data omap5_timer1_bit_data[] __initconst = {
  378. { 24, TI_CLK_MUX, omap5_timer10_gfclk_mux_parents, NULL },
  379. { 0 },
  380. };
  381. static const struct omap_clkctrl_reg_data omap5_wkupaon_clkctrl_regs[] __initconst = {
  382. { OMAP5_L4_WKUP_CLKCTRL, NULL, 0, "wkupaon_iclk_mux" },
  383. { OMAP5_WD_TIMER2_CLKCTRL, NULL, CLKF_SW_SUP, "sys_32k_ck" },
  384. { OMAP5_GPIO1_CLKCTRL, omap5_gpio1_bit_data, CLKF_HW_SUP, "wkupaon_iclk_mux" },
  385. { OMAP5_TIMER1_CLKCTRL, omap5_timer1_bit_data, CLKF_SW_SUP, "wkupaon_cm:clk:0020:24" },
  386. { OMAP5_COUNTER_32K_CLKCTRL, NULL, 0, "wkupaon_iclk_mux" },
  387. { OMAP5_KBD_CLKCTRL, NULL, CLKF_SW_SUP, "sys_32k_ck" },
  388. { 0 },
  389. };
  390. const struct omap_clkctrl_data omap5_clkctrl_data[] __initconst = {
  391. { 0x4a004320, omap5_mpu_clkctrl_regs },
  392. { 0x4a004420, omap5_dsp_clkctrl_regs },
  393. { 0x4a004520, omap5_abe_clkctrl_regs },
  394. { 0x4a008720, omap5_l3main1_clkctrl_regs },
  395. { 0x4a008820, omap5_l3main2_clkctrl_regs },
  396. { 0x4a008920, omap5_ipu_clkctrl_regs },
  397. { 0x4a008a20, omap5_dma_clkctrl_regs },
  398. { 0x4a008b20, omap5_emif_clkctrl_regs },
  399. { 0x4a008d20, omap5_l4cfg_clkctrl_regs },
  400. { 0x4a008e20, omap5_l3instr_clkctrl_regs },
  401. { 0x4a009020, omap5_l4per_clkctrl_regs },
  402. { 0x4a009420, omap5_dss_clkctrl_regs },
  403. { 0x4a009620, omap5_l3init_clkctrl_regs },
  404. { 0x4ae07920, omap5_wkupaon_clkctrl_regs },
  405. { 0 },
  406. };
  407. static struct ti_dt_clk omap54xx_clks[] = {
  408. DT_CLK(NULL, "timer_32k_ck", "sys_32k_ck"),
  409. DT_CLK(NULL, "sys_clkin_ck", "sys_clkin"),
  410. DT_CLK(NULL, "dmic_gfclk", "abe_cm:0018:24"),
  411. DT_CLK(NULL, "dmic_sync_mux_ck", "abe_cm:0018:26"),
  412. DT_CLK(NULL, "dss_32khz_clk", "dss_cm:0000:11"),
  413. DT_CLK(NULL, "dss_48mhz_clk", "dss_cm:0000:9"),
  414. DT_CLK(NULL, "dss_dss_clk", "dss_cm:0000:8"),
  415. DT_CLK(NULL, "dss_sys_clk", "dss_cm:0000:10"),
  416. DT_CLK(NULL, "gpio1_dbclk", "wkupaon_cm:0018:8"),
  417. DT_CLK(NULL, "gpio2_dbclk", "l4per_cm:0040:8"),
  418. DT_CLK(NULL, "gpio3_dbclk", "l4per_cm:0048:8"),
  419. DT_CLK(NULL, "gpio4_dbclk", "l4per_cm:0050:8"),
  420. DT_CLK(NULL, "gpio5_dbclk", "l4per_cm:0058:8"),
  421. DT_CLK(NULL, "gpio6_dbclk", "l4per_cm:0060:8"),
  422. DT_CLK(NULL, "gpio7_dbclk", "l4per_cm:00f0:8"),
  423. DT_CLK(NULL, "gpio8_dbclk", "l4per_cm:00f8:8"),
  424. DT_CLK(NULL, "mcbsp1_gfclk", "abe_cm:0028:24"),
  425. DT_CLK(NULL, "mcbsp1_sync_mux_ck", "abe_cm:0028:26"),
  426. DT_CLK(NULL, "mcbsp2_gfclk", "abe_cm:0030:24"),
  427. DT_CLK(NULL, "mcbsp2_sync_mux_ck", "abe_cm:0030:26"),
  428. DT_CLK(NULL, "mcbsp3_gfclk", "abe_cm:0038:24"),
  429. DT_CLK(NULL, "mcbsp3_sync_mux_ck", "abe_cm:0038:26"),
  430. DT_CLK(NULL, "mmc1_32khz_clk", "l3init_cm:0008:8"),
  431. DT_CLK(NULL, "mmc1_fclk", "l3init_cm:0008:25"),
  432. DT_CLK(NULL, "mmc1_fclk_mux", "l3init_cm:0008:24"),
  433. DT_CLK(NULL, "mmc2_fclk", "l3init_cm:0010:25"),
  434. DT_CLK(NULL, "mmc2_fclk_mux", "l3init_cm:0010:24"),
  435. DT_CLK(NULL, "sata_ref_clk", "l3init_cm:0068:8"),
  436. DT_CLK(NULL, "timer10_gfclk_mux", "l4per_cm:0008:24"),
  437. DT_CLK(NULL, "timer11_gfclk_mux", "l4per_cm:0010:24"),
  438. DT_CLK(NULL, "timer1_gfclk_mux", "wkupaon_cm:0020:24"),
  439. DT_CLK(NULL, "timer2_gfclk_mux", "l4per_cm:0018:24"),
  440. DT_CLK(NULL, "timer3_gfclk_mux", "l4per_cm:0020:24"),
  441. DT_CLK(NULL, "timer4_gfclk_mux", "l4per_cm:0028:24"),
  442. DT_CLK(NULL, "timer5_gfclk_mux", "abe_cm:0048:24"),
  443. DT_CLK(NULL, "timer6_gfclk_mux", "abe_cm:0050:24"),
  444. DT_CLK(NULL, "timer7_gfclk_mux", "abe_cm:0058:24"),
  445. DT_CLK(NULL, "timer8_gfclk_mux", "abe_cm:0060:24"),
  446. DT_CLK(NULL, "timer9_gfclk_mux", "l4per_cm:0030:24"),
  447. DT_CLK(NULL, "usb_host_hs_hsic480m_p1_clk", "l3init_cm:0038:13"),
  448. DT_CLK(NULL, "usb_host_hs_hsic480m_p2_clk", "l3init_cm:0038:14"),
  449. DT_CLK(NULL, "usb_host_hs_hsic480m_p3_clk", "l3init_cm:0038:7"),
  450. DT_CLK(NULL, "usb_host_hs_hsic60m_p1_clk", "l3init_cm:0038:11"),
  451. DT_CLK(NULL, "usb_host_hs_hsic60m_p2_clk", "l3init_cm:0038:12"),
  452. DT_CLK(NULL, "usb_host_hs_hsic60m_p3_clk", "l3init_cm:0038:6"),
  453. DT_CLK(NULL, "usb_host_hs_utmi_p1_clk", "l3init_cm:0038:8"),
  454. DT_CLK(NULL, "usb_host_hs_utmi_p2_clk", "l3init_cm:0038:9"),
  455. DT_CLK(NULL, "usb_host_hs_utmi_p3_clk", "l3init_cm:0038:10"),
  456. DT_CLK(NULL, "usb_otg_ss_refclk960m", "l3init_cm:00d0:8"),
  457. DT_CLK(NULL, "usb_tll_hs_usb_ch0_clk", "l3init_cm:0048:8"),
  458. DT_CLK(NULL, "usb_tll_hs_usb_ch1_clk", "l3init_cm:0048:9"),
  459. DT_CLK(NULL, "usb_tll_hs_usb_ch2_clk", "l3init_cm:0048:10"),
  460. DT_CLK(NULL, "utmi_p1_gfclk", "l3init_cm:0038:24"),
  461. DT_CLK(NULL, "utmi_p2_gfclk", "l3init_cm:0038:25"),
  462. { .node_name = NULL },
  463. };
  464. int __init omap5xxx_dt_clk_init(void)
  465. {
  466. int rc;
  467. struct clk *abe_dpll_ref, *abe_dpll, *sys_32k_ck, *usb_dpll;
  468. ti_dt_clocks_register(omap54xx_clks);
  469. omap2_clk_disable_autoidle_all();
  470. ti_clk_add_aliases();
  471. abe_dpll_ref = clk_get_sys(NULL, "abe_dpll_clk_mux");
  472. sys_32k_ck = clk_get_sys(NULL, "sys_32k_ck");
  473. rc = clk_set_parent(abe_dpll_ref, sys_32k_ck);
  474. abe_dpll = clk_get_sys(NULL, "dpll_abe_ck");
  475. if (!rc)
  476. rc = clk_set_rate(abe_dpll, OMAP5_DPLL_ABE_DEFFREQ);
  477. if (rc)
  478. pr_err("%s: failed to configure ABE DPLL!\n", __func__);
  479. abe_dpll = clk_get_sys(NULL, "dpll_abe_m2x2_ck");
  480. if (!rc)
  481. rc = clk_set_rate(abe_dpll, OMAP5_DPLL_ABE_DEFFREQ * 2);
  482. if (rc)
  483. pr_err("%s: failed to configure ABE m2x2 DPLL!\n", __func__);
  484. usb_dpll = clk_get_sys(NULL, "dpll_usb_ck");
  485. rc = clk_set_rate(usb_dpll, OMAP5_DPLL_USB_DEFFREQ);
  486. if (rc)
  487. pr_err("%s: failed to configure USB DPLL!\n", __func__);
  488. usb_dpll = clk_get_sys(NULL, "dpll_usb_m2_ck");
  489. rc = clk_set_rate(usb_dpll, OMAP5_DPLL_USB_DEFFREQ/2);
  490. if (rc)
  491. pr_err("%s: failed to set USB_DPLL M2 OUT\n", __func__);
  492. return 0;
  493. }