clk-bcm281xx.c 9.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367
  1. // SPDX-License-Identifier: GPL-2.0-only
  2. /*
  3. * Copyright (C) 2013 Broadcom Corporation
  4. * Copyright 2013 Linaro Limited
  5. */
  6. #include "clk-kona.h"
  7. #include "dt-bindings/clock/bcm281xx.h"
  8. #define BCM281XX_CCU_COMMON(_name, _ucase_name) \
  9. KONA_CCU_COMMON(BCM281XX, _name, _ucase_name)
  10. /* Root CCU */
  11. static struct peri_clk_data frac_1m_data = {
  12. .gate = HW_SW_GATE(0x214, 16, 0, 1),
  13. .trig = TRIGGER(0x0e04, 0),
  14. .div = FRAC_DIVIDER(0x0e00, 0, 22, 16),
  15. .clocks = CLOCKS("ref_crystal"),
  16. };
  17. static struct ccu_data root_ccu_data = {
  18. BCM281XX_CCU_COMMON(root, ROOT),
  19. .kona_clks = {
  20. [BCM281XX_ROOT_CCU_FRAC_1M] =
  21. KONA_CLK(root, frac_1m, peri),
  22. [BCM281XX_ROOT_CCU_CLOCK_COUNT] = LAST_KONA_CLK,
  23. },
  24. };
  25. /* AON CCU */
  26. static struct peri_clk_data hub_timer_data = {
  27. .gate = HW_SW_GATE(0x0414, 16, 0, 1),
  28. .clocks = CLOCKS("bbl_32k",
  29. "frac_1m",
  30. "dft_19_5m"),
  31. .sel = SELECTOR(0x0a10, 0, 2),
  32. .trig = TRIGGER(0x0a40, 4),
  33. };
  34. static struct peri_clk_data pmu_bsc_data = {
  35. .gate = HW_SW_GATE(0x0418, 16, 0, 1),
  36. .clocks = CLOCKS("ref_crystal",
  37. "pmu_bsc_var",
  38. "bbl_32k"),
  39. .sel = SELECTOR(0x0a04, 0, 2),
  40. .div = DIVIDER(0x0a04, 3, 4),
  41. .trig = TRIGGER(0x0a40, 0),
  42. };
  43. static struct peri_clk_data pmu_bsc_var_data = {
  44. .clocks = CLOCKS("var_312m",
  45. "ref_312m"),
  46. .sel = SELECTOR(0x0a00, 0, 2),
  47. .div = DIVIDER(0x0a00, 4, 5),
  48. .trig = TRIGGER(0x0a40, 2),
  49. };
  50. static struct ccu_data aon_ccu_data = {
  51. BCM281XX_CCU_COMMON(aon, AON),
  52. .kona_clks = {
  53. [BCM281XX_AON_CCU_HUB_TIMER] =
  54. KONA_CLK(aon, hub_timer, peri),
  55. [BCM281XX_AON_CCU_PMU_BSC] =
  56. KONA_CLK(aon, pmu_bsc, peri),
  57. [BCM281XX_AON_CCU_PMU_BSC_VAR] =
  58. KONA_CLK(aon, pmu_bsc_var, peri),
  59. [BCM281XX_AON_CCU_CLOCK_COUNT] = LAST_KONA_CLK,
  60. },
  61. };
  62. /* Hub CCU */
  63. static struct peri_clk_data tmon_1m_data = {
  64. .gate = HW_SW_GATE(0x04a4, 18, 2, 3),
  65. .clocks = CLOCKS("ref_crystal",
  66. "frac_1m"),
  67. .sel = SELECTOR(0x0e74, 0, 2),
  68. .trig = TRIGGER(0x0e84, 1),
  69. };
  70. static struct ccu_data hub_ccu_data = {
  71. BCM281XX_CCU_COMMON(hub, HUB),
  72. .kona_clks = {
  73. [BCM281XX_HUB_CCU_TMON_1M] =
  74. KONA_CLK(hub, tmon_1m, peri),
  75. [BCM281XX_HUB_CCU_CLOCK_COUNT] = LAST_KONA_CLK,
  76. },
  77. };
  78. /* Master CCU */
  79. static struct peri_clk_data sdio1_data = {
  80. .gate = HW_SW_GATE(0x0358, 18, 2, 3),
  81. .clocks = CLOCKS("ref_crystal",
  82. "var_52m",
  83. "ref_52m",
  84. "var_96m",
  85. "ref_96m"),
  86. .sel = SELECTOR(0x0a28, 0, 3),
  87. .div = DIVIDER(0x0a28, 4, 14),
  88. .trig = TRIGGER(0x0afc, 9),
  89. };
  90. static struct peri_clk_data sdio2_data = {
  91. .gate = HW_SW_GATE(0x035c, 18, 2, 3),
  92. .clocks = CLOCKS("ref_crystal",
  93. "var_52m",
  94. "ref_52m",
  95. "var_96m",
  96. "ref_96m"),
  97. .sel = SELECTOR(0x0a2c, 0, 3),
  98. .div = DIVIDER(0x0a2c, 4, 14),
  99. .trig = TRIGGER(0x0afc, 10),
  100. };
  101. static struct peri_clk_data sdio3_data = {
  102. .gate = HW_SW_GATE(0x0364, 18, 2, 3),
  103. .clocks = CLOCKS("ref_crystal",
  104. "var_52m",
  105. "ref_52m",
  106. "var_96m",
  107. "ref_96m"),
  108. .sel = SELECTOR(0x0a34, 0, 3),
  109. .div = DIVIDER(0x0a34, 4, 14),
  110. .trig = TRIGGER(0x0afc, 12),
  111. };
  112. static struct peri_clk_data sdio4_data = {
  113. .gate = HW_SW_GATE(0x0360, 18, 2, 3),
  114. .clocks = CLOCKS("ref_crystal",
  115. "var_52m",
  116. "ref_52m",
  117. "var_96m",
  118. "ref_96m"),
  119. .sel = SELECTOR(0x0a30, 0, 3),
  120. .div = DIVIDER(0x0a30, 4, 14),
  121. .trig = TRIGGER(0x0afc, 11),
  122. };
  123. static struct peri_clk_data usb_ic_data = {
  124. .gate = HW_SW_GATE(0x0354, 18, 2, 3),
  125. .clocks = CLOCKS("ref_crystal",
  126. "var_96m",
  127. "ref_96m"),
  128. .div = FIXED_DIVIDER(2),
  129. .sel = SELECTOR(0x0a24, 0, 2),
  130. .trig = TRIGGER(0x0afc, 7),
  131. };
  132. /* also called usbh_48m */
  133. static struct peri_clk_data hsic2_48m_data = {
  134. .gate = HW_SW_GATE(0x0370, 18, 2, 3),
  135. .clocks = CLOCKS("ref_crystal",
  136. "var_96m",
  137. "ref_96m"),
  138. .sel = SELECTOR(0x0a38, 0, 2),
  139. .div = FIXED_DIVIDER(2),
  140. .trig = TRIGGER(0x0afc, 5),
  141. };
  142. /* also called usbh_12m */
  143. static struct peri_clk_data hsic2_12m_data = {
  144. .gate = HW_SW_GATE(0x0370, 20, 4, 5),
  145. .div = DIVIDER(0x0a38, 12, 2),
  146. .clocks = CLOCKS("ref_crystal",
  147. "var_96m",
  148. "ref_96m"),
  149. .pre_div = FIXED_DIVIDER(2),
  150. .sel = SELECTOR(0x0a38, 0, 2),
  151. .trig = TRIGGER(0x0afc, 5),
  152. };
  153. static struct ccu_data master_ccu_data = {
  154. BCM281XX_CCU_COMMON(master, MASTER),
  155. .kona_clks = {
  156. [BCM281XX_MASTER_CCU_SDIO1] =
  157. KONA_CLK(master, sdio1, peri),
  158. [BCM281XX_MASTER_CCU_SDIO2] =
  159. KONA_CLK(master, sdio2, peri),
  160. [BCM281XX_MASTER_CCU_SDIO3] =
  161. KONA_CLK(master, sdio3, peri),
  162. [BCM281XX_MASTER_CCU_SDIO4] =
  163. KONA_CLK(master, sdio4, peri),
  164. [BCM281XX_MASTER_CCU_USB_IC] =
  165. KONA_CLK(master, usb_ic, peri),
  166. [BCM281XX_MASTER_CCU_HSIC2_48M] =
  167. KONA_CLK(master, hsic2_48m, peri),
  168. [BCM281XX_MASTER_CCU_HSIC2_12M] =
  169. KONA_CLK(master, hsic2_12m, peri),
  170. [BCM281XX_MASTER_CCU_CLOCK_COUNT] = LAST_KONA_CLK,
  171. },
  172. };
  173. /* Slave CCU */
  174. static struct peri_clk_data uartb_data = {
  175. .gate = HW_SW_GATE(0x0400, 18, 2, 3),
  176. .clocks = CLOCKS("ref_crystal",
  177. "var_156m",
  178. "ref_156m"),
  179. .sel = SELECTOR(0x0a10, 0, 2),
  180. .div = FRAC_DIVIDER(0x0a10, 4, 12, 8),
  181. .trig = TRIGGER(0x0afc, 2),
  182. };
  183. static struct peri_clk_data uartb2_data = {
  184. .gate = HW_SW_GATE(0x0404, 18, 2, 3),
  185. .clocks = CLOCKS("ref_crystal",
  186. "var_156m",
  187. "ref_156m"),
  188. .sel = SELECTOR(0x0a14, 0, 2),
  189. .div = FRAC_DIVIDER(0x0a14, 4, 12, 8),
  190. .trig = TRIGGER(0x0afc, 3),
  191. };
  192. static struct peri_clk_data uartb3_data = {
  193. .gate = HW_SW_GATE(0x0408, 18, 2, 3),
  194. .clocks = CLOCKS("ref_crystal",
  195. "var_156m",
  196. "ref_156m"),
  197. .sel = SELECTOR(0x0a18, 0, 2),
  198. .div = FRAC_DIVIDER(0x0a18, 4, 12, 8),
  199. .trig = TRIGGER(0x0afc, 4),
  200. };
  201. static struct peri_clk_data uartb4_data = {
  202. .gate = HW_SW_GATE(0x0408, 18, 2, 3),
  203. .clocks = CLOCKS("ref_crystal",
  204. "var_156m",
  205. "ref_156m"),
  206. .sel = SELECTOR(0x0a1c, 0, 2),
  207. .div = FRAC_DIVIDER(0x0a1c, 4, 12, 8),
  208. .trig = TRIGGER(0x0afc, 5),
  209. };
  210. static struct peri_clk_data ssp0_data = {
  211. .gate = HW_SW_GATE(0x0410, 18, 2, 3),
  212. .clocks = CLOCKS("ref_crystal",
  213. "var_104m",
  214. "ref_104m",
  215. "var_96m",
  216. "ref_96m"),
  217. .sel = SELECTOR(0x0a20, 0, 3),
  218. .div = DIVIDER(0x0a20, 4, 14),
  219. .trig = TRIGGER(0x0afc, 6),
  220. };
  221. static struct peri_clk_data ssp2_data = {
  222. .gate = HW_SW_GATE(0x0418, 18, 2, 3),
  223. .clocks = CLOCKS("ref_crystal",
  224. "var_104m",
  225. "ref_104m",
  226. "var_96m",
  227. "ref_96m"),
  228. .sel = SELECTOR(0x0a28, 0, 3),
  229. .div = DIVIDER(0x0a28, 4, 14),
  230. .trig = TRIGGER(0x0afc, 8),
  231. };
  232. static struct peri_clk_data bsc1_data = {
  233. .gate = HW_SW_GATE(0x0458, 18, 2, 3),
  234. .clocks = CLOCKS("ref_crystal",
  235. "var_104m",
  236. "ref_104m",
  237. "var_13m",
  238. "ref_13m"),
  239. .sel = SELECTOR(0x0a64, 0, 3),
  240. .trig = TRIGGER(0x0afc, 23),
  241. };
  242. static struct peri_clk_data bsc2_data = {
  243. .gate = HW_SW_GATE(0x045c, 18, 2, 3),
  244. .clocks = CLOCKS("ref_crystal",
  245. "var_104m",
  246. "ref_104m",
  247. "var_13m",
  248. "ref_13m"),
  249. .sel = SELECTOR(0x0a68, 0, 3),
  250. .trig = TRIGGER(0x0afc, 24),
  251. };
  252. static struct peri_clk_data bsc3_data = {
  253. .gate = HW_SW_GATE(0x0484, 18, 2, 3),
  254. .clocks = CLOCKS("ref_crystal",
  255. "var_104m",
  256. "ref_104m",
  257. "var_13m",
  258. "ref_13m"),
  259. .sel = SELECTOR(0x0a84, 0, 3),
  260. .trig = TRIGGER(0x0b00, 2),
  261. };
  262. static struct peri_clk_data pwm_data = {
  263. .gate = HW_SW_GATE(0x0468, 18, 2, 3),
  264. .clocks = CLOCKS("ref_crystal",
  265. "var_104m"),
  266. .sel = SELECTOR(0x0a70, 0, 2),
  267. .div = DIVIDER(0x0a70, 4, 3),
  268. .trig = TRIGGER(0x0afc, 15),
  269. };
  270. static struct ccu_data slave_ccu_data = {
  271. BCM281XX_CCU_COMMON(slave, SLAVE),
  272. .kona_clks = {
  273. [BCM281XX_SLAVE_CCU_UARTB] =
  274. KONA_CLK(slave, uartb, peri),
  275. [BCM281XX_SLAVE_CCU_UARTB2] =
  276. KONA_CLK(slave, uartb2, peri),
  277. [BCM281XX_SLAVE_CCU_UARTB3] =
  278. KONA_CLK(slave, uartb3, peri),
  279. [BCM281XX_SLAVE_CCU_UARTB4] =
  280. KONA_CLK(slave, uartb4, peri),
  281. [BCM281XX_SLAVE_CCU_SSP0] =
  282. KONA_CLK(slave, ssp0, peri),
  283. [BCM281XX_SLAVE_CCU_SSP2] =
  284. KONA_CLK(slave, ssp2, peri),
  285. [BCM281XX_SLAVE_CCU_BSC1] =
  286. KONA_CLK(slave, bsc1, peri),
  287. [BCM281XX_SLAVE_CCU_BSC2] =
  288. KONA_CLK(slave, bsc2, peri),
  289. [BCM281XX_SLAVE_CCU_BSC3] =
  290. KONA_CLK(slave, bsc3, peri),
  291. [BCM281XX_SLAVE_CCU_PWM] =
  292. KONA_CLK(slave, pwm, peri),
  293. [BCM281XX_SLAVE_CCU_CLOCK_COUNT] = LAST_KONA_CLK,
  294. },
  295. };
  296. /* Device tree match table callback functions */
  297. static void __init kona_dt_root_ccu_setup(struct device_node *node)
  298. {
  299. kona_dt_ccu_setup(&root_ccu_data, node);
  300. }
  301. static void __init kona_dt_aon_ccu_setup(struct device_node *node)
  302. {
  303. kona_dt_ccu_setup(&aon_ccu_data, node);
  304. }
  305. static void __init kona_dt_hub_ccu_setup(struct device_node *node)
  306. {
  307. kona_dt_ccu_setup(&hub_ccu_data, node);
  308. }
  309. static void __init kona_dt_master_ccu_setup(struct device_node *node)
  310. {
  311. kona_dt_ccu_setup(&master_ccu_data, node);
  312. }
  313. static void __init kona_dt_slave_ccu_setup(struct device_node *node)
  314. {
  315. kona_dt_ccu_setup(&slave_ccu_data, node);
  316. }
  317. CLK_OF_DECLARE(bcm281xx_root_ccu, BCM281XX_DT_ROOT_CCU_COMPAT,
  318. kona_dt_root_ccu_setup);
  319. CLK_OF_DECLARE(bcm281xx_aon_ccu, BCM281XX_DT_AON_CCU_COMPAT,
  320. kona_dt_aon_ccu_setup);
  321. CLK_OF_DECLARE(bcm281xx_hub_ccu, BCM281XX_DT_HUB_CCU_COMPAT,
  322. kona_dt_hub_ccu_setup);
  323. CLK_OF_DECLARE(bcm281xx_master_ccu, BCM281XX_DT_MASTER_CCU_COMPAT,
  324. kona_dt_master_ccu_setup);
  325. CLK_OF_DECLARE(bcm281xx_slave_ccu, BCM281XX_DT_SLAVE_CCU_COMPAT,
  326. kona_dt_slave_ccu_setup);