clk-mt7622.c 16 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532
  1. // SPDX-License-Identifier: GPL-2.0-only
  2. /*
  3. * Copyright (c) 2017 MediaTek Inc.
  4. * Author: Chen Zhong <chen.zhong@mediatek.com>
  5. * Sean Wang <sean.wang@mediatek.com>
  6. */
  7. #include <linux/clk-provider.h>
  8. #include <linux/mod_devicetable.h>
  9. #include <linux/platform_device.h>
  10. #include "clk-cpumux.h"
  11. #include "clk-gate.h"
  12. #include "clk-mtk.h"
  13. #include <dt-bindings/clock/mt7622-clk.h>
  14. #include <linux/clk.h> /* for consumer */
  15. #define GATE_TOP0(_id, _name, _parent, _shift) \
  16. GATE_MTK(_id, _name, _parent, &top0_cg_regs, _shift, &mtk_clk_gate_ops_no_setclr)
  17. #define GATE_TOP1(_id, _name, _parent, _shift) \
  18. GATE_MTK(_id, _name, _parent, &top1_cg_regs, _shift, &mtk_clk_gate_ops_no_setclr)
  19. #define GATE_PERI0(_id, _name, _parent, _shift) \
  20. GATE_MTK(_id, _name, _parent, &peri0_cg_regs, _shift, &mtk_clk_gate_ops_setclr)
  21. #define GATE_PERI0_AO(_id, _name, _parent, _shift) \
  22. GATE_MTK_FLAGS(_id, _name, _parent, &peri0_cg_regs, _shift, \
  23. &mtk_clk_gate_ops_setclr, CLK_IS_CRITICAL)
  24. #define GATE_PERI1(_id, _name, _parent, _shift) \
  25. GATE_MTK(_id, _name, _parent, &peri1_cg_regs, _shift, &mtk_clk_gate_ops_setclr)
  26. static DEFINE_SPINLOCK(mt7622_clk_lock);
  27. static const char * const axi_parents[] = {
  28. "clkxtal",
  29. "syspll1_d2",
  30. "syspll_d5",
  31. "syspll1_d4",
  32. "univpll_d5",
  33. "univpll2_d2",
  34. "univpll_d7"
  35. };
  36. static const char * const mem_parents[] = {
  37. "clkxtal",
  38. "dmpll_ck"
  39. };
  40. static const char * const ddrphycfg_parents[] = {
  41. "clkxtal",
  42. "syspll1_d8"
  43. };
  44. static const char * const eth_parents[] = {
  45. "clkxtal",
  46. "syspll1_d2",
  47. "univpll1_d2",
  48. "syspll1_d4",
  49. "univpll_d5",
  50. "clk_null",
  51. "univpll_d7"
  52. };
  53. static const char * const pwm_parents[] = {
  54. "clkxtal",
  55. "univpll2_d4"
  56. };
  57. static const char * const f10m_ref_parents[] = {
  58. "clkxtal",
  59. "syspll4_d16"
  60. };
  61. static const char * const nfi_infra_parents[] = {
  62. "clkxtal",
  63. "clkxtal",
  64. "clkxtal",
  65. "clkxtal",
  66. "clkxtal",
  67. "clkxtal",
  68. "clkxtal",
  69. "clkxtal",
  70. "univpll2_d8",
  71. "syspll1_d8",
  72. "univpll1_d8",
  73. "syspll4_d2",
  74. "univpll2_d4",
  75. "univpll3_d2",
  76. "syspll1_d4"
  77. };
  78. static const char * const flash_parents[] = {
  79. "clkxtal",
  80. "univpll_d80_d4",
  81. "syspll2_d8",
  82. "syspll3_d4",
  83. "univpll3_d4",
  84. "univpll1_d8",
  85. "syspll2_d4",
  86. "univpll2_d4"
  87. };
  88. static const char * const uart_parents[] = {
  89. "clkxtal",
  90. "univpll2_d8"
  91. };
  92. static const char * const spi0_parents[] = {
  93. "clkxtal",
  94. "syspll3_d2",
  95. "clkxtal",
  96. "syspll2_d4",
  97. "syspll4_d2",
  98. "univpll2_d4",
  99. "univpll1_d8",
  100. "clkxtal"
  101. };
  102. static const char * const spi1_parents[] = {
  103. "clkxtal",
  104. "syspll3_d2",
  105. "clkxtal",
  106. "syspll4_d4",
  107. "syspll4_d2",
  108. "univpll2_d4",
  109. "univpll1_d8",
  110. "clkxtal"
  111. };
  112. static const char * const msdc30_0_parents[] = {
  113. "clkxtal",
  114. "univpll2_d16",
  115. "univ48m"
  116. };
  117. static const char * const a1sys_hp_parents[] = {
  118. "clkxtal",
  119. "aud1pll_ck",
  120. "aud2pll_ck",
  121. "clkxtal"
  122. };
  123. static const char * const intdir_parents[] = {
  124. "clkxtal",
  125. "syspll_d2",
  126. "univpll_d2",
  127. "sgmiipll_ck"
  128. };
  129. static const char * const aud_intbus_parents[] = {
  130. "clkxtal",
  131. "syspll1_d4",
  132. "syspll4_d2",
  133. "syspll3_d2"
  134. };
  135. static const char * const pmicspi_parents[] = {
  136. "clkxtal",
  137. "clk_null",
  138. "clk_null",
  139. "clk_null",
  140. "clk_null",
  141. "univpll2_d16"
  142. };
  143. static const char * const atb_parents[] = {
  144. "clkxtal",
  145. "syspll1_d2",
  146. "syspll_d5"
  147. };
  148. static const char * const audio_parents[] = {
  149. "clkxtal",
  150. "syspll3_d4",
  151. "syspll4_d4",
  152. "univpll1_d16"
  153. };
  154. static const char * const usb20_parents[] = {
  155. "clkxtal",
  156. "univpll3_d4",
  157. "syspll1_d8",
  158. "clkxtal"
  159. };
  160. static const char * const aud1_parents[] = {
  161. "clkxtal",
  162. "aud1pll_ck"
  163. };
  164. static const char * const aud2_parents[] = {
  165. "clkxtal",
  166. "aud2pll_ck"
  167. };
  168. static const char * const asm_l_parents[] = {
  169. "clkxtal",
  170. "syspll_d5",
  171. "univpll2_d2",
  172. "univpll2_d4"
  173. };
  174. static const char * const apll1_ck_parents[] = {
  175. "aud1_sel",
  176. "aud2_sel"
  177. };
  178. static const char * const peribus_ck_parents[] = {
  179. "syspll1_d8",
  180. "syspll1_d4"
  181. };
  182. static const struct mtk_gate_regs top0_cg_regs = {
  183. .set_ofs = 0x120,
  184. .clr_ofs = 0x120,
  185. .sta_ofs = 0x120,
  186. };
  187. static const struct mtk_gate_regs top1_cg_regs = {
  188. .set_ofs = 0x128,
  189. .clr_ofs = 0x128,
  190. .sta_ofs = 0x128,
  191. };
  192. static const struct mtk_gate_regs peri0_cg_regs = {
  193. .set_ofs = 0x8,
  194. .clr_ofs = 0x10,
  195. .sta_ofs = 0x18,
  196. };
  197. static const struct mtk_gate_regs peri1_cg_regs = {
  198. .set_ofs = 0xC,
  199. .clr_ofs = 0x14,
  200. .sta_ofs = 0x1C,
  201. };
  202. static const struct mtk_fixed_clk top_fixed_clks[] = {
  203. FIXED_CLK(CLK_TOP_TO_U2_PHY, "to_u2_phy", "clkxtal",
  204. 31250000),
  205. FIXED_CLK(CLK_TOP_TO_U2_PHY_1P, "to_u2_phy_1p", "clkxtal",
  206. 31250000),
  207. FIXED_CLK(CLK_TOP_PCIE0_PIPE_EN, "pcie0_pipe_en", "clkxtal",
  208. 125000000),
  209. FIXED_CLK(CLK_TOP_PCIE1_PIPE_EN, "pcie1_pipe_en", "clkxtal",
  210. 125000000),
  211. FIXED_CLK(CLK_TOP_SSUSB_TX250M, "ssusb_tx250m", "clkxtal",
  212. 250000000),
  213. FIXED_CLK(CLK_TOP_SSUSB_EQ_RX250M, "ssusb_eq_rx250m", "clkxtal",
  214. 250000000),
  215. FIXED_CLK(CLK_TOP_SSUSB_CDR_REF, "ssusb_cdr_ref", "clkxtal",
  216. 33333333),
  217. FIXED_CLK(CLK_TOP_SSUSB_CDR_FB, "ssusb_cdr_fb", "clkxtal",
  218. 50000000),
  219. FIXED_CLK(CLK_TOP_SATA_ASIC, "sata_asic", "clkxtal",
  220. 50000000),
  221. FIXED_CLK(CLK_TOP_SATA_RBC, "sata_rbc", "clkxtal",
  222. 50000000),
  223. };
  224. static const struct mtk_fixed_factor top_divs[] = {
  225. FACTOR(CLK_TOP_TO_USB3_SYS, "to_usb3_sys", "eth1pll", 1, 4),
  226. FACTOR(CLK_TOP_P1_1MHZ, "p1_1mhz", "eth1pll", 1, 500),
  227. FACTOR(CLK_TOP_4MHZ, "free_run_4mhz", "eth1pll", 1, 125),
  228. FACTOR(CLK_TOP_P0_1MHZ, "p0_1mhz", "eth1pll", 1, 500),
  229. FACTOR(CLK_TOP_TXCLK_SRC_PRE, "txclk_src_pre", "sgmiipll_d2", 1, 1),
  230. FACTOR(CLK_TOP_RTC, "rtc", "clkxtal", 1, 1024),
  231. FACTOR(CLK_TOP_MEMPLL, "mempll", "clkxtal", 32, 1),
  232. FACTOR(CLK_TOP_DMPLL, "dmpll_ck", "mempll", 1, 1),
  233. FACTOR(CLK_TOP_SYSPLL_D2, "syspll_d2", "mainpll", 1, 2),
  234. FACTOR(CLK_TOP_SYSPLL1_D2, "syspll1_d2", "mainpll", 1, 4),
  235. FACTOR(CLK_TOP_SYSPLL1_D4, "syspll1_d4", "mainpll", 1, 8),
  236. FACTOR(CLK_TOP_SYSPLL1_D8, "syspll1_d8", "mainpll", 1, 16),
  237. FACTOR(CLK_TOP_SYSPLL2_D4, "syspll2_d4", "mainpll", 1, 12),
  238. FACTOR(CLK_TOP_SYSPLL2_D8, "syspll2_d8", "mainpll", 1, 24),
  239. FACTOR(CLK_TOP_SYSPLL_D5, "syspll_d5", "mainpll", 1, 5),
  240. FACTOR(CLK_TOP_SYSPLL3_D2, "syspll3_d2", "mainpll", 1, 10),
  241. FACTOR(CLK_TOP_SYSPLL3_D4, "syspll3_d4", "mainpll", 1, 20),
  242. FACTOR(CLK_TOP_SYSPLL4_D2, "syspll4_d2", "mainpll", 1, 14),
  243. FACTOR(CLK_TOP_SYSPLL4_D4, "syspll4_d4", "mainpll", 1, 28),
  244. FACTOR(CLK_TOP_SYSPLL4_D16, "syspll4_d16", "mainpll", 1, 112),
  245. FACTOR(CLK_TOP_UNIVPLL, "univpll", "univ2pll", 1, 2),
  246. FACTOR(CLK_TOP_UNIVPLL_D2, "univpll_d2", "univpll", 1, 2),
  247. FACTOR(CLK_TOP_UNIVPLL1_D2, "univpll1_d2", "univpll", 1, 4),
  248. FACTOR(CLK_TOP_UNIVPLL1_D4, "univpll1_d4", "univpll", 1, 8),
  249. FACTOR(CLK_TOP_UNIVPLL1_D8, "univpll1_d8", "univpll", 1, 16),
  250. FACTOR(CLK_TOP_UNIVPLL1_D16, "univpll1_d16", "univpll", 1, 32),
  251. FACTOR(CLK_TOP_UNIVPLL2_D2, "univpll2_d2", "univpll", 1, 6),
  252. FACTOR(CLK_TOP_UNIVPLL2_D4, "univpll2_d4", "univpll", 1, 12),
  253. FACTOR(CLK_TOP_UNIVPLL2_D8, "univpll2_d8", "univpll", 1, 24),
  254. FACTOR(CLK_TOP_UNIVPLL2_D16, "univpll2_d16", "univpll", 1, 48),
  255. FACTOR(CLK_TOP_UNIVPLL_D5, "univpll_d5", "univpll", 1, 5),
  256. FACTOR(CLK_TOP_UNIVPLL3_D2, "univpll3_d2", "univpll", 1, 10),
  257. FACTOR(CLK_TOP_UNIVPLL3_D4, "univpll3_d4", "univpll", 1, 20),
  258. FACTOR(CLK_TOP_UNIVPLL3_D16, "univpll3_d16", "univpll", 1, 80),
  259. FACTOR(CLK_TOP_UNIVPLL_D7, "univpll_d7", "univpll", 1, 7),
  260. FACTOR(CLK_TOP_UNIVPLL_D80_D4, "univpll_d80_d4", "univpll", 1, 320),
  261. FACTOR(CLK_TOP_UNIV48M, "univ48m", "univpll", 1, 25),
  262. FACTOR(CLK_TOP_SGMIIPLL, "sgmiipll_ck", "sgmipll", 1, 1),
  263. FACTOR(CLK_TOP_SGMIIPLL_D2, "sgmiipll_d2", "sgmipll", 1, 2),
  264. FACTOR(CLK_TOP_AUD1PLL, "aud1pll_ck", "aud1pll", 1, 1),
  265. FACTOR(CLK_TOP_AUD2PLL, "aud2pll_ck", "aud2pll", 1, 1),
  266. FACTOR(CLK_TOP_AUD_I2S2_MCK, "aud_i2s2_mck", "i2s2_mck_sel", 1, 2),
  267. FACTOR(CLK_TOP_TO_USB3_REF, "to_usb3_ref", "univpll2_d4", 1, 4),
  268. FACTOR(CLK_TOP_PCIE1_MAC_EN, "pcie1_mac_en", "univpll1_d4", 1, 1),
  269. FACTOR(CLK_TOP_PCIE0_MAC_EN, "pcie0_mac_en", "univpll1_d4", 1, 1),
  270. FACTOR(CLK_TOP_ETH_500M, "eth_500m", "eth1pll", 1, 1),
  271. };
  272. static const struct mtk_gate top_clks[] = {
  273. /* TOP0 */
  274. GATE_TOP0(CLK_TOP_APLL1_DIV_PD, "apll1_ck_div_pd", "apll1_ck_div", 0),
  275. GATE_TOP0(CLK_TOP_APLL2_DIV_PD, "apll2_ck_div_pd", "apll2_ck_div", 1),
  276. GATE_TOP0(CLK_TOP_I2S0_MCK_DIV_PD, "i2s0_mck_div_pd", "i2s0_mck_div",
  277. 2),
  278. GATE_TOP0(CLK_TOP_I2S1_MCK_DIV_PD, "i2s1_mck_div_pd", "i2s1_mck_div",
  279. 3),
  280. GATE_TOP0(CLK_TOP_I2S2_MCK_DIV_PD, "i2s2_mck_div_pd", "i2s2_mck_div",
  281. 4),
  282. GATE_TOP0(CLK_TOP_I2S3_MCK_DIV_PD, "i2s3_mck_div_pd", "i2s3_mck_div",
  283. 5),
  284. /* TOP1 */
  285. GATE_TOP1(CLK_TOP_A1SYS_HP_DIV_PD, "a1sys_div_pd", "a1sys_div", 0),
  286. GATE_TOP1(CLK_TOP_A2SYS_HP_DIV_PD, "a2sys_div_pd", "a2sys_div", 16),
  287. };
  288. static const struct mtk_clk_divider top_adj_divs[] = {
  289. DIV_ADJ(CLK_TOP_APLL1_DIV, "apll1_ck_div", "apll1_ck_sel",
  290. 0x120, 24, 3),
  291. DIV_ADJ(CLK_TOP_APLL2_DIV, "apll2_ck_div", "apll2_ck_sel",
  292. 0x120, 28, 3),
  293. DIV_ADJ(CLK_TOP_I2S0_MCK_DIV, "i2s0_mck_div", "i2s0_mck_sel",
  294. 0x124, 0, 7),
  295. DIV_ADJ(CLK_TOP_I2S1_MCK_DIV, "i2s1_mck_div", "i2s1_mck_sel",
  296. 0x124, 8, 7),
  297. DIV_ADJ(CLK_TOP_I2S2_MCK_DIV, "i2s2_mck_div", "aud_i2s2_mck",
  298. 0x124, 16, 7),
  299. DIV_ADJ(CLK_TOP_I2S3_MCK_DIV, "i2s3_mck_div", "i2s3_mck_sel",
  300. 0x124, 24, 7),
  301. DIV_ADJ(CLK_TOP_A1SYS_HP_DIV, "a1sys_div", "a1sys_hp_sel",
  302. 0x128, 8, 7),
  303. DIV_ADJ(CLK_TOP_A2SYS_HP_DIV, "a2sys_div", "a2sys_hp_sel",
  304. 0x128, 24, 7),
  305. };
  306. static const struct mtk_gate peri_clks[] = {
  307. /* PERI0 */
  308. GATE_PERI0(CLK_PERI_THERM_PD, "peri_therm_pd", "axi_sel", 1),
  309. GATE_PERI0(CLK_PERI_PWM1_PD, "peri_pwm1_pd", "clkxtal", 2),
  310. GATE_PERI0(CLK_PERI_PWM2_PD, "peri_pwm2_pd", "clkxtal", 3),
  311. GATE_PERI0(CLK_PERI_PWM3_PD, "peri_pwm3_pd", "clkxtal", 4),
  312. GATE_PERI0(CLK_PERI_PWM4_PD, "peri_pwm4_pd", "clkxtal", 5),
  313. GATE_PERI0(CLK_PERI_PWM5_PD, "peri_pwm5_pd", "clkxtal", 6),
  314. GATE_PERI0(CLK_PERI_PWM6_PD, "peri_pwm6_pd", "clkxtal", 7),
  315. GATE_PERI0(CLK_PERI_PWM7_PD, "peri_pwm7_pd", "clkxtal", 8),
  316. GATE_PERI0(CLK_PERI_PWM_PD, "peri_pwm_pd", "clkxtal", 9),
  317. GATE_PERI0(CLK_PERI_AP_DMA_PD, "peri_ap_dma_pd", "axi_sel", 12),
  318. GATE_PERI0(CLK_PERI_MSDC30_0_PD, "peri_msdc30_0", "msdc30_0_sel", 13),
  319. GATE_PERI0(CLK_PERI_MSDC30_1_PD, "peri_msdc30_1", "msdc30_1_sel", 14),
  320. GATE_PERI0_AO(CLK_PERI_UART0_PD, "peri_uart0_pd", "axi_sel", 17),
  321. GATE_PERI0(CLK_PERI_UART1_PD, "peri_uart1_pd", "axi_sel", 18),
  322. GATE_PERI0(CLK_PERI_UART2_PD, "peri_uart2_pd", "axi_sel", 19),
  323. GATE_PERI0(CLK_PERI_UART3_PD, "peri_uart3_pd", "axi_sel", 20),
  324. GATE_PERI0(CLK_PERI_UART4_PD, "peri_uart4_pd", "axi_sel", 21),
  325. GATE_PERI0(CLK_PERI_BTIF_PD, "peri_btif_pd", "axi_sel", 22),
  326. GATE_PERI0(CLK_PERI_I2C0_PD, "peri_i2c0_pd", "axi_sel", 23),
  327. GATE_PERI0(CLK_PERI_I2C1_PD, "peri_i2c1_pd", "axi_sel", 24),
  328. GATE_PERI0(CLK_PERI_I2C2_PD, "peri_i2c2_pd", "axi_sel", 25),
  329. GATE_PERI0(CLK_PERI_SPI1_PD, "peri_spi1_pd", "spi1_sel", 26),
  330. GATE_PERI0(CLK_PERI_AUXADC_PD, "peri_auxadc_pd", "clkxtal", 27),
  331. GATE_PERI0(CLK_PERI_SPI0_PD, "peri_spi0_pd", "spi0_sel", 28),
  332. GATE_PERI0(CLK_PERI_SNFI_PD, "peri_snfi_pd", "nfi_infra_sel", 29),
  333. GATE_PERI0(CLK_PERI_NFI_PD, "peri_nfi_pd", "axi_sel", 30),
  334. GATE_PERI0(CLK_PERI_NFIECC_PD, "peri_nfiecc_pd", "axi_sel", 31),
  335. /* PERI1 */
  336. GATE_PERI1(CLK_PERI_FLASH_PD, "peri_flash_pd", "flash_sel", 1),
  337. GATE_PERI1(CLK_PERI_IRTX_PD, "peri_irtx_pd", "irtx_sel", 2),
  338. };
  339. static struct mtk_composite top_muxes[] = {
  340. /* CLK_CFG_0 */
  341. MUX_GATE_FLAGS(CLK_TOP_AXI_SEL, "axi_sel", axi_parents,
  342. 0x040, 0, 3, 7, CLK_IS_CRITICAL),
  343. MUX_GATE_FLAGS(CLK_TOP_MEM_SEL, "mem_sel", mem_parents,
  344. 0x040, 8, 1, 15, CLK_IS_CRITICAL),
  345. MUX_GATE_FLAGS(CLK_TOP_DDRPHYCFG_SEL, "ddrphycfg_sel", ddrphycfg_parents,
  346. 0x040, 16, 1, 23, CLK_IS_CRITICAL),
  347. MUX_GATE(CLK_TOP_ETH_SEL, "eth_sel", eth_parents,
  348. 0x040, 24, 3, 31),
  349. /* CLK_CFG_1 */
  350. MUX_GATE(CLK_TOP_PWM_SEL, "pwm_sel", pwm_parents,
  351. 0x050, 0, 2, 7),
  352. MUX_GATE(CLK_TOP_F10M_REF_SEL, "f10m_ref_sel", f10m_ref_parents,
  353. 0x050, 8, 1, 15),
  354. MUX_GATE(CLK_TOP_NFI_INFRA_SEL, "nfi_infra_sel", nfi_infra_parents,
  355. 0x050, 16, 4, 23),
  356. MUX_GATE(CLK_TOP_FLASH_SEL, "flash_sel", flash_parents,
  357. 0x050, 24, 3, 31),
  358. /* CLK_CFG_2 */
  359. MUX_GATE(CLK_TOP_UART_SEL, "uart_sel", uart_parents,
  360. 0x060, 0, 1, 7),
  361. MUX_GATE(CLK_TOP_SPI0_SEL, "spi0_sel", spi0_parents,
  362. 0x060, 8, 3, 15),
  363. MUX_GATE(CLK_TOP_SPI1_SEL, "spi1_sel", spi1_parents,
  364. 0x060, 16, 3, 23),
  365. MUX_GATE(CLK_TOP_MSDC50_0_SEL, "msdc50_0_sel", uart_parents,
  366. 0x060, 24, 3, 31),
  367. /* CLK_CFG_3 */
  368. MUX_GATE(CLK_TOP_MSDC30_0_SEL, "msdc30_0_sel", msdc30_0_parents,
  369. 0x070, 0, 3, 7),
  370. MUX_GATE(CLK_TOP_MSDC30_1_SEL, "msdc30_1_sel", msdc30_0_parents,
  371. 0x070, 8, 3, 15),
  372. MUX_GATE(CLK_TOP_A1SYS_HP_SEL, "a1sys_hp_sel", a1sys_hp_parents,
  373. 0x070, 16, 2, 23),
  374. MUX_GATE(CLK_TOP_A2SYS_HP_SEL, "a2sys_hp_sel", a1sys_hp_parents,
  375. 0x070, 24, 2, 31),
  376. /* CLK_CFG_4 */
  377. MUX_GATE(CLK_TOP_INTDIR_SEL, "intdir_sel", intdir_parents,
  378. 0x080, 0, 2, 7),
  379. MUX_GATE(CLK_TOP_AUD_INTBUS_SEL, "aud_intbus_sel", aud_intbus_parents,
  380. 0x080, 8, 2, 15),
  381. MUX_GATE(CLK_TOP_PMICSPI_SEL, "pmicspi_sel", pmicspi_parents,
  382. 0x080, 16, 3, 23),
  383. MUX_GATE(CLK_TOP_SCP_SEL, "scp_sel", ddrphycfg_parents,
  384. 0x080, 24, 2, 31),
  385. /* CLK_CFG_5 */
  386. MUX_GATE(CLK_TOP_ATB_SEL, "atb_sel", atb_parents,
  387. 0x090, 0, 2, 7),
  388. MUX_GATE(CLK_TOP_HIF_SEL, "hif_sel", eth_parents,
  389. 0x090, 8, 3, 15),
  390. MUX_GATE(CLK_TOP_AUDIO_SEL, "audio_sel", audio_parents,
  391. 0x090, 16, 2, 23),
  392. MUX_GATE(CLK_TOP_U2_SEL, "usb20_sel", usb20_parents,
  393. 0x090, 24, 2, 31),
  394. /* CLK_CFG_6 */
  395. MUX_GATE(CLK_TOP_AUD1_SEL, "aud1_sel", aud1_parents,
  396. 0x0A0, 0, 1, 7),
  397. MUX_GATE(CLK_TOP_AUD2_SEL, "aud2_sel", aud2_parents,
  398. 0x0A0, 8, 1, 15),
  399. MUX_GATE(CLK_TOP_IRRX_SEL, "irrx_sel", f10m_ref_parents,
  400. 0x0A0, 16, 1, 23),
  401. MUX_GATE(CLK_TOP_IRTX_SEL, "irtx_sel", f10m_ref_parents,
  402. 0x0A0, 24, 1, 31),
  403. /* CLK_CFG_7 */
  404. MUX_GATE(CLK_TOP_ASM_L_SEL, "asm_l_sel", asm_l_parents,
  405. 0x0B0, 0, 2, 7),
  406. MUX_GATE(CLK_TOP_ASM_M_SEL, "asm_m_sel", asm_l_parents,
  407. 0x0B0, 8, 2, 15),
  408. MUX_GATE(CLK_TOP_ASM_H_SEL, "asm_h_sel", asm_l_parents,
  409. 0x0B0, 16, 2, 23),
  410. /* CLK_AUDDIV_0 */
  411. MUX(CLK_TOP_APLL1_SEL, "apll1_ck_sel", apll1_ck_parents,
  412. 0x120, 6, 1),
  413. MUX(CLK_TOP_APLL2_SEL, "apll2_ck_sel", apll1_ck_parents,
  414. 0x120, 7, 1),
  415. MUX(CLK_TOP_I2S0_MCK_SEL, "i2s0_mck_sel", apll1_ck_parents,
  416. 0x120, 8, 1),
  417. MUX(CLK_TOP_I2S1_MCK_SEL, "i2s1_mck_sel", apll1_ck_parents,
  418. 0x120, 9, 1),
  419. MUX(CLK_TOP_I2S2_MCK_SEL, "i2s2_mck_sel", apll1_ck_parents,
  420. 0x120, 10, 1),
  421. MUX(CLK_TOP_I2S3_MCK_SEL, "i2s3_mck_sel", apll1_ck_parents,
  422. 0x120, 11, 1),
  423. };
  424. static struct mtk_composite peri_muxes[] = {
  425. /* PERI_GLOBALCON_CKSEL */
  426. MUX(CLK_PERIBUS_SEL, "peribus_ck_sel", peribus_ck_parents, 0x05C, 0, 1),
  427. };
  428. static u16 pericfg_rst_ofs[] = { 0x0, 0x4, };
  429. static const struct mtk_clk_rst_desc clk_rst_desc = {
  430. .version = MTK_RST_SIMPLE,
  431. .rst_bank_ofs = pericfg_rst_ofs,
  432. .rst_bank_nr = ARRAY_SIZE(pericfg_rst_ofs),
  433. };
  434. static const struct mtk_clk_desc topck_desc = {
  435. .clks = top_clks,
  436. .num_clks = ARRAY_SIZE(top_clks),
  437. .fixed_clks = top_fixed_clks,
  438. .num_fixed_clks = ARRAY_SIZE(top_fixed_clks),
  439. .factor_clks = top_divs,
  440. .num_factor_clks = ARRAY_SIZE(top_divs),
  441. .composite_clks = top_muxes,
  442. .num_composite_clks = ARRAY_SIZE(top_muxes),
  443. .divider_clks = top_adj_divs,
  444. .num_divider_clks = ARRAY_SIZE(top_adj_divs),
  445. .clk_lock = &mt7622_clk_lock,
  446. };
  447. static const struct mtk_clk_desc peri_desc = {
  448. .clks = peri_clks,
  449. .num_clks = ARRAY_SIZE(peri_clks),
  450. .composite_clks = peri_muxes,
  451. .num_composite_clks = ARRAY_SIZE(peri_muxes),
  452. .rst_desc = &clk_rst_desc,
  453. .clk_lock = &mt7622_clk_lock,
  454. };
  455. static const struct of_device_id of_match_clk_mt7622[] = {
  456. { .compatible = "mediatek,mt7622-topckgen", .data = &topck_desc },
  457. { .compatible = "mediatek,mt7622-pericfg", .data = &peri_desc },
  458. { /* sentinel */ }
  459. };
  460. MODULE_DEVICE_TABLE(of, of_match_clk_mt7622);
  461. static struct platform_driver clk_mt7622_drv = {
  462. .driver = {
  463. .name = "clk-mt7622",
  464. .of_match_table = of_match_clk_mt7622,
  465. },
  466. .probe = mtk_clk_simple_probe,
  467. .remove = mtk_clk_simple_remove,
  468. };
  469. module_platform_driver(clk_mt7622_drv)
  470. MODULE_DESCRIPTION("MediaTek MT7622 clocks driver");
  471. MODULE_LICENSE("GPL");