mmcc-msm8994.c 66 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563156415651566156715681569157015711572157315741575157615771578157915801581158215831584158515861587158815891590159115921593159415951596159715981599160016011602160316041605160616071608160916101611161216131614161516161617161816191620162116221623162416251626162716281629163016311632163316341635163616371638163916401641164216431644164516461647164816491650165116521653165416551656165716581659166016611662166316641665166616671668166916701671167216731674167516761677167816791680168116821683168416851686168716881689169016911692169316941695169616971698169917001701170217031704170517061707170817091710171117121713171417151716171717181719172017211722172317241725172617271728172917301731173217331734173517361737173817391740174117421743174417451746174717481749175017511752175317541755175617571758175917601761176217631764176517661767176817691770177117721773177417751776177717781779178017811782178317841785178617871788178917901791179217931794179517961797179817991800180118021803180418051806180718081809181018111812181318141815181618171818181918201821182218231824182518261827182818291830183118321833183418351836183718381839184018411842184318441845184618471848184918501851185218531854185518561857185818591860186118621863186418651866186718681869187018711872187318741875187618771878187918801881188218831884188518861887188818891890189118921893189418951896189718981899190019011902190319041905190619071908190919101911191219131914191519161917191819191920192119221923192419251926192719281929193019311932193319341935193619371938193919401941194219431944194519461947194819491950195119521953195419551956195719581959196019611962196319641965196619671968196919701971197219731974197519761977197819791980198119821983198419851986198719881989199019911992199319941995199619971998199920002001200220032004200520062007200820092010201120122013201420152016201720182019202020212022202320242025202620272028202920302031203220332034203520362037203820392040204120422043204420452046204720482049205020512052205320542055205620572058205920602061206220632064206520662067206820692070207120722073207420752076207720782079208020812082208320842085208620872088208920902091209220932094209520962097209820992100210121022103210421052106210721082109211021112112211321142115211621172118211921202121212221232124212521262127212821292130213121322133213421352136213721382139214021412142214321442145214621472148214921502151215221532154215521562157215821592160216121622163216421652166216721682169217021712172217321742175217621772178217921802181218221832184218521862187218821892190219121922193219421952196219721982199220022012202220322042205220622072208220922102211221222132214221522162217221822192220222122222223222422252226222722282229223022312232223322342235223622372238223922402241224222432244224522462247224822492250225122522253225422552256225722582259226022612262226322642265226622672268226922702271227222732274227522762277227822792280228122822283228422852286228722882289229022912292229322942295229622972298229923002301230223032304230523062307230823092310231123122313231423152316231723182319232023212322232323242325232623272328232923302331233223332334233523362337233823392340234123422343234423452346234723482349235023512352235323542355235623572358235923602361236223632364236523662367236823692370237123722373237423752376237723782379238023812382238323842385238623872388238923902391239223932394239523962397239823992400240124022403240424052406240724082409241024112412241324142415241624172418241924202421242224232424242524262427242824292430243124322433243424352436243724382439244024412442244324442445244624472448244924502451245224532454245524562457245824592460246124622463246424652466246724682469247024712472247324742475247624772478247924802481248224832484248524862487248824892490249124922493249424952496249724982499250025012502250325042505250625072508250925102511251225132514251525162517251825192520252125222523252425252526252725282529253025312532253325342535253625372538253925402541254225432544254525462547254825492550255125522553255425552556255725582559256025612562256325642565256625672568256925702571257225732574257525762577257825792580258125822583258425852586258725882589259025912592259325942595259625972598259926002601260226032604260526062607260826092610261126122613261426152616261726182619
  1. // SPDX-License-Identifier: GPL-2.0-only
  2. /*
  3. * Copyright (c) 2021, Konrad Dybcio <konrad.dybcio@somainline.org>
  4. */
  5. #include <linux/kernel.h>
  6. #include <linux/bitops.h>
  7. #include <linux/err.h>
  8. #include <linux/platform_device.h>
  9. #include <linux/module.h>
  10. #include <linux/of.h>
  11. #include <linux/clk-provider.h>
  12. #include <linux/regmap.h>
  13. #include <linux/reset-controller.h>
  14. #include <linux/clk.h>
  15. #include <dt-bindings/clock/qcom,mmcc-msm8994.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_GPLL0,
  27. P_MMPLL0,
  28. P_MMPLL1,
  29. P_MMPLL3,
  30. P_MMPLL4,
  31. P_MMPLL5, /* Is this one even used by anything? Downstream doesn't tell. */
  32. P_DSI0PLL,
  33. P_DSI1PLL,
  34. P_DSI0PLL_BYTE,
  35. P_DSI1PLL_BYTE,
  36. P_HDMIPLL,
  37. };
  38. static const struct parent_map mmcc_xo_gpll0_map[] = {
  39. { P_XO, 0 },
  40. { P_GPLL0, 5 }
  41. };
  42. static const struct clk_parent_data mmcc_xo_gpll0[] = {
  43. { .fw_name = "xo" },
  44. { .fw_name = "gpll0" },
  45. };
  46. static const struct parent_map mmss_xo_hdmi_map[] = {
  47. { P_XO, 0 },
  48. { P_HDMIPLL, 3 }
  49. };
  50. static const struct clk_parent_data mmss_xo_hdmi[] = {
  51. { .fw_name = "xo" },
  52. { .fw_name = "hdmipll" },
  53. };
  54. static const struct parent_map mmcc_xo_dsi0pll_dsi1pll_map[] = {
  55. { P_XO, 0 },
  56. { P_DSI0PLL, 1 },
  57. { P_DSI1PLL, 2 }
  58. };
  59. static const struct clk_parent_data mmcc_xo_dsi0pll_dsi1pll[] = {
  60. { .fw_name = "xo" },
  61. { .fw_name = "dsi0pll" },
  62. { .fw_name = "dsi1pll" },
  63. };
  64. static const struct parent_map mmcc_xo_dsibyte_map[] = {
  65. { P_XO, 0 },
  66. { P_DSI0PLL_BYTE, 1 },
  67. { P_DSI1PLL_BYTE, 2 }
  68. };
  69. static const struct clk_parent_data mmcc_xo_dsibyte[] = {
  70. { .fw_name = "xo" },
  71. { .fw_name = "dsi0pllbyte" },
  72. { .fw_name = "dsi1pllbyte" },
  73. };
  74. static const struct pll_vco mmpll_p_vco[] = {
  75. { 250000000, 500000000, 3 },
  76. { 500000000, 1000000000, 2 },
  77. { 1000000000, 1500000000, 1 },
  78. { 1500000000, 2000000000, 0 },
  79. };
  80. static const struct pll_vco mmpll_t_vco[] = {
  81. { 500000000, 1500000000, 0 },
  82. };
  83. static const struct alpha_pll_config mmpll_p_config = {
  84. .post_div_mask = 0xf00,
  85. };
  86. static struct clk_alpha_pll mmpll0_early = {
  87. .offset = 0x0,
  88. .regs = clk_alpha_pll_regs[CLK_ALPHA_PLL_TYPE_DEFAULT],
  89. .vco_table = mmpll_p_vco,
  90. .num_vco = ARRAY_SIZE(mmpll_p_vco),
  91. .clkr = {
  92. .enable_reg = 0x100,
  93. .enable_mask = BIT(0),
  94. .hw.init = &(struct clk_init_data){
  95. .name = "mmpll0_early",
  96. .parent_data = &(const struct clk_parent_data){
  97. .fw_name = "xo",
  98. },
  99. .num_parents = 1,
  100. .ops = &clk_alpha_pll_ops,
  101. },
  102. },
  103. };
  104. static struct clk_alpha_pll_postdiv mmpll0 = {
  105. .offset = 0x0,
  106. .regs = clk_alpha_pll_regs[CLK_ALPHA_PLL_TYPE_DEFAULT],
  107. .width = 4,
  108. .clkr.hw.init = &(struct clk_init_data){
  109. .name = "mmpll0",
  110. .parent_hws = (const struct clk_hw *[]){ &mmpll0_early.clkr.hw },
  111. .num_parents = 1,
  112. .ops = &clk_alpha_pll_postdiv_ops,
  113. .flags = CLK_SET_RATE_PARENT,
  114. },
  115. };
  116. static struct clk_alpha_pll mmpll1_early = {
  117. .offset = 0x30,
  118. .regs = clk_alpha_pll_regs[CLK_ALPHA_PLL_TYPE_DEFAULT],
  119. .vco_table = mmpll_p_vco,
  120. .num_vco = ARRAY_SIZE(mmpll_p_vco),
  121. .clkr = {
  122. .enable_reg = 0x100,
  123. .enable_mask = BIT(1),
  124. .hw.init = &(struct clk_init_data){
  125. .name = "mmpll1_early",
  126. .parent_data = &(const struct clk_parent_data){
  127. .fw_name = "xo",
  128. },
  129. .num_parents = 1,
  130. .ops = &clk_alpha_pll_ops,
  131. }
  132. },
  133. };
  134. static struct clk_alpha_pll_postdiv mmpll1 = {
  135. .offset = 0x30,
  136. .regs = clk_alpha_pll_regs[CLK_ALPHA_PLL_TYPE_DEFAULT],
  137. .width = 4,
  138. .clkr.hw.init = &(struct clk_init_data){
  139. .name = "mmpll1",
  140. .parent_hws = (const struct clk_hw *[]){ &mmpll1_early.clkr.hw },
  141. .num_parents = 1,
  142. .ops = &clk_alpha_pll_postdiv_ops,
  143. .flags = CLK_SET_RATE_PARENT,
  144. },
  145. };
  146. static struct clk_alpha_pll mmpll3_early = {
  147. .offset = 0x60,
  148. .regs = clk_alpha_pll_regs[CLK_ALPHA_PLL_TYPE_DEFAULT],
  149. .vco_table = mmpll_p_vco,
  150. .num_vco = ARRAY_SIZE(mmpll_p_vco),
  151. .clkr.hw.init = &(struct clk_init_data){
  152. .name = "mmpll3_early",
  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. static struct clk_alpha_pll_postdiv mmpll3 = {
  161. .offset = 0x60,
  162. .regs = clk_alpha_pll_regs[CLK_ALPHA_PLL_TYPE_DEFAULT],
  163. .width = 4,
  164. .clkr.hw.init = &(struct clk_init_data){
  165. .name = "mmpll3",
  166. .parent_hws = (const struct clk_hw *[]){ &mmpll3_early.clkr.hw },
  167. .num_parents = 1,
  168. .ops = &clk_alpha_pll_postdiv_ops,
  169. .flags = CLK_SET_RATE_PARENT,
  170. },
  171. };
  172. static struct clk_alpha_pll mmpll4_early = {
  173. .offset = 0x90,
  174. .regs = clk_alpha_pll_regs[CLK_ALPHA_PLL_TYPE_DEFAULT],
  175. .vco_table = mmpll_t_vco,
  176. .num_vco = ARRAY_SIZE(mmpll_t_vco),
  177. .clkr.hw.init = &(struct clk_init_data){
  178. .name = "mmpll4_early",
  179. .parent_data = &(const struct clk_parent_data){
  180. .fw_name = "xo",
  181. },
  182. .num_parents = 1,
  183. .ops = &clk_alpha_pll_ops,
  184. },
  185. };
  186. static struct clk_alpha_pll_postdiv mmpll4 = {
  187. .offset = 0x90,
  188. .regs = clk_alpha_pll_regs[CLK_ALPHA_PLL_TYPE_DEFAULT],
  189. .width = 2,
  190. .clkr.hw.init = &(struct clk_init_data){
  191. .name = "mmpll4",
  192. .parent_hws = (const struct clk_hw *[]){ &mmpll4_early.clkr.hw },
  193. .num_parents = 1,
  194. .ops = &clk_alpha_pll_postdiv_ops,
  195. .flags = CLK_SET_RATE_PARENT,
  196. },
  197. };
  198. static const struct parent_map mmcc_xo_gpll0_mmpll1_map[] = {
  199. { P_XO, 0 },
  200. { P_GPLL0, 5 },
  201. { P_MMPLL1, 2 }
  202. };
  203. static const struct clk_parent_data mmcc_xo_gpll0_mmpll1[] = {
  204. { .fw_name = "xo" },
  205. { .fw_name = "gpll0" },
  206. { .hw = &mmpll1.clkr.hw },
  207. };
  208. static const struct parent_map mmcc_xo_gpll0_mmpll0_map[] = {
  209. { P_XO, 0 },
  210. { P_GPLL0, 5 },
  211. { P_MMPLL0, 1 }
  212. };
  213. static const struct clk_parent_data mmcc_xo_gpll0_mmpll0[] = {
  214. { .fw_name = "xo" },
  215. { .fw_name = "gpll0" },
  216. { .hw = &mmpll0.clkr.hw },
  217. };
  218. static const struct parent_map mmcc_xo_gpll0_mmpll0_mmpll3_map[] = {
  219. { P_XO, 0 },
  220. { P_GPLL0, 5 },
  221. { P_MMPLL0, 1 },
  222. { P_MMPLL3, 3 }
  223. };
  224. static const struct clk_parent_data mmcc_xo_gpll0_mmpll0_mmpll3[] = {
  225. { .fw_name = "xo" },
  226. { .fw_name = "gpll0" },
  227. { .hw = &mmpll0.clkr.hw },
  228. { .hw = &mmpll3.clkr.hw },
  229. };
  230. static const struct parent_map mmcc_xo_gpll0_mmpll0_mmpll4_map[] = {
  231. { P_XO, 0 },
  232. { P_GPLL0, 5 },
  233. { P_MMPLL0, 1 },
  234. { P_MMPLL4, 3 }
  235. };
  236. static const struct clk_parent_data mmcc_xo_gpll0_mmpll0_mmpll4[] = {
  237. { .fw_name = "xo" },
  238. { .fw_name = "gpll0" },
  239. { .hw = &mmpll0.clkr.hw },
  240. { .hw = &mmpll4.clkr.hw },
  241. };
  242. static struct clk_alpha_pll mmpll5_early = {
  243. .offset = 0xc0,
  244. .regs = clk_alpha_pll_regs[CLK_ALPHA_PLL_TYPE_DEFAULT],
  245. .vco_table = mmpll_p_vco,
  246. .num_vco = ARRAY_SIZE(mmpll_p_vco),
  247. .clkr.hw.init = &(struct clk_init_data){
  248. .name = "mmpll5_early",
  249. .parent_data = &(const struct clk_parent_data){
  250. .fw_name = "xo",
  251. },
  252. .num_parents = 1,
  253. .ops = &clk_alpha_pll_ops,
  254. },
  255. };
  256. static struct clk_alpha_pll_postdiv mmpll5 = {
  257. .offset = 0xc0,
  258. .regs = clk_alpha_pll_regs[CLK_ALPHA_PLL_TYPE_DEFAULT],
  259. .width = 4,
  260. .clkr.hw.init = &(struct clk_init_data){
  261. .name = "mmpll5",
  262. .parent_hws = (const struct clk_hw *[]){ &mmpll5_early.clkr.hw },
  263. .num_parents = 1,
  264. .ops = &clk_alpha_pll_postdiv_ops,
  265. .flags = CLK_SET_RATE_PARENT,
  266. },
  267. };
  268. static const struct freq_tbl ftbl_ahb_clk_src[] = {
  269. /* Note: There might be more frequencies desired here. */
  270. F(19200000, P_XO, 1, 0, 0),
  271. F(40000000, P_GPLL0, 15, 0, 0),
  272. F(80000000, P_MMPLL0, 10, 0, 0),
  273. { }
  274. };
  275. static struct clk_rcg2 ahb_clk_src = {
  276. .cmd_rcgr = 0x5000,
  277. .hid_width = 5,
  278. .parent_map = mmcc_xo_gpll0_mmpll0_map,
  279. .freq_tbl = ftbl_ahb_clk_src,
  280. .clkr.hw.init = &(struct clk_init_data){
  281. .name = "ahb_clk_src",
  282. .parent_data = mmcc_xo_gpll0_mmpll0,
  283. .num_parents = ARRAY_SIZE(mmcc_xo_gpll0_mmpll0),
  284. .ops = &clk_rcg2_ops,
  285. },
  286. };
  287. static const struct freq_tbl ftbl_axi_clk_src[] = {
  288. F(75000000, P_GPLL0, 8, 0, 0),
  289. F(150000000, P_GPLL0, 4, 0, 0),
  290. F(333430000, P_MMPLL1, 3.5, 0, 0),
  291. F(466800000, P_MMPLL1, 2.5, 0, 0),
  292. { }
  293. };
  294. static const struct freq_tbl ftbl_axi_clk_src_8992[] = {
  295. F(75000000, P_GPLL0, 8, 0, 0),
  296. F(150000000, P_GPLL0, 4, 0, 0),
  297. F(300000000, P_GPLL0, 2, 0, 0),
  298. F(404000000, P_MMPLL1, 2, 0, 0),
  299. { }
  300. };
  301. static struct clk_rcg2 axi_clk_src = {
  302. .cmd_rcgr = 0x5040,
  303. .hid_width = 5,
  304. .parent_map = mmcc_xo_gpll0_mmpll1_map,
  305. .freq_tbl = ftbl_axi_clk_src,
  306. .clkr.hw.init = &(struct clk_init_data){
  307. .name = "axi_clk_src",
  308. .parent_data = mmcc_xo_gpll0_mmpll1,
  309. .num_parents = ARRAY_SIZE(mmcc_xo_gpll0_mmpll1),
  310. .ops = &clk_rcg2_ops,
  311. },
  312. };
  313. static const struct freq_tbl ftbl_csi0_1_2_3_clk_src[] = {
  314. F(100000000, P_GPLL0, 6, 0, 0),
  315. F(240000000, P_GPLL0, 2.5, 0, 0),
  316. F(266670000, P_MMPLL0, 3, 0, 0),
  317. { }
  318. };
  319. static const struct freq_tbl ftbl_csi0_1_2_3_clk_src_8992[] = {
  320. F(100000000, P_GPLL0, 6, 0, 0),
  321. F(266670000, P_MMPLL0, 3, 0, 0),
  322. { }
  323. };
  324. static struct clk_rcg2 csi0_clk_src = {
  325. .cmd_rcgr = 0x3090,
  326. .hid_width = 5,
  327. .parent_map = mmcc_xo_gpll0_mmpll0_map,
  328. .freq_tbl = ftbl_csi0_1_2_3_clk_src,
  329. .clkr.hw.init = &(struct clk_init_data){
  330. .name = "csi0_clk_src",
  331. .parent_data = mmcc_xo_gpll0_mmpll0,
  332. .num_parents = ARRAY_SIZE(mmcc_xo_gpll0_mmpll0),
  333. .ops = &clk_rcg2_ops,
  334. },
  335. };
  336. static const struct freq_tbl ftbl_vcodec0_clk_src[] = {
  337. F(66670000, P_GPLL0, 9, 0, 0),
  338. F(100000000, P_GPLL0, 6, 0, 0),
  339. F(133330000, P_GPLL0, 4.5, 0, 0),
  340. F(150000000, P_GPLL0, 4, 0, 0),
  341. F(200000000, P_MMPLL0, 4, 0, 0),
  342. F(240000000, P_GPLL0, 2.5, 0, 0),
  343. F(266670000, P_MMPLL0, 3, 0, 0),
  344. F(320000000, P_MMPLL0, 2.5, 0, 0),
  345. F(510000000, P_MMPLL3, 2, 0, 0),
  346. { }
  347. };
  348. static const struct freq_tbl ftbl_vcodec0_clk_src_8992[] = {
  349. F(66670000, P_GPLL0, 9, 0, 0),
  350. F(100000000, P_GPLL0, 6, 0, 0),
  351. F(133330000, P_GPLL0, 4.5, 0, 0),
  352. F(200000000, P_MMPLL0, 4, 0, 0),
  353. F(320000000, P_MMPLL0, 2.5, 0, 0),
  354. F(510000000, P_MMPLL3, 2, 0, 0),
  355. { }
  356. };
  357. static struct clk_rcg2 vcodec0_clk_src = {
  358. .cmd_rcgr = 0x1000,
  359. .mnd_width = 8,
  360. .hid_width = 5,
  361. .parent_map = mmcc_xo_gpll0_mmpll0_mmpll3_map,
  362. .freq_tbl = ftbl_vcodec0_clk_src,
  363. .clkr.hw.init = &(struct clk_init_data){
  364. .name = "vcodec0_clk_src",
  365. .parent_data = mmcc_xo_gpll0_mmpll0_mmpll3,
  366. .num_parents = ARRAY_SIZE(mmcc_xo_gpll0_mmpll0_mmpll3),
  367. .ops = &clk_rcg2_ops,
  368. },
  369. };
  370. static struct clk_rcg2 csi1_clk_src = {
  371. .cmd_rcgr = 0x3100,
  372. .hid_width = 5,
  373. .parent_map = mmcc_xo_gpll0_mmpll0_map,
  374. .freq_tbl = ftbl_csi0_1_2_3_clk_src,
  375. .clkr.hw.init = &(struct clk_init_data){
  376. .name = "csi1_clk_src",
  377. .parent_data = mmcc_xo_gpll0_mmpll0,
  378. .num_parents = ARRAY_SIZE(mmcc_xo_gpll0_mmpll0),
  379. .ops = &clk_rcg2_ops,
  380. },
  381. };
  382. static struct clk_rcg2 csi2_clk_src = {
  383. .cmd_rcgr = 0x3160,
  384. .hid_width = 5,
  385. .parent_map = mmcc_xo_gpll0_mmpll0_map,
  386. .freq_tbl = ftbl_csi0_1_2_3_clk_src,
  387. .clkr.hw.init = &(struct clk_init_data){
  388. .name = "csi2_clk_src",
  389. .parent_data = mmcc_xo_gpll0_mmpll0,
  390. .num_parents = ARRAY_SIZE(mmcc_xo_gpll0_mmpll0),
  391. .ops = &clk_rcg2_ops,
  392. },
  393. };
  394. static struct clk_rcg2 csi3_clk_src = {
  395. .cmd_rcgr = 0x31c0,
  396. .hid_width = 5,
  397. .parent_map = mmcc_xo_gpll0_mmpll0_map,
  398. .freq_tbl = ftbl_csi0_1_2_3_clk_src,
  399. .clkr.hw.init = &(struct clk_init_data){
  400. .name = "csi3_clk_src",
  401. .parent_data = mmcc_xo_gpll0_mmpll0,
  402. .num_parents = ARRAY_SIZE(mmcc_xo_gpll0_mmpll0),
  403. .ops = &clk_rcg2_ops,
  404. },
  405. };
  406. static const struct freq_tbl ftbl_vfe0_clk_src[] = {
  407. F(80000000, P_GPLL0, 7.5, 0, 0),
  408. F(100000000, P_GPLL0, 6, 0, 0),
  409. F(200000000, P_GPLL0, 3, 0, 0),
  410. F(320000000, P_MMPLL0, 2.5, 0, 0),
  411. F(400000000, P_MMPLL0, 2, 0, 0),
  412. F(480000000, P_MMPLL4, 2, 0, 0),
  413. F(533330000, P_MMPLL0, 1.5, 0, 0),
  414. F(600000000, P_GPLL0, 1, 0, 0),
  415. { }
  416. };
  417. static const struct freq_tbl ftbl_vfe0_1_clk_src_8992[] = {
  418. F(80000000, P_GPLL0, 7.5, 0, 0),
  419. F(100000000, P_GPLL0, 6, 0, 0),
  420. F(200000000, P_GPLL0, 3, 0, 0),
  421. F(320000000, P_MMPLL0, 2.5, 0, 0),
  422. F(480000000, P_MMPLL4, 2, 0, 0),
  423. F(600000000, P_GPLL0, 1, 0, 0),
  424. { }
  425. };
  426. static struct clk_rcg2 vfe0_clk_src = {
  427. .cmd_rcgr = 0x3600,
  428. .hid_width = 5,
  429. .parent_map = mmcc_xo_gpll0_mmpll0_mmpll4_map,
  430. .freq_tbl = ftbl_vfe0_clk_src,
  431. .clkr.hw.init = &(struct clk_init_data){
  432. .name = "vfe0_clk_src",
  433. .parent_data = mmcc_xo_gpll0_mmpll0_mmpll4,
  434. .num_parents = ARRAY_SIZE(mmcc_xo_gpll0_mmpll0_mmpll4),
  435. .ops = &clk_rcg2_ops,
  436. },
  437. };
  438. static const struct freq_tbl ftbl_vfe1_clk_src[] = {
  439. F(80000000, P_GPLL0, 7.5, 0, 0),
  440. F(100000000, P_GPLL0, 6, 0, 0),
  441. F(200000000, P_GPLL0, 3, 0, 0),
  442. F(320000000, P_MMPLL0, 2.5, 0, 0),
  443. F(400000000, P_MMPLL0, 2, 0, 0),
  444. F(533330000, P_MMPLL0, 1.5, 0, 0),
  445. { }
  446. };
  447. static struct clk_rcg2 vfe1_clk_src = {
  448. .cmd_rcgr = 0x3620,
  449. .hid_width = 5,
  450. .parent_map = mmcc_xo_gpll0_mmpll0_mmpll4_map,
  451. .freq_tbl = ftbl_vfe1_clk_src,
  452. .clkr.hw.init = &(struct clk_init_data){
  453. .name = "vfe1_clk_src",
  454. .parent_data = mmcc_xo_gpll0_mmpll0_mmpll4,
  455. .num_parents = ARRAY_SIZE(mmcc_xo_gpll0_mmpll0_mmpll4),
  456. .ops = &clk_rcg2_ops,
  457. },
  458. };
  459. static const struct freq_tbl ftbl_cpp_clk_src[] = {
  460. F(100000000, P_GPLL0, 6, 0, 0),
  461. F(200000000, P_GPLL0, 3, 0, 0),
  462. F(320000000, P_MMPLL0, 2.5, 0, 0),
  463. F(480000000, P_MMPLL4, 2, 0, 0),
  464. F(600000000, P_GPLL0, 1, 0, 0),
  465. F(640000000, P_MMPLL4, 1.5, 0, 0),
  466. { }
  467. };
  468. static const struct freq_tbl ftbl_cpp_clk_src_8992[] = {
  469. F(100000000, P_GPLL0, 6, 0, 0),
  470. F(200000000, P_GPLL0, 3, 0, 0),
  471. F(320000000, P_MMPLL0, 2.5, 0, 0),
  472. F(480000000, P_MMPLL4, 2, 0, 0),
  473. F(640000000, P_MMPLL4, 1.5, 0, 0),
  474. { }
  475. };
  476. static struct clk_rcg2 cpp_clk_src = {
  477. .cmd_rcgr = 0x3640,
  478. .hid_width = 5,
  479. .parent_map = mmcc_xo_gpll0_mmpll0_mmpll4_map,
  480. .freq_tbl = ftbl_cpp_clk_src,
  481. .clkr.hw.init = &(struct clk_init_data){
  482. .name = "cpp_clk_src",
  483. .parent_data = mmcc_xo_gpll0_mmpll0_mmpll4,
  484. .num_parents = ARRAY_SIZE(mmcc_xo_gpll0_mmpll0_mmpll4),
  485. .ops = &clk_rcg2_ops,
  486. },
  487. };
  488. static const struct freq_tbl ftbl_jpeg0_1_clk_src[] = {
  489. F(75000000, P_GPLL0, 8, 0, 0),
  490. F(150000000, P_GPLL0, 4, 0, 0),
  491. F(228570000, P_MMPLL0, 3.5, 0, 0),
  492. F(266670000, P_MMPLL0, 3, 0, 0),
  493. F(320000000, P_MMPLL0, 2.5, 0, 0),
  494. F(480000000, P_MMPLL4, 2, 0, 0),
  495. { }
  496. };
  497. static struct clk_rcg2 jpeg1_clk_src = {
  498. .cmd_rcgr = 0x3520,
  499. .hid_width = 5,
  500. .parent_map = mmcc_xo_gpll0_mmpll0_mmpll4_map,
  501. .freq_tbl = ftbl_jpeg0_1_clk_src,
  502. .clkr.hw.init = &(struct clk_init_data){
  503. .name = "jpeg1_clk_src",
  504. .parent_data = mmcc_xo_gpll0_mmpll0_mmpll4,
  505. .num_parents = ARRAY_SIZE(mmcc_xo_gpll0_mmpll0_mmpll4),
  506. .ops = &clk_rcg2_ops,
  507. },
  508. };
  509. static const struct freq_tbl ftbl_jpeg2_clk_src[] = {
  510. F(75000000, P_GPLL0, 8, 0, 0),
  511. F(133330000, P_GPLL0, 4.5, 0, 0),
  512. F(150000000, P_GPLL0, 4, 0, 0),
  513. F(228570000, P_MMPLL0, 3.5, 0, 0),
  514. F(266670000, P_MMPLL0, 3, 0, 0),
  515. F(320000000, P_MMPLL0, 2.5, 0, 0),
  516. { }
  517. };
  518. static struct clk_rcg2 jpeg2_clk_src = {
  519. .cmd_rcgr = 0x3540,
  520. .hid_width = 5,
  521. .parent_map = mmcc_xo_gpll0_mmpll0_map,
  522. .freq_tbl = ftbl_jpeg2_clk_src,
  523. .clkr.hw.init = &(struct clk_init_data){
  524. .name = "jpeg2_clk_src",
  525. .parent_data = mmcc_xo_gpll0_mmpll0,
  526. .num_parents = ARRAY_SIZE(mmcc_xo_gpll0_mmpll0),
  527. .ops = &clk_rcg2_ops,
  528. },
  529. };
  530. static const struct freq_tbl ftbl_csi2phytimer_clk_src[] = {
  531. F(50000000, P_GPLL0, 12, 0, 0),
  532. F(100000000, P_GPLL0, 6, 0, 0),
  533. F(200000000, P_MMPLL0, 4, 0, 0),
  534. { }
  535. };
  536. static struct clk_rcg2 csi2phytimer_clk_src = {
  537. .cmd_rcgr = 0x3060,
  538. .hid_width = 5,
  539. .parent_map = mmcc_xo_gpll0_mmpll0_map,
  540. .freq_tbl = ftbl_csi2phytimer_clk_src,
  541. .clkr.hw.init = &(struct clk_init_data){
  542. .name = "csi2phytimer_clk_src",
  543. .parent_data = mmcc_xo_gpll0_mmpll0,
  544. .num_parents = ARRAY_SIZE(mmcc_xo_gpll0_mmpll0),
  545. .ops = &clk_rcg2_ops,
  546. },
  547. };
  548. static const struct freq_tbl ftbl_fd_core_clk_src[] = {
  549. F(60000000, P_GPLL0, 10, 0, 0),
  550. F(200000000, P_GPLL0, 3, 0, 0),
  551. F(320000000, P_MMPLL0, 2.5, 0, 0),
  552. F(400000000, P_MMPLL0, 2, 0, 0),
  553. { }
  554. };
  555. static struct clk_rcg2 fd_core_clk_src = {
  556. .cmd_rcgr = 0x3b00,
  557. .hid_width = 5,
  558. .parent_map = mmcc_xo_gpll0_mmpll0_map,
  559. .freq_tbl = ftbl_fd_core_clk_src,
  560. .clkr.hw.init = &(struct clk_init_data){
  561. .name = "fd_core_clk_src",
  562. .parent_data = mmcc_xo_gpll0_mmpll0,
  563. .num_parents = ARRAY_SIZE(mmcc_xo_gpll0_mmpll0),
  564. .ops = &clk_rcg2_ops,
  565. },
  566. };
  567. static const struct freq_tbl ftbl_mdp_clk_src[] = {
  568. F(85710000, P_GPLL0, 7, 0, 0),
  569. F(100000000, P_GPLL0, 6, 0, 0),
  570. F(120000000, P_GPLL0, 5, 0, 0),
  571. F(150000000, P_GPLL0, 4, 0, 0),
  572. F(171430000, P_GPLL0, 3.5, 0, 0),
  573. F(200000000, P_GPLL0, 3, 0, 0),
  574. F(240000000, P_GPLL0, 2.5, 0, 0),
  575. F(266670000, P_MMPLL0, 3, 0, 0),
  576. F(300000000, P_GPLL0, 2, 0, 0),
  577. F(320000000, P_MMPLL0, 2.5, 0, 0),
  578. F(400000000, P_MMPLL0, 2, 0, 0),
  579. { }
  580. };
  581. static const struct freq_tbl ftbl_mdp_clk_src_8992[] = {
  582. F(85710000, P_GPLL0, 7, 0, 0),
  583. F(171430000, P_GPLL0, 3.5, 0, 0),
  584. F(200000000, P_GPLL0, 3, 0, 0),
  585. F(240000000, P_GPLL0, 2.5, 0, 0),
  586. F(266670000, P_MMPLL0, 3, 0, 0),
  587. F(320000000, P_MMPLL0, 2.5, 0, 0),
  588. F(400000000, P_MMPLL0, 2, 0, 0),
  589. { }
  590. };
  591. static struct clk_rcg2 mdp_clk_src = {
  592. .cmd_rcgr = 0x2040,
  593. .hid_width = 5,
  594. .parent_map = mmcc_xo_gpll0_mmpll0_map,
  595. .freq_tbl = ftbl_mdp_clk_src,
  596. .clkr.hw.init = &(struct clk_init_data){
  597. .name = "mdp_clk_src",
  598. .parent_data = mmcc_xo_gpll0_mmpll0,
  599. .num_parents = ARRAY_SIZE(mmcc_xo_gpll0_mmpll0),
  600. .ops = &clk_rcg2_ops,
  601. },
  602. };
  603. static struct clk_rcg2 pclk0_clk_src = {
  604. .cmd_rcgr = 0x2000,
  605. .mnd_width = 8,
  606. .hid_width = 5,
  607. .parent_map = mmcc_xo_dsi0pll_dsi1pll_map,
  608. .clkr.hw.init = &(struct clk_init_data){
  609. .name = "pclk0_clk_src",
  610. .parent_data = mmcc_xo_dsi0pll_dsi1pll,
  611. .num_parents = ARRAY_SIZE(mmcc_xo_dsi0pll_dsi1pll),
  612. .ops = &clk_pixel_ops,
  613. .flags = CLK_SET_RATE_PARENT | CLK_GET_RATE_NOCACHE,
  614. },
  615. };
  616. static struct clk_rcg2 pclk1_clk_src = {
  617. .cmd_rcgr = 0x2020,
  618. .mnd_width = 8,
  619. .hid_width = 5,
  620. .parent_map = mmcc_xo_dsi0pll_dsi1pll_map,
  621. .clkr.hw.init = &(struct clk_init_data){
  622. .name = "pclk1_clk_src",
  623. .parent_data = mmcc_xo_dsi0pll_dsi1pll,
  624. .num_parents = ARRAY_SIZE(mmcc_xo_dsi0pll_dsi1pll),
  625. .ops = &clk_pixel_ops,
  626. .flags = CLK_SET_RATE_PARENT | CLK_GET_RATE_NOCACHE,
  627. },
  628. };
  629. static const struct freq_tbl ftbl_ocmemnoc_clk_src[] = {
  630. F(19200000, P_XO, 1, 0, 0),
  631. F(75000000, P_GPLL0, 8, 0, 0),
  632. F(100000000, P_GPLL0, 6, 0, 0),
  633. F(150000000, P_GPLL0, 4, 0, 0),
  634. F(228570000, P_MMPLL0, 3.5, 0, 0),
  635. F(266670000, P_MMPLL0, 3, 0, 0),
  636. F(320000000, P_MMPLL0, 2.5, 0, 0),
  637. F(400000000, P_MMPLL0, 2, 0, 0),
  638. { }
  639. };
  640. static const struct freq_tbl ftbl_ocmemnoc_clk_src_8992[] = {
  641. F(19200000, P_XO, 1, 0, 0),
  642. F(75000000, P_GPLL0, 8, 0, 0),
  643. F(100000000, P_GPLL0, 6, 0, 0),
  644. F(150000000, P_GPLL0, 4, 0, 0),
  645. F(320000000, P_MMPLL0, 2.5, 0, 0),
  646. F(400000000, P_MMPLL0, 2, 0, 0),
  647. { }
  648. };
  649. static struct clk_rcg2 ocmemnoc_clk_src = {
  650. .cmd_rcgr = 0x5090,
  651. .hid_width = 5,
  652. .parent_map = mmcc_xo_gpll0_mmpll0_map,
  653. .freq_tbl = ftbl_ocmemnoc_clk_src,
  654. .clkr.hw.init = &(struct clk_init_data){
  655. .name = "ocmemnoc_clk_src",
  656. .parent_data = mmcc_xo_gpll0_mmpll0,
  657. .num_parents = ARRAY_SIZE(mmcc_xo_gpll0_mmpll0),
  658. .ops = &clk_rcg2_ops,
  659. },
  660. };
  661. static const struct freq_tbl ftbl_cci_clk_src[] = {
  662. F(19200000, P_XO, 1, 0, 0),
  663. F(37500000, P_GPLL0, 16, 0, 0),
  664. F(50000000, P_GPLL0, 12, 0, 0),
  665. F(100000000, P_GPLL0, 6, 0, 0),
  666. { }
  667. };
  668. static struct clk_rcg2 cci_clk_src = {
  669. .cmd_rcgr = 0x3300,
  670. .mnd_width = 8,
  671. .hid_width = 5,
  672. .parent_map = mmcc_xo_gpll0_map,
  673. .freq_tbl = ftbl_cci_clk_src,
  674. .clkr.hw.init = &(struct clk_init_data){
  675. .name = "cci_clk_src",
  676. .parent_data = mmcc_xo_gpll0,
  677. .num_parents = ARRAY_SIZE(mmcc_xo_gpll0),
  678. .ops = &clk_rcg2_ops,
  679. },
  680. };
  681. static const struct freq_tbl ftbl_mmss_gp0_1_clk_src[] = {
  682. F(10000, P_XO, 16, 10, 120),
  683. F(24000, P_GPLL0, 16, 1, 50),
  684. F(6000000, P_GPLL0, 10, 1, 10),
  685. F(12000000, P_GPLL0, 10, 1, 5),
  686. F(13000000, P_GPLL0, 4, 13, 150),
  687. F(24000000, P_GPLL0, 5, 1, 5),
  688. { }
  689. };
  690. static struct clk_rcg2 mmss_gp0_clk_src = {
  691. .cmd_rcgr = 0x3420,
  692. .mnd_width = 8,
  693. .hid_width = 5,
  694. .parent_map = mmcc_xo_gpll0_map,
  695. .freq_tbl = ftbl_mmss_gp0_1_clk_src,
  696. .clkr.hw.init = &(struct clk_init_data){
  697. .name = "mmss_gp0_clk_src",
  698. .parent_data = mmcc_xo_gpll0,
  699. .num_parents = ARRAY_SIZE(mmcc_xo_gpll0),
  700. .ops = &clk_rcg2_ops,
  701. },
  702. };
  703. static struct clk_rcg2 mmss_gp1_clk_src = {
  704. .cmd_rcgr = 0x3450,
  705. .mnd_width = 8,
  706. .hid_width = 5,
  707. .parent_map = mmcc_xo_gpll0_map,
  708. .freq_tbl = ftbl_mmss_gp0_1_clk_src,
  709. .clkr.hw.init = &(struct clk_init_data){
  710. .name = "mmss_gp1_clk_src",
  711. .parent_data = mmcc_xo_gpll0,
  712. .num_parents = ARRAY_SIZE(mmcc_xo_gpll0),
  713. .ops = &clk_rcg2_ops,
  714. },
  715. };
  716. static struct clk_rcg2 jpeg0_clk_src = {
  717. .cmd_rcgr = 0x3500,
  718. .hid_width = 5,
  719. .parent_map = mmcc_xo_gpll0_mmpll0_mmpll4_map,
  720. .freq_tbl = ftbl_jpeg0_1_clk_src,
  721. .clkr.hw.init = &(struct clk_init_data){
  722. .name = "jpeg0_clk_src",
  723. .parent_data = mmcc_xo_gpll0_mmpll0_mmpll4,
  724. .num_parents = ARRAY_SIZE(mmcc_xo_gpll0_mmpll0_mmpll4),
  725. .ops = &clk_rcg2_ops,
  726. },
  727. };
  728. static struct clk_rcg2 jpeg_dma_clk_src = {
  729. .cmd_rcgr = 0x3560,
  730. .hid_width = 5,
  731. .parent_map = mmcc_xo_gpll0_mmpll0_mmpll4_map,
  732. .freq_tbl = ftbl_jpeg0_1_clk_src,
  733. .clkr.hw.init = &(struct clk_init_data){
  734. .name = "jpeg_dma_clk_src",
  735. .parent_data = mmcc_xo_gpll0_mmpll0_mmpll4,
  736. .num_parents = ARRAY_SIZE(mmcc_xo_gpll0_mmpll0_mmpll4),
  737. .ops = &clk_rcg2_ops,
  738. },
  739. };
  740. static const struct freq_tbl ftbl_mclk0_1_2_3_clk_src[] = {
  741. F(4800000, P_XO, 4, 0, 0),
  742. F(6000000, P_GPLL0, 10, 1, 10),
  743. F(8000000, P_GPLL0, 15, 1, 5),
  744. F(9600000, P_XO, 2, 0, 0),
  745. F(16000000, P_MMPLL0, 10, 1, 5),
  746. F(19200000, P_XO, 1, 0, 0),
  747. F(24000000, P_GPLL0, 5, 1, 5),
  748. F(32000000, P_MMPLL0, 5, 1, 5),
  749. F(48000000, P_GPLL0, 12.5, 0, 0),
  750. F(64000000, P_MMPLL0, 12.5, 0, 0),
  751. { }
  752. };
  753. static const struct freq_tbl ftbl_mclk0_clk_src_8992[] = {
  754. F(4800000, P_XO, 4, 0, 0),
  755. F(6000000, P_MMPLL4, 10, 1, 16),
  756. F(8000000, P_MMPLL4, 10, 1, 12),
  757. F(9600000, P_XO, 2, 0, 0),
  758. F(12000000, P_MMPLL4, 10, 1, 8),
  759. F(16000000, P_MMPLL4, 10, 1, 6),
  760. F(19200000, P_XO, 1, 0, 0),
  761. F(24000000, P_MMPLL4, 10, 1, 4),
  762. F(32000000, P_MMPLL4, 10, 1, 3),
  763. F(48000000, P_MMPLL4, 10, 1, 2),
  764. F(64000000, P_MMPLL4, 15, 0, 0),
  765. { }
  766. };
  767. static const struct freq_tbl ftbl_mclk1_2_3_clk_src_8992[] = {
  768. F(4800000, P_XO, 4, 0, 0),
  769. F(6000000, P_MMPLL4, 10, 1, 16),
  770. F(8000000, P_MMPLL4, 10, 1, 12),
  771. F(9600000, P_XO, 2, 0, 0),
  772. F(16000000, P_MMPLL4, 10, 1, 6),
  773. F(19200000, P_XO, 1, 0, 0),
  774. F(24000000, P_MMPLL4, 10, 1, 4),
  775. F(32000000, P_MMPLL4, 10, 1, 3),
  776. F(48000000, P_MMPLL4, 10, 1, 2),
  777. F(64000000, P_MMPLL4, 15, 0, 0),
  778. { }
  779. };
  780. static struct clk_rcg2 mclk0_clk_src = {
  781. .cmd_rcgr = 0x3360,
  782. .mnd_width = 8,
  783. .hid_width = 5,
  784. .parent_map = mmcc_xo_gpll0_mmpll0_map,
  785. .freq_tbl = ftbl_mclk0_1_2_3_clk_src,
  786. .clkr.hw.init = &(struct clk_init_data){
  787. .name = "mclk0_clk_src",
  788. .parent_data = mmcc_xo_gpll0_mmpll0,
  789. .num_parents = ARRAY_SIZE(mmcc_xo_gpll0_mmpll0),
  790. .ops = &clk_rcg2_ops,
  791. },
  792. };
  793. static struct clk_rcg2 mclk1_clk_src = {
  794. .cmd_rcgr = 0x3390,
  795. .mnd_width = 8,
  796. .hid_width = 5,
  797. .parent_map = mmcc_xo_gpll0_mmpll0_map,
  798. .freq_tbl = ftbl_mclk0_1_2_3_clk_src,
  799. .clkr.hw.init = &(struct clk_init_data){
  800. .name = "mclk1_clk_src",
  801. .parent_data = mmcc_xo_gpll0_mmpll0,
  802. .num_parents = ARRAY_SIZE(mmcc_xo_gpll0_mmpll0),
  803. .ops = &clk_rcg2_ops,
  804. },
  805. };
  806. static struct clk_rcg2 mclk2_clk_src = {
  807. .cmd_rcgr = 0x33c0,
  808. .mnd_width = 8,
  809. .hid_width = 5,
  810. .parent_map = mmcc_xo_gpll0_mmpll0_map,
  811. .freq_tbl = ftbl_mclk0_1_2_3_clk_src,
  812. .clkr.hw.init = &(struct clk_init_data){
  813. .name = "mclk2_clk_src",
  814. .parent_data = mmcc_xo_gpll0_mmpll0,
  815. .num_parents = ARRAY_SIZE(mmcc_xo_gpll0_mmpll0),
  816. .ops = &clk_rcg2_ops,
  817. },
  818. };
  819. static struct clk_rcg2 mclk3_clk_src = {
  820. .cmd_rcgr = 0x33f0,
  821. .mnd_width = 8,
  822. .hid_width = 5,
  823. .parent_map = mmcc_xo_gpll0_mmpll0_map,
  824. .freq_tbl = ftbl_mclk0_1_2_3_clk_src,
  825. .clkr.hw.init = &(struct clk_init_data){
  826. .name = "mclk3_clk_src",
  827. .parent_data = mmcc_xo_gpll0_mmpll0,
  828. .num_parents = ARRAY_SIZE(mmcc_xo_gpll0_mmpll0),
  829. .ops = &clk_rcg2_ops,
  830. },
  831. };
  832. static const struct freq_tbl ftbl_csi0_1phytimer_clk_src[] = {
  833. F(50000000, P_GPLL0, 12, 0, 0),
  834. F(100000000, P_GPLL0, 6, 0, 0),
  835. F(200000000, P_MMPLL0, 4, 0, 0),
  836. { }
  837. };
  838. static struct clk_rcg2 csi0phytimer_clk_src = {
  839. .cmd_rcgr = 0x3000,
  840. .hid_width = 5,
  841. .parent_map = mmcc_xo_gpll0_mmpll0_map,
  842. .freq_tbl = ftbl_csi0_1phytimer_clk_src,
  843. .clkr.hw.init = &(struct clk_init_data){
  844. .name = "csi0phytimer_clk_src",
  845. .parent_data = mmcc_xo_gpll0_mmpll0,
  846. .num_parents = ARRAY_SIZE(mmcc_xo_gpll0_mmpll0),
  847. .ops = &clk_rcg2_ops,
  848. },
  849. };
  850. static struct clk_rcg2 csi1phytimer_clk_src = {
  851. .cmd_rcgr = 0x3030,
  852. .hid_width = 5,
  853. .parent_map = mmcc_xo_gpll0_mmpll0_map,
  854. .freq_tbl = ftbl_csi0_1phytimer_clk_src,
  855. .clkr.hw.init = &(struct clk_init_data){
  856. .name = "csi1phytimer_clk_src",
  857. .parent_data = mmcc_xo_gpll0_mmpll0,
  858. .num_parents = ARRAY_SIZE(mmcc_xo_gpll0_mmpll0),
  859. .ops = &clk_rcg2_ops,
  860. },
  861. };
  862. static struct clk_rcg2 byte0_clk_src = {
  863. .cmd_rcgr = 0x2120,
  864. .hid_width = 5,
  865. .parent_map = mmcc_xo_dsibyte_map,
  866. .clkr.hw.init = &(struct clk_init_data){
  867. .name = "byte0_clk_src",
  868. .parent_data = mmcc_xo_dsibyte,
  869. .num_parents = ARRAY_SIZE(mmcc_xo_dsibyte),
  870. .ops = &clk_byte2_ops,
  871. .flags = CLK_SET_RATE_PARENT | CLK_GET_RATE_NOCACHE,
  872. },
  873. };
  874. static struct clk_rcg2 byte1_clk_src = {
  875. .cmd_rcgr = 0x2140,
  876. .hid_width = 5,
  877. .parent_map = mmcc_xo_dsibyte_map,
  878. .clkr.hw.init = &(struct clk_init_data){
  879. .name = "byte1_clk_src",
  880. .parent_data = mmcc_xo_dsibyte,
  881. .num_parents = ARRAY_SIZE(mmcc_xo_dsibyte),
  882. .ops = &clk_byte2_ops,
  883. .flags = CLK_SET_RATE_PARENT | CLK_GET_RATE_NOCACHE,
  884. },
  885. };
  886. static const struct freq_tbl ftbl_mdss_esc0_1_clk[] = {
  887. F(19200000, P_XO, 1, 0, 0),
  888. { }
  889. };
  890. static struct clk_rcg2 esc0_clk_src = {
  891. .cmd_rcgr = 0x2160,
  892. .hid_width = 5,
  893. .parent_map = mmcc_xo_dsibyte_map,
  894. .freq_tbl = ftbl_mdss_esc0_1_clk,
  895. .clkr.hw.init = &(struct clk_init_data){
  896. .name = "esc0_clk_src",
  897. .parent_data = mmcc_xo_dsibyte,
  898. .num_parents = ARRAY_SIZE(mmcc_xo_dsibyte),
  899. .ops = &clk_rcg2_ops,
  900. },
  901. };
  902. static struct clk_rcg2 esc1_clk_src = {
  903. .cmd_rcgr = 0x2180,
  904. .hid_width = 5,
  905. .parent_map = mmcc_xo_dsibyte_map,
  906. .freq_tbl = ftbl_mdss_esc0_1_clk,
  907. .clkr.hw.init = &(struct clk_init_data){
  908. .name = "esc1_clk_src",
  909. .parent_data = mmcc_xo_dsibyte,
  910. .num_parents = ARRAY_SIZE(mmcc_xo_dsibyte),
  911. .ops = &clk_rcg2_ops,
  912. },
  913. };
  914. static const struct freq_tbl extpclk_freq_tbl[] = {
  915. { .src = P_HDMIPLL },
  916. { }
  917. };
  918. static struct clk_rcg2 extpclk_clk_src = {
  919. .cmd_rcgr = 0x2060,
  920. .hid_width = 5,
  921. .parent_map = mmss_xo_hdmi_map,
  922. .freq_tbl = extpclk_freq_tbl,
  923. .clkr.hw.init = &(struct clk_init_data){
  924. .name = "extpclk_clk_src",
  925. .parent_data = mmss_xo_hdmi,
  926. .num_parents = ARRAY_SIZE(mmss_xo_hdmi),
  927. .ops = &clk_rcg2_ops,
  928. .flags = CLK_SET_RATE_PARENT,
  929. },
  930. };
  931. static const struct freq_tbl ftbl_hdmi_clk_src[] = {
  932. F(19200000, P_XO, 1, 0, 0),
  933. { }
  934. };
  935. static struct clk_rcg2 hdmi_clk_src = {
  936. .cmd_rcgr = 0x2100,
  937. .hid_width = 5,
  938. .parent_map = mmcc_xo_gpll0_map,
  939. .freq_tbl = ftbl_hdmi_clk_src,
  940. .clkr.hw.init = &(struct clk_init_data){
  941. .name = "hdmi_clk_src",
  942. .parent_data = mmcc_xo_gpll0,
  943. .num_parents = ARRAY_SIZE(mmcc_xo_gpll0),
  944. .ops = &clk_rcg2_ops,
  945. },
  946. };
  947. static const struct freq_tbl ftbl_mdss_vsync_clk[] = {
  948. F(19200000, P_XO, 1, 0, 0),
  949. { }
  950. };
  951. static struct clk_rcg2 vsync_clk_src = {
  952. .cmd_rcgr = 0x2080,
  953. .hid_width = 5,
  954. .parent_map = mmcc_xo_gpll0_map,
  955. .freq_tbl = ftbl_mdss_vsync_clk,
  956. .clkr.hw.init = &(struct clk_init_data){
  957. .name = "vsync_clk_src",
  958. .parent_data = mmcc_xo_gpll0,
  959. .num_parents = ARRAY_SIZE(mmcc_xo_gpll0),
  960. .ops = &clk_rcg2_ops,
  961. },
  962. };
  963. static const struct freq_tbl ftbl_rbbmtimer_clk_src[] = {
  964. F(19200000, P_XO, 1, 0, 0),
  965. { }
  966. };
  967. static struct clk_rcg2 rbbmtimer_clk_src = {
  968. .cmd_rcgr = 0x4090,
  969. .hid_width = 5,
  970. .parent_map = mmcc_xo_gpll0_map,
  971. .freq_tbl = ftbl_rbbmtimer_clk_src,
  972. .clkr.hw.init = &(struct clk_init_data){
  973. .name = "rbbmtimer_clk_src",
  974. .parent_data = mmcc_xo_gpll0,
  975. .num_parents = ARRAY_SIZE(mmcc_xo_gpll0),
  976. .ops = &clk_rcg2_ops,
  977. },
  978. };
  979. static struct clk_branch camss_ahb_clk = {
  980. .halt_reg = 0x348c,
  981. .clkr = {
  982. .enable_reg = 0x348c,
  983. .enable_mask = BIT(0),
  984. .hw.init = &(struct clk_init_data){
  985. .name = "camss_ahb_clk",
  986. .parent_hws = (const struct clk_hw *[]){ &ahb_clk_src.clkr.hw },
  987. .num_parents = 1,
  988. .flags = CLK_SET_RATE_PARENT,
  989. .ops = &clk_branch2_ops,
  990. },
  991. },
  992. };
  993. static struct clk_branch camss_cci_cci_ahb_clk = {
  994. .halt_reg = 0x3348,
  995. .clkr = {
  996. .enable_reg = 0x3348,
  997. .enable_mask = BIT(0),
  998. .hw.init = &(struct clk_init_data){
  999. .name = "camss_cci_cci_ahb_clk",
  1000. .parent_hws = (const struct clk_hw *[]){ &ahb_clk_src.clkr.hw },
  1001. .num_parents = 1,
  1002. .flags = CLK_SET_RATE_PARENT,
  1003. .ops = &clk_branch2_ops,
  1004. },
  1005. },
  1006. };
  1007. static struct clk_branch camss_cci_cci_clk = {
  1008. .halt_reg = 0x3344,
  1009. .clkr = {
  1010. .enable_reg = 0x3344,
  1011. .enable_mask = BIT(0),
  1012. .hw.init = &(struct clk_init_data){
  1013. .name = "camss_cci_cci_clk",
  1014. .parent_hws = (const struct clk_hw *[]){ &cci_clk_src.clkr.hw },
  1015. .num_parents = 1,
  1016. .ops = &clk_branch2_ops,
  1017. },
  1018. },
  1019. };
  1020. static struct clk_branch camss_vfe_cpp_ahb_clk = {
  1021. .halt_reg = 0x36b4,
  1022. .clkr = {
  1023. .enable_reg = 0x36b4,
  1024. .enable_mask = BIT(0),
  1025. .hw.init = &(struct clk_init_data){
  1026. .name = "camss_vfe_cpp_ahb_clk",
  1027. .parent_hws = (const struct clk_hw *[]){ &ahb_clk_src.clkr.hw },
  1028. .num_parents = 1,
  1029. .flags = CLK_SET_RATE_PARENT,
  1030. .ops = &clk_branch2_ops,
  1031. },
  1032. },
  1033. };
  1034. static struct clk_branch camss_vfe_cpp_axi_clk = {
  1035. .halt_reg = 0x36c4,
  1036. .clkr = {
  1037. .enable_reg = 0x36c4,
  1038. .enable_mask = BIT(0),
  1039. .hw.init = &(struct clk_init_data){
  1040. .name = "camss_vfe_cpp_axi_clk",
  1041. .parent_hws = (const struct clk_hw *[]){ &axi_clk_src.clkr.hw },
  1042. .num_parents = 1,
  1043. .ops = &clk_branch2_ops,
  1044. },
  1045. },
  1046. };
  1047. static struct clk_branch camss_vfe_cpp_clk = {
  1048. .halt_reg = 0x36b0,
  1049. .clkr = {
  1050. .enable_reg = 0x36b0,
  1051. .enable_mask = BIT(0),
  1052. .hw.init = &(struct clk_init_data){
  1053. .name = "camss_vfe_cpp_clk",
  1054. .parent_hws = (const struct clk_hw *[]){ &cpp_clk_src.clkr.hw },
  1055. .num_parents = 1,
  1056. .ops = &clk_branch2_ops,
  1057. },
  1058. },
  1059. };
  1060. static struct clk_branch camss_csi0_ahb_clk = {
  1061. .halt_reg = 0x30bc,
  1062. .clkr = {
  1063. .enable_reg = 0x30bc,
  1064. .enable_mask = BIT(0),
  1065. .hw.init = &(struct clk_init_data){
  1066. .name = "camss_csi0_ahb_clk",
  1067. .parent_hws = (const struct clk_hw *[]){ &ahb_clk_src.clkr.hw },
  1068. .num_parents = 1,
  1069. .flags = CLK_SET_RATE_PARENT,
  1070. .ops = &clk_branch2_ops,
  1071. },
  1072. },
  1073. };
  1074. static struct clk_branch camss_csi0_clk = {
  1075. .halt_reg = 0x30b4,
  1076. .clkr = {
  1077. .enable_reg = 0x30b4,
  1078. .enable_mask = BIT(0),
  1079. .hw.init = &(struct clk_init_data){
  1080. .name = "camss_csi0_clk",
  1081. .parent_hws = (const struct clk_hw *[]){ &csi0_clk_src.clkr.hw },
  1082. .num_parents = 1,
  1083. .ops = &clk_branch2_ops,
  1084. },
  1085. },
  1086. };
  1087. static struct clk_branch camss_csi0phy_clk = {
  1088. .halt_reg = 0x30c4,
  1089. .clkr = {
  1090. .enable_reg = 0x30c4,
  1091. .enable_mask = BIT(0),
  1092. .hw.init = &(struct clk_init_data){
  1093. .name = "camss_csi0phy_clk",
  1094. .parent_hws = (const struct clk_hw *[]){ &csi0_clk_src.clkr.hw },
  1095. .num_parents = 1,
  1096. .ops = &clk_branch2_ops,
  1097. },
  1098. },
  1099. };
  1100. static struct clk_branch camss_csi0pix_clk = {
  1101. .halt_reg = 0x30e4,
  1102. .clkr = {
  1103. .enable_reg = 0x30e4,
  1104. .enable_mask = BIT(0),
  1105. .hw.init = &(struct clk_init_data){
  1106. .name = "camss_csi0pix_clk",
  1107. .parent_hws = (const struct clk_hw *[]){ &csi0_clk_src.clkr.hw },
  1108. .num_parents = 1,
  1109. .ops = &clk_branch2_ops,
  1110. },
  1111. },
  1112. };
  1113. static struct clk_branch camss_csi0rdi_clk = {
  1114. .halt_reg = 0x30d4,
  1115. .clkr = {
  1116. .enable_reg = 0x30d4,
  1117. .enable_mask = BIT(0),
  1118. .hw.init = &(struct clk_init_data){
  1119. .name = "camss_csi0rdi_clk",
  1120. .parent_hws = (const struct clk_hw *[]){ &csi0_clk_src.clkr.hw },
  1121. .num_parents = 1,
  1122. .ops = &clk_branch2_ops,
  1123. },
  1124. },
  1125. };
  1126. static struct clk_branch camss_csi1_ahb_clk = {
  1127. .halt_reg = 0x3128,
  1128. .clkr = {
  1129. .enable_reg = 0x3128,
  1130. .enable_mask = BIT(0),
  1131. .hw.init = &(struct clk_init_data){
  1132. .name = "camss_csi1_ahb_clk",
  1133. .parent_hws = (const struct clk_hw *[]){ &ahb_clk_src.clkr.hw },
  1134. .num_parents = 1,
  1135. .flags = CLK_SET_RATE_PARENT,
  1136. .ops = &clk_branch2_ops,
  1137. },
  1138. },
  1139. };
  1140. static struct clk_branch camss_csi1_clk = {
  1141. .halt_reg = 0x3124,
  1142. .clkr = {
  1143. .enable_reg = 0x3124,
  1144. .enable_mask = BIT(0),
  1145. .hw.init = &(struct clk_init_data){
  1146. .name = "camss_csi1_clk",
  1147. .parent_hws = (const struct clk_hw *[]){ &csi1_clk_src.clkr.hw },
  1148. .num_parents = 1,
  1149. .ops = &clk_branch2_ops,
  1150. },
  1151. },
  1152. };
  1153. static struct clk_branch camss_csi1phy_clk = {
  1154. .halt_reg = 0x3134,
  1155. .clkr = {
  1156. .enable_reg = 0x3134,
  1157. .enable_mask = BIT(0),
  1158. .hw.init = &(struct clk_init_data){
  1159. .name = "camss_csi1phy_clk",
  1160. .parent_hws = (const struct clk_hw *[]){ &csi1_clk_src.clkr.hw },
  1161. .num_parents = 1,
  1162. .ops = &clk_branch2_ops,
  1163. },
  1164. },
  1165. };
  1166. static struct clk_branch camss_csi1pix_clk = {
  1167. .halt_reg = 0x3154,
  1168. .clkr = {
  1169. .enable_reg = 0x3154,
  1170. .enable_mask = BIT(0),
  1171. .hw.init = &(struct clk_init_data){
  1172. .name = "camss_csi1pix_clk",
  1173. .parent_hws = (const struct clk_hw *[]){ &csi1_clk_src.clkr.hw },
  1174. .num_parents = 1,
  1175. .ops = &clk_branch2_ops,
  1176. },
  1177. },
  1178. };
  1179. static struct clk_branch camss_csi1rdi_clk = {
  1180. .halt_reg = 0x3144,
  1181. .clkr = {
  1182. .enable_reg = 0x3144,
  1183. .enable_mask = BIT(0),
  1184. .hw.init = &(struct clk_init_data){
  1185. .name = "camss_csi1rdi_clk",
  1186. .parent_hws = (const struct clk_hw *[]){ &csi1_clk_src.clkr.hw },
  1187. .num_parents = 1,
  1188. .ops = &clk_branch2_ops,
  1189. },
  1190. },
  1191. };
  1192. static struct clk_branch camss_csi2_ahb_clk = {
  1193. .halt_reg = 0x3188,
  1194. .clkr = {
  1195. .enable_reg = 0x3188,
  1196. .enable_mask = BIT(0),
  1197. .hw.init = &(struct clk_init_data){
  1198. .name = "camss_csi2_ahb_clk",
  1199. .parent_hws = (const struct clk_hw *[]){ &ahb_clk_src.clkr.hw },
  1200. .num_parents = 1,
  1201. .flags = CLK_SET_RATE_PARENT,
  1202. .ops = &clk_branch2_ops,
  1203. },
  1204. },
  1205. };
  1206. static struct clk_branch camss_csi2_clk = {
  1207. .halt_reg = 0x3184,
  1208. .clkr = {
  1209. .enable_reg = 0x3184,
  1210. .enable_mask = BIT(0),
  1211. .hw.init = &(struct clk_init_data){
  1212. .name = "camss_csi2_clk",
  1213. .parent_hws = (const struct clk_hw *[]){ &csi1_clk_src.clkr.hw },
  1214. .num_parents = 1,
  1215. .ops = &clk_branch2_ops,
  1216. },
  1217. },
  1218. };
  1219. static struct clk_branch camss_csi2phy_clk = {
  1220. .halt_reg = 0x3194,
  1221. .clkr = {
  1222. .enable_reg = 0x3194,
  1223. .enable_mask = BIT(0),
  1224. .hw.init = &(struct clk_init_data){
  1225. .name = "camss_csi2phy_clk",
  1226. .parent_hws = (const struct clk_hw *[]){ &csi1_clk_src.clkr.hw },
  1227. .num_parents = 1,
  1228. .ops = &clk_branch2_ops,
  1229. },
  1230. },
  1231. };
  1232. static struct clk_branch camss_csi2pix_clk = {
  1233. .halt_reg = 0x31b4,
  1234. .clkr = {
  1235. .enable_reg = 0x31b4,
  1236. .enable_mask = BIT(0),
  1237. .hw.init = &(struct clk_init_data){
  1238. .name = "camss_csi2pix_clk",
  1239. .parent_hws = (const struct clk_hw *[]){ &csi1_clk_src.clkr.hw },
  1240. .num_parents = 1,
  1241. .ops = &clk_branch2_ops,
  1242. },
  1243. },
  1244. };
  1245. static struct clk_branch camss_csi2rdi_clk = {
  1246. .halt_reg = 0x31a4,
  1247. .clkr = {
  1248. .enable_reg = 0x31a4,
  1249. .enable_mask = BIT(0),
  1250. .hw.init = &(struct clk_init_data){
  1251. .name = "camss_csi2rdi_clk",
  1252. .parent_hws = (const struct clk_hw *[]){ &csi1_clk_src.clkr.hw },
  1253. .num_parents = 1,
  1254. .ops = &clk_branch2_ops,
  1255. },
  1256. },
  1257. };
  1258. static struct clk_branch camss_csi3_ahb_clk = {
  1259. .halt_reg = 0x31e8,
  1260. .clkr = {
  1261. .enable_reg = 0x31e8,
  1262. .enable_mask = BIT(0),
  1263. .hw.init = &(struct clk_init_data){
  1264. .name = "camss_csi3_ahb_clk",
  1265. .parent_hws = (const struct clk_hw *[]){ &ahb_clk_src.clkr.hw },
  1266. .num_parents = 1,
  1267. .flags = CLK_SET_RATE_PARENT,
  1268. .ops = &clk_branch2_ops,
  1269. },
  1270. },
  1271. };
  1272. static struct clk_branch camss_csi3_clk = {
  1273. .halt_reg = 0x31e4,
  1274. .clkr = {
  1275. .enable_reg = 0x31e4,
  1276. .enable_mask = BIT(0),
  1277. .hw.init = &(struct clk_init_data){
  1278. .name = "camss_csi3_clk",
  1279. .parent_hws = (const struct clk_hw *[]){ &csi1_clk_src.clkr.hw },
  1280. .num_parents = 1,
  1281. .ops = &clk_branch2_ops,
  1282. },
  1283. },
  1284. };
  1285. static struct clk_branch camss_csi3phy_clk = {
  1286. .halt_reg = 0x31f4,
  1287. .clkr = {
  1288. .enable_reg = 0x31f4,
  1289. .enable_mask = BIT(0),
  1290. .hw.init = &(struct clk_init_data){
  1291. .name = "camss_csi3phy_clk",
  1292. .parent_hws = (const struct clk_hw *[]){ &csi1_clk_src.clkr.hw },
  1293. .num_parents = 1,
  1294. .ops = &clk_branch2_ops,
  1295. },
  1296. },
  1297. };
  1298. static struct clk_branch camss_csi3pix_clk = {
  1299. .halt_reg = 0x3214,
  1300. .clkr = {
  1301. .enable_reg = 0x3214,
  1302. .enable_mask = BIT(0),
  1303. .hw.init = &(struct clk_init_data){
  1304. .name = "camss_csi3pix_clk",
  1305. .parent_hws = (const struct clk_hw *[]){ &csi1_clk_src.clkr.hw },
  1306. .num_parents = 1,
  1307. .ops = &clk_branch2_ops,
  1308. },
  1309. },
  1310. };
  1311. static struct clk_branch camss_csi3rdi_clk = {
  1312. .halt_reg = 0x3204,
  1313. .clkr = {
  1314. .enable_reg = 0x3204,
  1315. .enable_mask = BIT(0),
  1316. .hw.init = &(struct clk_init_data){
  1317. .name = "camss_csi3rdi_clk",
  1318. .parent_hws = (const struct clk_hw *[]){ &csi1_clk_src.clkr.hw },
  1319. .num_parents = 1,
  1320. .ops = &clk_branch2_ops,
  1321. },
  1322. },
  1323. };
  1324. static struct clk_branch camss_csi_vfe0_clk = {
  1325. .halt_reg = 0x3704,
  1326. .clkr = {
  1327. .enable_reg = 0x3704,
  1328. .enable_mask = BIT(0),
  1329. .hw.init = &(struct clk_init_data){
  1330. .name = "camss_csi_vfe0_clk",
  1331. .parent_hws = (const struct clk_hw *[]){ &vfe0_clk_src.clkr.hw },
  1332. .num_parents = 1,
  1333. .ops = &clk_branch2_ops,
  1334. },
  1335. },
  1336. };
  1337. static struct clk_branch camss_csi_vfe1_clk = {
  1338. .halt_reg = 0x3714,
  1339. .clkr = {
  1340. .enable_reg = 0x3714,
  1341. .enable_mask = BIT(0),
  1342. .hw.init = &(struct clk_init_data){
  1343. .name = "camss_csi_vfe1_clk",
  1344. .parent_hws = (const struct clk_hw *[]){ &vfe1_clk_src.clkr.hw },
  1345. .num_parents = 1,
  1346. .ops = &clk_branch2_ops,
  1347. },
  1348. },
  1349. };
  1350. static struct clk_branch camss_gp0_clk = {
  1351. .halt_reg = 0x3444,
  1352. .clkr = {
  1353. .enable_reg = 0x3444,
  1354. .enable_mask = BIT(0),
  1355. .hw.init = &(struct clk_init_data){
  1356. .name = "camss_gp0_clk",
  1357. .parent_hws = (const struct clk_hw *[]){ &mmss_gp0_clk_src.clkr.hw },
  1358. .num_parents = 1,
  1359. .ops = &clk_branch2_ops,
  1360. },
  1361. },
  1362. };
  1363. static struct clk_branch camss_gp1_clk = {
  1364. .halt_reg = 0x3474,
  1365. .clkr = {
  1366. .enable_reg = 0x3474,
  1367. .enable_mask = BIT(0),
  1368. .hw.init = &(struct clk_init_data){
  1369. .name = "camss_gp1_clk",
  1370. .parent_hws = (const struct clk_hw *[]){ &mmss_gp1_clk_src.clkr.hw },
  1371. .num_parents = 1,
  1372. .ops = &clk_branch2_ops,
  1373. },
  1374. },
  1375. };
  1376. static struct clk_branch camss_ispif_ahb_clk = {
  1377. .halt_reg = 0x3224,
  1378. .clkr = {
  1379. .enable_reg = 0x3224,
  1380. .enable_mask = BIT(0),
  1381. .hw.init = &(struct clk_init_data){
  1382. .name = "camss_ispif_ahb_clk",
  1383. .parent_hws = (const struct clk_hw *[]){ &ahb_clk_src.clkr.hw },
  1384. .num_parents = 1,
  1385. .flags = CLK_SET_RATE_PARENT,
  1386. .ops = &clk_branch2_ops,
  1387. },
  1388. },
  1389. };
  1390. static struct clk_branch camss_jpeg_dma_clk = {
  1391. .halt_reg = 0x35c0,
  1392. .clkr = {
  1393. .enable_reg = 0x35c0,
  1394. .enable_mask = BIT(0),
  1395. .hw.init = &(struct clk_init_data){
  1396. .name = "camss_jpeg_dma_clk",
  1397. .parent_hws = (const struct clk_hw *[]){ &jpeg_dma_clk_src.clkr.hw },
  1398. .num_parents = 1,
  1399. .ops = &clk_branch2_ops,
  1400. },
  1401. },
  1402. };
  1403. static struct clk_branch camss_jpeg_jpeg0_clk = {
  1404. .halt_reg = 0x35a8,
  1405. .clkr = {
  1406. .enable_reg = 0x35a8,
  1407. .enable_mask = BIT(0),
  1408. .hw.init = &(struct clk_init_data){
  1409. .name = "camss_jpeg_jpeg0_clk",
  1410. .parent_hws = (const struct clk_hw *[]){ &jpeg0_clk_src.clkr.hw },
  1411. .num_parents = 1,
  1412. .ops = &clk_branch2_ops,
  1413. },
  1414. },
  1415. };
  1416. static struct clk_branch camss_jpeg_jpeg1_clk = {
  1417. .halt_reg = 0x35ac,
  1418. .clkr = {
  1419. .enable_reg = 0x35ac,
  1420. .enable_mask = BIT(0),
  1421. .hw.init = &(struct clk_init_data){
  1422. .name = "camss_jpeg_jpeg1_clk",
  1423. .parent_hws = (const struct clk_hw *[]){ &jpeg1_clk_src.clkr.hw },
  1424. .num_parents = 1,
  1425. .ops = &clk_branch2_ops,
  1426. },
  1427. },
  1428. };
  1429. static struct clk_branch camss_jpeg_jpeg2_clk = {
  1430. .halt_reg = 0x35b0,
  1431. .clkr = {
  1432. .enable_reg = 0x35b0,
  1433. .enable_mask = BIT(0),
  1434. .hw.init = &(struct clk_init_data){
  1435. .name = "camss_jpeg_jpeg2_clk",
  1436. .parent_hws = (const struct clk_hw *[]){ &jpeg2_clk_src.clkr.hw },
  1437. .num_parents = 1,
  1438. .ops = &clk_branch2_ops,
  1439. },
  1440. },
  1441. };
  1442. static struct clk_branch camss_jpeg_jpeg_ahb_clk = {
  1443. .halt_reg = 0x35b4,
  1444. .clkr = {
  1445. .enable_reg = 0x35b4,
  1446. .enable_mask = BIT(0),
  1447. .hw.init = &(struct clk_init_data){
  1448. .name = "camss_jpeg_jpeg_ahb_clk",
  1449. .parent_hws = (const struct clk_hw *[]){ &ahb_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_jpeg_jpeg_axi_clk = {
  1457. .halt_reg = 0x35b8,
  1458. .clkr = {
  1459. .enable_reg = 0x35b8,
  1460. .enable_mask = BIT(0),
  1461. .hw.init = &(struct clk_init_data){
  1462. .name = "camss_jpeg_jpeg_axi_clk",
  1463. .parent_hws = (const struct clk_hw *[]){ &axi_clk_src.clkr.hw },
  1464. .num_parents = 1,
  1465. .ops = &clk_branch2_ops,
  1466. },
  1467. },
  1468. };
  1469. static struct clk_branch camss_mclk0_clk = {
  1470. .halt_reg = 0x3384,
  1471. .clkr = {
  1472. .enable_reg = 0x3384,
  1473. .enable_mask = BIT(0),
  1474. .hw.init = &(struct clk_init_data){
  1475. .name = "camss_mclk0_clk",
  1476. .parent_hws = (const struct clk_hw *[]){ &mclk0_clk_src.clkr.hw },
  1477. .num_parents = 1,
  1478. .ops = &clk_branch2_ops,
  1479. },
  1480. },
  1481. };
  1482. static struct clk_branch camss_mclk1_clk = {
  1483. .halt_reg = 0x33b4,
  1484. .clkr = {
  1485. .enable_reg = 0x33b4,
  1486. .enable_mask = BIT(0),
  1487. .hw.init = &(struct clk_init_data){
  1488. .name = "camss_mclk1_clk",
  1489. .parent_hws = (const struct clk_hw *[]){ &mclk1_clk_src.clkr.hw },
  1490. .num_parents = 1,
  1491. .ops = &clk_branch2_ops,
  1492. },
  1493. },
  1494. };
  1495. static struct clk_branch camss_mclk2_clk = {
  1496. .halt_reg = 0x33e4,
  1497. .clkr = {
  1498. .enable_reg = 0x33e4,
  1499. .enable_mask = BIT(0),
  1500. .hw.init = &(struct clk_init_data){
  1501. .name = "camss_mclk2_clk",
  1502. .parent_hws = (const struct clk_hw *[]){ &mclk2_clk_src.clkr.hw },
  1503. .num_parents = 1,
  1504. .ops = &clk_branch2_ops,
  1505. },
  1506. },
  1507. };
  1508. static struct clk_branch camss_mclk3_clk = {
  1509. .halt_reg = 0x3414,
  1510. .clkr = {
  1511. .enable_reg = 0x3414,
  1512. .enable_mask = BIT(0),
  1513. .hw.init = &(struct clk_init_data){
  1514. .name = "camss_mclk3_clk",
  1515. .parent_hws = (const struct clk_hw *[]){ &mclk3_clk_src.clkr.hw },
  1516. .num_parents = 1,
  1517. .ops = &clk_branch2_ops,
  1518. },
  1519. },
  1520. };
  1521. static struct clk_branch camss_micro_ahb_clk = {
  1522. .halt_reg = 0x3494,
  1523. .clkr = {
  1524. .enable_reg = 0x3494,
  1525. .enable_mask = BIT(0),
  1526. .hw.init = &(struct clk_init_data){
  1527. .name = "camss_micro_ahb_clk",
  1528. .parent_hws = (const struct clk_hw *[]){ &ahb_clk_src.clkr.hw },
  1529. .num_parents = 1,
  1530. .flags = CLK_SET_RATE_PARENT,
  1531. .ops = &clk_branch2_ops,
  1532. },
  1533. },
  1534. };
  1535. static struct clk_branch camss_phy0_csi0phytimer_clk = {
  1536. .halt_reg = 0x3024,
  1537. .clkr = {
  1538. .enable_reg = 0x3024,
  1539. .enable_mask = BIT(0),
  1540. .hw.init = &(struct clk_init_data){
  1541. .name = "camss_phy0_csi0phytimer_clk",
  1542. .parent_hws = (const struct clk_hw *[]){ &csi0phytimer_clk_src.clkr.hw },
  1543. .num_parents = 1,
  1544. .ops = &clk_branch2_ops,
  1545. },
  1546. },
  1547. };
  1548. static struct clk_branch camss_phy1_csi1phytimer_clk = {
  1549. .halt_reg = 0x3054,
  1550. .clkr = {
  1551. .enable_reg = 0x3054,
  1552. .enable_mask = BIT(0),
  1553. .hw.init = &(struct clk_init_data){
  1554. .name = "camss_phy1_csi1phytimer_clk",
  1555. .parent_hws = (const struct clk_hw *[]){ &csi1phytimer_clk_src.clkr.hw },
  1556. .num_parents = 1,
  1557. .ops = &clk_branch2_ops,
  1558. },
  1559. },
  1560. };
  1561. static struct clk_branch camss_phy2_csi2phytimer_clk = {
  1562. .halt_reg = 0x3084,
  1563. .clkr = {
  1564. .enable_reg = 0x3084,
  1565. .enable_mask = BIT(0),
  1566. .hw.init = &(struct clk_init_data){
  1567. .name = "camss_phy2_csi2phytimer_clk",
  1568. .parent_hws = (const struct clk_hw *[]){ &csi2phytimer_clk_src.clkr.hw },
  1569. .num_parents = 1,
  1570. .ops = &clk_branch2_ops,
  1571. },
  1572. },
  1573. };
  1574. static struct clk_branch camss_top_ahb_clk = {
  1575. .halt_reg = 0x3484,
  1576. .clkr = {
  1577. .enable_reg = 0x3484,
  1578. .enable_mask = BIT(0),
  1579. .hw.init = &(struct clk_init_data){
  1580. .name = "camss_top_ahb_clk",
  1581. .parent_hws = (const struct clk_hw *[]){ &ahb_clk_src.clkr.hw },
  1582. .num_parents = 1,
  1583. .flags = CLK_SET_RATE_PARENT,
  1584. .ops = &clk_branch2_ops,
  1585. },
  1586. },
  1587. };
  1588. static struct clk_branch camss_vfe_vfe0_clk = {
  1589. .halt_reg = 0x36a8,
  1590. .clkr = {
  1591. .enable_reg = 0x36a8,
  1592. .enable_mask = BIT(0),
  1593. .hw.init = &(struct clk_init_data){
  1594. .name = "camss_vfe_vfe0_clk",
  1595. .parent_hws = (const struct clk_hw *[]){ &vfe0_clk_src.clkr.hw },
  1596. .num_parents = 1,
  1597. .ops = &clk_branch2_ops,
  1598. },
  1599. },
  1600. };
  1601. static struct clk_branch camss_vfe_vfe1_clk = {
  1602. .halt_reg = 0x36ac,
  1603. .clkr = {
  1604. .enable_reg = 0x36ac,
  1605. .enable_mask = BIT(0),
  1606. .hw.init = &(struct clk_init_data){
  1607. .name = "camss_vfe_vfe1_clk",
  1608. .parent_hws = (const struct clk_hw *[]){ &vfe1_clk_src.clkr.hw },
  1609. .num_parents = 1,
  1610. .ops = &clk_branch2_ops,
  1611. },
  1612. },
  1613. };
  1614. static struct clk_branch camss_vfe_vfe_ahb_clk = {
  1615. .halt_reg = 0x36b8,
  1616. .clkr = {
  1617. .enable_reg = 0x36b8,
  1618. .enable_mask = BIT(0),
  1619. .hw.init = &(struct clk_init_data){
  1620. .name = "camss_vfe_vfe_ahb_clk",
  1621. .parent_hws = (const struct clk_hw *[]){ &ahb_clk_src.clkr.hw },
  1622. .num_parents = 1,
  1623. .flags = CLK_SET_RATE_PARENT,
  1624. .ops = &clk_branch2_ops,
  1625. },
  1626. },
  1627. };
  1628. static struct clk_branch camss_vfe_vfe_axi_clk = {
  1629. .halt_reg = 0x36bc,
  1630. .clkr = {
  1631. .enable_reg = 0x36bc,
  1632. .enable_mask = BIT(0),
  1633. .hw.init = &(struct clk_init_data){
  1634. .name = "camss_vfe_vfe_axi_clk",
  1635. .parent_hws = (const struct clk_hw *[]){ &axi_clk_src.clkr.hw },
  1636. .num_parents = 1,
  1637. .ops = &clk_branch2_ops,
  1638. },
  1639. },
  1640. };
  1641. static struct clk_branch fd_ahb_clk = {
  1642. .halt_reg = 0x3b74,
  1643. .clkr = {
  1644. .enable_reg = 0x3b74,
  1645. .enable_mask = BIT(0),
  1646. .hw.init = &(struct clk_init_data){
  1647. .name = "fd_ahb_clk",
  1648. .parent_hws = (const struct clk_hw *[]){ &ahb_clk_src.clkr.hw },
  1649. .num_parents = 1,
  1650. .ops = &clk_branch2_ops,
  1651. },
  1652. },
  1653. };
  1654. static struct clk_branch fd_axi_clk = {
  1655. .halt_reg = 0x3b70,
  1656. .clkr = {
  1657. .enable_reg = 0x3b70,
  1658. .enable_mask = BIT(0),
  1659. .hw.init = &(struct clk_init_data){
  1660. .name = "fd_axi_clk",
  1661. .parent_hws = (const struct clk_hw *[]){ &axi_clk_src.clkr.hw },
  1662. .num_parents = 1,
  1663. .ops = &clk_branch2_ops,
  1664. },
  1665. },
  1666. };
  1667. static struct clk_branch fd_core_clk = {
  1668. .halt_reg = 0x3b68,
  1669. .clkr = {
  1670. .enable_reg = 0x3b68,
  1671. .enable_mask = BIT(0),
  1672. .hw.init = &(struct clk_init_data){
  1673. .name = "fd_core_clk",
  1674. .parent_hws = (const struct clk_hw *[]){ &fd_core_clk_src.clkr.hw },
  1675. .num_parents = 1,
  1676. .ops = &clk_branch2_ops,
  1677. },
  1678. },
  1679. };
  1680. static struct clk_branch fd_core_uar_clk = {
  1681. .halt_reg = 0x3b6c,
  1682. .clkr = {
  1683. .enable_reg = 0x3b6c,
  1684. .enable_mask = BIT(0),
  1685. .hw.init = &(struct clk_init_data){
  1686. .name = "fd_core_uar_clk",
  1687. .parent_hws = (const struct clk_hw *[]){ &fd_core_clk_src.clkr.hw },
  1688. .num_parents = 1,
  1689. .ops = &clk_branch2_ops,
  1690. },
  1691. },
  1692. };
  1693. static struct clk_branch mdss_ahb_clk = {
  1694. .halt_reg = 0x2308,
  1695. .halt_check = BRANCH_HALT,
  1696. .clkr = {
  1697. .enable_reg = 0x2308,
  1698. .enable_mask = BIT(0),
  1699. .hw.init = &(struct clk_init_data){
  1700. .name = "mdss_ahb_clk",
  1701. .parent_hws = (const struct clk_hw *[]){ &ahb_clk_src.clkr.hw },
  1702. .num_parents = 1,
  1703. .flags = CLK_SET_RATE_PARENT,
  1704. .ops = &clk_branch2_ops,
  1705. },
  1706. },
  1707. };
  1708. static struct clk_branch mdss_axi_clk = {
  1709. .halt_reg = 0x2310,
  1710. .clkr = {
  1711. .enable_reg = 0x2310,
  1712. .enable_mask = BIT(0),
  1713. .hw.init = &(struct clk_init_data){
  1714. .name = "mdss_axi_clk",
  1715. .parent_hws = (const struct clk_hw *[]){ &axi_clk_src.clkr.hw },
  1716. .num_parents = 1,
  1717. .flags = CLK_SET_RATE_PARENT,
  1718. .ops = &clk_branch2_ops,
  1719. },
  1720. },
  1721. };
  1722. static struct clk_branch mdss_byte0_clk = {
  1723. .halt_reg = 0x233c,
  1724. .clkr = {
  1725. .enable_reg = 0x233c,
  1726. .enable_mask = BIT(0),
  1727. .hw.init = &(struct clk_init_data){
  1728. .name = "mdss_byte0_clk",
  1729. .parent_hws = (const struct clk_hw *[]){ &byte0_clk_src.clkr.hw },
  1730. .num_parents = 1,
  1731. .flags = CLK_SET_RATE_PARENT,
  1732. .ops = &clk_branch2_ops,
  1733. },
  1734. },
  1735. };
  1736. static struct clk_branch mdss_byte1_clk = {
  1737. .halt_reg = 0x2340,
  1738. .clkr = {
  1739. .enable_reg = 0x2340,
  1740. .enable_mask = BIT(0),
  1741. .hw.init = &(struct clk_init_data){
  1742. .name = "mdss_byte1_clk",
  1743. .parent_hws = (const struct clk_hw *[]){ &byte1_clk_src.clkr.hw },
  1744. .num_parents = 1,
  1745. .flags = CLK_SET_RATE_PARENT,
  1746. .ops = &clk_branch2_ops,
  1747. },
  1748. },
  1749. };
  1750. static struct clk_branch mdss_esc0_clk = {
  1751. .halt_reg = 0x2344,
  1752. .clkr = {
  1753. .enable_reg = 0x2344,
  1754. .enable_mask = BIT(0),
  1755. .hw.init = &(struct clk_init_data){
  1756. .name = "mdss_esc0_clk",
  1757. .parent_hws = (const struct clk_hw *[]){ &esc0_clk_src.clkr.hw },
  1758. .num_parents = 1,
  1759. .flags = CLK_SET_RATE_PARENT,
  1760. .ops = &clk_branch2_ops,
  1761. },
  1762. },
  1763. };
  1764. static struct clk_branch mdss_esc1_clk = {
  1765. .halt_reg = 0x2348,
  1766. .clkr = {
  1767. .enable_reg = 0x2348,
  1768. .enable_mask = BIT(0),
  1769. .hw.init = &(struct clk_init_data){
  1770. .name = "mdss_esc1_clk",
  1771. .parent_hws = (const struct clk_hw *[]){ &esc1_clk_src.clkr.hw },
  1772. .num_parents = 1,
  1773. .flags = CLK_SET_RATE_PARENT,
  1774. .ops = &clk_branch2_ops,
  1775. },
  1776. },
  1777. };
  1778. static struct clk_branch mdss_extpclk_clk = {
  1779. .halt_reg = 0x2324,
  1780. .clkr = {
  1781. .enable_reg = 0x2324,
  1782. .enable_mask = BIT(0),
  1783. .hw.init = &(struct clk_init_data){
  1784. .name = "mdss_extpclk_clk",
  1785. .parent_hws = (const struct clk_hw *[]){ &extpclk_clk_src.clkr.hw },
  1786. .num_parents = 1,
  1787. .flags = CLK_SET_RATE_PARENT,
  1788. .ops = &clk_branch2_ops,
  1789. },
  1790. },
  1791. };
  1792. static struct clk_branch mdss_hdmi_ahb_clk = {
  1793. .halt_reg = 0x230c,
  1794. .clkr = {
  1795. .enable_reg = 0x230c,
  1796. .enable_mask = BIT(0),
  1797. .hw.init = &(struct clk_init_data){
  1798. .name = "mdss_hdmi_ahb_clk",
  1799. .parent_hws = (const struct clk_hw *[]){ &ahb_clk_src.clkr.hw },
  1800. .num_parents = 1,
  1801. .flags = CLK_SET_RATE_PARENT,
  1802. .ops = &clk_branch2_ops,
  1803. },
  1804. },
  1805. };
  1806. static struct clk_branch mdss_hdmi_clk = {
  1807. .halt_reg = 0x2338,
  1808. .clkr = {
  1809. .enable_reg = 0x2338,
  1810. .enable_mask = BIT(0),
  1811. .hw.init = &(struct clk_init_data){
  1812. .name = "mdss_hdmi_clk",
  1813. .parent_hws = (const struct clk_hw *[]){ &hdmi_clk_src.clkr.hw },
  1814. .num_parents = 1,
  1815. .flags = CLK_SET_RATE_PARENT,
  1816. .ops = &clk_branch2_ops,
  1817. },
  1818. },
  1819. };
  1820. static struct clk_branch mdss_mdp_clk = {
  1821. .halt_reg = 0x231c,
  1822. .clkr = {
  1823. .enable_reg = 0x231c,
  1824. .enable_mask = BIT(0),
  1825. .hw.init = &(struct clk_init_data){
  1826. .name = "mdss_mdp_clk",
  1827. .parent_hws = (const struct clk_hw *[]){ &mdp_clk_src.clkr.hw },
  1828. .num_parents = 1,
  1829. .flags = CLK_SET_RATE_PARENT,
  1830. .ops = &clk_branch2_ops,
  1831. },
  1832. },
  1833. };
  1834. static struct clk_branch mdss_pclk0_clk = {
  1835. .halt_reg = 0x2314,
  1836. .clkr = {
  1837. .enable_reg = 0x2314,
  1838. .enable_mask = BIT(0),
  1839. .hw.init = &(struct clk_init_data){
  1840. .name = "mdss_pclk0_clk",
  1841. .parent_hws = (const struct clk_hw *[]){ &pclk0_clk_src.clkr.hw },
  1842. .num_parents = 1,
  1843. .flags = CLK_SET_RATE_PARENT,
  1844. .ops = &clk_branch2_ops,
  1845. },
  1846. },
  1847. };
  1848. static struct clk_branch mdss_pclk1_clk = {
  1849. .halt_reg = 0x2318,
  1850. .clkr = {
  1851. .enable_reg = 0x2318,
  1852. .enable_mask = BIT(0),
  1853. .hw.init = &(struct clk_init_data){
  1854. .name = "mdss_pclk1_clk",
  1855. .parent_hws = (const struct clk_hw *[]){ &pclk1_clk_src.clkr.hw },
  1856. .num_parents = 1,
  1857. .flags = CLK_SET_RATE_PARENT,
  1858. .ops = &clk_branch2_ops,
  1859. },
  1860. },
  1861. };
  1862. static struct clk_branch mdss_vsync_clk = {
  1863. .halt_reg = 0x2328,
  1864. .clkr = {
  1865. .enable_reg = 0x2328,
  1866. .enable_mask = BIT(0),
  1867. .hw.init = &(struct clk_init_data){
  1868. .name = "mdss_vsync_clk",
  1869. .parent_hws = (const struct clk_hw *[]){ &vsync_clk_src.clkr.hw },
  1870. .num_parents = 1,
  1871. .flags = CLK_SET_RATE_PARENT,
  1872. .ops = &clk_branch2_ops,
  1873. },
  1874. },
  1875. };
  1876. static struct clk_branch mmss_misc_ahb_clk = {
  1877. .halt_reg = 0x502c,
  1878. .clkr = {
  1879. .enable_reg = 0x502c,
  1880. .enable_mask = BIT(0),
  1881. .hw.init = &(struct clk_init_data){
  1882. .name = "mmss_misc_ahb_clk",
  1883. .parent_hws = (const struct clk_hw *[]){ &ahb_clk_src.clkr.hw },
  1884. .num_parents = 1,
  1885. .flags = CLK_SET_RATE_PARENT,
  1886. .ops = &clk_branch2_ops,
  1887. },
  1888. },
  1889. };
  1890. static struct clk_branch mmss_mmssnoc_axi_clk = {
  1891. .halt_reg = 0x506c,
  1892. .clkr = {
  1893. .enable_reg = 0x506c,
  1894. .enable_mask = BIT(0),
  1895. .hw.init = &(struct clk_init_data){
  1896. .name = "mmss_mmssnoc_axi_clk",
  1897. .parent_hws = (const struct clk_hw *[]){ &axi_clk_src.clkr.hw },
  1898. .num_parents = 1,
  1899. /* Gating this clock will wreck havoc among MMSS! */
  1900. .flags = CLK_SET_RATE_PARENT | CLK_IS_CRITICAL,
  1901. .ops = &clk_branch2_ops,
  1902. },
  1903. },
  1904. };
  1905. static struct clk_branch mmss_s0_axi_clk = {
  1906. .halt_reg = 0x5064,
  1907. .clkr = {
  1908. .enable_reg = 0x5064,
  1909. .enable_mask = BIT(0),
  1910. .hw.init = &(struct clk_init_data){
  1911. .name = "mmss_s0_axi_clk",
  1912. .parent_hws = (const struct clk_hw *[]){ &axi_clk_src.clkr.hw, },
  1913. .num_parents = 1,
  1914. .flags = CLK_SET_RATE_PARENT | CLK_IGNORE_UNUSED,
  1915. .ops = &clk_branch2_ops,
  1916. },
  1917. },
  1918. };
  1919. static struct clk_branch ocmemcx_ocmemnoc_clk = {
  1920. .halt_reg = 0x4058,
  1921. .clkr = {
  1922. .enable_reg = 0x4058,
  1923. .enable_mask = BIT(0),
  1924. .hw.init = &(struct clk_init_data){
  1925. .name = "ocmemcx_ocmemnoc_clk",
  1926. .parent_hws = (const struct clk_hw *[]){ &ocmemnoc_clk_src.clkr.hw },
  1927. .num_parents = 1,
  1928. .flags = CLK_SET_RATE_PARENT,
  1929. .ops = &clk_branch2_ops,
  1930. },
  1931. },
  1932. };
  1933. static struct clk_branch oxili_gfx3d_clk = {
  1934. .halt_reg = 0x4028,
  1935. .clkr = {
  1936. .enable_reg = 0x4028,
  1937. .enable_mask = BIT(0),
  1938. .hw.init = &(struct clk_init_data){
  1939. .name = "oxili_gfx3d_clk",
  1940. .parent_data = &(const struct clk_parent_data){
  1941. .fw_name = "oxili_gfx3d_clk_src",
  1942. .name = "oxili_gfx3d_clk_src"
  1943. },
  1944. .num_parents = 1,
  1945. .flags = CLK_SET_RATE_PARENT,
  1946. .ops = &clk_branch2_ops,
  1947. },
  1948. },
  1949. };
  1950. static struct clk_branch oxili_rbbmtimer_clk = {
  1951. .halt_reg = 0x40b0,
  1952. .clkr = {
  1953. .enable_reg = 0x40b0,
  1954. .enable_mask = BIT(0),
  1955. .hw.init = &(struct clk_init_data){
  1956. .name = "oxili_rbbmtimer_clk",
  1957. .parent_hws = (const struct clk_hw *[]){ &rbbmtimer_clk_src.clkr.hw },
  1958. .num_parents = 1,
  1959. .flags = CLK_SET_RATE_PARENT,
  1960. .ops = &clk_branch2_ops,
  1961. },
  1962. },
  1963. };
  1964. static struct clk_branch oxilicx_ahb_clk = {
  1965. .halt_reg = 0x403c,
  1966. .clkr = {
  1967. .enable_reg = 0x403c,
  1968. .enable_mask = BIT(0),
  1969. .hw.init = &(struct clk_init_data){
  1970. .name = "oxilicx_ahb_clk",
  1971. .parent_hws = (const struct clk_hw *[]){ &ahb_clk_src.clkr.hw },
  1972. .num_parents = 1,
  1973. .flags = CLK_SET_RATE_PARENT,
  1974. .ops = &clk_branch2_ops,
  1975. },
  1976. },
  1977. };
  1978. static struct clk_branch venus0_ahb_clk = {
  1979. .halt_reg = 0x1030,
  1980. .clkr = {
  1981. .enable_reg = 0x1030,
  1982. .enable_mask = BIT(0),
  1983. .hw.init = &(struct clk_init_data){
  1984. .name = "venus0_ahb_clk",
  1985. .parent_hws = (const struct clk_hw *[]){ &ahb_clk_src.clkr.hw },
  1986. .num_parents = 1,
  1987. .flags = CLK_SET_RATE_PARENT,
  1988. .ops = &clk_branch2_ops,
  1989. },
  1990. },
  1991. };
  1992. static struct clk_branch venus0_axi_clk = {
  1993. .halt_reg = 0x1034,
  1994. .clkr = {
  1995. .enable_reg = 0x1034,
  1996. .enable_mask = BIT(0),
  1997. .hw.init = &(struct clk_init_data){
  1998. .name = "venus0_axi_clk",
  1999. .parent_hws = (const struct clk_hw *[]){ &axi_clk_src.clkr.hw },
  2000. .num_parents = 1,
  2001. .ops = &clk_branch2_ops,
  2002. },
  2003. },
  2004. };
  2005. static struct clk_branch venus0_ocmemnoc_clk = {
  2006. .halt_reg = 0x1038,
  2007. .clkr = {
  2008. .enable_reg = 0x1038,
  2009. .enable_mask = BIT(0),
  2010. .hw.init = &(struct clk_init_data){
  2011. .name = "venus0_ocmemnoc_clk",
  2012. .parent_hws = (const struct clk_hw *[]){ &ocmemnoc_clk_src.clkr.hw },
  2013. .num_parents = 1,
  2014. .flags = CLK_SET_RATE_PARENT,
  2015. .ops = &clk_branch2_ops,
  2016. },
  2017. },
  2018. };
  2019. static struct clk_branch venus0_vcodec0_clk = {
  2020. .halt_reg = 0x1028,
  2021. .clkr = {
  2022. .enable_reg = 0x1028,
  2023. .enable_mask = BIT(0),
  2024. .hw.init = &(struct clk_init_data){
  2025. .name = "venus0_vcodec0_clk",
  2026. .parent_hws = (const struct clk_hw *[]){ &vcodec0_clk_src.clkr.hw },
  2027. .num_parents = 1,
  2028. .flags = CLK_SET_RATE_PARENT,
  2029. .ops = &clk_branch2_ops,
  2030. },
  2031. },
  2032. };
  2033. static struct clk_branch venus0_core0_vcodec_clk = {
  2034. .halt_reg = 0x1048,
  2035. .clkr = {
  2036. .enable_reg = 0x1048,
  2037. .enable_mask = BIT(0),
  2038. .hw.init = &(struct clk_init_data){
  2039. .name = "venus0_core0_vcodec_clk",
  2040. .parent_hws = (const struct clk_hw *[]){ &vcodec0_clk_src.clkr.hw },
  2041. .num_parents = 1,
  2042. .flags = CLK_SET_RATE_PARENT,
  2043. .ops = &clk_branch2_ops,
  2044. },
  2045. },
  2046. };
  2047. static struct clk_branch venus0_core1_vcodec_clk = {
  2048. .halt_reg = 0x104c,
  2049. .clkr = {
  2050. .enable_reg = 0x104c,
  2051. .enable_mask = BIT(0),
  2052. .hw.init = &(struct clk_init_data){
  2053. .name = "venus0_core1_vcodec_clk",
  2054. .parent_hws = (const struct clk_hw *[]){ &vcodec0_clk_src.clkr.hw },
  2055. .num_parents = 1,
  2056. .flags = CLK_SET_RATE_PARENT,
  2057. .ops = &clk_branch2_ops,
  2058. },
  2059. },
  2060. };
  2061. static struct clk_branch venus0_core2_vcodec_clk = {
  2062. .halt_reg = 0x1054,
  2063. .clkr = {
  2064. .enable_reg = 0x1054,
  2065. .enable_mask = BIT(0),
  2066. .hw.init = &(struct clk_init_data){
  2067. .name = "venus0_core2_vcodec_clk",
  2068. .parent_hws = (const struct clk_hw *[]){ &vcodec0_clk_src.clkr.hw },
  2069. .num_parents = 1,
  2070. .flags = CLK_SET_RATE_PARENT,
  2071. .ops = &clk_branch2_ops,
  2072. },
  2073. },
  2074. };
  2075. static struct gdsc venus_gdsc = {
  2076. .gdscr = 0x1024,
  2077. .cxcs = (unsigned int []){ 0x1038, 0x1034, 0x1048 },
  2078. .cxc_count = 3,
  2079. .pd = {
  2080. .name = "venus_gdsc",
  2081. },
  2082. .pwrsts = PWRSTS_OFF_ON,
  2083. };
  2084. static struct gdsc venus_core0_gdsc = {
  2085. .gdscr = 0x1040,
  2086. .cxcs = (unsigned int []){ 0x1048 },
  2087. .cxc_count = 1,
  2088. .pd = {
  2089. .name = "venus_core0_gdsc",
  2090. },
  2091. .pwrsts = PWRSTS_OFF_ON,
  2092. .flags = HW_CTRL,
  2093. };
  2094. static struct gdsc venus_core1_gdsc = {
  2095. .gdscr = 0x1044,
  2096. .cxcs = (unsigned int []){ 0x104c },
  2097. .cxc_count = 1,
  2098. .pd = {
  2099. .name = "venus_core1_gdsc",
  2100. },
  2101. .pwrsts = PWRSTS_OFF_ON,
  2102. .flags = HW_CTRL,
  2103. };
  2104. static struct gdsc venus_core2_gdsc = {
  2105. .gdscr = 0x1050,
  2106. .cxcs = (unsigned int []){ 0x1054 },
  2107. .cxc_count = 1,
  2108. .pd = {
  2109. .name = "venus_core2_gdsc",
  2110. },
  2111. .pwrsts = PWRSTS_OFF_ON,
  2112. .flags = HW_CTRL,
  2113. };
  2114. static struct gdsc mdss_gdsc = {
  2115. .gdscr = 0x2304,
  2116. .cxcs = (unsigned int []){ 0x2310, 0x231c },
  2117. .cxc_count = 2,
  2118. .pd = {
  2119. .name = "mdss_gdsc",
  2120. },
  2121. .pwrsts = PWRSTS_OFF_ON,
  2122. };
  2123. static struct gdsc camss_top_gdsc = {
  2124. .gdscr = 0x34a0,
  2125. .cxcs = (unsigned int []){ 0x3704, 0x3714, 0x3494 },
  2126. .cxc_count = 3,
  2127. .pd = {
  2128. .name = "camss_top_gdsc",
  2129. },
  2130. .pwrsts = PWRSTS_OFF_ON,
  2131. };
  2132. static struct gdsc jpeg_gdsc = {
  2133. .gdscr = 0x35a4,
  2134. .cxcs = (unsigned int []){ 0x35a8 },
  2135. .cxc_count = 1,
  2136. .pd = {
  2137. .name = "jpeg_gdsc",
  2138. },
  2139. .parent = &camss_top_gdsc.pd,
  2140. .pwrsts = PWRSTS_OFF_ON,
  2141. };
  2142. static struct gdsc vfe_gdsc = {
  2143. .gdscr = 0x36a4,
  2144. .cxcs = (unsigned int []){ 0x36bc },
  2145. .cxc_count = 1,
  2146. .pd = {
  2147. .name = "vfe_gdsc",
  2148. },
  2149. .parent = &camss_top_gdsc.pd,
  2150. .pwrsts = PWRSTS_OFF_ON,
  2151. };
  2152. static struct gdsc cpp_gdsc = {
  2153. .gdscr = 0x36d4,
  2154. .cxcs = (unsigned int []){ 0x36c4, 0x36b0 },
  2155. .cxc_count = 2,
  2156. .pd = {
  2157. .name = "cpp_gdsc",
  2158. },
  2159. .parent = &camss_top_gdsc.pd,
  2160. .pwrsts = PWRSTS_OFF_ON,
  2161. };
  2162. static struct gdsc fd_gdsc = {
  2163. .gdscr = 0x3b64,
  2164. .cxcs = (unsigned int []){ 0x3b70, 0x3b68 },
  2165. .pd = {
  2166. .name = "fd_gdsc",
  2167. },
  2168. .pwrsts = PWRSTS_OFF_ON,
  2169. };
  2170. static struct gdsc oxili_cx_gdsc = {
  2171. .gdscr = 0x4034,
  2172. .pd = {
  2173. .name = "oxili_cx_gdsc",
  2174. },
  2175. .pwrsts = PWRSTS_OFF_ON,
  2176. .flags = VOTABLE,
  2177. };
  2178. static struct gdsc oxili_gx_gdsc = {
  2179. .gdscr = 0x4024,
  2180. .cxcs = (unsigned int []){ 0x4028 },
  2181. .cxc_count = 1,
  2182. .pd = {
  2183. .name = "oxili_gx_gdsc",
  2184. },
  2185. .pwrsts = PWRSTS_OFF_ON,
  2186. .parent = &oxili_cx_gdsc.pd,
  2187. .flags = CLAMP_IO,
  2188. .supply = "VDD_GFX",
  2189. };
  2190. static struct clk_regmap *mmcc_msm8994_clocks[] = {
  2191. [MMPLL0_EARLY] = &mmpll0_early.clkr,
  2192. [MMPLL0_PLL] = &mmpll0.clkr,
  2193. [MMPLL1_EARLY] = &mmpll1_early.clkr,
  2194. [MMPLL1_PLL] = &mmpll1.clkr,
  2195. [MMPLL3_EARLY] = &mmpll3_early.clkr,
  2196. [MMPLL3_PLL] = &mmpll3.clkr,
  2197. [MMPLL4_EARLY] = &mmpll4_early.clkr,
  2198. [MMPLL4_PLL] = &mmpll4.clkr,
  2199. [MMPLL5_EARLY] = &mmpll5_early.clkr,
  2200. [MMPLL5_PLL] = &mmpll5.clkr,
  2201. [AHB_CLK_SRC] = &ahb_clk_src.clkr,
  2202. [AXI_CLK_SRC] = &axi_clk_src.clkr,
  2203. [CSI0_CLK_SRC] = &csi0_clk_src.clkr,
  2204. [CSI1_CLK_SRC] = &csi1_clk_src.clkr,
  2205. [CSI2_CLK_SRC] = &csi2_clk_src.clkr,
  2206. [CSI3_CLK_SRC] = &csi3_clk_src.clkr,
  2207. [VFE0_CLK_SRC] = &vfe0_clk_src.clkr,
  2208. [VFE1_CLK_SRC] = &vfe1_clk_src.clkr,
  2209. [CPP_CLK_SRC] = &cpp_clk_src.clkr,
  2210. [JPEG0_CLK_SRC] = &jpeg0_clk_src.clkr,
  2211. [JPEG1_CLK_SRC] = &jpeg1_clk_src.clkr,
  2212. [JPEG2_CLK_SRC] = &jpeg2_clk_src.clkr,
  2213. [CSI2PHYTIMER_CLK_SRC] = &csi2phytimer_clk_src.clkr,
  2214. [FD_CORE_CLK_SRC] = &fd_core_clk_src.clkr,
  2215. [MDP_CLK_SRC] = &mdp_clk_src.clkr,
  2216. [PCLK0_CLK_SRC] = &pclk0_clk_src.clkr,
  2217. [PCLK1_CLK_SRC] = &pclk1_clk_src.clkr,
  2218. [OCMEMNOC_CLK_SRC] = &ocmemnoc_clk_src.clkr,
  2219. [CCI_CLK_SRC] = &cci_clk_src.clkr,
  2220. [MMSS_GP0_CLK_SRC] = &mmss_gp0_clk_src.clkr,
  2221. [MMSS_GP1_CLK_SRC] = &mmss_gp1_clk_src.clkr,
  2222. [JPEG_DMA_CLK_SRC] = &jpeg_dma_clk_src.clkr,
  2223. [MCLK0_CLK_SRC] = &mclk0_clk_src.clkr,
  2224. [MCLK1_CLK_SRC] = &mclk1_clk_src.clkr,
  2225. [MCLK2_CLK_SRC] = &mclk2_clk_src.clkr,
  2226. [MCLK3_CLK_SRC] = &mclk3_clk_src.clkr,
  2227. [CSI0PHYTIMER_CLK_SRC] = &csi0phytimer_clk_src.clkr,
  2228. [CSI1PHYTIMER_CLK_SRC] = &csi1phytimer_clk_src.clkr,
  2229. [BYTE0_CLK_SRC] = &byte0_clk_src.clkr,
  2230. [BYTE1_CLK_SRC] = &byte1_clk_src.clkr,
  2231. [ESC0_CLK_SRC] = &esc0_clk_src.clkr,
  2232. [ESC1_CLK_SRC] = &esc1_clk_src.clkr,
  2233. [MDSS_ESC0_CLK] = &mdss_esc0_clk.clkr,
  2234. [MDSS_ESC1_CLK] = &mdss_esc1_clk.clkr,
  2235. [EXTPCLK_CLK_SRC] = &extpclk_clk_src.clkr,
  2236. [HDMI_CLK_SRC] = &hdmi_clk_src.clkr,
  2237. [VSYNC_CLK_SRC] = &vsync_clk_src.clkr,
  2238. [RBBMTIMER_CLK_SRC] = &rbbmtimer_clk_src.clkr,
  2239. [CAMSS_AHB_CLK] = &camss_ahb_clk.clkr,
  2240. [CAMSS_CCI_CCI_AHB_CLK] = &camss_cci_cci_ahb_clk.clkr,
  2241. [CAMSS_CCI_CCI_CLK] = &camss_cci_cci_clk.clkr,
  2242. [CAMSS_VFE_CPP_AHB_CLK] = &camss_vfe_cpp_ahb_clk.clkr,
  2243. [CAMSS_VFE_CPP_AXI_CLK] = &camss_vfe_cpp_axi_clk.clkr,
  2244. [CAMSS_VFE_CPP_CLK] = &camss_vfe_cpp_clk.clkr,
  2245. [CAMSS_CSI0_AHB_CLK] = &camss_csi0_ahb_clk.clkr,
  2246. [CAMSS_CSI0_CLK] = &camss_csi0_clk.clkr,
  2247. [CAMSS_CSI0PHY_CLK] = &camss_csi0phy_clk.clkr,
  2248. [CAMSS_CSI0PIX_CLK] = &camss_csi0pix_clk.clkr,
  2249. [CAMSS_CSI0RDI_CLK] = &camss_csi0rdi_clk.clkr,
  2250. [CAMSS_CSI1_AHB_CLK] = &camss_csi1_ahb_clk.clkr,
  2251. [CAMSS_CSI1_CLK] = &camss_csi1_clk.clkr,
  2252. [CAMSS_CSI1PHY_CLK] = &camss_csi1phy_clk.clkr,
  2253. [CAMSS_CSI1PIX_CLK] = &camss_csi1pix_clk.clkr,
  2254. [CAMSS_CSI1RDI_CLK] = &camss_csi1rdi_clk.clkr,
  2255. [CAMSS_CSI2_AHB_CLK] = &camss_csi2_ahb_clk.clkr,
  2256. [CAMSS_CSI2_CLK] = &camss_csi2_clk.clkr,
  2257. [CAMSS_CSI2PHY_CLK] = &camss_csi2phy_clk.clkr,
  2258. [CAMSS_CSI2PIX_CLK] = &camss_csi2pix_clk.clkr,
  2259. [CAMSS_CSI2RDI_CLK] = &camss_csi2rdi_clk.clkr,
  2260. [CAMSS_CSI3_AHB_CLK] = &camss_csi3_ahb_clk.clkr,
  2261. [CAMSS_CSI3_CLK] = &camss_csi3_clk.clkr,
  2262. [CAMSS_CSI3PHY_CLK] = &camss_csi3phy_clk.clkr,
  2263. [CAMSS_CSI3PIX_CLK] = &camss_csi3pix_clk.clkr,
  2264. [CAMSS_CSI3RDI_CLK] = &camss_csi3rdi_clk.clkr,
  2265. [CAMSS_CSI_VFE0_CLK] = &camss_csi_vfe0_clk.clkr,
  2266. [CAMSS_CSI_VFE1_CLK] = &camss_csi_vfe1_clk.clkr,
  2267. [CAMSS_GP0_CLK] = &camss_gp0_clk.clkr,
  2268. [CAMSS_GP1_CLK] = &camss_gp1_clk.clkr,
  2269. [CAMSS_ISPIF_AHB_CLK] = &camss_ispif_ahb_clk.clkr,
  2270. [CAMSS_JPEG_DMA_CLK] = &camss_jpeg_dma_clk.clkr,
  2271. [CAMSS_JPEG_JPEG0_CLK] = &camss_jpeg_jpeg0_clk.clkr,
  2272. [CAMSS_JPEG_JPEG1_CLK] = &camss_jpeg_jpeg1_clk.clkr,
  2273. [CAMSS_JPEG_JPEG2_CLK] = &camss_jpeg_jpeg2_clk.clkr,
  2274. [CAMSS_JPEG_JPEG_AHB_CLK] = &camss_jpeg_jpeg_ahb_clk.clkr,
  2275. [CAMSS_JPEG_JPEG_AXI_CLK] = &camss_jpeg_jpeg_axi_clk.clkr,
  2276. [CAMSS_MCLK0_CLK] = &camss_mclk0_clk.clkr,
  2277. [CAMSS_MCLK1_CLK] = &camss_mclk1_clk.clkr,
  2278. [CAMSS_MCLK2_CLK] = &camss_mclk2_clk.clkr,
  2279. [CAMSS_MCLK3_CLK] = &camss_mclk3_clk.clkr,
  2280. [CAMSS_MICRO_AHB_CLK] = &camss_micro_ahb_clk.clkr,
  2281. [CAMSS_PHY0_CSI0PHYTIMER_CLK] = &camss_phy0_csi0phytimer_clk.clkr,
  2282. [CAMSS_PHY1_CSI1PHYTIMER_CLK] = &camss_phy1_csi1phytimer_clk.clkr,
  2283. [CAMSS_PHY2_CSI2PHYTIMER_CLK] = &camss_phy2_csi2phytimer_clk.clkr,
  2284. [CAMSS_TOP_AHB_CLK] = &camss_top_ahb_clk.clkr,
  2285. [CAMSS_VFE_VFE0_CLK] = &camss_vfe_vfe0_clk.clkr,
  2286. [CAMSS_VFE_VFE1_CLK] = &camss_vfe_vfe1_clk.clkr,
  2287. [CAMSS_VFE_VFE_AHB_CLK] = &camss_vfe_vfe_ahb_clk.clkr,
  2288. [CAMSS_VFE_VFE_AXI_CLK] = &camss_vfe_vfe_axi_clk.clkr,
  2289. [FD_AHB_CLK] = &fd_ahb_clk.clkr,
  2290. [FD_AXI_CLK] = &fd_axi_clk.clkr,
  2291. [FD_CORE_CLK] = &fd_core_clk.clkr,
  2292. [FD_CORE_UAR_CLK] = &fd_core_uar_clk.clkr,
  2293. [MDSS_AHB_CLK] = &mdss_ahb_clk.clkr,
  2294. [MDSS_AXI_CLK] = &mdss_axi_clk.clkr,
  2295. [MDSS_BYTE0_CLK] = &mdss_byte0_clk.clkr,
  2296. [MDSS_BYTE1_CLK] = &mdss_byte1_clk.clkr,
  2297. [MDSS_EXTPCLK_CLK] = &mdss_extpclk_clk.clkr,
  2298. [MDSS_HDMI_AHB_CLK] = &mdss_hdmi_ahb_clk.clkr,
  2299. [MDSS_HDMI_CLK] = &mdss_hdmi_clk.clkr,
  2300. [MDSS_MDP_CLK] = &mdss_mdp_clk.clkr,
  2301. [MDSS_PCLK0_CLK] = &mdss_pclk0_clk.clkr,
  2302. [MDSS_PCLK1_CLK] = &mdss_pclk1_clk.clkr,
  2303. [MDSS_VSYNC_CLK] = &mdss_vsync_clk.clkr,
  2304. [MMSS_MISC_AHB_CLK] = &mmss_misc_ahb_clk.clkr,
  2305. [MMSS_MMSSNOC_AXI_CLK] = &mmss_mmssnoc_axi_clk.clkr,
  2306. [MMSS_S0_AXI_CLK] = &mmss_s0_axi_clk.clkr,
  2307. [OCMEMCX_OCMEMNOC_CLK] = &ocmemcx_ocmemnoc_clk.clkr,
  2308. [OXILI_GFX3D_CLK] = &oxili_gfx3d_clk.clkr,
  2309. [OXILI_RBBMTIMER_CLK] = &oxili_rbbmtimer_clk.clkr,
  2310. [OXILICX_AHB_CLK] = &oxilicx_ahb_clk.clkr,
  2311. [VENUS0_AHB_CLK] = &venus0_ahb_clk.clkr,
  2312. [VENUS0_AXI_CLK] = &venus0_axi_clk.clkr,
  2313. [VENUS0_OCMEMNOC_CLK] = &venus0_ocmemnoc_clk.clkr,
  2314. [VENUS0_VCODEC0_CLK] = &venus0_vcodec0_clk.clkr,
  2315. [VENUS0_CORE0_VCODEC_CLK] = &venus0_core0_vcodec_clk.clkr,
  2316. [VENUS0_CORE1_VCODEC_CLK] = &venus0_core1_vcodec_clk.clkr,
  2317. [VENUS0_CORE2_VCODEC_CLK] = &venus0_core2_vcodec_clk.clkr,
  2318. };
  2319. static struct gdsc *mmcc_msm8994_gdscs[] = {
  2320. [VENUS_GDSC] = &venus_gdsc,
  2321. [VENUS_CORE0_GDSC] = &venus_core0_gdsc,
  2322. [VENUS_CORE1_GDSC] = &venus_core1_gdsc,
  2323. [VENUS_CORE2_GDSC] = &venus_core2_gdsc,
  2324. [CAMSS_TOP_GDSC] = &camss_top_gdsc,
  2325. [MDSS_GDSC] = &mdss_gdsc,
  2326. [JPEG_GDSC] = &jpeg_gdsc,
  2327. [VFE_GDSC] = &vfe_gdsc,
  2328. [CPP_GDSC] = &cpp_gdsc,
  2329. [OXILI_GX_GDSC] = &oxili_gx_gdsc,
  2330. [OXILI_CX_GDSC] = &oxili_cx_gdsc,
  2331. [FD_GDSC] = &fd_gdsc,
  2332. };
  2333. static const struct qcom_reset_map mmcc_msm8994_resets[] = {
  2334. [CAMSS_MICRO_BCR] = { 0x3490 },
  2335. };
  2336. static const struct regmap_config mmcc_msm8994_regmap_config = {
  2337. .reg_bits = 32,
  2338. .reg_stride = 4,
  2339. .val_bits = 32,
  2340. .max_register = 0x5200,
  2341. .fast_io = true,
  2342. };
  2343. static const struct qcom_cc_desc mmcc_msm8994_desc = {
  2344. .config = &mmcc_msm8994_regmap_config,
  2345. .clks = mmcc_msm8994_clocks,
  2346. .num_clks = ARRAY_SIZE(mmcc_msm8994_clocks),
  2347. .resets = mmcc_msm8994_resets,
  2348. .num_resets = ARRAY_SIZE(mmcc_msm8994_resets),
  2349. .gdscs = mmcc_msm8994_gdscs,
  2350. .num_gdscs = ARRAY_SIZE(mmcc_msm8994_gdscs),
  2351. };
  2352. static const struct of_device_id mmcc_msm8994_match_table[] = {
  2353. { .compatible = "qcom,mmcc-msm8992" },
  2354. { .compatible = "qcom,mmcc-msm8994" }, /* V2 and V2.1 */
  2355. { }
  2356. };
  2357. MODULE_DEVICE_TABLE(of, mmcc_msm8994_match_table);
  2358. static int mmcc_msm8994_probe(struct platform_device *pdev)
  2359. {
  2360. struct regmap *regmap;
  2361. if (of_device_is_compatible(pdev->dev.of_node, "qcom,mmcc-msm8992")) {
  2362. /* MSM8992 features less clocks and some have different freq tables */
  2363. mmcc_msm8994_desc.clks[CAMSS_JPEG_JPEG1_CLK] = NULL;
  2364. mmcc_msm8994_desc.clks[CAMSS_JPEG_JPEG2_CLK] = NULL;
  2365. mmcc_msm8994_desc.clks[FD_CORE_CLK_SRC] = NULL;
  2366. mmcc_msm8994_desc.clks[FD_CORE_CLK] = NULL;
  2367. mmcc_msm8994_desc.clks[FD_CORE_UAR_CLK] = NULL;
  2368. mmcc_msm8994_desc.clks[FD_AXI_CLK] = NULL;
  2369. mmcc_msm8994_desc.clks[FD_AHB_CLK] = NULL;
  2370. mmcc_msm8994_desc.clks[JPEG1_CLK_SRC] = NULL;
  2371. mmcc_msm8994_desc.clks[JPEG2_CLK_SRC] = NULL;
  2372. mmcc_msm8994_desc.clks[VENUS0_CORE2_VCODEC_CLK] = NULL;
  2373. mmcc_msm8994_desc.gdscs[FD_GDSC] = NULL;
  2374. mmcc_msm8994_desc.gdscs[VENUS_CORE2_GDSC] = NULL;
  2375. axi_clk_src.freq_tbl = ftbl_axi_clk_src_8992;
  2376. cpp_clk_src.freq_tbl = ftbl_cpp_clk_src_8992;
  2377. csi0_clk_src.freq_tbl = ftbl_csi0_1_2_3_clk_src_8992;
  2378. csi1_clk_src.freq_tbl = ftbl_csi0_1_2_3_clk_src_8992;
  2379. csi2_clk_src.freq_tbl = ftbl_csi0_1_2_3_clk_src_8992;
  2380. csi3_clk_src.freq_tbl = ftbl_csi0_1_2_3_clk_src_8992;
  2381. mclk0_clk_src.freq_tbl = ftbl_mclk0_clk_src_8992;
  2382. mclk1_clk_src.freq_tbl = ftbl_mclk1_2_3_clk_src_8992;
  2383. mclk2_clk_src.freq_tbl = ftbl_mclk1_2_3_clk_src_8992;
  2384. mclk3_clk_src.freq_tbl = ftbl_mclk1_2_3_clk_src_8992;
  2385. mdp_clk_src.freq_tbl = ftbl_mdp_clk_src_8992;
  2386. ocmemnoc_clk_src.freq_tbl = ftbl_ocmemnoc_clk_src_8992;
  2387. vcodec0_clk_src.freq_tbl = ftbl_vcodec0_clk_src_8992;
  2388. vfe0_clk_src.freq_tbl = ftbl_vfe0_1_clk_src_8992;
  2389. vfe1_clk_src.freq_tbl = ftbl_vfe0_1_clk_src_8992;
  2390. }
  2391. regmap = qcom_cc_map(pdev, &mmcc_msm8994_desc);
  2392. if (IS_ERR(regmap))
  2393. return PTR_ERR(regmap);
  2394. clk_alpha_pll_configure(&mmpll0_early, regmap, &mmpll_p_config);
  2395. clk_alpha_pll_configure(&mmpll1_early, regmap, &mmpll_p_config);
  2396. clk_alpha_pll_configure(&mmpll3_early, regmap, &mmpll_p_config);
  2397. clk_alpha_pll_configure(&mmpll5_early, regmap, &mmpll_p_config);
  2398. return qcom_cc_really_probe(&pdev->dev, &mmcc_msm8994_desc, regmap);
  2399. }
  2400. static struct platform_driver mmcc_msm8994_driver = {
  2401. .probe = mmcc_msm8994_probe,
  2402. .driver = {
  2403. .name = "mmcc-msm8994",
  2404. .of_match_table = mmcc_msm8994_match_table,
  2405. },
  2406. };
  2407. module_platform_driver(mmcc_msm8994_driver);
  2408. MODULE_DESCRIPTION("QCOM MMCC MSM8994 Driver");
  2409. MODULE_LICENSE("GPL v2");
  2410. MODULE_ALIAS("platform:mmcc-msm8994");