mmcc-sdm660.c 73 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411141214131414141514161417141814191420142114221423142414251426142714281429143014311432143314341435143614371438143914401441144214431444144514461447144814491450145114521453145414551456145714581459146014611462146314641465146614671468146914701471147214731474147514761477147814791480148114821483148414851486148714881489149014911492149314941495149614971498149915001501150215031504150515061507150815091510151115121513151415151516151715181519152015211522152315241525152615271528152915301531153215331534153515361537153815391540154115421543154415451546154715481549155015511552155315541555155615571558155915601561156215631564156515661567156815691570157115721573157415751576157715781579158015811582158315841585158615871588158915901591159215931594159515961597159815991600160116021603160416051606160716081609161016111612161316141615161616171618161916201621162216231624162516261627162816291630163116321633163416351636163716381639164016411642164316441645164616471648164916501651165216531654165516561657165816591660166116621663166416651666166716681669167016711672167316741675167616771678167916801681168216831684168516861687168816891690169116921693169416951696169716981699170017011702170317041705170617071708170917101711171217131714171517161717171817191720172117221723172417251726172717281729173017311732173317341735173617371738173917401741174217431744174517461747174817491750175117521753175417551756175717581759176017611762176317641765176617671768176917701771177217731774177517761777177817791780178117821783178417851786178717881789179017911792179317941795179617971798179918001801180218031804180518061807180818091810181118121813181418151816181718181819182018211822182318241825182618271828182918301831183218331834183518361837183818391840184118421843184418451846184718481849185018511852185318541855185618571858185918601861186218631864186518661867186818691870187118721873187418751876187718781879188018811882188318841885188618871888188918901891189218931894189518961897189818991900190119021903190419051906190719081909191019111912191319141915191619171918191919201921192219231924192519261927192819291930193119321933193419351936193719381939194019411942194319441945194619471948194919501951195219531954195519561957195819591960196119621963196419651966196719681969197019711972197319741975197619771978197919801981198219831984198519861987198819891990199119921993199419951996199719981999200020012002200320042005200620072008200920102011201220132014201520162017201820192020202120222023202420252026202720282029203020312032203320342035203620372038203920402041204220432044204520462047204820492050205120522053205420552056205720582059206020612062206320642065206620672068206920702071207220732074207520762077207820792080208120822083208420852086208720882089209020912092209320942095209620972098209921002101210221032104210521062107210821092110211121122113211421152116211721182119212021212122212321242125212621272128212921302131213221332134213521362137213821392140214121422143214421452146214721482149215021512152215321542155215621572158215921602161216221632164216521662167216821692170217121722173217421752176217721782179218021812182218321842185218621872188218921902191219221932194219521962197219821992200220122022203220422052206220722082209221022112212221322142215221622172218221922202221222222232224222522262227222822292230223122322233223422352236223722382239224022412242224322442245224622472248224922502251225222532254225522562257225822592260226122622263226422652266226722682269227022712272227322742275227622772278227922802281228222832284228522862287228822892290229122922293229422952296229722982299230023012302230323042305230623072308230923102311231223132314231523162317231823192320232123222323232423252326232723282329233023312332233323342335233623372338233923402341234223432344234523462347234823492350235123522353235423552356235723582359236023612362236323642365236623672368236923702371237223732374237523762377237823792380238123822383238423852386238723882389239023912392239323942395239623972398239924002401240224032404240524062407240824092410241124122413241424152416241724182419242024212422242324242425242624272428242924302431243224332434243524362437243824392440244124422443244424452446244724482449245024512452245324542455245624572458245924602461246224632464246524662467246824692470247124722473247424752476247724782479248024812482248324842485248624872488248924902491249224932494249524962497249824992500250125022503250425052506250725082509251025112512251325142515251625172518251925202521252225232524252525262527252825292530253125322533253425352536253725382539254025412542254325442545254625472548254925502551255225532554255525562557255825592560256125622563256425652566256725682569257025712572257325742575257625772578257925802581258225832584258525862587258825892590259125922593259425952596259725982599260026012602260326042605260626072608260926102611261226132614261526162617261826192620262126222623262426252626262726282629263026312632263326342635263626372638263926402641264226432644264526462647264826492650265126522653265426552656265726582659266026612662266326642665266626672668266926702671267226732674267526762677267826792680268126822683268426852686268726882689269026912692269326942695269626972698269927002701270227032704270527062707270827092710271127122713271427152716271727182719272027212722272327242725272627272728272927302731273227332734273527362737273827392740274127422743274427452746274727482749275027512752275327542755275627572758275927602761276227632764276527662767276827692770277127722773277427752776277727782779278027812782278327842785278627872788278927902791279227932794279527962797279827992800280128022803280428052806280728082809281028112812281328142815281628172818281928202821282228232824282528262827282828292830283128322833283428352836283728382839284028412842284328442845284628472848284928502851285228532854285528562857285828592860
  1. // SPDX-License-Identifier: GPL-2.0-only
  2. /*
  3. * Copyright (c) 2020, The Linux Foundation. All rights reserved.
  4. * Copyright (c) 2020, Martin Botka <martin.botka@somainline.org>
  5. * Copyright (c) 2020, Konrad Dybcio <konrad.dybcio@somainline.org>
  6. */
  7. #include <linux/kernel.h>
  8. #include <linux/bitops.h>
  9. #include <linux/err.h>
  10. #include <linux/platform_device.h>
  11. #include <linux/mod_devicetable.h>
  12. #include <linux/module.h>
  13. #include <linux/clk-provider.h>
  14. #include <linux/regmap.h>
  15. #include <dt-bindings/clock/qcom,mmcc-sdm660.h>
  16. #include "common.h"
  17. #include "clk-regmap.h"
  18. #include "clk-regmap-divider.h"
  19. #include "clk-alpha-pll.h"
  20. #include "clk-rcg.h"
  21. #include "clk-branch.h"
  22. #include "reset.h"
  23. #include "gdsc.h"
  24. enum {
  25. P_XO,
  26. P_DSI0PLL_BYTE,
  27. P_DSI0PLL,
  28. P_DSI1PLL_BYTE,
  29. P_DSI1PLL,
  30. P_GPLL0,
  31. P_GPLL0_DIV,
  32. P_MMPLL0,
  33. P_MMPLL10,
  34. P_MMPLL3,
  35. P_MMPLL4,
  36. P_MMPLL5,
  37. P_MMPLL6,
  38. P_MMPLL7,
  39. P_MMPLL8,
  40. P_SLEEP_CLK,
  41. P_DP_PHY_PLL_LINK_CLK,
  42. P_DP_PHY_PLL_VCO_DIV,
  43. };
  44. static const struct parent_map mmcc_xo_mmpll0_mmpll4_mmpll7_mmpll8_gpll0_gpll0_div_map[] = {
  45. { P_XO, 0 },
  46. { P_MMPLL0, 1 },
  47. { P_MMPLL4, 2 },
  48. { P_MMPLL7, 3 },
  49. { P_MMPLL8, 4 },
  50. { P_GPLL0, 5 },
  51. { P_GPLL0_DIV, 6 },
  52. };
  53. /* Voteable PLL */
  54. static struct clk_alpha_pll mmpll0 = {
  55. .offset = 0xc000,
  56. .regs = clk_alpha_pll_regs[CLK_ALPHA_PLL_TYPE_DEFAULT],
  57. .clkr = {
  58. .enable_reg = 0x1f0,
  59. .enable_mask = BIT(0),
  60. .hw.init = &(struct clk_init_data){
  61. .name = "mmpll0",
  62. .parent_data = &(const struct clk_parent_data){
  63. .fw_name = "xo",
  64. },
  65. .num_parents = 1,
  66. .ops = &clk_alpha_pll_ops,
  67. },
  68. },
  69. };
  70. static struct clk_alpha_pll mmpll6 = {
  71. .offset = 0xf0,
  72. .regs = clk_alpha_pll_regs[CLK_ALPHA_PLL_TYPE_DEFAULT],
  73. .clkr = {
  74. .enable_reg = 0x1f0,
  75. .enable_mask = BIT(2),
  76. .hw.init = &(struct clk_init_data){
  77. .name = "mmpll6",
  78. .parent_data = &(const struct clk_parent_data){
  79. .fw_name = "xo",
  80. },
  81. .num_parents = 1,
  82. .ops = &clk_alpha_pll_ops,
  83. },
  84. },
  85. };
  86. /* APSS controlled PLLs */
  87. static const struct pll_vco vco[] = {
  88. { 1000000000, 2000000000, 0 },
  89. { 750000000, 1500000000, 1 },
  90. { 500000000, 1000000000, 2 },
  91. { 250000000, 500000000, 3 },
  92. };
  93. static const struct pll_vco mmpll3_vco[] = {
  94. { 750000000, 1500000000, 1 },
  95. };
  96. static const struct alpha_pll_config mmpll10_config = {
  97. .l = 0x1e,
  98. .config_ctl_val = 0x00004289,
  99. .main_output_mask = 0x1,
  100. };
  101. static struct clk_alpha_pll mmpll10 = {
  102. .offset = 0x190,
  103. .regs = clk_alpha_pll_regs[CLK_ALPHA_PLL_TYPE_DEFAULT],
  104. .clkr = {
  105. .hw.init = &(struct clk_init_data){
  106. .name = "mmpll10",
  107. .parent_data = &(const struct clk_parent_data){
  108. .fw_name = "xo",
  109. },
  110. .num_parents = 1,
  111. .ops = &clk_alpha_pll_ops,
  112. },
  113. },
  114. };
  115. static const struct alpha_pll_config mmpll3_config = {
  116. .l = 0x2e,
  117. .config_ctl_val = 0x4001055b,
  118. .vco_val = 0x1 << 20,
  119. .vco_mask = 0x3 << 20,
  120. .main_output_mask = 0x1,
  121. };
  122. static struct clk_alpha_pll mmpll3 = {
  123. .offset = 0x0,
  124. .regs = clk_alpha_pll_regs[CLK_ALPHA_PLL_TYPE_DEFAULT],
  125. .vco_table = mmpll3_vco,
  126. .num_vco = ARRAY_SIZE(mmpll3_vco),
  127. .clkr = {
  128. .hw.init = &(struct clk_init_data){
  129. .name = "mmpll3",
  130. .parent_data = &(const struct clk_parent_data){
  131. .fw_name = "xo",
  132. },
  133. .num_parents = 1,
  134. .ops = &clk_alpha_pll_ops,
  135. },
  136. },
  137. };
  138. static const struct alpha_pll_config mmpll4_config = {
  139. .l = 0x28,
  140. .config_ctl_val = 0x4001055b,
  141. .vco_val = 0x2 << 20,
  142. .vco_mask = 0x3 << 20,
  143. .main_output_mask = 0x1,
  144. };
  145. static struct clk_alpha_pll mmpll4 = {
  146. .offset = 0x50,
  147. .regs = clk_alpha_pll_regs[CLK_ALPHA_PLL_TYPE_DEFAULT],
  148. .vco_table = vco,
  149. .num_vco = ARRAY_SIZE(vco),
  150. .clkr = {
  151. .hw.init = &(struct clk_init_data){
  152. .name = "mmpll4",
  153. .parent_data = &(const struct clk_parent_data){
  154. .fw_name = "xo",
  155. },
  156. .num_parents = 1,
  157. .ops = &clk_alpha_pll_ops,
  158. },
  159. },
  160. };
  161. static const struct alpha_pll_config mmpll5_config = {
  162. .l = 0x2a,
  163. .config_ctl_val = 0x4001055b,
  164. .alpha_hi = 0xf8,
  165. .alpha_en_mask = BIT(24),
  166. .vco_val = 0x2 << 20,
  167. .vco_mask = 0x3 << 20,
  168. .main_output_mask = 0x1,
  169. };
  170. static struct clk_alpha_pll mmpll5 = {
  171. .offset = 0xa0,
  172. .regs = clk_alpha_pll_regs[CLK_ALPHA_PLL_TYPE_DEFAULT],
  173. .vco_table = vco,
  174. .num_vco = ARRAY_SIZE(vco),
  175. .clkr = {
  176. .hw.init = &(struct clk_init_data){
  177. .name = "mmpll5",
  178. .parent_data = &(const struct clk_parent_data){
  179. .fw_name = "xo",
  180. },
  181. .num_parents = 1,
  182. .ops = &clk_alpha_pll_ops,
  183. },
  184. },
  185. };
  186. static const struct alpha_pll_config mmpll7_config = {
  187. .l = 0x32,
  188. .config_ctl_val = 0x4001055b,
  189. .vco_val = 0x2 << 20,
  190. .vco_mask = 0x3 << 20,
  191. .main_output_mask = 0x1,
  192. };
  193. static struct clk_alpha_pll mmpll7 = {
  194. .offset = 0x140,
  195. .regs = clk_alpha_pll_regs[CLK_ALPHA_PLL_TYPE_DEFAULT],
  196. .vco_table = vco,
  197. .num_vco = ARRAY_SIZE(vco),
  198. .clkr = {
  199. .hw.init = &(struct clk_init_data){
  200. .name = "mmpll7",
  201. .parent_data = &(const struct clk_parent_data){
  202. .fw_name = "xo",
  203. },
  204. .num_parents = 1,
  205. .ops = &clk_alpha_pll_ops,
  206. },
  207. },
  208. };
  209. static const struct alpha_pll_config mmpll8_config = {
  210. .l = 0x30,
  211. .alpha_hi = 0x70,
  212. .alpha_en_mask = BIT(24),
  213. .config_ctl_val = 0x4001055b,
  214. .vco_val = 0x2 << 20,
  215. .vco_mask = 0x3 << 20,
  216. .main_output_mask = 0x1,
  217. };
  218. static struct clk_alpha_pll mmpll8 = {
  219. .offset = 0x1c0,
  220. .regs = clk_alpha_pll_regs[CLK_ALPHA_PLL_TYPE_DEFAULT],
  221. .vco_table = vco,
  222. .num_vco = ARRAY_SIZE(vco),
  223. .clkr = {
  224. .hw.init = &(struct clk_init_data){
  225. .name = "mmpll8",
  226. .parent_data = &(const struct clk_parent_data){
  227. .fw_name = "xo",
  228. },
  229. .num_parents = 1,
  230. .ops = &clk_alpha_pll_ops,
  231. },
  232. },
  233. };
  234. static const struct clk_parent_data mmcc_xo_mmpll0_mmpll4_mmpll7_mmpll8_gpll0_gpll0_div[] = {
  235. { .fw_name = "xo" },
  236. { .hw = &mmpll0.clkr.hw },
  237. { .hw = &mmpll4.clkr.hw },
  238. { .hw = &mmpll7.clkr.hw },
  239. { .hw = &mmpll8.clkr.hw },
  240. { .fw_name = "gpll0" },
  241. { .fw_name = "gpll0_div" },
  242. };
  243. static const struct parent_map mmcc_xo_dsibyte_map[] = {
  244. { P_XO, 0 },
  245. { P_DSI0PLL_BYTE, 1 },
  246. { P_DSI1PLL_BYTE, 2 },
  247. };
  248. static const struct clk_parent_data mmcc_xo_dsibyte[] = {
  249. { .fw_name = "xo" },
  250. { .fw_name = "dsi0pllbyte" },
  251. { .fw_name = "dsi1pllbyte" },
  252. };
  253. static const struct parent_map mmcc_xo_mmpll0_mmpll4_mmpll7_mmpll10_gpll0_gpll0_div_map[] = {
  254. { P_XO, 0 },
  255. { P_MMPLL0, 1 },
  256. { P_MMPLL4, 2 },
  257. { P_MMPLL7, 3 },
  258. { P_MMPLL10, 4 },
  259. { P_GPLL0, 5 },
  260. { P_GPLL0_DIV, 6 },
  261. };
  262. static const struct clk_parent_data mmcc_xo_mmpll0_mmpll4_mmpll7_mmpll10_gpll0_gpll0_div[] = {
  263. { .fw_name = "xo" },
  264. { .hw = &mmpll0.clkr.hw },
  265. { .hw = &mmpll4.clkr.hw },
  266. { .hw = &mmpll7.clkr.hw },
  267. { .hw = &mmpll10.clkr.hw },
  268. { .fw_name = "gpll0" },
  269. { .fw_name = "gpll0_div" },
  270. };
  271. static const struct parent_map mmcc_xo_mmpll4_mmpll7_mmpll10_sleep_gpll0_gpll0_div_map[] = {
  272. { P_XO, 0 },
  273. { P_MMPLL4, 1 },
  274. { P_MMPLL7, 2 },
  275. { P_MMPLL10, 3 },
  276. { P_SLEEP_CLK, 4 },
  277. { P_GPLL0, 5 },
  278. { P_GPLL0_DIV, 6 },
  279. };
  280. static const struct clk_parent_data mmcc_xo_mmpll4_mmpll7_mmpll10_sleep_gpll0_gpll0_div[] = {
  281. { .fw_name = "xo" },
  282. { .hw = &mmpll4.clkr.hw },
  283. { .hw = &mmpll7.clkr.hw },
  284. { .hw = &mmpll10.clkr.hw },
  285. { .fw_name = "sleep_clk" },
  286. { .fw_name = "gpll0" },
  287. { .fw_name = "gpll0_div" },
  288. };
  289. static const struct parent_map mmcc_xo_mmpll0_mmpll7_mmpll10_sleep_gpll0_gpll0_div_map[] = {
  290. { P_XO, 0 },
  291. { P_MMPLL0, 1 },
  292. { P_MMPLL7, 2 },
  293. { P_MMPLL10, 3 },
  294. { P_SLEEP_CLK, 4 },
  295. { P_GPLL0, 5 },
  296. { P_GPLL0_DIV, 6 },
  297. };
  298. static const struct clk_parent_data mmcc_xo_mmpll0_mmpll7_mmpll10_sleep_gpll0_gpll0_div[] = {
  299. { .fw_name = "xo" },
  300. { .hw = &mmpll0.clkr.hw },
  301. { .hw = &mmpll7.clkr.hw },
  302. { .hw = &mmpll10.clkr.hw },
  303. { .fw_name = "sleep_clk" },
  304. { .fw_name = "gpll0" },
  305. { .fw_name = "gpll0_div" },
  306. };
  307. static const struct parent_map mmcc_xo_gpll0_gpll0_div_map[] = {
  308. { P_XO, 0 },
  309. { P_GPLL0, 5 },
  310. { P_GPLL0_DIV, 6 },
  311. };
  312. static const struct clk_parent_data mmcc_xo_gpll0_gpll0_div[] = {
  313. { .fw_name = "xo" },
  314. { .fw_name = "gpll0" },
  315. { .fw_name = "gpll0_div" },
  316. };
  317. static const struct parent_map mmcc_xo_dplink_dpvco_map[] = {
  318. { P_XO, 0 },
  319. { P_DP_PHY_PLL_LINK_CLK, 1 },
  320. { P_DP_PHY_PLL_VCO_DIV, 2 },
  321. };
  322. static const struct clk_parent_data mmcc_xo_dplink_dpvco[] = {
  323. { .fw_name = "xo" },
  324. { .fw_name = "dp_link_2x_clk_divsel_five" },
  325. { .fw_name = "dp_vco_divided_clk_src_mux" },
  326. };
  327. static const struct parent_map mmcc_xo_mmpll0_mmpll5_mmpll7_gpll0_gpll0_div_map[] = {
  328. { P_XO, 0 },
  329. { P_MMPLL0, 1 },
  330. { P_MMPLL5, 2 },
  331. { P_MMPLL7, 3 },
  332. { P_GPLL0, 5 },
  333. { P_GPLL0_DIV, 6 },
  334. };
  335. static const struct clk_parent_data mmcc_xo_mmpll0_mmpll5_mmpll7_gpll0_gpll0_div[] = {
  336. { .fw_name = "xo" },
  337. { .hw = &mmpll0.clkr.hw },
  338. { .hw = &mmpll5.clkr.hw },
  339. { .hw = &mmpll7.clkr.hw },
  340. { .fw_name = "gpll0" },
  341. { .fw_name = "gpll0_div" },
  342. };
  343. static const struct parent_map mmcc_xo_dsi0pll_dsi1pll_map[] = {
  344. { P_XO, 0 },
  345. { P_DSI0PLL, 1 },
  346. { P_DSI1PLL, 2 },
  347. };
  348. static const struct clk_parent_data mmcc_xo_dsi0pll_dsi1pll[] = {
  349. { .fw_name = "xo" },
  350. { .fw_name = "dsi0pll" },
  351. { .fw_name = "dsi1pll" },
  352. };
  353. static const struct parent_map mmcc_mmpll0_mmpll4_mmpll7_mmpll10_mmpll6_gpll0_map[] = {
  354. { P_XO, 0 },
  355. { P_MMPLL0, 1 },
  356. { P_MMPLL4, 2 },
  357. { P_MMPLL7, 3 },
  358. { P_MMPLL10, 4 },
  359. { P_MMPLL6, 5 },
  360. { P_GPLL0, 6 },
  361. };
  362. static const struct clk_parent_data mmcc_mmpll0_mmpll4_mmpll7_mmpll10_mmpll6_gpll0[] = {
  363. { .fw_name = "xo" },
  364. { .hw = &mmpll0.clkr.hw },
  365. { .hw = &mmpll4.clkr.hw },
  366. { .hw = &mmpll7.clkr.hw },
  367. { .hw = &mmpll10.clkr.hw },
  368. { .hw = &mmpll6.clkr.hw },
  369. { .fw_name = "gpll0" },
  370. };
  371. static const struct parent_map mmcc_xo_mmpll0_gpll0_gpll0_div_map[] = {
  372. { P_XO, 0 },
  373. { P_MMPLL0, 1 },
  374. { P_GPLL0, 5 },
  375. { P_GPLL0_DIV, 6 },
  376. };
  377. static const struct clk_parent_data mmcc_xo_mmpll0_gpll0_gpll0_div[] = {
  378. { .fw_name = "xo" },
  379. { .hw = &mmpll0.clkr.hw },
  380. { .fw_name = "gpll0" },
  381. { .fw_name = "gpll0_div" },
  382. };
  383. static const struct parent_map mmcc_xo_mmpll0_mmpll4_mmpll7_mmpll10_gpll0_mmpll6_map[] = {
  384. { P_XO, 0 },
  385. { P_MMPLL0, 1 },
  386. { P_MMPLL4, 2 },
  387. { P_MMPLL7, 3 },
  388. { P_MMPLL10, 4 },
  389. { P_GPLL0, 5 },
  390. { P_MMPLL6, 6 },
  391. };
  392. static const struct clk_parent_data mmcc_xo_mmpll0_mmpll4_mmpll7_mmpll10_gpll0_mmpll6[] = {
  393. { .fw_name = "xo" },
  394. { .hw = &mmpll0.clkr.hw },
  395. { .hw = &mmpll4.clkr.hw },
  396. { .hw = &mmpll7.clkr.hw },
  397. { .hw = &mmpll10.clkr.hw },
  398. { .fw_name = "gpll0" },
  399. { .hw = &mmpll6.clkr.hw },
  400. };
  401. static const struct parent_map mmcc_xo_mmpll0_mmpll8_mmpll3_mmpll6_gpll0_mmpll7_map[] = {
  402. { P_XO, 0 },
  403. { P_MMPLL0, 1 },
  404. { P_MMPLL8, 2 },
  405. { P_MMPLL3, 3 },
  406. { P_MMPLL6, 4 },
  407. { P_GPLL0, 5 },
  408. { P_MMPLL7, 6 },
  409. };
  410. static const struct clk_parent_data mmcc_xo_mmpll0_mmpll8_mmpll3_mmpll6_gpll0_mmpll7[] = {
  411. { .fw_name = "xo" },
  412. { .hw = &mmpll0.clkr.hw },
  413. { .hw = &mmpll8.clkr.hw },
  414. { .hw = &mmpll3.clkr.hw },
  415. { .hw = &mmpll6.clkr.hw },
  416. { .fw_name = "gpll0" },
  417. { .hw = &mmpll7.clkr.hw },
  418. };
  419. static const struct freq_tbl ftbl_ahb_clk_src[] = {
  420. F(19200000, P_XO, 1, 0, 0),
  421. F(40000000, P_GPLL0_DIV, 7.5, 0, 0),
  422. F(80800000, P_MMPLL0, 10, 0, 0),
  423. { }
  424. };
  425. static struct clk_rcg2 ahb_clk_src = {
  426. .cmd_rcgr = 0x5000,
  427. .mnd_width = 0,
  428. .hid_width = 5,
  429. .parent_map = mmcc_xo_mmpll0_gpll0_gpll0_div_map,
  430. .freq_tbl = ftbl_ahb_clk_src,
  431. .clkr.hw.init = &(struct clk_init_data){
  432. .name = "ahb_clk_src",
  433. .parent_data = mmcc_xo_mmpll0_gpll0_gpll0_div,
  434. .num_parents = ARRAY_SIZE(mmcc_xo_mmpll0_gpll0_gpll0_div),
  435. .ops = &clk_rcg2_ops,
  436. },
  437. };
  438. static struct clk_rcg2 byte0_clk_src = {
  439. .cmd_rcgr = 0x2120,
  440. .mnd_width = 0,
  441. .hid_width = 5,
  442. .parent_map = mmcc_xo_dsibyte_map,
  443. .clkr.hw.init = &(struct clk_init_data){
  444. .name = "byte0_clk_src",
  445. .parent_data = mmcc_xo_dsibyte,
  446. .num_parents = ARRAY_SIZE(mmcc_xo_dsibyte),
  447. .ops = &clk_byte2_ops,
  448. .flags = CLK_SET_RATE_PARENT | CLK_GET_RATE_NOCACHE,
  449. },
  450. };
  451. static struct clk_rcg2 byte1_clk_src = {
  452. .cmd_rcgr = 0x2140,
  453. .mnd_width = 0,
  454. .hid_width = 5,
  455. .parent_map = mmcc_xo_dsibyte_map,
  456. .clkr.hw.init = &(struct clk_init_data){
  457. .name = "byte1_clk_src",
  458. .parent_data = mmcc_xo_dsibyte,
  459. .num_parents = ARRAY_SIZE(mmcc_xo_dsibyte),
  460. .ops = &clk_byte2_ops,
  461. .flags = CLK_SET_RATE_PARENT | CLK_GET_RATE_NOCACHE,
  462. },
  463. };
  464. static const struct freq_tbl ftbl_camss_gp0_clk_src[] = {
  465. F(10000, P_XO, 16, 1, 120),
  466. F(24000, P_XO, 16, 1, 50),
  467. F(6000000, P_GPLL0_DIV, 10, 1, 5),
  468. F(12000000, P_GPLL0_DIV, 10, 2, 5),
  469. F(13043478, P_GPLL0_DIV, 1, 1, 23),
  470. F(24000000, P_GPLL0_DIV, 1, 2, 25),
  471. F(50000000, P_GPLL0_DIV, 6, 0, 0),
  472. F(100000000, P_GPLL0_DIV, 3, 0, 0),
  473. F(200000000, P_GPLL0, 3, 0, 0),
  474. { }
  475. };
  476. static struct clk_rcg2 camss_gp0_clk_src = {
  477. .cmd_rcgr = 0x3420,
  478. .mnd_width = 8,
  479. .hid_width = 5,
  480. .parent_map = mmcc_xo_mmpll0_mmpll7_mmpll10_sleep_gpll0_gpll0_div_map,
  481. .freq_tbl = ftbl_camss_gp0_clk_src,
  482. .clkr.hw.init = &(struct clk_init_data){
  483. .name = "camss_gp0_clk_src",
  484. .parent_data = mmcc_xo_mmpll0_mmpll7_mmpll10_sleep_gpll0_gpll0_div,
  485. .num_parents = ARRAY_SIZE(mmcc_xo_mmpll0_mmpll7_mmpll10_sleep_gpll0_gpll0_div),
  486. .ops = &clk_rcg2_ops,
  487. },
  488. };
  489. static struct clk_rcg2 camss_gp1_clk_src = {
  490. .cmd_rcgr = 0x3450,
  491. .mnd_width = 8,
  492. .hid_width = 5,
  493. .parent_map = mmcc_xo_mmpll0_mmpll7_mmpll10_sleep_gpll0_gpll0_div_map,
  494. .freq_tbl = ftbl_camss_gp0_clk_src,
  495. .clkr.hw.init = &(struct clk_init_data){
  496. .name = "camss_gp1_clk_src",
  497. .parent_data = mmcc_xo_mmpll0_mmpll7_mmpll10_sleep_gpll0_gpll0_div,
  498. .num_parents = ARRAY_SIZE(mmcc_xo_mmpll0_mmpll7_mmpll10_sleep_gpll0_gpll0_div),
  499. .ops = &clk_rcg2_ops,
  500. },
  501. };
  502. static const struct freq_tbl ftbl_cci_clk_src[] = {
  503. F(37500000, P_GPLL0_DIV, 8, 0, 0),
  504. F(50000000, P_GPLL0_DIV, 6, 0, 0),
  505. F(100000000, P_GPLL0, 6, 0, 0),
  506. { }
  507. };
  508. static struct clk_rcg2 cci_clk_src = {
  509. .cmd_rcgr = 0x3300,
  510. .mnd_width = 8,
  511. .hid_width = 5,
  512. .parent_map = mmcc_xo_mmpll0_mmpll7_mmpll10_sleep_gpll0_gpll0_div_map,
  513. .freq_tbl = ftbl_cci_clk_src,
  514. .clkr.hw.init = &(struct clk_init_data){
  515. .name = "cci_clk_src",
  516. .parent_data = mmcc_xo_mmpll0_mmpll7_mmpll10_sleep_gpll0_gpll0_div,
  517. .num_parents = ARRAY_SIZE(mmcc_xo_mmpll0_mmpll7_mmpll10_sleep_gpll0_gpll0_div),
  518. .ops = &clk_rcg2_ops,
  519. },
  520. };
  521. static const struct freq_tbl ftbl_cpp_clk_src[] = {
  522. F(120000000, P_GPLL0, 5, 0, 0),
  523. F(256000000, P_MMPLL4, 3, 0, 0),
  524. F(384000000, P_MMPLL4, 2, 0, 0),
  525. F(480000000, P_MMPLL7, 2, 0, 0),
  526. F(540000000, P_MMPLL6, 2, 0, 0),
  527. F(576000000, P_MMPLL10, 1, 0, 0),
  528. { }
  529. };
  530. static struct clk_rcg2 cpp_clk_src = {
  531. .cmd_rcgr = 0x3640,
  532. .mnd_width = 0,
  533. .hid_width = 5,
  534. .parent_map = mmcc_xo_mmpll0_mmpll4_mmpll7_mmpll10_gpll0_mmpll6_map,
  535. .freq_tbl = ftbl_cpp_clk_src,
  536. .clkr.hw.init = &(struct clk_init_data){
  537. .name = "cpp_clk_src",
  538. .parent_data = mmcc_xo_mmpll0_mmpll4_mmpll7_mmpll10_gpll0_mmpll6,
  539. .num_parents = ARRAY_SIZE(mmcc_xo_mmpll0_mmpll4_mmpll7_mmpll10_gpll0_mmpll6),
  540. .ops = &clk_rcg2_ops,
  541. },
  542. };
  543. static const struct freq_tbl ftbl_csi0_clk_src[] = {
  544. F(100000000, P_GPLL0_DIV, 3, 0, 0),
  545. F(200000000, P_GPLL0, 3, 0, 0),
  546. F(310000000, P_MMPLL8, 3, 0, 0),
  547. F(404000000, P_MMPLL0, 2, 0, 0),
  548. F(465000000, P_MMPLL8, 2, 0, 0),
  549. { }
  550. };
  551. static struct clk_rcg2 csi0_clk_src = {
  552. .cmd_rcgr = 0x3090,
  553. .mnd_width = 0,
  554. .hid_width = 5,
  555. .parent_map = mmcc_xo_mmpll0_mmpll4_mmpll7_mmpll8_gpll0_gpll0_div_map,
  556. .freq_tbl = ftbl_csi0_clk_src,
  557. .clkr.hw.init = &(struct clk_init_data){
  558. .name = "csi0_clk_src",
  559. .parent_data = mmcc_xo_mmpll0_mmpll4_mmpll7_mmpll8_gpll0_gpll0_div,
  560. .num_parents = ARRAY_SIZE(mmcc_xo_mmpll0_mmpll4_mmpll7_mmpll8_gpll0_gpll0_div),
  561. .ops = &clk_rcg2_ops,
  562. },
  563. };
  564. static const struct freq_tbl ftbl_csi0phytimer_clk_src[] = {
  565. F(100000000, P_GPLL0_DIV, 3, 0, 0),
  566. F(200000000, P_GPLL0, 3, 0, 0),
  567. F(269333333, P_MMPLL0, 3, 0, 0),
  568. { }
  569. };
  570. static struct clk_rcg2 csi0phytimer_clk_src = {
  571. .cmd_rcgr = 0x3000,
  572. .mnd_width = 0,
  573. .hid_width = 5,
  574. .parent_map = mmcc_xo_mmpll0_mmpll4_mmpll7_mmpll10_gpll0_gpll0_div_map,
  575. .freq_tbl = ftbl_csi0phytimer_clk_src,
  576. .clkr.hw.init = &(struct clk_init_data){
  577. .name = "csi0phytimer_clk_src",
  578. .parent_data = mmcc_xo_mmpll0_mmpll4_mmpll7_mmpll10_gpll0_gpll0_div,
  579. .num_parents = ARRAY_SIZE(mmcc_xo_mmpll0_mmpll4_mmpll7_mmpll10_gpll0_gpll0_div),
  580. .ops = &clk_rcg2_ops,
  581. },
  582. };
  583. static struct clk_rcg2 csi1_clk_src = {
  584. .cmd_rcgr = 0x3100,
  585. .mnd_width = 0,
  586. .hid_width = 5,
  587. .parent_map = mmcc_xo_mmpll0_mmpll4_mmpll7_mmpll8_gpll0_gpll0_div_map,
  588. .freq_tbl = ftbl_csi0_clk_src,
  589. .clkr.hw.init = &(struct clk_init_data){
  590. .name = "csi1_clk_src",
  591. .parent_data = mmcc_xo_mmpll0_mmpll4_mmpll7_mmpll8_gpll0_gpll0_div,
  592. .num_parents = ARRAY_SIZE(mmcc_xo_mmpll0_mmpll4_mmpll7_mmpll8_gpll0_gpll0_div),
  593. .ops = &clk_rcg2_ops,
  594. },
  595. };
  596. static struct clk_rcg2 csi1phytimer_clk_src = {
  597. .cmd_rcgr = 0x3030,
  598. .mnd_width = 0,
  599. .hid_width = 5,
  600. .parent_map = mmcc_xo_mmpll0_mmpll4_mmpll7_mmpll10_gpll0_gpll0_div_map,
  601. .freq_tbl = ftbl_csi0phytimer_clk_src,
  602. .clkr.hw.init = &(struct clk_init_data){
  603. .name = "csi1phytimer_clk_src",
  604. .parent_data = mmcc_xo_mmpll0_mmpll4_mmpll7_mmpll10_gpll0_gpll0_div,
  605. .num_parents = ARRAY_SIZE(mmcc_xo_mmpll0_mmpll4_mmpll7_mmpll10_gpll0_gpll0_div),
  606. .ops = &clk_rcg2_ops,
  607. },
  608. };
  609. static struct clk_rcg2 csi2_clk_src = {
  610. .cmd_rcgr = 0x3160,
  611. .mnd_width = 0,
  612. .hid_width = 5,
  613. .parent_map = mmcc_xo_mmpll0_mmpll4_mmpll7_mmpll8_gpll0_gpll0_div_map,
  614. .freq_tbl = ftbl_csi0_clk_src,
  615. .clkr.hw.init = &(struct clk_init_data){
  616. .name = "csi2_clk_src",
  617. .parent_data = mmcc_xo_mmpll0_mmpll4_mmpll7_mmpll8_gpll0_gpll0_div,
  618. .num_parents = ARRAY_SIZE(mmcc_xo_mmpll0_mmpll4_mmpll7_mmpll8_gpll0_gpll0_div),
  619. .ops = &clk_rcg2_ops,
  620. },
  621. };
  622. static struct clk_rcg2 csi2phytimer_clk_src = {
  623. .cmd_rcgr = 0x3060,
  624. .mnd_width = 0,
  625. .hid_width = 5,
  626. .parent_map = mmcc_xo_mmpll0_mmpll4_mmpll7_mmpll10_gpll0_gpll0_div_map,
  627. .freq_tbl = ftbl_csi0phytimer_clk_src,
  628. .clkr.hw.init = &(struct clk_init_data){
  629. .name = "csi2phytimer_clk_src",
  630. .parent_data = mmcc_xo_mmpll0_mmpll4_mmpll7_mmpll10_gpll0_gpll0_div,
  631. .num_parents = ARRAY_SIZE(mmcc_xo_mmpll0_mmpll4_mmpll7_mmpll10_gpll0_gpll0_div),
  632. .ops = &clk_rcg2_ops,
  633. },
  634. };
  635. static struct clk_rcg2 csi3_clk_src = {
  636. .cmd_rcgr = 0x31c0,
  637. .mnd_width = 0,
  638. .hid_width = 5,
  639. .parent_map = mmcc_xo_mmpll0_mmpll4_mmpll7_mmpll8_gpll0_gpll0_div_map,
  640. .freq_tbl = ftbl_csi0_clk_src,
  641. .clkr.hw.init = &(struct clk_init_data){
  642. .name = "csi3_clk_src",
  643. .parent_data = mmcc_xo_mmpll0_mmpll4_mmpll7_mmpll8_gpll0_gpll0_div,
  644. .num_parents = ARRAY_SIZE(mmcc_xo_mmpll0_mmpll4_mmpll7_mmpll8_gpll0_gpll0_div),
  645. .ops = &clk_rcg2_ops,
  646. },
  647. };
  648. static const struct freq_tbl ftbl_csiphy_clk_src[] = {
  649. F(100000000, P_GPLL0_DIV, 3, 0, 0),
  650. F(200000000, P_GPLL0, 3, 0, 0),
  651. F(269333333, P_MMPLL0, 3, 0, 0),
  652. F(320000000, P_MMPLL7, 3, 0, 0),
  653. { }
  654. };
  655. static struct clk_rcg2 csiphy_clk_src = {
  656. .cmd_rcgr = 0x3800,
  657. .mnd_width = 0,
  658. .hid_width = 5,
  659. .parent_map = mmcc_xo_mmpll0_mmpll4_mmpll7_mmpll8_gpll0_gpll0_div_map,
  660. .freq_tbl = ftbl_csiphy_clk_src,
  661. .clkr.hw.init = &(struct clk_init_data){
  662. .name = "csiphy_clk_src",
  663. .parent_data = mmcc_xo_mmpll0_mmpll4_mmpll7_mmpll8_gpll0_gpll0_div,
  664. .num_parents = ARRAY_SIZE(mmcc_xo_mmpll0_mmpll4_mmpll7_mmpll8_gpll0_gpll0_div),
  665. .ops = &clk_rcg2_ops,
  666. },
  667. };
  668. static const struct freq_tbl ftbl_dp_aux_clk_src[] = {
  669. F(19200000, P_XO, 1, 0, 0),
  670. { }
  671. };
  672. static struct clk_rcg2 dp_aux_clk_src = {
  673. .cmd_rcgr = 0x2260,
  674. .mnd_width = 0,
  675. .hid_width = 5,
  676. .parent_map = mmcc_xo_gpll0_gpll0_div_map,
  677. .freq_tbl = ftbl_dp_aux_clk_src,
  678. .clkr.hw.init = &(struct clk_init_data){
  679. .name = "dp_aux_clk_src",
  680. .parent_data = mmcc_xo_gpll0_gpll0_div,
  681. .num_parents = ARRAY_SIZE(mmcc_xo_gpll0_gpll0_div),
  682. .ops = &clk_rcg2_ops,
  683. },
  684. };
  685. static const struct freq_tbl ftbl_dp_crypto_clk_src[] = {
  686. F(101250000, P_DP_PHY_PLL_VCO_DIV, 4, 0, 0),
  687. F(168750000, P_DP_PHY_PLL_VCO_DIV, 4, 0, 0),
  688. F(337500000, P_DP_PHY_PLL_VCO_DIV, 4, 0, 0),
  689. { }
  690. };
  691. static struct clk_rcg2 dp_crypto_clk_src = {
  692. .cmd_rcgr = 0x2220,
  693. .mnd_width = 8,
  694. .hid_width = 5,
  695. .parent_map = mmcc_xo_dplink_dpvco_map,
  696. .freq_tbl = ftbl_dp_crypto_clk_src,
  697. .clkr.hw.init = &(struct clk_init_data){
  698. .name = "dp_crypto_clk_src",
  699. .parent_data = mmcc_xo_dplink_dpvco,
  700. .num_parents = ARRAY_SIZE(mmcc_xo_dplink_dpvco),
  701. .ops = &clk_rcg2_ops,
  702. },
  703. };
  704. static const struct freq_tbl ftbl_dp_gtc_clk_src[] = {
  705. F(40000000, P_GPLL0_DIV, 7.5, 0, 0),
  706. F(60000000, P_GPLL0, 10, 0, 0),
  707. { }
  708. };
  709. static struct clk_rcg2 dp_gtc_clk_src = {
  710. .cmd_rcgr = 0x2280,
  711. .mnd_width = 0,
  712. .hid_width = 5,
  713. .parent_map = mmcc_xo_gpll0_gpll0_div_map,
  714. .freq_tbl = ftbl_dp_gtc_clk_src,
  715. .clkr.hw.init = &(struct clk_init_data){
  716. .name = "dp_gtc_clk_src",
  717. .parent_data = mmcc_xo_gpll0_gpll0_div,
  718. .num_parents = ARRAY_SIZE(mmcc_xo_gpll0_gpll0_div),
  719. .ops = &clk_rcg2_ops,
  720. },
  721. };
  722. static const struct freq_tbl ftbl_dp_link_clk_src[] = {
  723. F(162000000, P_DP_PHY_PLL_LINK_CLK, 2, 0, 0),
  724. F(270000000, P_DP_PHY_PLL_LINK_CLK, 2, 0, 0),
  725. F(540000000, P_DP_PHY_PLL_LINK_CLK, 2, 0, 0),
  726. { }
  727. };
  728. static struct clk_rcg2 dp_link_clk_src = {
  729. .cmd_rcgr = 0x2200,
  730. .mnd_width = 0,
  731. .hid_width = 5,
  732. .parent_map = mmcc_xo_dplink_dpvco_map,
  733. .freq_tbl = ftbl_dp_link_clk_src,
  734. .clkr.hw.init = &(struct clk_init_data){
  735. .name = "dp_link_clk_src",
  736. .parent_data = mmcc_xo_dplink_dpvco,
  737. .num_parents = ARRAY_SIZE(mmcc_xo_dplink_dpvco),
  738. .ops = &clk_rcg2_ops,
  739. .flags = CLK_GET_RATE_NOCACHE | CLK_SET_RATE_PARENT,
  740. },
  741. };
  742. static struct clk_rcg2 dp_pixel_clk_src = {
  743. .cmd_rcgr = 0x2240,
  744. .mnd_width = 16,
  745. .hid_width = 5,
  746. .parent_map = mmcc_xo_dplink_dpvco_map,
  747. .clkr.hw.init = &(struct clk_init_data){
  748. .name = "dp_pixel_clk_src",
  749. .parent_data = mmcc_xo_dplink_dpvco,
  750. .num_parents = ARRAY_SIZE(mmcc_xo_dplink_dpvco),
  751. .ops = &clk_dp_ops,
  752. .flags = CLK_GET_RATE_NOCACHE | CLK_SET_RATE_PARENT,
  753. },
  754. };
  755. static struct clk_rcg2 esc0_clk_src = {
  756. .cmd_rcgr = 0x2160,
  757. .mnd_width = 0,
  758. .hid_width = 5,
  759. .parent_map = mmcc_xo_dsibyte_map,
  760. .clkr.hw.init = &(struct clk_init_data){
  761. .name = "esc0_clk_src",
  762. .parent_data = mmcc_xo_dsibyte,
  763. .num_parents = ARRAY_SIZE(mmcc_xo_dsibyte),
  764. .ops = &clk_rcg2_ops,
  765. },
  766. };
  767. static struct clk_rcg2 esc1_clk_src = {
  768. .cmd_rcgr = 0x2180,
  769. .mnd_width = 0,
  770. .hid_width = 5,
  771. .parent_map = mmcc_xo_dsibyte_map,
  772. .clkr.hw.init = &(struct clk_init_data){
  773. .name = "esc1_clk_src",
  774. .parent_data = mmcc_xo_dsibyte,
  775. .num_parents = ARRAY_SIZE(mmcc_xo_dsibyte),
  776. .ops = &clk_rcg2_ops,
  777. },
  778. };
  779. static const struct freq_tbl ftbl_jpeg0_clk_src[] = {
  780. F(66666667, P_GPLL0_DIV, 4.5, 0, 0),
  781. F(133333333, P_GPLL0, 4.5, 0, 0),
  782. F(219428571, P_MMPLL4, 3.5, 0, 0),
  783. F(320000000, P_MMPLL7, 3, 0, 0),
  784. F(480000000, P_MMPLL7, 2, 0, 0),
  785. { }
  786. };
  787. static struct clk_rcg2 jpeg0_clk_src = {
  788. .cmd_rcgr = 0x3500,
  789. .mnd_width = 0,
  790. .hid_width = 5,
  791. .parent_map = mmcc_xo_mmpll0_mmpll4_mmpll7_mmpll10_gpll0_gpll0_div_map,
  792. .freq_tbl = ftbl_jpeg0_clk_src,
  793. .clkr.hw.init = &(struct clk_init_data){
  794. .name = "jpeg0_clk_src",
  795. .parent_data = mmcc_xo_mmpll0_mmpll4_mmpll7_mmpll10_gpll0_gpll0_div,
  796. .num_parents = ARRAY_SIZE(mmcc_xo_mmpll0_mmpll4_mmpll7_mmpll10_gpll0_gpll0_div),
  797. .ops = &clk_rcg2_ops,
  798. },
  799. };
  800. static const struct freq_tbl ftbl_mclk0_clk_src[] = {
  801. F(4800000, P_XO, 4, 0, 0),
  802. F(6000000, P_GPLL0_DIV, 10, 1, 5),
  803. F(8000000, P_GPLL0_DIV, 1, 2, 75),
  804. F(9600000, P_XO, 2, 0, 0),
  805. F(16666667, P_GPLL0_DIV, 2, 1, 9),
  806. F(19200000, P_XO, 1, 0, 0),
  807. F(24000000, P_MMPLL10, 1, 1, 24),
  808. F(33333333, P_GPLL0_DIV, 1, 1, 9),
  809. F(48000000, P_GPLL0, 1, 2, 25),
  810. F(66666667, P_GPLL0, 1, 1, 9),
  811. { }
  812. };
  813. static struct clk_rcg2 mclk0_clk_src = {
  814. .cmd_rcgr = 0x3360,
  815. .mnd_width = 8,
  816. .hid_width = 5,
  817. .parent_map = mmcc_xo_mmpll4_mmpll7_mmpll10_sleep_gpll0_gpll0_div_map,
  818. .freq_tbl = ftbl_mclk0_clk_src,
  819. .clkr.hw.init = &(struct clk_init_data){
  820. .name = "mclk0_clk_src",
  821. .parent_data = mmcc_xo_mmpll4_mmpll7_mmpll10_sleep_gpll0_gpll0_div,
  822. .num_parents = ARRAY_SIZE(mmcc_xo_mmpll4_mmpll7_mmpll10_sleep_gpll0_gpll0_div),
  823. .ops = &clk_rcg2_ops,
  824. },
  825. };
  826. static struct clk_rcg2 mclk1_clk_src = {
  827. .cmd_rcgr = 0x3390,
  828. .mnd_width = 8,
  829. .hid_width = 5,
  830. .parent_map = mmcc_xo_mmpll4_mmpll7_mmpll10_sleep_gpll0_gpll0_div_map,
  831. .freq_tbl = ftbl_mclk0_clk_src,
  832. .clkr.hw.init = &(struct clk_init_data){
  833. .name = "mclk1_clk_src",
  834. .parent_data = mmcc_xo_mmpll4_mmpll7_mmpll10_sleep_gpll0_gpll0_div,
  835. .num_parents = ARRAY_SIZE(mmcc_xo_mmpll4_mmpll7_mmpll10_sleep_gpll0_gpll0_div),
  836. .ops = &clk_rcg2_ops,
  837. },
  838. };
  839. static struct clk_rcg2 mclk2_clk_src = {
  840. .cmd_rcgr = 0x33c0,
  841. .mnd_width = 8,
  842. .hid_width = 5,
  843. .parent_map = mmcc_xo_mmpll4_mmpll7_mmpll10_sleep_gpll0_gpll0_div_map,
  844. .freq_tbl = ftbl_mclk0_clk_src,
  845. .clkr.hw.init = &(struct clk_init_data){
  846. .name = "mclk2_clk_src",
  847. .parent_data = mmcc_xo_mmpll4_mmpll7_mmpll10_sleep_gpll0_gpll0_div,
  848. .num_parents = ARRAY_SIZE(mmcc_xo_mmpll4_mmpll7_mmpll10_sleep_gpll0_gpll0_div),
  849. .ops = &clk_rcg2_ops,
  850. },
  851. };
  852. static struct clk_rcg2 mclk3_clk_src = {
  853. .cmd_rcgr = 0x33f0,
  854. .mnd_width = 8,
  855. .hid_width = 5,
  856. .parent_map = mmcc_xo_mmpll4_mmpll7_mmpll10_sleep_gpll0_gpll0_div_map,
  857. .freq_tbl = ftbl_mclk0_clk_src,
  858. .clkr.hw.init = &(struct clk_init_data){
  859. .name = "mclk3_clk_src",
  860. .parent_data = mmcc_xo_mmpll4_mmpll7_mmpll10_sleep_gpll0_gpll0_div,
  861. .num_parents = ARRAY_SIZE(mmcc_xo_mmpll4_mmpll7_mmpll10_sleep_gpll0_gpll0_div),
  862. .ops = &clk_rcg2_ops,
  863. },
  864. };
  865. static const struct freq_tbl ftbl_mdp_clk_src[] = {
  866. F(100000000, P_GPLL0_DIV, 3, 0, 0),
  867. F(150000000, P_GPLL0_DIV, 2, 0, 0),
  868. F(171428571, P_GPLL0, 3.5, 0, 0),
  869. F(200000000, P_GPLL0, 3, 0, 0),
  870. F(275000000, P_MMPLL5, 3, 0, 0),
  871. F(300000000, P_GPLL0, 2, 0, 0),
  872. F(330000000, P_MMPLL5, 2.5, 0, 0),
  873. F(412500000, P_MMPLL5, 2, 0, 0),
  874. { }
  875. };
  876. static struct clk_rcg2 mdp_clk_src = {
  877. .cmd_rcgr = 0x2040,
  878. .mnd_width = 0,
  879. .hid_width = 5,
  880. .parent_map = mmcc_xo_mmpll0_mmpll5_mmpll7_gpll0_gpll0_div_map,
  881. .freq_tbl = ftbl_mdp_clk_src,
  882. .clkr.hw.init = &(struct clk_init_data){
  883. .name = "mdp_clk_src",
  884. .parent_data = mmcc_xo_mmpll0_mmpll5_mmpll7_gpll0_gpll0_div,
  885. .num_parents = ARRAY_SIZE(mmcc_xo_mmpll0_mmpll5_mmpll7_gpll0_gpll0_div),
  886. .ops = &clk_rcg2_ops,
  887. },
  888. };
  889. static struct clk_rcg2 pclk0_clk_src = {
  890. .cmd_rcgr = 0x2000,
  891. .mnd_width = 8,
  892. .hid_width = 5,
  893. .parent_map = mmcc_xo_dsi0pll_dsi1pll_map,
  894. .clkr.hw.init = &(struct clk_init_data){
  895. .name = "pclk0_clk_src",
  896. .parent_data = mmcc_xo_dsi0pll_dsi1pll,
  897. .num_parents = ARRAY_SIZE(mmcc_xo_dsi0pll_dsi1pll),
  898. .ops = &clk_pixel_ops,
  899. .flags = CLK_SET_RATE_PARENT | CLK_GET_RATE_NOCACHE,
  900. },
  901. };
  902. static struct clk_rcg2 pclk1_clk_src = {
  903. .cmd_rcgr = 0x2020,
  904. .mnd_width = 8,
  905. .hid_width = 5,
  906. .parent_map = mmcc_xo_dsi0pll_dsi1pll_map,
  907. .clkr.hw.init = &(struct clk_init_data){
  908. .name = "pclk1_clk_src",
  909. .parent_data = mmcc_xo_dsi0pll_dsi1pll,
  910. .num_parents = ARRAY_SIZE(mmcc_xo_dsi0pll_dsi1pll),
  911. .ops = &clk_pixel_ops,
  912. .flags = CLK_SET_RATE_PARENT | CLK_GET_RATE_NOCACHE,
  913. },
  914. };
  915. static const struct freq_tbl ftbl_rot_clk_src[] = {
  916. F(171428571, P_GPLL0, 3.5, 0, 0),
  917. F(275000000, P_MMPLL5, 3, 0, 0),
  918. F(300000000, P_GPLL0, 2, 0, 0),
  919. F(330000000, P_MMPLL5, 2.5, 0, 0),
  920. F(412500000, P_MMPLL5, 2, 0, 0),
  921. { }
  922. };
  923. static struct clk_rcg2 rot_clk_src = {
  924. .cmd_rcgr = 0x21a0,
  925. .mnd_width = 0,
  926. .hid_width = 5,
  927. .parent_map = mmcc_xo_mmpll0_mmpll5_mmpll7_gpll0_gpll0_div_map,
  928. .freq_tbl = ftbl_rot_clk_src,
  929. .clkr.hw.init = &(struct clk_init_data){
  930. .name = "rot_clk_src",
  931. .parent_data = mmcc_xo_mmpll0_mmpll5_mmpll7_gpll0_gpll0_div,
  932. .num_parents = ARRAY_SIZE(mmcc_xo_mmpll0_mmpll5_mmpll7_gpll0_gpll0_div),
  933. .ops = &clk_rcg2_ops,
  934. },
  935. };
  936. static const struct freq_tbl ftbl_vfe0_clk_src[] = {
  937. F(120000000, P_GPLL0, 5, 0, 0),
  938. F(200000000, P_GPLL0, 3, 0, 0),
  939. F(256000000, P_MMPLL4, 3, 0, 0),
  940. F(300000000, P_GPLL0, 2, 0, 0),
  941. F(404000000, P_MMPLL0, 2, 0, 0),
  942. F(480000000, P_MMPLL7, 2, 0, 0),
  943. F(540000000, P_MMPLL6, 2, 0, 0),
  944. F(576000000, P_MMPLL10, 1, 0, 0),
  945. { }
  946. };
  947. static struct clk_rcg2 vfe0_clk_src = {
  948. .cmd_rcgr = 0x3600,
  949. .mnd_width = 0,
  950. .hid_width = 5,
  951. .parent_map = mmcc_mmpll0_mmpll4_mmpll7_mmpll10_mmpll6_gpll0_map,
  952. .freq_tbl = ftbl_vfe0_clk_src,
  953. .clkr.hw.init = &(struct clk_init_data){
  954. .name = "vfe0_clk_src",
  955. .parent_data = mmcc_mmpll0_mmpll4_mmpll7_mmpll10_mmpll6_gpll0,
  956. .num_parents = ARRAY_SIZE(mmcc_mmpll0_mmpll4_mmpll7_mmpll10_mmpll6_gpll0),
  957. .ops = &clk_rcg2_ops,
  958. },
  959. };
  960. static struct clk_rcg2 vfe1_clk_src = {
  961. .cmd_rcgr = 0x3620,
  962. .mnd_width = 0,
  963. .hid_width = 5,
  964. .parent_map = mmcc_mmpll0_mmpll4_mmpll7_mmpll10_mmpll6_gpll0_map,
  965. .freq_tbl = ftbl_vfe0_clk_src,
  966. .clkr.hw.init = &(struct clk_init_data){
  967. .name = "vfe1_clk_src",
  968. .parent_data = mmcc_mmpll0_mmpll4_mmpll7_mmpll10_mmpll6_gpll0,
  969. .num_parents = ARRAY_SIZE(mmcc_mmpll0_mmpll4_mmpll7_mmpll10_mmpll6_gpll0),
  970. .ops = &clk_rcg2_ops,
  971. },
  972. };
  973. static const struct freq_tbl ftbl_video_core_clk_src[] = {
  974. F(133333333, P_GPLL0, 4.5, 0, 0),
  975. F(269333333, P_MMPLL0, 3, 0, 0),
  976. F(320000000, P_MMPLL7, 3, 0, 0),
  977. F(404000000, P_MMPLL0, 2, 0, 0),
  978. F(441600000, P_MMPLL3, 2, 0, 0),
  979. F(518400000, P_MMPLL3, 2, 0, 0),
  980. { }
  981. };
  982. static struct clk_rcg2 video_core_clk_src = {
  983. .cmd_rcgr = 0x1000,
  984. .mnd_width = 0,
  985. .hid_width = 5,
  986. .parent_map = mmcc_xo_mmpll0_mmpll8_mmpll3_mmpll6_gpll0_mmpll7_map,
  987. .freq_tbl = ftbl_video_core_clk_src,
  988. .clkr.hw.init = &(struct clk_init_data){
  989. .name = "video_core_clk_src",
  990. .parent_data = mmcc_xo_mmpll0_mmpll8_mmpll3_mmpll6_gpll0_mmpll7,
  991. .num_parents = ARRAY_SIZE(mmcc_xo_mmpll0_mmpll8_mmpll3_mmpll6_gpll0_mmpll7),
  992. .ops = &clk_rcg2_ops,
  993. .flags = CLK_IS_CRITICAL,
  994. },
  995. };
  996. static struct clk_rcg2 vsync_clk_src = {
  997. .cmd_rcgr = 0x2080,
  998. .mnd_width = 0,
  999. .hid_width = 5,
  1000. .parent_map = mmcc_xo_gpll0_gpll0_div_map,
  1001. .freq_tbl = ftbl_dp_aux_clk_src,
  1002. .clkr.hw.init = &(struct clk_init_data){
  1003. .name = "vsync_clk_src",
  1004. .parent_data = mmcc_xo_gpll0_gpll0_div,
  1005. .num_parents = ARRAY_SIZE(mmcc_xo_gpll0_gpll0_div),
  1006. .ops = &clk_rcg2_ops,
  1007. },
  1008. };
  1009. static struct clk_branch bimc_smmu_ahb_clk = {
  1010. .halt_reg = 0xe004,
  1011. .halt_check = BRANCH_VOTED,
  1012. .hwcg_reg = 0xe004,
  1013. .hwcg_bit = 1,
  1014. .clkr = {
  1015. .enable_reg = 0xe004,
  1016. .enable_mask = BIT(0),
  1017. .hw.init = &(struct clk_init_data){
  1018. .name = "bimc_smmu_ahb_clk",
  1019. .parent_hws = (const struct clk_hw *[]){ &ahb_clk_src.clkr.hw },
  1020. .num_parents = 1,
  1021. .ops = &clk_branch2_ops,
  1022. },
  1023. },
  1024. };
  1025. static struct clk_branch bimc_smmu_axi_clk = {
  1026. .halt_reg = 0xe008,
  1027. .halt_check = BRANCH_VOTED,
  1028. .hwcg_reg = 0xe008,
  1029. .hwcg_bit = 1,
  1030. .clkr = {
  1031. .enable_reg = 0xe008,
  1032. .enable_mask = BIT(0),
  1033. .hw.init = &(struct clk_init_data){
  1034. .name = "bimc_smmu_axi_clk",
  1035. .ops = &clk_branch2_ops,
  1036. },
  1037. },
  1038. };
  1039. static struct clk_branch camss_ahb_clk = {
  1040. .halt_reg = 0x348c,
  1041. .halt_check = BRANCH_HALT,
  1042. .hwcg_reg = 0x348c,
  1043. .hwcg_bit = 1,
  1044. .clkr = {
  1045. .enable_reg = 0x348c,
  1046. .enable_mask = BIT(0),
  1047. .hw.init = &(struct clk_init_data){
  1048. .name = "camss_ahb_clk",
  1049. .parent_hws = (const struct clk_hw *[]){ &ahb_clk_src.clkr.hw },
  1050. .num_parents = 1,
  1051. .ops = &clk_branch2_ops,
  1052. },
  1053. },
  1054. };
  1055. static struct clk_branch camss_cci_ahb_clk = {
  1056. .halt_reg = 0x3348,
  1057. .halt_check = BRANCH_HALT,
  1058. .clkr = {
  1059. .enable_reg = 0x3348,
  1060. .enable_mask = BIT(0),
  1061. .hw.init = &(struct clk_init_data){
  1062. .name = "camss_cci_ahb_clk",
  1063. .parent_hws = (const struct clk_hw *[]){ &ahb_clk_src.clkr.hw },
  1064. .num_parents = 1,
  1065. .flags = CLK_SET_RATE_PARENT,
  1066. .ops = &clk_branch2_ops,
  1067. },
  1068. },
  1069. };
  1070. static struct clk_branch camss_cci_clk = {
  1071. .halt_reg = 0x3344,
  1072. .halt_check = BRANCH_HALT,
  1073. .clkr = {
  1074. .enable_reg = 0x3344,
  1075. .enable_mask = BIT(0),
  1076. .hw.init = &(struct clk_init_data){
  1077. .name = "camss_cci_clk",
  1078. .parent_hws = (const struct clk_hw *[]){ &cci_clk_src.clkr.hw },
  1079. .num_parents = 1,
  1080. .flags = CLK_SET_RATE_PARENT,
  1081. .ops = &clk_branch2_ops,
  1082. },
  1083. },
  1084. };
  1085. static struct clk_branch camss_cpp_ahb_clk = {
  1086. .halt_reg = 0x36b4,
  1087. .halt_check = BRANCH_HALT,
  1088. .clkr = {
  1089. .enable_reg = 0x36b4,
  1090. .enable_mask = BIT(0),
  1091. .hw.init = &(struct clk_init_data){
  1092. .name = "camss_cpp_ahb_clk",
  1093. .parent_hws = (const struct clk_hw *[]){ &ahb_clk_src.clkr.hw },
  1094. .num_parents = 1,
  1095. .ops = &clk_branch2_ops,
  1096. },
  1097. },
  1098. };
  1099. static struct clk_branch camss_cpp_axi_clk = {
  1100. .halt_reg = 0x36c4,
  1101. .halt_check = BRANCH_HALT,
  1102. .clkr = {
  1103. .enable_reg = 0x36c4,
  1104. .enable_mask = BIT(0),
  1105. .hw.init = &(struct clk_init_data){
  1106. .name = "camss_cpp_axi_clk",
  1107. .ops = &clk_branch2_ops,
  1108. },
  1109. },
  1110. };
  1111. static struct clk_branch camss_cpp_clk = {
  1112. .halt_reg = 0x36b0,
  1113. .halt_check = BRANCH_HALT,
  1114. .clkr = {
  1115. .enable_reg = 0x36b0,
  1116. .enable_mask = BIT(0),
  1117. .hw.init = &(struct clk_init_data){
  1118. .name = "camss_cpp_clk",
  1119. .parent_hws = (const struct clk_hw *[]){ &cpp_clk_src.clkr.hw },
  1120. .num_parents = 1,
  1121. .flags = CLK_SET_RATE_PARENT,
  1122. .ops = &clk_branch2_ops,
  1123. },
  1124. },
  1125. };
  1126. static struct clk_branch camss_cpp_vbif_ahb_clk = {
  1127. .halt_reg = 0x36c8,
  1128. .halt_check = BRANCH_HALT,
  1129. .clkr = {
  1130. .enable_reg = 0x36c8,
  1131. .enable_mask = BIT(0),
  1132. .hw.init = &(struct clk_init_data){
  1133. .name = "camss_cpp_vbif_ahb_clk",
  1134. .parent_hws = (const struct clk_hw *[]){ &ahb_clk_src.clkr.hw },
  1135. .num_parents = 1,
  1136. .ops = &clk_branch2_ops,
  1137. },
  1138. },
  1139. };
  1140. static struct clk_branch camss_csi0_ahb_clk = {
  1141. .halt_reg = 0x30bc,
  1142. .halt_check = BRANCH_HALT,
  1143. .clkr = {
  1144. .enable_reg = 0x30bc,
  1145. .enable_mask = BIT(0),
  1146. .hw.init = &(struct clk_init_data){
  1147. .name = "camss_csi0_ahb_clk",
  1148. .parent_hws = (const struct clk_hw *[]){ &ahb_clk_src.clkr.hw },
  1149. .num_parents = 1,
  1150. .ops = &clk_branch2_ops,
  1151. },
  1152. },
  1153. };
  1154. static struct clk_branch camss_csi0_clk = {
  1155. .halt_reg = 0x30b4,
  1156. .halt_check = BRANCH_HALT,
  1157. .clkr = {
  1158. .enable_reg = 0x30b4,
  1159. .enable_mask = BIT(0),
  1160. .hw.init = &(struct clk_init_data){
  1161. .name = "camss_csi0_clk",
  1162. .parent_hws = (const struct clk_hw *[]){ &csi0_clk_src.clkr.hw },
  1163. .num_parents = 1,
  1164. .flags = CLK_SET_RATE_PARENT,
  1165. .ops = &clk_branch2_ops,
  1166. },
  1167. },
  1168. };
  1169. static struct clk_branch camss_csi0phytimer_clk = {
  1170. .halt_reg = 0x3024,
  1171. .halt_check = BRANCH_HALT,
  1172. .clkr = {
  1173. .enable_reg = 0x3024,
  1174. .enable_mask = BIT(0),
  1175. .hw.init = &(struct clk_init_data){
  1176. .name = "camss_csi0phytimer_clk",
  1177. .parent_hws = (const struct clk_hw *[]){ &csi0phytimer_clk_src.clkr.hw },
  1178. .num_parents = 1,
  1179. .flags = CLK_SET_RATE_PARENT,
  1180. .ops = &clk_branch2_ops,
  1181. },
  1182. },
  1183. };
  1184. static struct clk_branch camss_csi0pix_clk = {
  1185. .halt_reg = 0x30e4,
  1186. .halt_check = BRANCH_HALT,
  1187. .clkr = {
  1188. .enable_reg = 0x30e4,
  1189. .enable_mask = BIT(0),
  1190. .hw.init = &(struct clk_init_data){
  1191. .name = "camss_csi0pix_clk",
  1192. .parent_hws = (const struct clk_hw *[]){ &csi0_clk_src.clkr.hw },
  1193. .num_parents = 1,
  1194. .ops = &clk_branch2_ops,
  1195. },
  1196. },
  1197. };
  1198. static struct clk_branch camss_csi0rdi_clk = {
  1199. .halt_reg = 0x30d4,
  1200. .halt_check = BRANCH_HALT,
  1201. .clkr = {
  1202. .enable_reg = 0x30d4,
  1203. .enable_mask = BIT(0),
  1204. .hw.init = &(struct clk_init_data){
  1205. .name = "camss_csi0rdi_clk",
  1206. .parent_hws = (const struct clk_hw *[]){ &csi0_clk_src.clkr.hw },
  1207. .num_parents = 1,
  1208. .ops = &clk_branch2_ops,
  1209. },
  1210. },
  1211. };
  1212. static struct clk_branch camss_csi1_ahb_clk = {
  1213. .halt_reg = 0x3128,
  1214. .halt_check = BRANCH_HALT,
  1215. .clkr = {
  1216. .enable_reg = 0x3128,
  1217. .enable_mask = BIT(0),
  1218. .hw.init = &(struct clk_init_data){
  1219. .name = "camss_csi1_ahb_clk",
  1220. .parent_hws = (const struct clk_hw *[]){ &ahb_clk_src.clkr.hw },
  1221. .num_parents = 1,
  1222. .ops = &clk_branch2_ops,
  1223. },
  1224. },
  1225. };
  1226. static struct clk_branch camss_csi1_clk = {
  1227. .halt_reg = 0x3124,
  1228. .halt_check = BRANCH_HALT,
  1229. .clkr = {
  1230. .enable_reg = 0x3124,
  1231. .enable_mask = BIT(0),
  1232. .hw.init = &(struct clk_init_data){
  1233. .name = "camss_csi1_clk",
  1234. .parent_hws = (const struct clk_hw *[]){ &csi1_clk_src.clkr.hw },
  1235. .num_parents = 1,
  1236. .flags = CLK_SET_RATE_PARENT,
  1237. .ops = &clk_branch2_ops,
  1238. },
  1239. },
  1240. };
  1241. static struct clk_branch camss_csi1phytimer_clk = {
  1242. .halt_reg = 0x3054,
  1243. .halt_check = BRANCH_HALT,
  1244. .clkr = {
  1245. .enable_reg = 0x3054,
  1246. .enable_mask = BIT(0),
  1247. .hw.init = &(struct clk_init_data){
  1248. .name = "camss_csi1phytimer_clk",
  1249. .parent_hws = (const struct clk_hw *[]){ &csi1phytimer_clk_src.clkr.hw },
  1250. .num_parents = 1,
  1251. .flags = CLK_SET_RATE_PARENT,
  1252. .ops = &clk_branch2_ops,
  1253. },
  1254. },
  1255. };
  1256. static struct clk_branch camss_csi1pix_clk = {
  1257. .halt_reg = 0x3154,
  1258. .halt_check = BRANCH_HALT,
  1259. .clkr = {
  1260. .enable_reg = 0x3154,
  1261. .enable_mask = BIT(0),
  1262. .hw.init = &(struct clk_init_data){
  1263. .name = "camss_csi1pix_clk",
  1264. .parent_hws = (const struct clk_hw *[]){ &csi1_clk_src.clkr.hw },
  1265. .num_parents = 1,
  1266. .ops = &clk_branch2_ops,
  1267. },
  1268. },
  1269. };
  1270. static struct clk_branch camss_csi1rdi_clk = {
  1271. .halt_reg = 0x3144,
  1272. .halt_check = BRANCH_HALT,
  1273. .clkr = {
  1274. .enable_reg = 0x3144,
  1275. .enable_mask = BIT(0),
  1276. .hw.init = &(struct clk_init_data){
  1277. .name = "camss_csi1rdi_clk",
  1278. .parent_hws = (const struct clk_hw *[]){ &csi1_clk_src.clkr.hw },
  1279. .num_parents = 1,
  1280. .ops = &clk_branch2_ops,
  1281. },
  1282. },
  1283. };
  1284. static struct clk_branch camss_csi2_ahb_clk = {
  1285. .halt_reg = 0x3188,
  1286. .halt_check = BRANCH_HALT,
  1287. .clkr = {
  1288. .enable_reg = 0x3188,
  1289. .enable_mask = BIT(0),
  1290. .hw.init = &(struct clk_init_data){
  1291. .name = "camss_csi2_ahb_clk",
  1292. .parent_hws = (const struct clk_hw *[]){ &ahb_clk_src.clkr.hw },
  1293. .num_parents = 1,
  1294. .ops = &clk_branch2_ops,
  1295. },
  1296. },
  1297. };
  1298. static struct clk_branch camss_csi2_clk = {
  1299. .halt_reg = 0x3184,
  1300. .halt_check = BRANCH_HALT,
  1301. .clkr = {
  1302. .enable_reg = 0x3184,
  1303. .enable_mask = BIT(0),
  1304. .hw.init = &(struct clk_init_data){
  1305. .name = "camss_csi2_clk",
  1306. .parent_hws = (const struct clk_hw *[]){ &csi2_clk_src.clkr.hw },
  1307. .num_parents = 1,
  1308. .flags = CLK_SET_RATE_PARENT,
  1309. .ops = &clk_branch2_ops,
  1310. },
  1311. },
  1312. };
  1313. static struct clk_branch camss_csi2phytimer_clk = {
  1314. .halt_reg = 0x3084,
  1315. .halt_check = BRANCH_HALT,
  1316. .clkr = {
  1317. .enable_reg = 0x3084,
  1318. .enable_mask = BIT(0),
  1319. .hw.init = &(struct clk_init_data){
  1320. .name = "camss_csi2phytimer_clk",
  1321. .parent_hws = (const struct clk_hw *[]){ &csi2phytimer_clk_src.clkr.hw },
  1322. .num_parents = 1,
  1323. .flags = CLK_SET_RATE_PARENT,
  1324. .ops = &clk_branch2_ops,
  1325. },
  1326. },
  1327. };
  1328. static struct clk_branch camss_csi2pix_clk = {
  1329. .halt_reg = 0x31b4,
  1330. .halt_check = BRANCH_HALT,
  1331. .clkr = {
  1332. .enable_reg = 0x31b4,
  1333. .enable_mask = BIT(0),
  1334. .hw.init = &(struct clk_init_data){
  1335. .name = "camss_csi2pix_clk",
  1336. .parent_hws = (const struct clk_hw *[]){ &csi2_clk_src.clkr.hw },
  1337. .num_parents = 1,
  1338. .ops = &clk_branch2_ops,
  1339. },
  1340. },
  1341. };
  1342. static struct clk_branch camss_csi2rdi_clk = {
  1343. .halt_reg = 0x31a4,
  1344. .halt_check = BRANCH_HALT,
  1345. .clkr = {
  1346. .enable_reg = 0x31a4,
  1347. .enable_mask = BIT(0),
  1348. .hw.init = &(struct clk_init_data){
  1349. .name = "camss_csi2rdi_clk",
  1350. .parent_hws = (const struct clk_hw *[]){ &csi2_clk_src.clkr.hw },
  1351. .num_parents = 1,
  1352. .ops = &clk_branch2_ops,
  1353. },
  1354. },
  1355. };
  1356. static struct clk_branch camss_csi3_ahb_clk = {
  1357. .halt_reg = 0x31e8,
  1358. .halt_check = BRANCH_HALT,
  1359. .clkr = {
  1360. .enable_reg = 0x31e8,
  1361. .enable_mask = BIT(0),
  1362. .hw.init = &(struct clk_init_data){
  1363. .name = "camss_csi3_ahb_clk",
  1364. .parent_hws = (const struct clk_hw *[]){ &ahb_clk_src.clkr.hw },
  1365. .num_parents = 1,
  1366. .ops = &clk_branch2_ops,
  1367. },
  1368. },
  1369. };
  1370. static struct clk_branch camss_csi3_clk = {
  1371. .halt_reg = 0x31e4,
  1372. .halt_check = BRANCH_HALT,
  1373. .clkr = {
  1374. .enable_reg = 0x31e4,
  1375. .enable_mask = BIT(0),
  1376. .hw.init = &(struct clk_init_data){
  1377. .name = "camss_csi3_clk",
  1378. .parent_hws = (const struct clk_hw *[]){ &csi3_clk_src.clkr.hw },
  1379. .num_parents = 1,
  1380. .flags = CLK_SET_RATE_PARENT,
  1381. .ops = &clk_branch2_ops,
  1382. },
  1383. },
  1384. };
  1385. static struct clk_branch camss_csi3pix_clk = {
  1386. .halt_reg = 0x3214,
  1387. .halt_check = BRANCH_HALT,
  1388. .clkr = {
  1389. .enable_reg = 0x3214,
  1390. .enable_mask = BIT(0),
  1391. .hw.init = &(struct clk_init_data){
  1392. .name = "camss_csi3pix_clk",
  1393. .parent_hws = (const struct clk_hw *[]){ &csi3_clk_src.clkr.hw },
  1394. .num_parents = 1,
  1395. .ops = &clk_branch2_ops,
  1396. },
  1397. },
  1398. };
  1399. static struct clk_branch camss_csi3rdi_clk = {
  1400. .halt_reg = 0x3204,
  1401. .halt_check = BRANCH_HALT,
  1402. .clkr = {
  1403. .enable_reg = 0x3204,
  1404. .enable_mask = BIT(0),
  1405. .hw.init = &(struct clk_init_data){
  1406. .name = "camss_csi3rdi_clk",
  1407. .parent_hws = (const struct clk_hw *[]){ &csi3_clk_src.clkr.hw },
  1408. .num_parents = 1,
  1409. .ops = &clk_branch2_ops,
  1410. },
  1411. },
  1412. };
  1413. static struct clk_branch camss_csi_vfe0_clk = {
  1414. .halt_reg = 0x3704,
  1415. .halt_check = BRANCH_HALT,
  1416. .clkr = {
  1417. .enable_reg = 0x3704,
  1418. .enable_mask = BIT(0),
  1419. .hw.init = &(struct clk_init_data){
  1420. .name = "camss_csi_vfe0_clk",
  1421. .parent_hws = (const struct clk_hw *[]){ &vfe0_clk_src.clkr.hw },
  1422. .num_parents = 1,
  1423. .ops = &clk_branch2_ops,
  1424. },
  1425. },
  1426. };
  1427. static struct clk_branch camss_csi_vfe1_clk = {
  1428. .halt_reg = 0x3714,
  1429. .halt_check = BRANCH_HALT,
  1430. .clkr = {
  1431. .enable_reg = 0x3714,
  1432. .enable_mask = BIT(0),
  1433. .hw.init = &(struct clk_init_data){
  1434. .name = "camss_csi_vfe1_clk",
  1435. .parent_hws = (const struct clk_hw *[]){ &vfe1_clk_src.clkr.hw },
  1436. .num_parents = 1,
  1437. .ops = &clk_branch2_ops,
  1438. },
  1439. },
  1440. };
  1441. static struct clk_branch camss_csiphy0_clk = {
  1442. .halt_reg = 0x3740,
  1443. .halt_check = BRANCH_HALT,
  1444. .clkr = {
  1445. .enable_reg = 0x3740,
  1446. .enable_mask = BIT(0),
  1447. .hw.init = &(struct clk_init_data){
  1448. .name = "camss_csiphy0_clk",
  1449. .parent_hws = (const struct clk_hw *[]){ &csiphy_clk_src.clkr.hw },
  1450. .num_parents = 1,
  1451. .flags = CLK_SET_RATE_PARENT,
  1452. .ops = &clk_branch2_ops,
  1453. },
  1454. },
  1455. };
  1456. static struct clk_branch camss_csiphy1_clk = {
  1457. .halt_reg = 0x3744,
  1458. .halt_check = BRANCH_HALT,
  1459. .clkr = {
  1460. .enable_reg = 0x3744,
  1461. .enable_mask = BIT(0),
  1462. .hw.init = &(struct clk_init_data){
  1463. .name = "camss_csiphy1_clk",
  1464. .parent_hws = (const struct clk_hw *[]){ &csiphy_clk_src.clkr.hw },
  1465. .num_parents = 1,
  1466. .flags = CLK_SET_RATE_PARENT,
  1467. .ops = &clk_branch2_ops,
  1468. },
  1469. },
  1470. };
  1471. static struct clk_branch camss_csiphy2_clk = {
  1472. .halt_reg = 0x3748,
  1473. .halt_check = BRANCH_HALT,
  1474. .clkr = {
  1475. .enable_reg = 0x3748,
  1476. .enable_mask = BIT(0),
  1477. .hw.init = &(struct clk_init_data){
  1478. .name = "camss_csiphy2_clk",
  1479. .parent_hws = (const struct clk_hw *[]){ &csiphy_clk_src.clkr.hw },
  1480. .num_parents = 1,
  1481. .flags = CLK_SET_RATE_PARENT,
  1482. .ops = &clk_branch2_ops,
  1483. },
  1484. },
  1485. };
  1486. static struct clk_branch camss_cphy_csid0_clk = {
  1487. .halt_reg = 0x3730,
  1488. .halt_check = BRANCH_HALT,
  1489. .clkr = {
  1490. .enable_reg = 0x3730,
  1491. .enable_mask = BIT(0),
  1492. .hw.init = &(struct clk_init_data){
  1493. .name = "camss_cphy_csid0_clk",
  1494. .parent_hws = (const struct clk_hw *[]){ &camss_csiphy0_clk.clkr.hw },
  1495. .num_parents = 1,
  1496. .flags = CLK_SET_RATE_PARENT,
  1497. .ops = &clk_branch2_ops,
  1498. },
  1499. },
  1500. };
  1501. static struct clk_branch camss_cphy_csid1_clk = {
  1502. .halt_reg = 0x3734,
  1503. .halt_check = BRANCH_HALT,
  1504. .clkr = {
  1505. .enable_reg = 0x3734,
  1506. .enable_mask = BIT(0),
  1507. .hw.init = &(struct clk_init_data){
  1508. .name = "camss_cphy_csid1_clk",
  1509. .parent_hws = (const struct clk_hw *[]){ &camss_csiphy1_clk.clkr.hw },
  1510. .num_parents = 1,
  1511. .flags = CLK_SET_RATE_PARENT,
  1512. .ops = &clk_branch2_ops,
  1513. },
  1514. },
  1515. };
  1516. static struct clk_branch camss_cphy_csid2_clk = {
  1517. .halt_reg = 0x3738,
  1518. .halt_check = BRANCH_HALT,
  1519. .clkr = {
  1520. .enable_reg = 0x3738,
  1521. .enable_mask = BIT(0),
  1522. .hw.init = &(struct clk_init_data){
  1523. .name = "camss_cphy_csid2_clk",
  1524. .parent_hws = (const struct clk_hw *[]){ &camss_csiphy2_clk.clkr.hw },
  1525. .num_parents = 1,
  1526. .flags = CLK_SET_RATE_PARENT,
  1527. .ops = &clk_branch2_ops,
  1528. },
  1529. },
  1530. };
  1531. static struct clk_branch camss_cphy_csid3_clk = {
  1532. .halt_reg = 0x373c,
  1533. .halt_check = BRANCH_HALT,
  1534. .clkr = {
  1535. .enable_reg = 0x373c,
  1536. .enable_mask = BIT(0),
  1537. .hw.init = &(struct clk_init_data){
  1538. .name = "camss_cphy_csid3_clk",
  1539. .parent_hws = (const struct clk_hw *[]){ &csiphy_clk_src.clkr.hw },
  1540. .num_parents = 1,
  1541. .flags = CLK_SET_RATE_PARENT,
  1542. .ops = &clk_branch2_ops,
  1543. },
  1544. },
  1545. };
  1546. static struct clk_branch camss_gp0_clk = {
  1547. .halt_reg = 0x3444,
  1548. .halt_check = BRANCH_HALT,
  1549. .clkr = {
  1550. .enable_reg = 0x3444,
  1551. .enable_mask = BIT(0),
  1552. .hw.init = &(struct clk_init_data){
  1553. .name = "camss_gp0_clk",
  1554. .parent_hws = (const struct clk_hw *[]){ &camss_gp0_clk_src.clkr.hw },
  1555. .num_parents = 1,
  1556. .flags = CLK_SET_RATE_PARENT,
  1557. .ops = &clk_branch2_ops,
  1558. },
  1559. },
  1560. };
  1561. static struct clk_branch camss_gp1_clk = {
  1562. .halt_reg = 0x3474,
  1563. .halt_check = BRANCH_HALT,
  1564. .clkr = {
  1565. .enable_reg = 0x3474,
  1566. .enable_mask = BIT(0),
  1567. .hw.init = &(struct clk_init_data){
  1568. .name = "camss_gp1_clk",
  1569. .parent_hws = (const struct clk_hw *[]){ &camss_gp1_clk_src.clkr.hw },
  1570. .num_parents = 1,
  1571. .flags = CLK_SET_RATE_PARENT,
  1572. .ops = &clk_branch2_ops,
  1573. },
  1574. },
  1575. };
  1576. static struct clk_branch camss_ispif_ahb_clk = {
  1577. .halt_reg = 0x3224,
  1578. .halt_check = BRANCH_HALT,
  1579. .clkr = {
  1580. .enable_reg = 0x3224,
  1581. .enable_mask = BIT(0),
  1582. .hw.init = &(struct clk_init_data){
  1583. .name = "camss_ispif_ahb_clk",
  1584. .parent_hws = (const struct clk_hw *[]){ &ahb_clk_src.clkr.hw },
  1585. .num_parents = 1,
  1586. .ops = &clk_branch2_ops,
  1587. },
  1588. },
  1589. };
  1590. static struct clk_branch camss_jpeg0_clk = {
  1591. .halt_reg = 0x35a8,
  1592. .halt_check = BRANCH_HALT,
  1593. .clkr = {
  1594. .enable_reg = 0x35a8,
  1595. .enable_mask = BIT(0),
  1596. .hw.init = &(struct clk_init_data){
  1597. .name = "camss_jpeg0_clk",
  1598. .parent_hws = (const struct clk_hw *[]){ &jpeg0_clk_src.clkr.hw },
  1599. .num_parents = 1,
  1600. .flags = CLK_SET_RATE_PARENT,
  1601. .ops = &clk_branch2_ops,
  1602. },
  1603. },
  1604. };
  1605. static struct clk_branch camss_jpeg_ahb_clk = {
  1606. .halt_reg = 0x35b4,
  1607. .halt_check = BRANCH_HALT,
  1608. .clkr = {
  1609. .enable_reg = 0x35b4,
  1610. .enable_mask = BIT(0),
  1611. .hw.init = &(struct clk_init_data){
  1612. .name = "camss_jpeg_ahb_clk",
  1613. .parent_hws = (const struct clk_hw *[]){ &ahb_clk_src.clkr.hw },
  1614. .num_parents = 1,
  1615. .ops = &clk_branch2_ops,
  1616. },
  1617. },
  1618. };
  1619. static struct clk_branch camss_jpeg_axi_clk = {
  1620. .halt_reg = 0x35b8,
  1621. .halt_check = BRANCH_HALT,
  1622. .clkr = {
  1623. .enable_reg = 0x35b8,
  1624. .enable_mask = BIT(0),
  1625. .hw.init = &(struct clk_init_data){
  1626. .name = "camss_jpeg_axi_clk",
  1627. .ops = &clk_branch2_ops,
  1628. },
  1629. },
  1630. };
  1631. static struct clk_branch throttle_camss_axi_clk = {
  1632. .halt_reg = 0x3c3c,
  1633. .halt_check = BRANCH_HALT,
  1634. .clkr = {
  1635. .enable_reg = 0x3c3c,
  1636. .enable_mask = BIT(0),
  1637. .hw.init = &(struct clk_init_data){
  1638. .name = "throttle_camss_axi_clk",
  1639. .ops = &clk_branch2_ops,
  1640. },
  1641. },
  1642. };
  1643. static struct clk_branch camss_mclk0_clk = {
  1644. .halt_reg = 0x3384,
  1645. .halt_check = BRANCH_HALT,
  1646. .clkr = {
  1647. .enable_reg = 0x3384,
  1648. .enable_mask = BIT(0),
  1649. .hw.init = &(struct clk_init_data){
  1650. .name = "camss_mclk0_clk",
  1651. .parent_hws = (const struct clk_hw *[]){ &mclk0_clk_src.clkr.hw },
  1652. .num_parents = 1,
  1653. .flags = CLK_SET_RATE_PARENT,
  1654. .ops = &clk_branch2_ops,
  1655. },
  1656. },
  1657. };
  1658. static struct clk_branch camss_mclk1_clk = {
  1659. .halt_reg = 0x33b4,
  1660. .halt_check = BRANCH_HALT,
  1661. .clkr = {
  1662. .enable_reg = 0x33b4,
  1663. .enable_mask = BIT(0),
  1664. .hw.init = &(struct clk_init_data){
  1665. .name = "camss_mclk1_clk",
  1666. .parent_hws = (const struct clk_hw *[]){ &mclk1_clk_src.clkr.hw },
  1667. .num_parents = 1,
  1668. .flags = CLK_SET_RATE_PARENT,
  1669. .ops = &clk_branch2_ops,
  1670. },
  1671. },
  1672. };
  1673. static struct clk_branch camss_mclk2_clk = {
  1674. .halt_reg = 0x33e4,
  1675. .halt_check = BRANCH_HALT,
  1676. .clkr = {
  1677. .enable_reg = 0x33e4,
  1678. .enable_mask = BIT(0),
  1679. .hw.init = &(struct clk_init_data){
  1680. .name = "camss_mclk2_clk",
  1681. .parent_hws = (const struct clk_hw *[]){ &mclk2_clk_src.clkr.hw },
  1682. .num_parents = 1,
  1683. .flags = CLK_SET_RATE_PARENT,
  1684. .ops = &clk_branch2_ops,
  1685. },
  1686. },
  1687. };
  1688. static struct clk_branch camss_mclk3_clk = {
  1689. .halt_reg = 0x3414,
  1690. .halt_check = BRANCH_HALT,
  1691. .clkr = {
  1692. .enable_reg = 0x3414,
  1693. .enable_mask = BIT(0),
  1694. .hw.init = &(struct clk_init_data){
  1695. .name = "camss_mclk3_clk",
  1696. .parent_hws = (const struct clk_hw *[]){ &mclk3_clk_src.clkr.hw },
  1697. .num_parents = 1,
  1698. .flags = CLK_SET_RATE_PARENT,
  1699. .ops = &clk_branch2_ops,
  1700. },
  1701. },
  1702. };
  1703. static struct clk_branch camss_micro_ahb_clk = {
  1704. .halt_reg = 0x3494,
  1705. .halt_check = BRANCH_HALT,
  1706. .clkr = {
  1707. .enable_reg = 0x3494,
  1708. .enable_mask = BIT(0),
  1709. .hw.init = &(struct clk_init_data){
  1710. .name = "camss_micro_ahb_clk",
  1711. .parent_hws = (const struct clk_hw *[]){ &ahb_clk_src.clkr.hw },
  1712. .num_parents = 1,
  1713. .ops = &clk_branch2_ops,
  1714. },
  1715. },
  1716. };
  1717. static struct clk_branch camss_top_ahb_clk = {
  1718. .halt_reg = 0x3484,
  1719. .halt_check = BRANCH_HALT,
  1720. .clkr = {
  1721. .enable_reg = 0x3484,
  1722. .enable_mask = BIT(0),
  1723. .hw.init = &(struct clk_init_data){
  1724. .name = "camss_top_ahb_clk",
  1725. .parent_hws = (const struct clk_hw *[]){ &ahb_clk_src.clkr.hw },
  1726. .num_parents = 1,
  1727. .ops = &clk_branch2_ops,
  1728. },
  1729. },
  1730. };
  1731. static struct clk_branch camss_vfe0_ahb_clk = {
  1732. .halt_reg = 0x3668,
  1733. .halt_check = BRANCH_HALT,
  1734. .clkr = {
  1735. .enable_reg = 0x3668,
  1736. .enable_mask = BIT(0),
  1737. .hw.init = &(struct clk_init_data){
  1738. .name = "camss_vfe0_ahb_clk",
  1739. .parent_hws = (const struct clk_hw *[]){ &ahb_clk_src.clkr.hw },
  1740. .num_parents = 1,
  1741. .ops = &clk_branch2_ops,
  1742. },
  1743. },
  1744. };
  1745. static struct clk_branch camss_vfe0_clk = {
  1746. .halt_reg = 0x36a8,
  1747. .halt_check = BRANCH_HALT,
  1748. .clkr = {
  1749. .enable_reg = 0x36a8,
  1750. .enable_mask = BIT(0),
  1751. .hw.init = &(struct clk_init_data){
  1752. .name = "camss_vfe0_clk",
  1753. .parent_hws = (const struct clk_hw *[]){ &vfe0_clk_src.clkr.hw },
  1754. .num_parents = 1,
  1755. .flags = CLK_SET_RATE_PARENT,
  1756. .ops = &clk_branch2_ops,
  1757. },
  1758. },
  1759. };
  1760. static struct clk_branch camss_vfe0_stream_clk = {
  1761. .halt_reg = 0x3720,
  1762. .halt_check = BRANCH_HALT,
  1763. .clkr = {
  1764. .enable_reg = 0x3720,
  1765. .enable_mask = BIT(0),
  1766. .hw.init = &(struct clk_init_data){
  1767. .name = "camss_vfe0_stream_clk",
  1768. .parent_hws = (const struct clk_hw *[]){ &vfe0_clk_src.clkr.hw },
  1769. .num_parents = 1,
  1770. .ops = &clk_branch2_ops,
  1771. },
  1772. },
  1773. };
  1774. static struct clk_branch camss_vfe1_ahb_clk = {
  1775. .halt_reg = 0x3678,
  1776. .halt_check = BRANCH_HALT,
  1777. .clkr = {
  1778. .enable_reg = 0x3678,
  1779. .enable_mask = BIT(0),
  1780. .hw.init = &(struct clk_init_data){
  1781. .name = "camss_vfe1_ahb_clk",
  1782. .parent_hws = (const struct clk_hw *[]){ &ahb_clk_src.clkr.hw },
  1783. .num_parents = 1,
  1784. .ops = &clk_branch2_ops,
  1785. },
  1786. },
  1787. };
  1788. static struct clk_branch camss_vfe1_clk = {
  1789. .halt_reg = 0x36ac,
  1790. .halt_check = BRANCH_HALT,
  1791. .clkr = {
  1792. .enable_reg = 0x36ac,
  1793. .enable_mask = BIT(0),
  1794. .hw.init = &(struct clk_init_data){
  1795. .name = "camss_vfe1_clk",
  1796. .parent_hws = (const struct clk_hw *[]){ &vfe1_clk_src.clkr.hw },
  1797. .num_parents = 1,
  1798. .flags = CLK_SET_RATE_PARENT,
  1799. .ops = &clk_branch2_ops,
  1800. },
  1801. },
  1802. };
  1803. static struct clk_branch camss_vfe1_stream_clk = {
  1804. .halt_reg = 0x3724,
  1805. .halt_check = BRANCH_HALT,
  1806. .clkr = {
  1807. .enable_reg = 0x3724,
  1808. .enable_mask = BIT(0),
  1809. .hw.init = &(struct clk_init_data){
  1810. .name = "camss_vfe1_stream_clk",
  1811. .parent_hws = (const struct clk_hw *[]){ &vfe1_clk_src.clkr.hw },
  1812. .num_parents = 1,
  1813. .ops = &clk_branch2_ops,
  1814. },
  1815. },
  1816. };
  1817. static struct clk_branch camss_vfe_vbif_ahb_clk = {
  1818. .halt_reg = 0x36b8,
  1819. .halt_check = BRANCH_HALT,
  1820. .clkr = {
  1821. .enable_reg = 0x36b8,
  1822. .enable_mask = BIT(0),
  1823. .hw.init = &(struct clk_init_data){
  1824. .name = "camss_vfe_vbif_ahb_clk",
  1825. .parent_hws = (const struct clk_hw *[]){ &ahb_clk_src.clkr.hw },
  1826. .num_parents = 1,
  1827. .ops = &clk_branch2_ops,
  1828. },
  1829. },
  1830. };
  1831. static struct clk_branch camss_vfe_vbif_axi_clk = {
  1832. .halt_reg = 0x36bc,
  1833. .halt_check = BRANCH_HALT,
  1834. .clkr = {
  1835. .enable_reg = 0x36bc,
  1836. .enable_mask = BIT(0),
  1837. .hw.init = &(struct clk_init_data){
  1838. .name = "camss_vfe_vbif_axi_clk",
  1839. .ops = &clk_branch2_ops,
  1840. },
  1841. },
  1842. };
  1843. static struct clk_branch csiphy_ahb2crif_clk = {
  1844. .halt_reg = 0x374c,
  1845. .halt_check = BRANCH_HALT,
  1846. .hwcg_reg = 0x374c,
  1847. .hwcg_bit = 1,
  1848. .clkr = {
  1849. .enable_reg = 0x374c,
  1850. .enable_mask = BIT(0),
  1851. .hw.init = &(struct clk_init_data){
  1852. .name = "csiphy_ahb2crif_clk",
  1853. .parent_hws = (const struct clk_hw *[]){ &ahb_clk_src.clkr.hw },
  1854. .num_parents = 1,
  1855. .ops = &clk_branch2_ops,
  1856. },
  1857. },
  1858. };
  1859. static struct clk_branch mdss_ahb_clk = {
  1860. .halt_reg = 0x2308,
  1861. .halt_check = BRANCH_HALT,
  1862. .hwcg_reg = 0x8a004,
  1863. .hwcg_bit = 1,
  1864. .clkr = {
  1865. .enable_reg = 0x2308,
  1866. .enable_mask = BIT(0),
  1867. .hw.init = &(struct clk_init_data){
  1868. .name = "mdss_ahb_clk",
  1869. .parent_hws = (const struct clk_hw *[]){ &ahb_clk_src.clkr.hw },
  1870. .flags = CLK_SET_RATE_PARENT,
  1871. .num_parents = 1,
  1872. .ops = &clk_branch2_ops,
  1873. },
  1874. },
  1875. };
  1876. static const struct freq_tbl ftbl_axi_clk_src[] = {
  1877. F(75000000, P_GPLL0, 8, 0, 0),
  1878. F(171428571, P_GPLL0, 3.5, 0, 0),
  1879. F(240000000, P_GPLL0, 2.5, 0, 0),
  1880. F(323200000, P_MMPLL0, 2.5, 0, 0),
  1881. F(406000000, P_MMPLL0, 2, 0, 0),
  1882. { }
  1883. };
  1884. /* RO to linux */
  1885. static struct clk_rcg2 axi_clk_src = {
  1886. .cmd_rcgr = 0xd000,
  1887. .hid_width = 5,
  1888. .parent_map = mmcc_xo_mmpll0_mmpll4_mmpll7_mmpll10_gpll0_gpll0_div_map,
  1889. .freq_tbl = ftbl_axi_clk_src,
  1890. .clkr.hw.init = &(struct clk_init_data){
  1891. .name = "axi_clk_src",
  1892. .parent_data = mmcc_xo_mmpll0_mmpll4_mmpll7_mmpll10_gpll0_gpll0_div,
  1893. .num_parents = ARRAY_SIZE(mmcc_xo_mmpll0_mmpll4_mmpll7_mmpll10_gpll0_gpll0_div),
  1894. .ops = &clk_rcg2_ops,
  1895. },
  1896. };
  1897. static struct clk_branch mdss_axi_clk = {
  1898. .halt_reg = 0x2310,
  1899. .halt_check = BRANCH_HALT,
  1900. .clkr = {
  1901. .enable_reg = 0x2310,
  1902. .enable_mask = BIT(0),
  1903. .hw.init = &(struct clk_init_data){
  1904. .name = "mdss_axi_clk",
  1905. .parent_hws = (const struct clk_hw *[]){ &axi_clk_src.clkr.hw },
  1906. .ops = &clk_branch2_ops,
  1907. },
  1908. },
  1909. };
  1910. static struct clk_branch throttle_mdss_axi_clk = {
  1911. .halt_reg = 0x246c,
  1912. .halt_check = BRANCH_HALT,
  1913. .hwcg_reg = 0x246c,
  1914. .hwcg_bit = 1,
  1915. .clkr = {
  1916. .enable_reg = 0x246c,
  1917. .enable_mask = BIT(0),
  1918. .hw.init = &(struct clk_init_data){
  1919. .name = "throttle_mdss_axi_clk",
  1920. .ops = &clk_branch2_ops,
  1921. },
  1922. },
  1923. };
  1924. static struct clk_branch mdss_byte0_clk = {
  1925. .halt_reg = 0x233c,
  1926. .halt_check = BRANCH_HALT,
  1927. .clkr = {
  1928. .enable_reg = 0x233c,
  1929. .enable_mask = BIT(0),
  1930. .hw.init = &(struct clk_init_data){
  1931. .name = "mdss_byte0_clk",
  1932. .parent_hws = (const struct clk_hw *[]){ &byte0_clk_src.clkr.hw },
  1933. .num_parents = 1,
  1934. .flags = CLK_SET_RATE_PARENT,
  1935. .ops = &clk_branch2_ops,
  1936. },
  1937. },
  1938. };
  1939. static struct clk_regmap_div mdss_byte0_intf_div_clk = {
  1940. .reg = 0x237c,
  1941. .shift = 0,
  1942. .width = 2,
  1943. /*
  1944. * NOTE: Op does not work for div-3. Current assumption is that div-3
  1945. * is not a recommended setting for this divider.
  1946. */
  1947. .clkr = {
  1948. .hw.init = &(struct clk_init_data){
  1949. .name = "mdss_byte0_intf_div_clk",
  1950. .parent_hws = (const struct clk_hw *[]){ &byte0_clk_src.clkr.hw },
  1951. .num_parents = 1,
  1952. .ops = &clk_regmap_div_ops,
  1953. .flags = CLK_GET_RATE_NOCACHE,
  1954. },
  1955. },
  1956. };
  1957. static struct clk_branch mdss_byte0_intf_clk = {
  1958. .halt_reg = 0x2374,
  1959. .halt_check = BRANCH_HALT,
  1960. .clkr = {
  1961. .enable_reg = 0x2374,
  1962. .enable_mask = BIT(0),
  1963. .hw.init = &(struct clk_init_data){
  1964. .name = "mdss_byte0_intf_clk",
  1965. .parent_hws = (const struct clk_hw *[]){ &mdss_byte0_intf_div_clk.clkr.hw },
  1966. .num_parents = 1,
  1967. .flags = CLK_SET_RATE_PARENT | CLK_GET_RATE_NOCACHE,
  1968. .ops = &clk_branch2_ops,
  1969. },
  1970. },
  1971. };
  1972. static struct clk_branch mdss_byte1_clk = {
  1973. .halt_reg = 0x2340,
  1974. .halt_check = BRANCH_HALT,
  1975. .clkr = {
  1976. .enable_reg = 0x2340,
  1977. .enable_mask = BIT(0),
  1978. .hw.init = &(struct clk_init_data){
  1979. .name = "mdss_byte1_clk",
  1980. .parent_hws = (const struct clk_hw *[]){ &byte1_clk_src.clkr.hw },
  1981. .num_parents = 1,
  1982. .flags = CLK_SET_RATE_PARENT,
  1983. .ops = &clk_branch2_ops,
  1984. },
  1985. },
  1986. };
  1987. static struct clk_regmap_div mdss_byte1_intf_div_clk = {
  1988. .reg = 0x2380,
  1989. .shift = 0,
  1990. .width = 2,
  1991. /*
  1992. * NOTE: Op does not work for div-3. Current assumption is that div-3
  1993. * is not a recommended setting for this divider.
  1994. */
  1995. .clkr = {
  1996. .hw.init = &(struct clk_init_data){
  1997. .name = "mdss_byte1_intf_div_clk",
  1998. .parent_hws = (const struct clk_hw *[]){ &byte1_clk_src.clkr.hw },
  1999. .num_parents = 1,
  2000. .ops = &clk_regmap_div_ops,
  2001. .flags = CLK_GET_RATE_NOCACHE,
  2002. },
  2003. },
  2004. };
  2005. static struct clk_branch mdss_byte1_intf_clk = {
  2006. .halt_reg = 0x2378,
  2007. .halt_check = BRANCH_HALT,
  2008. .clkr = {
  2009. .enable_reg = 0x2378,
  2010. .enable_mask = BIT(0),
  2011. .hw.init = &(struct clk_init_data){
  2012. .name = "mdss_byte1_intf_clk",
  2013. .parent_hws = (const struct clk_hw *[]){ &mdss_byte1_intf_div_clk.clkr.hw },
  2014. .num_parents = 1,
  2015. .flags = CLK_SET_RATE_PARENT | CLK_GET_RATE_NOCACHE,
  2016. .ops = &clk_branch2_ops,
  2017. },
  2018. },
  2019. };
  2020. static struct clk_branch mdss_dp_aux_clk = {
  2021. .halt_reg = 0x2364,
  2022. .halt_check = BRANCH_HALT,
  2023. .clkr = {
  2024. .enable_reg = 0x2364,
  2025. .enable_mask = BIT(0),
  2026. .hw.init = &(struct clk_init_data){
  2027. .name = "mdss_dp_aux_clk",
  2028. .parent_hws = (const struct clk_hw *[]){ &dp_aux_clk_src.clkr.hw },
  2029. .num_parents = 1,
  2030. .flags = CLK_SET_RATE_PARENT,
  2031. .ops = &clk_branch2_ops,
  2032. },
  2033. },
  2034. };
  2035. static struct clk_branch mdss_dp_crypto_clk = {
  2036. .halt_reg = 0x235c,
  2037. .halt_check = BRANCH_HALT,
  2038. .clkr = {
  2039. .enable_reg = 0x235c,
  2040. .enable_mask = BIT(0),
  2041. .hw.init = &(struct clk_init_data){
  2042. .name = "mdss_dp_crypto_clk",
  2043. .parent_hws = (const struct clk_hw *[]){ &dp_crypto_clk_src.clkr.hw },
  2044. .num_parents = 1,
  2045. .flags = CLK_SET_RATE_PARENT,
  2046. .ops = &clk_branch2_ops,
  2047. },
  2048. },
  2049. };
  2050. static struct clk_branch mdss_dp_gtc_clk = {
  2051. .halt_reg = 0x2368,
  2052. .halt_check = BRANCH_HALT,
  2053. .clkr = {
  2054. .enable_reg = 0x2368,
  2055. .enable_mask = BIT(0),
  2056. .hw.init = &(struct clk_init_data){
  2057. .name = "mdss_dp_gtc_clk",
  2058. .parent_hws = (const struct clk_hw *[]){ &dp_gtc_clk_src.clkr.hw },
  2059. .num_parents = 1,
  2060. .flags = CLK_SET_RATE_PARENT,
  2061. .ops = &clk_branch2_ops,
  2062. },
  2063. },
  2064. };
  2065. static struct clk_branch mdss_dp_link_clk = {
  2066. .halt_reg = 0x2354,
  2067. .halt_check = BRANCH_HALT,
  2068. .clkr = {
  2069. .enable_reg = 0x2354,
  2070. .enable_mask = BIT(0),
  2071. .hw.init = &(struct clk_init_data){
  2072. .name = "mdss_dp_link_clk",
  2073. .parent_hws = (const struct clk_hw *[]){ &dp_link_clk_src.clkr.hw },
  2074. .num_parents = 1,
  2075. .flags = CLK_GET_RATE_NOCACHE | CLK_SET_RATE_PARENT,
  2076. .ops = &clk_branch2_ops,
  2077. },
  2078. },
  2079. };
  2080. /* Reset state of MDSS_DP_LINK_INTF_DIV is 0x3 (div-4) */
  2081. static struct clk_branch mdss_dp_link_intf_clk = {
  2082. .halt_reg = 0x2358,
  2083. .halt_check = BRANCH_HALT,
  2084. .clkr = {
  2085. .enable_reg = 0x2358,
  2086. .enable_mask = BIT(0),
  2087. .hw.init = &(struct clk_init_data){
  2088. .name = "mdss_dp_link_intf_clk",
  2089. .parent_hws = (const struct clk_hw *[]){ &dp_link_clk_src.clkr.hw },
  2090. .num_parents = 1,
  2091. .ops = &clk_branch2_ops,
  2092. },
  2093. },
  2094. };
  2095. static struct clk_branch mdss_dp_pixel_clk = {
  2096. .halt_reg = 0x2360,
  2097. .halt_check = BRANCH_HALT,
  2098. .clkr = {
  2099. .enable_reg = 0x2360,
  2100. .enable_mask = BIT(0),
  2101. .hw.init = &(struct clk_init_data){
  2102. .name = "mdss_dp_pixel_clk",
  2103. .parent_hws = (const struct clk_hw *[]){ &dp_pixel_clk_src.clkr.hw },
  2104. .num_parents = 1,
  2105. .flags = CLK_GET_RATE_NOCACHE | CLK_SET_RATE_PARENT,
  2106. .ops = &clk_branch2_ops,
  2107. },
  2108. },
  2109. };
  2110. static struct clk_branch mdss_esc0_clk = {
  2111. .halt_reg = 0x2344,
  2112. .halt_check = BRANCH_HALT,
  2113. .clkr = {
  2114. .enable_reg = 0x2344,
  2115. .enable_mask = BIT(0),
  2116. .hw.init = &(struct clk_init_data){
  2117. .name = "mdss_esc0_clk",
  2118. .parent_hws = (const struct clk_hw *[]){ &esc0_clk_src.clkr.hw },
  2119. .num_parents = 1,
  2120. .flags = CLK_SET_RATE_PARENT,
  2121. .ops = &clk_branch2_ops,
  2122. },
  2123. },
  2124. };
  2125. static struct clk_branch mdss_esc1_clk = {
  2126. .halt_reg = 0x2348,
  2127. .halt_check = BRANCH_HALT,
  2128. .clkr = {
  2129. .enable_reg = 0x2348,
  2130. .enable_mask = BIT(0),
  2131. .hw.init = &(struct clk_init_data){
  2132. .name = "mdss_esc1_clk",
  2133. .parent_hws = (const struct clk_hw *[]){ &esc1_clk_src.clkr.hw },
  2134. .num_parents = 1,
  2135. .flags = CLK_SET_RATE_PARENT,
  2136. .ops = &clk_branch2_ops,
  2137. },
  2138. },
  2139. };
  2140. static struct clk_branch mdss_hdmi_dp_ahb_clk = {
  2141. .halt_reg = 0x230c,
  2142. .halt_check = BRANCH_HALT,
  2143. .clkr = {
  2144. .enable_reg = 0x230c,
  2145. .enable_mask = BIT(0),
  2146. .hw.init = &(struct clk_init_data){
  2147. .name = "mdss_hdmi_dp_ahb_clk",
  2148. .parent_hws = (const struct clk_hw *[]){ &ahb_clk_src.clkr.hw },
  2149. .num_parents = 1,
  2150. .ops = &clk_branch2_ops,
  2151. },
  2152. },
  2153. };
  2154. static struct clk_branch mdss_mdp_clk = {
  2155. .halt_reg = 0x231c,
  2156. .halt_check = BRANCH_HALT,
  2157. .clkr = {
  2158. .enable_reg = 0x231c,
  2159. .enable_mask = BIT(0),
  2160. .hw.init = &(struct clk_init_data){
  2161. .name = "mdss_mdp_clk",
  2162. .parent_hws = (const struct clk_hw *[]){ &mdp_clk_src.clkr.hw },
  2163. .num_parents = 1,
  2164. .flags = CLK_SET_RATE_PARENT,
  2165. .ops = &clk_branch2_ops,
  2166. },
  2167. },
  2168. };
  2169. static struct clk_branch mdss_pclk0_clk = {
  2170. .halt_reg = 0x2314,
  2171. .halt_check = BRANCH_HALT,
  2172. .clkr = {
  2173. .enable_reg = 0x2314,
  2174. .enable_mask = BIT(0),
  2175. .hw.init = &(struct clk_init_data){
  2176. .name = "mdss_pclk0_clk",
  2177. .parent_hws = (const struct clk_hw *[]){ &pclk0_clk_src.clkr.hw },
  2178. .num_parents = 1,
  2179. .flags = CLK_SET_RATE_PARENT,
  2180. .ops = &clk_branch2_ops,
  2181. },
  2182. },
  2183. };
  2184. static struct clk_branch mdss_pclk1_clk = {
  2185. .halt_reg = 0x2318,
  2186. .halt_check = BRANCH_HALT,
  2187. .clkr = {
  2188. .enable_reg = 0x2318,
  2189. .enable_mask = BIT(0),
  2190. .hw.init = &(struct clk_init_data){
  2191. .name = "mdss_pclk1_clk",
  2192. .parent_hws = (const struct clk_hw *[]){ &pclk1_clk_src.clkr.hw },
  2193. .num_parents = 1,
  2194. .flags = CLK_SET_RATE_PARENT,
  2195. .ops = &clk_branch2_ops,
  2196. },
  2197. },
  2198. };
  2199. static struct clk_branch mdss_rot_clk = {
  2200. .halt_reg = 0x2350,
  2201. .halt_check = BRANCH_HALT,
  2202. .clkr = {
  2203. .enable_reg = 0x2350,
  2204. .enable_mask = BIT(0),
  2205. .hw.init = &(struct clk_init_data){
  2206. .name = "mdss_rot_clk",
  2207. .parent_hws = (const struct clk_hw *[]){ &rot_clk_src.clkr.hw },
  2208. .num_parents = 1,
  2209. .flags = CLK_SET_RATE_PARENT,
  2210. .ops = &clk_branch2_ops,
  2211. },
  2212. },
  2213. };
  2214. static struct clk_branch mdss_vsync_clk = {
  2215. .halt_reg = 0x2328,
  2216. .halt_check = BRANCH_HALT,
  2217. .clkr = {
  2218. .enable_reg = 0x2328,
  2219. .enable_mask = BIT(0),
  2220. .hw.init = &(struct clk_init_data){
  2221. .name = "mdss_vsync_clk",
  2222. .parent_hws = (const struct clk_hw *[]){ &vsync_clk_src.clkr.hw },
  2223. .num_parents = 1,
  2224. .flags = CLK_SET_RATE_PARENT,
  2225. .ops = &clk_branch2_ops,
  2226. },
  2227. },
  2228. };
  2229. static struct clk_branch mnoc_ahb_clk = {
  2230. .halt_reg = 0x5024,
  2231. .halt_check = BRANCH_VOTED,
  2232. .clkr = {
  2233. .enable_reg = 0x5024,
  2234. .enable_mask = BIT(0),
  2235. .hw.init = &(struct clk_init_data){
  2236. .name = "mnoc_ahb_clk",
  2237. .parent_hws = (const struct clk_hw *[]){ &ahb_clk_src.clkr.hw },
  2238. .num_parents = 1,
  2239. .flags = CLK_SET_RATE_PARENT,
  2240. .ops = &clk_branch2_ops,
  2241. },
  2242. },
  2243. };
  2244. static struct clk_branch misc_ahb_clk = {
  2245. .halt_reg = 0x328,
  2246. .halt_check = BRANCH_HALT,
  2247. .hwcg_reg = 0x328,
  2248. .hwcg_bit = 1,
  2249. .clkr = {
  2250. .enable_reg = 0x328,
  2251. .enable_mask = BIT(0),
  2252. .hw.init = &(struct clk_init_data){
  2253. .name = "misc_ahb_clk",
  2254. /*
  2255. * Dependency to be enabled before the branch is
  2256. * enabled.
  2257. */
  2258. .parent_hws = (const struct clk_hw *[]){ &mnoc_ahb_clk.clkr.hw },
  2259. .num_parents = 1,
  2260. .ops = &clk_branch2_ops,
  2261. },
  2262. },
  2263. };
  2264. static struct clk_branch misc_cxo_clk = {
  2265. .halt_reg = 0x324,
  2266. .halt_check = BRANCH_HALT,
  2267. .clkr = {
  2268. .enable_reg = 0x324,
  2269. .enable_mask = BIT(0),
  2270. .hw.init = &(struct clk_init_data){
  2271. .name = "misc_cxo_clk",
  2272. .parent_data = &(const struct clk_parent_data){
  2273. .fw_name = "xo",
  2274. },
  2275. .num_parents = 1,
  2276. .ops = &clk_branch2_ops,
  2277. },
  2278. },
  2279. };
  2280. static struct clk_branch snoc_dvm_axi_clk = {
  2281. .halt_reg = 0xe040,
  2282. .halt_check = BRANCH_HALT,
  2283. .clkr = {
  2284. .enable_reg = 0xe040,
  2285. .enable_mask = BIT(0),
  2286. .hw.init = &(struct clk_init_data){
  2287. .name = "snoc_dvm_axi_clk",
  2288. .ops = &clk_branch2_ops,
  2289. },
  2290. },
  2291. };
  2292. static struct clk_branch video_ahb_clk = {
  2293. .halt_reg = 0x1030,
  2294. .halt_check = BRANCH_HALT,
  2295. .hwcg_reg = 0x1030,
  2296. .hwcg_bit = 1,
  2297. .clkr = {
  2298. .enable_reg = 0x1030,
  2299. .enable_mask = BIT(0),
  2300. .hw.init = &(struct clk_init_data){
  2301. .name = "video_ahb_clk",
  2302. .parent_hws = (const struct clk_hw *[]){ &ahb_clk_src.clkr.hw },
  2303. .num_parents = 1,
  2304. .ops = &clk_branch2_ops,
  2305. },
  2306. },
  2307. };
  2308. static struct clk_branch video_axi_clk = {
  2309. .halt_reg = 0x1034,
  2310. .halt_check = BRANCH_HALT,
  2311. .clkr = {
  2312. .enable_reg = 0x1034,
  2313. .enable_mask = BIT(0),
  2314. .hw.init = &(struct clk_init_data){
  2315. .name = "video_axi_clk",
  2316. .ops = &clk_branch2_ops,
  2317. },
  2318. },
  2319. };
  2320. static struct clk_branch throttle_video_axi_clk = {
  2321. .halt_reg = 0x118c,
  2322. .halt_check = BRANCH_HALT,
  2323. .hwcg_reg = 0x118c,
  2324. .hwcg_bit = 1,
  2325. .clkr = {
  2326. .enable_reg = 0x118c,
  2327. .enable_mask = BIT(0),
  2328. .hw.init = &(struct clk_init_data){
  2329. .name = "throttle_video_axi_clk",
  2330. .ops = &clk_branch2_ops,
  2331. },
  2332. },
  2333. };
  2334. static struct clk_branch video_core_clk = {
  2335. .halt_reg = 0x1028,
  2336. .halt_check = BRANCH_HALT,
  2337. .clkr = {
  2338. .enable_reg = 0x1028,
  2339. .enable_mask = BIT(0),
  2340. .hw.init = &(struct clk_init_data){
  2341. .name = "video_core_clk",
  2342. .parent_hws = (const struct clk_hw *[]){ &video_core_clk_src.clkr.hw },
  2343. .num_parents = 1,
  2344. .flags = CLK_SET_RATE_PARENT,
  2345. .ops = &clk_branch2_ops,
  2346. },
  2347. },
  2348. };
  2349. static struct clk_branch video_subcore0_clk = {
  2350. .halt_reg = 0x1048,
  2351. .halt_check = BRANCH_HALT_SKIP,
  2352. .clkr = {
  2353. .enable_reg = 0x1048,
  2354. .enable_mask = BIT(0),
  2355. .hw.init = &(struct clk_init_data){
  2356. .name = "video_subcore0_clk",
  2357. .parent_hws = (const struct clk_hw *[]){ &video_core_clk_src.clkr.hw },
  2358. .num_parents = 1,
  2359. .flags = CLK_SET_RATE_PARENT | CLK_GET_RATE_NOCACHE,
  2360. .ops = &clk_branch2_ops,
  2361. },
  2362. },
  2363. };
  2364. static struct gdsc venus_gdsc = {
  2365. .gdscr = 0x1024,
  2366. .cxcs = (unsigned int[]){ 0x1028, 0x1034, 0x1048 },
  2367. .cxc_count = 3,
  2368. .pd = {
  2369. .name = "venus",
  2370. },
  2371. .pwrsts = PWRSTS_OFF_ON,
  2372. };
  2373. static struct gdsc venus_core0_gdsc = {
  2374. .gdscr = 0x1040,
  2375. .pd = {
  2376. .name = "venus_core0",
  2377. },
  2378. .parent = &venus_gdsc.pd,
  2379. .pwrsts = PWRSTS_OFF_ON,
  2380. .flags = HW_CTRL,
  2381. };
  2382. static struct gdsc mdss_gdsc = {
  2383. .gdscr = 0x2304,
  2384. .pd = {
  2385. .name = "mdss",
  2386. },
  2387. .cxcs = (unsigned int []){ 0x2040 },
  2388. .cxc_count = 1,
  2389. .pwrsts = PWRSTS_OFF_ON,
  2390. };
  2391. static struct gdsc camss_top_gdsc = {
  2392. .gdscr = 0x34a0,
  2393. .pd = {
  2394. .name = "camss_top",
  2395. },
  2396. .pwrsts = PWRSTS_OFF_ON,
  2397. };
  2398. static struct gdsc camss_vfe0_gdsc = {
  2399. .gdscr = 0x3664,
  2400. .pd = {
  2401. .name = "camss_vfe0",
  2402. },
  2403. .parent = &camss_top_gdsc.pd,
  2404. .pwrsts = PWRSTS_OFF_ON,
  2405. };
  2406. static struct gdsc camss_vfe1_gdsc = {
  2407. .gdscr = 0x3674,
  2408. .pd = {
  2409. .name = "camss_vfe1_gdsc",
  2410. },
  2411. .parent = &camss_top_gdsc.pd,
  2412. .pwrsts = PWRSTS_OFF_ON,
  2413. };
  2414. static struct gdsc camss_cpp_gdsc = {
  2415. .gdscr = 0x36d4,
  2416. .pd = {
  2417. .name = "camss_cpp",
  2418. },
  2419. .parent = &camss_top_gdsc.pd,
  2420. .pwrsts = PWRSTS_OFF_ON,
  2421. };
  2422. /* This GDSC seems to hang the whole multimedia subsystem.
  2423. static struct gdsc bimc_smmu_gdsc = {
  2424. .gdscr = 0xe020,
  2425. .gds_hw_ctrl = 0xe024,
  2426. .pd = {
  2427. .name = "bimc_smmu",
  2428. },
  2429. .pwrsts = PWRSTS_OFF_ON,
  2430. .parent = &bimc_smmu_gdsc.pd,
  2431. .flags = HW_CTRL,
  2432. };
  2433. */
  2434. static struct clk_regmap *mmcc_660_clocks[] = {
  2435. [AHB_CLK_SRC] = &ahb_clk_src.clkr,
  2436. [BYTE0_CLK_SRC] = &byte0_clk_src.clkr,
  2437. [BYTE1_CLK_SRC] = &byte1_clk_src.clkr,
  2438. [CAMSS_GP0_CLK_SRC] = &camss_gp0_clk_src.clkr,
  2439. [CAMSS_GP1_CLK_SRC] = &camss_gp1_clk_src.clkr,
  2440. [CCI_CLK_SRC] = &cci_clk_src.clkr,
  2441. [CPP_CLK_SRC] = &cpp_clk_src.clkr,
  2442. [CSI0_CLK_SRC] = &csi0_clk_src.clkr,
  2443. [CSI0PHYTIMER_CLK_SRC] = &csi0phytimer_clk_src.clkr,
  2444. [CSI1_CLK_SRC] = &csi1_clk_src.clkr,
  2445. [CSI1PHYTIMER_CLK_SRC] = &csi1phytimer_clk_src.clkr,
  2446. [CSI2_CLK_SRC] = &csi2_clk_src.clkr,
  2447. [CSI2PHYTIMER_CLK_SRC] = &csi2phytimer_clk_src.clkr,
  2448. [CSI3_CLK_SRC] = &csi3_clk_src.clkr,
  2449. [CSIPHY_CLK_SRC] = &csiphy_clk_src.clkr,
  2450. [DP_AUX_CLK_SRC] = &dp_aux_clk_src.clkr,
  2451. [DP_CRYPTO_CLK_SRC] = &dp_crypto_clk_src.clkr,
  2452. [DP_GTC_CLK_SRC] = &dp_gtc_clk_src.clkr,
  2453. [DP_LINK_CLK_SRC] = &dp_link_clk_src.clkr,
  2454. [DP_PIXEL_CLK_SRC] = &dp_pixel_clk_src.clkr,
  2455. [ESC0_CLK_SRC] = &esc0_clk_src.clkr,
  2456. [ESC1_CLK_SRC] = &esc1_clk_src.clkr,
  2457. [JPEG0_CLK_SRC] = &jpeg0_clk_src.clkr,
  2458. [MCLK0_CLK_SRC] = &mclk0_clk_src.clkr,
  2459. [MCLK1_CLK_SRC] = &mclk1_clk_src.clkr,
  2460. [MCLK2_CLK_SRC] = &mclk2_clk_src.clkr,
  2461. [MCLK3_CLK_SRC] = &mclk3_clk_src.clkr,
  2462. [MDP_CLK_SRC] = &mdp_clk_src.clkr,
  2463. [MMPLL0_PLL] = &mmpll0.clkr,
  2464. [MMPLL10_PLL] = &mmpll10.clkr,
  2465. [MMPLL3_PLL] = &mmpll3.clkr,
  2466. [MMPLL4_PLL] = &mmpll4.clkr,
  2467. [MMPLL5_PLL] = &mmpll5.clkr,
  2468. [MMPLL6_PLL] = &mmpll6.clkr,
  2469. [MMPLL7_PLL] = &mmpll7.clkr,
  2470. [MMPLL8_PLL] = &mmpll8.clkr,
  2471. [BIMC_SMMU_AHB_CLK] = &bimc_smmu_ahb_clk.clkr,
  2472. [BIMC_SMMU_AXI_CLK] = &bimc_smmu_axi_clk.clkr,
  2473. [CAMSS_AHB_CLK] = &camss_ahb_clk.clkr,
  2474. [CAMSS_CCI_AHB_CLK] = &camss_cci_ahb_clk.clkr,
  2475. [CAMSS_CCI_CLK] = &camss_cci_clk.clkr,
  2476. [CAMSS_CPHY_CSID0_CLK] = &camss_cphy_csid0_clk.clkr,
  2477. [CAMSS_CPHY_CSID1_CLK] = &camss_cphy_csid1_clk.clkr,
  2478. [CAMSS_CPHY_CSID2_CLK] = &camss_cphy_csid2_clk.clkr,
  2479. [CAMSS_CPHY_CSID3_CLK] = &camss_cphy_csid3_clk.clkr,
  2480. [CAMSS_CPP_AHB_CLK] = &camss_cpp_ahb_clk.clkr,
  2481. [CAMSS_CPP_AXI_CLK] = &camss_cpp_axi_clk.clkr,
  2482. [CAMSS_CPP_CLK] = &camss_cpp_clk.clkr,
  2483. [CAMSS_CPP_VBIF_AHB_CLK] = &camss_cpp_vbif_ahb_clk.clkr,
  2484. [CAMSS_CSI0_AHB_CLK] = &camss_csi0_ahb_clk.clkr,
  2485. [CAMSS_CSI0_CLK] = &camss_csi0_clk.clkr,
  2486. [CAMSS_CSI0PHYTIMER_CLK] = &camss_csi0phytimer_clk.clkr,
  2487. [CAMSS_CSI0PIX_CLK] = &camss_csi0pix_clk.clkr,
  2488. [CAMSS_CSI0RDI_CLK] = &camss_csi0rdi_clk.clkr,
  2489. [CAMSS_CSI1_AHB_CLK] = &camss_csi1_ahb_clk.clkr,
  2490. [CAMSS_CSI1_CLK] = &camss_csi1_clk.clkr,
  2491. [CAMSS_CSI1PHYTIMER_CLK] = &camss_csi1phytimer_clk.clkr,
  2492. [CAMSS_CSI1PIX_CLK] = &camss_csi1pix_clk.clkr,
  2493. [CAMSS_CSI1RDI_CLK] = &camss_csi1rdi_clk.clkr,
  2494. [CAMSS_CSI2_AHB_CLK] = &camss_csi2_ahb_clk.clkr,
  2495. [CAMSS_CSI2_CLK] = &camss_csi2_clk.clkr,
  2496. [CAMSS_CSI2PHYTIMER_CLK] = &camss_csi2phytimer_clk.clkr,
  2497. [CAMSS_CSI2PIX_CLK] = &camss_csi2pix_clk.clkr,
  2498. [CAMSS_CSI2RDI_CLK] = &camss_csi2rdi_clk.clkr,
  2499. [CAMSS_CSI3_AHB_CLK] = &camss_csi3_ahb_clk.clkr,
  2500. [CAMSS_CSI3_CLK] = &camss_csi3_clk.clkr,
  2501. [CAMSS_CSI3PIX_CLK] = &camss_csi3pix_clk.clkr,
  2502. [CAMSS_CSI3RDI_CLK] = &camss_csi3rdi_clk.clkr,
  2503. [CAMSS_CSI_VFE0_CLK] = &camss_csi_vfe0_clk.clkr,
  2504. [CAMSS_CSI_VFE1_CLK] = &camss_csi_vfe1_clk.clkr,
  2505. [CAMSS_CSIPHY0_CLK] = &camss_csiphy0_clk.clkr,
  2506. [CAMSS_CSIPHY1_CLK] = &camss_csiphy1_clk.clkr,
  2507. [CAMSS_CSIPHY2_CLK] = &camss_csiphy2_clk.clkr,
  2508. [CAMSS_GP0_CLK] = &camss_gp0_clk.clkr,
  2509. [CAMSS_GP1_CLK] = &camss_gp1_clk.clkr,
  2510. [CAMSS_ISPIF_AHB_CLK] = &camss_ispif_ahb_clk.clkr,
  2511. [CAMSS_JPEG0_CLK] = &camss_jpeg0_clk.clkr,
  2512. [CAMSS_JPEG_AHB_CLK] = &camss_jpeg_ahb_clk.clkr,
  2513. [CAMSS_JPEG_AXI_CLK] = &camss_jpeg_axi_clk.clkr,
  2514. [CAMSS_MCLK0_CLK] = &camss_mclk0_clk.clkr,
  2515. [CAMSS_MCLK1_CLK] = &camss_mclk1_clk.clkr,
  2516. [CAMSS_MCLK2_CLK] = &camss_mclk2_clk.clkr,
  2517. [CAMSS_MCLK3_CLK] = &camss_mclk3_clk.clkr,
  2518. [CAMSS_MICRO_AHB_CLK] = &camss_micro_ahb_clk.clkr,
  2519. [CAMSS_TOP_AHB_CLK] = &camss_top_ahb_clk.clkr,
  2520. [CAMSS_VFE0_AHB_CLK] = &camss_vfe0_ahb_clk.clkr,
  2521. [CAMSS_VFE0_CLK] = &camss_vfe0_clk.clkr,
  2522. [CAMSS_VFE0_STREAM_CLK] = &camss_vfe0_stream_clk.clkr,
  2523. [CAMSS_VFE1_AHB_CLK] = &camss_vfe1_ahb_clk.clkr,
  2524. [CAMSS_VFE1_CLK] = &camss_vfe1_clk.clkr,
  2525. [CAMSS_VFE1_STREAM_CLK] = &camss_vfe1_stream_clk.clkr,
  2526. [CAMSS_VFE_VBIF_AHB_CLK] = &camss_vfe_vbif_ahb_clk.clkr,
  2527. [CAMSS_VFE_VBIF_AXI_CLK] = &camss_vfe_vbif_axi_clk.clkr,
  2528. [CSIPHY_AHB2CRIF_CLK] = &csiphy_ahb2crif_clk.clkr,
  2529. [MDSS_AHB_CLK] = &mdss_ahb_clk.clkr,
  2530. [MDSS_AXI_CLK] = &mdss_axi_clk.clkr,
  2531. [MDSS_BYTE0_CLK] = &mdss_byte0_clk.clkr,
  2532. [MDSS_BYTE0_INTF_CLK] = &mdss_byte0_intf_clk.clkr,
  2533. [MDSS_BYTE0_INTF_DIV_CLK] = &mdss_byte0_intf_div_clk.clkr,
  2534. [MDSS_BYTE1_CLK] = &mdss_byte1_clk.clkr,
  2535. [MDSS_BYTE1_INTF_CLK] = &mdss_byte1_intf_clk.clkr,
  2536. [MDSS_DP_AUX_CLK] = &mdss_dp_aux_clk.clkr,
  2537. [MDSS_DP_CRYPTO_CLK] = &mdss_dp_crypto_clk.clkr,
  2538. [MDSS_DP_GTC_CLK] = &mdss_dp_gtc_clk.clkr,
  2539. [MDSS_DP_LINK_CLK] = &mdss_dp_link_clk.clkr,
  2540. [MDSS_DP_LINK_INTF_CLK] = &mdss_dp_link_intf_clk.clkr,
  2541. [MDSS_DP_PIXEL_CLK] = &mdss_dp_pixel_clk.clkr,
  2542. [MDSS_ESC0_CLK] = &mdss_esc0_clk.clkr,
  2543. [MDSS_ESC1_CLK] = &mdss_esc1_clk.clkr,
  2544. [MDSS_HDMI_DP_AHB_CLK] = &mdss_hdmi_dp_ahb_clk.clkr,
  2545. [MDSS_MDP_CLK] = &mdss_mdp_clk.clkr,
  2546. [MDSS_PCLK0_CLK] = &mdss_pclk0_clk.clkr,
  2547. [MDSS_PCLK1_CLK] = &mdss_pclk1_clk.clkr,
  2548. [MDSS_ROT_CLK] = &mdss_rot_clk.clkr,
  2549. [MDSS_VSYNC_CLK] = &mdss_vsync_clk.clkr,
  2550. [MISC_AHB_CLK] = &misc_ahb_clk.clkr,
  2551. [MISC_CXO_CLK] = &misc_cxo_clk.clkr,
  2552. [MNOC_AHB_CLK] = &mnoc_ahb_clk.clkr,
  2553. [SNOC_DVM_AXI_CLK] = &snoc_dvm_axi_clk.clkr,
  2554. [THROTTLE_CAMSS_AXI_CLK] = &throttle_camss_axi_clk.clkr,
  2555. [THROTTLE_MDSS_AXI_CLK] = &throttle_mdss_axi_clk.clkr,
  2556. [THROTTLE_VIDEO_AXI_CLK] = &throttle_video_axi_clk.clkr,
  2557. [VIDEO_AHB_CLK] = &video_ahb_clk.clkr,
  2558. [VIDEO_AXI_CLK] = &video_axi_clk.clkr,
  2559. [VIDEO_CORE_CLK] = &video_core_clk.clkr,
  2560. [VIDEO_SUBCORE0_CLK] = &video_subcore0_clk.clkr,
  2561. [PCLK0_CLK_SRC] = &pclk0_clk_src.clkr,
  2562. [PCLK1_CLK_SRC] = &pclk1_clk_src.clkr,
  2563. [ROT_CLK_SRC] = &rot_clk_src.clkr,
  2564. [VFE0_CLK_SRC] = &vfe0_clk_src.clkr,
  2565. [VFE1_CLK_SRC] = &vfe1_clk_src.clkr,
  2566. [VIDEO_CORE_CLK_SRC] = &video_core_clk_src.clkr,
  2567. [VSYNC_CLK_SRC] = &vsync_clk_src.clkr,
  2568. [MDSS_BYTE1_INTF_DIV_CLK] = &mdss_byte1_intf_div_clk.clkr,
  2569. [AXI_CLK_SRC] = &axi_clk_src.clkr,
  2570. };
  2571. static struct gdsc *mmcc_sdm660_gdscs[] = {
  2572. [VENUS_GDSC] = &venus_gdsc,
  2573. [VENUS_CORE0_GDSC] = &venus_core0_gdsc,
  2574. [MDSS_GDSC] = &mdss_gdsc,
  2575. [CAMSS_TOP_GDSC] = &camss_top_gdsc,
  2576. [CAMSS_VFE0_GDSC] = &camss_vfe0_gdsc,
  2577. [CAMSS_VFE1_GDSC] = &camss_vfe1_gdsc,
  2578. [CAMSS_CPP_GDSC] = &camss_cpp_gdsc,
  2579. };
  2580. static const struct qcom_reset_map mmcc_660_resets[] = {
  2581. [MDSS_BCR] = { 0x2300 },
  2582. [CAMSS_MICRO_BCR] = { 0x3490 },
  2583. };
  2584. static const struct regmap_config mmcc_660_regmap_config = {
  2585. .reg_bits = 32,
  2586. .reg_stride = 4,
  2587. .val_bits = 32,
  2588. .max_register = 0x40000,
  2589. .fast_io = true,
  2590. };
  2591. static const struct qcom_cc_desc mmcc_660_desc = {
  2592. .config = &mmcc_660_regmap_config,
  2593. .clks = mmcc_660_clocks,
  2594. .num_clks = ARRAY_SIZE(mmcc_660_clocks),
  2595. .resets = mmcc_660_resets,
  2596. .num_resets = ARRAY_SIZE(mmcc_660_resets),
  2597. .gdscs = mmcc_sdm660_gdscs,
  2598. .num_gdscs = ARRAY_SIZE(mmcc_sdm660_gdscs),
  2599. };
  2600. static const struct of_device_id mmcc_660_match_table[] = {
  2601. { .compatible = "qcom,mmcc-sdm660" },
  2602. { .compatible = "qcom,mmcc-sdm630", .data = (void *)1UL },
  2603. { }
  2604. };
  2605. MODULE_DEVICE_TABLE(of, mmcc_660_match_table);
  2606. static void sdm630_clock_override(void)
  2607. {
  2608. /* SDM630 has only one DSI */
  2609. mmcc_660_desc.clks[BYTE1_CLK_SRC] = NULL;
  2610. mmcc_660_desc.clks[MDSS_BYTE1_CLK] = NULL;
  2611. mmcc_660_desc.clks[MDSS_BYTE1_INTF_DIV_CLK] = NULL;
  2612. mmcc_660_desc.clks[MDSS_BYTE1_INTF_CLK] = NULL;
  2613. mmcc_660_desc.clks[ESC1_CLK_SRC] = NULL;
  2614. mmcc_660_desc.clks[MDSS_ESC1_CLK] = NULL;
  2615. mmcc_660_desc.clks[PCLK1_CLK_SRC] = NULL;
  2616. mmcc_660_desc.clks[MDSS_PCLK1_CLK] = NULL;
  2617. }
  2618. static int mmcc_660_probe(struct platform_device *pdev)
  2619. {
  2620. struct regmap *regmap;
  2621. bool is_sdm630;
  2622. is_sdm630 = !!device_get_match_data(&pdev->dev);
  2623. regmap = qcom_cc_map(pdev, &mmcc_660_desc);
  2624. if (IS_ERR(regmap))
  2625. return PTR_ERR(regmap);
  2626. if (is_sdm630)
  2627. sdm630_clock_override();
  2628. clk_alpha_pll_configure(&mmpll3, regmap, &mmpll3_config);
  2629. clk_alpha_pll_configure(&mmpll4, regmap, &mmpll4_config);
  2630. clk_alpha_pll_configure(&mmpll5, regmap, &mmpll5_config);
  2631. clk_alpha_pll_configure(&mmpll7, regmap, &mmpll7_config);
  2632. clk_alpha_pll_configure(&mmpll8, regmap, &mmpll8_config);
  2633. clk_alpha_pll_configure(&mmpll10, regmap, &mmpll10_config);
  2634. return qcom_cc_really_probe(&pdev->dev, &mmcc_660_desc, regmap);
  2635. }
  2636. static struct platform_driver mmcc_660_driver = {
  2637. .probe = mmcc_660_probe,
  2638. .driver = {
  2639. .name = "mmcc-sdm660",
  2640. .of_match_table = mmcc_660_match_table,
  2641. },
  2642. };
  2643. module_platform_driver(mmcc_660_driver);
  2644. MODULE_DESCRIPTION("Qualcomm SDM630/SDM660 MMCC driver");
  2645. MODULE_LICENSE("GPL v2");