nsscc-ipq5424.c 36 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340
  1. // SPDX-License-Identifier: GPL-2.0-only
  2. /*
  3. * Copyright (c) Qualcomm Technologies, Inc. and/or its subsidiaries.
  4. */
  5. #include <linux/clk.h>
  6. #include <linux/clk-provider.h>
  7. #include <linux/err.h>
  8. #include <linux/interconnect-provider.h>
  9. #include <linux/kernel.h>
  10. #include <linux/module.h>
  11. #include <linux/of.h>
  12. #include <linux/of_device.h>
  13. #include <linux/platform_device.h>
  14. #include <linux/pm_clock.h>
  15. #include <linux/pm_runtime.h>
  16. #include <linux/regmap.h>
  17. #include <dt-bindings/clock/qcom,ipq5424-nsscc.h>
  18. #include <dt-bindings/interconnect/qcom,ipq5424.h>
  19. #include <dt-bindings/reset/qcom,ipq5424-nsscc.h>
  20. #include "clk-branch.h"
  21. #include "clk-rcg.h"
  22. #include "clk-regmap.h"
  23. #include "clk-regmap-divider.h"
  24. #include "common.h"
  25. #include "reset.h"
  26. /* Need to match the order of clocks in DT binding */
  27. enum {
  28. DT_CMN_PLL_XO_CLK,
  29. DT_CMN_PLL_NSS_300M_CLK,
  30. DT_CMN_PLL_NSS_375M_CLK,
  31. DT_GCC_GPLL0_OUT_AUX,
  32. DT_UNIPHY0_NSS_RX_CLK,
  33. DT_UNIPHY0_NSS_TX_CLK,
  34. DT_UNIPHY1_NSS_RX_CLK,
  35. DT_UNIPHY1_NSS_TX_CLK,
  36. DT_UNIPHY2_NSS_RX_CLK,
  37. DT_UNIPHY2_NSS_TX_CLK,
  38. };
  39. enum {
  40. P_CMN_PLL_XO_CLK,
  41. P_CMN_PLL_NSS_300M_CLK,
  42. P_CMN_PLL_NSS_375M_CLK,
  43. P_GCC_GPLL0_OUT_AUX,
  44. P_UNIPHY0_NSS_RX_CLK,
  45. P_UNIPHY0_NSS_TX_CLK,
  46. P_UNIPHY1_NSS_RX_CLK,
  47. P_UNIPHY1_NSS_TX_CLK,
  48. P_UNIPHY2_NSS_RX_CLK,
  49. P_UNIPHY2_NSS_TX_CLK,
  50. };
  51. static const struct parent_map nss_cc_parent_map_0[] = {
  52. { P_CMN_PLL_XO_CLK, 0 },
  53. { P_GCC_GPLL0_OUT_AUX, 2 },
  54. { P_CMN_PLL_NSS_300M_CLK, 5 },
  55. { P_CMN_PLL_NSS_375M_CLK, 6 },
  56. };
  57. static const struct clk_parent_data nss_cc_parent_data_0[] = {
  58. { .index = DT_CMN_PLL_XO_CLK },
  59. { .index = DT_GCC_GPLL0_OUT_AUX },
  60. { .index = DT_CMN_PLL_NSS_300M_CLK },
  61. { .index = DT_CMN_PLL_NSS_375M_CLK },
  62. };
  63. static const struct parent_map nss_cc_parent_map_1[] = {
  64. { P_CMN_PLL_XO_CLK, 0 },
  65. { P_GCC_GPLL0_OUT_AUX, 2 },
  66. { P_UNIPHY0_NSS_RX_CLK, 3 },
  67. { P_UNIPHY0_NSS_TX_CLK, 4 },
  68. { P_CMN_PLL_NSS_300M_CLK, 5 },
  69. { P_CMN_PLL_NSS_375M_CLK, 6 },
  70. };
  71. static const struct clk_parent_data nss_cc_parent_data_1[] = {
  72. { .index = DT_CMN_PLL_XO_CLK },
  73. { .index = DT_GCC_GPLL0_OUT_AUX },
  74. { .index = DT_UNIPHY0_NSS_RX_CLK },
  75. { .index = DT_UNIPHY0_NSS_TX_CLK },
  76. { .index = DT_CMN_PLL_NSS_300M_CLK },
  77. { .index = DT_CMN_PLL_NSS_375M_CLK },
  78. };
  79. static const struct parent_map nss_cc_parent_map_2[] = {
  80. { P_CMN_PLL_XO_CLK, 0 },
  81. { P_GCC_GPLL0_OUT_AUX, 2 },
  82. { P_UNIPHY1_NSS_RX_CLK, 3 },
  83. { P_UNIPHY1_NSS_TX_CLK, 4 },
  84. { P_CMN_PLL_NSS_300M_CLK, 5 },
  85. { P_CMN_PLL_NSS_375M_CLK, 6 },
  86. };
  87. static const struct clk_parent_data nss_cc_parent_data_2[] = {
  88. { .index = DT_CMN_PLL_XO_CLK },
  89. { .index = DT_GCC_GPLL0_OUT_AUX },
  90. { .index = DT_UNIPHY1_NSS_RX_CLK },
  91. { .index = DT_UNIPHY1_NSS_TX_CLK },
  92. { .index = DT_CMN_PLL_NSS_300M_CLK },
  93. { .index = DT_CMN_PLL_NSS_375M_CLK },
  94. };
  95. static const struct parent_map nss_cc_parent_map_3[] = {
  96. { P_CMN_PLL_XO_CLK, 0 },
  97. { P_GCC_GPLL0_OUT_AUX, 2 },
  98. { P_UNIPHY2_NSS_RX_CLK, 3 },
  99. { P_UNIPHY2_NSS_TX_CLK, 4 },
  100. { P_CMN_PLL_NSS_300M_CLK, 5 },
  101. { P_CMN_PLL_NSS_375M_CLK, 6 },
  102. };
  103. static const struct clk_parent_data nss_cc_parent_data_3[] = {
  104. { .index = DT_CMN_PLL_XO_CLK },
  105. { .index = DT_GCC_GPLL0_OUT_AUX },
  106. { .index = DT_UNIPHY2_NSS_RX_CLK },
  107. { .index = DT_UNIPHY2_NSS_TX_CLK },
  108. { .index = DT_CMN_PLL_NSS_300M_CLK },
  109. { .index = DT_CMN_PLL_NSS_375M_CLK },
  110. };
  111. static const struct freq_tbl ftbl_nss_cc_ce_clk_src[] = {
  112. F(24000000, P_CMN_PLL_XO_CLK, 1, 0, 0),
  113. F(375000000, P_CMN_PLL_NSS_375M_CLK, 1, 0, 0),
  114. { }
  115. };
  116. static struct clk_rcg2 nss_cc_ce_clk_src = {
  117. .cmd_rcgr = 0x5e0,
  118. .mnd_width = 0,
  119. .hid_width = 5,
  120. .parent_map = nss_cc_parent_map_0,
  121. .freq_tbl = ftbl_nss_cc_ce_clk_src,
  122. .clkr.hw.init = &(const struct clk_init_data){
  123. .name = "nss_cc_ce_clk_src",
  124. .parent_data = nss_cc_parent_data_0,
  125. .num_parents = ARRAY_SIZE(nss_cc_parent_data_0),
  126. .flags = CLK_SET_RATE_PARENT,
  127. .ops = &clk_rcg2_ops,
  128. },
  129. };
  130. static const struct freq_tbl ftbl_nss_cc_cfg_clk_src[] = {
  131. F(100000000, P_GCC_GPLL0_OUT_AUX, 8, 0, 0),
  132. { }
  133. };
  134. static struct clk_rcg2 nss_cc_cfg_clk_src = {
  135. .cmd_rcgr = 0x6a8,
  136. .mnd_width = 0,
  137. .hid_width = 5,
  138. .parent_map = nss_cc_parent_map_0,
  139. .freq_tbl = ftbl_nss_cc_cfg_clk_src,
  140. .clkr.hw.init = &(const struct clk_init_data){
  141. .name = "nss_cc_cfg_clk_src",
  142. .parent_data = nss_cc_parent_data_0,
  143. .num_parents = ARRAY_SIZE(nss_cc_parent_data_0),
  144. .flags = CLK_SET_RATE_PARENT,
  145. .ops = &clk_rcg2_ops,
  146. },
  147. };
  148. static const struct freq_tbl ftbl_nss_cc_eip_bfdcd_clk_src[] = {
  149. F(300000000, P_CMN_PLL_NSS_300M_CLK, 1, 0, 0),
  150. F(375000000, P_CMN_PLL_NSS_375M_CLK, 1, 0, 0),
  151. { }
  152. };
  153. static struct clk_rcg2 nss_cc_eip_bfdcd_clk_src = {
  154. .cmd_rcgr = 0x644,
  155. .mnd_width = 0,
  156. .hid_width = 5,
  157. .parent_map = nss_cc_parent_map_0,
  158. .freq_tbl = ftbl_nss_cc_eip_bfdcd_clk_src,
  159. .clkr.hw.init = &(const struct clk_init_data){
  160. .name = "nss_cc_eip_bfdcd_clk_src",
  161. .parent_data = nss_cc_parent_data_0,
  162. .num_parents = ARRAY_SIZE(nss_cc_parent_data_0),
  163. .flags = CLK_SET_RATE_PARENT,
  164. .ops = &clk_rcg2_ops,
  165. },
  166. };
  167. static const struct freq_conf ftbl_nss_cc_port1_rx_clk_src_25[] = {
  168. C(P_UNIPHY0_NSS_RX_CLK, 12.5, 0, 0),
  169. C(P_UNIPHY0_NSS_RX_CLK, 5, 0, 0),
  170. };
  171. static const struct freq_conf ftbl_nss_cc_port1_rx_clk_src_125[] = {
  172. C(P_UNIPHY0_NSS_RX_CLK, 2.5, 0, 0),
  173. C(P_UNIPHY0_NSS_RX_CLK, 1, 0, 0),
  174. };
  175. static const struct freq_multi_tbl ftbl_nss_cc_port1_rx_clk_src[] = {
  176. FMS(24000000, P_CMN_PLL_XO_CLK, 1, 0, 0),
  177. FM(25000000, ftbl_nss_cc_port1_rx_clk_src_25),
  178. FMS(78125000, P_UNIPHY0_NSS_RX_CLK, 4, 0, 0),
  179. FM(125000000, ftbl_nss_cc_port1_rx_clk_src_125),
  180. FMS(156250000, P_UNIPHY0_NSS_RX_CLK, 2, 0, 0),
  181. FMS(312500000, P_UNIPHY0_NSS_RX_CLK, 1, 0, 0),
  182. { }
  183. };
  184. static struct clk_rcg2 nss_cc_port1_rx_clk_src = {
  185. .cmd_rcgr = 0x4b4,
  186. .mnd_width = 0,
  187. .hid_width = 5,
  188. .parent_map = nss_cc_parent_map_1,
  189. .freq_multi_tbl = ftbl_nss_cc_port1_rx_clk_src,
  190. .clkr.hw.init = &(const struct clk_init_data){
  191. .name = "nss_cc_port1_rx_clk_src",
  192. .parent_data = nss_cc_parent_data_1,
  193. .num_parents = ARRAY_SIZE(nss_cc_parent_data_1),
  194. .ops = &clk_rcg2_fm_ops,
  195. },
  196. };
  197. static const struct freq_conf ftbl_nss_cc_port1_tx_clk_src_25[] = {
  198. C(P_UNIPHY0_NSS_TX_CLK, 12.5, 0, 0),
  199. C(P_UNIPHY0_NSS_TX_CLK, 5, 0, 0),
  200. };
  201. static const struct freq_conf ftbl_nss_cc_port1_tx_clk_src_125[] = {
  202. C(P_UNIPHY0_NSS_TX_CLK, 2.5, 0, 0),
  203. C(P_UNIPHY0_NSS_TX_CLK, 1, 0, 0),
  204. };
  205. static const struct freq_multi_tbl ftbl_nss_cc_port1_tx_clk_src[] = {
  206. FMS(24000000, P_CMN_PLL_XO_CLK, 1, 0, 0),
  207. FM(25000000, ftbl_nss_cc_port1_tx_clk_src_25),
  208. FMS(78125000, P_UNIPHY0_NSS_TX_CLK, 4, 0, 0),
  209. FM(125000000, ftbl_nss_cc_port1_tx_clk_src_125),
  210. FMS(156250000, P_UNIPHY0_NSS_TX_CLK, 2, 0, 0),
  211. FMS(312500000, P_UNIPHY0_NSS_TX_CLK, 1, 0, 0),
  212. { }
  213. };
  214. static struct clk_rcg2 nss_cc_port1_tx_clk_src = {
  215. .cmd_rcgr = 0x4c0,
  216. .mnd_width = 0,
  217. .hid_width = 5,
  218. .parent_map = nss_cc_parent_map_1,
  219. .freq_multi_tbl = ftbl_nss_cc_port1_tx_clk_src,
  220. .clkr.hw.init = &(const struct clk_init_data){
  221. .name = "nss_cc_port1_tx_clk_src",
  222. .parent_data = nss_cc_parent_data_1,
  223. .num_parents = ARRAY_SIZE(nss_cc_parent_data_1),
  224. .ops = &clk_rcg2_fm_ops,
  225. },
  226. };
  227. static const struct freq_conf ftbl_nss_cc_port2_rx_clk_src_25[] = {
  228. C(P_UNIPHY1_NSS_RX_CLK, 12.5, 0, 0),
  229. C(P_UNIPHY1_NSS_RX_CLK, 5, 0, 0),
  230. };
  231. static const struct freq_conf ftbl_nss_cc_port2_rx_clk_src_125[] = {
  232. C(P_UNIPHY1_NSS_RX_CLK, 2.5, 0, 0),
  233. C(P_UNIPHY1_NSS_RX_CLK, 1, 0, 0),
  234. };
  235. static const struct freq_multi_tbl ftbl_nss_cc_port2_rx_clk_src[] = {
  236. FMS(24000000, P_CMN_PLL_XO_CLK, 1, 0, 0),
  237. FM(25000000, ftbl_nss_cc_port2_rx_clk_src_25),
  238. FMS(78125000, P_UNIPHY1_NSS_RX_CLK, 4, 0, 0),
  239. FM(125000000, ftbl_nss_cc_port2_rx_clk_src_125),
  240. FMS(156250000, P_UNIPHY1_NSS_RX_CLK, 2, 0, 0),
  241. FMS(312500000, P_UNIPHY1_NSS_RX_CLK, 1, 0, 0),
  242. { }
  243. };
  244. static struct clk_rcg2 nss_cc_port2_rx_clk_src = {
  245. .cmd_rcgr = 0x4cc,
  246. .mnd_width = 0,
  247. .hid_width = 5,
  248. .parent_map = nss_cc_parent_map_2,
  249. .freq_multi_tbl = ftbl_nss_cc_port2_rx_clk_src,
  250. .clkr.hw.init = &(const struct clk_init_data){
  251. .name = "nss_cc_port2_rx_clk_src",
  252. .parent_data = nss_cc_parent_data_2,
  253. .num_parents = ARRAY_SIZE(nss_cc_parent_data_2),
  254. .ops = &clk_rcg2_fm_ops,
  255. },
  256. };
  257. static const struct freq_conf ftbl_nss_cc_port2_tx_clk_src_25[] = {
  258. C(P_UNIPHY1_NSS_TX_CLK, 12.5, 0, 0),
  259. C(P_UNIPHY1_NSS_TX_CLK, 5, 0, 0),
  260. };
  261. static const struct freq_conf ftbl_nss_cc_port2_tx_clk_src_125[] = {
  262. C(P_UNIPHY1_NSS_TX_CLK, 2.5, 0, 0),
  263. C(P_UNIPHY1_NSS_TX_CLK, 1, 0, 0),
  264. };
  265. static const struct freq_multi_tbl ftbl_nss_cc_port2_tx_clk_src[] = {
  266. FMS(24000000, P_CMN_PLL_XO_CLK, 1, 0, 0),
  267. FM(25000000, ftbl_nss_cc_port2_tx_clk_src_25),
  268. FMS(78125000, P_UNIPHY1_NSS_TX_CLK, 4, 0, 0),
  269. FM(125000000, ftbl_nss_cc_port2_tx_clk_src_125),
  270. FMS(156250000, P_UNIPHY1_NSS_TX_CLK, 2, 0, 0),
  271. FMS(312500000, P_UNIPHY1_NSS_TX_CLK, 1, 0, 0),
  272. { }
  273. };
  274. static struct clk_rcg2 nss_cc_port2_tx_clk_src = {
  275. .cmd_rcgr = 0x4d8,
  276. .mnd_width = 0,
  277. .hid_width = 5,
  278. .parent_map = nss_cc_parent_map_2,
  279. .freq_multi_tbl = ftbl_nss_cc_port2_tx_clk_src,
  280. .clkr.hw.init = &(const struct clk_init_data){
  281. .name = "nss_cc_port2_tx_clk_src",
  282. .parent_data = nss_cc_parent_data_2,
  283. .num_parents = ARRAY_SIZE(nss_cc_parent_data_2),
  284. .ops = &clk_rcg2_fm_ops,
  285. },
  286. };
  287. static const struct freq_conf ftbl_nss_cc_port3_rx_clk_src_25[] = {
  288. C(P_UNIPHY2_NSS_RX_CLK, 12.5, 0, 0),
  289. C(P_UNIPHY2_NSS_RX_CLK, 5, 0, 0),
  290. };
  291. static const struct freq_conf ftbl_nss_cc_port3_rx_clk_src_125[] = {
  292. C(P_UNIPHY2_NSS_RX_CLK, 2.5, 0, 0),
  293. C(P_UNIPHY2_NSS_RX_CLK, 1, 0, 0),
  294. };
  295. static const struct freq_multi_tbl ftbl_nss_cc_port3_rx_clk_src[] = {
  296. FMS(24000000, P_CMN_PLL_XO_CLK, 1, 0, 0),
  297. FM(25000000, ftbl_nss_cc_port3_rx_clk_src_25),
  298. FMS(78125000, P_UNIPHY2_NSS_RX_CLK, 4, 0, 0),
  299. FM(125000000, ftbl_nss_cc_port3_rx_clk_src_125),
  300. FMS(156250000, P_UNIPHY2_NSS_RX_CLK, 2, 0, 0),
  301. FMS(312500000, P_UNIPHY2_NSS_RX_CLK, 1, 0, 0),
  302. { }
  303. };
  304. static struct clk_rcg2 nss_cc_port3_rx_clk_src = {
  305. .cmd_rcgr = 0x4e4,
  306. .mnd_width = 0,
  307. .hid_width = 5,
  308. .parent_map = nss_cc_parent_map_3,
  309. .freq_multi_tbl = ftbl_nss_cc_port3_rx_clk_src,
  310. .clkr.hw.init = &(const struct clk_init_data){
  311. .name = "nss_cc_port3_rx_clk_src",
  312. .parent_data = nss_cc_parent_data_3,
  313. .num_parents = ARRAY_SIZE(nss_cc_parent_data_3),
  314. .ops = &clk_rcg2_fm_ops,
  315. },
  316. };
  317. static const struct freq_conf ftbl_nss_cc_port3_tx_clk_src_25[] = {
  318. C(P_UNIPHY2_NSS_TX_CLK, 12.5, 0, 0),
  319. C(P_UNIPHY2_NSS_TX_CLK, 5, 0, 0),
  320. };
  321. static const struct freq_conf ftbl_nss_cc_port3_tx_clk_src_125[] = {
  322. C(P_UNIPHY2_NSS_TX_CLK, 2.5, 0, 0),
  323. C(P_UNIPHY2_NSS_TX_CLK, 1, 0, 0),
  324. };
  325. static const struct freq_multi_tbl ftbl_nss_cc_port3_tx_clk_src[] = {
  326. FMS(24000000, P_CMN_PLL_XO_CLK, 1, 0, 0),
  327. FM(25000000, ftbl_nss_cc_port3_tx_clk_src_25),
  328. FMS(78125000, P_UNIPHY2_NSS_TX_CLK, 4, 0, 0),
  329. FM(125000000, ftbl_nss_cc_port3_tx_clk_src_125),
  330. FMS(156250000, P_UNIPHY2_NSS_TX_CLK, 2, 0, 0),
  331. FMS(312500000, P_UNIPHY2_NSS_TX_CLK, 1, 0, 0),
  332. { }
  333. };
  334. static struct clk_rcg2 nss_cc_port3_tx_clk_src = {
  335. .cmd_rcgr = 0x4f0,
  336. .mnd_width = 0,
  337. .hid_width = 5,
  338. .parent_map = nss_cc_parent_map_3,
  339. .freq_multi_tbl = ftbl_nss_cc_port3_tx_clk_src,
  340. .clkr.hw.init = &(const struct clk_init_data){
  341. .name = "nss_cc_port3_tx_clk_src",
  342. .parent_data = nss_cc_parent_data_3,
  343. .num_parents = ARRAY_SIZE(nss_cc_parent_data_3),
  344. .ops = &clk_rcg2_fm_ops,
  345. },
  346. };
  347. static struct clk_rcg2 nss_cc_ppe_clk_src = {
  348. .cmd_rcgr = 0x3ec,
  349. .mnd_width = 0,
  350. .hid_width = 5,
  351. .parent_map = nss_cc_parent_map_0,
  352. .freq_tbl = ftbl_nss_cc_ce_clk_src,
  353. .clkr.hw.init = &(const struct clk_init_data){
  354. .name = "nss_cc_ppe_clk_src",
  355. .parent_data = nss_cc_parent_data_0,
  356. .num_parents = ARRAY_SIZE(nss_cc_parent_data_0),
  357. .flags = CLK_SET_RATE_PARENT,
  358. .ops = &clk_rcg2_ops,
  359. },
  360. };
  361. static struct clk_regmap_div nss_cc_port1_rx_div_clk_src = {
  362. .reg = 0x4bc,
  363. .shift = 0,
  364. .width = 9,
  365. .clkr.hw.init = &(const struct clk_init_data) {
  366. .name = "nss_cc_port1_rx_div_clk_src",
  367. .parent_hws = (const struct clk_hw*[]){
  368. &nss_cc_port1_rx_clk_src.clkr.hw,
  369. },
  370. .num_parents = 1,
  371. .flags = CLK_SET_RATE_PARENT,
  372. .ops = &clk_regmap_div_ops,
  373. },
  374. };
  375. static struct clk_regmap_div nss_cc_port1_tx_div_clk_src = {
  376. .reg = 0x4c8,
  377. .shift = 0,
  378. .width = 9,
  379. .clkr.hw.init = &(const struct clk_init_data) {
  380. .name = "nss_cc_port1_tx_div_clk_src",
  381. .parent_hws = (const struct clk_hw*[]){
  382. &nss_cc_port1_tx_clk_src.clkr.hw,
  383. },
  384. .num_parents = 1,
  385. .flags = CLK_SET_RATE_PARENT,
  386. .ops = &clk_regmap_div_ops,
  387. },
  388. };
  389. static struct clk_regmap_div nss_cc_port2_rx_div_clk_src = {
  390. .reg = 0x4d4,
  391. .shift = 0,
  392. .width = 9,
  393. .clkr.hw.init = &(const struct clk_init_data) {
  394. .name = "nss_cc_port2_rx_div_clk_src",
  395. .parent_hws = (const struct clk_hw*[]){
  396. &nss_cc_port2_rx_clk_src.clkr.hw,
  397. },
  398. .num_parents = 1,
  399. .flags = CLK_SET_RATE_PARENT,
  400. .ops = &clk_regmap_div_ops,
  401. },
  402. };
  403. static struct clk_regmap_div nss_cc_port2_tx_div_clk_src = {
  404. .reg = 0x4e0,
  405. .shift = 0,
  406. .width = 9,
  407. .clkr.hw.init = &(const struct clk_init_data) {
  408. .name = "nss_cc_port2_tx_div_clk_src",
  409. .parent_hws = (const struct clk_hw*[]){
  410. &nss_cc_port2_tx_clk_src.clkr.hw,
  411. },
  412. .num_parents = 1,
  413. .flags = CLK_SET_RATE_PARENT,
  414. .ops = &clk_regmap_div_ops,
  415. },
  416. };
  417. static struct clk_regmap_div nss_cc_port3_rx_div_clk_src = {
  418. .reg = 0x4ec,
  419. .shift = 0,
  420. .width = 9,
  421. .clkr.hw.init = &(const struct clk_init_data) {
  422. .name = "nss_cc_port3_rx_div_clk_src",
  423. .parent_hws = (const struct clk_hw*[]){
  424. &nss_cc_port3_rx_clk_src.clkr.hw,
  425. },
  426. .num_parents = 1,
  427. .flags = CLK_SET_RATE_PARENT,
  428. .ops = &clk_regmap_div_ops,
  429. },
  430. };
  431. static struct clk_regmap_div nss_cc_port3_tx_div_clk_src = {
  432. .reg = 0x4f8,
  433. .shift = 0,
  434. .width = 9,
  435. .clkr.hw.init = &(const struct clk_init_data) {
  436. .name = "nss_cc_port3_tx_div_clk_src",
  437. .parent_hws = (const struct clk_hw*[]){
  438. &nss_cc_port3_tx_clk_src.clkr.hw,
  439. },
  440. .num_parents = 1,
  441. .flags = CLK_SET_RATE_PARENT,
  442. .ops = &clk_regmap_div_ops,
  443. },
  444. };
  445. static struct clk_regmap_div nss_cc_xgmac0_ptp_ref_div_clk_src = {
  446. .reg = 0x3f4,
  447. .shift = 0,
  448. .width = 4,
  449. .clkr.hw.init = &(const struct clk_init_data) {
  450. .name = "nss_cc_xgmac0_ptp_ref_div_clk_src",
  451. .parent_hws = (const struct clk_hw*[]){
  452. &nss_cc_ppe_clk_src.clkr.hw,
  453. },
  454. .num_parents = 1,
  455. .flags = CLK_SET_RATE_PARENT,
  456. .ops = &clk_regmap_div_ro_ops,
  457. },
  458. };
  459. static struct clk_regmap_div nss_cc_xgmac1_ptp_ref_div_clk_src = {
  460. .reg = 0x3f8,
  461. .shift = 0,
  462. .width = 4,
  463. .clkr.hw.init = &(const struct clk_init_data) {
  464. .name = "nss_cc_xgmac1_ptp_ref_div_clk_src",
  465. .parent_hws = (const struct clk_hw*[]){
  466. &nss_cc_ppe_clk_src.clkr.hw,
  467. },
  468. .num_parents = 1,
  469. .flags = CLK_SET_RATE_PARENT,
  470. .ops = &clk_regmap_div_ro_ops,
  471. },
  472. };
  473. static struct clk_regmap_div nss_cc_xgmac2_ptp_ref_div_clk_src = {
  474. .reg = 0x3fc,
  475. .shift = 0,
  476. .width = 4,
  477. .clkr.hw.init = &(const struct clk_init_data) {
  478. .name = "nss_cc_xgmac2_ptp_ref_div_clk_src",
  479. .parent_hws = (const struct clk_hw*[]){
  480. &nss_cc_ppe_clk_src.clkr.hw,
  481. },
  482. .num_parents = 1,
  483. .flags = CLK_SET_RATE_PARENT,
  484. .ops = &clk_regmap_div_ro_ops,
  485. },
  486. };
  487. static struct clk_branch nss_cc_ce_apb_clk = {
  488. .halt_reg = 0x5e8,
  489. .halt_check = BRANCH_HALT,
  490. .clkr = {
  491. .enable_reg = 0x5e8,
  492. .enable_mask = BIT(0),
  493. .hw.init = &(const struct clk_init_data){
  494. .name = "nss_cc_ce_apb_clk",
  495. .parent_hws = (const struct clk_hw*[]){
  496. &nss_cc_ce_clk_src.clkr.hw,
  497. },
  498. .num_parents = 1,
  499. .flags = CLK_SET_RATE_PARENT,
  500. .ops = &clk_branch2_ops,
  501. },
  502. },
  503. };
  504. static struct clk_branch nss_cc_ce_axi_clk = {
  505. .halt_reg = 0x5ec,
  506. .halt_check = BRANCH_HALT,
  507. .clkr = {
  508. .enable_reg = 0x5ec,
  509. .enable_mask = BIT(0),
  510. .hw.init = &(const struct clk_init_data){
  511. .name = "nss_cc_ce_axi_clk",
  512. .parent_hws = (const struct clk_hw*[]){
  513. &nss_cc_ce_clk_src.clkr.hw,
  514. },
  515. .num_parents = 1,
  516. .flags = CLK_SET_RATE_PARENT,
  517. .ops = &clk_branch2_ops,
  518. },
  519. },
  520. };
  521. static struct clk_branch nss_cc_debug_clk = {
  522. .halt_reg = 0x70c,
  523. .halt_check = BRANCH_HALT,
  524. .clkr = {
  525. .enable_reg = 0x70c,
  526. .enable_mask = BIT(0),
  527. .hw.init = &(const struct clk_init_data){
  528. .name = "nss_cc_debug_clk",
  529. .ops = &clk_branch2_ops,
  530. },
  531. },
  532. };
  533. static struct clk_branch nss_cc_eip_clk = {
  534. .halt_reg = 0x658,
  535. .halt_check = BRANCH_HALT,
  536. .clkr = {
  537. .enable_reg = 0x658,
  538. .enable_mask = BIT(0),
  539. .hw.init = &(const struct clk_init_data){
  540. .name = "nss_cc_eip_clk",
  541. .parent_hws = (const struct clk_hw*[]){
  542. &nss_cc_eip_bfdcd_clk_src.clkr.hw,
  543. },
  544. .num_parents = 1,
  545. .flags = CLK_SET_RATE_PARENT,
  546. .ops = &clk_branch2_ops,
  547. },
  548. },
  549. };
  550. static struct clk_branch nss_cc_nss_csr_clk = {
  551. .halt_reg = 0x6b0,
  552. .halt_check = BRANCH_HALT,
  553. .clkr = {
  554. .enable_reg = 0x6b0,
  555. .enable_mask = BIT(0),
  556. .hw.init = &(const struct clk_init_data){
  557. .name = "nss_cc_nss_csr_clk",
  558. .parent_hws = (const struct clk_hw*[]){
  559. &nss_cc_cfg_clk_src.clkr.hw,
  560. },
  561. .num_parents = 1,
  562. .flags = CLK_SET_RATE_PARENT,
  563. .ops = &clk_branch2_ops,
  564. },
  565. },
  566. };
  567. static struct clk_branch nss_cc_nssnoc_ce_apb_clk = {
  568. .halt_reg = 0x5f4,
  569. .halt_check = BRANCH_HALT,
  570. .clkr = {
  571. .enable_reg = 0x5f4,
  572. .enable_mask = BIT(0),
  573. .hw.init = &(const struct clk_init_data){
  574. .name = "nss_cc_nssnoc_ce_apb_clk",
  575. .parent_hws = (const struct clk_hw*[]){
  576. &nss_cc_ce_clk_src.clkr.hw,
  577. },
  578. .num_parents = 1,
  579. .flags = CLK_SET_RATE_PARENT,
  580. .ops = &clk_branch2_ops,
  581. },
  582. },
  583. };
  584. static struct clk_branch nss_cc_nssnoc_ce_axi_clk = {
  585. .halt_reg = 0x5f8,
  586. .halt_check = BRANCH_HALT,
  587. .clkr = {
  588. .enable_reg = 0x5f8,
  589. .enable_mask = BIT(0),
  590. .hw.init = &(const struct clk_init_data){
  591. .name = "nss_cc_nssnoc_ce_axi_clk",
  592. .parent_hws = (const struct clk_hw*[]){
  593. &nss_cc_ce_clk_src.clkr.hw,
  594. },
  595. .num_parents = 1,
  596. .flags = CLK_SET_RATE_PARENT,
  597. .ops = &clk_branch2_ops,
  598. },
  599. },
  600. };
  601. static struct clk_branch nss_cc_nssnoc_eip_clk = {
  602. .halt_reg = 0x660,
  603. .halt_check = BRANCH_HALT,
  604. .clkr = {
  605. .enable_reg = 0x660,
  606. .enable_mask = BIT(0),
  607. .hw.init = &(const struct clk_init_data){
  608. .name = "nss_cc_nssnoc_eip_clk",
  609. .parent_hws = (const struct clk_hw*[]){
  610. &nss_cc_eip_bfdcd_clk_src.clkr.hw,
  611. },
  612. .num_parents = 1,
  613. .flags = CLK_SET_RATE_PARENT,
  614. .ops = &clk_branch2_ops,
  615. },
  616. },
  617. };
  618. static struct clk_branch nss_cc_nssnoc_nss_csr_clk = {
  619. .halt_reg = 0x6b4,
  620. .halt_check = BRANCH_HALT,
  621. .clkr = {
  622. .enable_reg = 0x6b4,
  623. .enable_mask = BIT(0),
  624. .hw.init = &(const struct clk_init_data){
  625. .name = "nss_cc_nssnoc_nss_csr_clk",
  626. .parent_hws = (const struct clk_hw*[]){
  627. &nss_cc_cfg_clk_src.clkr.hw,
  628. },
  629. .num_parents = 1,
  630. .flags = CLK_SET_RATE_PARENT,
  631. .ops = &clk_branch2_ops,
  632. },
  633. },
  634. };
  635. static struct clk_branch nss_cc_nssnoc_ppe_cfg_clk = {
  636. .halt_reg = 0x444,
  637. .halt_check = BRANCH_HALT,
  638. .clkr = {
  639. .enable_reg = 0x444,
  640. .enable_mask = BIT(0),
  641. .hw.init = &(const struct clk_init_data){
  642. .name = "nss_cc_nssnoc_ppe_cfg_clk",
  643. .parent_hws = (const struct clk_hw*[]){
  644. &nss_cc_ppe_clk_src.clkr.hw,
  645. },
  646. .num_parents = 1,
  647. .flags = CLK_SET_RATE_PARENT,
  648. .ops = &clk_branch2_ops,
  649. },
  650. },
  651. };
  652. static struct clk_branch nss_cc_nssnoc_ppe_clk = {
  653. .halt_reg = 0x440,
  654. .halt_check = BRANCH_HALT,
  655. .clkr = {
  656. .enable_reg = 0x440,
  657. .enable_mask = BIT(0),
  658. .hw.init = &(const struct clk_init_data){
  659. .name = "nss_cc_nssnoc_ppe_clk",
  660. .parent_hws = (const struct clk_hw*[]){
  661. &nss_cc_ppe_clk_src.clkr.hw,
  662. },
  663. .num_parents = 1,
  664. .flags = CLK_SET_RATE_PARENT,
  665. .ops = &clk_branch2_ops,
  666. },
  667. },
  668. };
  669. static struct clk_branch nss_cc_port1_mac_clk = {
  670. .halt_reg = 0x428,
  671. .halt_check = BRANCH_HALT,
  672. .clkr = {
  673. .enable_reg = 0x428,
  674. .enable_mask = BIT(0),
  675. .hw.init = &(const struct clk_init_data){
  676. .name = "nss_cc_port1_mac_clk",
  677. .parent_hws = (const struct clk_hw*[]){
  678. &nss_cc_ppe_clk_src.clkr.hw,
  679. },
  680. .num_parents = 1,
  681. .flags = CLK_SET_RATE_PARENT,
  682. .ops = &clk_branch2_ops,
  683. },
  684. },
  685. };
  686. static struct clk_branch nss_cc_port1_rx_clk = {
  687. .halt_reg = 0x4fc,
  688. .halt_check = BRANCH_HALT,
  689. .clkr = {
  690. .enable_reg = 0x4fc,
  691. .enable_mask = BIT(0),
  692. .hw.init = &(const struct clk_init_data){
  693. .name = "nss_cc_port1_rx_clk",
  694. .parent_hws = (const struct clk_hw*[]){
  695. &nss_cc_port1_rx_div_clk_src.clkr.hw,
  696. },
  697. .num_parents = 1,
  698. .flags = CLK_SET_RATE_PARENT,
  699. .ops = &clk_branch2_ops,
  700. },
  701. },
  702. };
  703. static struct clk_branch nss_cc_port1_tx_clk = {
  704. .halt_reg = 0x504,
  705. .halt_check = BRANCH_HALT,
  706. .clkr = {
  707. .enable_reg = 0x504,
  708. .enable_mask = BIT(0),
  709. .hw.init = &(const struct clk_init_data){
  710. .name = "nss_cc_port1_tx_clk",
  711. .parent_hws = (const struct clk_hw*[]){
  712. &nss_cc_port1_tx_div_clk_src.clkr.hw,
  713. },
  714. .num_parents = 1,
  715. .flags = CLK_SET_RATE_PARENT,
  716. .ops = &clk_branch2_ops,
  717. },
  718. },
  719. };
  720. static struct clk_branch nss_cc_port2_mac_clk = {
  721. .halt_reg = 0x430,
  722. .halt_check = BRANCH_HALT,
  723. .clkr = {
  724. .enable_reg = 0x430,
  725. .enable_mask = BIT(0),
  726. .hw.init = &(const struct clk_init_data){
  727. .name = "nss_cc_port2_mac_clk",
  728. .parent_hws = (const struct clk_hw*[]){
  729. &nss_cc_ppe_clk_src.clkr.hw,
  730. },
  731. .num_parents = 1,
  732. .flags = CLK_SET_RATE_PARENT,
  733. .ops = &clk_branch2_ops,
  734. },
  735. },
  736. };
  737. static struct clk_branch nss_cc_port2_rx_clk = {
  738. .halt_reg = 0x50c,
  739. .halt_check = BRANCH_HALT,
  740. .clkr = {
  741. .enable_reg = 0x50c,
  742. .enable_mask = BIT(0),
  743. .hw.init = &(const struct clk_init_data){
  744. .name = "nss_cc_port2_rx_clk",
  745. .parent_hws = (const struct clk_hw*[]){
  746. &nss_cc_port2_rx_div_clk_src.clkr.hw,
  747. },
  748. .num_parents = 1,
  749. .flags = CLK_SET_RATE_PARENT,
  750. .ops = &clk_branch2_ops,
  751. },
  752. },
  753. };
  754. static struct clk_branch nss_cc_port2_tx_clk = {
  755. .halt_reg = 0x514,
  756. .halt_check = BRANCH_HALT,
  757. .clkr = {
  758. .enable_reg = 0x514,
  759. .enable_mask = BIT(0),
  760. .hw.init = &(const struct clk_init_data){
  761. .name = "nss_cc_port2_tx_clk",
  762. .parent_hws = (const struct clk_hw*[]){
  763. &nss_cc_port2_tx_div_clk_src.clkr.hw,
  764. },
  765. .num_parents = 1,
  766. .flags = CLK_SET_RATE_PARENT,
  767. .ops = &clk_branch2_ops,
  768. },
  769. },
  770. };
  771. static struct clk_branch nss_cc_port3_mac_clk = {
  772. .halt_reg = 0x438,
  773. .halt_check = BRANCH_HALT,
  774. .clkr = {
  775. .enable_reg = 0x438,
  776. .enable_mask = BIT(0),
  777. .hw.init = &(const struct clk_init_data){
  778. .name = "nss_cc_port3_mac_clk",
  779. .parent_hws = (const struct clk_hw*[]){
  780. &nss_cc_ppe_clk_src.clkr.hw,
  781. },
  782. .num_parents = 1,
  783. .flags = CLK_SET_RATE_PARENT,
  784. .ops = &clk_branch2_ops,
  785. },
  786. },
  787. };
  788. static struct clk_branch nss_cc_port3_rx_clk = {
  789. .halt_reg = 0x51c,
  790. .halt_check = BRANCH_HALT,
  791. .clkr = {
  792. .enable_reg = 0x51c,
  793. .enable_mask = BIT(0),
  794. .hw.init = &(const struct clk_init_data){
  795. .name = "nss_cc_port3_rx_clk",
  796. .parent_hws = (const struct clk_hw*[]){
  797. &nss_cc_port3_rx_div_clk_src.clkr.hw,
  798. },
  799. .num_parents = 1,
  800. .flags = CLK_SET_RATE_PARENT,
  801. .ops = &clk_branch2_ops,
  802. },
  803. },
  804. };
  805. static struct clk_branch nss_cc_port3_tx_clk = {
  806. .halt_reg = 0x524,
  807. .halt_check = BRANCH_HALT,
  808. .clkr = {
  809. .enable_reg = 0x524,
  810. .enable_mask = BIT(0),
  811. .hw.init = &(const struct clk_init_data){
  812. .name = "nss_cc_port3_tx_clk",
  813. .parent_hws = (const struct clk_hw*[]){
  814. &nss_cc_port3_tx_div_clk_src.clkr.hw,
  815. },
  816. .num_parents = 1,
  817. .flags = CLK_SET_RATE_PARENT,
  818. .ops = &clk_branch2_ops,
  819. },
  820. },
  821. };
  822. static struct clk_branch nss_cc_ppe_edma_cfg_clk = {
  823. .halt_reg = 0x424,
  824. .halt_check = BRANCH_HALT,
  825. .clkr = {
  826. .enable_reg = 0x424,
  827. .enable_mask = BIT(0),
  828. .hw.init = &(const struct clk_init_data){
  829. .name = "nss_cc_ppe_edma_cfg_clk",
  830. .parent_hws = (const struct clk_hw*[]){
  831. &nss_cc_ppe_clk_src.clkr.hw,
  832. },
  833. .num_parents = 1,
  834. .flags = CLK_SET_RATE_PARENT,
  835. .ops = &clk_branch2_ops,
  836. },
  837. },
  838. };
  839. static struct clk_branch nss_cc_ppe_edma_clk = {
  840. .halt_reg = 0x41c,
  841. .halt_check = BRANCH_HALT,
  842. .clkr = {
  843. .enable_reg = 0x41c,
  844. .enable_mask = BIT(0),
  845. .hw.init = &(const struct clk_init_data){
  846. .name = "nss_cc_ppe_edma_clk",
  847. .parent_hws = (const struct clk_hw*[]){
  848. &nss_cc_ppe_clk_src.clkr.hw,
  849. },
  850. .num_parents = 1,
  851. .flags = CLK_SET_RATE_PARENT,
  852. .ops = &clk_branch2_ops,
  853. },
  854. },
  855. };
  856. static struct clk_branch nss_cc_ppe_switch_btq_clk = {
  857. .halt_reg = 0x408,
  858. .halt_check = BRANCH_HALT,
  859. .clkr = {
  860. .enable_reg = 0x408,
  861. .enable_mask = BIT(0),
  862. .hw.init = &(const struct clk_init_data){
  863. .name = "nss_cc_ppe_switch_btq_clk",
  864. .parent_hws = (const struct clk_hw*[]){
  865. &nss_cc_ppe_clk_src.clkr.hw,
  866. },
  867. .num_parents = 1,
  868. .flags = CLK_SET_RATE_PARENT,
  869. .ops = &clk_branch2_ops,
  870. },
  871. },
  872. };
  873. static struct clk_branch nss_cc_ppe_switch_cfg_clk = {
  874. .halt_reg = 0x418,
  875. .halt_check = BRANCH_HALT,
  876. .clkr = {
  877. .enable_reg = 0x418,
  878. .enable_mask = BIT(0),
  879. .hw.init = &(const struct clk_init_data){
  880. .name = "nss_cc_ppe_switch_cfg_clk",
  881. .parent_hws = (const struct clk_hw*[]){
  882. &nss_cc_ppe_clk_src.clkr.hw,
  883. },
  884. .num_parents = 1,
  885. .flags = CLK_SET_RATE_PARENT,
  886. .ops = &clk_branch2_ops,
  887. },
  888. },
  889. };
  890. static struct clk_branch nss_cc_ppe_switch_clk = {
  891. .halt_reg = 0x410,
  892. .halt_check = BRANCH_HALT,
  893. .clkr = {
  894. .enable_reg = 0x410,
  895. .enable_mask = BIT(0),
  896. .hw.init = &(const struct clk_init_data){
  897. .name = "nss_cc_ppe_switch_clk",
  898. .parent_hws = (const struct clk_hw*[]){
  899. &nss_cc_ppe_clk_src.clkr.hw,
  900. },
  901. .num_parents = 1,
  902. .flags = CLK_SET_RATE_PARENT,
  903. .ops = &clk_branch2_ops,
  904. },
  905. },
  906. };
  907. static struct clk_branch nss_cc_ppe_switch_ipe_clk = {
  908. .halt_reg = 0x400,
  909. .halt_check = BRANCH_HALT,
  910. .clkr = {
  911. .enable_reg = 0x400,
  912. .enable_mask = BIT(0),
  913. .hw.init = &(const struct clk_init_data){
  914. .name = "nss_cc_ppe_switch_ipe_clk",
  915. .parent_hws = (const struct clk_hw*[]){
  916. &nss_cc_ppe_clk_src.clkr.hw,
  917. },
  918. .num_parents = 1,
  919. .flags = CLK_SET_RATE_PARENT,
  920. .ops = &clk_branch2_ops,
  921. },
  922. },
  923. };
  924. static struct clk_branch nss_cc_uniphy_port1_rx_clk = {
  925. .halt_reg = 0x57c,
  926. .halt_check = BRANCH_HALT,
  927. .clkr = {
  928. .enable_reg = 0x57c,
  929. .enable_mask = BIT(0),
  930. .hw.init = &(const struct clk_init_data){
  931. .name = "nss_cc_uniphy_port1_rx_clk",
  932. .parent_hws = (const struct clk_hw*[]){
  933. &nss_cc_port1_rx_div_clk_src.clkr.hw,
  934. },
  935. .num_parents = 1,
  936. .flags = CLK_SET_RATE_PARENT,
  937. .ops = &clk_branch2_ops,
  938. },
  939. },
  940. };
  941. static struct clk_branch nss_cc_uniphy_port1_tx_clk = {
  942. .halt_reg = 0x580,
  943. .halt_check = BRANCH_HALT,
  944. .clkr = {
  945. .enable_reg = 0x580,
  946. .enable_mask = BIT(0),
  947. .hw.init = &(const struct clk_init_data){
  948. .name = "nss_cc_uniphy_port1_tx_clk",
  949. .parent_hws = (const struct clk_hw*[]){
  950. &nss_cc_port1_tx_div_clk_src.clkr.hw,
  951. },
  952. .num_parents = 1,
  953. .flags = CLK_SET_RATE_PARENT,
  954. .ops = &clk_branch2_ops,
  955. },
  956. },
  957. };
  958. static struct clk_branch nss_cc_uniphy_port2_rx_clk = {
  959. .halt_reg = 0x584,
  960. .halt_check = BRANCH_HALT,
  961. .clkr = {
  962. .enable_reg = 0x584,
  963. .enable_mask = BIT(0),
  964. .hw.init = &(const struct clk_init_data){
  965. .name = "nss_cc_uniphy_port2_rx_clk",
  966. .parent_hws = (const struct clk_hw*[]){
  967. &nss_cc_port2_rx_div_clk_src.clkr.hw,
  968. },
  969. .num_parents = 1,
  970. .flags = CLK_SET_RATE_PARENT,
  971. .ops = &clk_branch2_ops,
  972. },
  973. },
  974. };
  975. static struct clk_branch nss_cc_uniphy_port2_tx_clk = {
  976. .halt_reg = 0x588,
  977. .halt_check = BRANCH_HALT,
  978. .clkr = {
  979. .enable_reg = 0x588,
  980. .enable_mask = BIT(0),
  981. .hw.init = &(const struct clk_init_data){
  982. .name = "nss_cc_uniphy_port2_tx_clk",
  983. .parent_hws = (const struct clk_hw*[]){
  984. &nss_cc_port2_tx_div_clk_src.clkr.hw,
  985. },
  986. .num_parents = 1,
  987. .flags = CLK_SET_RATE_PARENT,
  988. .ops = &clk_branch2_ops,
  989. },
  990. },
  991. };
  992. static struct clk_branch nss_cc_uniphy_port3_rx_clk = {
  993. .halt_reg = 0x58c,
  994. .halt_check = BRANCH_HALT,
  995. .clkr = {
  996. .enable_reg = 0x58c,
  997. .enable_mask = BIT(0),
  998. .hw.init = &(const struct clk_init_data){
  999. .name = "nss_cc_uniphy_port3_rx_clk",
  1000. .parent_hws = (const struct clk_hw*[]){
  1001. &nss_cc_port3_rx_div_clk_src.clkr.hw,
  1002. },
  1003. .num_parents = 1,
  1004. .flags = CLK_SET_RATE_PARENT,
  1005. .ops = &clk_branch2_ops,
  1006. },
  1007. },
  1008. };
  1009. static struct clk_branch nss_cc_uniphy_port3_tx_clk = {
  1010. .halt_reg = 0x590,
  1011. .halt_check = BRANCH_HALT,
  1012. .clkr = {
  1013. .enable_reg = 0x590,
  1014. .enable_mask = BIT(0),
  1015. .hw.init = &(const struct clk_init_data){
  1016. .name = "nss_cc_uniphy_port3_tx_clk",
  1017. .parent_hws = (const struct clk_hw*[]){
  1018. &nss_cc_port3_tx_div_clk_src.clkr.hw,
  1019. },
  1020. .num_parents = 1,
  1021. .flags = CLK_SET_RATE_PARENT,
  1022. .ops = &clk_branch2_ops,
  1023. },
  1024. },
  1025. };
  1026. static struct clk_branch nss_cc_xgmac0_ptp_ref_clk = {
  1027. .halt_reg = 0x448,
  1028. .halt_check = BRANCH_HALT,
  1029. .clkr = {
  1030. .enable_reg = 0x448,
  1031. .enable_mask = BIT(0),
  1032. .hw.init = &(const struct clk_init_data){
  1033. .name = "nss_cc_xgmac0_ptp_ref_clk",
  1034. .parent_hws = (const struct clk_hw*[]){
  1035. &nss_cc_xgmac0_ptp_ref_div_clk_src.clkr.hw,
  1036. },
  1037. .num_parents = 1,
  1038. .flags = CLK_SET_RATE_PARENT,
  1039. .ops = &clk_branch2_ops,
  1040. },
  1041. },
  1042. };
  1043. static struct clk_branch nss_cc_xgmac1_ptp_ref_clk = {
  1044. .halt_reg = 0x44c,
  1045. .halt_check = BRANCH_HALT,
  1046. .clkr = {
  1047. .enable_reg = 0x44c,
  1048. .enable_mask = BIT(0),
  1049. .hw.init = &(const struct clk_init_data){
  1050. .name = "nss_cc_xgmac1_ptp_ref_clk",
  1051. .parent_hws = (const struct clk_hw*[]){
  1052. &nss_cc_xgmac1_ptp_ref_div_clk_src.clkr.hw,
  1053. },
  1054. .num_parents = 1,
  1055. .flags = CLK_SET_RATE_PARENT,
  1056. .ops = &clk_branch2_ops,
  1057. },
  1058. },
  1059. };
  1060. static struct clk_branch nss_cc_xgmac2_ptp_ref_clk = {
  1061. .halt_reg = 0x450,
  1062. .halt_check = BRANCH_HALT,
  1063. .clkr = {
  1064. .enable_reg = 0x450,
  1065. .enable_mask = BIT(0),
  1066. .hw.init = &(const struct clk_init_data){
  1067. .name = "nss_cc_xgmac2_ptp_ref_clk",
  1068. .parent_hws = (const struct clk_hw*[]){
  1069. &nss_cc_xgmac2_ptp_ref_div_clk_src.clkr.hw,
  1070. },
  1071. .num_parents = 1,
  1072. .flags = CLK_SET_RATE_PARENT,
  1073. .ops = &clk_branch2_ops,
  1074. },
  1075. },
  1076. };
  1077. static struct clk_regmap *nss_cc_ipq5424_clocks[] = {
  1078. [NSS_CC_CE_APB_CLK] = &nss_cc_ce_apb_clk.clkr,
  1079. [NSS_CC_CE_AXI_CLK] = &nss_cc_ce_axi_clk.clkr,
  1080. [NSS_CC_CE_CLK_SRC] = &nss_cc_ce_clk_src.clkr,
  1081. [NSS_CC_CFG_CLK_SRC] = &nss_cc_cfg_clk_src.clkr,
  1082. [NSS_CC_DEBUG_CLK] = &nss_cc_debug_clk.clkr,
  1083. [NSS_CC_EIP_BFDCD_CLK_SRC] = &nss_cc_eip_bfdcd_clk_src.clkr,
  1084. [NSS_CC_EIP_CLK] = &nss_cc_eip_clk.clkr,
  1085. [NSS_CC_NSS_CSR_CLK] = &nss_cc_nss_csr_clk.clkr,
  1086. [NSS_CC_NSSNOC_CE_APB_CLK] = &nss_cc_nssnoc_ce_apb_clk.clkr,
  1087. [NSS_CC_NSSNOC_CE_AXI_CLK] = &nss_cc_nssnoc_ce_axi_clk.clkr,
  1088. [NSS_CC_NSSNOC_EIP_CLK] = &nss_cc_nssnoc_eip_clk.clkr,
  1089. [NSS_CC_NSSNOC_NSS_CSR_CLK] = &nss_cc_nssnoc_nss_csr_clk.clkr,
  1090. [NSS_CC_NSSNOC_PPE_CFG_CLK] = &nss_cc_nssnoc_ppe_cfg_clk.clkr,
  1091. [NSS_CC_NSSNOC_PPE_CLK] = &nss_cc_nssnoc_ppe_clk.clkr,
  1092. [NSS_CC_PORT1_MAC_CLK] = &nss_cc_port1_mac_clk.clkr,
  1093. [NSS_CC_PORT1_RX_CLK] = &nss_cc_port1_rx_clk.clkr,
  1094. [NSS_CC_PORT1_RX_CLK_SRC] = &nss_cc_port1_rx_clk_src.clkr,
  1095. [NSS_CC_PORT1_RX_DIV_CLK_SRC] = &nss_cc_port1_rx_div_clk_src.clkr,
  1096. [NSS_CC_PORT1_TX_CLK] = &nss_cc_port1_tx_clk.clkr,
  1097. [NSS_CC_PORT1_TX_CLK_SRC] = &nss_cc_port1_tx_clk_src.clkr,
  1098. [NSS_CC_PORT1_TX_DIV_CLK_SRC] = &nss_cc_port1_tx_div_clk_src.clkr,
  1099. [NSS_CC_PORT2_MAC_CLK] = &nss_cc_port2_mac_clk.clkr,
  1100. [NSS_CC_PORT2_RX_CLK] = &nss_cc_port2_rx_clk.clkr,
  1101. [NSS_CC_PORT2_RX_CLK_SRC] = &nss_cc_port2_rx_clk_src.clkr,
  1102. [NSS_CC_PORT2_RX_DIV_CLK_SRC] = &nss_cc_port2_rx_div_clk_src.clkr,
  1103. [NSS_CC_PORT2_TX_CLK] = &nss_cc_port2_tx_clk.clkr,
  1104. [NSS_CC_PORT2_TX_CLK_SRC] = &nss_cc_port2_tx_clk_src.clkr,
  1105. [NSS_CC_PORT2_TX_DIV_CLK_SRC] = &nss_cc_port2_tx_div_clk_src.clkr,
  1106. [NSS_CC_PORT3_MAC_CLK] = &nss_cc_port3_mac_clk.clkr,
  1107. [NSS_CC_PORT3_RX_CLK] = &nss_cc_port3_rx_clk.clkr,
  1108. [NSS_CC_PORT3_RX_CLK_SRC] = &nss_cc_port3_rx_clk_src.clkr,
  1109. [NSS_CC_PORT3_RX_DIV_CLK_SRC] = &nss_cc_port3_rx_div_clk_src.clkr,
  1110. [NSS_CC_PORT3_TX_CLK] = &nss_cc_port3_tx_clk.clkr,
  1111. [NSS_CC_PORT3_TX_CLK_SRC] = &nss_cc_port3_tx_clk_src.clkr,
  1112. [NSS_CC_PORT3_TX_DIV_CLK_SRC] = &nss_cc_port3_tx_div_clk_src.clkr,
  1113. [NSS_CC_PPE_CLK_SRC] = &nss_cc_ppe_clk_src.clkr,
  1114. [NSS_CC_PPE_EDMA_CFG_CLK] = &nss_cc_ppe_edma_cfg_clk.clkr,
  1115. [NSS_CC_PPE_EDMA_CLK] = &nss_cc_ppe_edma_clk.clkr,
  1116. [NSS_CC_PPE_SWITCH_BTQ_CLK] = &nss_cc_ppe_switch_btq_clk.clkr,
  1117. [NSS_CC_PPE_SWITCH_CFG_CLK] = &nss_cc_ppe_switch_cfg_clk.clkr,
  1118. [NSS_CC_PPE_SWITCH_CLK] = &nss_cc_ppe_switch_clk.clkr,
  1119. [NSS_CC_PPE_SWITCH_IPE_CLK] = &nss_cc_ppe_switch_ipe_clk.clkr,
  1120. [NSS_CC_UNIPHY_PORT1_RX_CLK] = &nss_cc_uniphy_port1_rx_clk.clkr,
  1121. [NSS_CC_UNIPHY_PORT1_TX_CLK] = &nss_cc_uniphy_port1_tx_clk.clkr,
  1122. [NSS_CC_UNIPHY_PORT2_RX_CLK] = &nss_cc_uniphy_port2_rx_clk.clkr,
  1123. [NSS_CC_UNIPHY_PORT2_TX_CLK] = &nss_cc_uniphy_port2_tx_clk.clkr,
  1124. [NSS_CC_UNIPHY_PORT3_RX_CLK] = &nss_cc_uniphy_port3_rx_clk.clkr,
  1125. [NSS_CC_UNIPHY_PORT3_TX_CLK] = &nss_cc_uniphy_port3_tx_clk.clkr,
  1126. [NSS_CC_XGMAC0_PTP_REF_CLK] = &nss_cc_xgmac0_ptp_ref_clk.clkr,
  1127. [NSS_CC_XGMAC0_PTP_REF_DIV_CLK_SRC] = &nss_cc_xgmac0_ptp_ref_div_clk_src.clkr,
  1128. [NSS_CC_XGMAC1_PTP_REF_CLK] = &nss_cc_xgmac1_ptp_ref_clk.clkr,
  1129. [NSS_CC_XGMAC1_PTP_REF_DIV_CLK_SRC] = &nss_cc_xgmac1_ptp_ref_div_clk_src.clkr,
  1130. [NSS_CC_XGMAC2_PTP_REF_CLK] = &nss_cc_xgmac2_ptp_ref_clk.clkr,
  1131. [NSS_CC_XGMAC2_PTP_REF_DIV_CLK_SRC] = &nss_cc_xgmac2_ptp_ref_div_clk_src.clkr,
  1132. };
  1133. static const struct qcom_reset_map nss_cc_ipq5424_resets[] = {
  1134. [NSS_CC_CE_APB_CLK_ARES] = { 0x5e8, 2 },
  1135. [NSS_CC_CE_AXI_CLK_ARES] = { 0x5ec, 2 },
  1136. [NSS_CC_DEBUG_CLK_ARES] = { 0x70c, 2 },
  1137. [NSS_CC_EIP_CLK_ARES] = { 0x658, 2 },
  1138. [NSS_CC_NSS_CSR_CLK_ARES] = { 0x6b0, 2 },
  1139. [NSS_CC_NSSNOC_CE_APB_CLK_ARES] = { 0x5f4, 2 },
  1140. [NSS_CC_NSSNOC_CE_AXI_CLK_ARES] = { 0x5f8, 2 },
  1141. [NSS_CC_NSSNOC_EIP_CLK_ARES] = { 0x660, 2 },
  1142. [NSS_CC_NSSNOC_NSS_CSR_CLK_ARES] = { 0x6b4, 2 },
  1143. [NSS_CC_NSSNOC_PPE_CLK_ARES] = { 0x440, 2 },
  1144. [NSS_CC_NSSNOC_PPE_CFG_CLK_ARES] = { 0x444, 2 },
  1145. [NSS_CC_PORT1_MAC_CLK_ARES] = { 0x428, 2 },
  1146. [NSS_CC_PORT1_RX_CLK_ARES] = { 0x4fc, 2 },
  1147. [NSS_CC_PORT1_TX_CLK_ARES] = { 0x504, 2 },
  1148. [NSS_CC_PORT2_MAC_CLK_ARES] = { 0x430, 2 },
  1149. [NSS_CC_PORT2_RX_CLK_ARES] = { 0x50c, 2 },
  1150. [NSS_CC_PORT2_TX_CLK_ARES] = { 0x514, 2 },
  1151. [NSS_CC_PORT3_MAC_CLK_ARES] = { 0x438, 2 },
  1152. [NSS_CC_PORT3_RX_CLK_ARES] = { 0x51c, 2 },
  1153. [NSS_CC_PORT3_TX_CLK_ARES] = { 0x524, 2 },
  1154. [NSS_CC_PPE_BCR] = { 0x3e8 },
  1155. [NSS_CC_PPE_EDMA_CLK_ARES] = { 0x41c, 2 },
  1156. [NSS_CC_PPE_EDMA_CFG_CLK_ARES] = { 0x424, 2 },
  1157. [NSS_CC_PPE_SWITCH_BTQ_CLK_ARES] = { 0x408, 2 },
  1158. [NSS_CC_PPE_SWITCH_CLK_ARES] = { 0x410, 2 },
  1159. [NSS_CC_PPE_SWITCH_CFG_CLK_ARES] = { 0x418, 2 },
  1160. [NSS_CC_PPE_SWITCH_IPE_CLK_ARES] = { 0x400, 2 },
  1161. [NSS_CC_UNIPHY_PORT1_RX_CLK_ARES] = { 0x57c, 2 },
  1162. [NSS_CC_UNIPHY_PORT1_TX_CLK_ARES] = { 0x580, 2 },
  1163. [NSS_CC_UNIPHY_PORT2_RX_CLK_ARES] = { 0x584, 2 },
  1164. [NSS_CC_UNIPHY_PORT2_TX_CLK_ARES] = { 0x588, 2 },
  1165. [NSS_CC_UNIPHY_PORT3_RX_CLK_ARES] = { 0x58c, 2 },
  1166. [NSS_CC_UNIPHY_PORT3_TX_CLK_ARES] = { 0x590, 2 },
  1167. [NSS_CC_XGMAC0_PTP_REF_CLK_ARES] = { 0x448, 2 },
  1168. [NSS_CC_XGMAC1_PTP_REF_CLK_ARES] = { 0x44c, 2 },
  1169. [NSS_CC_XGMAC2_PTP_REF_CLK_ARES] = { 0x450, 2 },
  1170. };
  1171. static const struct regmap_config nss_cc_ipq5424_regmap_config = {
  1172. .reg_bits = 32,
  1173. .reg_stride = 4,
  1174. .val_bits = 32,
  1175. .max_register = 0x800,
  1176. .fast_io = true,
  1177. };
  1178. static const struct qcom_icc_hws_data icc_ipq5424_nss_hws[] = {
  1179. { MASTER_NSSNOC_PPE, SLAVE_NSSNOC_PPE, NSS_CC_NSSNOC_PPE_CLK },
  1180. { MASTER_NSSNOC_PPE_CFG, SLAVE_NSSNOC_PPE_CFG, NSS_CC_NSSNOC_PPE_CFG_CLK },
  1181. { MASTER_NSSNOC_NSS_CSR, SLAVE_NSSNOC_NSS_CSR, NSS_CC_NSSNOC_NSS_CSR_CLK },
  1182. { MASTER_NSSNOC_CE_AXI, SLAVE_NSSNOC_CE_AXI, NSS_CC_NSSNOC_CE_AXI_CLK},
  1183. { MASTER_NSSNOC_CE_APB, SLAVE_NSSNOC_CE_APB, NSS_CC_NSSNOC_CE_APB_CLK},
  1184. { MASTER_NSSNOC_EIP, SLAVE_NSSNOC_EIP, NSS_CC_NSSNOC_EIP_CLK},
  1185. };
  1186. #define IPQ_NSSCC_ID (5424 * 2) /* some unique value */
  1187. static const struct qcom_cc_desc nss_cc_ipq5424_desc = {
  1188. .config = &nss_cc_ipq5424_regmap_config,
  1189. .clks = nss_cc_ipq5424_clocks,
  1190. .num_clks = ARRAY_SIZE(nss_cc_ipq5424_clocks),
  1191. .resets = nss_cc_ipq5424_resets,
  1192. .num_resets = ARRAY_SIZE(nss_cc_ipq5424_resets),
  1193. .icc_hws = icc_ipq5424_nss_hws,
  1194. .num_icc_hws = ARRAY_SIZE(icc_ipq5424_nss_hws),
  1195. .icc_first_node_id = IPQ_NSSCC_ID,
  1196. };
  1197. static const struct dev_pm_ops nss_cc_ipq5424_pm_ops = {
  1198. SET_RUNTIME_PM_OPS(pm_clk_suspend, pm_clk_resume, NULL)
  1199. };
  1200. static const struct of_device_id nss_cc_ipq5424_match_table[] = {
  1201. { .compatible = "qcom,ipq5424-nsscc" },
  1202. { }
  1203. };
  1204. MODULE_DEVICE_TABLE(of, nss_cc_ipq5424_match_table);
  1205. static int nss_cc_ipq5424_probe(struct platform_device *pdev)
  1206. {
  1207. int ret;
  1208. ret = devm_pm_runtime_enable(&pdev->dev);
  1209. if (ret)
  1210. return dev_err_probe(&pdev->dev, ret, "Fail to enable runtime PM\n");
  1211. ret = devm_pm_clk_create(&pdev->dev);
  1212. if (ret)
  1213. return dev_err_probe(&pdev->dev, ret, "Fail to create PM clock\n");
  1214. ret = pm_clk_add(&pdev->dev, "bus");
  1215. if (ret)
  1216. return dev_err_probe(&pdev->dev, ret, "Fail to add bus clock\n");
  1217. ret = pm_runtime_resume_and_get(&pdev->dev);
  1218. if (ret)
  1219. return dev_err_probe(&pdev->dev, ret, "Fail to resume\n");
  1220. ret = qcom_cc_probe(pdev, &nss_cc_ipq5424_desc);
  1221. pm_runtime_put(&pdev->dev);
  1222. return ret;
  1223. }
  1224. static struct platform_driver nss_cc_ipq5424_driver = {
  1225. .probe = nss_cc_ipq5424_probe,
  1226. .driver = {
  1227. .name = "qcom,ipq5424-nsscc",
  1228. .of_match_table = nss_cc_ipq5424_match_table,
  1229. .pm = &nss_cc_ipq5424_pm_ops,
  1230. .sync_state = icc_sync_state,
  1231. },
  1232. };
  1233. module_platform_driver(nss_cc_ipq5424_driver);
  1234. MODULE_DESCRIPTION("Qualcomm Technologies, Inc. NSSCC IPQ5424 Driver");
  1235. MODULE_LICENSE("GPL");