camcc-sm6350.c 48 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411141214131414141514161417141814191420142114221423142414251426142714281429143014311432143314341435143614371438143914401441144214431444144514461447144814491450145114521453145414551456145714581459146014611462146314641465146614671468146914701471147214731474147514761477147814791480148114821483148414851486148714881489149014911492149314941495149614971498149915001501150215031504150515061507150815091510151115121513151415151516151715181519152015211522152315241525152615271528152915301531153215331534153515361537153815391540154115421543154415451546154715481549155015511552155315541555155615571558155915601561156215631564156515661567156815691570157115721573157415751576157715781579158015811582158315841585158615871588158915901591159215931594159515961597159815991600160116021603160416051606160716081609161016111612161316141615161616171618161916201621162216231624162516261627162816291630163116321633163416351636163716381639164016411642164316441645164616471648164916501651165216531654165516561657165816591660166116621663166416651666166716681669167016711672167316741675167616771678167916801681168216831684168516861687168816891690169116921693169416951696169716981699170017011702170317041705170617071708170917101711171217131714171517161717171817191720172117221723172417251726172717281729173017311732173317341735173617371738173917401741174217431744174517461747174817491750175117521753175417551756175717581759176017611762176317641765176617671768176917701771177217731774177517761777177817791780178117821783178417851786178717881789179017911792179317941795179617971798179918001801180218031804180518061807180818091810181118121813181418151816181718181819182018211822182318241825182618271828182918301831183218331834183518361837183818391840184118421843184418451846184718481849185018511852185318541855185618571858185918601861186218631864186518661867186818691870187118721873187418751876187718781879188018811882188318841885188618871888188918901891189218931894189518961897189818991900190119021903190419051906190719081909191019111912191319141915191619171918
  1. // SPDX-License-Identifier: GPL-2.0-only
  2. /*
  3. * Copyright (c) 2022, The Linux Foundation. All rights reserved.
  4. * Copyright (c) 2022, Linaro Limited
  5. */
  6. #include <linux/clk-provider.h>
  7. #include <linux/mod_devicetable.h>
  8. #include <linux/module.h>
  9. #include <linux/platform_device.h>
  10. #include <linux/regmap.h>
  11. #include <dt-bindings/clock/qcom,sm6350-camcc.h>
  12. #include "clk-alpha-pll.h"
  13. #include "clk-branch.h"
  14. #include "clk-rcg.h"
  15. #include "common.h"
  16. #include "gdsc.h"
  17. enum {
  18. DT_BI_TCXO,
  19. };
  20. enum {
  21. P_BI_TCXO,
  22. P_CAMCC_PLL0_OUT_EVEN,
  23. P_CAMCC_PLL0_OUT_MAIN,
  24. P_CAMCC_PLL1_OUT_EVEN,
  25. P_CAMCC_PLL1_OUT_MAIN,
  26. P_CAMCC_PLL2_OUT_EARLY,
  27. P_CAMCC_PLL2_OUT_MAIN,
  28. P_CAMCC_PLL3_OUT_MAIN,
  29. };
  30. static const struct pll_vco fabia_vco[] = {
  31. { 249600000, 2000000000, 0 },
  32. };
  33. /* 600MHz configuration */
  34. static const struct alpha_pll_config camcc_pll0_config = {
  35. .l = 0x1f,
  36. .alpha = 0x4000,
  37. .config_ctl_val = 0x20485699,
  38. .config_ctl_hi_val = 0x00002067,
  39. .test_ctl_val = 0x40000000,
  40. .test_ctl_hi_val = 0x00000002,
  41. .user_ctl_val = 0x00000101,
  42. .user_ctl_hi_val = 0x00004805,
  43. };
  44. static struct clk_alpha_pll camcc_pll0 = {
  45. .offset = 0x0,
  46. .vco_table = fabia_vco,
  47. .num_vco = ARRAY_SIZE(fabia_vco),
  48. .regs = clk_alpha_pll_regs[CLK_ALPHA_PLL_TYPE_FABIA],
  49. .clkr = {
  50. .hw.init = &(struct clk_init_data){
  51. .name = "camcc_pll0",
  52. .parent_data = &(const struct clk_parent_data){
  53. .index = DT_BI_TCXO,
  54. },
  55. .num_parents = 1,
  56. .ops = &clk_alpha_pll_fabia_ops,
  57. },
  58. },
  59. };
  60. static const struct clk_div_table post_div_table_camcc_pll0_out_even[] = {
  61. { 0x1, 2 },
  62. { }
  63. };
  64. static struct clk_alpha_pll_postdiv camcc_pll0_out_even = {
  65. .offset = 0x0,
  66. .post_div_shift = 8,
  67. .post_div_table = post_div_table_camcc_pll0_out_even,
  68. .num_post_div = ARRAY_SIZE(post_div_table_camcc_pll0_out_even),
  69. .width = 4,
  70. .regs = clk_alpha_pll_regs[CLK_ALPHA_PLL_TYPE_FABIA],
  71. .clkr.hw.init = &(struct clk_init_data){
  72. .name = "camcc_pll0_out_even",
  73. .parent_hws = (const struct clk_hw*[]){
  74. &camcc_pll0.clkr.hw,
  75. },
  76. .num_parents = 1,
  77. .flags = CLK_SET_RATE_PARENT,
  78. .ops = &clk_alpha_pll_postdiv_fabia_ops,
  79. },
  80. };
  81. /* 808MHz configuration */
  82. static const struct alpha_pll_config camcc_pll1_config = {
  83. .l = 0x2a,
  84. .alpha = 0x1555,
  85. .config_ctl_val = 0x20485699,
  86. .config_ctl_hi_val = 0x00002067,
  87. .test_ctl_val = 0x40000000,
  88. .test_ctl_hi_val = 0x00000000,
  89. .user_ctl_val = 0x00000101,
  90. .user_ctl_hi_val = 0x00004805,
  91. };
  92. static struct clk_alpha_pll camcc_pll1 = {
  93. .offset = 0x1000,
  94. .vco_table = fabia_vco,
  95. .num_vco = ARRAY_SIZE(fabia_vco),
  96. .regs = clk_alpha_pll_regs[CLK_ALPHA_PLL_TYPE_FABIA],
  97. .clkr = {
  98. .hw.init = &(struct clk_init_data){
  99. .name = "camcc_pll1",
  100. .parent_data = &(const struct clk_parent_data){
  101. .index = DT_BI_TCXO,
  102. },
  103. .num_parents = 1,
  104. .ops = &clk_alpha_pll_fabia_ops,
  105. },
  106. },
  107. };
  108. static const struct clk_div_table post_div_table_camcc_pll1_out_even[] = {
  109. { 0x1, 2 },
  110. { }
  111. };
  112. static struct clk_alpha_pll_postdiv camcc_pll1_out_even = {
  113. .offset = 0x1000,
  114. .post_div_shift = 8,
  115. .post_div_table = post_div_table_camcc_pll1_out_even,
  116. .num_post_div = ARRAY_SIZE(post_div_table_camcc_pll1_out_even),
  117. .width = 4,
  118. .regs = clk_alpha_pll_regs[CLK_ALPHA_PLL_TYPE_FABIA],
  119. .clkr.hw.init = &(struct clk_init_data){
  120. .name = "camcc_pll1_out_even",
  121. .parent_hws = (const struct clk_hw*[]){
  122. &camcc_pll1.clkr.hw,
  123. },
  124. .num_parents = 1,
  125. .flags = CLK_SET_RATE_PARENT,
  126. .ops = &clk_alpha_pll_postdiv_fabia_ops,
  127. },
  128. };
  129. /* 1920MHz configuration */
  130. static const struct alpha_pll_config camcc_pll2_config = {
  131. .l = 0x64,
  132. .alpha = 0x0,
  133. .config_ctl_val = 0x20000800,
  134. .config_ctl_hi_val = 0x400003d2,
  135. .test_ctl_val = 0x04000400,
  136. .test_ctl_hi_val = 0x00004000,
  137. .user_ctl_val = 0x0000030b,
  138. };
  139. static struct clk_alpha_pll camcc_pll2 = {
  140. .offset = 0x2000,
  141. .regs = clk_alpha_pll_regs[CLK_ALPHA_PLL_TYPE_AGERA],
  142. .clkr = {
  143. .hw.init = &(struct clk_init_data){
  144. .name = "camcc_pll2",
  145. .parent_data = &(const struct clk_parent_data){
  146. .index = DT_BI_TCXO,
  147. },
  148. .num_parents = 1,
  149. .ops = &clk_alpha_pll_agera_ops,
  150. },
  151. },
  152. };
  153. static struct clk_fixed_factor camcc_pll2_out_early = {
  154. .mult = 1,
  155. .div = 2,
  156. .hw.init = &(struct clk_init_data){
  157. .name = "camcc_pll2_out_early",
  158. .parent_hws = (const struct clk_hw*[]){
  159. &camcc_pll2.clkr.hw,
  160. },
  161. .num_parents = 1,
  162. .ops = &clk_fixed_factor_ops,
  163. },
  164. };
  165. static const struct clk_div_table post_div_table_camcc_pll2_out_main[] = {
  166. { 0x1, 2 },
  167. { }
  168. };
  169. static struct clk_alpha_pll_postdiv camcc_pll2_out_main = {
  170. .offset = 0x2000,
  171. .post_div_shift = 8,
  172. .post_div_table = post_div_table_camcc_pll2_out_main,
  173. .num_post_div = ARRAY_SIZE(post_div_table_camcc_pll2_out_main),
  174. .width = 2,
  175. .regs = clk_alpha_pll_regs[CLK_ALPHA_PLL_TYPE_AGERA],
  176. .clkr.hw.init = &(struct clk_init_data){
  177. .name = "camcc_pll2_out_main",
  178. .parent_hws = (const struct clk_hw*[]){
  179. &camcc_pll2.clkr.hw,
  180. },
  181. .num_parents = 1,
  182. .flags = CLK_SET_RATE_PARENT,
  183. .ops = &clk_alpha_pll_postdiv_ops,
  184. },
  185. };
  186. /* 384MHz configuration */
  187. static const struct alpha_pll_config camcc_pll3_config = {
  188. .l = 0x14,
  189. .alpha = 0x0,
  190. .config_ctl_val = 0x20485699,
  191. .config_ctl_hi_val = 0x00002067,
  192. .test_ctl_val = 0x40000000,
  193. .test_ctl_hi_val = 0x00000002,
  194. .user_ctl_val = 0x00000001,
  195. .user_ctl_hi_val = 0x00014805,
  196. };
  197. static struct clk_alpha_pll camcc_pll3 = {
  198. .offset = 0x3000,
  199. .vco_table = fabia_vco,
  200. .num_vco = ARRAY_SIZE(fabia_vco),
  201. .regs = clk_alpha_pll_regs[CLK_ALPHA_PLL_TYPE_FABIA],
  202. .clkr = {
  203. .hw.init = &(struct clk_init_data){
  204. .name = "camcc_pll3",
  205. .parent_data = &(const struct clk_parent_data){
  206. .index = DT_BI_TCXO,
  207. },
  208. .num_parents = 1,
  209. .ops = &clk_alpha_pll_fabia_ops,
  210. },
  211. },
  212. };
  213. static const struct parent_map camcc_parent_map_0[] = {
  214. { P_BI_TCXO, 0 },
  215. { P_CAMCC_PLL0_OUT_EVEN, 6 },
  216. };
  217. static const struct clk_parent_data camcc_parent_data_0[] = {
  218. { .fw_name = "bi_tcxo" },
  219. { .hw = &camcc_pll0_out_even.clkr.hw },
  220. };
  221. static const struct parent_map camcc_parent_map_1[] = {
  222. { P_BI_TCXO, 0 },
  223. { P_CAMCC_PLL0_OUT_MAIN, 1 },
  224. { P_CAMCC_PLL1_OUT_EVEN, 3 },
  225. { P_CAMCC_PLL2_OUT_MAIN, 4 },
  226. };
  227. static const struct clk_parent_data camcc_parent_data_1[] = {
  228. { .fw_name = "bi_tcxo" },
  229. { .hw = &camcc_pll0.clkr.hw },
  230. { .hw = &camcc_pll1_out_even.clkr.hw },
  231. { .hw = &camcc_pll2_out_main.clkr.hw },
  232. };
  233. static const struct parent_map camcc_parent_map_2[] = {
  234. { P_BI_TCXO, 0 },
  235. { P_CAMCC_PLL0_OUT_MAIN, 1 },
  236. { P_CAMCC_PLL3_OUT_MAIN, 5 },
  237. };
  238. static const struct clk_parent_data camcc_parent_data_2[] = {
  239. { .fw_name = "bi_tcxo" },
  240. { .hw = &camcc_pll0.clkr.hw },
  241. { .hw = &camcc_pll3.clkr.hw },
  242. };
  243. static const struct parent_map camcc_parent_map_3[] = {
  244. { P_BI_TCXO, 0 },
  245. { P_CAMCC_PLL2_OUT_EARLY, 3 },
  246. };
  247. static const struct clk_parent_data camcc_parent_data_3[] = {
  248. { .fw_name = "bi_tcxo" },
  249. { .hw = &camcc_pll2_out_early.hw },
  250. };
  251. static const struct parent_map camcc_parent_map_4[] = {
  252. { P_BI_TCXO, 0 },
  253. { P_CAMCC_PLL0_OUT_MAIN, 1 },
  254. { P_CAMCC_PLL1_OUT_EVEN, 3 },
  255. };
  256. static const struct clk_parent_data camcc_parent_data_4[] = {
  257. { .fw_name = "bi_tcxo" },
  258. { .hw = &camcc_pll0.clkr.hw },
  259. { .hw = &camcc_pll1_out_even.clkr.hw },
  260. };
  261. static const struct parent_map camcc_parent_map_5[] = {
  262. { P_BI_TCXO, 0 },
  263. { P_CAMCC_PLL0_OUT_MAIN, 1 },
  264. { P_CAMCC_PLL1_OUT_EVEN, 3 },
  265. { P_CAMCC_PLL3_OUT_MAIN, 5 },
  266. };
  267. static const struct clk_parent_data camcc_parent_data_5[] = {
  268. { .fw_name = "bi_tcxo" },
  269. { .hw = &camcc_pll0.clkr.hw },
  270. { .hw = &camcc_pll1_out_even.clkr.hw },
  271. { .hw = &camcc_pll3.clkr.hw },
  272. };
  273. static const struct parent_map camcc_parent_map_6[] = {
  274. { P_BI_TCXO, 0 },
  275. { P_CAMCC_PLL0_OUT_MAIN, 1 },
  276. { P_CAMCC_PLL2_OUT_MAIN, 4 },
  277. };
  278. static const struct clk_parent_data camcc_parent_data_6[] = {
  279. { .fw_name = "bi_tcxo" },
  280. { .hw = &camcc_pll0.clkr.hw },
  281. { .hw = &camcc_pll2_out_main.clkr.hw },
  282. };
  283. static const struct parent_map camcc_parent_map_7[] = {
  284. { P_BI_TCXO, 0 },
  285. { P_CAMCC_PLL0_OUT_MAIN, 1 },
  286. { P_CAMCC_PLL1_OUT_MAIN, 2 },
  287. { P_CAMCC_PLL2_OUT_MAIN, 4 },
  288. };
  289. static const struct clk_parent_data camcc_parent_data_7[] = {
  290. { .fw_name = "bi_tcxo" },
  291. { .hw = &camcc_pll0.clkr.hw },
  292. { .hw = &camcc_pll1.clkr.hw },
  293. { .hw = &camcc_pll2_out_main.clkr.hw },
  294. };
  295. static const struct parent_map camcc_parent_map_8[] = {
  296. { P_BI_TCXO, 0 },
  297. { P_CAMCC_PLL0_OUT_MAIN, 1 },
  298. { P_CAMCC_PLL1_OUT_MAIN, 2 },
  299. };
  300. static const struct clk_parent_data camcc_parent_data_8[] = {
  301. { .fw_name = "bi_tcxo" },
  302. { .hw = &camcc_pll0.clkr.hw },
  303. { .hw = &camcc_pll1.clkr.hw },
  304. };
  305. static const struct parent_map camcc_parent_map_9[] = {
  306. { P_BI_TCXO, 0 },
  307. { P_CAMCC_PLL2_OUT_MAIN, 4 },
  308. };
  309. static const struct clk_parent_data camcc_parent_data_9[] = {
  310. { .fw_name = "bi_tcxo" },
  311. { .hw = &camcc_pll2_out_main.clkr.hw },
  312. };
  313. static const struct freq_tbl ftbl_camcc_bps_clk_src[] = {
  314. F(200000000, P_CAMCC_PLL0_OUT_MAIN, 3, 0, 0),
  315. F(320000000, P_CAMCC_PLL2_OUT_MAIN, 1.5, 0, 0),
  316. F(404000000, P_CAMCC_PLL1_OUT_EVEN, 1, 0, 0),
  317. F(480000000, P_CAMCC_PLL2_OUT_MAIN, 1, 0, 0),
  318. F(600000000, P_CAMCC_PLL0_OUT_MAIN, 1, 0, 0),
  319. { }
  320. };
  321. static struct clk_rcg2 camcc_bps_clk_src = {
  322. .cmd_rcgr = 0x6010,
  323. .mnd_width = 0,
  324. .hid_width = 5,
  325. .parent_map = camcc_parent_map_1,
  326. .freq_tbl = ftbl_camcc_bps_clk_src,
  327. .clkr.hw.init = &(struct clk_init_data){
  328. .name = "camcc_bps_clk_src",
  329. .parent_data = camcc_parent_data_1,
  330. .num_parents = ARRAY_SIZE(camcc_parent_data_1),
  331. .ops = &clk_rcg2_ops,
  332. },
  333. };
  334. static const struct freq_tbl ftbl_camcc_cci_0_clk_src[] = {
  335. F(37500000, P_CAMCC_PLL0_OUT_EVEN, 8, 0, 0),
  336. F(50000000, P_CAMCC_PLL0_OUT_EVEN, 6, 0, 0),
  337. F(100000000, P_CAMCC_PLL0_OUT_EVEN, 3, 0, 0),
  338. { }
  339. };
  340. static struct clk_rcg2 camcc_cci_0_clk_src = {
  341. .cmd_rcgr = 0xf004,
  342. .mnd_width = 8,
  343. .hid_width = 5,
  344. .parent_map = camcc_parent_map_0,
  345. .freq_tbl = ftbl_camcc_cci_0_clk_src,
  346. .clkr.hw.init = &(struct clk_init_data){
  347. .name = "camcc_cci_0_clk_src",
  348. .parent_data = camcc_parent_data_0,
  349. .num_parents = ARRAY_SIZE(camcc_parent_data_0),
  350. .ops = &clk_rcg2_ops,
  351. },
  352. };
  353. static struct clk_rcg2 camcc_cci_1_clk_src = {
  354. .cmd_rcgr = 0x10004,
  355. .mnd_width = 8,
  356. .hid_width = 5,
  357. .parent_map = camcc_parent_map_0,
  358. .freq_tbl = ftbl_camcc_cci_0_clk_src,
  359. .clkr.hw.init = &(struct clk_init_data){
  360. .name = "camcc_cci_1_clk_src",
  361. .parent_data = camcc_parent_data_0,
  362. .num_parents = ARRAY_SIZE(camcc_parent_data_0),
  363. .ops = &clk_rcg2_ops,
  364. },
  365. };
  366. static const struct freq_tbl ftbl_camcc_cphy_rx_clk_src[] = {
  367. F(150000000, P_CAMCC_PLL0_OUT_MAIN, 4, 0, 0),
  368. F(300000000, P_CAMCC_PLL0_OUT_MAIN, 2, 0, 0),
  369. F(384000000, P_CAMCC_PLL3_OUT_MAIN, 1, 0, 0),
  370. F(400000000, P_CAMCC_PLL0_OUT_MAIN, 1.5, 0, 0),
  371. { }
  372. };
  373. static struct clk_rcg2 camcc_cphy_rx_clk_src = {
  374. .cmd_rcgr = 0x9064,
  375. .mnd_width = 0,
  376. .hid_width = 5,
  377. .parent_map = camcc_parent_map_2,
  378. .freq_tbl = ftbl_camcc_cphy_rx_clk_src,
  379. .clkr.hw.init = &(struct clk_init_data){
  380. .name = "camcc_cphy_rx_clk_src",
  381. .parent_data = camcc_parent_data_2,
  382. .num_parents = ARRAY_SIZE(camcc_parent_data_2),
  383. .ops = &clk_rcg2_ops,
  384. },
  385. };
  386. static const struct freq_tbl ftbl_camcc_csi0phytimer_clk_src[] = {
  387. F(300000000, P_CAMCC_PLL0_OUT_EVEN, 1, 0, 0),
  388. { }
  389. };
  390. static struct clk_rcg2 camcc_csi0phytimer_clk_src = {
  391. .cmd_rcgr = 0x5004,
  392. .mnd_width = 0,
  393. .hid_width = 5,
  394. .parent_map = camcc_parent_map_0,
  395. .freq_tbl = ftbl_camcc_csi0phytimer_clk_src,
  396. .clkr.hw.init = &(struct clk_init_data){
  397. .name = "camcc_csi0phytimer_clk_src",
  398. .parent_data = camcc_parent_data_0,
  399. .num_parents = ARRAY_SIZE(camcc_parent_data_0),
  400. .ops = &clk_rcg2_ops,
  401. },
  402. };
  403. static struct clk_rcg2 camcc_csi1phytimer_clk_src = {
  404. .cmd_rcgr = 0x5028,
  405. .mnd_width = 0,
  406. .hid_width = 5,
  407. .parent_map = camcc_parent_map_0,
  408. .freq_tbl = ftbl_camcc_csi0phytimer_clk_src,
  409. .clkr.hw.init = &(struct clk_init_data){
  410. .name = "camcc_csi1phytimer_clk_src",
  411. .parent_data = camcc_parent_data_0,
  412. .num_parents = ARRAY_SIZE(camcc_parent_data_0),
  413. .ops = &clk_rcg2_ops,
  414. },
  415. };
  416. static struct clk_rcg2 camcc_csi2phytimer_clk_src = {
  417. .cmd_rcgr = 0x504c,
  418. .mnd_width = 0,
  419. .hid_width = 5,
  420. .parent_map = camcc_parent_map_0,
  421. .freq_tbl = ftbl_camcc_csi0phytimer_clk_src,
  422. .clkr.hw.init = &(struct clk_init_data){
  423. .name = "camcc_csi2phytimer_clk_src",
  424. .parent_data = camcc_parent_data_0,
  425. .num_parents = ARRAY_SIZE(camcc_parent_data_0),
  426. .ops = &clk_rcg2_ops,
  427. },
  428. };
  429. static struct clk_rcg2 camcc_csi3phytimer_clk_src = {
  430. .cmd_rcgr = 0x5070,
  431. .mnd_width = 0,
  432. .hid_width = 5,
  433. .parent_map = camcc_parent_map_0,
  434. .freq_tbl = ftbl_camcc_csi0phytimer_clk_src,
  435. .clkr.hw.init = &(struct clk_init_data){
  436. .name = "camcc_csi3phytimer_clk_src",
  437. .parent_data = camcc_parent_data_0,
  438. .num_parents = ARRAY_SIZE(camcc_parent_data_0),
  439. .ops = &clk_rcg2_ops,
  440. },
  441. };
  442. static const struct freq_tbl ftbl_camcc_fast_ahb_clk_src[] = {
  443. F(100000000, P_CAMCC_PLL0_OUT_MAIN, 6, 0, 0),
  444. F(200000000, P_CAMCC_PLL0_OUT_MAIN, 3, 0, 0),
  445. F(300000000, P_CAMCC_PLL0_OUT_MAIN, 2, 0, 0),
  446. F(404000000, P_CAMCC_PLL1_OUT_EVEN, 1, 0, 0),
  447. { }
  448. };
  449. static struct clk_rcg2 camcc_fast_ahb_clk_src = {
  450. .cmd_rcgr = 0x603c,
  451. .mnd_width = 0,
  452. .hid_width = 5,
  453. .parent_map = camcc_parent_map_4,
  454. .freq_tbl = ftbl_camcc_fast_ahb_clk_src,
  455. .clkr.hw.init = &(struct clk_init_data){
  456. .name = "camcc_fast_ahb_clk_src",
  457. .parent_data = camcc_parent_data_4,
  458. .num_parents = ARRAY_SIZE(camcc_parent_data_4),
  459. .ops = &clk_rcg2_ops,
  460. },
  461. };
  462. static const struct freq_tbl ftbl_camcc_icp_clk_src[] = {
  463. F(240000000, P_CAMCC_PLL0_OUT_MAIN, 2.5, 0, 0),
  464. F(384000000, P_CAMCC_PLL3_OUT_MAIN, 1, 0, 0),
  465. F(404000000, P_CAMCC_PLL1_OUT_EVEN, 1, 0, 0),
  466. F(600000000, P_CAMCC_PLL0_OUT_MAIN, 1, 0, 0),
  467. { }
  468. };
  469. static struct clk_rcg2 camcc_icp_clk_src = {
  470. .cmd_rcgr = 0xe014,
  471. .mnd_width = 0,
  472. .hid_width = 5,
  473. .parent_map = camcc_parent_map_5,
  474. .freq_tbl = ftbl_camcc_icp_clk_src,
  475. .clkr.hw.init = &(struct clk_init_data){
  476. .name = "camcc_icp_clk_src",
  477. .parent_data = camcc_parent_data_5,
  478. .num_parents = ARRAY_SIZE(camcc_parent_data_5),
  479. .ops = &clk_rcg2_ops,
  480. },
  481. };
  482. static const struct freq_tbl ftbl_camcc_ife_0_clk_src[] = {
  483. F(240000000, P_CAMCC_PLL0_OUT_MAIN, 2.5, 0, 0),
  484. F(320000000, P_CAMCC_PLL2_OUT_MAIN, 1.5, 0, 0),
  485. F(404000000, P_CAMCC_PLL1_OUT_EVEN, 1, 0, 0),
  486. F(480000000, P_CAMCC_PLL2_OUT_MAIN, 1, 0, 0),
  487. F(600000000, P_CAMCC_PLL0_OUT_MAIN, 1, 0, 0),
  488. { }
  489. };
  490. static struct clk_rcg2 camcc_ife_0_clk_src = {
  491. .cmd_rcgr = 0x9010,
  492. .mnd_width = 0,
  493. .hid_width = 5,
  494. .parent_map = camcc_parent_map_1,
  495. .freq_tbl = ftbl_camcc_ife_0_clk_src,
  496. .clkr.hw.init = &(struct clk_init_data){
  497. .name = "camcc_ife_0_clk_src",
  498. .parent_data = camcc_parent_data_1,
  499. .num_parents = ARRAY_SIZE(camcc_parent_data_1),
  500. .flags = CLK_SET_RATE_PARENT,
  501. .ops = &clk_rcg2_ops,
  502. },
  503. };
  504. static struct clk_rcg2 camcc_ife_0_csid_clk_src = {
  505. .cmd_rcgr = 0x903c,
  506. .mnd_width = 0,
  507. .hid_width = 5,
  508. .parent_map = camcc_parent_map_2,
  509. .freq_tbl = ftbl_camcc_cphy_rx_clk_src,
  510. .clkr.hw.init = &(struct clk_init_data){
  511. .name = "camcc_ife_0_csid_clk_src",
  512. .parent_data = camcc_parent_data_2,
  513. .num_parents = ARRAY_SIZE(camcc_parent_data_2),
  514. .ops = &clk_rcg2_ops,
  515. },
  516. };
  517. static struct clk_rcg2 camcc_ife_1_clk_src = {
  518. .cmd_rcgr = 0xa010,
  519. .mnd_width = 0,
  520. .hid_width = 5,
  521. .parent_map = camcc_parent_map_1,
  522. .freq_tbl = ftbl_camcc_ife_0_clk_src,
  523. .clkr.hw.init = &(struct clk_init_data){
  524. .name = "camcc_ife_1_clk_src",
  525. .parent_data = camcc_parent_data_1,
  526. .num_parents = ARRAY_SIZE(camcc_parent_data_1),
  527. .flags = CLK_SET_RATE_PARENT,
  528. .ops = &clk_rcg2_ops,
  529. },
  530. };
  531. static struct clk_rcg2 camcc_ife_1_csid_clk_src = {
  532. .cmd_rcgr = 0xa034,
  533. .mnd_width = 0,
  534. .hid_width = 5,
  535. .parent_map = camcc_parent_map_2,
  536. .freq_tbl = ftbl_camcc_cphy_rx_clk_src,
  537. .clkr.hw.init = &(struct clk_init_data){
  538. .name = "camcc_ife_1_csid_clk_src",
  539. .parent_data = camcc_parent_data_2,
  540. .num_parents = ARRAY_SIZE(camcc_parent_data_2),
  541. .ops = &clk_rcg2_ops,
  542. },
  543. };
  544. static struct clk_rcg2 camcc_ife_2_clk_src = {
  545. .cmd_rcgr = 0xb00c,
  546. .mnd_width = 0,
  547. .hid_width = 5,
  548. .parent_map = camcc_parent_map_1,
  549. .freq_tbl = ftbl_camcc_ife_0_clk_src,
  550. .clkr.hw.init = &(struct clk_init_data){
  551. .name = "camcc_ife_2_clk_src",
  552. .parent_data = camcc_parent_data_1,
  553. .num_parents = ARRAY_SIZE(camcc_parent_data_1),
  554. .ops = &clk_rcg2_ops,
  555. },
  556. };
  557. static struct clk_rcg2 camcc_ife_2_csid_clk_src = {
  558. .cmd_rcgr = 0xb030,
  559. .mnd_width = 0,
  560. .hid_width = 5,
  561. .parent_map = camcc_parent_map_2,
  562. .freq_tbl = ftbl_camcc_cphy_rx_clk_src,
  563. .clkr.hw.init = &(struct clk_init_data){
  564. .name = "camcc_ife_2_csid_clk_src",
  565. .parent_data = camcc_parent_data_2,
  566. .num_parents = ARRAY_SIZE(camcc_parent_data_2),
  567. .ops = &clk_rcg2_ops,
  568. },
  569. };
  570. static const struct freq_tbl ftbl_camcc_ife_lite_clk_src[] = {
  571. F(320000000, P_CAMCC_PLL2_OUT_MAIN, 1.5, 0, 0),
  572. F(400000000, P_CAMCC_PLL0_OUT_MAIN, 1.5, 0, 0),
  573. F(480000000, P_CAMCC_PLL2_OUT_MAIN, 1, 0, 0),
  574. F(600000000, P_CAMCC_PLL0_OUT_MAIN, 1, 0, 0),
  575. { }
  576. };
  577. static struct clk_rcg2 camcc_ife_lite_clk_src = {
  578. .cmd_rcgr = 0xc004,
  579. .mnd_width = 0,
  580. .hid_width = 5,
  581. .parent_map = camcc_parent_map_6,
  582. .freq_tbl = ftbl_camcc_ife_lite_clk_src,
  583. .clkr.hw.init = &(struct clk_init_data){
  584. .name = "camcc_ife_lite_clk_src",
  585. .parent_data = camcc_parent_data_6,
  586. .num_parents = ARRAY_SIZE(camcc_parent_data_6),
  587. .ops = &clk_rcg2_ops,
  588. },
  589. };
  590. static struct clk_rcg2 camcc_ife_lite_csid_clk_src = {
  591. .cmd_rcgr = 0xc024,
  592. .mnd_width = 0,
  593. .hid_width = 5,
  594. .parent_map = camcc_parent_map_2,
  595. .freq_tbl = ftbl_camcc_cphy_rx_clk_src,
  596. .clkr.hw.init = &(struct clk_init_data){
  597. .name = "camcc_ife_lite_csid_clk_src",
  598. .parent_data = camcc_parent_data_2,
  599. .num_parents = ARRAY_SIZE(camcc_parent_data_2),
  600. .ops = &clk_rcg2_ops,
  601. },
  602. };
  603. static const struct freq_tbl ftbl_camcc_ipe_0_clk_src[] = {
  604. F(240000000, P_CAMCC_PLL2_OUT_MAIN, 2, 0, 0),
  605. F(320000000, P_CAMCC_PLL2_OUT_MAIN, 1.5, 0, 0),
  606. F(404000000, P_CAMCC_PLL1_OUT_MAIN, 2, 0, 0),
  607. F(538666667, P_CAMCC_PLL1_OUT_MAIN, 1.5, 0, 0),
  608. F(600000000, P_CAMCC_PLL0_OUT_MAIN, 1, 0, 0),
  609. { }
  610. };
  611. static struct clk_rcg2 camcc_ipe_0_clk_src = {
  612. .cmd_rcgr = 0x7010,
  613. .mnd_width = 0,
  614. .hid_width = 5,
  615. .parent_map = camcc_parent_map_7,
  616. .freq_tbl = ftbl_camcc_ipe_0_clk_src,
  617. .clkr.hw.init = &(struct clk_init_data){
  618. .name = "camcc_ipe_0_clk_src",
  619. .parent_data = camcc_parent_data_7,
  620. .num_parents = ARRAY_SIZE(camcc_parent_data_7),
  621. .flags = CLK_SET_RATE_PARENT,
  622. .ops = &clk_rcg2_ops,
  623. },
  624. };
  625. static const struct freq_tbl ftbl_camcc_jpeg_clk_src[] = {
  626. F(66666667, P_CAMCC_PLL0_OUT_MAIN, 9, 0, 0),
  627. F(133333333, P_CAMCC_PLL0_OUT_MAIN, 4.5, 0, 0),
  628. F(200000000, P_CAMCC_PLL0_OUT_MAIN, 3, 0, 0),
  629. F(404000000, P_CAMCC_PLL1_OUT_EVEN, 1, 0, 0),
  630. F(480000000, P_CAMCC_PLL2_OUT_MAIN, 1, 0, 0),
  631. F(600000000, P_CAMCC_PLL0_OUT_MAIN, 1, 0, 0),
  632. { }
  633. };
  634. static struct clk_rcg2 camcc_jpeg_clk_src = {
  635. .cmd_rcgr = 0xd004,
  636. .mnd_width = 0,
  637. .hid_width = 5,
  638. .parent_map = camcc_parent_map_1,
  639. .freq_tbl = ftbl_camcc_jpeg_clk_src,
  640. .clkr.hw.init = &(struct clk_init_data){
  641. .name = "camcc_jpeg_clk_src",
  642. .parent_data = camcc_parent_data_1,
  643. .num_parents = ARRAY_SIZE(camcc_parent_data_1),
  644. .ops = &clk_rcg2_ops,
  645. },
  646. };
  647. static const struct freq_tbl ftbl_camcc_lrme_clk_src[] = {
  648. F(200000000, P_CAMCC_PLL0_OUT_MAIN, 3, 0, 0),
  649. F(269333333, P_CAMCC_PLL1_OUT_MAIN, 3, 0, 0),
  650. F(323200000, P_CAMCC_PLL1_OUT_MAIN, 2.5, 0, 0),
  651. F(404000000, P_CAMCC_PLL1_OUT_MAIN, 2, 0, 0),
  652. { }
  653. };
  654. static struct clk_rcg2 camcc_lrme_clk_src = {
  655. .cmd_rcgr = 0x11004,
  656. .mnd_width = 0,
  657. .hid_width = 5,
  658. .parent_map = camcc_parent_map_8,
  659. .freq_tbl = ftbl_camcc_lrme_clk_src,
  660. .clkr.hw.init = &(struct clk_init_data){
  661. .name = "camcc_lrme_clk_src",
  662. .parent_data = camcc_parent_data_8,
  663. .num_parents = ARRAY_SIZE(camcc_parent_data_8),
  664. .ops = &clk_rcg2_ops,
  665. },
  666. };
  667. static const struct freq_tbl ftbl_camcc_mclk0_clk_src[] = {
  668. F(19200000, P_CAMCC_PLL2_OUT_EARLY, 1, 1, 50),
  669. F(24000000, P_CAMCC_PLL2_OUT_EARLY, 10, 1, 4),
  670. F(64000000, P_CAMCC_PLL2_OUT_EARLY, 15, 0, 0),
  671. { }
  672. };
  673. static struct clk_rcg2 camcc_mclk0_clk_src = {
  674. .cmd_rcgr = 0x4004,
  675. .mnd_width = 8,
  676. .hid_width = 5,
  677. .parent_map = camcc_parent_map_3,
  678. .freq_tbl = ftbl_camcc_mclk0_clk_src,
  679. .clkr.hw.init = &(struct clk_init_data){
  680. .name = "camcc_mclk0_clk_src",
  681. .parent_data = camcc_parent_data_3,
  682. .num_parents = ARRAY_SIZE(camcc_parent_data_3),
  683. .ops = &clk_rcg2_ops,
  684. },
  685. };
  686. static struct clk_rcg2 camcc_mclk1_clk_src = {
  687. .cmd_rcgr = 0x4024,
  688. .mnd_width = 8,
  689. .hid_width = 5,
  690. .parent_map = camcc_parent_map_3,
  691. .freq_tbl = ftbl_camcc_mclk0_clk_src,
  692. .clkr.hw.init = &(struct clk_init_data){
  693. .name = "camcc_mclk1_clk_src",
  694. .parent_data = camcc_parent_data_3,
  695. .num_parents = ARRAY_SIZE(camcc_parent_data_3),
  696. .ops = &clk_rcg2_ops,
  697. },
  698. };
  699. static struct clk_rcg2 camcc_mclk2_clk_src = {
  700. .cmd_rcgr = 0x4044,
  701. .mnd_width = 8,
  702. .hid_width = 5,
  703. .parent_map = camcc_parent_map_3,
  704. .freq_tbl = ftbl_camcc_mclk0_clk_src,
  705. .clkr.hw.init = &(struct clk_init_data){
  706. .name = "camcc_mclk2_clk_src",
  707. .parent_data = camcc_parent_data_3,
  708. .num_parents = ARRAY_SIZE(camcc_parent_data_3),
  709. .ops = &clk_rcg2_ops,
  710. },
  711. };
  712. static struct clk_rcg2 camcc_mclk3_clk_src = {
  713. .cmd_rcgr = 0x4064,
  714. .mnd_width = 8,
  715. .hid_width = 5,
  716. .parent_map = camcc_parent_map_3,
  717. .freq_tbl = ftbl_camcc_mclk0_clk_src,
  718. .clkr.hw.init = &(struct clk_init_data){
  719. .name = "camcc_mclk3_clk_src",
  720. .parent_data = camcc_parent_data_3,
  721. .num_parents = ARRAY_SIZE(camcc_parent_data_3),
  722. .ops = &clk_rcg2_ops,
  723. },
  724. };
  725. static struct clk_rcg2 camcc_mclk4_clk_src = {
  726. .cmd_rcgr = 0x4084,
  727. .mnd_width = 8,
  728. .hid_width = 5,
  729. .parent_map = camcc_parent_map_3,
  730. .freq_tbl = ftbl_camcc_mclk0_clk_src,
  731. .clkr.hw.init = &(struct clk_init_data){
  732. .name = "camcc_mclk4_clk_src",
  733. .parent_data = camcc_parent_data_3,
  734. .num_parents = ARRAY_SIZE(camcc_parent_data_3),
  735. .ops = &clk_rcg2_ops,
  736. },
  737. };
  738. static const struct freq_tbl ftbl_camcc_slow_ahb_clk_src[] = {
  739. F(80000000, P_CAMCC_PLL2_OUT_MAIN, 6, 0, 0),
  740. { }
  741. };
  742. static struct clk_rcg2 camcc_slow_ahb_clk_src = {
  743. .cmd_rcgr = 0x6058,
  744. .mnd_width = 0,
  745. .hid_width = 5,
  746. .parent_map = camcc_parent_map_9,
  747. .freq_tbl = ftbl_camcc_slow_ahb_clk_src,
  748. .clkr.hw.init = &(struct clk_init_data){
  749. .name = "camcc_slow_ahb_clk_src",
  750. .parent_data = camcc_parent_data_9,
  751. .num_parents = ARRAY_SIZE(camcc_parent_data_9),
  752. .ops = &clk_rcg2_ops,
  753. },
  754. };
  755. static struct clk_branch camcc_bps_ahb_clk = {
  756. .halt_reg = 0x6070,
  757. .halt_check = BRANCH_HALT,
  758. .clkr = {
  759. .enable_reg = 0x6070,
  760. .enable_mask = BIT(0),
  761. .hw.init = &(struct clk_init_data){
  762. .name = "camcc_bps_ahb_clk",
  763. .parent_hws = (const struct clk_hw*[]){
  764. &camcc_slow_ahb_clk_src.clkr.hw
  765. },
  766. .num_parents = 1,
  767. .flags = CLK_SET_RATE_PARENT,
  768. .ops = &clk_branch2_ops,
  769. },
  770. },
  771. };
  772. static struct clk_branch camcc_bps_areg_clk = {
  773. .halt_reg = 0x6054,
  774. .halt_check = BRANCH_HALT,
  775. .clkr = {
  776. .enable_reg = 0x6054,
  777. .enable_mask = BIT(0),
  778. .hw.init = &(struct clk_init_data){
  779. .name = "camcc_bps_areg_clk",
  780. .parent_hws = (const struct clk_hw*[]){
  781. &camcc_fast_ahb_clk_src.clkr.hw
  782. },
  783. .num_parents = 1,
  784. .flags = CLK_SET_RATE_PARENT,
  785. .ops = &clk_branch2_ops,
  786. },
  787. },
  788. };
  789. static struct clk_branch camcc_bps_axi_clk = {
  790. .halt_reg = 0x6038,
  791. .halt_check = BRANCH_HALT,
  792. .clkr = {
  793. .enable_reg = 0x6038,
  794. .enable_mask = BIT(0),
  795. .hw.init = &(struct clk_init_data){
  796. .name = "camcc_bps_axi_clk",
  797. .ops = &clk_branch2_ops,
  798. },
  799. },
  800. };
  801. static struct clk_branch camcc_bps_clk = {
  802. .halt_reg = 0x6028,
  803. .halt_check = BRANCH_HALT,
  804. .clkr = {
  805. .enable_reg = 0x6028,
  806. .enable_mask = BIT(0),
  807. .hw.init = &(struct clk_init_data){
  808. .name = "camcc_bps_clk",
  809. .parent_hws = (const struct clk_hw*[]){
  810. &camcc_bps_clk_src.clkr.hw
  811. },
  812. .num_parents = 1,
  813. .flags = CLK_SET_RATE_PARENT,
  814. .ops = &clk_branch2_ops,
  815. },
  816. },
  817. };
  818. static struct clk_branch camcc_camnoc_axi_clk = {
  819. .halt_reg = 0x13004,
  820. .halt_check = BRANCH_HALT,
  821. .clkr = {
  822. .enable_reg = 0x13004,
  823. .enable_mask = BIT(0),
  824. .hw.init = &(struct clk_init_data){
  825. .name = "camcc_camnoc_axi_clk",
  826. .ops = &clk_branch2_ops,
  827. },
  828. },
  829. };
  830. static struct clk_branch camcc_cci_0_clk = {
  831. .halt_reg = 0xf01c,
  832. .halt_check = BRANCH_HALT,
  833. .clkr = {
  834. .enable_reg = 0xf01c,
  835. .enable_mask = BIT(0),
  836. .hw.init = &(struct clk_init_data){
  837. .name = "camcc_cci_0_clk",
  838. .parent_hws = (const struct clk_hw*[]){
  839. &camcc_cci_0_clk_src.clkr.hw
  840. },
  841. .num_parents = 1,
  842. .flags = CLK_SET_RATE_PARENT,
  843. .ops = &clk_branch2_ops,
  844. },
  845. },
  846. };
  847. static struct clk_branch camcc_cci_1_clk = {
  848. .halt_reg = 0x1001c,
  849. .halt_check = BRANCH_HALT,
  850. .clkr = {
  851. .enable_reg = 0x1001c,
  852. .enable_mask = BIT(0),
  853. .hw.init = &(struct clk_init_data){
  854. .name = "camcc_cci_1_clk",
  855. .parent_hws = (const struct clk_hw*[]){
  856. &camcc_cci_1_clk_src.clkr.hw
  857. },
  858. .num_parents = 1,
  859. .flags = CLK_SET_RATE_PARENT,
  860. .ops = &clk_branch2_ops,
  861. },
  862. },
  863. };
  864. static struct clk_branch camcc_core_ahb_clk = {
  865. .halt_reg = 0x14010,
  866. .halt_check = BRANCH_HALT_VOTED,
  867. .clkr = {
  868. .enable_reg = 0x14010,
  869. .enable_mask = BIT(0),
  870. .hw.init = &(struct clk_init_data){
  871. .name = "camcc_core_ahb_clk",
  872. .parent_hws = (const struct clk_hw*[]){
  873. &camcc_slow_ahb_clk_src.clkr.hw
  874. },
  875. .num_parents = 1,
  876. .flags = CLK_SET_RATE_PARENT,
  877. .ops = &clk_branch2_ops,
  878. },
  879. },
  880. };
  881. static struct clk_branch camcc_cpas_ahb_clk = {
  882. .halt_reg = 0x12004,
  883. .halt_check = BRANCH_HALT,
  884. .clkr = {
  885. .enable_reg = 0x12004,
  886. .enable_mask = BIT(0),
  887. .hw.init = &(struct clk_init_data){
  888. .name = "camcc_cpas_ahb_clk",
  889. .parent_hws = (const struct clk_hw*[]){
  890. &camcc_slow_ahb_clk_src.clkr.hw
  891. },
  892. .num_parents = 1,
  893. .flags = CLK_SET_RATE_PARENT,
  894. .ops = &clk_branch2_ops,
  895. },
  896. },
  897. };
  898. static struct clk_branch camcc_csi0phytimer_clk = {
  899. .halt_reg = 0x501c,
  900. .halt_check = BRANCH_HALT,
  901. .clkr = {
  902. .enable_reg = 0x501c,
  903. .enable_mask = BIT(0),
  904. .hw.init = &(struct clk_init_data){
  905. .name = "camcc_csi0phytimer_clk",
  906. .parent_hws = (const struct clk_hw*[]){
  907. &camcc_csi0phytimer_clk_src.clkr.hw
  908. },
  909. .num_parents = 1,
  910. .flags = CLK_SET_RATE_PARENT,
  911. .ops = &clk_branch2_ops,
  912. },
  913. },
  914. };
  915. static struct clk_branch camcc_csi1phytimer_clk = {
  916. .halt_reg = 0x5040,
  917. .halt_check = BRANCH_HALT,
  918. .clkr = {
  919. .enable_reg = 0x5040,
  920. .enable_mask = BIT(0),
  921. .hw.init = &(struct clk_init_data){
  922. .name = "camcc_csi1phytimer_clk",
  923. .parent_hws = (const struct clk_hw*[]){
  924. &camcc_csi1phytimer_clk_src.clkr.hw
  925. },
  926. .num_parents = 1,
  927. .flags = CLK_SET_RATE_PARENT,
  928. .ops = &clk_branch2_ops,
  929. },
  930. },
  931. };
  932. static struct clk_branch camcc_csi2phytimer_clk = {
  933. .halt_reg = 0x5064,
  934. .halt_check = BRANCH_HALT,
  935. .clkr = {
  936. .enable_reg = 0x5064,
  937. .enable_mask = BIT(0),
  938. .hw.init = &(struct clk_init_data){
  939. .name = "camcc_csi2phytimer_clk",
  940. .parent_hws = (const struct clk_hw*[]){
  941. &camcc_csi2phytimer_clk_src.clkr.hw
  942. },
  943. .num_parents = 1,
  944. .flags = CLK_SET_RATE_PARENT,
  945. .ops = &clk_branch2_ops,
  946. },
  947. },
  948. };
  949. static struct clk_branch camcc_csi3phytimer_clk = {
  950. .halt_reg = 0x5088,
  951. .halt_check = BRANCH_HALT,
  952. .clkr = {
  953. .enable_reg = 0x5088,
  954. .enable_mask = BIT(0),
  955. .hw.init = &(struct clk_init_data){
  956. .name = "camcc_csi3phytimer_clk",
  957. .parent_hws = (const struct clk_hw*[]){
  958. &camcc_csi3phytimer_clk_src.clkr.hw
  959. },
  960. .num_parents = 1,
  961. .flags = CLK_SET_RATE_PARENT,
  962. .ops = &clk_branch2_ops,
  963. },
  964. },
  965. };
  966. static struct clk_branch camcc_csiphy0_clk = {
  967. .halt_reg = 0x5020,
  968. .halt_check = BRANCH_HALT,
  969. .clkr = {
  970. .enable_reg = 0x5020,
  971. .enable_mask = BIT(0),
  972. .hw.init = &(struct clk_init_data){
  973. .name = "camcc_csiphy0_clk",
  974. .parent_hws = (const struct clk_hw*[]){
  975. &camcc_cphy_rx_clk_src.clkr.hw
  976. },
  977. .num_parents = 1,
  978. .flags = CLK_SET_RATE_PARENT,
  979. .ops = &clk_branch2_ops,
  980. },
  981. },
  982. };
  983. static struct clk_branch camcc_csiphy1_clk = {
  984. .halt_reg = 0x5044,
  985. .halt_check = BRANCH_HALT,
  986. .clkr = {
  987. .enable_reg = 0x5044,
  988. .enable_mask = BIT(0),
  989. .hw.init = &(struct clk_init_data){
  990. .name = "camcc_csiphy1_clk",
  991. .parent_hws = (const struct clk_hw*[]){
  992. &camcc_cphy_rx_clk_src.clkr.hw
  993. },
  994. .num_parents = 1,
  995. .flags = CLK_SET_RATE_PARENT,
  996. .ops = &clk_branch2_ops,
  997. },
  998. },
  999. };
  1000. static struct clk_branch camcc_csiphy2_clk = {
  1001. .halt_reg = 0x5068,
  1002. .halt_check = BRANCH_HALT,
  1003. .clkr = {
  1004. .enable_reg = 0x5068,
  1005. .enable_mask = BIT(0),
  1006. .hw.init = &(struct clk_init_data){
  1007. .name = "camcc_csiphy2_clk",
  1008. .parent_hws = (const struct clk_hw*[]){
  1009. &camcc_cphy_rx_clk_src.clkr.hw
  1010. },
  1011. .num_parents = 1,
  1012. .flags = CLK_SET_RATE_PARENT,
  1013. .ops = &clk_branch2_ops,
  1014. },
  1015. },
  1016. };
  1017. static struct clk_branch camcc_csiphy3_clk = {
  1018. .halt_reg = 0x508c,
  1019. .halt_check = BRANCH_HALT,
  1020. .clkr = {
  1021. .enable_reg = 0x508c,
  1022. .enable_mask = BIT(0),
  1023. .hw.init = &(struct clk_init_data){
  1024. .name = "camcc_csiphy3_clk",
  1025. .parent_hws = (const struct clk_hw*[]){
  1026. &camcc_cphy_rx_clk_src.clkr.hw
  1027. },
  1028. .num_parents = 1,
  1029. .flags = CLK_SET_RATE_PARENT,
  1030. .ops = &clk_branch2_ops,
  1031. },
  1032. },
  1033. };
  1034. static struct clk_branch camcc_icp_clk = {
  1035. .halt_reg = 0xe02c,
  1036. .halt_check = BRANCH_HALT,
  1037. .clkr = {
  1038. .enable_reg = 0xe02c,
  1039. .enable_mask = BIT(0),
  1040. .hw.init = &(struct clk_init_data){
  1041. .name = "camcc_icp_clk",
  1042. .parent_hws = (const struct clk_hw*[]){
  1043. &camcc_icp_clk_src.clkr.hw
  1044. },
  1045. .num_parents = 1,
  1046. .flags = CLK_SET_RATE_PARENT,
  1047. .ops = &clk_branch2_ops,
  1048. },
  1049. },
  1050. };
  1051. static struct clk_branch camcc_icp_ts_clk = {
  1052. .halt_reg = 0xe00c,
  1053. .halt_check = BRANCH_HALT,
  1054. .clkr = {
  1055. .enable_reg = 0xe00c,
  1056. .enable_mask = BIT(0),
  1057. .hw.init = &(struct clk_init_data){
  1058. .name = "camcc_icp_ts_clk",
  1059. .ops = &clk_branch2_ops,
  1060. },
  1061. },
  1062. };
  1063. static struct clk_branch camcc_ife_0_axi_clk = {
  1064. .halt_reg = 0x9080,
  1065. .halt_check = BRANCH_HALT,
  1066. .clkr = {
  1067. .enable_reg = 0x9080,
  1068. .enable_mask = BIT(0),
  1069. .hw.init = &(struct clk_init_data){
  1070. .name = "camcc_ife_0_axi_clk",
  1071. .ops = &clk_branch2_ops,
  1072. },
  1073. },
  1074. };
  1075. static struct clk_branch camcc_ife_0_clk = {
  1076. .halt_reg = 0x9028,
  1077. .halt_check = BRANCH_HALT,
  1078. .clkr = {
  1079. .enable_reg = 0x9028,
  1080. .enable_mask = BIT(0),
  1081. .hw.init = &(struct clk_init_data){
  1082. .name = "camcc_ife_0_clk",
  1083. .parent_hws = (const struct clk_hw*[]){
  1084. &camcc_ife_0_clk_src.clkr.hw
  1085. },
  1086. .num_parents = 1,
  1087. .flags = CLK_SET_RATE_PARENT,
  1088. .ops = &clk_branch2_ops,
  1089. },
  1090. },
  1091. };
  1092. static struct clk_branch camcc_ife_0_cphy_rx_clk = {
  1093. .halt_reg = 0x907c,
  1094. .halt_check = BRANCH_HALT,
  1095. .clkr = {
  1096. .enable_reg = 0x907c,
  1097. .enable_mask = BIT(0),
  1098. .hw.init = &(struct clk_init_data){
  1099. .name = "camcc_ife_0_cphy_rx_clk",
  1100. .parent_hws = (const struct clk_hw*[]){
  1101. &camcc_cphy_rx_clk_src.clkr.hw
  1102. },
  1103. .num_parents = 1,
  1104. .flags = CLK_SET_RATE_PARENT,
  1105. .ops = &clk_branch2_ops,
  1106. },
  1107. },
  1108. };
  1109. static struct clk_branch camcc_ife_0_csid_clk = {
  1110. .halt_reg = 0x9054,
  1111. .halt_check = BRANCH_HALT,
  1112. .clkr = {
  1113. .enable_reg = 0x9054,
  1114. .enable_mask = BIT(0),
  1115. .hw.init = &(struct clk_init_data){
  1116. .name = "camcc_ife_0_csid_clk",
  1117. .parent_hws = (const struct clk_hw*[]){
  1118. &camcc_ife_0_csid_clk_src.clkr.hw
  1119. },
  1120. .num_parents = 1,
  1121. .flags = CLK_SET_RATE_PARENT,
  1122. .ops = &clk_branch2_ops,
  1123. },
  1124. },
  1125. };
  1126. static struct clk_branch camcc_ife_0_dsp_clk = {
  1127. .halt_reg = 0x9038,
  1128. .halt_check = BRANCH_HALT,
  1129. .clkr = {
  1130. .enable_reg = 0x9038,
  1131. .enable_mask = BIT(0),
  1132. .hw.init = &(struct clk_init_data){
  1133. .name = "camcc_ife_0_dsp_clk",
  1134. .parent_hws = (const struct clk_hw*[]){
  1135. &camcc_ife_0_clk_src.clkr.hw
  1136. },
  1137. .num_parents = 1,
  1138. .flags = CLK_SET_RATE_PARENT,
  1139. .ops = &clk_branch2_ops,
  1140. },
  1141. },
  1142. };
  1143. static struct clk_branch camcc_ife_1_axi_clk = {
  1144. .halt_reg = 0xa058,
  1145. .halt_check = BRANCH_HALT,
  1146. .clkr = {
  1147. .enable_reg = 0xa058,
  1148. .enable_mask = BIT(0),
  1149. .hw.init = &(struct clk_init_data){
  1150. .name = "camcc_ife_1_axi_clk",
  1151. .ops = &clk_branch2_ops,
  1152. },
  1153. },
  1154. };
  1155. static struct clk_branch camcc_ife_1_clk = {
  1156. .halt_reg = 0xa028,
  1157. .halt_check = BRANCH_HALT,
  1158. .clkr = {
  1159. .enable_reg = 0xa028,
  1160. .enable_mask = BIT(0),
  1161. .hw.init = &(struct clk_init_data){
  1162. .name = "camcc_ife_1_clk",
  1163. .parent_hws = (const struct clk_hw*[]){
  1164. &camcc_ife_1_clk_src.clkr.hw
  1165. },
  1166. .num_parents = 1,
  1167. .flags = CLK_SET_RATE_PARENT,
  1168. .ops = &clk_branch2_ops,
  1169. },
  1170. },
  1171. };
  1172. static struct clk_branch camcc_ife_1_cphy_rx_clk = {
  1173. .halt_reg = 0xa054,
  1174. .halt_check = BRANCH_HALT,
  1175. .clkr = {
  1176. .enable_reg = 0xa054,
  1177. .enable_mask = BIT(0),
  1178. .hw.init = &(struct clk_init_data){
  1179. .name = "camcc_ife_1_cphy_rx_clk",
  1180. .parent_hws = (const struct clk_hw*[]){
  1181. &camcc_cphy_rx_clk_src.clkr.hw
  1182. },
  1183. .num_parents = 1,
  1184. .flags = CLK_SET_RATE_PARENT,
  1185. .ops = &clk_branch2_ops,
  1186. },
  1187. },
  1188. };
  1189. static struct clk_branch camcc_ife_1_csid_clk = {
  1190. .halt_reg = 0xa04c,
  1191. .halt_check = BRANCH_HALT,
  1192. .clkr = {
  1193. .enable_reg = 0xa04c,
  1194. .enable_mask = BIT(0),
  1195. .hw.init = &(struct clk_init_data){
  1196. .name = "camcc_ife_1_csid_clk",
  1197. .parent_hws = (const struct clk_hw*[]){
  1198. &camcc_ife_1_csid_clk_src.clkr.hw
  1199. },
  1200. .num_parents = 1,
  1201. .flags = CLK_SET_RATE_PARENT,
  1202. .ops = &clk_branch2_ops,
  1203. },
  1204. },
  1205. };
  1206. static struct clk_branch camcc_ife_1_dsp_clk = {
  1207. .halt_reg = 0xa030,
  1208. .halt_check = BRANCH_HALT,
  1209. .clkr = {
  1210. .enable_reg = 0xa030,
  1211. .enable_mask = BIT(0),
  1212. .hw.init = &(struct clk_init_data){
  1213. .name = "camcc_ife_1_dsp_clk",
  1214. .parent_hws = (const struct clk_hw*[]){
  1215. &camcc_ife_1_clk_src.clkr.hw
  1216. },
  1217. .num_parents = 1,
  1218. .flags = CLK_SET_RATE_PARENT,
  1219. .ops = &clk_branch2_ops,
  1220. },
  1221. },
  1222. };
  1223. static struct clk_branch camcc_ife_2_axi_clk = {
  1224. .halt_reg = 0xb054,
  1225. .halt_check = BRANCH_HALT,
  1226. .clkr = {
  1227. .enable_reg = 0xb054,
  1228. .enable_mask = BIT(0),
  1229. .hw.init = &(struct clk_init_data){
  1230. .name = "camcc_ife_2_axi_clk",
  1231. .ops = &clk_branch2_ops,
  1232. },
  1233. },
  1234. };
  1235. static struct clk_branch camcc_ife_2_clk = {
  1236. .halt_reg = 0xb024,
  1237. .halt_check = BRANCH_HALT,
  1238. .clkr = {
  1239. .enable_reg = 0xb024,
  1240. .enable_mask = BIT(0),
  1241. .hw.init = &(struct clk_init_data){
  1242. .name = "camcc_ife_2_clk",
  1243. .parent_hws = (const struct clk_hw*[]){
  1244. &camcc_ife_2_clk_src.clkr.hw
  1245. },
  1246. .num_parents = 1,
  1247. .flags = CLK_SET_RATE_PARENT,
  1248. .ops = &clk_branch2_ops,
  1249. },
  1250. },
  1251. };
  1252. static struct clk_branch camcc_ife_2_cphy_rx_clk = {
  1253. .halt_reg = 0xb050,
  1254. .halt_check = BRANCH_HALT,
  1255. .clkr = {
  1256. .enable_reg = 0xb050,
  1257. .enable_mask = BIT(0),
  1258. .hw.init = &(struct clk_init_data){
  1259. .name = "camcc_ife_2_cphy_rx_clk",
  1260. .parent_hws = (const struct clk_hw*[]){
  1261. &camcc_cphy_rx_clk_src.clkr.hw
  1262. },
  1263. .num_parents = 1,
  1264. .flags = CLK_SET_RATE_PARENT,
  1265. .ops = &clk_branch2_ops,
  1266. },
  1267. },
  1268. };
  1269. static struct clk_branch camcc_ife_2_csid_clk = {
  1270. .halt_reg = 0xb048,
  1271. .halt_check = BRANCH_HALT,
  1272. .clkr = {
  1273. .enable_reg = 0xb048,
  1274. .enable_mask = BIT(0),
  1275. .hw.init = &(struct clk_init_data){
  1276. .name = "camcc_ife_2_csid_clk",
  1277. .parent_hws = (const struct clk_hw*[]){
  1278. &camcc_ife_2_csid_clk_src.clkr.hw
  1279. },
  1280. .num_parents = 1,
  1281. .flags = CLK_SET_RATE_PARENT,
  1282. .ops = &clk_branch2_ops,
  1283. },
  1284. },
  1285. };
  1286. static struct clk_branch camcc_ife_2_dsp_clk = {
  1287. .halt_reg = 0xb02c,
  1288. .halt_check = BRANCH_HALT,
  1289. .clkr = {
  1290. .enable_reg = 0xb02c,
  1291. .enable_mask = BIT(0),
  1292. .hw.init = &(struct clk_init_data){
  1293. .name = "camcc_ife_2_dsp_clk",
  1294. .parent_hws = (const struct clk_hw*[]){
  1295. &camcc_ife_2_clk_src.clkr.hw
  1296. },
  1297. .num_parents = 1,
  1298. .flags = CLK_SET_RATE_PARENT,
  1299. .ops = &clk_branch2_ops,
  1300. },
  1301. },
  1302. };
  1303. static struct clk_branch camcc_ife_lite_clk = {
  1304. .halt_reg = 0xc01c,
  1305. .halt_check = BRANCH_HALT,
  1306. .clkr = {
  1307. .enable_reg = 0xc01c,
  1308. .enable_mask = BIT(0),
  1309. .hw.init = &(struct clk_init_data){
  1310. .name = "camcc_ife_lite_clk",
  1311. .parent_hws = (const struct clk_hw*[]){
  1312. &camcc_ife_lite_clk_src.clkr.hw
  1313. },
  1314. .num_parents = 1,
  1315. .flags = CLK_SET_RATE_PARENT,
  1316. .ops = &clk_branch2_ops,
  1317. },
  1318. },
  1319. };
  1320. static struct clk_branch camcc_ife_lite_cphy_rx_clk = {
  1321. .halt_reg = 0xc044,
  1322. .halt_check = BRANCH_HALT,
  1323. .clkr = {
  1324. .enable_reg = 0xc044,
  1325. .enable_mask = BIT(0),
  1326. .hw.init = &(struct clk_init_data){
  1327. .name = "camcc_ife_lite_cphy_rx_clk",
  1328. .parent_hws = (const struct clk_hw*[]){
  1329. &camcc_cphy_rx_clk_src.clkr.hw
  1330. },
  1331. .num_parents = 1,
  1332. .flags = CLK_SET_RATE_PARENT,
  1333. .ops = &clk_branch2_ops,
  1334. },
  1335. },
  1336. };
  1337. static struct clk_branch camcc_ife_lite_csid_clk = {
  1338. .halt_reg = 0xc03c,
  1339. .halt_check = BRANCH_HALT,
  1340. .clkr = {
  1341. .enable_reg = 0xc03c,
  1342. .enable_mask = BIT(0),
  1343. .hw.init = &(struct clk_init_data){
  1344. .name = "camcc_ife_lite_csid_clk",
  1345. .parent_hws = (const struct clk_hw*[]){
  1346. &camcc_ife_lite_csid_clk_src.clkr.hw
  1347. },
  1348. .num_parents = 1,
  1349. .flags = CLK_SET_RATE_PARENT,
  1350. .ops = &clk_branch2_ops,
  1351. },
  1352. },
  1353. };
  1354. static struct clk_branch camcc_ipe_0_ahb_clk = {
  1355. .halt_reg = 0x7040,
  1356. .halt_check = BRANCH_HALT,
  1357. .clkr = {
  1358. .enable_reg = 0x7040,
  1359. .enable_mask = BIT(0),
  1360. .hw.init = &(struct clk_init_data){
  1361. .name = "camcc_ipe_0_ahb_clk",
  1362. .parent_hws = (const struct clk_hw*[]){
  1363. &camcc_slow_ahb_clk_src.clkr.hw
  1364. },
  1365. .num_parents = 1,
  1366. .flags = CLK_SET_RATE_PARENT,
  1367. .ops = &clk_branch2_ops,
  1368. },
  1369. },
  1370. };
  1371. static struct clk_branch camcc_ipe_0_areg_clk = {
  1372. .halt_reg = 0x703c,
  1373. .halt_check = BRANCH_HALT,
  1374. .clkr = {
  1375. .enable_reg = 0x703c,
  1376. .enable_mask = BIT(0),
  1377. .hw.init = &(struct clk_init_data){
  1378. .name = "camcc_ipe_0_areg_clk",
  1379. .parent_hws = (const struct clk_hw*[]){
  1380. &camcc_fast_ahb_clk_src.clkr.hw
  1381. },
  1382. .num_parents = 1,
  1383. .flags = CLK_SET_RATE_PARENT,
  1384. .ops = &clk_branch2_ops,
  1385. },
  1386. },
  1387. };
  1388. static struct clk_branch camcc_ipe_0_axi_clk = {
  1389. .halt_reg = 0x7038,
  1390. .halt_check = BRANCH_HALT,
  1391. .clkr = {
  1392. .enable_reg = 0x7038,
  1393. .enable_mask = BIT(0),
  1394. .hw.init = &(struct clk_init_data){
  1395. .name = "camcc_ipe_0_axi_clk",
  1396. .ops = &clk_branch2_ops,
  1397. },
  1398. },
  1399. };
  1400. static struct clk_branch camcc_ipe_0_clk = {
  1401. .halt_reg = 0x7028,
  1402. .halt_check = BRANCH_HALT,
  1403. .clkr = {
  1404. .enable_reg = 0x7028,
  1405. .enable_mask = BIT(0),
  1406. .hw.init = &(struct clk_init_data){
  1407. .name = "camcc_ipe_0_clk",
  1408. .parent_hws = (const struct clk_hw*[]){
  1409. &camcc_ipe_0_clk_src.clkr.hw
  1410. },
  1411. .num_parents = 1,
  1412. .flags = CLK_SET_RATE_PARENT,
  1413. .ops = &clk_branch2_ops,
  1414. },
  1415. },
  1416. };
  1417. static struct clk_branch camcc_jpeg_clk = {
  1418. .halt_reg = 0xd01c,
  1419. .halt_check = BRANCH_HALT,
  1420. .clkr = {
  1421. .enable_reg = 0xd01c,
  1422. .enable_mask = BIT(0),
  1423. .hw.init = &(struct clk_init_data){
  1424. .name = "camcc_jpeg_clk",
  1425. .parent_hws = (const struct clk_hw*[]){
  1426. &camcc_jpeg_clk_src.clkr.hw
  1427. },
  1428. .num_parents = 1,
  1429. .flags = CLK_SET_RATE_PARENT,
  1430. .ops = &clk_branch2_ops,
  1431. },
  1432. },
  1433. };
  1434. static struct clk_branch camcc_lrme_clk = {
  1435. .halt_reg = 0x1101c,
  1436. .halt_check = BRANCH_HALT,
  1437. .clkr = {
  1438. .enable_reg = 0x1101c,
  1439. .enable_mask = BIT(0),
  1440. .hw.init = &(struct clk_init_data){
  1441. .name = "camcc_lrme_clk",
  1442. .parent_hws = (const struct clk_hw*[]){
  1443. &camcc_lrme_clk_src.clkr.hw
  1444. },
  1445. .num_parents = 1,
  1446. .flags = CLK_SET_RATE_PARENT,
  1447. .ops = &clk_branch2_ops,
  1448. },
  1449. },
  1450. };
  1451. static struct clk_branch camcc_mclk0_clk = {
  1452. .halt_reg = 0x401c,
  1453. .halt_check = BRANCH_HALT,
  1454. .clkr = {
  1455. .enable_reg = 0x401c,
  1456. .enable_mask = BIT(0),
  1457. .hw.init = &(struct clk_init_data){
  1458. .name = "camcc_mclk0_clk",
  1459. .parent_hws = (const struct clk_hw*[]){
  1460. &camcc_mclk0_clk_src.clkr.hw
  1461. },
  1462. .num_parents = 1,
  1463. .flags = CLK_SET_RATE_PARENT,
  1464. .ops = &clk_branch2_ops,
  1465. },
  1466. },
  1467. };
  1468. static struct clk_branch camcc_mclk1_clk = {
  1469. .halt_reg = 0x403c,
  1470. .halt_check = BRANCH_HALT,
  1471. .clkr = {
  1472. .enable_reg = 0x403c,
  1473. .enable_mask = BIT(0),
  1474. .hw.init = &(struct clk_init_data){
  1475. .name = "camcc_mclk1_clk",
  1476. .parent_hws = (const struct clk_hw*[]){
  1477. &camcc_mclk1_clk_src.clkr.hw
  1478. },
  1479. .num_parents = 1,
  1480. .flags = CLK_SET_RATE_PARENT,
  1481. .ops = &clk_branch2_ops,
  1482. },
  1483. },
  1484. };
  1485. static struct clk_branch camcc_mclk2_clk = {
  1486. .halt_reg = 0x405c,
  1487. .halt_check = BRANCH_HALT,
  1488. .clkr = {
  1489. .enable_reg = 0x405c,
  1490. .enable_mask = BIT(0),
  1491. .hw.init = &(struct clk_init_data){
  1492. .name = "camcc_mclk2_clk",
  1493. .parent_hws = (const struct clk_hw*[]){
  1494. &camcc_mclk2_clk_src.clkr.hw
  1495. },
  1496. .num_parents = 1,
  1497. .flags = CLK_SET_RATE_PARENT,
  1498. .ops = &clk_branch2_ops,
  1499. },
  1500. },
  1501. };
  1502. static struct clk_branch camcc_mclk3_clk = {
  1503. .halt_reg = 0x407c,
  1504. .halt_check = BRANCH_HALT,
  1505. .clkr = {
  1506. .enable_reg = 0x407c,
  1507. .enable_mask = BIT(0),
  1508. .hw.init = &(struct clk_init_data){
  1509. .name = "camcc_mclk3_clk",
  1510. .parent_hws = (const struct clk_hw*[]){
  1511. &camcc_mclk3_clk_src.clkr.hw
  1512. },
  1513. .num_parents = 1,
  1514. .flags = CLK_SET_RATE_PARENT,
  1515. .ops = &clk_branch2_ops,
  1516. },
  1517. },
  1518. };
  1519. static struct clk_branch camcc_mclk4_clk = {
  1520. .halt_reg = 0x409c,
  1521. .halt_check = BRANCH_HALT,
  1522. .clkr = {
  1523. .enable_reg = 0x409c,
  1524. .enable_mask = BIT(0),
  1525. .hw.init = &(struct clk_init_data){
  1526. .name = "camcc_mclk4_clk",
  1527. .parent_hws = (const struct clk_hw*[]){
  1528. &camcc_mclk4_clk_src.clkr.hw
  1529. },
  1530. .num_parents = 1,
  1531. .flags = CLK_SET_RATE_PARENT,
  1532. .ops = &clk_branch2_ops,
  1533. },
  1534. },
  1535. };
  1536. static struct clk_branch camcc_soc_ahb_clk = {
  1537. .halt_reg = 0x1400c,
  1538. .halt_check = BRANCH_HALT,
  1539. .clkr = {
  1540. .enable_reg = 0x1400c,
  1541. .enable_mask = BIT(0),
  1542. .hw.init = &(struct clk_init_data){
  1543. .name = "camcc_soc_ahb_clk",
  1544. .ops = &clk_branch2_ops,
  1545. },
  1546. },
  1547. };
  1548. static struct clk_branch camcc_sys_tmr_clk = {
  1549. .halt_reg = 0xe034,
  1550. .halt_check = BRANCH_HALT,
  1551. .clkr = {
  1552. .enable_reg = 0xe034,
  1553. .enable_mask = BIT(0),
  1554. .hw.init = &(struct clk_init_data){
  1555. .name = "camcc_sys_tmr_clk",
  1556. .ops = &clk_branch2_ops,
  1557. },
  1558. },
  1559. };
  1560. static struct gdsc titan_top_gdsc;
  1561. static struct gdsc bps_gdsc = {
  1562. .gdscr = 0x6004,
  1563. .en_rest_wait_val = 0x2,
  1564. .en_few_wait_val = 0x2,
  1565. .clk_dis_wait_val = 0xf,
  1566. .pd = {
  1567. .name = "bps_gdsc",
  1568. },
  1569. .pwrsts = PWRSTS_OFF_ON,
  1570. .parent = &titan_top_gdsc.pd,
  1571. .flags = VOTABLE,
  1572. };
  1573. static struct gdsc ipe_0_gdsc = {
  1574. .gdscr = 0x7004,
  1575. .en_rest_wait_val = 0x2,
  1576. .en_few_wait_val = 0x2,
  1577. .clk_dis_wait_val = 0xf,
  1578. .pd = {
  1579. .name = "ipe_0_gdsc",
  1580. },
  1581. .pwrsts = PWRSTS_OFF_ON,
  1582. .parent = &titan_top_gdsc.pd,
  1583. .flags = VOTABLE,
  1584. };
  1585. static struct gdsc ife_0_gdsc = {
  1586. .gdscr = 0x9004,
  1587. .en_rest_wait_val = 0x2,
  1588. .en_few_wait_val = 0x2,
  1589. .clk_dis_wait_val = 0xf,
  1590. .pd = {
  1591. .name = "ife_0_gdsc",
  1592. },
  1593. .pwrsts = PWRSTS_OFF_ON,
  1594. .parent = &titan_top_gdsc.pd,
  1595. };
  1596. static struct gdsc ife_1_gdsc = {
  1597. .gdscr = 0xa004,
  1598. .en_rest_wait_val = 0x2,
  1599. .en_few_wait_val = 0x2,
  1600. .clk_dis_wait_val = 0xf,
  1601. .pd = {
  1602. .name = "ife_1_gdsc",
  1603. },
  1604. .pwrsts = PWRSTS_OFF_ON,
  1605. .parent = &titan_top_gdsc.pd,
  1606. };
  1607. static struct gdsc ife_2_gdsc = {
  1608. .gdscr = 0xb004,
  1609. .en_rest_wait_val = 0x2,
  1610. .en_few_wait_val = 0x2,
  1611. .clk_dis_wait_val = 0xf,
  1612. .pd = {
  1613. .name = "ife_2_gdsc",
  1614. },
  1615. .pwrsts = PWRSTS_OFF_ON,
  1616. .parent = &titan_top_gdsc.pd,
  1617. };
  1618. static struct gdsc titan_top_gdsc = {
  1619. .gdscr = 0x14004,
  1620. .en_rest_wait_val = 0x2,
  1621. .en_few_wait_val = 0x2,
  1622. .clk_dis_wait_val = 0xf,
  1623. .pd = {
  1624. .name = "titan_top_gdsc",
  1625. },
  1626. .pwrsts = PWRSTS_OFF_ON,
  1627. };
  1628. static struct clk_hw *camcc_sm6350_hws[] = {
  1629. [CAMCC_PLL2_OUT_EARLY] = &camcc_pll2_out_early.hw,
  1630. };
  1631. static struct clk_regmap *camcc_sm6350_clocks[] = {
  1632. [CAMCC_BPS_AHB_CLK] = &camcc_bps_ahb_clk.clkr,
  1633. [CAMCC_BPS_AREG_CLK] = &camcc_bps_areg_clk.clkr,
  1634. [CAMCC_BPS_AXI_CLK] = &camcc_bps_axi_clk.clkr,
  1635. [CAMCC_BPS_CLK] = &camcc_bps_clk.clkr,
  1636. [CAMCC_BPS_CLK_SRC] = &camcc_bps_clk_src.clkr,
  1637. [CAMCC_CAMNOC_AXI_CLK] = &camcc_camnoc_axi_clk.clkr,
  1638. [CAMCC_CCI_0_CLK] = &camcc_cci_0_clk.clkr,
  1639. [CAMCC_CCI_0_CLK_SRC] = &camcc_cci_0_clk_src.clkr,
  1640. [CAMCC_CCI_1_CLK] = &camcc_cci_1_clk.clkr,
  1641. [CAMCC_CCI_1_CLK_SRC] = &camcc_cci_1_clk_src.clkr,
  1642. [CAMCC_CORE_AHB_CLK] = &camcc_core_ahb_clk.clkr,
  1643. [CAMCC_CPAS_AHB_CLK] = &camcc_cpas_ahb_clk.clkr,
  1644. [CAMCC_CPHY_RX_CLK_SRC] = &camcc_cphy_rx_clk_src.clkr,
  1645. [CAMCC_CSI0PHYTIMER_CLK] = &camcc_csi0phytimer_clk.clkr,
  1646. [CAMCC_CSI0PHYTIMER_CLK_SRC] = &camcc_csi0phytimer_clk_src.clkr,
  1647. [CAMCC_CSI1PHYTIMER_CLK] = &camcc_csi1phytimer_clk.clkr,
  1648. [CAMCC_CSI1PHYTIMER_CLK_SRC] = &camcc_csi1phytimer_clk_src.clkr,
  1649. [CAMCC_CSI2PHYTIMER_CLK] = &camcc_csi2phytimer_clk.clkr,
  1650. [CAMCC_CSI2PHYTIMER_CLK_SRC] = &camcc_csi2phytimer_clk_src.clkr,
  1651. [CAMCC_CSI3PHYTIMER_CLK] = &camcc_csi3phytimer_clk.clkr,
  1652. [CAMCC_CSI3PHYTIMER_CLK_SRC] = &camcc_csi3phytimer_clk_src.clkr,
  1653. [CAMCC_CSIPHY0_CLK] = &camcc_csiphy0_clk.clkr,
  1654. [CAMCC_CSIPHY1_CLK] = &camcc_csiphy1_clk.clkr,
  1655. [CAMCC_CSIPHY2_CLK] = &camcc_csiphy2_clk.clkr,
  1656. [CAMCC_CSIPHY3_CLK] = &camcc_csiphy3_clk.clkr,
  1657. [CAMCC_FAST_AHB_CLK_SRC] = &camcc_fast_ahb_clk_src.clkr,
  1658. [CAMCC_ICP_CLK] = &camcc_icp_clk.clkr,
  1659. [CAMCC_ICP_CLK_SRC] = &camcc_icp_clk_src.clkr,
  1660. [CAMCC_ICP_TS_CLK] = &camcc_icp_ts_clk.clkr,
  1661. [CAMCC_IFE_0_AXI_CLK] = &camcc_ife_0_axi_clk.clkr,
  1662. [CAMCC_IFE_0_CLK] = &camcc_ife_0_clk.clkr,
  1663. [CAMCC_IFE_0_CLK_SRC] = &camcc_ife_0_clk_src.clkr,
  1664. [CAMCC_IFE_0_CPHY_RX_CLK] = &camcc_ife_0_cphy_rx_clk.clkr,
  1665. [CAMCC_IFE_0_CSID_CLK] = &camcc_ife_0_csid_clk.clkr,
  1666. [CAMCC_IFE_0_CSID_CLK_SRC] = &camcc_ife_0_csid_clk_src.clkr,
  1667. [CAMCC_IFE_0_DSP_CLK] = &camcc_ife_0_dsp_clk.clkr,
  1668. [CAMCC_IFE_1_AXI_CLK] = &camcc_ife_1_axi_clk.clkr,
  1669. [CAMCC_IFE_1_CLK] = &camcc_ife_1_clk.clkr,
  1670. [CAMCC_IFE_1_CLK_SRC] = &camcc_ife_1_clk_src.clkr,
  1671. [CAMCC_IFE_1_CPHY_RX_CLK] = &camcc_ife_1_cphy_rx_clk.clkr,
  1672. [CAMCC_IFE_1_CSID_CLK] = &camcc_ife_1_csid_clk.clkr,
  1673. [CAMCC_IFE_1_CSID_CLK_SRC] = &camcc_ife_1_csid_clk_src.clkr,
  1674. [CAMCC_IFE_1_DSP_CLK] = &camcc_ife_1_dsp_clk.clkr,
  1675. [CAMCC_IFE_2_AXI_CLK] = &camcc_ife_2_axi_clk.clkr,
  1676. [CAMCC_IFE_2_CLK] = &camcc_ife_2_clk.clkr,
  1677. [CAMCC_IFE_2_CLK_SRC] = &camcc_ife_2_clk_src.clkr,
  1678. [CAMCC_IFE_2_CPHY_RX_CLK] = &camcc_ife_2_cphy_rx_clk.clkr,
  1679. [CAMCC_IFE_2_CSID_CLK] = &camcc_ife_2_csid_clk.clkr,
  1680. [CAMCC_IFE_2_CSID_CLK_SRC] = &camcc_ife_2_csid_clk_src.clkr,
  1681. [CAMCC_IFE_2_DSP_CLK] = &camcc_ife_2_dsp_clk.clkr,
  1682. [CAMCC_IFE_LITE_CLK] = &camcc_ife_lite_clk.clkr,
  1683. [CAMCC_IFE_LITE_CLK_SRC] = &camcc_ife_lite_clk_src.clkr,
  1684. [CAMCC_IFE_LITE_CPHY_RX_CLK] = &camcc_ife_lite_cphy_rx_clk.clkr,
  1685. [CAMCC_IFE_LITE_CSID_CLK] = &camcc_ife_lite_csid_clk.clkr,
  1686. [CAMCC_IFE_LITE_CSID_CLK_SRC] = &camcc_ife_lite_csid_clk_src.clkr,
  1687. [CAMCC_IPE_0_AHB_CLK] = &camcc_ipe_0_ahb_clk.clkr,
  1688. [CAMCC_IPE_0_AREG_CLK] = &camcc_ipe_0_areg_clk.clkr,
  1689. [CAMCC_IPE_0_AXI_CLK] = &camcc_ipe_0_axi_clk.clkr,
  1690. [CAMCC_IPE_0_CLK] = &camcc_ipe_0_clk.clkr,
  1691. [CAMCC_IPE_0_CLK_SRC] = &camcc_ipe_0_clk_src.clkr,
  1692. [CAMCC_JPEG_CLK] = &camcc_jpeg_clk.clkr,
  1693. [CAMCC_JPEG_CLK_SRC] = &camcc_jpeg_clk_src.clkr,
  1694. [CAMCC_LRME_CLK] = &camcc_lrme_clk.clkr,
  1695. [CAMCC_LRME_CLK_SRC] = &camcc_lrme_clk_src.clkr,
  1696. [CAMCC_MCLK0_CLK] = &camcc_mclk0_clk.clkr,
  1697. [CAMCC_MCLK0_CLK_SRC] = &camcc_mclk0_clk_src.clkr,
  1698. [CAMCC_MCLK1_CLK] = &camcc_mclk1_clk.clkr,
  1699. [CAMCC_MCLK1_CLK_SRC] = &camcc_mclk1_clk_src.clkr,
  1700. [CAMCC_MCLK2_CLK] = &camcc_mclk2_clk.clkr,
  1701. [CAMCC_MCLK2_CLK_SRC] = &camcc_mclk2_clk_src.clkr,
  1702. [CAMCC_MCLK3_CLK] = &camcc_mclk3_clk.clkr,
  1703. [CAMCC_MCLK3_CLK_SRC] = &camcc_mclk3_clk_src.clkr,
  1704. [CAMCC_MCLK4_CLK] = &camcc_mclk4_clk.clkr,
  1705. [CAMCC_MCLK4_CLK_SRC] = &camcc_mclk4_clk_src.clkr,
  1706. [CAMCC_PLL0] = &camcc_pll0.clkr,
  1707. [CAMCC_PLL0_OUT_EVEN] = &camcc_pll0_out_even.clkr,
  1708. [CAMCC_PLL1] = &camcc_pll1.clkr,
  1709. [CAMCC_PLL1_OUT_EVEN] = &camcc_pll1_out_even.clkr,
  1710. [CAMCC_PLL2] = &camcc_pll2.clkr,
  1711. [CAMCC_PLL2_OUT_MAIN] = &camcc_pll2_out_main.clkr,
  1712. [CAMCC_PLL3] = &camcc_pll3.clkr,
  1713. [CAMCC_SLOW_AHB_CLK_SRC] = &camcc_slow_ahb_clk_src.clkr,
  1714. [CAMCC_SOC_AHB_CLK] = &camcc_soc_ahb_clk.clkr,
  1715. [CAMCC_SYS_TMR_CLK] = &camcc_sys_tmr_clk.clkr,
  1716. };
  1717. static struct gdsc *camcc_sm6350_gdscs[] = {
  1718. [BPS_GDSC] = &bps_gdsc,
  1719. [IPE_0_GDSC] = &ipe_0_gdsc,
  1720. [IFE_0_GDSC] = &ife_0_gdsc,
  1721. [IFE_1_GDSC] = &ife_1_gdsc,
  1722. [IFE_2_GDSC] = &ife_2_gdsc,
  1723. [TITAN_TOP_GDSC] = &titan_top_gdsc,
  1724. };
  1725. static const struct regmap_config camcc_sm6350_regmap_config = {
  1726. .reg_bits = 32,
  1727. .reg_stride = 4,
  1728. .val_bits = 32,
  1729. .max_register = 0x16000,
  1730. .fast_io = true,
  1731. };
  1732. static const struct qcom_cc_desc camcc_sm6350_desc = {
  1733. .config = &camcc_sm6350_regmap_config,
  1734. .clk_hws = camcc_sm6350_hws,
  1735. .num_clk_hws = ARRAY_SIZE(camcc_sm6350_hws),
  1736. .clks = camcc_sm6350_clocks,
  1737. .num_clks = ARRAY_SIZE(camcc_sm6350_clocks),
  1738. .gdscs = camcc_sm6350_gdscs,
  1739. .num_gdscs = ARRAY_SIZE(camcc_sm6350_gdscs),
  1740. };
  1741. static const struct of_device_id camcc_sm6350_match_table[] = {
  1742. { .compatible = "qcom,sm6350-camcc" },
  1743. { }
  1744. };
  1745. MODULE_DEVICE_TABLE(of, camcc_sm6350_match_table);
  1746. static int camcc_sm6350_probe(struct platform_device *pdev)
  1747. {
  1748. struct regmap *regmap;
  1749. regmap = qcom_cc_map(pdev, &camcc_sm6350_desc);
  1750. if (IS_ERR(regmap))
  1751. return PTR_ERR(regmap);
  1752. clk_fabia_pll_configure(&camcc_pll0, regmap, &camcc_pll0_config);
  1753. clk_fabia_pll_configure(&camcc_pll1, regmap, &camcc_pll1_config);
  1754. clk_agera_pll_configure(&camcc_pll2, regmap, &camcc_pll2_config);
  1755. clk_fabia_pll_configure(&camcc_pll3, regmap, &camcc_pll3_config);
  1756. return qcom_cc_really_probe(&pdev->dev, &camcc_sm6350_desc, regmap);
  1757. }
  1758. static struct platform_driver camcc_sm6350_driver = {
  1759. .probe = camcc_sm6350_probe,
  1760. .driver = {
  1761. .name = "sm6350-camcc",
  1762. .of_match_table = camcc_sm6350_match_table,
  1763. },
  1764. };
  1765. module_platform_driver(camcc_sm6350_driver);
  1766. MODULE_DESCRIPTION("QTI CAMCC SM6350 Driver");
  1767. MODULE_LICENSE("GPL");