clk-mt8195-topckgen.c 39 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340
  1. // SPDX-License-Identifier: GPL-2.0-only
  2. //
  3. // Copyright (c) 2021 MediaTek Inc.
  4. // Author: Chun-Jie Chen <[email protected]>
  5. #include "clk-gate.h"
  6. #include "clk-mtk.h"
  7. #include "clk-mux.h"
  8. #include <dt-bindings/clock/mt8195-clk.h>
  9. #include <linux/of_device.h>
  10. #include <linux/platform_device.h>
  11. static DEFINE_SPINLOCK(mt8195_clk_lock);
  12. static const struct mtk_fixed_clk top_fixed_clks[] = {
  13. FIXED_CLK(CLK_TOP_IN_DGI, "in_dgi", NULL, 165000000),
  14. FIXED_CLK(CLK_TOP_ULPOSC1, "ulposc1", NULL, 248000000),
  15. FIXED_CLK(CLK_TOP_ULPOSC2, "ulposc2", NULL, 326000000),
  16. FIXED_CLK(CLK_TOP_MEM_466M, "mem_466m", NULL, 533000000),
  17. FIXED_CLK(CLK_TOP_MPHONE_SLAVE_B, "mphone_slave_b", NULL, 49152000),
  18. FIXED_CLK(CLK_TOP_PEXTP_PIPE, "pextp_pipe", NULL, 250000000),
  19. FIXED_CLK(CLK_TOP_UFS_RX_SYMBOL, "ufs_rx_symbol", NULL, 166000000),
  20. FIXED_CLK(CLK_TOP_UFS_TX_SYMBOL, "ufs_tx_symbol", NULL, 166000000),
  21. FIXED_CLK(CLK_TOP_SSUSB_U3PHY_P1_P_P0, "ssusb_u3phy_p1_p_p0", NULL, 131000000),
  22. FIXED_CLK(CLK_TOP_UFS_RX_SYMBOL1, "ufs_rx_symbol1", NULL, 166000000),
  23. FIXED_CLK(CLK_TOP_FPC, "fpc", NULL, 50000000),
  24. FIXED_CLK(CLK_TOP_HDMIRX_P, "hdmirx_p", NULL, 594000000),
  25. };
  26. static const struct mtk_fixed_factor top_divs[] = {
  27. FACTOR(CLK_TOP_CLK26M_D2, "clk26m_d2", "clk26m", 1, 2),
  28. FACTOR(CLK_TOP_CLK26M_D52, "clk26m_d52", "clk26m", 1, 52),
  29. FACTOR(CLK_TOP_IN_DGI_D2, "in_dgi_d2", "in_dgi", 1, 2),
  30. FACTOR(CLK_TOP_IN_DGI_D4, "in_dgi_d4", "in_dgi", 1, 4),
  31. FACTOR(CLK_TOP_IN_DGI_D6, "in_dgi_d6", "in_dgi", 1, 6),
  32. FACTOR(CLK_TOP_IN_DGI_D8, "in_dgi_d8", "in_dgi", 1, 8),
  33. FACTOR(CLK_TOP_MAINPLL_D3, "mainpll_d3", "mainpll", 1, 3),
  34. FACTOR(CLK_TOP_MAINPLL_D4, "mainpll_d4", "mainpll", 1, 4),
  35. FACTOR(CLK_TOP_MAINPLL_D4_D2, "mainpll_d4_d2", "mainpll_d4", 1, 2),
  36. FACTOR(CLK_TOP_MAINPLL_D4_D4, "mainpll_d4_d4", "mainpll_d4", 1, 4),
  37. FACTOR(CLK_TOP_MAINPLL_D4_D8, "mainpll_d4_d8", "mainpll_d4", 1, 8),
  38. FACTOR(CLK_TOP_MAINPLL_D5, "mainpll_d5", "mainpll", 1, 5),
  39. FACTOR(CLK_TOP_MAINPLL_D5_D2, "mainpll_d5_d2", "mainpll_d5", 1, 2),
  40. FACTOR(CLK_TOP_MAINPLL_D5_D4, "mainpll_d5_d4", "mainpll_d5", 1, 4),
  41. FACTOR(CLK_TOP_MAINPLL_D5_D8, "mainpll_d5_d8", "mainpll_d5", 1, 8),
  42. FACTOR(CLK_TOP_MAINPLL_D6, "mainpll_d6", "mainpll", 1, 6),
  43. FACTOR(CLK_TOP_MAINPLL_D6_D2, "mainpll_d6_d2", "mainpll_d6", 1, 2),
  44. FACTOR(CLK_TOP_MAINPLL_D6_D4, "mainpll_d6_d4", "mainpll_d6", 1, 4),
  45. FACTOR(CLK_TOP_MAINPLL_D6_D8, "mainpll_d6_d8", "mainpll_d6", 1, 8),
  46. FACTOR(CLK_TOP_MAINPLL_D7, "mainpll_d7", "mainpll", 1, 7),
  47. FACTOR(CLK_TOP_MAINPLL_D7_D2, "mainpll_d7_d2", "mainpll_d7", 1, 2),
  48. FACTOR(CLK_TOP_MAINPLL_D7_D4, "mainpll_d7_d4", "mainpll_d7", 1, 4),
  49. FACTOR(CLK_TOP_MAINPLL_D7_D8, "mainpll_d7_d8", "mainpll_d7", 1, 8),
  50. FACTOR(CLK_TOP_MAINPLL_D9, "mainpll_d9", "mainpll", 1, 9),
  51. FACTOR(CLK_TOP_UNIVPLL_D2, "univpll_d2", "univpll", 1, 2),
  52. FACTOR(CLK_TOP_UNIVPLL_D3, "univpll_d3", "univpll", 1, 3),
  53. FACTOR(CLK_TOP_UNIVPLL_D4, "univpll_d4", "univpll", 1, 4),
  54. FACTOR(CLK_TOP_UNIVPLL_D4_D2, "univpll_d4_d2", "univpll_d4", 1, 2),
  55. FACTOR(CLK_TOP_UNIVPLL_D4_D4, "univpll_d4_d4", "univpll_d4", 1, 4),
  56. FACTOR(CLK_TOP_UNIVPLL_D4_D8, "univpll_d4_d8", "univpll_d4", 1, 8),
  57. FACTOR(CLK_TOP_UNIVPLL_D5, "univpll_d5", "univpll", 1, 5),
  58. FACTOR(CLK_TOP_UNIVPLL_D5_D2, "univpll_d5_d2", "univpll_d5", 1, 2),
  59. FACTOR(CLK_TOP_UNIVPLL_D5_D4, "univpll_d5_d4", "univpll_d5", 1, 4),
  60. FACTOR(CLK_TOP_UNIVPLL_D5_D8, "univpll_d5_d8", "univpll_d5", 1, 8),
  61. FACTOR(CLK_TOP_UNIVPLL_D6, "univpll_d6", "univpll", 1, 6),
  62. FACTOR(CLK_TOP_UNIVPLL_D6_D2, "univpll_d6_d2", "univpll_d6", 1, 2),
  63. FACTOR(CLK_TOP_UNIVPLL_D6_D4, "univpll_d6_d4", "univpll_d6", 1, 4),
  64. FACTOR(CLK_TOP_UNIVPLL_D6_D8, "univpll_d6_d8", "univpll_d6", 1, 8),
  65. FACTOR(CLK_TOP_UNIVPLL_D6_D16, "univpll_d6_d16", "univpll_d6", 1, 16),
  66. FACTOR(CLK_TOP_UNIVPLL_D7, "univpll_d7", "univpll", 1, 7),
  67. FACTOR(CLK_TOP_UNIVPLL_192M, "univpll_192m", "univpll", 1, 13),
  68. FACTOR(CLK_TOP_UNIVPLL_192M_D4, "univpll_192m_d4", "univpll_192m", 1, 4),
  69. FACTOR(CLK_TOP_UNIVPLL_192M_D8, "univpll_192m_d8", "univpll_192m", 1, 8),
  70. FACTOR(CLK_TOP_UNIVPLL_192M_D16, "univpll_192m_d16", "univpll_192m", 1, 16),
  71. FACTOR(CLK_TOP_UNIVPLL_192M_D32, "univpll_192m_d32", "univpll_192m", 1, 32),
  72. FACTOR(CLK_TOP_APLL1_D3, "apll1_d3", "apll1", 1, 3),
  73. FACTOR(CLK_TOP_APLL1_D4, "apll1_d4", "apll1", 1, 4),
  74. FACTOR(CLK_TOP_APLL2_D3, "apll2_d3", "apll2", 1, 3),
  75. FACTOR(CLK_TOP_APLL2_D4, "apll2_d4", "apll2", 1, 4),
  76. FACTOR(CLK_TOP_APLL3_D4, "apll3_d4", "apll3", 1, 4),
  77. FACTOR(CLK_TOP_APLL4_D4, "apll4_d4", "apll4", 1, 4),
  78. FACTOR(CLK_TOP_APLL5_D4, "apll5_d4", "apll5", 1, 4),
  79. FACTOR(CLK_TOP_HDMIRX_APLL_D3, "hdmirx_apll_d3", "hdmirx_apll", 1, 3),
  80. FACTOR(CLK_TOP_HDMIRX_APLL_D4, "hdmirx_apll_d4", "hdmirx_apll", 1, 4),
  81. FACTOR(CLK_TOP_HDMIRX_APLL_D6, "hdmirx_apll_d6", "hdmirx_apll", 1, 6),
  82. FACTOR(CLK_TOP_MMPLL_D4, "mmpll_d4", "mmpll", 1, 4),
  83. FACTOR(CLK_TOP_MMPLL_D4_D2, "mmpll_d4_d2", "mmpll_d4", 1, 2),
  84. FACTOR(CLK_TOP_MMPLL_D4_D4, "mmpll_d4_d4", "mmpll_d4", 1, 4),
  85. FACTOR(CLK_TOP_MMPLL_D5, "mmpll_d5", "mmpll", 1, 5),
  86. FACTOR(CLK_TOP_MMPLL_D5_D2, "mmpll_d5_d2", "mmpll_d5", 1, 2),
  87. FACTOR(CLK_TOP_MMPLL_D5_D4, "mmpll_d5_d4", "mmpll_d5", 1, 4),
  88. FACTOR(CLK_TOP_MMPLL_D6, "mmpll_d6", "mmpll", 1, 6),
  89. FACTOR(CLK_TOP_MMPLL_D6_D2, "mmpll_d6_d2", "mmpll_d6", 1, 2),
  90. FACTOR(CLK_TOP_MMPLL_D7, "mmpll_d7", "mmpll", 1, 7),
  91. FACTOR(CLK_TOP_MMPLL_D9, "mmpll_d9", "mmpll", 1, 9),
  92. FACTOR(CLK_TOP_TVDPLL1_D2, "tvdpll1_d2", "tvdpll1", 1, 2),
  93. FACTOR(CLK_TOP_TVDPLL1_D4, "tvdpll1_d4", "tvdpll1", 1, 4),
  94. FACTOR(CLK_TOP_TVDPLL1_D8, "tvdpll1_d8", "tvdpll1", 1, 8),
  95. FACTOR(CLK_TOP_TVDPLL1_D16, "tvdpll1_d16", "tvdpll1", 1, 16),
  96. FACTOR(CLK_TOP_TVDPLL2_D2, "tvdpll2_d2", "tvdpll2", 1, 2),
  97. FACTOR(CLK_TOP_TVDPLL2_D4, "tvdpll2_d4", "tvdpll2", 1, 4),
  98. FACTOR(CLK_TOP_TVDPLL2_D8, "tvdpll2_d8", "tvdpll2", 1, 8),
  99. FACTOR(CLK_TOP_TVDPLL2_D16, "tvdpll2_d16", "tvdpll2", 1, 16),
  100. FACTOR(CLK_TOP_MSDCPLL_D2, "msdcpll_d2", "msdcpll", 1, 2),
  101. FACTOR(CLK_TOP_MSDCPLL_D4, "msdcpll_d4", "msdcpll", 1, 4),
  102. FACTOR(CLK_TOP_MSDCPLL_D16, "msdcpll_d16", "msdcpll", 1, 16),
  103. FACTOR(CLK_TOP_ETHPLL_D2, "ethpll_d2", "ethpll", 1, 2),
  104. FACTOR(CLK_TOP_ETHPLL_D8, "ethpll_d8", "ethpll", 1, 8),
  105. FACTOR(CLK_TOP_ETHPLL_D10, "ethpll_d10", "ethpll", 1, 10),
  106. FACTOR(CLK_TOP_DGIPLL_D2, "dgipll_d2", "dgipll", 1, 2),
  107. FACTOR(CLK_TOP_ULPOSC1_D2, "ulposc1_d2", "ulposc1", 1, 2),
  108. FACTOR(CLK_TOP_ULPOSC1_D4, "ulposc1_d4", "ulposc1", 1, 4),
  109. FACTOR(CLK_TOP_ULPOSC1_D7, "ulposc1_d7", "ulposc1", 1, 7),
  110. FACTOR(CLK_TOP_ULPOSC1_D8, "ulposc1_d8", "ulposc1", 1, 8),
  111. FACTOR(CLK_TOP_ULPOSC1_D10, "ulposc1_d10", "ulposc1", 1, 10),
  112. FACTOR(CLK_TOP_ULPOSC1_D16, "ulposc1_d16", "ulposc1", 1, 16),
  113. FACTOR(CLK_TOP_ADSPPLL_D2, "adsppll_d2", "adsppll", 1, 2),
  114. FACTOR(CLK_TOP_ADSPPLL_D4, "adsppll_d4", "adsppll", 1, 4),
  115. FACTOR(CLK_TOP_ADSPPLL_D8, "adsppll_d8", "adsppll", 1, 8),
  116. };
  117. static const char * const axi_parents[] = {
  118. "clk26m",
  119. "mainpll_d4_d4",
  120. "mainpll_d7_d2",
  121. "mainpll_d4_d2",
  122. "mainpll_d5_d2",
  123. "mainpll_d6_d2",
  124. "ulposc1_d4"
  125. };
  126. static const char * const spm_parents[] = {
  127. "clk26m",
  128. "ulposc1_d10",
  129. "mainpll_d7_d4",
  130. "clk32k"
  131. };
  132. static const char * const scp_parents[] = {
  133. "clk26m",
  134. "univpll_d4",
  135. "mainpll_d6",
  136. "univpll_d6",
  137. "univpll_d4_d2",
  138. "mainpll_d4_d2",
  139. "mainpll_d4",
  140. "mainpll_d6_d2"
  141. };
  142. static const char * const bus_aximem_parents[] = {
  143. "clk26m",
  144. "mainpll_d7_d2",
  145. "mainpll_d4_d2",
  146. "mainpll_d5_d2",
  147. "mainpll_d6"
  148. };
  149. static const char * const vpp_parents[] = {
  150. "clk26m",
  151. "univpll_d6_d2",
  152. "mainpll_d5_d2",
  153. "mmpll_d6_d2",
  154. "univpll_d5_d2",
  155. "univpll_d4_d2",
  156. "mmpll_d4_d2",
  157. "mmpll_d7",
  158. "univpll_d6",
  159. "mainpll_d4",
  160. "mmpll_d5",
  161. "tvdpll1",
  162. "tvdpll2",
  163. "univpll_d4",
  164. "mmpll_d4"
  165. };
  166. static const char * const ethdr_parents[] = {
  167. "clk26m",
  168. "univpll_d6_d2",
  169. "mainpll_d5_d2",
  170. "mmpll_d6_d2",
  171. "univpll_d5_d2",
  172. "univpll_d4_d2",
  173. "mmpll_d4_d2",
  174. "mmpll_d7",
  175. "univpll_d6",
  176. "mainpll_d4",
  177. "mmpll_d5_d4",
  178. "tvdpll1",
  179. "tvdpll2",
  180. "univpll_d4",
  181. "mmpll_d4"
  182. };
  183. static const char * const ipe_parents[] = {
  184. "clk26m",
  185. "imgpll",
  186. "mainpll_d4",
  187. "mmpll_d6",
  188. "univpll_d6",
  189. "mainpll_d6",
  190. "mmpll_d4_d2",
  191. "univpll_d4_d2",
  192. "mainpll_d4_d2",
  193. "mmpll_d6_d2",
  194. "univpll_d5_d2"
  195. };
  196. static const char * const cam_parents[] = {
  197. "clk26m",
  198. "mainpll_d4",
  199. "mmpll_d4",
  200. "univpll_d4",
  201. "univpll_d5",
  202. "univpll_d6",
  203. "mmpll_d7",
  204. "univpll_d4_d2",
  205. "mainpll_d4_d2",
  206. "imgpll"
  207. };
  208. static const char * const ccu_parents[] = {
  209. "clk26m",
  210. "univpll_d6",
  211. "mainpll_d4_d2",
  212. "mainpll_d4",
  213. "univpll_d5",
  214. "mainpll_d6",
  215. "mmpll_d6",
  216. "mmpll_d7",
  217. "univpll_d4_d2",
  218. "univpll_d7"
  219. };
  220. static const char * const img_parents[] = {
  221. "clk26m",
  222. "imgpll",
  223. "univpll_d4",
  224. "mainpll_d4",
  225. "univpll_d5",
  226. "mmpll_d6",
  227. "univpll_d6",
  228. "mainpll_d6",
  229. "mmpll_d4_d2",
  230. "univpll_d4_d2",
  231. "mainpll_d4_d2",
  232. "univpll_d5_d2"
  233. };
  234. static const char * const camtm_parents[] = {
  235. "clk26m",
  236. "univpll_d4_d4",
  237. "univpll_d6_d2",
  238. "univpll_d6_d4"
  239. };
  240. static const char * const dsp_parents[] = {
  241. "clk26m",
  242. "univpll_d6_d2",
  243. "univpll_d4_d2",
  244. "univpll_d5",
  245. "univpll_d4",
  246. "mmpll_d4",
  247. "mainpll_d3",
  248. "univpll_d3"
  249. };
  250. static const char * const dsp1_parents[] = {
  251. "clk26m",
  252. "univpll_d6_d2",
  253. "mainpll_d4_d2",
  254. "univpll_d5",
  255. "mmpll_d5",
  256. "univpll_d4",
  257. "mainpll_d3",
  258. "univpll_d3"
  259. };
  260. static const char * const dsp2_parents[] = {
  261. "clk26m",
  262. "univpll_d6_d2",
  263. "univpll_d4_d2",
  264. "mainpll_d4",
  265. "univpll_d4",
  266. "mmpll_d4",
  267. "mainpll_d3",
  268. "univpll_d3"
  269. };
  270. static const char * const ipu_if_parents[] = {
  271. "clk26m",
  272. "univpll_d6_d2",
  273. "univpll_d5_d2",
  274. "mainpll_d4_d2",
  275. "mainpll_d6",
  276. "univpll_d5",
  277. "univpll_d4",
  278. "mmpll_d4"
  279. };
  280. /*
  281. * MFG can be also parented to "univpll_d6" and "univpll_d7":
  282. * these have been removed from the parents list to let us
  283. * achieve GPU DVFS without any special clock handlers.
  284. */
  285. static const char * const mfg_parents[] = {
  286. "clk26m",
  287. "mainpll_d5_d2"
  288. };
  289. static const char * const camtg_parents[] = {
  290. "clk26m",
  291. "univpll_192m_d8",
  292. "univpll_d6_d8",
  293. "univpll_192m_d4",
  294. "univpll_d6_d16",
  295. "clk26m_d2",
  296. "univpll_192m_d16",
  297. "univpll_192m_d32"
  298. };
  299. static const char * const uart_parents[] = {
  300. "clk26m",
  301. "univpll_d6_d8"
  302. };
  303. static const char * const spi_parents[] = {
  304. "clk26m",
  305. "mainpll_d5_d4",
  306. "mainpll_d6_d4",
  307. "msdcpll_d4",
  308. "univpll_d6_d2",
  309. "mainpll_d6_d2",
  310. "mainpll_d4_d4",
  311. "univpll_d5_d4"
  312. };
  313. static const char * const spis_parents[] = {
  314. "clk26m",
  315. "univpll_d6",
  316. "mainpll_d6",
  317. "univpll_d4_d2",
  318. "univpll_d6_d2",
  319. "univpll_d4_d4",
  320. "univpll_d6_d4",
  321. "mainpll_d7_d4"
  322. };
  323. static const char * const msdc50_0_h_parents[] = {
  324. "clk26m",
  325. "mainpll_d4_d2",
  326. "mainpll_d6_d2"
  327. };
  328. static const char * const msdc50_0_parents[] = {
  329. "clk26m",
  330. "msdcpll",
  331. "msdcpll_d2",
  332. "univpll_d4_d4",
  333. "mainpll_d6_d2",
  334. "univpll_d4_d2"
  335. };
  336. static const char * const msdc30_parents[] = {
  337. "clk26m",
  338. "univpll_d6_d2",
  339. "mainpll_d6_d2",
  340. "mainpll_d7_d2",
  341. "msdcpll_d2"
  342. };
  343. static const char * const intdir_parents[] = {
  344. "clk26m",
  345. "univpll_d6",
  346. "mainpll_d4",
  347. "univpll_d4"
  348. };
  349. static const char * const aud_intbus_parents[] = {
  350. "clk26m",
  351. "mainpll_d4_d4",
  352. "mainpll_d7_d4"
  353. };
  354. static const char * const audio_h_parents[] = {
  355. "clk26m",
  356. "univpll_d7",
  357. "apll1",
  358. "apll2"
  359. };
  360. static const char * const pwrap_ulposc_parents[] = {
  361. "ulposc1_d10",
  362. "clk26m",
  363. "ulposc1_d4",
  364. "ulposc1_d7",
  365. "ulposc1_d8",
  366. "ulposc1_d16",
  367. "mainpll_d4_d8",
  368. "univpll_d5_d8"
  369. };
  370. static const char * const atb_parents[] = {
  371. "clk26m",
  372. "mainpll_d4_d2",
  373. "mainpll_d5_d2"
  374. };
  375. static const char * const pwrmcu_parents[] = {
  376. "clk26m",
  377. "mainpll_d7_d2",
  378. "mainpll_d6_d2",
  379. "mainpll_d5_d2",
  380. "mainpll_d9",
  381. "mainpll_d4_d2"
  382. };
  383. static const char * const dp_parents[] = {
  384. "clk26m",
  385. "tvdpll1_d2",
  386. "tvdpll2_d2",
  387. "tvdpll1_d4",
  388. "tvdpll2_d4",
  389. "tvdpll1_d8",
  390. "tvdpll2_d8",
  391. "tvdpll1_d16",
  392. "tvdpll2_d16"
  393. };
  394. static const char * const disp_pwm_parents[] = {
  395. "clk26m",
  396. "univpll_d6_d4",
  397. "ulposc1_d2",
  398. "ulposc1_d4",
  399. "ulposc1_d16"
  400. };
  401. static const char * const usb_parents[] = {
  402. "clk26m",
  403. "univpll_d5_d4",
  404. "univpll_d6_d4",
  405. "univpll_d5_d2"
  406. };
  407. static const char * const i2c_parents[] = {
  408. "clk26m",
  409. "mainpll_d4_d8",
  410. "univpll_d5_d4"
  411. };
  412. static const char * const seninf_parents[] = {
  413. "clk26m",
  414. "univpll_d4_d4",
  415. "univpll_d6_d2",
  416. "univpll_d4_d2",
  417. "univpll_d7",
  418. "univpll_d6",
  419. "mmpll_d6",
  420. "univpll_d5"
  421. };
  422. static const char * const gcpu_parents[] = {
  423. "clk26m",
  424. "mainpll_d6",
  425. "univpll_d4_d2",
  426. "mmpll_d5_d2",
  427. "univpll_d5_d2"
  428. };
  429. static const char * const dxcc_parents[] = {
  430. "clk26m",
  431. "mainpll_d4_d2",
  432. "mainpll_d4_d4",
  433. "mainpll_d4_d8"
  434. };
  435. static const char * const dpmaif_parents[] = {
  436. "clk26m",
  437. "univpll_d4_d4",
  438. "mainpll_d6",
  439. "mainpll_d4_d2",
  440. "univpll_d4_d2"
  441. };
  442. static const char * const aes_fde_parents[] = {
  443. "clk26m",
  444. "mainpll_d4_d2",
  445. "mainpll_d6",
  446. "mainpll_d4_d4",
  447. "univpll_d4_d2",
  448. "univpll_d6"
  449. };
  450. static const char * const ufs_parents[] = {
  451. "clk26m",
  452. "mainpll_d4_d4",
  453. "mainpll_d4_d8",
  454. "univpll_d4_d4",
  455. "mainpll_d6_d2",
  456. "univpll_d6_d2",
  457. "msdcpll_d2"
  458. };
  459. static const char * const ufs_tick1us_parents[] = {
  460. "clk26m_d52",
  461. "clk26m"
  462. };
  463. static const char * const ufs_mp_sap_parents[] = {
  464. "clk26m",
  465. "msdcpll_d16"
  466. };
  467. static const char * const venc_parents[] = {
  468. "clk26m",
  469. "mmpll_d4_d2",
  470. "mainpll_d6",
  471. "univpll_d4_d2",
  472. "mainpll_d4_d2",
  473. "univpll_d6",
  474. "mmpll_d6",
  475. "mainpll_d5_d2",
  476. "mainpll_d6_d2",
  477. "mmpll_d9",
  478. "univpll_d4_d4",
  479. "mainpll_d4",
  480. "univpll_d4",
  481. "univpll_d5",
  482. "univpll_d5_d2",
  483. "mainpll_d5"
  484. };
  485. static const char * const vdec_parents[] = {
  486. "clk26m",
  487. "mainpll_d5_d2",
  488. "mmpll_d6_d2",
  489. "univpll_d4_d2",
  490. "mmpll_d4_d2",
  491. "mainpll_d5",
  492. "mmpll_d6",
  493. "mmpll_d5",
  494. "vdecpll",
  495. "univpll_d4",
  496. "mmpll_d4",
  497. "univpll_d6_d2",
  498. "mmpll_d9",
  499. "univpll_d6",
  500. "univpll_d5",
  501. "mainpll_d4"
  502. };
  503. static const char * const pwm_parents[] = {
  504. "clk26m",
  505. "univpll_d4_d8"
  506. };
  507. static const char * const mcupm_parents[] = {
  508. "clk26m",
  509. "mainpll_d6_d2",
  510. "mainpll_d7_d4",
  511. };
  512. static const char * const spmi_parents[] = {
  513. "clk26m",
  514. "clk26m_d2",
  515. "ulposc1_d8",
  516. "ulposc1_d10",
  517. "ulposc1_d16",
  518. "ulposc1_d7",
  519. "clk32k",
  520. "mainpll_d7_d8",
  521. "mainpll_d6_d8",
  522. "mainpll_d5_d8"
  523. };
  524. static const char * const dvfsrc_parents[] = {
  525. "clk26m",
  526. "ulposc1_d10",
  527. "univpll_d6_d8",
  528. "msdcpll_d16"
  529. };
  530. static const char * const tl_parents[] = {
  531. "clk26m",
  532. "univpll_d5_d4",
  533. "mainpll_d4_d4"
  534. };
  535. static const char * const dsi_occ_parents[] = {
  536. "clk26m",
  537. "mainpll_d6_d2",
  538. "univpll_d5_d2",
  539. "univpll_d4_d2"
  540. };
  541. static const char * const wpe_vpp_parents[] = {
  542. "clk26m",
  543. "mainpll_d5_d2",
  544. "mmpll_d6_d2",
  545. "univpll_d5_d2",
  546. "mainpll_d4_d2",
  547. "univpll_d4_d2",
  548. "mmpll_d4_d2",
  549. "mainpll_d6",
  550. "mmpll_d7",
  551. "univpll_d6",
  552. "mainpll_d5",
  553. "univpll_d5",
  554. "mainpll_d4",
  555. "tvdpll1",
  556. "univpll_d4"
  557. };
  558. static const char * const hdcp_parents[] = {
  559. "clk26m",
  560. "univpll_d4_d8",
  561. "mainpll_d5_d8",
  562. "univpll_d6_d4"
  563. };
  564. static const char * const hdcp_24m_parents[] = {
  565. "clk26m",
  566. "univpll_192m_d4",
  567. "univpll_192m_d8",
  568. "univpll_d6_d8"
  569. };
  570. static const char * const hd20_dacr_ref_parents[] = {
  571. "clk26m",
  572. "univpll_d4_d2",
  573. "univpll_d4_d4",
  574. "univpll_d4_d8"
  575. };
  576. static const char * const hd20_hdcp_c_parents[] = {
  577. "clk26m",
  578. "msdcpll_d4",
  579. "univpll_d4_d8",
  580. "univpll_d6_d8"
  581. };
  582. static const char * const hdmi_xtal_parents[] = {
  583. "clk26m",
  584. "clk26m_d2"
  585. };
  586. static const char * const hdmi_apb_parents[] = {
  587. "clk26m",
  588. "univpll_d6_d4",
  589. "msdcpll_d2"
  590. };
  591. static const char * const snps_eth_250m_parents[] = {
  592. "clk26m",
  593. "ethpll_d2"
  594. };
  595. static const char * const snps_eth_62p4m_ptp_parents[] = {
  596. "apll2_d3",
  597. "apll1_d3",
  598. "clk26m",
  599. "ethpll_d8"
  600. };
  601. static const char * const snps_eth_50m_rmii_parents[] = {
  602. "clk26m",
  603. "ethpll_d10"
  604. };
  605. static const char * const dgi_out_parents[] = {
  606. "clk26m",
  607. "dgipll",
  608. "dgipll_d2",
  609. "in_dgi",
  610. "in_dgi_d2",
  611. "mmpll_d4_d4"
  612. };
  613. static const char * const nna_parents[] = {
  614. "clk26m",
  615. "nnapll",
  616. "univpll_d4",
  617. "mainpll_d4",
  618. "univpll_d5",
  619. "mmpll_d6",
  620. "univpll_d6",
  621. "mainpll_d6",
  622. "mmpll_d4_d2",
  623. "univpll_d4_d2",
  624. "mainpll_d4_d2",
  625. "mmpll_d6_d2"
  626. };
  627. static const char * const adsp_parents[] = {
  628. "clk26m",
  629. "clk26m_d2",
  630. "mainpll_d6",
  631. "mainpll_d5_d2",
  632. "univpll_d4_d4",
  633. "univpll_d4",
  634. "univpll_d6",
  635. "ulposc1",
  636. "adsppll",
  637. "adsppll_d2",
  638. "adsppll_d4",
  639. "adsppll_d8"
  640. };
  641. static const char * const asm_parents[] = {
  642. "clk26m",
  643. "univpll_d6_d4",
  644. "univpll_d6_d2",
  645. "mainpll_d5_d2"
  646. };
  647. static const char * const apll1_parents[] = {
  648. "clk26m",
  649. "apll1_d4"
  650. };
  651. static const char * const apll2_parents[] = {
  652. "clk26m",
  653. "apll2_d4"
  654. };
  655. static const char * const apll3_parents[] = {
  656. "clk26m",
  657. "apll3_d4"
  658. };
  659. static const char * const apll4_parents[] = {
  660. "clk26m",
  661. "apll4_d4"
  662. };
  663. static const char * const apll5_parents[] = {
  664. "clk26m",
  665. "apll5_d4"
  666. };
  667. static const char * const i2s_parents[] = {
  668. "clk26m",
  669. "apll1",
  670. "apll2",
  671. "apll3",
  672. "apll4",
  673. "apll5",
  674. "hdmirx_apll"
  675. };
  676. static const char * const a1sys_hp_parents[] = {
  677. "clk26m",
  678. "apll1_d4"
  679. };
  680. static const char * const a2sys_parents[] = {
  681. "clk26m",
  682. "apll2_d4"
  683. };
  684. static const char * const a3sys_parents[] = {
  685. "clk26m",
  686. "apll3_d4",
  687. "apll4_d4",
  688. "apll5_d4",
  689. "hdmirx_apll_d3",
  690. "hdmirx_apll_d4",
  691. "hdmirx_apll_d6"
  692. };
  693. static const char * const spinfi_b_parents[] = {
  694. "clk26m",
  695. "univpll_d6_d8",
  696. "univpll_d5_d8",
  697. "mainpll_d4_d8",
  698. "mainpll_d7_d4",
  699. "mainpll_d6_d4",
  700. "univpll_d6_d4",
  701. "univpll_d5_d4"
  702. };
  703. static const char * const nfi1x_parents[] = {
  704. "clk26m",
  705. "univpll_d5_d4",
  706. "mainpll_d7_d4",
  707. "mainpll_d6_d4",
  708. "univpll_d6_d4",
  709. "mainpll_d4_d4",
  710. "mainpll_d7_d2",
  711. "mainpll_d6_d2"
  712. };
  713. static const char * const ecc_parents[] = {
  714. "clk26m",
  715. "mainpll_d4_d4",
  716. "mainpll_d5_d2",
  717. "mainpll_d4_d2",
  718. "mainpll_d6",
  719. "univpll_d6"
  720. };
  721. static const char * const audio_local_bus_parents[] = {
  722. "clk26m",
  723. "clk26m_d2",
  724. "mainpll_d4_d4",
  725. "mainpll_d7_d2",
  726. "mainpll_d4_d2",
  727. "mainpll_d5_d2",
  728. "mainpll_d6_d2",
  729. "mainpll_d7",
  730. "univpll_d6",
  731. "ulposc1",
  732. "ulposc1_d4",
  733. "ulposc1_d2"
  734. };
  735. static const char * const spinor_parents[] = {
  736. "clk26m",
  737. "clk26m_d2",
  738. "mainpll_d7_d8",
  739. "univpll_d6_d8"
  740. };
  741. static const char * const dvio_dgi_ref_parents[] = {
  742. "clk26m",
  743. "in_dgi",
  744. "in_dgi_d2",
  745. "in_dgi_d4",
  746. "in_dgi_d6",
  747. "in_dgi_d8",
  748. "mmpll_d4_d4"
  749. };
  750. static const char * const ulposc_parents[] = {
  751. "ulposc1",
  752. "ethpll_d2",
  753. "mainpll_d4_d2",
  754. "ethpll_d10"
  755. };
  756. static const char * const ulposc_core_parents[] = {
  757. "ulposc2",
  758. "univpll_d7",
  759. "mainpll_d6",
  760. "ethpll_d10"
  761. };
  762. static const char * const srck_parents[] = {
  763. "ulposc1_d10",
  764. "clk26m"
  765. };
  766. static const char * const mfg_fast_parents[] = {
  767. "top_mfg_core_tmp",
  768. "mfgpll"
  769. };
  770. static const struct mtk_mux top_mtk_muxes[] = {
  771. /*
  772. * CLK_CFG_0
  773. * top_axi and top_bus_aximem are bus clocks, should not be closed by Linux.
  774. * top_spm and top_scp are main clocks in always-on co-processor.
  775. */
  776. MUX_GATE_CLR_SET_UPD_FLAGS(CLK_TOP_AXI, "top_axi",
  777. axi_parents, 0x020, 0x024, 0x028, 0, 3, 7, 0x04, 0, CLK_IS_CRITICAL),
  778. MUX_GATE_CLR_SET_UPD_FLAGS(CLK_TOP_SPM, "top_spm",
  779. spm_parents, 0x020, 0x024, 0x028, 8, 2, 15, 0x04, 1, CLK_IS_CRITICAL),
  780. MUX_GATE_CLR_SET_UPD_FLAGS(CLK_TOP_SCP, "top_scp",
  781. scp_parents, 0x020, 0x024, 0x028, 16, 3, 23, 0x04, 2, CLK_IS_CRITICAL),
  782. MUX_GATE_CLR_SET_UPD_FLAGS(CLK_TOP_BUS_AXIMEM, "top_bus_aximem",
  783. bus_aximem_parents, 0x020, 0x024, 0x028, 24, 3, 31, 0x04, 3, CLK_IS_CRITICAL),
  784. /* CLK_CFG_1 */
  785. MUX_GATE_CLR_SET_UPD(CLK_TOP_VPP, "top_vpp",
  786. vpp_parents, 0x02C, 0x030, 0x034, 0, 4, 7, 0x04, 4),
  787. MUX_GATE_CLR_SET_UPD(CLK_TOP_ETHDR, "top_ethdr",
  788. ethdr_parents, 0x02C, 0x030, 0x034, 8, 4, 15, 0x04, 5),
  789. MUX_GATE_CLR_SET_UPD(CLK_TOP_IPE, "top_ipe",
  790. ipe_parents, 0x02C, 0x030, 0x034, 16, 4, 23, 0x04, 6),
  791. MUX_GATE_CLR_SET_UPD(CLK_TOP_CAM, "top_cam",
  792. cam_parents, 0x02C, 0x030, 0x034, 24, 4, 31, 0x04, 7),
  793. /* CLK_CFG_2 */
  794. MUX_GATE_CLR_SET_UPD(CLK_TOP_CCU, "top_ccu",
  795. ccu_parents, 0x038, 0x03C, 0x040, 0, 4, 7, 0x04, 8),
  796. MUX_GATE_CLR_SET_UPD(CLK_TOP_IMG, "top_img",
  797. img_parents, 0x038, 0x03C, 0x040, 8, 4, 15, 0x04, 9),
  798. MUX_GATE_CLR_SET_UPD(CLK_TOP_CAMTM, "top_camtm",
  799. camtm_parents, 0x038, 0x03C, 0x040, 16, 2, 23, 0x04, 10),
  800. MUX_GATE_CLR_SET_UPD(CLK_TOP_DSP, "top_dsp",
  801. dsp_parents, 0x038, 0x03C, 0x040, 24, 3, 31, 0x04, 11),
  802. /* CLK_CFG_3 */
  803. MUX_GATE_CLR_SET_UPD(CLK_TOP_DSP1, "top_dsp1",
  804. dsp1_parents, 0x044, 0x048, 0x04C, 0, 3, 7, 0x04, 12),
  805. MUX_GATE_CLR_SET_UPD(CLK_TOP_DSP2, "top_dsp2",
  806. dsp1_parents, 0x044, 0x048, 0x04C, 8, 3, 15, 0x04, 13),
  807. MUX_GATE_CLR_SET_UPD(CLK_TOP_DSP3, "top_dsp3",
  808. dsp1_parents, 0x044, 0x048, 0x04C, 16, 3, 23, 0x04, 14),
  809. MUX_GATE_CLR_SET_UPD(CLK_TOP_DSP4, "top_dsp4",
  810. dsp2_parents, 0x044, 0x048, 0x04C, 24, 3, 31, 0x04, 15),
  811. /* CLK_CFG_4 */
  812. MUX_GATE_CLR_SET_UPD(CLK_TOP_DSP5, "top_dsp5",
  813. dsp2_parents, 0x050, 0x054, 0x058, 0, 3, 7, 0x04, 16),
  814. MUX_GATE_CLR_SET_UPD(CLK_TOP_DSP6, "top_dsp6",
  815. dsp2_parents, 0x050, 0x054, 0x058, 8, 3, 15, 0x04, 17),
  816. MUX_GATE_CLR_SET_UPD(CLK_TOP_DSP7, "top_dsp7",
  817. dsp_parents, 0x050, 0x054, 0x058, 16, 3, 23, 0x04, 18),
  818. MUX_GATE_CLR_SET_UPD(CLK_TOP_IPU_IF, "top_ipu_if",
  819. ipu_if_parents, 0x050, 0x054, 0x058, 24, 3, 31, 0x04, 19),
  820. /* CLK_CFG_5 */
  821. MUX_GATE_CLR_SET_UPD(CLK_TOP_MFG_CORE_TMP, "top_mfg_core_tmp",
  822. mfg_parents, 0x05C, 0x060, 0x064, 0, 2, 7, 0x04, 20),
  823. MUX_GATE_CLR_SET_UPD(CLK_TOP_CAMTG, "top_camtg",
  824. camtg_parents, 0x05C, 0x060, 0x064, 8, 3, 15, 0x04, 21),
  825. MUX_GATE_CLR_SET_UPD(CLK_TOP_CAMTG2, "top_camtg2",
  826. camtg_parents, 0x05C, 0x060, 0x064, 16, 3, 23, 0x04, 22),
  827. MUX_GATE_CLR_SET_UPD(CLK_TOP_CAMTG3, "top_camtg3",
  828. camtg_parents, 0x05C, 0x060, 0x064, 24, 3, 31, 0x04, 23),
  829. /* CLK_CFG_6 */
  830. MUX_GATE_CLR_SET_UPD(CLK_TOP_CAMTG4, "top_camtg4",
  831. camtg_parents, 0x068, 0x06C, 0x070, 0, 3, 7, 0x04, 24),
  832. MUX_GATE_CLR_SET_UPD(CLK_TOP_CAMTG5, "top_camtg5",
  833. camtg_parents, 0x068, 0x06C, 0x070, 8, 3, 15, 0x04, 25),
  834. MUX_GATE_CLR_SET_UPD(CLK_TOP_UART, "top_uart",
  835. uart_parents, 0x068, 0x06C, 0x070, 16, 1, 23, 0x04, 26),
  836. MUX_GATE_CLR_SET_UPD(CLK_TOP_SPI, "top_spi",
  837. spi_parents, 0x068, 0x06C, 0x070, 24, 3, 31, 0x04, 27),
  838. /* CLK_CFG_7 */
  839. MUX_GATE_CLR_SET_UPD(CLK_TOP_SPIS, "top_spis",
  840. spis_parents, 0x074, 0x078, 0x07C, 0, 3, 7, 0x04, 28),
  841. MUX_GATE_CLR_SET_UPD(CLK_TOP_MSDC50_0_HCLK, "top_msdc50_0_hclk",
  842. msdc50_0_h_parents, 0x074, 0x078, 0x07C, 8, 2, 15, 0x04, 29),
  843. MUX_GATE_CLR_SET_UPD(CLK_TOP_MSDC50_0, "top_msdc50_0",
  844. msdc50_0_parents, 0x074, 0x078, 0x07C, 16, 3, 23, 0x04, 30),
  845. MUX_GATE_CLR_SET_UPD(CLK_TOP_MSDC30_1, "top_msdc30_1",
  846. msdc30_parents, 0x074, 0x078, 0x07C, 24, 3, 31, 0x04, 31),
  847. /* CLK_CFG_8 */
  848. MUX_GATE_CLR_SET_UPD(CLK_TOP_MSDC30_2, "top_msdc30_2",
  849. msdc30_parents, 0x080, 0x084, 0x088, 0, 3, 7, 0x08, 0),
  850. MUX_GATE_CLR_SET_UPD(CLK_TOP_INTDIR, "top_intdir",
  851. intdir_parents, 0x080, 0x084, 0x088, 8, 2, 15, 0x08, 1),
  852. MUX_GATE_CLR_SET_UPD(CLK_TOP_AUD_INTBUS, "top_aud_intbus",
  853. aud_intbus_parents, 0x080, 0x084, 0x088, 16, 2, 23, 0x08, 2),
  854. MUX_GATE_CLR_SET_UPD(CLK_TOP_AUDIO_H, "top_audio_h",
  855. audio_h_parents, 0x080, 0x084, 0x088, 24, 2, 31, 0x08, 3),
  856. /*
  857. * CLK_CFG_9
  858. * top_pwrmcu is main clock in other co-processor, should not be
  859. * handled by Linux.
  860. */
  861. MUX_GATE_CLR_SET_UPD(CLK_TOP_PWRAP_ULPOSC, "top_pwrap_ulposc",
  862. pwrap_ulposc_parents, 0x08C, 0x090, 0x094, 0, 3, 7, 0x08, 4),
  863. MUX_GATE_CLR_SET_UPD(CLK_TOP_ATB, "top_atb",
  864. atb_parents, 0x08C, 0x090, 0x094, 8, 2, 15, 0x08, 5),
  865. MUX_GATE_CLR_SET_UPD_FLAGS(CLK_TOP_PWRMCU, "top_pwrmcu",
  866. pwrmcu_parents, 0x08C, 0x090, 0x094, 16, 3, 23, 0x08, 6, CLK_IS_CRITICAL),
  867. MUX_GATE_CLR_SET_UPD(CLK_TOP_DP, "top_dp",
  868. dp_parents, 0x08C, 0x090, 0x094, 24, 4, 31, 0x08, 7),
  869. /* CLK_CFG_10 */
  870. MUX_GATE_CLR_SET_UPD(CLK_TOP_EDP, "top_edp",
  871. dp_parents, 0x098, 0x09C, 0x0A0, 0, 4, 7, 0x08, 8),
  872. MUX_GATE_CLR_SET_UPD(CLK_TOP_DPI, "top_dpi",
  873. dp_parents, 0x098, 0x09C, 0x0A0, 8, 4, 15, 0x08, 9),
  874. MUX_GATE_CLR_SET_UPD(CLK_TOP_DISP_PWM0, "top_disp_pwm0",
  875. disp_pwm_parents, 0x098, 0x09C, 0x0A0, 16, 3, 23, 0x08, 10),
  876. MUX_GATE_CLR_SET_UPD(CLK_TOP_DISP_PWM1, "top_disp_pwm1",
  877. disp_pwm_parents, 0x098, 0x09C, 0x0A0, 24, 3, 31, 0x08, 11),
  878. /* CLK_CFG_11 */
  879. MUX_GATE_CLR_SET_UPD(CLK_TOP_USB_TOP, "top_usb_top",
  880. usb_parents, 0x0A4, 0x0A8, 0x0AC, 0, 2, 7, 0x08, 12),
  881. MUX_GATE_CLR_SET_UPD(CLK_TOP_SSUSB_XHCI, "top_ssusb_xhci",
  882. usb_parents, 0x0A4, 0x0A8, 0x0AC, 8, 2, 15, 0x08, 13),
  883. MUX_GATE_CLR_SET_UPD(CLK_TOP_USB_TOP_1P, "top_usb_top_1p",
  884. usb_parents, 0x0A4, 0x0A8, 0x0AC, 16, 2, 23, 0x08, 14),
  885. MUX_GATE_CLR_SET_UPD(CLK_TOP_SSUSB_XHCI_1P, "top_ssusb_xhci_1p",
  886. usb_parents, 0x0A4, 0x0A8, 0x0AC, 24, 2, 31, 0x08, 15),
  887. /* CLK_CFG_12 */
  888. MUX_GATE_CLR_SET_UPD(CLK_TOP_USB_TOP_2P, "top_usb_top_2p",
  889. usb_parents, 0x0B0, 0x0B4, 0x0B8, 0, 2, 7, 0x08, 16),
  890. MUX_GATE_CLR_SET_UPD(CLK_TOP_SSUSB_XHCI_2P, "top_ssusb_xhci_2p",
  891. usb_parents, 0x0B0, 0x0B4, 0x0B8, 8, 2, 15, 0x08, 17),
  892. MUX_GATE_CLR_SET_UPD(CLK_TOP_USB_TOP_3P, "top_usb_top_3p",
  893. usb_parents, 0x0B0, 0x0B4, 0x0B8, 16, 2, 23, 0x08, 18),
  894. MUX_GATE_CLR_SET_UPD(CLK_TOP_SSUSB_XHCI_3P, "top_ssusb_xhci_3p",
  895. usb_parents, 0x0B0, 0x0B4, 0x0B8, 24, 2, 31, 0x08, 19),
  896. /* CLK_CFG_13 */
  897. MUX_GATE_CLR_SET_UPD(CLK_TOP_I2C, "top_i2c",
  898. i2c_parents, 0x0BC, 0x0C0, 0x0C4, 0, 2, 7, 0x08, 20),
  899. MUX_GATE_CLR_SET_UPD(CLK_TOP_SENINF, "top_seninf",
  900. seninf_parents, 0x0BC, 0x0C0, 0x0C4, 8, 3, 15, 0x08, 21),
  901. MUX_GATE_CLR_SET_UPD(CLK_TOP_SENINF1, "top_seninf1",
  902. seninf_parents, 0x0BC, 0x0C0, 0x0C4, 16, 3, 23, 0x08, 22),
  903. MUX_GATE_CLR_SET_UPD(CLK_TOP_SENINF2, "top_seninf2",
  904. seninf_parents, 0x0BC, 0x0C0, 0x0C4, 24, 3, 31, 0x08, 23),
  905. /* CLK_CFG_14 */
  906. MUX_GATE_CLR_SET_UPD(CLK_TOP_SENINF3, "top_seninf3",
  907. seninf_parents, 0x0C8, 0x0CC, 0x0D0, 0, 3, 7, 0x08, 24),
  908. MUX_GATE_CLR_SET_UPD(CLK_TOP_GCPU, "top_gcpu",
  909. gcpu_parents, 0x0C8, 0x0CC, 0x0D0, 8, 3, 15, 0x08, 25),
  910. MUX_GATE_CLR_SET_UPD(CLK_TOP_DXCC, "top_dxcc",
  911. dxcc_parents, 0x0C8, 0x0CC, 0x0D0, 16, 2, 23, 0x08, 26),
  912. MUX_GATE_CLR_SET_UPD(CLK_TOP_DPMAIF_MAIN, "top_dpmaif_main",
  913. dpmaif_parents, 0x0C8, 0x0CC, 0x0D0, 24, 3, 31, 0x08, 27),
  914. /* CLK_CFG_15 */
  915. MUX_GATE_CLR_SET_UPD(CLK_TOP_AES_UFSFDE, "top_aes_ufsfde",
  916. aes_fde_parents, 0x0D4, 0x0D8, 0x0DC, 0, 3, 7, 0x08, 28),
  917. MUX_GATE_CLR_SET_UPD(CLK_TOP_UFS, "top_ufs",
  918. ufs_parents, 0x0D4, 0x0D8, 0x0DC, 8, 3, 15, 0x08, 29),
  919. MUX_GATE_CLR_SET_UPD(CLK_TOP_UFS_TICK1US, "top_ufs_tick1us",
  920. ufs_tick1us_parents, 0x0D4, 0x0D8, 0x0DC, 16, 1, 23, 0x08, 30),
  921. MUX_GATE_CLR_SET_UPD(CLK_TOP_UFS_MP_SAP_CFG, "top_ufs_mp_sap_cfg",
  922. ufs_mp_sap_parents, 0x0D4, 0x0D8, 0x0DC, 24, 1, 31, 0x08, 31),
  923. /*
  924. * CLK_CFG_16
  925. * top_mcupm is main clock in other co-processor, should not be
  926. * handled by Linux.
  927. */
  928. MUX_GATE_CLR_SET_UPD(CLK_TOP_VENC, "top_venc",
  929. venc_parents, 0x0E0, 0x0E4, 0x0E8, 0, 4, 7, 0x0C, 0),
  930. MUX_GATE_CLR_SET_UPD(CLK_TOP_VDEC, "top_vdec",
  931. vdec_parents, 0x0E0, 0x0E4, 0x0E8, 8, 4, 15, 0x0C, 1),
  932. MUX_GATE_CLR_SET_UPD(CLK_TOP_PWM, "top_pwm",
  933. pwm_parents, 0x0E0, 0x0E4, 0x0E8, 16, 1, 23, 0x0C, 2),
  934. MUX_GATE_CLR_SET_UPD_FLAGS(CLK_TOP_MCUPM, "top_mcupm",
  935. mcupm_parents, 0x0E0, 0x0E4, 0x0E8, 24, 2, 31, 0x0C, 3, CLK_IS_CRITICAL),
  936. /*
  937. * CLK_CFG_17
  938. * top_dvfsrc is for internal DVFS usage, should not be handled by Linux.
  939. */
  940. MUX_GATE_CLR_SET_UPD(CLK_TOP_SPMI_P_MST, "top_spmi_p_mst",
  941. spmi_parents, 0x0EC, 0x0F0, 0x0F4, 0, 4, 7, 0x0C, 4),
  942. MUX_GATE_CLR_SET_UPD(CLK_TOP_SPMI_M_MST, "top_spmi_m_mst",
  943. spmi_parents, 0x0EC, 0x0F0, 0x0F4, 8, 4, 15, 0x0C, 5),
  944. MUX_GATE_CLR_SET_UPD_FLAGS(CLK_TOP_DVFSRC, "top_dvfsrc",
  945. dvfsrc_parents, 0x0EC, 0x0F0, 0x0F4, 16, 2, 23, 0x0C, 6, CLK_IS_CRITICAL),
  946. MUX_GATE_CLR_SET_UPD(CLK_TOP_TL, "top_tl",
  947. tl_parents, 0x0EC, 0x0F0, 0x0F4, 24, 2, 31, 0x0C, 7),
  948. /* CLK_CFG_18 */
  949. MUX_GATE_CLR_SET_UPD(CLK_TOP_TL_P1, "top_tl_p1",
  950. tl_parents, 0x0F8, 0x0FC, 0x0100, 0, 2, 7, 0x0C, 8),
  951. MUX_GATE_CLR_SET_UPD(CLK_TOP_AES_MSDCFDE, "top_aes_msdcfde",
  952. aes_fde_parents, 0x0F8, 0x0FC, 0x0100, 8, 3, 15, 0x0C, 9),
  953. MUX_GATE_CLR_SET_UPD(CLK_TOP_DSI_OCC, "top_dsi_occ",
  954. dsi_occ_parents, 0x0F8, 0x0FC, 0x0100, 16, 2, 23, 0x0C, 10),
  955. MUX_GATE_CLR_SET_UPD(CLK_TOP_WPE_VPP, "top_wpe_vpp",
  956. wpe_vpp_parents, 0x0F8, 0x0FC, 0x0100, 24, 4, 31, 0x0C, 11),
  957. /* CLK_CFG_19 */
  958. MUX_GATE_CLR_SET_UPD(CLK_TOP_HDCP, "top_hdcp",
  959. hdcp_parents, 0x0104, 0x0108, 0x010C, 0, 2, 7, 0x0C, 12),
  960. MUX_GATE_CLR_SET_UPD(CLK_TOP_HDCP_24M, "top_hdcp_24m",
  961. hdcp_24m_parents, 0x0104, 0x0108, 0x010C, 8, 2, 15, 0x0C, 13),
  962. MUX_GATE_CLR_SET_UPD(CLK_TOP_HD20_DACR_REF_CLK, "top_hd20_dacr_ref_clk",
  963. hd20_dacr_ref_parents, 0x0104, 0x0108, 0x010C, 16, 2, 23, 0x0C, 14),
  964. MUX_GATE_CLR_SET_UPD(CLK_TOP_HD20_HDCP_CCLK, "top_hd20_hdcp_cclk",
  965. hd20_hdcp_c_parents, 0x0104, 0x0108, 0x010C, 24, 2, 31, 0x0C, 15),
  966. /* CLK_CFG_20 */
  967. MUX_GATE_CLR_SET_UPD(CLK_TOP_HDMI_XTAL, "top_hdmi_xtal",
  968. hdmi_xtal_parents, 0x0110, 0x0114, 0x0118, 0, 1, 7, 0x0C, 16),
  969. MUX_GATE_CLR_SET_UPD(CLK_TOP_HDMI_APB, "top_hdmi_apb",
  970. hdmi_apb_parents, 0x0110, 0x0114, 0x0118, 8, 2, 15, 0x0C, 17),
  971. MUX_GATE_CLR_SET_UPD(CLK_TOP_SNPS_ETH_250M, "top_snps_eth_250m",
  972. snps_eth_250m_parents, 0x0110, 0x0114, 0x0118, 16, 1, 23, 0x0C, 18),
  973. MUX_GATE_CLR_SET_UPD(CLK_TOP_SNPS_ETH_62P4M_PTP, "top_snps_eth_62p4m_ptp",
  974. snps_eth_62p4m_ptp_parents, 0x0110, 0x0114, 0x0118, 24, 2, 31, 0x0C, 19),
  975. /* CLK_CFG_21 */
  976. MUX_GATE_CLR_SET_UPD(CLK_TOP_SNPS_ETH_50M_RMII, "snps_eth_50m_rmii",
  977. snps_eth_50m_rmii_parents, 0x011C, 0x0120, 0x0124, 0, 1, 7, 0x0C, 20),
  978. MUX_GATE_CLR_SET_UPD(CLK_TOP_DGI_OUT, "top_dgi_out",
  979. dgi_out_parents, 0x011C, 0x0120, 0x0124, 8, 3, 15, 0x0C, 21),
  980. MUX_GATE_CLR_SET_UPD(CLK_TOP_NNA0, "top_nna0",
  981. nna_parents, 0x011C, 0x0120, 0x0124, 16, 4, 23, 0x0C, 22),
  982. MUX_GATE_CLR_SET_UPD(CLK_TOP_NNA1, "top_nna1",
  983. nna_parents, 0x011C, 0x0120, 0x0124, 24, 4, 31, 0x0C, 23),
  984. /* CLK_CFG_22 */
  985. MUX_GATE_CLR_SET_UPD(CLK_TOP_ADSP, "top_adsp",
  986. adsp_parents, 0x0128, 0x012C, 0x0130, 0, 4, 7, 0x0C, 24),
  987. MUX_GATE_CLR_SET_UPD(CLK_TOP_ASM_H, "top_asm_h",
  988. asm_parents, 0x0128, 0x012C, 0x0130, 8, 2, 15, 0x0C, 25),
  989. MUX_GATE_CLR_SET_UPD(CLK_TOP_ASM_M, "top_asm_m",
  990. asm_parents, 0x0128, 0x012C, 0x0130, 16, 2, 23, 0x0C, 26),
  991. MUX_GATE_CLR_SET_UPD(CLK_TOP_ASM_L, "top_asm_l",
  992. asm_parents, 0x0128, 0x012C, 0x0130, 24, 2, 31, 0x0C, 27),
  993. /* CLK_CFG_23 */
  994. MUX_GATE_CLR_SET_UPD(CLK_TOP_APLL1, "top_apll1",
  995. apll1_parents, 0x0134, 0x0138, 0x013C, 0, 1, 7, 0x0C, 28),
  996. MUX_GATE_CLR_SET_UPD(CLK_TOP_APLL2, "top_apll2",
  997. apll2_parents, 0x0134, 0x0138, 0x013C, 8, 1, 15, 0x0C, 29),
  998. MUX_GATE_CLR_SET_UPD(CLK_TOP_APLL3, "top_apll3",
  999. apll3_parents, 0x0134, 0x0138, 0x013C, 16, 1, 23, 0x0C, 30),
  1000. MUX_GATE_CLR_SET_UPD(CLK_TOP_APLL4, "top_apll4",
  1001. apll4_parents, 0x0134, 0x0138, 0x013C, 24, 1, 31, 0x0C, 31),
  1002. /*
  1003. * CLK_CFG_24
  1004. * i2so4_mck is not used in MT8195.
  1005. */
  1006. MUX_GATE_CLR_SET_UPD(CLK_TOP_APLL5, "top_apll5",
  1007. apll5_parents, 0x0140, 0x0144, 0x0148, 0, 1, 7, 0x010, 0),
  1008. MUX_GATE_CLR_SET_UPD(CLK_TOP_I2SO1_MCK, "top_i2so1_mck",
  1009. i2s_parents, 0x0140, 0x0144, 0x0148, 8, 3, 15, 0x010, 1),
  1010. MUX_GATE_CLR_SET_UPD(CLK_TOP_I2SO2_MCK, "top_i2so2_mck",
  1011. i2s_parents, 0x0140, 0x0144, 0x0148, 16, 3, 23, 0x010, 2),
  1012. /*
  1013. * CLK_CFG_25
  1014. * i2so5_mck and i2si4_mck are not used in MT8195.
  1015. */
  1016. MUX_GATE_CLR_SET_UPD(CLK_TOP_I2SI1_MCK, "top_i2si1_mck",
  1017. i2s_parents, 0x014C, 0x0150, 0x0154, 8, 3, 15, 0x010, 5),
  1018. MUX_GATE_CLR_SET_UPD(CLK_TOP_I2SI2_MCK, "top_i2si2_mck",
  1019. i2s_parents, 0x014C, 0x0150, 0x0154, 16, 3, 23, 0x010, 6),
  1020. /*
  1021. * CLK_CFG_26
  1022. * i2si5_mck is not used in MT8195.
  1023. */
  1024. MUX_GATE_CLR_SET_UPD(CLK_TOP_DPTX_MCK, "top_dptx_mck",
  1025. i2s_parents, 0x0158, 0x015C, 0x0160, 8, 3, 15, 0x010, 9),
  1026. MUX_GATE_CLR_SET_UPD(CLK_TOP_AUD_IEC_CLK, "top_aud_iec_clk",
  1027. i2s_parents, 0x0158, 0x015C, 0x0160, 16, 3, 23, 0x010, 10),
  1028. MUX_GATE_CLR_SET_UPD(CLK_TOP_A1SYS_HP, "top_a1sys_hp",
  1029. a1sys_hp_parents, 0x0158, 0x015C, 0x0160, 24, 1, 31, 0x010, 11),
  1030. /* CLK_CFG_27 */
  1031. MUX_GATE_CLR_SET_UPD(CLK_TOP_A2SYS_HF, "top_a2sys_hf",
  1032. a2sys_parents, 0x0164, 0x0168, 0x016C, 0, 1, 7, 0x010, 12),
  1033. MUX_GATE_CLR_SET_UPD(CLK_TOP_A3SYS_HF, "top_a3sys_hf",
  1034. a3sys_parents, 0x0164, 0x0168, 0x016C, 8, 3, 15, 0x010, 13),
  1035. MUX_GATE_CLR_SET_UPD(CLK_TOP_A4SYS_HF, "top_a4sys_hf",
  1036. a3sys_parents, 0x0164, 0x0168, 0x016C, 16, 3, 23, 0x010, 14),
  1037. MUX_GATE_CLR_SET_UPD(CLK_TOP_SPINFI_BCLK, "top_spinfi_bclk",
  1038. spinfi_b_parents, 0x0164, 0x0168, 0x016C, 24, 3, 31, 0x010, 15),
  1039. /* CLK_CFG_28 */
  1040. MUX_GATE_CLR_SET_UPD(CLK_TOP_NFI1X, "top_nfi1x",
  1041. nfi1x_parents, 0x0170, 0x0174, 0x0178, 0, 3, 7, 0x010, 16),
  1042. MUX_GATE_CLR_SET_UPD(CLK_TOP_ECC, "top_ecc",
  1043. ecc_parents, 0x0170, 0x0174, 0x0178, 8, 3, 15, 0x010, 17),
  1044. MUX_GATE_CLR_SET_UPD(CLK_TOP_AUDIO_LOCAL_BUS, "top_audio_local_bus",
  1045. audio_local_bus_parents, 0x0170, 0x0174, 0x0178, 16, 4, 23, 0x010, 18),
  1046. MUX_GATE_CLR_SET_UPD(CLK_TOP_SPINOR, "top_spinor",
  1047. spinor_parents, 0x0170, 0x0174, 0x0178, 24, 2, 31, 0x010, 19),
  1048. /*
  1049. * CLK_CFG_29
  1050. * top_ulposc/top_ulposc_core/top_srck are clock source of always on co-processor,
  1051. * should not be closed by Linux.
  1052. */
  1053. MUX_GATE_CLR_SET_UPD(CLK_TOP_DVIO_DGI_REF, "top_dvio_dgi_ref",
  1054. dvio_dgi_ref_parents, 0x017C, 0x0180, 0x0184, 0, 3, 7, 0x010, 20),
  1055. MUX_GATE_CLR_SET_UPD_FLAGS(CLK_TOP_ULPOSC, "top_ulposc",
  1056. ulposc_parents, 0x017C, 0x0180, 0x0184, 8, 2, 15, 0x010, 21, CLK_IS_CRITICAL),
  1057. MUX_GATE_CLR_SET_UPD_FLAGS(CLK_TOP_ULPOSC_CORE, "top_ulposc_core",
  1058. ulposc_core_parents, 0x017C, 0x0180, 0x0184, 16, 2, 23, 0x010, 22, CLK_IS_CRITICAL),
  1059. MUX_GATE_CLR_SET_UPD_FLAGS(CLK_TOP_SRCK, "top_srck",
  1060. srck_parents, 0x017C, 0x0180, 0x0184, 24, 1, 31, 0x010, 23, CLK_IS_CRITICAL),
  1061. /*
  1062. * the clocks in CLK_CFG_30 ~ 37 are backup clock source, no need to handled
  1063. * by Linux.
  1064. */
  1065. };
  1066. static const struct mtk_composite top_adj_divs[] = {
  1067. DIV_GATE(CLK_TOP_APLL12_DIV0, "apll12_div0", "top_i2si1_mck", 0x0320, 0, 0x0328, 8, 0),
  1068. DIV_GATE(CLK_TOP_APLL12_DIV1, "apll12_div1", "top_i2si2_mck", 0x0320, 1, 0x0328, 8, 8),
  1069. DIV_GATE(CLK_TOP_APLL12_DIV2, "apll12_div2", "top_i2so1_mck", 0x0320, 2, 0x0328, 8, 16),
  1070. DIV_GATE(CLK_TOP_APLL12_DIV3, "apll12_div3", "top_i2so2_mck", 0x0320, 3, 0x0328, 8, 24),
  1071. DIV_GATE(CLK_TOP_APLL12_DIV4, "apll12_div4", "top_aud_iec_clk", 0x0320, 4, 0x0334, 8, 0),
  1072. /* apll12_div5 ~ 8 are not used in MT8195. */
  1073. DIV_GATE(CLK_TOP_APLL12_DIV9, "apll12_div9", "top_dptx_mck", 0x0320, 9, 0x0338, 8, 8),
  1074. };
  1075. static const struct mtk_gate_regs top0_cg_regs = {
  1076. .set_ofs = 0x238,
  1077. .clr_ofs = 0x238,
  1078. .sta_ofs = 0x238,
  1079. };
  1080. static const struct mtk_gate_regs top1_cg_regs = {
  1081. .set_ofs = 0x250,
  1082. .clr_ofs = 0x250,
  1083. .sta_ofs = 0x250,
  1084. };
  1085. #define GATE_TOP0_FLAGS(_id, _name, _parent, _shift, _flag) \
  1086. GATE_MTK_FLAGS(_id, _name, _parent, &top0_cg_regs, _shift, \
  1087. &mtk_clk_gate_ops_no_setclr_inv, _flag)
  1088. #define GATE_TOP0(_id, _name, _parent, _shift) \
  1089. GATE_TOP0_FLAGS(_id, _name, _parent, _shift, 0)
  1090. #define GATE_TOP1(_id, _name, _parent, _shift) \
  1091. GATE_MTK(_id, _name, _parent, &top1_cg_regs, _shift, &mtk_clk_gate_ops_no_setclr_inv)
  1092. static const struct mtk_gate top_clks[] = {
  1093. /* TOP0 */
  1094. GATE_TOP0(CLK_TOP_CFG_VPP0, "cfg_vpp0", "top_vpp", 0),
  1095. GATE_TOP0(CLK_TOP_CFG_VPP1, "cfg_vpp1", "top_vpp", 1),
  1096. GATE_TOP0(CLK_TOP_CFG_VDO0, "cfg_vdo0", "top_vpp", 2),
  1097. GATE_TOP0(CLK_TOP_CFG_VDO1, "cfg_vdo1", "top_vpp", 3),
  1098. GATE_TOP0(CLK_TOP_CFG_UNIPLL_SES, "cfg_unipll_ses", "univpll_d2", 4),
  1099. GATE_TOP0(CLK_TOP_CFG_26M_VPP0, "cfg_26m_vpp0", "clk26m", 5),
  1100. GATE_TOP0(CLK_TOP_CFG_26M_VPP1, "cfg_26m_vpp1", "clk26m", 6),
  1101. GATE_TOP0(CLK_TOP_CFG_26M_AUD, "cfg_26m_aud", "clk26m", 9),
  1102. /*
  1103. * cfg_axi_east, cfg_axi_east_north, cfg_axi_north and cfg_axi_south
  1104. * are peripheral bus clock branches.
  1105. */
  1106. GATE_TOP0_FLAGS(CLK_TOP_CFG_AXI_EAST, "cfg_axi_east", "top_axi", 10, CLK_IS_CRITICAL),
  1107. GATE_TOP0_FLAGS(CLK_TOP_CFG_AXI_EAST_NORTH, "cfg_axi_east_north", "top_axi", 11,
  1108. CLK_IS_CRITICAL),
  1109. GATE_TOP0_FLAGS(CLK_TOP_CFG_AXI_NORTH, "cfg_axi_north", "top_axi", 12, CLK_IS_CRITICAL),
  1110. GATE_TOP0_FLAGS(CLK_TOP_CFG_AXI_SOUTH, "cfg_axi_south", "top_axi", 13, CLK_IS_CRITICAL),
  1111. GATE_TOP0(CLK_TOP_CFG_EXT_TEST, "cfg_ext_test", "msdcpll_d2", 15),
  1112. /* TOP1 */
  1113. GATE_TOP1(CLK_TOP_SSUSB_REF, "ssusb_ref", "clk26m", 0),
  1114. GATE_TOP1(CLK_TOP_SSUSB_PHY_REF, "ssusb_phy_ref", "clk26m", 1),
  1115. GATE_TOP1(CLK_TOP_SSUSB_P1_REF, "ssusb_p1_ref", "clk26m", 2),
  1116. GATE_TOP1(CLK_TOP_SSUSB_PHY_P1_REF, "ssusb_phy_p1_ref", "clk26m", 3),
  1117. GATE_TOP1(CLK_TOP_SSUSB_P2_REF, "ssusb_p2_ref", "clk26m", 4),
  1118. GATE_TOP1(CLK_TOP_SSUSB_PHY_P2_REF, "ssusb_phy_p2_ref", "clk26m", 5),
  1119. GATE_TOP1(CLK_TOP_SSUSB_P3_REF, "ssusb_p3_ref", "clk26m", 6),
  1120. GATE_TOP1(CLK_TOP_SSUSB_PHY_P3_REF, "ssusb_phy_p3_ref", "clk26m", 7),
  1121. };
  1122. static const struct of_device_id of_match_clk_mt8195_topck[] = {
  1123. { .compatible = "mediatek,mt8195-topckgen", },
  1124. {}
  1125. };
  1126. /* Register mux notifier for MFG mux */
  1127. static int clk_mt8195_reg_mfg_mux_notifier(struct device *dev, struct clk *clk)
  1128. {
  1129. struct mtk_mux_nb *mfg_mux_nb;
  1130. mfg_mux_nb = devm_kzalloc(dev, sizeof(*mfg_mux_nb), GFP_KERNEL);
  1131. if (!mfg_mux_nb)
  1132. return -ENOMEM;
  1133. mfg_mux_nb->ops = &clk_mux_ops;
  1134. mfg_mux_nb->bypass_index = 0; /* Bypass to TOP_MFG_CORE_TMP */
  1135. return devm_mtk_clk_mux_notifier_register(dev, clk, mfg_mux_nb);
  1136. }
  1137. static int clk_mt8195_topck_probe(struct platform_device *pdev)
  1138. {
  1139. struct clk_hw_onecell_data *top_clk_data;
  1140. struct device_node *node = pdev->dev.of_node;
  1141. struct clk_hw *hw;
  1142. int r;
  1143. void __iomem *base;
  1144. top_clk_data = mtk_alloc_clk_data(CLK_TOP_NR_CLK);
  1145. if (!top_clk_data)
  1146. return -ENOMEM;
  1147. base = devm_platform_ioremap_resource(pdev, 0);
  1148. if (IS_ERR(base)) {
  1149. r = PTR_ERR(base);
  1150. goto free_top_data;
  1151. }
  1152. r = mtk_clk_register_fixed_clks(top_fixed_clks, ARRAY_SIZE(top_fixed_clks),
  1153. top_clk_data);
  1154. if (r)
  1155. goto free_top_data;
  1156. r = mtk_clk_register_factors(top_divs, ARRAY_SIZE(top_divs), top_clk_data);
  1157. if (r)
  1158. goto unregister_fixed_clks;
  1159. r = mtk_clk_register_muxes(top_mtk_muxes, ARRAY_SIZE(top_mtk_muxes), node,
  1160. &mt8195_clk_lock, top_clk_data);
  1161. if (r)
  1162. goto unregister_factors;
  1163. hw = devm_clk_hw_register_mux(&pdev->dev, "mfg_ck_fast_ref", mfg_fast_parents,
  1164. ARRAY_SIZE(mfg_fast_parents), CLK_SET_RATE_PARENT,
  1165. (base + 0x250), 8, 1, 0, &mt8195_clk_lock);
  1166. if (IS_ERR(hw)) {
  1167. r = PTR_ERR(hw);
  1168. goto unregister_muxes;
  1169. }
  1170. top_clk_data->hws[CLK_TOP_MFG_CK_FAST_REF] = hw;
  1171. r = clk_mt8195_reg_mfg_mux_notifier(&pdev->dev,
  1172. top_clk_data->hws[CLK_TOP_MFG_CK_FAST_REF]->clk);
  1173. if (r)
  1174. goto unregister_muxes;
  1175. r = mtk_clk_register_composites(top_adj_divs, ARRAY_SIZE(top_adj_divs), base,
  1176. &mt8195_clk_lock, top_clk_data);
  1177. if (r)
  1178. goto unregister_muxes;
  1179. r = mtk_clk_register_gates(node, top_clks, ARRAY_SIZE(top_clks), top_clk_data);
  1180. if (r)
  1181. goto unregister_composite_divs;
  1182. r = of_clk_add_hw_provider(node, of_clk_hw_onecell_get, top_clk_data);
  1183. if (r)
  1184. goto unregister_gates;
  1185. platform_set_drvdata(pdev, top_clk_data);
  1186. return r;
  1187. unregister_gates:
  1188. mtk_clk_unregister_gates(top_clks, ARRAY_SIZE(top_clks), top_clk_data);
  1189. unregister_composite_divs:
  1190. mtk_clk_unregister_composites(top_adj_divs, ARRAY_SIZE(top_adj_divs), top_clk_data);
  1191. unregister_muxes:
  1192. mtk_clk_unregister_muxes(top_mtk_muxes, ARRAY_SIZE(top_mtk_muxes), top_clk_data);
  1193. unregister_factors:
  1194. mtk_clk_unregister_factors(top_divs, ARRAY_SIZE(top_divs), top_clk_data);
  1195. unregister_fixed_clks:
  1196. mtk_clk_unregister_fixed_clks(top_fixed_clks, ARRAY_SIZE(top_fixed_clks), top_clk_data);
  1197. free_top_data:
  1198. mtk_free_clk_data(top_clk_data);
  1199. return r;
  1200. }
  1201. static int clk_mt8195_topck_remove(struct platform_device *pdev)
  1202. {
  1203. struct clk_hw_onecell_data *top_clk_data = platform_get_drvdata(pdev);
  1204. struct device_node *node = pdev->dev.of_node;
  1205. of_clk_del_provider(node);
  1206. mtk_clk_unregister_gates(top_clks, ARRAY_SIZE(top_clks), top_clk_data);
  1207. mtk_clk_unregister_composites(top_adj_divs, ARRAY_SIZE(top_adj_divs), top_clk_data);
  1208. mtk_clk_unregister_muxes(top_mtk_muxes, ARRAY_SIZE(top_mtk_muxes), top_clk_data);
  1209. mtk_clk_unregister_factors(top_divs, ARRAY_SIZE(top_divs), top_clk_data);
  1210. mtk_clk_unregister_fixed_clks(top_fixed_clks, ARRAY_SIZE(top_fixed_clks), top_clk_data);
  1211. mtk_free_clk_data(top_clk_data);
  1212. return 0;
  1213. }
  1214. static struct platform_driver clk_mt8195_topck_drv = {
  1215. .probe = clk_mt8195_topck_probe,
  1216. .remove = clk_mt8195_topck_remove,
  1217. .driver = {
  1218. .name = "clk-mt8195-topck",
  1219. .of_match_table = of_match_clk_mt8195_topck,
  1220. },
  1221. };
  1222. builtin_platform_driver(clk_mt8195_topck_drv);